diff --git a/app/assets/javascripts/mapbox-gl.js b/app/assets/javascripts/mapbox-gl.js index 9adc7d0..c9e8b66 100644 --- a/app/assets/javascripts/mapbox-gl.js +++ b/app/assets/javascripts/mapbox-gl.js @@ -3,7 +3,7 @@ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.mapboxgl = factory()); -}(this, (function () { 'use strict'; +})(this, (function () { 'use strict'; /* eslint-disable */ @@ -28,7 +28,432 @@ if (!shared) { } -define(['exports'], function (exports) { 'use strict'; +define(['exports'], (function (exports) { 'use strict'; + +// +/* eslint-env browser */ + + +// shim window for the case of requiring the browser bundle in Node +var window$1 = ((typeof self !== 'undefined' ? self : ({} )) ); + +/* + * 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 + */ +var unitbezier = 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)); +}; + +'use strict'; + +var pointGeometry = 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; +}; var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; @@ -1289,23049 +1714,23666 @@ var objectKeys = Object.keys || function (obj) { }; }); -var name = "mapbox-gl"; -var description = "A WebGL interactive maps library"; -var version = "2.7.0"; -var main = "dist/mapbox-gl.js"; -var style = "dist/mapbox-gl.css"; -var license = "SEE LICENSE IN LICENSE.txt"; -var type = "module"; -var repository = { - type: "git", - url: "git://github.com/mapbox/mapbox-gl-js.git" -}; -var dependencies = { - "@mapbox/geojson-rewind": "^0.5.1", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^2.0.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^2.0.2", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - csscolorparser: "~1.0.3", - earcut: "^2.2.3", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.3.0", - "grid-index": "^1.1.0", - minimist: "^1.2.5", - "murmurhash-js": "^1.0.0", - pbf: "^3.2.1", - potpack: "^1.0.1", - quickselect: "^2.0.0", - rw: "^1.3.3", - supercluster: "^7.1.4", - tinyqueue: "^2.0.3", - "vt-pbf": "^3.1.3" -}; -var devDependencies = { - "@babel/core": "^7.12.16", - "@babel/eslint-parser": "^7.12.16", - "@babel/preset-flow": "^7.12.13", - "@mapbox/flow-remove-types": "^2.0.0", - "@mapbox/gazetteer": "^4.0.4", - "@mapbox/mapbox-gl-rtl-text": "^0.2.3", - "@mapbox/mvt-fixtures": "^3.6.0", - "@octokit/auth-app": "^2.11.0", - "@octokit/rest": "^18.1.1", - "@rollup/plugin-commonjs": "^17.1.0", - "@rollup/plugin-json": "^4.1.0", - "@rollup/plugin-node-resolve": "^11.2.0", - "@rollup/plugin-replace": "^2.3.4", - "@rollup/plugin-strip": "^2.0.0", - address: "^1.1.2", - browserify: "^17.0.0", - chalk: "^4.1.0", - chokidar: "^3.5.1", - cssnano: "^4.1.10", - d3: "^6.5.0", - "d3-queue": "^3.0.7", - diff: "^5.0.0", - documentation: "~13.1.1", - ejs: "^3.1.6", - envify: "^4.1.0", - eslint: "^7.30.0", - "eslint-config-mourner": "^3.0.0", - "eslint-plugin-flowtype": "^5.2.0", - "eslint-plugin-html": "^6.1.1", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-jsdoc": "^32.3.4", - "flow-bin": "0.103.0", - gl: "^4.9.0", - glob: "^7.1.6", - "is-builtin-module": "^3.0.0", - jsdom: "^13.2.0", - "json-stringify-pretty-compact": "^2.0.0", - "list-npm-contents": "^1.0.2", - "lodash.template": "^4.5.0", - "mapbox-gl-styles": "^2.0.2", - "mock-geolocation": "^1.0.11", - "node-notifier": "^9.0.0", - "npm-font-open-sans": "^1.1.0", - "npm-packlist": "^2.1.4", - "npm-run-all": "^4.1.5", - nyc: "^15.1.0", - pixelmatch: "^5.2.1", - postcss: "^8.2.6", - "postcss-cli": "^8.3.1", - "postcss-inline-svg": "^5.0.0", - "pretty-bytes": "^5.5.0", - "puppeteer-core": "^11.0.0", - "qrcode-terminal": "^0.12.0", - rollup: "^2.39.0", - "rollup-plugin-sourcemaps": "^0.6.3", - "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-unassert": "^0.3.0", - "selenium-webdriver": "^4.0.0-alpha.8", - "shuffle-seed": "^1.1.6", - sinon: "^9.2.4", - st: "^2.0.0", - stylelint: "^13.10.0", - "stylelint-config-standard": "^20.0.0", - tap: "~12.4.1", - tape: "^5.1.1", - "tape-filter": "^1.0.4", - testem: "^3.2.0" -}; -var browser = { - "./src/shaders/index.js": "./src/shaders/shaders.js", - "./src/util/window.js": "./src/util/browser/window.js", - "./src/util/web_worker.js": "./src/util/browser/web_worker.js" -}; -var scripts = { - "build-dev": "rollup -c --environment BUILD:dev", - "watch-dev": "rollup -c --environment BUILD:dev --watch", - "build-bench": "rollup -c --environment BUILD:bench,MINIFY:true", - "build-prod": "rollup -c --environment BUILD:production", - "build-prod-min": "rollup -c --environment BUILD:production,MINIFY:true", - "build-csp": "rollup -c rollup.config.csp.js", - "build-test-suite": "rollup -c test/integration/rollup.config.test.js", - "build-flow-types": "mkdir -p dist && cp build/mapbox-gl.js.flow dist/mapbox-gl.js.flow && cp build/mapbox-gl.js.flow dist/mapbox-gl-dev.js.flow", - "build-css": "postcss -o dist/mapbox-gl.css src/css/mapbox-gl.css", - "build-style-spec": "cd src/style-spec && npm run build && cd ../.. && mkdir -p dist/style-spec && cp src/style-spec/dist/* dist/style-spec", - "watch-css": "postcss --watch -o dist/mapbox-gl.css src/css/mapbox-gl.css", - "build-token": "node build/generate-access-token-script.js", - "build-benchmarks": "BENCHMARK_VERSION=${BENCHMARK_VERSION:-\"$(git rev-parse --abbrev-ref HEAD) $(git rev-parse --short=7 HEAD)\"} rollup -c bench/versions/rollup_config_benchmarks.js", - "watch-benchmarks": "BENCHMARK_VERSION=${BENCHMARK_VERSION:-\"$(git rev-parse --abbrev-ref HEAD) $(git rev-parse --short=7 HEAD)\"} rollup -c bench/rollup_config_benchmarks.js -w", - "start-server": "st --no-cache -H 0.0.0.0 --port 9966 --index index.html .", - start: "run-p build-token watch-css watch-dev watch-benchmarks start-server", - "start-debug": "run-p build-token watch-css watch-dev start-server", - "start-bench": "run-p build-token watch-benchmarks start-server", - "start-release": "run-s build-token build-prod-min build-css print-release-url start-server", - "diff-tarball": "build/run-node build/diff-tarball && echo \"Please confirm the above is correct [y/n]? \"; read answer; if [ \"$answer\" = \"${answer#[Yy]}\" ]; then false; fi", - "prepare-publish": "git clean -fdx && yarn install", - lint: "eslint --cache --ignore-path .gitignore src test bench debug/*.html", - "lint-css": "stylelint 'src/css/mapbox-gl.css'", - test: "run-s lint lint-css test-flow test-unit", - "test-suite": "run-s test-render test-query test-expressions", - "test-suite-clean": "find test/integration/{render,query, expressions}-tests -mindepth 2 -type d -exec test -e \"{}/actual.png\" \\; -not \\( -exec test -e \"{}/style.json\" \\; \\) -print | xargs -t rm -r", - "test-unit": "build/run-tap --reporter classic --no-coverage test/unit", - "test-build": "build/run-tap --no-coverage test/build/**/*.test.js", - "test-browser": "build/run-tap --reporter spec --no-coverage test/browser/**/*.test.js", - "watch-render": "SUITE_NAME=render testem -f test/integration/testem/testem.js", - "watch-query": "SUITE_NAME=query testem -f test/integration/testem/testem.js", - "test-render": "SUITE_NAME=render CI=true testem ci -f test/integration/testem/testem.js", - "test-render-prod": "BUILD=production SUITE_NAME=render CI=true testem ci -f test/integration/testem/testem.js", - "test-query": "SUITE_NAME=query CI=true testem ci -f test/integration/testem/testem.js", - "test-expressions": "build/run-node test/expression.test.js", - "test-flow": "build/run-node build/generate-flow-typed-style-spec && flow .", - "test-cov": "nyc --require=@mapbox/flow-remove-types/register --reporter=text-summary --reporter=lcov --cache run-s test-unit test-expressions test-query test-render", - prepublishOnly: "run-s prepare-publish build-flow-types build-dev build-prod-min build-prod build-csp build-css build-style-spec test-build diff-tarball", - "print-release-url": "node build/print-release-url.js", - codegen: "build/run-node build/generate-style-code.js && build/run-node build/generate-struct-arrays.js" -}; -var files = [ - "build/", - "dist/mapbox-gl*", - "dist/style-spec/", - "dist/package.json", - "flow-typed/*.js", - "src/", - ".flowconfig", - "LICENSE.txt" -]; -var _package = { - name: name, - description: description, - version: version, - main: main, - style: style, - license: license, - type: type, - repository: repository, - dependencies: dependencies, - devDependencies: devDependencies, - browser: browser, - scripts: scripts, - files: files -}; +// -/* - * 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. +/** + * Deeply compares two object literals. * - * Ported from Webkit - * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h + * @private */ -var unitbezier = UnitBezier; +function deepEqual(a , b ) { + if (Array.isArray(a)) { + if (!Array.isArray(b) || a.length !== b.length) return false; + for (let 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; + const keys = Object.keys(a); + if (keys.length !== Object.keys(b).length) return false; + for (const key in a) { + if (!deepEqual(a[key], b[key])) return false; + } + return true; + } + return a === b; +} -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; +const DEG_TO_RAD = Math.PI / 180; +const RAD_TO_DEG = 180 / Math.PI; + +/** + * Converts an angle in degrees to radians + * copy all properties from the source objects into the destination. + * The last source object given overrides properties from previous + * source objects. + * + * @param a angle to convert + * @returns the angle in radians + * @private + */ +function degToRad(a ) { + return a * DEG_TO_RAD; } -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; -}; +/** + * Converts an angle in radians to degrees + * copy all properties from the source objects into the destination. + * The last source object given overrides properties from previous + * source objects. + * + * @param a angle to convert + * @returns the angle in degrees + * @private + */ +function radToDeg(a ) { + return a * RAD_TO_DEG; +} -UnitBezier.prototype.sampleCurveY = function(t) { - return ((this.ay * t + this.by) * t + this.cy) * t; -}; +const TILE_CORNERS = [[0, 0], [1, 0], [1, 1], [0, 1]]; -UnitBezier.prototype.sampleCurveDerivativeX = function(t) { - return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx; -}; +/** + * Given a particular bearing, returns the corner of the tile thats farthest + * along the bearing. + * + * @param {number} bearing angle in degrees (-180, 180] + * @returns {QuadCorner} + * @private + */ +function furthestTileCorner(bearing ) { + const alignedBearing = ((bearing + 45) + 360) % 360; + const cornerIdx = Math.round(alignedBearing / 90) % 4; + return TILE_CORNERS[cornerIdx]; +} -UnitBezier.prototype.solveCurveX = function(x, epsilon) { - if (typeof epsilon === 'undefined') epsilon = 1e-6; +/** + * @module util + * @private + */ - var t0, t1, t2, x2, i; +/** + * 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 + */ +function easeCubicInOut(t ) { + if (t <= 0) return 0; + if (t >= 1) return 1; + const t2 = t * t, + t3 = t2 * t; + return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75); +} - // First try a few iterations of Newton's method -- normally very fast. - for (t2 = x, i = 0; i < 8; i++) { +/** + * Computes an AABB for a set of points. + * + * @param {Point[]} points + * @returns {{ min: Point, max: Point}} + * @private + */ +function getBounds(points ) { + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + for (const p of points) { + minX = Math.min(minX, p.x); + minY = Math.min(minY, p.y); + maxX = Math.max(maxX, p.x); + maxY = Math.max(maxY, p.y); + } - x2 = this.sampleCurveX(t2) - x; - if (Math.abs(x2) < epsilon) return t2; + return { + min: new pointGeometry(minX, minY), + max: new pointGeometry(maxX, maxY), + }; +} - var d2 = this.sampleCurveDerivativeX(t2); - if (Math.abs(d2) < 1e-6) break; +/** + * Returns the square of the 2D distance between an AABB defined by min and max and a point. + * If point is null or undefined, the AABB distance from the origin (0,0) is returned. + * + * @param {Point} min The minimum extent of the AABB. + * @param {Point} max The maximum extent of the AABB. + * @param {Point} [point] The point to compute the distance from, may be undefined. + * @returns {number} The square distance from the AABB, 0.0 if the AABB contains the point. + */ +function getAABBPointSquareDist(min , max , point ) { + let sqDist = 0.0; - t2 = t2 - x2 / d2; + for (let i = 0; i < 2; ++i) { + const v = point ? point[i] : 0.0; + assert_1(min[i] < max[i], 'Invalid aabb min and max inputs, min[i] must be < max[i].'); + if (min[i] > v) sqDist += (min[i] - v) * (min[i] - v); + if (max[i] < v) sqDist += (v - max[i]) * (v - max[i]); } - // 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) { + return sqDist; +} - x2 = this.sampleCurveX(t2); - if (Math.abs(x2 - x) < epsilon) return t2; +/** + * Converts a AABB into a polygon with clockwise winding order. + * + * @param {Point} min The top left point. + * @param {Point} max The bottom right point. + * @param {number} [buffer=0] The buffer width. + * @param {boolean} [close=true] Whether to close the polygon or not. + * @returns {Point[]} The polygon. + */ +function polygonizeBounds(min , max , buffer = 0, close = true) { + const offset = new pointGeometry(buffer, buffer); + const minBuf = min.sub(offset); + const maxBuf = max.add(offset); + const polygon = [minBuf, new pointGeometry(maxBuf.x, minBuf.y), maxBuf, new pointGeometry(minBuf.x, maxBuf.y)]; - if (x > x2) { - t0 = t2; - } else { - t1 = t2; - } + if (close) { + polygon.push(minBuf.clone()); + } + return polygon; +} - t2 = (t1 - t0) * 0.5 + t0; +/** + * Takes a convex ring and expands it outward by applying a buffer around it. + * This function assumes that the ring is in clockwise winding order. + * + * @param {Point[]} ring The input ring. + * @param {number} buffer The buffer width. + * @returns {Point[]} The expanded ring. + */ +function bufferConvexPolygon(ring , buffer ) { + assert_1(ring.length > 2, 'bufferConvexPolygon requires the ring to have atleast 3 points'); + const output = []; + for (let currIdx = 0; currIdx < ring.length; currIdx++) { + const prevIdx = wrap(currIdx - 1, -1, ring.length - 1); + const nextIdx = wrap(currIdx + 1, -1, ring.length - 1); + const prev = ring[prevIdx]; + const curr = ring[currIdx]; + const next = ring[nextIdx]; + const p1 = prev.sub(curr).unit(); + const p2 = next.sub(curr).unit(); + const interiorAngle = p2.angleWithSep(p1.x, p1.y); + // Calcuate a vector that points in the direction of the angle bisector between two sides. + // Scale it based on a right angled triangle constructed at that corner. + const offset = p1.add(p2).unit().mult(-1 * buffer / Math.sin(interiorAngle / 2)); + output.push(curr.add(offset)); } + return output; +} - // Failure. - return t2; -}; + -UnitBezier.prototype.solve = function(x, epsilon) { - return this.sampleCurveY(this.solveCurveX(x, epsilon)); -}; +/** + * 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 + */ +function bezier$1(p1x , p1y , p2x , p2y ) { + const bezier = new unitbezier(p1x, p1y, p2x, p2y); + return function(t ) { + return bezier.solve(t); + }; +} -'use strict'; +/** + * A default bezier-curve powered easing function with + * control points (0.25, 0.1) and (0.25, 1) + * + * @private + */ +const ease = bezier$1(0.25, 0.1, 0.25, 1); -var pointGeometry = Point; +/** + * 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 + */ +function clamp(n , min , max ) { + return Math.min(max, Math.max(min, n)); +} /** - * A standalone point geometry with useful accessor, comparison, and - * modification methods. + * Equivalent to GLSL smoothstep. * - * @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); + * @param {number} e0 The lower edge of the sigmoid + * @param {number} e1 The upper edge of the sigmoid + * @param {number} x the value to be interpolated + * @returns {number} in the range [0, 1] + * @private */ -function Point(x, y) { - this.x = x; - this.y = y; +function smoothstep(e0 , e1 , x ) { + x = clamp((x - e0) / (e1 - e0), 0, 1); + return x * x * (3 - 2 * x); } -Point.prototype = { +/** + * 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 + */ +function wrap(n , min , max ) { + const d = max - min; + const w = ((n - min) % d + d) % d + min; + return (w === min) ? max : w; +} - /** - * 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); }, +/** + * Computes shortest angle in range [-180, 180) between two angles. + * + * @param {*} a First angle in degrees + * @param {*} b Second angle in degrees + * @returns Shortest angle + * @private + */ +function shortestAngle(a , b ) { + const diff = (b - a + 180) % 360 - 180; + return diff < -180 ? diff + 360 : diff; +} - /** - * 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); }, +/* + * 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 + */ +function asyncAll ( + array , + fn , + callback +) { + if (!array.length) { return callback(null, []); } + let remaining = array.length; + const results = new Array(array.length); + let error = null; + array.forEach((item, i) => { + fn(item, (err, result) => { + if (err) error = err; + results[i] = ((result ) ); // https://github.com/facebook/flow/issues/2123 + if (--remaining === 0) callback(error, results); + }); + }); +} - /** - * 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; - }, +/* + * Polyfill for Object.values. Not fully spec compliant, but we don't + * need it to be. + * + * @private + */ +function values (obj ) { + const result = []; + for (const k in obj) { + result.push(obj[k]); + } + return result; +} - _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; - }, +/* + * Compute the difference between the keys in one object and the keys + * in another object. + * + * @returns keys difference + * @private + */ +function keysDifference (obj , other ) { + const difference = []; + for (const i in obj) { + if (!(i in other)) { + difference.push(i); + } + } + return difference; +} - _round: function() { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - return this; +/** + * 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 + */ +function extend$1(dest , ...sources ) { + for (const src of sources) { + for (const k in src) { + dest[k] = src[k]; + } } -}; + return dest; +} /** - * 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. + * 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 - * // this - * var point = Point.convert([0, 1]); - * // is equivalent to - * var point = new Point(0, 1); + * var foo = { name: 'Charlie', age: 10 }; + * var justName = pick(foo, ['name']); + * // justName = { name: 'Charlie' } + * @private */ -Point.convert = function (a) { - if (a instanceof Point) { - return a; - } - if (Array.isArray(a)) { - return new Point(a[0], a[1]); +function pick(src , properties ) { + const result = {}; + for (let i = 0; i < properties.length; i++) { + const k = properties[i]; + if (k in src) { + result[k] = src[k]; + } } - return a; -}; - -// -/* eslint-env browser */ - + return result; +} -// shim window for the case of requiring the browser bundle in Node -var window$1 = typeof self !== 'undefined' ? (self ) : (({} ) ); +let id = 1; /** - * Common utilities - * @module glMatrix - */ -// Configuration Constants -var EPSILON = 0.000001; -var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array; -var RANDOM = Math.random; -/** - * Sets the type of array used when creating new vectors and matrices + * Return a unique numeric id, starting at 1 and incrementing with + * each call. * - * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array + * @returns unique numeric id. + * @private */ - -function setMatrixArrayType(type) { - ARRAY_TYPE = type; +function uniqueId() { + return id++; } -var degree = Math.PI / 180; + /** - * Convert Degree To Radian - * - * @param {Number} a Angle in Degrees + * Return a random UUID (v4). Taken from: https://gist.github.com/jed/982883 + * @private */ - -function toRadian(a) { - return a * degree; +function uuid() { + function b(a) { + return a ? (a ^ Math.random() * (16 >> a / 4)).toString(16) : + //$FlowFixMe: Flow doesn't like the implied array literal conversion here + ([1e7] + -[1e3] + -4e3 + -8e3 + -1e11).replace(/[018]/g, b); + } + return b(); } + /** - * Tests whether or not the arguments have approximately the same value, within an absolute - * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less - * than or equal to 1.0, and a relative tolerance is used for larger values) - * - * @param {Number} a The first number to test. - * @param {Number} b The second number to test. - * @returns {Boolean} True if the numbers are approximately equal, false otherwise. + * Return whether a given value is a power of two + * @private */ - -function equals(a, b) { - return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b)); +function isPowerOfTwo(value ) { + return (Math.log(value) / Math.LN2) % 1 === 0; } -if (!Math.hypot) Math.hypot = function () { - var y = 0, - i = arguments.length; - - while (i--) { - y += arguments[i] * arguments[i]; - } - - return Math.sqrt(y); -}; /** - * 2x2 Matrix - * @module mat2 + * Return the next power of two, or the input value if already a power of two + * @private */ +function nextPowerOfTwo(value ) { + if (value <= 1) return 1; + return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2)); +} /** - * Creates a new identity mat2 - * - * @returns {mat2} a new 2x2 matrix + * Return the previous power of two, or the input value if already a power of two + * @private */ +function prevPowerOfTwo(value ) { + if (value <= 1) return 1; + return Math.pow(2, Math.floor(Math.log(value) / Math.LN2)); +} -function create() { - var out = new ARRAY_TYPE(4); - - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - } - - out[0] = 1; - out[3] = 1; - return out; +/** + * Validate a string to match UUID(v4) of the + * form: xxxxxxxx-xxxx-4xxx-[89ab]xxx-xxxxxxxxxxxx + * @param str string to validate. + * @private + */ +function validateUuid(str ) { + return str ? /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str) : false; } + /** - * Creates a new mat2 initialized with values from an existing matrix + * 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 {ReadonlyMat2} a matrix to clone - * @returns {mat2} a new 2x2 matrix + * @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 */ - -function clone(a) { - var out = new ARRAY_TYPE(4); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - return out; +function bindAll(fns , context ) { + fns.forEach((fn) => { + if (!context[fn]) { return; } + context[fn] = context[fn].bind(context); + }); } + /** - * Copy the values from one mat2 to another + * Determine if a string ends with a particular substring * - * @param {mat2} out the receiving matrix - * @param {ReadonlyMat2} a the source matrix - * @returns {mat2} out + * @private */ - -function copy(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - return out; +function endsWith(string , suffix ) { + return string.indexOf(suffix, string.length - suffix.length) !== -1; } + /** - * Set a mat2 to the identity matrix + * Create an object by mapping all the values of an existing object while + * preserving their keys. * - * @param {mat2} out the receiving matrix - * @returns {mat2} out + * @private */ - -function identity(out) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 1; - return out; +function mapObject(input , iterator , context ) { + const output = {}; + for (const key in input) { + output[key] = iterator.call(context || this, input[key], key, input); + } + return output; } + /** - * Create a new mat2 with the given values + * Create an object by filtering out values of an existing object. * - * @param {Number} m00 Component in column 0, row 0 position (index 0) - * @param {Number} m01 Component in column 0, row 1 position (index 1) - * @param {Number} m10 Component in column 1, row 0 position (index 2) - * @param {Number} m11 Component in column 1, row 1 position (index 3) - * @returns {mat2} out A new 2x2 matrix + * @private */ - -function fromValues(m00, m01, m10, m11) { - var out = new ARRAY_TYPE(4); - out[0] = m00; - out[1] = m01; - out[2] = m10; - out[3] = m11; - return out; +function filterObject(input , iterator , context ) { + const output = {}; + for (const key in input) { + if (iterator.call(context || this, input[key], key, input)) { + output[key] = input[key]; + } + } + return output; } -/** - * Set the components of a mat2 to the given values - * - * @param {mat2} out the receiving matrix - * @param {Number} m00 Component in column 0, row 0 position (index 0) - * @param {Number} m01 Component in column 0, row 1 position (index 1) - * @param {Number} m10 Component in column 1, row 0 position (index 2) - * @param {Number} m11 Component in column 1, row 1 position (index 3) - * @returns {mat2} out - */ -function set(out, m00, m01, m10, m11) { - out[0] = m00; - out[1] = m01; - out[2] = m10; - out[3] = m11; - return out; -} /** - * Transpose the values of a mat2 + * Deeply clones two objects. * - * @param {mat2} out the receiving matrix - * @param {ReadonlyMat2} a the source matrix - * @returns {mat2} out + * @private */ - -function transpose(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache - // some values - if (out === a) { - var a1 = a[1]; - out[1] = a[2]; - out[2] = a1; - } else { - out[0] = a[0]; - out[1] = a[2]; - out[2] = a[1]; - out[3] = a[3]; - } - - return out; +function clone$9 (input ) { + if (Array.isArray(input)) { + return ((input.map(clone$9) ) ); + } else if (typeof input === 'object' && input) { + return ((mapObject(input, clone$9) ) ); + } else { + return input; + } } -/** - * Inverts a mat2 - * - * @param {mat2} out the receiving matrix - * @param {ReadonlyMat2} a the source matrix - * @returns {mat2} out - */ - -function invert(out, a) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; // Calculate the determinant - - var det = a0 * a3 - a2 * a1; - - if (!det) { - return null; - } - det = 1.0 / det; - out[0] = a3 * det; - out[1] = -a1 * det; - out[2] = -a2 * det; - out[3] = a0 * det; - return out; -} /** - * Calculates the adjugate of a mat2 + * Maps a value from a range between [min, max] to the range [outMin, outMax] * - * @param {mat2} out the receiving matrix - * @param {ReadonlyMat2} a the source matrix - * @returns {mat2} out + * @private */ - -function adjoint(out, a) { - // Caching this value is nessecary if out == a - var a0 = a[0]; - out[0] = a[3]; - out[1] = -a[1]; - out[2] = -a[2]; - out[3] = a0; - return out; +function mapValue(value , min , max , outMin , outMax ) { + return clamp((value - min) / (max - min) * (outMax - outMin) + outMin, outMin, outMax); } -/** - * Calculates the determinant of a mat2 - * - * @param {ReadonlyMat2} a the source matrix - * @returns {Number} determinant of a - */ -function determinant(a) { - return a[0] * a[3] - a[2] * a[1]; -} /** - * Multiplies two mat2's + * Check if two arrays have at least one common element. * - * @param {mat2} out the receiving matrix - * @param {ReadonlyMat2} a the first operand - * @param {ReadonlyMat2} b the second operand - * @returns {mat2} out + * @private */ - -function multiply(out, a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - out[0] = a0 * b0 + a2 * b1; - out[1] = a1 * b0 + a3 * b1; - out[2] = a0 * b2 + a2 * b3; - out[3] = a1 * b2 + a3 * b3; - return out; +function arraysIntersect (a , b ) { + for (let l = 0; l < a.length; l++) { + if (b.indexOf(a[l]) >= 0) return true; + } + return false; } + /** - * Rotates a mat2 by the given angle + * Print a warning message to the console and ensure duplicate warning messages + * are not printed. * - * @param {mat2} out the receiving matrix - * @param {ReadonlyMat2} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat2} out + * @private */ +const warnOnceHistory = {}; -function rotate(out, a, rad) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var s = Math.sin(rad); - var 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 warnOnce(message ) { + if (!warnOnceHistory[message]) { + // console isn't defined in some WebWorkers, see #2558 + if (typeof console !== "undefined") console.warn(message); + warnOnceHistory[message] = true; + } } -/** - * Scales the mat2 by the dimensions in the given vec2 - * - * @param {mat2} out the receiving matrix - * @param {ReadonlyMat2} a the matrix to rotate - * @param {ReadonlyVec2} v the vec2 to scale the matrix by - * @returns {mat2} out - **/ -function scale(out, a, v) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var v0 = v[0], - v1 = v[1]; - out[0] = a0 * v0; - out[1] = a1 * v0; - out[2] = a2 * v1; - out[3] = a3 * v1; - return out; -} /** - * Creates a matrix from a given angle - * This is equivalent to (but much faster than): - * - * mat2.identity(dest); - * mat2.rotate(dest, dest, rad); + * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order * - * @param {mat2} out mat2 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat2} out + * @private + * @returns true for a counter clockwise set of points */ - -function fromRotation(out, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); - out[0] = c; - out[1] = s; - out[2] = -s; - out[3] = c; - return out; +// http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/ +function isCounterClockwise(a , b , c ) { + return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x); } + /** - * Creates a matrix from a vector scaling - * This is equivalent to (but much faster than): - * - * mat2.identity(dest); - * mat2.scale(dest, dest, vec); + * 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. * - * @param {mat2} out mat2 receiving operation result - * @param {ReadonlyVec2} v Scaling vector - * @returns {mat2} out + * @private + * @param ring Exterior or interior ring */ - -function fromScaling(out, v) { - out[0] = v[0]; - out[1] = 0; - out[2] = 0; - out[3] = v[1]; - return out; +function calculateSignedArea(ring ) { + let sum = 0; + for (let 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; } + +/* global self, WorkerGlobalScope */ /** - * Returns a string representation of a mat2 + * Returns true if run in the web-worker context. * - * @param {ReadonlyMat2} a matrix to represent as a string - * @returns {String} string representation of the matrix + * @private + * @returns {boolean} */ - -function str(a) { - return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; +function isWorker() { + return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && + self instanceof WorkerGlobalScope; } + /** - * Returns Frobenius norm of a mat2 + * Parses data from 'Cache-Control' headers. * - * @param {ReadonlyMat2} a the matrix to calculate Frobenius norm of - * @returns {Number} Frobenius norm + * @private + * @param cacheControl Value of 'Cache-Control' header + * @return object containing parsed header info. */ -function frob(a) { - return Math.hypot(a[0], a[1], a[2], a[3]); +function parseCacheControl(cacheControl ) { + // Taken from [Wreck](https://github.com/hapijs/wreck) + const re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g; + + const header = {}; + cacheControl.replace(re, ($0, $1, $2, $3) => { + const value = $2 || $3; + header[$1] = value ? value.toLowerCase() : true; + return ''; + }); + + if (header['max-age']) { + const maxAge = parseInt(header['max-age'], 10); + if (isNaN(maxAge)) delete header['max-age']; + else header['max-age'] = maxAge; + } + + return header; } -/** - * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix - * @param {ReadonlyMat2} L the lower triangular matrix - * @param {ReadonlyMat2} D the diagonal matrix - * @param {ReadonlyMat2} U the upper triangular matrix - * @param {ReadonlyMat2} a the input matrix to factorize - */ -function LDU(L, D, U, a) { - L[2] = a[2] / a[0]; - U[0] = a[0]; - U[1] = a[1]; - U[3] = a[3] - L[2] * U[1]; - return [L, D, U]; +let _isSafari = null; + +function _resetSafariCheckForTest() { + _isSafari = null; } + /** - * Adds two mat2's + * Returns true when run in WebKit derived browsers. + * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to + * transfer data between WebWorkers and the main thread. + * https://github.com/mapbox/mapbox-gl-js/issues/8771 * - * @param {mat2} out the receiving matrix - * @param {ReadonlyMat2} a the first operand - * @param {ReadonlyMat2} b the second operand - * @returns {mat2} out + * This should be removed once the underlying Safari issue is fixed. + * + * @private + * @param scope {WindowOrWorkerGlobalScope} Since this function is used both on the main thread and WebWorker context, + * let the calling scope pass in the global scope object. + * @returns {boolean} */ +function isSafari(scope ) { + if (_isSafari == null) { + const userAgent = scope.navigator ? scope.navigator.userAgent : null; + _isSafari = !!scope.safari || + !!(userAgent && (/\b(iPad|iPhone|iPod)\b/.test(userAgent) || (!!userAgent.match('Safari') && !userAgent.match('Chrome')))); + } + return _isSafari; +} -function add(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - return out; +function isSafariWithAntialiasingBug(scope ) { + const userAgent = scope.navigator ? scope.navigator.userAgent : null; + if (!isSafari(scope)) return false; + // 15.4 is known to be buggy. + // 15.5 may or may not include the fix. Mark it as buggy to be on the safe side. + return userAgent && (userAgent.match('Version/15.4') || userAgent.match('Version/15.5') || userAgent.match(/CPU (OS|iPhone OS) (15_4|15_5) like Mac OS X/)); } -/** - * Subtracts matrix b from matrix a - * - * @param {mat2} out the receiving matrix - * @param {ReadonlyMat2} a the first operand - * @param {ReadonlyMat2} b the second operand - * @returns {mat2} out - */ -function subtract(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - out[2] = a[2] - b[2]; - out[3] = a[3] - b[3]; - return out; +function storageAvailable(type ) { + try { + const storage = window$1[type]; + storage.setItem('_mapbox_test_', 1); + storage.removeItem('_mapbox_test_'); + return true; + } catch (e) { + return false; + } } -/** - * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) - * - * @param {ReadonlyMat2} a The first matrix. - * @param {ReadonlyMat2} b The second matrix. - * @returns {Boolean} True if the matrices are equal, false otherwise. - */ -function exactEquals(a, b) { - return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; +// The following methods are from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem +//Unicode compliant base64 encoder for strings +function b64EncodeUnicode(str ) { + return window$1.btoa( + encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, + (match, p1) => { + return String.fromCharCode(Number('0x' + p1)); //eslint-disable-line + } + ) + ); } -/** - * Returns whether or not the matrices have approximately the same elements in the same position. - * - * @param {ReadonlyMat2} a The first matrix. - * @param {ReadonlyMat2} b The second matrix. - * @returns {Boolean} True if the matrices are equal, false otherwise. - */ -function equals$1(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); +// Unicode compliant decoder for base64-encoded strings +function b64DecodeUnicode(str ) { + return decodeURIComponent(window$1.atob(str).split('').map((c) => { + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); //eslint-disable-line + }).join('')); } -/** - * Multiply each element of the matrix by a scalar. - * - * @param {mat2} out the receiving matrix - * @param {ReadonlyMat2} a the matrix to scale - * @param {Number} b amount to scale the matrix's elements by - * @returns {mat2} out - */ -function multiplyScalar(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 getColumn(matrix , col ) { + return [matrix[col * 4], matrix[col * 4 + 1], matrix[col * 4 + 2], matrix[col * 4 + 3]]; } -/** - * Adds two mat2's after multiplying each element of the second operand by a scalar value. - * - * @param {mat2} out the receiving vector - * @param {ReadonlyMat2} a the first operand - * @param {ReadonlyMat2} b the second operand - * @param {Number} scale the amount to scale b's elements by before adding - * @returns {mat2} out - */ -function multiplyScalarAndAdd(out, a, b, scale) { - out[0] = a[0] + b[0] * scale; - out[1] = a[1] + b[1] * scale; - out[2] = a[2] + b[2] * scale; - out[3] = a[3] + b[3] * scale; - return out; +function setColumn(matrix , col , values ) { + matrix[col * 4 + 0] = values[0]; + matrix[col * 4 + 1] = values[1]; + matrix[col * 4 + 2] = values[2]; + matrix[col * 4 + 3] = values[3]; } -/** - * Alias for {@link mat2.multiply} - * @function - */ -var mul = multiply; -/** - * Alias for {@link mat2.subtract} - * @function - */ +// +const performance = window$1.performance; -var sub = subtract; +performance.mark('library-evaluate'); + -/** - * 2x3 Matrix - * @module mat2d - * @description - * A mat2d contains six elements defined as: - *
- * [a, b,
- *  c, d,
- *  tx, ty]
- * 
- * This is a short form for the 3x3 matrix: - *
- * [a, b, 0,
- *  c, d, 0,
- *  tx, ty, 1]
- * 
- * The last column is ignored so the array is shorter and operations are faster. - */ + + + + + + + + + + + + + + + -/** - * Creates a new identity mat2d - * - * @returns {mat2d} a new 2x3 matrix - */ + -function create$1() { - var out = new ARRAY_TYPE(6); +const PerformanceMarkers = { + create: 'create', + load: 'load', + fullLoad: 'fullLoad' +}; - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[4] = 0; - out[5] = 0; - } +let fullLoadFinished = false; +let placementTime = 0; - out[0] = 1; - out[3] = 1; - return out; -} -/** - * Creates a new mat2d initialized with values from an existing matrix - * - * @param {ReadonlyMat2d} a matrix to clone - * @returns {mat2d} a new 2x3 matrix - */ +const PerformanceUtils = { + mark(marker ) { + performance.mark(marker); -function clone$1(a) { - var out = new ARRAY_TYPE(6); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - return out; -} -/** - * Copy the values from one mat2d to another - * - * @param {mat2d} out the receiving matrix - * @param {ReadonlyMat2d} a the source matrix - * @returns {mat2d} out - */ + if (marker === PerformanceMarkers.fullLoad) { + fullLoadFinished = true; + } + }, + measure(name , begin , end ) { + performance.measure(name, begin, end); + }, + beginMeasure(name ) { + const mark = name; + performance.mark(mark); + return { + mark, + name + }; + }, + endMeasure(m ) { + performance.measure(m.name, m.mark); + }, + recordPlacementTime(time ) { + // Ignore placementTimes during loading + if (!fullLoadFinished) { + return; + } -function copy$1(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - return out; -} -/** - * Set a mat2d to the identity matrix - * - * @param {mat2d} out the receiving matrix - * @returns {mat2d} out - */ + placementTime += time; + }, + frame(timestamp , isRenderFrame ) { + performance.mark('frame', { + detail: { + timestamp, + isRenderFrame + } + }); + }, + clearMetrics() { + placementTime = 0; + fullLoadFinished = false; -function identity$1(out) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 1; - out[4] = 0; - out[5] = 0; - return out; -} -/** - * Create a new mat2d with the given values - * - * @param {Number} a Component A (index 0) - * @param {Number} b Component B (index 1) - * @param {Number} c Component C (index 2) - * @param {Number} d Component D (index 3) - * @param {Number} tx Component TX (index 4) - * @param {Number} ty Component TY (index 5) - * @returns {mat2d} A new mat2d - */ + performance.clearMeasures('loadTime'); + performance.clearMeasures('fullLoadTime'); -function fromValues$1(a, b, c, d, tx, ty) { - var out = new ARRAY_TYPE(6); - out[0] = a; - out[1] = b; - out[2] = c; - out[3] = d; - out[4] = tx; - out[5] = ty; - return out; -} -/** - * Set the components of a mat2d to the given values - * - * @param {mat2d} out the receiving matrix - * @param {Number} a Component A (index 0) - * @param {Number} b Component B (index 1) - * @param {Number} c Component C (index 2) - * @param {Number} d Component D (index 3) - * @param {Number} tx Component TX (index 4) - * @param {Number} ty Component TY (index 5) - * @returns {mat2d} out - */ + for (const marker in PerformanceMarkers) { + performance.clearMarks(PerformanceMarkers[marker]); + } + }, -function set$1(out, a, b, c, d, tx, ty) { - out[0] = a; - out[1] = b; - out[2] = c; - out[3] = d; - out[4] = tx; - out[5] = ty; - return out; -} -/** - * Inverts a mat2d - * - * @param {mat2d} out the receiving matrix - * @param {ReadonlyMat2d} a the source matrix - * @returns {mat2d} out - */ + getPerformanceMetrics() { + const metrics = {}; -function invert$1(out, a) { - var aa = a[0], - ab = a[1], - ac = a[2], - ad = a[3]; - var atx = a[4], - aty = a[5]; - var det = aa * ad - ab * ac; + performance.measure('loadTime', PerformanceMarkers.create, PerformanceMarkers.load); + performance.measure('fullLoadTime', PerformanceMarkers.create, PerformanceMarkers.fullLoad); - if (!det) { - return null; - } + const measures = performance.getEntriesByType('measure'); + for (const measure of measures) { + metrics[measure.name] = (metrics[measure.name] || 0) + measure.duration; + } - det = 1.0 / det; - out[0] = ad * det; - out[1] = -ab * det; - out[2] = -ac * det; - out[3] = aa * det; - out[4] = (ac * aty - ad * atx) * det; - out[5] = (ab * atx - aa * aty) * det; - return out; -} -/** - * Calculates the determinant of a mat2d - * - * @param {ReadonlyMat2d} a the source matrix - * @returns {Number} determinant of a - */ + metrics.placementTime = placementTime; -function determinant$1(a) { - return a[0] * a[3] - a[1] * a[2]; -} -/** - * Multiplies two mat2d's - * - * @param {mat2d} out the receiving matrix - * @param {ReadonlyMat2d} a the first operand - * @param {ReadonlyMat2d} b the second operand - * @returns {mat2d} out - */ + return metrics; + }, -function multiply$1(out, a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5]; - out[0] = a0 * b0 + a2 * b1; - out[1] = a1 * b0 + a3 * b1; - out[2] = a0 * b2 + a2 * b3; - out[3] = a1 * b2 + a3 * b3; - out[4] = a0 * b4 + a2 * b5 + a4; - out[5] = a1 * b4 + a3 * b5 + a5; - return out; -} -/** - * Rotates a mat2d by the given angle - * - * @param {mat2d} out the receiving matrix - * @param {ReadonlyMat2d} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat2d} out - */ + getWorkerPerformanceMetrics() { + const entries = performance.getEntries().map(entry => { + const result = entry.toJSON(); + if (entry.detail) { + Object.assign(result, { + detail: entry.detail + }); + } + return result; + }); + return { + scope: isWorker() ? 'Worker' : 'Window', + timeOrigin: performance.timeOrigin, + entries + }; + } +}; -function rotate$1(out, a, rad) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; - var s = Math.sin(rad); - var 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; - out[4] = a4; - out[5] = a5; - return out; +function getPerformanceMeasurement(request ) { + const url = request ? request.url.toString() : undefined; + return performance.getEntriesByName(url); } -/** - * Scales the mat2d by the dimensions in the given vec2 - * - * @param {mat2d} out the receiving matrix - * @param {ReadonlyMat2d} a the matrix to translate - * @param {ReadonlyVec2} v the vec2 to scale the matrix by - * @returns {mat2d} out - **/ -function scale$1(out, a, v) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; - var v0 = v[0], - v1 = v[1]; - out[0] = a0 * v0; - out[1] = a1 * v0; - out[2] = a2 * v1; - out[3] = a3 * v1; - out[4] = a4; - out[5] = a5; - return out; -} -/** - * Translates the mat2d by the dimensions in the given vec2 - * - * @param {mat2d} out the receiving matrix - * @param {ReadonlyMat2d} a the matrix to translate - * @param {ReadonlyVec2} v the vec2 to translate the matrix by - * @returns {mat2d} out - **/ +var name = "mapbox-gl"; +var description = "A WebGL interactive maps library"; +var version = "2.9.0"; +var main = "dist/mapbox-gl.js"; +var style = "dist/mapbox-gl.css"; +var license = "SEE LICENSE IN LICENSE.txt"; +var type = "module"; +var repository = { + type: "git", + url: "git://github.com/mapbox/mapbox-gl-js.git" +}; +var dependencies = { + "@mapbox/geojson-rewind": "^0.5.1", + "@mapbox/geojson-types": "^1.0.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^2.0.1", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^2.0.5", + "@mapbox/unitbezier": "^0.0.0", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + csscolorparser: "~1.0.3", + earcut: "^2.2.3", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.4.3", + "grid-index": "^1.1.0", + "murmurhash-js": "^1.0.0", + pbf: "^3.2.1", + potpack: "^1.0.2", + quickselect: "^2.0.0", + rw: "^1.3.3", + supercluster: "^7.1.4", + tinyqueue: "^2.0.3", + "vt-pbf": "^3.1.3" +}; +var devDependencies = { + "@babel/core": "^7.17.8", + "@babel/eslint-parser": "^7.17.0", + "@babel/preset-flow": "^7.16.7", + "@mapbox/flow-remove-types": "^2.0.0", + "@mapbox/gazetteer": "^4.0.4", + "@mapbox/mapbox-gl-rtl-text": "^0.2.3", + "@mapbox/mvt-fixtures": "^3.8.0", + "@octokit/auth-app": "^2.11.0", + "@octokit/rest": "^18.12.0", + "@rollup/plugin-commonjs": "^17.1.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.2", + "@rollup/plugin-strip": "^2.1.0", + address: "^1.1.2", + browserify: "^17.0.0", + chalk: "^4.1.2", + chokidar: "^3.5.3", + cssnano: "^4.1.11", + d3: "^6.7.0", + "d3-queue": "^3.0.7", + diff: "^5.0.0", + documentation: "~13.1.1", + ejs: "^3.1.6", + envify: "^4.1.0", + eslint: "^7.30.0", + "eslint-config-mourner": "^3.0.0", + "eslint-plugin-flowtype": "^5.2.0", + "eslint-plugin-html": "^6.1.1", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-jsdoc": "^32.3.4", + "flow-bin": "0.142.0", + gl: "4.9.0", + glob: "^7.2.0", + "is-builtin-module": "^3.1.0", + jsdom: "^13.2.0", + "json-stringify-pretty-compact": "^2.0.0", + "lodash.template": "^4.5.0", + "mapbox-gl-styles": "^2.0.2", + minimist: "^1.2.6", + "mock-geolocation": "^1.0.11", + "node-notifier": "^9.0.1", + "npm-font-open-sans": "^1.1.0", + "npm-run-all": "^4.1.5", + nyc: "^15.1.0", + pixelmatch: "^5.2.1", + postcss: "^8.4.12", + "postcss-cli": "^8.3.1", + "postcss-inline-svg": "^5.0.0", + "pretty-bytes": "^5.6.0", + "puppeteer-core": "^11.0.0", + "qrcode-terminal": "^0.12.0", + rollup: "^2.70.1", + "rollup-plugin-sourcemaps": "^0.6.3", + "rollup-plugin-terser": "^7.0.2", + "rollup-plugin-unassert": "^0.3.0", + "selenium-webdriver": "^4.1.1", + "shuffle-seed": "^1.1.6", + sinon: "^9.2.4", + st: "^2.0.0", + stylelint: "^14.6.1", + "stylelint-config-standard": "^25.0.0", + tap: "~12.4.1", + tape: "^5.5.2", + "tape-filter": "^1.0.4", + testem: "^3.6.0" +}; +var browser = { + "./src/shaders/index.js": "./src/shaders/shaders.js", + "./src/util/window.js": "./src/util/browser/window.js", + "./src/util/web_worker.js": "./src/util/browser/web_worker.js" +}; +var scripts = { + "build-dev": "rollup -c --environment BUILD:dev", + "watch-dev": "rollup -c --environment BUILD:dev --watch", + "build-bench": "rollup -c --environment BUILD:bench,MINIFY:true", + "build-prod": "rollup -c --environment BUILD:production", + "build-prod-min": "rollup -c --environment BUILD:production,MINIFY:true", + "build-csp": "rollup -c rollup.config.csp.js", + "build-test-suite": "rollup -c test/integration/rollup.config.test.js", + "build-flow-types": "mkdir -p dist && cp build/mapbox-gl.js.flow dist/mapbox-gl.js.flow && cp build/mapbox-gl.js.flow dist/mapbox-gl-dev.js.flow", + "build-css": "postcss -o dist/mapbox-gl.css src/css/mapbox-gl.css", + "build-style-spec": "cd src/style-spec && npm run build && cd ../.. && mkdir -p dist/style-spec && cp src/style-spec/dist/* dist/style-spec", + "watch-css": "postcss --watch -o dist/mapbox-gl.css src/css/mapbox-gl.css", + "build-token": "node build/generate-access-token-script.js", + "build-benchmarks": "BENCHMARK_VERSION=${BENCHMARK_VERSION:-\"$(git rev-parse --abbrev-ref HEAD) $(git rev-parse --short=7 HEAD)\"} rollup -c bench/versions/rollup_config_benchmarks.js", + "watch-benchmarks": "BENCHMARK_VERSION=${BENCHMARK_VERSION:-\"$(git rev-parse --abbrev-ref HEAD) $(git rev-parse --short=7 HEAD)\"} rollup -c bench/rollup_config_benchmarks.js -w", + "start-server": "st --no-cache -H 0.0.0.0 --port 9966 --index index.html .", + start: "run-p build-token watch-css watch-dev watch-benchmarks start-server", + "start-debug": "run-p build-token watch-css watch-dev start-server", + "start-bench": "run-p build-token watch-benchmarks start-server", + "start-release": "run-s build-token build-prod-min build-css print-release-url start-server", + lint: "eslint --cache --ignore-path .gitignore src test bench debug/*.html", + "lint-css": "stylelint 'src/css/mapbox-gl.css'", + test: "run-s lint lint-css test-flow test-unit", + "test-suite": "run-s test-render test-query test-expressions", + "test-suite-clean": "find test/integration/{render,query, expressions}-tests -mindepth 2 -type d -exec test -e \"{}/actual.png\" \\; -not \\( -exec test -e \"{}/style.json\" \\; \\) -print | xargs -t rm -r", + "test-unit": "build/run-tap --reporter classic --no-coverage test/unit", + "test-build": "build/run-tap --no-coverage test/build/**/*.test.js", + "test-browser": "build/run-tap --reporter spec --no-coverage test/browser/**/*.test.js", + "watch-render": "SUITE_NAME=render testem -f test/integration/testem/testem.js", + "watch-query": "SUITE_NAME=query testem -f test/integration/testem/testem.js", + "test-render": "SUITE_NAME=render CI=true testem ci -f test/integration/testem/testem.js", + "test-render-prod": "BUILD=production SUITE_NAME=render CI=true testem ci -f test/integration/testem/testem.js", + "test-render-csp": "BUILD=csp SUITE_NAME=render CI=true testem ci -f test/integration/testem/testem.js", + "test-query": "SUITE_NAME=query CI=true testem ci -f test/integration/testem/testem.js", + "test-expressions": "build/run-node test/expression.test.js", + "test-flow": "build/run-node build/generate-flow-typed-style-spec && flow .", + "test-cov": "nyc --require=@mapbox/flow-remove-types/register --reporter=text-summary --reporter=lcov --cache run-s test-unit test-expressions test-query test-render", + "test-style-spec": "cd src/style-spec && npm test", + prepublishOnly: "run-s build-flow-types build-dev build-prod-min build-prod build-csp build-css build-style-spec", + "print-release-url": "node build/print-release-url.js", + codegen: "build/run-node build/generate-style-code.js && build/run-node build/generate-struct-arrays.js" +}; +var files = [ + "build/", + "dist/mapbox-gl*", + "dist/style-spec/", + "dist/package.json", + "flow-typed/*.js", + "src/", + ".flowconfig", + "LICENSE.txt" +]; +var _package = { + name: name, + description: description, + version: version, + main: main, + style: style, + license: license, + type: type, + repository: repository, + dependencies: dependencies, + devDependencies: devDependencies, + browser: browser, + scripts: scripts, + files: files +}; -function translate(out, a, v) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; - var v0 = v[0], - v1 = v[1]; - out[0] = a0; - out[1] = a1; - out[2] = a2; - out[3] = a3; - out[4] = a0 * v0 + a2 * v1 + a4; - out[5] = a1 * v0 + a3 * v1 + a5; - return out; -} -/** - * Creates a matrix from a given angle - * This is equivalent to (but much faster than): - * - * mat2d.identity(dest); - * mat2d.rotate(dest, dest, rad); - * - * @param {mat2d} out mat2d receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat2d} out - */ +// strict + -function fromRotation$1(out, rad) { - var s = Math.sin(rad), - c = Math.cos(rad); - out[0] = c; - out[1] = s; - out[2] = -s; - out[3] = c; - out[4] = 0; - out[5] = 0; - return out; -} -/** - * Creates a matrix from a vector scaling - * This is equivalent to (but much faster than): - * - * mat2d.identity(dest); - * mat2d.scale(dest, dest, vec); - * - * @param {mat2d} out mat2d receiving operation result - * @param {ReadonlyVec2} v Scaling vector - * @returns {mat2d} out - */ +let linkEl; -function fromScaling$1(out, v) { - out[0] = v[0]; - out[1] = 0; - out[2] = 0; - out[3] = v[1]; - out[4] = 0; - out[5] = 0; - return out; -} -/** - * Creates a matrix from a vector translation - * This is equivalent to (but much faster than): - * - * mat2d.identity(dest); - * mat2d.translate(dest, dest, vec); - * - * @param {mat2d} out mat2d receiving operation result - * @param {ReadonlyVec2} v Translation vector - * @returns {mat2d} out - */ +let reducedMotionQuery ; -function fromTranslation(out, v) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 1; - out[4] = v[0]; - out[5] = v[1]; - return out; -} -/** - * Returns a string representation of a mat2d - * - * @param {ReadonlyMat2d} a matrix to represent as a string - * @returns {String} string representation of the matrix - */ +let stubTime; -function str$1(a) { - return "mat2d(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ")"; -} -/** - * Returns Frobenius norm of a mat2d - * - * @param {ReadonlyMat2d} a the matrix to calculate Frobenius norm of - * @returns {Number} Frobenius norm - */ +let canvas; -function frob$1(a) { - return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], 1); -} /** - * Adds two mat2d's - * - * @param {mat2d} out the receiving matrix - * @param {ReadonlyMat2d} a the first operand - * @param {ReadonlyMat2d} b the second operand - * @returns {mat2d} out + * @private */ +const exported$1 = { + /** + * Returns either performance.now() or a value set by setNow. + * @returns {number} Time value in milliseconds. + */ + now() { + if (stubTime !== undefined) { + return stubTime; + } + return window$1.performance.now(); + }, + setNow(time ) { + stubTime = time; + }, -function add$1(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - out[4] = a[4] + b[4]; - out[5] = a[5] + b[5]; - return out; -} -/** - * Subtracts matrix b from matrix a - * - * @param {mat2d} out the receiving matrix - * @param {ReadonlyMat2d} a the first operand - * @param {ReadonlyMat2d} b the second operand - * @returns {mat2d} out - */ + restoreNow() { + stubTime = undefined; + }, -function subtract$1(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - out[2] = a[2] - b[2]; - out[3] = a[3] - b[3]; - out[4] = a[4] - b[4]; - out[5] = a[5] - b[5]; - return out; -} -/** - * Multiply each element of the matrix by a scalar. - * - * @param {mat2d} out the receiving matrix - * @param {ReadonlyMat2d} a the matrix to scale - * @param {Number} b amount to scale the matrix's elements by - * @returns {mat2d} out - */ + frame(fn ) { + const frame = window$1.requestAnimationFrame(fn); + return {cancel: () => window$1.cancelAnimationFrame(frame)}; + }, -function multiplyScalar$1(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - out[2] = a[2] * b; - out[3] = a[3] * b; - out[4] = a[4] * b; - out[5] = a[5] * b; - return out; -} -/** - * Adds two mat2d's after multiplying each element of the second operand by a scalar value. - * - * @param {mat2d} out the receiving vector - * @param {ReadonlyMat2d} a the first operand - * @param {ReadonlyMat2d} b the second operand - * @param {Number} scale the amount to scale b's elements by before adding - * @returns {mat2d} out - */ + getImageData(img , padding = 0) { + const {width, height} = img; -function multiplyScalarAndAdd$1(out, a, b, scale) { - out[0] = a[0] + b[0] * scale; - out[1] = a[1] + b[1] * scale; - out[2] = a[2] + b[2] * scale; - out[3] = a[3] + b[3] * scale; - out[4] = a[4] + b[4] * scale; - out[5] = a[5] + b[5] * scale; - return out; -} -/** - * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) - * - * @param {ReadonlyMat2d} a The first matrix. - * @param {ReadonlyMat2d} b The second matrix. - * @returns {Boolean} True if the matrices are equal, false otherwise. - */ + if (!canvas) { + canvas = window$1.document.createElement('canvas'); + } -function exactEquals$1(a, b) { - return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5]; -} -/** - * Returns whether or not the matrices have approximately the same elements in the same position. - * - * @param {ReadonlyMat2d} a The first matrix. - * @param {ReadonlyMat2d} b The second matrix. - * @returns {Boolean} True if the matrices are equal, false otherwise. - */ + const context = canvas.getContext('2d'); + if (!context) { + throw new Error('failed to create canvas 2d context'); + } -function equals$2(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)); -} -/** - * Alias for {@link mat2d.multiply} - * @function - */ + if (width > canvas.width || height > canvas.height) { + canvas.width = width; + canvas.height = height; + } -var mul$1 = multiply$1; -/** - * Alias for {@link mat2d.subtract} - * @function - */ + context.clearRect(-padding, -padding, width + 2 * padding, height + 2 * padding); + context.drawImage(img, 0, 0, width, height); + return context.getImageData(-padding, -padding, width + 2 * padding, height + 2 * padding); + }, -var sub$1 = subtract$1; + resolveURL(path ) { + if (!linkEl) linkEl = window$1.document.createElement('a'); + linkEl.href = path; + return linkEl.href; + }, -/** - * 3x3 Matrix - * @module mat3 - */ + get devicePixelRatio() { return window$1.devicePixelRatio; }, + get prefersReducedMotion() { + if (!window$1.matchMedia) return false; + // Lazily initialize media query. + if (reducedMotionQuery == null) { + reducedMotionQuery = window$1.matchMedia('(prefers-reduced-motion: reduce)'); + } + return reducedMotionQuery.matches; + }, +}; -/** - * Creates a new identity mat3 - * - * @returns {mat3} a new 3x3 matrix - */ +// strict -function create$2() { - var out = new ARRAY_TYPE(9); + + + + + + + + + + + + - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[5] = 0; - out[6] = 0; - out[7] = 0; - } +let mapboxHTTPURLRegex; - out[0] = 1; - out[4] = 1; - out[8] = 1; - return out; -} -/** - * Copies the upper-left 3x3 values into the given mat3. - * - * @param {mat3} out the receiving 3x3 matrix - * @param {ReadonlyMat4} a the source 4x4 matrix - * @returns {mat3} out - */ +const config = { + API_URL: 'https://api.mapbox.com', + get API_URL_REGEX () { + if (mapboxHTTPURLRegex == null) { + const prodMapboxHTTPURLRegex = /^((https?:)?\/\/)?([^\/]+\.)?mapbox\.c(n|om)(\/|\?|$)/i; + try { + mapboxHTTPURLRegex = (process.env.API_URL_REGEX != null) ? new RegExp(process.env.API_URL_REGEX) : prodMapboxHTTPURLRegex; + } catch (e) { + mapboxHTTPURLRegex = prodMapboxHTTPURLRegex; + } + } -function fromMat4(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[4]; - out[4] = a[5]; - out[5] = a[6]; - out[6] = a[8]; - out[7] = a[9]; - out[8] = a[10]; - return out; -} -/** - * Creates a new mat3 initialized with values from an existing matrix - * - * @param {ReadonlyMat3} a matrix to clone - * @returns {mat3} a new 3x3 matrix - */ + return mapboxHTTPURLRegex; + }, + get EVENTS_URL() { + if (!this.API_URL) { return null; } + if (this.API_URL.indexOf('https://api.mapbox.cn') === 0) { + return 'https://events.mapbox.cn/events/v2'; + } else if (this.API_URL.indexOf('https://api.mapbox.com') === 0) { + return 'https://events.mapbox.com/events/v2'; + } else { + return null; + } + }, + SESSION_PATH: '/map-sessions/v1', + FEEDBACK_URL: 'https://apps.mapbox.com/feedback', + TILE_URL_VERSION: 'v4', + RASTER_URL_PREFIX: 'raster/v1', + REQUIRE_ACCESS_TOKEN: true, + ACCESS_TOKEN: null, + MAX_PARALLEL_IMAGE_REQUESTS: 16 +}; -function clone$2(a) { - var out = new ARRAY_TYPE(9); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[8] = a[8]; - return out; -} -/** - * Copy the values from one mat3 to another - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat3} a the source matrix - * @returns {mat3} out - */ +// strict -function copy$2(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[8] = a[8]; - return out; -} -/** - * Create a new mat3 with the given values - * - * @param {Number} m00 Component in column 0, row 0 position (index 0) - * @param {Number} m01 Component in column 0, row 1 position (index 1) - * @param {Number} m02 Component in column 0, row 2 position (index 2) - * @param {Number} m10 Component in column 1, row 0 position (index 3) - * @param {Number} m11 Component in column 1, row 1 position (index 4) - * @param {Number} m12 Component in column 1, row 2 position (index 5) - * @param {Number} m20 Component in column 2, row 0 position (index 6) - * @param {Number} m21 Component in column 2, row 1 position (index 7) - * @param {Number} m22 Component in column 2, row 2 position (index 8) - * @returns {mat3} A new mat3 - */ +const exported = { + supported: false, + testSupport +}; -function fromValues$2(m00, m01, m02, m10, m11, m12, m20, m21, m22) { - var out = new ARRAY_TYPE(9); - out[0] = m00; - out[1] = m01; - out[2] = m02; - out[3] = m10; - out[4] = m11; - out[5] = m12; - out[6] = m20; - out[7] = m21; - out[8] = m22; - return out; -} -/** - * Set the components of a mat3 to the given values - * - * @param {mat3} out the receiving matrix - * @param {Number} m00 Component in column 0, row 0 position (index 0) - * @param {Number} m01 Component in column 0, row 1 position (index 1) - * @param {Number} m02 Component in column 0, row 2 position (index 2) - * @param {Number} m10 Component in column 1, row 0 position (index 3) - * @param {Number} m11 Component in column 1, row 1 position (index 4) - * @param {Number} m12 Component in column 1, row 2 position (index 5) - * @param {Number} m20 Component in column 2, row 0 position (index 6) - * @param {Number} m21 Component in column 2, row 1 position (index 7) - * @param {Number} m22 Component in column 2, row 2 position (index 8) - * @returns {mat3} out - */ +let glForTesting; +let webpCheckComplete = false; +let webpImgTest; +let webpImgTestOnloadComplete = false; -function set$2(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) { - out[0] = m00; - out[1] = m01; - out[2] = m02; - out[3] = m10; - out[4] = m11; - out[5] = m12; - out[6] = m20; - out[7] = m21; - out[8] = m22; - return out; +if (window$1.document) { + webpImgTest = window$1.document.createElement('img'); + webpImgTest.onload = function() { + if (glForTesting) testWebpTextureUpload(glForTesting); + glForTesting = null; + webpImgTestOnloadComplete = true; + }; + webpImgTest.onerror = function() { + webpCheckComplete = true; + glForTesting = null; + }; + webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA='; } -/** - * Set a mat3 to the identity matrix - * - * @param {mat3} out the receiving matrix - * @returns {mat3} out - */ -function identity$2(out) { - 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; -} -/** - * Transpose the values of a mat3 - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat3} a the source matrix - * @returns {mat3} out - */ +function testSupport(gl ) { + if (webpCheckComplete || !webpImgTest) return; -function transpose$1(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], - a02 = a[2], - a12 = a[5]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a01; - out[5] = a[7]; - out[6] = a02; - out[7] = a12; - } else { - out[0] = a[0]; - out[1] = a[3]; - out[2] = a[6]; - out[3] = a[1]; - out[4] = a[4]; - out[5] = a[7]; - out[6] = a[2]; - out[7] = a[5]; - out[8] = a[8]; - } + // HTMLImageElement.complete is set when an image is done loading it's source + // regardless of whether the load was successful or not. + // It's possible for an error to set HTMLImageElement.complete to true which would trigger + // testWebpTextureUpload and mistakenly set exported.supported to true in browsers which don't support webp + // To avoid this, we set a flag in the image's onload handler and only call testWebpTextureUpload + // after a successful image load event. + if (webpImgTestOnloadComplete) { + testWebpTextureUpload(gl); + } else { + glForTesting = gl; - return out; + } } -/** - * Inverts a mat3 - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat3} a the source matrix - * @returns {mat3} out - */ -function invert$2(out, a) { - var a00 = a[0], - a01 = a[1], - a02 = a[2]; - var a10 = a[3], - a11 = a[4], - a12 = a[5]; - var a20 = a[6], - a21 = a[7], - a22 = a[8]; - var b01 = a22 * a11 - a12 * a21; - var b11 = -a22 * a10 + a12 * a20; - var b21 = a21 * a10 - a11 * a20; // Calculate the determinant +function testWebpTextureUpload(gl ) { + // Edge 18 supports WebP but not uploading a WebP image to a gl texture + // Test support for this before allowing WebP images. + // https://github.com/mapbox/mapbox-gl-js/issues/7671 + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); - var det = a00 * b01 + a01 * b11 + a02 * b21; + try { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, webpImgTest); - if (!det) { - return null; - } + // The error does not get triggered in Edge if the context is lost + if (gl.isContextLost()) return; - det = 1.0 / det; - out[0] = b01 * det; - out[1] = (-a22 * a01 + a02 * a21) * det; - out[2] = (a12 * a01 - a02 * a11) * det; - out[3] = b11 * det; - out[4] = (a22 * a00 - a02 * a20) * det; - out[5] = (-a12 * a00 + a02 * a10) * det; - out[6] = b21 * det; - out[7] = (-a21 * a00 + a01 * a20) * det; - out[8] = (a11 * a00 - a01 * a10) * det; - return out; -} -/** - * Calculates the adjugate of a mat3 - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat3} a the source matrix - * @returns {mat3} out - */ + exported.supported = true; + } catch (e) { + // Catch "Unspecified Error." in Edge 18. + } -function adjoint$1(out, a) { - var a00 = a[0], - a01 = a[1], - a02 = a[2]; - var a10 = a[3], - a11 = a[4], - a12 = a[5]; - var a20 = a[6], - a21 = a[7], - a22 = a[8]; - out[0] = a11 * a22 - a12 * a21; - out[1] = a02 * a21 - a01 * a22; - out[2] = a01 * a12 - a02 * a11; - out[3] = a12 * a20 - a10 * a22; - out[4] = a00 * a22 - a02 * a20; - out[5] = a02 * a10 - a00 * a12; - out[6] = a10 * a21 - a11 * a20; - out[7] = a01 * a20 - a00 * a21; - out[8] = a00 * a11 - a01 * a10; - return out; -} -/** - * Calculates the determinant of a mat3 - * - * @param {ReadonlyMat3} a the source matrix - * @returns {Number} determinant of a - */ + gl.deleteTexture(texture); -function determinant$2(a) { - var a00 = a[0], - a01 = a[1], - a02 = a[2]; - var a10 = a[3], - a11 = a[4], - a12 = a[5]; - var a20 = a[6], - a21 = a[7], - a22 = a[8]; - return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20); + webpCheckComplete = true; } -/** - * Multiplies two mat3's - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat3} a the first operand - * @param {ReadonlyMat3} b the second operand - * @returns {mat3} out - */ -function multiply$2(out, a, b) { - var a00 = a[0], - a01 = a[1], - a02 = a[2]; - var a10 = a[3], - a11 = a[4], - a12 = a[5]; - var a20 = a[6], - a21 = a[7], - a22 = a[8]; - var b00 = b[0], - b01 = b[1], - b02 = b[2]; - var b10 = b[3], - b11 = b[4], - b12 = b[5]; - var b20 = b[6], - b21 = b[7], - b22 = b[8]; - out[0] = b00 * a00 + b01 * a10 + b02 * a20; - out[1] = b00 * a01 + b01 * a11 + b02 * a21; - out[2] = b00 * a02 + b01 * a12 + b02 * a22; - out[3] = b10 * a00 + b11 * a10 + b12 * a20; - out[4] = b10 * a01 + b11 * a11 + b12 * a21; - out[5] = b10 * a02 + b11 * a12 + b12 * a22; - out[6] = b20 * a00 + b21 * a10 + b22 * a20; - out[7] = b20 * a01 + b21 * a11 + b22 * a21; - out[8] = b20 * a02 + b21 * a12 + b22 * a22; - return out; -} -/** - * Translate a mat3 by the given vector - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat3} a the matrix to translate - * @param {ReadonlyVec2} v vector to translate by - * @returns {mat3} out - */ - -function translate$1(out, a, v) { - var a00 = a[0], - a01 = a[1], - a02 = a[2], - a10 = a[3], - a11 = a[4], - a12 = a[5], - a20 = a[6], - a21 = a[7], - a22 = a[8], - x = v[0], - y = v[1]; - out[0] = a00; - out[1] = a01; - out[2] = a02; - out[3] = a10; - out[4] = a11; - out[5] = a12; - out[6] = x * a00 + y * a10 + a20; - out[7] = x * a01 + y * a11 + a21; - out[8] = x * a02 + y * a12 + a22; - return out; -} -/** - * Rotates a mat3 by the given angle - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat3} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat3} out - */ - -function rotate$2(out, a, rad) { - var a00 = a[0], - a01 = a[1], - a02 = a[2], - a10 = a[3], - a11 = a[4], - a12 = a[5], - a20 = a[6], - a21 = a[7], - a22 = a[8], - s = Math.sin(rad), - c = Math.cos(rad); - out[0] = c * a00 + s * a10; - out[1] = c * a01 + s * a11; - out[2] = c * a02 + s * a12; - out[3] = c * a10 - s * a00; - out[4] = c * a11 - s * a01; - out[5] = c * a12 - s * a02; - out[6] = a20; - out[7] = a21; - out[8] = a22; - return out; -} -/** - * Scales the mat3 by the dimensions in the given vec2 - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat3} a the matrix to rotate - * @param {ReadonlyVec2} v the vec2 to scale the matrix by - * @returns {mat3} out - **/ +// -function scale$2(out, a, v) { - var x = v[0], - y = v[1]; - out[0] = x * a[0]; - out[1] = x * a[1]; - out[2] = x * a[2]; - out[3] = y * a[3]; - out[4] = y * a[4]; - out[5] = y * a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[8] = a[8]; - return out; -} -/** - * Creates a matrix from a vector translation - * This is equivalent to (but much faster than): - * - * mat3.identity(dest); - * mat3.translate(dest, dest, vec); - * - * @param {mat3} out mat3 receiving operation result - * @param {ReadonlyVec2} v Translation vector - * @returns {mat3} out - */ +/***** START WARNING REMOVAL OR MODIFICATION OF THE +* FOLLOWING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ****** +* The following code is used to access Mapbox's APIs. Removal or modification +* of this code can result in higher fees and/or +* termination of your account with Mapbox. +* +* Under the Mapbox Terms of Service, you may not use this code to access Mapbox +* Mapping APIs other than through Mapbox SDKs. +* +* The Mapping APIs documentation is available at https://docs.mapbox.com/api/maps/#maps +* and the Mapbox Terms of Service are available at https://www.mapbox.com/tos/ +******************************************************************************/ -function fromTranslation$1(out, v) { - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 1; - out[5] = 0; - out[6] = v[0]; - out[7] = v[1]; - out[8] = 1; - return out; -} -/** - * Creates a matrix from a given angle - * This is equivalent to (but much faster than): - * - * mat3.identity(dest); - * mat3.rotate(dest, dest, rad); - * - * @param {mat3} out mat3 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat3} out - */ + + + + -function fromRotation$2(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; -} -/** - * Creates a matrix from a vector scaling - * This is equivalent to (but much faster than): - * - * mat3.identity(dest); - * mat3.scale(dest, dest, vec); - * - * @param {mat3} out mat3 receiving operation result - * @param {ReadonlyVec2} v Scaling vector - * @returns {mat3} out - */ +const SKU_ID = '01'; -function fromScaling$2(out, v) { - out[0] = v[0]; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = v[1]; - out[5] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 1; - return out; -} -/** - * Copies the values from a mat2d into a mat3 - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat2d} a the matrix to copy - * @returns {mat3} out - **/ +function createSkuToken() { + // SKU_ID and TOKEN_VERSION are specified by an internal schema and should not change + const TOKEN_VERSION = '1'; + const base62chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + // sessionRandomizer is a randomized 10-digit base-62 number + let sessionRandomizer = ''; + for (let i = 0; i < 10; i++) { + sessionRandomizer += base62chars[Math.floor(Math.random() * 62)]; + } + const expiration = 12 * 60 * 60 * 1000; // 12 hours + const token = [TOKEN_VERSION, SKU_ID, sessionRandomizer].join(''); + const tokenExpiresAt = Date.now() + expiration; -function fromMat2d(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = 0; - out[3] = a[2]; - out[4] = a[3]; - out[5] = 0; - out[6] = a[4]; - out[7] = a[5]; - out[8] = 1; - return out; + return {token, tokenExpiresAt}; } -/** - * Calculates a 3x3 matrix from the given quaternion - * - * @param {mat3} out mat3 receiving operation result - * @param {ReadonlyQuat} q Quaternion to create matrix from - * - * @returns {mat3} out - */ -function fromQuat(out, q) { - var x = q[0], - y = q[1], - z = q[2], - w = q[3]; - var x2 = x + x; - var y2 = y + y; - var z2 = z + z; - var xx = x * x2; - var yx = y * x2; - var yy = y * y2; - var zx = z * x2; - var zy = z * y2; - var zz = z * z2; - var wx = w * x2; - var wy = w * y2; - var wz = w * z2; - out[0] = 1 - yy - zz; - out[3] = yx - wz; - out[6] = zx + wy; - out[1] = yx + wz; - out[4] = 1 - xx - zz; - out[7] = zy - wx; - out[2] = zx - wy; - out[5] = zy + wx; - out[8] = 1 - xx - yy; - return out; -} -/** - * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix - * - * @param {mat3} out mat3 receiving operation result - * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from - * - * @returns {mat3} out - */ +/***** END WARNING - REMOVAL OR MODIFICATION OF THE +PRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ******/ -function normalFromMat4(out, a) { - var a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7]; - var a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - var a30 = a[12], - a31 = a[13], - a32 = a[14], - a33 = a[15]; - var b00 = a00 * a11 - a01 * a10; - var b01 = a00 * a12 - a02 * a10; - var b02 = a00 * a13 - a03 * a10; - var b03 = a01 * a12 - a02 * a11; - var b04 = a01 * a13 - a03 * a11; - var b05 = a02 * a13 - a03 * a12; - var b06 = a20 * a31 - a21 * a30; - var b07 = a20 * a32 - a22 * a30; - var b08 = a20 * a33 - a23 * a30; - var b09 = a21 * a32 - a22 * a31; - var b10 = a21 * a33 - a23 * a31; - var b11 = a22 * a33 - a23 * a32; // Calculate the determinant +// - var 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] = (a12 * b08 - a10 * b11 - a13 * b07) * det; - out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det; - out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det; - out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det; - out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det; - out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det; - out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det; - out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det; - return out; -} -/** - * Generates a 2D projection matrix with the given bounds - * - * @param {mat3} out mat3 frustum matrix will be written into - * @param {number} width Width of your gl context - * @param {number} height Height of gl context - * @returns {mat3} out - */ + + + + + + -function projection(out, width, height) { - out[0] = 2 / width; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = -2 / height; - out[5] = 0; - out[6] = -1; - out[7] = 1; - out[8] = 1; - return out; -} -/** - * Returns a string representation of a mat3 - * - * @param {ReadonlyMat3} a matrix to represent as a string - * @returns {String} string representation of the matrix - */ + -function str$2(a) { - return "mat3(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ")"; -} -/** - * Returns Frobenius norm of a mat3 - * - * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of - * @returns {Number} Frobenius norm - */ +const AUTH_ERR_MSG = 'NO_ACCESS_TOKEN'; -function frob$2(a) { - return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]); -} -/** - * Adds two mat3's - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat3} a the first operand - * @param {ReadonlyMat3} b the second operand - * @returns {mat3} out - */ +class RequestManager { + + + + + -function add$2(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - out[4] = a[4] + b[4]; - out[5] = a[5] + b[5]; - out[6] = a[6] + b[6]; - out[7] = a[7] + b[7]; - out[8] = a[8] + b[8]; - return out; -} -/** - * Subtracts matrix b from matrix a - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat3} a the first operand - * @param {ReadonlyMat3} b the second operand - * @returns {mat3} out - */ + constructor(transformRequestFn , customAccessToken , silenceAuthErrors ) { + this._transformRequestFn = transformRequestFn; + this._customAccessToken = customAccessToken; + this._silenceAuthErrors = !!silenceAuthErrors; + this._createSkuToken(); + } -function subtract$2(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - out[2] = a[2] - b[2]; - out[3] = a[3] - b[3]; - out[4] = a[4] - b[4]; - out[5] = a[5] - b[5]; - out[6] = a[6] - b[6]; - out[7] = a[7] - b[7]; - out[8] = a[8] - b[8]; - return out; -} -/** - * Multiply each element of the matrix by a scalar. - * - * @param {mat3} out the receiving matrix - * @param {ReadonlyMat3} a the matrix to scale - * @param {Number} b amount to scale the matrix's elements by - * @returns {mat3} out - */ + _createSkuToken() { + const skuToken = createSkuToken(); + this._skuToken = skuToken.token; + this._skuTokenExpiresAt = skuToken.tokenExpiresAt; + } -function multiplyScalar$2(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - out[2] = a[2] * b; - out[3] = a[3] * b; - out[4] = a[4] * b; - out[5] = a[5] * b; - out[6] = a[6] * b; - out[7] = a[7] * b; - out[8] = a[8] * b; - return out; -} -/** - * Adds two mat3's after multiplying each element of the second operand by a scalar value. - * - * @param {mat3} out the receiving vector - * @param {ReadonlyMat3} a the first operand - * @param {ReadonlyMat3} b the second operand - * @param {Number} scale the amount to scale b's elements by before adding - * @returns {mat3} out - */ + _isSkuTokenExpired() { + return Date.now() > this._skuTokenExpiresAt; + } -function multiplyScalarAndAdd$2(out, a, b, scale) { - out[0] = a[0] + b[0] * scale; - out[1] = a[1] + b[1] * scale; - out[2] = a[2] + b[2] * scale; - out[3] = a[3] + b[3] * scale; - out[4] = a[4] + b[4] * scale; - out[5] = a[5] + b[5] * scale; - out[6] = a[6] + b[6] * scale; - out[7] = a[7] + b[7] * scale; - out[8] = a[8] + b[8] * scale; - return out; -} -/** - * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) - * - * @param {ReadonlyMat3} a The first matrix. - * @param {ReadonlyMat3} b The second matrix. - * @returns {Boolean} True if the matrices are equal, false otherwise. - */ + transformRequest(url , type ) { + if (this._transformRequestFn) { + return this._transformRequestFn(url, type) || {url}; + } -function exactEquals$2(a, b) { - return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8]; -} -/** - * Returns whether or not the matrices have approximately the same elements in the same position. - * - * @param {ReadonlyMat3} a The first matrix. - * @param {ReadonlyMat3} b The second matrix. - * @returns {Boolean} True if the matrices are equal, false otherwise. - */ + return {url}; + } -function equals$3(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7], - a8 = a[8]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7], - b8 = b[8]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)); -} -/** - * Alias for {@link mat3.multiply} - * @function - */ + normalizeStyleURL(url , accessToken ) { + if (!isMapboxURL(url)) return url; + const urlObject = parseUrl(url); + urlObject.path = `/styles/v1${urlObject.path}`; + return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); + } -var mul$2 = multiply$2; -/** - * Alias for {@link mat3.subtract} - * @function - */ + normalizeGlyphsURL(url , accessToken ) { + if (!isMapboxURL(url)) return url; + const urlObject = parseUrl(url); + urlObject.path = `/fonts/v1${urlObject.path}`; + return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); + } -var sub$2 = subtract$2; + normalizeSourceURL(url , accessToken , language , worldview ) { + if (!isMapboxURL(url)) return url; + const 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'); + if (language) { + urlObject.params.push(`language=${language}`); + } + if (worldview) { + urlObject.params.push(`worldview=${worldview}`); + } -/** - * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied. - * @module mat4 - */ + return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); + } -/** - * Creates a new identity mat4 - * - * @returns {mat4} a new 4x4 matrix - */ + normalizeSpriteURL(url , format , extension , accessToken ) { + const urlObject = parseUrl(url); + if (!isMapboxURL(url)) { + urlObject.path += `${format}${extension}`; + return formatUrl(urlObject); + } + urlObject.path = `/styles/v1${urlObject.path}/sprite${format}${extension}`; + return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); + } -function create$3() { - var out = new ARRAY_TYPE(16); + normalizeTileURL(tileURL , use2x , rasterTileSize ) { + if (this._isSkuTokenExpired()) { + this._createSkuToken(); + } - if (ARRAY_TYPE != Float32Array) { - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - } + if (tileURL && !isMapboxURL(tileURL)) return tileURL; - out[0] = 1; - out[5] = 1; - out[10] = 1; - out[15] = 1; - return out; -} -/** - * Creates a new mat4 initialized with values from an existing matrix - * - * @param {ReadonlyMat4} a matrix to clone - * @returns {mat4} a new 4x4 matrix - */ + const urlObject = parseUrl(tileURL); + const imageExtensionRe = /(\.(png|jpg)\d*)(?=$)/; + const extension = exported.supported ? '.webp' : '$1'; -function clone$3(a) { - var out = new ARRAY_TYPE(16); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - 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]; - return out; + // The v4 mapbox tile API supports 512x512 image tiles but they must be requested as '@2x' tiles. + const use2xAs512 = rasterTileSize && urlObject.authority !== 'raster' && rasterTileSize === 512; + + const suffix = use2x || use2xAs512 ? '@2x' : ''; + urlObject.path = urlObject.path.replace(imageExtensionRe, `${suffix}${extension}`); + + if (urlObject.authority === 'raster') { + urlObject.path = `/${config.RASTER_URL_PREFIX}${urlObject.path}`; + } else { + const tileURLAPIPrefixRe = /^.+\/v4\//; + urlObject.path = urlObject.path.replace(tileURLAPIPrefixRe, '/'); + urlObject.path = `/${config.TILE_URL_VERSION}${urlObject.path}`; + } + + const accessToken = this._customAccessToken || getAccessToken(urlObject.params) || config.ACCESS_TOKEN; + if (config.REQUIRE_ACCESS_TOKEN && accessToken && this._skuToken) { + urlObject.params.push(`sku=${this._skuToken}`); + } + + return this._makeAPIURL(urlObject, accessToken); + } + + canonicalizeTileURL(url , removeAccessToken ) { + // matches any file extension specified by a dot and one or more alphanumeric characters + const extensionRe = /\.[\w]+$/; + + const urlObject = parseUrl(url); + // Make sure that we are dealing with a valid Mapbox tile URL. + // Has to begin with /v4/ or /raster/v1, with a valid filename + extension + if (!urlObject.path.match(/^(\/v4\/|\/raster\/v1\/)/) || !urlObject.path.match(extensionRe)) { + // Not a proper Mapbox tile URL. + return url; + } + // Reassemble the canonical URL from the parts we've parsed before. + let result = "mapbox://"; + if (urlObject.path.match(/^\/raster\/v1\//)) { + // If the tile url has /raster/v1/, make the final URL mapbox://raster/.... + const rasterPrefix = `/${config.RASTER_URL_PREFIX}/`; + result += `raster/${urlObject.path.replace(rasterPrefix, '')}`; + } else { + const tilesPrefix = `/${config.TILE_URL_VERSION}/`; + result += `tiles/${urlObject.path.replace(tilesPrefix, '')}`; + } + + // Append the query string, minus the access token parameter. + let params = urlObject.params; + if (removeAccessToken) { + params = params.filter(p => !p.match(/^access_token=/)); + } + if (params.length) result += `?${params.join('&')}`; + return result; + } + + canonicalizeTileset(tileJSON , sourceURL ) { + const removeAccessToken = sourceURL ? isMapboxURL(sourceURL) : false; + const canonical = []; + for (const url of tileJSON.tiles || []) { + if (isMapboxHTTPURL(url)) { + canonical.push(this.canonicalizeTileURL(url, removeAccessToken)); + } else { + canonical.push(url); + } + } + return canonical; + } + + _makeAPIURL(urlObject , accessToken ) { + const help = 'See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes'; + const apiUrlObject = parseUrl(config.API_URL); + urlObject.protocol = apiUrlObject.protocol; + urlObject.authority = apiUrlObject.authority; + + if (urlObject.protocol === 'http') { + const i = urlObject.params.indexOf('secure'); + if (i >= 0) urlObject.params.splice(i, 1); + } + + if (apiUrlObject.path !== '/') { + urlObject.path = `${apiUrlObject.path}${urlObject.path}`; + } + + if (!config.REQUIRE_ACCESS_TOKEN) return formatUrl(urlObject); + + accessToken = accessToken || config.ACCESS_TOKEN; + if (!this._silenceAuthErrors) { + 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 = urlObject.params.filter((d) => d.indexOf('access_token') === -1); + urlObject.params.push(`access_token=${accessToken || ''}`); + return formatUrl(urlObject); + } } -/** - * Copy the values from one mat4 to another - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the source matrix - * @returns {mat4} out - */ -function copy$3(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - 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]; - return out; +function isMapboxURL(url ) { + return url.indexOf('mapbox:') === 0; } -/** - * Create a new mat4 with the given values - * - * @param {Number} m00 Component in column 0, row 0 position (index 0) - * @param {Number} m01 Component in column 0, row 1 position (index 1) - * @param {Number} m02 Component in column 0, row 2 position (index 2) - * @param {Number} m03 Component in column 0, row 3 position (index 3) - * @param {Number} m10 Component in column 1, row 0 position (index 4) - * @param {Number} m11 Component in column 1, row 1 position (index 5) - * @param {Number} m12 Component in column 1, row 2 position (index 6) - * @param {Number} m13 Component in column 1, row 3 position (index 7) - * @param {Number} m20 Component in column 2, row 0 position (index 8) - * @param {Number} m21 Component in column 2, row 1 position (index 9) - * @param {Number} m22 Component in column 2, row 2 position (index 10) - * @param {Number} m23 Component in column 2, row 3 position (index 11) - * @param {Number} m30 Component in column 3, row 0 position (index 12) - * @param {Number} m31 Component in column 3, row 1 position (index 13) - * @param {Number} m32 Component in column 3, row 2 position (index 14) - * @param {Number} m33 Component in column 3, row 3 position (index 15) - * @returns {mat4} A new mat4 - */ -function fromValues$3(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { - var out = new ARRAY_TYPE(16); - out[0] = m00; - out[1] = m01; - out[2] = m02; - out[3] = m03; - out[4] = m10; - out[5] = m11; - out[6] = m12; - out[7] = m13; - out[8] = m20; - out[9] = m21; - out[10] = m22; - out[11] = m23; - out[12] = m30; - out[13] = m31; - out[14] = m32; - out[15] = m33; - return out; +function isMapboxHTTPURL(url ) { + return config.API_URL_REGEX.test(url); } -/** - * Set the components of a mat4 to the given values - * - * @param {mat4} out the receiving matrix - * @param {Number} m00 Component in column 0, row 0 position (index 0) - * @param {Number} m01 Component in column 0, row 1 position (index 1) - * @param {Number} m02 Component in column 0, row 2 position (index 2) - * @param {Number} m03 Component in column 0, row 3 position (index 3) - * @param {Number} m10 Component in column 1, row 0 position (index 4) - * @param {Number} m11 Component in column 1, row 1 position (index 5) - * @param {Number} m12 Component in column 1, row 2 position (index 6) - * @param {Number} m13 Component in column 1, row 3 position (index 7) - * @param {Number} m20 Component in column 2, row 0 position (index 8) - * @param {Number} m21 Component in column 2, row 1 position (index 9) - * @param {Number} m22 Component in column 2, row 2 position (index 10) - * @param {Number} m23 Component in column 2, row 3 position (index 11) - * @param {Number} m30 Component in column 3, row 0 position (index 12) - * @param {Number} m31 Component in column 3, row 1 position (index 13) - * @param {Number} m32 Component in column 3, row 2 position (index 14) - * @param {Number} m33 Component in column 3, row 3 position (index 15) - * @returns {mat4} out - */ -function set$3(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { - out[0] = m00; - out[1] = m01; - out[2] = m02; - out[3] = m03; - out[4] = m10; - out[5] = m11; - out[6] = m12; - out[7] = m13; - out[8] = m20; - out[9] = m21; - out[10] = m22; - out[11] = m23; - out[12] = m30; - out[13] = m31; - out[14] = m32; - out[15] = m33; - return out; +function hasCacheDefeatingSku(url ) { + return url.indexOf('sku=') > 0 && isMapboxHTTPURL(url); } -/** - * Set a mat4 to the identity matrix - * - * @param {mat4} out the receiving matrix - * @returns {mat4} out - */ -function identity$3(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 getAccessToken(params ) { + for (const param of params) { + const match = param.match(/^access_token=(.*)$/); + if (match) { + return match[1]; + } + } + return null; } -/** - * Transpose the values of a mat4 - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the source matrix - * @returns {mat4} out - */ -function transpose$2(out, a) { - // If we are transposing ourselves we can skip a few steps but have to cache some values - if (out === a) { - var a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a12 = a[6], - a13 = a[7]; - var a23 = a[11]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a01; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a02; - out[9] = a12; - out[11] = a[14]; - out[12] = a03; - out[13] = a13; - out[14] = a23; - } else { - out[0] = a[0]; - out[1] = a[4]; - out[2] = a[8]; - out[3] = a[12]; - out[4] = a[1]; - out[5] = a[5]; - out[6] = a[9]; - out[7] = a[13]; - out[8] = a[2]; - out[9] = a[6]; - out[10] = a[10]; - out[11] = a[14]; - out[12] = a[3]; - out[13] = a[7]; - out[14] = a[11]; - out[15] = a[15]; - } +const urlRe = /^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/; - return out; +function parseUrl(url ) { + const 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('&') : [] + }; } -/** - * Inverts a mat4 - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the source matrix - * @returns {mat4} out - */ -function invert$3(out, a) { - var a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7]; - var a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - var a30 = a[12], - a31 = a[13], - a32 = a[14], - a33 = a[15]; - var b00 = a00 * a11 - a01 * a10; - var b01 = a00 * a12 - a02 * a10; - var b02 = a00 * a13 - a03 * a10; - var b03 = a01 * a12 - a02 * a11; - var b04 = a01 * a13 - a03 * a11; - var b05 = a02 * a13 - a03 * a12; - var b06 = a20 * a31 - a21 * a30; - var b07 = a20 * a32 - a22 * a30; - var b08 = a20 * a33 - a23 * a30; - var b09 = a21 * a32 - a22 * a31; - var b10 = a21 * a33 - a23 * a31; - var b11 = a22 * a33 - a23 * a32; // Calculate the determinant +function formatUrl(obj ) { + const params = obj.params.length ? `?${obj.params.join('&')}` : ''; + return `${obj.protocol}://${obj.authority}${obj.path}${params}`; +} - var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; +const telemEventKey = 'mapbox.eventData'; - if (!det) { - return null; - } +function parseAccessToken(accessToken ) { + if (!accessToken) { + 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; -} -/** - * Calculates the adjugate of a mat4 - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the source matrix - * @returns {mat4} out - */ + const parts = accessToken.split('.'); + if (!parts || parts.length !== 3) { + return null; + } -function adjoint$2(out, a) { - var a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7]; - var a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - var a30 = a[12], - a31 = a[13], - a32 = a[14], - a33 = a[15]; - out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22); - out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); - out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12); - out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); - out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); - out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22); - out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); - out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12); - out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21); - out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); - out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11); - out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); - out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); - out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21); - out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); - out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11); - return out; + try { + const jsonData = JSON.parse(b64DecodeUnicode(parts[1])); + return jsonData; + } catch (e) { + return null; + } } -/** - * Calculates the determinant of a mat4 - * - * @param {ReadonlyMat4} a the source matrix - * @returns {Number} determinant of a - */ -function determinant$3(a) { - var a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7]; - var a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - var a30 = a[12], - a31 = a[13], - a32 = a[14], - a33 = a[15]; - var b00 = a00 * a11 - a01 * a10; - var b01 = a00 * a12 - a02 * a10; - var b02 = a00 * a13 - a03 * a10; - var b03 = a01 * a12 - a02 * a11; - var b04 = a01 * a13 - a03 * a11; - var b05 = a02 * a13 - a03 * a12; - var b06 = a20 * a31 - a21 * a30; - var b07 = a20 * a32 - a22 * a30; - var b08 = a20 * a33 - a23 * a30; - var b09 = a21 * a32 - a22 * a31; - var b10 = a21 * a33 - a23 * a31; - var b11 = a22 * a33 - a23 * a32; // Calculate the determinant + - return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; -} -/** - * Multiplies two mat4s - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the first operand - * @param {ReadonlyMat4} b the second operand - * @returns {mat4} out - */ +class TelemetryEvent { + + + + + + -function multiply$3(out, a, b) { - var a00 = a[0], - a01 = a[1], - a02 = a[2], - a03 = a[3]; - var a10 = a[4], - a11 = a[5], - a12 = a[6], - a13 = a[7]; - var a20 = a[8], - a21 = a[9], - a22 = a[10], - a23 = a[11]; - var a30 = a[12], - a31 = a[13], - a32 = a[14], - a33 = a[15]; // Cache only the current line of the second matrix + constructor(type ) { + this.type = type; + this.anonId = null; + this.eventData = {}; + this.queue = []; + this.pendingRequest = null; + } - 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; -} -/** - * Translate a mat4 by the given vector - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to translate - * @param {ReadonlyVec3} v vector to translate by - * @returns {mat4} out - */ + getStorageKey(domain ) { + const tokenData = parseAccessToken(config.ACCESS_TOKEN); + let u = ''; + if (tokenData && tokenData['u']) { + u = b64EncodeUnicode(tokenData['u']); + } else { + u = config.ACCESS_TOKEN || ''; + } + return domain ? + `${telemEventKey}.${domain}:${u}` : + `${telemEventKey}:${u}`; + } -function translate$2(out, a, v) { - var x = v[0], - y = v[1], - z = v[2]; - var a00, a01, a02, a03; - var a10, a11, a12, a13; - var a20, a21, a22, a23; + fetchEventData() { + const isLocalStorageAvailable = storageAvailable('localStorage'); + const storageKey = this.getStorageKey(); + const uuidKey = this.getStorageKey('uuid'); - 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]; - } + if (isLocalStorageAvailable) { + //Retrieve cached data + try { + const data = window$1.localStorage.getItem(storageKey); + if (data) { + this.eventData = JSON.parse(data); + } - return out; -} -/** - * Scales the mat4 by the dimensions in the given vec3 not using vectorization - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to scale - * @param {ReadonlyVec3} v the vec3 to scale the matrix by - * @returns {mat4} out - **/ + const uuid = window$1.localStorage.getItem(uuidKey); + if (uuid) this.anonId = uuid; + } catch (e) { + warnOnce('Unable to read from LocalStorage'); + } + } + } -function scale$3(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; -} -/** - * Rotates a mat4 by the given angle around the given axis - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @param {ReadonlyVec3} axis the axis to rotate around - * @returns {mat4} out - */ + saveEventData() { + const isLocalStorageAvailable = storageAvailable('localStorage'); + const storageKey = this.getStorageKey(); + const uuidKey = this.getStorageKey('uuid'); + if (isLocalStorageAvailable) { + try { + window$1.localStorage.setItem(uuidKey, this.anonId); + if (Object.keys(this.eventData).length >= 1) { + window$1.localStorage.setItem(storageKey, JSON.stringify(this.eventData)); + } + } catch (e) { + warnOnce('Unable to write to LocalStorage'); + } + } -function rotate$3(out, a, rad, axis) { - var x = axis[0], - y = axis[1], - z = axis[2]; - var len = Math.hypot(x, y, z); - var s, c, t; - var a00, a01, a02, a03; - var a10, a11, a12, a13; - var a20, a21, a22, a23; - var b00, b01, b02; - var b10, b11, b12; - var b20, b21, b22; + } - if (len < EPSILON) { - return null; - } + processRequests(_ ) {} - len = 1 / len; - x *= len; - y *= len; - z *= len; - s = Math.sin(rad); - c = Math.cos(rad); - t = 1 - c; - 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]; // Construct the elements of the rotation matrix + /* + * If any event data should be persisted after the POST request, the callback should modify eventData` + * to the values that should be saved. For this reason, the callback should be invoked prior to the call + * to TelemetryEvent#saveData + */ + postEvent(timestamp , additionalPayload , callback , customAccessToken ) { + if (!config.EVENTS_URL) return; + const eventsUrlObject = parseUrl(config.EVENTS_URL); + eventsUrlObject.params.push(`access_token=${customAccessToken || config.ACCESS_TOKEN || ''}`); - b00 = x * x * t + c; - b01 = y * x * t + z * s; - b02 = z * x * t - y * s; - b10 = x * y * t - z * s; - b11 = y * y * t + c; - b12 = z * y * t + x * s; - b20 = x * z * t + y * s; - b21 = y * z * t - x * s; - b22 = z * z * t + c; // Perform rotation-specific matrix multiplication + const payload = { + event: this.type, + created: new Date(timestamp).toISOString(), + sdkIdentifier: 'mapbox-gl-js', + sdkVersion: version, + skuId: SKU_ID, + userId: this.anonId + }; - out[0] = a00 * b00 + a10 * b01 + a20 * b02; - out[1] = a01 * b00 + a11 * b01 + a21 * b02; - out[2] = a02 * b00 + a12 * b01 + a22 * b02; - out[3] = a03 * b00 + a13 * b01 + a23 * b02; - out[4] = a00 * b10 + a10 * b11 + a20 * b12; - out[5] = a01 * b10 + a11 * b11 + a21 * b12; - out[6] = a02 * b10 + a12 * b11 + a22 * b12; - out[7] = a03 * b10 + a13 * b11 + a23 * b12; - out[8] = a00 * b20 + a10 * b21 + a20 * b22; - out[9] = a01 * b20 + a11 * b21 + a21 * b22; - out[10] = a02 * b20 + a12 * b21 + a22 * b22; - out[11] = a03 * b20 + a13 * b21 + a23 * b22; + const finalPayload = additionalPayload ? extend$1(payload, additionalPayload) : payload; + const request = { + url: formatUrl(eventsUrlObject), + headers: { + 'Content-Type': 'text/plain' //Skip the pre-flight OPTIONS request + }, + body: JSON.stringify([finalPayload]) + }; - if (a !== out) { - // If the source and destination differ, copy the unchanged last row - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } + this.pendingRequest = postData(request, (error) => { + this.pendingRequest = null; + callback(error); + this.saveEventData(); + this.processRequests(customAccessToken); + }); + } - return out; + queueRequest(event , customAccessToken ) { + this.queue.push(event); + this.processRequests(customAccessToken); + } } -/** - * Rotates a matrix by the given angle around the X axis - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -function rotateX(out, a, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); - var a10 = a[4]; - var a11 = a[5]; - var a12 = a[6]; - var a13 = a[7]; - var a20 = a[8]; - var a21 = a[9]; - var a22 = a[10]; - var a23 = a[11]; +class MapLoadEvent extends TelemetryEvent { + + + - if (a !== out) { - // If the source and destination differ, copy the unchanged rows - 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]; - } // Perform axis-specific matrix multiplication + constructor() { + super('map.load'); + this.success = {}; + this.skuToken = ''; + } + postMapLoadEvent(mapId , skuToken , customAccessToken , callback ) { + this.skuToken = skuToken; + this.errorCb = callback; - 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; -} -/** - * Rotates a matrix by the given angle around the Y axis - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ + if (config.EVENTS_URL) { + if (customAccessToken || config.ACCESS_TOKEN) { + this.queueRequest({id: mapId, timestamp: Date.now()}, customAccessToken); + } else { + this.errorCb(new Error(AUTH_ERR_MSG)); + } + } + } -function rotateY(out, a, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); - var a00 = a[0]; - var a01 = a[1]; - var a02 = a[2]; - var a03 = a[3]; - var a20 = a[8]; - var a21 = a[9]; - var a22 = a[10]; - var a23 = a[11]; + processRequests(customAccessToken ) { + if (this.pendingRequest || this.queue.length === 0) return; + const {id, timestamp} = this.queue.shift(); - if (a !== out) { - // If the source and destination differ, copy the unchanged rows - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - out[12] = a[12]; - out[13] = a[13]; - out[14] = a[14]; - out[15] = a[15]; - } // Perform axis-specific matrix multiplication + // Only one load event should fire per map + if (id && this.success[id]) return; + if (!this.anonId) { + this.fetchEventData(); + } - out[0] = a00 * c - a20 * s; - out[1] = a01 * c - a21 * s; - out[2] = a02 * c - a22 * s; - out[3] = a03 * c - a23 * s; - out[8] = a00 * s + a20 * c; - out[9] = a01 * s + a21 * c; - out[10] = a02 * s + a22 * c; - out[11] = a03 * s + a23 * c; - return out; + if (!validateUuid(this.anonId)) { + this.anonId = uuid(); + } + + this.postEvent(timestamp, {skuToken: this.skuToken}, (err) => { + if (err) { + this.errorCb(err); + } else { + if (id) this.success[id] = true; + } + + }, customAccessToken); + } } -/** - * Rotates a matrix by the given angle around the Z axis - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to rotate - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -function rotateZ(out, a, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); - var a00 = a[0]; - var a01 = a[1]; - var a02 = a[2]; - var a03 = a[3]; - var a10 = a[4]; - var a11 = a[5]; - var a12 = a[6]; - var a13 = a[7]; +class MapSessionAPI extends TelemetryEvent { + + + - if (a !== out) { - // If the source and destination differ, copy the unchanged last row - 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]; - } // Perform axis-specific matrix multiplication + constructor() { + super('map.auth'); + this.success = {}; + this.skuToken = ''; + } + getSession(timestamp , token , callback , customAccessToken ) { + if (!config.API_URL || !config.SESSION_PATH) return; + const authUrlObject = parseUrl(config.API_URL + config.SESSION_PATH); + authUrlObject.params.push(`sku=${token || ''}`); + authUrlObject.params.push(`access_token=${customAccessToken || config.ACCESS_TOKEN || ''}`); - 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; -} -/** - * Creates a matrix from a vector translation - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, dest, vec); - * - * @param {mat4} out mat4 receiving operation result - * @param {ReadonlyVec3} v Translation vector - * @returns {mat4} out - */ + const request = { + url: formatUrl(authUrlObject), + headers: { + 'Content-Type': 'text/plain', //Skip the pre-flight OPTIONS request + } + }; -function fromTranslation$2(out, v) { - 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] = v[0]; - out[13] = v[1]; - out[14] = v[2]; - out[15] = 1; - return out; -} -/** - * Creates a matrix from a vector scaling - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.scale(dest, dest, vec); - * - * @param {mat4} out mat4 receiving operation result - * @param {ReadonlyVec3} v Scaling vector - * @returns {mat4} out - */ + this.pendingRequest = getData(request, (error) => { + this.pendingRequest = null; + callback(error); + this.saveEventData(); + this.processRequests(customAccessToken); + }); + } -function fromScaling$3(out, v) { - out[0] = v[0]; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = v[1]; - out[6] = 0; - out[7] = 0; - out[8] = 0; - out[9] = 0; - out[10] = v[2]; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; + getSessionAPI(mapId , skuToken , customAccessToken , callback ) { + this.skuToken = skuToken; + this.errorCb = callback; + + if (config.SESSION_PATH && config.API_URL) { + if (customAccessToken || config.ACCESS_TOKEN) { + this.queueRequest({id: mapId, timestamp: Date.now()}, customAccessToken); + } else { + this.errorCb(new Error(AUTH_ERR_MSG)); + } + } + } + + processRequests(customAccessToken ) { + if (this.pendingRequest || this.queue.length === 0) return; + const {id, timestamp} = this.queue.shift(); + + // Only one load event should fire per map + if (id && this.success[id]) return; + + this.getSession(timestamp, this.skuToken, (err) => { + if (err) { + this.errorCb(err); + } else { + if (id) this.success[id] = true; + } + }, customAccessToken); + } } -/** - * Creates a matrix from a given angle around a given axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotate(dest, dest, rad, axis); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @param {ReadonlyVec3} axis the axis to rotate around - * @returns {mat4} out - */ -function fromRotation$3(out, rad, axis) { - var x = axis[0], - y = axis[1], - z = axis[2]; - var len = Math.hypot(x, y, z); - var s, c, t; +class TurnstileEvent extends TelemetryEvent { + constructor(customAccessToken ) { + super('appUserTurnstile'); + this._customAccessToken = customAccessToken; + } - if (len < EPSILON) { - return null; - } + postTurnstileEvent(tileUrls , customAccessToken ) { + //Enabled only when Mapbox Access Token is set and a source uses + // mapbox tiles. + if (config.EVENTS_URL && + config.ACCESS_TOKEN && + Array.isArray(tileUrls) && + tileUrls.some(url => isMapboxURL(url) || isMapboxHTTPURL(url))) { + this.queueRequest(Date.now(), customAccessToken); + } + } - len = 1 / len; - x *= len; - y *= len; - z *= len; - s = Math.sin(rad); - c = Math.cos(rad); - t = 1 - c; // Perform rotation-specific matrix multiplication + processRequests(customAccessToken ) { + if (this.pendingRequest || this.queue.length === 0) { + return; + } - out[0] = x * x * t + c; - out[1] = y * x * t + z * s; - out[2] = z * x * t - y * s; - out[3] = 0; - out[4] = x * y * t - z * s; - out[5] = y * y * t + c; - out[6] = z * y * t + x * s; - out[7] = 0; - out[8] = x * z * t + y * s; - out[9] = y * z * t - x * s; - out[10] = z * z * t + c; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; + if (!this.anonId || !this.eventData.lastSuccess || !this.eventData.tokenU) { + //Retrieve cached data + this.fetchEventData(); + } + + const tokenData = parseAccessToken(config.ACCESS_TOKEN); + const tokenU = tokenData ? tokenData['u'] : config.ACCESS_TOKEN; + //Reset event data cache if the access token owner changed. + let dueForEvent = tokenU !== this.eventData.tokenU; + + if (!validateUuid(this.anonId)) { + this.anonId = uuid(); + dueForEvent = true; + } + + const nextUpdate = this.queue.shift(); + // Record turnstile event once per calendar day. + if (this.eventData.lastSuccess) { + const lastUpdate = new Date(this.eventData.lastSuccess); + const nextDate = new Date(nextUpdate); + const daysElapsed = (nextUpdate - this.eventData.lastSuccess) / (24 * 60 * 60 * 1000); + dueForEvent = dueForEvent || daysElapsed >= 1 || daysElapsed < -1 || lastUpdate.getDate() !== nextDate.getDate(); + } else { + dueForEvent = true; + } + + if (!dueForEvent) { + this.processRequests(); + return; + } + + this.postEvent(nextUpdate, {"enabled.telemetry": false}, (err) => { + if (!err) { + this.eventData.lastSuccess = nextUpdate; + this.eventData.tokenU = tokenU; + } + }, customAccessToken); + } } -/** - * Creates a matrix from the given angle around the X axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotateX(dest, dest, rad); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -function fromXRotation(out, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); // Perform axis-specific matrix multiplication +const turnstileEvent_ = new TurnstileEvent(); +const postTurnstileEvent = turnstileEvent_.postTurnstileEvent.bind(turnstileEvent_); - out[0] = 1; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = c; - out[6] = s; - out[7] = 0; - out[8] = 0; - out[9] = -s; - out[10] = c; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; +const mapLoadEvent_ = new MapLoadEvent(); +const postMapLoadEvent = mapLoadEvent_.postMapLoadEvent.bind(mapLoadEvent_); + +const mapSessionAPI_ = new MapSessionAPI(); +const getMapSessionAPI = mapSessionAPI_.getSessionAPI.bind(mapSessionAPI_); + +const authenticatedMaps = new Set(); +function storeAuthState(gl , state ) { + if (state) { + authenticatedMaps.add(gl); + } else { + authenticatedMaps.delete(gl); + } } -/** - * Creates a matrix from the given angle around the Y axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotateY(dest, dest, rad); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -function fromYRotation(out, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); // Perform axis-specific matrix multiplication +function isMapAuthenticated(gl ) { + return authenticatedMaps.has(gl); +} - out[0] = c; - out[1] = 0; - out[2] = -s; - out[3] = 0; - out[4] = 0; - out[5] = 1; - out[6] = 0; - out[7] = 0; - out[8] = s; - out[9] = 0; - out[10] = c; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; +function removeAuthState(gl ) { + authenticatedMaps.delete(gl); } -/** - * Creates a matrix from the given angle around the Z axis - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.rotateZ(dest, dest, rad); - * - * @param {mat4} out mat4 receiving operation result - * @param {Number} rad the angle to rotate the matrix by - * @returns {mat4} out - */ -function fromZRotation(out, rad) { - var s = Math.sin(rad); - var c = Math.cos(rad); // Perform axis-specific matrix multiplication +/***** END WARNING - REMOVAL OR MODIFICATION OF THE +PRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ******/ - out[0] = c; - out[1] = s; - out[2] = 0; - out[3] = 0; - out[4] = -s; - out[5] = c; - 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; +// + + + +const CACHE_NAME = 'mapbox-tiles'; +let cacheLimit = 500; // 50MB / (100KB/tile) ~= 500 tiles +let cacheCheckThreshold = 50; + +const MIN_TIME_UNTIL_EXPIRY = 1000 * 60 * 7; // 7 minutes. Skip caching tiles with a short enough max age. + + + + + + + +// We're using a global shared cache object. Normally, requesting ad-hoc Cache objects is fine, but +// Safari has a memory leak in which it fails to release memory when requesting keys() from a Cache +// object. See https://bugs.webkit.org/show_bug.cgi?id=203991 for more information. +let sharedCaches = {}; + +function getCacheName(url ) { + const queryParams = getQueryParameters(url); + let language; + let worldview; + + if (queryParams) { + queryParams.forEach(param => { + const entry = param.split('='); + if (entry[0] === 'language') { + language = entry[1]; + } else if (entry[0] === 'worldview') { + worldview = entry[1]; + } + }); + } + + let cacheName = CACHE_NAME; + if (language) cacheName += `-${language}`; + if (worldview) cacheName += `-${worldview}`; + return cacheName; } -/** - * Creates a matrix from a quaternion rotation and vector translation - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, vec); - * let quatMat = mat4.create(); - * quat4.toMat4(quat, quatMat); - * mat4.multiply(dest, quatMat); - * - * @param {mat4} out mat4 receiving operation result - * @param {quat4} q Rotation quaternion - * @param {ReadonlyVec3} v Translation vector - * @returns {mat4} out - */ -function fromRotationTranslation(out, q, v) { - // Quaternion math - var x = q[0], - y = q[1], - z = q[2], - w = q[3]; - var x2 = x + x; - var y2 = y + y; - var z2 = z + z; - var xx = x * x2; - var xy = x * y2; - var xz = x * z2; - var yy = y * y2; - var yz = y * z2; - var zz = z * z2; - var wx = w * x2; - var wy = w * y2; - var wz = w * z2; - out[0] = 1 - (yy + zz); - out[1] = xy + wz; - out[2] = xz - wy; - out[3] = 0; - out[4] = xy - wz; - out[5] = 1 - (xx + zz); - out[6] = yz + wx; - out[7] = 0; - out[8] = xz + wy; - out[9] = yz - wx; - out[10] = 1 - (xx + yy); - out[11] = 0; - out[12] = v[0]; - out[13] = v[1]; - out[14] = v[2]; - out[15] = 1; - return out; +function cacheOpen(cacheName ) { + if (window$1.caches && !sharedCaches[cacheName]) { + sharedCaches[cacheName] = window$1.caches.open(cacheName); + } } -/** - * Creates a new mat4 from a dual quat. - * - * @param {mat4} out Matrix - * @param {ReadonlyQuat2} a Dual Quaternion - * @returns {mat4} mat4 receiving operation result - */ -function fromQuat2(out, a) { - var translation = new ARRAY_TYPE(3); - var bx = -a[0], - by = -a[1], - bz = -a[2], - bw = a[3], - ax = a[4], - ay = a[5], - az = a[6], - aw = a[7]; - var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense +// We're never closing the cache, but our unit tests rely on changing out the global window.caches +// object, so we have a function specifically for unit tests that allows resetting the shared cache. +function cacheClose() { + sharedCaches = {}; +} - if (magnitude > 0) { - translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude; - translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude; - translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude; - } else { - translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; - translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; - translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; - } +let responseConstructorSupportsReadableStream; +function prepareBody(response , callback) { + if (responseConstructorSupportsReadableStream === undefined) { + try { + new Response(new ReadableStream()); // eslint-disable-line no-undef + responseConstructorSupportsReadableStream = true; + } catch (e) { + // Edge + responseConstructorSupportsReadableStream = false; + } + } - fromRotationTranslation(out, a, translation); - return out; + if (responseConstructorSupportsReadableStream) { + callback(response.body); + } else { + response.blob().then(callback); + } } -/** - * Returns the translation vector component of a transformation - * matrix. If a matrix is built with fromRotationTranslation, - * the returned vector will be the same as the translation vector - * originally supplied. - * @param {vec3} out Vector to receive translation component - * @param {ReadonlyMat4} mat Matrix to be decomposed (input) - * @return {vec3} out - */ -function getTranslation(out, mat) { - out[0] = mat[12]; - out[1] = mat[13]; - out[2] = mat[14]; - return out; +function cachePut(request , response , requestTime ) { + const cacheName = getCacheName(request.url); + cacheOpen(cacheName); + if (!sharedCaches[cacheName]) return; + + const options = { + status: response.status, + statusText: response.statusText, + headers: new window$1.Headers() + }; + response.headers.forEach((v, k) => options.headers.set(k, v)); + + const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || ''); + if (cacheControl['no-store']) { + return; + } + if (cacheControl['max-age']) { + options.headers.set('Expires', new Date(requestTime + cacheControl['max-age'] * 1000).toUTCString()); + } + + const expires = options.headers.get('Expires'); + if (!expires) return; + const timeUntilExpiry = new Date(expires).getTime() - requestTime; + if (timeUntilExpiry < MIN_TIME_UNTIL_EXPIRY) return; + + prepareBody(response, body => { + const clonedResponse = new window$1.Response(body, options); + + cacheOpen(cacheName); + if (!sharedCaches[cacheName]) return; + sharedCaches[cacheName] + .then(cache => cache.put(stripQueryParameters(request.url), clonedResponse)) + .catch(e => warnOnce(e.message)); + }); } -/** - * Returns the scaling factor component of a transformation - * matrix. If a matrix is built with fromRotationTranslationScale - * with a normalized Quaternion paramter, the returned vector will be - * the same as the scaling vector - * originally supplied. - * @param {vec3} out Vector to receive scaling factor component - * @param {ReadonlyMat4} mat Matrix to be decomposed (input) - * @return {vec3} out - */ -function getScaling(out, mat) { - var m11 = mat[0]; - var m12 = mat[1]; - var m13 = mat[2]; - var m21 = mat[4]; - var m22 = mat[5]; - var m23 = mat[6]; - var m31 = mat[8]; - var m32 = mat[9]; - var m33 = mat[10]; - out[0] = Math.hypot(m11, m12, m13); - out[1] = Math.hypot(m21, m22, m23); - out[2] = Math.hypot(m31, m32, m33); - return out; +function getQueryParameters(url ) { + const paramStart = url.indexOf('?'); + return paramStart > 0 ? url.slice(paramStart + 1).split('&') : []; } -/** - * Returns a quaternion representing the rotational component - * of a transformation matrix. If a matrix is built with - * fromRotationTranslation, the returned quaternion will be the - * same as the quaternion originally supplied. - * @param {quat} out Quaternion to receive the rotation component - * @param {ReadonlyMat4} mat Matrix to be decomposed (input) - * @return {quat} out - */ -function getRotation(out, mat) { - var scaling = new ARRAY_TYPE(3); - getScaling(scaling, mat); - var is1 = 1 / scaling[0]; - var is2 = 1 / scaling[1]; - var is3 = 1 / scaling[2]; - var sm11 = mat[0] * is1; - var sm12 = mat[1] * is2; - var sm13 = mat[2] * is3; - var sm21 = mat[4] * is1; - var sm22 = mat[5] * is2; - var sm23 = mat[6] * is3; - var sm31 = mat[8] * is1; - var sm32 = mat[9] * is2; - var sm33 = mat[10] * is3; - var trace = sm11 + sm22 + sm33; - var S = 0; +function stripQueryParameters(url ) { + const start = url.indexOf('?'); - if (trace > 0) { - S = Math.sqrt(trace + 1.0) * 2; - out[3] = 0.25 * S; - out[0] = (sm23 - sm32) / S; - out[1] = (sm31 - sm13) / S; - out[2] = (sm12 - sm21) / S; - } else if (sm11 > sm22 && sm11 > sm33) { - S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2; - out[3] = (sm23 - sm32) / S; - out[0] = 0.25 * S; - out[1] = (sm12 + sm21) / S; - out[2] = (sm31 + sm13) / S; - } else if (sm22 > sm33) { - S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2; - out[3] = (sm31 - sm13) / S; - out[0] = (sm12 + sm21) / S; - out[1] = 0.25 * S; - out[2] = (sm23 + sm32) / S; - } else { - S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2; - out[3] = (sm12 - sm21) / S; - out[0] = (sm31 + sm13) / S; - out[1] = (sm23 + sm32) / S; - out[2] = 0.25 * S; - } + if (start < 0) return url; - return out; -} -/** - * Creates a matrix from a quaternion rotation, vector translation and vector scale - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, vec); - * let quatMat = mat4.create(); - * quat4.toMat4(quat, quatMat); - * mat4.multiply(dest, quatMat); - * mat4.scale(dest, scale) - * - * @param {mat4} out mat4 receiving operation result - * @param {quat4} q Rotation quaternion - * @param {ReadonlyVec3} v Translation vector - * @param {ReadonlyVec3} s Scaling vector - * @returns {mat4} out - */ + const params = getQueryParameters(url); + const filteredParams = params.filter(param => { + const entry = param.split('='); + return entry[0] === 'language' || entry[0] === 'worldview'; + }); -function fromRotationTranslationScale(out, q, v, s) { - // Quaternion math - var x = q[0], - y = q[1], - z = q[2], - w = q[3]; - var x2 = x + x; - var y2 = y + y; - var z2 = z + z; - var xx = x * x2; - var xy = x * y2; - var xz = x * z2; - var yy = y * y2; - var yz = y * z2; - var zz = z * z2; - var wx = w * x2; - var wy = w * y2; - var wz = w * z2; - var sx = s[0]; - var sy = s[1]; - var sz = s[2]; - out[0] = (1 - (yy + zz)) * sx; - out[1] = (xy + wz) * sx; - out[2] = (xz - wy) * sx; - out[3] = 0; - out[4] = (xy - wz) * sy; - out[5] = (1 - (xx + zz)) * sy; - out[6] = (yz + wx) * sy; - out[7] = 0; - out[8] = (xz + wy) * sz; - out[9] = (yz - wx) * sz; - out[10] = (1 - (xx + yy)) * sz; - out[11] = 0; - out[12] = v[0]; - out[13] = v[1]; - out[14] = v[2]; - out[15] = 1; - return out; + if (filteredParams.length) { + return `${url.slice(0, start)}?${filteredParams.join('&')}`; + } + + return url.slice(0, start); } -/** - * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin - * This is equivalent to (but much faster than): - * - * mat4.identity(dest); - * mat4.translate(dest, vec); - * mat4.translate(dest, origin); - * let quatMat = mat4.create(); - * quat4.toMat4(quat, quatMat); - * mat4.multiply(dest, quatMat); - * mat4.scale(dest, scale) - * mat4.translate(dest, negativeOrigin); - * - * @param {mat4} out mat4 receiving operation result - * @param {quat4} q Rotation quaternion - * @param {ReadonlyVec3} v Translation vector - * @param {ReadonlyVec3} s Scaling vector - * @param {ReadonlyVec3} o The origin vector around which to scale and rotate - * @returns {mat4} out - */ -function fromRotationTranslationScaleOrigin(out, q, v, s, o) { - // Quaternion math - var x = q[0], - y = q[1], - z = q[2], - w = q[3]; - var x2 = x + x; - var y2 = y + y; - var z2 = z + z; - var xx = x * x2; - var xy = x * y2; - var xz = x * z2; - var yy = y * y2; - var yz = y * z2; - var zz = z * z2; - var wx = w * x2; - var wy = w * y2; - var wz = w * z2; - var sx = s[0]; - var sy = s[1]; - var sz = s[2]; - var ox = o[0]; - var oy = o[1]; - var oz = o[2]; - var out0 = (1 - (yy + zz)) * sx; - var out1 = (xy + wz) * sx; - var out2 = (xz - wy) * sx; - var out4 = (xy - wz) * sy; - var out5 = (1 - (xx + zz)) * sy; - var out6 = (yz + wx) * sy; - var out8 = (xz + wy) * sz; - var out9 = (yz - wx) * sz; - var out10 = (1 - (xx + yy)) * sz; - out[0] = out0; - out[1] = out1; - out[2] = out2; - out[3] = 0; - out[4] = out4; - out[5] = out5; - out[6] = out6; - out[7] = 0; - out[8] = out8; - out[9] = out9; - out[10] = out10; - out[11] = 0; - out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz); - out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz); - out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz); - out[15] = 1; - return out; +function cacheGet(request , callback ) { + const cacheName = getCacheName(request.url); + cacheOpen(cacheName); + if (!sharedCaches[cacheName]) return callback(null); + + const strippedURL = stripQueryParameters(request.url); + + sharedCaches[cacheName] + .then(cache => { + // manually strip URL instead of `ignoreSearch: true` because of a known + // performance issue in Chrome https://github.com/mapbox/mapbox-gl-js/issues/8431 + cache.match(strippedURL) + .then(response => { + const fresh = isFresh(response); + + // Reinsert into cache so that order of keys in the cache is the order of access. + // This line makes the cache a LRU instead of a FIFO cache. + cache.delete(strippedURL); + if (fresh) { + cache.put(strippedURL, response.clone()); + } + + callback(null, response, fresh); + }) + .catch(callback); + }) + .catch(callback); + } -/** - * Calculates a 4x4 matrix from the given quaternion - * - * @param {mat4} out mat4 receiving operation result - * @param {ReadonlyQuat} q Quaternion to create matrix from - * - * @returns {mat4} out - */ -function fromQuat$1(out, q) { - var x = q[0], - y = q[1], - z = q[2], - w = q[3]; - var x2 = x + x; - var y2 = y + y; - var z2 = z + z; - var xx = x * x2; - var yx = y * x2; - var yy = y * y2; - var zx = z * x2; - var zy = z * y2; - var zz = z * z2; - var wx = w * x2; - var wy = w * y2; - var wz = w * z2; - out[0] = 1 - yy - zz; - out[1] = yx + wz; - out[2] = zx - wy; - out[3] = 0; - out[4] = yx - wz; - out[5] = 1 - xx - zz; - out[6] = zy + wx; - out[7] = 0; - out[8] = zx + wy; - out[9] = zy - wx; - out[10] = 1 - xx - yy; - out[11] = 0; - out[12] = 0; - out[13] = 0; - out[14] = 0; - out[15] = 1; - return out; +function isFresh(response) { + if (!response) return false; + const expires = new Date(response.headers.get('Expires') || 0); + const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || ''); + return expires > Date.now() && !cacheControl['no-cache']; } -/** - * Generates a frustum matrix with the given bounds - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {Number} left Left bound of the frustum - * @param {Number} right Right bound of the frustum - * @param {Number} bottom Bottom bound of the frustum - * @param {Number} top Top bound of the frustum - * @param {Number} near Near bound of the frustum - * @param {Number} far Far bound of the frustum - * @returns {mat4} out - */ -function frustum(out, left, right, bottom, top, near, far) { - var rl = 1 / (right - left); - var tb = 1 / (top - bottom); - var nf = 1 / (near - far); - out[0] = near * 2 * rl; - out[1] = 0; - out[2] = 0; - out[3] = 0; - out[4] = 0; - out[5] = near * 2 * tb; - out[6] = 0; - out[7] = 0; - out[8] = (right + left) * rl; - out[9] = (top + bottom) * tb; - out[10] = (far + near) * nf; - out[11] = -1; - out[12] = 0; - out[13] = 0; - out[14] = far * near * 2 * nf; - out[15] = 0; - return out; +// `Infinity` triggers a cache check after the first tile is loaded +// so that a check is run at least once on each page load. +let globalEntryCounter = Infinity; + +// The cache check gets run on a worker. The reason for this is that +// profiling sometimes shows this as taking up significant time on the +// thread it gets called from. And sometimes it doesn't. It *may* be +// fine to run this on the main thread but out of caution this is being +// dispatched on a worker. This can be investigated further in the future. +function cacheEntryPossiblyAdded(dispatcher ) { + globalEntryCounter++; + if (globalEntryCounter > cacheCheckThreshold) { + dispatcher.getActor().send('enforceCacheSizeLimit', cacheLimit); + globalEntryCounter = 0; + } } -/** - * Generates a perspective projection matrix with the given bounds. - * Passing null/undefined/no value for far will generate infinite projection matrix. - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {number} fovy Vertical field of view in radians - * @param {number} aspect Aspect ratio. typically viewport width/height - * @param {number} near Near bound of the frustum - * @param {number} far Far bound of the frustum, can be null or Infinity - * @returns {mat4} out - */ -function perspective(out, fovy, aspect, near, far) { - var f = 1.0 / Math.tan(fovy / 2), - nf; - 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[11] = -1; - out[12] = 0; - out[13] = 0; - out[15] = 0; +// runs on worker, see above comment +function enforceCacheSizeLimit(limit ) { + for (const sharedCache in sharedCaches) { + cacheOpen(sharedCache); - if (far != null && far !== Infinity) { - nf = 1 / (near - far); - out[10] = (far + near) * nf; - out[14] = 2 * far * near * nf; - } else { - out[10] = -1; - out[14] = -2 * near; - } + sharedCaches[sharedCache].then(cache => { + cache.keys().then(keys => { + for (let i = 0; i < keys.length - limit; i++) { + cache.delete(keys[i]); + } + }); + }); + } +} - return out; +function clearTileCache(callback ) { + const promises = []; + for (const cache in sharedCaches) { + promises.push(window$1.caches.delete(cache)); + delete sharedCaches[cache]; + } + + if (callback) { + Promise.all(promises).catch(callback).then(() => callback()); + } } -/** - * Generates a perspective projection matrix with the given field of view. - * This is primarily useful for generating projection matrices to be used - * with the still experiemental WebVR API. - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees - * @param {number} near Near bound of the frustum - * @param {number} far Far bound of the frustum - * @returns {mat4} out - */ -function perspectiveFromFieldOfView(out, fov, near, far) { - var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0); - var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0); - var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0); - var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0); - var xScale = 2.0 / (leftTan + rightTan); - var yScale = 2.0 / (upTan + downTan); - out[0] = xScale; - out[1] = 0.0; - out[2] = 0.0; - out[3] = 0.0; - out[4] = 0.0; - out[5] = yScale; - out[6] = 0.0; - out[7] = 0.0; - out[8] = -((leftTan - rightTan) * xScale * 0.5); - out[9] = (upTan - downTan) * yScale * 0.5; - out[10] = far / (near - far); - out[11] = -1.0; - out[12] = 0.0; - out[13] = 0.0; - out[14] = far * near / (near - far); - out[15] = 0.0; - return out; +function setCacheLimits(limit , checkThreshold ) { + cacheLimit = limit; + cacheCheckThreshold = checkThreshold; } + +// + + + + /** - * Generates a orthogonal projection matrix with the given bounds - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {number} left Left bound of the frustum - * @param {number} right Right bound of the frustum - * @param {number} bottom Bottom bound of the frustum - * @param {number} top Top bound of the frustum - * @param {number} near Near bound of the frustum - * @param {number} far Far bound of the frustum - * @returns {mat4} out + * The type of a resource. + * @private + * @readonly + * @enum {string} */ +const ResourceType = { + Unknown: 'Unknown', + Style: 'Style', + Source: 'Source', + Tile: 'Tile', + Glyphs: 'Glyphs', + SpriteImage: 'SpriteImage', + SpriteJSON: 'SpriteJSON', + Image: 'Image' +}; -function ortho(out, left, right, bottom, top, near, far) { - var lr = 1 / (left - right); - var bt = 1 / (bottom - top); - var 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; +if (typeof Object.freeze == 'function') { + Object.freeze(ResourceType); } + /** - * Generates a look-at matrix with the given eye position, focal point, and up axis. - * If you want a matrix that actually makes an object look at another object, you should use targetTo instead. + * 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} method Request method `'GET' | 'POST' | 'PUT'`. + * @property {string} body Request body. + * @property {string} type Response body type to be returned `'string' | 'json' | 'arrayBuffer'`. + * @property {string} credentials `'same-origin'|'include'` Use 'include' to send cookies with cross-origin requests. + * @property {boolean} collectResourceTiming If true, Resource Timing API information will be collected for these transformed requests and returned in a resourceTiming property of relevant data events. + * @example + * // use transformRequest to modify requests that begin with `http://myHost` + * const map = new Map({ + * container: 'map', + * style: 'mapbox://styles/mapbox/streets-v11', + * transformRequest: (url, resourceType) => { + * if (resourceType === 'Source' && url.indexOf('http://myHost') > -1) { + * return { + * url: url.replace('http', 'https'), + * headers: {'my-custom-header': true}, + * credentials: 'include' // Include cookies for cross-origin requests + * }; + * } + * } + * }); * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {ReadonlyVec3} eye Position of the viewer - * @param {ReadonlyVec3} center Point the viewer is looking at - * @param {ReadonlyVec3} up vec3 pointing up - * @returns {mat4} out */ + + + + + + + + + -function lookAt(out, eye, center, up) { - var x0, x1, x2, y0, y1, y2, z0, z1, z2, len; - var eyex = eye[0]; - var eyey = eye[1]; - var eyez = eye[2]; - var upx = up[0]; - var upy = up[1]; - var upz = up[2]; - var centerx = center[0]; - var centery = center[1]; - var centerz = center[2]; - - if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) { - return identity$3(out); - } + - z0 = eyex - centerx; - z1 = eyey - centery; - z2 = eyez - centerz; - len = 1 / Math.hypot(z0, z1, z2); - z0 *= len; - z1 *= len; - z2 *= len; - x0 = upy * z2 - upz * z1; - x1 = upz * z0 - upx * z2; - x2 = upx * z1 - upy * z0; - len = Math.hypot(x0, x1, x2); +class AJAXError extends Error { + + + constructor(message , status , url ) { + if (status === 401 && isMapboxHTTPURL(url)) { + message += ': you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes'; + } + super(message); + this.status = status; + this.url = url; + } - if (!len) { - x0 = 0; - x1 = 0; - x2 = 0; - } else { - len = 1 / len; - x0 *= len; - x1 *= len; - x2 *= len; - } + toString() { + return `${this.name}: ${this.message} (${this.status}): ${this.url}`; + } +} - y0 = z1 * x2 - z2 * x1; - y1 = z2 * x0 - z0 * x2; - y2 = z0 * x1 - z1 * x0; - len = Math.hypot(y0, y1, y2); +// Ensure that we're sending the correct referrer from blob URL worker bundles. +// For files loaded from the local file system, `location.origin` will be set +// to the string(!) "null" (Firefox), or "file://" (Chrome, Safari, Edge, IE), +// and we will set an empty referrer. Otherwise, we're using the document's URL. +/* global self */ +const getReferrer = isWorker() ? + () => self.worker && self.worker.referrer : + () => (window$1.location.protocol === 'blob:' ? window$1.parent : window$1).location.href; - if (!len) { - y0 = 0; - y1 = 0; - y2 = 0; - } else { - len = 1 / len; - y0 *= len; - y1 *= len; - y2 *= len; - } +// Determines whether a URL is a file:// URL. This is obviously the case if it begins +// with file://. Relative URLs are also file:// URLs iff the original document was loaded +// via a file:// URL. +const isFileURL = url => /^file:/.test(url) || (/^file:/.test(getReferrer()) && !/^\w+:/.test(url)); - out[0] = x0; - out[1] = y0; - out[2] = z0; - out[3] = 0; - out[4] = x1; - out[5] = y1; - out[6] = z1; - out[7] = 0; - out[8] = x2; - out[9] = y2; - out[10] = z2; - out[11] = 0; - out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); - out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); - out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); - out[15] = 1; - return out; -} -/** - * Generates a matrix that makes something look at something else. - * - * @param {mat4} out mat4 frustum matrix will be written into - * @param {ReadonlyVec3} eye Position of the viewer - * @param {ReadonlyVec3} center Point the viewer is looking at - * @param {ReadonlyVec3} up vec3 pointing up - * @returns {mat4} out - */ +function makeFetchRequest(requestParameters , callback ) { + const controller = new window$1.AbortController(); + const request = new window$1.Request(requestParameters.url, { + method: requestParameters.method || 'GET', + body: requestParameters.body, + credentials: requestParameters.credentials, + headers: requestParameters.headers, + referrer: getReferrer(), + signal: controller.signal + }); + let complete = false; + let aborted = false; -function targetTo(out, eye, target, up) { - var eyex = eye[0], - eyey = eye[1], - eyez = eye[2], - upx = up[0], - upy = up[1], - upz = up[2]; - var z0 = eyex - target[0], - z1 = eyey - target[1], - z2 = eyez - target[2]; - var len = z0 * z0 + z1 * z1 + z2 * z2; + const cacheIgnoringSearch = hasCacheDefeatingSku(request.url); - if (len > 0) { - len = 1 / Math.sqrt(len); - z0 *= len; - z1 *= len; - z2 *= len; - } + if (requestParameters.type === 'json') { + request.headers.set('Accept', 'application/json'); + } - var x0 = upy * z2 - upz * z1, - x1 = upz * z0 - upx * z2, - x2 = upx * z1 - upy * z0; - len = x0 * x0 + x1 * x1 + x2 * x2; + const validateOrFetch = (err, cachedResponse, responseIsFresh) => { + if (aborted) return; - if (len > 0) { - len = 1 / Math.sqrt(len); - x0 *= len; - x1 *= len; - x2 *= len; - } + if (err) { + // Do fetch in case of cache error. + // HTTP pages in Edge trigger a security error that can be ignored. + if (err.message !== 'SecurityError') { + warnOnce(err); + } + } - out[0] = x0; - out[1] = x1; - out[2] = x2; - out[3] = 0; - out[4] = z1 * x2 - z2 * x1; - out[5] = z2 * x0 - z0 * x2; - out[6] = z0 * x1 - z1 * x0; - out[7] = 0; - out[8] = z0; - out[9] = z1; - out[10] = z2; - out[11] = 0; - out[12] = eyex; - out[13] = eyey; - out[14] = eyez; - out[15] = 1; - return out; -} -/** - * Returns a string representation of a mat4 - * - * @param {ReadonlyMat4} a matrix to represent as a string - * @returns {String} string representation of the matrix - */ + if (cachedResponse && responseIsFresh) { + return finishRequest(cachedResponse); + } -function str$3(a) { - return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")"; -} -/** - * Returns Frobenius norm of a mat4 - * - * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of - * @returns {Number} Frobenius norm - */ + if (cachedResponse) { + // We can't do revalidation with 'If-None-Match' because then the + // request doesn't have simple cors headers. + } -function frob$3(a) { - return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); -} -/** - * Adds two mat4's - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the first operand - * @param {ReadonlyMat4} b the second operand - * @returns {mat4} out - */ + const requestTime = Date.now(); -function add$3(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - out[4] = a[4] + b[4]; - out[5] = a[5] + b[5]; - out[6] = a[6] + b[6]; - out[7] = a[7] + b[7]; - out[8] = a[8] + b[8]; - out[9] = a[9] + b[9]; - out[10] = a[10] + b[10]; - out[11] = a[11] + b[11]; - out[12] = a[12] + b[12]; - out[13] = a[13] + b[13]; - out[14] = a[14] + b[14]; - out[15] = a[15] + b[15]; - return out; -} -/** - * Subtracts matrix b from matrix a - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the first operand - * @param {ReadonlyMat4} b the second operand - * @returns {mat4} out - */ + window$1.fetch(request).then(response => { + if (response.ok) { + const cacheableResponse = cacheIgnoringSearch ? response.clone() : null; + return finishRequest(response, cacheableResponse, requestTime); -function subtract$3(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - out[2] = a[2] - b[2]; - out[3] = a[3] - b[3]; - out[4] = a[4] - b[4]; - out[5] = a[5] - b[5]; - out[6] = a[6] - b[6]; - out[7] = a[7] - b[7]; - out[8] = a[8] - b[8]; - out[9] = a[9] - b[9]; - out[10] = a[10] - b[10]; - out[11] = a[11] - b[11]; - out[12] = a[12] - b[12]; - out[13] = a[13] - b[13]; - out[14] = a[14] - b[14]; - out[15] = a[15] - b[15]; - return out; -} -/** - * Multiply each element of the matrix by a scalar. - * - * @param {mat4} out the receiving matrix - * @param {ReadonlyMat4} a the matrix to scale - * @param {Number} b amount to scale the matrix's elements by - * @returns {mat4} out - */ + } else { + return callback(new AJAXError(response.statusText, response.status, requestParameters.url)); + } + }).catch(error => { + if (error.code === 20) { + // silence expected AbortError + return; + } + callback(new Error(error.message)); + }); + }; -function multiplyScalar$3(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - out[2] = a[2] * b; - out[3] = a[3] * b; - out[4] = a[4] * b; - out[5] = a[5] * b; - out[6] = a[6] * b; - out[7] = a[7] * b; - out[8] = a[8] * b; - out[9] = a[9] * b; - out[10] = a[10] * b; - out[11] = a[11] * b; - out[12] = a[12] * b; - out[13] = a[13] * b; - out[14] = a[14] * b; - out[15] = a[15] * b; - return out; -} -/** - * Adds two mat4's after multiplying each element of the second operand by a scalar value. - * - * @param {mat4} out the receiving vector - * @param {ReadonlyMat4} a the first operand - * @param {ReadonlyMat4} b the second operand - * @param {Number} scale the amount to scale b's elements by before adding - * @returns {mat4} out - */ + const finishRequest = (response, cacheableResponse, requestTime) => { + ( + requestParameters.type === 'arrayBuffer' ? response.arrayBuffer() : + requestParameters.type === 'json' ? response.json() : + response.text() + ).then(result => { + if (aborted) return; + if (cacheableResponse && requestTime) { + // The response needs to be inserted into the cache after it has completely loaded. + // Until it is fully loaded there is a chance it will be aborted. Aborting while + // reading the body can cause the cache insertion to error. We could catch this error + // in most browsers but in Firefox it seems to sometimes crash the tab. Adding + // it to the cache here avoids that error. + cachePut(request, cacheableResponse, requestTime); + } + complete = true; + callback(null, result, response.headers.get('Cache-Control'), response.headers.get('Expires')); + }).catch(err => { + if (!aborted) callback(new Error(err.message)); + }); + }; -function multiplyScalarAndAdd$3(out, a, b, scale) { - out[0] = a[0] + b[0] * scale; - out[1] = a[1] + b[1] * scale; - out[2] = a[2] + b[2] * scale; - out[3] = a[3] + b[3] * scale; - out[4] = a[4] + b[4] * scale; - out[5] = a[5] + b[5] * scale; - out[6] = a[6] + b[6] * scale; - out[7] = a[7] + b[7] * scale; - out[8] = a[8] + b[8] * scale; - out[9] = a[9] + b[9] * scale; - out[10] = a[10] + b[10] * scale; - out[11] = a[11] + b[11] * scale; - out[12] = a[12] + b[12] * scale; - out[13] = a[13] + b[13] * scale; - out[14] = a[14] + b[14] * scale; - out[15] = a[15] + b[15] * scale; - return out; -} -/** - * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) - * - * @param {ReadonlyMat4} a The first matrix. - * @param {ReadonlyMat4} b The second matrix. - * @returns {Boolean} True if the matrices are equal, false otherwise. - */ + if (cacheIgnoringSearch) { + cacheGet(request, validateOrFetch); + } else { + validateOrFetch(null, null); + } -function exactEquals$3(a, b) { - return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]; + return {cancel: () => { + aborted = true; + if (!complete) controller.abort(); + }}; } -/** - * Returns whether or not the matrices have approximately the same elements in the same position. - * - * @param {ReadonlyMat4} a The first matrix. - * @param {ReadonlyMat4} b The second matrix. - * @returns {Boolean} True if the matrices are equal, false otherwise. - */ -function equals$4(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7]; - var a8 = a[8], - a9 = a[9], - a10 = a[10], - a11 = a[11]; - var a12 = a[12], - a13 = a[13], - a14 = a[14], - a15 = a[15]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - var b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7]; - var b8 = b[8], - b9 = b[9], - b10 = b[10], - b11 = b[11]; - var b12 = b[12], - b13 = b[13], - b14 = b[14], - b15 = b[15]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); -} -/** - * Alias for {@link mat4.multiply} - * @function - */ +function makeXMLHttpRequest(requestParameters , callback ) { + const xhr = new window$1.XMLHttpRequest(); -var mul$3 = multiply$3; -/** - * Alias for {@link mat4.subtract} - * @function - */ + xhr.open(requestParameters.method || 'GET', requestParameters.url, true); + if (requestParameters.type === 'arrayBuffer') { + xhr.responseType = 'arraybuffer'; + } + for (const k in requestParameters.headers) { + xhr.setRequestHeader(k, requestParameters.headers[k]); + } + if (requestParameters.type === 'json') { + xhr.responseType = 'text'; + xhr.setRequestHeader('Accept', 'application/json'); + } + xhr.withCredentials = requestParameters.credentials === 'include'; + xhr.onerror = () => { + callback(new Error(xhr.statusText)); + }; + xhr.onload = () => { + if (((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) && xhr.response !== null) { + let data = xhr.response; + if (requestParameters.type === 'json') { + // We're manually parsing JSON here to get better error messages. + try { + data = JSON.parse(xhr.response); + } catch (err) { + return callback(err); + } + } + callback(null, data, xhr.getResponseHeader('Cache-Control'), xhr.getResponseHeader('Expires')); + } else { + callback(new AJAXError(xhr.statusText, xhr.status, requestParameters.url)); + } + }; + xhr.send(requestParameters.body); + return {cancel: () => xhr.abort()}; +} -var sub$3 = subtract$3; +const makeRequest = function(requestParameters , callback ) { + // We're trying to use the Fetch API if possible. However, in some situations we can't use it: + // - Safari exposes window.AbortController, but it doesn't work actually abort any requests in + // older versions (see https://bugs.webkit.org/show_bug.cgi?id=174980#c2). In this case, + // we dispatch the request to the main thread so that we can get an accurate referrer header. + // - Requests for resources with the file:// URI scheme don't work with the Fetch API either. In + // this case we unconditionally use XHR on the current thread since referrers don't matter. + if (!isFileURL(requestParameters.url)) { + if (window$1.fetch && window$1.Request && window$1.AbortController && window$1.Request.prototype.hasOwnProperty('signal')) { + return makeFetchRequest(requestParameters, callback); + } + if (isWorker() && self.worker && self.worker.actor) { + const queueOnMainThread = true; + return self.worker.actor.send('getResource', requestParameters, callback, undefined, queueOnMainThread); + } + } + return makeXMLHttpRequest(requestParameters, callback); +}; -/** - * 3 Dimensional Vector - * @module vec3 - */ +const getJSON = function(requestParameters , callback ) { + return makeRequest(extend$1(requestParameters, {type: 'json'}), callback); +}; -/** - * Creates a new, empty vec3 - * - * @returns {vec3} a new 3D vector - */ +const getArrayBuffer = function(requestParameters , callback ) { + return makeRequest(extend$1(requestParameters, {type: 'arrayBuffer'}), callback); +}; -function create$4() { - var out = new ARRAY_TYPE(3); +const postData = function(requestParameters , callback ) { + return makeRequest(extend$1(requestParameters, {method: 'POST'}), callback); +}; - if (ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - } +const getData = function(requestParameters , callback ) { + return makeRequest(extend$1(requestParameters, {method: 'GET'}), callback); +}; - return out; +function sameOrigin(url) { + const a = window$1.document.createElement('a'); + a.href = url; + return a.protocol === window$1.document.location.protocol && a.host === window$1.document.location.host; } -/** - * Creates a new vec3 initialized with values from an existing vector - * - * @param {ReadonlyVec3} a vector to clone - * @returns {vec3} a new 3D vector - */ -function clone$4(a) { - var out = new ARRAY_TYPE(3); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - return out; -} -/** - * Calculates the length of a vec3 - * - * @param {ReadonlyVec3} a vector to calculate length of - * @returns {Number} length of a - */ +const transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII='; -function length(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return Math.hypot(x, y, z); +function arrayBufferToImage(data , callback ) { + const img = new window$1.Image(); + const URL = window$1.URL; + img.onload = () => { + callback(null, img); + URL.revokeObjectURL(img.src); + // prevent image dataURI memory leak in Safari; + // but don't free the image immediately because it might be uploaded in the next frame + // https://github.com/mapbox/mapbox-gl-js/issues/10226 + img.onload = null; + window$1.requestAnimationFrame(() => { img.src = transparentPngUrl; }); + }; + img.onerror = () => callback(new Error('Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.')); + const blob = new window$1.Blob([new Uint8Array(data)], {type: 'image/png'}); + img.src = data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl; } -/** - * Creates a new vec3 initialized with the given values - * - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @returns {vec3} a new 3D vector - */ -function fromValues$4(x, y, z) { - var out = new ARRAY_TYPE(3); - out[0] = x; - out[1] = y; - out[2] = z; - return out; +function arrayBufferToImageBitmap(data , callback ) { + const blob = new window$1.Blob([new Uint8Array(data)], {type: 'image/png'}); + window$1.createImageBitmap(blob).then((imgBitmap) => { + callback(null, imgBitmap); + }).catch((e) => { + callback(new Error(`Could not load image because of ${e.message}. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`)); + }); } -/** - * Copy the values from one vec3 to another - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the source vector - * @returns {vec3} out - */ -function copy$4(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - return out; -} -/** - * Set the components of a vec3 to the given values - * - * @param {vec3} out the receiving vector - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @returns {vec3} out - */ +let imageQueue, numImageRequests; +const resetImageRequestQueue = () => { + imageQueue = []; + numImageRequests = 0; +}; +resetImageRequestQueue(); -function set$4(out, x, y, z) { - out[0] = x; - out[1] = y; - out[2] = z; - return out; -} -/** - * Adds two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ +const getImage = function(requestParameters , callback ) { + if (exported.supported) { + if (!requestParameters.headers) { + requestParameters.headers = {}; + } + requestParameters.headers.accept = 'image/webp,*/*'; + } -function add$4(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - return out; -} -/** - * Subtracts vector b from vector a - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ + // limit concurrent image loads to help with raster sources performance on big screens + if (numImageRequests >= config.MAX_PARALLEL_IMAGE_REQUESTS) { + const queued = { + requestParameters, + callback, + cancelled: false, + cancel() { this.cancelled = true; } + }; + imageQueue.push(queued); + return queued; + } + numImageRequests++; -function subtract$4(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - out[2] = a[2] - b[2]; - return out; -} -/** - * Multiplies two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ + let advanced = false; + const advanceImageRequestQueue = () => { + if (advanced) return; + advanced = true; + numImageRequests--; + assert_1(numImageRequests >= 0); + while (imageQueue.length && numImageRequests < config.MAX_PARALLEL_IMAGE_REQUESTS) { // eslint-disable-line + const request = imageQueue.shift(); + const {requestParameters, callback, cancelled} = request; + if (!cancelled) { + request.cancel = getImage(requestParameters, callback).cancel; + } + } + }; -function multiply$4(out, a, b) { - out[0] = a[0] * b[0]; - out[1] = a[1] * b[1]; - out[2] = a[2] * b[2]; - return out; -} -/** - * Divides two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ + // request the image with XHR to work around caching issues + // see https://github.com/mapbox/mapbox-gl-js/issues/1470 + const request = getArrayBuffer(requestParameters, (err , data , cacheControl , expires ) => { -function divide(out, a, b) { - out[0] = a[0] / b[0]; - out[1] = a[1] / b[1]; - out[2] = a[2] / b[2]; - return out; -} -/** - * Math.ceil the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to ceil - * @returns {vec3} out - */ + advanceImageRequestQueue(); -function ceil(out, a) { - out[0] = Math.ceil(a[0]); - out[1] = Math.ceil(a[1]); - out[2] = Math.ceil(a[2]); - return out; -} -/** - * Math.floor the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to floor - * @returns {vec3} out - */ + if (err) { + callback(err); + } else if (data) { + if (window$1.createImageBitmap) { + arrayBufferToImageBitmap(data, (err, imgBitmap) => callback(err, imgBitmap, cacheControl, expires)); + } else { + arrayBufferToImage(data, (err, img) => callback(err, img, cacheControl, expires)); + } + } + }); -function floor(out, a) { - out[0] = Math.floor(a[0]); - out[1] = Math.floor(a[1]); - out[2] = Math.floor(a[2]); - return out; -} -/** - * Returns the minimum of two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ + return { + cancel: () => { + request.cancel(); + advanceImageRequestQueue(); + } + }; +}; -function min(out, a, b) { - out[0] = Math.min(a[0], b[0]); - out[1] = Math.min(a[1], b[1]); - out[2] = Math.min(a[2], b[2]); - return out; -} -/** - * Returns the maximum of two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ +const getVideo = function(urls , callback ) { + const video = window$1.document.createElement('video'); + video.muted = true; + video.onloadstart = function() { + callback(null, video); + }; + for (let i = 0; i < urls.length; i++) { + const s = window$1.document.createElement('source'); + if (!sameOrigin(urls[i])) { + video.crossOrigin = 'Anonymous'; + } + s.src = urls[i]; + video.appendChild(s); + } + return {cancel: () => {}}; +}; -function max(out, a, b) { - out[0] = Math.max(a[0], b[0]); - out[1] = Math.max(a[1], b[1]); - out[2] = Math.max(a[2], b[2]); - return out; -} -/** - * Math.round the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to round - * @returns {vec3} out - */ +// -function round(out, a) { - out[0] = Math.round(a[0]); - out[1] = Math.round(a[1]); - out[2] = Math.round(a[2]); - return out; -} -/** - * Scales a vec3 by a scalar number - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the vector to scale - * @param {Number} b amount to scale the vector by - * @returns {vec3} out - */ + + -function scale$4(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - out[2] = a[2] * b; - return out; +function _addEventListener(type , listener , listenerList ) { + const listenerExists = listenerList[type] && listenerList[type].indexOf(listener) !== -1; + if (!listenerExists) { + listenerList[type] = listenerList[type] || []; + listenerList[type].push(listener); + } } -/** - * Adds two vec3's after scaling the second operand by a scalar value - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @param {Number} scale the amount to scale b by before adding - * @returns {vec3} out - */ -function scaleAndAdd(out, a, b, scale) { - out[0] = a[0] + b[0] * scale; - out[1] = a[1] + b[1] * scale; - out[2] = a[2] + b[2] * scale; - return out; +function _removeEventListener(type , listener , listenerList ) { + if (listenerList && listenerList[type]) { + const index = listenerList[type].indexOf(listener); + if (index !== -1) { + listenerList[type].splice(index, 1); + } + } } -/** - * Calculates the euclidian distance between two vec3's - * - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {Number} distance between a and b - */ -function distance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return Math.hypot(x, y, z); -} -/** - * Calculates the squared euclidian distance between two vec3's - * - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {Number} squared distance between a and b - */ +class Event { + -function squaredDistance(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - return x * x + y * y + z * z; + constructor(type , data = {}) { + extend$1(this, data); + this.type = type; + } } -/** - * Calculates the squared length of a vec3 - * - * @param {ReadonlyVec3} a vector to calculate squared length of - * @returns {Number} squared length of a - */ -function squaredLength(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - return x * x + y * y + z * z; -} -/** - * Negates the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to negate - * @returns {vec3} out - */ + + + -function negate(out, a) { - out[0] = -a[0]; - out[1] = -a[1]; - out[2] = -a[2]; - return out; -} -/** - * Returns the inverse of the components of a vec3 - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to invert - * @returns {vec3} out - */ +class ErrorEvent extends Event { + -function inverse(out, a) { - out[0] = 1.0 / a[0]; - out[1] = 1.0 / a[1]; - out[2] = 1.0 / a[2]; - return out; + constructor(error , data = {}) { + super('error', extend$1({error}, data)); + } } + /** - * Normalize a vec3 + * `Evented` mixes methods into other classes for event capabilities. * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a vector to normalize - * @returns {vec3} out + * Unless you are developing a plugin you will most likely use these methods through classes like `Map` or `Popup`. + * + * For lists of events you can listen for, see API documentation for specific classes: [`Map`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events), [`Marker`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events), [`Popup`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events), and [`GeolocationControl`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events). + * + * @mixin Evented */ +class Evented { + + + + -function normalize(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var len = x * x + y * y + z * z; + /** + * Adds a listener to a specified event type. + * + * @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 {Object} Returns itself to allow for method chaining. + */ + on(type , listener ) { + this._listeners = this._listeners || {}; + _addEventListener(type, listener, this._listeners); - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } + return this; + } - out[0] = a[0] * len; - out[1] = a[1] * len; - out[2] = a[2] * len; - return out; -} -/** - * Calculates the dot product of two vec3's - * - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {Number} dot product of a and b - */ + /** + * 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} Returns itself to allow for method chaining. + */ + off(type , listener ) { + _removeEventListener(type, listener, this._listeners); + _removeEventListener(type, listener, this._oneTimeListeners); -function dot(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; -} -/** - * Computes the cross product of two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @returns {vec3} out - */ + return this; + } -function cross(out, a, b) { - var ax = a[0], - ay = a[1], - az = a[2]; - var bx = b[0], - by = b[1], - bz = b[2]; - out[0] = ay * bz - az * by; - out[1] = az * bx - ax * bz; - out[2] = ax * by - ay * bx; - return out; -} -/** - * Performs a linear interpolation between two vec3's - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {vec3} out - */ + /** + * 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 (Optional) The function to be called when the event is fired once. + * If not provided, returns a Promise that will be resolved when the event is fired once. + * @returns {Object} Returns `this` | Promise. + */ + once(type , listener ) { + if (!listener) { + return new Promise(resolve => this.once(type, resolve)); + } -function lerp(out, a, b, t) { - var ax = a[0]; - var ay = a[1]; - var az = a[2]; - out[0] = ax + t * (b[0] - ax); - out[1] = ay + t * (b[1] - ay); - out[2] = az + t * (b[2] - az); - return out; -} -/** - * Performs a hermite interpolation with two control points - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @param {ReadonlyVec3} c the third operand - * @param {ReadonlyVec3} d the fourth operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {vec3} out - */ + this._oneTimeListeners = this._oneTimeListeners || {}; + _addEventListener(type, listener, this._oneTimeListeners); -function hermite(out, a, b, c, d, t) { - var factorTimes2 = t * t; - var factor1 = factorTimes2 * (2 * t - 3) + 1; - var factor2 = factorTimes2 * (t - 2) + t; - var factor3 = factorTimes2 * (t - 1); - var factor4 = factorTimes2 * (3 - 2 * t); - out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; - out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; - out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; - return out; -} -/** - * Performs a bezier interpolation with two control points - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the first operand - * @param {ReadonlyVec3} b the second operand - * @param {ReadonlyVec3} c the third operand - * @param {ReadonlyVec3} d the fourth operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {vec3} out - */ + return this; + } -function bezier(out, a, b, c, d, t) { - var inverseFactor = 1 - t; - var inverseFactorTimesTwo = inverseFactor * inverseFactor; - var factorTimes2 = t * t; - var factor1 = inverseFactorTimesTwo * inverseFactor; - var factor2 = 3 * t * inverseFactorTimesTwo; - var factor3 = 3 * factorTimes2 * inverseFactor; - var factor4 = factorTimes2 * t; - out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; - out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; - out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; - return out; -} -/** - * Generates a random vector with the given scale - * - * @param {vec3} out the receiving vector - * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned - * @returns {vec3} out - */ + fire(event , properties ) { + // Compatibility with (type: string, properties: Object) signature from previous versions. + // See https://github.com/mapbox/mapbox-gl-js/issues/6522, + // https://github.com/mapbox/mapbox-gl-draw/issues/766 + if (typeof event === 'string') { + event = new Event(event, properties || {}); + } -function random(out, scale) { - scale = scale || 1.0; - var r = RANDOM() * 2.0 * Math.PI; - var z = RANDOM() * 2.0 - 1.0; - var zScale = Math.sqrt(1.0 - z * z) * scale; - out[0] = Math.cos(r) * zScale; - out[1] = Math.sin(r) * zScale; - out[2] = z * scale; - return out; -} -/** - * Transforms the vec3 with a mat4. - * 4th vector component is implicitly '1' - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the vector to transform - * @param {ReadonlyMat4} m matrix to transform with - * @returns {vec3} out - */ - -function transformMat4(out, a, m) { - var x = a[0], - y = a[1], - z = a[2]; - var w = m[3] * x + m[7] * y + m[11] * z + m[15]; - w = w || 1.0; - 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; - return out; -} -/** - * Transforms the vec3 with a mat3. - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the vector to transform - * @param {ReadonlyMat3} m the 3x3 matrix to transform with - * @returns {vec3} 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; -} -/** - * Transforms the vec3 with a quat - * Can also be used for dual quaternions. (Multiply it with the real part) - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec3} a the vector to transform - * @param {ReadonlyQuat} q quaternion to transform with - * @returns {vec3} out - */ + const type = event.type; -function transformQuat(out, a, q) { - // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed - var qx = q[0], - qy = q[1], - qz = q[2], - qw = q[3]; - var x = a[0], - y = a[1], - z = a[2]; // var qvec = [qx, qy, qz]; - // var uv = vec3.cross([], qvec, a); + if (this.listens(type)) { + (event ).target = this; - var uvx = qy * z - qz * y, - uvy = qz * x - qx * z, - uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv); + // make sure adding or removing listeners inside other listeners won't cause an infinite loop + const listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : []; - var uuvx = qy * uvz - qz * uvy, - uuvy = qz * uvx - qx * uvz, - uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w); + for (const listener of listeners) { + listener.call(this, event); + } - var w2 = qw * 2; - uvx *= w2; - uvy *= w2; - uvz *= w2; // vec3.scale(uuv, uuv, 2); + const oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : []; + for (const listener of oneTimeListeners) { + _removeEventListener(type, listener, this._oneTimeListeners); + listener.call(this, event); + } - uuvx *= 2; - uuvy *= 2; - uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv)); + const parent = this._eventedParent; + if (parent) { + extend$1( + event, + typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData + ); + parent.fire(event); + } - out[0] = x + uvx + uuvx; - out[1] = y + uvy + uuvy; - out[2] = z + uvz + uuvz; - return out; -} -/** - * Rotate a 3D vector around the x-axis - * @param {vec3} out The receiving vec3 - * @param {ReadonlyVec3} a The vec3 point to rotate - * @param {ReadonlyVec3} b The origin of the rotation - * @param {Number} rad The angle of rotation in radians - * @returns {vec3} out - */ + // To ensure that no error events are dropped, print them to the + // console if they have no listeners. + } else if (event instanceof ErrorEvent) { + console.error(event.error); + } -function rotateX$1(out, a, b, rad) { - var p = [], - r = []; //Translate point to the origin + return this; + } - p[0] = a[0] - b[0]; - p[1] = a[1] - b[1]; - p[2] = a[2] - b[2]; //perform rotation + /** + * Returns true if this instance of Evented or any forwarded instances of Evented have a listener for the specified type. + * + * @param {string} type The event type. + * @returns {boolean} Returns `true` if there is at least one registered listener for specified event type, `false` otherwise. + * @private + */ + 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)) + ); + } - r[0] = p[0]; - r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad); - r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position + /** + * Bubble all events fired by this instance of Evented to this parent instance of Evented. + * + * @returns {Object} `this` + * @private + */ + setEventedParent(parent , data ) { + this._eventedParent = parent; + this._eventedParentData = data; - out[0] = r[0] + b[0]; - out[1] = r[1] + b[1]; - out[2] = r[2] + b[2]; - return out; + return this; + } } -/** - * Rotate a 3D vector around the y-axis - * @param {vec3} out The receiving vec3 - * @param {ReadonlyVec3} a The vec3 point to rotate - * @param {ReadonlyVec3} b The origin of the rotation - * @param {Number} rad The angle of rotation in radians - * @returns {vec3} out - */ -function rotateY$1(out, a, b, rad) { - var p = [], - r = []; //Translate point to the origin +var spec = JSON.parse('{"$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"},"terrain":{"type":"terrain"},"fog":{"type":"fog"},"sources":{"required":true,"type":"sources"},"sprite":{"type":"string"},"glyphs":{"type":"string"},"transition":{"type":"transition"},"projection":{"type":"projection"},"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_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.051129,180,85.051129]},"scheme":{"type":"enum","values":{"xyz":{},"tms":{}},"default":"xyz"},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"attribution":{"type":"string"},"promoteId":{"type":"promoteId"},"volatile":{"type":"boolean","default":false},"*":{"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.051129,180,85.051129]},"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"},"volatile":{"type":"boolean","default":false},"*":{"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.051129,180,85.051129]},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"attribution":{"type":"string"},"encoding":{"type":"enum","values":{"terrarium":{},"mapbox":{}},"default":"mapbox"},"volatile":{"type":"boolean","default":false},"*":{"type":"*"}},"source_geojson":{"type":{"required":true,"type":"enum","values":{"geojson":{}}},"data":{"type":"*"},"maxzoom":{"type":"number","default":18},"attribution":{"type":"string"},"buffer":{"type":"number","default":128,"maximum":512,"minimum":0},"filter":{"type":"*"},"tolerance":{"type":"number","default":0.375},"cluster":{"type":"boolean","default":false},"clusterRadius":{"type":"number","default":50,"minimum":0},"clusterMaxZoom":{"type":"number"},"clusterMinPoints":{"type":"number"},"clusterProperties":{"type":"*"},"lineMetrics":{"type":"boolean","default":false},"generateId":{"type":"boolean","default":false},"promoteId":{"type":"promoteId"}},"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"}}},"layer":{"id":{"type":"string","required":true},"type":{"type":"enum","values":{"fill":{},"line":{},"symbol":{},"circle":{},"heatmap":{},"fill-extrusion":{},"raster":{},"hillshade":{},"background":{},"sky":{}},"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_sky"],"layout_background":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_sky":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_fill":{"fill-sort-key":{"type":"number","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_circle":{"circle-sort-key":{"type":"number","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_heatmap":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_fill-extrusion":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_line":{"line-cap":{"type":"enum","values":{"butt":{},"round":{},"square":{}},"default":"butt","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"line-join":{"type":"enum","values":{"bevel":{},"round":{},"miter":{}},"default":"miter","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"line-miter-limit":{"type":"number","default":2,"requires":[{"line-join":"miter"}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"line-round-limit":{"type":"number","default":1.05,"requires":[{"line-join":"round"}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"line-sort-key":{"type":"number","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_symbol":{"symbol-placement":{"type":"enum","values":{"point":{},"line":{},"line-center":{}},"default":"point","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"symbol-spacing":{"type":"number","default":250,"minimum":1,"units":"pixels","requires":[{"symbol-placement":"line"}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"symbol-avoid-edges":{"type":"boolean","default":false,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"symbol-sort-key":{"type":"number","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"symbol-z-order":{"type":"enum","values":{"auto":{},"viewport-y":{},"source":{}},"default":"auto","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-allow-overlap":{"type":"boolean","default":false,"requires":["icon-image"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-ignore-placement":{"type":"boolean","default":false,"requires":["icon-image"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-optional":{"type":"boolean","default":false,"requires":["icon-image","text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-rotation-alignment":{"type":"enum","values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["icon-image"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-size":{"type":"number","default":1,"minimum":0,"units":"factor of the original icon size","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"icon-text-fit":{"type":"enum","values":{"none":{},"width":{},"height":{},"both":{}},"default":"none","requires":["icon-image","text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-text-fit-padding":{"type":"array","value":"number","length":4,"default":[0,0,0,0],"units":"pixels","requires":["icon-image","text-field",{"icon-text-fit":["both","width","height"]}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"icon-image":{"type":"resolvedImage","tokens":true,"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"icon-rotate":{"type":"number","default":0,"period":360,"units":"degrees","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"icon-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"icon-keep-upright":{"type":"boolean","default":false,"requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"icon-anchor":{"type":"enum","values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"default":"center","requires":["icon-image"],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"icon-pitch-alignment":{"type":"enum","values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["icon-image"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-pitch-alignment":{"type":"enum","values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-rotation-alignment":{"type":"enum","values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-field":{"type":"formatted","default":"","tokens":true,"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-font":{"type":"array","value":"string","default":["Open Sans Regular","Arial Unicode MS Regular"],"requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"ems","requires":["text-field",{"symbol-placement":["point"]}],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-line-height":{"type":"number","default":1.2,"units":"ems","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-letter-spacing":{"type":"number","default":0,"units":"ems","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-justify":{"type":"enum","values":{"auto":{},"left":{},"center":{},"right":{}},"default":"center","requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-radial-offset":{"type":"number","units":"ems","default":0,"requires":["text-field"],"property-type":"data-driven","expression":{"interpolated":true,"parameters":["zoom","feature"]}},"text-variable-anchor":{"type":"array","value":"enum","values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"requires":["text-field",{"symbol-placement":["point"]}],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-anchor":{"type":"enum","values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"default":"center","requires":["text-field",{"!":"text-variable-anchor"}],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-max-angle":{"type":"number","default":45,"units":"degrees","requires":["text-field",{"symbol-placement":["line","line-center"]}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"text-writing-mode":{"type":"array","value":"enum","values":{"horizontal":{},"vertical":{}},"requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"text-keep-upright":{"type":"boolean","default":true,"requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-transform":{"type":"enum","values":{"none":{},"uppercase":{},"lowercase":{}},"default":"none","requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-offset":{"type":"array","value":"number","units":"ems","length":2,"default":[0,0],"requires":["text-field",{"!":"text-radial-offset"}],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-allow-overlap":{"type":"boolean","default":false,"requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-ignore-placement":{"type":"boolean","default":false,"requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-optional":{"type":"boolean","default":false,"requires":["text-field","icon-image"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_raster":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_hillshade":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"filter":{"type":"array","value":"*"},"filter_symbol":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature","pitch","distance-from-center"]}},"filter_fill":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature"]}},"filter_line":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature"]}},"filter_circle":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature"]}},"filter_fill-extrusion":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature"]}},"filter_heatmap":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature"]}},"filter_operator":{"type":"enum","values":{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},"in":{},"!in":{},"all":{},"any":{},"none":{},"has":{},"!has":{},"within":{}}},"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":24,"value":["number","color"],"length":2},"expression":{"type":"array","value":"*","minimum":1},"fog":{"range":{"type":"array","default":[0.5,10],"minimum":-20,"maximum":20,"length":2,"value":"number","property-type":"data-constant","transition":true,"expression":{"interpolated":true,"parameters":["zoom"]}},"color":{"type":"color","property-type":"data-constant","default":"#ffffff","expression":{"interpolated":true,"parameters":["zoom"]},"transition":true},"high-color":{"type":"color","property-type":"data-constant","default":"#245cdf","expression":{"interpolated":true,"parameters":["zoom"]},"transition":true},"space-color":{"type":"color","property-type":"data-constant","default":["interpolate",["linear"],["zoom"],4,"#010b19",7,"#367ab9"],"expression":{"interpolated":true,"parameters":["zoom"]},"transition":true},"horizon-blend":{"type":"number","property-type":"data-constant","default":["interpolate",["linear"],["zoom"],4,0.2,7,0.1],"minimum":0,"maximum":1,"expression":{"interpolated":true,"parameters":["zoom"]},"transition":true},"star-intensity":{"type":"number","property-type":"data-constant","default":["interpolate",["linear"],["zoom"],5,0.35,6,0],"minimum":0,"maximum":1,"expression":{"interpolated":true,"parameters":["zoom"]},"transition":true}},"light":{"anchor":{"type":"enum","default":"viewport","values":{"map":{},"viewport":{}},"property-type":"data-constant","transition":false,"expression":{"interpolated":false,"parameters":["zoom"]}},"position":{"type":"array","default":[1.15,210,30],"length":3,"value":"number","property-type":"data-constant","transition":true,"expression":{"interpolated":true,"parameters":["zoom"]}},"color":{"type":"color","property-type":"data-constant","default":"#ffffff","expression":{"interpolated":true,"parameters":["zoom"]},"transition":true},"intensity":{"type":"number","property-type":"data-constant","default":0.5,"minimum":0,"maximum":1,"expression":{"interpolated":true,"parameters":["zoom"]},"transition":true}},"projection":{"name":{"type":"enum","values":{"albers":{},"equalEarth":{},"equirectangular":{},"lambertConformalConic":{},"mercator":{},"naturalEarth":{},"winkelTripel":{},"globe":{}},"default":"mercator","required":true},"center":{"type":"array","length":2,"value":"number","property-type":"data-constant","minimum":[-180,-90],"maximum":[180,90],"transition":false,"requires":[{"name":["albers","lambertConformalConic"]}]},"parallels":{"type":"array","length":2,"value":"number","property-type":"data-constant","minimum":[-90,-90],"maximum":[90,90],"transition":false,"requires":[{"name":["albers","lambertConformalConic"]}]}},"terrain":{"source":{"type":"string","required":true},"exaggeration":{"type":"number","property-type":"data-constant","default":1,"minimum":0,"maximum":1000,"expression":{"interpolated":true,"parameters":["zoom"]},"transition":true,"requires":["source"]}},"paint":["paint_fill","paint_line","paint_circle","paint_heatmap","paint_fill-extrusion","paint_symbol","paint_raster","paint_hillshade","paint_background","paint_sky"],"paint_fill":{"fill-antialias":{"type":"boolean","default":true,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"fill-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-color":{"type":"color","default":"#000000","transition":true,"requires":[{"!":"fill-pattern"}],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-outline-color":{"type":"color","transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"fill-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["fill-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"fill-pattern":{"type":"resolvedImage","transition":true,"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"cross-faded-data-driven"}},"paint_fill-extrusion":{"fill-extrusion-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"fill-extrusion-color":{"type":"color","default":"#000000","transition":true,"requires":[{"!":"fill-extrusion-pattern"}],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"fill-extrusion-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["fill-extrusion-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"fill-extrusion-pattern":{"type":"resolvedImage","transition":true,"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"cross-faded-data-driven"},"fill-extrusion-height":{"type":"number","default":0,"minimum":0,"units":"meters","transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-base":{"type":"number","default":0,"minimum":0,"units":"meters","transition":true,"requires":["fill-extrusion-height"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-vertical-gradient":{"type":"boolean","default":true,"transition":false,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_line":{"line-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-color":{"type":"color","default":"#000000","transition":true,"requires":[{"!":"line-pattern"}],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"line-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["line-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"line-width":{"type":"number","default":1,"minimum":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-gap-width":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-offset":{"type":"number","default":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-blur":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-dasharray":{"type":"array","value":"number","minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-pattern":{"type":"resolvedImage","transition":true,"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-gradient":{"type":"color","transition":false,"requires":[{"!":"line-pattern"},{"source":"geojson","has":{"lineMetrics":true}}],"expression":{"interpolated":true,"parameters":["line-progress"]},"property-type":"color-ramp"},"line-trim-offset":{"type":"array","value":"number","length":2,"default":[0,0],"minimum":[0,0],"maximum":[1,1],"transition":false,"requires":[{"source":"geojson","has":{"lineMetrics":true}}],"property-type":"constant"}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-color":{"type":"color","default":"#000000","transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-blur":{"type":"number","default":0,"transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"circle-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["circle-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"circle-pitch-scale":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"circle-pitch-alignment":{"type":"enum","values":{"map":{},"viewport":{}},"default":"viewport","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"circle-stroke-width":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-color":{"type":"color","default":"#000000","transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"}},"paint_heatmap":{"heatmap-radius":{"type":"number","default":30,"minimum":1,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-weight":{"type":"number","default":1,"minimum":0,"transition":false,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-intensity":{"type":"number","default":1,"minimum":0,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"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"],"transition":false,"expression":{"interpolated":true,"parameters":["heatmap-density"]},"property-type":"color-ramp"},"heatmap-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_symbol":{"icon-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-color":{"type":"color","default":"#000000","transition":true,"requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","transition":true,"requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-width":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"icon-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["icon-image","icon-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-color":{"type":"color","default":"#000000","transition":true,"overridable":true,"requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","transition":true,"requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-width":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-blur":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"text-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["text-field","text-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_raster":{"raster-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-hue-rotate":{"type":"number","default":0,"period":360,"transition":true,"units":"degrees","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-brightness-min":{"type":"number","default":0,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-brightness-max":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-saturation":{"type":"number","default":0,"minimum":-1,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-contrast":{"type":"number","default":0,"minimum":-1,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-resampling":{"type":"enum","values":{"linear":{},"nearest":{}},"default":"linear","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"transition":false,"units":"milliseconds","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_hillshade":{"hillshade-illumination-direction":{"type":"number","default":335,"minimum":0,"maximum":359,"transition":false,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"hillshade-illumination-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"viewport","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"hillshade-exaggeration":{"type":"number","default":0.5,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"hillshade-shadow-color":{"type":"color","default":"#000000","transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"hillshade-highlight-color":{"type":"color","default":"#FFFFFF","transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"hillshade-accent-color":{"type":"color","default":"#000000","transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_background":{"background-color":{"type":"color","default":"#000000","transition":true,"requires":[{"!":"background-pattern"}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"background-pattern":{"type":"resolvedImage","transition":true,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"cross-faded"},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_sky":{"sky-type":{"type":"enum","values":{"gradient":{},"atmosphere":{}},"default":"atmosphere","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"sky-atmosphere-sun":{"type":"array","value":"number","length":2,"units":"degrees","minimum":[0,0],"maximum":[360,180],"transition":false,"requires":[{"sky-type":"atmosphere"}],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"sky-atmosphere-sun-intensity":{"type":"number","requires":[{"sky-type":"atmosphere"}],"default":10,"minimum":0,"maximum":100,"transition":false,"property-type":"data-constant"},"sky-gradient-center":{"type":"array","requires":[{"sky-type":"gradient"}],"value":"number","default":[0,0],"length":2,"units":"degrees","minimum":[0,0],"maximum":[360,180],"transition":false,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"sky-gradient-radius":{"type":"number","requires":[{"sky-type":"gradient"}],"default":90,"minimum":0,"maximum":180,"transition":false,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"sky-gradient":{"type":"color","default":["interpolate",["linear"],["sky-radial-progress"],0.8,"#87ceeb",1,"white"],"transition":false,"requires":[{"sky-type":"gradient"}],"expression":{"interpolated":true,"parameters":["sky-radial-progress"]},"property-type":"color-ramp"},"sky-atmosphere-halo-color":{"type":"color","default":"white","transition":false,"requires":[{"sky-type":"atmosphere"}],"property-type":"data-constant"},"sky-atmosphere-color":{"type":"color","default":"white","transition":false,"requires":[{"sky-type":"atmosphere"}],"property-type":"data-constant"},"sky-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds"},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds"}},"property-type":{"data-driven":{"type":"property-type"},"cross-faded":{"type":"property-type"},"cross-faded-data-driven":{"type":"property-type"},"color-ramp":{"type":"property-type"},"data-constant":{"type":"property-type"},"constant":{"type":"property-type"}},"promoteId":{"*":{"type":"string"}}}'); - p[0] = a[0] - b[0]; - p[1] = a[1] - b[1]; - p[2] = a[2] - b[2]; //perform rotation +// - r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad); - r[1] = p[1]; - r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position +// - out[0] = r[0] + b[0]; - out[1] = r[1] + b[1]; - out[2] = r[2] + b[2]; - return out; +function extend (output , ...inputs ) { + for (const input of inputs) { + for (const k in input) { + output[k] = input[k]; + } + } + return output; } -/** - * Rotate a 3D vector around the z-axis - * @param {vec3} out The receiving vec3 - * @param {ReadonlyVec3} a The vec3 point to rotate - * @param {ReadonlyVec3} b The origin of the rotation - * @param {Number} rad The angle of rotation in radians - * @returns {vec3} out - */ -function rotateZ$1(out, a, b, rad) { - var p = [], - r = []; //Translate point to the origin +// - p[0] = a[0] - b[0]; - p[1] = a[1] - b[1]; - p[2] = a[2] - b[2]; //perform rotation +// 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; + } +} - r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad); - r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad); - r[2] = p[2]; //translate to correct position +function deepUnbundle(value ) { + if (Array.isArray(value)) { + return value.map(deepUnbundle); + } else if (value instanceof Object && !(value instanceof Number || value instanceof String || value instanceof Boolean)) { + const unbundledValue = {}; + for (const key in value) { + unbundledValue[key] = deepUnbundle(value[key]); + } + return unbundledValue; + } - out[0] = r[0] + b[0]; - out[1] = r[1] + b[1]; - out[2] = r[2] + b[2]; - return out; + return unbundle(value); } -/** - * Get the angle between two 3D vectors - * @param {ReadonlyVec3} a The first operand - * @param {ReadonlyVec3} b The second operand - * @returns {Number} The angle in radians - */ -function angle(a, b) { - var ax = a[0], - ay = a[1], - az = a[2], - bx = b[0], - by = b[1], - bz = b[2], - mag1 = Math.sqrt(ax * ax + ay * ay + az * az), - mag2 = Math.sqrt(bx * bx + by * by + bz * bz), - mag = mag1 * mag2, - cosine = mag && dot(a, b) / mag; - return Math.acos(Math.min(Math.max(cosine, -1), 1)); -} -/** - * Set the components of a vec3 to zero - * - * @param {vec3} out the receiving vector - * @returns {vec3} out - */ +// -function zero(out) { - out[0] = 0.0; - out[1] = 0.0; - out[2] = 0.0; - return out; +class ParsingError extends Error { + + + constructor(key , message ) { + super(message); + this.message = message; + this.key = key; + } } -/** - * Returns a string representation of a vector - * - * @param {ReadonlyVec3} a vector to represent as a string - * @returns {String} string representation of the vector - */ -function str$4(a) { - return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")"; -} -/** - * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) - * - * @param {ReadonlyVec3} a The first vector. - * @param {ReadonlyVec3} b The second vector. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ +// -function exactEquals$4(a, b) { - return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; -} -/** - * Returns whether or not the vectors have approximately the same elements in the same position. - * - * @param {ReadonlyVec3} a The first vector. - * @param {ReadonlyVec3} b The second vector. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ + -function equals$5(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2]; - var b0 = b[0], - b1 = b[1], - b2 = b[2]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); -} /** - * Alias for {@link vec3.subtract} - * @function + * Tracks `let` bindings during expression parsing. + * @private */ +class Scope { + + + constructor(parent , bindings = []) { + this.parent = parent; + this.bindings = {}; + for (const [name, expression] of bindings) { + this.bindings[name] = expression; + } + } -var sub$4 = subtract$4; -/** - * Alias for {@link vec3.multiply} - * @function - */ + concat(bindings ) { + return new Scope(this, bindings); + } -var mul$4 = multiply$4; -/** - * Alias for {@link vec3.divide} - * @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.`); + } -var div = divide; -/** - * Alias for {@link vec3.distance} - * @function - */ + has(name ) { + if (this.bindings[name]) return true; + return this.parent ? this.parent.has(name) : false; + } +} -var dist = distance; -/** - * Alias for {@link vec3.squaredDistance} - * @function - */ +// -var sqrDist = squaredDistance; -/** - * Alias for {@link vec3.length} - * @function - */ + + + + + + + + + + + -var len = length; -/** - * Alias for {@link vec3.squaredLength} - * @function - */ + -var sqrLen = squaredLength; -/** - * Perform some operation over an array of vec3s. - * - * @param {Array} a the array of vectors to iterate over - * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed - * @param {Number} offset Number of elements to skip at the beginning of the array - * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array - * @param {Function} fn Function to call for each vector in the array - * @param {Object} [arg] additional argument to pass to fn - * @returns {Array} a - * @function - */ + + + + + + + + + + + + + -var forEach = function () { - var vec = create$4(); - return function (a, stride, offset, count, fn, arg) { - var i, l; + + + + + - if (!stride) { - stride = 3; - } + - if (!offset) { - offset = 0; - } +const NullType = {kind: 'null'}; +const NumberType = {kind: 'number'}; +const StringType = {kind: 'string'}; +const BooleanType = {kind: 'boolean'}; +const ColorType = {kind: 'color'}; +const ObjectType = {kind: 'object'}; +const ValueType = {kind: 'value'}; +const ErrorType = {kind: 'error'}; +const CollatorType = {kind: 'collator'}; +const FormattedType = {kind: 'formatted'}; +const ResolvedImageType = {kind: 'resolvedImage'}; - if (count) { - l = Math.min(count * stride + offset, a.length); - } else { - l = a.length; - } +function array$1(itemType , N ) { + return { + kind: 'array', + itemType, + N + }; +} - for (i = offset; i < l; i += stride) { - vec[0] = a[i]; - vec[1] = a[i + 1]; - vec[2] = a[i + 2]; - fn(vec, vec, arg); - a[i] = vec[0]; - a[i + 1] = vec[1]; - a[i + 2] = vec[2]; +function toString$1(type ) { + if (type.kind === 'array') { + const itemType = toString$1(type.itemType); + return typeof type.N === 'number' ? + `array<${itemType}, ${type.N}>` : + type.itemType.kind === 'value' ? 'array' : `array<${itemType}>`; + } else { + return type.kind; } +} - return a; - }; -}(); - -/** - * 4 Dimensional Vector - * @module vec4 - */ +const valueMemberTypes = [ + NullType, + NumberType, + StringType, + BooleanType, + ColorType, + FormattedType, + ObjectType, + array$1(ValueType), + ResolvedImageType +]; /** - * Creates a new, empty vec4 - * - * @returns {vec4} a new 4D vector + * 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' && + ((t.N === 0 && t.itemType.kind === 'value') || !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 (const memberType of valueMemberTypes) { + if (!checkSubtype(memberType, t)) { + return null; + } + } + } -function create$5() { - var out = new ARRAY_TYPE(4); - - if (ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 0; - } - - return out; + return `Expected ${toString$1(expected)} but found ${toString$1(t)} instead.`; } -/** - * Creates a new vec4 initialized with values from an existing vector - * - * @param {ReadonlyVec4} a vector to clone - * @returns {vec4} a new 4D vector - */ -function clone$5(a) { - var out = new ARRAY_TYPE(4); - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - return out; +function isValidType(provided , allowedTypes ) { + return allowedTypes.some(t => t.kind === provided.kind); } -/** - * Creates a new vec4 initialized with the given values - * - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @param {Number} w W component - * @returns {vec4} a new 4D vector - */ - -function fromValues$5(x, y, z, w) { - var out = new ARRAY_TYPE(4); - out[0] = x; - out[1] = y; - out[2] = z; - out[3] = w; - return out; -} -/** - * Copy the values from one vec4 to another - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the source vector - * @returns {vec4} out - */ -function copy$5(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - return out; +function isValidNativeType(provided , allowedTypes ) { + return allowedTypes.some(t => { + if (t === 'null') { + return provided === null; + } else if (t === 'array') { + return Array.isArray(provided); + } else if (t === 'object') { + return provided && !Array.isArray(provided) && typeof provided === 'object'; + } else { + return t === typeof provided; + } + }); } -/** - * Set the components of a vec4 to the given values - * - * @param {vec4} out the receiving vector - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @param {Number} w W component - * @returns {vec4} out - */ -function set$5(out, x, y, z, w) { - out[0] = x; - out[1] = y; - out[2] = z; - out[3] = w; - return out; -} -/** - * Adds two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ +var csscolorparser = createCommonjsModule(function (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. -function add$5(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - return out; -} -/** - * Subtracts vector b from vector a - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ +// 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 subtract$5(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - out[2] = a[2] - b[2]; - out[3] = a[3] - b[3]; - return out; +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; } -/** - * Multiplies two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ -function multiply$5(out, a, b) { - out[0] = a[0] * b[0]; - out[1] = a[1] * b[1]; - out[2] = a[2] * b[2]; - out[3] = a[3] * b[3]; - return out; +function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. + return f < 0 ? 0 : f > 1 ? 1 : f; } -/** - * Divides two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ -function divide$1(out, a, b) { - out[0] = a[0] / b[0]; - out[1] = a[1] / b[1]; - out[2] = a[2] / b[2]; - out[3] = a[3] / b[3]; - return out; +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)); } -/** - * Math.ceil the components of a vec4 - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to ceil - * @returns {vec4} out - */ -function ceil$1(out, a) { - out[0] = Math.ceil(a[0]); - out[1] = Math.ceil(a[1]); - out[2] = Math.ceil(a[2]); - out[3] = Math.ceil(a[3]); - return out; +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)); } -/** - * Math.floor the components of a vec4 - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to floor - * @returns {vec4} out - */ -function floor$1(out, a) { - out[0] = Math.floor(a[0]); - out[1] = Math.floor(a[1]); - out[2] = Math.floor(a[2]); - out[3] = Math.floor(a[3]); - return out; -} -/** - * Returns the minimum of two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ +function css_hue_to_rgb(m1, m2, h) { + if (h < 0) h += 1; + else if (h > 1) h -= 1; -function min$1(out, a, b) { - out[0] = Math.min(a[0], b[0]); - out[1] = Math.min(a[1], b[1]); - out[2] = Math.min(a[2], b[2]); - out[3] = Math.min(a[3], b[3]); - return out; + 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; } -/** - * Returns the maximum of two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {vec4} out - */ -function max$1(out, a, b) { - out[0] = Math.max(a[0], b[0]); - out[1] = Math.max(a[1], b[1]); - out[2] = Math.max(a[2], b[2]); - out[3] = Math.max(a[3], b[3]); - return out; -} -/** - * Math.round the components of a vec4 - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to round - * @returns {vec4} out - */ +function parseCSSColor(css_str) { + // Remove all whitespace, not compliant, but should just be more accepting. + var str = css_str.replace(/ /g, '').toLowerCase(); -function round$1(out, a) { - out[0] = Math.round(a[0]); - out[1] = Math.round(a[1]); - out[2] = Math.round(a[2]); - out[3] = Math.round(a[3]); - return out; -} -/** - * Scales a vec4 by a scalar number - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the vector to scale - * @param {Number} b amount to scale the vector by - * @returns {vec4} out - */ + // Color keywords (and transparent) lookup. + if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup. -function scale$5(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; -} -/** - * Adds two vec4's after scaling the second operand by a scalar value - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @param {Number} scale the amount to scale b by before adding - * @returns {vec4} out - */ + // #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]; + } -function scaleAndAdd$1(out, a, b, scale) { - out[0] = a[0] + b[0] * scale; - out[1] = a[1] + b[1] * scale; - out[2] = a[2] + b[2] * scale; - out[3] = a[3] + b[3] * scale; - return out; -} -/** - * Calculates the euclidian distance between two vec4's - * - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {Number} distance between a and b - */ + return null; + } -function distance$1(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return Math.hypot(x, y, z, w); -} -/** - * Calculates the squared euclidian distance between two vec4's - * - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {Number} squared distance between a and b - */ + 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; + } + } -function squaredDistance$1(a, b) { - var x = b[0] - a[0]; - var y = b[1] - a[1]; - var z = b[2] - a[2]; - var w = b[3] - a[3]; - return x * x + y * y + z * z + w * w; + return null; } -/** - * Calculates the length of a vec4 - * - * @param {ReadonlyVec4} a vector to calculate length of - * @returns {Number} length of a - */ -function length$1(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return Math.hypot(x, y, z, w); -} -/** - * Calculates the squared length of a vec4 - * - * @param {ReadonlyVec4} a vector to calculate squared length of - * @returns {Number} squared length of a - */ +try { exports.parseCSSColor = parseCSSColor; } catch(e) { } +}); -function squaredLength$1(a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - return x * x + y * y + z * z + w * w; -} -/** - * Negates the components of a vec4 - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to negate - * @returns {vec4} out - */ +// -function negate$1(out, a) { - out[0] = -a[0]; - out[1] = -a[1]; - out[2] = -a[2]; - out[3] = -a[3]; - return out; -} /** - * Returns the inverse of the components of a vec4 + * 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 {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to invert - * @returns {vec4} out + * @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 */ +class Color { + + + + -function inverse$1(out, a) { - out[0] = 1.0 / a[0]; - out[1] = 1.0 / a[1]; - out[2] = 1.0 / a[2]; - out[3] = 1.0 / a[3]; - return out; -} -/** - * Normalize a vec4 - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a vector to normalize - * @returns {vec4} out - */ + constructor(r , g , b , a = 1) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } -function normalize$1(out, a) { - var x = a[0]; - var y = a[1]; - var z = a[2]; - var w = a[3]; - var len = x * x + y * y + z * z + w * w; + + + + + - if (len > 0) { - len = 1 / Math.sqrt(len); - } + /** + * 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. + */ + static parse(input ) { + if (!input) { + return undefined; + } - out[0] = x * len; - out[1] = y * len; - out[2] = z * len; - out[3] = w * len; - return out; -} -/** - * Calculates the dot product of two vec4's - * - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @returns {Number} dot product of a and b - */ + if (input instanceof Color) { + return input; + } -function dot$1(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} -/** - * Returns the cross-product of three vectors in a 4-dimensional space - * - * @param {ReadonlyVec4} result the receiving vector - * @param {ReadonlyVec4} U the first vector - * @param {ReadonlyVec4} V the second vector - * @param {ReadonlyVec4} W the third vector - * @returns {vec4} result - */ + if (typeof input !== 'string') { + return undefined; + } -function cross$1(out, u, v, w) { - var A = v[0] * w[1] - v[1] * w[0], - B = v[0] * w[2] - v[2] * w[0], - C = v[0] * w[3] - v[3] * w[0], - D = v[1] * w[2] - v[2] * w[1], - E = v[1] * w[3] - v[3] * w[1], - F = v[2] * w[3] - v[3] * w[2]; - var G = u[0]; - var H = u[1]; - var I = u[2]; - var J = u[3]; - out[0] = H * F - I * E + J * D; - out[1] = -(G * F) + I * C - J * B; - out[2] = G * E - H * C + J * A; - out[3] = -(G * D) + H * B - I * A; - return out; -} -/** - * Performs a linear interpolation between two vec4's - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the first operand - * @param {ReadonlyVec4} b the second operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {vec4} out - */ + const rgba = csscolorparser.parseCSSColor(input); + if (!rgba) { + return undefined; + } -function lerp$1(out, a, b, t) { - var ax = a[0]; - var ay = a[1]; - var az = a[2]; - var aw = a[3]; - out[0] = ax + t * (b[0] - ax); - out[1] = ay + t * (b[1] - ay); - out[2] = az + t * (b[2] - az); - out[3] = aw + t * (b[3] - aw); - return out; + 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)" + */ + toString() { + const [r, g, b, a] = this.toArray(); + return `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},${a})`; + } + + /** + * Returns an RGBA array of values representing the color, unpremultiplied by A. + * + * @returns An array of RGBA color values in the range [0, 255]. + */ + toArray() { + const {r, g, b, a} = this; + return a === 0 ? [0, 0, 0, 0] : [ + r * 255 / a, + g * 255 / a, + b * 255 / a, + a + ]; + } + + /** + * Returns a RGBA array of float values representing the color, unpremultiplied by A. + * + * @returns An array of RGBA color values in the range [0, 1]. + */ + toArray01() { + const {r, g, b, a} = this; + return a === 0 ? [0, 0, 0, 0] : [ + r / a, + g / a, + b / a, + a + ]; + } + + /** + * Returns an RGBA array of values representing the color, premultiplied by A. + * + * @returns An array of RGBA color values in the range [0, 1]. + */ + toArray01PremultipliedAlpha() { + const {r, g, b, a} = this; + return [ + r, + g, + b, + a + ]; + } } -/** - * Generates a random vector with the given scale - * - * @param {vec4} out the receiving vector - * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned - * @returns {vec4} out - */ -function random$1(out, scale) { - scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a - // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646. - // http://projecteuclid.org/euclid.aoms/1177692644; +Color.black = new Color(0, 0, 0, 1); +Color.white = new Color(1, 1, 1, 1); +Color.transparent = new Color(0, 0, 0, 0); +Color.red = new Color(1, 0, 0, 1); +Color.blue = new Color(0, 0, 1, 1); - var v1, v2, v3, v4; - var s1, s2; +// - do { - v1 = RANDOM() * 2 - 1; - v2 = RANDOM() * 2 - 1; - s1 = v1 * v1 + v2 * v2; - } while (s1 >= 1); +// Flow type declarations for Intl cribbed from +// https://github.com/facebook/flow/issues/1270 - do { - v3 = RANDOM() * 2 - 1; - v4 = RANDOM() * 2 - 1; - s2 = v3 * v3 + v4 * v4; - } while (s2 >= 1); + + + - var d = Math.sqrt((1 - s1) / s2); - out[0] = scale * v1; - out[1] = scale * v2; - out[2] = scale * v3 * d; - out[3] = scale * v4 * d; - return out; -} -/** - * Transforms the vec4 with a mat4. - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the vector to transform - * @param {ReadonlyMat4} m matrix to transform with - * @returns {vec4} 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; -} -/** - * Transforms the vec4 with a quat - * - * @param {vec4} out the receiving vector - * @param {ReadonlyVec4} a the vector to transform - * @param {ReadonlyQuat} q quaternion to transform with - * @returns {vec4} out - */ + + + + -function transformQuat$1(out, a, q) { - var x = a[0], - y = a[1], - z = a[2]; - var qx = q[0], - qy = q[1], - qz = q[2], - qw = q[3]; // calculate quat * vec + - var ix = qw * x + qy * z - qz * y; - var iy = qw * y + qz * x - qx * z; - var iz = qw * z + qx * y - qy * x; - var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat + + - out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; - out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; - out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; - out[3] = a[3]; - return out; -} -/** - * Set the components of a vec4 to zero - * - * @param {vec4} out the receiving vector - * @returns {vec4} out - */ + + + + + + + + -function zero$1(out) { - out[0] = 0.0; - out[1] = 0.0; - out[2] = 0.0; - out[3] = 0.0; - return out; -} -/** - * Returns a string representation of a vector - * - * @param {ReadonlyVec4} a vector to represent as a string - * @returns {String} string representation of the vector - */ +class Collator { + + + -function str$5(a) { - return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; -} -/** - * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) - * - * @param {ReadonlyVec4} a The first vector. - * @param {ReadonlyVec4} b The second vector. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ + constructor(caseSensitive , diacriticSensitive , locale ) { + if (caseSensitive) + this.sensitivity = diacriticSensitive ? 'variant' : 'case'; + else + this.sensitivity = diacriticSensitive ? 'accent' : 'base'; -function exactEquals$5(a, b) { - return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; -} -/** - * Returns whether or not the vectors have approximately the same elements in the same position. - * - * @param {ReadonlyVec4} a The first vector. - * @param {ReadonlyVec4} b The second vector. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ + this.locale = locale; + this.collator = new Intl.Collator(this.locale ? this.locale : [], + {sensitivity: this.sensitivity, usage: 'search'}); + } -function equals$6(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); + compare(lhs , rhs ) { + return this.collator.compare(lhs, rhs); + } + + resolvedLocale() { + // We create a Collator without "usage: search" because we don't want + // the search options encoded in our result (e.g. "en-u-co-search") + return new Intl.Collator(this.locale ? this.locale : []) + .resolvedOptions().locale; + } } -/** - * Alias for {@link vec4.subtract} - * @function - */ -var sub$5 = subtract$5; -/** - * Alias for {@link vec4.multiply} - * @function - */ +// + + -var mul$5 = multiply$5; -/** - * Alias for {@link vec4.divide} - * @function - */ +class FormattedSection { + + + + + -var div$1 = divide$1; -/** - * Alias for {@link vec4.distance} - * @function - */ + constructor(text , image , scale , fontStack , textColor ) { + // combine characters so that diacritic marks are not separate code points + this.text = text.normalize ? text.normalize() : text; + this.image = image; + this.scale = scale; + this.fontStack = fontStack; + this.textColor = textColor; + } +} -var dist$1 = distance$1; -/** - * Alias for {@link vec4.squaredDistance} - * @function - */ +class Formatted { + -var sqrDist$1 = squaredDistance$1; -/** - * Alias for {@link vec4.length} - * @function - */ + constructor(sections ) { + this.sections = sections; + } -var len$1 = length$1; -/** - * Alias for {@link vec4.squaredLength} - * @function - */ + static fromString(unformatted ) { + return new Formatted([new FormattedSection(unformatted, null, null, null, null)]); + } -var sqrLen$1 = squaredLength$1; -/** - * Perform some operation over an array of vec4s. - * - * @param {Array} a the array of vectors to iterate over - * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed - * @param {Number} offset Number of elements to skip at the beginning of the array - * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array - * @param {Function} fn Function to call for each vector in the array - * @param {Object} [arg] additional argument to pass to fn - * @returns {Array} a - * @function - */ + isEmpty() { + if (this.sections.length === 0) return true; + return !this.sections.some(section => section.text.length !== 0 || + (section.image && section.image.name.length !== 0)); + } -var forEach$1 = function () { - var vec = create$5(); - return function (a, stride, offset, count, fn, arg) { - var i, l; + static factory(text ) { + if (text instanceof Formatted) { + return text; + } else { + return Formatted.fromString(text); + } + } - if (!stride) { - stride = 4; + toString() { + if (this.sections.length === 0) return ''; + return this.sections.map(section => section.text).join(''); } - if (!offset) { - offset = 0; + serialize() { + const serialized = ["format"]; + for (const section of this.sections) { + if (section.image) { + serialized.push(["image", section.image.name]); + continue; + } + serialized.push(section.text); + const options = {}; + if (section.fontStack) { + options["text-font"] = ["literal", section.fontStack.split(',')]; + } + if (section.scale) { + options["font-scale"] = section.scale; + } + if (section.textColor) { + options["text-color"] = (["rgba"] ).concat(section.textColor.toArray()); + } + serialized.push(options); + } + return serialized; } +} - if (count) { - l = Math.min(count * stride + offset, a.length); - } else { - l = a.length; +// + + + + + + +class ResolvedImage { + + + + constructor(options ) { + this.name = options.name; + this.available = options.available; } - for (i = offset; i < l; i += stride) { - vec[0] = a[i]; - vec[1] = a[i + 1]; - vec[2] = a[i + 2]; - vec[3] = a[i + 3]; - fn(vec, vec, arg); - a[i] = vec[0]; - a[i + 1] = vec[1]; - a[i + 2] = vec[2]; - a[i + 3] = vec[3]; + toString() { + return this.name; } - return a; - }; -}(); + static fromString(name ) { + if (!name) return null; // treat empty values as no image + return new ResolvedImage({name, available: false}); + } -/** - * Quaternion - * @module quat - */ + serialize() { + return ["image", this.name]; + } +} -/** - * Creates a new identity quat - * - * @returns {quat} a new quaternion - */ +// -function create$6() { - var out = new ARRAY_TYPE(4); + - if (ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - } +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 + )) { + const 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.`; + } - out[3] = 1; - return out; + 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; } -/** - * Set a quat to the identity quaternion - * - * @param {quat} out the receiving quaternion - * @returns {quat} out - */ -function identity$4(out) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 1; - return out; -} -/** - * Sets a quat from the given angle and rotation axis, - * then returns it. - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyVec3} axis the axis around which to rotate - * @param {Number} rad the angle in radians - * @returns {quat} out - **/ + -function setAxisAngle(out, axis, rad) { - rad = rad * 0.5; - var s = Math.sin(rad); - out[0] = s * axis[0]; - out[1] = s * axis[1]; - out[2] = s * axis[2]; - out[3] = Math.cos(rad); - return out; +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 (mixed instanceof Collator) { + return true; + } else if (mixed instanceof Formatted) { + return true; + } else if (mixed instanceof ResolvedImage) { + return true; + } else if (Array.isArray(mixed)) { + for (const item of mixed) { + if (!isValue(item)) { + return false; + } + } + return true; + } else if (typeof mixed === 'object') { + for (const key in mixed) { + if (!isValue(mixed[key])) { + return false; + } + } + return true; + } else { + return false; + } } -/** - * Gets the rotation axis and angle for a given - * quaternion. If a quaternion is created with - * setAxisAngle, this method will return the same - * values as providied in the original parameter list - * OR functionally equivalent values. - * Example: The quaternion formed by axis [0, 0, 1] and - * angle -90 is the same as the quaternion formed by - * [0, 0, 1] and 270. This method favors the latter. - * @param {vec3} out_axis Vector receiving the axis of rotation - * @param {ReadonlyQuat} q Quaternion to be decomposed - * @return {Number} Angle, in radians, of the rotation - */ -function getAxisAngle(out_axis, q) { - var rad = Math.acos(q[3]) * 2.0; - var s = Math.sin(rad / 2.0); +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 (value instanceof Collator) { + return CollatorType; + } else if (value instanceof Formatted) { + return FormattedType; + } else if (value instanceof ResolvedImage) { + return ResolvedImageType; + } else if (Array.isArray(value)) { + const length = value.length; + let itemType ; - if (s > EPSILON) { - out_axis[0] = q[0] / s; - out_axis[1] = q[1] / s; - out_axis[2] = q[2] / s; - } else { - // If s is zero, return any axis (no rotation - axis does not matter) - out_axis[0] = 1; - out_axis[1] = 0; - out_axis[2] = 0; - } + for (const item of value) { + const t = typeOf(item); + if (!itemType) { + itemType = t; + } else if (itemType === t) { + continue; + } else { + itemType = ValueType; + break; + } + } - return rad; + return array$1(itemType || ValueType, length); + } else { + assert_1(typeof value === 'object'); + return ObjectType; + } } -/** - * Gets the angular distance between two unit quaternions - * - * @param {ReadonlyQuat} a Origin unit quaternion - * @param {ReadonlyQuat} b Destination unit quaternion - * @return {Number} Angle, in radians, between the two quaternions - */ -function getAngle(a, b) { - var dotproduct = dot$2(a, b); - return Math.acos(2 * dotproduct * dotproduct - 1); +function toString(value ) { + const type = typeof value; + if (value === null) { + return ''; + } else if (type === 'string' || type === 'number' || type === 'boolean') { + return String(value); + } else if (value instanceof Color || value instanceof Formatted || value instanceof ResolvedImage) { + return value.toString(); + } else { + return JSON.stringify(value); + } } -/** - * Multiplies two quat's - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a the first operand - * @param {ReadonlyQuat} b the second operand - * @returns {quat} out - */ -function multiply$6(out, a, b) { - var ax = a[0], - ay = a[1], - az = a[2], - aw = a[3]; - var bx = b[0], - by = b[1], - bz = b[2], - bw = b[3]; - out[0] = ax * bw + aw * bx + ay * bz - az * by; - out[1] = ay * bw + aw * by + az * bx - ax * bz; - out[2] = az * bw + aw * bz + ax * by - ay * bx; - out[3] = aw * bw - ax * bx - ay * by - az * bz; - return out; -} -/** - * Rotates a quaternion by the given angle about the X axis - * - * @param {quat} out quat receiving operation result - * @param {ReadonlyQuat} a quat to rotate - * @param {number} rad angle (in radians) to rotate - * @returns {quat} out - */ +// -function rotateX$2(out, a, rad) { - rad *= 0.5; - var ax = a[0], - ay = a[1], - az = a[2], - aw = a[3]; - var bx = Math.sin(rad), - bw = Math.cos(rad); - out[0] = ax * bw + aw * bx; - out[1] = ay * bw + az * bx; - out[2] = az * bw - ay * bx; - out[3] = aw * bw - ax * bx; - return out; -} -/** - * Rotates a quaternion by the given angle about the Y axis - * - * @param {quat} out quat receiving operation result - * @param {ReadonlyQuat} a quat to rotate - * @param {number} rad angle (in radians) to rotate - * @returns {quat} out - */ + + + + -function rotateY$2(out, a, rad) { - rad *= 0.5; - var ax = a[0], - ay = a[1], - az = a[2], - aw = a[3]; - var by = Math.sin(rad), - bw = Math.cos(rad); - out[0] = ax * bw - az * by; - out[1] = ay * bw + aw * by; - out[2] = az * bw + ax * by; - out[3] = aw * bw - ay * by; - return out; -} -/** - * Rotates a quaternion by the given angle about the Z axis - * - * @param {quat} out quat receiving operation result - * @param {ReadonlyQuat} a quat to rotate - * @param {number} rad angle (in radians) to rotate - * @returns {quat} out - */ +class Literal { + + -function rotateZ$2(out, a, rad) { - rad *= 0.5; - var ax = a[0], - ay = a[1], - az = a[2], - aw = a[3]; - var bz = Math.sin(rad), - bw = Math.cos(rad); - out[0] = ax * bw + ay * bz; - out[1] = ay * bw - ax * bz; - out[2] = az * bw + aw * bz; - out[3] = aw * bw - az * bz; - return out; -} -/** - * Calculates the W component of a quat from the X, Y, and Z components. - * Assumes that quaternion is 1 unit in length. - * Any existing W component will be ignored. - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a quat to calculate W component of - * @returns {quat} out - */ + constructor(type , value ) { + this.type = type; + this.value = value; + } -function calculateW(out, a) { - var x = a[0], - y = a[1], - z = a[2]; - out[0] = x; - out[1] = y; - out[2] = z; - out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z)); - return out; -} -/** - * Calculate the exponential of a unit quaternion. - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a quat to calculate the exponential of - * @returns {quat} out - */ + static parse(args , context ) { + if (args.length !== 2) + return context.error(`'literal' expression requires exactly one argument, but found ${args.length - 1} instead.`); -function exp(out, a) { - var x = a[0], - y = a[1], - z = a[2], - w = a[3]; - var r = Math.sqrt(x * x + y * y + z * z); - var et = Math.exp(w); - var s = r > 0 ? et * Math.sin(r) / r : 0; - out[0] = x * s; - out[1] = y * s; - out[2] = z * s; - out[3] = et * Math.cos(r); - return out; -} -/** - * Calculate the natural logarithm of a unit quaternion. - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a quat to calculate the exponential of - * @returns {quat} out - */ + if (!isValue(args[1])) + return context.error(`invalid value`); -function ln(out, a) { - var x = a[0], - y = a[1], - z = a[2], - w = a[3]; - var r = Math.sqrt(x * x + y * y + z * z); - var t = r > 0 ? Math.atan2(r, w) / r : 0; - out[0] = x * t; - out[1] = y * t; - out[2] = z * t; - out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w); - return out; -} -/** - * Calculate the scalar power of a unit quaternion. - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a quat to calculate the exponential of - * @param {Number} b amount to scale the quaternion by - * @returns {quat} out - */ + const value = (args[1] ); + let type = typeOf(value); -function pow(out, a, b) { - ln(out, a); - scale$6(out, out, b); - exp(out, out); - return out; -} -/** - * Performs a spherical linear interpolation between two quat - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a the first operand - * @param {ReadonlyQuat} b the second operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {quat} out - */ + // special case: infer the item type if possible for zero-length arrays + const expected = context.expectedType; + if ( + type.kind === 'array' && + type.N === 0 && + expected && + expected.kind === 'array' && + (typeof expected.N !== 'number' || expected.N === 0) + ) { + type = expected; + } -function slerp(out, a, b, t) { - // benchmarks: - // http://jsperf.com/quaternion-slerp-implementations - var ax = a[0], - ay = a[1], - az = a[2], - aw = a[3]; - var bx = b[0], - by = b[1], - bz = b[2], - bw = b[3]; - var omega, cosom, sinom, scale0, scale1; // calc cosine + return new Literal(type, value); + } - cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary) + evaluate() { + return this.value; + } - if (cosom < 0.0) { - cosom = -cosom; - bx = -bx; - by = -by; - bz = -bz; - bw = -bw; - } // calculate coefficients + eachChild() {} + outputDefined() { + return true; + } - if (1.0 - cosom > EPSILON) { - // standard case (slerp) - omega = Math.acos(cosom); - sinom = Math.sin(omega); - scale0 = Math.sin((1.0 - t) * omega) / sinom; - scale1 = Math.sin(t * omega) / sinom; - } else { - // "from" and "to" quaternions are very close - // ... so we can do a linear interpolation - scale0 = 1.0 - t; - scale1 = t; - } // calculate final values + serialize() { + if (this.type.kind === 'array' || this.type.kind === 'object') { + return ["literal", this.value]; + } else if (this.value instanceof Color) { + // Constant-folding can generate Literal expressions that you + // couldn't actually generate with a "literal" expression, + // so we have to implement an equivalent serialization here + return ["rgba"].concat(this.value.toArray()); + } else if (this.value instanceof Formatted) { + // Same as Color + return this.value.serialize(); + } else { + assert_1(this.value === null || + typeof this.value === 'string' || + typeof this.value === 'number' || + typeof this.value === 'boolean'); + return (this.value ); + } + } +} +// - out[0] = scale0 * ax + scale1 * bx; - out[1] = scale0 * ay + scale1 * by; - out[2] = scale0 * az + scale1 * bz; - out[3] = scale0 * aw + scale1 * bw; - return out; -} -/** - * Generates a random unit quaternion - * - * @param {quat} out the receiving quaternion - * @returns {quat} out - */ +class RuntimeError { + + -function random$2(out) { - // Implementation of http://planning.cs.uiuc.edu/node198.html - // TODO: Calling random 3 times is probably not the fastest solution - var u1 = RANDOM(); - var u2 = RANDOM(); - var u3 = RANDOM(); - var sqrt1MinusU1 = Math.sqrt(1 - u1); - var sqrtU1 = Math.sqrt(u1); - out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2); - out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2); - out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3); - out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3); - return out; + constructor(message ) { + this.name = 'ExpressionEvaluationError'; + this.message = message; + } + + toJSON() { + return this.message; + } } -/** - * Calculates the inverse of a quat - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a quat to calculate inverse of - * @returns {quat} out - */ -function invert$4(out, a) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3]; - var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3; - var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0 +// - out[0] = -a0 * invDot; - out[1] = -a1 * invDot; - out[2] = -a2 * invDot; - out[3] = a3 * invDot; - return out; -} -/** - * Calculates the conjugate of a quat - * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result. - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a quat to calculate conjugate of - * @returns {quat} out - */ + + + + -function conjugate(out, a) { - out[0] = -a[0]; - out[1] = -a[1]; - out[2] = -a[2]; - out[3] = a[3]; - return out; -} -/** - * Creates a quaternion from the given 3x3 rotation matrix. - * - * NOTE: The resultant quaternion is not normalized, so you should be sure - * to renormalize the quaternion yourself where necessary. - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyMat3} m rotation matrix - * @returns {quat} out - * @function - */ +const types$1 = { + string: StringType, + number: NumberType, + boolean: BooleanType, + object: ObjectType +}; -function fromMat3(out, m) { - // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes - // article "Quaternion Calculus and Fast Animation". - var fTrace = m[0] + m[4] + m[8]; - var fRoot; +class Assertion { + + - if (fTrace > 0.0) { - // |w| > 1/2, may as well choose w > 1/2 - fRoot = Math.sqrt(fTrace + 1.0); // 2w + constructor(type , args ) { + this.type = type; + this.args = args; + } - out[3] = 0.5 * fRoot; - fRoot = 0.5 / fRoot; // 1/(4w) + static parse(args , context ) { + if (args.length < 2) + return context.error(`Expected at least one argument.`); - out[0] = (m[5] - m[7]) * fRoot; - out[1] = (m[6] - m[2]) * fRoot; - out[2] = (m[1] - m[3]) * fRoot; - } else { - // |w| <= 1/2 - var i = 0; - if (m[4] > m[0]) i = 1; - if (m[8] > m[i * 3 + i]) i = 2; - var j = (i + 1) % 3; - var k = (i + 2) % 3; - fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0); - out[i] = 0.5 * fRoot; - fRoot = 0.5 / fRoot; - out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot; - out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot; - out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot; - } + let i = 1; + let type; - return out; -} -/** - * Creates a quaternion from the given euler angle x, y, z. - * - * @param {quat} out the receiving quaternion - * @param {x} Angle to rotate around X axis in degrees. - * @param {y} Angle to rotate around Y axis in degrees. - * @param {z} Angle to rotate around Z axis in degrees. - * @returns {quat} out - * @function - */ + const name = (args[0] ); + if (name === 'array') { + let itemType; + if (args.length > 2) { + const type = args[1]; + if (typeof type !== 'string' || !(type in types$1) || type === 'object') + return context.error('The item type argument of "array" must be one of string, number, boolean', 1); + itemType = types$1[type]; + i++; + } else { + itemType = ValueType; + } -function fromEuler(out, x, y, z) { - var halfToRad = 0.5 * Math.PI / 180.0; - x *= halfToRad; - y *= halfToRad; - z *= halfToRad; - var sx = Math.sin(x); - var cx = Math.cos(x); - var sy = Math.sin(y); - var cy = Math.cos(y); - var sz = Math.sin(z); - var cz = Math.cos(z); - out[0] = sx * cy * cz - cx * sy * sz; - out[1] = cx * sy * cz + sx * cy * sz; - out[2] = cx * cy * sz - sx * sy * cz; - out[3] = cx * cy * cz + sx * sy * sz; - return out; -} -/** - * Returns a string representation of a quatenion - * - * @param {ReadonlyQuat} a vector to represent as a string - * @returns {String} string representation of the vector - */ + let N; + if (args.length > 3) { + if (args[2] !== null && + (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]; + i++; + } -function str$6(a) { - return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; -} -/** - * Creates a new quat initialized with values from an existing quaternion - * - * @param {ReadonlyQuat} a quaternion to clone - * @returns {quat} a new quaternion - * @function - */ + type = array$1(itemType, N); + } else { + assert_1(types$1[name], name); + type = types$1[name]; + } -var clone$6 = clone$5; -/** - * Creates a new quat initialized with the given values - * - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @param {Number} w W component - * @returns {quat} a new quaternion - * @function - */ + const parsed = []; + for (; i < args.length; i++) { + const input = context.parse(args[i], i, ValueType); + if (!input) return null; + parsed.push(input); + } -var fromValues$6 = fromValues$5; -/** - * Copy the values from one quat to another - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a the source quaternion - * @returns {quat} out - * @function - */ + return new Assertion(type, parsed); + } -var copy$6 = copy$5; -/** - * Set the components of a quat to the given values - * - * @param {quat} out the receiving quaternion - * @param {Number} x X component - * @param {Number} y Y component - * @param {Number} z Z component - * @param {Number} w W component - * @returns {quat} out - * @function - */ + evaluate(ctx ) { + for (let i = 0; i < this.args.length; i++) { + const value = this.args[i].evaluate(ctx); + const error = checkSubtype(this.type, typeOf(value)); + if (!error) { + return value; + } else if (i === this.args.length - 1) { + throw new RuntimeError(`Expected value to be of type ${toString$1(this.type)}, but found ${toString$1(typeOf(value))} instead.`); + } + } -var set$6 = set$5; -/** - * Adds two quat's - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a the first operand - * @param {ReadonlyQuat} b the second operand - * @returns {quat} out - * @function - */ + assert_1(false); + return null; + } -var add$6 = add$5; -/** - * Alias for {@link quat.multiply} - * @function - */ + eachChild(fn ) { + this.args.forEach(fn); + } -var mul$6 = multiply$6; -/** - * Scales a quat by a scalar number - * - * @param {quat} out the receiving vector - * @param {ReadonlyQuat} a the vector to scale - * @param {Number} b amount to scale the vector by - * @returns {quat} out - * @function - */ + outputDefined() { + return this.args.every(arg => arg.outputDefined()); + } -var scale$6 = scale$5; -/** - * Calculates the dot product of two quat's - * - * @param {ReadonlyQuat} a the first operand - * @param {ReadonlyQuat} b the second operand - * @returns {Number} dot product of a and b - * @function - */ + serialize() { + const type = this.type; + const serialized = [type.kind]; + if (type.kind === 'array') { + const itemType = type.itemType; + if (itemType.kind === 'string' || + itemType.kind === 'number' || + itemType.kind === 'boolean') { + serialized.push(itemType.kind); + const N = type.N; + if (typeof N === 'number' || this.args.length > 1) { + serialized.push(N); + } + } + } + return serialized.concat(this.args.map(arg => arg.serialize())); + } +} -var dot$2 = dot$1; -/** - * Performs a linear interpolation between two quat's - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a the first operand - * @param {ReadonlyQuat} b the second operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {quat} out - * @function - */ +// -var lerp$2 = lerp$1; -/** - * Calculates the length of a quat - * - * @param {ReadonlyQuat} a vector to calculate length of - * @returns {Number} length of a - */ + + + + -var length$2 = length$1; -/** - * Alias for {@link quat.length} - * @function - */ + + + + + + + + -var len$2 = length$2; -/** - * Calculates the squared length of a quat - * - * @param {ReadonlyQuat} a vector to calculate squared length of - * @returns {Number} squared length of a - * @function - */ +class FormatExpression { + + -var squaredLength$2 = squaredLength$1; -/** - * Alias for {@link quat.squaredLength} - * @function - */ + constructor(sections ) { + this.type = FormattedType; + this.sections = sections; + } -var sqrLen$2 = squaredLength$2; -/** - * Normalize a quat - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a quaternion to normalize - * @returns {quat} out - * @function - */ + static parse(args , context ) { + if (args.length < 2) { + return context.error(`Expected at least one argument.`); + } -var normalize$2 = normalize$1; -/** - * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===) - * - * @param {ReadonlyQuat} a The first quaternion. - * @param {ReadonlyQuat} b The second quaternion. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ + const firstArg = args[1]; + if (!Array.isArray(firstArg) && typeof firstArg === 'object') { + return context.error(`First argument must be an image or text section.`); + } -var exactEquals$6 = exactEquals$5; -/** - * Returns whether or not the quaternions have approximately the same elements in the same position. - * - * @param {ReadonlyQuat} a The first vector. - * @param {ReadonlyQuat} b The second vector. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ + const sections = []; + let nextTokenMayBeObject = false; + for (let i = 1; i <= args.length - 1; ++i) { + const arg = (args[i] ); -var equals$7 = equals$6; -/** - * Sets a quaternion to represent the shortest rotation from one - * vector to another. - * - * Both vectors are assumed to be unit length. - * - * @param {quat} out the receiving quaternion. - * @param {ReadonlyVec3} a the initial vector - * @param {ReadonlyVec3} b the destination vector - * @returns {quat} out - */ + if (nextTokenMayBeObject && typeof arg === "object" && !Array.isArray(arg)) { + nextTokenMayBeObject = false; -var rotationTo = function () { - var tmpvec3 = create$4(); - var xUnitVec3 = fromValues$4(1, 0, 0); - var yUnitVec3 = fromValues$4(0, 1, 0); - return function (out, a, b) { - var dot$1 = dot(a, b); + let scale = null; + if (arg['font-scale']) { + scale = context.parse(arg['font-scale'], 1, NumberType); + if (!scale) return null; + } - if (dot$1 < -0.999999) { - cross(tmpvec3, xUnitVec3, a); - if (len(tmpvec3) < 0.000001) cross(tmpvec3, yUnitVec3, a); - normalize(tmpvec3, tmpvec3); - setAxisAngle(out, tmpvec3, Math.PI); - return out; - } else if (dot$1 > 0.999999) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 1; - return out; - } else { - cross(tmpvec3, a, b); - out[0] = tmpvec3[0]; - out[1] = tmpvec3[1]; - out[2] = tmpvec3[2]; - out[3] = 1 + dot$1; - return normalize$2(out, out); - } - }; -}(); -/** - * Performs a spherical linear interpolation with two control points - * - * @param {quat} out the receiving quaternion - * @param {ReadonlyQuat} a the first operand - * @param {ReadonlyQuat} b the second operand - * @param {ReadonlyQuat} c the third operand - * @param {ReadonlyQuat} d the fourth operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {quat} out - */ + let font = null; + if (arg['text-font']) { + font = context.parse(arg['text-font'], 1, array$1(StringType)); + if (!font) return null; + } -var sqlerp = function () { - var temp1 = create$6(); - var temp2 = create$6(); - return function (out, a, b, c, d, t) { - slerp(temp1, a, d, t); - slerp(temp2, b, c, t); - slerp(out, temp1, temp2, 2 * t * (1 - t)); - return out; - }; -}(); -/** - * Sets the specified quaternion with values corresponding to the given - * axes. Each axis is a vec3 and is expected to be unit length and - * perpendicular to all other specified axes. - * - * @param {ReadonlyVec3} view the vector representing the viewing direction - * @param {ReadonlyVec3} right the vector representing the local "right" direction - * @param {ReadonlyVec3} up the vector representing the local "up" direction - * @returns {quat} out - */ + let textColor = null; + if (arg['text-color']) { + textColor = context.parse(arg['text-color'], 1, ColorType); + if (!textColor) return null; + } -var setAxes = function () { - var matr = create$2(); - return function (out, view, right, up) { - matr[0] = right[0]; - matr[3] = right[1]; - matr[6] = right[2]; - matr[1] = up[0]; - matr[4] = up[1]; - matr[7] = up[2]; - matr[2] = -view[0]; - matr[5] = -view[1]; - matr[8] = -view[2]; - return normalize$2(out, fromMat3(out, matr)); - }; -}(); + const lastExpression = sections[sections.length - 1]; + lastExpression.scale = scale; + lastExpression.font = font; + lastExpression.textColor = textColor; + } else { + const content = context.parse(args[i], 1, ValueType); + if (!content) return null; -/** - * Dual Quaternion
- * Format: [real, dual]
- * Quaternion format: XYZW
- * Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.
- * @module quat2 - */ + const kind = content.type.kind; + if (kind !== 'string' && kind !== 'value' && kind !== 'null' && kind !== 'resolvedImage') + return context.error(`Formatted text type must be 'string', 'value', 'image' or 'null'.`); -/** - * Creates a new identity dual quat - * - * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation] - */ + nextTokenMayBeObject = true; + sections.push({content, scale: null, font: null, textColor: null}); + } + } -function create$7() { - var dq = new ARRAY_TYPE(8); + return new FormatExpression(sections); + } - if (ARRAY_TYPE != Float32Array) { - dq[0] = 0; - dq[1] = 0; - dq[2] = 0; - dq[4] = 0; - dq[5] = 0; - dq[6] = 0; - dq[7] = 0; - } + evaluate(ctx ) { + const evaluateSection = section => { + const evaluatedContent = section.content.evaluate(ctx); + if (typeOf(evaluatedContent) === ResolvedImageType) { + return new FormattedSection('', evaluatedContent, null, null, null); + } - dq[3] = 1; - return dq; -} -/** - * Creates a new quat initialized with values from an existing quaternion - * - * @param {ReadonlyQuat2} a dual quaternion to clone - * @returns {quat2} new dual quaternion - * @function - */ + return new FormattedSection( + toString(evaluatedContent), + null, + section.scale ? section.scale.evaluate(ctx) : null, + section.font ? section.font.evaluate(ctx).join(',') : null, + section.textColor ? section.textColor.evaluate(ctx) : null + ); + }; -function clone$7(a) { - var dq = new ARRAY_TYPE(8); - dq[0] = a[0]; - dq[1] = a[1]; - dq[2] = a[2]; - dq[3] = a[3]; - dq[4] = a[4]; - dq[5] = a[5]; - dq[6] = a[6]; - dq[7] = a[7]; - return dq; -} -/** - * Creates a new dual quat initialized with the given values - * - * @param {Number} x1 X component - * @param {Number} y1 Y component - * @param {Number} z1 Z component - * @param {Number} w1 W component - * @param {Number} x2 X component - * @param {Number} y2 Y component - * @param {Number} z2 Z component - * @param {Number} w2 W component - * @returns {quat2} new dual quaternion - * @function - */ + return new Formatted(this.sections.map(evaluateSection)); + } -function fromValues$7(x1, y1, z1, w1, x2, y2, z2, w2) { - var dq = new ARRAY_TYPE(8); - dq[0] = x1; - dq[1] = y1; - dq[2] = z1; - dq[3] = w1; - dq[4] = x2; - dq[5] = y2; - dq[6] = z2; - dq[7] = w2; - return dq; + eachChild(fn ) { + for (const section of this.sections) { + fn(section.content); + if (section.scale) { + fn(section.scale); + } + if (section.font) { + fn(section.font); + } + if (section.textColor) { + fn(section.textColor); + } + } + } + + outputDefined() { + // Technically the combinatoric set of all children + // Usually, this.text will be undefined anyway + return false; + } + + serialize() { + const serialized = ["format"]; + for (const section of this.sections) { + serialized.push(section.content.serialize()); + const options = {}; + if (section.scale) { + options['font-scale'] = section.scale.serialize(); + } + if (section.font) { + options['text-font'] = section.font.serialize(); + } + if (section.textColor) { + options['text-color'] = section.textColor.serialize(); + } + serialized.push(options); + } + return serialized; + } } -/** - * Creates a new dual quat from the given values (quat and translation) - * - * @param {Number} x1 X component - * @param {Number} y1 Y component - * @param {Number} z1 Z component - * @param {Number} w1 W component - * @param {Number} x2 X component (translation) - * @param {Number} y2 Y component (translation) - * @param {Number} z2 Z component (translation) - * @returns {quat2} new dual quaternion - * @function - */ -function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) { - var dq = new ARRAY_TYPE(8); - dq[0] = x1; - dq[1] = y1; - dq[2] = z1; - dq[3] = w1; - var ax = x2 * 0.5, - ay = y2 * 0.5, - az = z2 * 0.5; - dq[4] = ax * w1 + ay * z1 - az * y1; - dq[5] = ay * w1 + az * x1 - ax * z1; - dq[6] = az * w1 + ax * y1 - ay * x1; - dq[7] = -ax * x1 - ay * y1 - az * z1; - return dq; -} -/** - * Creates a dual quat from a quaternion and a translation - * - * @param {ReadonlyQuat2} dual quaternion receiving operation result - * @param {ReadonlyQuat} q a normalized quaternion - * @param {ReadonlyVec3} t tranlation vector - * @returns {quat2} dual quaternion receiving operation result - * @function - */ +// -function fromRotationTranslation$1(out, q, t) { - var ax = t[0] * 0.5, - ay = t[1] * 0.5, - az = t[2] * 0.5, - bx = q[0], - by = q[1], - bz = q[2], - bw = q[3]; - out[0] = bx; - out[1] = by; - out[2] = bz; - out[3] = bw; - out[4] = ax * bw + ay * bz - az * by; - out[5] = ay * bw + az * bx - ax * bz; - out[6] = az * bw + ax * by - ay * bx; - out[7] = -ax * bx - ay * by - az * bz; - return out; -} -/** - * Creates a dual quat from a translation - * - * @param {ReadonlyQuat2} dual quaternion receiving operation result - * @param {ReadonlyVec3} t translation vector - * @returns {quat2} dual quaternion receiving operation result - * @function - */ + + + + -function fromTranslation$3(out, t) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 1; - out[4] = t[0] * 0.5; - out[5] = t[1] * 0.5; - out[6] = t[2] * 0.5; - out[7] = 0; - return out; -} -/** - * Creates a dual quat from a quaternion - * - * @param {ReadonlyQuat2} dual quaternion receiving operation result - * @param {ReadonlyQuat} q the quaternion - * @returns {quat2} dual quaternion receiving operation result - * @function - */ +class ImageExpression { + + -function fromRotation$4(out, q) { - out[0] = q[0]; - out[1] = q[1]; - out[2] = q[2]; - out[3] = q[3]; - out[4] = 0; - out[5] = 0; - out[6] = 0; - out[7] = 0; - return out; -} -/** - * Creates a new dual quat from a matrix (4x4) - * - * @param {quat2} out the dual quaternion - * @param {ReadonlyMat4} a the matrix - * @returns {quat2} dual quat receiving operation result - * @function - */ + constructor(input ) { + this.type = ResolvedImageType; + this.input = input; + } -function fromMat4$1(out, a) { - //TODO Optimize this - var outer = create$6(); - getRotation(outer, a); - var t = new ARRAY_TYPE(3); - getTranslation(t, a); - fromRotationTranslation$1(out, outer, t); - return out; -} -/** - * Copy the values from one dual quat to another - * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat2} a the source dual quaternion - * @returns {quat2} out - * @function - */ + static parse(args , context ) { + if (args.length !== 2) { + return context.error(`Expected two arguments.`); + } -function copy$7(out, a) { - out[0] = a[0]; - out[1] = a[1]; - out[2] = a[2]; - out[3] = a[3]; - out[4] = a[4]; - out[5] = a[5]; - out[6] = a[6]; - out[7] = a[7]; - return out; -} -/** - * Set a dual quat to the identity dual quaternion - * - * @param {quat2} out the receiving quaternion - * @returns {quat2} out - */ + const name = context.parse(args[1], 1, StringType); + if (!name) return context.error(`No image name provided.`); -function identity$5(out) { - out[0] = 0; - out[1] = 0; - out[2] = 0; - out[3] = 1; - out[4] = 0; - out[5] = 0; - out[6] = 0; - out[7] = 0; - return out; -} -/** - * Set the components of a dual quat to the given values - * - * @param {quat2} out the receiving quaternion - * @param {Number} x1 X component - * @param {Number} y1 Y component - * @param {Number} z1 Z component - * @param {Number} w1 W component - * @param {Number} x2 X component - * @param {Number} y2 Y component - * @param {Number} z2 Z component - * @param {Number} w2 W component - * @returns {quat2} out - * @function - */ + return new ImageExpression(name); + } -function set$7(out, x1, y1, z1, w1, x2, y2, z2, w2) { - out[0] = x1; - out[1] = y1; - out[2] = z1; - out[3] = w1; - out[4] = x2; - out[5] = y2; - out[6] = z2; - out[7] = w2; - return out; -} -/** - * Gets the real part of a dual quat - * @param {quat} out real part - * @param {ReadonlyQuat2} a Dual Quaternion - * @return {quat} real part - */ + evaluate(ctx ) { + const evaluatedImageName = this.input.evaluate(ctx); -var getReal = copy$6; -/** - * Gets the dual part of a dual quat - * @param {quat} out dual part - * @param {ReadonlyQuat2} a Dual Quaternion - * @return {quat} dual part - */ + const value = ResolvedImage.fromString(evaluatedImageName); + if (value && ctx.availableImages) value.available = ctx.availableImages.indexOf(evaluatedImageName) > -1; -function getDual(out, a) { - out[0] = a[4]; - out[1] = a[5]; - out[2] = a[6]; - out[3] = a[7]; - return out; -} -/** - * Set the real component of a dual quat to the given quaternion - * - * @param {quat2} out the receiving quaternion - * @param {ReadonlyQuat} q a quaternion representing the real part - * @returns {quat2} out - * @function - */ + return value; + } -var setReal = copy$6; -/** - * Set the dual component of a dual quat to the given quaternion - * - * @param {quat2} out the receiving quaternion - * @param {ReadonlyQuat} q a quaternion representing the dual part - * @returns {quat2} out - * @function - */ + eachChild(fn ) { + fn(this.input); + } -function setDual(out, q) { - out[4] = q[0]; - out[5] = q[1]; - out[6] = q[2]; - out[7] = q[3]; - return out; -} -/** - * Gets the translation of a normalized dual quat - * @param {vec3} out translation - * @param {ReadonlyQuat2} a Dual Quaternion to be decomposed - * @return {vec3} translation - */ + outputDefined() { + // The output of image is determined by the list of available images in the evaluation context + return false; + } -function getTranslation$1(out, a) { - var ax = a[4], - ay = a[5], - az = a[6], - aw = a[7], - bx = -a[0], - by = -a[1], - bz = -a[2], - bw = a[3]; - out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; - out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; - out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; - return out; + serialize() { + return ["image", this.input.serialize()]; + } } -/** - * Translates a dual quat by the given vector - * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat2} a the dual quaternion to translate - * @param {ReadonlyVec3} v vector to translate by - * @returns {quat2} out - */ -function translate$3(out, a, v) { - var ax1 = a[0], - ay1 = a[1], - az1 = a[2], - aw1 = a[3], - bx1 = v[0] * 0.5, - by1 = v[1] * 0.5, - bz1 = v[2] * 0.5, - ax2 = a[4], - ay2 = a[5], - az2 = a[6], - aw2 = a[7]; - out[0] = ax1; - out[1] = ay1; - out[2] = az1; - out[3] = aw1; - out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2; - out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2; - out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2; - out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2; - return out; -} -/** - * Rotates a dual quat around the X axis - * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat2} a the dual quaternion to rotate - * @param {number} rad how far should the rotation be - * @returns {quat2} out - */ +// -function rotateX$3(out, a, rad) { - var bx = -a[0], - by = -a[1], - bz = -a[2], - bw = a[3], - ax = a[4], - ay = a[5], - az = a[6], - aw = a[7], - ax1 = ax * bw + aw * bx + ay * bz - az * by, - ay1 = ay * bw + aw * by + az * bx - ax * bz, - az1 = az * bw + aw * bz + ax * by - ay * bx, - aw1 = aw * bw - ax * bx - ay * by - az * bz; - rotateX$2(out, a, rad); - bx = out[0]; - by = out[1]; - bz = out[2]; - bw = out[3]; - out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; - out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; - out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; - out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; - return out; -} -/** - * Rotates a dual quat around the Y axis - * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat2} a the dual quaternion to rotate - * @param {number} rad how far should the rotation be - * @returns {quat2} out - */ + + + + -function rotateY$3(out, a, rad) { - var bx = -a[0], - by = -a[1], - bz = -a[2], - bw = a[3], - ax = a[4], - ay = a[5], - az = a[6], - aw = a[7], - ax1 = ax * bw + aw * bx + ay * bz - az * by, - ay1 = ay * bw + aw * by + az * bx - ax * bz, - az1 = az * bw + aw * bz + ax * by - ay * bx, - aw1 = aw * bw - ax * bx - ay * by - az * bz; - rotateY$2(out, a, rad); - bx = out[0]; - by = out[1]; - bz = out[2]; - bw = out[3]; - out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; - out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; - out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; - out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; - return out; -} -/** - * Rotates a dual quat around the Z axis - * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat2} a the dual quaternion to rotate - * @param {number} rad how far should the rotation be - * @returns {quat2} out - */ +const types = { + 'to-boolean': BooleanType, + 'to-color': ColorType, + 'to-number': NumberType, + 'to-string': StringType +}; -function rotateZ$3(out, a, rad) { - var bx = -a[0], - by = -a[1], - bz = -a[2], - bw = a[3], - ax = a[4], - ay = a[5], - az = a[6], - aw = a[7], - ax1 = ax * bw + aw * bx + ay * bz - az * by, - ay1 = ay * bw + aw * by + az * bx - ax * bz, - az1 = az * bw + aw * bz + ax * by - ay * bx, - aw1 = aw * bw - ax * bx - ay * by - az * bz; - rotateZ$2(out, a, rad); - bx = out[0]; - by = out[1]; - bz = out[2]; - bw = out[3]; - out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; - out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; - out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; - out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; - return out; -} /** - * Rotates a dual quat by a given quaternion (a * q) + * 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. * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat2} a the dual quaternion to rotate - * @param {ReadonlyQuat} q quaternion to rotate by - * @returns {quat2} out + * @private */ +class Coercion { + + -function rotateByQuatAppend(out, a, q) { - var qx = q[0], - qy = q[1], - qz = q[2], - qw = q[3], - ax = a[0], - ay = a[1], - az = a[2], - aw = a[3]; - out[0] = ax * qw + aw * qx + ay * qz - az * qy; - out[1] = ay * qw + aw * qy + az * qx - ax * qz; - out[2] = az * qw + aw * qz + ax * qy - ay * qx; - out[3] = aw * qw - ax * qx - ay * qy - az * qz; - ax = a[4]; - ay = a[5]; - az = a[6]; - aw = a[7]; - out[4] = ax * qw + aw * qx + ay * qz - az * qy; - out[5] = ay * qw + aw * qy + az * qx - ax * qz; - out[6] = az * qw + aw * qz + ax * qy - ay * qx; - out[7] = aw * qw - ax * qx - ay * qy - az * qz; - return out; -} -/** - * Rotates a dual quat by a given quaternion (q * a) - * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat} q quaternion to rotate by - * @param {ReadonlyQuat2} a the dual quaternion to rotate - * @returns {quat2} out - */ + constructor(type , args ) { + this.type = type; + this.args = args; + } -function rotateByQuatPrepend(out, q, a) { - var qx = q[0], - qy = q[1], - qz = q[2], - qw = q[3], - bx = a[0], - by = a[1], - bz = a[2], - bw = a[3]; - out[0] = qx * bw + qw * bx + qy * bz - qz * by; - out[1] = qy * bw + qw * by + qz * bx - qx * bz; - out[2] = qz * bw + qw * bz + qx * by - qy * bx; - out[3] = qw * bw - qx * bx - qy * by - qz * bz; - bx = a[4]; - by = a[5]; - bz = a[6]; - bw = a[7]; - out[4] = qx * bw + qw * bx + qy * bz - qz * by; - out[5] = qy * bw + qw * by + qz * bx - qx * bz; - out[6] = qz * bw + qw * bz + qx * by - qy * bx; - out[7] = qw * bw - qx * bx - qy * by - qz * bz; - return out; -} -/** - * Rotates a dual quat around a given axis. Does the normalisation automatically - * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat2} a the dual quaternion to rotate - * @param {ReadonlyVec3} axis the axis to rotate around - * @param {Number} rad how far the rotation should be - * @returns {quat2} out - */ + static parse(args , context ) { + if (args.length < 2) + return context.error(`Expected at least one argument.`); -function rotateAroundAxis(out, a, axis, rad) { - //Special case for rad = 0 - if (Math.abs(rad) < EPSILON) { - return copy$7(out, a); - } + const name = (args[0] ); + assert_1(types[name], name); - var axisLength = Math.hypot(axis[0], axis[1], axis[2]); - rad = rad * 0.5; - var s = Math.sin(rad); - var bx = s * axis[0] / axisLength; - var by = s * axis[1] / axisLength; - var bz = s * axis[2] / axisLength; - var bw = Math.cos(rad); - var ax1 = a[0], - ay1 = a[1], - az1 = a[2], - aw1 = a[3]; - out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; - out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; - out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; - out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; - var ax = a[4], - ay = a[5], - az = a[6], - aw = a[7]; - out[4] = ax * bw + aw * bx + ay * bz - az * by; - out[5] = ay * bw + aw * by + az * bx - ax * bz; - out[6] = az * bw + aw * bz + ax * by - ay * bx; - out[7] = aw * bw - ax * bx - ay * by - az * bz; - return out; -} -/** - * Adds two dual quat's - * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat2} a the first operand - * @param {ReadonlyQuat2} b the second operand - * @returns {quat2} out - * @function - */ + if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2) + return context.error(`Expected one argument.`); -function add$7(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - out[2] = a[2] + b[2]; - out[3] = a[3] + b[3]; - out[4] = a[4] + b[4]; - out[5] = a[5] + b[5]; - out[6] = a[6] + b[6]; - out[7] = a[7] + b[7]; - return out; -} -/** - * Multiplies two dual quat's - * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat2} a the first operand - * @param {ReadonlyQuat2} b the second operand - * @returns {quat2} out - */ + const type = types[name]; -function multiply$7(out, a, b) { - var ax0 = a[0], - ay0 = a[1], - az0 = a[2], - aw0 = a[3], - bx1 = b[4], - by1 = b[5], - bz1 = b[6], - bw1 = b[7], - ax1 = a[4], - ay1 = a[5], - az1 = a[6], - aw1 = a[7], - bx0 = b[0], - by0 = b[1], - bz0 = b[2], - bw0 = b[3]; - out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0; - out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0; - out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0; - out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0; - out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0; - out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0; - out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0; - out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0; - return out; -} -/** - * Alias for {@link quat2.multiply} - * @function - */ + const parsed = []; + for (let i = 1; i < args.length; i++) { + const input = context.parse(args[i], i, ValueType); + if (!input) return null; + parsed.push(input); + } -var mul$7 = multiply$7; -/** - * Scales a dual quat by a scalar number - * - * @param {quat2} out the receiving dual quat - * @param {ReadonlyQuat2} a the dual quat to scale - * @param {Number} b amount to scale the dual quat by - * @returns {quat2} out - * @function - */ + return new Coercion(type, parsed); + } -function scale$7(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - out[2] = a[2] * b; - out[3] = a[3] * b; - out[4] = a[4] * b; - out[5] = a[5] * b; - out[6] = a[6] * b; - out[7] = a[7] * b; - return out; -} -/** - * Calculates the dot product of two dual quat's (The dot product of the real parts) - * - * @param {ReadonlyQuat2} a the first operand - * @param {ReadonlyQuat2} b the second operand - * @returns {Number} dot product of a and b - * @function - */ + evaluate(ctx ) { + if (this.type.kind === 'boolean') { + return Boolean(this.args[0].evaluate(ctx)); + } else if (this.type.kind === 'color') { + let input; + let error; + for (const arg of this.args) { + input = arg.evaluate(ctx); + error = null; + if (input instanceof Color) { + return input; + } else if (typeof input === 'string') { + const 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 : String(JSON.stringify(input))}'`); + } else if (this.type.kind === 'number') { + let value = null; + for (const arg of this.args) { + value = arg.evaluate(ctx); + if (value === null) return 0; + const num = Number(value); + if (isNaN(num)) continue; + return num; + } + throw new RuntimeError(`Could not convert ${JSON.stringify(value)} to number.`); + } else if (this.type.kind === 'formatted') { + // There is no explicit 'to-formatted' but this coercion can be implicitly + // created by properties that expect the 'formatted' type. + return Formatted.fromString(toString(this.args[0].evaluate(ctx))); + } else if (this.type.kind === 'resolvedImage') { + return ResolvedImage.fromString(toString(this.args[0].evaluate(ctx))); + } else { + return toString(this.args[0].evaluate(ctx)); + } + } -var dot$3 = dot$2; -/** - * Performs a linear interpolation between two dual quats's - * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5) - * - * @param {quat2} out the receiving dual quat - * @param {ReadonlyQuat2} a the first operand - * @param {ReadonlyQuat2} b the second operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {quat2} out - */ + eachChild(fn ) { + this.args.forEach(fn); + } -function lerp$3(out, a, b, t) { - var mt = 1 - t; - if (dot$3(a, b) < 0) t = -t; - out[0] = a[0] * mt + b[0] * t; - out[1] = a[1] * mt + b[1] * t; - out[2] = a[2] * mt + b[2] * t; - out[3] = a[3] * mt + b[3] * t; - out[4] = a[4] * mt + b[4] * t; - out[5] = a[5] * mt + b[5] * t; - out[6] = a[6] * mt + b[6] * t; - out[7] = a[7] * mt + b[7] * t; - return out; -} -/** - * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper - * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat2} a dual quat to calculate inverse of - * @returns {quat2} out - */ + outputDefined() { + return this.args.every(arg => arg.outputDefined()); + } -function invert$5(out, a) { - var sqlen = squaredLength$3(a); - out[0] = -a[0] / sqlen; - out[1] = -a[1] / sqlen; - out[2] = -a[2] / sqlen; - out[3] = a[3] / sqlen; - out[4] = -a[4] / sqlen; - out[5] = -a[5] / sqlen; - out[6] = -a[6] / sqlen; - out[7] = a[7] / sqlen; - return out; -} -/** - * Calculates the conjugate of a dual quat - * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result. - * - * @param {quat2} out the receiving quaternion - * @param {ReadonlyQuat2} a quat to calculate conjugate of - * @returns {quat2} out - */ + serialize() { + if (this.type.kind === 'formatted') { + return new FormatExpression([{content: this.args[0], scale: null, font: null, textColor: null}]).serialize(); + } -function conjugate$1(out, a) { - out[0] = -a[0]; - out[1] = -a[1]; - out[2] = -a[2]; - out[3] = a[3]; - out[4] = -a[4]; - out[5] = -a[5]; - out[6] = -a[6]; - out[7] = a[7]; - return out; + if (this.type.kind === 'resolvedImage') { + return new ImageExpression(this.args[0]).serialize(); + } + + const serialized = [`to-${this.type.kind}`]; + this.eachChild(child => { serialized.push(child.serialize()); }); + return serialized; + } } -/** - * Calculates the length of a dual quat - * - * @param {ReadonlyQuat2} a dual quat to calculate length of - * @returns {Number} length of a - * @function - */ -var length$3 = length$2; -/** - * Alias for {@link quat2.length} - * @function - */ +// -var len$3 = length$3; -/** - * Calculates the squared length of a dual quat - * - * @param {ReadonlyQuat2} a dual quat to calculate squared length of - * @returns {Number} squared length of a - * @function - */ + + + + + -var squaredLength$3 = squaredLength$2; -/** - * Alias for {@link quat2.squaredLength} - * @function - */ +const geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon']; -var sqrLen$3 = squaredLength$3; -/** - * Normalize a dual quat - * - * @param {quat2} out the receiving dual quaternion - * @param {ReadonlyQuat2} a dual quaternion to normalize - * @returns {quat2} out - * @function - */ +class EvaluationContext { + + + + + + + + -function normalize$3(out, a) { - var magnitude = squaredLength$3(a); + - if (magnitude > 0) { - magnitude = Math.sqrt(magnitude); - var a0 = a[0] / magnitude; - var a1 = a[1] / magnitude; - var a2 = a[2] / magnitude; - var a3 = a[3] / magnitude; - var b0 = a[4]; - var b1 = a[5]; - var b2 = a[6]; - var b3 = a[7]; - var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3; - out[0] = a0; - out[1] = a1; - out[2] = a2; - out[3] = a3; - out[4] = (b0 - a0 * a_dot_b) / magnitude; - out[5] = (b1 - a1 * a_dot_b) / magnitude; - out[6] = (b2 - a2 * a_dot_b) / magnitude; - out[7] = (b3 - a3 * a_dot_b) / magnitude; - } + constructor() { + this.globals = (null ); + this.feature = null; + this.featureState = null; + this.formattedSection = null; + this._parseColorCache = {}; + this.availableImages = null; + this.canonical = null; + this.featureTileCoord = null; + this.featureDistanceData = null; + } - return out; -} -/** - * Returns a string representation of a dual quatenion - * - * @param {ReadonlyQuat2} a dual quaternion to represent as a string - * @returns {String} string representation of the dual quat - */ + id() { + return this.feature && 'id' in this.feature && this.feature.id ? this.feature.id : null; + } -function str$7(a) { - return "quat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ")"; -} -/** - * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===) - * - * @param {ReadonlyQuat2} a the first dual quaternion. - * @param {ReadonlyQuat2} b the second dual quaternion. - * @returns {Boolean} true if the dual quaternions are equal, false otherwise. - */ + geometryType() { + return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null; + } -function exactEquals$7(a, b) { - return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7]; -} -/** - * Returns whether or not the dual quaternions have approximately the same elements in the same position. - * - * @param {ReadonlyQuat2} a the first dual quat. - * @param {ReadonlyQuat2} b the second dual quat. - * @returns {Boolean} true if the dual quats are equal, false otherwise. - */ + geometry() { + return this.feature && 'geometry' in this.feature ? this.feature.geometry : null; + } -function equals$8(a, b) { - var a0 = a[0], - a1 = a[1], - a2 = a[2], - a3 = a[3], - a4 = a[4], - a5 = a[5], - a6 = a[6], - a7 = a[7]; - var b0 = b[0], - b1 = b[1], - b2 = b[2], - b3 = b[3], - b4 = b[4], - b5 = b[5], - b6 = b[6], - b7 = b[7]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)); -} + canonicalID() { + return this.canonical; + } -/** - * 2 Dimensional Vector - * @module vec2 - */ + properties() { + return (this.feature && this.feature.properties) || {}; + } -/** - * Creates a new, empty vec2 - * - * @returns {vec2} a new 2D vector - */ + distanceFromCenter() { + if (this.featureTileCoord && this.featureDistanceData) { -function create$8() { - var out = new ARRAY_TYPE(2); + const c = this.featureDistanceData.center; + const scale = this.featureDistanceData.scale; + const {x, y} = this.featureTileCoord; - if (ARRAY_TYPE != Float32Array) { - out[0] = 0; - out[1] = 0; - } + // Calculate the distance vector `d` (left handed) + const dX = x * scale - c[0]; + const dY = y * scale - c[1]; - return out; -} -/** - * Creates a new vec2 initialized with values from an existing vector - * - * @param {ReadonlyVec2} a vector to clone - * @returns {vec2} a new 2D vector - */ + // The bearing vector `b` (left handed) + const bX = this.featureDistanceData.bearing[0]; + const bY = this.featureDistanceData.bearing[1]; -function clone$8(a) { - var out = new ARRAY_TYPE(2); - out[0] = a[0]; - out[1] = a[1]; - return out; -} -/** - * Creates a new vec2 initialized with the given values - * - * @param {Number} x X component - * @param {Number} y Y component - * @returns {vec2} a new 2D vector - */ + // Distance is calculated as `dot(d, v)` + const dist = (bX * dX + bY * dY); + return dist; + } -function fromValues$8(x, y) { - var out = new ARRAY_TYPE(2); - out[0] = x; - out[1] = y; - return out; -} -/** - * Copy the values from one vec2 to another - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the source vector - * @returns {vec2} out - */ + return 0; + } -function copy$8(out, a) { - out[0] = a[0]; - out[1] = a[1]; - return out; + parseColor(input ) { + let cached = this._parseColorCache[input]; + if (!cached) { + cached = this._parseColorCache[input] = Color.parse(input); + } + return cached; + } } -/** - * Set the components of a vec2 to the given values - * - * @param {vec2} out the receiving vector - * @param {Number} x X component - * @param {Number} y Y component - * @returns {vec2} out - */ -function set$8(out, x, y) { - out[0] = x; - out[1] = y; - return out; -} -/** - * Adds two vec2's - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @returns {vec2} out - */ +// -function add$8(out, a, b) { - out[0] = a[0] + b[0]; - out[1] = a[1] + b[1]; - return out; -} -/** - * Subtracts vector b from vector a - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @returns {vec2} out - */ + + + -function subtract$6(out, a, b) { - out[0] = a[0] - b[0]; - out[1] = a[1] - b[1]; - return out; -} -/** - * Multiplies two vec2's - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @returns {vec2} out - */ + + + + + -function multiply$8(out, a, b) { - out[0] = a[0] * b[0]; - out[1] = a[1] * b[1]; - return out; -} -/** - * Divides two vec2's - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @returns {vec2} out - */ +class CompoundExpression { + + + + -function divide$2(out, a, b) { - out[0] = a[0] / b[0]; - out[1] = a[1] / b[1]; - return out; -} -/** - * Math.ceil the components of a vec2 - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a vector to ceil - * @returns {vec2} out - */ + -function ceil$2(out, a) { - out[0] = Math.ceil(a[0]); - out[1] = Math.ceil(a[1]); - return out; -} -/** - * Math.floor the components of a vec2 - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a vector to floor - * @returns {vec2} out - */ + constructor(name , type , evaluate , args ) { + this.name = name; + this.type = type; + this._evaluate = evaluate; + this.args = args; + } -function floor$2(out, a) { - out[0] = Math.floor(a[0]); - out[1] = Math.floor(a[1]); - return out; -} -/** - * Returns the minimum of two vec2's - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @returns {vec2} out - */ + evaluate(ctx ) { + return this._evaluate(ctx, this.args); + } -function min$2(out, a, b) { - out[0] = Math.min(a[0], b[0]); - out[1] = Math.min(a[1], b[1]); - return out; -} -/** - * Returns the maximum of two vec2's - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @returns {vec2} out - */ + eachChild(fn ) { + this.args.forEach(fn); + } -function max$2(out, a, b) { - out[0] = Math.max(a[0], b[0]); - out[1] = Math.max(a[1], b[1]); - return out; -} -/** - * Math.round the components of a vec2 - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a vector to round - * @returns {vec2} out - */ + outputDefined() { + return false; + } -function round$2(out, a) { - out[0] = Math.round(a[0]); - out[1] = Math.round(a[1]); - return out; -} -/** - * Scales a vec2 by a scalar number - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the vector to scale - * @param {Number} b amount to scale the vector by - * @returns {vec2} out - */ + serialize() { + return [this.name].concat(this.args.map(arg => arg.serialize())); + } -function scale$8(out, a, b) { - out[0] = a[0] * b; - out[1] = a[1] * b; - return out; -} -/** - * Adds two vec2's after scaling the second operand by a scalar value - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @param {Number} scale the amount to scale b by before adding - * @returns {vec2} out - */ + static parse(args , context ) { + const op = (args[0] ); + const definition = CompoundExpression.definitions[op]; + if (!definition) { + return context.error(`Unknown expression "${op}". If you wanted a literal array, use ["literal", [...]].`, 0); + } -function scaleAndAdd$2(out, a, b, scale) { - out[0] = a[0] + b[0] * scale; - out[1] = a[1] + b[1] * scale; - return out; -} -/** - * Calculates the euclidian distance between two vec2's - * - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @returns {Number} distance between a and b - */ + // Now check argument types against each signature + const type = Array.isArray(definition) ? + definition[0] : definition.type; -function distance$2(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1]; - return Math.hypot(x, y); -} -/** - * Calculates the squared euclidian distance between two vec2's - * - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @returns {Number} squared distance between a and b - */ + const availableOverloads = Array.isArray(definition) ? + [[definition[1], definition[2]]] : + definition.overloads; -function squaredDistance$2(a, b) { - var x = b[0] - a[0], - y = b[1] - a[1]; - return x * x + y * y; -} -/** - * Calculates the length of a vec2 - * - * @param {ReadonlyVec2} a vector to calculate length of - * @returns {Number} length of a - */ + const overloads = availableOverloads.filter(([signature]) => ( + !Array.isArray(signature) || // varags + signature.length === args.length - 1 // correct param count + )); -function length$4(a) { - var x = a[0], - y = a[1]; - return Math.hypot(x, y); -} -/** - * Calculates the squared length of a vec2 - * - * @param {ReadonlyVec2} a vector to calculate squared length of - * @returns {Number} squared length of a - */ + let signatureContext = (null ); -function squaredLength$4(a) { - var x = a[0], - y = a[1]; - return x * x + y * y; -} -/** - * Negates the components of a vec2 - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a vector to negate - * @returns {vec2} out - */ + for (const [params, evaluate] of overloads) { + // Use a fresh context for each attempted signature so that, if + // we eventually succeed, we haven't polluted `context.errors`. + signatureContext = new ParsingContext$1(context.registry, context.path, null, context.scope); -function negate$2(out, a) { - out[0] = -a[0]; - out[1] = -a[1]; - return out; + // First parse all the args, potentially coercing to the + // types expected by this overload. + const parsedArgs = []; + let argParseFailed = false; + for (let i = 1; i < args.length; i++) { + const arg = args[i]; + const expectedType = Array.isArray(params) ? + params[i - 1] : + params.type; + + const parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType); + if (!parsed) { + argParseFailed = true; + break; + } + parsedArgs.push(parsed); + } + if (argParseFailed) { + // Couldn't coerce args of this overload to expected type, move + // on to next one. + continue; + } + + if (Array.isArray(params)) { + if (params.length !== parsedArgs.length) { + signatureContext.error(`Expected ${params.length} arguments, but found ${parsedArgs.length} instead.`); + continue; + } + } + + for (let i = 0; i < parsedArgs.length; i++) { + const expected = Array.isArray(params) ? params[i] : params.type; + const arg = parsedArgs[i]; + signatureContext.concat(i + 1).checkSubtype(expected, arg.type); + } + + if (signatureContext.errors.length === 0) { + return new CompoundExpression(op, type, evaluate, parsedArgs); + } + } + + assert_1(!signatureContext || signatureContext.errors.length > 0); + + if (overloads.length === 1) { + context.errors.push(...signatureContext.errors); + } else { + const expected = overloads.length ? overloads : availableOverloads; + const signatures = expected + .map(([params]) => stringifySignature(params)) + .join(' | '); + + const actualTypes = []; + // For error message, re-parse arguments without trying to + // apply any coercions + for (let i = 1; i < args.length; i++) { + const parsed = context.parse(args[i], 1 + actualTypes.length); + if (!parsed) return null; + actualTypes.push(toString$1(parsed.type)); + } + context.error(`Expected arguments of type ${signatures}, but found (${actualTypes.join(', ')}) instead.`); + } + + return null; + } + + static register( + registry , + definitions + ) { + assert_1(!CompoundExpression.definitions); + CompoundExpression.definitions = definitions; + for (const name in definitions) { + registry[name] = CompoundExpression; + } + } } -/** - * Returns the inverse of the components of a vec2 - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a vector to invert - * @returns {vec2} out - */ -function inverse$2(out, a) { - out[0] = 1.0 / a[0]; - out[1] = 1.0 / a[1]; - return out; +function stringifySignature(signature ) { + if (Array.isArray(signature)) { + return `(${signature.map(toString$1).join(', ')})`; + } else { + return `(${toString$1(signature.type)}...)`; + } } -/** - * Normalize a vec2 - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a vector to normalize - * @returns {vec2} out - */ -function normalize$4(out, a) { - var x = a[0], - y = a[1]; - var len = x * x + y * y; +// - if (len > 0) { - //TODO: evaluate use of glm_invsqrt here? - len = 1 / Math.sqrt(len); - } + + + + - out[0] = a[0] * len; - out[1] = a[1] * len; - return out; +class CollatorExpression { + + + + + + constructor(caseSensitive , diacriticSensitive , locale ) { + this.type = CollatorType; + this.locale = locale; + this.caseSensitive = caseSensitive; + this.diacriticSensitive = diacriticSensitive; + } + + static parse(args , context ) { + if (args.length !== 2) + return context.error(`Expected one argument.`); + + const options = (args[1] ); + if (typeof options !== "object" || Array.isArray(options)) + return context.error(`Collator options argument must be an object.`); + + const caseSensitive = context.parse( + options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType); + if (!caseSensitive) return null; + + const diacriticSensitive = context.parse( + options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType); + if (!diacriticSensitive) return null; + + let locale = null; + if (options['locale']) { + locale = context.parse(options['locale'], 1, StringType); + if (!locale) return null; + } + + return new CollatorExpression(caseSensitive, diacriticSensitive, locale); + } + + evaluate(ctx ) { + return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null); + } + + eachChild(fn ) { + fn(this.caseSensitive); + fn(this.diacriticSensitive); + if (this.locale) { + fn(this.locale); + } + } + + outputDefined() { + // Technically the set of possible outputs is the combinatoric set of Collators produced + // by all possible outputs of locale/caseSensitive/diacriticSensitive + // But for the primary use of Collators in comparison operators, we ignore the Collator's + // possible outputs anyway, so we can get away with leaving this false for now. + return false; + } + + serialize() { + const options = {}; + options['case-sensitive'] = this.caseSensitive.serialize(); + options['diacritic-sensitive'] = this.diacriticSensitive.serialize(); + if (this.locale) { + options['locale'] = this.locale.serialize(); + } + return ["collator", options]; + } } -/** - * Calculates the dot product of two vec2's - * - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @returns {Number} dot product of a and b - */ -function dot$4(a, b) { - return a[0] * b[0] + a[1] * b[1]; +// + + + + +// minX, minY, maxX, maxY + +const EXTENT$1 = 8192; + +function updateBBox(bbox , coord ) { + bbox[0] = Math.min(bbox[0], coord[0]); + bbox[1] = Math.min(bbox[1], coord[1]); + bbox[2] = Math.max(bbox[2], coord[0]); + bbox[3] = Math.max(bbox[3], coord[1]); } -/** - * Computes the cross product of two vec2's - * Note that the cross product must by definition produce a 3D vector - * - * @param {vec3} out the receiving vector - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @returns {vec3} out - */ -function cross$2(out, a, b) { - var z = a[0] * b[1] - a[1] * b[0]; - out[0] = out[1] = 0; - out[2] = z; - return out; +function mercatorXfromLng$1(lng ) { + return (180 + lng) / 360; } -/** - * Performs a linear interpolation between two vec2's - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the first operand - * @param {ReadonlyVec2} b the second operand - * @param {Number} t interpolation amount, in the range [0-1], between the two inputs - * @returns {vec2} out - */ -function lerp$4(out, a, b, t) { - var ax = a[0], - ay = a[1]; - out[0] = ax + t * (b[0] - ax); - out[1] = ay + t * (b[1] - ay); - return out; +function mercatorYfromLat$1(lat ) { + return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360; } -/** - * Generates a random vector with the given scale - * - * @param {vec2} out the receiving vector - * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned - * @returns {vec2} out - */ -function random$3(out, scale) { - scale = scale || 1.0; - var r = RANDOM() * 2.0 * Math.PI; - out[0] = Math.cos(r) * scale; - out[1] = Math.sin(r) * scale; - return out; +function boxWithinBox(bbox1 , bbox2 ) { + if (bbox1[0] <= bbox2[0]) return false; + if (bbox1[2] >= bbox2[2]) return false; + if (bbox1[1] <= bbox2[1]) return false; + if (bbox1[3] >= bbox2[3]) return false; + return true; } -/** - * Transforms the vec2 with a mat2 - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the vector to transform - * @param {ReadonlyMat2} m matrix to transform with - * @returns {vec2} out - */ -function transformMat2(out, a, m) { - var x = a[0], - y = a[1]; - out[0] = m[0] * x + m[2] * y; - out[1] = m[1] * x + m[3] * y; - return out; +function getTileCoordinates(p, canonical ) { + const x = mercatorXfromLng$1(p[0]); + const y = mercatorYfromLat$1(p[1]); + const tilesAtZoom = Math.pow(2, canonical.z); + return [Math.round(x * tilesAtZoom * EXTENT$1), Math.round(y * tilesAtZoom * EXTENT$1)]; } -/** - * Transforms the vec2 with a mat2d - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the vector to transform - * @param {ReadonlyMat2d} m matrix to transform with - * @returns {vec2} out - */ -function transformMat2d(out, a, m) { - var x = a[0], - y = a[1]; - out[0] = m[0] * x + m[2] * y + m[4]; - out[1] = m[1] * x + m[3] * y + m[5]; - return out; +function onBoundary(p, p1, p2) { + const x1 = p[0] - p1[0]; + const y1 = p[1] - p1[1]; + const x2 = p[0] - p2[0]; + const y2 = p[1] - p2[1]; + return (x1 * y2 - x2 * y1 === 0) && (x1 * x2 <= 0) && (y1 * y2 <= 0); } -/** - * Transforms the vec2 with a mat3 - * 3rd vector component is implicitly '1' - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the vector to transform - * @param {ReadonlyMat3} m matrix to transform with - * @returns {vec2} out - */ -function transformMat3$1(out, a, m) { - var x = a[0], - y = a[1]; - out[0] = m[0] * x + m[3] * y + m[6]; - out[1] = m[1] * x + m[4] * y + m[7]; - return out; +function rayIntersect(p, p1, p2) { + return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]); } -/** - * Transforms the vec2 with a mat4 - * 3rd vector component is implicitly '0' - * 4th vector component is implicitly '1' - * - * @param {vec2} out the receiving vector - * @param {ReadonlyVec2} a the vector to transform - * @param {ReadonlyMat4} m matrix to transform with - * @returns {vec2} out - */ -function transformMat4$2(out, a, m) { - var x = a[0]; - var y = a[1]; - out[0] = m[0] * x + m[4] * y + m[12]; - out[1] = m[1] * x + m[5] * y + m[13]; - return out; +// ray casting algorithm for detecting if point is in polygon +function pointWithinPolygon(point, rings) { + let inside = false; + for (let i = 0, len = rings.length; i < len; i++) { + const ring = rings[i]; + for (let j = 0, len2 = ring.length; j < len2 - 1; j++) { + if (onBoundary(point, ring[j], ring[j + 1])) return false; + if (rayIntersect(point, ring[j], ring[j + 1])) inside = !inside; + } + } + return inside; } -/** - * Rotate a 2D vector - * @param {vec2} out The receiving vec2 - * @param {ReadonlyVec2} a The vec2 point to rotate - * @param {ReadonlyVec2} b The origin of the rotation - * @param {Number} rad The angle of rotation in radians - * @returns {vec2} out - */ -function rotate$4(out, a, b, rad) { - //Translate point to the origin - var p0 = a[0] - b[0], - p1 = a[1] - b[1], - sinC = Math.sin(rad), - cosC = Math.cos(rad); //perform rotation and translate to correct position +function pointWithinPolygons(point, polygons) { + for (let i = 0; i < polygons.length; i++) { + if (pointWithinPolygon(point, polygons[i])) return true; + } + return false; +} - out[0] = p0 * cosC - p1 * sinC + b[0]; - out[1] = p0 * sinC + p1 * cosC + b[1]; - return out; +function perp(v1, v2) { + return (v1[0] * v2[1] - v1[1] * v2[0]); } -/** - * Get the angle between two 2D vectors - * @param {ReadonlyVec2} a The first operand - * @param {ReadonlyVec2} b The second operand - * @returns {Number} The angle in radians - */ -function angle$1(a, b) { - var x1 = a[0], - y1 = a[1], - x2 = b[0], - y2 = b[1], - // mag is the product of the magnitudes of a and b - mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2), - // mag &&.. short circuits if mag == 0 - cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1 +// check if p1 and p2 are in different sides of line segment q1->q2 +function twoSided(p1, p2, q1, q2) { + // q1->p1 (x1, y1), q1->p2 (x2, y2), q1->q2 (x3, y3) + const x1 = p1[0] - q1[0]; + const y1 = p1[1] - q1[1]; + const x2 = p2[0] - q1[0]; + const y2 = p2[1] - q1[1]; + const x3 = q2[0] - q1[0]; + const y3 = q2[1] - q1[1]; + const det1 = (x1 * y3 - x3 * y1); + const det2 = (x2 * y3 - x3 * y2); + if ((det1 > 0 && det2 < 0) || (det1 < 0 && det2 > 0)) return true; + return false; +} +// a, b are end points for line segment1, c and d are end points for line segment2 +function lineIntersectLine(a, b, c, d) { + // check if two segments are parallel or not + // precondition is end point a, b is inside polygon, if line a->b is + // parallel to polygon edge c->d, then a->b won't intersect with c->d + const vectorP = [b[0] - a[0], b[1] - a[1]]; + const vectorQ = [d[0] - c[0], d[1] - c[1]]; + if (perp(vectorQ, vectorP) === 0) return false; - return Math.acos(Math.min(Math.max(cosine, -1), 1)); + // If lines are intersecting with each other, the relative location should be: + // a and b lie in different sides of segment c->d + // c and d lie in different sides of segment a->b + if (twoSided(a, b, c, d) && twoSided(c, d, a, b)) return true; + return false; } -/** - * Set the components of a vec2 to zero - * - * @param {vec2} out the receiving vector - * @returns {vec2} out - */ -function zero$2(out) { - out[0] = 0.0; - out[1] = 0.0; - return out; +function lineIntersectPolygon(p1, p2, polygon) { + for (const ring of polygon) { + // loop through every edge of the ring + for (let j = 0; j < ring.length - 1; ++j) { + if (lineIntersectLine(p1, p2, ring[j], ring[j + 1])) { + return true; + } + } + } + return false; } -/** - * Returns a string representation of a vector - * - * @param {ReadonlyVec2} a vector to represent as a string - * @returns {String} string representation of the vector - */ -function str$8(a) { - return "vec2(" + a[0] + ", " + a[1] + ")"; +function lineStringWithinPolygon(line, polygon) { + // First, check if geometry points of line segments are all inside polygon + for (let i = 0; i < line.length; ++i) { + if (!pointWithinPolygon(line[i], polygon)) { + return false; + } + } + + // Second, check if there is line segment intersecting polygon edge + for (let i = 0; i < line.length - 1; ++i) { + if (lineIntersectPolygon(line[i], line[i + 1], polygon)) { + return false; + } + } + return true; } -/** - * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===) - * - * @param {ReadonlyVec2} a The first vector. - * @param {ReadonlyVec2} b The second vector. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ -function exactEquals$8(a, b) { - return a[0] === b[0] && a[1] === b[1]; +function lineStringWithinPolygons(line, polygons) { + for (let i = 0; i < polygons.length; i++) { + if (lineStringWithinPolygon(line, polygons[i])) return true; + } + return false; } -/** - * Returns whether or not the vectors have approximately the same elements in the same position. - * - * @param {ReadonlyVec2} a The first vector. - * @param {ReadonlyVec2} b The second vector. - * @returns {Boolean} True if the vectors are equal, false otherwise. - */ -function equals$9(a, b) { - var a0 = a[0], - a1 = a[1]; - var b0 = b[0], - b1 = b[1]; - return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)); +function getTilePolygon(coordinates, bbox , canonical ) { + const polygon = []; + for (let i = 0; i < coordinates.length; i++) { + const ring = []; + for (let j = 0; j < coordinates[i].length; j++) { + const coord = getTileCoordinates(coordinates[i][j], canonical); + updateBBox(bbox, coord); + ring.push(coord); + } + polygon.push(ring); + } + return polygon; } -/** - * Alias for {@link vec2.length} - * @function - */ -var len$4 = length$4; -/** - * Alias for {@link vec2.subtract} - * @function - */ +function getTilePolygons(coordinates, bbox, canonical ) { + const polygons = []; + for (let i = 0; i < coordinates.length; i++) { + const polygon = getTilePolygon(coordinates[i], bbox, canonical); + polygons.push(polygon); + } + return polygons; +} -var sub$6 = subtract$6; -/** - * Alias for {@link vec2.multiply} - * @function - */ +function updatePoint(p, bbox, polyBBox, worldSize) { + if (p[0] < polyBBox[0] || p[0] > polyBBox[2]) { + const halfWorldSize = worldSize * 0.5; + let shift = (p[0] - polyBBox[0] > halfWorldSize) ? -worldSize : (polyBBox[0] - p[0] > halfWorldSize) ? worldSize : 0; + if (shift === 0) { + shift = (p[0] - polyBBox[2] > halfWorldSize) ? -worldSize : (polyBBox[2] - p[0] > halfWorldSize) ? worldSize : 0; + } + p[0] += shift; + } + updateBBox(bbox, p); +} -var mul$8 = multiply$8; -/** - * Alias for {@link vec2.divide} - * @function - */ +function resetBBox(bbox) { + bbox[0] = bbox[1] = Infinity; + bbox[2] = bbox[3] = -Infinity; +} -var div$2 = divide$2; -/** - * Alias for {@link vec2.distance} - * @function - */ +function getTilePoints(geometry, pointBBox, polyBBox, canonical ) { + const worldSize = Math.pow(2, canonical.z) * EXTENT$1; + const shifts = [canonical.x * EXTENT$1, canonical.y * EXTENT$1]; + const tilePoints = []; + if (!geometry) return tilePoints; + for (const points of geometry) { + for (const point of points) { + const p = [point.x + shifts[0], point.y + shifts[1]]; + updatePoint(p, pointBBox, polyBBox, worldSize); + tilePoints.push(p); + } + } + return tilePoints; +} -var dist$2 = distance$2; -/** - * Alias for {@link vec2.squaredDistance} - * @function - */ +function getTileLines(geometry, lineBBox, polyBBox, canonical ) { + const worldSize = Math.pow(2, canonical.z) * EXTENT$1; + const shifts = [canonical.x * EXTENT$1, canonical.y * EXTENT$1]; + const tileLines = []; + if (!geometry) return tileLines; + for (const line of geometry) { + const tileLine = []; + for (const point of line) { + const p = [point.x + shifts[0], point.y + shifts[1]]; + updateBBox(lineBBox, p); + tileLine.push(p); + } + tileLines.push(tileLine); + } + if (lineBBox[2] - lineBBox[0] <= worldSize / 2) { + resetBBox(lineBBox); + for (const line of tileLines) { + for (const p of line) { + updatePoint(p, lineBBox, polyBBox, worldSize); + } + } + } + return tileLines; +} -var sqrDist$2 = squaredDistance$2; -/** - * Alias for {@link vec2.squaredLength} - * @function - */ +function pointsWithinPolygons(ctx , polygonGeometry ) { + const pointBBox = [Infinity, Infinity, -Infinity, -Infinity]; + const polyBBox = [Infinity, Infinity, -Infinity, -Infinity]; -var sqrLen$4 = squaredLength$4; -/** - * Perform some operation over an array of vec2s. - * - * @param {Array} a the array of vectors to iterate over - * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed - * @param {Number} offset Number of elements to skip at the beginning of the array - * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array - * @param {Function} fn Function to call for each vector in the array - * @param {Object} [arg] additional argument to pass to fn - * @returns {Array} a - * @function - */ + const canonical = ctx.canonicalID(); + if (!canonical) { + return false; + } -var forEach$2 = function () { - var vec = create$8(); - return function (a, stride, offset, count, fn, arg) { - var i, l; + if (polygonGeometry.type === 'Polygon') { + const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical); + const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical); + if (!boxWithinBox(pointBBox, polyBBox)) return false; - if (!stride) { - stride = 2; + for (const point of tilePoints) { + if (!pointWithinPolygon(point, tilePolygon)) return false; + } } + if (polygonGeometry.type === 'MultiPolygon') { + const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical); + const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical); + if (!boxWithinBox(pointBBox, polyBBox)) return false; - if (!offset) { - offset = 0; + for (const point of tilePoints) { + if (!pointWithinPolygons(point, tilePolygons)) return false; + } } - if (count) { - l = Math.min(count * stride + offset, a.length); - } else { - l = a.length; + return true; +} + +function linesWithinPolygons(ctx , polygonGeometry ) { + const lineBBox = [Infinity, Infinity, -Infinity, -Infinity]; + const polyBBox = [Infinity, Infinity, -Infinity, -Infinity]; + + const canonical = ctx.canonicalID(); + if (!canonical) { + return false; } - for (i = offset; i < l; i += stride) { - vec[0] = a[i]; - vec[1] = a[i + 1]; - fn(vec, vec, arg); - a[i] = vec[0]; - a[i + 1] = vec[1]; + if (polygonGeometry.type === 'Polygon') { + const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical); + const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical); + if (!boxWithinBox(lineBBox, polyBBox)) return false; + + for (const line of tileLines) { + if (!lineStringWithinPolygon(line, tilePolygon)) return false; + } } + if (polygonGeometry.type === 'MultiPolygon') { + const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical); + const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical); + if (!boxWithinBox(lineBBox, polyBBox)) return false; - return a; - }; -}(); + for (const line of tileLines) { + if (!lineStringWithinPolygons(line, tilePolygons)) return false; + } + } + return true; +} -// +class Within { + + + -/** - * 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 (let i = 0; i < a.length; i++) { - if (!deepEqual(a[i], b[i])) return false; + constructor(geojson , geometries ) { + this.type = BooleanType; + this.geojson = geojson; + this.geometries = geometries; + } + + static parse(args , context ) { + if (args.length !== 2) + return context.error(`'within' expression requires exactly one argument, but found ${args.length - 1} instead.`); + if (isValue(args[1])) { + const geojson = (args[1] ); + if (geojson.type === 'FeatureCollection') { + for (let i = 0; i < geojson.features.length; ++i) { + const type = geojson.features[i].geometry.type; + if (type === 'Polygon' || type === 'MultiPolygon') { + return new Within(geojson, geojson.features[i].geometry); + } + } + } else if (geojson.type === 'Feature') { + const type = geojson.geometry.type; + if (type === 'Polygon' || type === 'MultiPolygon') { + return new Within(geojson, geojson.geometry); + } + } else if (geojson.type === 'Polygon' || geojson.type === 'MultiPolygon') { + return new Within(geojson, geojson); + } } - return true; + return context.error(`'within' expression requires valid geojson object that contains polygon geometry type.`); } - if (typeof a === 'object' && a !== null && b !== null) { - if (!(typeof b === 'object')) return false; - const keys = Object.keys(a); - if (keys.length !== Object.keys(b).length) return false; - for (const key in a) { - if (!deepEqual(a[key], b[key])) return false; + + evaluate(ctx ) { + if (ctx.geometry() != null && ctx.canonicalID() != null) { + if (ctx.geometryType() === 'Point') { + return pointsWithinPolygons(ctx, this.geometries); + } else if (ctx.geometryType() === 'LineString') { + return linesWithinPolygons(ctx, this.geometries); + } } + return false; + } + + eachChild() {} + + outputDefined() { return true; } - return a === b; + + serialize() { + return ["within", this.geojson]; + } + } // + - +function isFeatureConstant(e ) { + if (e instanceof CompoundExpression) { + if (e.name === 'get' && e.args.length === 1) { + return false; + } else if (e.name === 'feature-state') { + 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; + } + } -const DEG_TO_RAD = Math.PI / 180; -const RAD_TO_DEG = 180 / Math.PI; + if (e instanceof Within) { + return false; + } -/** - * Converts an angle in degrees to radians - * copy all properties from the source objects into the destination. - * The last source object given overrides properties from previous - * source objects. - * - * @param a angle to convert - * @returns the angle in radians - * @private - */ -function degToRad(a ) { - return a * DEG_TO_RAD; + let result = true; + e.eachChild(arg => { + if (result && !isFeatureConstant(arg)) { result = false; } + }); + return result; } -/** - * Converts an angle in radians to degrees - * copy all properties from the source objects into the destination. - * The last source object given overrides properties from previous - * source objects. - * - * @param a angle to convert - * @returns the angle in degrees - * @private - */ -function radToDeg(a ) { - return a * RAD_TO_DEG; +function isStateConstant(e ) { + if (e instanceof CompoundExpression) { + if (e.name === 'feature-state') { + return false; + } + } + let result = true; + e.eachChild(arg => { + if (result && !isStateConstant(arg)) { result = false; } + }); + return result; } -const TILE_CORNERS = [[0, 0], [1, 0], [1, 1], [0, 1]]; - -/** - * Given a particular bearing, returns the corner of the tile thats farthest - * along the bearing. - * - * @param {number} bearing angle in degrees (-180, 180] - * @returns {QuadCorner} - * @private - */ -function furthestTileCorner(bearing ) { - const alignedBearing = ((bearing + 45) + 360) % 360; - const cornerIdx = Math.round(alignedBearing / 90) % 4; - return TILE_CORNERS[cornerIdx]; +function isGlobalPropertyConstant(e , properties ) { + if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) { return false; } + let result = true; + e.eachChild((arg) => { + if (result && !isGlobalPropertyConstant(arg, properties)) { result = false; } + }); + return result; } -/** - * @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 - */ -function easeCubicInOut(t ) { - if (t <= 0) return 0; - if (t >= 1) return 1; - const t2 = t * t, - t3 = t2 * t; - return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75); -} + + + + -/** - * Computes an AABB for a set of points. - * - * @param {Point[]} points - * @returns {{ min: Point, max: Point}} - * @private - */ -function getBounds(points ) { - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; - for (const p of points) { - minX = Math.min(minX, p.x); - minY = Math.min(minY, p.y); - maxX = Math.max(maxX, p.x); - maxY = Math.max(maxY, p.y); +class Var { + + + + + constructor(name , boundExpression ) { + this.type = boundExpression.type; + this.name = name; + this.boundExpression = boundExpression; } - return { - min: new pointGeometry(minX, minY), - max: new pointGeometry(maxX, maxY), - }; -} + static parse(args , context ) { + if (args.length !== 2 || typeof args[1] !== 'string') + return context.error(`'var' expression requires exactly one string literal argument.`); -/** - * Returns the square of the 2D distance between an AABB defined by min and max and a point. - * If point is null or undefined, the AABB distance from the origin (0,0) is returned. - * - * @param {Point} min The minimum extent of the AABB. - * @param {Point} max The maximum extent of the AABB. - * @param {Point} [point] The point to compute the distance from, may be undefined. - * @returns {number} The square distance from the AABB, 0.0 if the AABB contains the point. - */ -function getAABBPointSquareDist(min , max , point ) { - let sqDist = 0.0; + const 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); + } - for (let i = 0; i < 2; ++i) { - const v = point ? point[i] : 0.0; - assert_1(min[i] < max[i], 'Invalid aabb min and max inputs, min[i] must be < max[i].'); - if (min[i] > v) sqDist += (min[i] - v) * (min[i] - v); - if (max[i] < v) sqDist += (v - max[i]) * (v - max[i]); + return new Var(name, context.scope.get(name)); } - return sqDist; -} + evaluate(ctx ) { + return this.boundExpression.evaluate(ctx); + } -/** - * Converts a AABB into a polygon with clockwise winding order. - * - * @param {Point} min The top left point. - * @param {Point} max The bottom right point. - * @param {number} [buffer=0] The buffer width. - * @param {boolean} [close=true] Whether to close the polygon or not. - * @returns {Point[]} The polygon. - */ -function polygonizeBounds(min , max , buffer = 0, close = true) { - const offset = new pointGeometry(buffer, buffer); - const minBuf = min.sub(offset); - const maxBuf = max.add(offset); - const polygon = [minBuf, new pointGeometry(maxBuf.x, minBuf.y), maxBuf, new pointGeometry(minBuf.x, maxBuf.y)]; + eachChild() {} - if (close) { - polygon.push(minBuf); + outputDefined() { + return false; } - return polygon; -} -/** - * Takes a convex ring and expands it outward by applying a buffer around it. - * This function assumes that the ring is in clockwise winding order. - * - * @param {Point[]} ring The input ring. - * @param {number} buffer The buffer width. - * @returns {Point[]} The expanded ring. - */ -function bufferConvexPolygon(ring , buffer ) { - assert_1(ring.length > 2, 'bufferConvexPolygon requires the ring to have atleast 3 points'); - const output = []; - for (let currIdx = 0; currIdx < ring.length; currIdx++) { - const prevIdx = wrap(currIdx - 1, -1, ring.length - 1); - const nextIdx = wrap(currIdx + 1, -1, ring.length - 1); - const prev = ring[prevIdx]; - const curr = ring[currIdx]; - const next = ring[nextIdx]; - const p1 = prev.sub(curr).unit(); - const p2 = next.sub(curr).unit(); - const interiorAngle = p2.angleWithSep(p1.x, p1.y); - // Calcuate a vector that points in the direction of the angle bisector between two sides. - // Scale it based on a right angled triangle constructed at that corner. - const offset = p1.add(p2).unit().mult(-1 * buffer / Math.sin(interiorAngle / 2)); - output.push(curr.add(offset)); + serialize() { + return ["var", this.name]; } - return output; -} - -/** - * 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 - */ -function bezier$1(p1x , p1y , p2x , p2y ) { - const 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 - */ -const ease = bezier$1(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 - */ -function clamp(n , min , max ) { - return Math.min(max, Math.max(min, n)); -} +// -/** - * Equivalent to GLSL smoothstep. - * - * @param {number} e0 The lower edge of the sigmoid - * @param {number} e1 The upper edge of the sigmoid - * @param {number} x the value to be interpolated - * @returns {number} in the range [0, 1] - * @private - */ -function smoothstep(e0 , e1 , x ) { - x = clamp((x - e0) / (e1 - e0), 0, 1); - return x * x * (3 - 2 * x); -} + + /** - * 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 + * State associated parsing at a given point in an expression tree. * @private */ -function wrap(n , min , max ) { - const d = max - min; - const w = ((n - min) % d + d) % d + min; - return (w === min) ? max : w; -} +class ParsingContext { + + + + + -/* - * 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 - */ -function asyncAll ( - array , - fn , - callback -) { - if (!array.length) { return callback(null, []); } - let remaining = array.length; - const results = new Array(array.length); - let error = null; - array.forEach((item, i) => { - fn(item, (err, result) => { - if (err) error = err; - results[i] = ((result ) ); // https://github.com/facebook/flow/issues/2123 - if (--remaining === 0) callback(error, results); - }); - }); -} + // The expected type of this expression. Provided only to allow Expression + // implementations to infer argument types: Expression#parse() need not + // check that the output type of the parsed expression matches + // `expectedType`. + -/* - * Polyfill for Object.values. Not fully spec compliant, but we don't - * need it to be. - * - * @private - */ -function values (obj ) { - const result = []; - for (const k in obj) { - result.push(obj[k]); + constructor( + registry , + path = [], + expectedType , + scope = new Scope(), + errors = [] + ) { + this.registry = registry; + this.path = path; + this.key = path.map(part => `[${part}]`).join(''); + this.scope = scope; + this.errors = errors; + this.expectedType = expectedType; } - return result; -} -/* - * Compute the difference between the keys in one object and the keys - * in another object. - * - * @returns keys difference - * @private - */ -function keysDifference (obj , other ) { - const difference = []; - for (const i in obj) { - if (!(i in other)) { - difference.push(i); + /** + * @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 + */ + parse( + expr , + index , + expectedType , + bindings , + options = {} + ) { + if (index) { + return this.concat(index, expectedType, bindings)._parse(expr, options); } + return this._parse(expr, options); } - 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 - */ -function extend(dest , ...sources ) { - for (const src of sources) { - for (const k in src) { - dest[k] = src[k]; + _parse(expr , options ) { + if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') { + expr = ['literal', expr]; } - } - 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 - */ -function pick(src , properties ) { - const result = {}; - for (let i = 0; i < properties.length; i++) { - const k = properties[i]; - if (k in src) { - result[k] = src[k]; + function annotate(parsed, type, typeAnnotation ) { + if (typeAnnotation === 'assert') { + return new Assertion(type, [parsed]); + } else if (typeAnnotation === 'coerce') { + return new Coercion(type, [parsed]); + } else { + return parsed; + } + } + + if (Array.isArray(expr)) { + if (expr.length === 0) { + return this.error(`Expected an array with at least one element. If you wanted a literal array, use ["literal", []].`); + } + + const op = expr[0]; + if (typeof op !== 'string') { + this.error(`Expression name must be a string, but found ${typeof op} instead. If you wanted a literal array, use ["literal", [...]].`, 0); + return null; + } + + const Expr = this.registry[op]; + if (Expr) { + let parsed = Expr.parse(expr, this); + if (!parsed) return null; + + if (this.expectedType) { + const expected = this.expectedType; + const actual = parsed.type; + + // When we expect a number, string, boolean, or array but have a value, wrap it in an assertion. + // When we expect a color or formatted string, but have a string or value, wrap it in a coercion. + // Otherwise, we do static type-checking. + // + // These behaviors are overridable for: + // * The "coalesce" operator, which needs to omit type annotations. + // * String-valued properties (e.g. `text-field`), where coercion is more convenient than assertion. + // + if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') { + parsed = annotate(parsed, expected, options.typeAnnotation || 'assert'); + } else if ((expected.kind === 'color' || expected.kind === 'formatted' || expected.kind === 'resolvedImage') && (actual.kind === 'value' || actual.kind === 'string')) { + parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce'); + } else if (this.checkSubtype(expected, actual)) { + 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. Expressions that expect an image should + // not be resolved here so we can later get the available images. + if (!(parsed instanceof Literal) && (parsed.type.kind !== 'resolvedImage') && isConstant(parsed)) { + const ec = new EvaluationContext(); + try { + parsed = new Literal(parsed.type, parsed.evaluate(ec)); + } catch (e) { + this.error(e.message); + return null; + } + } + + return parsed; + } + + return this.error(`Unknown expression "${op}". If you wanted a literal array, use ["literal", [...]].`, 0); + } else if (typeof expr === 'undefined') { + return this.error(`'undefined' value invalid. Use null instead.`); + } else if (typeof expr === 'object') { + return this.error(`Bare objects invalid. Use ["literal", {...}] instead.`); + } else { + return this.error(`Expected an array, but found ${typeof expr} instead.`); } } - return result; -} -let id = 1; + /** + * 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 + */ + concat(index , expectedType , bindings ) { + const path = typeof index === 'number' ? this.path.concat(index) : this.path; + const scope = bindings ? this.scope.concat(bindings) : this.scope; + return new ParsingContext( + this.registry, + path, + expectedType || null, + scope, + this.errors + ); + } -/** - * Return a unique numeric id, starting at 1 and incrementing with - * each call. - * - * @returns unique numeric id. - * @private - */ -function uniqueId() { - return id++; -} + /** + * 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 + */ + error(error , ...keys ) { + const key = `${this.key}${keys.map(k => `[${k}]`).join('')}`; + this.errors.push(new ParsingError(key, error)); + } -/** - * Return a random UUID (v4). Taken from: https://gist.github.com/jed/982883 - * @private - */ -function uuid() { - function b(a) { - return a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : - //$FlowFixMe: Flow doesn't like the implied array literal conversion here - ([1e7] + -[1e3] + -4e3 + -8e3 + -1e11).replace(/[018]/g, b); + /** + * Returns null if `t` is a subtype of `expected`; otherwise returns an + * error message and also pushes it to `this.errors`. + */ + checkSubtype(expected , t ) { + const error = checkSubtype(expected, t); + if (error) this.error(error); + return error; } - return b(); } -/** - * Return whether a given value is a power of two - * @private - */ -function isPowerOfTwo(value ) { - return (Math.log(value) / Math.LN2) % 1 === 0; -} +var ParsingContext$1 = ParsingContext; -/** - * Return the next power of two, or the input value if already a power of two - * @private - */ -function nextPowerOfTwo(value ) { - if (value <= 1) return 1; - return Math.pow(2, Math.ceil(Math.log(value) / Math.LN2)); -} +function isConstant(expression ) { + if (expression instanceof Var) { + return isConstant(expression.boundExpression); + } else if (expression instanceof CompoundExpression && expression.name === 'error') { + return false; + } else if (expression instanceof CollatorExpression) { + // Although the results of a Collator expression with fixed arguments + // generally shouldn't change between executions, we can't serialize them + // as constant expressions because results change based on environment. + return false; + } else if (expression instanceof Within) { + return false; + } -/** - * Return the previous power of two, or the input value if already a power of two - * @private - */ -function prevPowerOfTwo(value ) { - if (value <= 1) return 1; - return Math.pow(2, Math.floor(Math.log(value) / Math.LN2)); -} + const isTypeAnnotation = expression instanceof Coercion || + expression instanceof Assertion; -/** - * Validate a string to match UUID(v4) of the - * form: xxxxxxxx-xxxx-4xxx-[89ab]xxx-xxxxxxxxxxxx - * @param str string to validate. - * @private - */ -function validateUuid(str ) { - return str ? /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str) : false; -} + let childrenConstant = true; + expression.eachChild(child => { + // We can _almost_ assume that if `expressions` children are constant, + // they would already have been evaluated to Literal values when they + // were parsed. Type annotations are the exception, because they might + // have been inferred and added after a child was parsed. -/** - * 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 - */ -function bindAll(fns , context ) { - fns.forEach((fn) => { - if (!context[fn]) { return; } - context[fn] = context[fn].bind(context); + // So we recurse into isConstant() for the children of type annotations, + // but otherwise simply check whether they are Literals. + if (isTypeAnnotation) { + childrenConstant = childrenConstant && isConstant(child); + } else { + childrenConstant = childrenConstant && child instanceof Literal; + } }); -} + if (!childrenConstant) { + return false; + } -/** - * Determine if a string ends with a particular substring - * - * @private - */ -function endsWith(string , suffix ) { - return string.indexOf(suffix, string.length - suffix.length) !== -1; + return isFeatureConstant(expression) && + isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density', 'line-progress', 'sky-radial-progress', 'accumulated', 'is-supported-script', 'pitch', 'distance-from-center']); } +// + + + + + /** - * Create an object by mapping all the values of an existing object while - * preserving their keys. - * + * Returns the index of the last stop <= input, or 0 if it doesn't exist. * @private */ -function mapObject(input , iterator , context ) { - const output = {}; - for (const key in input) { - output[key] = iterator.call(context || this, input[key], key, input); +function findStopLessThanOrEqualTo(stops , input ) { + const lastIndex = stops.length - 1; + let lowerIndex = 0; + let upperIndex = lastIndex; + let currentIndex = 0; + let currentValue, nextValue; + + while (lowerIndex <= upperIndex) { + currentIndex = Math.floor((lowerIndex + upperIndex) / 2); + currentValue = stops[currentIndex]; + nextValue = stops[currentIndex + 1]; + + if (currentValue <= input) { + if (currentIndex === lastIndex || input < nextValue) { // Search complete + return currentIndex; + } + + lowerIndex = currentIndex + 1; + } else if (currentValue > input) { + upperIndex = currentIndex - 1; + } else { + throw new RuntimeError('Input is not a number.'); + } } - return output; + + return 0; } -/** - * Create an object by filtering out values of an existing object. - * - * @private - */ -function filterObject(input , iterator , context ) { - const output = {}; - for (const key in input) { - if (iterator.call(context || this, input[key], key, input)) { - output[key] = input[key]; - } - } - return output; -} +// -/** - * Deeply clones two objects. - * - * @private - */ -function clone$9 (input ) { - if (Array.isArray(input)) { - return input.map(clone$9); - } else if (typeof input === 'object' && input) { - return ((mapObject(input, clone$9) ) ); - } else { - return input; - } -} + + + + + -/** - * Check if two arrays have at least one common element. - * - * @private - */ -function arraysIntersect (a , b ) { - for (let l = 0; l < a.length; l++) { - if (b.indexOf(a[l]) >= 0) return true; - } - return false; -} +class Step { + -/** - * Print a warning message to the console and ensure duplicate warning messages - * are not printed. - * - * @private - */ -const warnOnceHistory = {}; + + + -function warnOnce(message ) { - if (!warnOnceHistory[message]) { - // console isn't defined in some WebWorkers, see #2558 - if (typeof console !== "undefined") console.warn(message); - warnOnceHistory[message] = true; + constructor(type , input , stops ) { + this.type = type; + this.input = input; + + this.labels = []; + this.outputs = []; + for (const [label, expression] of stops) { + this.labels.push(label); + this.outputs.push(expression); + } } -} -/** - * 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/ -function isCounterClockwise(a , b , c ) { - return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x); -} + static parse(args , context ) { + if (args.length - 1 < 4) { + return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`); + } -/** - * 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 - */ -function calculateSignedArea(ring ) { - let sum = 0; - for (let 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; -} + if ((args.length - 1) % 2 !== 0) { + return context.error(`Expected an even number of arguments.`); + } -/** - * Detects closed polygons, first + last point are equal - * - * @private - * @param points array of points - * @return true if the points are a closed polygon - */ -function isClosedPolygon(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; + const input = context.parse(args[1], 1, NumberType); + if (!input) return null; - const p1 = points[0]; - const p2 = points[points.length - 1]; + const stops = []; - if (Math.abs(p1.x - p2.x) > 0 || - Math.abs(p1.y - p2.y) > 0) { - return false; - } + let outputType = (null ); + if (context.expectedType && context.expectedType.kind !== 'value') { + outputType = context.expectedType; + } - // polygon simplification can produce polygons with zero area and more than 3 points - return Math.abs(calculateSignedArea(points)) > 0.01; -} + for (let i = 1; i < args.length; i += 2) { + const label = i === 1 ? -Infinity : args[i]; + const value = args[i + 1]; -/* global self, WorkerGlobalScope */ -/** - * Returns true if run in the web-worker context. - * - * @private - * @returns {boolean} - */ -function isWorker() { - return typeof WorkerGlobalScope !== 'undefined' && typeof self !== 'undefined' && - self instanceof WorkerGlobalScope; -} + const labelKey = i; + const valueKey = i + 1; -/** - * Parses data from 'Cache-Control' headers. - * - * @private - * @param cacheControl Value of 'Cache-Control' header - * @return object containing parsed header info. - */ + 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); + } -function parseCacheControl(cacheControl ) { - // Taken from [Wreck](https://github.com/hapijs/wreck) - const re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g; + 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); + } - const header = {}; - cacheControl.replace(re, ($0, $1, $2, $3) => { - const value = $2 || $3; - header[$1] = value ? value.toLowerCase() : true; - return ''; - }); + const parsed = context.parse(value, valueKey, outputType); + if (!parsed) return null; + outputType = outputType || parsed.type; + stops.push([label, parsed]); + } - if (header['max-age']) { - const maxAge = parseInt(header['max-age'], 10); - if (isNaN(maxAge)) delete header['max-age']; - else header['max-age'] = maxAge; + return new Step(outputType, input, stops); } - return header; -} + evaluate(ctx ) { + const labels = this.labels; + const outputs = this.outputs; -let _isSafari = null; + if (labels.length === 1) { + return outputs[0].evaluate(ctx); + } -/** - * Returns true when run in WebKit derived browsers. - * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to - * transfer data between WebWorkers and the main thread. - * https://github.com/mapbox/mapbox-gl-js/issues/8771 - * - * This should be removed once the underlying Safari issue is fixed. - * - * @private - * @param scope {WindowOrWorkerGlobalScope} Since this function is used both on the main thread and WebWorker context, - * let the calling scope pass in the global scope object. - * @returns {boolean} - */ -function isSafari(scope ) { - if (_isSafari == null) { - const userAgent = scope.navigator ? scope.navigator.userAgent : null; - _isSafari = !!scope.safari || - !!(userAgent && (/\b(iPad|iPhone|iPod)\b/.test(userAgent) || (!!userAgent.match('Safari') && !userAgent.match('Chrome')))); + const value = ((this.input.evaluate(ctx) ) ); + if (value <= labels[0]) { + return outputs[0].evaluate(ctx); + } + + const stopCount = labels.length; + if (value >= labels[stopCount - 1]) { + return outputs[stopCount - 1].evaluate(ctx); + } + + const index = findStopLessThanOrEqualTo(labels, value); + return outputs[index].evaluate(ctx); } - return _isSafari; -} -function storageAvailable(type ) { - try { - const storage = window$1[type]; - storage.setItem('_mapbox_test_', 1); - storage.removeItem('_mapbox_test_'); - return true; - } catch (e) { - return false; + eachChild(fn ) { + fn(this.input); + for (const expression of this.outputs) { + fn(expression); + } } -} -// The following methods are from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem -//Unicode compliant base64 encoder for strings -function b64EncodeUnicode(str ) { - return window$1.btoa( - encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, - (match, p1) => { - return String.fromCharCode(Number('0x' + p1)); //eslint-disable-line + outputDefined() { + return this.outputs.every(out => out.outputDefined()); + } + + serialize() { + const serialized = ["step", this.input.serialize()]; + for (let i = 0; i < this.labels.length; i++) { + if (i > 0) { + serialized.push(this.labels[i]); } - ) - ); + serialized.push(this.outputs[i].serialize()); + } + return serialized; + } } -// Unicode compliant decoder for base64-encoded strings -function b64DecodeUnicode(str ) { - return decodeURIComponent(window$1.atob(str).split('').map((c) => { - return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); //eslint-disable-line - }).join('')); -} +// -function getColumn(matrix , col ) { - return [matrix[col * 4], matrix[col * 4 + 1], matrix[col * 4 + 2], matrix[col * 4 + 3]]; +function number(a , b , t ) { + return (a * (1 - t)) + (b * t); } -function setColumn(matrix , col , values ) { - matrix[col * 4 + 0] = values[0]; - matrix[col * 4 + 1] = values[1]; - matrix[col * 4 + 2] = values[2]; - matrix[col * 4 + 3] = values[3]; +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) + ); } -// strict - - -let linkEl; - -let reducedMotionQuery ; - -let stubTime; - -/** - * @private - */ -const exported = { - /** - * Returns either performance.now() or a value set by setNow. - * @returns {number} Time value in milliseconds. - */ - now() { - if (stubTime !== undefined) { - return stubTime; - } - return window$1.performance.now(); - }, - setNow(time ) { - stubTime = time; - }, - - restoreNow() { - stubTime = undefined; - }, +function array(from , to , t ) { + return from.map((d, i) => { + return number(d, to[i], t); + }); +} - frame(fn ) { - const frame = window$1.requestAnimationFrame(fn); - return {cancel: () => window$1.cancelAnimationFrame(frame)}; - }, +var interpolate = /*#__PURE__*/Object.freeze({ +__proto__: null, +number: number, +color: color, +array: array +}); - getImageData(img , padding = 0) { - const canvas = window$1.document.createElement('canvas'); - const 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(-padding, -padding, img.width + 2 * padding, img.height + 2 * padding); - }, +// - resolveURL(path ) { - if (!linkEl) linkEl = window$1.document.createElement('a'); - linkEl.href = path; - return linkEl.href; - }, + + + + + + - get devicePixelRatio() { return window$1.devicePixelRatio; }, - get prefersReducedMotion() { - if (!window$1.matchMedia) return false; - // Lazily initialize media query. - if (reducedMotionQuery == null) { - reducedMotionQuery = window$1.matchMedia('(prefers-reduced-motion: reduce)'); - } - return reducedMotionQuery.matches; - }, -}; + + + + + + -// strict +// Constants +const 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; +} -let mapboxHTTPURLRegex; +function lab2xyz(t ) { + return t > t1 ? t * t * t : t2 * (t - t0); +} -const config = { - API_URL: 'https://api.mapbox.com', - get API_URL_REGEX () { - if (mapboxHTTPURLRegex == null) { - const prodMapboxHTTPURLRegex = /^((https?:)?\/\/)?([^\/]+\.)?mapbox\.c(n|om)(\/|\?|$)/i; - try { - mapboxHTTPURLRegex = (process.env.API_URL_REGEX != null) ? new RegExp(process.env.API_URL_REGEX) : prodMapboxHTTPURLRegex; - } catch (e) { - mapboxHTTPURLRegex = prodMapboxHTTPURLRegex; - } - } +function xyz2rgb(x ) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} - return mapboxHTTPURLRegex; - }, - get EVENTS_URL() { - if (!this.API_URL) { return null; } - if (this.API_URL.indexOf('https://api.mapbox.cn') === 0) { - return 'https://events.mapbox.cn/events/v2'; - } else if (this.API_URL.indexOf('https://api.mapbox.com') === 0) { - return 'https://events.mapbox.com/events/v2'; - } else { - return null; - } - }, - SESSION_PATH: '/map-sessions/v1', - FEEDBACK_URL: 'https://apps.mapbox.com/feedback', - TILE_URL_VERSION: 'v4', - RASTER_URL_PREFIX: 'raster/v1', - REQUIRE_ACCESS_TOKEN: true, - ACCESS_TOKEN: null, - MAX_PARALLEL_IMAGE_REQUESTS: 16 -}; +function rgb2xyz(x ) { + x /= 255; + return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} -// strict +// LAB +function rgbToLab(rgbColor ) { + const 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); -const exported$1 = { - supported: false, - testSupport -}; + return { + l: 116 * y - 16, + a: 500 * (x - y), + b: 200 * (y - z), + alpha: rgbColor.a + }; +} -let glForTesting; -let webpCheckComplete = false; -let webpImgTest; -let webpImgTestOnloadComplete = false; +function labToRgb(labColor ) { + let 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 + ); +} -if (window$1.document) { - webpImgTest = window$1.document.createElement('img'); - webpImgTest.onload = function() { - if (glForTesting) testWebpTextureUpload(glForTesting); - glForTesting = null; - webpImgTestOnloadComplete = true; +function interpolateLab(from , to , t ) { + return { + l: number(from.l, to.l, t), + a: number(from.a, to.a, t), + b: number(from.b, to.b, t), + alpha: number(from.alpha, to.alpha, t) }; - webpImgTest.onerror = function() { - webpCheckComplete = true; - glForTesting = null; +} + +// HCL +function rgbToHcl(rgbColor ) { + const {l, a, b} = rgbToLab(rgbColor); + const h = Math.atan2(b, a) * rad2deg; + return { + h: h < 0 ? h + 360 : h, + c: Math.sqrt(a * a + b * b), + l, + alpha: rgbColor.a }; - webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA='; } -function testSupport(gl ) { - if (webpCheckComplete || !webpImgTest) return; +function hclToRgb(hclColor ) { + const h = hclColor.h * deg2rad, + c = hclColor.c, + l = hclColor.l; + return labToRgb({ + l, + a: Math.cos(h) * c, + b: Math.sin(h) * c, + alpha: hclColor.alpha + }); +} - // HTMLImageElement.complete is set when an image is done loading it's source - // regardless of whether the load was successful or not. - // It's possible for an error to set HTMLImageElement.complete to true which would trigger - // testWebpTextureUpload and mistakenly set exported.supported to true in browsers which don't support webp - // To avoid this, we set a flag in the image's onload handler and only call testWebpTextureUpload - // after a successful image load event. - if (webpImgTestOnloadComplete) { - testWebpTextureUpload(gl); - } else { - glForTesting = gl; +function interpolateHue(a , b , t ) { + const 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: number(from.c, to.c, t), + l: number(from.l, to.l, t), + alpha: number(from.alpha, to.alpha, t) + }; } -function testWebpTextureUpload(gl ) { - // Edge 18 supports WebP but not uploading a WebP image to a gl texture - // Test support for this before allowing WebP images. - // https://github.com/mapbox/mapbox-gl-js/issues/7671 - const texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); +const lab = { + forward: rgbToLab, + reverse: labToRgb, + interpolate: interpolateLab +}; - try { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, webpImgTest); - - // The error does not get triggered in Edge if the context is lost - if (gl.isContextLost()) return; - - exported$1.supported = true; - } catch (e) { - // Catch "Unspecified Error." in Edge 18. - } - - gl.deleteTexture(texture); +const hcl = { + forward: rgbToHcl, + reverse: hclToRgb, + interpolate: interpolateHcl +}; - webpCheckComplete = true; -} +var colorSpaces = /*#__PURE__*/Object.freeze({ +__proto__: null, +lab: lab, +hcl: hcl +}); // -/***** START WARNING REMOVAL OR MODIFICATION OF THE -* FOLLOWING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ****** -* The following code is used to access Mapbox's APIs. Removal or modification -* of this code can result in higher fees and/or -* termination of your account with Mapbox. -* -* Under the Mapbox Terms of Service, you may not use this code to access Mapbox -* Mapping APIs other than through Mapbox SDKs. -* -* The Mapping APIs documentation is available at https://docs.mapbox.com/api/maps/#maps -* and the Mapbox Terms of Service are available at https://www.mapbox.com/tos/ -******************************************************************************/ + + + + + + - - - + + -const SKU_ID = '01'; +class Interpolate { + -function createSkuToken() { - // SKU_ID and TOKEN_VERSION are specified by an internal schema and should not change - const TOKEN_VERSION = '1'; - const base62chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - // sessionRandomizer is a randomized 10-digit base-62 number - let sessionRandomizer = ''; - for (let i = 0; i < 10; i++) { - sessionRandomizer += base62chars[Math.floor(Math.random() * 62)]; - } - const expiration = 12 * 60 * 60 * 1000; // 12 hours - const token = [TOKEN_VERSION, SKU_ID, sessionRandomizer].join(''); - const tokenExpiresAt = Date.now() + expiration; + + + + + - return {token, tokenExpiresAt}; -} + constructor(type , operator , interpolation , input , stops ) { + this.type = type; + this.operator = operator; + this.interpolation = interpolation; + this.input = input; -/***** END WARNING - REMOVAL OR MODIFICATION OF THE -PRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ******/ + this.labels = []; + this.outputs = []; + for (const [label, expression] of stops) { + this.labels.push(label); + this.outputs.push(expression); + } + } -// + static interpolationFactor(interpolation , input , lower , upper ) { + let 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') { + const c = interpolation.controlPoints; + const ub = new unitbezier(c[0], c[1], c[2], c[3]); + t = ub.solve(exponentialInterpolation(input, 1, lower, upper)); + } + return t; + } - - - + static parse(args , context ) { + let [operator, interpolation, input, ...rest] = args; - - + 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') { + const base = interpolation[1]; + if (typeof base !== 'number') + return context.error(`Exponential interpolation requires a numeric base.`, 1, 1); + interpolation = { + name: 'exponential', + base + }; + } else if (interpolation[0] === 'cubic-bezier') { + const controlPoints = interpolation.slice(1); + if ( + controlPoints.length !== 4 || + controlPoints.some(t => typeof t !== 'number' || t < 0 || t > 1) + ) { + return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1); + } -const AUTH_ERR_MSG = 'NO_ACCESS_TOKEN'; + interpolation = { + name: 'cubic-bezier', + controlPoints: (controlPoints ) + }; + } else { + return context.error(`Unknown interpolation type ${String(interpolation[0])}`, 1, 0); + } -class RequestManager { - - - - - + if (args.length - 1 < 4) { + return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`); + } - constructor(transformRequestFn , customAccessToken , silenceAuthErrors ) { - this._transformRequestFn = transformRequestFn; - this._customAccessToken = customAccessToken; - this._silenceAuthErrors = !!silenceAuthErrors; - this._createSkuToken(); - } + if ((args.length - 1) % 2 !== 0) { + return context.error(`Expected an even number of arguments.`); + } - _createSkuToken() { - const skuToken = createSkuToken(); - this._skuToken = skuToken.token; - this._skuTokenExpiresAt = skuToken.tokenExpiresAt; - } + input = context.parse(input, 2, NumberType); + if (!input) return null; - _isSkuTokenExpired() { - return Date.now() > this._skuTokenExpiresAt; - } + const stops = []; - transformRequest(url , type ) { - if (this._transformRequestFn) { - return this._transformRequestFn(url, type) || {url}; + let outputType = (null ); + if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') { + outputType = ColorType; + } else if (context.expectedType && context.expectedType.kind !== 'value') { + outputType = context.expectedType; } - return {url}; - } + for (let i = 0; i < rest.length; i += 2) { + const label = rest[i]; + const value = rest[i + 1]; - normalizeStyleURL(url , accessToken ) { - if (!isMapboxURL(url)) return url; - const urlObject = parseUrl(url); - urlObject.path = `/styles/v1${urlObject.path}`; - return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); - } + const labelKey = i + 3; + const valueKey = i + 4; - normalizeGlyphsURL(url , accessToken ) { - if (!isMapboxURL(url)) return url; - const urlObject = parseUrl(url); - urlObject.path = `/fonts/v1${urlObject.path}`; - return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); - } + 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); + } - normalizeSourceURL(url , accessToken ) { - if (!isMapboxURL(url)) return url; - const 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 this._makeAPIURL(urlObject, this._customAccessToken || accessToken); - } + 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); + } - normalizeSpriteURL(url , format , extension , accessToken ) { - const urlObject = parseUrl(url); - if (!isMapboxURL(url)) { - urlObject.path += `${format}${extension}`; - return formatUrl(urlObject); + const parsed = context.parse(value, valueKey, outputType); + if (!parsed) return null; + outputType = outputType || parsed.type; + stops.push([label, parsed]); } - urlObject.path = `/styles/v1${urlObject.path}/sprite${format}${extension}`; - return this._makeAPIURL(urlObject, this._customAccessToken || accessToken); - } - normalizeTileURL(tileURL , use2x , rasterTileSize ) { - if (this._isSkuTokenExpired()) { - this._createSkuToken(); + if (outputType.kind !== 'number' && + outputType.kind !== 'color' && + !( + outputType.kind === 'array' && + outputType.itemType.kind === 'number' && + typeof outputType.N === 'number' + ) + ) { + return context.error(`Type ${toString$1(outputType)} is not interpolatable.`); } - if (tileURL && !isMapboxURL(tileURL)) return tileURL; - - const urlObject = parseUrl(tileURL); - const imageExtensionRe = /(\.(png|jpg)\d*)(?=$)/; - const extension = exported$1.supported ? '.webp' : '$1'; + return new Interpolate(outputType, (operator ), interpolation, input, stops); + } - // The v4 mapbox tile API supports 512x512 image tiles but they must be requested as '@2x' tiles. - const use2xAs512 = rasterTileSize && urlObject.authority !== 'raster' && rasterTileSize === 512; + evaluate(ctx ) { + const labels = this.labels; + const outputs = this.outputs; - const suffix = use2x || use2xAs512 ? '@2x' : ''; - urlObject.path = urlObject.path.replace(imageExtensionRe, `${suffix}${extension}`); + if (labels.length === 1) { + return outputs[0].evaluate(ctx); + } - if (urlObject.authority === 'raster') { - urlObject.path = `/${config.RASTER_URL_PREFIX}${urlObject.path}`; - } else { - const tileURLAPIPrefixRe = /^.+\/v4\//; - urlObject.path = urlObject.path.replace(tileURLAPIPrefixRe, '/'); - urlObject.path = `/${config.TILE_URL_VERSION}${urlObject.path}`; + const value = ((this.input.evaluate(ctx) ) ); + if (value <= labels[0]) { + return outputs[0].evaluate(ctx); } - const accessToken = this._customAccessToken || getAccessToken(urlObject.params) || config.ACCESS_TOKEN; - if (config.REQUIRE_ACCESS_TOKEN && accessToken && this._skuToken) { - urlObject.params.push(`sku=${this._skuToken}`); + const stopCount = labels.length; + if (value >= labels[stopCount - 1]) { + return outputs[stopCount - 1].evaluate(ctx); } - return this._makeAPIURL(urlObject, accessToken); - } + const index = findStopLessThanOrEqualTo(labels, value); + const lower = labels[index]; + const upper = labels[index + 1]; + const t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper); - canonicalizeTileURL(url , removeAccessToken ) { - // matches any file extension specified by a dot and one or more alphanumeric characters - const extensionRe = /\.[\w]+$/; + const outputLower = outputs[index].evaluate(ctx); + const outputUpper = outputs[index + 1].evaluate(ctx); - const urlObject = parseUrl(url); - // Make sure that we are dealing with a valid Mapbox tile URL. - // Has to begin with /v4/ or /raster/v1, with a valid filename + extension - if (!urlObject.path.match(/^(\/v4\/|\/raster\/v1\/)/) || !urlObject.path.match(extensionRe)) { - // Not a proper Mapbox tile URL. - return url; - } - // Reassemble the canonical URL from the parts we've parsed before. - let result = "mapbox://"; - if (urlObject.path.match(/^\/raster\/v1\//)) { - // If the tile url has /raster/v1/, make the final URL mapbox://raster/.... - const rasterPrefix = `/${config.RASTER_URL_PREFIX}/`; - result += `raster/${urlObject.path.replace(rasterPrefix, '')}`; + if (this.operator === 'interpolate') { + return (interpolate[this.type.kind.toLowerCase()] )(outputLower, outputUpper, t); // eslint-disable-line import/namespace + } else if (this.operator === 'interpolate-hcl') { + return hcl.reverse(hcl.interpolate(hcl.forward(outputLower), hcl.forward(outputUpper), t)); } else { - const tilesPrefix = `/${config.TILE_URL_VERSION}/`; - result += `tiles/${urlObject.path.replace(tilesPrefix, '')}`; + return lab.reverse(lab.interpolate(lab.forward(outputLower), lab.forward(outputUpper), t)); } + } - // Append the query string, minus the access token parameter. - let params = urlObject.params; - if (removeAccessToken) { - params = params.filter(p => !p.match(/^access_token=/)); + eachChild(fn ) { + fn(this.input); + for (const expression of this.outputs) { + fn(expression); } - if (params.length) result += `?${params.join('&')}`; - return result; } - canonicalizeTileset(tileJSON , sourceURL ) { - const removeAccessToken = sourceURL ? isMapboxURL(sourceURL) : false; - const canonical = []; - for (const url of tileJSON.tiles || []) { - if (isMapboxHTTPURL(url)) { - canonical.push(this.canonicalizeTileURL(url, removeAccessToken)); + outputDefined() { + return this.outputs.every(out => out.outputDefined()); + } + + serialize() { + let interpolation; + if (this.interpolation.name === 'linear') { + interpolation = ["linear"]; + } else if (this.interpolation.name === 'exponential') { + if (this.interpolation.base === 1) { + interpolation = ["linear"]; } else { - canonical.push(url); + interpolation = ["exponential", this.interpolation.base]; } + } else { + interpolation = ["cubic-bezier" ].concat(this.interpolation.controlPoints); } - return canonical; - } - _makeAPIURL(urlObject , accessToken ) { - const help = 'See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes'; - const apiUrlObject = parseUrl(config.API_URL); - urlObject.protocol = apiUrlObject.protocol; - urlObject.authority = apiUrlObject.authority; - - if (urlObject.protocol === 'http') { - const i = urlObject.params.indexOf('secure'); - if (i >= 0) urlObject.params.splice(i, 1); - } + const serialized = [this.operator, interpolation, this.input.serialize()]; - if (apiUrlObject.path !== '/') { - urlObject.path = `${apiUrlObject.path}${urlObject.path}`; + for (let i = 0; i < this.labels.length; i++) { + serialized.push( + this.labels[i], + this.outputs[i].serialize() + ); } + return serialized; + } +} - if (!config.REQUIRE_ACCESS_TOKEN) return formatUrl(urlObject); - - accessToken = accessToken || config.ACCESS_TOKEN; - if (!this._silenceAuthErrors) { - 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}`); - } +/** + * 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) { + const difference = upperValue - lowerValue; + const progress = input - lowerValue; - urlObject.params = urlObject.params.filter((d) => d.indexOf('access_token') === -1); - urlObject.params.push(`access_token=${accessToken || ''}`); - return formatUrl(urlObject); + if (difference === 0) { + return 0; + } else if (base === 1) { + return progress / difference; + } else { + return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); } } -function isMapboxURL(url ) { - return url.indexOf('mapbox:') === 0; -} +// -function isMapboxHTTPURL(url ) { - return config.API_URL_REGEX.test(url); -} + + + + -function hasCacheDefeatingSku(url ) { - return url.indexOf('sku=') > 0 && isMapboxHTTPURL(url); -} +class Coalesce { + + -function getAccessToken(params ) { - for (const param of params) { - const match = param.match(/^access_token=(.*)$/); - if (match) { - return match[1]; - } + constructor(type , args ) { + this.type = type; + this.args = args; } - return null; -} -const urlRe = /^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/; + static parse(args , context ) { + if (args.length < 2) { + return context.error("Expectected at least one argument."); + } + let outputType = (null ); + const expectedType = context.expectedType; + if (expectedType && expectedType.kind !== 'value') { + outputType = expectedType; + } + const parsedArgs = []; -function parseUrl(url ) { - const parts = url.match(urlRe); - if (!parts) { - throw new Error('Unable to parse URL object'); + for (const arg of args.slice(1)) { + const parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, {typeAnnotation: 'omit'}); + if (!parsed) return null; + outputType = outputType || parsed.type; + parsedArgs.push(parsed); + } + assert_1(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. + const needsAnnotation = expectedType && + parsedArgs.some(arg => checkSubtype(expectedType, arg.type)); + + return needsAnnotation ? + new Coalesce(ValueType, parsedArgs) : + new Coalesce((outputType ), parsedArgs); } - return { - protocol: parts[1], - authority: parts[2], - path: parts[3] || '/', - params: parts[4] ? parts[4].split('&') : [] - }; -} -function formatUrl(obj ) { - const params = obj.params.length ? `?${obj.params.join('&')}` : ''; - return `${obj.protocol}://${obj.authority}${obj.path}${params}`; -} + evaluate(ctx ) { + let result = null; + let argCount = 0; + let firstImage; + for (const arg of this.args) { + argCount++; + result = arg.evaluate(ctx); + // we need to keep track of the first requested image in a coalesce statement + // if coalesce can't find a valid image, we return the first image so styleimagemissing can fire + if (result && result instanceof ResolvedImage && !result.available) { + // set to first image + if (!firstImage) { + firstImage = result; + } + result = null; + // if we reach the end, return the first image + if (argCount === this.args.length) { + return firstImage; + } + } -const telemEventKey = 'mapbox.eventData'; + if (result !== null) break; + } + return result; + } -function parseAccessToken(accessToken ) { - if (!accessToken) { - return null; + eachChild(fn ) { + this.args.forEach(fn); } - const parts = accessToken.split('.'); - if (!parts || parts.length !== 3) { - return null; + outputDefined() { + return this.args.every(arg => arg.outputDefined()); } - try { - const jsonData = JSON.parse(b64DecodeUnicode(parts[1])); - return jsonData; - } catch (e) { - return null; + serialize() { + const serialized = ["coalesce"]; + this.eachChild(child => { serialized.push(child.serialize()); }); + return serialized; } } - +// -class TelemetryEvent { - - - - - - + + + + - constructor(type ) { - this.type = type; - this.anonId = null; - this.eventData = {}; - this.queue = []; - this.pendingRequest = null; +class Let { + + + + + constructor(bindings , result ) { + this.type = result.type; + this.bindings = [].concat(bindings); + this.result = result; } - getStorageKey(domain ) { - const tokenData = parseAccessToken(config.ACCESS_TOKEN); - let u = ''; - if (tokenData && tokenData['u']) { - u = b64EncodeUnicode(tokenData['u']); - } else { - u = config.ACCESS_TOKEN || ''; + evaluate(ctx ) { + return this.result.evaluate(ctx); + } + + eachChild(fn ) { + for (const binding of this.bindings) { + fn(binding[1]); } - return domain ? - `${telemEventKey}.${domain}:${u}` : - `${telemEventKey}:${u}`; + fn(this.result); } - fetchEventData() { - const isLocalStorageAvailable = storageAvailable('localStorage'); - const storageKey = this.getStorageKey(); - const uuidKey = this.getStorageKey('uuid'); + static parse(args , context ) { + if (args.length < 4) + return context.error(`Expected at least 3 arguments, but found ${args.length - 1} instead.`); - if (isLocalStorageAvailable) { - //Retrieve cached data - try { - const data = window$1.localStorage.getItem(storageKey); - if (data) { - this.eventData = JSON.parse(data); - } + const bindings = []; + for (let i = 1; i < args.length - 1; i += 2) { + const name = args[i]; - const uuid = window$1.localStorage.getItem(uuidKey); - if (uuid) this.anonId = uuid; - } catch (e) { - warnOnce('Unable to read from LocalStorage'); + if (typeof name !== 'string') { + return context.error(`Expected string, but found ${typeof name} instead.`, i); } - } - } - saveEventData() { - const isLocalStorageAvailable = storageAvailable('localStorage'); - const storageKey = this.getStorageKey(); - const uuidKey = this.getStorageKey('uuid'); - if (isLocalStorageAvailable) { - try { - window$1.localStorage.setItem(uuidKey, this.anonId); - if (Object.keys(this.eventData).length >= 1) { - window$1.localStorage.setItem(storageKey, JSON.stringify(this.eventData)); - } - } catch (e) { - warnOnce('Unable to write to LocalStorage'); + if (/[^a-zA-Z0-9_]/.test(name)) { + return context.error(`Variable names must contain only alphanumeric characters or '_'.`, i); } - } - } - - processRequests(_ ) {} + const value = context.parse(args[i + 1], i + 1); + if (!value) return null; - /* - * If any event data should be persisted after the POST request, the callback should modify eventData` - * to the values that should be saved. For this reason, the callback should be invoked prior to the call - * to TelemetryEvent#saveData - */ - postEvent(timestamp , additionalPayload , callback , customAccessToken ) { - if (!config.EVENTS_URL) return; - const eventsUrlObject = parseUrl(config.EVENTS_URL); - eventsUrlObject.params.push(`access_token=${customAccessToken || config.ACCESS_TOKEN || ''}`); + bindings.push([name, value]); + } - const payload = { - event: this.type, - created: new Date(timestamp).toISOString(), - sdkIdentifier: 'mapbox-gl-js', - sdkVersion: version, - skuId: SKU_ID, - userId: this.anonId - }; + const result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings); + if (!result) return null; - const finalPayload = additionalPayload ? extend(payload, additionalPayload) : payload; - const request = { - url: formatUrl(eventsUrlObject), - headers: { - 'Content-Type': 'text/plain' //Skip the pre-flight OPTIONS request - }, - body: JSON.stringify([finalPayload]) - }; + return new Let(bindings, result); + } - this.pendingRequest = postData(request, (error) => { - this.pendingRequest = null; - callback(error); - this.saveEventData(); - this.processRequests(customAccessToken); - }); + outputDefined() { + return this.result.outputDefined(); } - queueRequest(event , customAccessToken ) { - this.queue.push(event); - this.processRequests(customAccessToken); + serialize() { + const serialized = ["let"]; + for (const [name, expr] of this.bindings) { + serialized.push(name, expr.serialize()); + } + serialized.push(this.result.serialize()); + return serialized; } } -class MapLoadEvent extends TelemetryEvent { - - - +// - constructor() { - super('map.load'); - this.success = {}; - this.skuToken = ''; - } + + + + + - postMapLoadEvent(mapId , skuToken , customAccessToken , callback ) { - this.skuToken = skuToken; - this.errorCb = callback; +class At { + + + - if (config.EVENTS_URL) { - if (customAccessToken || config.ACCESS_TOKEN) { - this.queueRequest({id: mapId, timestamp: Date.now()}, customAccessToken); - } else { - this.errorCb(new Error(AUTH_ERR_MSG)); - } - } + constructor(type , index , input ) { + this.type = type; + this.index = index; + this.input = input; } - processRequests(customAccessToken ) { - if (this.pendingRequest || this.queue.length === 0) return; - const {id, timestamp} = this.queue.shift(); + static parse(args , context ) { + if (args.length !== 3) + return context.error(`Expected 2 arguments, but found ${args.length - 1} instead.`); - // Only one load event should fire per map - if (id && this.success[id]) return; + const index = context.parse(args[1], 1, NumberType); + const input = context.parse(args[2], 2, array$1(context.expectedType || ValueType)); - if (!this.anonId) { - this.fetchEventData(); + if (!index || !input) return null; + + const t = (input.type ); + return new At(t.itemType, index, input); + } + + evaluate(ctx ) { + const index = ((this.index.evaluate(ctx) ) ); + const array = ((this.input.evaluate(ctx) ) ); + + if (index < 0) { + throw new RuntimeError(`Array index out of bounds: ${index} < 0.`); } - if (!validateUuid(this.anonId)) { - this.anonId = uuid(); + if (index >= array.length) { + throw new RuntimeError(`Array index out of bounds: ${index} > ${array.length - 1}.`); } - this.postEvent(timestamp, {skuToken: this.skuToken}, (err) => { - if (err) { - this.errorCb(err); - } else { - if (id) this.success[id] = true; - } + if (index !== Math.floor(index)) { + throw new RuntimeError(`Array index must be an integer, but found ${index} instead.`); + } - }, customAccessToken); + return array[index]; } -} -class MapSessionAPI extends TelemetryEvent { - - - + eachChild(fn ) { + fn(this.index); + fn(this.input); + } - constructor() { - super('map.auth'); - this.success = {}; - this.skuToken = ''; + outputDefined() { + return false; } - getSession(timestamp , token , callback , customAccessToken ) { - if (!config.API_URL || !config.SESSION_PATH) return; - const authUrlObject = parseUrl(config.API_URL + config.SESSION_PATH); - authUrlObject.params.push(`sku=${token || ''}`); - authUrlObject.params.push(`access_token=${customAccessToken || config.ACCESS_TOKEN || ''}`); + serialize() { + return ["at", this.index.serialize(), this.input.serialize()]; + } +} - const request = { - url: formatUrl(authUrlObject), - headers: { - 'Content-Type': 'text/plain', //Skip the pre-flight OPTIONS request - } - }; +// - this.pendingRequest = getData(request, (error) => { - this.pendingRequest = null; - callback(error); - this.saveEventData(); - this.processRequests(customAccessToken); - }); - } + + + + - getSessionAPI(mapId , skuToken , customAccessToken , callback ) { - this.skuToken = skuToken; - this.errorCb = callback; +class In { + + + - if (config.SESSION_PATH && config.API_URL) { - if (customAccessToken || config.ACCESS_TOKEN) { - this.queueRequest({id: mapId, timestamp: Date.now()}, customAccessToken); - } else { - this.errorCb(new Error(AUTH_ERR_MSG)); - } - } + constructor(needle , haystack ) { + this.type = BooleanType; + this.needle = needle; + this.haystack = haystack; } - processRequests(customAccessToken ) { - if (this.pendingRequest || this.queue.length === 0) return; - const {id, timestamp} = this.queue.shift(); + static parse(args , context ) { + if (args.length !== 3) { + return context.error(`Expected 2 arguments, but found ${args.length - 1} instead.`); + } - // Only one load event should fire per map - if (id && this.success[id]) return; + const needle = context.parse(args[1], 1, ValueType); - this.getSession(timestamp, this.skuToken, (err) => { - if (err) { - this.errorCb(err); - } else { - if (id) this.success[id] = true; - } - }, customAccessToken); - } -} + const haystack = context.parse(args[2], 2, ValueType); -class TurnstileEvent extends TelemetryEvent { - constructor(customAccessToken ) { - super('appUserTurnstile'); - this._customAccessToken = customAccessToken; - } + if (!needle || !haystack) return null; - postTurnstileEvent(tileUrls , customAccessToken ) { - //Enabled only when Mapbox Access Token is set and a source uses - // mapbox tiles. - if (config.EVENTS_URL && - config.ACCESS_TOKEN && - Array.isArray(tileUrls) && - tileUrls.some(url => isMapboxURL(url) || isMapboxHTTPURL(url))) { - this.queueRequest(Date.now(), customAccessToken); + if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) { + return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(needle.type)} instead`); } - } - processRequests(customAccessToken ) { - if (this.pendingRequest || this.queue.length === 0) { - return; - } + return new In(needle, haystack); + } - if (!this.anonId || !this.eventData.lastSuccess || !this.eventData.tokenU) { - //Retrieve cached data - this.fetchEventData(); - } + evaluate(ctx ) { + const needle = (this.needle.evaluate(ctx) ); + const haystack = (this.haystack.evaluate(ctx) ); - const tokenData = parseAccessToken(config.ACCESS_TOKEN); - const tokenU = tokenData ? tokenData['u'] : config.ACCESS_TOKEN; - //Reset event data cache if the access token owner changed. - let dueForEvent = tokenU !== this.eventData.tokenU; + if (haystack == null) return false; - if (!validateUuid(this.anonId)) { - this.anonId = uuid(); - dueForEvent = true; + if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) { + throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(typeOf(needle))} instead.`); } - const nextUpdate = this.queue.shift(); - // Record turnstile event once per calendar day. - if (this.eventData.lastSuccess) { - const lastUpdate = new Date(this.eventData.lastSuccess); - const nextDate = new Date(nextUpdate); - const daysElapsed = (nextUpdate - this.eventData.lastSuccess) / (24 * 60 * 60 * 1000); - dueForEvent = dueForEvent || daysElapsed >= 1 || daysElapsed < -1 || lastUpdate.getDate() !== nextDate.getDate(); - } else { - dueForEvent = true; + if (!isValidNativeType(haystack, ['string', 'array'])) { + throw new RuntimeError(`Expected second argument to be of type array or string, but found ${toString$1(typeOf(haystack))} instead.`); } - if (!dueForEvent) { - return this.processRequests(); - } + return haystack.indexOf(needle) >= 0; + } - this.postEvent(nextUpdate, {"enabled.telemetry": false}, (err) => { - if (!err) { - this.eventData.lastSuccess = nextUpdate; - this.eventData.tokenU = tokenU; - } - }, customAccessToken); + eachChild(fn ) { + fn(this.needle); + fn(this.haystack); + } + + outputDefined() { + return true; + } + + serialize() { + return ["in", this.needle.serialize(), this.haystack.serialize()]; } } -const turnstileEvent_ = new TurnstileEvent(); -const postTurnstileEvent = turnstileEvent_.postTurnstileEvent.bind(turnstileEvent_); +// -const mapLoadEvent_ = new MapLoadEvent(); -const postMapLoadEvent = mapLoadEvent_.postMapLoadEvent.bind(mapLoadEvent_); + + + + -const mapSessionAPI_ = new MapSessionAPI(); -const getMapSessionAPI = mapSessionAPI_.getSessionAPI.bind(mapSessionAPI_); +class IndexOf { + + + + -const authenticatedMaps = new Set(); -function storeAuthState(gl , state ) { - if (state) { - authenticatedMaps.add(gl); - } else { - authenticatedMaps.delete(gl); + constructor(needle , haystack , fromIndex ) { + this.type = NumberType; + this.needle = needle; + this.haystack = haystack; + this.fromIndex = fromIndex; } -} -function isMapAuthenticated(gl ) { - return authenticatedMaps.has(gl); -} + static parse(args , context ) { + if (args.length <= 2 || args.length >= 5) { + return context.error(`Expected 3 or 4 arguments, but found ${args.length - 1} instead.`); + } -function removeAuthState(gl ) { - authenticatedMaps.delete(gl); -} + const needle = context.parse(args[1], 1, ValueType); -/***** END WARNING - REMOVAL OR MODIFICATION OF THE -PRECEDING CODE VIOLATES THE MAPBOX TERMS OF SERVICE ******/ + const haystack = context.parse(args[2], 2, ValueType); -// + if (!needle || !haystack) return null; + if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) { + return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(needle.type)} instead`); + } - + if (args.length === 4) { + const fromIndex = context.parse(args[3], 3, NumberType); + if (!fromIndex) return null; + return new IndexOf(needle, haystack, fromIndex); + } else { + return new IndexOf(needle, haystack); + } + } -const CACHE_NAME = 'mapbox-tiles'; -let cacheLimit = 500; // 50MB / (100KB/tile) ~= 500 tiles -let cacheCheckThreshold = 50; + evaluate(ctx ) { + const needle = (this.needle.evaluate(ctx) ); + const haystack = (this.haystack.evaluate(ctx) ); -const MIN_TIME_UNTIL_EXPIRY = 1000 * 60 * 7; // 7 minutes. Skip caching tiles with a short enough max age. + if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) { + throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${toString$1(typeOf(needle))} instead.`); + } - - - - - + if (!isValidNativeType(haystack, ['string', 'array'])) { + throw new RuntimeError(`Expected second argument to be of type array or string, but found ${toString$1(typeOf(haystack))} instead.`); + } -// We're using a global shared cache object. Normally, requesting ad-hoc Cache objects is fine, but -// Safari has a memory leak in which it fails to release memory when requesting keys() from a Cache -// object. See https://bugs.webkit.org/show_bug.cgi?id=203991 for more information. -let sharedCache ; + if (this.fromIndex) { + const fromIndex = (this.fromIndex.evaluate(ctx) ); + return haystack.indexOf(needle, fromIndex); + } -function cacheOpen() { - if (window$1.caches && !sharedCache) { - sharedCache = window$1.caches.open(CACHE_NAME); + return haystack.indexOf(needle); } -} -// We're never closing the cache, but our unit tests rely on changing out the global window.caches -// object, so we have a function specifically for unit tests that allows resetting the shared cache. -function cacheClose() { - sharedCache = undefined; -} - -let responseConstructorSupportsReadableStream; -function prepareBody(response , callback) { - if (responseConstructorSupportsReadableStream === undefined) { - try { - new Response(new ReadableStream()); // eslint-disable-line no-undef - responseConstructorSupportsReadableStream = true; - } catch (e) { - // Edge - responseConstructorSupportsReadableStream = false; + eachChild(fn ) { + fn(this.needle); + fn(this.haystack); + if (this.fromIndex) { + fn(this.fromIndex); } } - if (responseConstructorSupportsReadableStream) { - callback(response.body); - } else { - response.blob().then(callback); + outputDefined() { + return false; + } + + serialize() { + if (this.fromIndex != null && this.fromIndex !== undefined) { + const fromIndex = this.fromIndex.serialize(); + return ["index-of", this.needle.serialize(), this.haystack.serialize(), fromIndex]; + } + return ["index-of", this.needle.serialize(), this.haystack.serialize()]; } } -function cachePut(request , response , requestTime ) { - cacheOpen(); - if (!sharedCache) return; +// - const options = { - status: response.status, - statusText: response.statusText, - headers: new window$1.Headers() - }; - response.headers.forEach((v, k) => options.headers.set(k, v)); + + + - const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || ''); - if (cacheControl['no-store']) { - return; - } - if (cacheControl['max-age']) { - options.headers.set('Expires', new Date(requestTime + cacheControl['max-age'] * 1000).toUTCString()); - } +// Map input label values to output expression index + - const timeUntilExpiry = new Date(options.headers.get('Expires')).getTime() - requestTime; - if (timeUntilExpiry < MIN_TIME_UNTIL_EXPIRY) return; +class Match { + + - prepareBody(response, body => { - const clonedResponse = new window$1.Response(body, options); + + + + - cacheOpen(); - if (!sharedCache) return; - sharedCache - .then(cache => cache.put(stripQueryParameters(request.url), clonedResponse)) - .catch(e => warnOnce(e.message)); - }); -} + constructor(inputType , outputType , input , cases , outputs , otherwise ) { + this.inputType = inputType; + this.type = outputType; + this.input = input; + this.cases = cases; + this.outputs = outputs; + this.otherwise = otherwise; + } -function stripQueryParameters(url ) { - const start = url.indexOf('?'); - return start < 0 ? url : url.slice(0, start); -} + static 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.`); -function cacheGet(request , callback ) { - cacheOpen(); - if (!sharedCache) return callback(null); + let inputType; + let outputType; + if (context.expectedType && context.expectedType.kind !== 'value') { + outputType = context.expectedType; + } + const cases = {}; + const outputs = []; + for (let i = 2; i < args.length - 1; i += 2) { + let labels = args[i]; + const value = args[i + 1]; - const strippedURL = stripQueryParameters(request.url); + if (!Array.isArray(labels)) { + labels = [labels]; + } - sharedCache - .then(cache => { - // manually strip URL instead of `ignoreSearch: true` because of a known - // performance issue in Chrome https://github.com/mapbox/mapbox-gl-js/issues/8431 - cache.match(strippedURL) - .then(response => { - const fresh = isFresh(response); + const labelContext = context.concat(i); + if (labels.length === 0) { + return labelContext.error('Expected at least one branch label.'); + } - // Reinsert into cache so that order of keys in the cache is the order of access. - // This line makes the cache a LRU instead of a FIFO cache. - cache.delete(strippedURL); - if (fresh) { - cache.put(strippedURL, response.clone()); - } + for (const label of labels) { + 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}.`); - callback(null, response, fresh); - }) - .catch(callback); - }) - .catch(callback); + } 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; + } -function isFresh(response) { - if (!response) return false; - const expires = new Date(response.headers.get('Expires') || 0); - const cacheControl = parseCacheControl(response.headers.get('Cache-Control') || ''); - return expires > Date.now() && !cacheControl['no-cache']; -} + if (typeof cases[String(label)] !== 'undefined') { + return labelContext.error('Branch labels must be unique.'); + } -// `Infinity` triggers a cache check after the first tile is loaded -// so that a check is run at least once on each page load. -let globalEntryCounter = Infinity; + cases[String(label)] = outputs.length; + } -// The cache check gets run on a worker. The reason for this is that -// profiling sometimes shows this as taking up significant time on the -// thread it gets called from. And sometimes it doesn't. It *may* be -// fine to run this on the main thread but out of caution this is being -// dispatched on a worker. This can be investigated further in the future. -function cacheEntryPossiblyAdded(dispatcher ) { - globalEntryCounter++; - if (globalEntryCounter > cacheCheckThreshold) { - dispatcher.getActor().send('enforceCacheSizeLimit', cacheLimit); - globalEntryCounter = 0; - } -} + const result = context.parse(value, i, outputType); + if (!result) return null; + outputType = outputType || result.type; + outputs.push(result); + } -// runs on worker, see above comment -function enforceCacheSizeLimit(limit ) { - cacheOpen(); - if (!sharedCache) return; + const input = context.parse(args[1], 1, ValueType); + if (!input) return null; - sharedCache - .then(cache => { - cache.keys().then(keys => { - for (let i = 0; i < keys.length - limit; i++) { - cache.delete(keys[i]); - } - }); - }); -} + const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); + if (!otherwise) return null; -function clearTileCache(callback ) { - const promise = window$1.caches.delete(CACHE_NAME); - if (callback) { - promise.catch(callback).then(() => callback()); - } -} + assert_1(inputType && outputType); -function setCacheLimits(limit , checkThreshold ) { - cacheLimit = limit; - cacheCheckThreshold = checkThreshold; -} + if (input.type.kind !== 'value' && context.concat(1).checkSubtype((inputType ), input.type)) { + return null; + } -// + return new Match((inputType ), (outputType ), input, cases, outputs, otherwise); + } - - + evaluate(ctx ) { + const input = (this.input.evaluate(ctx) ); + const output = (typeOf(input) === this.inputType && this.outputs[this.cases[input]]) || this.otherwise; + return output.evaluate(ctx); + } -/** - * The type of a resource. - * @private - * @readonly - * @enum {string} - */ -const ResourceType = { - Unknown: 'Unknown', - Style: 'Style', - Source: 'Source', - Tile: 'Tile', - Glyphs: 'Glyphs', - SpriteImage: 'SpriteImage', - SpriteJSON: 'SpriteJSON', - Image: 'Image' -}; + eachChild(fn ) { + fn(this.input); + this.outputs.forEach(fn); + fn(this.otherwise); + } -if (typeof Object.freeze == 'function') { - Object.freeze(ResourceType); -} + outputDefined() { + return this.outputs.every(out => out.outputDefined()) && this.otherwise.outputDefined(); + } -/** - * 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} method Request method `'GET' | 'POST' | 'PUT'`. - * @property {string} body Request body. - * @property {string} type Response body type to be returned `'string' | 'json' | 'arrayBuffer'`. - * @property {string} credentials `'same-origin'|'include'` Use 'include' to send cookies with cross-origin requests. - * @property {boolean} collectResourceTiming If true, Resource Timing API information will be collected for these transformed requests and returned in a resourceTiming property of relevant data events. - * @example - * // use transformRequest to modify requests that begin with `http://myHost` - * const map = new Map({ - * container: 'map', - * style: 'mapbox://styles/mapbox/streets-v11', - * transformRequest: (url, resourceType) => { - * if (resourceType === 'Source' && url.indexOf('http://myHost') > -1) { - * return { - * url: url.replace('http', 'https'), - * headers: {'my-custom-header': true}, - * credentials: 'include' // Include cookies for cross-origin requests - * }; - * } - * } - * }); - * - */ - - - - - - - - - + serialize() { + const serialized = ["match", this.input.serialize()]; - + // Sort so serialization has an arbitrary defined order, even though + // branch order doesn't affect evaluation + const sortedLabels = Object.keys(this.cases).sort(); -class AJAXError extends Error { - - - constructor(message , status , url ) { - if (status === 401 && isMapboxHTTPURL(url)) { - message += ': you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens-and-token-scopes'; + // Group branches by unique match expression to support condensed + // serializations of the form [case1, case2, ...] -> matchExpression + const groupedByOutput = []; + const outputLookup = {}; // lookup index into groupedByOutput for a given output expression + for (const label of sortedLabels) { + const outputIndex = outputLookup[this.cases[label]]; + if (outputIndex === undefined) { + // First time seeing this output, add it to the end of the grouped list + outputLookup[this.cases[label]] = groupedByOutput.length; + groupedByOutput.push([this.cases[label], [label]]); + } else { + // We've seen this expression before, add the label to that output's group + groupedByOutput[outputIndex][1].push(label); + } } - super(message); - this.status = status; - this.url = url; - } - toString() { - return `${this.name}: ${this.message} (${this.status}): ${this.url}`; + const coerceLabel = (label) => this.inputType.kind === 'number' ? Number(label) : label; + + for (const [outputIndex, labels] of groupedByOutput) { + if (labels.length === 1) { + // Only a single label matches this output expression + serialized.push(coerceLabel(labels[0])); + } else { + // Array of literal labels pointing to this output expression + serialized.push(labels.map(coerceLabel)); + } + serialized.push(this.outputs[outputIndex].serialize()); + } + serialized.push(this.otherwise.serialize()); + return serialized; } } -// Ensure that we're sending the correct referrer from blob URL worker bundles. -// For files loaded from the local file system, `location.origin` will be set -// to the string(!) "null" (Firefox), or "file://" (Chrome, Safari, Edge, IE), -// and we will set an empty referrer. Otherwise, we're using the document's URL. -/* global self */ -const getReferrer = isWorker() ? - () => self.worker && self.worker.referrer : - () => (window$1.location.protocol === 'blob:' ? window$1.parent : window$1).location.href; +// -// Determines whether a URL is a file:// URL. This is obviously the case if it begins -// with file://. Relative URLs are also file:// URLs iff the original document was loaded -// via a file:// URL. -const isFileURL = url => /^file:/.test(url) || (/^file:/.test(getReferrer()) && !/^\w+:/.test(url)); + + + + -function makeFetchRequest(requestParameters , callback ) { - const controller = new window$1.AbortController(); - const request = new window$1.Request(requestParameters.url, { - method: requestParameters.method || 'GET', - body: requestParameters.body, - credentials: requestParameters.credentials, - headers: requestParameters.headers, - referrer: getReferrer(), - signal: controller.signal - }); - let complete = false; - let aborted = false; + - const cacheIgnoringSearch = hasCacheDefeatingSku(request.url); +class Case { + - if (requestParameters.type === 'json') { - request.headers.set('Accept', 'application/json'); + + + + constructor(type , branches , otherwise ) { + this.type = type; + this.branches = branches; + this.otherwise = otherwise; } - const validateOrFetch = (err, cachedResponse, responseIsFresh) => { - if (aborted) return; + static 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.`); - if (err) { - // Do fetch in case of cache error. - // HTTP pages in Edge trigger a security error that can be ignored. - if (err.message !== 'SecurityError') { - warnOnce(err); - } + let outputType ; + if (context.expectedType && context.expectedType.kind !== 'value') { + outputType = context.expectedType; } - if (cachedResponse && responseIsFresh) { - return finishRequest(cachedResponse); - } + const branches = []; + for (let i = 1; i < args.length - 1; i += 2) { + const test = context.parse(args[i], i, BooleanType); + if (!test) return null; - if (cachedResponse) { - // We can't do revalidation with 'If-None-Match' because then the - // request doesn't have simple cors headers. + const result = context.parse(args[i + 1], i + 1, outputType); + if (!result) return null; + + branches.push([test, result]); + + outputType = outputType || result.type; } - const requestTime = Date.now(); + const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); + if (!otherwise) return null; - window$1.fetch(request).then(response => { - if (response.ok) { - const cacheableResponse = cacheIgnoringSearch ? response.clone() : null; - return finishRequest(response, cacheableResponse, requestTime); + assert_1(outputType); + return new Case((outputType ), branches, otherwise); + } - } else { - return callback(new AJAXError(response.statusText, response.status, requestParameters.url)); - } - }).catch(error => { - if (error.code === 20) { - // silence expected AbortError - return; + evaluate(ctx ) { + for (const [test, expression] of this.branches) { + if (test.evaluate(ctx)) { + return expression.evaluate(ctx); } - callback(new Error(error.message)); - }); - }; + } + return this.otherwise.evaluate(ctx); + } - const finishRequest = (response, cacheableResponse, requestTime) => { - ( - requestParameters.type === 'arrayBuffer' ? response.arrayBuffer() : - requestParameters.type === 'json' ? response.json() : - response.text() - ).then(result => { - if (aborted) return; - if (cacheableResponse && requestTime) { - // The response needs to be inserted into the cache after it has completely loaded. - // Until it is fully loaded there is a chance it will be aborted. Aborting while - // reading the body can cause the cache insertion to error. We could catch this error - // in most browsers but in Firefox it seems to sometimes crash the tab. Adding - // it to the cache here avoids that error. - cachePut(request, cacheableResponse, requestTime); - } - complete = true; - callback(null, result, response.headers.get('Cache-Control'), response.headers.get('Expires')); - }).catch(err => { - if (!aborted) callback(new Error(err.message)); - }); - }; + eachChild(fn ) { + for (const [test, expression] of this.branches) { + fn(test); + fn(expression); + } + fn(this.otherwise); + } - if (cacheIgnoringSearch) { - cacheGet(request, validateOrFetch); - } else { - validateOrFetch(null, null); + outputDefined() { + return this.branches.every(([_, out]) => out.outputDefined()) && this.otherwise.outputDefined(); } - return {cancel: () => { - aborted = true; - if (!complete) controller.abort(); - }}; + serialize() { + const serialized = ["case"]; + this.eachChild(child => { serialized.push(child.serialize()); }); + return serialized; + } } -function makeXMLHttpRequest(requestParameters , callback ) { - const xhr = new window$1.XMLHttpRequest(); +// + + + + + + +class Slice { + + + + + + constructor(type , input , beginIndex , endIndex ) { + this.type = type; + this.input = input; + this.beginIndex = beginIndex; + this.endIndex = endIndex; - xhr.open(requestParameters.method || 'GET', requestParameters.url, true); - if (requestParameters.type === 'arrayBuffer') { - xhr.responseType = 'arraybuffer'; - } - for (const k in requestParameters.headers) { - xhr.setRequestHeader(k, requestParameters.headers[k]); - } - if (requestParameters.type === 'json') { - xhr.responseType = 'text'; - xhr.setRequestHeader('Accept', 'application/json'); } - xhr.withCredentials = requestParameters.credentials === 'include'; - xhr.onerror = () => { - callback(new Error(xhr.statusText)); - }; - xhr.onload = () => { - if (((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) && xhr.response !== null) { - let data = xhr.response; - if (requestParameters.type === 'json') { - // We're manually parsing JSON here to get better error messages. - try { - data = JSON.parse(xhr.response); - } catch (err) { - return callback(err); - } - } - callback(null, data, xhr.getResponseHeader('Cache-Control'), xhr.getResponseHeader('Expires')); - } else { - callback(new AJAXError(xhr.statusText, xhr.status, requestParameters.url)); + + static parse(args , context ) { + if (args.length <= 2 || args.length >= 5) { + return context.error(`Expected 3 or 4 arguments, but found ${args.length - 1} instead.`); } - }; - xhr.send(requestParameters.body); - return {cancel: () => xhr.abort()}; -} -const makeRequest = function(requestParameters , callback ) { - // We're trying to use the Fetch API if possible. However, in some situations we can't use it: - // - Safari exposes window.AbortController, but it doesn't work actually abort any requests in - // older versions (see https://bugs.webkit.org/show_bug.cgi?id=174980#c2). In this case, - // we dispatch the request to the main thread so that we can get an accurate referrer header. - // - Requests for resources with the file:// URI scheme don't work with the Fetch API either. In - // this case we unconditionally use XHR on the current thread since referrers don't matter. - if (!isFileURL(requestParameters.url)) { - if (window$1.fetch && window$1.Request && window$1.AbortController && window$1.Request.prototype.hasOwnProperty('signal')) { - return makeFetchRequest(requestParameters, callback); + const input = context.parse(args[1], 1, ValueType); + const beginIndex = context.parse(args[2], 2, NumberType); + + if (!input || !beginIndex) return null; + + if (!isValidType(input.type, [array$1(ValueType), StringType, ValueType])) { + return context.error(`Expected first argument to be of type array or string, but found ${toString$1(input.type)} instead`); } - if (isWorker() && self.worker && self.worker.actor) { - const queueOnMainThread = true; - return self.worker.actor.send('getResource', requestParameters, callback, undefined, queueOnMainThread); + + if (args.length === 4) { + const endIndex = context.parse(args[3], 3, NumberType); + if (!endIndex) return null; + return new Slice(input.type, input, beginIndex, endIndex); + } else { + return new Slice(input.type, input, beginIndex); } } - return makeXMLHttpRequest(requestParameters, callback); -}; -const getJSON = function(requestParameters , callback ) { - return makeRequest(extend(requestParameters, {type: 'json'}), callback); -}; + evaluate(ctx ) { + const input = (this.input.evaluate(ctx) ); + const beginIndex = (this.beginIndex.evaluate(ctx) ); -const getArrayBuffer = function(requestParameters , callback ) { - return makeRequest(extend(requestParameters, {type: 'arrayBuffer'}), callback); -}; + if (!isValidNativeType(input, ['string', 'array'])) { + throw new RuntimeError(`Expected first argument to be of type array or string, but found ${toString$1(typeOf(input))} instead.`); + } -const postData = function(requestParameters , callback ) { - return makeRequest(extend(requestParameters, {method: 'POST'}), callback); -}; + if (this.endIndex) { + const endIndex = (this.endIndex.evaluate(ctx) ); + return input.slice(beginIndex, endIndex); + } -const getData = function(requestParameters , callback ) { - return makeRequest(extend(requestParameters, {method: 'GET'}), callback); -}; + return input.slice(beginIndex); + } -function sameOrigin(url) { - const a = window$1.document.createElement('a'); - a.href = url; - return a.protocol === window$1.document.location.protocol && a.host === window$1.document.location.host; -} + eachChild(fn ) { + fn(this.input); + fn(this.beginIndex); + if (this.endIndex) { + fn(this.endIndex); + } + } -const transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII='; + outputDefined() { + return false; + } -function arrayBufferToImage(data , callback ) { - const img = new window$1.Image(); - const URL = window$1.URL; - img.onload = () => { - callback(null, img); - URL.revokeObjectURL(img.src); - // prevent image dataURI memory leak in Safari; - // but don't free the image immediately because it might be uploaded in the next frame - // https://github.com/mapbox/mapbox-gl-js/issues/10226 - img.onload = null; - window$1.requestAnimationFrame(() => { img.src = transparentPngUrl; }); - }; - img.onerror = () => callback(new Error('Could not load image. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.')); - const blob = new window$1.Blob([new Uint8Array(data)], {type: 'image/png'}); - img.src = data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl; + serialize() { + if (this.endIndex != null && this.endIndex !== undefined) { + const endIndex = this.endIndex.serialize(); + return ["slice", this.input.serialize(), this.beginIndex.serialize(), endIndex]; + } + return ["slice", this.input.serialize(), this.beginIndex.serialize()]; + } } -function arrayBufferToImageBitmap(data , callback ) { - const blob = new window$1.Blob([new Uint8Array(data)], {type: 'image/png'}); - window$1.createImageBitmap(blob).then((imgBitmap) => { - callback(null, imgBitmap); - }).catch((e) => { - callback(new Error(`Could not load image because of ${e.message}. Please make sure to use a supported image type such as PNG or JPEG. Note that SVGs are not supported.`)); - }); -} +// -let imageQueue, numImageRequests; -const resetImageRequestQueue = () => { - imageQueue = []; - numImageRequests = 0; -}; -resetImageRequestQueue(); + + + + -const getImage = function(requestParameters , callback ) { - if (exported$1.supported) { - if (!requestParameters.headers) { - requestParameters.headers = {}; - } - requestParameters.headers.accept = 'image/webp,*/*'; - } + - // limit concurrent image loads to help with raster sources performance on big screens - if (numImageRequests >= config.MAX_PARALLEL_IMAGE_REQUESTS) { - const queued = { - requestParameters, - callback, - cancelled: false, - cancel() { this.cancelled = true; } - }; - imageQueue.push(queued); - return queued; +function isComparableType(op , type ) { + if (op === '==' || op === '!=') { + // equality operator + return type.kind === 'boolean' || + type.kind === 'string' || + type.kind === 'number' || + type.kind === 'null' || + type.kind === 'value'; + } else { + // ordering operator + return type.kind === 'string' || + type.kind === 'number' || + type.kind === 'value'; } - numImageRequests++; +} - let advanced = false; - const advanceImageRequestQueue = () => { - if (advanced) return; - advanced = true; - numImageRequests--; - assert_1(numImageRequests >= 0); - while (imageQueue.length && numImageRequests < config.MAX_PARALLEL_IMAGE_REQUESTS) { // eslint-disable-line - const request = imageQueue.shift(); - const {requestParameters, callback, cancelled} = request; - if (!cancelled) { - request.cancel = getImage(requestParameters, callback).cancel; - } +function eq(ctx , a , b ) { return a === b; } +function neq(ctx , a , b ) { return a !== b; } +function lt(ctx , a , b ) { return a < b; } +function gt(ctx , a , b ) { return a > b; } +function lteq(ctx , a , b ) { return a <= b; } +function gteq(ctx , a , b ) { return a >= b; } + +function eqCollate(ctx , a , b , c ) { return c.compare(a, b) === 0; } +function neqCollate(ctx , a , b , c ) { return !eqCollate(ctx, a, b, c); } +function ltCollate(ctx , a , b , c ) { return c.compare(a, b) < 0; } +function gtCollate(ctx , a , b , c ) { return c.compare(a, b) > 0; } +function lteqCollate(ctx , a , b , c ) { return c.compare(a, b) <= 0; } +function gteqCollate(ctx , a , b , c ) { return c.compare(a, b) >= 0; } + +/** + * Special form for comparison operators, implementing the signatures: + * - (T, T, ?Collator) => boolean + * - (T, value, ?Collator) => boolean + * - (value, T, ?Collator) => boolean + * + * For inequalities, T must be either value, string, or number. For ==/!=, it + * can also be boolean or null. + * + * Equality semantics are equivalent to Javascript's strict equality (===/!==) + * -- i.e., when the arguments' types don't match, == evaluates to false, != to + * true. + * + * When types don't match in an ordering comparison, a runtime error is thrown. + * + * @private + */ +function makeComparison(op , compareBasic , compareWithCollator ) { + const isOrderComparison = op !== '==' && op !== '!='; + + return class Comparison { + + + + + + + constructor(lhs , rhs , collator ) { + this.type = BooleanType; + this.lhs = lhs; + this.rhs = rhs; + this.collator = collator; + this.hasUntypedArgument = lhs.type.kind === 'value' || rhs.type.kind === 'value'; } - }; - // request the image with XHR to work around caching issues - // see https://github.com/mapbox/mapbox-gl-js/issues/1470 - const request = getArrayBuffer(requestParameters, (err , data , cacheControl , expires ) => { + static parse(args , context ) { + if (args.length !== 3 && args.length !== 4) + return context.error(`Expected two or three arguments.`); - advanceImageRequestQueue(); + const op = (args[0] ); - if (err) { - callback(err); - } else if (data) { - if (window$1.createImageBitmap) { - arrayBufferToImageBitmap(data, (err, imgBitmap) => callback(err, imgBitmap, cacheControl, expires)); - } else { - arrayBufferToImage(data, (err, img) => callback(err, img, cacheControl, expires)); + let lhs = context.parse(args[1], 1, ValueType); + if (!lhs) return null; + if (!isComparableType(op, lhs.type)) { + return context.concat(1).error(`"${op}" comparisons are not supported for type '${toString$1(lhs.type)}'.`); + } + let rhs = context.parse(args[2], 2, ValueType); + if (!rhs) return null; + if (!isComparableType(op, rhs.type)) { + return context.concat(2).error(`"${op}" comparisons are not supported for type '${toString$1(rhs.type)}'.`); } - } - }); - return { - cancel: () => { - request.cancel(); - advanceImageRequestQueue(); - } - }; -}; + if ( + lhs.type.kind !== rhs.type.kind && + lhs.type.kind !== 'value' && + rhs.type.kind !== 'value' + ) { + return context.error(`Cannot compare types '${toString$1(lhs.type)}' and '${toString$1(rhs.type)}'.`); + } -const getVideo = function(urls , callback ) { - const video = window$1.document.createElement('video'); - video.muted = true; - video.onloadstart = function() { - callback(null, video); - }; - for (let i = 0; i < urls.length; i++) { - const s = window$1.document.createElement('source'); - if (!sameOrigin(urls[i])) { - video.crossOrigin = 'Anonymous'; + if (isOrderComparison) { + // typing rules specific to less/greater than operators + if (lhs.type.kind === 'value' && rhs.type.kind !== 'value') { + // (value, T) + lhs = new Assertion(rhs.type, [lhs]); + } else if (lhs.type.kind !== 'value' && rhs.type.kind === 'value') { + // (T, value) + rhs = new Assertion(lhs.type, [rhs]); + } + } + + let collator = null; + if (args.length === 4) { + if ( + lhs.type.kind !== 'string' && + rhs.type.kind !== 'string' && + lhs.type.kind !== 'value' && + rhs.type.kind !== 'value' + ) { + return context.error(`Cannot use collator to compare non-string types.`); + } + collator = context.parse(args[3], 3, CollatorType); + if (!collator) return null; + } + + return new Comparison(lhs, rhs, collator); } - s.src = urls[i]; - video.appendChild(s); - } - return {cancel: () => {}}; -}; -// + evaluate(ctx ) { + const lhs = this.lhs.evaluate(ctx); + const rhs = this.rhs.evaluate(ctx); - - + if (isOrderComparison && this.hasUntypedArgument) { + const lt = typeOf(lhs); + const rt = typeOf(rhs); + // check that type is string or number, and equal + if (lt.kind !== rt.kind || !(lt.kind === 'string' || lt.kind === 'number')) { + throw new RuntimeError(`Expected arguments for "${op}" to be (string, string) or (number, number), but found (${lt.kind}, ${rt.kind}) instead.`); + } + } -function _addEventListener(type , listener , listenerList ) { - const listenerExists = listenerList[type] && listenerList[type].indexOf(listener) !== -1; - if (!listenerExists) { - listenerList[type] = listenerList[type] || []; - listenerList[type].push(listener); - } -} + if (this.collator && !isOrderComparison && this.hasUntypedArgument) { + const lt = typeOf(lhs); + const rt = typeOf(rhs); + if (lt.kind !== 'string' || rt.kind !== 'string') { + return compareBasic(ctx, lhs, rhs); + } + } -function _removeEventListener(type , listener , listenerList ) { - if (listenerList && listenerList[type]) { - const index = listenerList[type].indexOf(listener); - if (index !== -1) { - listenerList[type].splice(index, 1); + return this.collator ? + compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) : + compareBasic(ctx, lhs, rhs); } - } -} -class Event { - + eachChild(fn ) { + fn(this.lhs); + fn(this.rhs); + if (this.collator) { + fn(this.collator); + } + } - constructor(type , data = {}) { - extend(this, data); - this.type = type; - } + outputDefined() { + return true; + } + + serialize() { + const serialized = [op]; + this.eachChild(child => { serialized.push(child.serialize()); }); + return serialized; + } + }; } - - - +const Equals = makeComparison('==', eq, eqCollate); +const NotEquals = makeComparison('!=', neq, neqCollate); +const LessThan = makeComparison('<', lt, ltCollate); +const GreaterThan = makeComparison('>', gt, gtCollate); +const LessThanOrEqual = makeComparison('<=', lteq, lteqCollate); +const GreaterThanOrEqual = makeComparison('>=', gteq, gteqCollate); -class ErrorEvent extends Event { - +// - constructor(error , data = {}) { - super('error', extend({error}, data)); - } -} + + + + -/** - * `Evented` mixes methods into other classes for event capabilities. - * - * Unless you are developing a plugin you will most likely use these methods through classes like `Map` or `Popup`. - * - * For lists of events you can listen for, see API documentation for specific classes: [`Map`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events), [`Marker`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events), [`Popup`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events), and [`GeolocationControl`](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events). - * - * @mixin Evented - */ -class Evented { - - - - + + + - /** - * Adds a listener to a specified event type. - * - * @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 {Object} Returns itself to allow for method chaining. - */ - 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} Returns itself to allow for method chaining. - */ - 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 (Optional) The function to be called when the event is fired once. - * If not provided, returns a Promise that will be resolved when the event is fired once. - * @returns {Object} Returns `this` | Promise. - */ - once(type , listener ) { - if (!listener) { - return new Promise(resolve => this.once(type, resolve)); - } + + + + + + - this._oneTimeListeners = this._oneTimeListeners || {}; - _addEventListener(type, listener, this._oneTimeListeners); +class NumberFormat { + + + // BCP 47 language tag + // ISO 4217 currency code, required if style=currency + // Default 0 + // Default 3 - return this; + constructor(number , + locale , + currency , + minFractionDigits , + maxFractionDigits ) { + this.type = StringType; + this.number = number; + this.locale = locale; + this.currency = currency; + this.minFractionDigits = minFractionDigits; + this.maxFractionDigits = maxFractionDigits; } - fire(event , properties ) { - // Compatibility with (type: string, properties: Object) signature from previous versions. - // See https://github.com/mapbox/mapbox-gl-js/issues/6522, - // https://github.com/mapbox/mapbox-gl-draw/issues/766 - if (typeof event === 'string') { - event = new Event(event, properties || {}); - } - - const type = event.type; + static parse(args , context ) { + if (args.length !== 3) + return context.error(`Expected two arguments.`); - if (this.listens(type)) { - (event ).target = this; + const number = context.parse(args[1], 1, NumberType); + if (!number) return null; - // make sure adding or removing listeners inside other listeners won't cause an infinite loop - const listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : []; + const options = (args[2] ); + if (typeof options !== "object" || Array.isArray(options)) + return context.error(`NumberFormat options argument must be an object.`); - for (const listener of listeners) { - listener.call(this, event); - } + let locale = null; + if (options['locale']) { + locale = context.parse(options['locale'], 1, StringType); + if (!locale) return null; + } - const oneTimeListeners = this._oneTimeListeners && this._oneTimeListeners[type] ? this._oneTimeListeners[type].slice() : []; - for (const listener of oneTimeListeners) { - _removeEventListener(type, listener, this._oneTimeListeners); - listener.call(this, event); - } + let currency = null; + if (options['currency']) { + currency = context.parse(options['currency'], 1, StringType); + if (!currency) return null; + } - const parent = this._eventedParent; - if (parent) { - extend( - event, - typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData - ); - parent.fire(event); - } + let minFractionDigits = null; + if (options['min-fraction-digits']) { + minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType); + if (!minFractionDigits) return null; + } - // To ensure that no error events are dropped, print them to the - // console if they have no listeners. - } else if (event instanceof ErrorEvent) { - console.error(event.error); + let maxFractionDigits = null; + if (options['max-fraction-digits']) { + maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType); + if (!maxFractionDigits) return null; } - return this; + return new NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits); } - /** - * Returns true if this instance of Evented or any forwarded instances of Evented have a listener for the specified type. - * - * @param {string} type The event type. - * @returns {boolean} Returns `true` if there is at least one registered listener for specified event type, `false` otherwise. - * @private - */ - 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)) - ); + evaluate(ctx ) { + return new Intl.NumberFormat(this.locale ? this.locale.evaluate(ctx) : [], + { + style: this.currency ? "currency" : "decimal", + currency: this.currency ? this.currency.evaluate(ctx) : undefined, + minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(ctx) : undefined, + maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(ctx) : undefined, + }).format(this.number.evaluate(ctx)); } - /** - * Bubble all events fired by this instance of Evented to this parent instance of Evented. - * - * @returns {Object} `this` - * @private - */ - setEventedParent(parent , data ) { - this._eventedParent = parent; - this._eventedParentData = data; + eachChild(fn ) { + fn(this.number); + if (this.locale) { + fn(this.locale); + } + if (this.currency) { + fn(this.currency); + } + if (this.minFractionDigits) { + fn(this.minFractionDigits); + } + if (this.maxFractionDigits) { + fn(this.maxFractionDigits); + } + } - return this; + outputDefined() { + return false; } -} -var spec = JSON.parse('{"$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"},"terrain":{"type":"terrain"},"fog":{"type":"fog"},"sources":{"required":true,"type":"sources"},"sprite":{"type":"string"},"glyphs":{"type":"string"},"transition":{"type":"transition"},"projection":{"type":"projection"},"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_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.051129,180,85.051129]},"scheme":{"type":"enum","values":{"xyz":{},"tms":{}},"default":"xyz"},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"attribution":{"type":"string"},"promoteId":{"type":"promoteId"},"volatile":{"type":"boolean","default":false},"*":{"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.051129,180,85.051129]},"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"},"volatile":{"type":"boolean","default":false},"*":{"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.051129,180,85.051129]},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"attribution":{"type":"string"},"encoding":{"type":"enum","values":{"terrarium":{},"mapbox":{}},"default":"mapbox"},"volatile":{"type":"boolean","default":false},"*":{"type":"*"}},"source_geojson":{"type":{"required":true,"type":"enum","values":{"geojson":{}}},"data":{"type":"*"},"maxzoom":{"type":"number","default":18},"attribution":{"type":"string"},"buffer":{"type":"number","default":128,"maximum":512,"minimum":0},"filter":{"type":"*"},"tolerance":{"type":"number","default":0.375},"cluster":{"type":"boolean","default":false},"clusterRadius":{"type":"number","default":50,"minimum":0},"clusterMaxZoom":{"type":"number"},"clusterMinPoints":{"type":"number"},"clusterProperties":{"type":"*"},"lineMetrics":{"type":"boolean","default":false},"generateId":{"type":"boolean","default":false},"promoteId":{"type":"promoteId"}},"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"}}},"layer":{"id":{"type":"string","required":true},"type":{"type":"enum","values":{"fill":{},"line":{},"symbol":{},"circle":{},"heatmap":{},"fill-extrusion":{},"raster":{},"hillshade":{},"background":{},"sky":{}},"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_sky"],"layout_background":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_sky":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_fill":{"fill-sort-key":{"type":"number","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_circle":{"circle-sort-key":{"type":"number","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_heatmap":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_fill-extrusion":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_line":{"line-cap":{"type":"enum","values":{"butt":{},"round":{},"square":{}},"default":"butt","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"line-join":{"type":"enum","values":{"bevel":{},"round":{},"miter":{}},"default":"miter","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"line-miter-limit":{"type":"number","default":2,"requires":[{"line-join":"miter"}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"line-round-limit":{"type":"number","default":1.05,"requires":[{"line-join":"round"}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"line-sort-key":{"type":"number","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_symbol":{"symbol-placement":{"type":"enum","values":{"point":{},"line":{},"line-center":{}},"default":"point","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"symbol-spacing":{"type":"number","default":250,"minimum":1,"units":"pixels","requires":[{"symbol-placement":"line"}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"symbol-avoid-edges":{"type":"boolean","default":false,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"symbol-sort-key":{"type":"number","expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"symbol-z-order":{"type":"enum","values":{"auto":{},"viewport-y":{},"source":{}},"default":"auto","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-allow-overlap":{"type":"boolean","default":false,"requires":["icon-image"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-ignore-placement":{"type":"boolean","default":false,"requires":["icon-image"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-optional":{"type":"boolean","default":false,"requires":["icon-image","text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-rotation-alignment":{"type":"enum","values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["icon-image"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-size":{"type":"number","default":1,"minimum":0,"units":"factor of the original icon size","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"icon-text-fit":{"type":"enum","values":{"none":{},"width":{},"height":{},"both":{}},"default":"none","requires":["icon-image","text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-text-fit-padding":{"type":"array","value":"number","length":4,"default":[0,0,0,0],"units":"pixels","requires":["icon-image","text-field",{"icon-text-fit":["both","width","height"]}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"icon-image":{"type":"resolvedImage","tokens":true,"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"icon-rotate":{"type":"number","default":0,"period":360,"units":"degrees","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"icon-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"icon-keep-upright":{"type":"boolean","default":false,"requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"icon-anchor":{"type":"enum","values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"default":"center","requires":["icon-image"],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"icon-pitch-alignment":{"type":"enum","values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["icon-image"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-pitch-alignment":{"type":"enum","values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-rotation-alignment":{"type":"enum","values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-field":{"type":"formatted","default":"","tokens":true,"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-font":{"type":"array","value":"string","default":["Open Sans Regular","Arial Unicode MS Regular"],"requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"ems","requires":["text-field",{"symbol-placement":["point"]}],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-line-height":{"type":"number","default":1.2,"units":"ems","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-letter-spacing":{"type":"number","default":0,"units":"ems","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-justify":{"type":"enum","values":{"auto":{},"left":{},"center":{},"right":{}},"default":"center","requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-radial-offset":{"type":"number","units":"ems","default":0,"requires":["text-field"],"property-type":"data-driven","expression":{"interpolated":true,"parameters":["zoom","feature"]}},"text-variable-anchor":{"type":"array","value":"enum","values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"requires":["text-field",{"symbol-placement":["point"]}],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-anchor":{"type":"enum","values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"default":"center","requires":["text-field",{"!":"text-variable-anchor"}],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-max-angle":{"type":"number","default":45,"units":"degrees","requires":["text-field",{"symbol-placement":["line","line-center"]}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"text-writing-mode":{"type":"array","value":"enum","values":{"horizontal":{},"vertical":{}},"requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"text-keep-upright":{"type":"boolean","default":true,"requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":["line","line-center"]}],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-transform":{"type":"enum","values":{"none":{},"uppercase":{},"lowercase":{}},"default":"none","requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-offset":{"type":"array","value":"number","units":"ems","length":2,"default":[0,0],"requires":["text-field",{"!":"text-radial-offset"}],"expression":{"interpolated":true,"parameters":["zoom","feature"]},"property-type":"data-driven"},"text-allow-overlap":{"type":"boolean","default":false,"requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-ignore-placement":{"type":"boolean","default":false,"requires":["text-field"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-optional":{"type":"boolean","default":false,"requires":["text-field","icon-image"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_raster":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"layout_hillshade":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible","property-type":"constant"}},"filter":{"type":"array","value":"*"},"filter_symbol":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature","pitch","distance-from-center"]}},"filter_fill":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature"]}},"filter_line":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature"]}},"filter_circle":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature"]}},"filter_fill-extrusion":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature"]}},"filter_heatmap":{"type":"boolean","default":false,"transition":false,"property-type":"data-driven","expression":{"interpolated":false,"parameters":["zoom","feature"]}},"filter_operator":{"type":"enum","values":{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},"in":{},"!in":{},"all":{},"any":{},"none":{},"has":{},"!has":{},"within":{}}},"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":24,"value":["number","color"],"length":2},"expression":{"type":"array","value":"*","minimum":1},"fog":{"range":{"type":"array","default":[0.5,10],"minimum":-20,"maximum":20,"length":2,"value":"number","property-type":"data-constant","transition":true,"expression":{"interpolated":true,"parameters":["zoom"]}},"color":{"type":"color","property-type":"data-constant","default":"#ffffff","expression":{"interpolated":true,"parameters":["zoom"]},"transition":true},"horizon-blend":{"type":"number","property-type":"data-constant","default":0.1,"minimum":0,"maximum":1,"expression":{"interpolated":true,"parameters":["zoom"]},"transition":true}},"light":{"anchor":{"type":"enum","default":"viewport","values":{"map":{},"viewport":{}},"property-type":"data-constant","transition":false,"expression":{"interpolated":false,"parameters":["zoom"]}},"position":{"type":"array","default":[1.15,210,30],"length":3,"value":"number","property-type":"data-constant","transition":true,"expression":{"interpolated":true,"parameters":["zoom"]}},"color":{"type":"color","property-type":"data-constant","default":"#ffffff","expression":{"interpolated":true,"parameters":["zoom"]},"transition":true},"intensity":{"type":"number","property-type":"data-constant","default":0.5,"minimum":0,"maximum":1,"expression":{"interpolated":true,"parameters":["zoom"]},"transition":true}},"projection":{"name":{"type":"enum","values":{"albers":{},"equalEarth":{},"equirectangular":{},"lambertConformalConic":{},"mercator":{},"naturalEarth":{},"winkelTripel":{}},"default":"mercator","required":true},"center":{"type":"array","length":2,"value":"number","property-type":"data-constant","transition":false,"requires":[{"name":["albers","lambertConformalConic"]}]},"parallels":{"type":"array","length":2,"value":"number","property-type":"data-constant","transition":false,"requires":[{"name":["albers","lambertConformalConic"]}]}},"terrain":{"source":{"type":"string","required":true},"exaggeration":{"type":"number","property-type":"data-constant","default":1,"minimum":0,"maximum":1000,"expression":{"interpolated":true,"parameters":["zoom"]},"transition":true}},"paint":["paint_fill","paint_line","paint_circle","paint_heatmap","paint_fill-extrusion","paint_symbol","paint_raster","paint_hillshade","paint_background","paint_sky"],"paint_fill":{"fill-antialias":{"type":"boolean","default":true,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"fill-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-color":{"type":"color","default":"#000000","transition":true,"requires":[{"!":"fill-pattern"}],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-outline-color":{"type":"color","transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"fill-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["fill-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"fill-pattern":{"type":"resolvedImage","transition":true,"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"cross-faded-data-driven"}},"paint_fill-extrusion":{"fill-extrusion-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"fill-extrusion-color":{"type":"color","default":"#000000","transition":true,"requires":[{"!":"fill-extrusion-pattern"}],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"fill-extrusion-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["fill-extrusion-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"fill-extrusion-pattern":{"type":"resolvedImage","transition":true,"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"cross-faded-data-driven"},"fill-extrusion-height":{"type":"number","default":0,"minimum":0,"units":"meters","transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-base":{"type":"number","default":0,"minimum":0,"units":"meters","transition":true,"requires":["fill-extrusion-height"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"fill-extrusion-vertical-gradient":{"type":"boolean","default":true,"transition":false,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_line":{"line-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-color":{"type":"color","default":"#000000","transition":true,"requires":[{"!":"line-pattern"}],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"line-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["line-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"line-width":{"type":"number","default":1,"minimum":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-gap-width":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-offset":{"type":"number","default":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-blur":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"line-dasharray":{"type":"array","value":"number","minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}],"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-pattern":{"type":"resolvedImage","transition":true,"expression":{"interpolated":false,"parameters":["zoom","feature"]},"property-type":"cross-faded-data-driven"},"line-gradient":{"type":"color","transition":false,"requires":[{"!":"line-pattern"},{"source":"geojson","has":{"lineMetrics":true}}],"expression":{"interpolated":true,"parameters":["line-progress"]},"property-type":"color-ramp"}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-color":{"type":"color","default":"#000000","transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-blur":{"type":"number","default":0,"transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"circle-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["circle-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"circle-pitch-scale":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"circle-pitch-alignment":{"type":"enum","values":{"map":{},"viewport":{}},"default":"viewport","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"circle-stroke-width":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-color":{"type":"color","default":"#000000","transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"circle-stroke-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"}},"paint_heatmap":{"heatmap-radius":{"type":"number","default":30,"minimum":1,"transition":true,"units":"pixels","expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-weight":{"type":"number","default":1,"minimum":0,"transition":false,"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"heatmap-intensity":{"type":"number","default":1,"minimum":0,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"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"],"transition":false,"expression":{"interpolated":true,"parameters":["heatmap-density"]},"property-type":"color-ramp"},"heatmap-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_symbol":{"icon-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-color":{"type":"color","default":"#000000","transition":true,"requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","transition":true,"requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-width":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","requires":["icon-image"],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"icon-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["icon-image","icon-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"text-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-color":{"type":"color","default":"#000000","transition":true,"overridable":true,"requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","transition":true,"requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-width":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-halo-blur":{"type":"number","default":0,"minimum":0,"transition":true,"units":"pixels","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom","feature","feature-state"]},"property-type":"data-driven"},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"transition":true,"units":"pixels","requires":["text-field"],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"text-translate-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"map","requires":["text-field","text-translate"],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_raster":{"raster-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-hue-rotate":{"type":"number","default":0,"period":360,"transition":true,"units":"degrees","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-brightness-min":{"type":"number","default":0,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-brightness-max":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-saturation":{"type":"number","default":0,"minimum":-1,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-contrast":{"type":"number","default":0,"minimum":-1,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"raster-resampling":{"type":"enum","values":{"linear":{},"nearest":{}},"default":"linear","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"transition":false,"units":"milliseconds","expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_hillshade":{"hillshade-illumination-direction":{"type":"number","default":335,"minimum":0,"maximum":359,"transition":false,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"hillshade-illumination-anchor":{"type":"enum","values":{"map":{},"viewport":{}},"default":"viewport","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"hillshade-exaggeration":{"type":"number","default":0.5,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"hillshade-shadow-color":{"type":"color","default":"#000000","transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"hillshade-highlight-color":{"type":"color","default":"#FFFFFF","transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"hillshade-accent-color":{"type":"color","default":"#000000","transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_background":{"background-color":{"type":"color","default":"#000000","transition":true,"requires":[{"!":"background-pattern"}],"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"},"background-pattern":{"type":"resolvedImage","transition":true,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"cross-faded"},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"}},"paint_sky":{"sky-type":{"type":"enum","values":{"gradient":{},"atmosphere":{}},"default":"atmosphere","expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"sky-atmosphere-sun":{"type":"array","value":"number","length":2,"units":"degrees","minimum":[0,0],"maximum":[360,180],"transition":false,"requires":[{"sky-type":"atmosphere"}],"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"sky-atmosphere-sun-intensity":{"type":"number","requires":[{"sky-type":"atmosphere"}],"default":10,"minimum":0,"maximum":100,"transition":false,"property-type":"data-constant"},"sky-gradient-center":{"type":"array","requires":[{"sky-type":"gradient"}],"value":"number","default":[0,0],"length":2,"units":"degrees","minimum":[0,0],"maximum":[360,180],"transition":false,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"sky-gradient-radius":{"type":"number","requires":[{"sky-type":"gradient"}],"default":90,"minimum":0,"maximum":180,"transition":false,"expression":{"interpolated":false,"parameters":["zoom"]},"property-type":"data-constant"},"sky-gradient":{"type":"color","default":["interpolate",["linear"],["sky-radial-progress"],0.8,"#87ceeb",1,"white"],"transition":false,"requires":[{"sky-type":"gradient"}],"expression":{"interpolated":true,"parameters":["sky-radial-progress"]},"property-type":"color-ramp"},"sky-atmosphere-halo-color":{"type":"color","default":"white","transition":false,"requires":[{"sky-type":"atmosphere"}],"property-type":"data-constant"},"sky-atmosphere-color":{"type":"color","default":"white","transition":false,"requires":[{"sky-type":"atmosphere"}],"property-type":"data-constant"},"sky-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"transition":true,"expression":{"interpolated":true,"parameters":["zoom"]},"property-type":"data-constant"}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds"},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds"}},"property-type":{"data-driven":{"type":"property-type"},"cross-faded":{"type":"property-type"},"cross-faded-data-driven":{"type":"property-type"},"color-ramp":{"type":"property-type"},"data-constant":{"type":"property-type"},"constant":{"type":"property-type"}},"promoteId":{"*":{"type":"string"}}}'); + serialize() { + const options = {}; + if (this.locale) { + options['locale'] = this.locale.serialize(); + } + if (this.currency) { + options['currency'] = this.currency.serialize(); + } + if (this.minFractionDigits) { + options['min-fraction-digits'] = this.minFractionDigits.serialize(); + } + if (this.maxFractionDigits) { + options['max-fraction-digits'] = this.maxFractionDigits.serialize(); + } + return ["number-format", this.number.serialize(), options]; + } +} // -// Note: Do not inherit from Error. It breaks when transpiling to ES5. - -class ValidationError { - - - + + + + - constructor(key , value , message , identifier ) { - this.message = (key ? `${key}: ` : '') + message; - if (identifier) this.identifier = identifier; +class Length { + + - if (value !== null && value !== undefined && value.__line__) { - this.line = value.__line__; - } + constructor(input ) { + this.type = NumberType; + this.input = input; } -} -function validateConstants(options) { - const key = options.key; - const constants = options.value; + static parse(args , context ) { + if (args.length !== 2) + return context.error(`Expected 1 argument, but found ${args.length - 1} instead.`); - if (constants) { - return [new ValidationError(key, constants, 'constants have been deprecated as of v8')]; - } else { - return []; - } -} + const input = context.parse(args[1], 1); + if (!input) return null; -// + if (input.type.kind !== 'array' && input.type.kind !== 'string' && input.type.kind !== 'value') + return context.error(`Expected argument of type string or array, but found ${toString$1(input.type)} instead.`); -function extend$1 (output , ...inputs ) { - for (const input of inputs) { - for (const k in input) { - output[k] = input[k]; - } + return new Length(input); } - return output; -} -// + evaluate(ctx ) { + const input = this.input.evaluate(ctx); + if (typeof input === 'string') { + return input.length; + } else if (Array.isArray(input)) { + return input.length; + } else { + throw new RuntimeError(`Expected value to be of type string or array, but found ${toString$1(typeOf(input))} instead.`); + } + } -// 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; + eachChild(fn ) { + fn(this.input); } -} -function deepUnbundle(value ) { - if (Array.isArray(value)) { - return value.map(deepUnbundle); - } else if (value instanceof Object && !(value instanceof Number || value instanceof String || value instanceof Boolean)) { - const unbundledValue = {}; - for (const key in value) { - unbundledValue[key] = deepUnbundle(value[key]); - } - return unbundledValue; + outputDefined() { + return false; } - return unbundle(value); + serialize() { + const serialized = ["length"]; + this.eachChild(child => { serialized.push(child.serialize()); }); + return serialized; + } } // -class ParsingError extends Error { - - - constructor(key , message ) { - super(message); - this.message = message; - this.key = key; - } -} - -// - - - -/** - * Tracks `let` bindings during expression parsing. - * @private - */ -class Scope { - - - constructor(parent , bindings = []) { - this.parent = parent; - this.bindings = {}; - for (const [name, expression] of bindings) { - this.bindings[name] = expression; - } - } - - concat(bindings ) { - return new Scope(this, bindings); - } + + - 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.`); - } +const expressions = { + // special forms + '==': Equals, + '!=': NotEquals, + '>': GreaterThan, + '<': LessThan, + '>=': GreaterThanOrEqual, + '<=': LessThanOrEqual, + 'array': Assertion, + 'at': At, + 'boolean': Assertion, + 'case': Case, + 'coalesce': Coalesce, + 'collator': CollatorExpression, + 'format': FormatExpression, + 'image': ImageExpression, + 'in': In, + 'index-of': IndexOf, + 'interpolate': Interpolate, + 'interpolate-hcl': Interpolate, + 'interpolate-lab': Interpolate, + 'length': Length, + 'let': Let, + 'literal': Literal, + 'match': Match, + 'number': Assertion, + 'number-format': NumberFormat, + 'object': Assertion, + 'slice': Slice, + 'step': Step, + 'string': Assertion, + 'to-boolean': Coercion, + 'to-color': Coercion, + 'to-number': Coercion, + 'to-string': Coercion, + 'var': Var, + 'within': Within +}; - has(name ) { - if (this.bindings[name]) return true; - return this.parent ? this.parent.has(name) : false; - } +function rgba(ctx, [r, g, b, a]) { + r = r.evaluate(ctx); + g = g.evaluate(ctx); + b = b.evaluate(ctx); + const alpha = a ? a.evaluate(ctx) : 1; + const 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); } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const NullType = {kind: 'null'}; -const NumberType = {kind: 'number'}; -const StringType = {kind: 'string'}; -const BooleanType = {kind: 'boolean'}; -const ColorType = {kind: 'color'}; -const ObjectType = {kind: 'object'}; -const ValueType = {kind: 'value'}; -const ErrorType = {kind: 'error'}; -const CollatorType = {kind: 'collator'}; -const FormattedType = {kind: 'formatted'}; -const ResolvedImageType = {kind: 'resolvedImage'}; +function has(key, obj) { + return key in obj; +} -function array(itemType , N ) { - return { - kind: 'array', - itemType, - N - }; +function get(key, obj) { + const v = obj[key]; + return typeof v === 'undefined' ? null : v; } -function toString(type ) { - if (type.kind === 'array') { - const itemType = toString(type.itemType); - return typeof type.N === 'number' ? - `array<${itemType}, ${type.N}>` : - type.itemType.kind === 'value' ? 'array' : `array<${itemType}>`; - } else { - return type.kind; +function binarySearch(v, a, i, j) { + while (i <= j) { + const m = (i + j) >> 1; + if (a[m] === v) + return true; + if (a[m] > v) + j = m - 1; + else + i = m + 1; } + return false; } -const valueMemberTypes = [ - NullType, - NumberType, - StringType, - BooleanType, - ColorType, - FormattedType, - ObjectType, - array(ValueType), - ResolvedImageType -]; +function varargs(type ) { + return {type}; +} -/** - * 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' && - ((t.N === 0 && t.itemType.kind === 'value') || !checkSubtype(expected.itemType, t.itemType)) && - (typeof expected.N !== 'number' || expected.N === t.N)) { - return null; +CompoundExpression.register(expressions, { + 'error': [ + ErrorType, + [StringType], + (ctx, [v]) => { throw new RuntimeError(v.evaluate(ctx)); } + ], + 'typeof': [ + StringType, + [ValueType], + (ctx, [v]) => toString$1(typeOf(v.evaluate(ctx))) + ], + 'to-rgba': [ + array$1(NumberType, 4), + [ColorType], + (ctx, [v]) => { + return v.evaluate(ctx).toArray(); } - } else if (expected.kind === t.kind) { - return null; - } else if (expected.kind === 'value') { - for (const memberType of valueMemberTypes) { - if (!checkSubtype(memberType, t)) { - return null; + ], + 'rgb': [ + ColorType, + [NumberType, NumberType, NumberType], + rgba + ], + 'rgba': [ + ColorType, + [NumberType, NumberType, NumberType, NumberType], + rgba + ], + 'has': { + type: BooleanType, + overloads: [ + [ + [StringType], + (ctx, [key]) => has(key.evaluate(ctx), ctx.properties()) + ], [ + [StringType, ObjectType], + (ctx, [key, obj]) => has(key.evaluate(ctx), obj.evaluate(ctx)) + ] + ] + }, + 'get': { + type: ValueType, + overloads: [ + [ + [StringType], + (ctx, [key]) => get(key.evaluate(ctx), ctx.properties()) + ], [ + [StringType, ObjectType], + (ctx, [key, obj]) => get(key.evaluate(ctx), obj.evaluate(ctx)) + ] + ] + }, + 'feature-state': [ + ValueType, + [StringType], + (ctx, [key]) => get(key.evaluate(ctx), ctx.featureState || {}) + ], + 'properties': [ + ObjectType, + [], + (ctx) => ctx.properties() + ], + 'geometry-type': [ + StringType, + [], + (ctx) => ctx.geometryType() + ], + 'id': [ + ValueType, + [], + (ctx) => ctx.id() + ], + 'zoom': [ + NumberType, + [], + (ctx) => ctx.globals.zoom + ], + 'pitch': [ + NumberType, + [], + (ctx) => ctx.globals.pitch || 0 + ], + 'distance-from-center': [ + NumberType, + [], + (ctx) => ctx.distanceFromCenter() + ], + 'heatmap-density': [ + NumberType, + [], + (ctx) => ctx.globals.heatmapDensity || 0 + ], + 'line-progress': [ + NumberType, + [], + (ctx) => ctx.globals.lineProgress || 0 + ], + 'sky-radial-progress': [ + NumberType, + [], + (ctx) => ctx.globals.skyRadialProgress || 0 + ], + 'accumulated': [ + ValueType, + [], + (ctx) => ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated + ], + '+': [ + NumberType, + varargs(NumberType), + (ctx, args) => { + let result = 0; + for (const arg of args) { + result += arg.evaluate(ctx); } + return result; } - } - - return `Expected ${toString(expected)} but found ${toString(t)} instead.`; -} - -function isValidType(provided , allowedTypes ) { - return allowedTypes.some(t => t.kind === provided.kind); -} - -function isValidNativeType(provided , allowedTypes ) { - return allowedTypes.some(t => { - if (t === 'null') { - return provided === null; - } else if (t === 'array') { - return Array.isArray(provided); - } else if (t === 'object') { - return provided && !Array.isArray(provided) && typeof provided === 'object'; - } else { - return t === typeof provided; + ], + '*': [ + NumberType, + varargs(NumberType), + (ctx, args) => { + let result = 1; + for (const arg of args) { + result *= arg.evaluate(ctx); + } + return result; } - }); -} - -var csscolorparser = createCommonjsModule(function (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) { } + ], + '-': { + type: NumberType, + overloads: [ + [ + [NumberType, NumberType], + (ctx, [a, b]) => a.evaluate(ctx) - b.evaluate(ctx) + ], [ + [NumberType], + (ctx, [a]) => -a.evaluate(ctx) + ] + ] + }, + '/': [ + NumberType, + [NumberType, NumberType], + (ctx, [a, b]) => a.evaluate(ctx) / b.evaluate(ctx) + ], + '%': [ + NumberType, + [NumberType, NumberType], + (ctx, [a, b]) => a.evaluate(ctx) % b.evaluate(ctx) + ], + 'ln2': [ + NumberType, + [], + () => Math.LN2 + ], + 'pi': [ + NumberType, + [], + () => Math.PI + ], + 'e': [ + NumberType, + [], + () => Math.E + ], + '^': [ + NumberType, + [NumberType, NumberType], + (ctx, [b, e]) => Math.pow(b.evaluate(ctx), e.evaluate(ctx)) + ], + 'sqrt': [ + NumberType, + [NumberType], + (ctx, [x]) => Math.sqrt(x.evaluate(ctx)) + ], + 'log10': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN10 + ], + 'ln': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.log(n.evaluate(ctx)) + ], + 'log2': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN2 + ], + 'sin': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.sin(n.evaluate(ctx)) + ], + 'cos': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.cos(n.evaluate(ctx)) + ], + 'tan': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.tan(n.evaluate(ctx)) + ], + 'asin': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.asin(n.evaluate(ctx)) + ], + 'acos': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.acos(n.evaluate(ctx)) + ], + 'atan': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.atan(n.evaluate(ctx)) + ], + 'min': [ + NumberType, + varargs(NumberType), + (ctx, args) => Math.min(...args.map(arg => arg.evaluate(ctx))) + ], + 'max': [ + NumberType, + varargs(NumberType), + (ctx, args) => Math.max(...args.map(arg => arg.evaluate(ctx))) + ], + 'abs': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.abs(n.evaluate(ctx)) + ], + 'round': [ + NumberType, + [NumberType], + (ctx, [n]) => { + const v = n.evaluate(ctx); + // Javascript's Math.round() rounds towards +Infinity for halfway + // values, even when they're negative. It's more common to round + // away from 0 (e.g., this is what python and C++ do) + return v < 0 ? -Math.round(-v) : Math.round(v); + } + ], + 'floor': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.floor(n.evaluate(ctx)) + ], + 'ceil': [ + NumberType, + [NumberType], + (ctx, [n]) => Math.ceil(n.evaluate(ctx)) + ], + 'filter-==': [ + BooleanType, + [StringType, ValueType], + (ctx, [k, v]) => ctx.properties()[(k ).value] === (v ).value + ], + 'filter-id-==': [ + BooleanType, + [ValueType], + (ctx, [v]) => ctx.id() === (v ).value + ], + 'filter-type-==': [ + BooleanType, + [StringType], + (ctx, [v]) => ctx.geometryType() === (v ).value + ], + 'filter-<': [ + BooleanType, + [StringType, ValueType], + (ctx, [k, v]) => { + const a = ctx.properties()[(k ).value]; + const b = (v ).value; + return typeof a === typeof b && a < b; + } + ], + 'filter-id-<': [ + BooleanType, + [ValueType], + (ctx, [v]) => { + const a = ctx.id(); + const b = (v ).value; + return typeof a === typeof b && a < b; + } + ], + 'filter->': [ + BooleanType, + [StringType, ValueType], + (ctx, [k, v]) => { + const a = ctx.properties()[(k ).value]; + const b = (v ).value; + return typeof a === typeof b && a > b; + } + ], + 'filter-id->': [ + BooleanType, + [ValueType], + (ctx, [v]) => { + const a = ctx.id(); + const b = (v ).value; + return typeof a === typeof b && a > b; + } + ], + 'filter-<=': [ + BooleanType, + [StringType, ValueType], + (ctx, [k, v]) => { + const a = ctx.properties()[(k ).value]; + const b = (v ).value; + return typeof a === typeof b && a <= b; + } + ], + 'filter-id-<=': [ + BooleanType, + [ValueType], + (ctx, [v]) => { + const a = ctx.id(); + const b = (v ).value; + return typeof a === typeof b && a <= b; + } + ], + 'filter->=': [ + BooleanType, + [StringType, ValueType], + (ctx, [k, v]) => { + const a = ctx.properties()[(k ).value]; + const b = (v ).value; + return typeof a === typeof b && a >= b; + } + ], + 'filter-id->=': [ + BooleanType, + [ValueType], + (ctx, [v]) => { + const a = ctx.id(); + const b = (v ).value; + return typeof a === typeof b && a >= b; + } + ], + 'filter-has': [ + BooleanType, + [ValueType], + (ctx, [k]) => (k ).value in ctx.properties() + ], + 'filter-has-id': [ + BooleanType, + [], + (ctx) => (ctx.id() !== null && ctx.id() !== undefined) + ], + 'filter-type-in': [ + BooleanType, + [array$1(StringType)], + (ctx, [v]) => (v ).value.indexOf(ctx.geometryType()) >= 0 + ], + 'filter-id-in': [ + BooleanType, + [array$1(ValueType)], + (ctx, [v]) => (v ).value.indexOf(ctx.id()) >= 0 + ], + 'filter-in-small': [ + BooleanType, + [StringType, array$1(ValueType)], + // assumes v is an array literal + (ctx, [k, v]) => (v ).value.indexOf(ctx.properties()[(k ).value]) >= 0 + ], + 'filter-in-large': [ + BooleanType, + [StringType, array$1(ValueType)], + // assumes v is a array literal with values sorted in ascending order and of a single type + (ctx, [k, v]) => binarySearch(ctx.properties()[(k ).value], (v ).value, 0, (v ).value.length - 1) + ], + 'all': { + type: BooleanType, + overloads: [ + [ + [BooleanType, BooleanType], + (ctx, [a, b]) => a.evaluate(ctx) && b.evaluate(ctx) + ], + [ + varargs(BooleanType), + (ctx, args) => { + for (const arg of args) { + if (!arg.evaluate(ctx)) + return false; + } + return true; + } + ] + ] + }, + 'any': { + type: BooleanType, + overloads: [ + [ + [BooleanType, BooleanType], + (ctx, [a, b]) => a.evaluate(ctx) || b.evaluate(ctx) + ], + [ + varargs(BooleanType), + (ctx, args) => { + for (const arg of args) { + if (arg.evaluate(ctx)) + return true; + } + return false; + } + ] + ] + }, + '!': [ + BooleanType, + [BooleanType], + (ctx, [b]) => !b.evaluate(ctx) + ], + 'is-supported-script': [ + BooleanType, + [StringType], + // At parse time this will always return true, so we need to exclude this expression with isGlobalPropertyConstant + (ctx, [s]) => { + const isSupportedScript = ctx.globals && ctx.globals.isSupportedScript; + if (isSupportedScript) { + return isSupportedScript(s.evaluate(ctx)); + } + return true; + } + ], + 'upcase': [ + StringType, + [StringType], + (ctx, [s]) => s.evaluate(ctx).toUpperCase() + ], + 'downcase': [ + StringType, + [StringType], + (ctx, [s]) => s.evaluate(ctx).toLowerCase() + ], + 'concat': [ + StringType, + varargs(ValueType), + (ctx, args) => args.map(arg => toString(arg.evaluate(ctx))).join('') + ], + 'resolved-locale': [ + StringType, + [CollatorType], + (ctx, [collator]) => collator.evaluate(ctx).resolvedLocale() + ] }); // /** - * 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. + * 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 */ -class Color { - - - - + + + - constructor(r , g , b , a = 1) { - this.r = r; - this.g = g; - this.b = b; - this.a = a; - } +function success (value ) { + return {result: 'success', value}; +} - - - - - +function error (value ) { + return {result: 'error', value}; +} - /** - * 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. - */ - static parse(input ) { - if (!input) { - return undefined; - } +// - if (input instanceof Color) { - return input; - } + - if (typeof input !== 'string') { - return undefined; - } +function supportsPropertyExpression(spec ) { + return spec['property-type'] === 'data-driven' || spec['property-type'] === 'cross-faded-data-driven'; +} - const rgba = csscolorparser.parseCSSColor(input); - if (!rgba) { - return undefined; - } +function supportsZoomExpression(spec ) { + return !!spec.expression && spec.expression.parameters.indexOf('zoom') > -1; +} - return new Color( - rgba[0] / 255 * rgba[3], - rgba[1] / 255 * rgba[3], - rgba[2] / 255 * rgba[3], - rgba[3] - ); - } +function supportsInterpolation(spec ) { + return !!spec.expression && spec.expression.interpolated; +} - /** - * 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)" - */ - toString() { - const [r, g, b, a] = this.toArray(); - return `rgba(${Math.round(r)},${Math.round(g)},${Math.round(b)},${a})`; - } +// - toArray() { - const {r, g, b, a} = this; - return a === 0 ? [0, 0, 0, 0] : [ - r * 255 / a, - g * 255 / a, - b * 255 / a, - a - ]; +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; } } -Color.black = new Color(0, 0, 0, 1); -Color.white = new Color(1, 1, 1, 1); -Color.transparent = new Color(0, 0, 0, 0); -Color.red = new Color(1, 0, 0, 1); -Color.blue = new Color(0, 0, 1, 1); +function isFunction(value) { + return typeof value === 'object' && value !== null && !Array.isArray(value); +} -// +function identityFunction(x) { + return x; +} -// Flow type declarations for Intl cribbed from -// https://github.com/facebook/flow/issues/1270 +function createFunction(parameters, propertySpec) { + const isColor = propertySpec.type === 'color'; + const zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object'; + const featureDependent = zoomAndFeatureDependent || parameters.property !== undefined; + const zoomDependent = zoomAndFeatureDependent || !featureDependent; + const type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval'); - - - + if (isColor) { + parameters = extend({}, parameters); - - - - - + if (parameters.stops) { + parameters.stops = parameters.stops.map((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]) { // eslint-disable-line import/namespace + throw new Error(`Unknown color space: ${parameters.colorSpace}`); + } - - + let innerFun; + let hashedStops; + let categoricalKeyType; + if (type === 'exponential') { + innerFun = evaluateExponentialFunction; + } else if (type === 'interval') { + innerFun = evaluateIntervalFunction; + } else if (type === 'categorical') { + innerFun = evaluateCategoricalFunction; - - - - - - - - - -class Collator { - - - + // For categorical functions, generate an Object as a hashmap of the stops for fast searching + hashedStops = Object.create(null); + for (const stop of parameters.stops) { + hashedStops[stop[0]] = stop[1]; + } - constructor(caseSensitive , diacriticSensitive , locale ) { - if (caseSensitive) - this.sensitivity = diacriticSensitive ? 'variant' : 'case'; - else - this.sensitivity = diacriticSensitive ? 'accent' : 'base'; + // Infer key type based on first stop key-- used to encforce strict type checking later + categoricalKeyType = typeof parameters.stops[0][0]; - this.locale = locale; - this.collator = new Intl.Collator(this.locale ? this.locale : [], - {sensitivity: this.sensitivity, usage: 'search'}); + } else if (type === 'identity') { + innerFun = evaluateIdentityFunction; + } else { + throw new Error(`Unknown function type "${type}"`); } - compare(lhs , rhs ) { - return this.collator.compare(lhs, rhs); - } + if (zoomAndFeatureDependent) { + const featureFunctions = {}; + const zoomStops = []; + for (let s = 0; s < parameters.stops.length; s++) { + const stop = parameters.stops[s]; + const zoom = stop[0].zoom; + if (featureFunctions[zoom] === undefined) { + featureFunctions[zoom] = { + zoom, + type: parameters.type, + property: parameters.property, + default: parameters.default, + stops: [] + }; + zoomStops.push(zoom); + } + featureFunctions[zoom].stops.push([stop[0].value, stop[1]]); + } - resolvedLocale() { - // We create a Collator without "usage: search" because we don't want - // the search options encoded in our result (e.g. "en-u-co-search") - return new Intl.Collator(this.locale ? this.locale : []) - .resolvedOptions().locale; + const featureFunctionStops = []; + for (const z of zoomStops) { + featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]); + } + + const interpolationType = {name: 'linear'}; + return { + kind: 'composite', + interpolationType, + interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType), + zoomStops: featureFunctionStops.map(s => s[0]), + evaluate({zoom}, properties) { + return evaluateExponentialFunction({ + stops: featureFunctionStops, + base: parameters.base + }, propertySpec, zoom).evaluate(zoom, properties); + } + }; + } else if (zoomDependent) { + const interpolationType = type === 'exponential' ? + {name: 'exponential', base: parameters.base !== undefined ? parameters.base : 1} : null; + return { + kind: 'camera', + interpolationType, + interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType), + zoomStops: parameters.stops.map(s => s[0]), + evaluate: ({zoom}) => innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType) + }; + } else { + return { + kind: 'source', + evaluate(_, feature) { + const 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; +} -class FormattedSection { - - - - - +function evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) { + const evaluated = typeof input === keyType ? hashedStops[input] : undefined; // Enforce strict typing on input + return coalesce(evaluated, parameters.default, propertySpec.default); +} - constructor(text , image , scale , fontStack , textColor ) { - // combine characters so that diacritic marks are not separate code points - this.text = text.normalize ? text.normalize() : text; - this.image = image; - this.scale = scale; - this.fontStack = fontStack; - this.textColor = textColor; - } +function evaluateIntervalFunction(parameters, propertySpec, input) { + // Edge cases + if (getType(input) !== 'number') return coalesce(parameters.default, propertySpec.default); + const 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]; + + const index = findStopLessThanOrEqualTo(parameters.stops.map((stop) => stop[0]), input); + + return parameters.stops[index][1]; } -class Formatted { - +function evaluateExponentialFunction(parameters, propertySpec, input) { + const base = parameters.base !== undefined ? parameters.base : 1; - constructor(sections ) { - this.sections = sections; - } + // Edge cases + if (getType(input) !== 'number') return coalesce(parameters.default, propertySpec.default); + const 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]; - static fromString(unformatted ) { - return new Formatted([new FormattedSection(unformatted, null, null, null, null)]); - } + const index = findStopLessThanOrEqualTo(parameters.stops.map((stop) => stop[0]), input); + const t = interpolationFactor( + input, base, + parameters.stops[index][0], + parameters.stops[index + 1][0]); - isEmpty() { - if (this.sections.length === 0) return true; - return !this.sections.some(section => section.text.length !== 0 || - (section.image && section.image.name.length !== 0)); + const outputLower = parameters.stops[index][1]; + const outputUpper = parameters.stops[index + 1][1]; + let interp = interpolate[propertySpec.type] || identityFunction; // eslint-disable-line import/namespace + + if (parameters.colorSpace && parameters.colorSpace !== 'rgb') { + const colorspace = colorSpaces[parameters.colorSpace]; // eslint-disable-line import/namespace + interp = (a, b) => colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t)); } - static factory(text ) { - if (text instanceof Formatted) { - return text; - } else { - return Formatted.fromString(text); - } + if (typeof outputLower.evaluate === 'function') { + return { + evaluate(...args) { + const evaluatedLower = outputLower.evaluate.apply(undefined, args); + const 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); + } + }; } - toString() { - if (this.sections.length === 0) return ''; - return this.sections.map(section => section.text).join(''); + return interp(outputLower, outputUpper, t); +} + +function evaluateIdentityFunction(parameters, propertySpec, input) { + if (propertySpec.type === 'color') { + input = Color.parse(input); + } else if (propertySpec.type === 'formatted') { + input = Formatted.fromString(input.toString()); + } else if (propertySpec.type === 'resolvedImage') { + input = ResolvedImage.fromString(input.toString()); + } else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) { + input = undefined; } + return coalesce(input, parameters.default, propertySpec.default); +} - serialize() { - const serialized = ["format"]; - for (const section of this.sections) { - if (section.image) { - serialized.push(["image", section.image.name]); - continue; - } - serialized.push(section.text); - const options = {}; - if (section.fontStack) { - options["text-font"] = ["literal", section.fontStack.split(',')]; - } - if (section.scale) { - options["font-scale"] = section.scale; - } - if (section.textColor) { - options["text-color"] = (["rgba"] ).concat(section.textColor.toArray()); - } - serialized.push(options); - } - return serialized; +/** + * 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) { + const difference = upperValue - lowerValue; + const 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); } } // + + + + + + + + + + + + + + + - - + + -class ResolvedImage { + + + + + + + + + - constructor(options ) { - this.name = options.name; - this.available = options.available; - } +class StyleExpression { + - toString() { - return this.name; + + + + + + constructor(expression , propertySpec ) { + this.expression = expression; + this._warningHistory = {}; + this._evaluator = new EvaluationContext(); + this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null; + this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null; } - static fromString(name ) { - if (!name) return null; // treat empty values as no image - return new ResolvedImage({name, available: false}); + evaluateWithoutErrorHandling(globals , feature , featureState , canonical , availableImages , formattedSection , featureTileCoord , featureDistanceData ) { + this._evaluator.globals = globals; + this._evaluator.feature = feature; + this._evaluator.featureState = featureState; + this._evaluator.canonical = canonical || null; + this._evaluator.availableImages = availableImages || null; + this._evaluator.formattedSection = formattedSection; + this._evaluator.featureTileCoord = featureTileCoord || null; + this._evaluator.featureDistanceData = featureDistanceData || null; + + return this.expression.evaluate(this._evaluator); } - serialize() { - return ["image", this.name]; + evaluate(globals , feature , featureState , canonical , availableImages , formattedSection , featureTileCoord , featureDistanceData ) { + this._evaluator.globals = globals; + this._evaluator.feature = feature || null; + this._evaluator.featureState = featureState || null; + this._evaluator.canonical = canonical || null; + this._evaluator.availableImages = availableImages || null; + this._evaluator.formattedSection = formattedSection || null; + this._evaluator.featureTileCoord = featureTileCoord || null; + this._evaluator.featureDistanceData = featureDistanceData || null; + + try { + const val = this.expression.evaluate(this._evaluator); + // eslint-disable-next-line no-self-compare + if (val === null || val === undefined || (typeof val === 'number' && val !== val)) { + return this._defaultValue; + } + if (this._enumValues && !(val in this._enumValues)) { + throw new RuntimeError(`Expected value to be one of ${Object.keys(this._enumValues).map(v => 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; + } } } -// +function isExpression(expression ) { + return Array.isArray(expression) && expression.length > 0 && + typeof expression[0] === 'string' && expression[0] in expressions; +} - +/** + * 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 ) { + const parser = new ParsingContext$1(expressions, [], propertySpec ? getExpectedType(propertySpec) : undefined); -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 - )) { - const 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.`; - } + // For string-valued properties, coerce to string at the top level rather than asserting. + const parsed = parser.parse(expression, undefined, undefined, undefined, + propertySpec && propertySpec.type === 'string' ? {typeAnnotation: 'coerce'} : undefined); - 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.`; + if (!parsed) { + assert_1(parser.errors.length > 0); + return error(parser.errors); } - return null; + return success(new StyleExpression(parsed, propertySpec)); } - +class ZoomConstantExpression { + + + -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 (mixed instanceof Collator) { - return true; - } else if (mixed instanceof Formatted) { - return true; - } else if (mixed instanceof ResolvedImage) { - return true; - } else if (Array.isArray(mixed)) { - for (const item of mixed) { - if (!isValue(item)) { - return false; - } - } - return true; - } else if (typeof mixed === 'object') { - for (const key in mixed) { - if (!isValue(mixed[key])) { - return false; - } - } - return true; - } else { - return false; + constructor(kind , expression ) { + this.kind = kind; + this._styleExpression = expression; + this.isStateDependent = kind !== ('constant' ) && !isStateConstant(expression.expression); } -} - -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 (value instanceof Collator) { - return CollatorType; - } else if (value instanceof Formatted) { - return FormattedType; - } else if (value instanceof ResolvedImage) { - return ResolvedImageType; - } else if (Array.isArray(value)) { - const length = value.length; - let itemType ; - - for (const item of value) { - const t = typeOf(item); - if (!itemType) { - itemType = t; - } else if (itemType === t) { - continue; - } else { - itemType = ValueType; - break; - } - } - return array(itemType || ValueType, length); - } else { - assert_1(typeof value === 'object'); - return ObjectType; + evaluateWithoutErrorHandling(globals , feature , featureState , canonical , availableImages , formattedSection ) { + return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection); } -} -function toString$1(value ) { - const type = typeof value; - if (value === null) { - return ''; - } else if (type === 'string' || type === 'number' || type === 'boolean') { - return String(value); - } else if (value instanceof Color || value instanceof Formatted || value instanceof ResolvedImage) { - return value.toString(); - } else { - return JSON.stringify(value); + evaluate(globals , feature , featureState , canonical , availableImages , formattedSection ) { + return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection); } } -// +class ZoomDependentExpression { + + + - - - - -class Literal { - - + - constructor(type , value ) { - this.type = type; - this.value = value; + constructor(kind , expression , zoomStops , interpolationType ) { + this.kind = kind; + this.zoomStops = zoomStops; + this._styleExpression = expression; + this.isStateDependent = kind !== ('camera' ) && !isStateConstant(expression.expression); + this.interpolationType = interpolationType; } - static 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`); - - const value = (args[1] ); - let type = typeOf(value); - - // special case: infer the item type if possible for zero-length arrays - const 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); - } - - evaluate() { - return this.value; + evaluateWithoutErrorHandling(globals , feature , featureState , canonical , availableImages , formattedSection ) { + return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection); } - eachChild() {} - - outputDefined() { - return true; + evaluate(globals , feature , featureState , canonical , availableImages , formattedSection ) { + return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection); } - serialize() { - if (this.type.kind === 'array' || this.type.kind === 'object') { - return ["literal", this.value]; - } else if (this.value instanceof Color) { - // Constant-folding can generate Literal expressions that you - // couldn't actually generate with a "literal" expression, - // so we have to implement an equivalent serialization here - return ["rgba"].concat(this.value.toArray()); - } else if (this.value instanceof Formatted) { - // Same as Color - return this.value.serialize(); + interpolationFactor(input , lower , upper ) { + if (this.interpolationType) { + return Interpolate.interpolationFactor(this.interpolationType, input, lower, upper); } else { - assert_1(this.value === null || - typeof this.value === 'string' || - typeof this.value === 'number' || - typeof this.value === 'boolean'); - return (this.value ); + return 0; } } } -// + + + + -class RuntimeError { - - + + + + + - constructor(message ) { - this.name = 'ExpressionEvaluationError'; - this.message = message; - } + + + + + + + - toJSON() { - return this.message; - } -} + + + + + + + + -// + + + + + - - - - +function createPropertyExpression(expression , propertySpec ) { + expression = createExpression(expression, propertySpec); + if (expression.result === 'error') { + return expression; + } -const types = { - string: StringType, - number: NumberType, - boolean: BooleanType, - object: ObjectType -}; + const parsed = expression.value.expression; -class Assertion { - - + const isFeatureConstant$1 = isFeatureConstant(parsed); + if (!isFeatureConstant$1 && !supportsPropertyExpression(propertySpec)) { + return error([new ParsingError('', 'data expressions not supported')]); + } - constructor(type , args ) { - this.type = type; - this.args = args; + const isZoomConstant = isGlobalPropertyConstant(parsed, ['zoom', 'pitch', 'distance-from-center']); + if (!isZoomConstant && !supportsZoomExpression(propertySpec)) { + return error([new ParsingError('', 'zoom expressions not supported')]); } - static parse(args , context ) { - if (args.length < 2) - return context.error(`Expected at least one argument.`); + const 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 && !supportsInterpolation(propertySpec)) { + return error([new ParsingError('', '"interpolate" expressions cannot be used with this property')]); + } - let i = 1; - let type; + if (!zoomCurve) { + return success(isFeatureConstant$1 ? + (new ZoomConstantExpression('constant', expression.value) ) : + (new ZoomConstantExpression('source', expression.value) )); + } - const name = (args[0] ); - if (name === 'array') { - let itemType; - if (args.length > 2) { - const type = args[1]; - if (typeof type !== 'string' || !(type in types) || type === 'object') - return context.error('The item type argument of "array" must be one of string, number, boolean', 1); - itemType = types[type]; - i++; - } else { - itemType = ValueType; - } + const interpolationType = zoomCurve instanceof Interpolate ? zoomCurve.interpolation : undefined; - let N; - if (args.length > 3) { - if (args[2] !== null && - (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]; - i++; - } + return success(isFeatureConstant$1 ? + (new ZoomDependentExpression('camera', expression.value, zoomCurve.labels, interpolationType) ) : + (new ZoomDependentExpression('composite', expression.value, zoomCurve.labels, interpolationType) )); +} - type = array(itemType, N); - } else { - assert_1(types[name], name); - type = types[name]; - } +// serialization wrapper for old-style stop functions normalized to the +// expression interface +class StylePropertyFunction { + + - const parsed = []; - for (; i < args.length; i++) { - const input = context.parse(args[i], i, ValueType); - if (!input) return null; - parsed.push(input); - } + + + + - return new Assertion(type, parsed); + constructor(parameters , specification ) { + this._parameters = parameters; + this._specification = specification; + extend(this, createFunction(this._parameters, this._specification)); } - evaluate(ctx ) { - for (let i = 0; i < this.args.length; i++) { - const value = this.args[i].evaluate(ctx); - const error = checkSubtype(this.type, typeOf(value)); - if (!error) { - return value; - } else if (i === this.args.length - 1) { - throw new RuntimeError(`Expected value to be of type ${toString(this.type)}, but found ${toString(typeOf(value))} instead.`); - } - } - - assert_1(false); - return null; + static deserialize(serialized ) { + return new StylePropertyFunction(serialized._parameters, serialized._specification); } - eachChild(fn ) { - this.args.forEach(fn); + static serialize(input ) { + return { + _parameters: input._parameters, + _specification: input._specification + }; } +} - outputDefined() { - return this.args.every(arg => arg.outputDefined()); - } +function normalizePropertyExpression (value , specification ) { + if (isFunction(value)) { + return (new StylePropertyFunction(value, specification) ); - serialize() { - const type = this.type; - const serialized = [type.kind]; - if (type.kind === 'array') { - const itemType = type.itemType; - if (itemType.kind === 'string' || - itemType.kind === 'number' || - itemType.kind === 'boolean') { - serialized.push(itemType.kind); - const N = type.N; - if (typeof N === 'number' || this.args.length > 1) { - serialized.push(N); - } - } + } else if (isExpression(value)) { + const expression = createPropertyExpression(value, specification); + if (expression.result === 'error') { + // this should have been caught in validation + throw new Error(expression.value.map(err => `${err.key}: ${err.message}`).join(', ')); } - return serialized.concat(this.args.map(arg => arg.serialize())); + return expression.value; + + } else { + let constant = value; + if (typeof value === 'string' && specification.type === 'color') { + constant = Color.parse(value); + } + return { + kind: 'constant', + evaluate: () => constant + }; } } -// - - - - - +// 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 ) { + let result = null; + if (expression instanceof Let) { + result = findZoomCurve(expression.result); - - - - - - - - + } else if (expression instanceof Coalesce) { + for (const arg of expression.args) { + result = findZoomCurve(arg); + if (result) { + break; + } + } -class FormatExpression { - - + } else if ((expression instanceof Step || expression instanceof Interpolate) && + expression.input instanceof CompoundExpression && + expression.input.name === 'zoom') { - constructor(sections ) { - this.type = FormattedType; - this.sections = sections; + result = expression; } - static parse(args , context ) { - if (args.length < 2) { - return context.error(`Expected at least one argument.`); - } + if (result instanceof ParsingError) { + return result; + } - const firstArg = args[1]; - if (!Array.isArray(firstArg) && typeof firstArg === 'object') { - return context.error(`First argument must be an image or text section.`); + expression.eachChild((child) => { + const 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.'); } + }); - const sections = []; - let nextTokenMayBeObject = false; - for (let i = 1; i <= args.length - 1; ++i) { - const arg = (args[i] ); - - if (nextTokenMayBeObject && typeof arg === "object" && !Array.isArray(arg)) { - nextTokenMayBeObject = false; - - let scale = null; - if (arg['font-scale']) { - scale = context.parse(arg['font-scale'], 1, NumberType); - if (!scale) return null; - } - - let font = null; - if (arg['text-font']) { - font = context.parse(arg['text-font'], 1, array(StringType)); - if (!font) return null; - } - - let textColor = null; - if (arg['text-color']) { - textColor = context.parse(arg['text-color'], 1, ColorType); - if (!textColor) return null; - } + return result; +} - const lastExpression = sections[sections.length - 1]; - lastExpression.scale = scale; - lastExpression.font = font; - lastExpression.textColor = textColor; - } else { - const content = context.parse(args[i], 1, ValueType); - if (!content) return null; +function getExpectedType(spec ) { + const types = { + color: ColorType, + string: StringType, + number: NumberType, + enum: StringType, + boolean: BooleanType, + formatted: FormattedType, + resolvedImage: ResolvedImageType + }; - const kind = content.type.kind; - if (kind !== 'string' && kind !== 'value' && kind !== 'null' && kind !== 'resolvedImage') - return context.error(`Formatted text type must be 'string', 'value', 'image' or 'null'.`); + if (spec.type === 'array') { + return array$1(types[spec.value] || ValueType, spec.length); + } - nextTokenMayBeObject = true; - sections.push({content, scale: null, font: null, textColor: null}); - } - } + return types[spec.type]; +} - return new FormatExpression(sections); +function getDefaultValue(spec ) { + if (spec.type === 'color' && (isFunction(spec.default) || Array.isArray(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; } +} - evaluate(ctx ) { - const evaluateSection = section => { - const evaluatedContent = section.content.evaluate(ctx); - if (typeOf(evaluatedContent) === ResolvedImageType) { - return new FormattedSection('', evaluatedContent, null, null, null); - } - - return new FormattedSection( - toString$1(evaluatedContent), - null, - section.scale ? section.scale.evaluate(ctx) : null, - section.font ? section.font.evaluate(ctx).join(',') : null, - section.textColor ? section.textColor.evaluate(ctx) : null - ); - }; +// - return new Formatted(this.sections.map(evaluateSection)); - } +// Note: Do not inherit from Error. It breaks when transpiling to ES5. - eachChild(fn ) { - for (const section of this.sections) { - fn(section.content); - if (section.scale) { - fn(section.scale); - } - if (section.font) { - fn(section.font); - } - if (section.textColor) { - fn(section.textColor); - } - } - } +class ValidationError { + + + - outputDefined() { - // Technically the combinatoric set of all children - // Usually, this.text will be undefined anyway - return false; - } + constructor(key , value , message , identifier ) { + this.message = (key ? `${key}: ` : '') + message; + if (identifier) this.identifier = identifier; - serialize() { - const serialized = ["format"]; - for (const section of this.sections) { - serialized.push(section.content.serialize()); - const options = {}; - if (section.scale) { - options['font-scale'] = section.scale.serialize(); - } - if (section.font) { - options['text-font'] = section.font.serialize(); - } - if (section.textColor) { - options['text-color'] = section.textColor.serialize(); - } - serialized.push(options); + if (value !== null && value !== undefined && value.__line__) { + this.line = value.__line__; } - return serialized; } } // - - - - - -class ImageExpression { - - - - constructor(input ) { - this.type = ResolvedImageType; - this.input = input; - } + - static parse(args , context ) { - if (args.length !== 2) { - return context.error(`Expected two arguments.`); - } + + + - const name = context.parse(args[1], 1, StringType); - if (!name) return context.error(`No image name provided.`); +function validateObject(options ) { + const key = options.key; + const object = options.value; + const elementSpecs = options.valueSpec || {}; + const elementValidators = options.objectElementValidators || {}; + const style = options.style; + const styleSpec = options.styleSpec; + let errors = []; - return new ImageExpression(name); + const type = getType(object); + if (type !== 'object') { + return [new ValidationError(key, object, `object expected, ${type} found`)]; } - evaluate(ctx ) { - const evaluatedImageName = this.input.evaluate(ctx); + for (const objectKey in object) { + const elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint' + const elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*']; - const value = ResolvedImage.fromString(evaluatedImageName); - if (value && ctx.availableImages) value.available = ctx.availableImages.indexOf(evaluatedImageName) > -1; + let validateElement; + if (elementValidators[elementSpecKey]) { + validateElement = elementValidators[elementSpecKey]; + } else if (elementSpecs[elementSpecKey]) { + validateElement = validate; + } else if (elementValidators['*']) { + validateElement = elementValidators['*']; + } else if (elementSpecs['*']) { + validateElement = validate; + } - return value; - } + if (!validateElement) { + errors.push(new ValidationError(key, object[objectKey], `unknown property "${objectKey}"`)); + continue; + } - eachChild(fn ) { - fn(this.input); + errors = errors.concat(validateElement({ + key: (key ? `${key}.` : key) + objectKey, + value: object[objectKey], + valueSpec: elementSpec, + style, + styleSpec, + object, + objectKey + // $FlowFixMe[extra-arg] + }, object)); } - outputDefined() { - // The output of image is determined by the list of available images in the evaluation context - return false; - } + for (const elementSpecKey in elementSpecs) { + // Don't check `required` when there's a custom validator for that property. + if (elementValidators[elementSpecKey]) { + continue; + } - serialize() { - return ["image", this.input.serialize()]; + if (elementSpecs[elementSpecKey].required && elementSpecs[elementSpecKey]['default'] === undefined && object[elementSpecKey] === undefined) { + errors.push(new ValidationError(key, object, `missing required property "${elementSpecKey}"`)); + } } + + return errors; } // - - - - + -const types$1 = { - 'to-boolean': BooleanType, - 'to-color': ColorType, - 'to-number': NumberType, - 'to-string': StringType -}; + + + -/** - * 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 - */ -class Coercion { - - +function validateArray(options ) { + const array = options.value; + const arraySpec = options.valueSpec; + const style = options.style; + const styleSpec = options.styleSpec; + const key = options.key; + const validateArrayElement = options.arrayElementValidator || validate; - constructor(type , args ) { - this.type = type; - this.args = args; + if (getType(array) !== 'array') { + return [new ValidationError(key, array, `array expected, ${getType(array)} found`)]; } - static parse(args , context ) { - if (args.length < 2) - return context.error(`Expected at least one argument.`); - - const name = (args[0] ); - assert_1(types$1[name], name); - - if ((name === 'to-boolean' || name === 'to-string') && args.length !== 2) - return context.error(`Expected one argument.`); - - const type = types$1[name]; - - const parsed = []; - for (let i = 1; i < args.length; i++) { - const input = context.parse(args[i], i, ValueType); - if (!input) return null; - parsed.push(input); - } - - return new Coercion(type, parsed); + if (arraySpec.length && array.length !== arraySpec.length) { + return [new ValidationError(key, array, `array length ${arraySpec.length} expected, length ${array.length} found`)]; } - evaluate(ctx ) { - if (this.type.kind === 'boolean') { - return Boolean(this.args[0].evaluate(ctx)); - } else if (this.type.kind === 'color') { - let input; - let error; - for (const arg of this.args) { - input = arg.evaluate(ctx); - error = null; - if (input instanceof Color) { - return input; - } else if (typeof input === 'string') { - const 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 : String(JSON.stringify(input))}'`); - } else if (this.type.kind === 'number') { - let value = null; - for (const arg of this.args) { - value = arg.evaluate(ctx); - if (value === null) return 0; - const num = Number(value); - if (isNaN(num)) continue; - return num; - } - throw new RuntimeError(`Could not convert ${JSON.stringify(value)} to number.`); - } else if (this.type.kind === 'formatted') { - // There is no explicit 'to-formatted' but this coercion can be implicitly - // created by properties that expect the 'formatted' type. - return Formatted.fromString(toString$1(this.args[0].evaluate(ctx))); - } else if (this.type.kind === 'resolvedImage') { - return ResolvedImage.fromString(toString$1(this.args[0].evaluate(ctx))); - } else { - return toString$1(this.args[0].evaluate(ctx)); - } + 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`)]; } - eachChild(fn ) { - this.args.forEach(fn); - } + let arrayElementSpec = { + "type": arraySpec.value, + "values": arraySpec.values, + "minimum": arraySpec.minimum, + "maximum": arraySpec.maximum, + function: undefined + }; - outputDefined() { - return this.args.every(arg => arg.outputDefined()); + if (styleSpec.$version < 7) { + arrayElementSpec.function = arraySpec.function; } - serialize() { - if (this.type.kind === 'formatted') { - return new FormatExpression([{content: this.args[0], scale: null, font: null, textColor: null}]).serialize(); - } - - if (this.type.kind === 'resolvedImage') { - return new ImageExpression(this.args[0]).serialize(); - } + if (getType(arraySpec.value) === 'object') { + arrayElementSpec = arraySpec.value; + } - const serialized = [`to-${this.type.kind}`]; - this.eachChild(child => { serialized.push(child.serialize()); }); - return serialized; + let errors = []; + for (let i = 0; i < array.length; i++) { + errors = errors.concat(validateArrayElement({ + array, + arrayIndex: i, + value: array[i], + valueSpec: arrayElementSpec, + style, + styleSpec, + key: `${key}[${i}]` + })); } + return errors; } // - - - - - - -const geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon']; + -class EvaluationContext { - - - - - - - - - - - constructor() { - this.globals = (null ); - this.feature = null; - this.featureState = null; - this.formattedSection = null; - this._parseColorCache = {}; - this.availableImages = null; - this.canonical = null; - this.featureTileCoord = null; - this.featureDistanceData = null; - } - - id() { - return this.feature && 'id' in this.feature ? this.feature.id : null; - } - - geometryType() { - return this.feature ? typeof this.feature.type === 'number' ? geometryTypes[this.feature.type] : this.feature.type : null; - } + + - geometry() { - return this.feature && 'geometry' in this.feature ? this.feature.geometry : null; - } +function validateNumber(options ) { + const key = options.key; + const value = options.value; + const valueSpec = options.valueSpec; + let type = getType(value); - canonicalID() { - return this.canonical; + // eslint-disable-next-line no-self-compare + if (type === 'number' && value !== value) { + type = 'NaN'; } - properties() { - return this.feature && this.feature.properties || {}; + if (type !== 'number') { + return [new ValidationError(key, value, `number expected, ${type} found`)]; } - distanceFromCenter() { - if (this.featureTileCoord && this.featureDistanceData) { - - const c = this.featureDistanceData.center; - const scale = this.featureDistanceData.scale; - const {x, y} = this.featureTileCoord; - - // Calculate the distance vector `d` (left handed) - const dX = x * scale - c[0]; - const dY = y * scale - c[1]; - - // The bearing vector `b` (left handed) - const bX = this.featureDistanceData.bearing[0]; - const bY = this.featureDistanceData.bearing[1]; - - // Distance is calculated as `dot(d, v)` - const dist = (bX * dX + bY * dY); - return dist; + if ('minimum' in valueSpec) { + let specMin = valueSpec.minimum; + if (getType(valueSpec.minimum) === 'array') { + const i = options.arrayIndex; + specMin = valueSpec.minimum[i]; + } + if (value < specMin) { + return [new ValidationError(key, value, `${value} is less than the minimum value ${specMin}`)]; } - - return 0; } - parseColor(input ) { - let cached = this._parseColorCache[input]; - if (!cached) { - cached = this._parseColorCache[input] = Color.parse(input); + if ('maximum' in valueSpec) { + let specMax = valueSpec.maximum; + if (getType(valueSpec.maximum) === 'array') { + const i = options.arrayIndex; + specMax = valueSpec.maximum[i]; + } + if (value > specMax) { + return [new ValidationError(key, value, `${value} is greater than the maximum value ${specMax}`)]; } - return cached; } + + return []; } // - - - + - - - - - +function validateFunction(options ) { + const functionValueSpec = options.valueSpec; + const functionType = unbundle(options.value.type); + let stopKeyType; + let stopDomainValues = {}; + let previousStopDomainValue; + let previousStopDomainZoom; -class CompoundExpression { - - - - + const isZoomFunction = functionType !== 'categorical' && options.value.property === undefined; + const isPropertyFunction = !isZoomFunction; + const isZoomAndPropertyFunction = + getType(options.value.stops) === 'array' && + getType(options.value.stops[0]) === 'array' && + getType(options.value.stops[0][0]) === 'object'; - + const errors = validateObject({ + key: options.key, + value: options.value, + valueSpec: options.styleSpec.function, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + stops: validateFunctionStops, + default: validateFunctionDefault + } + }); - constructor(name , type , evaluate , args ) { - this.name = name; - this.type = type; - this._evaluate = evaluate; - this.args = args; + if (functionType === 'identity' && isZoomFunction) { + errors.push(new ValidationError(options.key, options.value, 'missing required property "property"')); } - evaluate(ctx ) { - return this._evaluate(ctx, this.args); + if (functionType !== 'identity' && !options.value.stops) { + errors.push(new ValidationError(options.key, options.value, 'missing required property "stops"')); } - eachChild(fn ) { - this.args.forEach(fn); + if (functionType === 'exponential' && options.valueSpec.expression && !supportsInterpolation(options.valueSpec)) { + errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported')); } - outputDefined() { - return false; + if (options.styleSpec.$version >= 8) { + if (isPropertyFunction && !supportsPropertyExpression(options.valueSpec)) { + errors.push(new ValidationError(options.key, options.value, 'property functions not supported')); + } else if (isZoomFunction && !supportsZoomExpression(options.valueSpec)) { + errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported')); + } } - serialize() { - return [this.name].concat(this.args.map(arg => arg.serialize())); + if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) { + errors.push(new ValidationError(options.key, options.value, '"property" property is required')); } - static parse(args , context ) { - const op = (args[0] ); - const definition = CompoundExpression.definitions[op]; - if (!definition) { - return context.error(`Unknown expression "${op}". If you wanted a literal array, use ["literal", [...]].`, 0); + return errors; + + function validateFunctionStops(options ) { + if (functionType === 'identity') { + return [new ValidationError(options.key, options.value, 'identity function may not have a "stops" property')]; } - // Now check argument types against each signature - const type = Array.isArray(definition) ? - definition[0] : definition.type; + let errors = []; + const value = options.value; - const availableOverloads = Array.isArray(definition) ? - [[definition[1], definition[2]]] : - definition.overloads; + errors = errors.concat(validateArray({ + key: options.key, + value, + valueSpec: options.valueSpec, + style: options.style, + styleSpec: options.styleSpec, + arrayElementValidator: validateFunctionStop + })); - const overloads = availableOverloads.filter(([signature]) => ( - !Array.isArray(signature) || // varags - signature.length === args.length - 1 // correct param count - )); + if (getType(value) === 'array' && value.length === 0) { + errors.push(new ValidationError(options.key, value, 'array must have at least one stop')); + } - let signatureContext = (null ); + return errors; + } - for (const [params, evaluate] of overloads) { - // Use a fresh context for each attempted signature so that, if - // we eventually succeed, we haven't polluted `context.errors`. - signatureContext = new ParsingContext(context.registry, context.path, null, context.scope); + function validateFunctionStop(options ) { + let errors = []; + const value = options.value; + const key = options.key; - // First parse all the args, potentially coercing to the - // types expected by this overload. - const parsedArgs = []; - let argParseFailed = false; - for (let i = 1; i < args.length; i++) { - const arg = args[i]; - const expectedType = Array.isArray(params) ? - params[i - 1] : - params.type; + if (getType(value) !== 'array') { + return [new ValidationError(key, value, `array expected, ${getType(value)} found`)]; + } - const parsed = signatureContext.parse(arg, 1 + parsedArgs.length, expectedType); - if (!parsed) { - argParseFailed = true; - break; - } - parsedArgs.push(parsed); + 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 (argParseFailed) { - // Couldn't coerce args of this overload to expected type, move - // on to next one. - continue; + if (value[0].zoom === undefined) { + return [new ValidationError(key, value, 'object stop key must have zoom')]; } - - if (Array.isArray(params)) { - if (params.length !== parsedArgs.length) { - signatureContext.error(`Expected ${params.length} arguments, but found ${parsedArgs.length} instead.`); - continue; - } + if (value[0].value === undefined) { + return [new ValidationError(key, value, 'object stop key must have value')]; } - for (let i = 0; i < parsedArgs.length; i++) { - const expected = Array.isArray(params) ? params[i] : params.type; - const arg = parsedArgs[i]; - signatureContext.concat(i + 1).checkSubtype(expected, arg.type); + const nextStopDomainZoom = unbundle(value[0].zoom); + if (typeof nextStopDomainZoom !== 'number') { + return [new ValidationError(key, value[0].zoom, 'stop zoom values must be numbers')]; } - if (signatureContext.errors.length === 0) { - return new CompoundExpression(op, type, evaluate, parsedArgs); + if (previousStopDomainZoom && previousStopDomainZoom > nextStopDomainZoom) { + return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')]; } + if (nextStopDomainZoom !== previousStopDomainZoom) { + previousStopDomainZoom = nextStopDomainZoom; + 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)); } - assert_1(!signatureContext || signatureContext.errors.length > 0); + if (isExpression(deepUnbundle(value[1]))) { + return errors.concat([new ValidationError(`${key}[1]`, value[1], 'expressions are not allowed in function stops.')]); + } - if (overloads.length === 1) { - context.errors.push(...signatureContext.errors); - } else { - const expected = overloads.length ? overloads : availableOverloads; - const signatures = expected - .map(([params]) => stringifySignature(params)) - .join(' | '); + return errors.concat(validate({ + key: `${key}[1]`, + value: value[1], + valueSpec: functionValueSpec, + style: options.style, + styleSpec: options.styleSpec + })); + } - const actualTypes = []; - // For error message, re-parse arguments without trying to - // apply any coercions - for (let i = 1; i < args.length; i++) { - const parsed = context.parse(args[i], 1 + actualTypes.length); - if (!parsed) return null; - actualTypes.push(toString(parsed.type)); + function validateStopDomainValue(options , stop) { + const type = getType(options.value); + const value = unbundle(options.value); + + const 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' && typeof value !== 'number' && typeof value !== 'string' && typeof value !== 'boolean') { + return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')]; + } + + if (type !== 'number' && functionType !== 'categorical') { + let message = `number expected, ${type} found`; + if (supportsPropertyExpression(functionValueSpec) && functionType === undefined) { + message += '\nIf you intended to use a categorical function, specify `"type": "categorical"`.'; } - context.error(`Expected arguments of type ${signatures}, but found (${actualTypes.join(', ')}) instead.`); + return [new ValidationError(options.key, reportValue, message)]; } - return null; - } + if (functionType === 'categorical' && type === 'number' && (typeof value !== 'number' || !isFinite(value) || Math.floor(value) !== value)) { + return [new ValidationError(options.key, reportValue, `integer expected, found ${String(value)}`)]; + } - static register( - registry , - definitions - ) { - assert_1(!CompoundExpression.definitions); - CompoundExpression.definitions = definitions; - for (const name in definitions) { - registry[name] = CompoundExpression; + if (functionType !== 'categorical' && type === 'number' && typeof value === 'number' && typeof previousStopDomainValue === '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 stringifySignature(signature ) { - if (Array.isArray(signature)) { - return `(${signature.map(toString).join(', ')})`; - } else { - return `(${toString(signature.type)}...)`; + function validateFunctionDefault(options ) { + return validate({ + key: options.key, + value: options.value, + valueSpec: functionValueSpec, + style: options.style, + styleSpec: options.styleSpec + }); } } // - - - - - -class CollatorExpression { - - - - + - constructor(caseSensitive , diacriticSensitive , locale ) { - this.type = CollatorType; - this.locale = locale; - this.caseSensitive = caseSensitive; - this.diacriticSensitive = diacriticSensitive; +function validateExpression(options ) { + const expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(deepUnbundle(options.value), options.valueSpec); + if (expression.result === 'error') { + return expression.value.map((error) => { + return new ValidationError(`${options.key}${error.key}`, options.value, error.message); + }); } - static parse(args , context ) { - if (args.length !== 2) - return context.error(`Expected one argument.`); - - const options = (args[1] ); - if (typeof options !== "object" || Array.isArray(options)) - return context.error(`Collator options argument must be an object.`); + const expressionObj = (expression.value ).expression || (expression.value )._styleExpression.expression; - const caseSensitive = context.parse( - options['case-sensitive'] === undefined ? false : options['case-sensitive'], 1, BooleanType); - if (!caseSensitive) return null; + if (options.expressionContext === 'property' && (options.propertyKey === 'text-font') && + !expressionObj.outputDefined()) { + return [new ValidationError(options.key, options.value, `Invalid data expression for "${options.propertyKey}". Output values must be contained as literals within the expression.`)]; + } - const diacriticSensitive = context.parse( - options['diacritic-sensitive'] === undefined ? false : options['diacritic-sensitive'], 1, BooleanType); - if (!diacriticSensitive) return null; + if (options.expressionContext === 'property' && options.propertyType === 'layout' && + (!isStateConstant(expressionObj))) { + return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with layout properties.')]; + } - let locale = null; - if (options['locale']) { - locale = context.parse(options['locale'], 1, StringType); - if (!locale) return null; - } - - return new CollatorExpression(caseSensitive, diacriticSensitive, locale); + if (options.expressionContext === 'filter') { + return disallowedFilterParameters(expressionObj, options); } - evaluate(ctx ) { - return new Collator(this.caseSensitive.evaluate(ctx), this.diacriticSensitive.evaluate(ctx), this.locale ? this.locale.evaluate(ctx) : null); + if (options.expressionContext && options.expressionContext.indexOf('cluster') === 0) { + if (!isGlobalPropertyConstant(expressionObj, ['zoom', 'feature-state'])) { + return [new ValidationError(options.key, options.value, '"zoom" and "feature-state" expressions are not supported with cluster properties.')]; + } + if (options.expressionContext === 'cluster-initial' && !isFeatureConstant(expressionObj)) { + return [new ValidationError(options.key, options.value, 'Feature data expressions are not supported with initial expression part of cluster properties.')]; + } } - eachChild(fn ) { - fn(this.caseSensitive); - fn(this.diacriticSensitive); - if (this.locale) { - fn(this.locale); + return []; +} + +function disallowedFilterParameters(e , options ) { + const disallowedParameters = new Set([ + 'zoom', + 'feature-state', + 'pitch', + 'distance-from-center' + ]); + + if (options.valueSpec && options.valueSpec.expression) { + for (const param of options.valueSpec.expression.parameters) { + disallowedParameters.delete(param); } } - outputDefined() { - // Technically the set of possible outputs is the combinatoric set of Collators produced - // by all possible outputs of locale/caseSensitive/diacriticSensitive - // But for the primary use of Collators in comparison operators, we ignore the Collator's - // possible outputs anyway, so we can get away with leaving this false for now. - return false; + if (disallowedParameters.size === 0) { + return []; } + const errors = []; - serialize() { - const options = {}; - options['case-sensitive'] = this.caseSensitive.serialize(); - options['diacritic-sensitive'] = this.diacriticSensitive.serialize(); - if (this.locale) { - options['locale'] = this.locale.serialize(); + if (e instanceof CompoundExpression) { + if (disallowedParameters.has(e.name)) { + return [new ValidationError(options.key, options.value, `["${e.name}"] expression is not supported in a filter for a ${options.object.type} layer with id: ${options.object.id}`)]; } - return ["collator", options]; } + e.eachChild((arg) => { + errors.push(...disallowedFilterParameters(arg, options)); + }); + + return errors; } // - - + -// minX, minY, maxX, maxY - -const EXTENT = 8192; +function validateBoolean(options ) { + const value = options.value; + const key = options.key; + const type = getType(value); -function updateBBox(bbox , coord ) { - bbox[0] = Math.min(bbox[0], coord[0]); - bbox[1] = Math.min(bbox[1], coord[1]); - bbox[2] = Math.max(bbox[2], coord[0]); - bbox[3] = Math.max(bbox[3], coord[1]); -} + if (type !== 'boolean') { + return [new ValidationError(key, value, `boolean expected, ${type} found`)]; + } -function mercatorXfromLng(lng ) { - return (180 + lng) / 360; + return []; } -function mercatorYfromLat(lat ) { - return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360; -} +// -function boxWithinBox(bbox1 , bbox2 ) { - if (bbox1[0] <= bbox2[0]) return false; - if (bbox1[2] >= bbox2[2]) return false; - if (bbox1[1] <= bbox2[1]) return false; - if (bbox1[3] >= bbox2[3]) return false; - return true; -} + -function getTileCoordinates(p, canonical ) { - const x = mercatorXfromLng(p[0]); - const y = mercatorYfromLat(p[1]); - const tilesAtZoom = Math.pow(2, canonical.z); - return [Math.round(x * tilesAtZoom * EXTENT), Math.round(y * tilesAtZoom * EXTENT)]; -} +function validateColor(options ) { + const key = options.key; + const value = options.value; + const type = getType(value); -function onBoundary(p, p1, p2) { - const x1 = p[0] - p1[0]; - const y1 = p[1] - p1[1]; - const x2 = p[0] - p2[0]; - const y2 = p[1] - p2[1]; - return (x1 * y2 - x2 * y1 === 0) && (x1 * x2 <= 0) && (y1 * y2 <= 0); -} + if (type !== 'string') { + return [new ValidationError(key, value, `color expected, ${type} found`)]; + } -function rayIntersect(p, p1, p2) { - return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]); + if (csscolorparser.parseCSSColor(value) === null) { + return [new ValidationError(key, value, `color expected, "${value}" found`)]; + } + + return []; } -// ray casting algorithm for detecting if point is in polygon -function pointWithinPolygon(point, rings) { - let inside = false; - for (let i = 0, len = rings.length; i < len; i++) { - const ring = rings[i]; - for (let j = 0, len2 = ring.length; j < len2 - 1; j++) { - if (onBoundary(point, ring[j], ring[j + 1])) return false; - if (rayIntersect(point, ring[j], ring[j + 1])) inside = !inside; +// + + + +function validateEnum(options ) { + const key = options.key; + const value = options.value; + const valueSpec = options.valueSpec; + const 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 inside; + return errors; } -function pointWithinPolygons(point, polygons) { - for (let i = 0; i < polygons.length; i++) { - if (pointWithinPolygon(point, polygons[i])) return true; +// + +function isExpressionFilter(filter ) { + if (filter === true || filter === false) { + return true; } - return false; -} -function perp(v1, v2) { - return (v1[0] * v2[1] - v1[1] * v2[0]); -} + if (!Array.isArray(filter) || filter.length === 0) { + return false; + } + switch (filter[0]) { + case 'has': + return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type'; -// check if p1 and p2 are in different sides of line segment q1->q2 -function twoSided(p1, p2, q1, q2) { - // q1->p1 (x1, y1), q1->p2 (x2, y2), q1->q2 (x3, y3) - const x1 = p1[0] - q1[0]; - const y1 = p1[1] - q1[1]; - const x2 = p2[0] - q1[0]; - const y2 = p2[1] - q1[1]; - const x3 = q2[0] - q1[0]; - const y3 = q2[1] - q1[1]; - const det1 = (x1 * y3 - x3 * y1); - const det2 = (x2 * y3 - x3 * y2); - if ((det1 > 0 && det2 < 0) || (det1 < 0 && det2 > 0)) return true; - return false; -} -// a, b are end points for line segment1, c and d are end points for line segment2 -function lineIntersectLine(a, b, c, d) { - // check if two segments are parallel or not - // precondition is end point a, b is inside polygon, if line a->b is - // parallel to polygon edge c->d, then a->b won't intersect with c->d - const vectorP = [b[0] - a[0], b[1] - a[1]]; - const vectorQ = [d[0] - c[0], d[1] - c[1]]; - if (perp(vectorQ, vectorP) === 0) return false; + case 'in': + return filter.length >= 3 && (typeof filter[1] !== 'string' || Array.isArray(filter[2])); - // If lines are intersecting with each other, the relative location should be: - // a and b lie in different sides of segment c->d - // c and d lie in different sides of segment a->b - if (twoSided(a, b, c, d) && twoSided(c, d, a, b)) return true; - return false; -} + case '!in': + case '!has': + case 'none': + return false; -function lineIntersectPolygon(p1, p2, polygon) { - for (const ring of polygon) { - // loop through every edge of the ring - for (let j = 0; j < ring.length - 1; ++j) { - if (lineIntersectLine(p1, p2, ring[j], ring[j + 1])) { - return true; + case '==': + case '!=': + case '>': + case '>=': + case '<': + case '<=': + return filter.length !== 3 || (Array.isArray(filter[1]) || Array.isArray(filter[2])); + + case 'any': + case 'all': + for (const f of filter.slice(1)) { + if (!isExpressionFilter(f) && typeof f !== 'boolean') { + return false; } } + return true; + + default: + return true; } - return false; } -function lineStringWithinPolygon(line, polygon) { - // First, check if geometry points of line segments are all inside polygon - for (let i = 0; i < line.length; ++i) { - if (!pointWithinPolygon(line[i], polygon)) { - return false; - } +/** + * 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 + * @param {string} layerType the type of the layer this filter will be applied to. + * @returns {Function} filter-evaluating function + */ +function createFilter(filter , layerType = 'fill') { + if (filter === null || filter === undefined) { + return {filter: () => true, needGeometry: false, needFeature: false}; } - // Second, check if there is line segment intersecting polygon edge - for (let i = 0; i < line.length - 1; ++i) { - if (lineIntersectPolygon(line[i], line[i + 1], polygon)) { - return false; - } + if (!isExpressionFilter(filter)) { + filter = convertFilter(filter); } - return true; -} + const filterExp = ((filter ) ); -function lineStringWithinPolygons(line, polygons) { - for (let i = 0; i < polygons.length; i++) { - if (lineStringWithinPolygon(line, polygons[i])) return true; + let staticFilter = true; + try { + staticFilter = extractStaticFilter(filterExp); + } catch (e) { + console.warn( +`Failed to extract static filter. Filter will continue working, but at higher memory usage and slower framerate. +This is most likely a bug, please report this via https://github.com/mapbox/mapbox-gl-js/issues/new?assignees=&labels=&template=Bug_report.md +and paste the contents of this message in the report. +Thank you! +Filter Expression: +${JSON.stringify(filterExp, null, 2)} + `); } - return false; -} -function getTilePolygon(coordinates, bbox, canonical) { - const polygon = []; - for (let i = 0; i < coordinates.length; i++) { - const ring = []; - for (let j = 0; j < coordinates[i].length; j++) { - const coord = getTileCoordinates(coordinates[i][j], canonical); - updateBBox(bbox, coord); - ring.push(coord); - } - polygon.push(ring); - } - return polygon; -} + // Compile the static component of the filter + const filterSpec = spec[`filter_${layerType}`]; + const compiledStaticFilter = createExpression(staticFilter, filterSpec); -function getTilePolygons(coordinates, bbox, canonical) { - const polygons = []; - for (let i = 0; i < coordinates.length; i++) { - const polygon = getTilePolygon(coordinates[i], bbox, canonical); - polygons.push(polygon); + let filterFunc = null; + if (compiledStaticFilter.result === 'error') { + throw new Error(compiledStaticFilter.value.map(err => `${err.key}: ${err.message}`).join(', ')); + } else { + filterFunc = (globalProperties , feature , canonical ) => compiledStaticFilter.value.evaluate(globalProperties, feature, {}, canonical); } - return polygons; -} -function updatePoint(p, bbox, polyBBox, worldSize) { - if (p[0] < polyBBox[0] || p[0] > polyBBox[2]) { - const halfWorldSize = worldSize * 0.5; - let shift = (p[0] - polyBBox[0] > halfWorldSize) ? -worldSize : (polyBBox[0] - p[0] > halfWorldSize) ? worldSize : 0; - if (shift === 0) { - shift = (p[0] - polyBBox[2] > halfWorldSize) ? -worldSize : (polyBBox[2] - p[0] > halfWorldSize) ? worldSize : 0; + // If the static component is not equal to the entire filter then we have a dynamic component + // Compile the dynamic component separately + let dynamicFilterFunc = null; + let needFeature = null; + if (staticFilter !== filterExp) { + const compiledDynamicFilter = createExpression(filterExp, filterSpec); + + if (compiledDynamicFilter.result === 'error') { + throw new Error(compiledDynamicFilter.value.map(err => `${err.key}: ${err.message}`).join(', ')); + } else { + dynamicFilterFunc = (globalProperties , feature , canonical , featureTileCoord , featureDistanceData ) => compiledDynamicFilter.value.evaluate(globalProperties, feature, {}, canonical, undefined, undefined, featureTileCoord, featureDistanceData); + needFeature = !isFeatureConstant(compiledDynamicFilter.value.expression); } - p[0] += shift; } - updateBBox(bbox, p); -} -function resetBBox(bbox) { - bbox[0] = bbox[1] = Infinity; - bbox[2] = bbox[3] = -Infinity; -} + filterFunc = ((filterFunc ) ); + const needGeometry = geometryNeeded(staticFilter); -function getTilePoints(geometry, pointBBox, polyBBox, canonical) { - const worldSize = Math.pow(2, canonical.z) * EXTENT; - const shifts = [canonical.x * EXTENT, canonical.y * EXTENT]; - const tilePoints = []; - for (const points of geometry) { - for (const point of points) { - const p = [point.x + shifts[0], point.y + shifts[1]]; - updatePoint(p, pointBBox, polyBBox, worldSize); - tilePoints.push(p); - } - } - return tilePoints; + return { + filter: filterFunc, + dynamicFilter: dynamicFilterFunc ? dynamicFilterFunc : undefined, + needGeometry, + needFeature: !!needFeature + }; } -function getTileLines(geometry, lineBBox, polyBBox, canonical) { - const worldSize = Math.pow(2, canonical.z) * EXTENT; - const shifts = [canonical.x * EXTENT, canonical.y * EXTENT]; - const tileLines = []; - for (const line of geometry) { - const tileLine = []; - for (const point of line) { - const p = [point.x + shifts[0], point.y + shifts[1]]; - updateBBox(lineBBox, p); - tileLine.push(p); - } - tileLines.push(tileLine); - } - if (lineBBox[2] - lineBBox[0] <= worldSize / 2) { - resetBBox(lineBBox); - for (const line of tileLines) { - for (const p of line) { - updatePoint(p, lineBBox, polyBBox, worldSize); - } - } +function extractStaticFilter(filter ) { + if (!isDynamicFilter(filter)) { + return filter; } - return tileLines; -} -function pointsWithinPolygons(ctx , polygonGeometry ) { - const pointBBox = [Infinity, Infinity, -Infinity, -Infinity]; - const polyBBox = [Infinity, Infinity, -Infinity, -Infinity]; + // Shallow copy so we can replace expressions in-place + let result = deepUnbundle(filter); - const canonical = ctx.canonicalID(); + // 1. Union branches + unionDynamicBranches(result); - if (polygonGeometry.type === 'Polygon') { - const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical); - const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical); - if (!boxWithinBox(pointBBox, polyBBox)) return false; + // 2. Collapse dynamic conditions to `true` + result = collapseDynamicBooleanExpressions(result); - for (const point of tilePoints) { - if (!pointWithinPolygon(point, tilePolygon)) return false; - } - } - if (polygonGeometry.type === 'MultiPolygon') { - const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical); - const tilePoints = getTilePoints(ctx.geometry(), pointBBox, polyBBox, canonical); - if (!boxWithinBox(pointBBox, polyBBox)) return false; + return result; +} - for (const point of tilePoints) { - if (!pointWithinPolygons(point, tilePolygons)) return false; - } +function collapseDynamicBooleanExpressions(expression ) { + if (!Array.isArray(expression)) { + return expression; } - return true; + const collapsed = collapsedExpression(expression); + if (collapsed === true) { + return collapsed; + } else { + return collapsed.map((subExpression) => collapseDynamicBooleanExpressions(subExpression)); + } } -function linesWithinPolygons(ctx , polygonGeometry ) { - const lineBBox = [Infinity, Infinity, -Infinity, -Infinity]; - const polyBBox = [Infinity, Infinity, -Infinity, -Infinity]; +/** + * Traverses the expression and replaces all instances of branching on a + * `dynamic` conditional (such as `['pitch']` or `['distance-from-center']`) + * into an `any` expression. + * This ensures that all possible outcomes of a `dynamic` branch are considered + * when evaluating the expression upfront during filtering. + * + * @param {Array} filter the filter expression mutated in-place. + */ +function unionDynamicBranches(filter ) { + let isBranchingDynamically = false; + const branches = []; - const canonical = ctx.canonicalID(); + if (filter[0] === 'case') { + for (let i = 1; i < filter.length - 1; i += 2) { + isBranchingDynamically = isBranchingDynamically || isDynamicFilter(filter[i]); + branches.push(filter[i + 1]); + } - if (polygonGeometry.type === 'Polygon') { - const tilePolygon = getTilePolygon(polygonGeometry.coordinates, polyBBox, canonical); - const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical); - if (!boxWithinBox(lineBBox, polyBBox)) return false; + branches.push(filter[filter.length - 1]); + } else if (filter[0] === 'match') { + isBranchingDynamically = isBranchingDynamically || isDynamicFilter(filter[1]); - for (const line of tileLines) { - if (!lineStringWithinPolygon(line, tilePolygon)) return false; + for (let i = 2; i < filter.length - 1; i += 2) { + branches.push(filter[i + 1]); } - } - if (polygonGeometry.type === 'MultiPolygon') { - const tilePolygons = getTilePolygons(polygonGeometry.coordinates, polyBBox, canonical); - const tileLines = getTileLines(ctx.geometry(), lineBBox, polyBBox, canonical); - if (!boxWithinBox(lineBBox, polyBBox)) return false; + branches.push(filter[filter.length - 1]); + } else if (filter[0] === 'step') { + isBranchingDynamically = isBranchingDynamically || isDynamicFilter(filter[1]); - for (const line of tileLines) { - if (!lineStringWithinPolygons(line, tilePolygons)) return false; + for (let i = 1; i < filter.length - 1; i += 2) { + branches.push(filter[i + 1]); } } - return true; -} - -class Within { - - - - constructor(geojson , geometries ) { - this.type = BooleanType; - this.geojson = geojson; - this.geometries = geometries; + if (isBranchingDynamically) { + filter.length = 0; + filter.push('any', ...branches); } - static parse(args , context ) { - if (args.length !== 2) - return context.error(`'within' expression requires exactly one argument, but found ${args.length - 1} instead.`); - if (isValue(args[1])) { - const geojson = (args[1] ); - if (geojson.type === 'FeatureCollection') { - for (let i = 0; i < geojson.features.length; ++i) { - const type = geojson.features[i].geometry.type; - if (type === 'Polygon' || type === 'MultiPolygon') { - return new Within(geojson, geojson.features[i].geometry); - } - } - } else if (geojson.type === 'Feature') { - const type = geojson.geometry.type; - if (type === 'Polygon' || type === 'MultiPolygon') { - return new Within(geojson, geojson.geometry); - } - } else if (geojson.type === 'Polygon' || geojson.type === 'MultiPolygon') { - return new Within(geojson, geojson); - } - } - return context.error(`'within' expression requires valid geojson object that contains polygon geometry type.`); + // traverse and recurse into children + for (let i = 1; i < filter.length; i++) { + unionDynamicBranches(filter[i]); } +} - evaluate(ctx ) { - if (ctx.geometry() != null && ctx.canonicalID() != null) { - if (ctx.geometryType() === 'Point') { - return pointsWithinPolygons(ctx, this.geometries); - } else if (ctx.geometryType() === 'LineString') { - return linesWithinPolygons(ctx, this.geometries); - } - } +function isDynamicFilter(filter ) { + // Base Cases + if (!Array.isArray(filter)) { return false; } - - eachChild() {} - - outputDefined() { + if (isRootExpressionDynamic(filter[0])) { return true; } - serialize() { - return ["within", this.geojson]; + for (let i = 1; i < filter.length; i++) { + const child = filter[i]; + if (isDynamicFilter(child)) { + return true; + } } + return false; } -// - +function isRootExpressionDynamic(expression ) { + return expression === 'pitch' || + expression === 'distance-from-center'; +} -function isFeatureConstant(e ) { - if (e instanceof CompoundExpression) { - if (e.name === 'get' && e.args.length === 1) { - return false; - } else if (e.name === 'feature-state') { - 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; - } - } - - if (e instanceof Within) { - return false; - } +const dynamicConditionExpressions = new Set([ + 'in', + '==', + '!=', + '>', + '>=', + '<', + '<=', + 'to-boolean' +]); - let result = true; - e.eachChild(arg => { - if (result && !isFeatureConstant(arg)) { result = false; } - }); - return result; -} +function collapsedExpression(expression ) { + if (dynamicConditionExpressions.has(expression[0])) { -function isStateConstant(e ) { - if (e instanceof CompoundExpression) { - if (e.name === 'feature-state') { - return false; + for (let i = 1; i < expression.length; i++) { + const param = expression[i]; + if (isDynamicFilter(param)) { + return true; + } } } - let result = true; - e.eachChild(arg => { - if (result && !isStateConstant(arg)) { result = false; } - }); - return result; + return expression; } -function isGlobalPropertyConstant(e , properties ) { - if (e instanceof CompoundExpression && properties.indexOf(e.name) >= 0) { return false; } - let result = true; - e.eachChild((arg) => { - if (result && !isGlobalPropertyConstant(arg, properties)) { result = false; } - }); - return result; +// Comparison function to sort numbers and strings +function compare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; } -// - - - - - +function geometryNeeded(filter) { + if (!Array.isArray(filter)) return false; + if (filter[0] === 'within') return true; + for (let index = 1; index < filter.length; index++) { + if (geometryNeeded(filter[index])) return true; + } + return false; +} -class Var { - - - +function convertFilter(filter ) { + if (!filter) return true; + const op = filter[0]; + if (filter.length <= 1) return (op !== 'any'); + const 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])) : + op === 'within' ? filter : + true; + return converted; +} - constructor(name , boundExpression ) { - this.type = boundExpression.type; - this.name = name; - this.boundExpression = boundExpression; +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]; } +} - static parse(args , context ) { - if (args.length !== 2 || typeof args[1] !== 'string') - return context.error(`'var' expression requires exactly one string literal argument.`); +function convertDisjunctionOp(filters ) { + return ['any'].concat(filters.map(convertFilter)); +} - const 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); +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(v => typeof v !== typeof values[0])) { + return ['filter-in-large', property, ['literal', values.sort(compare)]]; + } else { + return ['filter-in-small', property, ['literal', values]]; } - - return new Var(name, context.scope.get(name)); } +} - evaluate(ctx ) { - return this.boundExpression.evaluate(ctx); +function convertHasOp(property ) { + switch (property) { + case '$type': + return true; + case '$id': + return [`filter-has-id`]; + default: + return [`filter-has`, property]; } +} - eachChild() {} +function convertNegation(filter ) { + return ['!', filter]; +} - outputDefined() { - return false; - } +// - serialize() { - return ["var", this.name]; + + + + + + +function validateFilter$1(options ) { + if (isExpressionFilter(deepUnbundle(options.value))) { + // We default to a layerType of `fill` because that points to a non-dynamic filter definition within the style-spec. + const layerType = options.layerType || 'fill'; + + return validateExpression(extend({}, options, { + expressionContext: 'filter', + valueSpec: options.styleSpec[`filter_${layerType}`] + })); + } else { + return validateNonExpressionFilter(options); } } -// +function validateNonExpressionFilter(options) { + const value = options.value; + const key = options.key; - - + if (getType(value) !== 'array') { + return [new ValidationError(key, value, `array expected, ${getType(value)} found`)]; + } -/** - * State associated parsing at a given point in an expression tree. - * @private - */ -class ParsingContext { - - - - - + const styleSpec = options.styleSpec; + let type; - // The expected type of this expression. Provided only to allow Expression - // implementations to infer argument types: Expression#parse() need not - // check that the output type of the parsed expression matches - // `expectedType`. - + let errors = []; - constructor( - registry , - path = [], - expectedType , - scope = new Scope(), - errors = [] - ) { - this.registry = registry; - this.path = path; - this.key = path.map(part => `[${part}]`).join(''); - this.scope = scope; - this.errors = errors; - this.expectedType = expectedType; + if (value.length < 1) { + return [new ValidationError(key, value, 'filter array must have at least 1 element')]; } - /** - * @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 - */ - parse( - expr , - index , - expectedType , - bindings , - options = {} - ) { - if (index) { - return this.concat(index, expectedType, bindings)._parse(expr, options); - } - return this._parse(expr, options); - } + errors = errors.concat(validateEnum({ + key: `${key}[0]`, + value: value[0], + valueSpec: styleSpec.filter_operator, + style: options.style, + styleSpec: options.styleSpec + })); - _parse(expr , options ) { - if (expr === null || typeof expr === 'string' || typeof expr === 'boolean' || typeof expr === 'number') { - expr = ['literal', expr]; + 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]}"`)); } - - function annotate(parsed, type, typeAnnotation ) { - if (typeAnnotation === 'assert') { - return new Assertion(type, [parsed]); - } else if (typeAnnotation === 'coerce') { - return new Coercion(type, [parsed]); - } else { - return parsed; - } + /* falls through */ + case '==': + case '!=': + if (value.length !== 3) { + errors.push(new ValidationError(key, value, `filter array for operator "${value[0]}" must have 3 elements`)); } - - if (Array.isArray(expr)) { - if (expr.length === 0) { - return this.error(`Expected an array with at least one element. If you wanted a literal array, use ["literal", []].`); + /* 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`)); } - - const op = expr[0]; - if (typeof op !== 'string') { - this.error(`Expression name must be a string, but found ${typeof op} instead. If you wanted a literal array, use ["literal", [...]].`, 0); - return null; + } + for (let 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; - const Expr = this.registry[op]; - if (Expr) { - let parsed = Expr.parse(expr, this); - if (!parsed) return null; + case 'any': + case 'all': + case 'none': + for (let i = 1; i < value.length; i++) { + errors = errors.concat(validateNonExpressionFilter({ + key: `${key}[${i}]`, + value: value[i], + style: options.style, + styleSpec: options.styleSpec + })); + } + break; - if (this.expectedType) { - const expected = this.expectedType; - const actual = parsed.type; + 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; + case 'within': + 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 !== 'object') { + errors.push(new ValidationError(`${key}[1]`, value[1], `object expected, ${type} found`)); + } + break; + } + return errors; +} - // When we expect a number, string, boolean, or array but have a value, wrap it in an assertion. - // When we expect a color or formatted string, but have a string or value, wrap it in a coercion. - // Otherwise, we do static type-checking. - // - // These behaviors are overridable for: - // * The "coalesce" operator, which needs to omit type annotations. - // * String-valued properties (e.g. `text-field`), where coercion is more convenient than assertion. - // - if ((expected.kind === 'string' || expected.kind === 'number' || expected.kind === 'boolean' || expected.kind === 'object' || expected.kind === 'array') && actual.kind === 'value') { - parsed = annotate(parsed, expected, options.typeAnnotation || 'assert'); - } else if ((expected.kind === 'color' || expected.kind === 'formatted' || expected.kind === 'resolvedImage') && (actual.kind === 'value' || actual.kind === 'string')) { - parsed = annotate(parsed, expected, options.typeAnnotation || 'coerce'); - } else if (this.checkSubtype(expected, actual)) { - 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. Expressions that expect an image should - // not be resolved here so we can later get the available images. - if (!(parsed instanceof Literal) && (parsed.type.kind !== 'resolvedImage') && isConstant(parsed)) { - const ec = new EvaluationContext(); - try { - parsed = new Literal(parsed.type, parsed.evaluate(ec)); - } catch (e) { - this.error(e.message); - return null; - } - } + - return parsed; - } + + + + - return this.error(`Unknown expression "${op}". If you wanted a literal array, use ["literal", [...]].`, 0); - } else if (typeof expr === 'undefined') { - return this.error(`'undefined' value invalid. Use null instead.`); - } else if (typeof expr === 'object') { - return this.error(`Bare objects invalid. Use ["literal", {...}] instead.`); - } else { - return this.error(`Expected an array, but found ${typeof expr} instead.`); - } - } +function validateProperty(options , propertyType ) { + const key = options.key; + const style = options.style; + const styleSpec = options.styleSpec; + const value = options.value; + const propertyKey = options.objectKey; + const layerSpec = styleSpec[`${propertyType}_${options.layerType}`]; - /** - * 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 - */ - concat(index , expectedType , bindings ) { - const path = typeof index === 'number' ? this.path.concat(index) : this.path; - const scope = bindings ? this.scope.concat(bindings) : this.scope; - return new ParsingContext( - this.registry, - path, - expectedType || null, - scope, - this.errors - ); - } + if (!layerSpec) return []; - /** - * 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 - */ - error(error , ...keys ) { - const key = `${this.key}${keys.map(k => `[${k}]`).join('')}`; - this.errors.push(new ParsingError(key, error)); + const transitionMatch = propertyKey.match(/^(.*)-transition$/); + if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) { + return validate({ + key, + value, + valueSpec: styleSpec.transition, + style, + styleSpec + }); } - /** - * Returns null if `t` is a subtype of `expected`; otherwise returns an - * error message and also pushes it to `this.errors`. - */ - checkSubtype(expected , t ) { - const error = checkSubtype(expected, t); - if (error) this.error(error); - return error; + const valueSpec = options.valueSpec || layerSpec[propertyKey]; + if (!valueSpec) { + return [new ValidationError(key, value, `unknown property "${propertyKey}"`)]; } -} -function isConstant(expression ) { - if (expression instanceof Var) { - return isConstant(expression.boundExpression); - } else if (expression instanceof CompoundExpression && expression.name === 'error') { - return false; - } else if (expression instanceof CollatorExpression) { - // Although the results of a Collator expression with fixed arguments - // generally shouldn't change between executions, we can't serialize them - // as constant expressions because results change based on environment. - return false; - } else if (expression instanceof Within) { - return false; + let tokenMatch; + if (getType(value) === 'string' && supportsPropertyExpression(valueSpec) && !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])} }\`.`)]; } - const isTypeAnnotation = expression instanceof Coercion || - expression instanceof Assertion; - - let childrenConstant = true; - expression.eachChild(child => { - // We can _almost_ assume that if `expressions` children are constant, - // they would already have been evaluated to Literal values when they - // were parsed. Type annotations are the exception, because they might - // have been inferred and added after a child was parsed. + const errors = []; - // So we recurse into isConstant() for the children of type annotations, - // but otherwise simply check whether they are Literals. - if (isTypeAnnotation) { - childrenConstant = childrenConstant && isConstant(child); - } else { - childrenConstant = childrenConstant && child instanceof Literal; + 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(deepUnbundle(value)) && unbundle(value.type) === 'identity') { + errors.push(new ValidationError(key, value, '"text-font" does not support identity functions')); } - }); - if (!childrenConstant) { - return false; } - return isFeatureConstant(expression) && - isGlobalPropertyConstant(expression, ['zoom', 'heatmap-density', 'line-progress', 'sky-radial-progress', 'accumulated', 'is-supported-script', 'pitch', 'distance-from-center']); + return errors.concat(validate({ + key: options.key, + value, + valueSpec, + style, + styleSpec, + expressionContext: 'property', + propertyType, + propertyKey + })); } // - - - - -/** - * Returns the index of the last stop <= input, or 0 if it doesn't exist. - * @private - */ -function findStopLessThanOrEqualTo(stops , input ) { - const lastIndex = stops.length - 1; - let lowerIndex = 0; - let upperIndex = lastIndex; - let currentIndex = 0; - let currentValue, nextValue; + + - while (lowerIndex <= upperIndex) { - currentIndex = Math.floor((lowerIndex + upperIndex) / 2); - currentValue = stops[currentIndex]; - nextValue = stops[currentIndex + 1]; +function validatePaintProperty$1(options ) { + return validateProperty(options, 'paint'); +} - if (currentValue <= input) { - if (currentIndex === lastIndex || input < nextValue) { // Search complete - return currentIndex; - } +// - lowerIndex = currentIndex + 1; - } else if (currentValue > input) { - upperIndex = currentIndex - 1; - } else { - throw new RuntimeError('Input is not a number.'); - } - } + + - return 0; +function validateLayoutProperty$1(options ) { + return validateProperty(options, 'layout'); } // - - - - - + + -class Step { - + + + + - - - +function validateLayer$1(options ) { + let errors = []; - constructor(type , input , stops ) { - this.type = type; - this.input = input; + const layer = options.value; + const key = options.key; + const style = options.style; + const styleSpec = options.styleSpec; - this.labels = []; - this.outputs = []; - for (const [label, expression] of stops) { - this.labels.push(label); - this.outputs.push(expression); - } + if (!layer.type && !layer.ref) { + errors.push(new ValidationError(key, layer, 'either "type" or "ref" is required')); } + let type = unbundle(layer.type); + const ref = unbundle(layer.ref); - static parse(args , context ) { - if (args.length - 1 < 4) { - return context.error(`Expected at least 4 arguments, but found only ${args.length - 1}.`); + if (layer.id) { + const layerId = unbundle(layer.id); + for (let i = 0; i < options.arrayIndex; i++) { + const otherLayer = style.layers[i]; + if (unbundle(otherLayer.id) === layerId) { + // $FlowFixMe[prop-missing] - id.__line__ is added dynamically during the readStyle step + errors.push(new ValidationError(key, layer.id, `duplicate layer id "${layer.id}", previously used at line ${otherLayer.id.__line__}`)); + } } + } - if ((args.length - 1) % 2 !== 0) { - return context.error(`Expected an even number of arguments.`); - } + if ('ref' in layer) { + ['type', 'source', 'source-layer', 'filter', 'layout'].forEach((p) => { + if (p in layer) { + errors.push(new ValidationError(key, layer[p], `"${p}" is prohibited for ref layers`)); + } + }); - const input = context.parse(args[1], 1, NumberType); - if (!input) return null; + let parent; - const stops = []; + style.layers.forEach((layer) => { + if (unbundle(layer.id) === ref) parent = layer; + }); - let outputType = (null ); - if (context.expectedType && context.expectedType.kind !== 'value') { - outputType = context.expectedType; + if (!parent) { + if (typeof ref === 'string') + 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' || type === 'sky')) { + if (!layer.source) { + errors.push(new ValidationError(key, layer, 'missing required property "source"')); + } else { + const source = style.sources && style.sources[layer.source]; + const 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\'.')); + } else if (type === 'line' && layer.paint && (layer.paint['line-gradient'] || layer.paint['line-trim-offset']) && + (sourceType !== 'geojson' || !source.lineMetrics)) { + errors.push(new ValidationError(key, layer, `layer "${layer.id}" specifies a line-gradient, which requires a GeoJSON source with \`lineMetrics\` enabled.`)); + } + } + } - for (let i = 1; i < args.length; i += 2) { - const label = i === 1 ? -Infinity : args[i]; - const value = args[i + 1]; + errors = errors.concat(validateObject({ + key, + value: layer, + valueSpec: styleSpec.layer, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + '*'() { + 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() { + return validate({ + key: `${key}.type`, + value: layer.type, + valueSpec: styleSpec.layer.type, + style: options.style, + styleSpec: options.styleSpec, + object: layer, + objectKey: 'type' + }); + }, + filter(options) { + return validateFilter$1(extend({layerType: type}, options)); + }, + layout(options) { + return validateObject({ + layer, + key: options.key, + value: options.value, + valueSpec: {}, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + '*'(options) { + return validateLayoutProperty$1(extend({layerType: type}, options)); + } + } + }); + }, + paint(options) { + return validateObject({ + layer, + key: options.key, + value: options.value, + valueSpec: {}, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + '*'(options) { + return validatePaintProperty$1(extend({layerType: type}, options)); + } + } + }); + } + } + })); - const labelKey = i; - const valueKey = i + 1; + return errors; +} - 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); - } + - const parsed = context.parse(value, valueKey, outputType); - if (!parsed) return null; - outputType = outputType || parsed.type; - stops.push([label, parsed]); - } +function validateString(options ) { + const value = options.value; + const key = options.key; + const type = getType(value); - return new Step(outputType, input, stops); + if (type !== 'string') { + return [new ValidationError(key, value, `string expected, ${type} found`)]; } - evaluate(ctx ) { - const labels = this.labels; - const outputs = this.outputs; + return []; +} - if (labels.length === 1) { - return outputs[0].evaluate(ctx); - } +// - const value = ((this.input.evaluate(ctx) ) ); - if (value <= labels[0]) { - return outputs[0].evaluate(ctx); - } + - const stopCount = labels.length; - if (value >= labels[stopCount - 1]) { - return outputs[stopCount - 1].evaluate(ctx); - } +const objectElementValidators = { + promoteId: validatePromoteId +}; - const index = findStopLessThanOrEqualTo(labels, value); - return outputs[index].evaluate(ctx); - } +function validateSource$1(options ) { + const value = options.value; + const key = options.key; + const styleSpec = options.styleSpec; + const style = options.style; - eachChild(fn ) { - fn(this.input); - for (const expression of this.outputs) { - fn(expression); - } + if (!value.type) { + return [new ValidationError(key, value, '"type" is required')]; } - outputDefined() { - return this.outputs.every(out => out.outputDefined()); - } + const type = unbundle(value.type); + let errors; - serialize() { - const serialized = ["step", this.input.serialize()]; - for (let i = 0; i < this.labels.length; i++) { - if (i > 0) { - serialized.push(this.labels[i]); + switch (type) { + case 'vector': + case 'raster': + case 'raster-dem': + errors = validateObject({ + key, + value, + valueSpec: styleSpec[`source_${type.replace('-', '_')}`], + style: options.style, + styleSpec, + objectElementValidators + }); + return errors; + + case 'geojson': + errors = validateObject({ + key, + value, + valueSpec: styleSpec.source_geojson, + style, + styleSpec, + objectElementValidators + }); + if (value.cluster) { + for (const prop in value.clusterProperties) { + const [operator, mapExpr] = value.clusterProperties[prop]; + const reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop]] : operator; + + errors.push(...validateExpression({ + key: `${key}.${prop}.map`, + value: mapExpr, + expressionContext: 'cluster-map' + })); + errors.push(...validateExpression({ + key: `${key}.${prop}.reduce`, + value: reduceExpr, + expressionContext: 'cluster-reduce' + })); } - serialized.push(this.outputs[i].serialize()); } - return serialized; - } -} + return errors; -// + case 'video': + return validateObject({ + key, + value, + valueSpec: styleSpec.source_video, + style, + styleSpec + }); -function number(a , b , t ) { - return (a * (1 - t)) + (b * t); -} + case 'image': + return validateObject({ + key, + value, + valueSpec: styleSpec.source_image, + style, + styleSpec + }); -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) - ); -} + case 'canvas': + return [new ValidationError(key, null, `Please use runtime APIs to add canvas sources, rather than including them in stylesheets.`, 'source.canvas')]; -function array$1(from , to , t ) { - return from.map((d, i) => { - return number(d, to[i], t); - }); + default: + return validateEnum({ + key: `${key}.type`, + value: value.type, + valueSpec: {values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image']}, + style, + styleSpec + }); + } } -var interpolate = /*#__PURE__*/Object.freeze({ -__proto__: null, -number: number, -color: color, -array: array$1 -}); +function validatePromoteId({key, value}) { + if (getType(value) === 'string') { + return validateString({key, value}); + } else { + const errors = []; + for (const prop in value) { + errors.push(...validateString({key: `${key}.${prop}`, value: value[prop]})); + } + return errors; + } +} // - - - - - - + - - - - - - +function validateLight$1(options ) { + const light = options.value; + const styleSpec = options.styleSpec; + const lightSpec = styleSpec.light; + const style = options.style; -// Constants -const 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; + let errors = []; -// Utilities -function xyz2lab(t ) { - return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; -} + const 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; + } -function lab2xyz(t ) { - return t > t1 ? t * t * t : t2 * (t - t0); -} + for (const key in light) { + const transitionMatch = key.match(/^(.*)-transition$/); -function xyz2rgb(x ) { - return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); -} + if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) { + errors = errors.concat(validate({ + key, + value: light[key], + valueSpec: styleSpec.transition, + style, + styleSpec + })); + } else if (lightSpec[key]) { + errors = errors.concat(validate({ + key, + value: light[key], + valueSpec: lightSpec[key], + style, + styleSpec + })); + } else { + errors = errors.concat([new ValidationError(key, light[key], `unknown property "${key}"`)]); + } + } -function rgb2xyz(x ) { - x /= 255; - return x <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); + return errors; } -// LAB -function rgbToLab(rgbColor ) { - const 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 ) { - let 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 validateTerrain$1(options ) { + const terrain = options.value; + const key = options.key; + const style = options.style; + const styleSpec = options.styleSpec; + const terrainSpec = styleSpec.terrain; + let errors = []; -function interpolateLab(from , to , t ) { - return { - l: number(from.l, to.l, t), - a: number(from.a, to.a, t), - b: number(from.b, to.b, t), - alpha: number(from.alpha, to.alpha, t) - }; -} + const rootType = getType(terrain); + if (terrain === undefined) { + return errors; + } else if (rootType !== 'object') { + errors = errors.concat([new ValidationError('terrain', terrain, `object expected, ${rootType} found`)]); + return errors; + } -// HCL -function rgbToHcl(rgbColor ) { - const {l, a, b} = rgbToLab(rgbColor); - const h = Math.atan2(b, a) * rad2deg; - return { - h: h < 0 ? h + 360 : h, - c: Math.sqrt(a * a + b * b), - l, - alpha: rgbColor.a - }; -} + for (const key in terrain) { + const transitionMatch = key.match(/^(.*)-transition$/); -function hclToRgb(hclColor ) { - const h = hclColor.h * deg2rad, - c = hclColor.c, - l = hclColor.l; - return labToRgb({ - l, - a: Math.cos(h) * c, - b: Math.sin(h) * c, - alpha: hclColor.alpha - }); -} + if (transitionMatch && terrainSpec[transitionMatch[1]] && terrainSpec[transitionMatch[1]].transition) { + errors = errors.concat(validate({ + key, + value: terrain[key], + valueSpec: styleSpec.transition, + style, + styleSpec + })); + } else if (terrainSpec[key]) { + errors = errors.concat(validate({ + key, + value: terrain[key], + valueSpec: terrainSpec[key], + style, + styleSpec + })); + } else { + errors = errors.concat([new ValidationError(key, terrain[key], `unknown property "${key}"`)]); + } + } -function interpolateHue(a , b , t ) { - const d = b - a; - return a + t * (d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d); -} + if (!terrain.source) { + errors.push(new ValidationError(key, terrain, `terrain is missing required property "source"`)); + } else { + const source = style.sources && style.sources[terrain.source]; + const sourceType = source && unbundle(source.type); + if (!source) { + errors.push(new ValidationError(key, terrain.source, `source "${terrain.source}" not found`)); + } else if (sourceType !== 'raster-dem') { + errors.push(new ValidationError(key, terrain.source, `terrain cannot be used with a source of type ${String(sourceType)}, it only be used with a "raster-dem" source type`)); + } + } -function interpolateHcl(from , to , t ) { - return { - h: interpolateHue(from.h, to.h, t), - c: number(from.c, to.c, t), - l: number(from.l, to.l, t), - alpha: number(from.alpha, to.alpha, t) - }; + return errors; } -const lab = { - forward: rgbToLab, - reverse: labToRgb, - interpolate: interpolateLab -}; - -const hcl = { - forward: rgbToHcl, - reverse: hclToRgb, - interpolate: interpolateHcl -}; - -var colorSpaces = /*#__PURE__*/Object.freeze({ -__proto__: null, -lab: lab, -hcl: hcl -}); - // - - - - - - - - - - - -class Interpolate { - - - - - - - - - constructor(type , operator , interpolation , input , stops ) { - this.type = type; - this.operator = operator; - this.interpolation = interpolation; - this.input = input; + - this.labels = []; - this.outputs = []; - for (const [label, expression] of stops) { - this.labels.push(label); - this.outputs.push(expression); - } - } +function validateFog$1(options ) { + const fog = options.value; + const style = options.style; + const styleSpec = options.styleSpec; + const fogSpec = styleSpec.fog; + let errors = []; - static interpolationFactor(interpolation , input , lower , upper ) { - let 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') { - const c = interpolation.controlPoints; - const ub = new unitbezier(c[0], c[1], c[2], c[3]); - t = ub.solve(exponentialInterpolation(input, 1, lower, upper)); - } - return t; + const rootType = getType(fog); + if (fog === undefined) { + return errors; + } else if (rootType !== 'object') { + errors = errors.concat([new ValidationError('fog', fog, `object expected, ${rootType} found`)]); + return errors; } - static parse(args , context ) { - let [operator, interpolation, input, ...rest] = args; - - 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') { - const base = interpolation[1]; - if (typeof base !== 'number') - return context.error(`Exponential interpolation requires a numeric base.`, 1, 1); - interpolation = { - name: 'exponential', - base - }; - } else if (interpolation[0] === 'cubic-bezier') { - const controlPoints = interpolation.slice(1); - if ( - controlPoints.length !== 4 || - controlPoints.some(t => typeof t !== 'number' || t < 0 || t > 1) - ) { - return context.error('Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.', 1); - } + for (const key in fog) { + const transitionMatch = key.match(/^(.*)-transition$/); - interpolation = { - name: 'cubic-bezier', - controlPoints: (controlPoints ) - }; + if (transitionMatch && fogSpec[transitionMatch[1]] && fogSpec[transitionMatch[1]].transition) { + errors = errors.concat(validate({ + key, + value: fog[key], + valueSpec: styleSpec.transition, + style, + styleSpec + })); + } else if (fogSpec[key]) { + errors = errors.concat(validate({ + key, + value: fog[key], + valueSpec: fogSpec[key], + style, + styleSpec + })); } 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}.`); + errors = errors.concat([new ValidationError(key, fog[key], `unknown property "${key}"`)]); } + } - if ((args.length - 1) % 2 !== 0) { - return context.error(`Expected an even number of arguments.`); - } + return errors; +} - input = context.parse(input, 2, NumberType); - if (!input) return null; +// - const stops = []; + + - let outputType = (null ); - if (operator === 'interpolate-hcl' || operator === 'interpolate-lab') { - outputType = ColorType; - } else if (context.expectedType && context.expectedType.kind !== 'value') { - outputType = context.expectedType; - } +function validateFormatted(options ) { + if (validateString(options).length === 0) { + return []; + } - for (let i = 0; i < rest.length; i += 2) { - const label = rest[i]; - const value = rest[i + 1]; + return validateExpression(options); +} - const labelKey = i + 3; - const 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); - } +function validateImage(options ) { + if (validateString(options).length === 0) { + return []; + } - const parsed = context.parse(value, valueKey, outputType); - if (!parsed) return null; - outputType = outputType || parsed.type; - stops.push([label, parsed]); - } + return validateExpression(options); +} - 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, (operator ), interpolation, input, stops); - } + - evaluate(ctx ) { - const labels = this.labels; - const outputs = this.outputs; +function validateProjection(options ) { + const projection = options.value; + const styleSpec = options.styleSpec; + const projectionSpec = styleSpec.projection; + const style = options.style; - if (labels.length === 1) { - return outputs[0].evaluate(ctx); - } + let errors = []; - const value = ((this.input.evaluate(ctx) ) ); - if (value <= labels[0]) { - return outputs[0].evaluate(ctx); - } + const rootType = getType(projection); - const stopCount = labels.length; - if (value >= labels[stopCount - 1]) { - return outputs[stopCount - 1].evaluate(ctx); + if (rootType === 'object') { + for (const key in projection) { + errors = errors.concat(validate({ + key, + value: projection[key], + valueSpec: projectionSpec[key], + style, + styleSpec + })); } + } else if (rootType !== 'string') { + errors = errors.concat([new ValidationError('projection', projection, `object or string expected, ${rootType} found`)]); + } - const index = findStopLessThanOrEqualTo(labels, value); - const lower = labels[index]; - const upper = labels[index + 1]; - const t = Interpolate.interpolationFactor(this.interpolation, value, lower, upper); + return errors; +} - const outputLower = outputs[index].evaluate(ctx); - const outputUpper = outputs[index + 1].evaluate(ctx); +// - if (this.operator === 'interpolate') { - return (interpolate[this.type.kind.toLowerCase()] )(outputLower, outputUpper, t); // eslint-disable-line import/namespace - } else if (this.operator === 'interpolate-hcl') { - return hcl.reverse(hcl.interpolate(hcl.forward(outputLower), hcl.forward(outputUpper), t)); - } else { - return lab.reverse(lab.interpolate(lab.forward(outputLower), lab.forward(outputUpper), t)); - } - } + + + - eachChild(fn ) { - fn(this.input); - for (const expression of this.outputs) { - fn(expression); - } - } +const VALIDATORS = { + '*'() { + return []; + }, + 'array': validateArray, + 'boolean': validateBoolean, + 'number': validateNumber, + 'color': validateColor, + 'enum': validateEnum, + 'filter': validateFilter$1, + 'function': validateFunction, + 'layer': validateLayer$1, + 'object': validateObject, + 'source': validateSource$1, + 'light': validateLight$1, + 'terrain': validateTerrain$1, + 'fog': validateFog$1, + 'string': validateString, + 'formatted': validateFormatted, + 'resolvedImage': validateImage, + 'projection': validateProjection +}; - outputDefined() { - return this.outputs.every(out => out.outputDefined()); - } +// 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. + + + + + + + - serialize() { - let interpolation; - if (this.interpolation.name === 'linear') { - interpolation = ["linear"]; - } else if (this.interpolation.name === 'exponential') { - if (this.interpolation.base === 1) { - interpolation = ["linear"]; - } else { - interpolation = ["exponential", this.interpolation.base]; - } - } else { - interpolation = ["cubic-bezier" ].concat(this.interpolation.controlPoints); - } +function validate(options ) { + const value = options.value; + const valueSpec = options.valueSpec; + const styleSpec = options.styleSpec; - const serialized = [this.operator, interpolation, this.input.serialize()]; + if (valueSpec.expression && isFunction(unbundle(value))) { + return validateFunction(options); - for (let i = 0; i < this.labels.length; i++) { - serialized.push( - this.labels[i], - this.outputs[i].serialize() - ); - } - return serialized; - } -} + } else if (valueSpec.expression && isExpression(deepUnbundle(value))) { + return validateExpression(options); -/** - * 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) { - const difference = upperValue - lowerValue; - const progress = input - lowerValue; + } else if (valueSpec.type && VALIDATORS[valueSpec.type]) { + return VALIDATORS[valueSpec.type](options); - if (difference === 0) { - return 0; - } else if (base === 1) { - return progress / difference; } else { - return (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); + const valid = validateObject(extend({}, options, { + valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec + })); + return valid; } } // - - - - + -class Coalesce { - - +function validateGlyphsURL(options ) { + const value = options.value; + const key = options.key; - constructor(type , args ) { - this.type = type; - this.args = args; + const 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')); } - static parse(args , context ) { - if (args.length < 2) { - return context.error("Expectected at least one argument."); - } - let outputType = (null ); - const expectedType = context.expectedType; - if (expectedType && expectedType.kind !== 'value') { - outputType = expectedType; - } - const parsedArgs = []; + if (value.indexOf('{range}') === -1) { + errors.push(new ValidationError(key, value, '"glyphs" url must include a "{range}" token')); + } - for (const arg of args.slice(1)) { - const parsed = context.parse(arg, 1 + parsedArgs.length, outputType, undefined, {typeAnnotation: 'omit'}); - if (!parsed) return null; - outputType = outputType || parsed.type; - parsedArgs.push(parsed); - } - assert_1(outputType); + return errors; +} - // 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. - const needsAnnotation = expectedType && - parsedArgs.some(arg => checkSubtype(expectedType, arg.type)); +// - return needsAnnotation ? - new Coalesce(ValueType, parsedArgs) : - new Coalesce((outputType ), parsedArgs); - } + - evaluate(ctx ) { - let result = null; - let argCount = 0; - let firstImage; - for (const arg of this.args) { - argCount++; - result = arg.evaluate(ctx); - // we need to keep track of the first requested image in a coalesce statement - // if coalesce can't find a valid image, we return the first image so styleimagemissing can fire - if (result && result instanceof ResolvedImage && !result.available) { - // set to first image - if (!firstImage) { - firstImage = result; - } - result = null; - // if we reach the end, return the first image - if (argCount === this.args.length) { - return firstImage; - } - } + + + + + + + - if (result !== null) break; - } - return result; - } +/** + * 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 validateStyle(style , styleSpec = spec) { - eachChild(fn ) { - this.args.forEach(fn); - } + const errors = validate({ + key: '', + value: style, + valueSpec: styleSpec.$root, + styleSpec, + style, + objectElementValidators: { + glyphs: validateGlyphsURL, + '*': () => [] + } + }); + return sortErrors(errors); +} - outputDefined() { - return this.args.every(arg => arg.outputDefined()); - } +const validateSource = opts => sortErrors(validateSource$1(opts)); +const validateLight = opts => sortErrors(validateLight$1(opts)); +const validateTerrain = opts => sortErrors(validateTerrain$1(opts)); +const validateFog = opts => sortErrors(validateFog$1(opts)); +const validateLayer = opts => sortErrors(validateLayer$1(opts)); +const validateFilter = opts => sortErrors(validateFilter$1(opts)); +const validatePaintProperty = opts => sortErrors(validatePaintProperty$1(opts)); +const validateLayoutProperty = opts => sortErrors(validateLayoutProperty$1(opts)); - serialize() { - const serialized = ["coalesce"]; - this.eachChild(child => { serialized.push(child.serialize()); }); - return serialized; - } +function sortErrors(errors) { + return errors.slice().sort((a, b) => a.line && b.line ? a.line - b.line : 0); } // - - - - - -class Let { - - - - - constructor(bindings , result ) { - this.type = result.type; - this.bindings = [].concat(bindings); - this.result = result; - } + + - evaluate(ctx ) { - return this.result.evaluate(ctx); - } + - eachChild(fn ) { - for (const binding of this.bindings) { - fn(binding[1]); +function emitValidationErrors(emitter , errors ) { + let hasErrors = false; + if (errors && errors.length) { + for (const error of errors) { + emitter.fire(new ErrorEvent(new Error(error.message))); + hasErrors = true; } - fn(this.result); } + return hasErrors; +} - static parse(args , context ) { - if (args.length < 4) - return context.error(`Expected at least 3 arguments, but found ${args.length - 1} instead.`); +'use strict'; - const bindings = []; - for (let i = 1; i < args.length - 1; i += 2) { - const name = args[i]; +var gridIndex = GridIndex; - if (typeof name !== 'string') { - return context.error(`Expected string, but found ${typeof name} instead.`, i); - } +var NUM_PARAMS = 3; - if (/[^a-zA-Z0-9_]/.test(name)) { - return context.error(`Variable names must contain only alphanumeric characters or '_'.`, i); - } +function GridIndex(extent, n, padding) { + var cells = this.cells = []; - const value = context.parse(args[i + 1], i + 1); - if (!value) return null; + if (extent instanceof ArrayBuffer) { + this.arrayBuffer = extent; + var array = new Int32Array(this.arrayBuffer); + extent = array[0]; + n = array[1]; + padding = array[2]; - bindings.push([name, value]); + 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); - const result = context.parse(args[args.length - 1], args.length - 1, context.expectedType, bindings); - if (!result) return null; + this.insert = this._insertReadonly; - return new Let(bindings, result); + } else { + this.d = n + 2 * padding; + for (var i = 0; i < this.d * this.d; i++) { + cells.push([]); + } + this.keys = []; + this.bboxes = []; } - outputDefined() { - return this.result.outputDefined(); - } + this.n = n; + this.extent = extent; + this.padding = padding; + this.scale = n / extent; + this.uid = 0; - serialize() { - const serialized = ["let"]; - for (const [name, expr] of this.bindings) { - serialized.push(name, expr.serialize()); - } - serialized.push(this.result.serialize()); - return serialized; - } + 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); +}; -class At { - - - +GridIndex.prototype._insertReadonly = function() { + throw 'Cannot insert into a GridIndex created from an ArrayBuffer.'; +}; - constructor(type , index , input ) { - this.type = type; - this.index = index; - this.input = input; - } +GridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) { + this.cells[cellIndex].push(uid); +}; - static parse(args , context ) { - if (args.length !== 3) - return context.error(`Expected 2 arguments, but found ${args.length - 1} instead.`); +GridIndex.prototype.query = function(x1, y1, x2, y2, intersectionTest) { + var min = this.min; + var max = this.max; + if (x1 <= min && y1 <= min && max <= x2 && max <= y2 && !intersectionTest) { + // 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); - const index = context.parse(args[1], 1, NumberType); - const input = context.parse(args[2], 2, array(context.expectedType || ValueType)); + } else { + var result = []; + var seenUids = {}; + this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest); + return result; + } +}; - if (!index || !input) return null; +GridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids, intersectionTest) { + 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 (intersectionTest ? + intersectionTest(bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) : + ((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; + } + } + } + } +}; - const t = (input.type ); - return new At(t.itemType, index, input); +GridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2, intersectionTest) { + 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 (intersectionTest && !intersectionTest( + this._convertFromCellCoord(x), + this._convertFromCellCoord(y), + this._convertFromCellCoord(x + 1), + this._convertFromCellCoord(y + 1))) continue; + if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, intersectionTest)) return; + } } +}; - evaluate(ctx ) { - const index = ((this.index.evaluate(ctx) ) ); - const array = ((this.input.evaluate(ctx) ) ); +GridIndex.prototype._convertFromCellCoord = function(x) { + return (x - this.padding) / this.scale; +}; - if (index < 0) { - throw new RuntimeError(`Array index out of bounds: ${index} < 0.`); - } +GridIndex.prototype._convertToCellCoord = function(x) { + return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding)); +}; - if (index >= array.length) { - throw new RuntimeError(`Array index out of bounds: ${index} > ${array.length - 1}.`); - } +GridIndex.prototype.toArrayBuffer = function() { + if (this.arrayBuffer) return this.arrayBuffer; - if (index !== Math.floor(index)) { - throw new RuntimeError(`Array index must be an integer, but found ${index} instead.`); - } + var cells = this.cells; - return array[index]; + 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; } - eachChild(fn ) { - fn(this.index); - fn(this.input); - } + var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length); + array[0] = this.extent; + array[1] = this.n; + array[2] = this.padding; - outputDefined() { - return false; + 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; } - serialize() { - return ["at", this.index.serialize(), this.input.serialize()]; - } -} + 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; +}; // - - - - + -class In { + // eslint-disable-line + + + + + + + + + + + + + - + - constructor(needle , haystack ) { - this.type = BooleanType; - this.needle = needle; - this.haystack = haystack; - } + + + + + + - static parse(args , context ) { - if (args.length !== 3) { - return context.error(`Expected 2 arguments, but found ${args.length - 1} instead.`); - } + + + - const needle = context.parse(args[1], 1, ValueType); +const registry = {}; - const haystack = context.parse(args[2], 2, ValueType); +/** + * Register the given class as serializable. + * + * @param options + * @param options.omit List of properties to omit from serialization (e.g., cached/computed properties) + * + * @private + */ +function register (klass , name , options = {}) { + assert_1(name, 'Can\'t register a class without a name.'); + assert_1(!registry[name], `${name} is already registered.`); + (Object.defineProperty )(klass, '_classRegistryKey', { + value: name, + writeable: false + }); + registry[name] = { + klass, + omit: options.omit || [] + }; +} - if (!needle || !haystack) return null; +register(Object, 'Object'); - if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) { - return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${toString(needle.type)} instead`); - } + - return new In(needle, haystack); +(gridIndex ).serialize = function serialize(grid , transferables ) { + const buffer = grid.toArrayBuffer(); + if (transferables) { + transferables.push(buffer); } + return {buffer}; +}; - evaluate(ctx ) { - const needle = (this.needle.evaluate(ctx) ); - const haystack = (this.haystack.evaluate(ctx) ); - - if (!haystack) return false; +(gridIndex ).deserialize = function deserialize(serialized ) { + return new gridIndex(serialized.buffer); +}; - if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) { - throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${toString(typeOf(needle))} instead.`); - } +Object.defineProperty(gridIndex, 'name', {value: 'Grid'}); - if (!isValidNativeType(haystack, ['string', 'array'])) { - throw new RuntimeError(`Expected second argument to be of type array or string, but found ${toString(typeOf(haystack))} instead.`); - } +register(gridIndex, 'Grid'); - return haystack.indexOf(needle) >= 0; - } +register(Color, 'Color'); +register(Error, 'Error'); +register(AJAXError, 'AJAXError'); +register(ResolvedImage, 'ResolvedImage'); +register(StylePropertyFunction, 'StylePropertyFunction'); +register(StyleExpression, 'StyleExpression', {omit: ['_evaluator']}); - eachChild(fn ) { - fn(this.needle); - fn(this.haystack); - } +register(ZoomDependentExpression, 'ZoomDependentExpression'); +register(ZoomConstantExpression, 'ZoomConstantExpression'); +register(CompoundExpression, 'CompoundExpression', {omit: ['_evaluate']}); +for (const name in expressions) { + if (!registry[(expressions[name] )._classRegistryKey]) register(expressions[name], `Expression${name}`); +} - outputDefined() { - return true; - } +function isArrayBuffer(val ) { + return val && typeof ArrayBuffer !== 'undefined' && + (val instanceof ArrayBuffer || (val.constructor && val.constructor.name === 'ArrayBuffer')); +} - serialize() { - return ["in", this.needle.serialize(), this.haystack.serialize()]; - } +function isImageBitmap(val ) { + return window$1.ImageBitmap && + val instanceof window$1.ImageBitmap; } -// +/** + * 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 (isArrayBuffer(input) || isImageBitmap(input)) { + if (transferables) { + transferables.push(((input ) )); + } + return (input ); + } -class IndexOf { - - - - + if (ArrayBuffer.isView(input)) { + const view = (input ); + if (transferables) { + transferables.push(view.buffer); + } + return view; + } - constructor(needle , haystack , fromIndex ) { - this.type = NumberType; - this.needle = needle; - this.haystack = haystack; - this.fromIndex = fromIndex; + if (input instanceof window$1.ImageData) { + if (transferables) { + transferables.push(input.data.buffer); + } + return input; } - static parse(args , context ) { - if (args.length <= 2 || args.length >= 5) { - return context.error(`Expected 3 or 4 arguments, but found ${args.length - 1} instead.`); + if (Array.isArray(input)) { + const serialized = []; + for (const item of input) { + serialized.push(serialize(item, transferables)); } + return serialized; + } - const needle = context.parse(args[1], 1, ValueType); + if (typeof input === 'object') { + const klass = (input.constructor ); + const name = klass._classRegistryKey; + if (!name) { + throw new Error(`can't serialize object of unregistered class ${name}`); + } + assert_1(registry[name]); - const haystack = context.parse(args[2], 2, ValueType); + const properties = 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. + (klass.serialize(input, transferables) ) : {}; - if (!needle || !haystack) return null; - if (!isValidType(needle.type, [BooleanType, StringType, NumberType, NullType, ValueType])) { - return context.error(`Expected first argument to be of type boolean, string, number or null, but found ${toString(needle.type)} instead`); + if (!klass.serialize) { + for (const 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; + const property = (input )[key]; + properties[key] = serialize(property, transferables); + } + if (input instanceof Error) { + properties.message = input.message; + } + } else { + // make sure statically serialized object survives transfer of $name property + assert_1(!transferables || properties !== transferables[transferables.length - 1]); } - if (args.length === 4) { - const fromIndex = context.parse(args[3], 3, NumberType); - if (!fromIndex) return null; - return new IndexOf(needle, haystack, fromIndex); - } else { - return new IndexOf(needle, haystack); + if (properties.$name) { + throw new Error('$name property is reserved for worker serialization logic.'); + } + if (name !== 'Object') { + properties.$name = name; } + + return properties; } - evaluate(ctx ) { - const needle = (this.needle.evaluate(ctx) ); - const haystack = (this.haystack.evaluate(ctx) ); + throw new Error(`can't serialize object of type ${typeof input}`); +} - if (!isValidNativeType(needle, ['boolean', 'string', 'number', 'null'])) { - throw new RuntimeError(`Expected first argument to be of type boolean, string, number or null, but found ${toString(typeOf(needle))} instead.`); - } +function deserialize$1(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 || + isArrayBuffer(input) || + isImageBitmap(input) || + ArrayBuffer.isView(input) || + input instanceof window$1.ImageData) { + return input; + } - if (!isValidNativeType(haystack, ['string', 'array'])) { - throw new RuntimeError(`Expected second argument to be of type array or string, but found ${toString(typeOf(haystack))} instead.`); + if (Array.isArray(input)) { + return input.map(deserialize$1); + } + + if (typeof input === 'object') { + const name = (input ).$name || 'Object'; + + const {klass} = registry[name]; + if (!klass) { + throw new Error(`can't deserialize unregistered class ${name}`); } - if (this.fromIndex) { - const fromIndex = (this.fromIndex.evaluate(ctx) ); - return haystack.indexOf(needle, fromIndex); + if (klass.deserialize) { + return (klass.deserialize )(input); } - return haystack.indexOf(needle); - } + const result = Object.create(klass.prototype); - eachChild(fn ) { - fn(this.needle); - fn(this.haystack); - if (this.fromIndex) { - fn(this.fromIndex); + for (const key of Object.keys(input)) { + if (key === '$name') continue; + const value = (input )[key]; + result[key] = deserialize$1(value); } - } - outputDefined() { - return false; + return result; } - serialize() { - if (this.fromIndex != null && this.fromIndex !== undefined) { - const fromIndex = this.fromIndex.serialize(); - return ["index-of", this.needle.serialize(), this.haystack.serialize(), fromIndex]; - } - return ["index-of", this.needle.serialize(), this.haystack.serialize()]; - } + throw new Error(`can't deserialize object of type ${typeof input}`); } // - - - - -// Map input label values to output expression index - - -class Match { - - - - - - +class ZoomHistory { + + + + - constructor(inputType , outputType , input , cases , outputs , otherwise ) { - this.inputType = inputType; - this.type = outputType; - this.input = input; - this.cases = cases; - this.outputs = outputs; - this.otherwise = otherwise; + constructor() { + this.first = true; } - static 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.`); + update(z , now ) { + const floorZ = Math.floor(z); - let inputType; - let outputType; - if (context.expectedType && context.expectedType.kind !== 'value') { - outputType = context.expectedType; + if (this.first) { + this.first = false; + this.lastIntegerZoom = floorZ; + this.lastIntegerZoomTime = 0; + this.lastZoom = z; + this.lastFloorZoom = floorZ; + return true; } - const cases = {}; - const outputs = []; - for (let i = 2; i < args.length - 1; i += 2) { - let labels = args[i]; - const value = args[i + 1]; - if (!Array.isArray(labels)) { - labels = [labels]; - } + if (this.lastFloorZoom > floorZ) { + this.lastIntegerZoom = floorZ + 1; + this.lastIntegerZoomTime = now; + } else if (this.lastFloorZoom < floorZ) { + this.lastIntegerZoom = floorZ; + this.lastIntegerZoomTime = now; + } - const labelContext = context.concat(i); - if (labels.length === 0) { - return labelContext.error('Expected at least one branch label.'); - } - - for (const label of labels) { - 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; - } - - const result = context.parse(value, i, outputType); - if (!result) return null; - outputType = outputType || result.type; - outputs.push(result); + if (z !== this.lastZoom) { + this.lastZoom = z; + this.lastFloorZoom = floorZ; + return true; } - const input = context.parse(args[1], 1, ValueType); - if (!input) return null; + return false; + } +} - const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); - if (!otherwise) return null; +// - assert_1(inputType && outputType); +// The following table comes from . +// Keep it synchronized with . - if (input.type.kind !== 'value' && context.concat(1).checkSubtype((inputType ), input.type)) { - return null; - } + - return new Match((inputType ), (outputType ), input, cases, outputs, otherwise); - } +const unicodeBlockLookup = { + // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F, + 'Latin-1 Supplement': (char) => 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': (char) => char >= 0x0600 && char <= 0x06FF, + //'Syriac': (char) => char >= 0x0700 && char <= 0x074F, + 'Arabic Supplement': (char) => 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': (char) => 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': (char) => 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': (char) => 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': (char) => 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, + // 'Georgian Extended': (char) => char >= 0x1C90 && char <= 0x1CBF, + // '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': (char) => 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': (char) => char >= 0x2100 && char <= 0x214F, + 'Number Forms': (char) => char >= 0x2150 && char <= 0x218F, + // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF, + // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF, + 'Miscellaneous Technical': (char) => char >= 0x2300 && char <= 0x23FF, + 'Control Pictures': (char) => char >= 0x2400 && char <= 0x243F, + 'Optical Character Recognition': (char) => char >= 0x2440 && char <= 0x245F, + 'Enclosed Alphanumerics': (char) => char >= 0x2460 && char <= 0x24FF, + // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F, + // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F, + 'Geometric Shapes': (char) => char >= 0x25A0 && char <= 0x25FF, + 'Miscellaneous Symbols': (char) => 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': (char) => 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': (char) => char >= 0x2E80 && char <= 0x2EFF, + 'Kangxi Radicals': (char) => char >= 0x2F00 && char <= 0x2FDF, + 'Ideographic Description Characters': (char) => char >= 0x2FF0 && char <= 0x2FFF, + 'CJK Symbols and Punctuation': (char) => char >= 0x3000 && char <= 0x303F, + 'Hiragana': (char) => char >= 0x3040 && char <= 0x309F, + 'Katakana': (char) => char >= 0x30A0 && char <= 0x30FF, + 'Bopomofo': (char) => char >= 0x3100 && char <= 0x312F, + 'Hangul Compatibility Jamo': (char) => char >= 0x3130 && char <= 0x318F, + 'Kanbun': (char) => char >= 0x3190 && char <= 0x319F, + 'Bopomofo Extended': (char) => char >= 0x31A0 && char <= 0x31BF, + 'CJK Strokes': (char) => char >= 0x31C0 && char <= 0x31EF, + 'Katakana Phonetic Extensions': (char) => char >= 0x31F0 && char <= 0x31FF, + 'Enclosed CJK Letters and Months': (char) => char >= 0x3200 && char <= 0x32FF, + 'CJK Compatibility': (char) => char >= 0x3300 && char <= 0x33FF, + 'CJK Unified Ideographs Extension A': (char) => char >= 0x3400 && char <= 0x4DBF, + 'Yijing Hexagram Symbols': (char) => char >= 0x4DC0 && char <= 0x4DFF, + 'CJK Unified Ideographs': (char) => char >= 0x4E00 && char <= 0x9FFF, + 'Yi Syllables': (char) => char >= 0xA000 && char <= 0xA48F, + 'Yi Radicals': (char) => 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': (char) => 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': (char) => char >= 0xAC00 && char <= 0xD7AF, + 'Hangul Jamo Extended-B': (char) => 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': (char) => char >= 0xE000 && char <= 0xF8FF, + 'CJK Compatibility Ideographs': (char) => char >= 0xF900 && char <= 0xFAFF, + // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F, + 'Arabic Presentation Forms-A': (char) => char >= 0xFB50 && char <= 0xFDFF, + // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F, + 'Vertical Forms': (char) => char >= 0xFE10 && char <= 0xFE1F, + // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F, + 'CJK Compatibility Forms': (char) => char >= 0xFE30 && char <= 0xFE4F, + 'Small Form Variants': (char) => char >= 0xFE50 && char <= 0xFE6F, + 'Arabic Presentation Forms-B': (char) => char >= 0xFE70 && char <= 0xFEFF, + 'Halfwidth and Fullwidth Forms': (char) => 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, + // 'Hanifi Rohingya': (char) => char >= 0x10D00 && char <= 0x10D3F, + // 'Rumi Numeral Symbols': (char) => char >= 0x10E60 && char <= 0x10E7F, + // 'Old Sogdian': (char) => char >= 0x10F00 && char <= 0x10F2F, + // 'Sogdian': (char) => char >= 0x10F30 && char <= 0x10F6F, + // 'Elymaic': (char) => char >= 0x10FE0 && char <= 0x10FFF, + // '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, + // 'Dogra': (char) => char >= 0x11800 && char <= 0x1184F, + // 'Warang Citi': (char) => char >= 0x118A0 && char <= 0x118FF, + // 'Nandinagari': (char) => char >= 0x119A0 && char <= 0x119FF, + // '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, + // 'Gunjala Gondi': (char) => char >= 0x11D60 && char <= 0x11DAF, + // 'Makasar': (char) => char >= 0x11EE0 && char <= 0x11EFF, + // 'Tamil Supplement': (char) => char >= 0x11FC0 && char <= 0x11FFF, + // '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, + // 'Egyptian Hieroglyph Format Controls': (char) => char >= 0x13430 && char <= 0x1343F, + // '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, + // 'Medefaidrin': (char) => char >= 0x16E40 && char <= 0x16E9F, + // '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, + // 'Small Kana Extension': (char) => char >= 0x1B130 && char <= 0x1B16F, + // '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, + // 'Mayan Numerals': (char) => char >= 0x1D2E0 && char <= 0x1D2FF, + // '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, + // 'Nyiakeng Puachue Hmong': (char) => char >= 0x1E100 && char <= 0x1E14F, + // 'Wancho': (char) => char >= 0x1E2C0 && char <= 0x1E2FF, + // 'Mende Kikakui': (char) => char >= 0x1E800 && char <= 0x1E8DF, + // 'Adlam': (char) => char >= 0x1E900 && char <= 0x1E95F, + // 'Indic Siyaq Numbers': (char) => char >= 0x1EC70 && char <= 0x1ECBF, + // 'Ottoman Siyaq Numbers': (char) => char >= 0x1ED00 && char <= 0x1ED4F, + // '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, + // 'Chess Symbols': (char) => char >= 0x1FA00 && char <= 0x1FA6F, + // 'Symbols and Pictographs Extended-A': (char) => char >= 0x1FA70 && char <= 0x1FAFF, + // '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, +}; - evaluate(ctx ) { - const input = (this.input.evaluate(ctx) ); - const output = (typeOf(input) === this.inputType && this.outputs[this.cases[input]]) || this.otherwise; - return output.evaluate(ctx); - } +// - eachChild(fn ) { - fn(this.input); - this.outputs.forEach(fn); - fn(this.otherwise); +function allowsIdeographicBreaking(chars ) { + for (const char of chars) { + if (!charAllowsIdeographicBreaking(char.charCodeAt(0))) return false; } + return true; +} - outputDefined() { - return this.outputs.every(out => out.outputDefined()) && this.otherwise.outputDefined(); +function allowsVerticalWritingMode(chars ) { + for (const char of chars) { + if (charHasUprightVerticalOrientation(char.charCodeAt(0))) return true; } + return false; +} - serialize() { - const serialized = ["match", this.input.serialize()]; - - // Sort so serialization has an arbitrary defined order, even though - // branch order doesn't affect evaluation - const sortedLabels = Object.keys(this.cases).sort(); - - // Group branches by unique match expression to support condensed - // serializations of the form [case1, case2, ...] -> matchExpression - const groupedByOutput = []; - const outputLookup = {}; // lookup index into groupedByOutput for a given output expression - for (const label of sortedLabels) { - const outputIndex = outputLookup[this.cases[label]]; - if (outputIndex === undefined) { - // First time seeing this output, add it to the end of the grouped list - outputLookup[this.cases[label]] = groupedByOutput.length; - groupedByOutput.push([this.cases[label], [label]]); - } else { - // We've seen this expression before, add the label to that output's group - groupedByOutput[outputIndex][1].push(label); - } - } - - const coerceLabel = (label) => this.inputType.kind === 'number' ? Number(label) : label; - - for (const [outputIndex, labels] of groupedByOutput) { - if (labels.length === 1) { - // Only a single label matches this output expression - serialized.push(coerceLabel(labels[0])); - } else { - // Array of literal labels pointing to this output expression - serialized.push(labels.map(coerceLabel)); - } - serialized.push(this.outputs[outputIndex].serialize()); - } - serialized.push(this.otherwise.serialize()); - return serialized; +function allowsLetterSpacing(chars ) { + for (const char of chars) { + if (!charAllowsLetterSpacing(char.charCodeAt(0))) return false; } + return true; } -// - - - - - - - +function charAllowsLetterSpacing(char ) { + if (unicodeBlockLookup['Arabic'](char)) return false; + if (unicodeBlockLookup['Arabic Supplement'](char)) return false; + if (unicodeBlockLookup['Arabic Extended-A'](char)) return false; + if (unicodeBlockLookup['Arabic Presentation Forms-A'](char)) return false; + if (unicodeBlockLookup['Arabic Presentation Forms-B'](char)) return false; -class Case { - + return true; +} - - +function charAllowsIdeographicBreaking(char ) { + // Return early for characters outside all ideographic ranges. + if (char < 0x2E80) return false; - constructor(type , branches , otherwise ) { - this.type = type; - this.branches = branches; - this.otherwise = otherwise; - } + if (unicodeBlockLookup['Bopomofo Extended'](char)) return true; + if (unicodeBlockLookup['Bopomofo'](char)) return true; + if (unicodeBlockLookup['CJK Compatibility Forms'](char)) return true; + if (unicodeBlockLookup['CJK Compatibility Ideographs'](char)) return true; + if (unicodeBlockLookup['CJK Compatibility'](char)) return true; + if (unicodeBlockLookup['CJK Radicals Supplement'](char)) return true; + if (unicodeBlockLookup['CJK Strokes'](char)) return true; + if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) return true; + if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char)) return true; + if (unicodeBlockLookup['CJK Unified Ideographs'](char)) return true; + if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char)) return true; + if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) return true; + if (unicodeBlockLookup['Hiragana'](char)) return true; + if (unicodeBlockLookup['Ideographic Description Characters'](char)) return true; + if (unicodeBlockLookup['Kangxi Radicals'](char)) return true; + if (unicodeBlockLookup['Katakana Phonetic Extensions'](char)) return true; + if (unicodeBlockLookup['Katakana'](char)) return true; + if (unicodeBlockLookup['Vertical Forms'](char)) return true; + if (unicodeBlockLookup['Yi Radicals'](char)) return true; + if (unicodeBlockLookup['Yi Syllables'](char)) return true; - static 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.`); + return false; +} - let outputType ; - if (context.expectedType && context.expectedType.kind !== 'value') { - outputType = context.expectedType; - } +// The following logic comes from +// . +// Keep it synchronized with +// . +// 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. - const branches = []; - for (let i = 1; i < args.length - 1; i += 2) { - const test = context.parse(args[i], i, BooleanType); - if (!test) return null; +// Blocks in the Unicode supplementary planes are excluded from this module due +// to . - const result = context.parse(args[i + 1], i + 1, outputType); - if (!result) return null; +/** + * 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 + */ +function charHasUprightVerticalOrientation(char ) { + if (char === 0x02EA /* modifier letter yin departing tone mark */ || + char === 0x02EB /* modifier letter yang departing tone mark */) { + return true; + } - branches.push([test, result]); + // Return early for characters outside all ranges whose characters remain + // upright in vertical writing mode. + if (char < 0x1100) return false; - outputType = outputType || result.type; + if (unicodeBlockLookup['Bopomofo Extended'](char)) return true; + if (unicodeBlockLookup['Bopomofo'](char)) return true; + if (unicodeBlockLookup['CJK Compatibility Forms'](char)) { + if (!((char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F) /* wavy low line */)) { + return true; } - - const otherwise = context.parse(args[args.length - 1], args.length - 1, outputType); - if (!otherwise) return null; - - assert_1(outputType); - return new Case((outputType ), branches, otherwise); } - - evaluate(ctx ) { - for (const [test, expression] of this.branches) { - if (test.evaluate(ctx)) { - return expression.evaluate(ctx); - } + if (unicodeBlockLookup['CJK Compatibility Ideographs'](char)) return true; + if (unicodeBlockLookup['CJK Compatibility'](char)) return true; + if (unicodeBlockLookup['CJK Radicals Supplement'](char)) return true; + if (unicodeBlockLookup['CJK Strokes'](char)) return true; + if (unicodeBlockLookup['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 (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char)) return true; + if (unicodeBlockLookup['CJK Unified Ideographs'](char)) return true; + if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char)) return true; + if (unicodeBlockLookup['Hangul Compatibility Jamo'](char)) return true; + if (unicodeBlockLookup['Hangul Jamo Extended-A'](char)) return true; + if (unicodeBlockLookup['Hangul Jamo Extended-B'](char)) return true; + if (unicodeBlockLookup['Hangul Jamo'](char)) return true; + if (unicodeBlockLookup['Hangul Syllables'](char)) return true; + if (unicodeBlockLookup['Hiragana'](char)) return true; + if (unicodeBlockLookup['Ideographic Description Characters'](char)) return true; + if (unicodeBlockLookup['Kanbun'](char)) return true; + if (unicodeBlockLookup['Kangxi Radicals'](char)) return true; + if (unicodeBlockLookup['Katakana Phonetic Extensions'](char)) return true; + if (unicodeBlockLookup['Katakana'](char)) { + if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) { + return true; } - return this.otherwise.evaluate(ctx); } + if (unicodeBlockLookup['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 (unicodeBlockLookup['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 (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics'](char)) return true; + if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics Extended'](char)) return true; + if (unicodeBlockLookup['Vertical Forms'](char)) return true; + if (unicodeBlockLookup['Yijing Hexagram Symbols'](char)) return true; + if (unicodeBlockLookup['Yi Syllables'](char)) return true; + if (unicodeBlockLookup['Yi Radicals'](char)) return true; - eachChild(fn ) { - for (const [test, expression] of this.branches) { - fn(test); - fn(expression); + 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 + */ +function charHasNeutralVerticalOrientation(char ) { + if (unicodeBlockLookup['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 (unicodeBlockLookup['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 (unicodeBlockLookup['Letterlike Symbols'](char)) return true; + if (unicodeBlockLookup['Number Forms'](char)) return true; + if (unicodeBlockLookup['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 (unicodeBlockLookup['Control Pictures'](char) && char !== 0x2423 /* open box */) return true; + if (unicodeBlockLookup['Optical Character Recognition'](char)) return true; + if (unicodeBlockLookup['Enclosed Alphanumerics'](char)) return true; + if (unicodeBlockLookup['Geometric Shapes'](char)) return true; + if (unicodeBlockLookup['Miscellaneous Symbols'](char)) { + if (!((char >= 0x261A /* black left pointing index */ && char <= 0x261F) /* white down pointing index */)) { + return true; + } + } + if (unicodeBlockLookup['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; } - fn(this.otherwise); } + if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) return true; + if (unicodeBlockLookup['Katakana'](char)) return true; + if (unicodeBlockLookup['Private Use Area'](char)) return true; + if (unicodeBlockLookup['CJK Compatibility Forms'](char)) return true; + if (unicodeBlockLookup['Small Form Variants'](char)) return true; + if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) return true; - outputDefined() { - return this.branches.every(([_, out]) => out.outputDefined()) && this.otherwise.outputDefined(); + 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; } - serialize() { - const serialized = ["case"]; - this.eachChild(child => { serialized.push(child.serialize()); }); - return serialized; + 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 + */ +function charHasRotatedVerticalOrientation(char ) { + return !(charHasUprightVerticalOrientation(char) || + charHasNeutralVerticalOrientation(char)); +} + +function charInComplexShapingScript(char ) { + return unicodeBlockLookup['Arabic'](char) || + unicodeBlockLookup['Arabic Supplement'](char) || + unicodeBlockLookup['Arabic Extended-A'](char) || + unicodeBlockLookup['Arabic Presentation Forms-A'](char) || + unicodeBlockLookup['Arabic Presentation Forms-B'](char); +} + +function charInRTLScript(char ) { + // Main blocks for Hebrew, Arabic, Thaana and other RTL scripts + return (char >= 0x0590 && char <= 0x08FF) || + unicodeBlockLookup['Arabic Presentation Forms-A'](char) || + unicodeBlockLookup['Arabic Presentation Forms-B'](char); +} + +function charInSupportedScript(char , canRenderRTL ) { + // This is a rough heuristic: whether we "can render" a script + // actually depends on the properties of the font being used + // and whether differences from the ideal rendering are considered + // semantically significant. + + // Even in Latin script, we "can't render" combinations such as the fi + // ligature, but we don't consider that semantically significant. + if (!canRenderRTL && charInRTLScript(char)) { + return false; + } + if ((char >= 0x0900 && char <= 0x0DFF) || + // Main blocks for Indic scripts and Sinhala + (char >= 0x0F00 && char <= 0x109F) || + // Main blocks for Tibetan and Myanmar + unicodeBlockLookup['Khmer'](char)) { + // These blocks cover common scripts that require + // complex text shaping, based on unicode script metadata: + // http://www.unicode.org/repos/cldr/trunk/common/properties/scriptMetadata.txt + // where "Web Rank <= 32" "Shaping Required = YES" + return false; + } + return true; +} + +function stringContainsRTLText(chars ) { + for (const char of chars) { + if (charInRTLScript(char.charCodeAt(0))) { + return true; + } + } + return false; +} + +function isStringInSupportedScript(chars , canRenderRTL ) { + for (const char of chars) { + if (!charInSupportedScript(char.charCodeAt(0), canRenderRTL)) { + return false; + } } + return true; } // + - - - - +const status = { + unavailable: 'unavailable', // Not loaded + deferred: 'deferred', // The plugin URL has been specified, but loading has been deferred + loading: 'loading', // request in-flight + loaded: 'loaded', + error: 'error' +}; -class Slice { - - - + + + - constructor(type , input , beginIndex , endIndex ) { - this.type = type; - this.input = input; - this.beginIndex = beginIndex; - this.endIndex = endIndex; + +let _completionCallback = null; + +//Variables defining the current state of the plugin +let pluginStatus = status.unavailable; +let pluginURL = null; + +const triggerPluginCompletionEvent = function(error ) { + // NetworkError's are not correctly reflected by the plugin status which prevents reloading plugin + if (error && typeof error === 'string' && error.indexOf('NetworkError') > -1) { + pluginStatus = status.error; + } + if (_completionCallback) { + _completionCallback(error); } +}; - static parse(args , context ) { - if (args.length <= 2 || args.length >= 5) { - return context.error(`Expected 3 or 4 arguments, but found ${args.length - 1} instead.`); - } +function sendPluginStateToWorker() { + evented.fire(new Event('pluginStateChange', {pluginStatus, pluginURL})); +} - const input = context.parse(args[1], 1, ValueType); - const beginIndex = context.parse(args[2], 2, NumberType); +const evented = new Evented(); - if (!input || !beginIndex) return null; +const getRTLTextPluginStatus = function () { + return pluginStatus; +}; - if (!isValidType(input.type, [array(ValueType), StringType, ValueType])) { - return context.error(`Expected first argument to be of type array or string, but found ${toString(input.type)} instead`); - } +const registerForPluginStateChange = function(callback ) { + // Do an initial sync of the state + callback({pluginStatus, pluginURL}); + // Listen for all future state changes + evented.on('pluginStateChange', callback); + return callback; +}; - if (args.length === 4) { - const endIndex = context.parse(args[3], 3, NumberType); - if (!endIndex) return null; - return new Slice(input.type, input, beginIndex, endIndex); - } else { - return new Slice(input.type, input, beginIndex); - } +const clearRTLTextPlugin = function() { + pluginStatus = status.unavailable; + pluginURL = null; +}; + +const setRTLTextPlugin = function(url , callback , deferred = false) { + if (pluginStatus === status.deferred || pluginStatus === status.loading || pluginStatus === status.loaded) { + throw new Error('setRTLTextPlugin cannot be called multiple times.'); } + pluginURL = exported$1.resolveURL(url); + pluginStatus = status.deferred; + _completionCallback = callback; + sendPluginStateToWorker(); - evaluate(ctx ) { - const input = (this.input.evaluate(ctx) ); - const beginIndex = (this.beginIndex.evaluate(ctx) ); + //Start downloading the plugin immediately if not intending to lazy-load + if (!deferred) { + downloadRTLTextPlugin(); + } +}; - if (!isValidNativeType(input, ['string', 'array'])) { - throw new RuntimeError(`Expected first argument to be of type array or string, but found ${toString(typeOf(input))} instead.`); - } +const downloadRTLTextPlugin = function() { + if (pluginStatus !== status.deferred || !pluginURL) { + throw new Error('rtl-text-plugin cannot be downloaded unless a pluginURL is specified'); + } + pluginStatus = status.loading; + sendPluginStateToWorker(); + if (pluginURL) { + getArrayBuffer({url: pluginURL}, (error) => { + if (error) { + triggerPluginCompletionEvent(error); + } else { + pluginStatus = status.loaded; + sendPluginStateToWorker(); + } + }); + } +}; - if (this.endIndex) { - const endIndex = (this.endIndex.evaluate(ctx) ); - return input.slice(beginIndex, endIndex); - } +const plugin + + + + + + + + + = { + applyArabicShaping: null, + processBidirectionalText: null, + processStyledBidirectionalText: null, + isLoaded() { + return pluginStatus === status.loaded || // Main Thread: loaded if the completion callback returned successfully + plugin.applyArabicShaping != null; // Web-worker: loaded if the plugin functions have been compiled + }, + isLoading() { // Main Thread Only: query the loading status, this function does not return the correct value in the worker context. + return pluginStatus === status.loading; + }, + setState(state ) { // Worker thread only: this tells the worker threads that the plugin is available on the Main thread + assert_1(isWorker(), 'Cannot set the state of the rtl-text-plugin when not in the web-worker context'); - return input.slice(beginIndex); + pluginStatus = state.pluginStatus; + pluginURL = state.pluginURL; + }, + isParsed() { + assert_1(isWorker(), 'rtl-text-plugin is only parsed on the worker-threads'); + + return plugin.applyArabicShaping != null && + plugin.processBidirectionalText != null && + plugin.processStyledBidirectionalText != null; + }, + getPluginURL() { + assert_1(isWorker(), 'rtl-text-plugin url can only be queried from the worker threads'); + return pluginURL; } +}; - eachChild(fn ) { - fn(this.input); - fn(this.beginIndex); - if (this.endIndex) { - fn(this.endIndex); +const lazyLoadRTLTextPlugin = function() { + if (!plugin.isLoading() && + !plugin.isLoaded() && + getRTLTextPluginStatus() === 'deferred' + ) { + downloadRTLTextPlugin(); + } +}; + +// + + + + + + + + + +class EvaluationParameters { + + + + + + + + // "options" may also be another EvaluationParameters to copy, see CrossFadedProperty.possiblyEvaluate + constructor(zoom , options ) { + this.zoom = zoom; + + if (options) { + this.now = options.now; + this.fadeDuration = options.fadeDuration; + this.zoomHistory = options.zoomHistory; + this.transition = options.transition; + this.pitch = options.pitch; + } else { + this.now = 0; + this.fadeDuration = 0; + this.zoomHistory = new ZoomHistory(); + this.transition = {}; + this.pitch = 0; } } - outputDefined() { - return false; + isSupportedScript(str ) { + return isStringInSupportedScript(str, plugin.isLoaded()); } - serialize() { - if (this.endIndex != null && this.endIndex !== undefined) { - const endIndex = this.endIndex.serialize(); - return ["slice", this.input.serialize(), this.beginIndex.serialize(), endIndex]; + crossFadingFactor() { + if (this.fadeDuration === 0) { + return 1; + } else { + return Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1); } - return ["slice", this.input.serialize(), this.beginIndex.serialize()]; + } + + getCrossfadeParameters() { + const z = this.zoom; + const fraction = z - Math.floor(z); + const t = this.crossFadingFactor(); + + return z > this.zoomHistory.lastIntegerZoom ? + {fromScale: 2, toScale: 1, t: fraction + (1 - fraction) * t} : + {fromScale: 0.5, toScale: 1, t: 1 - (1 - t) * fraction}; } } // - - - - + + + + + + - + + + + + + + -function isComparableType(op , type ) { - if (op === '==' || op === '!=') { - // equality operator - return type.kind === 'boolean' || - type.kind === 'string' || - type.kind === 'number' || - type.kind === 'null' || - type.kind === 'value'; - } else { - // ordering operator - return type.kind === 'string' || - type.kind === 'number' || - type.kind === 'value'; - } -} + -function eq(ctx, a, b) { return a === b; } -function neq(ctx, a, b) { return a !== b; } -function lt(ctx, a, b) { return a < b; } -function gt(ctx, a, b) { return a > b; } -function lteq(ctx, a, b) { return a <= b; } -function gteq(ctx, a, b) { return a >= b; } + + + + + -function eqCollate(ctx, a, b, c) { return c.compare(a, b) === 0; } -function neqCollate(ctx, a, b, c) { return !eqCollate(ctx, a, b, c); } -function ltCollate(ctx, a, b, c) { return c.compare(a, b) < 0; } -function gtCollate(ctx, a, b, c) { return c.compare(a, b) > 0; } -function lteqCollate(ctx, a, b, c) { return c.compare(a, b) <= 0; } -function gteqCollate(ctx, a, b, c) { return c.compare(a, b) >= 0; } +/** + * 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 + */ /** - * Special form for comparison operators, implementing the signatures: - * - (T, T, ?Collator) => boolean - * - (T, value, ?Collator) => boolean - * - (value, T, ?Collator) => boolean + * Implementations of the `Property` interface: * - * For inequalities, T must be either value, string, or number. For ==/!=, it - * can also be boolean or null. + * * 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. * - * Equality semantics are equivalent to Javascript's strict equality (===/!==) - * -- i.e., when the arguments' types don't match, == evaluates to false, != to - * true. + * 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. * - * When types don't match in an ordering comparison, a runtime error is thrown. + * 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 `line-gradient`, + * and one for `light-position`. * * @private */ -function makeComparison(op , compareBasic, compareWithCollator) { - const isOrderComparison = op !== '==' && op !== '!='; - - return class Comparison { - - - - - - - constructor(lhs , rhs , collator ) { - this.type = BooleanType; - this.lhs = lhs; - this.rhs = rhs; - this.collator = collator; - this.hasUntypedArgument = lhs.type.kind === 'value' || rhs.type.kind === 'value'; - } - - static parse(args , context ) { - if (args.length !== 3 && args.length !== 4) - return context.error(`Expected two or three arguments.`); - - const op = (args[0] ); - - let lhs = context.parse(args[1], 1, ValueType); - if (!lhs) return null; - if (!isComparableType(op, lhs.type)) { - return context.concat(1).error(`"${op}" comparisons are not supported for type '${toString(lhs.type)}'.`); - } - let rhs = context.parse(args[2], 2, ValueType); - if (!rhs) return null; - if (!isComparableType(op, rhs.type)) { - return context.concat(2).error(`"${op}" comparisons are not supported for type '${toString(rhs.type)}'.`); - } - - if ( - lhs.type.kind !== rhs.type.kind && - lhs.type.kind !== 'value' && - rhs.type.kind !== 'value' - ) { - return context.error(`Cannot compare types '${toString(lhs.type)}' and '${toString(rhs.type)}'.`); - } - - if (isOrderComparison) { - // typing rules specific to less/greater than operators - if (lhs.type.kind === 'value' && rhs.type.kind !== 'value') { - // (value, T) - lhs = new Assertion(rhs.type, [lhs]); - } else if (lhs.type.kind !== 'value' && rhs.type.kind === 'value') { - // (T, value) - rhs = new Assertion(lhs.type, [rhs]); - } - } - - let collator = null; - if (args.length === 4) { - if ( - lhs.type.kind !== 'string' && - rhs.type.kind !== 'string' && - lhs.type.kind !== 'value' && - rhs.type.kind !== 'value' - ) { - return context.error(`Cannot use collator to compare non-string types.`); - } - collator = context.parse(args[3], 3, CollatorType); - if (!collator) return null; - } - - return new Comparison(lhs, rhs, collator); - } - - evaluate(ctx ) { - const lhs = this.lhs.evaluate(ctx); - const rhs = this.rhs.evaluate(ctx); - - if (isOrderComparison && this.hasUntypedArgument) { - const lt = typeOf(lhs); - const rt = typeOf(rhs); - // check that type is string or number, and equal - if (lt.kind !== rt.kind || !(lt.kind === 'string' || lt.kind === 'number')) { - throw new RuntimeError(`Expected arguments for "${op}" to be (string, string) or (number, number), but found (${lt.kind}, ${rt.kind}) instead.`); - } - } - - if (this.collator && !isOrderComparison && this.hasUntypedArgument) { - const lt = typeOf(lhs); - const rt = typeOf(rhs); - if (lt.kind !== 'string' || rt.kind !== 'string') { - return compareBasic(ctx, lhs, rhs); - } - } + + + + + - return this.collator ? - compareWithCollator(ctx, lhs, rhs, this.collator.evaluate(ctx)) : - compareBasic(ctx, lhs, rhs); - } +/** + * `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 + */ +class PropertyValue { + + + - eachChild(fn ) { - fn(this.lhs); - fn(this.rhs); - if (this.collator) { - fn(this.collator); - } - } + constructor(property , value ) { + this.property = property; + this.value = value; + this.expression = normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification); + } - outputDefined() { - return true; - } + isDataDriven() { + return this.expression.kind === 'source' || this.expression.kind === 'composite'; + } - serialize() { - const serialized = [op]; - this.eachChild(child => { serialized.push(child.serialize()); }); - return serialized; - } - }; + possiblyEvaluate(parameters , canonical , availableImages ) { + return this.property.possiblyEvaluate(this, parameters, canonical, availableImages); + } } -const Equals = makeComparison('==', eq, eqCollate); -const NotEquals = makeComparison('!=', neq, neqCollate); -const LessThan = makeComparison('<', lt, ltCollate); -const GreaterThan = makeComparison('>', gt, gtCollate); -const LessThanOrEqual = makeComparison('<=', lteq, lteqCollate); -const GreaterThanOrEqual = makeComparison('>=', gteq, gteqCollate); - -// - - - - - +// ------- 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 + */ +class TransitionablePropertyValue { - - - - -class NumberFormat { - - - // BCP 47 language tag - // ISO 4217 currency code, required if style=currency - // Default 0 - // Default 3 + + - constructor(number , - locale , - currency , - minFractionDigits , - maxFractionDigits ) { - this.type = StringType; - this.number = number; - this.locale = locale; - this.currency = currency; - this.minFractionDigits = minFractionDigits; - this.maxFractionDigits = maxFractionDigits; + constructor(property ) { + this.property = property; + this.value = new PropertyValue(property, undefined); } - static parse(args , context ) { - if (args.length !== 3) - return context.error(`Expected two arguments.`); + transitioned(parameters , + prior ) { + return new TransitioningPropertyValue(this.property, this.value, prior, // eslint-disable-line no-use-before-define + extend$1({}, parameters.transition, this.transition), parameters.now); + } - const number = context.parse(args[1], 1, NumberType); - if (!number) return null; + untransitioned() { + return new TransitioningPropertyValue(this.property, this.value, null, {}, 0); // eslint-disable-line no-use-before-define + } +} - const options = (args[2] ); - if (typeof options !== "object" || Array.isArray(options)) - return context.error(`NumberFormat options argument must be an object.`); +/** + * 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 + */ + + - let locale = null; - if (options['locale']) { - locale = context.parse(options['locale'], 1, StringType); - if (!locale) return null; - } +/** + * `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 + */ +class Transitionable { + + - let currency = null; - if (options['currency']) { - currency = context.parse(options['currency'], 1, StringType); - if (!currency) return null; - } + constructor(properties ) { + this._properties = properties; + this._values = (Object.create(properties.defaultTransitionablePropertyValues) ); + } - let minFractionDigits = null; - if (options['min-fraction-digits']) { - minFractionDigits = context.parse(options['min-fraction-digits'], 1, NumberType); - if (!minFractionDigits) return null; - } + getValue (name ) { + return clone$9(this._values[name].value.value); + } - let maxFractionDigits = null; - if (options['max-fraction-digits']) { - maxFractionDigits = context.parse(options['max-fraction-digits'], 1, NumberType); - if (!maxFractionDigits) return null; + setValue (name , value ) { + if (!this._values.hasOwnProperty(name)) { + this._values[name] = new TransitionablePropertyValue(this._values[name].property); } - - return new NumberFormat(number, locale, currency, minFractionDigits, maxFractionDigits); + // 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$9(value)); } - evaluate(ctx ) { - return new Intl.NumberFormat(this.locale ? this.locale.evaluate(ctx) : [], - { - style: this.currency ? "currency" : "decimal", - currency: this.currency ? this.currency.evaluate(ctx) : undefined, - minimumFractionDigits: this.minFractionDigits ? this.minFractionDigits.evaluate(ctx) : undefined, - maximumFractionDigits: this.maxFractionDigits ? this.maxFractionDigits.evaluate(ctx) : undefined, - }).format(this.number.evaluate(ctx)); + getTransition (name ) { + return clone$9(this._values[name].transition); } - eachChild(fn ) { - fn(this.number); - if (this.locale) { - fn(this.locale); - } - if (this.currency) { - fn(this.currency); - } - if (this.minFractionDigits) { - fn(this.minFractionDigits); - } - if (this.maxFractionDigits) { - fn(this.maxFractionDigits); + setTransition (name , value ) { + if (!this._values.hasOwnProperty(name)) { + this._values[name] = new TransitionablePropertyValue(this._values[name].property); } + this._values[name].transition = clone$9(value) || undefined; } - outputDefined() { - return false; - } + serialize() { + const result = {}; + for (const property of Object.keys(this._values)) { + const value = this.getValue(property); + if (value !== undefined) { + result[property] = value; + } - serialize() { - const options = {}; - if (this.locale) { - options['locale'] = this.locale.serialize(); - } - if (this.currency) { - options['currency'] = this.currency.serialize(); + const transition = this.getTransition(property); + if (transition !== undefined) { + result[`${property}-transition`] = transition; + } } - if (this.minFractionDigits) { - options['min-fraction-digits'] = this.minFractionDigits.serialize(); + return result; + } + + transitioned(parameters , prior ) { + const result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define + for (const property of Object.keys(this._values)) { + result._values[property] = this._values[property].transitioned(parameters, prior._values[property]); } - if (this.maxFractionDigits) { - options['max-fraction-digits'] = this.maxFractionDigits.serialize(); + return result; + } + + untransitioned() { + const result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define + for (const property of Object.keys(this._values)) { + result._values[property] = this._values[property].untransitioned(); } - return ["number-format", this.number.serialize(), options]; + return result; } } -// - - - - - +// ------- Transitioning ------- -class Length { - - +/** + * `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 + */ +class TransitioningPropertyValue { + + + + + - constructor(input ) { - this.type = NumberType; - this.input = input; + constructor(property , + value , + prior , + transition , + now ) { + const delay = transition.delay || 0; + const duration = transition.duration || 0; + now = now || 0; + this.property = property; + this.value = value; + this.begin = now + delay; + this.end = this.begin + duration; + if (property.specification.transition && (transition.delay || transition.duration)) { + this.prior = prior; + } } - static parse(args , context ) { - if (args.length !== 2) - return context.error(`Expected 1 argument, but found ${args.length - 1} instead.`); + possiblyEvaluate(parameters , canonical , availableImages ) { + const now = parameters.now || 0; + const finalValue = this.value.possiblyEvaluate(parameters, canonical, availableImages); + const 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, canonical, availableImages); + } else { + // Interpolate between recursively-calculated prior value and final. + const t = (now - this.begin) / (this.end - this.begin); + return this.property.interpolate(prior.possiblyEvaluate(parameters, canonical, availableImages), finalValue, easeCubicInOut(t)); + } + } +} - const input = context.parse(args[1], 1); - if (!input) return null; +/** + * 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 + */ + + - if (input.type.kind !== 'array' && input.type.kind !== 'string' && input.type.kind !== 'value') - return context.error(`Expected argument of type string or array, but found ${toString(input.type)} instead.`); +/** + * `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 + */ +class Transitioning { + + - return new Length(input); + constructor(properties ) { + this._properties = properties; + this._values = (Object.create(properties.defaultTransitioningPropertyValues) ); } - evaluate(ctx ) { - const input = this.input.evaluate(ctx); - if (typeof input === 'string') { - return input.length; - } else if (Array.isArray(input)) { - return input.length; - } else { - throw new RuntimeError(`Expected value to be of type string or array, but found ${toString(typeOf(input))} instead.`); + possiblyEvaluate(parameters , canonical , availableImages ) { + const result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define + for (const property of Object.keys(this._values)) { + result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages); } + return result; } - eachChild(fn ) { - fn(this.input); + hasTransition() { + for (const property of Object.keys(this._values)) { + if (this._values[property].prior) { + return true; + } + } + return false; } +} - outputDefined() { - 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 + */ + + + +/** + * 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 `PropertyValueSpecification`. + * + * @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 + */ +class Layout { + + + + constructor(properties ) { + this._properties = properties; + this._values = (Object.create(properties.defaultPropertyValues) ); } - serialize() { - const serialized = ["length"]; - this.eachChild(child => { serialized.push(child.serialize()); }); - return serialized; + getValue (name ) { + return clone$9(this._values[name].value); } -} -// + setValue (name , value ) { + this._values[name] = new PropertyValue(this._values[name].property, value === null ? undefined : clone$9(value)); + } - - - -const expressions = { - // special forms - '==': Equals, - '!=': NotEquals, - '>': GreaterThan, - '<': LessThan, - '>=': GreaterThanOrEqual, - '<=': LessThanOrEqual, - 'array': Assertion, - 'at': At, - 'boolean': Assertion, - 'case': Case, - 'coalesce': Coalesce, - 'collator': CollatorExpression, - 'format': FormatExpression, - 'image': ImageExpression, - 'in': In, - 'index-of': IndexOf, - 'interpolate': Interpolate, - 'interpolate-hcl': Interpolate, - 'interpolate-lab': Interpolate, - 'length': Length, - 'let': Let, - 'literal': Literal, - 'match': Match, - 'number': Assertion, - 'number-format': NumberFormat, - 'object': Assertion, - 'slice': Slice, - 'step': Step, - 'string': Assertion, - 'to-boolean': Coercion, - 'to-color': Coercion, - 'to-number': Coercion, - 'to-string': Coercion, - 'var': Var, - 'within': Within -}; + serialize() { + const result = {}; + for (const property of Object.keys(this._values)) { + const value = this.getValue(property); + if (value !== undefined) { + result[property] = value; + } + } + return result; + } -function rgba(ctx, [r, g, b, a]) { - r = r.evaluate(ctx); - g = g.evaluate(ctx); - b = b.evaluate(ctx); - const alpha = a ? a.evaluate(ctx) : 1; - const 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); + possiblyEvaluate(parameters , canonical , availableImages ) { + const result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define + for (const property of Object.keys(this._values)) { + result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages); + } + return result; + } } -function has(key, obj) { - return key in obj; -} +// ------- PossiblyEvaluated ------- -function get(key, obj) { - const v = obj[key]; - return typeof v === 'undefined' ? null : v; +/** + * "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 + */ +class PossiblyEvaluatedPropertyValue { + + + + + constructor(property , value , parameters ) { + this.property = property; + this.value = value; + this.parameters = parameters; + } + + isConstant() { + return this.value.kind === 'constant'; + } + + constantOr(value ) { + if (this.value.kind === 'constant') { + return this.value.value; + } else { + return value; + } + } + + evaluate(feature , featureState , canonical , availableImages ) { + return this.property.evaluate(this.value, this.parameters, feature, featureState, canonical, availableImages); + } } -function binarySearch(v, a, i, j) { - while (i <= j) { - const m = (i + j) >> 1; - if (a[m] === v) - return true; - if (a[m] > v) - j = m - 1; - else - i = m + 1; +/** + * 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 + */ +class PossiblyEvaluated { + + + + constructor(properties ) { + this._properties = properties; + this._values = (Object.create(properties.defaultPossiblyEvaluatedValues) ); + } + + get (name ) { + return this._values[name]; } - return false; } -function varargs(type ) { - return {type}; +/** + * 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 + */ +class DataConstantProperty { + + + constructor(specification ) { + this.specification = specification; + } + + possiblyEvaluate(value , parameters ) { + assert_1(!value.isDataDriven()); + return value.expression.evaluate(parameters); + } + + interpolate(a , b , t ) { + const interp = (interpolate )[this.specification.type]; + if (interp) { + return interp(a, b, t); + } else { + return a; + } + } } -CompoundExpression.register(expressions, { - 'error': [ - ErrorType, - [StringType], - (ctx, [v]) => { throw new RuntimeError(v.evaluate(ctx)); } - ], - 'typeof': [ - StringType, - [ValueType], - (ctx, [v]) => toString(typeOf(v.evaluate(ctx))) - ], - 'to-rgba': [ - array(NumberType, 4), - [ColorType], - (ctx, [v]) => { - return v.evaluate(ctx).toArray(); +/** + * 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 + */ +class DataDrivenProperty { + + + + constructor(specification , overrides ) { + this.specification = specification; + this.overrides = overrides; + } + + possiblyEvaluate(value , parameters , canonical , availableImages ) { + if (value.expression.kind === 'constant' || value.expression.kind === 'camera') { + return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: value.expression.evaluate(parameters, (null ), {}, canonical, availableImages)}, parameters); + } else { + return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); } - ], - 'rgb': [ - ColorType, - [NumberType, NumberType, NumberType], - rgba - ], - 'rgba': [ - ColorType, - [NumberType, NumberType, NumberType, NumberType], - rgba - ], - 'has': { - type: BooleanType, - overloads: [ - [ - [StringType], - (ctx, [key]) => has(key.evaluate(ctx), ctx.properties()) - ], [ - [StringType, ObjectType], - (ctx, [key, obj]) => has(key.evaluate(ctx), obj.evaluate(ctx)) - ] - ] - }, - 'get': { - type: ValueType, - overloads: [ - [ - [StringType], - (ctx, [key]) => get(key.evaluate(ctx), ctx.properties()) - ], [ - [StringType, ObjectType], - (ctx, [key, obj]) => get(key.evaluate(ctx), obj.evaluate(ctx)) - ] - ] - }, - 'feature-state': [ - ValueType, - [StringType], - (ctx, [key]) => get(key.evaluate(ctx), ctx.featureState || {}) - ], - 'properties': [ - ObjectType, - [], - (ctx) => ctx.properties() - ], - 'geometry-type': [ - StringType, - [], - (ctx) => ctx.geometryType() - ], - 'id': [ - ValueType, - [], - (ctx) => ctx.id() - ], - 'zoom': [ - NumberType, - [], - (ctx) => ctx.globals.zoom - ], - 'pitch': [ - NumberType, - [], - (ctx) => ctx.globals.pitch || 0 - ], - 'distance-from-center': [ - NumberType, - [], - (ctx) => ctx.distanceFromCenter() - ], - 'heatmap-density': [ - NumberType, - [], - (ctx) => ctx.globals.heatmapDensity || 0 - ], - 'line-progress': [ - NumberType, - [], - (ctx) => ctx.globals.lineProgress || 0 - ], - 'sky-radial-progress': [ - NumberType, - [], - (ctx) => ctx.globals.skyRadialProgress || 0 - ], - 'accumulated': [ - ValueType, - [], - (ctx) => ctx.globals.accumulated === undefined ? null : ctx.globals.accumulated - ], - '+': [ - NumberType, - varargs(NumberType), - (ctx, args) => { - let result = 0; - for (const arg of args) { - result += arg.evaluate(ctx); - } - return result; + } + + interpolate(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; } - ], - '*': [ - NumberType, - varargs(NumberType), - (ctx, args) => { - let result = 1; - for (const arg of args) { - result *= arg.evaluate(ctx); - } - return result; + + // Special case hack solely for fill-outline-color. The undefined value is subsequently handled in + // FillStyleLayer#recalculate, which sets fill-outline-color to the fill-color value if the former + // is a PossiblyEvaluatedPropertyValue containing a constant undefined value. In addition to the + // return value here, the other source of a PossiblyEvaluatedPropertyValue containing a constant + // undefined value is the "default value" for fill-outline-color held in + // `Properties#defaultPossiblyEvaluatedValues`, which serves as the prototype of + // `PossiblyEvaluated#_values`. + if (a.value.value === undefined || b.value.value === undefined) { + return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: (undefined )}, a.parameters); } - ], - '-': { - type: NumberType, - overloads: [ - [ - [NumberType, NumberType], - (ctx, [a, b]) => a.evaluate(ctx) - b.evaluate(ctx) - ], [ - [NumberType], - (ctx, [a]) => -a.evaluate(ctx) - ] - ] - }, - '/': [ - NumberType, - [NumberType, NumberType], - (ctx, [a, b]) => a.evaluate(ctx) / b.evaluate(ctx) - ], - '%': [ - NumberType, - [NumberType, NumberType], - (ctx, [a, b]) => a.evaluate(ctx) % b.evaluate(ctx) - ], - 'ln2': [ - NumberType, - [], - () => Math.LN2 - ], - 'pi': [ - NumberType, - [], - () => Math.PI - ], - 'e': [ - NumberType, - [], - () => Math.E - ], - '^': [ - NumberType, - [NumberType, NumberType], - (ctx, [b, e]) => Math.pow(b.evaluate(ctx), e.evaluate(ctx)) - ], - 'sqrt': [ - NumberType, - [NumberType], - (ctx, [x]) => Math.sqrt(x.evaluate(ctx)) - ], - 'log10': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN10 - ], - 'ln': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.log(n.evaluate(ctx)) - ], - 'log2': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.log(n.evaluate(ctx)) / Math.LN2 - ], - 'sin': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.sin(n.evaluate(ctx)) - ], - 'cos': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.cos(n.evaluate(ctx)) - ], - 'tan': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.tan(n.evaluate(ctx)) - ], - 'asin': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.asin(n.evaluate(ctx)) - ], - 'acos': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.acos(n.evaluate(ctx)) - ], - 'atan': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.atan(n.evaluate(ctx)) - ], - 'min': [ - NumberType, - varargs(NumberType), - (ctx, args) => Math.min(...args.map(arg => arg.evaluate(ctx))) - ], - 'max': [ - NumberType, - varargs(NumberType), - (ctx, args) => Math.max(...args.map(arg => arg.evaluate(ctx))) - ], - 'abs': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.abs(n.evaluate(ctx)) - ], - 'round': [ - NumberType, - [NumberType], - (ctx, [n]) => { - const v = n.evaluate(ctx); - // Javascript's Math.round() rounds towards +Infinity for halfway - // values, even when they're negative. It's more common to round - // away from 0 (e.g., this is what python and C++ do) - return v < 0 ? -Math.round(-v) : Math.round(v); + + const interp = (interpolate )[this.specification.type]; + if (interp) { + return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: interp(a.value.value, b.value.value, t)}, a.parameters); + } else { + return a; } - ], - 'floor': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.floor(n.evaluate(ctx)) - ], - 'ceil': [ - NumberType, - [NumberType], - (ctx, [n]) => Math.ceil(n.evaluate(ctx)) - ], - 'filter-==': [ - BooleanType, - [StringType, ValueType], - (ctx, [k, v]) => ctx.properties()[(k ).value] === (v ).value - ], - 'filter-id-==': [ - BooleanType, - [ValueType], - (ctx, [v]) => ctx.id() === (v ).value - ], - 'filter-type-==': [ - BooleanType, - [StringType], - (ctx, [v]) => ctx.geometryType() === (v ).value - ], - 'filter-<': [ - BooleanType, - [StringType, ValueType], - (ctx, [k, v]) => { - const a = ctx.properties()[(k ).value]; - const b = (v ).value; - return typeof a === typeof b && a < b; - } - ], - 'filter-id-<': [ - BooleanType, - [ValueType], - (ctx, [v]) => { - const a = ctx.id(); - const b = (v ).value; - return typeof a === typeof b && a < b; + } + + evaluate(value , parameters , feature , featureState , canonical , availableImages ) { + if (value.kind === 'constant') { + return value.value; + } else { + return value.evaluate(parameters, feature, featureState, canonical, availableImages); } - ], - 'filter->': [ - BooleanType, - [StringType, ValueType], - (ctx, [k, v]) => { - const a = ctx.properties()[(k ).value]; - const b = (v ).value; - return typeof a === typeof b && a > b; + } +} + +/** + * An implementation of `Property` for data driven `line-pattern` which are transitioned by cross-fading + * rather than interpolation. + * + * @private + */ + +class CrossFadedDataDrivenProperty extends DataDrivenProperty { + + possiblyEvaluate(value , parameters , canonical , availableImages ) { + if (value.value === undefined) { + return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: undefined}, parameters); + } else if (value.expression.kind === 'constant') { + const evaluatedValue = value.expression.evaluate(parameters, (null ), {}, canonical, availableImages); + const isImageExpression = value.property.specification.type === 'resolvedImage'; + const constantValue = isImageExpression && typeof evaluatedValue !== 'string' ? evaluatedValue.name : evaluatedValue; + const constant = this._calculate(constantValue, constantValue, constantValue, parameters); + return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: constant}, parameters); + } else if (value.expression.kind === 'camera') { + const cameraVal = 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); + return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: cameraVal}, parameters); + } else { + // source or composite expression + return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); } - ], - 'filter-id->': [ - BooleanType, - [ValueType], - (ctx, [v]) => { - const a = ctx.id(); - const b = (v ).value; - return typeof a === typeof b && a > b; + } + + evaluate(value , globals , feature , featureState , canonical , availableImages ) { + if (value.kind === 'source') { + const constant = value.evaluate(globals, feature, featureState, canonical, availableImages); + return this._calculate(constant, constant, constant, globals); + } else if (value.kind === 'composite') { + return this._calculate( + value.evaluate({zoom: Math.floor(globals.zoom) - 1.0}, feature, featureState), + value.evaluate({zoom: Math.floor(globals.zoom)}, feature, featureState), + value.evaluate({zoom: Math.floor(globals.zoom) + 1.0}, feature, featureState), + globals); + } else { + return value.value; } - ], - 'filter-<=': [ - BooleanType, - [StringType, ValueType], - (ctx, [k, v]) => { - const a = ctx.properties()[(k ).value]; - const b = (v ).value; - return typeof a === typeof b && a <= b; + } + + _calculate(min , mid , max , parameters ) { + const z = parameters.zoom; + // ugly hack alert: when evaluating non-constant dashes on the worker side, + // we need all three values to pack into the atlas; the if condition is always false there; + // will be removed after removing cross-fading + return z > parameters.zoomHistory.lastIntegerZoom ? + {from: min, to: mid, other: max} : + {from: max, to: mid, other: min}; + } + + interpolate(a ) { + return a; + } +} +/** + * An implementation of `Property` for `*-pattern` and `line-dasharray`, which are transitioned by cross-fading + * rather than interpolation. + * + * @private + */ +class CrossFadedProperty { + + + constructor(specification ) { + this.specification = specification; + } + + possiblyEvaluate(value , parameters , canonical , availableImages ) { + if (value.value === undefined) { + return undefined; + } else if (value.expression.kind === 'constant') { + const constant = value.expression.evaluate(parameters, (null ), {}, canonical, availableImages); + return this._calculate(constant, constant, constant, parameters); + } else { + assert_1(!value.isDataDriven()); + return this._calculate( + value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom - 1.0), parameters)), + value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom), parameters)), + value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom + 1.0), parameters)), + parameters); } - ], - 'filter-id-<=': [ - BooleanType, - [ValueType], - (ctx, [v]) => { - const a = ctx.id(); - const b = (v ).value; - return typeof a === typeof b && a <= b; + } + + _calculate(min , mid , max , parameters ) { + const z = parameters.zoom; + return z > parameters.zoomHistory.lastIntegerZoom ? {from: min, to: mid} : {from: max, to: mid}; + } + + interpolate(a ) { + return a; + } +} + +/** + * An implementation of `Property` for `heatmap-color` and `line-gradient`. Interpolation is a no-op, and + * evaluation returns a boolean value in order to indicate its presence, but the real + * evaluation happens in StyleLayer classes. + * + * @private + */ + +class ColorRampProperty { + + + constructor(specification ) { + this.specification = specification; + } + + possiblyEvaluate(value , parameters , canonical , availableImages ) { + return !!value.expression.evaluate(parameters, (null ), {}, canonical, availableImages); + } + + interpolate() { return false; } +} + +/** + * `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 + */ +class Properties { + + + + + + + + constructor(properties ) { + this.properties = properties; + this.defaultPropertyValues = ({} ); + this.defaultTransitionablePropertyValues = ({} ); + this.defaultTransitioningPropertyValues = ({} ); + this.defaultPossiblyEvaluatedValues = ({} ); + this.overridableProperties = ([] ); + + const defaultParameters = new EvaluationParameters(0, {}); + for (const property in properties) { + const prop = properties[property]; + if (prop.specification.overridable) { + this.overridableProperties.push(property); + } + const defaultPropertyValue = this.defaultPropertyValues[property] = + new PropertyValue(prop, undefined); + const defaultTransitionablePropertyValue = this.defaultTransitionablePropertyValues[property] = + new TransitionablePropertyValue(prop); + this.defaultTransitioningPropertyValues[property] = + defaultTransitionablePropertyValue.untransitioned(); + this.defaultPossiblyEvaluatedValues[property] = + defaultPropertyValue.possiblyEvaluate(defaultParameters); } - ], - 'filter->=': [ - BooleanType, - [StringType, ValueType], - (ctx, [k, v]) => { - const a = ctx.properties()[(k ).value]; - const b = (v ).value; - return typeof a === typeof b && a >= b; + } +} + +register(DataDrivenProperty, 'DataDrivenProperty'); +register(DataConstantProperty, 'DataConstantProperty'); +register(CrossFadedDataDrivenProperty, 'CrossFadedDataDrivenProperty'); +register(CrossFadedProperty, 'CrossFadedProperty'); +register(ColorRampProperty, 'ColorRampProperty'); + +// + +/** + * 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 + */ +function packUint8ToFloat(a , b ) { + // coerce a and b to 8-bit ints + a = clamp(Math.floor(a), 0, 255); + b = clamp(Math.floor(b), 0, 255); + return 256 * a + b; +} + +// + + + +const viewTypes = { + 'Int8': Int8Array, + 'Uint8': Uint8Array, + 'Int16': Int16Array, + 'Uint16': Uint16Array, + 'Int32': Int32Array, + 'Uint32': Uint32Array, + 'Float32': Float32Array +}; + + + +/** + * @private + */ +class Struct { + + + + + + + // The following properties are defined on the prototype of sub classes. + + + /** + * @param {StructArray} structArray The StructArray the struct is stored in + * @param {number} index The index of the struct in the StructArray. + * @private + */ + constructor(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; + } +} + +const DEFAULT_CAPACITY = 128; +const 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 + */ +class StructArray { + + + + + + + // The following properties are defined on the prototype. + + + + + + constructor() { + 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. + * @private + */ + static serialize(array , transferables ) { + assert_1(!array.isTransferred); + + array._trim(); + + if (transferables) { + array.isTransferred = true; + transferables.push(array.arrayBuffer); } - ], - 'filter-id->=': [ - BooleanType, - [ValueType], - (ctx, [v]) => { - const a = ctx.id(); - const b = (v ).value; - return typeof a === typeof b && a >= b; + + return { + length: array.length, + arrayBuffer: array.arrayBuffer, + }; + } + + static deserialize(input ) { + // $FlowFixMe not-an-object - newer Flow doesn't understand this pattern, silence for now + const 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. + */ + _trim() { + if (this.length !== this.capacity) { + this.capacity = this.length; + this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement); + this._refreshViews(); } - ], - 'filter-has': [ - BooleanType, - [ValueType], - (ctx, [k]) => (k ).value in ctx.properties() - ], - 'filter-has-id': [ - BooleanType, - [], - (ctx) => (ctx.id() !== null && ctx.id() !== undefined) - ], - 'filter-type-in': [ - BooleanType, - [array(StringType)], - (ctx, [v]) => (v ).value.indexOf(ctx.geometryType()) >= 0 - ], - 'filter-id-in': [ - BooleanType, - [array(ValueType)], - (ctx, [v]) => (v ).value.indexOf(ctx.id()) >= 0 - ], - 'filter-in-small': [ - BooleanType, - [StringType, array(ValueType)], - // assumes v is an array literal - (ctx, [k, v]) => (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 - (ctx, [k, v]) => binarySearch(ctx.properties()[(k ).value], (v ).value, 0, (v ).value.length - 1) - ], - 'all': { - type: BooleanType, - overloads: [ - [ - [BooleanType, BooleanType], - (ctx, [a, b]) => a.evaluate(ctx) && b.evaluate(ctx) - ], - [ - varargs(BooleanType), - (ctx, args) => { - for (const arg of args) { - if (!arg.evaluate(ctx)) - return false; - } - return true; - } - ] - ] - }, - 'any': { - type: BooleanType, - overloads: [ - [ - [BooleanType, BooleanType], - (ctx, [a, b]) => a.evaluate(ctx) || b.evaluate(ctx) - ], - [ - varargs(BooleanType), - (ctx, args) => { - for (const arg of args) { - if (arg.evaluate(ctx)) - return true; - } - return false; - } - ] - ] - }, - '!': [ - BooleanType, - [BooleanType], - (ctx, [b]) => !b.evaluate(ctx) - ], - 'is-supported-script': [ - BooleanType, - [StringType], - // At parse time this will always return true, so we need to exclude this expression with isGlobalPropertyConstant - (ctx, [s]) => { - const isSupportedScript = ctx.globals && ctx.globals.isSupportedScript; - if (isSupportedScript) { - return isSupportedScript(s.evaluate(ctx)); - } - return true; + } + + /** + * Resets the the length of the array to 0 without de-allocating capcacity. + */ + 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. + */ + resize(n ) { + assert_1(!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. + */ + 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); + + const oldUint8Array = this.uint8; + this._refreshViews(); + if (oldUint8Array) this.uint8.set(oldUint8Array); } - ], - 'upcase': [ - StringType, - [StringType], - (ctx, [s]) => s.evaluate(ctx).toUpperCase() - ], - 'downcase': [ - StringType, - [StringType], - (ctx, [s]) => s.evaluate(ctx).toLowerCase() - ], - 'concat': [ - StringType, - varargs(ValueType), - (ctx, args) => args.map(arg => toString$1(arg.evaluate(ctx))).join('') - ], - 'resolved-locale': [ - StringType, - [CollatorType], - (ctx, [collator]) => collator.evaluate(ctx).resolvedLocale() - ] -}); + } + + /** + * Create TypedArray views for the current ArrayBuffer. + */ + _refreshViews() { + throw new Error('_refreshViews() must be implemented by each concrete StructArray layout'); + } + + destroy() { + // $FlowFixMe + this.int8 = this.uint8 = this.int16 = this.uint16 = this.int32 = this.uint32 = this.float32 = null; + this.arrayBuffer = (null ); + } +} + +/** + * 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 = 1 +) { + + let offset = 0; + let maxSize = 0; + const layoutMembers = members.map((member) => { + assert_1(member.name.length); + const typeSize = sizeOf(member.type); + const memberOffset = offset = align$1(offset, Math.max(alignment, typeSize)); + const components = member.components || 1; + + maxSize = Math.max(maxSize, typeSize); + offset += typeSize * components; + + return { + name: member.name, + type: member.type, + components, + offset: memberOffset, + }; + }); + + const size = align$1(offset, Math.max(maxSize, alignment)); + + return { + members: layoutMembers, + size, + alignment + }; +} + +function sizeOf(type ) { + return viewTypes[type].BYTES_PER_ELEMENT; +} + +function align$1(offset , size ) { + return Math.ceil(offset / size) * size; +} + +// This file is generated. Edit build/generate-struct-arrays.js, then run `yarn run codegen`. + +/** + * Implementation of the StructArray layout: + * [0]: Int16[2] + * + * @private + */ +class StructArrayLayout2i4 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1); + } + + emplace(i , v0 , v1 ) { + const o2 = i * 2; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + return i; + } +} + +StructArrayLayout2i4.prototype.bytesPerElement = 4; +register(StructArrayLayout2i4, 'StructArrayLayout2i4'); + +/** + * Implementation of the StructArray layout: + * [0]: Int16[3] + * + * @private + */ +class StructArrayLayout3i6 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2); + } + + emplace(i , v0 , v1 , v2 ) { + const o2 = i * 3; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.int16[o2 + 2] = v2; + return i; + } +} + +StructArrayLayout3i6.prototype.bytesPerElement = 6; +register(StructArrayLayout3i6, 'StructArrayLayout3i6'); + +/** + * Implementation of the StructArray layout: + * [0]: Int16[4] + * + * @private + */ +class StructArrayLayout4i8 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3); + } + + emplace(i , v0 , v1 , v2 , v3 ) { + const 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; + } +} + +StructArrayLayout4i8.prototype.bytesPerElement = 8; +register(StructArrayLayout4i8, 'StructArrayLayout4i8'); + +/** + * Implementation of the StructArray layout: + * [0]: Int16[2] + * [4]: Uint8[4] + * [8]: Float32[1] + * + * @private + */ +class StructArrayLayout2i4ub1f12 extends StructArray { + + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { + const o2 = i * 6; + const o1 = i * 12; + const o4 = i * 3; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.uint8[o1 + 4] = v2; + this.uint8[o1 + 5] = v3; + this.uint8[o1 + 6] = v4; + this.uint8[o1 + 7] = v5; + this.float32[o4 + 2] = v6; + return i; + } +} + +StructArrayLayout2i4ub1f12.prototype.bytesPerElement = 12; +register(StructArrayLayout2i4ub1f12, 'StructArrayLayout2i4ub1f12'); + +/** + * Implementation of the StructArray layout: + * [0]: Float32[4] + * + * @private + */ +class StructArrayLayout4f16 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3); + } + + emplace(i , v0 , v1 , v2 , v3 ) { + const 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; + } +} + +StructArrayLayout4f16.prototype.bytesPerElement = 16; +register(StructArrayLayout4f16, 'StructArrayLayout4f16'); + +/** + * Implementation of the StructArray layout: + * [0]: Uint16[10] + * + * @private + */ +class StructArrayLayout10ui20 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 ) { + const o2 = i * 10; + this.uint16[o2 + 0] = v0; + this.uint16[o2 + 1] = v1; + this.uint16[o2 + 2] = v2; + this.uint16[o2 + 3] = v3; + this.uint16[o2 + 4] = v4; + this.uint16[o2 + 5] = v5; + this.uint16[o2 + 6] = v6; + this.uint16[o2 + 7] = v7; + this.uint16[o2 + 8] = v8; + this.uint16[o2 + 9] = v9; + return i; + } +} + +StructArrayLayout10ui20.prototype.bytesPerElement = 20; +register(StructArrayLayout10ui20, 'StructArrayLayout10ui20'); + +/** + * Implementation of the StructArray layout: + * [0]: Uint16[8] + * + * @private + */ +class StructArrayLayout8ui16 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { + const o2 = i * 8; + this.uint16[o2 + 0] = v0; + this.uint16[o2 + 1] = v1; + this.uint16[o2 + 2] = v2; + this.uint16[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; + } +} + +StructArrayLayout8ui16.prototype.bytesPerElement = 16; +register(StructArrayLayout8ui16, 'StructArrayLayout8ui16'); + +/** + * Implementation of the StructArray layout: + * [0]: Int16[6] + * + * @private + */ +class StructArrayLayout6i12 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 , v5 ) { + const 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; + } +} + +StructArrayLayout6i12.prototype.bytesPerElement = 12; +register(StructArrayLayout6i12, 'StructArrayLayout6i12'); + +/** + * Implementation of the StructArray layout: + * [0]: Int16[4] + * [8]: Uint16[4] + * [16]: Int16[4] + * + * @private + */ +class StructArrayLayout4i4ui4i24 extends StructArray { + + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 ) { + const o2 = i * 12; + 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; + this.int16[o2 + 8] = v8; + this.int16[o2 + 9] = v9; + this.int16[o2 + 10] = v10; + this.int16[o2 + 11] = v11; + return i; + } +} + +StructArrayLayout4i4ui4i24.prototype.bytesPerElement = 24; +register(StructArrayLayout4i4ui4i24, 'StructArrayLayout4i4ui4i24'); + +/** + * Implementation of the StructArray layout: + * [0]: Int16[3] + * [8]: Float32[3] + * + * @private + */ +class StructArrayLayout3i3f20 extends StructArray { + + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 , v5 ) { + const o2 = i * 10; + const o4 = i * 5; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.int16[o2 + 2] = v2; + this.float32[o4 + 2] = v3; + this.float32[o4 + 3] = v4; + this.float32[o4 + 4] = v5; + return i; + } +} + +StructArrayLayout3i3f20.prototype.bytesPerElement = 20; +register(StructArrayLayout3i3f20, 'StructArrayLayout3i3f20'); + +/** + * Implementation of the StructArray layout: + * [0]: Uint32[1] + * + * @private + */ +class StructArrayLayout1ul4 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint32 = new Uint32Array(this.arrayBuffer); + } + + emplaceBack(v0 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0); + } + + emplace(i , v0 ) { + const o4 = i * 1; + this.uint32[o4 + 0] = v0; + return i; + } +} + +StructArrayLayout1ul4.prototype.bytesPerElement = 4; +register(StructArrayLayout1ul4, 'StructArrayLayout1ul4'); + +/** + * Implementation of the StructArray layout: + * [0]: Int16[5] + * [12]: Float32[4] + * [28]: Int16[1] + * [32]: Uint32[1] + * [36]: Uint16[2] + * + * @private + */ +class StructArrayLayout5i4f1i1ul2ui40 extends StructArray { + + + + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + this.uint32 = new Uint32Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 ) { + const o2 = i * 20; + const o4 = i * 10; + 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.float32[o4 + 3] = v5; + this.float32[o4 + 4] = v6; + this.float32[o4 + 5] = v7; + this.float32[o4 + 6] = v8; + this.int16[o2 + 14] = v9; + this.uint32[o4 + 8] = v10; + this.uint16[o2 + 18] = v11; + this.uint16[o2 + 19] = v12; + return i; + } +} + +StructArrayLayout5i4f1i1ul2ui40.prototype.bytesPerElement = 40; +register(StructArrayLayout5i4f1i1ul2ui40, 'StructArrayLayout5i4f1i1ul2ui40'); + +/** + * Implementation of the StructArray layout: + * [0]: Int16[3] + * [8]: Int16[2] + * [12]: Int16[2] + * + * @private + */ +class StructArrayLayout3i2i2i16 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { + const o2 = i * 8; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.int16[o2 + 2] = v2; + this.int16[o2 + 4] = v3; + this.int16[o2 + 5] = v4; + this.int16[o2 + 6] = v5; + this.int16[o2 + 7] = v6; + return i; + } +} + +StructArrayLayout3i2i2i16.prototype.bytesPerElement = 16; +register(StructArrayLayout3i2i2i16, 'StructArrayLayout3i2i2i16'); + +/** + * Implementation of the StructArray layout: + * [0]: Float32[2] + * [8]: Float32[1] + * [12]: Int16[2] + * + * @private + */ +class StructArrayLayout2f1f2i16 extends StructArray { + + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 ) { + const o4 = i * 4; + const o2 = i * 8; + this.float32[o4 + 0] = v0; + this.float32[o4 + 1] = v1; + this.float32[o4 + 2] = v2; + this.int16[o2 + 6] = v3; + this.int16[o2 + 7] = v4; + return i; + } +} + +StructArrayLayout2f1f2i16.prototype.bytesPerElement = 16; +register(StructArrayLayout2f1f2i16, 'StructArrayLayout2f1f2i16'); + +/** + * Implementation of the StructArray layout: + * [0]: Uint8[2] + * [4]: Float32[2] + * + * @private + */ +class StructArrayLayout2ub2f12 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3); + } + + emplace(i , v0 , v1 , v2 , v3 ) { + const o1 = i * 12; + const o4 = i * 3; + this.uint8[o1 + 0] = v0; + this.uint8[o1 + 1] = v1; + this.float32[o4 + 1] = v2; + this.float32[o4 + 2] = v3; + return i; + } +} + +StructArrayLayout2ub2f12.prototype.bytesPerElement = 12; +register(StructArrayLayout2ub2f12, 'StructArrayLayout2ub2f12'); + +/** + * Implementation of the StructArray layout: + * [0]: Float32[3] + * + * @private + */ +class StructArrayLayout3f12 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2); + } + + emplace(i , v0 , v1 , v2 ) { + const o4 = i * 3; + this.float32[o4 + 0] = v0; + this.float32[o4 + 1] = v1; + this.float32[o4 + 2] = v2; + return i; + } +} + +StructArrayLayout3f12.prototype.bytesPerElement = 12; +register(StructArrayLayout3f12, 'StructArrayLayout3f12'); + +/** + * Implementation of the StructArray layout: + * [0]: Uint16[3] + * + * @private + */ +class StructArrayLayout3ui6 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2); + } + + emplace(i , v0 , v1 , v2 ) { + const o2 = i * 3; + this.uint16[o2 + 0] = v0; + this.uint16[o2 + 1] = v1; + this.uint16[o2 + 2] = v2; + return i; + } +} + +StructArrayLayout3ui6.prototype.bytesPerElement = 6; +register(StructArrayLayout3ui6, 'StructArrayLayout3ui6'); + +/** + * Implementation of the StructArray layout: + * [0]: Int16[3] + * [8]: Float32[2] + * [16]: Uint16[2] + * [20]: Uint32[3] + * [32]: Uint16[3] + * [40]: Float32[2] + * [48]: Uint8[3] + * [52]: Uint32[1] + * [56]: Int16[1] + * [58]: Uint8[1] + * + * @private + */ +class StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60 extends StructArray { + + + + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + this.uint32 = new Uint32Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 , v20 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 , v20 ) { + const o2 = i * 30; + const o4 = i * 15; + const o1 = i * 60; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.int16[o2 + 2] = v2; + this.float32[o4 + 2] = v3; + this.float32[o4 + 3] = v4; + this.uint16[o2 + 8] = v5; + this.uint16[o2 + 9] = v6; + this.uint32[o4 + 5] = v7; + this.uint32[o4 + 6] = v8; + this.uint32[o4 + 7] = v9; + this.uint16[o2 + 16] = v10; + this.uint16[o2 + 17] = v11; + this.uint16[o2 + 18] = v12; + this.float32[o4 + 10] = v13; + this.float32[o4 + 11] = v14; + this.uint8[o1 + 48] = v15; + this.uint8[o1 + 49] = v16; + this.uint8[o1 + 50] = v17; + this.uint32[o4 + 13] = v18; + this.int16[o2 + 28] = v19; + this.uint8[o1 + 58] = v20; + return i; + } +} + +StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60.prototype.bytesPerElement = 60; +register(StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60, 'StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60'); + +/** + * Implementation of the StructArray layout: + * [0]: Int16[3] + * [8]: Float32[2] + * [16]: Int16[6] + * [28]: Uint16[15] + * [60]: Uint32[1] + * [64]: Float32[3] + * + * @private + */ +class StructArrayLayout3i2f6i15ui1ul3f76 extends StructArray { + + + + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.int16 = new Int16Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + this.uint32 = new Uint32Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 , v20 , v21 , v22 , v23 , v24 , v25 , v26 , v27 , v28 , v29 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 , v20 , v21 , v22 , v23 , v24 , v25 , v26 , v27 , v28 , v29 ) { + const o2 = i * 38; + const o4 = i * 19; + this.int16[o2 + 0] = v0; + this.int16[o2 + 1] = v1; + this.int16[o2 + 2] = v2; + this.float32[o4 + 2] = v3; + this.float32[o4 + 3] = v4; + this.int16[o2 + 8] = v5; + this.int16[o2 + 9] = v6; + this.int16[o2 + 10] = v7; + this.int16[o2 + 11] = v8; + this.int16[o2 + 12] = v9; + this.int16[o2 + 13] = v10; + this.uint16[o2 + 14] = v11; + this.uint16[o2 + 15] = v12; + this.uint16[o2 + 16] = v13; + this.uint16[o2 + 17] = v14; + this.uint16[o2 + 18] = v15; + this.uint16[o2 + 19] = v16; + this.uint16[o2 + 20] = v17; + this.uint16[o2 + 21] = v18; + this.uint16[o2 + 22] = v19; + this.uint16[o2 + 23] = v20; + this.uint16[o2 + 24] = v21; + this.uint16[o2 + 25] = v22; + this.uint16[o2 + 26] = v23; + this.uint16[o2 + 27] = v24; + this.uint16[o2 + 28] = v25; + this.uint32[o4 + 15] = v26; + this.float32[o4 + 16] = v27; + this.float32[o4 + 17] = v28; + this.float32[o4 + 18] = v29; + return i; + } +} + +StructArrayLayout3i2f6i15ui1ul3f76.prototype.bytesPerElement = 76; +register(StructArrayLayout3i2f6i15ui1ul3f76, 'StructArrayLayout3i2f6i15ui1ul3f76'); + +/** + * Implementation of the StructArray layout: + * [0]: Float32[1] + * + * @private + */ +class StructArrayLayout1f4 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + + emplaceBack(v0 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0); + } + + emplace(i , v0 ) { + const o4 = i * 1; + this.float32[o4 + 0] = v0; + return i; + } +} + +StructArrayLayout1f4.prototype.bytesPerElement = 4; +register(StructArrayLayout1f4, 'StructArrayLayout1f4'); + +/** + * Implementation of the StructArray layout: + * [0]: Float32[7] + * + * @private + */ +class StructArrayLayout7f28 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } -// + emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4, v5, v6); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { + const o4 = i * 7; + this.float32[o4 + 0] = v0; + this.float32[o4 + 1] = v1; + this.float32[o4 + 2] = v2; + this.float32[o4 + 3] = v3; + this.float32[o4 + 4] = v4; + this.float32[o4 + 5] = v5; + this.float32[o4 + 6] = v6; + return i; + } +} + +StructArrayLayout7f28.prototype.bytesPerElement = 28; +register(StructArrayLayout7f28, 'StructArrayLayout7f28'); /** - * 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. + * Implementation of the StructArray layout: + * [0]: Float32[5] + * * @private */ +class StructArrayLayout5f20 extends StructArray { + - - -function success (value ) { - return {result: 'success', value}; + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 , v4 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3, v4); + } + + emplace(i , v0 , v1 , v2 , v3 , v4 ) { + const o4 = i * 5; + this.float32[o4 + 0] = v0; + this.float32[o4 + 1] = v1; + this.float32[o4 + 2] = v2; + this.float32[o4 + 3] = v3; + this.float32[o4 + 4] = v4; + return i; + } } -function error (value ) { - return {result: 'error', value}; +StructArrayLayout5f20.prototype.bytesPerElement = 20; +register(StructArrayLayout5f20, 'StructArrayLayout5f20'); + +/** + * Implementation of the StructArray layout: + * [0]: Uint32[1] + * [4]: Uint16[3] + * + * @private + */ +class StructArrayLayout1ul3ui12 extends StructArray { + + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint32 = new Uint32Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 , v2 , v3 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1, v2, v3); + } + + emplace(i , v0 , v1 , v2 , v3 ) { + const o4 = i * 3; + const o2 = i * 6; + this.uint32[o4 + 0] = v0; + this.uint16[o2 + 2] = v1; + this.uint16[o2 + 3] = v2; + this.uint16[o2 + 4] = v3; + return i; + } } -// +StructArrayLayout1ul3ui12.prototype.bytesPerElement = 12; +register(StructArrayLayout1ul3ui12, 'StructArrayLayout1ul3ui12'); - +/** + * Implementation of the StructArray layout: + * [0]: Uint16[2] + * + * @private + */ +class StructArrayLayout2ui4 extends StructArray { + + -function supportsPropertyExpression(spec ) { - return spec['property-type'] === 'data-driven' || spec['property-type'] === 'cross-faded-data-driven'; + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1); + } + + emplace(i , v0 , v1 ) { + const o2 = i * 2; + this.uint16[o2 + 0] = v0; + this.uint16[o2 + 1] = v1; + return i; + } } -function supportsZoomExpression(spec ) { - return !!spec.expression && spec.expression.parameters.indexOf('zoom') > -1; +StructArrayLayout2ui4.prototype.bytesPerElement = 4; +register(StructArrayLayout2ui4, 'StructArrayLayout2ui4'); + +/** + * Implementation of the StructArray layout: + * [0]: Uint16[1] + * + * @private + */ +class StructArrayLayout1ui2 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.uint16 = new Uint16Array(this.arrayBuffer); + } + + emplaceBack(v0 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0); + } + + emplace(i , v0 ) { + const o2 = i * 1; + this.uint16[o2 + 0] = v0; + return i; + } } -function supportsInterpolation(spec ) { - return !!spec.expression && spec.expression.interpolated; +StructArrayLayout1ui2.prototype.bytesPerElement = 2; +register(StructArrayLayout1ui2, 'StructArrayLayout1ui2'); + +/** + * Implementation of the StructArray layout: + * [0]: Float32[2] + * + * @private + */ +class StructArrayLayout2f8 extends StructArray { + + + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + + emplaceBack(v0 , v1 ) { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1); + } + + emplace(i , v0 , v1 ) { + const o4 = i * 2; + this.float32[o4 + 0] = v0; + this.float32[o4 + 1] = v1; + return i; + } } -// +StructArrayLayout2f8.prototype.bytesPerElement = 8; +register(StructArrayLayout2f8, 'StructArrayLayout2f8'); -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; +class FillExtrusionExtStruct extends Struct { + + get a_pos_30() { return this._structArray.int16[this._pos2 + 0]; } + get a_pos_31() { return this._structArray.int16[this._pos2 + 1]; } + get a_pos_32() { return this._structArray.int16[this._pos2 + 2]; } + get a_pos_normal_30() { return this._structArray.int16[this._pos2 + 3]; } + get a_pos_normal_31() { return this._structArray.int16[this._pos2 + 4]; } + get a_pos_normal_32() { return this._structArray.int16[this._pos2 + 5]; } +} + +FillExtrusionExtStruct.prototype.size = 12; + + + +/** + * @private + */ +class FillExtrusionExtArray extends StructArrayLayout6i12 { + /** + * Return the FillExtrusionExtStruct at the given location in the array. + * @param {number} index The index of the element. + * @private + */ + get(index ) { + assert_1(!this.isTransferred); + return new FillExtrusionExtStruct(this, index); } } -function isFunction(value) { - return typeof value === 'object' && value !== null && !Array.isArray(value); +register(FillExtrusionExtArray, 'FillExtrusionExtArray'); + +class CollisionBoxStruct extends Struct { + + get projectedAnchorX() { return this._structArray.int16[this._pos2 + 0]; } + get projectedAnchorY() { return this._structArray.int16[this._pos2 + 1]; } + get projectedAnchorZ() { return this._structArray.int16[this._pos2 + 2]; } + get tileAnchorX() { return this._structArray.int16[this._pos2 + 3]; } + get tileAnchorY() { return this._structArray.int16[this._pos2 + 4]; } + get x1() { return this._structArray.float32[this._pos4 + 3]; } + get y1() { return this._structArray.float32[this._pos4 + 4]; } + get x2() { return this._structArray.float32[this._pos4 + 5]; } + get y2() { return this._structArray.float32[this._pos4 + 6]; } + get padding() { return this._structArray.int16[this._pos2 + 14]; } + get featureIndex() { return this._structArray.uint32[this._pos4 + 8]; } + get sourceLayerIndex() { return this._structArray.uint16[this._pos2 + 18]; } + get bucketIndex() { return this._structArray.uint16[this._pos2 + 19]; } } -function identityFunction(x) { - return x; +CollisionBoxStruct.prototype.size = 40; + + + +/** + * @private + */ +class CollisionBoxArray extends StructArrayLayout5i4f1i1ul2ui40 { + /** + * Return the CollisionBoxStruct at the given location in the array. + * @param {number} index The index of the element. + * @private + */ + get(index ) { + assert_1(!this.isTransferred); + return new CollisionBoxStruct(this, index); + } } -function createFunction(parameters, propertySpec) { - const isColor = propertySpec.type === 'color'; - const zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object'; - const featureDependent = zoomAndFeatureDependent || parameters.property !== undefined; - const zoomDependent = zoomAndFeatureDependent || !featureDependent; - const type = parameters.type || (supportsInterpolation(propertySpec) ? 'exponential' : 'interval'); +register(CollisionBoxArray, 'CollisionBoxArray'); - if (isColor) { - parameters = extend$1({}, parameters); +class PlacedSymbolStruct extends Struct { + + get projectedAnchorX() { return this._structArray.int16[this._pos2 + 0]; } + get projectedAnchorY() { return this._structArray.int16[this._pos2 + 1]; } + get projectedAnchorZ() { return this._structArray.int16[this._pos2 + 2]; } + get tileAnchorX() { return this._structArray.float32[this._pos4 + 2]; } + get tileAnchorY() { return this._structArray.float32[this._pos4 + 3]; } + get glyphStartIndex() { return this._structArray.uint16[this._pos2 + 8]; } + get numGlyphs() { return this._structArray.uint16[this._pos2 + 9]; } + get vertexStartIndex() { return this._structArray.uint32[this._pos4 + 5]; } + get lineStartIndex() { return this._structArray.uint32[this._pos4 + 6]; } + get lineLength() { return this._structArray.uint32[this._pos4 + 7]; } + get segment() { return this._structArray.uint16[this._pos2 + 16]; } + get lowerSize() { return this._structArray.uint16[this._pos2 + 17]; } + get upperSize() { return this._structArray.uint16[this._pos2 + 18]; } + get lineOffsetX() { return this._structArray.float32[this._pos4 + 10]; } + get lineOffsetY() { return this._structArray.float32[this._pos4 + 11]; } + get writingMode() { return this._structArray.uint8[this._pos1 + 48]; } + get placedOrientation() { return this._structArray.uint8[this._pos1 + 49]; } + set placedOrientation(x ) { this._structArray.uint8[this._pos1 + 49] = x; } + get hidden() { return this._structArray.uint8[this._pos1 + 50]; } + set hidden(x ) { this._structArray.uint8[this._pos1 + 50] = x; } + get crossTileID() { return this._structArray.uint32[this._pos4 + 13]; } + set crossTileID(x ) { this._structArray.uint32[this._pos4 + 13] = x; } + get associatedIconIndex() { return this._structArray.int16[this._pos2 + 28]; } + get flipState() { return this._structArray.uint8[this._pos1 + 58]; } + set flipState(x ) { this._structArray.uint8[this._pos1 + 58] = x; } +} - if (parameters.stops) { - parameters.stops = parameters.stops.map((stop) => { - return [stop[0], Color.parse(stop[1])]; - }); - } +PlacedSymbolStruct.prototype.size = 60; - if (parameters.default) { - parameters.default = Color.parse(parameters.default); - } else { - parameters.default = Color.parse(propertySpec.default); - } + + +/** + * @private + */ +class PlacedSymbolArray extends StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60 { + /** + * Return the PlacedSymbolStruct at the given location in the array. + * @param {number} index The index of the element. + * @private + */ + get(index ) { + assert_1(!this.isTransferred); + return new PlacedSymbolStruct(this, index); } +} - if (parameters.colorSpace && parameters.colorSpace !== 'rgb' && !colorSpaces[parameters.colorSpace]) { // eslint-disable-line import/namespace - throw new Error(`Unknown color space: ${parameters.colorSpace}`); +register(PlacedSymbolArray, 'PlacedSymbolArray'); + +class SymbolInstanceStruct extends Struct { + + get projectedAnchorX() { return this._structArray.int16[this._pos2 + 0]; } + get projectedAnchorY() { return this._structArray.int16[this._pos2 + 1]; } + get projectedAnchorZ() { return this._structArray.int16[this._pos2 + 2]; } + get tileAnchorX() { return this._structArray.float32[this._pos4 + 2]; } + get tileAnchorY() { return this._structArray.float32[this._pos4 + 3]; } + get rightJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 8]; } + get centerJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 9]; } + get leftJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 10]; } + get verticalPlacedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 11]; } + get placedIconSymbolIndex() { return this._structArray.int16[this._pos2 + 12]; } + get verticalPlacedIconSymbolIndex() { return this._structArray.int16[this._pos2 + 13]; } + get key() { return this._structArray.uint16[this._pos2 + 14]; } + get textBoxStartIndex() { return this._structArray.uint16[this._pos2 + 15]; } + get textBoxEndIndex() { return this._structArray.uint16[this._pos2 + 16]; } + get verticalTextBoxStartIndex() { return this._structArray.uint16[this._pos2 + 17]; } + get verticalTextBoxEndIndex() { return this._structArray.uint16[this._pos2 + 18]; } + get iconBoxStartIndex() { return this._structArray.uint16[this._pos2 + 19]; } + get iconBoxEndIndex() { return this._structArray.uint16[this._pos2 + 20]; } + get verticalIconBoxStartIndex() { return this._structArray.uint16[this._pos2 + 21]; } + get verticalIconBoxEndIndex() { return this._structArray.uint16[this._pos2 + 22]; } + get featureIndex() { return this._structArray.uint16[this._pos2 + 23]; } + get numHorizontalGlyphVertices() { return this._structArray.uint16[this._pos2 + 24]; } + get numVerticalGlyphVertices() { return this._structArray.uint16[this._pos2 + 25]; } + get numIconVertices() { return this._structArray.uint16[this._pos2 + 26]; } + get numVerticalIconVertices() { return this._structArray.uint16[this._pos2 + 27]; } + get useRuntimeCollisionCircles() { return this._structArray.uint16[this._pos2 + 28]; } + get crossTileID() { return this._structArray.uint32[this._pos4 + 15]; } + set crossTileID(x ) { this._structArray.uint32[this._pos4 + 15] = x; } + get textOffset0() { return this._structArray.float32[this._pos4 + 16]; } + get textOffset1() { return this._structArray.float32[this._pos4 + 17]; } + get collisionCircleDiameter() { return this._structArray.float32[this._pos4 + 18]; } +} + +SymbolInstanceStruct.prototype.size = 76; + + + +/** + * @private + */ +class SymbolInstanceArray extends StructArrayLayout3i2f6i15ui1ul3f76 { + /** + * Return the SymbolInstanceStruct at the given location in the array. + * @param {number} index The index of the element. + * @private + */ + get(index ) { + assert_1(!this.isTransferred); + return new SymbolInstanceStruct(this, index); } +} - let innerFun; - let hashedStops; - let categoricalKeyType; - if (type === 'exponential') { - innerFun = evaluateExponentialFunction; - } else if (type === 'interval') { - innerFun = evaluateIntervalFunction; - } else if (type === 'categorical') { - innerFun = evaluateCategoricalFunction; +register(SymbolInstanceArray, 'SymbolInstanceArray'); - // For categorical functions, generate an Object as a hashmap of the stops for fast searching - hashedStops = Object.create(null); - for (const stop of parameters.stops) { - hashedStops[stop[0]] = stop[1]; - } +/** + * @private + */ +class GlyphOffsetArray extends StructArrayLayout1f4 { + getoffsetX(index ) { return this.float32[index * 1 + 0]; } +} - // Infer key type based on first stop key-- used to encforce strict type checking later - categoricalKeyType = typeof parameters.stops[0][0]; +register(GlyphOffsetArray, 'GlyphOffsetArray'); - } else if (type === 'identity') { - innerFun = evaluateIdentityFunction; - } else { - throw new Error(`Unknown function type "${type}"`); +/** + * @private + */ +class SymbolLineVertexArray extends StructArrayLayout3i6 { + getx(index ) { return this.int16[index * 3 + 0]; } + gety(index ) { return this.int16[index * 3 + 1]; } + gettileUnitDistanceFromAnchor(index ) { return this.int16[index * 3 + 2]; } +} + +register(SymbolLineVertexArray, 'SymbolLineVertexArray'); + +class FeatureIndexStruct extends Struct { + + get featureIndex() { return this._structArray.uint32[this._pos4 + 0]; } + get sourceLayerIndex() { return this._structArray.uint16[this._pos2 + 2]; } + get bucketIndex() { return this._structArray.uint16[this._pos2 + 3]; } + get layoutVertexArrayOffset() { return this._structArray.uint16[this._pos2 + 4]; } +} + +FeatureIndexStruct.prototype.size = 12; + + + +/** + * @private + */ +class FeatureIndexArray extends StructArrayLayout1ul3ui12 { + /** + * Return the FeatureIndexStruct at the given location in the array. + * @param {number} index The index of the element. + * @private + */ + get(index ) { + assert_1(!this.isTransferred); + return new FeatureIndexStruct(this, index); } +} - if (zoomAndFeatureDependent) { - const featureFunctions = {}; - const zoomStops = []; - for (let s = 0; s < parameters.stops.length; s++) { - const stop = parameters.stops[s]; - const zoom = stop[0].zoom; - if (featureFunctions[zoom] === undefined) { - featureFunctions[zoom] = { - zoom, - type: parameters.type, - property: parameters.property, - default: parameters.default, - stops: [] - }; - zoomStops.push(zoom); - } - featureFunctions[zoom].stops.push([stop[0].value, stop[1]]); - } +register(FeatureIndexArray, 'FeatureIndexArray'); - const featureFunctionStops = []; - for (const z of zoomStops) { - featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z], propertySpec)]); - } +class FillExtrusionCentroidStruct extends Struct { + + get a_centroid_pos0() { return this._structArray.uint16[this._pos2 + 0]; } + get a_centroid_pos1() { return this._structArray.uint16[this._pos2 + 1]; } +} - const interpolationType = {name: 'linear'}; - return { - kind: 'composite', - interpolationType, - interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType), - zoomStops: featureFunctionStops.map(s => s[0]), - evaluate({zoom}, properties) { - return evaluateExponentialFunction({ - stops: featureFunctionStops, - base: parameters.base - }, propertySpec, zoom).evaluate(zoom, properties); - } - }; - } else if (zoomDependent) { - const interpolationType = type === 'exponential' ? - {name: 'exponential', base: parameters.base !== undefined ? parameters.base : 1} : null; - return { - kind: 'camera', - interpolationType, - interpolationFactor: Interpolate.interpolationFactor.bind(undefined, interpolationType), - zoomStops: parameters.stops.map(s => s[0]), - evaluate: ({zoom}) => innerFun(parameters, propertySpec, zoom, hashedStops, categoricalKeyType) - }; - } else { - return { - kind: 'source', - evaluate(_, feature) { - const 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); - } - }; +FillExtrusionCentroidStruct.prototype.size = 4; + + + +/** + * @private + */ +class FillExtrusionCentroidArray extends StructArrayLayout2ui4 { + /** + * Return the FillExtrusionCentroidStruct at the given location in the array. + * @param {number} index The index of the element. + * @private + */ + get(index ) { + assert_1(!this.isTransferred); + return new FillExtrusionCentroidStruct(this, index); } } -function coalesce(a, b, c) { - if (a !== undefined) return a; - if (b !== undefined) return b; - if (c !== undefined) return c; +register(FillExtrusionCentroidArray, 'FillExtrusionCentroidArray'); + +class CircleGlobeExtStruct extends Struct { + + get a_pos_30() { return this._structArray.int16[this._pos2 + 0]; } + get a_pos_31() { return this._structArray.int16[this._pos2 + 1]; } + get a_pos_32() { return this._structArray.int16[this._pos2 + 2]; } + get a_pos_normal_30() { return this._structArray.int16[this._pos2 + 3]; } + get a_pos_normal_31() { return this._structArray.int16[this._pos2 + 4]; } + get a_pos_normal_32() { return this._structArray.int16[this._pos2 + 5]; } } -function evaluateCategoricalFunction(parameters, propertySpec, input, hashedStops, keyType) { - const evaluated = typeof input === keyType ? hashedStops[input] : undefined; // Enforce strict typing on input - return coalesce(evaluated, parameters.default, propertySpec.default); +CircleGlobeExtStruct.prototype.size = 12; + + + +/** + * @private + */ +class CircleGlobeExtArray extends StructArrayLayout6i12 { + /** + * Return the CircleGlobeExtStruct at the given location in the array. + * @param {number} index The index of the element. + * @private + */ + get(index ) { + assert_1(!this.isTransferred); + return new CircleGlobeExtStruct(this, index); + } } -function evaluateIntervalFunction(parameters, propertySpec, input) { - // Edge cases - if (getType(input) !== 'number') return coalesce(parameters.default, propertySpec.default); - const 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]; +register(CircleGlobeExtArray, 'CircleGlobeExtArray'); + +// + + + +const patternAttributes = createLayout([ + // [tl.x, tl.y, br.x, br.y] + {name: 'a_pattern_to', components: 4, type: 'Uint16'}, + {name: 'a_pattern_from', components: 4, type: 'Uint16'}, + {name: 'a_pixel_ratio_to', components: 1, type: 'Uint16'}, + {name: 'a_pixel_ratio_from', components: 1, type: 'Uint16'}, +]); + +// + + + +const dashAttributes = createLayout([ + {name: 'a_dash_to', components: 4, type: 'Uint16'}, // [x, y, width, unused] + {name: 'a_dash_from', components: 4, type: 'Uint16'} +]); + +/** + * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011) + * + * @author Gary Court + * @see http://github.com/garycourt/murmurhash-js + * @author Austin Appleby + * @see http://sites.google.com/site/murmurhash/ + * + * @param {string} key ASCII only + * @param {number} seed Positive integer only + * @return {number} 32-bit positive integer hash + */ + +var murmurhash3_gc = createCommonjsModule(function (module) { +function murmurhash3_32_gc(key, seed) { + var remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i; + + remainder = key.length & 3; // key.length % 4 + bytes = key.length - remainder; + h1 = seed; + c1 = 0xcc9e2d51; + c2 = 0x1b873593; + i = 0; + + while (i < bytes) { + k1 = + ((key.charCodeAt(i) & 0xff)) | + ((key.charCodeAt(++i) & 0xff) << 8) | + ((key.charCodeAt(++i) & 0xff) << 16) | + ((key.charCodeAt(++i) & 0xff) << 24); + ++i; + + k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff; + + h1 ^= k1; + h1 = (h1 << 13) | (h1 >>> 19); + h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff; + h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16)); + } + + k1 = 0; + + switch (remainder) { + case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; + case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; + case 1: k1 ^= (key.charCodeAt(i) & 0xff); + + k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; + h1 ^= k1; + } + + h1 ^= key.length; - const index = findStopLessThanOrEqualTo(parameters.stops.map((stop) => stop[0]), input); + h1 ^= h1 >>> 16; + h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff; + h1 ^= h1 >>> 13; + h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff; + h1 ^= h1 >>> 16; - return parameters.stops[index][1]; + return h1 >>> 0; } -function evaluateExponentialFunction(parameters, propertySpec, input) { - const base = parameters.base !== undefined ? parameters.base : 1; +if('object' !== "undefined") { + module.exports = murmurhash3_32_gc; +} +}); - // Edge cases - if (getType(input) !== 'number') return coalesce(parameters.default, propertySpec.default); - const 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]; +/** + * JS Implementation of MurmurHash2 + * + * @author Gary Court + * @see http://github.com/garycourt/murmurhash-js + * @author Austin Appleby + * @see http://sites.google.com/site/murmurhash/ + * + * @param {string} str ASCII only + * @param {number} seed Positive integer only + * @return {number} 32-bit positive integer hash + */ - const index = findStopLessThanOrEqualTo(parameters.stops.map((stop) => stop[0]), input); - const t = interpolationFactor( - input, base, - parameters.stops[index][0], - parameters.stops[index + 1][0]); +var murmurhash2_gc = createCommonjsModule(function (module) { +function murmurhash2_32_gc(str, seed) { + var + l = str.length, + h = seed ^ l, + i = 0, + k; + + while (l >= 4) { + k = + ((str.charCodeAt(i) & 0xff)) | + ((str.charCodeAt(++i) & 0xff) << 8) | + ((str.charCodeAt(++i) & 0xff) << 16) | + ((str.charCodeAt(++i) & 0xff) << 24); + + k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)); + k ^= k >>> 24; + k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)); - const outputLower = parameters.stops[index][1]; - const outputUpper = parameters.stops[index + 1][1]; - let interp = interpolate[propertySpec.type] || identityFunction; // eslint-disable-line import/namespace + h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k; - if (parameters.colorSpace && parameters.colorSpace !== 'rgb') { - const colorspace = colorSpaces[parameters.colorSpace]; // eslint-disable-line import/namespace - interp = (a, b) => colorspace.reverse(colorspace.interpolate(colorspace.forward(a), colorspace.forward(b), t)); - } + l -= 4; + ++i; + } + + switch (l) { + case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16; + case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8; + case 1: h ^= (str.charCodeAt(i) & 0xff); + h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)); + } - if (typeof outputLower.evaluate === 'function') { - return { - evaluate(...args) { - const evaluatedLower = outputLower.evaluate.apply(undefined, args); - const 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); - } - }; - } + h ^= h >>> 13; + h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)); + h ^= h >>> 15; - return interp(outputLower, outputUpper, t); + return h >>> 0; } -function evaluateIdentityFunction(parameters, propertySpec, input) { - if (propertySpec.type === 'color') { - input = Color.parse(input); - } else if (propertySpec.type === 'formatted') { - input = Formatted.fromString(input.toString()); - } else if (propertySpec.type === 'resolvedImage') { - input = ResolvedImage.fromString(input.toString()); - } else if (getType(input) !== propertySpec.type && (propertySpec.type !== 'enum' || !propertySpec.values[input])) { - input = undefined; - } - return coalesce(input, parameters.default, propertySpec.default); +if('object' !== undefined) { + module.exports = murmurhash2_32_gc; } +}); -/** - * 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) { - const difference = upperValue - lowerValue; - const 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); - } -} +var murmurhashJs = murmurhash3_gc; +var murmur3_1 = murmurhash3_gc; +var murmur2_1 = murmurhash2_gc; +murmurhashJs.murmur3 = murmur3_1; +murmurhashJs.murmur2 = murmur2_1; // - - - - - - - - - - - - - - - - - - + + + - + + + + + - - - - - - - +// A transferable data structure that maps feature ids to their indices and buffer offsets +class FeaturePositionMap { - - -class StyleExpression { - - - - - - + + - constructor(expression , propertySpec ) { - this.expression = expression; - this._warningHistory = {}; - this._evaluator = new EvaluationContext(); - this._defaultValue = propertySpec ? getDefaultValue(propertySpec) : null; - this._enumValues = propertySpec && propertySpec.type === 'enum' ? propertySpec.values : null; + constructor() { + this.ids = []; + this.positions = []; + this.indexed = false; } - evaluateWithoutErrorHandling(globals , feature , featureState , canonical , availableImages , formattedSection , featureTileCoord , featureDistanceData ) { - this._evaluator.globals = globals; - this._evaluator.feature = feature; - this._evaluator.featureState = featureState; - this._evaluator.canonical = canonical; - this._evaluator.availableImages = availableImages || null; - this._evaluator.formattedSection = formattedSection; - this._evaluator.featureTileCoord = featureTileCoord || null; - this._evaluator.featureDistanceData = featureDistanceData || null; - - return this.expression.evaluate(this._evaluator); + add(id , index , start , end ) { + this.ids.push(getNumericId(id)); + this.positions.push(index, start, end); } - evaluate(globals , feature , featureState , canonical , availableImages , formattedSection , featureTileCoord , featureDistanceData ) { - this._evaluator.globals = globals; - this._evaluator.feature = feature || null; - this._evaluator.featureState = featureState || null; - this._evaluator.canonical = canonical; - this._evaluator.availableImages = availableImages || null; - this._evaluator.formattedSection = formattedSection || null; - this._evaluator.featureTileCoord = featureTileCoord || null; - this._evaluator.featureDistanceData = featureDistanceData || null; + getPositions(id ) { + assert_1(this.indexed); - try { - const val = this.expression.evaluate(this._evaluator); - // eslint-disable-next-line no-self-compare - if (val === null || val === undefined || (typeof val === 'number' && val !== val)) { - return this._defaultValue; - } - if (this._enumValues && !(val in this._enumValues)) { - throw new RuntimeError(`Expected value to be one of ${Object.keys(this._enumValues).map(v => 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); - } + const intId = getNumericId(id); + + // binary search for the first occurrence of id in this.ids; + // relies on ids/positions being sorted by id, which happens in serialization + let i = 0; + let j = this.ids.length - 1; + while (i < j) { + const m = (i + j) >> 1; + if (this.ids[m] >= intId) { + j = m; + } else { + i = m + 1; } - return this._defaultValue; } - } -} - -function isExpression(expression ) { - return Array.isArray(expression) && expression.length > 0 && - typeof expression[0] === 'string' && expression[0] in expressions; -} - -/** - * 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 ) { - const parser = new ParsingContext(expressions, [], propertySpec ? getExpectedType(propertySpec) : undefined); - - // For string-valued properties, coerce to string at the top level rather than asserting. - const parsed = parser.parse(expression, undefined, undefined, undefined, - propertySpec && propertySpec.type === 'string' ? {typeAnnotation: 'coerce'} : undefined); - - if (!parsed) { - assert_1(parser.errors.length > 0); - return error(parser.errors); + const positions = []; + while (this.ids[i] === intId) { + const index = this.positions[3 * i]; + const start = this.positions[3 * i + 1]; + const end = this.positions[3 * i + 2]; + positions.push({index, start, end}); + i++; + } + return positions; } - return success(new StyleExpression(parsed, propertySpec)); -} + static serialize(map , transferables ) { + const ids = new Float64Array(map.ids); + const positions = new Uint32Array(map.positions); -class ZoomConstantExpression { - - - + sort(ids, positions, 0, ids.length - 1); - constructor(kind , expression ) { - this.kind = kind; - this._styleExpression = expression; - this.isStateDependent = kind !== ('constant' ) && !isStateConstant(expression.expression); - } + if (transferables) { + transferables.push(ids.buffer, positions.buffer); + } - evaluateWithoutErrorHandling(globals , feature , featureState , canonical , availableImages , formattedSection ) { - return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection); + return {ids, positions}; } - evaluate(globals , feature , featureState , canonical , availableImages , formattedSection ) { - return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection); + static deserialize(obj ) { + const map = new FeaturePositionMap(); + // after transferring, we only use these arrays statically (no pushes), + // so TypedArray vs Array distinction that flow points out doesn't matter + map.ids = (obj.ids ); + map.positions = (obj.positions ); + map.indexed = true; + return map; } } -class ZoomDependentExpression { - - - - - - - - constructor(kind , expression , zoomStops , interpolationType ) { - this.kind = kind; - this.zoomStops = zoomStops; - this._styleExpression = expression; - this.isStateDependent = kind !== ('camera' ) && !isStateConstant(expression.expression); - this.interpolationType = interpolationType; +function getNumericId(value ) { + const numValue = +value; + if (!isNaN(numValue) && Number.MIN_SAFE_INTEGER <= numValue && numValue <= Number.MAX_SAFE_INTEGER) { + return numValue; } + return murmurhashJs(String(value)); +} - evaluateWithoutErrorHandling(globals , feature , featureState , canonical , availableImages , formattedSection ) { - return this._styleExpression.evaluateWithoutErrorHandling(globals, feature, featureState, canonical, availableImages, formattedSection); - } +// custom quicksort that sorts ids, indices and offsets together (by ids) +// uses Hoare partitioning & manual tail call optimization to avoid worst case scenarios +function sort(ids, positions, left, right) { + while (left < right) { + const pivot = ids[(left + right) >> 1]; + let i = left - 1; + let j = right + 1; - evaluate(globals , feature , featureState , canonical , availableImages , formattedSection ) { - return this._styleExpression.evaluate(globals, feature, featureState, canonical, availableImages, formattedSection); - } + while (true) { + do i++; while (ids[i] < pivot); + do j--; while (ids[j] > pivot); + if (i >= j) break; + swap$1(ids, i, j); + swap$1(positions, 3 * i, 3 * j); + swap$1(positions, 3 * i + 1, 3 * j + 1); + swap$1(positions, 3 * i + 2, 3 * j + 2); + } - interpolationFactor(input , lower , upper ) { - if (this.interpolationType) { - return Interpolate.interpolationFactor(this.interpolationType, input, lower, upper); + if (j - left < right - j) { + sort(ids, positions, left, j); + left = j + 1; } else { - return 0; + sort(ids, positions, j + 1, right); + right = j; } } } - - - - +function swap$1(arr, i, j) { + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} - - - - - +register(FeaturePositionMap, 'FeaturePositionMap'); - - - - - - - +// - - - - - - - - + - - - - + + -function createPropertyExpression(expression , propertySpec ) { - expression = createExpression(expression, propertySpec); - if (expression.result === 'error') { - return expression; +class Uniform { + + + + + constructor(context , location ) { + this.gl = context.gl; + this.location = location; } - const parsed = expression.value.expression; + +} - const isFeatureConstant$1 = isFeatureConstant(parsed); - if (!isFeatureConstant$1 && !supportsPropertyExpression(propertySpec)) { - return error([new ParsingError('', 'data expressions not supported')]); +class Uniform1i extends Uniform { + constructor(context , location ) { + super(context, location); + this.current = 0; } - const isZoomConstant = isGlobalPropertyConstant(parsed, ['zoom', 'pitch', 'distance-from-center']); - if (!isZoomConstant && !supportsZoomExpression(propertySpec)) { - return error([new ParsingError('', 'zoom expressions not supported')]); + set(v ) { + if (this.current !== v) { + this.current = v; + this.gl.uniform1i(this.location, v); + } } +} - const 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 && !supportsInterpolation(propertySpec)) { - return error([new ParsingError('', '"interpolate" expressions cannot be used with this property')]); +class Uniform1f extends Uniform { + constructor(context , location ) { + super(context, location); + this.current = 0; } - if (!zoomCurve) { - return success(isFeatureConstant$1 ? - (new ZoomConstantExpression('constant', expression.value) ) : - (new ZoomConstantExpression('source', expression.value) )); + set(v ) { + if (this.current !== v) { + this.current = v; + this.gl.uniform1f(this.location, v); + } } +} - const interpolationType = zoomCurve instanceof Interpolate ? zoomCurve.interpolation : undefined; +class Uniform2f extends Uniform { + constructor(context , location ) { + super(context, location); + this.current = [0, 0]; + } - return success(isFeatureConstant$1 ? - (new ZoomDependentExpression('camera', expression.value, zoomCurve.labels, interpolationType) ) : - (new ZoomDependentExpression('composite', expression.value, zoomCurve.labels, interpolationType) )); + set(v ) { + if (v[0] !== this.current[0] || v[1] !== this.current[1]) { + this.current = v; + this.gl.uniform2f(this.location, v[0], v[1]); + } + } } -// serialization wrapper for old-style stop functions normalized to the -// expression interface -class StylePropertyFunction { - - +class Uniform3f extends Uniform { + constructor(context , location ) { + super(context, location); + this.current = [0, 0, 0]; + } + + set(v ) { + if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2]) { + this.current = v; + this.gl.uniform3f(this.location, v[0], v[1], v[2]); + } + } +} - - - - +class Uniform4f extends Uniform { + constructor(context , location ) { + super(context, location); + this.current = [0, 0, 0, 0]; + } - constructor(parameters , specification ) { - this._parameters = parameters; - this._specification = specification; - extend$1(this, createFunction(this._parameters, this._specification)); + set(v ) { + if (v[0] !== this.current[0] || v[1] !== this.current[1] || + v[2] !== this.current[2] || v[3] !== this.current[3]) { + this.current = v; + this.gl.uniform4f(this.location, v[0], v[1], v[2], v[3]); + } } +} - static deserialize(serialized ) { - return ((new StylePropertyFunction(serialized._parameters, serialized._specification)) ); +class UniformColor extends Uniform { + constructor(context , location ) { + super(context, location); + this.current = Color.transparent; } - static serialize(input ) { - return { - _parameters: input._parameters, - _specification: input._specification - }; + set(v ) { + if (v.r !== this.current.r || v.g !== this.current.g || + v.b !== this.current.b || v.a !== this.current.a) { + this.current = v; + this.gl.uniform4f(this.location, v.r, v.g, v.b, v.a); + } } } -function normalizePropertyExpression (value , specification ) { - if (isFunction(value)) { - return (new StylePropertyFunction(value, specification) ); +const emptyMat4 = new Float32Array(16); +class UniformMatrix4f extends Uniform { + constructor(context , location ) { + super(context, location); + this.current = emptyMat4; + } - } else if (isExpression(value)) { - const expression = createPropertyExpression(value, specification); - if (expression.result === 'error') { - // this should have been caught in validation - throw new Error(expression.value.map(err => `${err.key}: ${err.message}`).join(', ')); + set(v ) { + // The vast majority of matrix comparisons that will trip this set + // happen at i=12 or i=0, so we check those first to avoid lots of + // unnecessary iteration: + if (v[12] !== this.current[12] || v[0] !== this.current[0]) { + this.current = v; + this.gl.uniformMatrix4fv(this.location, false, v); + return; } - return expression.value; - - } else { - let constant = value; - if (typeof value === 'string' && specification.type === 'color') { - constant = Color.parse(value); + for (let i = 1; i < 16; i++) { + if (v[i] !== this.current[i]) { + this.current = v; + this.gl.uniformMatrix4fv(this.location, false, v); + break; + } } - return { - kind: 'constant', - evaluate: () => constant - }; } } -// 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 ) { - let result = null; - if (expression instanceof Let) { - result = findZoomCurve(expression.result); +const emptyMat3 = new Float32Array(9); +class UniformMatrix3f extends Uniform { + constructor(context , location ) { + super(context, location); + this.current = emptyMat3; + } - } else if (expression instanceof Coalesce) { - for (const arg of expression.args) { - result = findZoomCurve(arg); - if (result) { + set(v ) { + for (let i = 0; i < 9; i++) { + if (v[i] !== this.current[i]) { + this.current = v; + this.gl.uniformMatrix3fv(this.location, false, v); 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; +const emptyMat2 = new Float32Array(4); +class UniformMatrix2f extends Uniform { + constructor(context , location ) { + super(context, location); + this.current = emptyMat2; } - expression.eachChild((child) => { - const 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.'); + set(v ) { + for (let i = 0; i < 4; i++) { + if (v[i] !== this.current[i]) { + this.current = v; + this.gl.uniformMatrix2fv(this.location, false, v); + break; + } } - }); - - return result; + } } -function getExpectedType(spec ) { - const types = { - color: ColorType, - string: StringType, - number: NumberType, - enum: StringType, - boolean: BooleanType, - formatted: FormattedType, - resolvedImage: ResolvedImageType - }; - - if (spec.type === 'array') { - return array(types[spec.value] || ValueType, spec.length); - } +// - return types[spec.type]; -} + + + + + -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 packColor(color ) { + return [ + packUint8ToFloat(255 * color.r, 255 * color.g), + packUint8ToFloat(255 * color.b, 255 * color.a) + ]; } -function validateObject(options) { - const key = options.key; - const object = options.value; - const elementSpecs = options.valueSpec || {}; - const elementValidators = options.objectElementValidators || {}; - const style = options.style; - const styleSpec = options.styleSpec; - let errors = []; +/** + * `Binder` is the interface definition for the strategies for constructing, + * uploading, and binding paint property data as GLSL attributes. Most style- + * spec properties have a 1:1 relationship to shader attribute/uniforms, but + * some require multiple values per feature to be passed to the GPU, and in + * those cases we bind multiple attributes/uniforms. + * + * 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 attribute 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 accommodate this. + * + * @private + */ - const type = getType(object); - if (type !== 'object') { - return [new ValidationError(key, object, `object expected, ${type} found`)]; - } + + + + + + - for (const objectKey in object) { - const elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint' - const elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*']; + + + + + - let validateElement; - if (elementValidators[elementSpecKey]) { - validateElement = elementValidators[elementSpecKey]; - } else if (elementSpecs[elementSpecKey]) { - validateElement = validate; - } else if (elementValidators['*']) { - validateElement = elementValidators['*']; - } else if (elementSpecs['*']) { - validateElement = validate; - } else { - errors.push(new ValidationError(key, object[objectKey], `unknown property "${objectKey}"`)); - continue; - } +class ConstantBinder { + + + - errors = errors.concat(validateElement({ - key: (key ? `${key}.` : key) + objectKey, - value: object[objectKey], - valueSpec: elementSpec, - style, - styleSpec, - object, - objectKey - }, object)); + constructor(value , names , type ) { + this.value = value; + this.uniformNames = names.map(name => `u_${name}`); + this.type = type; } - for (const elementSpecKey in elementSpecs) { - // Don't check `required` when there's a custom validator for that property. - if (elementValidators[elementSpecKey]) { - continue; - } - - if (elementSpecs[elementSpecKey].required && elementSpecs[elementSpecKey]['default'] === undefined && object[elementSpecKey] === undefined) { - errors.push(new ValidationError(key, object, `missing required property "${elementSpecKey}"`)); - } + setUniform(uniform , globals , currentValue ) { + uniform.set(currentValue.constantOr(this.value)); } - return errors; + getBinding(context , location , _ ) { + return (this.type === 'color') ? + new UniformColor(context, location) : + new Uniform1f(context, location); + } } -function validateArray(options) { - const array = options.value; - const arraySpec = options.valueSpec; - const style = options.style; - const styleSpec = options.styleSpec; - const key = options.key; - const validateArrayElement = options.arrayElementValidator || validate; +class CrossFadedConstantBinder { + + + + + - if (getType(array) !== 'array') { - return [new ValidationError(key, array, `array expected, ${getType(array)} found`)]; + constructor(value , names ) { + this.uniformNames = names.map(name => `u_${name}`); + this.patternFrom = null; + this.patternTo = null; + this.pixelRatioFrom = 1; + this.pixelRatioTo = 1; } - if (arraySpec.length && array.length !== arraySpec.length) { - return [new ValidationError(key, array, `array length ${arraySpec.length} expected, length ${array.length} found`)]; + setConstantPatternPositions(posTo , posFrom ) { + this.pixelRatioFrom = posFrom.pixelRatio || 1; + this.pixelRatioTo = posTo.pixelRatio || 1; + this.patternFrom = posFrom.tl.concat(posFrom.br); + this.patternTo = posTo.tl.concat(posTo.br); } - 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`)]; + setUniform(uniform , globals , currentValue , uniformName ) { + const pos = + uniformName === 'u_pattern_to' || uniformName === 'u_dash_to' ? this.patternTo : + uniformName === 'u_pattern_from' || uniformName === 'u_dash_from' ? this.patternFrom : + uniformName === 'u_pixel_ratio_to' ? this.pixelRatioTo : + uniformName === 'u_pixel_ratio_from' ? this.pixelRatioFrom : null; + if (pos) uniform.set(pos); } - let arrayElementSpec = { - "type": arraySpec.value, - "values": arraySpec.values, - "minimum": arraySpec.minimum, - "maximum": arraySpec.maximum - }; - - if (styleSpec.$version < 7) { - arrayElementSpec.function = arraySpec.function; + getBinding(context , location , name ) { + return name === 'u_pattern_from' || name === 'u_pattern_to' || name === 'u_dash_from' || name === 'u_dash_to' ? + new Uniform4f(context, location) : + new Uniform1f(context, location); } +} - if (getType(arraySpec.value) === 'object') { - arrayElementSpec = arraySpec.value; - } +class SourceExpressionBinder { + + + - let errors = []; - for (let i = 0; i < array.length; i++) { - errors = errors.concat(validateArrayElement({ - array, - arrayIndex: i, - value: array[i], - valueSpec: arrayElementSpec, - style, - styleSpec, - key: `${key}[${i}]` + + + + + constructor(expression , names , type , PaintVertexArray ) { + this.expression = expression; + this.type = type; + this.maxValue = 0; + this.paintVertexAttributes = names.map((name) => ({ + name: `a_${name}`, + type: 'Float32', + components: type === 'color' ? 2 : 1, + offset: 0 })); + this.paintVertexArray = new PaintVertexArray(); } - return errors; -} - -function validateNumber(options) { - const key = options.key; - const value = options.value; - const valueSpec = options.valueSpec; - let type = getType(value); - // eslint-disable-next-line no-self-compare - if (type === 'number' && value !== value) { - type = 'NaN'; + populatePaintArray(newLength , feature , imagePositions , availableImages , canonical , formattedSection ) { + const start = this.paintVertexArray.length; + assert_1(Array.isArray(availableImages)); + const value = this.expression.evaluate(new EvaluationParameters(0), feature, {}, canonical, availableImages, formattedSection); + this.paintVertexArray.resize(newLength); + this._setPaintValue(start, newLength, value); } - if (type !== 'number') { - return [new ValidationError(key, value, `number expected, ${type} found`)]; + updatePaintArray(start , end , feature , featureState , availableImages ) { + const value = this.expression.evaluate({zoom: 0}, feature, featureState, undefined, availableImages); + this._setPaintValue(start, end, value); } - if ('minimum' in valueSpec) { - let specMin = valueSpec.minimum; - if (getType(valueSpec.minimum) === 'array') { - const i = options.arrayIndex; - specMin = valueSpec.minimum[i]; - } - if (value < specMin) { - return [new ValidationError(key, value, `${value} is less than the minimum value ${specMin}`)]; + _setPaintValue(start, end, value) { + if (this.type === 'color') { + const color = packColor(value); + for (let i = start; i < end; i++) { + this.paintVertexArray.emplace(i, color[0], color[1]); + } + } else { + for (let i = start; i < end; i++) { + this.paintVertexArray.emplace(i, value); + } + this.maxValue = Math.max(this.maxValue, Math.abs(value)); } } - if ('maximum' in valueSpec) { - let specMax = valueSpec.maximum; - if (getType(valueSpec.maximum) === 'array') { - const i = options.arrayIndex; - specMax = valueSpec.maximum[i]; - } - if (value > specMax) { - return [new ValidationError(key, value, `${value} is greater than the maximum value ${specMax}`)]; + upload(context ) { + if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { + if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { + this.paintVertexBuffer.updateData(this.paintVertexArray); + } else { + this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); + } } } - return []; + destroy() { + if (this.paintVertexBuffer) { + this.paintVertexBuffer.destroy(); + } + } } -function validateFunction(options) { - const functionValueSpec = options.valueSpec; - const functionType = unbundle(options.value.type); - let stopKeyType; - let stopDomainValues = {}; - let previousStopDomainValue; - let previousStopDomainZoom; +class CompositeExpressionBinder { + + + + + + - const isZoomFunction = functionType !== 'categorical' && options.value.property === undefined; - const isPropertyFunction = !isZoomFunction; - const isZoomAndPropertyFunction = - getType(options.value.stops) === 'array' && - getType(options.value.stops[0]) === 'array' && - getType(options.value.stops[0][0]) === 'object'; + + + - const errors = validateObject({ - key: options.key, - value: options.value, - valueSpec: options.styleSpec.function, - style: options.style, - styleSpec: options.styleSpec, - objectElementValidators: { - stops: validateFunctionStops, - default: validateFunctionDefault - } - }); + constructor(expression , names , type , useIntegerZoom , zoom , PaintVertexArray ) { + this.expression = expression; + this.uniformNames = names.map(name => `u_${name}_t`); + this.type = type; + this.useIntegerZoom = useIntegerZoom; + this.zoom = zoom; + this.maxValue = 0; + this.paintVertexAttributes = names.map((name) => ({ + name: `a_${name}`, + type: 'Float32', + components: type === 'color' ? 4 : 2, + offset: 0 + })); + this.paintVertexArray = new PaintVertexArray(); + } - if (functionType === 'identity' && isZoomFunction) { - errors.push(new ValidationError(options.key, options.value, 'missing required property "property"')); + populatePaintArray(newLength , feature , imagePositions , availableImages , canonical , formattedSection ) { + const min = this.expression.evaluate(new EvaluationParameters(this.zoom), feature, {}, canonical, availableImages, formattedSection); + const max = this.expression.evaluate(new EvaluationParameters(this.zoom + 1), feature, {}, canonical, availableImages, formattedSection); + const start = this.paintVertexArray.length; + this.paintVertexArray.resize(newLength); + this._setPaintValue(start, newLength, min, max); } - if (functionType !== 'identity' && !options.value.stops) { - errors.push(new ValidationError(options.key, options.value, 'missing required property "stops"')); + updatePaintArray(start , end , feature , featureState , availableImages ) { + const min = this.expression.evaluate({zoom: this.zoom}, feature, featureState, undefined, availableImages); + const max = this.expression.evaluate({zoom: this.zoom + 1}, feature, featureState, undefined, availableImages); + this._setPaintValue(start, end, min, max); } - if (functionType === 'exponential' && options.valueSpec.expression && !supportsInterpolation(options.valueSpec)) { - errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported')); + _setPaintValue(start, end, min, max) { + if (this.type === 'color') { + const minColor = packColor(min); + const maxColor = packColor(max); + for (let i = start; i < end; i++) { + this.paintVertexArray.emplace(i, minColor[0], minColor[1], maxColor[0], maxColor[1]); + } + } else { + for (let i = start; i < end; i++) { + this.paintVertexArray.emplace(i, min, max); + } + this.maxValue = Math.max(this.maxValue, Math.abs(min), Math.abs(max)); + } } - if (options.styleSpec.$version >= 8) { - if (isPropertyFunction && !supportsPropertyExpression(options.valueSpec)) { - errors.push(new ValidationError(options.key, options.value, 'property functions not supported')); - } else if (isZoomFunction && !supportsZoomExpression(options.valueSpec)) { - errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported')); + upload(context ) { + if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { + if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { + this.paintVertexBuffer.updateData(this.paintVertexArray); + } else { + this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); + } } } - if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) { - errors.push(new ValidationError(options.key, options.value, '"property" property is required')); + destroy() { + if (this.paintVertexBuffer) { + this.paintVertexBuffer.destroy(); + } + } + + setUniform(uniform , globals ) { + const currentZoom = this.useIntegerZoom ? Math.floor(globals.zoom) : globals.zoom; + const factor = clamp(this.expression.interpolationFactor(currentZoom, this.zoom, this.zoom + 1), 0, 1); + uniform.set(factor); + } + + getBinding(context , location , _ ) { + return new Uniform1f(context, location); } +} + +class CrossFadedCompositeBinder { + + + + + + + + + + + - return errors; + constructor(expression , names , type , useIntegerZoom , zoom , PaintVertexArray , layerId ) { + this.expression = expression; + this.type = type; + this.useIntegerZoom = useIntegerZoom; + this.zoom = zoom; + this.layerId = layerId; - function validateFunctionStops(options) { - if (functionType === 'identity') { - return [new ValidationError(options.key, options.value, 'identity function may not have a "stops" property')]; + this.paintVertexAttributes = (type === 'array' ? dashAttributes : patternAttributes).members; + for (let i = 0; i < names.length; ++i) { + assert_1(`a_${names[i]}` === this.paintVertexAttributes[i].name); } - let errors = []; - const value = options.value; - - errors = errors.concat(validateArray({ - key: options.key, - value, - valueSpec: options.valueSpec, - style: options.style, - styleSpec: options.styleSpec, - arrayElementValidator: validateFunctionStop - })); + this.zoomInPaintVertexArray = new PaintVertexArray(); + this.zoomOutPaintVertexArray = new PaintVertexArray(); + } - if (getType(value) === 'array' && value.length === 0) { - errors.push(new ValidationError(options.key, value, 'array must have at least one stop')); - } + populatePaintArray(length , feature , imagePositions ) { + const start = this.zoomInPaintVertexArray.length; + this.zoomInPaintVertexArray.resize(length); + this.zoomOutPaintVertexArray.resize(length); + this._setPaintValues(start, length, feature.patterns && feature.patterns[this.layerId], imagePositions); + } - return errors; + updatePaintArray(start , end , feature , featureState , availableImages , imagePositions ) { + this._setPaintValues(start, end, feature.patterns && feature.patterns[this.layerId], imagePositions); } - function validateFunctionStop(options) { - let errors = []; - const value = options.value; - const key = options.key; + _setPaintValues(start, end, patterns, positions) { + if (!positions || !patterns) return; - if (getType(value) !== 'array') { - return [new ValidationError(key, value, `array expected, ${getType(value)} found`)]; - } + const {min, mid, max} = patterns; + const imageMin = positions[min]; + const imageMid = positions[mid]; + const imageMax = positions[max]; + if (!imageMin || !imageMid || !imageMax) return; - if (value.length !== 2) { - return [new ValidationError(key, value, `array length 2 expected, length ${value.length} found`)]; + // We populate two paint arrays because, for cross-faded properties, we don't know which direction + // we're cross-fading to at layout time. In order to keep vertex attributes to a minimum and not pass + // unnecessary vertex data to the shaders, we determine which to upload at draw time. + for (let i = start; i < end; i++) { + this._setPaintValue(this.zoomInPaintVertexArray, i, imageMid, imageMin); + this._setPaintValue(this.zoomOutPaintVertexArray, i, imageMid, imageMax); } + } - 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)); - } + _setPaintValue(array, i, posA, posB) { + array.emplace(i, + posA.tl[0], posA.tl[1], posA.br[0], posA.br[1], + posB.tl[0], posB.tl[1], posB.br[0], posB.br[1], + posA.pixelRatio, posB.pixelRatio + ); + } - if (isExpression(deepUnbundle(value[1]))) { - return errors.concat([new ValidationError(`${key}[1]`, value[1], 'expressions are not allowed in function stops.')]); + upload(context ) { + if (this.zoomInPaintVertexArray && this.zoomInPaintVertexArray.arrayBuffer && this.zoomOutPaintVertexArray && this.zoomOutPaintVertexArray.arrayBuffer) { + this.zoomInPaintVertexBuffer = context.createVertexBuffer(this.zoomInPaintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); + this.zoomOutPaintVertexBuffer = context.createVertexBuffer(this.zoomOutPaintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); } + } - return errors.concat(validate({ - key: `${key}[1]`, - value: value[1], - valueSpec: functionValueSpec, - style: options.style, - styleSpec: options.styleSpec - })); + destroy() { + if (this.zoomOutPaintVertexBuffer) this.zoomOutPaintVertexBuffer.destroy(); + if (this.zoomInPaintVertexBuffer) this.zoomInPaintVertexBuffer.destroy(); } +} - function validateStopDomainValue(options, stop) { - const type = getType(options.value); - const value = unbundle(options.value); +/** + * 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 + */ +class ProgramConfiguration { + + - const 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}`)]; - } + constructor(layer , zoom , filterProperties = () => true) { + this.binders = {}; + this._buffers = []; - if (type !== 'number' && type !== 'string' && type !== 'boolean') { - return [new ValidationError(options.key, reportValue, 'stop domain value must be a number, string, or boolean')]; - } + const keys = []; - if (type !== 'number' && functionType !== 'categorical') { - let message = `number expected, ${type} found`; - if (supportsPropertyExpression(functionValueSpec) && functionType === undefined) { - message += '\nIf you intended to use a categorical function, specify `"type": "categorical"`.'; + for (const property in layer.paint._values) { + if (!filterProperties(property)) continue; + const value = layer.paint.get(property); + if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { + continue; } - return [new ValidationError(options.key, reportValue, message)]; - } + const names = paintAttributeNames(property, layer.type); + const expression = value.value; + const type = value.property.specification.type; + const useIntegerZoom = value.property.useIntegerZoom; + const propType = value.property.specification['property-type']; + const isCrossFaded = propType === 'cross-faded' || propType === 'cross-faded-data-driven'; - if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) { - return [new ValidationError(options.key, reportValue, `integer expected, found ${value}`)]; - } + const sourceException = String(property) === 'line-dasharray' && (layer.layout ).get('line-cap').value.kind !== 'constant'; - 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 (expression.kind === 'constant' && !sourceException) { + this.binders[property] = isCrossFaded ? + new CrossFadedConstantBinder(expression.value, names) : + new ConstantBinder(expression.value, names, type); + keys.push(`/u_${property}`); - if (functionType === 'categorical' && value in stopDomainValues) { - return [new ValidationError(options.key, reportValue, 'stop domain values must be unique')]; - } else { - stopDomainValues[value] = true; + } else if (expression.kind === 'source' || sourceException || isCrossFaded) { + const StructArrayLayout = layoutType(property, type, 'source'); + this.binders[property] = isCrossFaded ? + new CrossFadedCompositeBinder(expression, names, type, useIntegerZoom, zoom, StructArrayLayout, layer.id) : + new SourceExpressionBinder(expression, names, type, StructArrayLayout); + keys.push(`/a_${property}`); + + } else { + const StructArrayLayout = layoutType(property, type, 'composite'); + this.binders[property] = new CompositeExpressionBinder(expression, names, type, useIntegerZoom, zoom, StructArrayLayout); + keys.push(`/z_${property}`); + } } - return []; + this.cacheKey = keys.sort().join(''); } - function validateFunctionDefault(options) { - return validate({ - key: options.key, - value: options.value, - valueSpec: functionValueSpec, - style: options.style, - styleSpec: options.styleSpec - }); + getMaxValue(property ) { + const binder = this.binders[property]; + return binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder ? binder.maxValue : 0; } -} - -// - - -function validateExpression(options ) { - const expression = (options.expressionContext === 'property' ? createPropertyExpression : createExpression)(deepUnbundle(options.value), options.valueSpec); - if (expression.result === 'error') { - return expression.value.map((error) => { - return new ValidationError(`${options.key}${error.key}`, options.value, error.message); - }); + populatePaintArrays(newLength , feature , imagePositions , availableImages , canonical , formattedSection ) { + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) + (binder ).populatePaintArray(newLength, feature, imagePositions, availableImages, canonical, formattedSection); + } + } + setConstantPatternPositions(posTo , posFrom ) { + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof CrossFadedConstantBinder) + binder.setConstantPatternPositions(posTo, posFrom); + } } - const expressionObj = (expression.value ).expression || (expression.value )._styleExpression.expression; + updatePaintArrays(featureStates , featureMap , vtLayer , layer , availableImages , imagePositions ) { + let dirty = false; + for (const id in featureStates) { + const positions = featureMap.getPositions(id); - if (options.expressionContext === 'property' && (options.propertyKey === 'text-font') && - !expressionObj.outputDefined()) { - return [new ValidationError(options.key, options.value, `Invalid data expression for "${options.propertyKey}". Output values must be contained as literals within the expression.`)]; - } + for (const pos of positions) { + const feature = vtLayer.feature(pos.index); - if (options.expressionContext === 'property' && options.propertyType === 'layout' && - (!isStateConstant(expressionObj))) { - return [new ValidationError(options.key, options.value, '"feature-state" data expressions are not supported with layout properties.')]; + for (const property in this.binders) { + const binder = this.binders[property]; + if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || + binder instanceof CrossFadedCompositeBinder) && (binder ).expression.isStateDependent === true) { + //AHM: Remove after https://github.com/mapbox/mapbox-gl-js/issues/6255 + const value = layer.paint.get(property); + (binder ).expression = value.value; + (binder ).updatePaintArray(pos.start, pos.end, feature, featureStates[id], availableImages, imagePositions); + dirty = true; + } + } + } + } + return dirty; } - if (options.expressionContext === 'filter') { - return disallowedFilterParameters(expressionObj, options); + defines() { + const result = []; + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder) { + result.push(...binder.uniformNames.map(name => `#define HAS_UNIFORM_${name}`)); + } + } + return result; } - if (options.expressionContext && options.expressionContext.indexOf('cluster') === 0) { - if (!isGlobalPropertyConstant(expressionObj, ['zoom', 'feature-state'])) { - return [new ValidationError(options.key, options.value, '"zoom" and "feature-state" expressions are not supported with cluster properties.')]; - } - if (options.expressionContext === 'cluster-initial' && !isFeatureConstant(expressionObj)) { - return [new ValidationError(options.key, options.value, 'Feature data expressions are not supported with initial expression part of cluster properties.')]; + getBinderAttributes() { + const result = []; + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) { + for (let i = 0; i < binder.paintVertexAttributes.length; i++) { + result.push(binder.paintVertexAttributes[i].name); + } + } } + return result; } - return []; -} - -function disallowedFilterParameters(e , options ) { - const disallowedParameters = new Set([ - 'zoom', - 'feature-state', - 'pitch', - 'distance-from-center' - ]); - for (const param of options.valueSpec.expression.parameters) { - disallowedParameters.delete(param); + getBinderUniforms() { + const uniforms = []; + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) { + for (const uniformName of binder.uniformNames) { + uniforms.push(uniformName); + } + } + } + return uniforms; } - if (disallowedParameters.size === 0) { - return []; + getPaintVertexBuffers() { + return this._buffers; } - const errors = []; - if (e instanceof CompoundExpression) { - if (disallowedParameters.has(e.name)) { - return [new ValidationError(options.key, options.value, `["${e.name}"] expression is not supported in a filter for a ${options.object.type} layer with id: ${options.object.id}`)]; + getUniforms(context , locations ) { + const uniforms = []; + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) { + for (const name of binder.uniformNames) { + if (locations[name]) { + const binding = binder.getBinding(context, locations[name], name); + uniforms.push({name, property, binding}); + } + } + } } + return uniforms; } - e.eachChild((arg) => { - errors.push(...disallowedFilterParameters(arg, options)); - }); - - return errors; -} - -function validateBoolean(options) { - const value = options.value; - const key = options.key; - const type = getType(value); - if (type !== 'boolean') { - return [new ValidationError(key, value, `boolean expected, ${type} found`)]; + setUniforms (context , binderUniforms , properties , globals ) { + // Uniform state bindings are owned by the Program, but we set them + // from within the ProgramConfiguration's binder members. + for (const {name, property, binding} of binderUniforms) { + (this.binders[property] ).setUniform(binding, globals, properties.get(property), name); + } } - return []; -} + updatePaintBuffers(crossfade ) { + this._buffers = []; -function validateColor(options) { - const key = options.key; - const value = options.value; - const type = getType(value); + for (const property in this.binders) { + const binder = this.binders[property]; + if (crossfade && binder instanceof CrossFadedCompositeBinder) { + const patternVertexBuffer = crossfade.fromScale === 2 ? binder.zoomInPaintVertexBuffer : binder.zoomOutPaintVertexBuffer; + if (patternVertexBuffer) this._buffers.push(patternVertexBuffer); - if (type !== 'string') { - return [new ValidationError(key, value, `color expected, ${type} found`)]; + } else if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) && binder.paintVertexBuffer) { + this._buffers.push(binder.paintVertexBuffer); + } + } } - if (csscolorparser.parseCSSColor(value) === null) { - return [new ValidationError(key, value, `color expected, "${value}" found`)]; + upload(context ) { + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) + binder.upload(context); + } + this.updatePaintBuffers(); } - return []; + destroy() { + for (const property in this.binders) { + const binder = this.binders[property]; + if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) + binder.destroy(); + } + } } -function validateEnum(options) { - const key = options.key; - const value = options.value; - const valueSpec = options.valueSpec; - const errors = []; +class ProgramConfigurationSet { + + + + - 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`)); + constructor(layers , zoom , filterProperties = () => true) { + this.programConfigurations = {}; + for (const layer of layers) { + this.programConfigurations[layer.id] = new ProgramConfiguration(layer, zoom, filterProperties); } + this.needsUpload = false; + this._featureMap = new FeaturePositionMap(); + this._bufferOffset = 0; } - return errors; -} -// + populatePaintArrays(length , feature , index , imagePositions , availableImages , canonical , formattedSection ) { + for (const key in this.programConfigurations) { + this.programConfigurations[key].populatePaintArrays(length, feature, imagePositions, availableImages, canonical, formattedSection); + } -function isExpressionFilter(filter ) { - if (filter === true || filter === false) { - return true; - } + if (feature.id !== undefined) { + this._featureMap.add(feature.id, index, this._bufferOffset, length); + } + this._bufferOffset = length; - if (!Array.isArray(filter) || filter.length === 0) { - return false; + this.needsUpload = true; } - switch (filter[0]) { - case 'has': - return filter.length >= 2 && filter[1] !== '$id' && filter[1] !== '$type'; - - case 'in': - return filter.length >= 3 && (typeof filter[1] !== 'string' || Array.isArray(filter[2])); - case '!in': - case '!has': - case 'none': - return false; + updatePaintArrays(featureStates , vtLayer , layers , availableImages , imagePositions ) { + for (const layer of layers) { + this.needsUpload = this.programConfigurations[layer.id].updatePaintArrays(featureStates, this._featureMap, vtLayer, layer, availableImages, imagePositions) || this.needsUpload; + } + } - case '==': - case '!=': - case '>': - case '>=': - case '<': - case '<=': - return filter.length !== 3 || (Array.isArray(filter[1]) || Array.isArray(filter[2])); + get(layerId ) { + return this.programConfigurations[layerId]; + } - case 'any': - case 'all': - for (const f of filter.slice(1)) { - if (!isExpressionFilter(f) && typeof f !== 'boolean') { - return false; - } + upload(context ) { + if (!this.needsUpload) return; + for (const layerId in this.programConfigurations) { + this.programConfigurations[layerId].upload(context); } - return true; + this.needsUpload = false; + } - default: - return true; + destroy() { + for (const layerId in this.programConfigurations) { + this.programConfigurations[layerId].destroy(); + } } } -/** - * 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 - * @param {string} layerType the type of the layer this filter will be applied to. - * @returns {Function} filter-evaluating function - */ -function createFilter(filter , layerType = 'fill') { - if (filter === null || filter === undefined) { - return {filter: () => true, needGeometry: false, needFeature: false}; - } +const 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'], + 'line-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'], + 'fill-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'], + 'fill-extrusion-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'], + 'line-dasharray': ['dash_to', 'dash_from'] +}; - if (!isExpressionFilter(filter)) { - filter = convertFilter(filter); +function paintAttributeNames(property, type) { + return attributeNameExceptions[property] || [property.replace(`${type}-`, '').replace(/-/g, '_')]; +} + +const propertyExceptions = { + 'line-pattern': { + 'source': StructArrayLayout10ui20, + 'composite': StructArrayLayout10ui20 + }, + 'fill-pattern': { + 'source': StructArrayLayout10ui20, + 'composite': StructArrayLayout10ui20 + }, + 'fill-extrusion-pattern':{ + 'source': StructArrayLayout10ui20, + 'composite': StructArrayLayout10ui20 + }, + 'line-dasharray': { // temporary layout + 'source': StructArrayLayout8ui16, + 'composite': StructArrayLayout8ui16 } - const filterExp = ((filter ) ); +}; - let staticFilter = true; - try { - staticFilter = extractStaticFilter(filterExp); - } catch (e) { - console.warn( -`Failed to extract static filter. Filter will continue working, but at higher memory usage and slower framerate. -This is most likely a bug, please report this via https://github.com/mapbox/mapbox-gl-js/issues/new?assignees=&labels=&template=Bug_report.md -and paste the contents of this message in the report. -Thank you! -Filter Expression: -${JSON.stringify(filterExp, null, 2)} - `); +const defaultLayouts = { + 'color': { + 'source': StructArrayLayout2f8, + 'composite': StructArrayLayout4f16 + }, + 'number': { + 'source': StructArrayLayout1f4, + 'composite': StructArrayLayout2f8 } +}; - // Compile the static component of the filter - const filterSpec = spec[`filter_${layerType}`]; - const compiledStaticFilter = createExpression(staticFilter, filterSpec); +function layoutType(property, type, binderType) { + const layoutException = propertyExceptions[property]; + return (layoutException && layoutException[binderType]) || defaultLayouts[type][binderType]; +} - let filterFunc = null; - if (compiledStaticFilter.result === 'error') { - throw new Error(compiledStaticFilter.value.map(err => `${err.key}: ${err.message}`).join(', ')); - } else { - filterFunc = (globalProperties , feature , canonical ) => compiledStaticFilter.value.evaluate(globalProperties, feature, {}, canonical); - } +register(ConstantBinder, 'ConstantBinder'); +register(CrossFadedConstantBinder, 'CrossFadedConstantBinder'); +register(SourceExpressionBinder, 'SourceExpressionBinder'); +register(CrossFadedCompositeBinder, 'CrossFadedCompositeBinder'); +register(CompositeExpressionBinder, 'CompositeExpressionBinder'); +register(ProgramConfiguration, 'ProgramConfiguration', {omit: ['_buffers']}); +register(ProgramConfigurationSet, 'ProgramConfigurationSet'); - // If the static component is not equal to the entire filter then we have a dynamic component - // Compile the dynamic component separately - let dynamicFilterFunc = null; - let needFeature = null; - if (staticFilter !== filterExp) { - const compiledDynamicFilter = createExpression(filterExp, filterSpec); +// - if (compiledDynamicFilter.result === 'error') { - throw new Error(compiledDynamicFilter.value.map(err => `${err.key}: ${err.message}`).join(', ')); - } else { - dynamicFilterFunc = (globalProperties , feature , canonical , featureTileCoord , featureDistanceData ) => compiledDynamicFilter.value.evaluate(globalProperties, feature, {}, canonical, undefined, undefined, featureTileCoord, featureDistanceData); - needFeature = !isFeatureConstant(compiledDynamicFilter.value.expression); - } - } + + + + + + + + + + + + + + + + + + - filterFunc = ((filterFunc ) ); - const needGeometry = geometryNeeded(staticFilter); +const TRANSITION_SUFFIX = '-transition'; - return { - filter: filterFunc, - dynamicFilter: dynamicFilterFunc ? dynamicFilterFunc : undefined, - needGeometry, - needFeature: !!needFeature - }; -} +class StyleLayer extends Evented { + + + + + + + + + + -function extractStaticFilter(filter ) { - if (!isDynamicFilter(filter)) { - return filter; - } + + - // Shallow copy so we can replace expressions in-place - let result = deepUnbundle(filter); + + + - // 1. Union branches - unionDynamicBranches(result); + + - // 2. Collapse dynamic conditions to `true` - result = collapseDynamicBooleanExpressions(result); + + + + + + + + + + - return result; -} + + -function collapseDynamicBooleanExpressions(expression ) { - if (!Array.isArray(expression)) { - return expression; - } + constructor(layer , properties ) { + super(); - const collapsed = collapsedExpression(expression); - if (collapsed === true) { - return collapsed; - } else { - return collapsed.map((subExpression) => collapseDynamicBooleanExpressions(subExpression)); - } -} + this.id = layer.id; + this.type = layer.type; + this._featureFilter = {filter: () => true, needGeometry: false, needFeature: false}; + this._filterCompiled = false; -/** - * Traverses the expression and replaces all instances of branching on a - * `dynamic` conditional (such as `['pitch']` or `['distance-from-center']`) - * into an `any` expression. - * This ensures that all possible outcomes of a `dynamic` branch are considered - * when evaluating the expression upfront during filtering. - * - * @param {Array} filter the filter expression mutated in-place. - */ -function unionDynamicBranches(filter ) { - let isBranchingDynamically = false; - const branches = []; + if (layer.type === 'custom') return; - if (filter[0] === 'case') { - for (let i = 1; i < filter.length - 1; i += 2) { - isBranchingDynamically = isBranchingDynamically || isDynamicFilter(filter[i]); - branches.push(filter[i + 1]); - } + layer = ((layer ) ); - branches.push(filter[filter.length - 1]); - } else if (filter[0] === 'match') { - isBranchingDynamically = isBranchingDynamically || isDynamicFilter(filter[1]); + this.metadata = layer.metadata; + this.minzoom = layer.minzoom; + this.maxzoom = layer.maxzoom; - for (let i = 2; i < filter.length - 1; i += 2) { - branches.push(filter[i + 1]); + if (layer.type !== 'background' && layer.type !== 'sky') { + this.source = layer.source; + this.sourceLayer = layer['source-layer']; + this.filter = layer.filter; } - branches.push(filter[filter.length - 1]); - } else if (filter[0] === 'step') { - isBranchingDynamically = isBranchingDynamically || isDynamicFilter(filter[1]); - for (let i = 1; i < filter.length - 1; i += 2) { - branches.push(filter[i + 1]); + if (properties.layout) { + this._unevaluatedLayout = new Layout(properties.layout); } - } - if (isBranchingDynamically) { - filter.length = 0; - filter.push('any', ...branches); - } + if (properties.paint) { + this._transitionablePaint = new Transitionable(properties.paint); - // traverse and recurse into children - for (let i = 1; i < filter.length; i++) { - unionDynamicBranches(filter[i]); - } -} + for (const property in layer.paint) { + this.setPaintProperty(property, layer.paint[property], {validate: false}); + } + for (const property in layer.layout) { + this.setLayoutProperty(property, layer.layout[property], {validate: false}); + } -function isDynamicFilter(filter ) { - // Base Cases - if (!Array.isArray(filter)) { - return false; + this._transitioningPaint = this._transitionablePaint.untransitioned(); + //$FlowFixMe + this.paint = new PossiblyEvaluated(properties.paint); + } } - if (isRootExpressionDynamic(filter[0])) { - return true; + + getCrossfadeParameters() { + return this._crossfadeParameters; } - for (let i = 1; i < filter.length; i++) { - const child = filter[i]; - if (isDynamicFilter(child)) { - return true; + getLayoutProperty(name ) { + if (name === 'visibility') { + return this.visibility; } + + return this._unevaluatedLayout.getValue(name); } - return false; -} + setLayoutProperty(name , value , options = {}) { + if (value !== null && value !== undefined) { + const key = `layers.${this.id}.layout.${name}`; + if (this._validate(validateLayoutProperty, key, name, value, options)) { + return; + } + } -function isRootExpressionDynamic(expression ) { - return expression === 'pitch' || - expression === 'distance-from-center'; -} + if (name === 'visibility') { + this.visibility = value; + return; + } -const dynamicConditionExpressions = new Set([ - 'in', - '==', - '!=', - '>', - '>=', - '<', - '<=', - 'to-boolean' -]); + this._unevaluatedLayout.setValue(name, value); + } -function collapsedExpression(expression ) { - if (dynamicConditionExpressions.has(expression[0])) { + getPaintProperty(name ) { + if (endsWith(name, TRANSITION_SUFFIX)) { + return this._transitionablePaint.getTransition(name.slice(0, -TRANSITION_SUFFIX.length)); + } else { + return this._transitionablePaint.getValue(name); + } + } - for (let i = 1; i < expression.length; i++) { - const param = expression[i]; - if (isDynamicFilter(param)) { - return true; + setPaintProperty(name , value , options = {}) { + if (value !== null && value !== undefined) { + const key = `layers.${this.id}.paint.${name}`; + if (this._validate(validatePaintProperty, key, name, value, options)) { + return false; } } - } - return expression; -} -// Comparison function to sort numbers and strings -function compare(a, b) { - return a < b ? -1 : a > b ? 1 : 0; -} + if (endsWith(name, TRANSITION_SUFFIX)) { + this._transitionablePaint.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), (value ) || undefined); + return false; + } else { + const transitionable = this._transitionablePaint._values[name]; + const isCrossFadedProperty = transitionable.property.specification["property-type"] === 'cross-faded-data-driven'; + const wasDataDriven = transitionable.value.isDataDriven(); + const oldValue = transitionable.value; -function geometryNeeded(filter) { - if (!Array.isArray(filter)) return false; - if (filter[0] === 'within') return true; - for (let index = 1; index < filter.length; index++) { - if (geometryNeeded(filter[index])) return true; - } - return false; -} + this._transitionablePaint.setValue(name, value); + this._handleSpecialPaintPropertyUpdate(name); -function convertFilter(filter ) { - if (!filter) return true; - const op = filter[0]; - if (filter.length <= 1) return (op !== 'any'); - const 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])) : - op === 'within' ? filter : - true; - return converted; -} + const newValue = this._transitionablePaint._values[name].value; + const isDataDriven = newValue.isDataDriven(); -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]; + // if a cross-faded value is changed, we need to make sure the new icons get added to each tile's iconAtlas + // so a call to _updateLayer is necessary, and we return true from this function so it gets called in + // Style#setPaintProperty + return isDataDriven || wasDataDriven || isCrossFadedProperty || this._handleOverridablePaintPropertyUpdate(name, oldValue, newValue); + } } -} -function convertDisjunctionOp(filters ) { - return ['any'].concat(filters.map(convertFilter)); -} + _handleSpecialPaintPropertyUpdate(_ ) { + // No-op; can be overridden by derived classes. + } -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(v => typeof v !== typeof values[0])) { - return ['filter-in-large', property, ['literal', values.sort(compare)]]; - } else { - return ['filter-in-small', property, ['literal', values]]; - } + getProgramIds() { + // No-op; can be overridden by derived classes. + return null; } -} -function convertHasOp(property ) { - switch (property) { - case '$type': - return true; - case '$id': - return [`filter-has-id`]; - default: - return [`filter-has`, property]; + getProgramConfiguration(_ ) { + // No-op; can be overridden by derived classes. + return null; } -} -function convertNegation(filter ) { - return ['!', filter]; -} + // eslint-disable-next-line no-unused-vars + _handleOverridablePaintPropertyUpdate (name , oldValue , newValue ) { + // No-op; can be overridden by derived classes. + return false; + } -function validateFilter(options) { - if (isExpressionFilter(deepUnbundle(options.value))) { - const layerType = deepUnbundle(options.layerType); - return validateExpression(extend$1({}, options, { - expressionContext: 'filter', - // We default to a layerType of `fill` because that points to a non-dynamic filter definition within the style-spec. - valueSpec: options.styleSpec[`filter_${layerType || 'fill'}`] - })); - } else { - return validateNonExpressionFilter(options); + isHidden(zoom ) { + if (this.minzoom && zoom < this.minzoom) return true; + if (this.maxzoom && zoom >= this.maxzoom) return true; + return this.visibility === 'none'; } -} -function validateNonExpressionFilter(options) { - const value = options.value; - const key = options.key; + updateTransitions(parameters ) { + this._transitioningPaint = this._transitionablePaint.transitioned(parameters, this._transitioningPaint); + } - if (getType(value) !== 'array') { - return [new ValidationError(key, value, `array expected, ${getType(value)} found`)]; + hasTransition() { + return this._transitioningPaint.hasTransition(); } - const styleSpec = options.styleSpec; - let type; + recalculate(parameters , availableImages ) { + if (parameters.getCrossfadeParameters) { + this._crossfadeParameters = parameters.getCrossfadeParameters(); + } - let errors = []; + if (this._unevaluatedLayout) { + (this ).layout = this._unevaluatedLayout.possiblyEvaluate(parameters, undefined, availableImages); + } - if (value.length < 1) { - return [new ValidationError(key, value, 'filter array must have at least 1 element')]; + (this ).paint = this._transitioningPaint.possiblyEvaluate(parameters, undefined, availableImages); } - errors = errors.concat(validateEnum({ - key: `${key}[0]`, - value: value[0], - valueSpec: styleSpec.filter_operator, - style: options.style, - styleSpec: options.styleSpec - })); + serialize() { + const 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() + }; - 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 (let 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`)); - } + if (this.visibility) { + output.layout = output.layout || {}; + output.layout.visibility = this.visibility; } - break; - case 'any': - case 'all': - case 'none': - for (let i = 1; i < value.length; i++) { - errors = errors.concat(validateNonExpressionFilter({ - key: `${key}[${i}]`, - value: value[i], - style: options.style, - styleSpec: options.styleSpec - })); - } - break; + return filterObject(output, (value, key) => { + return value !== undefined && + !(key === 'layout' && !Object.keys(value).length) && + !(key === 'paint' && !Object.keys(value).length); + }); + } - 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; - case 'within': - 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 !== 'object') { - errors.push(new ValidationError(`${key}[1]`, value[1], `object expected, ${type} found`)); + _validate(validate , key , name , value , options = {}) { + if (options && options.validate === false) { + return false; } - break; + return emitValidationErrors(this, validate.call(validateStyle, { + key, + layerType: this.type, + objectKey: name, + value, + styleSpec: spec, + // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 + style: {glyphs: true, sprite: true} + })); } - return errors; -} -function validateProperty(options, propertyType) { - const key = options.key; - const style = options.style; - const styleSpec = options.styleSpec; - const value = options.value; - const propertyKey = options.objectKey; - const layerSpec = styleSpec[`${propertyType}_${options.layerType}`]; + is3D() { + return false; + } - if (!layerSpec) return []; + isSky() { + return false; + } - const transitionMatch = propertyKey.match(/^(.*)-transition$/); - if (propertyType === 'paint' && transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) { - return validate({ - key, - value, - valueSpec: styleSpec.transition, - style, - styleSpec - }); + isTileClipped() { + return false; } - const valueSpec = options.valueSpec || layerSpec[propertyKey]; - if (!valueSpec) { - return [new ValidationError(key, value, `unknown property "${propertyKey}"`)]; + hasOffscreenPass() { + return false; } - let tokenMatch; - if (getType(value) === 'string' && supportsPropertyExpression(valueSpec) && !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])} }\`.`)]; + resize() { + // noop } - const errors = []; + isStateDependent() { + for (const property in (this ).paint._values) { + const value = (this ).paint.get(property); + if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { + continue; + } - 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 ((value.value.kind === 'source' || value.value.kind === 'composite') && + value.value.isStateDependent) { + return true; + } } - if (propertyKey === 'text-font' && isFunction(deepUnbundle(value)) && unbundle(value.type) === 'identity') { - errors.push(new ValidationError(key, value, '"text-font" does not support identity functions')); + return false; + } + + compileFilter() { + if (!this._filterCompiled) { + this._featureFilter = createFilter(this.filter); + this._filterCompiled = true; } } - return errors.concat(validate({ - key: options.key, - value, - valueSpec, - style, - styleSpec, - expressionContext: 'property', - propertyType, - propertyKey - })); -} + invalidateCompiledFilter() { + this._filterCompiled = false; + } -function validatePaintProperty(options) { - return validateProperty(options, 'paint'); -} + dynamicFilter() { + return this._featureFilter.dynamicFilter; + } -function validateLayoutProperty(options) { - return validateProperty(options, 'layout'); + dynamicFilterNeedsFeature() { + return this._featureFilter.needFeature; + } } -function validateLayer(options) { - let errors = []; +// - const layer = options.value; - const key = options.key; - const style = options.style; - const styleSpec = options.styleSpec; + - if (!layer.type && !layer.ref) { - errors.push(new ValidationError(key, layer, 'either "type" or "ref" is required')); - } - let type = unbundle(layer.type); - const ref = unbundle(layer.ref); +const circleAttributes = createLayout([ + {name: 'a_pos', components: 2, type: 'Int16'} +], 4); - if (layer.id) { - const layerId = unbundle(layer.id); - for (let i = 0; i < options.arrayIndex; i++) { - const 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__}`)); - } - } - } +const circleGlobeAttributesExt = createLayout([ + {name: 'a_pos_3', components: 3, type: 'Int16'}, + {name: 'a_pos_normal_3', components: 3, type: 'Int16'} +]); - if ('ref' in layer) { - ['type', 'source', 'source-layer', 'filter', 'layout'].forEach((p) => { - if (p in layer) { - errors.push(new ValidationError(key, layer[p], `"${p}" is prohibited for ref layers`)); - } - }); +const {members: members$5, size: size$5, alignment: alignment$5} = circleAttributes; - let parent; +// - style.layers.forEach((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' || type === 'sky')) { - if (!layer.source) { - errors.push(new ValidationError(key, layer, 'missing required property "source"')); - } else { - const source = style.sources && style.sources[layer.source]; - const 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\'.')); - } else if (type === 'line' && layer.paint && layer.paint['line-gradient'] && - (sourceType !== 'geojson' || !source.lineMetrics)) { - errors.push(new ValidationError(key, layer, `layer "${layer.id}" specifies a line-gradient, which requires a GeoJSON source with \`lineMetrics\` enabled.`)); - } + + + + + + + + + +class SegmentVector { + + + + constructor(segments = []) { + this.segments = segments; + } + + prepareSegment(numVertices , layoutVertexArray , indexArray , sortKey ) { + let segment = this.segments[this.segments.length - 1]; + if (numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) warnOnce(`Max vertices per segment is ${SegmentVector.MAX_VERTEX_ARRAY_LENGTH}: bucket requested ${numVertices}`); + if (!segment || segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH || segment.sortKey !== sortKey) { + segment = ({ + vertexOffset: layoutVertexArray.length, + primitiveOffset: indexArray.length, + vertexLength: 0, + primitiveLength: 0 + } ); + if (sortKey !== undefined) segment.sortKey = sortKey; + this.segments.push(segment); } + return segment; } - errors = errors.concat(validateObject({ - key, - value: layer, - valueSpec: styleSpec.layer, - style: options.style, - styleSpec: options.styleSpec, - objectElementValidators: { - '*'() { - 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() { - return validate({ - key: `${key}.type`, - value: layer.type, - valueSpec: styleSpec.layer.type, - style: options.style, - styleSpec: options.styleSpec, - object: layer, - objectKey: 'type' - }); - }, - filter(options) { - return validateFilter(extend$1({layerType: type}, options)); - }, - layout(options) { - return validateObject({ - layer, - key: options.key, - value: options.value, - style: options.style, - styleSpec: options.styleSpec, - objectElementValidators: { - '*'(options) { - return validateLayoutProperty(extend$1({layerType: type}, options)); - } - } - }); - }, - paint(options) { - return validateObject({ - layer, - key: options.key, - value: options.value, - style: options.style, - styleSpec: options.styleSpec, - objectElementValidators: { - '*'(options) { - return validatePaintProperty(extend$1({layerType: type}, options)); - } - } - }); + get() { + return this.segments; + } + + destroy() { + for (const segment of this.segments) { + for (const k in segment.vaos) { + segment.vaos[k].destroy(); } } - })); + } - return errors; + static simpleSegment(vertexOffset , primitiveOffset , vertexLength , primitiveLength ) { + return new SegmentVector([{ + vertexOffset, + primitiveOffset, + vertexLength, + primitiveLength, + vaos: {}, + sortKey: 0 + }]); + } } -function validateString(options) { - const value = options.value; - const key = options.key; - const type = getType(value); +/* + * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit + * addressing of vertex buffers. + * @private + * @readonly + */ +SegmentVector.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1; - if (type !== 'string') { - return [new ValidationError(key, value, `string expected, ${type} found`)]; - } +register(SegmentVector, 'SegmentVector'); - return []; -} +// -const objectElementValidators = { - promoteId: validatePromoteId -}; +// -function validateSource(options) { - const value = options.value; - const key = options.key; - const styleSpec = options.styleSpec; - const style = options.style; +/** + * 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. + * * 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 + */ +var EXTENT = 8192; - if (!value.type) { - return [new ValidationError(key, value, '"type" is required')]; +// + + + +/** + * 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 + * const sw = new mapboxgl.LngLat(-73.9876, 40.7661); + * const ne = new mapboxgl.LngLat(-73.9397, 40.8002); + * const llb = new mapboxgl.LngLatBounds(sw, ne); + */ +class LngLatBounds { + + + + // This constructor is too flexible to type. It should not be so flexible. + constructor(sw , ne ) { + if (!sw) { + // noop + } 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]); + } } - const type = unbundle(value.type); - let errors; + /** + * Set the northeast corner of the bounding box. + * + * @param {LngLatLike} ne A {@link LngLatLike} object describing the northeast corner of the bounding box. + * @returns {LngLatBounds} Returns itself to allow for method chaining. + * @example + * const sw = new mapboxgl.LngLat(-73.9876, 40.7661); + * const ne = new mapboxgl.LngLat(-73.9397, 40.8002); + * const llb = new mapboxgl.LngLatBounds(sw, ne); + * llb.setNorthEast([-73.9397, 42.8002]); + */ + setNorthEast(ne ) { + this._ne = ne instanceof LngLat$1 ? new LngLat$1(ne.lng, ne.lat) : LngLat$1.convert(ne); + return this; + } - switch (type) { - case 'vector': - case 'raster': - case 'raster-dem': - errors = validateObject({ - key, - value, - valueSpec: styleSpec[`source_${type.replace('-', '_')}`], - style: options.style, - styleSpec, - objectElementValidators - }); - return errors; + /** + * Set the southwest corner of the bounding box. + * + * @param {LngLatLike} sw A {@link LngLatLike} object describing the southwest corner of the bounding box. + * @returns {LngLatBounds} Returns itself to allow for method chaining. + * @example + * const sw = new mapboxgl.LngLat(-73.9876, 40.7661); + * const ne = new mapboxgl.LngLat(-73.9397, 40.8002); + * const llb = new mapboxgl.LngLatBounds(sw, ne); + * llb.setSouthWest([-73.9876, 40.2661]); + */ + setSouthWest(sw ) { + this._sw = sw instanceof LngLat$1 ? new LngLat$1(sw.lng, sw.lat) : LngLat$1.convert(sw); + return this; + } - case 'geojson': - errors = validateObject({ - key, - value, - valueSpec: styleSpec.source_geojson, - style, - styleSpec, - objectElementValidators - }); - if (value.cluster) { - for (const prop in value.clusterProperties) { - const [operator, mapExpr] = value.clusterProperties[prop]; - const reduceExpr = typeof operator === 'string' ? [operator, ['accumulated'], ['get', prop]] : operator; + /** + * Extend the bounds to include a given LngLatLike or LngLatBoundsLike. + * + * @param {LngLatLike|LngLatBoundsLike} obj Object to extend to. + * @returns {LngLatBounds} Returns itself to allow for method chaining. + * @example + * const sw = new mapboxgl.LngLat(-73.9876, 40.7661); + * const ne = new mapboxgl.LngLat(-73.9397, 40.8002); + * const llb = new mapboxgl.LngLatBounds(sw, ne); + * llb.extend([-72.9876, 42.2661]); + */ + extend(obj ) { + const sw = this._sw, + ne = this._ne; + let sw2, ne2; - errors.push(...validateExpression({ - key: `${key}.${prop}.map`, - value: mapExpr, - expressionContext: 'cluster-map' - })); - errors.push(...validateExpression({ - key: `${key}.${prop}.reduce`, - value: reduceExpr, - expressionContext: 'cluster-reduce' - })); + if (obj instanceof LngLat$1) { + 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.length === 4 || obj.every(Array.isArray)) { + const lngLatBoundsObj = ((obj ) ); + return this.extend(LngLatBounds.convert(lngLatBoundsObj)); + } else { + const lngLatObj = ((obj ) ); + return this.extend(LngLat$1.convert(lngLatObj)); + } } + return this; } - return errors; - case 'video': - return validateObject({ - key, - value, - valueSpec: styleSpec.source_video, - style, - styleSpec - }); + if (!sw && !ne) { + this._sw = new LngLat$1(sw2.lng, sw2.lat); + this._ne = new LngLat$1(ne2.lng, ne2.lat); - case 'image': - return validateObject({ - key, - value, - valueSpec: styleSpec.source_image, - style, - styleSpec - }); + } 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); + } - case 'canvas': - return [new ValidationError(key, null, `Please use runtime APIs to add canvas sources, rather than including them in stylesheets.`, 'source.canvas')]; + return this; + } + + /** + * Returns the geographical coordinate equidistant from the bounding box's corners. + * + * @returns {LngLat} The bounding box's center. + * @example + * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315} + */ + getCenter() { + return new LngLat$1((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. + * @example + * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.getSouthWest(); // LngLat {lng: -73.9876, lat: 40.7661} + */ + getSouthWest() { return this._sw; } + + /** + * Returns the northeast corner of the bounding box. + * + * @returns {LngLat} The northeast corner of the bounding box. + * @example + * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.getNorthEast(); // LngLat {lng: -73.9397, lat: 40.8002} + */ + getNorthEast() { return this._ne; } + + /** + * Returns the northwest corner of the bounding box. + * + * @returns {LngLat} The northwest corner of the bounding box. + * @example + * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.getNorthWest(); // LngLat {lng: -73.9876, lat: 40.8002} + */ + getNorthWest() { return new LngLat$1(this.getWest(), this.getNorth()); } + + /** + * Returns the southeast corner of the bounding box. + * + * @returns {LngLat} The southeast corner of the bounding box. + * @example + * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.getSouthEast(); // LngLat {lng: -73.9397, lat: 40.7661} + */ + getSouthEast() { return new LngLat$1(this.getEast(), this.getSouth()); } + + /** + * Returns the west edge of the bounding box. + * + * @returns {number} The west edge of the bounding box. + * @example + * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.getWest(); // -73.9876 + */ + getWest() { return this._sw.lng; } + + /** + * Returns the south edge of the bounding box. + * + * @returns {number} The south edge of the bounding box. + * @example + * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.getSouth(); // 40.7661 + */ + getSouth() { return this._sw.lat; } + + /** + * Returns the east edge of the bounding box. + * + * @returns {number} The east edge of the bounding box. + * @example + * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.getEast(); // -73.9397 + */ + getEast() { return this._ne.lng; } + + /** + * Returns the north edge of the bounding box. + * + * @returns {number} The north edge of the bounding box. + * @example + * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.getNorth(); // 40.8002 + */ + getNorth() { return this._ne.lat; } - default: - return validateEnum({ - key: `${key}.type`, - value: value.type, - valueSpec: {values: ['vector', 'raster', 'raster-dem', 'geojson', 'video', 'image']}, - style, - styleSpec - }); + /** + * 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 + * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]] + */ + toArray() { + return [this._sw.toArray(), this._ne.toArray()]; } -} -function validatePromoteId({key, value}) { - if (getType(value) === 'string') { - return validateString({key, value}); - } else { - const errors = []; - for (const prop in value) { - errors.push(...validateString({key: `${key}.${prop}`, value: value[prop]})); - } - return errors; + /** + * 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 + * const 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))" + */ + toString() { + return `LngLatBounds(${this._sw.toString()}, ${this._ne.toString()})`; } -} - -function validateLight(options) { - const light = options.value; - const styleSpec = options.styleSpec; - const lightSpec = styleSpec.light; - const style = options.style; - - let errors = []; - const 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; + /** + * Check if the bounding box is an empty/`null`-type box. + * + * @returns {boolean} True if bounds have been defined, otherwise false. + * @example + * const llb = new mapboxgl.LngLatBounds(); + * llb.isEmpty(); // true + * llb.setNorthEast([-73.9876, 40.7661]); + * llb.setSouthWest([-73.9397, 40.8002]); + * llb.isEmpty(); // false + */ + isEmpty() { + return !(this._sw && this._ne); } - for (const key in light) { - const transitionMatch = key.match(/^(.*)-transition$/); + /** + * Check if the point is within the bounding box. + * + * @param {LngLatLike} lnglat Geographic point to check against. + * @returns {boolean} True if the point is within the bounding box. + * @example + * const llb = new mapboxgl.LngLatBounds( + * new mapboxgl.LngLat(-73.9876, 40.7661), + * new mapboxgl.LngLat(-73.9397, 40.8002) + * ); + * + * const ll = new mapboxgl.LngLat(-73.9567, 40.7789); + * + * console.log(llb.contains(ll)); // = true + */ + contains(lnglat ) { + const {lng, lat} = LngLat$1.convert(lnglat); - if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) { - errors = errors.concat(validate({ - key, - value: light[key], - valueSpec: styleSpec.transition, - style, - styleSpec - })); - } else if (lightSpec[key]) { - errors = errors.concat(validate({ - key, - value: light[key], - valueSpec: lightSpec[key], - style, - styleSpec - })); - } else { - errors = errors.concat([new ValidationError(key, light[key], `unknown property "${key}"`)]); + const containsLatitude = this._sw.lat <= lat && lat <= this._ne.lat; + let containsLongitude = this._sw.lng <= lng && lng <= this._ne.lng; + if (this._sw.lng > this._ne.lng) { // wrapped coordinates + containsLongitude = this._sw.lng >= lng && lng >= this._ne.lng; } + + return containsLatitude && containsLongitude; } - return errors; + /** + * 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 + * const arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]]; + * const llb = mapboxgl.LngLatBounds.convert(arr); + * console.log(llb); // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}} + */ + static convert(input ) { + if (!input || input instanceof LngLatBounds) return input; + return new LngLatBounds(input); + } } -function validateTerrain(options) { - const terrain = options.value; - const key = options.key; - const style = options.style; - const styleSpec = options.styleSpec; - const terrainSpec = styleSpec.terrain; - let errors = []; +// - const rootType = getType(terrain); - if (terrain === undefined) { - return errors; - } else if (rootType !== 'object') { - errors = errors.concat([new ValidationError('terrain', terrain, `object expected, ${rootType} found`)]); - return errors; - } +/* +* Approximate radius of the earth in meters. +* Uses the WGS-84 approximation. The radius at the equator is ~6378137 and at the poles is ~6356752. https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84 +* 6371008.8 is one published "average radius" see https://en.wikipedia.org/wiki/Earth_radius#Mean_radius, or ftp://athena.fsv.cvut.cz/ZFG/grs80-Moritz.pdf p.4 +*/ +const earthRadius = 6371008.8; - for (const key in terrain) { - const transitionMatch = key.match(/^(.*)-transition$/); +/** + * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees. + * These coordinates use longitude, latitude coordinate order (as opposed to latitude, longitude) + * to match the [GeoJSON specification](https://datatracker.ietf.org/doc/html/rfc7946#section-4), + * which is equivalent to the OGC:CRS84 coordinate reference system. + * + * 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 + * const ll = new mapboxgl.LngLat(-123.9749, 40.7736); + * console.log(ll.lng); // = -123.9749 + * @see [Example: Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/) + * @see [Example: Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) + * @see [Example: Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) + * @see [Example: Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) + */ +class LngLat { + + - if (transitionMatch && terrainSpec[transitionMatch[1]] && terrainSpec[transitionMatch[1]].transition) { - errors = errors.concat(validate({ - key, - value: terrain[key], - valueSpec: styleSpec.transition, - style, - styleSpec - })); - } else if (terrainSpec[key]) { - errors = errors.concat(validate({ - key, - value: terrain[key], - valueSpec: terrainSpec[key], - style, - styleSpec - })); - } else { - errors = errors.concat([new ValidationError(key, terrain[key], `unknown property "${key}"`)]); + constructor(lng , lat ) { + if (isNaN(lng) || isNaN(lat)) { + throw new Error(`Invalid LngLat object: (${lng}, ${lat})`); } - } - - if (!terrain.source) { - errors.push(new ValidationError(key, terrain, `terrain is missing required property "source"`)); - } else { - const source = style.sources && style.sources[terrain.source]; - const sourceType = source && unbundle(source.type); - if (!source) { - errors.push(new ValidationError(key, terrain.source, `source "${terrain.source}" not found`)); - } else if (sourceType !== 'raster-dem') { - errors.push(new ValidationError(key, terrain.source, `terrain cannot be used with a source of type ${sourceType}, it only be used with a "raster-dem" source type`)); + 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'); } } - return errors; -} + /** + * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180). + * + * @returns {LngLat} The wrapped `LngLat` object. + * @example + * const ll = new mapboxgl.LngLat(286.0251, 40.7736); + * const wrapped = ll.wrap(); + * console.log(wrapped.lng); // = -73.9749 + */ + wrap() { + return new LngLat(wrap(this.lng, -180, 180), this.lat); + } -function validateFog(options) { - const fog = options.value; - const style = options.style; - const styleSpec = options.styleSpec; - const fogSpec = styleSpec.fog; - let errors = []; + /** + * Returns the coordinates represented as an array of two numbers. + * + * @returns {Array} The coordinates represeted as an array of longitude and latitude. + * @example + * const ll = new mapboxgl.LngLat(-73.9749, 40.7736); + * ll.toArray(); // = [-73.9749, 40.7736] + */ + toArray() { + return [this.lng, this.lat]; + } - const rootType = getType(fog); - if (fog === undefined) { - return errors; - } else if (rootType !== 'object') { - errors = errors.concat([new ValidationError('fog', fog, `object expected, ${rootType} found`)]); - return errors; + /** + * Returns the coordinates represent as a string. + * + * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`. + * @example + * const ll = new mapboxgl.LngLat(-73.9749, 40.7736); + * ll.toString(); // = "LngLat(-73.9749, 40.7736)" + */ + toString() { + return `LngLat(${this.lng}, ${this.lat})`; } - for (const key in fog) { - const transitionMatch = key.match(/^(.*)-transition$/); + /** + * Returns the approximate distance between a pair of coordinates in meters. + * Uses the Haversine Formula (from R.W. Sinnott, "Virtues of the Haversine", Sky and Telescope, vol. 68, no. 2, 1984, p. 159). + * + * @param {LngLat} lngLat Coordinates to compute the distance to. + * @returns {number} Distance in meters between the two coordinates. + * @example + * const newYork = new mapboxgl.LngLat(-74.0060, 40.7128); + * const losAngeles = new mapboxgl.LngLat(-118.2437, 34.0522); + * newYork.distanceTo(losAngeles); // = 3935751.690893987, "true distance" using a non-spherical approximation is ~3966km + */ + distanceTo(lngLat ) { + const rad = Math.PI / 180; + const lat1 = this.lat * rad; + const lat2 = lngLat.lat * rad; + const a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((lngLat.lng - this.lng) * rad); - if (transitionMatch && fogSpec[transitionMatch[1]] && fogSpec[transitionMatch[1]].transition) { - errors = errors.concat(validate({ - key, - value: fog[key], - valueSpec: styleSpec.transition, - style, - styleSpec - })); - } else if (fogSpec[key]) { - errors = errors.concat(validate({ - key, - value: fog[key], - valueSpec: fogSpec[key], - style, - styleSpec - })); - } else { - errors = errors.concat([new ValidationError(key, fog[key], `unknown property "${key}"`)]); - } + const maxMeters = earthRadius * Math.acos(Math.min(a, 1)); + return maxMeters; } - return errors; -} - -// + /** + * Returns a `LngLatBounds` from the coordinates extended by a given `radius`. The returned `LngLatBounds` completely contains the `radius`. + * + * @param {number} [radius=0] Distance in meters from the coordinates to extend the bounds. + * @returns {LngLatBounds} A new `LngLatBounds` object representing the coordinates extended by the `radius`. + * @example + * const ll = new mapboxgl.LngLat(-73.9749, 40.7736); + * ll.toBounds(100).toArray(); // = [[-73.97501862141328, 40.77351016847229], [-73.97478137858673, 40.77368983152771]] + */ + toBounds(radius = 0) { + const earthCircumferenceInMetersAtEquator = 40075017; + const latAccuracy = 360 * radius / earthCircumferenceInMetersAtEquator, + lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); -function validateFormatted(options ) { - if (validateString(options).length === 0) { - return []; + return new LngLatBounds(new LngLat(this.lng - lngAccuracy, this.lat - latAccuracy), + new LngLat(this.lng + lngAccuracy, this.lat + latAccuracy)); } - return validateExpression(options); + /** + * Converts an array of two numbers or an object with `lng` and `lat` or `lon` and `lat` properties + * to a `LngLat` object. + * + * If a `LngLat` object is passed in, the function returns it unchanged. + * + * @param {LngLatLike} input An array of two numbers or object to convert, or a `LngLat` object to return. + * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object. + * @example + * const arr = [-73.9749, 40.7736]; + * const ll = mapboxgl.LngLat.convert(arr); + * console.log(ll); // = LngLat {lng: -73.9749, lat: 40.7736} + */ + static 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( + // flow can't refine this to have one of lng or lat, so we have to cast to any + Number('lng' in input ? (input ).lng : (input ).lon), + Number(input.lat) + ); + } + throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , 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` or `lon` and `lat` properties. + * + * @typedef {LngLat | {lng: number, lat: number} | {lon: number, lat: number} | [number, number]} LngLatLike + * @example + * const v1 = new mapboxgl.LngLat(-122.420679, 37.772537); + * const v2 = [-122.420679, 37.772537]; + * const v3 = {lon: -122.420679, lat: 37.772537}; + */ + + +var LngLat$1 = LngLat; + // + -function validateImage(options ) { - if (validateString(options).length === 0) { - return []; - } +/* + * The average circumference of the world in meters. + */ +const earthCircumference = 2 * Math.PI * earthRadius; // meters - return validateExpression(options); +/* + * The circumference at a line of latitude in meters. + */ +function circumferenceAtLatitude(latitude ) { + return earthCircumference * Math.cos(latitude * Math.PI / 180); } -function validateProjection(options) { - const projection = options.value; - const styleSpec = options.styleSpec; - const projectionSpec = styleSpec.projection; - const style = options.style; +function mercatorXfromLng(lng ) { + return (180 + lng) / 360; +} - let errors = []; +function mercatorYfromLat(lat ) { + return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360; +} - const rootType = getType(projection); +function mercatorZfromAltitude(altitude , lat ) { + return altitude / circumferenceAtLatitude(lat); +} - if (rootType === 'object') { - for (const key in projection) { - errors = errors.concat(validate({ - key, - value: projection[key], - valueSpec: projectionSpec[key], - style, - styleSpec - })); - } - } else if (rootType !== 'string') { - errors = errors.concat([new ValidationError('projection', projection, `object or string expected, ${rootType} found`)]); - } +function lngFromMercatorX(x ) { + return x * 360 - 180; +} - return errors; +function latFromMercatorY(y ) { + const y2 = 180 - y * 360; + return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90; } -const VALIDATORS = { - '*'() { - return []; - }, - 'array': validateArray, - 'boolean': validateBoolean, - 'number': validateNumber, - 'color': validateColor, - 'constants': validateConstants, - 'enum': validateEnum, - 'filter': validateFilter, - 'function': validateFunction, - 'layer': validateLayer, - 'object': validateObject, - 'source': validateSource, - 'light': validateLight, - 'terrain': validateTerrain, - 'fog': validateFog, - 'string': validateString, - 'formatted': validateFormatted, - 'resolvedImage': validateImage, - 'projection': validateProjection -}; +function altitudeFromMercatorZ(z , y ) { + return z * circumferenceAtLatitude(latFromMercatorY(y)); +} -// 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. +const MAX_MERCATOR_LATITUDE = 85.051129; -function validate(options) { - const value = options.value; - const valueSpec = options.valueSpec; - const styleSpec = options.styleSpec; +/** + * Determine the Mercator scale factor for a given latitude, see + * https://en.wikipedia.org/wiki/Mercator_projection#Scale_factor + * + * At the equator the scale factor will be 1, which increases at higher latitudes. + * + * @param {number} lat Latitude + * @returns {number} scale factor + * @private + */ +function mercatorScale(lat ) { + return 1 / Math.cos(lat * Math.PI / 180); +} - if (valueSpec.expression && isFunction(unbundle(value))) { - return validateFunction(options); +/** + * A `MercatorCoordinate` object represents a projected three dimensional position. + * + * `MercatorCoordinate` uses the web mercator projection ([EPSG:3857](https://epsg.io/3857)) with slightly different units: + * - the size of 1 unit is the width of the projected world instead of the "mercator meter" + * - the origin of the coordinate space is at the north-west corner instead of the middle. + * + * For example, `MercatorCoordinate(0, 0, 0)` is the north-west corner of the mercator world and + * `MercatorCoordinate(1, 1, 0)` is the south-east corner. If you are familiar with + * [vector tiles](https://github.com/mapbox/vector-tile-spec) it may be helpful to think + * of the coordinate space as the `0/0/0` tile with an extent of `1`. + * + * The `z` dimension of `MercatorCoordinate` is conformal. A cube in the mercator coordinate space would be rendered as a cube. + * + * @param {number} x The x component of the position. + * @param {number} y The y component of the position. + * @param {number} z The z component of the position. + * @example + * const nullIsland = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0); + * + * @see [Example: Add a custom style layer](https://www.mapbox.com/mapbox-gl-js/example/custom-style-layer/) + */ +class MercatorCoordinate { + + + - } else if (valueSpec.expression && isExpression(deepUnbundle(value))) { - return validateExpression(options); + constructor(x , y , z = 0) { + this.x = +x; + this.y = +y; + this.z = +z; + } - } else if (valueSpec.type && VALIDATORS[valueSpec.type]) { - return VALIDATORS[valueSpec.type](options); + /** + * Project a `LngLat` to a `MercatorCoordinate`. + * + * @param {LngLatLike} lngLatLike The location to project. + * @param {number} altitude The altitude in meters of the position. + * @returns {MercatorCoordinate} The projected mercator coordinate. + * @example + * const coord = mapboxgl.MercatorCoordinate.fromLngLat({lng: 0, lat: 0}, 0); + * console.log(coord); // MercatorCoordinate(0.5, 0.5, 0) + */ + static fromLngLat(lngLatLike , altitude = 0) { + const lngLat = LngLat$1.convert(lngLatLike); - } else { - const valid = validateObject(extend$1({}, options, { - valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec - })); - return valid; + return new MercatorCoordinate( + mercatorXfromLng(lngLat.lng), + mercatorYfromLat(lngLat.lat), + mercatorZfromAltitude(altitude, lngLat.lat)); } -} - -function validateGlyphsURL(options) { - const value = options.value; - const key = options.key; - const errors = validateString(options); - if (errors.length) return errors; + /** + * Returns the `LngLat` for the coordinate. + * + * @returns {LngLat} The `LngLat` object. + * @example + * const coord = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0); + * const lngLat = coord.toLngLat(); // LngLat(0, 0) + */ + toLngLat() { + return new LngLat$1( + lngFromMercatorX(this.x), + latFromMercatorY(this.y)); + } - if (value.indexOf('{fontstack}') === -1) { - errors.push(new ValidationError(key, value, '"glyphs" url must include a "{fontstack}" token')); + /** + * Returns the altitude in meters of the coordinate. + * + * @returns {number} The altitude in meters. + * @example + * const coord = new mapboxgl.MercatorCoordinate(0, 0, 0.02); + * coord.toAltitude(); // 6914.281956295339 + */ + toAltitude() { + return altitudeFromMercatorZ(this.z, this.y); } - if (value.indexOf('{range}') === -1) { - errors.push(new ValidationError(key, value, '"glyphs" url must include a "{range}" token')); + /** + * Returns the distance of 1 meter in `MercatorCoordinate` units at this latitude. + * + * For coordinates in real world units using meters, this naturally provides the scale + * to transform into `MercatorCoordinate`s. + * + * @returns {number} Distance of 1 meter in `MercatorCoordinate` units. + * @example + * // Calculate a new MercatorCoordinate that is 150 meters west of the other coord. + * const coord = new mapboxgl.MercatorCoordinate(0.5, 0.25, 0); + * const offsetInMeters = 150; + * const offsetInMercatorCoordinateUnits = offsetInMeters * coord.meterInMercatorCoordinateUnits(); + * const westCoord = new mapboxgl.MercatorCoordinate(coord.x - offsetInMercatorCoordinateUnits, coord.y, coord.z); + */ + meterInMercatorCoordinateUnits() { + // 1 meter / circumference at equator in meters * Mercator projection scale factor at this latitude + return 1 / earthCircumference * mercatorScale(latFromMercatorY(this.y)); } - return errors; } -/** - * 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 = spec) { - - let errors = []; - - errors = errors.concat(validate({ - key: '', - value: style, - valueSpec: styleSpec.$root, - styleSpec, - style, - objectElementValidators: { - glyphs: validateGlyphsURL, - '*'() { - return []; - } - } - })); - - if (style.constants) { - errors = errors.concat(validateConstants({ - key: 'constants', - value: style.constants, - style, - styleSpec - })); - } +// - return sortErrors(errors); +function pointToLineDist(px, py, ax, ay, bx, by) { + const dx = ax - bx; + const dy = ay - by; + return Math.abs((ay - py) * dx - (ax - px) * dy) / Math.hypot(dx, dy); } -validateStyleMin.source = wrapCleanErrors(validateSource); -validateStyleMin.light = wrapCleanErrors(validateLight); -validateStyleMin.terrain = wrapCleanErrors(validateTerrain); -validateStyleMin.fog = wrapCleanErrors(validateFog); -validateStyleMin.layer = wrapCleanErrors(validateLayer); -validateStyleMin.filter = wrapCleanErrors(validateFilter); -validateStyleMin.paintProperty = wrapCleanErrors(validatePaintProperty); -validateStyleMin.layoutProperty = wrapCleanErrors(validateLayoutProperty); +function addResampled(resampled, mx0, my0, mx2, my2, start, end, reproject, tolerance) { + const mx1 = (mx0 + mx2) / 2; + const my1 = (my0 + my2) / 2; + const mid = new pointGeometry(mx1, my1); + reproject(mid); + const err = pointToLineDist(mid.x, mid.y, start.x, start.y, end.x, end.y); -function sortErrors(errors) { - return [].concat(errors).sort((a, b) => { - return a.line - b.line; - }); -} + // if reprojected midPoint is too far from geometric midpoint, recurse into two halves + if (err >= tolerance) { + // we're very unlikely to hit max call stack exceeded here, + // but we might want to safeguard against it in the future + addResampled(resampled, mx0, my0, mx1, my1, start, mid, reproject, tolerance); + addResampled(resampled, mx1, my1, mx2, my2, mid, end, reproject, tolerance); -function wrapCleanErrors(inner) { - return function(...args) { - return sortErrors(inner.apply(this, args)); - }; + } else { // otherwise, just add the point + resampled.push(end); + } } -// - - +// reproject and resample a line, adding point where necessary for lines that become curves; +// note that this operation is mutable (modifying original points) for performance +function resample$1(line , reproject , tolerance ) { + let prev = line[0]; + let mx0 = prev.x; + let my0 = prev.y; + reproject(prev); + const resampled = [prev]; - - - - - + for (let i = 1; i < line.length; i++) { + const point = line[i]; + const {x, y} = point; + reproject(point); + addResampled(resampled, mx0, my0, x, y, prev, point, reproject, tolerance); + mx0 = x; + my0 = y; + prev = point; + } - + return resampled; +} - - - - - - - - - - - +function addResampledPred(resampled , a , b , reproject, pred) { + const split = pred(a, b); -const validateStyle = (validateStyleMin ); + // if the predicate condition is met, recurse into two halves + if (split) { + const mid = a.add(b).mult(0.5); + reproject(mid); -const validateSource$1 = validateStyle.source; -const validateLight$1 = validateStyle.light; -const validateTerrain$1 = validateStyle.terrain; -const validateFog$1 = validateStyle.fog; -const validateFilter$1 = validateStyle.filter; -const validatePaintProperty$1 = validateStyle.paintProperty; -const validateLayoutProperty$1 = validateStyle.layoutProperty; + addResampledPred(resampled, a, mid, reproject, pred); + addResampledPred(resampled, mid, b, reproject, pred); -function emitValidationErrors(emitter , errors ) { - let hasErrors = false; - if (errors && errors.length) { - for (const error of errors) { - emitter.fire(new ErrorEvent(new Error(error.message))); - hasErrors = true; - } + } else { + resampled.push(b); } - return hasErrors; } -'use strict'; - -var gridIndex = GridIndex; +function resamplePred(line , reproject , predicate ) { + let prev = line[0]; + reproject(prev); + const resampled = [prev]; -var NUM_PARAMS = 3; + for (let i = 1; i < line.length; i++) { + const point = line[i]; + reproject(point); + addResampledPred(resampled, prev, point, reproject, predicate); + prev = point; + } -function GridIndex(extent, n, padding) { - var cells = this.cells = []; + return resampled; +} - 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; +// These bounds define the minimum and maximum supported coordinate values. +// While visible coordinates are within [0, EXTENT], tiles may theoretically +// contain coordinates within [-Infinity, Infinity]. Our range is limited by the +// number of bits used to represent the coordinate. +const BITS = 15; +const MAX = Math.pow(2, BITS - 1) - 1; +const MIN = -MAX - 1; - } else { - this.d = n + 2 * padding; - for (var i = 0; i < this.d * this.d; i++) { - cells.push([]); - } - this.keys = []; - this.bboxes = []; +function preparePoint(point , scale ) { + const x = Math.round(point.x * scale); + const y = Math.round(point.y * scale); + point.x = clamp(x, MIN, MAX); + point.y = clamp(y, MIN, MAX); + if (x < point.x || x > point.x + 1 || y < point.y || y > point.y + 1) { + // warn when exceeding allowed extent except for the 1-px-off case + // https://github.com/mapbox/mapbox-gl-js/issues/8992 + warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size'); } - - 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; + return point; } +// a subset of VectorTileGeometry + + + + + -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.'; -}; +/** + * Loads a geometry from a VectorTileFeature and scales it to the common extent + * used internally. + * @param {VectorTileFeature} feature + * @private + */ +function loadGeometry(feature , canonical , tileTransform ) { + const geometry = feature.loadGeometry(); + const extent = feature.extent; + const extentScale = EXTENT / extent; -GridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) { - this.cells[cellIndex].push(uid); -}; + if (canonical && tileTransform && tileTransform.projection.isReprojectedInTileSpace) { + const z2 = 1 << canonical.z; + const {scale, x, y, projection} = tileTransform; -GridIndex.prototype.query = function(x1, y1, x2, y2, intersectionTest) { - var min = this.min; - var max = this.max; - if (x1 <= min && y1 <= min && max <= x2 && max <= y2 && !intersectionTest) { - // 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); + const reproject = (p) => { + const lng = lngFromMercatorX((canonical.x + p.x / extent) / z2); + const lat = latFromMercatorY((canonical.y + p.y / extent) / z2); + const p2 = projection.project(lng, lat); + p.x = (p2.x * scale - x) * extent; + p.y = (p2.y * scale - y) * extent; + }; - } else { - var result = []; - var seenUids = {}; - this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids, intersectionTest); - return result; - } -}; + for (let i = 0; i < geometry.length; i++) { + if (feature.type !== 1) { + geometry[i] = resample$1(geometry[i], reproject, 1); // resample lines and polygons -GridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids, intersectionTest) { - 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 (intersectionTest ? - intersectionTest(bboxes[offset + 0], bboxes[offset + 1], bboxes[offset + 2], bboxes[offset + 3]) : - ((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; + } else { // points + const line = []; + for (const p of geometry[i]) { + // filter out point features outside tile boundaries now; it'd be harder to do later + // when the coords are reprojected and no longer axis-aligned; ideally this would happen + // or not depending on how the geometry is used, but we forego the complexity for now + if (p.x < 0 || p.x >= extent || p.y < 0 || p.y >= extent) continue; + reproject(p); + line.push(p); } + geometry[i] = line; } } } -}; -GridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2, intersectionTest) { - 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 (intersectionTest && !intersectionTest( - this._convertFromCellCoord(x), - this._convertFromCellCoord(y), - this._convertFromCellCoord(x + 1), - this._convertFromCellCoord(y + 1))) continue; - if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, intersectionTest)) return; + for (const line of geometry) { + for (const p of line) { + preparePoint(p, extentScale); } } -}; - -GridIndex.prototype._convertFromCellCoord = function(x) { - return (x - this.padding) / this.scale; -}; - -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; -}; + return geometry; +} // -const {ImageData, ImageBitmap} = window$1; - - - // eslint-disable-line - - - - - - - - - - - - - - - - + - - - - - - - - + + - - - -const 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(). - * + * Construct a new feature based on a VectorTileFeature for expression evaluation, the geometry of which + * will be loaded based on necessity. + * @param {VectorTileFeature} feature + * @param {boolean} needGeometry * @private */ -function register (name , klass , options = {}) { - assert_1(!registry[name], `${name} is already registered.`); - (Object.defineProperty )(klass, '_classRegistryKey', { - value: name, - writeable: false - }); - registry[name] = { - klass, - omit: options.omit || [], - shallow: options.shallow || [] - }; +function toEvaluationFeature(feature , needGeometry ) { + return {type: feature.type, + id: feature.id, + properties:feature.properties, + geometry: needGeometry ? loadGeometry(feature) : []}; } -register('Object', Object); - - - -gridIndex.serialize = function serialize(grid , transferables ) { - const buffer = grid.toArrayBuffer(); - if (transferables) { - transferables.push(buffer); - } - return {buffer}; -}; - -gridIndex.deserialize = function deserialize(serialized ) { - return new gridIndex(serialized.buffer); -}; -register('Grid', gridIndex); - -register('Color', Color); -register('Error', Error); -register('ResolvedImage', ResolvedImage); - -register('StylePropertyFunction', StylePropertyFunction); -register('StyleExpression', StyleExpression, {omit: ['_evaluator']}); +// -register('ZoomDependentExpression', ZoomDependentExpression); -register('ZoomConstantExpression', ZoomConstantExpression); -register('CompoundExpression', CompoundExpression, {omit: ['_evaluate']}); -for (const name in expressions) { - if ((expressions[name] )._classRegistryKey) continue; - register(`Expression_${name}`, expressions[name]); -} + + + + + + + + + + + + + + + + + + + + -function isArrayBuffer(val ) { - return val && typeof ArrayBuffer !== 'undefined' && - (val instanceof ArrayBuffer || (val.constructor && val.constructor.name === 'ArrayBuffer')); +function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) { + layoutVertexArray.emplaceBack( + (x * 2) + ((extrudeX + 1) / 2), + (y * 2) + ((extrudeY + 1) / 2)); } -function isImageBitmap(val ) { - return ImageBitmap && - val instanceof ImageBitmap; +function addGlobeExtVertex$1(vertexArray , pos , normal ) { + const encode = 1 << 14; + vertexArray.emplaceBack( + pos.x, pos.y, pos.z, + normal[0] * encode, normal[1] * encode, normal[2] * encode); } /** - * 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().) + * 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 */ -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; - } +class CircleBucket { + + + + + + + - if (isArrayBuffer(input) || isImageBitmap(input)) { - if (transferables) { - transferables.push(((input ) )); - } - return input; - } + + + + - if (ArrayBuffer.isView(input)) { - const view = (input ); - if (transferables) { - transferables.push(view.buffer); - } - return view; - } + + + + + + + + + + constructor(options ) { + this.zoom = options.zoom; + this.overscaling = options.overscaling; + this.layers = options.layers; + this.layerIds = this.layers.map(layer => layer.id); + this.index = options.index; + this.hasPattern = false; + this.projection = options.projection; - if (input instanceof ImageData) { - if (transferables) { - transferables.push(input.data.buffer); - } - return input; + this.layoutVertexArray = new StructArrayLayout2i4(); + this.indexArray = new StructArrayLayout3ui6(); + this.segments = new SegmentVector(); + this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom); + this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id); } - if (Array.isArray(input)) { - const serialized = []; - for (const item of input) { - serialized.push(serialize(item, transferables)); - } - return serialized; - } + populate(features , options , canonical , tileTransform ) { + const styleLayer = this.layers[0]; + const bucketFeatures = []; + let circleSortKey = null; - if (typeof input === 'object') { - const klass = (input.constructor ); - const name = klass._classRegistryKey; - if (!name) { - throw new Error(`can't serialize object of unregistered class`); + // Heatmap layers are handled in this bucket and have no evaluated properties, so we check our access + if (styleLayer.type === 'circle') { + circleSortKey = ((styleLayer ) ).layout.get('circle-sort-key'); } - assert_1(registry[name]); - const properties = 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. - (klass.serialize(input, transferables) ) : {}; + for (const {feature, id, index, sourceLayerIndex} of features) { + const needGeometry = this.layers[0]._featureFilter.needGeometry; + const evaluationFeature = toEvaluationFeature(feature, needGeometry); + + if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue; + + const sortKey = circleSortKey ? + circleSortKey.evaluate(evaluationFeature, {}, canonical) : + undefined; + + const bucketFeature = { + id, + properties: feature.properties, + type: feature.type, + sourceLayerIndex, + index, + geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform), + patterns: {}, + sortKey + }; + + bucketFeatures.push(bucketFeature); - if (!klass.serialize) { - for (const 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; - const property = (input )[key]; - properties[key] = registry[name].shallow.indexOf(key) >= 0 ? - property : - serialize(property, transferables); - } - if (input instanceof Error) { - properties.message = input.message; - } - } else { - // make sure statically serialized object survives transfer of $name property - assert_1(!transferables || properties !== transferables[transferables.length - 1]); } - if (properties.$name) { - throw new Error('$name property is reserved for worker serialization logic.'); + if (circleSortKey) { + bucketFeatures.sort((a, b) => { + // a.sortKey is always a number when in use + return ((a.sortKey ) ) - ((b.sortKey ) ); + }); } - if (name !== 'Object') { - properties.$name = name; + + let globeProjection = null; + + if (tileTransform.projection.name === 'globe') { + // Extend vertex attributes if the globe projection is enabled + this.globeExtVertexArray = new CircleGlobeExtArray(); + globeProjection = tileTransform.projection; } - return properties; - } + for (const bucketFeature of bucketFeatures) { + const {geometry, index, sourceLayerIndex} = bucketFeature; + const feature = features[index].feature; - throw new Error(`can't serialize object of type ${typeof input}`); -} + this.addFeature(bucketFeature, geometry, index, options.availableImages, canonical, globeProjection); + options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index); + } + } -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 || - isArrayBuffer(input) || - isImageBitmap(input) || - ArrayBuffer.isView(input) || - input instanceof ImageData) { - return input; + update(states , vtLayer , availableImages , imagePositions ) { + if (!this.stateDependentLayers.length) return; + this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, availableImages, imagePositions); } - if (Array.isArray(input)) { - return input.map(deserialize); + isEmpty() { + return this.layoutVertexArray.length === 0; } - if (typeof input === 'object') { - const name = (input ).$name || 'Object'; + uploadPending() { + return !this.uploaded || this.programConfigurations.needsUpload; + } - const {klass} = registry[name]; - if (!klass) { - throw new Error(`can't deserialize unregistered class ${name}`); - } + upload(context ) { + if (!this.uploaded) { + this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, circleAttributes.members); + this.indexBuffer = context.createIndexBuffer(this.indexArray); - if (klass.deserialize) { - return (klass.deserialize )(input); + if (this.globeExtVertexArray) { + this.globeExtVertexBuffer = context.createVertexBuffer(this.globeExtVertexArray, circleGlobeAttributesExt.members); + } } + this.programConfigurations.upload(context); + this.uploaded = true; + } - const result = Object.create(klass.prototype); - - for (const key of Object.keys(input)) { - if (key === '$name') continue; - const value = (input )[key]; - result[key] = registry[name].shallow.indexOf(key) >= 0 ? value : deserialize(value); + destroy() { + if (!this.layoutVertexBuffer) return; + this.layoutVertexBuffer.destroy(); + this.indexBuffer.destroy(); + this.programConfigurations.destroy(); + this.segments.destroy(); + if (this.globeExtVertexBuffer) { + this.globeExtVertexBuffer.destroy(); } - - return result; } - throw new Error(`can't deserialize object of type ${typeof input}`); -} + addFeature(feature , geometry , index , availableImages , canonical , projection ) { + for (const ring of geometry) { + for (const point of ring) { + const x = point.x; + const y = point.y; -// + // Do not include points that are outside the tile boundaries. + if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) continue; -class ZoomHistory { - - - - - + // this geometry will be of the Point type, and we'll derive + // two triangles from it. + // + // ┌─────────┐ + // │ 3 2 │ + // │ │ + // │ 0 1 │ + // └─────────┘ - constructor() { - this.first = true; - } + if (projection) { + const projectedPoint = projection.projectTilePoint(x, y, canonical); + const normal = projection.upVector(canonical, x, y); + const array = this.globeExtVertexArray; - update(z , now ) { - const floorZ = Math.floor(z); + addGlobeExtVertex$1(array, projectedPoint, normal); + addGlobeExtVertex$1(array, projectedPoint, normal); + addGlobeExtVertex$1(array, projectedPoint, normal); + addGlobeExtVertex$1(array, projectedPoint, normal); + } + const segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray, feature.sortKey); + const index = segment.vertexLength; - if (this.first) { - this.first = false; - this.lastIntegerZoom = floorZ; - this.lastIntegerZoomTime = 0; - this.lastZoom = z; - this.lastFloorZoom = floorZ; - return true; - } + addCircleVertex(this.layoutVertexArray, x, y, -1, -1); + addCircleVertex(this.layoutVertexArray, x, y, 1, -1); + addCircleVertex(this.layoutVertexArray, x, y, 1, 1); + addCircleVertex(this.layoutVertexArray, x, y, -1, 1); - if (this.lastFloorZoom > floorZ) { - this.lastIntegerZoom = floorZ + 1; - this.lastIntegerZoomTime = now; - } else if (this.lastFloorZoom < floorZ) { - this.lastIntegerZoom = floorZ; - this.lastIntegerZoomTime = now; - } + this.indexArray.emplaceBack(index, index + 1, index + 2); + this.indexArray.emplaceBack(index, index + 2, index + 3); - if (z !== this.lastZoom) { - this.lastZoom = z; - this.lastFloorZoom = floorZ; - return true; + segment.vertexLength += 4; + segment.primitiveLength += 2; + } } - return false; + this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, {}, availableImages, canonical); } } -// - -// The following table comes from . -// Keep it synchronized with . +register(CircleBucket, 'CircleBucket', {omit: ['layers']}); - +// -const unicodeBlockLookup = { - // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F, - 'Latin-1 Supplement': (char) => 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': (char) => char >= 0x0600 && char <= 0x06FF, - //'Syriac': (char) => char >= 0x0700 && char <= 0x074F, - 'Arabic Supplement': (char) => 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': (char) => 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': (char) => 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': (char) => 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': (char) => 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, - // 'Georgian Extended': (char) => char >= 0x1C90 && char <= 0x1CBF, - // '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': (char) => 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': (char) => char >= 0x2100 && char <= 0x214F, - 'Number Forms': (char) => char >= 0x2150 && char <= 0x218F, - // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF, - // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF, - 'Miscellaneous Technical': (char) => char >= 0x2300 && char <= 0x23FF, - 'Control Pictures': (char) => char >= 0x2400 && char <= 0x243F, - 'Optical Character Recognition': (char) => char >= 0x2440 && char <= 0x245F, - 'Enclosed Alphanumerics': (char) => char >= 0x2460 && char <= 0x24FF, - // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F, - // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F, - 'Geometric Shapes': (char) => char >= 0x25A0 && char <= 0x25FF, - 'Miscellaneous Symbols': (char) => 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': (char) => 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': (char) => char >= 0x2E80 && char <= 0x2EFF, - 'Kangxi Radicals': (char) => char >= 0x2F00 && char <= 0x2FDF, - 'Ideographic Description Characters': (char) => char >= 0x2FF0 && char <= 0x2FFF, - 'CJK Symbols and Punctuation': (char) => char >= 0x3000 && char <= 0x303F, - 'Hiragana': (char) => char >= 0x3040 && char <= 0x309F, - 'Katakana': (char) => char >= 0x30A0 && char <= 0x30FF, - 'Bopomofo': (char) => char >= 0x3100 && char <= 0x312F, - 'Hangul Compatibility Jamo': (char) => char >= 0x3130 && char <= 0x318F, - 'Kanbun': (char) => char >= 0x3190 && char <= 0x319F, - 'Bopomofo Extended': (char) => char >= 0x31A0 && char <= 0x31BF, - 'CJK Strokes': (char) => char >= 0x31C0 && char <= 0x31EF, - 'Katakana Phonetic Extensions': (char) => char >= 0x31F0 && char <= 0x31FF, - 'Enclosed CJK Letters and Months': (char) => char >= 0x3200 && char <= 0x32FF, - 'CJK Compatibility': (char) => char >= 0x3300 && char <= 0x33FF, - 'CJK Unified Ideographs Extension A': (char) => char >= 0x3400 && char <= 0x4DBF, - 'Yijing Hexagram Symbols': (char) => char >= 0x4DC0 && char <= 0x4DFF, - 'CJK Unified Ideographs': (char) => char >= 0x4E00 && char <= 0x9FFF, - 'Yi Syllables': (char) => char >= 0xA000 && char <= 0xA48F, - 'Yi Radicals': (char) => 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': (char) => 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': (char) => char >= 0xAC00 && char <= 0xD7AF, - 'Hangul Jamo Extended-B': (char) => 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': (char) => char >= 0xE000 && char <= 0xF8FF, - 'CJK Compatibility Ideographs': (char) => char >= 0xF900 && char <= 0xFAFF, - // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F, - 'Arabic Presentation Forms-A': (char) => char >= 0xFB50 && char <= 0xFDFF, - // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F, - 'Vertical Forms': (char) => char >= 0xFE10 && char <= 0xFE1F, - // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F, - 'CJK Compatibility Forms': (char) => char >= 0xFE30 && char <= 0xFE4F, - 'Small Form Variants': (char) => char >= 0xFE50 && char <= 0xFE6F, - 'Arabic Presentation Forms-B': (char) => char >= 0xFE70 && char <= 0xFEFF, - 'Halfwidth and Fullwidth Forms': (char) => 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, - // 'Hanifi Rohingya': (char) => char >= 0x10D00 && char <= 0x10D3F, - // 'Rumi Numeral Symbols': (char) => char >= 0x10E60 && char <= 0x10E7F, - // 'Old Sogdian': (char) => char >= 0x10F00 && char <= 0x10F2F, - // 'Sogdian': (char) => char >= 0x10F30 && char <= 0x10F6F, - // 'Elymaic': (char) => char >= 0x10FE0 && char <= 0x10FFF, - // '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, - // 'Dogra': (char) => char >= 0x11800 && char <= 0x1184F, - // 'Warang Citi': (char) => char >= 0x118A0 && char <= 0x118FF, - // 'Nandinagari': (char) => char >= 0x119A0 && char <= 0x119FF, - // '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, - // 'Gunjala Gondi': (char) => char >= 0x11D60 && char <= 0x11DAF, - // 'Makasar': (char) => char >= 0x11EE0 && char <= 0x11EFF, - // 'Tamil Supplement': (char) => char >= 0x11FC0 && char <= 0x11FFF, - // '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, - // 'Egyptian Hieroglyph Format Controls': (char) => char >= 0x13430 && char <= 0x1343F, - // '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, - // 'Medefaidrin': (char) => char >= 0x16E40 && char <= 0x16E9F, - // '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, - // 'Small Kana Extension': (char) => char >= 0x1B130 && char <= 0x1B16F, - // '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, - // 'Mayan Numerals': (char) => char >= 0x1D2E0 && char <= 0x1D2FF, - // '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, - // 'Nyiakeng Puachue Hmong': (char) => char >= 0x1E100 && char <= 0x1E14F, - // 'Wancho': (char) => char >= 0x1E2C0 && char <= 0x1E2FF, - // 'Mende Kikakui': (char) => char >= 0x1E800 && char <= 0x1E8DF, - // 'Adlam': (char) => char >= 0x1E900 && char <= 0x1E95F, - // 'Indic Siyaq Numbers': (char) => char >= 0x1EC70 && char <= 0x1ECBF, - // 'Ottoman Siyaq Numbers': (char) => char >= 0x1ED00 && char <= 0x1ED4F, - // '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, - // 'Chess Symbols': (char) => char >= 0x1FA00 && char <= 0x1FA6F, - // 'Symbols and Pictographs Extended-A': (char) => char >= 0x1FA70 && char <= 0x1FAFF, - // '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, -}; + + + + + -// +function polygonIntersectsPolygon(polygonA , polygonB ) { + for (let i = 0; i < polygonA.length; i++) { + if (polygonContainsPoint(polygonB, polygonA[i])) return true; + } -function allowsIdeographicBreaking(chars ) { - for (const char of chars) { - if (!charAllowsIdeographicBreaking(char.charCodeAt(0))) return false; + for (let i = 0; i < polygonB.length; i++) { + if (polygonContainsPoint(polygonA, polygonB[i])) return true; } - return true; + + if (lineIntersectsLine(polygonA, polygonB)) return true; + + return false; } -function allowsVerticalWritingMode(chars ) { - for (const char of chars) { - if (charHasUprightVerticalOrientation(char.charCodeAt(0))) return true; - } +function polygonIntersectsBufferedPoint(polygon , point , radius ) { + if (polygonContainsPoint(polygon, point)) return true; + if (pointIntersectsBufferedLine(point, polygon, radius)) return true; return false; } -function allowsLetterSpacing(chars ) { - for (const char of chars) { - if (!charAllowsLetterSpacing(char.charCodeAt(0))) return false; +function polygonIntersectsMultiPolygon(polygon , multiPolygon ) { + + if (polygon.length === 1) { + return multiPolygonContainsPoint(multiPolygon, polygon[0]); } - return true; -} -function charAllowsLetterSpacing(char ) { - if (unicodeBlockLookup['Arabic'](char)) return false; - if (unicodeBlockLookup['Arabic Supplement'](char)) return false; - if (unicodeBlockLookup['Arabic Extended-A'](char)) return false; - if (unicodeBlockLookup['Arabic Presentation Forms-A'](char)) return false; - if (unicodeBlockLookup['Arabic Presentation Forms-B'](char)) return false; + for (let m = 0; m < multiPolygon.length; m++) { + const ring = multiPolygon[m]; + for (let n = 0; n < ring.length; n++) { + if (polygonContainsPoint(polygon, ring[n])) return true; + } + } - return true; + for (let i = 0; i < polygon.length; i++) { + if (multiPolygonContainsPoint(multiPolygon, polygon[i])) return true; + } + + for (let k = 0; k < multiPolygon.length; k++) { + if (lineIntersectsLine(polygon, multiPolygon[k])) return true; + } + + return false; } -function charAllowsIdeographicBreaking(char ) { - // Return early for characters outside all ideographic ranges. - if (char < 0x2E80) return false; +function polygonIntersectsBufferedMultiLine(polygon , multiLine , radius ) { + for (let i = 0; i < multiLine.length; i++) { + const line = multiLine[i]; - if (unicodeBlockLookup['Bopomofo Extended'](char)) return true; - if (unicodeBlockLookup['Bopomofo'](char)) return true; - if (unicodeBlockLookup['CJK Compatibility Forms'](char)) return true; - if (unicodeBlockLookup['CJK Compatibility Ideographs'](char)) return true; - if (unicodeBlockLookup['CJK Compatibility'](char)) return true; - if (unicodeBlockLookup['CJK Radicals Supplement'](char)) return true; - if (unicodeBlockLookup['CJK Strokes'](char)) return true; - if (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) return true; - if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char)) return true; - if (unicodeBlockLookup['CJK Unified Ideographs'](char)) return true; - if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char)) return true; - if (unicodeBlockLookup['Halfwidth and Fullwidth Forms'](char)) return true; - if (unicodeBlockLookup['Hiragana'](char)) return true; - if (unicodeBlockLookup['Ideographic Description Characters'](char)) return true; - if (unicodeBlockLookup['Kangxi Radicals'](char)) return true; - if (unicodeBlockLookup['Katakana Phonetic Extensions'](char)) return true; - if (unicodeBlockLookup['Katakana'](char)) return true; - if (unicodeBlockLookup['Vertical Forms'](char)) return true; - if (unicodeBlockLookup['Yi Radicals'](char)) return true; - if (unicodeBlockLookup['Yi Syllables'](char)) return true; + if (polygon.length >= 3) { + for (let k = 0; k < line.length; k++) { + if (polygonContainsPoint(polygon, line[k])) return true; + } + } + if (lineIntersectsBufferedLine(polygon, line, radius)) return true; + } return false; } -// The following logic comes from -// . -// Keep it synchronized with -// . -// 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. +function lineIntersectsBufferedLine(lineA , lineB , radius ) { -// Blocks in the Unicode supplementary planes are excluded from this module due -// to . + if (lineA.length > 1) { + if (lineIntersectsLine(lineA, lineB)) return true; -/** - * 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 - */ -function charHasUprightVerticalOrientation(char ) { - if (char === 0x02EA /* modifier letter yin departing tone mark */ || - char === 0x02EB /* modifier letter yang departing tone mark */) { - return true; + // Check whether any point in either line is within radius of the other line + for (let j = 0; j < lineB.length; j++) { + if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) return true; + } } - // Return early for characters outside all ranges whose characters remain - // upright in vertical writing mode. - if (char < 0x1100) return false; + for (let k = 0; k < lineA.length; k++) { + if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) return true; + } - if (unicodeBlockLookup['Bopomofo Extended'](char)) return true; - if (unicodeBlockLookup['Bopomofo'](char)) return true; - if (unicodeBlockLookup['CJK Compatibility Forms'](char)) { - if (!((char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F) /* wavy low line */)) { - return true; + return false; +} + +function lineIntersectsLine(lineA , lineB ) { + if (lineA.length === 0 || lineB.length === 0) return false; + for (let i = 0; i < lineA.length - 1; i++) { + const a0 = lineA[i]; + const a1 = lineA[i + 1]; + for (let j = 0; j < lineB.length - 1; j++) { + const b0 = lineB[j]; + const b1 = lineB[j + 1]; + if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) return true; } } - if (unicodeBlockLookup['CJK Compatibility Ideographs'](char)) return true; - if (unicodeBlockLookup['CJK Compatibility'](char)) return true; - if (unicodeBlockLookup['CJK Radicals Supplement'](char)) return true; - if (unicodeBlockLookup['CJK Strokes'](char)) return true; - if (unicodeBlockLookup['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; - } + 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 ) { + const radiusSquared = radius * radius; + + if (line.length === 1) return p.distSqr(line[0]) < radiusSquared; + + for (let 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". + const v = line[i - 1], w = line[i]; + if (distToSegmentSquared(p, v, w) < radiusSquared) return true; } - if (unicodeBlockLookup['CJK Unified Ideographs Extension A'](char)) return true; - if (unicodeBlockLookup['CJK Unified Ideographs'](char)) return true; - if (unicodeBlockLookup['Enclosed CJK Letters and Months'](char)) return true; - if (unicodeBlockLookup['Hangul Compatibility Jamo'](char)) return true; - if (unicodeBlockLookup['Hangul Jamo Extended-A'](char)) return true; - if (unicodeBlockLookup['Hangul Jamo Extended-B'](char)) return true; - if (unicodeBlockLookup['Hangul Jamo'](char)) return true; - if (unicodeBlockLookup['Hangul Syllables'](char)) return true; - if (unicodeBlockLookup['Hiragana'](char)) return true; - if (unicodeBlockLookup['Ideographic Description Characters'](char)) return true; - if (unicodeBlockLookup['Kanbun'](char)) return true; - if (unicodeBlockLookup['Kangxi Radicals'](char)) return true; - if (unicodeBlockLookup['Katakana Phonetic Extensions'](char)) return true; - if (unicodeBlockLookup['Katakana'](char)) { - if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) { - return true; + return false; +} + +// Code from http://stackoverflow.com/a/1501725/331379. +function distToSegmentSquared(p , v , w ) { + const l2 = v.distSqr(w); + if (l2 === 0) return p.distSqr(v); + const 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 ) { + let c = false, + ring, p1, p2; + + for (let k = 0; k < rings.length; k++) { + ring = rings[k]; + for (let 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; + } } } - if (unicodeBlockLookup['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; + return c; +} + +function polygonContainsPoint(ring , p ) { + let c = false; + for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) { + const p1 = ring[i]; + const 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; } } - if (unicodeBlockLookup['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; + return c; +} + +function polygonIntersectsBox(ring , boxX1 , boxY1 , boxX2 , boxY2 ) { + for (const p of ring) { + if (boxX1 <= p.x && + boxY1 <= p.y && + boxX2 >= p.x && + boxY2 >= p.y) return true; + } + + const corners = [ + new pointGeometry(boxX1, boxY1), + new pointGeometry(boxX1, boxY2), + new pointGeometry(boxX2, boxY2), + new pointGeometry(boxX2, boxY1)]; + + if (ring.length > 2) { + for (const corner of corners) { + if (polygonContainsPoint(ring, corner)) return true; } } - if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics'](char)) return true; - if (unicodeBlockLookup['Unified Canadian Aboriginal Syllabics Extended'](char)) return true; - if (unicodeBlockLookup['Vertical Forms'](char)) return true; - if (unicodeBlockLookup['Yijing Hexagram Symbols'](char)) return true; - if (unicodeBlockLookup['Yi Syllables'](char)) return true; - if (unicodeBlockLookup['Yi Radicals'](char)) return true; + + for (let i = 0; i < ring.length - 1; i++) { + const p1 = ring[i]; + const p2 = ring[i + 1]; + if (edgeIntersectsBox(p1, p2, corners)) return true; + } return false; } +function edgeIntersectsBox(e1 , e2 , corners ) { + const tl = corners[0]; + const br = corners[2]; + // the edge and box do not intersect in either the x or y dimensions + if (((e1.x < tl.x) && (e2.x < tl.x)) || + ((e1.x > br.x) && (e2.x > br.x)) || + ((e1.y < tl.y) && (e2.y < tl.y)) || + ((e1.y > br.y) && (e2.y > br.y))) return false; + + // check if all corners of the box are on the same side of the edge + const dir = isCounterClockwise(e1, e2, corners[0]); + return dir !== isCounterClockwise(e1, e2, corners[1]) || + dir !== isCounterClockwise(e1, e2, corners[2]) || + dir !== isCounterClockwise(e1, e2, corners[3]); +} + +// + + + + + + +function getMaximumPaintValue(property , layer , bucket ) { + const value = ((layer.paint ).get(property) ).value; + if (value.kind === 'constant') { + return value.value; + } else { + return bucket.programConfigurations.get(layer.id).getMaxValue(property); + } +} + +function translateDistance(translate ) { + return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]); +} + +function translate$4(queryGeometry , + translate , + translateAnchor , + bearing , + pixelsToTileUnits ) { + if (!translate[0] && !translate[1]) { + return queryGeometry; + } + const pt = pointGeometry.convert(translate)._mult(pixelsToTileUnits); + + if (translateAnchor === "viewport") { + pt._rotate(-bearing); + } + + const translated = []; + for (let i = 0; i < queryGeometry.length; i++) { + const point = queryGeometry[i]; + translated.push(point.sub(pt)); + } + return translated; +} + +function tilespaceTranslate(translate , + translateAnchor , + bearing , + pixelsToTileUnits ) { + const pt = pointGeometry.convert(translate)._mult(pixelsToTileUnits); + + if (translateAnchor === "viewport") { + pt._rotate(-bearing); + } + + return pt; +} + +// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. + + + + + + + + + + + +const layout$5 = new Properties({ + "circle-sort-key": new DataDrivenProperty(spec["layout_circle"]["circle-sort-key"]), +}); + + + + + + + + + + + + + + + +const paint$9 = new Properties({ + "circle-radius": new DataDrivenProperty(spec["paint_circle"]["circle-radius"]), + "circle-color": new DataDrivenProperty(spec["paint_circle"]["circle-color"]), + "circle-blur": new DataDrivenProperty(spec["paint_circle"]["circle-blur"]), + "circle-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-opacity"]), + "circle-translate": new DataConstantProperty(spec["paint_circle"]["circle-translate"]), + "circle-translate-anchor": new DataConstantProperty(spec["paint_circle"]["circle-translate-anchor"]), + "circle-pitch-scale": new DataConstantProperty(spec["paint_circle"]["circle-pitch-scale"]), + "circle-pitch-alignment": new DataConstantProperty(spec["paint_circle"]["circle-pitch-alignment"]), + "circle-stroke-width": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-width"]), + "circle-stroke-color": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-color"]), + "circle-stroke-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-opacity"]), +}); + +// Note: without adding the explicit type annotation, Flow infers weaker types +// for these objects from their use in the constructor to StyleLayer, as +// {layout?: Properties<...>, paint: Properties<...>} +var properties$9 = ({ paint: paint$9, layout: layout$5 } + + ); + +/** + * Common utilities + * @module glMatrix + */ +// Configuration Constants +var EPSILON = 0.000001; +var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array; +var RANDOM = Math.random; +/** + * Sets the type of array used when creating new vectors and matrices + * + * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array + */ + +function setMatrixArrayType(type) { + ARRAY_TYPE = type; +} +var degree = Math.PI / 180; +/** + * Convert Degree To Radian + * + * @param {Number} a Angle in Degrees + */ + +function toRadian(a) { + return a * degree; +} +/** + * Tests whether or not the arguments have approximately the same value, within an absolute + * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less + * than or equal to 1.0, and a relative tolerance is used for larger values) + * + * @param {Number} a The first number to test. + * @param {Number} b The second number to test. + * @returns {Boolean} True if the numbers are approximately equal, false otherwise. + */ + +function equals$a(a, b) { + return Math.abs(a - b) <= EPSILON * Math.max(1.0, Math.abs(a), Math.abs(b)); +} +if (!Math.hypot) Math.hypot = function () { + var y = 0, + i = arguments.length; + + while (i--) { + y += arguments[i] * arguments[i]; + } + + return Math.sqrt(y); +}; + +var common = /*#__PURE__*/Object.freeze({ +__proto__: null, +EPSILON: EPSILON, +get ARRAY_TYPE () { return ARRAY_TYPE; }, +RANDOM: RANDOM, +setMatrixArrayType: setMatrixArrayType, +toRadian: toRadian, +equals: equals$a +}); + +/** + * 2x2 Matrix + * @module mat2 + */ + +/** + * Creates a new identity mat2 + * + * @returns {mat2} a new 2x2 matrix + */ + +function create$8() { + var out = new ARRAY_TYPE(4); + + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + } + + out[0] = 1; + out[3] = 1; + return out; +} +/** + * Creates a new mat2 initialized with values from an existing matrix + * + * @param {ReadonlyMat2} a matrix to clone + * @returns {mat2} a new 2x2 matrix + */ + +function clone$8(a) { + var out = new ARRAY_TYPE(4); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; +} +/** + * Copy the values from one mat2 to another + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the source matrix + * @returns {mat2} out + */ + +function copy$8(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; +} +/** + * Set a mat2 to the identity matrix + * + * @param {mat2} out the receiving matrix + * @returns {mat2} out + */ + +function identity$6(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; +} +/** + * Create a new mat2 with the given values + * + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m10 Component in column 1, row 0 position (index 2) + * @param {Number} m11 Component in column 1, row 1 position (index 3) + * @returns {mat2} out A new 2x2 matrix + */ + +function fromValues$8(m00, m01, m10, m11) { + var out = new ARRAY_TYPE(4); + out[0] = m00; + out[1] = m01; + out[2] = m10; + out[3] = m11; + return out; +} +/** + * Set the components of a mat2 to the given values + * + * @param {mat2} out the receiving matrix + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m10 Component in column 1, row 0 position (index 2) + * @param {Number} m11 Component in column 1, row 1 position (index 3) + * @returns {mat2} out + */ + +function set$8(out, m00, m01, m10, m11) { + out[0] = m00; + out[1] = m01; + out[2] = m10; + out[3] = m11; + return out; +} /** - * Returns true if the given Unicode codepoint identifies a character with - * neutral orientation. + * Transpose the values of a mat2 * - * 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 + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the source matrix + * @returns {mat2} out */ -function charHasNeutralVerticalOrientation(char ) { - if (unicodeBlockLookup['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 (unicodeBlockLookup['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 (unicodeBlockLookup['Letterlike Symbols'](char)) return true; - if (unicodeBlockLookup['Number Forms'](char)) return true; - if (unicodeBlockLookup['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 (unicodeBlockLookup['Control Pictures'](char) && char !== 0x2423 /* open box */) return true; - if (unicodeBlockLookup['Optical Character Recognition'](char)) return true; - if (unicodeBlockLookup['Enclosed Alphanumerics'](char)) return true; - if (unicodeBlockLookup['Geometric Shapes'](char)) return true; - if (unicodeBlockLookup['Miscellaneous Symbols'](char)) { - if (!((char >= 0x261A /* black left pointing index */ && char <= 0x261F) /* white down pointing index */)) { - return true; - } - } - if (unicodeBlockLookup['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 (unicodeBlockLookup['CJK Symbols and Punctuation'](char)) return true; - if (unicodeBlockLookup['Katakana'](char)) return true; - if (unicodeBlockLookup['Private Use Area'](char)) return true; - if (unicodeBlockLookup['CJK Compatibility Forms'](char)) return true; - if (unicodeBlockLookup['Small Form Variants'](char)) return true; - if (unicodeBlockLookup['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; - } +function transpose$2(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache + // some values + if (out === a) { + var a1 = a[1]; + out[1] = a[2]; + out[2] = a1; + } else { + out[0] = a[0]; + out[1] = a[2]; + out[2] = a[1]; + out[3] = a[3]; + } - return false; + return out; } +/** + * Inverts a mat2 + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the source matrix + * @returns {mat2} out + */ + +function invert$5(out, a) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; // Calculate the determinant + + var det = a0 * a3 - a2 * a1; + + if (!det) { + return null; + } + det = 1.0 / det; + out[0] = a3 * det; + out[1] = -a1 * det; + out[2] = -a2 * det; + out[3] = a0 * det; + return out; +} /** - * Returns true if the given Unicode codepoint identifies a character with - * rotated orientation. + * Calculates the adjugate of a mat2 * - * 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 + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the source matrix + * @returns {mat2} out */ -function charHasRotatedVerticalOrientation(char ) { - return !(charHasUprightVerticalOrientation(char) || - charHasNeutralVerticalOrientation(char)); + +function adjoint$2(out, a) { + // Caching this value is nessecary if out == a + var a0 = a[0]; + out[0] = a[3]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = a0; + return out; } +/** + * Calculates the determinant of a mat2 + * + * @param {ReadonlyMat2} a the source matrix + * @returns {Number} determinant of a + */ -function charInComplexShapingScript(char ) { - return unicodeBlockLookup['Arabic'](char) || - unicodeBlockLookup['Arabic Supplement'](char) || - unicodeBlockLookup['Arabic Extended-A'](char) || - unicodeBlockLookup['Arabic Presentation Forms-A'](char) || - unicodeBlockLookup['Arabic Presentation Forms-B'](char); +function determinant$3(a) { + return a[0] * a[3] - a[2] * a[1]; } +/** + * Multiplies two mat2's + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the first operand + * @param {ReadonlyMat2} b the second operand + * @returns {mat2} out + */ -function charInRTLScript(char ) { - // Main blocks for Hebrew, Arabic, Thaana and other RTL scripts - return (char >= 0x0590 && char <= 0x08FF) || - unicodeBlockLookup['Arabic Presentation Forms-A'](char) || - unicodeBlockLookup['Arabic Presentation Forms-B'](char); +function multiply$8(out, a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + out[0] = a0 * b0 + a2 * b1; + out[1] = a1 * b0 + a3 * b1; + out[2] = a0 * b2 + a2 * b3; + out[3] = a1 * b2 + a3 * b3; + return out; } +/** + * Rotates a mat2 by the given angle + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2} out + */ -function charInSupportedScript(char , canRenderRTL ) { - // This is a rough heuristic: whether we "can render" a script - // actually depends on the properties of the font being used - // and whether differences from the ideal rendering are considered - // semantically significant. +function rotate$4(out, a, rad) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var s = Math.sin(rad); + var 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; +} +/** + * Scales the mat2 by the dimensions in the given vec2 + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the matrix to rotate + * @param {ReadonlyVec2} v the vec2 to scale the matrix by + * @returns {mat2} out + **/ - // Even in Latin script, we "can't render" combinations such as the fi - // ligature, but we don't consider that semantically significant. - if (!canRenderRTL && charInRTLScript(char)) { - return false; - } - if ((char >= 0x0900 && char <= 0x0DFF) || - // Main blocks for Indic scripts and Sinhala - (char >= 0x0F00 && char <= 0x109F) || - // Main blocks for Tibetan and Myanmar - unicodeBlockLookup['Khmer'](char)) { - // These blocks cover common scripts that require - // complex text shaping, based on unicode script metadata: - // http://www.unicode.org/repos/cldr/trunk/common/properties/scriptMetadata.txt - // where "Web Rank <= 32" "Shaping Required = YES" - return false; - } - return true; +function scale$8(out, a, v) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var v0 = v[0], + v1 = v[1]; + out[0] = a0 * v0; + out[1] = a1 * v0; + out[2] = a2 * v1; + out[3] = a3 * v1; + return out; } +/** + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat2.identity(dest); + * mat2.rotate(dest, dest, rad); + * + * @param {mat2} out mat2 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2} out + */ -function stringContainsRTLText(chars ) { - for (const char of chars) { - if (charInRTLScript(char.charCodeAt(0))) { - return true; - } - } - return false; +function fromRotation$4(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + out[0] = c; + out[1] = s; + out[2] = -s; + out[3] = c; + return out; } +/** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat2.identity(dest); + * mat2.scale(dest, dest, vec); + * + * @param {mat2} out mat2 receiving operation result + * @param {ReadonlyVec2} v Scaling vector + * @returns {mat2} out + */ -function isStringInSupportedScript(chars , canRenderRTL ) { - for (const char of chars) { - if (!charInSupportedScript(char.charCodeAt(0), canRenderRTL)) { - return false; - } - } - return true; +function fromScaling$3(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = v[1]; + return out; } +/** + * Returns a string representation of a mat2 + * + * @param {ReadonlyMat2} a matrix to represent as a string + * @returns {String} string representation of the matrix + */ -// - +function str$8(a) { + return "mat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; +} +/** + * Returns Frobenius norm of a mat2 + * + * @param {ReadonlyMat2} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ -const status = { - unavailable: 'unavailable', // Not loaded - deferred: 'deferred', // The plugin URL has been specified, but loading has been deferred - loading: 'loading', // request in-flight - loaded: 'loaded', - error: 'error' -}; +function frob$3(a) { + return Math.hypot(a[0], a[1], a[2], a[3]); +} +/** + * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix + * @param {ReadonlyMat2} L the lower triangular matrix + * @param {ReadonlyMat2} D the diagonal matrix + * @param {ReadonlyMat2} U the upper triangular matrix + * @param {ReadonlyMat2} a the input matrix to factorize + */ - - - - +function LDU(L, D, U, a) { + L[2] = a[2] / a[0]; + U[0] = a[0]; + U[1] = a[1]; + U[3] = a[3] - L[2] * U[1]; + return [L, D, U]; +} +/** + * Adds two mat2's + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the first operand + * @param {ReadonlyMat2} b the second operand + * @returns {mat2} out + */ - -let _completionCallback = null; +function add$8(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + return out; +} +/** + * Subtracts matrix b from matrix a + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the first operand + * @param {ReadonlyMat2} b the second operand + * @returns {mat2} out + */ -//Variables defining the current state of the plugin -let pluginStatus = status.unavailable; -let pluginURL = null; +function subtract$6(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + return out; +} +/** + * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyMat2} a The first matrix. + * @param {ReadonlyMat2} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ -const triggerPluginCompletionEvent = function(error ) { - // NetworkError's are not correctly reflected by the plugin status which prevents reloading plugin - if (error && typeof error === 'string' && error.indexOf('NetworkError') > -1) { - pluginStatus = status.error; - } +function exactEquals$8(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; +} +/** + * Returns whether or not the matrices have approximately the same elements in the same position. + * + * @param {ReadonlyMat2} a The first matrix. + * @param {ReadonlyMat2} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ - if (_completionCallback) { - _completionCallback(error); - } -}; +function equals$9(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); +} +/** + * Multiply each element of the matrix by a scalar. + * + * @param {mat2} out the receiving matrix + * @param {ReadonlyMat2} a the matrix to scale + * @param {Number} b amount to scale the matrix's elements by + * @returns {mat2} out + */ -function sendPluginStateToWorker() { - evented.fire(new Event('pluginStateChange', {pluginStatus, pluginURL})); +function multiplyScalar$3(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; } +/** + * Adds two mat2's after multiplying each element of the second operand by a scalar value. + * + * @param {mat2} out the receiving vector + * @param {ReadonlyMat2} a the first operand + * @param {ReadonlyMat2} b the second operand + * @param {Number} scale the amount to scale b's elements by before adding + * @returns {mat2} out + */ -const evented = new Evented(); +function multiplyScalarAndAdd$3(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + return out; +} +/** + * Alias for {@link mat2.multiply} + * @function + */ -const getRTLTextPluginStatus = function () { - return pluginStatus; -}; +var mul$8 = multiply$8; +/** + * Alias for {@link mat2.subtract} + * @function + */ -const registerForPluginStateChange = function(callback ) { - // Do an initial sync of the state - callback({pluginStatus, pluginURL}); - // Listen for all future state changes - evented.on('pluginStateChange', callback); - return callback; -}; +var sub$6 = subtract$6; -const clearRTLTextPlugin = function() { - pluginStatus = status.unavailable; - pluginURL = null; -}; +var mat2 = /*#__PURE__*/Object.freeze({ +__proto__: null, +create: create$8, +clone: clone$8, +copy: copy$8, +identity: identity$6, +fromValues: fromValues$8, +set: set$8, +transpose: transpose$2, +invert: invert$5, +adjoint: adjoint$2, +determinant: determinant$3, +multiply: multiply$8, +rotate: rotate$4, +scale: scale$8, +fromRotation: fromRotation$4, +fromScaling: fromScaling$3, +str: str$8, +frob: frob$3, +LDU: LDU, +add: add$8, +subtract: subtract$6, +exactEquals: exactEquals$8, +equals: equals$9, +multiplyScalar: multiplyScalar$3, +multiplyScalarAndAdd: multiplyScalarAndAdd$3, +mul: mul$8, +sub: sub$6 +}); -const setRTLTextPlugin = function(url , callback , deferred = false) { - if (pluginStatus === status.deferred || pluginStatus === status.loading || pluginStatus === status.loaded) { - throw new Error('setRTLTextPlugin cannot be called multiple times.'); - } - pluginURL = exported.resolveURL(url); - pluginStatus = status.deferred; - _completionCallback = callback; - sendPluginStateToWorker(); +/** + * 2x3 Matrix + * @module mat2d + * @description + * A mat2d contains six elements defined as: + *
+ * [a, b,
+ *  c, d,
+ *  tx, ty]
+ * 
+ * This is a short form for the 3x3 matrix: + *
+ * [a, b, 0,
+ *  c, d, 0,
+ *  tx, ty, 1]
+ * 
+ * The last column is ignored so the array is shorter and operations are faster. + */ - //Start downloading the plugin immediately if not intending to lazy-load - if (!deferred) { - downloadRTLTextPlugin(); - } -}; +/** + * Creates a new identity mat2d + * + * @returns {mat2d} a new 2x3 matrix + */ -const downloadRTLTextPlugin = function() { - if (pluginStatus !== status.deferred || !pluginURL) { - throw new Error('rtl-text-plugin cannot be downloaded unless a pluginURL is specified'); - } - pluginStatus = status.loading; - sendPluginStateToWorker(); - if (pluginURL) { - getArrayBuffer({url: pluginURL}, (error) => { - if (error) { - triggerPluginCompletionEvent(error); - } else { - pluginStatus = status.loaded; - sendPluginStateToWorker(); - } - }); - } -}; +function create$7() { + var out = new ARRAY_TYPE(6); -const plugin - - - - - - - - - = { - applyArabicShaping: null, - processBidirectionalText: null, - processStyledBidirectionalText: null, - isLoaded() { - return pluginStatus === status.loaded || // Main Thread: loaded if the completion callback returned successfully - plugin.applyArabicShaping != null; // Web-worker: loaded if the plugin functions have been compiled - }, - isLoading() { // Main Thread Only: query the loading status, this function does not return the correct value in the worker context. - return pluginStatus === status.loading; - }, - setState(state ) { // Worker thread only: this tells the worker threads that the plugin is available on the Main thread - assert_1(isWorker(), 'Cannot set the state of the rtl-text-plugin when not in the web-worker context'); + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + out[4] = 0; + out[5] = 0; + } - pluginStatus = state.pluginStatus; - pluginURL = state.pluginURL; - }, - isParsed() { - assert_1(isWorker(), 'rtl-text-plugin is only parsed on the worker-threads'); + out[0] = 1; + out[3] = 1; + return out; +} +/** + * Creates a new mat2d initialized with values from an existing matrix + * + * @param {ReadonlyMat2d} a matrix to clone + * @returns {mat2d} a new 2x3 matrix + */ - return plugin.applyArabicShaping != null && - plugin.processBidirectionalText != null && - plugin.processStyledBidirectionalText != null; - }, - getPluginURL() { - assert_1(isWorker(), 'rtl-text-plugin url can only be queried from the worker threads'); - return pluginURL; - } -}; +function clone$7(a) { + var out = new ARRAY_TYPE(6); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + return out; +} +/** + * Copy the values from one mat2d to another + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the source matrix + * @returns {mat2d} out + */ -const lazyLoadRTLTextPlugin = function() { - if (!plugin.isLoading() && - !plugin.isLoaded() && - getRTLTextPluginStatus() === 'deferred' - ) { - downloadRTLTextPlugin(); - } -}; +function copy$7(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + return out; +} +/** + * Set a mat2d to the identity matrix + * + * @param {mat2d} out the receiving matrix + * @returns {mat2d} out + */ -// +function identity$5(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; +} +/** + * Create a new mat2d with the given values + * + * @param {Number} a Component A (index 0) + * @param {Number} b Component B (index 1) + * @param {Number} c Component C (index 2) + * @param {Number} d Component D (index 3) + * @param {Number} tx Component TX (index 4) + * @param {Number} ty Component TY (index 5) + * @returns {mat2d} A new mat2d + */ - +function fromValues$7(a, b, c, d, tx, ty) { + var out = new ARRAY_TYPE(6); + out[0] = a; + out[1] = b; + out[2] = c; + out[3] = d; + out[4] = tx; + out[5] = ty; + return out; +} +/** + * Set the components of a mat2d to the given values + * + * @param {mat2d} out the receiving matrix + * @param {Number} a Component A (index 0) + * @param {Number} b Component B (index 1) + * @param {Number} c Component C (index 2) + * @param {Number} d Component D (index 3) + * @param {Number} tx Component TX (index 4) + * @param {Number} ty Component TY (index 5) + * @returns {mat2d} out + */ - - - - - +function set$7(out, a, b, c, d, tx, ty) { + out[0] = a; + out[1] = b; + out[2] = c; + out[3] = d; + out[4] = tx; + out[5] = ty; + return out; +} +/** + * Inverts a mat2d + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the source matrix + * @returns {mat2d} out + */ -class EvaluationParameters { - - - - - - +function invert$4(out, a) { + var aa = a[0], + ab = a[1], + ac = a[2], + ad = a[3]; + var atx = a[4], + aty = a[5]; + var det = aa * ad - ab * ac; - // "options" may also be another EvaluationParameters to copy, see CrossFadedProperty.possiblyEvaluate - constructor(zoom , options ) { - this.zoom = zoom; + if (!det) { + return null; + } - if (options) { - this.now = options.now; - this.fadeDuration = options.fadeDuration; - this.zoomHistory = options.zoomHistory; - this.transition = options.transition; - this.pitch = options.pitch; - } else { - this.now = 0; - this.fadeDuration = 0; - this.zoomHistory = new ZoomHistory(); - this.transition = {}; - this.pitch = 0; - } - } + det = 1.0 / det; + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; +} +/** + * Calculates the determinant of a mat2d + * + * @param {ReadonlyMat2d} a the source matrix + * @returns {Number} determinant of a + */ - isSupportedScript(str ) { - return isStringInSupportedScript(str, plugin.isLoaded()); - } +function determinant$2(a) { + return a[0] * a[3] - a[1] * a[2]; +} +/** + * Multiplies two mat2d's + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the first operand + * @param {ReadonlyMat2d} b the second operand + * @returns {mat2d} out + */ - crossFadingFactor() { - if (this.fadeDuration === 0) { - return 1; - } else { - return Math.min((this.now - this.zoomHistory.lastIntegerZoomTime) / this.fadeDuration, 1); - } - } +function multiply$7(out, a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5]; + out[0] = a0 * b0 + a2 * b1; + out[1] = a1 * b0 + a3 * b1; + out[2] = a0 * b2 + a2 * b3; + out[3] = a1 * b2 + a3 * b3; + out[4] = a0 * b4 + a2 * b5 + a4; + out[5] = a1 * b4 + a3 * b5 + a5; + return out; +} +/** + * Rotates a mat2d by the given angle + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2d} out + */ - getCrossfadeParameters() { - const z = this.zoom; - const fraction = z - Math.floor(z); - const t = this.crossFadingFactor(); +function rotate$3(out, a, rad) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5]; + var s = Math.sin(rad); + var 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; + out[4] = a4; + out[5] = a5; + return out; +} +/** + * Scales the mat2d by the dimensions in the given vec2 + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the matrix to translate + * @param {ReadonlyVec2} v the vec2 to scale the matrix by + * @returns {mat2d} out + **/ - return z > this.zoomHistory.lastIntegerZoom ? - {fromScale: 2, toScale: 1, t: fraction + (1 - fraction) * t} : - {fromScale: 0.5, toScale: 1, t: 1 - (1 - t) * fraction}; - } +function scale$7(out, a, v) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5]; + var v0 = v[0], + v1 = v[1]; + out[0] = a0 * v0; + out[1] = a1 * v0; + out[2] = a2 * v1; + out[3] = a3 * v1; + out[4] = a4; + out[5] = a5; + return out; } +/** + * Translates the mat2d by the dimensions in the given vec2 + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the matrix to translate + * @param {ReadonlyVec2} v the vec2 to translate the matrix by + * @returns {mat2d} out + **/ -// +function translate$3(out, a, v) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5]; + var v0 = v[0], + v1 = v[1]; + out[0] = a0; + out[1] = a1; + out[2] = a2; + out[3] = a3; + out[4] = a0 * v0 + a2 * v1 + a4; + out[5] = a1 * v0 + a3 * v1 + a5; + return out; +} +/** + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.rotate(dest, dest, rad); + * + * @param {mat2d} out mat2d receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat2d} out + */ - - - - - - +function fromRotation$3(out, rad) { + var s = Math.sin(rad), + c = Math.cos(rad); + out[0] = c; + out[1] = s; + out[2] = -s; + out[3] = c; + out[4] = 0; + out[5] = 0; + return out; +} +/** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.scale(dest, dest, vec); + * + * @param {mat2d} out mat2d receiving operation result + * @param {ReadonlyVec2} v Scaling vector + * @returns {mat2d} out + */ - - - - - - - +function fromScaling$2(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = v[1]; + out[4] = 0; + out[5] = 0; + return out; +} +/** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat2d.identity(dest); + * mat2d.translate(dest, dest, vec); + * + * @param {mat2d} out mat2d receiving operation result + * @param {ReadonlyVec2} v Translation vector + * @returns {mat2d} out + */ - +function fromTranslation$3(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = v[0]; + out[5] = v[1]; + return out; +} +/** + * Returns a string representation of a mat2d + * + * @param {ReadonlyMat2d} a matrix to represent as a string + * @returns {String} string representation of the matrix + */ - - - - - +function str$7(a) { + return "mat2d(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ")"; +} +/** + * Returns Frobenius norm of a mat2d + * + * @param {ReadonlyMat2d} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ +function frob$2(a) { + return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], 1); +} /** - * Implements a number of classes that define state and behavior for paint and layout properties, most - * importantly their respective evaluation chains: + * Adds two mat2d's * - * Transitionable paint property value - * → Transitioning paint property value - * → Possibly evaluated paint property value - * → Fully evaluated paint property value + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the first operand + * @param {ReadonlyMat2d} b the second operand + * @returns {mat2d} out + */ + +function add$7(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; + out[5] = a[5] + b[5]; + return out; +} +/** + * Subtracts matrix b from matrix a * - * Layout property value - * → Possibly evaluated layout property value - * → Fully evaluated layout property value + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the first operand + * @param {ReadonlyMat2d} b the second operand + * @returns {mat2d} out + */ + +function subtract$5(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + out[4] = a[4] - b[4]; + out[5] = a[5] - b[5]; + return out; +} +/** + * Multiply each element of the matrix by a scalar. + * + * @param {mat2d} out the receiving matrix + * @param {ReadonlyMat2d} a the matrix to scale + * @param {Number} b amount to scale the matrix's elements by + * @returns {mat2d} out + */ + +function multiplyScalar$2(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + out[4] = a[4] * b; + out[5] = a[5] * b; + return out; +} +/** + * Adds two mat2d's after multiplying each element of the second operand by a scalar value. * - * @module - * @private + * @param {mat2d} out the receiving vector + * @param {ReadonlyMat2d} a the first operand + * @param {ReadonlyMat2d} b the second operand + * @param {Number} scale the amount to scale b's elements by before adding + * @returns {mat2d} out */ +function multiplyScalarAndAdd$2(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + out[4] = a[4] + b[4] * scale; + out[5] = a[5] + b[5] * scale; + return out; +} /** - * 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 `line-gradient`, - * and one for `light-position`. + * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) * - * @private + * @param {ReadonlyMat2d} a The first matrix. + * @param {ReadonlyMat2d} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. */ - - - - - +function exactEquals$7(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5]; +} /** - * `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. + * Returns whether or not the matrices have approximately the same elements in the same position. * - * @private + * @param {ReadonlyMat2d} a The first matrix. + * @param {ReadonlyMat2d} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. */ -class PropertyValue { - - - - constructor(property , value ) { - this.property = property; - this.value = value; - this.expression = normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification); - } +function equals$8(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)); +} +/** + * Alias for {@link mat2d.multiply} + * @function + */ - isDataDriven() { - return this.expression.kind === 'source' || this.expression.kind === 'composite'; - } +var mul$7 = multiply$7; +/** + * Alias for {@link mat2d.subtract} + * @function + */ - possiblyEvaluate(parameters , canonical , availableImages ) { - return this.property.possiblyEvaluate(this, parameters, canonical, availableImages); - } -} +var sub$5 = subtract$5; -// ------- Transitionable ------- +var mat2d = /*#__PURE__*/Object.freeze({ +__proto__: null, +create: create$7, +clone: clone$7, +copy: copy$7, +identity: identity$5, +fromValues: fromValues$7, +set: set$7, +invert: invert$4, +determinant: determinant$2, +multiply: multiply$7, +rotate: rotate$3, +scale: scale$7, +translate: translate$3, +fromRotation: fromRotation$3, +fromScaling: fromScaling$2, +fromTranslation: fromTranslation$3, +str: str$7, +frob: frob$2, +add: add$7, +subtract: subtract$5, +multiplyScalar: multiplyScalar$2, +multiplyScalarAndAdd: multiplyScalarAndAdd$2, +exactEquals: exactEquals$7, +equals: equals$8, +mul: mul$7, +sub: sub$5 +}); - - - - +/** + * 3x3 Matrix + * @module mat3 + */ /** - * 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`. + * Creates a new identity mat3 * - * @private + * @returns {mat3} a new 3x3 matrix */ -class TransitionablePropertyValue { - - - - constructor(property ) { - this.property = property; - this.value = new PropertyValue(property, undefined); - } +function create$6() { + var out = new ARRAY_TYPE(9); - 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); - } + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[5] = 0; + out[6] = 0; + out[7] = 0; + } - untransitioned() { - return new TransitioningPropertyValue(this.property, this.value, null, {}, 0); // eslint-disable-line no-use-before-define - } + out[0] = 1; + out[4] = 1; + out[8] = 1; + return out; } - /** - * 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`. + * Copies the upper-left 3x3 values into the given mat3. * - * @private + * @param {mat3} out the receiving 3x3 matrix + * @param {ReadonlyMat4} a the source 4x4 matrix + * @returns {mat3} out */ - - +function fromMat4$1(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[4]; + out[4] = a[5]; + out[5] = a[6]; + out[6] = a[8]; + out[7] = a[9]; + out[8] = a[10]; + return out; +} /** - * `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. + * Creates a new mat3 initialized with values from an existing matrix * - * @private + * @param {ReadonlyMat3} a matrix to clone + * @returns {mat3} a new 3x3 matrix */ -class Transitionable { - - - - constructor(properties ) { - this._properties = properties; - this._values = (Object.create(properties.defaultTransitionablePropertyValues) ); - } - - getValue (name ) { - return clone$9(this._values[name].value.value); - } - - 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$9(value)); - } - - getTransition (name ) { - return clone$9(this._values[name].transition); - } - - setTransition (name , value ) { - if (!this._values.hasOwnProperty(name)) { - this._values[name] = new TransitionablePropertyValue(this._values[name].property); - } - this._values[name].transition = clone$9(value) || undefined; - } - - serialize() { - const result = {}; - for (const property of Object.keys(this._values)) { - const value = this.getValue(property); - if (value !== undefined) { - result[property] = value; - } - - const transition = this.getTransition(property); - if (transition !== undefined) { - result[`${property}-transition`] = transition; - } - } - return result; - } - - transitioned(parameters , prior ) { - const result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define - for (const property of Object.keys(this._values)) { - result._values[property] = this._values[property].transitioned(parameters, prior._values[property]); - } - return result; - } - untransitioned() { - const result = new Transitioning(this._properties); // eslint-disable-line no-use-before-define - for (const property of Object.keys(this._values)) { - result._values[property] = this._values[property].untransitioned(); - } - return result; - } +function clone$6(a) { + var out = new ARRAY_TYPE(9); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; } +/** + * Copy the values from one mat3 to another + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the source matrix + * @returns {mat3} out + */ -// ------- Transitioning ------- - +function copy$6(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; +} /** - * `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. + * Create a new mat3 with the given values * - * @private + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m10 Component in column 1, row 0 position (index 3) + * @param {Number} m11 Component in column 1, row 1 position (index 4) + * @param {Number} m12 Component in column 1, row 2 position (index 5) + * @param {Number} m20 Component in column 2, row 0 position (index 6) + * @param {Number} m21 Component in column 2, row 1 position (index 7) + * @param {Number} m22 Component in column 2, row 2 position (index 8) + * @returns {mat3} A new mat3 */ -class TransitioningPropertyValue { - - - - - - constructor(property , - value , - prior , - transition , - now ) { - const delay = transition.delay || 0; - const duration = transition.duration || 0; - now = now || 0; - this.property = property; - this.value = value; - this.begin = now + delay; - this.end = this.begin + duration; - if (property.specification.transition && (transition.delay || transition.duration)) { - this.prior = prior; - } - } +function fromValues$6(m00, m01, m02, m10, m11, m12, m20, m21, m22) { + var out = new ARRAY_TYPE(9); + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m10; + out[4] = m11; + out[5] = m12; + out[6] = m20; + out[7] = m21; + out[8] = m22; + return out; +} +/** + * Set the components of a mat3 to the given values + * + * @param {mat3} out the receiving matrix + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m10 Component in column 1, row 0 position (index 3) + * @param {Number} m11 Component in column 1, row 1 position (index 4) + * @param {Number} m12 Component in column 1, row 2 position (index 5) + * @param {Number} m20 Component in column 2, row 0 position (index 6) + * @param {Number} m21 Component in column 2, row 1 position (index 7) + * @param {Number} m22 Component in column 2, row 2 position (index 8) + * @returns {mat3} out + */ - possiblyEvaluate(parameters , canonical , availableImages ) { - const now = parameters.now || 0; - const finalValue = this.value.possiblyEvaluate(parameters, canonical, availableImages); - const 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, canonical, availableImages); - } else { - // Interpolate between recursively-calculated prior value and final. - const t = (now - this.begin) / (this.end - this.begin); - return this.property.interpolate(prior.possiblyEvaluate(parameters, canonical, availableImages), finalValue, easeCubicInOut(t)); - } - } +function set$6(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) { + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m10; + out[4] = m11; + out[5] = m12; + out[6] = m20; + out[7] = m21; + out[8] = m22; + return out; } +/** + * Set a mat3 to the identity matrix + * + * @param {mat3} out the receiving matrix + * @returns {mat3} out + */ +function identity$4(out) { + 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; +} /** - * 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`. + * Transpose the values of a mat3 * - * @private + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the source matrix + * @returns {mat3} out */ - - +function transpose$1(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a01 = a[1], + a02 = a[2], + a12 = a[5]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a01; + out[5] = a[7]; + out[6] = a02; + out[7] = a12; + } else { + out[0] = a[0]; + out[1] = a[3]; + out[2] = a[6]; + out[3] = a[1]; + out[4] = a[4]; + out[5] = a[7]; + out[6] = a[2]; + out[7] = a[5]; + out[8] = a[8]; + } + + return out; +} /** - * `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. + * Inverts a mat3 * - * @private + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the source matrix + * @returns {mat3} out */ -class Transitioning { - - - constructor(properties ) { - this._properties = properties; - this._values = (Object.create(properties.defaultTransitioningPropertyValues) ); - } +function invert$3(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2]; + var a10 = a[3], + a11 = a[4], + a12 = a[5]; + var a20 = a[6], + a21 = a[7], + a22 = a[8]; + var b01 = a22 * a11 - a12 * a21; + var b11 = -a22 * a10 + a12 * a20; + var b21 = a21 * a10 - a11 * a20; // Calculate the determinant - possiblyEvaluate(parameters , canonical , availableImages ) { - const result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define - for (const property of Object.keys(this._values)) { - result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages); - } - return result; - } + var det = a00 * b01 + a01 * b11 + a02 * b21; - hasTransition() { - for (const property of Object.keys(this._values)) { - if (this._values[property].prior) { - return true; - } - } - return false; - } + if (!det) { + return null; + } + + det = 1.0 / det; + out[0] = b01 * det; + out[1] = (-a22 * a01 + a02 * a21) * det; + out[2] = (a12 * a01 - a02 * a11) * det; + out[3] = b11 * det; + out[4] = (a22 * a00 - a02 * a20) * det; + out[5] = (-a12 * a00 + a02 * a10) * det; + out[6] = b21 * det; + out[7] = (-a21 * a00 + a01 * a20) * det; + out[8] = (a11 * a00 - a01 * a10) * det; + return out; +} +/** + * Calculates the adjugate of a mat3 + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the source matrix + * @returns {mat3} out + */ + +function adjoint$1(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2]; + var a10 = a[3], + a11 = a[4], + a12 = a[5]; + var a20 = a[6], + a21 = a[7], + a22 = a[8]; + out[0] = a11 * a22 - a12 * a21; + out[1] = a02 * a21 - a01 * a22; + out[2] = a01 * a12 - a02 * a11; + out[3] = a12 * a20 - a10 * a22; + out[4] = a00 * a22 - a02 * a20; + out[5] = a02 * a10 - a00 * a12; + out[6] = a10 * a21 - a11 * a20; + out[7] = a01 * a20 - a00 * a21; + out[8] = a00 * a11 - a01 * a10; + return out; } - -// ------- 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`. + * Calculates the determinant of a mat3 * - * @private + * @param {ReadonlyMat3} a the source matrix + * @returns {Number} determinant of a */ - - +function determinant$1(a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2]; + var a10 = a[3], + a11 = a[4], + a12 = a[5]; + var a20 = a[6], + a21 = a[7], + a22 = a[8]; + return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20); +} /** - * 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. + * Multiplies two mat3's * - * @private + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the first operand + * @param {ReadonlyMat3} b the second operand + * @returns {mat3} out */ -class Layout { - - - - constructor(properties ) { - this._properties = properties; - this._values = (Object.create(properties.defaultPropertyValues) ); - } - - getValue (name ) { - return clone$9(this._values[name].value); - } - - setValue (name , value ) { - this._values[name] = new PropertyValue(this._values[name].property, value === null ? undefined : clone$9(value)); - } - - serialize() { - const result = {}; - for (const property of Object.keys(this._values)) { - const value = this.getValue(property); - if (value !== undefined) { - result[property] = value; - } - } - return result; - } - possiblyEvaluate(parameters , canonical , availableImages ) { - const result = new PossiblyEvaluated(this._properties); // eslint-disable-line no-use-before-define - for (const property of Object.keys(this._values)) { - result._values[property] = this._values[property].possiblyEvaluate(parameters, canonical, availableImages); - } - return result; - } +function multiply$6(out, a, b) { + var a00 = a[0], + a01 = a[1], + a02 = a[2]; + var a10 = a[3], + a11 = a[4], + a12 = a[5]; + var a20 = a[6], + a21 = a[7], + a22 = a[8]; + var b00 = b[0], + b01 = b[1], + b02 = b[2]; + var b10 = b[3], + b11 = b[4], + b12 = b[5]; + var b20 = b[6], + b21 = b[7], + b22 = b[8]; + out[0] = b00 * a00 + b01 * a10 + b02 * a20; + out[1] = b00 * a01 + b01 * a11 + b02 * a21; + out[2] = b00 * a02 + b01 * a12 + b02 * a22; + out[3] = b10 * a00 + b11 * a10 + b12 * a20; + out[4] = b10 * a01 + b11 * a11 + b12 * a21; + out[5] = b10 * a02 + b11 * a12 + b12 * a22; + out[6] = b20 * a00 + b21 * a10 + b22 * a20; + out[7] = b20 * a01 + b21 * a11 + b22 * a21; + out[8] = b20 * a02 + b21 * a12 + b22 * a22; + return out; } - -// ------- 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. + * Translate a mat3 by the given vector * - * @private + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the matrix to translate + * @param {ReadonlyVec2} v vector to translate by + * @returns {mat3} out */ - - - - +function translate$2(out, a, v) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a10 = a[3], + a11 = a[4], + a12 = a[5], + a20 = a[6], + a21 = a[7], + a22 = a[8], + x = v[0], + y = v[1]; + out[0] = a00; + out[1] = a01; + out[2] = a02; + out[3] = a10; + out[4] = a11; + out[5] = a12; + out[6] = x * a00 + y * a10 + a20; + out[7] = x * a01 + y * a11 + a21; + out[8] = x * a02 + y * a12 + a22; + return out; +} /** - * `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. + * Rotates a mat3 by the given angle * - * @private + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat3} out */ -class PossiblyEvaluatedPropertyValue { - - - - - constructor(property , value , parameters ) { - this.property = property; - this.value = value; - this.parameters = parameters; - } - - isConstant() { - return this.value.kind === 'constant'; - } - - constantOr(value ) { - if (this.value.kind === 'constant') { - return this.value.value; - } else { - return value; - } - } - evaluate(feature , featureState , canonical , availableImages ) { - return this.property.evaluate(this.value, this.parameters, feature, featureState, canonical, availableImages); - } +function rotate$2(out, a, rad) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a10 = a[3], + a11 = a[4], + a12 = a[5], + a20 = a[6], + a21 = a[7], + a22 = a[8], + s = Math.sin(rad), + c = Math.cos(rad); + out[0] = c * a00 + s * a10; + out[1] = c * a01 + s * a11; + out[2] = c * a02 + s * a12; + out[3] = c * a10 - s * a00; + out[4] = c * a11 - s * a01; + out[5] = c * a12 - s * a02; + out[6] = a20; + out[7] = a21; + out[8] = a22; + return out; } - /** - * 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`. + * Scales the mat3 by the dimensions in the given vec2 * - * 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.) + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the matrix to rotate + * @param {ReadonlyVec2} v the vec2 to scale the matrix by + * @returns {mat3} out + **/ + +function scale$6(out, a, v) { + var x = v[0], + y = v[1]; + out[0] = x * a[0]; + out[1] = x * a[1]; + out[2] = x * a[2]; + out[3] = y * a[3]; + out[4] = y * a[4]; + out[5] = y * a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + return out; +} +/** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): * - * There's also a third, special case possiblity for `R`: for cross-faded properties, it's `?CrossFaded`. + * mat3.identity(dest); + * mat3.translate(dest, dest, vec); * - * @private + * @param {mat3} out mat3 receiving operation result + * @param {ReadonlyVec2} v Translation vector + * @returns {mat3} out */ - - +function fromTranslation$2(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 1; + out[5] = 0; + out[6] = v[0]; + out[7] = v[1]; + out[8] = 1; + return out; +} /** - * `PossiblyEvaluated` stores a map of all (property name, `R`) pairs for paint or layout properties of a - * given layer type. - * @private + * Creates a matrix from a given angle + * This is equivalent to (but much faster than): + * + * mat3.identity(dest); + * mat3.rotate(dest, dest, rad); + * + * @param {mat3} out mat3 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat3} out */ -class PossiblyEvaluated { - - - constructor(properties ) { - this._properties = properties; - this._values = (Object.create(properties.defaultPossiblyEvaluatedValues) ); - } - - get (name ) { - return this._values[name]; - } +function fromRotation$2(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; } - /** - * 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. + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): * - * @private + * mat3.identity(dest); + * mat3.scale(dest, dest, vec); + * + * @param {mat3} out mat3 receiving operation result + * @param {ReadonlyVec2} v Scaling vector + * @returns {mat3} out */ -class DataConstantProperty { - - - constructor(specification ) { - this.specification = specification; - } - possiblyEvaluate(value , parameters ) { - assert_1(!value.isDataDriven()); - return value.expression.evaluate(parameters); - } - - interpolate(a , b , t ) { - const interp = (interpolate )[this.specification.type]; - if (interp) { - return interp(a, b, t); - } else { - return a; - } - } +function fromScaling$1(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = v[1]; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; } - /** - * 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. + * Copies the values from a mat2d into a mat3 * - * @private - */ -class DataDrivenProperty { - - - - constructor(specification , overrides ) { - this.specification = specification; - this.overrides = overrides; - } - - possiblyEvaluate(value , parameters , canonical , availableImages ) { - if (value.expression.kind === 'constant' || value.expression.kind === 'camera') { - return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: value.expression.evaluate(parameters, (null ), {}, canonical, availableImages)}, parameters); - } else { - return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); - } - } - - interpolate(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. The undefined value is subsequently handled in - // FillStyleLayer#recalculate, which sets fill-outline-color to the fill-color value if the former - // is a PossiblyEvaluatedPropertyValue containing a constant undefined value. In addition to the - // return value here, the other source of a PossiblyEvaluatedPropertyValue containing a constant - // undefined value is the "default value" for fill-outline-color held in - // `Properties#defaultPossiblyEvaluatedValues`, which serves as the prototype of - // `PossiblyEvaluated#_values`. - if (a.value.value === undefined || b.value.value === undefined) { - return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: (undefined )}, a.parameters); - } - - const interp = (interpolate )[this.specification.type]; - if (interp) { - return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: interp(a.value.value, b.value.value, t)}, a.parameters); - } else { - return a; - } - } + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat2d} a the matrix to copy + * @returns {mat3} out + **/ - evaluate(value , parameters , feature , featureState , canonical , availableImages ) { - if (value.kind === 'constant') { - return value.value; - } else { - return value.evaluate(parameters, feature, featureState, canonical, availableImages); - } - } +function fromMat2d(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = 0; + out[3] = a[2]; + out[4] = a[3]; + out[5] = 0; + out[6] = a[4]; + out[7] = a[5]; + out[8] = 1; + return out; } - /** - * An implementation of `Property` for data driven `line-pattern` which are transitioned by cross-fading - * rather than interpolation. + * Calculates a 3x3 matrix from the given quaternion * - * @private + * @param {mat3} out mat3 receiving operation result + * @param {ReadonlyQuat} q Quaternion to create matrix from + * + * @returns {mat3} out */ -class CrossFadedDataDrivenProperty extends DataDrivenProperty { - - possiblyEvaluate(value , parameters , canonical , availableImages ) { - if (value.value === undefined) { - return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: undefined}, parameters); - } else if (value.expression.kind === 'constant') { - const evaluatedValue = value.expression.evaluate(parameters, (null ), {}, canonical, availableImages); - const isImageExpression = value.property.specification.type === 'resolvedImage'; - const constantValue = isImageExpression && typeof evaluatedValue !== 'string' ? evaluatedValue.name : evaluatedValue; - const constant = this._calculate(constantValue, constantValue, constantValue, parameters); - return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: constant}, parameters); - } else if (value.expression.kind === 'camera') { - const cameraVal = 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); - return new PossiblyEvaluatedPropertyValue(this, {kind: 'constant', value: cameraVal}, parameters); - } else { - // source or composite expression - return new PossiblyEvaluatedPropertyValue(this, value.expression, parameters); - } - } - - evaluate(value , globals , feature , featureState , canonical , availableImages ) { - if (value.kind === 'source') { - const constant = value.evaluate(globals, feature, featureState, canonical, availableImages); - return this._calculate(constant, constant, constant, globals); - } else if (value.kind === 'composite') { - return this._calculate( - value.evaluate({zoom: Math.floor(globals.zoom) - 1.0}, feature, featureState), - value.evaluate({zoom: Math.floor(globals.zoom)}, feature, featureState), - value.evaluate({zoom: Math.floor(globals.zoom) + 1.0}, feature, featureState), - globals); - } else { - return value.value; - } - } - - _calculate(min , mid , max , parameters ) { - const z = parameters.zoom; - // ugly hack alert: when evaluating non-constant dashes on the worker side, - // we need all three values to pack into the atlas; the if condition is always false there; - // will be removed after removing cross-fading - return z > parameters.zoomHistory.lastIntegerZoom ? - {from: min, to: mid, other: max} : - {from: max, to: mid, other: min}; - } - - interpolate(a ) { - return a; - } +function fromQuat$1(out, q) { + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var yx = y * x2; + var yy = y * y2; + var zx = z * x2; + var zy = z * y2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + out[0] = 1 - yy - zz; + out[3] = yx - wz; + out[6] = zx + wy; + out[1] = yx + wz; + out[4] = 1 - xx - zz; + out[7] = zy - wx; + out[2] = zx - wy; + out[5] = zy + wx; + out[8] = 1 - xx - yy; + return out; } /** - * An implementation of `Property` for `*-pattern` and `line-dasharray`, which are transitioned by cross-fading - * rather than interpolation. + * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix * - * @private + * @param {mat3} out mat3 receiving operation result + * @param {ReadonlyMat4} a Mat4 to derive the normal matrix from + * + * @returns {mat3} out */ -class CrossFadedProperty { - - constructor(specification ) { - this.specification = specification; - } +function normalFromMat4(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + var b00 = a00 * a11 - a01 * a10; + var b01 = a00 * a12 - a02 * a10; + var b02 = a00 * a13 - a03 * a10; + var b03 = a01 * a12 - a02 * a11; + var b04 = a01 * a13 - a03 * a11; + var b05 = a02 * a13 - a03 * a12; + var b06 = a20 * a31 - a21 * a30; + var b07 = a20 * a32 - a22 * a30; + var b08 = a20 * a33 - a23 * a30; + var b09 = a21 * a32 - a22 * a31; + var b10 = a21 * a33 - a23 * a31; + var b11 = a22 * a33 - a23 * a32; // Calculate the determinant - possiblyEvaluate(value , parameters , canonical , availableImages ) { - if (value.value === undefined) { - return undefined; - } else if (value.expression.kind === 'constant') { - const constant = value.expression.evaluate(parameters, (null ), {}, canonical, availableImages); - return this._calculate(constant, constant, constant, parameters); - } else { - assert_1(!value.isDataDriven()); - return this._calculate( - value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom - 1.0), parameters)), - value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom), parameters)), - value.expression.evaluate(new EvaluationParameters(Math.floor(parameters.zoom + 1.0), parameters)), - parameters); - } - } + var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; - _calculate(min , mid , max , parameters ) { - const z = parameters.zoom; - return z > parameters.zoomHistory.lastIntegerZoom ? {from: min, to: mid} : {from: max, to: mid}; - } + if (!det) { + return null; + } - interpolate(a ) { - return a; - } + det = 1.0 / det; + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + return out; } - /** - * An implementation of `Property` for `heatmap-color` and `line-gradient`. Interpolation is a no-op, and - * evaluation returns a boolean value in order to indicate its presence, but the real - * evaluation happens in StyleLayer classes. + * Generates a 2D projection matrix with the given bounds * - * @private + * @param {mat3} out mat3 frustum matrix will be written into + * @param {number} width Width of your gl context + * @param {number} height Height of gl context + * @returns {mat3} out */ -class ColorRampProperty { - - - constructor(specification ) { - this.specification = specification; - } - - possiblyEvaluate(value , parameters , canonical , availableImages ) { - return !!value.expression.evaluate(parameters, (null ), {}, canonical, availableImages); - } - - interpolate() { return false; } +function projection(out, width, height) { + out[0] = 2 / width; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = -2 / height; + out[5] = 0; + out[6] = -1; + out[7] = 1; + out[8] = 1; + return out; } - /** - * `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. + * Returns a string representation of a mat3 * - * @private + * @param {ReadonlyMat3} a matrix to represent as a string + * @returns {String} string representation of the matrix */ -class Properties { - - - - - - - - constructor(properties ) { - this.properties = properties; - this.defaultPropertyValues = ({} ); - this.defaultTransitionablePropertyValues = ({} ); - this.defaultTransitioningPropertyValues = ({} ); - this.defaultPossiblyEvaluatedValues = ({} ); - this.overridableProperties = ([] ); - for (const property in properties) { - const prop = properties[property]; - if (prop.specification.overridable) { - this.overridableProperties.push(property); - } - const defaultPropertyValue = this.defaultPropertyValues[property] = - new PropertyValue(prop, undefined); - const defaultTransitionablePropertyValue = this.defaultTransitionablePropertyValues[property] = - new TransitionablePropertyValue(prop); - this.defaultTransitioningPropertyValues[property] = - defaultTransitionablePropertyValue.untransitioned(); - this.defaultPossiblyEvaluatedValues[property] = - defaultPropertyValue.possiblyEvaluate(({} )); - } - } +function str$6(a) { + return "mat3(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ")"; } - -register('DataDrivenProperty', DataDrivenProperty); -register('DataConstantProperty', DataConstantProperty); -register('CrossFadedDataDrivenProperty', CrossFadedDataDrivenProperty); -register('CrossFadedProperty', CrossFadedProperty); -register('ColorRampProperty', ColorRampProperty); - -// - /** - * 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 + * Returns Frobenius norm of a mat3 * - * @private + * @param {ReadonlyMat3} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm */ -function packUint8ToFloat(a , b ) { - // coerce a and b to 8-bit ints - a = clamp(Math.floor(a), 0, 255); - b = clamp(Math.floor(b), 0, 255); - return 256 * a + b; -} - -// - - - -const viewTypes = { - 'Int8': Int8Array, - 'Uint8': Uint8Array, - 'Int16': Int16Array, - 'Uint16': Uint16Array, - 'Int32': Int32Array, - 'Uint32': Uint32Array, - 'Float32': Float32Array -}; - - +function frob$1(a) { + return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]); +} /** - * @private + * Adds two mat3's + * + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the first operand + * @param {ReadonlyMat3} b the second operand + * @returns {mat3} out */ -class Struct { - - - - - - - // The following properties are defined on the prototype of sub classes. - - /** - * @param {StructArray} structArray The StructArray the struct is stored in - * @param {number} index The index of the struct in the StructArray. - * @private - */ - constructor(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; - } +function add$6(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; + out[5] = a[5] + b[5]; + out[6] = a[6] + b[6]; + out[7] = a[7] + b[7]; + out[8] = a[8] + b[8]; + return out; } - -const DEFAULT_CAPACITY = 128; -const 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()`. + * Subtracts matrix b from matrix a * - * 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. + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the first operand + * @param {ReadonlyMat3} b the second operand + * @returns {mat3} out + */ + +function subtract$4(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + out[4] = a[4] - b[4]; + out[5] = a[5] - b[5]; + out[6] = a[6] - b[6]; + out[7] = a[7] - b[7]; + out[8] = a[8] - b[8]; + return out; +} +/** + * Multiply each element of the matrix by a scalar. * - * @private + * @param {mat3} out the receiving matrix + * @param {ReadonlyMat3} a the matrix to scale + * @param {Number} b amount to scale the matrix's elements by + * @returns {mat3} out */ -class StructArray { - - - - - - // The following properties are defined on the prototype. - - - - +function multiplyScalar$1(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + out[4] = a[4] * b; + out[5] = a[5] * b; + out[6] = a[6] * b; + out[7] = a[7] * b; + out[8] = a[8] * b; + return out; +} +/** + * Adds two mat3's after multiplying each element of the second operand by a scalar value. + * + * @param {mat3} out the receiving vector + * @param {ReadonlyMat3} a the first operand + * @param {ReadonlyMat3} b the second operand + * @param {Number} scale the amount to scale b's elements by before adding + * @returns {mat3} out + */ - constructor() { - this.isTransferred = false; - this.capacity = -1; - this.resize(0); - } +function multiplyScalarAndAdd$1(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + out[4] = a[4] + b[4] * scale; + out[5] = a[5] + b[5] * scale; + out[6] = a[6] + b[6] * scale; + out[7] = a[7] + b[7] * scale; + out[8] = a[8] + b[8] * scale; + return out; +} +/** + * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyMat3} a The first matrix. + * @param {ReadonlyMat3} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ - /** - * Serialize a StructArray instance. Serializes both the raw data and the - * metadata needed to reconstruct the StructArray base class during - * deserialization. - * @private - */ - static serialize(array , transferables ) { - assert_1(!array.isTransferred); +function exactEquals$6(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8]; +} +/** + * Returns whether or not the matrices have approximately the same elements in the same position. + * + * @param {ReadonlyMat3} a The first matrix. + * @param {ReadonlyMat3} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ - array._trim(); +function equals$7(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5], + a6 = a[6], + a7 = a[7], + a8 = a[8]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7], + b8 = b[8]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)); +} +/** + * Alias for {@link mat3.multiply} + * @function + */ - if (transferables) { - array.isTransferred = true; - transferables.push(array.arrayBuffer); - } +var mul$6 = multiply$6; +/** + * Alias for {@link mat3.subtract} + * @function + */ - return { - length: array.length, - arrayBuffer: array.arrayBuffer, - }; - } +var sub$4 = subtract$4; - static deserialize(input ) { - const structArray = Object.create(this.prototype); - structArray.arrayBuffer = input.arrayBuffer; - structArray.length = input.length; - structArray.capacity = input.arrayBuffer.byteLength / structArray.bytesPerElement; - structArray._refreshViews(); - return structArray; - } +var mat3 = /*#__PURE__*/Object.freeze({ +__proto__: null, +create: create$6, +fromMat4: fromMat4$1, +clone: clone$6, +copy: copy$6, +fromValues: fromValues$6, +set: set$6, +identity: identity$4, +transpose: transpose$1, +invert: invert$3, +adjoint: adjoint$1, +determinant: determinant$1, +multiply: multiply$6, +translate: translate$2, +rotate: rotate$2, +scale: scale$6, +fromTranslation: fromTranslation$2, +fromRotation: fromRotation$2, +fromScaling: fromScaling$1, +fromMat2d: fromMat2d, +fromQuat: fromQuat$1, +normalFromMat4: normalFromMat4, +projection: projection, +str: str$6, +frob: frob$1, +add: add$6, +subtract: subtract$4, +multiplyScalar: multiplyScalar$1, +multiplyScalarAndAdd: multiplyScalarAndAdd$1, +exactEquals: exactEquals$6, +equals: equals$7, +mul: mul$6, +sub: sub$4 +}); - /** - * Resize the array to discard unused capacity. - */ - _trim() { - if (this.length !== this.capacity) { - this.capacity = this.length; - this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement); - this._refreshViews(); - } - } +/** + * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied. + * @module mat4 + */ - /** - * Resets the the length of the array to 0 without de-allocating capcacity. - */ - clear() { - this.length = 0; - } +/** + * Creates a new identity mat4 + * + * @returns {mat4} a new 4x4 matrix + */ - /** - * 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. - */ - resize(n ) { - assert_1(!this.isTransferred); - this.reserve(n); - this.length = n; - } +function create$5() { + var out = new ARRAY_TYPE(16); - /** - * 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. - */ - 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); + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + } - const oldUint8Array = this.uint8; - this._refreshViews(); - if (oldUint8Array) this.uint8.set(oldUint8Array); - } - } + out[0] = 1; + out[5] = 1; + out[10] = 1; + out[15] = 1; + return out; +} +/** + * Creates a new mat4 initialized with values from an existing matrix + * + * @param {ReadonlyMat4} a matrix to clone + * @returns {mat4} a new 4x4 matrix + */ - /** - * Create TypedArray views for the current ArrayBuffer. - */ - _refreshViews() { - throw new Error('_refreshViews() must be implemented by each concrete StructArray layout'); - } +function clone$5(a) { + var out = new ARRAY_TYPE(16); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + 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]; + return out; } - /** - * 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. + * Copy the values from one mat4 to another * - * @private + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out */ -function createLayout( - members , - alignment = 1 -) { - - let offset = 0; - let maxSize = 0; - const layoutMembers = members.map((member) => { - assert_1(member.name.length); - const typeSize = sizeOf(member.type); - const memberOffset = offset = align(offset, Math.max(alignment, typeSize)); - const components = member.components || 1; - - maxSize = Math.max(maxSize, typeSize); - offset += typeSize * components; - - return { - name: member.name, - type: member.type, - components, - offset: memberOffset, - }; - }); - const size = align(offset, Math.max(maxSize, alignment)); +function copy$5(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + 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]; + return out; +} +/** + * Create a new mat4 with the given values + * + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m03 Component in column 0, row 3 position (index 3) + * @param {Number} m10 Component in column 1, row 0 position (index 4) + * @param {Number} m11 Component in column 1, row 1 position (index 5) + * @param {Number} m12 Component in column 1, row 2 position (index 6) + * @param {Number} m13 Component in column 1, row 3 position (index 7) + * @param {Number} m20 Component in column 2, row 0 position (index 8) + * @param {Number} m21 Component in column 2, row 1 position (index 9) + * @param {Number} m22 Component in column 2, row 2 position (index 10) + * @param {Number} m23 Component in column 2, row 3 position (index 11) + * @param {Number} m30 Component in column 3, row 0 position (index 12) + * @param {Number} m31 Component in column 3, row 1 position (index 13) + * @param {Number} m32 Component in column 3, row 2 position (index 14) + * @param {Number} m33 Component in column 3, row 3 position (index 15) + * @returns {mat4} A new mat4 + */ - return { - members: layoutMembers, - size, - alignment - }; +function fromValues$5(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { + var out = new ARRAY_TYPE(16); + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m03; + out[4] = m10; + out[5] = m11; + out[6] = m12; + out[7] = m13; + out[8] = m20; + out[9] = m21; + out[10] = m22; + out[11] = m23; + out[12] = m30; + out[13] = m31; + out[14] = m32; + out[15] = m33; + return out; } +/** + * Set the components of a mat4 to the given values + * + * @param {mat4} out the receiving matrix + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m03 Component in column 0, row 3 position (index 3) + * @param {Number} m10 Component in column 1, row 0 position (index 4) + * @param {Number} m11 Component in column 1, row 1 position (index 5) + * @param {Number} m12 Component in column 1, row 2 position (index 6) + * @param {Number} m13 Component in column 1, row 3 position (index 7) + * @param {Number} m20 Component in column 2, row 0 position (index 8) + * @param {Number} m21 Component in column 2, row 1 position (index 9) + * @param {Number} m22 Component in column 2, row 2 position (index 10) + * @param {Number} m23 Component in column 2, row 3 position (index 11) + * @param {Number} m30 Component in column 3, row 0 position (index 12) + * @param {Number} m31 Component in column 3, row 1 position (index 13) + * @param {Number} m32 Component in column 3, row 2 position (index 14) + * @param {Number} m33 Component in column 3, row 3 position (index 15) + * @returns {mat4} out + */ -function sizeOf(type ) { - return viewTypes[type].BYTES_PER_ELEMENT; +function set$5(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) { + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m03; + out[4] = m10; + out[5] = m11; + out[6] = m12; + out[7] = m13; + out[8] = m20; + out[9] = m21; + out[10] = m22; + out[11] = m23; + out[12] = m30; + out[13] = m31; + out[14] = m32; + out[15] = m33; + return out; } +/** + * Set a mat4 to the identity matrix + * + * @param {mat4} out the receiving matrix + * @returns {mat4} out + */ -function align(offset , size ) { - return Math.ceil(offset / size) * size; +function identity$3(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; } +/** + * Transpose the values of a mat4 + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ -// This file is generated. Edit build/generate-struct-arrays.js, then run `yarn run codegen`. +function transpose(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a12 = a[6], + a13 = a[7]; + var a23 = a[11]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + } else { + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a[1]; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a[2]; + out[9] = a[6]; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a[3]; + out[13] = a[7]; + out[14] = a[11]; + out[15] = a[15]; + } + return out; +} /** - * Implementation of the StructArray layout: - * [0]: Int16[2] + * Inverts a mat4 * - * @private + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out */ -class StructArrayLayout2i4 extends StructArray { - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.int16 = new Int16Array(this.arrayBuffer); - } - - emplaceBack(v0 , v1 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1); - } +function invert$2(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + var b00 = a00 * a11 - a01 * a10; + var b01 = a00 * a12 - a02 * a10; + var b02 = a00 * a13 - a03 * a10; + var b03 = a01 * a12 - a02 * a11; + var b04 = a01 * a13 - a03 * a11; + var b05 = a02 * a13 - a03 * a12; + var b06 = a20 * a31 - a21 * a30; + var b07 = a20 * a32 - a22 * a30; + var b08 = a20 * a33 - a23 * a30; + var b09 = a21 * a32 - a22 * a31; + var b10 = a21 * a33 - a23 * a31; + var b11 = a22 * a33 - a23 * a32; // Calculate the determinant - emplace(i , v0 , v1 ) { - const o2 = i * 2; - this.int16[o2 + 0] = v0; - this.int16[o2 + 1] = v1; - return i; - } -} + var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; -StructArrayLayout2i4.prototype.bytesPerElement = 4; -register('StructArrayLayout2i4', StructArrayLayout2i4); + 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; +} /** - * Implementation of the StructArray layout: - * [0]: Int16[4] + * Calculates the adjugate of a mat4 * - * @private + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out */ -class StructArrayLayout4i8 extends StructArray { - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.int16 = new Int16Array(this.arrayBuffer); - } +function adjoint(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + out[0] = a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22); + out[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22)); + out[2] = a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12); + out[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12)); + out[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22)); + out[5] = a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22); + out[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12)); + out[7] = a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12); + out[8] = a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21); + out[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21)); + out[10] = a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11); + out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11)); + out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21)); + out[13] = a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21); + out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11)); + out[15] = a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11); + return out; +} +/** + * Calculates the determinant of a mat4 + * + * @param {ReadonlyMat4} a the source matrix + * @returns {Number} determinant of a + */ - emplaceBack(v0 , v1 , v2 , v3 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3); - } +function determinant(a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + var b00 = a00 * a11 - a01 * a10; + var b01 = a00 * a12 - a02 * a10; + var b02 = a00 * a13 - a03 * a10; + var b03 = a01 * a12 - a02 * a11; + var b04 = a01 * a13 - a03 * a11; + var b05 = a02 * a13 - a03 * a12; + var b06 = a20 * a31 - a21 * a30; + var b07 = a20 * a32 - a22 * a30; + var b08 = a20 * a33 - a23 * a30; + var b09 = a21 * a32 - a22 * a31; + var b10 = a21 * a33 - a23 * a31; + var b11 = a22 * a33 - a23 * a32; // Calculate the determinant - emplace(i , v0 , v1 , v2 , v3 ) { - const 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 b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; } +/** + * Multiplies two mat4s + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ -StructArrayLayout4i8.prototype.bytesPerElement = 8; -register('StructArrayLayout4i8', StructArrayLayout4i8); +function multiply$5(out, a, b) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; // Cache only the current line of the second matrix + 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; +} /** - * Implementation of the StructArray layout: - * [0]: Int16[2] - * [4]: Uint8[4] - * [8]: Float32[1] + * Translate a mat4 by the given vector * - * @private + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to translate + * @param {ReadonlyVec3} v vector to translate by + * @returns {mat4} out */ -class StructArrayLayout2i4ub1f12 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.int16 = new Int16Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - } +function translate$1(out, a, v) { + var x = v[0], + y = v[1], + z = v[2]; + var a00, a01, a02, a03; + var a10, a11, a12, a13; + var a20, a21, a22, a23; - emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3, v4, v5, v6); - } + 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]; + } - emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { - const o2 = i * 6; - const o1 = i * 12; - const o4 = i * 3; - this.int16[o2 + 0] = v0; - this.int16[o2 + 1] = v1; - this.uint8[o1 + 4] = v2; - this.uint8[o1 + 5] = v3; - this.uint8[o1 + 6] = v4; - this.uint8[o1 + 7] = v5; - this.float32[o4 + 2] = v6; - return i; - } + return out; } - -StructArrayLayout2i4ub1f12.prototype.bytesPerElement = 12; -register('StructArrayLayout2i4ub1f12', StructArrayLayout2i4ub1f12); - /** - * Implementation of the StructArray layout: - * [0]: Float32[3] + * Scales the mat4 by the dimensions in the given vec3 not using vectorization * - * @private - */ -class StructArrayLayout3f12 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - } - - emplaceBack(v0 , v1 , v2 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2); - } + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to scale + * @param {ReadonlyVec3} v the vec3 to scale the matrix by + * @returns {mat4} out + **/ - emplace(i , v0 , v1 , v2 ) { - const o4 = i * 3; - this.float32[o4 + 0] = v0; - this.float32[o4 + 1] = v1; - this.float32[o4 + 2] = v2; - return i; - } +function scale$5(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; } - -StructArrayLayout3f12.prototype.bytesPerElement = 12; -register('StructArrayLayout3f12', StructArrayLayout3f12); - /** - * Implementation of the StructArray layout: - * [0]: Uint16[10] + * Rotates a mat4 by the given angle around the given axis * - * @private + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @param {ReadonlyVec3} axis the axis to rotate around + * @returns {mat4} out */ -class StructArrayLayout10ui20 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.uint16 = new Uint16Array(this.arrayBuffer); - } - emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9); - } +function rotate$1(out, a, rad, axis) { + var x = axis[0], + y = axis[1], + z = axis[2]; + var len = Math.hypot(x, y, z); + var s, c, t; + var a00, a01, a02, a03; + var a10, a11, a12, a13; + var a20, a21, a22, a23; + var b00, b01, b02; + var b10, b11, b12; + var b20, b21, b22; - emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 ) { - const o2 = i * 10; - this.uint16[o2 + 0] = v0; - this.uint16[o2 + 1] = v1; - this.uint16[o2 + 2] = v2; - this.uint16[o2 + 3] = v3; - this.uint16[o2 + 4] = v4; - this.uint16[o2 + 5] = v5; - this.uint16[o2 + 6] = v6; - this.uint16[o2 + 7] = v7; - this.uint16[o2 + 8] = v8; - this.uint16[o2 + 9] = v9; - return i; - } -} + if (len < EPSILON) { + return null; + } -StructArrayLayout10ui20.prototype.bytesPerElement = 20; -register('StructArrayLayout10ui20', StructArrayLayout10ui20); + len = 1 / len; + x *= len; + y *= len; + z *= len; + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; + 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]; // Construct the elements of the rotation matrix -/** - * Implementation of the StructArray layout: - * [0]: Uint16[8] - * - * @private - */ -class StructArrayLayout8ui16 extends StructArray { - - + b00 = x * x * t + c; + b01 = y * x * t + z * s; + b02 = z * x * t - y * s; + b10 = x * y * t - z * s; + b11 = y * y * t + c; + b12 = z * y * t + x * s; + b20 = x * z * t + y * s; + b21 = y * z * t - x * s; + b22 = z * z * t + c; // Perform rotation-specific matrix multiplication - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.uint16 = new Uint16Array(this.arrayBuffer); - } + out[0] = a00 * b00 + a10 * b01 + a20 * b02; + out[1] = a01 * b00 + a11 * b01 + a21 * b02; + out[2] = a02 * b00 + a12 * b01 + a22 * b02; + out[3] = a03 * b00 + a13 * b01 + a23 * b02; + out[4] = a00 * b10 + a10 * b11 + a20 * b12; + out[5] = a01 * b10 + a11 * b11 + a21 * b12; + out[6] = a02 * b10 + a12 * b11 + a22 * b12; + out[7] = a03 * b10 + a13 * b11 + a23 * b12; + out[8] = a00 * b20 + a10 * b21 + a20 * b22; + out[9] = a01 * b20 + a11 * b21 + a21 * b22; + out[10] = a02 * b20 + a12 * b21 + a22 * b22; + out[11] = a03 * b20 + a13 * b21 + a23 * b22; - emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7); - } + if (a !== out) { + // If the source and destination differ, copy the unchanged last row + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } - emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 ) { - const o2 = i * 8; - this.uint16[o2 + 0] = v0; - this.uint16[o2 + 1] = v1; - this.uint16[o2 + 2] = v2; - this.uint16[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 out; } - -StructArrayLayout8ui16.prototype.bytesPerElement = 16; -register('StructArrayLayout8ui16', StructArrayLayout8ui16); - /** - * Implementation of the StructArray layout: - * [0]: Int16[4] - * [8]: Uint16[4] - * [16]: Int16[4] - * [24]: Int16[4] + * Rotates a matrix by the given angle around the X axis * - * @private + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out */ -class StructArrayLayout4i4ui4i4i32 extends StructArray { - - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.int16 = new Int16Array(this.arrayBuffer); - this.uint16 = new Uint16Array(this.arrayBuffer); - } - emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15); - } +function rotateX$3(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a10 = a[4]; + var a11 = a[5]; + var a12 = a[6]; + var a13 = a[7]; + var a20 = a[8]; + var a21 = a[9]; + var a22 = a[10]; + var a23 = a[11]; - emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 ) { - const o2 = i * 16; - 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; - this.int16[o2 + 8] = v8; - this.int16[o2 + 9] = v9; - this.int16[o2 + 10] = v10; - this.int16[o2 + 11] = v11; - this.int16[o2 + 12] = v12; - this.int16[o2 + 13] = v13; - this.int16[o2 + 14] = v14; - this.int16[o2 + 15] = v15; - return i; - } -} + if (a !== out) { + // If the source and destination differ, copy the unchanged rows + 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]; + } // Perform axis-specific matrix multiplication -StructArrayLayout4i4ui4i4i32.prototype.bytesPerElement = 32; -register('StructArrayLayout4i4ui4i4i32', StructArrayLayout4i4ui4i4i32); + 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; +} /** - * Implementation of the StructArray layout: - * [0]: Uint32[1] + * Rotates a matrix by the given angle around the Y axis * - * @private + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out */ -class StructArrayLayout1ul4 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.uint32 = new Uint32Array(this.arrayBuffer); - } - emplaceBack(v0 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0); - } +function rotateY$3(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a00 = a[0]; + var a01 = a[1]; + var a02 = a[2]; + var a03 = a[3]; + var a20 = a[8]; + var a21 = a[9]; + var a22 = a[10]; + var a23 = a[11]; - emplace(i , v0 ) { - const o4 = i * 1; - this.uint32[o4 + 0] = v0; - return i; - } -} + if (a !== out) { + // If the source and destination differ, copy the unchanged rows + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } // Perform axis-specific matrix multiplication -StructArrayLayout1ul4.prototype.bytesPerElement = 4; -register('StructArrayLayout1ul4', StructArrayLayout1ul4); + out[0] = a00 * c - a20 * s; + out[1] = a01 * c - a21 * s; + out[2] = a02 * c - a22 * s; + out[3] = a03 * c - a23 * s; + out[8] = a00 * s + a20 * c; + out[9] = a01 * s + a21 * c; + out[10] = a02 * s + a22 * c; + out[11] = a03 * s + a23 * c; + return out; +} /** - * Implementation of the StructArray layout: - * [0]: Int16[5] - * [12]: Float32[4] - * [28]: Int16[1] - * [32]: Uint32[1] - * [36]: Uint16[2] + * Rotates a matrix by the given angle around the Z axis * - * @private + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out */ -class StructArrayLayout5i4f1i1ul2ui40 extends StructArray { - - - - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.int16 = new Int16Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - this.uint32 = new Uint32Array(this.arrayBuffer); - this.uint16 = new Uint16Array(this.arrayBuffer); - } - emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12); - } +function rotateZ$3(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a00 = a[0]; + var a01 = a[1]; + var a02 = a[2]; + var a03 = a[3]; + var a10 = a[4]; + var a11 = a[5]; + var a12 = a[6]; + var a13 = a[7]; - emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 ) { - const o2 = i * 20; - const o4 = i * 10; - 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.float32[o4 + 3] = v5; - this.float32[o4 + 4] = v6; - this.float32[o4 + 5] = v7; - this.float32[o4 + 6] = v8; - this.int16[o2 + 14] = v9; - this.uint32[o4 + 8] = v10; - this.uint16[o2 + 18] = v11; - this.uint16[o2 + 19] = v12; - return i; - } -} + if (a !== out) { + // If the source and destination differ, copy the unchanged last row + 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]; + } // Perform axis-specific matrix multiplication -StructArrayLayout5i4f1i1ul2ui40.prototype.bytesPerElement = 40; -register('StructArrayLayout5i4f1i1ul2ui40', StructArrayLayout5i4f1i1ul2ui40); + 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; +} /** - * Implementation of the StructArray layout: - * [0]: Int16[3] - * [8]: Int16[2] - * [12]: Int16[2] + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): * - * @private + * mat4.identity(dest); + * mat4.translate(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyVec3} v Translation vector + * @returns {mat4} out */ -class StructArrayLayout3i2i2i16 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.int16 = new Int16Array(this.arrayBuffer); - } - - emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3, v4, v5, v6); - } - emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { - const o2 = i * 8; - this.int16[o2 + 0] = v0; - this.int16[o2 + 1] = v1; - this.int16[o2 + 2] = v2; - this.int16[o2 + 4] = v3; - this.int16[o2 + 5] = v4; - this.int16[o2 + 6] = v5; - this.int16[o2 + 7] = v6; - return i; - } +function fromTranslation$1(out, v) { + 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] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; } - -StructArrayLayout3i2i2i16.prototype.bytesPerElement = 16; -register('StructArrayLayout3i2i2i16', StructArrayLayout3i2i2i16); - /** - * Implementation of the StructArray layout: - * [0]: Float32[2] - * [8]: Float32[1] - * [12]: Int16[2] + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): * - * @private + * mat4.identity(dest); + * mat4.scale(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyVec3} v Scaling vector + * @returns {mat4} out */ -class StructArrayLayout2f1f2i16 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - this.int16 = new Int16Array(this.arrayBuffer); - } - - emplaceBack(v0 , v1 , v2 , v3 , v4 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3, v4); - } - - emplace(i , v0 , v1 , v2 , v3 , v4 ) { - const o4 = i * 4; - const o2 = i * 8; - this.float32[o4 + 0] = v0; - this.float32[o4 + 1] = v1; - this.float32[o4 + 2] = v2; - this.int16[o2 + 6] = v3; - this.int16[o2 + 7] = v4; - return i; - } +function fromScaling(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = v[1]; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = v[2]; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; } - -StructArrayLayout2f1f2i16.prototype.bytesPerElement = 16; -register('StructArrayLayout2f1f2i16', StructArrayLayout2f1f2i16); - /** - * Implementation of the StructArray layout: - * [0]: Uint8[2] - * [4]: Float32[2] + * Creates a matrix from a given angle around a given axis + * This is equivalent to (but much faster than): * - * @private + * mat4.identity(dest); + * mat4.rotate(dest, dest, rad, axis); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @param {ReadonlyVec3} axis the axis to rotate around + * @returns {mat4} out */ -class StructArrayLayout2ub2f12 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - } - emplaceBack(v0 , v1 , v2 , v3 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3); - } +function fromRotation$1(out, rad, axis) { + var x = axis[0], + y = axis[1], + z = axis[2]; + var len = Math.hypot(x, y, z); + var s, c, t; - emplace(i , v0 , v1 , v2 , v3 ) { - const o1 = i * 12; - const o4 = i * 3; - this.uint8[o1 + 0] = v0; - this.uint8[o1 + 1] = v1; - this.float32[o4 + 1] = v2; - this.float32[o4 + 2] = v3; - return i; - } -} + if (len < EPSILON) { + return null; + } -StructArrayLayout2ub2f12.prototype.bytesPerElement = 12; -register('StructArrayLayout2ub2f12', StructArrayLayout2ub2f12); + len = 1 / len; + x *= len; + y *= len; + z *= len; + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; // Perform rotation-specific matrix multiplication + out[0] = x * x * t + c; + out[1] = y * x * t + z * s; + out[2] = z * x * t - y * s; + out[3] = 0; + out[4] = x * y * t - z * s; + out[5] = y * y * t + c; + out[6] = z * y * t + x * s; + out[7] = 0; + out[8] = x * z * t + y * s; + out[9] = y * z * t - x * s; + out[10] = z * z * t + c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} /** - * Implementation of the StructArray layout: - * [0]: Uint16[3] + * Creates a matrix from the given angle around the X axis + * This is equivalent to (but much faster than): * - * @private + * mat4.identity(dest); + * mat4.rotateX(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out */ -class StructArrayLayout3ui6 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.uint16 = new Uint16Array(this.arrayBuffer); - } - emplaceBack(v0 , v1 , v2 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2); - } +function fromXRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication - emplace(i , v0 , v1 , v2 ) { - const o2 = i * 3; - this.uint16[o2 + 0] = v0; - this.uint16[o2 + 1] = v1; - this.uint16[o2 + 2] = v2; - return i; - } + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = c; + out[6] = s; + out[7] = 0; + out[8] = 0; + out[9] = -s; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; } - -StructArrayLayout3ui6.prototype.bytesPerElement = 6; -register('StructArrayLayout3ui6', StructArrayLayout3ui6); - /** - * Implementation of the StructArray layout: - * [0]: Int16[3] - * [8]: Float32[2] - * [16]: Uint16[2] - * [20]: Uint32[3] - * [32]: Uint16[3] - * [40]: Float32[2] - * [48]: Uint8[3] - * [52]: Uint32[1] - * [56]: Int16[1] - * [58]: Uint8[1] + * Creates a matrix from the given angle around the Y axis + * This is equivalent to (but much faster than): * - * @private + * mat4.identity(dest); + * mat4.rotateY(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out */ -class StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60 extends StructArray { - - - - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.int16 = new Int16Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - this.uint16 = new Uint16Array(this.arrayBuffer); - this.uint32 = new Uint32Array(this.arrayBuffer); - } - emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 , v20 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20); - } +function fromYRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication - emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 , v20 ) { - const o2 = i * 30; - const o4 = i * 15; - const o1 = i * 60; - this.int16[o2 + 0] = v0; - this.int16[o2 + 1] = v1; - this.int16[o2 + 2] = v2; - this.float32[o4 + 2] = v3; - this.float32[o4 + 3] = v4; - this.uint16[o2 + 8] = v5; - this.uint16[o2 + 9] = v6; - this.uint32[o4 + 5] = v7; - this.uint32[o4 + 6] = v8; - this.uint32[o4 + 7] = v9; - this.uint16[o2 + 16] = v10; - this.uint16[o2 + 17] = v11; - this.uint16[o2 + 18] = v12; - this.float32[o4 + 10] = v13; - this.float32[o4 + 11] = v14; - this.uint8[o1 + 48] = v15; - this.uint8[o1 + 49] = v16; - this.uint8[o1 + 50] = v17; - this.uint32[o4 + 13] = v18; - this.int16[o2 + 28] = v19; - this.uint8[o1 + 58] = v20; - return i; - } + out[0] = c; + out[1] = 0; + out[2] = -s; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = s; + out[9] = 0; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; } - -StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60.prototype.bytesPerElement = 60; -register('StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60', StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60); - /** - * Implementation of the StructArray layout: - * [0]: Int16[3] - * [8]: Float32[2] - * [16]: Int16[6] - * [28]: Uint16[15] - * [60]: Uint32[1] - * [64]: Float32[3] + * Creates a matrix from the given angle around the Z axis + * This is equivalent to (but much faster than): * - * @private + * mat4.identity(dest); + * mat4.rotateZ(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out */ -class StructArrayLayout3i2f6i15ui1ul3f76 extends StructArray { - - - - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.int16 = new Int16Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - this.uint16 = new Uint16Array(this.arrayBuffer); - this.uint32 = new Uint32Array(this.arrayBuffer); - } - emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 , v20 , v21 , v22 , v23 , v24 , v25 , v26 , v27 , v28 , v29 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29); - } +function fromZRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication - emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 , v9 , v10 , v11 , v12 , v13 , v14 , v15 , v16 , v17 , v18 , v19 , v20 , v21 , v22 , v23 , v24 , v25 , v26 , v27 , v28 , v29 ) { - const o2 = i * 38; - const o4 = i * 19; - this.int16[o2 + 0] = v0; - this.int16[o2 + 1] = v1; - this.int16[o2 + 2] = v2; - this.float32[o4 + 2] = v3; - this.float32[o4 + 3] = v4; - this.int16[o2 + 8] = v5; - this.int16[o2 + 9] = v6; - this.int16[o2 + 10] = v7; - this.int16[o2 + 11] = v8; - this.int16[o2 + 12] = v9; - this.int16[o2 + 13] = v10; - this.uint16[o2 + 14] = v11; - this.uint16[o2 + 15] = v12; - this.uint16[o2 + 16] = v13; - this.uint16[o2 + 17] = v14; - this.uint16[o2 + 18] = v15; - this.uint16[o2 + 19] = v16; - this.uint16[o2 + 20] = v17; - this.uint16[o2 + 21] = v18; - this.uint16[o2 + 22] = v19; - this.uint16[o2 + 23] = v20; - this.uint16[o2 + 24] = v21; - this.uint16[o2 + 25] = v22; - this.uint16[o2 + 26] = v23; - this.uint16[o2 + 27] = v24; - this.uint16[o2 + 28] = v25; - this.uint32[o4 + 15] = v26; - this.float32[o4 + 16] = v27; - this.float32[o4 + 17] = v28; - this.float32[o4 + 18] = v29; - return i; - } + out[0] = c; + out[1] = s; + out[2] = 0; + out[3] = 0; + out[4] = -s; + out[5] = c; + 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; } - -StructArrayLayout3i2f6i15ui1ul3f76.prototype.bytesPerElement = 76; -register('StructArrayLayout3i2f6i15ui1ul3f76', StructArrayLayout3i2f6i15ui1ul3f76); - /** - * Implementation of the StructArray layout: - * [0]: Float32[1] + * Creates a matrix from a quaternion rotation and vector translation + * This is equivalent to (but much faster than): * - * @private + * mat4.identity(dest); + * mat4.translate(dest, vec); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @returns {mat4} out */ -class StructArrayLayout1f4 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - } - - emplaceBack(v0 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0); - } - emplace(i , v0 ) { - const o4 = i * 1; - this.float32[o4 + 0] = v0; - return i; - } +function fromRotationTranslation$1(out, q, v) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + out[0] = 1 - (yy + zz); + out[1] = xy + wz; + out[2] = xz - wy; + out[3] = 0; + out[4] = xy - wz; + out[5] = 1 - (xx + zz); + out[6] = yz + wx; + out[7] = 0; + out[8] = xz + wy; + out[9] = yz - wx; + out[10] = 1 - (xx + yy); + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; } - -StructArrayLayout1f4.prototype.bytesPerElement = 4; -register('StructArrayLayout1f4', StructArrayLayout1f4); - /** - * Implementation of the StructArray layout: - * [0]: Int16[3] + * Creates a new mat4 from a dual quat. * - * @private + * @param {mat4} out Matrix + * @param {ReadonlyQuat2} a Dual Quaternion + * @returns {mat4} mat4 receiving operation result */ -class StructArrayLayout3i6 extends StructArray { - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.int16 = new Int16Array(this.arrayBuffer); - } +function fromQuat2(out, a) { + var translation = new ARRAY_TYPE(3); + var bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3], + ax = a[4], + ay = a[5], + az = a[6], + aw = a[7]; + var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense - emplaceBack(v0 , v1 , v2 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2); - } + if (magnitude > 0) { + translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude; + translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude; + translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude; + } else { + translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; + translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; + translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; + } - emplace(i , v0 , v1 , v2 ) { - const o2 = i * 3; - this.int16[o2 + 0] = v0; - this.int16[o2 + 1] = v1; - this.int16[o2 + 2] = v2; - return i; - } + fromRotationTranslation$1(out, a, translation); + return out; } - -StructArrayLayout3i6.prototype.bytesPerElement = 6; -register('StructArrayLayout3i6', StructArrayLayout3i6); - /** - * Implementation of the StructArray layout: - * [0]: Float32[7] - * - * @private + * Returns the translation vector component of a transformation + * matrix. If a matrix is built with fromRotationTranslation, + * the returned vector will be the same as the translation vector + * originally supplied. + * @param {vec3} out Vector to receive translation component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {vec3} out */ -class StructArrayLayout7f28 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - } - - emplaceBack(v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3, v4, v5, v6); - } - emplace(i , v0 , v1 , v2 , v3 , v4 , v5 , v6 ) { - const o4 = i * 7; - this.float32[o4 + 0] = v0; - this.float32[o4 + 1] = v1; - this.float32[o4 + 2] = v2; - this.float32[o4 + 3] = v3; - this.float32[o4 + 4] = v4; - this.float32[o4 + 5] = v5; - this.float32[o4 + 6] = v6; - return i; - } +function getTranslation$1(out, mat) { + out[0] = mat[12]; + out[1] = mat[13]; + out[2] = mat[14]; + return out; } - -StructArrayLayout7f28.prototype.bytesPerElement = 28; -register('StructArrayLayout7f28', StructArrayLayout7f28); - /** - * Implementation of the StructArray layout: - * [0]: Uint32[1] - * [4]: Uint16[3] - * - * @private + * Returns the scaling factor component of a transformation + * matrix. If a matrix is built with fromRotationTranslationScale + * with a normalized Quaternion paramter, the returned vector will be + * the same as the scaling vector + * originally supplied. + * @param {vec3} out Vector to receive scaling factor component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {vec3} out */ -class StructArrayLayout1ul3ui12 extends StructArray { - - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.uint32 = new Uint32Array(this.arrayBuffer); - this.uint16 = new Uint16Array(this.arrayBuffer); - } - emplaceBack(v0 , v1 , v2 , v3 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3); - } - - emplace(i , v0 , v1 , v2 , v3 ) { - const o4 = i * 3; - const o2 = i * 6; - this.uint32[o4 + 0] = v0; - this.uint16[o2 + 2] = v1; - this.uint16[o2 + 3] = v2; - this.uint16[o2 + 4] = v3; - return i; - } +function getScaling(out, mat) { + var m11 = mat[0]; + var m12 = mat[1]; + var m13 = mat[2]; + var m21 = mat[4]; + var m22 = mat[5]; + var m23 = mat[6]; + var m31 = mat[8]; + var m32 = mat[9]; + var m33 = mat[10]; + out[0] = Math.hypot(m11, m12, m13); + out[1] = Math.hypot(m21, m22, m23); + out[2] = Math.hypot(m31, m32, m33); + return out; } - -StructArrayLayout1ul3ui12.prototype.bytesPerElement = 12; -register('StructArrayLayout1ul3ui12', StructArrayLayout1ul3ui12); - /** - * Implementation of the StructArray layout: - * [0]: Uint16[2] - * - * @private + * Returns a quaternion representing the rotational component + * of a transformation matrix. If a matrix is built with + * fromRotationTranslation, the returned quaternion will be the + * same as the quaternion originally supplied. + * @param {quat} out Quaternion to receive the rotation component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {quat} out */ -class StructArrayLayout2ui4 extends StructArray { - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.uint16 = new Uint16Array(this.arrayBuffer); - } +function getRotation(out, mat) { + var scaling = new ARRAY_TYPE(3); + getScaling(scaling, mat); + var is1 = 1 / scaling[0]; + var is2 = 1 / scaling[1]; + var is3 = 1 / scaling[2]; + var sm11 = mat[0] * is1; + var sm12 = mat[1] * is2; + var sm13 = mat[2] * is3; + var sm21 = mat[4] * is1; + var sm22 = mat[5] * is2; + var sm23 = mat[6] * is3; + var sm31 = mat[8] * is1; + var sm32 = mat[9] * is2; + var sm33 = mat[10] * is3; + var trace = sm11 + sm22 + sm33; + var S = 0; - emplaceBack(v0 , v1 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1); - } + if (trace > 0) { + S = Math.sqrt(trace + 1.0) * 2; + out[3] = 0.25 * S; + out[0] = (sm23 - sm32) / S; + out[1] = (sm31 - sm13) / S; + out[2] = (sm12 - sm21) / S; + } else if (sm11 > sm22 && sm11 > sm33) { + S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2; + out[3] = (sm23 - sm32) / S; + out[0] = 0.25 * S; + out[1] = (sm12 + sm21) / S; + out[2] = (sm31 + sm13) / S; + } else if (sm22 > sm33) { + S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2; + out[3] = (sm31 - sm13) / S; + out[0] = (sm12 + sm21) / S; + out[1] = 0.25 * S; + out[2] = (sm23 + sm32) / S; + } else { + S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2; + out[3] = (sm12 - sm21) / S; + out[0] = (sm31 + sm13) / S; + out[1] = (sm23 + sm32) / S; + out[2] = 0.25 * S; + } - emplace(i , v0 , v1 ) { - const o2 = i * 2; - this.uint16[o2 + 0] = v0; - this.uint16[o2 + 1] = v1; - return i; - } + return out; } - -StructArrayLayout2ui4.prototype.bytesPerElement = 4; -register('StructArrayLayout2ui4', StructArrayLayout2ui4); - /** - * Implementation of the StructArray layout: - * [0]: Uint16[1] + * Creates a matrix from a quaternion rotation, vector translation and vector scale + * This is equivalent to (but much faster than): * - * @private + * mat4.identity(dest); + * mat4.translate(dest, vec); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @param {ReadonlyVec3} s Scaling vector + * @returns {mat4} out */ -class StructArrayLayout1ui2 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.uint16 = new Uint16Array(this.arrayBuffer); - } - emplaceBack(v0 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0); - } - - emplace(i , v0 ) { - const o2 = i * 1; - this.uint16[o2 + 0] = v0; - return i; - } +function fromRotationTranslationScale(out, q, v, s) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + var sx = s[0]; + var sy = s[1]; + var sz = s[2]; + out[0] = (1 - (yy + zz)) * sx; + out[1] = (xy + wz) * sx; + out[2] = (xz - wy) * sx; + out[3] = 0; + out[4] = (xy - wz) * sy; + out[5] = (1 - (xx + zz)) * sy; + out[6] = (yz + wx) * sy; + out[7] = 0; + out[8] = (xz + wy) * sz; + out[9] = (yz - wx) * sz; + out[10] = (1 - (xx + yy)) * sz; + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; } - -StructArrayLayout1ui2.prototype.bytesPerElement = 2; -register('StructArrayLayout1ui2', StructArrayLayout1ui2); - /** - * Implementation of the StructArray layout: - * [0]: Float32[2] + * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin + * This is equivalent to (but much faster than): * - * @private + * mat4.identity(dest); + * mat4.translate(dest, vec); + * mat4.translate(dest, origin); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * mat4.translate(dest, negativeOrigin); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @param {ReadonlyVec3} s Scaling vector + * @param {ReadonlyVec3} o The origin vector around which to scale and rotate + * @returns {mat4} out */ -class StructArrayLayout2f8 extends StructArray { - - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - } - - emplaceBack(v0 , v1 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1); - } - emplace(i , v0 , v1 ) { - const o4 = i * 2; - this.float32[o4 + 0] = v0; - this.float32[o4 + 1] = v1; - return i; - } +function fromRotationTranslationScaleOrigin(out, q, v, s, o) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + var sx = s[0]; + var sy = s[1]; + var sz = s[2]; + var ox = o[0]; + var oy = o[1]; + var oz = o[2]; + var out0 = (1 - (yy + zz)) * sx; + var out1 = (xy + wz) * sx; + var out2 = (xz - wy) * sx; + var out4 = (xy - wz) * sy; + var out5 = (1 - (xx + zz)) * sy; + var out6 = (yz + wx) * sy; + var out8 = (xz + wy) * sz; + var out9 = (yz - wx) * sz; + var out10 = (1 - (xx + yy)) * sz; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = 0; + out[4] = out4; + out[5] = out5; + out[6] = out6; + out[7] = 0; + out[8] = out8; + out[9] = out9; + out[10] = out10; + out[11] = 0; + out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz); + out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz); + out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz); + out[15] = 1; + return out; } - -StructArrayLayout2f8.prototype.bytesPerElement = 8; -register('StructArrayLayout2f8', StructArrayLayout2f8); - /** - * Implementation of the StructArray layout: - * [0]: Float32[4] + * Calculates a 4x4 matrix from the given quaternion * - * @private + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyQuat} q Quaternion to create matrix from + * + * @returns {mat4} out */ -class StructArrayLayout4f16 extends StructArray { - - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - } - - emplaceBack(v0 , v1 , v2 , v3 ) { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2, v3); - } - - emplace(i , v0 , v1 , v2 , v3 ) { - const 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; - } -} - -StructArrayLayout4f16.prototype.bytesPerElement = 16; -register('StructArrayLayout4f16', StructArrayLayout4f16); - -class CollisionBoxStruct extends Struct { - - - - - - - - - - - - - - - get projectedAnchorX() { return this._structArray.int16[this._pos2 + 0]; } - get projectedAnchorY() { return this._structArray.int16[this._pos2 + 1]; } - get projectedAnchorZ() { return this._structArray.int16[this._pos2 + 2]; } - get tileAnchorX() { return this._structArray.int16[this._pos2 + 3]; } - get tileAnchorY() { return this._structArray.int16[this._pos2 + 4]; } - get x1() { return this._structArray.float32[this._pos4 + 3]; } - get y1() { return this._structArray.float32[this._pos4 + 4]; } - get x2() { return this._structArray.float32[this._pos4 + 5]; } - get y2() { return this._structArray.float32[this._pos4 + 6]; } - get padding() { return this._structArray.int16[this._pos2 + 14]; } - get featureIndex() { return this._structArray.uint32[this._pos4 + 8]; } - get sourceLayerIndex() { return this._structArray.uint16[this._pos2 + 18]; } - get bucketIndex() { return this._structArray.uint16[this._pos2 + 19]; } +function fromQuat(out, q) { + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var yx = y * x2; + var yy = y * y2; + var zx = z * x2; + var zy = z * y2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + out[0] = 1 - yy - zz; + out[1] = yx + wz; + out[2] = zx - wy; + out[3] = 0; + out[4] = yx - wz; + out[5] = 1 - xx - zz; + out[6] = zy + wx; + out[7] = 0; + out[8] = zx + wy; + out[9] = zy - wx; + out[10] = 1 - xx - yy; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; } - -CollisionBoxStruct.prototype.size = 40; - - - /** - * @private + * Generates a frustum matrix with the given bounds + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {Number} left Left bound of the frustum + * @param {Number} right Right bound of the frustum + * @param {Number} bottom Bottom bound of the frustum + * @param {Number} top Top bound of the frustum + * @param {Number} near Near bound of the frustum + * @param {Number} far Far bound of the frustum + * @returns {mat4} out */ -class CollisionBoxArray extends StructArrayLayout5i4f1i1ul2ui40 { - /** - * Return the CollisionBoxStruct at the given location in the array. - * @param {number} index The index of the element. - * @private - */ - get(index ) { - assert_1(!this.isTransferred); - return new CollisionBoxStruct(this, index); - } -} - -register('CollisionBoxArray', CollisionBoxArray); -class PlacedSymbolStruct extends Struct { - - - - - - - - - - - - - - - - - - - - - - - get projectedAnchorX() { return this._structArray.int16[this._pos2 + 0]; } - get projectedAnchorY() { return this._structArray.int16[this._pos2 + 1]; } - get projectedAnchorZ() { return this._structArray.int16[this._pos2 + 2]; } - get tileAnchorX() { return this._structArray.float32[this._pos4 + 2]; } - get tileAnchorY() { return this._structArray.float32[this._pos4 + 3]; } - get glyphStartIndex() { return this._structArray.uint16[this._pos2 + 8]; } - get numGlyphs() { return this._structArray.uint16[this._pos2 + 9]; } - get vertexStartIndex() { return this._structArray.uint32[this._pos4 + 5]; } - get lineStartIndex() { return this._structArray.uint32[this._pos4 + 6]; } - get lineLength() { return this._structArray.uint32[this._pos4 + 7]; } - get segment() { return this._structArray.uint16[this._pos2 + 16]; } - get lowerSize() { return this._structArray.uint16[this._pos2 + 17]; } - get upperSize() { return this._structArray.uint16[this._pos2 + 18]; } - get lineOffsetX() { return this._structArray.float32[this._pos4 + 10]; } - get lineOffsetY() { return this._structArray.float32[this._pos4 + 11]; } - get writingMode() { return this._structArray.uint8[this._pos1 + 48]; } - get placedOrientation() { return this._structArray.uint8[this._pos1 + 49]; } - set placedOrientation(x ) { this._structArray.uint8[this._pos1 + 49] = x; } - get hidden() { return this._structArray.uint8[this._pos1 + 50]; } - set hidden(x ) { this._structArray.uint8[this._pos1 + 50] = x; } - get crossTileID() { return this._structArray.uint32[this._pos4 + 13]; } - set crossTileID(x ) { this._structArray.uint32[this._pos4 + 13] = x; } - get associatedIconIndex() { return this._structArray.int16[this._pos2 + 28]; } - get flipState() { return this._structArray.uint8[this._pos1 + 58]; } - set flipState(x ) { this._structArray.uint8[this._pos1 + 58] = x; } +function frustum(out, left, right, bottom, top, near, far) { + var rl = 1 / (right - left); + var tb = 1 / (top - bottom); + var nf = 1 / (near - far); + out[0] = near * 2 * rl; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = near * 2 * tb; + out[6] = 0; + out[7] = 0; + out[8] = (right + left) * rl; + out[9] = (top + bottom) * tb; + out[10] = (far + near) * nf; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[14] = far * near * 2 * nf; + out[15] = 0; + return out; } - -PlacedSymbolStruct.prototype.size = 60; - - - /** - * @private + * Generates a perspective projection matrix with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1], + * which matches WebGL/OpenGL's clip volume. + * Passing null/undefined/no value for far will generate infinite projection matrix. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} fovy Vertical field of view in radians + * @param {number} aspect Aspect ratio. typically viewport width/height + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum, can be null or Infinity + * @returns {mat4} out */ -class PlacedSymbolArray extends StructArrayLayout3i2f2ui3ul3ui2f3ub1ul1i1ub60 { - /** - * Return the PlacedSymbolStruct at the given location in the array. - * @param {number} index The index of the element. - * @private - */ - get(index ) { - assert_1(!this.isTransferred); - return new PlacedSymbolStruct(this, index); - } -} - -register('PlacedSymbolArray', PlacedSymbolArray); - -class SymbolInstanceStruct extends Struct { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - get projectedAnchorX() { return this._structArray.int16[this._pos2 + 0]; } - get projectedAnchorY() { return this._structArray.int16[this._pos2 + 1]; } - get projectedAnchorZ() { return this._structArray.int16[this._pos2 + 2]; } - get tileAnchorX() { return this._structArray.float32[this._pos4 + 2]; } - get tileAnchorY() { return this._structArray.float32[this._pos4 + 3]; } - get rightJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 8]; } - get centerJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 9]; } - get leftJustifiedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 10]; } - get verticalPlacedTextSymbolIndex() { return this._structArray.int16[this._pos2 + 11]; } - get placedIconSymbolIndex() { return this._structArray.int16[this._pos2 + 12]; } - get verticalPlacedIconSymbolIndex() { return this._structArray.int16[this._pos2 + 13]; } - get key() { return this._structArray.uint16[this._pos2 + 14]; } - get textBoxStartIndex() { return this._structArray.uint16[this._pos2 + 15]; } - get textBoxEndIndex() { return this._structArray.uint16[this._pos2 + 16]; } - get verticalTextBoxStartIndex() { return this._structArray.uint16[this._pos2 + 17]; } - get verticalTextBoxEndIndex() { return this._structArray.uint16[this._pos2 + 18]; } - get iconBoxStartIndex() { return this._structArray.uint16[this._pos2 + 19]; } - get iconBoxEndIndex() { return this._structArray.uint16[this._pos2 + 20]; } - get verticalIconBoxStartIndex() { return this._structArray.uint16[this._pos2 + 21]; } - get verticalIconBoxEndIndex() { return this._structArray.uint16[this._pos2 + 22]; } - get featureIndex() { return this._structArray.uint16[this._pos2 + 23]; } - get numHorizontalGlyphVertices() { return this._structArray.uint16[this._pos2 + 24]; } - get numVerticalGlyphVertices() { return this._structArray.uint16[this._pos2 + 25]; } - get numIconVertices() { return this._structArray.uint16[this._pos2 + 26]; } - get numVerticalIconVertices() { return this._structArray.uint16[this._pos2 + 27]; } - get useRuntimeCollisionCircles() { return this._structArray.uint16[this._pos2 + 28]; } - get crossTileID() { return this._structArray.uint32[this._pos4 + 15]; } - set crossTileID(x ) { this._structArray.uint32[this._pos4 + 15] = x; } - get textOffset0() { return this._structArray.float32[this._pos4 + 16]; } - get textOffset1() { return this._structArray.float32[this._pos4 + 17]; } - get collisionCircleDiameter() { return this._structArray.float32[this._pos4 + 18]; } -} -SymbolInstanceStruct.prototype.size = 76; +function perspectiveNO(out, fovy, aspect, near, far) { + var f = 1.0 / Math.tan(fovy / 2), + nf; + 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[11] = -1; + out[12] = 0; + out[13] = 0; + out[15] = 0; - + if (far != null && far !== Infinity) { + nf = 1 / (near - far); + out[10] = (far + near) * nf; + out[14] = 2 * far * near * nf; + } else { + out[10] = -1; + out[14] = -2 * near; + } + return out; +} /** - * @private + * Alias for {@link mat4.perspectiveNO} + * @function */ -class SymbolInstanceArray extends StructArrayLayout3i2f6i15ui1ul3f76 { - /** - * Return the SymbolInstanceStruct at the given location in the array. - * @param {number} index The index of the element. - * @private - */ - get(index ) { - assert_1(!this.isTransferred); - return new SymbolInstanceStruct(this, index); - } -} - -register('SymbolInstanceArray', SymbolInstanceArray); +var perspective = perspectiveNO; /** - * @private + * Generates a perspective projection matrix suitable for WebGPU with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1], + * which matches WebGPU/Vulkan/DirectX/Metal's clip volume. + * Passing null/undefined/no value for far will generate infinite projection matrix. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} fovy Vertical field of view in radians + * @param {number} aspect Aspect ratio. typically viewport width/height + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum, can be null or Infinity + * @returns {mat4} out */ -class GlyphOffsetArray extends StructArrayLayout1f4 { - getoffsetX(index ) { return this.float32[index * 1 + 0]; } -} -register('GlyphOffsetArray', GlyphOffsetArray); +function perspectiveZO(out, fovy, aspect, near, far) { + var f = 1.0 / Math.tan(fovy / 2), + nf; + 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[11] = -1; + out[12] = 0; + out[13] = 0; + out[15] = 0; + + if (far != null && far !== Infinity) { + nf = 1 / (near - far); + out[10] = far * nf; + out[14] = far * near * nf; + } else { + out[10] = -1; + out[14] = -near; + } + return out; +} /** - * @private + * Generates a perspective projection matrix with the given field of view. + * This is primarily useful for generating projection matrices to be used + * with the still experiemental WebVR API. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out */ -class SymbolLineVertexArray extends StructArrayLayout3i6 { - getx(index ) { return this.int16[index * 3 + 0]; } - gety(index ) { return this.int16[index * 3 + 1]; } - gettileUnitDistanceFromAnchor(index ) { return this.int16[index * 3 + 2]; } -} - -register('SymbolLineVertexArray', SymbolLineVertexArray); -class FeatureIndexStruct extends Struct { - - - - - - get featureIndex() { return this._structArray.uint32[this._pos4 + 0]; } - get sourceLayerIndex() { return this._structArray.uint16[this._pos2 + 2]; } - get bucketIndex() { return this._structArray.uint16[this._pos2 + 3]; } - get layoutVertexArrayOffset() { return this._structArray.uint16[this._pos2 + 4]; } +function perspectiveFromFieldOfView(out, fov, near, far) { + var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0); + var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0); + var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0); + var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0); + var xScale = 2.0 / (leftTan + rightTan); + var yScale = 2.0 / (upTan + downTan); + out[0] = xScale; + out[1] = 0.0; + out[2] = 0.0; + out[3] = 0.0; + out[4] = 0.0; + out[5] = yScale; + out[6] = 0.0; + out[7] = 0.0; + out[8] = -((leftTan - rightTan) * xScale * 0.5); + out[9] = (upTan - downTan) * yScale * 0.5; + out[10] = far / (near - far); + out[11] = -1.0; + out[12] = 0.0; + out[13] = 0.0; + out[14] = far * near / (near - far); + out[15] = 0.0; + return out; } - -FeatureIndexStruct.prototype.size = 12; - - - /** - * @private + * Generates a orthogonal projection matrix with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1], + * which matches WebGL/OpenGL's clip volume. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} left Left bound of the frustum + * @param {number} right Right bound of the frustum + * @param {number} bottom Bottom bound of the frustum + * @param {number} top Top bound of the frustum + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out */ -class FeatureIndexArray extends StructArrayLayout1ul3ui12 { - /** - * Return the FeatureIndexStruct at the given location in the array. - * @param {number} index The index of the element. - * @private - */ - get(index ) { - assert_1(!this.isTransferred); - return new FeatureIndexStruct(this, index); - } -} -register('FeatureIndexArray', FeatureIndexArray); - -class FillExtrusionCentroidStruct extends Struct { - - - - get a_centroid_pos0() { return this._structArray.uint16[this._pos2 + 0]; } - get a_centroid_pos1() { return this._structArray.uint16[this._pos2 + 1]; } +function orthoNO(out, left, right, bottom, top, near, far) { + var lr = 1 / (left - right); + var bt = 1 / (bottom - top); + var 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; } - -FillExtrusionCentroidStruct.prototype.size = 4; - - - /** - * @private + * Alias for {@link mat4.orthoNO} + * @function */ -class FillExtrusionCentroidArray extends StructArrayLayout2ui4 { - /** - * Return the FillExtrusionCentroidStruct at the given location in the array. - * @param {number} index The index of the element. - * @private - */ - get(index ) { - assert_1(!this.isTransferred); - return new FillExtrusionCentroidStruct(this, index); - } -} - -register('FillExtrusionCentroidArray', FillExtrusionCentroidArray); - -// - -const patternAttributes = createLayout([ - // [tl.x, tl.y, br.x, br.y] - {name: 'a_pattern_to', components: 4, type: 'Uint16'}, - {name: 'a_pattern_from', components: 4, type: 'Uint16'}, - {name: 'a_pixel_ratio_to', components: 1, type: 'Uint16'}, - {name: 'a_pixel_ratio_from', components: 1, type: 'Uint16'}, -]); - -// - -const dashAttributes = createLayout([ - {name: 'a_dash_to', components: 4, type: 'Uint16'}, // [x, y, width, unused] - {name: 'a_dash_from', components: 4, type: 'Uint16'} -]); +var ortho = orthoNO; /** - * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011) - * - * @author Gary Court - * @see http://github.com/garycourt/murmurhash-js - * @author Austin Appleby - * @see http://sites.google.com/site/murmurhash/ - * - * @param {string} key ASCII only - * @param {number} seed Positive integer only - * @return {number} 32-bit positive integer hash + * Generates a orthogonal projection matrix with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1], + * which matches WebGPU/Vulkan/DirectX/Metal's clip volume. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} left Left bound of the frustum + * @param {number} right Right bound of the frustum + * @param {number} bottom Bottom bound of the frustum + * @param {number} top Top bound of the frustum + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out */ -var murmurhash3_gc = createCommonjsModule(function (module) { -function murmurhash3_32_gc(key, seed) { - var remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i; - - remainder = key.length & 3; // key.length % 4 - bytes = key.length - remainder; - h1 = seed; - c1 = 0xcc9e2d51; - c2 = 0x1b873593; - i = 0; - - while (i < bytes) { - k1 = - ((key.charCodeAt(i) & 0xff)) | - ((key.charCodeAt(++i) & 0xff) << 8) | - ((key.charCodeAt(++i) & 0xff) << 16) | - ((key.charCodeAt(++i) & 0xff) << 24); - ++i; - - k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff; - - h1 ^= k1; - h1 = (h1 << 13) | (h1 >>> 19); - h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff; - h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16)); - } - - k1 = 0; - - switch (remainder) { - case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; - case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; - case 1: k1 ^= (key.charCodeAt(i) & 0xff); - - k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; - h1 ^= k1; - } - - h1 ^= key.length; - - h1 ^= h1 >>> 16; - h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff; - h1 ^= h1 >>> 13; - h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff; - h1 ^= h1 >>> 16; - - return h1 >>> 0; -} - -if('object' !== "undefined") { - module.exports = murmurhash3_32_gc; +function orthoZO(out, left, right, bottom, top, near, far) { + var lr = 1 / (left - right); + var bt = 1 / (bottom - top); + var 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] = nf; + out[11] = 0; + out[12] = (left + right) * lr; + out[13] = (top + bottom) * bt; + out[14] = near * nf; + out[15] = 1; + return out; } -}); - /** - * JS Implementation of MurmurHash2 - * - * @author Gary Court - * @see http://github.com/garycourt/murmurhash-js - * @author Austin Appleby - * @see http://sites.google.com/site/murmurhash/ - * - * @param {string} str ASCII only - * @param {number} seed Positive integer only - * @return {number} 32-bit positive integer hash + * Generates a look-at matrix with the given eye position, focal point, and up axis. + * If you want a matrix that actually makes an object look at another object, you should use targetTo instead. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {ReadonlyVec3} eye Position of the viewer + * @param {ReadonlyVec3} center Point the viewer is looking at + * @param {ReadonlyVec3} up vec3 pointing up + * @returns {mat4} out */ -var murmurhash2_gc = createCommonjsModule(function (module) { -function murmurhash2_32_gc(str, seed) { - var - l = str.length, - h = seed ^ l, - i = 0, - k; - - while (l >= 4) { - k = - ((str.charCodeAt(i) & 0xff)) | - ((str.charCodeAt(++i) & 0xff) << 8) | - ((str.charCodeAt(++i) & 0xff) << 16) | - ((str.charCodeAt(++i) & 0xff) << 24); - - k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)); - k ^= k >>> 24; - k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16)); - - h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k; +function lookAt(out, eye, center, up) { + var x0, x1, x2, y0, y1, y2, z0, z1, z2, len; + var eyex = eye[0]; + var eyey = eye[1]; + var eyez = eye[2]; + var upx = up[0]; + var upy = up[1]; + var upz = up[2]; + var centerx = center[0]; + var centery = center[1]; + var centerz = center[2]; - l -= 4; - ++i; - } - - switch (l) { - case 3: h ^= (str.charCodeAt(i + 2) & 0xff) << 16; - case 2: h ^= (str.charCodeAt(i + 1) & 0xff) << 8; - case 1: h ^= (str.charCodeAt(i) & 0xff); - h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)); + if (Math.abs(eyex - centerx) < EPSILON && Math.abs(eyey - centery) < EPSILON && Math.abs(eyez - centerz) < EPSILON) { + return identity$3(out); } - h ^= h >>> 13; - h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)); - h ^= h >>> 15; - - return h >>> 0; -} - -if('object' !== undefined) { - module.exports = murmurhash2_32_gc; -} -}); - -var murmurhashJs = murmurhash3_gc; -var murmur3_1 = murmurhash3_gc; -var murmur2_1 = murmurhash2_gc; -murmurhashJs.murmur3 = murmur3_1; -murmurhashJs.murmur2 = murmur2_1; - -// - - - - - - - - - - - - -// A transferable data structure that maps feature ids to their indices and buffer offsets -class FeaturePositionMap { - - - - - constructor() { - this.ids = []; - this.positions = []; - this.indexed = false; - } + z0 = eyex - centerx; + z1 = eyey - centery; + z2 = eyez - centerz; + len = 1 / Math.hypot(z0, z1, z2); + z0 *= len; + z1 *= len; + z2 *= len; + x0 = upy * z2 - upz * z1; + x1 = upz * z0 - upx * z2; + x2 = upx * z1 - upy * z0; + len = Math.hypot(x0, x1, x2); - add(id , index , start , end ) { - this.ids.push(getNumericId(id)); - this.positions.push(index, start, end); - } + if (!len) { + x0 = 0; + x1 = 0; + x2 = 0; + } else { + len = 1 / len; + x0 *= len; + x1 *= len; + x2 *= len; + } - getPositions(id ) { - assert_1(this.indexed); + y0 = z1 * x2 - z2 * x1; + y1 = z2 * x0 - z0 * x2; + y2 = z0 * x1 - z1 * x0; + len = Math.hypot(y0, y1, y2); - const intId = getNumericId(id); + if (!len) { + y0 = 0; + y1 = 0; + y2 = 0; + } else { + len = 1 / len; + y0 *= len; + y1 *= len; + y2 *= len; + } - // binary search for the first occurrence of id in this.ids; - // relies on ids/positions being sorted by id, which happens in serialization - let i = 0; - let j = this.ids.length - 1; - while (i < j) { - const m = (i + j) >> 1; - if (this.ids[m] >= intId) { - j = m; - } else { - i = m + 1; - } - } - const positions = []; - while (this.ids[i] === intId) { - const index = this.positions[3 * i]; - const start = this.positions[3 * i + 1]; - const end = this.positions[3 * i + 2]; - positions.push({index, start, end}); - i++; - } - return positions; - } + out[0] = x0; + out[1] = y0; + out[2] = z0; + out[3] = 0; + out[4] = x1; + out[5] = y1; + out[6] = z1; + out[7] = 0; + out[8] = x2; + out[9] = y2; + out[10] = z2; + out[11] = 0; + out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); + out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); + out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); + out[15] = 1; + return out; +} +/** + * Generates a matrix that makes something look at something else. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {ReadonlyVec3} eye Position of the viewer + * @param {ReadonlyVec3} center Point the viewer is looking at + * @param {ReadonlyVec3} up vec3 pointing up + * @returns {mat4} out + */ - static serialize(map , transferables ) { - const ids = new Float64Array(map.ids); - const positions = new Uint32Array(map.positions); +function targetTo(out, eye, target, up) { + var eyex = eye[0], + eyey = eye[1], + eyez = eye[2], + upx = up[0], + upy = up[1], + upz = up[2]; + var z0 = eyex - target[0], + z1 = eyey - target[1], + z2 = eyez - target[2]; + var len = z0 * z0 + z1 * z1 + z2 * z2; - sort(ids, positions, 0, ids.length - 1); + if (len > 0) { + len = 1 / Math.sqrt(len); + z0 *= len; + z1 *= len; + z2 *= len; + } - if (transferables) { - transferables.push(ids.buffer, positions.buffer); - } + var x0 = upy * z2 - upz * z1, + x1 = upz * z0 - upx * z2, + x2 = upx * z1 - upy * z0; + len = x0 * x0 + x1 * x1 + x2 * x2; - return {ids, positions}; - } + if (len > 0) { + len = 1 / Math.sqrt(len); + x0 *= len; + x1 *= len; + x2 *= len; + } - static deserialize(obj ) { - const map = new FeaturePositionMap(); - // after transferring, we only use these arrays statically (no pushes), - // so TypedArray vs Array distinction that flow points out doesn't matter - map.ids = (obj.ids ); - map.positions = (obj.positions ); - map.indexed = true; - return map; - } + out[0] = x0; + out[1] = x1; + out[2] = x2; + out[3] = 0; + out[4] = z1 * x2 - z2 * x1; + out[5] = z2 * x0 - z0 * x2; + out[6] = z0 * x1 - z1 * x0; + out[7] = 0; + out[8] = z0; + out[9] = z1; + out[10] = z2; + out[11] = 0; + out[12] = eyex; + out[13] = eyey; + out[14] = eyez; + out[15] = 1; + return out; } +/** + * Returns a string representation of a mat4 + * + * @param {ReadonlyMat4} a matrix to represent as a string + * @returns {String} string representation of the matrix + */ -function getNumericId(value ) { - const numValue = +value; - if (!isNaN(numValue) && Number.MIN_SAFE_INTEGER <= numValue && numValue <= Number.MAX_SAFE_INTEGER) { - return numValue; - } - return murmurhashJs(String(value)); +function str$5(a) { + return "mat4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ", " + a[8] + ", " + a[9] + ", " + a[10] + ", " + a[11] + ", " + a[12] + ", " + a[13] + ", " + a[14] + ", " + a[15] + ")"; } +/** + * Returns Frobenius norm of a mat4 + * + * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ -// custom quicksort that sorts ids, indices and offsets together (by ids) -// uses Hoare partitioning & manual tail call optimization to avoid worst case scenarios -function sort(ids, positions, left, right) { - while (left < right) { - const pivot = ids[(left + right) >> 1]; - let i = left - 1; - let j = right + 1; +function frob(a) { + return Math.hypot(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); +} +/** + * Adds two mat4's + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ - while (true) { - do i++; while (ids[i] < pivot); - do j--; while (ids[j] > pivot); - if (i >= j) break; - swap(ids, i, j); - swap(positions, 3 * i, 3 * j); - swap(positions, 3 * i + 1, 3 * j + 1); - swap(positions, 3 * i + 2, 3 * j + 2); - } +function add$5(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; + out[5] = a[5] + b[5]; + out[6] = a[6] + b[6]; + out[7] = a[7] + b[7]; + out[8] = a[8] + b[8]; + out[9] = a[9] + b[9]; + out[10] = a[10] + b[10]; + out[11] = a[11] + b[11]; + out[12] = a[12] + b[12]; + out[13] = a[13] + b[13]; + out[14] = a[14] + b[14]; + out[15] = a[15] + b[15]; + return out; +} +/** + * Subtracts matrix b from matrix a + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ - if (j - left < right - j) { - sort(ids, positions, left, j); - left = j + 1; - } else { - sort(ids, positions, j + 1, right); - right = j; - } - } +function subtract$3(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + out[4] = a[4] - b[4]; + out[5] = a[5] - b[5]; + out[6] = a[6] - b[6]; + out[7] = a[7] - b[7]; + out[8] = a[8] - b[8]; + out[9] = a[9] - b[9]; + out[10] = a[10] - b[10]; + out[11] = a[11] - b[11]; + out[12] = a[12] - b[12]; + out[13] = a[13] - b[13]; + out[14] = a[14] - b[14]; + out[15] = a[15] - b[15]; + return out; } +/** + * Multiply each element of the matrix by a scalar. + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to scale + * @param {Number} b amount to scale the matrix's elements by + * @returns {mat4} out + */ -function swap(arr, i, j) { - const tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; +function multiplyScalar(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + out[4] = a[4] * b; + out[5] = a[5] * b; + out[6] = a[6] * b; + out[7] = a[7] * b; + out[8] = a[8] * b; + out[9] = a[9] * b; + out[10] = a[10] * b; + out[11] = a[11] * b; + out[12] = a[12] * b; + out[13] = a[13] * b; + out[14] = a[14] * b; + out[15] = a[15] * b; + return out; } +/** + * Adds two mat4's after multiplying each element of the second operand by a scalar value. + * + * @param {mat4} out the receiving vector + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @param {Number} scale the amount to scale b's elements by before adding + * @returns {mat4} out + */ -register('FeaturePositionMap', FeaturePositionMap); +function multiplyScalarAndAdd(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + out[4] = a[4] + b[4] * scale; + out[5] = a[5] + b[5] * scale; + out[6] = a[6] + b[6] * scale; + out[7] = a[7] + b[7] * scale; + out[8] = a[8] + b[8] * scale; + out[9] = a[9] + b[9] * scale; + out[10] = a[10] + b[10] * scale; + out[11] = a[11] + b[11] * scale; + out[12] = a[12] + b[12] * scale; + out[13] = a[13] + b[13] * scale; + out[14] = a[14] + b[14] * scale; + out[15] = a[15] + b[15] * scale; + return out; +} +/** + * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyMat4} a The first matrix. + * @param {ReadonlyMat4} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ -// +function exactEquals$5(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15]; +} +/** + * Returns whether or not the matrices have approximately the same elements in the same position. + * + * @param {ReadonlyMat4} a The first matrix. + * @param {ReadonlyMat4} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ - +function equals$6(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var a4 = a[4], + a5 = a[5], + a6 = a[6], + a7 = a[7]; + var a8 = a[8], + a9 = a[9], + a10 = a[10], + a11 = a[11]; + var a12 = a[12], + a13 = a[13], + a14 = a[14], + a15 = a[15]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + var b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7]; + var b8 = b[8], + b9 = b[9], + b10 = b[10], + b11 = b[11]; + var b12 = b[12], + b13 = b[13], + b14 = b[14], + b15 = b[15]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)); +} +/** + * Alias for {@link mat4.multiply} + * @function + */ - - - +var mul$5 = multiply$5; +/** + * Alias for {@link mat4.subtract} + * @function + */ -class Uniform { - - - +var sub$3 = subtract$3; - constructor(context , location ) { - this.gl = context.gl; - this.location = location; - } +var mat4 = /*#__PURE__*/Object.freeze({ +__proto__: null, +create: create$5, +clone: clone$5, +copy: copy$5, +fromValues: fromValues$5, +set: set$5, +identity: identity$3, +transpose: transpose, +invert: invert$2, +adjoint: adjoint, +determinant: determinant, +multiply: multiply$5, +translate: translate$1, +scale: scale$5, +rotate: rotate$1, +rotateX: rotateX$3, +rotateY: rotateY$3, +rotateZ: rotateZ$3, +fromTranslation: fromTranslation$1, +fromScaling: fromScaling, +fromRotation: fromRotation$1, +fromXRotation: fromXRotation, +fromYRotation: fromYRotation, +fromZRotation: fromZRotation, +fromRotationTranslation: fromRotationTranslation$1, +fromQuat2: fromQuat2, +getTranslation: getTranslation$1, +getScaling: getScaling, +getRotation: getRotation, +fromRotationTranslationScale: fromRotationTranslationScale, +fromRotationTranslationScaleOrigin: fromRotationTranslationScaleOrigin, +fromQuat: fromQuat, +frustum: frustum, +perspectiveNO: perspectiveNO, +perspective: perspective, +perspectiveZO: perspectiveZO, +perspectiveFromFieldOfView: perspectiveFromFieldOfView, +orthoNO: orthoNO, +ortho: ortho, +orthoZO: orthoZO, +lookAt: lookAt, +targetTo: targetTo, +str: str$5, +frob: frob, +add: add$5, +subtract: subtract$3, +multiplyScalar: multiplyScalar, +multiplyScalarAndAdd: multiplyScalarAndAdd, +exactEquals: exactEquals$5, +equals: equals$6, +mul: mul$5, +sub: sub$3 +}); - -} +/** + * 3 Dimensional Vector + * @module vec3 + */ -class Uniform1i extends Uniform { - constructor(context , location ) { - super(context, location); - this.current = 0; - } +/** + * Creates a new, empty vec3 + * + * @returns {vec3} a new 3D vector + */ - set(v ) { - if (this.current !== v) { - this.current = v; - this.gl.uniform1i(this.location, v); - } - } -} +function create$4() { + var out = new ARRAY_TYPE(3); -class Uniform1f extends Uniform { - constructor(context , location ) { - super(context, location); - this.current = 0; - } + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + } - set(v ) { - if (this.current !== v) { - this.current = v; - this.gl.uniform1f(this.location, v); - } - } + return out; } +/** + * Creates a new vec3 initialized with values from an existing vector + * + * @param {ReadonlyVec3} a vector to clone + * @returns {vec3} a new 3D vector + */ -class Uniform2f extends Uniform { - constructor(context , location ) { - super(context, location); - this.current = [0, 0]; - } - - set(v ) { - if (v[0] !== this.current[0] || v[1] !== this.current[1]) { - this.current = v; - this.gl.uniform2f(this.location, v[0], v[1]); - } - } +function clone$4(a) { + var out = new ARRAY_TYPE(3); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; } +/** + * Calculates the length of a vec3 + * + * @param {ReadonlyVec3} a vector to calculate length of + * @returns {Number} length of a + */ -class Uniform3f extends Uniform { - constructor(context , location ) { - super(context, location); - this.current = [0, 0, 0]; - } - - set(v ) { - if (v[0] !== this.current[0] || v[1] !== this.current[1] || v[2] !== this.current[2]) { - this.current = v; - this.gl.uniform3f(this.location, v[0], v[1], v[2]); - } - } +function length$4(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + return Math.hypot(x, y, z); } +/** + * Creates a new vec3 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} a new 3D vector + */ -class Uniform4f extends Uniform { - constructor(context , location ) { - super(context, location); - this.current = [0, 0, 0, 0]; - } - - set(v ) { - if (v[0] !== this.current[0] || v[1] !== this.current[1] || - v[2] !== this.current[2] || v[3] !== this.current[3]) { - this.current = v; - this.gl.uniform4f(this.location, v[0], v[1], v[2], v[3]); - } - } +function fromValues$4(x, y, z) { + var out = new ARRAY_TYPE(3); + out[0] = x; + out[1] = y; + out[2] = z; + return out; } +/** + * Copy the values from one vec3 to another + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the source vector + * @returns {vec3} out + */ -class UniformColor extends Uniform { - constructor(context , location ) { - super(context, location); - this.current = Color.transparent; - } - - set(v ) { - if (v.r !== this.current.r || v.g !== this.current.g || - v.b !== this.current.b || v.a !== this.current.a) { - this.current = v; - this.gl.uniform4f(this.location, v.r, v.g, v.b, v.a); - } - } +function copy$4(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; } +/** + * Set the components of a vec3 to the given values + * + * @param {vec3} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} out + */ -const emptyMat4 = new Float32Array(16); -class UniformMatrix4f extends Uniform { - constructor(context , location ) { - super(context, location); - this.current = emptyMat4; - } - - set(v ) { - // The vast majority of matrix comparisons that will trip this set - // happen at i=12 or i=0, so we check those first to avoid lots of - // unnecessary iteration: - if (v[12] !== this.current[12] || v[0] !== this.current[0]) { - this.current = v; - this.gl.uniformMatrix4fv(this.location, false, v); - return; - } - for (let i = 1; i < 16; i++) { - if (v[i] !== this.current[i]) { - this.current = v; - this.gl.uniformMatrix4fv(this.location, false, v); - break; - } - } - } +function set$4(out, x, y, z) { + out[0] = x; + out[1] = y; + out[2] = z; + return out; } +/** + * Adds two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ -const emptyMat3 = new Float32Array(9); -class UniformMatrix3f extends Uniform { - constructor(context , location ) { - super(context, location); - this.current = emptyMat3; - } - - set(v ) { - for (let i = 0; i < 9; i++) { - if (v[i] !== this.current[i]) { - this.current = v; - this.gl.uniformMatrix3fv(this.location, false, v); - break; - } - } - } +function add$4(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + return out; } +/** + * Subtracts vector b from vector a + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ -const emptyMat2 = new Float32Array(4); -class UniformMatrix2f extends Uniform { - constructor(context , location ) { - super(context, location); - this.current = emptyMat2; - } - - set(v ) { - for (let i = 0; i < 4; i++) { - if (v[i] !== this.current[i]) { - this.current = v; - this.gl.uniformMatrix2fv(this.location, false, v); - break; - } - } - } +function subtract$2(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + return out; } +/** + * Multiplies two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ -// - - - - - - - -function packColor(color ) { - return [ - packUint8ToFloat(255 * color.r, 255 * color.g), - packUint8ToFloat(255 * color.b, 255 * color.a) - ]; +function multiply$4(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + return out; } - /** - * `Binder` is the interface definition for the strategies for constructing, - * uploading, and binding paint property data as GLSL attributes. Most style- - * spec properties have a 1:1 relationship to shader attribute/uniforms, but - * some require multiple values per feature to be passed to the GPU, and in - * those cases we bind multiple attributes/uniforms. - * - * 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 attribute 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 accommodate this. + * Divides two vec3's * - * @private + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out */ - - - - - - +function divide$2(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + out[2] = a[2] / b[2]; + return out; +} +/** + * Math.ceil the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to ceil + * @returns {vec3} out + */ - - - - - +function ceil$2(out, a) { + out[0] = Math.ceil(a[0]); + out[1] = Math.ceil(a[1]); + out[2] = Math.ceil(a[2]); + return out; +} +/** + * Math.floor the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to floor + * @returns {vec3} out + */ -class ConstantBinder { - - - +function floor$2(out, a) { + out[0] = Math.floor(a[0]); + out[1] = Math.floor(a[1]); + out[2] = Math.floor(a[2]); + return out; +} +/** + * Returns the minimum of two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ - constructor(value , names , type ) { - this.value = value; - this.uniformNames = names.map(name => `u_${name}`); - this.type = type; - } +function min$2(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + out[2] = Math.min(a[2], b[2]); + return out; +} +/** + * Returns the maximum of two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ - setUniform(uniform , globals , currentValue ) { - uniform.set(currentValue.constantOr(this.value)); - } +function max$2(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + out[2] = Math.max(a[2], b[2]); + return out; +} +/** + * Math.round the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to round + * @returns {vec3} out + */ - getBinding(context , location , _ ) { - return (this.type === 'color') ? - new UniformColor(context, location) : - new Uniform1f(context, location); - } +function round$2(out, a) { + out[0] = Math.round(a[0]); + out[1] = Math.round(a[1]); + out[2] = Math.round(a[2]); + return out; } +/** + * Scales a vec3 by a scalar number + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec3} out + */ -class CrossFadedConstantBinder { - - - - - +function scale$4(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + return out; +} +/** + * Adds two vec3's after scaling the second operand by a scalar value + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec3} out + */ - constructor(value , names ) { - this.uniformNames = names.map(name => `u_${name}`); - this.patternFrom = null; - this.patternTo = null; - this.pixelRatioFrom = 1.0; - this.pixelRatioTo = 1.0; - } +function scaleAndAdd$2(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + return out; +} +/** + * Calculates the euclidian distance between two vec3's + * + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {Number} distance between a and b + */ - setConstantPatternPositions(posTo , posFrom ) { - this.pixelRatioFrom = posFrom.pixelRatio; - this.pixelRatioTo = posTo.pixelRatio; - this.patternFrom = posFrom.tl.concat(posFrom.br); - this.patternTo = posTo.tl.concat(posTo.br); - } +function distance$2(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + return Math.hypot(x, y, z); +} +/** + * Calculates the squared euclidian distance between two vec3's + * + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {Number} squared distance between a and b + */ - setUniform(uniform , globals , currentValue , uniformName ) { - const pos = - uniformName === 'u_pattern_to' || uniformName === 'u_dash_to' ? this.patternTo : - uniformName === 'u_pattern_from' || uniformName === 'u_dash_from' ? this.patternFrom : - uniformName === 'u_pixel_ratio_to' ? this.pixelRatioTo : - uniformName === 'u_pixel_ratio_from' ? this.pixelRatioFrom : null; - if (pos) uniform.set(pos); - } +function squaredDistance$2(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + return x * x + y * y + z * z; +} +/** + * Calculates the squared length of a vec3 + * + * @param {ReadonlyVec3} a vector to calculate squared length of + * @returns {Number} squared length of a + */ - getBinding(context , location , name ) { - return name === 'u_pattern_from' || name === 'u_pattern_to' || name === 'u_dash_from' || name === 'u_dash_to' ? - new Uniform4f(context, location) : - new Uniform1f(context, location); - } +function squaredLength$4(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + return x * x + y * y + z * z; } +/** + * Negates the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to negate + * @returns {vec3} out + */ -class SourceExpressionBinder { - - - +function negate$2(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + return out; +} +/** + * Returns the inverse of the components of a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to invert + * @returns {vec3} out + */ - - - +function inverse$2(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + out[2] = 1.0 / a[2]; + return out; +} +/** + * Normalize a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to normalize + * @returns {vec3} out + */ - constructor(expression , names , type , PaintVertexArray ) { - this.expression = expression; - this.type = type; - this.maxValue = 0; - this.paintVertexAttributes = names.map((name) => ({ - name: `a_${name}`, - type: 'Float32', - components: type === 'color' ? 2 : 1, - offset: 0 - })); - this.paintVertexArray = new PaintVertexArray(); - } +function normalize$4(out, a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var len = x * x + y * y + z * z; - populatePaintArray(newLength , feature , imagePositions , availableImages , canonical , formattedSection ) { - const start = this.paintVertexArray.length; - assert_1(Array.isArray(availableImages)); - const value = this.expression.evaluate(new EvaluationParameters(0), feature, {}, canonical, availableImages, formattedSection); - this.paintVertexArray.resize(newLength); - this._setPaintValue(start, newLength, value); - } + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len); + } - updatePaintArray(start , end , feature , featureState , availableImages ) { - const value = this.expression.evaluate({zoom: 0}, feature, featureState, undefined, availableImages); - this._setPaintValue(start, end, value); - } + out[0] = a[0] * len; + out[1] = a[1] * len; + out[2] = a[2] * len; + return out; +} +/** + * Calculates the dot product of two vec3's + * + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {Number} dot product of a and b + */ - _setPaintValue(start, end, value) { - if (this.type === 'color') { - const color = packColor(value); - for (let i = start; i < end; i++) { - this.paintVertexArray.emplace(i, color[0], color[1]); - } - } else { - for (let i = start; i < end; i++) { - this.paintVertexArray.emplace(i, value); - } - this.maxValue = Math.max(this.maxValue, Math.abs(value)); - } - } +function dot$5(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} +/** + * Computes the cross product of two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ - upload(context ) { - if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { - if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { - this.paintVertexBuffer.updateData(this.paintVertexArray); - } else { - this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); - } - } - } +function cross$2(out, a, b) { + var ax = a[0], + ay = a[1], + az = a[2]; + var bx = b[0], + by = b[1], + bz = b[2]; + out[0] = ay * bz - az * by; + out[1] = az * bx - ax * bz; + out[2] = ax * by - ay * bx; + return out; +} +/** + * Performs a linear interpolation between two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec3} out + */ - destroy() { - if (this.paintVertexBuffer) { - this.paintVertexBuffer.destroy(); - } - } +function lerp$4(out, a, b, t) { + var ax = a[0]; + var ay = a[1]; + var az = a[2]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + out[2] = az + t * (b[2] - az); + return out; } +/** + * Performs a hermite interpolation with two control points + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {ReadonlyVec3} c the third operand + * @param {ReadonlyVec3} d the fourth operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec3} out + */ -class CompositeExpressionBinder { - - - - - - +function hermite(out, a, b, c, d, t) { + var factorTimes2 = t * t; + var factor1 = factorTimes2 * (2 * t - 3) + 1; + var factor2 = factorTimes2 * (t - 2) + t; + var factor3 = factorTimes2 * (t - 1); + var factor4 = factorTimes2 * (3 - 2 * t); + out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; + out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; + out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; + return out; +} +/** + * Performs a bezier interpolation with two control points + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {ReadonlyVec3} c the third operand + * @param {ReadonlyVec3} d the fourth operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec3} out + */ - - - +function bezier(out, a, b, c, d, t) { + var inverseFactor = 1 - t; + var inverseFactorTimesTwo = inverseFactor * inverseFactor; + var factorTimes2 = t * t; + var factor1 = inverseFactorTimesTwo * inverseFactor; + var factor2 = 3 * t * inverseFactorTimesTwo; + var factor3 = 3 * factorTimes2 * inverseFactor; + var factor4 = factorTimes2 * t; + out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4; + out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4; + out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4; + return out; +} +/** + * Generates a random vector with the given scale + * + * @param {vec3} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned + * @returns {vec3} out + */ - constructor(expression , names , type , useIntegerZoom , zoom , PaintVertexArray ) { - this.expression = expression; - this.uniformNames = names.map(name => `u_${name}_t`); - this.type = type; - this.useIntegerZoom = useIntegerZoom; - this.zoom = zoom; - this.maxValue = 0; - this.paintVertexAttributes = names.map((name) => ({ - name: `a_${name}`, - type: 'Float32', - components: type === 'color' ? 4 : 2, - offset: 0 - })); - this.paintVertexArray = new PaintVertexArray(); - } +function random$3(out, scale) { + scale = scale || 1.0; + var r = RANDOM() * 2.0 * Math.PI; + var z = RANDOM() * 2.0 - 1.0; + var zScale = Math.sqrt(1.0 - z * z) * scale; + out[0] = Math.cos(r) * zScale; + out[1] = Math.sin(r) * zScale; + out[2] = z * scale; + return out; +} +/** + * Transforms the vec3 with a mat4. + * 4th vector component is implicitly '1' + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyMat4} m matrix to transform with + * @returns {vec3} out + */ - populatePaintArray(newLength , feature , imagePositions , availableImages , canonical , formattedSection ) { - const min = this.expression.evaluate(new EvaluationParameters(this.zoom), feature, {}, canonical, availableImages, formattedSection); - const max = this.expression.evaluate(new EvaluationParameters(this.zoom + 1), feature, {}, canonical, availableImages, formattedSection); - const start = this.paintVertexArray.length; - this.paintVertexArray.resize(newLength); - this._setPaintValue(start, newLength, min, max); - } +function transformMat4$2(out, a, m) { + var x = a[0], + y = a[1], + z = a[2]; + var w = m[3] * x + m[7] * y + m[11] * z + m[15]; + w = w || 1.0; + 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; + return out; +} +/** + * Transforms the vec3 with a mat3. + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyMat3} m the 3x3 matrix to transform with + * @returns {vec3} out + */ - updatePaintArray(start , end , feature , featureState , availableImages ) { - const min = this.expression.evaluate({zoom: this.zoom}, feature, featureState, undefined, availableImages); - const max = this.expression.evaluate({zoom: this.zoom + 1}, feature, featureState, undefined, availableImages); - this._setPaintValue(start, end, min, max); - } +function transformMat3$1(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; +} +/** + * Transforms the vec3 with a quat + * Can also be used for dual quaternions. (Multiply it with the real part) + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyQuat} q quaternion to transform with + * @returns {vec3} out + */ - _setPaintValue(start, end, min, max) { - if (this.type === 'color') { - const minColor = packColor(min); - const maxColor = packColor(max); - for (let i = start; i < end; i++) { - this.paintVertexArray.emplace(i, minColor[0], minColor[1], maxColor[0], maxColor[1]); - } - } else { - for (let i = start; i < end; i++) { - this.paintVertexArray.emplace(i, min, max); - } - this.maxValue = Math.max(this.maxValue, Math.abs(min), Math.abs(max)); - } - } +function transformQuat$1(out, a, q) { + // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed + var qx = q[0], + qy = q[1], + qz = q[2], + qw = q[3]; + var x = a[0], + y = a[1], + z = a[2]; // var qvec = [qx, qy, qz]; + // var uv = vec3.cross([], qvec, a); - upload(context ) { - if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { - if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { - this.paintVertexBuffer.updateData(this.paintVertexArray); - } else { - this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); - } - } - } + var uvx = qy * z - qz * y, + uvy = qz * x - qx * z, + uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv); - destroy() { - if (this.paintVertexBuffer) { - this.paintVertexBuffer.destroy(); - } - } + var uuvx = qy * uvz - qz * uvy, + uuvy = qz * uvx - qx * uvz, + uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w); - setUniform(uniform , globals ) { - const currentZoom = this.useIntegerZoom ? Math.floor(globals.zoom) : globals.zoom; - const factor = clamp(this.expression.interpolationFactor(currentZoom, this.zoom, this.zoom + 1), 0, 1); - uniform.set(factor); - } + var w2 = qw * 2; + uvx *= w2; + uvy *= w2; + uvz *= w2; // vec3.scale(uuv, uuv, 2); - getBinding(context , location , _ ) { - return new Uniform1f(context, location); - } + uuvx *= 2; + uuvy *= 2; + uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv)); + + out[0] = x + uvx + uuvx; + out[1] = y + uvy + uuvy; + out[2] = z + uvz + uuvz; + return out; } +/** + * Rotate a 3D vector around the x-axis + * @param {vec3} out The receiving vec3 + * @param {ReadonlyVec3} a The vec3 point to rotate + * @param {ReadonlyVec3} b The origin of the rotation + * @param {Number} rad The angle of rotation in radians + * @returns {vec3} out + */ -class CrossFadedCompositeBinder { - - - - - +function rotateX$2(out, a, b, rad) { + var p = [], + r = []; //Translate point to the origin - - - - - + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; //perform rotation - constructor(expression , names , type , useIntegerZoom , zoom , PaintVertexArray , layerId ) { - this.expression = expression; - this.type = type; - this.useIntegerZoom = useIntegerZoom; - this.zoom = zoom; - this.layerId = layerId; + r[0] = p[0]; + r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad); + r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad); //translate to correct position - this.paintVertexAttributes = (type === 'array' ? dashAttributes : patternAttributes).members; - for (let i = 0; i < names.length; ++i) { - assert_1(`a_${names[i]}` === this.paintVertexAttributes[i].name); - } + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + return out; +} +/** + * Rotate a 3D vector around the y-axis + * @param {vec3} out The receiving vec3 + * @param {ReadonlyVec3} a The vec3 point to rotate + * @param {ReadonlyVec3} b The origin of the rotation + * @param {Number} rad The angle of rotation in radians + * @returns {vec3} out + */ - this.zoomInPaintVertexArray = new PaintVertexArray(); - this.zoomOutPaintVertexArray = new PaintVertexArray(); - } +function rotateY$2(out, a, b, rad) { + var p = [], + r = []; //Translate point to the origin - populatePaintArray(length , feature , imagePositions ) { - const start = this.zoomInPaintVertexArray.length; - this.zoomInPaintVertexArray.resize(length); - this.zoomOutPaintVertexArray.resize(length); - this._setPaintValues(start, length, feature.patterns && feature.patterns[this.layerId], imagePositions); - } + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; //perform rotation - updatePaintArray(start , end , feature , featureState , availableImages , imagePositions ) { - this._setPaintValues(start, end, feature.patterns && feature.patterns[this.layerId], imagePositions); - } + r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad); + r[1] = p[1]; + r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad); //translate to correct position - _setPaintValues(start, end, patterns, positions) { - if (!positions || !patterns) return; + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + return out; +} +/** + * Rotate a 3D vector around the z-axis + * @param {vec3} out The receiving vec3 + * @param {ReadonlyVec3} a The vec3 point to rotate + * @param {ReadonlyVec3} b The origin of the rotation + * @param {Number} rad The angle of rotation in radians + * @returns {vec3} out + */ - const {min, mid, max} = patterns; - const imageMin = positions[min]; - const imageMid = positions[mid]; - const imageMax = positions[max]; - if (!imageMin || !imageMid || !imageMax) return; +function rotateZ$2(out, a, b, rad) { + var p = [], + r = []; //Translate point to the origin - // We populate two paint arrays because, for cross-faded properties, we don't know which direction - // we're cross-fading to at layout time. In order to keep vertex attributes to a minimum and not pass - // unnecessary vertex data to the shaders, we determine which to upload at draw time. - for (let i = start; i < end; i++) { - this._setPaintValue(this.zoomInPaintVertexArray, i, imageMid, imageMin); - this._setPaintValue(this.zoomOutPaintVertexArray, i, imageMid, imageMax); - } - } + p[0] = a[0] - b[0]; + p[1] = a[1] - b[1]; + p[2] = a[2] - b[2]; //perform rotation - _setPaintValue(array, i, posA, posB) { - array.emplace(i, - posA.tl[0], posA.tl[1], posA.br[0], posA.br[1], - posB.tl[0], posB.tl[1], posB.br[0], posB.br[1], - posA.pixelRatio, posB.pixelRatio - ); - } + r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad); + r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad); + r[2] = p[2]; //translate to correct position - upload(context ) { - if (this.zoomInPaintVertexArray && this.zoomInPaintVertexArray.arrayBuffer && this.zoomOutPaintVertexArray && this.zoomOutPaintVertexArray.arrayBuffer) { - this.zoomInPaintVertexBuffer = context.createVertexBuffer(this.zoomInPaintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); - this.zoomOutPaintVertexBuffer = context.createVertexBuffer(this.zoomOutPaintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); - } - } + out[0] = r[0] + b[0]; + out[1] = r[1] + b[1]; + out[2] = r[2] + b[2]; + return out; +} +/** + * Get the angle between two 3D vectors + * @param {ReadonlyVec3} a The first operand + * @param {ReadonlyVec3} b The second operand + * @returns {Number} The angle in radians + */ - destroy() { - if (this.zoomOutPaintVertexBuffer) this.zoomOutPaintVertexBuffer.destroy(); - if (this.zoomInPaintVertexBuffer) this.zoomInPaintVertexBuffer.destroy(); - } +function angle$1(a, b) { + var ax = a[0], + ay = a[1], + az = a[2], + bx = b[0], + by = b[1], + bz = b[2], + mag1 = Math.sqrt(ax * ax + ay * ay + az * az), + mag2 = Math.sqrt(bx * bx + by * by + bz * bz), + mag = mag1 * mag2, + cosine = mag && dot$5(a, b) / mag; + return Math.acos(Math.min(Math.max(cosine, -1), 1)); } +/** + * Set the components of a vec3 to zero + * + * @param {vec3} out the receiving vector + * @returns {vec3} out + */ +function zero$2(out) { + out[0] = 0.0; + out[1] = 0.0; + out[2] = 0.0; + return out; +} /** - * ProgramConfiguration contains the logic for binding style layer properties and tile - * layer feature data into GL program uniforms and vertex attributes. + * Returns a string representation of a vector * - * 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. + * @param {ReadonlyVec3} a vector to represent as a string + * @returns {String} string representation of the vector + */ + +function str$4(a) { + return "vec3(" + a[0] + ", " + a[1] + ", " + a[2] + ")"; +} +/** + * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) * - * 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. + * @param {ReadonlyVec3} a The first vector. + * @param {ReadonlyVec3} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + +function exactEquals$4(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2]; +} +/** + * Returns whether or not the vectors have approximately the same elements in the same position. * - * @private + * @param {ReadonlyVec3} a The first vector. + * @param {ReadonlyVec3} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. */ -class ProgramConfiguration { - - - +function equals$5(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2]; + var b0 = b[0], + b1 = b[1], + b2 = b[2]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)); +} +/** + * Alias for {@link vec3.subtract} + * @function + */ - constructor(layer , zoom , filterProperties = () => true) { - this.binders = {}; - this._buffers = []; +var sub$2 = subtract$2; +/** + * Alias for {@link vec3.multiply} + * @function + */ - const keys = []; +var mul$4 = multiply$4; +/** + * Alias for {@link vec3.divide} + * @function + */ - for (const property in layer.paint._values) { - if (!filterProperties(property)) continue; - const value = layer.paint.get(property); - if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { - continue; - } - const names = paintAttributeNames(property, layer.type); - const expression = value.value; - const type = value.property.specification.type; - const useIntegerZoom = value.property.useIntegerZoom; - const propType = value.property.specification['property-type']; - const isCrossFaded = propType === 'cross-faded' || propType === 'cross-faded-data-driven'; +var div$2 = divide$2; +/** + * Alias for {@link vec3.distance} + * @function + */ - const sourceException = String(property) === 'line-dasharray' && (layer.layout ).get('line-cap').value.kind !== 'constant'; +var dist$2 = distance$2; +/** + * Alias for {@link vec3.squaredDistance} + * @function + */ - if (expression.kind === 'constant' && !sourceException) { - this.binders[property] = isCrossFaded ? - new CrossFadedConstantBinder(expression.value, names) : - new ConstantBinder(expression.value, names, type); - keys.push(`/u_${property}`); +var sqrDist$2 = squaredDistance$2; +/** + * Alias for {@link vec3.length} + * @function + */ - } else if (expression.kind === 'source' || sourceException || isCrossFaded) { - const StructArrayLayout = layoutType(property, type, 'source'); - this.binders[property] = isCrossFaded ? - new CrossFadedCompositeBinder(expression, names, type, useIntegerZoom, zoom, StructArrayLayout, layer.id) : - new SourceExpressionBinder(expression, names, type, StructArrayLayout); - keys.push(`/a_${property}`); +var len$4 = length$4; +/** + * Alias for {@link vec3.squaredLength} + * @function + */ - } else { - const StructArrayLayout = layoutType(property, type, 'composite'); - this.binders[property] = new CompositeExpressionBinder(expression, names, type, useIntegerZoom, zoom, StructArrayLayout); - keys.push(`/z_${property}`); - } - } +var sqrLen$4 = squaredLength$4; +/** + * Perform some operation over an array of vec3s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ - this.cacheKey = keys.sort().join(''); +var forEach$2 = function () { + var vec = create$4(); + return function (a, stride, offset, count, fn, arg) { + var i, l; + + if (!stride) { + stride = 3; } - getMaxValue(property ) { - const binder = this.binders[property]; - return binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder ? binder.maxValue : 0; + if (!offset) { + offset = 0; } - populatePaintArrays(newLength , feature , imagePositions , availableImages , canonical , formattedSection ) { - for (const property in this.binders) { - const binder = this.binders[property]; - if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) - (binder ).populatePaintArray(newLength, feature, imagePositions, availableImages, canonical, formattedSection); - } + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; } - setConstantPatternPositions(posTo , posFrom ) { - for (const property in this.binders) { - const binder = this.binders[property]; - if (binder instanceof CrossFadedConstantBinder) - binder.setConstantPatternPositions(posTo, posFrom); - } + + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + vec[2] = a[i + 2]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + a[i + 2] = vec[2]; } - updatePaintArrays(featureStates , featureMap , vtLayer , layer , availableImages , imagePositions ) { - let dirty = false; - for (const id in featureStates) { - const positions = featureMap.getPositions(id); + return a; + }; +}(); - for (const pos of positions) { - const feature = vtLayer.feature(pos.index); +var vec3 = /*#__PURE__*/Object.freeze({ +__proto__: null, +create: create$4, +clone: clone$4, +length: length$4, +fromValues: fromValues$4, +copy: copy$4, +set: set$4, +add: add$4, +subtract: subtract$2, +multiply: multiply$4, +divide: divide$2, +ceil: ceil$2, +floor: floor$2, +min: min$2, +max: max$2, +round: round$2, +scale: scale$4, +scaleAndAdd: scaleAndAdd$2, +distance: distance$2, +squaredDistance: squaredDistance$2, +squaredLength: squaredLength$4, +negate: negate$2, +inverse: inverse$2, +normalize: normalize$4, +dot: dot$5, +cross: cross$2, +lerp: lerp$4, +hermite: hermite, +bezier: bezier, +random: random$3, +transformMat4: transformMat4$2, +transformMat3: transformMat3$1, +transformQuat: transformQuat$1, +rotateX: rotateX$2, +rotateY: rotateY$2, +rotateZ: rotateZ$2, +angle: angle$1, +zero: zero$2, +str: str$4, +exactEquals: exactEquals$4, +equals: equals$5, +sub: sub$2, +mul: mul$4, +div: div$2, +dist: dist$2, +sqrDist: sqrDist$2, +len: len$4, +sqrLen: sqrLen$4, +forEach: forEach$2 +}); - for (const property in this.binders) { - const binder = this.binders[property]; - if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || - binder instanceof CrossFadedCompositeBinder) && (binder ).expression.isStateDependent === true) { - //AHM: Remove after https://github.com/mapbox/mapbox-gl-js/issues/6255 - const value = layer.paint.get(property); - (binder ).expression = value.value; - (binder ).updatePaintArray(pos.start, pos.end, feature, featureStates[id], availableImages, imagePositions); - dirty = true; - } - } - } - } - return dirty; - } +/** + * 4 Dimensional Vector + * @module vec4 + */ - defines() { - const result = []; - for (const property in this.binders) { - const binder = this.binders[property]; - if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder) { - result.push(...binder.uniformNames.map(name => `#define HAS_UNIFORM_${name}`)); - } - } - return result; - } +/** + * Creates a new, empty vec4 + * + * @returns {vec4} a new 4D vector + */ - getBinderAttributes() { - const result = []; - for (const property in this.binders) { - const binder = this.binders[property]; - if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) { - for (let i = 0; i < binder.paintVertexAttributes.length; i++) { - result.push(binder.paintVertexAttributes[i].name); - } - } - } - return result; - } +function create$3() { + var out = new ARRAY_TYPE(4); - getBinderUniforms() { - const uniforms = []; - for (const property in this.binders) { - const binder = this.binders[property]; - if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) { - for (const uniformName of binder.uniformNames) { - uniforms.push(uniformName); - } - } - } - return uniforms; - } + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 0; + } - getPaintVertexBuffers() { - return this._buffers; - } + return out; +} +/** + * Creates a new vec4 initialized with values from an existing vector + * + * @param {ReadonlyVec4} a vector to clone + * @returns {vec4} a new 4D vector + */ - getUniforms(context , locations ) { - const uniforms = []; - for (const property in this.binders) { - const binder = this.binders[property]; - if (binder instanceof ConstantBinder || binder instanceof CrossFadedConstantBinder || binder instanceof CompositeExpressionBinder) { - for (const name of binder.uniformNames) { - if (locations[name]) { - const binding = binder.getBinding(context, locations[name], name); - uniforms.push({name, property, binding}); - } - } - } - } - return uniforms; - } +function clone$3(a) { + var out = new ARRAY_TYPE(4); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; +} +/** + * Creates a new vec4 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {vec4} a new 4D vector + */ + +function fromValues$3(x, y, z, w) { + var out = new ARRAY_TYPE(4); + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; + return out; +} +/** + * Copy the values from one vec4 to another + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the source vector + * @returns {vec4} out + */ + +function copy$3(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; +} +/** + * Set the components of a vec4 to the given values + * + * @param {vec4} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {vec4} out + */ - setUniforms (context , binderUniforms , properties , globals ) { - // Uniform state bindings are owned by the Program, but we set them - // from within the ProgramConfiguration's binder members. - for (const {name, property, binding} of binderUniforms) { - (this.binders[property] ).setUniform(binding, globals, properties.get(property), name); - } - } +function set$3(out, x, y, z, w) { + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; + return out; +} +/** + * Adds two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ - updatePaintBuffers(crossfade ) { - this._buffers = []; +function add$3(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + return out; +} +/** + * Subtracts vector b from vector a + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ - for (const property in this.binders) { - const binder = this.binders[property]; - if (crossfade && binder instanceof CrossFadedCompositeBinder) { - const patternVertexBuffer = crossfade.fromScale === 2 ? binder.zoomInPaintVertexBuffer : binder.zoomOutPaintVertexBuffer; - if (patternVertexBuffer) this._buffers.push(patternVertexBuffer); +function subtract$1(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + return out; +} +/** + * Multiplies two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ - } else if ((binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder) && binder.paintVertexBuffer) { - this._buffers.push(binder.paintVertexBuffer); - } - } - } +function multiply$3(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + out[3] = a[3] * b[3]; + return out; +} +/** + * Divides two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ - upload(context ) { - for (const property in this.binders) { - const binder = this.binders[property]; - if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) - binder.upload(context); - } - this.updatePaintBuffers(); - } +function divide$1(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + out[2] = a[2] / b[2]; + out[3] = a[3] / b[3]; + return out; +} +/** + * Math.ceil the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to ceil + * @returns {vec4} out + */ - destroy() { - for (const property in this.binders) { - const binder = this.binders[property]; - if (binder instanceof SourceExpressionBinder || binder instanceof CompositeExpressionBinder || binder instanceof CrossFadedCompositeBinder) - binder.destroy(); - } - } +function ceil$1(out, a) { + out[0] = Math.ceil(a[0]); + out[1] = Math.ceil(a[1]); + out[2] = Math.ceil(a[2]); + out[3] = Math.ceil(a[3]); + return out; } +/** + * Math.floor the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to floor + * @returns {vec4} out + */ -class ProgramConfigurationSet { - - - - +function floor$1(out, a) { + out[0] = Math.floor(a[0]); + out[1] = Math.floor(a[1]); + out[2] = Math.floor(a[2]); + out[3] = Math.floor(a[3]); + return out; +} +/** + * Returns the minimum of two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ - constructor(layers , zoom , filterProperties = () => true) { - this.programConfigurations = {}; - for (const layer of layers) { - this.programConfigurations[layer.id] = new ProgramConfiguration(layer, zoom, filterProperties); - } - this.needsUpload = false; - this._featureMap = new FeaturePositionMap(); - this._bufferOffset = 0; - } +function min$1(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + out[2] = Math.min(a[2], b[2]); + out[3] = Math.min(a[3], b[3]); + return out; +} +/** + * Returns the maximum of two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {vec4} out + */ - populatePaintArrays(length , feature , index , imagePositions , availableImages , canonical , formattedSection ) { - for (const key in this.programConfigurations) { - this.programConfigurations[key].populatePaintArrays(length, feature, imagePositions, availableImages, canonical, formattedSection); - } +function max$1(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + out[2] = Math.max(a[2], b[2]); + out[3] = Math.max(a[3], b[3]); + return out; +} +/** + * Math.round the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to round + * @returns {vec4} out + */ - if (feature.id !== undefined) { - this._featureMap.add(feature.id, index, this._bufferOffset, length); - } - this._bufferOffset = length; +function round$1(out, a) { + out[0] = Math.round(a[0]); + out[1] = Math.round(a[1]); + out[2] = Math.round(a[2]); + out[3] = Math.round(a[3]); + return out; +} +/** + * Scales a vec4 by a scalar number + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec4} out + */ - this.needsUpload = true; - } +function scale$3(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; +} +/** + * Adds two vec4's after scaling the second operand by a scalar value + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec4} out + */ - updatePaintArrays(featureStates , vtLayer , layers , availableImages , imagePositions ) { - for (const layer of layers) { - this.needsUpload = this.programConfigurations[layer.id].updatePaintArrays(featureStates, this._featureMap, vtLayer, layer, availableImages, imagePositions) || this.needsUpload; - } - } +function scaleAndAdd$1(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + return out; +} +/** + * Calculates the euclidian distance between two vec4's + * + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {Number} distance between a and b + */ - get(layerId ) { - return this.programConfigurations[layerId]; - } +function distance$1(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + var w = b[3] - a[3]; + return Math.hypot(x, y, z, w); +} +/** + * Calculates the squared euclidian distance between two vec4's + * + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {Number} squared distance between a and b + */ - upload(context ) { - if (!this.needsUpload) return; - for (const layerId in this.programConfigurations) { - this.programConfigurations[layerId].upload(context); - } - this.needsUpload = false; - } +function squaredDistance$1(a, b) { + var x = b[0] - a[0]; + var y = b[1] - a[1]; + var z = b[2] - a[2]; + var w = b[3] - a[3]; + return x * x + y * y + z * z + w * w; +} +/** + * Calculates the length of a vec4 + * + * @param {ReadonlyVec4} a vector to calculate length of + * @returns {Number} length of a + */ - destroy() { - for (const layerId in this.programConfigurations) { - this.programConfigurations[layerId].destroy(); - } - } +function length$3(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + return Math.hypot(x, y, z, w); } +/** + * Calculates the squared length of a vec4 + * + * @param {ReadonlyVec4} a vector to calculate squared length of + * @returns {Number} squared length of a + */ -const 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'], - 'line-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'], - 'fill-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'], - 'fill-extrusion-pattern': ['pattern_to', 'pattern_from', 'pixel_ratio_to', 'pixel_ratio_from'], - 'line-dasharray': ['dash_to', 'dash_from'] -}; +function squaredLength$3(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + return x * x + y * y + z * z + w * w; +} +/** + * Negates the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to negate + * @returns {vec4} out + */ -function paintAttributeNames(property, type) { - return attributeNameExceptions[property] || [property.replace(`${type}-`, '').replace(/-/g, '_')]; +function negate$1(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = -a[3]; + return out; } +/** + * Returns the inverse of the components of a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to invert + * @returns {vec4} out + */ -const propertyExceptions = { - 'line-pattern': { - 'source': StructArrayLayout10ui20, - 'composite': StructArrayLayout10ui20 - }, - 'fill-pattern': { - 'source': StructArrayLayout10ui20, - 'composite': StructArrayLayout10ui20 - }, - 'fill-extrusion-pattern':{ - 'source': StructArrayLayout10ui20, - 'composite': StructArrayLayout10ui20 - }, - 'line-dasharray': { // temporary layout - 'source': StructArrayLayout8ui16, - 'composite': StructArrayLayout8ui16 - } -}; +function inverse$1(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + out[2] = 1.0 / a[2]; + out[3] = 1.0 / a[3]; + return out; +} +/** + * Normalize a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to normalize + * @returns {vec4} out + */ -const defaultLayouts = { - 'color': { - 'source': StructArrayLayout2f8, - 'composite': StructArrayLayout4f16 - }, - 'number': { - 'source': StructArrayLayout1f4, - 'composite': StructArrayLayout2f8 - } -}; +function normalize$3(out, a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + var len = x * x + y * y + z * z + w * w; -function layoutType(property, type, binderType) { - const layoutException = propertyExceptions[property]; - return layoutException && layoutException[binderType] || defaultLayouts[type][binderType]; -} + if (len > 0) { + len = 1 / Math.sqrt(len); + } -register('ConstantBinder', ConstantBinder); -register('CrossFadedConstantBinder', CrossFadedConstantBinder); -register('SourceExpressionBinder', SourceExpressionBinder); -register('CrossFadedCompositeBinder', CrossFadedCompositeBinder); -register('CompositeExpressionBinder', CompositeExpressionBinder); -register('ProgramConfiguration', ProgramConfiguration, {omit: ['_buffers']}); -register('ProgramConfigurationSet', ProgramConfigurationSet); + out[0] = x * len; + out[1] = y * len; + out[2] = z * len; + out[3] = w * len; + return out; +} +/** + * Calculates the dot product of two vec4's + * + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @returns {Number} dot product of a and b + */ -// +function dot$4(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; +} +/** + * Returns the cross-product of three vectors in a 4-dimensional space + * + * @param {ReadonlyVec4} result the receiving vector + * @param {ReadonlyVec4} U the first vector + * @param {ReadonlyVec4} V the second vector + * @param {ReadonlyVec4} W the third vector + * @returns {vec4} result + */ - - - - - - - - - - - - - - - - +function cross$1(out, u, v, w) { + var A = v[0] * w[1] - v[1] * w[0], + B = v[0] * w[2] - v[2] * w[0], + C = v[0] * w[3] - v[3] * w[0], + D = v[1] * w[2] - v[2] * w[1], + E = v[1] * w[3] - v[3] * w[1], + F = v[2] * w[3] - v[3] * w[2]; + var G = u[0]; + var H = u[1]; + var I = u[2]; + var J = u[3]; + out[0] = H * F - I * E + J * D; + out[1] = -(G * F) + I * C - J * B; + out[2] = G * E - H * C + J * A; + out[3] = -(G * D) + H * B - I * A; + return out; +} +/** + * Performs a linear interpolation between two vec4's + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the first operand + * @param {ReadonlyVec4} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec4} out + */ -const TRANSITION_SUFFIX = '-transition'; +function lerp$3(out, a, b, t) { + var ax = a[0]; + var ay = a[1]; + var az = a[2]; + var aw = a[3]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + out[2] = az + t * (b[2] - az); + out[3] = aw + t * (b[3] - aw); + return out; +} +/** + * Generates a random vector with the given scale + * + * @param {vec4} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned + * @returns {vec4} out + */ -class StyleLayer extends Evented { - - - - - - - - - - +function random$2(out, scale) { + scale = scale || 1.0; // Marsaglia, George. Choosing a Point from the Surface of a + // Sphere. Ann. Math. Statist. 43 (1972), no. 2, 645--646. + // http://projecteuclid.org/euclid.aoms/1177692644; - - + var v1, v2, v3, v4; + var s1, s2; - - - + do { + v1 = RANDOM() * 2 - 1; + v2 = RANDOM() * 2 - 1; + s1 = v1 * v1 + v2 * v2; + } while (s1 >= 1); - - + do { + v3 = RANDOM() * 2 - 1; + v4 = RANDOM() * 2 - 1; + s2 = v3 * v3 + v4 * v4; + } while (s2 >= 1); - - - - - - - - - - + var d = Math.sqrt((1 - s1) / s2); + out[0] = scale * v1; + out[1] = scale * v2; + out[2] = scale * v3 * d; + out[3] = scale * v4 * d; + return out; +} +/** + * Transforms the vec4 with a mat4. + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the vector to transform + * @param {ReadonlyMat4} m matrix to transform with + * @returns {vec4} 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; +} +/** + * Transforms the vec4 with a quat + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the vector to transform + * @param {ReadonlyQuat} q quaternion to transform with + * @returns {vec4} out + */ - constructor(layer , properties ) { - super(); +function transformQuat(out, a, q) { + var x = a[0], + y = a[1], + z = a[2]; + var qx = q[0], + qy = q[1], + qz = q[2], + qw = q[3]; // calculate quat * vec - this.id = layer.id; - this.type = layer.type; - this._featureFilter = {filter: () => true, needGeometry: false, needFeature: false}; - this._filterCompiled = false; + var ix = qw * x + qy * z - qz * y; + var iy = qw * y + qz * x - qx * z; + var iz = qw * z + qx * y - qy * x; + var iw = -qx * x - qy * y - qz * z; // calculate result * inverse quat - if (layer.type === 'custom') return; + out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy; + out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz; + out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx; + out[3] = a[3]; + return out; +} +/** + * Set the components of a vec4 to zero + * + * @param {vec4} out the receiving vector + * @returns {vec4} out + */ - layer = ((layer ) ); +function zero$1(out) { + out[0] = 0.0; + out[1] = 0.0; + out[2] = 0.0; + out[3] = 0.0; + return out; +} +/** + * Returns a string representation of a vector + * + * @param {ReadonlyVec4} a vector to represent as a string + * @returns {String} string representation of the vector + */ - this.metadata = layer.metadata; - this.minzoom = layer.minzoom; - this.maxzoom = layer.maxzoom; +function str$3(a) { + return "vec4(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; +} +/** + * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyVec4} a The first vector. + * @param {ReadonlyVec4} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ - if (layer.type !== 'background' && layer.type !== 'sky') { - this.source = layer.source; - this.sourceLayer = layer['source-layer']; - this.filter = layer.filter; - } +function exactEquals$3(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3]; +} +/** + * Returns whether or not the vectors have approximately the same elements in the same position. + * + * @param {ReadonlyVec4} a The first vector. + * @param {ReadonlyVec4} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ - if (properties.layout) { - this._unevaluatedLayout = new Layout(properties.layout); - } +function equals$4(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)); +} +/** + * Alias for {@link vec4.subtract} + * @function + */ - if (properties.paint) { - this._transitionablePaint = new Transitionable(properties.paint); +var sub$1 = subtract$1; +/** + * Alias for {@link vec4.multiply} + * @function + */ - for (const property in layer.paint) { - this.setPaintProperty(property, layer.paint[property], {validate: false}); - } - for (const property in layer.layout) { - this.setLayoutProperty(property, layer.layout[property], {validate: false}); - } +var mul$3 = multiply$3; +/** + * Alias for {@link vec4.divide} + * @function + */ - this._transitioningPaint = this._transitionablePaint.untransitioned(); - //$FlowFixMe - this.paint = new PossiblyEvaluated(properties.paint); - } - } +var div$1 = divide$1; +/** + * Alias for {@link vec4.distance} + * @function + */ - getCrossfadeParameters() { - return this._crossfadeParameters; - } +var dist$1 = distance$1; +/** + * Alias for {@link vec4.squaredDistance} + * @function + */ - getLayoutProperty(name ) { - if (name === 'visibility') { - return this.visibility; - } +var sqrDist$1 = squaredDistance$1; +/** + * Alias for {@link vec4.length} + * @function + */ - return this._unevaluatedLayout.getValue(name); - } +var len$3 = length$3; +/** + * Alias for {@link vec4.squaredLength} + * @function + */ - setLayoutProperty(name , value , options = {}) { - if (value !== null && value !== undefined) { - const key = `layers.${this.id}.layout.${name}`; - if (this._validate(validateLayoutProperty$1, key, name, value, options)) { - return; - } - } +var sqrLen$3 = squaredLength$3; +/** + * Perform some operation over an array of vec4s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ - if (name === 'visibility') { - this.visibility = value; - return; - } +var forEach$1 = function () { + var vec = create$3(); + return function (a, stride, offset, count, fn, arg) { + var i, l; - this._unevaluatedLayout.setValue(name, value); + if (!stride) { + stride = 4; } - getPaintProperty(name ) { - if (endsWith(name, TRANSITION_SUFFIX)) { - return this._transitionablePaint.getTransition(name.slice(0, -TRANSITION_SUFFIX.length)); - } else { - return this._transitionablePaint.getValue(name); - } + if (!offset) { + offset = 0; } - setPaintProperty(name , value , options = {}) { - if (value !== null && value !== undefined) { - const key = `layers.${this.id}.paint.${name}`; - if (this._validate(validatePaintProperty$1, key, name, value, options)) { - return false; - } - } + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } - if (endsWith(name, TRANSITION_SUFFIX)) { - this._transitionablePaint.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), (value ) || undefined); - return false; - } else { - const transitionable = this._transitionablePaint._values[name]; - const isCrossFadedProperty = transitionable.property.specification["property-type"] === 'cross-faded-data-driven'; - const wasDataDriven = transitionable.value.isDataDriven(); - const oldValue = transitionable.value; + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + vec[2] = a[i + 2]; + vec[3] = a[i + 3]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + a[i + 2] = vec[2]; + a[i + 3] = vec[3]; + } - this._transitionablePaint.setValue(name, value); - this._handleSpecialPaintPropertyUpdate(name); + return a; + }; +}(); - const newValue = this._transitionablePaint._values[name].value; - const isDataDriven = newValue.isDataDriven(); +var vec4 = /*#__PURE__*/Object.freeze({ +__proto__: null, +create: create$3, +clone: clone$3, +fromValues: fromValues$3, +copy: copy$3, +set: set$3, +add: add$3, +subtract: subtract$1, +multiply: multiply$3, +divide: divide$1, +ceil: ceil$1, +floor: floor$1, +min: min$1, +max: max$1, +round: round$1, +scale: scale$3, +scaleAndAdd: scaleAndAdd$1, +distance: distance$1, +squaredDistance: squaredDistance$1, +length: length$3, +squaredLength: squaredLength$3, +negate: negate$1, +inverse: inverse$1, +normalize: normalize$3, +dot: dot$4, +cross: cross$1, +lerp: lerp$3, +random: random$2, +transformMat4: transformMat4$1, +transformQuat: transformQuat, +zero: zero$1, +str: str$3, +exactEquals: exactEquals$3, +equals: equals$4, +sub: sub$1, +mul: mul$3, +div: div$1, +dist: dist$1, +sqrDist: sqrDist$1, +len: len$3, +sqrLen: sqrLen$3, +forEach: forEach$1 +}); - // if a cross-faded value is changed, we need to make sure the new icons get added to each tile's iconAtlas - // so a call to _updateLayer is necessary, and we return true from this function so it gets called in - // Style#setPaintProperty - return isDataDriven || wasDataDriven || isCrossFadedProperty || this._handleOverridablePaintPropertyUpdate(name, oldValue, newValue); - } - } +/** + * Quaternion + * @module quat + */ - _handleSpecialPaintPropertyUpdate(_ ) { - // No-op; can be overridden by derived classes. - } +/** + * Creates a new identity quat + * + * @returns {quat} a new quaternion + */ - getProgramIds() { - // No-op; can be overridden by derived classes. - return null; - } +function create$2() { + var out = new ARRAY_TYPE(4); - getProgramConfiguration(_ ) { - // No-op; can be overridden by derived classes. - return null; - } + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + } - // eslint-disable-next-line no-unused-vars - _handleOverridablePaintPropertyUpdate (name , oldValue , newValue ) { - // No-op; can be overridden by derived classes. - return false; - } + out[3] = 1; + return out; +} +/** + * Set a quat to the identity quaternion + * + * @param {quat} out the receiving quaternion + * @returns {quat} out + */ - isHidden(zoom ) { - if (this.minzoom && zoom < this.minzoom) return true; - if (this.maxzoom && zoom >= this.maxzoom) return true; - return this.visibility === 'none'; - } +function identity$2(out) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; +} +/** + * Sets a quat from the given angle and rotation axis, + * then returns it. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyVec3} axis the axis around which to rotate + * @param {Number} rad the angle in radians + * @returns {quat} out + **/ - updateTransitions(parameters ) { - this._transitioningPaint = this._transitionablePaint.transitioned(parameters, this._transitioningPaint); - } +function setAxisAngle(out, axis, rad) { + rad = rad * 0.5; + var s = Math.sin(rad); + out[0] = s * axis[0]; + out[1] = s * axis[1]; + out[2] = s * axis[2]; + out[3] = Math.cos(rad); + return out; +} +/** + * Gets the rotation axis and angle for a given + * quaternion. If a quaternion is created with + * setAxisAngle, this method will return the same + * values as providied in the original parameter list + * OR functionally equivalent values. + * Example: The quaternion formed by axis [0, 0, 1] and + * angle -90 is the same as the quaternion formed by + * [0, 0, 1] and 270. This method favors the latter. + * @param {vec3} out_axis Vector receiving the axis of rotation + * @param {ReadonlyQuat} q Quaternion to be decomposed + * @return {Number} Angle, in radians, of the rotation + */ - hasTransition() { - return this._transitioningPaint.hasTransition(); - } +function getAxisAngle(out_axis, q) { + var rad = Math.acos(q[3]) * 2.0; + var s = Math.sin(rad / 2.0); - recalculate(parameters , availableImages ) { - if (parameters.getCrossfadeParameters) { - this._crossfadeParameters = parameters.getCrossfadeParameters(); - } + if (s > EPSILON) { + out_axis[0] = q[0] / s; + out_axis[1] = q[1] / s; + out_axis[2] = q[2] / s; + } else { + // If s is zero, return any axis (no rotation - axis does not matter) + out_axis[0] = 1; + out_axis[1] = 0; + out_axis[2] = 0; + } - if (this._unevaluatedLayout) { - (this ).layout = this._unevaluatedLayout.possiblyEvaluate(parameters, undefined, availableImages); - } + return rad; +} +/** + * Gets the angular distance between two unit quaternions + * + * @param {ReadonlyQuat} a Origin unit quaternion + * @param {ReadonlyQuat} b Destination unit quaternion + * @return {Number} Angle, in radians, between the two quaternions + */ - (this ).paint = this._transitioningPaint.possiblyEvaluate(parameters, undefined, availableImages); - } +function getAngle(a, b) { + var dotproduct = dot$3(a, b); + return Math.acos(2 * dotproduct * dotproduct - 1); +} +/** + * Multiplies two quat's + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @returns {quat} out + */ - serialize() { - const 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() - }; +function multiply$2(out, a, b) { + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var bx = b[0], + by = b[1], + bz = b[2], + bw = b[3]; + out[0] = ax * bw + aw * bx + ay * bz - az * by; + out[1] = ay * bw + aw * by + az * bx - ax * bz; + out[2] = az * bw + aw * bz + ax * by - ay * bx; + out[3] = aw * bw - ax * bx - ay * by - az * bz; + return out; +} +/** + * Rotates a quaternion by the given angle about the X axis + * + * @param {quat} out quat receiving operation result + * @param {ReadonlyQuat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ - if (this.visibility) { - output.layout = output.layout || {}; - output.layout.visibility = this.visibility; - } +function rotateX$1(out, a, rad) { + rad *= 0.5; + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var bx = Math.sin(rad), + bw = Math.cos(rad); + out[0] = ax * bw + aw * bx; + out[1] = ay * bw + az * bx; + out[2] = az * bw - ay * bx; + out[3] = aw * bw - ax * bx; + return out; +} +/** + * Rotates a quaternion by the given angle about the Y axis + * + * @param {quat} out quat receiving operation result + * @param {ReadonlyQuat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ - return filterObject(output, (value, key) => { - return value !== undefined && - !(key === 'layout' && !Object.keys(value).length) && - !(key === 'paint' && !Object.keys(value).length); - }); - } +function rotateY$1(out, a, rad) { + rad *= 0.5; + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var by = Math.sin(rad), + bw = Math.cos(rad); + out[0] = ax * bw - az * by; + out[1] = ay * bw + aw * by; + out[2] = az * bw + ax * by; + out[3] = aw * bw - ay * by; + return out; +} +/** + * Rotates a quaternion by the given angle about the Z axis + * + * @param {quat} out quat receiving operation result + * @param {ReadonlyQuat} a quat to rotate + * @param {number} rad angle (in radians) to rotate + * @returns {quat} out + */ - _validate(validate , key , name , value , options = {}) { - if (options && options.validate === false) { - return false; - } - return emitValidationErrors(this, validate.call(validateStyle, { - key, - layerType: this.type, - objectKey: name, - value, - styleSpec: spec, - // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 - style: {glyphs: true, sprite: true} - })); - } +function rotateZ$1(out, a, rad) { + rad *= 0.5; + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var bz = Math.sin(rad), + bw = Math.cos(rad); + out[0] = ax * bw + ay * bz; + out[1] = ay * bw - ax * bz; + out[2] = az * bw + aw * bz; + out[3] = aw * bw - az * bz; + return out; +} +/** + * Calculates the W component of a quat from the X, Y, and Z components. + * Assumes that quaternion is 1 unit in length. + * Any existing W component will be ignored. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate W component of + * @returns {quat} out + */ - is3D() { - return false; - } +function calculateW(out, a) { + var x = a[0], + y = a[1], + z = a[2]; + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z)); + return out; +} +/** + * Calculate the exponential of a unit quaternion. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate the exponential of + * @returns {quat} out + */ - isSky() { - return false; - } +function exp(out, a) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + var r = Math.sqrt(x * x + y * y + z * z); + var et = Math.exp(w); + var s = r > 0 ? et * Math.sin(r) / r : 0; + out[0] = x * s; + out[1] = y * s; + out[2] = z * s; + out[3] = et * Math.cos(r); + return out; +} +/** + * Calculate the natural logarithm of a unit quaternion. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate the exponential of + * @returns {quat} out + */ - isTileClipped() { - return false; - } +function ln(out, a) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + var r = Math.sqrt(x * x + y * y + z * z); + var t = r > 0 ? Math.atan2(r, w) / r : 0; + out[0] = x * t; + out[1] = y * t; + out[2] = z * t; + out[3] = 0.5 * Math.log(x * x + y * y + z * z + w * w); + return out; +} +/** + * Calculate the scalar power of a unit quaternion. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate the exponential of + * @param {Number} b amount to scale the quaternion by + * @returns {quat} out + */ - hasOffscreenPass() { - return false; - } +function pow(out, a, b) { + ln(out, a); + scale$2(out, out, b); + exp(out, out); + return out; +} +/** + * Performs a spherical linear interpolation between two quat + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {quat} out + */ - resize() { - // noop - } +function slerp$1(out, a, b, t) { + // benchmarks: + // http://jsperf.com/quaternion-slerp-implementations + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var bx = b[0], + by = b[1], + bz = b[2], + bw = b[3]; + var omega, cosom, sinom, scale0, scale1; // calc cosine - isStateDependent() { - for (const property in (this ).paint._values) { - const value = (this ).paint.get(property); - if (!(value instanceof PossiblyEvaluatedPropertyValue) || !supportsPropertyExpression(value.property.specification)) { - continue; - } + cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary) - if ((value.value.kind === 'source' || value.value.kind === 'composite') && - value.value.isStateDependent) { - return true; - } - } - return false; - } + if (cosom < 0.0) { + cosom = -cosom; + bx = -bx; + by = -by; + bz = -bz; + bw = -bw; + } // calculate coefficients - compileFilter() { - if (!this._filterCompiled) { - this._featureFilter = createFilter(this.filter); - this._filterCompiled = true; - } - } - invalidateCompiledFilter() { - this._filterCompiled = false; - } + if (1.0 - cosom > EPSILON) { + // standard case (slerp) + omega = Math.acos(cosom); + sinom = Math.sin(omega); + scale0 = Math.sin((1.0 - t) * omega) / sinom; + scale1 = Math.sin(t * omega) / sinom; + } else { + // "from" and "to" quaternions are very close + // ... so we can do a linear interpolation + scale0 = 1.0 - t; + scale1 = t; + } // calculate final values - dynamicFilter() { - return this._featureFilter.dynamicFilter; - } - dynamicFilterNeedsFeature() { - return this._featureFilter.needFeature; - } + out[0] = scale0 * ax + scale1 * bx; + out[1] = scale0 * ay + scale1 * by; + out[2] = scale0 * az + scale1 * bz; + out[3] = scale0 * aw + scale1 * bw; + return out; } +/** + * Generates a random unit quaternion + * + * @param {quat} out the receiving quaternion + * @returns {quat} out + */ -// - -const layout = createLayout([ - {name: 'a_pos', components: 2, type: 'Int16'} -], 4); -const {members, size, alignment} = layout; - -// +function random$1(out) { + // Implementation of http://planning.cs.uiuc.edu/node198.html + // TODO: Calling random 3 times is probably not the fastest solution + var u1 = RANDOM(); + var u2 = RANDOM(); + var u3 = RANDOM(); + var sqrt1MinusU1 = Math.sqrt(1 - u1); + var sqrtU1 = Math.sqrt(u1); + out[0] = sqrt1MinusU1 * Math.sin(2.0 * Math.PI * u2); + out[1] = sqrt1MinusU1 * Math.cos(2.0 * Math.PI * u2); + out[2] = sqrtU1 * Math.sin(2.0 * Math.PI * u3); + out[3] = sqrtU1 * Math.cos(2.0 * Math.PI * u3); + return out; +} +/** + * Calculates the inverse of a quat + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate inverse of + * @returns {quat} out + */ - - +function invert$1(out, a) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3; + var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0 - - - - - - - - + out[0] = -a0 * invDot; + out[1] = -a1 * invDot; + out[2] = -a2 * invDot; + out[3] = a3 * invDot; + return out; +} +/** + * Calculates the conjugate of a quat + * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate conjugate of + * @returns {quat} out + */ -class SegmentVector { - - +function conjugate$1(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = a[3]; + return out; +} +/** + * Creates a quaternion from the given 3x3 rotation matrix. + * + * NOTE: The resultant quaternion is not normalized, so you should be sure + * to renormalize the quaternion yourself where necessary. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyMat3} m rotation matrix + * @returns {quat} out + * @function + */ - constructor(segments = []) { - this.segments = segments; - } +function fromMat3(out, m) { + // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes + // article "Quaternion Calculus and Fast Animation". + var fTrace = m[0] + m[4] + m[8]; + var fRoot; - prepareSegment(numVertices , layoutVertexArray , indexArray , sortKey ) { - let segment = this.segments[this.segments.length - 1]; - if (numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) warnOnce(`Max vertices per segment is ${SegmentVector.MAX_VERTEX_ARRAY_LENGTH}: bucket requested ${numVertices}`); - if (!segment || segment.vertexLength + numVertices > SegmentVector.MAX_VERTEX_ARRAY_LENGTH || segment.sortKey !== sortKey) { - segment = ({ - vertexOffset: layoutVertexArray.length, - primitiveOffset: indexArray.length, - vertexLength: 0, - primitiveLength: 0 - } ); - if (sortKey !== undefined) segment.sortKey = sortKey; - this.segments.push(segment); - } - return segment; - } + if (fTrace > 0.0) { + // |w| > 1/2, may as well choose w > 1/2 + fRoot = Math.sqrt(fTrace + 1.0); // 2w - get() { - return this.segments; - } + out[3] = 0.5 * fRoot; + fRoot = 0.5 / fRoot; // 1/(4w) - destroy() { - for (const segment of this.segments) { - for (const k in segment.vaos) { - segment.vaos[k].destroy(); - } - } - } + out[0] = (m[5] - m[7]) * fRoot; + out[1] = (m[6] - m[2]) * fRoot; + out[2] = (m[1] - m[3]) * fRoot; + } else { + // |w| <= 1/2 + var i = 0; + if (m[4] > m[0]) i = 1; + if (m[8] > m[i * 3 + i]) i = 2; + var j = (i + 1) % 3; + var k = (i + 2) % 3; + fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0); + out[i] = 0.5 * fRoot; + fRoot = 0.5 / fRoot; + out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot; + out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot; + out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot; + } - static simpleSegment(vertexOffset , primitiveOffset , vertexLength , primitiveLength ) { - return new SegmentVector([{ - vertexOffset, - primitiveOffset, - vertexLength, - primitiveLength, - vaos: {}, - sortKey: 0 - }]); - } + return out; } - -/* - * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit - * addressing of vertex buffers. - * @private - * @readonly +/** + * Creates a quaternion from the given euler angle x, y, z. + * + * @param {quat} out the receiving quaternion + * @param {x} Angle to rotate around X axis in degrees. + * @param {y} Angle to rotate around Y axis in degrees. + * @param {z} Angle to rotate around Z axis in degrees. + * @returns {quat} out + * @function */ -SegmentVector.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1; - -register('SegmentVector', SegmentVector); -// +function fromEuler(out, x, y, z) { + var halfToRad = 0.5 * Math.PI / 180.0; + x *= halfToRad; + y *= halfToRad; + z *= halfToRad; + var sx = Math.sin(x); + var cx = Math.cos(x); + var sy = Math.sin(y); + var cy = Math.cos(y); + var sz = Math.sin(z); + var cz = Math.cos(z); + out[0] = sx * cy * cz - cx * sy * sz; + out[1] = cx * sy * cz + sx * cy * sz; + out[2] = cx * cy * sz - sx * sy * cz; + out[3] = cx * cy * cz + sx * sy * sz; + return out; +} +/** + * Returns a string representation of a quatenion + * + * @param {ReadonlyQuat} a vector to represent as a string + * @returns {String} string representation of the vector + */ -// +function str$2(a) { + return "quat(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ")"; +} +/** + * Creates a new quat initialized with values from an existing quaternion + * + * @param {ReadonlyQuat} a quaternion to clone + * @returns {quat} a new quaternion + * @function + */ +var clone$2 = clone$3; /** - * The maximum value of a coordinate in the internal tile coordinate system. Coordinates of - * all source features normalized to this extent upon load. + * Creates a new quat initialized with the given values * - * The value is a consequence of the following: + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {quat} a new quaternion + * @function + */ + +var fromValues$2 = fromValues$3; +/** + * Copy the values from one quat to another * - * * 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. - * * 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 + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the source quaternion + * @returns {quat} out + * @function + */ + +var copy$2 = copy$3; +/** + * Set the components of a quat to the given values * - * @private - * @readonly + * @param {quat} out the receiving quaternion + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {quat} out + * @function */ -var EXTENT$1 = 8192; -// +var set$2 = set$3; +/** + * Adds two quat's + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @returns {quat} out + * @function + */ - +var add$2 = add$3; +/** + * Alias for {@link quat.multiply} + * @function + */ +var mul$2 = multiply$2; /** - * 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. + * Scales a quat by a scalar number * - * 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 {quat} out the receiving vector + * @param {ReadonlyQuat} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {quat} out + * @function + */ + +var scale$2 = scale$3; +/** + * Calculates the dot product of two quat's * - * @param {LngLatLike} [sw] The southwest corner of the bounding box. - * @param {LngLatLike} [ne] The northeast corner of the bounding box. - * @example - * const sw = new mapboxgl.LngLat(-73.9876, 40.7661); - * const ne = new mapboxgl.LngLat(-73.9397, 40.8002); - * const llb = new mapboxgl.LngLatBounds(sw, ne); + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @returns {Number} dot product of a and b + * @function */ -class LngLatBounds { - - - // This constructor is too flexible to type. It should not be so flexible. - constructor(sw , ne ) { - if (!sw) { - // noop - } 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]); - } - } +var dot$3 = dot$4; +/** + * Performs a linear interpolation between two quat's + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {quat} out + * @function + */ - /** - * Set the northeast corner of the bounding box. - * - * @param {LngLatLike} ne A {@link LngLatLike} object describing the northeast corner of the bounding box. - * @returns {LngLatBounds} Returns itself to allow for method chaining. - * @example - * const sw = new mapboxgl.LngLat(-73.9876, 40.7661); - * const ne = new mapboxgl.LngLat(-73.9397, 40.8002); - * const llb = new mapboxgl.LngLatBounds(sw, ne); - * llb.setNorthEast([-73.9397, 42.8002]); - */ - setNorthEast(ne ) { - this._ne = ne instanceof LngLat ? new LngLat(ne.lng, ne.lat) : LngLat.convert(ne); - return this; - } +var lerp$2 = lerp$3; +/** + * Calculates the length of a quat + * + * @param {ReadonlyQuat} a vector to calculate length of + * @returns {Number} length of a + */ - /** - * Set the southwest corner of the bounding box. - * - * @param {LngLatLike} sw A {@link LngLatLike} object describing the southwest corner of the bounding box. - * @returns {LngLatBounds} Returns itself to allow for method chaining. - * @example - * const sw = new mapboxgl.LngLat(-73.9876, 40.7661); - * const ne = new mapboxgl.LngLat(-73.9397, 40.8002); - * const llb = new mapboxgl.LngLatBounds(sw, ne); - * llb.setSouthWest([-73.9876, 40.2661]); - */ - setSouthWest(sw ) { - this._sw = sw instanceof LngLat ? new LngLat(sw.lng, sw.lat) : LngLat.convert(sw); - return this; - } +var length$2 = length$3; +/** + * Alias for {@link quat.length} + * @function + */ - /** - * Extend the bounds to include a given LngLatLike or LngLatBoundsLike. - * - * @param {LngLatLike|LngLatBoundsLike} obj Object to extend to. - * @returns {LngLatBounds} Returns itself to allow for method chaining. - * @example - * const sw = new mapboxgl.LngLat(-73.9876, 40.7661); - * const ne = new mapboxgl.LngLat(-73.9397, 40.8002); - * const llb = new mapboxgl.LngLatBounds(sw, ne); - * llb.extend([-72.9876, 42.2661]); - */ - extend(obj ) { - const sw = this._sw, - ne = this._ne; - let sw2, ne2; +var len$2 = length$2; +/** + * Calculates the squared length of a quat + * + * @param {ReadonlyQuat} a vector to calculate squared length of + * @returns {Number} squared length of a + * @function + */ - if (obj instanceof LngLat) { - sw2 = obj; - ne2 = obj; +var squaredLength$2 = squaredLength$3; +/** + * Alias for {@link quat.squaredLength} + * @function + */ - } else if (obj instanceof LngLatBounds) { - sw2 = obj._sw; - ne2 = obj._ne; +var sqrLen$2 = squaredLength$2; +/** + * Normalize a quat + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quaternion to normalize + * @returns {quat} out + * @function + */ - if (!sw2 || !ne2) return this; +var normalize$2 = normalize$3; +/** + * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyQuat} a The first quaternion. + * @param {ReadonlyQuat} b The second quaternion. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ - } else { - if (Array.isArray(obj)) { - if (obj.length === 4 || obj.every(Array.isArray)) { - const lngLatBoundsObj = ((obj ) ); - return this.extend(LngLatBounds.convert(lngLatBoundsObj)); - } else { - const lngLatObj = ((obj ) ); - return this.extend(LngLat.convert(lngLatObj)); - } - } - return this; - } +var exactEquals$2 = exactEquals$3; +/** + * Returns whether or not the quaternions have approximately the same elements in the same position. + * + * @param {ReadonlyQuat} a The first vector. + * @param {ReadonlyQuat} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ - if (!sw && !ne) { - this._sw = new LngLat(sw2.lng, sw2.lat); - this._ne = new LngLat(ne2.lng, ne2.lat); +var equals$3 = equals$4; +/** + * Sets a quaternion to represent the shortest rotation from one + * vector to another. + * + * Both vectors are assumed to be unit length. + * + * @param {quat} out the receiving quaternion. + * @param {ReadonlyVec3} a the initial vector + * @param {ReadonlyVec3} b the destination vector + * @returns {quat} out + */ - } 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); - } +var rotationTo = function () { + var tmpvec3 = create$4(); + var xUnitVec3 = fromValues$4(1, 0, 0); + var yUnitVec3 = fromValues$4(0, 1, 0); + return function (out, a, b) { + var dot = dot$5(a, b); - return this; + if (dot < -0.999999) { + cross$2(tmpvec3, xUnitVec3, a); + if (len$4(tmpvec3) < 0.000001) cross$2(tmpvec3, yUnitVec3, a); + normalize$4(tmpvec3, tmpvec3); + setAxisAngle(out, tmpvec3, Math.PI); + return out; + } else if (dot > 0.999999) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + } else { + cross$2(tmpvec3, a, b); + out[0] = tmpvec3[0]; + out[1] = tmpvec3[1]; + out[2] = tmpvec3[2]; + out[3] = 1 + dot; + return normalize$2(out, out); } + }; +}(); +/** + * Performs a spherical linear interpolation with two control points + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @param {ReadonlyQuat} c the third operand + * @param {ReadonlyQuat} d the fourth operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {quat} out + */ - /** - * Returns the geographical coordinate equidistant from the bounding box's corners. - * - * @returns {LngLat} The bounding box's center. - * @example - * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); - * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315} - */ - getCenter() { - return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2); - } +var sqlerp = function () { + var temp1 = create$2(); + var temp2 = create$2(); + return function (out, a, b, c, d, t) { + slerp$1(temp1, a, d, t); + slerp$1(temp2, b, c, t); + slerp$1(out, temp1, temp2, 2 * t * (1 - t)); + return out; + }; +}(); +/** + * Sets the specified quaternion with values corresponding to the given + * axes. Each axis is a vec3 and is expected to be unit length and + * perpendicular to all other specified axes. + * + * @param {ReadonlyVec3} view the vector representing the viewing direction + * @param {ReadonlyVec3} right the vector representing the local "right" direction + * @param {ReadonlyVec3} up the vector representing the local "up" direction + * @returns {quat} out + */ - /** - * Returns the southwest corner of the bounding box. - * - * @returns {LngLat} The southwest corner of the bounding box. - * @example - * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); - * llb.getSouthWest(); // LngLat {lng: -73.9876, lat: 40.7661} - */ - getSouthWest() { return this._sw; } +var setAxes = function () { + var matr = create$6(); + return function (out, view, right, up) { + matr[0] = right[0]; + matr[3] = right[1]; + matr[6] = right[2]; + matr[1] = up[0]; + matr[4] = up[1]; + matr[7] = up[2]; + matr[2] = -view[0]; + matr[5] = -view[1]; + matr[8] = -view[2]; + return normalize$2(out, fromMat3(out, matr)); + }; +}(); - /** - * Returns the northeast corner of the bounding box. - * - * @returns {LngLat} The northeast corner of the bounding box. - * @example - * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); - * llb.getNorthEast(); // LngLat {lng: -73.9397, lat: 40.8002} - */ - getNorthEast() { return this._ne; } +var quat = /*#__PURE__*/Object.freeze({ +__proto__: null, +create: create$2, +identity: identity$2, +setAxisAngle: setAxisAngle, +getAxisAngle: getAxisAngle, +getAngle: getAngle, +multiply: multiply$2, +rotateX: rotateX$1, +rotateY: rotateY$1, +rotateZ: rotateZ$1, +calculateW: calculateW, +exp: exp, +ln: ln, +pow: pow, +slerp: slerp$1, +random: random$1, +invert: invert$1, +conjugate: conjugate$1, +fromMat3: fromMat3, +fromEuler: fromEuler, +str: str$2, +clone: clone$2, +fromValues: fromValues$2, +copy: copy$2, +set: set$2, +add: add$2, +mul: mul$2, +scale: scale$2, +dot: dot$3, +lerp: lerp$2, +length: length$2, +len: len$2, +squaredLength: squaredLength$2, +sqrLen: sqrLen$2, +normalize: normalize$2, +exactEquals: exactEquals$2, +equals: equals$3, +rotationTo: rotationTo, +sqlerp: sqlerp, +setAxes: setAxes +}); - /** - * Returns the northwest corner of the bounding box. - * - * @returns {LngLat} The northwest corner of the bounding box. - * @example - * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); - * llb.getNorthWest(); // LngLat {lng: -73.9876, lat: 40.8002} - */ - getNorthWest() { return new LngLat(this.getWest(), this.getNorth()); } +/** + * Dual Quaternion
+ * Format: [real, dual]
+ * Quaternion format: XYZW
+ * Make sure to have normalized dual quaternions, otherwise the functions may not work as intended.
+ * @module quat2 + */ - /** - * Returns the southeast corner of the bounding box. - * - * @returns {LngLat} The southeast corner of the bounding box. - * @example - * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); - * llb.getSouthEast(); // LngLat {lng: -73.9397, lat: 40.7661} - */ - getSouthEast() { return new LngLat(this.getEast(), this.getSouth()); } +/** + * Creates a new identity dual quat + * + * @returns {quat2} a new dual quaternion [real -> rotation, dual -> translation] + */ - /** - * Returns the west edge of the bounding box. - * - * @returns {number} The west edge of the bounding box. - * @example - * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); - * llb.getWest(); // -73.9876 - */ - getWest() { return this._sw.lng; } +function create$1() { + var dq = new ARRAY_TYPE(8); - /** - * Returns the south edge of the bounding box. - * - * @returns {number} The south edge of the bounding box. - * @example - * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); - * llb.getSouth(); // 40.7661 - */ - getSouth() { return this._sw.lat; } + if (ARRAY_TYPE != Float32Array) { + dq[0] = 0; + dq[1] = 0; + dq[2] = 0; + dq[4] = 0; + dq[5] = 0; + dq[6] = 0; + dq[7] = 0; + } - /** - * Returns the east edge of the bounding box. - * - * @returns {number} The east edge of the bounding box. - * @example - * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); - * llb.getEast(); // -73.9397 - */ - getEast() { return this._ne.lng; } + dq[3] = 1; + return dq; +} +/** + * Creates a new quat initialized with values from an existing quaternion + * + * @param {ReadonlyQuat2} a dual quaternion to clone + * @returns {quat2} new dual quaternion + * @function + */ - /** - * Returns the north edge of the bounding box. - * - * @returns {number} The north edge of the bounding box. - * @example - * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); - * llb.getNorth(); // 40.8002 - */ - getNorth() { return this._ne.lat; } +function clone$1(a) { + var dq = new ARRAY_TYPE(8); + dq[0] = a[0]; + dq[1] = a[1]; + dq[2] = a[2]; + dq[3] = a[3]; + dq[4] = a[4]; + dq[5] = a[5]; + dq[6] = a[6]; + dq[7] = a[7]; + return dq; +} +/** + * Creates a new dual quat initialized with the given values + * + * @param {Number} x1 X component + * @param {Number} y1 Y component + * @param {Number} z1 Z component + * @param {Number} w1 W component + * @param {Number} x2 X component + * @param {Number} y2 Y component + * @param {Number} z2 Z component + * @param {Number} w2 W component + * @returns {quat2} new dual quaternion + * @function + */ - /** - * 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 - * const llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); - * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]] - */ - toArray() { - return [this._sw.toArray(), this._ne.toArray()]; - } +function fromValues$1(x1, y1, z1, w1, x2, y2, z2, w2) { + var dq = new ARRAY_TYPE(8); + dq[0] = x1; + dq[1] = y1; + dq[2] = z1; + dq[3] = w1; + dq[4] = x2; + dq[5] = y2; + dq[6] = z2; + dq[7] = w2; + return dq; +} +/** + * Creates a new dual quat from the given values (quat and translation) + * + * @param {Number} x1 X component + * @param {Number} y1 Y component + * @param {Number} z1 Z component + * @param {Number} w1 W component + * @param {Number} x2 X component (translation) + * @param {Number} y2 Y component (translation) + * @param {Number} z2 Z component (translation) + * @returns {quat2} new dual quaternion + * @function + */ - /** - * 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 - * const 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))" - */ - toString() { - return `LngLatBounds(${this._sw.toString()}, ${this._ne.toString()})`; - } +function fromRotationTranslationValues(x1, y1, z1, w1, x2, y2, z2) { + var dq = new ARRAY_TYPE(8); + dq[0] = x1; + dq[1] = y1; + dq[2] = z1; + dq[3] = w1; + var ax = x2 * 0.5, + ay = y2 * 0.5, + az = z2 * 0.5; + dq[4] = ax * w1 + ay * z1 - az * y1; + dq[5] = ay * w1 + az * x1 - ax * z1; + dq[6] = az * w1 + ax * y1 - ay * x1; + dq[7] = -ax * x1 - ay * y1 - az * z1; + return dq; +} +/** + * Creates a dual quat from a quaternion and a translation + * + * @param {ReadonlyQuat2} dual quaternion receiving operation result + * @param {ReadonlyQuat} q a normalized quaternion + * @param {ReadonlyVec3} t tranlation vector + * @returns {quat2} dual quaternion receiving operation result + * @function + */ - /** - * Check if the bounding box is an empty/`null`-type box. - * - * @returns {boolean} True if bounds have been defined, otherwise false. - * @example - * const llb = new mapboxgl.LngLatBounds(); - * llb.isEmpty(); // true - * llb.setNorthEast([-73.9876, 40.7661]); - * llb.setSouthWest([-73.9397, 40.8002]); - * llb.isEmpty(); // false - */ - isEmpty() { - return !(this._sw && this._ne); - } +function fromRotationTranslation(out, q, t) { + var ax = t[0] * 0.5, + ay = t[1] * 0.5, + az = t[2] * 0.5, + bx = q[0], + by = q[1], + bz = q[2], + bw = q[3]; + out[0] = bx; + out[1] = by; + out[2] = bz; + out[3] = bw; + out[4] = ax * bw + ay * bz - az * by; + out[5] = ay * bw + az * bx - ax * bz; + out[6] = az * bw + ax * by - ay * bx; + out[7] = -ax * bx - ay * by - az * bz; + return out; +} +/** + * Creates a dual quat from a translation + * + * @param {ReadonlyQuat2} dual quaternion receiving operation result + * @param {ReadonlyVec3} t translation vector + * @returns {quat2} dual quaternion receiving operation result + * @function + */ - /** - * Check if the point is within the bounding box. - * - * @param {LngLatLike} lnglat Geographic point to check against. - * @returns {boolean} True if the point is within the bounding box. - * @example - * const llb = new mapboxgl.LngLatBounds( - * new mapboxgl.LngLat(-73.9876, 40.7661), - * new mapboxgl.LngLat(-73.9397, 40.8002) - * ); - * - * const ll = new mapboxgl.LngLat(-73.9567, 40.7789); - * - * console.log(llb.contains(ll)); // = true - */ - contains(lnglat ) { - const {lng, lat} = LngLat.convert(lnglat); +function fromTranslation(out, t) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = t[0] * 0.5; + out[5] = t[1] * 0.5; + out[6] = t[2] * 0.5; + out[7] = 0; + return out; +} +/** + * Creates a dual quat from a quaternion + * + * @param {ReadonlyQuat2} dual quaternion receiving operation result + * @param {ReadonlyQuat} q the quaternion + * @returns {quat2} dual quaternion receiving operation result + * @function + */ - const containsLatitude = this._sw.lat <= lat && lat <= this._ne.lat; - let containsLongitude = this._sw.lng <= lng && lng <= this._ne.lng; - if (this._sw.lng > this._ne.lng) { // wrapped coordinates - containsLongitude = this._sw.lng >= lng && lng >= this._ne.lng; - } +function fromRotation(out, q) { + out[0] = q[0]; + out[1] = q[1]; + out[2] = q[2]; + out[3] = q[3]; + out[4] = 0; + out[5] = 0; + out[6] = 0; + out[7] = 0; + return out; +} +/** + * Creates a new dual quat from a matrix (4x4) + * + * @param {quat2} out the dual quaternion + * @param {ReadonlyMat4} a the matrix + * @returns {quat2} dual quat receiving operation result + * @function + */ - return containsLatitude && containsLongitude; - } +function fromMat4(out, a) { + //TODO Optimize this + var outer = create$2(); + getRotation(outer, a); + var t = new ARRAY_TYPE(3); + getTranslation$1(t, a); + fromRotationTranslation(out, outer, t); + return out; +} +/** + * Copy the values from one dual quat to another + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the source dual quaternion + * @returns {quat2} out + * @function + */ - /** - * 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 - * const arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]]; - * const llb = mapboxgl.LngLatBounds.convert(arr); - * console.log(llb); // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}} - */ - static convert(input ) { - if (!input || input instanceof LngLatBounds) return input; - return new LngLatBounds(input); - } +function copy$1(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + return out; +} +/** + * Set a dual quat to the identity dual quaternion + * + * @param {quat2} out the receiving quaternion + * @returns {quat2} out + */ + +function identity$1(out) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + out[6] = 0; + out[7] = 0; + return out; +} +/** + * Set the components of a dual quat to the given values + * + * @param {quat2} out the receiving quaternion + * @param {Number} x1 X component + * @param {Number} y1 Y component + * @param {Number} z1 Z component + * @param {Number} w1 W component + * @param {Number} x2 X component + * @param {Number} y2 Y component + * @param {Number} z2 Z component + * @param {Number} w2 W component + * @returns {quat2} out + * @function + */ + +function set$1(out, x1, y1, z1, w1, x2, y2, z2, w2) { + out[0] = x1; + out[1] = y1; + out[2] = z1; + out[3] = w1; + out[4] = x2; + out[5] = y2; + out[6] = z2; + out[7] = w2; + return out; } +/** + * Gets the real part of a dual quat + * @param {quat} out real part + * @param {ReadonlyQuat2} a Dual Quaternion + * @return {quat} real part + */ -// - -/* -* Approximate radius of the earth in meters. -* Uses the WGS-84 approximation. The radius at the equator is ~6378137 and at the poles is ~6356752. https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84 -* 6371008.8 is one published "average radius" see https://en.wikipedia.org/wiki/Earth_radius#Mean_radius, or ftp://athena.fsv.cvut.cz/ZFG/grs80-Moritz.pdf p.4 -*/ -const earthRadius = 6371008.8; +var getReal = copy$2; +/** + * Gets the dual part of a dual quat + * @param {quat} out dual part + * @param {ReadonlyQuat2} a Dual Quaternion + * @return {quat} dual part + */ +function getDual(out, a) { + out[0] = a[4]; + out[1] = a[5]; + out[2] = a[6]; + out[3] = a[7]; + return out; +} /** - * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees. - * These coordinates use longitude, latitude coordinate order (as opposed to latitude, longitude) - * to match the [GeoJSON specification](https://datatracker.ietf.org/doc/html/rfc7946#section-4), - * which is equivalent to the OGC:CRS84 coordinate reference system. - * - * 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}. + * Set the real component of a dual quat to the given quaternion * - * @param {number} lng Longitude, measured in degrees. - * @param {number} lat Latitude, measured in degrees. - * @example - * const ll = new mapboxgl.LngLat(-123.9749, 40.7736); - * console.log(ll.lng); // = -123.9749 - * @see [Example: Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/) - * @see [Example: Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) - * @see [Example: Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) - * @see [Example: Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) + * @param {quat2} out the receiving quaternion + * @param {ReadonlyQuat} q a quaternion representing the real part + * @returns {quat2} out + * @function */ -class LngLat { - - - - constructor(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 - * const ll = new mapboxgl.LngLat(286.0251, 40.7736); - * const wrapped = ll.wrap(); - * console.log(wrapped.lng); // = -73.9749 - */ - wrap() { - 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 - * const ll = new mapboxgl.LngLat(-73.9749, 40.7736); - * ll.toArray(); // = [-73.9749, 40.7736] - */ - 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 - * const ll = new mapboxgl.LngLat(-73.9749, 40.7736); - * ll.toString(); // = "LngLat(-73.9749, 40.7736)" - */ - toString() { - return `LngLat(${this.lng}, ${this.lat})`; - } - - /** - * Returns the approximate distance between a pair of coordinates in meters. - * Uses the Haversine Formula (from R.W. Sinnott, "Virtues of the Haversine", Sky and Telescope, vol. 68, no. 2, 1984, p. 159). - * - * @param {LngLat} lngLat Coordinates to compute the distance to. - * @returns {number} Distance in meters between the two coordinates. - * @example - * const newYork = new mapboxgl.LngLat(-74.0060, 40.7128); - * const losAngeles = new mapboxgl.LngLat(-118.2437, 34.0522); - * newYork.distanceTo(losAngeles); // = 3935751.690893987, "true distance" using a non-spherical approximation is ~3966km - */ - distanceTo(lngLat ) { - const rad = Math.PI / 180; - const lat1 = this.lat * rad; - const lat2 = lngLat.lat * rad; - const a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((lngLat.lng - this.lng) * rad); - - const maxMeters = earthRadius * Math.acos(Math.min(a, 1)); - return maxMeters; - } - /** - * Returns a `LngLatBounds` from the coordinates extended by a given `radius`. The returned `LngLatBounds` completely contains the `radius`. - * - * @param {number} [radius=0] Distance in meters from the coordinates to extend the bounds. - * @returns {LngLatBounds} A new `LngLatBounds` object representing the coordinates extended by the `radius`. - * @example - * const ll = new mapboxgl.LngLat(-73.9749, 40.7736); - * ll.toBounds(100).toArray(); // = [[-73.97501862141328, 40.77351016847229], [-73.97478137858673, 40.77368983152771]] - */ - toBounds(radius = 0) { - const earthCircumferenceInMetersAtEquator = 40075017; - const latAccuracy = 360 * radius / earthCircumferenceInMetersAtEquator, - lngAccuracy = latAccuracy / Math.cos((Math.PI / 180) * this.lat); +var setReal = copy$2; +/** + * Set the dual component of a dual quat to the given quaternion + * + * @param {quat2} out the receiving quaternion + * @param {ReadonlyQuat} q a quaternion representing the dual part + * @returns {quat2} out + * @function + */ - return new LngLatBounds(new LngLat(this.lng - lngAccuracy, this.lat - latAccuracy), - new LngLat(this.lng + lngAccuracy, this.lat + latAccuracy)); - } +function setDual(out, q) { + out[4] = q[0]; + out[5] = q[1]; + out[6] = q[2]; + out[7] = q[3]; + return out; +} +/** + * Gets the translation of a normalized dual quat + * @param {vec3} out translation + * @param {ReadonlyQuat2} a Dual Quaternion to be decomposed + * @return {vec3} translation + */ - /** - * Converts an array of two numbers or an object with `lng` and `lat` or `lon` and `lat` properties - * to a `LngLat` object. - * - * If a `LngLat` object is passed in, the function returns it unchanged. - * - * @param {LngLatLike} input An array of two numbers or object to convert, or a `LngLat` object to return. - * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object. - * @example - * const arr = [-73.9749, 40.7736]; - * const ll = mapboxgl.LngLat.convert(arr); - * console.log(ll); // = LngLat {lng: -73.9749, lat: 40.7736} - */ - static 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( - // flow can't refine this to have one of lng or lat, so we have to cast to any - Number('lng' in input ? (input ).lng : (input ).lon), - Number(input.lat) - ); - } - throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, an object {lon: , lat: }, or an array of [, ]"); - } +function getTranslation(out, a) { + var ax = a[4], + ay = a[5], + az = a[6], + aw = a[7], + bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3]; + out[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; + out[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; + out[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; + return out; } +/** + * Translates a dual quat by the given vector + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to translate + * @param {ReadonlyVec3} v vector to translate by + * @returns {quat2} out + */ -// - +function translate(out, a, v) { + var ax1 = a[0], + ay1 = a[1], + az1 = a[2], + aw1 = a[3], + bx1 = v[0] * 0.5, + by1 = v[1] * 0.5, + bz1 = v[2] * 0.5, + ax2 = a[4], + ay2 = a[5], + az2 = a[6], + aw2 = a[7]; + out[0] = ax1; + out[1] = ay1; + out[2] = az1; + out[3] = aw1; + out[4] = aw1 * bx1 + ay1 * bz1 - az1 * by1 + ax2; + out[5] = aw1 * by1 + az1 * bx1 - ax1 * bz1 + ay2; + out[6] = aw1 * bz1 + ax1 * by1 - ay1 * bx1 + az2; + out[7] = -ax1 * bx1 - ay1 * by1 - az1 * bz1 + aw2; + return out; +} +/** + * Rotates a dual quat around the X axis + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @param {number} rad how far should the rotation be + * @returns {quat2} out + */ -/* - * The average circumference of the world in meters. +function rotateX(out, a, rad) { + var bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3], + ax = a[4], + ay = a[5], + az = a[6], + aw = a[7], + ax1 = ax * bw + aw * bx + ay * bz - az * by, + ay1 = ay * bw + aw * by + az * bx - ax * bz, + az1 = az * bw + aw * bz + ax * by - ay * bx, + aw1 = aw * bw - ax * bx - ay * by - az * bz; + rotateX$1(out, a, rad); + bx = out[0]; + by = out[1]; + bz = out[2]; + bw = out[3]; + out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; + out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; + out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; + out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; + return out; +} +/** + * Rotates a dual quat around the Y axis + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @param {number} rad how far should the rotation be + * @returns {quat2} out */ -const earthCircumference = 2 * Math.PI * earthRadius; // meters -/* - * The circumference at a line of latitude in meters. +function rotateY(out, a, rad) { + var bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3], + ax = a[4], + ay = a[5], + az = a[6], + aw = a[7], + ax1 = ax * bw + aw * bx + ay * bz - az * by, + ay1 = ay * bw + aw * by + az * bx - ax * bz, + az1 = az * bw + aw * bz + ax * by - ay * bx, + aw1 = aw * bw - ax * bx - ay * by - az * bz; + rotateY$1(out, a, rad); + bx = out[0]; + by = out[1]; + bz = out[2]; + bw = out[3]; + out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; + out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; + out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; + out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; + return out; +} +/** + * Rotates a dual quat around the Z axis + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @param {number} rad how far should the rotation be + * @returns {quat2} out */ -function circumferenceAtLatitude(latitude ) { - return earthCircumference * Math.cos(latitude * Math.PI / 180); + +function rotateZ(out, a, rad) { + var bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3], + ax = a[4], + ay = a[5], + az = a[6], + aw = a[7], + ax1 = ax * bw + aw * bx + ay * bz - az * by, + ay1 = ay * bw + aw * by + az * bx - ax * bz, + az1 = az * bw + aw * bz + ax * by - ay * bx, + aw1 = aw * bw - ax * bx - ay * by - az * bz; + rotateZ$1(out, a, rad); + bx = out[0]; + by = out[1]; + bz = out[2]; + bw = out[3]; + out[4] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; + out[5] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; + out[6] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; + out[7] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; + return out; } +/** + * Rotates a dual quat by a given quaternion (a * q) + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @param {ReadonlyQuat} q quaternion to rotate by + * @returns {quat2} out + */ -function mercatorXfromLng$1(lng ) { - return (180 + lng) / 360; +function rotateByQuatAppend(out, a, q) { + var qx = q[0], + qy = q[1], + qz = q[2], + qw = q[3], + ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + out[0] = ax * qw + aw * qx + ay * qz - az * qy; + out[1] = ay * qw + aw * qy + az * qx - ax * qz; + out[2] = az * qw + aw * qz + ax * qy - ay * qx; + out[3] = aw * qw - ax * qx - ay * qy - az * qz; + ax = a[4]; + ay = a[5]; + az = a[6]; + aw = a[7]; + out[4] = ax * qw + aw * qx + ay * qz - az * qy; + out[5] = ay * qw + aw * qy + az * qx - ax * qz; + out[6] = az * qw + aw * qz + ax * qy - ay * qx; + out[7] = aw * qw - ax * qx - ay * qy - az * qz; + return out; } +/** + * Rotates a dual quat by a given quaternion (q * a) + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat} q quaternion to rotate by + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @returns {quat2} out + */ -function mercatorYfromLat$1(lat ) { - return (180 - (180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)))) / 360; +function rotateByQuatPrepend(out, q, a) { + var qx = q[0], + qy = q[1], + qz = q[2], + qw = q[3], + bx = a[0], + by = a[1], + bz = a[2], + bw = a[3]; + out[0] = qx * bw + qw * bx + qy * bz - qz * by; + out[1] = qy * bw + qw * by + qz * bx - qx * bz; + out[2] = qz * bw + qw * bz + qx * by - qy * bx; + out[3] = qw * bw - qx * bx - qy * by - qz * bz; + bx = a[4]; + by = a[5]; + bz = a[6]; + bw = a[7]; + out[4] = qx * bw + qw * bx + qy * bz - qz * by; + out[5] = qy * bw + qw * by + qz * bx - qx * bz; + out[6] = qz * bw + qw * bz + qx * by - qy * bx; + out[7] = qw * bw - qx * bx - qy * by - qz * bz; + return out; } +/** + * Rotates a dual quat around a given axis. Does the normalisation automatically + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the dual quaternion to rotate + * @param {ReadonlyVec3} axis the axis to rotate around + * @param {Number} rad how far the rotation should be + * @returns {quat2} out + */ -function mercatorZfromAltitude(altitude , lat ) { - return altitude / circumferenceAtLatitude(lat); +function rotateAroundAxis(out, a, axis, rad) { + //Special case for rad = 0 + if (Math.abs(rad) < EPSILON) { + return copy$1(out, a); + } + + var axisLength = Math.hypot(axis[0], axis[1], axis[2]); + rad = rad * 0.5; + var s = Math.sin(rad); + var bx = s * axis[0] / axisLength; + var by = s * axis[1] / axisLength; + var bz = s * axis[2] / axisLength; + var bw = Math.cos(rad); + var ax1 = a[0], + ay1 = a[1], + az1 = a[2], + aw1 = a[3]; + out[0] = ax1 * bw + aw1 * bx + ay1 * bz - az1 * by; + out[1] = ay1 * bw + aw1 * by + az1 * bx - ax1 * bz; + out[2] = az1 * bw + aw1 * bz + ax1 * by - ay1 * bx; + out[3] = aw1 * bw - ax1 * bx - ay1 * by - az1 * bz; + var ax = a[4], + ay = a[5], + az = a[6], + aw = a[7]; + out[4] = ax * bw + aw * bx + ay * bz - az * by; + out[5] = ay * bw + aw * by + az * bx - ax * bz; + out[6] = az * bw + aw * bz + ax * by - ay * bx; + out[7] = aw * bw - ax * bx - ay * by - az * bz; + return out; } +/** + * Adds two dual quat's + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the first operand + * @param {ReadonlyQuat2} b the second operand + * @returns {quat2} out + * @function + */ -function lngFromMercatorX(x ) { - return x * 360 - 180; +function add$1(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; + out[5] = a[5] + b[5]; + out[6] = a[6] + b[6]; + out[7] = a[7] + b[7]; + return out; } +/** + * Multiplies two dual quat's + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a the first operand + * @param {ReadonlyQuat2} b the second operand + * @returns {quat2} out + */ -function latFromMercatorY(y ) { - const y2 = 180 - y * 360; - return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90; +function multiply$1(out, a, b) { + var ax0 = a[0], + ay0 = a[1], + az0 = a[2], + aw0 = a[3], + bx1 = b[4], + by1 = b[5], + bz1 = b[6], + bw1 = b[7], + ax1 = a[4], + ay1 = a[5], + az1 = a[6], + aw1 = a[7], + bx0 = b[0], + by0 = b[1], + bz0 = b[2], + bw0 = b[3]; + out[0] = ax0 * bw0 + aw0 * bx0 + ay0 * bz0 - az0 * by0; + out[1] = ay0 * bw0 + aw0 * by0 + az0 * bx0 - ax0 * bz0; + out[2] = az0 * bw0 + aw0 * bz0 + ax0 * by0 - ay0 * bx0; + out[3] = aw0 * bw0 - ax0 * bx0 - ay0 * by0 - az0 * bz0; + out[4] = ax0 * bw1 + aw0 * bx1 + ay0 * bz1 - az0 * by1 + ax1 * bw0 + aw1 * bx0 + ay1 * bz0 - az1 * by0; + out[5] = ay0 * bw1 + aw0 * by1 + az0 * bx1 - ax0 * bz1 + ay1 * bw0 + aw1 * by0 + az1 * bx0 - ax1 * bz0; + out[6] = az0 * bw1 + aw0 * bz1 + ax0 * by1 - ay0 * bx1 + az1 * bw0 + aw1 * bz0 + ax1 * by0 - ay1 * bx0; + out[7] = aw0 * bw1 - ax0 * bx1 - ay0 * by1 - az0 * bz1 + aw1 * bw0 - ax1 * bx0 - ay1 * by0 - az1 * bz0; + return out; } +/** + * Alias for {@link quat2.multiply} + * @function + */ -function altitudeFromMercatorZ(z , y ) { - return z * circumferenceAtLatitude(latFromMercatorY(y)); +var mul$1 = multiply$1; +/** + * Scales a dual quat by a scalar number + * + * @param {quat2} out the receiving dual quat + * @param {ReadonlyQuat2} a the dual quat to scale + * @param {Number} b amount to scale the dual quat by + * @returns {quat2} out + * @function + */ + +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; + out[4] = a[4] * b; + out[5] = a[5] * b; + out[6] = a[6] * b; + out[7] = a[7] * b; + return out; } - -const MAX_MERCATOR_LATITUDE = 85.051129; - /** - * Determine the Mercator scale factor for a given latitude, see - * https://en.wikipedia.org/wiki/Mercator_projection#Scale_factor - * - * At the equator the scale factor will be 1, which increases at higher latitudes. + * Calculates the dot product of two dual quat's (The dot product of the real parts) * - * @param {number} lat Latitude - * @returns {number} scale factor - * @private + * @param {ReadonlyQuat2} a the first operand + * @param {ReadonlyQuat2} b the second operand + * @returns {Number} dot product of a and b + * @function */ -function mercatorScale(lat ) { - return 1 / Math.cos(lat * Math.PI / 180); -} +var dot$2 = dot$3; /** - * A `MercatorCoordinate` object represents a projected three dimensional position. - * - * `MercatorCoordinate` uses the web mercator projection ([EPSG:3857](https://epsg.io/3857)) with slightly different units: - * - the size of 1 unit is the width of the projected world instead of the "mercator meter" - * - the origin of the coordinate space is at the north-west corner instead of the middle. - * - * For example, `MercatorCoordinate(0, 0, 0)` is the north-west corner of the mercator world and - * `MercatorCoordinate(1, 1, 0)` is the south-east corner. If you are familiar with - * [vector tiles](https://github.com/mapbox/vector-tile-spec) it may be helpful to think - * of the coordinate space as the `0/0/0` tile with an extent of `1`. - * - * The `z` dimension of `MercatorCoordinate` is conformal. A cube in the mercator coordinate space would be rendered as a cube. - * - * @param {number} x The x component of the position. - * @param {number} y The y component of the position. - * @param {number} z The z component of the position. - * @example - * const nullIsland = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0); + * Performs a linear interpolation between two dual quats's + * NOTE: The resulting dual quaternions won't always be normalized (The error is most noticeable when t = 0.5) * - * @see [Example: Add a custom style layer](https://www.mapbox.com/mapbox-gl-js/example/custom-style-layer/) + * @param {quat2} out the receiving dual quat + * @param {ReadonlyQuat2} a the first operand + * @param {ReadonlyQuat2} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {quat2} out */ -class MercatorCoordinate { - - - - - constructor(x , y , z = 0) { - this.x = +x; - this.y = +y; - this.z = +z; - } - - /** - * Project a `LngLat` to a `MercatorCoordinate`. - * - * @param {LngLatLike} lngLatLike The location to project. - * @param {number} altitude The altitude in meters of the position. - * @returns {MercatorCoordinate} The projected mercator coordinate. - * @example - * const coord = mapboxgl.MercatorCoordinate.fromLngLat({lng: 0, lat: 0}, 0); - * console.log(coord); // MercatorCoordinate(0.5, 0.5, 0) - */ - static fromLngLat(lngLatLike , altitude = 0) { - const lngLat = LngLat.convert(lngLatLike); - - return new MercatorCoordinate( - mercatorXfromLng$1(lngLat.lng), - mercatorYfromLat$1(lngLat.lat), - mercatorZfromAltitude(altitude, lngLat.lat)); - } - - /** - * Returns the `LngLat` for the coordinate. - * - * @returns {LngLat} The `LngLat` object. - * @example - * const coord = new mapboxgl.MercatorCoordinate(0.5, 0.5, 0); - * const lngLat = coord.toLngLat(); // LngLat(0, 0) - */ - toLngLat() { - return new LngLat( - lngFromMercatorX(this.x), - latFromMercatorY(this.y)); - } - - /** - * Returns the altitude in meters of the coordinate. - * - * @returns {number} The altitude in meters. - * @example - * const coord = new mapboxgl.MercatorCoordinate(0, 0, 0.02); - * coord.toAltitude(); // 6914.281956295339 - */ - toAltitude() { - return altitudeFromMercatorZ(this.z, this.y); - } - - /** - * Returns the distance of 1 meter in `MercatorCoordinate` units at this latitude. - * - * For coordinates in real world units using meters, this naturally provides the scale - * to transform into `MercatorCoordinate`s. - * - * @returns {number} Distance of 1 meter in `MercatorCoordinate` units. - * @example - * // Calculate a new MercatorCoordinate that is 150 meters west of the other coord. - * const coord = new mapboxgl.MercatorCoordinate(0.5, 0.25, 0); - * const offsetInMeters = 150; - * const offsetInMercatorCoordinateUnits = offsetInMeters * coord.meterInMercatorCoordinateUnits(); - * const westCoord = new mapboxgl.MercatorCoordinate(coord.x - offsetInMercatorCoordinateUnits, coord.y, coord.z); - */ - meterInMercatorCoordinateUnits() { - // 1 meter / circumference at equator in meters * Mercator projection scale factor at this latitude - return 1 / earthCircumference * mercatorScale(latFromMercatorY(this.y)); - } +function lerp$1(out, a, b, t) { + var mt = 1 - t; + if (dot$2(a, b) < 0) t = -t; + out[0] = a[0] * mt + b[0] * t; + out[1] = a[1] * mt + b[1] * t; + out[2] = a[2] * mt + b[2] * t; + out[3] = a[3] * mt + b[3] * t; + out[4] = a[4] * mt + b[4] * t; + out[5] = a[5] * mt + b[5] * t; + out[6] = a[6] * mt + b[6] * t; + out[7] = a[7] * mt + b[7] * t; + return out; } +/** + * Calculates the inverse of a dual quat. If they are normalized, conjugate is cheaper + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a dual quat to calculate inverse of + * @returns {quat2} out + */ -// - -function pointToLineDist(px, py, ax, ay, bx, by) { - const dx = ax - bx; - const dy = ay - by; - return Math.abs((ay - py) * dx - (ax - px) * dy) / Math.hypot(dx, dy); +function invert(out, a) { + var sqlen = squaredLength$1(a); + out[0] = -a[0] / sqlen; + out[1] = -a[1] / sqlen; + out[2] = -a[2] / sqlen; + out[3] = a[3] / sqlen; + out[4] = -a[4] / sqlen; + out[5] = -a[5] / sqlen; + out[6] = -a[6] / sqlen; + out[7] = a[7] / sqlen; + return out; } +/** + * Calculates the conjugate of a dual quat + * If the dual quaternion is normalized, this function is faster than quat2.inverse and produces the same result. + * + * @param {quat2} out the receiving quaternion + * @param {ReadonlyQuat2} a quat to calculate conjugate of + * @returns {quat2} out + */ -function addResampled(resampled, mx0, my0, mx2, my2, start, end, reproject, tolerance) { - const mx1 = (mx0 + mx2) / 2; - const my1 = (my0 + my2) / 2; - const mid = new pointGeometry(mx1, my1); - reproject(mid); - const err = pointToLineDist(mid.x, mid.y, start.x, start.y, end.x, end.y); - - // if reprojected midPoint is too far from geometric midpoint, recurse into two halves - if (err >= tolerance) { - // we're very unlikely to hit max call stack exceeded here, - // but we might want to safeguard against it in the future - addResampled(resampled, mx0, my0, mx1, my1, start, mid, reproject, tolerance); - addResampled(resampled, mx1, my1, mx2, my2, mid, end, reproject, tolerance); - - } else { // otherwise, just add the point - resampled.push(end); - } +function conjugate(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + out[2] = -a[2]; + out[3] = a[3]; + out[4] = -a[4]; + out[5] = -a[5]; + out[6] = -a[6]; + out[7] = a[7]; + return out; } +/** + * Calculates the length of a dual quat + * + * @param {ReadonlyQuat2} a dual quat to calculate length of + * @returns {Number} length of a + * @function + */ -// reproject and resample a line, adding point where necessary for lines that become curves; -// note that this operation is mutable (modifying original points) for performance -function resample(line , reproject , tolerance ) { - const resampled = []; - let mx0, my0, prev; - - for (const point of line) { - const {x, y} = point; - reproject(point); - - if (prev) { - addResampled(resampled, mx0, my0, x, y, prev, point, reproject, tolerance); - } else { - resampled.push(point); - } +var length$1 = length$2; +/** + * Alias for {@link quat2.length} + * @function + */ - mx0 = x; - my0 = y; - prev = point; - } +var len$1 = length$1; +/** + * Calculates the squared length of a dual quat + * + * @param {ReadonlyQuat2} a dual quat to calculate squared length of + * @returns {Number} squared length of a + * @function + */ - return resampled; -} +var squaredLength$1 = squaredLength$2; +/** + * Alias for {@link quat2.squaredLength} + * @function + */ -// +var sqrLen$1 = squaredLength$1; +/** + * Normalize a dual quat + * + * @param {quat2} out the receiving dual quaternion + * @param {ReadonlyQuat2} a dual quaternion to normalize + * @returns {quat2} out + * @function + */ - - +function normalize$1(out, a) { + var magnitude = squaredLength$1(a); -// These bounds define the minimum and maximum supported coordinate values. -// While visible coordinates are within [0, EXTENT], tiles may theoretically -// contain coordinates within [-Infinity, Infinity]. Our range is limited by the -// number of bits used to represent the coordinate. -const BITS = 15; -const MAX = Math.pow(2, BITS - 1) - 1; -const MIN = -MAX - 1; + if (magnitude > 0) { + magnitude = Math.sqrt(magnitude); + var a0 = a[0] / magnitude; + var a1 = a[1] / magnitude; + var a2 = a[2] / magnitude; + var a3 = a[3] / magnitude; + var b0 = a[4]; + var b1 = a[5]; + var b2 = a[6]; + var b3 = a[7]; + var a_dot_b = a0 * b0 + a1 * b1 + a2 * b2 + a3 * b3; + out[0] = a0; + out[1] = a1; + out[2] = a2; + out[3] = a3; + out[4] = (b0 - a0 * a_dot_b) / magnitude; + out[5] = (b1 - a1 * a_dot_b) / magnitude; + out[6] = (b2 - a2 * a_dot_b) / magnitude; + out[7] = (b3 - a3 * a_dot_b) / magnitude; + } -function preparePoint(point , scale ) { - const x = Math.round(point.x * scale); - const y = Math.round(point.y * scale); - point.x = clamp(x, MIN, MAX); - point.y = clamp(y, MIN, MAX); - if (x < point.x || x > point.x + 1 || y < point.y || y > point.y + 1) { - // warn when exceeding allowed extent except for the 1-px-off case - // https://github.com/mapbox/mapbox-gl-js/issues/8992 - warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size'); - } - return point; + return out; } - -// a subset of VectorTileGeometry - - - - - - /** - * Loads a geometry from a VectorTileFeature and scales it to the common extent - * used internally. - * @param {VectorTileFeature} feature - * @private + * Returns a string representation of a dual quatenion + * + * @param {ReadonlyQuat2} a dual quaternion to represent as a string + * @returns {String} string representation of the dual quat */ -function loadGeometry(feature , canonical , tileTransform ) { - const geometry = feature.loadGeometry(); - const extent = feature.extent; - const extentScale = EXTENT$1 / extent; - - if (canonical && tileTransform && tileTransform.projection.isReprojectedInTileSpace) { - const z2 = 1 << canonical.z; - const {scale, x, y, projection} = tileTransform; - - const reproject = (p) => { - const lng = lngFromMercatorX((canonical.x + p.x / extent) / z2); - const lat = latFromMercatorY((canonical.y + p.y / extent) / z2); - const p2 = projection.project(lng, lat); - p.x = (p2.x * scale - x) * extent; - p.y = (p2.y * scale - y) * extent; - }; - - for (let i = 0; i < geometry.length; i++) { - if (feature.type !== 1) { - geometry[i] = resample(geometry[i], reproject, 1); // resample lines and polygons - - } else { // points - const line = []; - for (const p of geometry[i]) { - // filter out point features outside tile boundaries now; it'd be harder to do later - // when the coords are reprojected and no longer axis-aligned; ideally this would happen - // or not depending on how the geometry is used, but we forego the complexity for now - if (p.x < 0 || p.x >= extent || p.y < 0 || p.y >= extent) continue; - reproject(p); - line.push(p); - } - geometry[i] = line; - } - } - } - - for (const line of geometry) { - for (const p of line) { - preparePoint(p, extentScale); - } - } - return geometry; +function str$1(a) { + return "quat2(" + a[0] + ", " + a[1] + ", " + a[2] + ", " + a[3] + ", " + a[4] + ", " + a[5] + ", " + a[6] + ", " + a[7] + ")"; } - -// - - - - - - - - - /** - * Construct a new feature based on a VectorTileFeature for expression evaluation, the geometry of which - * will be loaded based on necessity. - * @param {VectorTileFeature} feature - * @param {boolean} needGeometry - * @private + * Returns whether or not the dual quaternions have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyQuat2} a the first dual quaternion. + * @param {ReadonlyQuat2} b the second dual quaternion. + * @returns {Boolean} true if the dual quaternions are equal, false otherwise. */ -function toEvaluationFeature(feature , needGeometry ) { - return {type: feature.type, - id: feature.id, - properties:feature.properties, - geometry: needGeometry ? loadGeometry(feature) : []}; -} - -// - - - - - - - - - - - - - - - - - - -function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) { - layoutVertexArray.emplaceBack( - (x * 2) + ((extrudeX + 1) / 2), - (y * 2) + ((extrudeY + 1) / 2)); +function exactEquals$1(a, b) { + return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7]; } - /** - * Circles are represented by two triangles. + * Returns whether or not the dual quaternions have approximately the same elements in the same position. * - * Each corner has a pos that is the center of the circle and an extrusion - * vector that is where it points. - * @private + * @param {ReadonlyQuat2} a the first dual quat. + * @param {ReadonlyQuat2} b the second dual quat. + * @returns {Boolean} true if the dual quats are equal, false otherwise. */ -class CircleBucket { - - - - - - - - - - - - - - - - - - - - constructor(options ) { - this.zoom = options.zoom; - this.overscaling = options.overscaling; - this.layers = options.layers; - this.layerIds = this.layers.map(layer => layer.id); - this.index = options.index; - this.hasPattern = false; - - this.layoutVertexArray = new StructArrayLayout2i4(); - this.indexArray = new StructArrayLayout3ui6(); - this.segments = new SegmentVector(); - this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom); - this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id); - } - - populate(features , options , canonical , tileTransform ) { - const styleLayer = this.layers[0]; - const bucketFeatures = []; - let circleSortKey = null; - - // Heatmap layers are handled in this bucket and have no evaluated properties, so we check our access - if (styleLayer.type === 'circle') { - circleSortKey = ((styleLayer ) ).layout.get('circle-sort-key'); - } - - for (const {feature, id, index, sourceLayerIndex} of features) { - const needGeometry = this.layers[0]._featureFilter.needGeometry; - const evaluationFeature = toEvaluationFeature(feature, needGeometry); - - if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue; - - const sortKey = circleSortKey ? - circleSortKey.evaluate(evaluationFeature, {}, canonical) : - undefined; - - const bucketFeature = { - id, - properties: feature.properties, - type: feature.type, - sourceLayerIndex, - index, - geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform), - patterns: {}, - sortKey - }; - - bucketFeatures.push(bucketFeature); - - } - - if (circleSortKey) { - bucketFeatures.sort((a, b) => { - // a.sortKey is always a number when in use - return ((a.sortKey ) ) - ((b.sortKey ) ); - }); - } - - for (const bucketFeature of bucketFeatures) { - const {geometry, index, sourceLayerIndex} = bucketFeature; - const feature = features[index].feature; - - this.addFeature(bucketFeature, geometry, index, options.availableImages, canonical); - options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index); - } - } - - update(states , vtLayer , availableImages , imagePositions ) { - if (!this.stateDependentLayers.length) return; - this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, availableImages, imagePositions); - } - - isEmpty() { - return this.layoutVertexArray.length === 0; - } - - uploadPending() { - return !this.uploaded || this.programConfigurations.needsUpload; - } - - upload(context ) { - if (!this.uploaded) { - this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members); - this.indexBuffer = context.createIndexBuffer(this.indexArray); - } - this.programConfigurations.upload(context); - this.uploaded = true; - } - destroy() { - if (!this.layoutVertexBuffer) return; - this.layoutVertexBuffer.destroy(); - this.indexBuffer.destroy(); - this.programConfigurations.destroy(); - this.segments.destroy(); - } +function equals$2(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3], + a4 = a[4], + a5 = a[5], + a6 = a[6], + a7 = a[7]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3], + b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)); +} - addFeature(feature , geometry , index , availableImages , canonical ) { - for (const ring of geometry) { - for (const point of ring) { - const x = point.x; - const y = point.y; +var quat2 = /*#__PURE__*/Object.freeze({ +__proto__: null, +create: create$1, +clone: clone$1, +fromValues: fromValues$1, +fromRotationTranslationValues: fromRotationTranslationValues, +fromRotationTranslation: fromRotationTranslation, +fromTranslation: fromTranslation, +fromRotation: fromRotation, +fromMat4: fromMat4, +copy: copy$1, +identity: identity$1, +set: set$1, +getReal: getReal, +getDual: getDual, +setReal: setReal, +setDual: setDual, +getTranslation: getTranslation, +translate: translate, +rotateX: rotateX, +rotateY: rotateY, +rotateZ: rotateZ, +rotateByQuatAppend: rotateByQuatAppend, +rotateByQuatPrepend: rotateByQuatPrepend, +rotateAroundAxis: rotateAroundAxis, +add: add$1, +multiply: multiply$1, +mul: mul$1, +scale: scale$1, +dot: dot$2, +lerp: lerp$1, +invert: invert, +conjugate: conjugate, +length: length$1, +len: len$1, +squaredLength: squaredLength$1, +sqrLen: sqrLen$1, +normalize: normalize$1, +str: str$1, +exactEquals: exactEquals$1, +equals: equals$2 +}); - // Do not include points that are outside the tile boundaries. - if (x < 0 || x >= EXTENT$1 || y < 0 || y >= EXTENT$1) continue; +/** + * 2 Dimensional Vector + * @module vec2 + */ - // this geometry will be of the Point type, and we'll derive - // two triangles from it. - // - // ┌─────────┐ - // │ 3 2 │ - // │ │ - // │ 0 1 │ - // └─────────┘ +/** + * Creates a new, empty vec2 + * + * @returns {vec2} a new 2D vector + */ - const segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray, feature.sortKey); - const index = segment.vertexLength; +function create() { + var out = new ARRAY_TYPE(2); - addCircleVertex(this.layoutVertexArray, x, y, -1, -1); - addCircleVertex(this.layoutVertexArray, x, y, 1, -1); - addCircleVertex(this.layoutVertexArray, x, y, 1, 1); - addCircleVertex(this.layoutVertexArray, x, y, -1, 1); + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + } - this.indexArray.emplaceBack(index, index + 1, index + 2); - this.indexArray.emplaceBack(index, index + 3, index + 2); + return out; +} +/** + * Creates a new vec2 initialized with values from an existing vector + * + * @param {ReadonlyVec2} a vector to clone + * @returns {vec2} a new 2D vector + */ - segment.vertexLength += 4; - segment.primitiveLength += 2; - } - } +function clone(a) { + var out = new ARRAY_TYPE(2); + out[0] = a[0]; + out[1] = a[1]; + return out; +} +/** + * Creates a new vec2 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @returns {vec2} a new 2D vector + */ - this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, {}, availableImages, canonical); - } +function fromValues(x, y) { + var out = new ARRAY_TYPE(2); + out[0] = x; + out[1] = y; + return out; } +/** + * Copy the values from one vec2 to another + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the source vector + * @returns {vec2} out + */ -register('CircleBucket', CircleBucket, {omit: ['layers']}); +function copy(out, a) { + out[0] = a[0]; + out[1] = a[1]; + return out; +} +/** + * Set the components of a vec2 to the given values + * + * @param {vec2} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @returns {vec2} out + */ -// +function set(out, x, y) { + out[0] = x; + out[1] = y; + return out; +} +/** + * Adds two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ - - - - - +function add(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + return out; +} +/** + * Subtracts vector b from vector a + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ -function polygonIntersectsPolygon(polygonA , polygonB ) { - for (let i = 0; i < polygonA.length; i++) { - if (polygonContainsPoint(polygonB, polygonA[i])) return true; - } +function subtract(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + return out; +} +/** + * Multiplies two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ - for (let i = 0; i < polygonB.length; i++) { - if (polygonContainsPoint(polygonA, polygonB[i])) return true; - } +function multiply(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + return out; +} +/** + * Divides two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ - if (lineIntersectsLine(polygonA, polygonB)) return true; +function divide(out, a, b) { + out[0] = a[0] / b[0]; + out[1] = a[1] / b[1]; + return out; +} +/** + * Math.ceil the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to ceil + * @returns {vec2} out + */ - return false; +function ceil(out, a) { + out[0] = Math.ceil(a[0]); + out[1] = Math.ceil(a[1]); + return out; } +/** + * Math.floor the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to floor + * @returns {vec2} out + */ -function polygonIntersectsBufferedPoint(polygon , point , radius ) { - if (polygonContainsPoint(polygon, point)) return true; - if (pointIntersectsBufferedLine(point, polygon, radius)) return true; - return false; +function floor(out, a) { + out[0] = Math.floor(a[0]); + out[1] = Math.floor(a[1]); + return out; } +/** + * Returns the minimum of two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ -function polygonIntersectsMultiPolygon(polygon , multiPolygon ) { +function min(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + return out; +} +/** + * Returns the maximum of two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ - if (polygon.length === 1) { - return multiPolygonContainsPoint(multiPolygon, polygon[0]); - } +function max(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + return out; +} +/** + * Math.round the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to round + * @returns {vec2} out + */ - for (let m = 0; m < multiPolygon.length; m++) { - const ring = multiPolygon[m]; - for (let n = 0; n < ring.length; n++) { - if (polygonContainsPoint(polygon, ring[n])) return true; - } - } +function round(out, a) { + out[0] = Math.round(a[0]); + out[1] = Math.round(a[1]); + return out; +} +/** + * Scales a vec2 by a scalar number + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec2} out + */ - for (let i = 0; i < polygon.length; i++) { - if (multiPolygonContainsPoint(multiPolygon, polygon[i])) return true; - } +function scale(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + return out; +} +/** + * Adds two vec2's after scaling the second operand by a scalar value + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @param {Number} scale the amount to scale b by before adding + * @returns {vec2} out + */ - for (let k = 0; k < multiPolygon.length; k++) { - if (lineIntersectsLine(polygon, multiPolygon[k])) return true; - } +function scaleAndAdd(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + return out; +} +/** + * Calculates the euclidian distance between two vec2's + * + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {Number} distance between a and b + */ - return false; +function distance(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1]; + return Math.hypot(x, y); } +/** + * Calculates the squared euclidian distance between two vec2's + * + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {Number} squared distance between a and b + */ -function polygonIntersectsBufferedMultiLine(polygon , multiLine , radius ) { - for (let i = 0; i < multiLine.length; i++) { - const line = multiLine[i]; +function squaredDistance(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1]; + return x * x + y * y; +} +/** + * Calculates the length of a vec2 + * + * @param {ReadonlyVec2} a vector to calculate length of + * @returns {Number} length of a + */ - if (polygon.length >= 3) { - for (let k = 0; k < line.length; k++) { - if (polygonContainsPoint(polygon, line[k])) return true; - } - } +function length(a) { + var x = a[0], + y = a[1]; + return Math.hypot(x, y); +} +/** + * Calculates the squared length of a vec2 + * + * @param {ReadonlyVec2} a vector to calculate squared length of + * @returns {Number} squared length of a + */ - if (lineIntersectsBufferedLine(polygon, line, radius)) return true; - } - return false; +function squaredLength(a) { + var x = a[0], + y = a[1]; + return x * x + y * y; } +/** + * Negates the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to negate + * @returns {vec2} out + */ -function lineIntersectsBufferedLine(lineA , lineB , radius ) { +function negate(out, a) { + out[0] = -a[0]; + out[1] = -a[1]; + return out; +} +/** + * Returns the inverse of the components of a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to invert + * @returns {vec2} out + */ - if (lineA.length > 1) { - if (lineIntersectsLine(lineA, lineB)) return true; +function inverse(out, a) { + out[0] = 1.0 / a[0]; + out[1] = 1.0 / a[1]; + return out; +} +/** + * Normalize a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to normalize + * @returns {vec2} out + */ - // Check whether any point in either line is within radius of the other line - for (let j = 0; j < lineB.length; j++) { - if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) return true; - } - } +function normalize(out, a) { + var x = a[0], + y = a[1]; + var len = x * x + y * y; - for (let k = 0; k < lineA.length; k++) { - if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) return true; - } + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len); + } - return false; + out[0] = a[0] * len; + out[1] = a[1] * len; + return out; } +/** + * Calculates the dot product of two vec2's + * + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {Number} dot product of a and b + */ -function lineIntersectsLine(lineA , lineB ) { - if (lineA.length === 0 || lineB.length === 0) return false; - for (let i = 0; i < lineA.length - 1; i++) { - const a0 = lineA[i]; - const a1 = lineA[i + 1]; - for (let j = 0; j < lineB.length - 1; j++) { - const b0 = lineB[j]; - const b1 = lineB[j + 1]; - if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) return true; - } - } - return false; +function dot$1(a, b) { + return a[0] * b[0] + a[1] * b[1]; } +/** + * Computes the cross product of two vec2's + * Note that the cross product must by definition produce a 3D vector + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec3} out + */ -function lineSegmentIntersectsLineSegment(a0 , a1 , b0 , b1 ) { - return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) && - isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1); +function cross(out, a, b) { + var z = a[0] * b[1] - a[1] * b[0]; + out[0] = out[1] = 0; + out[2] = z; + return out; } +/** + * Performs a linear interpolation between two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec2} out + */ -function pointIntersectsBufferedLine(p , line , radius ) { - const radiusSquared = radius * radius; - - if (line.length === 1) return p.distSqr(line[0]) < radiusSquared; - - for (let 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". - const v = line[i - 1], w = line[i]; - if (distToSegmentSquared(p, v, w) < radiusSquared) return true; - } - return false; +function lerp(out, a, b, t) { + var ax = a[0], + ay = a[1]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + return out; } +/** + * Generates a random vector with the given scale + * + * @param {vec2} out the receiving vector + * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned + * @returns {vec2} out + */ -// Code from http://stackoverflow.com/a/1501725/331379. -function distToSegmentSquared(p , v , w ) { - const l2 = v.distSqr(w); - if (l2 === 0) return p.distSqr(v); - const 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)); +function random(out, scale) { + scale = scale || 1.0; + var r = RANDOM() * 2.0 * Math.PI; + out[0] = Math.cos(r) * scale; + out[1] = Math.sin(r) * scale; + return out; } +/** + * Transforms the vec2 with a mat2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the vector to transform + * @param {ReadonlyMat2} m matrix to transform with + * @returns {vec2} out + */ -// point in polygon ray casting algorithm -function multiPolygonContainsPoint(rings , p ) { - let c = false, - ring, p1, p2; - - for (let k = 0; k < rings.length; k++) { - ring = rings[k]; - for (let 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 transformMat2(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[2] * y; + out[1] = m[1] * x + m[3] * y; + return out; } +/** + * Transforms the vec2 with a mat2d + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the vector to transform + * @param {ReadonlyMat2d} m matrix to transform with + * @returns {vec2} out + */ -function polygonContainsPoint(ring , p ) { - let c = false; - for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) { - const p1 = ring[i]; - const 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 transformMat2d(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; } +/** + * Transforms the vec2 with a mat3 + * 3rd vector component is implicitly '1' + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the vector to transform + * @param {ReadonlyMat3} m matrix to transform with + * @returns {vec2} out + */ -function polygonIntersectsBox(ring , boxX1 , boxY1 , boxX2 , boxY2 ) { - for (const p of ring) { - if (boxX1 <= p.x && - boxY1 <= p.y && - boxX2 >= p.x && - boxY2 >= p.y) return true; - } - - const corners = [ - new pointGeometry(boxX1, boxY1), - new pointGeometry(boxX1, boxY2), - new pointGeometry(boxX2, boxY2), - new pointGeometry(boxX2, boxY1)]; +function transformMat3(out, a, m) { + var x = a[0], + y = a[1]; + out[0] = m[0] * x + m[3] * y + m[6]; + out[1] = m[1] * x + m[4] * y + m[7]; + return out; +} +/** + * Transforms the vec2 with a mat4 + * 3rd vector component is implicitly '0' + * 4th vector component is implicitly '1' + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the vector to transform + * @param {ReadonlyMat4} m matrix to transform with + * @returns {vec2} out + */ - if (ring.length > 2) { - for (const corner of corners) { - if (polygonContainsPoint(ring, corner)) return true; - } - } +function transformMat4(out, a, m) { + var x = a[0]; + var y = a[1]; + out[0] = m[0] * x + m[4] * y + m[12]; + out[1] = m[1] * x + m[5] * y + m[13]; + return out; +} +/** + * Rotate a 2D vector + * @param {vec2} out The receiving vec2 + * @param {ReadonlyVec2} a The vec2 point to rotate + * @param {ReadonlyVec2} b The origin of the rotation + * @param {Number} rad The angle of rotation in radians + * @returns {vec2} out + */ - for (let i = 0; i < ring.length - 1; i++) { - const p1 = ring[i]; - const p2 = ring[i + 1]; - if (edgeIntersectsBox(p1, p2, corners)) return true; - } +function rotate(out, a, b, rad) { + //Translate point to the origin + var p0 = a[0] - b[0], + p1 = a[1] - b[1], + sinC = Math.sin(rad), + cosC = Math.cos(rad); //perform rotation and translate to correct position - return false; + out[0] = p0 * cosC - p1 * sinC + b[0]; + out[1] = p0 * sinC + p1 * cosC + b[1]; + return out; } +/** + * Get the angle between two 2D vectors + * @param {ReadonlyVec2} a The first operand + * @param {ReadonlyVec2} b The second operand + * @returns {Number} The angle in radians + */ -function edgeIntersectsBox(e1 , e2 , corners ) { - const tl = corners[0]; - const br = corners[2]; - // the edge and box do not intersect in either the x or y dimensions - if (((e1.x < tl.x) && (e2.x < tl.x)) || - ((e1.x > br.x) && (e2.x > br.x)) || - ((e1.y < tl.y) && (e2.y < tl.y)) || - ((e1.y > br.y) && (e2.y > br.y))) return false; +function angle(a, b) { + var x1 = a[0], + y1 = a[1], + x2 = b[0], + y2 = b[1], + // mag is the product of the magnitudes of a and b + mag = Math.sqrt(x1 * x1 + y1 * y1) * Math.sqrt(x2 * x2 + y2 * y2), + // mag &&.. short circuits if mag == 0 + cosine = mag && (x1 * x2 + y1 * y2) / mag; // Math.min(Math.max(cosine, -1), 1) clamps the cosine between -1 and 1 - // check if all corners of the box are on the same side of the edge - const dir = isCounterClockwise(e1, e2, corners[0]); - return dir !== isCounterClockwise(e1, e2, corners[1]) || - dir !== isCounterClockwise(e1, e2, corners[2]) || - dir !== isCounterClockwise(e1, e2, corners[3]); + return Math.acos(Math.min(Math.max(cosine, -1), 1)); } +/** + * Set the components of a vec2 to zero + * + * @param {vec2} out the receiving vector + * @returns {vec2} out + */ -// +function zero(out) { + out[0] = 0.0; + out[1] = 0.0; + return out; +} +/** + * Returns a string representation of a vector + * + * @param {ReadonlyVec2} a vector to represent as a string + * @returns {String} string representation of the vector + */ - - - - +function str(a) { + return "vec2(" + a[0] + ", " + a[1] + ")"; +} +/** + * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===) + * + * @param {ReadonlyVec2} a The first vector. + * @param {ReadonlyVec2} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ -function getMaximumPaintValue(property , layer , bucket ) { - const value = ((layer.paint ).get(property) ).value; - if (value.kind === 'constant') { - return value.value; - } else { - return bucket.programConfigurations.get(layer.id).getMaxValue(property); - } +function exactEquals(a, b) { + return a[0] === b[0] && a[1] === b[1]; } +/** + * Returns whether or not the vectors have approximately the same elements in the same position. + * + * @param {ReadonlyVec2} a The first vector. + * @param {ReadonlyVec2} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ -function translateDistance(translate ) { - return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]); +function equals$1(a, b) { + var a0 = a[0], + a1 = a[1]; + var b0 = b[0], + b1 = b[1]; + return Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)); } +/** + * Alias for {@link vec2.length} + * @function + */ -function translate$4(queryGeometry , - translate , - translateAnchor , - bearing , - pixelsToTileUnits ) { - if (!translate[0] && !translate[1]) { - return queryGeometry; - } - const pt = pointGeometry.convert(translate)._mult(pixelsToTileUnits); +var len = length; +/** + * Alias for {@link vec2.subtract} + * @function + */ - if (translateAnchor === "viewport") { - pt._rotate(-bearing); - } +var sub = subtract; +/** + * Alias for {@link vec2.multiply} + * @function + */ - const translated = []; - for (let i = 0; i < queryGeometry.length; i++) { - const point = queryGeometry[i]; - translated.push(point.sub(pt)); - } - return translated; -} +var mul = multiply; +/** + * Alias for {@link vec2.divide} + * @function + */ -function tilespaceTranslate(translate , - translateAnchor , - bearing , - pixelsToTileUnits ) { - const pt = pointGeometry.convert(translate)._mult(pixelsToTileUnits); +var div = divide; +/** + * Alias for {@link vec2.distance} + * @function + */ - if (translateAnchor === "viewport") { - pt._rotate(-bearing); - } +var dist = distance; +/** + * Alias for {@link vec2.squaredDistance} + * @function + */ - return pt; -} +var sqrDist = squaredDistance; +/** + * Alias for {@link vec2.squaredLength} + * @function + */ -// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. +var sqrLen = squaredLength; +/** + * Perform some operation over an array of vec2s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ - +var forEach = function () { + var vec = create(); + return function (a, stride, offset, count, fn, arg) { + var i, l; - + if (!stride) { + stride = 2; + } - + if (!offset) { + offset = 0; + } - - - + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } -const layout$1 = new Properties({ - "circle-sort-key": new DataDrivenProperty(spec["layout_circle"]["circle-sort-key"]), -}); + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + } - - - - - - - - - - - - - + return a; + }; +}(); -const paint = new Properties({ - "circle-radius": new DataDrivenProperty(spec["paint_circle"]["circle-radius"]), - "circle-color": new DataDrivenProperty(spec["paint_circle"]["circle-color"]), - "circle-blur": new DataDrivenProperty(spec["paint_circle"]["circle-blur"]), - "circle-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-opacity"]), - "circle-translate": new DataConstantProperty(spec["paint_circle"]["circle-translate"]), - "circle-translate-anchor": new DataConstantProperty(spec["paint_circle"]["circle-translate-anchor"]), - "circle-pitch-scale": new DataConstantProperty(spec["paint_circle"]["circle-pitch-scale"]), - "circle-pitch-alignment": new DataConstantProperty(spec["paint_circle"]["circle-pitch-alignment"]), - "circle-stroke-width": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-width"]), - "circle-stroke-color": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-color"]), - "circle-stroke-opacity": new DataDrivenProperty(spec["paint_circle"]["circle-stroke-opacity"]), +var vec2 = /*#__PURE__*/Object.freeze({ +__proto__: null, +create: create, +clone: clone, +fromValues: fromValues, +copy: copy, +set: set, +add: add, +subtract: subtract, +multiply: multiply, +divide: divide, +ceil: ceil, +floor: floor, +min: min, +max: max, +round: round, +scale: scale, +scaleAndAdd: scaleAndAdd, +distance: distance, +squaredDistance: squaredDistance, +length: length, +squaredLength: squaredLength, +negate: negate, +inverse: inverse, +normalize: normalize, +dot: dot$1, +cross: cross, +lerp: lerp, +random: random, +transformMat2: transformMat2, +transformMat2d: transformMat2d, +transformMat3: transformMat3, +transformMat4: transformMat4, +rotate: rotate, +angle: angle, +zero: zero, +str: str, +exactEquals: exactEquals, +equals: equals$1, +len: len, +sub: sub, +mul: mul, +div: div, +dist: dist, +sqrDist: sqrDist, +sqrLen: sqrLen, +forEach: forEach }); -// Note: without adding the explicit type annotation, Flow infers weaker types -// for these objects from their use in the constructor to StyleLayer, as -// {layout?: Properties<...>, paint: Properties<...>} -var properties = ({ paint, layout: layout$1 } - - ); - // + + class Ray { @@ -24342,7 +25384,7 @@ class Ray { } intersectsPlane(pt , normal , out ) { - const D = dot(normal, this.dir); + const D = dot$5(normal, this.dir); // ray is parallel to plane, so it misses if (Math.abs(D) < 1e-6) { return false; } @@ -24360,7 +25402,7 @@ class Ray { } closestPointOnSphere(center , r , out ) { - assert_1(squaredLength(this.dir) > 0.0 && r >= 0.0); + assert_1(squaredLength$4(this.dir) > 0.0 && r >= 0.0); if (equals$5(this.pos, center) || r === 0.0) { out[0] = out[1] = out[2] = 0; @@ -24412,6 +25454,36 @@ class Ray { } } +class FrustumCorners { + + + + + + + constructor(TL_ , TR_ , BR_ , BL_ , horizon_ ) { + this.TL = TL_; + this.TR = TR_; + this.BR = BR_; + this.BL = BL_; + this.horizon = horizon_; + } + + static fromInvProjectionMatrix(invProj , horizonFromTop , viewportHeight ) { + const TLClip = [-1, 1, 1]; + const TRClip = [1, 1, 1]; + const BRClip = [1, -1, 1]; + const BLClip = [-1, -1, 1]; + + const TL = transformMat4$2(TLClip, TLClip, invProj); + const TR = transformMat4$2(TRClip, TRClip, invProj); + const BR = transformMat4$2(BRClip, BRClip, invProj); + const BL = transformMat4$2(BLClip, BLClip, invProj); + + return new FrustumCorners(TL, TR, BR, BL, horizonFromTop / viewportHeight); + } +} + class Frustum { @@ -24441,7 +25513,7 @@ class Frustum { const s = transformMat4$1([], v, invProj); const k = 1.0 / s[3] / worldSize * scale; // Z scale in meters. - return mul$5(s, s, [k, k, zInMeters ? 1.0 / s[3] : k, k]); + return mul$3(s, s, [k, k, zInMeters ? 1.0 / s[3] : k, k]); }); const frustumPlanePointIndices = [ @@ -24454,10 +25526,10 @@ class Frustum { ]; const frustumPlanes = frustumPlanePointIndices.map((p ) => { - const a = sub$4([], frustumCoords[p[0]], frustumCoords[p[1]]); - const b = sub$4([], frustumCoords[p[2]], frustumCoords[p[1]]); - const n = normalize([], cross([], a, b)); - const d = -dot(n, frustumCoords[p[1]]); + const a = sub$2([], frustumCoords[p[0]], frustumCoords[p[1]]); + const b = sub$2([], frustumCoords[p[2]], frustumCoords[p[1]]); + const n = normalize$4([], cross$2([], a, b)); + const d = -dot$5(n, frustumCoords[p[1]]); return n.concat(d); }); @@ -24504,7 +25576,7 @@ class Aabb { return pointOnAabb - point[2]; } - getCorners() { + getCorners() { const mn = this.min; const mx = this.max; return [ @@ -24533,7 +25605,7 @@ class Aabb { let pointsInside = 0; for (let i = 0; i < aabbPoints.length; i++) { - pointsInside += dot(plane, aabbPoints[i]) + plane[3] >= 0; + pointsInside += dot$5(plane, aabbPoints[i]) + plane[3] >= 0; } if (pointsInside === 0) @@ -24584,10 +25656,10 @@ class CircleStyleLayer extends StyleLayer { constructor(layer ) { - super(layer, properties); + super(layer, properties$9); } - createBucket(parameters ) { + createBucket(parameters ) { return new CircleBucket(parameters); } @@ -24620,7 +25692,7 @@ class CircleStyleLayer extends StyleLayer { this.paint.get('circle-pitch-scale') === 'map', translation, size); } - getProgramIds() { + getProgramIds() { return ['circle']; } @@ -24646,6 +25718,9 @@ function queryIntersectsCircle(queryGeometry , // // A circle with fixed scaling relative to the map gets smaller in viewport space as it moves into the distance if (alignWithMap) size *= queryGeometry.pixelToTileUnitsFactor; + const tileId = queryGeometry.tileID.canonical; + const elevationScale = transform.projection.upVectorScale(tileId, transform.center.lat, transform.worldSize).metersToTile; + for (const ring of geometry) { for (const point of ring) { const translatedPoint = point.add(translation); @@ -24653,18 +25728,36 @@ function queryIntersectsCircle(queryGeometry , transform.elevation.exaggeration() * elevationHelper.getElevationAt(translatedPoint.x, translatedPoint.y, true) : 0; - const transformedPoint = alignWithMap ? translatedPoint : projectPoint(translatedPoint, z, pixelPosMatrix); + // Reproject tile coordinate to the local coordinate space used by the projection + const reproj = transform.projection.projectTilePoint(translatedPoint.x, translatedPoint.y, tileId); + + if (z > 0) { + const dir = transform.projection.upVector(tileId, translatedPoint.x, translatedPoint.y); + reproj.x += dir[0] * elevationScale * z; + reproj.y += dir[1] * elevationScale * z; + reproj.z += dir[2] * elevationScale * z; + } + + const transformedPoint = alignWithMap ? translatedPoint : projectPoint(reproj.x, reproj.y, reproj.z, pixelPosMatrix); const transformedPolygon = alignWithMap ? queryGeometry.tilespaceRays.map((r) => intersectAtHeight(r, z)) : queryGeometry.queryGeometry.screenGeometry; - const projectedCenter = transformMat4$1([], [point.x, point.y, z, 1], pixelPosMatrix); + const projectedCenter = transformMat4$1([], [reproj.x, reproj.y, reproj.z, 1], pixelPosMatrix); if (!scaleWithMap && alignWithMap) { size *= projectedCenter[3] / transform.cameraToCenterDistance; } else if (scaleWithMap && !alignWithMap) { size *= transform.cameraToCenterDistance / projectedCenter[3]; } + if (alignWithMap) { + // Apply extra scaling to cover different pixelPerMeter ratios at different latitudes + const lat = latFromMercatorY((point.y / EXTENT + tileId.y) / (1 << tileId.z)); + const scale = transform.projection.pixelsPerMeter(lat, 1) / mercatorZfromAltitude(1, lat); + + size /= scale; + } + if (polygonIntersectsBufferedPoint(transformedPolygon, transformedPoint, size)) return true; } } @@ -24672,8 +25765,8 @@ function queryIntersectsCircle(queryGeometry , return false; } -function projectPoint(p , z , pixelPosMatrix ) { - const point = transformMat4$1([], [p.x, p.y, z, 1], pixelPosMatrix); +function projectPoint(x , y , z , pixelPosMatrix ) { + const point = transformMat4$1([], [x, y, z, 1], pixelPosMatrix); return new pointGeometry(point[0] / point[3], point[1] / point[3]); } @@ -24699,7 +25792,7 @@ class HeatmapBucket extends CircleBucket { } -register('HeatmapBucket', HeatmapBucket, {omit: ['layers']}); +register(HeatmapBucket, 'HeatmapBucket', {omit: ['layers']}); // @@ -24708,12 +25801,19 @@ register('HeatmapBucket', HeatmapBucket, {omit: ['layers']}); + + + + + + + -function createImage(image , {width, height} , channels , data ) { +function createImage (image , {width, height} , channels , data ) { if (!data) { data = new Uint8Array(width * height * channels); } else if (data instanceof Uint8ClampedArray) { @@ -24727,13 +25827,12 @@ function createImage(image , {width, height} , channels , data return image; } -function resizeImage(image , {width, height} , channels ) { +function resizeImage (image , newImage , channels ) { + const {width, height} = newImage; if (width === image.width && height === image.height) { return; } - const newImage = createImage({}, {width, 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) @@ -24744,7 +25843,7 @@ function resizeImage(image , {width, height} , channels ) { image.data = newImage.data; } -function copyImage(srcImg , dstImg , srcPt , dstPt , size , channels ) { +function copyImage (srcImg , dstImg , srcPt , dstPt , size , channels ) { if (size.width === 0 || size.height === 0) { return dstImg; } @@ -24788,10 +25887,10 @@ class AlphaImage { } resize(size ) { - resizeImage(this, size, 1); + resizeImage(this, new AlphaImage(size), 1); } - clone() { + clone() { return new AlphaImage({width: this.width, height: this.height}, new Uint8Array(this.data)); } @@ -24815,7 +25914,7 @@ class RGBAImage { } resize(size ) { - resizeImage(this, size, 4); + resizeImage(this, new RGBAImage(size), 4); } replace(data , copy ) { @@ -24828,7 +25927,7 @@ class RGBAImage { } } - clone() { + clone() { return new RGBAImage({width: this.width, height: this.height}, new Uint8Array(this.data)); } @@ -24837,8 +25936,8 @@ class RGBAImage { } } -register('AlphaImage', AlphaImage); -register('RGBAImage', RGBAImage); +register(AlphaImage, 'AlphaImage'); +register(RGBAImage, 'RGBAImage'); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. @@ -24857,7 +25956,7 @@ register('RGBAImage', RGBAImage); -const paint$1 = new Properties({ +const paint$8 = new Properties({ "heatmap-radius": new DataDrivenProperty(spec["paint_heatmap"]["heatmap-radius"]), "heatmap-weight": new DataDrivenProperty(spec["paint_heatmap"]["heatmap-weight"]), "heatmap-intensity": new DataConstantProperty(spec["paint_heatmap"]["heatmap-intensity"]), @@ -24868,7 +25967,7 @@ const paint$1 = new Properties({ // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} -var properties$1 = ({ paint: paint$1 } +var properties$8 = ({ paint: paint$8 } ); @@ -24947,12 +26046,12 @@ class HeatmapStyleLayer extends StyleLayer { - createBucket(parameters ) { + createBucket(parameters ) { return new HeatmapBucket(parameters); } constructor(layer ) { - super(layer, properties$1); + super(layer, properties$8); // make sure color ramp texture is generated for default heatmap color too this._updateColorRamp(); @@ -25000,11 +26099,11 @@ class HeatmapStyleLayer extends StyleLayer { true, true, new pointGeometry(0, 0), size); } - hasOffscreenPass() { + hasOffscreenPass() { return this.paint.get('heatmap-opacity') !== 0 && this.visibility !== 'none'; } - getProgramIds() { + getProgramIds() { return ['heatmap', 'heatmapTexture']; } @@ -25031,7 +26130,7 @@ class HeatmapStyleLayer extends StyleLayer { -const paint$2 = new Properties({ +const paint$7 = new Properties({ "hillshade-illumination-direction": new DataConstantProperty(spec["paint_hillshade"]["hillshade-illumination-direction"]), "hillshade-illumination-anchor": new DataConstantProperty(spec["paint_hillshade"]["hillshade-illumination-anchor"]), "hillshade-exaggeration": new DataConstantProperty(spec["paint_hillshade"]["hillshade-exaggeration"]), @@ -25043,40 +26142,41 @@ const paint$2 = new Properties({ // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} -var properties$2 = ({ paint: paint$2 } +var properties$7 = ({ paint: paint$7 } ); // + + + class HillshadeStyleLayer extends StyleLayer { constructor(layer ) { - super(layer, properties$2); + super(layer, properties$7); } - hasOffscreenPass() { + hasOffscreenPass() { return this.paint.get('hillshade-exaggeration') !== 0 && this.visibility !== 'none'; } - getProgramIds() { + getProgramIds() { return ['hillshade', 'hillshadePrepare']; } - - getProgramConfiguration(zoom ) { - return new ProgramConfiguration(this, zoom); - } } // -const layout$2 = createLayout([ + + +const layout$4 = createLayout([ {name: 'a_pos', components: 2, type: 'Int16'} ], 4); -const {members: members$1, size: size$1, alignment: alignment$1} = layout$2; +const {members: members$4, size: size$4, alignment: alignment$4} = layout$4; 'use strict'; @@ -25126,13 +26226,13 @@ function earcut(data, holeIndices, dim) { function linkedList(data, start, end, dim, clockwise) { var i, last; - if (clockwise === (signedArea(data, start, end, dim) > 0)) { + if (clockwise === (signedArea$1(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$a(last, last.next)) { + if (last && equals(last, last.next)) { removeNode(last); last = last.next; } @@ -25150,7 +26250,7 @@ function filterPoints(start, end) { do { again = false; - if (!p.steiner && (equals$a(p, p.next) || area(p.prev, p, p.next) === 0)) { + 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; @@ -25296,7 +26396,7 @@ function cureLocalIntersections(start, triangles, dim) { var a = p.prev, b = p.next.next; - if (!equals$a(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { + 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); @@ -25562,7 +26662,7 @@ function isValidDiagonal(a, b) { return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors - equals$a(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case + equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case } // signed area of a triangle @@ -25571,7 +26671,7 @@ function area(p, q, r) { } // check if two points are equal -function equals$a(p1, p2) { +function equals(p1, p2) { return p1.x === p2.x && p1.y === p2.y; } @@ -25713,12 +26813,12 @@ 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)); + var polygonArea = Math.abs(signedArea$1(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)); + polygonArea -= Math.abs(signedArea$1(data, start, end, dim)); } } @@ -25736,7 +26836,7 @@ earcut.deviation = function (data, holeIndices, dim, triangles) { Math.abs((trianglesArea - polygonArea) / polygonArea); }; -function signedArea(data, start, end, dim) { +function signedArea$1(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]); @@ -25765,7 +26865,7 @@ earcut.flatten = function (data) { earcut_1.default = _default; function quickselect(arr, k, left, right, compare) { - quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare); + quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare$1); } function quickselectStep(arr, k, left, right, compare) { @@ -25786,21 +26886,21 @@ function quickselectStep(arr, k, left, right, compare) { var i = left; var j = right; - swap$1(arr, left, k); - if (compare(arr[right], t) > 0) swap$1(arr, left, right); + swap(arr, left, k); + if (compare(arr[right], t) > 0) swap(arr, left, right); while (i < j) { - swap$1(arr, 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$1(arr, left, j); + if (compare(arr[left], t) === 0) swap(arr, left, j); else { j++; - swap$1(arr, j, right); + swap(arr, j, right); } if (j <= k) left = j + 1; @@ -25808,13 +26908,13 @@ function quickselectStep(arr, k, left, right, compare) { } } -function swap$1(arr, i, j) { +function swap(arr, i, j) { var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } -function defaultCompare(a, b) { +function defaultCompare$1(a, b) { return a < b ? -1 : a > b ? 1 : 0; } @@ -25823,7 +26923,7 @@ function defaultCompare(a, b) { // classifies an array of rings into polygons with outer rings and holes -function classifyRings(rings , maxRings ) { +function classifyRings$1(rings , maxRings ) { const len = rings.length; if (len <= 1) return [rings]; @@ -25882,7 +26982,7 @@ function compareAreas(a, b) { -function hasPattern(type , layers , options ) { +function hasPattern(type , layers , options ) { const patterns = options.patternDependencies; let hasPattern = false; @@ -25903,7 +27003,7 @@ function hasPattern(type , layers , options return hasPattern; } -function addPatternDependencies(type , layers , patternFeature , zoom , options ) { +function addPatternDependencies(type , layers , patternFeature , zoom , options ) { const patterns = options.patternDependencies; for (const layer of layers) { const patternProperty = layer.paint.get(`${type}-pattern`); @@ -25929,7 +27029,7 @@ function addPatternDependencies(type , layers , patter } // -const EARCUT_MAX_RINGS = 500; +const EARCUT_MAX_RINGS$1 = 500; @@ -25945,7 +27045,8 @@ const EARCUT_MAX_RINGS = 500; - + + class FillBucket { @@ -25972,6 +27073,7 @@ class FillBucket { + constructor(options ) { this.zoom = options.zoom; @@ -25989,6 +27091,7 @@ class FillBucket { this.segments = new SegmentVector(); this.segments2 = new SegmentVector(); this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id); + this.projection = options.projection; } populate(features , options , canonical , tileTransform ) { @@ -26044,18 +27147,18 @@ class FillBucket { } } - update(states , vtLayer , availableImages , imagePositions ) { + update(states , vtLayer , availableImages , imagePositions ) { if (!this.stateDependentLayers.length) return; this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, availableImages, imagePositions); } - addFeatures(options , canonical , imagePositions , availableImages ) { + addFeatures(options , canonical , imagePositions , availableImages , _ ) { for (const feature of this.patternFeatures) { this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions, availableImages); } } - isEmpty() { + isEmpty() { return this.layoutVertexArray.length === 0; } @@ -26064,7 +27167,7 @@ class FillBucket { } upload(context ) { if (!this.uploaded) { - this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$1); + this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$4); this.indexBuffer = context.createIndexBuffer(this.indexArray); this.indexBuffer2 = context.createIndexBuffer(this.indexArray2); } @@ -26082,8 +27185,8 @@ class FillBucket { this.segments2.destroy(); } - addFeature(feature , geometry , index , canonical , imagePositions , availableImages = []) { - for (const polygon of classifyRings(geometry, EARCUT_MAX_RINGS)) { + addFeature(feature , geometry , index , canonical , imagePositions , availableImages = []) { + for (const polygon of classifyRings$1(geometry, EARCUT_MAX_RINGS$1)) { let numVertices = 0; for (const ring of polygon) { numVertices += ring.length; @@ -26140,7 +27243,7 @@ class FillBucket { } } -register('FillBucket', FillBucket, {omit: ['layers', 'patternFeatures']}); +register(FillBucket, 'FillBucket', {omit: ['layers', 'patternFeatures']}); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. @@ -26168,7 +27271,7 @@ const layout$3 = new Properties({ -const paint$3 = new Properties({ +const paint$6 = new Properties({ "fill-antialias": new DataConstantProperty(spec["paint_fill"]["fill-antialias"]), "fill-opacity": new DataDrivenProperty(spec["paint_fill"]["fill-opacity"]), "fill-color": new DataDrivenProperty(spec["paint_fill"]["fill-color"]), @@ -26181,7 +27284,7 @@ const paint$3 = new Properties({ // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} -var properties$3 = ({ paint: paint$3, layout: layout$3 } +var properties$6 = ({ paint: paint$6, layout: layout$3 } ); @@ -26205,7 +27308,7 @@ class FillStyleLayer extends StyleLayer { constructor(layer ) { - super(layer, properties$3); + super(layer, properties$6); } getProgramIds() { @@ -26234,7 +27337,7 @@ class FillStyleLayer extends StyleLayer { } } - createBucket(parameters ) { + createBucket(parameters ) { return new FillBucket(parameters); } @@ -26257,30 +27360,37 @@ class FillStyleLayer extends StyleLayer { return polygonIntersectsMultiPolygon(translatedPolygon, geometry); } - isTileClipped() { + isTileClipped() { return true; } } // -const fillExtrusionAttributes = createLayout([ + + +const fillExtrusionAttributes = createLayout([ {name: 'a_pos_normal_ed', components: 4, type: 'Int16'} ]); -const centroidAttributes = createLayout([ +const centroidAttributes = createLayout([ {name: 'a_centroid_pos', components: 2, type: 'Uint16'} ]); -const {members: members$2, size: size$2, alignment: alignment$2} = fillExtrusionAttributes; +const fillExtrusionAttributesExt = createLayout([ + {name: 'a_pos_3', components: 3, type: 'Int16'}, + {name: 'a_pos_normal_3', components: 3, type: 'Int16'} +]); + +const {members: members$3, size: size$3, alignment: alignment$3} = fillExtrusionAttributes; 'use strict'; -var vectortilefeature = VectorTileFeature; +var vectortilefeature = VectorTileFeature$1; -function VectorTileFeature(pbf, end, extent, keys, values) { +function VectorTileFeature$1(pbf, end, extent, keys, values) { // Public this.properties = {}; this.extent = extent; @@ -26312,9 +27422,9 @@ function readTag(pbf, feature) { } } -VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon']; +VectorTileFeature$1.types = ['Unknown', 'Point', 'LineString', 'Polygon']; -VectorTileFeature.prototype.loadGeometry = function() { +VectorTileFeature$1.prototype.loadGeometry = function() { var pbf = this._pbf; pbf.pos = this._geometry; @@ -26363,7 +27473,7 @@ VectorTileFeature.prototype.loadGeometry = function() { return lines; }; -VectorTileFeature.prototype.bbox = function() { +VectorTileFeature$1.prototype.bbox = function() { var pbf = this._pbf; pbf.pos = this._geometry; @@ -26402,12 +27512,12 @@ VectorTileFeature.prototype.bbox = function() { return [x1, y1, x2, y2]; }; -VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { +VectorTileFeature$1.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], + type = VectorTileFeature$1.types[this.type], i, j; function project(line) { @@ -26437,7 +27547,7 @@ VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { break; case 3: - coords = classifyRings$1(coords); + coords = classifyRings(coords); for (i = 0; i < coords.length; i++) { for (j = 0; j < coords[i].length; j++) { project(coords[i][j]); @@ -26470,7 +27580,7 @@ VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { // classifies an array of rings into polygons with outer rings and holes -function classifyRings$1(rings) { +function classifyRings(rings) { var len = rings.length; if (len <= 1) return [rings]; @@ -26480,7 +27590,7 @@ function classifyRings$1(rings) { ccw; for (var i = 0; i < len; i++) { - var area = signedArea$1(rings[i]); + var area = signedArea(rings[i]); if (area === 0) continue; if (ccw === undefined) ccw = area < 0; @@ -26498,7 +27608,7 @@ function classifyRings$1(rings) { return polygons; } -function signedArea$1(ring) { +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]; @@ -26512,9 +27622,9 @@ function signedArea$1(ring) { -var vectortilelayer = VectorTileLayer; +var vectortilelayer = VectorTileLayer$1; -function VectorTileLayer(pbf, end) { +function VectorTileLayer$1(pbf, end) { // Public this.version = 1; this.name = null; @@ -26561,7 +27671,7 @@ function readValueMessage(pbf) { } // return feature `i` from this layer as a `VectorTileFeature` -VectorTileLayer.prototype.feature = function(i) { +VectorTileLayer$1.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]; @@ -26574,9 +27684,9 @@ VectorTileLayer.prototype.feature = function(i) { -var vectortile = VectorTile; +var vectortile = VectorTile$1; -function VectorTile(pbf, end) { +function VectorTile$1(pbf, end) { this.layers = pbf.readFields(readTile, {}, end); } @@ -26587,36 +27697,188 @@ function readTile(tag, layers, pbf) { } } -var VectorTile$1 = vectortile; -var VectorTileFeature$1 = vectortilefeature; -var VectorTileLayer$1 = vectortilelayer; +var VectorTile = vectortile; +var VectorTileFeature = vectortilefeature; +var VectorTileLayer = vectortilelayer; var vectorTile = { - VectorTile: VectorTile$1, - VectorTileFeature: VectorTileFeature$1, - VectorTileLayer: VectorTileLayer$1 + VectorTile: VectorTile, + VectorTileFeature: VectorTileFeature, + VectorTileLayer: VectorTileLayer }; // -const vectorTileFeatureTypes = vectorTile.VectorTileFeature.types; -const EARCUT_MAX_RINGS$1 = 500; - - - - - - - - + + + + - - - - - - - +function clipPolygon(polygons , clipAxis1 , clipAxis2 , axis ) { + const intersectX = (ring, ax, ay, bx, by, x) => { + ring.push(new pointGeometry(x, ay + (by - ay) * ((x - ax) / (bx - ax)))); + }; + const intersectY = (ring, ax, ay, bx, by, y) => { + ring.push(new pointGeometry(ax + (bx - ax) * ((y - ay) / (by - ay)), y)); + }; + + const polygonsClipped = []; + const intersect = axis === 0 ? intersectX : intersectY; + for (const polygon of polygons) { + const polygonClipped = []; + for (const ring of polygon) { + if (ring.length <= 2) { + continue; + } + + const clipped = []; + for (let i = 0; i < ring.length - 1; i++) { + const ax = ring[i].x; + const ay = ring[i].y; + const bx = ring[i + 1].x; + const by = ring[i + 1].y; + const a = axis === 0 ? ax : ay; + const b = axis === 0 ? bx : by; + if (a < clipAxis1) { + if (b > clipAxis1) { + intersect(clipped, ax, ay, bx, by, clipAxis1); + } + } else if (a > clipAxis2) { + if (b < clipAxis2) { + intersect(clipped, ax, ay, bx, by, clipAxis2); + } + } else { + clipped.push(ring[i]); + } + if (b < clipAxis1 && a >= clipAxis1) { + intersect(clipped, ax, ay, bx, by, clipAxis1); + } + if (b > clipAxis2 && a <= clipAxis2) { + intersect(clipped, ax, ay, bx, by, clipAxis2); + } + } + + let last = ring[ring.length - 1]; + const a = axis === 0 ? last.x : last.y; + if (a >= clipAxis1 && a <= clipAxis2) { + clipped.push(last); + } + if (clipped.length) { + last = clipped[clipped.length - 1]; + if (clipped[0].x !== last.x || clipped[0].y !== last.y) { + clipped.push(clipped[0]); + } + polygonClipped.push(clipped); + } + } + if (polygonClipped.length) { + polygonsClipped.push(polygonClipped); + } + } + + return polygonsClipped; +} + +function subdividePolygons(polygons , bounds , gridSizeX , gridSizeY , padding = 0.0, splitFn ) { + const outPolygons = []; + + if (!polygons.length || !gridSizeX || !gridSizeY) { + return outPolygons; + } + + const addResult = (clipped, bounds) => { + for (const polygon of clipped) { + outPolygons.push({polygon, bounds}); + } + }; + + const hSplits = Math.ceil(Math.log2(gridSizeX)); + const vSplits = Math.ceil(Math.log2(gridSizeY)); + + const initialSplits = hSplits - vSplits; + + const splits = []; + for (let i = 0; i < Math.abs(initialSplits); i++) { + splits.push(initialSplits > 0 ? 0 : 1); + } + + for (let i = 0; i < Math.min(hSplits, vSplits); i++) { + splits.push(0); // x + splits.push(1); // y + } + + let split = polygons; + + split = clipPolygon(split, bounds[0].y - padding, bounds[1].y + padding, 1); + split = clipPolygon(split, bounds[0].x - padding, bounds[1].x + padding, 0); + + if (!split.length) { + return outPolygons; + } + + const stack = []; + if (splits.length) { + stack.push({polygons: split, bounds, depth: 0}); + } else { + addResult(split, bounds); + } + + while (stack.length) { + const frame = stack.pop(); + + assert_1(frame.polygons.length > 0); + + const depth = frame.depth; + const axis = splits[depth]; + + const bboxMin = frame.bounds[0]; + const bboxMax = frame.bounds[1]; + + const splitMin = axis === 0 ? bboxMin.x : bboxMin.y; + const splitMax = axis === 0 ? bboxMax.x : bboxMax.y; + + const splitMid = splitFn ? splitFn(axis, splitMin, splitMax) : 0.5 * (splitMin + splitMax); + + const lclip = clipPolygon(frame.polygons, splitMin - padding, splitMid + padding, axis); + const rclip = clipPolygon(frame.polygons, splitMid - padding, splitMax + padding, axis); + + if (lclip.length) { + const bbMaxX = axis === 0 ? splitMid : bboxMax.x; + const bbMaxY = axis === 1 ? splitMid : bboxMax.y; + + const bbMax = new pointGeometry(bbMaxX, bbMaxY); + + const lclipBounds = [bboxMin, bbMax]; + + if (splits.length > depth + 1) { + stack.push({polygons: lclip, bounds: lclipBounds, depth: depth + 1}); + } else { + addResult(lclip, lclipBounds); + } + } + + if (rclip.length) { + const bbMinX = axis === 0 ? splitMid : bboxMin.x; + const bbMinY = axis === 1 ? splitMid : bboxMin.y; + + const bbMin = new pointGeometry(bbMinX, bbMinY); + + const rclipBounds = [bbMin, bboxMax]; + + if (splits.length > depth + 1) { + stack.push({polygons: rclip, bounds: rclipBounds, depth: depth + 1}); + } else { + addResult(rclip, rclipBounds); + } + } + } + + return outPolygons; +} + +// +const vectorTileFeatureTypes$2 = vectorTile.VectorTileFeature.types; +const EARCUT_MAX_RINGS = 500; const FACTOR = Math.pow(2, 13); @@ -26627,7 +27889,7 @@ const FACTOR = Math.pow(2, 13); const ELEVATION_SCALE = 7.0; const ELEVATION_OFFSET = 450; -function addVertex(vertexArray, x, y, nxRatio, nySign, normalUp, top, e) { +function addVertex$1(vertexArray, x, y, nxRatio, nySign, normalUp, top, e) { vertexArray.emplaceBack( // a_pos_normal_ed: // Encode top and side/up normal using the least significant bits @@ -26640,6 +27902,13 @@ function addVertex(vertexArray, x, y, nxRatio, nySign, normalUp, top, e) { ); } +function addGlobeExtVertex(vertexArray , pos , normal ) { + const encode = 1 << 14; + vertexArray.emplaceBack( + pos.x, pos.y, pos.z, + normal[0] * encode, normal[1] * encode, normal[2] * encode); +} + class PartMetadata { @@ -26666,43 +27935,34 @@ class PartMetadata { this.currentPolyCount.edges++; this.acc._add(p); - let checkBorders = !!this.borders; - const min = this.min, max = this.max; if (p.x < min.x) { min.x = p.x; - checkBorders = true; } else if (p.x > max.x) { max.x = p.x; - checkBorders = true; } if (p.y < min.y) { min.y = p.y; - checkBorders = true; } else if (p.y > max.y) { max.y = p.y; - checkBorders = true; } - if (((p.x === 0 || p.x === EXTENT$1) && p.x === prev.x) !== ((p.y === 0 || p.y === EXTENT$1) && p.y === prev.y)) { + if (((p.x === 0 || p.x === EXTENT) && p.x === prev.x) !== ((p.y === 0 || p.y === EXTENT) && p.y === prev.y)) { // Custom defined geojson buildings are cut on borders. Points are // repeated when edge cuts tile corner (reason for using xor). this.processBorderOverlap(p, prev); } - if (checkBorders) this.checkBorderIntersection(p, prev); - } - - checkBorderIntersection(p , prev ) { + // check border intersection if ((prev.x < 0) !== (p.x < 0)) { this.addBorderIntersection(0, number(prev.y, p.y, (0 - prev.x) / (p.x - prev.x))); } - if ((prev.x > EXTENT$1) !== (p.x > EXTENT$1)) { - this.addBorderIntersection(1, number(prev.y, p.y, (EXTENT$1 - prev.x) / (p.x - prev.x))); + if ((prev.x > EXTENT) !== (p.x > EXTENT)) { + this.addBorderIntersection(1, number(prev.y, p.y, (EXTENT - prev.x) / (p.x - prev.x))); } if ((prev.y < 0) !== (p.y < 0)) { this.addBorderIntersection(2, number(prev.x, p.x, (0 - prev.y) / (p.y - prev.y))); } - if ((prev.y > EXTENT$1) !== (p.y > EXTENT$1)) { - this.addBorderIntersection(3, number(prev.x, p.x, (EXTENT$1 - prev.y) / (p.y - prev.y))); + if ((prev.y > EXTENT) !== (p.y > EXTENT)) { + this.addBorderIntersection(3, number(prev.x, p.x, (EXTENT - prev.y) / (p.y - prev.y))); } } @@ -26751,6 +28011,7 @@ class PartMetadata { class FillExtrusionBucket { + @@ -26764,6 +28025,9 @@ class FillExtrusionBucket { + + + @@ -26774,19 +28038,22 @@ class FillExtrusionBucket { - // borders / borderDone: 0 - left, 1, right, 2 - top, 3 - bottom + // borders / borderDoneWithNeighborZ: 0 - left, 1, right, 2 - top, 3 - bottom // For each side, indices into featuresOnBorder array. - + // cache conversion. + constructor(options ) { this.zoom = options.zoom; + this.canonical = options.canonical; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(layer => layer.id); this.index = options.index; this.hasPattern = false; + this.projection = options.projection; this.layoutVertexArray = new StructArrayLayout4i8(); this.centroidVertexArray = new FillExtrusionCentroidArray(); @@ -26802,7 +28069,7 @@ class FillExtrusionBucket { this.hasPattern = hasPattern('fill-extrusion', this.layers, options); this.featuresOnBorder = []; this.borders = [[], [], [], []]; - this.borderDone = [false, false, false, false]; + this.borderDoneWithNeighborZ = [-1, -1, -1, -1]; this.tileToMeter = tileToMeter(canonical); for (const {feature, id, index, sourceLayerIndex} of features) { @@ -26825,7 +28092,7 @@ class FillExtrusionBucket { if (this.hasPattern) { this.features.push(addPatternDependencies('fill-extrusion', this.layers, bucketFeature, this.zoom, options)); } else { - this.addFeature(bucketFeature, bucketFeature.geometry, index, canonical, {}, options.availableImages); + this.addFeature(bucketFeature, bucketFeature.geometry, index, canonical, {}, options.availableImages, tileTransform); } options.featureIndex.insert(feature, bucketFeature.geometry, index, sourceLayerIndex, this.index, vertexArrayOffset); @@ -26833,31 +28100,35 @@ class FillExtrusionBucket { this.sortBorders(); } - addFeatures(options , canonical , imagePositions , availableImages ) { + addFeatures(options , canonical , imagePositions , availableImages , tileTransform ) { for (const feature of this.features) { const {geometry} = feature; - this.addFeature(feature, geometry, feature.index, canonical, imagePositions, availableImages); + this.addFeature(feature, geometry, feature.index, canonical, imagePositions, availableImages, tileTransform); } this.sortBorders(); } - update(states , vtLayer , availableImages , imagePositions ) { + update(states , vtLayer , availableImages , imagePositions ) { if (!this.stateDependentLayers.length) return; this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, availableImages, imagePositions); } - isEmpty() { + isEmpty() { return this.layoutVertexArray.length === 0; } - uploadPending() { + uploadPending() { return !this.uploaded || this.programConfigurations.needsUpload; } upload(context ) { if (!this.uploaded) { - this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$2); + this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$3); this.indexBuffer = context.createIndexBuffer(this.indexArray); + + if (this.layoutVertexExtArray) { + this.layoutVertexExtBuffer = context.createVertexBuffer(this.layoutVertexExtArray, fillExtrusionAttributesExt.members, true); + } } this.programConfigurations.upload(context); this.uploaded = true; @@ -26876,22 +28147,59 @@ class FillExtrusionBucket { destroy() { if (!this.layoutVertexBuffer) return; this.layoutVertexBuffer.destroy(); - if (this.centroidVertexBuffer) this.centroidVertexBuffer.destroy(); + if (this.centroidVertexBuffer) { + this.centroidVertexBuffer.destroy(); + } + if (this.layoutVertexExtBuffer) { + this.layoutVertexExtBuffer.destroy(); + } this.indexBuffer.destroy(); this.programConfigurations.destroy(); this.segments.destroy(); } - addFeature(feature , geometry , index , canonical , imagePositions , availableImages ) { - const metadata = this.enableTerrain ? new PartMetadata() : null; + addFeature(feature , geometry , index , canonical , imagePositions , availableImages , tileTransform ) { + const tileBounds = [new pointGeometry(0, 0), new pointGeometry(EXTENT, EXTENT)]; + const projection = tileTransform.projection; + const isGlobe = projection.name === 'globe'; + const metadata = this.enableTerrain && !isGlobe ? new PartMetadata() : null; - for (const polygon of classifyRings(geometry, EARCUT_MAX_RINGS$1)) { - let numVertices = 0; - let segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); + if (isGlobe && !this.layoutVertexExtArray) { + this.layoutVertexExtArray = new FillExtrusionExtArray(); + } + const polygons = classifyRings$1(geometry, EARCUT_MAX_RINGS); + + for (let i = polygons.length - 1; i >= 0; i--) { + const polygon = polygons[i]; if (polygon.length === 0 || isEntirelyOutside(polygon[0])) { - continue; + polygons.splice(i, 1); + } + } + + let clippedPolygons ; + if (isGlobe) { + // Perform tesselation for polygons of tiles in order to support long planar + // triangles on the curved surface of the globe. This is done for all polygons + // regardless of their size in order guarantee identical results on all sides of + // tile boundaries. + // + // The globe is subdivided into a 32x16 grid. The number of subdivisions done + // for a tile depends on the zoom level. For example tile with z=0 requires 2⁴ + // subdivisions, tile with z=1 2³ etc. The subdivision is done in polar coordinates + // instead of tile coordinates. + clippedPolygons = resampleFillExtrusionPolygonsForGlobe(polygons, tileBounds, canonical); + } else { + clippedPolygons = []; + for (const polygon of polygons) { + clippedPolygons.push({polygon, bounds: tileBounds}); } + } + + for (const clippedPolygon of clippedPolygons) { + const polygon = clippedPolygon.polygon; + let numVertices = 0; + let segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); for (let i = 0; i < polygon.length; i++) { const ring = polygon[i]; @@ -26908,8 +28216,7 @@ class FillExtrusionBucket { if (p >= 1) { const p2 = ring[p - 1]; - - if (!isBoundaryEdge(p1, p2)) { + if (!isBoundaryEdge(p1, p2, clippedPolygon.bounds)) { if (metadata) metadata.append(p1, p2); if (segment.vertexLength + 4 > SegmentVector.MAX_VERTEX_ARRAY_LENGTH) { segment = this.segments.prepareSegment(4, this.layoutVertexArray, this.indexArray); @@ -26923,13 +28230,13 @@ class FillExtrusionBucket { const dist = p2.dist(p1); if (edgeDistance + dist > 32768) edgeDistance = 0; - addVertex(this.layoutVertexArray, p1.x, p1.y, nxRatio, nySign, 0, 0, edgeDistance); - addVertex(this.layoutVertexArray, p1.x, p1.y, nxRatio, nySign, 0, 1, edgeDistance); + addVertex$1(this.layoutVertexArray, p1.x, p1.y, nxRatio, nySign, 0, 0, edgeDistance); + addVertex$1(this.layoutVertexArray, p1.x, p1.y, nxRatio, nySign, 0, 1, edgeDistance); edgeDistance += dist; - addVertex(this.layoutVertexArray, p2.x, p2.y, nxRatio, nySign, 0, 0, edgeDistance); - addVertex(this.layoutVertexArray, p2.x, p2.y, nxRatio, nySign, 0, 1, edgeDistance); + addVertex$1(this.layoutVertexArray, p2.x, p2.y, nxRatio, nySign, 0, 0, edgeDistance); + addVertex$1(this.layoutVertexArray, p2.x, p2.y, nxRatio, nySign, 0, 1, edgeDistance); const bottomRight = segment.vertexLength; @@ -26943,6 +28250,21 @@ class FillExtrusionBucket { segment.vertexLength += 4; segment.primitiveLength += 2; + + if (isGlobe) { + const array = this.layoutVertexExtArray; + + const projectedP1 = projection.projectTilePoint(p1.x, p1.y, canonical); + const projectedP2 = projection.projectTilePoint(p2.x, p2.y, canonical); + + const n1 = projection.upVector(canonical, p1.x, p1.y); + const n2 = projection.upVector(canonical, p2.x, p2.y); + + addGlobeExtVertex(array, projectedP1, n1); + addGlobeExtVertex(array, projectedP1, n1); + addGlobeExtVertex(array, projectedP2, n2); + addGlobeExtVertex(array, projectedP2, n2); + } } } } @@ -26954,7 +28276,7 @@ class FillExtrusionBucket { //Only triangulate and draw the area of the feature if it is a polygon //Other feature types (e.g. LineString) do not have area, so triangulation is pointless / undefined - if (vectorTileFeatureTypes[feature.type] !== 'Polygon') + if (vectorTileFeatureTypes$2[feature.type] !== 'Polygon') continue; const flattened = []; @@ -26974,11 +28296,18 @@ class FillExtrusionBucket { for (let i = 0; i < ring.length; i++) { const p = ring[i]; - addVertex(this.layoutVertexArray, p.x, p.y, 0, 0, 1, 1, 0); + addVertex$1(this.layoutVertexArray, p.x, p.y, 0, 0, 1, 1, 0); flattened.push(p.x); flattened.push(p.y); if (metadata) metadata.currentPolyCount.top++; + + if (isGlobe) { + const array = this.layoutVertexExtArray; + const projectedP = projection.projectTilePoint(p.x, p.y, canonical); + const n = projection.upVector(canonical, p.x, p.y); + addGlobeExtVertex(array, projectedP, n); + } } } @@ -26997,6 +28326,8 @@ class FillExtrusionBucket { segment.vertexLength += numVertices; } + assert_1(!isGlobe || (this.layoutVertexExtArray && this.layoutVertexExtArray.length === this.layoutVertexArray.length)); + if (metadata && metadata.polyCount.length > 0) { // When building is split between tiles, don't handle flat roofs here. if (metadata.borders) { @@ -27067,12 +28398,12 @@ class FillExtrusionBucket { } } -register('FillExtrusionBucket', FillExtrusionBucket, {omit: ['layers', 'features']}); -register('PartMetadata', PartMetadata); +register(FillExtrusionBucket, 'FillExtrusionBucket', {omit: ['layers', 'features']}); +register(PartMetadata, 'PartMetadata'); -function isBoundaryEdge(p1, p2) { - return (p1.x === p2.x && (p1.x < 0 || p1.x > EXTENT$1)) || - (p1.y === p2.y && (p1.y < 0 || p1.y > EXTENT$1)); +function isBoundaryEdge(p1, p2, bounds) { + return (p1.x === p2.x && (p1.x < bounds[0].x || p1.x > bounds[1].x)) || + (p1.y === p2.y && (p1.y < bounds[0].y || p1.y > bounds[1].y)); } function isEntirelyOutside(ring) { @@ -27080,9 +28411,9 @@ function isEntirelyOutside(ring) { // also in the tile across the border. Eventual zero area rings at border are discarded by classifyRings // and there is no need to handle that case here. return ring.every(p => p.x <= 0) || - ring.every(p => p.x >= EXTENT$1) || + ring.every(p => p.x >= EXTENT) || ring.every(p => p.y <= 0) || - ring.every(p => p.y >= EXTENT$1); + ring.every(p => p.y >= EXTENT); } function tileToMeter(canonical ) { @@ -27090,7 +28421,43 @@ function tileToMeter(canonical ) { const mercatorY = canonical.y / (1 << canonical.z); const exp = Math.exp(Math.PI * (1 - 2 * mercatorY)); // simplify cos(2 * atan(e) - PI/2) from mercator_coordinate.js, remove trigonometrics. - return circumferenceAtEquator * 2 * exp / (exp * exp + 1) / EXTENT$1 / (1 << canonical.z); + return circumferenceAtEquator * 2 * exp / (exp * exp + 1) / EXTENT / (1 << canonical.z); +} + +function fillExtrusionHeightLift() { + // A rectangle covering globe is subdivided into a grid of 32 cells + // This information can be used to deduce a minimum lift value so that + // fill extrusions with 0 height will never go below the ground. + const angle = Math.PI / 32.0; + const tanAngle = Math.tan(angle); + const r = earthRadius; + return r * Math.sqrt(1.0 + 2.0 * tanAngle * tanAngle) - r; +} + +// Resamples fill extrusion polygons by subdividing them into 32x16 cells in mercator space. +// The idea is to allow reprojection of large continuous planar shapes on the surface of the globe +function resampleFillExtrusionPolygonsForGlobe(polygons , tileBounds , tileID ) { + const cellCount = 360.0 / 32.0; + const tiles = 1 << tileID.z; + const leftLng = lngFromMercatorX(tileID.x / tiles); + const rightLng = lngFromMercatorX((tileID.x + 1) / tiles); + const topLat = latFromMercatorY(tileID.y / tiles); + const bottomLat = latFromMercatorY((tileID.y + 1) / tiles); + const cellCountOnXAxis = Math.ceil((rightLng - leftLng) / cellCount); + const cellCountOnYAxis = Math.ceil((topLat - bottomLat) / cellCount); + + const splitFn = (axis, min, max) => { + if (axis === 0) { + return 0.5 * (min + max); + } else { + const maxLat = latFromMercatorY((tileID.y + min / EXTENT) / tiles); + const minLat = latFromMercatorY((tileID.y + max / EXTENT) / tiles); + const midLat = 0.5 * (minLat + maxLat); + return (mercatorYfromLat(midLat) * tiles - tileID.y) * EXTENT; + } + }; + + return subdividePolygons(polygons, tileBounds, cellCountOnXAxis, cellCountOnYAxis, 1.0, splitFn); } // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. @@ -27113,7 +28480,7 @@ function tileToMeter(canonical ) { -const paint$4 = new Properties({ +const paint$5 = new Properties({ "fill-extrusion-opacity": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-opacity"]), "fill-extrusion-color": new DataDrivenProperty(spec["paint_fill-extrusion"]["fill-extrusion-color"]), "fill-extrusion-translate": new DataConstantProperty(spec["paint_fill-extrusion"]["fill-extrusion-translate"]), @@ -27127,10 +28494,278 @@ const paint$4 = new Properties({ // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} -var properties$4 = ({ paint: paint$4 } +var properties$5 = ({ paint: paint$5 } ); +/** + * 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]; +} + +// + +class CanonicalTileID { + + + + + + constructor(z , x , y ) { + assert_1(z >= 0 && z <= 25); + assert_1(x >= 0 && x < Math.pow(2, z)); + assert_1(y >= 0 && y < Math.pow(2, z)); + this.z = z; + this.x = x; + this.y = y; + this.key = calculateKey(0, z, z, x, y); + } + + 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 + url(urls , scheme ) { + const bbox = getTileBBox(this.x, this.y, this.z); + const 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}/g, String(this.z)) + .replace(/{x}/g, String(this.x)) + .replace(/{y}/g, String(scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y)) + .replace('{quadkey}', quadkey) + .replace('{bbox-epsg-3857}', bbox); + } + + toString() { + return `${this.z}/${this.x}/${this.y}`; + } +} + +class UnwrappedTileID { + + + + + constructor(wrap , canonical ) { + this.wrap = wrap; + this.canonical = canonical; + this.key = calculateKey(wrap, canonical.z, canonical.z, canonical.x, canonical.y); + } +} + +class OverscaledTileID { + + + + + + + constructor(overscaledZ , wrap , z , x , y ) { + assert_1(overscaledZ >= z); + this.overscaledZ = overscaledZ; + this.wrap = wrap; + this.canonical = new CanonicalTileID(z, +x, +y); + this.key = wrap === 0 && overscaledZ === z ? this.canonical.key : calculateKey(wrap, overscaledZ, z, x, y); + } + + equals(id ) { + return this.overscaledZ === id.overscaledZ && this.wrap === id.wrap && this.canonical.equals(id.canonical); + } + + scaledTo(targetZ ) { + assert_1(targetZ <= this.overscaledZ); + const 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); + } + } + + /* + * calculateScaledKey is an optimization: + * when withWrap == true, implements the same as this.scaledTo(z).key, + * when withWrap == false, implements the same as this.scaledTo(z).wrapped().key. + */ + calculateScaledKey(targetZ , withWrap = true) { + if (this.overscaledZ === targetZ && withWrap) return this.key; + if (targetZ > this.canonical.z) { + return calculateKey(this.wrap * +withWrap, targetZ, this.canonical.z, this.canonical.x, this.canonical.y); + } else { + const zDifference = this.canonical.z - targetZ; + return calculateKey(this.wrap * +withWrap, targetZ, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference); + } + } + + isChildOf(parent ) { + if (parent.wrap !== this.wrap) { + // We can't be a child if we're in a different world copy + return false; + } + const 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)); + } + + 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)]; + } + + const z = this.canonical.z + 1; + const x = this.canonical.x * 2; + const 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) + ]; + } + + 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; + } + + wrapped() { + return new OverscaledTileID(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y); + } + + unwrapTo(wrap ) { + return new OverscaledTileID(this.overscaledZ, wrap, this.canonical.z, this.canonical.x, this.canonical.y); + } + + overscaleFactor() { + return Math.pow(2, this.overscaledZ - this.canonical.z); + } + + toUnwrapped() { + return new UnwrappedTileID(this.wrap, this.canonical); + } + + toString() { + return `${this.overscaledZ}/${this.canonical.x}/${this.canonical.y}`; + } +} + +function calculateKey(wrap , overscaledZ , z , x , y ) { + // only use 22 bits for x & y so that the key fits into MAX_SAFE_INTEGER + const dim = 1 << Math.min(z, 22); + let xy = dim * (y % dim) + (x % dim); + + // zigzag-encode wrap if we have the room for it + if (wrap && z < 22) { + const bitsAvailable = 2 * (22 - z); + xy += dim * dim * ((wrap < 0 ? -2 * wrap - 1 : 2 * wrap) % (1 << bitsAvailable)); + } + + // encode z into 5 bits (24 max) and overscaledZ into 4 bits (10 max) + const key = ((xy * 32) + z) * 16 + (overscaledZ - z); + assert_1(key >= 0 && key <= Number.MAX_SAFE_INTEGER); + + return key; +} + +function getQuadkey(z, x, y) { + let quadkey = '', mask; + for (let 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: ['projMatrix']}); + // @@ -27140,6 +28775,7 @@ var properties$4 = ({ paint: paint$4 } + class FillExtrusionStyleLayer extends StyleLayer { @@ -27147,10 +28783,10 @@ class FillExtrusionStyleLayer extends StyleLayer { constructor(layer ) { - super(layer, properties$4); + super(layer, properties$5); } - createBucket(parameters ) { + createBucket(parameters ) { return new FillExtrusionBucket(parameters); } @@ -27192,8 +28828,9 @@ class FillExtrusionStyleLayer extends StyleLayer { const centroid = [0, 0]; const terrainVisible = elevationHelper && transform.elevation; const exaggeration = transform.elevation ? transform.elevation.exaggeration() : 1; - if (terrainVisible) { - const centroidVertexArray = queryGeometry.tile.getBucket(this).centroidVertexArray; + const bucket = queryGeometry.tile.getBucket(this); + if (terrainVisible && bucket instanceof FillExtrusionBucket) { + const centroidVertexArray = bucket.centroidVertexArray; // See FillExtrusionBucket#encodeCentroid(), centroid is inserted at vertexOffset + 1 const centroidOffset = layoutVertexArrayOffset + 1; @@ -27208,8 +28845,16 @@ class FillExtrusionStyleLayer extends StyleLayer { const isHidden = centroid[0] === 0 && centroid[1] === 1; if (isHidden) return false; + if (transform.projection.name === 'globe') { + // Fill extrusion geometry has to be resampled so that large planar polygons + // can be rendered on the curved surface + const bounds = [new pointGeometry(0, 0), new pointGeometry(EXTENT, EXTENT)]; + const resampledGeometry = resampleFillExtrusionPolygonsForGlobe([geometry], bounds, queryGeometry.tileID.canonical); + geometry = resampledGeometry.map(clipped => clipped.polygon).flat(); + } + const demSampler = terrainVisible ? elevationHelper : null; - const projected = projectExtrusion(geometry, base, height, translation, pixelPosMatrix, demSampler, centroid, exaggeration, transform.center.lat); + const projected = projectExtrusion(transform, geometry, base, height, translation, pixelPosMatrix, demSampler, centroid, exaggeration, transform.center.lat, queryGeometry.tileID.canonical); const projectedBase = projected[0]; const projectedTop = projected[1]; @@ -27219,11 +28864,11 @@ class FillExtrusionStyleLayer extends StyleLayer { } } -function dot$5(a, b) { +function dot(a, b) { return a.x * b.x + a.y * b.y; } -function getIntersectionDistance(projectedQueryGeometry , projectedFace ) { +function getIntersectionDistance(projectedQueryGeometry , projectedFace ) { if (projectedQueryGeometry.length === 1) { // For point queries calculate the z at which the point intersects the face @@ -27253,11 +28898,11 @@ function getIntersectionDistance(projectedQueryGeometry , projected const ac = c.sub(a); const ap = p.sub(a); - const dotABAB = dot$5(ab, ab); - const dotABAC = dot$5(ab, ac); - const dotACAC = dot$5(ac, ac); - const dotAPAB = dot$5(ap, ab); - const dotAPAC = dot$5(ap, ac); + const dotABAB = dot(ab, ab); + const dotABAC = dot(ab, ac); + const dotACAC = dot(ac, ac); + const dotAPAB = dot(ap, ab); + const dotAPAC = dot(ap, ac); const denom = dotABAB * dotACAC - dotABAC * dotABAC; const v = (dotACAC * dotAPAB - dotABAC * dotAPAC) / denom; @@ -27311,14 +28956,90 @@ function checkIntersection(projectedBase , projectedTop return closestDistance === Infinity ? false : closestDistance; } -function projectExtrusion(geometry , zBase , zTop , translation , m , demSampler , centroid , exaggeration , lat ) { - if (demSampler) { - return projectExtrusion3D(geometry, zBase, zTop, translation, m, demSampler, centroid, exaggeration, lat); +function projectExtrusion(tr , geometry , zBase , zTop , translation , m , demSampler , centroid , exaggeration , lat , tileID ) { + if (tr.projection.name === 'globe') { + return projectExtrusionGlobe(tr, geometry, zBase, zTop, translation, m, demSampler, centroid, exaggeration, lat, tileID); } else { - return projectExtrusion2D(geometry, zBase, zTop, translation, m); + if (demSampler) { + return projectExtrusion3D(geometry, zBase, zTop, translation, m, demSampler, centroid, exaggeration, lat); + } else { + return projectExtrusion2D(geometry, zBase, zTop, translation, m); + } } } +function projectExtrusionGlobe(tr , geometry , zBase , zTop , translation , m , demSampler , centroid , exaggeration , lat , tileID ) { + const projectedBase = []; + const projectedTop = []; + const elevationScale = tr.projection.upVectorScale(tileID, tr.center.lat, tr.worldSize).metersToTile; + const basePoint = [0, 0, 0, 1]; + const topPoint = [0, 0, 0, 1]; + + const setPoint = (point, x, y, z) => { + point[0] = x; + point[1] = y; + point[2] = z; + point[3] = 1; + }; + + // Fixed "lift" value is added to height so that 0-height fill extrusions wont clip with globe's surface + const lift = fillExtrusionHeightLift(); + + if (zBase > 0) { + zBase += lift; + } + zTop += lift; + + for (const r of geometry) { + const ringBase = []; + const ringTop = []; + for (const p of r) { + const x = p.x + translation.x; + const y = p.y + translation.y; + + // Reproject tile coordinate into ecef and apply elevation to correct direction + const reproj = tr.projection.projectTilePoint(x, y, tileID); + const dir = tr.projection.upVector(tileID, p.x, p.y); + + let zBasePoint = zBase; + let zTopPoint = zTop; + + if (demSampler) { + const offset = getTerrainHeightOffset(x, y, zBase, zTop, demSampler, centroid, exaggeration, lat); + + zBasePoint += offset.base; + zTopPoint += offset.top; + } + + if (zBase !== 0) { + setPoint( + basePoint, + reproj.x + dir[0] * elevationScale * zBasePoint, + reproj.y + dir[1] * elevationScale * zBasePoint, + reproj.z + dir[2] * elevationScale * zBasePoint); + } else { + setPoint(basePoint, reproj.x, reproj.y, reproj.z); + } + + setPoint( + topPoint, + reproj.x + dir[0] * elevationScale * zTopPoint, + reproj.y + dir[1] * elevationScale * zTopPoint, + reproj.z + dir[2] * elevationScale * zTopPoint); + + transformMat4$2(basePoint, basePoint, m); + transformMat4$2(topPoint, topPoint, m); + + ringBase.push(toPoint(basePoint)); + ringTop.push(toPoint(topPoint)); + } + projectedBase.push(ringBase); + projectedTop.push(ringTop); + } + + return [projectedBase, projectedTop]; +} + /* * Project the geometry using matrix `m`. This is essentially doing * `vec4.transformMat4([], [p.x, p.y, z, 1], m)` but the multiplication @@ -27492,28 +29213,44 @@ function fourSample(demSampler , posX , posY , offsetX // -const lineLayoutAttributes = createLayout([ + + +const lineLayoutAttributes = createLayout([ {name: 'a_pos_normal', components: 2, type: 'Int16'}, {name: 'a_data', components: 4, type: 'Uint8'}, {name: 'a_linesofar', components: 1, type: 'Float32'} ], 4); -const {members: members$3, size: size$3, alignment: alignment$3} = lineLayoutAttributes; +const {members: members$2, size: size$2, alignment: alignment$2} = lineLayoutAttributes; // -const lineLayoutAttributesExt = createLayout([ - {name: 'a_packed', components: 3, type: 'Float32'} + + +const lineLayoutAttributesExt = createLayout([ + {name: 'a_packed', components: 4, type: 'Float32'} ]); -const {members: members$4, size: size$4, alignment: alignment$4} = lineLayoutAttributesExt; +const {members: members$1, size: size$1, alignment: alignment$1} = lineLayoutAttributesExt; // const vectorTileFeatureTypes$1 = vectorTile.VectorTileFeature.types; + + + + + + + + + + + + + - @@ -27590,6 +29327,7 @@ class LineBucket { + constructor(options ) { this.zoom = options.zoom; @@ -27597,6 +29335,7 @@ class LineBucket { this.layers = options.layers; this.layerIds = this.layers.map(layer => layer.id); this.index = options.index; + this.projection = options.projection; this.hasPattern = false; this.patternFeatures = []; this.lineClipsArray = []; @@ -27606,7 +29345,7 @@ class LineBucket { }); this.layoutVertexArray = new StructArrayLayout2i4ub1f12(); - this.layoutVertexArray2 = new StructArrayLayout3f12(); + this.layoutVertexArray2 = new StructArrayLayout4f16(); this.indexArray = new StructArrayLayout3ui6(); this.programConfigurations = new ProgramConfigurationSet(options.layers, options.zoom); this.segments = new SegmentVector(); @@ -27676,7 +29415,7 @@ class LineBucket { } } - addConstantDashes(lineAtlas ) { + addConstantDashes(lineAtlas ) { let hasFeatureDashes = false; for (const layer of this.layers) { @@ -27747,31 +29486,31 @@ class LineBucket { } - update(states , vtLayer , availableImages , imagePositions ) { + update(states , vtLayer , availableImages , imagePositions ) { if (!this.stateDependentLayers.length) return; this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, availableImages, imagePositions); } - addFeatures(options , canonical , imagePositions , availableImages ) { + addFeatures(options , canonical , imagePositions , availableImages , _ ) { for (const feature of this.patternFeatures) { this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions, availableImages); } } - isEmpty() { + isEmpty() { return this.layoutVertexArray.length === 0; } - uploadPending() { + uploadPending() { return !this.uploaded || this.programConfigurations.needsUpload; } upload(context ) { if (!this.uploaded) { if (this.layoutVertexArray2.length !== 0) { - this.layoutVertexBuffer2 = context.createVertexBuffer(this.layoutVertexArray2, members$4); + this.layoutVertexBuffer2 = context.createVertexBuffer(this.layoutVertexArray2, members$1); } - this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$3); + this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, members$2); this.indexBuffer = context.createIndexBuffer(this.indexArray); } this.programConfigurations.upload(context); @@ -27794,7 +29533,7 @@ class LineBucket { } } - addFeature(feature , geometry , index , canonical , imagePositions , availableImages ) { + addFeature(feature , geometry , index , canonical , imagePositions , availableImages ) { const layout = this.layers[0].layout; const join = layout.get('line-join').evaluate(feature, {}); const cap = layout.get('line-cap').evaluate(feature, {}); @@ -27843,7 +29582,7 @@ class LineBucket { if (join === 'bevel') miterLimit = 1.05; const sharpCornerOffset = this.overscaling <= 16 ? - SHARP_CORNER_OFFSET * EXTENT$1 / (512 * this.overscaling) : + SHARP_CORNER_OFFSET * EXTENT / (512 * this.overscaling) : 0; // we could be more precise, but it would only save a negligible amount of space @@ -28102,7 +29841,7 @@ class LineBucket { // Constructs a second vertex buffer with higher precision line progress if (this.lineClips) { - this.layoutVertexArray2.emplaceBack(this.scaledDistance, this.lineClipsArray.length, this.lineSoFar); + this.layoutVertexArray2.emplaceBack(this.scaledDistance, this.lineClipsArray.length, this.lineClips.start, this.lineClips.end); } const e = segment.vertexLength++; @@ -28138,7 +29877,7 @@ class LineBucket { } } -register('LineBucket', LineBucket, {omit: ['layers', 'patternFeatures']}); +register(LineBucket, 'LineBucket', {omit: ['layers', 'patternFeatures']}); // This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. @@ -28156,7 +29895,7 @@ register('LineBucket', LineBucket, {omit: ['layers', 'patternFeatures']}); -const layout$4 = new Properties({ +const layout$2 = new Properties({ "line-cap": new DataDrivenProperty(spec["layout_line"]["line-cap"]), "line-join": new DataDrivenProperty(spec["layout_line"]["line-join"]), "line-miter-limit": new DataConstantProperty(spec["layout_line"]["line-miter-limit"]), @@ -28176,9 +29915,10 @@ const layout$4 = new Properties({ + -const paint$5 = new Properties({ +const paint$4 = new Properties({ "line-opacity": new DataDrivenProperty(spec["paint_line"]["line-opacity"]), "line-color": new DataDrivenProperty(spec["paint_line"]["line-color"]), "line-translate": new DataConstantProperty(spec["paint_line"]["line-translate"]), @@ -28190,17 +29930,18 @@ const paint$5 = new Properties({ "line-dasharray": new CrossFadedDataDrivenProperty(spec["paint_line"]["line-dasharray"]), "line-pattern": new CrossFadedDataDrivenProperty(spec["paint_line"]["line-pattern"]), "line-gradient": new ColorRampProperty(spec["paint_line"]["line-gradient"]), + "line-trim-offset": new DataConstantProperty(spec["paint_line"]["line-trim-offset"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types // for these objects from their use in the constructor to StyleLayer, as // {layout?: Properties<...>, paint: Properties<...>} -var properties$5 = ({ paint: paint$5, layout: layout$4 } +var properties$4 = ({ paint: paint$4, layout: layout$2 } ); // - + @@ -28221,12 +29962,12 @@ class LineFloorwidthProperty extends DataDrivenProperty { } evaluate(value, globals, feature, featureState) { - globals = extend({}, globals, {zoom: Math.floor(globals.zoom)}); + globals = extend$1({}, globals, {zoom: Math.floor(globals.zoom)}); return super.evaluate(value, globals, feature, featureState); } } -const lineFloorwidthProperty = new LineFloorwidthProperty(properties$5.paint.properties['line-width'].specification); +const lineFloorwidthProperty = new LineFloorwidthProperty(properties$4.paint.properties['line-width'].specification); lineFloorwidthProperty.useIntegerZoom = true; class LineStyleLayer extends StyleLayer { @@ -28241,7 +29982,7 @@ class LineStyleLayer extends StyleLayer { constructor(layer ) { - super(layer, properties$5); + super(layer, properties$4); this.gradientVersion = 0; } @@ -28253,7 +29994,7 @@ class LineStyleLayer extends StyleLayer { } } - gradientExpression() { + gradientExpression() { return this._transitionablePaint._values['line-gradient'].value.expression; } @@ -28264,7 +30005,7 @@ class LineStyleLayer extends StyleLayer { lineFloorwidthProperty.possiblyEvaluate(this._transitioningPaint._values['line-width'].value, parameters); } - createBucket(parameters ) { + createBucket(parameters ) { return new LineBucket(parameters); } @@ -28311,7 +30052,7 @@ class LineStyleLayer extends StyleLayer { return polygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth); } - isTileClipped() { + isTileClipped() { return true; } } @@ -28350,32 +30091,38 @@ function offsetLine(rings, offset) { // -const symbolLayoutAttributes = createLayout([ + + +const symbolLayoutAttributes = createLayout([ {name: 'a_pos_offset', components: 4, type: 'Int16'}, {name: 'a_tex_size', components: 4, type: 'Uint16'}, - {name: 'a_pixeloffset', components: 4, type: 'Int16'}, - {name: 'a_z_tile_anchor', components: 4, type: 'Int16'} + {name: 'a_pixeloffset', components: 4, type: 'Int16'} ], 4); -const dynamicLayoutAttributes = createLayout([ - {name: 'a_projected_pos', components: 3, type: 'Float32'} +const symbolGlobeExtAttributes = createLayout([ + {name: 'a_globe_anchor', components: 3, type: 'Int16'}, + {name: 'a_globe_normal', components: 3, type: 'Float32'}, ], 4); -const placementOpacityAttributes = createLayout([ +const dynamicLayoutAttributes = createLayout([ + {name: 'a_projected_pos', components: 4, type: 'Float32'} +], 4); + +const placementOpacityAttributes = createLayout([ {name: 'a_fade_opacity', components: 1, type: 'Uint32'} ], 4); -const collisionVertexAttributes = createLayout([ +const collisionVertexAttributes = createLayout([ {name: 'a_placed', components: 2, type: 'Uint8'}, {name: 'a_shift', components: 2, type: 'Float32'}, ]); -const collisionVertexAttributesExt = createLayout([ +const collisionVertexAttributesExt = createLayout([ {name: 'a_size_scale', components: 1, type: 'Float32'}, {name: 'a_padding', components: 2, type: 'Float32'}, ]); -const collisionBox = createLayout([ +const collisionBox = createLayout([ // the box is centered around the anchor point {type: 'Int16', name: 'projectedAnchorX'}, {type: 'Int16', name: 'projectedAnchorY'}, @@ -28400,23 +30147,23 @@ const collisionBox = createLayout([ {type: 'Uint16', name: 'bucketIndex'}, ]); -const collisionBoxLayout = createLayout([ // used to render collision boxes for debugging purposes +const collisionBoxLayout = createLayout([ // used to render collision boxes for debugging purposes {name: 'a_pos', components: 3, type: 'Int16'}, {name: 'a_anchor_pos', components: 2, type: 'Int16'}, {name: 'a_extrude', components: 2, type: 'Int16'} ], 4); -const collisionCircleLayout = createLayout([ // used to render collision circles for debugging purposes +const collisionCircleLayout = createLayout([ // used to render collision circles for debugging purposes {name: 'a_pos_2f', components: 2, type: 'Float32'}, {name: 'a_radius', components: 1, type: 'Float32'}, {name: 'a_flags', components: 2, type: 'Int16'} ], 4); -const quadTriangle = createLayout([ +const quadTriangle = createLayout([ {name: 'triangle', components: 3, type: 'Uint16'}, ]); -const placement = createLayout([ +const placement = createLayout([ {type: 'Int16', name: 'projectedAnchorX'}, {type: 'Int16', name: 'projectedAnchorY'}, {type: 'Int16', name: 'projectedAnchorZ'}, @@ -28440,7 +30187,7 @@ const placement = createLayout([ {type: 'Uint8', name: 'flipState'} ]); -const symbolInstance = createLayout([ +const symbolInstance = createLayout([ {type: 'Int16', name: 'projectedAnchorX'}, {type: 'Int16', name: 'projectedAnchorY'}, {type: 'Int16', name: 'projectedAnchorZ'}, @@ -28472,11 +30219,11 @@ const symbolInstance = createLayout([ {type: 'Float32', name: 'collisionCircleDiameter'}, ]); -const glyphOffset = createLayout([ +const glyphOffset = createLayout([ {type: 'Float32', name: 'offsetX'} ]); -const lineVertex = createLayout([ +const lineVertex = createLayout([ {type: 'Int16', name: 'x'}, {type: 'Int16', name: 'y'}, {type: 'Int16', name: 'tileUnitDistanceFromAnchor'} @@ -28512,6 +30259,11 @@ const SIZE_PACK_FACTOR = 128; + + + + + // For {text,icon}-size, get the bucket-level data that will be needed by // the painter to set symbol-size-related uniforms @@ -28556,8 +30308,8 @@ function getSizeData(tileZoom , value } function evaluateSizeForFeature(sizeData , - {uSize, uSizeT} , - {lowerSize, upperSize} ) { + {uSize, uSizeT} , + {lowerSize, upperSize} ) { if (sizeData.kind === 'source') { return lowerSize / SIZE_PACK_FACTOR; } else if (sizeData.kind === 'composite') { @@ -28566,7 +30318,7 @@ function evaluateSizeForFeature(sizeData , return uSize; } -function evaluateSizeForZoom(sizeData , zoom ) { +function evaluateSizeForZoom(sizeData , zoom ) { let uSizeT = 0; let uSize = 0; @@ -28797,7 +30549,7 @@ const verticalizedCharacterMap = { '」': '﹂' }; -function verticalizePunctuation(input , skipContextChecking ) { +function verticalizePunctuation(input , skipContextChecking ) { let output = ''; for (let i = 0; i < input.length; i++) { @@ -28819,13 +30571,13 @@ function verticalizePunctuation(input , skipContextChecking ) { return output; } -function isVerticalClosePunctuation(chr ) { +function isVerticalClosePunctuation(chr ) { return chr === '︶' || chr === '﹈' || chr === '︸' || chr === '﹄' || chr === '﹂' || chr === '︾' || chr === '︼' || chr === '︺' || chr === '︘' || chr === '﹀' || chr === '︐' || chr === '︓' || chr === '︔' || chr === '`' || chr === ' ̄' || chr === '︑' || chr === '︒'; } -function isVerticalOpenPunctuation(chr ) { +function isVerticalOpenPunctuation(chr ) { return chr === '︵' || chr === '﹇' || chr === '︷' || chr === '﹃' || chr === '﹁' || chr === '︽' || chr === '︻' || chr === '︹' || chr === '︗' || chr === '︿'; } @@ -29565,7 +31317,7 @@ function writeUtf8(buf, str, pos) { } // -const border = 3; +const border$1 = 3; @@ -29582,8 +31334,8 @@ function readFontstack(tag , glyphData glyphData.glyphs.push({ id, bitmap: new AlphaImage({ - width: width + 2 * border, - height: height + 2 * border + width: width + 2 * border$1, + height: height + 2 * border$1 }, bitmap), metrics: {width, height, left, top, advance} }); @@ -29608,7 +31360,7 @@ function parseGlyphPBF (data ) return new pbf(data).readFields(readFontstacks, {}); } -const GLYPH_PBF_BORDER = border; +const GLYPH_PBF_BORDER = border$1; function potpack(boxes) { @@ -29709,6 +31461,7 @@ function potpack(boxes) { + const IMAGE_PADDING = 1; @@ -29719,7 +31472,7 @@ const IMAGE_PADDING = 1; -class ImagePosition { +class ImagePosition { @@ -29823,6 +31576,7 @@ class ImageAtlas { } patchUpdatedImages(imageManager , texture ) { + this.haveRenderCallbacks = this.haveRenderCallbacks.filter(id => imageManager.hasImage(id)); imageManager.dispatchRenderCallbacks(this.haveRenderCallbacks); for (const name in imageManager.updatedImages) { this.patchUpdatedImage(this.iconPositions[name], imageManager.getImage(name), texture); @@ -29842,8 +31596,8 @@ class ImageAtlas { } -register('ImagePosition', ImagePosition); -register('ImageAtlas', ImageAtlas); +register(ImagePosition, 'ImagePosition'); +register(ImageAtlas, 'ImageAtlas'); // @@ -29889,6 +31643,11 @@ const SHAPING_DEFAULT_OFFSET = -17; + + + + + function isEmpty(positionedLines ) { for (const line of positionedLines) { if (line.positionedGlyphs.length !== 0) { @@ -30356,7 +32115,7 @@ function determineLineBreaks(logicalInput , true)); } -function getAnchorAlignment(anchor ) { +function getAnchorAlignment(anchor ) { let horizontalAlign = 0.5, verticalAlign = 0.5; switch (anchor) { @@ -30576,7 +32335,7 @@ function shapeLines(shaping , const height = y; const {horizontalAlign, verticalAlign} = getAnchorAlignment(textAnchor); - align$1(shaping.positionedLines, justify, horizontalAlign, verticalAlign, maxLineLength, height); + align(shaping.positionedLines, justify, horizontalAlign, verticalAlign, maxLineLength, height); // Calculate the bounding box shaping.top += -verticalAlign * height; shaping.bottom = shaping.top + height; @@ -30605,7 +32364,7 @@ function justifyLine(positionedGlyphs , } } -function align$1(positionedLines , +function align(positionedLines , justify , horizontalAlign , verticalAlign , @@ -30713,12 +32472,12 @@ class Anchor extends pointGeometry { } } - clone() { + clone() { return new Anchor(this.x, this.y, this.z, this.angle, this.segment); } } -register('Anchor', Anchor); +register(Anchor, 'Anchor'); // @@ -30738,7 +32497,7 @@ register('Anchor', Anchor); * @returns {boolean} whether the label should be placed * @private */ -function checkMaxAngle(line , anchor , labelLength , windowSize , maxAngle ) { +function checkMaxAngle(line , anchor , labelLength , windowSize , maxAngle ) { // horizontal labels always pass if (anchor.segment === undefined) return true; @@ -30829,7 +32588,7 @@ function getCenterAnchor(line , shapedText , shapedIcon , glyphSize , - boxScale ) { + boxScale ) { const angleWindowSize = getAngleWindowSize(shapedText, glyphSize, boxScale); const labelLength = getShapedLabelLength(shapedText, shapedIcon) * boxScale; @@ -30869,7 +32628,7 @@ function getAnchors(line , glyphSize , boxScale , overscaling , - tileExtent ) { + 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 @@ -30899,10 +32658,10 @@ function getAnchors(line , ((shapedLabelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing : (spacing / 2 * overscaling) % spacing; - return resample$1(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, false, tileExtent); + return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, false, tileExtent); } -function resample$1(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) { +function resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) { const halfLabelLength = labelLength / 2; const lineLength = getLineLength(line); @@ -30951,7 +32710,7 @@ function resample$1(line, offset, spacing, angleWindowSize, maxAngle, labelLengt // 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$1(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent); + anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent); } return anchors; @@ -31070,7 +32829,7 @@ class TinySDF { fontFamily = 'sans-serif', fontWeight = 'normal', fontStyle = 'normal' - }) { + } = {}) { this.buffer = buffer; this.cutoff = cutoff; this.radius = radius; @@ -31112,24 +32871,24 @@ class TinySDF { // The integer/pixel part of the top alignment is encoded in metrics.glyphTop // The remainder is implicitly encoded in the rasterization - const glyphTop = Math.floor(actualBoundingBoxAscent); + const glyphTop = Math.ceil(actualBoundingBoxAscent); const glyphLeft = 0; // If the glyph overflows the canvas size, it will be clipped at the bottom/right const glyphWidth = Math.min(this.size - this.buffer, Math.ceil(actualBoundingBoxRight - actualBoundingBoxLeft)); - const glyphHeight = Math.min(this.size - this.buffer, Math.ceil(actualBoundingBoxAscent) + Math.ceil(actualBoundingBoxDescent)); + const glyphHeight = Math.min(this.size - this.buffer, glyphTop + Math.ceil(actualBoundingBoxDescent)); const width = glyphWidth + 2 * this.buffer; const height = glyphHeight + 2 * this.buffer; - const len = width * height; + const len = Math.max(width * height, 0); const data = new Uint8ClampedArray(len); const glyph = {data, width, height, glyphWidth, glyphHeight, glyphTop, glyphLeft, glyphAdvance}; if (glyphWidth === 0 || glyphHeight === 0) return glyph; const {ctx, buffer, gridInner, gridOuter} = this; ctx.clearRect(buffer, buffer, glyphWidth, glyphHeight); - ctx.fillText(char, buffer, buffer + glyphTop + 1); + ctx.fillText(char, buffer, buffer + glyphTop); const imgData = ctx.getImageData(buffer, buffer, glyphWidth, glyphHeight); // Initialize grids outside the glyph range to alpha 0 @@ -31385,12 +33144,12 @@ class GlyphManager { } else { /* eslint-disable new-cap */ return !!this.localFontFamily && - (unicodeBlockLookup['CJK Unified Ideographs'](id) || + ((unicodeBlockLookup['CJK Unified Ideographs'](id) || unicodeBlockLookup['Hangul Syllables'](id) || unicodeBlockLookup['Hiragana'](id) || unicodeBlockLookup['Katakana'](id)) || // gl-native parity: Extend Ideographs rasterization range to include CJK symbols and punctuations - unicodeBlockLookup['CJK Symbols and Punctuation'](id); + unicodeBlockLookup['CJK Symbols and Punctuation'](id)); /* eslint-enable new-cap */ } } @@ -31500,7 +33259,7 @@ GlyphManager.TinySDF = TinySDF; // 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. -const border$1 = IMAGE_PADDING; +const border = IMAGE_PADDING; /** * Create the quads used for rendering an icon. @@ -31515,8 +33274,8 @@ function getIconQuads( const image = shapedIcon.image; const pixelRatio = image.pixelRatio; - const imageWidth = image.paddedRect.w - 2 * border$1; - const imageHeight = image.paddedRect.h - 2 * border$1; + const imageWidth = image.paddedRect.w - 2 * border; + const imageHeight = image.paddedRect.h - 2 * border; const iconWidth = shapedIcon.right - shapedIcon.left; const iconHeight = shapedIcon.bottom - shapedIcon.top; @@ -31591,8 +33350,8 @@ function getIconQuads( const y2 = bottom.stretch + bottom.fixed; const subRect = { - x: image.paddedRect.x + border$1 + x1, - y: image.paddedRect.y + border$1 + y1, + x: image.paddedRect.x + border + x1, + y: image.paddedRect.y + border + y1, w: x2 - x1, h: y2 - y1 }; @@ -31637,7 +33396,7 @@ function sumWithinRange(ranges, min, max) { } function stretchZonesToCuts(stretchZones, fixedSize, stretchSize) { - const cuts = [{fixed: -border$1, stretch: 0}]; + const cuts = [{fixed: -border, stretch: 0}]; for (const [c1, c2] of stretchZones) { const last = cuts[cuts.length - 1]; @@ -31651,7 +33410,7 @@ function stretchZonesToCuts(stretchZones, fixedSize, stretchSize) { }); } cuts.push({ - fixed: fixedSize + border$1, + fixed: fixedSize + border, stretch: stretchSize }); return cuts; @@ -31885,7 +33644,7 @@ function getGlyphQuads(anchor , } class TinyQueue { - constructor(data = [], compare = defaultCompare$1) { + constructor(data = [], compare = defaultCompare) { this.data = data; this.length = this.data.length; this.compare = compare; @@ -31959,7 +33718,7 @@ class TinyQueue { } } -function defaultCompare$1(a, b) { +function defaultCompare(a, b) { return a < b ? -1 : a > b ? 1 : 0; } @@ -32123,7 +33882,7 @@ const baselineOffset = 7; const INVALID_TEXT_OFFSET = Number.POSITIVE_INFINITY; const sqrt2 = Math.sqrt(2); -function evaluateVariableOffset(anchor , offset ) { +function evaluateVariableOffset(anchor , offset ) { function fromRadialOffset(anchor , radialOffset ) { let x = 0, y = 0; @@ -32218,7 +33977,7 @@ function performSymbolLayout(bucket , bucket.createArrays(); const tileSize = 512 * bucket.overscaling; - bucket.tilePixelRatio = EXTENT$1 / tileSize; + bucket.tilePixelRatio = EXTENT / tileSize; bucket.compareText = {}; bucket.iconsNeedLinear = false; @@ -32399,6 +34158,20 @@ function getAnchorJustification(anchor ) { return 'center'; } +/** + * for "very" overscaled tiles (overscaleFactor > 2) on high zoom levels (z > 18) + * we use the tile pixel ratio from the previous zoom level and clamp it to 1 + * in order to thin out labels density and save memory and CPU . + * @private + */ +function tilePixelRatioForSymbolSpacing(overscaleFactor, overscaledZ) { + if (overscaledZ > 18 && overscaleFactor > 2) { + overscaleFactor >>= 1; + } + const tilePixelRatio = EXTENT / (512 * overscaleFactor); + return Math.max(tilePixelRatio, 1); +} + /** * Given a feature and its shaped text and icon data, add a 'symbol * instance' for each _possible_ placement of the symbol feature. @@ -32430,11 +34203,13 @@ function addFeature(bucket , const layout = bucket.layers[0].layout; const iconOffset = layout.get('icon-offset').evaluate(feature, {}, canonical); const defaultShaping = getDefaultHorizontalShaping(shapedTextOrientations.horizontal) || shapedTextOrientations.vertical; + const isGlobe = projection.name === 'globe'; + const glyphSize = ONE_EM, fontScale = layoutTextSize / glyphSize, textMaxBoxScale = bucket.tilePixelRatio * textMaxSize / glyphSize, iconBoxScale = bucket.tilePixelRatio * layoutIconSize, - symbolMinDistance = bucket.tilePixelRatio * layout.get('symbol-spacing'), + symbolMinDistance = tilePixelRatioForSymbolSpacing(bucket.overscaling, bucket.zoom) * layout.get('symbol-spacing'), textPadding = layout.get('text-padding') * bucket.tilePixelRatio, iconPadding = layout.get('icon-padding') * bucket.tilePixelRatio, textMaxAngle = degToRad(layout.get('text-max-angle')), @@ -32459,17 +34234,23 @@ function addFeature(bucket , } const addSymbolAtAnchor = (line, anchor, canonicalId) => { - if (anchor.x < 0 || anchor.x >= EXTENT$1 || anchor.y < 0 || anchor.y >= EXTENT$1) { + 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; } - const {x, y, z} = projection.projectTilePoint(anchor.x, anchor.y, canonicalId); - const projectedAnchor = new Anchor(x, y, z, 0, undefined); + let globe = null; + if (isGlobe) { + const {x, y, z} = projection.projectTilePoint(anchor.x, anchor.y, canonicalId); + globe = { + anchor: new Anchor(x, y, z, 0, undefined), + up: projection.upVector(canonicalId, anchor.x, anchor.y) + }; + } - addSymbol(bucket, anchor, projectedAnchor, line, shapedTextOrientations, shapedIcon, imageMap, verticallyShapedIcon, bucket.layers[0], + addSymbol(bucket, anchor, globe, line, shapedTextOrientations, shapedIcon, imageMap, verticallyShapedIcon, bucket.layers[0], bucket.collisionBoxArray, feature.index, feature.sourceLayerIndex, bucket.index, textPadding, textAlongLine, textOffset, iconBoxScale, iconPadding, iconAlongLine, iconOffset, @@ -32477,7 +34258,7 @@ function addFeature(bucket , }; if (symbolPlacement === 'line') { - for (const line of clipLine(feature.geometry, 0, 0, EXTENT$1, EXTENT$1)) { + for (const line of clipLine(feature.geometry, 0, 0, EXTENT, EXTENT)) { const anchors = getAnchors( line, symbolMinDistance, @@ -32487,7 +34268,7 @@ function addFeature(bucket , glyphSize, textMaxBoxScale, bucket.overscaling, - EXTENT$1 + EXTENT ); for (const anchor of anchors) { const shapedText = defaultShaping; @@ -32514,7 +34295,7 @@ function addFeature(bucket , } } } else if (feature.type === 'Polygon') { - for (const polygon of classifyRings(feature.geometry, 0)) { + for (const polygon of classifyRings$1(feature.geometry, 0)) { // 16 here represents 2 pixels const poi = findPoleOfInaccessibility(polygon, 16); addSymbolAtAnchor(polygon[0], new Anchor(poi.x, poi.y, 0, 0, undefined), canonical); @@ -32537,8 +34318,8 @@ const MAX_GLYPH_ICON_SIZE = 255; const MAX_PACKED_SIZE = MAX_GLYPH_ICON_SIZE * SIZE_PACK_FACTOR; function addTextVertices(bucket , - anchor , - tileAnchor , + globe , + tileAnchor , shapedText , imageMap , layer , @@ -32553,7 +34334,7 @@ function addTextVertices(bucket , sizes , availableImages , canonical ) { - const glyphQuads = getGlyphQuads(anchor, shapedText, textOffset, + const glyphQuads = getGlyphQuads(tileAnchor, shapedText, textOffset, layer, textAlongLine, feature, imageMap, bucket.allowVerticalPlacement); const sizeData = bucket.textSizeData; @@ -32584,7 +34365,7 @@ function addTextVertices(bucket , textAlongLine, feature, writingMode, - anchor, + globe, tileAnchor, lineArray.lineStartIndex, lineArray.lineLength, @@ -32689,7 +34470,7 @@ function evaluateCircleCollisionFeature(shaped ) { */ function addSymbol(bucket , anchor , - projectedAnchor , + globe , line , shapedTextOrientations , shapedIcon , @@ -32724,6 +34505,7 @@ function addSymbol(bucket , let verticalPlacedIconSymbolIndex = -1; const placedTextSymbolIndices = {}; let key = murmurhashJs(''); + const collisionFeatureAnchor = globe ? globe.anchor : anchor; let textOffset0 = 0; let textOffset1 = 0; @@ -32744,9 +34526,9 @@ function addSymbol(bucket , } else { const textRotation = layer.layout.get('text-rotate').evaluate(feature, {}, canonical); const verticalTextRotation = textRotation + 90.0; - verticalTextBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, projectedAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticalShaping, textPadding, verticalTextRotation, textOffset); + verticalTextBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, collisionFeatureAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticalShaping, textPadding, verticalTextRotation, textOffset); if (verticallyShapedIcon) { - verticalIconBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, projectedAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticallyShapedIcon, iconPadding, verticalTextRotation); + verticalIconBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, collisionFeatureAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, verticallyShapedIcon, iconPadding, verticalTextRotation); } } } @@ -32760,7 +34542,7 @@ function addSymbol(bucket , const hasIconTextFit = layer.layout.get('icon-text-fit') !== 'none'; const iconQuads = getIconQuads(shapedIcon, iconRotate, isSDFIcon, hasIconTextFit); const verticalIconQuads = verticallyShapedIcon ? getIconQuads(verticallyShapedIcon, iconRotate, isSDFIcon, hasIconTextFit) : undefined; - iconBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, projectedAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconPadding, iconRotate); + iconBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, collisionFeatureAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconPadding, iconRotate); numIconVertices = iconQuads.length * 4; const sizeData = bucket.iconSizeData; @@ -32791,7 +34573,7 @@ function addSymbol(bucket , iconAlongLine, feature, false, - projectedAnchor, + globe, anchor, lineArray.lineStartIndex, lineArray.lineLength, @@ -32813,7 +34595,7 @@ function addSymbol(bucket , iconAlongLine, feature, WritingMode.vertical, - projectedAnchor, + globe, anchor, lineArray.lineStartIndex, lineArray.lineLength, @@ -32837,13 +34619,13 @@ function addSymbol(bucket , textCircle = evaluateCircleCollisionFeature(shaping); } else { const textRotate = layer.layout.get('text-rotate').evaluate(feature, {}, canonical); - textBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, projectedAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaping, textPadding, textRotate, textOffset); + textBoxIndex = evaluateBoxCollisionFeature(collisionBoxArray, collisionFeatureAnchor, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaping, textPadding, textRotate, textOffset); } } const singleLine = shaping.positionedLines.length === 1; numHorizontalGlyphVertices += addTextVertices( - bucket, projectedAnchor, anchor, shaping, imageMap, layer, textAlongLine, feature, textOffset, lineArray, + bucket, globe, anchor, shaping, imageMap, layer, textAlongLine, feature, textOffset, lineArray, shapedTextOrientations.vertical ? WritingMode.horizontal : WritingMode.horizontalOnly, singleLine ? (Object.keys(shapedTextOrientations.horizontal) ) : [justification], placedTextSymbolIndices, placedIconSymbolIndex, sizes, availableImages, canonical); @@ -32855,7 +34637,7 @@ function addSymbol(bucket , if (shapedTextOrientations.vertical) { numVerticalGlyphVertices += addTextVertices( - bucket, projectedAnchor, anchor, shapedTextOrientations.vertical, imageMap, layer, textAlongLine, feature, + bucket, globe, anchor, shapedTextOrientations.vertical, imageMap, layer, textAlongLine, feature, textOffset, lineArray, WritingMode.vertical, ['vertical'], placedTextSymbolIndices, verticalPlacedIconSymbolIndex, sizes, availableImages, canonical); } @@ -32873,7 +34655,7 @@ function addSymbol(bucket , collisionCircleDiameter = getCollisionCircleHeight(verticalIconCircle, collisionCircleDiameter); const useRuntimeCollisionCircles = (collisionCircleDiameter > -1) ? 1 : 0; - if (bucket.glyphOffsetArray.length >= SymbolBucket.MAX_GLYPHS) warnOnce( + if (bucket.glyphOffsetArray.length >= SymbolBucket$1.MAX_GLYPHS) warnOnce( "Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907" ); @@ -32881,6 +34663,8 @@ function addSymbol(bucket , bucket.addToSortKeyRanges(bucket.symbolInstances.length, feature.sortKey); } + const projectedAnchor = collisionFeatureAnchor; + bucket.symbolInstances.emplaceBack( projectedAnchor.x, projectedAnchor.y, @@ -32933,4128 +34717,4325 @@ function anchorIsTooClose(bucket , text , repeatDistance , anc } // -const vectorTileFeatureTypes$2 = vectorTile.VectorTileFeature.types; - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - +const layout$1 = createLayout([ + {type: 'Float32', name: 'a_globe_pos', components: 3}, + {type: 'Float32', name: 'a_merc_pos', components: 2}, + {type: 'Float32', name: 'a_uv', components: 2} +]); +const {members, size, alignment} = layout$1; - - - - - - - - - - - +// - - - - - + -// 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 +const posAttributesGlobeExt = createLayout([ + {name: 'a_pos_3', components: 3, type: 'Int16'}, +]); -// actually defined in symbol_attributes.js -// const placementOpacityAttributes = [ -// { name: 'a_fade_opacity', components: 1, type: 'Uint32' } -// ]; -const shaderOpacityAttributes = [ - {name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0} +var posAttributes = (createLayout([ + {name: 'a_pos', type: 'Int16', components: 2} +]) ); + +// + +const GLOBE_ZOOM_THRESHOLD_MIN = 5; +const GLOBE_ZOOM_THRESHOLD_MAX = 6; + +// At low zoom levels the globe gets rendered so that the scale at this +// latitude matches it's scale in a mercator map. The choice of latitude is +// a bit arbitrary. Different choices will match mercator more closely in different +// views. 45 is a good enough choice because: +// - it's half way from the pole to the equator +// - matches most middle latitudes reasonably well +// - biases towards increasing size rather than decreasing +// - makes the globe slightly larger at very low zoom levels, where it already +// covers less pixels than mercator (due to the curved surface) +// +// Changing this value will change how large a globe is rendered and could affect +// end users. This should only be done of the tradeoffs between change and improvement +// are carefully considered. +const GLOBE_SCALE_MATCH_LATITUDE = 45; + +const GLOBE_RADIUS = EXTENT / Math.PI / 2.0; +const GLOBE_METERS_TO_ECEF = mercatorZfromAltitude(1, 0.0) * 2.0 * GLOBE_RADIUS * Math.PI; +const GLOBE_NORMALIZATION_BIT_RANGE = 15; +const GLOBE_NORMALIZATION_MASK = (1 << (GLOBE_NORMALIZATION_BIT_RANGE - 1)) - 1; +const GLOBE_VERTEX_GRID_SIZE = 64; +const GLOBE_LATITUDINAL_GRID_LOD_TABLE = [GLOBE_VERTEX_GRID_SIZE, GLOBE_VERTEX_GRID_SIZE / 2, GLOBE_VERTEX_GRID_SIZE / 4]; +const TILE_SIZE = 512; + +const GLOBE_MIN = -GLOBE_RADIUS; +const GLOBE_MAX = GLOBE_RADIUS; + +const GLOBE_LOW_ZOOM_TILE_AABBS = [ + // z == 0 + new Aabb([GLOBE_MIN, GLOBE_MIN, GLOBE_MIN], [GLOBE_MAX, GLOBE_MAX, GLOBE_MAX]), + // z == 1 + new Aabb([GLOBE_MIN, GLOBE_MIN, GLOBE_MIN], [0, 0, GLOBE_MAX]), // x=0, y=0 + new Aabb([0, GLOBE_MIN, GLOBE_MIN], [GLOBE_MAX, 0, GLOBE_MAX]), // x=1, y=0 + new Aabb([GLOBE_MIN, 0, GLOBE_MIN], [0, GLOBE_MAX, GLOBE_MAX]), // x=0, y=1 + new Aabb([0, 0, GLOBE_MIN], [GLOBE_MAX, GLOBE_MAX, GLOBE_MAX]) // x=1, y=1 ]; -function addVertex$1(array, projectedAnchorX, projectedAnchorY, projectedAnchorZ, tileAnchorX, tileAnchorY, ox, oy, tx, ty, sizeVertex, isSDF , pixelOffsetX, pixelOffsetY, minFontScaleX, minFontScaleY) { - const aSizeX = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[0])) : 0; - const aSizeY = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[1])) : 0; +function globePointCoordinate(tr , x , y , clampToHorizon = true) { + const point0 = scale$4([], tr._camera.position, tr.worldSize); + const point1 = [x, y, 1, 1]; - array.emplaceBack( - // a_pos_offset - projectedAnchorX, - projectedAnchorY, - Math.round(ox * 32), - Math.round(oy * 32), + transformMat4$1(point1, point1, tr.pixelMatrixInverse); + scale$3(point1, point1, 1 / point1[3]); - // a_data - tx, // x coordinate of symbol on glyph atlas texture - ty, // y coordinate of symbol on glyph atlas texture - (aSizeX << 1) + (isSDF ? 1 : 0), - aSizeY, - pixelOffsetX * 16, - pixelOffsetY * 16, - minFontScaleX * 256, - minFontScaleY * 256, + const p0p1 = sub$2([], point1, point0); + const dir = normalize$4([], p0p1); - // a_posz - projectedAnchorZ, - tileAnchorX, - tileAnchorY, - 0 - ); -} + // Find closest point on the sphere to the ray. This is a bit more involving operation + // if the ray is not intersecting with the sphere, in which case we "clamp" the ray + // to the surface of the sphere, i.e. find a tangent vector that originates from the camera position + const m = tr.globeMatrix; + const globeCenter = [m[12], m[13], m[14]]; + const p0toCenter = sub$2([], globeCenter, point0); + const p0toCenterDist = length$4(p0toCenter); + const centerDir = normalize$4([], p0toCenter); + const radius = tr.worldSize / (2.0 * Math.PI); + const cosAngle = dot$5(centerDir, dir); -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); -} + const origoTangentAngle = Math.asin(radius / p0toCenterDist); + const origoDirAngle = Math.acos(cosAngle); -function containsRTLText(formattedText ) { - for (const section of formattedText.sections) { - if (stringContainsRTLText(section.text)) { - return true; - } + if (origoTangentAngle < origoDirAngle) { + if (!clampToHorizon) return null; + + // Find the tangent vector by interpolating between camera-to-globe and camera-to-click vectors. + // First we'll find a point P1 on the clicked ray that forms a right-angled triangle with the camera position + // and the center of the globe. Angle of the tanget vector is then used as the interpolation factor + const clampedP1 = [], origoToP1 = []; + + scale$4(clampedP1, dir, p0toCenterDist / cosAngle); + normalize$4(origoToP1, sub$2(origoToP1, clampedP1, p0toCenter)); + normalize$4(dir, add$4(dir, p0toCenter, scale$4(dir, origoToP1, Math.tan(origoTangentAngle) * p0toCenterDist))); } - return false; -} -class SymbolBuffers { - - + const pointOnGlobe = []; + const ray = new Ray(point0, dir); - - + ray.closestPointOnSphere(globeCenter, radius, pointOnGlobe); - - + // Transform coordinate axes to find lat & lng of the position + const xa = normalize$4([], getColumn(m, 0)); + const ya = normalize$4([], getColumn(m, 1)); + const za = normalize$4([], getColumn(m, 2)); - - + const xp = dot$5(xa, pointOnGlobe); + const yp = dot$5(ya, pointOnGlobe); + const zp = dot$5(za, pointOnGlobe); - - + const lat = radToDeg(Math.asin(-yp / radius)); + let lng = radToDeg(Math.atan2(xp, zp)); - + // Check that the returned longitude angle is not wrapped + lng = tr.center.lng + shortestAngle(tr.center.lng, lng); - constructor(programConfigurations ) { - this.layoutVertexArray = new StructArrayLayout4i4ui4i4i32(); - this.indexArray = new StructArrayLayout3ui6(); - this.programConfigurations = programConfigurations; - this.segments = new SegmentVector(); - this.dynamicLayoutVertexArray = new StructArrayLayout3f12(); - this.opacityVertexArray = new StructArrayLayout1ul4(); - this.placedSymbolArray = new PlacedSymbolArray(); + const mx = mercatorXfromLng(lng); + const my = clamp(mercatorYfromLat(lat), 0, 1); + + return new MercatorCoordinate(mx, my); +} + +class Arc { + constructor(p0 , p1 , center ) { + this.a = sub$2([], p0, center); + this.b = sub$2([], p1, center); + this.center = center; + const an = normalize$4([], this.a); + const bn = normalize$4([], this.b); + this.angle = Math.acos(dot$5(an, bn)); } - isEmpty() { - return this.layoutVertexArray.length === 0 && - this.indexArray.length === 0 && - this.dynamicLayoutVertexArray.length === 0 && - this.opacityVertexArray.length === 0; + + + + +} + +function slerp(a , b , angle , t ) { + const sina = Math.sin(angle); + return a * (Math.sin((1.0 - t) * angle) / sina) + b * (Math.sin(t * angle) / sina); +} + +// Computes local extremum point of an arc on one of the dimensions (x, y or z), +// i.e. value of a point where d/dt*f(x,y,t) == 0 +function localExtremum(arc , dim ) { + // d/dt*slerp(x,y,t) = 0 + // => t = (1/a)*atan(y/(x*sin(a))-1/tan(a)), x > 0 + // => t = (1/a)*(pi/2), x == 0 + if (arc.angle === 0) { + return null; } - upload(context , dynamicIndexBuffer , upload , update ) { - if (this.isEmpty()) { - return; - } + let t ; + if (arc.a[dim] === 0) { + t = (1.0 / arc.angle) * 0.5 * Math.PI; + } else { + t = 1.0 / arc.angle * Math.atan(arc.b[dim] / arc.a[dim] / Math.sin(arc.angle) - 1.0 / Math.tan(arc.angle)); + } - if (upload) { - this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, symbolLayoutAttributes.members); - this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer); - 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; - } - if (upload || update) { - this.programConfigurations.upload(context); - } + if (t < 0 || t > 1) { + return null; } - destroy() { - if (!this.layoutVertexBuffer) return; - this.layoutVertexBuffer.destroy(); - this.indexBuffer.destroy(); - this.programConfigurations.destroy(); - this.segments.destroy(); - this.dynamicLayoutVertexBuffer.destroy(); - this.opacityVertexBuffer.destroy(); + return slerp(arc.a[dim], arc.b[dim], arc.angle, clamp(t, 0.0, 1.0)) + arc.center[dim]; +} + +function globeTileBounds(id ) { + if (id.z <= 1) { + return GLOBE_LOW_ZOOM_TILE_AABBS[id.z + id.y * 2 + id.x]; } + + // After zoom 1 surface function is monotonic for all tile patches + // => it is enough to project corner points + const [min, max] = globeTileLatLngCorners(id); + + const corners = [ + latLngToECEF(min[0], min[1]), + latLngToECEF(min[0], max[1]), + latLngToECEF(max[0], min[1]), + latLngToECEF(max[0], max[1]) + ]; + + const bMin = [GLOBE_MAX, GLOBE_MAX, GLOBE_MAX]; + const bMax = [GLOBE_MIN, GLOBE_MIN, GLOBE_MIN]; + + for (const p of corners) { + bMin[0] = Math.min(bMin[0], p[0]); + bMin[1] = Math.min(bMin[1], p[1]); + bMin[2] = Math.min(bMin[2], p[2]); + + bMax[0] = Math.max(bMax[0], p[0]); + bMax[1] = Math.max(bMax[1], p[1]); + bMax[2] = Math.max(bMax[2], p[2]); + } + + return new Aabb(bMin, bMax); } -register('SymbolBuffers', SymbolBuffers); +function aabbForTileOnGlobe(tr , numTiles , tileId ) { + const scale = numTiles / tr.worldSize; -class CollisionBuffers { - - - + const mx = Number.MAX_VALUE; + const cornerMax = [-mx, -mx, -mx]; + const cornerMin = [mx, mx, mx]; + const m = identity$3(new Float64Array(16)); + scale$5(m, m, [scale, scale, scale]); + multiply$5(m, m, tr.globeMatrix); - - + if (tileId.z <= 1) { + // Compute minimum bounding box that fully encapsulates + // transformed corners of the local aabb + const aabb = globeTileBounds(tileId); + const corners = aabb.getCorners(); - + for (let i = 0; i < corners.length; i++) { + transformMat4$2(corners[i], corners[i], m); + min$2(cornerMin, cornerMin, corners[i]); + max$2(cornerMax, cornerMax, corners[i]); + } - - + return new Aabb(cornerMin, cornerMax); + } - - + // Find minimal aabb for a tile. Correct solution would be to compute bounding box that + // fully encapsulates the curved patch that represents the tile on globes surface. + // This can be simplified a bit as the globe transformation is constrained: + // 1. Camera always faces the center point on the map + // 2. Camera is always above (z-coordinate) all of the tiles + // 3. Up direction of the coordinate space (pixel space) is always +z. This means that + // the "highest" point of the map is at the center. + // 4. z-coordinate of any point in any tile descends as a function of the distance from the center - constructor(LayoutArray , - layoutAttributes , - IndexArray ) { - this.layoutVertexArray = new LayoutArray(); - this.layoutAttributes = layoutAttributes; - this.indexArray = new IndexArray(); - this.segments = new SegmentVector(); - this.collisionVertexArray = new StructArrayLayout2ub2f12(); - this.collisionVertexArrayExt = new StructArrayLayout3f12(); + // Simplified aabb is computed by first encapsulating 4 transformed corner points of the tile. + // The resulting aabb is not complete yet as curved edges of the tile might span outside of the boundaries. + // It is enough to extend the aabb to contain only the edge that's closest to the center point. + const [nw, se] = globeTileLatLngCorners(tileId); + const bounds = new LngLatBounds(); + bounds.setSouthWest([nw[1], se[0]]); + bounds.setNorthEast([se[1], nw[0]]); + + const corners = [ + latLngToECEF(bounds.getSouth(), bounds.getWest()), + latLngToECEF(bounds.getSouth(), bounds.getEast()), + latLngToECEF(bounds.getNorth(), bounds.getEast()), + latLngToECEF(bounds.getNorth(), bounds.getWest()) + ]; + + // Note that here we're transforming the corners to world space while finding the min/max values. + for (let i = 0; i < corners.length; i++) { + transformMat4$2(corners[i], corners[i], m); + min$2(cornerMin, cornerMin, corners[i]); + max$2(cornerMax, cornerMax, corners[i]); } - 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); - this.collisionVertexBufferExt = context.createVertexBuffer(this.collisionVertexArrayExt, collisionVertexAttributesExt.members, true); + if (bounds.contains(tr.center)) { + // Extend the aabb by encapsulating the center point + cornerMax[2] = 0.0; + const point = tr.point; + const center = [point.x * scale, point.y * scale, 0]; + min$2(cornerMin, cornerMin, center); + max$2(cornerMax, cornerMax, center); + + return new Aabb(cornerMin, cornerMax); } - destroy() { - if (!this.layoutVertexBuffer) return; - this.layoutVertexBuffer.destroy(); - this.indexBuffer.destroy(); - this.segments.destroy(); - this.collisionVertexBuffer.destroy(); - this.collisionVertexBufferExt.destroy(); + // Compute parameters describing edges of the tile (i.e. arcs) on the globe surface. + // Vertical edges revolves around the globe origin whereas horizontal edges revolves around the y-axis. + const globeCenter = [m[12], m[13], m[14]]; + + const centerLng = tr.center.lng; + const centerLat = clamp(tr.center.lat, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); + const center = [mercatorXfromLng(centerLng), mercatorYfromLat(centerLat)]; + + const tileCenterLng = bounds.getCenter().lng; + const tileCenterLat = clamp(bounds.getCenter().lat, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); + const tileCenter = [mercatorXfromLng(tileCenterLng), mercatorYfromLat(tileCenterLat)]; + let arcCenter = new Array(3); + let closestArcIdx = 0; + + let dx = center[0] - tileCenter[0]; + const dy = center[1] - tileCenter[1]; + + // Shortest distance might be across the antimeridian + if (dx > .5) { + dx -= 1; + } else if (dx < -.5) { + dx += 1; + } + + // Here we determine the arc which is closest to the map center point. + // Horizontal arcs origin = globeCenter. + // Vertical arcs origin = globeCenter + yAxis * shift. + // Where `shift` is determined by latitude. + if (Math.abs(dx) > Math.abs(dy)) { + closestArcIdx = dx >= 0 ? 1 : 3; + arcCenter = globeCenter; + } else { + closestArcIdx = dy >= 0 ? 0 : 2; + const yAxis = [m[4], m[5], m[6]]; + let shift ; + if (dy >= 0) { + shift = -Math.sin(degToRad(bounds.getSouth())) * GLOBE_RADIUS; + } else { + shift = -Math.sin(degToRad(bounds.getNorth())) * GLOBE_RADIUS; + } + arcCenter = scaleAndAdd$2(arcCenter, globeCenter, yAxis, shift); } + + const arcA = corners[closestArcIdx]; + const arcB = corners[(closestArcIdx + 1) % 4]; + + const closestArc = new Arc(arcA, arcB, arcCenter); + const arcBounds = [(localExtremum(closestArc, 0) || arcA[0]), + (localExtremum(closestArc, 1) || arcA[1]), + (localExtremum(closestArc, 2) || arcA[2])]; + + // Reduce height of the aabb to match height of the closest arc. This reduces false positives + // of tiles farther away from the center as they would otherwise intersect with far end + // of the view frustum + cornerMin[2] = Math.min(arcA[2], arcB[2]); + + min$2(cornerMin, cornerMin, arcBounds); + max$2(cornerMax, cornerMax, arcBounds); + + return new Aabb(cornerMin, cornerMax); } -register('CollisionBuffers', CollisionBuffers); +function globeTileLatLngCorners(id ) { + const tileScale = 1 << id.z; + const left = id.x / tileScale; + const right = (id.x + 1) / tileScale; + const top = id.y / tileScale; + const bottom = (id.y + 1) / tileScale; -/** - * 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 - * `collisionBoxArray`: collision data for use by foreground - * `this.text`: SymbolBuffers for text symbols - * `this.icons`: SymbolBuffers for icons - * `this.iconCollisionBox`: Debug SymbolBuffers for icon collision boxes - * `this.textCollisionBox`: Debug SymbolBuffers for text collision boxes - * 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 - */ -class SymbolBucket { - - + const latLngTL = [ latFromMercatorY(top), lngFromMercatorX(left) ]; + const latLngBR = [ latFromMercatorY(bottom), lngFromMercatorX(right) ]; - - - - - - - + return [latLngTL, latLngBR]; +} - - - - - - - - +function csLatLngToECEF(cosLat , sinLat , lng , radius = GLOBE_RADIUS) { + lng = degToRad(lng); + + // Convert lat & lng to spherical representation. Use zoom=0 as a reference + const sx = cosLat * Math.sin(lng) * radius; + const sy = -sinLat * radius; + const sz = cosLat * Math.cos(lng) * radius; + + return [sx, sy, sz]; +} + +function latLngToECEF(lat , lng , radius ) { + return csLatLngToECEF(Math.cos(degToRad(lat)), Math.sin(degToRad(lat)), lng, radius); +} + +function tileCoordToECEF(x , y , id ) { + const tiles = Math.pow(2.0, id.z); + const mx = (x / EXTENT + id.x) / tiles; + const my = (y / EXTENT + id.y) / tiles; + const lat = latFromMercatorY(my); + const lng = lngFromMercatorX(mx); + const pos = latLngToECEF(lat, lng); + return pos; +} + +function globeECEFOrigin(tileMatrix , id ) { + const origin = [0, 0, 0]; + const bounds = globeTileBounds(id.canonical); + const normalizationMatrix = globeNormalizeECEF(bounds); + transformMat4$2(origin, origin, normalizationMatrix); + transformMat4$2(origin, origin, tileMatrix); + return origin; +} + +function globeECEFNormalizationScale(bounds ) { + const maxExt = Math.max(...sub$2([], bounds.max, bounds.min)); + return GLOBE_NORMALIZATION_MASK / maxExt; +} + +function globeNormalizeECEF(bounds ) { + const m = identity$3(new Float64Array(16)); + const scale = globeECEFNormalizationScale(bounds); + scale$5(m, m, [scale, scale, scale]); + translate$1(m, m, negate$2([], bounds.min)); + return m; +} + +function globeDenormalizeECEF(bounds ) { + const m = identity$3(new Float64Array(16)); + const scale = 1.0 / globeECEFNormalizationScale(bounds); + translate$1(m, m, bounds.min); + scale$5(m, m, [scale, scale, scale]); + return m; +} + +function globeECEFUnitsToPixelScale(worldSize ) { + const localRadius = EXTENT / (2.0 * Math.PI); + const wsRadius = worldSize / (2.0 * Math.PI); + return wsRadius / localRadius; +} + +function globePixelsToTileUnits(zoom , id ) { + const ecefPerPixel = EXTENT / (TILE_SIZE * Math.pow(2, zoom)); + const normCoeff = globeECEFNormalizationScale(globeTileBounds(id)); + + return ecefPerPixel * normCoeff; +} + +function calculateGlobePosMatrix(x, y, worldSize, lng, lat) { + // transform the globe from reference coordinate space to world space + const scale = globeECEFUnitsToPixelScale(worldSize); + const offset = [x, y, -worldSize / (2.0 * Math.PI)]; + const m = identity$3(new Float64Array(16)); + translate$1(m, m, offset); + scale$5(m, m, [scale, scale, scale]); + rotateX$3(m, m, degToRad(-lat)); + rotateY$3(m, m, degToRad(-lng)); + return m; +} + +function calculateGlobeMatrix(tr ) { + const {x, y} = tr.point; + const {lng, lat} = tr._center; + return calculateGlobePosMatrix(x, y, tr.worldSize, lng, lat); +} + +function calculateGlobeLabelMatrix(tr , id ) { + const {x, y} = tr.point; + + // Map aligned label space for globe view is the non-rotated globe itself in pixel coordinates. + + // Camera is moved closer towards the ground near poles as part of + // compesanting the reprojection. This has to be compensated for the + // map aligned label space. Whithout this logic map aligned symbols + // would appear larger than intended. + const m = calculateGlobePosMatrix(x, y, tr.worldSize / tr._projectionScaler, 0, 0); + return multiply$5(m, m, globeDenormalizeECEF(globeTileBounds(id))); +} + +function calculateGlobeMercatorMatrix(tr ) { + const worldSize = tr.worldSize; + const point = tr.point; + + const mercatorZ = mercatorZfromAltitude(1, tr.center.lat) * worldSize; + const projectionScaler = mercatorZ / tr.pixelsPerMeter; + const zScale = tr.pixelsPerMeter; + const ws = worldSize / projectionScaler; - - + const posMatrix = identity$3(new Float64Array(16)); + translate$1(posMatrix, posMatrix, [point.x, point.y, 0.0]); + scale$5(posMatrix, posMatrix, [ws, ws, zScale]); - - - - - - - - - - - - - - - + return Float32Array.from(posMatrix); +} - - - +function globeToMercatorTransition(zoom ) { + return smoothstep(GLOBE_ZOOM_THRESHOLD_MIN, GLOBE_ZOOM_THRESHOLD_MAX, zoom); +} - - - - - - - - - - - - +function globeMatrixForTile(id , globeMatrix ) { + const decode = globeDenormalizeECEF(globeTileBounds(id)); + return mul$5(create$5(), globeMatrix, decode); +} - constructor(options ) { - this.collisionBoxArray = options.collisionBoxArray; - this.zoom = options.zoom; - this.overscaling = options.overscaling; - this.layers = options.layers; - this.layerIds = this.layers.map(layer => layer.id); - this.index = options.index; - this.pixelRatio = options.pixelRatio; - this.sourceLayerIndex = options.sourceLayerIndex; - this.hasPattern = false; - this.hasRTLText = false; - this.fullyClipped = false; - this.sortKeyRanges = []; +function globePoleMatrixForTile(z , x , tr ) { + const poleMatrix = identity$3(new Float64Array(16)); + const numTiles = 1 << z; + const xOffsetAngle = (x / numTiles - 0.5) * 360; + const point = tr.point; + const ws = tr.worldSize; + const s = tr.worldSize / (tr.tileSize * numTiles); - this.collisionCircleArray = []; - this.placementInvProjMatrix = identity$3([]); - this.placementViewportMatrix = identity$3([]); + translate$1(poleMatrix, poleMatrix, [point.x, point.y, -(ws / Math.PI / 2.0)]); + scale$5(poleMatrix, poleMatrix, [s, s, s]); + rotateX$3(poleMatrix, poleMatrix, degToRad(-tr._center.lat)); + rotateY$3(poleMatrix, poleMatrix, degToRad(-tr._center.lng + xOffsetAngle)); - const layer = this.layers[0]; - const unevaluatedLayoutValues = layer._unevaluatedLayout._values; + return Float32Array.from(poleMatrix); +} - this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']); - this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']); +function globeUseCustomAntiAliasing(painter , context , transform ) { + const transitionT = globeToMercatorTransition(transform.zoom); + const useContextAA = painter.style.map._antialias; + const hasStandardDerivatives = !!context.extStandardDerivatives; + const disabled = context.extStandardDerivativesForceOff || (painter.terrain && painter.terrain.exaggeration() > 0.0); + return transitionT === 0.0 && !useContextAA && !disabled && hasStandardDerivatives; +} - const layout = this.layers[0].layout; - const sortKey = layout.get('symbol-sort-key'); - const zOrder = layout.get('symbol-z-order'); - this.canOverlap = - layout.get('text-allow-overlap') || - layout.get('icon-allow-overlap') || - layout.get('text-ignore-placement') || - layout.get('icon-ignore-placement'); - this.sortFeaturesByKey = zOrder !== 'viewport-y' && sortKey.constantOr(1) !== undefined; - const zOrderByViewportY = zOrder === 'viewport-y' || (zOrder === 'auto' && !this.sortFeaturesByKey); - this.sortFeaturesByY = zOrderByViewportY && this.canOverlap; +function getGridMatrix(id , corners , latitudinalLod ) { + const [tl, br] = corners; + const S = 1.0 / GLOBE_VERTEX_GRID_SIZE; + const x = (br[1] - tl[1]) * S; + const latitudinalSubdivs = GLOBE_LATITUDINAL_GRID_LOD_TABLE[latitudinalLod]; + const y = (br[0] - tl[0]) / latitudinalSubdivs; + const tileZoom = 1 << id.z; + return [0, x, tileZoom, y, 0, id.y, tl[0], tl[1], S]; +} - this.writingModes = layout.get('text-writing-mode').map(wm => WritingMode[wm]); +function getLatitudinalLod(lat ) { + const UPPER_LATITUDE = MAX_MERCATOR_LATITUDE - 5.0; + lat = clamp(lat, -UPPER_LATITUDE, UPPER_LATITUDE) / UPPER_LATITUDE * 90.0; + // const t = Math.pow(1.0 - Math.cos(degToRad(lat)), 2); + const t = Math.pow(Math.abs(Math.sin(degToRad(lat))), 3); + const lod = Math.round(t * (GLOBE_LATITUDINAL_GRID_LOD_TABLE.length - 1)); + return lod; +} - this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id); +function globeCenterToScreenPoint(tr ) { + const pos = [0, 0, 0]; + const matrix = identity$3(new Float64Array(16)); + multiply$5(matrix, tr.pixelMatrix, tr.globeMatrix); + transformMat4$2(pos, pos, matrix); + return new pointGeometry(pos[0], pos[1]); +} - this.sourceID = options.sourceID; - } +function cameraPositionInECEF(tr ) { + // Here "center" is the center of the globe. We refer to transform._center + // (the surface of the map on the center of the screen) as "pivot" to avoid confusion. + const centerToPivot = latLngToECEF(tr._center.lat, tr._center.lng); - createArrays() { - this.text = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, property => /^text/.test(property))); - this.icon = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, property => /^icon/.test(property))); + // Set axis to East-West line tangent to sphere at pivot + const south = fromValues$4(0, 1, 0); + let axis = cross$2([], south, centerToPivot); - this.glyphOffsetArray = new GlyphOffsetArray(); - this.lineVertexArray = new SymbolLineVertexArray(); - this.symbolInstances = new SymbolInstanceArray(); - } + // Rotate axis around pivot by bearing + const rotation = fromRotation$1([], -tr.angle, centerToPivot); + axis = transformMat4$2(axis, axis, rotation); - calculateGlyphDependencies(text , stack , textAlongLine , allowVerticalPlacement , doesAllowVerticalWritingMode ) { - for (let i = 0; i < text.length; i++) { - stack[text.charCodeAt(i)] = true; - if (allowVerticalPlacement && doesAllowVerticalWritingMode) { - const verticalChar = verticalizedCharacterMap[text.charAt(i)]; - if (verticalChar) { - stack[verticalChar.charCodeAt(0)] = true; - } - } - } - } + // Rotate camera around axis by pitch + fromRotation$1(rotation, -tr._pitch, axis); - populate(features , options , canonical , tileTransform ) { - const layer = this.layers[0]; - const layout = layer.layout; + const pivotToCamera = normalize$4([], centerToPivot); + scale$4(pivotToCamera, pivotToCamera, tr.cameraToCenterDistance / tr.pixelsPerMeter * GLOBE_METERS_TO_ECEF); + transformMat4$2(pivotToCamera, pivotToCamera, rotation); - const textFont = layout.get('text-font'); - const textField = layout.get('text-field'); - const iconImage = layout.get('icon-image'); - const hasText = - (textField.value.kind !== 'constant' || - (textField.value.value instanceof Formatted && !textField.value.value.isEmpty()) || - textField.value.value.toString().length > 0) && - (textFont.value.kind !== 'constant' || textFont.value.value.length > 0); - // we should always resolve the icon-image value if the property was defined in the style - // this allows us to fire the styleimagemissing event if image evaluation returns null - // the only way to distinguish between null returned from a coalesce statement with no valid images - // and null returned because icon-image wasn't defined is to check whether or not iconImage.parameters is an empty object - const hasIcon = iconImage.value.kind !== 'constant' || !!iconImage.value.value || Object.keys(iconImage.parameters).length > 0; - const symbolSortKey = layout.get('symbol-sort-key'); + return add$4([], centerToPivot, pivotToCamera); +} - this.features = []; +// Return the angle of the normal vector of the sphere relative to the camera. +// i.e. how much to tilt map-aligned markers. +function globeTiltAtLngLat(tr , lngLat ) { + const centerToPoint = latLngToECEF(lngLat.lat, lngLat.lng); + const centerToCamera = cameraPositionInECEF(tr); + const pointToCamera = subtract$2([], centerToCamera, centerToPoint); + return angle$1(pointToCamera, centerToPoint); +} - if (!hasText && !hasIcon) { - return; - } +function isLngLatBehindGlobe(tr , lngLat ) { + // We consider 1% past the horizon not occluded, this allows popups to be dragged around the globe edge without fading. + return (globeTiltAtLngLat(tr, lngLat) > Math.PI / 2 * 1.01); +} - const icons = options.iconDependencies; - const stacks = options.glyphDependencies; - const availableImages = options.availableImages; - const globalProperties = new EvaluationParameters(this.zoom); +const POLE_RAD = degToRad(85.0); +const POLE_COS = Math.cos(POLE_RAD); +const POLE_SIN = Math.sin(POLE_RAD); - for (const {feature, id, index, sourceLayerIndex} of features) { +class GlobeSharedBuffers { + + + + - const needGeometry = layer._featureFilter.needGeometry; - const evaluationFeature = toEvaluationFeature(feature, needGeometry); - if (!layer._featureFilter.filter(globalProperties, evaluationFeature, canonical)) { - continue; - } + + + - if (!needGeometry) evaluationFeature.geometry = loadGeometry(feature, canonical, tileTransform); + + - let text ; - if (hasText) { - // Expression evaluation will automatically coerce to Formatted - // but plain string token evaluation skips that pathway so do the - // conversion here. - const resolvedTokens = layer.getValueAndResolveTokens('text-field', evaluationFeature, canonical, availableImages); - const formattedText = Formatted.factory(resolvedTokens); - if (containsRTLText(formattedText)) { - this.hasRTLText = true; - } - if ( - !this.hasRTLText || // non-rtl text so can proceed safely - getRTLTextPluginStatus() === 'unavailable' || // We don't intend to lazy-load the rtl text plugin, so proceed with incorrect shaping - this.hasRTLText && plugin.isParsed() // Use the rtlText plugin to shape text - ) { - text = transformText$1(formattedText, layer, evaluationFeature); - } - } + constructor(context ) { + this._createGrid(context); + this._createPoles(context); + } - let icon ; - if (hasIcon) { - // Expression evaluation will automatically coerce to Image - // but plain string token evaluation skips that pathway so do the - // conversion here. - const resolvedTokens = layer.getValueAndResolveTokens('icon-image', evaluationFeature, canonical, availableImages); - if (resolvedTokens instanceof ResolvedImage) { - icon = resolvedTokens; - } else { - icon = ResolvedImage.fromString(resolvedTokens); - } - } + destroy() { + this._poleIndexBuffer.destroy(); + this._gridBuffer.destroy(); + this._gridIndexBuffer.destroy(); + this._poleNorthVertexBuffer.destroy(); + this._poleSouthVertexBuffer.destroy(); + for (const segments of this._poleSegments) segments.destroy(); + for (const segments of this._gridSegments) segments.destroy(); - if (!text && !icon) { - continue; - } - const sortKey = this.sortFeaturesByKey ? - symbolSortKey.evaluate(evaluationFeature, {}, canonical) : - undefined; + if (this._wireframeIndexBuffer) { + this._wireframeIndexBuffer.destroy(); + for (const segments of this._wireframeSegments) segments.destroy(); + } + } - const symbolFeature = { - id, - text, - icon, - index, - sourceLayerIndex, - geometry: evaluationFeature.geometry, - properties: feature.properties, - type: vectorTileFeatureTypes$2[feature.type], - sortKey - }; - this.features.push(symbolFeature); + _createGrid(context ) { + const gridVertices = new StructArrayLayout2i4(); + const gridIndices = new StructArrayLayout3ui6(); - if (icon) { - icons[icon.name] = true; - } + const quadExt = GLOBE_VERTEX_GRID_SIZE; + const vertexExt = quadExt + 1; - if (text) { - const fontStack = textFont.evaluate(evaluationFeature, {}, canonical).join(','); - const textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point'; - this.allowVerticalPlacement = this.writingModes && this.writingModes.indexOf(WritingMode.vertical) >= 0; - for (const section of text.sections) { - if (!section.image) { - const doesAllowVerticalWritingMode = allowsVerticalWritingMode(text.toString()); - const sectionFont = section.fontStack || fontStack; - const sectionStack = stacks[sectionFont] = stacks[sectionFont] || {}; - this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, this.allowVerticalPlacement, doesAllowVerticalWritingMode); - } else { - // Add section image to the list of dependencies. - icons[section.image.name] = true; - } + for (let j = 0; j < vertexExt; j++) + for (let i = 0; i < vertexExt; i++) + gridVertices.emplaceBack(i, j); + + this._gridSegments = []; + for (let k = 0, primitiveOffset = 0; k < GLOBE_LATITUDINAL_GRID_LOD_TABLE.length; k++) { + const latitudinalLod = GLOBE_LATITUDINAL_GRID_LOD_TABLE[k]; + for (let j = 0; j < latitudinalLod; j++) { + for (let i = 0; i < quadExt; i++) { + const index = j * vertexExt + i; + gridIndices.emplaceBack(index + 1, index, index + vertexExt); + gridIndices.emplaceBack(index + vertexExt, index + vertexExt + 1, index + 1); } } - } - 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); - } + const numVertices = (latitudinalLod + 1) * vertexExt; + const numPrimitives = latitudinalLod * quadExt * 2; - if (this.sortFeaturesByKey) { - this.features.sort((a, b) => { - // a.sortKey is always a number when sortFeaturesByKey is true - return ((a.sortKey ) ) - ((b.sortKey ) ); - }); + this._gridSegments.push(SegmentVector.simpleSegment(0, primitiveOffset, numVertices, numPrimitives)); + primitiveOffset += numPrimitives; } - } - update(states , vtLayer , availableImages , imagePositions ) { - if (!this.stateDependentLayers.length) return; - this.text.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, availableImages, imagePositions); - this.icon.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, availableImages, imagePositions); + this._gridBuffer = context.createVertexBuffer(gridVertices, posAttributes.members); + this._gridIndexBuffer = context.createIndexBuffer(gridIndices, true); } - isEmpty() { - // When the bucket encounters only rtl-text but the plugin isn't loaded, no symbol instances will be created. - // In order for the bucket to be serialized, and not discarded as an empty bucket both checks are necessary. - return this.symbolInstances.length === 0 && !this.hasRTLText; - } + _createPoles(context ) { + const poleIndices = new StructArrayLayout3ui6(); + for (let i = 0; i <= GLOBE_VERTEX_GRID_SIZE; i++) { + poleIndices.emplaceBack(0, i + 1, i + 2); + } + this._poleIndexBuffer = context.createIndexBuffer(poleIndices, true); - uploadPending() { - return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload; - } + const northVertices = new StructArrayLayout7f28(); + const southVertices = new StructArrayLayout7f28(); + const polePrimitives = GLOBE_VERTEX_GRID_SIZE; + const poleVertices = GLOBE_VERTEX_GRID_SIZE + 2; + this._poleSegments = []; - upload(context ) { - if (!this.uploaded && this.hasDebugData()) { - this.textCollisionBox.upload(context); - this.iconCollisionBox.upload(context); + for (let zoom = 0, offset = 0; zoom < GLOBE_ZOOM_THRESHOLD_MIN; zoom++) { + const tiles = 1 << zoom; + const radius = tiles * TILE_SIZE / Math.PI / 2.0; + const endAngle = 360.0 / tiles; + + northVertices.emplaceBack(0, -radius, 0, 0, 0, 0.5, 0); // place the tip + southVertices.emplaceBack(0, -radius, 0, 0, 0, 0.5, 1); + + for (let i = 0; i <= GLOBE_VERTEX_GRID_SIZE; i++) { + const uvX = i / GLOBE_VERTEX_GRID_SIZE; + const angle = number(0, endAngle, uvX); + const [gx, gy, gz] = csLatLngToECEF(POLE_COS, POLE_SIN, angle, radius); + northVertices.emplaceBack(gx, gy, gz, 0, 0, uvX, 0); + southVertices.emplaceBack(gx, gy, gz, 0, 0, uvX, 1); + } + + this._poleSegments.push(SegmentVector.simpleSegment(offset, 0, poleVertices, polePrimitives)); + + offset += poleVertices; } - this.text.upload(context, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload); - this.icon.upload(context, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload); - this.uploaded = true; - } - destroyDebugData() { - this.textCollisionBox.destroy(); - this.iconCollisionBox.destroy(); + this._poleNorthVertexBuffer = context.createVertexBuffer(northVertices, members, false); + this._poleSouthVertexBuffer = context.createVertexBuffer(southVertices, members, false); } - destroy() { - this.text.destroy(); - this.icon.destroy(); + getGridBuffers(latitudinalLod ) { + return [this._gridBuffer, this._gridIndexBuffer, this._gridSegments[latitudinalLod]]; + } - if (this.hasDebugData()) { - this.destroyDebugData(); - } + getPoleBuffers(z ) { + return [this._poleNorthVertexBuffer, this._poleSouthVertexBuffer, this._poleIndexBuffer, this._poleSegments[z]]; } - addToLineVertexArray(anchor , line ) { - const lineStartIndex = this.lineVertexArray.length; - if (anchor.segment !== undefined) { - let sumForwardLength = anchor.dist(line[anchor.segment + 1]); - let sumBackwardLength = anchor.dist(line[anchor.segment]); - const vertices = {}; - for (let 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 (let i = anchor.segment || 0; i >= 0; i--) { - vertices[i] = {x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumBackwardLength}; - if (i > 0) { - sumBackwardLength += line[i - 1].dist(line[i]); + getWirefameBuffers(context , lod ) { + if (!this._wireframeSegments) { + const wireframeIndices = new StructArrayLayout2ui4(); + const quadExt = GLOBE_VERTEX_GRID_SIZE; + const vertexExt = quadExt + 1; + + this._wireframeSegments = []; + for (let k = 0, primitiveOffset = 0; k < GLOBE_LATITUDINAL_GRID_LOD_TABLE.length; k++) { + const latitudinalLod = GLOBE_LATITUDINAL_GRID_LOD_TABLE[k]; + for (let j = 0; j < latitudinalLod; j++) { + for (let i = 0; i < quadExt; i++) { + const index = j * vertexExt + i; + wireframeIndices.emplaceBack(index, index + 1); + wireframeIndices.emplaceBack(index, index + vertexExt); + wireframeIndices.emplaceBack(index, index + vertexExt + 1); + } } + + const numVertices = (latitudinalLod + 1) * vertexExt; + const numPrimitives = latitudinalLod * quadExt * 3; + + this._wireframeSegments.push(SegmentVector.simpleSegment(0, primitiveOffset, numVertices, numPrimitives)); + primitiveOffset += numPrimitives; } - for (let i = 0; i < line.length; i++) { - const vertex = vertices[i]; - this.lineVertexArray.emplaceBack(vertex.x, vertex.y, vertex.tileUnitDistanceFromAnchor); - } + + this._wireframeIndexBuffer = context.createIndexBuffer(wireframeIndices); } - return { - lineStartIndex, - lineLength: this.lineVertexArray.length - lineStartIndex - }; + return [this._gridBuffer, this._wireframeIndexBuffer, this._wireframeSegments[lod]]; } +} - addSymbols(arrays , - quads , - sizeVertex , - lineOffset , - alongLine , - feature , - writingMode , - labelAnchor , - tileAnchor , - lineStartIndex , - lineLength , - associatedIconIndex , - availableImages , - canonical ) { - const indexArray = arrays.indexArray; - const layoutVertexArray = arrays.layoutVertexArray; +// + - const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, this.canOverlap ? feature.sortKey : undefined); - const glyphOffsetArrayStart = this.glyphOffsetArray.length; - const vertexStartIndex = segment.vertexLength; +function farthestPixelDistanceOnPlane(tr , pixelsPerMeter ) { + // Find the distance from the center point [width/2 + offset.x, height/2 + offset.y] to the + // center top point [width/2 + offset.x, 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]) + const fovAboveCenter = tr.fovAboveCenter; - const angle = (this.allowVerticalPlacement && writingMode === WritingMode.vertical) ? Math.PI / 2 : 0; + // Adjust distance to MSL by the minimum possible elevation visible on screen, + // this way the far plane is pushed further in the case of negative elevation. + const minElevationInPixels = tr.elevation ? + tr.elevation.getMinElevationBelowMSL() * pixelsPerMeter : + 0; + const cameraToSeaLevelDistance = ((tr._camera.position[2] * tr.worldSize) - minElevationInPixels) / Math.cos(tr._pitch); + const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * cameraToSeaLevelDistance / Math.sin(Math.max(Math.PI / 2.0 - tr._pitch - fovAboveCenter, 0.01)); - const sections = feature.text && feature.text.sections; + // Calculate z distance of the farthest fragment that should be rendered. + const furthestDistance = Math.sin(tr._pitch) * topHalfSurfaceDistance + cameraToSeaLevelDistance; + const horizonDistance = cameraToSeaLevelDistance * (1 / tr._horizonShift); - for (let i = 0; i < quads.length; i++) { - const {tl, tr, bl, br, tex, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY, glyphOffset, isSDF, sectionIndex} = quads[i]; - const index = segment.vertexLength; + // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance` + return Math.min(furthestDistance * 1.01, horizonDistance); +} - const y = glyphOffset[1]; - addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, labelAnchor.z, tileAnchor.x, tileAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY); - addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, labelAnchor.z, tileAnchor.x, tileAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY); - addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, labelAnchor.z, tileAnchor.x, tileAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY); - addVertex$1(layoutVertexArray, labelAnchor.x, labelAnchor.y, labelAnchor.z, tileAnchor.x, tileAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY); +function farthestPixelDistanceOnSphere(tr , pixelsPerMeter ) { + // Find farthest distance of the globe that is potentially visible to the camera. + // First check if the view frustum is fully covered by the map by casting a ray + // from the top left/right corner and see if it intersects with the globe. In case + // of no intersection we need to find distance to the horizon point where the + // surface normal is perpendicular to the camera forward direction. + const cameraDistance = tr.cameraToCenterDistance; + const centerPixelAltitude = tr._centerAltitude * pixelsPerMeter; - addDynamicAttributes(arrays.dynamicLayoutVertexArray, labelAnchor, angle); + const camera = tr._camera; + const forward = tr._camera.forward(); + const cameraPosition = add$4([], scale$4([], forward, -cameraDistance), [0, 0, centerPixelAltitude]); - indexArray.emplaceBack(index, index + 1, index + 2); - indexArray.emplaceBack(index + 1, index + 2, index + 3); + const globeRadius = tr.worldSize / (2.0 * Math.PI); + const globeCenter = [0, 0, -globeRadius]; - segment.vertexLength += 4; - segment.primitiveLength += 2; + const aspectRatio = tr.width / tr.height; + const tanFovAboveCenter = Math.tan(tr.fovAboveCenter); - this.glyphOffsetArray.emplaceBack(glyphOffset[0]); + const up = scale$4([], camera.up(), tanFovAboveCenter); + const right = scale$4([], camera.right(), tanFovAboveCenter * aspectRatio); + const dir = normalize$4([], add$4([], add$4([], forward, up), right)); - if (i === quads.length - 1 || sectionIndex !== quads[i + 1].sectionIndex) { - arrays.programConfigurations.populatePaintArrays(layoutVertexArray.length, feature, feature.index, {}, availableImages, canonical, sections && sections[sectionIndex]); - } - } + const pointOnGlobe = []; + const ray = new Ray(cameraPosition, dir); - arrays.placedSymbolArray.emplaceBack(labelAnchor.x, labelAnchor.y, labelAnchor.z, tileAnchor.x, tileAnchor.y, - glyphOffsetArrayStart, this.glyphOffsetArray.length - glyphOffsetArrayStart, vertexStartIndex, - lineStartIndex, lineLength, (tileAnchor.segment ), - sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0, - lineOffset[0], lineOffset[1], - writingMode, - // placedOrientation is null initially; will be updated to horizontal(1)/vertical(2) if placed - 0, - (false ), - // The crossTileID is only filled/used on the foreground for dynamic text anchors - 0, - associatedIconIndex, - // flipState is unknown initially; will be updated to flipRequired(1)/flipNotRequired(2) during line label reprojection - 0 - ); - } + let pixelDistance; + if (ray.closestPointOnSphere(globeCenter, globeRadius, pointOnGlobe)) { + const p0 = add$4([], pointOnGlobe, globeCenter); + const p1 = sub$2([], p0, cameraPosition); + // Globe is fully covering the view frustum. Project the intersection + // point to the camera view vector in order to find the pixel distance + pixelDistance = Math.cos(tr.fovAboveCenter) * length$4(p1); + } else { + // Background space is visible. Find distance to the point of the + // globe where surface normal is parallel to the view vector + const globeCenterToCamera = sub$2([], cameraPosition, globeCenter); + const cameraToGlobe = sub$2([], globeCenter, cameraPosition); + normalize$4(cameraToGlobe, cameraToGlobe); - _commitLayoutVertex(array , boxTileAnchorX , boxTileAnchorY , boxTileAnchorZ , tileAnchorX , tileAnchorY , extrude ) { - array.emplaceBack( - // pos - boxTileAnchorX, - boxTileAnchorY, - boxTileAnchorZ, - // a_anchor_pos - tileAnchorX, - tileAnchorY, - // extrude - Math.round(extrude.x), - Math.round(extrude.y)); + const cameraHeight = length$4(globeCenterToCamera) - globeRadius; + pixelDistance = Math.sqrt(cameraHeight * (cameraHeight + 2 * globeRadius)); + const angle = Math.acos(pixelDistance / (globeRadius + cameraHeight)) - Math.acos(dot$5(forward, cameraToGlobe)); + pixelDistance *= Math.cos(angle); } - _addCollisionDebugVertices(box , scale , arrays , boxTileAnchorX , boxTileAnchorY , boxTileAnchorZ , symbolInstance ) { - const segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray); - const index = segment.vertexLength; - const symbolTileAnchorX = symbolInstance.tileAnchorX; - const symbolTileAnchorY = symbolInstance.tileAnchorY; + return pixelDistance * 1.01; +} - for (let i = 0; i < 4; i++) { - arrays.collisionVertexArray.emplaceBack(0, 0, 0, 0); - } +// - arrays.collisionVertexArrayExt.emplaceBack(scale, -box.padding, -box.padding); - arrays.collisionVertexArrayExt.emplaceBack(scale, box.padding, -box.padding); - arrays.collisionVertexArrayExt.emplaceBack(scale, box.padding, box.padding); - arrays.collisionVertexArrayExt.emplaceBack(scale, -box.padding, box.padding); + + + - this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new pointGeometry(box.x1, box.y1)); - this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new pointGeometry(box.x2, box.y1)); - this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new pointGeometry(box.x2, box.y2)); - this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new pointGeometry(box.x1, box.y2)); + + + + + + + + - segment.vertexLength += 4; +function tileTransform(id , projection ) { + if (!projection.isReprojectedInTileSpace) { + return {scale: 1 << id.z, x: id.x, y: id.y, x2: id.x + 1, y2: id.y + 1, projection}; + } - const indexArray = (arrays.indexArray ); - indexArray.emplaceBack(index, index + 1); - indexArray.emplaceBack(index + 1, index + 2); - indexArray.emplaceBack(index + 2, index + 3); - indexArray.emplaceBack(index + 3, index); + const s = Math.pow(2, -id.z); - segment.primitiveLength += 4; - } + const x1 = (id.x) * s; + const x2 = (id.x + 1) * s; + const y1 = (id.y) * s; + const y2 = (id.y + 1) * s; - _addTextDebugCollisionBoxes(size , zoom , collisionBoxArray , startIndex , endIndex , instance ) { - for (let b = startIndex; b < endIndex; b++) { - const box = (collisionBoxArray.get(b) ); - const scale = this.getSymbolInstanceTextSize(size, instance, zoom, b); + const lng1 = lngFromMercatorX(x1); + const lng2 = lngFromMercatorX(x2); + const lat1 = latFromMercatorY(y1); + const lat2 = latFromMercatorY(y2); - this._addCollisionDebugVertices(box, scale, this.textCollisionBox, box.projectedAnchorX, box.projectedAnchorY, box.projectedAnchorZ, instance); - } - } + const p0 = projection.project(lng1, lat1); + const p1 = projection.project(lng2, lat1); + const p2 = projection.project(lng2, lat2); + const p3 = projection.project(lng1, lat2); - _addIconDebugCollisionBoxes(size , zoom , collisionBoxArray , startIndex , endIndex , instance ) { - for (let b = startIndex; b < endIndex; b++) { - const box = (collisionBoxArray.get(b) ); - const scale = this.getSymbolInstanceIconSize(size, zoom, b); + let minX = Math.min(p0.x, p1.x, p2.x, p3.x); + let minY = Math.min(p0.y, p1.y, p2.y, p3.y); + let maxX = Math.max(p0.x, p1.x, p2.x, p3.x); + let maxY = Math.max(p0.y, p1.y, p2.y, p3.y); - this._addCollisionDebugVertices(box, scale, this.iconCollisionBox, box.projectedAnchorX, box.projectedAnchorY, box.projectedAnchorZ, instance); - } - } + // we pick an error threshold for calculating the bbox that balances between performance and precision + const maxErr = s / 16; - generateCollisionDebugBuffers(zoom , collisionBoxArray ) { - if (this.hasDebugData()) { - this.destroyDebugData(); - } + function processSegment(pa, pb, ax, ay, bx, by) { + const mx = (ax + bx) / 2; + const my = (ay + by) / 2; - this.textCollisionBox = new CollisionBuffers(StructArrayLayout3i2i2i16, collisionBoxLayout.members, StructArrayLayout2ui4); - this.iconCollisionBox = new CollisionBuffers(StructArrayLayout3i2i2i16, collisionBoxLayout.members, StructArrayLayout2ui4); + const pm = projection.project(lngFromMercatorX(mx), latFromMercatorY(my)); + const err = Math.max(0, minX - pm.x, minY - pm.y, pm.x - maxX, pm.y - maxY); - const iconSize = evaluateSizeForZoom(this.iconSizeData, zoom); - const textSize = evaluateSizeForZoom(this.textSizeData, zoom); + minX = Math.min(minX, pm.x); + maxX = Math.max(maxX, pm.x); + minY = Math.min(minY, pm.y); + maxY = Math.max(maxY, pm.y); - for (let i = 0; i < this.symbolInstances.length; i++) { - const symbolInstance = this.symbolInstances.get(i); - this._addTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance); - this._addTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance); - this._addIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance); - this._addIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex, symbolInstance); + if (err > maxErr) { + processSegment(pa, pm, ax, ay, mx, my); + processSegment(pm, pb, mx, my, bx, by); } } - getSymbolInstanceTextSize(textSize , instance , zoom , boxIndex ) { - const symbolIndex = instance.rightJustifiedTextSymbolIndex >= 0 ? - instance.rightJustifiedTextSymbolIndex : instance.centerJustifiedTextSymbolIndex >= 0 ? - instance.centerJustifiedTextSymbolIndex : instance.leftJustifiedTextSymbolIndex >= 0 ? - instance.leftJustifiedTextSymbolIndex : instance.verticalPlacedTextSymbolIndex >= 0 ? - instance.verticalPlacedTextSymbolIndex : boxIndex; + processSegment(p0, p1, x1, y1, x2, y1); + processSegment(p1, p2, x2, y1, x2, y2); + processSegment(p2, p3, x2, y2, x1, y2); + processSegment(p3, p0, x1, y2, x1, y1); + + // extend the bbox by max error to make sure coords don't go past tile extent + minX -= maxErr; + minY -= maxErr; + maxX += maxErr; + maxY += maxErr; - const symbol = this.text.placedSymbolArray.get(symbolIndex); - const featureSize = evaluateSizeForFeature(this.textSizeData, textSize, symbol) / ONE_EM; + const max = Math.max(maxX - minX, maxY - minY); + const scale = 1 / max; - return this.tilePixelRatio * featureSize; + return { + scale, + x: minX * scale, + y: minY * scale, + x2: maxX * scale, + y2: maxY * scale, + projection + }; +} + +function tileAABB(tr , numTiles , z , x , y , wrap , min , max , projection ) { + if (projection.name === 'globe') { + const tileId = new CanonicalTileID(z, x, y); + return aabbForTileOnGlobe(tr, numTiles, tileId); } - getSymbolInstanceIconSize(iconSize , zoom , index ) { - const symbol = this.icon.placedSymbolArray.get(index); - const featureSize = evaluateSizeForFeature(this.iconSizeData, iconSize, symbol); + const tt = tileTransform({z, x, y}, projection); + const tx = tt.x / tt.scale; + const ty = tt.y / tt.scale; + const tx2 = tt.x2 / tt.scale; + const ty2 = tt.y2 / tt.scale; - return this.tilePixelRatio * featureSize; + if (isNaN(tx) || isNaN(tx2) || isNaN(ty) || isNaN(ty2)) { + assert_1(false); } - _commitDebugCollisionVertexUpdate(array , scale , padding ) { - array.emplaceBack(scale, -padding, -padding); - array.emplaceBack(scale, padding, -padding); - array.emplaceBack(scale, padding, padding); - array.emplaceBack(scale, -padding, padding); - } + return new Aabb( + [(wrap + tx) * numTiles, numTiles * ty, min], + [(wrap + tx2) * numTiles, numTiles * ty2, max]); +} - _updateTextDebugCollisionBoxes(size , zoom , collisionBoxArray , startIndex , endIndex , instance ) { - for (let b = startIndex; b < endIndex; b++) { - const box = (collisionBoxArray.get(b) ); - const scale = this.getSymbolInstanceTextSize(size, instance, zoom, b); - const array = this.textCollisionBox.collisionVertexArrayExt; - this._commitDebugCollisionVertexUpdate(array, scale, box.padding); - } - } +function getTilePoint(tileTransform , {x, y} , wrap = 0) { + return new pointGeometry( + ((x - wrap) * tileTransform.scale - tileTransform.x) * EXTENT, + (y * tileTransform.scale - tileTransform.y) * EXTENT); +} - _updateIconDebugCollisionBoxes(size , zoom , collisionBoxArray , startIndex , endIndex ) { - for (let b = startIndex; b < endIndex; b++) { - const box = (collisionBoxArray.get(b) ); - const scale = this.getSymbolInstanceIconSize(size, zoom, b); - const array = this.iconCollisionBox.collisionVertexArrayExt; - this._commitDebugCollisionVertexUpdate(array, scale, box.padding); - } - } +function getTileVec3(tileTransform , coord , wrap = 0) { + const x = ((coord.x - wrap) * tileTransform.scale - tileTransform.x) * EXTENT; + const y = (coord.y * tileTransform.scale - tileTransform.y) * EXTENT; + return fromValues$4(x, y, altitudeFromMercatorZ(coord.z, coord.y)); +} - updateCollisionDebugBuffers(zoom , collisionBoxArray ) { - if (!this.hasDebugData()) { - return; - } +// - if (this.hasTextCollisionBoxData()) this.textCollisionBox.collisionVertexArrayExt.clear(); - if (this.hasIconCollisionBoxData()) this.iconCollisionBox.collisionVertexArrayExt.clear(); + + + + + - const iconSize = evaluateSizeForZoom(this.iconSizeData, zoom); - const textSize = evaluateSizeForZoom(this.textSizeData, zoom); + + + + + - for (let i = 0; i < this.symbolInstances.length; i++) { - const symbolInstance = this.symbolInstances.get(i); - this._updateTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance); - this._updateTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance); - this._updateIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex); - this._updateIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex); - } + + + + + - if (this.hasTextCollisionBoxData() && this.textCollisionBox.collisionVertexBufferExt) { - this.textCollisionBox.collisionVertexBufferExt.updateData(this.textCollisionBox.collisionVertexArrayExt); - } - if (this.hasIconCollisionBoxData() && this.iconCollisionBox.collisionVertexBufferExt) { - this.iconCollisionBox.collisionVertexBufferExt.updateData(this.iconCollisionBox.collisionVertexArrayExt); - } - } +const identity = identity$3(new Float32Array(16)); - // These flat arrays are meant to be quicker to iterate over than the source - // CollisionBoxArray - _deserializeCollisionBoxesForSymbol(collisionBoxArray , - textStartIndex , textEndIndex , - verticalTextStartIndex , verticalTextEndIndex , - iconStartIndex , iconEndIndex , - verticalIconStartIndex , verticalIconEndIndex ) { +class Projection { + + + + + + + + + + + + + + + - const collisionArrays = {}; - for (let k = textStartIndex; k < textEndIndex; k++) { - const box = (collisionBoxArray.get(k) ); - collisionArrays.textBox = {x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, padding: box.padding, projectedAnchorX: box.projectedAnchorX, projectedAnchorY: box.projectedAnchorY, projectedAnchorZ: box.projectedAnchorZ, tileAnchorX: box.tileAnchorX, tileAnchorY: box.tileAnchorY}; - collisionArrays.textFeatureIndex = box.featureIndex; - break; // Only one box allowed per instance - } - for (let k = verticalTextStartIndex; k < verticalTextEndIndex; k++) { - const box = (collisionBoxArray.get(k) ); - collisionArrays.verticalTextBox = {x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, padding: box.padding, projectedAnchorX: box.projectedAnchorX, projectedAnchorY: box.projectedAnchorY, projectedAnchorZ: box.projectedAnchorZ, tileAnchorX: box.tileAnchorX, tileAnchorY: box.tileAnchorY}; - collisionArrays.verticalTextFeatureIndex = box.featureIndex; - break; // Only one box allowed per instance - } - for (let k = iconStartIndex; k < iconEndIndex; k++) { - // An icon can only have one box now, so this indexing is a bit vestigial... - const box = (collisionBoxArray.get(k) ); - collisionArrays.iconBox = {x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, padding: box.padding, projectedAnchorX: box.projectedAnchorX, projectedAnchorY: box.projectedAnchorY, projectedAnchorZ: box.projectedAnchorZ, tileAnchorX: box.tileAnchorX, tileAnchorY: box.tileAnchorY}; - collisionArrays.iconFeatureIndex = box.featureIndex; - break; // Only one box allowed per instance - } - for (let k = verticalIconStartIndex; k < verticalIconEndIndex; k++) { - // An icon can only have one box now, so this indexing is a bit vestigial... - const box = (collisionBoxArray.get(k) ); - collisionArrays.verticalIconBox = {x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, padding: box.padding, projectedAnchorX: box.projectedAnchorX, projectedAnchorY: box.projectedAnchorY, projectedAnchorZ: box.projectedAnchorZ, tileAnchorX: box.tileAnchorX, tileAnchorY: box.tileAnchorY}; - collisionArrays.verticalIconFeatureIndex = box.featureIndex; - break; // Only one box allowed per instance - } - return collisionArrays; + constructor(options ) { + this.spec = options; + this.name = options.name; + this.wrap = false; + this.requiresDraping = false; + this.supportsWorldCopies = false; + this.supportsTerrain = false; + this.supportsFog = false; + this.supportsFreeCamera = false; + this.zAxisUnit = 'meters'; + this.isReprojectedInTileSpace = true; + this.unsupportedLayers = ['custom']; + this.center = [0, 0]; + this.range = [3.5, 7]; } - deserializeCollisionBoxes(collisionBoxArray ) { - this.collisionArrays = []; - for (let i = 0; i < this.symbolInstances.length; i++) { - const symbolInstance = this.symbolInstances.get(i); - this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol( - collisionBoxArray, - symbolInstance.textBoxStartIndex, - symbolInstance.textBoxEndIndex, - symbolInstance.verticalTextBoxStartIndex, - symbolInstance.verticalTextBoxEndIndex, - symbolInstance.iconBoxStartIndex, - symbolInstance.iconBoxEndIndex, - symbolInstance.verticalIconBoxStartIndex, - symbolInstance.verticalIconBoxEndIndex - )); - } + project(lng , lat ) { // eslint-disable-line + return {x: 0, y: 0, z: 0}; // overriden in subclasses } - hasTextData() { - return this.text.segments.get().length > 0; + unproject(x , y ) { // eslint-disable-line + return new LngLat$1(0, 0); // overriden in subclasses } - hasIconData() { - return this.icon.segments.get().length > 0; + projectTilePoint(x , y , _ ) { + return {x, y, z: 0}; } - hasDebugData() { - return this.textCollisionBox && this.iconCollisionBox; + locationPoint(tr , lngLat , terrain = true) { + return tr._coordinatePoint(tr.locationCoordinate(lngLat), terrain); } - hasTextCollisionBoxData() { - return this.hasDebugData() && this.textCollisionBox.segments.get().length > 0; + pixelsPerMeter(lat , worldSize ) { + return mercatorZfromAltitude(1, lat) * worldSize; } - hasIconCollisionBoxData() { - return this.hasDebugData() && this.iconCollisionBox.segments.get().length > 0; + // pixels-per-meter is used to describe relation between real world and pixel distances. + // `pixelSpaceConversion` can be used to convert the ratio from mercator projection to + // the currently active projection. + // + // `pixelSpaceConversion` is useful for converting between pixel spaces where some logic + // expects mercator pixels, such as raycasting where the scale is expected to be in + // mercator pixels. + pixelSpaceConversion(lat , worldSize , interpolationT ) { // eslint-disable-line + return 1.0; } - addIndicesForPlacedSymbol(iconOrText , placedSymbolIndex ) { - const placedSymbol = iconOrText.placedSymbolArray.get(placedSymbolIndex); - - const endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4; - for (let vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) { - iconOrText.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2); - iconOrText.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3); - } + farthestPixelDistance(tr ) { + return farthestPixelDistanceOnPlane(tr, tr.pixelsPerMeter); } - getSortedSymbolIndexes(angle ) { - if (this.sortedAngle === angle && this.symbolInstanceIndexes !== undefined) { - return this.symbolInstanceIndexes; - } - const sin = Math.sin(angle); - const cos = Math.cos(angle); - const rotatedYs = []; - const featureIndexes = []; - const result = []; + pointCoordinate(tr , x , y , z ) { + const horizonOffset = tr.horizonLineFromTop(false); + const clamped = new pointGeometry(x, Math.max(horizonOffset, y)); + return tr.rayIntersectionCoordinate(tr.pointRayIntersection(clamped, z)); + } - for (let i = 0; i < this.symbolInstances.length; ++i) { - result.push(i); - const symbolInstance = this.symbolInstances.get(i); - rotatedYs.push(Math.round(sin * symbolInstance.tileAnchorX + cos * symbolInstance.tileAnchorY) | 0); - featureIndexes.push(symbolInstance.featureIndex); + pointCoordinate3D(tr , x , y ) { + const p = new pointGeometry(x, y); + if (tr.elevation) { + return tr.elevation.pointCoordinate(p); + } else { + const mc = this.pointCoordinate(tr, p.x, p.y, 0); + return [mc.x, mc.y, mc.z]; } - - result.sort((aIndex, bIndex) => { - return (rotatedYs[aIndex] - rotatedYs[bIndex]) || - (featureIndexes[bIndex] - featureIndexes[aIndex]); - }); - - return result; } - addToSortKeyRanges(symbolInstanceIndex , sortKey ) { - const last = this.sortKeyRanges[this.sortKeyRanges.length - 1]; - if (last && last.sortKey === sortKey) { - last.symbolInstanceEnd = symbolInstanceIndex + 1; - } else { - this.sortKeyRanges.push({ - sortKey, - symbolInstanceStart: symbolInstanceIndex, - symbolInstanceEnd: symbolInstanceIndex + 1 - }); + isPointAboveHorizon(tr , p ) { + if (tr.elevation) { + const raycastOnTerrain = this.pointCoordinate3D(tr, p.x, p.y); + return !raycastOnTerrain; } + const horizon = tr.horizonLineFromTop(); + return p.y < horizon; } - sortFeatures(angle ) { - if (!this.sortFeaturesByY) return; - if (this.sortedAngle === angle) return; + createInversionMatrix(tr , id ) { // eslint-disable-line + return identity; + } - // 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; + createTileMatrix(tr , worldSize , id ) { + let scale, scaledX, scaledY; + const canonical = id.canonical; + const posMatrix = identity$3(new Float64Array(16)); - // 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. + if (this.isReprojectedInTileSpace) { + const cs = tileTransform(canonical, this); + scale = 1; + scaledX = cs.x + id.wrap * cs.scale; + scaledY = cs.y; + scale$5(posMatrix, posMatrix, [scale / cs.scale, scale / cs.scale, tr.pixelsPerMeter / worldSize]); + } else { + scale = worldSize / tr.zoomScale(canonical.z); + const unwrappedX = canonical.x + Math.pow(2, canonical.z) * id.wrap; + scaledX = unwrappedX * scale; + scaledY = canonical.y * scale; + } - // To avoid sorting the actual symbolInstance array we sort an array of indexes. - this.symbolInstanceIndexes = this.getSortedSymbolIndexes(angle); - this.sortedAngle = angle; + translate$1(posMatrix, posMatrix, [scaledX, scaledY, 0]); + scale$5(posMatrix, posMatrix, [scale / EXTENT, scale / EXTENT, 1]); - this.text.indexArray.clear(); - this.icon.indexArray.clear(); + return posMatrix; + } - this.featureSortOrder = []; + upVector(id , x , y ) { // eslint-disable-line + return [0, 0, 1]; + } - for (const i of this.symbolInstanceIndexes) { - const symbolInstance = this.symbolInstances.get(i); - this.featureSortOrder.push(symbolInstance.featureIndex); + upVectorScale(id , latitude , worldSize ) { // eslint-disable-line + return {metersToTile: 1}; + } +} - [ - symbolInstance.rightJustifiedTextSymbolIndex, - symbolInstance.centerJustifiedTextSymbolIndex, - symbolInstance.leftJustifiedTextSymbolIndex - ].forEach((index, i, array) => { - // Only add a given index the first time it shows up, - // to avoid duplicate opacity entries when multiple justifications - // share the same glyphs. - if (index >= 0 && array.indexOf(index) === i) { - this.addIndicesForPlacedSymbol(this.text, index); - } - }); +// - if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) { - this.addIndicesForPlacedSymbol(this.text, symbolInstance.verticalPlacedTextSymbolIndex); - } + + - if (symbolInstance.placedIconSymbolIndex >= 0) { - this.addIndicesForPlacedSymbol(this.icon, symbolInstance.placedIconSymbolIndex); - } +// based on https://github.com/d3/d3-geo-projection, MIT-licensed +class Albers extends Projection { + + + - if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) { - this.addIndicesForPlacedSymbol(this.icon, symbolInstance.verticalPlacedIconSymbolIndex); - } - } + constructor(options ) { + super(options); + this.range = [4, 7]; + this.center = options.center || [-96, 37.5]; + const [lat0, lat1] = this.parallels = options.parallels || [29.5, 45.5]; - if (this.text.indexBuffer) this.text.indexBuffer.updateData(this.text.indexArray); - if (this.icon.indexBuffer) this.icon.indexBuffer.updateData(this.icon.indexArray); + const sy0 = Math.sin(degToRad(lat0)); + this.n = (sy0 + Math.sin(degToRad(lat1))) / 2; + this.c = 1 + sy0 * (2 * this.n - sy0); + this.r0 = Math.sqrt(this.c) / this.n; } -} -register('SymbolBucket', SymbolBucket, { - omit: ['layers', 'collisionBoxArray', 'features', 'compareText'] -}); + project(lng , lat ) { + const {n, c, r0} = this; + const lambda = degToRad(lng - this.center[0]); + const phi = degToRad(lat); -// 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; + const r = Math.sqrt(c - 2 * n * Math.sin(phi)) / n; + const x = r * Math.sin(lambda * n); + const y = r * Math.cos(lambda * n) - r0; + return {x, y, z: 0}; + } -SymbolBucket.addDynamicAttributes = addDynamicAttributes; + unproject(x , y ) { + const {n, c, r0} = this; + const r0y = r0 + y; + let l = Math.atan2(x, Math.abs(r0y)) * Math.sign(r0y); + if (r0y * n < 0) { + l -= Math.PI * Math.sign(x) * Math.sign(r0y); + } + const dt = degToRad(this.center[0]) * n; + l = wrap(l, -Math.PI - dt, Math.PI - dt); -// + const lng = radToDeg(l / n) + this.center[0]; + const phi = Math.asin(clamp((c - (x * x + r0y * r0y) * n * n) / (2 * n), -1, 1)); + const lat = clamp(radToDeg(phi), -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); -/** - * 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, (match, key ) => { - return key in properties ? String(properties[key]) : ''; - }); + return new LngLat$1(lng, lat); + } } -// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const layout$5 = new Properties({ - "symbol-placement": new DataConstantProperty(spec["layout_symbol"]["symbol-placement"]), - "symbol-spacing": new DataConstantProperty(spec["layout_symbol"]["symbol-spacing"]), - "symbol-avoid-edges": new DataConstantProperty(spec["layout_symbol"]["symbol-avoid-edges"]), - "symbol-sort-key": new DataDrivenProperty(spec["layout_symbol"]["symbol-sort-key"]), - "symbol-z-order": new DataConstantProperty(spec["layout_symbol"]["symbol-z-order"]), - "icon-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["icon-allow-overlap"]), - "icon-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["icon-ignore-placement"]), - "icon-optional": new DataConstantProperty(spec["layout_symbol"]["icon-optional"]), - "icon-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-rotation-alignment"]), - "icon-size": new DataDrivenProperty(spec["layout_symbol"]["icon-size"]), - "icon-text-fit": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit"]), - "icon-text-fit-padding": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit-padding"]), - "icon-image": new DataDrivenProperty(spec["layout_symbol"]["icon-image"]), - "icon-rotate": new DataDrivenProperty(spec["layout_symbol"]["icon-rotate"]), - "icon-padding": new DataConstantProperty(spec["layout_symbol"]["icon-padding"]), - "icon-keep-upright": new DataConstantProperty(spec["layout_symbol"]["icon-keep-upright"]), - "icon-offset": new DataDrivenProperty(spec["layout_symbol"]["icon-offset"]), - "icon-anchor": new DataDrivenProperty(spec["layout_symbol"]["icon-anchor"]), - "icon-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-pitch-alignment"]), - "text-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["text-pitch-alignment"]), - "text-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["text-rotation-alignment"]), - "text-field": new DataDrivenProperty(spec["layout_symbol"]["text-field"]), - "text-font": new DataDrivenProperty(spec["layout_symbol"]["text-font"]), - "text-size": new DataDrivenProperty(spec["layout_symbol"]["text-size"]), - "text-max-width": new DataDrivenProperty(spec["layout_symbol"]["text-max-width"]), - "text-line-height": new DataDrivenProperty(spec["layout_symbol"]["text-line-height"]), - "text-letter-spacing": new DataDrivenProperty(spec["layout_symbol"]["text-letter-spacing"]), - "text-justify": new DataDrivenProperty(spec["layout_symbol"]["text-justify"]), - "text-radial-offset": new DataDrivenProperty(spec["layout_symbol"]["text-radial-offset"]), - "text-variable-anchor": new DataConstantProperty(spec["layout_symbol"]["text-variable-anchor"]), - "text-anchor": new DataDrivenProperty(spec["layout_symbol"]["text-anchor"]), - "text-max-angle": new DataConstantProperty(spec["layout_symbol"]["text-max-angle"]), - "text-writing-mode": new DataConstantProperty(spec["layout_symbol"]["text-writing-mode"]), - "text-rotate": new DataDrivenProperty(spec["layout_symbol"]["text-rotate"]), - "text-padding": new DataConstantProperty(spec["layout_symbol"]["text-padding"]), - "text-keep-upright": new DataConstantProperty(spec["layout_symbol"]["text-keep-upright"]), - "text-transform": new DataDrivenProperty(spec["layout_symbol"]["text-transform"]), - "text-offset": new DataDrivenProperty(spec["layout_symbol"]["text-offset"]), - "text-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["text-allow-overlap"]), - "text-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["text-ignore-placement"]), - "text-optional": new DataConstantProperty(spec["layout_symbol"]["text-optional"]), -}); +const a1 = 1.340264; +const a2 = -0.081106; +const a3 = 0.000893; +const a4 = 0.003796; +const M = Math.sqrt(3) / 2; - - - - - - - - - - - - - - - - +class EqualEarth extends Projection { -const paint$6 = new Properties({ - "icon-opacity": new DataDrivenProperty(spec["paint_symbol"]["icon-opacity"]), - "icon-color": new DataDrivenProperty(spec["paint_symbol"]["icon-color"]), - "icon-halo-color": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-color"]), - "icon-halo-width": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-width"]), - "icon-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-blur"]), - "icon-translate": new DataConstantProperty(spec["paint_symbol"]["icon-translate"]), - "icon-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["icon-translate-anchor"]), - "text-opacity": new DataDrivenProperty(spec["paint_symbol"]["text-opacity"]), - "text-color": new DataDrivenProperty(spec["paint_symbol"]["text-color"], { runtimeType: ColorType, getOverride: (o) => o.textColor, hasOverride: (o) => !!o.textColor }), - "text-halo-color": new DataDrivenProperty(spec["paint_symbol"]["text-halo-color"]), - "text-halo-width": new DataDrivenProperty(spec["paint_symbol"]["text-halo-width"]), - "text-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["text-halo-blur"]), - "text-translate": new DataConstantProperty(spec["paint_symbol"]["text-translate"]), - "text-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["text-translate-anchor"]), -}); + project(lng , lat ) { + // based on https://github.com/d3/d3-geo, MIT-licensed + lat = lat / 180 * Math.PI; + lng = lng / 180 * Math.PI; + const theta = Math.asin(M * Math.sin(lat)); + const theta2 = theta * theta; + const theta6 = theta2 * theta2 * theta2; + const x = lng * Math.cos(theta) / (M * (a1 + 3 * a2 * theta2 + theta6 * (7 * a3 + 9 * a4 * theta2))); + const y = theta * (a1 + a2 * theta2 + theta6 * (a3 + a4 * theta2)); -// Note: without adding the explicit type annotation, Flow infers weaker types -// for these objects from their use in the constructor to StyleLayer, as -// {layout?: Properties<...>, paint: Properties<...>} -var properties$6 = ({ paint: paint$6, layout: layout$5 } - - ); + return { + x: (x / Math.PI + 0.5) * 0.5, + y: 1 - (y / Math.PI + 1) * 0.5, + z: 0 + }; + } -// + unproject(x , y ) { + // based on https://github.com/d3/d3-geo, MIT-licensed + x = (2 * x - 0.5) * Math.PI; + y = (2 * (1 - y) - 1) * Math.PI; + let theta = y; + let theta2 = theta * theta; + let theta6 = theta2 * theta2 * theta2; -// This is an internal expression class. It is only used in GL JS and -// has GL JS dependencies which can break the standalone style-spec module -class FormatSectionOverride { - - + for (let i = 0, delta, fy, fpy; i < 12; ++i) { + fy = theta * (a1 + a2 * theta2 + theta6 * (a3 + a4 * theta2)) - y; + fpy = a1 + 3 * a2 * theta2 + theta6 * (7 * a3 + 9 * a4 * theta2); + delta = fy / fpy; + theta = clamp(theta - delta, -Math.PI / 3, Math.PI / 3); + theta2 = theta * theta; + theta6 = theta2 * theta2 * theta2; + if (Math.abs(delta) < 1e-12) break; + } - constructor(defaultValue ) { - assert_1(defaultValue.property.overrides !== undefined); - this.type = defaultValue.property.overrides ? defaultValue.property.overrides.runtimeType : NullType; - this.defaultValue = defaultValue; + const lambda = M * x * (a1 + 3 * a2 * theta2 + theta6 * (7 * a3 + 9 * a4 * theta2)) / Math.cos(theta); + const phi = Math.asin(Math.sin(theta) / M); + const lng = clamp(lambda * 180 / Math.PI, -180, 180); + const lat = clamp(phi * 180 / Math.PI, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); + + return new LngLat$1(lng, lat); } +} - evaluate(ctx ) { - if (ctx.formattedSection) { - const overrides = this.defaultValue.property.overrides; - if (overrides && overrides.hasOverride(ctx.formattedSection)) { - return overrides.getOverride(ctx.formattedSection); - } - } +// - if (ctx.feature && ctx.featureState) { - return this.defaultValue.evaluate(ctx.feature, ctx.featureState); - } + + - return this.defaultValue.property.specification.default; - } +class Equirectangular extends Projection { - eachChild(fn ) { - if (!this.defaultValue.isConstant()) { - const expr = ((this.defaultValue.value) ); - fn(expr._styleExpression.expression); - } + constructor(options ) { + super(options); + this.wrap = true; + this.supportsWorldCopies = true; } - // Cannot be statically evaluated, as the output depends on the evaluation context. - outputDefined() { - return false; + project(lng , lat ) { + const x = 0.5 + lng / 360; + const y = 0.5 - lat / 360; + return {x, y, z: 0}; } - serialize() { - return null; + unproject(x , y ) { + const lng = (x - 0.5) * 360; + const lat = clamp((0.5 - y) * 360, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); + return new LngLat$1(lng, lat); } } -register('FormatSectionOverride', FormatSectionOverride, {omit: ['defaultValue']}); - // -class SymbolStyleLayer extends StyleLayer { - - + + - - - +const halfPi = Math.PI / 2; - constructor(layer ) { - super(layer, properties$6); - } +function tany(y) { + return Math.tan((halfPi + y) / 2); +} - recalculate(parameters , availableImages ) { - super.recalculate(parameters, availableImages); +// based on https://github.com/d3/d3-geo, MIT-licensed +class LambertConformalConic extends Projection { + + - if (this.layout.get('icon-rotation-alignment') === 'auto') { - if (this.layout.get('symbol-placement') !== 'point') { - this.layout._values['icon-rotation-alignment'] = 'map'; - } else { - this.layout._values['icon-rotation-alignment'] = 'viewport'; - } - } + constructor(options ) { + super(options); + this.center = options.center || [0, 30]; + const [lat0, lat1] = this.parallels = options.parallels || [30, 30]; - if (this.layout.get('text-rotation-alignment') === 'auto') { - if (this.layout.get('symbol-placement') !== 'point') { - this.layout._values['text-rotation-alignment'] = 'map'; - } else { - this.layout._values['text-rotation-alignment'] = 'viewport'; - } - } + const y0 = degToRad(lat0); + const y1 = degToRad(lat1); + const cy0 = Math.cos(y0); + this.n = y0 === y1 ? Math.sin(y0) : Math.log(cy0 / Math.cos(y1)) / Math.log(tany(y1) / tany(y0)); + this.f = cy0 * Math.pow(tany(y0), this.n) / this.n; + } - // 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'); - } + project(lng , lat ) { + lat = degToRad(lat); + lng = degToRad(lng - this.center[0]); - const writingModes = this.layout.get('text-writing-mode'); - if (writingModes) { - // remove duplicates, preserving order - const deduped = []; - for (const m of writingModes) { - if (deduped.indexOf(m) < 0) deduped.push(m); - } - this.layout._values['text-writing-mode'] = deduped; - } else if (this.layout.get('symbol-placement') === 'point') { - // default value for 'point' placement symbols - this.layout._values['text-writing-mode'] = ['horizontal']; + const epsilon = 1e-6; + const {n, f} = this; + + if (f > 0) { + if (lat < -halfPi + epsilon) lat = -halfPi + epsilon; } else { - // default value for 'line' placement symbols - this.layout._values['text-writing-mode'] = ['horizontal', 'vertical']; + if (lat > halfPi - epsilon) lat = halfPi - epsilon; } - this._setPaintOverrides(); + const r = f / Math.pow(tany(lat), n); + const x = r * Math.sin(n * lng); + const y = f - r * Math.cos(n * lng); + + return { + x: (x / Math.PI + 0.5) * 0.5, + y: 1 - (y / Math.PI + 0.5) * 0.5, + z: 0 + }; } - getValueAndResolveTokens(name , feature , canonical , availableImages ) { - const value = this.layout.get(name).evaluate(feature, {}, canonical, availableImages); - const unevaluated = this._unevaluatedLayout._values[name]; - if (!unevaluated.isDataDriven() && !isExpression(unevaluated.value) && value) { - return resolveTokens(feature.properties, value); - } + unproject(x , y ) { + x = (2 * x - 0.5) * Math.PI; + y = (2 * (1 - y) - 0.5) * Math.PI; + const {n, f} = this; + const fy = f - y; + const signFy = Math.sign(fy); + const r = Math.sign(n) * Math.sqrt(x * x + fy * fy); + let l = Math.atan2(x, Math.abs(fy)) * signFy; - return value; - } + if (fy * n < 0) l -= Math.PI * Math.sign(x) * signFy; - createBucket(parameters ) { - return new SymbolBucket(parameters); - } + const lng = clamp(radToDeg(l / n) + this.center[0], -180, 180); + const phi = 2 * Math.atan(Math.pow(f / r, 1 / n)) - halfPi; + const lat = clamp(radToDeg(phi), -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); - queryRadius() { - return 0; + return new LngLat$1(lng, lat); } +} - queryIntersectsFeature() { - assert_1(false); // Should take a different path in FeatureIndex - return false; - } +// - _setPaintOverrides() { - for (const overridable of properties$6.paint.overridableProperties) { - if (!SymbolStyleLayer.hasPaintOverride(this.layout, overridable)) { - continue; - } - const overriden = this.paint.get(overridable); - const override = new FormatSectionOverride(overriden); - const styleExpression = new StyleExpression(override, overriden.property.specification); - let expression = null; - if (overriden.value.kind === 'constant' || overriden.value.kind === 'source') { - expression = (new ZoomConstantExpression('source', styleExpression) ); - } else { - expression = (new ZoomDependentExpression('composite', - styleExpression, - overriden.value.zoomStops, - overriden.value._interpolationType) ); - } - this.paint._values[overridable] = new PossiblyEvaluatedPropertyValue(overriden.property, - expression, - overriden.parameters); - } + + + +class Mercator extends Projection { + + constructor(options ) { + super(options); + this.wrap = true; + this.supportsWorldCopies = true; + this.supportsTerrain = true; + this.supportsFog = true; + this.supportsFreeCamera = true; + this.isReprojectedInTileSpace = false; + this.unsupportedLayers = []; + this.range = null; + } + + project(lng , lat ) { + const x = mercatorXfromLng(lng); + const y = mercatorYfromLat(lat); + return {x, y, z: 0}; } - _handleOverridablePaintPropertyUpdate (name , oldValue , newValue ) { - if (!this.layout || oldValue.isDataDriven() || newValue.isDataDriven()) { - return false; - } - return SymbolStyleLayer.hasPaintOverride(this.layout, name); + unproject(x , y ) { + const lng = lngFromMercatorX(x); + const lat = latFromMercatorY(y); + return new LngLat$1(lng, lat); } +} - static hasPaintOverride(layout , propertyName ) { - const textField = layout.get('text-field'); - const property = properties$6.paint.properties[propertyName]; - let hasOverrides = false; +// - const checkSections = (sections) => { - for (const section of sections) { - if (property.overrides && property.overrides.hasOverride(section)) { - hasOverrides = true; - return; - } - } - }; + - if (textField.value.kind === 'constant' && textField.value.value instanceof Formatted) { - checkSections(textField.value.value.sections); - } else if (textField.value.kind === 'source') { +const maxPhi$1 = degToRad(MAX_MERCATOR_LATITUDE); - const checkExpression = (expression ) => { - if (hasOverrides) return; +class NaturalEarth extends Projection { - if (expression instanceof Literal && typeOf(expression.value) === FormattedType) { - const formatted = ((expression.value) ); - checkSections(formatted.sections); - } else if (expression instanceof FormatExpression) { - checkSections(expression.sections); - } else { - expression.eachChild(checkExpression); - } - }; + project(lng , lat ) { + // based on https://github.com/d3/d3-geo, MIT-licensed + lat = degToRad(lat); + lng = degToRad(lng); - const expr = ((textField.value) ); - if (expr._styleExpression) { - checkExpression(expr._styleExpression.expression); - } - } + const phi2 = lat * lat; + const phi4 = phi2 * phi2; + const x = lng * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))); + const y = lat * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))); - return hasOverrides; + return { + x: (x / Math.PI + 0.5) * 0.5, + y: 1 - (y / Math.PI + 1) * 0.5, + z: 0 + }; } - getProgramConfiguration(zoom ) { - return new ProgramConfiguration(this, zoom); - } -} + unproject(x , y ) { + // based on https://github.com/d3/d3-geo, MIT-licensed + x = (2 * x - 0.5) * Math.PI; + y = (2 * (1 - y) - 1) * Math.PI; + const epsilon = 1e-6; + let phi = y; + let i = 25; + let delta = 0; + let phi2 = phi * phi; -// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. + do { + phi2 = phi * phi; + const phi4 = phi2 * phi2; + delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + phi = clamp(phi - delta, -maxPhi$1, maxPhi$1); + } while (Math.abs(delta) > epsilon && --i > 0); - + phi2 = phi * phi; + const lambda = x / (0.8707 + phi2 * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))); - + const lng = clamp(radToDeg(lambda), -180, 180); + const lat = radToDeg(phi); - + return new LngLat$1(lng, lat); + } +} +// - - - - -const paint$7 = new Properties({ - "background-color": new DataConstantProperty(spec["paint_background"]["background-color"]), - "background-pattern": new CrossFadedProperty(spec["paint_background"]["background-pattern"]), - "background-opacity": new DataConstantProperty(spec["paint_background"]["background-opacity"]), -}); +const maxPhi = degToRad(MAX_MERCATOR_LATITUDE); -// Note: without adding the explicit type annotation, Flow infers weaker types -// for these objects from their use in the constructor to StyleLayer, as -// {layout?: Properties<...>, paint: Properties<...>} -var properties$7 = ({ paint: paint$7 } - - ); +class WinkelTripel extends Projection { -// + project(lng , lat ) { + lat = degToRad(lat); + lng = degToRad(lng); + const cosLat = Math.cos(lat); + const twoOverPi = 2 / Math.PI; + const alpha = Math.acos(cosLat * Math.cos(lng / 2)); + const sinAlphaOverAlpha = Math.sin(alpha) / alpha; + const x = 0.5 * (lng * twoOverPi + (2 * cosLat * Math.sin(lng / 2)) / sinAlphaOverAlpha) || 0; + const y = 0.5 * (lat + Math.sin(lat) / sinAlphaOverAlpha) || 0; + return { + x: (x / Math.PI + 0.5) * 0.5, + y: 1 - (y / Math.PI + 1) * 0.5, + z: 0 + }; + } - - + unproject(x , y ) { + // based on https://github.com/d3/d3-geo-projection, MIT-licensed + x = (2 * x - 0.5) * Math.PI; + y = (2 * (1 - y) - 1) * Math.PI; + let lambda = x; + let phi = y; + let i = 25; + const epsilon = 1e-6; + let dlambda = 0, dphi = 0; + do { + const cosphi = Math.cos(phi), + sinphi = Math.sin(phi), + sinphi2 = 2 * sinphi * cosphi, + sin2phi = sinphi * sinphi, + cos2phi = cosphi * cosphi, + coslambda2 = Math.cos(lambda / 2), + sinlambda2 = Math.sin(lambda / 2), + sinlambda = 2 * coslambda2 * sinlambda2, + sin2lambda2 = sinlambda2 * sinlambda2, + C = 1 - cos2phi * coslambda2 * coslambda2, + F = C ? 1 / C : 0, + E = C ? Math.acos(cosphi * coslambda2) * Math.sqrt(1 / C) : 0, + fx = 0.5 * (2 * E * cosphi * sinlambda2 + lambda * 2 / Math.PI) - x, + fy = 0.5 * (E * sinphi + phi) - y, + dxdlambda = 0.5 * F * (cos2phi * sin2lambda2 + E * cosphi * coslambda2 * sin2phi) + 1 / Math.PI, + dxdphi = F * (sinlambda * sinphi2 / 4 - E * sinphi * sinlambda2), + dydlambda = 0.125 * F * (sinphi2 * sinlambda2 - E * sinphi * cos2phi * sinlambda), + dydphi = 0.5 * F * (sin2phi * coslambda2 + E * sin2lambda2 * cosphi) + 0.5, + denominator = dxdphi * dydlambda - dydphi * dxdlambda; -class BackgroundStyleLayer extends StyleLayer { - - - + dlambda = (fy * dxdphi - fx * dydphi) / denominator; + dphi = (fx * dydlambda - fy * dxdlambda) / denominator; + lambda = clamp(lambda - dlambda, -Math.PI, Math.PI); + phi = clamp(phi - dphi, -maxPhi, maxPhi); - constructor(layer ) { - super(layer, properties$7); - } + } while ((Math.abs(dlambda) > epsilon || Math.abs(dphi) > epsilon) && --i > 0); - getProgramIds() { - const image = this.paint.get('background-pattern'); - return [image ? 'backgroundPattern' : 'background']; + return new LngLat$1(radToDeg(lambda), radToDeg(phi)); } } -// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. - - - - - - - +// - - - - - - + - - - - -const paint$8 = new Properties({ - "raster-opacity": new DataConstantProperty(spec["paint_raster"]["raster-opacity"]), - "raster-hue-rotate": new DataConstantProperty(spec["paint_raster"]["raster-hue-rotate"]), - "raster-brightness-min": new DataConstantProperty(spec["paint_raster"]["raster-brightness-min"]), - "raster-brightness-max": new DataConstantProperty(spec["paint_raster"]["raster-brightness-max"]), - "raster-saturation": new DataConstantProperty(spec["paint_raster"]["raster-saturation"]), - "raster-contrast": new DataConstantProperty(spec["paint_raster"]["raster-contrast"]), - "raster-resampling": new DataConstantProperty(spec["paint_raster"]["raster-resampling"]), - "raster-fade-duration": new DataConstantProperty(spec["paint_raster"]["raster-fade-duration"]), -}); - -// Note: without adding the explicit type annotation, Flow infers weaker types -// for these objects from their use in the constructor to StyleLayer, as -// {layout?: Properties<...>, paint: Properties<...>} -var properties$8 = ({ paint: paint$8 } - - ); -// +class CylindricalEqualArea extends Projection { + + - - + constructor(options ) { + super(options); + this.center = options.center || [0, 0]; + this.parallels = options.parallels || [0, 0]; + this.cosPhi = Math.max(0.01, Math.cos(degToRad(this.parallels[0]))); + // scale coordinates between 0 and 1 to avoid constraint issues + this.scale = 1 / (2 * Math.max(Math.PI * this.cosPhi, 1 / this.cosPhi)); + this.wrap = true; + this.supportsWorldCopies = true; + } -class RasterStyleLayer extends StyleLayer { - - - + project(lng , lat ) { + const {scale, cosPhi} = this; + const x = degToRad(lng) * cosPhi; + const y = Math.sin(degToRad(lat)) / cosPhi; - constructor(layer ) { - super(layer, properties$8); + return { + x: (x * scale) + 0.5, + y: (-y * scale) + 0.5, + z: 0 + }; } - getProgramIds() { - return ['raster']; + unproject(x , y ) { + const {scale, cosPhi} = this; + const x_ = (x - 0.5) / scale; + const y_ = -(y - 0.5) / scale; + const lng = clamp(radToDeg(x_) / cosPhi, -180, 180); + const y2 = y_ * cosPhi; + const y3 = Math.asin(clamp(y2, -1, 1)); + const lat = clamp(radToDeg(y3), -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); + + return new LngLat$1(lng, lat); } } // - - -/** - * Interface for custom style layers. This is a specification for - * implementers to model: it is not an exported method or class. - * - * Custom layers allow a user to render directly into the map's GL context using the map's camera. - * These layers can be added between any regular layers using {@link Map#addLayer}. - * - * Custom layers must have a unique `id` and must have the `type` of `"custom"`. - * They must implement `render` and may implement `prerender`, `onAdd` and `onRemove`. - * They can trigger rendering using {@link Map#triggerRepaint} - * and they should appropriately handle {@link Map.event:webglcontextlost} and - * {@link Map.event:webglcontextrestored}. - * - * The `renderingMode` property controls whether the layer is treated as a `"2d"` or `"3d"` map layer. Use: - * - `"renderingMode": "3d"` to use the depth buffer and share it with other layers - * - `"renderingMode": "2d"` to add a layer with no depth. If you need to use the depth buffer for a `"2d"` layer you must use an offscreen - * framebuffer and {@link CustomLayerInterface#prerender}. - * - * @interface CustomLayerInterface - * @property {string} id A unique layer id. - * @property {string} type The layer's type. Must be `"custom"`. - * @property {string} renderingMode Either `"2d"` or `"3d"`. Defaults to `"2d"`. - * @example - * // Custom layer implemented as ES6 class - * class NullIslandLayer { - * constructor() { - * this.id = 'null-island'; - * this.type = 'custom'; - * this.renderingMode = '2d'; - * } - * - * onAdd(map, gl) { - * const vertexSource = ` - * uniform mat4 u_matrix; - * void main() { - * gl_Position = u_matrix * vec4(0.5, 0.5, 0.0, 1.0); - * gl_PointSize = 20.0; - * }`; - * - * const fragmentSource = ` - * void main() { - * gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); - * }`; - * - * const vertexShader = gl.createShader(gl.VERTEX_SHADER); - * gl.shaderSource(vertexShader, vertexSource); - * gl.compileShader(vertexShader); - * const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); - * gl.shaderSource(fragmentShader, fragmentSource); - * gl.compileShader(fragmentShader); - * - * this.program = gl.createProgram(); - * gl.attachShader(this.program, vertexShader); - * gl.attachShader(this.program, fragmentShader); - * gl.linkProgram(this.program); - * } - * - * render(gl, matrix) { - * gl.useProgram(this.program); - * gl.uniformMatrix4fv(gl.getUniformLocation(this.program, "u_matrix"), false, matrix); - * gl.drawArrays(gl.POINTS, 0, 1); - * } - * } - * - * map.on('load', () => { - * map.addLayer(new NullIslandLayer()); - * }); - * @see [Example: Add a custom style layer](https://docs.mapbox.com/mapbox-gl-js/example/custom-style-layer/) - * @see [Example: Add a 3D model](https://docs.mapbox.com/mapbox-gl-js/example/add-3d-model/) - */ - -/** - * Optional method called when the layer has been added to the Map with {@link Map#addLayer}. This - * gives the layer a chance to initialize gl resources and register event listeners. - * - * @function - * @memberof CustomLayerInterface - * @instance - * @name onAdd - * @param {Map} map The Map this custom layer was just added to. - * @param {WebGLRenderingContext} gl The gl context for the map. - */ + + + + + -/** - * Optional method called when the layer has been removed from the Map with {@link Map#removeLayer}. This - * gives the layer a chance to clean up gl resources and event listeners. - * - * @function - * @memberof CustomLayerInterface - * @instance - * @name onRemove - * @param {Map} map The Map this custom layer was just added to. - * @param {WebGLRenderingContext} gl The gl context for the map. - */ +class Globe extends Mercator { -/** - * Optional method called during a render frame to allow a layer to prepare resources or render into a texture. - * - * The layer cannot make any assumptions about the current GL state and must bind a framebuffer before rendering. - * - * @function - * @memberof CustomLayerInterface - * @instance - * @name prerender - * @param {WebGLRenderingContext} gl The map's gl context. - * @param {Array} matrix The map's camera matrix. It projects spherical mercator - * coordinates to gl coordinates. The mercator coordinate `[0, 0]` represents the - * top left corner of the mercator world and `[1, 1]` represents the bottom right corner. When - * the `renderingMode` is `"3d"`, the z coordinate is conformal. A box with identical x, y, and z - * lengths in mercator units would be rendered as a cube. {@link MercatorCoordinate}.fromLngLat - * can be used to project a `LngLat` to a mercator coordinate. - */ + constructor(options ) { + super(options); + this.requiresDraping = true; + this.supportsWorldCopies = false; + this.supportsFog = true; + this.zAxisUnit = "pixels"; + this.unsupportedLayers = ['debug', 'custom']; + this.range = [3, 5]; + } -/** - * Called during a render frame allowing the layer to draw into the GL context. - * - * The layer can assume blending and depth state is set to allow the layer to properly - * blend and clip other layers. The layer cannot make any other assumptions about the - * current GL state. - * - * If the layer needs to render to a texture, it should implement the `prerender` method - * to do this and only use the `render` method for drawing directly into the main framebuffer. - * - * The blend function is set to `gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)`. This expects - * colors to be provided in premultiplied alpha form where the `r`, `g` and `b` values are already - * multiplied by the `a` value. If you are unable to provide colors in premultiplied form you - * may want to change the blend function to - * `gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)`. - * - * @function - * @memberof CustomLayerInterface - * @instance - * @name render - * @param {WebGLRenderingContext} gl The map's gl context. - * @param {Array} matrix The map's camera matrix. It projects spherical mercator - * coordinates to gl coordinates. The spherical mercator coordinate `[0, 0]` represents the - * top left corner of the mercator world and `[1, 1]` represents the bottom right corner. When - * the `renderingMode` is `"3d"`, the z coordinate is conformal. A box with identical x, y, and z - * lengths in mercator units would be rendered as a cube. {@link MercatorCoordinate}.fromLngLat - * can be used to project a `LngLat` to a mercator coordinate. - */ - - - - - - - - - + projectTilePoint(x , y , id ) { + const tiles = Math.pow(2.0, id.z); + const mx = (x / EXTENT + id.x) / tiles; + const my = (y / EXTENT + id.y) / tiles; + const lat = latFromMercatorY(my); + const lng = lngFromMercatorX(mx); + const pos = latLngToECEF(lat, lng); -function validateCustomStyleLayer(layerObject ) { - const errors = []; - const id = layerObject.id; + const bounds = globeTileBounds(id); + const normalizationMatrix = globeNormalizeECEF(bounds); + transformMat4$2(pos, pos, normalizationMatrix); - if (id === undefined) { - errors.push({ - message: `layers.${id}: missing required property "id"` - }); + return {x: pos[0], y: pos[1], z: pos[2]}; } - if (layerObject.render === undefined) { - errors.push({ - message: `layers.${id}: missing required method "render"` - }); + locationPoint(tr , lngLat ) { + const pos = latLngToECEF(lngLat.lat, lngLat.lng); + const up = normalize$4([], pos); + + const elevation = tr.elevation ? + tr.elevation.getAtPointOrZero(tr.locationCoordinate(lngLat), tr._centerAltitude) : + tr._centerAltitude; + + const upScale = mercatorZfromAltitude(1, 0) * EXTENT * elevation; + scaleAndAdd$2(pos, pos, up, upScale); + const matrix = identity$3(new Float64Array(16)); + multiply$5(matrix, tr.pixelMatrix, tr.globeMatrix); + transformMat4$2(pos, pos, matrix); + + return new pointGeometry(pos[0], pos[1]); } - if (layerObject.renderingMode && - layerObject.renderingMode !== '2d' && - layerObject.renderingMode !== '3d') { - errors.push({ - message: `layers.${id}: property "renderingMode" must be either "2d" or "3d"` - }); + pixelsPerMeter(lat , worldSize ) { + return mercatorZfromAltitude(1, 0) * worldSize; } - return errors; -} + pixelSpaceConversion(lat , worldSize , interpolationT ) { + // Using only the center latitude to determine scale causes the globe to rapidly change + // size as you pan up and down. As you approach the pole, the globe's size approaches infinity. + // This is because zoom levels are based on mercator. + // + // Instead, use a fixed reference latitude at lower zoom levels. And transition between + // this latitude and the center's latitude as you zoom in. This is a compromise that + // makes globe view more usable with existing camera parameters, styles and data. + const referenceScale = mercatorZfromAltitude(1, GLOBE_SCALE_MATCH_LATITUDE) * worldSize; + const centerScale = mercatorZfromAltitude(1, lat) * worldSize; + const combinedScale = number(referenceScale, centerScale, interpolationT); + return this.pixelsPerMeter(lat, worldSize) / combinedScale; + } -class CustomStyleLayer extends StyleLayer { + createTileMatrix(tr , worldSize , id ) { + const decode = globeDenormalizeECEF(globeTileBounds(id.canonical)); + return multiply$5(new Float64Array(16), tr.globeMatrix, decode); + } - + createInversionMatrix(tr , id ) { + const {center} = tr; + const matrix = identity$3(new Float64Array(16)); + const encode = globeNormalizeECEF(globeTileBounds(id)); + multiply$5(matrix, matrix, encode); + rotateY$3(matrix, matrix, degToRad(center.lng)); + rotateX$3(matrix, matrix, degToRad(center.lat)); + scale$5(matrix, matrix, [tr._projectionScaler, tr._projectionScaler, 1.0]); + return Float32Array.from(matrix); + } - constructor(implementation ) { - super(implementation, {}); - this.implementation = implementation; + pointCoordinate(tr , x , y , _ ) { + const coord = globePointCoordinate(tr, x, y, true); + if (!coord) { return new MercatorCoordinate(0, 0); } // This won't happen, is here for Flow + return coord; } - is3D() { - return this.implementation.renderingMode === '3d'; + pointCoordinate3D(tr , x , y ) { + const coord = this.pointCoordinate(tr, x, y, 0); + return [coord.x, coord.y, coord.z]; } - hasOffscreenPass() { - return this.implementation.prerender !== undefined; + isPointAboveHorizon(tr , p ) { + const raycastOnGlobe = globePointCoordinate(tr, p.x, p.y, false); + return !raycastOnGlobe; } - recalculate() {} - updateTransitions() {} - hasTransition() {} + farthestPixelDistance(tr ) { + const pixelsPerMeter = this.pixelsPerMeter(tr.center.lat, tr.worldSize); + const globePixelDistance = farthestPixelDistanceOnSphere(tr, pixelsPerMeter); + const t = globeToMercatorTransition(tr.zoom); + if (t > 0.0) { + const mercatorPixelsPerMeter = mercatorZfromAltitude(1, tr.center.lat) * tr.worldSize; + const mercatorPixelDistance = farthestPixelDistanceOnPlane(tr, mercatorPixelsPerMeter); + const pixelRadius = tr.worldSize / (2.0 * Math.PI); + const approxTileArcHalfAngle = Math.max(tr.width, tr.height) / tr.worldSize * Math.PI; + const padding = pixelRadius * (1.0 - Math.cos(approxTileArcHalfAngle)); - serialize() { - assert_1(false, "Custom layers cannot be serialized"); + // During transition to mercator we would like to keep + // the far plane lower to ensure that geometries (e.g. circles) that are far away and are not supposed + // to be rendered get culled out correctly. see https://github.com/mapbox/mapbox-gl-js/issues/11476 + // To achieve this we dampen the interpolation. + return number(globePixelDistance, mercatorPixelDistance + padding, Math.pow(t, 10.0)); + } + return globePixelDistance; } - onAdd(map ) { - if (this.implementation.onAdd) { - this.implementation.onAdd(map, map.painter.context.gl); - } + upVector(id , x , y ) { + const tiles = 1 << id.z; + const mercX = (x / EXTENT + id.x) / tiles; + const mercY = (y / EXTENT + id.y) / tiles; + return latLngToECEF(latFromMercatorY(mercY), lngFromMercatorX(mercX), 1.0); } - onRemove(map ) { - if (this.implementation.onRemove) { - this.implementation.onRemove(map, map.painter.context.gl); - } + upVectorScale(id ) { + return {metersToTile: GLOBE_METERS_TO_ECEF * globeECEFNormalizationScale(globeTileBounds(id))}; } } -// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. +// - + + - +function getProjection(config ) { - + const parallels = config.parallels; + const isDegenerateConic = parallels ? Math.abs(parallels[0] + parallels[1]) < 0.01 : false; + switch (config.name) { + case 'mercator': + return new Mercator(config); + case 'equirectangular': + return new Equirectangular(config); + case 'naturalEarth': + return new NaturalEarth(config); + case 'equalEarth': + return new EqualEarth(config); + case 'winkelTripel': + return new WinkelTripel(config); + case 'albers': + return isDegenerateConic ? new CylindricalEqualArea(config) : new Albers(config); + case 'lambertConformalConic': + return isDegenerateConic ? new CylindricalEqualArea(config) : new LambertConformalConic(config); + case 'globe': + return new Globe(config); + } - - - - - + throw new Error(`Invalid projection name: ${config.name}`); +} + +// +const vectorTileFeatureTypes = vectorTile.VectorTileFeature.types; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + -const paint$9 = new Properties({ - "sky-type": new DataConstantProperty(spec["paint_sky"]["sky-type"]), - "sky-atmosphere-sun": new DataConstantProperty(spec["paint_sky"]["sky-atmosphere-sun"]), - "sky-atmosphere-sun-intensity": new DataConstantProperty(spec["paint_sky"]["sky-atmosphere-sun-intensity"]), - "sky-gradient-center": new DataConstantProperty(spec["paint_sky"]["sky-gradient-center"]), - "sky-gradient-radius": new DataConstantProperty(spec["paint_sky"]["sky-gradient-radius"]), - "sky-gradient": new ColorRampProperty(spec["paint_sky"]["sky-gradient"]), - "sky-atmosphere-halo-color": new DataConstantProperty(spec["paint_sky"]["sky-atmosphere-halo-color"]), - "sky-atmosphere-color": new DataConstantProperty(spec["paint_sky"]["sky-atmosphere-color"]), - "sky-opacity": new DataConstantProperty(spec["paint_sky"]["sky-opacity"]), -}); + + + + + -// Note: without adding the explicit type annotation, Flow infers weaker types -// for these objects from their use in the constructor to StyleLayer, as -// {layout?: Properties<...>, paint: Properties<...>} -var properties$9 = ({ paint: paint$9 } - - ); + + + + -// +// 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' } +// ]; +const shaderOpacityAttributes = [ + {name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0} +]; + +function addVertex(array, tileAnchorX, tileAnchorY, ox, oy, tx, ty, sizeVertex, isSDF , pixelOffsetX, pixelOffsetY, minFontScaleX, minFontScaleY) { + const aSizeX = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[0])) : 0; + const aSizeY = sizeVertex ? Math.min(MAX_PACKED_SIZE, Math.round(sizeVertex[1])) : 0; + + array.emplaceBack( + // a_pos_offset + tileAnchorX, + tileAnchorY, + Math.round(ox * 32), + Math.round(oy * 32), -function getCelestialDirection(azimuth , altitude , leftHanded ) { - const up = fromValues$4(0, 0, 1); - const rotation = identity$4(create$6()); + // a_data + tx, // x coordinate of symbol on glyph atlas texture + ty, // y coordinate of symbol on glyph atlas texture + (aSizeX << 1) + (isSDF ? 1 : 0), + aSizeY, + pixelOffsetX * 16, + pixelOffsetY * 16, + minFontScaleX * 256, + minFontScaleY * 256 + ); +} - rotateY$2(rotation, rotation, leftHanded ? -degToRad(azimuth) + Math.PI : degToRad(azimuth)); - rotateX$2(rotation, rotation, -degToRad(altitude)); - transformQuat(up, up, rotation); +function addGlobeVertex(array, projAnchorX, projAnchorY, projAnchorZ, normX, normY, normZ) { + array.emplaceBack( + // a_globe_anchor + projAnchorX, + projAnchorY, + projAnchorZ, + + // a_globe_normal + normX, + normY, + normZ + ); +} - return normalize(up, up); +function updateGlobeVertexNormal(array , vertexIdx , normX , normY , normZ ) { + // Modify float32 array directly. 20 bytes per entry, 3xInt16 for position, 3xfloat32 for normal + const offset = vertexIdx * 5 + 2; + array.float32[offset + 0] = normX; + array.float32[offset + 1] = normY; + array.float32[offset + 2] = normZ; } -class SkyLayer extends StyleLayer { - - +function addDynamicAttributes(dynamicLayoutVertexArray , x , y , z , angle ) { + dynamicLayoutVertexArray.emplaceBack(x, y, z, angle); + dynamicLayoutVertexArray.emplaceBack(x, y, z, angle); + dynamicLayoutVertexArray.emplaceBack(x, y, z, angle); + dynamicLayoutVertexArray.emplaceBack(x, y, z, angle); +} + +function containsRTLText(formattedText ) { + for (const section of formattedText.sections) { + if (stringContainsRTLText(section.text)) { + return true; + } + } + return false; +} + +class SymbolBuffers { - + + + + + - - - - + + - + + - constructor(layer ) { - super(layer, properties$9); - this._updateColorRamp(); + + + + + + constructor(programConfigurations ) { + this.layoutVertexArray = new StructArrayLayout4i4ui4i24(); + this.indexArray = new StructArrayLayout3ui6(); + this.programConfigurations = programConfigurations; + this.segments = new SegmentVector(); + this.dynamicLayoutVertexArray = new StructArrayLayout4f16(); + this.opacityVertexArray = new StructArrayLayout1ul4(); + this.placedSymbolArray = new PlacedSymbolArray(); + this.globeExtVertexArray = new StructArrayLayout3i3f20(); } - _handleSpecialPaintPropertyUpdate(name ) { - if (name === 'sky-gradient') { - this._updateColorRamp(); - } else if (name === 'sky-atmosphere-sun' || - name === 'sky-atmosphere-halo-color' || - name === 'sky-atmosphere-color' || - name === 'sky-atmosphere-sun-intensity') { - this._skyboxInvalidated = true; - } + isEmpty() { + return this.layoutVertexArray.length === 0 && + this.indexArray.length === 0 && + this.dynamicLayoutVertexArray.length === 0 && + this.opacityVertexArray.length === 0; } - _updateColorRamp() { - const expression = this._transitionablePaint._values['sky-gradient'].value.expression; - this.colorRamp = renderColorRamp({ - expression, - evaluationKey: 'skyRadialProgress' - }); - if (this.colorRampTexture) { - this.colorRampTexture.destroy(); - this.colorRampTexture = null; + upload(context , dynamicIndexBuffer , upload , update ) { + if (this.isEmpty()) { + return; } - } - needsSkyboxCapture(painter ) { - if (!!this._skyboxInvalidated || !this.skyboxTexture || !this.skyboxGeometry) { - return true; + if (upload) { + this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, symbolLayoutAttributes.members); + this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer); + this.dynamicLayoutVertexBuffer = context.createVertexBuffer(this.dynamicLayoutVertexArray, dynamicLayoutAttributes.members, true); + this.opacityVertexBuffer = context.createVertexBuffer(this.opacityVertexArray, shaderOpacityAttributes, true); + if (this.globeExtVertexArray.length > 0) { + this.globeExtVertexBuffer = context.createVertexBuffer(this.globeExtVertexArray, symbolGlobeExtAttributes.members, 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; } - if (!this.paint.get('sky-atmosphere-sun')) { - const lightPosition = painter.style.light.properties.get('position'); - return this._lightPosition.azimuthal !== lightPosition.azimuthal || - this._lightPosition.polar !== lightPosition.polar; + if (upload || update) { + this.programConfigurations.upload(context); } } - getCenter(painter , leftHanded ) { - const type = this.paint.get('sky-type'); - if (type === 'atmosphere') { - const sunPosition = this.paint.get('sky-atmosphere-sun'); - const useLightPosition = !sunPosition; - const light = painter.style.light; - const lightPosition = light.properties.get('position'); - - if (useLightPosition && light.properties.get('anchor') === 'viewport') { - warnOnce('The sun direction is attached to a light with viewport anchor, lighting may behave unexpectedly.'); - } - - return useLightPosition ? - getCelestialDirection(lightPosition.azimuthal, -lightPosition.polar + 90, leftHanded) : - getCelestialDirection(sunPosition[0], -sunPosition[1] + 90, leftHanded); - } else if (type === 'gradient') { - const direction = this.paint.get('sky-gradient-center'); - return getCelestialDirection(direction[0], -direction[1] + 90, leftHanded); + destroy() { + if (!this.layoutVertexBuffer) return; + this.layoutVertexBuffer.destroy(); + this.indexBuffer.destroy(); + this.programConfigurations.destroy(); + this.segments.destroy(); + this.dynamicLayoutVertexBuffer.destroy(); + this.opacityVertexBuffer.destroy(); + if (this.globeExtVertexBuffer) { + this.globeExtVertexBuffer.destroy(); } } +} - is3D() { - return false; - } +register(SymbolBuffers, 'SymbolBuffers'); - isSky() { - return true; - } +class CollisionBuffers { + + + - markSkyboxValid(painter ) { - this._skyboxInvalidated = false; - this._lightPosition = painter.style.light.properties.get('position'); - } + + - hasOffscreenPass() { - return true; - } + - getProgramIds() { - const type = this.paint.get('sky-type'); - if (type === 'atmosphere') { - return ['skyboxCapture', 'skybox']; - } else if (type === 'gradient') { - return ['skyboxGradient']; - } - return null; - } -} + + -// - + + - + constructor(LayoutArray , + layoutAttributes , + IndexArray ) { + this.layoutVertexArray = new LayoutArray(); + this.layoutAttributes = layoutAttributes; + this.indexArray = new IndexArray(); + this.segments = new SegmentVector(); + this.collisionVertexArray = new StructArrayLayout2ub2f12(); + this.collisionVertexArrayExt = new StructArrayLayout3f12(); + } -const subclasses = { - circle: CircleStyleLayer, - heatmap: HeatmapStyleLayer, - hillshade: HillshadeStyleLayer, - fill: FillStyleLayer, - 'fill-extrusion': FillExtrusionStyleLayer, - line: LineStyleLayer, - symbol: SymbolStyleLayer, - background: BackgroundStyleLayer, - raster: RasterStyleLayer, - sky: SkyLayer -}; + 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); + this.collisionVertexBufferExt = context.createVertexBuffer(this.collisionVertexArrayExt, collisionVertexAttributesExt.members, true); + } -function createStyleLayer(layer ) { - if (layer.type === 'custom') { - return new CustomStyleLayer(layer); - } else { - return new subclasses[layer.type](layer); + destroy() { + if (!this.layoutVertexBuffer) return; + this.layoutVertexBuffer.destroy(); + this.indexBuffer.destroy(); + this.segments.destroy(); + this.collisionVertexBuffer.destroy(); + this.collisionVertexBufferExt.destroy(); } } -// -const {HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageData: ImageData$1, ImageBitmap: ImageBitmap$1} = window$1; +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 + * `collisionBoxArray`: collision data for use by foreground + * `this.text`: SymbolBuffers for text symbols + * `this.icons`: SymbolBuffers for icons + * `this.iconCollisionBox`: Debug SymbolBuffers for icon collision boxes + * `this.textCollisionBox`: Debug SymbolBuffers for text collision boxes + * 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 + */ +class SymbolBucket { + + - + + + + + - - - - - - - - - + - - - - - - - - - - - - - - -class Texture { - - + + + + - - - - - constructor(context , image , format , options ) { - this.context = context; - this.format = format; - this.texture = context.gl.createTexture(); - this.update(image, options); - } - - update(image , options , position ) { - const {width, height} = image; - const {context} = this; - const {gl} = context; - gl.bindTexture(gl.TEXTURE_2D, this.texture); - - context.pixelStoreUnpackFlipY.set(false); - context.pixelStoreUnpack.set(1); - context.pixelStoreUnpackPremultiplyAlpha.set(this.format === gl.RGBA && (!options || options.premultiply !== false)); - - if (!position && (!this.size || this.size[0] !== width || this.size[1] !== height)) { - this.size = [width, height]; + + - if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData$1 || (ImageBitmap$1 && image instanceof ImageBitmap$1)) { - 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); - } + + + + + + + + + + + + + + + - } else { - const {x, y} = position || {x: 0, y: 0}; - if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData$1 || (ImageBitmap$1 && image instanceof ImageBitmap$1)) { - gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, image); - } else { - gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, image.data); - } - } + + + - this.useMipmap = Boolean(options && options.useMipmap && this.isSizePowerOfTwo()); - if (this.useMipmap) { - gl.generateMipmap(gl.TEXTURE_2D); - } - } + + + + + + + + + + + + + - bind(filter , wrap ) { - const {context} = this; - const {gl} = context; - gl.bindTexture(gl.TEXTURE_2D, this.texture); + constructor(options ) { + this.collisionBoxArray = options.collisionBoxArray; + this.zoom = options.zoom; + this.overscaling = options.overscaling; + this.layers = options.layers; + this.layerIds = this.layers.map(layer => layer.id); + this.index = options.index; + this.pixelRatio = options.pixelRatio; + this.sourceLayerIndex = options.sourceLayerIndex; + this.hasPattern = false; + this.hasRTLText = false; + this.fullyClipped = false; + this.sortKeyRanges = []; - if (filter !== this.filter) { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, - this.useMipmap ? (filter === gl.NEAREST ? gl.NEAREST_MIPMAP_NEAREST : gl.LINEAR_MIPMAP_NEAREST) : filter - ); - this.filter = filter; - } + this.collisionCircleArray = []; + this.placementInvProjMatrix = identity$3([]); + this.placementViewportMatrix = identity$3([]); - 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; - } - } + const layer = this.layers[0]; + const unevaluatedLayoutValues = layer._unevaluatedLayout._values; - isSizePowerOfTwo() { - return this.size[0] === this.size[1] && (Math.log(this.size[0]) / Math.LN2) % 1 === 0; - } + this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']); + this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']); - destroy() { - const {gl} = this.context; - gl.deleteTexture(this.texture); - this.texture = (null ); - } -} + const layout = this.layers[0].layout; + const sortKey = layout.get('symbol-sort-key'); + const zOrder = layout.get('symbol-z-order'); + this.canOverlap = + layout.get('text-allow-overlap') || + layout.get('icon-allow-overlap') || + layout.get('text-ignore-placement') || + layout.get('icon-ignore-placement'); + this.sortFeaturesByKey = zOrder !== 'viewport-y' && sortKey.constantOr(1) !== undefined; + const zOrderByViewportY = zOrder === 'viewport-y' || (zOrder === 'auto' && !this.sortFeaturesByKey); + this.sortFeaturesByY = zOrderByViewportY && this.canOverlap; -// + this.writingModes = layout.get('text-writing-mode').map(wm => WritingMode[wm]); -/** - * 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 - */ -class LineAtlas { - - - - - - + this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id); - constructor(width , height ) { - this.width = width; - this.height = height; - this.nextRow = 0; - this.image = new AlphaImage({width, height}); - this.positions = {}; - this.uploaded = false; + this.sourceID = options.sourceID; + this.projection = options.projection; } - /** - * Get a dash line pattern. - * - * @param {Array} dasharray - * @param {string} lineCap the type of line caps to be added to dashes - * @returns {Object} position of dash texture in { y, height, width } - * @private - */ - getDash(dasharray , lineCap ) { - const key = this.getKey(dasharray, lineCap); - return this.positions[key]; - } + createArrays() { + this.text = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, property => /^text/.test(property))); + this.icon = new SymbolBuffers(new ProgramConfigurationSet(this.layers, this.zoom, property => /^icon/.test(property))); - trim() { - const width = this.width; - const height = this.height = nextPowerOfTwo(this.nextRow); - this.image.resize({width, height}); + this.glyphOffsetArray = new GlyphOffsetArray(); + this.lineVertexArray = new SymbolLineVertexArray(); + this.symbolInstances = new SymbolInstanceArray(); } - getKey(dasharray , lineCap ) { - return dasharray.join(',') + lineCap; + calculateGlyphDependencies(text , stack , textAlongLine , allowVerticalPlacement , doesAllowVerticalWritingMode ) { + for (let i = 0; i < text.length; i++) { + stack[text.charCodeAt(i)] = true; + if (allowVerticalPlacement && doesAllowVerticalWritingMode) { + const verticalChar = verticalizedCharacterMap[text.charAt(i)]; + if (verticalChar) { + stack[verticalChar.charCodeAt(0)] = true; + } + } + } } - getDashRanges(dasharray , lineAtlasWidth , stretch ) { - // If dasharray has an odd length, both the first and last parts - // are dashes and should be joined seamlessly. - const oddDashArray = dasharray.length % 2 === 1; - - const ranges = []; - - let left = oddDashArray ? -dasharray[dasharray.length - 1] * stretch : 0; - let right = dasharray[0] * stretch; - let isDash = true; - - ranges.push({left, right, isDash, zeroLength: dasharray[0] === 0}); + populate(features , options , canonical , tileTransform ) { + const layer = this.layers[0]; + const layout = layer.layout; + const isGlobe = this.projection.name === 'globe'; - let currentDashLength = dasharray[0]; - for (let i = 1; i < dasharray.length; i++) { - isDash = !isDash; + const textFont = layout.get('text-font'); + const textField = layout.get('text-field'); + const iconImage = layout.get('icon-image'); + const hasText = + (textField.value.kind !== 'constant' || + (textField.value.value instanceof Formatted && !textField.value.value.isEmpty()) || + textField.value.value.toString().length > 0) && + (textFont.value.kind !== 'constant' || textFont.value.value.length > 0); + // we should always resolve the icon-image value if the property was defined in the style + // this allows us to fire the styleimagemissing event if image evaluation returns null + // the only way to distinguish between null returned from a coalesce statement with no valid images + // and null returned because icon-image wasn't defined is to check whether or not iconImage.parameters is an empty object + const hasIcon = iconImage.value.kind !== 'constant' || !!iconImage.value.value || Object.keys(iconImage.parameters).length > 0; + const symbolSortKey = layout.get('symbol-sort-key'); - const dashLength = dasharray[i]; - left = currentDashLength * stretch; - currentDashLength += dashLength; - right = currentDashLength * stretch; + this.features = []; - ranges.push({left, right, isDash, zeroLength: dashLength === 0}); + if (!hasText && !hasIcon) { + return; } - return ranges; - } + const icons = options.iconDependencies; + const stacks = options.glyphDependencies; + const availableImages = options.availableImages; + const globalProperties = new EvaluationParameters(this.zoom); - addRoundDash(ranges , stretch , n ) { - const halfStretch = stretch / 2; + for (const {feature, id, index, sourceLayerIndex} of features) { - for (let y = -n; y <= n; y++) { - const row = this.nextRow + n + y; - const index = this.width * row; - let currIndex = 0; - let range = ranges[currIndex]; + const needGeometry = layer._featureFilter.needGeometry; + const evaluationFeature = toEvaluationFeature(feature, needGeometry); + if (!layer._featureFilter.filter(globalProperties, evaluationFeature, canonical)) { + continue; + } - for (let x = 0; x < this.width; x++) { - if (x / range.right > 1) { range = ranges[++currIndex]; } + if (!needGeometry) evaluationFeature.geometry = loadGeometry(feature, canonical, tileTransform); - const distLeft = Math.abs(x - range.left); - const distRight = Math.abs(x - range.right); - const minDist = Math.min(distLeft, distRight); - let signedDistance; + if (isGlobe && feature.type !== 1 && canonical.z <= 5) { + // Resample long lines and polygons in globe view so that their length wont exceed ~0.19 radians (360/32 degrees). + // Otherwise lines could clip through the globe as the resolution is not enough to represent curved paths. + // The threshold value follows subdivision size used with fill extrusions + const geom = evaluationFeature.geometry; + const tiles = 1 << canonical.z; + const mx = canonical.x; + const my = canonical.y; + + // cos(11.25 degrees) = 0.98078528056 + const cosAngleThreshold = 0.98078528056; + + for (let i = 0; i < geom.length; i++) { + geom[i] = resamplePred( + geom[i], + p => p, + (a, b) => { + const v0 = latLngToECEF(latFromMercatorY((a.y / EXTENT + my) / tiles), lngFromMercatorX((a.x / EXTENT + mx) / tiles), 1); + const v1 = latLngToECEF(latFromMercatorY((b.y / EXTENT + my) / tiles), lngFromMercatorX((b.x / EXTENT + mx) / tiles), 1); + return dot$5(v0, v1) < cosAngleThreshold; + }); + } + } - const distMiddle = y / n * (halfStretch + 1); - if (range.isDash) { - const distEdge = halfStretch - Math.abs(distMiddle); - signedDistance = Math.sqrt(minDist * minDist + distEdge * distEdge); + let text ; + if (hasText) { + // Expression evaluation will automatically coerce to Formatted + // but plain string token evaluation skips that pathway so do the + // conversion here. + const resolvedTokens = layer.getValueAndResolveTokens('text-field', evaluationFeature, canonical, availableImages); + const formattedText = Formatted.factory(resolvedTokens); + if (containsRTLText(formattedText)) { + this.hasRTLText = true; + } + if ( + !this.hasRTLText || // non-rtl text so can proceed safely + getRTLTextPluginStatus() === 'unavailable' || // We don't intend to lazy-load the rtl text plugin, so proceed with incorrect shaping + (this.hasRTLText && plugin.isParsed()) // Use the rtlText plugin to shape text + ) { + text = transformText$1(formattedText, layer, evaluationFeature); + } + } + + let icon ; + if (hasIcon) { + // Expression evaluation will automatically coerce to Image + // but plain string token evaluation skips that pathway so do the + // conversion here. + const resolvedTokens = layer.getValueAndResolveTokens('icon-image', evaluationFeature, canonical, availableImages); + if (resolvedTokens instanceof ResolvedImage) { + icon = resolvedTokens; } else { - signedDistance = halfStretch - Math.sqrt(minDist * minDist + distMiddle * distMiddle); + icon = ResolvedImage.fromString(resolvedTokens); } + } - this.image.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128)); + if (!text && !icon) { + continue; } - } - } + const sortKey = this.sortFeaturesByKey ? + symbolSortKey.evaluate(evaluationFeature, {}, canonical) : + undefined; - addRegularDash(ranges , capLength ) { + const symbolFeature = { + id, + text, + icon, + index, + sourceLayerIndex, + geometry: evaluationFeature.geometry, + properties: feature.properties, + type: vectorTileFeatureTypes[feature.type], + sortKey + }; + this.features.push(symbolFeature); - // Collapse any zero-length range - // Collapse neighbouring same-type parts into a single part - for (let i = ranges.length - 1; i >= 0; --i) { - const part = ranges[i]; - const next = ranges[i + 1]; - if (part.zeroLength) { - ranges.splice(i, 1); - } else if (next && next.isDash === part.isDash) { - next.left = part.left; - ranges.splice(i, 1); + if (icon) { + icons[icon.name] = true; + } + + if (text) { + const fontStack = textFont.evaluate(evaluationFeature, {}, canonical).join(','); + const textAlongLine = layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point'; + this.allowVerticalPlacement = this.writingModes && this.writingModes.indexOf(WritingMode.vertical) >= 0; + for (const section of text.sections) { + if (!section.image) { + const doesAllowVerticalWritingMode = allowsVerticalWritingMode(text.toString()); + const sectionFont = section.fontStack || fontStack; + const sectionStack = stacks[sectionFont] = stacks[sectionFont] || {}; + this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, this.allowVerticalPlacement, doesAllowVerticalWritingMode); + } else { + // Add section image to the list of dependencies. + icons[section.image.name] = true; + } + } } } - // Combine the first and last parts if possible - const first = ranges[0]; - const last = ranges[ranges.length - 1]; - if (first.isDash === last.isDash) { - first.left = last.left - this.width; - last.right = first.right + this.width; + 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); } - const index = this.width * this.nextRow; - let currIndex = 0; - let range = ranges[currIndex]; + if (this.sortFeaturesByKey) { + this.features.sort((a, b) => { + // a.sortKey is always a number when sortFeaturesByKey is true + return ((a.sortKey ) ) - ((b.sortKey ) ); + }); + } + } - for (let x = 0; x < this.width; x++) { - if (x / range.right > 1) { - range = ranges[++currIndex]; - } + update(states , vtLayer , availableImages , imagePositions ) { + if (!this.stateDependentLayers.length) return; + this.text.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, availableImages, imagePositions); + this.icon.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, availableImages, imagePositions); + } - const distLeft = Math.abs(x - range.left); - const distRight = Math.abs(x - range.right); + isEmpty() { + // When the bucket encounters only rtl-text but the plugin isn't loaded, no symbol instances will be created. + // In order for the bucket to be serialized, and not discarded as an empty bucket both checks are necessary. + return this.symbolInstances.length === 0 && !this.hasRTLText; + } - const minDist = Math.min(distLeft, distRight); - const signedDistance = (range.isDash ? minDist : -minDist) + capLength; + uploadPending() { + return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload; + } - this.image.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128)); + upload(context ) { + if (!this.uploaded && this.hasDebugData()) { + this.textCollisionBox.upload(context); + this.iconCollisionBox.upload(context); } + this.text.upload(context, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload); + this.icon.upload(context, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload); + this.uploaded = true; } - addDash(dasharray , lineCap ) { - const key = this.getKey(dasharray, lineCap); - if (this.positions[key]) return this.positions[key]; - - const round = lineCap === 'round'; - const n = round ? 7 : 0; - const height = 2 * n + 1; + destroyDebugData() { + this.textCollisionBox.destroy(); + this.iconCollisionBox.destroy(); + } - if (this.nextRow + height > this.height) { - warnOnce('LineAtlas out of space'); - return null; + getProjection() { + if (!this.projectionInstance) { + this.projectionInstance = getProjection(this.projection); } + return this.projectionInstance; + } - // dasharray is empty, draws a full line (no dash or no gap length represented, default behavior) - if (dasharray.length === 0) { - // insert a single dash range in order to draw a full line - dasharray.push(1); - } + destroy() { + this.text.destroy(); + this.icon.destroy(); - let length = 0; - for (let i = 0; i < dasharray.length; i++) { - if (dasharray[i] < 0) { - warnOnce('Negative value is found in line dasharray, replacing values with 0'); - dasharray[i] = 0; - } - length += dasharray[i]; + if (this.hasDebugData()) { + this.destroyDebugData(); } + } - if (length !== 0) { - const stretch = this.width / length; - const ranges = this.getDashRanges(dasharray, this.width, stretch); - - if (round) { - this.addRoundDash(ranges, stretch, n); - } else { - const capLength = lineCap === 'square' ? 0.5 * stretch : 0; - this.addRegularDash(ranges, capLength); + addToLineVertexArray(anchor , line ) { + const lineStartIndex = this.lineVertexArray.length; + const segment = anchor.segment; + if (segment !== undefined) { + let sumForwardLength = anchor.dist(line[segment + 1]); + let sumBackwardLength = anchor.dist(line[segment]); + const vertices = {}; + for (let i = 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 (let i = segment || 0; i >= 0; i--) { + vertices[i] = {x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumBackwardLength}; + if (i > 0) { + sumBackwardLength += line[i - 1].dist(line[i]); + } + } + for (let i = 0; i < line.length; i++) { + const vertex = vertices[i]; + this.lineVertexArray.emplaceBack(vertex.x, vertex.y, vertex.tileUnitDistanceFromAnchor); } } - - const y = this.nextRow + n; - - this.nextRow += height; - - const pos = { - tl: [y, n], - br: [length, 0] + return { + lineStartIndex, + lineLength: this.lineVertexArray.length - lineStartIndex }; - this.positions[key] = pos; - return pos; } -} -register('LineAtlas', LineAtlas); + addSymbols(arrays , + quads , + sizeVertex , + lineOffset , + alongLine , + feature , + writingMode , + globe , + tileAnchor , + lineStartIndex , + lineLength , + associatedIconIndex , + availableImages , + canonical ) { + const indexArray = arrays.indexArray; + const layoutVertexArray = arrays.layoutVertexArray; + const globeExtVertexArray = arrays.globeExtVertexArray; -// + const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, this.canOverlap ? feature.sortKey : undefined); + const glyphOffsetArrayStart = this.glyphOffsetArray.length; + const vertexStartIndex = segment.vertexLength; -/** - * Invokes the wrapped function in a non-blocking way when trigger() is called. Invocation requests - * are ignored until the function was actually invoked. - * - * @private - */ -class ThrottledInvoker { - - - + const angle = (this.allowVerticalPlacement && writingMode === WritingMode.vertical) ? Math.PI / 2 : 0; - constructor(callback ) { - this._callback = callback; - this._triggered = false; - if (typeof MessageChannel !== 'undefined') { - this._channel = new MessageChannel(); - this._channel.port2.onmessage = () => { - this._triggered = false; - this._callback(); - }; - } - } + const sections = feature.text && feature.text.sections; - trigger() { - if (!this._triggered) { - this._triggered = true; - if (this._channel) { - this._channel.port1.postMessage(true); + for (let i = 0; i < quads.length; i++) { + const {tl, tr, bl, br, tex, pixelOffsetTL, pixelOffsetBR, minFontScaleX, minFontScaleY, glyphOffset, isSDF, sectionIndex} = quads[i]; + const index = segment.vertexLength; + + const y = glyphOffset[1]; + addVertex(layoutVertexArray, tileAnchor.x, tileAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY); + addVertex(layoutVertexArray, tileAnchor.x, tileAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetTL.y, minFontScaleX, minFontScaleY); + addVertex(layoutVertexArray, tileAnchor.x, tileAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetTL.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY); + addVertex(layoutVertexArray, tileAnchor.x, tileAnchor.y, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex, isSDF, pixelOffsetBR.x, pixelOffsetBR.y, minFontScaleX, minFontScaleY); + + if (globe) { + const globeAnchor = globe.anchor; + const up = globe.up; + addGlobeVertex(globeExtVertexArray, globeAnchor.x, globeAnchor.y, globeAnchor.z, up[0], up[1], up[2]); + addGlobeVertex(globeExtVertexArray, globeAnchor.x, globeAnchor.y, globeAnchor.z, up[0], up[1], up[2]); + addGlobeVertex(globeExtVertexArray, globeAnchor.x, globeAnchor.y, globeAnchor.z, up[0], up[1], up[2]); + addGlobeVertex(globeExtVertexArray, globeAnchor.x, globeAnchor.y, globeAnchor.z, up[0], up[1], up[2]); + + addDynamicAttributes(arrays.dynamicLayoutVertexArray, globeAnchor.x, globeAnchor.y, globeAnchor.z, angle); } else { - setTimeout(() => { - this._triggered = false; - this._callback(); - }, 0); + addDynamicAttributes(arrays.dynamicLayoutVertexArray, tileAnchor.x, tileAnchor.y, tileAnchor.z, angle); } - } - } - - remove() { - delete this._channel; - this._callback = () => {}; - } -} -// - + indexArray.emplaceBack(index, index + 1, index + 2); + indexArray.emplaceBack(index + 1, index + 2, index + 3); -const performance = window$1.performance; + segment.vertexLength += 4; + segment.primitiveLength += 2; - - - - - - - - - - - - - - - + this.glyphOffsetArray.emplaceBack(glyphOffset[0]); -const PerformanceMarkers = { - create: 'create', - load: 'load', - fullLoad: 'fullLoad' -}; + if (i === quads.length - 1 || sectionIndex !== quads[i + 1].sectionIndex) { + arrays.programConfigurations.populatePaintArrays(layoutVertexArray.length, feature, feature.index, {}, availableImages, canonical, sections && sections[sectionIndex]); + } + } -let lastFrameTime = null; -let fullLoadFinished = false; -let frameTimes = []; -let placementTime = 0; -const frameSequences = [frameTimes]; -let i = 0; + const projectedAnchor = globe ? globe.anchor : tileAnchor; -// The max milliseconds we should spend to render a single frame. -// This value may need to be tweaked. I chose 14 by increasing frame -// times with busy work and measuring the number of dropped frames. -// On a page with only a map, more frames started being dropped after -// going above 14ms. We might want to lower this to leave more room -// for other work. -const CPU_FRAME_BUDGET = 14; + arrays.placedSymbolArray.emplaceBack(projectedAnchor.x, projectedAnchor.y, projectedAnchor.z, tileAnchor.x, tileAnchor.y, + glyphOffsetArrayStart, this.glyphOffsetArray.length - glyphOffsetArrayStart, vertexStartIndex, + lineStartIndex, lineLength, (tileAnchor.segment ), + sizeVertex ? sizeVertex[0] : 0, sizeVertex ? sizeVertex[1] : 0, + lineOffset[0], lineOffset[1], + writingMode, + // placedOrientation is null initially; will be updated to horizontal(1)/vertical(2) if placed + 0, + (false ), + // The crossTileID is only filled/used on the foreground for dynamic text anchors + 0, + associatedIconIndex, + // flipState is unknown initially; will be updated to flipRequired(1)/flipNotRequired(2) during line label reprojection + 0 + ); + } -const framerateTarget = 60; -const frameTimeTarget = 1000 / framerateTarget; + _commitLayoutVertex(array , boxTileAnchorX , boxTileAnchorY , boxTileAnchorZ , tileAnchorX , tileAnchorY , extrude ) { + array.emplaceBack( + // pos + boxTileAnchorX, + boxTileAnchorY, + boxTileAnchorZ, + // a_anchor_pos + tileAnchorX, + tileAnchorY, + // extrude + Math.round(extrude.x), + Math.round(extrude.y)); + } -const PerformanceUtils = { - mark(marker ) { - performance.mark(marker); + _addCollisionDebugVertices(box , scale , arrays , boxTileAnchorX , boxTileAnchorY , boxTileAnchorZ , symbolInstance ) { + const segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray); + const index = segment.vertexLength; + const symbolTileAnchorX = symbolInstance.tileAnchorX; + const symbolTileAnchorY = symbolInstance.tileAnchorY; - if (marker === PerformanceMarkers.fullLoad) { - fullLoadFinished = true; - } - }, - measure(name , begin , end ) { - performance.measure(name, begin, end); - }, - beginMeasure(name ) { - const mark = name + i++; - performance.mark(mark); - return { - mark, - name - }; - }, - endMeasure(m ) { - performance.measure(m.name, m.mark); - }, - recordPlacementTime(time ) { - // Ignore placementTimes during loading - if (!fullLoadFinished) { - return; + for (let i = 0; i < 4; i++) { + arrays.collisionVertexArray.emplaceBack(0, 0, 0, 0); } - placementTime += time; - }, - frame(timestamp , isRenderFrame ) { - const currTimestamp = timestamp; - if (lastFrameTime != null) { - const frameTime = currTimestamp - lastFrameTime; - frameTimes.push(frameTime); - } + arrays.collisionVertexArrayExt.emplaceBack(scale, -box.padding, -box.padding); + arrays.collisionVertexArrayExt.emplaceBack(scale, box.padding, -box.padding); + arrays.collisionVertexArrayExt.emplaceBack(scale, box.padding, box.padding); + arrays.collisionVertexArrayExt.emplaceBack(scale, -box.padding, box.padding); - if (isRenderFrame) { - lastFrameTime = currTimestamp; - } else { - lastFrameTime = null; - frameTimes = []; - frameSequences.push(frameTimes); - } - }, - clearMetrics() { - lastFrameTime = null; - frameTimes = []; - placementTime = 0; - fullLoadFinished = false; + this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new pointGeometry(box.x1, box.y1)); + this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new pointGeometry(box.x2, box.y1)); + this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new pointGeometry(box.x2, box.y2)); + this._commitLayoutVertex(arrays.layoutVertexArray, boxTileAnchorX, boxTileAnchorY, boxTileAnchorZ, symbolTileAnchorX, symbolTileAnchorY, new pointGeometry(box.x1, box.y2)); - performance.clearMeasures('loadTime'); - performance.clearMeasures('fullLoadTime'); + segment.vertexLength += 4; - for (const marker in PerformanceMarkers) { - performance.clearMarks(PerformanceMarkers[marker]); - } - }, + const indexArray = (arrays.indexArray ); + indexArray.emplaceBack(index, index + 1); + indexArray.emplaceBack(index + 1, index + 2); + indexArray.emplaceBack(index + 2, index + 3); + indexArray.emplaceBack(index + 3, index); - getPerformanceMetrics() { - const metrics = {}; + segment.primitiveLength += 4; + } - performance.measure('loadTime', PerformanceMarkers.create, PerformanceMarkers.load); - performance.measure('fullLoadTime', PerformanceMarkers.create, PerformanceMarkers.fullLoad); + _addTextDebugCollisionBoxes(size , zoom , collisionBoxArray , startIndex , endIndex , instance ) { + for (let b = startIndex; b < endIndex; b++) { + const box = (collisionBoxArray.get(b) ); + const scale = this.getSymbolInstanceTextSize(size, instance, zoom, b); - const measures = performance.getEntriesByType('measure'); - for (const measure of measures) { - metrics[measure.name] = (metrics[measure.name] || 0) + measure.duration; + this._addCollisionDebugVertices(box, scale, this.textCollisionBox, box.projectedAnchorX, box.projectedAnchorY, box.projectedAnchorZ, instance); } + } - // We don't have a perfect way of measuring the actual number of dropped frames. - // The best way of determining when frames happen is the timestamp passed to - // requestAnimationFrame. In Chrome and Firefox the timestamps are generally - // multiples of 1000/60ms (+-2ms). - // - // The differences between the timestamps vary a lot more in Safari. - // It's not uncommon to see a 24ms difference followedd by a 8ms difference. - // I'm not sure, but I think these might not be dropped frames (due to multiple - // buffering?). - // - // For Safari, I think comparing the number of expected frames with the number of actual - // frames is a more accurate way of measuring dropped frames than comparing - // individual frame time differences to a target time. In Firefox and Chrome - // both approaches produce the same result most of the time. - let droppedFrames = 0; - let totalFrameTimeSum = 0; - let totalFrames = 0; - metrics.jank = 0; - - for (const frameTimes of frameSequences) { - if (!frameTimes.length) continue; - const frameTimeSum = frameTimes.reduce((prev, curr) => prev + curr, 0); - const expectedFrames = Math.max(1, Math.round(frameTimeSum / frameTimeTarget)); - droppedFrames += expectedFrames - frameTimes.length; - totalFrameTimeSum += frameTimeSum; - totalFrames += frameTimes.length; - - // Jank is a change in the frame rate. - // Count the number of times a frame has a worse rate than the previous frame. - // A consistent rate does not increase jank even if it is continuosly dropping frames. - // A one-off frame does not increase jank even if it is really long. - // - // This is not that accurate in Safari because the differences between animation frame - // times is not as close to a multiple of 1000/60ms. - const roundedTimes = frameTimes.map(frameTime => Math.max(1, Math.round(frameTime / frameTimeTarget))); - for (let n = 0; n < roundedTimes.length - 1; n++) { - if (roundedTimes[n + 1] > roundedTimes[n]) { - metrics.jank++; - } - } + _addIconDebugCollisionBoxes(size , zoom , collisionBoxArray , startIndex , endIndex , instance ) { + for (let b = startIndex; b < endIndex; b++) { + const box = (collisionBoxArray.get(b) ); + const scale = this.getSymbolInstanceIconSize(size, zoom, b); + + this._addCollisionDebugVertices(box, scale, this.iconCollisionBox, box.projectedAnchorX, box.projectedAnchorY, box.projectedAnchorZ, instance); } - const avgFrameTime = totalFrameTimeSum / totalFrames / 1000; - metrics.fps = 1 / avgFrameTime; - metrics.droppedFrames = droppedFrames; - metrics.percentDroppedFrames = (droppedFrames / (totalFrames + droppedFrames)) * 100; + } - metrics.cpuFrameBudgetExceeded = 0; - const renderFrames = performance.getEntriesByName('render'); - for (const renderFrame of renderFrames) { - metrics.cpuFrameBudgetExceeded += Math.max(0, renderFrame.duration - CPU_FRAME_BUDGET); + generateCollisionDebugBuffers(zoom , collisionBoxArray ) { + if (this.hasDebugData()) { + this.destroyDebugData(); } - metrics.placementTime = placementTime; + this.textCollisionBox = new CollisionBuffers(StructArrayLayout3i2i2i16, collisionBoxLayout.members, StructArrayLayout2ui4); + this.iconCollisionBox = new CollisionBuffers(StructArrayLayout3i2i2i16, collisionBoxLayout.members, StructArrayLayout2ui4); - return metrics; - }, + const iconSize = evaluateSizeForZoom(this.iconSizeData, zoom); + const textSize = evaluateSizeForZoom(this.textSizeData, zoom); - getWorkerPerformanceMetrics() { - return JSON.parse(JSON.stringify({ - timeOrigin: performance.timeOrigin, - measures: performance.getEntriesByType("measure") - })); + for (let i = 0; i < this.symbolInstances.length; i++) { + const symbolInstance = this.symbolInstances.get(i); + this._addTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance); + this._addTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance); + this._addIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex, symbolInstance); + this._addIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex, symbolInstance); + } } -}; - -function getPerformanceMeasurement(request ) { - const url = request ? request.url.toString() : undefined; - return performance.getEntriesByName(url); -} -// + getSymbolInstanceTextSize(textSize , instance , zoom , boxIndex ) { + const symbolIndex = instance.rightJustifiedTextSymbolIndex >= 0 ? + instance.rightJustifiedTextSymbolIndex : instance.centerJustifiedTextSymbolIndex >= 0 ? + instance.centerJustifiedTextSymbolIndex : instance.leftJustifiedTextSymbolIndex >= 0 ? + instance.leftJustifiedTextSymbolIndex : instance.verticalPlacedTextSymbolIndex >= 0 ? + instance.verticalPlacedTextSymbolIndex : boxIndex; -class Scheduler { + const symbol = this.text.placedSymbolArray.get(symbolIndex); + const featureSize = evaluateSizeForFeature(this.textSizeData, textSize, symbol) / ONE_EM; - - - - + return this.tilePixelRatio * featureSize; + } - constructor() { - this.tasks = {}; - this.taskQueue = []; - bindAll(['process'], this); - this.invoker = new ThrottledInvoker(this.process); + getSymbolInstanceIconSize(iconSize , zoom , index ) { + const symbol = this.icon.placedSymbolArray.get(index); + const featureSize = evaluateSizeForFeature(this.iconSizeData, iconSize, symbol); - this.nextId = 0; + return this.tilePixelRatio * featureSize; } - add(fn , metadata ) { - const id = this.nextId++; - const priority = getPriority(metadata); + _commitDebugCollisionVertexUpdate(array , scale , padding ) { + array.emplaceBack(scale, -padding, -padding); + array.emplaceBack(scale, padding, -padding); + array.emplaceBack(scale, padding, padding); + array.emplaceBack(scale, -padding, padding); + } - if (priority === 0) { - // Process tasks with priority 0 immediately. Do not yield to the event loop. - const m = isWorker() ? PerformanceUtils.beginMeasure('workerTask') : undefined; - try { - fn(); - } finally { - if (m) PerformanceUtils.endMeasure(m); - } - return { - cancel: () => {} - }; + _updateTextDebugCollisionBoxes(size , zoom , collisionBoxArray , startIndex , endIndex , instance ) { + for (let b = startIndex; b < endIndex; b++) { + const box = (collisionBoxArray.get(b) ); + const scale = this.getSymbolInstanceTextSize(size, instance, zoom, b); + const array = this.textCollisionBox.collisionVertexArrayExt; + this._commitDebugCollisionVertexUpdate(array, scale, box.padding); } + } - this.tasks[id] = {fn, metadata, priority, id}; - this.taskQueue.push(id); - this.invoker.trigger(); - return { - cancel: () => { - delete this.tasks[id]; - } - }; + _updateIconDebugCollisionBoxes(size , zoom , collisionBoxArray , startIndex , endIndex ) { + for (let b = startIndex; b < endIndex; b++) { + const box = (collisionBoxArray.get(b) ); + const scale = this.getSymbolInstanceIconSize(size, zoom, b); + const array = this.iconCollisionBox.collisionVertexArrayExt; + this._commitDebugCollisionVertexUpdate(array, scale, box.padding); + } } - process() { - const m = isWorker() ? PerformanceUtils.beginMeasure('workerTask') : undefined; - try { - this.taskQueue = this.taskQueue.filter(id => !!this.tasks[id]); + updateCollisionDebugBuffers(zoom , collisionBoxArray ) { + if (!this.hasDebugData()) { + return; + } - if (!this.taskQueue.length) { - return; - } - const id = this.pick(); - if (id === null) return; + if (this.hasTextCollisionBoxData()) this.textCollisionBox.collisionVertexArrayExt.clear(); + if (this.hasIconCollisionBoxData()) this.iconCollisionBox.collisionVertexArrayExt.clear(); - const task = this.tasks[id]; - delete this.tasks[id]; - // Schedule another process call if we know there's more to process _before_ invoking the - // current task. This is necessary so that processing continues even if the current task - // doesn't execute successfully. - if (this.taskQueue.length) { - this.invoker.trigger(); - } - if (!task) { - // If the task ID doesn't have associated task data anymore, it was canceled. - return; - } + const iconSize = evaluateSizeForZoom(this.iconSizeData, zoom); + const textSize = evaluateSizeForZoom(this.textSizeData, zoom); - task.fn(); - } finally { - if (m) PerformanceUtils.endMeasure(m); + for (let i = 0; i < this.symbolInstances.length; i++) { + const symbolInstance = this.symbolInstances.get(i); + this._updateTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.textBoxStartIndex, symbolInstance.textBoxEndIndex, symbolInstance); + this._updateTextDebugCollisionBoxes(textSize, zoom, collisionBoxArray, symbolInstance.verticalTextBoxStartIndex, symbolInstance.verticalTextBoxEndIndex, symbolInstance); + this._updateIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.iconBoxStartIndex, symbolInstance.iconBoxEndIndex); + this._updateIconDebugCollisionBoxes(iconSize, zoom, collisionBoxArray, symbolInstance.verticalIconBoxStartIndex, symbolInstance.verticalIconBoxEndIndex); + } + + if (this.hasTextCollisionBoxData() && this.textCollisionBox.collisionVertexBufferExt) { + this.textCollisionBox.collisionVertexBufferExt.updateData(this.textCollisionBox.collisionVertexArrayExt); + } + if (this.hasIconCollisionBoxData() && this.iconCollisionBox.collisionVertexBufferExt) { + this.iconCollisionBox.collisionVertexBufferExt.updateData(this.iconCollisionBox.collisionVertexArrayExt); } } - pick() { - let minIndex = null; - let minPriority = Infinity; - for (let i = 0; i < this.taskQueue.length; i++) { - const id = this.taskQueue[i]; - const task = this.tasks[id]; - if (task.priority < minPriority) { - minPriority = task.priority; - minIndex = i; - } + // These flat arrays are meant to be quicker to iterate over than the source + // CollisionBoxArray + _deserializeCollisionBoxesForSymbol(collisionBoxArray , + textStartIndex , textEndIndex , + verticalTextStartIndex , verticalTextEndIndex , + iconStartIndex , iconEndIndex , + verticalIconStartIndex , verticalIconEndIndex ) { + + const collisionArrays = {}; + for (let k = textStartIndex; k < textEndIndex; k++) { + const box = (collisionBoxArray.get(k) ); + collisionArrays.textBox = {x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, padding: box.padding, projectedAnchorX: box.projectedAnchorX, projectedAnchorY: box.projectedAnchorY, projectedAnchorZ: box.projectedAnchorZ, tileAnchorX: box.tileAnchorX, tileAnchorY: box.tileAnchorY}; + collisionArrays.textFeatureIndex = box.featureIndex; + break; // Only one box allowed per instance } - if (minIndex === null) return null; - const id = this.taskQueue[minIndex]; - this.taskQueue.splice(minIndex, 1); - return id; + for (let k = verticalTextStartIndex; k < verticalTextEndIndex; k++) { + const box = (collisionBoxArray.get(k) ); + collisionArrays.verticalTextBox = {x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, padding: box.padding, projectedAnchorX: box.projectedAnchorX, projectedAnchorY: box.projectedAnchorY, projectedAnchorZ: box.projectedAnchorZ, tileAnchorX: box.tileAnchorX, tileAnchorY: box.tileAnchorY}; + collisionArrays.verticalTextFeatureIndex = box.featureIndex; + break; // Only one box allowed per instance + } + for (let k = iconStartIndex; k < iconEndIndex; k++) { + // An icon can only have one box now, so this indexing is a bit vestigial... + const box = (collisionBoxArray.get(k) ); + collisionArrays.iconBox = {x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, padding: box.padding, projectedAnchorX: box.projectedAnchorX, projectedAnchorY: box.projectedAnchorY, projectedAnchorZ: box.projectedAnchorZ, tileAnchorX: box.tileAnchorX, tileAnchorY: box.tileAnchorY}; + collisionArrays.iconFeatureIndex = box.featureIndex; + break; // Only one box allowed per instance + } + for (let k = verticalIconStartIndex; k < verticalIconEndIndex; k++) { + // An icon can only have one box now, so this indexing is a bit vestigial... + const box = (collisionBoxArray.get(k) ); + collisionArrays.verticalIconBox = {x1: box.x1, y1: box.y1, x2: box.x2, y2: box.y2, padding: box.padding, projectedAnchorX: box.projectedAnchorX, projectedAnchorY: box.projectedAnchorY, projectedAnchorZ: box.projectedAnchorZ, tileAnchorX: box.tileAnchorX, tileAnchorY: box.tileAnchorY}; + collisionArrays.verticalIconFeatureIndex = box.featureIndex; + break; // Only one box allowed per instance + } + return collisionArrays; } - remove() { - this.invoker.remove(); + deserializeCollisionBoxes(collisionBoxArray ) { + this.collisionArrays = []; + for (let i = 0; i < this.symbolInstances.length; i++) { + const symbolInstance = this.symbolInstances.get(i); + this.collisionArrays.push(this._deserializeCollisionBoxesForSymbol( + collisionBoxArray, + symbolInstance.textBoxStartIndex, + symbolInstance.textBoxEndIndex, + symbolInstance.verticalTextBoxStartIndex, + symbolInstance.verticalTextBoxEndIndex, + symbolInstance.iconBoxStartIndex, + symbolInstance.iconBoxEndIndex, + symbolInstance.verticalIconBoxStartIndex, + symbolInstance.verticalIconBoxEndIndex + )); + } } -} -function getPriority({type, isSymbolTile, zoom} ) { - zoom = zoom || 0; - if (type === 'message') return 0; - if (type === 'maybePrepare' && !isSymbolTile) return 100 - zoom; - if (type === 'parseTile' && !isSymbolTile) return 200 - zoom; - if (type === 'parseTile' && isSymbolTile) return 300 - zoom; - if (type === 'maybePrepare' && isSymbolTile) return 400 - zoom; - return 500; -} + hasTextData() { + return this.text.segments.get().length > 0; + } -// + hasIconData() { + return this.icon.segments.get().length > 0; + } - - + hasDebugData() { + return this.textCollisionBox && this.iconCollisionBox; + } -/** - * 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 - */ -class Actor { - - - - - - - - + hasTextCollisionBoxData() { + return this.hasDebugData() && this.textCollisionBox.segments.get().length > 0; + } - constructor(target , parent , mapId ) { - this.target = target; - this.parent = parent; - this.mapId = mapId; - this.callbacks = {}; - this.cancelCallbacks = {}; - bindAll(['receive'], this); - this.target.addEventListener('message', this.receive, false); - this.globalScope = isWorker() ? target : window$1; - this.scheduler = new Scheduler(); + hasIconCollisionBoxData() { + return this.hasDebugData() && this.iconCollisionBox.segments.get().length > 0; } - /** - * 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].[source-name].name' for a method on a WorkerSource. - * @param targetMapId A particular mapId to which to send this message. - * @private - */ - send(type , data , callback , targetMapId , mustQueue = false, callbackMetadata ) { - // We're using a string ID instead of numbers because they are being used as object keys - // anyway, and thus stringified implicitly. We use random IDs because an actor may receive - // message from multiple other actors which could run in different execution context. A - // linearly increasing ID could produce collisions. - const id = Math.round((Math.random() * 1e18)).toString(36).substring(0, 10); - if (callback) { - callback.metadata = callbackMetadata; - this.callbacks[id] = callback; + addIndicesForPlacedSymbol(iconOrText , placedSymbolIndex ) { + const placedSymbol = iconOrText.placedSymbolArray.get(placedSymbolIndex); + + const endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4; + for (let vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) { + iconOrText.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2); + iconOrText.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3); } - const buffers = isSafari(this.globalScope) ? undefined : []; - this.target.postMessage({ - id, - type, - hasCallback: !!callback, - targetMapId, - mustQueue, - sourceMapId: this.mapId, - data: serialize(data, buffers) - }, buffers); - return { - cancel: () => { - if (callback) { - // Set the callback to null so that it never fires after the request is aborted. - delete this.callbacks[id]; - } - this.target.postMessage({ - id, - type: '', - targetMapId, - sourceMapId: this.mapId - }); - } - }; } - receive(message ) { - const data = message.data, - id = data.id; - - if (!id) { - return; + getSortedSymbolIndexes(angle ) { + if (this.sortedAngle === angle && this.symbolInstanceIndexes !== undefined) { + return this.symbolInstanceIndexes; } + const sin = Math.sin(angle); + const cos = Math.cos(angle); + const rotatedYs = []; + const featureIndexes = []; + const result = []; - if (data.targetMapId && this.mapId !== data.targetMapId) { - return; + for (let i = 0; i < this.symbolInstances.length; ++i) { + result.push(i); + const symbolInstance = this.symbolInstances.get(i); + rotatedYs.push(Math.round(sin * symbolInstance.tileAnchorX + cos * symbolInstance.tileAnchorY) | 0); + featureIndexes.push(symbolInstance.featureIndex); } - if (data.type === '') { - // Remove the original request from the queue. This is only possible if it - // hasn't been kicked off yet. The id will remain in the queue, but because - // there is no associated task, it will be dropped once it's time to execute it. - const cancel = this.cancelCallbacks[id]; - delete this.cancelCallbacks[id]; - if (cancel) { - cancel.cancel(); - } + result.sort((aIndex, bIndex) => { + return (rotatedYs[aIndex] - rotatedYs[bIndex]) || + (featureIndexes[bIndex] - featureIndexes[aIndex]); + }); + + return result; + } + + addToSortKeyRanges(symbolInstanceIndex , sortKey ) { + const last = this.sortKeyRanges[this.sortKeyRanges.length - 1]; + if (last && last.sortKey === sortKey) { + last.symbolInstanceEnd = symbolInstanceIndex + 1; } else { - if (data.mustQueue || isWorker()) { - // for worker tasks that are often cancelled, such as loadTile, store them before actually - // processing them. This is necessary because we want to keep receiving messages. - // Some tasks may take a while in the worker thread, so before executing the next task - // in our queue, postMessage preempts this and messages can be processed. - // We're using a MessageChannel object to get throttle the process() flow to one at a time. - const callback = this.callbacks[id]; - const metadata = (callback && callback.metadata) || {type: "message"}; - this.cancelCallbacks[id] = this.scheduler.add(() => this.processTask(id, data), metadata); - } else { - // In the main thread, process messages immediately so that other work does not slip in - // between getting partial data back from workers. - this.processTask(id, data); - } + this.sortKeyRanges.push({ + sortKey, + symbolInstanceStart: symbolInstanceIndex, + symbolInstanceEnd: symbolInstanceIndex + 1 + }); } } - processTask(id , task ) { - if (task.type === '') { - // The done() function in the counterpart has been called, and we are now - // firing the callback in the originating actor, if there is one. - const callback = this.callbacks[id]; - delete this.callbacks[id]; - if (callback) { - // If we get a response, but don't have a callback, the request was canceled. - if (task.error) { - callback(deserialize(task.error)); - } else { - callback(null, deserialize(task.data)); + sortFeatures(angle ) { + if (!this.sortFeaturesByY) return; + if (this.sortedAngle === angle) return; + + // 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. + this.symbolInstanceIndexes = this.getSortedSymbolIndexes(angle); + this.sortedAngle = angle; + + this.text.indexArray.clear(); + this.icon.indexArray.clear(); + + this.featureSortOrder = []; + + for (const i of this.symbolInstanceIndexes) { + const symbolInstance = this.symbolInstances.get(i); + this.featureSortOrder.push(symbolInstance.featureIndex); + + [ + symbolInstance.rightJustifiedTextSymbolIndex, + symbolInstance.centerJustifiedTextSymbolIndex, + symbolInstance.leftJustifiedTextSymbolIndex + ].forEach((index, i, array) => { + // Only add a given index the first time it shows up, + // to avoid duplicate opacity entries when multiple justifications + // share the same glyphs. + if (index >= 0 && array.indexOf(index) === i) { + this.addIndicesForPlacedSymbol(this.text, index); } + }); + + if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) { + this.addIndicesForPlacedSymbol(this.text, symbolInstance.verticalPlacedTextSymbolIndex); + } + + if (symbolInstance.placedIconSymbolIndex >= 0) { + this.addIndicesForPlacedSymbol(this.icon, symbolInstance.placedIconSymbolIndex); } - } else { - const buffers = isSafari(this.globalScope) ? undefined : []; - const done = task.hasCallback ? (err, data) => { - delete this.cancelCallbacks[id]; - this.target.postMessage({ - id, - type: '', - sourceMapId: this.mapId, - error: err ? serialize(err) : null, - data: serialize(data, buffers) - }, buffers); - } : (_) => { - }; - const params = (deserialize(task.data) ); - if (this.parent[task.type]) { - // task.type == 'loadTile', 'removeTile', etc. - this.parent[task.type](task.sourceMapId, params, done); - } else if (this.parent.getWorkerSource) { - // task.type == sourcetype.method - const keys = task.type.split('.'); - const scope = (this.parent ).getWorkerSource(task.sourceMapId, keys[0], params.source); - scope[keys[1]](params, done); - } else { - // No function was found. - done(new Error(`Could not find function ${task.type}`)); + if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) { + this.addIndicesForPlacedSymbol(this.icon, symbolInstance.verticalPlacedIconSymbolIndex); } } - } - remove() { - this.scheduler.remove(); - this.target.removeEventListener('message', this.receive, false); + 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'] +}); - - - +// 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; -/** - * 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 - */ -function pixelsToTileUnits(tile , pixelValue , z ) { - return pixelValue * (EXTENT$1 / (tile.tileSize * Math.pow(2, z - tile.tileID.overscaledZ))); -} +SymbolBucket.addDynamicAttributes = addDynamicAttributes; -function getPixelsToTileUnitsMatrix(tile , transform ) { - const {scale: scale$1} = tile.tileTransform; - const s = scale$1 * EXTENT$1 / (tile.tileSize * Math.pow(2, transform.zoom - tile.tileID.overscaledZ + tile.tileID.canonical.z)); - return scale(new Float32Array(4), transform.inverseAdjustmentMatrix, [s, s]); -} +var SymbolBucket$1 = SymbolBucket; + +// /** - * getURL + * Replace tokens in a string template with values in an object * - * @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); + * @param properties a key/value relationship between tokens and replacements + * @param text the template string + * @returns the template with tokens replaced + * @private */ -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; +function resolveTokens(properties , text ) { + return text.replace(/{([^{}]+)}/g, (match, key ) => { + return key in properties ? String(properties[key]) : ''; + }); } +// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. -/** - * 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]; -} +const layout = new Properties({ + "symbol-placement": new DataConstantProperty(spec["layout_symbol"]["symbol-placement"]), + "symbol-spacing": new DataConstantProperty(spec["layout_symbol"]["symbol-spacing"]), + "symbol-avoid-edges": new DataConstantProperty(spec["layout_symbol"]["symbol-avoid-edges"]), + "symbol-sort-key": new DataDrivenProperty(spec["layout_symbol"]["symbol-sort-key"]), + "symbol-z-order": new DataConstantProperty(spec["layout_symbol"]["symbol-z-order"]), + "icon-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["icon-allow-overlap"]), + "icon-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["icon-ignore-placement"]), + "icon-optional": new DataConstantProperty(spec["layout_symbol"]["icon-optional"]), + "icon-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-rotation-alignment"]), + "icon-size": new DataDrivenProperty(spec["layout_symbol"]["icon-size"]), + "icon-text-fit": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit"]), + "icon-text-fit-padding": new DataConstantProperty(spec["layout_symbol"]["icon-text-fit-padding"]), + "icon-image": new DataDrivenProperty(spec["layout_symbol"]["icon-image"]), + "icon-rotate": new DataDrivenProperty(spec["layout_symbol"]["icon-rotate"]), + "icon-padding": new DataConstantProperty(spec["layout_symbol"]["icon-padding"]), + "icon-keep-upright": new DataConstantProperty(spec["layout_symbol"]["icon-keep-upright"]), + "icon-offset": new DataDrivenProperty(spec["layout_symbol"]["icon-offset"]), + "icon-anchor": new DataDrivenProperty(spec["layout_symbol"]["icon-anchor"]), + "icon-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["icon-pitch-alignment"]), + "text-pitch-alignment": new DataConstantProperty(spec["layout_symbol"]["text-pitch-alignment"]), + "text-rotation-alignment": new DataConstantProperty(spec["layout_symbol"]["text-rotation-alignment"]), + "text-field": new DataDrivenProperty(spec["layout_symbol"]["text-field"]), + "text-font": new DataDrivenProperty(spec["layout_symbol"]["text-font"]), + "text-size": new DataDrivenProperty(spec["layout_symbol"]["text-size"]), + "text-max-width": new DataDrivenProperty(spec["layout_symbol"]["text-max-width"]), + "text-line-height": new DataDrivenProperty(spec["layout_symbol"]["text-line-height"]), + "text-letter-spacing": new DataDrivenProperty(spec["layout_symbol"]["text-letter-spacing"]), + "text-justify": new DataDrivenProperty(spec["layout_symbol"]["text-justify"]), + "text-radial-offset": new DataDrivenProperty(spec["layout_symbol"]["text-radial-offset"]), + "text-variable-anchor": new DataConstantProperty(spec["layout_symbol"]["text-variable-anchor"]), + "text-anchor": new DataDrivenProperty(spec["layout_symbol"]["text-anchor"]), + "text-max-angle": new DataConstantProperty(spec["layout_symbol"]["text-max-angle"]), + "text-writing-mode": new DataConstantProperty(spec["layout_symbol"]["text-writing-mode"]), + "text-rotate": new DataDrivenProperty(spec["layout_symbol"]["text-rotate"]), + "text-padding": new DataConstantProperty(spec["layout_symbol"]["text-padding"]), + "text-keep-upright": new DataConstantProperty(spec["layout_symbol"]["text-keep-upright"]), + "text-transform": new DataDrivenProperty(spec["layout_symbol"]["text-transform"]), + "text-offset": new DataDrivenProperty(spec["layout_symbol"]["text-offset"]), + "text-allow-overlap": new DataConstantProperty(spec["layout_symbol"]["text-allow-overlap"]), + "text-ignore-placement": new DataConstantProperty(spec["layout_symbol"]["text-ignore-placement"]), + "text-optional": new DataConstantProperty(spec["layout_symbol"]["text-optional"]), +}); + + + + + + + + + + + + + + + + -/** - * 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); +const paint$3 = new Properties({ + "icon-opacity": new DataDrivenProperty(spec["paint_symbol"]["icon-opacity"]), + "icon-color": new DataDrivenProperty(spec["paint_symbol"]["icon-color"]), + "icon-halo-color": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-color"]), + "icon-halo-width": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-width"]), + "icon-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["icon-halo-blur"]), + "icon-translate": new DataConstantProperty(spec["paint_symbol"]["icon-translate"]), + "icon-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["icon-translate-anchor"]), + "text-opacity": new DataDrivenProperty(spec["paint_symbol"]["text-opacity"]), + "text-color": new DataDrivenProperty(spec["paint_symbol"]["text-color"], { runtimeType: ColorType, getOverride: (o) => o.textColor, hasOverride: (o) => !!o.textColor }), + "text-halo-color": new DataDrivenProperty(spec["paint_symbol"]["text-halo-color"]), + "text-halo-width": new DataDrivenProperty(spec["paint_symbol"]["text-halo-width"]), + "text-halo-blur": new DataDrivenProperty(spec["paint_symbol"]["text-halo-blur"]), + "text-translate": new DataConstantProperty(spec["paint_symbol"]["text-translate"]), + "text-translate-anchor": new DataConstantProperty(spec["paint_symbol"]["text-translate-anchor"]), +}); - return [merc_x, merc_y]; -} +// Note: without adding the explicit type annotation, Flow infers weaker types +// for these objects from their use in the constructor to StyleLayer, as +// {layout?: Properties<...>, paint: Properties<...>} +var properties$3 = ({ paint: paint$3, layout } + + ); // -class CanonicalTileID { - - - - +// This is an internal expression class. It is only used in GL JS and +// has GL JS dependencies which can break the standalone style-spec module +class FormatSectionOverride { + + - constructor(z , x , y ) { - assert_1(z >= 0 && z <= 25); - assert_1(x >= 0 && x < Math.pow(2, z)); - assert_1(y >= 0 && y < Math.pow(2, z)); - this.z = z; - this.x = x; - this.y = y; - this.key = calculateKey(0, z, z, x, y); + constructor(defaultValue ) { + assert_1(defaultValue.property.overrides !== undefined); + this.type = defaultValue.property.overrides ? defaultValue.property.overrides.runtimeType : NullType; + this.defaultValue = defaultValue; } - equals(id ) { - return this.z === id.z && this.x === id.x && this.y === id.y; - } + evaluate(ctx ) { + if (ctx.formattedSection) { + const overrides = this.defaultValue.property.overrides; + if (overrides && overrides.hasOverride(ctx.formattedSection)) { + return overrides.getOverride(ctx.formattedSection); + } + } - // given a list of urls, choose a url template and return a tile URL - url(urls , scheme ) { - const bbox = getTileBBox(this.x, this.y, this.z); - const quadkey = getQuadkey(this.z, this.x, this.y); + if (ctx.feature && ctx.featureState) { + return this.defaultValue.evaluate(ctx.feature, ctx.featureState); + } - 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); + // not sure how to make Flow refine the type properly here — will need investigation + return ((this.defaultValue.property.specification.default ) ); } - toString() { - return `${this.z}/${this.x}/${this.y}`; + eachChild(fn ) { + if (!this.defaultValue.isConstant()) { + const expr = ((this.defaultValue.value) ); + fn(expr._styleExpression.expression); + } } -} -class UnwrappedTileID { - - - + // Cannot be statically evaluated, as the output depends on the evaluation context. + outputDefined() { + return false; + } - constructor(wrap , canonical ) { - this.wrap = wrap; - this.canonical = canonical; - this.key = calculateKey(wrap, canonical.z, canonical.z, canonical.x, canonical.y); + serialize() { + return null; } } -class OverscaledTileID { - - - - - +register(FormatSectionOverride, 'FormatSectionOverride', {omit: ['defaultValue']}); - constructor(overscaledZ , wrap , z , x , y ) { - assert_1(overscaledZ >= z); - this.overscaledZ = overscaledZ; - this.wrap = wrap; - this.canonical = new CanonicalTileID(z, +x, +y); - this.key = wrap === 0 && overscaledZ === z ? this.canonical.key : calculateKey(wrap, overscaledZ, z, x, y); - } +// - equals(id ) { - return this.overscaledZ === id.overscaledZ && this.wrap === id.wrap && this.canonical.equals(id.canonical); - } +class SymbolStyleLayer extends StyleLayer { + + - scaledTo(targetZ ) { - assert_1(targetZ <= this.overscaledZ); - const 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); - } - } + + + - /* - * calculateScaledKey is an optimization: - * when withWrap == true, implements the same as this.scaledTo(z).key, - * when withWrap == false, implements the same as this.scaledTo(z).wrapped().key. - */ - calculateScaledKey(targetZ , withWrap = true) { - if (this.overscaledZ === targetZ && withWrap) return this.key; - if (targetZ > this.canonical.z) { - return calculateKey(this.wrap * +withWrap, targetZ, this.canonical.z, this.canonical.x, this.canonical.y); - } else { - const zDifference = this.canonical.z - targetZ; - return calculateKey(this.wrap * +withWrap, targetZ, targetZ, this.canonical.x >> zDifference, this.canonical.y >> zDifference); - } + constructor(layer ) { + super(layer, properties$3); } - isChildOf(parent ) { - if (parent.wrap !== this.wrap) { - // We can't be a child if we're in a different world copy - return false; - } - const 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)); - } + recalculate(parameters , availableImages ) { + super.recalculate(parameters, availableImages); - 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)]; + if (this.layout.get('icon-rotation-alignment') === 'auto') { + if (this.layout.get('symbol-placement') !== 'point') { + this.layout._values['icon-rotation-alignment'] = 'map'; + } else { + this.layout._values['icon-rotation-alignment'] = 'viewport'; + } } - const z = this.canonical.z + 1; - const x = this.canonical.x * 2; - const 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) - ]; - } - - isLessThan(rhs ) { - if (this.wrap < rhs.wrap) return true; - if (this.wrap > rhs.wrap) return false; + if (this.layout.get('text-rotation-alignment') === 'auto') { + if (this.layout.get('symbol-placement') !== 'point') { + this.layout._values['text-rotation-alignment'] = 'map'; + } else { + this.layout._values['text-rotation-alignment'] = 'viewport'; + } + } - if (this.overscaledZ < rhs.overscaledZ) return true; - if (this.overscaledZ > rhs.overscaledZ) return false; + // 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'); + } - if (this.canonical.x < rhs.canonical.x) return true; - if (this.canonical.x > rhs.canonical.x) return false; + const writingModes = this.layout.get('text-writing-mode'); + if (writingModes) { + // remove duplicates, preserving order + const deduped = []; + for (const m of writingModes) { + if (deduped.indexOf(m) < 0) deduped.push(m); + } + this.layout._values['text-writing-mode'] = deduped; + } else if (this.layout.get('symbol-placement') === 'point') { + // default value for 'point' placement symbols + this.layout._values['text-writing-mode'] = ['horizontal']; + } else { + // default value for 'line' placement symbols + this.layout._values['text-writing-mode'] = ['horizontal', 'vertical']; + } - if (this.canonical.y < rhs.canonical.y) return true; - return false; + this._setPaintOverrides(); } - wrapped() { - return new OverscaledTileID(this.overscaledZ, 0, this.canonical.z, this.canonical.x, this.canonical.y); - } + getValueAndResolveTokens(name , feature , canonical , availableImages ) { + const value = this.layout.get(name).evaluate(feature, {}, canonical, availableImages); + const unevaluated = this._unevaluatedLayout._values[name]; + if (!unevaluated.isDataDriven() && !isExpression(unevaluated.value) && value) { + return resolveTokens(feature.properties, value); + } - unwrapTo(wrap ) { - return new OverscaledTileID(this.overscaledZ, wrap, this.canonical.z, this.canonical.x, this.canonical.y); + return value; } - overscaleFactor() { - return Math.pow(2, this.overscaledZ - this.canonical.z); + createBucket(parameters ) { + return new SymbolBucket$1(parameters); } - toUnwrapped() { - return new UnwrappedTileID(this.wrap, this.canonical); + queryRadius() { + return 0; } - toString() { - return `${this.overscaledZ}/${this.canonical.x}/${this.canonical.y}`; + queryIntersectsFeature() { + assert_1(false); // Should take a different path in FeatureIndex + return false; } -} - -function calculateKey(wrap , overscaledZ , z , x , y ) { - // only use 22 bits for x & y so that the key fits into MAX_SAFE_INTEGER - const dim = 1 << Math.min(z, 22); - let xy = dim * (y % dim) + (x % dim); - // zigzag-encode wrap if we have the room for it - if (wrap && z < 22) { - const bitsAvailable = 2 * (22 - z); - xy += dim * dim * ((wrap < 0 ? -2 * wrap - 1 : 2 * wrap) % (1 << bitsAvailable)); + _setPaintOverrides() { + for (const overridable of properties$3.paint.overridableProperties) { + if (!SymbolStyleLayer.hasPaintOverride(this.layout, overridable)) { + continue; + } + const overriden = this.paint.get(overridable); + const override = new FormatSectionOverride(overriden); + const styleExpression = new StyleExpression(override, overriden.property.specification); + let expression = null; + if (overriden.value.kind === 'constant' || overriden.value.kind === 'source') { + expression = (new ZoomConstantExpression('source', styleExpression) ); + } else { + expression = (new ZoomDependentExpression('composite', + styleExpression, + overriden.value.zoomStops, + overriden.value._interpolationType) ); + } + this.paint._values[overridable] = new PossiblyEvaluatedPropertyValue(overriden.property, + expression, + overriden.parameters); + } } - // encode z into 5 bits (24 max) and overscaledZ into 4 bits (10 max) - const key = ((xy * 32) + z) * 16 + (overscaledZ - z); - assert_1(key >= 0 && key <= Number.MAX_SAFE_INTEGER); - - return key; -} - -function getQuadkey(z, x, y) { - let quadkey = '', mask; - for (let i = z; i > 0; i--) { - mask = 1 << (i - 1); - quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0)); + _handleOverridablePaintPropertyUpdate (name , oldValue , newValue ) { + if (!this.layout || oldValue.isDataDriven() || newValue.isDataDriven()) { + return false; + } + return SymbolStyleLayer.hasPaintOverride(this.layout, name); } - return quadkey; -} - -register('CanonicalTileID', CanonicalTileID); -register('OverscaledTileID', OverscaledTileID, {omit: ['projMatrix']}); - -// - - - + static hasPaintOverride(layout , propertyName ) { + const textField = layout.get('text-field'); + const property = properties$3.paint.properties[propertyName]; + let hasOverrides = false; -class IndexBuffer { - - - + const checkSections = (sections) => { + for (const section of sections) { + if (property.overrides && property.overrides.hasOverride(section)) { + hasOverrides = true; + return; + } + } + }; - constructor(context , array , dynamicDraw ) { - this.context = context; - const gl = context.gl; - this.buffer = gl.createBuffer(); - this.dynamicDraw = Boolean(dynamicDraw); + if (textField.value.kind === 'constant' && textField.value.value instanceof Formatted) { + checkSections(textField.value.value.sections); + } else if (textField.value.kind === 'source') { - // 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. - this.context.unbindVAO(); + const checkExpression = (expression ) => { + if (hasOverrides) return; - context.bindElementBuffer.set(this.buffer); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, array.arrayBuffer, this.dynamicDraw ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW); + if (expression instanceof Literal && typeOf(expression.value) === FormattedType) { + const formatted = ((expression.value) ); + checkSections(formatted.sections); + } else if (expression instanceof FormatExpression) { + checkSections(expression.sections); + } else { + expression.eachChild(checkExpression); + } + }; - if (!this.dynamicDraw) { - delete array.arrayBuffer; + const expr = ((textField.value) ); + if (expr._styleExpression) { + checkExpression(expr._styleExpression.expression); + } } - } - - bind() { - this.context.bindElementBuffer.set(this.buffer); - } - updateData(array ) { - const gl = this.context.gl; - assert_1(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.context.unbindVAO(); - this.bind(); - gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, array.arrayBuffer); + return hasOverrides; } - destroy() { - const gl = this.context.gl; - if (this.buffer) { - gl.deleteBuffer(this.buffer); - delete this.buffer; - } + getProgramConfiguration(zoom ) { + return new ProgramConfiguration(this, zoom); } } -// - - - - - +// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. - - + -/** - * @enum {string} AttributeType - * @private - * @readonly - */ -const 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 - */ -class VertexBuffer { - - - - - - + - /** - * @param dynamicDraw Whether this buffer will be repeatedly updated. - * @private - */ - constructor(context , array , attributes , dynamicDraw ) { - this.length = array.length; - this.attributes = attributes; - this.itemSize = array.bytesPerElement; - this.dynamicDraw = dynamicDraw; - this.context = context; - const 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; - } - } +const paint$2 = new Properties({ + "background-color": new DataConstantProperty(spec["paint_background"]["background-color"]), + "background-pattern": new CrossFadedProperty(spec["paint_background"]["background-pattern"]), + "background-opacity": new DataConstantProperty(spec["paint_background"]["background-opacity"]), +}); - bind() { - this.context.bindVertexBuffer.set(this.buffer); - } +// Note: without adding the explicit type annotation, Flow infers weaker types +// for these objects from their use in the constructor to StyleLayer, as +// {layout?: Properties<...>, paint: Properties<...>} +var properties$2 = ({ paint: paint$2 } + + ); - updateData(array ) { - assert_1(array.length === this.length); - const gl = this.context.gl; - this.bind(); - gl.bufferSubData(gl.ARRAY_BUFFER, 0, array.arrayBuffer); - } +// - enableAttributes(gl , program ) { - for (let j = 0; j < this.attributes.length; j++) { - const member = this.attributes[j]; - const 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. - */ - setVertexAttribPointers(gl , program , vertexOffset ) { - for (let j = 0; j < this.attributes.length; j++) { - const member = this.attributes[j]; - const attribIndex = program.attributes[member.name]; +class BackgroundStyleLayer extends StyleLayer { + + + - if (attribIndex !== undefined) { - gl.vertexAttribPointer( - attribIndex, - member.components, - (gl )[AttributeType[member.type]], - false, - this.itemSize, - member.offset + (this.itemSize * (vertexOffset || 0)) - ); - } - } + constructor(layer ) { + super(layer, properties$2); } - /** - * Destroy the GL buffer bound to the given WebGL context. - */ - destroy() { - const gl = this.context.gl; - if (this.buffer) { - gl.deleteBuffer(this.buffer); - delete this.buffer; - } + getProgramIds() { + const image = this.paint.get('background-pattern'); + return [image ? 'backgroundPattern' : 'background']; } } -// +// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + -class BaseValue { - - - - +const paint$1 = new Properties({ + "raster-opacity": new DataConstantProperty(spec["paint_raster"]["raster-opacity"]), + "raster-hue-rotate": new DataConstantProperty(spec["paint_raster"]["raster-hue-rotate"]), + "raster-brightness-min": new DataConstantProperty(spec["paint_raster"]["raster-brightness-min"]), + "raster-brightness-max": new DataConstantProperty(spec["paint_raster"]["raster-brightness-max"]), + "raster-saturation": new DataConstantProperty(spec["paint_raster"]["raster-saturation"]), + "raster-contrast": new DataConstantProperty(spec["paint_raster"]["raster-contrast"]), + "raster-resampling": new DataConstantProperty(spec["paint_raster"]["raster-resampling"]), + "raster-fade-duration": new DataConstantProperty(spec["paint_raster"]["raster-fade-duration"]), +}); - constructor(context ) { - this.gl = context.gl; - this.default = this.getDefault(); - this.current = this.default; - this.dirty = false; - } +// Note: without adding the explicit type annotation, Flow infers weaker types +// for these objects from their use in the constructor to StyleLayer, as +// {layout?: Properties<...>, paint: Properties<...>} +var properties$1 = ({ paint: paint$1 } + + ); - get() { - return this.current; - } - set(value ) { // eslint-disable-line - // overridden in child classes; - } +// - getDefault() { - return this.default; // overriden in child classes - } - setDefault() { - this.set(this.default); - } -} + + -class ClearColor extends BaseValue { - getDefault() { - return Color.transparent; - } - set(v ) { - const c = this.current; - if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) return; - this.gl.clearColor(v.r, v.g, v.b, v.a); - this.current = v; - this.dirty = false; - } -} +class RasterStyleLayer extends StyleLayer { + + + -class ClearDepth extends BaseValue { - getDefault() { - return 1; - } - set(v ) { - if (v === this.current && !this.dirty) return; - this.gl.clearDepth(v); - this.current = v; - this.dirty = false; + constructor(layer ) { + super(layer, properties$1); } -} -class ClearStencil extends BaseValue { - getDefault() { - return 0; - } - set(v ) { - if (v === this.current && !this.dirty) return; - this.gl.clearStencil(v); - this.current = v; - this.dirty = false; + getProgramIds() { + return ['raster']; } } -class ColorMask extends BaseValue { - getDefault() { - return [true, true, true, true]; - } - set(v ) { - const c = this.current; - if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) return; - this.gl.colorMask(v[0], v[1], v[2], v[3]); - this.current = v; - this.dirty = false; - } -} +// + -class DepthMask extends BaseValue { - getDefault() { - return true; - } - set(v ) { - if (v === this.current && !this.dirty) return; - this.gl.depthMask(v); - this.current = v; - this.dirty = false; - } -} + -class StencilMask extends BaseValue { - getDefault() { - return 0xFF; - } - set(v ) { - if (v === this.current && !this.dirty) return; - this.gl.stencilMask(v); - this.current = v; - this.dirty = false; - } -} +/** + * Interface for custom style layers. This is a specification for + * implementers to model: it is not an exported method or class. + * + * Custom layers allow a user to render directly into the map's GL context using the map's camera. + * These layers can be added between any regular layers using {@link Map#addLayer}. + * + * Custom layers must have a unique `id` and must have the `type` of `"custom"`. + * They must implement `render` and may implement `prerender`, `onAdd` and `onRemove`. + * They can trigger rendering using {@link Map#triggerRepaint} + * and they should appropriately handle {@link Map.event:webglcontextlost} and + * {@link Map.event:webglcontextrestored}. + * + * The `renderingMode` property controls whether the layer is treated as a `"2d"` or `"3d"` map layer. Use: + * - `"renderingMode": "3d"` to use the depth buffer and share it with other layers + * - `"renderingMode": "2d"` to add a layer with no depth. If you need to use the depth buffer for a `"2d"` layer you must use an offscreen + * framebuffer and {@link CustomLayerInterface#prerender}. + * + * @interface CustomLayerInterface + * @property {string} id A unique layer id. + * @property {string} type The layer's type. Must be `"custom"`. + * @property {string} renderingMode Either `"2d"` or `"3d"`. Defaults to `"2d"`. + * @example + * // Custom layer implemented as ES6 class + * class NullIslandLayer { + * constructor() { + * this.id = 'null-island'; + * this.type = 'custom'; + * this.renderingMode = '2d'; + * } + * + * onAdd(map, gl) { + * const vertexSource = ` + * uniform mat4 u_matrix; + * void main() { + * gl_Position = u_matrix * vec4(0.5, 0.5, 0.0, 1.0); + * gl_PointSize = 20.0; + * }`; + * + * const fragmentSource = ` + * void main() { + * gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + * }`; + * + * const vertexShader = gl.createShader(gl.VERTEX_SHADER); + * gl.shaderSource(vertexShader, vertexSource); + * gl.compileShader(vertexShader); + * const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); + * gl.shaderSource(fragmentShader, fragmentSource); + * gl.compileShader(fragmentShader); + * + * this.program = gl.createProgram(); + * gl.attachShader(this.program, vertexShader); + * gl.attachShader(this.program, fragmentShader); + * gl.linkProgram(this.program); + * } + * + * render(gl, matrix) { + * gl.useProgram(this.program); + * gl.uniformMatrix4fv(gl.getUniformLocation(this.program, "u_matrix"), false, matrix); + * gl.drawArrays(gl.POINTS, 0, 1); + * } + * } + * + * map.on('load', () => { + * map.addLayer(new NullIslandLayer()); + * }); + * @see [Example: Add a custom style layer](https://docs.mapbox.com/mapbox-gl-js/example/custom-style-layer/) + * @see [Example: Add a 3D model](https://docs.mapbox.com/mapbox-gl-js/example/add-3d-model/) + */ -class StencilFunc extends BaseValue { - getDefault() { - return { - func: this.gl.ALWAYS, - ref: 0, - mask: 0xFF - }; - } - set(v ) { - const c = this.current; - if (v.func === c.func && v.ref === c.ref && v.mask === c.mask && !this.dirty) return; - // Assume UNSIGNED_INT_24_8 storage, with 8 bits dedicated to stencil. - // Please revise your stencil values if this threshold is triggered. - assert_1(v.ref >= 0 && v.ref <= 255); - this.gl.stencilFunc(v.func, v.ref, v.mask); - this.current = v; - this.dirty = false; +/** + * Optional method called when the layer has been added to the Map with {@link Map#addLayer}. This + * gives the layer a chance to initialize gl resources and register event listeners. + * + * @function + * @memberof CustomLayerInterface + * @instance + * @name onAdd + * @param {Map} map The Map this custom layer was just added to. + * @param {WebGLRenderingContext} gl The gl context for the map. + */ + +/** + * Optional method called when the layer has been removed from the Map with {@link Map#removeLayer}. This + * gives the layer a chance to clean up gl resources and event listeners. + * + * @function + * @memberof CustomLayerInterface + * @instance + * @name onRemove + * @param {Map} map The Map this custom layer was just added to. + * @param {WebGLRenderingContext} gl The gl context for the map. + */ + +/** + * Optional method called during a render frame to allow a layer to prepare resources or render into a texture. + * + * The layer cannot make any assumptions about the current GL state and must bind a framebuffer before rendering. + * + * @function + * @memberof CustomLayerInterface + * @instance + * @name prerender + * @param {WebGLRenderingContext} gl The map's gl context. + * @param {Array} matrix The map's camera matrix. It projects spherical mercator + * coordinates to gl coordinates. The mercator coordinate `[0, 0]` represents the + * top left corner of the mercator world and `[1, 1]` represents the bottom right corner. When + * the `renderingMode` is `"3d"`, the z coordinate is conformal. A box with identical x, y, and z + * lengths in mercator units would be rendered as a cube. {@link MercatorCoordinate}.fromLngLat + * can be used to project a `LngLat` to a mercator coordinate. + */ + +/** + * Called during a render frame allowing the layer to draw into the GL context. + * + * The layer can assume blending and depth state is set to allow the layer to properly + * blend and clip other layers. The layer cannot make any other assumptions about the + * current GL state. + * + * If the layer needs to render to a texture, it should implement the `prerender` method + * to do this and only use the `render` method for drawing directly into the main framebuffer. + * + * The blend function is set to `gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)`. This expects + * colors to be provided in premultiplied alpha form where the `r`, `g` and `b` values are already + * multiplied by the `a` value. If you are unable to provide colors in premultiplied form you + * may want to change the blend function to + * `gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA)`. + * + * @function + * @memberof CustomLayerInterface + * @instance + * @name render + * @param {WebGLRenderingContext} gl The map's gl context. + * @param {Array} matrix The map's camera matrix. It projects spherical mercator + * coordinates to gl coordinates. The spherical mercator coordinate `[0, 0]` represents the + * top left corner of the mercator world and `[1, 1]` represents the bottom right corner. When + * the `renderingMode` is `"3d"`, the z coordinate is conformal. A box with identical x, y, and z + * lengths in mercator units would be rendered as a cube. {@link MercatorCoordinate}.fromLngLat + * can be used to project a `LngLat` to a mercator coordinate. + */ + + + + + + + + + + +function validateCustomStyleLayer(layerObject ) { + const errors = []; + const id = layerObject.id; + + if (id === undefined) { + errors.push({ + message: `layers.${id}: missing required property "id"` + }); } -} -class StencilOp extends BaseValue { - getDefault() { - const gl = this.gl; - return [gl.KEEP, gl.KEEP, gl.KEEP]; + if (layerObject.render === undefined) { + errors.push({ + message: `layers.${id}: missing required method "render"` + }); } - set(v ) { - const c = this.current; - if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && !this.dirty) return; - this.gl.stencilOp(v[0], v[1], v[2]); - this.current = v; - this.dirty = false; + + if (layerObject.renderingMode && + layerObject.renderingMode !== '2d' && + layerObject.renderingMode !== '3d') { + errors.push({ + message: `layers.${id}: property "renderingMode" must be either "2d" or "3d"` + }); } + + return errors; } -class StencilTest extends BaseValue { - getDefault() { - return false; - } - set(v ) { - if (v === this.current && !this.dirty) return; - const gl = this.gl; - if (v) { - gl.enable(gl.STENCIL_TEST); - } else { - gl.disable(gl.STENCIL_TEST); - } - this.current = v; - this.dirty = false; +class CustomStyleLayer extends StyleLayer { + + + + constructor(implementation ) { + super(implementation, {}); + this.implementation = implementation; } -} -class DepthRange extends BaseValue { - getDefault() { - return [0, 1]; + is3D() { + return this.implementation.renderingMode === '3d'; } - set(v ) { - const c = this.current; - if (v[0] === c[0] && v[1] === c[1] && !this.dirty) return; - this.gl.depthRange(v[0], v[1]); - this.current = v; - this.dirty = false; + + hasOffscreenPass() { + return this.implementation.prerender !== undefined; } -} -class DepthTest extends BaseValue { - getDefault() { + recalculate() {} + updateTransitions() {} + hasTransition() { return false; } - set(v ) { - if (v === this.current && !this.dirty) return; - const gl = this.gl; - if (v) { - gl.enable(gl.DEPTH_TEST); - } else { - gl.disable(gl.DEPTH_TEST); - } - this.current = v; - this.dirty = false; - } -} -class DepthFunc extends BaseValue { - getDefault() { - return this.gl.LESS; - } - set(v ) { - if (v === this.current && !this.dirty) return; - this.gl.depthFunc(v); - this.current = v; - this.dirty = false; + // $FlowFixMe[incompatible-extend] - CustomStyleLayer is not serializable + serialize() { + assert_1(false, "Custom layers cannot be serialized"); } -} -class Blend extends BaseValue { - getDefault() { - return false; + onAdd(map ) { + if (this.implementation.onAdd) { + this.implementation.onAdd(map, map.painter.context.gl); + } } - set(v ) { - if (v === this.current && !this.dirty) return; - const gl = this.gl; - if (v) { - gl.enable(gl.BLEND); - } else { - gl.disable(gl.BLEND); + + onRemove(map ) { + if (this.implementation.onRemove) { + this.implementation.onRemove(map, map.painter.context.gl); } - this.current = v; - this.dirty = false; } } -class BlendFunc extends BaseValue { - getDefault() { - const gl = this.gl; - return [gl.ONE, gl.ZERO]; - } - set(v ) { - const c = this.current; - if (v[0] === c[0] && v[1] === c[1] && !this.dirty) return; - this.gl.blendFunc(v[0], v[1]); - this.current = v; - this.dirty = false; - } +// This file is generated. Edit build/generate-style-code.js, then run `yarn run codegen`. + + + + + + + + + + + + + + + + + + + + +const paint = new Properties({ + "sky-type": new DataConstantProperty(spec["paint_sky"]["sky-type"]), + "sky-atmosphere-sun": new DataConstantProperty(spec["paint_sky"]["sky-atmosphere-sun"]), + "sky-atmosphere-sun-intensity": new DataConstantProperty(spec["paint_sky"]["sky-atmosphere-sun-intensity"]), + "sky-gradient-center": new DataConstantProperty(spec["paint_sky"]["sky-gradient-center"]), + "sky-gradient-radius": new DataConstantProperty(spec["paint_sky"]["sky-gradient-radius"]), + "sky-gradient": new ColorRampProperty(spec["paint_sky"]["sky-gradient"]), + "sky-atmosphere-halo-color": new DataConstantProperty(spec["paint_sky"]["sky-atmosphere-halo-color"]), + "sky-atmosphere-color": new DataConstantProperty(spec["paint_sky"]["sky-atmosphere-color"]), + "sky-opacity": new DataConstantProperty(spec["paint_sky"]["sky-opacity"]), +}); + +// Note: without adding the explicit type annotation, Flow infers weaker types +// for these objects from their use in the constructor to StyleLayer, as +// {layout?: Properties<...>, paint: Properties<...>} +var properties = ({ paint } + + ); + +// + +function getCelestialDirection(azimuth , altitude , leftHanded ) { + const up = [0, 0, 1]; + const rotation = identity$2([]); + + rotateY$1(rotation, rotation, leftHanded ? -degToRad(azimuth) + Math.PI : degToRad(azimuth)); + rotateX$1(rotation, rotation, -degToRad(altitude)); + transformQuat$1(up, up, rotation); + + return normalize$4(up, up); } -class BlendColor extends BaseValue { - getDefault() { - return Color.transparent; - } - set(v ) { - const c = this.current; - if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) return; - this.gl.blendColor(v.r, v.g, v.b, v.a); - this.current = v; - this.dirty = false; +class SkyLayer extends StyleLayer { + + + + + + + + + + + + + + + constructor(layer ) { + super(layer, properties); + this._updateColorRamp(); } -} -class BlendEquation extends BaseValue { - getDefault() { - return this.gl.FUNC_ADD; + _handleSpecialPaintPropertyUpdate(name ) { + if (name === 'sky-gradient') { + this._updateColorRamp(); + } else if (name === 'sky-atmosphere-sun' || + name === 'sky-atmosphere-halo-color' || + name === 'sky-atmosphere-color' || + name === 'sky-atmosphere-sun-intensity') { + this._skyboxInvalidated = true; + } } - set(v ) { - if (v === this.current && !this.dirty) return; - this.gl.blendEquation(v); - this.current = v; - this.dirty = false; + + _updateColorRamp() { + const expression = this._transitionablePaint._values['sky-gradient'].value.expression; + this.colorRamp = renderColorRamp({ + expression, + evaluationKey: 'skyRadialProgress' + }); + if (this.colorRampTexture) { + this.colorRampTexture.destroy(); + this.colorRampTexture = null; + } } -} -class CullFace extends BaseValue { - getDefault() { + needsSkyboxCapture(painter ) { + if (!!this._skyboxInvalidated || !this.skyboxTexture || !this.skyboxGeometry) { + return true; + } + if (!this.paint.get('sky-atmosphere-sun')) { + const lightPosition = painter.style.light.properties.get('position'); + return this._lightPosition.azimuthal !== lightPosition.azimuthal || + this._lightPosition.polar !== lightPosition.polar; + } return false; } - set(v ) { - if (v === this.current && !this.dirty) return; - const gl = this.gl; - if (v) { - gl.enable(gl.CULL_FACE); - } else { - gl.disable(gl.CULL_FACE); + + getCenter(painter , leftHanded ) { + const type = this.paint.get('sky-type'); + if (type === 'atmosphere') { + const sunPosition = this.paint.get('sky-atmosphere-sun'); + const useLightPosition = !sunPosition; + const light = painter.style.light; + const lightPosition = light.properties.get('position'); + + if (useLightPosition && light.properties.get('anchor') === 'viewport') { + warnOnce('The sun direction is attached to a light with viewport anchor, lighting may behave unexpectedly.'); + } + + return useLightPosition ? + getCelestialDirection(lightPosition.azimuthal, -lightPosition.polar + 90, leftHanded) : + getCelestialDirection(sunPosition[0], -sunPosition[1] + 90, leftHanded); } - this.current = v; - this.dirty = false; + assert_1(type === 'gradient'); + const direction = this.paint.get('sky-gradient-center'); + return getCelestialDirection(direction[0], -direction[1] + 90, leftHanded); } -} -class CullFaceSide extends BaseValue { - getDefault() { - return this.gl.BACK; + is3D() { + return false; } - set(v ) { - if (v === this.current && !this.dirty) return; - this.gl.cullFace(v); - this.current = v; - this.dirty = false; + + isSky() { + return true; } -} -class FrontFace extends BaseValue { - getDefault() { - return this.gl.CCW; + markSkyboxValid(painter ) { + this._skyboxInvalidated = false; + this._lightPosition = painter.style.light.properties.get('position'); } - set(v ) { - if (v === this.current && !this.dirty) return; - this.gl.frontFace(v); - this.current = v; - this.dirty = false; + + hasOffscreenPass() { + return true; } -} -class Program extends BaseValue { - getDefault() { + getProgramIds() { + const type = this.paint.get('sky-type'); + if (type === 'atmosphere') { + return ['skyboxCapture', 'skybox']; + } else if (type === 'gradient') { + return ['skyboxGradient']; + } return null; } - set(v ) { - if (v === this.current && !this.dirty) return; - this.gl.useProgram(v); - this.current = v; - this.dirty = false; - } } -class ActiveTextureUnit extends BaseValue { - getDefault() { - return this.gl.TEXTURE0; - } - set(v ) { - if (v === this.current && !this.dirty) return; - this.gl.activeTexture(v); - this.current = v; - this.dirty = false; - } -} +// + -class Viewport extends BaseValue { - getDefault() { - const gl = this.gl; - return [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight]; - } - set(v ) { - const c = this.current; - if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) return; - this.gl.viewport(v[0], v[1], v[2], v[3]); - this.current = v; - this.dirty = false; - } -} + -class BindFramebuffer extends BaseValue { - getDefault() { - return null; - } - set(v ) { - if (v === this.current && !this.dirty) return; - const gl = this.gl; - gl.bindFramebuffer(gl.FRAMEBUFFER, v); - this.current = v; - this.dirty = false; - } -} +const subclasses = { + circle: CircleStyleLayer, + heatmap: HeatmapStyleLayer, + hillshade: HillshadeStyleLayer, + fill: FillStyleLayer, + 'fill-extrusion': FillExtrusionStyleLayer, + line: LineStyleLayer, + symbol: SymbolStyleLayer, + background: BackgroundStyleLayer, + raster: RasterStyleLayer, + sky: SkyLayer +}; -class BindRenderbuffer extends BaseValue { - getDefault() { - return null; - } - set(v ) { - if (v === this.current && !this.dirty) return; - const gl = this.gl; - gl.bindRenderbuffer(gl.RENDERBUFFER, v); - this.current = v; - this.dirty = false; +function createStyleLayer(layer ) { + if (layer.type === 'custom') { + return new CustomStyleLayer(layer); + } else { + return new subclasses[layer.type](layer); } } -class BindTexture extends BaseValue { - getDefault() { - return null; - } - set(v ) { - if (v === this.current && !this.dirty) return; - const gl = this.gl; - gl.bindTexture(gl.TEXTURE_2D, v); - this.current = v; - this.dirty = false; - } -} +// -class BindVertexBuffer extends BaseValue { - getDefault() { - return null; - } - set(v ) { - if (v === this.current && !this.dirty) return; - const gl = this.gl; - gl.bindBuffer(gl.ARRAY_BUFFER, v); - this.current = v; - this.dirty = false; - } -} + + -class BindElementBuffer extends BaseValue { - getDefault() { - return null; - } - set(v ) { - // Always rebind - const gl = this.gl; - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, v); - this.current = v; - this.dirty = false; - } -} + + + + + + + + + + + -class BindVertexArrayOES extends BaseValue { - + + + + + - constructor(context ) { - super(context); - this.vao = context.extVertexArrayObject; - } - getDefault() { - return null; - } - set(v ) { - if (!this.vao || v === this.current && !this.dirty) return; - this.vao.bindVertexArrayOES(v); - this.current = v; - this.dirty = false; - } -} + + + + + + + + + -class PixelStoreUnpack extends BaseValue { - getDefault() { - return 4; - } - set(v ) { - if (v === this.current && !this.dirty) return; - const gl = this.gl; - gl.pixelStorei(gl.UNPACK_ALIGNMENT, v); - this.current = v; - this.dirty = false; - } -} +class Texture { + + + + + + + -class PixelStoreUnpackPremultiplyAlpha extends BaseValue { - getDefault() { - return false; - } - set(v ) { - if (v === this.current && !this.dirty) return; - const gl = this.gl; - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, (v )); - this.current = v; - this.dirty = false; + constructor(context , image , format , options ) { + this.context = context; + this.format = format; + this.texture = context.gl.createTexture(); + this.update(image, options); } -} -class PixelStoreUnpackFlipY extends BaseValue { - getDefault() { - return false; - } - set(v ) { - if (v === this.current && !this.dirty) return; - const gl = this.gl; - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, (v )); - this.current = v; - this.dirty = false; + update(image , options , position ) { + const {width, height} = image; + const {context} = this; + const {gl} = context; + const {HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageData, ImageBitmap} = window$1; + + gl.bindTexture(gl.TEXTURE_2D, this.texture); + + context.pixelStoreUnpackFlipY.set(false); + context.pixelStoreUnpack.set(1); + context.pixelStoreUnpackPremultiplyAlpha.set(this.format === gl.RGBA && (!options || options.premultiply !== false)); + + if (!position && (!this.size || this.size[0] !== width || this.size[1] !== height)) { + this.size = [width, height]; + + if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData || (ImageBitmap && image instanceof ImageBitmap)) { + gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.format, gl.UNSIGNED_BYTE, image); + } else { + // $FlowFixMe prop-missing - Flow can't refine image type here + gl.texImage2D(gl.TEXTURE_2D, 0, this.format, width, height, 0, this.format, gl.UNSIGNED_BYTE, image.data); + } + + } else { + const {x, y} = position || {x: 0, y: 0}; + if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData || (ImageBitmap && image instanceof ImageBitmap)) { + gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, image); + } else { + // $FlowFixMe prop-missing - Flow can't refine image type here + gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, width, height, gl.RGBA, gl.UNSIGNED_BYTE, image.data); + } + } + + this.useMipmap = Boolean(options && options.useMipmap && this.isSizePowerOfTwo()); + if (this.useMipmap) { + gl.generateMipmap(gl.TEXTURE_2D); + } } -} -class FramebufferAttachment extends BaseValue { - - + bind(filter , wrap ) { + const {context} = this; + const {gl} = context; + gl.bindTexture(gl.TEXTURE_2D, this.texture); - constructor(context , parent ) { - super(context); - this.context = context; - this.parent = parent; - } - getDefault() { - return null; - } -} + if (filter !== this.filter) { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, + this.useMipmap ? (filter === gl.NEAREST ? gl.NEAREST_MIPMAP_NEAREST : gl.LINEAR_MIPMAP_NEAREST) : filter + ); + this.filter = filter; + } -class ColorAttachment extends FramebufferAttachment { - setDirty() { - this.dirty = true; - } - set(v ) { - if (v === this.current && !this.dirty) return; - 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 - const gl = this.gl; - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, v, 0); - this.current = v; - this.dirty = false; + 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; + } } -} -class DepthAttachment extends FramebufferAttachment { - attachment() { return this.gl.DEPTH_ATTACHMENT; } - set(v ) { - if (v === this.current && !this.dirty) return; - 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 - const gl = this.gl; - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, this.attachment(), gl.RENDERBUFFER, v); - this.current = v; - this.dirty = false; + isSizePowerOfTwo() { + return this.size[0] === this.size[1] && (Math.log(this.size[0]) / Math.LN2) % 1 === 0; } -} -class DepthStencilAttachment extends DepthAttachment { - attachment() { return this.gl.DEPTH_STENCIL_ATTACHMENT; } + destroy() { + const {gl} = this.context; + gl.deleteTexture(this.texture); + this.texture = (null ); + } } // -class Framebuffer { - + + + + + + + + + +/** + * 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 + */ +class LineAtlas { - - - + + + + - constructor(context , width , height , hasDepth ) { - this.context = context; + constructor(width , height ) { this.width = width; this.height = height; - const gl = context.gl; - const fbo = this.framebuffer = gl.createFramebuffer(); + this.nextRow = 0; + this.image = new AlphaImage({width, height}); + this.positions = {}; + this.uploaded = false; + } - this.colorAttachment = new ColorAttachment(context, fbo); - if (hasDepth) { - this.depthAttachment = new DepthAttachment(context, fbo); - } - assert_1(gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE); + /** + * Get a dash line pattern. + * + * @param {Array} dasharray + * @param {string} lineCap the type of line caps to be added to dashes + * @returns {Object} position of dash texture in { y, height, width } + * @private + */ + getDash(dasharray , lineCap ) { + const key = this.getKey(dasharray, lineCap); + return this.positions[key]; } - destroy() { - const gl = this.context.gl; + trim() { + const width = this.width; + const height = this.height = nextPowerOfTwo(this.nextRow); + this.image.resize({width, height}); + } - const texture = this.colorAttachment.get(); - if (texture) gl.deleteTexture(texture); + getKey(dasharray , lineCap ) { + return dasharray.join(',') + lineCap; + } - if (this.depthAttachment) { - const renderbuffer = this.depthAttachment.get(); - if (renderbuffer) gl.deleteRenderbuffer(renderbuffer); + getDashRanges(dasharray , lineAtlasWidth , stretch ) { + // If dasharray has an odd length, both the first and last parts + // are dashes and should be joined seamlessly. + const oddDashArray = dasharray.length % 2 === 1; + + const ranges = []; + + let left = oddDashArray ? -dasharray[dasharray.length - 1] * stretch : 0; + let right = dasharray[0] * stretch; + let isDash = true; + + ranges.push({left, right, isDash, zeroLength: dasharray[0] === 0}); + + let currentDashLength = dasharray[0]; + for (let i = 1; i < dasharray.length; i++) { + isDash = !isDash; + + const dashLength = dasharray[i]; + left = currentDashLength * stretch; + currentDashLength += dashLength; + right = currentDashLength * stretch; + + ranges.push({left, right, isDash, zeroLength: dashLength === 0}); } - gl.deleteFramebuffer(this.framebuffer); + return ranges; } -} -// - + addRoundDash(ranges , stretch , n ) { + const halfStretch = stretch / 2; -const ALWAYS = 0x0207; + for (let y = -n; y <= n; y++) { + const row = this.nextRow + n + y; + const index = this.width * row; + let currIndex = 0; + let range = ranges[currIndex]; -class DepthMode { - - - + for (let x = 0; x < this.width; x++) { + if (x / range.right > 1) { range = ranges[++currIndex]; } - // DepthMask enums - - + const distLeft = Math.abs(x - range.left); + const distRight = Math.abs(x - range.right); + const minDist = Math.min(distLeft, distRight); + let signedDistance; - constructor(depthFunc , depthMask , depthRange ) { - this.func = depthFunc; - this.mask = depthMask; - this.range = depthRange; + const distMiddle = y / n * (halfStretch + 1); + if (range.isDash) { + const distEdge = halfStretch - Math.abs(distMiddle); + signedDistance = Math.sqrt(minDist * minDist + distEdge * distEdge); + } else { + signedDistance = halfStretch - Math.sqrt(minDist * minDist + distMiddle * distMiddle); + } + + this.image.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128)); + } + } } - -} + addRegularDash(ranges , capLength ) { -DepthMode.ReadOnly = false; -DepthMode.ReadWrite = true; + // Collapse any zero-length range + // Collapse neighbouring same-type parts into a single part + for (let i = ranges.length - 1; i >= 0; --i) { + const part = ranges[i]; + const next = ranges[i + 1]; + if (part.zeroLength) { + ranges.splice(i, 1); + } else if (next && next.isDash === part.isDash) { + next.left = part.left; + ranges.splice(i, 1); + } + } + + // Combine the first and last parts if possible + const first = ranges[0]; + const last = ranges[ranges.length - 1]; + if (first.isDash === last.isDash) { + first.left = last.left - this.width; + last.right = first.right + this.width; + } -DepthMode.disabled = new DepthMode(ALWAYS, DepthMode.ReadOnly, [0, 1]); + const index = this.width * this.nextRow; + let currIndex = 0; + let range = ranges[currIndex]; -// - + for (let x = 0; x < this.width; x++) { + if (x / range.right > 1) { + range = ranges[++currIndex]; + } -const ALWAYS$1 = 0x0207; -const KEEP = 0x1E00; + const distLeft = Math.abs(x - range.left); + const distRight = Math.abs(x - range.right); -class StencilMode { - - - - - - + const minDist = Math.min(distLeft, distRight); + const signedDistance = (range.isDash ? minDist : -minDist) + capLength; - constructor(test , ref , mask , fail , - depthFail , pass ) { - this.test = test; - this.ref = ref; - this.mask = mask; - this.fail = fail; - this.depthFail = depthFail; - this.pass = pass; + this.image.data[index + x] = Math.max(0, Math.min(255, signedDistance + 128)); + } } - -} + addDash(dasharray , lineCap ) { + const key = this.getKey(dasharray, lineCap); + if (this.positions[key]) return this.positions[key]; -StencilMode.disabled = new StencilMode({func: ALWAYS$1, mask: 0}, 0, 0, KEEP, KEEP, KEEP); + const round = lineCap === 'round'; + const n = round ? 7 : 0; + const height = 2 * n + 1; -// + if (this.nextRow + height > this.height) { + warnOnce('LineAtlas out of space'); + return null; + } - + // dasharray is empty, draws a full line (no dash or no gap length represented, default behavior) + if (dasharray.length === 0) { + // insert a single dash range in order to draw a full line + dasharray.push(1); + } -const ZERO = 0x0000; -const ONE = 0x0001; -const ONE_MINUS_SRC_ALPHA = 0x0303; + let length = 0; + for (let i = 0; i < dasharray.length; i++) { + if (dasharray[i] < 0) { + warnOnce('Negative value is found in line dasharray, replacing values with 0'); + dasharray[i] = 0; + } + length += dasharray[i]; + } -class ColorMode { - - - + if (length !== 0) { + const stretch = this.width / length; + const ranges = this.getDashRanges(dasharray, this.width, stretch); - constructor(blendFunction , blendColor , mask ) { - this.blendFunction = blendFunction; - this.blendColor = blendColor; - this.mask = mask; - } + if (round) { + this.addRoundDash(ranges, stretch, n); + } else { + const capLength = lineCap === 'square' ? 0.5 * stretch : 0; + this.addRegularDash(ranges, capLength); + } + } - + const y = this.nextRow + n; - - - -} + this.nextRow += height; -ColorMode.Replace = [ONE, ZERO]; + const pos = { + tl: [y, n], + br: [length, 0] + }; + this.positions[key] = pos; + return pos; + } +} -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]); +register(LineAtlas, 'LineAtlas'); // - - -const BACK = 0x0405; -const FRONT = 0x0404; -const CCW = 0x0901; -const CW = 0x0900; +/** + * Invokes the wrapped function in a non-blocking way when trigger() is called. Invocation requests + * are ignored until the function was actually invoked. + * + * @private + */ +class ThrottledInvoker { + + + -class CullFaceMode { - - - + constructor(callback ) { + this._callback = callback; + this._triggered = false; + if (typeof MessageChannel !== 'undefined') { + this._channel = new MessageChannel(); + this._channel.port2.onmessage = () => { + this._triggered = false; + this._callback(); + }; + } + } - constructor(enable , mode , frontFace ) { - this.enable = enable; - this.mode = mode; - this.frontFace = frontFace; + trigger() { + if (!this._triggered) { + this._triggered = true; + if (this._channel) { + this._channel.port1.postMessage(true); + } else { + setTimeout(() => { + this._triggered = false; + this._callback(); + }, 0); + } + } } - - - - - + remove() { + this._channel = undefined; + this._callback = () => {}; + } } -CullFaceMode.disabled = new CullFaceMode(false, BACK, CCW); -CullFaceMode.backCCW = new CullFaceMode(true, BACK, CCW); -CullFaceMode.backCW = new CullFaceMode(true, BACK, CW); -CullFaceMode.frontCW = new CullFaceMode(true, FRONT, CW); -CullFaceMode.frontCCW = new CullFaceMode(true, FRONT, CCW); - // - - - - - - - - - - - - + -class Context { - - - + + + + - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - + + - - - - - +class Scheduler { - + + + + - constructor(gl ) { - this.gl = gl; - this.extVertexArrayObject = this.gl.getExtension('OES_vertex_array_object'); + constructor() { + this.tasks = {}; + this.taskQueue = []; + bindAll(['process'], this); + this.invoker = new ThrottledInvoker(this.process); - 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.blendEquation = new BlendEquation(this); - this.cullFace = new CullFace(this); - this.cullFaceSide = new CullFaceSide(this); - this.frontFace = new FrontFace(this); - this.program = new Program(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.pixelStoreUnpackFlipY = new PixelStoreUnpackFlipY(this); + this.nextId = 0; + } - 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.extTextureFilterAnisotropicForceOff = false; + add(fn , metadata ) { + const id = this.nextId++; + const priority = getPriority(metadata); - this.extTextureHalfFloat = gl.getExtension('OES_texture_half_float'); - if (this.extTextureHalfFloat) { - gl.getExtension('OES_texture_half_float_linear'); - this.extRenderToTextureHalfFloat = gl.getExtension('EXT_color_buffer_half_float'); + if (priority === 0) { + // Process tasks with priority 0 immediately. Do not yield to the event loop. + const m = isWorker() ? PerformanceUtils.beginMeasure('workerTask') : undefined; + try { + fn(); + } finally { + if (m) PerformanceUtils.endMeasure(m); + } + return { + cancel: () => {} + }; } - this.extTimerQuery = gl.getExtension('EXT_disjoint_timer_query'); - this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); + this.tasks[id] = {fn, metadata, priority, id}; + this.taskQueue.push(id); + this.invoker.trigger(); + return { + cancel: () => { + delete this.tasks[id]; + } + }; } - setDefault() { - this.unbindVAO(); + process() { + const m = isWorker() ? PerformanceUtils.beginMeasure('workerTask') : undefined; + try { + this.taskQueue = this.taskQueue.filter(id => !!this.tasks[id]); - this.clearColor.setDefault(); - this.clearDepth.setDefault(); - this.clearStencil.setDefault(); - this.colorMask.setDefault(); - this.depthMask.setDefault(); - this.stencilMask.setDefault(); - this.stencilFunc.setDefault(); - this.stencilOp.setDefault(); - this.stencilTest.setDefault(); - this.depthRange.setDefault(); - this.depthTest.setDefault(); - this.depthFunc.setDefault(); - this.blend.setDefault(); - this.blendFunc.setDefault(); - this.blendColor.setDefault(); - this.blendEquation.setDefault(); - this.cullFace.setDefault(); - this.cullFaceSide.setDefault(); - this.frontFace.setDefault(); - this.program.setDefault(); - this.activeTexture.setDefault(); - this.bindFramebuffer.setDefault(); - this.pixelStoreUnpack.setDefault(); - this.pixelStoreUnpackPremultiplyAlpha.setDefault(); - this.pixelStoreUnpackFlipY.setDefault(); - } + if (!this.taskQueue.length) { + return; + } + const id = this.pick(); + if (id === null) return; - setDirty() { - this.clearColor.dirty = true; - this.clearDepth.dirty = true; - this.clearStencil.dirty = true; - this.colorMask.dirty = true; - this.depthMask.dirty = true; - this.stencilMask.dirty = true; - this.stencilFunc.dirty = true; - this.stencilOp.dirty = true; - this.stencilTest.dirty = true; - this.depthRange.dirty = true; - this.depthTest.dirty = true; - this.depthFunc.dirty = true; - this.blend.dirty = true; - this.blendFunc.dirty = true; - this.blendColor.dirty = true; - this.blendEquation.dirty = true; - this.cullFace.dirty = true; - this.cullFaceSide.dirty = true; - this.frontFace.dirty = true; - this.program.dirty = true; - this.activeTexture.dirty = true; - this.viewport.dirty = true; - this.bindFramebuffer.dirty = true; - this.bindRenderbuffer.dirty = true; - this.bindTexture.dirty = true; - this.bindVertexBuffer.dirty = true; - this.bindElementBuffer.dirty = true; - if (this.extVertexArrayObject) { - this.bindVertexArrayOES.dirty = true; + const task = this.tasks[id]; + delete this.tasks[id]; + // Schedule another process call if we know there's more to process _before_ invoking the + // current task. This is necessary so that processing continues even if the current task + // doesn't execute successfully. + if (this.taskQueue.length) { + this.invoker.trigger(); + } + if (!task) { + // If the task ID doesn't have associated task data anymore, it was canceled. + return; + } + + task.fn(); + } finally { + if (m) PerformanceUtils.endMeasure(m); } - this.pixelStoreUnpack.dirty = true; - this.pixelStoreUnpackPremultiplyAlpha.dirty = true; - this.pixelStoreUnpackFlipY.dirty = true; } - createIndexBuffer(array , dynamicDraw ) { - return new IndexBuffer(this, array, dynamicDraw); + pick() { + let minIndex = null; + let minPriority = Infinity; + for (let i = 0; i < this.taskQueue.length; i++) { + const id = this.taskQueue[i]; + const task = this.tasks[id]; + if (task.priority < minPriority) { + minPriority = task.priority; + minIndex = i; + } + } + if (minIndex === null) return null; + const id = this.taskQueue[minIndex]; + this.taskQueue.splice(minIndex, 1); + return id; } - createVertexBuffer(array , attributes , dynamicDraw ) { - return new VertexBuffer(this, array, attributes, dynamicDraw); + remove() { + this.invoker.remove(); } +} - createRenderbuffer(storageFormat , width , height ) { - const gl = this.gl; +function getPriority({type, isSymbolTile, zoom} ) { + zoom = zoom || 0; + if (type === 'message') return 0; + if (type === 'maybePrepare' && !isSymbolTile) return 100 - zoom; + if (type === 'parseTile' && !isSymbolTile) return 200 - zoom; + if (type === 'parseTile' && isSymbolTile) return 300 - zoom; + if (type === 'maybePrepare' && isSymbolTile) return 400 - zoom; + return 500; +} - const rbo = gl.createRenderbuffer(); - this.bindRenderbuffer.set(rbo); - gl.renderbufferStorage(gl.RENDERBUFFER, storageFormat, width, height); - this.bindRenderbuffer.set(null); +// - return rbo; - } + + - createFramebuffer(width , height , hasDepth ) { - return new Framebuffer(this, width, height, hasDepth); - } +/** + * 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 + */ +class Actor { + + + + + + + + - clear({color, depth, stencil} ) { - const gl = this.gl; - let mask = 0; + constructor(target , parent , mapId ) { + this.target = target; + this.parent = parent; + this.mapId = mapId; + this.callbacks = {}; + this.cancelCallbacks = {}; + bindAll(['receive'], this); + this.target.addEventListener('message', this.receive, false); + this.globalScope = isWorker() ? target : window$1; + this.scheduler = new Scheduler(); + } - if (color) { - mask |= gl.COLOR_BUFFER_BIT; - this.clearColor.set(color); - this.colorMask.set([true, true, true, true]); + /** + * 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].[source-name].name' for a method on a WorkerSource. + * @param targetMapId A particular mapId to which to send this message. + * @private + */ + send(type , data , callback , targetMapId , mustQueue = false, callbackMetadata ) { + // We're using a string ID instead of numbers because they are being used as object keys + // anyway, and thus stringified implicitly. We use random IDs because an actor may receive + // message from multiple other actors which could run in different execution context. A + // linearly increasing ID could produce collisions. + const id = Math.round((Math.random() * 1e18)).toString(36).substring(0, 10); + if (callback) { + callback.metadata = callbackMetadata; + this.callbacks[id] = callback; } + const buffers = isSafari(this.globalScope) ? undefined : []; + this.target.postMessage({ + id, + type, + hasCallback: !!callback, + targetMapId, + mustQueue, + sourceMapId: this.mapId, + data: serialize(data, buffers) + }, buffers); + return { + cancel: () => { + if (callback) { + // Set the callback to null so that it never fires after the request is aborted. + delete this.callbacks[id]; + } + this.target.postMessage({ + id, + type: '', + targetMapId, + sourceMapId: this.mapId + }); + } + }; + } - if (typeof depth !== 'undefined') { - mask |= gl.DEPTH_BUFFER_BIT; - - // Workaround for platforms where clearDepth doesn't seem to work - // without reseting the depthRange. See https://github.com/mapbox/mapbox-gl-js/issues/3437 - this.depthRange.set([0, 1]); + receive(message ) { + const data = message.data, + id = data.id; - this.clearDepth.set(depth); - this.depthMask.set(true); + if (!id) { + return; } - if (typeof stencil !== 'undefined') { - mask |= gl.STENCIL_BUFFER_BIT; - this.clearStencil.set(stencil); - this.stencilMask.set(0xFF); + if (data.targetMapId && this.mapId !== data.targetMapId) { + return; } - gl.clear(mask); - } - - setCullFace(cullFaceMode ) { - if (cullFaceMode.enable === false) { - this.cullFace.set(false); + if (data.type === '') { + // Remove the original request from the queue. This is only possible if it + // hasn't been kicked off yet. The id will remain in the queue, but because + // there is no associated task, it will be dropped once it's time to execute it. + const cancel = this.cancelCallbacks[id]; + delete this.cancelCallbacks[id]; + if (cancel) { + cancel.cancel(); + } } else { - this.cullFace.set(true); - this.cullFaceSide.set(cullFaceMode.mode); - this.frontFace.set(cullFaceMode.frontFace); + if (data.mustQueue || isWorker()) { + // for worker tasks that are often cancelled, such as loadTile, store them before actually + // processing them. This is necessary because we want to keep receiving messages. + // Some tasks may take a while in the worker thread, so before executing the next task + // in our queue, postMessage preempts this and messages can be processed. + // We're using a MessageChannel object to get throttle the process() flow to one at a time. + const callback = this.callbacks[id]; + const metadata = (callback && callback.metadata) || {type: "message"}; + this.cancelCallbacks[id] = this.scheduler.add(() => this.processTask(id, data), metadata); + } else { + // In the main thread, process messages immediately so that other work does not slip in + // between getting partial data back from workers. + this.processTask(id, data); + } } } - setDepthMode(depthMode ) { - if (depthMode.func === this.gl.ALWAYS && !depthMode.mask) { - this.depthTest.set(false); + processTask(id , task ) { + if (task.type === '') { + // The done() function in the counterpart has been called, and we are now + // firing the callback in the originating actor, if there is one. + const callback = this.callbacks[id]; + delete this.callbacks[id]; + if (callback) { + // If we get a response, but don't have a callback, the request was canceled. + if (task.error) { + callback(deserialize$1(task.error)); + } else { + callback(null, deserialize$1(task.data)); + } + } } else { - this.depthTest.set(true); - this.depthFunc.set(depthMode.func); - this.depthMask.set(depthMode.mask); - this.depthRange.set(depthMode.range); + const buffers = isSafari(this.globalScope) ? undefined : []; + const done = task.hasCallback ? (err, data) => { + delete this.cancelCallbacks[id]; + this.target.postMessage({ + id, + type: '', + sourceMapId: this.mapId, + error: err ? serialize(err) : null, + data: serialize(data, buffers) + }, buffers); + } : (_) => { + }; + + const params = (deserialize$1(task.data) ); + if (this.parent[task.type]) { + // task.type == 'loadTile', 'removeTile', etc. + this.parent[task.type](task.sourceMapId, params, done); + } else if (this.parent.getWorkerSource) { + // task.type == sourcetype.method + const keys = task.type.split('.'); + const scope = (this.parent ).getWorkerSource(task.sourceMapId, keys[0], params.source); + scope[keys[1]](params, done); + } else { + // No function was found. + done(new Error(`Could not find function ${task.type}`)); + } } } - setStencilMode(stencilMode ) { - if (stencilMode.test.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 - }); + remove() { + this.scheduler.remove(); + this.target.removeEventListener('message', this.receive, false); + } +} + +// strict + +class DictionaryCoder { + + + + constructor(strings ) { + this._stringToNumber = {}; + this._numberToString = []; + for (let i = 0; i < strings.length; i++) { + const string = strings[i]; + this._stringToNumber[string] = i; + this._numberToString[i] = string; } } - setColorMode(colorMode ) { - if (deepEqual(colorMode.blendFunction, ColorMode.Replace)) { - this.blend.set(false); - } else { - this.blend.set(true); - this.blendFunc.set(colorMode.blendFunction); - this.blendColor.set(colorMode.blendColor); + encode(string ) { + assert_1(string in this._stringToNumber); + return this._stringToNumber[string]; + } + + decode(n ) { + assert_1(n < this._numberToString.length); + return this._numberToString[n]; + } +} + +// + + + +// we augment GeoJSON with custom properties in query*Features results + + + + + +const customProps = ['tile', 'layer', 'source', 'sourceLayer', 'state']; + +class Feature { + + + + + + + + + + + + + + + + constructor(vectorTileFeature , z , x , y , id ) { + this.type = 'Feature'; + + this._vectorTileFeature = vectorTileFeature; + this._z = z; + this._x = x; + this._y = y; + + this.properties = vectorTileFeature.properties; + this.id = id; + } + + get geometry() { + if (this._geometry === undefined) { + this._geometry = this._vectorTileFeature.toGeoJSON(this._x, this._y, this._z).geometry; } + return this._geometry; + } - this.colorMask.set(colorMode.mask); + set geometry(g ) { + this._geometry = g; } - unbindVAO() { - // Unbinding the VAO prevents other things (custom layers, new buffer creation) from - // unintentionally changing the state of the last VAO used. - if (this.extVertexArrayObject) { - this.bindVertexArrayOES.set(null); + toJSON() { + const json = { + type: 'Feature', + geometry: this.geometry, + properties: this.properties + }; + if (this.id !== undefined) json.id = this.id; + for (const key of customProps) { + // Flow doesn't support indexed access for classes https://github.com/facebook/flow/issues/1323 + if ((this )[key] !== undefined) json[key] = (this )[key]; } + return json; } } @@ -37066,21 +39047,25 @@ class Context { - + + + + - + + @@ -37094,7 +39079,7 @@ class Context { - + @@ -37140,7 +39125,7 @@ class Context { - + @@ -37156,7 +39141,7 @@ class Context { -function deserialize$1(input , style ) { +function deserialize(input , style ) { const output = {}; // Guard against the case where the map's style has been set to null while @@ -37186,4368 +39171,4874 @@ function deserialize$1(input , style ) return output; } -// strict +// + +/** + * This is a private namespace for utility functions that will get automatically stripped + * out in production builds. + * + * @private + */ +const Debug = { + extend(dest , ...sources ) { + return extend$1(dest, ...sources); + }, + + run(fn ) { + fn(); + }, + + logToElement(message , overwrite = false, id = "log") { + const el = window$1.document.getElementById(id); + if (el) { + if (overwrite) el.innerHTML = ''; + el.innerHTML += `
${message}`; + } + + } +}; + +// + + + + + + +/** + * Helper class that can be used to draw debug geometry in tile-space + * + * @class TileSpaceDebugBuffer + * @private + */ +class TileSpaceDebugBuffer { + + + + + + + + + + + constructor(tileSize , color = Color.red) { + this.vertices = new StructArrayLayout2i4(); + this.indices = new StructArrayLayout1ui2(); + this.tileSize = tileSize; + this.needsUpload = true; + this.color = color; + } + + addPoints(points ) { + this.clearPoints(); + for (const point of points) { + this.addPoint(point); + } + this.addPoint(points[0]); + } + + addPoint(p ) { + // Add a bowtie shape + const crosshairSize = 80; + const currLineLineLength = this.vertices.length; + this.vertices.emplaceBack(p.x, p.y); + this.vertices.emplaceBack(p.x + crosshairSize / 2, p.y); + this.vertices.emplaceBack(p.x, p.y - crosshairSize / 2); + this.vertices.emplaceBack(p.x, p.y + crosshairSize / 2); + this.vertices.emplaceBack(p.x - crosshairSize / 2, p.y); + this.indices.emplaceBack(currLineLineLength); + this.indices.emplaceBack(currLineLineLength + 1); + this.indices.emplaceBack(currLineLineLength + 2); + this.indices.emplaceBack(currLineLineLength + 3); + this.indices.emplaceBack(currLineLineLength + 4); + this.indices.emplaceBack(currLineLineLength); + + this.needsUpload = true; + } + + clearPoints() { + this.vertices.clear(); + this.indices.clear(); + this.needsUpload = true; + } -class DictionaryCoder { - - + lazyUpload(context ) { + if (this.needsUpload && this.hasVertices()) { + this.unload(); - constructor(strings ) { - this._stringToNumber = {}; - this._numberToString = []; - for (let i = 0; i < strings.length; i++) { - const string = strings[i]; - this._stringToNumber[string] = i; - this._numberToString[i] = string; + this.vertexBuffer = context.createVertexBuffer(this.vertices, posAttributes.members, true); + this.indexBuffer = context.createIndexBuffer(this.indices, true); + this.segments = SegmentVector.simpleSegment(0, 0, this.vertices.length, this.indices.length); + this.needsUpload = false; } } - encode(string ) { - assert_1(string in this._stringToNumber); - return this._stringToNumber[string]; + hasVertices() { + return this.vertices.length > 1; } - decode(n ) { - assert_1(n < this._numberToString.length); - return this._numberToString[n]; + unload() { + if (this.vertexBuffer) { + this.vertexBuffer.destroy(); + delete this.vertexBuffer; + } + if (this.indexBuffer) { + this.indexBuffer.destroy(); + delete this.indexBuffer; + } + if (this.segments) { + this.segments.destroy(); + delete this.segments; + } } } // - -class Feature { - - - - + + - +const meshSize = 32; +const gridSize = meshSize + 1; - constructor(vectorTileFeature , z , x , y , id ) { - this.type = 'Feature'; +const numTriangles = meshSize * meshSize * 2 - 2; +const numParentTriangles = numTriangles - meshSize * meshSize; - this._vectorTileFeature = vectorTileFeature; - (vectorTileFeature )._z = z; - (vectorTileFeature )._x = x; - (vectorTileFeature )._y = y; +const coords = new Uint16Array(numTriangles * 4); - this.properties = vectorTileFeature.properties; - this.id = id; - } +// precalculate RTIN triangle coordinates +for (let i = 0; i < numTriangles; i++) { + let id = i + 2; + let ax = 0, ay = 0, bx = 0, by = 0, cx = 0, cy = 0; - get geometry() { - if (this._geometry === undefined) { - this._geometry = this._vectorTileFeature.toGeoJSON( - (this._vectorTileFeature )._x, - (this._vectorTileFeature )._y, - (this._vectorTileFeature )._z).geometry; - } - return this._geometry; - } + if (id & 1) { + bx = by = cx = meshSize; // bottom-left triangle - set geometry(g ) { - this._geometry = g; + } else { + ax = ay = cy = meshSize; // top-right triangle } - toJSON() { - const json = { - geometry: this.geometry - }; - for (const i in this) { - if (i === '_geometry' || i === '_vectorTileFeature') continue; - json[i] = (this )[i]; + while ((id >>= 1) > 1) { + const mx = (ax + bx) >> 1; + const my = (ay + by) >> 1; + + if (id & 1) { // left half + bx = ax; by = ay; + ax = cx; ay = cy; + + } else { // right half + ax = bx; ay = by; + bx = cx; by = cy; } - return json; + + cx = mx; cy = my; } -} -// - - + const k = i * 4; + coords[k + 0] = ax; + coords[k + 1] = ay; + coords[k + 2] = bx; + coords[k + 3] = by; +} - - +// temporary arrays we'll reuse for MARTINI mesh code +const reprojectedCoords = new Uint16Array(gridSize * gridSize * 2); +const used = new Uint8Array(gridSize * gridSize); +const indexMap = new Uint16Array(gridSize * gridSize); -/** - * SourceFeatureState manages the state and pending changes - * to features in a source, separated by source layer. - * stateChanges and deletedStates batch all changes to the tile (updates and removes, respectively) - * between coalesce() events. addFeatureState() and removeFeatureState() also update their counterpart's - * list of changes, such that coalesce() can apply the proper state changes while agnostic to the order of operations. - * In deletedStates, all null's denote complete removal of state at that scope - * @private -*/ -class SourceFeatureState { + - - + + - constructor() { - this.state = {}; - this.stateChanges = {}; - this.deletedStates = {}; - } +// There can be visible seams between neighbouring tiles because of precision issues +// and resampling differences. Adding a bit of padding around the edges of tiles hides +// most of these issues. +const commonRasterTileSize = 256; +const paddingSize = meshSize / commonRasterTileSize / 4; +function seamPadding(n) { + if (n === 0) return -paddingSize; + else if (n === gridSize - 1) return paddingSize; + else return 0; +} - updateState(sourceLayer , featureId , newState ) { - const feature = String(featureId); - this.stateChanges[sourceLayer] = this.stateChanges[sourceLayer] || {}; - this.stateChanges[sourceLayer][feature] = this.stateChanges[sourceLayer][feature] || {}; - extend(this.stateChanges[sourceLayer][feature], newState); +function getTileMesh(canonical , projection ) { + const cs = tileTransform(canonical, projection); + const z2 = Math.pow(2, canonical.z); - if (this.deletedStates[sourceLayer] === null) { - this.deletedStates[sourceLayer] = {}; - for (const ft in this.state[sourceLayer]) { - if (ft !== feature) this.deletedStates[sourceLayer][ft] = null; - } - } else { - const featureDeletionQueued = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] === null; - if (featureDeletionQueued) { - this.deletedStates[sourceLayer][feature] = {}; - for (const prop in this.state[sourceLayer][feature]) { - if (!newState[prop]) this.deletedStates[sourceLayer][feature][prop] = null; - } - } else { - for (const key in newState) { - const deletionInQueue = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] && this.deletedStates[sourceLayer][feature][key] === null; - if (deletionInQueue) delete this.deletedStates[sourceLayer][feature][key]; - } - } + for (let y = 0; y < gridSize; y++) { + for (let x = 0; x < gridSize; x++) { + const lng = lngFromMercatorX((canonical.x + (x + seamPadding(x)) / meshSize) / z2); + const lat = latFromMercatorY((canonical.y + (y + seamPadding(y)) / meshSize) / z2); + const p = projection.project(lng, lat); + const k = y * gridSize + x; + reprojectedCoords[2 * k + 0] = Math.round((p.x * cs.scale - cs.x) * EXTENT); + reprojectedCoords[2 * k + 1] = Math.round((p.y * cs.scale - cs.y) * EXTENT); } } - removeFeatureState(sourceLayer , featureId , key ) { - const sourceLayerDeleted = this.deletedStates[sourceLayer] === null; - if (sourceLayerDeleted) return; - - const feature = String(featureId); + used.fill(0); + indexMap.fill(0); - this.deletedStates[sourceLayer] = this.deletedStates[sourceLayer] || {}; + // iterate over all possible triangles, starting from the smallest level + for (let i = numTriangles - 1; i >= 0; i--) { + const k = i * 4; + const ax = coords[k + 0]; + const ay = coords[k + 1]; + const bx = coords[k + 2]; + const by = coords[k + 3]; + const mx = (ax + bx) >> 1; + const my = (ay + by) >> 1; + const cx = mx + my - ay; + const cy = my + ax - mx; - if (key && featureId !== undefined) { - if (this.deletedStates[sourceLayer][feature] !== null) { - this.deletedStates[sourceLayer][feature] = this.deletedStates[sourceLayer][feature] || {}; - this.deletedStates[sourceLayer][feature][key] = null; - } - } else if (featureId !== undefined) { - const updateInQueue = this.stateChanges[sourceLayer] && this.stateChanges[sourceLayer][feature]; - if (updateInQueue) { - this.deletedStates[sourceLayer][feature] = {}; - for (key in this.stateChanges[sourceLayer][feature]) this.deletedStates[sourceLayer][feature][key] = null; + const aIndex = ay * gridSize + ax; + const bIndex = by * gridSize + bx; + const mIndex = my * gridSize + mx; - } else { - this.deletedStates[sourceLayer][feature] = null; - } - } else { - this.deletedStates[sourceLayer] = null; - } - } + // calculate error in the middle of the long edge of the triangle + const rax = reprojectedCoords[2 * aIndex + 0]; + const ray = reprojectedCoords[2 * aIndex + 1]; + const rbx = reprojectedCoords[2 * bIndex + 0]; + const rby = reprojectedCoords[2 * bIndex + 1]; + const rmx = reprojectedCoords[2 * mIndex + 0]; + const rmy = reprojectedCoords[2 * mIndex + 1]; - getState(sourceLayer , featureId ) { - const feature = String(featureId); - const base = this.state[sourceLayer] || {}; - const changes = this.stateChanges[sourceLayer] || {}; + // raster tiles are typically 512px, and we use 1px as an error threshold; 8192 / 512 = 16 + const isUsed = Math.hypot((rax + rbx) / 2 - rmx, (ray + rby) / 2 - rmy) >= 16; - const reconciledState = extend({}, base[feature], changes[feature]); + used[mIndex] = used[mIndex] || (isUsed ? 1 : 0); - //return empty object if the whole source layer is awaiting deletion - if (this.deletedStates[sourceLayer] === null) return {}; - else if (this.deletedStates[sourceLayer]) { - const featureDeletions = this.deletedStates[sourceLayer][featureId]; - if (featureDeletions === null) return {}; - for (const prop in featureDeletions) delete reconciledState[prop]; + if (i < numParentTriangles) { // bigger triangles; accumulate error with children + const leftChildIndex = ((ay + cy) >> 1) * gridSize + ((ax + cx) >> 1); + const rightChildIndex = ((by + cy) >> 1) * gridSize + ((bx + cx) >> 1); + used[mIndex] = used[mIndex] || used[leftChildIndex] || used[rightChildIndex]; } - return reconciledState; - } - - initializeTileState(tile , painter ) { - tile.setFeatureState(this.state, painter); } - coalesceChanges(tiles , painter ) { - //track changes with full state objects, but only for features that got modified - const featuresChanged = {}; + const vertices = new StructArrayLayout4i8(); + const indices = new StructArrayLayout3ui6(); - for (const sourceLayer in this.stateChanges) { - this.state[sourceLayer] = this.state[sourceLayer] || {}; - const layerStates = {}; - for (const feature in this.stateChanges[sourceLayer]) { - if (!this.state[sourceLayer][feature]) this.state[sourceLayer][feature] = {}; - extend(this.state[sourceLayer][feature], this.stateChanges[sourceLayer][feature]); - layerStates[feature] = this.state[sourceLayer][feature]; - } - featuresChanged[sourceLayer] = layerStates; - } + let numVertices = 0; - for (const sourceLayer in this.deletedStates) { - this.state[sourceLayer] = this.state[sourceLayer] || {}; - const layerStates = {}; + function addVertex(x, y) { + const k = y * gridSize + x; - if (this.deletedStates[sourceLayer] === null) { - for (const ft in this.state[sourceLayer]) { - layerStates[ft] = {}; - this.state[sourceLayer][ft] = {}; - } - } else { - for (const feature in this.deletedStates[sourceLayer]) { - const deleteWholeFeatureState = this.deletedStates[sourceLayer][feature] === null; - if (deleteWholeFeatureState) this.state[sourceLayer][feature] = {}; - else { - for (const key of Object.keys(this.deletedStates[sourceLayer][feature])) { - delete this.state[sourceLayer][feature][key]; - } - } - layerStates[feature] = this.state[sourceLayer][feature]; - } - } + if (indexMap[k] === 0) { + vertices.emplaceBack( + reprojectedCoords[2 * k + 0], + reprojectedCoords[2 * k + 1], + x * EXTENT / meshSize, + y * EXTENT / meshSize); - featuresChanged[sourceLayer] = featuresChanged[sourceLayer] || {}; - extend(featuresChanged[sourceLayer], layerStates); + // save new vertex index so that we can reuse it + indexMap[k] = ++numVertices; } - this.stateChanges = {}; - this.deletedStates = {}; - - if (Object.keys(featuresChanged).length === 0) return; - - for (const id in tiles) { - const tile = tiles[id]; - tile.setFeatureState(featuresChanged, painter); - } + return indexMap[k] - 1; } -} - -// - - -class MipLevel { - - - - + function addTriangles(ax, ay, bx, by, cx, cy) { + const mx = (ax + bx) >> 1; + const my = (ay + by) >> 1; - constructor(size_ ) { - this.size = size_; - this.minimums = []; - this.maximums = []; - this.leaves = []; - } + if (Math.abs(ax - cx) + Math.abs(ay - cy) > 1 && used[my * gridSize + mx]) { + // triangle doesn't approximate the surface well enough; drill down further + addTriangles(cx, cy, ax, ay, mx, my); + addTriangles(bx, by, cx, cy, mx, my); - getElevation(x , y ) { - const idx = this.toIdx(x, y); - return { - min: this.minimums[idx], - max: this.maximums[idx] - }; + } else { + const ai = addVertex(ax, ay); + const bi = addVertex(bx, by); + const ci = addVertex(cx, cy); + indices.emplaceBack(ai, bi, ci); + } } - isLeaf(x , y ) { - return this.leaves[this.toIdx(x, y)]; - } + addTriangles(0, 0, meshSize, meshSize, meshSize, 0); + addTriangles(meshSize, meshSize, 0, 0, 0, meshSize); - toIdx(x , y ) { - return y * this.size + x; - } + return {vertices, indices}; } -function aabbRayIntersect(min , max , pos , dir ) { - let tMin = 0; - let tMax = Number.MAX_VALUE; +// - const epsilon = 1e-15; + - for (let i = 0; i < 3; i++) { - if (Math.abs(dir[i]) < epsilon) { - // Parallel ray - if (pos[i] < min[i] || pos[i] > max[i]) - return null; - } else { - const ood = 1.0 / dir[i]; - let t1 = (min[i] - pos[i]) * ood; - let t2 = (max[i] - pos[i]) * ood; - if (t1 > t2) { - const temp = t1; - t1 = t2; - t2 = temp; - } - if (t1 > tMin) - tMin = t1; - if (t2 < tMax) - tMax = t2; - if (tMin > tMax) - return null; - } - } +var boundsAttributes = (createLayout([ + {name: 'a_pos', type: 'Int16', components: 2}, + {name: 'a_texture_pos', type: 'Int16', components: 2} +]) ); - return tMin; -} +// -function triangleRayIntersect(ax, ay, az, bx, by, bz, cx, cy, cz, pos , dir ) { - // Compute barycentric coordinates u and v to find the intersection - const abX = bx - ax; - const abY = by - ay; - const abZ = bz - az; +const CLOCK_SKEW_RETRY_TIMEOUT = 30000; + - const acX = cx - ax; - const acY = cy - ay; - const acZ = cz - az; + + + + + + + /* Tile data was previously loaded, but has expired per its + * HTTP headers and is in the process of refreshing. */ - // pvec = cross(dir, a), det = dot(ab, pvec) - const pvecX = dir[1] * acZ - dir[2] * acY; - const pvecY = dir[2] * acX - dir[0] * acZ; - const pvecZ = dir[0] * acY - dir[1] * acX; - const det = abX * pvecX + abY * pvecY + abZ * pvecZ; +// a tile bounds outline used for getting reprojected tile geometry in non-mercator projections +const BOUNDS_FEATURE = (() => { + return { + type: 2, + extent: EXTENT, + loadGeometry() { + return [[ + new pointGeometry(0, 0), + new pointGeometry(EXTENT + 1, 0), + new pointGeometry(EXTENT + 1, EXTENT + 1), + new pointGeometry(0, EXTENT + 1), + new pointGeometry(0, 0) + ]]; + } + }; +})(); - if (Math.abs(det) < 1e-15) - return null; +/** + * 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 + */ +class Tile { + + + + + + + + + + + + + + + + + + + + + + + + + + + + - const invDet = 1.0 / det; - const tvecX = pos[0] - ax; - const tvecY = pos[1] - ay; - const tvecZ = pos[2] - az; - const u = (tvecX * pvecX + tvecY * pvecY + tvecZ * pvecZ) * invDet; + + + + + + + + + + + + + - if (u < 0.0 || u > 1.0) - return null; + + + + + - // qvec = cross(tvec, ab) - const qvecX = tvecY * abZ - tvecZ * abY; - const qvecY = tvecZ * abX - tvecX * abZ; - const qvecZ = tvecX * abY - tvecY * abX; - const v = (dir[0] * qvecX + dir[1] * qvecY + dir[2] * qvecZ) * invDet; + + - if (v < 0.0 || u + v > 1.0) - return null; + + + + + + + + + + + - return (acX * qvecX + acY * qvecY + acZ * qvecZ) * invDet; -} + /** + * @param {OverscaledTileID} tileID + * @param size + * @private + */ + constructor(tileID , size , tileZoom , painter , isRaster ) { + this.tileID = tileID; + this.uid = uniqueId(); + this.uses = 0; + this.tileSize = size; + this.tileZoom = tileZoom; + this.buckets = {}; + this.expirationTime = null; + this.queryPadding = 0; + this.hasSymbolBuckets = false; + this.hasRTLText = false; + this.dependencies = {}; + this.isRaster = isRaster; -function frac(v, lo, hi) { - return (v - lo) / (hi - lo); -} + // 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; -function decodeBounds(x, y, depth, boundsMinx, boundsMiny, boundsMaxx, boundsMaxy, outMin, outMax) { - const scale = 1 << depth; - const rangex = boundsMaxx - boundsMinx; - const rangey = boundsMaxy - boundsMiny; + this.state = 'loading'; + + if (painter && painter.transform) { + this.projection = painter.transform.projection; + } + } - const minX = (x + 0) / scale * rangex + boundsMinx; - const maxX = (x + 1) / scale * rangex + boundsMinx; - const minY = (y + 0) / scale * rangey + boundsMiny; - const maxY = (y + 1) / scale * rangey + boundsMiny; + registerFadeDuration(duration ) { + const fadeEndTime = duration + this.timeAdded; + if (fadeEndTime < exported$1.now()) return; + if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) return; - outMin[0] = minX; - outMin[1] = minY; - outMax[0] = maxX; - outMax[1] = maxY; -} + this.fadeEndTime = fadeEndTime; + } -// A small padding value is used with bounding boxes to extend the bottom below sea level -const aabbSkirtPadding = 100; + wasRequested() { + return this.state === 'errored' || this.state === 'loaded' || this.state === 'reloading'; + } -// A sparse min max quad tree for performing accelerated queries against dem elevation data. -// Each tree node stores the minimum and maximum elevation of its children nodes and a flag whether the node is a leaf. -// Node data is stored in non-interleaved arrays where the root is at index 0. -class DemMinMaxQuadTree { - - - - - - - + get tileTransform() { + if (!this._tileTransform) { + this._tileTransform = tileTransform(this.tileID.canonical, this.projection); + } + return this._tileTransform; + } - constructor(dem_ ) { - this.maximums = []; - this.minimums = []; - this.leaves = []; - this.childOffsets = []; - this.nodeCount = 0; - this.dem = dem_; + /** + * 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 + */ + loadVectorData(data , painter , justReloaded ) { + this.unloadVectorData(); - // Precompute the order of 4 sibling nodes in the memory. Top-left, top-right, bottom-left, bottom-right - this._siblingOffset = [ - [0, 0], - [1, 0], - [0, 1], - [1, 1] - ]; + this.state = 'loaded'; - if (!this.dem) + // empty GeoJSON tile + if (!data) { + this.collisionBoxArray = new CollisionBoxArray(); return; + } - const mips = buildDemMipmap(this.dem); - const maxLvl = mips.length - 1; + if (data.featureIndex) { + this.latestFeatureIndex = data.featureIndex; + if (data.rawTileData) { + // Only vector tiles have rawTileData, and they won't update it for + // 'reloadTile' + this.latestRawTileData = data.rawTileData; + this.latestFeatureIndex.rawTileData = data.rawTileData; + } else if (this.latestRawTileData) { + // If rawTileData hasn't updated, hold onto a pointer to the last + // one we received + this.latestFeatureIndex.rawTileData = this.latestRawTileData; + } + } + this.collisionBoxArray = data.collisionBoxArray; + this.buckets = deserialize(data.buckets, painter.style); - // Create the root node - const rootMip = mips[maxLvl]; - const min = rootMip.minimums; - const max = rootMip.maximums; - const leaves = rootMip.leaves; - this._addNode(min[0], max[0], leaves[0]); + this.hasSymbolBuckets = false; + for (const id in this.buckets) { + const bucket = this.buckets[id]; + if (bucket instanceof SymbolBucket$1) { + this.hasSymbolBuckets = true; + if (justReloaded) { + bucket.justReloaded = true; + } else { + break; + } + } + } - // Construct the rest of the tree recursively - this._construct(mips, 0, 0, maxLvl, 0); - } + this.hasRTLText = false; + if (this.hasSymbolBuckets) { + for (const id in this.buckets) { + const bucket = this.buckets[id]; + if (bucket instanceof SymbolBucket$1) { + if (bucket.hasRTLText) { + this.hasRTLText = true; + lazyLoadRTLTextPlugin(); + break; + } + } + } + } - // Performs raycast against the tree root only. Min and max coordinates defines the size of the root node - raycastRoot(minx , miny , maxx , maxy , p , d , exaggeration = 1) { - const min = [minx, miny, -aabbSkirtPadding]; - const max = [maxx, maxy, this.maximums[0] * exaggeration]; - return aabbRayIntersect(min, max, p, d); - } + this.queryPadding = 0; + for (const id in this.buckets) { + const bucket = this.buckets[id]; + this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(id).queryRadius(bucket)); + } - raycast(rootMinx , rootMiny , rootMaxx , rootMaxy , p , d , exaggeration = 1) { - if (!this.nodeCount) - return null; + if (data.imageAtlas) { + this.imageAtlas = data.imageAtlas; + } + if (data.glyphAtlasImage) { + this.glyphAtlasImage = data.glyphAtlasImage; + } + if (data.lineAtlas) { + this.lineAtlas = data.lineAtlas; + } + } - const t = this.raycastRoot(rootMinx, rootMiny, rootMaxx, rootMaxy, p, d, exaggeration); - if (t == null) - return null; + /** + * Release any data or WebGL resources referenced by this tile. + * @returns {undefined} + * @private + */ + unloadVectorData() { + if (!this.hasData()) return; - const tHits = []; - const sortedHits = []; - const boundsMin = []; - const boundsMax = []; + for (const id in this.buckets) { + this.buckets[id].destroy(); + } + this.buckets = {}; - const stack = [{ - idx: 0, - t, - nodex: 0, - nodey: 0, - depth: 0 - }]; + if (this.imageAtlas) { + this.imageAtlas = null; + } - // Traverse the tree until something is hit or the ray escapes - while (stack.length > 0) { - const {idx, t, nodex, nodey, depth} = stack.pop(); + if (this.lineAtlas) { + this.lineAtlas = null; + } - if (this.leaves[idx]) { - // Create 2 triangles to approximate the surface plane for more precise tests - decodeBounds(nodex, nodey, depth, rootMinx, rootMiny, rootMaxx, rootMaxy, boundsMin, boundsMax); + if (this.imageAtlasTexture) { + this.imageAtlasTexture.destroy(); + } - const scale = 1 << depth; - const minxUv = (nodex + 0) / scale; - const maxxUv = (nodex + 1) / scale; - const minyUv = (nodey + 0) / scale; - const maxyUv = (nodey + 1) / scale; + if (this.glyphAtlasTexture) { + this.glyphAtlasTexture.destroy(); + } - // 4 corner points A, B, C and D defines the (quad) area covered by this node - const az = sampleElevation(minxUv, minyUv, this.dem) * exaggeration; - const bz = sampleElevation(maxxUv, minyUv, this.dem) * exaggeration; - const cz = sampleElevation(maxxUv, maxyUv, this.dem) * exaggeration; - const dz = sampleElevation(minxUv, maxyUv, this.dem) * exaggeration; + if (this.lineAtlasTexture) { + this.lineAtlasTexture.destroy(); + } - const t0 = triangleRayIntersect( - boundsMin[0], boundsMin[1], az, // A - boundsMax[0], boundsMin[1], bz, // B - boundsMax[0], boundsMax[1], cz, // C - p, d); + if (this._tileBoundsBuffer) { + this._tileBoundsBuffer.destroy(); + this._tileBoundsIndexBuffer.destroy(); + this._tileBoundsSegments.destroy(); + this._tileBoundsBuffer = null; + } - const t1 = triangleRayIntersect( - boundsMax[0], boundsMax[1], cz, - boundsMin[0], boundsMax[1], dz, - boundsMin[0], boundsMin[1], az, - p, d); + if (this._tileDebugBuffer) { + this._tileDebugBuffer.destroy(); + this._tileDebugIndexBuffer.destroy(); + this._tileDebugSegments.destroy(); + this._tileDebugBuffer = null; + } - const tMin = Math.min( - t0 !== null ? t0 : Number.MAX_VALUE, - t1 !== null ? t1 : Number.MAX_VALUE); + if (this._globeTileDebugBorderBuffer) { + this._globeTileDebugBorderBuffer.destroy(); + this._globeTileDebugBorderBuffer = null; + } - // The ray might go below the two surface triangles but hit one of the sides. - // This covers the case of skirt geometry between two dem tiles of different zoom level - if (tMin === Number.MAX_VALUE) { - const hitPos = scaleAndAdd([], p, d, t); - const fracx = frac(hitPos[0], boundsMin[0], boundsMax[0]); - const fracy = frac(hitPos[1], boundsMin[1], boundsMax[1]); + if (this._tileDebugTextBuffer) { + this._tileDebugTextBuffer.destroy(); + this._tileDebugTextSegments.destroy(); + this._tileDebugTextIndexBuffer.destroy(); + this._tileDebugTextBuffer = null; + } - if (bilinearLerp(az, bz, dz, cz, fracx, fracy) >= hitPos[2]) - return t; - } else { - return tMin; - } + if (this._globeTileDebugTextBuffer) { + this._globeTileDebugTextBuffer.destroy(); + this._globeTileDebugTextBuffer = null; + } - continue; + Debug.run(() => { + if (this.queryGeometryDebugViz) { + this.queryGeometryDebugViz.unload(); + delete this.queryGeometryDebugViz; + } + if (this.queryBoundsDebugViz) { + this.queryBoundsDebugViz.unload(); + delete this.queryBoundsDebugViz; } + }); + this.latestFeatureIndex = null; + this.state = 'unloaded'; + } - // Perform intersection tests agains each of the 4 child nodes and store results from closest to furthest. - let hitCount = 0; + getBucket(layer ) { + return this.buckets[layer.id]; + } - for (let i = 0; i < this._siblingOffset.length; i++) { + upload(context ) { + for (const id in this.buckets) { + const bucket = this.buckets[id]; + if (bucket.uploadPending()) { + bucket.upload(context); + } + } - const childNodeX = (nodex << 1) + this._siblingOffset[i][0]; - const childNodeY = (nodey << 1) + this._siblingOffset[i][1]; + const gl = context.gl; + if (this.imageAtlas && !this.imageAtlas.uploaded) { + this.imageAtlasTexture = new Texture(context, this.imageAtlas.image, gl.RGBA); + this.imageAtlas.uploaded = true; + } - // Decode node aabb from the morton code - decodeBounds(childNodeX, childNodeY, depth + 1, rootMinx, rootMiny, rootMaxx, rootMaxy, boundsMin, boundsMax); + if (this.glyphAtlasImage) { + this.glyphAtlasTexture = new Texture(context, this.glyphAtlasImage, gl.ALPHA); + this.glyphAtlasImage = null; + } - boundsMin[2] = -aabbSkirtPadding; - boundsMax[2] = this.maximums[this.childOffsets[idx] + i] * exaggeration; + if (this.lineAtlas && !this.lineAtlas.uploaded) { + this.lineAtlasTexture = new Texture(context, this.lineAtlas.image, gl.ALPHA); + this.lineAtlas.uploaded = true; + } + } - const result = aabbRayIntersect(boundsMin, boundsMax, p, d); - if (result != null) { - // Build the result list from furthest to closest hit. - // The order will be inversed when building the stack - const tHit = result; - tHits[i] = tHit; + prepare(imageManager ) { + if (this.imageAtlas) { + this.imageAtlas.patchUpdatedImages(imageManager, this.imageAtlasTexture); + } + } - let added = false; - for (let j = 0; j < hitCount && !added; j++) { - if (tHit >= tHits[sortedHits[j]]) { - sortedHits.splice(j, 0, i); - added = true; - } - } - if (!added) - sortedHits[hitCount] = i; - hitCount++; + // Queries non-symbol features rendered for this tile. + // Symbol features are queried globally + queryRenderedFeatures(layers , + serializedLayers , + sourceFeatureState , + tileResult , + params , + transform , + pixelPosMatrix , + visualizeQueryGeometry ) { + Debug.run(() => { + if (visualizeQueryGeometry) { + let geometryViz = this.queryGeometryDebugViz; + let boundsViz = this.queryBoundsDebugViz; + if (!geometryViz) { + geometryViz = this.queryGeometryDebugViz = new TileSpaceDebugBuffer(this.tileSize); + } + if (!boundsViz) { + boundsViz = this.queryBoundsDebugViz = new TileSpaceDebugBuffer(this.tileSize, Color.blue); } - } - // Continue recursion from closest to furthest - for (let i = 0; i < hitCount; i++) { - const hitIdx = sortedHits[i]; - stack.push({ - idx: this.childOffsets[idx] + hitIdx, - t: tHits[hitIdx], - nodex: (nodex << 1) + this._siblingOffset[hitIdx][0], - nodey: (nodey << 1) + this._siblingOffset[hitIdx][1], - depth: depth + 1 - }); + geometryViz.addPoints(tileResult.tilespaceGeometry); + boundsViz.addPoints(tileResult.bufferedTilespaceGeometry); } - } + }); - return null; - } + if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData) + return {}; - _addNode(min , max , leaf ) { - this.minimums.push(min); - this.maximums.push(max); - this.leaves.push(leaf); - this.childOffsets.push(0); - return this.nodeCount++; + return this.latestFeatureIndex.query({ + tileResult, + pixelPosMatrix, + transform, + params, + tileTransform: this.tileTransform + }, layers, serializedLayers, sourceFeatureState); } - _construct(mips , x , y , lvl , parentIdx ) { - if (mips[lvl].isLeaf(x, y) === 1) { - return; - } + querySourceFeatures(result , params ) { + const featureIndex = this.latestFeatureIndex; + if (!featureIndex || !featureIndex.rawTileData) return; - // Update parent offset - if (!this.childOffsets[parentIdx]) - this.childOffsets[parentIdx] = this.nodeCount; + const vtLayers = featureIndex.loadVTLayers(); - // Construct all 4 children and place them next to each other in memory - const childLvl = lvl - 1; - const childMip = mips[childLvl]; + const sourceLayer = params ? params.sourceLayer : ''; + const layer = vtLayers._geojsonTileLayer || vtLayers[sourceLayer]; - let leafMask = 0; - let firstNodeIdx; + if (!layer) return; - for (let i = 0; i < this._siblingOffset.length; i++) { - const childX = x * 2 + this._siblingOffset[i][0]; - const childY = y * 2 + this._siblingOffset[i][1]; + const filter = createFilter(params && params.filter); + const {z, x, y} = this.tileID.canonical; + const coord = {z, x, y}; - const elevation = childMip.getElevation(childX, childY); - const leaf = childMip.isLeaf(childX, childY); - const nodeIdx = this._addNode(elevation.min, elevation.max, leaf); + for (let i = 0; i < layer.length; i++) { + const feature = layer.feature(i); + if (filter.needGeometry) { + const evaluationFeature = toEvaluationFeature(feature, true); + if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) continue; + } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { + continue; + } + const id = featureIndex.getId(feature, sourceLayer); + const geojsonFeature = new Feature(feature, z, x, y, id); + geojsonFeature.tile = coord; - if (leaf) - leafMask |= 1 << i; - if (!firstNodeIdx) - firstNodeIdx = nodeIdx; + result.push(geojsonFeature); } + } - // Continue construction of the tree recursively to non-leaf nodes. - for (let i = 0; i < this._siblingOffset.length; i++) { - if (!(leafMask & (1 << i))) { - this._construct(mips, x * 2 + this._siblingOffset[i][0], y * 2 + this._siblingOffset[i][1], childLvl, firstNodeIdx + i); - } - } + hasData() { + return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired'; } -} -function bilinearLerp(p00 , p10 , p01 , p11 , x , y ) { - return number( - number(p00, p01, y), - number(p10, p11, y), - x); -} + patternsLoaded() { + return !!this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length; + } -// Sample elevation in normalized uv-space ([0, 0] is the top left) -// This function does not account for exaggeration -function sampleElevation(fx , fy , dem ) { - // Sample position in texels - const demSize = dem.dim; - const x = clamp(fx * demSize - 0.5, 0, demSize - 1); - const y = clamp(fy * demSize - 0.5, 0, demSize - 1); + setExpiryData(data ) { + const prior = this.expirationTime; - // Compute 4 corner points for bilinear interpolation - const ixMin = Math.floor(x); - const iyMin = Math.floor(y); - const ixMax = Math.min(ixMin + 1, demSize - 1); - const iyMax = Math.min(iyMin + 1, demSize - 1); + if (data.cacheControl) { + const parsedCC = 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(); + } - const e00 = dem.get(ixMin, iyMin); - const e10 = dem.get(ixMax, iyMin); - const e01 = dem.get(ixMin, iyMax); - const e11 = dem.get(ixMax, iyMax); + if (this.expirationTime) { + const now = Date.now(); + let isExpired = false; - return bilinearLerp(e00, e10, e01, e11, x - ixMin, y - iyMin); -} + 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; -function buildDemMipmap(dem ) { - const demSize = dem.dim; + } else { + const delta = this.expirationTime - prior; - const elevationDiffThreshold = 5; - const texelSizeOfMip0 = 8; - const levelCount = Math.ceil(Math.log2(demSize / texelSizeOfMip0)); - const mips = []; + if (!delta) { + // Server is serving the same expired resource over and over: fall + // back to exponential backoff. + isExpired = true; - let blockCount = Math.ceil(Math.pow(2, levelCount)); - const blockSize = 1 / blockCount; + } 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); - const blockSamples = (x, y, size, exclusive, outBounds) => { - const padding = exclusive ? 1 : 0; - const minx = x * size; - const maxx = (x + 1) * size - padding; - const miny = y * size; - const maxy = (y + 1) * size - padding; + } + } - outBounds[0] = minx; - outBounds[1] = miny; - outBounds[2] = maxx; - outBounds[3] = maxy; - }; + if (isExpired) { + this.expiredRequestCount++; + this.state = 'expired'; + } else { + this.expiredRequestCount = 0; + } + } + } - // The first mip (0) is built by sampling 4 corner points of each 8x8 texel block - let mip = new MipLevel(blockCount); - const blockBounds = []; + 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); + } + } + } - for (let idx = 0; idx < blockCount * blockCount; idx++) { - const y = Math.floor(idx / blockCount); - const x = idx % blockCount; + setFeatureState(states , painter ) { + if (!this.latestFeatureIndex || + !this.latestFeatureIndex.rawTileData || + Object.keys(states).length === 0 || + !painter) { + return; + } - blockSamples(x, y, blockSize, false, blockBounds); + const vtLayers = this.latestFeatureIndex.loadVTLayers(); + const availableImages = painter.style.listImages(); - const e0 = sampleElevation(blockBounds[0], blockBounds[1], dem); // minx, miny - const e1 = sampleElevation(blockBounds[2], blockBounds[1], dem); // maxx, miny - const e2 = sampleElevation(blockBounds[2], blockBounds[3], dem); // maxx, maxy - const e3 = sampleElevation(blockBounds[0], blockBounds[3], dem); // minx, maxy + for (const id in this.buckets) { + if (!painter.style.hasLayer(id)) continue; + + const bucket = this.buckets[id]; + // Buckets are grouped by common source-layer + const sourceLayerId = bucket.layers[0]['sourceLayer'] || '_geojsonTileLayer'; + const sourceLayer = vtLayers[sourceLayerId]; + const sourceLayerStates = states[sourceLayerId]; + if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0) continue; - mip.minimums.push(Math.min(e0, e1, e2, e3)); - mip.maximums.push(Math.max(e0, e1, e2, e3)); - mip.leaves.push(1); + // $FlowFixMe[incompatible-type] Flow can't interpret ImagePosition as SpritePosition for some reason here + const imagePositions = (this.imageAtlas && this.imageAtlas.patternPositions) || {}; + bucket.update(sourceLayerStates, sourceLayer, availableImages, imagePositions); + if (bucket instanceof LineBucket || bucket instanceof FillBucket) { + const sourceCache = painter.style._getSourceCache(bucket.layers[0].source); + if (painter._terrain && painter._terrain.enabled && sourceCache && bucket.programConfigurations.needsUpload) { + painter._terrain._clearRenderCacheForTile(sourceCache.id, this.tileID); + } + } + const layer = painter && painter.style && painter.style.getLayer(id); + if (layer) { + this.queryPadding = Math.max(this.queryPadding, layer.queryRadius(bucket)); + } + } } - mips.push(mip); - - // Construct the rest of the mip levels from bottom to up - for (blockCount /= 2; blockCount >= 1; blockCount /= 2) { - const prevMip = mips[mips.length - 1]; - - mip = new MipLevel(blockCount); + holdingForFade() { + return this.symbolFadeHoldUntil !== undefined; + } - for (let idx = 0; idx < blockCount * blockCount; idx++) { - const y = Math.floor(idx / blockCount); - const x = idx % blockCount; + symbolFadeFinished() { + return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < exported$1.now(); + } - // Sample elevation of all 4 children mip texels. 4 leaf nodes can be concatenated into a single - // leaf if the total elevation difference is below the threshold value - blockSamples(x, y, 2, true, blockBounds); + clearFadeHold() { + this.symbolFadeHoldUntil = undefined; + } - const e0 = prevMip.getElevation(blockBounds[0], blockBounds[1]); - const e1 = prevMip.getElevation(blockBounds[2], blockBounds[1]); - const e2 = prevMip.getElevation(blockBounds[2], blockBounds[3]); - const e3 = prevMip.getElevation(blockBounds[0], blockBounds[3]); + setHoldDuration(duration ) { + this.symbolFadeHoldUntil = exported$1.now() + duration; + } - const l0 = prevMip.isLeaf(blockBounds[0], blockBounds[1]); - const l1 = prevMip.isLeaf(blockBounds[2], blockBounds[1]); - const l2 = prevMip.isLeaf(blockBounds[2], blockBounds[3]); - const l3 = prevMip.isLeaf(blockBounds[0], blockBounds[3]); + setTexture(img , painter ) { + const context = painter.context; + const gl = context.gl; + this.texture = painter.getTileTexture(img.width); + if (this.texture) { + this.texture.update(img, {useMipmap: true}); + } else { + this.texture = new Texture(context, img, gl.RGBA, {useMipmap: true}); + this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - const minElevation = Math.min(e0.min, e1.min, e2.min, e3.min); - const maxElevation = Math.max(e0.max, e1.max, e2.max, e3.max); - const canConcatenate = l0 && l1 && l2 && l3; + if (context.extTextureFilterAnisotropic) { + gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax); + } + } + } - mip.maximums.push(maxElevation); - mip.minimums.push(minElevation); + setDependencies(namespace , dependencies ) { + const index = {}; + for (const dep of dependencies) { + index[dep] = true; + } + this.dependencies[namespace] = index; + } - if (maxElevation - minElevation <= elevationDiffThreshold && canConcatenate) { - // All samples have uniform elevation. Mark this as a leaf - mip.leaves.push(1); - } else { - mip.leaves.push(0); + hasDependency(namespaces , keys ) { + for (const namespace of namespaces) { + const dependencies = this.dependencies[namespace]; + if (dependencies) { + for (const key of keys) { + if (dependencies[key]) { + return true; + } + } } } + return false; + } - mips.push(mip); + clearQueryDebugViz() { + Debug.run(() => { + if (this.queryGeometryDebugViz) { + this.queryGeometryDebugViz.clearPoints(); + } + if (this.queryBoundsDebugViz) { + this.queryBoundsDebugViz.clearPoints(); + } + }); } - return mips; -} + _makeDebugTileBoundsBuffers(context , projection ) { + if (!projection || projection.name === 'mercator' || this._tileDebugBuffer) return; -// + // reproject tile outline with adaptive resampling + const boundsLine = loadGeometry(BOUNDS_FEATURE, this.tileID.canonical, this.tileTransform)[0]; -// 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 appropriate decoding formula, but we store the -// elevation data 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. + // generate vertices for debugging tile boundaries + const debugVertices = new StructArrayLayout2i4(); + const debugIndices = new StructArrayLayout1ui2(); -// 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. + for (let i = 0; i < boundsLine.length; i++) { + const {x, y} = boundsLine[i]; + debugVertices.emplaceBack(x, y); + debugIndices.emplaceBack(i); + } + debugIndices.emplaceBack(0); - + this._tileDebugIndexBuffer = context.createIndexBuffer(debugIndices); + this._tileDebugBuffer = context.createVertexBuffer(debugVertices, posAttributes.members); + this._tileDebugSegments = SegmentVector.simpleSegment(0, 0, debugVertices.length, debugIndices.length); + } -const unpackVectors = { - mapbox: [6553.6, 25.6, 0.1, 10000.0], - terrarium: [256.0, 1.0, 1.0 / 256.0, 32768.0] -}; + _makeTileBoundsBuffers(context , projection ) { + if (this._tileBoundsBuffer || !projection || projection.name === 'mercator') return; -class DEMData { - - - - - - - - get tree() { - if (!this._tree) this._buildQuadTree(); - return this._tree; - } + // reproject tile outline with adaptive resampling + const boundsLine = loadGeometry(BOUNDS_FEATURE, this.tileID.canonical, this.tileTransform)[0]; - // RGBAImage data has uniform 1px padding on all sides: square tile edge size defines stride - // and dim is calculated as stride - 2. - constructor(uid , data , encoding , borderReady = false, buildQuadTree = false) { - this.uid = uid; - if (data.height !== data.width) throw new RangeError('DEM tiles must be square'); - if (encoding && encoding !== "mapbox" && encoding !== "terrarium") return warnOnce( - `"${encoding}" is not a valid encoding type. Valid types include "mapbox" and "terrarium".` - ); - this.stride = data.height; - const dim = this.dim = data.height - 2; - this.data = new Uint32Array(data.data.buffer); - this.encoding = encoding || 'mapbox'; - this.borderReady = borderReady; + let boundsVertices, boundsIndices; + if (this.isRaster) { + // for raster tiles, generate an adaptive MARTINI mesh + const mesh = getTileMesh(this.tileID.canonical, projection); + boundsVertices = mesh.vertices; + boundsIndices = mesh.indices; - if (borderReady) return; + } else { + // for vector tiles, generate an Earcut triangulation of the outline + boundsVertices = new StructArrayLayout4i8(); + boundsIndices = new StructArrayLayout3ui6(); - // 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 (let x = 0; x < dim; x++) { - // left vertical border - this.data[this._idx(-1, x)] = this.data[this._idx(0, x)]; - // right vertical border - this.data[this._idx(dim, x)] = this.data[this._idx(dim - 1, x)]; - // left horizontal border - this.data[this._idx(x, -1)] = this.data[this._idx(x, 0)]; - // right horizontal border - this.data[this._idx(x, dim)] = this.data[this._idx(x, dim - 1)]; + for (const {x, y} of boundsLine) { + boundsVertices.emplaceBack(x, y, 0, 0); + } + const indices = earcut_1(boundsVertices.int16, undefined, 4); + for (let i = 0; i < indices.length; i += 3) { + boundsIndices.emplaceBack(indices[i], indices[i + 1], indices[i + 2]); + } } - // corners - this.data[this._idx(-1, -1)] = this.data[this._idx(0, 0)]; - this.data[this._idx(dim, -1)] = this.data[this._idx(dim - 1, 0)]; - this.data[this._idx(-1, dim)] = this.data[this._idx(0, dim - 1)]; - this.data[this._idx(dim, dim)] = this.data[this._idx(dim - 1, dim - 1)]; - if (buildQuadTree) this._buildQuadTree(); + this._tileBoundsBuffer = context.createVertexBuffer(boundsVertices, boundsAttributes.members); + this._tileBoundsIndexBuffer = context.createIndexBuffer(boundsIndices); + this._tileBoundsSegments = SegmentVector.simpleSegment(0, 0, boundsVertices.length, boundsIndices.length); } - _buildQuadTree() { - assert_1(!this._tree); - // Construct the implicit sparse quad tree by traversing mips from top to down - this._tree = new DemMinMaxQuadTree(this); - } + _makeGlobeTileDebugBuffers(context , projection ) { + if (this._globeTileDebugBorderBuffer || this._globeTileDebugTextBuffer || !projection || projection.name !== 'globe') return; - get(x , y , clampToEdge = false) { - const pixels = new Uint8Array(this.data.buffer); - if (clampToEdge) { - x = clamp(x, -1, this.dim); - y = clamp(y, -1, this.dim); - } - const index = this._idx(x, y) * 4; - const unpack = this.encoding === "terrarium" ? this._unpackTerrarium : this._unpackMapbox; - return unpack(pixels[index], pixels[index + 1], pixels[index + 2]); - } + const id = this.tileID.canonical; + const bounds = globeTileBounds(id); + const normalizationMatrix = globeNormalizeECEF(bounds); - static getUnpackVector(encoding ) { - return unpackVectors[encoding]; + this._makeGlobeTileDebugBorderBuffer(context, id, normalizationMatrix); + this._makeGlobeTileDebugTextBuffer(context, id, normalizationMatrix); } - get unpackVector() { - return unpackVectors[this.encoding]; - } + _makeGlobeTileDebugBorderBuffer(context , id , normalizationMatrix ) { + const vertices = new StructArrayLayout2i4(); + const indices = new StructArrayLayout1ui2(); + const extraGlobe = new StructArrayLayout3i6(); - _idx(x , y ) { - if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1) throw new RangeError('out of range source coordinates for DEM data'); - return (y + 1) * this.stride + (x + 1); - } + const addLine = (sx , sy , ex , ey , pointCount ) => { + const stepX = (ex - sx) / (pointCount - 1); + const stepY = (ey - sy) / (pointCount - 1); - _unpackMapbox(r , g , b ) { - // unpacking formula for mapbox.terrain-rgb: - // https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb - return ((r * 256 * 256 + g * 256.0 + b) / 10.0 - 10000.0); - } + const vOffset = vertices.length; - _unpackTerrarium(r , g , b ) { - // unpacking formula for mapzen terrarium: - // https://aws.amazon.com/public-datasets/terrain/ - return ((r * 256 + g + b / 256) - 32768.0); - } + for (let i = 0; i < pointCount; i++) { + const x = sx + i * stepX; + const y = sy + i * stepY; + vertices.emplaceBack(x, y); - static pack(altitude , encoding ) { - const color = [0, 0, 0, 0]; - const vector = DEMData.getUnpackVector(encoding); - let v = Math.floor((altitude + vector[3]) / vector[2]); - color[2] = v % 256; - v = Math.floor(v / 256); - color[1] = v % 256; - v = Math.floor(v / 256); - color[0] = v; - return color; - } + // The next two lines are equivalent to doing projection.projectTilePoint. + // This way we don't recompute the normalization matrix everytime since it remains the same for all points. + const ecef = tileCoordToECEF(x, y, id); + const gp = transformMat4$2(ecef, ecef, normalizationMatrix); + + extraGlobe.emplaceBack(gp[0], gp[1], gp[2]); + indices.emplaceBack(vOffset + i); + } + }; + + const e = EXTENT; + addLine(0, 0, e, 0, 16); + addLine(e, 0, e, e, 16); + addLine(e, e, 0, e, 16); + addLine(0, e, 0, 0, 16); - getPixels() { - return new RGBAImage({width: this.stride, height: this.stride}, new Uint8Array(this.data.buffer)); + this._tileDebugIndexBuffer = context.createIndexBuffer(indices); + this._tileDebugBuffer = context.createVertexBuffer(vertices, posAttributes.members); + this._globeTileDebugBorderBuffer = context.createVertexBuffer(extraGlobe, posAttributesGlobeExt.members); + this._tileDebugSegments = SegmentVector.simpleSegment(0, 0, vertices.length, indices.length); } - backfillBorder(borderTile , dx , dy ) { - if (this.dim !== borderTile.dim) throw new Error('dem dimension mismatch'); + _makeGlobeTileDebugTextBuffer(context , id , normalizationMatrix ) { + const SEGMENTS = 4; + const numVertices = SEGMENTS + 1; + const step = EXTENT / SEGMENTS; - let xMin = dx * this.dim, - xMax = dx * this.dim + this.dim, - yMin = dy * this.dim, - yMax = dy * this.dim + this.dim; + const vertices = new StructArrayLayout2i4(); + const indices = new StructArrayLayout3ui6(); + const extraGlobe = new StructArrayLayout3i6(); - switch (dx) { - case -1: - xMin = xMax - 1; - break; - case 1: - xMax = xMin + 1; - break; - } + const totalVertices = numVertices * numVertices; + const totalTriangles = SEGMENTS * SEGMENTS * 2; + indices.reserve(totalTriangles); + vertices.reserve(totalVertices); + extraGlobe.reserve(totalVertices); - switch (dy) { - case -1: - yMin = yMax - 1; - break; - case 1: - yMax = yMin + 1; - break; + const toIndex = (j , i ) => { + return totalVertices * j + i; + }; + + // add vertices. + for (let j = 0; j < totalVertices; j++) { + const y = j * step; + for (let i = 0; i < totalVertices; i++) { + const x = i * step; + vertices.emplaceBack(x, y); + + const ecef = tileCoordToECEF(x, y, id); + const gp = transformMat4$2(ecef, ecef, normalizationMatrix); + extraGlobe.emplaceBack(gp[0], gp[1], gp[2]); + } } - const ox = -dx * this.dim; - const oy = -dy * this.dim; - for (let y = yMin; y < yMax; y++) { - for (let x = xMin; x < xMax; x++) { - this.data[this._idx(x, y)] = borderTile.data[this._idx(x + ox, y + oy)]; + // add indices. + for (let j = 0; j < SEGMENTS; j++) { + for (let i = 0; i < SEGMENTS; i++) { + const tl = toIndex(j, i); + const tr = toIndex(j, i + 1); + const bl = toIndex(j + 1, i); + const br = toIndex(j + 1, i + 1); + + // first triangle of the sub-patch. + indices.emplaceBack(tl, tr, bl); + + // second triangle of the sub-patch. + indices.emplaceBack(bl, tr, br); } } - } - onDeserialize() { - if (this._tree) this._tree.dem = this; + this._tileDebugTextIndexBuffer = context.createIndexBuffer(indices); + this._tileDebugTextBuffer = context.createVertexBuffer(vertices, posAttributes.members); + this._globeTileDebugTextBuffer = context.createVertexBuffer(extraGlobe, posAttributesGlobeExt.members); + this._tileDebugTextSegments = SegmentVector.simpleSegment(0, 0, totalVertices, totalTriangles); } } -register('DEMData', DEMData); -register('DemMinMaxQuadTree', DemMinMaxQuadTree, {omit: ['dem']}); - // - + + + + + /** - * 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 - * + * SourceFeatureState manages the state and pending changes + * to features in a source, separated by source layer. + * stateChanges and deletedStates batch all changes to the tile (updates and removes, respectively) + * between coalesce() events. addFeatureState() and removeFeatureState() also update their counterpart's + * list of changes, such that coalesce() can apply the proper state changes while agnostic to the order of operations. + * In deletedStates, all null's denote complete removal of state at that scope * @private - */ -class TileCache { - - - - - /** - * @param {number} max The max number of permitted values. - * @private - * @param {Function} onRemove The callback called with items when they expire. - */ - constructor(max , onRemove ) { - this.max = max; - this.onRemove = onRemove; - this.reset(); +*/ +class SourceFeatureState { + + + + + constructor() { + this.state = {}; + this.stateChanges = {}; + this.deletedStates = {}; } - /** - * Clear the cache. - * - * @returns {TileCache} Returns itself to allow for method chaining. - * @private - */ - reset() { - for (const key in this.data) { - for (const removedData of this.data[key]) { - if (removedData.timeout) clearTimeout(removedData.timeout); - this.onRemove(removedData.value); + updateState(sourceLayer , featureId , newState ) { + const feature = String(featureId); + this.stateChanges[sourceLayer] = this.stateChanges[sourceLayer] || {}; + this.stateChanges[sourceLayer][feature] = this.stateChanges[sourceLayer][feature] || {}; + extend$1(this.stateChanges[sourceLayer][feature], newState); + + if (this.deletedStates[sourceLayer] === null) { + this.deletedStates[sourceLayer] = {}; + for (const ft in this.state[sourceLayer]) { + if (ft !== feature) this.deletedStates[sourceLayer][ft] = null; + } + } else { + const featureDeletionQueued = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] === null; + if (featureDeletionQueued) { + this.deletedStates[sourceLayer][feature] = {}; + for (const prop in this.state[sourceLayer][feature]) { + if (!newState[prop]) this.deletedStates[sourceLayer][feature][prop] = null; + } + } else { + for (const key in newState) { + const deletionInQueue = this.deletedStates[sourceLayer] && this.deletedStates[sourceLayer][feature] && this.deletedStates[sourceLayer][feature][key] === null; + if (deletionInQueue) delete this.deletedStates[sourceLayer][feature][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 {OverscaledTileID} tileID lookup key for the item - * @param {*} data any value - * - * @returns {TileCache} Returns itself to allow for method chaining. - * @private - */ - add(tileID , data , expiryTimeout ) { - const key = tileID.wrapped().key; - if (this.data[key] === undefined) { - this.data[key] = []; - } + removeFeatureState(sourceLayer , featureId , key ) { + const sourceLayerDeleted = this.deletedStates[sourceLayer] === null; + if (sourceLayerDeleted) return; - const dataWrapper = { - value: data, - timeout: undefined - }; + const feature = String(featureId); - if (expiryTimeout !== undefined) { - dataWrapper.timeout = setTimeout(() => { - this.remove(tileID, dataWrapper); - }, expiryTimeout); - } + this.deletedStates[sourceLayer] = this.deletedStates[sourceLayer] || {}; - this.data[key].push(dataWrapper); - this.order.push(key); + if (key && featureId !== undefined) { + if (this.deletedStates[sourceLayer][feature] !== null) { + this.deletedStates[sourceLayer][feature] = this.deletedStates[sourceLayer][feature] || {}; + this.deletedStates[sourceLayer][feature][key] = null; + } + } else if (featureId !== undefined) { + const updateInQueue = this.stateChanges[sourceLayer] && this.stateChanges[sourceLayer][feature]; + if (updateInQueue) { + this.deletedStates[sourceLayer][feature] = {}; + for (key in this.stateChanges[sourceLayer][feature]) this.deletedStates[sourceLayer][feature][key] = null; - if (this.order.length > this.max) { - const removedData = this._getAndRemoveByKey(this.order[0]); - if (removedData) this.onRemove(removedData); + } else { + this.deletedStates[sourceLayer][feature] = null; + } + } else { + this.deletedStates[sourceLayer] = null; } - - return this; - } - - /** - * Determine whether the value attached to `key` is present - * - * @param {OverscaledTileID} tileID the key to be looked-up - * @returns {boolean} whether the cache has this value - * @private - */ - has(tileID ) { - return tileID.wrapped().key in this.data; } - /** - * Get the value attached to a specific key and remove data from cache. - * If the key is not found, returns `null` - * - * @param {OverscaledTileID} tileID the key to look up - * @returns {*} the data, or null if it isn't found - * @private - */ - getAndRemove(tileID ) { - if (!this.has(tileID)) { return null; } - return this._getAndRemoveByKey(tileID.wrapped().key); - } + getState(sourceLayer , featureId ) { + const feature = String(featureId); + const base = this.state[sourceLayer] || {}; + const changes = this.stateChanges[sourceLayer] || {}; - /* - * Get and remove the value with the specified key. - */ - _getAndRemoveByKey(key ) { - const data = this.data[key].shift(); - if (data.timeout) clearTimeout(data.timeout); + const reconciledState = extend$1({}, base[feature], changes[feature]); - if (this.data[key].length === 0) { - delete this.data[key]; + //return empty object if the whole source layer is awaiting deletion + if (this.deletedStates[sourceLayer] === null) return {}; + else if (this.deletedStates[sourceLayer]) { + const featureDeletions = this.deletedStates[sourceLayer][featureId]; + if (featureDeletions === null) return {}; + for (const prop in featureDeletions) delete reconciledState[prop]; } - this.order.splice(this.order.indexOf(key), 1); - - return data.value; - } - - /* - * Get the value with the specified (wrapped tile) key. - */ - getByKey(key ) { - const data = this.data[key]; - return data ? data[0].value : null; + return reconciledState; } - /** - * Get the value attached to a specific key without removing data - * from the cache. If the key is not found, returns `null` - * - * @param {OverscaledTileID} tileID the key to look up - * @returns {*} the data, or null if it isn't found - * @private - */ - get(tileID ) { - if (!this.has(tileID)) { return null; } - - const data = this.data[tileID.wrapped().key][0]; - return data.value; + initializeTileState(tile , painter ) { + tile.setFeatureState(this.state, painter); } - /** - * Remove a key/value combination from the cache. - * - * @param {OverscaledTileID} tileID the key for the pair to delete - * @param {Tile} value If a value is provided, remove that exact version of the value. - * @returns {TileCache} this cache - * @private - */ - remove(tileID , value ) { - if (!this.has(tileID)) { return this; } - const key = tileID.wrapped().key; + coalesceChanges(tiles , painter ) { + //track changes with full state objects, but only for features that got modified + const featuresChanged = {}; - const dataIndex = value === undefined ? 0 : this.data[key].indexOf(value); - const data = this.data[key][dataIndex]; - this.data[key].splice(dataIndex, 1); - if (data.timeout) clearTimeout(data.timeout); - if (this.data[key].length === 0) { - delete this.data[key]; + for (const sourceLayer in this.stateChanges) { + this.state[sourceLayer] = this.state[sourceLayer] || {}; + const layerStates = {}; + for (const feature in this.stateChanges[sourceLayer]) { + if (!this.state[sourceLayer][feature]) this.state[sourceLayer][feature] = {}; + extend$1(this.state[sourceLayer][feature], this.stateChanges[sourceLayer][feature]); + layerStates[feature] = this.state[sourceLayer][feature]; + } + featuresChanged[sourceLayer] = layerStates; } - this.onRemove(data.value); - this.order.splice(this.order.indexOf(key), 1); - return this; - } + for (const sourceLayer in this.deletedStates) { + this.state[sourceLayer] = this.state[sourceLayer] || {}; + const layerStates = {}; - /** - * Change the max size of the cache. - * - * @param {number} max the max size of the cache - * @returns {TileCache} this cache - * @private - */ - setMaxSize(max ) { - this.max = max; + if (this.deletedStates[sourceLayer] === null) { + for (const ft in this.state[sourceLayer]) { + layerStates[ft] = {}; + this.state[sourceLayer][ft] = {}; + } + } else { + for (const feature in this.deletedStates[sourceLayer]) { + const deleteWholeFeatureState = this.deletedStates[sourceLayer][feature] === null; + if (deleteWholeFeatureState) this.state[sourceLayer][feature] = {}; + else { + for (const key of Object.keys(this.deletedStates[sourceLayer][feature])) { + delete this.state[sourceLayer][feature][key]; + } + } + layerStates[feature] = this.state[sourceLayer][feature]; + } + } - while (this.order.length > this.max) { - const removedData = this._getAndRemoveByKey(this.order[0]); - if (removedData) this.onRemove(removedData); + featuresChanged[sourceLayer] = featuresChanged[sourceLayer] || {}; + extend$1(featuresChanged[sourceLayer], layerStates); } - return this; - } + this.stateChanges = {}; + this.deletedStates = {}; - /** - * Remove entries that do not pass a filter function. Used for removing - * stale tiles from the cache. - * - * @private - * @param {function} filterFn Determines whether the tile is filtered. If the supplied function returns false, the tile will be filtered out. - */ - filter(filterFn ) { - const removed = []; - for (const key in this.data) { - for (const entry of this.data[key]) { - if (!filterFn(entry.value)) { - removed.push(entry); - } - } - } - for (const r of removed) { - this.remove(r.value.tileID, r); + if (Object.keys(featuresChanged).length === 0) return; + + for (const id in tiles) { + const tile = tiles[id]; + tile.setFeatureState(featuresChanged, painter); } } } // - - - - - - - + -/** - * `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 - */ -class SourceCache extends Evented { - - +class MipLevel { - - - - - - - - - - - - - - - - - - - + - - + constructor(size_ ) { + this.size = size_; + this.minimums = []; + this.maximums = []; + this.leaves = []; + } - constructor(id , source , onlySymbols ) { - super(); - this.id = id; - this._onlySymbols = onlySymbols; + getElevation(x , y ) { + const idx = this.toIdx(x, y); + return { + min: this.minimums[idx], + max: this.maximums[idx] + }; + } - source.on('data', (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 (in other words, GeoJSON has been tiled on the worker and is ready) - if (e.dataType === 'source' && e.sourceDataType === 'metadata') this._sourceLoaded = true; + isLeaf(x , y ) { + return this.leaves[this.toIdx(x, y)]; + } - // for sources with mutable data, this event fires when the underlying data - // to a source is changed (for example, using [GeoJSONSource#setData](https://docs.mapbox.com/mapbox-gl-js/api/sources/#geojsonsource#setdata) or [ImageSource#setCoordinates](https://docs.mapbox.com/mapbox-gl-js/api/sources/#imagesource#setcoordinates)) - if (this._sourceLoaded && !this._paused && e.dataType === "source" && e.sourceDataType === 'content') { - this.reload(); - if (this.transform) { - this.update(this.transform); - } - } - }); + toIdx(x , y ) { + return y * this.size + x; + } +} - source.on('error', () => { - this._sourceErrored = true; - }); +function aabbRayIntersect(min , max , pos , dir ) { + let tMin = 0; + let tMax = Number.MAX_VALUE; - this._source = source; - this._tiles = {}; - this._cache = new TileCache(0, this._unloadTile.bind(this)); - this._timers = {}; - this._cacheTimers = {}; - this._minTileCacheSize = null; - this._maxTileCacheSize = null; - this._loadedParentTiles = {}; + const epsilon = 1e-15; - this._coveredTiles = {}; - this._state = new SourceFeatureState(); + for (let i = 0; i < 3; i++) { + if (Math.abs(dir[i]) < epsilon) { + // Parallel ray + if (pos[i] < min[i] || pos[i] > max[i]) + return null; + } else { + const ood = 1.0 / dir[i]; + let t1 = (min[i] - pos[i]) * ood; + let t2 = (max[i] - pos[i]) * ood; + if (t1 > t2) { + const temp = t1; + t1 = t2; + t2 = temp; + } + if (t1 > tMin) + tMin = t1; + if (t2 < tMax) + tMax = t2; + if (tMin > tMax) + return null; + } } - onAdd(map ) { - this.map = map; - this._minTileCacheSize = map ? map._minTileCacheSize : null; - this._maxTileCacheSize = map ? map._maxTileCacheSize : null; - } + return tMin; +} - /** - * Return true if no tile data is pending, tiles will not change unless - * an additional API call is received. - * @private - */ - loaded() { - if (this._sourceErrored) { return true; } - if (!this._sourceLoaded) { return false; } - if (!this._source.loaded()) { return false; } - for (const t in this._tiles) { - const tile = this._tiles[t]; - if (tile.state !== 'loaded' && tile.state !== 'errored') - return false; - } - return true; - } +function triangleRayIntersect(ax, ay, az, bx, by, bz, cx, cy, cz, pos , dir ) { + // Compute barycentric coordinates u and v to find the intersection + const abX = bx - ax; + const abY = by - ay; + const abZ = bz - az; - getSource() { - return this._source; - } + const acX = cx - ax; + const acY = cy - ay; + const acZ = cz - az; - pause() { - this._paused = true; - } + // pvec = cross(dir, a), det = dot(ab, pvec) + const pvecX = dir[1] * acZ - dir[2] * acY; + const pvecY = dir[2] * acX - dir[0] * acZ; + const pvecZ = dir[0] * acY - dir[1] * acX; + const det = abX * pvecX + abY * pvecY + abZ * pvecZ; - resume() { - if (!this._paused) return; - const shouldReload = this._shouldReloadOnResume; - this._paused = false; - this._shouldReloadOnResume = false; - if (shouldReload) this.reload(); - if (this.transform) this.update(this.transform); - } + if (Math.abs(det) < 1e-15) + return null; - _loadTile(tile , callback ) { - tile.isSymbolTile = this._onlySymbols; - return this._source.loadTile(tile, callback); - } + const invDet = 1.0 / det; + const tvecX = pos[0] - ax; + const tvecY = pos[1] - ay; + const tvecZ = pos[2] - az; + const u = (tvecX * pvecX + tvecY * pvecY + tvecZ * pvecZ) * invDet; - _unloadTile(tile ) { - if (this._source.unloadTile) - return this._source.unloadTile(tile, () => {}); - } + if (u < 0.0 || u > 1.0) + return null; - _abortTile(tile ) { - if (this._source.abortTile) - return this._source.abortTile(tile, () => {}); - } + // qvec = cross(tvec, ab) + const qvecX = tvecY * abZ - tvecZ * abY; + const qvecY = tvecZ * abX - tvecX * abZ; + const qvecZ = tvecX * abY - tvecY * abX; + const v = (dir[0] * qvecX + dir[1] * qvecY + dir[2] * qvecZ) * invDet; - serialize() { - return this._source.serialize(); - } + if (v < 0.0 || u + v > 1.0) + return null; - prepare(context ) { - if (this._source.prepare) { - this._source.prepare(); - } + return (acX * qvecX + acY * qvecY + acZ * qvecZ) * invDet; +} - this._state.coalesceChanges(this._tiles, this.map ? this.map.painter : null); - for (const i in this._tiles) { - const tile = this._tiles[i]; - tile.upload(context); - tile.prepare(this.map.style.imageManager); - } - } +function frac(v, lo, hi) { + return (v - lo) / (hi - lo); +} - /** - * Return all tile ids ordered with z-order, and cast to numbers - * @private - */ - getIds() { - return values((this._tiles )).map((tile ) => tile.tileID).sort(compareTileId).map(id => id.key); - } +function decodeBounds(x, y, depth, boundsMinx, boundsMiny, boundsMaxx, boundsMaxy, outMin, outMax) { + const scale = 1 << depth; + const rangex = boundsMaxx - boundsMinx; + const rangey = boundsMaxy - boundsMiny; - getRenderableIds(symbolLayer ) { - const renderables = []; - for (const id in this._tiles) { - if (this._isIdRenderable(+id, symbolLayer)) renderables.push(this._tiles[id]); - } - if (symbolLayer) { - return renderables.sort((a_ , b_ ) => { - const a = a_.tileID; - const b = b_.tileID; - const rotatedA = (new pointGeometry(a.canonical.x, a.canonical.y))._rotate(this.transform.angle); - const rotatedB = (new pointGeometry(b.canonical.x, b.canonical.y))._rotate(this.transform.angle); - return a.overscaledZ - b.overscaledZ || rotatedB.y - rotatedA.y || rotatedB.x - rotatedA.x; - }).map(tile => tile.tileID.key); - } - return renderables.map(tile => tile.tileID).sort(compareTileId).map(id => id.key); - } + const minX = (x + 0) / scale * rangex + boundsMinx; + const maxX = (x + 1) / scale * rangex + boundsMinx; + const minY = (y + 0) / scale * rangey + boundsMiny; + const maxY = (y + 1) / scale * rangey + boundsMiny; - hasRenderableParent(tileID ) { - const parentTile = this.findLoadedParent(tileID, 0); - if (parentTile) { - return this._isIdRenderable(parentTile.tileID.key); - } - return false; - } + outMin[0] = minX; + outMin[1] = minY; + outMax[0] = maxX; + outMax[1] = maxY; +} - _isIdRenderable(id , symbolLayer ) { - return this._tiles[id] && this._tiles[id].hasData() && - !this._coveredTiles[id] && (symbolLayer || !this._tiles[id].holdingForFade()); - } +// A small padding value is used with bounding boxes to extend the bottom below sea level +const aabbSkirtPadding = 100; - reload() { - if (this._paused) { - this._shouldReloadOnResume = true; +// A sparse min max quad tree for performing accelerated queries against dem elevation data. +// Each tree node stores the minimum and maximum elevation of its children nodes and a flag whether the node is a leaf. +// Node data is stored in non-interleaved arrays where the root is at index 0. +class DemMinMaxQuadTree { + + + + + + + + + constructor(dem_ ) { + this.maximums = []; + this.minimums = []; + this.leaves = []; + this.childOffsets = []; + this.nodeCount = 0; + this.dem = dem_; + + // Precompute the order of 4 sibling nodes in the memory. Top-left, top-right, bottom-left, bottom-right + this._siblingOffset = [ + [0, 0], + [1, 0], + [0, 1], + [1, 1] + ]; + + if (!this.dem) return; - } - this._cache.reset(); + const mips = buildDemMipmap(this.dem); + const maxLvl = mips.length - 1; - for (const i in this._tiles) { - if (this._tiles[i].state !== "errored") this._reloadTile(+i, 'reloading'); - } + // Create the root node + const rootMip = mips[maxLvl]; + const min = rootMip.minimums; + const max = rootMip.maximums; + const leaves = rootMip.leaves; + this._addNode(min[0], max[0], leaves[0]); + + // Construct the rest of the tree recursively + this._construct(mips, 0, 0, maxLvl, 0); } - _reloadTile(id , state ) { - const tile = this._tiles[id]; + // Performs raycast against the tree root only. Min and max coordinates defines the size of the root node + raycastRoot(minx , miny , maxx , maxy , p , d , exaggeration = 1) { + const min = [minx, miny, -aabbSkirtPadding]; + const max = [maxx, maxy, this.maximums[0] * exaggeration]; + return aabbRayIntersect(min, max, p, d); + } - // 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; + raycast(rootMinx , rootMiny , rootMaxx , rootMaxy , p , d , exaggeration = 1) { + if (!this.nodeCount) + return null; - // 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; - } + const t = this.raycastRoot(rootMinx, rootMiny, rootMaxx, rootMaxy, p, d, exaggeration); + if (t == null) + return null; - this._loadTile(tile, this._tileLoaded.bind(this, tile, id, state)); - } + const tHits = []; + const sortedHits = []; + const boundsMin = []; + const boundsMax = []; - _tileLoaded(tile , id , previousState , err ) { - if (err) { - tile.state = 'errored'; - if ((err ).status !== 404) this._source.fire(new ErrorEvent(err, {tile})); - else { - // continue to try loading parent/children tiles if a tile doesn't exist (404) - const updateForTerrain = this._source.type === 'raster-dem' && this.usedForTerrain; - if (updateForTerrain && this.map.painter.terrain) { - const terrain = this.map.painter.terrain; - this.update(this.transform, terrain.getScaledDemTileSize(), true); - terrain.resetTileLookupCache(this.id); + const stack = [{ + idx: 0, + t, + nodex: 0, + nodey: 0, + depth: 0 + }]; + + // Traverse the tree until something is hit or the ray escapes + while (stack.length > 0) { + const {idx, t, nodex, nodey, depth} = stack.pop(); + + if (this.leaves[idx]) { + // Create 2 triangles to approximate the surface plane for more precise tests + decodeBounds(nodex, nodey, depth, rootMinx, rootMiny, rootMaxx, rootMaxy, boundsMin, boundsMax); + + const scale = 1 << depth; + const minxUv = (nodex + 0) / scale; + const maxxUv = (nodex + 1) / scale; + const minyUv = (nodey + 0) / scale; + const maxyUv = (nodey + 1) / scale; + + // 4 corner points A, B, C and D defines the (quad) area covered by this node + const az = sampleElevation(minxUv, minyUv, this.dem) * exaggeration; + const bz = sampleElevation(maxxUv, minyUv, this.dem) * exaggeration; + const cz = sampleElevation(maxxUv, maxyUv, this.dem) * exaggeration; + const dz = sampleElevation(minxUv, maxyUv, this.dem) * exaggeration; + + const t0 = triangleRayIntersect( + boundsMin[0], boundsMin[1], az, // A + boundsMax[0], boundsMin[1], bz, // B + boundsMax[0], boundsMax[1], cz, // C + p, d); + + const t1 = triangleRayIntersect( + boundsMax[0], boundsMax[1], cz, + boundsMin[0], boundsMax[1], dz, + boundsMin[0], boundsMin[1], az, + p, d); + + const tMin = Math.min( + t0 !== null ? t0 : Number.MAX_VALUE, + t1 !== null ? t1 : Number.MAX_VALUE); + + // The ray might go below the two surface triangles but hit one of the sides. + // This covers the case of skirt geometry between two dem tiles of different zoom level + if (tMin === Number.MAX_VALUE) { + const hitPos = scaleAndAdd$2([], p, d, t); + const fracx = frac(hitPos[0], boundsMin[0], boundsMax[0]); + const fracy = frac(hitPos[1], boundsMin[1], boundsMax[1]); + + if (bilinearLerp(az, bz, dz, cz, fracx, fracy) >= hitPos[2]) + return t; } else { - this.update(this.transform); + return tMin; } + + continue; } - return; - } - tile.timeAdded = exported.now(); - if (previousState === 'expired') tile.refreshedUponExpiration = true; - this._setTileReloadTimer(id, tile); - if (this._source.type === 'raster-dem' && tile.dem) this._backfillDEM(tile); - this._state.initializeTileState(tile, this.map ? this.map.painter : null); + // Perform intersection tests agains each of the 4 child nodes and store results from closest to furthest. + let hitCount = 0; - this._source.fire(new Event('data', {dataType: 'source', tile, coord: tile.tileID, 'sourceCacheId': this.id})); - } + for (let i = 0; i < this._siblingOffset.length; i++) { - /** - * For raster terrain source, backfill DEM to eliminate visible tile boundaries - * @private - */ - _backfillDEM(tile ) { - const renderables = this.getRenderableIds(); - for (let i = 0; i < renderables.length; i++) { - const borderId = renderables[i]; - if (tile.neighboringTiles && tile.neighboringTiles[borderId]) { - const borderTile = this.getTileByID(borderId); - fillBorder(tile, borderTile); - fillBorder(borderTile, tile); - } - } + const childNodeX = (nodex << 1) + this._siblingOffset[i][0]; + const childNodeY = (nodey << 1) + this._siblingOffset[i][1]; - function fillBorder(tile, borderTile) { - if (!tile.dem || tile.dem.borderReady) return; - tile.needsHillshadePrepare = true; - tile.needsDEMTextureUpload = true; - let dx = borderTile.tileID.canonical.x - tile.tileID.canonical.x; - const dy = borderTile.tileID.canonical.y - tile.tileID.canonical.y; - const dim = Math.pow(2, tile.tileID.canonical.z); - const borderId = borderTile.tileID.key; - if (dx === 0 && dy === 0) return; + // Decode node aabb from the morton code + decodeBounds(childNodeX, childNodeY, depth + 1, rootMinx, rootMiny, rootMaxx, rootMaxy, boundsMin, boundsMax); - 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; + boundsMin[2] = -aabbSkirtPadding; + boundsMax[2] = this.maximums[this.childOffsets[idx] + i] * exaggeration; + + const result = aabbRayIntersect(boundsMin, boundsMax, p, d); + if (result != null) { + // Build the result list from furthest to closest hit. + // The order will be inversed when building the stack + const tHit = result; + tHits[i] = tHit; + + let added = false; + for (let j = 0; j < hitCount && !added; j++) { + if (tHit >= tHits[sortedHits[j]]) { + sortedHits.splice(j, 0, i); + added = true; + } + } + if (!added) + sortedHits[hitCount] = i; + hitCount++; } } - if (!borderTile.dem || !tile.dem) return; - tile.dem.backfillBorder(borderTile.dem, dx, dy); - if (tile.neighboringTiles && tile.neighboringTiles[borderId]) - tile.neighboringTiles[borderId].backfilled = true; + + // Continue recursion from closest to furthest + for (let i = 0; i < hitCount; i++) { + const hitIdx = sortedHits[i]; + stack.push({ + idx: this.childOffsets[idx] + hitIdx, + t: tHits[hitIdx], + nodex: (nodex << 1) + this._siblingOffset[hitIdx][0], + nodey: (nodey << 1) + this._siblingOffset[hitIdx][1], + depth: depth + 1 + }); + } } - } - /** - * Get a specific tile by TileID - * @private - */ - getTile(tileID ) { - return this.getTileByID(tileID.key); + + return null; } - /** - * Get a specific tile by id - * @private - */ - getTileByID(id ) { - return this._tiles[id]; + _addNode(min , max , leaf ) { + this.minimums.push(min); + this.maximums.push(max); + this.leaves.push(leaf); + this.childOffsets.push(0); + return this.nodeCount++; } - /** - * For a given set of tiles, retain children that are loaded and have a zoom - * between `zoom` (exclusive) and `maxCoveringZoom` (inclusive) - * @private - */ - _retainLoadedChildren( - idealTiles , - zoom , - maxCoveringZoom , - retain - ) { - for (const id in this._tiles) { - let tile = this._tiles[id]; + _construct(mips , x , y , lvl , parentIdx ) { + if (mips[lvl].isLeaf(x, y) === 1) { + return; + } - // only consider renderable tiles up to maxCoveringZoom - if (retain[id] || - !tile.hasData() || - tile.tileID.overscaledZ <= zoom || - tile.tileID.overscaledZ > maxCoveringZoom - ) continue; + // Update parent offset + if (!this.childOffsets[parentIdx]) + this.childOffsets[parentIdx] = this.nodeCount; - // loop through parents and retain the topmost loaded one if found - let topmostLoadedID = tile.tileID; - while (tile && tile.tileID.overscaledZ > zoom + 1) { - const parentID = tile.tileID.scaledTo(tile.tileID.overscaledZ - 1); + // Construct all 4 children and place them next to each other in memory + const childLvl = lvl - 1; + const childMip = mips[childLvl]; - tile = this._tiles[parentID.key]; + let leafMask = 0; + let firstNodeIdx = 0; - if (tile && tile.hasData()) { - topmostLoadedID = parentID; - } - } + for (let i = 0; i < this._siblingOffset.length; i++) { + const childX = x * 2 + this._siblingOffset[i][0]; + const childY = y * 2 + this._siblingOffset[i][1]; - // loop through ancestors of the topmost loaded child to see if there's one that needed it - let tileID = topmostLoadedID; - while (tileID.overscaledZ > zoom) { - tileID = tileID.scaledTo(tileID.overscaledZ - 1); + const elevation = childMip.getElevation(childX, childY); + const leaf = childMip.isLeaf(childX, childY); + const nodeIdx = this._addNode(elevation.min, elevation.max, leaf); - if (idealTiles[tileID.key]) { - // found a parent that needed a loaded child; retain that child - retain[topmostLoadedID.key] = topmostLoadedID; - break; - } - } + if (leaf) + leafMask |= 1 << i; + if (!firstNodeIdx) + firstNodeIdx = nodeIdx; } - } - /** - * Find a loaded parent of the given tile (up to minCoveringZoom) - * @private - */ - findLoadedParent(tileID , minCoveringZoom ) { - if (tileID.key in this._loadedParentTiles) { - const parent = this._loadedParentTiles[tileID.key]; - if (parent && parent.tileID.overscaledZ >= minCoveringZoom) { - return parent; - } else { - return null; - } - } - for (let z = tileID.overscaledZ - 1; z >= minCoveringZoom; z--) { - const parentTileID = tileID.scaledTo(z); - const tile = this._getLoadedTile(parentTileID); - if (tile) { - return tile; + // Continue construction of the tree recursively to non-leaf nodes. + for (let i = 0; i < this._siblingOffset.length; i++) { + if (!(leafMask & (1 << i))) { + this._construct(mips, x * 2 + this._siblingOffset[i][0], y * 2 + this._siblingOffset[i][1], childLvl, firstNodeIdx + i); } } } +} - _getLoadedTile(tileID ) { - const tile = this._tiles[tileID.key]; - if (tile && tile.hasData()) { - return tile; - } - // TileCache ignores wrap in lookup. - const cachedTile = this._cache.getByKey(this._source.reparseOverscaled ? tileID.wrapped().key : tileID.canonical.key); - return cachedTile; - } +function bilinearLerp(p00 , p10 , p01 , p11 , x , y ) { + return number( + number(p00, p01, y), + number(p10, p11, y), + x); +} - /** - * 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. - * @private - */ - updateCacheSize(transform , tileSize ) { - tileSize = tileSize || this._source.tileSize; - const widthInTiles = Math.ceil(transform.width / tileSize) + 1; - const heightInTiles = Math.ceil(transform.height / tileSize) + 1; - const approxTilesInView = widthInTiles * heightInTiles; - const commonZoomRange = 5; +// Sample elevation in normalized uv-space ([0, 0] is the top left) +// This function does not account for exaggeration +function sampleElevation(fx , fy , dem ) { + // Sample position in texels + const demSize = dem.dim; + const x = clamp(fx * demSize - 0.5, 0, demSize - 1); + const y = clamp(fy * demSize - 0.5, 0, demSize - 1); - const viewDependentMaxSize = Math.floor(approxTilesInView * commonZoomRange); - const minSize = typeof this._minTileCacheSize === 'number' ? Math.max(this._minTileCacheSize, viewDependentMaxSize) : viewDependentMaxSize; - const maxSize = typeof this._maxTileCacheSize === 'number' ? Math.min(this._maxTileCacheSize, minSize) : minSize; + // Compute 4 corner points for bilinear interpolation + const ixMin = Math.floor(x); + const iyMin = Math.floor(y); + const ixMax = Math.min(ixMin + 1, demSize - 1); + const iyMax = Math.min(iyMin + 1, demSize - 1); - this._cache.setMaxSize(maxSize); - } + const e00 = dem.get(ixMin, iyMin); + const e10 = dem.get(ixMax, iyMin); + const e01 = dem.get(ixMin, iyMax); + const e11 = dem.get(ixMax, iyMax); - handleWrapJump(lng ) { - // On top of the regular z/x/y values, TileIDs have a `wrap` value that specify - // which copy of the world the tile belongs to. For example, at `lng: 10` you - // might render z/x/y/0 while at `lng: 370` you would render z/x/y/1. - // - // When lng values get wrapped (going from `lng: 370` to `long: 10`) you expect - // to see the same thing on the screen (370 degrees and 10 degrees is the same - // place in the world) but all the TileIDs will have different wrap values. - // - // In order to make this transition seamless, we calculate the rounded difference of - // "worlds" between the last frame and the current frame. If the map panned by - // a world, then we can assign all the tiles new TileIDs with updated wrap values. - // For example, assign z/x/y/1 a new id: z/x/y/0. It is the same tile, just rendered - // in a different position. - // - // This enables us to reuse the tiles at more ideal locations and prevent flickering. - const prevLng = this._prevLng === undefined ? lng : this._prevLng; - const lngDifference = lng - prevLng; - const worldDifference = lngDifference / 360; - const wrapDelta = Math.round(worldDifference); - this._prevLng = lng; + return bilinearLerp(e00, e10, e01, e11, x - ixMin, y - iyMin); +} - if (wrapDelta) { - const tiles = {}; - for (const key in this._tiles) { - const tile = this._tiles[key]; - tile.tileID = tile.tileID.unwrapTo(tile.tileID.wrap + wrapDelta); - tiles[tile.tileID.key] = tile; - } - this._tiles = tiles; +function buildDemMipmap(dem ) { + const demSize = dem.dim; - // Reset tile reload timers - for (const id in this._timers) { - clearTimeout(this._timers[id]); - delete this._timers[id]; - } - for (const id in this._tiles) { - const tile = this._tiles[id]; - this._setTileReloadTimer(+id, tile); - } - } - } + const elevationDiffThreshold = 5; + const texelSizeOfMip0 = 8; + const levelCount = Math.ceil(Math.log2(demSize / texelSizeOfMip0)); + const mips = []; - /** - * Removes tiles that are outside the viewport and adds new tiles that - * are inside the viewport. - * @private - * @param {boolean} updateForTerrain Signals to update tiles even if the - * source is not used (this.used) by layers: it is used for terrain. - * @param {tileSize} tileSize If needed to get lower resolution ideal cover, - * override source.tileSize used in tile cover calculation. - */ - update(transform , tileSize , updateForTerrain ) { - this.transform = transform; - if (!this._sourceLoaded || this._paused || this.transform.freezeTileCoverage) { return; } - assert_1(!(updateForTerrain && !this.usedForTerrain)); - if (this.usedForTerrain && !updateForTerrain) { - // If source is used for both terrain and hillshade, don't update it twice. - return; - } + let blockCount = Math.ceil(Math.pow(2, levelCount)); + const blockSize = 1 / blockCount; - this.updateCacheSize(transform, tileSize); - if (this.transform.projection.name !== 'globe') { - this.handleWrapJump(this.transform.center.lng); - } + const blockSamples = (x, y, size, exclusive, outBounds) => { + const padding = exclusive ? 1 : 0; + const minx = x * size; + const maxx = (x + 1) * size - padding; + const miny = y * size; + const maxy = (y + 1) * size - padding; - // 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 = {}; + outBounds[0] = minx; + outBounds[1] = miny; + outBounds[2] = maxx; + outBounds[3] = maxy; + }; - let idealTileIDs; - if (!this.used && !this.usedForTerrain) { - idealTileIDs = []; - } else if (this._source.tileID) { - idealTileIDs = transform.getVisibleUnwrappedCoordinates(this._source.tileID) - .map((unwrapped) => new OverscaledTileID(unwrapped.canonical.z, unwrapped.wrap, unwrapped.canonical.z, unwrapped.canonical.x, unwrapped.canonical.y)); - } else { - idealTileIDs = transform.coveringTiles({ - tileSize: tileSize || this._source.tileSize, - minzoom: this._source.minzoom, - maxzoom: this._source.maxzoom, - roundZoom: this._source.roundZoom && !updateForTerrain, - reparseOverscaled: this._source.reparseOverscaled, - isTerrainDEM: this.usedForTerrain - }); + // The first mip (0) is built by sampling 4 corner points of each 8x8 texel block + let mip = new MipLevel(blockCount); + const blockBounds = []; - if (this._source.hasTile) { - idealTileIDs = idealTileIDs.filter((coord) => (this._source.hasTile )(coord)); - } - } + for (let idx = 0; idx < blockCount * blockCount; idx++) { + const y = Math.floor(idx / blockCount); + const x = idx % blockCount; - // 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. - const retain = this._updateRetainedTiles(idealTileIDs); + blockSamples(x, y, blockSize, false, blockBounds); - if (isRasterType(this._source.type) && idealTileIDs.length !== 0) { - const parentsForFading = {}; - const fadingTiles = {}; - const ids = Object.keys(retain); - for (const id of ids) { - const tileID = retain[id]; - assert_1(tileID.key === +id); + const e0 = sampleElevation(blockBounds[0], blockBounds[1], dem); // minx, miny + const e1 = sampleElevation(blockBounds[2], blockBounds[1], dem); // maxx, miny + const e2 = sampleElevation(blockBounds[2], blockBounds[3], dem); // maxx, maxy + const e3 = sampleElevation(blockBounds[0], blockBounds[3], dem); // minx, maxy - const tile = this._tiles[id]; - if (!tile || tile.fadeEndTime && tile.fadeEndTime <= exported.now()) continue; + mip.minimums.push(Math.min(e0, e1, e2, e3)); + mip.maximums.push(Math.max(e0, e1, e2, e3)); + mip.leaves.push(1); + } - // if the tile is loaded but still fading in, find parents to cross-fade with it - const parentTile = this.findLoadedParent(tileID, Math.max(tileID.overscaledZ - SourceCache.maxOverzooming, this._source.minzoom)); - if (parentTile) { - this._addTile(parentTile.tileID); - parentsForFading[parentTile.tileID.key] = parentTile.tileID; - } + mips.push(mip); - fadingTiles[id] = tileID; - } + // Construct the rest of the mip levels from bottom to up + for (blockCount /= 2; blockCount >= 1; blockCount /= 2) { + const prevMip = mips[mips.length - 1]; - // for children tiles with parent tiles still fading in, - // retain the children so the parent can fade on top - const minZoom = idealTileIDs[idealTileIDs.length - 1].overscaledZ; - for (const id in this._tiles) { - const childTile = this._tiles[id]; - if (retain[id] || !childTile.hasData()) { - continue; - } + mip = new MipLevel(blockCount); - let parentID = childTile.tileID; - while (parentID.overscaledZ > minZoom) { - parentID = parentID.scaledTo(parentID.overscaledZ - 1); - const tile = this._tiles[parentID.key]; - if (tile && tile.hasData() && fadingTiles[parentID.key]) { - retain[id] = childTile.tileID; - break; - } - } - } + for (let idx = 0; idx < blockCount * blockCount; idx++) { + const y = Math.floor(idx / blockCount); + const x = idx % blockCount; - for (const id in parentsForFading) { - if (!retain[id]) { - // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own. - this._coveredTiles[id] = true; - retain[id] = parentsForFading[id]; - } - } - } + // Sample elevation of all 4 children mip texels. 4 leaf nodes can be concatenated into a single + // leaf if the total elevation difference is below the threshold value + blockSamples(x, y, 2, true, blockBounds); - for (const retainedId in retain) { - // Make sure retained tiles always clear any existing fade holds - // so that if they're removed again their fade timer starts fresh. - this._tiles[retainedId].clearFadeHold(); - } + const e0 = prevMip.getElevation(blockBounds[0], blockBounds[1]); + const e1 = prevMip.getElevation(blockBounds[2], blockBounds[1]); + const e2 = prevMip.getElevation(blockBounds[2], blockBounds[3]); + const e3 = prevMip.getElevation(blockBounds[0], blockBounds[3]); - // Remove the tiles we don't need anymore. - const remove = keysDifference((this._tiles ), (retain )); - for (const tileID of remove) { - const tile = this._tiles[tileID]; - if (tile.hasSymbolBuckets && !tile.holdingForFade()) { - tile.setHoldDuration(this.map._fadeDuration); - } else if (!tile.hasSymbolBuckets || tile.symbolFadeFinished()) { - this._removeTile(+tileID); - } - } + const l0 = prevMip.isLeaf(blockBounds[0], blockBounds[1]); + const l1 = prevMip.isLeaf(blockBounds[2], blockBounds[1]); + const l2 = prevMip.isLeaf(blockBounds[2], blockBounds[3]); + const l3 = prevMip.isLeaf(blockBounds[0], blockBounds[3]); - // Construct a cache of loaded parents - this._updateLoadedParentTileCache(); + const minElevation = Math.min(e0.min, e1.min, e2.min, e3.min); + const maxElevation = Math.max(e0.max, e1.max, e2.max, e3.max); + const canConcatenate = l0 && l1 && l2 && l3; - if (this._onlySymbols && this._source.afterUpdate) { - this._source.afterUpdate(); - } - } + mip.maximums.push(maxElevation); + mip.minimums.push(minElevation); - releaseSymbolFadeTiles() { - for (const id in this._tiles) { - if (this._tiles[id].holdingForFade()) { - this._removeTile(+id); + if (maxElevation - minElevation <= elevationDiffThreshold && canConcatenate) { + // All samples have uniform elevation. Mark this as a leaf + mip.leaves.push(1); + } else { + mip.leaves.push(0); } } + + mips.push(mip); } - _updateRetainedTiles(idealTileIDs ) { - const retain = {}; - if (idealTileIDs.length === 0) { return retain; } + return mips; +} - const checked = {}; - const minZoom = idealTileIDs.reduce((min, id) => Math.min(min, id.overscaledZ), Infinity); - const maxZoom = idealTileIDs[0].overscaledZ; - assert_1(minZoom <= maxZoom); - const minCoveringZoom = Math.max(maxZoom - SourceCache.maxOverzooming, this._source.minzoom); - const maxCoveringZoom = Math.max(maxZoom + SourceCache.maxUnderzooming, this._source.minzoom); +// - const missingTiles = {}; - for (const tileID of idealTileIDs) { - const tile = this._addTile(tileID); +// 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 appropriate decoding formula, but we store the +// elevation data 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. - // retain the tile even if it's not loaded because it's an ideal tile. - retain[tileID.key] = tileID; +// 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. - if (tile.hasData()) continue; + - if (minZoom < this._source.maxzoom) { - // save missing tiles that potentially have loaded children - missingTiles[tileID.key] = tileID; - } +const unpackVectors = { + mapbox: [6553.6, 25.6, 0.1, 10000.0], + terrarium: [256.0, 1.0, 1.0 / 256.0, 32768.0] +}; + +class DEMData { + + + + + + + + get tree() { + if (!this._tree) this._buildQuadTree(); + return this._tree; + } + + // RGBAImage data has uniform 1px padding on all sides: square tile edge size defines stride + // and dim is calculated as stride - 2. + constructor(uid , data , encoding , borderReady = false, buildQuadTree = false) { + this.uid = uid; + if (data.height !== data.width) throw new RangeError('DEM tiles must be square'); + if (encoding && encoding !== "mapbox" && encoding !== "terrarium") return warnOnce( + `"${encoding}" is not a valid encoding type. Valid types include "mapbox" and "terrarium".` + ); + this.stride = data.height; + const dim = this.dim = data.height - 2; + const values = new Uint32Array(data.data.buffer); + this.pixels = new Uint8Array(data.data.buffer); + this.encoding = encoding || 'mapbox'; + this.borderReady = borderReady; + + if (borderReady) return; + + // 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 (let x = 0; x < dim; x++) { + // left vertical border + values[this._idx(-1, x)] = values[this._idx(0, x)]; + // right vertical border + values[this._idx(dim, x)] = values[this._idx(dim - 1, x)]; + // left horizontal border + values[this._idx(x, -1)] = values[this._idx(x, 0)]; + // right horizontal border + values[this._idx(x, dim)] = values[this._idx(x, dim - 1)]; } + // corners + values[this._idx(-1, -1)] = values[this._idx(0, 0)]; + values[this._idx(dim, -1)] = values[this._idx(dim - 1, 0)]; + values[this._idx(-1, dim)] = values[this._idx(0, dim - 1)]; + values[this._idx(dim, dim)] = values[this._idx(dim - 1, dim - 1)]; + if (buildQuadTree) this._buildQuadTree(); + } - // retain any loaded children of ideal tiles up to maxCoveringZoom - this._retainLoadedChildren(missingTiles, minZoom, maxCoveringZoom, retain); + _buildQuadTree() { + assert_1(!this._tree); + // Construct the implicit sparse quad tree by traversing mips from top to down + this._tree = new DemMinMaxQuadTree(this); + } - for (const tileID of idealTileIDs) { - let tile = this._tiles[tileID.key]; + get(x , y , clampToEdge = false) { + if (clampToEdge) { + x = clamp(x, -1, this.dim); + y = clamp(y, -1, this.dim); + } + const index = this._idx(x, y) * 4; + const unpack = this.encoding === "terrarium" ? this._unpackTerrarium : this._unpackMapbox; + return unpack(this.pixels[index], this.pixels[index + 1], this.pixels[index + 2]); + } - if (tile.hasData()) continue; + static getUnpackVector(encoding ) { + return unpackVectors[encoding]; + } - // The tile we require is not yet loaded or does not exist; - // Attempt to find children that fully cover it. + get unpackVector() { + return unpackVectors[this.encoding]; + } - if (tileID.canonical.z >= this._source.maxzoom) { - // We're looking for an overzoomed child tile. - const childCoord = tileID.children(this._source.maxzoom)[0]; - const childTile = this.getTile(childCoord); - if (!!childTile && childTile.hasData()) { - retain[childCoord.key] = childCoord; - continue; // tile is covered by overzoomed child - } - } else { - // Check if all 4 immediate children are loaded (in other words, the missing ideal tile is covered) - const children = tileID.children(this._source.maxzoom); + _idx(x , y ) { + if (x < -1 || x >= this.dim + 1 || y < -1 || y >= this.dim + 1) throw new RangeError('out of range source coordinates for DEM data'); + return (y + 1) * this.stride + (x + 1); + } + + _unpackMapbox(r , g , b ) { + // unpacking formula for mapbox.terrain-rgb: + // https://www.mapbox.com/help/access-elevation-data/#mapbox-terrain-rgb + return ((r * 256 * 256 + g * 256.0 + b) / 10.0 - 10000.0); + } + + _unpackTerrarium(r , g , b ) { + // unpacking formula for mapzen terrarium: + // https://aws.amazon.com/public-datasets/terrain/ + return ((r * 256 + g + b / 256) - 32768.0); + } + + static pack(altitude , encoding ) { + const color = [0, 0, 0, 0]; + const vector = DEMData.getUnpackVector(encoding); + let v = Math.floor((altitude + vector[3]) / vector[2]); + color[2] = v % 256; + v = Math.floor(v / 256); + color[1] = v % 256; + v = Math.floor(v / 256); + color[0] = v; + return color; + } - if (retain[children[0].key] && - retain[children[1].key] && - retain[children[2].key] && - retain[children[3].key]) continue; // tile is covered by children - } + getPixels() { + return new RGBAImage({width: this.stride, height: this.stride}, this.pixels); + } - // We couldn't find child tiles that entirely cover the ideal tile; look for parents now. + backfillBorder(borderTile , dx , dy ) { + if (this.dim !== borderTile.dim) throw new Error('dem dimension mismatch'); - // As we ascend up the tile pyramid of the ideal tile, we check whether the parent - // tile has been previously requested (and errored because we only loop over tiles with no data) - // in order to determine if we need to request its parent. - let parentWasRequested = tile.wasRequested(); + let xMin = dx * this.dim, + xMax = dx * this.dim + this.dim, + yMin = dy * this.dim, + yMax = dy * this.dim + this.dim; - for (let overscaledZ = tileID.overscaledZ - 1; overscaledZ >= minCoveringZoom; --overscaledZ) { - const parentId = tileID.scaledTo(overscaledZ); + switch (dx) { + case -1: + xMin = xMax - 1; + break; + case 1: + xMax = xMin + 1; + break; + } - // Break parent tile ascent if this route has been previously checked by another child. - if (checked[parentId.key]) break; - checked[parentId.key] = true; + switch (dy) { + case -1: + yMin = yMax - 1; + break; + case 1: + yMax = yMin + 1; + break; + } - tile = this.getTile(parentId); - if (!tile && parentWasRequested) { - tile = this._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; - } + const ox = -dx * this.dim; + const oy = -dy * this.dim; + for (let y = yMin; y < yMax; y++) { + for (let x = xMin; x < xMax; x++) { + const i = 4 * this._idx(x, y); + const j = 4 * this._idx(x + ox, y + oy); + this.pixels[i + 0] = borderTile.pixels[j + 0]; + this.pixels[i + 1] = borderTile.pixels[j + 1]; + this.pixels[i + 2] = borderTile.pixels[j + 2]; + this.pixels[i + 3] = borderTile.pixels[j + 3]; } } - - return retain; } - _updateLoadedParentTileCache() { - this._loadedParentTiles = {}; - - for (const tileKey in this._tiles) { - const path = []; - let parentTile ; - let currentId = this._tiles[tileKey].tileID; - - // Find the closest loaded ancestor by traversing the tile tree towards the root and - // caching results along the way - while (currentId.overscaledZ > 0) { - - // Do we have a cached result from previous traversals? - if (currentId.key in this._loadedParentTiles) { - parentTile = this._loadedParentTiles[currentId.key]; - break; - } + onDeserialize() { + if (this._tree) this._tree.dem = this; + } +} - path.push(currentId.key); +register(DEMData, 'DEMData'); +register(DemMinMaxQuadTree, 'DemMinMaxQuadTree', {omit: ['dem']}); - // Is the parent loaded? - const parentId = currentId.scaledTo(currentId.overscaledZ - 1); - parentTile = this._getLoadedTile(parentId); - if (parentTile) { - break; - } +// + - currentId = parentId; - } +/** + * 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 + */ +class TileCache { + + + + + /** + * @param {number} max The max number of permitted values. + * @private + * @param {Function} onRemove The callback called with items when they expire. + */ + constructor(max , onRemove ) { + this.max = max; + this.onRemove = onRemove; + this.reset(); + } - // Cache the result of this traversal to all newly visited tiles - for (const key of path) { - this._loadedParentTiles[key] = parentTile; + /** + * Clear the cache. + * + * @returns {TileCache} Returns itself to allow for method chaining. + * @private + */ + reset() { + for (const key in this.data) { + for (const removedData of this.data[key]) { + if (removedData.timeout) clearTimeout(removedData.timeout); + this.onRemove(removedData.value); } } + + this.data = {}; + this.order = []; + + return this; } /** - * Add a tile, given its coordinate, to the pyramid. + * Add a key, value combination to the cache, trimming its size if this pushes + * it over max length. + * + * @param {OverscaledTileID} tileID lookup key for the item + * @param {*} data any value + * + * @returns {TileCache} Returns itself to allow for method chaining. * @private */ - _addTile(tileID ) { - let tile = this._tiles[tileID.key]; - if (tile) - return tile; - - tile = this._cache.getAndRemove(tileID); - if (tile) { - this._setTileReloadTimer(tileID.key, tile); - // set the tileID because the cached tile could have had a different wrap value - tile.tileID = tileID; - this._state.initializeTileState(tile, this.map ? this.map.painter : null); - if (this._cacheTimers[tileID.key]) { - clearTimeout(this._cacheTimers[tileID.key]); - delete this._cacheTimers[tileID.key]; - this._setTileReloadTimer(tileID.key, tile); - } + add(tileID , data , expiryTimeout ) { + const key = tileID.wrapped().key; + if (this.data[key] === undefined) { + this.data[key] = []; } - const cached = Boolean(tile); - if (!cached) { - const painter = this.map ? this.map.painter : null; - const isRaster = this._source.type === 'raster' || this._source.type === 'raster-dem'; - tile = new Tile(tileID, this._source.tileSize * tileID.overscaleFactor(), this.transform.tileZoom, painter, isRaster); - this._loadTile(tile, this._tileLoaded.bind(this, tile, tileID.key, tile.state)); + const dataWrapper = { + value: data, + timeout: undefined + }; + + if (expiryTimeout !== undefined) { + dataWrapper.timeout = setTimeout(() => { + this.remove(tileID, dataWrapper); + }, expiryTimeout); } - // Impossible, but silence flow. - if (!tile) return (null ); + this.data[key].push(dataWrapper); + this.order.push(key); - tile.uses++; - this._tiles[tileID.key] = tile; - if (!cached) this._source.fire(new Event('dataloading', {tile, coord: tile.tileID, dataType: 'source'})); + if (this.order.length > this.max) { + const removedData = this._getAndRemoveByKey(this.order[0]); + if (removedData) this.onRemove(removedData); + } - return tile; + return this; } - _setTileReloadTimer(id , tile ) { - if (id in this._timers) { - clearTimeout(this._timers[id]); - delete this._timers[id]; - } - - const expiryTimeout = tile.getExpiryTimeout(); - if (expiryTimeout) { - this._timers[id] = setTimeout(() => { - this._reloadTile(id, 'expired'); - delete this._timers[id]; - }, expiryTimeout); - } + /** + * Determine whether the value attached to `key` is present + * + * @param {OverscaledTileID} tileID the key to be looked-up + * @returns {boolean} whether the cache has this value + * @private + */ + has(tileID ) { + return tileID.wrapped().key in this.data; } /** - * Remove a tile, given its id, from the pyramid + * Get the value attached to a specific key and remove data from cache. + * If the key is not found, returns `null` + * + * @param {OverscaledTileID} tileID the key to look up + * @returns {*} the data, or null if it isn't found * @private */ - _removeTile(id ) { - const tile = this._tiles[id]; - if (!tile) - return; + getAndRemove(tileID ) { + if (!this.has(tileID)) { return null; } + return this._getAndRemoveByKey(tileID.wrapped().key); + } - tile.uses--; - delete this._tiles[id]; - if (this._timers[id]) { - clearTimeout(this._timers[id]); - delete this._timers[id]; + /* + * Get and remove the value with the specified key. + */ + _getAndRemoveByKey(key ) { + const data = this.data[key].shift(); + if (data.timeout) clearTimeout(data.timeout); + + if (this.data[key].length === 0) { + delete this.data[key]; } + this.order.splice(this.order.indexOf(key), 1); - if (tile.uses > 0) - return; + return data.value; + } - if (tile.hasData() && tile.state !== 'reloading') { - this._cache.add(tile.tileID, tile, tile.getExpiryTimeout()); - } else { - tile.aborted = true; - this._abortTile(tile); - this._unloadTile(tile); - } + /* + * Get the value with the specified (wrapped tile) key. + */ + getByKey(key ) { + const data = this.data[key]; + return data ? data[0].value : null; } /** - * Remove all tiles from this pyramid. + * Get the value attached to a specific key without removing data + * from the cache. If the key is not found, returns `null` + * + * @param {OverscaledTileID} tileID the key to look up + * @returns {*} the data, or null if it isn't found * @private */ - clearTiles() { - this._shouldReloadOnResume = false; - this._paused = false; + get(tileID ) { + if (!this.has(tileID)) { return null; } - for (const id in this._tiles) - this._removeTile(+id); + const data = this.data[tileID.wrapped().key][0]; + return data.value; + } - if (this._source._clear) this._source._clear(); + /** + * Remove a key/value combination from the cache. + * + * @param {OverscaledTileID} tileID the key for the pair to delete + * @param {Tile} value If a value is provided, remove that exact version of the value. + * @returns {TileCache} this cache + * @private + */ + remove(tileID , value ) { + if (!this.has(tileID)) { return this; } + const key = tileID.wrapped().key; - this._cache.reset(); + const dataIndex = value === undefined ? 0 : this.data[key].indexOf(value); + const data = this.data[key][dataIndex]; + this.data[key].splice(dataIndex, 1); + if (data.timeout) clearTimeout(data.timeout); + if (this.data[key].length === 0) { + delete this.data[key]; + } + this.onRemove(data.value); + this.order.splice(this.order.indexOf(key), 1); + + return this; } /** - * Search through our current tiles and attempt to find the tiles that cover the given `queryGeometry`. + * Change the max size of the cache. * - * @param {QueryGeometry} queryGeometry - * @param {boolean} [visualizeQueryGeometry=false] - * @param {boolean} use3DQuery - * @returns + * @param {number} max the max size of the cache + * @returns {TileCache} this cache * @private */ - tilesIn(queryGeometry , use3DQuery , visualizeQueryGeometry ) { - const tileResults = []; + setMaxSize(max ) { + this.max = max; - const transform = this.transform; - if (!transform) return tileResults; + while (this.order.length > this.max) { + const removedData = this._getAndRemoveByKey(this.order[0]); + if (removedData) this.onRemove(removedData); + } - for (const tileID in this._tiles) { - const tile = this._tiles[tileID]; - if (visualizeQueryGeometry) { - tile.clearQueryDebugViz(); - } - if (tile.holdingForFade()) { - // Tiles held for fading are covered by tiles that are closer to ideal - continue; - } + return this; + } - const tileResult = queryGeometry.containsTile(tile, transform, use3DQuery); - if (tileResult) { - tileResults.push(tileResult); + /** + * Remove entries that do not pass a filter function. Used for removing + * stale tiles from the cache. + * + * @private + * @param {function} filterFn Determines whether the tile is filtered. If the supplied function returns false, the tile will be filtered out. + */ + filter(filterFn ) { + const removed = []; + for (const key in this.data) { + for (const entry of this.data[key]) { + if (!filterFn(entry.value)) { + removed.push(entry); + } } } - return tileResults; + for (const r of removed) { + this.remove(r.value.tileID, r); + } } +} - getVisibleCoordinates(symbolLayer ) { - const coords = this.getRenderableIds(symbolLayer).map((id) => this._tiles[id].tileID); - for (const coord of coords) { - coord.projMatrix = this.transform.calculateProjMatrix(coord.toUnwrapped()); +// + + + + + +class IndexBuffer { + + + + + constructor(context , array , dynamicDraw ) { + this.context = context; + const gl = context.gl; + this.buffer = gl.createBuffer(); + this.dynamicDraw = Boolean(dynamicDraw); + + // 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. + this.context.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) { + array.destroy(); } - return coords; } - hasTransition() { - if (this._source.hasTransition()) { - return true; - } + bind() { + this.context.bindElementBuffer.set(this.buffer); + } - if (isRasterType(this._source.type)) { - for (const id in this._tiles) { - const tile = this._tiles[id]; - if (tile.fadeEndTime !== undefined && tile.fadeEndTime >= exported.now()) { - return true; - } - } - } + updateData(array ) { + const gl = this.context.gl; + assert_1(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.context.unbindVAO(); + this.bind(); + gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, array.arrayBuffer); + } - return false; + destroy() { + const gl = this.context.gl; + if (this.buffer) { + gl.deleteBuffer(this.buffer); + delete this.buffer; + } } +} + +// + + + + + + + + + +/** + * @enum {string} AttributeType + * @private + * @readonly + */ +const 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 + */ +class VertexBuffer { + + + + + + /** - * Set the value of a particular state for a feature + * @param dynamicDraw Whether this buffer will be repeatedly updated. * @private */ - setFeatureState(sourceLayer , featureId , state ) { - sourceLayer = sourceLayer || '_geojsonTileLayer'; - this._state.updateState(sourceLayer, featureId, state); + constructor(context , array , attributes , dynamicDraw ) { + this.length = array.length; + this.attributes = attributes; + this.itemSize = array.bytesPerElement; + this.dynamicDraw = dynamicDraw; + + this.context = context; + const 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) { + array.destroy(); + } } - /** - * Resets the value of a particular state key for a feature - * @private - */ - removeFeatureState(sourceLayer , featureId , key ) { - sourceLayer = sourceLayer || '_geojsonTileLayer'; - this._state.removeFeatureState(sourceLayer, featureId, key); + bind() { + this.context.bindVertexBuffer.set(this.buffer); } - /** - * Get the entire state object for a feature - * @private - */ - getFeatureState(sourceLayer , featureId ) { - sourceLayer = sourceLayer || '_geojsonTileLayer'; - return this._state.getState(sourceLayer, featureId); + updateData(array ) { + assert_1(array.length === this.length); + const gl = this.context.gl; + this.bind(); + gl.bufferSubData(gl.ARRAY_BUFFER, 0, array.arrayBuffer); } - /** - * Sets the set of keys that the tile depends on. This allows tiles to - * be reloaded when their dependencies change. - * @private - */ - setDependencies(tileKey , namespace , dependencies ) { - const tile = this._tiles[tileKey]; - if (tile) { - tile.setDependencies(namespace, dependencies); + enableAttributes(gl , program ) { + for (let j = 0; j < this.attributes.length; j++) { + const member = this.attributes[j]; + const attribIndex = program.attributes[member.name]; + if (attribIndex !== undefined) { + gl.enableVertexAttribArray(attribIndex); + } } } /** - * Reloads all tiles that depend on the given keys. - * @private + * 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. */ - reloadTilesForDependencies(namespaces , keys ) { - for (const id in this._tiles) { - const tile = this._tiles[id]; - if (tile.hasDependency(namespaces, keys)) { - this._reloadTile(+id, 'reloading'); + setVertexAttribPointers(gl , program , vertexOffset ) { + for (let j = 0; j < this.attributes.length; j++) { + const member = this.attributes[j]; + const attribIndex = program.attributes[member.name]; + + if (attribIndex !== undefined) { + gl.vertexAttribPointer( + attribIndex, + member.components, + (gl )[AttributeType[member.type]], + false, + this.itemSize, + member.offset + (this.itemSize * (vertexOffset || 0)) + ); } } - this._cache.filter(tile => !tile.hasDependency(namespaces, keys)); } /** - * Preloads all tiles that will be requested for one or a series of transformations - * - * @private - * @returns {Object} Returns `this` | Promise. + * Destroy the GL buffer bound to the given WebGL context. */ - _preloadTiles(transform , callback ) { - const coveringTilesIDs = new Map(); - const transforms = Array.isArray(transform) ? transform : [transform]; + destroy() { + const gl = this.context.gl; + if (this.buffer) { + gl.deleteBuffer(this.buffer); + delete this.buffer; + } + } +} - const terrain = this.map.painter.terrain; - const tileSize = this.usedForTerrain && terrain ? terrain.getScaledDemTileSize() : this._source.tileSize; +// - for (const tr of transforms) { - const tileIDs = tr.coveringTiles({ - tileSize, - minzoom: this._source.minzoom, - maxzoom: this._source.maxzoom, - roundZoom: this._source.roundZoom && !this.usedForTerrain, - reparseOverscaled: this._source.reparseOverscaled, - isTerrainDEM: this.usedForTerrain - }); + + + + + + + + + + + + + + + - for (const tileID of tileIDs) { - coveringTilesIDs.set(tileID.key, tileID); - } + + + + + + + + - if (this.usedForTerrain) { - tr.updateElevation(false); - } - } +class BaseValue { + + + + - const tileIDs = Array.from(coveringTilesIDs.values()); - const isRaster = this._source.type === 'raster' || this._source.type === 'raster-dem'; + constructor(context ) { + this.gl = context.gl; + this.default = this.getDefault(); + this.current = this.default; + this.dirty = false; + } - asyncAll(tileIDs, (tileID, done) => { - const tile = new Tile(tileID, this._source.tileSize * tileID.overscaleFactor(), this.transform.tileZoom, this.map.painter, isRaster); - this._loadTile(tile, (err) => { - if (this._source.type === 'raster-dem' && tile.dem) this._backfillDEM(tile); - done(err, tile); - }); - }, callback); + get() { + return this.current; + } + set(value ) { // eslint-disable-line + // overridden in child classes; + } + + getDefault() { + return this.default; // overriden in child classes + } + setDefault() { + this.set(this.default); } } -SourceCache.maxOverzooming = 10; -SourceCache.maxUnderzooming = 3; +class ClearColor extends BaseValue { + getDefault() { + return Color.transparent; + } + set(v ) { + const c = this.current; + if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) return; + this.gl.clearColor(v.r, v.g, v.b, v.a); + this.current = v; + this.dirty = false; + } +} -function compareTileId(a , b ) { - // Different copies of the world are sorted based on their distance to the center. - // Wrap values are converted to unsigned distances by reserving odd number for copies - // with negative wrap and even numbers for copies with positive wrap. - const aWrap = Math.abs(a.wrap * 2) - +(a.wrap < 0); - const bWrap = Math.abs(b.wrap * 2) - +(b.wrap < 0); - return a.overscaledZ - b.overscaledZ || bWrap - aWrap || b.canonical.y - a.canonical.y || b.canonical.x - a.canonical.x; +class ClearDepth extends BaseValue { + getDefault() { + return 1; + } + set(v ) { + if (v === this.current && !this.dirty) return; + this.gl.clearDepth(v); + this.current = v; + this.dirty = false; + } } -function isRasterType(type) { - return type === 'raster' || type === 'image' || type === 'video'; +class ClearStencil extends BaseValue { + getDefault() { + return 0; + } + set(v ) { + if (v === this.current && !this.dirty) return; + this.gl.clearStencil(v); + this.current = v; + this.dirty = false; + } } -// - +class ColorMask extends BaseValue { + getDefault() { + return [true, true, true, true]; + } + set(v ) { + const c = this.current; + if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) return; + this.gl.colorMask(v[0], v[1], v[2], v[3]); + this.current = v; + this.dirty = false; + } +} - +class DepthMask extends BaseValue { + getDefault() { + return true; + } + set(v ) { + if (v === this.current && !this.dirty) return; + this.gl.depthMask(v); + this.current = v; + this.dirty = false; + } +} -/** - * Options common to {@link Map#queryTerrainElevation} and {@link Map#unproject3d}, used to control how elevation - * data is returned. - * - * @typedef {Object} ElevationQueryOptions - * @property {boolean} exaggerated When set to `true` returns the value of the elevation with the terrains `exaggeration` on the style already applied, - * when`false` it returns the raw value of the underlying data without styling applied. - */ - - - +class StencilMask extends BaseValue { + getDefault() { + return 0xFF; + } + set(v ) { + if (v === this.current && !this.dirty) return; + this.gl.stencilMask(v); + this.current = v; + this.dirty = false; + } +} -/** - * Provides access to elevation data from raster-dem source cache. - */ -class Elevation { - /** - * Helper around `getAtPoint` that guarantees that a numeric value is returned. - * @param {MercatorCoordinate} point Mercator coordinate of the point. - * @param {number} defaultIfNotLoaded Value that is returned if the dem tile of the provided point is not loaded. - * @returns {number} Altitude in meters. - */ - getAtPointOrZero(point , defaultIfNotLoaded = 0) { - return this.getAtPoint(point, defaultIfNotLoaded) || 0; +class StencilFunc extends BaseValue { + getDefault() { + return { + func: this.gl.ALWAYS, + ref: 0, + mask: 0xFF + }; + } + set(v ) { + const c = this.current; + if (v.func === c.func && v.ref === c.ref && v.mask === c.mask && !this.dirty) return; + // Assume UNSIGNED_INT_24_8 storage, with 8 bits dedicated to stencil. + // Please revise your stencil values if this threshold is triggered. + assert_1(v.ref >= 0 && v.ref <= 255); + this.gl.stencilFunc(v.func, v.ref, v.mask); + this.current = v; + this.dirty = false; } +} - /** - * Altitude above sea level in meters at specified point. - * @param {MercatorCoordinate} point Mercator coordinate of the point. - * @param {number} defaultIfNotLoaded Value that is returned if the DEM tile of the provided point is not loaded. - * @param {boolean} exaggerated `true` if styling exaggeration should be applied to the resulting elevation. - * @returns {number} Altitude in meters. - * If there is no loaded tile that carries information for the requested - * point elevation, returns `defaultIfNotLoaded`. - * Doesn't invoke network request to fetch the data. - */ - getAtPoint(point , defaultIfNotLoaded , exaggerated = true) { - // Force a cast to null for both null and undefined - if (defaultIfNotLoaded == null) defaultIfNotLoaded = null; +class StencilOp extends BaseValue { + getDefault() { + const gl = this.gl; + return [gl.KEEP, gl.KEEP, gl.KEEP]; + } + set(v ) { + const c = this.current; + if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && !this.dirty) return; + this.gl.stencilOp(v[0], v[1], v[2]); + this.current = v; + this.dirty = false; + } +} - const src = this._source(); - if (!src) return defaultIfNotLoaded; - if (point.y < 0.0 || point.y > 1.0) { - return defaultIfNotLoaded; +class StencilTest extends BaseValue { + getDefault() { + return false; + } + set(v ) { + if (v === this.current && !this.dirty) return; + const gl = this.gl; + if (v) { + gl.enable(gl.STENCIL_TEST); + } else { + gl.disable(gl.STENCIL_TEST); } - const cache = src; - const z = cache.getSource().maxzoom; - const tiles = 1 << z; - const wrap = Math.floor(point.x); - const px = point.x - wrap; - const tileID = new OverscaledTileID(z, wrap, z, Math.floor(px * tiles), Math.floor(point.y * tiles)); - const demTile = this.findDEMTileFor(tileID); - if (!(demTile && demTile.dem)) { return defaultIfNotLoaded; } - const dem = demTile.dem; - const tilesAtTileZoom = 1 << demTile.tileID.canonical.z; - const x = (px * tilesAtTileZoom - demTile.tileID.canonical.x) * dem.dim; - const y = (point.y * tilesAtTileZoom - demTile.tileID.canonical.y) * dem.dim; - const i = Math.floor(x); - const j = Math.floor(y); - const exaggeration = exaggerated ? this.exaggeration() : 1; + this.current = v; + this.dirty = false; + } +} - return exaggeration * number( - number(dem.get(i, j), dem.get(i, j + 1), y - j), - number(dem.get(i + 1, j), dem.get(i + 1, j + 1), y - j), - x - i); +class DepthRange extends BaseValue { + getDefault() { + return [0, 1]; + } + set(v ) { + const c = this.current; + if (v[0] === c[0] && v[1] === c[1] && !this.dirty) return; + this.gl.depthRange(v[0], v[1]); + this.current = v; + this.dirty = false; } +} - /* - * x and y are offset within tile, in 0 .. EXTENT coordinate space. - */ - getAtTileOffset(tileID , x , y ) { - const tilesAtTileZoom = 1 << tileID.canonical.z; - return this.getAtPointOrZero(new MercatorCoordinate( - tileID.wrap + (tileID.canonical.x + x / EXTENT$1) / tilesAtTileZoom, - (tileID.canonical.y + y / EXTENT$1) / tilesAtTileZoom)); +class DepthTest extends BaseValue { + getDefault() { + return false; + } + set(v ) { + if (v === this.current && !this.dirty) return; + const gl = this.gl; + if (v) { + gl.enable(gl.DEPTH_TEST); + } else { + gl.disable(gl.DEPTH_TEST); + } + this.current = v; + this.dirty = false; } +} - getAtTileOffsetFunc(tileID , tileTransform ) { - return (p => { - const elevation = this.getAtTileOffset(tileID, p.x, p.y); - const upVector = tileTransform.upVector(tileID.canonical, p.x, p.y); - const upVectorScale = tileTransform.upVectorScale(tileID.canonical); - scale$4(upVector, upVector, elevation * upVectorScale); - return upVector; - }); +class DepthFunc extends BaseValue { + getDefault() { + return this.gl.LESS; + } + set(v ) { + if (v === this.current && !this.dirty) return; + this.gl.depthFunc(v); + this.current = v; + this.dirty = false; } +} - /* - * Batch fetch for multiple tile points: points holds input and return value: - * vec3's items on index 0 and 1 define x and y offset within tile, in [0 .. EXTENT] - * range, respectively. vec3 item at index 2 is output value, in meters. - * If a DEM tile that covers tileID is loaded, true is returned, otherwise false. - * Nearest filter sampling on dem data is done (no interpolation). - */ - getForTilePoints(tileID , points , interpolated , useDemTile ) { - const helper = DEMSampler.create(this, tileID, useDemTile); - if (!helper) { return false; } +class Blend extends BaseValue { + getDefault() { + return false; + } + set(v ) { + if (v === this.current && !this.dirty) return; + const gl = this.gl; + if (v) { + gl.enable(gl.BLEND); + } else { + gl.disable(gl.BLEND); + } + this.current = v; + this.dirty = false; + } +} - points.forEach(p => { - p[2] = this.exaggeration() * helper.getElevationAt(p[0], p[1], interpolated); - }); - return true; +class BlendFunc extends BaseValue { + getDefault() { + const gl = this.gl; + return [gl.ONE, gl.ZERO]; + } + set(v ) { + const c = this.current; + if (v[0] === c[0] && v[1] === c[1] && !this.dirty) return; + this.gl.blendFunc(v[0], v[1]); + this.current = v; + this.dirty = false; } +} - /** - * Get elevation minimum and maximum for tile identified by `tileID`. - * @param {OverscaledTileID} tileID The `tileId` is a sub tile (or covers the same space) of the DEM tile we read the information from. - * @returns {?{min: number, max: number}} The min and max elevation. - */ - getMinMaxForTile(tileID ) { - const demTile = this.findDEMTileFor(tileID); - if (!(demTile && demTile.dem)) { return null; } - const dem = demTile.dem; - const tree = dem.tree; - const demTileID = demTile.tileID; - const scale = 1 << tileID.canonical.z - demTileID.canonical.z; - let xOffset = tileID.canonical.x / scale - demTileID.canonical.x; - let yOffset = tileID.canonical.y / scale - demTileID.canonical.y; - let index = 0; // Start from DEM tree root. - for (let i = 0; i < tileID.canonical.z - demTileID.canonical.z; i++) { - if (tree.leaves[index]) break; - xOffset *= 2; - yOffset *= 2; - const childOffset = 2 * Math.floor(yOffset) + Math.floor(xOffset); - index = tree.childOffsets[index] + childOffset; - xOffset = xOffset % 1; - yOffset = yOffset % 1; +class BlendColor extends BaseValue { + getDefault() { + return Color.transparent; + } + set(v ) { + const c = this.current; + if (v.r === c.r && v.g === c.g && v.b === c.b && v.a === c.a && !this.dirty) return; + this.gl.blendColor(v.r, v.g, v.b, v.a); + this.current = v; + this.dirty = false; + } +} + +class BlendEquation extends BaseValue { + getDefault() { + return this.gl.FUNC_ADD; + } + set(v ) { + if (v === this.current && !this.dirty) return; + this.gl.blendEquation(v); + this.current = v; + this.dirty = false; + } +} + +class CullFace extends BaseValue { + getDefault() { + return false; + } + set(v ) { + if (v === this.current && !this.dirty) return; + const gl = this.gl; + if (v) { + gl.enable(gl.CULL_FACE); + } else { + gl.disable(gl.CULL_FACE); } - return {min: this.exaggeration() * tree.minimums[index], max: this.exaggeration() * tree.maximums[index]}; + this.current = v; + this.dirty = false; } +} - /** - * Get elevation minimum below MSL for the visible tiles. This function accounts - * for terrain exaggeration and is conservative based on the maximum DEM error, - * do not expect accurate values from this function. - * If no negative elevation is visible, this function returns 0. - * @returns {number} The min elevation below sea level of all visible tiles. - */ - getMinElevationBelowMSL() { - throw new Error('Pure virtual method called.'); +class CullFaceSide extends BaseValue { + getDefault() { + return this.gl.BACK; + } + set(v ) { + if (v === this.current && !this.dirty) return; + this.gl.cullFace(v); + this.current = v; + this.dirty = false; } +} - /** - * Performs raycast against visible DEM tiles on the screen and returns the distance travelled along the ray. - * `x` & `y` components of the position are expected to be in normalized mercator coordinates [0, 1] and z in meters. - * @param {vec3} position The ray origin. - * @param {vec3} dir The ray direction. - * @param {number} exaggeration The terrain exaggeration. - */ - raycast(position , dir , exaggeration ) { - throw new Error('Pure virtual method called.'); +class FrontFace extends BaseValue { + getDefault() { + return this.gl.CCW; + } + set(v ) { + if (v === this.current && !this.dirty) return; + this.gl.frontFace(v); + this.current = v; + this.dirty = false; } +} - /** - * Given a point on screen, returns 3D MercatorCoordinate on terrain. - * Helper function that wraps `raycast`. - * - * @param {Point} screenPoint Screen point in pixels in top-left origin coordinate system. - * @returns {vec3} If there is intersection with terrain, returns 3D MercatorCoordinate's of - * intersection, as vec3(x, y, z), otherwise null. - */ /* eslint no-unused-vars: ["error", { "args": "none" }] */ - pointCoordinate(screenPoint ) { - throw new Error('Pure virtual method called.'); +class Program extends BaseValue { + getDefault() { + return null; + } + set(v ) { + if (v === this.current && !this.dirty) return; + this.gl.useProgram(v); + this.current = v; + this.dirty = false; } +} - /* - * Implementation provides SourceCache of raster-dem source type cache, in - * order to access already loaded cached tiles. - */ - _source() { - throw new Error('Pure virtual method called.'); +class ActiveTextureUnit extends BaseValue { + getDefault() { + return this.gl.TEXTURE0; + } + set(v ) { + if (v === this.current && !this.dirty) return; + this.gl.activeTexture(v); + this.current = v; + this.dirty = false; + } +} + +class Viewport extends BaseValue { + getDefault() { + const gl = this.gl; + return [0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight]; + } + set(v ) { + const c = this.current; + if (v[0] === c[0] && v[1] === c[1] && v[2] === c[2] && v[3] === c[3] && !this.dirty) return; + this.gl.viewport(v[0], v[1], v[2], v[3]); + this.current = v; + this.dirty = false; } +} - /* - * A multiplier defined by style as terrain exaggeration. Elevation provided - * by getXXXX methods is multiplied by this. - */ - exaggeration() { - throw new Error('Pure virtual method called.'); +class BindFramebuffer extends BaseValue { + getDefault() { + return null; } - - /** - * Lookup DEM tile that corresponds to (covers) tileID. - * @private - */ - findDEMTileFor(_ ) { - throw new Error('Pure virtual method called.'); + set(v ) { + if (v === this.current && !this.dirty) return; + const gl = this.gl; + gl.bindFramebuffer(gl.FRAMEBUFFER, v); + this.current = v; + this.dirty = false; } +} - /** - * Get list of DEM tiles used to render current frame. - * @private - */ - get visibleDemTiles() { - throw new Error('Getter must be implemented in subclass.'); +class BindRenderbuffer extends BaseValue { + getDefault() { + return null; + } + set(v ) { + if (v === this.current && !this.dirty) return; + const gl = this.gl; + gl.bindRenderbuffer(gl.RENDERBUFFER, v); + this.current = v; + this.dirty = false; } } -/** - * Helper class computes and caches data required to lookup elevation offsets at the tile level. - */ -class DEMSampler { - - - - - - constructor(demTile , scale , offset ) { - this._demTile = demTile; - // demTile.dem will always exist because the factory method `create` does the check - // Make flow happy with a cast through any - this._dem = (((this._demTile.dem) ) ); - this._scale = scale; - this._offset = offset; +class BindTexture extends BaseValue { + getDefault() { + return null; } - - static create(elevation , tileID , useDemTile ) { - const demTile = useDemTile || elevation.findDEMTileFor(tileID); - if (!(demTile && demTile.dem)) { return; } - const dem = demTile.dem; - const demTileID = demTile.tileID; - const scale = 1 << tileID.canonical.z - demTileID.canonical.z; - const xOffset = (tileID.canonical.x / scale - demTileID.canonical.x) * dem.dim; - const yOffset = (tileID.canonical.y / scale - demTileID.canonical.y) * dem.dim; - const k = demTile.tileSize / EXTENT$1 / scale; - - return new DEMSampler(demTile, k, [xOffset, yOffset]); + set(v ) { + if (v === this.current && !this.dirty) return; + const gl = this.gl; + gl.bindTexture(gl.TEXTURE_2D, v); + this.current = v; + this.dirty = false; } +} - tileCoordToPixel(x , y ) { - const px = x * this._scale + this._offset[0]; - const py = y * this._scale + this._offset[1]; - const i = Math.floor(px); - const j = Math.floor(py); - return new pointGeometry(i, j); +class BindVertexBuffer extends BaseValue { + getDefault() { + return null; } - - getElevationAt(x , y , interpolated , clampToEdge ) { - const px = x * this._scale + this._offset[0]; - const py = y * this._scale + this._offset[1]; - const i = Math.floor(px); - const j = Math.floor(py); - const dem = this._dem; - - clampToEdge = !!clampToEdge; - - return interpolated ? number( - number(dem.get(i, j, clampToEdge), dem.get(i, j + 1, clampToEdge), py - j), - number(dem.get(i + 1, j, clampToEdge), dem.get(i + 1, j + 1, clampToEdge), py - j), - px - i) : - dem.get(i, j, clampToEdge); + set(v ) { + if (v === this.current && !this.dirty) return; + const gl = this.gl; + gl.bindBuffer(gl.ARRAY_BUFFER, v); + this.current = v; + this.dirty = false; } +} - getElevationAtPixel(x , y , clampToEdge ) { - return this._dem.get(x, y, !!clampToEdge); +class BindElementBuffer extends BaseValue { + getDefault() { + return null; } - - getMeterToDEM(lat ) { - return (1 << this._demTile.tileID.canonical.z) * mercatorZfromAltitude(1, lat) * this._dem.stride; + set(v ) { + // Always rebind + const gl = this.gl; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, v); + this.current = v; + this.dirty = false; } } -// - - - - - - - - - - - - - - +class BindVertexArrayOES extends BaseValue { - - - - - - - - - - - - - -class FeatureIndex { - - - - - - - - - - - - - - - constructor(tileID , promoteId ) { - this.tileID = tileID; - this.x = tileID.canonical.x; - this.y = tileID.canonical.y; - this.z = tileID.canonical.z; - this.grid = new gridIndex(EXTENT$1, 16, 0); - this.featureIndexArray = new FeatureIndexArray(); - this.promoteId = promoteId; + constructor(context ) { + super(context); + this.vao = context.extVertexArrayObject; + } + getDefault() { + return null; + } + set(v ) { + if (!this.vao || (v === this.current && !this.dirty)) return; + this.vao.bindVertexArrayOES(v); + this.current = v; + this.dirty = false; } +} - insert(feature , geometry , featureIndex , sourceLayerIndex , bucketIndex , layoutVertexArrayOffset = 0) { - const key = this.featureIndexArray.length; - this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex, layoutVertexArrayOffset); +class PixelStoreUnpack extends BaseValue { + getDefault() { + return 4; + } + set(v ) { + if (v === this.current && !this.dirty) return; + const gl = this.gl; + gl.pixelStorei(gl.UNPACK_ALIGNMENT, v); + this.current = v; + this.dirty = false; + } +} - const grid = this.grid; +class PixelStoreUnpackPremultiplyAlpha extends BaseValue { + getDefault() { + return false; + } + set(v ) { + if (v === this.current && !this.dirty) return; + const gl = this.gl; + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, (v )); + this.current = v; + this.dirty = false; + } +} - for (let r = 0; r < geometry.length; r++) { - const ring = geometry[r]; +class PixelStoreUnpackFlipY extends BaseValue { + getDefault() { + return false; + } + set(v ) { + if (v === this.current && !this.dirty) return; + const gl = this.gl; + gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, (v )); + this.current = v; + this.dirty = false; + } +} - const bbox = [Infinity, Infinity, -Infinity, -Infinity]; - for (let i = 0; i < ring.length; i++) { - const 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); - } +class FramebufferAttachment extends BaseValue { + + - if (bbox[0] < EXTENT$1 && - bbox[1] < EXTENT$1 && - bbox[2] >= 0 && - bbox[3] >= 0) { - grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]); - } - } + constructor(context , parent ) { + super(context); + this.context = context; + this.parent = parent; } - - loadVTLayers() { - if (!this.vtLayers) { - this.vtLayers = new vectorTile.VectorTile(new pbf(this.rawTileData)).layers; - this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']); - this.vtFeatures = {}; - for (const layer in this.vtLayers) { - this.vtFeatures[layer] = []; - } - } - return this.vtLayers; + getDefault() { + return null; } +} - // Finds non-symbol features in this tile at a particular position. - query(args , styleLayers , serializedLayers , sourceFeatureState ) { - this.loadVTLayers(); - const params = args.params || {}, - filter = createFilter(params.filter); - const tilespaceGeometry = args.tileResult; - const transform = args.transform; +class ColorAttachment extends FramebufferAttachment { + setDirty() { + this.dirty = true; + } + set(v ) { + if (v === this.current && !this.dirty) return; + 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 + const gl = this.gl; + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, v, 0); + this.current = v; + this.dirty = false; + } +} - const bounds = tilespaceGeometry.bufferedTilespaceBounds; - const queryPredicate = (bx1, by1, bx2, by2) => { - return polygonIntersectsBox(tilespaceGeometry.bufferedTilespaceGeometry, bx1, by1, bx2, by2); - }; - const matching = this.grid.query(bounds.min.x, bounds.min.y, bounds.max.x, bounds.max.y, queryPredicate); - matching.sort(topDownFeatureComparator); +class DepthAttachment extends FramebufferAttachment { + attachment() { return this.gl.DEPTH_ATTACHMENT; } + set(v ) { + if (v === this.current && !this.dirty) return; + 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 + const gl = this.gl; + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, this.attachment(), gl.RENDERBUFFER, v); + this.current = v; + this.dirty = false; + } +} - let elevationHelper = null; - if (transform.elevation && matching.length > 0) { - elevationHelper = DEMSampler.create(transform.elevation, this.tileID); - } +class DepthStencilAttachment extends DepthAttachment { + attachment() { return this.gl.DEPTH_STENCIL_ATTACHMENT; } +} - const result = {}; - let previousIndex; - for (let k = 0; k < matching.length; k++) { - const index = matching[k]; +// - // don't check the same feature more than once - if (index === previousIndex) continue; - previousIndex = index; +class Framebuffer { + + + + + + - const match = this.featureIndexArray.get(index); - let featureGeometry = null; - this.loadMatchingFeature( - result, - match, - filter, - params.layers, - params.availableImages, - styleLayers, - serializedLayers, - sourceFeatureState, - (feature , styleLayer , featureState , layoutVertexArrayOffset = 0) => { - if (!featureGeometry) { - featureGeometry = loadGeometry(feature, this.tileID.canonical, args.tileTransform); - } + constructor(context , width , height , hasDepth ) { + this.context = context; + this.width = width; + this.height = height; + const gl = context.gl; + const fbo = this.framebuffer = gl.createFramebuffer(); - return styleLayer.queryIntersectsFeature(tilespaceGeometry, feature, featureState, featureGeometry, this.z, args.transform, args.pixelPosMatrix, elevationHelper, layoutVertexArrayOffset); - } - ); + this.colorAttachment = new ColorAttachment(context, fbo); + if (hasDepth) { + this.depthAttachment = new DepthAttachment(context, fbo); } - - return result; + assert_1(gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE); } - loadMatchingFeature( - result , - featureIndexData , - filter , - filterLayerIDs , - availableImages , - styleLayers , - serializedLayers , - sourceFeatureState , - intersectionTest ) { - - const {featureIndex, bucketIndex, sourceLayerIndex, layoutVertexArrayOffset} = featureIndexData; - const layerIDs = this.bucketLayerIDs[bucketIndex]; - if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) - return; + destroy() { + const gl = this.context.gl; - const sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex); - const sourceLayer = this.vtLayers[sourceLayerName]; - const feature = sourceLayer.feature(featureIndex); + const texture = this.colorAttachment.get(); + if (texture) gl.deleteTexture(texture); - if (filter.needGeometry) { - const evaluationFeature = toEvaluationFeature(feature, true); - if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) { - return; - } - } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { - return; + if (this.depthAttachment) { + const renderbuffer = this.depthAttachment.get(); + if (renderbuffer) gl.deleteRenderbuffer(renderbuffer); } - const id = this.getId(feature, sourceLayerName); - - for (let l = 0; l < layerIDs.length; l++) { - const layerID = layerIDs[l]; + gl.deleteFramebuffer(this.framebuffer); + } +} - if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) { - continue; - } +// + - const styleLayer = styleLayers[layerID]; +const ALWAYS$1 = 0x0207; - if (!styleLayer) continue; +class DepthMode { + + + - let featureState = {}; - if (id !== undefined && sourceFeatureState) { - // `feature-state` expression evaluation requires feature state to be available - featureState = sourceFeatureState.getState(styleLayer.sourceLayer || '_geojsonTileLayer', id); - } + // DepthMask enums + + - const serializedLayer = extend({}, serializedLayers[layerID]); + constructor(depthFunc , depthMask , depthRange ) { + this.func = depthFunc; + this.mask = depthMask; + this.range = depthRange; + } - serializedLayer.paint = evaluateProperties(serializedLayer.paint, styleLayer.paint, feature, featureState, availableImages); - serializedLayer.layout = evaluateProperties(serializedLayer.layout, styleLayer.layout, feature, featureState, availableImages); + +} - const intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer, featureState, layoutVertexArrayOffset); - if (!intersectionZ) { - // Only applied for non-symbol features - continue; - } +DepthMode.ReadOnly = false; +DepthMode.ReadWrite = true; - const geojsonFeature = new Feature(feature, this.z, this.x, this.y, id); - (geojsonFeature ).layer = serializedLayer; - let layerResult = result[layerID]; - if (layerResult === undefined) { - layerResult = result[layerID] = []; - } - layerResult.push({featureIndex, feature: geojsonFeature, intersectionZ}); - } - } +DepthMode.disabled = new DepthMode(ALWAYS$1, DepthMode.ReadOnly, [0, 1]); - // Given a set of symbol indexes that have already been looked up, - // return a matching set of GeoJSONFeatures - lookupSymbolFeatures(symbolFeatureIndexes , - serializedLayers , - bucketIndex , - sourceLayerIndex , - filterSpec , - filterLayerIDs , - availableImages , - styleLayers ) { - const result = {}; - this.loadVTLayers(); +// + - const filter = createFilter(filterSpec); +const ALWAYS = 0x0207; +const KEEP = 0x1E00; - for (const symbolFeatureIndex of symbolFeatureIndexes) { - this.loadMatchingFeature( - result, { - bucketIndex, - sourceLayerIndex, - featureIndex: symbolFeatureIndex, - layoutVertexArrayOffset: 0 - }, - filter, - filterLayerIDs, - availableImages, - styleLayers, - serializedLayers - ); +class StencilMode { + + + + + + - } - return result; + constructor(test , ref , mask , fail , + depthFail , pass ) { + this.test = test; + this.ref = ref; + this.mask = mask; + this.fail = fail; + this.depthFail = depthFail; + this.pass = pass; } - loadFeature(featureIndexData ) { - const {featureIndex, sourceLayerIndex} = featureIndexData; + +} - this.loadVTLayers(); - const sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex); +StencilMode.disabled = new StencilMode({func: ALWAYS, mask: 0}, 0, 0, KEEP, KEEP, KEEP); - const featureCache = this.vtFeatures[sourceLayerName]; - if (featureCache[featureIndex]) { - return featureCache[featureIndex]; - } - const sourceLayer = this.vtLayers[sourceLayerName]; - const feature = sourceLayer.feature(featureIndex); - featureCache[featureIndex] = feature; +// - return feature; - } + - hasLayer(id ) { - for (const layerIDs of this.bucketLayerIDs) { - for (const layerID of layerIDs) { - if (id === layerID) return true; - } - } +const ZERO = 0x0000; +const ONE = 0x0001; +const ONE_MINUS_SRC_ALPHA = 0x0303; - return false; - } +class ColorMode { + + + - getId(feature , sourceLayerId ) { - let id = feature.id; - if (this.promoteId) { - const propName = typeof this.promoteId === 'string' ? this.promoteId : this.promoteId[sourceLayerId]; - id = feature.properties[propName]; - if (typeof id === 'boolean') id = Number(id); - } - return id; + constructor(blendFunction , blendColor , mask ) { + this.blendFunction = blendFunction; + this.blendColor = blendColor; + this.mask = mask; } -} -register( - 'FeatureIndex', - FeatureIndex, - {omit: ['rawTileData', 'sourceLayerCoder']} -); + -function evaluateProperties(serializedProperties, styleLayerProperties, feature, featureState, availableImages) { - return mapObject(serializedProperties, (property, key) => { - const prop = styleLayerProperties instanceof PossiblyEvaluated ? styleLayerProperties.get(key) : null; - return prop && prop.evaluate ? prop.evaluate(feature, featureState, availableImages) : prop; - }); + + + } -function topDownFeatureComparator(a, b) { - return b - a; -} +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]); // -/** - * This is a private namespace for utility functions that will get automatically stripped - * out in production builds. - * - * @private - */ -const Debug = { - extend(dest , ...sources ) { - return extend(dest, ...sources); - }, + - run(fn ) { - fn(); - }, +const BACK = 0x0405; +const FRONT = 0x0404; +const CCW = 0x0901; +const CW = 0x0900; - logToElement(message , overwrite = false, id = "log") { - const el = window$1.document.getElementById(id); - if (el) { - if (overwrite) el.innerHTML = ''; - el.innerHTML += `
${message}`; - } +class CullFaceMode { + + + + constructor(enable , mode , frontFace ) { + this.enable = enable; + this.mode = mode; + this.frontFace = frontFace; } -}; -// + + + + + +} -var posAttributes = createLayout([ - {name: 'a_pos', type: 'Int16', components: 2} -]); +CullFaceMode.disabled = new CullFaceMode(false, BACK, CCW); +CullFaceMode.backCCW = new CullFaceMode(true, BACK, CCW); +CullFaceMode.backCW = new CullFaceMode(true, BACK, CW); +CullFaceMode.frontCW = new CullFaceMode(true, FRONT, CW); +CullFaceMode.frontCCW = new CullFaceMode(true, FRONT, CCW); // - + + + + + - - -/** - * Helper class that can be used to draw debug geometry in tile-space - * - * @class TileSpaceDebugBuffer - * @private - */ -class TileSpaceDebugBuffer { - - - + + + + + + +class Context { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + - constructor(tileSize , color = Color.red) { - this.vertices = new StructArrayLayout2i4(); - this.indices = new StructArrayLayout1ui2(); - this.tileSize = tileSize; - this.needsUpload = true; - this.color = color; - } + + - addPoints(points ) { - this.clearPoints(); - for (const point of points) { - this.addPoint(point); + constructor(gl ) { + this.gl = gl; + this.extVertexArrayObject = this.gl.getExtension('OES_vertex_array_object'); + + 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.blendEquation = new BlendEquation(this); + this.cullFace = new CullFace(this); + this.cullFaceSide = new CullFaceSide(this); + this.frontFace = new FrontFace(this); + this.program = new Program(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.pixelStoreUnpackFlipY = new PixelStoreUnpackFlipY(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.addPoint(points[0]); - } + this.extTextureFilterAnisotropicForceOff = false; + this.extStandardDerivativesForceOff = false; - addPoint(p ) { - // Add a bowtie shape - const crosshairSize = 80; - const currLineLineLength = this.vertices.length; - this.vertices.emplaceBack(p.x, p.y); - this.vertices.emplaceBack(p.x + crosshairSize / 2, p.y); - this.vertices.emplaceBack(p.x, p.y - crosshairSize / 2); - this.vertices.emplaceBack(p.x, p.y + crosshairSize / 2); - this.vertices.emplaceBack(p.x - crosshairSize / 2, p.y); - this.indices.emplaceBack(currLineLineLength); - this.indices.emplaceBack(currLineLineLength + 1); - this.indices.emplaceBack(currLineLineLength + 2); - this.indices.emplaceBack(currLineLineLength + 3); - this.indices.emplaceBack(currLineLineLength + 4); - this.indices.emplaceBack(currLineLineLength); + this.extTextureHalfFloat = gl.getExtension('OES_texture_half_float'); + if (this.extTextureHalfFloat) { + gl.getExtension('OES_texture_half_float_linear'); + this.extRenderToTextureHalfFloat = gl.getExtension('EXT_color_buffer_half_float'); + } + this.extStandardDerivatives = gl.getExtension('OES_standard_derivatives'); - this.needsUpload = true; + this.extTimerQuery = gl.getExtension('EXT_disjoint_timer_query'); + this.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); } - clearPoints() { - this.vertices.clear(); - this.indices.clear(); - this.needsUpload = true; - } + setDefault() { + this.unbindVAO(); - lazyUpload(context ) { - if (this.needsUpload && this.hasVertices()) { - this.unload(); + this.clearColor.setDefault(); + this.clearDepth.setDefault(); + this.clearStencil.setDefault(); + this.colorMask.setDefault(); + this.depthMask.setDefault(); + this.stencilMask.setDefault(); + this.stencilFunc.setDefault(); + this.stencilOp.setDefault(); + this.stencilTest.setDefault(); + this.depthRange.setDefault(); + this.depthTest.setDefault(); + this.depthFunc.setDefault(); + this.blend.setDefault(); + this.blendFunc.setDefault(); + this.blendColor.setDefault(); + this.blendEquation.setDefault(); + this.cullFace.setDefault(); + this.cullFaceSide.setDefault(); + this.frontFace.setDefault(); + this.program.setDefault(); + this.activeTexture.setDefault(); + this.bindFramebuffer.setDefault(); + this.pixelStoreUnpack.setDefault(); + this.pixelStoreUnpackPremultiplyAlpha.setDefault(); + this.pixelStoreUnpackFlipY.setDefault(); + } - this.vertexBuffer = context.createVertexBuffer(this.vertices, posAttributes.members, true); - this.indexBuffer = context.createIndexBuffer(this.indices, true); - this.segments = SegmentVector.simpleSegment(0, 0, this.vertices.length, this.indices.length); - this.needsUpload = false; + setDirty() { + this.clearColor.dirty = true; + this.clearDepth.dirty = true; + this.clearStencil.dirty = true; + this.colorMask.dirty = true; + this.depthMask.dirty = true; + this.stencilMask.dirty = true; + this.stencilFunc.dirty = true; + this.stencilOp.dirty = true; + this.stencilTest.dirty = true; + this.depthRange.dirty = true; + this.depthTest.dirty = true; + this.depthFunc.dirty = true; + this.blend.dirty = true; + this.blendFunc.dirty = true; + this.blendColor.dirty = true; + this.blendEquation.dirty = true; + this.cullFace.dirty = true; + this.cullFaceSide.dirty = true; + this.frontFace.dirty = true; + this.program.dirty = true; + this.activeTexture.dirty = true; + this.viewport.dirty = true; + this.bindFramebuffer.dirty = true; + this.bindRenderbuffer.dirty = true; + this.bindTexture.dirty = true; + this.bindVertexBuffer.dirty = true; + this.bindElementBuffer.dirty = true; + if (this.extVertexArrayObject) { + this.bindVertexArrayOES.dirty = true; } + this.pixelStoreUnpack.dirty = true; + this.pixelStoreUnpackPremultiplyAlpha.dirty = true; + this.pixelStoreUnpackFlipY.dirty = true; } - hasVertices() { - return this.vertices.length > 1; + createIndexBuffer(array , dynamicDraw ) { + return new IndexBuffer(this, array, dynamicDraw); } - unload() { - if (this.vertexBuffer) { - this.vertexBuffer.destroy(); - delete this.vertexBuffer; - } - if (this.indexBuffer) { - this.indexBuffer.destroy(); - delete this.indexBuffer; - } - if (this.segments) { - this.segments.destroy(); - delete this.segments; - } + createVertexBuffer(array , attributes , dynamicDraw ) { + return new VertexBuffer(this, array, attributes, dynamicDraw); } -} - -// - - - - -const meshSize = 32; -const gridSize = meshSize + 1; - -const numTriangles = meshSize * meshSize * 2 - 2; -const numParentTriangles = numTriangles - meshSize * meshSize; -const coords = new Uint16Array(numTriangles * 4); - -// precalculate RTIN triangle coordinates -for (let i = 0; i < numTriangles; i++) { - let id = i + 2; - let ax = 0, ay = 0, bx = 0, by = 0, cx = 0, cy = 0; + createRenderbuffer(storageFormat , width , height ) { + const gl = this.gl; - if (id & 1) { - bx = by = cx = meshSize; // bottom-left triangle + const rbo = gl.createRenderbuffer(); + this.bindRenderbuffer.set(rbo); + gl.renderbufferStorage(gl.RENDERBUFFER, storageFormat, width, height); + this.bindRenderbuffer.set(null); - } else { - ax = ay = cy = meshSize; // top-right triangle + return rbo; } - while ((id >>= 1) > 1) { - const mx = (ax + bx) >> 1; - const my = (ay + by) >> 1; + createFramebuffer(width , height , hasDepth ) { + return new Framebuffer(this, width, height, hasDepth); + } - if (id & 1) { // left half - bx = ax; by = ay; - ax = cx; ay = cy; + clear({color, depth, stencil} ) { + const gl = this.gl; + let mask = 0; - } else { // right half - ax = bx; ay = by; - bx = cx; by = cy; + if (color) { + mask |= gl.COLOR_BUFFER_BIT; + this.clearColor.set(color); + this.colorMask.set([true, true, true, true]); } - cx = mx; cy = my; - } - - const k = i * 4; - coords[k + 0] = ax; - coords[k + 1] = ay; - coords[k + 2] = bx; - coords[k + 3] = by; -} + if (typeof depth !== 'undefined') { + mask |= gl.DEPTH_BUFFER_BIT; -// temporary arrays we'll reuse for MARTINI mesh code -const reprojectedCoords = new Uint16Array(gridSize * gridSize * 2); -const used = new Uint8Array(gridSize * gridSize); -const indexMap = new Uint16Array(gridSize * gridSize); + // Workaround for platforms where clearDepth doesn't seem to work + // without reseting the depthRange. See https://github.com/mapbox/mapbox-gl-js/issues/3437 + this.depthRange.set([0, 1]); - - - - + this.clearDepth.set(depth); + this.depthMask.set(true); + } -// There can be visible seams between neighbouring tiles because of precision issues -// and resampling differences. Adding a bit of padding around the edges of tiles hides -// most of these issues. -const commonRasterTileSize = 256; -const paddingSize = meshSize / commonRasterTileSize / 4; -function seamPadding(n) { - if (n === 0) return -paddingSize; - else if (n === gridSize - 1) return paddingSize; - else return 0; -} + if (typeof stencil !== 'undefined') { + mask |= gl.STENCIL_BUFFER_BIT; + this.clearStencil.set(stencil); + this.stencilMask.set(0xFF); + } -function getTileMesh(canonical , projection ) { - const cs = tileTransform(canonical, projection); - const z2 = Math.pow(2, canonical.z); + gl.clear(mask); + } - for (let y = 0; y < gridSize; y++) { - for (let x = 0; x < gridSize; x++) { - const lng = lngFromMercatorX((canonical.x + (x + seamPadding(x)) / meshSize) / z2); - const lat = latFromMercatorY((canonical.y + (y + seamPadding(y)) / meshSize) / z2); - const p = projection.project(lng, lat); - const k = y * gridSize + x; - reprojectedCoords[2 * k + 0] = Math.round((p.x * cs.scale - cs.x) * EXTENT$1); - reprojectedCoords[2 * k + 1] = Math.round((p.y * cs.scale - cs.y) * EXTENT$1); + setCullFace(cullFaceMode ) { + if (cullFaceMode.enable === false) { + this.cullFace.set(false); + } else { + this.cullFace.set(true); + this.cullFaceSide.set(cullFaceMode.mode); + this.frontFace.set(cullFaceMode.frontFace); } } - used.fill(0); - indexMap.fill(0); - - // iterate over all possible triangles, starting from the smallest level - for (let i = numTriangles - 1; i >= 0; i--) { - const k = i * 4; - const ax = coords[k + 0]; - const ay = coords[k + 1]; - const bx = coords[k + 2]; - const by = coords[k + 3]; - const mx = (ax + bx) >> 1; - const my = (ay + by) >> 1; - const cx = mx + my - ay; - const cy = my + ax - mx; - - const aIndex = ay * gridSize + ax; - const bIndex = by * gridSize + bx; - const mIndex = my * gridSize + mx; - - // calculate error in the middle of the long edge of the triangle - const rax = reprojectedCoords[2 * aIndex + 0]; - const ray = reprojectedCoords[2 * aIndex + 1]; - const rbx = reprojectedCoords[2 * bIndex + 0]; - const rby = reprojectedCoords[2 * bIndex + 1]; - const rmx = reprojectedCoords[2 * mIndex + 0]; - const rmy = reprojectedCoords[2 * mIndex + 1]; - - // raster tiles are typically 512px, and we use 1px as an error threshold; 8192 / 512 = 16 - const isUsed = Math.hypot((rax + rbx) / 2 - rmx, (ray + rby) / 2 - rmy) >= 16; - - used[mIndex] = used[mIndex] || (isUsed ? 1 : 0); - - if (i < numParentTriangles) { // bigger triangles; accumulate error with children - const leftChildIndex = ((ay + cy) >> 1) * gridSize + ((ax + cx) >> 1); - const rightChildIndex = ((by + cy) >> 1) * gridSize + ((bx + cx) >> 1); - used[mIndex] = used[mIndex] || used[leftChildIndex] || used[rightChildIndex]; + 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); } } - const vertices = new StructArrayLayout4i8(); - const indices = new StructArrayLayout3ui6(); - - let numVertices = 0; - - function addVertex(x, y) { - const k = y * gridSize + x; - - if (indexMap[k] === 0) { - vertices.emplaceBack( - reprojectedCoords[2 * k + 0], - reprojectedCoords[2 * k + 1], - x * EXTENT$1 / meshSize, - y * EXTENT$1 / meshSize); - - // save new vertex index so that we can reuse it - indexMap[k] = ++numVertices; + setStencilMode(stencilMode ) { + if (stencilMode.test.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 + }); } - - return indexMap[k] - 1; } - function addTriangles(ax, ay, bx, by, cx, cy) { - const mx = (ax + bx) >> 1; - const my = (ay + by) >> 1; - - if (Math.abs(ax - cx) + Math.abs(ay - cy) > 1 && used[my * gridSize + mx]) { - // triangle doesn't approximate the surface well enough; drill down further - addTriangles(cx, cy, ax, ay, mx, my); - addTriangles(bx, by, cx, cy, mx, my); - + setColorMode(colorMode ) { + if (deepEqual(colorMode.blendFunction, ColorMode.Replace)) { + this.blend.set(false); } else { - const ai = addVertex(ax, ay); - const bi = addVertex(bx, by); - const ci = addVertex(cx, cy); - indices.emplaceBack(ai, bi, ci); + this.blend.set(true); + this.blendFunc.set(colorMode.blendFunction); + this.blendColor.set(colorMode.blendColor); } - } - addTriangles(0, 0, meshSize, meshSize, meshSize, 0); - addTriangles(meshSize, meshSize, 0, 0, 0, meshSize); + this.colorMask.set(colorMode.mask); + } - return {vertices, indices}; + unbindVAO() { + // Unbinding the VAO prevents other things (custom layers, new buffer creation) from + // unintentionally changing the state of the last VAO used. + if (this.extVertexArrayObject) { + this.bindVertexArrayOES.set(null); + } + } } // -var boundsAttributes = createLayout([ - {name: 'a_pos', type: 'Int16', components: 2}, - {name: 'a_texture_pos', type: 'Int16', components: 2} -]); - -// - -const 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 bounds outline used for getting reprojected tile geometry in non-mercator projections -const BOUNDS_FEATURE = (() => { - return { - type: 2, - extent: EXTENT$1, - loadGeometry() { - return [[ - new pointGeometry(0, 0), - new pointGeometry(EXTENT$1 + 1, 0), - new pointGeometry(EXTENT$1 + 1, EXTENT$1 + 1), - new pointGeometry(0, EXTENT$1 + 1), - new pointGeometry(0, 0) - ]]; - } - }; -})(); + /** - * 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 + * `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 */ -class Tile { - - +class SourceCache extends Evented { + + - - - - - + + + + + + + + - - - - - - - - - - + + + + - + + + - - - - - - - - - - - - - - - - + - - - - - + constructor(id , source , onlySymbols ) { + super(); + this.id = id; + this._onlySymbols = onlySymbols; - - + source.on('data', (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 (in other words, GeoJSON has been tiled on the worker and is ready) + if (e.dataType === 'source' && e.sourceDataType === 'metadata') this._sourceLoaded = true; - - - - - - + // for sources with mutable data, this event fires when the underlying data + // to a source is changed (for example, using [GeoJSONSource#setData](https://docs.mapbox.com/mapbox-gl-js/api/sources/#geojsonsource#setdata) or [ImageSource#setCoordinates](https://docs.mapbox.com/mapbox-gl-js/api/sources/#imagesource#setcoordinates)) + if (this._sourceLoaded && !this._paused && e.dataType === "source" && e.sourceDataType === 'content') { + this.reload(); + if (this.transform) { + this.update(this.transform); + } + } + }); - /** - * @param {OverscaledTileID} tileID - * @param size - * @private - */ - constructor(tileID , size , tileZoom , painter , isRaster ) { - this.tileID = tileID; - this.uid = uniqueId(); - this.uses = 0; - this.tileSize = size; - this.tileZoom = tileZoom; - this.buckets = {}; - this.expirationTime = null; - this.queryPadding = 0; - this.hasSymbolBuckets = false; - this.hasRTLText = false; - this.dependencies = {}; - this.isRaster = isRaster; + source.on('error', () => { + this._sourceErrored = true; + }); - // 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._source = source; + this._tiles = {}; + this._cache = new TileCache(0, this._unloadTile.bind(this)); + this._timers = {}; + this._cacheTimers = {}; + this._minTileCacheSize = source.minTileCacheSize; + this._maxTileCacheSize = source.maxTileCacheSize; + this._loadedParentTiles = {}; - this.state = 'loading'; + this._coveredTiles = {}; + this._state = new SourceFeatureState(); + this._isRaster = + this._source.type === 'raster' || + this._source.type === 'raster-dem' || + // $FlowFixMe[prop-missing] + (this._source.type === 'custom' && this._source._dataType === 'raster'); + } - if (painter && painter.transform) { - this.projection = painter.transform.projection; + onAdd(map ) { + this.map = map; + this._minTileCacheSize = this._minTileCacheSize === undefined && map ? map._minTileCacheSize : this._minTileCacheSize; + this._maxTileCacheSize = this._maxTileCacheSize === undefined && map ? map._maxTileCacheSize : this._maxTileCacheSize; + } + + /** + * Return true if no tile data is pending, tiles will not change unless + * an additional API call is received. + * @private + */ + loaded() { + if (this._sourceErrored) { return true; } + if (!this._sourceLoaded) { return false; } + if (!this._source.loaded()) { return false; } + for (const t in this._tiles) { + const tile = this._tiles[t]; + if (tile.state !== 'loaded' && tile.state !== 'errored') + return false; } + return true; } - registerFadeDuration(duration ) { - const fadeEndTime = duration + this.timeAdded; - if (fadeEndTime < exported.now()) return; - if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) return; + getSource() { + return this._source; + } - this.fadeEndTime = fadeEndTime; + pause() { + this._paused = true; } - wasRequested() { - return this.state === 'errored' || this.state === 'loaded' || this.state === 'reloading'; + resume() { + if (!this._paused) return; + const shouldReload = this._shouldReloadOnResume; + this._paused = false; + this._shouldReloadOnResume = false; + if (shouldReload) this.reload(); + if (this.transform) this.update(this.transform); } - get tileTransform() { - if (!this._tileTransform) { - this._tileTransform = tileTransform(this.tileID.canonical, this.projection); - } - return this._tileTransform; + _loadTile(tile , callback ) { + tile.isSymbolTile = this._onlySymbols; + return this._source.loadTile(tile, callback); } - /** - * 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 - */ - loadVectorData(data , painter , justReloaded ) { - this.unloadVectorData(); + _unloadTile(tile ) { + if (this._source.unloadTile) + return this._source.unloadTile(tile, () => {}); + } - this.state = 'loaded'; + _abortTile(tile ) { + if (this._source.abortTile) + return this._source.abortTile(tile, () => {}); + } - // empty GeoJSON tile - if (!data) { - this.collisionBoxArray = new CollisionBoxArray(); - return; - } + serialize() { + return this._source.serialize(); + } - if (data.featureIndex) { - this.latestFeatureIndex = data.featureIndex; - if (data.rawTileData) { - // Only vector tiles have rawTileData, and they won't update it for - // 'reloadTile' - this.latestRawTileData = data.rawTileData; - this.latestFeatureIndex.rawTileData = data.rawTileData; - } else if (this.latestRawTileData) { - // If rawTileData hasn't updated, hold onto a pointer to the last - // one we received - this.latestFeatureIndex.rawTileData = this.latestRawTileData; - } + prepare(context ) { + if (this._source.prepare) { + this._source.prepare(); } - this.collisionBoxArray = data.collisionBoxArray; - this.buckets = deserialize$1(data.buckets, painter.style); - this.hasSymbolBuckets = false; - for (const id in this.buckets) { - const bucket = this.buckets[id]; - if (bucket instanceof SymbolBucket) { - this.hasSymbolBuckets = true; - if (justReloaded) { - bucket.justReloaded = true; - } else { - break; - } - } - } + this._state.coalesceChanges(this._tiles, this.map ? this.map.painter : null); - this.hasRTLText = false; - if (this.hasSymbolBuckets) { - for (const id in this.buckets) { - const bucket = this.buckets[id]; - if (bucket instanceof SymbolBucket) { - if (bucket.hasRTLText) { - this.hasRTLText = true; - lazyLoadRTLTextPlugin(); - break; - } + if (this._source.prepareTile) { + for (const i in this._tiles) { + const tile = this._tiles[i]; + const data = this._source.prepareTile(tile); + if (data && this.map.painter.terrain) { + this.map.painter.terrain._clearRenderCacheForTile(this.id, tile.tileID); } + + tile.upload(context); + tile.prepare(this.map.style.imageManager); } - } - this.queryPadding = 0; - for (const id in this.buckets) { - const bucket = this.buckets[id]; - this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(id).queryRadius(bucket)); + return; } - if (data.imageAtlas) { - this.imageAtlas = data.imageAtlas; - } - if (data.glyphAtlasImage) { - this.glyphAtlasImage = data.glyphAtlasImage; - } - if (data.lineAtlas) { - this.lineAtlas = data.lineAtlas; + for (const i in this._tiles) { + const tile = this._tiles[i]; + tile.upload(context); + tile.prepare(this.map.style.imageManager); } } /** - * Release any data or WebGL resources referenced by this tile. - * @returns {undefined} + * Return all tile ids ordered with z-order, and cast to numbers * @private */ - unloadVectorData() { - if (!this.hasData()) return; + getIds() { + return values((this._tiles )).map((tile ) => tile.tileID).sort(compareTileId).map(id => id.key); + } - for (const id in this.buckets) { - this.buckets[id].destroy(); + getRenderableIds(symbolLayer ) { + const renderables = []; + for (const id in this._tiles) { + if (this._isIdRenderable(+id, symbolLayer)) renderables.push(this._tiles[id]); } - this.buckets = {}; - - if (this.imageAtlas) { - this.imageAtlas = null; + if (symbolLayer) { + return renderables.sort((a_ , b_ ) => { + const a = a_.tileID; + const b = b_.tileID; + const rotatedA = (new pointGeometry(a.canonical.x, a.canonical.y))._rotate(this.transform.angle); + const rotatedB = (new pointGeometry(b.canonical.x, b.canonical.y))._rotate(this.transform.angle); + return a.overscaledZ - b.overscaledZ || rotatedB.y - rotatedA.y || rotatedB.x - rotatedA.x; + }).map(tile => tile.tileID.key); } + return renderables.map(tile => tile.tileID).sort(compareTileId).map(id => id.key); + } - if (this.lineAtlas) { - this.lineAtlas = null; + hasRenderableParent(tileID ) { + const parentTile = this.findLoadedParent(tileID, 0); + if (parentTile) { + return this._isIdRenderable(parentTile.tileID.key); } + return false; + } - if (this.imageAtlasTexture) { - this.imageAtlasTexture.destroy(); - } + _isIdRenderable(id , symbolLayer ) { + return this._tiles[id] && this._tiles[id].hasData() && + !this._coveredTiles[id] && (symbolLayer || !this._tiles[id].holdingForFade()); + } - if (this.glyphAtlasTexture) { - this.glyphAtlasTexture.destroy(); + reload() { + if (this._paused) { + this._shouldReloadOnResume = true; + return; } - if (this.lineAtlasTexture) { - this.lineAtlasTexture.destroy(); - } + this._cache.reset(); - if (this._tileBoundsBuffer) { - this._tileBoundsBuffer.destroy(); - this._tileBoundsIndexBuffer.destroy(); - this._tileBoundsSegments.destroy(); - this._tileBoundsBuffer = null; + for (const i in this._tiles) { + if (this._tiles[i].state !== "errored") this._reloadTile(+i, 'reloading'); } + } - if (this._tileDebugBuffer) { - this._tileDebugBuffer.destroy(); - this._tileDebugIndexBuffer.destroy(); - this._tileDebugSegments.destroy(); - this._tileDebugBuffer = null; + _reloadTile(id , state ) { + const 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; } - if (this.globeGridBuffer) { - this.globeGridBuffer.destroy(); - this.globeGridBuffer = null; + this._loadTile(tile, this._tileLoaded.bind(this, tile, id, state)); + } + + _tileLoaded(tile , id , previousState , err ) { + if (err) { + tile.state = 'errored'; + if ((err ).status !== 404) this._source.fire(new ErrorEvent(err, {tile})); + else { + // continue to try loading parent/children tiles if a tile doesn't exist (404) + const updateForTerrain = this._source.type === 'raster-dem' && this.usedForTerrain; + if (updateForTerrain && this.map.painter.terrain) { + const terrain = this.map.painter.terrain; + this.update(this.transform, terrain.getScaledDemTileSize(), true); + terrain.resetTileLookupCache(this.id); + } else { + this.update(this.transform); + } + } + return; } - if (this.globePoleBuffer) { - this.globePoleBuffer.destroy(); - this.globePoleBuffer = null; + tile.timeAdded = exported$1.now(); + if (previousState === 'expired') tile.refreshedUponExpiration = true; + this._setTileReloadTimer(id, tile); + if (this._source.type === 'raster-dem' && tile.dem) this._backfillDEM(tile); + this._state.initializeTileState(tile, this.map ? this.map.painter : null); + + this._source.fire(new Event('data', {dataType: 'source', tile, coord: tile.tileID, 'sourceCacheId': this.id})); + } + + /** + * For raster terrain source, backfill DEM to eliminate visible tile boundaries + * @private + */ + _backfillDEM(tile ) { + const renderables = this.getRenderableIds(); + for (let i = 0; i < renderables.length; i++) { + const borderId = renderables[i]; + if (tile.neighboringTiles && tile.neighboringTiles[borderId]) { + const borderTile = this.getTileByID(borderId); + fillBorder(tile, borderTile); + fillBorder(borderTile, tile); + } } - Debug.run(() => { - if (this.queryGeometryDebugViz) { - this.queryGeometryDebugViz.unload(); - delete this.queryGeometryDebugViz; + function fillBorder(tile, borderTile) { + if (!tile.dem || tile.dem.borderReady) return; + tile.needsHillshadePrepare = true; + tile.needsDEMTextureUpload = true; + let dx = borderTile.tileID.canonical.x - tile.tileID.canonical.x; + const dy = borderTile.tileID.canonical.y - tile.tileID.canonical.y; + const dim = Math.pow(2, tile.tileID.canonical.z); + const borderId = borderTile.tileID.key; + if (dx === 0 && dy === 0) return; + + if (Math.abs(dy) > 1) { + return; } - if (this.queryBoundsDebugViz) { - this.queryBoundsDebugViz.unload(); - delete this.queryBoundsDebugViz; + 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; + } } - }); - this.latestFeatureIndex = null; - this.state = 'unloaded'; + 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 + * @private + */ + getTile(tileID ) { + return this.getTileByID(tileID.key); } - getBucket(layer ) { - return this.buckets[layer.id]; - } + /** + * Get a specific tile by id + * @private + */ + getTileByID(id ) { + return this._tiles[id]; + } + + /** + * For a given set of tiles, retain children that are loaded and have a zoom + * between `zoom` (exclusive) and `maxCoveringZoom` (inclusive) + * @private + */ + _retainLoadedChildren( + idealTiles , + zoom , + maxCoveringZoom , + retain + ) { + for (const id in this._tiles) { + let tile = this._tiles[id]; + + // only consider renderable tiles up to maxCoveringZoom + if (retain[id] || + !tile.hasData() || + tile.tileID.overscaledZ <= zoom || + tile.tileID.overscaledZ > maxCoveringZoom + ) continue; + + // loop through parents and retain the topmost loaded one if found + let topmostLoadedID = tile.tileID; + while (tile && tile.tileID.overscaledZ > zoom + 1) { + const parentID = tile.tileID.scaledTo(tile.tileID.overscaledZ - 1); + + tile = this._tiles[parentID.key]; - upload(context ) { - for (const id in this.buckets) { - const bucket = this.buckets[id]; - if (bucket.uploadPending()) { - bucket.upload(context); + if (tile && tile.hasData()) { + topmostLoadedID = parentID; + } } - } - const gl = context.gl; - if (this.imageAtlas && !this.imageAtlas.uploaded) { - this.imageAtlasTexture = new Texture(context, this.imageAtlas.image, gl.RGBA); - this.imageAtlas.uploaded = true; - } + // loop through ancestors of the topmost loaded child to see if there's one that needed it + let tileID = topmostLoadedID; + while (tileID.overscaledZ > zoom) { + tileID = tileID.scaledTo(tileID.overscaledZ - 1); - if (this.glyphAtlasImage) { - this.glyphAtlasTexture = new Texture(context, this.glyphAtlasImage, gl.ALPHA); - this.glyphAtlasImage = null; + if (idealTiles[tileID.key]) { + // found a parent that needed a loaded child; retain that child + retain[topmostLoadedID.key] = topmostLoadedID; + break; + } + } } + } - if (this.lineAtlas && !this.lineAtlas.uploaded) { - this.lineAtlasTexture = new Texture(context, this.lineAtlas.image, gl.ALPHA); - this.lineAtlas.uploaded = true; + /** + * Find a loaded parent of the given tile (up to minCoveringZoom) + * @private + */ + findLoadedParent(tileID , minCoveringZoom ) { + if (tileID.key in this._loadedParentTiles) { + const parent = this._loadedParentTiles[tileID.key]; + if (parent && parent.tileID.overscaledZ >= minCoveringZoom) { + return parent; + } else { + return null; + } + } + for (let z = tileID.overscaledZ - 1; z >= minCoveringZoom; z--) { + const parentTileID = tileID.scaledTo(z); + const tile = this._getLoadedTile(parentTileID); + if (tile) { + return tile; + } } } - prepare(imageManager ) { - if (this.imageAtlas) { - this.imageAtlas.patchUpdatedImages(imageManager, this.imageAtlasTexture); + _getLoadedTile(tileID ) { + const tile = this._tiles[tileID.key]; + if (tile && tile.hasData()) { + return tile; } + // TileCache ignores wrap in lookup. + const cachedTile = this._cache.getByKey(this._source.reparseOverscaled ? tileID.wrapped().key : tileID.canonical.key); + return cachedTile; } - // Queries non-symbol features rendered for this tile. - // Symbol features are queried globally - queryRenderedFeatures(layers , - serializedLayers , - sourceFeatureState , - tileResult , - params , - transform , - pixelPosMatrix , - visualizeQueryGeometry ) { - Debug.run(() => { - if (visualizeQueryGeometry) { - if (!this.queryGeometryDebugViz) { - this.queryGeometryDebugViz = new TileSpaceDebugBuffer(this.tileSize); - } - if (!this.queryBoundsDebugViz) { - this.queryBoundsDebugViz = new TileSpaceDebugBuffer(this.tileSize, Color.blue); - } - - this.queryGeometryDebugViz.addPoints(tileResult.tilespaceGeometry); - this.queryBoundsDebugViz.addPoints(tileResult.bufferedTilespaceGeometry); - } - }); + /** + * Resizes the tile cache based on the current viewport's size + * or the minTileCacheSize and maxTileCacheSize options 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. + * @private + */ + updateCacheSize(transform , tileSize ) { + tileSize = tileSize || this._source.tileSize; + const widthInTiles = Math.ceil(transform.width / tileSize) + 1; + const heightInTiles = Math.ceil(transform.height / tileSize) + 1; + const approxTilesInView = widthInTiles * heightInTiles; + const commonZoomRange = 5; - if (!this.latestFeatureIndex || !this.latestFeatureIndex.rawTileData) - return {}; + const viewDependentMaxSize = Math.floor(approxTilesInView * commonZoomRange); + const minSize = typeof this._minTileCacheSize === 'number' ? Math.max(this._minTileCacheSize, viewDependentMaxSize) : viewDependentMaxSize; + const maxSize = typeof this._maxTileCacheSize === 'number' ? Math.min(this._maxTileCacheSize, minSize) : minSize; - return this.latestFeatureIndex.query({ - tileResult, - pixelPosMatrix, - transform, - params, - tileTransform: this.tileTransform - }, layers, serializedLayers, sourceFeatureState); + this._cache.setMaxSize(maxSize); } - querySourceFeatures(result , params ) { - const featureIndex = this.latestFeatureIndex; - if (!featureIndex || !featureIndex.rawTileData) return; - - const vtLayers = featureIndex.loadVTLayers(); - - const sourceLayer = params ? params.sourceLayer : ''; - const layer = vtLayers._geojsonTileLayer || vtLayers[sourceLayer]; - - if (!layer) return; + handleWrapJump(lng ) { + // On top of the regular z/x/y values, TileIDs have a `wrap` value that specify + // which copy of the world the tile belongs to. For example, at `lng: 10` you + // might render z/x/y/0 while at `lng: 370` you would render z/x/y/1. + // + // When lng values get wrapped (going from `lng: 370` to `long: 10`) you expect + // to see the same thing on the screen (370 degrees and 10 degrees is the same + // place in the world) but all the TileIDs will have different wrap values. + // + // In order to make this transition seamless, we calculate the rounded difference of + // "worlds" between the last frame and the current frame. If the map panned by + // a world, then we can assign all the tiles new TileIDs with updated wrap values. + // For example, assign z/x/y/1 a new id: z/x/y/0. It is the same tile, just rendered + // in a different position. + // + // This enables us to reuse the tiles at more ideal locations and prevent flickering. + const prevLng = this._prevLng === undefined ? lng : this._prevLng; + const lngDifference = lng - prevLng; + const worldDifference = lngDifference / 360; + const wrapDelta = Math.round(worldDifference); + this._prevLng = lng; - const filter = createFilter(params && params.filter); - const {z, x, y} = this.tileID.canonical; - const coord = {z, x, y}; + if (wrapDelta) { + const tiles = {}; + for (const key in this._tiles) { + const tile = this._tiles[key]; + tile.tileID = tile.tileID.unwrapTo(tile.tileID.wrap + wrapDelta); + tiles[tile.tileID.key] = tile; + } + this._tiles = tiles; - for (let i = 0; i < layer.length; i++) { - const feature = layer.feature(i); - if (filter.needGeometry) { - const evaluationFeature = toEvaluationFeature(feature, true); - if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) continue; - } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { - continue; + // Reset tile reload timers + for (const id in this._timers) { + clearTimeout(this._timers[id]); + delete this._timers[id]; + } + for (const id in this._tiles) { + const tile = this._tiles[id]; + this._setTileReloadTimer(+id, tile); } - const id = featureIndex.getId(feature, sourceLayer); - const geojsonFeature = new Feature(feature, z, x, y, id); - (geojsonFeature ).tile = coord; - result.push(geojsonFeature); } } - hasData() { - return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired'; - } + /** + * Removes tiles that are outside the viewport and adds new tiles that + * are inside the viewport. + * @private + * @param {boolean} updateForTerrain Signals to update tiles even if the + * source is not used (this.used) by layers: it is used for terrain. + * @param {tileSize} tileSize If needed to get lower resolution ideal cover, + * override source.tileSize used in tile cover calculation. + */ + update(transform , tileSize , updateForTerrain ) { + this.transform = transform; + if (!this._sourceLoaded || this._paused || this.transform.freezeTileCoverage) { return; } + assert_1(!(updateForTerrain && !this.usedForTerrain)); + if (this.usedForTerrain && !updateForTerrain) { + // If source is used for both terrain and hillshade, don't update it twice. + return; + } - patternsLoaded() { - return this.imageAtlas && !!Object.keys(this.imageAtlas.patternPositions).length; - } + this.updateCacheSize(transform, tileSize); + if (this.transform.projection.name !== 'globe') { + this.handleWrapJump(this.transform.center.lng); + } - setExpiryData(data ) { - const prior = this.expirationTime; + // 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 = {}; - if (data.cacheControl) { - const parsedCC = 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(); + let idealTileIDs; + if (!this.used && !this.usedForTerrain) { + idealTileIDs = []; + } else if (this._source.tileID) { + idealTileIDs = transform.getVisibleUnwrappedCoordinates(this._source.tileID) + .map((unwrapped) => new OverscaledTileID(unwrapped.canonical.z, unwrapped.wrap, unwrapped.canonical.z, unwrapped.canonical.x, unwrapped.canonical.y)); + } else { + idealTileIDs = transform.coveringTiles({ + tileSize: tileSize || this._source.tileSize, + minzoom: this._source.minzoom, + maxzoom: this._source.maxzoom, + roundZoom: this._source.roundZoom && !updateForTerrain, + reparseOverscaled: this._source.reparseOverscaled, + isTerrainDEM: this.usedForTerrain + }); + + if (this._source.hasTile) { + idealTileIDs = idealTileIDs.filter((coord) => (this._source.hasTile )(coord)); + } } - if (this.expirationTime) { - const now = Date.now(); - let isExpired = false; + // 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. + const retain = this._updateRetainedTiles(idealTileIDs); - 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; + if (isRasterType(this._source.type) && idealTileIDs.length !== 0) { + const parentsForFading = {}; + const fadingTiles = {}; + const ids = Object.keys(retain); + for (const id of ids) { + const tileID = retain[id]; + assert_1(tileID.key === +id); - } else { - const delta = this.expirationTime - prior; + const tile = this._tiles[id]; + if (!tile || (tile.fadeEndTime && tile.fadeEndTime <= exported$1.now())) continue; - if (!delta) { - // Server is serving the same expired resource over and over: fall - // back to exponential backoff. - isExpired = true; + // if the tile is loaded but still fading in, find parents to cross-fade with it + const parentTile = this.findLoadedParent(tileID, Math.max(tileID.overscaledZ - SourceCache.maxOverzooming, this._source.minzoom)); + if (parentTile) { + this._addTile(parentTile.tileID); + parentsForFading[parentTile.tileID.key] = parentTile.tileID; + } - } 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); + fadingTiles[id] = tileID; + } + // for children tiles with parent tiles still fading in, + // retain the children so the parent can fade on top + const minZoom = idealTileIDs[idealTileIDs.length - 1].overscaledZ; + for (const id in this._tiles) { + const childTile = this._tiles[id]; + if (retain[id] || !childTile.hasData()) { + continue; } - } - if (isExpired) { - this.expiredRequestCount++; - this.state = 'expired'; - } else { - this.expiredRequestCount = 0; + let parentID = childTile.tileID; + while (parentID.overscaledZ > minZoom) { + parentID = parentID.scaledTo(parentID.overscaledZ - 1); + const tile = this._tiles[parentID.key]; + if (tile && tile.hasData() && fadingTiles[parentID.key]) { + retain[id] = childTile.tileID; + break; + } + } } - } - } - 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); + for (const id in parentsForFading) { + if (!retain[id]) { + // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own. + this._coveredTiles[id] = true; + retain[id] = parentsForFading[id]; + } } } - } - setFeatureState(states , painter ) { - if (!this.latestFeatureIndex || - !this.latestFeatureIndex.rawTileData || - Object.keys(states).length === 0 || - !painter) { - return; + for (const retainedId in retain) { + // Make sure retained tiles always clear any existing fade holds + // so that if they're removed again their fade timer starts fresh. + this._tiles[retainedId].clearFadeHold(); } - const vtLayers = this.latestFeatureIndex.loadVTLayers(); - const availableImages = painter.style.listImages(); - - for (const id in this.buckets) { - if (!painter.style.hasLayer(id)) continue; - - const bucket = this.buckets[id]; - // Buckets are grouped by common source-layer - const sourceLayerId = bucket.layers[0]['sourceLayer'] || '_geojsonTileLayer'; - const sourceLayer = vtLayers[sourceLayerId]; - const sourceLayerStates = states[sourceLayerId]; - if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0) continue; - - bucket.update(sourceLayerStates, sourceLayer, availableImages, this.imageAtlas && this.imageAtlas.patternPositions || {}); - if (bucket instanceof LineBucket || bucket instanceof FillBucket) { - const sourceCache = painter.style._getSourceCache(bucket.layers[0].source); - if (painter._terrain && painter._terrain.enabled && sourceCache && bucket.programConfigurations.needsUpload) { - painter._terrain._clearRenderCacheForTile(sourceCache.id, this.tileID); - } - } - const layer = painter && painter.style && painter.style.getLayer(id); - if (layer) { - this.queryPadding = Math.max(this.queryPadding, layer.queryRadius(bucket)); + // Remove the tiles we don't need anymore. + const remove = keysDifference((this._tiles ), (retain )); + for (const tileID of remove) { + const tile = this._tiles[tileID]; + if (tile.hasSymbolBuckets && !tile.holdingForFade()) { + tile.setHoldDuration(this.map._fadeDuration); + } else if (!tile.hasSymbolBuckets || tile.symbolFadeFinished()) { + this._removeTile(+tileID); } } - } - - holdingForFade() { - return this.symbolFadeHoldUntil !== undefined; - } - - symbolFadeFinished() { - return !this.symbolFadeHoldUntil || this.symbolFadeHoldUntil < exported.now(); - } - - clearFadeHold() { - this.symbolFadeHoldUntil = undefined; - } - setHoldDuration(duration ) { - this.symbolFadeHoldUntil = exported.now() + duration; - } + // Construct a cache of loaded parents + this._updateLoadedParentTileCache(); - setDependencies(namespace , dependencies ) { - const index = {}; - for (const dep of dependencies) { - index[dep] = true; + if (this._onlySymbols && this._source.afterUpdate) { + this._source.afterUpdate(); } - this.dependencies[namespace] = index; } - hasDependency(namespaces , keys ) { - for (const namespace of namespaces) { - const dependencies = this.dependencies[namespace]; - if (dependencies) { - for (const key of keys) { - if (dependencies[key]) { - return true; - } - } + releaseSymbolFadeTiles() { + for (const id in this._tiles) { + if (this._tiles[id].holdingForFade()) { + this._removeTile(+id); } } - return false; } - clearQueryDebugViz() { - Debug.run(() => { - if (this.queryGeometryDebugViz) { - this.queryGeometryDebugViz.clearPoints(); - } - if (this.queryBoundsDebugViz) { - this.queryBoundsDebugViz.clearPoints(); - } - }); - } + _updateRetainedTiles(idealTileIDs ) { + const retain = {}; + if (idealTileIDs.length === 0) { return retain; } - _makeDebugTileBoundsBuffers(context , projection ) { - if (!projection || projection.name === 'mercator' || this._tileDebugBuffer) return; + const checked = {}; + const minZoom = idealTileIDs.reduce((min, id) => Math.min(min, id.overscaledZ), Infinity); + const maxZoom = idealTileIDs[0].overscaledZ; + assert_1(minZoom <= maxZoom); + const minCoveringZoom = Math.max(maxZoom - SourceCache.maxOverzooming, this._source.minzoom); + const maxCoveringZoom = Math.max(maxZoom + SourceCache.maxUnderzooming, this._source.minzoom); - // reproject tile outline with adaptive resampling - const boundsLine = loadGeometry(BOUNDS_FEATURE, this.tileID.canonical, this.tileTransform)[0]; + const missingTiles = {}; + for (const tileID of idealTileIDs) { + const tile = this._addTile(tileID); - // generate vertices for debugging tile boundaries - const debugVertices = new StructArrayLayout2i4(); - const debugIndices = new StructArrayLayout1ui2(); + // retain the tile even if it's not loaded because it's an ideal tile. + retain[tileID.key] = tileID; - for (let i = 0; i < boundsLine.length; i++) { - const {x, y} = boundsLine[i]; - debugVertices.emplaceBack(x, y); - debugIndices.emplaceBack(i); + if (tile.hasData()) continue; + + if (minZoom < this._source.maxzoom) { + // save missing tiles that potentially have loaded children + missingTiles[tileID.key] = tileID; + } } - debugIndices.emplaceBack(0); - this._tileDebugIndexBuffer = context.createIndexBuffer(debugIndices); - this._tileDebugBuffer = context.createVertexBuffer(debugVertices, boundsAttributes.members); - this._tileDebugSegments = SegmentVector.simpleSegment(0, 0, debugVertices.length, debugIndices.length); - } + // retain any loaded children of ideal tiles up to maxCoveringZoom + this._retainLoadedChildren(missingTiles, minZoom, maxCoveringZoom, retain); - _makeTileBoundsBuffers(context , projection ) { - if (this._tileBoundsBuffer || !projection || projection.name === 'mercator') return; + for (const tileID of idealTileIDs) { + let tile = this._tiles[tileID.key]; - // reproject tile outline with adaptive resampling - const boundsLine = loadGeometry(BOUNDS_FEATURE, this.tileID.canonical, this.tileTransform)[0]; + if (tile.hasData()) continue; - let boundsVertices, boundsIndices; - if (this.isRaster) { - // for raster tiles, generate an adaptive MARTINI mesh - const mesh = getTileMesh(this.tileID.canonical, projection); - boundsVertices = mesh.vertices; - boundsIndices = mesh.indices; + // The tile we require is not yet loaded or does not exist; + // Attempt to find children that fully cover it. - } else { - // for vector tiles, generate an Earcut triangulation of the outline - boundsVertices = new StructArrayLayout4i8(); - boundsIndices = new StructArrayLayout3ui6(); + if (tileID.canonical.z >= this._source.maxzoom) { + // We're looking for an overzoomed child tile. + const childCoord = tileID.children(this._source.maxzoom)[0]; + const childTile = this.getTile(childCoord); + if (!!childTile && childTile.hasData()) { + retain[childCoord.key] = childCoord; + continue; // tile is covered by overzoomed child + } + } else { + // Check if all 4 immediate children are loaded (in other words, the missing ideal tile is covered) + const children = tileID.children(this._source.maxzoom); - for (const {x, y} of boundsLine) { - boundsVertices.emplaceBack(x, y, 0, 0); - } - const indices = earcut_1(boundsVertices.int16, undefined, 4); - for (let i = 0; i < indices.length; i += 3) { - boundsIndices.emplaceBack(indices[i], indices[i + 1], indices[i + 2]); + if (retain[children[0].key] && + retain[children[1].key] && + retain[children[2].key] && + retain[children[3].key]) continue; // tile is covered by children } - } - - this._tileBoundsBuffer = context.createVertexBuffer(boundsVertices, boundsAttributes.members); - this._tileBoundsIndexBuffer = context.createIndexBuffer(boundsIndices); - this._tileBoundsSegments = SegmentVector.simpleSegment(0, 0, boundsVertices.length, boundsIndices.length); - } -} - -// -const layout$6 = createLayout([ - {type: 'Float32', name: 'a_globe_pos', components: 3}, - {type: 'Float32', name: 'a_merc_pos', components: 2}, - {type: 'Float32', name: 'a_uv', components: 2} -]); + // We couldn't find child tiles that entirely cover the ideal tile; look for parents now. -const atmosphereLayout = createLayout([ - {type: 'Float32', name: 'a_pos', components: 3}, - {type: 'Float32', name: 'a_uv', components: 2} -]); -const {members: members$5, size: size$5, alignment: alignment$5} = layout$6; + // As we ascend up the tile pyramid of the ideal tile, we check whether the parent + // tile has been previously requested (and errored because we only loop over tiles with no data) + // in order to determine if we need to request its parent. + let parentWasRequested = tile.wasRequested(); -// + for (let overscaledZ = tileID.overscaledZ - 1; overscaledZ >= minCoveringZoom; --overscaledZ) { + const parentId = tileID.scaledTo(overscaledZ); -class GlobeTileTransform { - - - + // Break parent tile ascent if this route has been previously checked by another child. + if (checked[parentId.key]) break; + checked[parentId.key] = true; - constructor(tr , worldSize ) { - this._tr = tr; - this._worldSize = worldSize; - this._globeMatrix = calculateGlobeMatrix(tr, worldSize); - } + tile = this.getTile(parentId); + if (!tile && parentWasRequested) { + tile = this._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; + } + } + } - createTileMatrix(id ) { - const decode = globeDenormalizeECEF(globeTileBounds(id.canonical)); - return multiply$3([], this._globeMatrix, decode); + return retain; } - createInversionMatrix(id ) { - const identity = identity$3(new Float64Array(16)); + _updateLoadedParentTileCache() { + this._loadedParentTiles = {}; - const center = this._tr.center; - const ecefUnitsToPixels = globeECEFUnitsToPixelScale(this._worldSize); - const matrix = identity$3(new Float64Array(16)); - const encode = globeNormalizeECEF(globeTileBounds(id.canonical)); - multiply$3(matrix, matrix, encode); - rotateY(matrix, matrix, degToRad(center.lng)); - rotateX(matrix, matrix, degToRad(center.lat)); + for (const tileKey in this._tiles) { + const path = []; + let parentTile ; + let currentId = this._tiles[tileKey].tileID; - scale$3(matrix, matrix, [1.0 / ecefUnitsToPixels, 1.0 / ecefUnitsToPixels, 1.0]); + // Find the closest loaded ancestor by traversing the tile tree towards the root and + // caching results along the way + while (currentId.overscaledZ > 0) { - const PPMMercator = mercatorZfromAltitude(1.0, center.lat) * this._worldSize; - const globeToMercatorPPMRatio = PPMMercator / this._tr.pixelsPerMeter; - const worldSizeMercator = this._worldSize / globeToMercatorPPMRatio; - const wsRadius = worldSizeMercator / (2.0 * Math.PI); - const localRadius = EXTENT$1 / (2.0 * Math.PI); - const ecefUnitsToMercatorPixels = wsRadius / localRadius; + // Do we have a cached result from previous traversals? + if (currentId.key in this._loadedParentTiles) { + parentTile = this._loadedParentTiles[currentId.key]; + break; + } - scale$3(identity, identity, [ecefUnitsToMercatorPixels, ecefUnitsToMercatorPixels, 1.0]); + path.push(currentId.key); - return multiply$3(matrix, matrix, identity); - } + // Is the parent loaded? + const parentId = currentId.scaledTo(currentId.overscaledZ - 1); + parentTile = this._getLoadedTile(parentId); + if (parentTile) { + break; + } - upVector(id , x , y ) { - const tiles = 1 << id.z; - const mercX = (x / EXTENT$1 + id.x) / tiles; - const mercY = (y / EXTENT$1 + id.y) / tiles; - return latLngToECEF(latFromMercatorY(mercY), lngFromMercatorX(mercX), 1.0); - } + currentId = parentId; + } - upVectorScale(id ) { - const pixelsPerMeterECEF = mercatorZfromAltitude(1, 0.0) * 2.0 * GLOBE_RADIUS * Math.PI; - return pixelsPerMeterECEF * globeECEFNormalizationScale(globeTileBounds(id)); + // Cache the result of this traversal to all newly visited tiles + for (const key of path) { + this._loadedParentTiles[key] = parentTile; + } + } } - pointCoordinate(x , y ) { - const point0 = [x, y, 0, 1]; - const point1 = [x, y, 1, 1]; + /** + * Add a tile, given its coordinate, to the pyramid. + * @private + */ + _addTile(tileID ) { + let tile = this._tiles[tileID.key]; + if (tile) { + if (this._source.prepareTile) this._source.prepareTile(tile); + return tile; + } - transformMat4$1(point0, point0, this._tr.pixelMatrixInverse); - transformMat4$1(point1, point1, this._tr.pixelMatrixInverse); + tile = this._cache.getAndRemove(tileID); + if (tile) { + this._setTileReloadTimer(tileID.key, tile); + // set the tileID because the cached tile could have had a different wrap value + tile.tileID = tileID; + this._state.initializeTileState(tile, this.map ? this.map.painter : null); + if (this._cacheTimers[tileID.key]) { + clearTimeout(this._cacheTimers[tileID.key]); + delete this._cacheTimers[tileID.key]; + this._setTileReloadTimer(tileID.key, tile); + } + } - scale$5(point0, point0, 1 / point0[3]); - scale$5(point1, point1, 1 / point1[3]); + const cached = Boolean(tile); + if (!cached) { + const painter = this.map ? this.map.painter : null; + tile = new Tile(tileID, this._source.tileSize * tileID.overscaleFactor(), this.transform.tileZoom, painter, this._isRaster); + if (this._source.prepareTile) { + const data = this._source.prepareTile(tile); + if (!data) this._loadTile(tile, this._tileLoaded.bind(this, tile, tileID.key, tile.state)); + } else { + this._loadTile(tile, this._tileLoaded.bind(this, tile, tileID.key, tile.state)); + } + } - const p0p1 = sub$4([], point1, point0); - const direction = normalize([], p0p1); + // Impossible, but silence flow. + if (!tile) return (null ); - // Compute globe origo in world space - const globeCenter = transformMat4([], [0, 0, 0], this._globeMatrix); - const radius = this._worldSize / (2.0 * Math.PI); + tile.uses++; + this._tiles[tileID.key] = tile; + if (!cached) this._source.fire(new Event('dataloading', {tile, coord: tile.tileID, dataType: 'source'})); - const pointOnGlobe = []; - const ray = new Ray(point0, direction); + return tile; + } - ray.closestPointOnSphere(globeCenter, radius, pointOnGlobe); + _setTileReloadTimer(id , tile ) { + if (id in this._timers) { + clearTimeout(this._timers[id]); + delete this._timers[id]; + } - // Transform coordinate axes to find lat & lng of the position - const xa = normalize([], getColumn(this._globeMatrix, 0)); - const ya = normalize([], getColumn(this._globeMatrix, 1)); - const za = normalize([], getColumn(this._globeMatrix, 2)); + const expiryTimeout = tile.getExpiryTimeout(); + if (expiryTimeout) { + this._timers[id] = setTimeout(() => { + this._reloadTile(id, 'expired'); + delete this._timers[id]; + }, expiryTimeout); + } + } - const xp = dot(xa, pointOnGlobe); - const yp = dot(ya, pointOnGlobe); - const zp = dot(za, pointOnGlobe); + /** + * Remove a tile, given its id, from the pyramid + * @private + */ + _removeTile(id ) { + const tile = this._tiles[id]; + if (!tile) + return; - const lat = radToDeg(Math.asin(-yp / radius)); - const lng = radToDeg(Math.atan2(xp, zp)); + tile.uses--; + delete this._tiles[id]; + if (this._timers[id]) { + clearTimeout(this._timers[id]); + delete this._timers[id]; + } - const mx = mercatorXfromLng$1(lng); - const my = mercatorYfromLat$1(lat); + if (tile.uses > 0) + return; - return new MercatorCoordinate(mx, my); + if (tile.hasData() && tile.state !== 'reloading') { + this._cache.add(tile.tileID, tile, tile.getExpiryTimeout()); + } else { + tile.aborted = true; + this._abortTile(tile); + this._unloadTile(tile); + } } -} -// - + /** + * Remove all tiles from this pyramid. + * @private + */ + clearTiles() { + this._shouldReloadOnResume = false; + this._paused = false; -function farthestPixelDistanceOnPlane(tr , pixelsPerMeter ) { - // Find the distance from the center point [width/2 + offset.x, height/2 + offset.y] to the - // center top point [width/2 + offset.x, 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]) - const fovAboveCenter = tr.fovAboveCenter; + for (const id in this._tiles) + this._removeTile(+id); - // Adjust distance to MSL by the minimum possible elevation visible on screen, - // this way the far plane is pushed further in the case of negative elevation. - const minElevationInPixels = tr.elevation ? - tr.elevation.getMinElevationBelowMSL() * pixelsPerMeter : - 0; - const cameraToSeaLevelDistance = ((tr._camera.position[2] * tr.worldSize) - minElevationInPixels) / Math.cos(tr._pitch); - const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * cameraToSeaLevelDistance / Math.sin(Math.max(Math.PI / 2.0 - tr._pitch - fovAboveCenter, 0.01)); + if (this._source._clear) this._source._clear(); - // Calculate z distance of the farthest fragment that should be rendered. - const furthestDistance = Math.sin(tr._pitch) * topHalfSurfaceDistance + cameraToSeaLevelDistance; - const horizonDistance = cameraToSeaLevelDistance * (1 / tr._horizonShift); + this._cache.reset(); - // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance` - return Math.min(furthestDistance * 1.01, horizonDistance); -} + if (this.map && this.usedForTerrain && this.map.painter.terrain) { + this.map.painter.terrain.resetTileLookupCache(this.id); + } + } -function farthestPixelDistanceOnSphere(tr , pixelsPerMeter ) { - // Find farthest distance of the globe that is potentially visible to the camera. - // First check if the view frustum is fully covered by the map by casting a ray - // from the top left/right corner and see if it intersects with the globe. In case - // of no intersection we need to find distance to the horizon point where the - // surface normal is perpendicular to the camera forward direction. - const cameraDistance = tr.cameraToCenterDistance; - const centerPixelAltitude = tr._centerAltitude * pixelsPerMeter; + /** + * Search through our current tiles and attempt to find the tiles that cover the given `queryGeometry`. + * + * @param {QueryGeometry} queryGeometry + * @param {boolean} [visualizeQueryGeometry=false] + * @param {boolean} use3DQuery + * @returns + * @private + */ + tilesIn(queryGeometry , use3DQuery , visualizeQueryGeometry ) { + const tileResults = []; - const camera = tr._camera; - const forward = tr._camera.forward(); - const cameraPosition = add$4([], scale$4([], forward, -cameraDistance), [0, 0, centerPixelAltitude]); + const transform = this.transform; + if (!transform) return tileResults; - const globeRadius = tr.worldSize / (2.0 * Math.PI); - const globeCenter = [0, 0, -globeRadius]; + const isGlobe = transform.projection.name === 'globe'; + const centerX = mercatorXfromLng(transform.center.lng); - const aspectRatio = tr.width / tr.height; - const tanFovAboveCenter = Math.tan(tr.fovAboveCenter); + for (const tileID in this._tiles) { + const tile = this._tiles[tileID]; + if (visualizeQueryGeometry) { + tile.clearQueryDebugViz(); + } + if (tile.holdingForFade()) { + // Tiles held for fading are covered by tiles that are closer to ideal + continue; + } - const up = scale$4([], camera.up(), tanFovAboveCenter); - const right = scale$4([], camera.right(), tanFovAboveCenter * aspectRatio); - const dir = normalize([], add$4([], add$4([], forward, up), right)); + // An array of wrap values for the tile [-1, 0, 1]. The default value is 0 but -1 or 1 wrapping + // might be required in globe view due to globe's surface being continuous. + let tilesToCheck; - const pointOnGlobe = []; - const ray = new Ray(cameraPosition, dir); + if (isGlobe) { + // Compare distances to copies of the tile to see if a wrapped one should be used. + const id = tile.tileID.canonical; + assert_1(tile.tileID.wrap === 0); - let pixelDistance; - if (ray.closestPointOnSphere(globeCenter, globeRadius, pointOnGlobe)) { - const p0 = add$4([], pointOnGlobe, globeCenter); - const p1 = sub$4([], p0, cameraPosition); - // Globe is fully covering the view frustum. Project the intersection - // point to the camera view vector in order to find the pixel distance - pixelDistance = Math.cos(tr.fovAboveCenter) * length(p1); - } else { - // Background space is visible. Find distance to the point of the - // globe where surface normal is parallel to the view vector - const p0 = sub$4([], cameraPosition, globeCenter); - const p1 = sub$4([], globeCenter, cameraPosition); - normalize(p1, p1); + if (id.z === 0) { + // Render the zoom level 0 tile twice as the query polygon might span over the antimeridian + const distances = [ + Math.abs(clamp(centerX, ...tileBoundsX(id, -1)) - centerX), + Math.abs(clamp(centerX, ...tileBoundsX(id, 1)) - centerX) + ]; - const cameraHeight = length(p0) - globeRadius; - pixelDistance = Math.sqrt(cameraHeight * cameraHeight + 2 * globeRadius * cameraHeight); - const angle = Math.acos(pixelDistance / (globeRadius + cameraHeight)) - Math.acos(dot(forward, p1)); - pixelDistance *= Math.cos(angle); - } + tilesToCheck = [0, distances.indexOf(Math.min(...distances)) * 2 - 1]; + } else { + const distances = [ + Math.abs(clamp(centerX, ...tileBoundsX(id, -1)) - centerX), + Math.abs(clamp(centerX, ...tileBoundsX(id, 0)) - centerX), + Math.abs(clamp(centerX, ...tileBoundsX(id, 1)) - centerX) + ]; - return pixelDistance * 1.01; -} + tilesToCheck = [distances.indexOf(Math.min(...distances)) - 1]; + } + } else { + tilesToCheck = [0]; + } -// + for (const wrap of tilesToCheck) { + const tileResult = queryGeometry.containsTile(tile, transform, use3DQuery, wrap); + if (tileResult) { + tileResults.push(tileResult); + } + } + } + return tileResults; + } -const GLOBE_RADIUS = EXTENT$1 / Math.PI / 2.0; -const GLOBE_NORMALIZATION_BIT_RANGE = 15; -const GLOBE_NORMALIZATION_MASK = (1 << (GLOBE_NORMALIZATION_BIT_RANGE - 1)) - 1; -const GLOBE_VERTEX_GRID_SIZE = 64; + getVisibleCoordinates(symbolLayer ) { + const coords = this.getRenderableIds(symbolLayer).map((id) => this._tiles[id].tileID); + for (const coord of coords) { + coord.projMatrix = this.transform.calculateProjMatrix(coord.toUnwrapped()); + } + return coords; + } -var globe = { - name: 'globe', - requiresDraping: true, - wrap: true, - supportsWorldCopies: false, - supportsTerrain: true, - supportsFreeCamera: true, - zAxisUnit: "pixels", - center: [0, 0], - unsupportedLayers: [ - 'circle', - 'heatmap', - 'fill-extrusion', - 'debug', - 'custom' - ], + hasTransition() { + if (this._source.hasTransition()) { + return true; + } - project(lng , lat ) { - const x = mercatorXfromLng$1(lng); - const y = mercatorYfromLat$1(lat); - return {x, y, z: 0}; - }, + if (isRasterType(this._source.type)) { + for (const id in this._tiles) { + const tile = this._tiles[id]; + if (tile.fadeEndTime !== undefined && tile.fadeEndTime >= exported$1.now()) { + return true; + } + } + } - unproject(x , y ) { - const lng = lngFromMercatorX(x); - const lat = latFromMercatorY(y); - return new LngLat(lng, lat); - }, + return false; + } - projectTilePoint(x , y , id ) { - const tiles = Math.pow(2.0, id.z); - const mx = (x / EXTENT$1 + id.x) / tiles; - const my = (y / EXTENT$1 + id.y) / tiles; - const lat = latFromMercatorY(my); - const lng = lngFromMercatorX(mx); - const pos = latLngToECEF(lat, lng); + /** + * Set the value of a particular state for a feature + * @private + */ + setFeatureState(sourceLayer , featureId , state ) { + sourceLayer = sourceLayer || '_geojsonTileLayer'; + this._state.updateState(sourceLayer, featureId, state); + } - const bounds = globeTileBounds(id); - const normalizationMatrix = globeNormalizeECEF(bounds); - transformMat4(pos, pos, normalizationMatrix); + /** + * Resets the value of a particular state key for a feature + * @private + */ + removeFeatureState(sourceLayer , featureId , key ) { + sourceLayer = sourceLayer || '_geojsonTileLayer'; + this._state.removeFeatureState(sourceLayer, featureId, key); + } - return {x: pos[0], y: pos[1], z: pos[2]}; - }, + /** + * Get the entire state object for a feature + * @private + */ + getFeatureState(sourceLayer , featureId ) { + sourceLayer = sourceLayer || '_geojsonTileLayer'; + return this._state.getState(sourceLayer, featureId); + } - locationPoint(tr , lngLat ) { - const pos = latLngToECEF(lngLat.lat, lngLat.lng); - const up = normalize([], pos); + /** + * Sets the set of keys that the tile depends on. This allows tiles to + * be reloaded when their dependencies change. + * @private + */ + setDependencies(tileKey , namespace , dependencies ) { + const tile = this._tiles[tileKey]; + if (tile) { + tile.setDependencies(namespace, dependencies); + } + } - const elevation = tr.elevation ? - tr.elevation.getAtPointOrZero(tr.locationCoordinate(lngLat), tr._centerAltitude) : - tr._centerAltitude; + /** + * Reloads all tiles that depend on the given keys. + * @private + */ + reloadTilesForDependencies(namespaces , keys ) { + for (const id in this._tiles) { + const tile = this._tiles[id]; + if (tile.hasDependency(namespaces, keys)) { + this._reloadTile(+id, 'reloading'); + } + } + this._cache.filter(tile => !tile.hasDependency(namespaces, keys)); + } - const upScale = mercatorZfromAltitude(1, 0) * EXTENT$1 * elevation; - scaleAndAdd(pos, pos, up, upScale); - const matrix = calculateGlobeMatrix(tr, tr.worldSize); - multiply$3(matrix, tr.pixelMatrix, matrix); - transformMat4(pos, pos, matrix); + /** + * Preloads all tiles that will be requested for one or a series of transformations + * + * @private + * @returns {Object} Returns `this` | Promise. + */ + _preloadTiles(transform , callback ) { + const coveringTilesIDs = new Map(); + const transforms = Array.isArray(transform) ? transform : [transform]; - return new pointGeometry(pos[0], pos[1]); - }, + const terrain = this.map.painter.terrain; + const tileSize = this.usedForTerrain && terrain ? terrain.getScaledDemTileSize() : this._source.tileSize; - pixelsPerMeter(lat , worldSize ) { - return mercatorZfromAltitude(1, 0) * worldSize; - }, + for (const tr of transforms) { + const tileIDs = tr.coveringTiles({ + tileSize, + minzoom: this._source.minzoom, + maxzoom: this._source.maxzoom, + roundZoom: this._source.roundZoom && !this.usedForTerrain, + reparseOverscaled: this._source.reparseOverscaled, + isTerrainDEM: this.usedForTerrain + }); - createTileTransform(tr , worldSize ) { - return new GlobeTileTransform(tr, worldSize); - }, + for (const tileID of tileIDs) { + coveringTilesIDs.set(tileID.key, tileID); + } - farthestPixelDistance(tr ) { - const pixelsPerMeter = this.pixelsPerMeter(tr.center.lat, tr.worldSize); - const globePixelDistance = farthestPixelDistanceOnSphere(tr, pixelsPerMeter); - const t = globeToMercatorTransition(tr.zoom); - if (t > 0.0) { - const mercatorPixelsPerMeter = mercatorZfromAltitude(1, tr.center.lat) * tr.worldSize; - const mercatorPixelDistance = farthestPixelDistanceOnPlane(tr, mercatorPixelsPerMeter); - return number(globePixelDistance, mercatorPixelDistance, t); + if (this.usedForTerrain) { + tr.updateElevation(false); + } } - return globePixelDistance; - } -}; - -const GLOBE_MIN = -GLOBE_RADIUS; -const GLOBE_MAX = GLOBE_RADIUS; -const GLOBE_LOW_ZOOM_TILE_AABBS = [ - // z == 0 - new Aabb([GLOBE_MIN, GLOBE_MIN, GLOBE_MIN], [GLOBE_MAX, GLOBE_MAX, GLOBE_MAX]), - // z == 1 - new Aabb([GLOBE_MIN, GLOBE_MIN, GLOBE_MIN], [0, 0, GLOBE_MAX]), // x=0, y=0 - new Aabb([0, GLOBE_MIN, GLOBE_MIN], [GLOBE_MAX, 0, GLOBE_MAX]), // x=1, y=0 - new Aabb([GLOBE_MIN, 0, GLOBE_MIN], [0, GLOBE_MAX, GLOBE_MAX]), // x=0, y=1 - new Aabb([0, 0, GLOBE_MIN], [GLOBE_MAX, GLOBE_MAX, GLOBE_MAX]) // x=1, y=1 -]; + const tileIDs = Array.from(coveringTilesIDs.values()); -function globeTileBounds(id ) { - if (id.z <= 1) { - return GLOBE_LOW_ZOOM_TILE_AABBS[id.z + id.y * 2 + id.x]; + asyncAll(tileIDs, (tileID, done) => { + const tile = new Tile(tileID, this._source.tileSize * tileID.overscaleFactor(), this.transform.tileZoom, this.map.painter, this._isRaster); + this._loadTile(tile, (err) => { + if (this._source.type === 'raster-dem' && tile.dem) this._backfillDEM(tile); + done(err, tile); + }); + }, callback); } +} - // After zoom 1 surface function is monotonic for all tile patches - // => it is enough to project corner points - const [min, max] = globeTileLatLngCorners(id); +SourceCache.maxOverzooming = 10; +SourceCache.maxUnderzooming = 3; - const corners = [ - latLngToECEF(min[0], min[1]), - latLngToECEF(min[0], max[1]), - latLngToECEF(max[0], min[1]), - latLngToECEF(max[0], max[1]) - ]; +function compareTileId(a , b ) { + // Different copies of the world are sorted based on their distance to the center. + // Wrap values are converted to unsigned distances by reserving odd number for copies + // with negative wrap and even numbers for copies with positive wrap. + const aWrap = Math.abs(a.wrap * 2) - +(a.wrap < 0); + const bWrap = Math.abs(b.wrap * 2) - +(b.wrap < 0); + return a.overscaledZ - b.overscaledZ || bWrap - aWrap || b.canonical.y - a.canonical.y || b.canonical.x - a.canonical.x; +} - const bMin = [GLOBE_MAX, GLOBE_MAX, GLOBE_MAX]; - const bMax = [GLOBE_MIN, GLOBE_MIN, GLOBE_MIN]; +function isRasterType(type) { + return type === 'raster' || type === 'image' || type === 'video'; +} - for (const p of corners) { - bMin[0] = Math.min(bMin[0], p[0]); - bMin[1] = Math.min(bMin[1], p[1]); - bMin[2] = Math.min(bMin[2], p[2]); +function tileBoundsX(id , wrap ) { + const tiles = 1 << id.z; + return [id.x / tiles + wrap, (id.x + 1) / tiles + wrap]; +} - bMax[0] = Math.max(bMax[0], p[0]); - bMax[1] = Math.max(bMax[1], p[1]); - bMax[2] = Math.max(bMax[2], p[2]); - } +// - return new Aabb(bMin, bMax); -} + + + -function globeTileLatLngCorners(id ) { - const tileScale = Math.pow(2, id.z); - const left = id.x / tileScale; - const right = (id.x + 1) / tileScale; - const top = id.y / tileScale; - const bottom = (id.y + 1) / tileScale; +/** + * Options common to {@link Map#queryTerrainElevation} and {@link Map#unproject3d}, used to control how elevation + * data is returned. + * + * @typedef {Object} ElevationQueryOptions + * @property {boolean} exaggerated When set to `true` returns the value of the elevation with the terrains `exaggeration` on the style already applied, + * when`false` it returns the raw value of the underlying data without styling applied. + */ + + + - const latLngTL = [ latFromMercatorY(top), lngFromMercatorX(left) ]; - const latLngBR = [ latFromMercatorY(bottom), lngFromMercatorX(right) ]; +/** + * Provides access to elevation data from raster-dem source cache. + */ +class Elevation { - return [latLngTL, latLngBR]; -} + /** + * Helper that checks whether DEM data is available at a given mercator coordinate. + * @param {MercatorCoordinate} point Mercator coordinate of the point to check against. + * @returns {boolean} `true` indicating whether the data is available at `point`, and `false` otherwise. + */ + isDataAvailableAtPoint(point ) { + const sourceCache = this._source(); + if (!sourceCache || point.y < 0.0 || point.y > 1.0) { + return false; + } -function csLatLngToECEF(cosLat , sinLat , lng , radius ) { - lng = degToRad(lng); + const cache = sourceCache; + const z = cache.getSource().maxzoom; + const tiles = 1 << z; + const wrap = Math.floor(point.x); + const px = point.x - wrap; + const x = Math.floor(px * tiles); + const y = Math.floor(point.y * tiles); + const demTile = this.findDEMTileFor(new OverscaledTileID(z, wrap, z, x, y)); - if (!radius) { - radius = GLOBE_RADIUS; + return !!(demTile && demTile.dem); } - // Convert lat & lng to spherical representation. Use zoom=0 as a reference - const sx = cosLat * Math.sin(lng) * radius; - const sy = -sinLat * radius; - const sz = cosLat * Math.cos(lng) * radius; + /** + * Helper around `getAtPoint` that guarantees that a numeric value is returned. + * @param {MercatorCoordinate} point Mercator coordinate of the point. + * @param {number} defaultIfNotLoaded Value that is returned if the dem tile of the provided point is not loaded. + * @returns {number} Altitude in meters. + */ + getAtPointOrZero(point , defaultIfNotLoaded = 0) { + return this.getAtPoint(point, defaultIfNotLoaded) || 0; + } - return [sx, sy, sz]; -} + /** + * Altitude above sea level in meters at specified point. + * @param {MercatorCoordinate} point Mercator coordinate of the point. + * @param {number} defaultIfNotLoaded Value that is returned if the DEM tile of the provided point is not loaded. + * @param {boolean} exaggerated `true` if styling exaggeration should be applied to the resulting elevation. + * @returns {number} Altitude in meters. + * If there is no loaded tile that carries information for the requested + * point elevation, returns `defaultIfNotLoaded`. + * Doesn't invoke network request to fetch the data. + */ + getAtPoint(point , defaultIfNotLoaded , exaggerated = true) { + // Force a cast to null for both null and undefined + if (defaultIfNotLoaded == null) defaultIfNotLoaded = null; -function latLngToECEF(lat , lng , radius ) { - return csLatLngToECEF(Math.cos(degToRad(lat)), Math.sin(degToRad(lat)), lng, radius); -} + const src = this._source(); + if (!src) return defaultIfNotLoaded; + if (point.y < 0.0 || point.y > 1.0) { + return defaultIfNotLoaded; + } + const cache = src; + const z = cache.getSource().maxzoom; + const tiles = 1 << z; + const wrap = Math.floor(point.x); + const px = point.x - wrap; + const tileID = new OverscaledTileID(z, wrap, z, Math.floor(px * tiles), Math.floor(point.y * tiles)); + const demTile = this.findDEMTileFor(tileID); + if (!(demTile && demTile.dem)) { return defaultIfNotLoaded; } + const dem = demTile.dem; + const tilesAtTileZoom = 1 << demTile.tileID.canonical.z; + const x = (px * tilesAtTileZoom - demTile.tileID.canonical.x) * dem.dim; + const y = (point.y * tilesAtTileZoom - demTile.tileID.canonical.y) * dem.dim; + const i = Math.floor(x); + const j = Math.floor(y); + const exaggeration = exaggerated ? this.exaggeration() : 1; -function globeECEFNormalizationScale(bounds ) { - const maxExt = Math.max(...sub$4([], bounds.max, bounds.min)); - return GLOBE_NORMALIZATION_MASK / maxExt; -} + return exaggeration * number( + number(dem.get(i, j), dem.get(i, j + 1), y - j), + number(dem.get(i + 1, j), dem.get(i + 1, j + 1), y - j), + x - i); + } -function globeNormalizeECEF(bounds ) { - const m = identity$3(new Float64Array(16)); - const scale = globeECEFNormalizationScale(bounds); - scale$3(m, m, [scale, scale, scale]); - translate$2(m, m, negate([], bounds.min)); - return m; -} + /* + * x and y are offset within tile, in 0 .. EXTENT coordinate space. + */ + getAtTileOffset(tileID , x , y ) { + const tilesAtTileZoom = 1 << tileID.canonical.z; + return this.getAtPointOrZero(new MercatorCoordinate( + tileID.wrap + (tileID.canonical.x + x / EXTENT) / tilesAtTileZoom, + (tileID.canonical.y + y / EXTENT) / tilesAtTileZoom)); + } -function globeDenormalizeECEF(bounds ) { - const m = identity$3(new Float64Array(16)); - const scale = 1.0 / globeECEFNormalizationScale(bounds); - translate$2(m, m, bounds.min); - scale$3(m, m, [scale, scale, scale]); - return m; -} + getAtTileOffsetFunc(tileID , lat , worldSize , projection ) { + return (p => { + const elevation = this.getAtTileOffset(tileID, p.x, p.y); + const upVector = projection.upVector(tileID.canonical, p.x, p.y); + const upVectorScale = projection.upVectorScale(tileID.canonical, lat, worldSize).metersToTile; + // $FlowFixMe can't yet resolve tuple vs array incompatibilities + scale$4(upVector, upVector, elevation * upVectorScale); + return upVector; + }); + } -function globeECEFUnitsToPixelScale(worldSize ) { - const localRadius = EXTENT$1 / (2.0 * Math.PI); - const wsRadius = worldSize / (2.0 * Math.PI); - return wsRadius / localRadius; -} + /* + * Batch fetch for multiple tile points: points holds input and return value: + * vec3's items on index 0 and 1 define x and y offset within tile, in [0 .. EXTENT] + * range, respectively. vec3 item at index 2 is output value, in meters. + * If a DEM tile that covers tileID is loaded, true is returned, otherwise false. + * Nearest filter sampling on dem data is done (no interpolation). + */ + getForTilePoints(tileID , points , interpolated , useDemTile ) { + const helper = DEMSampler.create(this, tileID, useDemTile); + if (!helper) { return false; } -function calculateGlobeMatrix(tr , worldSize , offset ) { - const wsRadius = worldSize / (2.0 * Math.PI); - const scale = globeECEFUnitsToPixelScale(worldSize); + points.forEach(p => { + p[2] = this.exaggeration() * helper.getElevationAt(p[0], p[1], interpolated); + }); + return true; + } - if (!offset) { - const lat = clamp(tr.center.lat, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); - const lng = tr.center.lng; + /** + * Get elevation minimum and maximum for tile identified by `tileID`. + * @param {OverscaledTileID} tileID The `tileId` is a sub tile (or covers the same space) of the DEM tile we read the information from. + * @returns {?{min: number, max: number}} The min and max elevation. + */ + getMinMaxForTile(tileID ) { + const demTile = this.findDEMTileFor(tileID); + if (!(demTile && demTile.dem)) { return null; } + const dem = demTile.dem; + const tree = dem.tree; + const demTileID = demTile.tileID; + const scale = 1 << tileID.canonical.z - demTileID.canonical.z; + let xOffset = tileID.canonical.x / scale - demTileID.canonical.x; + let yOffset = tileID.canonical.y / scale - demTileID.canonical.y; + let index = 0; // Start from DEM tree root. + for (let i = 0; i < tileID.canonical.z - demTileID.canonical.z; i++) { + if (tree.leaves[index]) break; + xOffset *= 2; + yOffset *= 2; + const childOffset = 2 * Math.floor(yOffset) + Math.floor(xOffset); + index = tree.childOffsets[index] + childOffset; + xOffset = xOffset % 1; + yOffset = yOffset % 1; + } + return {min: this.exaggeration() * tree.minimums[index], max: this.exaggeration() * tree.maximums[index]}; + } - offset = [ - mercatorXfromLng$1(lng) * worldSize, - mercatorYfromLat$1(lat) * worldSize - ]; + /** + * Get elevation minimum below MSL for the visible tiles. This function accounts + * for terrain exaggeration and is conservative based on the maximum DEM error, + * do not expect accurate values from this function. + * If no negative elevation is visible, this function returns 0. + * @returns {number} The min elevation below sea level of all visible tiles. + */ + getMinElevationBelowMSL() { + throw new Error('Pure virtual method called.'); } - // transform the globe from reference coordinate space to world space - const posMatrix = identity$3(new Float64Array(16)); - translate$2(posMatrix, posMatrix, [offset[0], offset[1], -wsRadius]); - scale$3(posMatrix, posMatrix, [scale, scale, scale]); - rotateX(posMatrix, posMatrix, degToRad(-tr._center.lat)); - rotateY(posMatrix, posMatrix, degToRad(-tr._center.lng)); + /** + * Performs raycast against visible DEM tiles on the screen and returns the distance travelled along the ray. + * `x` & `y` components of the position are expected to be in normalized mercator coordinates [0, 1] and z in meters. + * @param {vec3} position The ray origin. + * @param {vec3} dir The ray direction. + * @param {number} exaggeration The terrain exaggeration. + */ + raycast(position , dir , exaggeration ) { + throw new Error('Pure virtual method called.'); + } - return posMatrix; -} + /** + * Given a point on screen, returns 3D MercatorCoordinate on terrain. + * Helper function that wraps `raycast`. + * + * @param {Point} screenPoint Screen point in pixels in top-left origin coordinate system. + * @returns {vec3} If there is intersection with terrain, returns 3D MercatorCoordinate's of + * intersection, as vec3(x, y, z), otherwise null. + */ /* eslint no-unused-vars: ["error", { "args": "none" }] */ + pointCoordinate(screenPoint ) { + throw new Error('Pure virtual method called.'); + } -function calculateGlobeMercatorMatrix(tr ) { - const worldSize = tr.worldSize; - const lat = clamp(tr.center.lat, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); - const point = new pointGeometry( - mercatorXfromLng$1(tr.center.lng) * worldSize, - mercatorYfromLat$1(lat) * worldSize); + /* + * Implementation provides SourceCache of raster-dem source type cache, in + * order to access already loaded cached tiles. + */ + _source() { + throw new Error('Pure virtual method called.'); + } - const mercatorZ = mercatorZfromAltitude(1, tr.center.lat) * worldSize; - const projectionScaler = mercatorZ / tr.pixelsPerMeter; - const zScale = tr.pixelsPerMeter; - const ws = worldSize / projectionScaler; + /* + * A multiplier defined by style as terrain exaggeration. Elevation provided + * by getXXXX methods is multiplied by this. + */ + exaggeration() { + throw new Error('Pure virtual method called.'); + } - const posMatrix = identity$3(new Float64Array(16)); - translate$2(posMatrix, posMatrix, [point.x, point.y, 0.0]); - scale$3(posMatrix, posMatrix, [ws, ws, zScale]); + /** + * Lookup DEM tile that corresponds to (covers) tileID. + * @private + */ + findDEMTileFor(_ ) { + throw new Error('Pure virtual method called.'); + } - return posMatrix; + /** + * Get list of DEM tiles used to render current frame. + * @private + */ + get visibleDemTiles() { + throw new Error('Getter must be implemented in subclass.'); + } } -const GLOBE_ZOOM_THRESHOLD_MIN = 5; -const GLOBE_ZOOM_THRESHOLD_MAX = 6; +/** + * Helper class computes and caches data required to lookup elevation offsets at the tile level. + */ +class DEMSampler { + + + + -function globeToMercatorTransition(zoom ) { - return smoothstep(GLOBE_ZOOM_THRESHOLD_MIN, GLOBE_ZOOM_THRESHOLD_MAX, zoom); -} + constructor(demTile , scale , offset ) { + this._demTile = demTile; + // demTile.dem will always exist because the factory method `create` does the check + // Make flow happy with a cast through any + this._dem = (((this._demTile.dem) ) ); + this._scale = scale; + this._offset = offset; + } -function globeBuffersForTileMesh(painter , tile , coord , tiles ) { - const context = painter.context; - const id = coord.canonical; - const tr = painter.transform; - let gridBuffer = tile.globeGridBuffer; - let poleBuffer = tile.globePoleBuffer; + static create(elevation , tileID , useDemTile ) { + const demTile = useDemTile || elevation.findDEMTileFor(tileID); + if (!(demTile && demTile.dem)) { return; } + const dem = demTile.dem; + const demTileID = demTile.tileID; + const scale = 1 << tileID.canonical.z - demTileID.canonical.z; + const xOffset = (tileID.canonical.x / scale - demTileID.canonical.x) * dem.dim; + const yOffset = (tileID.canonical.y / scale - demTileID.canonical.y) * dem.dim; + const k = demTile.tileSize / EXTENT / scale; - if (!gridBuffer) { - const gridMesh = GlobeSharedBuffers.createGridVertices(id); - gridBuffer = tile.globeGridBuffer = context.createVertexBuffer(gridMesh, members$5, false); + return new DEMSampler(demTile, k, [xOffset, yOffset]); } - if (!poleBuffer) { - const poleMesh = GlobeSharedBuffers.createPoleTriangleVertices(tiles, tr.tileSize * tiles, coord.canonical.y === 0); - poleBuffer = tile.globePoleBuffer = context.createVertexBuffer(poleMesh, members$5, false); + tileCoordToPixel(x , y ) { + const px = x * this._scale + this._offset[0]; + const py = y * this._scale + this._offset[1]; + const i = Math.floor(px); + const j = Math.floor(py); + return new pointGeometry(i, j); } - return [gridBuffer, poleBuffer]; -} - -function globeMatrixForTile(id , globeMatrix ) { - const decode = globeDenormalizeECEF(globeTileBounds(id)); - const posMatrix = copy$3(new Float64Array(16), globeMatrix); - mul$3(posMatrix, posMatrix, decode); - return posMatrix; -} - -function globePoleMatrixForTile(id , south , tr ) { - const poleMatrix = identity$3(new Float64Array(16)); + getElevationAt(x , y , interpolated , clampToEdge ) { + const px = x * this._scale + this._offset[0]; + const py = y * this._scale + this._offset[1]; + const i = Math.floor(px); + const j = Math.floor(py); + const dem = this._dem; - const tileDim = Math.pow(2, id.z); - const xOffset = id.x - tileDim / 2; - const yRotation = xOffset / tileDim * Math.PI * 2.0; + clampToEdge = !!clampToEdge; - const point = tr.point; - const ws = tr.worldSize; - const s = tr.worldSize / (tr.tileSize * tileDim); + return interpolated ? number( + number(dem.get(i, j, clampToEdge), dem.get(i, j + 1, clampToEdge), py - j), + number(dem.get(i + 1, j, clampToEdge), dem.get(i + 1, j + 1, clampToEdge), py - j), + px - i) : + dem.get(i, j, clampToEdge); + } - translate$2(poleMatrix, poleMatrix, [point.x, point.y, -(ws / Math.PI / 2.0)]); - scale$3(poleMatrix, poleMatrix, [s, s, s]); - rotateX(poleMatrix, poleMatrix, degToRad(-tr._center.lat)); - rotateY(poleMatrix, poleMatrix, degToRad(-tr._center.lng)); - rotateY(poleMatrix, poleMatrix, yRotation); - if (south) { - scale$3(poleMatrix, poleMatrix, [1, -1, 1]); + getElevationAtPixel(x , y , clampToEdge ) { + return this._dem.get(x, y, !!clampToEdge); } - return poleMatrix; + getMeterToDEM(lat ) { + return (1 << this._demTile.tileID.canonical.z) * mercatorZfromAltitude(1, lat) * this._dem.stride; + } } -class GlobeSharedBuffers { - - +// - - + + + + + + + + - + + + + + + + + + - - - - constructor(context ) { - const gridIndices = this._createGridIndices(); - this.gridIndexBuffer = context.createIndexBuffer(gridIndices, true); - - const gridPrimitives = GLOBE_VERTEX_GRID_SIZE * GLOBE_VERTEX_GRID_SIZE * 2; - const gridVertices = (GLOBE_VERTEX_GRID_SIZE + 1) * (GLOBE_VERTEX_GRID_SIZE + 1); - this.gridSegments = SegmentVector.simpleSegment(0, 0, gridVertices, gridPrimitives); - - const poleIndices = this._createPoleTriangleIndices(); - this.poleIndexBuffer = context.createIndexBuffer(poleIndices, true); - - const polePrimitives = GLOBE_VERTEX_GRID_SIZE; - const poleVertices = GLOBE_VERTEX_GRID_SIZE + 2; - this.poleSegments = SegmentVector.simpleSegment(0, 0, poleVertices, polePrimitives); + - const atmosphereVertices = new StructArrayLayout7f28(); - atmosphereVertices.emplaceBack(-1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0); - atmosphereVertices.emplaceBack(1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0); - atmosphereVertices.emplaceBack(1.0, -1.0, 1.0, 0.0, 0.0, 1.0, 1.0); - atmosphereVertices.emplaceBack(-1.0, -1.0, 1.0, 0.0, 0.0, 0.0, 1.0); + + + + + + - const atmosphereTriangles = new StructArrayLayout3ui6(); - atmosphereTriangles.emplaceBack(0, 1, 2); - atmosphereTriangles.emplaceBack(2, 3, 0); +class FeatureIndex { + + + + + + + - this.atmosphereVertexBuffer = context.createVertexBuffer(atmosphereVertices, atmosphereLayout.members); - this.atmosphereIndexBuffer = context.createIndexBuffer(atmosphereTriangles); - this.atmosphereSegments = SegmentVector.simpleSegment(0, 0, 4, 2); - } + + - destroy() { - this.poleIndexBuffer.destroy(); - this.gridIndexBuffer.destroy(); - this.poleSegments.destroy(); - this.gridSegments.destroy(); - this.atmosphereVertexBuffer.destroy(); - this.atmosphereIndexBuffer.destroy(); - this.atmosphereSegments.destroy(); + + + - if (this.wireframeIndexBuffer) { - this.wireframeIndexBuffer.destroy(); - this.wireframeSegments.destroy(); - } + constructor(tileID , promoteId ) { + this.tileID = tileID; + this.x = tileID.canonical.x; + this.y = tileID.canonical.y; + this.z = tileID.canonical.z; + this.grid = new gridIndex(EXTENT, 16, 0); + this.featureIndexArray = new FeatureIndexArray(); + this.promoteId = promoteId; } - static createPoleTriangleVertices(tiles , ws , isTopCap ) { - const lerp = (a, b, t) => a * (1 - t) + b * t; - const arr = new StructArrayLayout7f28(); - const radius = ws / Math.PI / 2.0; + insert(feature , geometry , featureIndex , sourceLayerIndex , bucketIndex , layoutVertexArrayOffset = 0) { + const key = this.featureIndexArray.length; + this.featureIndexArray.emplaceBack(featureIndex, sourceLayerIndex, bucketIndex, layoutVertexArrayOffset); - // Place the tip - arr.emplaceBack(0, -radius, 0, 0, 0, 0.5, isTopCap ? 0.0 : 1.0); + const grid = this.grid; - const startAngle = 0; - const endAngle = 360.0 / tiles; - const cosLat = Math.cos(degToRad(85.0)); - const sinLat = Math.sin(degToRad(85.0)); + for (let r = 0; r < geometry.length; r++) { + const ring = geometry[r]; - for (let i = 0; i <= GLOBE_VERTEX_GRID_SIZE; i++) { - const uvX = i / GLOBE_VERTEX_GRID_SIZE; - const angle = lerp(startAngle, endAngle, uvX); - const p = csLatLngToECEF(cosLat, sinLat, angle, radius); + const bbox = [Infinity, Infinity, -Infinity, -Infinity]; + for (let i = 0; i < ring.length; i++) { + const 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); + } - arr.emplaceBack(p[0], p[1], p[2], 0, 0, uvX, isTopCap ? 0.0 : 1.0); + if (bbox[0] < EXTENT && + bbox[1] < EXTENT && + bbox[2] >= 0 && + bbox[3] >= 0) { + grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]); + } } - - return arr; } - _createPoleTriangleIndices() { - const arr = new StructArrayLayout3ui6(); - for (let i = 0; i <= GLOBE_VERTEX_GRID_SIZE; i++) { - arr.emplaceBack(0, i + 1, i + 2); + loadVTLayers() { + if (!this.vtLayers) { + this.vtLayers = new vectorTile.VectorTile(new pbf(this.rawTileData)).layers; + this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']); + this.vtFeatures = {}; + for (const layer in this.vtLayers) { + this.vtFeatures[layer] = []; + } } - return arr; + return this.vtLayers; } - static createGridVertices(id ) { - const tiles = Math.pow(2, id.z); - const lerp = (a, b, t) => a * (1 - t) + b * t; - const [latLngTL, latLngBR] = globeTileLatLngCorners(id); - const boundsArray = new StructArrayLayout7f28(); - - const norm = globeNormalizeECEF(globeTileBounds(id)); - - const vertexExt = GLOBE_VERTEX_GRID_SIZE + 1; - boundsArray.reserve(GLOBE_VERTEX_GRID_SIZE * GLOBE_VERTEX_GRID_SIZE); - - for (let y = 0; y < vertexExt; y++) { - const lat = lerp(latLngTL[0], latLngBR[0], y / GLOBE_VERTEX_GRID_SIZE); - const mercatorY = mercatorYfromLat$1(lat); - const uvY = (mercatorY * tiles) - id.y; - const sinLat = Math.sin(degToRad(lat)); - const cosLat = Math.cos(degToRad(lat)); - for (let x = 0; x < vertexExt; x++) { - const uvX = x / GLOBE_VERTEX_GRID_SIZE; - const lng = lerp(latLngTL[1], latLngBR[1], uvX); - - const pGlobe = csLatLngToECEF(cosLat, sinLat, lng); - transformMat4(pGlobe, pGlobe, norm); + // Finds non-symbol features in this tile at a particular position. + query(args , styleLayers , serializedLayers , sourceFeatureState ) { + this.loadVTLayers(); + const params = args.params || {}, + filter = createFilter(params.filter); + const tilespaceGeometry = args.tileResult; + const transform = args.transform; - const mercatorX = mercatorXfromLng$1(lng); + const bounds = tilespaceGeometry.bufferedTilespaceBounds; + const queryPredicate = (bx1, by1, bx2, by2) => { + return polygonIntersectsBox(tilespaceGeometry.bufferedTilespaceGeometry, bx1, by1, bx2, by2); + }; + const matching = this.grid.query(bounds.min.x, bounds.min.y, bounds.max.x, bounds.max.y, queryPredicate); + matching.sort(topDownFeatureComparator); - boundsArray.emplaceBack(pGlobe[0], pGlobe[1], pGlobe[2], mercatorX, mercatorY, uvX, uvY); - } + let elevationHelper = null; + if (transform.elevation && matching.length > 0) { + elevationHelper = DEMSampler.create(transform.elevation, this.tileID); } - return boundsArray; - } + const result = {}; + let previousIndex; + for (let k = 0; k < matching.length; k++) { + const index = matching[k]; - _createGridIndices() { - const indexArray = new StructArrayLayout3ui6(); - const quadExt = GLOBE_VERTEX_GRID_SIZE; - const vertexExt = quadExt + 1; - const quad = (i, j) => { - const index = j * vertexExt + i; - indexArray.emplaceBack(index + 1, index, index + vertexExt); - indexArray.emplaceBack(index + vertexExt, index + vertexExt + 1, index + 1); - }; - for (let j = 0; j < quadExt; j++) { - for (let i = 0; i < quadExt; i++) { - quad(i, j); - } - } - return indexArray; - } + // don't check the same feature more than once + if (index === previousIndex) continue; + previousIndex = index; - getWirefameBuffer(context ) { - if (!this.wireframeSegments) { - const wireframeGridIndices = this._createWireframeGrid(); - this.wireframeIndexBuffer = context.createIndexBuffer(wireframeGridIndices); + const match = this.featureIndexArray.get(index); + let featureGeometry = null; + this.loadMatchingFeature( + result, + match, + filter, + params.layers, + params.availableImages, + styleLayers, + serializedLayers, + sourceFeatureState, + (feature , styleLayer , featureState , layoutVertexArrayOffset = 0) => { + if (!featureGeometry) { + featureGeometry = loadGeometry(feature, this.tileID.canonical, args.tileTransform); + } - const vertexBufferLength = GLOBE_VERTEX_GRID_SIZE * GLOBE_VERTEX_GRID_SIZE; - this.wireframeSegments = SegmentVector.simpleSegment(0, 0, vertexBufferLength, wireframeGridIndices.length); + return styleLayer.queryIntersectsFeature(tilespaceGeometry, feature, featureState, featureGeometry, this.z, args.transform, args.pixelPosMatrix, elevationHelper, layoutVertexArrayOffset); + } + ); } - return [this.wireframeIndexBuffer, this.wireframeSegments]; + + return result; } - _createWireframeGrid() { - const indexArray = new StructArrayLayout2ui4(); + loadMatchingFeature( + result , + featureIndexData , + filter , + filterLayerIDs , + availableImages , + styleLayers , + serializedLayers , + sourceFeatureState , + intersectionTest ) { - const quadExt = GLOBE_VERTEX_GRID_SIZE; - const vertexExt = quadExt + 1; + const {featureIndex, bucketIndex, sourceLayerIndex, layoutVertexArrayOffset} = featureIndexData; + const layerIDs = this.bucketLayerIDs[bucketIndex]; + if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) + return; - const quad = (i, j) => { - const index = j * vertexExt + i; - indexArray.emplaceBack(index, index + 1); - indexArray.emplaceBack(index, index + vertexExt); - indexArray.emplaceBack(index, index + vertexExt + 1); - }; + const sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex); + const sourceLayer = this.vtLayers[sourceLayerName]; + const feature = sourceLayer.feature(featureIndex); - for (let j = 0; j < quadExt; j++) { - for (let i = 0; i < quadExt; i++) { - quad(i, j); + if (filter.needGeometry) { + const evaluationFeature = toEvaluationFeature(feature, true); + if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) { + return; } + } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { + return; } - return indexArray; - } -} - -// - - - - - - - - - - -function tileTransform(id , projection ) { - if (!projection.isReprojectedInTileSpace) { - return {scale: 1 << id.z, x: id.x, y: id.y, x2: id.x + 1, y2: id.y + 1, projection}; - } + const id = this.getId(feature, sourceLayerName); - const s = Math.pow(2, -id.z); + for (let l = 0; l < layerIDs.length; l++) { + const layerID = layerIDs[l]; - const x1 = (id.x) * s; - const x2 = (id.x + 1) * s; - const y1 = (id.y) * s; - const y2 = (id.y + 1) * s; + if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) { + continue; + } - const lng1 = lngFromMercatorX(x1); - const lng2 = lngFromMercatorX(x2); - const lat1 = latFromMercatorY(y1); - const lat2 = latFromMercatorY(y2); + const styleLayer = styleLayers[layerID]; - const p0 = projection.project(lng1, lat1); - const p1 = projection.project(lng2, lat1); - const p2 = projection.project(lng2, lat2); - const p3 = projection.project(lng1, lat2); + if (!styleLayer) continue; - let minX = Math.min(p0.x, p1.x, p2.x, p3.x); - let minY = Math.min(p0.y, p1.y, p2.y, p3.y); - let maxX = Math.max(p0.x, p1.x, p2.x, p3.x); - let maxY = Math.max(p0.y, p1.y, p2.y, p3.y); + let featureState = {}; + if (id !== undefined && sourceFeatureState) { + // `feature-state` expression evaluation requires feature state to be available + featureState = sourceFeatureState.getState(styleLayer.sourceLayer || '_geojsonTileLayer', id); + } - // we pick an error threshold for calculating the bbox that balances between performance and precision - const maxErr = s / 16; + const serializedLayer = extend$1({}, serializedLayers[layerID]); - function processSegment(pa, pb, ax, ay, bx, by) { - const mx = (ax + bx) / 2; - const my = (ay + by) / 2; + serializedLayer.paint = evaluateProperties(serializedLayer.paint, styleLayer.paint, feature, featureState, availableImages); + serializedLayer.layout = evaluateProperties(serializedLayer.layout, styleLayer.layout, feature, featureState, availableImages); - const pm = projection.project(lngFromMercatorX(mx), latFromMercatorY(my)); - const err = Math.max(0, minX - pm.x, minY - pm.y, pm.x - maxX, pm.y - maxY); + const intersectionZ = !intersectionTest || intersectionTest(feature, styleLayer, featureState, layoutVertexArrayOffset); + if (!intersectionZ) { + // Only applied for non-symbol features + continue; + } - minX = Math.min(minX, pm.x); - maxX = Math.max(maxX, pm.x); - minY = Math.min(minY, pm.y); - maxY = Math.max(maxY, pm.y); + const geojsonFeature = new Feature(feature, this.z, this.x, this.y, id); + geojsonFeature.layer = serializedLayer; + let layerResult = result[layerID]; + if (layerResult === undefined) { + layerResult = result[layerID] = []; + } - if (err > maxErr) { - processSegment(pa, pm, ax, ay, mx, my); - processSegment(pm, pb, mx, my, bx, by); + layerResult.push({featureIndex, feature: geojsonFeature, intersectionZ}); } } - processSegment(p0, p1, x1, y1, x2, y1); - processSegment(p1, p2, x2, y1, x2, y2); - processSegment(p2, p3, x2, y2, x1, y2); - processSegment(p3, p0, x1, y2, x1, y1); - - // extend the bbox by max error to make sure coords don't go past tile extent - minX -= maxErr; - minY -= maxErr; - maxX += maxErr; - maxY += maxErr; + // Given a set of symbol indexes that have already been looked up, + // return a matching set of GeoJSONFeatures + lookupSymbolFeatures(symbolFeatureIndexes , + serializedLayers , + bucketIndex , + sourceLayerIndex , + filterSpec , + filterLayerIDs , + availableImages , + styleLayers ) { + const result = {}; + this.loadVTLayers(); - const max = Math.max(maxX - minX, maxY - minY); - const scale = 1 / max; + const filter = createFilter(filterSpec); - return { - scale, - x: minX * scale, - y: minY * scale, - x2: maxX * scale, - y2: maxY * scale, - projection - }; -} + for (const symbolFeatureIndex of symbolFeatureIndexes) { + this.loadMatchingFeature( + result, { + bucketIndex, + sourceLayerIndex, + featureIndex: symbolFeatureIndex, + layoutVertexArrayOffset: 0 + }, + filter, + filterLayerIDs, + availableImages, + styleLayers, + serializedLayers + ); -function tileAABB(tr , numTiles , z , x , y , wrap , min$1 , max$1 , projection ) { - if (projection.name === 'globe') { - const tileId = new UnwrappedTileID(wrap, new CanonicalTileID(z, x, y)); - const aabb = globeTileBounds(tileId.canonical); + } + return result; + } - // Transform corners of the aabb to the correct space - const corners = aabb.getCorners(); + loadFeature(featureIndexData ) { + const {featureIndex, sourceLayerIndex} = featureIndexData; - const mx = Number.MAX_VALUE; - const cornerMax = [-mx, -mx, -mx]; - const cornerMin = [mx, mx, mx]; - const globeMatrix = calculateGlobeMatrix(tr, numTiles); + this.loadVTLayers(); + const sourceLayerName = this.sourceLayerCoder.decode(sourceLayerIndex); - for (let i = 0; i < corners.length; i++) { - transformMat4(corners[i], corners[i], globeMatrix); - min(cornerMin, cornerMin, corners[i]); - max(cornerMax, cornerMax, corners[i]); + const featureCache = this.vtFeatures[sourceLayerName]; + if (featureCache[featureIndex]) { + return featureCache[featureIndex]; } + const sourceLayer = this.vtLayers[sourceLayerName]; + const feature = sourceLayer.feature(featureIndex); + featureCache[featureIndex] = feature; - return new Aabb(cornerMin, cornerMax); + return feature; } - const tt = tileTransform({z, x, y}, projection); - const tx = tt.x / tt.scale; - const ty = tt.y / tt.scale; - const tx2 = tt.x2 / tt.scale; - const ty2 = tt.y2 / tt.scale; + hasLayer(id ) { + for (const layerIDs of this.bucketLayerIDs) { + for (const layerID of layerIDs) { + if (id === layerID) return true; + } + } - if (isNaN(tx) || isNaN(tx2) || isNaN(ty) || isNaN(ty2)) { - assert_1(false); + return false; } - return new Aabb( - [(wrap + tx) * numTiles, numTiles * ty, min$1], - [(wrap + tx2) * numTiles, numTiles * ty2, max$1]); + getId(feature , sourceLayerId ) { + let id = feature.id; + if (this.promoteId) { + const propName = typeof this.promoteId === 'string' ? this.promoteId : this.promoteId[sourceLayerId]; + id = feature.properties[propName]; + if (typeof id === 'boolean') id = Number(id); + } + return id; + } } -function getTilePoint(tileTransform , {x, y} , wrap = 0) { - return new pointGeometry( - ((x - wrap) * tileTransform.scale - tileTransform.x) * EXTENT$1, - (y * tileTransform.scale - tileTransform.y) * EXTENT$1); +register(FeatureIndex, 'FeatureIndex', {omit: ['rawTileData', 'sourceLayerCoder']}); + +function evaluateProperties(serializedProperties, styleLayerProperties, feature, featureState, availableImages) { + return mapObject(serializedProperties, (property, key) => { + const prop = styleLayerProperties instanceof PossiblyEvaluated ? styleLayerProperties.get(key) : null; + return prop && prop.evaluate ? prop.evaluate(feature, featureState, availableImages) : prop; + }); } -function getTileVec3(tileTransform , coord , wrap = 0) { - const x = ((coord.x - wrap) * tileTransform.scale - tileTransform.x) * EXTENT$1; - const y = (coord.y * tileTransform.scale - tileTransform.y) * EXTENT$1; - return fromValues$4(x, y, altitudeFromMercatorZ(coord.z, coord.y)); +function topDownFeatureComparator(a, b) { + return b - a; } // @@ -41623,16 +44114,17 @@ class GlyphAtlas { } } -register('GlyphAtlas', GlyphAtlas); +register(GlyphAtlas, 'GlyphAtlas'); // - + + @@ -41664,7 +44156,7 @@ class WorkerTile { - + constructor(params ) { @@ -41770,9 +44262,11 @@ class WorkerTile { sourceLayerIndex, sourceID: this.source, enableTerrain: this.enableTerrain, + projection: this.projection.spec, availableImages }); + assert_1(this.tileTransform.projection.name === this.projection.name); bucket.populate(features, options, this.tileID.canonical, this.tileTransform); featureIndex.bucketLayerIDs.push(family.map((l) => l.id)); } @@ -41839,7 +44333,7 @@ class WorkerTile { for (const key in buckets) { const bucket = buckets[key]; - if (bucket instanceof SymbolBucket) { + if (bucket instanceof SymbolBucket$1) { recalculateLayers(bucket.layers, this.zoom, availableImages); performSymbolLayout(bucket, glyphMap, @@ -41851,13 +44345,14 @@ class WorkerTile { this.tileID.canonical, this.tileZoom, this.projection); - bucket.projection = this.projection.name; } else if (bucket.hasPattern && (bucket instanceof LineBucket || bucket instanceof FillBucket || bucket instanceof FillExtrusionBucket)) { recalculateLayers(bucket.layers, this.zoom, availableImages); - bucket.addFeatures(options, this.tileID.canonical, imageAtlas.patternPositions, availableImages); + // $FlowFixMe[incompatible-type] Flow can't interpret ImagePosition as SpritePosition for some reason here + const imagePositions = imageAtlas.patternPositions; + bucket.addFeatures(options, this.tileID.canonical, imagePositions, availableImages, this.tileTransform); } } @@ -41930,7 +44425,7 @@ class DedupedRequest { this.scheduler = scheduler; } - request(key , metadata , request , callback ) { + request(key , metadata , request , callback ) { const entry = this.entries[key] = this.entries[key] || {callbacks: []}; if (entry.result) { @@ -41977,7 +44472,7 @@ class DedupedRequest { /** * @private */ -function loadVectorTile(params , callback , skipParse ) { +function loadVectorTile(params , callback , skipParse ) { const key = JSON.stringify(params.request); const makeRequest = (callback) => { @@ -42001,11 +44496,11 @@ function loadVectorTile(params , callback if (params.data) { // if we already got the result earlier (on the main thread), return it directly - this.deduped.entries[key] = {result: [null, params.data]}; + (this.deduped ).entries[key] = {result: [null, params.data]}; } const callbackMetadata = {type: 'parseTile', isSymbolTile: params.isSymbolTile, zoom: params.tileZoom}; - return this.deduped.request(key, callbackMetadata, makeRequest, callback); + return (this.deduped ).request(key, callbackMetadata, makeRequest, callback); } /** @@ -42095,7 +44590,7 @@ class VectorTileWorkerSource extends Evented { resourceTiming.resourceTiming = JSON.parse(JSON.stringify(resourceTimingData)); } } - callback(null, extend({rawTileData: rawTileData.slice(0)}, result, cacheControl, resourceTiming)); + callback(null, extend$1({rawTileData: rawTileData.slice(0)}, result, cacheControl, resourceTiming)); }); }; @@ -42130,6 +44625,7 @@ class VectorTileWorkerSource extends Evented { workerTile.showCollisionBoxes = params.showCollisionBoxes; workerTile.enableTerrain = !!params.enableTerrain; workerTile.projection = params.projection; + workerTile.tileTransform = tileTransform(params.tileID.canonical, params.projection); const done = (err, data) => { const reloadCallback = workerTile.reloadCallback; @@ -42187,22263 +44683,23273 @@ class VectorTileWorkerSource extends Evented { } } -var refProperties = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout']; - -// - -const identity$6 = identity$3(new Float64Array(16)); - -class FlatTileTransform { - - - - - constructor(tr , worldSize ) { - this._tr = tr; - this._worldSize = worldSize; - } - - createInversionMatrix() { - return identity$6; - } - - createTileMatrix(id ) { - let scale, scaledX, scaledY; - const canonical = id.canonical; - const posMatrix = identity$3(new Float64Array(16)); - const projection = this._tr.projection; - - if (projection.isReprojectedInTileSpace) { - const cs = tileTransform(canonical, projection); - scale = 1; - scaledX = cs.x + id.wrap * cs.scale; - scaledY = cs.y; - scale$3(posMatrix, posMatrix, [scale / cs.scale, scale / cs.scale, this._tr.pixelsPerMeter / this._worldSize]); - } else { - scale = this._worldSize / this._tr.zoomScale(canonical.z); - const unwrappedX = canonical.x + Math.pow(2, canonical.z) * id.wrap; - scaledX = unwrappedX * scale; - scaledY = canonical.y * scale; - } - - translate$2(posMatrix, posMatrix, [scaledX, scaledY, 0]); - scale$3(posMatrix, posMatrix, [scale / EXTENT$1, scale / EXTENT$1, 1]); - - return posMatrix; - } - - pointCoordinate(x , y , z ) { - const horizonOffset = this._tr.horizonLineFromTop(false); - const clamped = new pointGeometry(x, Math.max(horizonOffset, y)); - return this._tr.rayIntersectionCoordinate(this._tr.pointRayIntersection(clamped, z)); - } - - upVector() { - return [0, 0, 1]; - } - - upVectorScale() { - return 1; - } -} - -// - -var albers = { - name: 'albers', - range: [4, 7], - center: [-96, 37.5], - parallels: [29.5, 45.5], - zAxisUnit: "meters", - conic: true, - isReprojectedInTileSpace: true, - unsupportedLayers: ['custom'], - - // based on https://github.com/d3/d3-geo-projection, MIT-licensed - - initializeConstants() { - if (this.constants && exactEquals$8(this.parallels, this.constants.parallels)) { - return; - } - - const sy0 = Math.sin(degToRad(this.parallels[0])); - const n = (sy0 + Math.sin(degToRad(this.parallels[1]))) / 2; - const c = 1 + sy0 * (2 * n - sy0); - const r0 = Math.sqrt(c) / n; - - this.constants = {n, c, r0, parallels: this.parallels}; - }, - - project(lng , lat ) { - this.initializeConstants(); - - const lambda = degToRad(lng - this.center[0]); - const phi = degToRad(lat); - - const {n, c, r0} = this.constants; - const r = Math.sqrt(c - 2 * n * Math.sin(phi)) / n; - const x = r * Math.sin(lambda * n); - const y = r * Math.cos(lambda * n) - r0; - return {x, y, z: 0}; - }, - - unproject(x , y ) { - this.initializeConstants(); - const {n, c, r0} = this.constants; - - const r0y = r0 + y; - let l = Math.atan2(x, Math.abs(r0y)) * Math.sign(r0y); - if (r0y * n < 0) { - l -= Math.PI * Math.sign(x) * Math.sign(r0y); - } - const dt = degToRad(this.center[0]) * n; - l = wrap(l, -Math.PI - dt, Math.PI - dt); - - const lng = radToDeg(l / n) + this.center[0]; - const phi = Math.asin(clamp((c - (x * x + r0y * r0y) * n * n) / (2 * n), -1, 1)); - const lat = clamp(radToDeg(phi), -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); - - return new LngLat(lng, lat); - }, - - projectTilePoint(x , y ) { - return {x, y, z: 0}; - }, - - locationPoint(tr , lngLat ) { - return tr._coordinatePoint(tr.locationCoordinate(lngLat), false); - }, - - pixelsPerMeter(lat , worldSize ) { - return mercatorZfromAltitude(1, lat) * worldSize; - }, - - farthestPixelDistance(tr ) { - const pixelsPerMeter = this.pixelsPerMeter(tr.center.lat, tr.worldSize); - return farthestPixelDistanceOnPlane(tr, pixelsPerMeter); - }, - - createTileTransform(tr , worldSize ) { - return new FlatTileTransform(tr, worldSize); - } -}; - -// - -const a1 = 1.340264; -const a2 = -0.081106; -const a3 = 0.000893; -const a4 = 0.003796; -const M = Math.sqrt(3) / 2; - -var equalEarth = { - name: 'equalEarth', - center: [0, 0], - range: [3.5, 7], - zAxisUnit: "meters", - isReprojectedInTileSpace: true, - unsupportedLayers: ['custom'], - - project(lng , lat ) { - // based on https://github.com/d3/d3-geo, MIT-licensed - lat = lat / 180 * Math.PI; - lng = lng / 180 * Math.PI; - const theta = Math.asin(M * Math.sin(lat)); - const theta2 = theta * theta; - const theta6 = theta2 * theta2 * theta2; - const x = lng * Math.cos(theta) / (M * (a1 + 3 * a2 * theta2 + theta6 * (7 * a3 + 9 * a4 * theta2))); - const y = theta * (a1 + a2 * theta2 + theta6 * (a3 + a4 * theta2)); - - return { - x: (x / Math.PI + 0.5) * 0.5, - y: 1 - (y / Math.PI + 1) * 0.5, - z: 0 - }; - }, - - unproject(x , y ) { - // based on https://github.com/d3/d3-geo, MIT-licensed - x = (2 * x - 0.5) * Math.PI; - y = (2 * (1 - y) - 1) * Math.PI; - let theta = y; - let theta2 = theta * theta; - let theta6 = theta2 * theta2 * theta2; - - for (let i = 0, delta, fy, fpy; i < 12; ++i) { - fy = theta * (a1 + a2 * theta2 + theta6 * (a3 + a4 * theta2)) - y; - fpy = a1 + 3 * a2 * theta2 + theta6 * (7 * a3 + 9 * a4 * theta2); - delta = fy / fpy; - theta = clamp(theta - delta, -Math.PI / 3, Math.PI / 3); - theta2 = theta * theta; - theta6 = theta2 * theta2 * theta2; - if (Math.abs(delta) < 1e-12) break; - } - - const lambda = M * x * (a1 + 3 * a2 * theta2 + theta6 * (7 * a3 + 9 * a4 * theta2)) / Math.cos(theta); - const phi = Math.asin(Math.sin(theta) / M); - const lng = clamp(lambda * 180 / Math.PI, -180, 180); - const lat = clamp(phi * 180 / Math.PI, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); - - return new LngLat(lng, lat); - }, - - projectTilePoint(x , y ) { - return {x, y, z: 0}; - }, - - locationPoint(tr , lngLat ) { - return tr._coordinatePoint(tr.locationCoordinate(lngLat), false); - }, - - pixelsPerMeter(lat , worldSize ) { - return mercatorZfromAltitude(1, lat) * worldSize; - }, - - farthestPixelDistance(tr ) { - const pixelsPerMeter = this.pixelsPerMeter(tr.center.lat, tr.worldSize); - return farthestPixelDistanceOnPlane(tr, pixelsPerMeter); - }, - - createTileTransform(tr , worldSize ) { - return new FlatTileTransform(tr, worldSize); - } -}; - -// - -var equirectangular = { - name: 'equirectangular', - supportsWorldCopies: true, - center: [0, 0], - range: [3.5, 7], - zAxisUnit: "meters", - wrap: true, - isReprojectedInTileSpace: true, - unsupportedLayers: ['custom'], - - project(lng , lat ) { - const x = 0.5 + lng / 360; - const y = 0.5 - lat / 360; - return {x, y, z: 0}; - }, - - unproject(x , y ) { - const lng = (x - 0.5) * 360; - const lat = clamp((0.5 - y) * 360, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); - return new LngLat(lng, lat); - }, - - projectTilePoint(x , y ) { - return {x, y, z: 0}; - }, - - locationPoint(tr , lngLat ) { - return tr._coordinatePoint(tr.locationCoordinate(lngLat), false); - }, - - pixelsPerMeter(lat , worldSize ) { - return mercatorZfromAltitude(1, lat) * worldSize; - }, - - farthestPixelDistance(tr ) { - const pixelsPerMeter = this.pixelsPerMeter(tr.center.lat, tr.worldSize); - return farthestPixelDistanceOnPlane(tr, pixelsPerMeter); - }, - - createTileTransform(tr , worldSize ) { - return new FlatTileTransform(tr, worldSize); - } -}; - -// - -const halfPi = Math.PI / 2; - -function tany(y) { - return Math.tan((halfPi + y) / 2); -} - -var lambertConformalConic = { - name: 'lambertConformalConic', - range: [3.5, 7], - - zAxisUnit: "meters", - center: [0, 30], - parallels: [30, 30], - - conic: true, - isReprojectedInTileSpace: true, - unsupportedLayers: ['custom'], - - initializeConstants() { - if (this.constants && exactEquals$8(this.parallels, this.constants.parallels)) { - return; - } - - const y0 = degToRad(this.parallels[0]); - const y1 = degToRad(this.parallels[1]); - const cy0 = Math.cos(y0); - const n = y0 === y1 ? Math.sin(y0) : Math.log(cy0 / Math.cos(y1)) / Math.log(tany(y1) / tany(y0)); - const f = cy0 * Math.pow(tany(y0), n) / n; - - this.constants = {n, f, parallels: this.parallels}; - }, - - project(lng , lat ) { - this.initializeConstants(); - - // based on https://github.com/d3/d3-geo, MIT-licensed - lat = degToRad(lat); - lng = degToRad(lng - this.center[0]); - - const epsilon = 1e-6; - const {n, f} = this.constants; - - if (f > 0) { - if (lat < -halfPi + epsilon) lat = -halfPi + epsilon; - } else { - if (lat > halfPi - epsilon) lat = halfPi - epsilon; - } - - const r = f / Math.pow(tany(lat), n); - const x = r * Math.sin(n * lng); - const y = f - r * Math.cos(n * lng); - - return { - x: (x / Math.PI + 0.5) * 0.5, - y: 1 - (y / Math.PI + 0.5) * 0.5, - z: 0 - }; - }, - - unproject(x , y ) { - this.initializeConstants(); - - // based on https://github.com/d3/d3-geo, MIT-licensed - x = (2 * x - 0.5) * Math.PI; - y = (2 * (1 - y) - 0.5) * Math.PI; - const {n, f} = this.constants; - const fy = f - y; - const signFy = Math.sign(fy); - const r = Math.sign(n) * Math.sqrt(x * x + fy * fy); - let l = Math.atan2(x, Math.abs(fy)) * signFy; - - if (fy * n < 0) l -= Math.PI * Math.sign(x) * signFy; - - const lng = clamp(radToDeg(l / n) + this.center[0], -180, 180); - const phi = 2 * Math.atan(Math.pow(f / r, 1 / n)) - halfPi; - const lat = clamp(radToDeg(phi), -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); - - return new LngLat(lng, lat); - }, - - projectTilePoint(x , y ) { - return {x, y, z: 0}; - }, - - locationPoint(tr , lngLat ) { - return tr._coordinatePoint(tr.locationCoordinate(lngLat), false); - }, - - pixelsPerMeter(lat , worldSize ) { - return mercatorZfromAltitude(1, lat) * worldSize; - }, - - farthestPixelDistance(tr ) { - const pixelsPerMeter = this.pixelsPerMeter(tr.center.lat, tr.worldSize); - return farthestPixelDistanceOnPlane(tr, pixelsPerMeter); - }, - - createTileTransform(tr , worldSize ) { - return new FlatTileTransform(tr, worldSize); - } -}; - // +var refProperties = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout']; -var mercator = { - name: 'mercator', - wrap: true, - requiresDraping: false, - supportsWorldCopies: true, - supportsTerrain: true, - supportsFog: true, - supportsFreeCamera: true, - zAxisUnit: "meters", - center: [0, 0], - - project(lng , lat ) { - const x = mercatorXfromLng$1(lng); - const y = mercatorYfromLat$1(lat); - return {x, y, z: 0}; - }, - - unproject(x , y ) { - const lng = lngFromMercatorX(x); - const lat = latFromMercatorY(y); - return new LngLat(lng, lat); - }, - - projectTilePoint(x , y ) { - return {x, y, z: 0}; - }, - - locationPoint(tr , lngLat ) { - return tr._coordinatePoint(tr.locationCoordinate(lngLat), false); - }, - - pixelsPerMeter(lat , worldSize ) { - return mercatorZfromAltitude(1, lat) * worldSize; - }, +exports.AUTH_ERR_MSG = AUTH_ERR_MSG; +exports.Aabb = Aabb; +exports.Actor = Actor; +exports.CanonicalTileID = CanonicalTileID; +exports.Color = Color; +exports.ColorMode = ColorMode; +exports.Context = Context; +exports.CullFaceMode = CullFaceMode; +exports.DEMData = DEMData; +exports.DataConstantProperty = DataConstantProperty; +exports.Debug = Debug; +exports.DedupedRequest = DedupedRequest; +exports.DepthMode = DepthMode; +exports.DepthStencilAttachment = DepthStencilAttachment; +exports.EXTENT = EXTENT; +exports.Elevation = Elevation; +exports.ErrorEvent = ErrorEvent; +exports.EvaluationParameters = EvaluationParameters; +exports.Event = Event; +exports.Evented = Evented; +exports.FillExtrusionBucket = FillExtrusionBucket; +exports.Frustum = Frustum; +exports.FrustumCorners = FrustumCorners; +exports.GLOBE_METERS_TO_ECEF = GLOBE_METERS_TO_ECEF; +exports.GLOBE_RADIUS = GLOBE_RADIUS; +exports.GLOBE_SCALE_MATCH_LATITUDE = GLOBE_SCALE_MATCH_LATITUDE; +exports.GLOBE_ZOOM_THRESHOLD_MAX = GLOBE_ZOOM_THRESHOLD_MAX; +exports.GLOBE_ZOOM_THRESHOLD_MIN = GLOBE_ZOOM_THRESHOLD_MIN; +exports.GlobeSharedBuffers = GlobeSharedBuffers; +exports.GlyphManager = GlyphManager; +exports.ImagePosition = ImagePosition; +exports.LineAtlas = LineAtlas; +exports.LngLat = LngLat$1; +exports.LngLatBounds = LngLatBounds; +exports.LocalGlyphMode = LocalGlyphMode; +exports.MAX_MERCATOR_LATITUDE = MAX_MERCATOR_LATITUDE; +exports.MercatorCoordinate = MercatorCoordinate; +exports.ONE_EM = ONE_EM; +exports.OverscaledTileID = OverscaledTileID; +exports.PerformanceMarkers = PerformanceMarkers; +exports.PerformanceUtils = PerformanceUtils; +exports.Properties = Properties; +exports.RGBAImage = RGBAImage; +exports.Ray = Ray; +exports.RequestManager = RequestManager; +exports.ResourceType = ResourceType; +exports.SegmentVector = SegmentVector; +exports.SourceCache = SourceCache; +exports.StencilMode = StencilMode; +exports.StructArrayLayout1ui2 = StructArrayLayout1ui2; +exports.StructArrayLayout2f1f2i16 = StructArrayLayout2f1f2i16; +exports.StructArrayLayout2i4 = StructArrayLayout2i4; +exports.StructArrayLayout2ui4 = StructArrayLayout2ui4; +exports.StructArrayLayout3f12 = StructArrayLayout3f12; +exports.StructArrayLayout3ui6 = StructArrayLayout3ui6; +exports.StructArrayLayout4i8 = StructArrayLayout4i8; +exports.StructArrayLayout5f20 = StructArrayLayout5f20; +exports.Texture = Texture; +exports.Tile = Tile; +exports.Transitionable = Transitionable; +exports.Uniform1f = Uniform1f; +exports.Uniform1i = Uniform1i; +exports.Uniform2f = Uniform2f; +exports.Uniform3f = Uniform3f; +exports.Uniform4f = Uniform4f; +exports.UniformColor = UniformColor; +exports.UniformMatrix2f = UniformMatrix2f; +exports.UniformMatrix3f = UniformMatrix3f; +exports.UniformMatrix4f = UniformMatrix4f; +exports.UnwrappedTileID = UnwrappedTileID; +exports.ValidationError = ValidationError; +exports.VectorTileWorkerSource = VectorTileWorkerSource; +exports.WritingMode = WritingMode; +exports.ZoomHistory = ZoomHistory; +exports.add = add$4; +exports.addDynamicAttributes = addDynamicAttributes; +exports.adjoint = adjoint$1; +exports.assert_1 = assert_1; +exports.asyncAll = asyncAll; +exports.bezier = bezier$1; +exports.bindAll = bindAll; +exports.boundsAttributes = boundsAttributes; +exports.bufferConvexPolygon = bufferConvexPolygon; +exports.cacheEntryPossiblyAdded = cacheEntryPossiblyAdded; +exports.calculateGlobeLabelMatrix = calculateGlobeLabelMatrix; +exports.calculateGlobeMatrix = calculateGlobeMatrix; +exports.calculateGlobeMercatorMatrix = calculateGlobeMercatorMatrix; +exports.circumferenceAtLatitude = circumferenceAtLatitude; +exports.clamp = clamp; +exports.clearTileCache = clearTileCache; +exports.clipLine = clipLine; +exports.clone = clone$5; +exports.clone$1 = clone$9; +exports.collisionCircleLayout = collisionCircleLayout; +exports.config = config; +exports.conjugate = conjugate$1; +exports.create = create$5; +exports.create$1 = create$6; +exports.create$2 = create$8; +exports.createExpression = createExpression; +exports.createLayout = createLayout; +exports.createStyleLayer = createStyleLayer; +exports.cross = cross$2; +exports.deepEqual = deepEqual; +exports.degToRad = degToRad; +exports.distance = distance$2; +exports.div = div$2; +exports.dot = dot$5; +exports.ease = ease; +exports.easeCubicInOut = easeCubicInOut; +exports.emitValidationErrors = emitValidationErrors; +exports.endsWith = endsWith; +exports.enforceCacheSizeLimit = enforceCacheSizeLimit; +exports.evaluateSizeForFeature = evaluateSizeForFeature; +exports.evaluateSizeForZoom = evaluateSizeForZoom; +exports.evaluateVariableOffset = evaluateVariableOffset; +exports.evented = evented; +exports.exactEquals = exactEquals$2; +exports.exactEquals$1 = exactEquals$4; +exports.exported = exported$1; +exports.exported$1 = exported; +exports.extend = extend$1; +exports.extend$1 = extend; +exports.fillExtrusionHeightLift = fillExtrusionHeightLift; +exports.filterObject = filterObject; +exports.fromMat4 = fromMat4$1; +exports.fromQuat = fromQuat; +exports.fromRotation = fromRotation$2; +exports.fromScaling = fromScaling; +exports.furthestTileCorner = furthestTileCorner; +exports.getAABBPointSquareDist = getAABBPointSquareDist; +exports.getAnchorAlignment = getAnchorAlignment; +exports.getAnchorJustification = getAnchorJustification; +exports.getBounds = getBounds; +exports.getColumn = getColumn; +exports.getGridMatrix = getGridMatrix; +exports.getImage = getImage; +exports.getJSON = getJSON; +exports.getLatitudinalLod = getLatitudinalLod; +exports.getMapSessionAPI = getMapSessionAPI; +exports.getPerformanceMeasurement = getPerformanceMeasurement; +exports.getProjection = getProjection; +exports.getRTLTextPluginStatus = getRTLTextPluginStatus; +exports.getReferrer = getReferrer; +exports.getTilePoint = getTilePoint; +exports.getTileVec3 = getTileVec3; +exports.getVideo = getVideo; +exports.globeCenterToScreenPoint = globeCenterToScreenPoint; +exports.globeECEFOrigin = globeECEFOrigin; +exports.globeNormalizeECEF = globeNormalizeECEF; +exports.globePixelsToTileUnits = globePixelsToTileUnits; +exports.globePoleMatrixForTile = globePoleMatrixForTile; +exports.globeTileBounds = globeTileBounds; +exports.globeTileLatLngCorners = globeTileLatLngCorners; +exports.globeTiltAtLngLat = globeTiltAtLngLat; +exports.globeToMercatorTransition = globeToMercatorTransition; +exports.globeUseCustomAntiAliasing = globeUseCustomAntiAliasing; +exports.identity = identity$3; +exports.identity$1 = identity$2; +exports.invert = invert$5; +exports.invert$1 = invert$2; +exports.isLngLatBehindGlobe = isLngLatBehindGlobe; +exports.isMapAuthenticated = isMapAuthenticated; +exports.isMapboxURL = isMapboxURL; +exports.isSafari = isSafari; +exports.isSafariWithAntialiasingBug = isSafariWithAntialiasingBug; +exports.latFromMercatorY = latFromMercatorY; +exports.len = len$4; +exports.length = length$4; +exports.length$1 = length$2; +exports.loadVectorTile = loadVectorTile; +exports.makeRequest = makeRequest; +exports.mapValue = mapValue; +exports.mercatorXfromLng = mercatorXfromLng; +exports.mercatorYfromLat = mercatorYfromLat; +exports.mercatorZfromAltitude = mercatorZfromAltitude; +exports.mul = mul$5; +exports.mul$1 = mul$4; +exports.multiply = multiply$5; +exports.multiply$1 = multiply$6; +exports.multiply$2 = multiply$4; +exports.nextPowerOfTwo = nextPowerOfTwo; +exports.normalize = normalize$4; +exports.normalize$1 = normalize$2; +exports.number = number; +exports.ortho = ortho; +exports.pbf = pbf; +exports.perspective = perspective; +exports.pick = pick; +exports.plugin = plugin; +exports.pointGeometry = pointGeometry; +exports.polygonContainsPoint = polygonContainsPoint; +exports.polygonIntersectsBox = polygonIntersectsBox; +exports.polygonIntersectsPolygon = polygonIntersectsPolygon; +exports.polygonizeBounds = polygonizeBounds; +exports.posAttributes = posAttributes; +exports.postMapLoadEvent = postMapLoadEvent; +exports.postTurnstileEvent = postTurnstileEvent; +exports.potpack = potpack; +exports.prevPowerOfTwo = prevPowerOfTwo; +exports.radToDeg = radToDeg; +exports.refProperties = refProperties; +exports.registerForPluginStateChange = registerForPluginStateChange; +exports.removeAuthState = removeAuthState; +exports.renderColorRamp = renderColorRamp; +exports.resample = resample$1; +exports.rotate = rotate$4; +exports.rotateX = rotateX$3; +exports.rotateX$1 = rotateX$1; +exports.rotateY = rotateY$3; +exports.rotateY$1 = rotateY$1; +exports.rotateZ = rotateZ$3; +exports.rotateZ$1 = rotateZ$1; +exports.scale = scale$8; +exports.scale$1 = scale$5; +exports.scale$2 = scale$3; +exports.scale$3 = scale$4; +exports.scaleAndAdd = scaleAndAdd$2; +exports.setCacheLimits = setCacheLimits; +exports.setColumn = setColumn; +exports.setRTLTextPlugin = setRTLTextPlugin; +exports.smoothstep = smoothstep; +exports.spec = spec; +exports.storeAuthState = storeAuthState; +exports.sub = sub$2; +exports.subtract = subtract$2; +exports.symbolSize = symbolSize; +exports.tileAABB = tileAABB; +exports.tileTransform = tileTransform; +exports.transformMat3 = transformMat3$1; +exports.transformMat4 = transformMat4$2; +exports.transformMat4$1 = transformMat4$1; +exports.transformQuat = transformQuat$1; +exports.translate = translate$1; +exports.transpose = transpose$1; +exports.triggerPluginCompletionEvent = triggerPluginCompletionEvent; +exports.uniqueId = uniqueId; +exports.updateGlobeVertexNormal = updateGlobeVertexNormal; +exports.validateCustomStyleLayer = validateCustomStyleLayer; +exports.validateFilter = validateFilter; +exports.validateFog = validateFog; +exports.validateLayer = validateLayer; +exports.validateLight = validateLight; +exports.validateSource = validateSource; +exports.validateStyle = validateStyle; +exports.validateTerrain = validateTerrain; +exports.values = values; +exports.vectorTile = vectorTile; +exports.version = version; +exports.warnOnce = warnOnce; +exports.window = window$1; +exports.wrap = wrap; - farthestPixelDistance(tr ) { - const pixelsPerMeter = this.pixelsPerMeter(tr.center.lat, tr.worldSize); - return farthestPixelDistanceOnPlane(tr, pixelsPerMeter); - }, +})); - createTileTransform(tr , worldSize ) { - return new FlatTileTransform(tr, worldSize); - } -}; +define(['./shared'], (function (ref_properties) { 'use strict'; // -const maxPhi = degToRad(MAX_MERCATOR_LATITUDE); - -var naturalEarth = { - name: 'naturalEarth', - center: [0, 0], - range: [3.5, 7], - isReprojectedInTileSpace: true, - zAxisUnit: "meters", - unsupportedLayers: ['custom'], - - project(lng , lat ) { - // based on https://github.com/d3/d3-geo, MIT-licensed - lat = degToRad(lat); - lng = degToRad(lng); - - const phi2 = lat * lat; - const phi4 = phi2 * phi2; - const x = lng * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))); - const y = lat * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))); - - return { - x: (x / Math.PI + 0.5) * 0.5, - y: 1 - (y / Math.PI + 1) * 0.5, - z: 0 - }; - }, - - unproject(x , y ) { - // based on https://github.com/d3/d3-geo, MIT-licensed - x = (2 * x - 0.5) * Math.PI; - y = (2 * (1 - y) - 1) * Math.PI; - const epsilon = 1e-6; - let phi = y; - let i = 25; - let delta = 0; - let phi2 = phi * phi; - - do { - phi2 = phi * phi; - const phi4 = phi2 * phi2; - delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / - (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); - phi = clamp(phi - delta, -maxPhi, maxPhi); - } while (Math.abs(delta) > epsilon && --i > 0); - - phi2 = phi * phi; - const lambda = x / (0.8707 + phi2 * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))); - - const lng = clamp(radToDeg(lambda), -180, 180); - const lat = radToDeg(phi); - - return new LngLat(lng, lat); - }, - - projectTilePoint(x , y ) { - return {x, y, z: 0}; - }, - - locationPoint(tr , lngLat ) { - return tr._coordinatePoint(tr.locationCoordinate(lngLat), false); - }, - - pixelsPerMeter(lat , worldSize ) { - return mercatorZfromAltitude(1, lat) * worldSize; - }, - - farthestPixelDistance(tr ) { - const pixelsPerMeter = this.pixelsPerMeter(tr.center.lat, tr.worldSize); - return farthestPixelDistanceOnPlane(tr, pixelsPerMeter); - }, - - createTileTransform(tr , worldSize ) { - return new FlatTileTransform(tr, worldSize); +function stringify(obj) { + if (typeof obj === 'number' || typeof obj === 'boolean' || typeof obj === 'string' || obj === undefined || obj === null) + return JSON.stringify(obj); + + if (Array.isArray(obj)) { + let str = '['; + for (const val of obj) { + str += `${stringify(val)},`; + } + return `${str}]`; } -}; -// + let str = '{'; + for (const key of Object.keys(obj).sort()) { + str += `${key}:${stringify((obj )[key])},`; + } + return `${str}}`; +} -const maxPhi$1 = degToRad(MAX_MERCATOR_LATITUDE); +function getKey(layer) { + let key = ''; + for (const k of ref_properties.refProperties) { + key += `/${stringify((layer )[k])}`; + } + return key; +} -var winkelTripel = { - name: 'winkelTripel', - center: [0, 0], - range: [3.5, 7], - zAxisUnit: "meters", - isReprojectedInTileSpace: true, - unsupportedLayers: ['custom'], +/** + * 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 + * @param {Object} [cachedKeys] - an object to keep already calculated keys. + * @returns {Array>} + */ +function groupByLayout(layers , cachedKeys ) { + const groups = {}; - project(lng , lat ) { - lat = degToRad(lat); - lng = degToRad(lng); - const cosLat = Math.cos(lat); - const twoOverPi = 2 / Math.PI; - const alpha = Math.acos(cosLat * Math.cos(lng / 2)); - const sinAlphaOverAlpha = Math.sin(alpha) / alpha; - const x = 0.5 * (lng * twoOverPi + (2 * cosLat * Math.sin(lng / 2)) / sinAlphaOverAlpha) || 0; - const y = 0.5 * (lat + Math.sin(lat) / sinAlphaOverAlpha) || 0; - return { - x: (x / Math.PI + 0.5) * 0.5, - y: 1 - (y / Math.PI + 1) * 0.5, - z: 0 - }; - }, + for (let i = 0; i < layers.length; i++) { - unproject(x , y ) { - // based on https://github.com/d3/d3-geo-projection, MIT-licensed - x = (2 * x - 0.5) * Math.PI; - y = (2 * (1 - y) - 1) * Math.PI; - let lambda = x; - let phi = y; - let i = 25; - const epsilon = 1e-6; - let dlambda = 0, dphi = 0; - do { - const cosphi = Math.cos(phi), - sinphi = Math.sin(phi), - sinphi2 = 2 * sinphi * cosphi, - sin2phi = sinphi * sinphi, - cos2phi = cosphi * cosphi, - coslambda2 = Math.cos(lambda / 2), - sinlambda2 = Math.sin(lambda / 2), - sinlambda = 2 * coslambda2 * sinlambda2, - sin2lambda2 = sinlambda2 * sinlambda2, - C = 1 - cos2phi * coslambda2 * coslambda2, - F = C ? 1 / C : 0, - E = C ? Math.acos(cosphi * coslambda2) * Math.sqrt(1 / C) : 0, - fx = 0.5 * (2 * E * cosphi * sinlambda2 + lambda * 2 / Math.PI) - x, - fy = 0.5 * (E * sinphi + phi) - y, - dxdlambda = 0.5 * F * (cos2phi * sin2lambda2 + E * cosphi * coslambda2 * sin2phi) + 1 / Math.PI, - dxdphi = F * (sinlambda * sinphi2 / 4 - E * sinphi * sinlambda2), - dydlambda = 0.125 * F * (sinphi2 * sinlambda2 - E * sinphi * cos2phi * sinlambda), - dydphi = 0.5 * F * (sin2phi * coslambda2 + E * sin2lambda2 * cosphi) + 0.5, - denominator = dxdphi * dydlambda - dydphi * dxdlambda; + const k = (cachedKeys && cachedKeys[layers[i].id]) || getKey(layers[i]); + // update the cache if there is one + if (cachedKeys) + cachedKeys[layers[i].id] = k; - dlambda = (fy * dxdphi - fx * dydphi) / denominator; - dphi = (fx * dydlambda - fy * dxdlambda) / denominator; - lambda = clamp(lambda - dlambda, -Math.PI, Math.PI); - phi = clamp(phi - dphi, -maxPhi$1, maxPhi$1); + let group = groups[k]; + if (!group) { + group = groups[k] = []; + } + group.push(layers[i]); + } - } while ((Math.abs(dlambda) > epsilon || Math.abs(dphi) > epsilon) && --i > 0); + const result = []; - return new LngLat(radToDeg(lambda), radToDeg(phi)); - }, + for (const k in groups) { + result.push(groups[k]); + } - projectTilePoint(x , y ) { - return {x, y, z: 0}; - }, + return result; +} - locationPoint(tr , lngLat ) { - return tr._coordinatePoint(tr.locationCoordinate(lngLat), false); - }, +// - pixelsPerMeter(lat , worldSize ) { - return mercatorZfromAltitude(1, lat) * worldSize; - }, + + - farthestPixelDistance(tr ) { - const pixelsPerMeter = this.pixelsPerMeter(tr.center.lat, tr.worldSize); - return farthestPixelDistanceOnPlane(tr, pixelsPerMeter); - }, + + - createTileTransform(tr , worldSize ) { - return new FlatTileTransform(tr, worldSize); - } -}; +class StyleLayerIndex { + + -// + + -function cylindricalEqualArea(phi ) { - const cosPhi = Math.max(0.01, Math.cos(degToRad(phi))); - // scale coordinates between 0 and 1 to avoid constraint issues - const scale = 1 / (2 * Math.max(Math.PI * cosPhi, 1 / cosPhi)); + constructor(layerConfigs ) { + this.keyCache = {}; + if (layerConfigs) { + this.replace(layerConfigs); + } + } - return { - wrap: true, - supportsWorldCopies: true, - unsupportedLayers: ['custom'], - project(lng , lat ) { - const x = degToRad(lng) * cosPhi; - const y = Math.sin(degToRad(lat)) / cosPhi; + replace(layerConfigs ) { + this._layerConfigs = {}; + this._layers = {}; + this.update(layerConfigs, []); + } - return { - x: (x * scale) + 0.5, - y: (-y * scale) + 0.5, - z: 0 - }; - }, - unproject(x , y ) { - const x_ = (x - 0.5) / scale; - const y_ = -(y - 0.5) / scale; - const lng = clamp(radToDeg(x_) / cosPhi, -180, 180); - const y2 = y_ * cosPhi; - const y3 = Math.asin(clamp(y2, -1, 1)); - const lat = clamp(radToDeg(y3), -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); + update(layerConfigs , removedIds ) { + for (const layerConfig of layerConfigs) { + this._layerConfigs[layerConfig.id] = layerConfig; - return new LngLat(lng, lat); + const layer = this._layers[layerConfig.id] = ((ref_properties.createStyleLayer(layerConfig) ) ); + layer.compileFilter(); + if (this.keyCache[layerConfig.id]) + delete this.keyCache[layerConfig.id]; + } + for (const id of removedIds) { + delete this.keyCache[id]; + delete this._layerConfigs[id]; + delete this._layers[id]; } - }; -} -// + this.familiesBySource = {}; - - - - - - - - - - - - - - + const groups = groupByLayout(ref_properties.values(this._layerConfigs), this.keyCache); - - - - - - - - - - - + for (const layerConfigs of groups) { + const layers = layerConfigs.map((layerConfig) => this._layers[layerConfig.id]); -const projections = { - albers, - equalEarth, - equirectangular, - lambertConformalConic, - mercator, - naturalEarth, - winkelTripel -}; + const layer = layers[0]; + if (layer.visibility === 'none') { + continue; + } -function getConicProjection(projection , config ) { - if (config.parallels) { - // parallels that are equal but with opposite signs (e.g. [10, -10]) - // create a cylindrical projection so we replace the - // project and unproject functions with equivalent cylindrical versions - if (Math.abs(config.parallels[0] + config.parallels[1]) < 0.01) { - let cylindricalFunctions = cylindricalEqualArea((config ).parallels[0]); + const sourceId = layer.source || ''; + let sourceGroup = this.familiesBySource[sourceId]; + if (!sourceGroup) { + sourceGroup = this.familiesBySource[sourceId] = {}; + } - if (config.name === 'lambertConformalConic') { - const {project, unproject} = projections['mercator']; - cylindricalFunctions = {wrap: true, supportsWorldCopies: true, project, unproject}; + const sourceLayerId = layer.sourceLayer || '_geojsonTileLayer'; + let sourceLayerFamilies = sourceGroup[sourceLayerId]; + if (!sourceLayerFamilies) { + sourceLayerFamilies = sourceGroup[sourceLayerId] = []; } - return extend({}, projection, config, cylindricalFunctions); + sourceLayerFamilies.push(layers); } } - - return extend({}, projection, config); -} - -function getProjection(config ) { - const projection = projections[config.name]; - if (!projection) throw new Error(`Invalid projection name: ${config.name}`); - return projection.conic ? getConicProjection(projection, config) : projection; } // -/** - * @private - * An `EdgeInset` object represents screen space padding applied to the edges of the viewport. - * This shifts the apparent center or the vanishing point of the map. This is useful for adding floating UI elements - * on top of the map and having the vanishing point shift as UI elements resize. - * - * @param {number} [top=0] - * @param {number} [bottom=0] - * @param {number} [left=0] - * @param {number} [right=0] - */ -class EdgeInsets { - - - - + + - constructor(top = 0, bottom = 0, left = 0, right = 0) { - if (isNaN(top) || top < 0 || - isNaN(bottom) || bottom < 0 || - isNaN(left) || left < 0 || - isNaN(right) || right < 0 - ) { - throw new Error('Invalid value for edge-insets, top, bottom, left and right must all be numbers'); - } +class RasterDEMTileWorkerSource { + + + - this.top = top; - this.bottom = bottom; - this.left = left; - this.right = right; + loadTile(params , callback ) { + const {uid, encoding, rawImageData, padding, buildQuadTree} = params; + // Main thread will transfer ImageBitmap if offscreen decode with OffscreenCanvas is supported, else it will transfer an already decoded image. + // Flow struggles to refine ImageBitmap type, likely due to the JSDom shim + const imagePixels = ref_properties.window.ImageBitmap && rawImageData instanceof ref_properties.window.ImageBitmap ? this.getImageData(rawImageData, padding) : ((rawImageData ) ); + const dem = new ref_properties.DEMData(uid, imagePixels, encoding, padding < 1, buildQuadTree); + callback(null, dem); } - /** - * Interpolates the inset in-place. - * This maintains the current inset value for any inset not present in `target`. - * - * @private - * @param {PaddingOptions | EdgeInsets} start The initial padding options. - * @param {PaddingOptions} target The target padding options. - * @param {number} t The interpolation variable. - * @returns {EdgeInsets} The interpolated edge insets. - * @memberof EdgeInsets - */ - interpolate(start , target , t ) { - if (target.top != null && start.top != null) this.top = number(start.top, target.top, t); - if (target.bottom != null && start.bottom != null) this.bottom = number(start.bottom, target.bottom, t); - if (target.left != null && start.left != null) this.left = number(start.left, target.left, t); - if (target.right != null && start.right != null) this.right = number(start.right, target.right, t); - - return this; - } + getImageData(imgBitmap , padding ) { + // Lazily initialize OffscreenCanvas + if (!this.offscreenCanvas || !this.offscreenCanvasContext) { + // Dem tiles are typically 256x256 + this.offscreenCanvas = new OffscreenCanvas(imgBitmap.width, imgBitmap.height); + this.offscreenCanvasContext = this.offscreenCanvas.getContext('2d'); + } - /** - * Utility method that computes the new apprent center or vanishing point after applying insets. - * This is in pixels and with the top left being (0.0) and +y being downwards. - * - * @private - * @param {number} width The width of the map in pixels. - * @param {number} height The height of the map in pixels. - * @returns {Point} The apparent center or vanishing point of the map. - * @memberof EdgeInsets - */ - getCenter(width , height ) { - // Clamp insets so they never overflow width/height and always calculate a valid center - const x = clamp((this.left + width - this.right) / 2, 0, width); - const y = clamp((this.top + height - this.bottom) / 2, 0, height); + this.offscreenCanvas.width = imgBitmap.width; + this.offscreenCanvas.height = imgBitmap.height; - return new pointGeometry(x, y); + this.offscreenCanvasContext.drawImage(imgBitmap, 0, 0, imgBitmap.width, imgBitmap.height); + // Insert or remove defined padding around the image to allow backfilling for neighboring data. + const imgData = this.offscreenCanvasContext.getImageData(-padding, -padding, imgBitmap.width + 2 * padding, imgBitmap.height + 2 * padding); + this.offscreenCanvasContext.clearRect(0, 0, this.offscreenCanvas.width, this.offscreenCanvas.height); + return imgData; } +} - equals(other ) { - return this.top === other.top && - this.bottom === other.bottom && - this.left === other.left && - this.right === other.right; - } +var geojsonRewind = rewind$1; - clone() { - return new EdgeInsets(this.top, this.bottom, this.left, this.right); - } +function rewind$1(gj, outer) { + var type = gj && gj.type, i; - /** - * Returns the current state as json, useful when you want to have a - * read-only representation of the inset. - * - * @private - * @returns {PaddingOptions} The current padding options. - * @memberof EdgeInsets - */ - toJSON() { - return { - top: this.top, - bottom: this.bottom, - left: this.left, - right: this.right - }; - } -} + if (type === 'FeatureCollection') { + for (i = 0; i < gj.features.length; i++) rewind$1(gj.features[i], outer); -// - + } else if (type === 'GeometryCollection') { + for (i = 0; i < gj.geometries.length; i++) rewind$1(gj.geometries[i], outer); - + } else if (type === 'Feature') { + rewind$1(gj.geometry, outer); -function updateTransformOrientation(matrix , orientation ) { - // Take temporary copy of position to prevent it from being overwritten - const position = getColumn(matrix, 3); + } else if (type === 'Polygon') { + rewindRings(gj.coordinates, outer); - // Convert quaternion to rotation matrix - fromQuat$1(matrix, orientation); - setColumn(matrix, 3, position); -} + } else if (type === 'MultiPolygon') { + for (i = 0; i < gj.coordinates.length; i++) rewindRings(gj.coordinates[i], outer); + } -function updateTransformPosition(matrix , position ) { - setColumn(matrix, 3, [position[0], position[1], position[2], 1.0]); + return gj; } -function wrapCameraPosition(position ) { - if (!position) return; - const mercatorCoordinate = Array.isArray(position) ? new MercatorCoordinate(position[0], position[1], position[2]) : position; - mercatorCoordinate.x = wrap(mercatorCoordinate.x, 0, 1); - return mercatorCoordinate; -} +function rewindRings(rings, outer) { + if (rings.length === 0) return; -function orientationFromPitchBearing(pitch , bearing ) { - // Both angles are considered to define CW rotation around their respective axes. - // Values have to be negated to achieve the proper quaternion in left handed coordinate space - const orientation = identity$4([]); - rotateZ$2(orientation, orientation, -bearing); - rotateX$2(orientation, orientation, -pitch); - return orientation; + rewindRing(rings[0], outer); + for (var i = 1; i < rings.length; i++) { + rewindRing(rings[i], !outer); + } } -function orientationFromFrame(forward , up ) { - // Find right-vector of the resulting coordinate frame. Up-vector has to be - // sanitized first in order to remove the roll component from the orientation - const xyForward = [forward[0], forward[1], 0]; - const xyUp = [up[0], up[1], 0]; - - const epsilon = 1e-15; - - if (length(xyForward) >= epsilon) { - // Roll rotation can be seen as the right vector not being on the xy-plane, ie. right[2] != 0.0. - // It can be negated by projecting the up vector on top of the forward vector. - const xyDir = normalize([], xyForward); - scale$4(xyUp, xyDir, dot(xyUp, xyDir)); - - up[0] = xyUp[0]; - up[1] = xyUp[1]; +function rewindRing(ring, dir) { + var area = 0, err = 0; + for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) { + var k = (ring[i][0] - ring[j][0]) * (ring[j][1] + ring[i][1]); + var m = area + k; + err += Math.abs(area) >= Math.abs(k) ? area - m + k : k - m + area; + area = m; } + if (area + err >= 0 !== !!dir) ring.reverse(); +} - const right = cross([], up, forward); - if (len(right) < epsilon) { - return null; - } +// +const toGeoJSON = ref_properties.vectorTile.VectorTileFeature.prototype.toGeoJSON; - const bearing = Math.atan2(-right[1], right[0]); - const pitch = Math.atan2(Math.sqrt(forward[0] * forward[0] + forward[1] * forward[1]), -forward[2]); +// The feature type used by geojson-vt and supercluster. Should be extracted to +// global type and used in module definitions for those two modules. + + + + + + + + + + + - return orientationFromPitchBearing(pitch, bearing); -} +class FeatureWrapper$1 { + -/** - * Options for accessing physical properties of the underlying camera entity. - * Direct access to these properties allows more flexible and precise controlling of the camera. - * These options are also fully compatible and interchangeable with CameraOptions. All fields are optional. - * See {@link Map#setFreeCameraOptions} and {@link Map#getFreeCameraOptions}. - * - * @param {MercatorCoordinate} position Position of the camera in slightly modified web mercator coordinates. - - The size of 1 unit is the width of the projected world instead of the "mercator meter". - Coordinate [0, 0, 0] is the north-west corner and [1, 1, 0] is the south-east corner. - - Z coordinate is conformal and must respect minimum and maximum zoom values. - - Zoom is automatically computed from the altitude (z). - * @param {quat} orientation Orientation of the camera represented as a unit quaternion [x, y, z, w] in a left-handed coordinate space. - Direction of the rotation is clockwise around the respective axis. - The default pose of the camera is such that the forward vector is looking up the -Z axis. - The up vector is aligned with north orientation of the map: - forward: [0, 0, -1] - up: [0, -1, 0] - right [1, 0, 0] - Orientation can be set freely but certain constraints still apply: - - Orientation must be representable with only pitch and bearing. - - Pitch has an upper limit - * @example - * const camera = map.getFreeCameraOptions(); - * - * const position = [138.72649, 35.33974]; - * const altitude = 3000; - * - * camera.position = mapboxgl.MercatorCoordinate.fromLngLat(position, altitude); - * camera.lookAtPoint([138.73036, 35.36197]); - * - * map.setFreeCameraOptions(camera); - * @see [Example: Animate the camera around a point in 3D terrain](https://docs.mapbox.com/mapbox-gl-js/example/free-camera-point/) - * @see [Example: Animate the camera along a path](https://docs.mapbox.com/mapbox-gl-js/example/free-camera-path/) -*/ -class FreeCameraOptions { - - - - + + + + - constructor(position , orientation ) { - this.position = position; - this.orientation = orientation; - } + constructor(feature ) { + this._feature = feature; - get position() { - return this._position; - } + this.extent = ref_properties.EXTENT; + this.type = feature.type; + this.properties = feature.tags; - set position(position ) { - this._position = this._renderWorldCopies ? wrapCameraPosition(position) : position; + // 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); + } } - /** - * Helper function for setting orientation of the camera by defining a focus point - * on the map. - * - * @param {LngLatLike} location Location of the focus point on the map. - * @param {vec3?} up Up vector of the camera is necessary in certain scenarios where bearing can't be deduced - * from the viewing direction. - * @example - * const camera = map.getFreeCameraOptions(); - * - * const position = [138.72649, 35.33974]; - * const altitude = 3000; - * - * camera.position = mapboxgl.MercatorCoordinate.fromLngLat(position, altitude); - * camera.lookAtPoint([138.73036, 35.36197]); - * // Apply camera changes - * map.setFreeCameraOptions(camera); - */ - lookAtPoint(location , up ) { - this.orientation = null; - if (!this.position) { - return; + loadGeometry() { + if (this._feature.type === 1) { + const geometry = []; + for (const point of this._feature.geometry) { + geometry.push([new ref_properties.pointGeometry(point[0], point[1])]); + } + return geometry; + } else { + const geometry = []; + for (const ring of this._feature.geometry) { + const newRing = []; + for (const point of ring) { + newRing.push(new ref_properties.pointGeometry(point[0], point[1])); + } + geometry.push(newRing); + } + return geometry; } + } - const altitude = this._elevation ? this._elevation.getAtPointOrZero(MercatorCoordinate.fromLngLat(location)) : 0; - const pos = this.position; - const target = MercatorCoordinate.fromLngLat(location, altitude); - const forward = [target.x - pos.x, target.y - pos.y, target.z - pos.z]; - if (!up) - up = [0, 0, 1]; + toGeoJSON(x , y , z ) { + return toGeoJSON.call(this, x, y, z); + } +} - // flip z-component if the up vector is pointing downwards - up[2] = Math.abs(up[2]); +class GeoJSONWrapper$1 { + + + + + - this.orientation = orientationFromFrame(forward, up); + constructor(features ) { + this.layers = {'_geojsonTileLayer': this}; + this.name = '_geojsonTileLayer'; + this.extent = ref_properties.EXTENT; + this.length = features.length; + this._features = features; } - /** - * Helper function for setting the orientation of the camera as a pitch and a bearing. - * - * @param {number} pitch Pitch angle in degrees. - * @param {number} bearing Bearing angle in degrees. - * @example - * const camera = map.getFreeCameraOptions(); - * - * // Update camera pitch and bearing - * camera.setPitchBearing(80, 90); - * // Apply changes - * map.setFreeCameraOptions(camera); - */ - setPitchBearing(pitch , bearing ) { - this.orientation = orientationFromPitchBearing(degToRad(pitch), degToRad(-bearing)); + feature(i ) { + return new FeatureWrapper$1(this._features[i]); } } -/** - * While using the free camera API the outcome value of isZooming, isMoving and isRotating - * is not a result of the free camera API. - * If the user sets the map.interactive to true, there will be conflicting behaviors while - * interacting with map via zooming or moving using mouse or/and keyboard which will result - * in isZooming, isMoving and isRotating to return true while using free camera API. In order - * to prevent the confilicting behavior please set map.interactive to false which will result - * in muting the following events: zoom, zoomend, zoomstart, rotate, rotateend, rotatestart, - * move, moveend, movestart, pitch, pitchend, pitchstart. - */ +'use strict'; -class FreeCamera { - - - constructor(position , orientation ) { - this._transform = identity$3([]); - this._orientation = identity$4([]); +var VectorTileFeature = ref_properties.vectorTile.VectorTileFeature; - if (orientation) { - this._orientation = orientation; - updateTransformOrientation(this._transform, this._orientation); - } +var geojson_wrapper = GeoJSONWrapper; - if (position) { - updateTransformPosition(this._transform, position); - } - } +// conform to vectortile api +function GeoJSONWrapper (features, options) { + this.options = options || {}; + this.features = features; + this.length = features.length; +} - get mercatorPosition() { - const pos = this.position; - return new MercatorCoordinate(pos[0], pos[1], pos[2]); - } +GeoJSONWrapper.prototype.feature = function (i) { + return new FeatureWrapper(this.features[i], this.options.extent) +}; - get position() { - const col = getColumn(this._transform, 3); - return [col[0], col[1], col[2]]; - } +function FeatureWrapper (feature, extent) { + 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 = extent || 4096; +} - set position(value ) { - updateTransformPosition(this._transform, value); - } +FeatureWrapper.prototype.loadGeometry = function () { + var rings = this.rawGeometry; + this.geometry = []; - get orientation() { - return this._orientation; + 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 ref_properties.pointGeometry(ring[j][0], ring[j][1])); } + this.geometry.push(newRing); + } + return this.geometry +}; - set orientation(value ) { - this._orientation = value; - updateTransformOrientation(this._transform, this._orientation); - } +FeatureWrapper.prototype.bbox = function () { + if (!this.geometry) this.loadGeometry(); - getPitchBearing() { - const f = this.forward(); - const r = this.right(); + var rings = this.geometry; + var x1 = Infinity; + var x2 = -Infinity; + var y1 = Infinity; + var y2 = -Infinity; - return { - bearing: Math.atan2(-r[1], r[0]), - pitch: Math.atan2(Math.sqrt(f[0] * f[0] + f[1] * f[1]), -f[2]) - }; - } + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; - setPitchBearing(pitch , bearing ) { - this._orientation = orientationFromPitchBearing(pitch, bearing); - updateTransformOrientation(this._transform, this._orientation); - } + for (var j = 0; j < ring.length; j++) { + var coord = ring[j]; - forward() { - const col = getColumn(this._transform, 2); - // Forward direction is towards the negative Z-axis - return [-col[0], -col[1], -col[2]]; + x1 = Math.min(x1, coord.x); + x2 = Math.max(x2, coord.x); + y1 = Math.min(y1, coord.y); + y2 = Math.max(y2, coord.y); } + } - up() { - const col = getColumn(this._transform, 1); - // Up direction has to be flipped to point towards north - return [-col[0], -col[1], -col[2]]; - } + return [x1, y1, x2, y2] +}; - right() { - const col = getColumn(this._transform, 0); - return [col[0], col[1], col[2]]; - } +FeatureWrapper.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON; - getCameraToWorld(worldSize , pixelsPerMeter ) { - const cameraToWorld = new Float64Array(16); - invert$3(cameraToWorld, this.getWorldToCamera(worldSize, pixelsPerMeter)); - return cameraToWorld; - } +var vtPbf = fromVectorTileJs; +var fromVectorTileJs_1 = fromVectorTileJs; +var fromGeojsonVt_1 = fromGeojsonVt; +var GeoJSONWrapper_1 = geojson_wrapper; - getWorldToCameraPosition(worldSize , pixelsPerMeter , uniformScale ) { - const invPosition = this.position; +/** + * 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 ref_properties.pbf(); + writeTile(tile, out); + return out.finish() +} - scale$4(invPosition, invPosition, -worldSize); - const matrix = new Float64Array(16); - fromScaling$3(matrix, [uniformScale, uniformScale, uniformScale]); - translate$2(matrix, matrix, invPosition); +/** + * Serialized a geojson-vt-created tile to pbf. + * + * @param {Object} layers - An object mapping layer names to geojson-vt-created vector tile objects + * @param {Object} [options] - An object specifying the vector-tile specification version and extent that were used to create `layers`. + * @param {Number} [options.version=1] - Version of vector-tile spec used + * @param {Number} [options.extent=4096] - Extent of the vector tile + * @return {Buffer} uncompressed, pbf-serialized tile data + */ +function fromGeojsonVt (layers, options) { + options = options || {}; + var l = {}; + for (var k in layers) { + l[k] = new geojson_wrapper(layers[k].features, options); + l[k].name = k; + l[k].version = options.version; + l[k].extent = options.extent; + } + return fromVectorTileJs({ layers: l }) +} - // Adjust scale on z (3rd column 3rd row) - matrix[10] *= pixelsPerMeter; +function writeTile (tile, pbf) { + for (var key in tile.layers) { + pbf.writeMessage(3, writeLayer, tile.layers[key]); + } +} - return matrix; - } +function writeLayer (layer, pbf) { + pbf.writeVarintField(15, layer.version || 1); + pbf.writeStringField(1, layer.name || ''); + pbf.writeVarintField(5, layer.extent || 4096); - getWorldToCamera(worldSize , pixelsPerMeter ) { - // transformation chain from world space to camera space: - // 1. Height value (z) of renderables is in meters. Scale z coordinate by pixelsPerMeter - // 2. Transform from pixel coordinates to camera space with cameraMatrix^-1 - // 3. flip Y if required + var i; + var context = { + keys: [], + values: [], + keycache: {}, + valuecache: {} + }; - // worldToCamera: flip * cam^-1 * zScale - // cameraToWorld: (flip * cam^-1 * zScale)^-1 => (zScale^-1 * cam * flip^-1) - const matrix = new Float64Array(16); + for (i = 0; i < layer.length; i++) { + context.feature = layer.feature(i); + pbf.writeMessage(2, writeFeature, context); + } - // Compute inverse of camera matrix and post-multiply negated translation - const invOrientation = new Float64Array(4); - const invPosition = this.position; + var keys = context.keys; + for (i = 0; i < keys.length; i++) { + pbf.writeStringField(3, keys[i]); + } - conjugate(invOrientation, this._orientation); - scale$4(invPosition, invPosition, -worldSize); + var values = context.values; + for (i = 0; i < values.length; i++) { + pbf.writeMessage(4, writeValue, values[i]); + } +} - fromQuat$1(matrix, invOrientation); +function writeFeature (context, pbf) { + var feature = context.feature; - translate$2(matrix, matrix, invPosition); + if (feature.id !== undefined) { + pbf.writeVarintField(1, feature.id); + } - // Pre-multiply y (2nd row) - matrix[1] *= -1.0; - matrix[5] *= -1.0; - matrix[9] *= -1.0; - matrix[13] *= -1.0; + pbf.writeMessage(2, writeProperties, context); + pbf.writeVarintField(3, feature.type); + pbf.writeMessage(4, writeGeometry, feature); +} - // Post-multiply z (3rd column) - matrix[8] *= pixelsPerMeter; - matrix[9] *= pixelsPerMeter; - matrix[10] *= pixelsPerMeter; - matrix[11] *= pixelsPerMeter; +function writeProperties (context, pbf) { + var feature = context.feature; + var keys = context.keys; + var values = context.values; + var keycache = context.keycache; + var valuecache = context.valuecache; - return matrix; + for (var key in feature.properties) { + var value = feature.properties[key]; + + var keyIndex = keycache[key]; + if (value === null) continue // don't encode null value properties + + if (typeof keyIndex === 'undefined') { + keys.push(key); + keyIndex = keys.length - 1; + keycache[key] = keyIndex; } + pbf.writeVarint(keyIndex); - getCameraToClipPerspective(fovy , aspectRatio , nearZ , farZ ) { - const matrix = new Float64Array(16); - perspective(matrix, fovy, aspectRatio, nearZ, farZ); - return matrix; + 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); + } +} - getDistanceToElevation(elevationMeters ) { - const z0 = elevationMeters === 0 ? 0 : mercatorZfromAltitude(elevationMeters, this.position[1]); - const f = this.forward(); - return (z0 - this.position[2]) / f[2]; +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 + // do not write polygon closing path as lineto + var lineCount = type === 3 ? ring.length - 1 : ring.length; + for (var i = 0; i < lineCount; i++) { + if (i === 1 && type !== 1) { + pbf.writeVarint(command(2, lineCount - 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; + } + if (type === 3) { + pbf.writeVarint(command(7, 1)); // closepath } + } +} - clone() { - return new FreeCamera([...this.position], [...this.orientation]); +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); } + } } +vtPbf.fromVectorTileJs = fromVectorTileJs_1; +vtPbf.fromGeojsonVt = fromGeojsonVt_1; +vtPbf.GeoJSONWrapper = GeoJSONWrapper_1; -// - - +function sortKD(ids, coords, nodeSize, left, right, depth) { + if (right - left <= nodeSize) return; -function getProjectionAdjustments(transform , withoutRotation ) { - const interpT = getInterpolationT(transform); - const matrix = getShearAdjustment(transform.projection, transform.zoom, transform.center, interpT, withoutRotation); + const m = (left + right) >> 1; - const scaleAdjustment = getScaleAdjustment(transform); - scale$3(matrix, matrix, [scaleAdjustment, scaleAdjustment, 1]); + select(ids, coords, m, left, right, depth % 2); - return matrix; + sortKD(ids, coords, nodeSize, left, m - 1, depth + 1); + sortKD(ids, coords, nodeSize, m + 1, right, depth + 1); } -function getScaleAdjustment(transform ) { - const projection = transform.projection; - const interpT = getInterpolationT(transform); - const zoomAdjustment = getZoomAdjustment(projection, transform.center); - const zoomAdjustmentOrigin = getZoomAdjustment(projection, LngLat.convert(projection.center)); - const scaleAdjustment = Math.pow(2, zoomAdjustment * interpT + (1 - interpT) * zoomAdjustmentOrigin); - return scaleAdjustment; -} +function select(ids, coords, k, left, right, inc) { -function getProjectionAdjustmentInverted(transform ) { - const m = getProjectionAdjustments(transform, true); - return invert([], [ - m[0], m[1], - m[4], m[5]]); + while (right > left) { + if (right - left > 600) { + const n = right - left + 1; + const m = k - left + 1; + const z = Math.log(n); + const s = 0.5 * Math.exp(2 * z / 3); + const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + const newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + select(ids, coords, k, newLeft, newRight, inc); + } + + const t = coords[2 * k + inc]; + let i = left; + let 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 getInterpolationT(transform ) { - const range = transform.projection.range; - if (!range) return 0; +function swapItem(ids, coords, i, j) { + swap(ids, i, j); + swap(coords, 2 * i, 2 * j); + swap(coords, 2 * i + 1, 2 * j + 1); +} - const size = Math.max(transform.width, transform.height); - // The interpolation ranges are manually defined based on what makes - // sense in a 1024px wide map. Adjust the ranges to the current size - // of the map. The smaller the map, the earlier you can start unskewing. - const rangeAdjustment = Math.log(size / 1024) / Math.LN2; - const zoomA = range[0] + rangeAdjustment; - const zoomB = range[1] + rangeAdjustment; - const t = smoothstep(zoomA, zoomB, transform.zoom); - return t; +function swap(arr, i, j) { + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; } -// approx. kilometers per longitude degree at equator -const offset = 1 / 40000; +function range(ids, coords, minX, minY, maxX, maxY, nodeSize) { + const stack = [0, ids.length - 1, 0]; + const result = []; + let x, y; -/* - * Calculates the scale difference between Mercator and the given projection at a certain location. - */ -function getZoomAdjustment(projection , loc ) { - // make sure we operate within mercator space for adjustments (they can go over for other projections) - const lat = clamp(loc.lat, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); + while (stack.length) { + const axis = stack.pop(); + const right = stack.pop(); + const left = stack.pop(); + + if (right - left <= nodeSize) { + for (let 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; + } - const loc1 = new LngLat(loc.lng - 180 * offset, lat); - const loc2 = new LngLat(loc.lng + 180 * offset, lat); + const m = Math.floor((left + right) / 2); - const p1 = projection.project(loc1.lng, lat); - const p2 = projection.project(loc2.lng, lat); + x = coords[2 * m]; + y = coords[2 * m + 1]; - const m1 = MercatorCoordinate.fromLngLat(loc1); - const m2 = MercatorCoordinate.fromLngLat(loc2); + if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[m]); - const pdx = p2.x - p1.x; - const pdy = p2.y - p1.y; - const mdx = m2.x - m1.x; - const mdy = m2.y - m1.y; + const nextAxis = (axis + 1) % 2; - const scale = Math.sqrt((mdx * mdx + mdy * mdy) / (pdx * pdx + pdy * pdy)); + 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 Math.log(scale) / Math.LN2; + return result; } -function getShearAdjustment(projection, zoom, loc, interpT, withoutRotation ) { +function within(ids, coords, qx, qy, r, nodeSize) { + const stack = [0, ids.length - 1, 0]; + const result = []; + const r2 = r * r; - // create two locations a tiny amount (~1km) east and west of the given location - const locw = new LngLat(loc.lng - 180 * offset, loc.lat); - const loce = new LngLat(loc.lng + 180 * offset, loc.lat); + while (stack.length) { + const axis = stack.pop(); + const right = stack.pop(); + const left = stack.pop(); - const pw = projection.project(locw.lng, locw.lat); - const pe = projection.project(loce.lng, loce.lat); + if (right - left <= nodeSize) { + for (let i = left; i <= right; i++) { + if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) result.push(ids[i]); + } + continue; + } - const pdx = pe.x - pw.x; - const pdy = pe.y - pw.y; + const m = Math.floor((left + right) / 2); - // Calculate how much the map would need to be rotated to make east-west in - // projected coordinates be left-right - const angleAdjust = -Math.atan2(pdy, pdx); + const x = coords[2 * m]; + const y = coords[2 * m + 1]; - // Pick a location identical to the original one except for poles to make sure we're within mercator bounds - const mc2 = MercatorCoordinate.fromLngLat(loc); - mc2.y = clamp(mc2.y, -1 + offset, 1 - offset); - const loc2 = mc2.toLngLat(); - const p2 = projection.project(loc2.lng, loc2.lat); + if (sqDist(x, y, qx, qy) <= r2) result.push(ids[m]); - // Find the projected coordinates of two locations, one slightly south and one slightly east. - // Then calculate the transform that would make the projected coordinates of the two locations be: - // - equal distances from the original location - // - perpendicular to one another - // - // Only the position of the coordinate to the north is adjusted. - // The coordinate to the east stays where it is. - const mc3 = MercatorCoordinate.fromLngLat(loc2); - mc3.x += offset; - const loc3 = mc3.toLngLat(); - const p3 = projection.project(loc3.lng, loc3.lat); - const pdx3 = p3.x - p2.x; - const pdy3 = p3.y - p2.y; - const delta3 = rotate$5(pdx3, pdy3, angleAdjust); + const nextAxis = (axis + 1) % 2; - const mc4 = MercatorCoordinate.fromLngLat(loc2); - mc4.y += offset; - const loc4 = mc4.toLngLat(); - const p4 = projection.project(loc4.lng, loc4.lat); - const pdx4 = p4.x - p2.x; - const pdy4 = p4.y - p2.y; - const delta4 = rotate$5(pdx4, pdy4, angleAdjust); + 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); + } + } - const scale = Math.abs(delta3.x) / Math.abs(delta4.y); + return result; +} + +function sqDist(ax, ay, bx, by) { + const dx = ax - bx; + const dy = ay - by; + return dx * dx + dy * dy; +} - const unrotate = identity$3([]); - rotateZ(unrotate, unrotate, (-angleAdjust) * (1 - (withoutRotation ? 0 : interpT))); +const defaultGetX = p => p[0]; +const defaultGetY = p => p[1]; - // unskew - const shear = identity$3([]); - scale$3(shear, shear, [1, 1 - (1 - scale) * interpT, 1]); - shear[4] = -delta4.x / delta4.y * interpT; +class KDBush { + constructor(points, getX = defaultGetX, getY = defaultGetY, nodeSize = 64, ArrayType = Float64Array) { + this.nodeSize = nodeSize; + this.points = points; - // unrotate - rotateZ(shear, shear, angleAdjust); + const IndexArrayType = points.length < 65536 ? Uint16Array : Uint32Array; - multiply$3(shear, unrotate, shear); + const ids = this.ids = new IndexArrayType(points.length); + const coords = this.coords = new ArrayType(points.length * 2); - return shear; -} + for (let i = 0; i < points.length; i++) { + ids[i] = i; + coords[2 * i] = getX(points[i]); + coords[2 * i + 1] = getY(points[i]); + } -function rotate$5(x, y, angle) { - const cos = Math.cos(angle); - const sin = Math.sin(angle); - return { - x: x * cos - y * sin, - y: x * sin + y * cos - }; + sortKD(ids, coords, nodeSize, 0, ids.length - 1, 0); + } + + range(minX, minY, maxX, maxY) { + return range(this.ids, this.coords, minX, minY, maxX, maxY, this.nodeSize); + } + + within(x, y, r) { + return within(this.ids, this.coords, x, y, r, this.nodeSize); + } } -// - - - - - +const defaultOptions = { + minZoom: 0, // min zoom to generate clusters on + maxZoom: 16, // max zoom level to cluster the points on + minPoints: 2, // minimum points to form a cluster + 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 -const NUM_WORLD_COPIES = 3; -const DEFAULT_MIN_ZOOM = 0; + // whether to generate numeric ids for input features (in vector tiles) + generateId: false, - - + // a reduce function for calculating custom cluster properties + reduce: null, // (accumulated, props) => { accumulated.sum += props.sum; } -/** - * A single transform, generally used for a single tile to be - * scaled, rotated, and zoomed. - * @private - */ -class Transform { - - - + // properties to use for individual points when running the reducer + map: props => props // props => ({sum: props.my_value}) +}; - // 2^zoom (worldSize = tileSize * scale) - +const fround = Math.fround || (tmp => ((x) => { tmp[0] = +x; return tmp[0]; }))(new Float32Array(1)); - // Map viewport size (not including the pixel ratio) - - +class Supercluster { + constructor(options) { + this.options = extend$1(Object.create(defaultOptions), options); + this.trees = new Array(this.options.maxZoom + 1); + } - // Bearing, radians, in [-pi, pi] - + load(points) { + const {log, minZoom, maxZoom, nodeSize} = this.options; - // 2D rotation matrix in the horizontal plane, as a function of bearing - + if (log) console.time('total time'); - // Zoom, modulo 1 - + const timerId = `prepare ${ points.length } points`; + if (log) console.time(timerId); - // The scale factor component of the conversion from pixels ([0, w] x [h, 0]) to GL - // NDC ([1, -1] x [1, -1]) (note flipped y) - + this.points = points; - // Distance from camera to the center, in screen pixel units, independent of zoom - + // generate a cluster object for each point and index input points into a KD-tree + let clusters = []; + for (let i = 0; i < points.length; i++) { + if (!points[i].geometry) continue; + clusters.push(createPointCluster(points[i], i)); + } + this.trees[maxZoom + 1] = new KDBush(clusters, getX, getY, nodeSize, Float32Array); - // Projection from mercator coordinates ([0, 0] nw, [1, 1] se) to GL clip coordinates - + if (log) console.timeEnd(timerId); - // Translate points in mercator coordinates to be centered about the camera, with units chosen - // for screen-height-independent scaling of fog. Not affected by orientation of camera. - + // cluster points on max zoom, then cluster the results on previous zoom, etc.; + // results in a cluster hierarchy across zoom levels + for (let z = maxZoom; z >= minZoom; z--) { + const now = +Date.now(); - // Projection from world coordinates (mercator scaled by worldSize) to clip coordinates - - + // create a new set of clusters for the zoom and index them with a KD-tree + clusters = this._cluster(clusters, z); + this.trees[z] = new KDBush(clusters, getX, getY, nodeSize, Float32Array); - // Same as projMatrix, pixel-aligned to avoid fractional pixels for raster tiles - + if (log) console.log('z%d: %d clusters in %dms', z, clusters.length, +Date.now() - now); + } - // From world coordinates to screen pixel coordinates (projMatrix premultiplied by labelPlaneMatrix) - - + if (log) console.timeEnd('total time'); - - + return this; + } - // Transform from screen coordinates to GL NDC, [0, w] x [h, 0] --> [-1, 1] x [-1, 1] - // Roughly speaking, applies pixelsToGLUnits scaling with a translation - + getClusters(bbox, zoom) { + let minLng = ((bbox[0] + 180) % 360 + 360) % 360 - 180; + const minLat = Math.max(-90, Math.min(90, bbox[1])); + let maxLng = bbox[2] === 180 ? 180 : ((bbox[2] + 180) % 360 + 360) % 360 - 180; + const maxLat = Math.max(-90, Math.min(90, bbox[3])); - // Inverse of glCoordMatrix, from NDC to screen coordinates, [-1, 1] x [-1, 1] --> [0, w] x [h, 0] - + if (bbox[2] - bbox[0] >= 360) { + minLng = -180; + maxLng = 180; + } else if (minLng > maxLng) { + const easternHem = this.getClusters([minLng, minLat, 180, maxLat], zoom); + const westernHem = this.getClusters([-180, minLat, maxLng, maxLat], zoom); + return easternHem.concat(westernHem); + } - + const tree = this.trees[this._limitZoom(zoom)]; + const ids = tree.range(lngX(minLng), latY(maxLat), lngX(maxLng), latY(minLat)); + const clusters = []; + for (const id of ids) { + const c = tree.points[id]; + clusters.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]); + } + return clusters; + } - - - - - - - - + getChildren(clusterId) { + const originId = this._getOriginId(clusterId); + const originZoom = this._getOriginZoom(clusterId); + const errorMsg = 'No cluster with the specified id.'; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + const index = this.trees[originZoom]; + if (!index) throw new Error(errorMsg); - constructor(minZoom , maxZoom , minPitch , maxPitch , renderWorldCopies ) { - this.tileSize = 512; // constant + const origin = index.points[originId]; + if (!origin) throw new Error(errorMsg); - this._renderWorldCopies = renderWorldCopies === undefined ? true : renderWorldCopies; - this._minZoom = minZoom || DEFAULT_MIN_ZOOM; - this._maxZoom = maxZoom || 22; + const r = this.options.radius / (this.options.extent * Math.pow(2, originZoom - 1)); + const ids = index.within(origin.x, origin.y, r); + const children = []; + for (const id of ids) { + const c = index.points[id]; + if (c.parentId === clusterId) { + children.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]); + } + } - this._minPitch = (minPitch === undefined || minPitch === null) ? 0 : minPitch; - this._maxPitch = (maxPitch === undefined || maxPitch === null) ? 60 : maxPitch; + if (children.length === 0) throw new Error(errorMsg); - this.setProjection(); - this.setMaxBounds(); + return children; + } - 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._nearZ = 0; - this._farZ = 0; - this._unmodified = true; - this._edgeInsets = new EdgeInsets(); - this._projMatrixCache = {}; - this._alignedProjMatrixCache = {}; - this._fogTileMatrixCache = {}; - this._distanceTileDataCache = {}; - this._camera = new FreeCamera(); - this._centerAltitude = 0; - this._averageElevation = 0; - this.cameraElevationReference = "ground"; - this._projectionScaler = 1.0; + getLeaves(clusterId, limit, offset) { + limit = limit || 10; + offset = offset || 0; - // Move the horizon closer to the center. 0 would not shift the horizon. 1 would put the horizon at the center. - this._horizonShift = 0.1; - } + const leaves = []; + this._appendLeaves(leaves, clusterId, limit, offset, 0); - clone() { - const clone = new Transform(this._minZoom, this._maxZoom, this._minPitch, this.maxPitch, this._renderWorldCopies); - clone.setProjection(this.getProjection()); - clone._elevation = this._elevation; - clone._centerAltitude = this._centerAltitude; - clone.tileSize = this.tileSize; - clone.setMaxBounds(this.getMaxBounds()); - clone.width = this.width; - clone.height = this.height; - clone.cameraElevationReference = this.cameraElevationReference; - clone._center = this._center; - clone._setZoom(this.zoom); - clone._cameraZoom = this._cameraZoom; - clone.angle = this.angle; - clone._fov = this._fov; - clone._pitch = this._pitch; - clone._nearZ = this._nearZ; - clone._farZ = this._farZ; - clone._averageElevation = this._averageElevation; - clone._unmodified = this._unmodified; - clone._edgeInsets = this._edgeInsets.clone(); - clone._camera = this._camera.clone(); - clone._calcMatrices(); - clone.freezeTileCoverage = this.freezeTileCoverage; - return clone; + return leaves; } - get elevation() { return this._elevation; } - set elevation(elevation ) { - if (this._elevation === elevation) return; - this._elevation = elevation; - if (!elevation) { - this._cameraZoom = null; - this._centerAltitude = 0; - } else { - if (this._updateCenterElevation()) - this._updateCameraOnTerrain(); - } - this._calcMatrices(); - } - updateElevation(constrainCameraOverTerrain ) { // On render, no need for higher granularity on update reasons. - if (this._terrainEnabled() && this._cameraZoom == null) { - if (this._updateCenterElevation()) - this._updateCameraOnTerrain(); + getTile(z, x, y) { + const tree = this.trees[this._limitZoom(z)]; + const z2 = Math.pow(2, z); + const {extent, radius} = this.options; + const p = radius / extent; + const top = (y - p) / z2; + const bottom = (y + 1 + p) / z2; + + const 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 (constrainCameraOverTerrain) { - this._constrainCameraAltitude(); + if (x === z2 - 1) { + this._addTileFeatures( + tree.range(0, top, p / z2, bottom), + tree.points, -1, y, z2, tile); } - this._calcMatrices(); + + return tile.features.length ? tile : null; } - getProjection() { - return pick(this.projection, ['name', 'center', 'parallels']); + getClusterExpansionZoom(clusterId) { + let expansionZoom = this._getOriginZoom(clusterId) - 1; + while (expansionZoom <= this.options.maxZoom) { + const children = this.getChildren(clusterId); + expansionZoom++; + if (children.length !== 1) break; + clusterId = children[0].properties.cluster_id; + } + return expansionZoom; } - setProjection(projection ) { - if (projection === undefined || projection === null) projection = {name: 'mercator'}; - this.projectionOptions = projection; + _appendLeaves(result, clusterId, limit, offset, skipped) { + const children = this.getChildren(clusterId); - const oldProjection = this.projection ? this.getProjection() : undefined; - this.projection = getProjection(projection); + for (const child of children) { + const props = child.properties; - if (deepEqual(oldProjection, this.getProjection())) { - return false; + if (props && 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, limit, offset, skipped); + // exit the cluster + } + } else if (skipped < offset) { + // skip a single point + skipped++; + } else { + // add a single point + result.push(child); + } + if (result.length === limit) break; } - this._calcMatrices(); - return true; - } - get minZoom() { return this._minZoom; } - set minZoom(zoom ) { - if (this._minZoom === zoom) return; - this._minZoom = zoom; - this.zoom = Math.max(this.zoom, zoom); + return skipped; } - get maxZoom() { return this._maxZoom; } - set maxZoom(zoom ) { - if (this._maxZoom === zoom) return; - this._maxZoom = zoom; - this.zoom = Math.min(this.zoom, zoom); - } + _addTileFeatures(ids, points, x, y, z2, tile) { + for (const i of ids) { + const c = points[i]; + const isCluster = c.numPoints; - get minPitch() { return this._minPitch; } - set minPitch(pitch ) { - if (this._minPitch === pitch) return; - this._minPitch = pitch; - this.pitch = Math.max(this.pitch, pitch); - } + let tags, px, py; + if (isCluster) { + tags = getClusterProperties(c); + px = c.x; + py = c.y; + } else { + const p = this.points[c.index]; + tags = p.properties; + px = lngX(p.geometry.coordinates[0]); + py = latY(p.geometry.coordinates[1]); + } - get maxPitch() { return this._maxPitch; } - set maxPitch(pitch ) { - if (this._maxPitch === pitch) return; - this._maxPitch = pitch; - this.pitch = Math.min(this.pitch, pitch); - } + const f = { + type: 1, + geometry: [[ + Math.round(this.options.extent * (px * z2 - x)), + Math.round(this.options.extent * (py * z2 - y)) + ]], + tags + }; - get renderWorldCopies() { - return this._renderWorldCopies && this.projection.supportsWorldCopies === true; - } - set renderWorldCopies(renderWorldCopies ) { - if (renderWorldCopies === undefined) { - renderWorldCopies = true; - } else if (renderWorldCopies === null) { - renderWorldCopies = false; - } + // assign id + let id; + if (isCluster) { + id = c.id; + } else if (this.options.generateId) { + // optionally generate id + id = c.index; + } else if (this.points[c.index].id) { + // keep id if already assigned + id = this.points[c.index].id; + } - this._renderWorldCopies = renderWorldCopies; - } + if (id !== undefined) f.id = id; - get worldSize() { - return this.tileSize * this.scale; + tile.features.push(f); + } } - get cameraWorldSize() { - const distance = Math.max(this._camera.getDistanceToElevation(this._averageElevation), Number.EPSILON); - return this._worldSizeFromZoom(this._zoomFromMercatorZ(distance)); + _limitZoom(z) { + return Math.max(this.options.minZoom, Math.min(+z, this.options.maxZoom + 1)); } - get pixelsPerMeter() { - return this.projection.pixelsPerMeter(this.center.lat, this.worldSize); - } + _cluster(points, zoom) { + const clusters = []; + const {radius, extent, reduce, minPoints} = this.options; + const r = radius / (extent * Math.pow(2, zoom)); - get cameraPixelsPerMeter() { - return this.projection.pixelsPerMeter(this.center.lat, this.cameraWorldSize); - } + // loop through each point + for (let i = 0; i < points.length; i++) { + const p = points[i]; + // if we've already visited the point at this zoom level, skip it + if (p.zoom <= zoom) continue; + p.zoom = zoom; - get centerOffset() { - return this.centerPoint._sub(this.size._div(2)); - } + // find all nearby points + const tree = this.trees[zoom + 1]; + const neighborIds = tree.within(p.x, p.y, r); - get size() { - return new pointGeometry(this.width, this.height); - } + const numPointsOrigin = p.numPoints || 1; + let numPoints = numPointsOrigin; - get bearing() { - return wrap(this.rotation, -180, 180); - } + // count the number of points in a potential cluster + for (const neighborId of neighborIds) { + const b = tree.points[neighborId]; + // filter out neighbors that are already processed + if (b.zoom > zoom) numPoints += b.numPoints || 1; + } - set bearing(bearing ) { - this.rotation = bearing; - } + // if there were neighbors to merge, and there are enough points to form a cluster + if (numPoints > numPointsOrigin && numPoints >= minPoints) { + let wx = p.x * numPointsOrigin; + let wy = p.y * numPointsOrigin; - get rotation() { - return -this.angle / Math.PI * 180; - } + let clusterProperties = reduce && numPointsOrigin > 1 ? this._map(p, true) : null; - set rotation(rotation ) { - const b = -rotation * Math.PI / 180; - if (this.angle === b) return; - this._unmodified = false; - this.angle = b; - this._calcMatrices(); + // encode both zoom and point index on which the cluster originated -- offset by total length of features + const id = (i << 5) + (zoom + 1) + this.points.length; - // 2x2 matrix for rotating points - this.rotationMatrix = create(); - rotate(this.rotationMatrix, this.rotationMatrix, this.angle); - } + for (const neighborId of neighborIds) { + const b = tree.points[neighborId]; - get pitch() { - return this._pitch / Math.PI * 180; - } - set pitch(pitch ) { - const p = clamp(pitch, this.minPitch, this.maxPitch) / 180 * Math.PI; - if (this._pitch === p) return; - this._unmodified = false; - this._pitch = p; - this._calcMatrices(); - } + if (b.zoom <= zoom) continue; + b.zoom = zoom; // save the zoom (so it doesn't get processed twice) - get fov() { - return this._fov / Math.PI * 180; - } - set fov(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(); - } + const numPoints2 = b.numPoints || 1; + wx += b.x * numPoints2; // accumulate coordinates for calculating weighted center + wy += b.y * numPoints2; - get averageElevation() { - return this._averageElevation; - } - set averageElevation(averageElevation ) { - this._averageElevation = averageElevation; - this._calcFogMatrices(); - } + b.parentId = id; - get zoom() { return this._zoom; } - set zoom(zoom ) { - const z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom); - if (this._zoom === z) return; - this._unmodified = false; - this._setZoom(z); - if (this._terrainEnabled()) { - this._updateCameraOnTerrain(); - } - this._constrain(); - this._calcMatrices(); - } - _setZoom(z ) { - this._zoom = z; - this.scale = this.zoomScale(z); - this.tileZoom = Math.floor(z); - this.zoomFraction = z - this.tileZoom; - } + if (reduce) { + if (!clusterProperties) clusterProperties = this._map(p, true); + reduce(clusterProperties, this._map(b)); + } + } - _updateCenterElevation() { - if (!this._elevation) - return false; + p.parentId = id; + clusters.push(createCluster(wx / numPoints, wy / numPoints, id, numPoints, clusterProperties)); - // Camera zoom describes the distance of the camera to the sea level (altitude). It is used only for manipulating the camera location. - // The standard zoom (this._zoom) defines the camera distance to the terrain (height). Its behavior and conceptual meaning in determining - // which tiles to stream is same with or without the terrain. - const elevationAtCenter = this._elevation.getAtPointOrZero(this.locationCoordinate(this.center), -1); + } else { // left points as unclustered + clusters.push(p); - if (elevationAtCenter === -1) { - // Elevation data not loaded yet - this._cameraZoom = null; - return false; + if (numPoints > 1) { + for (const neighborId of neighborIds) { + const b = tree.points[neighborId]; + if (b.zoom <= zoom) continue; + b.zoom = zoom; + clusters.push(b); + } + } + } } - this._centerAltitude = elevationAtCenter; - return true; + return clusters; } - // Places the camera above terrain so that the current zoom value is respected at the center. - // In other words, camera height in relative to ground elevation remains constant. - // Returns false if the elevation data is not available (yet) at the center point. - _updateCameraOnTerrain() { - const height = this.cameraToCenterDistance; - const terrainElevation = this.pixelsPerMeter * this._centerAltitude; - this._cameraZoom = this._zoomFromMercatorZ((terrainElevation + height) / this.worldSize); + // get index of the point from which the cluster originated + _getOriginId(clusterId) { + return (clusterId - this.points.length) >> 5; } - sampleAverageElevation() { - if (!this._elevation) return 0; - const elevation = this._elevation; + // get zoom of the point from which the cluster originated + _getOriginZoom(clusterId) { + return (clusterId - this.points.length) % 32; + } - const elevationSamplePoints = [ - [0.5, 0.2], - [0.3, 0.5], - [0.5, 0.5], - [0.7, 0.5], - [0.5, 0.8] - ]; + _map(point, clone) { + if (point.numPoints) { + return clone ? extend$1({}, point.properties) : point.properties; + } + const original = this.points[point.index].properties; + const result = this.options.map(original); + return clone && result === original ? extend$1({}, result) : result; + } +} - const horizon = this.horizonLineFromTop(); +function createCluster(x, y, id, numPoints, properties) { + return { + x: fround(x), // weighted cluster center; round for consistency with Float32Array index + y: fround(y), + zoom: Infinity, // the last zoom the cluster was processed at + id, // encodes index of the first child of the cluster and its zoom level + parentId: -1, // parent cluster id + numPoints, + properties + }; +} - let elevationSum = 0.0; - let weightSum = 0.0; - for (let i = 0; i < elevationSamplePoints.length; i++) { - const pt = new pointGeometry( - elevationSamplePoints[i][0] * this.width, - horizon + elevationSamplePoints[i][1] * (this.height - horizon) - ); - const hit = elevation.pointCoordinate(pt); - if (!hit) continue; +function createPointCluster(p, id) { + const [x, y] = p.geometry.coordinates; + return { + x: fround(lngX(x)), // projected point coordinates + y: fround(latY(y)), + zoom: Infinity, // the last zoom the point was processed at + index: id, // index of the source feature in the original input array, + parentId: -1 // parent cluster id + }; +} - const distanceToHit = Math.hypot(hit[0] - this._camera.position[0], hit[1] - this._camera.position[1]); - const weight = 1 / distanceToHit; - elevationSum += hit[3] * weight; - weightSum += weight; +function getClusterJSON(cluster) { + return { + type: 'Feature', + id: cluster.id, + properties: getClusterProperties(cluster), + geometry: { + type: 'Point', + coordinates: [xLng(cluster.x), yLat(cluster.y)] } + }; +} - if (weightSum === 0) return NaN; - return elevationSum / weightSum; - } +function getClusterProperties(cluster) { + const count = cluster.numPoints; + const abbrev = + count >= 10000 ? `${Math.round(count / 1000) }k` : + count >= 1000 ? `${Math.round(count / 100) / 10 }k` : count; + return extend$1(extend$1({}, cluster.properties), { + cluster: true, + cluster_id: cluster.id, + point_count: count, + point_count_abbreviated: abbrev + }); +} - get center() { return this._center; } - set center(center ) { - if (center.lat === this._center.lat && center.lng === this._center.lng) return; +// longitude/latitude to spherical mercator in [0..1] range +function lngX(lng) { + return lng / 360 + 0.5; +} +function latY(lat) { + const sin = Math.sin(lat * Math.PI / 180); + const y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI); + return y < 0 ? 0 : y > 1 ? 1 : y; +} - this._unmodified = false; - this._center = center; - if (this._terrainEnabled()) { - if (this.cameraElevationReference === "ground") { - // Check that the elevation data is available at the new location. - if (this._updateCenterElevation()) - this._updateCameraOnTerrain(); - else - this._cameraZoom = null; - } else { - this._updateZoomFromElevation(); - } - } - this._constrain(); - this._calcMatrices(); - } +// spherical mercator to longitude/latitude +function xLng(x) { + return (x - 0.5) * 360; +} +function yLat(y) { + const y2 = (180 - y * 360) * Math.PI / 180; + return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90; +} - _updateZoomFromElevation() { - if (this._cameraZoom == null || !this._elevation) - return; +function extend$1(dest, src) { + for (const id in src) dest[id] = src[id]; + return dest; +} - // Compute zoom level from the height of the camera relative to the terrain - const cameraZoom = this._cameraZoom; - const elevationAtCenter = this._elevation.getAtPointOrZero(this.locationCoordinate(this.center)); - const mercatorElevation = this.pixelsPerMeter / this.worldSize * elevationAtCenter; - const altitude = this._mercatorZfromZoom(cameraZoom); - const minHeight = this._mercatorZfromZoom(this._maxZoom); - const height = Math.max(altitude - mercatorElevation, minHeight); +function getX(p) { + return p.x; +} +function getY(p) { + return p.y; +} - this._setZoom(this._zoomFromMercatorZ(height)); - } +// calculate simplification data using optimized Douglas-Peucker algorithm - get padding() { return this._edgeInsets.toJSON(); } - set padding(padding ) { - if (this._edgeInsets.equals(padding)) return; - this._unmodified = false; - //Update edge-insets inplace - this._edgeInsets.interpolate(this._edgeInsets, padding, 1); - this._calcMatrices(); - } +function simplify(coords, first, last, sqTolerance) { + var maxSqDist = sqTolerance; + var mid = (last - first) >> 1; + var minPosToMid = last - first; + var index; - /** - * Computes a zoom value relative to a map plane that goes through the provided mercator position. - * - * @param {MercatorCoordinate} position A position defining the altitude of the the map plane. - * @returns {number} The zoom value. - */ - computeZoomRelativeTo(position ) { - // Find map center position on the target plane by casting a ray from screen center towards the plane. - // Direct distance to the target position is used if the target position is above camera position. - const centerOnTargetAltitude = this.rayIntersectionCoordinate(this.pointRayIntersection(this.centerPoint, position.toAltitude())); + var ax = coords[first]; + var ay = coords[first + 1]; + var bx = coords[last]; + var by = coords[last + 1]; - let targetPosition ; - if (position.z < this._camera.position[2]) { - targetPosition = [centerOnTargetAltitude.x, centerOnTargetAltitude.y, centerOnTargetAltitude.z]; - } else { - targetPosition = [position.x, position.y, position.z]; + 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; + + } else if (d === maxSqDist) { + // a workaround to ensure we choose a pivot close to the middle of the list, + // reducing recursion depth, for certain degenerate inputs + // https://github.com/mapbox/geojson-vt/issues/104 + var posToMid = Math.abs(i - mid); + if (posToMid < minPosToMid) { + index = i; + minPosToMid = posToMid; + } } + } - const distToTarget = length(sub$4([], this._camera.position, targetPosition)); - return clamp(this._zoomFromMercatorZ(distToTarget), this._minZoom, this._maxZoom); + 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); } +} - setFreeCameraOptions(options ) { - if (!this.height) - return; +// square distance from a point to a segment +function getSqSegDist(px, py, x, y, bx, by) { - if (!options.position && !options.orientation) - return; + var dx = bx - x; + var dy = by - y; - // Camera state must be up-to-date before accessing its getters - this._updateCameraState(); + if (dx !== 0 || dy !== 0) { - let changed = false; - if (options.orientation && !exactEquals$6(options.orientation, this._camera.orientation)) { - changed = this._setCameraOrientation(options.orientation); - } + var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy); - if (options.position) { - const newPosition = [options.position.x, options.position.y, options.position.z]; - if (!exactEquals$4(newPosition, this._camera.position)) { - this._setCameraPosition(newPosition); - changed = true; - } - } + if (t > 1) { + x = bx; + y = by; - if (changed) { - this._updateStateFromCamera(); - this.recenterOnTerrain(); + } else if (t > 0) { + x += dx * t; + y += dy * t; } } - getFreeCameraOptions() { - this._updateCameraState(); - const pos = this._camera.position; - const options = new FreeCameraOptions(); - options.position = new MercatorCoordinate(pos[0], pos[1], pos[2]); - options.orientation = this._camera.orientation; - options._elevation = this.elevation; - options._renderWorldCopies = this.renderWorldCopies; + dx = px - x; + dy = py - y; - return options; - } + return dx * dx + dy * dy; +} - _setCameraOrientation(orientation ) { - // zero-length quaternions are not valid - if (!length$2(orientation)) - return false; +function createFeature(id, type, geom, tags) { + var feature = { + id: typeof id === 'undefined' ? null : id, + type: type, + geometry: geom, + tags: tags, + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity + }; + calcBBox(feature); + return feature; +} - normalize$2(orientation, orientation); +function calcBBox(feature) { + var geom = feature.geometry; + var type = feature.type; - // The new orientation must be sanitized by making sure it can be represented - // with a pitch and bearing. Roll-component must be removed and the camera can't be upside down - const forward = transformQuat([], [0, 0, -1], orientation); - const up = transformQuat([], [0, -1, 0], orientation); + if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { + calcLineBBox(feature, geom); - if (up[2] < 0.0) - return false; + } else if (type === 'Polygon' || type === 'MultiLineString') { + for (var i = 0; i < geom.length; i++) { + calcLineBBox(feature, geom[i]); + } - const updatedOrientation = orientationFromFrame(forward, up); - if (!updatedOrientation) - return false; + } 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]); + } + } + } +} - this._camera.orientation = updatedOrientation; - return true; +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]); } +} - _setCameraPosition(position ) { - // Altitude must be clamped to respect min and max zoom - const minWorldSize = this.zoomScale(this.minZoom) * this.tileSize; - const maxWorldSize = this.zoomScale(this.maxZoom) * this.tileSize; - const distToCenter = this.cameraToCenterDistance; +// converts GeoJSON feature into an intermediate projected JSON vector format with simplification data - position[2] = clamp(position[2], distToCenter / maxWorldSize, distToCenter / minWorldSize); - this._camera.position = position; - } +function convert(data, options) { + var features = []; + if (data.type === 'FeatureCollection') { + for (var i = 0; i < data.features.length; i++) { + convertFeature(features, data.features[i], options, i); + } - /** - * The center of the screen in pixels with the top-left corner being (0,0) - * and +y axis pointing downwards. This accounts for padding. - * - * @readonly - * @type {Point} - * @memberof Transform - */ - get centerPoint() { - return this._edgeInsets.getCenter(this.width, this.height); - } + } else if (data.type === 'Feature') { + convertFeature(features, data, options); - /** - * Returns the vertical half-fov, accounting for padding, in radians. - * - * @readonly - * @type {number} - * @private - */ - get fovAboveCenter() { - return this._fov * (0.5 + this.centerOffset.y / this.height); + } else { + // single geometry or a geometry collection + convertFeature(features, {geometry: data}, options); } - /** - * Returns true if the padding options are equal. - * - * @param {PaddingOptions} padding The padding options to compare. - * @returns {boolean} True if the padding options are equal. - * @memberof Transform - */ - isPaddingEqual(padding ) { - return this._edgeInsets.equals(padding); - } + return features; +} - /** - * Helper method to update edge-insets inplace. - * - * @param {PaddingOptions} start The initial padding options. - * @param {PaddingOptions} target The target padding options. - * @param {number} t The interpolation variable. - * @memberof Transform - */ - interpolatePadding(start , target , t ) { - this._unmodified = false; - this._edgeInsets.interpolate(start, target, t); - this._constrain(); - this._calcMatrices(); - } +function convertFeature(features, geojson, options, index) { + if (!geojson.geometry) return; - /** - * Return the highest zoom level that fully includes all tiles within the transform's boundaries. - * @param {Object} options Options. - * @param {number} options.tileSize Tile size, expressed in screen pixels. - * @param {boolean} options.roundZoom Target zoom level. If true, the value will be rounded to the closest integer. Otherwise the value will be floored. - * @returns {number} An integer zoom level at which all tiles will be visible. - */ - coveringZoomLevel(options ) { - const z = (options.roundZoom ? Math.round : Math.floor)( - this.zoom + this.scaleZoom(this.tileSize / options.tileSize) - ); - // At negative zoom levels load tiles from z0 because negative tile zoom levels don't exist. - return Math.max(0, z); + var coords = geojson.geometry.coordinates; + var type = geojson.geometry.type; + var tolerance = Math.pow(options.tolerance / ((1 << options.maxZoom) * options.extent), 2); + var geometry = []; + var id = geojson.id; + if (options.promoteId) { + id = geojson.properties[options.promoteId]; + } else if (options.generateId) { + id = index || 0; } + if (type === 'Point') { + convertPoint(coords, geometry); - /** - * Return any "wrapped" copies of a given tile coordinate that are visible - * in the current view. - * - * @private - */ - getVisibleUnwrappedCoordinates(tileID ) { - const result = [new UnwrappedTileID(0, tileID)]; - if (this.renderWorldCopies) { - const utl = this.pointCoordinate(new pointGeometry(0, 0)); - const utr = this.pointCoordinate(new pointGeometry(this.width, 0)); - const ubl = this.pointCoordinate(new pointGeometry(this.width, this.height)); - const ubr = this.pointCoordinate(new pointGeometry(0, this.height)); - const w0 = Math.floor(Math.min(utl.x, utr.x, ubl.x, ubr.x)); - const w1 = Math.floor(Math.max(utl.x, utr.x, ubl.x, ubr.x)); + } else if (type === 'MultiPoint') { + for (var i = 0; i < coords.length; i++) { + convertPoint(coords[i], geometry); + } - // Add an extra copy of the world on each side to properly render ImageSources and CanvasSources. - // Both sources draw outside the tile boundaries of the tile that "contains them" so we need - // to add extra copies on both sides in case offscreen tiles need to draw into on-screen ones. - const extraWorldCopy = 1; + } else if (type === 'LineString') { + convertLine(coords, geometry, tolerance, false); - for (let w = w0 - extraWorldCopy; w <= w1 + extraWorldCopy; w++) { - if (w === 0) continue; - result.push(new UnwrappedTileID(w, tileID)); + } else if (type === 'MultiLineString') { + if (options.lineMetrics) { + // explode into linestrings to be able to track metrics + for (i = 0; i < coords.length; i++) { + geometry = []; + convertLine(coords[i], geometry, tolerance, false); + features.push(createFeature(id, 'LineString', geometry, geojson.properties)); } + return; + } else { + convertLines(coords, geometry, tolerance, false); } - 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 - * @returns {Array} OverscaledTileIDs - * @private - */ - coveringTiles( - options - - - - - - - - - ) { - let z = this.coveringZoomLevel(options); - const actualZ = z; + } else if (type === 'Polygon') { + convertLines(coords, geometry, tolerance, true); - const useElevationData = this.elevation && !options.isTerrainDEM; - const isMercator = this.projection.name === 'mercator'; + } else if (type === 'MultiPolygon') { + for (i = 0; i < coords.length; i++) { + var polygon = []; + convertLines(coords[i], polygon, tolerance, true); + geometry.push(polygon); + } + } else if (type === 'GeometryCollection') { + for (i = 0; i < geojson.geometry.geometries.length; i++) { + convertFeature(features, { + id: id, + geometry: geojson.geometry.geometries[i], + properties: geojson.properties + }, options, index); + } + return; + } else { + throw new Error('Input data is not a valid GeoJSON object.'); + } - if (options.minzoom !== undefined && z < options.minzoom) return []; - if (options.maxzoom !== undefined && z > options.maxzoom) z = options.maxzoom; + features.push(createFeature(id, type, geometry, geojson.properties)); +} - const centerCoord = this.locationCoordinate(this.center); - const numTiles = 1 << z; - const centerPoint = [numTiles * centerCoord.x, numTiles * centerCoord.y, 0]; - const zInMeters = this.projection.name !== 'globe'; - const cameraFrustum = Frustum.fromInvProjectionMatrix(this.invProjMatrix, this.worldSize, z, zInMeters); - const cameraCoord = this.pointCoordinate(this.getCameraPoint()); - const meterToTile = numTiles * mercatorZfromAltitude(1, this.center.lat); - const cameraAltitude = this._camera.position[2] / mercatorZfromAltitude(1, this.center.lat); - const cameraPoint = [numTiles * cameraCoord.x, numTiles * cameraCoord.y, cameraAltitude]; - // Let's consider an example for !roundZoom: e.g. tileZoom 16 is used from zoom 16 all the way to zoom 16.99. - // This would mean that the minimal distance to split would be based on distance from camera to center of 16.99 zoom. - // The same is already incorporated in logic behind roundZoom for raster (so there is no adjustment needed in following line). - // 0.02 added to compensate for precision errors, see "coveringTiles for terrain" test in transform.test.js. - const zoomSplitDistance = this.cameraToCenterDistance / options.tileSize * (options.roundZoom ? 1 : 0.502); +function convertPoint(coords, out) { + out.push(projectX(coords[0])); + out.push(projectY(coords[1])); + out.push(0); +} - // No change of LOD behavior for pitch lower than 60 and when there is no top padding: return only tile ids from the requested zoom level - const minZoom = this.pitch <= 60.0 && this._edgeInsets.top <= this._edgeInsets.bottom && !this._elevation && !this.projection.isReprojectedInTileSpace ? z : 0; +function convertLine(ring, out, tolerance, isPolygon) { + var x0, y0; + var size = 0; - // When calculating tile cover for terrain, create deep AABB for nodes, to ensure they intersect frustum: for sources, - // other than DEM, use minimum of visible DEM tiles and center altitude as upper bound (pitch is always less than 90°). - const maxRange = options.isTerrainDEM && this._elevation ? this._elevation.exaggeration() * 10000 : this._centerAltitude; - const minRange = options.isTerrainDEM ? -maxRange : this._elevation ? this._elevation.getMinElevationBelowMSL() : 0; + for (var j = 0; j < ring.length; j++) { + var x = projectX(ring[j][0]); + var y = projectY(ring[j][1]); - const scaleAdjustment = this.projection.isReprojectedInTileSpace ? getScaleAdjustment(this) : 1.0; + out.push(x); + out.push(y); + out.push(0); - const relativeScaleAtMercatorCoord = mc => { - // Calculate how scale compares between projected coordinates and mercator coordinates. - // Returns a length. The units don't matter since the result is only - // used in a ratio with other values returned by this function. + 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; + } - // Construct a small square in Mercator coordinates. - const offset = 1 / 40000; - const mcEast = new MercatorCoordinate(mc.x + offset, mc.y, mc.z); - const mcSouth = new MercatorCoordinate(mc.x, mc.y + offset, mc.z); + var last = out.length - 3; + out[2] = 1; + simplify(out, 0, last, tolerance); + out[last + 2] = 1; - // Convert the square to projected coordinates. - const ll = mc.toLngLat(); - const llEast = mcEast.toLngLat(); - const llSouth = mcSouth.toLngLat(); - const p = this.locationCoordinate(ll); - const pEast = this.locationCoordinate(llEast); - const pSouth = this.locationCoordinate(llSouth); + out.size = Math.abs(size); + out.start = 0; + out.end = out.size; +} - // Calculate the size of each edge of the reprojected square - const dx = Math.hypot(pEast.x - p.x, pEast.y - p.y); - const dy = Math.hypot(pSouth.x - p.x, pSouth.y - p.y); +function convertLines(rings, out, tolerance, isPolygon) { + for (var i = 0; i < rings.length; i++) { + var geom = []; + convertLine(rings[i], geom, tolerance, isPolygon); + out.push(geom); + } +} - // Calculate the size of a projected square that would have the - // same area as the reprojected square. - return Math.sqrt(dx * dy) * scaleAdjustment / offset; - }; +function projectX(x) { + return x / 360 + 0.5; +} - const newRootTile = (wrap ) => { - const max = maxRange; - const min = minRange; - return { - // With elevation, this._elevation provides z coordinate values. For 2D: - // All tiles are on zero elevation plane => z difference is zero - aabb: tileAABB(this, numTiles, 0, 0, 0, wrap, min, max, this.projection), - zoom: 0, - x: 0, - y: 0, - minZ: min, - maxZ: max, - wrap, - fullyVisible: false - }; - }; +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; +} - // Do a depth-first traversal to find visible tiles and proper levels of detail - const stack = []; - let result = []; - const maxZoom = z; - const overscaledZ = options.reparseOverscaled ? actualZ : z; - const square = a => a * a; - const cameraHeightSqr = square((cameraAltitude - this._centerAltitude) * meterToTile); // in tile coordinates. +/* clip features between two axis-parallel lines: + * | | + * ___|___ | / + * / | \____|____/ + * | | + */ - const getAABBFromElevation = (it) => { - assert_1(this._elevation); - if (!this._elevation || !it.tileID || !isMercator) return; // To silence flow. - const minmax = this._elevation.getMinMaxForTile(it.tileID); - const aabb = it.aabb; - if (minmax) { - aabb.min[2] = minmax.min; - aabb.max[2] = minmax.max; - aabb.center[2] = (aabb.min[2] + aabb.max[2]) / 2; - } else { - it.shouldSplit = shouldSplit(it); - if (!it.shouldSplit) { - // At final zoom level, while corresponding DEM tile is not loaded yet, - // assume center elevation. This covers ground to horizon and prevents - // loading unnecessary tiles until DEM cover is fully loaded. - aabb.min[2] = aabb.max[2] = aabb.center[2] = this._centerAltitude; - } - } - }; +function clip(features, scale, k1, k2, axis, minAll, maxAll, options) { - // Scale distance to split for acute angles. - // dzSqr: z component of camera to tile distance, square. - // dSqr: 3D distance of camera to tile, square. - const distToSplitScale = (dzSqr, dSqr) => { - // When the angle between camera to tile ray and tile plane is smaller - // than acuteAngleThreshold, scale the distance to split. Scaling is adaptive: smaller - // the angle, the scale gets lower value. Although it seems early to start at 45, - // it is not: scaling kicks in around 60 degrees pitch. - const acuteAngleThresholdSin = 0.707; // Math.sin(45) - const stretchTile = 1.1; - // Distances longer than 'dz / acuteAngleThresholdSin' gets scaled - // following geometric series sum: every next dz length in distance can be - // 'stretchTile times' longer. It is further, the angle is sharper. Total, - // adjusted, distance would then be: - // = dz / acuteAngleThresholdSin + (dz * stretchTile + dz * stretchTile ^ 2 + ... + dz * stretchTile ^ k), - // where k = (d - dz / acuteAngleThresholdSin) / dz = d / dz - 1 / acuteAngleThresholdSin; - // = dz / acuteAngleThresholdSin + dz * ((stretchTile ^ (k + 1) - 1) / (stretchTile - 1) - 1) - // or put differently, given that k is based on d and dz, tile on distance d could be used on distance scaled by: - // 1 / acuteAngleThresholdSin + (stretchTile ^ (k + 1) - 1) / (stretchTile - 1) - 1 - if (dSqr * square(acuteAngleThresholdSin) < dzSqr) return 1.0; // Early return, no scale. - const r = Math.sqrt(dSqr / dzSqr); - const k = r - 1 / acuteAngleThresholdSin; - return r / (1 / acuteAngleThresholdSin + (Math.pow(stretchTile, k + 1) - 1) / (stretchTile - 1) - 1); - }; + k1 /= scale; + k2 /= scale; - const shouldSplit = (it) => { - if (it.zoom < minZoom) { - return true; - } else if (it.zoom === maxZoom) { - return false; - } - if (it.shouldSplit != null) { - return it.shouldSplit; - } - const dx = it.aabb.distanceX(cameraPoint); - const dy = it.aabb.distanceY(cameraPoint); - let dzSqr = cameraHeightSqr; + if (minAll >= k1 && maxAll < k2) return features; // trivial accept + else if (maxAll < k1 || minAll >= k2) return null; // trivial reject - if (useElevationData) { - dzSqr = square(it.aabb.distanceZ(cameraPoint) * meterToTile); - } + var clipped = []; - let tileScaleAdjustment = 1; - if (this.projection.isReprojectedInTileSpace && actualZ <= 5) { - // In other projections, not all tiles are the same size. - // Account for the tile size difference by adjusting the distToSplit. - // Adjust by the ratio of the area at the tile center to the area at the map center. - // Adjustments are only needed at lower zooms where tiles are not similarly sized. - const numTiles = Math.pow(2, it.zoom); - const relativeScale = relativeScaleAtMercatorCoord(new MercatorCoordinate((it.x + 0.5) / numTiles, (it.y + 0.5) / numTiles)); - // Fudge the ratio slightly so that all tiles near the center have the same zoom level. - tileScaleAdjustment = relativeScale > 0.85 ? 1 : relativeScale; - } + for (var i = 0; i < features.length; i++) { - const distanceSqr = dx * dx + dy * dy + dzSqr; - const distToSplit = (1 << maxZoom - it.zoom) * zoomSplitDistance * tileScaleAdjustment; - const distToSplitSqr = square(distToSplit * distToSplitScale(Math.max(dzSqr, cameraHeightSqr), distanceSqr)); + var feature = features[i]; + var geometry = feature.geometry; + var type = feature.type; - return distanceSqr < distToSplitSqr; - }; + var min = axis === 0 ? feature.minX : feature.minY; + var max = axis === 0 ? feature.maxX : feature.maxY; - if (this.renderWorldCopies) { - // Render copy of the globe thrice on both sides - for (let i = 1; i <= NUM_WORLD_COPIES; i++) { - stack.push(newRootTile(-i)); - stack.push(newRootTile(i)); - } + if (min >= k1 && max < k2) { // trivial accept + clipped.push(feature); + continue; + } else if (max < k1 || min >= k2) { // trivial reject + continue; } - stack.push(newRootTile(0)); + var newGeometry = []; - while (stack.length > 0) { - const it = stack.pop(); - const x = it.x; - const y = it.y; - let fullyVisible = it.fullyVisible; + if (type === 'Point' || type === 'MultiPoint') { + clipPoints(geometry, newGeometry, k1, k2, axis); - // Visibility of a tile is not required if any of its ancestor if fully inside the frustum - if (!fullyVisible) { - const intersectResult = it.aabb.intersects(cameraFrustum); + } else if (type === 'LineString') { + clipLine(geometry, newGeometry, k1, k2, axis, false, options.lineMetrics); - if (intersectResult === 0) - continue; + } else if (type === 'MultiLineString') { + clipLines(geometry, newGeometry, k1, k2, axis, false); - fullyVisible = intersectResult === 2; - } + } else if (type === 'Polygon') { + clipLines(geometry, newGeometry, k1, k2, axis, true); - // Have we reached the target depth or is the tile too far away to be any split further? - if (it.zoom === maxZoom || !shouldSplit(it)) { - const tileZoom = it.zoom === maxZoom ? overscaledZ : it.zoom; - if (!!options.minzoom && options.minzoom > tileZoom) { - // Not within source tile range. - continue; + } 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); } + } + } - const dx = centerPoint[0] - ((0.5 + x + (it.wrap << it.zoom)) * (1 << (z - it.zoom))); - const dy = centerPoint[1] - 0.5 - y; - const id = it.tileID ? it.tileID : new OverscaledTileID(tileZoom, it.wrap, it.zoom, x, y); - result.push({tileID: id, distanceSq: dx * dx + dy * dy}); + if (newGeometry.length) { + if (options.lineMetrics && type === 'LineString') { + for (j = 0; j < newGeometry.length; j++) { + clipped.push(createFeature(feature.id, type, newGeometry[j], feature.tags)); + } continue; } - for (let i = 0; i < 4; i++) { - const childX = (x << 1) + (i % 2); - const childY = (y << 1) + (i >> 1); - - const aabb = isMercator ? it.aabb.quadrant(i) : tileAABB(this, numTiles, it.zoom + 1, childX, childY, it.wrap, it.minZ, it.maxZ, this.projection); - const child = {aabb, zoom: it.zoom + 1, x: childX, y: childY, wrap: it.wrap, fullyVisible, tileID: undefined, shouldSplit: undefined, minZ: it.minZ, maxZ: it.maxZ}; - if (useElevationData) { - child.tileID = new OverscaledTileID(it.zoom + 1 === maxZoom ? overscaledZ : it.zoom + 1, it.wrap, it.zoom + 1, childX, childY); - getAABBFromElevation(child); + if (type === 'LineString' || type === 'MultiLineString') { + if (newGeometry.length === 1) { + type = 'LineString'; + newGeometry = newGeometry[0]; + } else { + type = 'MultiLineString'; } - stack.push(child); } + if (type === 'Point' || type === 'MultiPoint') { + type = newGeometry.length === 3 ? 'Point' : 'MultiPoint'; + } + + clipped.push(createFeature(feature.id, type, newGeometry, feature.tags)); } + } - if (this.fogCullDistSq) { - const fogCullDistSq = this.fogCullDistSq; - const horizonLineFromTop = this.horizonLineFromTop(); - result = result.filter(entry => { - const min = [0, 0, 0, 1]; - const max = [EXTENT$1, EXTENT$1, 0, 1]; + return clipped.length ? clipped : null; +} - const fogTileMatrix = this.calculateFogTileMatrix(entry.tileID.toUnwrapped()); +function clipPoints(geom, newGeom, k1, k2, axis) { + for (var i = 0; i < geom.length; i += 3) { + var a = geom[i + axis]; - transformMat4$1(min, min, fogTileMatrix); - transformMat4$1(max, max, fogTileMatrix); + if (a >= k1 && a <= k2) { + newGeom.push(geom[i]); + newGeom.push(geom[i + 1]); + newGeom.push(geom[i + 2]); + } + } +} - const sqDist = getAABBPointSquareDist(min, max); +function clipLine(geom, newGeom, k1, k2, axis, isPolygon, trackMetrics) { - if (sqDist === 0) { return true; } + var slice = newSlice(geom); + var intersect = axis === 0 ? intersectX : intersectY; + var len = geom.start; + var segLen, t; - let overHorizonLine = false; + 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 exited = false; - // Terrain loads at one zoom level lower than the raster data, - // so the following checks whether the terrain sits above the horizon and ensures that - // when mountains stick out above the fog (due to horizon-blend), - // we haven’t accidentally culled some of the raster tiles we need to draw on them. - // If we don’t do this, the terrain is default black color and may flash in and out as we move toward it. + if (trackMetrics) segLen = Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2)); - const elevation = this._elevation; + if (a < k1) { + // ---|--> | (line enters the clip region from the left) + if (b > k1) { + t = intersect(slice, ax, ay, bx, by, k1); + if (trackMetrics) slice.start = len + segLen * t; + } + } else if (a > k2) { + // | <--|--- (line enters the clip region from the right) + if (b < k2) { + t = intersect(slice, ax, ay, bx, by, k2); + if (trackMetrics) slice.start = len + segLen * t; + } + } else { + addPoint(slice, ax, ay, az); + } + if (b < k1 && a >= k1) { + // <--|--- | or <--|-----|--- (line exits the clip region on the left) + t = intersect(slice, ax, ay, bx, by, k1); + exited = true; + } + if (b > k2 && a <= k2) { + // | ---|--> or ---|-----|--> (line exits the clip region on the right) + t = intersect(slice, ax, ay, bx, by, k2); + exited = true; + } - if (elevation && sqDist > fogCullDistSq && horizonLineFromTop !== 0) { - const projMatrix = this.calculateProjMatrix(entry.tileID.toUnwrapped()); + if (!isPolygon && exited) { + if (trackMetrics) slice.end = len + segLen * t; + newGeom.push(slice); + slice = newSlice(geom); + } - let minmax; - if (!options.isTerrainDEM) { - minmax = elevation.getMinMaxForTile(entry.tileID); - } + if (trackMetrics) len += segLen; + } - if (!minmax) { minmax = {min: minRange, max: maxRange}; } + // 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); - // ensure that we want `this.rotation` instead of `this.bearing` here - const cornerFar = furthestTileCorner(this.rotation); + // 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]); + } - const farX = cornerFar[0] * EXTENT$1; - const farY = cornerFar[1] * EXTENT$1; + // add the final slice + if (slice.length) { + newGeom.push(slice); + } +} - const worldFar = [farX, farY, minmax.max]; +function newSlice(line) { + var slice = []; + slice.size = line.size; + slice.start = line.start; + slice.end = line.end; + return slice; +} - // World to NDC - transformMat4(worldFar, worldFar, projMatrix); +function clipLines(geom, newGeom, k1, k2, axis, isPolygon) { + for (var i = 0; i < geom.length; i++) { + clipLine(geom[i], newGeom, k1, k2, axis, isPolygon, false); + } +} - // NDC to Screen - const screenCoordY = (1 - worldFar[1]) * this.height * 0.5; +function addPoint(out, x, y, z) { + out.push(x); + out.push(y); + out.push(z); +} - // Prevent cutting tiles crossing over the horizon line to - // prevent pop-in and out within the fog culling range - overHorizonLine = screenCoordY < horizonLineFromTop; - } +function intersectX(out, ax, ay, bx, by, x) { + var t = (x - ax) / (bx - ax); + out.push(x); + out.push(ay + (by - ay) * t); + out.push(1); + return t; +} - return sqDist < fogCullDistSq || overHorizonLine; - }); - } +function intersectY(out, ax, ay, bx, by, y) { + var t = (y - ay) / (by - ay); + out.push(ax + (bx - ax) * t); + out.push(y); + out.push(1); + return t; +} - const cover = result.sort((a, b) => a.distanceSq - b.distanceSq).map(a => a.tileID); - // Relax the assertion on terrain, on high zoom we use distance to center of tile - // while camera might be closer to selected center of map. - assert_1(!cover.length || this.elevation || cover[0].overscaledZ === overscaledZ || !isMercator); - return cover; - } +function wrap(features, options) { + var buffer = options.buffer / options.extent; + var merged = features; + var left = clip(features, 1, -1 - buffer, buffer, 0, -1, 2, options); // left world copy + var right = clip(features, 1, 1 - buffer, 2 + buffer, 0, -1, 2, options); // right world copy - resize(width , height ) { - this.width = width; - this.height = height; + if (left || right) { + merged = clip(features, 1, -buffer, 1 + buffer, 0, -1, 2, options) || []; // center world copy - this.pixelsToGLUnits = [2 / width, -2 / height]; - this._constrain(); - this._calcMatrices(); + if (left) merged = shiftFeatureCoords(left, 1).concat(merged); // merge left into center + if (right) merged = merged.concat(shiftFeatureCoords(right, -1)); // merge right into center } - get unmodified() { return this._unmodified; } - - zoomScale(zoom ) { return Math.pow(2, zoom); } - scaleZoom(scale ) { return Math.log(scale) / Math.LN2; } + return merged; +} - // Transform from LngLat to Point in world coordinates [-180, 180] x [90, -90] --> [0, this.worldSize] x [0, this.worldSize] - project(lnglat ) { - const lat = clamp(lnglat.lat, -MAX_MERCATOR_LATITUDE, MAX_MERCATOR_LATITUDE); - const projectedLngLat = this.projection.project(lnglat.lng, lat); - return new pointGeometry( - projectedLngLat.x * this.worldSize, - projectedLngLat.y * this.worldSize); - } +function shiftFeatureCoords(features, offset) { + var newFeatures = []; - // Transform from Point in world coordinates to LngLat [0, this.worldSize] x [0, this.worldSize] --> [-180, 180] x [90, -90] - unproject(point ) { - return this.projection.unproject(point.x / this.worldSize, point.y / this.worldSize); - } + for (var i = 0; i < features.length; i++) { + var feature = features[i], + type = feature.type; - // Point at center in world coordinates. - get point() { return this.project(this.center); } + var newGeometry; - setLocationAtPoint(lnglat , point ) { - const a = this.pointCoordinate(point); - const b = this.pointCoordinate(this.centerPoint); - const loc = this.locationCoordinate(lnglat); - this.setLocation(new MercatorCoordinate( - loc.x - (a.x - b.x), - loc.y - (a.y - b.y))); - } + if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { + newGeometry = shiftCoords(feature.geometry, offset); - setLocation(location ) { - this.center = this.coordinateLocation(location); - if (this.projection.wrap) { - this.center = this.center.wrap(); + } 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); + } } - } - - /** - * Given a location, return the screen point that corresponds to it. In 3D mode - * (with terrain) this behaves the same as in 2D mode. - * This method is coupled with {@see pointLocation} in 3D mode to model map manipulation - * using flat plane approach to keep constant elevation above ground. - * @param {LngLat} lnglat location - * @returns {Point} screen point - * @private - */ - locationPoint(lnglat ) { - return this.projection.locationPoint(this, lnglat); - } - - /** - * Given a location, return the screen point that corresponds to it - * In 3D mode (when terrain is enabled) elevation is sampled for the point before - * projecting it. In 2D mode, behaves the same locationPoint. - * @param {LngLat} lnglat location - * @returns {Point} screen point - * @private - */ - locationPoint3D(lnglat ) { - return this._coordinatePoint(this.locationCoordinate(lnglat), true); - } - /** - * Given a point on screen, return its lnglat - * @param {Point} p screen point - * @returns {LngLat} lnglat location - * @private - */ - pointLocation(p ) { - return this.coordinateLocation(this.pointCoordinate(p)); + newFeatures.push(createFeature(feature.id, type, newGeometry, feature.tags)); } - /** - * Given a point on screen, return its lnglat - * In 3D mode (map with terrain) returns location of terrain raycast point. - * In 2D mode, behaves the same as {@see pointLocation}. - * @param {Point} p screen point - * @returns {LngLat} lnglat location - * @private - */ - pointLocation3D(p ) { - return this.coordinateLocation(this.pointCoordinate3D(p)); - } + return newFeatures; +} - /** - * Given a geographical lngLat, return an unrounded - * coordinate that represents it at this transform's zoom level. - * @param {LngLat} lngLat - * @returns {Coordinate} - * @private - */ - locationCoordinate(lngLat , altitude ) { - const z = altitude ? - mercatorZfromAltitude(altitude, lngLat.lat) : - undefined; - const projectedLngLat = this.projection.project(lngLat.lng, lngLat.lat); - return new MercatorCoordinate( - projectedLngLat.x, - projectedLngLat.y, - z); - } +function shiftCoords(points, offset) { + var newPoints = []; + newPoints.size = points.size; - /** - * Given a Coordinate, return its geographical position. - * @param {Coordinate} coord - * @returns {LngLat} lngLat - * @private - */ - coordinateLocation(coord ) { - return this.projection.unproject(coord.x, coord.y); + if (points.start !== undefined) { + newPoints.start = points.start; + newPoints.end = points.end; } - /** - * Casts a ray from a point on screen and returns the Ray, - * and the extent along it, at which it intersects the map plane. - * - * @param {Point} p Viewport pixel co-ordinates. - * @param {number} z Optional altitude of the map plane, defaulting to elevation at center. - * @returns {{ p0: vec4, p1: vec4, t: number }} p0,p1 are two points on the ray. - * t is the fractional extent along the ray at which the ray intersects the map plane. - * @private - */ - pointRayIntersection(p , z ) { - const targetZ = (z !== undefined && z !== null) ? z : this._centerAltitude; - // 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. - - const p0 = [p.x, p.y, 0, 1]; - const p1 = [p.x, p.y, 1, 1]; + for (var i = 0; i < points.length; i += 3) { + newPoints.push(points[i] + offset, points[i + 1], points[i + 2]); + } + return newPoints; +} - transformMat4$1(p0, p0, this.pixelMatrixInverse); - transformMat4$1(p1, p1, this.pixelMatrixInverse); +// 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; - const w0 = p0[3]; - const w1 = p1[3]; - scale$5(p0, p0, 1 / w0); - scale$5(p1, p1, 1 / w1); + var z2 = 1 << tile.z, + tx = tile.x, + ty = tile.y, + i, j, k; - const z0 = p0[2]; - const z1 = p1[2]; + for (i = 0; i < tile.features.length; i++) { + var feature = tile.features[i], + geom = feature.geometry, + type = feature.type; - const t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0); + feature.geometry = []; - return {p0, p1, t}; + 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); + } + } } - screenPointToMercatorRay(p ) { - const p0 = [p.x, p.y, 0, 1]; - const p1 = [p.x, p.y, 1, 1]; + tile.transformed = true; - transformMat4$1(p0, p0, this.pixelMatrixInverse); - transformMat4$1(p1, p1, this.pixelMatrixInverse); + return tile; +} - scale$5(p0, p0, 1 / p0[3]); - scale$5(p1, p1, 1 / p1[3]); +function transformPoint(x, y, extent, z2, tx, ty) { + return [ + Math.round(extent * (x * z2 - tx)), + Math.round(extent * (y * z2 - ty))]; +} - // Convert altitude from meters to pixels. - p0[2] = mercatorZfromAltitude(p0[2], this._center.lat) * this.worldSize; - p1[2] = mercatorZfromAltitude(p1[2], this._center.lat) * this.worldSize; +function createTile(features, z, tx, ty, options) { + var tolerance = z === options.maxZoom ? 0 : options.tolerance / ((1 << z) * options.extent); + var tile = { + features: [], + numPoints: 0, + numSimplified: 0, + numFeatures: 0, + source: null, + x: tx, + y: ty, + z: z, + 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, options); - scale$5(p0, p0, 1 / this.worldSize); - scale$5(p1, p1, 1 / this.worldSize); + var minX = features[i].minX; + var minY = features[i].minY; + var maxX = features[i].maxX; + var maxY = features[i].maxY; - return new Ray([p0[0], p0[1], p0[2]], normalize([], sub$4([], p1, p0))); + 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; +} - /** - * Helper method to convert the ray intersection with the map plane to MercatorCoordinate. - * - * @param {RayIntersectionResult} rayIntersection - * @returns {MercatorCoordinate} - * @private - */ - rayIntersectionCoordinate(rayIntersection ) { - const {p0, p1, t} = rayIntersection; +function addFeature(tile, feature, tolerance, options) { - const z0 = mercatorZfromAltitude(p0[2], this._center.lat); - const z1 = mercatorZfromAltitude(p1[2], this._center.lat); + var geom = feature.geometry, + type = feature.type, + simplified = []; - return new MercatorCoordinate( - number(p0[0], p1[0], t) / this.worldSize, - number(p0[1], p1[1], t) / this.worldSize, - number(z0, z1, t)); - } + 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++; + } - /** - * Given a point on screen, returns MercatorCoordinate. - * @param {Point} p Top left origin screen point, in pixels. - * @param {number} z Optional altitude of the map plane, defaulting to elevation at center. - * @private - */ - pointCoordinate(p , z = this._centerAltitude) { - return this.projection.createTileTransform(this, this.worldSize).pointCoordinate(p.x, p.y, z); - } + } else if (type === 'LineString') { + addLine(simplified, geom, tile, tolerance, false, false); - /** - * Given a point on screen, returns MercatorCoordinate. - * In 3D mode, raycast to terrain. In 2D mode, behaves the same as {@see pointCoordinate}. - * For p above terrain, don't return point behind camera but clamp p.y at the top of terrain. - * @param {Point} p top left origin screen point, in pixels. - * @private - */ - pointCoordinate3D(p ) { - if (!this.elevation) return this.pointCoordinate(p); - const elevation = this.elevation; - let raycast = this.elevation.pointCoordinate(p); - if (raycast) return new MercatorCoordinate(raycast[0], raycast[1], raycast[2]); - let start = 0, end = this.horizonLineFromTop(); - if (p.y > end) return this.pointCoordinate(p); // holes between tiles below horizon line or below bottom. - const samples = 10; - const threshold = 0.02 * end; - const r = p.clone(); + } else if (type === 'MultiLineString' || type === 'Polygon') { + for (i = 0; i < geom.length; i++) { + addLine(simplified, geom[i], tile, tolerance, type === 'Polygon', i === 0); + } - for (let i = 0; i < samples && end - start > threshold; i++) { - r.y = number(start, end, 0.66); // non uniform binary search favoring points closer to horizon. - const rCast = elevation.pointCoordinate(r); - if (rCast) { - end = r.y; - raycast = rCast; - } else { - start = r.y; + } 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, true, i === 0); } } - return raycast ? new MercatorCoordinate(raycast[0], raycast[1], raycast[2]) : this.pointCoordinate(p); } - /** - * Returns true if a screenspace Point p, is above the horizon. - * This approximates the map as an infinite plane and does not account for z0-z3 - * wherein the map is small quad with whitespace above the north pole and below the south pole. - * - * @param {Point} p - * @returns {boolean} - * @private - */ - isPointAboveHorizon(p ) { - if (!this.elevation) { - const horizon = this.horizonLineFromTop(); - return p.y < horizon; - } else { - return !this.elevation.pointCoordinate(p); + if (simplified.length) { + var tags = feature.tags || null; + if (type === 'LineString' && options.lineMetrics) { + tags = {}; + for (var key in feature.tags) tags[key] = feature.tags[key]; + tags['mapbox_clip_start'] = geom.start / geom.size; + tags['mapbox_clip_end'] = geom.end / geom.size; + } + var tileFeature = { + geometry: simplified, + type: type === 'Polygon' || type === 'MultiPolygon' ? 3 : + type === 'LineString' || type === 'MultiLineString' ? 2 : 1, + tags: tags + }; + if (feature.id !== null) { + tileFeature.id = feature.id; } + tile.features.push(tileFeature); } +} - /** - * Given a coordinate, return the screen point that corresponds to it - * @param {Coordinate} coord - * @param {boolean} sampleTerrainIn3D in 3D mode (terrain enabled), sample elevation for the point. - * If false, do the same as in 2D mode, assume flat camera elevation plane for all points. - * @returns {Point} screen point - * @private - */ - _coordinatePoint(coord , sampleTerrainIn3D ) { - const elevation = sampleTerrainIn3D && this.elevation ? this.elevation.getAtPointOrZero(coord, this._centerAltitude) : this._centerAltitude; - const p = [coord.x * this.worldSize, coord.y * this.worldSize, elevation + coord.toAltitude(), 1]; - transformMat4$1(p, p, this.pixelMatrix); - return p[3] > 0 ? - new pointGeometry(p[0] / p[3], p[1] / p[3]) : - new pointGeometry(Number.MAX_VALUE, Number.MAX_VALUE); - } +function addLine(result, geom, tile, tolerance, isPolygon, isOuter) { + var sqTolerance = tolerance * tolerance; - _getBounds(min , max ) { - const topLeft = new pointGeometry(this._edgeInsets.left, this._edgeInsets.top); - const topRight = new pointGeometry(this.width - this._edgeInsets.right, this._edgeInsets.top); - const bottomRight = new pointGeometry(this.width - this._edgeInsets.right, this.height - this._edgeInsets.bottom); - const bottomLeft = new pointGeometry(this._edgeInsets.left, this.height - this._edgeInsets.bottom); + if (tolerance > 0 && (geom.size < (isPolygon ? sqTolerance : tolerance))) { + tile.numPoints += geom.length / 3; + return; + } - // Consider far points at the maximum possible elevation - // and near points at the minimum to ensure full coverage. - let tl = this.pointCoordinate(topLeft, min); - let tr = this.pointCoordinate(topRight, min); - const br = this.pointCoordinate(bottomRight, max); - const bl = this.pointCoordinate(bottomLeft, max); + var ring = []; - // Snap points if off the edges of map (Latitude is too high or low). - const slope = (p1, p2) => (p2.y - p1.y) / (p2.x - p1.x); + for (var i = 0; i < geom.length; i += 3) { + if (tolerance === 0 || geom[i + 2] > sqTolerance) { + tile.numSimplified++; + ring.push(geom[i]); + ring.push(geom[i + 1]); + } + tile.numPoints++; + } - if (tl.y > 1 && tr.y >= 0) tl = new MercatorCoordinate((1 - bl.y) / slope(bl, tl) + bl.x, 1); - else if (tl.y < 0 && tr.y <= 1) tl = new MercatorCoordinate(-bl.y / slope(bl, tl) + bl.x, 0); + if (isPolygon) rewind(ring, isOuter); - if (tr.y > 1 && tl.y >= 0) tr = new MercatorCoordinate((1 - br.y) / slope(br, tr) + br.x, 1); - else if (tr.y < 0 && tl.y <= 1) tr = new MercatorCoordinate(-br.y / slope(br, tr) + br.x, 0); + result.push(ring); +} - return new LngLatBounds() - .extend(this.coordinateLocation(tl)) - .extend(this.coordinateLocation(tr)) - .extend(this.coordinateLocation(bl)) - .extend(this.coordinateLocation(br)); +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]); } - - _getBounds3D() { - assert_1(this.elevation); - const elevation = ((this.elevation ) ); - if (!elevation.visibleDemTiles.length) { return this._getBounds(0, 0); } - const minmax = elevation.visibleDemTiles.reduce((acc, t) => { - if (t.dem) { - const tree = t.dem.tree; - acc.min = Math.min(acc.min, tree.minimums[0]); - acc.max = Math.max(acc.max, tree.maximums[0]); - } - return acc; - }, {min: Number.MAX_VALUE, max: 0}); - assert_1(minmax.min !== Number.MAX_VALUE); - return this._getBounds(minmax.min * elevation.exaggeration(), minmax.max * elevation.exaggeration()); + 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; + } } +} - /** - * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not - * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region. - * - * @returns {LngLatBounds} Returns a {@link LngLatBounds} object describing the map's geographical bounds. - */ - getBounds() { - if (this._terrainEnabled()) return this._getBounds3D(); - return this._getBounds(0, 0); - } +function geojsonvt(data, options) { + return new GeoJSONVT(data, options); +} - /** - * Returns position of horizon line from the top of the map in pixels. - * If horizon is not visible, returns 0 by default or a negative value if called with clampToTop = false. - * @private - */ - horizonLineFromTop(clampToTop = true) { - // h is height of space above map center to horizon. - const h = this.height / 2 / Math.tan(this._fov / 2) / Math.tan(Math.max(this._pitch, 0.1)) + this.centerOffset.y; - const offset = this.height / 2 - h * (1 - this._horizonShift); - return clampToTop ? Math.max(0, offset) : offset; - } +function GeoJSONVT(data, options) { + options = this.options = extend(Object.create(this.options), options); - /** - * Returns the maximum geographical bounds the map is constrained to, or `null` if none set. - * @returns {LngLatBounds} {@link LngLatBounds}. - */ - getMaxBounds() { - return this.maxBounds; - } + var debug = options.debug; - /** - * Sets or clears the map's geographical constraints. - * - * @param {LngLatBounds} bounds A {@link LngLatBounds} object describing the new geographic boundaries of the map. - */ - setMaxBounds(bounds ) { - this.maxBounds = bounds; + if (debug) console.time('preprocess data'); - this.minLat = -MAX_MERCATOR_LATITUDE; - this.maxLat = MAX_MERCATOR_LATITUDE; - this.minLng = -180; - this.maxLng = 180; + if (options.maxZoom < 0 || options.maxZoom > 24) throw new Error('maxZoom should be in the 0-24 range'); + if (options.promoteId && options.generateId) throw new Error('promoteId and generateId cannot be used together.'); - if (bounds) { - this.minLat = bounds.getSouth(); - this.maxLat = bounds.getNorth(); - this.minLng = bounds.getWest(); - this.maxLng = bounds.getEast(); - if (this.maxLng < this.minLng) this.maxLng += 360; - } + var features = convert(data, options); - this.worldMinX = mercatorXfromLng$1(this.minLng) * this.tileSize; - this.worldMaxX = mercatorXfromLng$1(this.maxLng) * this.tileSize; - this.worldMinY = mercatorYfromLat$1(this.maxLat) * this.tileSize; - this.worldMaxY = mercatorYfromLat$1(this.minLat) * this.tileSize; + this.tiles = {}; + this.tileCoords = []; - this._constrain(); + 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; } - calculatePosMatrix(unwrappedTileID , worldSize ) { - return this.projection.createTileTransform(this, worldSize).createTileMatrix(unwrappedTileID); + features = wrap(features, options); + + // 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)); } +} - calculateDistanceTileData(unwrappedTileID ) { - const distanceDataKey = unwrappedTileID.key; - const cache = this._distanceTileDataCache; - if (cache[distanceDataKey]) { - return cache[distanceDataKey]; - } +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 + lineMetrics: false, // whether to calculate line metrics + promoteId: null, // name of a feature property to be promoted to feature.id + generateId: false, // whether to generate feature ids. Cannot be used with promoteId + debug: 0 // logging level (0, 1 or 2) +}; - //Calculate the offset of the tile - const canonical = unwrappedTileID.canonical; - const windowScaleFactor = 1 / this.height; - const scale = this.cameraWorldSize / this.zoomScale(canonical.z); - const unwrappedX = canonical.x + Math.pow(2, canonical.z) * unwrappedTileID.wrap; - const tX = unwrappedX * scale; - const tY = canonical.y * scale; +GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) { - const center = this.point; + var stack = [features, z, x, y], + options = this.options, + debug = options.debug; - // Calculate the bearing vector by rotating unit vector [0, -1] clockwise - const angle = this.angle; - const bX = Math.sin(-angle); - const bY = -Math.cos(-angle); + // avoid recursion by using a processing queue + while (stack.length) { + y = stack.pop(); + x = stack.pop(); + z = stack.pop(); + features = stack.pop(); - const cX = (center.x - tX) * windowScaleFactor; - const cY = (center.y - tY) * windowScaleFactor; - cache[distanceDataKey] = { - bearing: [bX, bY], - center: [cX, cY], - scale: (scale / EXTENT$1) * windowScaleFactor - }; + var z2 = 1 << z, + id = toID(z, x, y), + tile = this.tiles[id]; - return cache[distanceDataKey]; - } + if (!tile) { + if (debug > 1) console.time('creation'); - /** - * Calculate the fogTileMatrix that, given a tile coordinate, can be used to - * calculate its position relative to the camera in units of pixels divided - * by the map height. Used with fog for consistent computation of distance - * from camera. - * - * @param {UnwrappedTileID} unwrappedTileID; - * @private - */ - calculateFogTileMatrix(unwrappedTileID ) { - const fogTileMatrixKey = unwrappedTileID.key; - const cache = this._fogTileMatrixCache; - if (cache[fogTileMatrixKey]) { - return cache[fogTileMatrixKey]; + tile = this.tiles[id] = createTile(features, z, x, y, options); + 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++; + } } - const posMatrix = this.calculatePosMatrix(unwrappedTileID, this.cameraWorldSize); - multiply$3(posMatrix, this.worldToFogMatrix, posMatrix); + // save reference to original geometry in tile so that we can drill down later if we stop now + tile.source = features; - cache[fogTileMatrixKey] = new Float32Array(posMatrix); - return cache[fogTileMatrixKey]; - } + // 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; - /** - * Calculate the projMatrix that, given a tile coordinate, would be used to display the tile on the screen. - * @param {UnwrappedTileID} unwrappedTileID; - * @private - */ - calculateProjMatrix(unwrappedTileID , aligned = false) { - const projMatrixKey = unwrappedTileID.key; - const cache = aligned ? this._alignedProjMatrixCache : this._projMatrixCache; - if (cache[projMatrixKey]) { - return cache[projMatrixKey]; + // 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; } - const posMatrix = this.calculatePosMatrix(unwrappedTileID, this.worldSize); - const projMatrix = this.projection.isReprojectedInTileSpace ? - this.mercatorMatrix : (aligned ? this.alignedProjMatrix : this.projMatrix); - multiply$3(posMatrix, projMatrix, posMatrix); + // if we slice further down, no need to keep source geometry + tile.source = null; - cache[projMatrixKey] = new Float32Array(posMatrix); - return cache[projMatrixKey]; - } + if (features.length === 0) continue; - calculatePixelsToTileUnitsMatrix(tile ) { - const key = tile.tileID.key; - const cache = this._pixelsToTileUnitsCache; - if (cache[key]) { - return cache[key]; + 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, options); + right = clip(features, z2, x + k2, x + k4, 0, tile.minX, tile.maxX, options); + features = null; + + if (left) { + tl = clip(left, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options); + bl = clip(left, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options); + left = null; } - const matrix = getPixelsToTileUnitsMatrix(tile, this); - cache[key] = matrix; - return cache[key]; + if (right) { + tr = clip(right, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options); + br = clip(right, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options); + 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); } +}; - customLayerMatrix() { - return this.mercatorMatrix.slice(); +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 transformTile(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)]; } - recenterOnTerrain() { + if (!parent || !parent.source) return null; - if (!this._elevation) - return; + // 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] ? transformTile(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; +} - const elevation = this._elevation; - this._updateCameraState(); +// - // Cast a ray towards the sea level and find the intersection point with the terrain. - // We need to use a camera position that exists in the same coordinate space as the data. - // The default camera position might have been compensated by the active projection model. - const mercPixelsPerMeter = mercatorZfromAltitude(1, this._center.lat) * this.worldSize; - const start = this._computeCameraPosition(mercPixelsPerMeter); - const dir = this._camera.forward(); + + + + + - // The raycast function expects z-component to be in meters - const metersToMerc = mercatorZfromAltitude(1.0, this._center.lat); - start[2] /= metersToMerc; - dir[2] /= metersToMerc; - normalize(dir, dir); + + - const t = elevation.raycast(start, dir, elevation.exaggeration()); + + + + - if (t) { - const point = scaleAndAdd([], start, dir, t); - const newCenter = new MercatorCoordinate(point[0], point[1], mercatorZfromAltitude(point[2], latFromMercatorY(point[1]))); + + + + + + + + - const camToNew = [newCenter.x - start[0], newCenter.y - start[1], newCenter.z - start[2] * metersToMerc]; - const maxAltitude = (newCenter.z + length(camToNew)) * this._projectionScaler; - this._cameraZoom = this._zoomFromMercatorZ(maxAltitude); + + + + - // Camera zoom has to be updated as the orbit distance might have changed - this._centerAltitude = newCenter.toAltitude(); - this._center = this.coordinateLocation(newCenter); - this._updateZoomFromElevation(); - this._constrain(); - this._calcMatrices(); - } - } + - _constrainCameraAltitude() { - if (!this._elevation) - return; + + - const elevation = this._elevation; - this._updateCameraState(); + + + + + - // Find uncompensated camera position for elevation sampling. - // The default camera position might have been compensated by the active projection model. - const mercPixelsPerMeter = mercatorZfromAltitude(1, this._center.lat) * this.worldSize; - const pos = this._computeCameraPosition(mercPixelsPerMeter); +function loadGeoJSONTile(params , callback ) { + const canonical = params.tileID.canonical; - const elevationAtCamera = elevation.getAtPointOrZero(new MercatorCoordinate(...pos)); - const minHeight = this._minimumHeightOverTerrain() * Math.cos(degToRad(this._maxPitch)); - const terrainElevation = this.pixelsPerMeter / this.worldSize * elevationAtCamera; - const cameraHeight = this._camera.position[2] - terrainElevation; + if (!this._geoJSONIndex) { + return callback(null, null); // we couldn't load the file + } - if (cameraHeight < minHeight) { - const center = this.locationCoordinate(this._center, this._centerAltitude); - const cameraToCenter = [center.x - pos[0], center.y - pos[1], center.z - pos[2]]; - const prevDistToCamera = length(cameraToCenter); + const geoJSONTile = this._geoJSONIndex.getTile(canonical.z, canonical.x, canonical.y); + if (!geoJSONTile) { + return callback(null, null); // nothing in the given tile + } - // Adjust the camera vector so that the camera is placed above the terrain. - // Distance between the camera and the center point is kept constant. - cameraToCenter[2] -= (minHeight - cameraHeight) / this._projectionScaler; + const geojsonWrapper = new GeoJSONWrapper$1(geoJSONTile.features); - const newDistToCamera = length(cameraToCenter); - if (newDistToCamera === 0) - return; + // Encode the geojson-vt tile into binary vector tile form. This + // is a convenience that allows `FeatureIndex` to operate the same way + // across `VectorTileSource` and `GeoJSONSource` data. + let 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); + } - scale$4(cameraToCenter, cameraToCenter, prevDistToCamera / newDistToCamera * this._projectionScaler); - this._camera.position = [center.x - cameraToCenter[0], center.y - cameraToCenter[1], center.z * this._projectionScaler - cameraToCenter[2]]; + callback(null, { + vectorTile: geojsonWrapper, + rawData: pbf.buffer + }); +} - this._camera.orientation = orientationFromFrame(cameraToCenter, this._camera.up()); - this._updateStateFromCamera(); +/** + * 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 + */ +class GeoJSONWorkerSource extends ref_properties.VectorTileWorkerSource { + + + + /** + * @param [loadGeoJSON] Optional method for custom loading/parsing of + * GeoJSON based on parameters passed from the main-thread Source. + * See {@link GeoJSONWorkerSource#loadGeoJSON}. + * @private + */ + constructor(actor , layerIndex , availableImages , isSpriteLoaded , loadGeoJSON ) { + super(actor, layerIndex, availableImages, isSpriteLoaded, loadGeoJSONTile); + if (loadGeoJSON) { + this.loadGeoJSON = loadGeoJSON; } } - _constrain() { - if (!this.center || !this.width || !this.height || this._constraining) return; - - this._constraining = true; + /** + * 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. + * + * When `loadData` requests come in faster than they can be processed, + * they are coalesced into a single request using the latest data. + * See {@link GeoJSONWorkerSource#coalesce} + * + * @param params + * @param callback + * @private + */ + loadData(params , callback ) { + const requestParam = params && params.request; + const perf = requestParam && requestParam.collectResourceTiming; - // alternate constraining for non-Mercator projections - if (this.projection.isReprojectedInTileSpace) { - const center = this.center; - center.lat = clamp(center.lat, this.minLat, this.maxLat); - if (this.maxBounds || !this.renderWorldCopies) center.lng = clamp(center.lng, this.minLng, this.maxLng); - this.center = center; - this._constraining = false; - return; - } + this.loadGeoJSON(params, (err , data ) => { + if (err || !data) { + return callback(err); + } else if (typeof data !== 'object') { + return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`)); + } else { + geojsonRewind(data, true); - const unmodified = this._unmodified; - const {x, y} = this.point; - let s = 0; - let x2 = x; - let y2 = y; - const w2 = this.width / 2; - const h2 = this.height / 2; + try { + if (params.filter) { + const compiled = ref_properties.createExpression(params.filter, {type: 'boolean', 'property-type': 'data-driven', overridable: false, transition: false}); + if (compiled.result === 'error') + throw new Error(compiled.value.map(err => `${err.key}: ${err.message}`).join(', ')); - const minY = this.worldMinY * this.scale; - const maxY = this.worldMaxY * this.scale; - if (y - h2 < minY) y2 = minY + h2; - if (y + h2 > maxY) y2 = maxY - h2; - if (maxY - minY < this.height) { - s = Math.max(s, this.height / (maxY - minY)); - y2 = (maxY + minY) / 2; - } + const features = data.features.filter(feature => compiled.value.evaluate({zoom: 0}, feature)); + data = {type: 'FeatureCollection', features}; + } - if (this.maxBounds || !this._renderWorldCopies || !this.projection.wrap) { - const minX = this.worldMinX * this.scale; - const maxX = this.worldMaxX * this.scale; + this._geoJSONIndex = params.cluster ? + new Supercluster(getSuperclusterOptions(params)).load(data.features) : + geojsonvt(data, params.geojsonVtOptions); + } catch (err) { + return callback(err); + } - // Translate to positive positions with the map center in the center position. - // This ensures that the map snaps to the correct edge. - const shift = this.worldSize / 2 - (minX + maxX) / 2; - x2 = (x + shift + this.worldSize) % this.worldSize - shift; + this.loaded = {}; - if (x2 - w2 < minX) x2 = minX + w2; - if (x2 + w2 > maxX) x2 = maxX - w2; - if (maxX - minX < this.width) { - s = Math.max(s, this.width / (maxX - minX)); - x2 = (maxX + minX) / 2; + const result = {}; + if (perf) { + const resourceTimingData = ref_properties.getPerformanceMeasurement(requestParam); + // 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); } - } + }); + } - if (x2 !== x || y2 !== y) { // pan the map to fit the range - this.center = this.unproject(new pointGeometry(x2, y2)); - } - if (s) { // scale the map to fit the range - this.zoom += this.scaleZoom(s); - } + /** + * 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.uid The UID for this tile. + * @private + */ + reloadTile(params , callback ) { + const loaded = this.loaded, + uid = params.uid; - this._constrainCameraAltitude(); - this._unmodified = unmodified; - this._constraining = false; + if (loaded && loaded[uid]) { + return super.reloadTile(params, callback); + } else { + return this.loadTile(params, callback); + } } /** - * Returns the minimum zoom at which `this.width` can fit max longitude range - * and `this.height` can fit max latitude range. + * Fetch and parse GeoJSON according to the given params. Calls `callback` + * with `(err, data)`, where `data` is a parsed GeoJSON object. * - * @returns {number} The zoom value. + * 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. + * @private */ - _minZoomForBounds() { - let minZoom = Math.max(0, this.scaleZoom(this.height / (this.worldMaxY - this.worldMinY))); - if (this.maxBounds) { - minZoom = Math.max(minZoom, this.scaleZoom(this.width / (this.worldMaxX - this.worldMinX))); + 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) { + ref_properties.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 given to '${params.source}' is not a valid GeoJSON object.`)); + } + } else { + return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`)); } - return minZoom; } - /** - * Returns the maximum distance of the camera from the center of the bounds, such that - * `this.width` can fit max longitude range and `this.height` can fit max latitude range. - * In mercator units. - * - * @returns {number} The mercator z coordinate. - */ - _maxCameraBoundsDistance() { - return this._mercatorZfromZoom(this._minZoomForBounds()); + getClusterExpansionZoom(params , callback ) { + try { + callback(null, this._geoJSONIndex.getClusterExpansionZoom(params.clusterId)); + } catch (e) { + callback(e); + } } - _calcMatrices() { - if (!this.height) return; + getClusterChildren(params , callback ) { + try { + callback(null, this._geoJSONIndex.getChildren(params.clusterId)); + } catch (e) { + callback(e); + } + } - const halfFov = this._fov / 2; - const offset = this.centerOffset; + getClusterLeaves(params , callback ) { + try { + callback(null, this._geoJSONIndex.getLeaves(params.clusterId, params.limit, params.offset)); + } catch (e) { + callback(e); + } + } +} - // Z-axis uses pixel coordinates when globe mode is enabled - const pixelsPerMeter = this.pixelsPerMeter; +function getSuperclusterOptions({superclusterOptions, clusterProperties}) { + if (!clusterProperties || !superclusterOptions) return superclusterOptions; - this._projectionScaler = pixelsPerMeter / (mercatorZfromAltitude(1, this.center.lat) * this.worldSize); - this.cameraToCenterDistance = 0.5 / Math.tan(halfFov) * this.height * this._projectionScaler; + const mapExpressions = {}; + const reduceExpressions = {}; + const globals = {accumulated: null, zoom: 0}; + const feature = {properties: null}; + const propertyNames = Object.keys(clusterProperties); - this._updateCameraState(); + for (const key of propertyNames) { + const [operator, mapExpression] = clusterProperties[key]; - this._farZ = this.projection.farthestPixelDistance(this); + const mapExpressionParsed = ref_properties.createExpression(mapExpression); + const reduceExpressionParsed = ref_properties.createExpression( + typeof operator === 'string' ? [operator, ['accumulated'], ['get', key]] : operator); - // The larger the value of nearZ is - // - the more depth precision is available for features (good) - // - clipping starts appearing sooner when the camera is close to 3d features (bad) - // - // Smaller values worked well for mapbox-gl-js but deckgl was encountering precision issues - // when rendering it's layers using custom layers. This value was experimentally chosen and - // seems to solve z-fighting issues in deckgl while not clipping buildings too close to the camera. - this._nearZ = this.height / 50; + ref_properties.assert_1(mapExpressionParsed.result === 'success'); + ref_properties.assert_1(reduceExpressionParsed.result === 'success'); - const zUnit = this.projection.zAxisUnit === "meters" ? pixelsPerMeter : 1.0; - const worldToCamera = this._camera.getWorldToCamera(this.worldSize, zUnit); - const cameraToClip = this._camera.getCameraToClipPerspective(this._fov, this.width / this.height, this._nearZ, this._farZ); + mapExpressions[key] = mapExpressionParsed.value; + reduceExpressions[key] = reduceExpressionParsed.value; + } - // Apply center of perspective offset - cameraToClip[8] = -offset.x * 2 / this.width; - cameraToClip[9] = offset.y * 2 / this.height; + superclusterOptions.map = (pointProperties) => { + feature.properties = pointProperties; + const properties = {}; + for (const key of propertyNames) { + properties[key] = mapExpressions[key].evaluate(globals, feature); + } + return properties; + }; + superclusterOptions.reduce = (accumulated, clusterProperties) => { + feature.properties = clusterProperties; + for (const key of propertyNames) { + globals.accumulated = accumulated[key]; + accumulated[key] = reduceExpressions[key].evaluate(globals, feature); + } + }; - let m = mul$3([], cameraToClip, worldToCamera); + return superclusterOptions; +} - if (this.projection.isReprojectedInTileSpace) { - // Projections undistort as you zoom in (shear, scale, rotate). - // Apply the undistortion around the center of the map. - const mc = this.locationCoordinate(this.center); - const adjustments = identity$3([]); - translate$2(adjustments, adjustments, [mc.x * this.worldSize, mc.y * this.worldSize, 0]); - multiply$3(adjustments, adjustments, getProjectionAdjustments(this)); - translate$2(adjustments, adjustments, [-mc.x * this.worldSize, -mc.y * this.worldSize, 0]); - multiply$3(m, m, adjustments); - this.inverseAdjustmentMatrix = getProjectionAdjustmentInverted(this); - } else { - this.inverseAdjustmentMatrix = [1, 0, 0, 1]; - } +// - // The mercatorMatrix can be used to transform points from mercator coordinates - // ([0, 0] nw, [1, 1] se) to GL coordinates. - this.mercatorMatrix = scale$3([], m, [this.worldSize, this.worldSize, this.worldSize / pixelsPerMeter, 1.0]); + + + + + + + + - this.projMatrix = m; + + + + + - // For tile cover calculation, use inverted of base (non elevated) matrix - // as tile elevations are in tile coordinates and relative to center elevation. - this.invProjMatrix = invert$3(new Float64Array(16), this.projMatrix); +/** + * @private + */ +class Worker { + + + + + + + + + + + + - const view = new Float32Array(16); - identity$3(view); - scale$3(view, view, [1, -1, 1]); - rotateX(view, view, this._pitch); - rotateZ(view, view, this.angle); + constructor(self ) { + ref_properties.PerformanceUtils.measure('workerEvaluateScript'); + this.self = self; + this.actor = new ref_properties.Actor(self, this); - const projection = perspective(new Float32Array(16), this._fov, this.width / this.height, this._nearZ, this._farZ); - // The distance in pixels the skybox needs to be shifted down by to meet the shifted horizon. - const skyboxHorizonShift = (Math.PI / 2 - this._pitch) * (this.height / this._fov) * this._horizonShift; - // Apply center of perspective offset to skybox projection - projection[8] = -offset.x * 2 / this.width; - projection[9] = (offset.y + skyboxHorizonShift) * 2 / this.height; - this.skyboxMatrix = multiply$3(view, projection, view); + this.layerIndexes = {}; + this.availableImages = {}; + this.isSpriteLoaded = {}; - // 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. - const point = this.point; - const x = point.x, y = point.y; - const 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; - const alignedM = new Float64Array(m); - translate$2(alignedM, alignedM, [ dx > 0.5 ? dx - 1 : dx, dy > 0.5 ? dy - 1 : dy, 0 ]); - this.alignedProjMatrix = alignedM; + this.projections = {}; + this.defaultProjection = ref_properties.getProjection({name: 'mercator'}); - m = create$3(); - scale$3(m, m, [this.width / 2, -this.height / 2, 1]); - translate$2(m, m, [1, -1, 0]); - this.labelPlaneMatrix = m; + this.workerSourceTypes = { + vector: ref_properties.VectorTileWorkerSource, + geojson: GeoJSONWorkerSource + }; - m = create$3(); - scale$3(m, m, [1, -1, 1]); - translate$2(m, m, [-1, -1, 0]); - scale$3(m, m, [2 / this.width, 2 / this.height, 1]); - this.glCoordMatrix = m; + // [mapId][sourceType][sourceName] => worker source instance + this.workerSources = {}; + this.demWorkerSources = {}; - // matrix for conversion from location to screen coordinates - this.pixelMatrix = multiply$3(new Float64Array(16), this.labelPlaneMatrix, this.projMatrix); + this.self.registerWorkerSource = (name , WorkerSource ) => { + if (this.workerSourceTypes[name]) { + throw new Error(`Worker source with name "${name}" already registered.`); + } + this.workerSourceTypes[name] = WorkerSource; + }; - this._calcFogMatrices(); - this._distanceTileDataCache = {}; + // This is invoked by the RTL text plugin when the download via the `importScripts` call has finished, and the code has been parsed. + this.self.registerRTLTextPlugin = (rtlTextPlugin ) => { + if (ref_properties.plugin.isParsed()) { + throw new Error('RTL text plugin already registered.'); + } + ref_properties.plugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping; + ref_properties.plugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText; + ref_properties.plugin['processStyledBidirectionalText'] = rtlTextPlugin.processStyledBidirectionalText; + }; + } - // inverse matrix for conversion from screen coordinates to location - m = invert$3(new Float64Array(16), this.pixelMatrix); - if (!m) throw new Error("failed to invert matrix"); - this.pixelMatrixInverse = m; + clearCaches(mapId , unused , callback ) { + delete this.layerIndexes[mapId]; + delete this.availableImages[mapId]; + delete this.workerSources[mapId]; + delete this.demWorkerSources[mapId]; + callback(); + } - this._projMatrixCache = {}; - this._alignedProjMatrixCache = {}; - this._pixelsToTileUnitsCache = {}; + checkIfReady(mapID , unused , callback ) { + // noop, used to check if a worker is fully set up and ready to receive messages + callback(); } - _calcFogMatrices() { - this._fogTileMatrixCache = {}; + setReferrer(mapID , referrer ) { + this.referrer = referrer; + } - const cameraWorldSize = this.cameraWorldSize; - const cameraPixelsPerMeter = this.cameraPixelsPerMeter; - const cameraPos = this._camera.position; + spriteLoaded(mapId , bool ) { + this.isSpriteLoaded[mapId] = bool; + for (const workerSource in this.workerSources[mapId]) { + const ws = this.workerSources[mapId][workerSource]; + for (const source in ws) { + if (ws[source] instanceof ref_properties.VectorTileWorkerSource) { + ws[source].isSpriteLoaded = bool; + ws[source].fire(new ref_properties.Event('isSpriteLoaded')); + } + } + } + } - // The mercator fog matrix encodes transformation necessary to transform a position to camera fog space (in meters): - // translates p to camera origin and transforms it from pixels to meters. The windowScaleFactor is used to have a - // consistent transformation across different window sizes. - // - p = p - cameraOrigin - // - p.xy = p.xy * cameraWorldSize * windowScaleFactor - // - p.z = p.z * cameraPixelsPerMeter * windowScaleFactor - const windowScaleFactor = 1 / this.height; - const metersToPixel = [cameraWorldSize, cameraWorldSize, cameraPixelsPerMeter]; - scale$4(metersToPixel, metersToPixel, windowScaleFactor); - scale$4(cameraPos, cameraPos, -1); - multiply$4(cameraPos, cameraPos, metersToPixel); + setImages(mapId , images , callback ) { + this.availableImages[mapId] = images; + for (const workerSource in this.workerSources[mapId]) { + const ws = this.workerSources[mapId][workerSource]; + for (const source in ws) { + ws[source].availableImages = images; + } + } + callback(); + } + + enableTerrain(mapId , enable , callback ) { + this.terrain = enable; + callback(); + } + + setProjection(mapId , config ) { + this.projections[mapId] = ref_properties.getProjection(config); + } + + setLayers(mapId , layers , callback ) { + this.getLayerIndex(mapId).replace(layers); + callback(); + } + + updateLayers(mapId , params , callback ) { + this.getLayerIndex(mapId).update(params.layers, params.removedIds); + callback(); + } + + loadTile(mapId , params , callback ) { + ref_properties.assert_1(params.type); + const p = this.enableTerrain ? ref_properties.extend({enableTerrain: this.terrain}, params) : params; + p.projection = this.projections[mapId] || this.defaultProjection; + this.getWorkerSource(mapId, params.type, params.source).loadTile(p, callback); + } - const m = create$3(); - translate$2(m, m, cameraPos); - scale$3(m, m, metersToPixel); - this.mercatorFogMatrix = m; + loadDEMTile(mapId , params , callback ) { + const p = this.enableTerrain ? ref_properties.extend({buildQuadTree: this.terrain}, params) : params; + this.getDEMWorkerSource(mapId, params.source).loadTile(p, callback); + } - // The worldToFogMatrix can be used for conversion from world coordinates to relative camera position in - // units of fractions of the map height. Later composed with tile position to construct the fog tile matrix. - this.worldToFogMatrix = this._camera.getWorldToCameraPosition(cameraWorldSize, cameraPixelsPerMeter, windowScaleFactor); + reloadTile(mapId , params , callback ) { + ref_properties.assert_1(params.type); + const p = this.enableTerrain ? ref_properties.extend({enableTerrain: this.terrain}, params) : params; + p.projection = this.projections[mapId] || this.defaultProjection; + this.getWorkerSource(mapId, params.type, params.source).reloadTile(p, callback); } - _computeCameraPosition(targetPixelsPerMeter ) { - targetPixelsPerMeter = targetPixelsPerMeter || this.pixelsPerMeter; - const pixelSpaceConversion = targetPixelsPerMeter / this.pixelsPerMeter; + abortTile(mapId , params , callback ) { + ref_properties.assert_1(params.type); + this.getWorkerSource(mapId, params.type, params.source).abortTile(params, callback); + } - const dir = this._camera.forward(); - const center = this.point; + removeTile(mapId , params , callback ) { + ref_properties.assert_1(params.type); + this.getWorkerSource(mapId, params.type, params.source).removeTile(params, callback); + } - // Compute camera position using the following vector math: camera.position = map.center - camera.forward * cameraToCenterDist - // Camera distance to the center can be found in mercator units by subtracting the center elevation from - // camera's zenith position (which can be deduced from the zoom level) - const zoom = this._cameraZoom ? this._cameraZoom : this._zoom; - const altitude = this._mercatorZfromZoom(zoom) * pixelSpaceConversion; - const distance = altitude - targetPixelsPerMeter / this.worldSize * this._centerAltitude; + removeSource(mapId , params , callback ) { + ref_properties.assert_1(params.type); + ref_properties.assert_1(params.source); - return [ - center.x / this.worldSize - dir[0] * distance, - center.y / this.worldSize - dir[1] * distance, - targetPixelsPerMeter / this.worldSize * this._centerAltitude - dir[2] * distance - ]; - } + if (!this.workerSources[mapId] || + !this.workerSources[mapId][params.type] || + !this.workerSources[mapId][params.type][params.source]) { + return; + } - _updateCameraState() { - if (!this.height) return; + const worker = this.workerSources[mapId][params.type][params.source]; + delete this.workerSources[mapId][params.type][params.source]; - // Set camera orientation and move it to a proper distance from the map - this._camera.setPitchBearing(this._pitch, this.angle); - this._camera.position = this._computeCameraPosition(); + if (worker.removeSource !== undefined) { + worker.removeSource(params, callback); + } else { + callback(); + } } /** - * Apply a 3d translation to the camera position, but clamping it so that - * it respects the maximum longitude and latitude range set. - * - * @param {vec3} translation The translation vector. + * 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 */ - _translateCameraConstrained(translation ) { - const maxDistance = this._maxCameraBoundsDistance(); - // Define a ceiling in mercator Z - const maxZ = maxDistance * Math.cos(this._pitch); - const z = this._camera.position[2]; - const deltaZ = translation[2]; - let t = 1; - // we only need to clamp if the camera is moving upwards - if (deltaZ > 0) { - t = Math.min((maxZ - z) / deltaZ, 1); + loadWorkerSource(map , params , callback ) { + try { + this.self.importScripts(params.url); + callback(); + } catch (e) { + callback(e.toString()); } + } - this._camera.position = scaleAndAdd([], this._camera.position, translation, t); - this._updateStateFromCamera(); + syncRTLPluginState(map , state , callback ) { + try { + ref_properties.plugin.setState(state); + const pluginURL = ref_properties.plugin.getPluginURL(); + if ( + ref_properties.plugin.isLoaded() && + !ref_properties.plugin.isParsed() && + pluginURL != null // Not possible when `isLoaded` is true, but keeps flow happy + ) { + this.self.importScripts(pluginURL); + const complete = ref_properties.plugin.isParsed(); + const error = complete ? undefined : new Error(`RTL Text Plugin failed to import scripts from ${pluginURL}`); + callback(error, complete); + } + } catch (e) { + callback(e.toString()); + } } - _updateStateFromCamera() { - const position = this._camera.position; - const dir = this._camera.forward(); - const {pitch, bearing} = this._camera.getPitchBearing(); + getAvailableImages(mapId ) { + let availableImages = this.availableImages[mapId]; - // Compute zoom from the distance between camera and terrain - const centerAltitude = mercatorZfromAltitude(this._centerAltitude, this.center.lat) * this._projectionScaler; - const minHeight = this._mercatorZfromZoom(this._maxZoom) * Math.cos(degToRad(this._maxPitch)); - const height = Math.max((position[2] - centerAltitude) / Math.cos(pitch), minHeight); - const zoom = this._zoomFromMercatorZ(height); + if (!availableImages) { + availableImages = []; + } - // Cast a ray towards the ground to find the center point - scaleAndAdd(position, position, dir, height); + return availableImages; + } - this._pitch = clamp(pitch, degToRad(this.minPitch), degToRad(this.maxPitch)); - this.angle = wrap(bearing, -Math.PI, Math.PI); - this._setZoom(clamp(zoom, this._minZoom, this._maxZoom)); + getLayerIndex(mapId ) { + let layerIndexes = this.layerIndexes[mapId]; + if (!layerIndexes) { + layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex(); + } + return layerIndexes; + } - if (this._terrainEnabled()) - this._updateCameraOnTerrain(); + getWorkerSource(mapId , type , source ) { + if (!this.workerSources[mapId]) + this.workerSources[mapId] = {}; + if (!this.workerSources[mapId][type]) + this.workerSources[mapId][type] = {}; - this._center = this.coordinateLocation(new MercatorCoordinate(position[0], position[1], position[2])); - this._unmodified = false; - this._constrain(); - this._calcMatrices(); - } + if (!this.workerSources[mapId][type][source]) { + // use a wrapped actor so that we can attach a target mapId param + // to any messages invoked by the WorkerSource + const actor = { + send: (type, data, callback, _, mustQueue, metadata) => { + this.actor.send(type, data, callback, mapId, mustQueue, metadata); + }, + scheduler: this.actor.scheduler + }; + this.workerSources[mapId][type][source] = new (this.workerSourceTypes[type] )((actor ), this.getLayerIndex(mapId), this.getAvailableImages(mapId), this.isSpriteLoaded[mapId]); + } - _worldSizeFromZoom(zoom ) { - return Math.pow(2.0, zoom) * this.tileSize; + return this.workerSources[mapId][type][source]; } - _mercatorZfromZoom(zoom ) { - return this.cameraToCenterDistance / this._worldSizeFromZoom(zoom); - } + getDEMWorkerSource(mapId , source ) { + if (!this.demWorkerSources[mapId]) + this.demWorkerSources[mapId] = {}; - _minimumHeightOverTerrain() { - // Determine minimum height for the camera over the terrain related to current zoom. - // Values above than 2 allow max-pitch camera closer to e.g. top of the hill, exposing - // drape raster overscale artifacts or cut terrain (see under it) as it gets clipped on - // near plane. Returned value is in mercator coordinates. - const MAX_DRAPE_OVERZOOM = 2; - const zoom = Math.min((this._cameraZoom != null ? this._cameraZoom : this._zoom) + MAX_DRAPE_OVERZOOM, this._maxZoom); - return this._mercatorZfromZoom(zoom); + if (!this.demWorkerSources[mapId][source]) { + this.demWorkerSources[mapId][source] = new RasterDEMTileWorkerSource(); + } + + return this.demWorkerSources[mapId][source]; } - _zoomFromMercatorZ(z ) { - return this.scaleZoom(this.cameraToCenterDistance / (z * this.tileSize)); + enforceCacheSizeLimit(mapId , limit ) { + ref_properties.enforceCacheSizeLimit(limit); } - _terrainEnabled() { - if (!this._elevation) return false; - if (!this.projection.supportsTerrain) { - warnOnce('Terrain is not yet supported with alternate projections. Use mercator to enable terrain.'); - return false; - } - return true; + getWorkerPerformanceMetrics(mapId , params , callback ) { + callback(undefined, ref_properties.PerformanceUtils.getWorkerPerformanceMetrics()); } +} - // Check if any of the four corners are off the edge of the rendered map - // This function will return `false` for all non-mercator projection - anyCornerOffEdge(p0 , p1 ) { - const minX = Math.min(p0.x, p1.x); - const maxX = Math.max(p0.x, p1.x); - const minY = Math.min(p0.y, p1.y); - const maxY = Math.max(p0.y, p1.y); +/* global self, WorkerGlobalScope */ +if (typeof WorkerGlobalScope !== 'undefined' && + typeof self !== 'undefined' && + self instanceof WorkerGlobalScope) { + self.worker = new Worker(self); +} - const horizon = this.horizonLineFromTop(false); - if (minY < horizon) return true; +return Worker; - if (this.projection.name !== 'mercator') { - return false; - } +})); - const min = new pointGeometry(minX, minY); - const max = new pointGeometry(maxX, maxY); +define(['./shared'], (function (ref_properties) { 'use strict'; - const corners = [ - min, max, - new pointGeometry(minX, maxY), - new pointGeometry(maxX, minY), - ]; +'use strict'; - const minWX = (this.renderWorldCopies) ? -NUM_WORLD_COPIES : 0; - const maxWX = (this.renderWorldCopies) ? 1 + NUM_WORLD_COPIES : 1; - const minWY = 0; - const maxWY = 1; +var supported = isSupported; +var notSupportedReason_1 = notSupportedReason; - for (const corner of corners) { - const rayIntersection = this.pointRayIntersection(corner); - // Point is above the horizon - if (rayIntersection.t < 0) { - return true; - } - // Point is off the bondaries of the map - const coordinate = this.rayIntersectionCoordinate(rayIntersection); - if (coordinate.x < minWX || coordinate.y < minWY || - coordinate.x > maxWX || coordinate.y > maxWY) { - return true; - } - } +/** + * 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 !notSupportedReason(options); +} + +function notSupportedReason(options) { + if (!isBrowser()) return 'not a browser'; + if (!isArraySupported()) return 'insufficent Array support'; + if (!isFunctionSupported()) return 'insufficient Function support'; + if (!isObjectSupported()) return 'insufficient Object support'; + if (!isJSONSupported()) return 'insufficient JSON support'; + if (!isWorkerSupported()) return 'insufficient worker support'; + if (!isUint8ClampedArraySupported()) return 'insufficient Uint8ClampedArray support'; + if (!isArrayBufferSupported()) return 'insufficient ArrayBuffer support'; + if (!isCanvasGetImageDataSupported()) return 'insufficient Canvas/getImageData support'; + if (!isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)) return 'insufficient WebGL support'; + if (!isNotIE()) return 'insufficient ECMAScript 6 support'; +} + +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 && 'URL' in window)) { return false; } - // Checks the four corners of the frustum to see if they lie in the map's quad. - // - isHorizonVisible() { + var blob = new Blob([''], { type: 'text/javascript' }); + var workerURL = URL.createObjectURL(blob); + var supported; + var worker; - // we consider the horizon as visible if the angle between - // a the top plane of the frustum and the map plane is smaller than this threshold. - const horizonAngleEpsilon = 2; - if (this.pitch + radToDeg(this.fovAboveCenter) > (90 - horizonAngleEpsilon)) { - return true; - } + try { + worker = new Worker(workerURL); + supported = true; + } catch (e) { + supported = false; + } - return this.anyCornerOffEdge(new pointGeometry(0, 0), new pointGeometry(this.width, this.height)); + if (worker) { + worker.terminate(); } + URL.revokeObjectURL(workerURL); - /** - * Converts a zoom delta value into a physical distance travelled in web mercator coordinates. - * - * @param {vec3} center Destination mercator point of the movement. - * @param {number} zoomDelta Change in the zoom value. - * @returns {number} The distance in mercator coordinates. - */ - zoomDeltaToMovement(center , zoomDelta ) { - const distance = length(sub$4([], this._camera.position, center)); - const relativeZoom = this._zoomFromMercatorZ(distance) + zoomDelta; - return distance - this._mercatorZfromZoom(relativeZoom); + return supported; +} + +// IE11 only supports `Uint8ClampedArray` as of version +// [KB2929437](https://support.microsoft.com/en-us/kb/2929437) +function isUint8ClampedArraySupported() { + return 'Uint8ClampedArray' in window; +} + +// https://github.com/mapbox/mapbox-gl-supported/issues/19 +function isArrayBufferSupported() { + return ArrayBuffer.isView; +} + +// Some browsers or browser extensions block access to canvas data to prevent fingerprinting. +// Mapbox GL uses this API to load sprites and images in general. +function isCanvasGetImageDataSupported() { + var canvas = document.createElement('canvas'); + canvas.width = canvas.height = 1; + var context = canvas.getContext('2d'); + if (!context) { + return false; } + var imageData = context.getImageData(0, 0, 1, 1); + return imageData && imageData.width === canvas.width; +} - /* - * The camera looks at the map from a 3D (lng, lat, altitude) location. Let's use `cameraLocation` - * as the name for the location under the camera and on the surface of the earth (lng, lat, 0). - * `cameraPoint` is the projected position of the `cameraLocation`. - * - * This point is useful to us because only fill-extrusions that are between `cameraPoint` and - * the query point on the surface of the earth can extend and intersect the query. - * - * When the map is not pitched the `cameraPoint` is equivalent to the center of the map because - * the camera is right above the center of the map. - */ - getCameraPoint() { - const pitch = this._pitch; - const yOffset = Math.tan(pitch) * (this.cameraToCenterDistance || 1); - return this.centerPoint.add(new pointGeometry(0, yOffset)); +var isWebGLSupportedCache = {}; +function isWebGLSupportedCached(failIfMajorPerformanceCaveat) { + + if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) { + isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat); } + + return isWebGLSupportedCache[failIfMajorPerformanceCaveat]; } -exports.AUTH_ERR_MSG = AUTH_ERR_MSG; -exports.Aabb = Aabb; -exports.Actor = Actor; -exports.CanonicalTileID = CanonicalTileID; -exports.Color = Color; -exports.ColorMode = ColorMode; -exports.Context = Context; -exports.CullFaceMode = CullFaceMode; -exports.DEMData = DEMData; -exports.DataConstantProperty = DataConstantProperty; -exports.Debug = Debug; -exports.DedupedRequest = DedupedRequest; -exports.DepthMode = DepthMode; -exports.DepthStencilAttachment = DepthStencilAttachment; -exports.EXTENT = EXTENT$1; -exports.Elevation = Elevation; -exports.ErrorEvent = ErrorEvent; -exports.EvaluationParameters = EvaluationParameters; -exports.Event = Event; -exports.Evented = Evented; -exports.FreeCameraOptions = FreeCameraOptions; -exports.Frustum = Frustum; -exports.GLOBE_ZOOM_THRESHOLD_MAX = GLOBE_ZOOM_THRESHOLD_MAX; -exports.GlobeSharedBuffers = GlobeSharedBuffers; -exports.GlyphManager = GlyphManager; -exports.ImagePosition = ImagePosition; -exports.LineAtlas = LineAtlas; -exports.LngLat = LngLat; -exports.LngLatBounds = LngLatBounds; -exports.LocalGlyphMode = LocalGlyphMode; -exports.MercatorCoordinate = MercatorCoordinate; -exports.ONE_EM = ONE_EM; -exports.OverscaledTileID = OverscaledTileID; -exports.PerformanceMarkers = PerformanceMarkers; -exports.PerformanceUtils = PerformanceUtils; -exports.Properties = Properties; -exports.RGBAImage = RGBAImage; -exports.Ray = Ray; -exports.RequestManager = RequestManager; -exports.ResourceType = ResourceType; -exports.SegmentVector = SegmentVector; -exports.SourceCache = SourceCache; -exports.StencilMode = StencilMode; -exports.StructArrayLayout1ui2 = StructArrayLayout1ui2; -exports.StructArrayLayout2f1f2i16 = StructArrayLayout2f1f2i16; -exports.StructArrayLayout2i4 = StructArrayLayout2i4; -exports.StructArrayLayout2ui4 = StructArrayLayout2ui4; -exports.StructArrayLayout3f12 = StructArrayLayout3f12; -exports.StructArrayLayout3ui6 = StructArrayLayout3ui6; -exports.StructArrayLayout4i8 = StructArrayLayout4i8; -exports.Texture = Texture; -exports.Tile = Tile; -exports.Transform = Transform; -exports.Transitionable = Transitionable; -exports.Uniform1f = Uniform1f; -exports.Uniform1i = Uniform1i; -exports.Uniform2f = Uniform2f; -exports.Uniform3f = Uniform3f; -exports.Uniform4f = Uniform4f; -exports.UniformColor = UniformColor; -exports.UniformMatrix2f = UniformMatrix2f; -exports.UniformMatrix3f = UniformMatrix3f; -exports.UniformMatrix4f = UniformMatrix4f; -exports.ValidationError = ValidationError; -exports.VectorTileWorkerSource = VectorTileWorkerSource; -exports.WritingMode = WritingMode; -exports.ZoomHistory = ZoomHistory; -exports.add = add$4; -exports.addDynamicAttributes = addDynamicAttributes; -exports.adjoint = adjoint$1; -exports.assert_1 = assert_1; -exports.asyncAll = asyncAll; -exports.bezier = bezier$1; -exports.bindAll = bindAll; -exports.boundsAttributes = boundsAttributes; -exports.bufferConvexPolygon = bufferConvexPolygon; -exports.cacheEntryPossiblyAdded = cacheEntryPossiblyAdded; -exports.calculateGlobeMatrix = calculateGlobeMatrix; -exports.calculateGlobeMercatorMatrix = calculateGlobeMercatorMatrix; -exports.clamp = clamp; -exports.clearTileCache = clearTileCache; -exports.clipLine = clipLine; -exports.clone = clone$3; -exports.clone$1 = clone$9; -exports.collisionCircleLayout = collisionCircleLayout; -exports.config = config; -exports.create = create$3; -exports.create$1 = create$2; -exports.createExpression = createExpression; -exports.createLayout = createLayout; -exports.createStyleLayer = createStyleLayer; -exports.deepEqual = deepEqual; -exports.degToRad = degToRad; -exports.div = div; -exports.dot = dot; -exports.ease = ease; -exports.easeCubicInOut = easeCubicInOut; -exports.emitValidationErrors = emitValidationErrors; -exports.endsWith = endsWith; -exports.enforceCacheSizeLimit = enforceCacheSizeLimit; -exports.evaluateSizeForFeature = evaluateSizeForFeature; -exports.evaluateSizeForZoom = evaluateSizeForZoom; -exports.evaluateVariableOffset = evaluateVariableOffset; -exports.evented = evented; -exports.exported = exported; -exports.exported$1 = exported$1; -exports.extend = extend; -exports.extend$1 = extend$1; -exports.filterObject = filterObject; -exports.fromMat4 = fromMat4; -exports.fromRotation = fromRotation$2; -exports.getAnchorAlignment = getAnchorAlignment; -exports.getAnchorJustification = getAnchorJustification; -exports.getBounds = getBounds; -exports.getImage = getImage; -exports.getJSON = getJSON; -exports.getMapSessionAPI = getMapSessionAPI; -exports.getPerformanceMeasurement = getPerformanceMeasurement; -exports.getProjection = getProjection; -exports.getRTLTextPluginStatus = getRTLTextPluginStatus; -exports.getReferrer = getReferrer; -exports.getTilePoint = getTilePoint; -exports.getTileVec3 = getTileVec3; -exports.getVideo = getVideo; -exports.globeBuffersForTileMesh = globeBuffersForTileMesh; -exports.globeDenormalizeECEF = globeDenormalizeECEF; -exports.globeMatrixForTile = globeMatrixForTile; -exports.globePoleMatrixForTile = globePoleMatrixForTile; -exports.globeTileBounds = globeTileBounds; -exports.globeToMercatorTransition = globeToMercatorTransition; -exports.identity = identity$3; -exports.invert = invert; -exports.invert$1 = invert$3; -exports.isMapAuthenticated = isMapAuthenticated; -exports.isMapboxURL = isMapboxURL; -exports.isSafari = isSafari; -exports.length = length; -exports.loadVectorTile = loadVectorTile; -exports.makeRequest = makeRequest; -exports.mercatorXfromLng = mercatorXfromLng$1; -exports.mercatorYfromLat = mercatorYfromLat$1; -exports.mercatorZfromAltitude = mercatorZfromAltitude; -exports.mul = mul$3; -exports.mul$1 = mul$4; -exports.multiply = multiply$2; -exports.multiply$1 = multiply$3; -exports.nextPowerOfTwo = nextPowerOfTwo; -exports.normalize = normalize; -exports.number = number; -exports.ortho = ortho; -exports.pbf = pbf; -exports.pick = pick; -exports.pixelsToTileUnits = pixelsToTileUnits; -exports.plugin = plugin; -exports.pointGeometry = pointGeometry; -exports.polygonIntersectsBox = polygonIntersectsBox; -exports.polygonIntersectsPolygon = polygonIntersectsPolygon; -exports.polygonizeBounds = polygonizeBounds; -exports.posAttributes = posAttributes; -exports.postMapLoadEvent = postMapLoadEvent; -exports.postTurnstileEvent = postTurnstileEvent; -exports.potpack = potpack; -exports.prevPowerOfTwo = prevPowerOfTwo; -exports.refProperties = refProperties; -exports.registerForPluginStateChange = registerForPluginStateChange; -exports.removeAuthState = removeAuthState; -exports.renderColorRamp = renderColorRamp; -exports.rotateX = rotateX; -exports.rotateY = rotateY; -exports.rotateZ = rotateZ; -exports.scale = scale$3; -exports.scale$1 = scale$5; -exports.scale$2 = scale$4; -exports.scaleAndAdd = scaleAndAdd; -exports.setCacheLimits = setCacheLimits; -exports.setRTLTextPlugin = setRTLTextPlugin; -exports.smoothstep = smoothstep; -exports.spec = spec; -exports.storeAuthState = storeAuthState; -exports.sub = sub$4; -exports.subtract = subtract$4; -exports.symbolSize = symbolSize; -exports.tileTransform = tileTransform; -exports.transformMat3 = transformMat3; -exports.transformMat4 = transformMat4; -exports.transformMat4$1 = transformMat4$1; -exports.translate = translate$2; -exports.transpose = transpose$1; -exports.triggerPluginCompletionEvent = triggerPluginCompletionEvent; -exports.uniqueId = uniqueId; -exports.validateCustomStyleLayer = validateCustomStyleLayer; -exports.validateFog = validateFog$1; -exports.validateLight = validateLight$1; -exports.validateStyle = validateStyle; -exports.values = values; -exports.vectorTile = vectorTile; -exports.version = version; -exports.warnOnce = warnOnce; -exports.window = window$1; -exports.wrap = wrap; +isSupported.webGLContextAttributes = { + antialias: false, + alpha: true, + stencil: true, + depth: true +}; -}); +function getWebGLContext(failIfMajorPerformanceCaveat) { + var canvas = document.createElement('canvas'); -define(['./shared'], function (transform) { 'use strict'; + var attributes = Object.create(isSupported.webGLContextAttributes); + attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat; -function stringify(obj) { - const type = typeof obj; - if (type === 'number' || type === 'boolean' || type === 'string' || obj === undefined || obj === null) - return JSON.stringify(obj); + return ( + canvas.getContext('webgl', attributes) || + canvas.getContext('experimental-webgl', attributes) + ); +} - if (Array.isArray(obj)) { - let str = '['; - for (const val of obj) { - str += `${stringify(val)},`; - } - return `${str}]`; +function isWebGLSupported(failIfMajorPerformanceCaveat) { + var gl = getWebGLContext(failIfMajorPerformanceCaveat); + if (!gl) { + return false; } - const keys = Object.keys(obj).sort(); + // Try compiling a shader and get its compile status. Some browsers like Brave block this API + // to prevent fingerprinting. Unfortunately, this also means that Mapbox GL won't work. + var shader; + try { + shader = gl.createShader(gl.VERTEX_SHADER); + } catch (e) { + // some older browsers throw an exception that `createShader` is not defined + // so handle this separately from the case where browsers block `createShader` + // for security reasons + return false; + } - let str = '{'; - for (let i = 0; i < keys.length; i++) { - str += `${JSON.stringify(keys[i])}:${stringify(obj[keys[i]])},`; + if (!shader || gl.isContextLost()) { + return false; } - return `${str}}`; + gl.shaderSource(shader, 'void main() {}'); + gl.compileShader(shader); + return gl.getShaderParameter(shader, gl.COMPILE_STATUS) === true; } -function getKey(layer) { - let key = ''; - for (const k of transform.refProperties) { - key += `/${stringify(layer[k])}`; - } - return key; +function isNotIE() { + return !document.documentMode; } -/** - * 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 - * @param {Object} [cachedKeys] - an object to keep already calculated keys. - * @returns {Array>} - */ -function groupByLayout(layers, cachedKeys) { - const groups = {}; +var mapboxGlSupported = { + supported: supported, + notSupportedReason: notSupportedReason_1 +}; - for (let i = 0; i < layers.length; i++) { +// strict - const k = (cachedKeys && cachedKeys[layers[i].id]) || getKey(layers[i]); - // update the cache if there is one - if (cachedKeys) - cachedKeys[layers[i].id] = k; +// refine the return type based on tagName, e.g. 'button' -> HTMLButtonElement +function create$1 (tagName , className , container ) { + const el = ref_properties.window.document.createElement(tagName); + if (className !== undefined) el.className = className; + if (container) container.appendChild(el); + return el; +} - let group = groups[k]; - if (!group) { - group = groups[k] = []; - } - group.push(layers[i]); +function createSVG(tagName , attributes , container ) { + const el = ref_properties.window.document.createElementNS('http://www.w3.org/2000/svg', tagName); + for (const name of Object.keys(attributes)) { + el.setAttributeNS(null, name, attributes[name]); } + if (container) container.appendChild(el); + return el; +} - const result = []; +const docStyle = ref_properties.window.document && ref_properties.window.document.documentElement.style; +const selectProp = docStyle && docStyle.userSelect !== undefined ? 'userSelect' : 'WebkitUserSelect'; +let userSelect; - for (const k in groups) { - result.push(groups[k]); +function disableDrag() { + if (docStyle && selectProp) { + userSelect = docStyle[selectProp]; + docStyle[selectProp] = 'none'; } +} - return result; +function enableDrag() { + if (docStyle && selectProp) { + docStyle[selectProp] = userSelect; + } +} + +// Suppress the next click, but only if it's immediate. +function suppressClickListener(e) { + e.preventDefault(); + e.stopPropagation(); + ref_properties.window.removeEventListener('click', suppressClickListener, true); +} + +function suppressClick() { + ref_properties.window.addEventListener('click', suppressClickListener, true); + ref_properties.window.setTimeout(() => { + ref_properties.window.removeEventListener('click', suppressClickListener, true); + }, 0); +} + +function mousePos(el , e ) { + const rect = el.getBoundingClientRect(); + return getScaledPoint(el, rect, e); +} + +function touchPos(el , touches ) { + const rect = el.getBoundingClientRect(), + points = []; + + for (let i = 0; i < touches.length; i++) { + points.push(getScaledPoint(el, rect, touches[i])); + } + return points; +} + +function mouseButton(e ) { + ref_properties.assert_1(e.type === 'mousedown' || e.type === 'mouseup'); + if (typeof ref_properties.window.InstallTrigger !== 'undefined' && e.button === 2 && e.ctrlKey && + ref_properties.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 + return 0; + } + return e.button; +} + +function getScaledPoint(el , rect , e ) { + // Until we get support for pointer events (https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent) + // we use this dirty trick which would not work for the case of rotated transforms, but works well for + // the case of simple scaling. + // Note: `el.offsetWidth === rect.width` eliminates the `0/0` case. + const scaling = el.offsetWidth === rect.width ? 1 : el.offsetWidth / rect.width; + return new ref_properties.pointGeometry( + (e.clientX - rect.left) * scaling, + (e.clientY - rect.top) * scaling + ); } // - - + + + + - - +function loadSprite(baseURL , + requestManager , + callback ) { + let json , image, error; + const format = ref_properties.exported.devicePixelRatio > 1 ? '@2x' : ''; -class StyleLayerIndex { - - + let jsonRequest = ref_properties.getJSON(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.json'), ref_properties.ResourceType.SpriteJSON), (err , data ) => { + jsonRequest = null; + if (!error) { + error = err; + json = data; + maybeComplete(); + } + }); + + let imageRequest = ref_properties.getImage(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.png'), ref_properties.ResourceType.SpriteImage), (err, img) => { + imageRequest = null; + if (!error) { + error = err; + image = img; + maybeComplete(); + } + }); + + function maybeComplete() { + if (error) { + callback(error); + } else if (json && image) { + const imageData = ref_properties.exported.getImageData(image); + const result = {}; + + for (const id in json) { + const {width, height, x, y, sdf, pixelRatio, stretchX, stretchY, content} = json[id]; + const data = new ref_properties.RGBAImage({width, height}); + ref_properties.RGBAImage.copy(imageData, data, {x, y}, {x: 0, y: 0}, {width, height}); + result[id] = {data, pixelRatio, sdf, stretchX, stretchY, content}; + } + + callback(null, result); + } + } + + return { + cancel() { + if (jsonRequest) { + jsonRequest.cancel(); + jsonRequest = null; + } + if (imageRequest) { + imageRequest.cancel(); + imageRequest = null; + } + } + }; +} + +// + + + + + - + + - constructor(layerConfigs ) { - this.keyCache = {}; - if (layerConfigs) { - this.replace(layerConfigs); + + + + + + + + + + + + + + + + + + + +function renderStyleImage(image ) { + const {userImage} = image; + if (userImage && userImage.render) { + const updated = userImage.render(); + if (updated) { + image.data.replace(new Uint8Array(userImage.data.buffer)); + return true; } } + return false; +} - replace(layerConfigs ) { - this._layerConfigs = {}; - this._layers = {}; - this.update(layerConfigs, []); +/** + * Interface for dynamically generated style images. This is a specification for + * implementers to model: it is not an exported method or class. + * + * Images implementing this interface can be redrawn for every frame. They can be used to animate + * icons and patterns or make them respond to user input. Style images can implement a + * {@link StyleImageInterface#render} method. The method is called every frame and + * can be used to update the image. + * + * @interface StyleImageInterface + * @property {number} width Width in pixels. + * @property {number} height Height in pixels. + * @property {Uint8Array | Uint8ClampedArray} data Byte array representing the image. To ensure space for all four channels in an RGBA color, size must be width × height × 4. + * + * @see [Example: Add an animated icon to the map.](https://docs.mapbox.com/mapbox-gl-js/example/add-image-animated/) + * + * @example + * const flashingSquare = { + * width: 64, + * height: 64, + * data: new Uint8Array(64 * 64 * 4), + * + * onAdd(map) { + * this.map = map; + * }, + * + * render() { + * // keep repainting while the icon is on the map + * this.map.triggerRepaint(); + * + * // alternate between black and white based on the time + * const value = Math.round(Date.now() / 1000) % 2 === 0 ? 255 : 0; + * + * // check if image needs to be changed + * if (value !== this.previousValue) { + * this.previousValue = value; + * + * const bytesPerPixel = 4; + * for (let x = 0; x < this.width; x++) { + * for (let y = 0; y < this.height; y++) { + * const offset = (y * this.width + x) * bytesPerPixel; + * this.data[offset + 0] = value; + * this.data[offset + 1] = value; + * this.data[offset + 2] = value; + * this.data[offset + 3] = 255; + * } + * } + * + * // return true to indicate that the image changed + * return true; + * } + * } + * }; + * + * map.addImage('flashing_square', flashingSquare); + */ + +/** + * This method is called once before every frame where the icon will be used. + * The method can optionally update the image's `data` member with a new image. + * + * If the method updates the image it must return `true` to commit the change. + * If the method returns `false` or nothing the image is assumed to not have changed. + * + * If updates are infrequent it maybe easier to use {@link Map#updateImage} to update + * the image instead of implementing this method. + * + * @function + * @memberof StyleImageInterface + * @instance + * @name render + * @return {boolean} `true` if this method updated the image. `false` if the image was not changed. + */ + +/** + * Optional method called when the layer has been added to the Map with {@link Map#addImage}. + * + * @function + * @memberof StyleImageInterface + * @instance + * @name onAdd + * @param {Map} map The Map this custom layer was just added to. + */ + +/** + * Optional method called when the icon is removed from the map with {@link Map#removeImage}. + * This gives the image a chance to clean up resources and event listeners. + * + * @function + * @memberof StyleImageInterface + * @instance + * @name onRemove + */ + +// + + + + + + + + + + + + +// 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. +const padding = 1; + +/* + ImageManager does three 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. + 3. Rerenders renderable images once per frame + + 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. +*/ +class ImageManager extends ref_properties.Evented { + + + + + + + + + + + + constructor() { + super(); + this.images = {}; + this.updatedImages = {}; + this.callbackDispatchedThisFrame = {}; + this.loaded = false; + this.requestors = []; + + this.patterns = {}; + this.atlasImage = new ref_properties.RGBAImage({width: 1, height: 1}); + this.dirty = true; } - update(layerConfigs , removedIds ) { - for (const layerConfig of layerConfigs) { - this._layerConfigs[layerConfig.id] = layerConfig; + isLoaded() { + return this.loaded; + } - const layer = this._layers[layerConfig.id] = transform.createStyleLayer(layerConfig); - layer.compileFilter(); - if (this.keyCache[layerConfig.id]) - delete this.keyCache[layerConfig.id]; + setLoaded(loaded ) { + if (this.loaded === loaded) { + return; } - for (const id of removedIds) { - delete this.keyCache[id]; - delete this._layerConfigs[id]; - delete this._layers[id]; + + this.loaded = loaded; + + if (loaded) { + for (const {ids, callback} of this.requestors) { + this._notify(ids, callback); + } + this.requestors = []; } + } - this.familiesBySource = {}; + hasImage(id ) { + return !!this.getImage(id); + } - const groups = groupByLayout(transform.values(this._layerConfigs), this.keyCache); + getImage(id ) { + return this.images[id]; + } - for (const layerConfigs of groups) { - const layers = layerConfigs.map((layerConfig) => this._layers[layerConfig.id]); + addImage(id , image ) { + ref_properties.assert_1(!this.images[id]); + if (this._validate(id, image)) { + this.images[id] = image; + } + } - const layer = layers[0]; - if (layer.visibility === 'none') { - continue; - } + _validate(id , image ) { + let valid = true; + if (!this._validateStretch(image.stretchX, image.data && image.data.width)) { + this.fire(new ref_properties.ErrorEvent(new Error(`Image "${id}" has invalid "stretchX" value`))); + valid = false; + } + if (!this._validateStretch(image.stretchY, image.data && image.data.height)) { + this.fire(new ref_properties.ErrorEvent(new Error(`Image "${id}" has invalid "stretchY" value`))); + valid = false; + } + if (!this._validateContent(image.content, image)) { + this.fire(new ref_properties.ErrorEvent(new Error(`Image "${id}" has invalid "content" value`))); + valid = false; + } + return valid; + } - const sourceId = layer.source || ''; - let sourceGroup = this.familiesBySource[sourceId]; - if (!sourceGroup) { - sourceGroup = this.familiesBySource[sourceId] = {}; - } + _validateStretch(stretch , size ) { + if (!stretch) return true; + let last = 0; + for (const part of stretch) { + if (part[0] < last || part[1] < part[0] || size < part[1]) return false; + last = part[1]; + } + return true; + } - const sourceLayerId = layer.sourceLayer || '_geojsonTileLayer'; - let sourceLayerFamilies = sourceGroup[sourceLayerId]; - if (!sourceLayerFamilies) { - sourceLayerFamilies = sourceGroup[sourceLayerId] = []; - } + _validateContent(content , image ) { + if (!content) return true; + if (content.length !== 4) return false; + if (content[0] < 0 || image.data.width < content[0]) return false; + if (content[1] < 0 || image.data.height < content[1]) return false; + if (content[2] < 0 || image.data.width < content[2]) return false; + if (content[3] < 0 || image.data.height < content[3]) return false; + if (content[2] < content[0]) return false; + if (content[3] < content[1]) return false; + return true; + } - sourceLayerFamilies.push(layers); + updateImage(id , image ) { + const oldImage = this.images[id]; + ref_properties.assert_1(oldImage); + ref_properties.assert_1(oldImage.data.width === image.data.width); + ref_properties.assert_1(oldImage.data.height === image.data.height); + image.version = oldImage.version + 1; + this.images[id] = image; + this.updatedImages[id] = true; + } + + removeImage(id ) { + ref_properties.assert_1(this.images[id]); + const image = this.images[id]; + delete this.images[id]; + delete this.patterns[id]; + + if (image.userImage && image.userImage.onRemove) { + image.userImage.onRemove(); } } -} -// + listImages() { + return Object.keys(this.images); + } + + getImages(ids , callback ) { + // If the sprite has been loaded, or if all the icon dependencies are already present + // (i.e. if they've been added 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. + let hasAllDependencies = true; + if (!this.isLoaded()) { + for (const id of ids) { + if (!this.images[id]) { + hasAllDependencies = false; + } + } + } + if (this.isLoaded() || hasAllDependencies) { + this._notify(ids, callback); + } else { + this.requestors.push({ids, callback}); + } + } - - -const {ImageBitmap} = transform.window; + _notify(ids , callback ) { + const response = {}; -class RasterDEMTileWorkerSource { - - - + for (const id of ids) { + if (!this.images[id]) { + this.fire(new ref_properties.Event('styleimagemissing', {id})); + } + const image = this.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, + version: image.version, + stretchX: image.stretchX, + stretchY: image.stretchY, + content: image.content, + hasRenderCallback: Boolean(image.userImage && image.userImage.render) + }; + } else { + ref_properties.warnOnce(`Image "${id}" could not be loaded. Please make sure you have added the image with map.addImage() or a "sprite" property in your style. You can provide missing images by listening for the "styleimagemissing" map event.`); + } + } - loadTile(params , callback ) { - const {uid, encoding, rawImageData, padding, buildQuadTree} = params; - // Main thread will transfer ImageBitmap if offscreen decode with OffscreenCanvas is supported, else it will transfer an already decoded image. - const imagePixels = (ImageBitmap && rawImageData instanceof ImageBitmap) ? this.getImageData(rawImageData, padding) : rawImageData; - const dem = new transform.DEMData(uid, imagePixels, encoding, padding < 1, buildQuadTree); - callback(null, dem); + callback(null, response); } - getImageData(imgBitmap , padding ) { - // Lazily initialize OffscreenCanvas - if (!this.offscreenCanvas || !this.offscreenCanvasContext) { - // Dem tiles are typically 256x256 - this.offscreenCanvas = new OffscreenCanvas(imgBitmap.width, imgBitmap.height); - this.offscreenCanvasContext = this.offscreenCanvas.getContext('2d'); - } - - this.offscreenCanvas.width = imgBitmap.width; - this.offscreenCanvas.height = imgBitmap.height; + // Pattern stuff - this.offscreenCanvasContext.drawImage(imgBitmap, 0, 0, imgBitmap.width, imgBitmap.height); - // Insert or remove defined padding around the image to allow backfilling for neighboring data. - const imgData = this.offscreenCanvasContext.getImageData(-padding, -padding, imgBitmap.width + 2 * padding, imgBitmap.height + 2 * padding); - this.offscreenCanvasContext.clearRect(0, 0, this.offscreenCanvas.width, this.offscreenCanvas.height); - return new transform.RGBAImage({width: imgData.width, height: imgData.height}, imgData.data); + getPixelSize() { + const {width, height} = this.atlasImage; + return {width, height}; } -} -var geojsonRewind = rewind; - -function rewind(gj, outer) { - var type = gj && gj.type, i; + getPattern(id ) { + const pattern = this.patterns[id]; - if (type === 'FeatureCollection') { - for (i = 0; i < gj.features.length; i++) rewind(gj.features[i], outer); + const image = this.getImage(id); + if (!image) { + return null; + } - } else if (type === 'GeometryCollection') { - for (i = 0; i < gj.geometries.length; i++) rewind(gj.geometries[i], outer); + if (pattern && pattern.position.version === image.version) { + return pattern.position; + } - } else if (type === 'Feature') { - rewind(gj.geometry, outer); + if (!pattern) { + const w = image.data.width + padding * 2; + const h = image.data.height + padding * 2; + const bin = {w, h, x: 0, y: 0}; + const position = new ref_properties.ImagePosition(bin, image); + this.patterns[id] = {bin, position}; + } else { + pattern.position.version = image.version; + } - } else if (type === 'Polygon') { - rewindRings(gj.coordinates, outer); + this._updatePatternAtlas(); - } else if (type === 'MultiPolygon') { - for (i = 0; i < gj.coordinates.length; i++) rewindRings(gj.coordinates[i], outer); + return this.patterns[id].position; } - return gj; -} - -function rewindRings(rings, outer) { - if (rings.length === 0) return; - - rewindRing(rings[0], outer); - for (var i = 1; i < rings.length; i++) { - rewindRing(rings[i], !outer); - } -} + bind(context ) { + const gl = context.gl; + if (!this.atlasTexture) { + this.atlasTexture = new ref_properties.Texture(context, this.atlasImage, gl.RGBA); + } else if (this.dirty) { + this.atlasTexture.update(this.atlasImage); + this.dirty = false; + } -function rewindRing(ring, dir) { - var area = 0, err = 0; - for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) { - var k = (ring[i][0] - ring[j][0]) * (ring[j][1] + ring[i][1]); - var m = area + k; - err += Math.abs(area) >= Math.abs(k) ? area - m + k : k - m + area; - area = m; + this.atlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } - if (area + err >= 0 !== !!dir) ring.reverse(); -} - -// -const toGeoJSON = transform.vectorTile.VectorTileFeature.prototype.toGeoJSON; -// The feature type used by geojson-vt and supercluster. Should be extracted to -// global type and used in module definitions for those two modules. - - - - - - - - - - - + _updatePatternAtlas() { + const bins = []; + for (const id in this.patterns) { + bins.push(this.patterns[id].bin); + } -class FeatureWrapper { - + const {w, h} = ref_properties.potpack(bins); - - - - + const dst = this.atlasImage; + dst.resize({width: w || 1, height: h || 1}); - constructor(feature ) { - this._feature = feature; + for (const id in this.patterns) { + const {bin} = this.patterns[id]; + const x = bin.x + padding; + const y = bin.y + padding; + const src = this.images[id].data; + const w = src.width; + const h = src.height; - this.extent = transform.EXTENT; - this.type = feature.type; - this.properties = feature.tags; + ref_properties.RGBAImage.copy(src, dst, {x: 0, y: 0}, {x, y}, {width: w, height: h}); - // 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); + // Add 1 pixel wrapped padding on each side of the image. + ref_properties.RGBAImage.copy(src, dst, {x: 0, y: h - 1}, {x, y: y - 1}, {width: w, height: 1}); // T + ref_properties.RGBAImage.copy(src, dst, {x: 0, y: 0}, {x, y: y + h}, {width: w, height: 1}); // B + ref_properties.RGBAImage.copy(src, dst, {x: w - 1, y: 0}, {x: x - 1, y}, {width: 1, height: h}); // L + ref_properties.RGBAImage.copy(src, dst, {x: 0, y: 0}, {x: x + w, y}, {width: 1, height: h}); // R } - } - loadGeometry() { - if (this._feature.type === 1) { - const geometry = []; - for (const point of this._feature.geometry) { - geometry.push([new transform.pointGeometry(point[0], point[1])]); - } - return geometry; - } else { - const geometry = []; - for (const ring of this._feature.geometry) { - const newRing = []; - for (const point of ring) { - newRing.push(new transform.pointGeometry(point[0], point[1])); - } - geometry.push(newRing); - } - return geometry; - } + this.dirty = true; } - toGeoJSON(x , y , z ) { - return toGeoJSON.call(this, x, y, z); + beginFrame() { + this.callbackDispatchedThisFrame = {}; } -} -class GeoJSONWrapper { - - - - - + dispatchRenderCallbacks(ids ) { + for (const id of ids) { - constructor(features ) { - this.layers = {'_geojsonTileLayer': this}; - this.name = '_geojsonTileLayer'; - this.extent = transform.EXTENT; - this.length = features.length; - this._features = features; - } + // the callback for the image was already dispatched for a different frame + if (this.callbackDispatchedThisFrame[id]) continue; + this.callbackDispatchedThisFrame[id] = true; - feature(i ) { - return new FeatureWrapper(this._features[i]); + const image = this.images[id]; + ref_properties.assert_1(image); + + const updated = renderStyleImage(image); + if (updated) { + this.updateImage(id, image); + } + } } } -'use strict'; - +// -var VectorTileFeature = transform.vectorTile.VectorTileFeature; + + + + + + + + -var geojson_wrapper = GeoJSONWrapper$1; + -// conform to vectortile api -function GeoJSONWrapper$1 (features, options) { - this.options = options || {}; - this.features = features; - this.length = features.length; -} + + + + + + + -GeoJSONWrapper$1.prototype.feature = function (i) { - return new FeatureWrapper$1(this.features[i], this.options.extent) -}; +/** + * Converts spherical coordinates to cartesian LightPosition coordinates. + * + * @private + * @param spherical Spherical coordinates, in [radial, azimuthal, polar] + * @return LightPosition cartesian coordinates + */ +function sphericalToCartesian([r, azimuthal, polar] ) { + // We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (π/2): + // correct for that here + const a = ref_properties.degToRad(azimuthal + 90), p = ref_properties.degToRad(polar); -function FeatureWrapper$1 (feature, extent) { - 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 = extent || 4096; + return { + x: r * Math.cos(a) * Math.sin(p), + y: r * Math.sin(a) * Math.sin(p), + z: r * Math.cos(p), + azimuthal, polar + }; } -FeatureWrapper$1.prototype.loadGeometry = function () { - var rings = this.rawGeometry; - this.geometry = []; +class LightPositionProperty { + - 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 transform.pointGeometry(ring[j][0], ring[j][1])); + constructor() { + this.specification = ref_properties.spec.light.position; } - this.geometry.push(newRing); - } - return this.geometry -}; - -FeatureWrapper$1.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); + possiblyEvaluate(value , parameters ) { + return sphericalToCartesian(value.expression.evaluate(parameters)); } - } - return [x1, y1, x2, y2] -}; + interpolate(a , b , t ) { + return { + x: ref_properties.number(a.x, b.x, t), + y: ref_properties.number(a.y, b.y, t), + z: ref_properties.number(a.z, b.z, t), + azimuthal: ref_properties.number(a.azimuthal, b.azimuthal, t), + polar: ref_properties.number(a.polar, b.polar, t), + }; + } +} -FeatureWrapper$1.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON; + + + + + + -var vtPbf = fromVectorTileJs; -var fromVectorTileJs_1 = fromVectorTileJs; -var fromGeojsonVt_1 = fromGeojsonVt; -var GeoJSONWrapper_1 = geojson_wrapper; +const properties$1 = new ref_properties.Properties({ + "anchor": new ref_properties.DataConstantProperty(ref_properties.spec.light.anchor), + "position": new LightPositionProperty(), + "color": new ref_properties.DataConstantProperty(ref_properties.spec.light.color), + "intensity": new ref_properties.DataConstantProperty(ref_properties.spec.light.intensity), +}); -/** - * 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 transform.pbf(); - writeTile(tile, out); - return out.finish() -} +const TRANSITION_SUFFIX$2 = '-transition'; -/** - * Serialized a geojson-vt-created tile to pbf. - * - * @param {Object} layers - An object mapping layer names to geojson-vt-created vector tile objects - * @param {Object} [options] - An object specifying the vector-tile specification version and extent that were used to create `layers`. - * @param {Number} [options.version=1] - Version of vector-tile spec used - * @param {Number} [options.extent=4096] - Extent of the vector tile - * @return {Buffer} uncompressed, pbf-serialized tile data +/* + * Represents the light used to light extruded features. */ -function fromGeojsonVt (layers, options) { - options = options || {}; - var l = {}; - for (var k in layers) { - l[k] = new geojson_wrapper(layers[k].features, options); - l[k].name = k; - l[k].version = options.version; - l[k].extent = options.extent; - } - return fromVectorTileJs({ layers: l }) -} +class Light extends ref_properties.Evented { + + + -function writeTile (tile, pbf) { - for (var key in tile.layers) { - pbf.writeMessage(3, writeLayer, tile.layers[key]); - } -} + constructor(lightOptions ) { + super(); + this._transitionable = new ref_properties.Transitionable(properties$1); + this.setLight(lightOptions); + this._transitioning = this._transitionable.untransitioned(); + } -function writeLayer (layer, pbf) { - pbf.writeVarintField(15, layer.version || 1); - pbf.writeStringField(1, layer.name || ''); - pbf.writeVarintField(5, layer.extent || 4096); + getLight() { + return (this._transitionable.serialize() ); + } - var i; - var context = { - keys: [], - values: [], - keycache: {}, - valuecache: {} - }; + setLight(light , options = {}) { + if (this._validate(ref_properties.validateLight, light, options)) { + return; + } - for (i = 0; i < layer.length; i++) { - context.feature = layer.feature(i); - pbf.writeMessage(2, writeFeature, context); - } + for (const name in light) { + const value = light[name]; + if (ref_properties.endsWith(name, TRANSITION_SUFFIX$2)) { + this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX$2.length), value); + } else { + this._transitionable.setValue(name, value); + } + } + } - var keys = context.keys; - for (i = 0; i < keys.length; i++) { - pbf.writeStringField(3, keys[i]); - } + updateTransitions(parameters ) { + this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); + } - var values = context.values; - for (i = 0; i < values.length; i++) { - pbf.writeMessage(4, writeValue, values[i]); - } -} + hasTransition() { + return this._transitioning.hasTransition(); + } -function writeFeature (context, pbf) { - var feature = context.feature; + recalculate(parameters ) { + this.properties = this._transitioning.possiblyEvaluate(parameters); + } - if (feature.id !== undefined) { - pbf.writeVarintField(1, feature.id); - } + _validate(validate , value , options ) { + if (options && options.validate === false) { + return false; + } - pbf.writeMessage(2, writeProperties, context); - pbf.writeVarintField(3, feature.type); - pbf.writeMessage(4, writeGeometry, feature); + return ref_properties.emitValidationErrors(this, validate.call(ref_properties.validateStyle, ref_properties.extend({ + value, + // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 + style: {glyphs: true, sprite: true}, + styleSpec: ref_properties.spec + }))); + } } -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 value = feature.properties[key]; + + + - var keyIndex = keycache[key]; - if (value === null) continue // don't encode null value properties + + + + - if (typeof keyIndex === 'undefined') { - keys.push(key); - keyIndex = keys.length - 1; - keycache[key] = keyIndex; - } - pbf.writeVarint(keyIndex); +const DrapeRenderMode = { + deferred: 0, + elevated: 1 +}; - 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); - } -} +const properties = new ref_properties.Properties({ + "source": new ref_properties.DataConstantProperty(ref_properties.spec.terrain.source), + "exaggeration": new ref_properties.DataConstantProperty(ref_properties.spec.terrain.exaggeration), +}); -function command (cmd, length) { - return (length << 3) + (cmd & 0x7) -} +const TRANSITION_SUFFIX$1 = '-transition'; -function zigzag (num) { - return (num << 1) ^ (num >> 31) -} +class Terrain$1 extends ref_properties.Evented { + + + + -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 - // do not write polygon closing path as lineto - var lineCount = type === 3 ? ring.length - 1 : ring.length; - for (var i = 0; i < lineCount; i++) { - if (i === 1 && type !== 1) { - pbf.writeVarint(command(2, lineCount - 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; + constructor(terrainOptions , drapeRenderMode ) { + super(); + this._transitionable = new ref_properties.Transitionable(properties); + this.set(terrainOptions); + this._transitioning = this._transitionable.untransitioned(); + this.drapeRenderMode = drapeRenderMode; } - if (type === 3) { - pbf.writeVarint(command(7, 1)); // closepath + + get() { + return (this._transitionable.serialize() ); } - } -} -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); + set(terrain ) { + for (const name in terrain) { + const value = terrain[name]; + if (ref_properties.endsWith(name, TRANSITION_SUFFIX$1)) { + this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX$1.length), value); + } else { + this._transitionable.setValue(name, value); + } + } } - } -} -vtPbf.fromVectorTileJs = fromVectorTileJs_1; -vtPbf.fromGeojsonVt = fromGeojsonVt_1; -vtPbf.GeoJSONWrapper = GeoJSONWrapper_1; - -function sortKD(ids, coords, nodeSize, left, right, depth) { - if (right - left <= nodeSize) return; - const m = (left + right) >> 1; + updateTransitions(parameters ) { + this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); + } - select(ids, coords, m, left, right, depth % 2); + hasTransition() { + return this._transitioning.hasTransition(); + } - sortKD(ids, coords, nodeSize, left, m - 1, depth + 1); - sortKD(ids, coords, nodeSize, m + 1, right, depth + 1); + recalculate(parameters ) { + this.properties = this._transitioning.possiblyEvaluate(parameters); + } } -function select(ids, coords, k, left, right, inc) { +// + + + - while (right > left) { - if (right - left > 600) { - const n = right - left + 1; - const m = k - left + 1; - const z = Math.log(n); - const s = 0.5 * Math.exp(2 * z / 3); - const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); - const newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); - const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); - select(ids, coords, k, newLeft, newRight, inc); - } +const FOG_PITCH_START = 45; +const FOG_PITCH_END = 65; +const FOG_SYMBOL_CLIPPING_THRESHOLD = 0.9; - const t = coords[2 * k + inc]; - let i = left; - let j = right; + + + + + - swapItem(ids, coords, left, k); - if (coords[2 * right + inc] > t) swapItem(ids, coords, left, right); +// As defined in _prelude_fog.fragment.glsl#fog_opacity +function getFogOpacity(state , pos , pitch , fov ) { + const fogPitchOpacity = ref_properties.smoothstep(FOG_PITCH_START, FOG_PITCH_END, pitch); + const [start, end] = getFovAdjustedFogRange(state, fov); - while (i < j) { - swapItem(ids, coords, i, j); - i++; - j--; - while (coords[2 * i + inc] < t) i++; - while (coords[2 * j + inc] > t) j--; - } + // The output of this function must match _prelude_fog.fragment.glsl + // For further details, refer to the implementation in the shader code + const decay = 6; + const depth = ref_properties.length(pos); + const fogRange = (depth - start) / (end - start); + let falloff = 1.0 - Math.min(1, Math.exp(-decay * fogRange)); - if (coords[2 * left + inc] === t) swapItem(ids, coords, left, j); - else { - j++; - swapItem(ids, coords, j, right); - } + falloff *= falloff * falloff; + falloff = Math.min(1.0, 1.00747 * falloff); - if (j <= k) left = j + 1; - if (k <= j) right = j - 1; - } + return falloff * fogPitchOpacity * state.alpha; } -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 getFovAdjustedFogRange(state , fov ) { + // This function computes a shifted fog range so that the appearance is unchanged + // when the fov changes. We define range=0 starting at the camera position given + // the default fov. We avoid starting the fog range at the camera center so that + // ranges aren't generally negative unless the FOV is modified. + const shift = 0.5 / Math.tan(fov * 0.5); + return [state.range[0] + shift, state.range[1] + shift]; } -function swap(arr, i, j) { - const tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; +function getFogOpacityAtTileCoord(state , x , y , z , tileId , transform ) { + const mat = transform.calculateFogTileMatrix(tileId); + const pos = [x, y, z]; + ref_properties.transformMat4(pos, pos, mat); + + return getFogOpacity(state, pos, transform.pitch, transform._fov); } -function range(ids, coords, minX, minY, maxX, maxY, nodeSize) { - const stack = [0, ids.length - 1, 0]; - const result = []; - let x, y; +function getFogOpacityAtLngLat(state , lngLat , transform ) { + const meters = ref_properties.MercatorCoordinate.fromLngLat(lngLat); + const elevation = transform.elevation ? transform.elevation.getAtPointOrZero(meters) : 0; + const pos = [meters.x, meters.y, elevation]; + ref_properties.transformMat4(pos, pos, transform.mercatorFogMatrix); - while (stack.length) { - const axis = stack.pop(); - const right = stack.pop(); - const left = stack.pop(); + return getFogOpacity(state, pos, transform.pitch, transform._fov); +} - if (right - left <= nodeSize) { - for (let 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; - } +// - const m = Math.floor((left + right) / 2); + + + + + + + + - x = coords[2 * m]; - y = coords[2 * m + 1]; +const fogProperties = new ref_properties.Properties({ + "range": new ref_properties.DataConstantProperty(ref_properties.spec.fog.range), + "color": new ref_properties.DataConstantProperty(ref_properties.spec.fog.color), + "high-color": new ref_properties.DataConstantProperty(ref_properties.spec.fog["high-color"]), + "space-color": new ref_properties.DataConstantProperty(ref_properties.spec.fog["space-color"]), + "horizon-blend": new ref_properties.DataConstantProperty(ref_properties.spec.fog["horizon-blend"]), + "star-intensity": new ref_properties.DataConstantProperty(ref_properties.spec.fog["star-intensity"]), +}); - if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[m]); +const TRANSITION_SUFFIX = '-transition'; - const nextAxis = (axis + 1) % 2; +class Fog extends ref_properties.Evented { + + + - 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); - } + // Alternate projections do not yet support fog. + // Hold on to transform so that we know whether a projection is set. + + + constructor(fogOptions , transform ) { + super(); + this._transitionable = new ref_properties.Transitionable(fogProperties); + this.set(fogOptions); + this._transitioning = this._transitionable.untransitioned(); + this._transform = transform; } - return result; -} + get state() { + const tr = this._transform; + const isGlobe = tr.projection.name === 'globe'; + const transitionT = ref_properties.globeToMercatorTransition(tr.zoom); + const range = this.properties.get('range'); + const globeFixedFogRange = [0.5, 3]; + return { + range: isGlobe ? [ + ref_properties.number(globeFixedFogRange[0], range[0], transitionT), + ref_properties.number(globeFixedFogRange[1], range[1], transitionT) + ] : range, + horizonBlend: this.properties.get('horizon-blend'), + alpha: this.properties.get('color').a + }; + } -function within(ids, coords, qx, qy, r, nodeSize) { - const stack = [0, ids.length - 1, 0]; - const result = []; - const r2 = r * r; + get() { + return (this._transitionable.serialize() ); + } - while (stack.length) { - const axis = stack.pop(); - const right = stack.pop(); - const left = stack.pop(); + set(fog , options = {}) { + if (this._validate(ref_properties.validateFog, fog, options)) { + return; + } - if (right - left <= nodeSize) { - for (let i = left; i <= right; i++) { - if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) result.push(ids[i]); + for (const name of Object.keys(ref_properties.spec.fog)) { + // Fallback to use default style specification when the properties wasn't set + if (fog && fog[name] === undefined) { + fog[name] = ref_properties.spec.fog[name].default; } - continue; } - const m = Math.floor((left + right) / 2); - - const x = coords[2 * m]; - const y = coords[2 * m + 1]; - - if (sqDist(x, y, qx, qy) <= r2) result.push(ids[m]); - - const 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); + for (const name in fog) { + const value = fog[name]; + if (ref_properties.endsWith(name, TRANSITION_SUFFIX)) { + this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value); + } else { + this._transitionable.setValue(name, value); + } } } - return result; -} + getOpacity(pitch ) { + if (!this._transform.projection.supportsFog) return 0; -function sqDist(ax, ay, bx, by) { - const dx = ax - bx; - const dy = ay - by; - return dx * dx + dy * dy; -} + const fogColor = (this.properties && this.properties.get('color')) || 1.0; + const isGlobe = this._transform.projection.name === 'globe'; + const pitchFactor = isGlobe ? 1.0 : ref_properties.smoothstep(FOG_PITCH_START, FOG_PITCH_END, pitch); + return pitchFactor * fogColor.a; + } -const defaultGetX = p => p[0]; -const defaultGetY = p => p[1]; + getOpacityAtLatLng(lngLat , transform ) { + if (!this._transform.projection.supportsFog) return 0; -class KDBush { - constructor(points, getX = defaultGetX, getY = defaultGetY, nodeSize = 64, ArrayType = Float64Array) { - this.nodeSize = nodeSize; - this.points = points; + return getFogOpacityAtLngLat(this.state, lngLat, transform); + } - const IndexArrayType = points.length < 65536 ? Uint16Array : Uint32Array; + getFovAdjustedRange(fov ) { + // We can return any arbitrary range because we expect opacity=0 to clean it up + if (!this._transform.projection.supportsFog) return [0, 1]; - const ids = this.ids = new IndexArrayType(points.length); - const coords = this.coords = new ArrayType(points.length * 2); + return getFovAdjustedFogRange(this.state, fov); + } - for (let i = 0; i < points.length; i++) { - ids[i] = i; - coords[2 * i] = getX(points[i]); - coords[2 * i + 1] = getY(points[i]); - } + updateTransitions(parameters ) { + this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); + } - sortKD(ids, coords, nodeSize, 0, ids.length - 1, 0); + hasTransition() { + return this._transitioning.hasTransition(); } - range(minX, minY, maxX, maxY) { - return range(this.ids, this.coords, minX, minY, maxX, maxY, this.nodeSize); + recalculate(parameters ) { + this.properties = this._transitioning.possiblyEvaluate(parameters); } - within(x, y, r) { - return within(this.ids, this.coords, x, y, r, this.nodeSize); + _validate(validate , value , options ) { + if (options && options.validate === false) { + return false; + } + + return ref_properties.emitValidationErrors(this, validate.call(ref_properties.validateStyle, ref_properties.extend({ + value, + style: {glyphs: true, sprite: true}, + styleSpec: ref_properties.spec + }))); } } -const defaultOptions = { - minZoom: 0, // min zoom to generate clusters on - maxZoom: 16, // max zoom level to cluster the points on - minPoints: 2, // minimum points to form a cluster - 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 +// - // whether to generate numeric ids for input features (in vector tiles) - generateId: false, + - // a reduce function for calculating custom cluster properties - reduce: null, // (accumulated, props) => { accumulated.sum += props.sum; } +/** + * Responsible for sending messages from a {@link Source} to an associated + * {@link WorkerSource}. + * + * @private + */ +class Dispatcher { + + + + + - // properties to use for individual points when running the reducer - map: props => props // props => ({sum: props.my_value}) -}; + // exposed to allow stubbing in unit tests + -const fround = Math.fround || (tmp => ((x) => { tmp[0] = +x; return tmp[0]; }))(new Float32Array(1)); + constructor(workerPool , parent ) { + this.workerPool = workerPool; + this.actors = []; + this.currentActor = 0; + this.id = ref_properties.uniqueId(); + const workers = this.workerPool.acquire(this.id); + for (let i = 0; i < workers.length; i++) { + const worker = workers[i]; + const actor = new Dispatcher.Actor(worker, parent, this.id); + actor.name = `Worker ${i}`; + this.actors.push(actor); + } + ref_properties.assert_1(this.actors.length); -class Supercluster { - constructor(options) { - this.options = extend(Object.create(defaultOptions), options); - this.trees = new Array(this.options.maxZoom + 1); + // track whether all workers are instantiated and ready to receive messages; + // used for optimizations on initial map load + this.ready = false; + this.broadcast('checkIfReady', null, () => { this.ready = true; }); } - load(points) { - const {log, minZoom, maxZoom, nodeSize} = this.options; + /** + * Broadcast a message to all Workers. + * @private + */ + broadcast(type , data , cb ) { + ref_properties.assert_1(this.actors.length); + cb = cb || function () {}; + ref_properties.asyncAll(this.actors, (actor, done) => { + actor.send(type, data, done); + }, cb); + } - if (log) console.time('total time'); + /** + * Acquires an actor to dispatch messages to. The actors are distributed in round-robin fashion. + * @returns {Actor} An actor object backed by a web worker for processing messages. + */ + getActor() { + ref_properties.assert_1(this.actors.length); + this.currentActor = (this.currentActor + 1) % this.actors.length; + return this.actors[this.currentActor]; + } - const timerId = `prepare ${ points.length } points`; - if (log) console.time(timerId); + remove() { + this.actors.forEach((actor) => { actor.remove(); }); + this.actors = []; + this.workerPool.release(this.id); + } +} - this.points = points; +Dispatcher.Actor = ref_properties.Actor; - // generate a cluster object for each point and index input points into a KD-tree - let clusters = []; - for (let i = 0; i < points.length; i++) { - if (!points[i].geometry) continue; - clusters.push(createPointCluster(points[i], i)); - } - this.trees[maxZoom + 1] = new KDBush(clusters, getX, getY, nodeSize, Float32Array); +// - 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 (let z = maxZoom; z >= minZoom; z--) { - const now = +Date.now(); +/** + * 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 + */ +function pixelsToTileUnits(tile , pixelValue , z ) { + return pixelValue * (ref_properties.EXTENT / (tile.tileSize * Math.pow(2, z - tile.tileID.overscaledZ))); +} - // create a new set of clusters for the zoom and index them with a KD-tree - clusters = this._cluster(clusters, z); - this.trees[z] = new KDBush(clusters, getX, getY, nodeSize, Float32Array); +function getPixelsToTileUnitsMatrix(tile , transform ) { + const {scale} = tile.tileTransform; + const s = scale * ref_properties.EXTENT / (tile.tileSize * Math.pow(2, transform.zoom - tile.tileID.overscaledZ + tile.tileID.canonical.z)); + return ref_properties.scale(new Float32Array(4), transform.inverseAdjustmentMatrix, [s, s]); +} - if (log) console.log('z%d: %d clusters in %dms', z, clusters.length, +Date.now() - now); - } +// - if (log) console.timeEnd('total time'); + + + - return this; - } + + + - getClusters(bbox, zoom) { - let minLng = ((bbox[0] + 180) % 360 + 360) % 360 - 180; - const minLat = Math.max(-90, Math.min(90, bbox[1])); - let maxLng = bbox[2] === 180 ? 180 : ((bbox[2] + 180) % 360 + 360) % 360 - 180; - const maxLat = Math.max(-90, Math.min(90, bbox[3])); +/** + * A data-class that represents a screenspace query from `Map#queryRenderedFeatures`. + * All the internal geometries and data are intented to be immutable and read-only. + * Its lifetime is only for the duration of the query and fixed state of the map while the query is being processed. + * + * @class QueryGeometry + */ +class QueryGeometry { + + + + - if (bbox[2] - bbox[0] >= 360) { - minLng = -180; - maxLng = 180; - } else if (minLng > maxLng) { - const easternHem = this.getClusters([minLng, minLat, 180, maxLat], zoom); - const westernHem = this.getClusters([-180, minLat, maxLng, maxLat], zoom); - return easternHem.concat(westernHem); - } + + - const tree = this.trees[this._limitZoom(zoom)]; - const ids = tree.range(lngX(minLng), latY(maxLat), lngX(maxLng), latY(minLat)); - const clusters = []; - for (const id of ids) { - const c = tree.points[id]; - clusters.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]); + + + constructor(screenBounds , cameraPoint , aboveHorizon , transform ) { + this.screenBounds = screenBounds; + this.cameraPoint = cameraPoint; + this._screenRaycastCache = {}; + this._cameraRaycastCache = {}; + this.isAboveHorizon = aboveHorizon; + + this.screenGeometry = this.bufferedScreenGeometry(0); + this.screenGeometryMercator = this._bufferedScreenMercator(0, transform); + } + + /** + * Factory method to help contruct an instance while accounting for current map state. + * + * @static + * @param {(PointLike | [PointLike, PointLike])} geometry The query geometry. + * @param {Transform} transform The current map transform. + * @returns {QueryGeometry} An instance of the QueryGeometry class. + */ + static createFromScreenPoints(geometry , transform ) { + let screenGeometry; + let aboveHorizon; + if (geometry instanceof ref_properties.pointGeometry || typeof geometry[0] === 'number') { + const pt = ref_properties.pointGeometry.convert(geometry); + screenGeometry = [ref_properties.pointGeometry.convert(geometry)]; + aboveHorizon = transform.isPointAboveHorizon(pt); + } else { + const tl = ref_properties.pointGeometry.convert(geometry[0]); + const br = ref_properties.pointGeometry.convert(geometry[1]); + screenGeometry = [tl, br]; + aboveHorizon = ref_properties.polygonizeBounds(tl, br).every((p) => transform.isPointAboveHorizon(p)); } - return clusters; + + return new QueryGeometry(screenGeometry, transform.getCameraPoint(), aboveHorizon, transform); } - getChildren(clusterId) { - const originId = this._getOriginId(clusterId); - const originZoom = this._getOriginZoom(clusterId); - const errorMsg = 'No cluster with the specified id.'; + /** + * Returns true if the initial query by the user was a single point. + * + * @returns {boolean} Returns `true` if the initial query geometry was a single point. + */ + isPointQuery() { + return this.screenBounds.length === 1; + } - const index = this.trees[originZoom]; - if (!index) throw new Error(errorMsg); + /** + * Due to data-driven styling features do not uniform size(eg `circle-radius`) and can be offset differntly + * from their original location(for example with `*-translate`). This means we have to expand our query region for + * each tile to account for variation in these properties. + * Each tile calculates a tile level max padding value (in screenspace pixels) when its parsed, this function + * lets us calculate a buffered version of the screenspace query geometry for each tile. + * + * @param {number} buffer The tile padding in screenspace pixels. + * @returns {Point[]} The buffered query geometry. + */ + bufferedScreenGeometry(buffer ) { + return ref_properties.polygonizeBounds( + this.screenBounds[0], + this.screenBounds.length === 1 ? this.screenBounds[0] : this.screenBounds[1], + buffer + ); + } - const origin = index.points[originId]; - if (!origin) throw new Error(errorMsg); + /** + * When the map is pitched, some of the 3D features that intersect a query will not intersect + * the query at the surface of the earth. Instead the feature may be closer and only intersect + * the query because it extrudes into the air. + * + * This returns a geometry that is a convex polygon that encompasses the query frustum and the point underneath the camera. + * Similar to `bufferedScreenGeometry`, buffering is added to account for variation in paint properties. + * + * Case 1: point underneath camera is exactly behind query volume + * +----------+ + * | | + * | | + * | | + * + + + * X X + * X X + * X X + * X X + * XX. + * + * Case 2: point is behind and to the right + * +----------+ + * | X + * | X + * | XX + * + X + * XXX XX + * XXXX X + * XXX XX + * XX X + * XXX. + * + * Case 3: point is behind and to the left + * +----------+ + * X | + * X | + * XX | + * X + + * X XXXX + * XX XXX + * X XXXX + * X XXXX + * XXX. + * + * @param {number} buffer The tile padding in screenspace pixels. + * @returns {Point[]} The buffered query geometry. + */ + bufferedCameraGeometry(buffer ) { + const min = this.screenBounds[0]; + const max = this.screenBounds.length === 1 ? this.screenBounds[0].add(new ref_properties.pointGeometry(1, 1)) : this.screenBounds[1]; + const cameraPolygon = ref_properties.polygonizeBounds(min, max, 0, false); - const r = this.options.radius / (this.options.extent * Math.pow(2, originZoom - 1)); - const ids = index.within(origin.x, origin.y, r); - const children = []; - for (const id of ids) { - const c = index.points[id]; - if (c.parentId === clusterId) { - children.push(c.numPoints ? getClusterJSON(c) : this.points[c.index]); + // Only need to account for point underneath camera if its behind query volume + if (this.cameraPoint.y > max.y) { + //case 1: insert point in the middle + if (this.cameraPoint.x > min.x && this.cameraPoint.x < max.x) { + cameraPolygon.splice(3, 0, this.cameraPoint); + //case 2: replace btm right point + } else if (this.cameraPoint.x >= max.x) { + cameraPolygon[2] = this.cameraPoint; + //case 3: replace btm left point + } else if (this.cameraPoint.x <= min.x) { + cameraPolygon[3] = this.cameraPoint; } } - if (children.length === 0) throw new Error(errorMsg); - - return children; + return ref_properties.bufferConvexPolygon(cameraPolygon, buffer); } - getLeaves(clusterId, limit, offset) { - limit = limit || 10; - offset = offset || 0; + // Creates a convex polygon in screen coordinates that encompasses the query frustum and + // the camera location at globe's surface. Camera point can be at any side of the query polygon as + // opposed to `bufferedCameraGeometry` which restricts the location to underneath the polygon. + bufferedCameraGeometryGlobe(buffer ) { + const min = this.screenBounds[0]; + const max = this.screenBounds.length === 1 ? this.screenBounds[0].add(new ref_properties.pointGeometry(1, 1)) : this.screenBounds[1]; - const leaves = []; - this._appendLeaves(leaves, clusterId, limit, offset, 0); + // Padding is added to the query polygon before inclusion of the camera location. + // Otherwise the buffered (narrow) polygon could penetrate the globe creating a lot of false positives + const cameraPolygon = ref_properties.polygonizeBounds(min, max, buffer); - return leaves; + const camPos = this.cameraPoint.clone(); + const column = (camPos.x > min.x) + (camPos.x > max.x); + const row = (camPos.y > min.y) + (camPos.y > max.y); + const sector = row * 3 + column; + + switch (sector) { + case 0: // replace top-left point (closed polygon) + cameraPolygon[0] = camPos; + cameraPolygon[4] = camPos.clone(); + break; + case 1: // insert point in the middle of top-left and top-right + cameraPolygon.splice(1, 0, camPos); + break; + case 2: // replace top-right point + cameraPolygon[1] = camPos; + break; + case 3: // insert point in the middle of top-left and bottom-left + cameraPolygon.splice(4, 0, camPos); + break; + case 5: // insert point in the middle of top-right and bottom-right + cameraPolygon.splice(2, 0, camPos); + break; + case 6: // replace bottom-left point + cameraPolygon[3] = camPos; + break; + case 7: // insert point in the middle of bottom-left and bottom-right + cameraPolygon.splice(3, 0, camPos); + break; + case 8: // replace bottom-right point + cameraPolygon[2] = camPos; + break; + } + + return cameraPolygon; } - getTile(z, x, y) { - const tree = this.trees[this._limitZoom(z)]; - const z2 = Math.pow(2, z); - const {extent, radius} = this.options; - const p = radius / extent; - const top = (y - p) / z2; - const bottom = (y + 1 + p) / z2; + /** + * Checks if a tile is contained within this query geometry. + * + * @param {Tile} tile The tile to check. + * @param {Transform} transform The current map transform. + * @param {boolean} use3D A boolean indicating whether to query 3D features. + * @param {number} cameraWrap A wrap value for offsetting the camera position. + * @returns {?TilespaceQueryGeometry} Returns `undefined` if the tile does not intersect. + */ + containsTile(tile , transform , use3D , cameraWrap = 0) { + // The buffer around the query geometry is applied in screen-space. + // transform._projectionScaler is used to compensate any extra scaling applied from the currently active projection. + // Floating point errors when projecting into tilespace could leave a feature + // outside the query volume even if it looks like it overlaps visually, a 1px bias value overcomes that. + const bias = 1; + const padding = tile.queryPadding / transform._projectionScaler + bias; - const tile = { - features: [] - }; + const cachedQuery = use3D ? + this._bufferedCameraMercator(padding, transform) : + this._bufferedScreenMercator(padding, transform); - this._addTileFeatures( - tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom), - tree.points, x, y, z2, tile); + let wrap = tile.tileID.wrap + (cachedQuery.unwrapped ? cameraWrap : 0); + const geometryForTileCheck = cachedQuery.polygon.map((p) => ref_properties.getTilePoint(tile.tileTransform, p, wrap)); - 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); + if (!ref_properties.polygonIntersectsBox(geometryForTileCheck, 0, 0, ref_properties.EXTENT, ref_properties.EXTENT)) { + return undefined; } - return tile.features.length ? tile : null; - } + wrap = tile.tileID.wrap + (this.screenGeometryMercator.unwrapped ? cameraWrap : 0); + const tilespaceVec3s = this.screenGeometryMercator.polygon.map((p) => ref_properties.getTileVec3(tile.tileTransform, p, wrap)); + const tilespaceGeometry = tilespaceVec3s.map((v) => new ref_properties.pointGeometry(v[0], v[1])); - getClusterExpansionZoom(clusterId) { - let expansionZoom = this._getOriginZoom(clusterId) - 1; - while (expansionZoom <= this.options.maxZoom) { - const children = this.getChildren(clusterId); - expansionZoom++; - if (children.length !== 1) break; - clusterId = children[0].properties.cluster_id; - } - return expansionZoom; + const cameraMercator = transform.getFreeCameraOptions().position || new ref_properties.MercatorCoordinate(0, 0, 0); + const tilespaceCameraPosition = ref_properties.getTileVec3(tile.tileTransform, cameraMercator, wrap); + const tilespaceRays = tilespaceVec3s.map((tileVec) => { + const dir = ref_properties.sub(tileVec, tileVec, tilespaceCameraPosition); + ref_properties.normalize(dir, dir); + return new ref_properties.Ray(tilespaceCameraPosition, dir); + }); + const pixelToTileUnitsFactor = pixelsToTileUnits(tile, 1, transform.zoom) * transform._projectionScaler; + + return { + queryGeometry: this, + tilespaceGeometry, + tilespaceRays, + bufferedTilespaceGeometry: geometryForTileCheck, + bufferedTilespaceBounds: clampBoundsToTileExtents(ref_properties.getBounds(geometryForTileCheck)), + tile, + tileID: tile.tileID, + pixelToTileUnitsFactor + }; } - _appendLeaves(result, clusterId, limit, offset, skipped) { - const children = this.getChildren(clusterId); + /** + * These methods add caching on top of the terrain raycasting provided by `Transform#pointCoordinate3d`. + * Tiles come with different values of padding, however its very likely that multiple tiles share the same value of padding + * based on the style. In that case we want to reuse the result from a previously computed terrain raycast. + */ - for (const child of children) { - const props = child.properties; + _bufferedScreenMercator(padding , transform ) { + const key = cacheKey(padding); + if (this._screenRaycastCache[key]) { + return this._screenRaycastCache[key]; + } else { + let poly ; - if (props && 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, limit, offset, skipped); - // exit the cluster - } - } else if (skipped < offset) { - // skip a single point - skipped++; + if (transform.projection.name === 'globe') { + poly = this._projectAndResample(this.bufferedScreenGeometry(padding), transform); } else { - // add a single point - result.push(child); + poly = { + polygon: this.bufferedScreenGeometry(padding).map((p) => transform.pointCoordinate3D(p)), + unwrapped: true + }; } - if (result.length === limit) break; - } - return skipped; + this._screenRaycastCache[key] = poly; + return poly; + } } - _addTileFeatures(ids, points, x, y, z2, tile) { - for (const i of ids) { - const c = points[i]; - const isCluster = c.numPoints; + _bufferedCameraMercator(padding , transform ) { + const key = cacheKey(padding); + if (this._cameraRaycastCache[key]) { + return this._cameraRaycastCache[key]; + } else { + let poly ; - let tags, px, py; - if (isCluster) { - tags = getClusterProperties(c); - px = c.x; - py = c.y; + if (transform.projection.name === 'globe') { + poly = this._projectAndResample(this.bufferedCameraGeometryGlobe(padding), transform); } else { - const p = this.points[c.index]; - tags = p.properties; - px = lngX(p.geometry.coordinates[0]); - py = latY(p.geometry.coordinates[1]); - } - - const f = { - type: 1, - geometry: [[ - Math.round(this.options.extent * (px * z2 - x)), - Math.round(this.options.extent * (py * z2 - y)) - ]], - tags - }; - - // assign id - let id; - if (isCluster) { - id = c.id; - } else if (this.options.generateId) { - // optionally generate id - id = c.index; - } else if (this.points[c.index].id) { - // keep id if already assigned - id = this.points[c.index].id; + poly = { + polygon: this.bufferedCameraGeometry(padding).map((p) => transform.pointCoordinate3D(p)), + unwrapped: true + }; } - if (id !== undefined) f.id = id; - - tile.features.push(f); + this._cameraRaycastCache[key] = poly; + return poly; } } - _limitZoom(z) { - return Math.max(this.options.minZoom, Math.min(+z, this.options.maxZoom + 1)); - } - - _cluster(points, zoom) { - const clusters = []; - const {radius, extent, reduce, minPoints} = this.options; - const r = radius / (extent * Math.pow(2, zoom)); - - // loop through each point - for (let i = 0; i < points.length; i++) { - const 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 - const tree = this.trees[zoom + 1]; - const neighborIds = tree.within(p.x, p.y, r); - - const numPointsOrigin = p.numPoints || 1; - let numPoints = numPointsOrigin; + _projectAndResample(polygon , transform ) { + // Handle a special case where either north or south pole is inside the query polygon + const polePolygon = projectPolygonCoveringPoles(polygon, transform); - // count the number of points in a potential cluster - for (const neighborId of neighborIds) { - const b = tree.points[neighborId]; - // filter out neighbors that are already processed - if (b.zoom > zoom) numPoints += b.numPoints || 1; - } + if (polePolygon) { + return polePolygon; + } - // if there were neighbors to merge, and there are enough points to form a cluster - if (numPoints > numPointsOrigin && numPoints >= minPoints) { - let wx = p.x * numPointsOrigin; - let wy = p.y * numPointsOrigin; + // Resample the polygon by adding intermediate points so that straight lines of the shape + // are correctly projected on the surface of the globe. + const resampled = unwrapQueryPolygon(resamplePolygon(polygon, transform).map(p => new ref_properties.pointGeometry(wrap(p.x), p.y)), transform); - let clusterProperties = reduce && numPointsOrigin > 1 ? this._map(p, true) : null; + return { + polygon: resampled.polygon.map(p => new ref_properties.MercatorCoordinate(p.x, p.y)), + unwrapped: resampled.unwrapped + }; + } +} - // encode both zoom and point index on which the cluster originated -- offset by total length of features - const id = (i << 5) + (zoom + 1) + this.points.length; +// Checks whether the provided polygon is crossing the antimeridian line and unwraps it if necessary. +// The resulting polygon is continuous +function unwrapQueryPolygon(polygon , tr ) { + let unwrapped = false; - for (const neighborId of neighborIds) { - const b = tree.points[neighborId]; + // Traverse edges of the polygon and unwrap vertices that are crossing the antimeridian. + let maxX = -Infinity; + let startEdge = 0; - if (b.zoom <= zoom) continue; - b.zoom = zoom; // save the zoom (so it doesn't get processed twice) + for (let e = 0; e < polygon.length - 1; e++) { + if (polygon[e].x > maxX) { + maxX = polygon[e].x; + startEdge = e; + } + } - const numPoints2 = b.numPoints || 1; - wx += b.x * numPoints2; // accumulate coordinates for calculating weighted center - wy += b.y * numPoints2; + for (let i = 0; i < polygon.length - 1; i++) { + const edge = (startEdge + i) % (polygon.length - 1); + const a = polygon[edge]; + const b = polygon[edge + 1]; - b.parentId = id; + if (Math.abs(a.x - b.x) > 0.5) { + // A straight line drawn on the globe can't have longer length than 0.5 on the x-axis + // without crossing the antimeridian + if (a.x < b.x) { + a.x += 1; - if (reduce) { - if (!clusterProperties) clusterProperties = this._map(p, true); - reduce(clusterProperties, this._map(b)); - } + if (edge === 0) { + // First and last points are duplicate for closed polygons + polygon[polygon.length - 1].x += 1; } + } else { + b.x += 1; - p.parentId = id; - clusters.push(createCluster(wx / numPoints, wy / numPoints, id, numPoints, clusterProperties)); - - } else { // left points as unclustered - clusters.push(p); - - if (numPoints > 1) { - for (const neighborId of neighborIds) { - const b = tree.points[neighborId]; - if (b.zoom <= zoom) continue; - b.zoom = zoom; - clusters.push(b); - } + if (edge + 1 === polygon.length - 1) { + polygon[0].x += 1; } } - } - - return clusters; - } - - // get index of the point from which the cluster originated - _getOriginId(clusterId) { - return (clusterId - this.points.length) >> 5; - } - - // get zoom of the point from which the cluster originated - _getOriginZoom(clusterId) { - return (clusterId - this.points.length) % 32; - } - _map(point, clone) { - if (point.numPoints) { - return clone ? extend({}, point.properties) : point.properties; + unwrapped = true; } - const original = this.points[point.index].properties; - const result = this.options.map(original); - return clone && result === original ? extend({}, result) : result; } -} - -function createCluster(x, y, id, numPoints, properties) { - return { - x: fround(x), // weighted cluster center; round for consistency with Float32Array index - y: fround(y), - zoom: Infinity, // the last zoom the cluster was processed at - id, // encodes index of the first child of the cluster and its zoom level - parentId: -1, // parent cluster id - numPoints, - properties - }; -} -function createPointCluster(p, id) { - const [x, y] = p.geometry.coordinates; - return { - x: fround(lngX(x)), // projected point coordinates - y: fround(latY(y)), - zoom: Infinity, // the last zoom the point was processed at - index: id, // index of the source feature in the original input array, - parentId: -1 // parent cluster id - }; -} + const cameraX = ref_properties.mercatorXfromLng(tr.center.lng); + if (unwrapped && cameraX < Math.abs(cameraX - 1)) { + polygon.forEach(p => { p.x -= 1; }); + } -function getClusterJSON(cluster) { return { - type: 'Feature', - id: cluster.id, - properties: getClusterProperties(cluster), - geometry: { - type: 'Point', - coordinates: [xLng(cluster.x), yLat(cluster.y)] - } + polygon, + unwrapped }; } -function getClusterProperties(cluster) { - const count = cluster.numPoints; - const 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) { - const sin = Math.sin(lat * Math.PI / 180); - const 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) { - const y2 = (180 - y * 360) * Math.PI / 180; - return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90; -} - -function extend(dest, src) { - for (const id in src) dest[id] = src[id]; - return dest; -} - -function getX(p) { - return p.x; -} -function getY(p) { - return p.y; -} +// Special function for handling scenarios where one of the poles is inside the query polygon. +// Finding projection of these kind of polygons is more involving as projecting just the corners will +// produce a degenerate (self-intersecting, non-continuous, etc.) polygon in mercator coordinates +function projectPolygonCoveringPoles(polygon , tr ) { + const matrix = ref_properties.multiply([], tr.pixelMatrix, tr.globeMatrix); -// calculate simplification data using optimized Douglas-Peucker algorithm + // Transform north and south pole coordinates to the screen to see if they're + // inside the query polygon + const northPole = [0, -ref_properties.GLOBE_RADIUS, 0, 1]; + const southPole = [0, ref_properties.GLOBE_RADIUS, 0, 1]; + const center = [0, 0, 0, 1]; -function simplify(coords, first, last, sqTolerance) { - var maxSqDist = sqTolerance; - var mid = (last - first) >> 1; - var minPosToMid = last - first; - var index; + ref_properties.transformMat4$1(northPole, northPole, matrix); + ref_properties.transformMat4$1(southPole, southPole, matrix); + ref_properties.transformMat4$1(center, center, matrix); - var ax = coords[first]; - var ay = coords[first + 1]; - var bx = coords[last]; - var by = coords[last + 1]; + const screenNp = new ref_properties.pointGeometry(northPole[0] / northPole[3], northPole[1] / northPole[3]); + const screenSp = new ref_properties.pointGeometry(southPole[0] / southPole[3], southPole[1] / southPole[3]); + const containsNp = ref_properties.polygonContainsPoint(polygon, screenNp) && northPole[3] < center[3]; + const containsSp = ref_properties.polygonContainsPoint(polygon, screenSp) && southPole[3] < center[3]; - for (var i = first + 3; i < last; i += 3) { - var d = getSqSegDist(coords[i], coords[i + 1], ax, ay, bx, by); + if (!containsNp && !containsSp) { + return null; + } - if (d > maxSqDist) { - index = i; - maxSqDist = d; + // Project corner points of the polygon and traverse the ring to find the edge that's + // crossing the zero longitude border. + const result = findEdgeCrossingAntimeridian(polygon, tr, containsNp ? -1 : 1); - } else if (d === maxSqDist) { - // a workaround to ensure we choose a pivot close to the middle of the list, - // reducing recursion depth, for certain degenerate inputs - // https://github.com/mapbox/geojson-vt/issues/104 - var posToMid = Math.abs(i - mid); - if (posToMid < minPosToMid) { - index = i; - minPosToMid = posToMid; - } - } + if (!result) { + return null; } - 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); - } -} + // Start constructing the new polygon by resampling edges until the crossing edge + const {idx, t} = result; + let partA = idx > 1 ? resamplePolygon(polygon.slice(0, idx), tr) : []; + let partB = idx < polygon.length ? resamplePolygon(polygon.slice(idx), tr) : []; -// square distance from a point to a segment -function getSqSegDist(px, py, x, y, bx, by) { + partA = partA.map(p => new ref_properties.pointGeometry(wrap(p.x), p.y)); + partB = partB.map(p => new ref_properties.pointGeometry(wrap(p.x), p.y)); - var dx = bx - x; - var dy = by - y; + // Resample first section of the ring (up to the edge that crosses the 0-line) + const resampled = [...partA]; - if (dx !== 0 || dy !== 0) { + if (resampled.length === 0) { + resampled.push(partB[partB.length - 1]); + } - var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy); + // Find location of the crossing by interpolating mercator coordinates. + // This will produce slightly off result as the crossing edge is not actually + // linear on the globe. + const a = resampled[resampled.length - 1]; + const b = partB.length === 0 ? partA[0] : partB[0]; + const intersectionY = ref_properties.number(a.y, b.y, t); - if (t > 1) { - x = bx; - y = by; + let mid; - } else if (t > 0) { - x += dx * t; - y += dy * t; - } + if (containsNp) { + mid = [ + new ref_properties.pointGeometry(0, intersectionY), + new ref_properties.pointGeometry(0, 0), + new ref_properties.pointGeometry(1, 0), + new ref_properties.pointGeometry(1, intersectionY) + ]; + } else { + mid = [ + new ref_properties.pointGeometry(1, intersectionY), + new ref_properties.pointGeometry(1, 1), + new ref_properties.pointGeometry(0, 1), + new ref_properties.pointGeometry(0, intersectionY) + ]; } - dx = px - x; - dy = py - y; + resampled.push(...mid); - return dx * dx + dy * dy; -} + // Resample to the second section of the ring + if (partB.length === 0) { + resampled.push(partA[0]); + } else { + resampled.push(...partB); + } -function createFeature(id, type, geom, tags) { - var feature = { - id: typeof id === 'undefined' ? null : id, - type: type, - geometry: geom, - tags: tags, - minX: Infinity, - minY: Infinity, - maxX: -Infinity, - maxY: -Infinity + return { + polygon: resampled.map(p => new ref_properties.MercatorCoordinate(p.x, p.y)), + unwrapped: false }; - calcBBox(feature); - return feature; } -function calcBBox(feature) { - var geom = feature.geometry; - var type = feature.type; +function resamplePolygon(polygon , transform ) { + // Choose a tolerance value for the resampling logic that produces sufficiently + // accurate polygons without creating too many points. The value 1 / 256 was chosen + // based on empirical testing + const tolerance = 1.0 / 256.0; + return ref_properties.resample( + polygon, + p => { + const mc = transform.pointCoordinate3D(p); + p.x = mc.x; + p.y = mc.y; + }, + tolerance); +} - if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { - calcLineBBox(feature, geom); +function wrap(mercatorX ) { + return mercatorX < 0 ? 1 + (mercatorX % 1) : mercatorX % 1; +} - } else if (type === 'Polygon' || type === 'MultiLineString') { - for (var i = 0; i < geom.length; i++) { - calcLineBBox(feature, geom[i]); - } +function findEdgeCrossingAntimeridian(polygon , tr , direction ) { + for (let i = 1; i < polygon.length; i++) { + const a = wrap(tr.pointCoordinate3D(polygon[i - 1]).x); + const b = wrap(tr.pointCoordinate3D(polygon[i]).x); - } 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]); + // direction < 0: mercator coordinate 0 will be crossed from left + // direction > 0: mercator coordinate 1 will be crossed from right + if (direction < 0) { + if (a < b) { + return {idx: i, t: -a / (b - 1 - a)}; + } + } else { + if (b < a) { + return {idx: i, t: (1 - a) / (b + 1 - a)}; } } } + + return null; } -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]); - } +//Padding is in screen pixels and is only used as a coarse check, so 2 decimal places of precision should be good enough for a cache. +function cacheKey(padding ) { + return (padding * 100) | 0; } -// converts GeoJSON feature into an intermediate projected JSON vector format with simplification data + + + + + + + + + + -function convert(data, options) { - var features = []; - if (data.type === 'FeatureCollection') { - for (var i = 0; i < data.features.length; i++) { - convertFeature(features, data.features[i], options, i); - } +function clampBoundsToTileExtents(bounds ) { + bounds.min.x = ref_properties.clamp(bounds.min.x, 0, ref_properties.EXTENT); + bounds.min.y = ref_properties.clamp(bounds.min.y, 0, ref_properties.EXTENT); - } else if (data.type === 'Feature') { - convertFeature(features, data, options); + bounds.max.x = ref_properties.clamp(bounds.max.x, 0, ref_properties.EXTENT); + bounds.max.y = ref_properties.clamp(bounds.max.y, 0, ref_properties.EXTENT); + return bounds; +} - } else { - // single geometry or a geometry collection - convertFeature(features, {geometry: data}, options); - } +// - return features; -} + + + + -function convertFeature(features, geojson, options, index) { - if (!geojson.geometry) return; +function loadTileJSON(options , requestManager , language , worldview , callback ) { + const loaded = function(err , tileJSON ) { + if (err) { + return callback(err); + } else if (tileJSON) { + const result = ref_properties.pick( + // explicit source options take precedence over TileJSON + ref_properties.extend(tileJSON, options), + ['tiles', 'minzoom', 'maxzoom', 'attribution', 'mapbox_logo', 'bounds', 'scheme', 'tileSize', 'encoding'] + ); - var coords = geojson.geometry.coordinates; - var type = geojson.geometry.type; - var tolerance = Math.pow(options.tolerance / ((1 << options.maxZoom) * options.extent), 2); - var geometry = []; - var id = geojson.id; - if (options.promoteId) { - id = geojson.properties[options.promoteId]; - } else if (options.generateId) { - id = index || 0; - } - if (type === 'Point') { - convertPoint(coords, geometry); + if (tileJSON.vector_layers) { + result.vectorLayers = tileJSON.vector_layers; + result.vectorLayerIds = result.vectorLayers.map((layer) => { return layer.id; }); + } - } else if (type === 'MultiPoint') { - for (var i = 0; i < coords.length; i++) { - convertPoint(coords[i], geometry); - } + /** + * A tileset supports language localization if the TileJSON contains + * a `language_options` object in the response. + */ + if (tileJSON.language_options) { + result.languageOptions = tileJSON.language_options; + } - } else if (type === 'LineString') { - convertLine(coords, geometry, tolerance, false); + if (tileJSON.language && tileJSON.language[tileJSON.id]) { + result.language = tileJSON.language[tileJSON.id]; + } - } else if (type === 'MultiLineString') { - if (options.lineMetrics) { - // explode into linestrings to be able to track metrics - for (i = 0; i < coords.length; i++) { - geometry = []; - convertLine(coords[i], geometry, tolerance, false); - features.push(createFeature(id, 'LineString', geometry, geojson.properties)); + /** + * A tileset supports different worldviews if the TileJSON contains + * a `worldview_options` object in the repsonse as well as a `worldview_default` key. + */ + if (tileJSON.worldview_options) { + result.worldviewOptions = tileJSON.worldview_options; } - return; - } else { - convertLines(coords, geometry, tolerance, false); - } - } else if (type === 'Polygon') { - convertLines(coords, geometry, tolerance, true); + if (tileJSON.worldview) { + result.worldview = tileJSON.worldview[tileJSON.id]; + } else if (tileJSON.worldview_default) { + result.worldview = tileJSON.worldview_default; + } - } else if (type === 'MultiPolygon') { - for (i = 0; i < coords.length; i++) { - var polygon = []; - convertLines(coords[i], polygon, tolerance, true); - geometry.push(polygon); - } - } else if (type === 'GeometryCollection') { - for (i = 0; i < geojson.geometry.geometries.length; i++) { - convertFeature(features, { - id: id, - geometry: geojson.geometry.geometries[i], - properties: geojson.properties - }, options, index); + result.tiles = requestManager.canonicalizeTileset(result, options.url); + callback(null, result); } - return; + }; + + if (options.url) { + return ref_properties.getJSON(requestManager.transformRequest(requestManager.normalizeSourceURL(options.url, null, language, worldview), ref_properties.ResourceType.Source), loaded); } else { - throw new Error('Input data is not a valid GeoJSON object.'); + return ref_properties.exported.frame(() => loaded(null, options)); } - - features.push(createFeature(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, tolerance, 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); +class TileBounds { + + + - 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; + constructor(bounds , minzoom , maxzoom ) { + this.bounds = ref_properties.LngLatBounds.convert(this.validateBounds(bounds)); + this.minzoom = minzoom || 0; + this.maxzoom = maxzoom || 24; } - var last = out.length - 3; - out[2] = 1; - simplify(out, 0, last, tolerance); - out[last + 2] = 1; - - out.size = Math.abs(size); - out.start = 0; - out.end = out.size; -} + 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])]; + } -function convertLines(rings, out, tolerance, isPolygon) { - for (var i = 0; i < rings.length; i++) { - var geom = []; - convertLine(rings[i], geom, tolerance, isPolygon); - out.push(geom); + contains(tileID ) { + const worldSize = Math.pow(2, tileID.z); + const level = { + minX: Math.floor(ref_properties.mercatorXfromLng(this.bounds.getWest()) * worldSize), + minY: Math.floor(ref_properties.mercatorYfromLat(this.bounds.getNorth()) * worldSize), + maxX: Math.ceil(ref_properties.mercatorXfromLng(this.bounds.getEast()) * worldSize), + maxY: Math.ceil(ref_properties.mercatorYfromLat(this.bounds.getSouth()) * worldSize) + }; + const hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY; + return hit; } } -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; -} + + + + + + + + + + -/* clip features between two axis-parallel lines: - * | | - * ___|___ | / - * / | \____|____/ - * | | +/** + * A source containing vector tiles in [Mapbox Vector Tile format](https://docs.mapbox.com/vector-tiles/reference/). + * See the [Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#vector) for detailed documentation of options. + * + * @example + * map.addSource('some id', { + * type: 'vector', + * url: 'mapbox://mapbox.mapbox-streets-v8' + * }); + * + * @example + * map.addSource('some id', { + * type: 'vector', + * tiles: ['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt'], + * minzoom: 6, + * maxzoom: 14 + * }); + * + * @example + * map.getSource('some id').setUrl("mapbox://mapbox.mapbox-streets-v8"); + * + * @example + * map.getSource('some id').setTiles(['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt']); + * @see [Example: Add a vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/vector-source/) + * @see [Example: Add a third party vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/third-party/) */ +class VectorTileSource extends ref_properties.Evented { + + + + + + + + -function clip(features, scale, k1, k2, axis, minAll, maxAll, options) { - - k1 /= scale; - k2 /= scale; - - if (minAll >= k1 && maxAll < k2) return features; // trivial accept - else if (maxAll < k1 || minAll >= k2) return null; // trivial reject + + + + + + + + + + + + + + + + + - var clipped = []; + constructor(id , options , dispatcher , eventedParent ) { + super(); + this.id = id; + this.dispatcher = dispatcher; - for (var i = 0; i < features.length; i++) { + this.type = 'vector'; + this.minzoom = 0; + this.maxzoom = 22; + this.scheme = 'xyz'; + this.tileSize = 512; + this.reparseOverscaled = true; + this.isTileClipped = true; + this._loaded = false; - var feature = features[i]; - var geometry = feature.geometry; - var type = feature.type; + ref_properties.extend(this, ref_properties.pick(options, ['url', 'scheme', 'tileSize', 'promoteId'])); + this._options = ref_properties.extend({type: 'vector'}, options); - var min = axis === 0 ? feature.minX : feature.minY; - var max = axis === 0 ? feature.maxX : feature.maxY; + this._collectResourceTiming = options.collectResourceTiming; - if (min >= k1 && max < k2) { // trivial accept - clipped.push(feature); - continue; - } else if (max < k1 || min >= k2) { // trivial reject - continue; + if (this.tileSize !== 512) { + throw new Error('vector tile sources must have a tileSize of 512'); } - var newGeometry = []; - - if (type === 'Point' || type === 'MultiPoint') { - clipPoints(geometry, newGeometry, k1, k2, axis); - - } else if (type === 'LineString') { - clipLine(geometry, newGeometry, k1, k2, axis, false, options.lineMetrics); + this.setEventedParent(eventedParent); - } else if (type === 'MultiLineString') { - clipLines(geometry, newGeometry, k1, k2, axis, false); + this._tileWorkers = {}; + this._deduped = new ref_properties.DedupedRequest(); + } - } else if (type === 'Polygon') { - clipLines(geometry, newGeometry, k1, k2, axis, true); + load(callback ) { + this._loaded = false; + this.fire(new ref_properties.Event('dataloading', {dataType: 'source'})); + const language = this.language || this.map._language; + const worldview = this.worldview || this.map._worldview; + this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, language, worldview, (err, tileJSON) => { + this._tileJSONRequest = null; + this._loaded = true; + if (err) { + if (language) console.warn(`Ensure that your requested language string is a valid BCP-47 code. Found: ${language}`); + if (worldview && worldview.length !== 2) console.warn(`Requested worldview strings must be a valid ISO alpha-2 code. Found: ${worldview}`); - } 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); - } - } - } + this.fire(new ref_properties.ErrorEvent(err)); + } else if (tileJSON) { + ref_properties.extend(this, tileJSON); + if (tileJSON.bounds) this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom); + ref_properties.postTurnstileEvent(tileJSON.tiles, this.map._requestManager._customAccessToken); - if (newGeometry.length) { - if (options.lineMetrics && type === 'LineString') { - for (j = 0; j < newGeometry.length; j++) { - clipped.push(createFeature(feature.id, type, newGeometry[j], feature.tags)); - } - continue; + // `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.fire(new ref_properties.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); + this.fire(new ref_properties.Event('data', {dataType: 'source', sourceDataType: 'content'})); } - 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'; - } + if (callback) callback(err); + }); + } - clipped.push(createFeature(feature.id, type, newGeometry, feature.tags)); - } + loaded() { + return this._loaded; } - return clipped.length ? clipped : null; -} + hasTile(tileID ) { + return !this.tileBounds || this.tileBounds.contains(tileID.canonical); + } -function clipPoints(geom, newGeom, k1, k2, axis) { - for (var i = 0; i < geom.length; i += 3) { - var a = geom[i + axis]; + onAdd(map ) { + this.map = map; + this.load(); + } - if (a >= k1 && a <= k2) { - newGeom.push(geom[i]); - newGeom.push(geom[i + 1]); - newGeom.push(geom[i + 2]); + setSourceProperty(callback ) { + if (this._tileJSONRequest) { + this._tileJSONRequest.cancel(); } + + callback(); + + // Reload current tiles after TileJSON is loaded + this.load(() => { + const sourceCaches = this.map.style._getSourceCaches(this.id); + for (const sourceCache of sourceCaches) { + sourceCache.clearTiles(); + } + }); } -} -function clipLine(geom, newGeom, k1, k2, axis, isPolygon, trackMetrics) { + /** + * Sets the source `tiles` property and re-renders the map. + * + * @param {string[]} tiles An array of one or more tile source URLs, as in the TileJSON spec. + * @returns {VectorTileSource} Returns itself to allow for method chaining. + * @example + * map.addSource('vector_source_id', { + * type: 'vector', + * tiles: ['https://some_end_point.net/{z}/{x}/{y}.mvt'], + * minzoom: 6, + * maxzoom: 14 + * }); + * + * const vectorTileSource = map.getSource('vector_source_id'); + * + * // Set the endpoint associated with a vector tile source. + * vectorTileSource.setTiles(['https://another_end_point.net/{z}/{x}/{y}.mvt']); + */ + setTiles(tiles ) { + this.setSourceProperty(() => { + this._options.tiles = tiles; + }); - var slice = newSlice(geom); - var intersect = axis === 0 ? intersectX : intersectY; - var len = geom.start; - var segLen, t; + return this; + } - 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 exited = false; + /** + * Sets the source `url` property and re-renders the map. + * + * @param {string} url A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`. + * @returns {VectorTileSource} Returns itself to allow for method chaining. + * @example + * map.addSource('vector_source_id', { + * type: 'vector', + * url: 'mapbox://mapbox.mapbox-streets-v7' + * }); + * + * const vectorTileSource = map.getSource('vector_source_id'); + * + * // Update vector tile source to a new URL endpoint + * vectorTileSource.setUrl("mapbox://mapbox.mapbox-streets-v8"); + */ + setUrl(url ) { + this.setSourceProperty(() => { + this.url = url; + this._options.url = url; + }); - if (trackMetrics) segLen = Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2)); + return this; + } - if (a < k1) { - // ---|--> | (line enters the clip region from the left) - if (b > k1) { - t = intersect(slice, ax, ay, bx, by, k1); - if (trackMetrics) slice.start = len + segLen * t; - } - } else if (a > k2) { - // | <--|--- (line enters the clip region from the right) - if (b < k2) { - t = intersect(slice, ax, ay, bx, by, k2); - if (trackMetrics) slice.start = len + segLen * t; - } - } else { - addPoint(slice, ax, ay, az); - } - if (b < k1 && a >= k1) { - // <--|--- | or <--|-----|--- (line exits the clip region on the left) - t = intersect(slice, ax, ay, bx, by, k1); - exited = true; - } - if (b > k2 && a <= k2) { - // | ---|--> or ---|-----|--> (line exits the clip region on the right) - t = intersect(slice, ax, ay, bx, by, k2); - exited = true; - } + _setLanguage(language ) { + if (language === this.language) return this; - if (!isPolygon && exited) { - if (trackMetrics) slice.end = len + segLen * t; - newGeom.push(slice); - slice = newSlice(geom); - } + this.setSourceProperty(() => { + this.language = language; + }); - if (trackMetrics) len += segLen; + return this; } - // 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); + _setWorldview(worldview ) { + if (worldview === this.worldview) return this; + if (this.worldviewOptions && worldview && !this.worldviewOptions[worldview]) { + console.warn(`Vector tile source "${this.id}" does not support worldview "${worldview}".`); + return this; + } - // 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]); - } + this.setSourceProperty(() => { + this.worldview = worldview; + }); - // add the final slice - if (slice.length) { - newGeom.push(slice); + return this; } -} -function newSlice(line) { - var slice = []; - slice.size = line.size; - slice.start = line.start; - slice.end = line.end; - return slice; -} + onRemove() { + if (this._tileJSONRequest) { + this._tileJSONRequest.cancel(); + this._tileJSONRequest = null; + } + } -function clipLines(geom, newGeom, k1, k2, axis, isPolygon) { - for (var i = 0; i < geom.length; i++) { - clipLine(geom[i], newGeom, k1, k2, axis, isPolygon, false); + serialize() { + return ref_properties.extend({}, this._options); } -} -function addPoint(out, x, y, z) { - out.push(x); - out.push(y); - out.push(z); -} + loadTile(tile , callback ) { + const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme)); + const request = this.map._requestManager.transformRequest(url, ref_properties.ResourceType.Tile); -function intersectX(out, ax, ay, bx, by, x) { - var t = (x - ax) / (bx - ax); - out.push(x); - out.push(ay + (by - ay) * t); - out.push(1); - return t; -} + const params = { + request, + data: undefined, + uid: tile.uid, + tileID: tile.tileID, + tileZoom: tile.tileZoom, + zoom: tile.tileID.overscaledZ, + tileSize: this.tileSize * tile.tileID.overscaleFactor(), + type: this.type, + source: this.id, + pixelRatio: ref_properties.exported.devicePixelRatio, + showCollisionBoxes: this.map.showCollisionBoxes, + promoteId: this.promoteId, + isSymbolTile: tile.isSymbolTile + }; + params.request.collectResourceTiming = this._collectResourceTiming; -function intersectY(out, ax, ay, bx, by, y) { - var t = (y - ay) / (by - ay); - out.push(ax + (bx - ax) * t); - out.push(y); - out.push(1); - return t; -} + if (!tile.actor || tile.state === 'expired') { + tile.actor = this._tileWorkers[url] = this._tileWorkers[url] || this.dispatcher.getActor(); -function wrap(features, options) { - var buffer = options.buffer / options.extent; - var merged = features; - var left = clip(features, 1, -1 - buffer, buffer, 0, -1, 2, options); // left world copy - var right = clip(features, 1, 1 - buffer, 2 + buffer, 0, -1, 2, options); // right world copy + // if workers are not ready to receive messages yet, use the idle time to preemptively + // load tiles on the main thread and pass the result instead of requesting a worker to do so + if (!this.dispatcher.ready) { + const cancel = ref_properties.loadVectorTile.call({deduped: this._deduped}, params, (err , data ) => { + if (err || !data) { + done.call(this, err); + } else { + // the worker will skip the network request if the data is already there + params.data = { + cacheControl: data.cacheControl, + expires: data.expires, + rawData: data.rawData.slice(0) + }; + if (tile.actor) tile.actor.send('loadTile', params, done.bind(this), undefined, true); + } + }, true); + tile.request = {cancel}; - if (left || right) { - merged = clip(features, 1, -buffer, 1 + buffer, 0, -1, 2, options) || []; // center world copy + } else { + tile.request = tile.actor.send('loadTile', params, done.bind(this), undefined, true); + } - if (left) merged = shiftFeatureCoords(left, 1).concat(merged); // merge left into center - if (right) merged = merged.concat(shiftFeatureCoords(right, -1)); // merge right into center - } + } else if (tile.state === 'loading') { + // schedule tile reloading after it has been loaded + tile.reloadCallback = callback; - return merged; -} + } else { + tile.request = tile.actor.send('reloadTile', params, done.bind(this)); + } -function shiftFeatureCoords(features, offset) { - var newFeatures = []; + function done(err, data) { + delete tile.request; - for (var i = 0; i < features.length; i++) { - var feature = features[i], - type = feature.type; + if (tile.aborted) + return callback(null); - var newGeometry; + if (err && err.status !== 404) { + return callback(err); + } - if (type === 'Point' || type === 'MultiPoint' || type === 'LineString') { - newGeometry = shiftCoords(feature.geometry, offset); + if (data && data.resourceTiming) + tile.resourceTiming = data.resourceTiming; - } 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); + if (this.map._refreshExpiredTiles && data) tile.setExpiryData(data); + tile.loadVectorData(data, this.map.painter); + + ref_properties.cacheEntryPossiblyAdded(this.dispatcher); + + callback(null); + + if (tile.reloadCallback) { + this.loadTile(tile, tile.reloadCallback); + tile.reloadCallback = null; } } - - newFeatures.push(createFeature(feature.id, type, newGeometry, feature.tags)); } - return newFeatures; -} + abortTile(tile ) { + if (tile.request) { + tile.request.cancel(); + delete tile.request; + } + if (tile.actor) { + tile.actor.send('abortTile', {uid: tile.uid, type: this.type, source: this.id}); + } + } -function shiftCoords(points, offset) { - var newPoints = []; - newPoints.size = points.size; + unloadTile(tile ) { + tile.unloadVectorData(); + if (tile.actor) { + tile.actor.send('removeTile', {uid: tile.uid, type: this.type, source: this.id}); + } + } - if (points.start !== undefined) { - newPoints.start = points.start; - newPoints.end = points.end; + hasTransition() { + return false; } - for (var i = 0; i < points.length; i += 3) { - newPoints.push(points[i] + offset, points[i + 1], points[i + 2]); + afterUpdate() { + this._tileWorkers = {}; } - return newPoints; } -// 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 = 1 << tile.z, - 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; +class RasterTileSource extends ref_properties.Evented { + + + + + + + - 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; + constructor(id , options , dispatcher , eventedParent ) { + super(); + this.id = id; + this.dispatcher = dispatcher; + this.setEventedParent(eventedParent); - return tile; -} + this.type = 'raster'; + this.minzoom = 0; + this.maxzoom = 22; + this.roundZoom = true; + this.scheme = 'xyz'; + this.tileSize = 512; + this._loaded = false; -function transformPoint(x, y, extent, z2, tx, ty) { - return [ - Math.round(extent * (x * z2 - tx)), - Math.round(extent * (y * z2 - ty))]; -} + this._options = ref_properties.extend({type: 'raster'}, options); + ref_properties.extend(this, ref_properties.pick(options, ['url', 'scheme', 'tileSize'])); + } -function createTile(features, z, tx, ty, options) { - var tolerance = z === options.maxZoom ? 0 : options.tolerance / ((1 << z) * options.extent); - var tile = { - features: [], - numPoints: 0, - numSimplified: 0, - numFeatures: 0, - source: null, - x: tx, - y: ty, - z: z, - 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, options); + load() { + this._loaded = false; + this.fire(new ref_properties.Event('dataloading', {dataType: 'source'})); + this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, null, null, (err, tileJSON) => { + this._tileJSONRequest = null; + this._loaded = true; + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); + } else if (tileJSON) { + ref_properties.extend(this, tileJSON); + if (tileJSON.bounds) this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom); - var minX = features[i].minX; - var minY = features[i].minY; - var maxX = features[i].maxX; - var maxY = features[i].maxY; + ref_properties.postTurnstileEvent(tileJSON.tiles); - 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; + // `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.fire(new ref_properties.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); + this.fire(new ref_properties.Event('data', {dataType: 'source', sourceDataType: 'content'})); + } + }); } - return tile; -} -function addFeature(tile, feature, tolerance, options) { + loaded() { + return this._loaded; + } - var geom = feature.geometry, - type = feature.type, - simplified = []; + onAdd(map ) { + this.map = map; + this.load(); + } - 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++; + onRemove() { + if (this._tileJSONRequest) { + this._tileJSONRequest.cancel(); + this._tileJSONRequest = null; } + } - } else if (type === 'LineString') { - addLine(simplified, geom, tile, tolerance, false, false); + serialize() { + return ref_properties.extend({}, this._options); + } - } else if (type === 'MultiLineString' || type === 'Polygon') { - for (i = 0; i < geom.length; i++) { - addLine(simplified, geom[i], tile, tolerance, type === 'Polygon', i === 0); - } + hasTile(tileID ) { + return !this.tileBounds || this.tileBounds.contains(tileID.canonical); + } - } else if (type === 'MultiPolygon') { + loadTile(tile , callback ) { + const use2x = ref_properties.exported.devicePixelRatio >= 2; + const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), use2x, this.tileSize); + tile.request = ref_properties.getImage(this.map._requestManager.transformRequest(url, ref_properties.ResourceType.Tile), (error, data, cacheControl, expires) => { + delete tile.request; - 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, true, i === 0); + if (tile.aborted) { + tile.state = 'unloaded'; + return callback(null); } - } - } - if (simplified.length) { - var tags = feature.tags || null; - if (type === 'LineString' && options.lineMetrics) { - tags = {}; - for (var key in feature.tags) tags[key] = feature.tags[key]; - tags['mapbox_clip_start'] = geom.start / geom.size; - tags['mapbox_clip_end'] = geom.end / geom.size; - } - var tileFeature = { - geometry: simplified, - type: type === 'Polygon' || type === 'MultiPolygon' ? 3 : - type === 'LineString' || type === 'MultiLineString' ? 2 : 1, - tags: tags - }; - if (feature.id !== null) { - tileFeature.id = feature.id; - } - tile.features.push(tileFeature); - } -} + if (error) { + tile.state = 'errored'; + return callback(error); + } -function addLine(result, geom, tile, tolerance, isPolygon, isOuter) { - var sqTolerance = tolerance * tolerance; + if (!data) return callback(null); - if (tolerance > 0 && (geom.size < (isPolygon ? sqTolerance : tolerance))) { - tile.numPoints += geom.length / 3; - return; + if (this.map._refreshExpiredTiles) tile.setExpiryData({cacheControl, expires}); + tile.setTexture(data, this.map.painter); + tile.state = 'loaded'; + + ref_properties.cacheEntryPossiblyAdded(this.dispatcher); + callback(null); + }); } - var ring = []; + static loadTileData(tile , data , painter ) { + tile.setTexture(data, painter); + } - for (var i = 0; i < geom.length; i += 3) { - if (tolerance === 0 || geom[i + 2] > sqTolerance) { - tile.numSimplified++; - ring.push(geom[i]); - ring.push(geom[i + 1]); + static unloadTileData(tile , painter ) { + if (tile.texture) { + painter.saveTileTexture(tile.texture); } - tile.numPoints++; } - if (isPolygon) rewind$1(ring, isOuter); - - result.push(ring); -} + abortTile(tile , callback ) { + if (tile.request) { + tile.request.cancel(); + delete tile.request; + } + callback(); + } -function rewind$1(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]); + unloadTile(tile , callback ) { + if (tile.texture) this.map.painter.saveTileTexture(tile.texture); + callback(); } - 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; - } + + hasTransition() { + return false; } } -function geojsonvt(data, options) { - return new GeoJSONVT(data, options); +// + +let supportsOffscreenCanvas ; + +function offscreenCanvasSupported() { + if (supportsOffscreenCanvas == null) { + supportsOffscreenCanvas = ref_properties.window.OffscreenCanvas && + new ref_properties.window.OffscreenCanvas(1, 1).getContext('2d') && + typeof ref_properties.window.createImageBitmap === 'function'; + } + + return supportsOffscreenCanvas; } -function GeoJSONVT(data, options) { - options = this.options = extend$1(Object.create(this.options), options); +// - var debug = options.debug; + + + + + - if (debug) console.time('preprocess data'); +class RasterDEMTileSource extends RasterTileSource { + - if (options.maxZoom < 0 || options.maxZoom > 24) throw new Error('maxZoom should be in the 0-24 range'); - if (options.promoteId && options.generateId) throw new Error('promoteId and generateId cannot be used together.'); + constructor(id , options , dispatcher , eventedParent ) { + super(id, options, dispatcher, eventedParent); + this.type = 'raster-dem'; + this.maxzoom = 22; + this._options = ref_properties.extend({type: 'raster-dem'}, options); + this.encoding = options.encoding || "mapbox"; + } - var features = convert(data, options); + loadTile(tile , callback ) { + const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), false, this.tileSize); + tile.request = ref_properties.getImage(this.map._requestManager.transformRequest(url, ref_properties.ResourceType.Tile), imageLoaded.bind(this)); - this.tiles = {}; - this.tileCoords = []; + function imageLoaded(err, img, cacheControl, expires) { + 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({cacheControl, expires}); + const transfer = ref_properties.window.ImageBitmap && img instanceof ref_properties.window.ImageBitmap && offscreenCanvasSupported(); + // DEMData uses 1px padding. Handle cases with image buffer of 1 and 2 pxs, the rest assume default buffer 0 + // in order to keep the previous implementation working (no validation against tileSize). + const buffer = (img.width - ref_properties.prevPowerOfTwo(img.width)) / 2; + // padding is used in getImageData. As DEMData has 1px padding, if DEM tile buffer is 2px, discard outermost pixels. + const padding = 1 - buffer; + const borderReady = padding < 1; + if (!borderReady && !tile.neighboringTiles) { + tile.neighboringTiles = this._getNeighboringTiles(tile.tileID); + } + const rawImageData = transfer ? img : ref_properties.exported.getImageData(img, padding); + const params = { + uid: tile.uid, + coord: tile.tileID, + source: this.id, + rawImageData, + encoding: this.encoding, + padding + }; - 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; + if (!tile.actor || tile.state === 'expired') { + tile.actor = this.dispatcher.getActor(); + tile.actor.send('loadDEMTile', params, done.bind(this), undefined, true); + } + } + } + + function done(err, dem) { + if (err) { + tile.state = 'errored'; + callback(err); + } + + if (dem) { + tile.dem = dem; + tile.dem.onDeserialize(); + tile.needsHillshadePrepare = true; + tile.needsDEMTextureUpload = true; + tile.state = 'loaded'; + callback(null); + } + } } - features = wrap(features, options); + _getNeighboringTiles(tileID ) { + const canonical = tileID.canonical; + const dim = Math.pow(2, canonical.z); - // start slicing from the top tile down - if (features.length) this.splitTile(features, 0, 0, 0); + const px = (canonical.x - 1 + dim) % dim; + const pxw = canonical.x === 0 ? tileID.wrap - 1 : tileID.wrap; + const nx = (canonical.x + 1 + dim) % dim; + const nxw = canonical.x + 1 === dim ? tileID.wrap + 1 : tileID.wrap; - 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)); + const neighboringTiles = {}; + // add adjacent tiles + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y).key] = {backfilled: false}; + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y).key] = {backfilled: false}; + + // Add upper neighboringTiles + if (canonical.y > 0) { + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y - 1).key] = {backfilled: false}; + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y - 1).key] = {backfilled: false}; + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y - 1).key] = {backfilled: false}; + } + // Add lower neighboringTiles + if (canonical.y + 1 < dim) { + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y + 1).key] = {backfilled: false}; + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y + 1).key] = {backfilled: false}; + neighboringTiles[new ref_properties.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y + 1).key] = {backfilled: false}; + } + + return neighboringTiles; } -} -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 - lineMetrics: false, // whether to calculate line metrics - promoteId: null, // name of a feature property to be promoted to feature.id - generateId: false, // whether to generate feature ids. Cannot be used with promoteId - debug: 0 // logging level (0, 1 or 2) -}; + 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; -GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) { + tile.state = 'unloaded'; + } - 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]; + + + + + + + + + + - if (!tile) { - if (debug > 1) console.time('creation'); +/** + * A source containing GeoJSON. + * See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-geojson) for detailed documentation of options. + * + * @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 [Example: Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) + * @see [Example: Add a GeoJSON line](https://www.mapbox.com/mapbox-gl-js/example/geojson-line/) + * @see [Example: Create a heatmap from points](https://www.mapbox.com/mapbox-gl-js/example/heatmap/) + * @see [Example: Create and style clusters](https://www.mapbox.com/mapbox-gl-js/example/cluster/) + */ +class GeoJSONSource extends ref_properties.Evented { + + + + + + + - tile = this.tiles[id] = createTile(features, z, x, y, options); - 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++; - } - } + /** + * @private + */ + constructor(id , options , dispatcher , eventedParent ) { + super(); - // save reference to original geometry in tile so that we can drill down later if we stop now - tile.source = features; + this.id = id; - // 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; + // `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'; - // 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; + this.minzoom = 0; + this.maxzoom = 18; + this.tileSize = 512; + this.isTileClipped = true; + this.reparseOverscaled = true; + this._loaded = false; - // 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; - } + this.actor = dispatcher.getActor(); + this.setEventedParent(eventedParent); - // if we slice further down, no need to keep source geometry - tile.source = null; + this._data = (options.data ); + this._options = ref_properties.extend({}, options); - if (features.length === 0) continue; + this._collectResourceTiming = options.collectResourceTiming; - if (debug > 1) console.time('clipping'); + if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom; + if (options.type) this.type = options.type; + if (options.attribution) this.attribution = options.attribution; + this.promoteId = options.promoteId; - // 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; + const scale = ref_properties.EXTENT / this.tileSize; - tl = bl = tr = br = null; + // 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 = ref_properties.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: ref_properties.EXTENT, + maxZoom: this.maxzoom, + lineMetrics: options.lineMetrics || false, + generateId: options.generateId || false + }, + superclusterOptions: { + maxZoom: options.clusterMaxZoom !== undefined ? options.clusterMaxZoom : this.maxzoom - 1, + minPoints: Math.max(2, options.clusterMinPoints || 2), + extent: ref_properties.EXTENT, + radius: (options.clusterRadius !== undefined ? options.clusterRadius : 50) * scale, + log: false, + generateId: options.generateId || false + }, + clusterProperties: options.clusterProperties, + filter: options.filter + }, options.workerOptions); + } - left = clip(features, z2, x - k1, x + k3, 0, tile.minX, tile.maxX, options); - right = clip(features, z2, x + k2, x + k4, 0, tile.minX, tile.maxX, options); - features = null; + onAdd(map ) { + this.map = map; + this.setData(this._data); + } - if (left) { - tl = clip(left, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options); - bl = clip(left, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options); - left = null; - } + /** + * 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} Returns itself to allow for method chaining. + * @example + * map.addSource('source_id', { + * type: 'geojson', + * data: { + * type: 'FeatureCollection', + * features: [] + * } + * }); + * const geojsonSource = map.getSource('source_id'); + * // Update the data after the GeoJSON source was created + * geojsonSource.setData({ + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "properties": {"name": "Null Island"}, + * "geometry": { + * "type": "Point", + * "coordinates": [ 0, 0 ] + * } + * }] + * }); + */ + setData(data ) { + this._data = data; + this._updateWorkerData(); + return this; + } - if (right) { - tr = clip(right, z2, y - k1, y + k3, 1, tile.minY, tile.maxY, options); - br = clip(right, z2, y + k2, y + k4, 1, tile.minY, tile.maxY, options); - right = null; - } + /** + * For clustered sources, fetches the zoom at which the given cluster expands. + * + * @param {number} clusterId The value of the cluster's `cluster_id` property. + * @param {Function} callback A callback to be called when the zoom value is retrieved (`(error, zoom) => { ... }`). + * @returns {GeoJSONSource} Returns itself to allow for method chaining. + * @example + * // Assuming the map has a layer named 'clusters' and a source 'earthquakes' + * // The following creates a camera animation on cluster feature click + * map.on('click', 'clusters', (e) => { + * const features = map.queryRenderedFeatures(e.point, { + * layers: ['clusters'] + * }); + * + * const clusterId = features[0].properties.cluster_id; + * + * // Ease the camera to the next cluster expansion + * map.getSource('earthquakes').getClusterExpansionZoom( + * clusterId, + * (err, zoom) => { + * if (!err) { + * map.easeTo({ + * center: features[0].geometry.coordinates, + * zoom + * }); + * } + * } + * ); + * }); + */ + getClusterExpansionZoom(clusterId , callback ) { + this.actor.send('geojson.getClusterExpansionZoom', {clusterId, source: this.id}, callback); + return this; + } - if (debug > 1) console.timeEnd('clipping'); + /** + * For clustered sources, fetches the children of the given cluster on the next zoom level (as an array of GeoJSON features). + * + * @param {number} clusterId The value of the cluster's `cluster_id` property. + * @param {Function} callback A callback to be called when the features are retrieved (`(error, features) => { ... }`). + * @returns {GeoJSONSource} Returns itself to allow for method chaining. + * @example + * // Retrieve cluster children on click + * map.on('click', 'clusters', (e) => { + * const features = map.queryRenderedFeatures(e.point, { + * layers: ['clusters'] + * }); + * + * const clusterId = features[0].properties.cluster_id; + * + * clusterSource.getClusterChildren(clusterId, (error, features) => { + * if (!error) { + * console.log('Cluster children:', features); + * } + * }); + * }); + * + */ + getClusterChildren(clusterId , callback ) { + this.actor.send('geojson.getClusterChildren', {clusterId, source: this.id}, callback); + return this; + } - 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); + /** + * For clustered sources, fetches the original points that belong to the cluster (as an array of GeoJSON features). + * + * @param {number} clusterId The value of the cluster's `cluster_id` property. + * @param {number} limit The maximum number of features to return. Defaults to `10` if a falsy value is given. + * @param {number} offset The number of features to skip (for example, for pagination). Defaults to `0` if a falsy value is given. + * @param {Function} callback A callback to be called when the features are retrieved (`(error, features) => { ... }`). + * @returns {GeoJSONSource} Returns itself to allow for method chaining. + * @example + * // Retrieve cluster leaves on click + * map.on('click', 'clusters', (e) => { + * const features = map.queryRenderedFeatures(e.point, { + * layers: ['clusters'] + * }); + * + * const clusterId = features[0].properties.cluster_id; + * const pointCount = features[0].properties.point_count; + * const clusterSource = map.getSource('clusters'); + * + * clusterSource.getClusterLeaves(clusterId, pointCount, 0, (error, features) => { + * // Print cluster leaves in the console + * console.log('Cluster leaves:', error, features); + * }); + * }); + */ + getClusterLeaves(clusterId , limit , offset , callback ) { + this.actor.send('geojson.getClusterLeaves', { + source: this.id, + clusterId, + limit, + offset + }, callback); + return this; } -}; -GeoJSONVT.prototype.getTile = function (z, x, y) { - var options = this.options, - extent = options.extent, - debug = options.debug; + /* + * 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. + */ + _updateWorkerData() { + // if there's an earlier loadData to finish, wait until it finishes and then do another update + if (this._pendingLoad) { + this._coalesce = true; + return; + } - if (z < 0 || z > 24) return null; + this.fire(new ref_properties.Event('dataloading', {dataType: 'source'})); - var z2 = 1 << z; - x = ((x % z2) + z2) % z2; // wrap tile x coordinate + this._loaded = false; + const options = ref_properties.extend({}, this.workerOptions); + const data = this._data; + if (typeof data === 'string') { + options.request = this.map._requestManager.transformRequest(ref_properties.exported.resolveURL(data), ref_properties.ResourceType.Source); + options.request.collectResourceTiming = this._collectResourceTiming; + } else { + options.data = JSON.stringify(data); + } - var id = toID(z, x, y); - if (this.tiles[id]) return transformTile(this.tiles[id], extent); + // target {this.type}.loadData rather than literally geojson.loadData, + // so that other geojson-like source types can easily reuse this + // implementation + this._pendingLoad = this.actor.send(`${this.type}.loadData`, options, (err, result) => { + this._loaded = true; + this._pendingLoad = null; - if (debug > 1) console.log('drilling down to z%d-%d-%d', z, x, y); + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); - var z0 = z, - x0 = x, - y0 = y, - parent; + } else { + // although GeoJSON sources contain no metadata, we fire this event at first + // to let the SourceCache know its ok to start requesting tiles. + const data = {dataType: 'source', sourceDataType: this._metadataFired ? 'content' : 'metadata'}; + if (this._collectResourceTiming && result && result.resourceTiming && result.resourceTiming[this.id]) { + data.resourceTiming = result.resourceTiming[this.id]; + } + this.fire(new ref_properties.Event('data', data)); + this._metadataFired = true; + } - while (!parent && z0 > 0) { - z0--; - x0 = Math.floor(x0 / 2); - y0 = Math.floor(y0 / 2); - parent = this.tiles[toID(z0, x0, y0)]; + if (this._coalesce) { + this._updateWorkerData(); + this._coalesce = false; + } + }); } - if (!parent || !parent.source) return null; + loaded() { + return this._loaded; + } - // 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); + loadTile(tile , callback ) { + const message = !tile.actor ? 'loadTile' : 'reloadTile'; + tile.actor = this.actor; + const params = { + type: this.type, + uid: tile.uid, + tileID: tile.tileID, + tileZoom: tile.tileZoom, + zoom: tile.tileID.overscaledZ, + maxZoom: this.maxzoom, + tileSize: this.tileSize, + source: this.id, + pixelRatio: ref_properties.exported.devicePixelRatio, + showCollisionBoxes: this.map.showCollisionBoxes, + promoteId: this.promoteId + }; - if (debug > 1) console.time('drilling down'); - this.splitTile(parent.source, z0, x0, y0, z, x, y); - if (debug > 1) console.timeEnd('drilling down'); + tile.request = this.actor.send(message, params, (err, data) => { + delete tile.request; + tile.unloadVectorData(); - return this.tiles[id] ? transformTile(this.tiles[id], extent) : null; -}; + if (tile.aborted) { + return callback(null); + } -function toID(z, x, y) { - return (((1 << z) * y + x) * 32) + z; -} + if (err) { + return callback(err); + } -function extend$1(dest, src) { - for (var i in src) dest[i] = src[i]; - return dest; -} + tile.loadVectorData(data, this.map.painter, message === 'reloadTile'); -// + return callback(null); + }, undefined, message === 'loadTile'); + } - - - - - + abortTile(tile ) { + if (tile.request) { + tile.request.cancel(); + delete tile.request; + } + tile.aborted = true; + } - - + unloadTile(tile ) { + tile.unloadVectorData(); + this.actor.send('removeTile', {uid: tile.uid, type: this.type, source: this.id}); + } - - - - + onRemove() { + if (this._pendingLoad) { + this._pendingLoad.cancel(); + } + } - - - - - - - - - - + serialize() { + return ref_properties.extend({}, this._options, { + type: this.type, + data: this._data + }); + } - + hasTransition() { + return false; + } +} - - +// - + + + + + + - - - - -function loadGeoJSONTile(params , callback ) { - const canonical = params.tileID.canonical; - - if (!this._geoJSONIndex) { - return callback(null, null); // we couldn't load the file - } + + + + + - const geoJSONTile = this._geoJSONIndex.getTile(canonical.z, canonical.x, canonical.y); - if (!geoJSONTile) { - return callback(null, null); // nothing in the given tile - } + - const geojsonWrapper = new GeoJSONWrapper(geoJSONTile.features); +// perspective correction for texture mapping, see https://github.com/mapbox/mapbox-gl-js/issues/9158 +// adapted from https://math.stackexchange.com/a/339033/48653 - // Encode the geojson-vt tile into binary vector tile form. This - // is a convenience that allows `FeatureIndex` to operate the same way - // across `VectorTileSource` and `GeoJSONSource` data. - let 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); - } +function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { + const m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; + const s = [x4, y4, 1]; + const ma = ref_properties.adjoint([], m); + const [sx, sy, sz] = ref_properties.transformMat3(s, s, ref_properties.transpose(ma, ma)); + return ref_properties.multiply$1(m, [sx, 0, 0, 0, sy, 0, 0, 0, sz], m); +} - callback(null, { - vectorTile: geojsonWrapper, - rawData: pbf.buffer - }); +function getPerspectiveTransform(w, h, x1, y1, x2, y2, x3, y3, x4, y4) { + const s = basisToPoints(0, 0, w, 0, 0, h, w, h); + const m = basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4); + ref_properties.multiply$1(m, ref_properties.adjoint(s, s), m); + return [ + m[6] / m[8] * w / ref_properties.EXTENT, + m[7] / m[8] * h / ref_properties.EXTENT + ]; } /** - * 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). + * 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. * - * @private + * @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 coordinates + * const mySource = map.getSource('some id'); + * mySource.setCoordinates([ + * [-76.54335737228394, 39.18579907229748], + * [-76.52803659439087, 39.1838364847587], + * [-76.5295386314392, 39.17683392507606], + * [-76.54520273208618, 39.17876344106642] + * ]); + * + * // update url and coordinates simultaneously + * mySource.updateImage({ + * url: 'https://www.mapbox.com/images/bar.png', + * coordinates: [ + * [-76.54335737228394, 39.18579907229748], + * [-76.52803659439087, 39.1838364847587], + * [-76.5295386314392, 39.17683392507606], + * [-76.54520273208618, 39.17876344106642] + * ] + * }); + * + * map.removeSource('some id'); // remove + * @see [Example: Add an image](https://www.mapbox.com/mapbox-gl-js/example/image-on-a-map/) + * @see [Example: Animate a series of images](https://www.mapbox.com/mapbox-gl-js/example/animate-images/) */ -class GeoJSONWorkerSource extends transform.VectorTileWorkerSource { +class ImageSource extends ref_properties.Evented { + + + + + + + + + + + + + + + + + + + + /** - * @param [loadGeoJSON] Optional method for custom loading/parsing of - * GeoJSON based on parameters passed from the main-thread Source. - * See {@link GeoJSONWorkerSource#loadGeoJSON}. - * @private - */ - constructor(actor , layerIndex , availableImages , isSpriteLoaded , loadGeoJSON ) { - super(actor, layerIndex, availableImages, isSpriteLoaded, loadGeoJSONTile); - if (loadGeoJSON) { - this.loadGeoJSON = loadGeoJSON; - } - } - - /** - * 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. - * - * When `loadData` requests come in faster than they can be processed, - * they are coalesced into a single request using the latest data. - * See {@link GeoJSONWorkerSource#coalesce} - * - * @param params - * @param callback * @private - */ - loadData(params , callback ) { - const requestParam = params && params.request; - const perf = requestParam && requestParam.collectResourceTiming; + */ + constructor(id , options , dispatcher , eventedParent ) { + super(); + this.id = id; + this.dispatcher = dispatcher; + this.coordinates = options.coordinates; - this.loadGeoJSON(params, (err , data ) => { - if (err || !data) { - return callback(err); - } else if (typeof data !== 'object') { - return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`)); - } else { - geojsonRewind(data, true); + this.type = 'image'; + this.minzoom = 0; + this.maxzoom = 22; + this.tileSize = 512; + this.tiles = {}; + this._loaded = false; - try { - if (params.filter) { - const compiled = transform.createExpression(params.filter, {type: 'boolean', 'property-type': 'data-driven', overridable: false, transition: false}); - if (compiled.result === 'error') - throw new Error(compiled.value.map(err => `${err.key}: ${err.message}`).join(', ')); + this.setEventedParent(eventedParent); - const features = data.features.filter(feature => compiled.value.evaluate({zoom: 0}, feature)); - data = {type: 'FeatureCollection', features}; - } + this.options = options; + } - this._geoJSONIndex = params.cluster ? - new Supercluster(getSuperclusterOptions(params)).load(data.features) : - geojsonvt(data, params.geojsonVtOptions); - } catch (err) { - return callback(err); - } + load(newCoordinates , loaded ) { + this._loaded = loaded || false; + this.fire(new ref_properties.Event('dataloading', {dataType: 'source'})); - this.loaded = {}; + this.url = this.options.url; - const result = {}; - if (perf) { - const resourceTimingData = transform.getPerformanceMeasurement(requestParam); - // 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)); - } + ref_properties.getImage(this.map._requestManager.transformRequest(this.url, ref_properties.ResourceType.Image), (err, image) => { + this._loaded = true; + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); + } else if (image) { + const {HTMLImageElement} = ref_properties.window; + if (image instanceof HTMLImageElement) { + this.image = ref_properties.exported.getImageData(image); + } else { + this.image = image; } - callback(null, result); + this.width = this.image.width; + this.height = this.image.height; + if (newCoordinates) { + this.coordinates = newCoordinates; + } + this._finishLoading(); } }); } - /** - * 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.uid The UID for this tile. - * @private - */ - reloadTile(params , callback ) { - const loaded = this.loaded, - uid = params.uid; - - if (loaded && loaded[uid]) { - return super.reloadTile(params, callback); - } else { - return this.loadTile(params, callback); - } + loaded() { + return this._loaded; } /** - * 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`. + * Updates the image URL and, optionally, the coordinates. To avoid having the image flash after changing, + * set the `raster-fade-duration` paint property on the raster layer to 0. * - * @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. - * @private + * @param {Object} options Options object. + * @param {string} [options.url] Required image URL. + * @param {Array>} [options.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} Returns itself to allow for method chaining. + * @example + * // Add to an image source to the map with some initial URL and coordinates + * map.addSource('image_source_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] + * ] + * }); + * // Then update the image URL and coordinates + * imageSource.updateImage({ + * url: 'https://www.mapbox.com/images/bar.png', + * coordinates: [ + * [-76.5433, 39.1857], + * [-76.5280, 39.1838], + * [-76.5295, 39.1768], + * [-76.5452, 39.1787] + * ] + * }); */ - 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) { - transform.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 given to '${params.source}' is not a valid GeoJSON object.`)); - } - } else { - return callback(new Error(`Input data given to '${params.source}' is not a valid GeoJSON object.`)); + updateImage(options ) { + if (!this.image || !options.url) { + return this; } + this.options.url = options.url; + this.load(options.coordinates, this._loaded); + return this; } - getClusterExpansionZoom(params , callback ) { - try { - callback(null, this._geoJSONIndex.getClusterExpansionZoom(params.clusterId)); - } catch (e) { - callback(e); + _finishLoading() { + if (this.map) { + this.setCoordinates(this.coordinates); + this.fire(new ref_properties.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); } } - getClusterChildren(params , callback ) { - try { - callback(null, this._geoJSONIndex.getChildren(params.clusterId)); - } catch (e) { - callback(e); - } + onAdd(map ) { + this.map = map; + this.load(); } - getClusterLeaves(params , callback ) { - try { - callback(null, this._geoJSONIndex.getLeaves(params.clusterId, params.limit, params.offset)); - } catch (e) { - callback(e); - } + onRemove() { + if (this.texture) this.texture.destroy(); } -} -function getSuperclusterOptions({superclusterOptions, clusterProperties}) { - if (!clusterProperties || !superclusterOptions) return superclusterOptions; + /** + * 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} Returns itself to allow for method chaining. + * @example + * // Add an image source to the map with some initial coordinates + * map.addSource('image_source_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] + * ] + * }); + * // Then update the image coordinates + * imageSource.setCoordinates([ + * [-76.5433, 39.1857], + * [-76.5280, 39.1838], + * [-76.5295, 39.1768], + * [-76.5452, 39.1787] + * ]); + */ + setCoordinates(coordinates ) { + this.coordinates = coordinates; + this._boundsArray = undefined; - const mapExpressions = {}; - const reduceExpressions = {}; - const globals = {accumulated: null, zoom: 0}; - const feature = {properties: null}; - const propertyNames = Object.keys(clusterProperties); + // 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. - for (const key of propertyNames) { - const [operator, mapExpression] = clusterProperties[key]; + // transform the geo coordinates into (zoom 0) tile space coordinates + const cornerCoords = coordinates.map(ref_properties.MercatorCoordinate.fromLngLat); - const mapExpressionParsed = transform.createExpression(mapExpression); - const reduceExpressionParsed = transform.createExpression( - typeof operator === 'string' ? [operator, ['accumulated'], ['get', key]] : operator); + // Compute the coordinates of the tile we'll use to hold this image's + // render data + this.tileID = getCoordinatesCenterTileID(cornerCoords); - transform.assert_1(mapExpressionParsed.result === 'success'); - transform.assert_1(reduceExpressionParsed.result === 'success'); + // 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 = this.tileID.z; - mapExpressions[key] = mapExpressionParsed.value; - reduceExpressions[key] = reduceExpressionParsed.value; + this.fire(new ref_properties.Event('data', {dataType:'source', sourceDataType: 'content'})); + return this; } - superclusterOptions.map = (pointProperties) => { - feature.properties = pointProperties; - const properties = {}; - for (const key of propertyNames) { - properties[key] = mapExpressions[key].evaluate(globals, feature); - } - return properties; - }; - superclusterOptions.reduce = (accumulated, clusterProperties) => { - feature.properties = clusterProperties; - for (const key of propertyNames) { - globals.accumulated = accumulated[key]; - accumulated[key] = reduceExpressions[key].evaluate(globals, feature); - } - }; - - return superclusterOptions; -} + _clear() { + this._boundsArray = undefined; + } -// + _prepareData(context ) { + for (const w in this.tiles) { + const tile = this.tiles[w]; + if (tile.state !== 'loaded') { + tile.state = 'loaded'; + tile.texture = this.texture; + } + } - - - - - - - - + if (this._boundsArray) return; - - - - - + const tileTr = ref_properties.tileTransform(this.tileID, this.map.transform.projection); -/** - * @private - */ -class Worker { - - - - - - - - - - - - + // Transform the corner coordinates into the coordinate space of our tile. + const [tl, tr, br, bl] = this.coordinates.map((coord) => { + const projectedCoord = tileTr.projection.project(coord[0], coord[1]); + return ref_properties.getTilePoint(tileTr, projectedCoord)._round(); + }); - constructor(self ) { - transform.PerformanceUtils.measure('workerEvaluateScript'); - this.self = self; - this.actor = new transform.Actor(self, this); + this.perspectiveTransform = getPerspectiveTransform( + this.width, this.height, tl.x, tl.y, tr.x, tr.y, bl.x, bl.y, br.x, br.y); - this.layerIndexes = {}; - this.availableImages = {}; - this.isSpriteLoaded = {}; + const boundsArray = this._boundsArray = new ref_properties.StructArrayLayout4i8(); + boundsArray.emplaceBack(tl.x, tl.y, 0, 0); + boundsArray.emplaceBack(tr.x, tr.y, ref_properties.EXTENT, 0); + boundsArray.emplaceBack(bl.x, bl.y, 0, ref_properties.EXTENT); + boundsArray.emplaceBack(br.x, br.y, ref_properties.EXTENT, ref_properties.EXTENT); - this.projections = {}; - this.defaultProjection = transform.getProjection({name: 'mercator'}); + if (this.boundsBuffer) { + this.boundsBuffer.destroy(); + } + this.boundsBuffer = context.createVertexBuffer(boundsArray, ref_properties.boundsAttributes.members); + this.boundsSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 2); + } - this.workerSourceTypes = { - vector: transform.VectorTileWorkerSource, - geojson: GeoJSONWorkerSource - }; + prepare() { + if (Object.keys(this.tiles).length === 0 || !this.image) return; - // [mapId][sourceType][sourceName] => worker source instance - this.workerSources = {}; - this.demWorkerSources = {}; + const context = this.map.painter.context; + const gl = context.gl; - this.self.registerWorkerSource = (name , WorkerSource ) => { - if (this.workerSourceTypes[name]) { - throw new Error(`Worker source with name "${name}" already registered.`); - } - this.workerSourceTypes[name] = WorkerSource; - }; + if (!this.texture) { + this.texture = new ref_properties.Texture(context, this.image, gl.RGBA); + this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + } else { + this.texture.update(this.image); + } - // This is invoked by the RTL text plugin when the download via the `importScripts` call has finished, and the code has been parsed. - this.self.registerRTLTextPlugin = (rtlTextPlugin ) => { - if (transform.plugin.isParsed()) { - throw new Error('RTL text plugin already registered.'); - } - transform.plugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping; - transform.plugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText; - transform.plugin['processStyledBidirectionalText'] = rtlTextPlugin.processStyledBidirectionalText; - }; + this._prepareData(context); } - clearCaches(mapId , unused , callback ) { - delete this.layerIndexes[mapId]; - delete this.availableImages[mapId]; - delete this.workerSources[mapId]; - delete this.demWorkerSources[mapId]; - callback(); + 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); + } } - checkIfReady(mapID , unused , callback ) { - // noop, used to check if a worker is fully set up and ready to receive messages - callback(); + serialize() { + return { + type: 'image', + url: this.options.url, + coordinates: this.coordinates + }; } - setReferrer(mapID , referrer ) { - this.referrer = referrer; + hasTransition() { + return false; } +} - spriteLoaded(mapId , bool ) { - this.isSpriteLoaded[mapId] = bool; - for (const workerSource in this.workerSources[mapId]) { - const ws = this.workerSources[mapId][workerSource]; - for (const source in ws) { - if (ws[source] instanceof transform.VectorTileWorkerSource) { - ws[source].isSpriteLoaded = bool; - ws[source].fire(new transform.Event('isSpriteLoaded')); - } - } - } - } +/** + * Given a list of coordinates, get their center as a coordinate. + * + * @returns centerpoint + * @private + */ +function getCoordinatesCenterTileID(coords ) { + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; - setImages(mapId , images , callback ) { - this.availableImages[mapId] = images; - for (const workerSource in this.workerSources[mapId]) { - const ws = this.workerSources[mapId][workerSource]; - for (const source in ws) { - ws[source].availableImages = images; - } - } - callback(); + for (const coord of coords) { + minX = Math.min(minX, coord.x); + minY = Math.min(minY, coord.y); + maxX = Math.max(maxX, coord.x); + maxY = Math.max(maxY, coord.y); } - enableTerrain(mapId , enable , callback ) { - this.terrain = enable; - callback(); - } + const dx = maxX - minX; + const dy = maxY - minY; + const dMax = Math.max(dx, dy); + const zoom = Math.max(0, Math.floor(-Math.log(dMax) / Math.LN2)); + const tilesAtZoom = Math.pow(2, zoom); - setProjection(mapId , config ) { - this.projections[mapId] = transform.getProjection(config); - } + return new ref_properties.CanonicalTileID( + zoom, + Math.floor((minX + maxX) / 2 * tilesAtZoom), + Math.floor((minY + maxY) / 2 * tilesAtZoom)); +} - setLayers(mapId , layers , callback ) { - this.getLayerIndex(mapId).replace(layers); - callback(); - } +// - updateLayers(mapId , params , callback ) { - this.getLayerIndex(mapId).update(params.layers, params.removedIds); - callback(); - } + + + + - loadTile(mapId , params , callback ) { - transform.assert_1(params.type); - const p = this.enableTerrain ? transform.extend({enableTerrain: this.terrain}, params) : params; - p.projection = this.projections[mapId] || this.defaultProjection; - this.getWorkerSource(mapId, params.type, params.source).loadTile(p, callback); - } +/** + * A data source containing video. + * See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-video) for detailed documentation of options. + * + * @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 + * const 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 [Example: Add a video](https://www.mapbox.com/mapbox-gl-js/example/video-on-a-map/) + */ +class VideoSource extends ImageSource { + + + + - loadDEMTile(mapId , params , callback ) { - const p = this.enableTerrain ? transform.extend({buildQuadTree: this.terrain}, params) : params; - this.getDEMWorkerSource(mapId, params.source).loadTile(p, callback); + /** + * @private + */ + constructor(id , options , dispatcher , eventedParent ) { + super(id, options, dispatcher, eventedParent); + this.roundZoom = true; + this.type = 'video'; + this.options = options; } - reloadTile(mapId , params , callback ) { - transform.assert_1(params.type); - const p = this.enableTerrain ? transform.extend({enableTerrain: this.terrain}, params) : params; - p.projection = this.projections[mapId] || this.defaultProjection; - this.getWorkerSource(mapId, params.type, params.source).reloadTile(p, callback); - } + load() { + this._loaded = false; + const options = this.options; - abortTile(mapId , params , callback ) { - transform.assert_1(params.type); - this.getWorkerSource(mapId, params.type, params.source).abortTile(params, callback); - } + this.urls = []; + for (const url of options.urls) { + this.urls.push(this.map._requestManager.transformRequest(url, ref_properties.ResourceType.Source).url); + } - removeTile(mapId , params , callback ) { - transform.assert_1(params.type); - this.getWorkerSource(mapId, params.type, params.source).removeTile(params, callback); - } + ref_properties.getVideo(this.urls, (err, video) => { + this._loaded = true; + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); + } else if (video) { + this.video = video; + this.video.loop = true; - removeSource(mapId , params , callback ) { - transform.assert_1(params.type); - transform.assert_1(params.source); + // Prevent the video from taking over the screen in iOS + this.video.setAttribute('playsinline', ''); - if (!this.workerSources[mapId] || - !this.workerSources[mapId][params.type] || - !this.workerSources[mapId][params.type][params.source]) { - return; - } + // Start repainting when video starts playing. hasTransition() will then return + // true to trigger additional frames as long as the videos continues playing. + this.video.addEventListener('playing', () => { + this.map.triggerRepaint(); + }); - const worker = this.workerSources[mapId][params.type][params.source]; - delete this.workerSources[mapId][params.type][params.source]; + if (this.map) { + this.video.play(); + } - if (worker.removeSource !== undefined) { - worker.removeSource(params, callback); - } else { - callback(); + this._finishLoading(); + } + }); + } + + /** + * Pauses the video. + * + * @example + * // Assuming a video source identified by video_source_id was added to the map + * const videoSource = map.getSource('video_source_id'); + * + * // Pauses the video + * videoSource.pause(); + */ + pause() { + if (this.video) { + this.video.pause(); } } /** - * 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 + * Plays the video. + * + * @example + * // Assuming a video source identified by video_source_id was added to the map + * const videoSource = map.getSource('video_source_id'); + * + * // Starts the video + * videoSource.play(); */ - loadWorkerSource(map , params , callback ) { - try { - this.self.importScripts(params.url); - callback(); - } catch (e) { - callback(e.toString()); + play() { + if (this.video) { + this.video.play(); } } - syncRTLPluginState(map , state , callback ) { - try { - transform.plugin.setState(state); - const pluginURL = transform.plugin.getPluginURL(); - if ( - transform.plugin.isLoaded() && - !transform.plugin.isParsed() && - pluginURL != null // Not possible when `isLoaded` is true, but keeps flow happy - ) { - this.self.importScripts(pluginURL); - const complete = transform.plugin.isParsed(); - const error = complete ? undefined : new Error(`RTL Text Plugin failed to import scripts from ${pluginURL}`); - callback(error, complete); - } - } catch (e) { - callback(e.toString()); + /** + * Sets playback to a timestamp, in seconds. + * @private + */ + seek(seconds ) { + if (this.video) { + const seekableRange = this.video.seekable; + if (seconds < seekableRange.start(0) || seconds > seekableRange.end(0)) { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${this.id}`, null, `Playback for this video can be set only between the ${seekableRange.start(0)} and ${seekableRange.end(0)}-second mark.`))); + } else this.video.currentTime = seconds; } } - getAvailableImages(mapId ) { - let availableImages = this.availableImages[mapId]; - - if (!availableImages) { - availableImages = []; - } - - return availableImages; + /** + * Returns the HTML `video` element. + * + * @returns {HTMLVideoElement} The HTML `video` element. + * @example + * // Assuming a video source identified by video_source_id was added to the map + * const videoSource = map.getSource('video_source_id'); + * + * videoSource.getVideo(); // + */ + getVideo() { + return this.video; } - getLayerIndex(mapId ) { - let layerIndexes = this.layerIndexes[mapId]; - if (!layerIndexes) { - layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex(); + onAdd(map ) { + if (this.map) return; + this.map = map; + this.load(); + if (this.video) { + this.video.play(); + this.setCoordinates(this.coordinates); } - return layerIndexes; } - getWorkerSource(mapId , type , source ) { - if (!this.workerSources[mapId]) - this.workerSources[mapId] = {}; - if (!this.workerSources[mapId][type]) - this.workerSources[mapId][type] = {}; + /** + * Sets the video's coordinates and re-renders the map. + * + * @method setCoordinates + * @instance + * @memberof VideoSource + * @returns {VideoSource} Returns itself to allow for method chaining. + * @example + * // Add a video source to the map to map + * map.addSource('video_source_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] + * ] + * }); + * + * // Then update the video source coordinates by new coordinates + * const videoSource = map.getSource('video_source_id'); + * videoSource.setCoordinates([ + * [-76.5433, 39.1857], + * [-76.5280, 39.1838], + * [-76.5295, 39.1768], + * [-76.5452, 39.1787] + * ]); + */ + // setCoordinates inherited from ImageSource - if (!this.workerSources[mapId][type][source]) { - // use a wrapped actor so that we can attach a target mapId param - // to any messages invoked by the WorkerSource - const actor = { - send: (type, data, callback, _, mustQueue, metadata) => { - this.actor.send(type, data, callback, mapId, mustQueue, metadata); - }, - scheduler: this.actor.scheduler - }; - this.workerSources[mapId][type][source] = new (this.workerSourceTypes[type] )((actor ), this.getLayerIndex(mapId), this.getAvailableImages(mapId), this.isSpriteLoaded[mapId]); + prepare() { + if (Object.keys(this.tiles).length === 0 || this.video.readyState < 2) { + return; // not enough data for current position } - return this.workerSources[mapId][type][source]; - } + const context = this.map.painter.context; + const gl = context.gl; - getDEMWorkerSource(mapId , source ) { - if (!this.demWorkerSources[mapId]) - this.demWorkerSources[mapId] = {}; + if (!this.texture) { + this.texture = new ref_properties.Texture(context, this.video, gl.RGBA); + this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + this.width = this.video.videoWidth; + this.height = this.video.videoHeight; - if (!this.demWorkerSources[mapId][source]) { - this.demWorkerSources[mapId][source] = new RasterDEMTileWorkerSource(); + } 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); } - return this.demWorkerSources[mapId][source]; + this._prepareData(context); } - enforceCacheSizeLimit(mapId , limit ) { - transform.enforceCacheSizeLimit(limit); + serialize() { + return { + type: 'video', + urls: this.urls, + coordinates: this.coordinates + }; } - getWorkerPerformanceMetrics(mapId , params , callback ) { - callback(undefined, transform.PerformanceUtils.getWorkerPerformanceMetrics()); + hasTransition() { + return this.video && !this.video.paused; } } -/* global self, WorkerGlobalScope */ -if (typeof WorkerGlobalScope !== 'undefined' && - typeof self !== 'undefined' && - self instanceof WorkerGlobalScope) { - self.worker = new Worker(self); -} - -return Worker; - -}); - -define(['./shared'], function (transform) { 'use strict'; +// -'use strict'; + + + -var supported = isSupported; -var notSupportedReason_1 = notSupportedReason; + + + + + + /** - * 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} + * Options to add a canvas source type to the map. + * + * @typedef {Object} CanvasSourceOptions + * @property {string} type Source type. Must be `"canvas"`. + * @property {string|HTMLCanvasElement} canvas Canvas source from which to read pixels. Can be a string representing the ID of the canvas element, or the `HTMLCanvasElement` itself. + * @property {Array>} coordinates Four geographical coordinates denoting where to place the corners of the canvas, specified in `[longitude, latitude]` pairs. + * @property {boolean} [animate=true] Whether the canvas source is animated. If the canvas is static (pixels do not need to be re-read on every frame), `animate` should be set to `false` to improve performance. */ -function isSupported(options) { - return !notSupportedReason(options); -} - -function notSupportedReason(options) { - if (!isBrowser()) return 'not a browser'; - if (!isArraySupported()) return 'insufficent Array support'; - if (!isFunctionSupported()) return 'insufficient Function support'; - if (!isObjectSupported()) return 'insufficient Object support'; - if (!isJSONSupported()) return 'insufficient JSON support'; - if (!isWorkerSupported()) return 'insufficient worker support'; - if (!isUint8ClampedArraySupported()) return 'insufficient Uint8ClampedArray support'; - if (!isArrayBufferSupported()) return 'insufficient ArrayBuffer support'; - if (!isCanvasGetImageDataSupported()) return 'insufficient Canvas/getImageData support'; - if (!isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat)) return 'insufficient WebGL support'; - if (!isNotIE()) return 'insufficient ECMAScript 6 support'; -} - -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 && 'URL' 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; -} - -// https://github.com/mapbox/mapbox-gl-supported/issues/19 -function isArrayBufferSupported() { - return ArrayBuffer.isView; -} - -// Some browsers or browser extensions block access to canvas data to prevent fingerprinting. -// Mapbox GL uses this API to load sprites and images in general. -function isCanvasGetImageDataSupported() { - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var context = canvas.getContext('2d'); - if (!context) { - return false; - } - var imageData = context.getImageData(0, 0, 1, 1); - return imageData && imageData.width === canvas.width; -} - -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 getWebGLContext(failIfMajorPerformanceCaveat) { - var canvas = document.createElement('canvas'); +/** + * A data source containing the contents of an HTML canvas. See {@link CanvasSourceOptions} for detailed documentation of options. + * + * @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 + * const 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 [Example: Add a canvas source](https://docs.mapbox.com/mapbox-gl-js/example/canvas-source/) + */ +class CanvasSource extends ImageSource { + + + + + + - var attributes = Object.create(isSupported.webGLContextAttributes); - attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat; + /** + * @private + */ + constructor(id , options , dispatcher , eventedParent ) { + super(id, options, dispatcher, eventedParent); - return ( - canvas.getContext('webgl', attributes) || - canvas.getContext('experimental-webgl', attributes) - ); -} + // We build in some validation here, since canvas sources aren't included in the style spec: + if (!options.coordinates) { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${id}`, null, 'missing required property "coordinates"'))); + } else if (!Array.isArray(options.coordinates) || options.coordinates.length !== 4 || + options.coordinates.some(c => !Array.isArray(c) || c.length !== 2 || c.some(l => typeof l !== 'number'))) { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${id}`, null, '"coordinates" property must be an array of 4 longitude/latitude array pairs'))); + } -function isWebGLSupported(failIfMajorPerformanceCaveat) { - var gl = getWebGLContext(failIfMajorPerformanceCaveat); - if (!gl) { - return false; - } + if (options.animate && typeof options.animate !== 'boolean') { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${id}`, null, 'optional "animate" property must be a boolean value'))); + } - // Try compiling a shader and get its compile status. Some browsers like Brave block this API - // to prevent fingerprinting. Unfortunately, this also means that Mapbox GL won't work. - var shader; - try { - shader = gl.createShader(gl.VERTEX_SHADER); - } catch (e) { - // some older browsers throw an exception that `createShader` is not defined - // so handle this separately from the case where browsers block `createShader` - // for security reasons - return false; - } + if (!options.canvas) { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${id}`, null, 'missing required property "canvas"'))); + } else if (typeof options.canvas !== 'string' && !(options.canvas instanceof ref_properties.window.HTMLCanvasElement)) { + this.fire(new ref_properties.ErrorEvent(new ref_properties.ValidationError(`sources.${id}`, null, '"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))); + } - if (!shader || gl.isContextLost()) { - return false; + this.options = options; + this.animate = options.animate !== undefined ? options.animate : true; } - gl.shaderSource(shader, 'void main() {}'); - gl.compileShader(shader); - return gl.getShaderParameter(shader, gl.COMPILE_STATUS) === true; -} - -function isNotIE() { - return !document.documentMode; -} - -var mapboxGlSupported = { - supported: supported, - notSupportedReason: notSupportedReason_1 -}; -// strict + /** + * Enables animation. The image will be copied from the canvas to the map on each frame. + * + * @method play + * @instance + * @memberof CanvasSource + */ -const DOM = {}; + /** + * Disables animation. The map will display a static copy of the canvas image. + * + * @method pause + * @instance + * @memberof CanvasSource + */ -DOM.create = function (tagName , className , container ) { - const el = transform.window.document.createElement(tagName); - if (className !== undefined) el.className = className; - if (container) container.appendChild(el); - return el; -}; + load() { + this._loaded = true; + if (!this.canvas) { + this.canvas = (this.options.canvas instanceof ref_properties.window.HTMLCanvasElement) ? + this.options.canvas : + ref_properties.window.document.getElementById(this.options.canvas); + } + this.width = this.canvas.width; + this.height = this.canvas.height; -DOM.createSVG = function (tagName , attributes , container ) { - const el = transform.window.document.createElementNS('http://www.w3.org/2000/svg', tagName); - for (const name of Object.keys(attributes)) { - el.setAttributeNS(null, name, attributes[name]); - } - if (container) container.appendChild(el); - return el; -}; + if (this._hasInvalidDimensions()) { + this.fire(new ref_properties.ErrorEvent(new Error('Canvas dimensions cannot be less than or equal to zero.'))); + return; + } -const docStyle = transform.window.document && transform.window.document.documentElement.style; -const selectProp = docStyle && docStyle.userSelect !== undefined ? 'userSelect' : 'WebkitUserSelect'; -let userSelect; + this.play = function() { + this._playing = true; + this.map.triggerRepaint(); + }; -DOM.disableDrag = function () { - if (docStyle && selectProp) { - userSelect = docStyle[selectProp]; - docStyle[selectProp] = 'none'; - } -}; + this.pause = function() { + if (this._playing) { + this.prepare(); + this._playing = false; + } + }; -DOM.enableDrag = function () { - if (docStyle && selectProp) { - docStyle[selectProp] = userSelect; + this._finishLoading(); } -}; - -// Suppress the next click, but only if it's immediate. -const suppressClick = function (e) { - e.preventDefault(); - e.stopPropagation(); - transform.window.removeEventListener('click', suppressClick, true); -}; - -DOM.suppressClick = function() { - transform.window.addEventListener('click', suppressClick, true); - transform.window.setTimeout(() => { - transform.window.removeEventListener('click', suppressClick, true); - }, 0); -}; - -DOM.mousePos = function (el , e ) { - const rect = el.getBoundingClientRect(); - return getScaledPoint(el, rect, e); -}; - -DOM.touchPos = function (el , touches ) { - const rect = el.getBoundingClientRect(), - points = []; - for (let i = 0; i < touches.length; i++) { - points.push(getScaledPoint(el, rect, touches[i])); + /** + * Returns the HTML `canvas` element. + * + * @returns {HTMLCanvasElement} The HTML `canvas` element. + * @example + * // Assuming the following canvas is added to your page + * // + * map.addSource('canvas-source', { + * type: 'canvas', + * canvas: 'canvasID', + * coordinates: [ + * [91.4461, 21.5006], + * [100.3541, 21.5006], + * [100.3541, 13.9706], + * [91.4461, 13.9706] + * ] + * }); + * map.getSource('canvas-source').getCanvas(); // + */ + getCanvas() { + return this.canvas; } - return points; -}; -DOM.mouseButton = function (e ) { - transform.assert_1(e.type === 'mousedown' || e.type === 'mouseup'); - if (typeof transform.window.InstallTrigger !== 'undefined' && e.button === 2 && e.ctrlKey && - transform.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 - return 0; + onAdd(map ) { + this.map = map; + this.load(); + if (this.canvas) { + if (this.animate) this.play(); + } } - return e.button; -}; - -function getScaledPoint(el , rect , e ) { - // Until we get support for pointer events (https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent) - // we use this dirty trick which would not work for the case of rotated transforms, but works well for - // the case of simple scaling. - // Note: `el.offsetWidth === rect.width` eliminates the `0/0` case. - const scaling = el.offsetWidth === rect.width ? 1 : el.offsetWidth / rect.width; - return new transform.pointGeometry( - (e.clientX - rect.left) * scaling, - (e.clientY - rect.top) * scaling - ); -} -// + 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} Returns itself to allow for method chaining. + */ -function loadSprite(baseURL , - requestManager , - callback ) { - let json , image, error; - const format = transform.exported.devicePixelRatio > 1 ? '@2x' : ''; + // setCoordinates inherited from ImageSource - let jsonRequest = transform.getJSON(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.json'), transform.ResourceType.SpriteJSON), (err , data ) => { - jsonRequest = null; - if (!error) { - error = err; - json = data; - maybeComplete(); + prepare() { + let resize = false; + if (this.canvas.width !== this.width) { + this.width = this.canvas.width; + resize = true; } - }); - - let imageRequest = transform.getImage(requestManager.transformRequest(requestManager.normalizeSpriteURL(baseURL, format, '.png'), transform.ResourceType.SpriteImage), (err, img) => { - imageRequest = null; - if (!error) { - error = err; - image = img; - maybeComplete(); + if (this.canvas.height !== this.height) { + this.height = this.canvas.height; + resize = true; } - }); - function maybeComplete() { - if (error) { - callback(error); - } else if (json && image) { - const imageData = transform.exported.getImageData(image); - const result = {}; + if (this._hasInvalidDimensions()) return; - for (const id in json) { - const {width, height, x, y, sdf, pixelRatio, stretchX, stretchY, content} = json[id]; - const data = new transform.RGBAImage({width, height}); - transform.RGBAImage.copy(imageData, data, {x, y}, {x: 0, y: 0}, {width, height}); - result[id] = {data, pixelRatio, sdf, stretchX, stretchY, content}; - } + if (Object.keys(this.tiles).length === 0) return; // not enough data for current position - callback(null, result); + const context = this.map.painter.context; + + if (!this.texture) { + this.texture = new ref_properties.Texture(context, this.canvas, context.gl.RGBA, {premultiply: true}); + } else if (resize || this._playing) { + this.texture.update(this.canvas, {premultiply: true}); } + + this._prepareData(context); } - return { - cancel() { - if (jsonRequest) { - jsonRequest.cancel(); - jsonRequest = null; - } - if (imageRequest) { - imageRequest.cancel(); - imageRequest = null; - } + serialize() { + return { + type: 'canvas', + coordinates: this.coordinates + }; + } + + hasTransition() { + return this._playing; + } + + _hasInvalidDimensions() { + for (const x of [this.canvas.width, this.canvas.height]) { + if (isNaN(x) || x <= 0) return true; } - }; + return false; + } } // + + + + - - - - - - - - - - - - - - - - - - - - - - - - -function renderStyleImage(image ) { - const {userImage} = image; - if (userImage && userImage.render) { - const updated = userImage.render(); - if (updated) { - image.data.replace(new Uint8Array(userImage.data.buffer)); - return true; - } - } - return false; +function isRaster(data ) { + return data instanceof ref_properties.window.ImageData || + data instanceof ref_properties.window.ImageBitmap || + data instanceof ref_properties.window.HTMLCanvasElement; } /** - * Interface for dynamically generated style images. This is a specification for + * Interface for custom sources. This is a specification for * implementers to model: it is not an exported method or class. * - * Images implementing this interface can be redrawn for every frame. They can be used to animate - * icons and patterns or make them respond to user input. Style images can implement a - * {@link StyleImageInterface#render} method. The method is called every frame and - * can be used to update the image. - * - * @interface StyleImageInterface - * @property {number} width Width in pixels. - * @property {number} height Height in pixels. - * @property {Uint8Array | Uint8ClampedArray} data Byte array representing the image. To ensure space for all four channels in an RGBA color, size must be width × height × 4. + * Custom sources allow a user to load and modify their own tiles. + * These sources can be added between any regular sources using {@link Map#addSource}. * - * @see [Example: Add an animated icon to the map.](https://docs.mapbox.com/mapbox-gl-js/example/add-image-animated/) + * Custom sources must have a unique `id` and must have the `type` of `"custom"`. + * They must implement `loadTile` and may implement `unloadTile`, `prepareTile`, `onAdd` and `onRemove`. + * They can trigger rendering using {@link Map#triggerRepaint}. * + * @interface CustomSourceInterface + * @property {string} id A unique source id. + * @property {string} type The source's type. Must be `"custom"`. * @example - * const flashingSquare = { - * width: 64, - * height: 64, - * data: new Uint8Array(64 * 64 * 4), - * - * onAdd(map) { - * this.map = map; - * }, - * - * render() { - * // keep repainting while the icon is on the map - * this.map.triggerRepaint(); + * // Custom source implemented as ES6 class + * class CustomSource { + * constructor() { + * this.id = 'custom-source'; + * this.type = 'custom'; + * this.tileSize = 256; + * this.tilesUrl = 'https://stamen-tiles.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.jpg'; + * this.attribution = 'Map tiles by Stamen Design, under CC BY 3.0'; + * } * - * // alternate between black and white based on the time - * const value = Math.round(Date.now() / 1000) % 2 === 0 ? 255 : 0; + * async loadTile(tile, {signal}) { + * const url = this.tilesUrl + * .replace('{z}', String(tile.z)) + * .replace('{x}', String(tile.x)) + * .replace('{y}', String(tile.y)); * - * // check if image needs to be changed - * if (value !== this.previousValue) { - * this.previousValue = value; + * const response = await fetch(url, {signal}); + * const data = await response.arrayBuffer(); * - * const bytesPerPixel = 4; - * for (let x = 0; x < this.width; x++) { - * for (let y = 0; y < this.height; y++) { - * const offset = (y * this.width + x) * bytesPerPixel; - * this.data[offset + 0] = value; - * this.data[offset + 1] = value; - * this.data[offset + 2] = value; - * this.data[offset + 3] = 255; - * } - * } + * const blob = new window.Blob([new Uint8Array(data)], {type: 'image/png'}); + * const imageBitmap = await window.createImageBitmap(blob); * - * // return true to indicate that the image changed - * return true; - * } + * return imageBitmap; * } - * }; + * } * - * map.addImage('flashing_square', flashingSquare); + * map.on('load', () => { + * map.addSource('custom-source', new CustomSource()); + * map.addLayer({ + * id: 'layer', + * type: 'raster', + * source: 'custom-source' + * }); + * }); */ /** - * This method is called once before every frame where the icon will be used. - * The method can optionally update the image's `data` member with a new image. + * Optional method called when the source has been added to the Map with {@link Map#addSource}. + * This gives the source a chance to initialize resources and register event listeners. * - * If the method updates the image it must return `true` to commit the change. - * If the method returns `false` or nothing the image is assumed to not have changed. + * @function + * @memberof CustomSourceInterface + * @instance + * @name onAdd + * @param {Map} map The Map this custom source was just added to. + */ + +/** + * Optional method called when the source has been removed from the Map with {@link Map#removeSource}. + * This gives the source a chance to clean up resources and event listeners. * - * If updates are infrequent it maybe easier to use {@link Map#updateImage} to update - * the image instead of implementing this method. + * @function + * @memberof CustomSourceInterface + * @instance + * @name onRemove + * @param {Map} map The Map this custom source was added to. + */ + +/** + * Optional method called after the tile is unloaded from the map viewport. This + * gives the source a chance to clean up resources and event listeners. * * @function - * @memberof StyleImageInterface + * @memberof CustomSourceInterface * @instance - * @name render - * @return {boolean} `true` if this method updated the image. `false` if the image was not changed. + * @name unloadTile + * @param {{ z: number, x: number, y: number }} tile Tile name to unload in the XYZ scheme format. */ /** - * Optional method called when the layer has been added to the Map with {@link Map#addImage}. + * Optional method called during a render frame to check if there is a tile to render. * * @function - * @memberof StyleImageInterface + * @memberof CustomSourceInterface * @instance - * @name onAdd - * @param {Map} map The Map this custom layer was just added to. + * @name hasTile + * @param {{ z: number, x: number, y: number }} tile Tile name to prepare in the XYZ scheme format. + * @returns {boolean} True if tile exists, otherwise false. */ /** - * Optional method called when the icon is removed from the map with {@link Map#removeImage}. - * This gives the image a chance to clean up resources and event listeners. + * Optional method called during a render frame to allow a source to prepare and modify a tile texture if needed. * * @function - * @memberof StyleImageInterface + * @memberof CustomSourceInterface * @instance - * @name onRemove + * @name prepareTile + * @param {{ z: number, x: number, y: number }} tile Tile name to prepare in the XYZ scheme format. + * @returns {TextureImage} The tile image data as an `HTMLImageElement`, `ImageData`, `ImageBitmap` or object with `width`, `height`, and `data`. */ -// +/** + * Called when the map starts loading tile for the current animation frame. + * + * @function + * @memberof CustomSourceInterface + * @instance + * @name loadTile + * @param {{ z: number, x: number, y: number }} tile Tile name to load in the XYZ scheme format. + * @param {Object} options Options. + * @param {AbortSignal} options.signal A signal object that allows the map to cancel tile loading request. + * @returns {Promise} The tile image data as an `HTMLImageElement`, `ImageData`, `ImageBitmap` or object with `width`, `height`, and `data`. + */ + + + + + + + + + + + + + + + + + - - - - +class CustomSource extends ref_properties.Evented { - - - - + + + + + + + -// 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. -const padding = 1; + + + + -/* - ImageManager does three 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. - 3. Rerenders renderable images once per frame + constructor(id , implementation , dispatcher , eventedParent ) { + super(); + this.id = id; + this.type = 'custom'; + this._dataType = 'raster'; + this._dispatcher = dispatcher; + this._implementation = implementation; + this.setEventedParent(eventedParent); - 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. -*/ -class ImageManager extends transform.Evented { - - - - - + this.scheme = 'xyz'; + this.minzoom = 0; + this.maxzoom = 22; + this.tileSize = 512; - - - - + this._loaded = false; + this.roundZoom = true; - constructor() { - super(); - this.images = {}; - this.updatedImages = {}; - this.callbackDispatchedThisFrame = {}; - this.loaded = false; - this.requestors = []; + if (!this._implementation) { + this.fire(new ref_properties.ErrorEvent(new Error(`Missing implementation for ${this.id} custom source`))); + } - this.patterns = {}; - this.atlasImage = new transform.RGBAImage({width: 1, height: 1}); - this.dirty = true; - } + if (!this._implementation.loadTile) { + this.fire(new ref_properties.ErrorEvent(new Error(`Missing loadTile implementation for ${this.id} custom source`))); + } - isLoaded() { - return this.loaded; + if (this._implementation.bounds) { + this.tileBounds = new TileBounds(this._implementation.bounds, this.minzoom, this.maxzoom); + } + + // $FlowFixMe[prop-missing] + implementation.update = this._update.bind(this); + + // $FlowFixMe[prop-missing] + implementation.coveringTiles = this._coveringTiles.bind(this); + + ref_properties.extend(this, ref_properties.pick(implementation, ['dataType', 'scheme', 'minzoom', 'maxzoom', 'tileSize', 'attribution', 'minTileCacheSize', 'maxTileCacheSize'])); } - setLoaded(loaded ) { - if (this.loaded === loaded) { - return; - } + serialize() { + return ref_properties.pick(this, ['type', 'scheme', 'minzoom', 'maxzoom', 'tileSize', 'attribution']); + } - this.loaded = loaded; + load() { + this._loaded = true; + this.fire(new ref_properties.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); + this.fire(new ref_properties.Event('data', {dataType: 'source', sourceDataType: 'content'})); + } - if (loaded) { - for (const {ids, callback} of this.requestors) { - this._notify(ids, callback); - } - this.requestors = []; - } + loaded() { + return this._loaded; } - getImage(id ) { - return this.images[id]; + onAdd(map ) { + this._map = map; + this._loaded = false; + this.fire(new ref_properties.Event('dataloading', {dataType: 'source'})); + if (this._implementation.onAdd) this._implementation.onAdd(map); + this.load(); } - addImage(id , image ) { - transform.assert_1(!this.images[id]); - if (this._validate(id, image)) { - this.images[id] = image; + onRemove(map ) { + if (this._implementation.onRemove) { + this._implementation.onRemove(map); } } - _validate(id , image ) { - let valid = true; - if (!this._validateStretch(image.stretchX, image.data && image.data.width)) { - this.fire(new transform.ErrorEvent(new Error(`Image "${id}" has invalid "stretchX" value`))); - valid = false; - } - if (!this._validateStretch(image.stretchY, image.data && image.data.height)) { - this.fire(new transform.ErrorEvent(new Error(`Image "${id}" has invalid "stretchY" value`))); - valid = false; - } - if (!this._validateContent(image.content, image)) { - this.fire(new transform.ErrorEvent(new Error(`Image "${id}" has invalid "content" value`))); - valid = false; + hasTile(tileID ) { + if (this._implementation.hasTile) { + const {x, y, z} = tileID.canonical; + return this._implementation.hasTile({x, y, z}); } - return valid; + + return !this.tileBounds || this.tileBounds.contains(tileID.canonical); } - _validateStretch(stretch , size ) { - if (!stretch) return true; - let last = 0; - for (const part of stretch) { - if (part[0] < last || part[1] < part[0] || size < part[1]) return false; - last = part[1]; + loadTile(tile , callback ) { + const {x, y, z} = tile.tileID.canonical; + const controller = new ref_properties.window.AbortController(); + const signal = controller.signal; + + const request = this._implementation.loadTile({x, y, z}, {signal}); + if (!request) { + // Create an empty image and set the tile state to `loaded` + // if the implementation didn't return the async tile request + const emptyImage = {width: this.tileSize, height: this.tileSize, data: null}; + this.loadTileData(tile, (emptyImage )); + tile.state = 'loaded'; + return callback(null); + } + + // $FlowFixMe[prop-missing] + request.cancel = () => controller.abort(); + + // $FlowFixMe[prop-missing] + tile.request = request.then(tileLoaded.bind(this)) + .catch(error => { + // silence AbortError + if (error.code === 20) return; + tile.state = 'errored'; + callback(error); + }); + + function tileLoaded(data) { + delete tile.request; + + if (tile.aborted) { + tile.state = 'unloaded'; + return callback(null); + } + + if (!data) { + // Create an empty image and set the tile state to `loaded` + // if the implementation returned no tile data + const emptyImage = {width: this.tileSize, height: this.tileSize, data: null}; + this.loadTileData(tile, (emptyImage )); + tile.state = 'loaded'; + return callback(null); + } + + if (!isRaster(data)) { + tile.state = 'errored'; + return callback(new Error(`Can't infer data type for ${this.id}, only raster data supported at the moment`)); + } + + this.loadTileData(tile, data); + tile.state = 'loaded'; + callback(null); } - return true; } - _validateContent(content , image ) { - if (!content) return true; - if (content.length !== 4) return false; - if (content[0] < 0 || image.data.width < content[0]) return false; - if (content[1] < 0 || image.data.height < content[1]) return false; - if (content[2] < 0 || image.data.width < content[2]) return false; - if (content[3] < 0 || image.data.height < content[3]) return false; - if (content[2] < content[0]) return false; - if (content[3] < content[1]) return false; - return true; + loadTileData(tile , data ) { + // Only raster data supported at the moment + RasterTileSource.loadTileData(tile, (data ), this._map.painter); } - updateImage(id , image ) { - const oldImage = this.images[id]; - transform.assert_1(oldImage); - transform.assert_1(oldImage.data.width === image.data.width); - transform.assert_1(oldImage.data.height === image.data.height); - image.version = oldImage.version + 1; - this.images[id] = image; - this.updatedImages[id] = true; + unloadTileData(tile ) { + // Only raster data supported at the moment + RasterTileSource.unloadTileData(tile, this._map.painter); } - removeImage(id ) { - transform.assert_1(this.images[id]); - const image = this.images[id]; - delete this.images[id]; - delete this.patterns[id]; + prepareTile(tile ) { + if (!this._implementation.prepareTile) return null; - if (image.userImage && image.userImage.onRemove) { - image.userImage.onRemove(); - } - } + const {x, y, z} = tile.tileID.canonical; + const data = this._implementation.prepareTile({x, y, z}); + if (!data) return null; - listImages() { - return Object.keys(this.images); + this.loadTileData(tile, data); + tile.state = 'loaded'; + return data; } - getImages(ids , callback ) { - // If the sprite has been loaded, or if all the icon dependencies are already present - // (i.e. if they've been added 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. - let hasAllDependencies = true; - if (!this.isLoaded()) { - for (const id of ids) { - if (!this.images[id]) { - hasAllDependencies = false; - } - } + unloadTile(tile , callback ) { + this.unloadTileData(tile); + if (this._implementation.unloadTile) { + const {x, y, z} = tile.tileID.canonical; + this._implementation.unloadTile({x, y, z}); } - if (this.isLoaded() || hasAllDependencies) { - this._notify(ids, callback); - } else { - this.requestors.push({ids, callback}); + + callback(); + } + + abortTile(tile , callback ) { + if (tile.request && tile.request.cancel) { + tile.request.cancel(); + delete tile.request; } + + callback(); } - _notify(ids , callback ) { - const response = {}; + hasTransition() { + return false; + } - for (const id of ids) { - if (!this.images[id]) { - this.fire(new transform.Event('styleimagemissing', {id})); - } - const image = this.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, - version: image.version, - stretchX: image.stretchX, - stretchY: image.stretchY, - content: image.content, - hasRenderCallback: Boolean(image.userImage && image.userImage.render) - }; - } else { - transform.warnOnce(`Image "${id}" could not be loaded. Please make sure you have added the image with map.addImage() or a "sprite" property in your style. You can provide missing images by listening for the "styleimagemissing" map event.`); - } - } + _coveringTiles() { + const tileIDs = this._map.transform.coveringTiles({ + tileSize: this.tileSize, + minzoom: this.minzoom, + maxzoom: this.maxzoom, + roundZoom: this.roundZoom + }); - callback(null, response); + return tileIDs.map(tileID => ({x: tileID.canonical.x, y: tileID.canonical.y, z: tileID.canonical.z})); } - // Pattern stuff + _update() { + this.fire(new ref_properties.Event('data', {dataType: 'source', sourceDataType: 'content'})); + } +} - getPixelSize() { - const {width, height} = this.atlasImage; - return {width, height}; +// + + + +const sourceTypes = { + vector: VectorTileSource, + raster: RasterTileSource, + 'raster-dem': RasterDEMTileSource, + geojson: GeoJSONSource, + video: VideoSource, + image: ImageSource, + canvas: CanvasSource, + custom: CustomSource +}; + +/* + * 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} + */ +const create = function(id , specification , dispatcher , eventedParent ) { + const 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}`); } - getPattern(id ) { - const pattern = this.patterns[id]; + ref_properties.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source); + return source; +}; - const image = this.getImage(id); - if (!image) { - return null; - } +const getType = function (name ) { + return sourceTypes[name]; +}; - if (pattern && pattern.position.version === image.version) { - return pattern.position; - } +const setType = function (name , type ) { + sourceTypes[name] = type; +}; - if (!pattern) { - const w = image.data.width + padding * 2; - const h = image.data.height + padding * 2; - const bin = {w, h, x: 0, y: 0}; - const position = new transform.ImagePosition(bin, image); - this.patterns[id] = {bin, position}; - } else { - pattern.position.version = image.version; - } +// - this._updatePatternAtlas(); + + + - return this.patterns[id].position; - } + + + + - bind(context ) { - const gl = context.gl; - if (!this.atlasTexture) { - this.atlasTexture = new transform.Texture(context, this.atlasImage, gl.RGBA); - } else if (this.dirty) { - this.atlasTexture.update(this.atlasImage); - this.dirty = false; - } +/* + * Returns a matrix that can be used to convert from tile coordinates to viewport pixel coordinates. + */ +function getPixelPosMatrix(transform, tileID) { + const t = ref_properties.identity([]); + ref_properties.scale$1(t, t, [transform.width * 0.5, -transform.height * 0.5, 1]); + ref_properties.translate(t, t, [1, -1, 0]); + ref_properties.multiply(t, t, transform.calculateProjMatrix(tileID.toUnwrapped())); + return Float32Array.from(t); +} - this.atlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); +function queryRenderedFeatures(sourceCache , + styleLayers , + serializedLayers , + queryGeometry , + params , + transform , + use3DQuery , + visualizeQueryGeometry = false) { + const tileResults = sourceCache.tilesIn(queryGeometry, use3DQuery, visualizeQueryGeometry); + tileResults.sort(sortTilesIn); + const renderedFeatureLayers = []; + for (const tileResult of tileResults) { + renderedFeatureLayers.push({ + wrappedTileID: tileResult.tile.tileID.wrapped().key, + queryResults: tileResult.tile.queryRenderedFeatures( + styleLayers, + serializedLayers, + sourceCache._state, + tileResult, + params, + transform, + getPixelPosMatrix(sourceCache.transform, tileResult.tile.tileID), + visualizeQueryGeometry) + }); } - _updatePatternAtlas() { - const bins = []; - for (const id in this.patterns) { - bins.push(this.patterns[id].bin); - } + const result = mergeRenderedFeatureLayers(renderedFeatureLayers); - const {w, h} = transform.potpack(bins); + // Merge state from SourceCache into the results + for (const layerID in result) { + result[layerID].forEach((featureWrapper) => { + const feature = featureWrapper.feature; + const layer = feature.layer; - const dst = this.atlasImage; - dst.resize({width: w || 1, height: h || 1}); + if (!layer || layer.type === 'background' || layer.type === 'sky') return; - for (const id in this.patterns) { - const {bin} = this.patterns[id]; - const x = bin.x + padding; - const y = bin.y + padding; - const src = this.images[id].data; - const w = src.width; - const h = src.height; + feature.source = layer.source; + if (layer['source-layer']) { + feature.sourceLayer = layer['source-layer']; + } + feature.state = feature.id !== undefined ? sourceCache.getFeatureState(layer['source-layer'], feature.id) : {}; + }); + } + return result; +} - transform.RGBAImage.copy(src, dst, {x: 0, y: 0}, {x, y}, {width: w, height: h}); +function queryRenderedSymbols(styleLayers , + serializedLayers , + getLayerSourceCache , + queryGeometry , + params , + collisionIndex , + retainedQueryData ) { + const result = {}; + const renderedSymbols = collisionIndex.queryRenderedSymbols(queryGeometry); + const bucketQueryData = []; + for (const bucketInstanceId of Object.keys(renderedSymbols).map(Number)) { + bucketQueryData.push(retainedQueryData[bucketInstanceId]); + } + bucketQueryData.sort(sortTilesIn); - // Add 1 pixel wrapped padding on each side of the image. - transform.RGBAImage.copy(src, dst, {x: 0, y: h - 1}, {x, y: y - 1}, {width: w, height: 1}); // T - transform.RGBAImage.copy(src, dst, {x: 0, y: 0}, {x, y: y + h}, {width: w, height: 1}); // B - transform.RGBAImage.copy(src, dst, {x: w - 1, y: 0}, {x: x - 1, y}, {width: 1, height: h}); // L - transform.RGBAImage.copy(src, dst, {x: 0, y: 0}, {x: x + w, y}, {width: 1, height: h}); // R - } + for (const queryData of bucketQueryData) { + const bucketSymbols = queryData.featureIndex.lookupSymbolFeatures( + renderedSymbols[queryData.bucketInstanceId], + serializedLayers, + queryData.bucketIndex, + queryData.sourceLayerIndex, + params.filter, + params.layers, + params.availableImages, + styleLayers); - this.dirty = true; + for (const layerID in bucketSymbols) { + const resultFeatures = result[layerID] = result[layerID] || []; + const layerSymbols = bucketSymbols[layerID]; + layerSymbols.sort((a, b) => { + // Match topDownFeatureComparator from FeatureIndex, but using + // most recent sorting of features from bucket.sortFeatures + const featureSortOrder = queryData.featureSortOrder; + if (featureSortOrder) { + // queryRenderedSymbols documentation says we'll return features in + // "top-to-bottom" rendering order (aka last-to-first). + // Actually there can be multiple symbol instances per feature, so + // we sort each feature based on the first matching symbol instance. + const sortedA = featureSortOrder.indexOf(a.featureIndex); + const sortedB = featureSortOrder.indexOf(b.featureIndex); + ref_properties.assert_1(sortedA >= 0); + ref_properties.assert_1(sortedB >= 0); + return sortedB - sortedA; + } else { + // Bucket hasn't been re-sorted based on angle, so use the + // reverse of the order the features appeared in the data. + return b.featureIndex - a.featureIndex; + } + }); + for (const symbolFeature of layerSymbols) { + resultFeatures.push(symbolFeature); + } + } } - beginFrame() { - this.callbackDispatchedThisFrame = {}; + // Merge state from SourceCache into the results + for (const layerName in result) { + result[layerName].forEach((featureWrapper) => { + const feature = featureWrapper.feature; + const layer = styleLayers[layerName]; + const sourceCache = getLayerSourceCache(layer); + const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id); + feature.source = feature.layer.source; + if (feature.layer['source-layer']) { + feature.sourceLayer = feature.layer['source-layer']; + } + feature.state = state; + }); } + return result; +} - dispatchRenderCallbacks(ids ) { - for (const id of ids) { +function querySourceFeatures(sourceCache , params ) { + const tiles = sourceCache.getRenderableIds().map((id) => { + return sourceCache.getTileByID(id); + }); - // the callback for the image was already dispatched for a different frame - if (this.callbackDispatchedThisFrame[id]) continue; - this.callbackDispatchedThisFrame[id] = true; + const result = []; - const image = this.images[id]; - transform.assert_1(image); + const dataTiles = {}; + for (let i = 0; i < tiles.length; i++) { + const tile = tiles[i]; + const dataID = tile.tileID.canonical.key; + if (!dataTiles[dataID]) { + dataTiles[dataID] = true; + tile.querySourceFeatures(result, params); + } + } - const updated = renderStyleImage(image); - if (updated) { - this.updateImage(id, image); + return result; +} + +function sortTilesIn(a, b) { + const idA = a.tileID; + const 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 + const result = {}; + const wrappedIDLayerMap = {}; + for (const tile of tiles) { + const queryResults = tile.queryResults; + const wrappedID = tile.wrappedTileID; + const wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {}; + for (const layerID in queryResults) { + const tileFeatures = queryResults[layerID]; + const wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {}; + const resultFeatures = result[layerID] = result[layerID] || []; + for (const tileFeature of tileFeatures) { + if (!wrappedIDFeatures[tileFeature.featureIndex]) { + wrappedIDFeatures[tileFeature.featureIndex] = true; + resultFeatures.push(tileFeature); + } } } } + return result; } // - - - - - - - - + - +function WebWorker () { + return (mapboxgl.workerClass != null) ? new mapboxgl.workerClass() : (new ref_properties.window.Worker(mapboxgl.workerUrl) ); // eslint-disable-line new-cap +} - - - - - - - +// + + +const PRELOAD_POOL_ID = 'mapboxgl_preloaded_worker_pool'; /** - * Converts spherical coordinates to cartesian LightPosition coordinates. - * + * Constructs a worker pool. * @private - * @param spherical Spherical coordinates, in [radial, azimuthal, polar] - * @return LightPosition cartesian coordinates */ -function sphericalToCartesian([r, azimuthal, polar] ) { - // We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (π/2): - // correct for that here - const a = transform.degToRad(azimuthal + 90), p = transform.degToRad(polar); - - return { - x: r * Math.cos(a) * Math.sin(p), - y: r * Math.sin(a) * Math.sin(p), - z: r * Math.cos(p), - azimuthal, polar - }; -} +class WorkerPool { + -class LightPositionProperty { - + + constructor() { - this.specification = transform.spec.light.position; + this.active = {}; } - possiblyEvaluate(value , parameters ) { - return sphericalToCartesian(value.expression.evaluate(parameters)); - } + acquire(mapId ) { + if (!this.workers) { + // Lazily look up the value of mapboxgl.workerCount so that + // client code has had a chance to set it. + this.workers = []; + while (this.workers.length < WorkerPool.workerCount) { + this.workers.push(new WebWorker()); + } + } - interpolate(a , b , t ) { - return { - x: transform.number(a.x, b.x, t), - y: transform.number(a.y, b.y, t), - z: transform.number(a.z, b.z, t), - azimuthal: transform.number(a.azimuthal, b.azimuthal, t), - polar: transform.number(a.polar, b.polar, t), - }; + this.active[mapId] = true; + return this.workers.slice(); } -} - - - - - - - - -const properties = new transform.Properties({ - "anchor": new transform.DataConstantProperty(transform.spec.light.anchor), - "position": new LightPositionProperty(), - "color": new transform.DataConstantProperty(transform.spec.light.color), - "intensity": new transform.DataConstantProperty(transform.spec.light.intensity), -}); -const TRANSITION_SUFFIX = '-transition'; - -/* - * Represents the light used to light extruded features. - */ -class Light extends transform.Evented { - - - + release(mapId ) { + delete this.active[mapId]; + if (this.numActive() === 0) { + this.workers.forEach((w) => { + w.terminate(); + }); + this.workers = (null ); + } + } - constructor(lightOptions ) { - super(); - this._transitionable = new transform.Transitionable(properties); - this.setLight(lightOptions); - this._transitioning = this._transitionable.untransitioned(); + isPreloaded() { + return !!this.active[PRELOAD_POOL_ID]; } - getLight() { - return this._transitionable.serialize(); + numActive() { + return Object.keys(this.active).length; } +} - setLight(light , options = {}) { - if (this._validate(transform.validateLight, light, options)) { - return; - } +// extensive benchmarking showed 2 to be the best default for both desktop and mobile devices; +// we can't rely on hardwareConcurrency because of wild inconsistency of reported numbers between browsers +WorkerPool.workerCount = 2; - for (const name in light) { - const value = light[name]; - if (transform.endsWith(name, TRANSITION_SUFFIX)) { - this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX.length), value); - } else { - this._transitionable.setValue(name, value); - } - } - } +// - updateTransitions(parameters ) { - this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); - } +let globalWorkerPool; - hasTransition() { - return this._transitioning.hasTransition(); +/** + * Creates (if necessary) and returns the single, global WorkerPool instance + * to be shared across each Map + * @private + */ +function getGlobalWorkerPool () { + if (!globalWorkerPool) { + globalWorkerPool = new WorkerPool(); } + return globalWorkerPool; +} - recalculate(parameters ) { - this.properties = this._transitioning.possiblyEvaluate(parameters); - } +function prewarm() { + const workerPool = getGlobalWorkerPool(); + workerPool.acquire(PRELOAD_POOL_ID); +} - _validate(validate , value , options ) { - if (options && options.validate === false) { - return false; +function clearPrewarmedResources() { + const pool = globalWorkerPool; + if (pool) { + // Remove the pool only if all maps that referenced the preloaded global worker pool have been removed. + if (pool.isPreloaded() && pool.numActive() === 1) { + pool.release(PRELOAD_POOL_ID); + globalWorkerPool = null; + } else { + console.warn('Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()'); } - - return transform.emitValidationErrors(this, validate.call(transform.validateStyle, transform.extend({ - value, - // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 - style: {glyphs: true, sprite: true}, - styleSpec: transform.spec - }))); } } // - - - - - - - - + -const DrapeRenderMode = { - deferred: 0, - elevated: 1 -}; +function deref(layer , parent ) { + const result = {}; -const properties$1 = new transform.Properties({ - "source": new transform.DataConstantProperty(transform.spec.terrain.source), - "exaggeration": new transform.DataConstantProperty(transform.spec.terrain.exaggeration), -}); + for (const k in layer) { + if (k !== 'ref') { + result[k] = layer[k]; + } + } -const TRANSITION_SUFFIX$1 = '-transition'; + ref_properties.refProperties.forEach((k) => { + if (k in parent) { + result[k] = (parent )[k]; + } + }); -class Terrain extends transform.Evented { - - - - + return ((result ) ); +} - constructor(terrainOptions , drapeRenderMode ) { - super(); - this._transitionable = new transform.Transitionable(properties$1); - this.set(terrainOptions); - this._transitioning = this._transitionable.untransitioned(); - this.drapeRenderMode = drapeRenderMode; - } +/** + * 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(); - get() { - return this._transitionable.serialize(); + const map = Object.create(null); + for (let i = 0; i < layers.length; i++) { + map[layers[i].id] = layers[i]; } - set(terrain ) { - for (const name in terrain) { - const value = terrain[name]; - if (transform.endsWith(name, TRANSITION_SUFFIX$1)) { - this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX$1.length), value); - } else { - this._transitionable.setValue(name, value); - } + for (let i = 0; i < layers.length; i++) { + if ('ref' in layers[i]) { + layers[i] = deref(layers[i], map[(layers[i] ).ref]); } } - updateTransitions(parameters ) { - this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); - } + return layers; +} - hasTransition() { - return this._transitioning.hasTransition(); - } +// + - recalculate(parameters ) { - this.properties = this._transitioning.possiblyEvaluate(parameters); - } +function emptyStyle() { + return { + version: 8, + layers: [], + sources: {} + }; } // - - - -const FOG_PITCH_START = 45; -const FOG_PITCH_END = 65; -const FOG_SYMBOL_CLIPPING_THRESHOLD = 0.9; + - - - - + + + -// As defined in _prelude_fog.fragment.glsl#fog_opacity -function getFogOpacity(state , pos , pitch , fov ) { - const fogPitchOpacity = transform.smoothstep(FOG_PITCH_START, FOG_PITCH_END, pitch); - const [start, end] = getFovAdjustedFogRange(state, fov); - - // The output of this function must match _prelude_fog.fragment.glsl - // For further details, refer to the implementation in the shader code - const decay = 6; - const depth = transform.length(pos); - const fogRange = (depth - start) / (end - start); - let falloff = 1.0 - Math.min(1, Math.exp(-decay * fogRange)); - - falloff *= falloff * falloff; - falloff = Math.min(1.0, 1.00747 * falloff); +const operations = { - return falloff * fogPitchOpacity * state.alpha; -} + /* + * { command: 'setStyle', args: [stylesheet] } + */ + setStyle: 'setStyle', -function getFovAdjustedFogRange(state , fov ) { - // This function computes a shifted fog range so that the appearance is unchanged - // when the fov changes. We define range=0 starting at the camera position given - // the default fov. We avoid starting the fog range at the camera center so that - // ranges aren't generally negative unless the FOV is modified. - const shift = 0.5 / Math.tan(fov * 0.5); - return [state.range[0] + shift, state.range[1] + shift]; -} + /* + * { command: 'addLayer', args: [layer, 'beforeLayerId'] } + */ + addLayer: 'addLayer', -function getFogOpacityAtTileCoord(state , x , y , z , tileId , transform$1 ) { - const mat = transform$1.calculateFogTileMatrix(tileId); - const pos = [x, y, z]; - transform.transformMat4(pos, pos, mat); + /* + * { command: 'removeLayer', args: ['layerId'] } + */ + removeLayer: 'removeLayer', - return getFogOpacity(state, pos, transform$1.pitch, transform$1._fov); -} + /* + * { command: 'setPaintProperty', args: ['layerId', 'prop', value] } + */ + setPaintProperty: 'setPaintProperty', -function getFogOpacityAtLngLat(state , lngLat , transform$1 ) { - const meters = transform.MercatorCoordinate.fromLngLat(lngLat); - const elevation = transform$1.elevation ? transform$1.elevation.getAtPointOrZero(meters) : 0; - const pos = [meters.x, meters.y, elevation]; - transform.transformMat4(pos, pos, transform$1.mercatorFogMatrix); + /* + * { command: 'setLayoutProperty', args: ['layerId', 'prop', value] } + */ + setLayoutProperty: 'setLayoutProperty', - return getFogOpacity(state, pos, transform$1.pitch, transform$1._fov); -} + /* + * { command: 'setFilter', args: ['layerId', filter] } + */ + setFilter: 'setFilter', -// - - - - - - - + /* + * { command: 'addSource', args: ['sourceId', source] } + */ + addSource: 'addSource', - - - - - + /* + * { command: 'removeSource', args: ['sourceId'] } + */ + removeSource: 'removeSource', -const fogProperties = new transform.Properties({ - "range": new transform.DataConstantProperty(transform.spec.fog.range), - "color": new transform.DataConstantProperty(transform.spec.fog.color), - "horizon-blend": new transform.DataConstantProperty(transform.spec.fog["horizon-blend"]), -}); + /* + * { command: 'setGeoJSONSourceData', args: ['sourceId', data] } + */ + setGeoJSONSourceData: 'setGeoJSONSourceData', -const TRANSITION_SUFFIX$2 = '-transition'; + /* + * { command: 'setLayerZoomRange', args: ['layerId', 0, 22] } + */ + setLayerZoomRange: 'setLayerZoomRange', -class Fog extends transform.Evented { - - - + /* + * { command: 'setLayerProperty', args: ['layerId', 'prop', value] } + */ + setLayerProperty: 'setLayerProperty', - // Alternate projections do not yet support fog. - // Hold on to transform so that we know whether a projection is set. - + /* + * { command: 'setCenter', args: [[lon, lat]] } + */ + setCenter: 'setCenter', - constructor(fogOptions , transform$1 ) { - super(); - this._transitionable = new transform.Transitionable(fogProperties); - this.set(fogOptions); - this._transitioning = this._transitionable.untransitioned(); - this._transform = transform$1; - } + /* + * { command: 'setZoom', args: [zoom] } + */ + setZoom: 'setZoom', - get state() { - return { - range: this.properties.get('range'), - horizonBlend: this.properties.get('horizon-blend'), - alpha: this.properties.get('color').a - }; - } + /* + * { command: 'setBearing', args: [bearing] } + */ + setBearing: 'setBearing', - get() { - return this._transitionable.serialize(); - } + /* + * { command: 'setPitch', args: [pitch] } + */ + setPitch: 'setPitch', - set(fog , options = {}) { - if (this._validate(transform.validateFog, fog, options)) { - return; - } + /* + * { command: 'setSprite', args: ['spriteUrl'] } + */ + setSprite: 'setSprite', - for (const name in fog) { - const value = fog[name]; - if (transform.endsWith(name, TRANSITION_SUFFIX$2)) { - this._transitionable.setTransition(name.slice(0, -TRANSITION_SUFFIX$2.length), value); - } else { - this._transitionable.setValue(name, value); - } - } - } + /* + * { command: 'setGlyphs', args: ['glyphsUrl'] } + */ + setGlyphs: 'setGlyphs', - getOpacity(pitch ) { - if (!this._transform.projection.supportsFog) return 0; + /* + * { command: 'setTransition', args: [transition] } + */ + setTransition: 'setTransition', - const fogColor = (this.properties && this.properties.get('color')) || 1.0; - const pitchFactor = transform.smoothstep(FOG_PITCH_START, FOG_PITCH_END, pitch); - return pitchFactor * fogColor.a; - } + /* + * { command: 'setLighting', args: [lightProperties] } + */ + setLight: 'setLight', - getOpacityAtLatLng(lngLat , transform ) { - if (!this._transform.projection.supportsFog) return 0; + /* + * { command: 'setTerrain', args: [terrainProperties] } + */ + setTerrain: 'setTerrain', - return getFogOpacityAtLngLat(this.state, lngLat, transform); - } + /* + * { command: 'setFog', args: [fogProperties] } + */ + setFog: 'setFog', - getFovAdjustedRange(fov ) { - // We can return any arbitrary range because we expect opacity=0 to clean it up - if (!this._transform.projection.supportsFog) return [0, 1]; + /* + * { command: 'setProjection', args: [projectionProperties] } + */ + setProjection: 'setProjection' +}; - return getFovAdjustedFogRange(this.state, fov); - } +function addSource(sourceId, after, commands) { + commands.push({command: operations.addSource, args: [sourceId, after[sourceId]]}); +} - updateTransitions(parameters ) { - this._transitioning = this._transitionable.transitioned(parameters, this._transitioning); - } +function removeSource(sourceId, commands, sourcesRemoved) { + commands.push({command: operations.removeSource, args: [sourceId]}); + sourcesRemoved[sourceId] = true; +} - hasTransition() { - return this._transitioning.hasTransition(); - } +function updateSource(sourceId, after, commands, sourcesRemoved) { + removeSource(sourceId, commands, sourcesRemoved); + addSource(sourceId, after, commands); +} - recalculate(parameters ) { - this.properties = this._transitioning.possiblyEvaluate(parameters); +function canUpdateGeoJSON(before, after, sourceId) { + let prop; + for (prop in before[sourceId]) { + if (!before[sourceId].hasOwnProperty(prop)) continue; + if (prop !== 'data' && !ref_properties.deepEqual(before[sourceId][prop], after[sourceId][prop])) { + return false; + } } - - _validate(validate , value , options ) { - if (options && options.validate === false) { + for (prop in after[sourceId]) { + if (!after[sourceId].hasOwnProperty(prop)) continue; + if (prop !== 'data' && !ref_properties.deepEqual(before[sourceId][prop], after[sourceId][prop])) { return false; } - - return transform.emitValidationErrors(this, validate.call(transform.validateStyle, transform.extend({ - value, - style: {glyphs: true, sprite: true}, - styleSpec: transform.spec - }))); } + return true; } -// - - - -/** - * Responsible for sending messages from a {@link Source} to an associated - * {@link WorkerSource}. - * - * @private - */ -class Dispatcher { - - - - - +function diffSources(before, after, commands, sourcesRemoved) { + before = before || {}; + after = after || {}; - // exposed to allow stubbing in unit tests - + let sourceId; - constructor(workerPool , parent ) { - this.workerPool = workerPool; - this.actors = []; - this.currentActor = 0; - this.id = transform.uniqueId(); - const workers = this.workerPool.acquire(this.id); - for (let i = 0; i < workers.length; i++) { - const worker = workers[i]; - const actor = new Dispatcher.Actor(worker, parent, this.id); - actor.name = `Worker ${i}`; - this.actors.push(actor); + // look for sources to remove + for (sourceId in before) { + if (!before.hasOwnProperty(sourceId)) continue; + if (!after.hasOwnProperty(sourceId)) { + removeSource(sourceId, commands, sourcesRemoved); } - transform.assert_1(this.actors.length); - - // track whether all workers are instantiated and ready to receive messages; - // used for optimizations on initial map load - this.ready = false; - this.broadcast('checkIfReady', null, () => { this.ready = true; }); } - /** - * Broadcast a message to all Workers. - * @private - */ - broadcast(type , data , cb ) { - transform.assert_1(this.actors.length); - cb = cb || function () {}; - transform.asyncAll(this.actors, (actor, done) => { - actor.send(type, data, done); - }, cb); + // 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 (!ref_properties.deepEqual(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); + } + } } +} - /** - * Acquires an actor to dispatch messages to. The actors are distributed in round-robin fashion. - * @returns {Actor} An actor object backed by a web worker for processing messages. - */ - getActor() { - transform.assert_1(this.actors.length); - this.currentActor = (this.currentActor + 1) % this.actors.length; - return this.actors[this.currentActor]; - } +function diffLayerPropertyChanges(before, after, commands, layerId, klass, command) { + before = before || {}; + after = after || {}; - remove() { - this.actors.forEach((actor) => { actor.remove(); }); - this.actors = []; - this.workerPool.release(this.id); + let prop; + + for (prop in before) { + if (!before.hasOwnProperty(prop)) continue; + if (!ref_properties.deepEqual(before[prop], after[prop])) { + commands.push({command, args: [layerId, prop, after[prop], klass]}); + } + } + for (prop in after) { + if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) continue; + if (!ref_properties.deepEqual(before[prop], after[prop])) { + commands.push({command, args: [layerId, prop, after[prop], klass]}); + } } } -Dispatcher.Actor = transform.Actor; +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 || []; -/** - * A data-class that represents a screenspace query from `Map#queryRenderedFeatures`. - * All the internal geometries and data are intented to be immutable and read-only. - * Its lifetime is only for the duration of the query and fixed state of the map while the query is being processed. - * - * @class QueryGeometry - */ -class QueryGeometry { - - - - - + // order of layers by id + const beforeOrder = before.map(pluckId); + const afterOrder = after.map(pluckId); - - + // index of layer by id + const beforeIndex = before.reduce(indexById, {}); + const afterIndex = after.reduce(indexById, {}); - + // track order of layers as if they have been mutated + const tracker = beforeOrder.slice(); - constructor(screenBounds , cameraPoint , aboveHorizon , transform ) { - this.screenBounds = screenBounds; - this.cameraPoint = cameraPoint; - this._screenRaycastCache = {}; - this._cameraRaycastCache = {}; - this.isAboveHorizon = aboveHorizon; + // layers that have been added do not need to be diffed + const clean = Object.create(null); - this.screenGeometry = this.bufferedScreenGeometry(0); - this.screenGeometryMercator = this.screenGeometry.map((p) => transform.pointCoordinate3D(p)); - this.cameraGeometry = this.bufferedCameraGeometry(0); + let 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++; + } } - /** - * Factory method to help contruct an instance while accounting for current map state. - * - * @static - * @param {(PointLike | [PointLike, PointLike])} geometry The query geometry. - * @param {Transform} transform The current map transform. - * @returns {QueryGeometry} An instance of the QueryGeometry class. - */ - static createFromScreenPoints(geometry , transform$1 ) { - let screenGeometry; - let aboveHorizon; - if (geometry instanceof transform.pointGeometry || typeof geometry[0] === 'number') { - const pt = transform.pointGeometry.convert(geometry); - screenGeometry = [transform.pointGeometry.convert(geometry)]; - aboveHorizon = transform$1.isPointAboveHorizon(pt); + // 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 { - const tl = transform.pointGeometry.convert(geometry[0]); - const br = transform.pointGeometry.convert(geometry[1]); - screenGeometry = [tl, br]; - aboveHorizon = transform.polygonizeBounds(tl, br).every((p) => transform$1.isPointAboveHorizon(p)); + // limit where in tracker we need to look for a match + d++; } - return new QueryGeometry(screenGeometry, transform$1.getCameraPoint(), aboveHorizon, transform$1); + // 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; } - /** - * Returns true if the initial query by the user was a single point. - * - * @returns {boolean} Returns `true` if the initial query geometry was a single point. - */ - isPointQuery() { - return this.screenBounds.length === 1; - } + // update layers + for (i = 0; i < afterOrder.length; i++) { + layerId = afterOrder[i]; + beforeLayer = beforeIndex[layerId]; + afterLayer = afterIndex[layerId]; - /** - * Due to data-driven styling features do not uniform size(eg `circle-radius`) and can be offset differntly - * from their original location(for example with `*-translate`). This means we have to expand our query region for - * each tile to account for variation in these properties. - * Each tile calculates a tile level max padding value (in screenspace pixels) when its parsed, this function - * lets us calculate a buffered version of the screenspace query geometry for each tile. - * - * @param {number} buffer The tile padding in screenspace pixels. - * @returns {Point[]} The buffered query geometry. - */ - bufferedScreenGeometry(buffer ) { - return transform.polygonizeBounds( - this.screenBounds[0], - this.screenBounds.length === 1 ? this.screenBounds[0] : this.screenBounds[1], - buffer - ); - } + // no need to update if previously added (new or moved) + if (clean[layerId] || ref_properties.deepEqual(beforeLayer, afterLayer)) continue; - /** - * When the map is pitched, some of the 3D features that intersect a query will not intersect - * the query at the surface of the earth. Instead the feature may be closer and only intersect - * the query because it extrudes into the air. - * - * This returns a geometry that is a convex polygon that encompasses the query frustum and the point underneath the camera. - * Similar to `bufferedScreenGeometry`, buffering is added to account for variation in paint properties. - * - * Case 1: point underneath camera is exactly behind query volume - * +----------+ - * | | - * | | - * | | - * + + - * X X - * X X - * X X - * X X - * XX. - * - * Case 2: point is behind and to the right - * +----------+ - * | X - * | X - * | XX - * + X - * XXX XX - * XXXX X - * XXX XX - * XX X - * XXX. - * - * Case 3: point is behind and to the left - * +----------+ - * X | - * X | - * XX | - * X + - * X XXXX - * XX XXX - * X XXXX - * X XXXX - * XXX. - * - * @param {number} buffer The tile padding in screenspace pixels. - * @returns {Point[]} The buffered query geometry. - */ - bufferedCameraGeometry(buffer ) { - const min = this.screenBounds[0]; - const max = this.screenBounds.length === 1 ? this.screenBounds[0].add(new transform.pointGeometry(1, 1)) : this.screenBounds[1]; - const cameraPolygon = transform.polygonizeBounds(min, max, 0, false); + // If source, source-layer, or type have changes, then remove the layer + // and add it back 'from scratch'. + if (!ref_properties.deepEqual(beforeLayer.source, afterLayer.source) || !ref_properties.deepEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !ref_properties.deepEqual(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; + } - // Only need to account for point underneath camera if its behind query volume - if (this.cameraPoint.y > max.y) { - //case 1: insert point in the middle - if (this.cameraPoint.x > min.x && this.cameraPoint.x < max.x) { - cameraPolygon.splice(3, 0, this.cameraPoint); - //case 2: replace btm right point - } else if (this.cameraPoint.x >= max.x) { - cameraPolygon[2] = this.cameraPoint; - //case 3: replace btm left point - } else if (this.cameraPoint.x <= min.x) { - cameraPolygon[3] = this.cameraPoint; - } + // 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 (!ref_properties.deepEqual(beforeLayer.filter, afterLayer.filter)) { + commands.push({command: operations.setFilter, args: [layerId, afterLayer.filter]}); + } + if (!ref_properties.deepEqual(beforeLayer.minzoom, afterLayer.minzoom) || !ref_properties.deepEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) { + commands.push({command: operations.setLayerZoomRange, args: [layerId, afterLayer.minzoom, afterLayer.maxzoom]}); } - return transform.bufferConvexPolygon(cameraPolygon, buffer); + // 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 (!ref_properties.deepEqual(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 (!ref_properties.deepEqual(beforeLayer[prop], afterLayer[prop])) { + commands.push({command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]]}); + } + } } +} - /** - * Checks if a tile is contained within this query geometry. - * - * @param {Tile} tile The tile to check. - * @param {Transform} transform The current map transform. - * @param {boolean} use3D A boolean indicating whether to query 3D features. - * @returns {?TilespaceQueryGeometry} Returns `undefined` if the tile does not intersect. - */ - containsTile(tile , transform$1 , use3D ) { - // The buffer around the query geometry is applied in screen-space. - // Floating point errors when projecting into tilespace could leave a feature - // outside the query volume even if it looks like it overlaps visually, a 1px bias value overcomes that. - const bias = 1; - const padding = tile.queryPadding + bias; - const wrap = tile.tileID.wrap; - - const geometryForTileCheck = use3D ? - this._bufferedCameraMercator(padding, transform$1).map((p) => transform.getTilePoint(tile.tileTransform, p, wrap)) : - this._bufferedScreenMercator(padding, transform$1).map((p) => transform.getTilePoint(tile.tileTransform, p, wrap)); - const tilespaceVec3s = this.screenGeometryMercator.map((p) => transform.getTileVec3(tile.tileTransform, p, wrap)); - const tilespaceGeometry = tilespaceVec3s.map((v) => new transform.pointGeometry(v[0], v[1])); +/** + * 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]}]; - const cameraMercator = transform$1.getFreeCameraOptions().position || new transform.MercatorCoordinate(0, 0, 0); - const tilespaceCameraPosition = transform.getTileVec3(tile.tileTransform, cameraMercator, wrap); - const tilespaceRays = tilespaceVec3s.map((tileVec) => { - const dir = transform.sub(tileVec, tileVec, tilespaceCameraPosition); - transform.normalize(dir, dir); - return new transform.Ray(tilespaceCameraPosition, dir); - }); - const pixelToTileUnitsFactor = transform.pixelsToTileUnits(tile, 1, transform$1.zoom); + let commands = []; - if (transform.polygonIntersectsBox(geometryForTileCheck, 0, 0, transform.EXTENT, transform.EXTENT)) { - return { - queryGeometry: this, - tilespaceGeometry, - tilespaceRays, - bufferedTilespaceGeometry: geometryForTileCheck, - bufferedTilespaceBounds: clampBoundsToTileExtents(transform.getBounds(geometryForTileCheck)), - tile, - tileID: tile.tileID, - pixelToTileUnitsFactor - }; + try { + // Handle changes to top-level properties + if (!ref_properties.deepEqual(before.version, after.version)) { + return [{command: operations.setStyle, args: [after]}]; + } + if (!ref_properties.deepEqual(before.center, after.center)) { + commands.push({command: operations.setCenter, args: [after.center]}); + } + if (!ref_properties.deepEqual(before.zoom, after.zoom)) { + commands.push({command: operations.setZoom, args: [after.zoom]}); + } + if (!ref_properties.deepEqual(before.bearing, after.bearing)) { + commands.push({command: operations.setBearing, args: [after.bearing]}); + } + if (!ref_properties.deepEqual(before.pitch, after.pitch)) { + commands.push({command: operations.setPitch, args: [after.pitch]}); + } + if (!ref_properties.deepEqual(before.sprite, after.sprite)) { + commands.push({command: operations.setSprite, args: [after.sprite]}); + } + if (!ref_properties.deepEqual(before.glyphs, after.glyphs)) { + commands.push({command: operations.setGlyphs, args: [after.glyphs]}); + } + if (!ref_properties.deepEqual(before.transition, after.transition)) { + commands.push({command: operations.setTransition, args: [after.transition]}); + } + if (!ref_properties.deepEqual(before.light, after.light)) { + commands.push({command: operations.setLight, args: [after.light]}); + } + if (!ref_properties.deepEqual(before.fog, after.fog)) { + commands.push({command: operations.setFog, args: [after.fog]}); + } + if (!ref_properties.deepEqual(before.projection, after.projection)) { + commands.push({command: operations.setProjection, args: [after.projection]}); } - } - /** - * These methods add caching on top of the terrain raycasting provided by `Transform#pointCoordinate3d`. - * Tiles come with different values of padding, however its very likely that multiple tiles share the same value of padding - * based on the style. In that case we want to reuse the result from a previously computed terrain raycast. - */ + // 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. + const sourcesRemoved = {}; - _bufferedScreenMercator(padding , transform ) { - const key = cacheKey(padding); - if (this._screenRaycastCache[key]) { - return this._screenRaycastCache[key]; - } else { - const poly = this.bufferedScreenGeometry(padding).map((p) => transform.pointCoordinate3D(p)); - this._screenRaycastCache[key] = poly; - return poly; + // First collect the {add,remove}Source commands + const 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 + const beforeLayers = []; + if (before.layers) { + before.layers.forEach((layer) => { + if (layer.source && sourcesRemoved[layer.source]) { + commands.push({command: operations.removeLayer, args: [layer.id]}); + } else { + beforeLayers.push(layer); + } + }); } - } - _bufferedCameraMercator(padding , transform ) { - const key = cacheKey(padding); - if (this._cameraRaycastCache[key]) { - return this._cameraRaycastCache[key]; - } else { - const poly = this.bufferedCameraGeometry(padding).map((p) => transform.pointCoordinate3D(p)); - this._cameraRaycastCache[key] = poly; - return poly; + // Remove the terrain if the source for that terrain is being removed + let beforeTerrain = before.terrain; + if (beforeTerrain) { + if (sourcesRemoved[beforeTerrain.source]) { + commands.push({command: operations.setTerrain, args: [undefined]}); + beforeTerrain = undefined; + } } - } -} -//Padding is in screen pixels and is only used as a coarse check, so 2 decimal places of precision should be good enough for a cache. -function cacheKey(padding ) { - return (padding * 100) | 0; -} + commands = commands.concat(removeOrAddSourceCommands); - - - - - - - - - - + // Even though terrain is a top-level property + // Its like a layer in the sense that it depends on a source being present. + if (!ref_properties.deepEqual(beforeTerrain, after.terrain)) { + commands.push({command: operations.setTerrain, args: [after.terrain]}); + } -function clampBoundsToTileExtents(bounds ) { - bounds.min.x = transform.clamp(bounds.min.x, 0, transform.EXTENT); - bounds.min.y = transform.clamp(bounds.min.y, 0, transform.EXTENT); + // Handle changes to `layers` + diffLayers(beforeLayers, after.layers, commands); - bounds.max.x = transform.clamp(bounds.max.x, 0, transform.EXTENT); - bounds.max.y = transform.clamp(bounds.max.y, 0, transform.EXTENT); - return bounds; + } catch (e) { + // fall back to setStyle + console.warn('Unable to compute style diff:', e); + commands = [{command: operations.setStyle, args: [after]}]; + } + + return commands; } // - - - - +class PathInterpolator { + + + + + -function loadTileJSON(options , requestManager , callback ) { - const loaded = function(err , tileJSON ) { - if (err) { - return callback(err); - } else if (tileJSON) { - const result = transform.pick( - // explicit source options take precedence over TileJSON - transform.extend(tileJSON, options), - ['tiles', 'minzoom', 'maxzoom', 'attribution', 'mapbox_logo', 'bounds', 'scheme', 'tileSize', 'encoding'] - ); + constructor(points_ , padding_ ) { + this.reset(points_, padding_); + } - if (tileJSON.vector_layers) { - result.vectorLayers = tileJSON.vector_layers; - result.vectorLayerIds = result.vectorLayers.map((layer) => { return layer.id; }); - } + reset(points_ , padding_ ) { + this.points = points_ || []; - result.tiles = requestManager.canonicalizeTileset(result, options.url); - callback(null, result); + // Compute cumulative distance from first point to every other point in the segment. + // Last entry in the array is total length of the path + this._distances = [0.0]; + + for (let i = 1; i < this.points.length; i++) { + this._distances[i] = this._distances[i - 1] + this.points[i].dist(this.points[i - 1]); } - }; - if (options.url) { - return transform.getJSON(requestManager.transformRequest(requestManager.normalizeSourceURL(options.url), transform.ResourceType.Source), loaded); - } else { - return transform.exported.frame(() => loaded(null, options)); + this.length = this._distances[this._distances.length - 1]; + this.padding = Math.min(padding_ || 0, this.length * 0.5); + this.paddedLength = this.length - this.padding * 2.0; } -} -// + lerp(t ) { + ref_properties.assert_1(this.points.length > 0); + if (this.points.length === 1) { + return this.points[0]; + } - + t = ref_properties.clamp(t, 0, 1); -class TileBounds { - - - + // Find the correct segment [p0, p1] where p0 <= x < p1 + let currentIndex = 1; + let distOfCurrentIdx = this._distances[currentIndex]; + const distToTarget = t * this.paddedLength + this.padding; - constructor(bounds , minzoom , maxzoom ) { - this.bounds = transform.LngLatBounds.convert(this.validateBounds(bounds)); - this.minzoom = minzoom || 0; - this.maxzoom = maxzoom || 24; - } + while (distOfCurrentIdx < distToTarget && currentIndex < this._distances.length) { + distOfCurrentIdx = this._distances[++currentIndex]; + } - 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])]; - } + // Interpolate between the two points of the segment + const idxOfPrevPoint = currentIndex - 1; + const distOfPrevIdx = this._distances[idxOfPrevPoint]; + const segmentLength = distOfCurrentIdx - distOfPrevIdx; + const segmentT = segmentLength > 0 ? (distToTarget - distOfPrevIdx) / segmentLength : 0; - contains(tileID ) { - const worldSize = Math.pow(2, tileID.z); - const level = { - minX: Math.floor(transform.mercatorXfromLng(this.bounds.getWest()) * worldSize), - minY: Math.floor(transform.mercatorYfromLat(this.bounds.getNorth()) * worldSize), - maxX: Math.ceil(transform.mercatorXfromLng(this.bounds.getEast()) * worldSize), - maxY: Math.ceil(transform.mercatorYfromLat(this.bounds.getSouth()) * worldSize) - }; - const hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY; - return hit; + return this.points[idxOfPrevPoint].mult(1.0 - segmentT).add(this.points[currentIndex].mult(segmentT)); } } // - - - - - - - - - - + + + + + + + /** - * A source containing vector tiles in [Mapbox Vector Tile format](https://docs.mapbox.com/vector-tiles/reference/). - * See the [Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/#vector) for detailed documentation of options. - * - * @example - * map.addSource('some id', { - * type: 'vector', - * url: 'mapbox://mapbox.mapbox-streets-v8' - * }); - * - * @example - * map.addSource('some id', { - * type: 'vector', - * tiles: ['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt'], - * minzoom: 6, - * maxzoom: 14 - * }); - * - * @example - * map.getSource('some id').setUrl("mapbox://mapbox.mapbox-streets-v8"); + * 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. * - * @example - * map.getSource('some id').setTiles(['https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt']); - * @see [Example: Add a vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/vector-source/) - * @see [Example: Add a third party vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/third-party/) + * @private */ -class VectorTileSource extends transform.Evented { - - - - - - - - - - - - - - - +class GridIndex { - + + + + - - - - - - constructor(id , options , dispatcher , eventedParent ) { - super(); - 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; - this._loaded = false; + + + + + + + + - transform.extend(this, transform.pick(options, ['url', 'scheme', 'tileSize', 'promoteId'])); - this._options = transform.extend({type: 'vector'}, options); + constructor (width , height , cellSize ) { + const boxCells = this.boxCells = []; + const circleCells = this.circleCells = []; - this._collectResourceTiming = options.collectResourceTiming; + // 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); - if (this.tileSize !== 512) { - throw new Error('vector tile sources must have a tileSize of 512'); + for (let i = 0; i < this.xCellCount * this.yCellCount; i++) { + boxCells.push([]); + circleCells.push([]); } + this.circleKeys = []; + this.boxKeys = []; + this.bboxes = []; + this.circles = []; - this.setEventedParent(eventedParent); - - this._tileWorkers = {}; - this._deduped = new transform.DedupedRequest(); + this.width = width; + this.height = height; + this.xScale = this.xCellCount / width; + this.yScale = this.yCellCount / height; + this.boxUid = 0; + this.circleUid = 0; } - load() { - this._loaded = false; - this.fire(new transform.Event('dataloading', {dataType: 'source'})); - this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, (err, tileJSON) => { - this._tileJSONRequest = null; - this._loaded = true; - if (err) { - this.fire(new transform.ErrorEvent(err)); - } else if (tileJSON) { - transform.extend(this, tileJSON); - if (tileJSON.bounds) this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom); - transform.postTurnstileEvent(tileJSON.tiles, this.map._requestManager._customAccessToken); + keysLength() { + return this.boxKeys.length + this.circleKeys.length; + } - // `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.fire(new transform.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); - this.fire(new transform.Event('data', {dataType: 'source', sourceDataType: 'content'})); - } - }); + 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); } - loaded() { - return this._loaded; + 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); } - hasTile(tileID ) { - return !this.tileBounds || this.tileBounds.contains(tileID.canonical); + _insertBoxCell(x1 , y1 , x2 , y2 , cellIndex , uid ) { + this.boxCells[cellIndex].push(uid); } - onAdd(map ) { - this.map = map; - this.load(); + _insertCircleCell(x1 , y1 , x2 , y2 , cellIndex , uid ) { + this.circleCells[cellIndex].push(uid); } - setSourceProperty(callback ) { - if (this._tileJSONRequest) { - this._tileJSONRequest.cancel(); + _query(x1 , y1 , x2 , y2 , hitTest , predicate ) { + if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { + return hitTest ? false : []; } - - callback(); - - const sourceCaches = this.map.style._getSourceCaches(this.id); - for (const sourceCache of sourceCaches) { - sourceCache.clearTiles(); + const result = []; + if (x1 <= 0 && y1 <= 0 && this.width <= x2 && this.height <= y2) { + if (hitTest) { + return true; + } + for (let boxUid = 0; boxUid < this.boxKeys.length; boxUid++) { + result.push({ + key: this.boxKeys[boxUid], + x1: this.bboxes[boxUid * 4], + y1: this.bboxes[boxUid * 4 + 1], + x2: this.bboxes[boxUid * 4 + 2], + y2: this.bboxes[boxUid * 4 + 3] + }); + } + for (let circleUid = 0; circleUid < this.circleKeys.length; circleUid++) { + const x = this.circles[circleUid * 3]; + const y = this.circles[circleUid * 3 + 1]; + const radius = this.circles[circleUid * 3 + 2]; + result.push({ + key: this.circleKeys[circleUid], + x1: x - radius, + y1: y - radius, + x2: x + radius, + y2: y + radius + }); + } + return predicate ? result.filter(predicate) : result; + } else { + const queryArgs = { + hitTest, + seenUids: {box: {}, circle: {}} + }; + this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs, predicate); + return hitTest ? result.length > 0 : result; } - this.load(); } - /** - * Sets the source `tiles` property and re-renders the map. - * - * @param {string[]} tiles An array of one or more tile source URLs, as in the TileJSON spec. - * @returns {VectorTileSource} Returns itself to allow for method chaining. - * @example - * map.addSource('vector_source_id', { - * type: 'vector', - * tiles: ['https://some_end_point.net/{z}/{x}/{y}.mvt'], - * minzoom: 6, - * maxzoom: 14 - * }); - * - * const vectorTileSource = map.getSource('vector_source_id'); - * - * // Set the endpoint associated with a vector tile source. - * vectorTileSource.setTiles(['https://another_end_point.net/{z}/{x}/{y}.mvt']); - */ - setTiles(tiles ) { - this.setSourceProperty(() => { - this._options.tiles = tiles; - }); + _queryCircle(x , y , radius , hitTest , predicate ) { + // 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 + const x1 = x - radius; + const x2 = x + radius; + const y1 = y - radius; + const y2 = y + radius; + if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { + return hitTest ? false : []; + } - return this; + // 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 + const result = []; + const queryArgs = { + hitTest, + circle: {x, y, radius}, + seenUids: {box: {}, circle: {}} + }; + this._forEachCell(x1, y1, x2, y2, this._queryCellCircle, result, queryArgs, predicate); + return hitTest ? result.length > 0 : result; } - /** - * Sets the source `url` property and re-renders the map. - * - * @param {string} url A URL to a TileJSON resource. Supported protocols are `http:`, `https:`, and `mapbox://`. - * @returns {VectorTileSource} Returns itself to allow for method chaining. - * @example - * map.addSource('vector_source_id', { - * type: 'vector', - * url: 'mapbox://mapbox.mapbox-streets-v7' - * }); - * - * const vectorTileSource = map.getSource('vector_source_id'); - * - * // Update vector tile source to a new URL endpoint - * vectorTileSource.setUrl("mapbox://mapbox.mapbox-streets-v8"); - */ - setUrl(url ) { - this.setSourceProperty(() => { - this.url = url; - this._options.url = url; - }); - - return this; + query(x1 , y1 , x2 , y2 , predicate ) { + return (this._query(x1, y1, x2, y2, false, predicate) ); } - onRemove() { - if (this._tileJSONRequest) { - this._tileJSONRequest.cancel(); - this._tileJSONRequest = null; - } + hitTest(x1 , y1 , x2 , y2 , predicate ) { + return (this._query(x1, y1, x2, y2, true, predicate) ); } - serialize() { - return transform.extend({}, this._options); + hitTestCircle(x , y , radius , predicate ) { + return (this._queryCircle(x, y, radius, true, predicate) ); } - loadTile(tile , callback ) { - const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme)); - const request = this.map._requestManager.transformRequest(url, transform.ResourceType.Tile); - - const params = { - request, - data: undefined, - uid: tile.uid, - tileID: tile.tileID, - tileZoom: tile.tileZoom, - zoom: tile.tileID.overscaledZ, - tileSize: this.tileSize * tile.tileID.overscaleFactor(), - type: this.type, - source: this.id, - pixelRatio: transform.exported.devicePixelRatio, - showCollisionBoxes: this.map.showCollisionBoxes, - promoteId: this.promoteId, - isSymbolTile: tile.isSymbolTile - }; - params.request.collectResourceTiming = this._collectResourceTiming; - - if (!tile.actor || tile.state === 'expired') { - tile.actor = this._tileWorkers[url] = this._tileWorkers[url] || this.dispatcher.getActor(); + _queryCell(x1 , y1 , x2 , y2 , cellIndex , result , queryArgs , predicate ) { + const seenUids = queryArgs.seenUids; + const boxCell = this.boxCells[cellIndex]; + if (boxCell !== null) { + const bboxes = this.bboxes; + for (const boxUid of boxCell) { + if (!seenUids.box[boxUid]) { + seenUids.box[boxUid] = true; + const offset = boxUid * 4; + if ((x1 <= bboxes[offset + 2]) && + (y1 <= bboxes[offset + 3]) && + (x2 >= bboxes[offset + 0]) && + (y2 >= bboxes[offset + 1]) && + (!predicate || predicate(this.boxKeys[boxUid]))) { + if (queryArgs.hitTest) { + result.push(true); + return true; + } else { + result.push({ + key: this.boxKeys[boxUid], + x1: bboxes[offset], + y1: bboxes[offset + 1], + x2: bboxes[offset + 2], + y2: bboxes[offset + 3] + }); + } + } + } + } + } + const circleCell = this.circleCells[cellIndex]; + if (circleCell !== null) { + const circles = this.circles; + for (const circleUid of circleCell) { + if (!seenUids.circle[circleUid]) { + seenUids.circle[circleUid] = true; + const offset = circleUid * 3; + if (this._circleAndRectCollide( + circles[offset], + circles[offset + 1], + circles[offset + 2], + x1, + y1, + x2, + y2) && + (!predicate || predicate(this.circleKeys[circleUid]))) { + if (queryArgs.hitTest) { + result.push(true); + return true; + } else { + const x = circles[offset]; + const y = circles[offset + 1]; + const radius = circles[offset + 2]; + result.push({ + key: this.circleKeys[circleUid], + x1: x - radius, + y1: y - radius, + x2: x + radius, + y2: y + radius + }); + } + } + } + } + } + } - // if workers are not ready to receive messages yet, use the idle time to preemptively - // load tiles on the main thread and pass the result instead of requesting a worker to do so - if (!this.dispatcher.ready) { - const cancel = transform.loadVectorTile.call({deduped: this._deduped}, params, (err , data ) => { - if (err || !data) { - done.call(this, err); - } else { - // the worker will skip the network request if the data is already there - params.data = { - cacheControl: data.cacheControl, - expires: data.expires, - rawData: data.rawData.slice(0) - }; - if (tile.actor) tile.actor.send('loadTile', params, done.bind(this), undefined, true); + _queryCellCircle(x1 , y1 , x2 , y2 , cellIndex , result , queryArgs , predicate ) { + const circle = queryArgs.circle; + const seenUids = queryArgs.seenUids; + const boxCell = this.boxCells[cellIndex]; + if (boxCell !== null) { + const bboxes = this.bboxes; + for (const boxUid of boxCell) { + if (!seenUids.box[boxUid]) { + seenUids.box[boxUid] = true; + const offset = boxUid * 4; + if (this._circleAndRectCollide( + circle.x, + circle.y, + circle.radius, + bboxes[offset + 0], + bboxes[offset + 1], + bboxes[offset + 2], + bboxes[offset + 3]) && + (!predicate || predicate(this.boxKeys[boxUid]))) { + result.push(true); + return true; } - }, true); - tile.request = {cancel}; - - } else { - tile.request = tile.actor.send('loadTile', params, done.bind(this), undefined, true); + } } - - } else if (tile.state === 'loading') { - // schedule tile reloading after it has been loaded - tile.reloadCallback = callback; - - } else { - tile.request = tile.actor.send('reloadTile', params, done.bind(this)); } - function done(err, data) { - delete tile.request; - - if (tile.aborted) - return callback(null); - - if (err && err.status !== 404) { - return callback(err); + const circleCell = this.circleCells[cellIndex]; + if (circleCell !== null) { + const circles = this.circles; + for (const circleUid of circleCell) { + if (!seenUids.circle[circleUid]) { + seenUids.circle[circleUid] = true; + const offset = circleUid * 3; + if (this._circlesCollide( + circles[offset], + circles[offset + 1], + circles[offset + 2], + circle.x, + circle.y, + circle.radius) && + (!predicate || predicate(this.circleKeys[circleUid]))) { + result.push(true); + return true; + } + } } + } + } - if (data && data.resourceTiming) - tile.resourceTiming = data.resourceTiming; - - if (this.map._refreshExpiredTiles && data) tile.setExpiryData(data); - tile.loadVectorData(data, this.map.painter); - - transform.cacheEntryPossiblyAdded(this.dispatcher); - - callback(null); + _forEachCell(x1 , y1 , x2 , y2 , fn , arg1 , arg2 , predicate ) { + const cx1 = this._convertToXCellCoord(x1); + const cy1 = this._convertToYCellCoord(y1); + const cx2 = this._convertToXCellCoord(x2); + const cy2 = this._convertToYCellCoord(y2); - if (tile.reloadCallback) { - this.loadTile(tile, tile.reloadCallback); - tile.reloadCallback = null; + for (let x = cx1; x <= cx2; x++) { + for (let y = cy1; y <= cy2; y++) { + const cellIndex = this.xCellCount * y + x; + if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, predicate)) return; } } } - abortTile(tile ) { - if (tile.request) { - tile.request.cancel(); - delete tile.request; - } - if (tile.actor) { - tile.actor.send('abortTile', {uid: tile.uid, type: this.type, source: this.id}); - } + _convertToXCellCoord(x ) { + return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(x * this.xScale))); } - unloadTile(tile ) { - tile.unloadVectorData(); - if (tile.actor) { - tile.actor.send('removeTile', {uid: tile.uid, type: this.type, source: this.id}); - } + _convertToYCellCoord(y ) { + return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(y * this.yScale))); } - hasTransition() { - return false; + _circlesCollide(x1 , y1 , r1 , x2 , y2 , r2 ) { + const dx = x2 - x1; + const dy = y2 - y1; + const bothRadii = r1 + r2; + return (bothRadii * bothRadii) > (dx * dx + dy * dy); } - afterUpdate() { - this._tileWorkers = {}; + _circleAndRectCollide(circleX , circleY , radius , x1 , y1 , x2 , y2 ) { + const halfRectWidth = (x2 - x1) / 2; + const distX = Math.abs(circleX - (x1 + halfRectWidth)); + if (distX > (halfRectWidth + radius)) { + return false; + } + + const halfRectHeight = (y2 - y1) / 2; + const distY = Math.abs(circleY - (y1 + halfRectHeight)); + if (distY > (halfRectHeight + radius)) { + return false; + } + + if (distX <= halfRectWidth || distY <= halfRectHeight) { + return true; + } + + const dx = distX - halfRectWidth; + const dy = distY - halfRectHeight; + return (dx * dx + dy * dy <= (radius * radius)); } } // - - - - - - - - - - - - -class RasterTileSource extends transform.Evented { - - - - + - + + - - - - + + + - - - - - - - - constructor(id , options , dispatcher , eventedParent ) { - super(); - 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; +const FlipState = { + unknown: 0, + flipRequired: 1, + flipNotRequired: 2 +}; - this._options = transform.extend({type: 'raster'}, options); - transform.extend(this, transform.pick(options, ['url', 'scheme', 'tileSize'])); - } +const maxTangent = Math.tan(85 * Math.PI / 180); - load() { - this._loaded = false; - this.fire(new transform.Event('dataloading', {dataType: 'source'})); - this._tileJSONRequest = loadTileJSON(this._options, this.map._requestManager, (err, tileJSON) => { - this._tileJSONRequest = null; - this._loaded = true; - if (err) { - this.fire(new transform.ErrorEvent(err)); - } else if (tileJSON) { - transform.extend(this, tileJSON); - if (tileJSON.bounds) this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom); +/* + * # 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. + */ - transform.postTurnstileEvent(tileJSON.tiles); +/* + * Returns a matrix for converting from tile units to the correct label coordinate space. + * This variation of the function returns a label space matrix specialized for rendering. + * It transforms coordinates as-is to whatever the target space is (either 2D or 3D). + * See also `getLabelPlaneMatrixForPlacement` + */ +function getLabelPlaneMatrixForRendering(posMatrix , + tileID , + pitchWithMap , + rotateWithMap , + transform , + projection , + pixelsToTileUnits ) { + const m = ref_properties.create(); - // `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.fire(new transform.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); - this.fire(new transform.Event('data', {dataType: 'source', sourceDataType: 'content'})); + if (pitchWithMap) { + if (projection.name === 'globe') { + const lm = ref_properties.calculateGlobeLabelMatrix(transform, tileID); + ref_properties.multiply(m, m, lm); + } else { + const s = ref_properties.invert([], pixelsToTileUnits); + m[0] = s[0]; + m[1] = s[1]; + m[4] = s[2]; + m[5] = s[3]; + if (!rotateWithMap) { + ref_properties.rotateZ(m, m, transform.angle); } - }); + } + } else { + ref_properties.multiply(m, transform.labelPlaneMatrix, posMatrix); } - loaded() { - return this._loaded; - } + return m; +} - onAdd(map ) { - this.map = map; - this.load(); +/* + * Returns a matrix for converting from tile units to the correct label coordinate space. + * This variation of the function returns a matrix specialized for placement logic. + * Coordinates will be clamped to x&y 2D plane which is used with viewport and map aligned placement + * logic in most cases. Certain projections such as globe view will use 3D space for map aligned + * label placement. + */ +function getLabelPlaneMatrixForPlacement(posMatrix , + tileID , + pitchWithMap , + rotateWithMap , + transform , + projection , + pixelsToTileUnits ) { + const m = getLabelPlaneMatrixForRendering(posMatrix, tileID, pitchWithMap, rotateWithMap, transform, projection, pixelsToTileUnits); + + // Symbol placement logic is performed in 2D in most scenarios. + // For this reason project all coordinates to the xy-plane by discarding the z-component + if (projection.name !== 'globe' || !pitchWithMap) { + // Pre-multiply by scaling z to 0 + m[2] = m[6] = m[10] = m[14] = 0; } - onRemove() { - if (this._tileJSONRequest) { - this._tileJSONRequest.cancel(); - this._tileJSONRequest = null; + return m; +} + +/* + * Returns a matrix for converting from the correct label coordinate space to gl coords. + */ +function getGlCoordMatrix(posMatrix , + tileID , + pitchWithMap , + rotateWithMap , + transform , + projection , + pixelsToTileUnits ) { + if (pitchWithMap) { + if (projection.name === 'globe') { + const m = getLabelPlaneMatrixForRendering(posMatrix, tileID, pitchWithMap, rotateWithMap, transform, projection, pixelsToTileUnits); + ref_properties.invert$1(m, m); + ref_properties.multiply(m, posMatrix, m); + return m; + } else { + const m = ref_properties.clone(posMatrix); + const s = ref_properties.identity([]); + s[0] = pixelsToTileUnits[0]; + s[1] = pixelsToTileUnits[1]; + s[4] = pixelsToTileUnits[2]; + s[5] = pixelsToTileUnits[3]; + ref_properties.multiply(m, m, s); + if (!rotateWithMap) { + ref_properties.rotateZ(m, m, -transform.angle); + } + return m; } + } else { + return transform.glCoordMatrix; } +} - serialize() { - return transform.extend({}, this._options); +function project(point , matrix , elevation = 0) { + const pos = [point.x, point.y, elevation, 1]; + if (elevation) { + ref_properties.transformMat4$1(pos, pos, matrix); + } else { + xyTransformMat4(pos, pos, matrix); } + const w = pos[3]; + return { + point: [pos[0] / w, pos[1] / w, pos[2] / w], + signedDistanceFromCamera: w + }; +} - hasTile(tileID ) { - return !this.tileBounds || this.tileBounds.contains(tileID.canonical); - } +function projectVector(point , matrix ) { + const pos = [point[0], point[1], point[2], 1]; + ref_properties.transformMat4$1(pos, pos, matrix); + const w = pos[3]; + return { + point: [pos[0] / w, pos[1] / w, pos[2] / w], + signedDistanceFromCamera: w + }; +} - loadTile(tile , callback ) { - const use2x = transform.exported.devicePixelRatio >= 2; - const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), use2x, this.tileSize); - tile.request = transform.getImage(this.map._requestManager.transformRequest(url, transform.ResourceType.Tile), (err, img, cacheControl, expires) => { - delete tile.request; +function projectClamped(point , matrix ) { + const pos = [point[0], point[1], point[2], 1]; + ref_properties.transformMat4$1(pos, pos, matrix); - 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({cacheControl, expires}); + // Clamp distance to a positive value so we can avoid screen coordinate + // being flipped possibly due to perspective projection + const w = Math.max(pos[3], 0.000001); - const context = this.map.painter.context; - const gl = context.gl; - tile.texture = this.map.painter.getTileTexture(img.width); - if (tile.texture) { - tile.texture.update(img, {useMipmap: true}); - } else { - tile.texture = new transform.Texture(context, img, gl.RGBA, {useMipmap: true}); - tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + return [pos[0] / w, pos[1] / w, pos[2] / w, w]; +} - if (context.extTextureFilterAnisotropic) { - gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax); - } - } +function getPerspectiveRatio(cameraToCenterDistance , signedDistanceFromCamera ) { + return Math.min(0.5 + 0.5 * (cameraToCenterDistance / signedDistanceFromCamera), 1.5); +} - tile.state = 'loaded'; +function isVisible(anchorPos , + clippingBuffer ) { + const x = anchorPos[0] / anchorPos[3]; + const y = anchorPos[1] / anchorPos[3]; + const inPaddedViewport = ( + x >= -clippingBuffer[0] && + x <= clippingBuffer[0] && + y >= -clippingBuffer[1] && + y <= clippingBuffer[1]); + return inPaddedViewport; +} - transform.cacheEntryPossiblyAdded(this.dispatcher); +/* + * 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 , + getElevation , + tileID ) { - callback(null); - } - }); - } + const tr = painter.transform; + const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; + const partiallyEvaluatedSize = ref_properties.evaluateSizeForZoom(sizeData, painter.transform.zoom); + const isGlobe = tr.projection.name === 'globe'; - abortTile(tile , callback ) { - if (tile.request) { - tile.request.cancel(); - delete tile.request; - } - callback(); - } + const clippingBuffer = [256 / painter.width * 2 + 1, 256 / painter.height * 2 + 1]; - unloadTile(tile , callback ) { - if (tile.texture) this.map.painter.saveTileTexture(tile.texture); - callback(); - } + const dynamicLayoutVertexArray = isText ? + bucket.text.dynamicLayoutVertexArray : + bucket.icon.dynamicLayoutVertexArray; + dynamicLayoutVertexArray.clear(); - hasTransition() { - return false; + let globeExtVertexArray = null; + if (isGlobe) { + globeExtVertexArray = isText ? + bucket.text.globeExtVertexArray : + bucket.icon.globeExtVertexArray; } -} -// + const lineVertexArray = bucket.lineVertexArray; + const placedSymbols = isText ? bucket.text.placedSymbolArray : bucket.icon.placedSymbolArray; -let supportsOffscreenCanvas ; + const aspectRatio = painter.transform.width / painter.transform.height; -function offscreenCanvasSupported() { - if (supportsOffscreenCanvas == null) { - supportsOffscreenCanvas = transform.window.OffscreenCanvas && - new transform.window.OffscreenCanvas(1, 1).getContext('2d') && - typeof transform.window.createImageBitmap === 'function'; - } + let useVertical = false; - return supportsOffscreenCanvas; -} + for (let s = 0; s < placedSymbols.length; s++) { + const symbol = placedSymbols.get(s); -// + // Normally, the 'Horizontal|Vertical' writing mode is followed by a 'Vertical' counterpart, this + // is not true for 'Vertical' only line labels. For this case, we'll have to overwrite the 'useVertical' + // status before further checks. + if (symbol.writingMode === ref_properties.WritingMode.vertical && !useVertical) { + if (s === 0 || placedSymbols.get(s - 1).writingMode !== ref_properties.WritingMode.horizontal) { + useVertical = true; + } + } - - - - - + // 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 === ref_properties.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; -class RasterDEMTileSource extends RasterTileSource { - + // Project tile anchor to globe anchor + const tileAnchorPoint = new ref_properties.pointGeometry(symbol.tileAnchorX, symbol.tileAnchorY); + const elevation = getElevation ? getElevation(tileAnchorPoint) : [0, 0, 0]; + const projectedAnchor = tr.projection.projectTilePoint(tileAnchorPoint.x, tileAnchorPoint.y, tileID.canonical); + const elevatedAnchor = [projectedAnchor.x + elevation[0], projectedAnchor.y + elevation[1], projectedAnchor.z + elevation[2]]; + const anchorPos = [...elevatedAnchor, 1.0]; - constructor(id , options , dispatcher , eventedParent ) { - super(id, options, dispatcher, eventedParent); - this.type = 'raster-dem'; - this.maxzoom = 22; - this._options = transform.extend({type: 'raster-dem'}, options); - this.encoding = options.encoding || "mapbox"; - } + ref_properties.transformMat4$1(anchorPos, anchorPos, posMatrix); - loadTile(tile , callback ) { - const url = this.map._requestManager.normalizeTileURL(tile.tileID.canonical.url(this.tiles, this.scheme), false, this.tileSize); - tile.request = transform.getImage(this.map._requestManager.transformRequest(url, transform.ResourceType.Tile), imageLoaded.bind(this)); + // Don't bother calculating the correct point for invisible labels. + if (!isVisible(anchorPos, clippingBuffer)) { + hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); + continue; + } + const cameraToAnchorDistance = anchorPos[3]; + const perspectiveRatio = getPerspectiveRatio(painter.transform.cameraToCenterDistance, cameraToAnchorDistance); - function imageLoaded(err, img, cacheControl, expires) { - 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({cacheControl, expires}); - const transfer = transform.window.ImageBitmap && img instanceof transform.window.ImageBitmap && offscreenCanvasSupported(); - // DEMData uses 1px padding. Handle cases with image buffer of 1 and 2 pxs, the rest assume default buffer 0 - // in order to keep the previous implementation working (no validation against tileSize). - const buffer = (img.width - transform.prevPowerOfTwo(img.width)) / 2; - // padding is used in getImageData. As DEMData has 1px padding, if DEM tile buffer is 2px, discard outermost pixels. - const padding = 1 - buffer; - const borderReady = padding < 1; - if (!borderReady && !tile.neighboringTiles) { - tile.neighboringTiles = this._getNeighboringTiles(tile.tileID); - } - const rawImageData = transfer ? img : transform.exported.getImageData(img, padding); - const params = { - uid: tile.uid, - coord: tile.tileID, - source: this.id, - rawImageData, - encoding: this.encoding, - padding - }; + const fontSize = ref_properties.evaluateSizeForFeature(sizeData, partiallyEvaluatedSize, symbol); + const pitchScaledFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio; - if (!tile.actor || tile.state === 'expired') { - tile.actor = this.dispatcher.getActor(); - tile.actor.send('loadDEMTile', params, done.bind(this), undefined, true); - } - } + const labelPlaneAnchorPoint = project(new ref_properties.pointGeometry(elevatedAnchor[0], elevatedAnchor[1]), labelPlaneMatrix, elevatedAnchor[2]); + + // Skip labels behind the camera + if (labelPlaneAnchorPoint.signedDistanceFromCamera <= 0.0) { + hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); + continue; } - function done(err, dem) { - if (err) { - tile.state = 'errored'; - callback(err); - } + let projectionCache = {}; - if (dem) { - tile.dem = dem; - tile.dem.onDeserialize(); - tile.needsHillshadePrepare = true; - tile.needsDEMTextureUpload = true; - tile.state = 'loaded'; - callback(null); - } + const getElevationForPlacement = pitchWithMap ? null : getElevation; // When pitchWithMap, we're projecting to scaled tile coordinate space: there is no need to get elevation as it doesn't affect projection. + const placeUnflipped = placeGlyphsAlongLine(symbol, pitchScaledFontSize, false /*unflipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, + bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, globeExtVertexArray, labelPlaneAnchorPoint.point, tileAnchorPoint, projectionCache, aspectRatio, getElevationForPlacement, tr.projection, tileID, pitchWithMap); + + useVertical = placeUnflipped.useVertical; + + if (getElevationForPlacement && placeUnflipped.needsFlipping) projectionCache = {}; // Truncated points should be recalculated. + if (placeUnflipped.notEnoughRoom || useVertical || + (placeUnflipped.needsFlipping && + placeGlyphsAlongLine(symbol, pitchScaledFontSize, true /*flipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, + bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, globeExtVertexArray, labelPlaneAnchorPoint.point, tileAnchorPoint, projectionCache, aspectRatio, getElevationForPlacement, tr.projection, tileID, pitchWithMap).notEnoughRoom)) { + hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); } } - _getNeighboringTiles(tileID ) { - const canonical = tileID.canonical; - const dim = Math.pow(2, canonical.z); + if (isText) { + bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); + if (globeExtVertexArray) { + bucket.text.globeExtVertexBuffer.updateData(globeExtVertexArray); + } + } else { + bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); + if (globeExtVertexArray) { + bucket.icon.globeExtVertexBuffer.updateData(globeExtVertexArray); + } + } +} - const px = (canonical.x - 1 + dim) % dim; - const pxw = canonical.x === 0 ? tileID.wrap - 1 : tileID.wrap; - const nx = (canonical.x + 1 + dim) % dim; - const nxw = canonical.x + 1 === dim ? tileID.wrap + 1 : tileID.wrap; +function placeFirstAndLastGlyph( + fontScale , + glyphOffsetArray , + lineOffsetX , + lineOffsetY , + flip , + anchorPoint , + tileAnchorPoint , + symbol , + lineVertexArray , + labelPlaneMatrix , + projectionCache , + getElevation , + returnPathInTileCoords , + projection , + tileID , + pitchWithMap ) { - const neighboringTiles = {}; - // add adjacent tiles - neighboringTiles[new transform.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y).key] = {backfilled: false}; - neighboringTiles[new transform.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y).key] = {backfilled: false}; + const glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; + const lineStartIndex = symbol.lineStartIndex; + const lineEndIndex = symbol.lineStartIndex + symbol.lineLength; + + const firstGlyphOffset = glyphOffsetArray.getoffsetX(symbol.glyphStartIndex); + const lastGlyphOffset = glyphOffsetArray.getoffsetX(glyphEndIndex - 1); + + const firstPlacedGlyph = placeGlyphAlongLine(fontScale * firstGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, + lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, returnPathInTileCoords, true, projection, tileID, pitchWithMap); + if (!firstPlacedGlyph) + return null; + + const lastPlacedGlyph = placeGlyphAlongLine(fontScale * lastGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, + lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, returnPathInTileCoords, true, projection, tileID, pitchWithMap); + if (!lastPlacedGlyph) + return null; - // Add upper neighboringTiles - if (canonical.y > 0) { - neighboringTiles[new transform.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y - 1).key] = {backfilled: false}; - neighboringTiles[new transform.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y - 1).key] = {backfilled: false}; - neighboringTiles[new transform.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y - 1).key] = {backfilled: false}; - } - // Add lower neighboringTiles - if (canonical.y + 1 < dim) { - neighboringTiles[new transform.OverscaledTileID(tileID.overscaledZ, pxw, canonical.z, px, canonical.y + 1).key] = {backfilled: false}; - neighboringTiles[new transform.OverscaledTileID(tileID.overscaledZ, tileID.wrap, canonical.z, canonical.x, canonical.y + 1).key] = {backfilled: false}; - neighboringTiles[new transform.OverscaledTileID(tileID.overscaledZ, nxw, canonical.z, nx, canonical.y + 1).key] = {backfilled: false}; - } + return {first: firstPlacedGlyph, last: lastPlacedGlyph}; +} - return neighboringTiles; +// Check in the glCoordinate space, the rough estimation of angle between the text line and the Y axis. +// If the angle if less or equal to 5 degree, then keep the text glyphs unflipped even if it is required. +function isInFlipRetainRange(firstPoint, lastPoint, aspectRatio) { + const deltaY = lastPoint.y - firstPoint.y; + const deltaX = (lastPoint.x - firstPoint.x) * aspectRatio; + if (deltaX === 0.0) { + return true; } + const absTangent = Math.abs(deltaY / deltaX); + return (absTangent > maxTangent); +} - unloadTile(tile ) { - if (tile.demTexture) this.map.painter.saveTileTexture(tile.demTexture); - if (tile.fbo) { - tile.fbo.destroy(); - delete tile.fbo; +function requiresOrientationChange(symbol, firstPoint, lastPoint, aspectRatio) { + if (symbol.writingMode === ref_properties.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. + const rise = Math.abs(lastPoint.y - firstPoint.y); + const run = Math.abs(lastPoint.x - firstPoint.x) * aspectRatio; + if (rise > run) { + return {useVertical: true}; } - if (tile.dem) delete tile.dem; - delete tile.neighboringTiles; + } + // Check if flipping is required for "verticalOnly" case. + if (symbol.writingMode === ref_properties.WritingMode.vertical) { + return (firstPoint.y < lastPoint.y) ? {needsFlipping: true} : null; + } - tile.state = 'unloaded'; + // symbol's flipState stores the flip decision from the previous frame, and that + // decision is reused when the symbol is in the retain range. + if (symbol.flipState !== FlipState.unknown && isInFlipRetainRange(firstPoint, lastPoint, aspectRatio)) { + return (symbol.flipState === FlipState.flipRequired) ? {needsFlipping: true} : null; } + // Check if flipping is required for "horizontal" case. + return (firstPoint.x > lastPoint.x) ? {needsFlipping: true} : null; } -// - - - - - - - - - - +function placeGlyphsAlongLine(symbol, fontSize, flip, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, globeExtVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio, getElevation, projection, tileID, pitchWithMap) { + const fontScale = fontSize / 24; + const lineOffsetX = symbol.lineOffsetX * fontScale; + const lineOffsetY = symbol.lineOffsetY * fontScale; -/** - * A source containing GeoJSON. - * See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-geojson) for detailed documentation of options. - * - * @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 [Example: Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) - * @see [Example: Add a GeoJSON line](https://www.mapbox.com/mapbox-gl-js/example/geojson-line/) - * @see [Example: Create a heatmap from points](https://www.mapbox.com/mapbox-gl-js/example/heatmap/) - * @see [Example: Create and style clusters](https://www.mapbox.com/mapbox-gl-js/example/cluster/) - */ -class GeoJSONSource extends transform.Evented { - - - - - - - + let placedGlyphs; + if (symbol.numGlyphs > 1) { + const glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; + const lineStartIndex = symbol.lineStartIndex; + const 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 + const firstAndLastGlyph = placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, false, projection, tileID, pitchWithMap); + if (!firstAndLastGlyph) { + return {notEnoughRoom: true}; + } + const firstVec = projectVector((firstAndLastGlyph.first.point ), glCoordMatrix).point; + const lastVec = projectVector((firstAndLastGlyph.last.point ), glCoordMatrix).point; - /** - * @private - */ - constructor(id , options , dispatcher , eventedParent ) { - super(); + const firstPoint = new ref_properties.pointGeometry(firstVec[0], firstVec[1]); + const lastPoint = new ref_properties.pointGeometry(lastVec[0], lastVec[1]); - this.id = id; + if (keepUpright && !flip) { + const orientationChange = requiresOrientationChange(symbol, firstPoint, lastPoint, aspectRatio); + symbol.flipState = orientationChange && orientationChange.needsFlipping ? FlipState.flipRequired : FlipState.flipNotRequired; + if (orientationChange) { + return orientationChange; + } + } - // `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'; + placedGlyphs = [firstAndLastGlyph.first]; + for (let 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, getElevation, false, false, projection, tileID, pitchWithMap)); + } + 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) { + const a = project(tileAnchorPoint, posMatrix).point; + const tileVertexIndex = (symbol.lineStartIndex + symbol.segment + 1); + // $FlowFixMe + const tileSegmentEnd = new ref_properties.pointGeometry(lineVertexArray.getx(tileVertexIndex), lineVertexArray.gety(tileVertexIndex)); + const 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. + const b = (projectedVertex.signedDistanceFromCamera > 0) ? + projectedVertex.point : + projectTruncatedLineSegment(tileAnchorPoint, tileSegmentEnd, a, 1, posMatrix, undefined, projection, tileID.canonical); - this.minzoom = 0; - this.maxzoom = 18; - this.tileSize = 512; - this.isTileClipped = true; - this.reparseOverscaled = true; - this._loaded = false; + const orientationChange = requiresOrientationChange(symbol, new ref_properties.pointGeometry(a[0], a[1]), new ref_properties.pointGeometry(b[0], b[1]), aspectRatio); + symbol.flipState = orientationChange && orientationChange.needsFlipping ? FlipState.flipRequired : FlipState.flipNotRequired; + if (orientationChange) { + return orientationChange; + } + } + // $FlowFixMe + const singleGlyph = placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(symbol.glyphStartIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, + symbol.lineStartIndex, symbol.lineStartIndex + symbol.lineLength, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, false, false, projection, tileID, pitchWithMap); + if (!singleGlyph) + return {notEnoughRoom: true}; - this.actor = dispatcher.getActor(); - this.setEventedParent(eventedParent); + placedGlyphs = [singleGlyph]; + } - this._data = (options.data ); - this._options = transform.extend({}, options); + if (globeExtVertexArray) { + for (const glyph of placedGlyphs) { + ref_properties.updateGlobeVertexNormal(globeExtVertexArray, dynamicLayoutVertexArray.length + 0, glyph.up[0], glyph.up[1], glyph.up[2]); + ref_properties.updateGlobeVertexNormal(globeExtVertexArray, dynamicLayoutVertexArray.length + 1, glyph.up[0], glyph.up[1], glyph.up[2]); + ref_properties.updateGlobeVertexNormal(globeExtVertexArray, dynamicLayoutVertexArray.length + 2, glyph.up[0], glyph.up[1], glyph.up[2]); + ref_properties.updateGlobeVertexNormal(globeExtVertexArray, dynamicLayoutVertexArray.length + 3, glyph.up[0], glyph.up[1], glyph.up[2]); + ref_properties.addDynamicAttributes(dynamicLayoutVertexArray, glyph.point[0], glyph.point[1], glyph.point[2], glyph.angle); + } + } else { + for (const glyph of placedGlyphs) { + ref_properties.addDynamicAttributes(dynamicLayoutVertexArray, glyph.point[0], glyph.point[1], glyph.point[2], glyph.angle); + } + } + return {}; +} - this._collectResourceTiming = options.collectResourceTiming; +function elevatePointAndProject(p , tileID , posMatrix , projection , getElevation ) { + const point = projection.projectTilePoint(p.x, p.y, tileID); + if (!getElevation) { + return project(point, posMatrix, point.z); + } - if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom; - if (options.type) this.type = options.type; - if (options.attribution) this.attribution = options.attribution; - this.promoteId = options.promoteId; + const elevation = getElevation(p); + return project(new ref_properties.pointGeometry(point.x + elevation[0], point.y + elevation[1]), posMatrix, point.z + elevation[2]); +} - const scale = transform.EXTENT / this.tileSize; +function projectTruncatedLineSegment(previousTilePoint , currentTilePoint , previousProjectedPoint , minimumLength , projectionMatrix , getElevation , projection , tileID ) { + // 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. + const unitVertex = previousTilePoint.add(previousTilePoint.sub(currentTilePoint)._unit()); + const projectedUnitVertex = elevatePointAndProject(unitVertex, tileID, projectionMatrix, projection, getElevation).point; + const projectedUnitSegment = ref_properties.sub([], previousProjectedPoint, projectedUnitVertex); + + return ref_properties.scaleAndAdd([], previousProjectedPoint, projectedUnitSegment, minimumLength / ref_properties.length(projectedUnitSegment)); +} + +function placeGlyphAlongLine( + offsetX , + lineOffsetX , + lineOffsetY , + flip , + anchorPoint , + tileAnchorPoint , + anchorSegment , + lineStartIndex , + lineEndIndex , + lineVertexArray , + labelPlaneMatrix , + projectionCache , + getElevation , + returnPathInTileCoords , + endGlyph , + reprojection , + tileID , + pitchWithMap ) { - // 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 = transform.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: transform.EXTENT, - maxZoom: this.maxzoom, - lineMetrics: options.lineMetrics || false, - generateId: options.generateId || false - }, - superclusterOptions: { - maxZoom: options.clusterMaxZoom !== undefined ? options.clusterMaxZoom : this.maxzoom - 1, - minPoints: Math.max(2, options.clusterMinPoints || 2), - extent: transform.EXTENT, - radius: (options.clusterRadius !== undefined ? options.clusterRadius : 50) * scale, - log: false, - generateId: options.generateId || false - }, - clusterProperties: options.clusterProperties, - filter: options.filter - }, options.workerOptions); - } + const combinedOffsetX = flip ? + offsetX - lineOffsetX : + offsetX + lineOffsetX; - onAdd(map ) { - this.map = map; - this.setData(this._data); - } + let dir = combinedOffsetX > 0 ? 1 : -1; - /** - * 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} Returns itself to allow for method chaining. - * @example - * map.addSource('source_id', { - * type: 'geojson', - * data: { - * type: 'FeatureCollection', - * features: [] - * } - * }); - * const geojsonSource = map.getSource('source_id'); - * // Update the data after the GeoJSON source was created - * geojsonSource.setData({ - * "type": "FeatureCollection", - * "features": [{ - * "type": "Feature", - * "properties": {"name": "Null Island"}, - * "geometry": { - * "type": "Point", - * "coordinates": [ 0, 0 ] - * } - * }] - * }); - */ - setData(data ) { - this._data = data; - this._updateWorkerData(); - return this; + let angle = 0; + if (flip) { + // The label needs to be flipped to keep text upright. + // Iterate in the reverse direction. + dir *= -1; + angle = Math.PI; } - /** - * For clustered sources, fetches the zoom at which the given cluster expands. - * - * @param {number} clusterId The value of the cluster's `cluster_id` property. - * @param {Function} callback A callback to be called when the zoom value is retrieved (`(error, zoom) => { ... }`). - * @returns {GeoJSONSource} Returns itself to allow for method chaining. - * @example - * // Assuming the map has a layer named 'clusters' and a source 'earthquakes' - * // The following creates a camera animation on cluster feature click - * map.on('click', 'clusters', (e) => { - * const features = map.queryRenderedFeatures(e.point, { - * layers: ['clusters'] - * }); - * - * const clusterId = features[0].properties.cluster_id; - * - * // Ease the camera to the next cluster expansion - * map.getSource('earthquakes').getClusterExpansionZoom( - * clusterId, - * (err, zoom) => { - * if (!err) { - * map.easeTo({ - * center: features[0].geometry.coordinates, - * zoom - * }); - * } - * } - * ); - * }); - */ - getClusterExpansionZoom(clusterId , callback ) { - this.actor.send('geojson.getClusterExpansionZoom', {clusterId, source: this.id}, callback); - return this; - } + if (dir < 0) angle += Math.PI; - /** - * For clustered sources, fetches the children of the given cluster on the next zoom level (as an array of GeoJSON features). - * - * @param {number} clusterId The value of the cluster's `cluster_id` property. - * @param {Function} callback A callback to be called when the features are retrieved (`(error, features) => { ... }`). - * @returns {GeoJSONSource} Returns itself to allow for method chaining. - * @example - * // Retrieve cluster children on click - * map.on('click', 'clusters', (e) => { - * const features = map.queryRenderedFeatures(e.point, { - * layers: ['clusters'] - * }); - * - * const clusterId = features[0].properties.cluster_id; - * - * clusterSource.getClusterChildren(clusterId, (error, features) => { - * if (!error) { - * console.log('Cluster children:', features); - * } - * }); - * }); - * - */ - getClusterChildren(clusterId , callback ) { - this.actor.send('geojson.getClusterChildren', {clusterId, source: this.id}, callback); - return this; - } + let currentIndex = dir > 0 ? + lineStartIndex + anchorSegment : + lineStartIndex + anchorSegment + 1; - /** - * For clustered sources, fetches the original points that belong to the cluster (as an array of GeoJSON features). - * - * @param {number} clusterId The value of the cluster's `cluster_id` property. - * @param {number} limit The maximum number of features to return. Defaults to `10` if a falsy value is given. - * @param {number} offset The number of features to skip (for example, for pagination). Defaults to `0` if a falsy value is given. - * @param {Function} callback A callback to be called when the features are retrieved (`(error, features) => { ... }`). - * @returns {GeoJSONSource} Returns itself to allow for method chaining. - * @example - * // Retrieve cluster leaves on click - * map.on('click', 'clusters', (e) => { - * const features = map.queryRenderedFeatures(e.point, { - * layers: ['clusters'] - * }); - * - * const clusterId = features[0].properties.cluster_id; - * const pointCount = features[0].properties.point_count; - * const clusterSource = map.getSource('clusters'); - * - * clusterSource.getClusterLeaves(clusterId, pointCount, 0, (error, features) => { - * // Print cluster leaves in the console - * console.log('Cluster leaves:', error, features); - * }); - * }); - */ - getClusterLeaves(clusterId , limit , offset , callback ) { - this.actor.send('geojson.getClusterLeaves', { - source: this.id, - clusterId, - limit, - offset - }, callback); - return this; - } + let current = anchorPoint; + let prev = anchorPoint; + let distanceToPrev = 0; + let currentSegmentDistance = 0; + const absOffsetX = Math.abs(combinedOffsetX); + const pathVertices = []; + const tilePath = []; + let currentVertex = tileAnchorPoint; - /* - * 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. - */ - _updateWorkerData() { - // if there's an earlier loadData to finish, wait until it finishes and then do another update - if (this._pendingLoad) { - this._coalesce = true; - return; - } + const previousTilePoint = () => { + const previousLineVertexIndex = currentIndex - dir; + return distanceToPrev === 0 ? + tileAnchorPoint : + new ref_properties.pointGeometry(lineVertexArray.getx(previousLineVertexIndex), lineVertexArray.gety(previousLineVertexIndex)); + }; - this.fire(new transform.Event('dataloading', {dataType: 'source'})); + const getTruncatedLineSegment = () => { + return projectTruncatedLineSegment(previousTilePoint(), currentVertex, prev, absOffsetX - distanceToPrev + 1, labelPlaneMatrix, getElevation, reprojection, tileID.canonical); + }; - this._loaded = false; - const options = transform.extend({}, this.workerOptions); - const data = this._data; - if (typeof data === 'string') { - options.request = this.map._requestManager.transformRequest(transform.exported.resolveURL(data), transform.ResourceType.Source); - options.request.collectResourceTiming = this._collectResourceTiming; - } else { - options.data = JSON.stringify(data); - } + while (distanceToPrev + currentSegmentDistance <= absOffsetX) { + currentIndex += dir; - // target {this.type}.loadData rather than literally geojson.loadData, - // so that other geojson-like source types can easily reuse this - // implementation - this._pendingLoad = this.actor.send(`${this.type}.loadData`, options, (err, result) => { - this._loaded = true; - this._pendingLoad = null; + // offset does not fit on the projected line + if (currentIndex < lineStartIndex || currentIndex >= lineEndIndex) + return null; - if (err) { - this.fire(new transform.ErrorEvent(err)); + prev = current; + pathVertices.push(current); + if (returnPathInTileCoords) tilePath.push(currentVertex || previousTilePoint()); + current = projectionCache[currentIndex]; + if (current === undefined) { + currentVertex = new ref_properties.pointGeometry(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); + const projection = elevatePointAndProject(currentVertex, tileID.canonical, labelPlaneMatrix, reprojection, getElevation); + if (projection.signedDistanceFromCamera > 0) { + current = projectionCache[currentIndex] = projection.point; } else { - // although GeoJSON sources contain no metadata, we fire this event at first - // to let the SourceCache know its ok to start requesting tiles. - const data = {dataType: 'source', sourceDataType: this._metadataFired ? 'content' : 'metadata'}; - if (this._collectResourceTiming && result && result.resourceTiming && result.resourceTiming[this.id]) { - data.resourceTiming = result.resourceTiming[this.id]; - } - this.fire(new transform.Event('data', data)); - this._metadataFired = true; + // 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 + // Don't cache because the new vertex might not be far enough out for future glyphs on the same segment + current = getTruncatedLineSegment(); } + } else { + currentVertex = null; // null stale data + } - if (this._coalesce) { - this._updateWorkerData(); - this._coalesce = false; - } - }); + distanceToPrev += currentSegmentDistance; + currentSegmentDistance = ref_properties.distance(prev, current); } - loaded() { - return this._loaded; + currentVertex = currentVertex || new ref_properties.pointGeometry(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); + const prevVertex = previousTilePoint(); + + if (endGlyph && getElevation) { + // For terrain, always truncate end points in order to handle terrain curvature. + // If previously truncated, on signedDistanceFromCamera < 0, don't do it. + // Cache as end point. The cache is cleared if there is need for flipping in updateLineLabels. + projectionCache[currentIndex] = current = (projectionCache[currentIndex] === undefined) ? current : getTruncatedLineSegment(); + currentSegmentDistance = ref_properties.distance(prev, current); } - loadTile(tile , callback ) { - const message = !tile.actor ? 'loadTile' : 'reloadTile'; - tile.actor = this.actor; - const params = { - type: this.type, - uid: tile.uid, - tileID: tile.tileID, - tileZoom: tile.tileZoom, - zoom: tile.tileID.overscaledZ, - maxZoom: this.maxzoom, - tileSize: this.tileSize, - source: this.id, - pixelRatio: transform.exported.devicePixelRatio, - showCollisionBoxes: this.map.showCollisionBoxes, - promoteId: this.promoteId - }; + // The point is on the current segment. Interpolate to find it. Compute points on both label plane and tile space + const segmentInterpolationT = (absOffsetX - distanceToPrev) / currentSegmentDistance; + const tilePoint = currentVertex.sub(prevVertex).mult(segmentInterpolationT)._add(prevVertex); + const prevToCurrent = ref_properties.sub([], current, prev); + const labelPlanePoint = ref_properties.scaleAndAdd([], prev, prevToCurrent, segmentInterpolationT); - tile.request = this.actor.send(message, params, (err, data) => { - delete tile.request; - tile.unloadVectorData(); + let axisZ = [0, 0, 1]; + let diffX = prevToCurrent[0]; + let diffY = prevToCurrent[1]; - if (tile.aborted) { - return callback(null); - } + if (pitchWithMap) { + axisZ = reprojection.upVector(tileID.canonical, tilePoint.x, tilePoint.y); - if (err) { - return callback(err); - } + if (axisZ[0] !== 0 || axisZ[1] !== 0 || axisZ[2] !== 1) { + // Compute coordinate frame that is aligned to the tangent of the surface + const axisX = [1, 0, 0]; + const axisY = [0, 1, 0]; - tile.loadVectorData(data, this.map.painter, message === 'reloadTile'); + axisX[0] = axisZ[2]; + axisX[1] = 0; + axisX[2] = -axisZ[0]; + ref_properties.cross(axisY, axisZ, axisX); + ref_properties.normalize(axisX, axisX); + ref_properties.normalize(axisY, axisY); - return callback(null); - }, undefined, message === 'loadTile'); + diffX = ref_properties.dot(prevToCurrent, axisX); + diffY = ref_properties.dot(prevToCurrent, axisY); + } } - abortTile(tile ) { - if (tile.request) { - tile.request.cancel(); - delete tile.request; - } - tile.aborted = true; + // offset the point from the line to text-offset and icon-offset + if (lineOffsetY) { + // Find a coordinate frame for the vertical offset + const offsetDir = ref_properties.cross([], axisZ, prevToCurrent); + ref_properties.normalize(offsetDir, offsetDir); + ref_properties.scaleAndAdd(labelPlanePoint, labelPlanePoint, offsetDir, lineOffsetY * dir); } - unloadTile(tile ) { - tile.unloadVectorData(); - this.actor.send('removeTile', {uid: tile.uid, type: this.type, source: this.id}); + const segmentAngle = angle + Math.atan2(diffY, diffX); + + pathVertices.push(labelPlanePoint); + if (returnPathInTileCoords) { + tilePath.push(tilePoint); } - onRemove() { - if (this._pendingLoad) { - this._pendingLoad.cancel(); - } - } + return { + point: labelPlanePoint, + angle: segmentAngle, + path: pathVertices, + tilePath, + up: axisZ + }; +} + +const hiddenGlyphAttributes = new Float32Array([-Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0, -Infinity, -Infinity, 0]); - serialize() { - return transform.extend({}, this._options, { - type: this.type, - data: this._data - }); +// 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 (let i = 0; i < num; i++) { + const 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 * 4); } +} - hasTransition() { - return false; - } +// 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 ) { + const 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; } // - - - - - - - - + + + - - + + + + - - -// perspective correction for texture mapping, see https://github.com/mapbox/mapbox-gl-js/issues/9158 -// adapted from https://math.stackexchange.com/a/339033/48653 - -function basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4) { - const m = [x1, x2, x3, y1, y2, y3, 1, 1, 1]; - const s = [x4, y4, 1]; - const ma = transform.adjoint([], m); - const [sx, sy, sz] = transform.transformMat3(s, s, transform.transpose(ma, ma)); - return transform.multiply(m, [sx, 0, 0, 0, sy, 0, 0, 0, sz], m); -} + + + + + + + + + + + + + + + + + -function getPerspectiveTransform(w, h, x1, y1, x2, y2, x3, y3, x4, y4) { - const s = basisToPoints(0, 0, w, 0, 0, h, w, h); - const m = basisToPoints(x1, y1, x2, y2, x3, y3, x4, y4); - transform.multiply(m, transform.adjoint(s, s), m); - return [ - m[6] / m[8] * w / transform.EXTENT, - m[7] / m[8] * h / transform.EXTENT - ]; -} +// 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. +const viewportPadding = 100; /** - * 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. - * - * @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 coordinates - * const mySource = map.getSource('some id'); - * mySource.setCoordinates([ - * [-76.54335737228394, 39.18579907229748], - * [-76.52803659439087, 39.1838364847587], - * [-76.5295386314392, 39.17683392507606], - * [-76.54520273208618, 39.17876344106642] - * ]); + * 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. * - * // update url and coordinates simultaneously - * mySource.updateImage({ - * url: 'https://www.mapbox.com/images/bar.png', - * coordinates: [ - * [-76.54335737228394, 39.18579907229748], - * [-76.52803659439087, 39.1838364847587], - * [-76.5295386314392, 39.17683392507606], - * [-76.54520273208618, 39.17876344106642] - * ] - * }); + * 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. * - * map.removeSource('some id'); // remove - * @see [Example: Add an image](https://www.mapbox.com/mapbox-gl-js/example/image-on-a-map/) + * @private */ -class ImageSource extends transform.Evented { - +class CollisionIndex { - - - - - - - - - - - - - - - - + + + + + + - - - - - /** - * @private - */ - constructor(id , options , dispatcher , eventedParent ) { - super(); - 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._loaded = false; + constructor( + transform , + fogState , + grid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25), + ignoredGrid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25) + ) { + this.transform = transform; - this.setEventedParent(eventedParent); + this.grid = grid; + this.ignoredGrid = ignoredGrid; + this.pitchfactor = Math.cos(transform._pitch) * transform.cameraToCenterDistance; - this.options = options; + this.screenRightBoundary = transform.width + viewportPadding; + this.screenBottomBoundary = transform.height + viewportPadding; + this.gridRightBoundary = transform.width + 2 * viewportPadding; + this.gridBottomBoundary = transform.height + 2 * viewportPadding; + this.fogState = fogState; } - load(newCoordinates , successCallback ) { - this._loaded = false; - this.fire(new transform.Event('dataloading', {dataType: 'source'})); - - this.url = this.options.url; + placeCollisionBox(bucket , scale , collisionBox , shift , allowOverlap , textPixelRatio , posMatrix , collisionGroupPredicate ) { + ref_properties.assert_1(!this.transform.elevation || collisionBox.elevation !== undefined); - transform.getImage(this.map._requestManager.transformRequest(this.url, transform.ResourceType.Image), (err, image) => { - this._loaded = true; - if (err) { - this.fire(new transform.ErrorEvent(err)); - } else if (image) { - this.image = transform.exported.getImageData(image); - this.width = this.image.width; - this.height = this.image.height; - if (newCoordinates) { - this.coordinates = newCoordinates; - } - if (successCallback) { - successCallback(); - } - this._finishLoading(); - } - }); - } + let anchorX = collisionBox.projectedAnchorX; + let anchorY = collisionBox.projectedAnchorY; + let anchorZ = collisionBox.projectedAnchorZ; - loaded() { - return this._loaded; - } + // Apply elevation vector to the anchor point + const elevation = collisionBox.elevation; + const tileID = collisionBox.tileID; + if (elevation && tileID) { + const up = bucket.getProjection().upVector(tileID.canonical, collisionBox.tileAnchorX, collisionBox.tileAnchorY); + const upScale = bucket.getProjection().upVectorScale(tileID.canonical, this.transform.center.lat, this.transform.worldSize).metersToTile; - /** - * Updates the image URL and, optionally, the coordinates. To avoid having the image flash after changing, - * set the `raster-fade-duration` paint property on the raster layer to 0. - * - * @param {Object} options Options object. - * @param {string} [options.url] Required image URL. - * @param {Array>} [options.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} Returns itself to allow for method chaining. - * @example - * // Add to an image source to the map with some initial URL and coordinates - * map.addSource('image_source_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] - * ] - * }); - * // Then update the image URL and coordinates - * imageSource.updateImage({ - * url: 'https://www.mapbox.com/images/bar.png', - * coordinates: [ - * [-76.5433, 39.1857], - * [-76.5280, 39.1838], - * [-76.5295, 39.1768], - * [-76.5452, 39.1787] - * ] - * }); - */ - updateImage(options ) { - if (!this.image || !options.url) { - return this; + anchorX += up[0] * elevation * upScale; + anchorY += up[1] * elevation * upScale; + anchorZ += up[2] * elevation * upScale; } - this.options.url = options.url; - this.load(options.coordinates, () => { this.texture = null; }); - return this; - } - _finishLoading() { - if (this.map) { - this.setCoordinates(this.coordinates); - this.fire(new transform.Event('data', {dataType: 'source', sourceDataType: 'metadata'})); + const checkOcclusion = bucket.projection.name === 'globe' || !!elevation || this.transform.pitch > 0; + const projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, [anchorX, anchorY, anchorZ], collisionBox.tileID, checkOcclusion, bucket.getProjection()); + + const tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio; + const tlX = (collisionBox.x1 * scale + shift.x - collisionBox.padding) * tileToViewport + projectedPoint.point.x; + const tlY = (collisionBox.y1 * scale + shift.y - collisionBox.padding) * tileToViewport + projectedPoint.point.y; + const brX = (collisionBox.x2 * scale + shift.x + collisionBox.padding) * tileToViewport + projectedPoint.point.x; + const brY = (collisionBox.y2 * scale + shift.y + collisionBox.padding) * tileToViewport + projectedPoint.point.y; + // Clip at 10 times the distance of the map center or, said otherwise, when the label + // would be drawn at 10% the size of the features around it without scaling. Refer: + // https://github.com/mapbox/mapbox-gl-native/wiki/Text-Rendering#perspective-scaling + // 0.55 === projection.getPerspectiveRatio(camera_to_center, camera_to_center * 10) + const minPerspectiveRatio = 0.55; + const isClipped = projectedPoint.perspectiveRatio <= minPerspectiveRatio || projectedPoint.occluded; + + if (!this.isInsideGrid(tlX, tlY, brX, brY) || + (!allowOverlap && this.grid.hitTest(tlX, tlY, brX, brY, collisionGroupPredicate)) || + isClipped) { + return { + box: [], + offscreen: false, + occluded: projectedPoint.occluded + }; } - } - onAdd(map ) { - this.map = map; - this.load(); + return { + box: [tlX, tlY, brX, brY], + offscreen: this.isOffscreen(tlX, tlY, brX, brY), + occluded: false + }; } - /** - * 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} Returns itself to allow for method chaining. - * @example - * // Add an image source to the map with some initial coordinates - * map.addSource('image_source_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] - * ] - * }); - * // Then update the image coordinates - * imageSource.setCoordinates([ - * [-76.5433, 39.1857], - * [-76.5280, 39.1838], - * [-76.5295, 39.1768], - * [-76.5452, 39.1787] - * ]); - */ - setCoordinates(coordinates ) { - this.coordinates = coordinates; - delete this._boundsArray; + placeCollisionCircles(bucket , + allowOverlap , + symbol , + lineVertexArray , + glyphOffsetArray , + fontSize , + posMatrix , + labelPlaneMatrix , + labelToScreenMatrix , + showCollisionCircles , + pitchWithMap , + collisionGroupPredicate , + circlePixelDiameter , + textPixelPadding , + tileID ) { + const placedCollisionCircles = []; + const elevation = this.transform.elevation; + const getElevation = elevation ? elevation.getAtTileOffsetFunc(tileID, this.transform.center.lat, this.transform.worldSize, bucket.getProjection()) : (_ => [0, 0, 0]); + const tileUnitAnchorPoint = new ref_properties.pointGeometry(symbol.tileAnchorX, symbol.tileAnchorY); + const projectedAnchor = bucket.getProjection().projectTilePoint(symbol.tileAnchorX, symbol.tileAnchorY, tileID.canonical); + const anchorElevation = getElevation(tileUnitAnchorPoint); + const elevatedAnchor = [projectedAnchor.x + anchorElevation[0], projectedAnchor.y + anchorElevation[1], projectedAnchor.z + anchorElevation[2]]; + const isGlobe = bucket.projection.name === 'globe'; + const checkOcclusion = isGlobe || !!elevation || this.transform.pitch > 0; + const screenAnchorPoint = this.projectAndGetPerspectiveRatio(posMatrix, [elevatedAnchor[0], elevatedAnchor[1], elevatedAnchor[2]], tileID, checkOcclusion, bucket.getProjection()); + const {perspectiveRatio} = screenAnchorPoint; + const labelPlaneFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio; + const labelPlaneFontScale = labelPlaneFontSize / ref_properties.ONE_EM; + const labelPlaneAnchorPoint = project(new ref_properties.pointGeometry(elevatedAnchor[0], elevatedAnchor[1]), labelPlaneMatrix, elevatedAnchor[2]).point; - // 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. + const projectionCache = {}; + const lineOffsetX = symbol.lineOffsetX * labelPlaneFontScale; + const lineOffsetY = symbol.lineOffsetY * labelPlaneFontScale; - // transform the geo coordinates into (zoom 0) tile space coordinates - const cornerCoords = coordinates.map(transform.MercatorCoordinate.fromLngLat); + const firstAndLastGlyph = screenAnchorPoint.signedDistanceFromCamera > 0 ? placeFirstAndLastGlyph( + labelPlaneFontScale, + glyphOffsetArray, + lineOffsetX, + lineOffsetY, + /*flip*/ false, + labelPlaneAnchorPoint, + tileUnitAnchorPoint, + symbol, + lineVertexArray, + labelPlaneMatrix, + projectionCache, + elevation && !pitchWithMap ? getElevation : null, // pitchWithMap: no need to sample elevation as it has no effect when projecting using scale/rotate to tile space labelPlaneMatrix. + pitchWithMap && !!elevation, + bucket.getProjection(), + tileID, + pitchWithMap + ) : null; - // Compute the coordinates of the tile we'll use to hold this image's - // render data - this.tileID = getCoordinatesCenterTileID(cornerCoords); + let collisionDetected = false; + let inGrid = false; + let entirelyOffscreen = true; - // 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 = this.tileID.z; + if (firstAndLastGlyph && !screenAnchorPoint.occluded) { + const radius = circlePixelDiameter * 0.5 * perspectiveRatio + textPixelPadding; + const screenPlaneMin = new ref_properties.pointGeometry(-viewportPadding, -viewportPadding); + const screenPlaneMax = new ref_properties.pointGeometry(this.screenRightBoundary, this.screenBottomBoundary); + const interpolator = new PathInterpolator(); - this.fire(new transform.Event('data', {dataType:'source', sourceDataType: 'content'})); - return this; - } + // Construct a projected path from projected line vertices. Anchor points are ignored and removed + const first = firstAndLastGlyph.first; + const last = firstAndLastGlyph.last; - _clear() { - delete this._boundsArray; - } + let projectedPath = []; + for (let i = first.path.length - 1; i >= 1; i--) { + projectedPath.push(first.path[i]); + } + for (let i = 1; i < last.path.length; i++) { + projectedPath.push(last.path[i]); + } + ref_properties.assert_1(projectedPath.length >= 2); - _makeBoundsArray() { - const tileTr = transform.tileTransform(this.tileID, this.map.transform.projection); + // Tolerate a slightly longer distance than one diameter between two adjacent circles + const circleDist = radius * 2.5; - // Transform the corner coordinates into the coordinate space of our tile. - const [tl, tr, br, bl] = this.coordinates.map((coord) => { - const projectedCoord = tileTr.projection.project(coord[0], coord[1]); - return transform.getTilePoint(tileTr, projectedCoord)._round(); - }); + // The path might need to be converted into screen space if a pitched map is used as the label space + if (labelToScreenMatrix) { + ref_properties.assert_1(pitchWithMap); + const screenSpacePath = (elevation && !isGlobe) ? + projectedPath.map((p, index) => { + const elevation = getElevation(index < first.path.length - 1 ? first.tilePath[first.path.length - 1 - index] : last.tilePath[index - first.path.length + 2]); + p[2] = elevation[2]; + return projectVector((p ), labelToScreenMatrix); + }) : + projectedPath.map(p => projectVector((p ), labelToScreenMatrix)); - this.perspectiveTransform = getPerspectiveTransform( - this.width, this.height, tl.x, tl.y, tr.x, tr.y, bl.x, bl.y, br.x, br.y); + // Do not try to place collision circles if even of the points is behind the camera. + // This is a plausible scenario with big camera pitch angles + if (screenSpacePath.some(point => point.signedDistanceFromCamera <= 0)) { + projectedPath = []; + } else { + projectedPath = screenSpacePath.map(p => p.point); + } + } - this._boundsArray = new transform.StructArrayLayout4i8(); - this._boundsArray.emplaceBack(tl.x, tl.y, 0, 0); - this._boundsArray.emplaceBack(tr.x, tr.y, transform.EXTENT, 0); - this._boundsArray.emplaceBack(bl.x, bl.y, 0, transform.EXTENT); - this._boundsArray.emplaceBack(br.x, br.y, transform.EXTENT, transform.EXTENT); + let segments = []; - if (this.boundsBuffer) { - this.boundsBuffer.destroy(); - delete this.boundsBuffer; + if (projectedPath.length > 0) { + const screenSpacePath = projectedPath.map(p => new ref_properties.pointGeometry(p[0], p[1])); + + // Quickly check if the path is fully inside or outside of the padded collision region. + // For overlapping paths we'll only create collision circles for the visible segments + let minx = Infinity; + let maxx = -Infinity; + let miny = Infinity; + let maxy = -Infinity; + + for (let i = 0; i < screenSpacePath.length; i++) { + minx = Math.min(minx, screenSpacePath[i].x); + miny = Math.min(miny, screenSpacePath[i].y); + maxx = Math.max(maxx, screenSpacePath[i].x); + maxy = Math.max(maxy, screenSpacePath[i].y); + } + + if (minx >= screenPlaneMin.x && maxx <= screenPlaneMax.x && + miny >= screenPlaneMin.y && maxy <= screenPlaneMax.y) { + // Quad fully visible + segments = [screenSpacePath]; + } else if (maxx < screenPlaneMin.x || minx > screenPlaneMax.x || + maxy < screenPlaneMin.y || miny > screenPlaneMax.y) { + // Not visible + segments = []; + } else { + segments = ref_properties.clipLine([screenSpacePath], screenPlaneMin.x, screenPlaneMin.y, screenPlaneMax.x, screenPlaneMax.y); + } + } + + for (const seg of segments) { + // interpolate positions for collision circles. Add a small padding to both ends of the segment + ref_properties.assert_1(seg.length > 0); + interpolator.reset(seg, radius * 0.25); + + let numCircles = 0; + + if (interpolator.length <= 0.5 * radius) { + numCircles = 1; + } else { + numCircles = Math.ceil(interpolator.paddedLength / circleDist) + 1; + } + + for (let i = 0; i < numCircles; i++) { + const t = i / Math.max(numCircles - 1, 1); + const circlePosition = interpolator.lerp(t); + + // add viewport padding to the position and perform initial collision check + const centerX = circlePosition.x + viewportPadding; + const centerY = circlePosition.y + viewportPadding; + + placedCollisionCircles.push(centerX, centerY, radius, 0); + + const x1 = centerX - radius; + const y1 = centerY - radius; + const x2 = centerX + radius; + const y2 = centerY + radius; + + entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2); + inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2); + + if (!allowOverlap) { + if (this.grid.hitTestCircle(centerX, centerY, radius, collisionGroupPredicate)) { + // Don't early exit if we're showing the debug circles because we still want to calculate + // which circles are in use + collisionDetected = true; + if (!showCollisionCircles) { + return { + circles: [], + offscreen: false, + collisionDetected, + occluded: false + }; + } + } + } + } + } } - return this; + return { + circles: ((!showCollisionCircles && collisionDetected) || !inGrid) ? [] : placedCollisionCircles, + offscreen: entirelyOffscreen, + collisionDetected, + occluded: screenAnchorPoint.occluded + }; } - prepare() { - if (Object.keys(this.tiles).length === 0 || !this.image) { - return; + /** + * 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`. + * + * @private + */ + queryRenderedSymbols(viewportQueryGeometry ) { + if (viewportQueryGeometry.length === 0 || (this.grid.keysLength() === 0 && this.ignoredGrid.keysLength() === 0)) { + return {}; } - const context = this.map.painter.context; - const gl = context.gl; + const query = []; + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; + for (const point of viewportQueryGeometry) { + const gridPoint = new ref_properties.pointGeometry(point.x + viewportPadding, point.y + viewportPadding); + minX = Math.min(minX, gridPoint.x); + minY = Math.min(minY, gridPoint.y); + maxX = Math.max(maxX, gridPoint.x); + maxY = Math.max(maxY, gridPoint.y); + query.push(gridPoint); + } + + const features = this.grid.query(minX, minY, maxX, maxY) + .concat(this.ignoredGrid.query(minX, minY, maxX, maxY)); + + const seenFeatures = {}; + const result = {}; + + for (const feature of features) { + const featureKey = feature.key; + // Skip already seen features. + if (seenFeatures[featureKey.bucketInstanceId] === undefined) { + seenFeatures[featureKey.bucketInstanceId] = {}; + } + if (seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex]) { + 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. + const bbox = [ + new ref_properties.pointGeometry(feature.x1, feature.y1), + new ref_properties.pointGeometry(feature.x2, feature.y1), + new ref_properties.pointGeometry(feature.x2, feature.y2), + new ref_properties.pointGeometry(feature.x1, feature.y2) + ]; + if (!ref_properties.polygonIntersectsPolygon(query, bbox)) { + continue; + } - if (!this._boundsArray) { - this._makeBoundsArray(); + seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex] = true; + if (result[featureKey.bucketInstanceId] === undefined) { + result[featureKey.bucketInstanceId] = []; + } + result[featureKey.bucketInstanceId].push(featureKey.featureIndex); } - if (!this.boundsBuffer) { - this.boundsBuffer = context.createVertexBuffer(this._boundsArray, transform.boundsAttributes.members); - } + return result; + } - if (!this.boundsSegments) { - this.boundsSegments = transform.SegmentVector.simpleSegment(0, 0, 4, 2); - } + insertCollisionBox(collisionBox , ignorePlacement , bucketInstanceId , featureIndex , collisionGroupID ) { + const grid = ignorePlacement ? this.ignoredGrid : this.grid; - if (!this.texture) { - this.texture = new transform.Texture(context, this.image, gl.RGBA); - this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - } + const key = {bucketInstanceId, featureIndex, collisionGroupID}; + grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]); + } - for (const w in this.tiles) { - const tile = this.tiles[w]; - if (tile.state !== 'loaded') { - tile.state = 'loaded'; - tile.texture = this.texture; - } + insertCollisionCircles(collisionCircles , ignorePlacement , bucketInstanceId , featureIndex , collisionGroupID ) { + const grid = ignorePlacement ? this.ignoredGrid : this.grid; + + const key = {bucketInstanceId, featureIndex, collisionGroupID}; + for (let k = 0; k < collisionCircles.length; k += 4) { + grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]); } } - 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); + projectAndGetPerspectiveRatio(posMatrix , point , tileID , checkOcclusion , bucketProjection ) { + const p = [point[0], point[1], point[2], 1]; + let behindFog = false; + if (point[2] || this.transform.pitch > 0) { + ref_properties.transformMat4$1(p, p, posMatrix); + // Do not perform symbol occlusion on globe due to fog fixed range + const isGlobe = bucketProjection.name === 'globe'; + if (this.fogState && tileID && !isGlobe) { + const fogOpacity = getFogOpacityAtTileCoord(this.fogState, point[0], point[1], point[2], tileID.toUnwrapped(), this.transform); + behindFog = fogOpacity > FOG_SYMBOL_CLIPPING_THRESHOLD; + } } else { - tile.state = 'errored'; - callback(null); + xyTransformMat4(p, p, posMatrix); } - } + const a = new ref_properties.pointGeometry( + (((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding, + (((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding + ); - serialize() { return { - type: 'image', - url: this.options.url, - coordinates: this.coordinates + 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: Math.min(0.5 + 0.5 * (this.transform.getCameraToCenterDistance(bucketProjection) / p[3]), 1.5), + signedDistanceFromCamera: p[3], + occluded: (checkOcclusion && p[2] > p[3]) || behindFog // Occluded by the far plane }; } - hasTransition() { - return false; + isOffscreen(x1 , y1 , x2 , y2 ) { + return x2 < viewportPadding || x1 >= this.screenRightBoundary || y2 < viewportPadding || y1 > this.screenBottomBoundary; + } + + isInsideGrid(x1 , y1 , x2 , y2 ) { + return x2 >= 0 && x1 < this.gridRightBoundary && y2 >= 0 && y1 < this.gridBottomBoundary; + } + + /* + * Returns a matrix for transforming collision shapes to viewport coordinate space. + * Use this function to render e.g. collision circles on the screen. + * example transformation: clipPos = glCoordMatrix * viewportMatrix * circle_pos + */ + getViewportMatrix() { + const m = ref_properties.identity([]); + ref_properties.translate(m, m, [-viewportPadding, -viewportPadding, 0.0]); + return m; } } -/** - * Given a list of coordinates, get their center as a coordinate. - * - * @returns centerpoint - * @private - */ -function getCoordinatesCenterTileID(coords ) { - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; +// - for (const coord of coords) { - minX = Math.min(minX, coord.x); - minY = Math.min(minY, coord.y); - maxX = Math.max(maxX, coord.x); - maxY = Math.max(maxY, coord.y); +function reconstructTileMatrix(transform , projection , coord ) { + // Bucket being rendered is built for different map projection + // than is currently being used. Reconstruct correct matrices. + // This code path may happen during a Globe - Mercator transition + const tileMatrix = projection.createTileMatrix(transform, transform.worldSize, coord.toUnwrapped()); + return ref_properties.multiply(new Float32Array(16), transform.projMatrix, tileMatrix); +} + +function getCollisionDebugTileProjectionMatrix(coord , bucket , transform ) { + if (bucket.projection.name === transform.projection.name) { + ref_properties.assert_1(coord.projMatrix); + return coord.projMatrix; } + const tr = transform.clone(); + tr.setProjection(bucket.projection); + return reconstructTileMatrix(tr, bucket.getProjection(), coord); +} - const dx = maxX - minX; - const dy = maxY - minY; - const dMax = Math.max(dx, dy); - const zoom = Math.max(0, Math.floor(-Math.log(dMax) / Math.LN2)); - const tilesAtZoom = Math.pow(2, zoom); +function getSymbolTileProjectionMatrix(coord , bucketProjection , transform ) { + if (bucketProjection.name === transform.projection.name) { + ref_properties.assert_1(coord.projMatrix); + return coord.projMatrix; + } + return reconstructTileMatrix(transform, bucketProjection, coord); +} - return new transform.CanonicalTileID( - zoom, - Math.floor((minX + maxX) / 2 * tilesAtZoom), - Math.floor((minY + maxY) / 2 * tilesAtZoom)); +function getSymbolPlacementTileProjectionMatrix(coord , bucketProjection , transform , runtimeProjection ) { + if (bucketProjection.name === runtimeProjection) { + return transform.calculateProjMatrix(coord.toUnwrapped()); + } + ref_properties.assert_1(transform.projection.name === bucketProjection.name); + return reconstructTileMatrix(transform, bucketProjection, coord); } // - + + + - - - -/** - * A data source containing video. - * See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-video) for detailed documentation of options. - * - * @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 - * const 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 [Example: Add a video](https://www.mapbox.com/mapbox-gl-js/example/video-on-a-map/) - */ -class VideoSource extends ImageSource { - - - +class OpacityState { + + + constructor(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; + } + isHidden() { + return this.opacity === 0 && !this.placed; + } +} + +class JointOpacityState { + + + constructor(prevState , increment , placedText , placedIcon , skipFade , clipped = false) { + this.text = new OpacityState(prevState ? prevState.text : null, increment, placedText, skipFade); + this.icon = new OpacityState(prevState ? prevState.icon : null, increment, placedIcon, skipFade); - /** - * @private - */ - constructor(id , options , dispatcher , eventedParent ) { - super(id, options, dispatcher, eventedParent); - this.roundZoom = true; - this.type = 'video'; - this.options = options; + this.clipped = clipped; } + isHidden() { + return this.text.isHidden() && this.icon.isHidden(); + } +} - load() { - this._loaded = false; - const options = this.options; +class JointPlacement { + + + // skipFade = outside viewport, but within CollisionIndex::viewportPadding px of the edge + // Because these symbols aren't onscreen yet, we can skip the "fade in" animation, + // and if a subsequent viewport change brings them into view, they'll be fully + // visible right away. + - this.urls = []; - for (const url of options.urls) { - this.urls.push(this.map._requestManager.transformRequest(url, transform.ResourceType.Source).url); - } + + constructor(text , icon , skipFade , clipped = false) { + this.text = text; + this.icon = icon; + this.skipFade = skipFade; + this.clipped = clipped; + } +} - transform.getVideo(this.urls, (err, video) => { - this._loaded = true; - if (err) { - this.fire(new transform.ErrorEvent(err)); - } else if (video) { - this.video = video; - this.video.loop = true; +class CollisionCircleArray { + // Stores collision circles and placement matrices of a bucket for debug rendering. + + + - // Prevent the video from taking over the screen in iOS - this.video.setAttribute('playsinline', ''); + constructor() { + this.invProjMatrix = ref_properties.create(); + this.viewportMatrix = ref_properties.create(); + this.circles = []; + } +} - // Start repainting when video starts playing. hasTransition() will then return - // true to trigger additional frames as long as the videos continues playing. - this.video.addEventListener('playing', () => { - this.map.triggerRepaint(); - }); +class RetainedQueryData { + + + + + + + constructor(bucketInstanceId , + featureIndex , + sourceLayerIndex , + bucketIndex , + tileID ) { + this.bucketInstanceId = bucketInstanceId; + this.featureIndex = featureIndex; + this.sourceLayerIndex = sourceLayerIndex; + this.bucketIndex = bucketIndex; + this.tileID = tileID; + } +} - if (this.map) { - this.video.play(); - } + - this._finishLoading(); - } - }); - } +class CollisionGroups { + + + - /** - * Pauses the video. - * - * @example - * // Assuming a video source identified by video_source_id was added to the map - * const videoSource = map.getSource('video_source_id'); - * - * // Pauses the video - * videoSource.pause(); - */ - pause() { - if (this.video) { - this.video.pause(); - } + constructor(crossSourceCollisions ) { + this.crossSourceCollisions = crossSourceCollisions; + this.maxGroupID = 0; + this.collisionGroups = {}; } - /** - * Plays the video. - * - * @example - * // Assuming a video source identified by video_source_id was added to the map - * const videoSource = map.getSource('video_source_id'); - * - * // Starts the video - * videoSource.play(); - */ - play() { - if (this.video) { - this.video.play(); + get(sourceID ) { + // The predicate/groupID mechanism allows for arbitrary grouping, + // but the current interface defines one source == one group when + // crossSourceCollisions == true. + if (!this.crossSourceCollisions) { + if (!this.collisionGroups[sourceID]) { + const nextGroupID = ++this.maxGroupID; + this.collisionGroups[sourceID] = { + ID: nextGroupID, + predicate: (key) => { + return key.collisionGroupID === nextGroupID; + } + }; + } + return this.collisionGroups[sourceID]; + } else { + return {ID: 0, predicate: null}; } } +} - /** - * Sets playback to a timestamp, in seconds. - * @private - */ - seek(seconds ) { - if (this.video) { - const seekableRange = this.video.seekable; - if (seconds < seekableRange.start(0) || seconds > seekableRange.end(0)) { - this.fire(new transform.ErrorEvent(new transform.ValidationError(`sources.${this.id}`, null, `Playback for this video can be set only between the ${seekableRange.start(0)} and ${seekableRange.end(0)}-second mark.`))); - } else this.video.currentTime = seconds; - } - } +function calculateVariableLayoutShift(anchor , width , height , textOffset , textScale ) { + const {horizontalAlign, verticalAlign} = ref_properties.getAnchorAlignment(anchor); + const shiftX = -(horizontalAlign - 0.5) * width; + const shiftY = -(verticalAlign - 0.5) * height; + const offset = ref_properties.evaluateVariableOffset(anchor, textOffset); + return new ref_properties.pointGeometry( + shiftX + offset[0] * textScale, + shiftY + offset[1] * textScale + ); +} - /** - * Returns the HTML `video` element. - * - * @returns {HTMLVideoElement} The HTML `video` element. - * @example - * // Assuming a video source identified by video_source_id was added to the map - * const videoSource = map.getSource('video_source_id'); - * - * videoSource.getVideo(); // - */ - getVideo() { - return this.video; +function offsetShift(shiftX , shiftY , rotateWithMap , pitchWithMap , angle ) { + const shift = new ref_properties.pointGeometry(shiftX, shiftY); + if (rotateWithMap) { + shift._rotate(pitchWithMap ? angle : -angle); } + return shift; +} - 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 - * @returns {VideoSource} Returns itself to allow for method chaining. - * @example - * // Add a video source to the map to map - * map.addSource('video_source_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] - * ] - * }); - * - * // Then update the video source coordinates by new coordinates - * const videoSource = map.getSource('video_source_id'); - * videoSource.setCoordinates([ - * [-76.5433, 39.1857], - * [-76.5280, 39.1838], - * [-76.5295, 39.1768], - * [-76.5452, 39.1787] - * ]); - */ - // setCoordinates inherited from ImageSource + + + + + + + + + + + + + - prepare() { - if (Object.keys(this.tiles).length === 0 || this.video.readyState < 2) { - return; // not enough data for current position - } + + + + + + - const context = this.map.painter.context; - const gl = context.gl; + - if (!this.texture) { - this.texture = new transform.Texture(context, this.video, gl.RGBA); - this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - this.width = this.video.videoWidth; - this.height = this.video.videoHeight; +class Placement { + + + + + + + + + + + + + + + + + - } 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); - } + constructor(transform , fadeDuration , crossSourceCollisions , prevPlacement , fogState ) { + this.transform = transform.clone(); + this.projection = transform.projection.name; + this.collisionIndex = new CollisionIndex(this.transform, fogState); + this.placements = {}; + this.opacities = {}; + this.variableOffsets = {}; + this.stale = false; + this.commitTime = 0; + this.fadeDuration = fadeDuration; + this.retainedQueryData = {}; + this.collisionGroups = new CollisionGroups(crossSourceCollisions); + this.collisionCircleArrays = {}; - if (!this._boundsArray) { - this._makeBoundsArray(); + this.prevPlacement = prevPlacement; + if (prevPlacement) { + prevPlacement.prevPlacement = undefined; // Only hold on to one placement back } - if (!this.boundsBuffer) { - this.boundsBuffer = context.createVertexBuffer(this._boundsArray, transform.boundsAttributes.members); - } + this.placedOrientations = {}; + } - if (!this.boundsSegments) { - this.boundsSegments = transform.SegmentVector.simpleSegment(0, 0, 4, 2); - } + getBucketParts(results , styleLayer , tile , sortAcrossTiles ) { + const symbolBucket = ((tile.getBucket(styleLayer) ) ); + const bucketFeatureIndex = tile.latestFeatureIndex; - for (const w in this.tiles) { - const tile = this.tiles[w]; - if (tile.state !== 'loaded') { - tile.state = 'loaded'; - tile.texture = this.texture; - } - } - } + if (!symbolBucket || !bucketFeatureIndex || styleLayer.id !== symbolBucket.layerIds[0]) + return; - serialize() { - return { - type: 'video', - urls: this.urls, - coordinates: this.coordinates - }; - } + const layout = symbolBucket.layers[0].layout; - hasTransition() { - return this.video && !this.video.paused; - } -} + const collisionBoxArray = tile.collisionBoxArray; + const scale = Math.pow(2, this.transform.zoom - tile.tileID.overscaledZ); + const textPixelRatio = tile.tileSize / ref_properties.EXTENT; + const unwrappedTileID = tile.tileID.toUnwrapped(); -// + this.transform.setProjection(symbolBucket.projection); - - - + const posMatrix = getSymbolPlacementTileProjectionMatrix(tile.tileID, symbolBucket.getProjection(), this.transform, this.projection); - - - - - - + const pitchWithMap = layout.get('text-pitch-alignment') === 'map'; + const rotateWithMap = layout.get('text-rotation-alignment') === 'map'; -/** - * Options to add a canvas source type to the map. - * - * @typedef {Object} CanvasSourceOptions - * @property {string} type Source type. Must be `"canvas"`. - * @property {string|HTMLCanvasElement} canvas Canvas source from which to read pixels. Can be a string representing the ID of the canvas element, or the `HTMLCanvasElement` itself. - * @property {Array>} coordinates Four geographical coordinates denoting where to place the corners of the canvas, specified in `[longitude, latitude]` pairs. - * @property {boolean} [animate=true] Whether the canvas source is animated. If the canvas is static (pixels do not need to be re-read on every frame), `animate` should be set to `false` to improve performance. - */ + styleLayer.compileFilter(); + + const dynamicFilter = styleLayer.dynamicFilter(); + const dynamicFilterNeedsFeature = styleLayer.dynamicFilterNeedsFeature(); + const pixelsToTiles = this.transform.calculatePixelsToTileUnitsMatrix(tile); + + const textLabelPlaneMatrix = getLabelPlaneMatrixForPlacement(posMatrix, + tile.tileID.canonical, + pitchWithMap, + rotateWithMap, + this.transform, + symbolBucket.getProjection(), + pixelsToTiles); -/** - * A data source containing the contents of an HTML canvas. See {@link CanvasSourceOptions} for detailed documentation of options. - * - * @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 - * const 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 [Example: Add a canvas source](https://docs.mapbox.com/mapbox-gl-js/example/canvas-source/) - */ -class CanvasSource extends ImageSource { - - - - - - + let labelToScreenMatrix = null; - /** - * @private - */ - constructor(id , options , dispatcher , eventedParent ) { - super(id, options, dispatcher, eventedParent); + if (pitchWithMap) { + const glMatrix = getGlCoordMatrix( + posMatrix, + tile.tileID.canonical, + pitchWithMap, + rotateWithMap, + this.transform, + symbolBucket.getProjection(), + pixelsToTiles); - // We build in some validation here, since canvas sources aren't included in the style spec: - if (!options.coordinates) { - this.fire(new transform.ErrorEvent(new transform.ValidationError(`sources.${id}`, null, 'missing required property "coordinates"'))); - } else if (!Array.isArray(options.coordinates) || options.coordinates.length !== 4 || - options.coordinates.some(c => !Array.isArray(c) || c.length !== 2 || c.some(l => typeof l !== 'number'))) { - this.fire(new transform.ErrorEvent(new transform.ValidationError(`sources.${id}`, null, '"coordinates" property must be an array of 4 longitude/latitude array pairs'))); + labelToScreenMatrix = ref_properties.multiply([], this.transform.labelPlaneMatrix, glMatrix); } - if (options.animate && typeof options.animate !== 'boolean') { - this.fire(new transform.ErrorEvent(new transform.ValidationError(`sources.${id}`, null, 'optional "animate" property must be a boolean value'))); - } + let clippingData = null; + ref_properties.assert_1(!!tile.latestFeatureIndex); + if (!!dynamicFilter && tile.latestFeatureIndex) { - if (!options.canvas) { - this.fire(new transform.ErrorEvent(new transform.ValidationError(`sources.${id}`, null, 'missing required property "canvas"'))); - } else if (typeof options.canvas !== 'string' && !(options.canvas instanceof transform.window.HTMLCanvasElement)) { - this.fire(new transform.ErrorEvent(new transform.ValidationError(`sources.${id}`, null, '"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))); + clippingData = { + unwrappedTileID, + dynamicFilter, + dynamicFilterNeedsFeature, + featureIndex: tile.latestFeatureIndex + }; } - this.options = options; - this.animate = options.animate !== undefined ? options.animate : true; + // As long as this placement lives, we have to hold onto this bucket's + // matching FeatureIndex/data for querying purposes + this.retainedQueryData[symbolBucket.bucketInstanceId] = new RetainedQueryData( + symbolBucket.bucketInstanceId, + bucketFeatureIndex, + symbolBucket.sourceLayerIndex, + symbolBucket.index, + tile.tileID + ); + + const parameters = { + bucket: symbolBucket, + layout, + posMatrix, + textLabelPlaneMatrix, + labelToScreenMatrix, + clippingData, + scale, + textPixelRatio, + holdingForFade: tile.holdingForFade(), + collisionBoxArray, + partiallyEvaluatedTextSize: ref_properties.evaluateSizeForZoom(symbolBucket.textSizeData, this.transform.zoom), + partiallyEvaluatedIconSize: ref_properties.evaluateSizeForZoom(symbolBucket.iconSizeData, this.transform.zoom), + collisionGroup: this.collisionGroups.get(symbolBucket.sourceID) + }; + + if (sortAcrossTiles) { + for (const range of symbolBucket.sortKeyRanges) { + const {sortKey, symbolInstanceStart, symbolInstanceEnd} = range; + results.push({sortKey, symbolInstanceStart, symbolInstanceEnd, parameters}); + } + } else { + results.push({ + symbolInstanceStart: 0, + symbolInstanceEnd: symbolBucket.symbolInstances.length, + parameters + }); + } } - /** - * Enables animation. The image will be copied from the canvas to the map on each frame. - * - * @method play - * @instance - * @memberof CanvasSource - */ + attemptAnchorPlacement(anchor , textBox , width , height , + textScale , rotateWithMap , pitchWithMap , textPixelRatio , + posMatrix , collisionGroup , textAllowOverlap , + symbolInstance , symbolIndex , bucket , + orientation , iconBox , textSize , iconSize ) { - /** - * Disables animation. The map will display a static copy of the canvas image. - * - * @method pause - * @instance - * @memberof CanvasSource - */ + const textOffset = [symbolInstance.textOffset0, symbolInstance.textOffset1]; + const shift = calculateVariableLayoutShift(anchor, width, height, textOffset, textScale); - load() { - this._loaded = true; - if (!this.canvas) { - this.canvas = (this.options.canvas instanceof transform.window.HTMLCanvasElement) ? - this.options.canvas : - transform.window.document.getElementById(this.options.canvas); - } - this.width = this.canvas.width; - this.height = this.canvas.height; + const placedGlyphBoxes = this.collisionIndex.placeCollisionBox( + bucket, textScale, textBox, offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), + textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); - if (this._hasInvalidDimensions()) { - this.fire(new transform.ErrorEvent(new Error('Canvas dimensions cannot be less than or equal to zero.'))); - return; + if (iconBox) { + const placedIconBoxes = this.collisionIndex.placeCollisionBox( + bucket, bucket.getSymbolInstanceIconSize(iconSize, this.transform.zoom, symbolIndex), + iconBox, offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), + textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); + if (placedIconBoxes.box.length === 0) return; } - this.play = function() { - this._playing = true; - this.map.triggerRepaint(); - }; + if (placedGlyphBoxes.box.length > 0) { + let prevAnchor; + // If this label was placed in the previous placement, record the anchor position + // to allow us to animate the transition + if (this.prevPlacement && + this.prevPlacement.variableOffsets[symbolInstance.crossTileID] && + this.prevPlacement.placements[symbolInstance.crossTileID] && + this.prevPlacement.placements[symbolInstance.crossTileID].text) { + prevAnchor = this.prevPlacement.variableOffsets[symbolInstance.crossTileID].anchor; + } + ref_properties.assert_1(symbolInstance.crossTileID !== 0); + this.variableOffsets[symbolInstance.crossTileID] = { + textOffset, + width, + height, + anchor, + textScale, + prevAnchor + }; + this.markUsedJustification(bucket, anchor, symbolInstance, orientation); - this.pause = function() { - if (this._playing) { - this.prepare(); - this._playing = false; + if (bucket.allowVerticalPlacement) { + this.markUsedOrientation(bucket, orientation, symbolInstance); + this.placedOrientations[symbolInstance.crossTileID] = orientation; } - }; - this._finishLoading(); + return {shift, placedGlyphBoxes}; + } } - /** - * Returns the HTML `canvas` element. - * - * @returns {HTMLCanvasElement} The HTML `canvas` element. - * @example - * // Assuming the following canvas is added to your page - * // - * map.addSource('canvas-source', { - * type: 'canvas', - * canvas: 'canvasID', - * coordinates: [ - * [91.4461, 21.5006], - * [100.3541, 21.5006], - * [100.3541, 13.9706], - * [91.4461, 13.9706] - * ] - * }); - * map.getSource('canvas-source').getCanvas(); // - */ - getCanvas() { - return this.canvas; - } + placeLayerBucketPart(bucketPart , seenCrossTileIDs , showCollisionBoxes , updateCollisionBoxIfNecessary ) { - onAdd(map ) { - this.map = map; - this.load(); - if (this.canvas) { - if (this.animate) this.play(); - } - } + const { + bucket, + layout, + posMatrix, + textLabelPlaneMatrix, + labelToScreenMatrix, + clippingData, + textPixelRatio, + holdingForFade, + collisionBoxArray, + partiallyEvaluatedTextSize, + partiallyEvaluatedIconSize, + collisionGroup + } = bucketPart.parameters; - onRemove() { - this.pause(); - } + const textOptional = layout.get('text-optional'); + const iconOptional = layout.get('icon-optional'); + const textAllowOverlap = layout.get('text-allow-overlap'); + const iconAllowOverlap = layout.get('icon-allow-overlap'); + const rotateWithMap = layout.get('text-rotation-alignment') === 'map'; + const pitchWithMap = layout.get('text-pitch-alignment') === 'map'; + const hasIconTextFit = layout.get('icon-text-fit') !== 'none'; + const zOrderByViewportY = layout.get('symbol-z-order') === 'viewport-y'; - /** - * 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} Returns itself to allow for method chaining. - */ + this.transform.setProjection(bucket.projection); - // setCoordinates inherited from ImageSource + // This logic is similar to the "defaultOpacityState" logic below in updateBucketOpacities + // If we know a symbol is always supposed to show, force it to be marked visible even if + // it wasn't placed into the collision index (because some or all of it was outside the range + // of the collision grid). + // There is a subtle edge case here we're accepting: + // Symbol A has text-allow-overlap: true, icon-allow-overlap: true, icon-optional: false + // A's icon is outside the grid, so doesn't get placed + // A's text would be inside grid, but doesn't get placed because of icon-optional: false + // We still show A because of the allow-overlap settings. + // Symbol B has allow-overlap: false, and gets placed where A's text would be + // On panning in, there is a short period when Symbol B and Symbol A will overlap + // This is the reverse of our normal policy of "fade in on pan", but should look like any other + // collision and hopefully not be too noticeable. + // See https://github.com/mapbox/mapbox-gl-js/issues/7172 + let alwaysShowText = textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || iconOptional); + let alwaysShowIcon = iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || textOptional); - prepare() { - let resize = false; - if (this.canvas.width !== this.width) { - this.width = this.canvas.width; - resize = true; + if (!bucket.collisionArrays && collisionBoxArray) { + bucket.deserializeCollisionBoxes(collisionBoxArray); } - if (this.canvas.height !== this.height) { - this.height = this.canvas.height; - resize = true; + + if (showCollisionBoxes && updateCollisionBoxIfNecessary) { + bucket.updateCollisionDebugBuffers(this.transform.zoom, collisionBoxArray); } - if (this._hasInvalidDimensions()) return; + const placeSymbol = (symbolInstance , symbolIndex , collisionArrays ) => { + if (clippingData) { + // Setup globals + const globals = { + zoom: this.transform.zoom, + pitch: this.transform.pitch, + }; - if (Object.keys(this.tiles).length === 0) return; // not enough data for current position + // Deserialize feature only if necessary + let feature = null; + if (clippingData.dynamicFilterNeedsFeature) { + const featureIndex = clippingData.featureIndex; + const retainedQueryData = this.retainedQueryData[bucket.bucketInstanceId]; + feature = featureIndex.loadFeature({ + featureIndex: symbolInstance.featureIndex, + bucketIndex: retainedQueryData.bucketIndex, + sourceLayerIndex: retainedQueryData.sourceLayerIndex, + layoutVertexArrayOffset: 0 + }); + } + const canonicalTileId = this.retainedQueryData[bucket.bucketInstanceId].tileID.canonical; - const context = this.map.painter.context; - const gl = context.gl; + const filterFunc = clippingData.dynamicFilter; + const shouldClip = !filterFunc(globals, feature, canonicalTileId, new ref_properties.pointGeometry(symbolInstance.tileAnchorX, symbolInstance.tileAnchorY), this.transform.calculateDistanceTileData(clippingData.unwrappedTileID)); - if (!this._boundsArray) { - this._makeBoundsArray(); - } + if (shouldClip) { + this.placements[symbolInstance.crossTileID] = new JointPlacement(false, false, false, true); + seenCrossTileIDs[symbolInstance.crossTileID] = true; + return; + } + } - if (!this.boundsBuffer) { - this.boundsBuffer = context.createVertexBuffer(this._boundsArray, transform.boundsAttributes.members); - } + if (seenCrossTileIDs[symbolInstance.crossTileID]) return; + if (holdingForFade) { + // Mark all symbols from this tile as "not placed", but don't add to seenCrossTileIDs, because we don't + // know yet if we have a duplicate in a parent tile that _should_ be placed. + this.placements[symbolInstance.crossTileID] = new JointPlacement(false, false, false); + return; + } + let placeText = false; + let placeIcon = false; + let offscreen = true; + let textOccluded = false; + let iconOccluded = false; + let shift = null; - if (!this.boundsSegments) { - this.boundsSegments = transform.SegmentVector.simpleSegment(0, 0, 4, 2); - } + let placed = {box: null, offscreen: null, occluded: null}; + let placedVerticalText = {box: null, offscreen: null, occluded: null}; - if (!this.texture) { - this.texture = new transform.Texture(context, this.canvas, gl.RGBA, {premultiply: true}); - } else if (resize || this._playing) { - this.texture.update(this.canvas, {premultiply: true}); - } + let placedGlyphBoxes = null; + let placedGlyphCircles = null; + let placedIconBoxes = null; + let textFeatureIndex = 0; + let verticalTextFeatureIndex = 0; + let iconFeatureIndex = 0; - for (const w in this.tiles) { - const tile = this.tiles[w]; - if (tile.state !== 'loaded') { - tile.state = 'loaded'; - tile.texture = this.texture; + if (collisionArrays.textFeatureIndex) { + textFeatureIndex = collisionArrays.textFeatureIndex; + } else if (symbolInstance.useRuntimeCollisionCircles) { + textFeatureIndex = symbolInstance.featureIndex; + } + if (collisionArrays.verticalTextFeatureIndex) { + verticalTextFeatureIndex = collisionArrays.verticalTextFeatureIndex; } - } - } - serialize() { - return { - type: 'canvas', - coordinates: this.coordinates - }; - } + const updateBoxData = (box ) => { + box.tileID = this.retainedQueryData[bucket.bucketInstanceId].tileID; + if (!this.transform.elevation && !box.elevation) return; + box.elevation = this.transform.elevation ? this.transform.elevation.getAtTileOffset( + this.retainedQueryData[bucket.bucketInstanceId].tileID, + box.tileAnchorX, box.tileAnchorY) : 0; + }; - hasTransition() { - return this._playing; - } + const textBox = collisionArrays.textBox; + if (textBox) { + updateBoxData(textBox); + const updatePreviousOrientationIfNotPlaced = (isPlaced) => { + let previousOrientation = ref_properties.WritingMode.horizontal; + if (bucket.allowVerticalPlacement && !isPlaced && this.prevPlacement) { + const prevPlacedOrientation = this.prevPlacement.placedOrientations[symbolInstance.crossTileID]; + if (prevPlacedOrientation) { + this.placedOrientations[symbolInstance.crossTileID] = prevPlacedOrientation; + previousOrientation = prevPlacedOrientation; + this.markUsedOrientation(bucket, previousOrientation, symbolInstance); + } + } + return previousOrientation; + }; - _hasInvalidDimensions() { - for (const x of [this.canvas.width, this.canvas.height]) { - if (isNaN(x) || x <= 0) return true; - } - return false; - } -} + const placeTextForPlacementModes = (placeHorizontalFn, placeVerticalFn) => { + if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && collisionArrays.verticalTextBox) { + for (const placementMode of bucket.writingModes) { + if (placementMode === ref_properties.WritingMode.vertical) { + placed = placeVerticalFn(); + placedVerticalText = placed; + } else { + placed = placeHorizontalFn(); + } + if (placed && placed.box && placed.box.length) break; + } + } else { + placed = placeHorizontalFn(); + } + }; -// + if (!layout.get('text-variable-anchor')) { + const placeBox = (collisionTextBox, orientation) => { + const textScale = bucket.getSymbolInstanceTextSize(partiallyEvaluatedTextSize, symbolInstance, this.transform.zoom, symbolIndex); + const placedFeature = this.collisionIndex.placeCollisionBox(bucket, textScale, collisionTextBox, + new ref_properties.pointGeometry(0, 0), textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); + if (placedFeature && placedFeature.box && placedFeature.box.length) { + this.markUsedOrientation(bucket, orientation, symbolInstance); + this.placedOrientations[symbolInstance.crossTileID] = orientation; + } + return placedFeature; + }; - + const placeHorizontal = () => { + return placeBox(textBox, ref_properties.WritingMode.horizontal); + }; -const sourceTypes = { - vector: VectorTileSource, - raster: RasterTileSource, - 'raster-dem': RasterDEMTileSource, - geojson: GeoJSONSource, - video: VideoSource, - image: ImageSource, - canvas: CanvasSource -}; + const placeVertical = () => { + const verticalTextBox = collisionArrays.verticalTextBox; + if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) { + updateBoxData(verticalTextBox); + return placeBox(verticalTextBox, ref_properties.WritingMode.vertical); + } + return {box: null, offscreen: null, occluded: null}; + }; -/* - * 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} - */ -const create = function(id , specification , dispatcher , eventedParent ) { - const source = new sourceTypes[specification.type](id, (specification ), dispatcher, eventedParent); + placeTextForPlacementModes(placeHorizontal, placeVertical); + updatePreviousOrientationIfNotPlaced(placed && placed.box && placed.box.length); - if (source.id !== id) { - throw new Error(`Expected Source id to be ${id} instead of ${source.id}`); - } + } else { + let anchors = layout.get('text-variable-anchor'); - transform.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source); - return source; -}; + // If this symbol was in the last placement, shift the previously used + // anchor to the front of the anchor list, only if the previous anchor + // is still in the anchor list + if (this.prevPlacement && this.prevPlacement.variableOffsets[symbolInstance.crossTileID]) { + const prevOffsets = this.prevPlacement.variableOffsets[symbolInstance.crossTileID]; + if (anchors.indexOf(prevOffsets.anchor) > 0) { + anchors = anchors.filter(anchor => anchor !== prevOffsets.anchor); + anchors.unshift(prevOffsets.anchor); + } + } -const getType = function (name ) { - return sourceTypes[name]; -}; + const placeBoxForVariableAnchors = (collisionTextBox, collisionIconBox, orientation) => { + const textScale = bucket.getSymbolInstanceTextSize(partiallyEvaluatedTextSize, symbolInstance, this.transform.zoom, symbolIndex); + const width = (collisionTextBox.x2 - collisionTextBox.x1) * textScale + 2.0 * collisionTextBox.padding; + const height = (collisionTextBox.y2 - collisionTextBox.y1) * textScale + 2.0 * collisionTextBox.padding; -const setType = function (name , type ) { - sourceTypes[name] = type; -}; + const variableIconBox = hasIconTextFit && !iconAllowOverlap ? collisionIconBox : null; + if (variableIconBox) updateBoxData(variableIconBox); -// + let placedBox = {box: [], offscreen: false, occluded: false}; + const placementAttempts = textAllowOverlap ? anchors.length * 2 : anchors.length; + for (let i = 0; i < placementAttempts; ++i) { + const anchor = anchors[i % anchors.length]; + const allowOverlap = (i >= anchors.length); + const result = this.attemptAnchorPlacement( + anchor, collisionTextBox, width, height, textScale, rotateWithMap, + pitchWithMap, textPixelRatio, posMatrix, collisionGroup, allowOverlap, + symbolInstance, symbolIndex, bucket, orientation, variableIconBox, + partiallyEvaluatedTextSize, partiallyEvaluatedIconSize); -/* - * Returns a matrix that can be used to convert from tile coordinates to viewport pixel coordinates. - */ -function getPixelPosMatrix(transform$1, tileID) { - const t = transform.identity([]); - transform.scale(t, t, [transform$1.width * 0.5, -transform$1.height * 0.5, 1]); - transform.translate(t, t, [1, -1, 0]); - return transform.multiply$1(t, t, transform$1.calculateProjMatrix(tileID.toUnwrapped())); -} + if (result) { + placedBox = result.placedGlyphBoxes; + if (placedBox && placedBox.box && placedBox.box.length) { + placeText = true; + shift = result.shift; + break; + } + } + } -function queryRenderedFeatures(sourceCache , - styleLayers , - serializedLayers , - queryGeometry , - params , - transform , - use3DQuery , - visualizeQueryGeometry = false) { - const tileResults = sourceCache.tilesIn(queryGeometry, use3DQuery, visualizeQueryGeometry); - tileResults.sort(sortTilesIn); - const renderedFeatureLayers = []; - for (const tileResult of tileResults) { - renderedFeatureLayers.push({ - wrappedTileID: tileResult.tile.tileID.wrapped().key, - queryResults: tileResult.tile.queryRenderedFeatures( - styleLayers, - serializedLayers, - sourceCache._state, - tileResult, - params, - transform, - getPixelPosMatrix(sourceCache.transform, tileResult.tile.tileID), - visualizeQueryGeometry) - }); - } + return placedBox; + }; + + const placeHorizontal = () => { + return placeBoxForVariableAnchors(textBox, collisionArrays.iconBox, ref_properties.WritingMode.horizontal); + }; + + const placeVertical = () => { + const verticalTextBox = collisionArrays.verticalTextBox; + if (verticalTextBox) updateBoxData(verticalTextBox); + const wasPlaced = placed && placed.box && placed.box.length; + if (bucket.allowVerticalPlacement && !wasPlaced && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) { + return placeBoxForVariableAnchors(verticalTextBox, collisionArrays.verticalIconBox, ref_properties.WritingMode.vertical); + } + return {box: null, offscreen: null, occluded: null}; + }; - const result = mergeRenderedFeatureLayers(renderedFeatureLayers); + placeTextForPlacementModes(placeHorizontal, placeVertical); - // Merge state from SourceCache into the results - for (const layerID in result) { - result[layerID].forEach((featureWrapper) => { - const feature = featureWrapper.feature; - const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id); - feature.source = feature.layer.source; - if (feature.layer['source-layer']) { - feature.sourceLayer = feature.layer['source-layer']; - } - feature.state = state; - }); - } - return result; -} + if (placed) { + placeText = placed.box; + offscreen = placed.offscreen; + textOccluded = placed.occluded; + } -function queryRenderedSymbols(styleLayers , - serializedLayers , - getLayerSourceCache , - queryGeometry , - params , - collisionIndex , - retainedQueryData ) { - const result = {}; - const renderedSymbols = collisionIndex.queryRenderedSymbols(queryGeometry); - const bucketQueryData = []; - for (const bucketInstanceId of Object.keys(renderedSymbols).map(Number)) { - bucketQueryData.push(retainedQueryData[bucketInstanceId]); - } - bucketQueryData.sort(sortTilesIn); + const prevOrientation = updatePreviousOrientationIfNotPlaced(placed && placed.box); - for (const queryData of bucketQueryData) { - const bucketSymbols = queryData.featureIndex.lookupSymbolFeatures( - renderedSymbols[queryData.bucketInstanceId], - serializedLayers, - queryData.bucketIndex, - queryData.sourceLayerIndex, - params.filter, - params.layers, - params.availableImages, - styleLayers); + // If we didn't get placed, we still need to copy our position from the last placement for + // fade animations + if (!placeText && this.prevPlacement) { + const prevOffset = this.prevPlacement.variableOffsets[symbolInstance.crossTileID]; + if (prevOffset) { + this.variableOffsets[symbolInstance.crossTileID] = prevOffset; + this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, prevOrientation); + } + } - for (const layerID in bucketSymbols) { - const resultFeatures = result[layerID] = result[layerID] || []; - const layerSymbols = bucketSymbols[layerID]; - layerSymbols.sort((a, b) => { - // Match topDownFeatureComparator from FeatureIndex, but using - // most recent sorting of features from bucket.sortFeatures - const featureSortOrder = queryData.featureSortOrder; - if (featureSortOrder) { - // queryRenderedSymbols documentation says we'll return features in - // "top-to-bottom" rendering order (aka last-to-first). - // Actually there can be multiple symbol instances per feature, so - // we sort each feature based on the first matching symbol instance. - const sortedA = featureSortOrder.indexOf(a.featureIndex); - const sortedB = featureSortOrder.indexOf(b.featureIndex); - transform.assert_1(sortedA >= 0); - transform.assert_1(sortedB >= 0); - return sortedB - sortedA; - } else { - // Bucket hasn't been re-sorted based on angle, so use the - // reverse of the order the features appeared in the data. - return b.featureIndex - a.featureIndex; } - }); - for (const symbolFeature of layerSymbols) { - resultFeatures.push(symbolFeature); } - } - } - // Merge state from SourceCache into the results - for (const layerName in result) { - result[layerName].forEach((featureWrapper) => { - const feature = featureWrapper.feature; - const layer = styleLayers[layerName]; - const sourceCache = getLayerSourceCache(layer); - const state = sourceCache.getFeatureState(feature.layer['source-layer'], feature.id); - feature.source = feature.layer.source; - if (feature.layer['source-layer']) { - feature.sourceLayer = feature.layer['source-layer']; - } - feature.state = state; - }); - } - return result; -} + placedGlyphBoxes = placed; -function querySourceFeatures(sourceCache , params ) { - const tiles = sourceCache.getRenderableIds().map((id) => { - return sourceCache.getTileByID(id); - }); + placeText = placedGlyphBoxes && placedGlyphBoxes.box && placedGlyphBoxes.box.length > 0; + offscreen = placedGlyphBoxes && placedGlyphBoxes.offscreen; + textOccluded = placedGlyphBoxes && placedGlyphBoxes.occluded; - const result = []; + if (symbolInstance.useRuntimeCollisionCircles) { + const placedSymbolIndex = symbolInstance.centerJustifiedTextSymbolIndex >= 0 ? symbolInstance.centerJustifiedTextSymbolIndex : symbolInstance.verticalPlacedTextSymbolIndex; + const placedSymbol = bucket.text.placedSymbolArray.get(placedSymbolIndex); + const fontSize = ref_properties.evaluateSizeForFeature(bucket.textSizeData, partiallyEvaluatedTextSize, placedSymbol); - const dataTiles = {}; - for (let i = 0; i < tiles.length; i++) { - const tile = tiles[i]; - const dataID = tile.tileID.canonical.key; - if (!dataTiles[dataID]) { - dataTiles[dataID] = true; - tile.querySourceFeatures(result, params); - } - } + const textPixelPadding = layout.get('text-padding'); + // Convert circle collision height into pixels + const circlePixelDiameter = symbolInstance.collisionCircleDiameter * fontSize / ref_properties.ONE_EM; - return result; -} + placedGlyphCircles = this.collisionIndex.placeCollisionCircles( + bucket, + textAllowOverlap, + placedSymbol, + bucket.lineVertexArray, + bucket.glyphOffsetArray, + fontSize, + posMatrix, + textLabelPlaneMatrix, + labelToScreenMatrix, + showCollisionBoxes, + pitchWithMap, + collisionGroup.predicate, + circlePixelDiameter, + textPixelPadding, + this.retainedQueryData[bucket.bucketInstanceId].tileID); -function sortTilesIn(a, b) { - const idA = a.tileID; - const idB = b.tileID; - return (idA.overscaledZ - idB.overscaledZ) || (idA.canonical.y - idB.canonical.y) || (idA.wrap - idB.wrap) || (idA.canonical.x - idB.canonical.x); -} + ref_properties.assert_1(!placedGlyphCircles.circles.length || (!placedGlyphCircles.collisionDetected || showCollisionBoxes)); + // 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 = textAllowOverlap || (placedGlyphCircles.circles.length > 0 && !placedGlyphCircles.collisionDetected); + offscreen = offscreen && placedGlyphCircles.offscreen; + textOccluded = placedGlyphCircles.occluded; + } -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 - const result = {}; - const wrappedIDLayerMap = {}; - for (const tile of tiles) { - const queryResults = tile.queryResults; - const wrappedID = tile.wrappedTileID; - const wrappedIDLayers = wrappedIDLayerMap[wrappedID] = wrappedIDLayerMap[wrappedID] || {}; - for (const layerID in queryResults) { - const tileFeatures = queryResults[layerID]; - const wrappedIDFeatures = wrappedIDLayers[layerID] = wrappedIDLayers[layerID] || {}; - const resultFeatures = result[layerID] = result[layerID] || []; - for (const tileFeature of tileFeatures) { - if (!wrappedIDFeatures[tileFeature.featureIndex]) { - wrappedIDFeatures[tileFeature.featureIndex] = true; - resultFeatures.push(tileFeature); - } + if (collisionArrays.iconFeatureIndex) { + iconFeatureIndex = collisionArrays.iconFeatureIndex; } - } - } - return result; -} -// + if (collisionArrays.iconBox) { - + const placeIconFeature = iconBox => { + updateBoxData(iconBox); + const shiftPoint = hasIconTextFit && shift ? + offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle) : + new ref_properties.pointGeometry(0, 0); + const iconScale = bucket.getSymbolInstanceIconSize(partiallyEvaluatedIconSize, this.transform.zoom, symbolIndex); + return this.collisionIndex.placeCollisionBox(bucket, iconScale, iconBox, shiftPoint, + iconAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); + }; -function WebWorker () { - return (exported.workerClass != null) ? new exported.workerClass() : (new transform.window.Worker(exported.workerUrl) ); // eslint-disable-line new-cap -} + if (placedVerticalText && placedVerticalText.box && placedVerticalText.box.length && collisionArrays.verticalIconBox) { + placedIconBoxes = placeIconFeature(collisionArrays.verticalIconBox); + placeIcon = placedIconBoxes.box.length > 0; + } else { + placedIconBoxes = placeIconFeature(collisionArrays.iconBox); + placeIcon = placedIconBoxes.box.length > 0; + } + offscreen = offscreen && placedIconBoxes.offscreen; + iconOccluded = placedIconBoxes.occluded; + } -// - + const iconWithoutText = textOptional || + (symbolInstance.numHorizontalGlyphVertices === 0 && symbolInstance.numVerticalGlyphVertices === 0); + const textWithoutIcon = iconOptional || symbolInstance.numIconVertices === 0; -const PRELOAD_POOL_ID = 'mapboxgl_preloaded_worker_pool'; + // 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; + } -/** - * Constructs a worker pool. - * @private - */ -class WorkerPool { - + if (placeText && placedGlyphBoxes && placedGlyphBoxes.box) { + if (placedVerticalText && placedVerticalText.box && verticalTextFeatureIndex) { + this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), + bucket.bucketInstanceId, verticalTextFeatureIndex, collisionGroup.ID); + } else { + this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), + bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); + } - - + } + if (placeIcon && placedIconBoxes) { + this.collisionIndex.insertCollisionBox(placedIconBoxes.box, layout.get('icon-ignore-placement'), + bucket.bucketInstanceId, iconFeatureIndex, collisionGroup.ID); + } + if (placedGlyphCircles) { + if (placeText) { + this.collisionIndex.insertCollisionCircles(placedGlyphCircles.circles, layout.get('text-ignore-placement'), + bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); + } - constructor() { - this.active = {}; - } + if (showCollisionBoxes) { + const id = bucket.bucketInstanceId; + let circleArray = this.collisionCircleArrays[id]; - acquire(mapId ) { - if (!this.workers) { - // Lazily look up the value of mapboxgl.workerCount so that - // client code has had a chance to set it. - this.workers = []; - while (this.workers.length < WorkerPool.workerCount) { - this.workers.push(new WebWorker()); - } - } + // Group collision circles together by bucket. Circles can't be pushed forward for rendering yet as the symbol placement + // for a bucket is not guaranteed to be complete before the commit-function has been called + if (circleArray === undefined) + circleArray = this.collisionCircleArrays[id] = new CollisionCircleArray(); - this.active[mapId] = true; - return this.workers.slice(); - } + for (let i = 0; i < placedGlyphCircles.circles.length; i += 4) { + circleArray.circles.push(placedGlyphCircles.circles[i + 0]); // x + circleArray.circles.push(placedGlyphCircles.circles[i + 1]); // y + circleArray.circles.push(placedGlyphCircles.circles[i + 2]); // radius + circleArray.circles.push(placedGlyphCircles.collisionDetected ? 1 : 0); // collisionDetected-flag + } + } + } - release(mapId ) { - delete this.active[mapId]; - if (this.numActive() === 0) { - this.workers.forEach((w) => { - w.terminate(); - }); - this.workers = (null ); - } - } + ref_properties.assert_1(symbolInstance.crossTileID !== 0); + ref_properties.assert_1(bucket.bucketInstanceId !== 0); - isPreloaded() { - return !!this.active[PRELOAD_POOL_ID]; - } + const notGlobe = bucket.projection.name !== 'globe'; + alwaysShowText = alwaysShowText && (notGlobe || !textOccluded); + alwaysShowIcon = alwaysShowIcon && (notGlobe || !iconOccluded); - numActive() { - return Object.keys(this.active).length; - } -} + this.placements[symbolInstance.crossTileID] = new JointPlacement(placeText || alwaysShowText, placeIcon || alwaysShowIcon, offscreen || bucket.justReloaded); + seenCrossTileIDs[symbolInstance.crossTileID] = true; + }; -// extensive benchmarking showed 2 to be the best default for both desktop and mobile devices; -// we can't rely on hardwareConcurrency because of wild inconsistency of reported numbers between browsers -WorkerPool.workerCount = 2; + if (zOrderByViewportY) { + ref_properties.assert_1(bucketPart.symbolInstanceStart === 0); + const symbolIndexes = bucket.getSortedSymbolIndexes(this.transform.angle); + for (let i = symbolIndexes.length - 1; i >= 0; --i) { + const symbolIndex = symbolIndexes[i]; + placeSymbol(bucket.symbolInstances.get(symbolIndex), symbolIndex, bucket.collisionArrays[symbolIndex]); + } + } else { + for (let i = bucketPart.symbolInstanceStart; i < bucketPart.symbolInstanceEnd; i++) { + placeSymbol(bucket.symbolInstances.get(i), i, bucket.collisionArrays[i]); + } + } -// + if (showCollisionBoxes && bucket.bucketInstanceId in this.collisionCircleArrays) { + const circleArray = this.collisionCircleArrays[bucket.bucketInstanceId]; -let globalWorkerPool; + // Store viewport and inverse projection matrices per bucket + ref_properties.invert$1(circleArray.invProjMatrix, posMatrix); + circleArray.viewportMatrix = this.collisionIndex.getViewportMatrix(); + } -/** - * Creates (if necessary) and returns the single, global WorkerPool instance - * to be shared across each Map - * @private - */ -function getGlobalWorkerPool () { - if (!globalWorkerPool) { - globalWorkerPool = new WorkerPool(); + bucket.justReloaded = false; } - return globalWorkerPool; -} -function prewarm() { - const workerPool = getGlobalWorkerPool(); - workerPool.acquire(PRELOAD_POOL_ID); -} + markUsedJustification(bucket , placedAnchor , symbolInstance , orientation ) { + const justifications = { + "left": symbolInstance.leftJustifiedTextSymbolIndex, + "center": symbolInstance.centerJustifiedTextSymbolIndex, + "right": symbolInstance.rightJustifiedTextSymbolIndex + }; -function clearPrewarmedResources() { - const pool = globalWorkerPool; - if (pool) { - // Remove the pool only if all maps that referenced the preloaded global worker pool have been removed. - if (pool.isPreloaded() && pool.numActive() === 1) { - pool.release(PRELOAD_POOL_ID); - globalWorkerPool = null; + let autoIndex; + if (orientation === ref_properties.WritingMode.vertical) { + autoIndex = symbolInstance.verticalPlacedTextSymbolIndex; } else { - console.warn('Could not clear WebWorkers since there are active Map instances that still reference it. The pre-warmed WebWorker pool can only be cleared when all map instances have been removed with map.remove()'); + autoIndex = justifications[ref_properties.getAnchorJustification(placedAnchor)]; } - } -} -function deref(layer, parent) { - const result = {}; + const indexes = [ + symbolInstance.leftJustifiedTextSymbolIndex, + symbolInstance.centerJustifiedTextSymbolIndex, + symbolInstance.rightJustifiedTextSymbolIndex, + symbolInstance.verticalPlacedTextSymbolIndex + ]; - for (const k in layer) { - if (k !== 'ref') { - result[k] = layer[k]; + for (const index of indexes) { + if (index >= 0) { + if (autoIndex >= 0 && index !== autoIndex) { + // There are multiple justifications and this one isn't it: shift offscreen + bucket.text.placedSymbolArray.get(index).crossTileID = 0; + } else { + // Either this is the chosen justification or the justification is hardwired: use this one + bucket.text.placedSymbolArray.get(index).crossTileID = symbolInstance.crossTileID; + } + } } } - transform.refProperties.forEach((k) => { - if (k in parent) { - result[k] = parent[k]; - } - }); - - return result; -} + markUsedOrientation(bucket , orientation , symbolInstance ) { + const horizontal = (orientation === ref_properties.WritingMode.horizontal || orientation === ref_properties.WritingMode.horizontalOnly) ? orientation : 0; + const vertical = orientation === ref_properties.WritingMode.vertical ? orientation : 0; -/** - * 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(); + const horizontalIndexes = [ + symbolInstance.leftJustifiedTextSymbolIndex, + symbolInstance.centerJustifiedTextSymbolIndex, + symbolInstance.rightJustifiedTextSymbolIndex + ]; - const map = Object.create(null); - for (let i = 0; i < layers.length; i++) { - map[layers[i].id] = layers[i]; - } + for (const index of horizontalIndexes) { + bucket.text.placedSymbolArray.get(index).placedOrientation = horizontal; + } - for (let i = 0; i < layers.length; i++) { - if ('ref' in layers[i]) { - layers[i] = deref(layers[i], map[layers[i].ref]); + if (symbolInstance.verticalPlacedTextSymbolIndex) { + bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).placedOrientation = vertical; } } - return layers; -} + commit(now ) { + this.commitTime = now; + this.zoomAtLastRecencyCheck = this.transform.zoom; -function emptyStyle() { - const style = {}; + const prevPlacement = this.prevPlacement; + let placementChanged = false; - const version = transform.spec['$version']; - for (const styleKey in transform.spec['$root']) { - const spec = transform.spec['$root'][styleKey]; + this.prevZoomAdjustment = prevPlacement ? prevPlacement.zoomAdjustment(this.transform.zoom) : 0; + const increment = prevPlacement ? prevPlacement.symbolFadeChange(now) : 1; - if (spec.required) { - let value = null; - if (styleKey === 'version') { - value = version; + const prevOpacities = prevPlacement ? prevPlacement.opacities : {}; + const prevOffsets = prevPlacement ? prevPlacement.variableOffsets : {}; + const prevOrientations = prevPlacement ? prevPlacement.placedOrientations : {}; + + // add the opacities from the current placement, and copy their current values from the previous placement + for (const crossTileID in this.placements) { + const jointPlacement = this.placements[crossTileID]; + const prevOpacity = prevOpacities[crossTileID]; + if (prevOpacity) { + this.opacities[crossTileID] = new JointOpacityState(prevOpacity, increment, jointPlacement.text, jointPlacement.icon, null, jointPlacement.clipped); + placementChanged = placementChanged || + jointPlacement.text !== prevOpacity.text.placed || + jointPlacement.icon !== prevOpacity.icon.placed; } else { - if (spec.type === 'array') { - value = []; - } else { - value = {}; - } + this.opacities[crossTileID] = new JointOpacityState(null, increment, jointPlacement.text, jointPlacement.icon, jointPlacement.skipFade, jointPlacement.clipped); + placementChanged = placementChanged || jointPlacement.text || jointPlacement.icon; } + } - if (value != null) { - style[styleKey] = value; + // copy and update values from the previous placement that aren't in the current placement but haven't finished fading + for (const crossTileID in prevOpacities) { + const prevOpacity = prevOpacities[crossTileID]; + if (!this.opacities[crossTileID]) { + const jointOpacity = new JointOpacityState(prevOpacity, increment, false, false); + if (!jointOpacity.isHidden()) { + this.opacities[crossTileID] = jointOpacity; + placementChanged = placementChanged || prevOpacity.text.placed || prevOpacity.icon.placed; + } + } + } + for (const crossTileID in prevOffsets) { + if (!this.variableOffsets[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) { + this.variableOffsets[crossTileID] = prevOffsets[crossTileID]; } } - } - - return style; -} - -const 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', + for (const crossTileID in prevOrientations) { + if (!this.placedOrientations[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) { + this.placedOrientations[crossTileID] = prevOrientations[crossTileID]; + } + } - /* - * { command: 'setLayoutProperty', args: ['layerId', 'prop', value] } - */ - setLayoutProperty: 'setLayoutProperty', + // 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 + ref_properties.assert_1(!prevPlacement || prevPlacement.lastPlacementChangeTime !== undefined); + if (placementChanged) { + this.lastPlacementChangeTime = now; + } else if (typeof this.lastPlacementChangeTime !== 'number') { + this.lastPlacementChangeTime = prevPlacement ? prevPlacement.lastPlacementChangeTime : now; + } + } - /* - * { command: 'setFilter', args: ['layerId', filter] } - */ - setFilter: 'setFilter', + updateLayerOpacities(styleLayer , tiles ) { + const seenCrossTileIDs = {}; + for (const tile of tiles) { + const symbolBucket = ((tile.getBucket(styleLayer) ) ); + if (symbolBucket && tile.latestFeatureIndex && styleLayer.id === symbolBucket.layerIds[0]) { + this.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray); + } + } + } - /* - * { command: 'addSource', args: ['sourceId', source] } - */ - addSource: 'addSource', + updateBucketOpacities(bucket , seenCrossTileIDs , collisionBoxArray ) { + if (bucket.hasTextData()) bucket.text.opacityVertexArray.clear(); + if (bucket.hasIconData()) bucket.icon.opacityVertexArray.clear(); + if (bucket.hasIconCollisionBoxData()) bucket.iconCollisionBox.collisionVertexArray.clear(); + if (bucket.hasTextCollisionBoxData()) bucket.textCollisionBox.collisionVertexArray.clear(); - /* - * { command: 'removeSource', args: ['sourceId'] } - */ - removeSource: 'removeSource', + const layout = bucket.layers[0].layout; + const hasClipping = !!bucket.layers[0].dynamicFilter(); + const duplicateOpacityState = new JointOpacityState(null, 0, false, false, true); + const textAllowOverlap = layout.get('text-allow-overlap'); + const iconAllowOverlap = layout.get('icon-allow-overlap'); + const variablePlacement = layout.get('text-variable-anchor'); + const rotateWithMap = layout.get('text-rotation-alignment') === 'map'; + const pitchWithMap = layout.get('text-pitch-alignment') === 'map'; + const hasIconTextFit = layout.get('icon-text-fit') !== 'none'; + // If allow-overlap is true, we can show symbols before placement runs on them + // But we have to wait for placement if we potentially depend on a paired icon/text + // with allow-overlap: false. + // See https://github.com/mapbox/mapbox-gl-js/issues/7032 + const defaultOpacityState = new JointOpacityState(null, 0, + textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')), + iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')), + true); - /* - * { command: 'setGeoJSONSourceData', args: ['sourceId', data] } - */ - setGeoJSONSourceData: 'setGeoJSONSourceData', + if (!bucket.collisionArrays && collisionBoxArray && ((bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()))) { + bucket.deserializeCollisionBoxes(collisionBoxArray); + } - /* - * { command: 'setLayerZoomRange', args: ['layerId', 0, 22] } - */ - setLayerZoomRange: 'setLayerZoomRange', + const addOpacities = (iconOrText, numVertices , opacity ) => { + for (let i = 0; i < numVertices / 4; i++) { + iconOrText.opacityVertexArray.emplaceBack(opacity); + } + }; - /* - * { command: 'setLayerProperty', args: ['layerId', 'prop', value] } - */ - setLayerProperty: 'setLayerProperty', + let visibleInstanceCount = 0; - /* - * { command: 'setCenter', args: [[lon, lat]] } - */ - setCenter: 'setCenter', + for (let s = 0; s < bucket.symbolInstances.length; s++) { + const symbolInstance = bucket.symbolInstances.get(s); + const { + numHorizontalGlyphVertices, + numVerticalGlyphVertices, + crossTileID + } = symbolInstance; - /* - * { command: 'setZoom', args: [zoom] } - */ - setZoom: 'setZoom', + const isDuplicate = seenCrossTileIDs[crossTileID]; - /* - * { command: 'setBearing', args: [bearing] } - */ - setBearing: 'setBearing', + let opacityState = this.opacities[crossTileID]; + if (isDuplicate) { + opacityState = duplicateOpacityState; + } else if (!opacityState) { + opacityState = defaultOpacityState; + // store the state so that future placements use it as a starting point + this.opacities[crossTileID] = opacityState; + } - /* - * { command: 'setPitch', args: [pitch] } - */ - setPitch: 'setPitch', + seenCrossTileIDs[crossTileID] = true; - /* - * { command: 'setSprite', args: ['spriteUrl'] } - */ - setSprite: 'setSprite', + const hasText = numHorizontalGlyphVertices > 0 || numVerticalGlyphVertices > 0; + const hasIcon = symbolInstance.numIconVertices > 0; - /* - * { command: 'setGlyphs', args: ['glyphsUrl'] } - */ - setGlyphs: 'setGlyphs', + const placedOrientation = this.placedOrientations[symbolInstance.crossTileID]; + const horizontalHidden = placedOrientation === ref_properties.WritingMode.vertical; + const verticalHidden = placedOrientation === ref_properties.WritingMode.horizontal || placedOrientation === ref_properties.WritingMode.horizontalOnly; + if ((hasText || hasIcon) && !opacityState.isHidden()) visibleInstanceCount++; - /* - * { command: 'setTransition', args: [transition] } - */ - setTransition: 'setTransition', + if (hasText) { + const 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 + const horizontalOpacity = horizontalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity; + addOpacities(bucket.text, numHorizontalGlyphVertices, horizontalOpacity); + const verticalOpacity = verticalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity; + addOpacities(bucket.text, numVerticalGlyphVertices, verticalOpacity); - /* - * { command: 'setLighting', args: [lightProperties] } - */ - setLight: 'setLight', + // If this label is completely faded, mark it so that we don't have to calculate + // its position at render time. If this layer has variable placement, shift the various + // symbol instances appropriately so that symbols from buckets that have yet to be placed + // offset appropriately. + const symbolHidden = opacityState.text.isHidden(); + [ + symbolInstance.rightJustifiedTextSymbolIndex, + symbolInstance.centerJustifiedTextSymbolIndex, + symbolInstance.leftJustifiedTextSymbolIndex + ].forEach(index => { + if (index >= 0) { + bucket.text.placedSymbolArray.get(index).hidden = symbolHidden || horizontalHidden ? 1 : 0; + } + }); - /* - * { command: 'setTerrain', args: [terrainProperties] } - */ - setTerrain: 'setTerrain', + if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) { + bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).hidden = symbolHidden || verticalHidden ? 1 : 0; + } - /* - * { command: 'setFog', args: [fogProperties] } - */ - setFog: 'setFog', + const prevOffset = this.variableOffsets[symbolInstance.crossTileID]; + if (prevOffset) { + this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, placedOrientation); + } - /* - * { command: 'setProjection', args: [projectionProperties] } - */ - setProjection: 'setProjection' -}; + const prevOrientation = this.placedOrientations[symbolInstance.crossTileID]; + if (prevOrientation) { + this.markUsedJustification(bucket, 'left', symbolInstance, prevOrientation); + this.markUsedOrientation(bucket, prevOrientation, symbolInstance); + } + } -function addSource(sourceId, after, commands) { - commands.push({command: operations.addSource, args: [sourceId, after[sourceId]]}); -} + if (hasIcon) { + const packedOpacity = packOpacity(opacityState.icon); -function removeSource(sourceId, commands, sourcesRemoved) { - commands.push({command: operations.removeSource, args: [sourceId]}); - sourcesRemoved[sourceId] = true; -} + if (symbolInstance.placedIconSymbolIndex >= 0) { + const horizontalOpacity = !horizontalHidden ? packedOpacity : PACKED_HIDDEN_OPACITY; + addOpacities(bucket.icon, symbolInstance.numIconVertices, horizontalOpacity); + bucket.icon.placedSymbolArray.get(symbolInstance.placedIconSymbolIndex).hidden = + (opacityState.icon.isHidden() ); + } -function updateSource(sourceId, after, commands, sourcesRemoved) { - removeSource(sourceId, commands, sourcesRemoved); - addSource(sourceId, after, commands); -} + if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) { + const verticalOpacity = !verticalHidden ? packedOpacity : PACKED_HIDDEN_OPACITY; + addOpacities(bucket.icon, symbolInstance.numVerticalIconVertices, verticalOpacity); + bucket.icon.placedSymbolArray.get(symbolInstance.verticalPlacedIconSymbolIndex).hidden = + (opacityState.icon.isHidden() ); + } + } -function canUpdateGeoJSON(before, after, sourceId) { - let prop; - for (prop in before[sourceId]) { - if (!before[sourceId].hasOwnProperty(prop)) continue; - if (prop !== 'data' && !transform.deepEqual(before[sourceId][prop], after[sourceId][prop])) { - return false; - } - } - for (prop in after[sourceId]) { - if (!after[sourceId].hasOwnProperty(prop)) continue; - if (prop !== 'data' && !transform.deepEqual(before[sourceId][prop], after[sourceId][prop])) { - return false; - } - } - return true; -} + if (bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()) { + const collisionArrays = bucket.collisionArrays[s]; + if (collisionArrays) { + let shift = new ref_properties.pointGeometry(0, 0); + let used = true; + if (collisionArrays.textBox || collisionArrays.verticalTextBox) { + if (variablePlacement) { + const variableOffset = this.variableOffsets[crossTileID]; + if (variableOffset) { + // This will show either the currently placed position or the last + // successfully placed position (so you can visualize what collision + // just made the symbol disappear, and the most likely place for the + // symbol to come back) + shift = calculateVariableLayoutShift(variableOffset.anchor, + variableOffset.width, + variableOffset.height, + variableOffset.textOffset, + variableOffset.textScale); + if (rotateWithMap) { + shift._rotate(pitchWithMap ? this.transform.angle : -this.transform.angle); + } + } else { + // No offset -> this symbol hasn't been placed since coming on-screen + // No single box is particularly meaningful and all of them would be too noisy + // Use the center box just to show something's there, but mark it "not used" + used = false; + } + } -function diffSources(before, after, commands, sourcesRemoved) { - before = before || {}; - after = after || {}; + if (hasClipping) { + used = !opacityState.clipped; + } - let sourceId; + if (collisionArrays.textBox) { + updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || horizontalHidden, shift.x, shift.y); + } + if (collisionArrays.verticalTextBox) { + updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || verticalHidden, shift.x, shift.y); + } + } - // look for sources to remove - for (sourceId in before) { - if (!before.hasOwnProperty(sourceId)) continue; - if (!after.hasOwnProperty(sourceId)) { - removeSource(sourceId, commands, sourcesRemoved); - } - } + const verticalIconUsed = used && Boolean(!verticalHidden && collisionArrays.verticalIconBox); - // 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 (!transform.deepEqual(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); + if (collisionArrays.iconBox) { + updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, verticalIconUsed, + hasIconTextFit ? shift.x : 0, + hasIconTextFit ? shift.y : 0); + } + + if (collisionArrays.verticalIconBox) { + updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, !verticalIconUsed, + hasIconTextFit ? shift.x : 0, + hasIconTextFit ? shift.y : 0); + } + } } } - } -} - -function diffLayerPropertyChanges(before, after, commands, layerId, klass, command) { - before = before || {}; - after = after || {}; - - let prop; + bucket.fullyClipped = visibleInstanceCount === 0; + bucket.sortFeatures(this.transform.angle); + if (this.retainedQueryData[bucket.bucketInstanceId]) { + this.retainedQueryData[bucket.bucketInstanceId].featureSortOrder = bucket.featureSortOrder; + } - for (prop in before) { - if (!before.hasOwnProperty(prop)) continue; - if (!transform.deepEqual(before[prop], after[prop])) { - commands.push({command, args: [layerId, prop, after[prop], klass]}); + if (bucket.hasTextData() && bucket.text.opacityVertexBuffer) { + bucket.text.opacityVertexBuffer.updateData(bucket.text.opacityVertexArray); } - } - for (prop in after) { - if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) continue; - if (!transform.deepEqual(before[prop], after[prop])) { - commands.push({command, args: [layerId, prop, after[prop], klass]}); + if (bucket.hasIconData() && bucket.icon.opacityVertexBuffer) { + bucket.icon.opacityVertexBuffer.updateData(bucket.icon.opacityVertexArray); + } + if (bucket.hasIconCollisionBoxData() && bucket.iconCollisionBox.collisionVertexBuffer) { + bucket.iconCollisionBox.collisionVertexBuffer.updateData(bucket.iconCollisionBox.collisionVertexArray); + } + if (bucket.hasTextCollisionBoxData() && bucket.textCollisionBox.collisionVertexBuffer) { + bucket.textCollisionBox.collisionVertexBuffer.updateData(bucket.textCollisionBox.collisionVertexArray); } - } -} - -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 - const beforeOrder = before.map(pluckId); - const afterOrder = after.map(pluckId); - - // index of layer by id - const beforeIndex = before.reduce(indexById, {}); - const afterIndex = after.reduce(indexById, {}); - // track order of layers as if they have been mutated - const tracker = beforeOrder.slice(); + ref_properties.assert_1(bucket.text.opacityVertexArray.length === bucket.text.layoutVertexArray.length / 4); + ref_properties.assert_1(bucket.icon.opacityVertexArray.length === bucket.icon.layoutVertexArray.length / 4); - // layers that have been added do not need to be diffed - const clean = Object.create(null); + // Push generated collision circles to the bucket for debug rendering + if (bucket.bucketInstanceId in this.collisionCircleArrays) { + const instance = this.collisionCircleArrays[bucket.bucketInstanceId]; - let i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop; + bucket.placementInvProjMatrix = instance.invProjMatrix; + bucket.placementViewportMatrix = instance.viewportMatrix; + bucket.collisionCircleArray = instance.circles; - // 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++; + delete this.collisionCircleArrays[bucket.bucketInstanceId]; } } - // 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; + symbolFadeChange(now ) { + return this.fadeDuration === 0 ? + 1 : + ((now - this.commitTime) / this.fadeDuration + this.prevZoomAdjustment); + } - 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++; - } + zoomAdjustment(zoom ) { + // When zooming out quickly, labels can overlap each other. This + // adjustment is used to reduce the interval between placement calculations + // and to reduce the fade duration when zooming out quickly. Discovering the + // collisions more quickly and fading them more quickly reduces the unwanted effect. + return Math.max(0, (this.transform.zoom - zoom) / 1.5); + } - // 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; + hasTransitions(now ) { + return this.stale || + now - this.lastPlacementChangeTime < this.fadeDuration; } - // update layers - for (i = 0; i < afterOrder.length; i++) { - layerId = afterOrder[i]; - beforeLayer = beforeIndex[layerId]; - afterLayer = afterIndex[layerId]; + stillRecent(now , zoom ) { + // The adjustment makes placement more frequent when zooming. + // This condition applies the adjustment only after the map has + // stopped zooming. This avoids adding extra jank while zooming. + const durationAdjustment = this.zoomAtLastRecencyCheck === zoom ? + (1 - this.zoomAdjustment(zoom)) : + 1; + this.zoomAtLastRecencyCheck = zoom; - // no need to update if previously added (new or moved) - if (clean[layerId] || transform.deepEqual(beforeLayer, afterLayer)) continue; + return this.commitTime + this.fadeDuration * durationAdjustment > now; + } - // If source, source-layer, or type have changes, then remove the layer - // and add it back 'from scratch'. - if (!transform.deepEqual(beforeLayer.source, afterLayer.source) || !transform.deepEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !transform.deepEqual(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; - } + setStale() { + this.stale = true; + } +} - // 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 (!transform.deepEqual(beforeLayer.filter, afterLayer.filter)) { - commands.push({command: operations.setFilter, args: [layerId, afterLayer.filter]}); - } - if (!transform.deepEqual(beforeLayer.minzoom, afterLayer.minzoom) || !transform.deepEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) { - commands.push({command: operations.setLayerZoomRange, args: [layerId, afterLayer.minzoom, afterLayer.maxzoom]}); - } +function updateCollisionVertices(collisionVertexArray , placed , notUsed , shiftX , shiftY ) { + collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); + collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); + collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); + collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); +} - // 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 (!transform.deepEqual(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 (!transform.deepEqual(beforeLayer[prop], afterLayer[prop])) { - commands.push({command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]]}); - } - } +// 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. +const shift25 = Math.pow(2, 25); +const shift24 = Math.pow(2, 24); +const shift17 = Math.pow(2, 17); +const shift16 = Math.pow(2, 16); +const shift9 = Math.pow(2, 9); +const shift8 = Math.pow(2, 8); +const 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; } + const targetBit = opacityState.placed ? 1 : 0; + const opacityBits = Math.floor(opacityState.opacity * 127); + return opacityBits * shift25 + targetBit * shift24 + + opacityBits * shift17 + targetBit * shift16 + + opacityBits * shift9 + targetBit * shift8 + + opacityBits * shift1 + targetBit; } -/** - * 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]}]; +const PACKED_HIDDEN_OPACITY = 0; - let commands = []; +// - try { - // Handle changes to top-level properties - if (!transform.deepEqual(before.version, after.version)) { - return [{command: operations.setStyle, args: [after]}]; - } - if (!transform.deepEqual(before.center, after.center)) { - commands.push({command: operations.setCenter, args: [after.center]}); - } - if (!transform.deepEqual(before.zoom, after.zoom)) { - commands.push({command: operations.setZoom, args: [after.zoom]}); - } - if (!transform.deepEqual(before.bearing, after.bearing)) { - commands.push({command: operations.setBearing, args: [after.bearing]}); - } - if (!transform.deepEqual(before.pitch, after.pitch)) { - commands.push({command: operations.setPitch, args: [after.pitch]}); - } - if (!transform.deepEqual(before.sprite, after.sprite)) { - commands.push({command: operations.setSprite, args: [after.sprite]}); - } - if (!transform.deepEqual(before.glyphs, after.glyphs)) { - commands.push({command: operations.setGlyphs, args: [after.glyphs]}); - } - if (!transform.deepEqual(before.transition, after.transition)) { - commands.push({command: operations.setTransition, args: [after.transition]}); - } - if (!transform.deepEqual(before.light, after.light)) { - commands.push({command: operations.setLight, args: [after.light]}); - } - if (!transform.deepEqual(before.fog, after.fog)) { - commands.push({command: operations.setFog, args: [after.fog]}); - } - if (!transform.deepEqual(before.projection, after.projection)) { - commands.push({command: operations.setProjection, args: [after.projection]}); - } + + + + + + - // 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. - const sourcesRemoved = {}; +class LayerPlacement { + + + + + - // First collect the {add,remove}Source commands - const removeOrAddSourceCommands = []; - diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved); + constructor(styleLayer ) { + this._sortAcrossTiles = styleLayer.layout.get('symbol-z-order') !== 'viewport-y' && + styleLayer.layout.get('symbol-sort-key').constantOr(1) !== undefined; - // 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 - const beforeLayers = []; - if (before.layers) { - before.layers.forEach((layer) => { - if (sourcesRemoved[layer.source]) { - commands.push({command: operations.removeLayer, args: [layer.id]}); - } else { - beforeLayers.push(layer); - } - }); - } + this._currentTileIndex = 0; + this._currentPartIndex = 0; + this._seenCrossTileIDs = {}; + this._bucketParts = []; + } + + continuePlacement(tiles , placement , showCollisionBoxes , styleLayer , shouldPausePlacement ) { + const bucketParts = this._bucketParts; + + while (this._currentTileIndex < tiles.length) { + const tile = tiles[this._currentTileIndex]; + placement.getBucketParts(bucketParts, styleLayer, tile, this._sortAcrossTiles); - // Remove the terrain if the source for that terrain is being removed - let beforeTerrain = before.terrain; - if (beforeTerrain) { - if (sourcesRemoved[beforeTerrain.source]) { - commands.push({command: operations.setTerrain, args: [undefined]}); - beforeTerrain = undefined; + this._currentTileIndex++; + if (shouldPausePlacement()) { + return true; } } - commands = commands.concat(removeOrAddSourceCommands); - - // Even though terrain is a top-level property - // Its like a layer in the sense that it depends on a source being present. - if (!transform.deepEqual(beforeTerrain, after.terrain)) { - commands.push({command: operations.setTerrain, args: [after.terrain]}); + if (this._sortAcrossTiles) { + this._sortAcrossTiles = false; + bucketParts.sort((a, b) => ((a.sortKey ) ) - ((b.sortKey ) )); } - // 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]}]; + while (this._currentPartIndex < bucketParts.length) { + const bucketPart = bucketParts[this._currentPartIndex]; + placement.placeLayerBucketPart(bucketPart, this._seenCrossTileIDs, showCollisionBoxes, bucketPart.symbolInstanceStart === 0); + this._currentPartIndex++; + if (shouldPausePlacement()) { + return true; + } + } + return false; } - - return commands; } -// - -class PathInterpolator { +class PauseablePlacement { - - - + + + + - constructor(points_ , padding_ ) { - this.reset(points_, padding_); + constructor(transform , order , + forceFullPlacement , + showCollisionBoxes , + fadeDuration , + crossSourceCollisions , + prevPlacement , + fogState ) { + + this.placement = new Placement(transform, fadeDuration, crossSourceCollisions, prevPlacement, fogState); + this._currentPlacementIndex = order.length - 1; + this._forceFullPlacement = forceFullPlacement; + this._showCollisionBoxes = showCollisionBoxes; + this._done = false; } - reset(points_ , padding_ ) { - this.points = points_ || []; + isDone() { + return this._done; + } - // Compute cumulative distance from first point to every other point in the segment. - // Last entry in the array is total length of the path - this._distances = [0.0]; + continuePlacement(order , layers , layerTiles ) { + const startTime = ref_properties.exported.now(); - for (let i = 1; i < this.points.length; i++) { - this._distances[i] = this._distances[i - 1] + this.points[i].dist(this.points[i - 1]); - } + const shouldPausePlacement = () => { + const elapsedTime = ref_properties.exported.now() - startTime; + return this._forceFullPlacement ? false : elapsedTime > 2; + }; - this.length = this._distances[this._distances.length - 1]; - this.padding = Math.min(padding_ || 0, this.length * 0.5); - this.paddedLength = this.length - this.padding * 2.0; - } + while (this._currentPlacementIndex >= 0) { + const layerId = order[this._currentPlacementIndex]; + const layer = layers[layerId]; + const placementZoom = this.placement.collisionIndex.transform.zoom; + if (layer.type === 'symbol' && + (!layer.minzoom || layer.minzoom <= placementZoom) && + (!layer.maxzoom || layer.maxzoom > placementZoom)) { - lerp(t ) { - transform.assert_1(this.points.length > 0); - if (this.points.length === 1) { - return this.points[0]; - } + if (!this._inProgressLayer) { + this._inProgressLayer = new LayerPlacement(((layer ) )); + } - t = transform.clamp(t, 0, 1); + const pausePlacement = this._inProgressLayer.continuePlacement(layerTiles[layer.source], this.placement, this._showCollisionBoxes, layer, shouldPausePlacement); - // Find the correct segment [p0, p1] where p0 <= x < p1 - let currentIndex = 1; - let distOfCurrentIdx = this._distances[currentIndex]; - const distToTarget = t * this.paddedLength + this.padding; + if (pausePlacement) { + ref_properties.PerformanceUtils.recordPlacementTime(ref_properties.exported.now() - startTime); + // 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; + } - while (distOfCurrentIdx < distToTarget && currentIndex < this._distances.length) { - distOfCurrentIdx = this._distances[++currentIndex]; - } + delete this._inProgressLayer; + } - // Interpolate between the two points of the segment - const idxOfPrevPoint = currentIndex - 1; - const distOfPrevIdx = this._distances[idxOfPrevPoint]; - const segmentLength = distOfCurrentIdx - distOfPrevIdx; - const segmentT = segmentLength > 0 ? (distToTarget - distOfPrevIdx) / segmentLength : 0; + this._currentPlacementIndex--; + } + ref_properties.PerformanceUtils.recordPlacementTime(ref_properties.exported.now() - startTime); + this._done = true; + } - return this.points[idxOfPrevPoint].mult(1.0 - segmentT).add(this.points[currentIndex].mult(segmentT)); + commit(now ) { + this.placement.commit(now); + return this.placement; } } // + + + + + + -/** - * 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 - */ -class GridIndex { - - - - - - - - - - - - - - - - constructor (width , height , cellSize ) { - const boxCells = this.boxCells = []; - const 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); +/* + 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. - for (let i = 0; i < this.xCellCount * this.yCellCount; i++) { - boxCells.push([]); - circleCells.push([]); - } - this.circleKeys = []; - this.boxKeys = []; - this.bboxes = []; - this.circles = []; + 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. +*/ - this.width = width; - this.height = height; - this.xScale = this.xCellCount / width; - this.yScale = this.yCellCount / height; - this.boxUid = 0; - this.circleUid = 0; - } +// Round anchor positions to roughly 4 pixel grid +const roundingFactor = 512 / ref_properties.EXTENT / 2; - keysLength() { - return this.boxKeys.length + this.circleKeys.length; - } +class TileLayerIndex { + + + + + + + + + - 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); - } + constructor(tileID , symbolInstances , bucketInstanceId ) { + this.tileID = tileID; + this.indexedSymbolInstances = {}; + this.bucketInstanceId = bucketInstanceId; - 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); + for (let i = 0; i < symbolInstances.length; i++) { + const symbolInstance = symbolInstances.get(i); + const key = symbolInstance.key; + if (!this.indexedSymbolInstances[key]) { + this.indexedSymbolInstances[key] = []; + } + // This tile may have multiple symbol instances with the same key + // Store each one along with its coordinates + this.indexedSymbolInstances[key].push({ + crossTileID: symbolInstance.crossTileID, + coord: this.getScaledCoordinates(symbolInstance, tileID) + }); + } } - _insertBoxCell(x1 , y1 , x2 , y2 , cellIndex , uid ) { - this.boxCells[cellIndex].push(uid); + // 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. + getScaledCoordinates(symbolInstance , childTileID ) { + const zDifference = childTileID.canonical.z - this.tileID.canonical.z; + const scale = roundingFactor / Math.pow(2, zDifference); + return { + x: Math.floor((childTileID.canonical.x * ref_properties.EXTENT + symbolInstance.tileAnchorX) * scale), + y: Math.floor((childTileID.canonical.y * ref_properties.EXTENT + symbolInstance.tileAnchorY) * scale) + }; } - _insertCircleCell(x1 , y1 , x2 , y2 , cellIndex , uid ) { - this.circleCells[cellIndex].push(uid); - } + findMatches(symbolInstances , newTileID , zoomCrossTileIDs ) { + const tolerance = this.tileID.canonical.z < newTileID.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - newTileID.canonical.z); - _query(x1 , y1 , x2 , y2 , hitTest , predicate ) { - if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) { - return hitTest ? false : []; - } - const result = []; - if (x1 <= 0 && y1 <= 0 && this.width <= x2 && this.height <= y2) { - if (hitTest) { - return true; + for (let i = 0; i < symbolInstances.length; i++) { + const symbolInstance = symbolInstances.get(i); + if (symbolInstance.crossTileID) { + // already has a match, skip + continue; } - for (let boxUid = 0; boxUid < this.boxKeys.length; boxUid++) { - result.push({ - key: this.boxKeys[boxUid], - x1: this.bboxes[boxUid * 4], - y1: this.bboxes[boxUid * 4 + 1], - x2: this.bboxes[boxUid * 4 + 2], - y2: this.bboxes[boxUid * 4 + 3] - }); + + const indexedInstances = this.indexedSymbolInstances[symbolInstance.key]; + if (!indexedInstances) { + // No symbol with this key in this bucket + continue; } - for (let circleUid = 0; circleUid < this.circleKeys.length; circleUid++) { - const x = this.circles[circleUid * 3]; - const y = this.circles[circleUid * 3 + 1]; - const radius = this.circles[circleUid * 3 + 2]; - result.push({ - key: this.circleKeys[circleUid], - x1: x - radius, - y1: y - radius, - x2: x + radius, - y2: y + radius - }); + + const scaledSymbolCoord = this.getScaledCoordinates(symbolInstance, newTileID); + + for (const thisTileSymbol of indexedInstances) { + // 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) + 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; + } } - return predicate ? result.filter(predicate) : result; - } else { - const queryArgs = { - hitTest, - seenUids: {box: {}, circle: {}} - }; - this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs, predicate); - return hitTest ? result.length > 0 : result; } } +} - _queryCircle(x , y , radius , hitTest , predicate ) { - // 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 - const x1 = x - radius; - const x2 = x + radius; - const y1 = y - radius; - const 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 - const result = []; - const queryArgs = { - hitTest, - circle: {x, y, radius}, - seenUids: {box: {}, circle: {}} - }; - this._forEachCell(x1, y1, x2, y2, this._queryCellCircle, result, queryArgs, predicate); - return hitTest ? result.length > 0 : result; +class CrossTileIDs { + + constructor() { + this.maxCrossTileID = 0; } - - query(x1 , y1 , x2 , y2 , predicate ) { - return (this._query(x1, y1, x2, y2, false, predicate) ); + generate() { + return ++this.maxCrossTileID; } +} - hitTest(x1 , y1 , x2 , y2 , predicate ) { - return (this._query(x1, y1, x2, y2, true, predicate) ); - } +class CrossTileSymbolLayerIndex { + + + - hitTestCircle(x , y , radius , predicate ) { - return (this._queryCircle(x, y, radius, true, predicate) ); + constructor() { + this.indexes = {}; + this.usedCrossTileIDs = {}; + this.lng = 0; } - _queryCell(x1 , y1 , x2 , y2 , cellIndex , result , queryArgs , predicate ) { - const seenUids = queryArgs.seenUids; - const boxCell = this.boxCells[cellIndex]; - if (boxCell !== null) { - const bboxes = this.bboxes; - for (const boxUid of boxCell) { - if (!seenUids.box[boxUid]) { - seenUids.box[boxUid] = true; - const offset = boxUid * 4; - if ((x1 <= bboxes[offset + 2]) && - (y1 <= bboxes[offset + 3]) && - (x2 >= bboxes[offset + 0]) && - (y2 >= bboxes[offset + 1]) && - (!predicate || predicate(this.boxKeys[boxUid]))) { - if (queryArgs.hitTest) { - result.push(true); - return true; - } else { - result.push({ - key: this.boxKeys[boxUid], - x1: bboxes[offset], - y1: bboxes[offset + 1], - x2: bboxes[offset + 2], - y2: bboxes[offset + 3] - }); - } - } - } - } - } - const circleCell = this.circleCells[cellIndex]; - if (circleCell !== null) { - const circles = this.circles; - for (const circleUid of circleCell) { - if (!seenUids.circle[circleUid]) { - seenUids.circle[circleUid] = true; - const offset = circleUid * 3; - if (this._circleAndRectCollide( - circles[offset], - circles[offset + 1], - circles[offset + 2], - x1, - y1, - x2, - y2) && - (!predicate || predicate(this.circleKeys[circleUid]))) { - if (queryArgs.hitTest) { - result.push(true); - return true; - } else { - const x = circles[offset]; - const y = circles[offset + 1]; - const radius = circles[offset + 2]; - result.push({ - key: this.circleKeys[circleUid], - x1: x - radius, - y1: y - radius, - x2: x + radius, - y2: y + radius - }); - } - } + /* + * Sometimes when a user pans across the antimeridian the longitude value gets wrapped. + * To prevent labels from flashing out and in we adjust the tileID values in the indexes + * so that they match the new wrapped version of the map. + */ + handleWrapJump(lng ) { + const wrapDelta = Math.round((lng - this.lng) / 360); + if (wrapDelta !== 0) { + for (const zoom in this.indexes) { + const zoomIndexes = this.indexes[zoom]; + const newZoomIndex = {}; + for (const key in zoomIndexes) { + // change the tileID's wrap and add it to a new index + const index = zoomIndexes[key]; + index.tileID = index.tileID.unwrapTo(index.tileID.wrap + wrapDelta); + newZoomIndex[index.tileID.key] = index; } + this.indexes[zoom] = newZoomIndex; } } + this.lng = lng; } - _queryCellCircle(x1 , y1 , x2 , y2 , cellIndex , result , queryArgs , predicate ) { - const circle = queryArgs.circle; - const seenUids = queryArgs.seenUids; - const boxCell = this.boxCells[cellIndex]; - if (boxCell !== null) { - const bboxes = this.bboxes; - for (const boxUid of boxCell) { - if (!seenUids.box[boxUid]) { - seenUids.box[boxUid] = true; - const offset = boxUid * 4; - if (this._circleAndRectCollide( - circle.x, - circle.y, - circle.radius, - bboxes[offset + 0], - bboxes[offset + 1], - bboxes[offset + 2], - bboxes[offset + 3]) && - (!predicate || predicate(this.boxKeys[boxUid]))) { - result.push(true); - return true; - } - } + addBucket(tileID , bucket , crossTileIDs ) { + 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]); } } - const circleCell = this.circleCells[cellIndex]; - if (circleCell !== null) { - const circles = this.circles; - for (const circleUid of circleCell) { - if (!seenUids.circle[circleUid]) { - seenUids.circle[circleUid] = true; - const offset = circleUid * 3; - if (this._circlesCollide( - circles[offset], - circles[offset + 1], - circles[offset + 2], - circle.x, - circle.y, - circle.radius) && - (!predicate || predicate(this.circleKeys[circleUid]))) { - result.push(true); - return true; + for (let i = 0; i < bucket.symbolInstances.length; i++) { + const symbolInstance = bucket.symbolInstances.get(i); + symbolInstance.crossTileID = 0; + } + + if (!this.usedCrossTileIDs[tileID.overscaledZ]) { + this.usedCrossTileIDs[tileID.overscaledZ] = {}; + } + const zoomCrossTileIDs = this.usedCrossTileIDs[tileID.overscaledZ]; + + for (const zoom in this.indexes) { + const zoomIndexes = this.indexes[zoom]; + if (Number(zoom) > tileID.overscaledZ) { + for (const id in zoomIndexes) { + const childIndex = zoomIndexes[id]; + if (childIndex.tileID.isChildOf(tileID)) { + childIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); } } + } else { + const parentCoord = tileID.scaledTo(Number(zoom)); + const parentIndex = zoomIndexes[parentCoord.key]; + if (parentIndex) { + parentIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); + } } } - } - - _forEachCell(x1 , y1 , x2 , y2 , fn , arg1 , arg2 , predicate ) { - const cx1 = this._convertToXCellCoord(x1); - const cy1 = this._convertToYCellCoord(y1); - const cx2 = this._convertToXCellCoord(x2); - const cy2 = this._convertToYCellCoord(y2); - for (let x = cx1; x <= cx2; x++) { - for (let y = cy1; y <= cy2; y++) { - const cellIndex = this.xCellCount * y + x; - if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2, predicate)) return; + for (let i = 0; i < bucket.symbolInstances.length; i++) { + const symbolInstance = bucket.symbolInstances.get(i); + if (!symbolInstance.crossTileID) { + // symbol did not match any known symbol, assign a new id + symbolInstance.crossTileID = crossTileIDs.generate(); + zoomCrossTileIDs[symbolInstance.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; } - _convertToXCellCoord(x ) { - return Math.max(0, Math.min(this.xCellCount - 1, Math.floor(x * this.xScale))); + removeBucketCrossTileIDs(zoom , removedBucket ) { + for (const key in removedBucket.indexedSymbolInstances) { + for (const symbolInstance of removedBucket.indexedSymbolInstances[(key )]) { + delete this.usedCrossTileIDs[zoom][symbolInstance.crossTileID]; + } + } } - _convertToYCellCoord(y ) { - return Math.max(0, Math.min(this.yCellCount - 1, Math.floor(y * this.yScale))); + removeStaleBuckets(currentIDs ) { + let tilesChanged = false; + for (const z in this.indexes) { + const zoomIndexes = this.indexes[z]; + for (const tileKey in zoomIndexes) { + if (!currentIDs[zoomIndexes[tileKey].bucketInstanceId]) { + this.removeBucketCrossTileIDs(z, zoomIndexes[tileKey]); + delete zoomIndexes[tileKey]; + tilesChanged = true; + } + } + } + return tilesChanged; } +} - _circlesCollide(x1 , y1 , r1 , x2 , y2 , r2 ) { - const dx = x2 - x1; - const dy = y2 - y1; - const bothRadii = r1 + r2; - return (bothRadii * bothRadii) > (dx * dx + dy * dy); +class CrossTileSymbolIndex { + + + + + + constructor() { + this.layerIndexes = {}; + this.crossTileIDs = new CrossTileIDs(); + this.maxBucketInstanceId = 0; + this.bucketsInCurrentPlacement = {}; } - _circleAndRectCollide(circleX , circleY , radius , x1 , y1 , x2 , y2 ) { - const halfRectWidth = (x2 - x1) / 2; - const distX = Math.abs(circleX - (x1 + halfRectWidth)); - if (distX > (halfRectWidth + radius)) { - return false; + addLayer(styleLayer , tiles , lng , projection ) { + let layerIndex = this.layerIndexes[styleLayer.id]; + if (layerIndex === undefined) { + layerIndex = this.layerIndexes[styleLayer.id] = new CrossTileSymbolLayerIndex(); } - const halfRectHeight = (y2 - y1) / 2; - const distY = Math.abs(circleY - (y1 + halfRectHeight)); - if (distY > (halfRectHeight + radius)) { - return false; + let symbolBucketsChanged = false; + const currentBucketIDs = {}; + + if (projection.name !== 'globe') { + layerIndex.handleWrapJump(lng); } - if (distX <= halfRectWidth || distY <= halfRectHeight) { - return true; + for (const tile of tiles) { + const symbolBucket = ((tile.getBucket(styleLayer) ) ); + if (!symbolBucket || styleLayer.id !== symbolBucket.layerIds[0]) + continue; + + if (!symbolBucket.bucketInstanceId) { + symbolBucket.bucketInstanceId = ++this.maxBucketInstanceId; + } + + if (layerIndex.addBucket(tile.tileID, symbolBucket, this.crossTileIDs)) { + symbolBucketsChanged = true; + } + currentBucketIDs[symbolBucket.bucketInstanceId] = true; } - const dx = distX - halfRectWidth; - const dy = distY - halfRectHeight; - return (dx * dx + dy * dy <= (radius * radius)); + if (layerIndex.removeStaleBuckets(currentBucketIDs)) { + symbolBucketsChanged = true; + } + + return symbolBucketsChanged; + } + + pruneUnusedLayers(usedLayers ) { + const usedLayerMap = {}; + usedLayers.forEach((usedLayer) => { + usedLayerMap[usedLayer] = true; + }); + for (const layerId in this.layerIndexes) { + if (!usedLayerMap[layerId]) { + delete this.layerIndexes[layerId]; + } + } } } // -const FlipState = { - unknown: 0, - flipRequired: 1, - flipNotRequired: 2 -}; +// We're skipping validation errors with the `source.canvas` identifier in order +// to continue to allow canvas sources to be added at runtime/updated in +// smart setStyle (see https://github.com/mapbox/mapbox-gl-js/pull/6424): +const emitValidationErrors = (evented , errors ) => + ref_properties.emitValidationErrors(evented, errors && errors.filter(error => error.identifier !== 'source.canvas')); -const maxTangent = Math.tan(85 * Math.PI / 180); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -/* - * # 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. - */ +const supportedDiffOperations = ref_properties.pick(operations, [ + 'addLayer', + 'removeLayer', + 'setPaintProperty', + 'setLayoutProperty', + 'setFilter', + 'addSource', + 'removeSource', + 'setLayerZoomRange', + 'setLight', + 'setTransition', + 'setGeoJSONSourceData', + 'setTerrain', + 'setFog', + 'setProjection' + // 'setGlyphs', + // 'setSprite', +]); -/* - * Returns a matrix for converting from tile units to the correct label coordinate space. - */ -function getLabelPlaneMatrix(posMatrix , - tileID , - pitchWithMap , - rotateWithMap , - transform$1 , - pixelsToTileUnits ) { - let m = transform.create(); - if (pitchWithMap) { - if (transform$1.projection.name === 'globe') { - // Camera is moved closer towards the ground near poles as part of - // compesanting the reprojection. This has to be compensated for the - // map aligned label space. Whithout this logic map aligned symbols - // would appear larger than intended. - const labelWorldSize = transform$1.worldSize / transform$1._projectionScaler; - m = transform.calculateGlobeMatrix(transform$1, labelWorldSize, [0, 0]); - - transform.multiply$1(m, m, transform.globeDenormalizeECEF(transform.globeTileBounds(tileID))); - } else { - const s = transform.invert([], pixelsToTileUnits); - m[0] = s[0]; - m[1] = s[1]; - m[4] = s[2]; - m[5] = s[3]; - } - if (!rotateWithMap) { - transform.rotateZ(m, m, transform$1.angle); - } - } else { - transform.multiply$1(m, transform$1.labelPlaneMatrix, posMatrix); - } - return m; -} +const ignoredDiffOperations = ref_properties.pick(operations, [ + 'setCenter', + 'setZoom', + 'setBearing', + 'setPitch' +]); -/* - * Returns a matrix for converting from the correct label coordinate space to gl coords. +const empty = emptyStyle(); + + + + + + + + + + + +// Symbols are draped only for specific cases: see isLayerDraped +const drapedLayers = {'fill': true, 'line': true, 'background': true, "hillshade": true, "raster": true}; + +/** + * @private */ -function getGlCoordMatrix(posMatrix , - tileID , - pitchWithMap , - rotateWithMap , - transform$1 , - pixelsToTileUnits ) { - if (pitchWithMap) { - if (transform$1.projection.name === 'globe') { - const m = getLabelPlaneMatrix(posMatrix, tileID, pitchWithMap, rotateWithMap, transform$1, pixelsToTileUnits); - transform.invert$1(m, m); - transform.multiply$1(m, posMatrix, m); - return m; - } else { - const m = transform.clone(posMatrix); - const s = transform.identity([]); - s[0] = pixelsToTileUnits[0]; - s[1] = pixelsToTileUnits[1]; - s[4] = pixelsToTileUnits[2]; - s[5] = pixelsToTileUnits[3]; - transform.multiply$1(m, m, s); - if (!rotateWithMap) { - transform.rotateZ(m, m, -transform$1.angle); +class Style extends ref_properties.Evented { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + // exposed to allow stubbing by unit tests + + + + + constructor(map , options = {}) { + super(); + + this.map = map; + this.dispatcher = new Dispatcher(getGlobalWorkerPool(), this); + this.imageManager = new ImageManager(); + this.imageManager.setEventedParent(this); + this.glyphManager = new ref_properties.GlyphManager(map._requestManager, + options.localFontFamily ? + ref_properties.LocalGlyphMode.all : + (options.localIdeographFontFamily ? ref_properties.LocalGlyphMode.ideographs : ref_properties.LocalGlyphMode.none), + options.localFontFamily || options.localIdeographFontFamily); + this.lineAtlas = new ref_properties.LineAtlas(256, 512); + this.crossTileSymbolIndex = new CrossTileSymbolIndex(); + + this._layers = {}; + this._num3DLayers = 0; + this._numSymbolLayers = 0; + this._numCircleLayers = 0; + this._serializedLayers = {}; + this._sourceCaches = {}; + this._otherSourceCaches = {}; + this._symbolSourceCaches = {}; + this.zoomHistory = new ref_properties.ZoomHistory(); + this._loaded = false; + this._availableImages = []; + this._order = []; + this._drapedFirstOrder = []; + this._markersNeedUpdate = false; + + this._resetUpdates(); + + this.dispatcher.broadcast('setReferrer', ref_properties.getReferrer()); + + const self = this; + this._rtlTextPluginCallback = Style.registerForPluginStateChange((event) => { + const state = { + pluginStatus: event.pluginStatus, + pluginURL: event.pluginURL + }; + self.dispatcher.broadcast('syncRTLPluginState', state, (err, results) => { + ref_properties.triggerPluginCompletionEvent(err); + if (results) { + const allComplete = results.every((elem) => elem); + if (allComplete) { + for (const id in self._sourceCaches) { + const sourceCache = self._sourceCaches[id]; + const sourceCacheType = sourceCache.getSource().type; + if (sourceCacheType === 'vector' || sourceCacheType === 'geojson') { + sourceCache.reload(); // Should be a no-op if the plugin loads before any tiles load + } + } + } + } + + }); + }); + + this.on('data', (event) => { + if (event.dataType !== 'source' || event.sourceDataType !== 'metadata') { + return; } - return m; - } - } else { - return transform$1.glCoordMatrix; + + const source = this.getSource(event.sourceId); + if (!source || !source.vectorLayerIds) { + return; + } + + for (const layerId in this._layers) { + const layer = this._layers[layerId]; + if (layer.source === source.id) { + this._validateLayer(layer); + } + } + }); } -} -function project(point , matrix , elevation = 0) { - const pos = [point.x, point.y, elevation, 1]; - if (elevation) { - transform.transformMat4$1(pos, pos, matrix); - } else { - xyTransformMat4(pos, pos, matrix); + loadURL(url , options + + + = {}) { + this.fire(new ref_properties.Event('dataloading', {dataType: 'style'})); + + const validate = typeof options.validate === 'boolean' ? + options.validate : !ref_properties.isMapboxURL(url); + + url = this.map._requestManager.normalizeStyleURL(url, options.accessToken); + const request = this.map._requestManager.transformRequest(url, ref_properties.ResourceType.Style); + this._request = ref_properties.getJSON(request, (error , json ) => { + this._request = null; + if (error) { + this.fire(new ref_properties.ErrorEvent(error)); + } else if (json) { + this._load(json, validate); + } + }); } - const w = pos[3]; - return { - point: new transform.pointGeometry(pos[0] / w, pos[1] / w), - signedDistanceFromCamera: w - }; -} -function getPerspectiveRatio(cameraToCenterDistance , signedDistanceFromCamera ) { - return Math.min(0.5 + 0.5 * (cameraToCenterDistance / signedDistanceFromCamera), 1.5); -} + loadJSON(json , options = {}) { + this.fire(new ref_properties.Event('dataloading', {dataType: 'style'})); -function isVisible(anchorPos , - clippingBuffer ) { - const x = anchorPos[0] / anchorPos[3]; - const y = anchorPos[1] / anchorPos[3]; - const inPaddedViewport = ( - x >= -clippingBuffer[0] && - x <= clippingBuffer[0] && - y >= -clippingBuffer[1] && - y <= clippingBuffer[1]); - return inPaddedViewport; -} + this._request = ref_properties.exported.frame(() => { + this._request = null; + this._load(json, options.validate !== false); + }); + } -/* - * 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 , - getElevation , - tileID ) { + loadEmpty() { + this.fire(new ref_properties.Event('dataloading', {dataType: 'style'})); + this._load(empty, false); + } - const tr = painter.transform; - const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; - const partiallyEvaluatedSize = transform.evaluateSizeForZoom(sizeData, painter.transform.zoom); + _updateLayerCount(layer , add ) { + // Typed layer bookkeeping + const count = add ? 1 : -1; + if (layer.is3D()) { + this._num3DLayers += count; + } + if (layer.type === 'circle') { + this._numCircleLayers += count; + } + if (layer.type === 'symbol') { + this._numSymbolLayers += count; + } + } - const clippingBuffer = [256 / painter.width * 2 + 1, 256 / painter.height * 2 + 1]; + _load(json , validate ) { + if (validate && emitValidationErrors(this, ref_properties.validateStyle(json))) { + return; + } - const dynamicLayoutVertexArray = isText ? - bucket.text.dynamicLayoutVertexArray : - bucket.icon.dynamicLayoutVertexArray; - dynamicLayoutVertexArray.clear(); + this._loaded = true; + this.stylesheet = ref_properties.clone$1(json); + this._updateMapProjection(); - const lineVertexArray = bucket.lineVertexArray; - const placedSymbols = isText ? bucket.text.placedSymbolArray : bucket.icon.placedSymbolArray; + for (const id in json.sources) { + this.addSource(id, json.sources[id], {validate: false}); + } + this._changed = false; // avoid triggering redundant style update after adding initial sources + if (json.sprite) { + this._loadSprite(json.sprite); + } else { + this.imageManager.setLoaded(true); + this.dispatcher.broadcast('spriteLoaded', true); + } - const aspectRatio = painter.transform.width / painter.transform.height; + this.glyphManager.setURL(json.glyphs); - let useVertical = false; + const layers = derefLayers(this.stylesheet.layers); - for (let s = 0; s < placedSymbols.length; s++) { - const symbol = placedSymbols.get(s); + this._order = layers.map((layer) => layer.id); - // Normally, the 'Horizontal|Vertical' writing mode is followed by a 'Vertical' counterpart, this - // is not true for 'Vertical' only line labels. For this case, we'll have to overwrite the 'useVertical' - // status before further checks. - if (symbol.writingMode === transform.WritingMode.vertical && !useVertical) { - if (s === 0 || placedSymbols.get(s - 1).writingMode !== transform.WritingMode.horizontal) { - useVertical = true; - } + this._layers = {}; + this._serializedLayers = {}; + for (let layer of layers) { + layer = ref_properties.createStyleLayer(layer); + layer.setEventedParent(this, {layer: {id: layer.id}}); + this._layers[layer.id] = layer; + this._serializedLayers[layer.id] = layer.serialize(); + this._updateLayerCount(layer, true); } - // 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 === transform.WritingMode.vertical && !useVertical) { - hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); - continue; + this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order)); + + this.light = new Light(this.stylesheet.light); + if (this.stylesheet.terrain && !this.terrainSetForDrapingOnly()) { + this._createTerrain(this.stylesheet.terrain, DrapeRenderMode.elevated); } - // Awkward... but we're counting on the paired "vertical" symbol coming immediately after its horizontal counterpart - useVertical = false; + if (this.stylesheet.fog) { + this._createFog(this.stylesheet.fog); + } + this._updateDrapeFirstLayers(); - // Project tile anchor to globe anchor - const tileAnchorPoint = new transform.pointGeometry(symbol.tileAnchorX, symbol.tileAnchorY); - const elevation = getElevation ? getElevation(tileAnchorPoint) : [0, 0, 0]; - const projectedAnchor = tr.projection.projectTilePoint(tileAnchorPoint.x, tileAnchorPoint.y, tileID.canonical); - const elevatedAnchor = [projectedAnchor.x + elevation[0], projectedAnchor.y + elevation[1], projectedAnchor.z + elevation[2]]; - const anchorPos = [...elevatedAnchor, 1.0]; + this.fire(new ref_properties.Event('data', {dataType: 'style'})); + this.fire(new ref_properties.Event('style.load')); + } - transform.transformMat4$1(anchorPos, anchorPos, posMatrix); + terrainSetForDrapingOnly() { + return !!this.terrain && this.terrain.drapeRenderMode === DrapeRenderMode.deferred; + } - // Don't bother calculating the correct point for invisible labels. - if (!isVisible(anchorPos, clippingBuffer)) { - hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); - continue; + setProjection(projection ) { + if (projection) { + this.stylesheet.projection = projection; + } else { + delete this.stylesheet.projection; } - const cameraToAnchorDistance = anchorPos[3]; - const perspectiveRatio = getPerspectiveRatio(painter.transform.cameraToCenterDistance, cameraToAnchorDistance); + if (!this.map._explicitProjection) { + this.map._updateProjection(); + } + } - const fontSize = transform.evaluateSizeForFeature(sizeData, partiallyEvaluatedSize, symbol); - const pitchScaledFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio; + _updateMapProjection() { + if (!this.map._explicitProjection) { // Update the visible projection if map's is null + this.map._updateProjection(); + } else { // Ensure that style is consistent with current projection on style load + this.applyProjectionUpdate(); + } + } - const labelPlaneAnchorPoint = project(new transform.pointGeometry(elevatedAnchor[0], elevatedAnchor[1]), labelPlaneMatrix, elevatedAnchor[2]); + applyProjectionUpdate() { + if (!this._loaded) return; + this.dispatcher.broadcast('setProjection', this.map.transform.projectionOptions); - // Skip labels behind the camera - if (labelPlaneAnchorPoint.signedDistanceFromCamera <= 0.0) { - hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); - continue; + if (this.map.transform.projection.requiresDraping) { + const hasTerrain = this.getTerrain() || this.stylesheet.terrain; + if (!hasTerrain) { + this.setTerrainForDraping(); + } + } else if (this.terrainSetForDrapingOnly()) { + this.setTerrain(null); } + } - let projectionCache = {}; + _loadSprite(url ) { + this._spriteRequest = loadSprite(url, this.map._requestManager, (err, images) => { + this._spriteRequest = null; + if (err) { + this.fire(new ref_properties.ErrorEvent(err)); + } else if (images) { + for (const id in images) { + this.imageManager.addImage(id, images[id]); + } + } - const getElevationForPlacement = pitchWithMap ? null : getElevation; // When pitchWithMap, we're projecting to scaled tile coordinate space: there is no need to get elevation as it doesn't affect projection. - const placeUnflipped = placeGlyphsAlongLine(symbol, pitchScaledFontSize, false /*unflipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, - bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, labelPlaneAnchorPoint.point, tileAnchorPoint, projectionCache, aspectRatio, getElevationForPlacement, tr.projection, tileID); + this.imageManager.setLoaded(true); + this._availableImages = this.imageManager.listImages(); + this.dispatcher.broadcast('setImages', this._availableImages); + this.dispatcher.broadcast('spriteLoaded', true); + this.fire(new ref_properties.Event('data', {dataType: 'style'})); + }); + } - useVertical = placeUnflipped.useVertical; + _validateLayer(layer ) { + const source = this.getSource(layer.source); + if (!source) { + return; + } - if (getElevationForPlacement && placeUnflipped.needsFlipping) projectionCache = {}; // Truncated points should be recalculated. - if (placeUnflipped.notEnoughRoom || useVertical || - (placeUnflipped.needsFlipping && - placeGlyphsAlongLine(symbol, pitchScaledFontSize, true /*flipped*/, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, - bucket.glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, labelPlaneAnchorPoint.point, tileAnchorPoint, projectionCache, aspectRatio, getElevationForPlacement, tr.projection, tileID).notEnoughRoom)) { - hideGlyphs(symbol.numGlyphs, dynamicLayoutVertexArray); + const sourceLayer = layer.sourceLayer; + if (!sourceLayer) { + return; } - } - if (isText) { - bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); - } else { - bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicLayoutVertexArray); + if (source.type === 'geojson' || (source.vectorLayerIds && source.vectorLayerIds.indexOf(sourceLayer) === -1)) { + this.fire(new ref_properties.ErrorEvent(new Error( + `Source layer "${sourceLayer}" ` + + `does not exist on source "${source.id}" ` + + `as specified by style layer "${layer.id}"` + ))); + } } -} - -function placeFirstAndLastGlyph(fontScale , glyphOffsetArray , lineOffsetX , lineOffsetY , flip , anchorPoint , tileAnchorPoint , symbol , lineVertexArray , labelPlaneMatrix , projectionCache , getElevation , returnPathInTileCoords , projection , tileID ) { - const glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; - const lineStartIndex = symbol.lineStartIndex; - const lineEndIndex = symbol.lineStartIndex + symbol.lineLength; - const firstGlyphOffset = glyphOffsetArray.getoffsetX(symbol.glyphStartIndex); - const lastGlyphOffset = glyphOffsetArray.getoffsetX(glyphEndIndex - 1); + loaded() { + if (!this._loaded) + return false; - const firstPlacedGlyph = placeGlyphAlongLine(fontScale * firstGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, - lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, returnPathInTileCoords, true, projection, tileID); - if (!firstPlacedGlyph) - return null; + if (Object.keys(this._updatedSources).length) + return false; - const lastPlacedGlyph = placeGlyphAlongLine(fontScale * lastGlyphOffset, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, - lineStartIndex, lineEndIndex, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, returnPathInTileCoords, true, projection, tileID); - if (!lastPlacedGlyph) - return null; + for (const id in this._sourceCaches) + if (!this._sourceCaches[id].loaded()) + return false; - return {first: firstPlacedGlyph, last: lastPlacedGlyph}; -} + if (!this.imageManager.isLoaded()) + return false; -// Check in the glCoordinate space, the rough estimation of angle between the text line and the Y axis. -// If the angle if less or equal to 5 degree, then keep the text glyphs unflipped even if it is required. -function isInFlipRetainRange(firstPoint, lastPoint, aspectRatio) { - const deltaY = lastPoint.y - firstPoint.y; - const deltaX = (lastPoint.x - firstPoint.x) * aspectRatio; - if (deltaX === 0.0) { return true; } - const absTangent = Math.abs(deltaY / deltaX); - return (absTangent > maxTangent); -} -function requiresOrientationChange(symbol, firstPoint, lastPoint, aspectRatio) { - if (symbol.writingMode === transform.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. - const rise = Math.abs(lastPoint.y - firstPoint.y); - const run = Math.abs(lastPoint.x - firstPoint.x) * aspectRatio; - if (rise > run) { - return {useVertical: true}; + _serializeLayers(ids ) { + const serializedLayers = []; + for (const id of ids) { + const layer = this._layers[id]; + if (layer.type !== 'custom') { + serializedLayers.push(layer.serialize()); + } } + return serializedLayers; } - // Check if flipping is required for "verticalOnly" case. - if (symbol.writingMode === transform.WritingMode.vertical) { - return (firstPoint.y < lastPoint.y) ? {needsFlipping: true} : null; - } - - // symbol's flipState stores the flip decision from the previous frame, and that - // decision is reused when the symbol is in the retain range. - if (symbol.flipState !== FlipState.unknown && isInFlipRetainRange(firstPoint, lastPoint, aspectRatio)) { - return (symbol.flipState === FlipState.flipRequired) ? {needsFlipping: true} : null; - } - - // Check if flipping is required for "horizontal" case. - return (firstPoint.x > lastPoint.x) ? {needsFlipping: true} : null; -} - -function placeGlyphsAlongLine(symbol, fontSize, flip, keepUpright, posMatrix, labelPlaneMatrix, glCoordMatrix, glyphOffsetArray, lineVertexArray, dynamicLayoutVertexArray, anchorPoint, tileAnchorPoint, projectionCache, aspectRatio, getElevation, projection, tileID) { - const fontScale = fontSize / 24; - const lineOffsetX = symbol.lineOffsetX * fontScale; - const lineOffsetY = symbol.lineOffsetY * fontScale; - - let placedGlyphs; - if (symbol.numGlyphs > 1) { - const glyphEndIndex = symbol.glyphStartIndex + symbol.numGlyphs; - const lineStartIndex = symbol.lineStartIndex; - const 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 - const firstAndLastGlyph = placeFirstAndLastGlyph(fontScale, glyphOffsetArray, lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, false, projection, tileID); - if (!firstAndLastGlyph) { - return {notEnoughRoom: true}; + hasTransitions() { + if (this.light && this.light.hasTransition()) { + return true; } - const firstPoint = project(firstAndLastGlyph.first.point, glCoordMatrix).point; - const lastPoint = project(firstAndLastGlyph.last.point, glCoordMatrix).point; - if (keepUpright && !flip) { - const orientationChange = requiresOrientationChange(symbol, firstPoint, lastPoint, aspectRatio); - symbol.flipState = orientationChange && orientationChange.needsFlipping ? FlipState.flipRequired : FlipState.flipNotRequired; - if (orientationChange) { - return orientationChange; - } + if (this.fog && this.fog.hasTransition()) { + return true; } - placedGlyphs = [firstAndLastGlyph.first]; - for (let 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, getElevation, false, false, projection, tileID)); + for (const id in this._sourceCaches) { + if (this._sourceCaches[id].hasTransition()) { + return true; + } } - 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) { - const a = project(tileAnchorPoint, posMatrix).point; - const tileVertexIndex = (symbol.lineStartIndex + symbol.segment + 1); - // $FlowFixMe - const tileSegmentEnd = new transform.pointGeometry(lineVertexArray.getx(tileVertexIndex), lineVertexArray.gety(tileVertexIndex)); - const 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. - const b = (projectedVertex.signedDistanceFromCamera > 0) ? - projectedVertex.point : - projectTruncatedLineSegment(tileAnchorPoint, tileSegmentEnd, a, 1, posMatrix, undefined, projection, tileID.canonical); - const orientationChange = requiresOrientationChange(symbol, a, b, aspectRatio); - symbol.flipState = orientationChange && orientationChange.needsFlipping ? FlipState.flipRequired : FlipState.flipNotRequired; - if (orientationChange) { - return orientationChange; + for (const id in this._layers) { + if (this._layers[id].hasTransition()) { + return true; } } - // $FlowFixMe - const singleGlyph = placeGlyphAlongLine(fontScale * glyphOffsetArray.getoffsetX(symbol.glyphStartIndex), lineOffsetX, lineOffsetY, flip, anchorPoint, tileAnchorPoint, symbol.segment, - symbol.lineStartIndex, symbol.lineStartIndex + symbol.lineLength, lineVertexArray, labelPlaneMatrix, projectionCache, getElevation, false, false, projection, tileID); - if (!singleGlyph) - return {notEnoughRoom: true}; - placedGlyphs = [singleGlyph]; + return false; } - for (const glyph of placedGlyphs) { - transform.addDynamicAttributes(dynamicLayoutVertexArray, glyph.point, glyph.angle); + get order() { + if (this.map._optimizeForTerrain && this.terrain) { + ref_properties.assert_1(this._drapedFirstOrder.length === this._order.length); + return this._drapedFirstOrder; + } + return this._order; } - return {}; -} -function elevatePointAndProject(p , tileID , posMatrix , projection , getElevation ) { - const point = projection.projectTilePoint(p.x, p.y, tileID); - if (!getElevation) { - return project(point, posMatrix, point.z); + isLayerDraped(layer ) { + if (!this.terrain) return false; + return drapedLayers[layer.type]; } - const elevation = getElevation(p); - return project(new transform.pointGeometry(point.x + elevation[0], point.y + elevation[1]), posMatrix, point.z + elevation[2]); -} + _checkLoaded() { + if (!this._loaded) { + throw new Error('Style is not done loading'); + } + } -function projectTruncatedLineSegment(previousTilePoint , currentTilePoint , previousProjectedPoint , minimumLength , projectionMatrix , getElevation , projection , tileID ) { - // 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. - const unitVertex = previousTilePoint.add(previousTilePoint.sub(currentTilePoint)._unit()); - const projectedUnitVertex = elevatePointAndProject(unitVertex, tileID, projectionMatrix, projection, getElevation).point; - const projectedUnitSegment = previousProjectedPoint.sub(projectedUnitVertex); - - return previousProjectedPoint.add(projectedUnitSegment._mult(minimumLength / projectedUnitSegment.mag())); -} - -function interpolate(p1, p2, a) { - const b = 1 - a; - return new transform.pointGeometry(p1.x * b + p2.x * a, p1.y * b + p2.y * a); -} - -function placeGlyphAlongLine(offsetX , - lineOffsetX , - lineOffsetY , - flip , - anchorPoint , - tileAnchorPoint , - anchorSegment , - lineStartIndex , - lineEndIndex , - lineVertexArray , - labelPlaneMatrix , - projectionCache , - getElevation , - returnPathInTileCoords , - endGlyph , - reprojection , - tileID ) { + /** + * Apply queued style updates in a batch and recalculate zoom-dependent paint properties. + * @private + */ + update(parameters ) { + if (!this._loaded) { + return; + } - const combinedOffsetX = flip ? - offsetX - lineOffsetX : - offsetX + lineOffsetX; + const changed = this._changed; + if (this._changed) { + const updatedIds = Object.keys(this._updatedLayers); + const removedIds = Object.keys(this._removedLayers); - let dir = combinedOffsetX > 0 ? 1 : -1; + if (updatedIds.length || removedIds.length) { + this._updateWorkerLayers(updatedIds, removedIds); + } + for (const id in this._updatedSources) { + const action = this._updatedSources[id]; + ref_properties.assert_1(action === 'reload' || action === 'clear'); + if (action === 'reload') { + this._reloadSource(id); + } else if (action === 'clear') { + this._clearSource(id); + } + } - let angle = 0; - if (flip) { - // The label needs to be flipped to keep text upright. - // Iterate in the reverse direction. - dir *= -1; - angle = Math.PI; - } + this._updateTilesForChangedImages(); - if (dir < 0) angle += Math.PI; + for (const id in this._updatedPaintProps) { + this._layers[id].updateTransitions(parameters); + } - let currentIndex = dir > 0 ? - lineStartIndex + anchorSegment : - lineStartIndex + anchorSegment + 1; + this.light.updateTransitions(parameters); + if (this.fog) { + this.fog.updateTransitions(parameters); + } - let current = anchorPoint; - let prev = anchorPoint; - let distanceToPrev = 0; - let currentSegmentDistance = 0; - const absOffsetX = Math.abs(combinedOffsetX); - const pathVertices = []; - const tilePath = []; - let currentVertex = tileAnchorPoint; + this._resetUpdates(); + } - const previousTilePoint = () => { - const previousLineVertexIndex = currentIndex - dir; - return distanceToPrev === 0 ? - tileAnchorPoint : - new transform.pointGeometry(lineVertexArray.getx(previousLineVertexIndex), lineVertexArray.gety(previousLineVertexIndex)); - }; + const sourcesUsedBefore = {}; - const getTruncatedLineSegment = () => { - return projectTruncatedLineSegment(previousTilePoint(), currentVertex, prev, absOffsetX - distanceToPrev + 1, labelPlaneMatrix, getElevation, reprojection, tileID.canonical); - }; + for (const sourceId in this._sourceCaches) { + const sourceCache = this._sourceCaches[sourceId]; + sourcesUsedBefore[sourceId] = sourceCache.used; + sourceCache.used = false; + } - while (distanceToPrev + currentSegmentDistance <= absOffsetX) { - currentIndex += dir; + for (const layerId of this._order) { + const layer = this._layers[layerId]; - // offset does not fit on the projected line - if (currentIndex < lineStartIndex || currentIndex >= lineEndIndex) - return null; + layer.recalculate(parameters, this._availableImages); + if (!layer.isHidden(parameters.zoom)) { + const sourceCache = this._getLayerSourceCache(layer); + if (sourceCache) sourceCache.used = true; + } - prev = current; - pathVertices.push(current); - if (returnPathInTileCoords) tilePath.push(currentVertex || previousTilePoint()); + const painter = this.map.painter; + if (painter) { + const programIds = layer.getProgramIds(); + if (!programIds) continue; - current = projectionCache[currentIndex]; - if (current === undefined) { - currentVertex = new transform.pointGeometry(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); - const projection = elevatePointAndProject(currentVertex, tileID.canonical, labelPlaneMatrix, reprojection, getElevation); - 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 - // Don't cache because the new vertex might not be far enough out for future glyphs on the same segment - current = getTruncatedLineSegment(); + const programConfiguration = layer.getProgramConfiguration(parameters.zoom); + + for (const programId of programIds) { + painter.useProgram(programId, programConfiguration); + } } - } else { - currentVertex = null; // null stale data } - distanceToPrev += currentSegmentDistance; - currentSegmentDistance = prev.dist(current); - } - - if (endGlyph && getElevation) { - // For terrain, always truncate end points in order to handle terrain curvature. - // If previously truncated, on signedDistanceFromCamera < 0, don't do it. - // Cache as end point. The cache is cleared if there is need for flipping in updateLineLabels. - currentVertex = currentVertex || new transform.pointGeometry(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); - projectionCache[currentIndex] = current = (projectionCache[currentIndex] === undefined) ? current : getTruncatedLineSegment(); - currentSegmentDistance = prev.dist(current); - } - - // The point is on the current segment. Interpolate to find it. - const segmentInterpolationT = (absOffsetX - distanceToPrev) / currentSegmentDistance; - const prevToCurrent = current.sub(prev); - const p = prevToCurrent.mult(segmentInterpolationT)._add(prev); + for (const sourceId in sourcesUsedBefore) { + const sourceCache = this._sourceCaches[sourceId]; + if (sourcesUsedBefore[sourceId] !== sourceCache.used) { + sourceCache.getSource().fire(new ref_properties.Event('data', {sourceDataType: 'visibility', dataType:'source', sourceId: sourceCache.getSource().id})); + } + } - // offset the point from the line to text-offset and icon-offset - if (lineOffsetY) p._add(prevToCurrent._unit()._perp()._mult(lineOffsetY * dir)); + this.light.recalculate(parameters); + if (this.terrain) { + this.terrain.recalculate(parameters); + } + if (this.fog) { + this.fog.recalculate(parameters); + } + this.z = parameters.zoom; - const segmentAngle = angle + Math.atan2(current.y - prev.y, current.x - prev.x); + if (this._markersNeedUpdate) { + this._updateMarkersOpacity(); + this._markersNeedUpdate = false; + } - pathVertices.push(p); - if (returnPathInTileCoords) { - currentVertex = currentVertex || new transform.pointGeometry(lineVertexArray.getx(currentIndex), lineVertexArray.gety(currentIndex)); - const prevVertex = tilePath.length > 0 ? tilePath[tilePath.length - 1] : currentVertex; - tilePath.push(interpolate(prevVertex, currentVertex, segmentInterpolationT)); + if (changed) { + this.fire(new ref_properties.Event('data', {dataType: 'style'})); + } } - return { - point: p, - angle: segmentAngle, - path: pathVertices, - tilePath - }; -} - -const 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 (let i = 0; i < num; i++) { - const 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); + /* + * Apply any queued image changes. + */ + _updateTilesForChangedImages() { + const changedImages = Object.keys(this._changedImages); + if (changedImages.length) { + for (const name in this._sourceCaches) { + this._sourceCaches[name].reloadTilesForDependencies(['icons', 'patterns'], changedImages); + } + this._changedImages = {}; + } } -} -// 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 ) { - const 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; -} + _updateWorkerLayers(updatedIds , removedIds ) { + this.dispatcher.broadcast('updateLayers', { + layers: this._serializeLayers(updatedIds), + removedIds + }); + } -// + _resetUpdates() { + this._changed = false; -// 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. -const viewportPadding = 100; + this._updatedLayers = {}; + this._removedLayers = {}; -/** - * 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 - */ -class CollisionIndex { - - - - - - - - - + this._updatedSources = {}; + this._updatedPaintProps = {}; - constructor( - transform , - fogState , - grid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25), - ignoredGrid = new GridIndex(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25) - ) { - this.transform = transform; + this._changedImages = {}; + } - this.grid = grid; - this.ignoredGrid = ignoredGrid; - this.pitchfactor = Math.cos(transform._pitch) * transform.cameraToCenterDistance; + /** + * 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 + */ + setState(nextState ) { + this._checkLoaded(); - this.screenRightBoundary = transform.width + viewportPadding; - this.screenBottomBoundary = transform.height + viewportPadding; - this.gridRightBoundary = transform.width + 2 * viewportPadding; - this.gridBottomBoundary = transform.height + 2 * viewportPadding; - this.fogState = fogState; - } + if (emitValidationErrors(this, ref_properties.validateStyle(nextState))) return false; - placeCollisionBox(scale , collisionBox , shift , allowOverlap , textPixelRatio , posMatrix , collisionGroupPredicate ) { - transform.assert_1(!this.transform.elevation || collisionBox.elevation !== undefined); + nextState = ref_properties.clone$1(nextState); + nextState.layers = derefLayers(nextState.layers); - let anchorX = collisionBox.projectedAnchorX; - let anchorY = collisionBox.projectedAnchorY; - let anchorZ = collisionBox.projectedAnchorZ; + const changes = diffStyles(this.serialize(), nextState) + .filter(op => !(op.command in ignoredDiffOperations)); - // Apply elevation vector to the anchor point - const elevation = collisionBox.elevation; - const tileID = collisionBox.tileID; - if (elevation && tileID) { - const tileTransform = this.transform.projection - .createTileTransform(this.transform, this.transform.worldSize); - const up = tileTransform.upVector(tileID.canonical, collisionBox.tileAnchorX, collisionBox.tileAnchorY); - const upScale = tileTransform.upVectorScale(tileID.canonical); + if (changes.length === 0) { + return false; + } - anchorX += up[0] * elevation * upScale; - anchorY += up[1] * elevation * upScale; - anchorZ += up[2] * elevation * upScale; + const unimplementedOps = changes.filter(op => !(op.command in supportedDiffOperations)); + if (unimplementedOps.length > 0) { + throw new Error(`Unimplemented: ${unimplementedOps.map(op => op.command).join(', ')}.`); } - const projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, anchorX, anchorY, anchorZ, collisionBox.tileID); + changes.forEach((op) => { + if (op.command === 'setTransition') { + // `transition` is always read directly off of + // `this.stylesheet`, which we update below + return; + } + (this )[op.command].apply(this, op.args); + }); - const tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio; - const tlX = (collisionBox.x1 * scale + shift.x - collisionBox.padding) * tileToViewport + projectedPoint.point.x; - const tlY = (collisionBox.y1 * scale + shift.y - collisionBox.padding) * tileToViewport + projectedPoint.point.y; - const brX = (collisionBox.x2 * scale + shift.x + collisionBox.padding) * tileToViewport + projectedPoint.point.x; - const brY = (collisionBox.y2 * scale + shift.y + collisionBox.padding) * tileToViewport + projectedPoint.point.y; - // Clip at 10 times the distance of the map center or, said otherwise, when the label - // would be drawn at 10% the size of the features around it without scaling. Refer: - // https://github.com/mapbox/mapbox-gl-native/wiki/Text-Rendering#perspective-scaling - // 0.55 === projection.getPerspectiveRatio(camera_to_center, camera_to_center * 10) - const minPerspectiveRatio = 0.55; - const isClipped = projectedPoint.perspectiveRatio <= minPerspectiveRatio || projectedPoint.aboveHorizon; + this.stylesheet = nextState; + this._updateMapProjection(); - if (!this.isInsideGrid(tlX, tlY, brX, brY) || - (!allowOverlap && this.grid.hitTest(tlX, tlY, brX, brY, collisionGroupPredicate)) || - isClipped) { - return { - box: [], - offscreen: false - }; + return true; + } + + addImage(id , image ) { + if (this.getImage(id)) { + return this.fire(new ref_properties.ErrorEvent(new Error('An image with this name already exists.'))); } + this.imageManager.addImage(id, image); + this._afterImageUpdated(id); + return this; + } - return { - box: [tlX, tlY, brX, brY], - offscreen: this.isOffscreen(tlX, tlY, brX, brY) - }; + updateImage(id , image ) { + this.imageManager.updateImage(id, image); } - placeCollisionCircles(allowOverlap , - symbol , - lineVertexArray , - glyphOffsetArray , - fontSize , - posMatrix , - labelPlaneMatrix , - labelToScreenMatrix , - showCollisionCircles , - pitchWithMap , - collisionGroupPredicate , - circlePixelDiameter , - textPixelPadding , - tileID ) { - const placedCollisionCircles = []; - const elevation = this.transform.elevation; - const tileTransform = this.transform.projection.createTileTransform(this.transform, this.transform.worldSize); - const getElevation = elevation ? elevation.getAtTileOffsetFunc(tileID, tileTransform) : (_ => [0, 0, 0]); - const tileUnitAnchorPoint = new transform.pointGeometry(symbol.tileAnchorX, symbol.tileAnchorY); - const projectedAnchor = this.transform.projection.projectTilePoint(symbol.tileAnchorX, symbol.tileAnchorY, tileID.canonical); - const anchorElevation = getElevation(tileUnitAnchorPoint); - const elevatedAnchor = [projectedAnchor.x + anchorElevation[0], projectedAnchor.y + anchorElevation[1], projectedAnchor.z + anchorElevation[2]]; - const screenAnchorPoint = this.projectAndGetPerspectiveRatio(posMatrix, elevatedAnchor[0], elevatedAnchor[1], elevatedAnchor[2], tileID); - const {perspectiveRatio} = screenAnchorPoint; - const labelPlaneFontSize = pitchWithMap ? fontSize / perspectiveRatio : fontSize * perspectiveRatio; - const labelPlaneFontScale = labelPlaneFontSize / transform.ONE_EM; - const labelPlaneAnchorPoint = project(new transform.pointGeometry(elevatedAnchor[0], elevatedAnchor[1]), labelPlaneMatrix, elevatedAnchor[2]).point; + getImage(id ) { + return this.imageManager.getImage(id); + } - const projectionCache = {}; - const lineOffsetX = symbol.lineOffsetX * labelPlaneFontScale; - const lineOffsetY = symbol.lineOffsetY * labelPlaneFontScale; + removeImage(id ) { + if (!this.getImage(id)) { + return this.fire(new ref_properties.ErrorEvent(new Error('No image with this name exists.'))); + } + this.imageManager.removeImage(id); + this._afterImageUpdated(id); + return this; + } - const firstAndLastGlyph = screenAnchorPoint.signedDistanceFromCamera > 0 ? placeFirstAndLastGlyph( - labelPlaneFontScale, - glyphOffsetArray, - lineOffsetX, - lineOffsetY, - /*flip*/ false, - labelPlaneAnchorPoint, - tileUnitAnchorPoint, - symbol, - lineVertexArray, - labelPlaneMatrix, - projectionCache, - elevation && !pitchWithMap ? getElevation : null, // pitchWithMap: no need to sample elevation as it has no effect when projecting using scale/rotate to tile space labelPlaneMatrix. - pitchWithMap && !!elevation, - this.transform.projection, - tileID - ) : null; + _afterImageUpdated(id ) { + this._availableImages = this.imageManager.listImages(); + this._changedImages[id] = true; + this._changed = true; + this.dispatcher.broadcast('setImages', this._availableImages); + this.fire(new ref_properties.Event('data', {dataType: 'style'})); + } - let collisionDetected = false; - let inGrid = false; - let entirelyOffscreen = true; + listImages() { + this._checkLoaded(); + return this._availableImages.slice(); + } - if (firstAndLastGlyph && !screenAnchorPoint.aboveHorizon) { - const radius = circlePixelDiameter * 0.5 * perspectiveRatio + textPixelPadding; - const screenPlaneMin = new transform.pointGeometry(-viewportPadding, -viewportPadding); - const screenPlaneMax = new transform.pointGeometry(this.screenRightBoundary, this.screenBottomBoundary); - const interpolator = new PathInterpolator(); + addSource(id , source , options = {}) { + this._checkLoaded(); - // Construct a projected path from projected line vertices. Anchor points are ignored and removed - const first = firstAndLastGlyph.first; - const last = firstAndLastGlyph.last; + if (this.getSource(id) !== undefined) { + throw new Error('There is already a source with this ID'); + } - let projectedPath = []; - for (let i = first.path.length - 1; i >= 1; i--) { - projectedPath.push(first.path[i]); - } - for (let i = 1; i < last.path.length; i++) { - projectedPath.push(last.path[i]); - } - transform.assert_1(projectedPath.length >= 2); + if (!source.type) { + throw new Error(`The type property must be defined, but only the following properties were given: ${Object.keys(source).join(', ')}.`); + } - // Tolerate a slightly longer distance than one diameter between two adjacent circles - const circleDist = radius * 2.5; + const builtIns = ['vector', 'raster', 'geojson', 'video', 'image']; + const shouldValidate = builtIns.indexOf(source.type) >= 0; + if (shouldValidate && this._validate(ref_properties.validateSource, `sources.${id}`, source, null, options)) return; - // The path might need to be converted into screen space if a pitched map is used as the label space - if (labelToScreenMatrix) { - transform.assert_1(pitchWithMap); - const screenSpacePath = elevation ? - projectedPath.map((p, index) => { - const elevation = getElevation(index < first.path.length - 1 ? first.tilePath[first.path.length - 1 - index] : last.tilePath[index - first.path.length + 2]); - return project(p, labelToScreenMatrix, elevation[2]); - }) : - projectedPath.map(p => project(p, labelToScreenMatrix)); + if (this.map && this.map._collectResourceTiming) (source ).collectResourceTiming = true; - // Do not try to place collision circles if even of the points is behind the camera. - // This is a plausible scenario with big camera pitch angles - if (screenSpacePath.some(point => point.signedDistanceFromCamera <= 0)) { - projectedPath = []; - } else { - projectedPath = screenSpacePath.map(p => p.point); - } - } + const sourceInstance = create(id, source, this.dispatcher, this); - let segments = []; + sourceInstance.setEventedParent(this, () => ({ + isSourceLoaded: this._isSourceCacheLoaded(id), + source: sourceInstance.serialize(), + sourceId: id + })); - if (projectedPath.length > 0) { - // Quickly check if the path is fully inside or outside of the padded collision region. - // For overlapping paths we'll only create collision circles for the visible segments - const minPoint = projectedPath[0].clone(); - const maxPoint = projectedPath[0].clone(); - - for (let i = 1; i < projectedPath.length; i++) { - minPoint.x = Math.min(minPoint.x, projectedPath[i].x); - minPoint.y = Math.min(minPoint.y, projectedPath[i].y); - maxPoint.x = Math.max(maxPoint.x, projectedPath[i].x); - maxPoint.y = Math.max(maxPoint.y, projectedPath[i].y); - } + const addSourceCache = (onlySymbols) => { + const sourceCacheId = (onlySymbols ? 'symbol:' : 'other:') + id; + const sourceCache = this._sourceCaches[sourceCacheId] = new ref_properties.SourceCache(sourceCacheId, sourceInstance, onlySymbols); + (onlySymbols ? this._symbolSourceCaches : this._otherSourceCaches)[id] = sourceCache; + sourceCache.style = this; - if (minPoint.x >= screenPlaneMin.x && maxPoint.x <= screenPlaneMax.x && - minPoint.y >= screenPlaneMin.y && maxPoint.y <= screenPlaneMax.y) { - // Quad fully visible - segments = [projectedPath]; - } else if (maxPoint.x < screenPlaneMin.x || minPoint.x > screenPlaneMax.x || - maxPoint.y < screenPlaneMin.y || minPoint.y > screenPlaneMax.y) { - // Not visible - segments = []; - } else { - segments = transform.clipLine([projectedPath], screenPlaneMin.x, screenPlaneMin.y, screenPlaneMax.x, screenPlaneMax.y); - } - } + sourceCache.onAdd(this.map); + }; - for (const seg of segments) { - // interpolate positions for collision circles. Add a small padding to both ends of the segment - transform.assert_1(seg.length > 0); - interpolator.reset(seg, radius * 0.25); + addSourceCache(false); + if (source.type === 'vector' || source.type === 'geojson') { + addSourceCache(true); + } - let numCircles = 0; + if (sourceInstance.onAdd) sourceInstance.onAdd(this.map); - if (interpolator.length <= 0.5 * radius) { - numCircles = 1; - } else { - numCircles = Math.ceil(interpolator.paddedLength / circleDist) + 1; - } + this._changed = true; + } - for (let i = 0; i < numCircles; i++) { - const t = i / Math.max(numCircles - 1, 1); - const circlePosition = interpolator.lerp(t); + /** + * 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. + * @returns {Map} The {@link Map} object. + */ + removeSource(id ) { + this._checkLoaded(); - // add viewport padding to the position and perform initial collision check - const centerX = circlePosition.x + viewportPadding; - const centerY = circlePosition.y + viewportPadding; + const source = this.getSource(id); + if (!source) { + throw new Error('There is no source with this ID'); + } + for (const layerId in this._layers) { + if (this._layers[layerId].source === id) { + return this.fire(new ref_properties.ErrorEvent(new Error(`Source "${id}" cannot be removed while layer "${layerId}" is using it.`))); + } + } + if (this.terrain && this.terrain.get().source === id) { + return this.fire(new ref_properties.ErrorEvent(new Error(`Source "${id}" cannot be removed while terrain is using it.`))); + } - placedCollisionCircles.push(centerX, centerY, radius, 0); + const sourceCaches = this._getSourceCaches(id); + for (const sourceCache of sourceCaches) { + delete this._sourceCaches[sourceCache.id]; + delete this._updatedSources[sourceCache.id]; + sourceCache.fire(new ref_properties.Event('data', {sourceDataType: 'metadata', dataType:'source', sourceId: sourceCache.getSource().id})); + sourceCache.setEventedParent(null); + sourceCache.clearTiles(); + } + delete this._otherSourceCaches[id]; + delete this._symbolSourceCaches[id]; - const x1 = centerX - radius; - const y1 = centerY - radius; - const x2 = centerX + radius; - const y2 = centerY + radius; + source.setEventedParent(null); + if (source.onRemove) { + source.onRemove(this.map); + } + this._changed = true; + return this; + } - entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2); - inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2); + /** + * Set the data of a GeoJSON source, given its ID. + * @param {string} id ID of the source. + * @param {GeoJSON|string} data GeoJSON source. + */ + setGeoJSONSourceData(id , data ) { + this._checkLoaded(); - if (!allowOverlap) { - if (this.grid.hitTestCircle(centerX, centerY, radius, collisionGroupPredicate)) { - // Don't early exit if we're showing the debug circles because we still want to calculate - // which circles are in use - collisionDetected = true; - if (!showCollisionCircles) { - return { - circles: [], - offscreen: false, - collisionDetected - }; - } - } - } - } - } - } + ref_properties.assert_1(this.getSource(id) !== undefined, 'There is no source with this ID'); + const geojsonSource = (this.getSource(id) ); + ref_properties.assert_1(geojsonSource.type === 'geojson'); - return { - circles: ((!showCollisionCircles && collisionDetected) || !inGrid) ? [] : placedCollisionCircles, - offscreen: entirelyOffscreen, - collisionDetected - }; + geojsonSource.setData(data); + this._changed = true; } /** - * 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`. - * - * @private + * Get a source by ID. + * @param {string} id ID of the desired source. + * @returns {?Source} The source object. */ - queryRenderedSymbols(viewportQueryGeometry ) { - if (viewportQueryGeometry.length === 0 || (this.grid.keysLength() === 0 && this.ignoredGrid.keysLength() === 0)) { - return {}; - } + getSource(id ) { + const sourceCache = this._getSourceCache(id); + return sourceCache && sourceCache.getSource(); + } - const query = []; - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; - for (const point of viewportQueryGeometry) { - const gridPoint = new transform.pointGeometry(point.x + viewportPadding, point.y + viewportPadding); - minX = Math.min(minX, gridPoint.x); - minY = Math.min(minY, gridPoint.y); - maxX = Math.max(maxX, gridPoint.x); - maxY = Math.max(maxY, gridPoint.y); - query.push(gridPoint); + /** + * 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 {Object | CustomLayerInterface} layerObject The style layer to add. + * @param {string} [before] ID of an existing layer to insert before. + * @param {Object} options Style setter options. + * @returns {Map} The {@link Map} object. + */ + addLayer(layerObject , before , options = {}) { + this._checkLoaded(); + + const id = layerObject.id; + + if (this.getLayer(id)) { + this.fire(new ref_properties.ErrorEvent(new Error(`Layer with id "${id}" already exists on this map`))); + return; } - const features = this.grid.query(minX, minY, maxX, maxY) - .concat(this.ignoredGrid.query(minX, minY, maxX, maxY)); + let layer; + if (layerObject.type === 'custom') { - const seenFeatures = {}; - const result = {}; + if (emitValidationErrors(this, ref_properties.validateCustomStyleLayer(layerObject))) return; - for (const feature of features) { - const featureKey = feature.key; - // Skip already seen features. - if (seenFeatures[featureKey.bucketInstanceId] === undefined) { - seenFeatures[featureKey.bucketInstanceId] = {}; - } - if (seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex]) { - continue; - } + layer = ref_properties.createStyleLayer(layerObject); - // 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. - const bbox = [ - new transform.pointGeometry(feature.x1, feature.y1), - new transform.pointGeometry(feature.x2, feature.y1), - new transform.pointGeometry(feature.x2, feature.y2), - new transform.pointGeometry(feature.x1, feature.y2) - ]; - if (!transform.polygonIntersectsPolygon(query, bbox)) { - continue; + } else { + if (typeof layerObject.source === 'object') { + this.addSource(id, layerObject.source); + layerObject = ref_properties.clone$1(layerObject); + layerObject = (ref_properties.extend(layerObject, {source: id}) ); } - seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex] = true; - if (result[featureKey.bucketInstanceId] === undefined) { - result[featureKey.bucketInstanceId] = []; - } - result[featureKey.bucketInstanceId].push(featureKey.featureIndex); + // this layer is not in the style.layers array, so we pass an impossible array index + if (this._validate(ref_properties.validateLayer, + `layers.${id}`, layerObject, {arrayIndex: -1}, options)) return; + + layer = ref_properties.createStyleLayer(layerObject); + this._validateLayer(layer); + + layer.setEventedParent(this, {layer: {id}}); + this._serializedLayers[layer.id] = layer.serialize(); + this._updateLayerCount(layer, true); } - return result; - } + const index = before ? this._order.indexOf(before) : this._order.length; + if (before && index === -1) { + this.fire(new ref_properties.ErrorEvent(new Error(`Layer with id "${before}" does not exist on this map.`))); + return; + } - insertCollisionBox(collisionBox , ignorePlacement , bucketInstanceId , featureIndex , collisionGroupID ) { - const grid = ignorePlacement ? this.ignoredGrid : this.grid; + this._order.splice(index, 0, id); + this._layerOrderChanged = true; - const key = {bucketInstanceId, featureIndex, collisionGroupID}; - grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]); - } + this._layers[id] = layer; - insertCollisionCircles(collisionCircles , ignorePlacement , bucketInstanceId , featureIndex , collisionGroupID ) { - const grid = ignorePlacement ? this.ignoredGrid : this.grid; + const sourceCache = this._getLayerSourceCache(layer); + if (this._removedLayers[id] && layer.source && sourceCache && layer.type !== 'custom') { + // 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 + const removed = this._removedLayers[id]; + delete this._removedLayers[id]; + if (removed.type !== layer.type) { + this._updatedSources[layer.source] = 'clear'; + } else { + this._updatedSources[layer.source] = 'reload'; + sourceCache.pause(); + } + } + this._updateLayer(layer); - const key = {bucketInstanceId, featureIndex, collisionGroupID}; - for (let k = 0; k < collisionCircles.length; k += 4) { - grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]); + if (layer.onAdd) { + layer.onAdd(this.map); } + + this._updateDrapeFirstLayers(); } - projectAndGetPerspectiveRatio(posMatrix , x , y , elevation , tileID ) { - const p = [x, y, elevation || 0, 1]; - let aboveHorizon = false; - if (elevation || this.transform.pitch > 0) { - transform.transformMat4$1(p, p, posMatrix); + /** + * 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. + */ + moveLayer(id , before ) { + this._checkLoaded(); + this._changed = true; - let behindFog = false; - if (this.fogState && tileID) { - const fogOpacity = getFogOpacityAtTileCoord(this.fogState, x, y, elevation || 0, tileID.toUnwrapped(), this.transform); - behindFog = fogOpacity > FOG_SYMBOL_CLIPPING_THRESHOLD; - } + const layer = this._layers[id]; + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${id}' does not exist in the map's style and cannot be moved.`))); + return; + } - aboveHorizon = p[2] > p[3] || behindFog; - } else { - xyTransformMat4(p, p, posMatrix); + if (id === before) { + return; } - const a = new transform.pointGeometry( - (((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: Math.min(0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3]), 1.5), - signedDistanceFromCamera: p[3], - aboveHorizon - }; - } + const index = this._order.indexOf(id); + this._order.splice(index, 1); - isOffscreen(x1 , y1 , x2 , y2 ) { - return x2 < viewportPadding || x1 >= this.screenRightBoundary || y2 < viewportPadding || y1 > this.screenBottomBoundary; - } + const newIndex = before ? this._order.indexOf(before) : this._order.length; + if (before && newIndex === -1) { + this.fire(new ref_properties.ErrorEvent(new Error(`Layer with id "${before}" does not exist on this map.`))); + return; + } + this._order.splice(newIndex, 0, id); - isInsideGrid(x1 , y1 , x2 , y2 ) { - return x2 >= 0 && x1 < this.gridRightBoundary && y2 >= 0 && y1 < this.gridBottomBoundary; - } + this._layerOrderChanged = true; - /* - * Returns a matrix for transforming collision shapes to viewport coordinate space. - * Use this function to render e.g. collision circles on the screen. - * example transformation: clipPos = glCoordMatrix * viewportMatrix * circle_pos - */ - getViewportMatrix() { - const m = transform.identity([]); - transform.translate(m, m, [-viewportPadding, -viewportPadding, 0.0]); - return m; + this._updateDrapeFirstLayers(); } -} -// - - - - - - - - - + /** + * 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 Map.event:error + */ + removeLayer(id ) { + this._checkLoaded(); -class OpacityState { - - - constructor(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; + const layer = this._layers[id]; + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${id}' does not exist in the map's style and cannot be removed.`))); + return; } - this.placed = placed; - } - isHidden() { - return this.opacity === 0 && !this.placed; - } -} -class JointOpacityState { - - - - constructor(prevState , increment , placedText , placedIcon , skipFade , clipped = false) { - this.text = new OpacityState(prevState ? prevState.text : null, increment, placedText, skipFade); - this.icon = new OpacityState(prevState ? prevState.icon : null, increment, placedIcon, skipFade); + layer.setEventedParent(null); - this.clipped = clipped; - } - isHidden() { - return this.text.isHidden() && this.icon.isHidden(); - } -} + this._updateLayerCount(layer, false); -class JointPlacement { - - - // skipFade = outside viewport, but within CollisionIndex::viewportPadding px of the edge - // Because these symbols aren't onscreen yet, we can skip the "fade in" animation, - // and if a subsequent viewport change brings them into view, they'll be fully - // visible right away. - + const index = this._order.indexOf(id); + this._order.splice(index, 1); - - constructor(text , icon , skipFade , clipped = false) { - this.text = text; - this.icon = icon; - this.skipFade = skipFade; - this.clipped = clipped; + this._layerOrderChanged = true; + this._changed = true; + this._removedLayers[id] = layer; + delete this._layers[id]; + delete this._serializedLayers[id]; + delete this._updatedLayers[id]; + delete this._updatedPaintProps[id]; + + if (layer.onRemove) { + layer.onRemove(this.map); + } + + this._updateDrapeFirstLayers(); } -} -class CollisionCircleArray { - // Stores collision circles and placement matrices of a bucket for debug rendering. - - - + /** + * Return the style layer object with the given `id`. + * + * @param {string} id ID of the desired layer. + * @returns {?StyleLayer} A layer, if one with the given `id` exists. + */ + getLayer(id ) { + return this._layers[id]; + } - constructor() { - this.invProjMatrix = transform.create(); - this.viewportMatrix = transform.create(); - this.circles = []; + /** + * Checks if a specific layer is present within the style. + * + * @param {string} id ID of the desired layer. + * @returns {boolean} A boolean specifying if the given layer is present. + */ + hasLayer(id ) { + return id in this._layers; } -} -class RetainedQueryData { - - - - - - - constructor(bucketInstanceId , - featureIndex , - sourceLayerIndex , - bucketIndex , - tileID ) { - this.bucketInstanceId = bucketInstanceId; - this.featureIndex = featureIndex; - this.sourceLayerIndex = sourceLayerIndex; - this.bucketIndex = bucketIndex; - this.tileID = tileID; + /** + * Checks if a specific layer type is present within the style. + * + * @param {string} type Type of the desired layer. + * @returns {boolean} A boolean specifying if the given layer type is present. + */ + hasLayerType(type ) { + for (const layerId in this._layers) { + const layer = this._layers[layerId]; + if (layer.type === type) { + return true; + } + } + return false; } -} - + setLayerZoomRange(layerId , minzoom , maxzoom ) { + this._checkLoaded(); -class CollisionGroups { - - - + const layer = this.getLayer(layerId); + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot have zoom extent.`))); + return; + } - constructor(crossSourceCollisions ) { - this.crossSourceCollisions = crossSourceCollisions; - this.maxGroupID = 0; - this.collisionGroups = {}; - } + if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) return; - get(sourceID ) { - // The predicate/groupID mechanism allows for arbitrary grouping, - // but the current interface defines one source == one group when - // crossSourceCollisions == true. - if (!this.crossSourceCollisions) { - if (!this.collisionGroups[sourceID]) { - const nextGroupID = ++this.maxGroupID; - this.collisionGroups[sourceID] = { - ID: nextGroupID, - predicate: (key) => { - return key.collisionGroupID === nextGroupID; - } - }; - } - return this.collisionGroups[sourceID]; - } else { - return {ID: 0, predicate: null}; + if (minzoom != null) { + layer.minzoom = minzoom; + } + if (maxzoom != null) { + layer.maxzoom = maxzoom; } + this._updateLayer(layer); } -} -function calculateVariableLayoutShift(anchor , width , height , textOffset , textScale ) { - const {horizontalAlign, verticalAlign} = transform.getAnchorAlignment(anchor); - const shiftX = -(horizontalAlign - 0.5) * width; - const shiftY = -(verticalAlign - 0.5) * height; - const offset = transform.evaluateVariableOffset(anchor, textOffset); - return new transform.pointGeometry( - shiftX + offset[0] * textScale, - shiftY + offset[1] * textScale - ); -} + setFilter(layerId , filter , options = {}) { + this._checkLoaded(); -function offsetShift(shiftX , shiftY , rotateWithMap , pitchWithMap , angle ) { - const shift = new transform.pointGeometry(shiftX, shiftY); - if (rotateWithMap) { - shift._rotate(pitchWithMap ? angle : -angle); - } - return shift; -} + const layer = this.getLayer(layerId); + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be filtered.`))); + return; + } - - - - - - - - + if (ref_properties.deepEqual(layer.filter, filter)) { + return; + } - - - - - - - - - - - - - + if (filter === null || filter === undefined) { + layer.filter = undefined; + this._updateLayer(layer); + return; + } - - - - - - + if (this._validate(ref_properties.validateFilter, `layers.${layer.id}.filter`, filter, {layerType: layer.type}, options)) { + return; + } - + layer.filter = ref_properties.clone$1(filter); + this._updateLayer(layer); + } -class Placement { - - - - - - - - - - - - - - - - + /** + * Get a layer's filter object. + * @param {string} layerId The layer to inspect. + * @returns {*} The layer's filter, if any. + */ + getFilter(layerId ) { + const layer = this.getLayer(layerId); + return layer && ref_properties.clone$1(layer.filter); + } - constructor(transform , fadeDuration , crossSourceCollisions , prevPlacement , fogState ) { - this.transform = transform.clone(); - this.collisionIndex = new CollisionIndex(this.transform, fogState); - this.placements = {}; - this.opacities = {}; - this.variableOffsets = {}; - this.stale = false; - this.commitTime = 0; - this.fadeDuration = fadeDuration; - this.retainedQueryData = {}; - this.collisionGroups = new CollisionGroups(crossSourceCollisions); - this.collisionCircleArrays = {}; + setLayoutProperty(layerId , name , value , options = {}) { + this._checkLoaded(); - this.prevPlacement = prevPlacement; - if (prevPlacement) { - prevPlacement.prevPlacement = undefined; // Only hold on to one placement back + const layer = this.getLayer(layerId); + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be styled.`))); + return; } - this.placedOrientations = {}; + if (ref_properties.deepEqual(layer.getLayoutProperty(name), value)) return; + + layer.setLayoutProperty(name, value, options); + this._updateLayer(layer); } - getBucketParts(results , styleLayer , tile , sortAcrossTiles ) { - const symbolBucket = ((tile.getBucket(styleLayer) ) ); - const bucketFeatureIndex = tile.latestFeatureIndex; + /** + * Get a layout property's value from a given layer. + * @param {string} layerId The layer to inspect. + * @param {string} name The name of the layout property. + * @returns {*} The property value. + */ + getLayoutProperty(layerId , name ) { + const layer = this.getLayer(layerId); + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style.`))); + return; + } - if (!symbolBucket || !bucketFeatureIndex || styleLayer.id !== symbolBucket.layerIds[0]) + return layer.getLayoutProperty(name); + } + + setPaintProperty(layerId , name , value , options = {}) { + this._checkLoaded(); + + const layer = this.getLayer(layerId); + if (!layer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be styled.`))); return; + } - const layout = symbolBucket.layers[0].layout; + if (ref_properties.deepEqual(layer.getPaintProperty(name), value)) return; - const collisionBoxArray = tile.collisionBoxArray; - const scale = Math.pow(2, this.transform.zoom - tile.tileID.overscaledZ); - const textPixelRatio = tile.tileSize / transform.EXTENT; - const unwrappedTileID = tile.tileID.toUnwrapped(); + const requiresRelayout = layer.setPaintProperty(name, value, options); + if (requiresRelayout) { + this._updateLayer(layer); + } + + this._changed = true; + this._updatedPaintProps[layerId] = true; + } - const posMatrix = this.transform.calculateProjMatrix(unwrappedTileID); + getPaintProperty(layerId , name ) { + const layer = this.getLayer(layerId); + return layer && layer.getPaintProperty(name); + } - const pitchWithMap = layout.get('text-pitch-alignment') === 'map'; - const rotateWithMap = layout.get('text-rotation-alignment') === 'map'; + setFeatureState(target , state ) { + this._checkLoaded(); + const sourceId = target.source; + const sourceLayer = target.sourceLayer; + const source = this.getSource(sourceId); - styleLayer.compileFilter(); + if (!source) { + this.fire(new ref_properties.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`))); + return; + } + const sourceType = source.type; + if (sourceType === 'geojson' && sourceLayer) { + this.fire(new ref_properties.ErrorEvent(new Error(`GeoJSON sources cannot have a sourceLayer parameter.`))); + return; + } + if (sourceType === 'vector' && !sourceLayer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`))); + return; + } + if (target.id === undefined) { + this.fire(new ref_properties.ErrorEvent(new Error(`The feature id parameter must be provided.`))); + } - const dynamicFilter = styleLayer.dynamicFilter(); - const dynamicFilterNeedsFeature = styleLayer.dynamicFilterNeedsFeature(); - const pixelsToTiles = this.transform.calculatePixelsToTileUnitsMatrix(tile); + const sourceCaches = this._getSourceCaches(sourceId); + for (const sourceCache of sourceCaches) { + sourceCache.setFeatureState(sourceLayer, target.id, state); + } + } - const textLabelPlaneMatrix = getLabelPlaneMatrix(posMatrix, - tile.tileID.canonical, - pitchWithMap, - rotateWithMap, - this.transform, - pixelsToTiles); + removeFeatureState(target , key ) { + this._checkLoaded(); + const sourceId = target.source; + const source = this.getSource(sourceId); - let labelToScreenMatrix = null; + if (!source) { + this.fire(new ref_properties.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`))); + return; + } - if (pitchWithMap) { - const glMatrix = getGlCoordMatrix( - posMatrix, - tile.tileID.canonical, - pitchWithMap, - rotateWithMap, - this.transform, - pixelsToTiles); + const sourceType = source.type; + const sourceLayer = sourceType === 'vector' ? target.sourceLayer : undefined; - labelToScreenMatrix = transform.multiply$1([], this.transform.labelPlaneMatrix, glMatrix); + if (sourceType === 'vector' && !sourceLayer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`))); + return; } - let clippingData = null; - transform.assert_1(!!tile.latestFeatureIndex); - if (!!dynamicFilter && tile.latestFeatureIndex) { + if (key && (typeof target.id !== 'string' && typeof target.id !== 'number')) { + this.fire(new ref_properties.ErrorEvent(new Error(`A feature id is required to remove its specific state property.`))); + return; + } - clippingData = { - unwrappedTileID, - dynamicFilter, - dynamicFilterNeedsFeature, - featureIndex: tile.latestFeatureIndex - }; + const sourceCaches = this._getSourceCaches(sourceId); + for (const sourceCache of sourceCaches) { + sourceCache.removeFeatureState(sourceLayer, target.id, key); } + } - // As long as this placement lives, we have to hold onto this bucket's - // matching FeatureIndex/data for querying purposes - this.retainedQueryData[symbolBucket.bucketInstanceId] = new RetainedQueryData( - symbolBucket.bucketInstanceId, - bucketFeatureIndex, - symbolBucket.sourceLayerIndex, - symbolBucket.index, - tile.tileID - ); + getFeatureState(target ) { + this._checkLoaded(); + const sourceId = target.source; + const sourceLayer = target.sourceLayer; + const source = this.getSource(sourceId); - const parameters = { - bucket: symbolBucket, - layout, - posMatrix, - textLabelPlaneMatrix, - labelToScreenMatrix, - clippingData, - scale, - textPixelRatio, - holdingForFade: tile.holdingForFade(), - collisionBoxArray, - partiallyEvaluatedTextSize: transform.evaluateSizeForZoom(symbolBucket.textSizeData, this.transform.zoom), - partiallyEvaluatedIconSize: transform.evaluateSizeForZoom(symbolBucket.iconSizeData, this.transform.zoom), - collisionGroup: this.collisionGroups.get(symbolBucket.sourceID) - }; + if (!source) { + this.fire(new ref_properties.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`))); + return; + } + const sourceType = source.type; + if (sourceType === 'vector' && !sourceLayer) { + this.fire(new ref_properties.ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`))); + return; + } + if (target.id === undefined) { + this.fire(new ref_properties.ErrorEvent(new Error(`The feature id parameter must be provided.`))); + } - if (sortAcrossTiles) { - for (const range of symbolBucket.sortKeyRanges) { - const {sortKey, symbolInstanceStart, symbolInstanceEnd} = range; - results.push({sortKey, symbolInstanceStart, symbolInstanceEnd, parameters}); + const sourceCaches = this._getSourceCaches(sourceId); + return sourceCaches[0].getFeatureState(sourceLayer, target.id); + } + + getTransition() { + return ref_properties.extend({duration: 300, delay: 0}, this.stylesheet && this.stylesheet.transition); + } + + serialize() { + const sources = {}; + for (const cacheId in this._sourceCaches) { + const source = this._sourceCaches[cacheId].getSource(); + if (!sources[source.id]) { + sources[source.id] = source.serialize(); } - } else { - results.push({ - symbolInstanceStart: 0, - symbolInstanceEnd: symbolBucket.symbolInstances.length, - parameters - }); } + return ref_properties.filterObject({ + version: this.stylesheet.version, + name: this.stylesheet.name, + metadata: this.stylesheet.metadata, + light: this.stylesheet.light, + terrain: this.stylesheet.terrain, + fog: this.stylesheet.fog, + 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, + projection: this.stylesheet.projection, + sources, + layers: this._serializeLayers(this._order) + }, (value) => { return value !== undefined; }); } - attemptAnchorPlacement(anchor , textBox , width , height , - textScale , rotateWithMap , pitchWithMap , textPixelRatio , - posMatrix , collisionGroup , textAllowOverlap , - symbolInstance , symbolIndex , bucket , - orientation , iconBox , textSize , iconSize ) { + _updateLayer(layer ) { + this._updatedLayers[layer.id] = true; + const sourceCache = this._getLayerSourceCache(layer); + if (layer.source && !this._updatedSources[layer.source] && + //Skip for raster layers (https://github.com/mapbox/mapbox-gl-js/issues/7865) + sourceCache && + sourceCache.getSource().type !== 'raster') { + this._updatedSources[layer.source] = 'reload'; + sourceCache.pause(); + } + this._changed = true; + layer.invalidateCompiledFilter(); - const textOffset = [symbolInstance.textOffset0, symbolInstance.textOffset1]; - const shift = calculateVariableLayoutShift(anchor, width, height, textOffset, textScale); + } - const placedGlyphBoxes = this.collisionIndex.placeCollisionBox( - textScale, textBox, offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), - textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); + _flattenAndSortRenderedFeatures(sourceResults ) { + // Feature order is complicated. + // The order between features in two 2D layers is always determined by layer order. + // The order between features in two 3D layers is always determined by depth. + // The order between a feature in a 2D layer and a 3D layer is tricky: + // Most often layer order determines the feature order in this case. If + // a line layer is above a extrusion layer the line feature will be rendered + // above the extrusion. If the line layer is below the extrusion layer, + // it will be rendered below it. + // + // There is a weird case though. + // You have layers in this order: extrusion_layer_a, line_layer, extrusion_layer_b + // Each layer has a feature that overlaps the other features. + // The feature in extrusion_layer_a is closer than the feature in extrusion_layer_b so it is rendered above. + // The feature in line_layer is rendered above extrusion_layer_a. + // This means that that the line_layer feature is above the extrusion_layer_b feature despite + // it being in an earlier layer. - if (iconBox) { - const placedIconBoxes = this.collisionIndex.placeCollisionBox( - bucket.getSymbolInstanceIconSize(iconSize, this.transform.zoom, symbolIndex), - iconBox, offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle), - textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); - if (placedIconBoxes.box.length === 0) return; - } + const isLayer3D = layerId => this._layers[layerId].type === 'fill-extrusion'; - if (placedGlyphBoxes.box.length > 0) { - let prevAnchor; - // If this label was placed in the previous placement, record the anchor position - // to allow us to animate the transition - if (this.prevPlacement && - this.prevPlacement.variableOffsets[symbolInstance.crossTileID] && - this.prevPlacement.placements[symbolInstance.crossTileID] && - this.prevPlacement.placements[symbolInstance.crossTileID].text) { - prevAnchor = this.prevPlacement.variableOffsets[symbolInstance.crossTileID].anchor; + const layerIndex = {}; + const features3D = []; + for (let l = this._order.length - 1; l >= 0; l--) { + const layerId = this._order[l]; + if (isLayer3D(layerId)) { + layerIndex[layerId] = l; + for (const sourceResult of sourceResults) { + const layerFeatures = sourceResult[layerId]; + if (layerFeatures) { + for (const featureWrapper of layerFeatures) { + features3D.push(featureWrapper); + } + } + } } - transform.assert_1(symbolInstance.crossTileID !== 0); - this.variableOffsets[symbolInstance.crossTileID] = { - textOffset, - width, - height, - anchor, - textScale, - prevAnchor - }; - this.markUsedJustification(bucket, anchor, symbolInstance, orientation); + } - if (bucket.allowVerticalPlacement) { - this.markUsedOrientation(bucket, orientation, symbolInstance); - this.placedOrientations[symbolInstance.crossTileID] = orientation; - } + features3D.sort((a, b) => { + return b.intersectionZ - a.intersectionZ; + }); - return {shift, placedGlyphBoxes}; + const features = []; + for (let l = this._order.length - 1; l >= 0; l--) { + const layerId = this._order[l]; + + if (isLayer3D(layerId)) { + // add all 3D features that are in or above the current layer + for (let i = features3D.length - 1; i >= 0; i--) { + const topmost3D = features3D[i].feature; + if (layerIndex[topmost3D.layer.id] < l) break; + features.push(topmost3D); + features3D.pop(); + } + } else { + for (const sourceResult of sourceResults) { + const layerFeatures = sourceResult[layerId]; + if (layerFeatures) { + for (const featureWrapper of layerFeatures) { + features.push(featureWrapper.feature); + } + } + } + } } + + return features; } - placeLayerBucketPart(bucketPart , seenCrossTileIDs , showCollisionBoxes , updateCollisionBoxIfNecessary ) { + queryRenderedFeatures(queryGeometry , params , transform ) { + if (params && params.filter) { + this._validate(ref_properties.validateFilter, 'queryRenderedFeatures.filter', params.filter, null, params); + } - const { - bucket, - layout, - posMatrix, - textLabelPlaneMatrix, - labelToScreenMatrix, - clippingData, - textPixelRatio, - holdingForFade, - collisionBoxArray, - partiallyEvaluatedTextSize, - partiallyEvaluatedIconSize, - collisionGroup - } = bucketPart.parameters; + const includedSources = {}; + if (params && params.layers) { + if (!Array.isArray(params.layers)) { + this.fire(new ref_properties.ErrorEvent(new Error('parameters.layers must be an Array.'))); + return []; + } + for (const layerId of params.layers) { + const layer = this._layers[layerId]; + if (!layer) { + // this layer is not in the style.layers array + this.fire(new ref_properties.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be queried for features.`))); + return []; + } + includedSources[layer.source] = true; + } + } - const textOptional = layout.get('text-optional'); - const iconOptional = layout.get('icon-optional'); - const textAllowOverlap = layout.get('text-allow-overlap'); - const iconAllowOverlap = layout.get('icon-allow-overlap'); - const rotateWithMap = layout.get('text-rotation-alignment') === 'map'; - const pitchWithMap = layout.get('text-pitch-alignment') === 'map'; - const hasIconTextFit = layout.get('icon-text-fit') !== 'none'; - const zOrderByViewportY = layout.get('symbol-z-order') === 'viewport-y'; + const sourceResults = []; - // This logic is similar to the "defaultOpacityState" logic below in updateBucketOpacities - // If we know a symbol is always supposed to show, force it to be marked visible even if - // it wasn't placed into the collision index (because some or all of it was outside the range - // of the collision grid). - // There is a subtle edge case here we're accepting: - // Symbol A has text-allow-overlap: true, icon-allow-overlap: true, icon-optional: false - // A's icon is outside the grid, so doesn't get placed - // A's text would be inside grid, but doesn't get placed because of icon-optional: false - // We still show A because of the allow-overlap settings. - // Symbol B has allow-overlap: false, and gets placed where A's text would be - // On panning in, there is a short period when Symbol B and Symbol A will overlap - // This is the reverse of our normal policy of "fade in on pan", but should look like any other - // collision and hopefully not be too noticeable. - // See https://github.com/mapbox/mapbox-gl-js/issues/7172 - const alwaysShowText = textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || iconOptional); - const alwaysShowIcon = iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || textOptional); + params.availableImages = this._availableImages; - if (!bucket.collisionArrays && collisionBoxArray) { - bucket.deserializeCollisionBoxes(collisionBoxArray); + const has3DLayer = (params && params.layers) ? + params.layers.some((layerId) => { + const layer = this.getLayer(layerId); + return layer && layer.is3D(); + }) : + this.has3DLayers(); + const queryGeometryStruct = QueryGeometry.createFromScreenPoints(queryGeometry, transform); + + for (const id in this._sourceCaches) { + const sourceId = this._sourceCaches[id].getSource().id; + if (params.layers && !includedSources[sourceId]) continue; + sourceResults.push( + queryRenderedFeatures( + this._sourceCaches[id], + this._layers, + this._serializedLayers, + queryGeometryStruct, + params, + transform, + has3DLayer, + !!this.map._showQueryGeometry) + ); } - if (showCollisionBoxes && updateCollisionBoxIfNecessary) { - bucket.updateCollisionDebugBuffers(this.transform.zoom, collisionBoxArray); + if (this.placement) { + // If a placement has run, query against its CollisionIndex + // for symbol results, and treat it as an extra source to merge + sourceResults.push( + queryRenderedSymbols( + this._layers, + this._serializedLayers, + this._getLayerSourceCache.bind(this), + queryGeometryStruct.screenGeometry, + params, + this.placement.collisionIndex, + this.placement.retainedQueryData) + ); } - const placeSymbol = (symbolInstance , symbolIndex , collisionArrays ) => { - if (clippingData) { - // Setup globals - const globals = { - zoom: this.transform.zoom, - pitch: this.transform.pitch, - }; - - // Deserialize feature only if necessary - let feature = null; - if (clippingData.dynamicFilterNeedsFeature) { - const featureIndex = clippingData.featureIndex; - const retainedQueryData = this.retainedQueryData[bucket.bucketInstanceId]; - feature = featureIndex.loadFeature({ - featureIndex: symbolInstance.featureIndex, - bucketIndex: retainedQueryData.bucketIndex, - sourceLayerIndex: retainedQueryData.sourceLayerIndex, - layoutVertexArrayOffset: 0 - }); - } - const canonicalTileId = this.retainedQueryData[bucket.bucketInstanceId].tileID.canonical; + return (this._flattenAndSortRenderedFeatures(sourceResults) ); + } - const filterFunc = clippingData.dynamicFilter; - const shouldClip = !filterFunc(globals, feature, canonicalTileId, new transform.pointGeometry(symbolInstance.tileAnchorX, symbolInstance.tileAnchorY), this.transform.calculateDistanceTileData(clippingData.unwrappedTileID)); + querySourceFeatures(sourceID , params ) { + if (params && params.filter) { + this._validate(ref_properties.validateFilter, 'querySourceFeatures.filter', params.filter, null, params); + } + const sourceCaches = this._getSourceCaches(sourceID); + let results = []; + for (const sourceCache of sourceCaches) { + results = results.concat(querySourceFeatures(sourceCache, params)); + } + return results; + } - if (shouldClip) { - this.placements[symbolInstance.crossTileID] = new JointPlacement(false, false, false, true); - seenCrossTileIDs[symbolInstance.crossTileID] = true; - return; - } - } + addSourceType(name , SourceType , callback ) { + if (Style.getSourceType(name)) { + return callback(new Error(`A source type called "${name}" already exists.`)); + } - if (seenCrossTileIDs[symbolInstance.crossTileID]) return; - if (holdingForFade) { - // Mark all symbols from this tile as "not placed", but don't add to seenCrossTileIDs, because we don't - // know yet if we have a duplicate in a parent tile that _should_ be placed. - this.placements[symbolInstance.crossTileID] = new JointPlacement(false, false, false); - return; - } - let placeText = false; - let placeIcon = false; - let offscreen = true; - let shift = null; + Style.setSourceType(name, SourceType); - let placed = {box: null, offscreen: null}; - let placedVerticalText = {box: null, offscreen: null}; + if (!SourceType.workerSourceURL) { + return callback(null, null); + } - let placedGlyphBoxes = null; - let placedGlyphCircles = null; - let placedIconBoxes = null; - let textFeatureIndex = 0; - let verticalTextFeatureIndex = 0; - let iconFeatureIndex = 0; + this.dispatcher.broadcast('loadWorkerSource', { + name, + url: SourceType.workerSourceURL + }, callback); + } - if (collisionArrays.textFeatureIndex) { - textFeatureIndex = collisionArrays.textFeatureIndex; - } else if (symbolInstance.useRuntimeCollisionCircles) { - textFeatureIndex = symbolInstance.featureIndex; - } - if (collisionArrays.verticalTextFeatureIndex) { - verticalTextFeatureIndex = collisionArrays.verticalTextFeatureIndex; - } + getLight() { + return this.light.getLight(); + } - const updateBoxData = (box ) => { - box.tileID = this.retainedQueryData[bucket.bucketInstanceId].tileID; - if (!this.transform.elevation && !box.elevation) return; - box.elevation = this.transform.elevation ? this.transform.elevation.getAtTileOffset( - this.retainedQueryData[bucket.bucketInstanceId].tileID, - box.tileAnchorX, box.tileAnchorY) : 0; - }; + setLight(lightOptions , options = {}) { + this._checkLoaded(); - const textBox = collisionArrays.textBox; - if (textBox) { - updateBoxData(textBox); - const updatePreviousOrientationIfNotPlaced = (isPlaced) => { - let previousOrientation = transform.WritingMode.horizontal; - if (bucket.allowVerticalPlacement && !isPlaced && this.prevPlacement) { - const prevPlacedOrientation = this.prevPlacement.placedOrientations[symbolInstance.crossTileID]; - if (prevPlacedOrientation) { - this.placedOrientations[symbolInstance.crossTileID] = prevPlacedOrientation; - previousOrientation = prevPlacedOrientation; - this.markUsedOrientation(bucket, previousOrientation, symbolInstance); - } - } - return previousOrientation; - }; + const light = this.light.getLight(); + let _update = false; + for (const key in lightOptions) { + if (!ref_properties.deepEqual(lightOptions[key], light[key])) { + _update = true; + break; + } + } + if (!_update) return; - const placeTextForPlacementModes = (placeHorizontalFn, placeVerticalFn) => { - if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && collisionArrays.verticalTextBox) { - for (const placementMode of bucket.writingModes) { - if (placementMode === transform.WritingMode.vertical) { - placed = placeVerticalFn(); - placedVerticalText = placed; - } else { - placed = placeHorizontalFn(); - } - if (placed && placed.box && placed.box.length) break; - } - } else { - placed = placeHorizontalFn(); - } - }; + const parameters = this._setTransitionParameters({duration: 300, delay: 0}); - if (!layout.get('text-variable-anchor')) { - const placeBox = (collisionTextBox, orientation) => { - const textScale = bucket.getSymbolInstanceTextSize(partiallyEvaluatedTextSize, symbolInstance, this.transform.zoom, symbolIndex); - const placedFeature = this.collisionIndex.placeCollisionBox(textScale, collisionTextBox, - new transform.pointGeometry(0, 0), textAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); - if (placedFeature && placedFeature.box && placedFeature.box.length) { - this.markUsedOrientation(bucket, orientation, symbolInstance); - this.placedOrientations[symbolInstance.crossTileID] = orientation; - } - return placedFeature; - }; + this.light.setLight(lightOptions, options); + this.light.updateTransitions(parameters); + } - const placeHorizontal = () => { - return placeBox(textBox, transform.WritingMode.horizontal); - }; + getTerrain() { + return this.terrain && this.terrain.drapeRenderMode === DrapeRenderMode.elevated ? this.terrain.get() : null; + } - const placeVertical = () => { - const verticalTextBox = collisionArrays.verticalTextBox; - if (bucket.allowVerticalPlacement && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) { - updateBoxData(verticalTextBox); - return placeBox(verticalTextBox, transform.WritingMode.vertical); - } - return {box: null, offscreen: null}; - }; + setTerrainForDraping() { + const mockTerrainOptions = {source: '', exaggeration: 0}; + this.setTerrain(mockTerrainOptions, DrapeRenderMode.deferred); + } - placeTextForPlacementModes(placeHorizontal, placeVertical); - updatePreviousOrientationIfNotPlaced(placed && placed.box && placed.box.length); + // eslint-disable-next-line no-warning-comments + // TODO: generic approach for root level property: light, terrain, skybox. + // It is not done here to prevent rebasing issues. + setTerrain(terrainOptions , drapeRenderMode = DrapeRenderMode.elevated) { + this._checkLoaded(); - } else { - let anchors = layout.get('text-variable-anchor'); + // Disabling + if (!terrainOptions) { + delete this.terrain; + delete this.stylesheet.terrain; + this.dispatcher.broadcast('enableTerrain', false); + this._force3DLayerUpdate(); + this._markersNeedUpdate = true; + return; + } - // If this symbol was in the last placement, shift the previously used - // anchor to the front of the anchor list, only if the previous anchor - // is still in the anchor list - if (this.prevPlacement && this.prevPlacement.variableOffsets[symbolInstance.crossTileID]) { - const prevOffsets = this.prevPlacement.variableOffsets[symbolInstance.crossTileID]; - if (anchors.indexOf(prevOffsets.anchor) > 0) { - anchors = anchors.filter(anchor => anchor !== prevOffsets.anchor); - anchors.unshift(prevOffsets.anchor); - } - } + if (drapeRenderMode === DrapeRenderMode.elevated) { + // Input validation and source object unrolling + if (typeof terrainOptions.source === 'object') { + const id = 'terrain-dem-src'; + this.addSource(id, ((terrainOptions.source) )); + terrainOptions = ref_properties.clone$1(terrainOptions); + terrainOptions = (ref_properties.extend(terrainOptions, {source: id}) ); + } - const placeBoxForVariableAnchors = (collisionTextBox, collisionIconBox, orientation) => { - const textScale = bucket.getSymbolInstanceTextSize(partiallyEvaluatedTextSize, symbolInstance, this.transform.zoom, symbolIndex); - const width = (collisionTextBox.x2 - collisionTextBox.x1) * textScale + 2.0 * collisionTextBox.padding; - const height = (collisionTextBox.y2 - collisionTextBox.y1) * textScale + 2.0 * collisionTextBox.padding; + if (this._validate(ref_properties.validateTerrain, 'terrain', terrainOptions)) { + return; + } + } - const variableIconBox = hasIconTextFit && !iconAllowOverlap ? collisionIconBox : null; - if (variableIconBox) updateBoxData(variableIconBox); + // Enabling + if (!this.terrain || (this.terrain && drapeRenderMode !== this.terrain.drapeRenderMode)) { + this._createTerrain(terrainOptions, drapeRenderMode); + } else { // Updating + const terrain = this.terrain; + const currSpec = terrain.get(); - let placedBox = {box: [], offscreen: false}; - const placementAttempts = textAllowOverlap ? anchors.length * 2 : anchors.length; - for (let i = 0; i < placementAttempts; ++i) { - const anchor = anchors[i % anchors.length]; - const allowOverlap = (i >= anchors.length); - const result = this.attemptAnchorPlacement( - anchor, collisionTextBox, width, height, textScale, rotateWithMap, - pitchWithMap, textPixelRatio, posMatrix, collisionGroup, allowOverlap, - symbolInstance, symbolIndex, bucket, orientation, variableIconBox, - partiallyEvaluatedTextSize, partiallyEvaluatedIconSize); + for (const name of Object.keys(ref_properties.spec.terrain)) { + // Fallback to use default style specification when the properties wasn't set + if (!terrainOptions.hasOwnProperty(name) && !!ref_properties.spec.terrain[name].default) { + terrainOptions[name] = ref_properties.spec.terrain[name].default; + } + } + for (const key in terrainOptions) { + if (!ref_properties.deepEqual(terrainOptions[key], currSpec[key])) { + terrain.set(terrainOptions); + this.stylesheet.terrain = terrainOptions; + const parameters = this._setTransitionParameters({duration: 0}); + terrain.updateTransitions(parameters); + break; + } + } + } - if (result) { - placedBox = result.placedGlyphBoxes; - if (placedBox && placedBox.box && placedBox.box.length) { - placeText = true; - shift = result.shift; - break; - } - } - } + this._updateDrapeFirstLayers(); + this._markersNeedUpdate = true; + } - return placedBox; - }; + _createFog(fogOptions ) { + const fog = this.fog = new Fog(fogOptions, this.map.transform); + this.stylesheet.fog = fogOptions; + const parameters = this._setTransitionParameters({duration: 0}); + fog.updateTransitions(parameters); + } - const placeHorizontal = () => { - return placeBoxForVariableAnchors(textBox, collisionArrays.iconBox, transform.WritingMode.horizontal); - }; + _updateMarkersOpacity() { + if (this.map._markers.length === 0) { + return; + } + this.map._requestDomTask(() => { + for (const marker of this.map._markers) { + marker._evaluateOpacity(); + } + }); + } - const placeVertical = () => { - const verticalTextBox = collisionArrays.verticalTextBox; - if (verticalTextBox) updateBoxData(verticalTextBox); - const wasPlaced = placed && placed.box && placed.box.length; - if (bucket.allowVerticalPlacement && !wasPlaced && symbolInstance.numVerticalGlyphVertices > 0 && verticalTextBox) { - return placeBoxForVariableAnchors(verticalTextBox, collisionArrays.verticalIconBox, transform.WritingMode.vertical); - } - return {box: null, offscreen: null}; - }; + getFog() { + return this.fog ? this.fog.get() : null; + } - placeTextForPlacementModes(placeHorizontal, placeVertical); + setFog(fogOptions ) { + this._checkLoaded(); - if (placed) { - placeText = placed.box; - offscreen = placed.offscreen; - } + if (!fogOptions) { + // Remove fog + delete this.fog; + delete this.stylesheet.fog; + this._markersNeedUpdate = true; + return; + } - const prevOrientation = updatePreviousOrientationIfNotPlaced(placed && placed.box); + if (!this.fog) { + // Initialize Fog + this._createFog(fogOptions); + } else { + // Updating fog + const fog = this.fog; + const currSpec = fog.get(); - // If we didn't get placed, we still need to copy our position from the last placement for - // fade animations - if (!placeText && this.prevPlacement) { - const prevOffset = this.prevPlacement.variableOffsets[symbolInstance.crossTileID]; - if (prevOffset) { - this.variableOffsets[symbolInstance.crossTileID] = prevOffset; - this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, prevOrientation); - } - } + // empty object should pass through to set default values + if (Object.keys(fogOptions).length === 0) fog.set(fogOptions); + for (const key in fogOptions) { + if (!ref_properties.deepEqual(fogOptions[key], currSpec[key])) { + fog.set(fogOptions); + this.stylesheet.fog = fogOptions; + const parameters = this._setTransitionParameters({duration: 0}); + fog.updateTransitions(parameters); + break; } } + } - placedGlyphBoxes = placed; - placeText = placedGlyphBoxes && placedGlyphBoxes.box && placedGlyphBoxes.box.length > 0; + this._markersNeedUpdate = true; + } - offscreen = placedGlyphBoxes && placedGlyphBoxes.offscreen; + _setTransitionParameters(transitionOptions ) { + return { + now: ref_properties.exported.now(), + transition: ref_properties.extend( + transitionOptions, + this.stylesheet.transition) + }; + } - if (symbolInstance.useRuntimeCollisionCircles) { - const placedSymbolIndex = symbolInstance.centerJustifiedTextSymbolIndex >= 0 ? symbolInstance.centerJustifiedTextSymbolIndex : symbolInstance.verticalPlacedTextSymbolIndex; - const placedSymbol = bucket.text.placedSymbolArray.get(placedSymbolIndex); - const fontSize = transform.evaluateSizeForFeature(bucket.textSizeData, partiallyEvaluatedTextSize, placedSymbol); + _updateDrapeFirstLayers() { + if (!this.map._optimizeForTerrain || !this.terrain) { + return; + } - const textPixelPadding = layout.get('text-padding'); - // Convert circle collision height into pixels - const circlePixelDiameter = symbolInstance.collisionCircleDiameter * fontSize / transform.ONE_EM; + const draped = this._order.filter((id) => { + return this.isLayerDraped(this._layers[id]); + }); - placedGlyphCircles = this.collisionIndex.placeCollisionCircles(textAllowOverlap, - placedSymbol, - bucket.lineVertexArray, - bucket.glyphOffsetArray, - fontSize, - posMatrix, - textLabelPlaneMatrix, - labelToScreenMatrix, - showCollisionBoxes, - pitchWithMap, - collisionGroup.predicate, - circlePixelDiameter, - textPixelPadding, - this.retainedQueryData[bucket.bucketInstanceId].tileID); + const nonDraped = this._order.filter((id) => { + return !this.isLayerDraped(this._layers[id]); + }); + this._drapedFirstOrder = []; + this._drapedFirstOrder.push(...draped); + this._drapedFirstOrder.push(...nonDraped); + } - transform.assert_1(!placedGlyphCircles.circles.length || (!placedGlyphCircles.collisionDetected || showCollisionBoxes)); - // 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 = textAllowOverlap || (placedGlyphCircles.circles.length > 0 && !placedGlyphCircles.collisionDetected); - offscreen = offscreen && placedGlyphCircles.offscreen; + _createTerrain(terrainOptions , drapeRenderMode ) { + const terrain = this.terrain = new Terrain$1(terrainOptions, drapeRenderMode); + this.stylesheet.terrain = terrainOptions; + this.dispatcher.broadcast('enableTerrain', !this.terrainSetForDrapingOnly()); + this._force3DLayerUpdate(); + const parameters = this._setTransitionParameters({duration: 0}); + terrain.updateTransitions(parameters); + } + + _force3DLayerUpdate() { + for (const layerId in this._layers) { + const layer = this._layers[layerId]; + if (layer.type === 'fill-extrusion') { + this._updateLayer(layer); } + } + } - if (collisionArrays.iconFeatureIndex) { - iconFeatureIndex = collisionArrays.iconFeatureIndex; + _forceSymbolLayerUpdate() { + for (const layerId in this._layers) { + const layer = this._layers[layerId]; + if (layer.type === 'symbol') { + this._updateLayer(layer); } + } + } - if (collisionArrays.iconBox) { + _validate(validate , key , value , props , options = {}) { + if (options && options.validate === false) { + return false; + } + return emitValidationErrors(this, validate.call(ref_properties.validateStyle, ref_properties.extend({ + key, + style: this.serialize(), + value, + styleSpec: ref_properties.spec + }, props))); + } - const placeIconFeature = iconBox => { - updateBoxData(iconBox); - const shiftPoint = hasIconTextFit && shift ? - offsetShift(shift.x, shift.y, rotateWithMap, pitchWithMap, this.transform.angle) : - new transform.pointGeometry(0, 0); - const iconScale = bucket.getSymbolInstanceIconSize(partiallyEvaluatedIconSize, this.transform.zoom, symbolIndex); - return this.collisionIndex.placeCollisionBox(iconScale, iconBox, shiftPoint, - iconAllowOverlap, textPixelRatio, posMatrix, collisionGroup.predicate); - }; + _remove() { + if (this._request) { + this._request.cancel(); + this._request = null; + } + if (this._spriteRequest) { + this._spriteRequest.cancel(); + this._spriteRequest = null; + } + ref_properties.evented.off('pluginStateChange', this._rtlTextPluginCallback); + for (const layerId in this._layers) { + const layer = this._layers[layerId]; + layer.setEventedParent(null); + } + for (const id in this._sourceCaches) { + this._sourceCaches[id].clearTiles(); + this._sourceCaches[id].setEventedParent(null); + } + this.imageManager.setEventedParent(null); + this.setEventedParent(null); + this.dispatcher.remove(); + } - if (placedVerticalText && placedVerticalText.box && placedVerticalText.box.length && collisionArrays.verticalIconBox) { - placedIconBoxes = placeIconFeature(collisionArrays.verticalIconBox); - placeIcon = placedIconBoxes.box.length > 0; - } else { - placedIconBoxes = placeIconFeature(collisionArrays.iconBox); - placeIcon = placedIconBoxes.box.length > 0; - } - offscreen = offscreen && placedIconBoxes.offscreen; - } + _clearSource(id ) { + const sourceCaches = this._getSourceCaches(id); + for (const sourceCache of sourceCaches) { + sourceCache.clearTiles(); + } + } - const iconWithoutText = textOptional || - (symbolInstance.numHorizontalGlyphVertices === 0 && symbolInstance.numVerticalGlyphVertices === 0); - const textWithoutIcon = iconOptional || symbolInstance.numIconVertices === 0; + _reloadSource(id ) { + const sourceCaches = this._getSourceCaches(id); + for (const sourceCache of sourceCaches) { + sourceCache.resume(); + sourceCache.reload(); + } + } - // 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; - } + _updateSources(transform ) { + for (const id in this._sourceCaches) { + this._sourceCaches[id].update(transform); + } + } - if (placeText && placedGlyphBoxes && placedGlyphBoxes.box) { - if (placedVerticalText && placedVerticalText.box && verticalTextFeatureIndex) { - this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), - bucket.bucketInstanceId, verticalTextFeatureIndex, collisionGroup.ID); - } else { - this.collisionIndex.insertCollisionBox(placedGlyphBoxes.box, layout.get('text-ignore-placement'), - bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); - } + _generateCollisionBoxes() { + for (const id in this._sourceCaches) { + const sourceCache = this._sourceCaches[id]; + sourceCache.resume(); + sourceCache.reload(); + } + } + _updatePlacement(transform , showCollisionBoxes , fadeDuration , crossSourceCollisions , forceFullPlacement = false) { + let symbolBucketsChanged = false; + let placementCommitted = false; + + const layerTiles = {}; + + for (const layerID of this._order) { + const styleLayer = this._layers[layerID]; + if (styleLayer.type !== 'symbol') continue; + + if (!layerTiles[styleLayer.source]) { + const sourceCache = this._getLayerSourceCache(styleLayer); + if (!sourceCache) continue; + layerTiles[styleLayer.source] = sourceCache.getRenderableIds(true) + .map((id) => sourceCache.getTileByID(id)) + .sort((a, b) => (b.tileID.overscaledZ - a.tileID.overscaledZ) || (a.tileID.isLessThan(b.tileID) ? -1 : 1)); } - if (placeIcon && placedIconBoxes) { - this.collisionIndex.insertCollisionBox(placedIconBoxes.box, layout.get('icon-ignore-placement'), - bucket.bucketInstanceId, iconFeatureIndex, collisionGroup.ID); - } - if (placedGlyphCircles) { - if (placeText) { - this.collisionIndex.insertCollisionCircles(placedGlyphCircles.circles, layout.get('text-ignore-placement'), - bucket.bucketInstanceId, textFeatureIndex, collisionGroup.ID); - } - if (showCollisionBoxes) { - const id = bucket.bucketInstanceId; - let circleArray = this.collisionCircleArrays[id]; + const layerBucketsChanged = this.crossTileSymbolIndex.addLayer(styleLayer, layerTiles[styleLayer.source], transform.center.lng, transform.projection); + 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. + // Also force full placement when fadeDuration === 0 to ensure that newly loaded + // tiles will fully display symbols in their first frame + forceFullPlacement = forceFullPlacement || this._layerOrderChanged || fadeDuration === 0; - // Group collision circles together by bucket. Circles can't be pushed forward for rendering yet as the symbol placement - // for a bucket is not guaranteed to be complete before the commit-function has been called - if (circleArray === undefined) - circleArray = this.collisionCircleArrays[id] = new CollisionCircleArray(); + if (this._layerOrderChanged) { + this.fire(new ref_properties.Event('neworder')); + } - for (let i = 0; i < placedGlyphCircles.circles.length; i += 4) { - circleArray.circles.push(placedGlyphCircles.circles[i + 0]); // x - circleArray.circles.push(placedGlyphCircles.circles[i + 1]); // y - circleArray.circles.push(placedGlyphCircles.circles[i + 2]); // radius - circleArray.circles.push(placedGlyphCircles.collisionDetected ? 1 : 0); // collisionDetected-flag - } - } - } + if (forceFullPlacement || !this.pauseablePlacement || (this.pauseablePlacement.isDone() && !this.placement.stillRecent(ref_properties.exported.now(), transform.zoom))) { + const fogState = this.fog && transform.projection.supportsFog ? this.fog.state : null; + this.pauseablePlacement = new PauseablePlacement(transform, this._order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, this.placement, fogState); + this._layerOrderChanged = false; + } - transform.assert_1(symbolInstance.crossTileID !== 0); - transform.assert_1(bucket.bucketInstanceId !== 0); + 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); - this.placements[symbolInstance.crossTileID] = new JointPlacement(placeText || alwaysShowText, placeIcon || alwaysShowIcon, offscreen || bucket.justReloaded); - seenCrossTileIDs[symbolInstance.crossTileID] = true; - }; + if (this.pauseablePlacement.isDone()) { + this.placement = this.pauseablePlacement.commit(ref_properties.exported.now()); + placementCommitted = true; + } - if (zOrderByViewportY) { - transform.assert_1(bucketPart.symbolInstanceStart === 0); - const symbolIndexes = bucket.getSortedSymbolIndexes(this.transform.angle); - for (let i = symbolIndexes.length - 1; i >= 0; --i) { - const symbolIndex = symbolIndexes[i]; - placeSymbol(bucket.symbolInstances.get(symbolIndex), symbolIndex, bucket.collisionArrays[symbolIndex]); + 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(); } - } else { - for (let i = bucketPart.symbolInstanceStart; i < bucketPart.symbolInstanceEnd; i++) { - placeSymbol(bucket.symbolInstances.get(i), i, bucket.collisionArrays[i]); + } + + if (placementCommitted || symbolBucketsChanged) { + for (const layerID of this._order) { + const styleLayer = this._layers[layerID]; + if (styleLayer.type !== 'symbol') continue; + this.placement.updateLayerOpacities(styleLayer, layerTiles[styleLayer.source]); } } - if (showCollisionBoxes && bucket.bucketInstanceId in this.collisionCircleArrays) { - const circleArray = this.collisionCircleArrays[bucket.bucketInstanceId]; + // needsRender is false when we have just finished a placement that didn't change the visibility of any symbols + const needsRerender = !this.pauseablePlacement.isDone() || this.placement.hasTransitions(ref_properties.exported.now()); + return needsRerender; + } - // Store viewport and inverse projection matrices per bucket - transform.invert$1(circleArray.invProjMatrix, posMatrix); - circleArray.viewportMatrix = this.collisionIndex.getViewportMatrix(); + _releaseSymbolFadeTiles() { + for (const id in this._sourceCaches) { + this._sourceCaches[id].releaseSymbolFadeTiles(); } - - bucket.justReloaded = false; } - markUsedJustification(bucket , placedAnchor , symbolInstance , orientation ) { - const justifications = { - "left": symbolInstance.leftJustifiedTextSymbolIndex, - "center": symbolInstance.centerJustifiedTextSymbolIndex, - "right": symbolInstance.rightJustifiedTextSymbolIndex - }; + // Callbacks from web workers - let autoIndex; - if (orientation === transform.WritingMode.vertical) { - autoIndex = symbolInstance.verticalPlacedTextSymbolIndex; - } else { - autoIndex = justifications[transform.getAnchorJustification(placedAnchor)]; - } + getImages(mapId , params , callback ) { - const indexes = [ - symbolInstance.leftJustifiedTextSymbolIndex, - symbolInstance.centerJustifiedTextSymbolIndex, - symbolInstance.rightJustifiedTextSymbolIndex, - symbolInstance.verticalPlacedTextSymbolIndex - ]; + this.imageManager.getImages(params.icons, callback); - for (const index of indexes) { - if (index >= 0) { - if (autoIndex >= 0 && index !== autoIndex) { - // There are multiple justifications and this one isn't it: shift offscreen - bucket.text.placedSymbolArray.get(index).crossTileID = 0; - } else { - // Either this is the chosen justification or the justification is hardwired: use this one - bucket.text.placedSymbolArray.get(index).crossTileID = symbolInstance.crossTileID; - } + // Apply queued image changes before setting the tile's dependencies so that the tile + // is not reloaded unecessarily. Without this forced update the reload could happen in cases + // like this one: + // - icons contains "my-image" + // - imageManager.getImages(...) triggers `onstyleimagemissing` + // - the user adds "my-image" within the callback + // - addImage adds "my-image" to this._changedImages + // - the next frame triggers a reload of this tile even though it already has the latest version + this._updateTilesForChangedImages(); + + const setDependencies = (sourceCache ) => { + if (sourceCache) { + sourceCache.setDependencies(params.tileID.key, params.type, params.icons); } - } + }; + setDependencies(this._otherSourceCaches[params.source]); + setDependencies(this._symbolSourceCaches[params.source]); } - markUsedOrientation(bucket , orientation , symbolInstance ) { - const horizontal = (orientation === transform.WritingMode.horizontal || orientation === transform.WritingMode.horizontalOnly) ? orientation : 0; - const vertical = orientation === transform.WritingMode.vertical ? orientation : 0; + getGlyphs(mapId , params , callback ) { + this.glyphManager.getGlyphs(params.stacks, callback); + } - const horizontalIndexes = [ - symbolInstance.leftJustifiedTextSymbolIndex, - symbolInstance.centerJustifiedTextSymbolIndex, - symbolInstance.rightJustifiedTextSymbolIndex - ]; + getResource(mapId , params , callback ) { + return ref_properties.makeRequest(params, callback); + } - for (const index of horizontalIndexes) { - bucket.text.placedSymbolArray.get(index).placedOrientation = horizontal; + _getSourceCache(source ) { + return this._otherSourceCaches[source]; + } + + _getLayerSourceCache(layer ) { + return layer.type === 'symbol' ? + this._symbolSourceCaches[layer.source] : + this._otherSourceCaches[layer.source]; + } + + _getSourceCaches(source ) { + const sourceCaches = []; + if (this._otherSourceCaches[source]) { + sourceCaches.push(this._otherSourceCaches[source]); + } + if (this._symbolSourceCaches[source]) { + sourceCaches.push(this._symbolSourceCaches[source]); } + return sourceCaches; + } - if (symbolInstance.verticalPlacedTextSymbolIndex) { - bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).placedOrientation = vertical; + _isSourceCacheLoaded(source ) { + const sourceCaches = this._getSourceCaches(source); + if (sourceCaches.length === 0) { + this.fire(new ref_properties.ErrorEvent(new Error(`There is no source with ID '${source}'`))); + return false; } + return sourceCaches.every(sc => sc.loaded()); } - commit(now ) { - this.commitTime = now; - this.zoomAtLastRecencyCheck = this.transform.zoom; + has3DLayers() { + return this._num3DLayers > 0; + } - const prevPlacement = this.prevPlacement; - let placementChanged = false; + hasSymbolLayers() { + return this._numSymbolLayers > 0; + } - this.prevZoomAdjustment = prevPlacement ? prevPlacement.zoomAdjustment(this.transform.zoom) : 0; - const increment = prevPlacement ? prevPlacement.symbolFadeChange(now) : 1; + hasCircleLayers() { + return this._numCircleLayers > 0; + } - const prevOpacities = prevPlacement ? prevPlacement.opacities : {}; - const prevOffsets = prevPlacement ? prevPlacement.variableOffsets : {}; - const prevOrientations = prevPlacement ? prevPlacement.placedOrientations : {}; + _clearWorkerCaches() { + this.dispatcher.broadcast('clearCaches'); + } - // add the opacities from the current placement, and copy their current values from the previous placement - for (const crossTileID in this.placements) { - const jointPlacement = this.placements[crossTileID]; - const prevOpacity = prevOpacities[crossTileID]; - if (prevOpacity) { - this.opacities[crossTileID] = new JointOpacityState(prevOpacity, increment, jointPlacement.text, jointPlacement.icon, null, jointPlacement.clipped); - placementChanged = placementChanged || - jointPlacement.text !== prevOpacity.text.placed || - jointPlacement.icon !== prevOpacity.icon.placed; - } else { - this.opacities[crossTileID] = new JointOpacityState(null, increment, jointPlacement.text, jointPlacement.icon, jointPlacement.skipFade, jointPlacement.clipped); - placementChanged = placementChanged || jointPlacement.text || jointPlacement.icon; - } + destroy() { + this._clearWorkerCaches(); + if (this.terrainSetForDrapingOnly()) { + delete this.terrain; + delete this.stylesheet.terrain; } + } +} - // copy and update values from the previous placement that aren't in the current placement but haven't finished fading - for (const crossTileID in prevOpacities) { - const prevOpacity = prevOpacities[crossTileID]; - if (!this.opacities[crossTileID]) { - const jointOpacity = new JointOpacityState(prevOpacity, increment, false, false); - if (!jointOpacity.isHidden()) { - this.opacities[crossTileID] = jointOpacity; - placementChanged = placementChanged || prevOpacity.text.placed || prevOpacity.icon.placed; - } - } - } - for (const crossTileID in prevOffsets) { - if (!this.variableOffsets[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) { - this.variableOffsets[crossTileID] = prevOffsets[crossTileID]; - } - } +Style.getSourceType = getType; +Style.setSourceType = setType; +Style.registerForPluginStateChange = ref_properties.registerForPluginStateChange; - for (const crossTileID in prevOrientations) { - if (!this.placedOrientations[crossTileID] && this.opacities[crossTileID] && !this.opacities[crossTileID].isHidden()) { - this.placedOrientations[crossTileID] = prevOrientations[crossTileID]; - } - } +var preludeCommon = "// IMPORTANT:\n// This prelude is injected in both vertex and fragment shader be wary\n// of precision qualifiers as vertex and fragment precision may differ\n\n#define EPSILON 0.0000001\n#define PI 3.141592653589793\n#define EXTENT 8192.0\n#define HALF_PI PI / 2.0\n#define QUARTER_PI PI / 4.0\n#define RAD_TO_DEG 180.0 / PI\n#define DEG_TO_RAD PI / 180.0\n#define GLOBE_RADIUS EXTENT / PI / 2.0"; - // 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 - transform.assert_1(!prevPlacement || prevPlacement.lastPlacementChangeTime !== undefined); - if (placementChanged) { - this.lastPlacementChangeTime = now; - } else if (typeof this.lastPlacementChangeTime !== 'number') { - this.lastPlacementChangeTime = prevPlacement ? prevPlacement.lastPlacementChangeTime : now; - } - } +var preludeFrag = "// NOTE: This prelude is injected in the fragment shader only\n\nhighp vec3 hash(highp vec2 p) {\n highp vec3 p3 = fract(p.xyx * vec3(443.8975, 397.2973, 491.1871));\n p3 += dot(p3, p3.yxz + 19.19);\n return fract((p3.xxy + p3.yzz) * p3.zyx);\n}\n\nvec3 dither(vec3 color, highp vec2 seed) {\n vec3 rnd = hash(seed) + hash(seed + 0.59374) - 0.5;\n return color + rnd / 255.0;\n}\n\n#ifdef TERRAIN\n\n// Pack depth to RGBA. A piece of code copied in various libraries and WebGL\n// shadow mapping examples.\nhighp vec4 pack_depth(highp float ndc_z) {\n highp float depth = ndc_z * 0.5 + 0.5;\n const highp vec4 bit_shift = vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);\n const highp vec4 bit_mask = vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);\n highp vec4 res = fract(depth * bit_shift);\n res -= res.xxyz * bit_mask;\n return res;\n}\n\n#endif"; - updateLayerOpacities(styleLayer , tiles ) { - const seenCrossTileIDs = {}; - for (const tile of tiles) { - const symbolBucket = ((tile.getBucket(styleLayer) ) ); - if (symbolBucket && tile.latestFeatureIndex && styleLayer.id === symbolBucket.layerIds[0]) { - this.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray); - } - } - } +var preludeVert = "// NOTE: This prelude is injected in the vertex shader only\n\nfloat wrap(float n, float min, float max) {\n float d = max - min;\n float w = mod(mod(n - min, d) + d, d) + min;\n return (w == min) ? max : w;\n}\n\n#ifdef PROJECTION_GLOBE_VIEW\nvec3 mercator_tile_position(mat4 matrix, vec2 tile_anchor, vec3 tile_id, vec2 mercator_center) {\n#ifndef PROJECTED_POS_ON_VIEWPORT\n // tile_id.z contains pow(2.0, coord.canonical.z)\n float tiles = tile_id.z;\n\n vec2 mercator = (tile_anchor / EXTENT + tile_id.xy) / tiles;\n mercator -= mercator_center;\n mercator.x = wrap(mercator.x, -0.5, 0.5);\n\n vec4 mercator_tile = vec4(mercator.xy * EXTENT, EXTENT / (2.0 * PI), 1.0);\n mercator_tile = matrix * mercator_tile;\n\n return mercator_tile.xyz;\n#else\n return vec3(0.0);\n#endif\n}\n\nvec3 mix_globe_mercator(vec3 globe, vec3 mercator, float t) {\n return mix(globe, mercator, t);\n}\n\nmat3 globe_mercator_surface_vectors(vec3 pos_normal, vec3 up_dir, float zoom_transition) {\n vec3 normal = zoom_transition == 0.0 ? pos_normal : normalize(mix(pos_normal, up_dir, zoom_transition));\n vec3 xAxis = normalize(vec3(normal.z, 0.0, -normal.x));\n vec3 yAxis = normalize(cross(normal, xAxis));\n return mat3(xAxis, yAxis, normal);\n}\n#endif // GLOBE_VIEW_PROJECTION\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_color(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\nconst vec4 AWAY = vec4(-1000.0, -1000.0, -1000.0, 1); // Normalized device coordinate that is not rendered.\n"; - updateBucketOpacities(bucket , seenCrossTileIDs , collisionBoxArray ) { - if (bucket.hasTextData()) bucket.text.opacityVertexArray.clear(); - if (bucket.hasIconData()) bucket.icon.opacityVertexArray.clear(); - if (bucket.hasIconCollisionBoxData()) bucket.iconCollisionBox.collisionVertexArray.clear(); - if (bucket.hasTextCollisionBoxData()) bucket.textCollisionBox.collisionVertexArray.clear(); +var backgroundFrag = "uniform vec4 u_color;\nuniform float u_opacity;\n\nvoid main() {\n vec4 out_color = u_color;\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - const layout = bucket.layers[0].layout; - const hasClipping = !!bucket.layers[0].dynamicFilter(); - const duplicateOpacityState = new JointOpacityState(null, 0, false, false, true); - const textAllowOverlap = layout.get('text-allow-overlap'); - const iconAllowOverlap = layout.get('icon-allow-overlap'); - const variablePlacement = layout.get('text-variable-anchor'); - const rotateWithMap = layout.get('text-rotation-alignment') === 'map'; - const pitchWithMap = layout.get('text-pitch-alignment') === 'map'; - const hasIconTextFit = layout.get('icon-text-fit') !== 'none'; - // If allow-overlap is true, we can show symbols before placement runs on them - // But we have to wait for placement if we potentially depend on a paired icon/text - // with allow-overlap: false. - // See https://github.com/mapbox/mapbox-gl-js/issues/7032 - const defaultOpacityState = new JointOpacityState(null, 0, - textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')), - iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')), - true); +var backgroundVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; - if (!bucket.collisionArrays && collisionBoxArray && ((bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()))) { - bucket.deserializeCollisionBoxes(collisionBoxArray); - } +var backgroundPatternFrag = "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 vec4 out_color = mix(color1, color2, u_mix);\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - const addOpacities = (iconOrText, numVertices , opacity ) => { - for (let i = 0; i < numVertices / 4; i++) { - iconOrText.opacityVertexArray.emplaceBack(opacity); - } - }; +var backgroundPatternVert = "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#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; - let visibleInstanceCount = 0; +var circleFrag = "varying vec3 v_data;\nvarying float v_visibility;\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\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 vec4 out_color = mix(color * opacity, stroke_color * stroke_opacity, color_t);\n\n#ifdef FOG\n out_color = fog_apply_premultiplied(out_color, v_fog_pos);\n#endif\n\n gl_FragColor = out_color * (v_visibility * opacity_t);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - for (let s = 0; s < bucket.symbolInstances.length; s++) { - const symbolInstance = bucket.symbolInstances.get(s); - const { - numHorizontalGlyphVertices, - numVerticalGlyphVertices, - crossTileID - } = symbolInstance; +var circleVert = "#define NUM_VISIBILITY_RINGS 2\n#define INV_SQRT2 0.70710678\n#define ELEVATION_BIAS 0.0001\n\n#define NUM_SAMPLES_PER_RING 16\n\nuniform mat4 u_matrix;\nuniform mat2 u_extrude_scale;\nuniform lowp float u_device_pixel_ratio;\nuniform highp float u_camera_to_center_distance;\n\nattribute vec2 a_pos;\n\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_pos_3; // Projected position on the globe\nattribute vec3 a_pos_normal_3; // Surface normal at the position\nattribute float a_scale;\n\n// Uniforms required for transition between globe and mercator\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_tile_id;\nuniform float u_zoom_transition;\nuniform vec3 u_up_dir;\n#endif\n\nvarying vec3 v_data;\nvarying float v_visibility;\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\nvec2 calc_offset(vec2 extrusion, float radius, float stroke_width, float view_scale) {\n return extrusion * (radius + stroke_width) * u_extrude_scale * view_scale;\n}\n\nfloat cantilevered_elevation(vec2 pos, float radius, float stroke_width, float view_scale) {\n vec2 c1 = pos + calc_offset(vec2(-1,-1), radius, stroke_width, view_scale);\n vec2 c2 = pos + calc_offset(vec2(1,-1), radius, stroke_width, view_scale);\n vec2 c3 = pos + calc_offset(vec2(1,1), radius, stroke_width, view_scale);\n vec2 c4 = pos + calc_offset(vec2(-1,1), radius, stroke_width, view_scale);\n float h1 = elevation(c1) + ELEVATION_BIAS;\n float h2 = elevation(c2) + ELEVATION_BIAS;\n float h3 = elevation(c3) + ELEVATION_BIAS;\n float h4 = elevation(c4) + ELEVATION_BIAS;\n return max(h4, max(h3, max(h1,h2)));\n}\n\nfloat circle_elevation(vec2 pos) {\n#if defined(TERRAIN)\n return elevation(pos) + ELEVATION_BIAS;\n#else\n return 0.0;\n#endif\n}\n\nvec4 project_vertex(vec2 extrusion, vec4 world_center, vec4 projected_center, float radius, float stroke_width, float view_scale, mat3 surface_vectors) {\n vec2 sample_offset = calc_offset(extrusion, radius, stroke_width, view_scale);\n#ifdef PITCH_WITH_MAP\n #ifdef PROJECTION_GLOBE_VIEW\n return u_matrix * ( world_center + vec4(sample_offset.x * surface_vectors[0] + sample_offset.y * surface_vectors[1], 0) );\n #else\n return u_matrix * ( world_center + vec4(sample_offset, 0, 0) );\n #endif\n#else\n return projected_center + vec4(sample_offset, 0, 0);\n#endif\n}\n\nfloat get_sample_step() {\n#ifdef PITCH_WITH_MAP\n return 2.0 * PI / float(NUM_SAMPLES_PER_RING);\n#else\n // We want to only sample the top half of the circle when it is viewport-aligned.\n // This is to prevent the circle from intersecting with the ground plane below it at high pitch.\n return PI / float(NUM_SAMPLES_PER_RING);\n#endif\n}\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\n#ifdef PROJECTION_GLOBE_VIEW\n // Compute positions on both globe and mercator plane to support transition between the two modes\n // Apply extra scaling to extrusion to cover different pixel space ratios (which is dependant on the latitude)\n vec3 pos_normal_3 = a_pos_normal_3 / 16384.0;\n mat3 surface_vectors = globe_mercator_surface_vectors(pos_normal_3, u_up_dir, u_zoom_transition);\n\n vec3 surface_extrusion = extrude.x * surface_vectors[0] + extrude.y * surface_vectors[1];\n vec3 globe_elevation = elevationVector(circle_center) * circle_elevation(circle_center);\n vec3 globe_pos = a_pos_3 + surface_extrusion + globe_elevation;\n vec3 mercator_elevation = u_up_dir * u_tile_up_scale * circle_elevation(circle_center);\n vec3 merc_pos = mercator_tile_position(u_inv_rot_matrix, circle_center, u_tile_id, u_merc_center) + surface_extrusion + mercator_elevation;\n vec3 pos = mix_globe_mercator(globe_pos, merc_pos, u_zoom_transition);\n vec4 world_center = vec4(pos, 1);\n#else \n mat3 surface_vectors = mat3(1.0);\n // extract height offset for terrain, this returns 0 if terrain is not active\n float height = circle_elevation(circle_center);\n vec4 world_center = vec4(circle_center, height, 1);\n#endif\n\n vec4 projected_center = u_matrix * world_center;\n\n float view_scale = 0.0;\n #ifdef PITCH_WITH_MAP\n #ifdef SCALE_WITH_MAP\n view_scale = 1.0;\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 view_scale = projected_center.w / u_camera_to_center_distance;\n #endif\n #else\n #ifdef SCALE_WITH_MAP\n view_scale = u_camera_to_center_distance;\n #else\n view_scale = projected_center.w;\n #endif\n #endif\n gl_Position = project_vertex(extrude, world_center, projected_center, radius, stroke_width, view_scale, surface_vectors);\n\n float visibility = 0.0;\n #ifdef TERRAIN\n float step = get_sample_step();\n #ifdef PITCH_WITH_MAP\n // to prevent the circle from self-intersecting with the terrain underneath on a sloped hill,\n // we calculate the elevation at each corner and pick the highest one when computing visibility.\n float cantilevered_height = cantilevered_elevation(circle_center, radius, stroke_width, view_scale);\n vec4 occlusion_world_center = vec4(circle_center, cantilevered_height, 1);\n vec4 occlusion_projected_center = u_matrix * occlusion_world_center;\n #else\n vec4 occlusion_world_center = world_center;\n vec4 occlusion_projected_center = projected_center;\n #endif\n for(int ring = 0; ring < NUM_VISIBILITY_RINGS; ring++) {\n float scale = (float(ring) + 1.0)/float(NUM_VISIBILITY_RINGS);\n for(int i = 0; i < NUM_SAMPLES_PER_RING; i++) {\n vec2 extrusion = vec2(cos(step * float(i)), -sin(step * float(i))) * scale;\n vec4 frag_pos = project_vertex(extrusion, occlusion_world_center, occlusion_projected_center, radius, stroke_width, view_scale, surface_vectors);\n visibility += float(!isOccluded(frag_pos));\n }\n }\n visibility /= float(NUM_VISIBILITY_RINGS) * float(NUM_SAMPLES_PER_RING);\n #else\n visibility = 1.0;\n #endif\n // This is a temporary overwrite until we add support for terrain occlusion for the globe view\n // Having a separate overwrite here makes the metal shader generation simpler for the default case\n #ifdef PROJECTION_GLOBE_VIEW\n visibility = 1.0;\n #endif\n v_visibility = visibility;\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 / u_device_pixel_ratio / (radius + stroke_width);\n\n v_data = vec3(extrude.x, extrude.y, antialiasblur);\n\n#ifdef FOG\n v_fog_pos = fog_position(world_center.xyz);\n#endif\n}\n"; - const isDuplicate = seenCrossTileIDs[crossTileID]; +var clippingMaskFrag = "void main() {\n gl_FragColor = vec4(1.0);\n}\n"; - let opacityState = this.opacities[crossTileID]; - if (isDuplicate) { - opacityState = duplicateOpacityState; - } else if (!opacityState) { - opacityState = defaultOpacityState; - // store the state so that future placements use it as a starting point - this.opacities[crossTileID] = opacityState; - } +var clippingMaskVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"; - seenCrossTileIDs[crossTileID] = true; +var heatmapFrag = "uniform highp float u_intensity;\n\nvarying vec2 v_extrude;\n\n#pragma mapbox: define highp float weight\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 FOG\n // Globe uses a fixed range and heatmaps preserve\n // their color with this thin atmosphere layer to\n // prevent this layer from overly flickering\n if (u_is_globe == 0) {\n // Heatmaps work differently than other layers, so we operate on the accumulated\n // density rather than a final color. The power is chosen so that the density\n // fades into the fog at a reasonable rate.\n gl_FragColor.r *= pow(1.0 - fog_opacity(v_fog_pos), 2.0);\n }\n#endif\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - const hasText = numHorizontalGlyphVertices > 0 || numVerticalGlyphVertices > 0; - const hasIcon = symbolInstance.numIconVertices > 0; +var heatmapVert = "\nuniform mat4 u_matrix;\nuniform float u_extrude_scale;\nuniform float u_opacity;\nuniform float u_intensity;\n\nattribute vec2 a_pos;\n\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_pos_3; // Projected position on the globe\nattribute vec3 a_pos_normal_3; // Surface normal at the position\n\n// Uniforms required for transition between globe and mercator\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_tile_id;\nuniform float u_zoom_transition;\nuniform vec3 u_up_dir;\n#endif\n\nvarying vec2 v_extrude;\n\n#pragma mapbox: define highp float weight\n#pragma mapbox: define mediump float radius\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 vec2 tilePos = floor(a_pos * 0.5);\n\n#ifdef PROJECTION_GLOBE_VIEW\n // Compute positions on both globe and mercator plane to support transition between the two modes\n // Apply extra scaling to extrusion to cover different pixel space ratios (which is dependant on the latitude)\n vec3 pos_normal_3 = a_pos_normal_3 / 16384.0;\n mat3 surface_vectors = globe_mercator_surface_vectors(pos_normal_3, u_up_dir, u_zoom_transition);\n vec3 surface_extrusion = extrude.x * surface_vectors[0] + extrude.y * surface_vectors[1];\n vec3 globe_elevation = elevationVector(tilePos) * elevation(tilePos);\n vec3 globe_pos = a_pos_3 + surface_extrusion + globe_elevation;\n vec3 mercator_elevation = u_up_dir * u_tile_up_scale * elevation(tilePos);\n vec3 merc_pos = mercator_tile_position(u_inv_rot_matrix, tilePos, u_tile_id, u_merc_center) + surface_extrusion + mercator_elevation;\n vec3 pos = mix_globe_mercator(globe_pos, merc_pos, u_zoom_transition);\n#else\n vec3 pos = vec3(tilePos + extrude, elevation(tilePos));\n#endif\n\n gl_Position = u_matrix * vec4(pos, 1);\n\n#ifdef FOG\n v_fog_pos = fog_position(pos);\n#endif\n}\n"; - const placedOrientation = this.placedOrientations[symbolInstance.crossTileID]; - const horizontalHidden = placedOrientation === transform.WritingMode.vertical; - const verticalHidden = placedOrientation === transform.WritingMode.horizontal || placedOrientation === transform.WritingMode.horizontalOnly; - if ((hasText || hasIcon) && !opacityState.isHidden()) visibleInstanceCount++; +var heatmapTextureFrag = "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\n gl_FragColor = color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(0.0);\n#endif\n}\n"; - if (hasText) { - const 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 - const horizontalOpacity = horizontalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity; - addOpacities(bucket.text, numHorizontalGlyphVertices, horizontalOpacity); - const verticalOpacity = verticalHidden ? PACKED_HIDDEN_OPACITY : packedOpacity; - addOpacities(bucket.text, numVerticalGlyphVertices, verticalOpacity); +var heatmapTextureVert = "attribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = vec4(a_pos, 0, 1);\n\n v_pos = a_pos * 0.5 + 0.5;\n}\n"; - // If this label is completely faded, mark it so that we don't have to calculate - // its position at render time. If this layer has variable placement, shift the various - // symbol instances appropriately so that symbols from buckets that have yet to be placed - // offset appropriately. - const symbolHidden = opacityState.text.isHidden(); - [ - symbolInstance.rightJustifiedTextSymbolIndex, - symbolInstance.centerJustifiedTextSymbolIndex, - symbolInstance.leftJustifiedTextSymbolIndex - ].forEach(index => { - if (index >= 0) { - bucket.text.placedSymbolArray.get(index).hidden = symbolHidden || horizontalHidden ? 1 : 0; - } - }); +var collisionBoxFrag = "varying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n vec4 red = vec4(1.0, 0.0, 0.0, 1.0); // Red = collision, hide label\n vec4 blue = vec4(0.0, 0.0, 1.0, 0.5); // Blue = no collision, label is showing\n\n gl_FragColor = mix(red, blue, step(0.5, v_placed)) * 0.5;\n gl_FragColor *= mix(1.0, 0.1, step(0.5, v_notUsed));\n}"; - if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) { - bucket.text.placedSymbolArray.get(symbolInstance.verticalPlacedTextSymbolIndex).hidden = symbolHidden || verticalHidden ? 1 : 0; - } +var collisionBoxVert = "attribute vec3 a_pos;\nattribute vec2 a_anchor_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_placed;\nattribute vec2 a_shift;\nattribute float a_size_scale;\nattribute vec2 a_padding;\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_pos + elevationVector(a_anchor_pos) * elevation(a_anchor_pos), 1);\n\n highp float camera_to_anchor_distance = projectedPoint.w;\n highp float collision_perspective_ratio = clamp(\n 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance),\n 0.0, // Prevents oversized near-field boxes in pitched/overzoomed tiles\n 1.5);\n\n gl_Position = projectedPoint;\n gl_Position.xy += (a_extrude * a_size_scale + a_shift + a_padding) * u_extrude_scale * gl_Position.w * collision_perspective_ratio;\n\n v_placed = a_placed.x;\n v_notUsed = a_placed.y;\n}\n"; - const prevOffset = this.variableOffsets[symbolInstance.crossTileID]; - if (prevOffset) { - this.markUsedJustification(bucket, prevOffset.anchor, symbolInstance, placedOrientation); - } +var collisionCircleFrag = "varying float v_radius;\nvarying vec2 v_extrude;\nvarying float v_perspective_ratio;\nvarying float v_collision;\n\nvoid main() {\n float alpha = 0.5 * min(v_perspective_ratio, 1.0);\n float stroke_radius = 0.9 * max(v_perspective_ratio, 1.0);\n\n float distance_to_center = length(v_extrude);\n float distance_to_edge = abs(distance_to_center - v_radius);\n float opacity_t = smoothstep(-stroke_radius, 0.0, -distance_to_edge);\n\n vec4 color = mix(vec4(0.0, 0.0, 1.0, 0.5), vec4(1.0, 0.0, 0.0, 1.0), v_collision);\n\n gl_FragColor = color * alpha * opacity_t;\n}\n"; - const prevOrientation = this.placedOrientations[symbolInstance.crossTileID]; - if (prevOrientation) { - this.markUsedJustification(bucket, 'left', symbolInstance, prevOrientation); - this.markUsedOrientation(bucket, prevOrientation, symbolInstance); - } - } +var collisionCircleVert = "attribute vec2 a_pos_2f;\nattribute float a_radius;\nattribute vec2 a_flags;\n\nuniform mat4 u_matrix;\nuniform mat4 u_inv_matrix;\nuniform vec2 u_viewport_size;\nuniform float u_camera_to_center_distance;\n\nvarying float v_radius;\nvarying vec2 v_extrude;\nvarying float v_perspective_ratio;\nvarying float v_collision;\n\nvec3 toTilePosition(vec2 screenPos) {\n // Shoot a ray towards the ground to reconstruct the depth-value\n vec4 rayStart = u_inv_matrix * vec4(screenPos, -1.0, 1.0);\n vec4 rayEnd = u_inv_matrix * vec4(screenPos, 1.0, 1.0);\n\n rayStart.xyz /= rayStart.w;\n rayEnd.xyz /= rayEnd.w;\n\n highp float t = (0.0 - rayStart.z) / (rayEnd.z - rayStart.z);\n return mix(rayStart.xyz, rayEnd.xyz, t);\n}\n\nvoid main() {\n vec2 quadCenterPos = a_pos_2f;\n float radius = a_radius;\n float collision = a_flags.x;\n float vertexIdx = a_flags.y;\n\n vec2 quadVertexOffset = vec2(\n mix(-1.0, 1.0, float(vertexIdx >= 2.0)),\n mix(-1.0, 1.0, float(vertexIdx >= 1.0 && vertexIdx <= 2.0)));\n\n vec2 quadVertexExtent = quadVertexOffset * radius;\n\n // Screen position of the quad might have been computed with different camera parameters.\n // Transform the point to a proper position on the current viewport\n vec3 tilePos = toTilePosition(quadCenterPos);\n vec4 clipPos = u_matrix * vec4(tilePos, 1.0);\n\n highp float camera_to_anchor_distance = clipPos.w;\n highp float collision_perspective_ratio = clamp(\n 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance),\n 0.0, // Prevents oversized near-field circles in pitched/overzoomed tiles\n 4.0);\n\n // Apply small padding for the anti-aliasing effect to fit the quad\n // Note that v_radius and v_extrude are in screen coordinates already\n float padding_factor = 1.2;\n v_radius = radius;\n v_extrude = quadVertexExtent * padding_factor;\n v_perspective_ratio = collision_perspective_ratio;\n v_collision = collision;\n\n gl_Position = vec4(clipPos.xyz / clipPos.w, 1.0) + vec4(quadVertexExtent * padding_factor / u_viewport_size * 2.0, 0.0, 0.0);\n}\n"; - if (hasIcon) { - const packedOpacity = packOpacity(opacityState.icon); +var debugFrag = "uniform highp vec4 u_color;\nuniform sampler2D u_overlay;\n\nvarying vec2 v_uv;\n\nvoid main() {\n vec4 overlay_color = texture2D(u_overlay, v_uv);\n gl_FragColor = mix(u_color, overlay_color, overlay_color.a);\n}\n"; - if (symbolInstance.placedIconSymbolIndex >= 0) { - const horizontalOpacity = !horizontalHidden ? packedOpacity : PACKED_HIDDEN_OPACITY; - addOpacities(bucket.icon, symbolInstance.numIconVertices, horizontalOpacity); - bucket.icon.placedSymbolArray.get(symbolInstance.placedIconSymbolIndex).hidden = - (opacityState.icon.isHidden() ); - } +var debugVert = "attribute vec2 a_pos;\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_pos_3;\n#endif\nvarying vec2 v_uv;\n\nuniform mat4 u_matrix;\nuniform float u_overlay_scale;\n\nvoid main() {\n // This vertex shader expects a EXTENT x EXTENT quad,\n // The UV co-ordinates for the overlay texture can be calculated using that knowledge\n float h = elevation(a_pos);\n v_uv = a_pos / 8192.0;\n#ifdef PROJECTION_GLOBE_VIEW\n gl_Position = u_matrix * vec4(a_pos_3 + elevationVector(a_pos) * h, 1);\n#else\n gl_Position = u_matrix * vec4(a_pos * u_overlay_scale, h, 1);\n#endif\n}\n"; - if (symbolInstance.verticalPlacedIconSymbolIndex >= 0) { - const verticalOpacity = !verticalHidden ? packedOpacity : PACKED_HIDDEN_OPACITY; - addOpacities(bucket.icon, symbolInstance.numVerticalIconVertices, verticalOpacity); - bucket.icon.placedSymbolArray.get(symbolInstance.verticalPlacedIconSymbolIndex).hidden = - (opacityState.icon.isHidden() ); - } - } +var fillFrag = "#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 vec4 out_color = color;\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - if (bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()) { - const collisionArrays = bucket.collisionArrays[s]; - if (collisionArrays) { - let shift = new transform.pointGeometry(0, 0); - let used = true; - if (collisionArrays.textBox || collisionArrays.verticalTextBox) { - if (variablePlacement) { - const variableOffset = this.variableOffsets[crossTileID]; - if (variableOffset) { - // This will show either the currently placed position or the last - // successfully placed position (so you can visualize what collision - // just made the symbol disappear, and the most likely place for the - // symbol to come back) - shift = calculateVariableLayoutShift(variableOffset.anchor, - variableOffset.width, - variableOffset.height, - variableOffset.textOffset, - variableOffset.textScale); - if (rotateWithMap) { - shift._rotate(pitchWithMap ? this.transform.angle : -this.transform.angle); - } - } else { - // No offset -> this symbol hasn't been placed since coming on-screen - // No single box is particularly meaningful and all of them would be too noisy - // Use the center box just to show something's there, but mark it "not used" - used = false; - } - } +var fillVert = "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#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; - if (hasClipping) { - used = !opacityState.clipped; - } +var fillOutlineFrag = "varying 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 float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n vec4 out_color = outline_color;\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - if (collisionArrays.textBox) { - updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || horizontalHidden, shift.x, shift.y); - } - if (collisionArrays.verticalTextBox) { - updateCollisionVertices(bucket.textCollisionBox.collisionVertexArray, opacityState.text.placed, !used || verticalHidden, shift.x, shift.y); - } - } +var fillOutlineVert = "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#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; - const verticalIconUsed = used && Boolean(!verticalHidden && collisionArrays.verticalIconBox); +var fillOutlinePatternFrag = "\nuniform vec2 u_texsize;\nuniform sampler2D u_image;\nuniform float u_fade;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, 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(pattern_tl_b / u_texsize, 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 vec4 out_color = mix(color1, color2, u_fade);\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - if (collisionArrays.iconBox) { - updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, verticalIconUsed, - hasIconTextFit ? shift.x : 0, - hasIconTextFit ? shift.y : 0); - } +var fillOutlinePatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform vec3 u_scale;\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#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float tileRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, a_pos);\n\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n\n#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; - if (collisionArrays.verticalIconBox) { - updateCollisionVertices(bucket.iconCollisionBox.collisionVertexArray, opacityState.icon.placed, !verticalIconUsed, - hasIconTextFit ? shift.x : 0, - hasIconTextFit ? shift.y : 0); - } - } - } - } - bucket.fullyClipped = visibleInstanceCount === 0; - bucket.sortFeatures(this.transform.angle); - if (this.retainedQueryData[bucket.bucketInstanceId]) { - this.retainedQueryData[bucket.bucketInstanceId].featureSortOrder = bucket.featureSortOrder; - } +var fillPatternFrag = "uniform vec2 u_texsize;\nuniform float u_fade;\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#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, 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(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 out_color = mix(color1, color2, u_fade);\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - 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.hasIconCollisionBoxData() && bucket.iconCollisionBox.collisionVertexBuffer) { - bucket.iconCollisionBox.collisionVertexBuffer.updateData(bucket.iconCollisionBox.collisionVertexArray); - } - if (bucket.hasTextCollisionBoxData() && bucket.textCollisionBox.collisionVertexBuffer) { - bucket.textCollisionBox.collisionVertexBuffer.updateData(bucket.textCollisionBox.collisionVertexArray); - } +var fillPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform vec3 u_scale;\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#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float tileZoomRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\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, fromScale * display_size_a, tileZoomRatio, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileZoomRatio, a_pos);\n\n#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; - transform.assert_1(bucket.text.opacityVertexArray.length === bucket.text.layoutVertexArray.length / 4); - transform.assert_1(bucket.icon.opacityVertexArray.length === bucket.icon.layoutVertexArray.length / 4); +var fillExtrusionFrag = "varying vec4 v_color;\n\nvoid main() {\n vec4 color = v_color;\n#ifdef FOG\n color = fog_dither(fog_apply_premultiplied(color, v_fog_pos));\n#endif\n gl_FragColor = color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - // Push generated collision circles to the bucket for debug rendering - if (bucket.bucketInstanceId in this.collisionCircleArrays) { - const instance = this.collisionCircleArrays[bucket.bucketInstanceId]; +var fillExtrusionVert = "uniform mat4 u_matrix;\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\nuniform float u_vertical_gradient;\nuniform lowp float u_opacity;\n\nattribute vec4 a_pos_normal_ed;\nattribute vec2 a_centroid_pos;\n\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_pos_3; // Projected position on the globe\nattribute vec3 a_pos_normal_3; // Surface normal at the position\n\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_tile_id;\nuniform float u_zoom_transition;\nuniform vec3 u_up_dir;\nuniform float u_height_lift;\n#endif\n\nvarying vec4 v_color;\n\n#pragma mapbox: define highp float base\n#pragma mapbox: define highp float height\n\n#pragma mapbox: define highp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize highp float base\n #pragma mapbox: initialize highp float height\n #pragma mapbox: initialize highp vec4 color\n\n vec3 pos_nx = floor(a_pos_normal_ed.xyz * 0.5);\n // The least significant bits of a_pos_normal_ed.xy hold:\n // x is 1 if it's on top, 0 for ground.\n // y is 1 if the normal points up, and 0 if it points to side.\n // z is sign of ny: 1 for positive, 0 for values <= 0.\n mediump vec3 top_up_ny = a_pos_normal_ed.xyz - 2.0 * pos_nx;\n\n float x_normal = pos_nx.z / 8192.0;\n vec3 normal = top_up_ny.y == 1.0 ? vec3(0.0, 0.0, 1.0) : normalize(vec3(x_normal, (2.0 * top_up_ny.z - 1.0) * (1.0 - abs(x_normal)), 0.0));\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = top_up_ny.x;\n\n vec2 centroid_pos = vec2(0.0);\n#if defined(HAS_CENTROID) || defined(TERRAIN)\n centroid_pos = a_centroid_pos;\n#endif\n\n#ifdef TERRAIN\n bool flat_roof = centroid_pos.x != 0.0 && t > 0.0;\n float ele = elevation(pos_nx.xy);\n float c_ele = flat_roof ? centroid_pos.y == 0.0 ? elevationFromUint16(centroid_pos.x) : flatElevation(centroid_pos) : ele;\n // If centroid elevation lower than vertex elevation, roof at least 2 meters height above base.\n float h = flat_roof ? max(c_ele + height, ele + base + 2.0) : ele + (t > 0.0 ? height : base == 0.0 ? -5.0 : base);\n vec3 pos = vec3(pos_nx.xy, h);\n#else\n vec3 pos = vec3(pos_nx.xy, t > 0.0 ? height : base);\n#endif\n\n#ifdef PROJECTION_GLOBE_VIEW\n // If t > 0 (top) we always add the lift, otherwise (ground) we only add it if base height is > 0\n float lift = float((t + base) > 0.0) * u_height_lift;\n vec3 globe_normal = normalize(mix(a_pos_normal_3 / 16384.0, u_up_dir, u_zoom_transition));\n vec3 globe_pos = a_pos_3 + globe_normal * (u_tile_up_scale * (pos.z + lift));\n vec3 merc_pos = mercator_tile_position(u_inv_rot_matrix, pos.xy, u_tile_id, u_merc_center) + u_up_dir * u_tile_up_scale * pos.z;\n pos = mix_globe_mercator(globe_pos, merc_pos, u_zoom_transition);\n#endif\n\n float hidden = float(centroid_pos.x == 0.0 && centroid_pos.y == 1.0);\n gl_Position = mix(u_matrix * vec4(pos, 1), AWAY, hidden);\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, 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 // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient,\n // and otherwise calculates the gradient based on base + height\n directional *= (\n (1.0 - u_vertical_gradient) +\n (u_vertical_gradient * 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.rgb += clamp(color.rgb * directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));\n v_color *= u_opacity;\n\n#ifdef FOG\n v_fog_pos = fog_position(pos);\n#endif\n}\n"; - bucket.placementInvProjMatrix = instance.invProjMatrix; - bucket.placementViewportMatrix = instance.viewportMatrix; - bucket.collisionCircleArray = instance.circles; +var fillExtrusionPatternFrag = "uniform vec2 u_texsize;\nuniform float u_fade;\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#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, 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(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 out_color = mix(color1, color2, u_fade);\n\n out_color = out_color * v_lighting;\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - delete this.collisionCircleArrays[bucket.bucketInstanceId]; - } - } +var fillExtrusionPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_height_factor;\nuniform vec3 u_scale;\nuniform float u_vertical_gradient;\nuniform lowp float u_opacity;\n\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec4 a_pos_normal_ed;\nattribute vec2 a_centroid_pos;\n\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_pos_3; // Projected position on the globe\nattribute vec3 a_pos_normal_3; // Surface normal at the position\n\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_tile_id;\nuniform float u_zoom_transition;\nuniform vec3 u_up_dir;\nuniform float u_height_lift;\n#endif\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#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float tileRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n vec3 pos_nx = floor(a_pos_normal_ed.xyz * 0.5);\n // The least significant bits of a_pos_normal_ed.xy hold:\n // x is 1 if it's on top, 0 for ground.\n // y is 1 if the normal points up, and 0 if it points to side.\n // z is sign of ny: 1 for positive, 0 for values <= 0.\n mediump vec3 top_up_ny = a_pos_normal_ed.xyz - 2.0 * pos_nx;\n\n float x_normal = pos_nx.z / 8192.0;\n vec3 normal = top_up_ny.y == 1.0 ? vec3(0.0, 0.0, 1.0) : normalize(vec3(x_normal, (2.0 * top_up_ny.z - 1.0) * (1.0 - abs(x_normal)), 0.0));\n float edgedistance = a_pos_normal_ed.w;\n\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = top_up_ny.x;\n float z = t > 0.0 ? height : base;\n\n vec2 centroid_pos = vec2(0.0);\n#if defined(HAS_CENTROID) || defined(TERRAIN)\n centroid_pos = a_centroid_pos;\n#endif\n\n#ifdef TERRAIN\n bool flat_roof = centroid_pos.x != 0.0 && t > 0.0;\n float ele = elevation(pos_nx.xy);\n float c_ele = flat_roof ? centroid_pos.y == 0.0 ? elevationFromUint16(centroid_pos.x) : flatElevation(centroid_pos) : ele;\n // If centroid elevation lower than vertex elevation, roof at least 2 meters height above base.\n float h = flat_roof ? max(c_ele + height, ele + base + 2.0) : ele + (t > 0.0 ? height : base == 0.0 ? -5.0 : base);\n vec3 p = vec3(pos_nx.xy, h);\n#else\n vec3 p = vec3(pos_nx.xy, z);\n#endif\n\n#ifdef PROJECTION_GLOBE_VIEW\n // If t > 0 (top) we always add the lift, otherwise (ground) we only add it if base height is > 0\n float lift = float((t + base) > 0.0) * u_height_lift;\n vec3 globe_normal = normalize(mix(a_pos_normal_3 / 16384.0, u_up_dir, u_zoom_transition));\n vec3 globe_pos = a_pos_3 + globe_normal * (u_tile_up_scale * (p.z + lift));\n vec3 merc_pos = mercator_tile_position(u_inv_rot_matrix, p.xy, u_tile_id, u_merc_center) + u_up_dir * u_tile_up_scale * p.z;\n p = mix_globe_mercator(globe_pos, merc_pos, u_zoom_transition);\n#endif\n\n float hidden = float(centroid_pos.x == 0.0 && centroid_pos.y == 1.0);\n gl_Position = mix(u_matrix * vec4(p, 1), AWAY, hidden);\n\n vec2 pos = normal.z == 1.0\n ? pos_nx.xy // 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, fromScale * display_size_a, tileRatio, pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, pos);\n\n v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\n float directional = clamp(dot(normal, 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 // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient,\n // and otherwise calculates the gradient based on base + height\n directional *= (\n (1.0 - u_vertical_gradient) +\n (u_vertical_gradient * 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 v_lighting *= u_opacity;\n\n#ifdef FOG\n v_fog_pos = fog_position(p);\n#endif\n}\n"; - symbolFadeChange(now ) { - return this.fadeDuration === 0 ? - 1 : - ((now - this.commitTime) / this.fadeDuration + this.prevZoomAdjustment); - } +var hillshadePrepareFrag = "#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;\nuniform vec4 u_unpack;\n\nfloat getElevation(vec2 coord) {\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\n return texture2D(u_image, coord).a / 4.0;\n#else\n // Convert encoded elevation value to meters\n vec4 data = texture2D(u_image, coord) * 255.0;\n data.a = -1.0;\n return dot(data, u_unpack) / 4.0;\n#endif\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));\n float b = getElevation(v_pos + vec2(0, -epsilon.y));\n float c = getElevation(v_pos + vec2(epsilon.x, -epsilon.y));\n float d = getElevation(v_pos + vec2(-epsilon.x, 0));\n float e = getElevation(v_pos);\n float f = getElevation(v_pos + vec2(epsilon.x, 0));\n float g = getElevation(v_pos + vec2(-epsilon.x, epsilon.y));\n float h = getElevation(v_pos + vec2(0, epsilon.y));\n float i = getElevation(v_pos + vec2(epsilon.x, epsilon.y));\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 because otherwise\n // it is barely noticeable at low zooms. To do this, we multiply this by\n // a scale factor that is a function of zooms below 15, which is an arbitrary\n // that corresponds to the max zoom level of Mapbox terrain-RGB tiles.\n // See nickidlugash's awesome breakdown for more info:\n // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556\n\n float exaggerationFactor = u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;\n float exaggeration = u_zoom < 15.0 ? (u_zoom - 15.0) * exaggerationFactor : 0.0;\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, 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"; - zoomAdjustment(zoom ) { - // When zooming out quickly, labels can overlap each other. This - // adjustment is used to reduce the interval between placement calculations - // and to reduce the fade duration when zooming out quickly. Discovering the - // collisions more quickly and fading them more quickly reduces the unwanted effect. - return Math.max(0, (this.transform.zoom - zoom) / 1.5); - } +var hillshadePrepareVert = "uniform mat4 u_matrix;\nuniform vec2 u_dimension;\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\n highp vec2 epsilon = 1.0 / u_dimension;\n float scale = (u_dimension.x - 2.0) / u_dimension.x;\n v_pos = (a_texture_pos / 8192.0) * scale + epsilon;\n}\n"; - hasTransitions(now ) { - return this.stale || - now - this.lastPlacementChangeTime < this.fadeDuration; - } +var hillshadeFrag = "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\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 // 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 FOG\n gl_FragColor = fog_dither(fog_apply_premultiplied(gl_FragColor, v_fog_pos));\n#endif\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - stillRecent(now , zoom ) { - // The adjustment makes placement more frequent when zooming. - // This condition applies the adjustment only after the map has - // stopped zooming. This avoids adding extra jank while zooming. - const durationAdjustment = this.zoomAtLastRecencyCheck === zoom ? - (1 - this.zoomAdjustment(zoom)) : - 1; - this.zoomAtLastRecencyCheck = zoom; +var hillshadeVert = "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#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; - return this.commitTime + this.fadeDuration * durationAdjustment > now; - } +var lineFrag = "uniform lowp float u_device_pixel_ratio;\nuniform float u_alpha_discard_threshold;\nuniform highp vec2 u_trim_offset;\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\nvarying highp vec4 v_uv;\n#ifdef RENDER_LINE_DASH\nuniform sampler2D u_dash_image;\n\nuniform float u_mix;\nuniform vec3 u_scale;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\n#endif\n\n#ifdef RENDER_LINE_GRADIENT\nuniform sampler2D u_gradient_image;\n#endif\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 dash_from\n#pragma mapbox: define lowp vec4 dash_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float floorwidth\n #pragma mapbox: initialize lowp vec4 dash_from\n #pragma mapbox: initialize lowp vec4 dash_to\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 / u_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#ifdef RENDER_LINE_DASH\n float sdfdist_a = texture2D(u_dash_image, v_tex_a).a;\n float sdfdist_b = texture2D(u_dash_image, v_tex_b).a;\n float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n float sdfwidth = min(dash_from.z * u_scale.y, dash_to.z * u_scale.z);\n float sdfgamma = 1.0 / (2.0 * u_device_pixel_ratio) / sdfwidth;\n alpha *= smoothstep(0.5 - sdfgamma / floorwidth, 0.5 + sdfgamma / floorwidth, sdfdist);\n#endif\n\n#ifdef RENDER_LINE_GRADIENT\n // For gradient lines, v_uv.xy are the coord specify where the texture will be simpled.\n highp vec4 out_color = texture2D(u_gradient_image, v_uv.xy);\n#else\n vec4 out_color = color;\n#endif\n\n#ifdef RENDER_LINE_TRIM_OFFSET\n // v_uv[2] and v_uv[3] are specifying the original clip range that the vertex is located in.\n highp float start = v_uv[2];\n highp float end = v_uv[3];\n highp float trim_start = u_trim_offset[0];\n highp float trim_end = u_trim_offset[1];\n // v_uv.x is the relative prorgress based on each clip. Calculate the absolute progress based on\n // the whole line by combining the clip start and end value.\n highp float line_progress = (start + (v_uv.x) * (end - start));\n // Mark the pixel to be transparent when:\n // 1. trim_offset range is valid\n // 2. line_progress is within trim_offset range\n if (trim_end > trim_start && (line_progress <= trim_end && line_progress >= trim_start)) {\n out_color = vec4(0, 0, 0, 0);\n }\n#endif\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n#ifdef RENDER_LINE_ALPHA_DISCARD\n if (alpha < u_alpha_discard_threshold) {\n discard;\n }\n#endif\n\n gl_FragColor = out_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - setStale() { - this.stale = true; - } -} +var lineVert = "// 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 EXTRUDE_SCALE 0.015873016\n\nattribute vec2 a_pos_normal;\nattribute vec4 a_data;\n// Includes in order: a_uv_x, a_split_index, a_clip_start, a_clip_end\n// to reduce attribute count on older devices.\n// Only line-gradient and line-trim-offset will requires a_packed info.\n#if defined(RENDER_LINE_GRADIENT) || defined(RENDER_LINE_TRIM_OFFSET)\nattribute highp vec4 a_packed;\n#endif\n\n#ifdef RENDER_LINE_DASH\nattribute float a_linesofar;\n#endif\n\nuniform mat4 u_matrix;\nuniform mat2 u_pixels_to_tile_units;\nuniform vec2 u_units_to_pixels;\nuniform lowp float u_device_pixel_ratio;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\nvarying highp vec4 v_uv;\n\n#ifdef RENDER_LINE_DASH\nuniform vec2 u_texsize;\nuniform mediump vec3 u_scale;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\n#endif\n\n#ifdef RENDER_LINE_GRADIENT\nuniform float u_image_height;\n#endif\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 dash_from\n#pragma mapbox: define lowp vec4 dash_to\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 floorwidth\n #pragma mapbox: initialize lowp vec4 dash_from\n #pragma mapbox: initialize lowp vec4 dash_to\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 // the distance over which the line edge fades out.\n // Retina devices need a smaller distance to avoid aliasing.\n float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0;\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n vec2 pos = floor(a_pos_normal * 0.5);\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 // We store these in the least significant bit of a_pos_normal\n mediump vec2 normal = a_pos_normal - 2.0 * pos;\n normal.y = normal.y * 2.0 - 1.0;\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) + (halfwidth == 0.0 ? 0.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 * 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 * EXTRUDE_SCALE * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist * u_pixels_to_tile_units, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 * u_pixels_to_tile_units, 0.0, 1.0) + projected_extrude;\n\n#ifndef RENDER_TO_TEXTURE\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_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n#else\n v_gamma_scale = 1.0;\n#endif\n\n#if defined(RENDER_LINE_GRADIENT) || defined(RENDER_LINE_TRIM_OFFSET)\n float a_uv_x = a_packed[0];\n float a_split_index = a_packed[1];\n highp float a_clip_start = a_packed[2];\n highp float a_clip_end = a_packed[3];\n#ifdef RENDER_LINE_GRADIENT\n highp float texel_height = 1.0 / u_image_height;\n highp float half_texel_height = 0.5 * texel_height;\n\n v_uv = vec4(a_uv_x, a_split_index * texel_height - half_texel_height, a_clip_start, a_clip_end);\n#else\n v_uv = vec4(a_uv_x, 0.0, a_clip_start, a_clip_end);\n#endif\n#endif\n\n#ifdef RENDER_LINE_DASH\n float tileZoomRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n float scaleA = dash_from.z == 0.0 ? 0.0 : tileZoomRatio / (dash_from.z * fromScale);\n float scaleB = dash_to.z == 0.0 ? 0.0 : tileZoomRatio / (dash_to.z * toScale);\n float heightA = dash_from.y;\n float heightB = dash_to.y;\n\n v_tex_a = vec2(a_linesofar * scaleA / floorwidth, (-normal.y * heightA + dash_from.x + 0.5) / u_texsize.y);\n v_tex_b = vec2(a_linesofar * scaleB / floorwidth, (-normal.y * heightB + dash_to.x + 0.5) / u_texsize.y);\n#endif\n\n v_width2 = vec2(outset, inset);\n\n#ifdef FOG\n v_fog_pos = fog_position(pos);\n#endif\n}\n"; -function updateCollisionVertices(collisionVertexArray , placed , notUsed , shiftX , shiftY ) { - collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); - collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); - collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); - collisionVertexArray.emplaceBack(placed ? 1 : 0, notUsed ? 1 : 0, shiftX || 0, shiftY || 0); -} +var linePatternFrag = "uniform lowp float u_device_pixel_ratio;\nuniform vec2 u_texsize;\nuniform float u_fade;\nuniform mediump vec3 u_scale;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\nvarying float v_width;\n\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float tileZoomRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\n\n vec2 pattern_size_a = vec2(display_size_a.x * fromScale / tileZoomRatio, display_size_a.y);\n vec2 pattern_size_b = vec2(display_size_b.x * toScale / tileZoomRatio, display_size_b.y);\n\n float aspect_a = display_size_a.y / v_width;\n float aspect_b = display_size_b.y / v_width;\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 / u_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 / pattern_size_a.x * aspect_a, 1.0);\n float x_b = mod(v_linesofar / pattern_size_b.x * aspect_b, 1.0);\n\n float y = 0.5 * v_normal.y + 0.5;\n\n vec2 texel_size = 1.0 / u_texsize;\n\n vec2 pos_a = mix(pattern_tl_a * texel_size - texel_size, pattern_br_a * texel_size + texel_size, vec2(x_a, y));\n vec2 pos_b = mix(pattern_tl_b * texel_size - texel_size, pattern_br_b * texel_size + texel_size, vec2(x_b, y));\n\n vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\n\n#ifdef FOG\n color = fog_dither(fog_apply_premultiplied(color, v_fog_pos));\n#endif\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; -// 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. -const shift25 = Math.pow(2, 25); -const shift24 = Math.pow(2, 24); -const shift17 = Math.pow(2, 17); -const shift16 = Math.pow(2, 16); -const shift9 = Math.pow(2, 9); -const shift8 = Math.pow(2, 8); -const 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; - } - const targetBit = opacityState.placed ? 1 : 0; - const opacityBits = Math.floor(opacityState.opacity * 127); - return opacityBits * shift25 + targetBit * shift24 + - opacityBits * shift17 + targetBit * shift16 + - opacityBits * shift9 + targetBit * shift8 + - opacityBits * shift1 + targetBit; -} +var linePatternVert = "// 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 vec2 a_pos_normal;\nattribute vec4 a_data;\nattribute float a_linesofar;\n\nuniform mat4 u_matrix;\nuniform vec2 u_units_to_pixels;\nuniform mat2 u_pixels_to_tile_units;\nuniform lowp float u_device_pixel_ratio;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\nvarying float v_width;\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#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\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 #pragma mapbox: initialize lowp float floorwidth\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n // the distance over which the line edge fades out.\n // Retina devices need a smaller distance to avoid aliasing.\n float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0;\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n // float tileRatio = u_scale.x;\n vec2 pos = floor(a_pos_normal * 0.5);\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 // We store these in the least significant bit of a_pos_normal\n mediump vec2 normal = a_pos_normal - 2.0 * pos;\n normal.y = normal.y * 2.0 - 1.0;\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) + (halfwidth == 0.0 ? 0.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_pixels_to_tile_units, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 * u_pixels_to_tile_units, 0.0, 1.0) + projected_extrude;\n\n#ifndef RENDER_TO_TEXTURE\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_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n#else\n v_gamma_scale = 1.0;\n#endif\n v_linesofar = a_linesofar;\n v_width2 = vec2(outset, inset);\n v_width = floorwidth;\n\n#ifdef FOG\n v_fog_pos = fog_position(pos);\n#endif\n}\n"; + +var rasterFrag = "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 vec3 out_color = mix(u_high_vec, u_low_vec, rgb);\n\n#ifdef FOG\n out_color = fog_dither(fog_apply(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = vec4(out_color * color.a, color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + +var rasterVert = "uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform vec2 u_perspective_transform;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n float w = 1.0 + dot(a_texture_pos, u_perspective_transform);\n gl_Position = u_matrix * vec4(a_pos * w, 0, w);\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;\n v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n\n#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; + +var symbolIconFrag = "uniform sampler2D u_texture;\n\nvarying vec2 v_tex;\nvarying float v_fade_opacity;\n\n#pragma mapbox: define lowp float 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"; + +var symbolIconVert = "attribute vec4 a_pos_offset;\nattribute vec4 a_tex_size;\nattribute vec4 a_pixeloffset;\nattribute vec4 a_projected_pos;\nattribute float a_fade_opacity;\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_globe_anchor;\nattribute vec3 a_globe_normal;\n#endif\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 bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform float u_fade_change;\n\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_coord_matrix;\n\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\n\nuniform vec2 u_texsize;\nuniform vec3 u_up_vector;\n\n#ifdef PROJECTION_GLOBE_VIEW\nuniform vec3 u_tile_id;\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_camera_forward;\nuniform float u_zoom_transition;\nuniform vec3 u_ecef_origin;\nuniform mat4 u_tile_matrix;\n#endif\n\nvarying vec2 v_tex;\nvarying float v_fade_opacity;\n\n#pragma mapbox: define lowp float 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_tex_size.xy;\n vec2 a_size = a_tex_size.zw;\n\n float a_size_min = floor(a_size[0] * 0.5);\n vec2 a_pxoffset = a_pixeloffset.xy;\n vec2 a_min_font_scale = a_pixeloffset.zw / 256.0;\n\n highp float segment_angle = -a_projected_pos[3];\n float size;\n\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size_min, a_size[1], u_size_t) / 128.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size_min / 128.0;\n } else {\n size = u_size;\n }\n\n vec2 tile_anchor = a_pos;\n vec3 h = elevationVector(tile_anchor) * elevation(tile_anchor);\n\n#ifdef PROJECTION_GLOBE_VIEW\n vec3 mercator_pos = mercator_tile_position(u_inv_rot_matrix, tile_anchor, u_tile_id, u_merc_center);\n vec3 world_pos = mix_globe_mercator(a_globe_anchor + h, mercator_pos, u_zoom_transition);\n\n vec4 ecef_point = u_tile_matrix * vec4(world_pos, 1.0);\n vec3 origin_to_point = ecef_point.xyz - u_ecef_origin;\n\n // Occlude symbols that are on the non-visible side of the globe sphere\n float globe_occlusion_fade = dot(origin_to_point, u_camera_forward) >= 0.0 ? 0.0 : 1.0;\n#else\n vec3 world_pos = vec3(tile_anchor, 0) + h;\n float globe_occlusion_fade = 1.0;\n#endif\n\n vec4 projected_point = u_matrix * vec4(world_pos, 1);\n\n highp float camera_to_anchor_distance = projected_point.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 = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 1.5);\n\n size *= perspective_ratio;\n\n float font_scale = 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#ifdef PROJECTION_GLOBE_VIEW\n vec3 displacement = vec3(a_globe_normal.z, 0, -a_globe_normal.x);\n vec4 offsetProjected_point = u_matrix * vec4(a_globe_anchor + displacement, 1);\n#else\n vec4 offsetProjected_point = u_matrix * vec4(tile_anchor + vec2(1, 0), 0, 1);\n#endif\n vec2 a = projected_point.xy / projected_point.w;\n vec2 b = offsetProjected_point.xy / offsetProjected_point.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n#ifdef PROJECTION_GLOBE_VIEW\n vec3 proj_pos = mix_globe_mercator(a_projected_pos.xyz + h, mercator_pos, u_zoom_transition);\n vec4 projected_pos = u_label_plane_matrix * vec4(proj_pos, 1.0);\n#else\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, h.z, 1.0);\n#endif\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 float z = 0.0;\n vec2 offset = rotation_matrix * (a_offset / 32.0 * max(a_min_font_scale, font_scale) + a_pxoffset / 16.0);\n#ifdef PITCH_WITH_MAP_TERRAIN\n vec4 tile_pos = u_label_plane_matrix_inv * vec4(a_projected_pos.xy + offset, 0.0, 1.0);\n z = elevation(tile_pos.xy);\n#endif\n // Symbols might end up being behind the camera. Move them AWAY.\n float occlusion_fade = occlusionFade(projected_point) * globe_occlusion_fade;\n#ifdef PROJECTION_GLOBE_VIEW\n // Map aligned labels in globe view are aligned to the surface of the globe\n vec3 xAxis = u_pitch_with_map ? normalize(cross(a_globe_normal, u_up_vector)) : vec3(1, 0, 0);\n vec3 yAxis = u_pitch_with_map ? normalize(cross(a_globe_normal, xAxis)) : vec3(0, 1, 0);\n\n gl_Position = mix(u_coord_matrix * vec4(projected_pos.xyz / projected_pos.w + xAxis * offset.x + yAxis * offset.y, 1.0), AWAY, float(projected_point.w <= 0.0 || occlusion_fade == 0.0));\n#else\n gl_Position = mix(u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + offset, z, 1.0), AWAY, float(projected_point.w <= 0.0 || occlusion_fade == 0.0));\n#endif\n\n float projection_transition_fade = 1.0;\n#if defined(PROJECTED_POS_ON_VIEWPORT) && defined(PROJECTION_GLOBE_VIEW)\n projection_transition_fade = 1.0 - step(EPSILON, u_zoom_transition);\n#endif\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(occlusion_fade, fade_opacity[0] + fade_change)) * projection_transition_fade;\n}\n"; + +var symbolSDFFrag = "#define SDF_PX 8.0\n\nuniform bool u_is_halo;\nuniform sampler2D u_texture;\nuniform highp float u_gamma_scale;\nuniform lowp float u_device_pixel_ratio;\nuniform bool u_is_text;\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\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\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 float EDGE_GAMMA = 0.105 / u_device_pixel_ratio;\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"; + +var symbolSDFVert = "attribute vec4 a_pos_offset;\nattribute vec4 a_tex_size;\nattribute vec4 a_pixeloffset;\nattribute vec4 a_projected_pos;\nattribute float a_fade_opacity;\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_globe_anchor;\nattribute vec3 a_globe_normal;\n#endif\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\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_coord_matrix;\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform highp float u_camera_to_center_distance;\nuniform float u_fade_change;\nuniform vec2 u_texsize;\nuniform vec3 u_up_vector;\n\n#ifdef PROJECTION_GLOBE_VIEW\nuniform vec3 u_tile_id;\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_camera_forward;\nuniform float u_zoom_transition;\nuniform vec3 u_ecef_origin;\nuniform mat4 u_tile_matrix;\n#endif\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\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\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_tex_size.xy;\n vec2 a_size = a_tex_size.zw;\n\n float a_size_min = floor(a_size[0] * 0.5);\n vec2 a_pxoffset = a_pixeloffset.xy;\n\n highp float segment_angle = -a_projected_pos[3];\n float size;\n\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size_min, a_size[1], u_size_t) / 128.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size_min / 128.0;\n } else {\n size = u_size;\n }\n\n vec2 tile_anchor = a_pos;\n vec3 h = elevationVector(tile_anchor) * elevation(tile_anchor);\n\n#ifdef PROJECTION_GLOBE_VIEW\n vec3 mercator_pos = mercator_tile_position(u_inv_rot_matrix, tile_anchor, u_tile_id, u_merc_center);\n vec3 world_pos = mix_globe_mercator(a_globe_anchor + h, mercator_pos, u_zoom_transition);\n\n vec4 ecef_point = u_tile_matrix * vec4(world_pos, 1.0);\n vec3 origin_to_point = ecef_point.xyz - u_ecef_origin;\n\n // Occlude symbols that are on the non-visible side of the globe sphere\n float globe_occlusion_fade = dot(origin_to_point, u_camera_forward) >= 0.0 ? 0.0 : 1.0;\n#else\n vec3 world_pos = vec3(tile_anchor, 0) + h;\n float globe_occlusion_fade = 1.0;\n#endif\n\n vec4 projected_point = u_matrix * vec4(world_pos, 1);\n\n highp float camera_to_anchor_distance = projected_point.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 = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 1.5);\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#ifdef PROJECTION_GLOBE_VIEW\n // Use x-axis of the label plane for displacement (x_axis = cross(normal, vec3(0, -1, 0)))\n vec3 displacement = vec3(a_globe_normal.z, 0, -a_globe_normal.x);\n vec4 offsetprojected_point = u_matrix * vec4(a_globe_anchor + displacement, 1);\n#else\n vec4 offsetprojected_point = u_matrix * vec4(tile_anchor + vec2(1, 0), 0, 1);\n#endif\n vec2 a = projected_point.xy / projected_point.w;\n vec2 b = offsetprojected_point.xy / offsetprojected_point.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n#ifdef PROJECTION_GLOBE_VIEW\n vec3 proj_pos = mix_globe_mercator(a_projected_pos.xyz + h, mercator_pos, u_zoom_transition);\n vec4 projected_pos = u_label_plane_matrix * vec4(proj_pos, 1.0);\n#else\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, h.z, 1.0);\n#endif\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 float z = 0.0;\n vec2 offset = rotation_matrix * (a_offset / 32.0 * fontScale + a_pxoffset);\n#ifdef PITCH_WITH_MAP_TERRAIN\n vec4 tile_pos = u_label_plane_matrix_inv * vec4(a_projected_pos.xy + offset, 0.0, 1.0);\n z = elevation(tile_pos.xy);\n#endif\n // Symbols might end up being behind the camera. Move them AWAY.\n float occlusion_fade = occlusionFade(projected_point) * globe_occlusion_fade;\n#ifdef PROJECTION_GLOBE_VIEW\n // Map aligned labels in globe view are aligned to the surface of the globe\n vec3 xAxis = u_pitch_with_map ? normalize(cross(a_globe_normal, u_up_vector)) : vec3(1, 0, 0);\n vec3 yAxis = u_pitch_with_map ? normalize(cross(a_globe_normal, xAxis)) : vec3(0, 1, 0);\n\n gl_Position = mix(u_coord_matrix * vec4(projected_pos.xyz / projected_pos.w + xAxis * offset.x + yAxis * offset.y, 1.0), AWAY, float(projected_point.w <= 0.0 || occlusion_fade == 0.0));\n#else\n gl_Position = mix(u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + offset, z, 1.0), AWAY, float(projected_point.w <= 0.0 || occlusion_fade == 0.0));\n#endif\n float gamma_scale = gl_Position.w;\n\n float projection_transition_fade = 1.0;\n#if defined(PROJECTED_POS_ON_VIEWPORT) && defined(PROJECTION_GLOBE_VIEW)\n projection_transition_fade = 1.0 - step(EPSILON, u_zoom_transition);\n#endif\n\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(occlusion_fade, fade_opacity[0] + fade_change));\n\n v_data0 = a_tex / u_texsize;\n v_data1 = vec3(gamma_scale, size, interpolated_fade_opacity * projection_transition_fade);\n}\n"; + +var symbolTextAndIconFrag = "#define SDF_PX 8.0\n\n#define SDF 1.0\n#define ICON 0.0\n\nuniform bool u_is_halo;\nuniform sampler2D u_texture;\nuniform sampler2D u_texture_icon;\nuniform highp float u_gamma_scale;\nuniform lowp float u_device_pixel_ratio;\n\nvarying vec4 v_data0;\nvarying vec4 v_data1;\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\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 float fade_opacity = v_data1[2];\n\n if (v_data1.w == ICON) {\n vec2 tex_icon = v_data0.zw;\n lowp float alpha = opacity * fade_opacity;\n gl_FragColor = texture2D(u_texture_icon, tex_icon) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n return;\n }\n\n vec2 tex = v_data0.xy;\n\n float EDGE_GAMMA = 0.105 / u_device_pixel_ratio;\n\n float gamma_scale = v_data1.x;\n float size = v_data1.y;\n\n float fontScale = size / 24.0;\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"; + +var symbolTextAndIconVert = "attribute vec4 a_pos_offset;\nattribute vec4 a_tex_size;\nattribute vec4 a_projected_pos;\nattribute float a_fade_opacity;\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_globe_anchor;\nattribute vec3 a_globe_normal;\n#endif\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\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_coord_matrix;\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform highp float u_camera_to_center_distance;\nuniform float u_fade_change;\nuniform vec2 u_texsize;\nuniform vec3 u_up_vector;\nuniform vec2 u_texsize_icon;\n\n#ifdef PROJECTION_GLOBE_VIEW\nuniform vec3 u_tile_id;\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_camera_forward;\nuniform float u_zoom_transition;\nuniform vec3 u_ecef_origin;\nuniform mat4 u_tile_matrix;\n#endif\n\nvarying vec4 v_data0;\nvarying vec4 v_data1;\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\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_tex_size.xy;\n vec2 a_size = a_tex_size.zw;\n\n float a_size_min = floor(a_size[0] * 0.5);\n float is_sdf = a_size[0] - 2.0 * a_size_min;\n\n highp float segment_angle = -a_projected_pos[3];\n float size;\n\n if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = mix(a_size_min, a_size[1], u_size_t) / 128.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size_min / 128.0;\n } else {\n size = u_size;\n }\n\n vec2 tile_anchor = a_pos;\n vec3 h = elevationVector(tile_anchor) * elevation(tile_anchor);\n\n#ifdef PROJECTION_GLOBE_VIEW\n vec3 mercator_pos = mercator_tile_position(u_inv_rot_matrix, tile_anchor, u_tile_id, u_merc_center);\n vec3 world_pos = mix_globe_mercator(a_globe_anchor + h, mercator_pos, u_zoom_transition);\n\n vec4 ecef_point = u_tile_matrix * vec4(world_pos, 1.0);\n vec3 origin_to_point = ecef_point.xyz - u_ecef_origin;\n\n // Occlude symbols that are on the non-visible side of the globe sphere\n float globe_occlusion_fade = dot(origin_to_point, u_camera_forward) >= 0.0 ? 0.0 : 1.0;\n#else\n vec3 world_pos = vec3(tile_anchor, 0) + h;\n float globe_occlusion_fade = 1.0;\n#endif\n\n vec4 projected_point = u_matrix * vec4(world_pos, 1);\n\n highp float camera_to_anchor_distance = projected_point.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 = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 1.5);\n\n size *= perspective_ratio;\n\n float font_scale = size / 24.0;\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 offset_projected_point = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n vec2 a = projected_point.xy / projected_point.w;\n vec2 b = offset_projected_point.xy / offset_projected_point.w;\n\n symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n }\n\n#ifdef PROJECTION_GLOBE_VIEW\n vec3 proj_pos = mix_globe_mercator(a_projected_pos.xyz + h, mercator_pos, u_zoom_transition);\n vec4 projected_pos = u_label_plane_matrix * vec4(proj_pos, 1.0);\n#else\n vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, h.z, 1.0);\n#endif\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 float z = 0.0;\n vec2 offset = rotation_matrix * (a_offset / 32.0 * font_scale);\n#ifdef PITCH_WITH_MAP_TERRAIN\n vec4 tile_pos = u_label_plane_matrix_inv * vec4(a_projected_pos.xy + offset, 0.0, 1.0);\n z = elevation(tile_pos.xy);\n#endif\n float occlusion_fade = occlusionFade(projected_point) * globe_occlusion_fade;\n#ifdef PROJECTION_GLOBE_VIEW\n // Map aligned labels in globe view are aligned to the surface of the globe\n vec3 xAxis = u_pitch_with_map ? normalize(cross(a_globe_normal, u_up_vector)) : vec3(1, 0, 0);\n vec3 yAxis = u_pitch_with_map ? normalize(cross(a_globe_normal, xAxis)) : vec3(0, 1, 0);\n\n gl_Position = mix(u_coord_matrix * vec4(projected_pos.xyz / projected_pos.w + xAxis * offset.x + yAxis * offset.y, 1.0), AWAY, float(projected_point.w <= 0.0 || occlusion_fade == 0.0));\n#else\n gl_Position = mix(u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + offset, z, 1.0), AWAY, float(projected_point.w <= 0.0 || occlusion_fade == 0.0));\n#endif\n float gamma_scale = gl_Position.w;\n\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(occlusion_fade, fade_opacity[0] + fade_change));\n\n float projection_transition_fade = 1.0;\n#if defined(PROJECTED_POS_ON_VIEWPORT) && defined(PROJECTION_GLOBE_VIEW)\n projection_transition_fade = 1.0 - step(EPSILON, u_zoom_transition);\n#endif\n\n v_data0.xy = a_tex / u_texsize;\n v_data0.zw = a_tex / u_texsize_icon;\n v_data1 = vec4(gamma_scale, size, interpolated_fade_opacity * projection_transition_fade, is_sdf);\n}\n"; + +var skyboxFrag = "// [1] Banding in games http://loopit.dk/banding_in_games.pdf\n\nvarying lowp vec3 v_uv;\n\nuniform lowp samplerCube u_cubemap;\nuniform lowp float u_opacity;\nuniform highp float u_temporal_offset;\nuniform highp vec3 u_sun_direction;\n\nfloat sun_disk(highp vec3 ray_direction, highp vec3 sun_direction) {\n highp float cos_angle = dot(normalize(ray_direction), sun_direction);\n\n // Sun angular angle is ~0.5°\n const highp float cos_sun_angular_diameter = 0.99996192306;\n const highp float smoothstep_delta = 1e-5;\n\n return smoothstep(\n cos_sun_angular_diameter - smoothstep_delta,\n cos_sun_angular_diameter + smoothstep_delta,\n cos_angle);\n}\n\nfloat map(float value, float start, float end, float new_start, float new_end) {\n return ((value - start) * (new_end - new_start)) / (end - start) + new_start;\n}\n\nvoid main() {\n vec3 uv = v_uv;\n\n // Add a small offset to prevent black bands around areas where\n // the scattering algorithm does not manage to gather lighting\n const float y_bias = 0.015;\n uv.y += y_bias;\n\n // Inverse of the operation applied for non-linear UV parameterization\n uv.y = pow(abs(uv.y), 1.0 / 5.0);\n\n // To make better utilization of the visible range (e.g. over the horizon, UVs\n // from 0.0 to 1.0 on the Y-axis in cubemap space), the UV range is remapped from\n // (0.0,1.0) to (-1.0,1.0) on y. The inverse operation is applied when generating.\n uv.y = map(uv.y, 0.0, 1.0, -1.0, 1.0);\n\n vec3 sky_color = textureCube(u_cubemap, uv).rgb;\n\n#ifdef FOG\n // Apply fog contribution if enabled\n // Swizzle to put z-up (ignoring x-y mirror since fog does not depend on azimuth)\n sky_color = fog_apply_sky_gradient(v_uv.xzy, sky_color);\n#endif\n\n // Dither [1]\n sky_color.rgb = dither(sky_color.rgb, gl_FragCoord.xy + u_temporal_offset);\n // Add sun disk\n sky_color += 0.1 * sun_disk(v_uv, u_sun_direction);\n\n gl_FragColor = vec4(sky_color * u_opacity, u_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; -const PACKED_HIDDEN_OPACITY = 0; +var skyboxGradientFrag = "varying highp vec3 v_uv;\n\nuniform lowp sampler2D u_color_ramp;\nuniform highp vec3 u_center_direction;\nuniform lowp float u_radius;\nuniform lowp float u_opacity;\nuniform highp float u_temporal_offset;\n\nvoid main() {\n float progress = acos(dot(normalize(v_uv), u_center_direction)) / u_radius;\n vec4 color = texture2D(u_color_ramp, vec2(progress, 0.5));\n\n#ifdef FOG\n // Apply fog contribution if enabled, make sure to un/post multiply alpha before/after\n // applying sky gradient contribution, as color ramps are premultiplied-alpha colors.\n // Swizzle to put z-up (ignoring x-y mirror since fog does not depend on azimuth)\n color.rgb = fog_apply_sky_gradient(v_uv.xzy, color.rgb / color.a) * color.a;\n#endif\n\n color *= u_opacity;\n\n // Dither\n color.rgb = dither(color.rgb, gl_FragCoord.xy + u_temporal_offset);\n\n gl_FragColor = color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; -// +var skyboxVert = "attribute highp vec3 a_pos_3f;\n\nuniform lowp mat4 u_matrix;\n\nvarying highp vec3 v_uv;\n\nvoid main() {\n const mat3 half_neg_pi_around_x = mat3(1.0, 0.0, 0.0,\n 0.0, 0.0, -1.0,\n 0.0, 1.0, 0.0);\n\n v_uv = half_neg_pi_around_x * a_pos_3f;\n vec4 pos = u_matrix * vec4(a_pos_3f, 1.0);\n\n // Enforce depth to be 1.0\n gl_Position = pos.xyww;\n}\n"; - - - - - - +var terrainRasterFrag = "uniform sampler2D u_image0;\nvarying vec2 v_pos0;\n\n#ifdef FOG\nvarying float v_fog_opacity;\n#endif\n\nvoid main() {\n vec4 color = texture2D(u_image0, v_pos0);\n#ifdef FOG\n color = fog_dither(fog_apply_from_vert(color, v_fog_opacity));\n#endif\n gl_FragColor = color;\n#ifdef TERRAIN_WIREFRAME\n gl_FragColor = vec4(1.0, 0.0, 0.0, 0.8);\n#endif\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; -class LayerPlacement { - - - - - +var terrainRasterVert = "uniform mat4 u_matrix;\nuniform float u_skirt_height;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\n\n#ifdef FOG\nvarying float v_fog_opacity;\n#endif\n\nconst float skirtOffset = 24575.0;\nconst float wireframeOffset = 0.00015;\n\nvoid main() {\n v_pos0 = a_texture_pos / 8192.0;\n float skirt = float(a_pos.x >= skirtOffset);\n float elevation = elevation(a_texture_pos) - skirt * u_skirt_height;\n#ifdef TERRAIN_WIREFRAME\n elevation += u_skirt_height * u_skirt_height * wireframeOffset;\n#endif\n vec2 decodedPos = a_pos - vec2(skirt * skirtOffset, 0.0);\n gl_Position = u_matrix * vec4(decodedPos, elevation, 1.0);\n\n#ifdef FOG\n v_fog_opacity = fog(fog_position(vec3(decodedPos, elevation)));\n#endif\n}\n"; - constructor(styleLayer ) { - this._sortAcrossTiles = styleLayer.layout.get('symbol-z-order') !== 'viewport-y' && - styleLayer.layout.get('symbol-sort-key').constantOr(1) !== undefined; +var terrainDepthFrag = "#ifdef GL_ES\nprecision highp float;\n#endif\n\nvarying float v_depth;\n\nvoid main() {\n gl_FragColor = pack_depth(v_depth);\n}\n"; - this._currentTileIndex = 0; - this._currentPartIndex = 0; - this._seenCrossTileIDs = {}; - this._bucketParts = []; - } +var terrainDepthVert = "uniform mat4 u_matrix;\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying float v_depth;\n\nvoid main() {\n float elevation = elevation(a_texture_pos);\n gl_Position = u_matrix * vec4(a_pos, elevation, 1.0);\n v_depth = gl_Position.z / gl_Position.w;\n}"; - continuePlacement(tiles , placement , showCollisionBoxes , styleLayer , shouldPausePlacement ) { - const bucketParts = this._bucketParts; +var preludeTerrainVert = "// Also declared in data/bucket/fill_extrusion_bucket.js\n#define ELEVATION_SCALE 7.0\n#define ELEVATION_OFFSET 450.0\n\n#ifdef PROJECTION_GLOBE_VIEW\n\nuniform vec3 u_tile_tl_up;\nuniform vec3 u_tile_tr_up;\nuniform vec3 u_tile_br_up;\nuniform vec3 u_tile_bl_up;\nuniform float u_tile_up_scale;\nvec3 elevationVector(vec2 pos) {\n vec2 uv = pos / EXTENT;\n vec3 up = normalize(mix(\n mix(u_tile_tl_up, u_tile_tr_up, uv.xxx),\n mix(u_tile_bl_up, u_tile_br_up, uv.xxx),\n uv.yyy));\n return up * u_tile_up_scale;\n}\n\n#else\n\nvec3 elevationVector(vec2 pos) { return vec3(0, 0, 1); }\n\n#endif\n\n#ifdef TERRAIN\n\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\nuniform highp sampler2D u_dem;\nuniform highp sampler2D u_dem_prev;\n#else\nuniform sampler2D u_dem;\nuniform sampler2D u_dem_prev;\n#endif\nuniform vec4 u_dem_unpack;\nuniform vec2 u_dem_tl;\nuniform vec2 u_dem_tl_prev;\nuniform float u_dem_scale;\nuniform float u_dem_scale_prev;\nuniform float u_dem_size;\nuniform float u_dem_lerp;\nuniform float u_exaggeration;\nuniform float u_meter_to_dem;\nuniform mat4 u_label_plane_matrix_inv;\n\nuniform sampler2D u_depth;\nuniform vec2 u_depth_size_inv;\n\nvec4 tileUvToDemSample(vec2 uv, float dem_size, float dem_scale, vec2 dem_tl) {\n vec2 pos = dem_size * (uv * dem_scale + dem_tl) + 1.0;\n vec2 f = fract(pos);\n return vec4((pos - f + 0.5) / (dem_size + 2.0), f);\n}\n\nfloat decodeElevation(vec4 v) {\n return dot(vec4(v.xyz * 255.0, -1.0), u_dem_unpack);\n}\n\nfloat currentElevation(vec2 apos) {\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\n vec2 pos = (u_dem_size * (apos / 8192.0 * u_dem_scale + u_dem_tl) + 1.5) / (u_dem_size + 2.0);\n return u_exaggeration * texture2D(u_dem, pos).a;\n#else\n float dd = 1.0 / (u_dem_size + 2.0);\n vec4 r = tileUvToDemSample(apos / 8192.0, u_dem_size, u_dem_scale, u_dem_tl);\n vec2 pos = r.xy;\n vec2 f = r.zw;\n\n float tl = decodeElevation(texture2D(u_dem, pos));\n#ifdef TERRAIN_DEM_NEAREST_FILTER\n return u_exaggeration * tl;\n#endif\n float tr = decodeElevation(texture2D(u_dem, pos + vec2(dd, 0.0)));\n float bl = decodeElevation(texture2D(u_dem, pos + vec2(0.0, dd)));\n float br = decodeElevation(texture2D(u_dem, pos + vec2(dd, dd)));\n\n return u_exaggeration * mix(mix(tl, tr, f.x), mix(bl, br, f.x), f.y);\n#endif\n}\n\nfloat prevElevation(vec2 apos) {\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\n vec2 pos = (u_dem_size * (apos / 8192.0 * u_dem_scale_prev + u_dem_tl_prev) + 1.5) / (u_dem_size + 2.0);\n return u_exaggeration * texture2D(u_dem_prev, pos).a;\n#else\n float dd = 1.0 / (u_dem_size + 2.0);\n vec4 r = tileUvToDemSample(apos / 8192.0, u_dem_size, u_dem_scale_prev, u_dem_tl_prev);\n vec2 pos = r.xy;\n vec2 f = r.zw;\n\n float tl = decodeElevation(texture2D(u_dem_prev, pos));\n float tr = decodeElevation(texture2D(u_dem_prev, pos + vec2(dd, 0.0)));\n float bl = decodeElevation(texture2D(u_dem_prev, pos + vec2(0.0, dd)));\n float br = decodeElevation(texture2D(u_dem_prev, pos + vec2(dd, dd)));\n\n return u_exaggeration * mix(mix(tl, tr, f.x), mix(bl, br, f.x), f.y);\n#endif\n}\n\n#ifdef TERRAIN_VERTEX_MORPHING\nfloat elevation(vec2 apos) {\n float nextElevation = currentElevation(apos);\n float prevElevation = prevElevation(apos);\n return mix(prevElevation, nextElevation, u_dem_lerp);\n}\n#else\nfloat elevation(vec2 apos) {\n return currentElevation(apos);\n}\n#endif\n\n// Unpack depth from RGBA. A piece of code copied in various libraries and WebGL\n// shadow mapping examples.\nfloat unpack_depth(vec4 rgba_depth)\n{\n const vec4 bit_shift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n return dot(rgba_depth, bit_shift) * 2.0 - 1.0;\n}\n\nbool isOccluded(vec4 frag) {\n vec3 coord = frag.xyz / frag.w;\n float depth = unpack_depth(texture2D(u_depth, (coord.xy + 1.0) * 0.5));\n return coord.z > depth + 0.0005;\n}\n\nfloat occlusionFade(vec4 frag) {\n vec3 coord = frag.xyz / frag.w;\n\n vec3 df = vec3(5.0 * u_depth_size_inv, 0.0);\n vec2 uv = 0.5 * coord.xy + 0.5;\n vec4 depth = vec4(\n unpack_depth(texture2D(u_depth, uv - df.xz)),\n unpack_depth(texture2D(u_depth, uv + df.xz)),\n unpack_depth(texture2D(u_depth, uv - df.zy)),\n unpack_depth(texture2D(u_depth, uv + df.zy))\n );\n return dot(vec4(0.25), vec4(1.0) - clamp(300.0 * (vec4(coord.z - 0.001) - depth), 0.0, 1.0));\n}\n\n // BEGIN: code for fill-extrusion height offseting\n // When making changes here please also update associated JS ports in src/style/style_layer/fill-extrusion-style-layer.js\n // This is so that rendering changes are reflected on CPU side for feature querying.\n\nvec4 fourSample(vec2 pos, vec2 off) {\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\n float tl = texture2D(u_dem, pos).a;\n float tr = texture2D(u_dem, pos + vec2(off.x, 0.0)).a;\n float bl = texture2D(u_dem, pos + vec2(0.0, off.y)).a;\n float br = texture2D(u_dem, pos + off).a;\n#else\n vec4 demtl = vec4(texture2D(u_dem, pos).xyz * 255.0, -1.0);\n float tl = dot(demtl, u_dem_unpack);\n vec4 demtr = vec4(texture2D(u_dem, pos + vec2(off.x, 0.0)).xyz * 255.0, -1.0);\n float tr = dot(demtr, u_dem_unpack);\n vec4 dembl = vec4(texture2D(u_dem, pos + vec2(0.0, off.y)).xyz * 255.0, -1.0);\n float bl = dot(dembl, u_dem_unpack);\n vec4 dembr = vec4(texture2D(u_dem, pos + off).xyz * 255.0, -1.0);\n float br = dot(dembr, u_dem_unpack);\n#endif\n return vec4(tl, tr, bl, br);\n}\n\nfloat flatElevation(vec2 pack) {\n vec2 apos = floor(pack / 8.0);\n vec2 span = 10.0 * (pack - apos * 8.0);\n\n vec2 uvTex = (apos - vec2(1.0, 1.0)) / 8190.0;\n float size = u_dem_size + 2.0;\n float dd = 1.0 / size;\n\n vec2 pos = u_dem_size * (uvTex * u_dem_scale + u_dem_tl) + 1.0;\n vec2 f = fract(pos);\n pos = (pos - f + 0.5) * dd;\n\n // Get elevation of centroid.\n vec4 h = fourSample(pos, vec2(dd));\n float z = mix(mix(h.x, h.y, f.x), mix(h.z, h.w, f.x), f.y);\n\n vec2 w = floor(0.5 * (span * u_meter_to_dem - 1.0));\n vec2 d = dd * w;\n vec4 bounds = vec4(d, vec2(1.0) - d);\n\n // Get building wide sample, to get better slope estimate.\n h = fourSample(pos - d, 2.0 * d + vec2(dd));\n\n vec4 diff = abs(h.xzxy - h.ywzw);\n vec2 slope = min(vec2(0.25), u_meter_to_dem * 0.5 * (diff.xz + diff.yw) / (2.0 * w + vec2(1.0)));\n vec2 fix = slope * span;\n float base = z + max(fix.x, fix.y);\n return u_exaggeration * base;\n}\n\nfloat elevationFromUint16(float word) {\n return u_exaggeration * (word / ELEVATION_SCALE - ELEVATION_OFFSET);\n}\n\n// END: code for fill-extrusion height offseting\n\n#else\n\nfloat elevation(vec2 pos) { return 0.0; }\nbool isOccluded(vec4 frag) { return false; }\nfloat occlusionFade(vec4 frag) { return 1.0; }\n\n#endif\n"; - while (this._currentTileIndex < tiles.length) { - const tile = tiles[this._currentTileIndex]; - placement.getBucketParts(bucketParts, styleLayer, tile, this._sortAcrossTiles); +var preludeFogVert = "#ifdef FOG\n\nuniform mediump vec4 u_fog_color;\nuniform mediump vec2 u_fog_range;\nuniform mediump float u_fog_horizon_blend;\nuniform mediump mat4 u_fog_matrix;\nvarying vec3 v_fog_pos;\n\nfloat fog_range(float depth) {\n // Map [near, far] to [0, 1] without clamping\n return (depth - u_fog_range[0]) / (u_fog_range[1] - u_fog_range[0]);\n}\n\n// Assumes z up and camera_dir *normalized* (to avoid computing\n// its length multiple times for different functions).\nfloat fog_horizon_blending(vec3 camera_dir) {\n float t = max(0.0, camera_dir.z / u_fog_horizon_blend);\n // Factor of 3 chosen to roughly match smoothstep.\n // See: https://www.desmos.com/calculator/pub31lvshf\n return u_fog_color.a * exp(-3.0 * t * t);\n}\n\n// Compute a ramp for fog opacity\n// - t: depth, rescaled to 0 at fogStart and 1 at fogEnd\n// See: https://www.desmos.com/calculator/3taufutxid\nfloat fog_opacity(float t) {\n const float decay = 6.0;\n float falloff = 1.0 - min(1.0, exp(-decay * t));\n\n // Cube without pow() to smooth the onset\n falloff *= falloff * falloff;\n\n // Scale and clip to 1 at the far limit\n return u_fog_color.a * min(1.0, 1.00747 * falloff);\n}\n\nvec3 fog_position(vec3 pos) {\n // The following function requires that u_fog_matrix be affine and\n // results in a vector with w = 1. Otherwise we must divide by w.\n return (u_fog_matrix * vec4(pos, 1.0)).xyz;\n}\n\nvec3 fog_position(vec2 pos) {\n return fog_position(vec3(pos, 0.0));\n}\n\nfloat fog(vec3 pos) {\n float depth = length(pos);\n float opacity = fog_opacity(fog_range(depth));\n return opacity * fog_horizon_blending(pos / depth);\n}\n\n#endif\n"; - this._currentTileIndex++; - if (shouldPausePlacement()) { - return true; - } - } +var preludeFogFrag = "#ifdef FOG\n\nuniform mediump vec4 u_fog_color;\nuniform mediump vec2 u_fog_range;\nuniform mediump float u_fog_horizon_blend;\nuniform mediump float u_fog_temporal_offset;\nvarying vec3 v_fog_pos;\n\nuniform highp vec3 u_frustum_tl;\nuniform highp vec3 u_frustum_tr;\nuniform highp vec3 u_frustum_br;\nuniform highp vec3 u_frustum_bl;\nuniform highp vec3 u_globe_pos;\nuniform highp float u_globe_radius;\nuniform highp vec2 u_viewport;\nuniform float u_globe_transition;\nuniform int u_is_globe;\n\nfloat fog_range(float depth) {\n // Map [near, far] to [0, 1] without clamping\n return (depth - u_fog_range[0]) / (u_fog_range[1] - u_fog_range[0]);\n}\n\n// Assumes z up and camera_dir *normalized* (to avoid computing\n// its length multiple times for different functions).\nfloat fog_horizon_blending(vec3 camera_dir) {\n float t = max(0.0, camera_dir.z / u_fog_horizon_blend);\n // Factor of 3 chosen to roughly match smoothstep.\n // See: https://www.desmos.com/calculator/pub31lvshf\n return u_fog_color.a * exp(-3.0 * t * t);\n}\n\n// Compute a ramp for fog opacity\n// - t: depth, rescaled to 0 at fogStart and 1 at fogEnd\n// See: https://www.desmos.com/calculator/3taufutxid\nfloat fog_opacity(float t) {\n const float decay = 6.0;\n float falloff = 1.0 - min(1.0, exp(-decay * t));\n\n // Cube without pow() to smooth the onset\n falloff *= falloff * falloff;\n\n // Scale and clip to 1 at the far limit\n return u_fog_color.a * min(1.0, 1.00747 * falloff);\n}\n\nfloat globe_glow_progress() {\n highp vec2 uv = gl_FragCoord.xy / u_viewport;\n highp vec3 ray_dir = mix(\n mix(u_frustum_tl, u_frustum_tr, uv.x),\n mix(u_frustum_bl, u_frustum_br, uv.x),\n 1.0 - uv.y);\n highp vec3 dir = normalize(ray_dir);\n highp vec3 closest_point = dot(u_globe_pos, dir) * dir;\n highp float sdf = length(closest_point - u_globe_pos) / u_globe_radius;\n return sdf + PI * 0.5;\n}\n\n// This function is only used in rare places like heatmap where opacity is used\n// directly, outside the normal fog_apply method.\nfloat fog_opacity(vec3 pos) {\n float depth = length(pos);\n return fog_opacity(fog_range(depth));\n}\n\nvec3 fog_apply(vec3 color, vec3 pos) {\n float depth = length(pos);\n float opacity;\n if (u_is_globe == 1) {\n float glow_progress = globe_glow_progress();\n float t = mix(glow_progress, depth, u_globe_transition);\n opacity = fog_opacity(fog_range(t));\n } else {\n opacity = fog_opacity(fog_range(depth));\n opacity *= fog_horizon_blending(pos / depth);\n }\n return mix(color, u_fog_color.rgb, opacity);\n}\n\n// Apply fog computed in the vertex shader\nvec4 fog_apply_from_vert(vec4 color, float fog_opac) {\n float alpha = EPSILON + color.a;\n color.rgb = mix(color.rgb / alpha, u_fog_color.rgb, fog_opac) * alpha;\n return color;\n}\n\n// Assumes z up\nvec3 fog_apply_sky_gradient(vec3 camera_ray, vec3 sky_color) {\n float horizon_blend = fog_horizon_blending(normalize(camera_ray));\n return mix(sky_color, u_fog_color.rgb, horizon_blend);\n}\n\n// Un-premultiply the alpha, then blend fog, then re-premultiply alpha.\n// For use with colors using premultiplied alpha\nvec4 fog_apply_premultiplied(vec4 color, vec3 pos) {\n float alpha = EPSILON + color.a;\n color.rgb = fog_apply(color.rgb / alpha, pos) * alpha;\n return color;\n}\n\nvec3 fog_dither(vec3 color) {\n vec2 dither_seed = gl_FragCoord.xy + u_fog_temporal_offset;\n return dither(color, dither_seed);\n}\n\nvec4 fog_dither(vec4 color) {\n return vec4(fog_dither(color.rgb), color.a);\n}\n\n#endif\n"; - if (this._sortAcrossTiles) { - this._sortAcrossTiles = false; - bucketParts.sort((a, b) => ((a.sortKey ) ) - ((b.sortKey ) )); - } +var skyboxCaptureFrag = "// [1] Precomputed Atmospheric Scattering: https://hal.inria.fr/inria-00288758/document\n// [2] Earth Fact Sheet https://nssdc.gsfc.nasa.gov/planetary/factsheet/earthfact.html\n// [3] Tonemapping Operators http://filmicworlds.com/blog/filmic-tonemapping-operators\n\nvarying highp vec3 v_position;\n\nuniform highp float u_sun_intensity;\nuniform highp float u_luminance;\nuniform lowp vec3 u_sun_direction;\nuniform highp vec4 u_color_tint_r;\nuniform highp vec4 u_color_tint_m;\n\n#ifdef GL_ES\nprecision highp float;\n#endif\n\n// [1] equation (1) section 2.1. for λ = (680, 550, 440) nm,\n// which corresponds to scattering coefficients at sea level\n#define BETA_R vec3(5.5e-6, 13.0e-6, 22.4e-6)\n// The following constants are from [1] Figure 6 and section 2.1\n#define BETA_M vec3(21e-6, 21e-6, 21e-6)\n#define MIE_G 0.76\n#define DENSITY_HEIGHT_SCALE_R 8000.0 // m\n#define DENSITY_HEIGHT_SCALE_M 1200.0 // m\n// [1] and [2] section 2.1\n#define PLANET_RADIUS 6360e3 // m\n#define ATMOSPHERE_RADIUS 6420e3 // m\n#define SAMPLE_STEPS 10\n#define DENSITY_STEPS 4\n\nfloat ray_sphere_exit(vec3 orig, vec3 dir, float radius) {\n float a = dot(dir, dir);\n float b = 2.0 * dot(dir, orig);\n float c = dot(orig, orig) - radius * radius;\n float d = sqrt(b * b - 4.0 * a * c);\n return (-b + d) / (2.0 * a);\n}\n\nvec3 extinction(vec2 density) {\n return exp(-vec3(BETA_R * u_color_tint_r.a * density.x + BETA_M * u_color_tint_m.a * density.y));\n}\n\nvec2 local_density(vec3 point) {\n float height = max(length(point) - PLANET_RADIUS, 0.0);\n // Explicitly split in two shader statements, exp(vec2)\n // did not behave correctly on specific arm mali arch.\n float exp_r = exp(-height / DENSITY_HEIGHT_SCALE_R);\n float exp_m = exp(-height / DENSITY_HEIGHT_SCALE_M);\n return vec2(exp_r, exp_m);\n}\n\nfloat phase_ray(float cos_angle) {\n return (3.0 / (16.0 * PI)) * (1.0 + cos_angle * cos_angle);\n}\n\nfloat phase_mie(float cos_angle) {\n return (3.0 / (8.0 * PI)) * ((1.0 - MIE_G * MIE_G) * (1.0 + cos_angle * cos_angle)) /\n ((2.0 + MIE_G * MIE_G) * pow(1.0 + MIE_G * MIE_G - 2.0 * MIE_G * cos_angle, 1.5));\n}\n\nvec2 density_to_atmosphere(vec3 point, vec3 light_dir) {\n float ray_len = ray_sphere_exit(point, light_dir, ATMOSPHERE_RADIUS);\n float step_len = ray_len / float(DENSITY_STEPS);\n\n vec2 density_point_to_atmosphere = vec2(0.0);\n for (int i = 0; i < DENSITY_STEPS; ++i) {\n vec3 point_on_ray = point + light_dir * ((float(i) + 0.5) * step_len);\n density_point_to_atmosphere += local_density(point_on_ray) * step_len;;\n }\n\n return density_point_to_atmosphere;\n}\n\nvec3 atmosphere(vec3 ray_dir, vec3 sun_direction, float sun_intensity) {\n vec2 density_orig_to_point = vec2(0.0);\n vec3 scatter_r = vec3(0.0);\n vec3 scatter_m = vec3(0.0);\n vec3 origin = vec3(0.0, PLANET_RADIUS, 0.0);\n\n float ray_len = ray_sphere_exit(origin, ray_dir, ATMOSPHERE_RADIUS);\n float step_len = ray_len / float(SAMPLE_STEPS);\n for (int i = 0; i < SAMPLE_STEPS; ++i) {\n vec3 point_on_ray = origin + ray_dir * ((float(i) + 0.5) * step_len);\n\n // Local density\n vec2 density = local_density(point_on_ray) * step_len;\n density_orig_to_point += density;\n\n // Density from point to atmosphere\n vec2 density_point_to_atmosphere = density_to_atmosphere(point_on_ray, sun_direction);\n\n // Scattering contribution\n vec2 density_orig_to_atmosphere = density_orig_to_point + density_point_to_atmosphere;\n vec3 extinction = extinction(density_orig_to_atmosphere);\n scatter_r += density.x * extinction;\n scatter_m += density.y * extinction;\n }\n\n // The mie and rayleigh phase functions describe how much light\n // is scattered towards the eye when colliding with particles\n float cos_angle = dot(ray_dir, sun_direction);\n float phase_r = phase_ray(cos_angle);\n float phase_m = phase_mie(cos_angle);\n\n // Apply light color adjustments\n vec3 beta_r = BETA_R * u_color_tint_r.rgb * u_color_tint_r.a;\n vec3 beta_m = BETA_M * u_color_tint_m.rgb * u_color_tint_m.a;\n\n return (scatter_r * phase_r * beta_r + scatter_m * phase_m * beta_m) * sun_intensity;\n}\n\nconst float A = 0.15;\nconst float B = 0.50;\nconst float C = 0.10;\nconst float D = 0.20;\nconst float E = 0.02;\nconst float F = 0.30;\n\nvec3 uncharted2_tonemap(vec3 x) {\n return ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F;\n}\n\nvoid main() {\n vec3 ray_direction = v_position;\n\n // Non-linear UV parameterization to increase horizon events\n ray_direction.y = pow(ray_direction.y, 5.0);\n\n // Add a small offset to prevent black bands around areas where\n // the scattering algorithm does not manage to gather lighting\n const float y_bias = 0.015;\n ray_direction.y += y_bias;\n\n vec3 color = atmosphere(normalize(ray_direction), u_sun_direction, u_sun_intensity);\n\n // Apply exposure [3]\n float white_scale = 1.0748724675633854; // 1.0 / uncharted2_tonemap(1000.0)\n color = uncharted2_tonemap((log2(2.0 / pow(u_luminance, 4.0))) * color) * white_scale;\n\n gl_FragColor = vec4(color, 1.0);\n}\n"; - while (this._currentPartIndex < bucketParts.length) { - const bucketPart = bucketParts[this._currentPartIndex]; - placement.placeLayerBucketPart(bucketPart, this._seenCrossTileIDs, showCollisionBoxes, bucketPart.symbolInstanceStart === 0); - this._currentPartIndex++; - if (shouldPausePlacement()) { - return true; - } - } - return false; - } -} +var skyboxCaptureVert = "attribute highp vec3 a_pos_3f;\n\nuniform mat3 u_matrix_3f;\n\nvarying highp vec3 v_position;\n\nfloat map(float value, float start, float end, float new_start, float new_end) {\n return ((value - start) * (new_end - new_start)) / (end - start) + new_start;\n}\n\nvoid main() {\n vec4 pos = vec4(u_matrix_3f * a_pos_3f, 1.0);\n\n v_position = pos.xyz;\n v_position.y *= -1.0;\n\n // To make better utilization of the visible range (e.g. over the horizon, UVs\n // from 0.0 to 1.0 on the Y-axis in cubemap space), the UV range is remapped from\n // (-1.0,1.0) to (0.0,1.0) on y. The inverse operation is applied when sampling.\n v_position.y = map(v_position.y, -1.0, 1.0, 0.0, 1.0);\n\n gl_Position = vec4(a_pos_3f.xy, 0.0, 1.0);\n}\n"; -class PauseablePlacement { - - - - - - +var globeFrag = "uniform sampler2D u_image0;\nvarying vec2 v_pos0;\n\n#ifndef FOG\nuniform highp vec3 u_frustum_tl;\nuniform highp vec3 u_frustum_tr;\nuniform highp vec3 u_frustum_br;\nuniform highp vec3 u_frustum_bl;\nuniform highp vec3 u_globe_pos;\nuniform highp float u_globe_radius;\nuniform vec2 u_viewport;\n#endif\n\nvoid main() {\n#ifdef CUSTOM_ANTIALIASING\n vec2 uv = gl_FragCoord.xy / u_viewport;\n\n highp vec3 ray_dir = mix(\n mix(u_frustum_tl, u_frustum_tr, uv.x),\n mix(u_frustum_bl, u_frustum_br, uv.x),\n 1.0 - uv.y);\n \n vec3 dir = normalize(ray_dir);\n\n vec3 closest_point = dot(u_globe_pos, dir) * dir;\n float norm_dist_from_center = 1.0 - length(closest_point - u_globe_pos) / u_globe_radius;\n\n const float antialias_pixel = 2.0;\n float antialias_factor = antialias_pixel * fwidth(norm_dist_from_center);\n float antialias = smoothstep(0.0, antialias_factor, norm_dist_from_center);\n\n vec4 raster = texture2D(u_image0, v_pos0);\n vec4 color = vec4(raster.rgb * antialias, raster.a * antialias);\n#else\n vec4 color = texture2D(u_image0, v_pos0);\n#endif\n#ifdef FOG\n color = fog_dither(fog_apply_premultiplied(color, v_fog_pos));\n#endif\n gl_FragColor = color;\n#ifdef TERRAIN_WIREFRAME\n gl_FragColor = vec4(1.0, 0.0, 0.0, 0.8);\n#endif\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; - constructor(transform , order , - forceFullPlacement , - showCollisionBoxes , - fadeDuration , - crossSourceCollisions , - prevPlacement , - fogState ) { +var globeVert = "uniform mat4 u_proj_matrix;\nuniform mat4 u_normalize_matrix;\nuniform mat4 u_globe_matrix;\nuniform mat4 u_merc_matrix;\nuniform float u_zoom_transition;\nuniform vec2 u_merc_center;\nuniform mat3 u_grid_matrix;\n\n#ifdef GLOBE_POLES\nattribute vec3 a_globe_pos;\nattribute vec2 a_merc_pos;\nattribute vec2 a_uv;\n#else\nattribute vec2 a_pos;\n#endif\n\nvarying vec2 v_pos0;\n\nconst float wireframeOffset = 1e3;\n\nfloat mercatorXfromLng(float lng) {\n return (180.0 + lng) / 360.0;\n}\n\nfloat mercatorYfromLat(float lat) {\n return (180.0 - (RAD_TO_DEG* log(tan(QUARTER_PI + lat / 2.0 * DEG_TO_RAD)))) / 360.0;\n}\n\nvec3 latLngToECEF(vec2 latLng) {\n latLng = DEG_TO_RAD * latLng;\n \n float cosLat = cos(latLng[0]);\n float sinLat = sin(latLng[0]);\n float cosLng = cos(latLng[1]);\n float sinLng = sin(latLng[1]);\n\n // Convert lat & lng to spherical representation. Use zoom=0 as a reference\n float sx = cosLat * sinLng * GLOBE_RADIUS;\n float sy = -sinLat * GLOBE_RADIUS;\n float sz = cosLat * cosLng * GLOBE_RADIUS;\n\n return vec3(sx, sy, sz);\n}\n\nvoid main() {\n#ifdef GLOBE_POLES\n vec3 globe_pos = a_globe_pos;\n vec2 merc_pos = a_merc_pos;\n vec2 uv = a_uv;\n#else\n // The 3rd row of u_grid_matrix is only used as a spare space to \n // pass the following 3 uniforms to avoid explicitly introducing new ones.\n float tiles = u_grid_matrix[0][2];\n float idy = u_grid_matrix[1][2];\n float S = u_grid_matrix[2][2];\n\n vec3 latLng = u_grid_matrix * vec3(a_pos, 1.0);\n\n float mercatorY = mercatorYfromLat(latLng[0]);\n float uvY = mercatorY * tiles - idy;\n \n float mercatorX = mercatorXfromLng(latLng[1]);\n float uvX = a_pos[0] * S;\n\n vec3 globe_pos = latLngToECEF(latLng.xy);\n vec2 merc_pos = vec2(mercatorX, mercatorY);\n vec2 uv = vec2(uvX, uvY);\n#endif\n\n v_pos0 = uv;\n\n uv = uv * EXTENT;\n vec4 up_vector = vec4(elevationVector(uv), 1.0);\n float height = elevation(uv);\n\n#ifdef TERRAIN_WIREFRAME\n height += wireframeOffset;\n#endif\n\n globe_pos += up_vector.xyz * height;\n\n vec4 globe = u_globe_matrix * vec4(globe_pos, 1.0);\n\n vec4 mercator = vec4(0.0);\n if (u_zoom_transition > 0.0) {\n mercator = vec4(merc_pos, height, 1.0);\n mercator.xy -= u_merc_center;\n mercator.x = wrap(mercator.x, -0.5, 0.5);\n mercator = u_merc_matrix * mercator;\n }\n\n vec3 position = mix(globe.xyz, mercator.xyz, u_zoom_transition);\n\n gl_Position = u_proj_matrix * vec4(position, 1.0);\n\n#ifdef FOG\n v_fog_pos = fog_position((u_normalize_matrix * vec4(globe_pos, 1.0)).xyz);\n#endif\n}\n"; - this.placement = new Placement(transform, fadeDuration, crossSourceCollisions, prevPlacement, fogState); - this._currentPlacementIndex = order.length - 1; - this._forceFullPlacement = forceFullPlacement; - this._showCollisionBoxes = showCollisionBoxes; - this._done = false; - } +var atmosphereFrag = "uniform float u_transition;\nuniform highp float u_fadeout_range;\nuniform highp float u_temporal_offset;\nuniform vec3 u_start_color;\nuniform vec4 u_color;\nuniform vec4 u_space_color;\nuniform vec4 u_high_color;\nuniform float u_star_intensity;\nuniform float u_star_size;\nuniform float u_star_density;\nuniform float u_horizon_angle;\nuniform mat4 u_rotation_matrix;\n\nvarying highp vec3 v_ray_dir;\nvarying highp vec3 v_horizon_dir;\n\nhighp float random(highp vec3 p) {\n p = fract(p * vec3(23.2342, 97.1231, 91.2342));\n p += dot(p.zxy, p.yxz + 123.1234);\n return fract(p.x * p.y);\n}\n\nfloat stars(vec3 p, float scale, vec2 offset) {\n vec2 uv_scale = (u_viewport / u_star_size) * scale;\n vec3 position = vec3(p.xy * uv_scale + offset * u_viewport, p.z);\n\n vec3 q = fract(position) - 0.5;\n vec3 id = floor(position);\n\n float random_visibility = step(random(id), u_star_density);\n float circle = smoothstep(0.5 + u_star_intensity, 0.5, length(q));\n\n return circle * random_visibility;\n}\n\nvoid main() {\n highp vec3 dir = normalize(v_ray_dir);\n\n#ifdef PROJECTION_GLOBE_VIEW\n float globe_pos_dot_dir = dot(u_globe_pos, dir);\n highp vec3 closest_point_forward = abs(globe_pos_dot_dir) * dir;\n float norm_dist_from_center = length(closest_point_forward - u_globe_pos) / u_globe_radius;\n\n // Compare against 0.98 instead of 1.0 to give enough room for the custom\n // antialiasing that might be applied from globe_raster.fragment.glsl\n if (norm_dist_from_center < 0.98) {\n discard;\n return;\n }\n#endif\n\n highp vec3 horizon_dir = normalize(v_horizon_dir);\n float horizon_angle_mercator = dir.y < horizon_dir.y ?\n 0.0 : max(acos(dot(dir, horizon_dir)), 0.0);\n\n#ifdef PROJECTION_GLOBE_VIEW\n // Angle between dir and globe center\n highp vec3 closest_point = globe_pos_dot_dir * dir;\n float closest_point_to_center = length(closest_point - u_globe_pos);\n float theta = asin(clamp(closest_point_to_center / length(u_globe_pos), -1.0, 1.0));\n\n // Backward facing closest point rays should be treated separately\n float horizon_angle = globe_pos_dot_dir < 0.0 ?\n PI - theta - u_horizon_angle : theta - u_horizon_angle;\n\n // Increase speed of change of the angle interpolation for\n // a smoother visual transition between horizon angle mixing\n float angle_t = pow(u_transition, 10.0);\n\n horizon_angle = mix(horizon_angle, horizon_angle_mercator, angle_t);\n#else\n float horizon_angle = horizon_angle_mercator;\n#endif\n\n // Normalize in [0, 1]\n horizon_angle /= PI;\n\n // exponential curve\n // [0.0, 1.0] == inside the globe, > 1.0 == outside of the globe\n // https://www.desmos.com/calculator/l5v8lw9zby\n float t = exp(-horizon_angle / u_fadeout_range);\n\n float alpha_0 = u_color.a;\n float alpha_1 = u_high_color.a;\n float alpha_2 = u_space_color.a;\n\n vec3 color_stop_0 = u_color.rgb;\n vec3 color_stop_1 = u_high_color.rgb;\n vec3 color_stop_2 = u_space_color.rgb;\n\n vec3 c0 = mix(color_stop_2, color_stop_1, alpha_1);\n vec3 c1 = mix(c0, color_stop_0, alpha_0);\n vec3 c2 = mix(c0, c1, t);\n vec3 c = mix(color_stop_2, c2, t);\n\n // Blend alphas\n float a0 = mix(alpha_2, 1.0, alpha_1);\n float a1 = mix(a0, 1.0, alpha_0);\n float a2 = mix(a0, a1, t);\n float a = mix(alpha_2, a2, t);\n\n vec2 uv = gl_FragCoord.xy / u_viewport - 0.5;\n float aspect_ratio = u_viewport.x / u_viewport.y;\n\n vec4 uv_dir = vec4(normalize(vec3(uv.x * aspect_ratio, uv.y, 1.0)), 1.0);\n\n uv_dir = u_rotation_matrix * uv_dir;\n\n vec3 n = abs(uv_dir.xyz);\n vec2 uv_remap = (n.x > n.y && n.x > n.z) ? uv_dir.yz / uv_dir.x:\n (n.y > n.x && n.y > n.z) ? uv_dir.zx / uv_dir.y:\n uv_dir.xy / uv_dir.z;\n\n uv_remap.x /= aspect_ratio;\n\n vec3 D = vec3(uv_remap, 1.0);\n\n // Accumulate star field\n highp float star_field = 0.0;\n\n if (u_star_intensity > 0.0) {\n // Create stars of various scales and offset to improve randomness\n star_field += stars(D, 1.2, vec2(0.0, 0.0));\n star_field += stars(D, 1.0, vec2(1.0, 0.0));\n star_field += stars(D, 0.8, vec2(0.0, 1.0));\n star_field += stars(D, 0.6, vec2(1.0, 1.0));\n\n // Fade stars as they get closer to horizon to\n // give the feeling of an atmosphere with thickness\n star_field *= (1.0 - pow(t, 0.25 + (1.0 - u_high_color.a) * 0.75));\n\n // Additive star field\n c += star_field * alpha_2;\n }\n\n // Dither\n c = dither(c, gl_FragCoord.xy + u_temporal_offset);\n\n\n gl_FragColor = vec4(c, a);\n}\n"; - isDone() { - return this._done; - } +var atmosphereVert = "attribute vec3 a_pos;\nattribute vec2 a_uv;\n\n// View frustum direction vectors pointing from the camera position to of each the corner points\nuniform vec3 u_frustum_tl;\nuniform vec3 u_frustum_tr;\nuniform vec3 u_frustum_br;\nuniform vec3 u_frustum_bl;\nuniform float u_horizon;\n\nvarying highp vec3 v_ray_dir;\nvarying highp vec3 v_horizon_dir;\n\nvoid main() {\n v_ray_dir = mix(\n mix(u_frustum_tl, u_frustum_tr, a_uv.x),\n mix(u_frustum_bl, u_frustum_br, a_uv.x),\n a_uv.y);\n\n v_horizon_dir = mix(\n mix(u_frustum_tl, u_frustum_bl, u_horizon),\n mix(u_frustum_tr, u_frustum_br, u_horizon),\n a_uv.x);\n\n gl_Position = vec4(a_pos, 1.0);\n}\n"; - continuePlacement(order , layers , layerTiles ) { - const startTime = transform.exported.now(); +let preludeTerrain = {}; +let preludeFog = {}; - const shouldPausePlacement = () => { - const elapsedTime = transform.exported.now() - startTime; - return this._forceFullPlacement ? false : elapsedTime > 2; - }; +preludeTerrain = compile('', preludeTerrainVert, true); +preludeFog = compile(preludeFogFrag, preludeFogVert, true); - while (this._currentPlacementIndex >= 0) { - const layerId = order[this._currentPlacementIndex]; - const layer = layers[layerId]; - const placementZoom = this.placement.collisionIndex.transform.zoom; - if (layer.type === 'symbol' && - (!layer.minzoom || layer.minzoom <= placementZoom) && - (!layer.maxzoom || layer.maxzoom > placementZoom)) { +const prelude = compile(preludeFrag, preludeVert); +const preludeCommonSource = preludeCommon; - if (!this._inProgressLayer) { - this._inProgressLayer = new LayerPlacement(((layer ) )); - } +const preludeVertPrecisionQualifiers = ` +#ifdef GL_ES +precision highp float; +#else - const pausePlacement = this._inProgressLayer.continuePlacement(layerTiles[layer.source], this.placement, this._showCollisionBoxes, layer, shouldPausePlacement); +#if !defined(lowp) +#define lowp +#endif - if (pausePlacement) { - transform.PerformanceUtils.recordPlacementTime(transform.exported.now() - startTime); - // 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; - } +#if !defined(mediump) +#define mediump +#endif - delete this._inProgressLayer; - } +#if !defined(highp) +#define highp +#endif - this._currentPlacementIndex--; - } - transform.PerformanceUtils.recordPlacementTime(transform.exported.now() - startTime); - this._done = true; - } +#endif`; +const preludeFragPrecisionQualifiers = ` +#ifdef GL_ES +precision mediump float; +#else - commit(now ) { - this.placement.commit(now); - return this.placement; - } -} +#if !defined(lowp) +#define lowp +#endif -// - - - - - - +#if !defined(mediump) +#define mediump +#endif -/* - 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. +#if !defined(highp) +#define highp +#endif - 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. -*/ +#endif`; -// Round anchor positions to roughly 4 pixel grid -const roundingFactor = 512 / transform.EXTENT / 2; +const standardDerivativesExt = '#extension GL_OES_standard_derivatives : enable\n'; -class TileLayerIndex { - - - - - - - - - +var shaders = { + background: compile(backgroundFrag, backgroundVert), + backgroundPattern: compile(backgroundPatternFrag, backgroundPatternVert), + circle: compile(circleFrag, circleVert), + clippingMask: compile(clippingMaskFrag, clippingMaskVert), + heatmap: compile(heatmapFrag, heatmapVert), + heatmapTexture: compile(heatmapTextureFrag, heatmapTextureVert), + collisionBox: compile(collisionBoxFrag, collisionBoxVert), + collisionCircle: compile(collisionCircleFrag, collisionCircleVert), + debug: compile(debugFrag, debugVert), + fill: compile(fillFrag, fillVert), + fillOutline: compile(fillOutlineFrag, fillOutlineVert), + fillOutlinePattern: compile(fillOutlinePatternFrag, fillOutlinePatternVert), + fillPattern: compile(fillPatternFrag, fillPatternVert), + fillExtrusion: compile(fillExtrusionFrag, fillExtrusionVert), + fillExtrusionPattern: compile(fillExtrusionPatternFrag, fillExtrusionPatternVert), + hillshadePrepare: compile(hillshadePrepareFrag, hillshadePrepareVert), + hillshade: compile(hillshadeFrag, hillshadeVert), + line: compile(lineFrag, lineVert), + linePattern: compile(linePatternFrag, linePatternVert), + raster: compile(rasterFrag, rasterVert), + symbolIcon: compile(symbolIconFrag, symbolIconVert), + symbolSDF: compile(symbolSDFFrag, symbolSDFVert), + symbolTextAndIcon: compile(symbolTextAndIconFrag, symbolTextAndIconVert), + terrainRaster: compile(terrainRasterFrag, terrainRasterVert), + terrainDepth: compile(terrainDepthFrag, terrainDepthVert), + skybox: compile(skyboxFrag, skyboxVert), + skyboxGradient: compile(skyboxGradientFrag, skyboxVert), + skyboxCapture: compile(skyboxCaptureFrag, skyboxCaptureVert), + globeRaster: compile(globeFrag, globeVert), + globeAtmosphere: compile(atmosphereFrag, atmosphereVert) +}; - constructor(tileID , symbolInstances , bucketInstanceId ) { - this.tileID = tileID; - this.indexedSymbolInstances = {}; - this.bucketInstanceId = bucketInstanceId; +// Expand #pragmas to #ifdefs. +function compile(fragmentSource, vertexSource, isGlobalPrelude) { + const pragmaRegex = /#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g; + const uniformRegex = /uniform (highp |mediump |lowp )?([\w]+) ([\w]+)([\s]*)([\w]*)/g; + const attributeRegex = /attribute (highp |mediump |lowp )?([\w]+) ([\w]+)/g; - for (let i = 0; i < symbolInstances.length; i++) { - const symbolInstance = symbolInstances.get(i); - const key = symbolInstance.key; - if (!this.indexedSymbolInstances[key]) { - this.indexedSymbolInstances[key] = []; - } - // This tile may have multiple symbol instances with the same key - // Store each one along with its coordinates - this.indexedSymbolInstances[key].push({ - crossTileID: symbolInstance.crossTileID, - coord: this.getScaledCoordinates(symbolInstance, tileID) - }); + const staticAttributes = vertexSource.match(attributeRegex); + const fragmentUniforms = fragmentSource.match(uniformRegex); + const vertexUniforms = vertexSource.match(uniformRegex); + const commonUniforms = preludeCommon.match(uniformRegex); + + let staticUniforms = vertexUniforms ? vertexUniforms.concat(fragmentUniforms) : fragmentUniforms; + + if (!isGlobalPrelude) { + if (preludeTerrain.staticUniforms) { + staticUniforms = preludeTerrain.staticUniforms.concat(staticUniforms); + } + if (preludeFog.staticUniforms) { + staticUniforms = preludeFog.staticUniforms.concat(staticUniforms); } } - // 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. - getScaledCoordinates(symbolInstance , childTileID ) { - const zDifference = childTileID.canonical.z - this.tileID.canonical.z; - const scale = roundingFactor / Math.pow(2, zDifference); - return { - x: Math.floor((childTileID.canonical.x * transform.EXTENT + symbolInstance.tileAnchorX) * scale), - y: Math.floor((childTileID.canonical.y * transform.EXTENT + symbolInstance.tileAnchorY) * scale) - }; + if (staticUniforms) { + staticUniforms = staticUniforms.concat(commonUniforms); } - findMatches(symbolInstances , newTileID , zoomCrossTileIDs ) { - const tolerance = this.tileID.canonical.z < newTileID.canonical.z ? 1 : Math.pow(2, this.tileID.canonical.z - newTileID.canonical.z); - - for (let i = 0; i < symbolInstances.length; i++) { - const symbolInstance = symbolInstances.get(i); - if (symbolInstance.crossTileID) { - // already has a match, skip - continue; - } + const fragmentPragmas = {}; - const indexedInstances = this.indexedSymbolInstances[symbolInstance.key]; - if (!indexedInstances) { - // No symbol with this key in this bucket - continue; - } + fragmentSource = fragmentSource.replace(pragmaRegex, (match, operation, precision, type, name) => { + fragmentPragmas[name] = true; + if (operation === 'define') { + return ` +#ifndef HAS_UNIFORM_u_${name} +varying ${precision} ${type} ${name}; +#else +uniform ${precision} ${type} u_${name}; +#endif +`; + } else /* if (operation === 'initialize') */ { + return ` +#ifdef HAS_UNIFORM_u_${name} + ${precision} ${type} ${name} = u_${name}; +#endif +`; + } + }); - const scaledSymbolCoord = this.getScaledCoordinates(symbolInstance, newTileID); + vertexSource = vertexSource.replace(pragmaRegex, (match, operation, precision, type, name) => { + const attrType = type === 'float' ? 'vec2' : 'vec4'; + const unpackType = name.match(/color/) ? 'color' : attrType; - for (const thisTileSymbol of indexedInstances) { - // 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) - 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; + if (fragmentPragmas[name]) { + if (operation === 'define') { + return ` +#ifndef HAS_UNIFORM_u_${name} +uniform lowp float u_${name}_t; +attribute ${precision} ${attrType} a_${name}; +varying ${precision} ${type} ${name}; +#else +uniform ${precision} ${type} u_${name}; +#endif +`; + } else /* if (operation === 'initialize') */ { + if (unpackType === 'vec4') { + // vec4 attributes are only used for cross-faded properties, and are not packed + return ` +#ifndef HAS_UNIFORM_u_${name} + ${name} = a_${name}; +#else + ${precision} ${type} ${name} = u_${name}; +#endif +`; + } else { + return ` +#ifndef HAS_UNIFORM_u_${name} + ${name} = unpack_mix_${unpackType}(a_${name}, u_${name}_t); +#else + ${precision} ${type} ${name} = u_${name}; +#endif +`; + } + } + } else { + if (operation === 'define') { + return ` +#ifndef HAS_UNIFORM_u_${name} +uniform lowp float u_${name}_t; +attribute ${precision} ${attrType} a_${name}; +#else +uniform ${precision} ${type} u_${name}; +#endif +`; + } else /* if (operation === 'initialize') */ { + if (unpackType === 'vec4') { + // vec4 attributes are only used for cross-faded properties, and are not packed + return ` +#ifndef HAS_UNIFORM_u_${name} + ${precision} ${type} ${name} = a_${name}; +#else + ${precision} ${type} ${name} = u_${name}; +#endif +`; + } else /* */{ + return ` +#ifndef HAS_UNIFORM_u_${name} + ${precision} ${type} ${name} = unpack_mix_${unpackType}(a_${name}, u_${name}_t); +#else + ${precision} ${type} ${name} = u_${name}; +#endif +`; } } } - } -} + }); -class CrossTileIDs { - - constructor() { - this.maxCrossTileID = 0; - } - generate() { - return ++this.maxCrossTileID; - } + return {fragmentSource, vertexSource, staticAttributes, staticUniforms}; } -class CrossTileSymbolLayerIndex { - - - +// - constructor() { - this.indexes = {}; - this.usedCrossTileIDs = {}; - this.lng = 0; - } + + + + - /* - * Sometimes when a user pans across the antimeridian the longitude value gets wrapped. - * To prevent labels from flashing out and in we adjust the tileID values in the indexes - * so that they match the new wrapped version of the map. - */ - handleWrapJump(lng ) { - const wrapDelta = Math.round((lng - this.lng) / 360); - if (wrapDelta !== 0) { - for (const zoom in this.indexes) { - const zoomIndexes = this.indexes[zoom]; - const newZoomIndex = {}; - for (const key in zoomIndexes) { - // change the tileID's wrap and add it to a new index - const index = zoomIndexes[key]; - index.tileID = index.tileID.unwrapTo(index.tileID.wrap + wrapDelta); - newZoomIndex[index.tileID.key] = index; - } - this.indexes[zoom] = newZoomIndex; - } - } - this.lng = lng; - } +class VertexArrayObject { + + + + + + + + + + - addBucket(tileID , bucket , crossTileIDs ) { - 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]); - } - } + constructor() { + this.boundProgram = null; + this.boundLayoutVertexBuffer = null; + this.boundPaintVertexBuffers = []; + this.boundIndexBuffer = null; + this.boundVertexOffset = null; + this.boundDynamicVertexBuffer = null; + this.vao = null; + } - for (let i = 0; i < bucket.symbolInstances.length; i++) { - const symbolInstance = bucket.symbolInstances.get(i); - symbolInstance.crossTileID = 0; - } + bind(context , + program , + layoutVertexBuffer , + paintVertexBuffers , + indexBuffer , + vertexOffset , + dynamicVertexBuffer , + dynamicVertexBuffer2 , + dynamicVertexBuffer3 ) { - if (!this.usedCrossTileIDs[tileID.overscaledZ]) { - this.usedCrossTileIDs[tileID.overscaledZ] = {}; - } - const zoomCrossTileIDs = this.usedCrossTileIDs[tileID.overscaledZ]; + this.context = context; - for (const zoom in this.indexes) { - const zoomIndexes = this.indexes[zoom]; - if (Number(zoom) > tileID.overscaledZ) { - for (const id in zoomIndexes) { - const childIndex = zoomIndexes[id]; - if (childIndex.tileID.isChildOf(tileID)) { - childIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); - } - } - } else { - const parentCoord = tileID.scaledTo(Number(zoom)); - const parentIndex = zoomIndexes[parentCoord.key]; - if (parentIndex) { - parentIndex.findMatches(bucket.symbolInstances, tileID, zoomCrossTileIDs); - } + let paintBuffersDiffer = this.boundPaintVertexBuffers.length !== paintVertexBuffers.length; + for (let i = 0; !paintBuffersDiffer && i < paintVertexBuffers.length; i++) { + if (this.boundPaintVertexBuffers[i] !== paintVertexBuffers[i]) { + paintBuffersDiffer = true; } } - for (let i = 0; i < bucket.symbolInstances.length; i++) { - const symbolInstance = bucket.symbolInstances.get(i); - if (!symbolInstance.crossTileID) { - // symbol did not match any known symbol, assign a new id - symbolInstance.crossTileID = crossTileIDs.generate(); - zoomCrossTileIDs[symbolInstance.crossTileID] = true; - } - } + const isFreshBindRequired = ( + !this.vao || + this.boundProgram !== program || + this.boundLayoutVertexBuffer !== layoutVertexBuffer || + paintBuffersDiffer || + this.boundIndexBuffer !== indexBuffer || + this.boundVertexOffset !== vertexOffset || + this.boundDynamicVertexBuffer !== dynamicVertexBuffer || + this.boundDynamicVertexBuffer2 !== dynamicVertexBuffer2 || + this.boundDynamicVertexBuffer3 !== dynamicVertexBuffer3 + ); - if (this.indexes[tileID.overscaledZ] === undefined) { - this.indexes[tileID.overscaledZ] = {}; - } - this.indexes[tileID.overscaledZ][tileID.key] = new TileLayerIndex(tileID, bucket.symbolInstances, bucket.bucketInstanceId); + if (!context.extVertexArrayObject || isFreshBindRequired) { + this.freshBind(program, layoutVertexBuffer, paintVertexBuffers, indexBuffer, vertexOffset, dynamicVertexBuffer, dynamicVertexBuffer2, dynamicVertexBuffer3); + } else { + context.bindVertexArrayOES.set(this.vao); - return true; - } + if (dynamicVertexBuffer) { + // The buffer may have been updated. Rebind to upload data. + dynamicVertexBuffer.bind(); + } - removeBucketCrossTileIDs(zoom , removedBucket ) { - for (const key in removedBucket.indexedSymbolInstances) { - for (const symbolInstance of removedBucket.indexedSymbolInstances[(key )]) { - delete this.usedCrossTileIDs[zoom][symbolInstance.crossTileID]; + if (indexBuffer && indexBuffer.dynamicDraw) { + indexBuffer.bind(); } - } - } - removeStaleBuckets(currentIDs ) { - let tilesChanged = false; - for (const z in this.indexes) { - const zoomIndexes = this.indexes[z]; - for (const tileKey in zoomIndexes) { - if (!currentIDs[zoomIndexes[tileKey].bucketInstanceId]) { - this.removeBucketCrossTileIDs(z, zoomIndexes[tileKey]); - delete zoomIndexes[tileKey]; - tilesChanged = true; - } + if (dynamicVertexBuffer2) { + dynamicVertexBuffer2.bind(); + } + + if (dynamicVertexBuffer3) { + dynamicVertexBuffer3.bind(); } } - return tilesChanged; } -} -class CrossTileSymbolIndex { - - - - + freshBind(program , + layoutVertexBuffer , + paintVertexBuffers , + indexBuffer , + vertexOffset , + dynamicVertexBuffer , + dynamicVertexBuffer2 , + dynamicVertexBuffer3 ) { + let numPrevAttributes; + const numNextAttributes = program.numAttributes; - constructor() { - this.layerIndexes = {}; - this.crossTileIDs = new CrossTileIDs(); - this.maxBucketInstanceId = 0; - this.bucketsInCurrentPlacement = {}; - } + const context = this.context; + const gl = context.gl; - addLayer(styleLayer , tiles , lng , projection ) { - let layerIndex = this.layerIndexes[styleLayer.id]; - if (layerIndex === undefined) { - layerIndex = this.layerIndexes[styleLayer.id] = new CrossTileSymbolLayerIndex(); - } + if (context.extVertexArrayObject) { + if (this.vao) this.destroy(); + this.vao = context.extVertexArrayObject.createVertexArrayOES(); + context.bindVertexArrayOES.set(this.vao); + numPrevAttributes = 0; - let symbolBucketsChanged = false; - const currentBucketIDs = {}; + // 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; + this.boundDynamicVertexBuffer3 = dynamicVertexBuffer3; - if (projection.name !== 'globe') { - layerIndex.handleWrapJump(lng); + } 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 (let i = numNextAttributes; i < numPrevAttributes; i++) { + // WebGL breaks if you disable attribute 0. + // http://stackoverflow.com/questions/20305231 + ref_properties.assert_1(i !== 0); + gl.disableVertexAttribArray(i); + } } - for (const tile of tiles) { - const symbolBucket = ((tile.getBucket(styleLayer) ) ); - if (!symbolBucket || styleLayer.id !== symbolBucket.layerIds[0]) - continue; + layoutVertexBuffer.enableAttributes(gl, program); + for (const vertexBuffer of paintVertexBuffers) { + vertexBuffer.enableAttributes(gl, program); + } - if (!symbolBucket.bucketInstanceId) { - symbolBucket.bucketInstanceId = ++this.maxBucketInstanceId; - } + if (dynamicVertexBuffer) { + dynamicVertexBuffer.enableAttributes(gl, program); + } + if (dynamicVertexBuffer2) { + dynamicVertexBuffer2.enableAttributes(gl, program); + } + if (dynamicVertexBuffer3) { + dynamicVertexBuffer3.enableAttributes(gl, program); + } - if (layerIndex.addBucket(tile.tileID, symbolBucket, this.crossTileIDs)) { - symbolBucketsChanged = true; - } - currentBucketIDs[symbolBucket.bucketInstanceId] = true; + layoutVertexBuffer.bind(); + layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); + for (const vertexBuffer of paintVertexBuffers) { + vertexBuffer.bind(); + vertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); } - if (layerIndex.removeStaleBuckets(currentBucketIDs)) { - symbolBucketsChanged = true; + if (dynamicVertexBuffer) { + dynamicVertexBuffer.bind(); + dynamicVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); + } + if (indexBuffer) { + indexBuffer.bind(); + } + if (dynamicVertexBuffer2) { + dynamicVertexBuffer2.bind(); + dynamicVertexBuffer2.setVertexAttribPointers(gl, program, vertexOffset); + } + if (dynamicVertexBuffer3) { + dynamicVertexBuffer3.bind(); + dynamicVertexBuffer3.setVertexAttribPointers(gl, program, vertexOffset); } - return symbolBucketsChanged; + context.currentNumAttributes = numNextAttributes; } - pruneUnusedLayers(usedLayers ) { - const usedLayerMap = {}; - usedLayers.forEach((usedLayer) => { - usedLayerMap[usedLayer] = true; - }); - for (const layerId in this.layerIndexes) { - if (!usedLayerMap[layerId]) { - delete this.layerIndexes[layerId]; - } + destroy() { + if (this.vao) { + this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao); + this.vao = null; } } } // -// We're skipping validation errors with the `source.canvas` identifier in order -// to continue to allow canvas sources to be added at runtime/updated in -// smart setStyle (see https://github.com/mapbox/mapbox-gl-js/pull/6424): -const emitValidationErrors = (evented , errors ) => - transform.emitValidationErrors(evented, errors && errors.filter(error => error.identifier !== 'source.canvas')); + + + + + + + - - - - - - - - - - - - - - - - + + - - + + + - - - - + + -const supportedDiffOperations = transform.pick(operations, [ - 'addLayer', - 'removeLayer', - 'setPaintProperty', - 'setLayoutProperty', - 'setFilter', - 'addSource', - 'removeSource', - 'setLayerZoomRange', - 'setLight', - 'setTransition', - 'setGeoJSONSourceData', - 'setTerrain', - 'setFog', - 'setProjection' - // 'setGlyphs', - // 'setSprite', -]); + + + + + + + -const ignoredDiffOperations = transform.pick(operations, [ - 'setCenter', - 'setZoom', - 'setBearing', - 'setPitch' -]); +const hillshadeUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_latrange': new ref_properties.Uniform2f(context, locations.u_latrange), + 'u_light': new ref_properties.Uniform2f(context, locations.u_light), + 'u_shadow': new ref_properties.UniformColor(context, locations.u_shadow), + 'u_highlight': new ref_properties.UniformColor(context, locations.u_highlight), + 'u_accent': new ref_properties.UniformColor(context, locations.u_accent) +}); -const empty = emptyStyle(); +const hillshadePrepareUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_dimension': new ref_properties.Uniform2f(context, locations.u_dimension), + 'u_zoom': new ref_properties.Uniform1f(context, locations.u_zoom), + 'u_unpack': new ref_properties.Uniform4f(context, locations.u_unpack) +}); - - - - - +const hillshadeUniformValues = ( + painter , + tile , + layer , + matrix +) => { + const shadow = layer.paint.get("hillshade-shadow-color"); + const highlight = layer.paint.get("hillshade-highlight-color"); + const accent = layer.paint.get("hillshade-accent-color"); - - - + let 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; + } + const align = !painter.options.moving; + return { + 'u_matrix': matrix ? matrix : painter.transform.calculateProjMatrix(tile.tileID.toUnwrapped(), align), + 'u_image': 0, + 'u_latrange': getTileLatRange(painter, tile.tileID), + 'u_light': [layer.paint.get('hillshade-exaggeration'), azimuthal], + 'u_shadow': shadow, + 'u_highlight': highlight, + 'u_accent': accent + }; +}; -// Symbols are draped only for specific cases: see isLayerDraped -const drapedLayers = {'fill': true, 'line': true, 'background': true, "hillshade": true, "raster": true}; +const hillshadeUniformPrepareValues = ( + tileID , dem +) => { -/** - * @private - */ -class Style extends transform.Evented { - - - - - - - - - + const stride = dem.stride; + const matrix = ref_properties.create(); + // Flip rendering at y axis. + ref_properties.ortho(matrix, 0, ref_properties.EXTENT, -ref_properties.EXTENT, 0, 0, 1); + ref_properties.translate(matrix, matrix, [0, -ref_properties.EXTENT, 0]); - - - - - - - - - - - - - - - - - - - - - - - - + return { + 'u_matrix': matrix, + 'u_image': 1, + 'u_dimension': [stride, stride], + 'u_zoom': tileID.overscaledZ, + 'u_unpack': dem.unpackVector + }; +}; - - - - +function getTileLatRange(painter , tileID ) { + // for scaling the magnitude of a points slope by its latitude + const tilesAtZoom = Math.pow(2, tileID.canonical.z); + const y = tileID.canonical.y; + return [ + new ref_properties.MercatorCoordinate(0, y / tilesAtZoom).toLngLat().lat, + new ref_properties.MercatorCoordinate(0, (y + 1) / tilesAtZoom).toLngLat().lat]; +} - // exposed to allow stubbing by unit tests - - - +// - constructor(map , options = {}) { - super(); +function drawHillshade(painter , sourceCache , layer , tileIDs ) { + if (painter.renderPass !== 'offscreen' && painter.renderPass !== 'translucent') return; - this.map = map; - this.dispatcher = new Dispatcher(getGlobalWorkerPool(), this); - this.imageManager = new ImageManager(); - this.imageManager.setEventedParent(this); - this.glyphManager = new transform.GlyphManager(map._requestManager, - options.localFontFamily ? - transform.LocalGlyphMode.all : - (options.localIdeographFontFamily ? transform.LocalGlyphMode.ideographs : transform.LocalGlyphMode.none), - options.localFontFamily || options.localIdeographFontFamily); - this.lineAtlas = new transform.LineAtlas(256, 512); - this.crossTileSymbolIndex = new CrossTileSymbolIndex(); + const context = painter.context; - this._layers = {}; - this._num3DLayers = 0; - this._numSymbolLayers = 0; - this._numCircleLayers = 0; - this._serializedLayers = {}; - this._sourceCaches = {}; - this._otherSourceCaches = {}; - this._symbolSourceCaches = {}; - this.zoomHistory = new transform.ZoomHistory(); - this._loaded = false; - this._availableImages = []; - this._order = []; - this._drapedFirstOrder = []; - this._markersNeedUpdate = false; + const depthMode = painter.depthModeForSublayer(0, ref_properties.DepthMode.ReadOnly); + const colorMode = painter.colorModeForRenderPass(); - this._resetUpdates(); + // When rendering to texture, coordinates are already sorted: primary by + // proxy id and secondary sort is by Z. + const renderingToTexture = painter.terrain && painter.terrain.renderingToTexture; + const [stencilModes, coords] = painter.renderPass === 'translucent' && !renderingToTexture ? + painter.stencilConfigForOverlap(tileIDs) : [{}, tileIDs]; - this.dispatcher.broadcast('setReferrer', transform.getReferrer()); + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + if (tile.needsHillshadePrepare && painter.renderPass === 'offscreen') { + prepareHillshade(painter, tile, layer, depthMode, ref_properties.StencilMode.disabled, colorMode); + } else if (painter.renderPass === 'translucent') { + const stencilMode = renderingToTexture && painter.terrain ? + painter.terrain.stencilModeForRTTOverlap(coord) : stencilModes[coord.overscaledZ]; + renderHillshade(painter, coord, tile, layer, depthMode, stencilMode, colorMode); + } + } - const self = this; - this._rtlTextPluginCallback = Style.registerForPluginStateChange((event) => { - const state = { - pluginStatus: event.pluginStatus, - pluginURL: event.pluginURL - }; - self.dispatcher.broadcast('syncRTLPluginState', state, (err, results) => { - transform.triggerPluginCompletionEvent(err); - if (results) { - const allComplete = results.every((elem) => elem); - if (allComplete) { - for (const id in self._sourceCaches) { - const sourceCache = self._sourceCaches[id]; - const sourceCacheType = sourceCache.getSource().type; - if (sourceCacheType === 'vector' || sourceCacheType === 'geojson') { - sourceCache.reload(); // Should be a no-op if the plugin loads before any tiles load - } - } - } - } + context.viewport.set([0, 0, painter.width, painter.height]); - }); - }); + painter.resetStencilClippingMasks(); +} - this.on('data', (event) => { - if (event.dataType !== 'source' || event.sourceDataType !== 'metadata') { - return; - } +function renderHillshade(painter, coord, tile, layer, depthMode, stencilMode, colorMode) { + const context = painter.context; + const gl = context.gl; + const fbo = tile.fbo; + if (!fbo) return; + painter.prepareDrawTile(); - const source = this.getSource(event.sourceId); - if (!source || !source.vectorLayerIds) { - return; - } + const program = painter.useProgram('hillshade'); - for (const layerId in this._layers) { - const layer = this._layers[layerId]; - if (layer.source === source.id) { - this._validateLayer(layer); - } - } - }); - } + context.activeTexture.set(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); - loadURL(url , options - - - = {}) { - this.fire(new transform.Event('dataloading', {dataType: 'style'})); + const uniformValues = hillshadeUniformValues(painter, tile, layer, painter.terrain ? coord.projMatrix : null); - const validate = typeof options.validate === 'boolean' ? - options.validate : !transform.isMapboxURL(url); + painter.prepareDrawProgram(context, program, coord.toUnwrapped()); - url = this.map._requestManager.normalizeStyleURL(url, options.accessToken); - const request = this.map._requestManager.transformRequest(url, transform.ResourceType.Style); - this._request = transform.getJSON(request, (error , json ) => { - this._request = null; - if (error) { - this.fire(new transform.ErrorEvent(error)); - } else if (json) { - this._load(json, validate); - } - }); - } + const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getTileBoundsBuffers(tile); - loadJSON(json , options = {}) { - this.fire(new transform.Event('dataloading', {dataType: 'style'})); + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, + uniformValues, layer.id, tileBoundsBuffer, + tileBoundsIndexBuffer, tileBoundsSegments); +} - this._request = transform.exported.frame(() => { - this._request = null; - this._load(json, options.validate !== false); - }); - } +function prepareDEMTexture(painter , tile , dem ) { + if (!tile.needsDEMTextureUpload) return; - loadEmpty() { - this.fire(new transform.Event('dataloading', {dataType: 'style'})); - this._load(empty, false); + const context = painter.context; + const gl = context.gl; + + context.pixelStoreUnpackPremultiplyAlpha.set(false); + const textureStride = dem.stride; + tile.demTexture = tile.demTexture || painter.getTileTexture(textureStride); + const pixelData = dem.getPixels(); + if (tile.demTexture) { + tile.demTexture.update(pixelData, {premultiply: false}); + } else { + tile.demTexture = new ref_properties.Texture(context, pixelData, gl.RGBA, {premultiply: false}); } + tile.needsDEMTextureUpload = false; +} - _updateLayerCount(layer , add ) { - // Typed layer bookkeeping - const count = add ? 1 : -1; - if (layer.is3D()) { - this._num3DLayers += count; - } - if (layer.type === 'circle') { - this._numCircleLayers += count; - } - if (layer.type === 'symbol') { - this._numSymbolLayers += count; - } +// 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, layer, depthMode, stencilMode, colorMode) { + const context = painter.context; + const gl = context.gl; + if (!tile.dem) return; + const dem = tile.dem; + + context.activeTexture.set(gl.TEXTURE1); + prepareDEMTexture(painter, tile, dem); + ref_properties.assert_1(tile.demTexture); + if (!tile.demTexture) return; // Silence flow. + tile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); + const tileSize = dem.dim; + + context.activeTexture.set(gl.TEXTURE0); + let fbo = tile.fbo; + if (!fbo) { + const renderTexture = new ref_properties.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, true); + fbo.colorAttachment.set(renderTexture.texture); } - _load(json , validate ) { - if (validate && emitValidationErrors(this, transform.validateStyle(json))) { - return; - } + context.bindFramebuffer.set(fbo.framebuffer); + context.viewport.set([0, 0, tileSize, tileSize]); - this._loaded = true; - this.stylesheet = json; + const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getMercatorTileBoundsBuffers(); + + painter.useProgram('hillshadePrepare').draw(context, gl.TRIANGLES, + depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, + hillshadeUniformPrepareValues(tile.tileID, dem), + layer.id, tileBoundsBuffer, + tileBoundsIndexBuffer, tileBoundsSegments); + + tile.needsHillshadePrepare = false; +} + +// + + + + + + + + + + +const terrainRasterUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_image0': new ref_properties.Uniform1i(context, locations.u_image0), + 'u_skirt_height': new ref_properties.Uniform1f(context, locations.u_skirt_height) +}); + +const terrainRasterUniformValues = ( + matrix , + skirtHeight +) => ({ + 'u_matrix': matrix, + 'u_image0': 0, + 'u_skirt_height': skirtHeight +}); + +// + + + + + + + + + + + + + + + + + + + + + - this.updateProjection(); + + + + + + + + + + + + + + + + + + - for (const id in json.sources) { - this.addSource(id, json.sources[id], {validate: false}); - } - this._changed = false; // avoid triggering redundant style update after adding initial sources - if (json.sprite) { - this._loadSprite(json.sprite); - } else { - this.imageManager.setLoaded(true); - this.dispatcher.broadcast('spriteLoaded', true); - } +const globeRasterUniforms = (context , locations ) => ({ + 'u_proj_matrix': new ref_properties.UniformMatrix4f(context, locations.u_proj_matrix), + 'u_globe_matrix': new ref_properties.UniformMatrix4f(context, locations.u_globe_matrix), + 'u_normalize_matrix': new ref_properties.UniformMatrix4f(context, locations.u_normalize_matrix), + 'u_merc_matrix': new ref_properties.UniformMatrix4f(context, locations.u_merc_matrix), + 'u_zoom_transition': new ref_properties.Uniform1f(context, locations.u_zoom_transition), + 'u_merc_center': new ref_properties.Uniform2f(context, locations.u_merc_center), + 'u_image0': new ref_properties.Uniform1i(context, locations.u_image0), + 'u_grid_matrix': new ref_properties.UniformMatrix3f(context, locations.u_grid_matrix), + 'u_frustum_tl': new ref_properties.Uniform3f(context, locations.u_frustum_tl), + 'u_frustum_tr': new ref_properties.Uniform3f(context, locations.u_frustum_tr), + 'u_frustum_br': new ref_properties.Uniform3f(context, locations.u_frustum_br), + 'u_frustum_bl': new ref_properties.Uniform3f(context, locations.u_frustum_bl), + 'u_globe_pos': new ref_properties.Uniform3f(context, locations.u_globe_pos), + 'u_globe_radius': new ref_properties.Uniform1f(context, locations.u_globe_radius), + 'u_viewport': new ref_properties.Uniform2f(context, locations.u_viewport) +}); - this.glyphManager.setURL(json.glyphs); +const atmosphereUniforms = (context , locations ) => ({ + 'u_frustum_tl': new ref_properties.Uniform3f(context, locations.u_frustum_tl), + 'u_frustum_tr': new ref_properties.Uniform3f(context, locations.u_frustum_tr), + 'u_frustum_br': new ref_properties.Uniform3f(context, locations.u_frustum_br), + 'u_frustum_bl': new ref_properties.Uniform3f(context, locations.u_frustum_bl), + 'u_horizon': new ref_properties.Uniform1f(context, locations.u_horizon), + 'u_transition': new ref_properties.Uniform1f(context, locations.u_transition), + 'u_fadeout_range': new ref_properties.Uniform1f(context, locations.u_fadeout_range), + 'u_color': new ref_properties.Uniform4f(context, locations.u_color), + 'u_high_color': new ref_properties.Uniform4f(context, locations.u_high_color), + 'u_space_color': new ref_properties.Uniform4f(context, locations.u_space_color), + 'u_star_intensity': new ref_properties.Uniform1f(context, locations.u_star_intensity), + 'u_star_density': new ref_properties.Uniform1f(context, locations.u_star_density), + 'u_star_size': new ref_properties.Uniform1f(context, locations.u_star_size), + 'u_temporal_offset': new ref_properties.Uniform1f(context, locations.u_temporal_offset), + 'u_horizon_angle': new ref_properties.Uniform1f(context, locations.u_horizon_angle), + 'u_rotation_matrix': new ref_properties.UniformMatrix4f(context, locations.u_rotation_matrix) +}); - const layers = derefLayers(this.stylesheet.layers); +const globeRasterUniformValues = ( + projMatrix , + globeMatrix , + globeMercatorMatrix , + normalizeMatrix , + zoomTransition , + mercCenter , + frustumDirTl , + frustumDirTr , + frustumDirBr , + frustumDirBl , + globePosition , + globeRadius , + viewport , + gridMatrix +) => ({ + 'u_proj_matrix': Float32Array.from(projMatrix), + 'u_globe_matrix': globeMatrix, + 'u_normalize_matrix': Float32Array.from(normalizeMatrix), + 'u_merc_matrix': globeMercatorMatrix, + 'u_zoom_transition': zoomTransition, + 'u_merc_center': mercCenter, + 'u_image0': 0, + 'u_frustum_tl': frustumDirTl, + 'u_frustum_tr': frustumDirTr, + 'u_frustum_br': frustumDirBr, + 'u_frustum_bl': frustumDirBl, + 'u_globe_pos': globePosition, + 'u_globe_radius': globeRadius, + 'u_viewport': viewport, + 'u_grid_matrix': gridMatrix ? Float32Array.from(gridMatrix) : new Float32Array(9) +}); - this._order = layers.map((layer) => layer.id); +const atmosphereUniformValues = ( + frustumDirTl , + frustumDirTr , + frustumDirBr , + frustumDirBl , + horizon , + transitionT , + fadeoutRange , + color , + highColor , + spaceColor , + starIntensity , + temporalOffset , + horizonAngle , + rotationMatrix +) => ({ + 'u_frustum_tl': frustumDirTl, + 'u_frustum_tr': frustumDirTr, + 'u_frustum_br': frustumDirBr, + 'u_frustum_bl': frustumDirBl, + 'u_horizon': horizon, + 'u_transition': transitionT, + 'u_fadeout_range': fadeoutRange, + 'u_color': color, + 'u_high_color': highColor, + 'u_space_color': spaceColor, + 'u_star_intensity': starIntensity, + 'u_star_size': 5.0 * ref_properties.exported.devicePixelRatio, + 'u_star_density': 0.0, + 'u_temporal_offset': temporalOffset, + 'u_horizon_angle': horizonAngle, + 'u_rotation_matrix': rotationMatrix +}); - this._layers = {}; - this._serializedLayers = {}; - for (let layer of layers) { - layer = transform.createStyleLayer(layer); - layer.setEventedParent(this, {layer: {id: layer.id}}); - this._layers[layer.id] = layer; - this._serializedLayers[layer.id] = layer.serialize(); - this._updateLayerCount(layer, true); - } +// - this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order)); + + + + + + + + - this.light = new Light(this.stylesheet.light); - if (this.stylesheet.terrain && !this.terrainSetForDrapingOnly()) { - this._createTerrain(this.stylesheet.terrain, DrapeRenderMode.elevated); - } - if (this.stylesheet.fog) { - this._createFog(this.stylesheet.fog); - } - this._updateDrapeFirstLayers(); +class VertexMorphing { + - this.fire(new transform.Event('data', {dataType: 'style'})); - this.fire(new transform.Event('style.load')); + constructor() { + this.operations = {}; } - terrainSetForDrapingOnly() { - return this.terrain && this.terrain.drapeRenderMode === DrapeRenderMode.deferred; - } + newMorphing(key , from , to , now , duration ) { + ref_properties.assert_1(from.demTexture && to.demTexture); + ref_properties.assert_1(from.tileID.key !== to.tileID.key); - setProjection(projection ) { - if (projection) { - this.stylesheet.projection = projection; + if (key in this.operations) { + const op = this.operations[key]; + ref_properties.assert_1(op.from && op.to); + // Queue the target tile unless it's being morphed to already + if (op.to.tileID.key !== to.tileID.key) + op.queued = to; } else { - delete this.stylesheet.projection; + this.operations[key] = { + startTime: now, + phase: 0.0, + duration, + from, + to, + queued: null + }; } - this.updateProjection(); } - updateProjection() { - const prevProjection = this.map.transform.projection; - const projectionChanged = this.map.transform.setProjection(this.map._runtimeProjection || (this.stylesheet ? this.stylesheet.projection : undefined)); - const projection = this.map.transform.projection; - - if (this._loaded) { - if (projection.requiresDraping) { - const hasTerrain = this.getTerrain() || this.stylesheet.terrain; - if (!hasTerrain) { - this.setTerrainForDraping(); - } - } else if (this.terrainSetForDrapingOnly()) { - this.setTerrain(null); - } - } + getMorphValuesForProxy(key ) { + if (!(key in this.operations)) + return null; - this.dispatcher.broadcast('setProjection', this.map.transform.projectionOptions); + const op = this.operations[key]; + const from = op.from; + const to = op.to; + ref_properties.assert_1(from && to); - if (!projectionChanged) return; + return {from, to, phase: op.phase}; + } - if (projection.isReprojectedInTileSpace || prevProjection.isReprojectedInTileSpace) { - this.map.painter.clearBackgroundTiles(); - for (const id in this._sourceCaches) { - this._sourceCaches[id].clearTiles(); - } - } else { - this._forceSymbolLayerUpdate(); - } + update(now ) { + for (const key in this.operations) { + const op = this.operations[key]; + ref_properties.assert_1(op.from && op.to); - this.map._update(true); - } + op.phase = (now - op.startTime) / op.duration; - _loadSprite(url ) { - this._spriteRequest = loadSprite(url, this.map._requestManager, (err, images) => { - this._spriteRequest = null; - if (err) { - this.fire(new transform.ErrorEvent(err)); - } else if (images) { - for (const id in images) { - this.imageManager.addImage(id, images[id]); + // Start the queued operation if the current one is finished or the data has expired + while (op.phase >= 1.0 || !this._validOp(op)) { + if (!this._nextOp(op, now)) { + delete this.operations[key]; + break; } } - - this.imageManager.setLoaded(true); - this._availableImages = this.imageManager.listImages(); - this.dispatcher.broadcast('setImages', this._availableImages); - this.dispatcher.broadcast('spriteLoaded', true); - this.fire(new transform.Event('data', {dataType: 'style'})); - }); - } - - _validateLayer(layer ) { - const source = this.getSource(layer.source); - if (!source) { - return; - } - - const sourceLayer = layer.sourceLayer; - if (!sourceLayer) { - return; - } - - if (source.type === 'geojson' || (source.vectorLayerIds && source.vectorLayerIds.indexOf(sourceLayer) === -1)) { - this.fire(new transform.ErrorEvent(new Error( - `Source layer "${sourceLayer}" ` + - `does not exist on source "${source.id}" ` + - `as specified by style layer "${layer.id}"` - ))); } } - loaded() { - if (!this._loaded) - return false; - - if (Object.keys(this._updatedSources).length) - return false; - - for (const id in this._sourceCaches) - if (!this._sourceCaches[id].loaded()) - return false; - - if (!this.imageManager.isLoaded()) + _nextOp(op , now ) { + if (!op.queued) return false; - + op.from = op.to; + op.to = op.queued; + op.queued = null; + op.phase = 0.0; + op.startTime = now; return true; } - _serializeLayers(ids ) { - const serializedLayers = []; - for (const id of ids) { - const layer = this._layers[id]; - if (layer.type !== 'custom') { - serializedLayers.push(layer.serialize()); - } - } - return serializedLayers; + _validOp(op ) { + return op.from.hasData() && op.to.hasData(); } +} - hasTransitions() { - if (this.light && this.light.hasTransition()) { - return true; - } - - if (this.fog && this.fog.hasTransition()) { - return true; - } - - for (const id in this._sourceCaches) { - if (this._sourceCaches[id].hasTransition()) { - return true; - } - } - - for (const id in this._layers) { - if (this._layers[id].hasTransition()) { - return true; - } - } - +function demTileChanged(prev , next ) { + if (prev == null || next == null) return false; - } - - get order() { - if (this.map._optimizeForTerrain && this.terrain) { - transform.assert_1(this._drapedFirstOrder.length === this._order.length); - return this._drapedFirstOrder; - } - return this._order; - } + if (!prev.hasData() || !next.hasData()) + return false; + if (prev.demTexture == null || next.demTexture == null) + return false; + return prev.tileID.key !== next.tileID.key; +} - isLayerDraped(layer ) { - if (!this.terrain) return false; - return drapedLayers[layer.type]; - } +const vertexMorphing = new VertexMorphing(); +const SHADER_DEFAULT = 0; +const SHADER_MORPHING = 1; +const SHADER_TERRAIN_WIREFRAME = 2; +const defaultDuration = 250; - _checkLoaded() { - if (!this._loaded) { - throw new Error('Style is not done loading'); - } - } +const shaderDefines = { + "0": null, + "1": 'TERRAIN_VERTEX_MORPHING', + "2": 'TERRAIN_WIREFRAME' +}; - /** - * Apply queued style updates in a batch and recalculate zoom-dependent paint properties. - * @private - */ - update(parameters ) { - if (!this._loaded) { - return; - } +function drawTerrainForGlobe(painter , terrain , sourceCache , tileIDs , now ) { + const context = painter.context; + const gl = context.gl; - const changed = this._changed; - if (this._changed) { - const updatedIds = Object.keys(this._updatedLayers); - const removedIds = Object.keys(this._removedLayers); + let program, programMode; + const showWireframe = painter.options.showTerrainWireframe ? SHADER_TERRAIN_WIREFRAME : SHADER_DEFAULT; + const tr = painter.transform; + const useCustomAntialiasing = ref_properties.globeUseCustomAntiAliasing(painter, context, tr); - if (updatedIds.length || removedIds.length) { - this._updateWorkerLayers(updatedIds, removedIds); - } - for (const id in this._updatedSources) { - const action = this._updatedSources[id]; - transform.assert_1(action === 'reload' || action === 'clear'); - if (action === 'reload') { - this._reloadSource(id); - } else if (action === 'clear') { - this._clearSource(id); - } - } + const setShaderMode = (mode, isWireframe) => { + if (programMode === mode) return; + const defines = [shaderDefines[mode], 'PROJECTION_GLOBE_VIEW']; - this._updateTilesForChangedImages(); + if (useCustomAntialiasing) defines.push('CUSTOM_ANTIALIASING'); + if (isWireframe) defines.push(shaderDefines[showWireframe]); - for (const id in this._updatedPaintProps) { - this._layers[id].updateTransitions(parameters); - } + program = painter.useProgram('globeRaster', null, defines); + programMode = mode; + }; - this.light.updateTransitions(parameters); - if (this.fog) { - this.fog.updateTransitions(parameters); - } + const colorMode = painter.colorModeForRenderPass(); + const depthMode = new ref_properties.DepthMode(gl.LEQUAL, ref_properties.DepthMode.ReadWrite, painter.depthRangeFor3D); + vertexMorphing.update(now); + const globeMercatorMatrix = ref_properties.calculateGlobeMercatorMatrix(tr); + const mercatorCenter = [ref_properties.mercatorXfromLng(tr.center.lng), ref_properties.mercatorYfromLat(tr.center.lat)]; + const batches = showWireframe ? [false, true] : [false]; + const sharedBuffers = painter.globeSharedBuffers; + const viewport = [tr.width * ref_properties.exported.devicePixelRatio, tr.height * ref_properties.exported.devicePixelRatio]; - this._resetUpdates(); - } + batches.forEach(isWireframe => { + // This code assumes the rendering is batched into mesh terrain and then wireframe + // terrain (if applicable) so that this is enough to ensure the correct program is + // set when we switch from one to the other. + programMode = -1; - const sourcesUsedBefore = {}; + const primitive = isWireframe ? gl.LINES : gl.TRIANGLES; - for (const sourceId in this._sourceCaches) { - const sourceCache = this._sourceCaches[sourceId]; - sourcesUsedBefore[sourceId] = sourceCache.used; - sourceCache.used = false; - } + for (const coord of tileIDs) { + const tile = sourceCache.getTile(coord); + const stencilMode = ref_properties.StencilMode.disabled; - for (const layerId of this._order) { - const layer = this._layers[layerId]; + const prevDemTile = terrain.prevTerrainTileForTile[coord.key]; + const nextDemTile = terrain.terrainTileForTile[coord.key]; - layer.recalculate(parameters, this._availableImages); - if (!layer.isHidden(parameters.zoom)) { - const sourceCache = this._getLayerSourceCache(layer); - if (sourceCache) sourceCache.used = true; + if (demTileChanged(prevDemTile, nextDemTile)) { + vertexMorphing.newMorphing(coord.key, prevDemTile, nextDemTile, now, defaultDuration); } - const painter = this.map.painter; - if (painter) { - const programIds = layer.getProgramIds(); - if (!programIds) continue; + // Bind the main draped texture + context.activeTexture.set(gl.TEXTURE0); + tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - const programConfiguration = layer.getProgramConfiguration(parameters.zoom); + const morph = vertexMorphing.getMorphValuesForProxy(coord.key); + const shaderMode = morph ? SHADER_MORPHING : SHADER_DEFAULT; + const elevationOptions = {useDenormalizedUpVectorScale: true}; - for (const programId of programIds) { - painter.useProgram(programId, programConfiguration); - } + if (morph) { + ref_properties.extend$1(elevationOptions, {morphing: {srcDemTile: morph.from, dstDemTile: morph.to, phase: ref_properties.easeCubicInOut(morph.phase)}}); } - } - for (const sourceId in sourcesUsedBefore) { - const sourceCache = this._sourceCaches[sourceId]; - if (sourcesUsedBefore[sourceId] !== sourceCache.used) { - sourceCache.getSource().fire(new transform.Event('data', {sourceDataType: 'visibility', dataType:'source', sourceId: sourceCache.getSource().id})); - } - } + const globeMatrix = Float32Array.from(tr.globeMatrix); + const tileCornersLatLng = ref_properties.globeTileLatLngCorners(coord.canonical); + const tileCenterLatitude = (tileCornersLatLng[0][0] + tileCornersLatLng[1][0]) / 2.0; + const latitudinalLod = ref_properties.getLatitudinalLod(tileCenterLatitude); + const gridMatrix = ref_properties.getGridMatrix(coord.canonical, tileCornersLatLng, latitudinalLod); + const normalizeMatrix = ref_properties.globeNormalizeECEF(ref_properties.globeTileBounds(coord.canonical)); + const uniformValues = globeRasterUniformValues( + tr.projMatrix, globeMatrix, globeMercatorMatrix, normalizeMatrix, ref_properties.globeToMercatorTransition(tr.zoom), + mercatorCenter, tr.frustumCorners.TL, tr.frustumCorners.TR, tr.frustumCorners.BR, + tr.frustumCorners.BL, tr.globeCenterInViewSpace, tr.globeRadius, viewport, gridMatrix); - this.light.recalculate(parameters); - if (this.terrain) { - this.terrain.recalculate(parameters); - } - if (this.fog) { - this.fog.recalculate(parameters); - } - this.z = parameters.zoom; + setShaderMode(shaderMode, isWireframe); - if (this._markersNeedUpdate) { - this._updateMarkersOpacity(); - this._markersNeedUpdate = false; - } + terrain.setupElevationDraw(tile, program, elevationOptions); - if (changed) { - this.fire(new transform.Event('data', {dataType: 'style'})); - } - } + painter.prepareDrawProgram(context, program, coord.toUnwrapped()); - /* - * Apply any queued image changes. - */ - _updateTilesForChangedImages() { - const changedImages = Object.keys(this._changedImages); - if (changedImages.length) { - for (const name in this._sourceCaches) { - this._sourceCaches[name].reloadTilesForDependencies(['icons', 'patterns'], changedImages); + if (sharedBuffers) { + const [buffer, indexBuffer, segments] = isWireframe ? + sharedBuffers.getWirefameBuffers(painter.context, latitudinalLod) : + sharedBuffers.getGridBuffers(latitudinalLod); + + program.draw(context, primitive, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.backCCW, + uniformValues, "globe_raster", buffer, indexBuffer, segments); } - this._changedImages = {}; } - } - - _updateWorkerLayers(updatedIds , removedIds ) { - this.dispatcher.broadcast('updateLayers', { - layers: this._serializeLayers(updatedIds), - removedIds - }); - } - - _resetUpdates() { - this._changed = false; + }); - this._updatedLayers = {}; - this._removedLayers = {}; + // Render the poles. + if (sharedBuffers) { + const defines = ['GLOBE_POLES', 'PROJECTION_GLOBE_VIEW']; + if (useCustomAntialiasing) defines.push('CUSTOM_ANTIALIASING'); - this._updatedSources = {}; - this._updatedPaintProps = {}; + program = painter.useProgram('globeRaster', null, defines); + for (const coord of tileIDs) { + // Fill poles by extrapolating adjacent border tiles + const {x, y, z} = coord.canonical; + const topCap = y === 0; + const bottomCap = y === (1 << z) - 1; - this._changedImages = {}; - } + const [northPoleBuffer, southPoleBuffer, indexBuffer, segment] = sharedBuffers.getPoleBuffers(z); - /** - * 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 - */ - setState(nextState ) { - this._checkLoaded(); + if (segment && (topCap || bottomCap)) { + const tile = sourceCache.getTile(coord); - if (emitValidationErrors(this, transform.validateStyle(nextState))) return false; + // Bind the main draped texture + context.activeTexture.set(gl.TEXTURE0); + tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - nextState = transform.clone$1(nextState); - nextState.layers = derefLayers(nextState.layers); + let poleMatrix = ref_properties.globePoleMatrixForTile(z, x, tr); + const normalizeMatrix = ref_properties.globeNormalizeECEF(ref_properties.globeTileBounds(coord.canonical)); - const changes = diffStyles(this.serialize(), nextState) - .filter(op => !(op.command in ignoredDiffOperations)); + const drawPole = (program, vertexBuffer) => program.draw( + context, gl.TRIANGLES, depthMode, ref_properties.StencilMode.disabled, colorMode, ref_properties.CullFaceMode.disabled, + globeRasterUniformValues(tr.projMatrix, poleMatrix, poleMatrix, normalizeMatrix, 0.0, mercatorCenter, + tr.frustumCorners.TL, tr.frustumCorners.TR, tr.frustumCorners.BR, tr.frustumCorners.BL, + tr.globeCenterInViewSpace, tr.globeRadius, viewport), "globe_pole_raster", vertexBuffer, + indexBuffer, segment); - if (changes.length === 0) { - return false; - } + terrain.setupElevationDraw(tile, program, {}); - const unimplementedOps = changes.filter(op => !(op.command in supportedDiffOperations)); - if (unimplementedOps.length > 0) { - throw new Error(`Unimplemented: ${unimplementedOps.map(op => op.command).join(', ')}.`); - } + painter.prepareDrawProgram(context, program, coord.toUnwrapped()); - changes.forEach((op) => { - if (op.command === 'setTransition') { - // `transition` is always read directly off of - // `this.stylesheet`, which we update below - return; + if (topCap) { + drawPole(program, northPoleBuffer); + } + if (bottomCap) { + poleMatrix = ref_properties.scale$1(ref_properties.create(), poleMatrix, [1, -1, 1]); + drawPole(program, southPoleBuffer); + } } - (this )[op.command].apply(this, op.args); - }); - - this.stylesheet = nextState; - this.updateProjection(); - - return true; - } - - addImage(id , image ) { - if (this.getImage(id)) { - return this.fire(new transform.ErrorEvent(new Error('An image with this name already exists.'))); } - this.imageManager.addImage(id, image); - this._afterImageUpdated(id); - } - - updateImage(id , image ) { - this.imageManager.updateImage(id, image); - } - - getImage(id ) { - return this.imageManager.getImage(id); } +} - removeImage(id ) { - if (!this.getImage(id)) { - return this.fire(new transform.ErrorEvent(new Error('No image with this name exists.'))); - } - this.imageManager.removeImage(id); - this._afterImageUpdated(id); - } +function drawTerrainRaster(painter , terrain , sourceCache , tileIDs , now ) { + if (painter.transform.projection.name === 'globe') { + drawTerrainForGlobe(painter, terrain, sourceCache, tileIDs, now); + } else { + const context = painter.context; + const gl = context.gl; - _afterImageUpdated(id ) { - this._availableImages = this.imageManager.listImages(); - this._changedImages[id] = true; - this._changed = true; - this.dispatcher.broadcast('setImages', this._availableImages); - this.fire(new transform.Event('data', {dataType: 'style'})); - } + let program, programMode; + const showWireframe = painter.options.showTerrainWireframe ? SHADER_TERRAIN_WIREFRAME : SHADER_DEFAULT; - listImages() { - this._checkLoaded(); - return this._availableImages.slice(); - } + const setShaderMode = (mode, isWireframe) => { + if (programMode === mode) + return; + const modes = [shaderDefines[mode]]; + if (isWireframe) modes.push(shaderDefines[showWireframe]); + program = painter.useProgram('terrainRaster', null, modes); + programMode = mode; + }; - addSource(id , source , options = {}) { - this._checkLoaded(); + const colorMode = painter.colorModeForRenderPass(); + const depthMode = new ref_properties.DepthMode(gl.LEQUAL, ref_properties.DepthMode.ReadWrite, painter.depthRangeFor3D); + vertexMorphing.update(now); + const tr = painter.transform; + const skirt = skirtHeight(tr.zoom) * terrain.exaggeration(); - if (this.getSource(id) !== undefined) { - throw new Error('There is already a source with this ID'); - } + const batches = showWireframe ? [false, true] : [false]; - if (!source.type) { - throw new Error(`The type property must be defined, but only the following properties were given: ${Object.keys(source).join(', ')}.`); - } + batches.forEach(isWireframe => { + // This code assumes the rendering is batched into mesh terrain and then wireframe + // terrain (if applicable) so that this is enough to ensure the correct program is + // set when we switch from one to the other. + programMode = -1; - const builtIns = ['vector', 'raster', 'geojson', 'video', 'image']; - const shouldValidate = builtIns.indexOf(source.type) >= 0; - if (shouldValidate && this._validate(transform.validateStyle.source, `sources.${id}`, source, null, options)) return; + const primitive = isWireframe ? gl.LINES : gl.TRIANGLES; + const [buffer, segments] = isWireframe ? terrain.getWirefameBuffer() : [terrain.gridIndexBuffer, terrain.gridSegments]; - if (this.map && this.map._collectResourceTiming) (source ).collectResourceTiming = true; + for (const coord of tileIDs) { + const tile = sourceCache.getTile(coord); + const stencilMode = ref_properties.StencilMode.disabled; - const sourceInstance = create(id, source, this.dispatcher, this); + const prevDemTile = terrain.prevTerrainTileForTile[coord.key]; + const nextDemTile = terrain.terrainTileForTile[coord.key]; - sourceInstance.setEventedParent(this, () => ({ - isSourceLoaded: this.loaded(), - source: sourceInstance.serialize(), - sourceId: id - })); + if (demTileChanged(prevDemTile, nextDemTile)) { + vertexMorphing.newMorphing(coord.key, prevDemTile, nextDemTile, now, defaultDuration); + } - const addSourceCache = (onlySymbols) => { - const sourceCacheId = (onlySymbols ? 'symbol:' : 'other:') + id; - const sourceCache = this._sourceCaches[sourceCacheId] = new transform.SourceCache(sourceCacheId, sourceInstance, onlySymbols); - (onlySymbols ? this._symbolSourceCaches : this._otherSourceCaches)[id] = sourceCache; - sourceCache.style = this; + // Bind the main draped texture + context.activeTexture.set(gl.TEXTURE0); + tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); - sourceCache.onAdd(this.map); - }; + const morph = vertexMorphing.getMorphValuesForProxy(coord.key); + const shaderMode = morph ? SHADER_MORPHING : SHADER_DEFAULT; + let elevationOptions; - addSourceCache(false); - if (source.type === 'vector' || source.type === 'geojson') { - addSourceCache(true); - } + if (morph) { + elevationOptions = {morphing: {srcDemTile: morph.from, dstDemTile: morph.to, phase: ref_properties.easeCubicInOut(morph.phase)}}; + } - if (sourceInstance.onAdd) sourceInstance.onAdd(this.map); + const uniformValues = terrainRasterUniformValues(coord.projMatrix, isEdgeTile(coord.canonical, tr.renderWorldCopies) ? skirt / 10 : skirt); + setShaderMode(shaderMode, isWireframe); - this._changed = true; - } + terrain.setupElevationDraw(tile, program, elevationOptions); - /** - * 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. - * @returns {Map} The {@link Map} object. - */ - removeSource(id ) { - this._checkLoaded(); + painter.prepareDrawProgram(context, program, coord.toUnwrapped()); - const source = this.getSource(id); - if (source === undefined) { - throw new Error('There is no source with this ID'); - } - for (const layerId in this._layers) { - if (this._layers[layerId].source === id) { - return this.fire(new transform.ErrorEvent(new Error(`Source "${id}" cannot be removed while layer "${layerId}" is using it.`))); + program.draw(context, primitive, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.backCCW, + uniformValues, "terrain_raster", terrain.gridBuffer, buffer, segments); } - } - if (this.terrain && this.terrain.get().source === id) { - return this.fire(new transform.ErrorEvent(new Error(`Source "${id}" cannot be removed while terrain is using it.`))); - } - - const sourceCaches = this._getSourceCaches(id); - for (const sourceCache of sourceCaches) { - delete this._sourceCaches[sourceCache.id]; - delete this._updatedSources[sourceCache.id]; - sourceCache.fire(new transform.Event('data', {sourceDataType: 'metadata', dataType:'source', sourceId: sourceCache.getSource().id})); - sourceCache.setEventedParent(null); - sourceCache.clearTiles(); - } - delete this._otherSourceCaches[id]; - delete this._symbolSourceCaches[id]; + }); + } +} - source.setEventedParent(null); - if (source.onRemove) { - source.onRemove(this.map); - } - this._changed = true; +function drawTerrainDepth(painter , terrain , sourceCache , tileIDs ) { + if (painter.transform.projection.name === 'globe') { + return; } - /** - * Set the data of a GeoJSON source, given its ID. - * @param {string} id ID of the source. - * @param {GeoJSON|string} data GeoJSON source. - */ - setGeoJSONSourceData(id , data ) { - this._checkLoaded(); + ref_properties.assert_1(painter.renderPass === 'offscreen'); - transform.assert_1(this.getSource(id) !== undefined, 'There is no source with this ID'); - const geojsonSource = (this.getSource(id) ); - transform.assert_1(geojsonSource.type === 'geojson'); + const context = painter.context; + const gl = context.gl; - geojsonSource.setData(data); - this._changed = true; - } + context.clear({depth: 1}); + const program = painter.useProgram('terrainDepth'); + const depthMode = new ref_properties.DepthMode(gl.LESS, ref_properties.DepthMode.ReadWrite, painter.depthRangeFor3D); - /** - * Get a source by ID. - * @param {string} id ID of the desired source. - * @returns {Object} The source object. - */ - getSource(id ) { - const sourceCache = this._getSourceCache(id); - return sourceCache && sourceCache.getSource(); + for (const coord of tileIDs) { + const tile = sourceCache.getTile(coord); + const uniformValues = terrainRasterUniformValues(coord.projMatrix, 0); + terrain.setupElevationDraw(tile, program); + + program.draw(context, gl.TRIANGLES, depthMode, ref_properties.StencilMode.disabled, ref_properties.ColorMode.unblended, ref_properties.CullFaceMode.backCCW, + uniformValues, "terrain_depth", terrain.gridBuffer, terrain.gridIndexBuffer, terrain.gridNoSkirtSegments); } +} - /** - * 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 {Object | CustomLayerInterface} layerObject The style layer to add. - * @param {string} [before] ID of an existing layer to insert before. - * @param {Object} options Style setter options. - * @returns {Map} The {@link Map} object. - */ - addLayer(layerObject , before , options = {}) { - this._checkLoaded(); +function skirtHeight(zoom) { + // Skirt height calculation is heuristic: provided value hides + // seams between tiles and it is not too large: 9 at zoom 22, ~20000m at zoom 0. + return 6 * Math.pow(1.5, 22 - zoom); +} - const id = layerObject.id; +function isEdgeTile(cid , renderWorldCopies ) { + const numTiles = 1 << cid.z; + return (!renderWorldCopies && (cid.x === 0 || cid.x === numTiles - 1)) || cid.y === 0 || cid.y === numTiles - 1; +} - if (this.getLayer(id)) { - this.fire(new transform.ErrorEvent(new Error(`Layer with id "${id}" already exists on this map`))); - return; - } +// - let layer; - if (layerObject.type === 'custom') { + + - if (emitValidationErrors(this, transform.validateCustomStyleLayer(layerObject))) return; + + + - layer = transform.createStyleLayer(layerObject); +const clippingMaskUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix) +}); - } else { - if (typeof layerObject.source === 'object') { - this.addSource(id, layerObject.source); - layerObject = transform.clone$1(layerObject); - layerObject = (transform.extend(layerObject, {source: id}) ); - } +const clippingMaskUniformValues = (matrix ) => ({ + 'u_matrix': matrix +}); - // this layer is not in the style.layers array, so we pass an impossible array index - if (this._validate(transform.validateStyle.layer, - `layers.${id}`, layerObject, {arrayIndex: -1}, options)) return; +// + - layer = transform.createStyleLayer(layerObject); - this._validateLayer(layer); + + + + - layer.setEventedParent(this, {layer: {id}}); - this._serializedLayers[layer.id] = layer.serialize(); - this._updateLayerCount(layer, true); - } +function rasterFade(tile , parentTile , sourceCache , transform , fadeDuration ) { + if (fadeDuration > 0) { + const now = ref_properties.exported.now(); + const sinceTile = (now - tile.timeAdded) / fadeDuration; + const sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1; - const index = before ? this._order.indexOf(before) : this._order.length; - if (before && index === -1) { - this.fire(new transform.ErrorEvent(new Error(`Layer with id "${before}" does not exist on this map.`))); - return; - } + const source = sourceCache.getSource(); + const idealZ = transform.coveringZoomLevel({ + tileSize: source.tileSize, + roundZoom: source.roundZoom + }); - this._order.splice(index, 0, id); - this._layerOrderChanged = true; + // if no parent or parent is older, fade in; if parent is younger, fade out + const fadeIn = !parentTile || Math.abs(parentTile.tileID.overscaledZ - idealZ) > Math.abs(tile.tileID.overscaledZ - idealZ); - this._layers[id] = layer; + const childOpacity = (fadeIn && tile.refreshedUponExpiration) ? 1 : ref_properties.clamp(fadeIn ? sinceTile : 1 - sinceParent, 0, 1); - const sourceCache = this._getLayerSourceCache(layer); - if (this._removedLayers[id] && layer.source && sourceCache && layer.type !== 'custom') { - // 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 - const removed = this._removedLayers[id]; - delete this._removedLayers[id]; - if (removed.type !== layer.type) { - this._updatedSources[layer.source] = 'clear'; - } else { - this._updatedSources[layer.source] = 'reload'; - sourceCache.pause(); - } - } - this._updateLayer(layer); + // 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 (layer.onAdd) { - layer.onAdd(this.map); + if (parentTile) { + return { + opacity: 1, + mix: 1 - childOpacity + }; + } else { + return { + opacity: childOpacity, + mix: 0 + }; } - - this._updateDrapeFirstLayers(); + } else { + return { + opacity: 1, + mix: 0 + }; } +} - /** - * 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. - */ - moveLayer(id , before ) { - this._checkLoaded(); - this._changed = true; +// - const layer = this._layers[id]; - if (!layer) { - this.fire(new transform.ErrorEvent(new Error(`The layer '${id}' does not exist in the map's style and cannot be moved.`))); - return; - } + + + + + + + + + + + - if (id === before) { - return; - } +const GRID_DIM = 128; - const index = this._order.indexOf(id); - this._order.splice(index, 1); +const FBO_POOL_SIZE = 5; +const RENDER_CACHE_MAX_SIZE = 50; - const newIndex = before ? this._order.indexOf(before) : this._order.length; - if (before && newIndex === -1) { - this.fire(new transform.ErrorEvent(new Error(`Layer with id "${before}" does not exist on this map.`))); - return; - } - this._order.splice(newIndex, 0, id); + + + + - this._layerOrderChanged = true; +class MockSourceCache extends ref_properties.SourceCache { + constructor(map ) { + const sourceSpec = {type: 'raster-dem', maxzoom: map.transform.maxZoom}; + const sourceDispatcher = new Dispatcher(getGlobalWorkerPool(), null); + const source = create('mock-dem', sourceSpec, sourceDispatcher, map.style); - this._updateDrapeFirstLayers(); - } + super('mock-dem', source, false); - /** - * 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 Map.event:error - */ - removeLayer(id ) { - this._checkLoaded(); + source.setEventedParent(this); - const layer = this._layers[id]; - if (!layer) { - this.fire(new transform.ErrorEvent(new Error(`The layer '${id}' does not exist in the map's style and cannot be removed.`))); - return; - } + this._sourceLoaded = true; + } - layer.setEventedParent(null); + _loadTile(tile , callback ) { + tile.state = 'loaded'; + callback(null); + } +} - this._updateLayerCount(layer, false); +/** + * Proxy source cache gets ideal screen tile cover coordinates. All the other + * source caches's coordinates get mapped to subrects of proxy coordinates (or + * vice versa, subrects of larger tiles from all source caches get mapped to + * full proxy tile). This happens on every draw call in Terrain.updateTileBinding. + * Approach is used here for terrain : all the visible source tiles of all the + * source caches get rendered to proxy source cache textures and then draped over + * terrain. It is in future reusable for handling overscalling as buckets could be + * constructed only for proxy tile content, not for full overscalled vector tile. + */ +class ProxySourceCache extends ref_properties.SourceCache { + + + - const index = this._order.indexOf(id); - this._order.splice(index, 1); + constructor(map ) { - this._layerOrderChanged = true; - this._changed = true; - this._removedLayers[id] = layer; - delete this._layers[id]; - delete this._serializedLayers[id]; - delete this._updatedLayers[id]; - delete this._updatedPaintProps[id]; + const source = create('proxy', { + type: 'geojson', + maxzoom: map.transform.maxZoom + }, new Dispatcher(getGlobalWorkerPool(), null), map.style); - if (layer.onRemove) { - layer.onRemove(this.map); - } + super('proxy', source, false); - this._updateDrapeFirstLayers(); - } + source.setEventedParent(this); - /** - * 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. - */ - getLayer(id ) { - return this._layers[id]; + // This source is not to be added as a map source: we use it's tile management. + // For that, initialize internal structures used for tile cover update. + this.map = ((this.getSource() ) ).map = map; + this.used = this._sourceLoaded = true; + this.renderCache = []; + this.renderCachePool = []; + this.proxyCachedFBO = {}; } - /** - * Checks if a specific layer is present within the style. - * - * @param {string} id ID of the desired layer. - * @returns {boolean} A boolean specifying if the given layer is present. - */ - hasLayer(id ) { - return id in this._layers; - } + // Override for transient nature of cover here: don't cache and retain. + update(transform , tileSize , updateForTerrain ) { // eslint-disable-line no-unused-vars + if (transform.freezeTileCoverage) { return; } + this.transform = transform; + const idealTileIDs = transform.coveringTiles({ + tileSize: this._source.tileSize, + minzoom: this._source.minzoom, + maxzoom: this._source.maxzoom, + roundZoom: this._source.roundZoom, + reparseOverscaled: this._source.reparseOverscaled + }); - /** - * Checks if a specific layer type is present within the style. - * - * @param {string} type Type of the desired layer. - * @returns {boolean} A boolean specifying if the given layer type is present. - */ - hasLayerType(type ) { - for (const layerId in this._layers) { - const layer = this._layers[layerId]; - if (layer.type === type) { - return true; + const incoming = idealTileIDs.reduce((acc, tileID) => { + acc[tileID.key] = ''; + if (!this._tiles[tileID.key]) { + const tile = new ref_properties.Tile(tileID, this._source.tileSize * tileID.overscaleFactor(), transform.tileZoom); + tile.state = 'loaded'; + this._tiles[tileID.key] = tile; + } + return acc; + }, {}); + + for (const id in this._tiles) { + if (!(id in incoming)) { + this.freeFBO(id); + this._tiles[id].unloadVectorData(); + delete this._tiles[id]; } } - return false; } - setLayerZoomRange(layerId , minzoom , maxzoom ) { - this._checkLoaded(); - - const layer = this.getLayer(layerId); - if (!layer) { - this.fire(new transform.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot have zoom extent.`))); - return; + freeFBO(id ) { + const fbos = this.proxyCachedFBO[id]; + if (fbos !== undefined) { + const fboIds = ((Object.values(fbos) ) ); + this.renderCachePool.push(...fboIds); + delete this.proxyCachedFBO[id]; } + } - if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) return; - - if (minzoom != null) { - layer.minzoom = minzoom; - } - if (maxzoom != null) { - layer.maxzoom = maxzoom; - } - this._updateLayer(layer); + deallocRenderCache() { + this.renderCache.forEach(fbo => fbo.fb.destroy()); + this.renderCache = []; + this.renderCachePool = []; + this.proxyCachedFBO = {}; } +} - setFilter(layerId , filter , options = {}) { - this._checkLoaded(); +/** + * Canonical, wrap and overscaledZ contain information of original source cache tile. + * This tile gets ortho-rendered to proxy tile (defined by proxyTileKey). + * `posMatrix` holds orthographic, scaling and translation information that is used + * for rendering original tile content to a proxy tile. Proxy tile covers whole + * or sub-rectangle of the original tile. + */ +class ProxiedTileID extends ref_properties.OverscaledTileID { + - const layer = this.getLayer(layerId); - if (!layer) { - this.fire(new transform.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be filtered.`))); - return; - } + constructor(tileID , proxyTileKey , projMatrix ) { + super(tileID.overscaledZ, tileID.wrap, tileID.canonical.z, tileID.canonical.x, tileID.canonical.y); + this.proxyTileKey = proxyTileKey; + this.projMatrix = projMatrix; + } +} - if (transform.deepEqual(layer.filter, filter)) { - return; - } + + - if (filter === null || filter === undefined) { - layer.filter = undefined; - this._updateLayer(layer); - return; - } +class Terrain extends ref_properties.Elevation { + + + + + + + + + + + + + + + + + + + + - if (this._validate(transform.validateStyle.filter, `layers.${layer.id}.filter`, filter, {layerType: layer.type}, options)) { - return; - } + + + + + - layer.filter = transform.clone$1(filter); - this._updateLayer(layer); - } + + + + + + + + + + - /** - * Get a layer's filter object. - * @param {string} layer The layer to inspect. - * @returns {*} The layer's filter, if any. - */ - getFilter(layer ) { - return transform.clone$1(this.getLayer(layer).filter); - } + - setLayoutProperty(layerId , name , value , options = {}) { - this._checkLoaded(); + + - const layer = this.getLayer(layerId); - if (!layer) { - this.fire(new transform.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be styled.`))); - return; - } + + + + + + constructor(painter , style ) { + super(); + this.painter = painter; + this.terrainTileForTile = {}; + this.prevTerrainTileForTile = {}; - if (transform.deepEqual(layer.getLayoutProperty(name), value)) return; + // Terrain rendering grid is 129x129 cell grid, made by 130x130 points. + // 130 vertices map to 128 DEM data + 1px padding on both sides. + // DEM texture is padded (1, 1, 1, 1) and padding pixels are backfilled + // by neighboring tile edges. This way we achieve tile stitching as + // edge vertices from neighboring tiles evaluate to the same 3D point. + const [triangleGridArray, triangleGridIndices, skirtIndicesOffset] = createGrid(GRID_DIM + 1); + const context = painter.context; + this.gridBuffer = context.createVertexBuffer(triangleGridArray, ref_properties.boundsAttributes.members); + this.gridIndexBuffer = context.createIndexBuffer(triangleGridIndices); + this.gridSegments = ref_properties.SegmentVector.simpleSegment(0, 0, triangleGridArray.length, triangleGridIndices.length); + this.gridNoSkirtSegments = ref_properties.SegmentVector.simpleSegment(0, 0, triangleGridArray.length, skirtIndicesOffset); + this.proxyCoords = []; + this.proxiedCoords = {}; + this._visibleDemTiles = []; + this._drapedRenderBatches = []; + this._sourceTilesOverlap = {}; + this.proxySourceCache = new ProxySourceCache(style.map); + this.orthoMatrix = ref_properties.create(); + ref_properties.ortho(this.orthoMatrix, 0, ref_properties.EXTENT, 0, ref_properties.EXTENT, 0, 1); + const gl = context.gl; + this._overlapStencilMode = new ref_properties.StencilMode({func: gl.GEQUAL, mask: 0xFF}, 0, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); + this._previousZoom = painter.transform.zoom; + this.pool = []; + this._findCoveringTileCache = {}; + this._tilesDirty = {}; + this.style = style; + this._useVertexMorphing = true; + this._exaggeration = 1; + this._mockSourceCache = new MockSourceCache(style.map); + } - layer.setLayoutProperty(name, value, options); - this._updateLayer(layer); + set style(style ) { + style.on('data', this._onStyleDataEvent.bind(this)); + style.on('neworder', this._checkRenderCacheEfficiency.bind(this)); + this._style = style; + this._checkRenderCacheEfficiency(); } - /** - * Get a layout property's value from a given layer. - * @param {string} layerId The layer to inspect. - * @param {string} name The name of the layout property. - * @returns {*} The property value. + /* + * Validate terrain and update source cache used for elevation. + * Explicitly pass transform to update elevation (Transform.updateElevation) + * before using transform for source cache update. + * cameraChanging is true when camera is zooming, panning or orbiting. */ - getLayoutProperty(layerId , name ) { - const layer = this.getLayer(layerId); - if (!layer) { - this.fire(new transform.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style.`))); - return; - } + update(style , transform , cameraChanging ) { + if (style && style.terrain) { + if (this._style !== style) { + this.style = style; + } + this.enabled = true; + const terrainProps = style.terrain.properties; + const isDrapeModeDeferred = style.terrain.drapeRenderMode === DrapeRenderMode.deferred; + this.sourceCache = isDrapeModeDeferred ? this._mockSourceCache : + ((style._getSourceCache(terrainProps.get('source')) ) ); + this._exaggeration = terrainProps.get('exaggeration'); - return layer.getLayoutProperty(name); - } + const updateSourceCache = () => { + if (this.sourceCache.used) { + ref_properties.warnOnce(`Raster DEM source '${this.sourceCache.id}' is used both for terrain and as layer source.\n` + + 'This leads to lower resolution of hillshade. For full hillshade resolution but higher memory consumption, define another raster DEM source.'); + } + // Lower tile zoom is sufficient for terrain, given the size of terrain grid. + const scaledDemTileSize = this.getScaledDemTileSize(); + // Dem tile needs to be parent or at least of the same zoom level as proxy tile. + // Tile cover roundZoom behavior is set to the same as for proxy (false) in SourceCache.update(). + this.sourceCache.update(transform, scaledDemTileSize, true); + // As a result of update, we get new set of tiles: reset lookup cache. + this.resetTileLookupCache(this.sourceCache.id); + }; - setPaintProperty(layerId , name , value , options = {}) { - this._checkLoaded(); + if (!this.sourceCache.usedForTerrain) { + // Init cache entry. + this.resetTileLookupCache(this.sourceCache.id); + // When toggling terrain on/off load available terrain tiles from cache + // before reading elevation at center. + this.sourceCache.usedForTerrain = true; + updateSourceCache(); + this._initializing = true; + } - const layer = this.getLayer(layerId); - if (!layer) { - this.fire(new transform.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be styled.`))); - return; - } + updateSourceCache(); + // Camera, when changing, gets constrained over terrain. Issue constrainCameraOverTerrain = true + // here to cover potential under terrain situation on data or style change. + transform.updateElevation(!cameraChanging); - if (transform.deepEqual(layer.getPaintProperty(name), value)) return; + // Reset tile lookup cache and update draped tiles coordinates. + this.resetTileLookupCache(this.proxySourceCache.id); + this.proxySourceCache.update(transform); - const requiresRelayout = layer.setPaintProperty(name, value, options); - if (requiresRelayout) { - this._updateLayer(layer); + this._emptyDEMTextureDirty = true; + } else { + this._disable(); } - - this._changed = true; - this._updatedPaintProps[layerId] = true; } - getPaintProperty(layer , name ) { - return this.getLayer(layer).getPaintProperty(name); + resetTileLookupCache(sourceCacheID ) { + this._findCoveringTileCache[sourceCacheID] = {}; } - setFeatureState(target , state ) { - this._checkLoaded(); - const sourceId = target.source; - const sourceLayer = target.sourceLayer; - const source = this.getSource(sourceId); - - if (source === undefined) { - this.fire(new transform.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`))); - return; - } - const sourceType = source.type; - if (sourceType === 'geojson' && sourceLayer) { - this.fire(new transform.ErrorEvent(new Error(`GeoJSON sources cannot have a sourceLayer parameter.`))); - return; - } - if (sourceType === 'vector' && !sourceLayer) { - this.fire(new transform.ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`))); - return; - } - if (target.id === undefined) { - this.fire(new transform.ErrorEvent(new Error(`The feature id parameter must be provided.`))); - } - - const sourceCaches = this._getSourceCaches(sourceId); - for (const sourceCache of sourceCaches) { - sourceCache.setFeatureState(sourceLayer, target.id, state); - } + getScaledDemTileSize() { + const demScale = this.sourceCache.getSource().tileSize / GRID_DIM; + const proxyTileSize = this.proxySourceCache.getSource().tileSize; + return demScale * proxyTileSize; } - removeFeatureState(target , key ) { - this._checkLoaded(); - const sourceId = target.source; - const source = this.getSource(sourceId); - - if (source === undefined) { - this.fire(new transform.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`))); - return; - } - - const sourceType = source.type; - const sourceLayer = sourceType === 'vector' ? target.sourceLayer : undefined; - - if (sourceType === 'vector' && !sourceLayer) { - this.fire(new transform.ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`))); - return; + _checkRenderCacheEfficiency() { + const renderCacheInfo = this.renderCacheEfficiency(this._style); + if (this._style.map._optimizeForTerrain) { + ref_properties.assert_1(renderCacheInfo.efficiency === 100); + } else if (renderCacheInfo.efficiency !== 100) { + ref_properties.warnOnce(`Terrain render cache efficiency is not optimal (${renderCacheInfo.efficiency}%) and performance + may be affected negatively, consider placing all background, fill and line layers before layer + with id '${renderCacheInfo.firstUndrapedLayer}' or create a map using optimizeForTerrain: true option.`); } + } - if (key && (typeof target.id !== 'string' && typeof target.id !== 'number')) { - this.fire(new transform.ErrorEvent(new Error(`A feature id is required to remove its specific state property.`))); - return; + _onStyleDataEvent(event ) { + if (event.coord && event.dataType === 'source') { + this._clearRenderCacheForTile(event.sourceCacheId, event.coord); + } else if (event.dataType === 'style') { + this._invalidateRenderCache = true; } + } - const sourceCaches = this._getSourceCaches(sourceId); - for (const sourceCache of sourceCaches) { - sourceCache.removeFeatureState(sourceLayer, target.id, key); + // Terrain + _disable() { + if (!this.enabled) return; + this.enabled = false; + this._sharedDepthStencil = undefined; + this.proxySourceCache.deallocRenderCache(); + if (this._style) { + for (const id in this._style._sourceCaches) { + this._style._sourceCaches[id].usedForTerrain = false; + } } } - getFeatureState(target ) { - this._checkLoaded(); - const sourceId = target.source; - const sourceLayer = target.sourceLayer; - const source = this.getSource(sourceId); - - if (source === undefined) { - this.fire(new transform.ErrorEvent(new Error(`The source '${sourceId}' does not exist in the map's style.`))); - return; - } - const sourceType = source.type; - if (sourceType === 'vector' && !sourceLayer) { - this.fire(new transform.ErrorEvent(new Error(`The sourceLayer parameter must be provided for vector source types.`))); - return; - } - if (target.id === undefined) { - this.fire(new transform.ErrorEvent(new Error(`The feature id parameter must be provided.`))); + destroy() { + this._disable(); + if (this._emptyDEMTexture) this._emptyDEMTexture.destroy(); + if (this._emptyDepthBufferTexture) this._emptyDepthBufferTexture.destroy(); + this.pool.forEach(fbo => fbo.fb.destroy()); + this.pool = []; + if (this._depthFBO) { + this._depthFBO.destroy(); + this._depthFBO = undefined; + this._depthTexture = undefined; } - - const sourceCaches = this._getSourceCaches(sourceId); - return sourceCaches[0].getFeatureState(sourceLayer, target.id); } - getTransition() { - return transform.extend({duration: 300, delay: 0}, this.stylesheet && this.stylesheet.transition); + // Implements Elevation::_source. + _source() { + return this.enabled ? this.sourceCache : null; } - serialize() { - const sources = {}; - for (const cacheId in this._sourceCaches) { - const source = this._sourceCaches[cacheId].getSource(); - if (!sources[source.id]) { - sources[source.id] = source.serialize(); - } - } - return transform.filterObject({ - version: this.stylesheet.version, - name: this.stylesheet.name, - metadata: this.stylesheet.metadata, - light: this.stylesheet.light, - terrain: this.stylesheet.terrain, - fog: this.stylesheet.fog, - 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, - projection: this.stylesheet.projection, - sources, - layers: this._serializeLayers(this._order) - }, (value) => { return value !== undefined; }); + // Implements Elevation::exaggeration. + exaggeration() { + return this._exaggeration; } - _updateLayer(layer ) { - this._updatedLayers[layer.id] = true; - const sourceCache = this._getLayerSourceCache(layer); - if (layer.source && !this._updatedSources[layer.source] && - //Skip for raster layers (https://github.com/mapbox/mapbox-gl-js/issues/7865) - sourceCache && - sourceCache.getSource().type !== 'raster') { - this._updatedSources[layer.source] = 'reload'; - sourceCache.pause(); - } - this._changed = true; - layer.invalidateCompiledFilter(); + get visibleDemTiles() { + return this._visibleDemTiles; + } + get drapeBufferSize() { + const extent = this.proxySourceCache.getSource().tileSize * 2; // *2 is to avoid upscaling bitmap on zoom. + return [extent, extent]; } - _flattenAndSortRenderedFeatures(sourceResults ) { - // Feature order is complicated. - // The order between features in two 2D layers is always determined by layer order. - // The order between features in two 3D layers is always determined by depth. - // The order between a feature in a 2D layer and a 3D layer is tricky: - // Most often layer order determines the feature order in this case. If - // a line layer is above a extrusion layer the line feature will be rendered - // above the extrusion. If the line layer is below the extrusion layer, - // it will be rendered below it. - // - // There is a weird case though. - // You have layers in this order: extrusion_layer_a, line_layer, extrusion_layer_b - // Each layer has a feature that overlaps the other features. - // The feature in extrusion_layer_a is closer than the feature in extrusion_layer_b so it is rendered above. - // The feature in line_layer is rendered above extrusion_layer_a. - // This means that that the line_layer feature is above the extrusion_layer_b feature despite - // it being in an earlier layer. + set useVertexMorphing(enable ) { + this._useVertexMorphing = enable; + } - const isLayer3D = layerId => this._layers[layerId].type === 'fill-extrusion'; + // For every renderable coordinate in every source cache, assign one proxy + // tile (see _setupProxiedCoordsForOrtho). Mapping of source tile to proxy + // tile is modeled by ProxiedTileID. In general case, source and proxy tile + // are of different zoom: ProxiedTileID.projMatrix models ortho, scale and + // translate from source to proxy. This matrix is used when rendering source + // tile to proxy tile's texture. + // One proxy tile can have multiple source tiles, or pieces of source tiles, + // that get rendered to it. + // For each proxy tile we assign one terrain tile (_assignTerrainTiles). The + // terrain tile provides elevation data when rendering (draping) proxy tile + // texture over terrain grid. + updateTileBinding(sourcesCoords ) { + if (!this.enabled) return; + this.prevTerrainTileForTile = this.terrainTileForTile; - const layerIndex = {}; - const features3D = []; - for (let l = this._order.length - 1; l >= 0; l--) { - const layerId = this._order[l]; - if (isLayer3D(layerId)) { - layerIndex[layerId] = l; - for (const sourceResult of sourceResults) { - const layerFeatures = sourceResult[layerId]; - if (layerFeatures) { - for (const featureWrapper of layerFeatures) { - features3D.push(featureWrapper); - } - } - } - } + const psc = this.proxySourceCache; + const tr = this.painter.transform; + if (this._initializing) { + // Don't activate terrain until center tile gets loaded. + this._initializing = tr._centerAltitude === 0 && this.getAtPointOrZero(ref_properties.MercatorCoordinate.fromLngLat(tr.center), -1) === -1; + this._emptyDEMTextureDirty = !this._initializing; } - features3D.sort((a, b) => { - return b.intersectionZ - a.intersectionZ; + const coords = this.proxyCoords = psc.getIds().map((id) => { + const tileID = psc.getTileByID(id).tileID; + tileID.projMatrix = tr.calculateProjMatrix(tileID.toUnwrapped()); + return tileID; }); + sortByDistanceToCamera(coords, this.painter); + this._previousZoom = tr.zoom; - const features = []; - for (let l = this._order.length - 1; l >= 0; l--) { - const layerId = this._order[l]; - - if (isLayer3D(layerId)) { - // add all 3D features that are in or above the current layer - for (let i = features3D.length - 1; i >= 0; i--) { - const topmost3D = features3D[i].feature; - if (layerIndex[topmost3D.layer.id] < l) break; - features.push(topmost3D); - features3D.pop(); - } - } else { - for (const sourceResult of sourceResults) { - const layerFeatures = sourceResult[layerId]; - if (layerFeatures) { - for (const featureWrapper of layerFeatures) { - features.push(featureWrapper.feature); - } - } - } - } - } - - return features; - } - - queryRenderedFeatures(queryGeometry , params , transform$1 ) { - if (params && params.filter) { - this._validate(transform.validateStyle.filter, 'queryRenderedFeatures.filter', params.filter, null, params); - } + const previousProxyToSource = this.proxyToSource || {}; + this.proxyToSource = {}; + coords.forEach((tileID) => { + this.proxyToSource[tileID.key] = {}; + }); - const includedSources = {}; - if (params && params.layers) { - if (!Array.isArray(params.layers)) { - this.fire(new transform.ErrorEvent(new Error('parameters.layers must be an Array.'))); - return []; - } - for (const layerId of params.layers) { - const layer = this._layers[layerId]; - if (!layer) { - // this layer is not in the style.layers array - this.fire(new transform.ErrorEvent(new Error(`The layer '${layerId}' does not exist in the map's style and cannot be queried for features.`))); - return []; - } - includedSources[layer.source] = true; + this.terrainTileForTile = {}; + const sourceCaches = this._style._sourceCaches; + for (const id in sourceCaches) { + const sourceCache = sourceCaches[id]; + if (!sourceCache.used) continue; + if (sourceCache !== this.sourceCache) this.resetTileLookupCache(sourceCache.id); + this._setupProxiedCoordsForOrtho(sourceCache, sourcesCoords[id], previousProxyToSource); + if (sourceCache.usedForTerrain) continue; + const coordinates = sourcesCoords[id]; + if (sourceCache.getSource().reparseOverscaled) { + // Do this for layers that are not rasterized to proxy tile. + this._assignTerrainTiles(coordinates); } } - const sourceResults = []; - - params.availableImages = this._availableImages; - - const has3DLayer = (params && params.layers) ? - params.layers.some((layerId) => { - const layer = this.getLayer(layerId); - return layer && layer.is3D(); - }) : - this.has3DLayers(); - const queryGeometryStruct = QueryGeometry.createFromScreenPoints(queryGeometry, transform$1); - - for (const id in this._sourceCaches) { - const sourceId = this._sourceCaches[id].getSource().id; - if (params.layers && !includedSources[sourceId]) continue; - sourceResults.push( - queryRenderedFeatures( - this._sourceCaches[id], - this._layers, - this._serializedLayers, - queryGeometryStruct, - params, - transform$1, - has3DLayer, - !!this.map._showQueryGeometry) - ); - } - - if (this.placement) { - // If a placement has run, query against its CollisionIndex - // for symbol results, and treat it as an extra source to merge - sourceResults.push( - queryRenderedSymbols( - this._layers, - this._serializedLayers, - this._getLayerSourceCache.bind(this), - queryGeometryStruct.screenGeometry, - params, - this.placement.collisionIndex, - this.placement.retainedQueryData) - ); - } - - return this._flattenAndSortRenderedFeatures(sourceResults); - } - - querySourceFeatures(sourceID , params ) { - if (params && params.filter) { - this._validate(transform.validateStyle.filter, 'querySourceFeatures.filter', params.filter, null, params); - } - const sourceCaches = this._getSourceCaches(sourceID); - let results = []; - for (const sourceCache of sourceCaches) { - results = results.concat(querySourceFeatures(sourceCache, params)); - } - return results; - } + // Background has no source. Using proxy coords with 1-1 ortho (this.proxiedCoords[psc.id]) + // when rendering background to proxy tiles. + this.proxiedCoords[psc.id] = coords.map(tileID => new ProxiedTileID(tileID, tileID.key, this.orthoMatrix)); + this._assignTerrainTiles(coords); + this._prepareDEMTextures(); + this._setupDrapedRenderBatches(); + this._initFBOPool(); + this._setupRenderCache(previousProxyToSource); - addSourceType(name , SourceType , callback ) { - if (Style.getSourceType(name)) { - return callback(new Error(`A source type called "${name}" already exists.`)); - } + this.renderingToTexture = false; + this._updateTimestamp = ref_properties.exported.now(); - Style.setSourceType(name, SourceType); + // Gather all dem tiles that are assigned to proxy tiles + const visibleKeys = {}; + this._visibleDemTiles = []; - if (!SourceType.workerSourceURL) { - return callback(null, null); + for (const id of this.proxyCoords) { + const demTile = this.terrainTileForTile[id.key]; + if (!demTile) + continue; + const key = demTile.tileID.key; + if (key in visibleKeys) + continue; + this._visibleDemTiles.push(demTile); + visibleKeys[key] = key; } - this.dispatcher.broadcast('loadWorkerSource', { - name, - url: SourceType.workerSourceURL - }, callback); } - getLight() { - return this.light.getLight(); + _assignTerrainTiles(coords ) { + if (this._initializing) return; + coords.forEach((tileID) => { + if (this.terrainTileForTile[tileID.key]) return; + const demTile = this._findTileCoveringTileID(tileID, this.sourceCache); + if (demTile) this.terrainTileForTile[tileID.key] = demTile; + }); } - setLight(lightOptions , options = {}) { - this._checkLoaded(); - - const light = this.light.getLight(); - let _update = false; - for (const key in lightOptions) { - if (!transform.deepEqual(lightOptions[key], light[key])) { - _update = true; - break; + _prepareDEMTextures() { + const context = this.painter.context; + const gl = context.gl; + for (const key in this.terrainTileForTile) { + const tile = this.terrainTileForTile[key]; + const dem = tile.dem; + if (dem && (!tile.demTexture || tile.needsDEMTextureUpload)) { + context.activeTexture.set(gl.TEXTURE1); + prepareDEMTexture(this.painter, tile, dem); } } - if (!_update) return; - - const parameters = { - now: transform.exported.now(), - transition: transform.extend({ - duration: 300, - delay: 0 - }, this.stylesheet.transition) - }; - - this.light.setLight(lightOptions, options); - this.light.updateTransitions(parameters); - } - - getTerrain() { - return this.terrain && this.terrain.drapeRenderMode === DrapeRenderMode.elevated ? this.terrain.get() : null; - } - - setTerrainForDraping() { - const mockTerrainOptions = {source: '', exaggeration: 0}; - this.setTerrain(mockTerrainOptions, DrapeRenderMode.deferred); } - // eslint-disable-next-line no-warning-comments - // TODO: generic approach for root level property: light, terrain, skybox. - // It is not done here to prevent rebasing issues. - setTerrain(terrainOptions , drapeRenderMode = DrapeRenderMode.elevated) { - this._checkLoaded(); - - // Disabling - if (!terrainOptions) { - delete this.terrain; - delete this.stylesheet.terrain; - this.dispatcher.broadcast('enableTerrain', false); - this._force3DLayerUpdate(); - this._markersNeedUpdate = true; - return; - } - - if (drapeRenderMode === DrapeRenderMode.elevated) { - // Input validation and source object unrolling - if (typeof terrainOptions.source === 'object') { - const id = 'terrain-dem-src'; - this.addSource(id, ((terrainOptions.source) )); - terrainOptions = transform.clone$1(terrainOptions); - terrainOptions = (transform.extend(terrainOptions, {source: id}) ); - } - - if (this._validate(transform.validateStyle.terrain, 'terrain', terrainOptions)) { - return; - } - } - - // Enabling - if (!this.terrain || (this.terrain && drapeRenderMode !== this.terrain.drapeRenderMode)) { - this._createTerrain(terrainOptions, drapeRenderMode); - } else { // Updating - const terrain = this.terrain; - const currSpec = terrain.get(); - for (const key in terrainOptions) { - if (!transform.deepEqual(terrainOptions[key], currSpec[key])) { - terrain.set(terrainOptions); - this.stylesheet.terrain = terrainOptions; - const parameters = { - now: transform.exported.now(), - transition: transform.extend({ - duration: 0 - }, this.stylesheet.transition) - }; - - terrain.updateTransitions(parameters); - break; - } - } - } + _prepareDemTileUniforms(proxyTile , demTile , uniforms , uniformSuffix ) { + if (!demTile || demTile.demTexture == null) + return false; - this._updateDrapeFirstLayers(); - this._markersNeedUpdate = true; + ref_properties.assert_1(demTile.dem); + const proxyId = proxyTile.tileID.canonical; + const demId = demTile.tileID.canonical; + const demScaleBy = Math.pow(2, demId.z - proxyId.z); + const suffix = uniformSuffix || ""; + uniforms[`u_dem_tl${suffix}`] = [proxyId.x * demScaleBy % 1, proxyId.y * demScaleBy % 1]; + uniforms[`u_dem_scale${suffix}`] = demScaleBy; + return true; } - _createFog(fogOptions ) { - const fog = this.fog = new Fog(fogOptions, this.map.transform); - this.stylesheet.fog = fogOptions; - const parameters = { - now: transform.exported.now(), - transition: transform.extend({ - duration: 0 - }, this.stylesheet.transition) - }; - - fog.updateTransitions(parameters); + get emptyDEMTexture() { + return !this._emptyDEMTextureDirty && this._emptyDEMTexture ? + this._emptyDEMTexture : this._updateEmptyDEMTexture(); } - _updateMarkersOpacity() { - if (this.map._markers.length === 0) { - return; + get emptyDepthBufferTexture() { + const context = this.painter.context; + const gl = context.gl; + if (!this._emptyDepthBufferTexture) { + const image = new ref_properties.RGBAImage({width: 1, height: 1}, Uint8Array.of(255, 255, 255, 255)); + this._emptyDepthBufferTexture = new ref_properties.Texture(context, image, gl.RGBA, {premultiply: false}); } - this.map._requestDomTask(() => { - for (const marker of this.map._markers) { - marker._evaluateOpacity(); - } - }); + return this._emptyDepthBufferTexture; } - getFog() { - return this.fog ? this.fog.get() : null; + _getLoadedAreaMinimum() { + let nonzero = 0; + const min = this._visibleDemTiles.reduce((acc, tile) => { + if (!tile.dem) return acc; + const m = tile.dem.tree.minimums[0]; + acc += m; + if (m > 0) nonzero++; + return acc; + }, 0); + return nonzero ? min / nonzero : 0; } - setFog(fogOptions ) { - this._checkLoaded(); + _updateEmptyDEMTexture() { + const context = this.painter.context; + const gl = context.gl; + context.activeTexture.set(gl.TEXTURE2); - if (!fogOptions) { - // Remove fog - delete this.fog; - delete this.stylesheet.fog; - this._markersNeedUpdate = true; - return; - } + const min = this._getLoadedAreaMinimum(); + const image = new ref_properties.RGBAImage( + {width: 1, height: 1}, + new Uint8Array(ref_properties.DEMData.pack(min, ((this.sourceCache.getSource() ) ).encoding)) + ); - if (!this.fog) { - // Initialize Fog - this._createFog(fogOptions); + this._emptyDEMTextureDirty = false; + let texture = this._emptyDEMTexture; + if (!texture) { + texture = this._emptyDEMTexture = new ref_properties.Texture(context, image, gl.RGBA, {premultiply: false}); } else { - // Updating fog - const fog = this.fog; - const currSpec = fog.get(); - for (const key in fogOptions) { - if (!transform.deepEqual(fogOptions[key], currSpec[key])) { - fog.set(fogOptions); - this.stylesheet.fog = fogOptions; - const parameters = { - now: transform.exported.now(), - transition: transform.extend({ - duration: 0 - }, this.stylesheet.transition) - }; - - fog.updateTransitions(parameters); - break; - } - } + texture.update(image, {premultiply: false}); } - - this._markersNeedUpdate = true; + return texture; } - _updateDrapeFirstLayers() { - if (!this.map._optimizeForTerrain || !this.terrain) { - return; - } + // useDepthForOcclusion: Pre-rendered depth to texture (this._depthTexture) is + // used to hide (actually moves all object's vertices out of viewport). + // useMeterToDem: u_meter_to_dem uniform is not used for all terrain programs, + // optimization to avoid unnecessary computation and upload. + setupElevationDraw(tile , program , + options + + + + + + ) { + const context = this.painter.context; + const gl = context.gl; + const uniforms = defaultTerrainUniforms(((this.sourceCache.getSource() ) ).encoding); + uniforms['u_dem_size'] = this.sourceCache.getSource().tileSize; + uniforms['u_exaggeration'] = this.exaggeration(); - const draped = this._order.filter((id) => { - return this.isLayerDraped(this._layers[id]); - }); + const tr = this.painter.transform; + const projection = tr.projection; - const nonDraped = this._order.filter((id) => { - return !this.isLayerDraped(this._layers[id]); - }); - this._drapedFirstOrder = []; - this._drapedFirstOrder.push(...draped); - this._drapedFirstOrder.push(...nonDraped); - } + const id = tile.tileID.canonical; + uniforms['u_tile_tl_up'] = (projection.upVector(id, 0, 0) ); + uniforms['u_tile_tr_up'] = (projection.upVector(id, ref_properties.EXTENT, 0) ); + uniforms['u_tile_br_up'] = (projection.upVector(id, ref_properties.EXTENT, ref_properties.EXTENT) ); + uniforms['u_tile_bl_up'] = (projection.upVector(id, 0, ref_properties.EXTENT) ); + if (options && options.useDenormalizedUpVectorScale) { + uniforms['u_tile_up_scale'] = ref_properties.GLOBE_METERS_TO_ECEF; + } else { + uniforms['u_tile_up_scale'] = projection.upVectorScale(id, tr.center.lat, tr.worldSize).metersToTile; + } - _createTerrain(terrainOptions , drapeRenderMode ) { - const terrain = this.terrain = new Terrain(terrainOptions, drapeRenderMode); - this.stylesheet.terrain = terrainOptions; - this.dispatcher.broadcast('enableTerrain', true); - this._force3DLayerUpdate(); - const parameters = { - now: transform.exported.now(), - transition: transform.extend({ - duration: 0 - }, this.stylesheet.transition) - }; + let demTile = null; + let prevDemTile = null; + let morphingPhase = 1.0; - terrain.updateTransitions(parameters); - } + if (options && options.morphing && this._useVertexMorphing) { + const srcTile = options.morphing.srcDemTile; + const dstTile = options.morphing.dstDemTile; + morphingPhase = options.morphing.phase; - _force3DLayerUpdate() { - for (const layerId in this._layers) { - const layer = this._layers[layerId]; - if (layer.type === 'fill-extrusion') { - this._updateLayer(layer); + if (srcTile && dstTile) { + if (this._prepareDemTileUniforms(tile, srcTile, uniforms, "_prev")) + prevDemTile = srcTile; + if (this._prepareDemTileUniforms(tile, dstTile, uniforms)) + demTile = dstTile; } } - } - _forceSymbolLayerUpdate() { - for (const layerId in this._layers) { - const layer = this._layers[layerId]; - if (layer.type === 'symbol') { - this._updateLayer(layer); - } - } - } + if (prevDemTile && demTile) { + // Both DEM textures are expected to be correctly set if geomorphing is enabled + context.activeTexture.set(gl.TEXTURE2); + (demTile.demTexture ).bind(gl.NEAREST, gl.CLAMP_TO_EDGE, gl.NEAREST); + context.activeTexture.set(gl.TEXTURE4); + (prevDemTile.demTexture ).bind(gl.NEAREST, gl.CLAMP_TO_EDGE, gl.NEAREST); - _validate(validate , key , value , props , options = {}) { - if (options && options.validate === false) { - return false; + uniforms["u_dem_lerp"] = morphingPhase; + } else { + demTile = this.terrainTileForTile[tile.tileID.key]; + context.activeTexture.set(gl.TEXTURE2); + const demTexture = this._prepareDemTileUniforms(tile, demTile, uniforms) ? + (demTile.demTexture ) : this.emptyDEMTexture; + demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); } - return emitValidationErrors(this, validate.call(transform.validateStyle, transform.extend({ - key, - style: this.serialize(), - value, - styleSpec: transform.spec - }, props))); - } - _remove() { - if (this._request) { - this._request.cancel(); - this._request = null; - } - if (this._spriteRequest) { - this._spriteRequest.cancel(); - this._spriteRequest = null; + context.activeTexture.set(gl.TEXTURE3); + if (options && options.useDepthForOcclusion) { + if (this._depthTexture) this._depthTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); + if (this._depthFBO) uniforms['u_depth_size_inv'] = [1 / this._depthFBO.width, 1 / this._depthFBO.height]; + } else { + this.emptyDepthBufferTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); + uniforms['u_depth_size_inv'] = [1, 1]; } - transform.evented.off('pluginStateChange', this._rtlTextPluginCallback); - for (const layerId in this._layers) { - const layer = this._layers[layerId]; - layer.setEventedParent(null); + + if (options && options.useMeterToDem && demTile) { + const meterToDEM = (1 << demTile.tileID.canonical.z) * ref_properties.mercatorZfromAltitude(1, this.painter.transform.center.lat) * this.sourceCache.getSource().tileSize; + uniforms['u_meter_to_dem'] = meterToDEM; } - for (const id in this._sourceCaches) { - this._sourceCaches[id].clearTiles(); - this._sourceCaches[id].setEventedParent(null); + if (options && options.labelPlaneMatrixInv) { + uniforms['u_label_plane_matrix_inv'] = options.labelPlaneMatrixInv; } - this.imageManager.setEventedParent(null); - this.setEventedParent(null); - this.dispatcher.remove(); + program.setTerrainUniformValues(context, uniforms); } - _clearSource(id ) { - const sourceCaches = this._getSourceCaches(id); - for (const sourceCache of sourceCaches) { - sourceCache.clearTiles(); - } - } + renderToBackBuffer(accumulatedDrapes ) { + const painter = this.painter; + const context = this.painter.context; - _reloadSource(id ) { - const sourceCaches = this._getSourceCaches(id); - for (const sourceCache of sourceCaches) { - sourceCache.resume(); - sourceCache.reload(); + if (accumulatedDrapes.length === 0) { + return; } - } - _updateSources(transform ) { - for (const id in this._sourceCaches) { - this._sourceCaches[id].update(transform); - } + context.bindFramebuffer.set(null); + context.viewport.set([0, 0, painter.width, painter.height]); + + painter.gpuTimingDeferredRenderStart(); + + this.renderingToTexture = false; + drawTerrainRaster(painter, this, this.proxySourceCache, accumulatedDrapes, this._updateTimestamp); + this.renderingToTexture = true; + + painter.gpuTimingDeferredRenderEnd(); + + accumulatedDrapes.splice(0, accumulatedDrapes.length); } - _generateCollisionBoxes() { - for (const id in this._sourceCaches) { - const sourceCache = this._sourceCaches[id]; - sourceCache.resume(); - sourceCache.reload(); + // For each proxy tile, render all layers until the non-draped layer (and + // render the tile to the screen) before advancing to the next proxy tile. + // Returns the last drawn index that is used as a start + // layer for interleaved draped rendering. + // Apart to layer-by-layer rendering used in 2D, here we have proxy-tile-by-proxy-tile + // rendering. + renderBatch(startLayerIndex ) { + if (this._drapedRenderBatches.length === 0) { + return startLayerIndex + 1; } - } - _updatePlacement(transform$1 , showCollisionBoxes , fadeDuration , crossSourceCollisions , forceFullPlacement = false) { - let symbolBucketsChanged = false; - let placementCommitted = false; + this.renderingToTexture = true; + const painter = this.painter; + const context = this.painter.context; + const psc = this.proxySourceCache; + const proxies = this.proxiedCoords[psc.id]; - const layerTiles = {}; + // Consume batch of sequential drape layers and move next + const drapedLayerBatch = this._drapedRenderBatches.shift(); + ref_properties.assert_1(drapedLayerBatch.start === startLayerIndex); - for (const layerID of this._order) { - const styleLayer = this._layers[layerID]; - if (styleLayer.type !== 'symbol') continue; + const accumulatedDrapes = []; + const layerIds = painter.style.order; - if (!layerTiles[styleLayer.source]) { - const sourceCache = this._getLayerSourceCache(styleLayer); - if (!sourceCache) continue; - layerTiles[styleLayer.source] = sourceCache.getRenderableIds(true) - .map((id) => sourceCache.getTileByID(id)) - .sort((a, b) => (b.tileID.overscaledZ - a.tileID.overscaledZ) || (a.tileID.isLessThan(b.tileID) ? -1 : 1)); - } + let poolIndex = 0; + for (const proxy of proxies) { + // bind framebuffer and assign texture to the tile (texture used in drawTerrainRaster). + const tile = psc.getTileByID(proxy.proxyTileKey); + const renderCacheIndex = psc.proxyCachedFBO[proxy.key] ? psc.proxyCachedFBO[proxy.key][startLayerIndex] : undefined; + const fbo = renderCacheIndex !== undefined ? psc.renderCache[renderCacheIndex] : this.pool[poolIndex++]; + const useRenderCache = renderCacheIndex !== undefined; - const layerBucketsChanged = this.crossTileSymbolIndex.addLayer(styleLayer, layerTiles[styleLayer.source], transform$1.center.lng, transform$1.projection); - symbolBucketsChanged = symbolBucketsChanged || layerBucketsChanged; - } - this.crossTileSymbolIndex.pruneUnusedLayers(this._order); + tile.texture = fbo.tex; - // 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. - // Also force full placement when fadeDuration === 0 to ensure that newly loaded - // tiles will fully display symbols in their first frame - forceFullPlacement = forceFullPlacement || this._layerOrderChanged || fadeDuration === 0; + if (useRenderCache && !fbo.dirty) { + // Use cached render from previous pass, no need to render again. + accumulatedDrapes.push(tile.tileID); + continue; + } - if (this._layerOrderChanged) { - this.fire(new transform.Event('neworder')); - } + context.bindFramebuffer.set(fbo.fb.framebuffer); + this.renderedToTile = false; // reset flag. + if (fbo.dirty) { + // Clear on start. + context.clear({color: ref_properties.Color.transparent, stencil: 0}); + fbo.dirty = false; + } - if (forceFullPlacement || !this.pauseablePlacement || (this.pauseablePlacement.isDone() && !this.placement.stillRecent(transform.exported.now(), transform$1.zoom))) { - const fogState = this.fog && transform$1.projection.supportsFog ? this.fog.state : null; - this.pauseablePlacement = new PauseablePlacement(transform$1, this._order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions, this.placement, fogState); - this._layerOrderChanged = false; - } + let currentStencilSource; // There is no need to setup stencil for the same source for consecutive layers. + for (let j = drapedLayerBatch.start; j <= drapedLayerBatch.end; ++j) { + const layer = painter.style._layers[layerIds[j]]; + const hidden = layer.isHidden(painter.transform.zoom); + ref_properties.assert_1(this._style.isLayerDraped(layer) || hidden); + if (hidden) continue; - 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); + const sourceCache = painter.style._getLayerSourceCache(layer); + const proxiedCoords = sourceCache ? this.proxyToSource[proxy.key][sourceCache.id] : [proxy]; + if (!proxiedCoords) continue; // when tile is not loaded yet for the source cache. - if (this.pauseablePlacement.isDone()) { - this.placement = this.pauseablePlacement.commit(transform.exported.now()); - placementCommitted = true; + const coords = ((proxiedCoords ) ); + context.viewport.set([0, 0, fbo.fb.width, fbo.fb.height]); + if (currentStencilSource !== (sourceCache ? sourceCache.id : null)) { + this._setupStencil(fbo, proxiedCoords, layer, sourceCache); + currentStencilSource = sourceCache ? sourceCache.id : null; + } + painter.renderLayer(painter, sourceCache, layer, coords); } - 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 (this.renderedToTile) { + fbo.dirty = true; + accumulatedDrapes.push(tile.tileID); + } else if (!useRenderCache) { + --poolIndex; + ref_properties.assert_1(poolIndex >= 0); } - } - - if (placementCommitted || symbolBucketsChanged) { - for (const layerID of this._order) { - const styleLayer = this._layers[layerID]; - if (styleLayer.type !== 'symbol') continue; - this.placement.updateLayerOpacities(styleLayer, layerTiles[styleLayer.source]); + if (poolIndex === FBO_POOL_SIZE) { + poolIndex = 0; + this.renderToBackBuffer(accumulatedDrapes); } } - // needsRender is false when we have just finished a placement that didn't change the visibility of any symbols - const needsRerender = !this.pauseablePlacement.isDone() || this.placement.hasTransitions(transform.exported.now()); - return needsRerender; - } + // Reset states and render last drapes + this.renderToBackBuffer(accumulatedDrapes); + this.renderingToTexture = false; - _releaseSymbolFadeTiles() { - for (const id in this._sourceCaches) { - this._sourceCaches[id].releaseSymbolFadeTiles(); - } + context.bindFramebuffer.set(null); + context.viewport.set([0, 0, painter.width, painter.height]); + + return drapedLayerBatch.end + 1; } - // Callbacks from web workers + postRender() { + // Make sure we consumed all the draped terrain batches at this point + ref_properties.assert_1(this._drapedRenderBatches.length === 0); + } - getImages(mapId , params , callback ) { + renderCacheEfficiency(style ) { + const layerCount = style.order.length; - this.imageManager.getImages(params.icons, callback); + if (layerCount === 0) { + return {efficiency: 100.0}; + } - // Apply queued image changes before setting the tile's dependencies so that the tile - // is not reloaded unecessarily. Without this forced update the reload could happen in cases - // like this one: - // - icons contains "my-image" - // - imageManager.getImages(...) triggers `onstyleimagemissing` - // - the user adds "my-image" within the callback - // - addImage adds "my-image" to this._changedImages - // - the next frame triggers a reload of this tile even though it already has the latest version - this._updateTilesForChangedImages(); + let uncacheableLayerCount = 0; + let drapedLayerCount = 0; + let reachedUndrapedLayer = false; + let firstUndrapedLayer; - const setDependencies = (sourceCache ) => { - if (sourceCache) { - sourceCache.setDependencies(params.tileID.key, params.type, params.icons); + for (let i = 0; i < layerCount; ++i) { + const layer = style._layers[style.order[i]]; + if (!this._style.isLayerDraped(layer)) { + if (!reachedUndrapedLayer) { + reachedUndrapedLayer = true; + firstUndrapedLayer = layer.id; + } + } else { + if (reachedUndrapedLayer) { + ++uncacheableLayerCount; + } + ++drapedLayerCount; } - }; - setDependencies(this._otherSourceCaches[params.source]); - setDependencies(this._symbolSourceCaches[params.source]); - } + } - getGlyphs(mapId , params , callback ) { - this.glyphManager.getGlyphs(params.stacks, callback); - } + if (drapedLayerCount === 0) { + return {efficiency: 100.0}; + } - getResource(mapId , params , callback ) { - return transform.makeRequest(params, callback); + return {efficiency: (1.0 - uncacheableLayerCount / drapedLayerCount) * 100.0, firstUndrapedLayer}; } - _getSourceCache(source ) { - return this._otherSourceCaches[source]; + getMinElevationBelowMSL() { + let min = 0.0; + // The maximum DEM error in meters to be conservative (SRTM). + const maxDEMError = 30.0; + this._visibleDemTiles.filter(tile => tile.dem).forEach(tile => { + const minMaxTree = (tile.dem ).tree; + min = Math.min(min, minMaxTree.minimums[0]); + }); + return min === 0.0 ? min : (min - maxDEMError) * this._exaggeration; } - _getLayerSourceCache(layer ) { - return layer.type === 'symbol' ? - this._symbolSourceCaches[layer.source] : - this._otherSourceCaches[layer.source]; - } + // Performs raycast against visible DEM tiles on the screen and returns the distance travelled along the ray. + // x & y components of the position are expected to be in normalized mercator coordinates [0, 1] and z in meters. + raycast(pos , dir , exaggeration ) { + if (!this._visibleDemTiles) + return null; - _getSourceCaches(source ) { - const sourceCaches = []; - if (this._otherSourceCaches[source]) { - sourceCaches.push(this._otherSourceCaches[source]); - } - if (this._symbolSourceCaches[source]) { - sourceCaches.push(this._symbolSourceCaches[source]); - } - return sourceCaches; - } + // Perform initial raycasts against root nodes of the available dem tiles + // and use this information to sort them from closest to furthest. + const preparedTiles = this._visibleDemTiles.filter(tile => tile.dem).map(tile => { + const id = tile.tileID; + const tiles = Math.pow(2.0, id.overscaledZ); + const {x, y} = id.canonical; - has3DLayers() { - return this._num3DLayers > 0; - } + // Compute tile boundaries in mercator coordinates + const minx = x / tiles; + const maxx = (x + 1) / tiles; + const miny = y / tiles; + const maxy = (y + 1) / tiles; + const tree = (tile.dem ).tree; - hasSymbolLayers() { - return this._numSymbolLayers > 0; - } + return { + minx, miny, maxx, maxy, + t: tree.raycastRoot(minx, miny, maxx, maxy, pos, dir, exaggeration), + tile + }; + }); - hasCircleLayers() { - return this._numCircleLayers > 0; - } + preparedTiles.sort((a, b) => { + const at = a.t !== null ? a.t : Number.MAX_VALUE; + const bt = b.t !== null ? b.t : Number.MAX_VALUE; + return at - bt; + }); - _clearWorkerCaches() { - this.dispatcher.broadcast('clearCaches'); - } + for (const obj of preparedTiles) { + if (obj.t == null) + return null; - destroy() { - this._clearWorkerCaches(); - if (this.terrainSetForDrapingOnly()) { - delete this.terrain; - delete this.stylesheet.terrain; + // Perform more accurate raycast against the dem tree. First intersection is the closest on + // as all tiles are sorted from closest to furthest + const tree = (obj.tile.dem ).tree; + const t = tree.raycast(obj.minx, obj.miny, obj.maxx, obj.maxy, pos, dir, exaggeration); + + if (t != null) + return t; } + + return null; } -} -Style.getSourceType = getType; -Style.setSourceType = setType; -Style.registerForPluginStateChange = transform.registerForPluginStateChange; + _createFBO() { + const painter = this.painter; + const context = painter.context; + const gl = context.gl; + const bufferSize = this.drapeBufferSize; + context.activeTexture.set(gl.TEXTURE0); + const tex = new ref_properties.Texture(context, {width: bufferSize[0], height: bufferSize[1], data: null}, gl.RGBA); + tex.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + const fb = context.createFramebuffer(bufferSize[0], bufferSize[1], false); + fb.colorAttachment.set(tex.texture); + fb.depthAttachment = new ref_properties.DepthStencilAttachment(context, fb.framebuffer); -var preludeCommon = "// IMPORTANT:\n// This prelude is injected in both vertex and fragment shader be wary\n// of precision qualifiers as vertex and fragment precision may differ\n\n#define EPSILON 0.0000001\n#define PI 3.141592653589793\n#define EXTENT 8192.0\n\n#ifdef FOG\n\nuniform mediump vec4 u_fog_color;\nuniform mediump vec2 u_fog_range;\nuniform mediump float u_fog_horizon_blend;\n\nvarying vec3 v_fog_pos;\n\nfloat fog_range(float depth) {\n // Map [near, far] to [0, 1] without clamping\n return (depth - u_fog_range[0]) / (u_fog_range[1] - u_fog_range[0]);\n}\n\n// Assumes z up and camera_dir *normalized* (to avoid computing\n// its length multiple times for different functions).\nfloat fog_horizon_blending(vec3 camera_dir) {\n float t = max(0.0, camera_dir.z / u_fog_horizon_blend);\n // Factor of 3 chosen to roughly match smoothstep.\n // See: https://www.desmos.com/calculator/pub31lvshf\n return u_fog_color.a * exp(-3.0 * t * t);\n}\n\n// Compute a ramp for fog opacity\n// - t: depth, rescaled to 0 at fogStart and 1 at fogEnd\n// See: https://www.desmos.com/calculator/3taufutxid\nfloat fog_opacity(float t) {\n const float decay = 6.0;\n float falloff = 1.0 - min(1.0, exp(-decay * t));\n\n // Cube without pow() to smooth the onset\n falloff *= falloff * falloff;\n\n // Scale and clip to 1 at the far limit\n return u_fog_color.a * min(1.0, 1.00747 * falloff);\n}\n\n#endif\n"; + if (this._sharedDepthStencil === undefined) { + this._sharedDepthStencil = context.createRenderbuffer(context.gl.DEPTH_STENCIL, bufferSize[0], bufferSize[1]); + this._stencilRef = 0; + fb.depthAttachment.set(this._sharedDepthStencil); + context.clear({stencil: 0}); + } else { + fb.depthAttachment.set(this._sharedDepthStencil); + } -var preludeFrag = "// NOTE: This prelude is injected in the fragment shader only\n\nhighp vec3 hash(highp vec2 p) {\n highp vec3 p3 = fract(p.xyx * vec3(443.8975, 397.2973, 491.1871));\n p3 += dot(p3, p3.yxz + 19.19);\n return fract((p3.xxy + p3.yzz) * p3.zyx);\n}\n\nvec3 dither(vec3 color, highp vec2 seed) {\n vec3 rnd = hash(seed) + hash(seed + 0.59374) - 0.5;\n return color + rnd / 255.0;\n}\n\n#ifdef TERRAIN\n\n// Pack depth to RGBA. A piece of code copied in various libraries and WebGL\n// shadow mapping examples.\nhighp vec4 pack_depth(highp float ndc_z) {\n highp float depth = ndc_z * 0.5 + 0.5;\n const highp vec4 bit_shift = vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);\n const highp vec4 bit_mask = vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);\n highp vec4 res = fract(depth * bit_shift);\n res -= res.xxyz * bit_mask;\n return res;\n}\n\n#endif"; + if (context.extTextureFilterAnisotropic && !context.extTextureFilterAnisotropicForceOff) { + gl.texParameterf(gl.TEXTURE_2D, + context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, + context.extTextureFilterAnisotropicMax); + } -var preludeVert = "// NOTE: This prelude is injected in the vertex shader only\n\nfloat wrap(float n, float min, float max) {\n float d = max - min;\n float w = mod(mod(n - min, d) + d, d) + min;\n return (w == min) ? max : w;\n}\n\nvec3 mercator_tile_position(mat4 matrix, vec2 tile_anchor, vec3 tile_id, vec2 mercator_center) {\n#if defined(PROJECTION_GLOBE_VIEW) && !defined(PROJECTED_POS_ON_VIEWPORT)\n // tile_id.z contains pow(2.0, coord.canonical.z)\n float tiles = tile_id.z;\n\n vec2 mercator = (tile_anchor / EXTENT + tile_id.xy) / tiles;\n mercator -= mercator_center;\n mercator.x = wrap(mercator.x, -0.5, 0.5);\n\n vec4 mercator_tile = vec4(mercator.xy * EXTENT, EXTENT / (2.0 * PI), 1.0);\n mercator_tile = matrix * mercator_tile;\n\n return mercator_tile.xyz;\n#else\n return vec3(0.0);\n#endif\n}\n\nvec3 mix_globe_mercator(vec3 globe, vec3 mercator, float t) {\n#if defined(PROJECTION_GLOBE_VIEW) && !defined(PROJECTED_POS_ON_VIEWPORT)\n return mix(globe, mercator, t);\n#else\n return globe;\n#endif\n}\n\n#ifdef PROJECTION_GLOBE_VIEW\nmat3 globe_mercator_surface_vectors(vec3 pos_normal, vec3 up_dir, float zoom_transition) {\n vec3 normal = zoom_transition == 0.0 ? pos_normal : normalize(mix(pos_normal, up_dir, zoom_transition));\n vec3 xAxis = normalize(vec3(normal.z, 0.0, -normal.x));\n vec3 yAxis = normalize(cross(normal, xAxis));\n return mat3(xAxis, yAxis, normal);\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_color(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\nconst vec4 AWAY = vec4(-1000.0, -1000.0, -1000.0, 1); // Normalized device coordinate that is not rendered.\n"; + return {fb, tex, dirty: false}; + } -var backgroundFrag = "uniform vec4 u_color;\nuniform float u_opacity;\n\nvoid main() {\n vec4 out_color = u_color;\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + _initFBOPool() { + while (this.pool.length < Math.min(FBO_POOL_SIZE, this.proxyCoords.length)) { + this.pool.push(this._createFBO()); + } + } -var backgroundVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; + _shouldDisableRenderCache() { + // Disable render caches on dynamic events due to fading or transitioning. + if (this._style.light && this._style.light.hasTransition()) { + return true; + } -var backgroundPatternFrag = "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 vec4 out_color = mix(color1, color2, u_mix);\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + for (const id in this._style._sourceCaches) { + if (this._style._sourceCaches[id].hasTransition()) { + return true; + } + } -var backgroundPatternVert = "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#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; + const fadingOrTransitioning = id => { + const layer = this._style._layers[id]; + const isHidden = layer.isHidden(this.painter.transform.zoom); + const crossFade = layer.getCrossfadeParameters(); + const isFading = !!crossFade && crossFade.t !== 1; + const isTransitioning = layer.hasTransition(); + return layer.type !== 'custom' && !isHidden && (isFading || isTransitioning); + }; + return this._style.order.some(fadingOrTransitioning); + } -var circleFrag = "varying vec3 v_data;\nvarying float v_visibility;\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\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 vec4 out_color = mix(color * opacity, stroke_color * stroke_opacity, color_t);\n\n#ifdef FOG\n out_color = fog_apply_premultiplied(out_color, v_fog_pos);\n#endif\n\n gl_FragColor = out_color * (v_visibility * opacity_t);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + _clearRasterFadeFromRenderCache() { + let hasRasterSource = false; + for (const id in this._style._sourceCaches) { + if (this._style._sourceCaches[id]._source instanceof RasterTileSource) { + hasRasterSource = true; + break; + } + } + if (!hasRasterSource) { + return; + } -var circleVert = "#define NUM_VISIBILITY_RINGS 2\n#define INV_SQRT2 0.70710678\n#define ELEVATION_BIAS 0.0001\n\n#define NUM_SAMPLES_PER_RING 16\n\nuniform mat4 u_matrix;\nuniform mat2 u_extrude_scale;\nuniform lowp float u_device_pixel_ratio;\nuniform highp float u_camera_to_center_distance;\n\nattribute vec2 a_pos;\n\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_pos_3; // Projected position on the globe\nattribute vec3 a_pos_normal_3; // Surface normal at the position\nattribute float a_scale;\n\n// Uniforms required for transition between globe and mercator\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_tile_id;\nuniform float u_zoom_transition;\nuniform vec3 u_up_dir;\n#endif\n\nvarying vec3 v_data;\nvarying float v_visibility;\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\nvec2 calc_offset(vec2 extrusion, float radius, float stroke_width, float view_scale) {\n return extrusion * (radius + stroke_width) * u_extrude_scale * view_scale;\n}\n\nfloat cantilevered_elevation(vec2 pos, float radius, float stroke_width, float view_scale) {\n vec2 c1 = pos + calc_offset(vec2(-1,-1), radius, stroke_width, view_scale);\n vec2 c2 = pos + calc_offset(vec2(1,-1), radius, stroke_width, view_scale);\n vec2 c3 = pos + calc_offset(vec2(1,1), radius, stroke_width, view_scale);\n vec2 c4 = pos + calc_offset(vec2(-1,1), radius, stroke_width, view_scale);\n float h1 = elevation(c1) + ELEVATION_BIAS;\n float h2 = elevation(c2) + ELEVATION_BIAS;\n float h3 = elevation(c3) + ELEVATION_BIAS;\n float h4 = elevation(c4) + ELEVATION_BIAS;\n return max(h4, max(h3, max(h1,h2)));\n}\n\nfloat circle_elevation(vec2 pos) {\n#if defined(TERRAIN)\n return elevation(pos) + ELEVATION_BIAS;\n#else\n return 0.0;\n#endif\n}\n\nvec4 project_vertex(vec2 extrusion, vec4 world_center, vec4 projected_center, float radius, float stroke_width, float view_scale, mat3 surface_vectors) {\n vec2 sample_offset = calc_offset(extrusion, radius, stroke_width, view_scale);\n#ifdef PITCH_WITH_MAP\n #ifdef PROJECTION_GLOBE_VIEW\n return u_matrix * ( world_center + vec4(sample_offset.x * surface_vectors[0] + sample_offset.y * surface_vectors[1], 0) );\n #else\n return u_matrix * ( world_center + vec4(sample_offset, 0, 0) );\n #endif\n#else\n return projected_center + vec4(sample_offset, 0, 0);\n#endif\n}\n\nfloat get_sample_step() {\n#ifdef PITCH_WITH_MAP\n return 2.0 * PI / float(NUM_SAMPLES_PER_RING);\n#else\n // We want to only sample the top half of the circle when it is viewport-aligned.\n // This is to prevent the circle from intersecting with the ground plane below it at high pitch.\n return PI / float(NUM_SAMPLES_PER_RING);\n#endif\n}\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\n#ifdef PROJECTION_GLOBE_VIEW\n // Compute positions on both globe and mercator plane to support transition between the two modes\n // Apply extra scaling to extrusion to cover different pixel space ratios (which is dependant on the latitude)\n vec2 scaled_extrude = extrude * a_scale;\n vec3 pos_normal_3 = a_pos_normal_3 / 16384.0;\n mat3 surface_vectors = globe_mercator_surface_vectors(pos_normal_3, u_up_dir, u_zoom_transition);\n\n vec3 surface_extrusion = scaled_extrude.x * surface_vectors[0] + scaled_extrude.y * surface_vectors[1];\n vec3 globe_elevation = elevationVector(circle_center) * circle_elevation(circle_center);\n vec3 globe_pos = a_pos_3 + surface_extrusion + globe_elevation;\n vec3 mercator_elevation = u_up_dir * u_tile_up_scale * circle_elevation(circle_center);\n vec3 merc_pos = mercator_tile_position(u_inv_rot_matrix, circle_center, u_tile_id, u_merc_center) + surface_extrusion + mercator_elevation;\n vec3 pos = mix_globe_mercator(globe_pos, merc_pos, u_zoom_transition);\n vec4 world_center = vec4(pos, 1);\n#else \n mat3 surface_vectors = mat3(1.0);\n // extract height offset for terrain, this returns 0 if terrain is not active\n float height = circle_elevation(circle_center);\n vec4 world_center = vec4(circle_center, height, 1);\n#endif\n\n vec4 projected_center = u_matrix * world_center;\n\n float view_scale = 0.0;\n #ifdef PITCH_WITH_MAP\n #ifdef SCALE_WITH_MAP\n view_scale = 1.0;\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 view_scale = projected_center.w / u_camera_to_center_distance;\n #endif\n #else\n #ifdef SCALE_WITH_MAP\n view_scale = u_camera_to_center_distance;\n #else\n view_scale = projected_center.w;\n #endif\n #endif\n #if defined(SCALE_WITH_MAP) && defined(PROJECTION_GLOBE_VIEW)\n view_scale *= a_scale;\n #endif\n gl_Position = project_vertex(extrude, world_center, projected_center, radius, stroke_width, view_scale, surface_vectors);\n\n float visibility = 0.0;\n #ifdef TERRAIN\n float step = get_sample_step();\n #ifdef PITCH_WITH_MAP\n // to prevent the circle from self-intersecting with the terrain underneath on a sloped hill,\n // we calculate the elevation at each corner and pick the highest one when computing visibility.\n float cantilevered_height = cantilevered_elevation(circle_center, radius, stroke_width, view_scale);\n vec4 occlusion_world_center = vec4(circle_center, cantilevered_height, 1);\n vec4 occlusion_projected_center = u_matrix * occlusion_world_center;\n #else\n vec4 occlusion_world_center = world_center;\n vec4 occlusion_projected_center = projected_center;\n #endif\n for(int ring = 0; ring < NUM_VISIBILITY_RINGS; ring++) {\n float scale = (float(ring) + 1.0)/float(NUM_VISIBILITY_RINGS);\n for(int i = 0; i < NUM_SAMPLES_PER_RING; i++) {\n vec2 extrusion = vec2(cos(step * float(i)), -sin(step * float(i))) * scale;\n vec4 frag_pos = project_vertex(extrusion, occlusion_world_center, occlusion_projected_center, radius, stroke_width, view_scale, surface_vectors);\n visibility += float(!isOccluded(frag_pos));\n }\n }\n visibility /= float(NUM_VISIBILITY_RINGS) * float(NUM_SAMPLES_PER_RING);\n #else\n visibility = 1.0;\n #endif\n // This is a temporary overwrite until we add support for terrain occlusion for the globe view\n // Having a separate overwrite here makes the metal shader generation simpler for the default case\n #ifdef PROJECTION_GLOBE_VIEW\n visibility = 1.0;\n #endif\n v_visibility = visibility;\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 / u_device_pixel_ratio / (radius + stroke_width);\n\n v_data = vec3(extrude.x, extrude.y, antialiasblur);\n\n#ifdef FOG\n v_fog_pos = fog_position(world_center.xyz);\n#endif\n}\n"; + // Check if any raster tile is in a fading state + for (let i = 0; i < this._style.order.length; ++i) { + const layer = this._style._layers[this._style.order[i]]; + const isHidden = layer.isHidden(this.painter.transform.zoom); + const sourceCache = this._style._getLayerSourceCache(layer); + if (layer.type !== 'raster' || isHidden || !sourceCache) { continue; } -var clippingMaskFrag = "void main() {\n gl_FragColor = vec4(1.0);\n}\n"; + const rasterLayer = ((layer ) ); + const fadeDuration = rasterLayer.paint.get('raster-fade-duration'); + for (const proxy of this.proxyCoords) { + const proxiedCoords = this.proxyToSource[proxy.key][sourceCache.id]; + const coords = ((proxiedCoords ) ); + if (!coords) { continue; } -var clippingMaskVert = "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"; + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + const parent = sourceCache.findLoadedParent(coord, 0); + const fade = rasterFade(tile, parent, sourceCache, this.painter.transform, fadeDuration); + const isFading = fade.opacity !== 1 || fade.mix !== 0; + if (isFading) { + this._clearRenderCacheForTile(sourceCache.id, coord); + } + } + } + } + } -var heatmapFrag = "uniform highp float u_intensity;\n\nvarying vec2 v_extrude;\n\n#pragma mapbox: define highp float weight\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 FOG\n // Heatmaps work differently than other layers, so we operate on the accumulated\n // density rather than a final color. The power is chosen so that the density\n // fades into the fog at a reasonable rate.\n gl_FragColor.r *= pow(1.0 - fog_opacity(v_fog_pos), 2.0);\n#endif\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + _setupDrapedRenderBatches() { + const layerIds = this._style.order; + const layerCount = layerIds.length; + if (layerCount === 0) { + return; + } -var heatmapVert = "\nuniform mat4 u_matrix;\nuniform float u_extrude_scale;\nuniform float u_opacity;\nuniform float u_intensity;\n\nattribute vec2 a_pos;\n\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_pos_3; // Projected position on the globe\nattribute vec3 a_pos_normal_3; // Surface normal at the position\nattribute float a_scale;\n\n// Uniforms required for transition between globe and mercator\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_tile_id;\nuniform float u_zoom_transition;\nuniform vec3 u_up_dir;\n#endif\n\nvarying vec2 v_extrude;\n\n#pragma mapbox: define highp float weight\n#pragma mapbox: define mediump float radius\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 vec2 tilePos = floor(a_pos * 0.5);\n\n#ifdef PROJECTION_GLOBE_VIEW\n // Compute positions on both globe and mercator plane to support transition between the two modes\n // Apply extra scaling to extrusion to cover different pixel space ratios (which is dependant on the latitude)\n extrude *= a_scale;\n vec3 pos_normal_3 = a_pos_normal_3 / 16384.0;\n mat3 surface_vectors = globe_mercator_surface_vectors(pos_normal_3, u_up_dir, u_zoom_transition);\n vec3 surface_extrusion = extrude.x * surface_vectors[0] + extrude.y * surface_vectors[1];\n vec3 globe_elevation = elevationVector(tilePos) * elevation(tilePos);\n vec3 globe_pos = a_pos_3 + surface_extrusion + globe_elevation;\n vec3 mercator_elevation = u_up_dir * u_tile_up_scale * elevation(tilePos);\n vec3 merc_pos = mercator_tile_position(u_inv_rot_matrix, tilePos, u_tile_id, u_merc_center) + surface_extrusion + mercator_elevation;\n vec3 pos = mix_globe_mercator(globe_pos, merc_pos, u_zoom_transition);\n#else\n vec3 pos = vec3(tilePos + extrude, elevation(tilePos));\n#endif\n\n gl_Position = u_matrix * vec4(pos, 1);\n\n#ifdef FOG\n v_fog_pos = fog_position(pos);\n#endif\n}\n"; + const batches = []; -var heatmapTextureFrag = "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\n gl_FragColor = color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(0.0);\n#endif\n}\n"; + let currentLayer = 0; + let layer = this._style._layers[layerIds[currentLayer]]; + while (!this._style.isLayerDraped(layer) && layer.isHidden(this.painter.transform.zoom) && ++currentLayer < layerCount) { + layer = this._style._layers[layerIds[currentLayer]]; + } -var heatmapTextureVert = "attribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = vec4(a_pos, 0, 1);\n\n v_pos = a_pos * 0.5 + 0.5;\n}\n"; + let batchStart; + for (; currentLayer < layerCount; ++currentLayer) { + const layer = this._style._layers[layerIds[currentLayer]]; + if (layer.isHidden(this.painter.transform.zoom)) { + continue; + } + if (!this._style.isLayerDraped(layer)) { + if (batchStart !== undefined) { + batches.push({start: batchStart, end: currentLayer - 1}); + batchStart = undefined; + } + continue; + } + if (batchStart === undefined) { + batchStart = currentLayer; + } + } -var collisionBoxFrag = "varying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n vec4 red = vec4(1.0, 0.0, 0.0, 1.0); // Red = collision, hide label\n vec4 blue = vec4(0.0, 0.0, 1.0, 0.5); // Blue = no collision, label is showing\n\n gl_FragColor = mix(red, blue, step(0.5, v_placed)) * 0.5;\n gl_FragColor *= mix(1.0, 0.1, step(0.5, v_notUsed));\n}"; + if (batchStart !== undefined) { + batches.push({start: batchStart, end: currentLayer - 1}); + } -var collisionBoxVert = "attribute vec3 a_pos;\nattribute vec2 a_anchor_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_placed;\nattribute vec2 a_shift;\nattribute float a_size_scale;\nattribute vec2 a_padding;\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_pos + elevationVector(a_anchor_pos) * elevation(a_anchor_pos), 1);\n\n highp float camera_to_anchor_distance = projectedPoint.w;\n highp float collision_perspective_ratio = clamp(\n 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance),\n 0.0, // Prevents oversized near-field boxes in pitched/overzoomed tiles\n 1.5);\n\n gl_Position = projectedPoint;\n gl_Position.xy += (a_extrude * a_size_scale + a_shift + a_padding) * u_extrude_scale * gl_Position.w * collision_perspective_ratio;\n\n v_placed = a_placed.x;\n v_notUsed = a_placed.y;\n}\n"; + if (this._style.map._optimizeForTerrain) { + // Draped first approach should result in a single or no batch + ref_properties.assert_1(batches.length === 1 || batches.length === 0); + } -var collisionCircleFrag = "varying float v_radius;\nvarying vec2 v_extrude;\nvarying float v_perspective_ratio;\nvarying float v_collision;\n\nvoid main() {\n float alpha = 0.5 * min(v_perspective_ratio, 1.0);\n float stroke_radius = 0.9 * max(v_perspective_ratio, 1.0);\n\n float distance_to_center = length(v_extrude);\n float distance_to_edge = abs(distance_to_center - v_radius);\n float opacity_t = smoothstep(-stroke_radius, 0.0, -distance_to_edge);\n\n vec4 color = mix(vec4(0.0, 0.0, 1.0, 0.5), vec4(1.0, 0.0, 0.0, 1.0), v_collision);\n\n gl_FragColor = color * alpha * opacity_t;\n}\n"; + this._drapedRenderBatches = batches; + } -var collisionCircleVert = "attribute vec2 a_pos_2f;\nattribute float a_radius;\nattribute vec2 a_flags;\n\nuniform mat4 u_matrix;\nuniform mat4 u_inv_matrix;\nuniform vec2 u_viewport_size;\nuniform float u_camera_to_center_distance;\n\nvarying float v_radius;\nvarying vec2 v_extrude;\nvarying float v_perspective_ratio;\nvarying float v_collision;\n\nvec3 toTilePosition(vec2 screenPos) {\n // Shoot a ray towards the ground to reconstruct the depth-value\n vec4 rayStart = u_inv_matrix * vec4(screenPos, -1.0, 1.0);\n vec4 rayEnd = u_inv_matrix * vec4(screenPos, 1.0, 1.0);\n\n rayStart.xyz /= rayStart.w;\n rayEnd.xyz /= rayEnd.w;\n\n highp float t = (0.0 - rayStart.z) / (rayEnd.z - rayStart.z);\n return mix(rayStart.xyz, rayEnd.xyz, t);\n}\n\nvoid main() {\n vec2 quadCenterPos = a_pos_2f;\n float radius = a_radius;\n float collision = a_flags.x;\n float vertexIdx = a_flags.y;\n\n vec2 quadVertexOffset = vec2(\n mix(-1.0, 1.0, float(vertexIdx >= 2.0)),\n mix(-1.0, 1.0, float(vertexIdx >= 1.0 && vertexIdx <= 2.0)));\n\n vec2 quadVertexExtent = quadVertexOffset * radius;\n\n // Screen position of the quad might have been computed with different camera parameters.\n // Transform the point to a proper position on the current viewport\n vec3 tilePos = toTilePosition(quadCenterPos);\n vec4 clipPos = u_matrix * vec4(tilePos, 1.0);\n\n highp float camera_to_anchor_distance = clipPos.w;\n highp float collision_perspective_ratio = clamp(\n 0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance),\n 0.0, // Prevents oversized near-field circles in pitched/overzoomed tiles\n 4.0);\n\n // Apply small padding for the anti-aliasing effect to fit the quad\n // Note that v_radius and v_extrude are in screen coordinates already\n float padding_factor = 1.2;\n v_radius = radius;\n v_extrude = quadVertexExtent * padding_factor;\n v_perspective_ratio = collision_perspective_ratio;\n v_collision = collision;\n\n gl_Position = vec4(clipPos.xyz / clipPos.w, 1.0) + vec4(quadVertexExtent * padding_factor / u_viewport_size * 2.0, 0.0, 0.0);\n}\n"; + _setupRenderCache(previousProxyToSource ) { + const psc = this.proxySourceCache; + if (this._shouldDisableRenderCache() || this._invalidateRenderCache) { + this._invalidateRenderCache = false; + if (psc.renderCache.length > psc.renderCachePool.length) { + const used = ((Object.values(psc.proxyCachedFBO) ) ); + psc.proxyCachedFBO = {}; + for (let i = 0; i < used.length; ++i) { + const fbos = ((Object.values(used[i]) ) ); + psc.renderCachePool.push(...fbos); + } + ref_properties.assert_1(psc.renderCache.length === psc.renderCachePool.length); + } + return; + } -var debugFrag = "uniform highp vec4 u_color;\nuniform sampler2D u_overlay;\n\nvarying vec2 v_uv;\n\nvoid main() {\n vec4 overlay_color = texture2D(u_overlay, v_uv);\n gl_FragColor = mix(u_color, overlay_color, overlay_color.a);\n}\n"; + this._clearRasterFadeFromRenderCache(); -var debugVert = "attribute vec2 a_pos;\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_pos_3;\n#endif\nvarying vec2 v_uv;\n\nuniform mat4 u_matrix;\nuniform float u_overlay_scale;\n\nvoid main() {\n // This vertex shader expects a EXTENT x EXTENT quad,\n // The UV co-ordinates for the overlay texture can be calculated using that knowledge\n float h = elevation(a_pos);\n v_uv = a_pos / 8192.0;\n#ifdef PROJECTION_GLOBE_VIEW\n gl_Position = u_matrix * vec4(a_pos_3 + elevationVector(a_pos) * h, 1);\n#else\n gl_Position = u_matrix * vec4(a_pos * u_overlay_scale, h, 1);\n#endif\n}\n"; + const coords = this.proxyCoords; + const dirty = this._tilesDirty; + for (let i = coords.length - 1; i >= 0; i--) { + const proxy = coords[i]; + const tile = psc.getTileByID(proxy.key); -var fillFrag = "#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 vec4 out_color = color;\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + if (psc.proxyCachedFBO[proxy.key] !== undefined) { + ref_properties.assert_1(tile.texture); + const prev = previousProxyToSource[proxy.key]; + ref_properties.assert_1(prev); + // Reuse previous render from cache if there was no change of + // content that was used to render proxy tile. + const current = this.proxyToSource[proxy.key]; + let equal = 0; + for (const source in current) { + const tiles = current[source]; + const prevTiles = prev[source]; + if (!prevTiles || prevTiles.length !== tiles.length || + tiles.some((t, index) => + (t !== prevTiles[index] || + (dirty[source] && dirty[source].hasOwnProperty(t.key) + ))) + ) { + equal = -1; + break; + } + ++equal; + } + // dirty === false: doesn't need to be rendered to, just use cached render. + for (const proxyFBO in psc.proxyCachedFBO[proxy.key]) { + psc.renderCache[psc.proxyCachedFBO[proxy.key][proxyFBO]].dirty = equal < 0 || equal !== Object.values(prev).length; + } + } + } -var fillVert = "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#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; + const sortedRenderBatches = [...this._drapedRenderBatches]; + sortedRenderBatches.sort((batchA, batchB) => { + const batchASize = batchA.end - batchA.start; + const batchBSize = batchB.end - batchB.start; + return batchBSize - batchASize; + }); -var fillOutlineFrag = "varying 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 float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n vec4 out_color = outline_color;\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + for (const batch of sortedRenderBatches) { + for (const id of coords) { + if (psc.proxyCachedFBO[id.key]) { + continue; + } -var fillOutlineVert = "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#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; + // Assign renderCache FBO if there are available FBOs in pool. + let index = psc.renderCachePool.pop(); + if (index === undefined && psc.renderCache.length < RENDER_CACHE_MAX_SIZE) { + index = psc.renderCache.length; + psc.renderCache.push(this._createFBO()); + } + if (index !== undefined) { + psc.proxyCachedFBO[id.key] = {}; + psc.proxyCachedFBO[id.key][batch.start] = index; + psc.renderCache[index].dirty = true; // needs to be rendered to. + } + } + } + this._tilesDirty = {}; + } -var fillOutlinePatternFrag = "\nuniform vec2 u_texsize;\nuniform sampler2D u_image;\nuniform float u_fade;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, 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(pattern_tl_b / u_texsize, 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 vec4 out_color = mix(color1, color2, u_fade);\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + _setupStencil(fbo , proxiedCoords , layer , sourceCache ) { + if (!sourceCache || !this._sourceTilesOverlap[sourceCache.id]) { + if (this._overlapStencilType) this._overlapStencilType = false; + return; + } + const context = this.painter.context; + const gl = context.gl; -var fillOutlinePatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform vec3 u_scale;\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#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float tileRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, fromScale * display_size_a, tileRatio, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, a_pos);\n\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n\n#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; + // If needed, setup stencilling. Don't bother to remove when there is no + // more need: in such case, if there is no overlap, stencilling is disabled. + if (proxiedCoords.length <= 1) { this._overlapStencilType = false; return; } -var fillPatternFrag = "uniform vec2 u_texsize;\nuniform float u_fade;\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#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, 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(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 out_color = mix(color1, color2, u_fade);\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + let stencilRange; + if (layer.isTileClipped()) { + stencilRange = proxiedCoords.length; + this._overlapStencilMode.test = {func: gl.EQUAL, mask: 0xFF}; + this._overlapStencilType = 'Clip'; + } else if (proxiedCoords[0].overscaledZ > proxiedCoords[proxiedCoords.length - 1].overscaledZ) { + stencilRange = 1; + this._overlapStencilMode.test = {func: gl.GREATER, mask: 0xFF}; + this._overlapStencilType = 'Mask'; + } else { + this._overlapStencilType = false; + return; + } + if (this._stencilRef + stencilRange > 255) { + context.clear({stencil: 0}); + this._stencilRef = 0; + } + this._stencilRef += stencilRange; + this._overlapStencilMode.ref = this._stencilRef; + if (layer.isTileClipped()) { + this._renderTileClippingMasks(proxiedCoords, this._overlapStencilMode.ref); + } + } -var fillPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform vec3 u_scale;\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#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float tileZoomRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\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, fromScale * display_size_a, tileZoomRatio, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileZoomRatio, a_pos);\n\n#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; + clipOrMaskOverlapStencilType() { + return this._overlapStencilType === 'Clip' || this._overlapStencilType === 'Mask'; + } -var fillExtrusionFrag = "varying vec4 v_color;\n\nvoid main() {\n vec4 color = v_color;\n#ifdef FOG\n color = fog_dither(fog_apply_premultiplied(color, v_fog_pos));\n#endif\n gl_FragColor = color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + stencilModeForRTTOverlap(id ) { + if (!this.renderingToTexture || !this._overlapStencilType) { + return ref_properties.StencilMode.disabled; + } + // All source tiles contributing to the same proxy are processed in sequence, in zoom descending order. + // For raster / hillshade overlap masking, ref is based on zoom dif. + // For vector layer clipping, every tile gets dedicated stencil ref. + if (this._overlapStencilType === 'Clip') { + // In immediate 2D mode, we render rects to mark clipping area and handle behavior on tile borders. + // Here, there is no need for now for this: + // 1. overlap is handled by proxy render to texture tiles (there is no overlap there) + // 2. here we handle only brief zoom out semi-transparent color intensity flickering + // and that is avoided fine by stenciling primitives as part of drawing (instead of additional tile quad step). + this._overlapStencilMode.ref = this.painter._tileClippingMaskIDs[id.key]; + } // else this._overlapStencilMode.ref is set to a single value used per proxy tile, in _setupStencil. + return this._overlapStencilMode; + } -var fillExtrusionVert = "uniform mat4 u_matrix;\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\nuniform float u_vertical_gradient;\nuniform lowp float u_opacity;\n\nattribute vec4 a_pos_normal_ed;\nattribute vec2 a_centroid_pos;\n\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_pos_3; // Projected position on the globe\nattribute vec3 a_pos_normal_3; // Surface normal at the position\n\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_tile_id;\nuniform float u_zoom_transition;\nuniform vec3 u_up_dir;\nuniform float u_height_lift;\n#endif\n\nvarying vec4 v_color;\n\n#pragma mapbox: define highp float base\n#pragma mapbox: define highp float height\n\n#pragma mapbox: define highp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize highp float base\n #pragma mapbox: initialize highp float height\n #pragma mapbox: initialize highp vec4 color\n\n vec3 pos_nx = floor(a_pos_normal_ed.xyz * 0.5);\n // The least significant bits of a_pos_normal_ed.xy hold:\n // x is 1 if it's on top, 0 for ground.\n // y is 1 if the normal points up, and 0 if it points to side.\n // z is sign of ny: 1 for positive, 0 for values <= 0.\n mediump vec3 top_up_ny = a_pos_normal_ed.xyz - 2.0 * pos_nx;\n\n float x_normal = pos_nx.z / 8192.0;\n vec3 normal = top_up_ny.y == 1.0 ? vec3(0.0, 0.0, 1.0) : normalize(vec3(x_normal, (2.0 * top_up_ny.z - 1.0) * (1.0 - abs(x_normal)), 0.0));\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = top_up_ny.x;\n\n vec2 centroid_pos = vec2(0.0);\n#if defined(HAS_CENTROID) || defined(TERRAIN)\n centroid_pos = a_centroid_pos;\n#endif\n\n#ifdef TERRAIN\n bool flat_roof = centroid_pos.x != 0.0 && t > 0.0;\n float ele = elevation(pos_nx.xy);\n float c_ele = flat_roof ? centroid_pos.y == 0.0 ? elevationFromUint16(centroid_pos.x) : flatElevation(centroid_pos) : ele;\n // If centroid elevation lower than vertex elevation, roof at least 2 meters height above base.\n float h = flat_roof ? max(c_ele + height, ele + base + 2.0) : ele + (t > 0.0 ? height : base == 0.0 ? -5.0 : base);\n vec3 pos = vec3(pos_nx.xy, h);\n#else\n vec3 pos = vec3(pos_nx.xy, t > 0.0 ? height : base);\n#endif\n\n#ifdef PROJECTION_GLOBE_VIEW\n // If t > 0 (top) we always add the lift, otherwise (ground) we only add it if base height is > 0\n float lift = float((t + base) > 0.0) * u_height_lift;\n vec3 globe_normal = normalize(mix(a_pos_normal_3 / 16384.0, u_up_dir, u_zoom_transition));\n vec3 globe_pos = a_pos_3 + globe_normal * (u_tile_up_scale * (pos.z + lift));\n vec3 merc_pos = mercator_tile_position(u_inv_rot_matrix, pos.xy, u_tile_id, u_merc_center) + u_up_dir * u_tile_up_scale * pos.z;\n pos = mix_globe_mercator(globe_pos, merc_pos, u_zoom_transition);\n#endif\n\n float hidden = float(centroid_pos.x == 0.0 && centroid_pos.y == 1.0);\n gl_Position = mix(u_matrix * vec4(pos, 1), AWAY, hidden);\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, 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 // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient,\n // and otherwise calculates the gradient based on base + height\n directional *= (\n (1.0 - u_vertical_gradient) +\n (u_vertical_gradient * 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.rgb += clamp(color.rgb * directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));\n v_color *= u_opacity;\n\n#ifdef FOG\n v_fog_pos = fog_position(pos);\n#endif\n}\n"; + _renderTileClippingMasks(proxiedCoords , ref ) { + const painter = this.painter; + const context = this.painter.context; + const gl = context.gl; + painter._tileClippingMaskIDs = {}; + context.setColorMode(ref_properties.ColorMode.disabled); + context.setDepthMode(ref_properties.DepthMode.disabled); -var fillExtrusionPatternFrag = "uniform vec2 u_texsize;\nuniform float u_fade;\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#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(pattern_tl_a / u_texsize, 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(pattern_tl_b / u_texsize, pattern_br_b / u_texsize, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 out_color = mix(color1, color2, u_fade);\n\n out_color = out_color * v_lighting;\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = out_color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + const program = painter.useProgram('clippingMask'); -var fillExtrusionPatternVert = "uniform mat4 u_matrix;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_height_factor;\nuniform vec3 u_scale;\nuniform float u_vertical_gradient;\nuniform lowp float u_opacity;\n\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec4 a_pos_normal_ed;\nattribute vec2 a_centroid_pos;\n\n#ifdef PROJECTION_GLOBE_VIEW\nattribute vec3 a_pos_3; // Projected position on the globe\nattribute vec3 a_pos_normal_3; // Surface normal at the position\n\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_tile_id;\nuniform float u_zoom_transition;\nuniform vec3 u_up_dir;\nuniform float u_height_lift;\n#endif\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#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float tileRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n vec3 pos_nx = floor(a_pos_normal_ed.xyz * 0.5);\n // The least significant bits of a_pos_normal_ed.xy hold:\n // x is 1 if it's on top, 0 for ground.\n // y is 1 if the normal points up, and 0 if it points to side.\n // z is sign of ny: 1 for positive, 0 for values <= 0.\n mediump vec3 top_up_ny = a_pos_normal_ed.xyz - 2.0 * pos_nx;\n\n float x_normal = pos_nx.z / 8192.0;\n vec3 normal = top_up_ny.y == 1.0 ? vec3(0.0, 0.0, 1.0) : normalize(vec3(x_normal, (2.0 * top_up_ny.z - 1.0) * (1.0 - abs(x_normal)), 0.0));\n float edgedistance = a_pos_normal_ed.w;\n\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\n\n base = max(0.0, base);\n height = max(0.0, height);\n\n float t = top_up_ny.x;\n float z = t > 0.0 ? height : base;\n\n vec2 centroid_pos = vec2(0.0);\n#if defined(HAS_CENTROID) || defined(TERRAIN)\n centroid_pos = a_centroid_pos;\n#endif\n\n#ifdef TERRAIN\n bool flat_roof = centroid_pos.x != 0.0 && t > 0.0;\n float ele = elevation(pos_nx.xy);\n float c_ele = flat_roof ? centroid_pos.y == 0.0 ? elevationFromUint16(centroid_pos.x) : flatElevation(centroid_pos) : ele;\n // If centroid elevation lower than vertex elevation, roof at least 2 meters height above base.\n float h = flat_roof ? max(c_ele + height, ele + base + 2.0) : ele + (t > 0.0 ? height : base == 0.0 ? -5.0 : base);\n vec3 p = vec3(pos_nx.xy, h);\n#else\n vec3 p = vec3(pos_nx.xy, z);\n#endif\n\n#ifdef PROJECTION_GLOBE_VIEW\n // If t > 0 (top) we always add the lift, otherwise (ground) we only add it if base height is > 0\n float lift = float((t + base) > 0.0) * u_height_lift;\n vec3 globe_normal = normalize(mix(a_pos_normal_3 / 16384.0, u_up_dir, u_zoom_transition));\n vec3 globe_pos = a_pos_3 + globe_normal * (u_tile_up_scale * (p.z + lift));\n vec3 merc_pos = mercator_tile_position(u_inv_rot_matrix, p.xy, u_tile_id, u_merc_center) + u_up_dir * u_tile_up_scale * p.z;\n p = mix_globe_mercator(globe_pos, merc_pos, u_zoom_transition);\n#endif\n\n float hidden = float(centroid_pos.x == 0.0 && centroid_pos.y == 1.0);\n gl_Position = mix(u_matrix * vec4(p, 1), AWAY, hidden);\n\n vec2 pos = normal.z == 1.0\n ? pos_nx.xy // 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, fromScale * display_size_a, tileRatio, pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, toScale * display_size_b, tileRatio, pos);\n\n v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\n float directional = clamp(dot(normal, 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 // This avoids another branching statement, but multiplies by a constant of 0.84 if no vertical gradient,\n // and otherwise calculates the gradient based on base + height\n directional *= (\n (1.0 - u_vertical_gradient) +\n (u_vertical_gradient * 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 v_lighting *= u_opacity;\n\n#ifdef FOG\n v_fog_pos = fog_position(p);\n#endif\n}\n"; + for (const tileID of proxiedCoords) { + const id = painter._tileClippingMaskIDs[tileID.key] = --ref; + program.draw(context, gl.TRIANGLES, ref_properties.DepthMode.disabled, + // Tests will always pass, and ref value will be written to stencil buffer. + new ref_properties.StencilMode({func: gl.ALWAYS, mask: 0}, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE), + ref_properties.ColorMode.disabled, ref_properties.CullFaceMode.disabled, clippingMaskUniformValues(tileID.projMatrix), + '$clipping', painter.tileExtentBuffer, + painter.quadTriangleIndexBuffer, painter.tileExtentSegments); + } + } -var hillshadePrepareFrag = "#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;\nuniform vec4 u_unpack;\n\nfloat getElevation(vec2 coord) {\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\n return texture2D(u_image, coord).a / 4.0;\n#else\n // Convert encoded elevation value to meters\n vec4 data = texture2D(u_image, coord) * 255.0;\n data.a = -1.0;\n return dot(data, u_unpack) / 4.0;\n#endif\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));\n float b = getElevation(v_pos + vec2(0, -epsilon.y));\n float c = getElevation(v_pos + vec2(epsilon.x, -epsilon.y));\n float d = getElevation(v_pos + vec2(-epsilon.x, 0));\n float e = getElevation(v_pos);\n float f = getElevation(v_pos + vec2(epsilon.x, 0));\n float g = getElevation(v_pos + vec2(-epsilon.x, epsilon.y));\n float h = getElevation(v_pos + vec2(0, epsilon.y));\n float i = getElevation(v_pos + vec2(epsilon.x, epsilon.y));\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 because otherwise\n // it is barely noticeable at low zooms. To do this, we multiply this by\n // a scale factor that is a function of zooms below 15, which is an arbitrary\n // that corresponds to the max zoom level of Mapbox terrain-RGB tiles.\n // See nickidlugash's awesome breakdown for more info:\n // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556\n\n float exaggerationFactor = u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;\n float exaggeration = u_zoom < 15.0 ? (u_zoom - 15.0) * exaggerationFactor : 0.0;\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, 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"; + // Casts a ray from a point on screen and returns the intersection point with the terrain. + // The returned point contains the mercator coordinates in its first 3 components, and elevation + // in meter in its 4th coordinate. + pointCoordinate(screenPoint ) { + const transform = this.painter.transform; + if (screenPoint.x < 0 || screenPoint.x > transform.width || + screenPoint.y < 0 || screenPoint.y > transform.height) { + return null; + } -var hillshadePrepareVert = "uniform mat4 u_matrix;\nuniform vec2 u_dimension;\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\n highp vec2 epsilon = 1.0 / u_dimension;\n float scale = (u_dimension.x - 2.0) / u_dimension.x;\n v_pos = (a_texture_pos / 8192.0) * scale + epsilon;\n}\n"; + const far = [screenPoint.x, screenPoint.y, 1, 1]; + ref_properties.transformMat4$1(far, far, transform.pixelMatrixInverse); + ref_properties.scale$2(far, far, 1.0 / far[3]); + // x & y in pixel coordinates, z is altitude in meters + far[0] /= transform.worldSize; + far[1] /= transform.worldSize; + const camera = transform._camera.position; + const mercatorZScale = ref_properties.mercatorZfromAltitude(1, transform.center.lat); + const p = [camera[0], camera[1], camera[2] / mercatorZScale, 0.0]; + const dir = ref_properties.subtract([], far.slice(0, 3), p); + ref_properties.normalize(dir, dir); -var hillshadeFrag = "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\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 // 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 FOG\n gl_FragColor = fog_dither(fog_apply_premultiplied(gl_FragColor, v_fog_pos));\n#endif\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + const exaggeration = this._exaggeration; + const distanceAlongRay = this.raycast(p, dir, exaggeration); -var hillshadeVert = "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#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; + if (distanceAlongRay === null || !distanceAlongRay) return null; + ref_properties.scaleAndAdd(p, p, dir, distanceAlongRay); + p[3] = p[2]; + p[2] *= mercatorZScale; + return p; + } -var lineFrag = "uniform lowp float u_device_pixel_ratio;\nuniform float u_alpha_discard_threshold;\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\n\n#ifdef RENDER_LINE_DASH\nuniform sampler2D u_dash_image;\nuniform float u_mix;\nuniform vec3 u_scale;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\n#endif\n\n#ifdef RENDER_LINE_GRADIENT\nuniform sampler2D u_gradient_image;\nvarying highp vec2 v_uv;\n#endif\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 dash_from\n#pragma mapbox: define lowp vec4 dash_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize highp vec4 color\n #pragma mapbox: initialize lowp float floorwidth\n #pragma mapbox: initialize lowp vec4 dash_from\n #pragma mapbox: initialize lowp vec4 dash_to\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 / u_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#ifdef RENDER_LINE_DASH\n float sdfdist_a = texture2D(u_dash_image, v_tex_a).a;\n float sdfdist_b = texture2D(u_dash_image, v_tex_b).a;\n float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n float sdfwidth = min(dash_from.z * u_scale.y, dash_to.z * u_scale.z);\n float sdfgamma = 1.0 / (2.0 * u_device_pixel_ratio) / sdfwidth;\n alpha *= smoothstep(0.5 - sdfgamma / floorwidth, 0.5 + sdfgamma / floorwidth, sdfdist);\n#endif\n\n#ifdef RENDER_LINE_GRADIENT\n // For gradient lines, v_lineprogress is the ratio along the\n // entire line, the gradient ramp is stored in a texture.\n vec4 out_color = texture2D(u_gradient_image, v_uv);\n#else\n vec4 out_color = color;\n#endif\n\n#ifdef FOG\n out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos));\n#endif\n\n#ifdef RENDER_LINE_ALPHA_DISCARD\n if (alpha < u_alpha_discard_threshold) {\n discard;\n }\n#endif\n\n gl_FragColor = out_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + drawDepth() { + const painter = this.painter; + const context = painter.context; + const psc = this.proxySourceCache; -var lineVert = "// 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 EXTRUDE_SCALE 0.015873016\n\nattribute vec2 a_pos_normal;\nattribute vec4 a_data;\n\n#ifdef RENDER_LINE_GRADIENT\n// Includes in order: a_uv_x, a_split_index, a_linesofar\n// to reduce attribute count on older devices\nattribute vec3 a_packed;\n#else\nattribute float a_linesofar;\n#endif\n\nuniform mat4 u_matrix;\nuniform mat2 u_pixels_to_tile_units;\nuniform vec2 u_units_to_pixels;\nuniform lowp float u_device_pixel_ratio;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\n\n#ifdef RENDER_LINE_DASH\nuniform vec2 u_texsize;\nuniform mediump vec3 u_scale;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\n#endif\n\n#ifdef RENDER_LINE_GRADIENT\nuniform float u_image_height;\nvarying highp vec2 v_uv;\n#endif\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 dash_from\n#pragma mapbox: define lowp vec4 dash_to\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 floorwidth\n #pragma mapbox: initialize lowp vec4 dash_from\n #pragma mapbox: initialize lowp vec4 dash_to\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 // the distance over which the line edge fades out.\n // Retina devices need a smaller distance to avoid aliasing.\n float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0;\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n vec2 pos = floor(a_pos_normal * 0.5);\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 // We store these in the least significant bit of a_pos_normal\n mediump vec2 normal = a_pos_normal - 2.0 * pos;\n normal.y = normal.y * 2.0 - 1.0;\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) + (halfwidth == 0.0 ? 0.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 * 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 * EXTRUDE_SCALE * normal.y * mat2(t, -u, u, t);\n\n vec4 projected_extrude = u_matrix * vec4(dist * u_pixels_to_tile_units, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 * u_pixels_to_tile_units, 0.0, 1.0) + projected_extrude;\n\n#ifndef RENDER_TO_TEXTURE\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_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n#else\n v_gamma_scale = 1.0;\n#endif\n\n#ifdef RENDER_LINE_GRADIENT\n float a_uv_x = a_packed[0];\n float a_split_index = a_packed[1];\n float a_linesofar = a_packed[2];\n highp float texel_height = 1.0 / u_image_height;\n highp float half_texel_height = 0.5 * texel_height;\n v_uv = vec2(a_uv_x, a_split_index * texel_height - half_texel_height);\n#endif\n\n#ifdef RENDER_LINE_DASH\n float tileZoomRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n float scaleA = dash_from.z == 0.0 ? 0.0 : tileZoomRatio / (dash_from.z * fromScale);\n float scaleB = dash_to.z == 0.0 ? 0.0 : tileZoomRatio / (dash_to.z * toScale);\n float heightA = dash_from.y;\n float heightB = dash_to.y;\n\n v_tex_a = vec2(a_linesofar * scaleA / floorwidth, (-normal.y * heightA + dash_from.x + 0.5) / u_texsize.y);\n v_tex_b = vec2(a_linesofar * scaleB / floorwidth, (-normal.y * heightB + dash_to.x + 0.5) / u_texsize.y);\n#endif\n\n v_width2 = vec2(outset, inset);\n\n#ifdef FOG\n v_fog_pos = fog_position(pos);\n#endif\n}\n"; + const width = Math.ceil(painter.width), height = Math.ceil(painter.height); + if (this._depthFBO && (this._depthFBO.width !== width || this._depthFBO.height !== height)) { + this._depthFBO.destroy(); + this._depthFBO = undefined; + this._depthTexture = undefined; + } + if (!this._depthFBO) { + const gl = context.gl; + const fbo = context.createFramebuffer(width, height, true); + context.activeTexture.set(gl.TEXTURE0); + const texture = new ref_properties.Texture(context, {width, height, data: null}, gl.RGBA); + texture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); + fbo.colorAttachment.set(texture.texture); + const renderbuffer = context.createRenderbuffer(context.gl.DEPTH_COMPONENT16, width, height); + fbo.depthAttachment.set(renderbuffer); + this._depthFBO = fbo; + this._depthTexture = texture; + } + context.bindFramebuffer.set(this._depthFBO.framebuffer); + context.viewport.set([0, 0, width, height]); -var linePatternFrag = "uniform lowp float u_device_pixel_ratio;\nuniform vec2 u_texsize;\nuniform float u_fade;\nuniform mediump vec3 u_scale;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\nvarying float v_width;\n\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n vec2 pattern_tl_a = pattern_from.xy;\n vec2 pattern_br_a = pattern_from.zw;\n vec2 pattern_tl_b = pattern_to.xy;\n vec2 pattern_br_b = pattern_to.zw;\n\n float tileZoomRatio = u_scale.x;\n float fromScale = u_scale.y;\n float toScale = u_scale.z;\n\n vec2 display_size_a = (pattern_br_a - pattern_tl_a) / pixel_ratio_from;\n vec2 display_size_b = (pattern_br_b - pattern_tl_b) / pixel_ratio_to;\n\n vec2 pattern_size_a = vec2(display_size_a.x * fromScale / tileZoomRatio, display_size_a.y);\n vec2 pattern_size_b = vec2(display_size_b.x * toScale / tileZoomRatio, display_size_b.y);\n\n float aspect_a = display_size_a.y / v_width;\n float aspect_b = display_size_b.y / v_width;\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 / u_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 / pattern_size_a.x * aspect_a, 1.0);\n float x_b = mod(v_linesofar / pattern_size_b.x * aspect_b, 1.0);\n\n float y = 0.5 * v_normal.y + 0.5;\n\n vec2 texel_size = 1.0 / u_texsize;\n\n vec2 pos_a = mix(pattern_tl_a * texel_size - texel_size, pattern_br_a * texel_size + texel_size, vec2(x_a, y));\n vec2 pos_b = mix(pattern_tl_b * texel_size - texel_size, pattern_br_b * texel_size + texel_size, vec2(x_b, y));\n\n vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\n\n#ifdef FOG\n color = fog_dither(fog_apply_premultiplied(color, v_fog_pos));\n#endif\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + drawTerrainDepth(painter, this, psc, this.proxyCoords); + } -var linePatternVert = "// 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 vec2 a_pos_normal;\nattribute vec4 a_data;\nattribute float a_linesofar;\n\nuniform mat4 u_matrix;\nuniform vec2 u_units_to_pixels;\nuniform mat2 u_pixels_to_tile_units;\nuniform lowp float u_device_pixel_ratio;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\nvarying float v_width;\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#pragma mapbox: define lowp float floorwidth\n#pragma mapbox: define lowp vec4 pattern_from\n#pragma mapbox: define lowp vec4 pattern_to\n#pragma mapbox: define lowp float pixel_ratio_from\n#pragma mapbox: define lowp float pixel_ratio_to\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 #pragma mapbox: initialize lowp float floorwidth\n #pragma mapbox: initialize mediump vec4 pattern_from\n #pragma mapbox: initialize mediump vec4 pattern_to\n #pragma mapbox: initialize lowp float pixel_ratio_from\n #pragma mapbox: initialize lowp float pixel_ratio_to\n\n // the distance over which the line edge fades out.\n // Retina devices need a smaller distance to avoid aliasing.\n float ANTIALIASING = 1.0 / u_device_pixel_ratio / 2.0;\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n // float tileRatio = u_scale.x;\n vec2 pos = floor(a_pos_normal * 0.5);\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 // We store these in the least significant bit of a_pos_normal\n mediump vec2 normal = a_pos_normal - 2.0 * pos;\n normal.y = normal.y * 2.0 - 1.0;\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) + (halfwidth == 0.0 ? 0.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_pixels_to_tile_units, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 * u_pixels_to_tile_units, 0.0, 1.0) + projected_extrude;\n\n#ifndef RENDER_TO_TEXTURE\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_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n#else\n v_gamma_scale = 1.0;\n#endif\n v_linesofar = a_linesofar;\n v_width2 = vec2(outset, inset);\n v_width = floorwidth;\n\n#ifdef FOG\n v_fog_pos = fog_position(pos);\n#endif\n}\n"; + _setupProxiedCoordsForOrtho(sourceCache , sourceCoords , previousProxyToSource ) { + if (sourceCache.getSource() instanceof ImageSource) { + return this._setupProxiedCoordsForImageSource(sourceCache, sourceCoords, previousProxyToSource); + } + this._findCoveringTileCache[sourceCache.id] = this._findCoveringTileCache[sourceCache.id] || {}; + const coords = this.proxiedCoords[sourceCache.id] = []; + const proxys = this.proxyCoords; + for (let i = 0; i < proxys.length; i++) { + const proxyTileID = proxys[i]; + const proxied = this._findTileCoveringTileID(proxyTileID, sourceCache); + if (proxied) { + ref_properties.assert_1(proxied.hasData()); + const id = this._createProxiedId(proxyTileID, proxied, previousProxyToSource[proxyTileID.key] && previousProxyToSource[proxyTileID.key][sourceCache.id]); + coords.push(id); + this.proxyToSource[proxyTileID.key][sourceCache.id] = [id]; + } + } + let hasOverlap = false; + for (let i = 0; i < sourceCoords.length; i++) { + const tile = sourceCache.getTile(sourceCoords[i]); + if (!tile || !tile.hasData()) continue; + const proxy = this._findTileCoveringTileID(tile.tileID, this.proxySourceCache); + // Don't add the tile if already added in loop above. + if (proxy && proxy.tileID.canonical.z !== tile.tileID.canonical.z) { + const array = this.proxyToSource[proxy.tileID.key][sourceCache.id]; + const id = this._createProxiedId(proxy.tileID, tile, previousProxyToSource[proxy.tileID.key] && previousProxyToSource[proxy.tileID.key][sourceCache.id]); + if (!array) { + this.proxyToSource[proxy.tileID.key][sourceCache.id] = [id]; + } else { + // The last element is parent added in loop above. This way we get + // a list in Z descending order which is needed for stencil masking. + array.splice(array.length - 1, 0, id); + } + coords.push(id); + hasOverlap = true; + } + } + this._sourceTilesOverlap[sourceCache.id] = hasOverlap; + } -var rasterFrag = "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 vec3 out_color = mix(u_high_vec, u_low_vec, rgb);\n\n#ifdef FOG\n out_color = fog_dither(fog_apply(out_color, v_fog_pos));\n#endif\n\n gl_FragColor = vec4(out_color * color.a, color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + _setupProxiedCoordsForImageSource(sourceCache , sourceCoords , previousProxyToSource ) { + if (!sourceCache.getSource().loaded()) return; -var rasterVert = "uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform vec2 u_perspective_transform;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n float w = 1.0 + dot(a_texture_pos, u_perspective_transform);\n gl_Position = u_matrix * vec4(a_pos * w, 0, w);\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;\n v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n\n#ifdef FOG\n v_fog_pos = fog_position(a_pos);\n#endif\n}\n"; + const coords = this.proxiedCoords[sourceCache.id] = []; + const proxys = this.proxyCoords; + const imageSource = ((sourceCache.getSource() ) ); -var symbolIconFrag = "uniform sampler2D u_texture;\n\nvarying vec2 v_tex;\nvarying float v_fade_opacity;\n\n#pragma mapbox: define lowp float 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"; + const anchor = new ref_properties.pointGeometry(imageSource.tileID.x, imageSource.tileID.y)._div(1 << imageSource.tileID.z); + const aabb = imageSource.coordinates.map(ref_properties.MercatorCoordinate.fromLngLat).reduce((acc, coord) => { + acc.min.x = Math.min(acc.min.x, coord.x - anchor.x); + acc.min.y = Math.min(acc.min.y, coord.y - anchor.y); + acc.max.x = Math.max(acc.max.x, coord.x - anchor.x); + acc.max.y = Math.max(acc.max.y, coord.y - anchor.y); + return acc; + }, {min: new ref_properties.pointGeometry(Number.MAX_VALUE, Number.MAX_VALUE), max: new ref_properties.pointGeometry(-Number.MAX_VALUE, -Number.MAX_VALUE)}); -var symbolIconVert = "attribute vec4 a_pos_offset;\nattribute vec4 a_tex_size;\nattribute vec4 a_pixeloffset;\nattribute vec4 a_z_tile_anchor;\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;\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_tile_id;\nuniform float u_zoom_transition;\n\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_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\n#pragma mapbox: define lowp float 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_tex_size.xy;\n vec2 a_size = a_tex_size.zw;\n\n float a_size_min = floor(a_size[0] * 0.5);\n vec2 a_pxoffset = a_pixeloffset.xy;\n vec2 a_minFontScale = a_pixeloffset.zw / 256.0;\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_min, a_size[1], u_size_t) / 128.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size_min / 128.0;\n } else {\n size = u_size;\n }\n\n float anchorZ = a_z_tile_anchor.x;\n vec2 tileAnchor = a_z_tile_anchor.yz;\n vec3 h = elevationVector(tileAnchor) * elevation(tileAnchor);\n vec3 mercator_pos = mercator_tile_position(u_inv_rot_matrix, tileAnchor, u_tile_id, u_merc_center);\n vec3 world_pos = mix_globe_mercator(vec3(a_pos, anchorZ) + h, mercator_pos, u_zoom_transition);\n\n vec4 projectedPoint = u_matrix * vec4(world_pos, 1);\n\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 = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 1.5);\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), anchorZ, 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 vec3 proj_pos = mix_globe_mercator(vec3(a_projected_pos.xy, anchorZ), mercator_pos, u_zoom_transition);\n\n#ifdef PROJECTED_POS_ON_VIEWPORT\n vec4 projected_pos = u_label_plane_matrix * vec4(proj_pos.xy, 0.0, 1.0);\n#else\n vec4 projected_pos = u_label_plane_matrix * vec4(proj_pos.xyz + h, 1.0);\n#endif\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 float z = 0.0;\n vec2 offset = rotation_matrix * (a_offset / 32.0 * max(a_minFontScale, fontScale) + a_pxoffset / 16.0);\n#ifdef PITCH_WITH_MAP_TERRAIN\n vec4 tile_pos = u_label_plane_matrix_inv * vec4(a_projected_pos.xy + offset, 0.0, 1.0);\n z = elevation(tile_pos.xy);\n#endif\n // Symbols might end up being behind the camera. Move them AWAY.\n float occlusion_fade = occlusionFade(projectedPoint);\n gl_Position = mix(u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + offset, z, 1.0), AWAY, float(projectedPoint.w <= 0.0 || occlusion_fade == 0.0));\n\n float projection_transition_fade = 1.0;\n#if defined(PROJECTED_POS_ON_VIEWPORT) && defined(PROJECTION_GLOBE_VIEW)\n projection_transition_fade = 1.0 - step(EPSILON, u_zoom_transition);\n#endif\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(occlusion_fade, fade_opacity[0] + fade_change)) * projection_transition_fade;\n}\n"; + // Fast conservative check using aabb: content outside proxy tile gets clipped out by on render, anyway. + const tileOutsideImage = (tileID, imageTileID) => { + const x = tileID.wrap + tileID.canonical.x / (1 << tileID.canonical.z); + const y = tileID.canonical.y / (1 << tileID.canonical.z); + const d = ref_properties.EXTENT / (1 << tileID.canonical.z); -var symbolSDFFrag = "#define SDF_PX 8.0\n\nuniform bool u_is_halo;\nuniform sampler2D u_texture;\nuniform highp float u_gamma_scale;\nuniform lowp float u_device_pixel_ratio;\nuniform bool u_is_text;\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\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\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 float EDGE_GAMMA = 0.105 / u_device_pixel_ratio;\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"; + const ix = imageTileID.wrap + imageTileID.canonical.x / (1 << imageTileID.canonical.z); + const iy = imageTileID.canonical.y / (1 << imageTileID.canonical.z); -var symbolSDFVert = "attribute vec4 a_pos_offset;\nattribute vec4 a_tex_size;\nattribute vec4 a_pixeloffset;\nattribute vec4 a_z_tile_anchor;\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\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform mat4 u_coord_matrix;\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;\nuniform vec2 u_texsize;\nuniform vec3 u_tile_id;\nuniform float u_zoom_transition;\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\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\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_tex_size.xy;\n vec2 a_size = a_tex_size.zw;\n\n float a_size_min = floor(a_size[0] * 0.5);\n vec2 a_pxoffset = a_pixeloffset.xy;\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_min, a_size[1], u_size_t) / 128.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size_min / 128.0;\n } else {\n size = u_size;\n }\n\n float anchorZ = a_z_tile_anchor.x;\n vec2 tileAnchor = a_z_tile_anchor.yz;\n vec3 h = elevationVector(tileAnchor) * elevation(tileAnchor);\n vec3 mercator_pos = mercator_tile_position(u_inv_rot_matrix, tileAnchor, u_tile_id, u_merc_center);\n vec3 world_pos = mix_globe_mercator(vec3(a_pos, anchorZ) + h, mercator_pos, u_zoom_transition);\n\n vec4 projectedPoint = u_matrix * vec4(world_pos, 1);\n\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 = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 1.5);\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), anchorZ, 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 vec3 proj_pos = mix_globe_mercator(vec3(a_projected_pos.xy, anchorZ), mercator_pos, u_zoom_transition);\n\n#ifdef PROJECTED_POS_ON_VIEWPORT\n vec4 projected_pos = u_label_plane_matrix * vec4(proj_pos.xy, 0.0, 1.0);\n#else\n vec4 projected_pos = u_label_plane_matrix * vec4(proj_pos.xyz + h, 1.0);\n#endif\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 float z = 0.0;\n vec2 offset = rotation_matrix * (a_offset / 32.0 * fontScale + a_pxoffset);\n#ifdef PITCH_WITH_MAP_TERRAIN\n vec4 tile_pos = u_label_plane_matrix_inv * vec4(a_projected_pos.xy + offset, 0.0, 1.0);\n z = elevation(tile_pos.xy);\n#endif\n // Symbols might end up being behind the camera. Move them AWAY.\n float occlusion_fade = occlusionFade(projectedPoint);\n gl_Position = mix(u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + offset, z, 1.0), AWAY, float(projectedPoint.w <= 0.0 || occlusion_fade == 0.0));\n float gamma_scale = gl_Position.w;\n\n float projection_transition_fade = 1.0;\n#if defined(PROJECTED_POS_ON_VIEWPORT) && defined(PROJECTION_GLOBE_VIEW)\n projection_transition_fade = 1.0 - step(EPSILON, u_zoom_transition);\n#endif\n\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(occlusion_fade, fade_opacity[0] + fade_change));\n\n v_data0 = a_tex / u_texsize;\n v_data1 = vec3(gamma_scale, size, interpolated_fade_opacity * projection_transition_fade);\n}\n"; + return x + d < ix + aabb.min.x || x > ix + aabb.max.x || y + d < iy + aabb.min.y || y > iy + aabb.max.y; + }; -var symbolTextAndIconFrag = "#define SDF_PX 8.0\n\n#define SDF 1.0\n#define ICON 0.0\n\nuniform bool u_is_halo;\nuniform sampler2D u_texture;\nuniform sampler2D u_texture_icon;\nuniform highp float u_gamma_scale;\nuniform lowp float u_device_pixel_ratio;\n\nvarying vec4 v_data0;\nvarying vec4 v_data1;\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\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 float fade_opacity = v_data1[2];\n\n if (v_data1.w == ICON) {\n vec2 tex_icon = v_data0.zw;\n lowp float alpha = opacity * fade_opacity;\n gl_FragColor = texture2D(u_texture_icon, tex_icon) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n return;\n }\n\n vec2 tex = v_data0.xy;\n\n float EDGE_GAMMA = 0.105 / u_device_pixel_ratio;\n\n float gamma_scale = v_data1.x;\n float size = v_data1.y;\n\n float fontScale = size / 24.0;\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"; + for (let i = 0; i < proxys.length; i++) { + const proxyTileID = proxys[i]; + for (let j = 0; j < sourceCoords.length; j++) { + const tile = sourceCache.getTile(sourceCoords[j]); + if (!tile || !tile.hasData()) continue; -var symbolTextAndIconVert = "attribute vec4 a_pos_offset;\nattribute vec4 a_tex_size;\nattribute vec4 a_z_tile_anchor;\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\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_coord_matrix;\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;\nuniform vec2 u_texsize;\nuniform vec2 u_texsize_icon;\nuniform mat4 u_inv_rot_matrix;\nuniform vec2 u_merc_center;\nuniform vec3 u_tile_id;\nuniform float u_zoom_transition;\n\nvarying vec4 v_data0;\nvarying vec4 v_data1;\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\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_tex_size.xy;\n vec2 a_size = a_tex_size.zw;\n\n float a_size_min = floor(a_size[0] * 0.5);\n float is_sdf = a_size[0] - 2.0 * a_size_min;\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_min, a_size[1], u_size_t) / 128.0;\n } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n size = a_size_min / 128.0;\n } else {\n size = u_size;\n }\n\n float anchorZ = a_z_tile_anchor.x;\n vec2 tileAnchor = a_z_tile_anchor.yz;\n vec3 h = elevationVector(tileAnchor) * elevation(tileAnchor);\n\n vec3 mercator_pos = mercator_tile_position(u_inv_rot_matrix, tileAnchor, u_tile_id, u_merc_center);\n vec3 world_pos = mix_globe_mercator(vec3(a_pos, anchorZ) + h, mercator_pos, u_zoom_transition);\n\n vec4 projectedPoint = u_matrix * vec4(world_pos, 1);\n\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 = clamp(\n 0.5 + 0.5 * distance_ratio,\n 0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n 1.5);\n\n size *= perspective_ratio;\n\n float fontScale = size / 24.0;\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), anchorZ, 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 vec3 proj_pos = mix_globe_mercator(vec3(a_projected_pos.xy, anchorZ), mercator_pos, u_zoom_transition);\n\n#ifdef PROJECTED_POS_ON_VIEWPORT\n vec4 projected_pos = u_label_plane_matrix * vec4(proj_pos.xy, 0.0, 1.0);\n#else\n vec4 projected_pos = u_label_plane_matrix * vec4(proj_pos.xyz + h, 1.0);\n#endif\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 float z = 0.0;\n vec2 offset = rotation_matrix * (a_offset / 32.0 * fontScale);\n#ifdef PITCH_WITH_MAP_TERRAIN\n vec4 tile_pos = u_label_plane_matrix_inv * vec4(a_projected_pos.xy + offset, 0.0, 1.0);\n z = elevation(tile_pos.xy);\n#endif\n float occlusion_fade = occlusionFade(projectedPoint);\n gl_Position = mix(u_coord_matrix * vec4(projected_pos.xy / projected_pos.w + offset, z, 1.0), AWAY, float(projectedPoint.w <= 0.0 || occlusion_fade == 0.0));\n float gamma_scale = gl_Position.w;\n\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(occlusion_fade, fade_opacity[0] + fade_change));\n\n float projection_transition_fade = 1.0;\n#if defined(PROJECTED_POS_ON_VIEWPORT) && defined(PROJECTION_GLOBE_VIEW)\n projection_transition_fade = 1.0 - step(EPSILON, u_zoom_transition);\n#endif\n\n v_data0.xy = a_tex / u_texsize;\n v_data0.zw = a_tex / u_texsize_icon;\n v_data1 = vec4(gamma_scale, size, interpolated_fade_opacity * projection_transition_fade, is_sdf);\n}\n"; + // Setup proxied -> proxy mapping only if image on given tile wrap intersects the proxy tile. + if (tileOutsideImage(proxyTileID, tile.tileID)) continue; -var skyboxFrag = "// [1] Banding in games http://loopit.dk/banding_in_games.pdf\n\nvarying lowp vec3 v_uv;\n\nuniform lowp samplerCube u_cubemap;\nuniform lowp float u_opacity;\nuniform highp float u_temporal_offset;\nuniform highp vec3 u_sun_direction;\n\nfloat sun_disk(highp vec3 ray_direction, highp vec3 sun_direction) {\n highp float cos_angle = dot(normalize(ray_direction), sun_direction);\n\n // Sun angular angle is ~0.5°\n const highp float cos_sun_angular_diameter = 0.99996192306;\n const highp float smoothstep_delta = 1e-5;\n\n return smoothstep(\n cos_sun_angular_diameter - smoothstep_delta,\n cos_sun_angular_diameter + smoothstep_delta,\n cos_angle);\n}\n\nfloat map(float value, float start, float end, float new_start, float new_end) {\n return ((value - start) * (new_end - new_start)) / (end - start) + new_start;\n}\n\nvoid main() {\n vec3 uv = v_uv;\n\n // Add a small offset to prevent black bands around areas where\n // the scattering algorithm does not manage to gather lighting\n const float y_bias = 0.015;\n uv.y += y_bias;\n\n // Inverse of the operation applied for non-linear UV parameterization\n uv.y = pow(abs(uv.y), 1.0 / 5.0);\n\n // To make better utilization of the visible range (e.g. over the horizon, UVs\n // from 0.0 to 1.0 on the Y-axis in cubemap space), the UV range is remapped from\n // (0.0,1.0) to (-1.0,1.0) on y. The inverse operation is applied when generating.\n uv.y = map(uv.y, 0.0, 1.0, -1.0, 1.0);\n\n vec3 sky_color = textureCube(u_cubemap, uv).rgb;\n\n#ifdef FOG\n // Apply fog contribution if enabled\n // Swizzle to put z-up (ignoring x-y mirror since fog does not depend on azimuth)\n sky_color = fog_apply_sky_gradient(v_uv.xzy, sky_color);\n#endif\n\n // Dither [1]\n sky_color.rgb = dither(sky_color.rgb, gl_FragCoord.xy + u_temporal_offset);\n // Add sun disk\n sky_color += 0.1 * sun_disk(v_uv, u_sun_direction);\n\n gl_FragColor = vec4(sky_color * u_opacity, u_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + const id = this._createProxiedId(proxyTileID, tile, previousProxyToSource[proxyTileID.key] && previousProxyToSource[proxyTileID.key][sourceCache.id]); + const array = this.proxyToSource[proxyTileID.key][sourceCache.id]; + if (!array) { + this.proxyToSource[proxyTileID.key][sourceCache.id] = [id]; + } else { + array.push(id); + } + coords.push(id); + } + } + } -var skyboxGradientFrag = "varying highp vec3 v_uv;\n\nuniform lowp sampler2D u_color_ramp;\nuniform highp vec3 u_center_direction;\nuniform lowp float u_radius;\nuniform lowp float u_opacity;\nuniform highp float u_temporal_offset;\n\nvoid main() {\n float progress = acos(dot(normalize(v_uv), u_center_direction)) / u_radius;\n vec4 color = texture2D(u_color_ramp, vec2(progress, 0.5));\n\n#ifdef FOG\n // Apply fog contribution if enabled, make sure to un/post multiply alpha before/after\n // applying sky gradient contribution, as color ramps are premultiplied-alpha colors.\n // Swizzle to put z-up (ignoring x-y mirror since fog does not depend on azimuth)\n color.rgb = fog_apply_sky_gradient(v_uv.xzy, color.rgb / color.a) * color.a;\n#endif\n\n color *= u_opacity;\n\n // Dither\n color.rgb = dither(color.rgb, gl_FragCoord.xy + u_temporal_offset);\n\n gl_FragColor = color;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + // recycle is previous pass content that likely contains proxied ID combining proxy and source tile. + _createProxiedId(proxyTileID , tile , recycle ) { + let matrix = this.orthoMatrix; + if (recycle) { + const recycled = recycle.find(proxied => (proxied.key === tile.tileID.key)); + if (recycled) return recycled; + } + if (tile.tileID.key !== proxyTileID.key) { + const scale = proxyTileID.canonical.z - tile.tileID.canonical.z; + matrix = ref_properties.create(); + let size, xOffset, yOffset; + const wrap = (tile.tileID.wrap - proxyTileID.wrap) << proxyTileID.overscaledZ; + if (scale > 0) { + size = ref_properties.EXTENT >> scale; + xOffset = size * ((tile.tileID.canonical.x << scale) - proxyTileID.canonical.x + wrap); + yOffset = size * ((tile.tileID.canonical.y << scale) - proxyTileID.canonical.y); + } else { + size = ref_properties.EXTENT << -scale; + xOffset = ref_properties.EXTENT * (tile.tileID.canonical.x - ((proxyTileID.canonical.x + wrap) << -scale)); + yOffset = ref_properties.EXTENT * (tile.tileID.canonical.y - (proxyTileID.canonical.y << -scale)); + } + ref_properties.ortho(matrix, 0, size, 0, size, 0, 1); + ref_properties.translate(matrix, matrix, [xOffset, yOffset, 0]); + } + return new ProxiedTileID(tile.tileID, proxyTileID.key, matrix); + } -var skyboxVert = "attribute highp vec3 a_pos_3f;\n\nuniform lowp mat4 u_matrix;\n\nvarying highp vec3 v_uv;\n\nvoid main() {\n const mat3 half_neg_pi_around_x = mat3(1.0, 0.0, 0.0,\n 0.0, 0.0, -1.0,\n 0.0, 1.0, 0.0);\n\n v_uv = half_neg_pi_around_x * a_pos_3f;\n vec4 pos = u_matrix * vec4(a_pos_3f, 1.0);\n\n // Enforce depth to be 1.0\n gl_Position = pos.xyww;\n}\n"; + // A variant of SourceCache.findLoadedParent that considers only visible + // tiles (and doesn't check SourceCache._cache). Another difference is in + // caching "not found" results along the lookup, to leave the lookup early. + // Not found is cached by this._findCoveringTileCache[key] = null; + _findTileCoveringTileID(tileID , sourceCache ) { + let tile = sourceCache.getTile(tileID); + if (tile && tile.hasData()) return tile; -var terrainRasterFrag = "uniform sampler2D u_image0;\nvarying vec2 v_pos0;\n\n#ifdef FOG\nvarying float v_fog_opacity;\n#endif\n\nvoid main() {\n vec4 color = texture2D(u_image0, v_pos0);\n#ifdef FOG\n color = fog_dither(fog_apply_from_vert(color, v_fog_opacity));\n#endif\n gl_FragColor = color;\n#ifdef TERRAIN_WIREFRAME\n gl_FragColor = vec4(1.0, 0.0, 0.0, 0.8);\n#endif\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + const lookup = this._findCoveringTileCache[sourceCache.id]; + const key = lookup[tileID.key]; + tile = key ? sourceCache.getTileByID(key) : null; + if ((tile && tile.hasData()) || key === null) return tile; -var terrainRasterVert = "uniform mat4 u_matrix;\nuniform float u_skirt_height;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\n\n#ifdef FOG\nvarying float v_fog_opacity;\n#endif\n\nconst float skirtOffset = 24575.0;\nconst float wireframeOffset = 0.00015;\n\nvoid main() {\n v_pos0 = a_texture_pos / 8192.0;\n float skirt = float(a_pos.x >= skirtOffset);\n float elevation = elevation(a_texture_pos) - skirt * u_skirt_height;\n#ifdef TERRAIN_WIREFRAME\n elevation += u_skirt_height * u_skirt_height * wireframeOffset;\n#endif\n vec2 decodedPos = a_pos - vec2(skirt * skirtOffset, 0.0);\n gl_Position = u_matrix * vec4(decodedPos, elevation, 1.0);\n\n#ifdef FOG\n v_fog_opacity = fog(fog_position(vec3(decodedPos, elevation)));\n#endif\n}\n"; + ref_properties.assert_1(!key || tile); -var terrainDepthFrag = "#ifdef GL_ES\nprecision highp float;\n#endif\n\nvarying float v_depth;\n\nvoid main() {\n gl_FragColor = pack_depth(v_depth);\n}\n"; + let sourceTileID = tile ? tile.tileID : tileID; + let z = sourceTileID.overscaledZ; + const minzoom = sourceCache.getSource().minzoom; + const path = []; + if (!key) { + const maxzoom = sourceCache.getSource().maxzoom; + if (tileID.canonical.z >= maxzoom) { + const downscale = tileID.canonical.z - maxzoom; + if (sourceCache.getSource().reparseOverscaled) { + z = Math.max(tileID.canonical.z + 2, sourceCache.transform.tileZoom); + sourceTileID = new ref_properties.OverscaledTileID(z, tileID.wrap, maxzoom, + tileID.canonical.x >> downscale, tileID.canonical.y >> downscale); + } else if (downscale !== 0) { + z = maxzoom; + sourceTileID = new ref_properties.OverscaledTileID(z, tileID.wrap, maxzoom, + tileID.canonical.x >> downscale, tileID.canonical.y >> downscale); + } + } + if (sourceTileID.key !== tileID.key) { + path.push(sourceTileID.key); + tile = sourceCache.getTile(sourceTileID); + } + } -var terrainDepthVert = "uniform mat4 u_matrix;\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying float v_depth;\n\nvoid main() {\n float elevation = elevation(a_texture_pos);\n gl_Position = u_matrix * vec4(a_pos, elevation, 1.0);\n v_depth = gl_Position.z / gl_Position.w;\n}"; + const pathToLookup = (key) => { + path.forEach(id => { lookup[id] = key; }); + path.length = 0; + }; -var preludeTerrainVert = "// Also declared in data/bucket/fill_extrusion_bucket.js\n#define ELEVATION_SCALE 7.0\n#define ELEVATION_OFFSET 450.0\n\n#ifdef PROJECTION_GLOBE_VIEW\n\nuniform vec3 u_tile_tl_up;\nuniform vec3 u_tile_tr_up;\nuniform vec3 u_tile_br_up;\nuniform vec3 u_tile_bl_up;\nuniform float u_tile_up_scale;\nvec3 elevationVector(vec2 pos) {\n vec2 uv = pos / EXTENT;\n vec3 up = normalize(mix(\n mix(u_tile_tl_up, u_tile_tr_up, uv.xxx),\n mix(u_tile_bl_up, u_tile_br_up, uv.xxx),\n uv.yyy));\n return up * u_tile_up_scale;\n}\n\n#else\n\nvec3 elevationVector(vec2 pos) { return vec3(0, 0, 1); }\n\n#endif\n\n#ifdef TERRAIN\n\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\nuniform highp sampler2D u_dem;\nuniform highp sampler2D u_dem_prev;\n#else\nuniform sampler2D u_dem;\nuniform sampler2D u_dem_prev;\n#endif\nuniform vec4 u_dem_unpack;\nuniform vec2 u_dem_tl;\nuniform vec2 u_dem_tl_prev;\nuniform float u_dem_scale;\nuniform float u_dem_scale_prev;\nuniform float u_dem_size;\nuniform float u_dem_lerp;\nuniform float u_exaggeration;\nuniform float u_meter_to_dem;\nuniform mat4 u_label_plane_matrix_inv;\n\nuniform sampler2D u_depth;\nuniform vec2 u_depth_size_inv;\n\nvec4 tileUvToDemSample(vec2 uv, float dem_size, float dem_scale, vec2 dem_tl) {\n vec2 pos = dem_size * (uv * dem_scale + dem_tl) + 1.0;\n vec2 f = fract(pos);\n return vec4((pos - f + 0.5) / (dem_size + 2.0), f);\n}\n\nfloat decodeElevation(vec4 v) {\n return dot(vec4(v.xyz * 255.0, -1.0), u_dem_unpack);\n}\n\nfloat currentElevation(vec2 apos) {\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\n vec2 pos = (u_dem_size * (apos / 8192.0 * u_dem_scale + u_dem_tl) + 1.5) / (u_dem_size + 2.0);\n return u_exaggeration * texture2D(u_dem, pos).a;\n#else\n float dd = 1.0 / (u_dem_size + 2.0);\n vec4 r = tileUvToDemSample(apos / 8192.0, u_dem_size, u_dem_scale, u_dem_tl);\n vec2 pos = r.xy;\n vec2 f = r.zw;\n\n float tl = decodeElevation(texture2D(u_dem, pos));\n#ifdef TERRAIN_DEM_NEAREST_FILTER\n return u_exaggeration * tl;\n#endif\n float tr = decodeElevation(texture2D(u_dem, pos + vec2(dd, 0.0)));\n float bl = decodeElevation(texture2D(u_dem, pos + vec2(0.0, dd)));\n float br = decodeElevation(texture2D(u_dem, pos + vec2(dd, dd)));\n\n return u_exaggeration * mix(mix(tl, tr, f.x), mix(bl, br, f.x), f.y);\n#endif\n}\n\nfloat prevElevation(vec2 apos) {\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\n vec2 pos = (u_dem_size * (apos / 8192.0 * u_dem_scale_prev + u_dem_tl_prev) + 1.5) / (u_dem_size + 2.0);\n return u_exaggeration * texture2D(u_dem_prev, pos).a;\n#else\n float dd = 1.0 / (u_dem_size + 2.0);\n vec4 r = tileUvToDemSample(apos / 8192.0, u_dem_size, u_dem_scale_prev, u_dem_tl_prev);\n vec2 pos = r.xy;\n vec2 f = r.zw;\n\n float tl = decodeElevation(texture2D(u_dem_prev, pos));\n float tr = decodeElevation(texture2D(u_dem_prev, pos + vec2(dd, 0.0)));\n float bl = decodeElevation(texture2D(u_dem_prev, pos + vec2(0.0, dd)));\n float br = decodeElevation(texture2D(u_dem_prev, pos + vec2(dd, dd)));\n\n return u_exaggeration * mix(mix(tl, tr, f.x), mix(bl, br, f.x), f.y);\n#endif\n}\n\n#ifdef TERRAIN_VERTEX_MORPHING\nfloat elevation(vec2 apos) {\n float nextElevation = currentElevation(apos);\n float prevElevation = prevElevation(apos);\n return mix(prevElevation, nextElevation, u_dem_lerp);\n}\n#else\nfloat elevation(vec2 apos) {\n return currentElevation(apos);\n}\n#endif\n\n// Unpack depth from RGBA. A piece of code copied in various libraries and WebGL\n// shadow mapping examples.\nfloat unpack_depth(vec4 rgba_depth)\n{\n const vec4 bit_shift = vec4(1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0);\n return dot(rgba_depth, bit_shift) * 2.0 - 1.0;\n}\n\nbool isOccluded(vec4 frag) {\n vec3 coord = frag.xyz / frag.w;\n float depth = unpack_depth(texture2D(u_depth, (coord.xy + 1.0) * 0.5));\n return coord.z > depth + 0.0005;\n}\n\nfloat occlusionFade(vec4 frag) {\n vec3 coord = frag.xyz / frag.w;\n\n vec3 df = vec3(5.0 * u_depth_size_inv, 0.0);\n vec2 uv = 0.5 * coord.xy + 0.5;\n vec4 depth = vec4(\n unpack_depth(texture2D(u_depth, uv - df.xz)),\n unpack_depth(texture2D(u_depth, uv + df.xz)),\n unpack_depth(texture2D(u_depth, uv - df.zy)),\n unpack_depth(texture2D(u_depth, uv + df.zy))\n );\n return dot(vec4(0.25), vec4(1.0) - clamp(300.0 * (vec4(coord.z - 0.001) - depth), 0.0, 1.0));\n}\n\n // BEGIN: code for fill-extrusion height offseting\n // When making changes here please also update associated JS ports in src/style/style_layer/fill-extrusion-style-layer.js\n // This is so that rendering changes are reflected on CPU side for feature querying.\n\nvec4 fourSample(vec2 pos, vec2 off) {\n#ifdef TERRAIN_DEM_FLOAT_FORMAT\n float tl = texture2D(u_dem, pos).a;\n float tr = texture2D(u_dem, pos + vec2(off.x, 0.0)).a;\n float bl = texture2D(u_dem, pos + vec2(0.0, off.y)).a;\n float br = texture2D(u_dem, pos + off).a;\n#else\n vec4 demtl = vec4(texture2D(u_dem, pos).xyz * 255.0, -1.0);\n float tl = dot(demtl, u_dem_unpack);\n vec4 demtr = vec4(texture2D(u_dem, pos + vec2(off.x, 0.0)).xyz * 255.0, -1.0);\n float tr = dot(demtr, u_dem_unpack);\n vec4 dembl = vec4(texture2D(u_dem, pos + vec2(0.0, off.y)).xyz * 255.0, -1.0);\n float bl = dot(dembl, u_dem_unpack);\n vec4 dembr = vec4(texture2D(u_dem, pos + off).xyz * 255.0, -1.0);\n float br = dot(dembr, u_dem_unpack);\n#endif\n return vec4(tl, tr, bl, br);\n}\n\nfloat flatElevation(vec2 pack) {\n vec2 apos = floor(pack / 8.0);\n vec2 span = 10.0 * (pack - apos * 8.0);\n\n vec2 uvTex = (apos - vec2(1.0, 1.0)) / 8190.0;\n float size = u_dem_size + 2.0;\n float dd = 1.0 / size;\n\n vec2 pos = u_dem_size * (uvTex * u_dem_scale + u_dem_tl) + 1.0;\n vec2 f = fract(pos);\n pos = (pos - f + 0.5) * dd;\n\n // Get elevation of centroid.\n vec4 h = fourSample(pos, vec2(dd));\n float z = mix(mix(h.x, h.y, f.x), mix(h.z, h.w, f.x), f.y);\n\n vec2 w = floor(0.5 * (span * u_meter_to_dem - 1.0));\n vec2 d = dd * w;\n vec4 bounds = vec4(d, vec2(1.0) - d);\n\n // Get building wide sample, to get better slope estimate.\n h = fourSample(pos - d, 2.0 * d + vec2(dd));\n\n vec4 diff = abs(h.xzxy - h.ywzw);\n vec2 slope = min(vec2(0.25), u_meter_to_dem * 0.5 * (diff.xz + diff.yw) / (2.0 * w + vec2(1.0)));\n vec2 fix = slope * span;\n float base = z + max(fix.x, fix.y);\n return u_exaggeration * base;\n}\n\nfloat elevationFromUint16(float word) {\n return u_exaggeration * (word / ELEVATION_SCALE - ELEVATION_OFFSET);\n}\n\n// END: code for fill-extrusion height offseting\n\n#else\n\nfloat elevation(vec2 pos) { return 0.0; }\nbool isOccluded(vec4 frag) { return false; }\nfloat occlusionFade(vec4 frag) { return 1.0; }\n\n#endif\n"; + for (z = z - 1; z >= minzoom && !(tile && tile.hasData()); z--) { + if (tile) { + pathToLookup(tile.tileID.key); // Store lookup to parents not loaded (yet). + } + const id = sourceTileID.calculateScaledKey(z); + tile = sourceCache.getTileByID(id); + if (tile && tile.hasData()) break; + const key = lookup[id]; + if (key === null) { + break; // There's no tile loaded and no point searching further. + } else if (key !== undefined) { + tile = sourceCache.getTileByID(key); + ref_properties.assert_1(tile); + continue; + } + path.push(id); + } -var preludeFogVert = "#ifdef FOG\n\nuniform mat4 u_fog_matrix;\n\nvec3 fog_position(vec3 pos) {\n // The following function requires that u_fog_matrix be affine and\n // results in a vector with w = 1. Otherwise we must divide by w.\n return (u_fog_matrix * vec4(pos, 1.0)).xyz;\n}\n\nvec3 fog_position(vec2 pos) {\n return fog_position(vec3(pos, 0.0));\n}\n\nfloat fog(vec3 pos) {\n float depth = length(pos);\n float opacity = fog_opacity(fog_range(depth));\n return opacity * fog_horizon_blending(pos / depth);\n}\n\n#endif\n"; + pathToLookup(tile ? tile.tileID.key : null); + return tile && tile.hasData() ? tile : null; + } -var preludeFogFrag = "#ifdef FOG\n\nuniform float u_fog_temporal_offset;\n\n// This function is only used in rare places like heatmap where opacity is used\n// directly, outside the normal fog_apply method.\nfloat fog_opacity(vec3 pos) {\n float depth = length(pos);\n return fog_opacity(fog_range(depth));\n}\n\nvec3 fog_apply(vec3 color, vec3 pos) {\n float depth = length(pos);\n float opacity = fog_opacity(fog_range(depth));\n opacity *= fog_horizon_blending(pos / depth);\n return mix(color, u_fog_color.rgb, opacity);\n}\n\n// Apply fog computed in the vertex shader\nvec4 fog_apply_from_vert(vec4 color, float fog_opac) {\n float alpha = EPSILON + color.a;\n color.rgb = mix(color.rgb / alpha, u_fog_color.rgb, fog_opac) * alpha;\n return color;\n}\n\n// Assumes z up\nvec3 fog_apply_sky_gradient(vec3 camera_ray, vec3 sky_color) {\n float horizon_blend = fog_horizon_blending(normalize(camera_ray));\n return mix(sky_color, u_fog_color.rgb, horizon_blend);\n}\n\n// Un-premultiply the alpha, then blend fog, then re-premultiply alpha.\n// For use with colors using premultiplied alpha\nvec4 fog_apply_premultiplied(vec4 color, vec3 pos) {\n float alpha = EPSILON + color.a;\n color.rgb = fog_apply(color.rgb / alpha, pos) * alpha;\n return color;\n}\n\nvec3 fog_dither(vec3 color) {\n vec2 dither_seed = gl_FragCoord.xy + u_fog_temporal_offset;\n return dither(color, dither_seed);\n}\n\nvec4 fog_dither(vec4 color) {\n return vec4(fog_dither(color.rgb), color.a);\n}\n\n#endif\n"; + findDEMTileFor(tileID ) { + return this.enabled ? this._findTileCoveringTileID(tileID, this.sourceCache) : null; + } -var skyboxCaptureFrag = "// [1] Precomputed Atmospheric Scattering: https://hal.inria.fr/inria-00288758/document\n// [2] Earth Fact Sheet https://nssdc.gsfc.nasa.gov/planetary/factsheet/earthfact.html\n// [3] Tonemapping Operators http://filmicworlds.com/blog/filmic-tonemapping-operators\n\nvarying highp vec3 v_position;\n\nuniform highp float u_sun_intensity;\nuniform highp float u_luminance;\nuniform lowp vec3 u_sun_direction;\nuniform highp vec4 u_color_tint_r;\nuniform highp vec4 u_color_tint_m;\n\n#ifdef GL_ES\nprecision highp float;\n#endif\n\n// [1] equation (1) section 2.1. for λ = (680, 550, 440) nm,\n// which corresponds to scattering coefficients at sea level\n#define BETA_R vec3(5.5e-6, 13.0e-6, 22.4e-6)\n// The following constants are from [1] Figure 6 and section 2.1\n#define BETA_M vec3(21e-6, 21e-6, 21e-6)\n#define MIE_G 0.76\n#define DENSITY_HEIGHT_SCALE_R 8000.0 // m\n#define DENSITY_HEIGHT_SCALE_M 1200.0 // m\n// [1] and [2] section 2.1\n#define PLANET_RADIUS 6360e3 // m\n#define ATMOSPHERE_RADIUS 6420e3 // m\n#define SAMPLE_STEPS 10\n#define DENSITY_STEPS 4\n\nfloat ray_sphere_exit(vec3 orig, vec3 dir, float radius) {\n float a = dot(dir, dir);\n float b = 2.0 * dot(dir, orig);\n float c = dot(orig, orig) - radius * radius;\n float d = sqrt(b * b - 4.0 * a * c);\n return (-b + d) / (2.0 * a);\n}\n\nvec3 extinction(vec2 density) {\n return exp(-vec3(BETA_R * u_color_tint_r.a * density.x + BETA_M * u_color_tint_m.a * density.y));\n}\n\nvec2 local_density(vec3 point) {\n float height = max(length(point) - PLANET_RADIUS, 0.0);\n // Explicitly split in two shader statements, exp(vec2)\n // did not behave correctly on specific arm mali arch.\n float exp_r = exp(-height / DENSITY_HEIGHT_SCALE_R);\n float exp_m = exp(-height / DENSITY_HEIGHT_SCALE_M);\n return vec2(exp_r, exp_m);\n}\n\nfloat phase_ray(float cos_angle) {\n return (3.0 / (16.0 * PI)) * (1.0 + cos_angle * cos_angle);\n}\n\nfloat phase_mie(float cos_angle) {\n return (3.0 / (8.0 * PI)) * ((1.0 - MIE_G * MIE_G) * (1.0 + cos_angle * cos_angle)) /\n ((2.0 + MIE_G * MIE_G) * pow(1.0 + MIE_G * MIE_G - 2.0 * MIE_G * cos_angle, 1.5));\n}\n\nvec2 density_to_atmosphere(vec3 point, vec3 light_dir) {\n float ray_len = ray_sphere_exit(point, light_dir, ATMOSPHERE_RADIUS);\n float step_len = ray_len / float(DENSITY_STEPS);\n\n vec2 density_point_to_atmosphere = vec2(0.0);\n for (int i = 0; i < DENSITY_STEPS; ++i) {\n vec3 point_on_ray = point + light_dir * ((float(i) + 0.5) * step_len);\n density_point_to_atmosphere += local_density(point_on_ray) * step_len;;\n }\n\n return density_point_to_atmosphere;\n}\n\nvec3 atmosphere(vec3 ray_dir, vec3 sun_direction, float sun_intensity) {\n vec2 density_orig_to_point = vec2(0.0);\n vec3 scatter_r = vec3(0.0);\n vec3 scatter_m = vec3(0.0);\n vec3 origin = vec3(0.0, PLANET_RADIUS, 0.0);\n\n float ray_len = ray_sphere_exit(origin, ray_dir, ATMOSPHERE_RADIUS);\n float step_len = ray_len / float(SAMPLE_STEPS);\n for (int i = 0; i < SAMPLE_STEPS; ++i) {\n vec3 point_on_ray = origin + ray_dir * ((float(i) + 0.5) * step_len);\n\n // Local density\n vec2 density = local_density(point_on_ray) * step_len;\n density_orig_to_point += density;\n\n // Density from point to atmosphere\n vec2 density_point_to_atmosphere = density_to_atmosphere(point_on_ray, sun_direction);\n\n // Scattering contribution\n vec2 density_orig_to_atmosphere = density_orig_to_point + density_point_to_atmosphere;\n vec3 extinction = extinction(density_orig_to_atmosphere);\n scatter_r += density.x * extinction;\n scatter_m += density.y * extinction;\n }\n\n // The mie and rayleigh phase functions describe how much light\n // is scattered towards the eye when colliding with particles\n float cos_angle = dot(ray_dir, sun_direction);\n float phase_r = phase_ray(cos_angle);\n float phase_m = phase_mie(cos_angle);\n\n // Apply light color adjustments\n vec3 beta_r = BETA_R * u_color_tint_r.rgb * u_color_tint_r.a;\n vec3 beta_m = BETA_M * u_color_tint_m.rgb * u_color_tint_m.a;\n\n return (scatter_r * phase_r * beta_r + scatter_m * phase_m * beta_m) * sun_intensity;\n}\n\nconst float A = 0.15;\nconst float B = 0.50;\nconst float C = 0.10;\nconst float D = 0.20;\nconst float E = 0.02;\nconst float F = 0.30;\n\nvec3 uncharted2_tonemap(vec3 x) {\n return ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F;\n}\n\nvoid main() {\n vec3 ray_direction = v_position;\n\n // Non-linear UV parameterization to increase horizon events\n ray_direction.y = pow(ray_direction.y, 5.0);\n\n // Add a small offset to prevent black bands around areas where\n // the scattering algorithm does not manage to gather lighting\n const float y_bias = 0.015;\n ray_direction.y += y_bias;\n\n vec3 color = atmosphere(normalize(ray_direction), u_sun_direction, u_sun_intensity);\n\n // Apply exposure [3]\n float white_scale = 1.0748724675633854; // 1.0 / uncharted2_tonemap(1000.0)\n color = uncharted2_tonemap((log2(2.0 / pow(u_luminance, 4.0))) * color) * white_scale;\n\n gl_FragColor = vec4(color, 1.0);\n}\n"; + /* + * Bookkeeping if something gets rendered to the tile. + */ + prepareDrawTile() { + this.renderedToTile = true; + } -var skyboxCaptureVert = "attribute highp vec3 a_pos_3f;\n\nuniform mat3 u_matrix_3f;\n\nvarying highp vec3 v_position;\n\nfloat map(float value, float start, float end, float new_start, float new_end) {\n return ((value - start) * (new_end - new_start)) / (end - start) + new_start;\n}\n\nvoid main() {\n vec4 pos = vec4(u_matrix_3f * a_pos_3f, 1.0);\n\n v_position = pos.xyz;\n v_position.y *= -1.0;\n\n // To make better utilization of the visible range (e.g. over the horizon, UVs\n // from 0.0 to 1.0 on the Y-axis in cubemap space), the UV range is remapped from\n // (-1.0,1.0) to (0.0,1.0) on y. The inverse operation is applied when sampling.\n v_position.y = map(v_position.y, -1.0, 1.0, 0.0, 1.0);\n\n gl_Position = vec4(a_pos_3f.xy, 0.0, 1.0);\n}\n"; + _clearRenderCacheForTile(source , coord ) { + let sourceTiles = this._tilesDirty[source]; + if (!sourceTiles) sourceTiles = this._tilesDirty[source] = {}; + sourceTiles[coord.key] = true; + } -var globeFrag = "uniform sampler2D u_image0;\nvarying vec2 v_pos0;\n\nvoid main() {\n gl_FragColor = texture2D(u_image0, v_pos0);\n#ifdef TERRAIN_WIREFRAME\n gl_FragColor = vec4(1.0, 0.0, 0.0, 0.8);\n#endif\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n"; + /* + * Lazily instantiate the wireframe index buffer and segment vector so that we don't + * allocate the geometry for rendering a debug wireframe until it's needed. + */ + getWirefameBuffer() { + if (!this.wireframeSegments) { + const wireframeGridIndices = createWireframeGrid(GRID_DIM + 1); + this.wireframeIndexBuffer = this.painter.context.createIndexBuffer(wireframeGridIndices); + this.wireframeSegments = ref_properties.SegmentVector.simpleSegment(0, 0, this.gridBuffer.length, wireframeGridIndices.length); + } + return [this.wireframeIndexBuffer, this.wireframeSegments]; + } -var globeVert = "uniform mat4 u_proj_matrix;\nuniform mat4 u_globe_matrix;\nuniform mat4 u_merc_matrix;\nuniform float u_zoom_transition;\nuniform vec2 u_merc_center;\n\nattribute vec3 a_globe_pos;\nattribute vec2 a_merc_pos;\nattribute vec2 a_uv;\n\nvarying vec2 v_pos0;\n\nconst float wireframeOffset = 1e3;\n\nvoid main() {\n v_pos0 = a_uv;\n\n vec2 uv = a_uv * EXTENT;\n vec4 up_vector = vec4(elevationVector(uv), 1.0);\n float height = elevation(uv);\n\n#ifdef TERRAIN_WIREFRAME\n height += wireframeOffset;\n#endif\n\n vec4 globe = u_globe_matrix * vec4(a_globe_pos + up_vector.xyz * height, 1.0);\n\n vec4 mercator = vec4(0.0);\n if (u_zoom_transition > 0.0) {\n mercator = vec4(a_merc_pos, height, 1.0);\n mercator.xy -= u_merc_center;\n mercator.x = wrap(mercator.x, -0.5, 0.5);\n mercator = u_merc_matrix * mercator;\n }\n\n vec3 position = mix(globe.xyz, mercator.xyz, u_zoom_transition);\n\n gl_Position = u_proj_matrix * vec4(position, 1.0);\n}\n"; +} -var atmosphereFrag = "uniform vec2 u_center;\nuniform float u_radius;\nuniform vec2 u_screen_size;\n\nuniform float u_opacity;\nuniform highp float u_fadeout_range;\nuniform vec3 u_start_color;\nuniform vec3 u_end_color;\nuniform float u_pixel_ratio;\n\nvoid main() {\n highp vec2 fragCoord = gl_FragCoord.xy / u_pixel_ratio;\n fragCoord.y = u_screen_size.y - fragCoord.y;\n float distFromCenter = length(fragCoord - u_center);\n\n float normDistFromCenter = length(fragCoord - u_center) / u_radius;\n\n if (normDistFromCenter < 1.0)\n discard;\n\n // exponential (sqrt) curve\n // [0.0, 1.0] == inside the globe, > 1.0 == outside of the globe\n float t = clamp(1.0 - sqrt(normDistFromCenter - 1.0) / u_fadeout_range, 0.0, 1.0);\n\n vec3 color = mix(u_start_color, u_end_color, 1.0 - t);\n\n gl_FragColor = vec4(color * t * u_opacity, u_opacity);\n}\n"; +function sortByDistanceToCamera(tileIDs, painter) { + const cameraCoordinate = painter.transform.pointCoordinate(painter.transform.getCameraPoint()); + const cameraPoint = new ref_properties.pointGeometry(cameraCoordinate.x, cameraCoordinate.y); + tileIDs.sort((a, b) => { + if (b.overscaledZ - a.overscaledZ) return b.overscaledZ - a.overscaledZ; + const aPoint = new ref_properties.pointGeometry(a.canonical.x + (1 << a.canonical.z) * a.wrap, a.canonical.y); + const bPoint = new ref_properties.pointGeometry(b.canonical.x + (1 << b.canonical.z) * b.wrap, b.canonical.y); + const cameraScaled = cameraPoint.mult(1 << a.canonical.z); + cameraScaled.x -= 0.5; + cameraScaled.y -= 0.5; + return cameraScaled.distSqr(aPoint) - cameraScaled.distSqr(bPoint); + }); +} -var atmosphereVert = "attribute vec3 a_pos;\n\nvoid main() {\n gl_Position = vec4(a_pos, 1.0);\n}\n"; +/** + * Creates uniform grid of triangles, covering EXTENT x EXTENT square, with two + * adjustent traigles forming a quad, so that there are |count| columns and rows + * of these quads in EXTENT x EXTENT square. + * e.g. for count of 2: + * ------------- + * | /| /| + * | / | / | + * |/ |/ | + * ------------- + * | /| /| + * | / | / | + * |/ |/ | + * ------------- + * @param {number} count Count of rows and columns + * @private + */ +function createGrid(count ) { + const boundsArray = new ref_properties.StructArrayLayout4i8(); + // Around the grid, add one more row/column padding for "skirt". + const indexArray = new ref_properties.StructArrayLayout3ui6(); + const size = count + 2; + boundsArray.reserve(size * size); + indexArray.reserve((size - 1) * (size - 1) * 2); + const step = ref_properties.EXTENT / (count - 1); + const gridBound = ref_properties.EXTENT + step / 2; + const bound = gridBound + step; -let preludeTerrain = {}; -let preludeFog = {}; + // Skirt offset of 0x5FFF is chosen randomly to encode boolean value (skirt + // on/off) with x position (max value EXTENT = 4096) to 16-bit signed integer. + const skirtOffset = 24575; // 0x5FFF + for (let y = -step; y < bound; y += step) { + for (let x = -step; x < bound; x += step) { + const offset = (x < 0 || x > gridBound || y < 0 || y > gridBound) ? skirtOffset : 0; + const xi = ref_properties.clamp(Math.round(x), 0, ref_properties.EXTENT); + const yi = ref_properties.clamp(Math.round(y), 0, ref_properties.EXTENT); + boundsArray.emplaceBack(xi + offset, yi, xi, yi); + } + } -preludeTerrain = compile('', preludeTerrainVert, true); -preludeFog = compile(preludeFogFrag, preludeFogVert, true); + // For cases when there's no need to render "skirt", the "inner" grid indices + // are followed by skirt indices. + const skirtIndicesOffset = (size - 3) * (size - 3) * 2; + const quad = (i, j) => { + const index = j * size + i; + indexArray.emplaceBack(index + 1, index, index + size); + indexArray.emplaceBack(index + size, index + size + 1, index + 1); + }; + for (let j = 1; j < size - 2; j++) { + for (let i = 1; i < size - 2; i++) { + quad(i, j); + } + } + // Padding (skirt) indices: + [0, size - 2].forEach(j => { + for (let i = 0; i < size - 1; i++) { + quad(i, j); + quad(j, i); + } + }); + return [boundsArray, indexArray, skirtIndicesOffset]; +} -const prelude = compile(preludeFrag, preludeVert); -const preludeCommonSource = preludeCommon; +/** + * Creates a grid of indices corresponding to the grid constructed by createGrid + * in order to render that grid as a wireframe rather than a solid mesh. It does + * not create a skirt and so only goes from 1 to count + 1, e.g. for count of 2: + * ------------- + * | /| /| + * | / | / | + * |/ |/ | + * ------------- + * | /| /| + * | / | / | + * |/ |/ | + * ------------- + * @param {number} count Count of rows and columns + * @private + */ +function createWireframeGrid(count ) { + let index = 0; + const indexArray = new ref_properties.StructArrayLayout2ui4(); + const size = count + 2; + // Draw two edges of a quad and its diagonal. The very last row and column have + // an additional line to close off the grid. + for (let j = 1; j < count; j++) { + for (let i = 1; i < count; i++) { + index = j * size + i; + indexArray.emplaceBack(index, index + 1); + indexArray.emplaceBack(index, index + size); + indexArray.emplaceBack(index + 1, index + size); -const preludeVertPrecisionQualifiers = ` -#ifdef GL_ES -precision highp float; -#else + // Place an extra line at the end of each row + if (j === count - 1) indexArray.emplaceBack(index + size, index + size + 1); + } + // Place an extra line at the end of each col + indexArray.emplaceBack(index + 1, index + 1 + size); + } + return indexArray; +} -#if !defined(lowp) -#define lowp -#endif + + + + + + + + + + + + + + + + + + + + + -#if !defined(mediump) -#define mediump -#endif +const terrainUniforms = (context , locations ) => ({ + 'u_dem': new ref_properties.Uniform1i(context, locations.u_dem), + 'u_dem_prev': new ref_properties.Uniform1i(context, locations.u_dem_prev), + 'u_dem_unpack': new ref_properties.Uniform4f(context, locations.u_dem_unpack), + 'u_dem_tl': new ref_properties.Uniform2f(context, locations.u_dem_tl), + 'u_dem_scale': new ref_properties.Uniform1f(context, locations.u_dem_scale), + 'u_dem_tl_prev': new ref_properties.Uniform2f(context, locations.u_dem_tl_prev), + 'u_dem_scale_prev': new ref_properties.Uniform1f(context, locations.u_dem_scale_prev), + 'u_dem_size': new ref_properties.Uniform1f(context, locations.u_dem_size), + 'u_dem_lerp': new ref_properties.Uniform1f(context, locations.u_dem_lerp), + 'u_exaggeration': new ref_properties.Uniform1f(context, locations.u_exaggeration), + 'u_depth': new ref_properties.Uniform1i(context, locations.u_depth), + 'u_depth_size_inv': new ref_properties.Uniform2f(context, locations.u_depth_size_inv), + 'u_meter_to_dem': new ref_properties.Uniform1f(context, locations.u_meter_to_dem), + 'u_label_plane_matrix_inv': new ref_properties.UniformMatrix4f(context, locations.u_label_plane_matrix_inv), + 'u_tile_tl_up': new ref_properties.Uniform3f(context, locations.u_tile_tl_up), + 'u_tile_tr_up': new ref_properties.Uniform3f(context, locations.u_tile_tr_up), + 'u_tile_br_up': new ref_properties.Uniform3f(context, locations.u_tile_br_up), + 'u_tile_bl_up': new ref_properties.Uniform3f(context, locations.u_tile_bl_up), + 'u_tile_up_scale': new ref_properties.Uniform1f(context, locations.u_tile_up_scale) +}); -#if !defined(highp) -#define highp -#endif +function defaultTerrainUniforms(encoding ) { + return { + 'u_dem': 2, + 'u_dem_prev': 4, + 'u_dem_unpack': ref_properties.DEMData.getUnpackVector(encoding), + 'u_dem_tl': [0, 0], + 'u_dem_tl_prev': [0, 0], + 'u_dem_scale': 0, + 'u_dem_scale_prev': 0, + 'u_dem_size': 0, + 'u_dem_lerp': 1.0, + 'u_depth': 3, + 'u_depth_size_inv': [0, 0], + 'u_exaggeration': 0, + 'u_tile_tl_up': [0, 0, 1], + 'u_tile_tr_up': [0, 0, 1], + 'u_tile_br_up': [0, 0, 1], + 'u_tile_bl_up': [0, 0, 1], + 'u_tile_up_scale': 1 + }; +} -#endif`; -const preludeFragPrecisionQualifiers = ` -#ifdef GL_ES -precision mediump float; -#else +// -#if !defined(lowp) -#define lowp -#endif + + + + + + + + + + + + + + + + -#if !defined(mediump) -#define mediump -#endif +const fogUniforms = (context , locations ) => ({ + 'u_fog_matrix': new ref_properties.UniformMatrix4f(context, locations.u_fog_matrix), + 'u_fog_range': new ref_properties.Uniform2f(context, locations.u_fog_range), + 'u_fog_color': new ref_properties.Uniform4f(context, locations.u_fog_color), + 'u_fog_horizon_blend': new ref_properties.Uniform1f(context, locations.u_fog_horizon_blend), + 'u_fog_temporal_offset': new ref_properties.Uniform1f(context, locations.u_fog_temporal_offset), + 'u_frustum_tl': new ref_properties.Uniform3f(context, locations.u_frustum_tl), + 'u_frustum_tr': new ref_properties.Uniform3f(context, locations.u_frustum_tr), + 'u_frustum_br': new ref_properties.Uniform3f(context, locations.u_frustum_br), + 'u_frustum_bl': new ref_properties.Uniform3f(context, locations.u_frustum_bl), + 'u_globe_pos': new ref_properties.Uniform3f(context, locations.u_globe_pos), + 'u_globe_radius': new ref_properties.Uniform1f(context, locations.u_globe_radius), + 'u_globe_transition': new ref_properties.Uniform1f(context, locations.u_globe_transition), + 'u_is_globe': new ref_properties.Uniform1i(context, locations.u_is_globe), + 'u_viewport': new ref_properties.Uniform2f(context, locations.u_viewport) +}); -#if !defined(highp) -#define highp -#endif +const fogUniformValues = ( + painter , + fog , + tileID , + fogOpacity , + frustumDirTl , + frustumDirTr , + frustumDirBr , + frustumDirBl , + globePosition , + globeRadius , + viewport +) => { + const tr = painter.transform; + const fogColor = fog.properties.get('color').toArray01(); + fogColor[3] = fogOpacity; // Update Alpha + const temporalOffset = (painter.frameCounter / 1000.0) % 1; + return { + 'u_fog_matrix': tileID ? tr.calculateFogTileMatrix(tileID) : painter.identityMat, + 'u_fog_range': fog.getFovAdjustedRange(tr._fov), + 'u_fog_color': fogColor, + 'u_fog_horizon_blend': fog.properties.get('horizon-blend'), + 'u_fog_temporal_offset': temporalOffset, + 'u_frustum_tl': frustumDirTl, + 'u_frustum_tr': frustumDirTr, + 'u_frustum_br': frustumDirBr, + 'u_frustum_bl': frustumDirBl, + 'u_globe_pos': globePosition, + 'u_globe_radius': globeRadius, + 'u_viewport': viewport, + 'u_globe_transition': ref_properties.globeToMercatorTransition(tr.zoom), + 'u_is_globe': +(tr.projection.name === 'globe') + }; +}; -#endif`; +// + -var shaders = { - background: compile(backgroundFrag, backgroundVert), - backgroundPattern: compile(backgroundPatternFrag, backgroundPatternVert), - circle: compile(circleFrag, circleVert), - clippingMask: compile(clippingMaskFrag, clippingMaskVert), - heatmap: compile(heatmapFrag, heatmapVert), - heatmapTexture: compile(heatmapTextureFrag, heatmapTextureVert), - collisionBox: compile(collisionBoxFrag, collisionBoxVert), - collisionCircle: compile(collisionCircleFrag, collisionCircleVert), - debug: compile(debugFrag, debugVert), - fill: compile(fillFrag, fillVert), - fillOutline: compile(fillOutlineFrag, fillOutlineVert), - fillOutlinePattern: compile(fillOutlinePatternFrag, fillOutlinePatternVert), - fillPattern: compile(fillPatternFrag, fillPatternVert), - fillExtrusion: compile(fillExtrusionFrag, fillExtrusionVert), - fillExtrusionPattern: compile(fillExtrusionPatternFrag, fillExtrusionPatternVert), - hillshadePrepare: compile(hillshadePrepareFrag, hillshadePrepareVert), - hillshade: compile(hillshadeFrag, hillshadeVert), - line: compile(lineFrag, lineVert), - linePattern: compile(linePatternFrag, linePatternVert), - raster: compile(rasterFrag, rasterVert), - symbolIcon: compile(symbolIconFrag, symbolIconVert), - symbolSDF: compile(symbolSDFFrag, symbolSDFVert), - symbolTextAndIcon: compile(symbolTextAndIconFrag, symbolTextAndIconVert), - terrainRaster: compile(terrainRasterFrag, terrainRasterVert), - terrainDepth: compile(terrainDepthFrag, terrainDepthVert), - skybox: compile(skyboxFrag, skyboxVert), - skyboxGradient: compile(skyboxGradientFrag, skyboxVert), - skyboxCapture: compile(skyboxCaptureFrag, skyboxCaptureVert), - globeRaster: compile(globeFrag, globeVert), - globeAtmosphere: compile(atmosphereFrag, atmosphereVert) -}; + + + + + + + + + -// Expand #pragmas to #ifdefs. -function compile(fragmentSource, vertexSource, isGlobalPrelude) { - const pragmaRegex = /#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g; - const uniformRegex = /uniform (highp |mediump |lowp )?([\w]+) ([\w]+)([\s]*)([\w]*)/g; - const attributeRegex = /attribute (highp |mediump |lowp )?([\w]+) ([\w]+)/g; + + + + - const staticAttributes = vertexSource.match(attributeRegex); - const fragmentUniforms = fragmentSource.match(uniformRegex); - const vertexUniforms = vertexSource.match(uniformRegex); - const commonUniforms = preludeCommon.match(uniformRegex); +function getTokenizedAttributesAndUniforms (array ) { + const result = []; - let staticUniforms = vertexUniforms ? vertexUniforms.concat(fragmentUniforms) : fragmentUniforms; + for (let i = 0; i < array.length; i++) { + if (array[i] === null) continue; + const token = array[i].split(' '); + result.push(token.pop()); + } + return result; +} +class Program { + + + + + + + + - if (!isGlobalPrelude) { - if (preludeTerrain.staticUniforms) { - staticUniforms = preludeTerrain.staticUniforms.concat(staticUniforms); - } - if (preludeFog.staticUniforms) { - staticUniforms = preludeFog.staticUniforms.concat(staticUniforms); + static cacheKey(name , defines , programConfiguration ) { + let key = `${name}${programConfiguration ? programConfiguration.cacheKey : ''}`; + for (const define of defines) { + key += `/${define}`; } + return key; } - if (staticUniforms) { - staticUniforms = staticUniforms.concat(commonUniforms); - } + constructor(context , + name , + source , + configuration , + fixedUniforms , + fixedDefines ) { + const gl = context.gl; + this.program = gl.createProgram(); - const fragmentPragmas = {}; + const staticAttrInfo = getTokenizedAttributesAndUniforms(source.staticAttributes); + const dynamicAttrInfo = configuration ? configuration.getBinderAttributes() : []; + const allAttrInfo = staticAttrInfo.concat(dynamicAttrInfo); - fragmentSource = fragmentSource.replace(pragmaRegex, (match, operation, precision, type, name) => { - fragmentPragmas[name] = true; - if (operation === 'define') { - return ` -#ifndef HAS_UNIFORM_u_${name} -varying ${precision} ${type} ${name}; -#else -uniform ${precision} ${type} u_${name}; -#endif -`; - } else /* if (operation === 'initialize') */ { - return ` -#ifdef HAS_UNIFORM_u_${name} - ${precision} ${type} ${name} = u_${name}; -#endif -`; + const staticUniformsInfo = source.staticUniforms ? getTokenizedAttributesAndUniforms(source.staticUniforms) : []; + const dynamicUniformsInfo = configuration ? configuration.getBinderUniforms() : []; + // remove duplicate uniforms + const uniformList = staticUniformsInfo.concat(dynamicUniformsInfo); + const allUniformsInfo = []; + for (const uniform of uniformList) { + if (allUniformsInfo.indexOf(uniform) < 0) allUniformsInfo.push(uniform); } - }); - vertexSource = vertexSource.replace(pragmaRegex, (match, operation, precision, type, name) => { - const attrType = type === 'float' ? 'vec2' : 'vec4'; - const unpackType = name.match(/color/) ? 'color' : attrType; + let defines = configuration ? configuration.defines() : []; + defines = defines.concat(fixedDefines.map((define) => `#define ${define}`)); - if (fragmentPragmas[name]) { - if (operation === 'define') { - return ` -#ifndef HAS_UNIFORM_u_${name} -uniform lowp float u_${name}_t; -attribute ${precision} ${attrType} a_${name}; -varying ${precision} ${type} ${name}; -#else -uniform ${precision} ${type} u_${name}; -#endif -`; - } else /* if (operation === 'initialize') */ { - if (unpackType === 'vec4') { - // vec4 attributes are only used for cross-faded properties, and are not packed - return ` -#ifndef HAS_UNIFORM_u_${name} - ${name} = a_${name}; -#else - ${precision} ${type} ${name} = u_${name}; -#endif -`; - } else { - return ` -#ifndef HAS_UNIFORM_u_${name} - ${name} = unpack_mix_${unpackType}(a_${name}, u_${name}_t); -#else - ${precision} ${type} ${name} = u_${name}; -#endif -`; - } - } - } else { - if (operation === 'define') { - return ` -#ifndef HAS_UNIFORM_u_${name} -uniform lowp float u_${name}_t; -attribute ${precision} ${attrType} a_${name}; -#else -uniform ${precision} ${type} u_${name}; -#endif -`; - } else /* if (operation === 'initialize') */ { - if (unpackType === 'vec4') { - // vec4 attributes are only used for cross-faded properties, and are not packed - return ` -#ifndef HAS_UNIFORM_u_${name} - ${precision} ${type} ${name} = a_${name}; -#else - ${precision} ${type} ${name} = u_${name}; -#endif -`; - } else /* */{ - return ` -#ifndef HAS_UNIFORM_u_${name} - ${precision} ${type} ${name} = unpack_mix_${unpackType}(a_${name}, u_${name}_t); -#else - ${precision} ${type} ${name} = u_${name}; -#endif -`; - } - } + const fragmentSource = defines.concat( + context.extStandardDerivatives ? standardDerivativesExt.concat(preludeFragPrecisionQualifiers) : preludeFragPrecisionQualifiers, + preludeFragPrecisionQualifiers, + preludeCommonSource, + prelude.fragmentSource, + preludeFog.fragmentSource, + source.fragmentSource).join('\n'); + const vertexSource = defines.concat( + preludeVertPrecisionQualifiers, + preludeCommonSource, + prelude.vertexSource, + preludeFog.vertexSource, + preludeTerrain.vertexSource, + source.vertexSource).join('\n'); + const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); + if (gl.isContextLost()) { + this.failedToCreate = true; + return; } - }); - - return {fragmentSource, vertexSource, staticAttributes, staticUniforms}; -} - -// - - - - - - -class VertexArrayObject { - - - - - - - - - + gl.shaderSource(fragmentShader, fragmentSource); + gl.compileShader(fragmentShader); + ref_properties.assert_1(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(fragmentShader) )); + gl.attachShader(this.program, fragmentShader); - constructor() { - this.boundProgram = null; - this.boundLayoutVertexBuffer = null; - this.boundPaintVertexBuffers = []; - this.boundIndexBuffer = null; - this.boundVertexOffset = null; - this.boundDynamicVertexBuffer = null; - this.vao = null; - } + const vertexShader = gl.createShader(gl.VERTEX_SHADER); + if (gl.isContextLost()) { + this.failedToCreate = true; + return; + } + gl.shaderSource(vertexShader, vertexSource); + gl.compileShader(vertexShader); + ref_properties.assert_1(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(vertexShader) )); + gl.attachShader(this.program, vertexShader); - bind(context , - program , - layoutVertexBuffer , - paintVertexBuffers , - indexBuffer , - vertexOffset , - dynamicVertexBuffer , - dynamicVertexBuffer2 ) { + this.attributes = {}; + const uniformLocations = {}; - this.context = context; + this.numAttributes = allAttrInfo.length; - let paintBuffersDiffer = this.boundPaintVertexBuffers.length !== paintVertexBuffers.length; - for (let i = 0; !paintBuffersDiffer && i < paintVertexBuffers.length; i++) { - if (this.boundPaintVertexBuffers[i] !== paintVertexBuffers[i]) { - paintBuffersDiffer = true; + for (let i = 0; i < this.numAttributes; i++) { + if (allAttrInfo[i]) { + gl.bindAttribLocation(this.program, i, allAttrInfo[i]); + this.attributes[allAttrInfo[i]] = i; } } - const 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); + gl.linkProgram(this.program); + ref_properties.assert_1(gl.getProgramParameter(this.program, gl.LINK_STATUS), (gl.getProgramInfoLog(this.program) )); - if (dynamicVertexBuffer) { - // The buffer may have been updated. Rebind to upload data. - dynamicVertexBuffer.bind(); - } + gl.deleteShader(vertexShader); + gl.deleteShader(fragmentShader); - if (indexBuffer && indexBuffer.dynamicDraw) { - indexBuffer.bind(); + for (let it = 0; it < allUniformsInfo.length; it++) { + const uniform = allUniformsInfo[it]; + if (uniform && !uniformLocations[uniform]) { + const uniformLocation = gl.getUniformLocation(this.program, uniform); + if (uniformLocation) { + uniformLocations[uniform] = uniformLocation; + } } + } - if (dynamicVertexBuffer2) { - dynamicVertexBuffer2.bind(); - } + this.fixedUniforms = fixedUniforms(context, uniformLocations); + this.binderUniforms = configuration ? configuration.getUniforms(context, uniformLocations) : []; + if (fixedDefines.indexOf('TERRAIN') !== -1) { + this.terrainUniforms = terrainUniforms(context, uniformLocations); + } + if (fixedDefines.indexOf('FOG') !== -1) { + this.fogUniforms = fogUniforms(context, uniformLocations); } } - freshBind(program , - layoutVertexBuffer , - paintVertexBuffers , - indexBuffer , - vertexOffset , - dynamicVertexBuffer , - dynamicVertexBuffer2 ) { - let numPrevAttributes; - const numNextAttributes = program.numAttributes; + setTerrainUniformValues(context , terrainUniformValues ) { + if (!this.terrainUniforms) return; + const uniforms = this.terrainUniforms; - const context = this.context; - const gl = context.gl; + if (this.failedToCreate) return; + context.program.set(this.program); - if (context.extVertexArrayObject) { - if (this.vao) this.destroy(); - this.vao = context.extVertexArrayObject.createVertexArrayOES(); - context.bindVertexArrayOES.set(this.vao); - numPrevAttributes = 0; + for (const name in terrainUniformValues) { + uniforms[name].set(terrainUniformValues[name]); + } + } - // 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; + setFogUniformValues(context , fogUniformsValues ) { + if (!this.fogUniforms) return; + const uniforms = this.fogUniforms; - } else { - numPrevAttributes = context.currentNumAttributes || 0; + if (this.failedToCreate) return; + context.program.set(this.program); - // Disable all attributes from the previous program that aren't used in - // the new program. Note: attribute indices are *not* program specific! - for (let i = numNextAttributes; i < numPrevAttributes; i++) { - // WebGL breaks if you disable attribute 0. - // http://stackoverflow.com/questions/20305231 - transform.assert_1(i !== 0); - gl.disableVertexAttribArray(i); + for (const name in fogUniformsValues) { + if (uniforms[name].location) { + uniforms[name].set(fogUniformsValues[name]); } } + } - layoutVertexBuffer.enableAttributes(gl, program); - for (const vertexBuffer of paintVertexBuffers) { - vertexBuffer.enableAttributes(gl, program); - } + draw( + context , + drawMode , + depthMode , + stencilMode , + colorMode , + cullFaceMode , + uniformValues , + layerID , + layoutVertexBuffer , + indexBuffer , + segments , + currentProperties , + zoom , + configuration , + dynamicLayoutBuffer , + dynamicLayoutBuffer2 , + dynamicLayoutBuffer3 ) { - if (dynamicVertexBuffer) { - dynamicVertexBuffer.enableAttributes(gl, program); - } - if (dynamicVertexBuffer2) { - dynamicVertexBuffer2.enableAttributes(gl, program); - } + const gl = context.gl; - layoutVertexBuffer.bind(); - layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); - for (const vertexBuffer of paintVertexBuffers) { - vertexBuffer.bind(); - vertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); - } + if (this.failedToCreate) return; - if (dynamicVertexBuffer) { - dynamicVertexBuffer.bind(); - dynamicVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); - } - if (indexBuffer) { - indexBuffer.bind(); + context.program.set(this.program); + context.setDepthMode(depthMode); + context.setStencilMode(stencilMode); + context.setColorMode(colorMode); + context.setCullFace(cullFaceMode); + + for (const name of Object.keys(this.fixedUniforms)) { + this.fixedUniforms[name].set(uniformValues[name]); } - if (dynamicVertexBuffer2) { - dynamicVertexBuffer2.bind(); - dynamicVertexBuffer2.setVertexAttribPointers(gl, program, vertexOffset); + + if (configuration) { + configuration.setUniforms(context, this.binderUniforms, currentProperties, {zoom: (zoom )}); } - context.currentNumAttributes = numNextAttributes; - } + const primitiveSize = { + [gl.LINES]: 2, + [gl.TRIANGLES]: 3, + [gl.LINE_STRIP]: 1 + }[drawMode]; - destroy() { - if (this.vao) { - this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao); - this.vao = null; + for (const segment of segments.get()) { + const vaos = segment.vaos || (segment.vaos = {}); + const vao = vaos[layerID] || (vaos[layerID] = new VertexArrayObject()); + + vao.bind( + context, + this, + layoutVertexBuffer, + configuration ? configuration.getPaintVertexBuffers() : [], + indexBuffer, + segment.vertexOffset, + dynamicLayoutBuffer, + dynamicLayoutBuffer2, + dynamicLayoutBuffer3 + ); + + gl.drawElements( + drawMode, + segment.primitiveLength * primitiveSize, + gl.UNSIGNED_SHORT, + segment.primitiveOffset * primitiveSize * 2); } } } // - - - - - + + + + + - + + + + + + + + + + + + + + + + + + - + - + + + + + +function patternUniformValues(crossfade , painter , + tile +) { + + const tileRatio = 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom); + + const numTiles = Math.pow(2, tile.tileID.overscaledZ); + const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; + + const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); + const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; + + return { + 'u_image': 0, + 'u_texsize': tile.imageAtlasTexture.size, + 'u_scale': [tileRatio, crossfade.fromScale, crossfade.toScale], + 'u_fade': crossfade.t, + // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision. + 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16], + 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF] + }; +} + +function bgPatternUniformValues(image , crossfade , painter , + tile +) { + const imagePosA = painter.imageManager.getPattern(image.from.toString()); + const imagePosB = painter.imageManager.getPattern(image.to.toString()); + ref_properties.assert_1(imagePosA && imagePosB); + const {width, height} = painter.imageManager.getPixelSize(); + + const numTiles = Math.pow(2, tile.tileID.overscaledZ); + const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; + + const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); + const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; + + return { + 'u_image': 0, + 'u_pattern_tl_a': (imagePosA ).tl, + 'u_pattern_br_a': (imagePosA ).br, + 'u_pattern_tl_b': (imagePosB ).tl, + 'u_pattern_br_b': (imagePosB ).br, + 'u_texsize': [width, height], + 'u_mix': crossfade.t, + 'u_pattern_size_a': (imagePosA ).displaySize, + 'u_pattern_size_b': (imagePosB ).displaySize, + 'u_scale_a': crossfade.fromScale, + 'u_scale_b': crossfade.toScale, + 'u_tile_units_to_pixels': 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom), + // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision. + 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16], + 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF] + }; +} + +// + + + + + + + + + + + + + - + - - + + + + + + + + + + + + + + + + + + -const hillshadeUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_image': new transform.Uniform1i(context, locations.u_image), - 'u_latrange': new transform.Uniform2f(context, locations.u_latrange), - 'u_light': new transform.Uniform2f(context, locations.u_light), - 'u_shadow': new transform.UniformColor(context, locations.u_shadow), - 'u_highlight': new transform.UniformColor(context, locations.u_highlight), - 'u_accent': new transform.UniformColor(context, locations.u_accent) +const fillExtrusionUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_lightpos': new ref_properties.Uniform3f(context, locations.u_lightpos), + 'u_lightintensity': new ref_properties.Uniform1f(context, locations.u_lightintensity), + 'u_lightcolor': new ref_properties.Uniform3f(context, locations.u_lightcolor), + 'u_vertical_gradient': new ref_properties.Uniform1f(context, locations.u_vertical_gradient), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity), + // globe uniforms: + 'u_tile_id': new ref_properties.Uniform3f(context, locations.u_tile_id), + 'u_zoom_transition': new ref_properties.Uniform1f(context, locations.u_zoom_transition), + 'u_inv_rot_matrix': new ref_properties.UniformMatrix4f(context, locations.u_inv_rot_matrix), + 'u_merc_center': new ref_properties.Uniform2f(context, locations.u_merc_center), + 'u_up_dir': new ref_properties.Uniform3f(context, locations.u_up_dir), + 'u_height_lift': new ref_properties.Uniform1f(context, locations.u_height_lift) }); -const hillshadePrepareUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_image': new transform.Uniform1i(context, locations.u_image), - 'u_dimension': new transform.Uniform2f(context, locations.u_dimension), - 'u_zoom': new transform.Uniform1f(context, locations.u_zoom), - 'u_unpack': new transform.Uniform4f(context, locations.u_unpack) +const fillExtrusionPatternUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_lightpos': new ref_properties.Uniform3f(context, locations.u_lightpos), + 'u_lightintensity': new ref_properties.Uniform1f(context, locations.u_lightintensity), + 'u_lightcolor': new ref_properties.Uniform3f(context, locations.u_lightcolor), + 'u_vertical_gradient': new ref_properties.Uniform1f(context, locations.u_vertical_gradient), + 'u_height_factor': new ref_properties.Uniform1f(context, locations.u_height_factor), + // globe uniforms: + 'u_tile_id': new ref_properties.Uniform3f(context, locations.u_tile_id), + 'u_zoom_transition': new ref_properties.Uniform1f(context, locations.u_zoom_transition), + 'u_inv_rot_matrix': new ref_properties.UniformMatrix4f(context, locations.u_inv_rot_matrix), + 'u_merc_center': new ref_properties.Uniform2f(context, locations.u_merc_center), + 'u_up_dir': new ref_properties.Uniform3f(context, locations.u_up_dir), + 'u_height_lift': new ref_properties.Uniform1f(context, locations.u_height_lift), + // pattern uniforms + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_pixel_coord_upper': new ref_properties.Uniform2f(context, locations.u_pixel_coord_upper), + 'u_pixel_coord_lower': new ref_properties.Uniform2f(context, locations.u_pixel_coord_lower), + 'u_scale': new ref_properties.Uniform3f(context, locations.u_scale), + 'u_fade': new ref_properties.Uniform1f(context, locations.u_fade), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity) }); -const hillshadeUniformValues = ( - painter , - tile , - layer , - matrix -) => { - const shadow = layer.paint.get("hillshade-shadow-color"); - const highlight = layer.paint.get("hillshade-highlight-color"); - const accent = layer.paint.get("hillshade-accent-color"); +const identityMatrix$3 = ref_properties.create(); - let 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; +const fillExtrusionUniformValues = ( + matrix , + painter , + shouldUseVerticalGradient , + opacity , + coord , + heightLift , + zoomTransition , + mercatorCenter , + invMatrix +) => { + const light = painter.style.light; + const _lp = light.properties.get('position'); + const lightPos = [_lp.x, _lp.y, _lp.z]; + const lightMat = ref_properties.create$1(); + const anchor = light.properties.get('anchor'); + if (anchor === 'viewport') { + ref_properties.fromRotation(lightMat, -painter.transform.angle); + ref_properties.transformMat3(lightPos, lightPos, lightMat); } - const align = !painter.options.moving; - return { - 'u_matrix': matrix ? matrix : painter.transform.calculateProjMatrix(tile.tileID.toUnwrapped(), align), - 'u_image': 0, - 'u_latrange': getTileLatRange(painter, tile.tileID), - 'u_light': [layer.paint.get('hillshade-exaggeration'), azimuthal], - 'u_shadow': shadow, - 'u_highlight': highlight, - 'u_accent': accent - }; -}; - -const hillshadeUniformPrepareValues = ( - tileID , dem -) => { - const stride = dem.stride; - const matrix = transform.create(); - // Flip rendering at y axis. - transform.ortho(matrix, 0, transform.EXTENT, -transform.EXTENT, 0, 0, 1); - transform.translate(matrix, matrix, [0, -transform.EXTENT, 0]); + const lightColor = light.properties.get('color'); + const tr = painter.transform; - return { + const uniformValues = { 'u_matrix': matrix, - 'u_image': 1, - 'u_dimension': [stride, stride], - 'u_zoom': tileID.overscaledZ, - 'u_unpack': dem.unpackVector + 'u_lightpos': lightPos, + 'u_lightintensity': light.properties.get('intensity'), + 'u_lightcolor': [lightColor.r, lightColor.g, lightColor.b], + 'u_vertical_gradient': +shouldUseVerticalGradient, + 'u_opacity': opacity, + 'u_tile_id': [0, 0, 0], + 'u_zoom_transition': 0, + 'u_inv_rot_matrix': identityMatrix$3, + 'u_merc_center': [0, 0], + 'u_up_dir': [0, 0, 0], + 'u_height_lift': 0 }; + + if (tr.projection.name === 'globe') { + uniformValues['u_tile_id'] = [coord.canonical.x, coord.canonical.y, 1 << coord.canonical.z]; + uniformValues['u_zoom_transition'] = zoomTransition; + uniformValues['u_inv_rot_matrix'] = invMatrix; + uniformValues['u_merc_center'] = mercatorCenter; + uniformValues['u_up_dir'] = (tr.projection.upVector(new ref_properties.CanonicalTileID(0, 0, 0), mercatorCenter[0] * ref_properties.EXTENT, mercatorCenter[1] * ref_properties.EXTENT) ); + uniformValues['u_height_lift'] = heightLift; + } + + return uniformValues; }; -function getTileLatRange(painter , tileID ) { - // for scaling the magnitude of a points slope by its latitude - const tilesAtZoom = Math.pow(2, tileID.canonical.z); - const y = tileID.canonical.y; - return [ - new transform.MercatorCoordinate(0, y / tilesAtZoom).toLngLat().lat, - new transform.MercatorCoordinate(0, (y + 1) / tilesAtZoom).toLngLat().lat]; -} +const fillExtrusionPatternUniformValues = ( + matrix , + painter , + shouldUseVerticalGradient , + opacity , + coord , + crossfade , + tile , + heightLift , + zoomTransition , + mercatorCenter , + invMatrix +) => { + const uniformValues = fillExtrusionUniformValues( + matrix, painter, shouldUseVerticalGradient, opacity, coord, + heightLift, zoomTransition, mercatorCenter, invMatrix); + const heightFactorUniform = { + 'u_height_factor': -Math.pow(2, coord.overscaledZ) / tile.tileSize / 8 + }; + return ref_properties.extend(uniformValues, patternUniformValues(crossfade, painter, tile), heightFactorUniform); +}; // -function drawHillshade(painter , sourceCache , layer , tileIDs ) { - if (painter.renderPass !== 'offscreen' && painter.renderPass !== 'translucent') return; + + + + + - const context = painter.context; + + + - const depthMode = painter.depthModeForSublayer(0, transform.DepthMode.ReadOnly); - const colorMode = painter.colorModeForRenderPass(); + + + + - // When rendering to texture, coordinates are already sorted: primary by - // proxy id and secondary sort is by Z. - const renderingToTexture = painter.terrain && painter.terrain.renderingToTexture; - const [stencilModes, coords] = painter.renderPass === 'translucent' && !renderingToTexture ? - painter.stencilConfigForOverlap(tileIDs) : [{}, tileIDs]; + + + + + + + + + + - for (const coord of coords) { - const tile = sourceCache.getTile(coord); - if (tile.needsHillshadePrepare && painter.renderPass === 'offscreen') { - prepareHillshade(painter, tile, layer, depthMode, transform.StencilMode.disabled, colorMode); - } else if (painter.renderPass === 'translucent') { - const stencilMode = renderingToTexture && painter.terrain ? - painter.terrain.stencilModeForRTTOverlap(coord) : stencilModes[coord.overscaledZ]; - renderHillshade(painter, coord, tile, layer, depthMode, stencilMode, colorMode); - } - } + + + + + + + + + + + - context.viewport.set([0, 0, painter.width, painter.height]); +const fillUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix) +}); - painter.resetStencilClippingMasks(); -} +const fillPatternUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_pixel_coord_upper': new ref_properties.Uniform2f(context, locations.u_pixel_coord_upper), + 'u_pixel_coord_lower': new ref_properties.Uniform2f(context, locations.u_pixel_coord_lower), + 'u_scale': new ref_properties.Uniform3f(context, locations.u_scale), + 'u_fade': new ref_properties.Uniform1f(context, locations.u_fade) -function renderHillshade(painter, coord, tile, layer, depthMode, stencilMode, colorMode) { - const context = painter.context; - const gl = context.gl; - const fbo = tile.fbo; - if (!fbo) return; - painter.prepareDrawTile(coord); +}); - const program = painter.useProgram('hillshade'); +const fillOutlineUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_world': new ref_properties.Uniform2f(context, locations.u_world) +}); - context.activeTexture.set(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); +const fillOutlinePatternUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_world': new ref_properties.Uniform2f(context, locations.u_world), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_pixel_coord_upper': new ref_properties.Uniform2f(context, locations.u_pixel_coord_upper), + 'u_pixel_coord_lower': new ref_properties.Uniform2f(context, locations.u_pixel_coord_lower), + 'u_scale': new ref_properties.Uniform3f(context, locations.u_scale), + 'u_fade': new ref_properties.Uniform1f(context, locations.u_fade) +}); - const uniformValues = hillshadeUniformValues(painter, tile, layer, painter.terrain ? coord.projMatrix : null); +const fillUniformValues = (matrix ) => ({ + 'u_matrix': matrix +}); - painter.prepareDrawProgram(context, program, coord.toUnwrapped()); +const fillPatternUniformValues = ( + matrix , + painter , + crossfade , + tile +) => ref_properties.extend( + fillUniformValues(matrix), + patternUniformValues(crossfade, painter, tile) +); - const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getTileBoundsBuffers(tile); +const fillOutlineUniformValues = ( + matrix , + drawingBufferSize +) => ({ + 'u_matrix': matrix, + 'u_world': drawingBufferSize +}); - program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, transform.CullFaceMode.disabled, - uniformValues, layer.id, tileBoundsBuffer, - tileBoundsIndexBuffer, tileBoundsSegments); -} +const fillOutlinePatternUniformValues = ( + matrix , + painter , + crossfade , + tile , + drawingBufferSize +) => ref_properties.extend( + fillPatternUniformValues(matrix, painter, crossfade, tile), + { + 'u_world': drawingBufferSize + } +); -function prepareDEMTexture(painter , tile , dem ) { - if (!tile.needsDEMTextureUpload) return; +// - const context = painter.context; - const gl = context.gl; + + + + + + + + + + + - context.pixelStoreUnpackPremultiplyAlpha.set(false); - const textureStride = dem.stride; - tile.demTexture = tile.demTexture || painter.getTileTexture(textureStride); - const pixelData = dem.getPixels(); - if (tile.demTexture) { - tile.demTexture.update(pixelData, {premultiply: false}); + + +const circleUniforms = (context , locations ) => ({ + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_extrude_scale': new ref_properties.UniformMatrix2f(context, locations.u_extrude_scale), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_inv_rot_matrix': new ref_properties.UniformMatrix4f(context, locations.u_inv_rot_matrix), + 'u_merc_center': new ref_properties.Uniform2f(context, locations.u_merc_center), + 'u_tile_id': new ref_properties.Uniform3f(context, locations.u_tile_id), + 'u_zoom_transition': new ref_properties.Uniform1f(context, locations.u_zoom_transition), + 'u_up_dir': new ref_properties.Uniform3f(context, locations.u_up_dir), +}); + +const identityMatrix$2 = ref_properties.create(); + +const circleUniformValues = ( + painter , + coord , + tile , + invMatrix , + mercatorCenter , + layer +) => { + const transform = painter.transform; + const isGlobe = transform.projection.name === 'globe'; + + let extrudeScale; + if (layer.paint.get('circle-pitch-alignment') === 'map') { + if (isGlobe) { + const s = ref_properties.globePixelsToTileUnits(transform.zoom, coord.canonical) * transform._projectionScaler; + extrudeScale = Float32Array.from([s, 0, 0, s]); + } else { + extrudeScale = transform.calculatePixelsToTileUnitsMatrix(tile); + } } else { - tile.demTexture = new transform.Texture(context, pixelData, gl.RGBA, {premultiply: false}); + extrudeScale = new Float32Array([ + transform.pixelsToGLUnits[0], + 0, + 0, + transform.pixelsToGLUnits[1]]); } - tile.needsDEMTextureUpload = false; -} -// 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, layer, depthMode, stencilMode, colorMode) { - const context = painter.context; - const gl = context.gl; - if (!tile.dem) return; - const dem = tile.dem; + const values = { + 'u_camera_to_center_distance': transform.cameraToCenterDistance, + 'u_matrix': painter.translatePosMatrix( + coord.projMatrix, + tile, + layer.paint.get('circle-translate'), + layer.paint.get('circle-translate-anchor')), + 'u_device_pixel_ratio': ref_properties.exported.devicePixelRatio, + 'u_extrude_scale': extrudeScale, + 'u_inv_rot_matrix': identityMatrix$2, + 'u_merc_center': [0, 0], + 'u_tile_id': [0, 0, 0], + 'u_zoom_transition': 0, + 'u_up_dir': [0, 0, 0] + }; - context.activeTexture.set(gl.TEXTURE1); - prepareDEMTexture(painter, tile, dem); - transform.assert_1(tile.demTexture); - if (!tile.demTexture) return; // Silence flow. - tile.demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); - const tileSize = dem.dim; + if (isGlobe) { + values['u_inv_rot_matrix'] = invMatrix; + values['u_merc_center'] = mercatorCenter; + values['u_tile_id'] = [coord.canonical.x, coord.canonical.y, 1 << coord.canonical.z]; + values['u_zoom_transition'] = ref_properties.globeToMercatorTransition(transform.zoom); + const x = mercatorCenter[0] * ref_properties.EXTENT; + const y = mercatorCenter[1] * ref_properties.EXTENT; + values['u_up_dir'] = (transform.projection.upVector(new ref_properties.CanonicalTileID(0, 0, 0), x, y) ); + } + + return values; +}; + +const circleDefinesValues = (layer ) => { + const values = []; + if (layer.paint.get('circle-pitch-alignment') === 'map') values.push('PITCH_WITH_MAP'); + if (layer.paint.get('circle-pitch-scale') === 'map') values.push('SCALE_WITH_MAP'); + + return values; +}; + +// + + + + + + + + + + + - context.activeTexture.set(gl.TEXTURE0); - let fbo = tile.fbo; - if (!fbo) { - const renderTexture = new transform.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, true); - fbo.colorAttachment.set(renderTexture.texture); - } +const collisionUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_extrude_scale': new ref_properties.Uniform2f(context, locations.u_extrude_scale) +}); - context.bindFramebuffer.set(fbo.framebuffer); - context.viewport.set([0, 0, tileSize, tileSize]); +const collisionCircleUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_inv_matrix': new ref_properties.UniformMatrix4f(context, locations.u_inv_matrix), + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_viewport_size': new ref_properties.Uniform2f(context, locations.u_viewport_size) +}); - const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getMercatorTileBoundsBuffers(); +const collisionUniformValues = ( + matrix , + transform , + tile , + projection +) => { + const pixelRatio = ref_properties.EXTENT / tile.tileSize; - painter.useProgram('hillshadePrepare').draw(context, gl.TRIANGLES, - depthMode, stencilMode, colorMode, transform.CullFaceMode.disabled, - hillshadeUniformPrepareValues(tile.tileID, dem), - layer.id, tileBoundsBuffer, - tileBoundsIndexBuffer, tileBoundsSegments); + return { + 'u_matrix': matrix, + 'u_camera_to_center_distance': transform.getCameraToCenterDistance(projection), + 'u_extrude_scale': [transform.pixelsToGLUnits[0] / pixelRatio, + transform.pixelsToGLUnits[1] / pixelRatio] + }; +}; - tile.needsHillshadePrepare = false; -} +const collisionCircleUniformValues = ( + matrix , + invMatrix , + transform , + projection +) => { + return { + 'u_matrix': matrix, + 'u_inv_matrix': invMatrix, + 'u_camera_to_center_distance': transform.getCameraToCenterDistance(projection), + 'u_viewport_size': [transform.width, transform.height] + }; +}; // - - + + + - + + + + - - -const terrainRasterUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_image0': new transform.Uniform1i(context, locations.u_image0), - 'u_skirt_height': new transform.Uniform1f(context, locations.u_skirt_height) +const debugUniforms = (context , locations ) => ({ + 'u_color': new ref_properties.UniformColor(context, locations.u_color), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_overlay': new ref_properties.Uniform1i(context, locations.u_overlay), + 'u_overlay_scale': new ref_properties.Uniform1f(context, locations.u_overlay_scale), }); -const terrainRasterUniformValues = ( - matrix , - skirtHeight -) => ({ +const debugUniformValues = (matrix , color , scaleRatio = 1) => ({ 'u_matrix': matrix, - 'u_image0': 0, - 'u_skirt_height': skirtHeight + 'u_color': color, + 'u_overlay': 0, + 'u_overlay_scale': scaleRatio }); // - - - + + + + - - - - - + + + - - + + + - - - - - - -const globeRasterUniforms = (context , locations ) => ({ - 'u_proj_matrix': new transform.UniformMatrix4f(context, locations.u_proj_matrix), - 'u_globe_matrix': new transform.UniformMatrix4f(context, locations.u_globe_matrix), - 'u_merc_matrix': new transform.UniformMatrix4f(context, locations.u_merc_matrix), - 'u_zoom_transition': new transform.Uniform1f(context, locations.u_zoom_transition), - 'u_merc_center': new transform.Uniform2f(context, locations.u_merc_center), - 'u_image0': new transform.Uniform1i(context, locations.u_image0) +const heatmapUniforms = (context , locations ) => ({ + 'u_extrude_scale': new ref_properties.Uniform1f(context, locations.u_extrude_scale), + 'u_intensity': new ref_properties.Uniform1f(context, locations.u_intensity), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_inv_rot_matrix': new ref_properties.UniformMatrix4f(context, locations.u_inv_rot_matrix), + 'u_merc_center': new ref_properties.Uniform2f(context, locations.u_merc_center), + 'u_tile_id': new ref_properties.Uniform3f(context, locations.u_tile_id), + 'u_zoom_transition': new ref_properties.Uniform1f(context, locations.u_zoom_transition), + 'u_up_dir': new ref_properties.Uniform3f(context, locations.u_up_dir) }); -const atmosphereUniforms = (context , locations ) => ({ - 'u_center': new transform.Uniform2f(context, locations.u_center), - 'u_radius': new transform.Uniform1f(context, locations.u_radius), - 'u_screen_size': new transform.Uniform2f(context, locations.u_screen_size), - 'u_pixel_ratio': new transform.Uniform1f(context, locations.u_pixel_ratio), - 'u_opacity': new transform.Uniform1f(context, locations.u_opacity), - 'u_fadeout_range': new transform.Uniform1f(context, locations.u_fadeout_range), - 'u_start_color': new transform.Uniform3f(context, locations.u_start_color), - 'u_end_color': new transform.Uniform3f(context, locations.u_end_color) +const heatmapTextureUniforms = (context , locations ) => ({ + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_color_ramp': new ref_properties.Uniform1i(context, locations.u_color_ramp), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity) }); -const globeRasterUniformValues = ( - projMatrix , - globeMatrix , - globeMercatorMatrix , - zoomTransition , - mercCenter -) => ({ - 'u_proj_matrix': Float32Array.from(projMatrix), - 'u_globe_matrix': globeMatrix, - 'u_merc_matrix': globeMercatorMatrix, - 'u_zoom_transition': zoomTransition, - 'u_merc_center': mercCenter, - 'u_image0': 0 -}); +const identityMatrix$1 = ref_properties.create(); -const atmosphereUniformValues = ( - center , - radius , - screenSize , - pixelRatio , - opacity , - fadeoutRange , - startColor , - endColor -) => ({ - 'u_center': center, - 'u_radius': radius, - 'u_screen_size': screenSize, - 'u_pixel_ratio': pixelRatio, - 'u_opacity': opacity, - 'u_fadeout_range': fadeoutRange, - 'u_start_color': startColor, - 'u_end_color': endColor, -}); +const heatmapUniformValues = ( + painter , + coord , + tile , + invMatrix , + mercatorCenter , + zoom , + intensity +) => { + const transform = painter.transform; + const isGlobe = transform.projection.name === 'globe'; + const extrudeScale = isGlobe ? ref_properties.globePixelsToTileUnits(transform.zoom, coord.canonical) * transform._projectionScaler : pixelsToTileUnits(tile, 1, zoom); -// + const values = { + 'u_matrix': coord.projMatrix, + 'u_extrude_scale': extrudeScale, + 'u_intensity': intensity, + 'u_inv_rot_matrix': identityMatrix$1, + 'u_merc_center': [0, 0], + 'u_tile_id': [0, 0, 0], + 'u_zoom_transition': 0, + 'u_up_dir': [0, 0, 0], + }; - - - - - - - - + if (isGlobe) { + values['u_inv_rot_matrix'] = invMatrix; + values['u_merc_center'] = mercatorCenter; + values['u_tile_id'] = [coord.canonical.x, coord.canonical.y, 1 << coord.canonical.z]; + values['u_zoom_transition'] = ref_properties.globeToMercatorTransition(transform.zoom); + const x = mercatorCenter[0] * ref_properties.EXTENT; + const y = mercatorCenter[1] * ref_properties.EXTENT; + values['u_up_dir'] = (transform.projection.upVector(new ref_properties.CanonicalTileID(0, 0, 0), x, y) ); + } -class VertexMorphing { - + return values; +}; - constructor() { - this.operations = {}; - } +const heatmapTextureUniformValues = ( + painter , + layer , + textureUnit , + colorRampUnit +) => { + return { + 'u_image': textureUnit, + 'u_color_ramp': colorRampUnit, + 'u_opacity': layer.paint.get('heatmap-opacity') + }; +}; - newMorphing(key , from , to , now , duration ) { - transform.assert_1(from.demTexture && to.demTexture); - transform.assert_1(from.tileID.key !== to.tileID.key); +// - if (key in this.operations) { - const op = this.operations[key]; - transform.assert_1(op.from && op.to); - // Queue the target tile unless it's being morphed to already - if (op.to.tileID.key !== to.tileID.key) - op.queued = to; - } else { - this.operations[key] = { - startTime: now, - phase: 0.0, - duration, - from, - to, - queued: null - }; - } - } + + + + + + + - getMorphValuesForProxy(key ) { - if (!(key in this.operations)) - return null; + + + + + + + + + + + + + + - const op = this.operations[key]; - const from = op.from; - const to = op.to; - transform.assert_1(from && to); + + + + + + + + + + + - return {from, to, phase: op.phase}; - } + - update(now ) { - for (const key in this.operations) { - const op = this.operations[key]; - transform.assert_1(op.from && op.to); +const lineUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_pixels_to_tile_units': new ref_properties.UniformMatrix2f(context, locations.u_pixels_to_tile_units), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_units_to_pixels': new ref_properties.Uniform2f(context, locations.u_units_to_pixels), + 'u_dash_image': new ref_properties.Uniform1i(context, locations.u_dash_image), + 'u_gradient_image': new ref_properties.Uniform1i(context, locations.u_gradient_image), + 'u_image_height': new ref_properties.Uniform1f(context, locations.u_image_height), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_scale': new ref_properties.Uniform3f(context, locations.u_scale), + 'u_mix': new ref_properties.Uniform1f(context, locations.u_mix), + 'u_alpha_discard_threshold': new ref_properties.Uniform1f(context, locations.u_alpha_discard_threshold), + 'u_trim_offset': new ref_properties.Uniform2f(context, locations.u_trim_offset) +}); - op.phase = (now - op.startTime) / op.duration; +const linePatternUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_pixels_to_tile_units': new ref_properties.UniformMatrix2f(context, locations.u_pixels_to_tile_units), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_units_to_pixels': new ref_properties.Uniform2f(context, locations.u_units_to_pixels), + 'u_scale': new ref_properties.Uniform3f(context, locations.u_scale), + 'u_fade': new ref_properties.Uniform1f(context, locations.u_fade), + 'u_alpha_discard_threshold': new ref_properties.Uniform1f(context, locations.u_alpha_discard_threshold) +}); - // Start the queued operation if the current one is finished or the data has expired - while (op.phase >= 1.0 || !this._validOp(op)) { - if (!this._nextOp(op, now)) { - delete this.operations[key]; - break; - } - } - } - } +const lineUniformValues = ( + painter , + tile , + layer , + crossfade , + matrix , + imageHeight , + pixelRatio , + trimOffset , +) => { + const transform = painter.transform; + const pixelsToTileUnits = transform.calculatePixelsToTileUnitsMatrix(tile); - _nextOp(op , now ) { - if (!op.queued) - return false; - op.from = op.to; - op.to = op.queued; - op.queued = null; - op.phase = 0.0; - op.startTime = now; - return true; + const values = { + 'u_matrix': calculateMatrix(painter, tile, layer, matrix), + 'u_pixels_to_tile_units': pixelsToTileUnits, + 'u_device_pixel_ratio': pixelRatio, + 'u_units_to_pixels': [ + 1 / transform.pixelsToGLUnits[0], + 1 / transform.pixelsToGLUnits[1] + ], + 'u_dash_image': 0, + 'u_gradient_image': 1, + 'u_image_height': imageHeight, + 'u_texsize': [0, 0], + 'u_scale': [0, 0, 0], + 'u_mix': 0, + 'u_alpha_discard_threshold': 0.0, + 'u_trim_offset': trimOffset + }; + if (hasDash(layer)) { + const tileZoomRatio = calculateTileRatio(tile, painter.transform); + values['u_texsize'] = tile.lineAtlasTexture.size; + values['u_scale'] = [tileZoomRatio, crossfade.fromScale, crossfade.toScale]; + values['u_mix'] = crossfade.t; } + return values; +}; - _validOp(op ) { - return op.from.hasData() && op.to.hasData(); - } +const linePatternUniformValues = ( + painter , + tile , + layer , + crossfade , + matrix , + pixelRatio +) => { + const transform = painter.transform; + const tileZoomRatio = calculateTileRatio(tile, transform); + return { + 'u_matrix': calculateMatrix(painter, tile, layer, matrix), + 'u_texsize': tile.imageAtlasTexture.size, + // camera zoom ratio + 'u_pixels_to_tile_units': transform.calculatePixelsToTileUnitsMatrix(tile), + 'u_device_pixel_ratio': pixelRatio, + 'u_image': 0, + 'u_scale': [tileZoomRatio, crossfade.fromScale, crossfade.toScale], + 'u_fade': crossfade.t, + 'u_units_to_pixels': [ + 1 / transform.pixelsToGLUnits[0], + 1 / transform.pixelsToGLUnits[1] + ], + 'u_alpha_discard_threshold': 0.0 + }; +}; + +function calculateTileRatio(tile , transform ) { + return 1 / pixelsToTileUnits(tile, 1, transform.tileZoom); } -function demTileChanged(prev , next ) { - if (prev == null || next == null) - return false; - if (!prev.hasData() || !next.hasData()) - return false; - if (prev.demTexture == null || next.demTexture == null) - return false; - return prev.tileID.key !== next.tileID.key; +function calculateMatrix(painter, tile, layer, matrix) { + return painter.translatePosMatrix( + matrix ? matrix : tile.tileID.projMatrix, + tile, + layer.paint.get('line-translate'), + layer.paint.get('line-translate-anchor') + ); } -const vertexMorphing = new VertexMorphing(); -const SHADER_DEFAULT = 0; -const SHADER_MORPHING = 1; -const SHADER_TERRAIN_WIREFRAME = 2; -const defaultDuration = 250; +const lineDefinesValues = (layer ) => { + const values = []; + if (hasDash(layer)) values.push('RENDER_LINE_DASH'); + if (layer.paint.get('line-gradient')) values.push('RENDER_LINE_GRADIENT'); + if (layer.paint.get('line-trim-offset')) values.push('RENDER_LINE_TRIM_OFFSET'); -const shaderDefines = { - "0": null, - "1": 'TERRAIN_VERTEX_MORPHING', - "2": 'TERRAIN_WIREFRAME' + const hasPattern = layer.paint.get('line-pattern').constantOr((1 )); + const hasOpacity = layer.paint.get('line-opacity').constantOr(1.0) !== 1.0; + if (!hasPattern && hasOpacity) { + values.push('RENDER_LINE_ALPHA_DISCARD'); + } + return values; }; -function drawTerrainForGlobe(painter , terrain , sourceCache , tileIDs , now ) { - const context = painter.context; - const gl = context.gl; +function hasDash(layer) { + const dashPropertyValue = layer.paint.get('line-dasharray').value; + return dashPropertyValue.value || dashPropertyValue.kind !== "constant"; +} - let program, programMode; - const showWireframe = painter.options.showTerrainWireframe ? SHADER_TERRAIN_WIREFRAME : SHADER_DEFAULT; +// - const setShaderMode = (mode, isWireframe) => { - if (programMode === mode) - return; - const defines = ([] ); - if (isWireframe) { - defines.push(shaderDefines[showWireframe]); - } - defines.push(shaderDefines[mode]); - defines.push('PROJECTION_GLOBE_VIEW'); - program = painter.useProgram('globeRaster', null, defines); - programMode = mode; - }; + + + - const colorMode = painter.colorModeForRenderPass(); - const depthMode = new transform.DepthMode(gl.LEQUAL, transform.DepthMode.ReadWrite, painter.depthRangeFor3D); - vertexMorphing.update(now); - const tr = painter.transform; - const globeMatrix = transform.calculateGlobeMatrix(tr, tr.worldSize); - const globeMercatorMatrix = transform.calculateGlobeMercatorMatrix(tr); - const mercatorCenter = [transform.mercatorXfromLng(tr.center.lng), transform.mercatorYfromLat(tr.center.lat)]; - const batches = showWireframe ? [false, true] : [false]; - const sharedBuffers = painter.globeSharedBuffers; + + + + + + + + + + + + + + + - batches.forEach(isWireframe => { - // This code assumes the rendering is batched into mesh terrain and then wireframe - // terrain (if applicable) so that this is enough to ensure the correct program is - // set when we switch from one to the other. - programMode = -1; +const rasterUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_tl_parent': new ref_properties.Uniform2f(context, locations.u_tl_parent), + 'u_scale_parent': new ref_properties.Uniform1f(context, locations.u_scale_parent), + 'u_fade_t': new ref_properties.Uniform1f(context, locations.u_fade_t), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity), + 'u_image0': new ref_properties.Uniform1i(context, locations.u_image0), + 'u_image1': new ref_properties.Uniform1i(context, locations.u_image1), + 'u_brightness_low': new ref_properties.Uniform1f(context, locations.u_brightness_low), + 'u_brightness_high': new ref_properties.Uniform1f(context, locations.u_brightness_high), + 'u_saturation_factor': new ref_properties.Uniform1f(context, locations.u_saturation_factor), + 'u_contrast_factor': new ref_properties.Uniform1f(context, locations.u_contrast_factor), + 'u_spin_weights': new ref_properties.Uniform3f(context, locations.u_spin_weights), + 'u_perspective_transform': new ref_properties.Uniform2f(context, locations.u_perspective_transform) +}); - const primitive = isWireframe ? gl.LINES : gl.TRIANGLES; +const rasterUniformValues = ( + matrix , + parentTL , + parentScaleBy , + fade , + layer , + perspectiveTransform +) => ({ + 'u_matrix': matrix, + 'u_tl_parent': parentTL, + 'u_scale_parent': parentScaleBy, + 'u_fade_t': fade.mix, + 'u_opacity': fade.opacity * layer.paint.get('raster-opacity'), + 'u_image0': 0, + 'u_image1': 1, + 'u_brightness_low': layer.paint.get('raster-brightness-min'), + 'u_brightness_high': layer.paint.get('raster-brightness-max'), + 'u_saturation_factor': saturationFactor(layer.paint.get('raster-saturation')), + 'u_contrast_factor': contrastFactor(layer.paint.get('raster-contrast')), + 'u_spin_weights': spinWeights(layer.paint.get('raster-hue-rotate')), + 'u_perspective_transform': perspectiveTransform +}); - for (const coord of tileIDs) { - const tile = sourceCache.getTile(coord); - const tiles = Math.pow(2, coord.canonical.z); - const [gridBuffer, poleBuffer] = transform.globeBuffersForTileMesh(painter, tile, coord, tiles); - const stencilMode = transform.StencilMode.disabled; +function spinWeights(angle) { + angle *= Math.PI / 180; + const s = Math.sin(angle); + const c = Math.cos(angle); + return [ + (2 * c + 1) / 3, + (-Math.sqrt(3) * s - c + 1) / 3, + (Math.sqrt(3) * s - c + 1) / 3 + ]; +} - const prevDemTile = terrain.prevTerrainTileForTile[coord.key]; - const nextDemTile = terrain.terrainTileForTile[coord.key]; +function contrastFactor(contrast) { + return contrast > 0 ? + 1 / (1 - contrast) : + 1 + contrast; +} - if (demTileChanged(prevDemTile, nextDemTile)) { - vertexMorphing.newMorphing(coord.key, prevDemTile, nextDemTile, now, defaultDuration); - } +function saturationFactor(saturation) { + return saturation > 0 ? + 1 - 1 / (1.001 - saturation) : + -saturation; +} - // Bind the main draped texture - context.activeTexture.set(gl.TEXTURE0); - tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); +// + - const morph = vertexMorphing.getMorphValuesForProxy(coord.key); - const shaderMode = morph ? SHADER_MORPHING : SHADER_DEFAULT; - const elevationOptions = {}; + - if (morph) { - transform.extend$1(elevationOptions, {morphing: {srcDemTile: morph.from, dstDemTile: morph.to, phase: transform.easeCubicInOut(morph.phase)}}); - } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - const posMatrix = transform.globeMatrixForTile(coord.canonical, globeMatrix); - const uniformValues = globeRasterUniformValues( - tr.projMatrix, posMatrix, globeMercatorMatrix, - transform.globeToMercatorTransition(tr.zoom), mercatorCenter); + - setShaderMode(shaderMode, isWireframe); +const symbolIconUniforms = (context , locations ) => ({ + 'u_is_size_zoom_constant': new ref_properties.Uniform1i(context, locations.u_is_size_zoom_constant), + 'u_is_size_feature_constant': new ref_properties.Uniform1i(context, locations.u_is_size_feature_constant), + 'u_size_t': new ref_properties.Uniform1f(context, locations.u_size_t), + 'u_size': new ref_properties.Uniform1f(context, locations.u_size), + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_rotate_symbol': new ref_properties.Uniform1i(context, locations.u_rotate_symbol), + 'u_aspect_ratio': new ref_properties.Uniform1f(context, locations.u_aspect_ratio), + 'u_fade_change': new ref_properties.Uniform1f(context, locations.u_fade_change), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_label_plane_matrix': new ref_properties.UniformMatrix4f(context, locations.u_label_plane_matrix), + 'u_coord_matrix': new ref_properties.UniformMatrix4f(context, locations.u_coord_matrix), + 'u_is_text': new ref_properties.Uniform1i(context, locations.u_is_text), + 'u_pitch_with_map': new ref_properties.Uniform1i(context, locations.u_pitch_with_map), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_tile_id': new ref_properties.Uniform3f(context, locations.u_tile_id), + 'u_zoom_transition': new ref_properties.Uniform1f(context, locations.u_zoom_transition), + 'u_inv_rot_matrix': new ref_properties.UniformMatrix4f(context, locations.u_inv_rot_matrix), + 'u_merc_center': new ref_properties.Uniform2f(context, locations.u_merc_center), + 'u_camera_forward': new ref_properties.Uniform3f(context, locations.u_camera_forward), + 'u_tile_matrix': new ref_properties.UniformMatrix4f(context, locations.u_tile_matrix), + 'u_up_vector': new ref_properties.Uniform3f(context, locations.u_up_vector), + 'u_ecef_origin': new ref_properties.Uniform3f(context, locations.u_ecef_origin), + 'u_texture': new ref_properties.Uniform1i(context, locations.u_texture) +}); - terrain.setupElevationDraw(tile, program, elevationOptions); +const symbolSDFUniforms = (context , locations ) => ({ + 'u_is_size_zoom_constant': new ref_properties.Uniform1i(context, locations.u_is_size_zoom_constant), + 'u_is_size_feature_constant': new ref_properties.Uniform1i(context, locations.u_is_size_feature_constant), + 'u_size_t': new ref_properties.Uniform1f(context, locations.u_size_t), + 'u_size': new ref_properties.Uniform1f(context, locations.u_size), + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_rotate_symbol': new ref_properties.Uniform1i(context, locations.u_rotate_symbol), + 'u_aspect_ratio': new ref_properties.Uniform1f(context, locations.u_aspect_ratio), + 'u_fade_change': new ref_properties.Uniform1f(context, locations.u_fade_change), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_label_plane_matrix': new ref_properties.UniformMatrix4f(context, locations.u_label_plane_matrix), + 'u_coord_matrix': new ref_properties.UniformMatrix4f(context, locations.u_coord_matrix), + 'u_is_text': new ref_properties.Uniform1i(context, locations.u_is_text), + 'u_pitch_with_map': new ref_properties.Uniform1i(context, locations.u_pitch_with_map), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_texture': new ref_properties.Uniform1i(context, locations.u_texture), + 'u_gamma_scale': new ref_properties.Uniform1f(context, locations.u_gamma_scale), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_tile_id': new ref_properties.Uniform3f(context, locations.u_tile_id), + 'u_zoom_transition': new ref_properties.Uniform1f(context, locations.u_zoom_transition), + 'u_inv_rot_matrix': new ref_properties.UniformMatrix4f(context, locations.u_inv_rot_matrix), + 'u_merc_center': new ref_properties.Uniform2f(context, locations.u_merc_center), + 'u_camera_forward': new ref_properties.Uniform3f(context, locations.u_camera_forward), + 'u_tile_matrix': new ref_properties.UniformMatrix4f(context, locations.u_tile_matrix), + 'u_up_vector': new ref_properties.Uniform3f(context, locations.u_up_vector), + 'u_ecef_origin': new ref_properties.Uniform3f(context, locations.u_ecef_origin), + 'u_is_halo': new ref_properties.Uniform1i(context, locations.u_is_halo) +}); - painter.prepareDrawProgram(context, program, coord.toUnwrapped()); +const symbolTextAndIconUniforms = (context , locations ) => ({ + 'u_is_size_zoom_constant': new ref_properties.Uniform1i(context, locations.u_is_size_zoom_constant), + 'u_is_size_feature_constant': new ref_properties.Uniform1i(context, locations.u_is_size_feature_constant), + 'u_size_t': new ref_properties.Uniform1f(context, locations.u_size_t), + 'u_size': new ref_properties.Uniform1f(context, locations.u_size), + 'u_camera_to_center_distance': new ref_properties.Uniform1f(context, locations.u_camera_to_center_distance), + 'u_rotate_symbol': new ref_properties.Uniform1i(context, locations.u_rotate_symbol), + 'u_aspect_ratio': new ref_properties.Uniform1f(context, locations.u_aspect_ratio), + 'u_fade_change': new ref_properties.Uniform1f(context, locations.u_fade_change), + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_label_plane_matrix': new ref_properties.UniformMatrix4f(context, locations.u_label_plane_matrix), + 'u_coord_matrix': new ref_properties.UniformMatrix4f(context, locations.u_coord_matrix), + 'u_is_text': new ref_properties.Uniform1i(context, locations.u_is_text), + 'u_pitch_with_map': new ref_properties.Uniform1i(context, locations.u_pitch_with_map), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_texsize_icon': new ref_properties.Uniform2f(context, locations.u_texsize_icon), + 'u_texture': new ref_properties.Uniform1i(context, locations.u_texture), + 'u_texture_icon': new ref_properties.Uniform1i(context, locations.u_texture_icon), + 'u_gamma_scale': new ref_properties.Uniform1f(context, locations.u_gamma_scale), + 'u_device_pixel_ratio': new ref_properties.Uniform1f(context, locations.u_device_pixel_ratio), + 'u_is_halo': new ref_properties.Uniform1i(context, locations.u_is_halo) +}); - if (sharedBuffers) { - const [buffer, segments] = isWireframe ? - sharedBuffers.getWirefameBuffer(painter.context) : - [sharedBuffers.gridIndexBuffer, sharedBuffers.gridSegments]; +const identityMatrix = ref_properties.create(); - program.draw(context, primitive, depthMode, stencilMode, colorMode, transform.CullFaceMode.backCCW, - uniformValues, "globe_raster", gridBuffer, buffer, segments); - } +const symbolIconUniformValues = ( + functionType , + size , + rotateInShader , + pitchWithMap , + painter , + matrix , + labelPlaneMatrix , + glCoordMatrix , + isText , + texSize , + coord , + zoomTransition , + mercatorCenter , + invMatrix , + upVector , + projection +) => { + const transform = painter.transform; - if (!isWireframe) { - // Fill poles by extrapolating adjacent border tiles - const poleMatrices = [ - coord.canonical.y === 0 ? transform.globePoleMatrixForTile(coord.canonical, false, tr) : null, - coord.canonical.y === tiles - 1 ? transform.globePoleMatrixForTile(coord.canonical, true, tr) : null - ]; + const values = { + 'u_is_size_zoom_constant': +(functionType === 'constant' || functionType === 'source'), + 'u_is_size_feature_constant': +(functionType === 'constant' || functionType === 'camera'), + 'u_size_t': size ? size.uSizeT : 0, + 'u_size': size ? size.uSize : 0, + 'u_camera_to_center_distance': transform.cameraToCenterDistance, + 'u_rotate_symbol': +rotateInShader, + 'u_aspect_ratio': transform.width / transform.height, + 'u_fade_change': painter.options.fadeDuration ? painter.symbolFadeChange : 1, + 'u_matrix': matrix, + 'u_label_plane_matrix': labelPlaneMatrix, + 'u_coord_matrix': glCoordMatrix, + 'u_is_text': +isText, + 'u_pitch_with_map': +pitchWithMap, + 'u_texsize': texSize, + 'u_texture': 0, + 'u_tile_id': [0, 0, 0], + 'u_zoom_transition': 0, + 'u_inv_rot_matrix': identityMatrix, + 'u_merc_center': [0, 0], + 'u_camera_forward': [0, 0, 0], + 'u_ecef_origin': [0, 0, 0], + 'u_tile_matrix': identityMatrix, + 'u_up_vector': [0, -1, 0] + }; - for (const poleMatrix of poleMatrices) { - if (!poleMatrix) { - continue; - } + if (projection.name === 'globe') { + values['u_tile_id'] = [coord.canonical.x, coord.canonical.y, 1 << coord.canonical.z]; + values['u_zoom_transition'] = zoomTransition; + values['u_inv_rot_matrix'] = invMatrix; + values['u_merc_center'] = mercatorCenter; + values['u_camera_forward'] = ((transform._camera.forward() ) ); + values['u_ecef_origin'] = ref_properties.globeECEFOrigin(transform.globeMatrix, coord.toUnwrapped()); + values['u_tile_matrix'] = Float32Array.from(transform.globeMatrix); + values['u_up_vector'] = upVector; + } - const poleUniforms = globeRasterUniformValues( - tr.projMatrix, poleMatrix, poleMatrix, 0.0, mercatorCenter); + return values; +}; - if (sharedBuffers) { - program.draw(context, primitive, depthMode, stencilMode, colorMode, transform.CullFaceMode.disabled, - poleUniforms, "globe_pole_raster", poleBuffer, sharedBuffers.poleIndexBuffer, sharedBuffers.poleSegments); - } - } - } - } +const symbolSDFUniformValues = ( + functionType , + size , + rotateInShader , + pitchWithMap , + painter , + matrix , + labelPlaneMatrix , + glCoordMatrix , + isText , + texSize , + isHalo , + coord , + zoomTransition , + mercatorCenter , + invMatrix , + upVector , + projection +) => { + return ref_properties.extend(symbolIconUniformValues(functionType, size, rotateInShader, + pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, + texSize, coord, zoomTransition, mercatorCenter, invMatrix, upVector, projection), { + 'u_gamma_scale': pitchWithMap ? painter.transform.cameraToCenterDistance * Math.cos(painter.terrain ? 0 : painter.transform._pitch) : 1, + 'u_device_pixel_ratio': ref_properties.exported.devicePixelRatio, + 'u_is_halo': +isHalo }); -} - -function drawTerrainRaster(painter , terrain , sourceCache , tileIDs , now ) { - if (painter.transform.projection.name === 'globe') { - drawTerrainForGlobe(painter, terrain, sourceCache, tileIDs, now); - } else { - const context = painter.context; - const gl = context.gl; - - let program, programMode; - const showWireframe = painter.options.showTerrainWireframe ? SHADER_TERRAIN_WIREFRAME : SHADER_DEFAULT; - - const setShaderMode = (mode, isWireframe) => { - if (programMode === mode) - return; - const modes = [shaderDefines[mode]]; - if (isWireframe) modes.push(shaderDefines[showWireframe]); - program = painter.useProgram('terrainRaster', null, modes); - programMode = mode; - }; - - const colorMode = painter.colorModeForRenderPass(); - const depthMode = new transform.DepthMode(gl.LEQUAL, transform.DepthMode.ReadWrite, painter.depthRangeFor3D); - vertexMorphing.update(now); - const tr = painter.transform; - const skirt = skirtHeight(tr.zoom) * terrain.exaggeration(); - - const batches = showWireframe ? [false, true] : [false]; - - batches.forEach(isWireframe => { - // This code assumes the rendering is batched into mesh terrain and then wireframe - // terrain (if applicable) so that this is enough to ensure the correct program is - // set when we switch from one to the other. - programMode = -1; - - const primitive = isWireframe ? gl.LINES : gl.TRIANGLES; - const [buffer, segments] = isWireframe ? terrain.getWirefameBuffer() : [terrain.gridIndexBuffer, terrain.gridSegments]; - - for (const coord of tileIDs) { - const tile = sourceCache.getTile(coord); - const stencilMode = transform.StencilMode.disabled; +}; - const prevDemTile = terrain.prevTerrainTileForTile[coord.key]; - const nextDemTile = terrain.terrainTileForTile[coord.key]; +const symbolTextAndIconUniformValues = ( + functionType , + size , + rotateInShader , + pitchWithMap , + painter , + matrix , + labelPlaneMatrix , + glCoordMatrix , + texSizeSDF , + texSizeIcon , + coord , + zoomTransition , + mercatorCenter , + invMatrix , + upVector , + projection +) => { + return ref_properties.extend(symbolSDFUniformValues(functionType, size, rotateInShader, + pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, true, texSizeSDF, + true, coord, zoomTransition, mercatorCenter, invMatrix, upVector, projection), { + 'u_texsize_icon': texSizeIcon, + 'u_texture_icon': 1 + }); +}; - if (demTileChanged(prevDemTile, nextDemTile)) { - vertexMorphing.newMorphing(coord.key, prevDemTile, nextDemTile, now, defaultDuration); - } +// - // Bind the main draped texture - context.activeTexture.set(gl.TEXTURE0); - tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); + + + + + + + + - const morph = vertexMorphing.getMorphValuesForProxy(coord.key); - const shaderMode = morph ? SHADER_MORPHING : SHADER_DEFAULT; - let elevationOptions; + + + + + - if (morph) { - elevationOptions = {morphing: {srcDemTile: morph.from, dstDemTile: morph.to, phase: transform.easeCubicInOut(morph.phase)}}; - } + + + + + + + + + + + + + + + + + + + - const uniformValues = terrainRasterUniformValues(coord.projMatrix, isEdgeTile(coord.canonical, tr.renderWorldCopies) ? skirt / 10 : skirt); - setShaderMode(shaderMode, isWireframe); +const backgroundUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity), + 'u_color': new ref_properties.UniformColor(context, locations.u_color) +}); - terrain.setupElevationDraw(tile, program, elevationOptions); +const backgroundPatternUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity), + 'u_image': new ref_properties.Uniform1i(context, locations.u_image), + 'u_pattern_tl_a': new ref_properties.Uniform2f(context, locations.u_pattern_tl_a), + 'u_pattern_br_a': new ref_properties.Uniform2f(context, locations.u_pattern_br_a), + 'u_pattern_tl_b': new ref_properties.Uniform2f(context, locations.u_pattern_tl_b), + 'u_pattern_br_b': new ref_properties.Uniform2f(context, locations.u_pattern_br_b), + 'u_texsize': new ref_properties.Uniform2f(context, locations.u_texsize), + 'u_mix': new ref_properties.Uniform1f(context, locations.u_mix), + 'u_pattern_size_a': new ref_properties.Uniform2f(context, locations.u_pattern_size_a), + 'u_pattern_size_b': new ref_properties.Uniform2f(context, locations.u_pattern_size_b), + 'u_scale_a': new ref_properties.Uniform1f(context, locations.u_scale_a), + 'u_scale_b': new ref_properties.Uniform1f(context, locations.u_scale_b), + 'u_pixel_coord_upper': new ref_properties.Uniform2f(context, locations.u_pixel_coord_upper), + 'u_pixel_coord_lower': new ref_properties.Uniform2f(context, locations.u_pixel_coord_lower), + 'u_tile_units_to_pixels': new ref_properties.Uniform1f(context, locations.u_tile_units_to_pixels) +}); - painter.prepareDrawProgram(context, program, coord.toUnwrapped()); +const backgroundUniformValues = ( + matrix , + opacity , + color +) => ({ + 'u_matrix': matrix, + 'u_opacity': opacity, + 'u_color': color +}); - program.draw(context, primitive, depthMode, stencilMode, colorMode, transform.CullFaceMode.backCCW, - uniformValues, "terrain_raster", terrain.gridBuffer, buffer, segments); - } - }); +const backgroundPatternUniformValues = ( + matrix , + opacity , + painter , + image , + tile , + crossfade +) => ref_properties.extend( + bgPatternUniformValues(image, crossfade, painter, tile), + { + 'u_matrix': matrix, + 'u_opacity': opacity } -} +); -function drawTerrainDepth(painter , terrain , sourceCache , tileIDs ) { - if (painter.transform.projection.name === 'globe') { - return; - } +// - transform.assert_1(painter.renderPass === 'offscreen'); + + - const context = painter.context; - const gl = context.gl; + + + + + + + - context.clear({depth: 1}); - const program = painter.useProgram('terrainDepth'); - const depthMode = new transform.DepthMode(gl.LESS, transform.DepthMode.ReadWrite, painter.depthRangeFor3D); + + + + + + + + - for (const coord of tileIDs) { - const tile = sourceCache.getTile(coord); - const uniformValues = terrainRasterUniformValues(coord.projMatrix, 0); - terrain.setupElevationDraw(tile, program); +const skyboxUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_sun_direction': new ref_properties.Uniform3f(context, locations.u_sun_direction), + 'u_cubemap': new ref_properties.Uniform1i(context, locations.u_cubemap), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity), + 'u_temporal_offset': new ref_properties.Uniform1f(context, locations.u_temporal_offset) - program.draw(context, gl.TRIANGLES, depthMode, transform.StencilMode.disabled, transform.ColorMode.unblended, transform.CullFaceMode.backCCW, - uniformValues, "terrain_depth", terrain.gridBuffer, terrain.gridIndexBuffer, terrain.gridNoSkirtSegments); - } -} +}); -function skirtHeight(zoom) { - // Skirt height calculation is heuristic: provided value hides - // seams between tiles and it is not too large: 9 at zoom 22, ~20000m at zoom 0. - return 6 * Math.pow(1.5, 22 - zoom); -} +const skyboxUniformValues = ( + matrix , + sunDirection , + cubemap , + opacity , + temporalOffset +) => ({ + 'u_matrix': matrix, + 'u_sun_direction': sunDirection, + 'u_cubemap': cubemap, + 'u_opacity': opacity, + 'u_temporal_offset': temporalOffset +}); -function isEdgeTile(cid , renderWorldCopies ) { - const numTiles = 1 << cid.z; - return (!renderWorldCopies && (cid.x === 0 || cid.x === numTiles - 1)) || cid.y === 0 || cid.y === numTiles - 1; -} +const skyboxGradientUniforms = (context , locations ) => ({ + 'u_matrix': new ref_properties.UniformMatrix4f(context, locations.u_matrix), + 'u_color_ramp': new ref_properties.Uniform1i(context, locations.u_color_ramp), + // radial gradient uniforms + 'u_center_direction': new ref_properties.Uniform3f(context, locations.u_center_direction), + 'u_radius': new ref_properties.Uniform1f(context, locations.u_radius), + 'u_opacity': new ref_properties.Uniform1f(context, locations.u_opacity), + 'u_temporal_offset': new ref_properties.Uniform1f(context, locations.u_temporal_offset) +}); -// +const skyboxGradientUniformValues = ( + matrix , + centerDirection , + radius , //degrees + opacity , + temporalOffset +) => { + return { + 'u_matrix': matrix, + 'u_color_ramp': 0, + 'u_center_direction': centerDirection, + 'u_radius': ref_properties.degToRad(radius), + 'u_opacity': opacity, + 'u_temporal_offset': temporalOffset + }; +}; +// + + + + - - - + + + + + + + -const clippingMaskUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix) +const skyboxCaptureUniforms = (context , locations ) => ({ + 'u_matrix_3f': new ref_properties.UniformMatrix3f(context, locations.u_matrix_3f), + 'u_sun_direction': new ref_properties.Uniform3f(context, locations.u_sun_direction), + 'u_sun_intensity': new ref_properties.Uniform1f(context, locations.u_sun_intensity), + 'u_color_tint_r': new ref_properties.Uniform4f(context, locations.u_color_tint_r), + 'u_color_tint_m': new ref_properties.Uniform4f(context, locations.u_color_tint_m), + 'u_luminance': new ref_properties.Uniform1f(context, locations.u_luminance), }); -const clippingMaskUniformValues = (matrix ) => ({ - 'u_matrix': matrix +const skyboxCaptureUniformValues = ( + matrix , + sunDirection , + sunIntensity , + atmosphereColor , + atmosphereHaloColor +) => ({ + 'u_matrix_3f': matrix, + 'u_sun_direction': sunDirection, + 'u_sun_intensity': sunIntensity, + 'u_color_tint_r': [ + atmosphereColor.r, + atmosphereColor.g, + atmosphereColor.b, + atmosphereColor.a + ], + 'u_color_tint_m': [ + atmosphereHaloColor.r, + atmosphereHaloColor.g, + atmosphereHaloColor.b, + atmosphereHaloColor.a + ], + 'u_luminance': 5e-5, }); // - - - - - - - -function rasterFade(tile , parentTile , sourceCache , transform$1 , fadeDuration ) { - if (fadeDuration > 0) { - const now = transform.exported.now(); - const sinceTile = (now - tile.timeAdded) / fadeDuration; - const sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1; - - const source = sourceCache.getSource(); - const idealZ = transform$1.coveringZoomLevel({ - tileSize: source.tileSize, - roundZoom: source.roundZoom - }); - - // if no parent or parent is older, fade in; if parent is younger, fade out - const fadeIn = !parentTile || Math.abs(parentTile.tileID.overscaledZ - idealZ) > Math.abs(tile.tileID.overscaledZ - idealZ); - - const childOpacity = (fadeIn && tile.refreshedUponExpiration) ? 1 : transform.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 - }; - } -} +const programUniforms = { + fillExtrusion: fillExtrusionUniforms, + fillExtrusionPattern: fillExtrusionPatternUniforms, + fill: fillUniforms, + fillPattern: fillPatternUniforms, + fillOutline: fillOutlineUniforms, + fillOutlinePattern: fillOutlinePatternUniforms, + circle: circleUniforms, + collisionBox: collisionUniforms, + collisionCircle: collisionCircleUniforms, + debug: debugUniforms, + clippingMask: clippingMaskUniforms, + heatmap: heatmapUniforms, + heatmapTexture: heatmapTextureUniforms, + hillshade: hillshadeUniforms, + hillshadePrepare: hillshadePrepareUniforms, + line: lineUniforms, + linePattern: linePatternUniforms, + raster: rasterUniforms, + symbolIcon: symbolIconUniforms, + symbolSDF: symbolSDFUniforms, + symbolTextAndIcon: symbolTextAndIconUniforms, + background: backgroundUniforms, + backgroundPattern: backgroundPatternUniforms, + terrainRaster: terrainRasterUniforms, + terrainDepth: terrainRasterUniforms, + skybox: skyboxUniforms, + skyboxGradient: skyboxGradientUniforms, + skyboxCapture: skyboxCaptureUniforms, + globeRaster: globeRasterUniforms, + globeAtmosphere: atmosphereUniforms, +}; // - - - - - - - - - - - -const GRID_DIM = 128; - -const FBO_POOL_SIZE = 5; -const RENDER_CACHE_MAX_SIZE = 50; - - - - + + + + + + -class MockSourceCache extends transform.SourceCache { - constructor(map ) { - const sourceSpec = {type: 'raster-dem', maxzoom: map.transform.maxZoom}; - const sourceDispatcher = new Dispatcher(getGlobalWorkerPool(), null); - const source = create('mock-dem', sourceSpec, sourceDispatcher, map.style); +let quadTriangles ; - super('mock-dem', source, false); +function drawCollisionDebug(painter , sourceCache , layer , coords , translate , translateAnchor , isText ) { + const context = painter.context; + const gl = context.gl; + const tr = painter.transform; + const program = painter.useProgram('collisionBox'); + const tileBatches = []; + let circleCount = 0; + let circleOffset = 0; - source.setEventedParent(this); + for (let i = 0; i < coords.length; i++) { + const coord = coords[i]; + const tile = sourceCache.getTile(coord); + const bucket = (tile.getBucket(layer) ); + if (!bucket) continue; - this._sourceLoaded = true; - } + const tileMatrix = getCollisionDebugTileProjectionMatrix(coord, bucket, tr); - _loadTile(tile , callback ) { - tile.state = 'loaded'; - callback(null); - } -} + let posMatrix = tileMatrix; + if (translate[0] !== 0 || translate[1] !== 0) { + posMatrix = painter.translatePosMatrix(tileMatrix, tile, translate, translateAnchor); + } + const buffers = isText ? bucket.textCollisionBox : bucket.iconCollisionBox; + // Get collision circle data of this bucket + const circleArray = bucket.collisionCircleArray; + if (circleArray.length > 0) { + // We need to know the projection matrix that was used for projecting collision circles to the screen. + // This might vary between buckets as the symbol placement is a continous process. This matrix is + // required for transforming points from previous screen space to the current one + const invTransform = ref_properties.create(); + const transform = posMatrix; -/** - * Proxy source cache gets ideal screen tile cover coordinates. All the other - * source caches's coordinates get mapped to subrects of proxy coordinates (or - * vice versa, subrects of larger tiles from all source caches get mapped to - * full proxy tile). This happens on every draw call in Terrain.updateTileBinding. - * Approach is used here for terrain : all the visible source tiles of all the - * source caches get rendered to proxy source cache textures and then draped over - * terrain. It is in future reusable for handling overscalling as buckets could be - * constructed only for proxy tile content, not for full overscalled vector tile. - */ -class ProxySourceCache extends transform.SourceCache { - - - + ref_properties.mul(invTransform, bucket.placementInvProjMatrix, tr.glCoordMatrix); + ref_properties.mul(invTransform, invTransform, bucket.placementViewportMatrix); - constructor(map ) { + tileBatches.push({ + circleArray, + circleOffset, + transform, + invTransform, + projection: bucket.getProjection() + }); - const source = create('proxy', { - type: 'geojson', - maxzoom: map.transform.maxZoom - }, new Dispatcher(getGlobalWorkerPool(), null), map.style); + circleCount += circleArray.length / 4; // 4 values per circle + circleOffset = circleCount; + } + if (!buffers) continue; + if (painter.terrain) painter.terrain.setupElevationDraw(tile, program); + program.draw(context, gl.LINES, + ref_properties.DepthMode.disabled, ref_properties.StencilMode.disabled, + painter.colorModeForRenderPass(), + ref_properties.CullFaceMode.disabled, + collisionUniformValues(posMatrix, tr, tile, bucket.getProjection()), + layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, + buffers.segments, null, tr.zoom, null, + buffers.collisionVertexBuffer, + buffers.collisionVertexBufferExt); + } - super('proxy', source, false); + if (!isText || !tileBatches.length) { + return; + } - source.setEventedParent(this); + // Render collision circles + const circleProgram = painter.useProgram('collisionCircle'); - // This source is not to be added as a map source: we use it's tile management. - // For that, initialize internal structures used for tile cover update. - this.map = ((this.getSource() ) ).map = map; - this.used = this._sourceLoaded = true; - this.renderCache = []; - this.renderCachePool = []; - this.proxyCachedFBO = {}; - } + // Construct vertex data + const vertexData = new ref_properties.StructArrayLayout2f1f2i16(); + vertexData.resize(circleCount * 4); + vertexData._trim(); - // Override for transient nature of cover here: don't cache and retain. - /* eslint-disable no-unused-vars */ - update(transform$1 , tileSize , updateForTerrain ) { - if (transform$1.freezeTileCoverage) { return; } - this.transform = transform$1; - const idealTileIDs = transform$1.coveringTiles({ - tileSize: this._source.tileSize, - minzoom: this._source.minzoom, - maxzoom: this._source.maxzoom, - roundZoom: this._source.roundZoom, - reparseOverscaled: this._source.reparseOverscaled - }); + let vertexOffset = 0; - const incoming = idealTileIDs.reduce((acc, tileID) => { - acc[tileID.key] = ''; - if (!this._tiles[tileID.key]) { - const tile = new transform.Tile(tileID, this._source.tileSize * tileID.overscaleFactor(), transform$1.tileZoom); - tile.state = 'loaded'; - this._tiles[tileID.key] = tile; - } - return acc; - }, {}); + for (const batch of tileBatches) { + for (let i = 0; i < batch.circleArray.length / 4; i++) { + const circleIdx = i * 4; + const x = batch.circleArray[circleIdx + 0]; + const y = batch.circleArray[circleIdx + 1]; + const radius = batch.circleArray[circleIdx + 2]; + const collision = batch.circleArray[circleIdx + 3]; - for (const id in this._tiles) { - if (!(id in incoming)) { - this.freeFBO(id); - this._tiles[id].unloadVectorData(); - delete this._tiles[id]; - } + // 4 floats per vertex, 4 vertices per quad + vertexData.emplace(vertexOffset++, x, y, radius, collision, 0); + vertexData.emplace(vertexOffset++, x, y, radius, collision, 1); + vertexData.emplace(vertexOffset++, x, y, radius, collision, 2); + vertexData.emplace(vertexOffset++, x, y, radius, collision, 3); } } - - freeFBO(id ) { - const fbos = this.proxyCachedFBO[id]; - if (fbos !== undefined) { - const fboIds = ((Object.values(fbos) ) ); - this.renderCachePool.push(...fboIds); - delete this.proxyCachedFBO[id]; - } + if (!quadTriangles || quadTriangles.length < circleCount * 2) { + quadTriangles = createQuadTriangles(circleCount); } - deallocRenderCache() { - this.renderCache.forEach(fbo => fbo.fb.destroy()); - this.renderCache = []; - this.renderCachePool = []; - this.proxyCachedFBO = {}; + const indexBuffer = context.createIndexBuffer(quadTriangles, true); + const vertexBuffer = context.createVertexBuffer(vertexData, ref_properties.collisionCircleLayout.members, true); + + // Render batches + for (const batch of tileBatches) { + const uniforms = collisionCircleUniformValues(batch.transform, batch.invTransform, tr, batch.projection); + + circleProgram.draw( + context, + gl.TRIANGLES, + ref_properties.DepthMode.disabled, + ref_properties.StencilMode.disabled, + painter.colorModeForRenderPass(), + ref_properties.CullFaceMode.disabled, + uniforms, + layer.id, + vertexBuffer, + indexBuffer, + ref_properties.SegmentVector.simpleSegment(0, batch.circleOffset * 2, batch.circleArray.length, batch.circleArray.length / 2), + null, + tr.zoom); } + + vertexBuffer.destroy(); + indexBuffer.destroy(); } -/** - * Canonical, wrap and overscaledZ contain information of original source cache tile. - * This tile gets ortho-rendered to proxy tile (defined by proxyTileKey). - * `posMatrix` holds orthographic, scaling and translation information that is used - * for rendering original tile content to a proxy tile. Proxy tile covers whole - * or sub-rectangle of the original tile. - */ -class ProxiedTileID extends transform.OverscaledTileID { - +function createQuadTriangles(quadCount ) { + const triCount = quadCount * 2; + const array = new ref_properties.StructArrayLayout3ui6(); - constructor(tileID , proxyTileKey , projMatrix ) { - super(tileID.overscaledZ, tileID.wrap, tileID.canonical.z, tileID.canonical.x, tileID.canonical.y); - this.proxyTileKey = proxyTileKey; - this.projMatrix = projMatrix; + array.resize(triCount); + array._trim(); + + // Two triangles and 4 vertices per quad. + for (let i = 0; i < triCount; i++) { + const idx = i * 6; + + array.uint16[idx + 0] = i * 4 + 0; + array.uint16[idx + 1] = i * 4 + 1; + array.uint16[idx + 2] = i * 4 + 2; + array.uint16[idx + 3] = i * 4 + 2; + array.uint16[idx + 4] = i * 4 + 3; + array.uint16[idx + 5] = i * 4 + 0; } + + return array; } - - +// +const identityMat4 = ref_properties.create(); -class Terrain$1 extends transform.Elevation { - - + + + + - - - - - - - - + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - +function drawSymbols(painter , sourceCache , layer , coords , variableOffsets ) { + if (painter.renderPass !== 'translucent') return; - - + // Disable the stencil test so that labels aren't clipped to tile boundaries. + const stencilMode = ref_properties.StencilMode.disabled; + const colorMode = painter.colorModeForRenderPass(); + const variablePlacement = layer.layout.get('text-variable-anchor'); - - - - + //Compute variable-offsets before painting since icons and text data positioning + //depend on each other in this case. + if (variablePlacement) { + updateVariableAnchors(coords, painter, layer, sourceCache, + layer.layout.get('text-rotation-alignment'), + layer.layout.get('text-pitch-alignment'), + variableOffsets + ); + } - constructor(painter , style ) { - super(); - this.painter = painter; - this.terrainTileForTile = {}; - this.prevTerrainTileForTile = {}; + 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'), + stencilMode, colorMode + ); + } - // Terrain rendering grid is 129x129 cell grid, made by 130x130 points. - // 130 vertices map to 128 DEM data + 1px padding on both sides. - // DEM texture is padded (1, 1, 1, 1) and padding pixels are backfilled - // by neighboring tile edges. This way we achieve tile stitching as - // edge vertices from neighboring tiles evaluate to the same 3D point. - const [triangleGridArray, triangleGridIndices, skirtIndicesOffset] = createGrid(GRID_DIM + 1); - const context = painter.context; - this.gridBuffer = context.createVertexBuffer(triangleGridArray, transform.boundsAttributes.members); - this.gridIndexBuffer = context.createIndexBuffer(triangleGridIndices); - this.gridSegments = transform.SegmentVector.simpleSegment(0, 0, triangleGridArray.length, triangleGridIndices.length); - this.gridNoSkirtSegments = transform.SegmentVector.simpleSegment(0, 0, triangleGridArray.length, skirtIndicesOffset); - this.proxyCoords = []; - this.proxiedCoords = {}; - this._visibleDemTiles = []; - this._drapedRenderBatches = []; - this._sourceTilesOverlap = {}; - this.proxySourceCache = new ProxySourceCache(style.map); - this.orthoMatrix = transform.create(); - transform.ortho(this.orthoMatrix, 0, transform.EXTENT, 0, transform.EXTENT, 0, 1); - const gl = context.gl; - this._overlapStencilMode = new transform.StencilMode({func: gl.GEQUAL, mask: 0xFF}, 0, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); - this._previousZoom = painter.transform.zoom; - this.pool = []; - this._findCoveringTileCache = {}; - this._tilesDirty = {}; - this.style = style; - this._useVertexMorphing = true; - this._exaggeration = 1; - this._mockSourceCache = new MockSourceCache(style.map); + 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'), + stencilMode, colorMode + ); } - set style(style ) { - style.on('data', this._onStyleDataEvent.bind(this)); - style.on('neworder', this._checkRenderCacheEfficiency.bind(this)); - this._style = style; - this._checkRenderCacheEfficiency(); + if (sourceCache.map.showCollisionBoxes) { + drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('text-translate'), + layer.paint.get('text-translate-anchor'), true); + drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('icon-translate'), + layer.paint.get('icon-translate-anchor'), false); } +} - /* - * Validate terrain and update source cache used for elevation. - * Explicitly pass transform to update elevation (Transform.updateElevation) - * before using transform for source cache update. - * cameraChanging is true when camera is zooming, panning or orbiting. - */ - update(style , transform$1 , cameraChanging ) { - if (style && style.terrain) { - if (this._style !== style) { - this.style = style; - } - this.enabled = true; - const terrainProps = style.terrain.properties; - const isDrapeModeDeferred = style.terrain.drapeRenderMode === DrapeRenderMode.deferred; - this.sourceCache = isDrapeModeDeferred ? this._mockSourceCache : - ((style._getSourceCache(terrainProps.get('source')) ) ); - this._exaggeration = terrainProps.get('exaggeration'); +function computeGlobeCameraUp(transform ) { + const viewMatrix = transform._camera.getWorldToCamera(transform.worldSize, 1); + const viewToEcef = ref_properties.multiply([], viewMatrix, transform.globeMatrix); + ref_properties.invert$1(viewToEcef, viewToEcef); - const updateSourceCache = () => { - if (this.sourceCache.used) { - transform.warnOnce(`Raster DEM source '${this.sourceCache.id}' is used both for terrain and as layer source.\n` + - 'This leads to lower resolution of hillshade. For full hillshade resolution but higher memory consumption, define another raster DEM source.'); - } - // Lower tile zoom is sufficient for terrain, given the size of terrain grid. - const scaledDemTileSize = this.getScaledDemTileSize(); - // Dem tile needs to be parent or at least of the same zoom level as proxy tile. - // Tile cover roundZoom behavior is set to the same as for proxy (false) in SourceCache.update(). - this.sourceCache.update(transform$1, scaledDemTileSize, true); - // As a result of update, we get new set of tiles: reset lookup cache. - this.resetTileLookupCache(this.sourceCache.id); - }; + const cameraUpVector = [0, 0, 0]; + const up = [0, 1, 0, 0]; + ref_properties.transformMat4$1(up, up, viewToEcef); + cameraUpVector[0] = up[0]; + cameraUpVector[1] = up[1]; + cameraUpVector[2] = up[2]; + ref_properties.normalize(cameraUpVector, cameraUpVector); - if (!this.sourceCache.usedForTerrain) { - // Init cache entry. - this.resetTileLookupCache(this.sourceCache.id); - // When toggling terrain on/off load available terrain tiles from cache - // before reading elevation at center. - this.sourceCache.usedForTerrain = true; - updateSourceCache(); - this._initializing = true; - } + return cameraUpVector; +} - updateSourceCache(); - // Camera, when changing, gets constrained over terrain. Issue constrainCameraOverTerrain = true - // here to cover potential under terrain situation on data or style change. - transform$1.updateElevation(!cameraChanging); +function calculateVariableRenderShift(anchor, width, height, textOffset, textScale, renderTextSize) { + const {horizontalAlign, verticalAlign} = ref_properties.getAnchorAlignment(anchor); + const shiftX = -(horizontalAlign - 0.5) * width; + const shiftY = -(verticalAlign - 0.5) * height; + const variableOffset = ref_properties.evaluateVariableOffset(anchor, textOffset); + return new ref_properties.pointGeometry( + (shiftX / textScale + variableOffset[0]) * renderTextSize, + (shiftY / textScale + variableOffset[1]) * renderTextSize + ); +} - // Reset tile lookup cache and update draped tiles coordinates. - this.resetTileLookupCache(this.proxySourceCache.id); - this.proxySourceCache.update(transform$1); +function updateVariableAnchors(coords, painter, layer, sourceCache, rotationAlignment, pitchAlignment, variableOffsets) { + const tr = painter.transform; + const rotateWithMap = rotationAlignment === 'map'; + const pitchWithMap = pitchAlignment === 'map'; - this._emptyDEMTextureDirty = true; - } else { - this._disable(); + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + const bucket = (tile.getBucket(layer) ); + if (!bucket || !bucket.text || !bucket.text.segments.get().length) { + continue; } - } - - resetTileLookupCache(sourceCacheID ) { - this._findCoveringTileCache[sourceCacheID] = {}; - } - - getScaledDemTileSize() { - const demScale = this.sourceCache.getSource().tileSize / GRID_DIM; - const proxyTileSize = this.proxySourceCache.getSource().tileSize; - return demScale * proxyTileSize; - } - _checkRenderCacheEfficiency() { - const renderCacheInfo = this.renderCacheEfficiency(this._style); - if (this._style.map._optimizeForTerrain) { - transform.assert_1(renderCacheInfo.efficiency === 100); - } else if (renderCacheInfo.efficiency !== 100) { - transform.warnOnce(`Terrain render cache efficiency is not optimal (${renderCacheInfo.efficiency}%) and performance - may be affected negatively, consider placing all background, fill and line layers before layer - with id '${renderCacheInfo.firstUndrapedLayer}' or create a map using optimizeForTerrain: true option.`); - } - } + const sizeData = bucket.textSizeData; + const size = ref_properties.evaluateSizeForZoom(sizeData, tr.zoom); + const tileMatrix = getSymbolTileProjectionMatrix(coord, bucket.getProjection(), tr); - _onStyleDataEvent(event ) { - if (event.coord && event.dataType === 'source') { - this._clearRenderCacheForTile(event.sourceCacheId, event.coord); - } else if (event.dataType === 'style') { - this._invalidateRenderCache = true; - } - } + const pixelsToTileUnits = tr.calculatePixelsToTileUnitsMatrix(tile); + const labelPlaneMatrix = getLabelPlaneMatrixForRendering(tileMatrix, tile.tileID.canonical, pitchWithMap, rotateWithMap, tr, bucket.getProjection(), pixelsToTileUnits); + const updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' && bucket.hasIconData(); - // Terrain - _disable() { - if (!this.enabled) return; - this.enabled = false; - this._sharedDepthStencil = undefined; - this.proxySourceCache.deallocRenderCache(); - if (this._style) { - for (const id in this._style._sourceCaches) { - this._style._sourceCaches[id].usedForTerrain = false; - } + if (size) { + const tileScale = Math.pow(2, tr.zoom - tile.tileID.overscaledZ); + updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, ref_properties.symbolSize, + tr, labelPlaneMatrix, coord, tileScale, size, updateTextFitIcon); } } +} - destroy() { - this._disable(); - if (this._emptyDEMTexture) this._emptyDEMTexture.destroy(); - if (this._emptyDepthBufferTexture) this._emptyDepthBufferTexture.destroy(); - this.pool.forEach(fbo => fbo.fb.destroy()); - this.pool = []; - if (this._depthFBO) { - this._depthFBO.destroy(); - delete this._depthFBO; - delete this._depthTexture; - } - } +function updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, symbolSize, + transform, labelPlaneMatrix, coord, tileScale, size, updateTextFitIcon) { + const placedSymbols = bucket.text.placedSymbolArray; + const dynamicTextLayoutVertexArray = bucket.text.dynamicLayoutVertexArray; + const dynamicIconLayoutVertexArray = bucket.icon.dynamicLayoutVertexArray; + const placedTextShifts = {}; + const tileMatrix = getSymbolTileProjectionMatrix(coord, bucket.getProjection(), transform); + const elevation = transform.elevation; + const upVectorScale = bucket.getProjection().upVectorScale(coord.canonical, transform.center.lat, transform.worldSize); - // Implements Elevation::_source. - _source() { - return this.enabled ? this.sourceCache : null; - } + dynamicTextLayoutVertexArray.clear(); + for (let s = 0; s < placedSymbols.length; s++) { + const symbol = placedSymbols.get(s); + const skipOrientation = bucket.allowVerticalPlacement && !symbol.placedOrientation; + const variableOffset = (!symbol.hidden && symbol.crossTileID && !skipOrientation) ? variableOffsets[symbol.crossTileID] : null; - // Implements Elevation::exaggeration. - exaggeration() { - return this._exaggeration; - } + if (!variableOffset) { + // These symbols are from a justification that is not being used, or a label that wasn't placed + // so we don't need to do the extra math to figure out what incremental shift to apply. + hideGlyphs(symbol.numGlyphs, dynamicTextLayoutVertexArray); + } else { + const tileAnchor = new ref_properties.pointGeometry(symbol.tileAnchorX, symbol.tileAnchorY); + const upDir = bucket.getProjection().upVector(coord.canonical, tileAnchor.x, tileAnchor.y); + const anchorElevation = elevation ? elevation.getAtTileOffset(coord, tileAnchor.x, tileAnchor.y) : 0.0; + const reprojectedAnchor = [ + symbol.projectedAnchorX + anchorElevation * upDir[0] * upVectorScale.metersToTile, + symbol.projectedAnchorY + anchorElevation * upDir[1] * upVectorScale.metersToTile, + symbol.projectedAnchorZ + anchorElevation * upDir[2] * upVectorScale.metersToTile + ]; - get visibleDemTiles() { - return this._visibleDemTiles; - } + const projectedAnchor = projectVector(reprojectedAnchor, pitchWithMap ? tileMatrix : labelPlaneMatrix); + const perspectiveRatio = getPerspectiveRatio(transform.getCameraToCenterDistance(bucket.getProjection()), projectedAnchor.signedDistanceFromCamera); + let renderTextSize = symbolSize.evaluateSizeForFeature(bucket.textSizeData, size, symbol) * perspectiveRatio / ref_properties.ONE_EM; + if (pitchWithMap) { + // Go from size in pixels to equivalent size in tile units + renderTextSize *= bucket.tilePixelRatio / tileScale; + } - get drapeBufferSize() { - const extent = this.proxySourceCache.getSource().tileSize * 2; // *2 is to avoid upscaling bitmap on zoom. - return [extent, extent]; - } + const {width, height, anchor, textOffset, textScale} = variableOffset; - set useVertexMorphing(enable ) { - this._useVertexMorphing = enable; - } + const shift = calculateVariableRenderShift( + anchor, width, height, textOffset, textScale, renderTextSize); - // For every renderable coordinate in every source cache, assign one proxy - // tile (see _setupProxiedCoordsForOrtho). Mapping of source tile to proxy - // tile is modeled by ProxiedTileID. In general case, source and proxy tile - // are of different zoom: ProxiedTileID.projMatrix models ortho, scale and - // translate from source to proxy. This matrix is used when rendering source - // tile to proxy tile's texture. - // One proxy tile can have multiple source tiles, or pieces of source tiles, - // that get rendered to it. - // For each proxy tile we assign one terrain tile (_assignTerrainTiles). The - // terrain tile provides elevation data when rendering (draping) proxy tile - // texture over terrain grid. - updateTileBinding(sourcesCoords ) { - if (!this.enabled) return; - this.prevTerrainTileForTile = this.terrainTileForTile; + // Usual case is that we take the projected anchor and add the pixel-based shift + // calculated above. In the (somewhat weird) case of pitch-aligned text, we add an equivalent + // tile-unit based shift to the anchor before projecting to the label plane. + let shiftedAnchor ; - const psc = this.proxySourceCache; - const tr = this.painter.transform; - if (this._initializing) { - // Don't activate terrain until center tile gets loaded. - this._initializing = tr._centerAltitude === 0 && this.getAtPointOrZero(transform.MercatorCoordinate.fromLngLat(tr.center), -1) === -1; - this._emptyDEMTextureDirty = !this._initializing; - } + if (pitchWithMap) { + const shiftedTileAnchor = tileAnchor.add(shift); + const {x, y, z} = bucket.getProjection().projectTilePoint(shiftedTileAnchor.x, shiftedTileAnchor.y, coord.canonical); - const coords = this.proxyCoords = psc.getIds().map((id) => { - const tileID = psc.getTileByID(id).tileID; - tileID.projMatrix = tr.calculateProjMatrix(tileID.toUnwrapped()); - return tileID; - }); - sortByDistanceToCamera(coords, this.painter); - this._previousZoom = tr.zoom; + const reprojectedShiftedAnchor = [ + x + anchorElevation * upDir[0] * upVectorScale.metersToTile, + y + anchorElevation * upDir[1] * upVectorScale.metersToTile, + z + anchorElevation * upDir[2] * upVectorScale.metersToTile + ]; - const previousProxyToSource = this.proxyToSource || {}; - this.proxyToSource = {}; - coords.forEach((tileID) => { - this.proxyToSource[tileID.key] = {}; - }); + shiftedAnchor = projectVector(reprojectedShiftedAnchor, labelPlaneMatrix).point; + } else { + const rotatedShift = rotateWithMap ? shift.rotate(-transform.angle) : shift; + shiftedAnchor = [projectedAnchor.point[0] + rotatedShift.x, projectedAnchor.point[1] + rotatedShift.y, 0]; + } - this.terrainTileForTile = {}; - const sourceCaches = this._style._sourceCaches; - for (const id in sourceCaches) { - const sourceCache = sourceCaches[id]; - if (!sourceCache.used) continue; - if (sourceCache !== this.sourceCache) this.resetTileLookupCache(sourceCache.id); - this._setupProxiedCoordsForOrtho(sourceCache, sourcesCoords[id], previousProxyToSource); - if (sourceCache.usedForTerrain) continue; - const coordinates = sourcesCoords[id]; - if (sourceCache.getSource().reparseOverscaled) { - // Do this for layers that are not rasterized to proxy tile. - this._assignTerrainTiles(coordinates); + const angle = (bucket.allowVerticalPlacement && symbol.placedOrientation === ref_properties.WritingMode.vertical) ? Math.PI / 2 : 0; + for (let g = 0; g < symbol.numGlyphs; g++) { + ref_properties.addDynamicAttributes(dynamicTextLayoutVertexArray, shiftedAnchor[0], shiftedAnchor[1], shiftedAnchor[2], angle); + } + //Only offset horizontal text icons + if (updateTextFitIcon && symbol.associatedIconIndex >= 0) { + placedTextShifts[symbol.associatedIconIndex] = {shiftedAnchor, angle}; } } + } - // Background has no source. Using proxy coords with 1-1 ortho (this.proxiedCoords[psc.id]) - // when rendering background to proxy tiles. - this.proxiedCoords[psc.id] = coords.map(tileID => new ProxiedTileID(tileID, tileID.key, this.orthoMatrix)); - this._assignTerrainTiles(coords); - this._prepareDEMTextures(); - this._setupDrapedRenderBatches(); - this._initFBOPool(); - this._setupRenderCache(previousProxyToSource); - - this.renderingToTexture = false; - this._updateTimestamp = transform.exported.now(); - - // Gather all dem tiles that are assigned to proxy tiles - const visibleKeys = {}; - this._visibleDemTiles = []; - - for (const id of this.proxyCoords) { - const demTile = this.terrainTileForTile[id.key]; - if (!demTile) - continue; - const key = demTile.tileID.key; - if (key in visibleKeys) - continue; - this._visibleDemTiles.push(demTile); - visibleKeys[key] = key; + if (updateTextFitIcon) { + dynamicIconLayoutVertexArray.clear(); + const placedIcons = bucket.icon.placedSymbolArray; + for (let i = 0; i < placedIcons.length; i++) { + const placedIcon = placedIcons.get(i); + if (placedIcon.hidden) { + hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray); + } else { + const shift = placedTextShifts[i]; + if (!shift) { + hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray); + } else { + for (let g = 0; g < placedIcon.numGlyphs; g++) { + ref_properties.addDynamicAttributes(dynamicIconLayoutVertexArray, shift.shiftedAnchor[0], shift.shiftedAnchor[1], shift.shiftedAnchor[2], shift.angle); + } + } + } } - + bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicIconLayoutVertexArray); } + bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicTextLayoutVertexArray); +} - _assignTerrainTiles(coords ) { - if (this._initializing) return; - coords.forEach((tileID) => { - if (this.terrainTileForTile[tileID.key]) return; - const demTile = this._findTileCoveringTileID(tileID, this.sourceCache); - if (demTile) this.terrainTileForTile[tileID.key] = demTile; - }); +function getSymbolProgramName(isSDF , isText , bucket ) { + if (bucket.iconsInText && isText) { + return 'symbolTextAndIcon'; + } else if (isSDF) { + return 'symbolSDF'; + } else { + return 'symbolIcon'; } +} - _prepareDEMTextures() { - const context = this.painter.context; - const gl = context.gl; - for (const key in this.terrainTileForTile) { - const tile = this.terrainTileForTile[key]; - const dem = tile.dem; - if (dem && (!tile.demTexture || tile.needsDEMTextureUpload)) { - context.activeTexture.set(gl.TEXTURE1); - prepareDEMTexture(this.painter, tile, dem); - } - } - } +function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate, translateAnchor, + rotationAlignment, pitchAlignment, keepUpright, stencilMode, colorMode) { + const context = painter.context; + const gl = context.gl; + const tr = painter.transform; + + const rotateWithMap = rotationAlignment === 'map'; + const pitchWithMap = pitchAlignment === 'map'; + const alongLine = rotateWithMap && layer.layout.get('symbol-placement') !== 'point'; - _prepareDemTileUniforms(proxyTile , demTile , uniforms , uniformSuffix ) { - if (!demTile || demTile.demTexture == null) - return false; + // 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 + const rotateInShader = rotateWithMap && !pitchWithMap && !alongLine; - transform.assert_1(demTile.dem); - const proxyId = proxyTile.tileID.canonical; - const demId = demTile.tileID.canonical; - const demScaleBy = Math.pow(2, demId.z - proxyId.z); - const suffix = uniformSuffix || ""; - uniforms[`u_dem_tl${suffix}`] = [proxyId.x * demScaleBy % 1, proxyId.y * demScaleBy % 1]; - uniforms[`u_dem_scale${suffix}`] = demScaleBy; - return true; - } + const hasSortKey = layer.layout.get('symbol-sort-key').constantOr(1) !== undefined; + let sortFeaturesByKey = false; - get emptyDEMTexture() { - return !this._emptyDEMTextureDirty && this._emptyDEMTexture ? - this._emptyDEMTexture : this._updateEmptyDEMTexture(); + const depthMode = painter.depthModeForSublayer(0, ref_properties.DepthMode.ReadOnly); + const mercatorCenter = [ + ref_properties.mercatorXfromLng(tr.center.lng), + ref_properties.mercatorYfromLat(tr.center.lat) + ]; + const variablePlacement = layer.layout.get('text-variable-anchor'); + const isGlobeProjection = tr.projection.name === 'globe'; + const tileRenderState = []; + + const mercatorCameraUp = [0, -1, 0]; + + let globeCameraUp = mercatorCameraUp; + if ((isGlobeProjection || tr.mercatorFromTransition) && !rotateWithMap) { + // Each symbol rotating with the viewport requires per-instance information about + // how to align with the viewport. In 2D case rotation is shared between all of the symbols and + // hence embedded in the label plane matrix but in globe view this needs to be computed at runtime. + // Camera up vector together with surface normals can be used to find the correct orientation for each symbol. + globeCameraUp = computeGlobeCameraUp(tr); } - get emptyDepthBufferTexture() { - const context = this.painter.context; - const gl = context.gl; - if (!this._emptyDepthBufferTexture) { - const image = { - width: 1, height: 1, - data: new Uint8Array([255, 255, 255, 255]) - }; - this._emptyDepthBufferTexture = new transform.Texture(context, image, gl.RGBA, {premultiply: false}); + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + const bucket = (tile.getBucket(layer) ); + if (!bucket) continue; + // Allow rendering of buckets built for globe projection in mercator mode + // until the substitute tile has been loaded + if (bucket.projection.name === 'mercator' && isGlobeProjection) { + continue; } - return this._emptyDepthBufferTexture; - } + const buffers = isText ? bucket.text : bucket.icon; + if (!buffers || bucket.fullyClipped || !buffers.segments.get().length) continue; + const programConfiguration = buffers.programConfigurations.get(layer.id); - _getLoadedAreaMinimum() { - let nonzero = 0; - const min = this._visibleDemTiles.reduce((acc, tile) => { - if (!tile.dem) return acc; - const m = tile.dem.tree.minimums[0]; - acc += m; - if (m > 0) nonzero++; - return acc; - }, 0); - return nonzero ? min / nonzero : 0; - } + const isSDF = isText || bucket.sdfIcons; - _updateEmptyDEMTexture() { - const context = this.painter.context; - const gl = context.gl; - context.activeTexture.set(gl.TEXTURE2); + const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; + const transformed = pitchWithMap || tr.pitch !== 0; - const min = this._getLoadedAreaMinimum(); - const image = { - width: 1, height: 1, - data: new Uint8Array(transform.DEMData.pack(min, ((this.sourceCache.getSource() ) ).encoding)) - }; + const size = ref_properties.evaluateSizeForZoom(sizeData, tr.zoom); - this._emptyDEMTextureDirty = false; - let texture = this._emptyDEMTexture; - if (!texture) { - texture = this._emptyDEMTexture = new transform.Texture(context, image, gl.RGBA, {premultiply: false}); + let texSize ; + let texSizeIcon = [0, 0]; + let atlasTexture; + let atlasInterpolation; + let atlasTextureIcon = null; + let atlasInterpolationIcon; + if (isText) { + atlasTexture = tile.glyphAtlasTexture; + atlasInterpolation = gl.LINEAR; + texSize = tile.glyphAtlasTexture.size; + if (bucket.iconsInText) { + texSizeIcon = tile.imageAtlasTexture.size; + atlasTextureIcon = tile.imageAtlasTexture; + const zoomDependentSize = sizeData.kind === 'composite' || sizeData.kind === 'camera'; + atlasInterpolationIcon = transformed || painter.options.rotating || painter.options.zooming || zoomDependentSize ? gl.LINEAR : gl.NEAREST; + } } else { - texture.update(image, {premultiply: false}); + const iconScaled = layer.layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear; + atlasTexture = tile.imageAtlasTexture; + atlasInterpolation = isSDF || painter.options.rotating || painter.options.zooming || iconScaled || transformed ? + gl.LINEAR : + gl.NEAREST; + texSize = tile.imageAtlasTexture.size; } - return texture; - } - // useDepthForOcclusion: Pre-rendered depth to texture (this._depthTexture) is - // used to hide (actually moves all object's vertices out of viewport). - // useMeterToDem: u_meter_to_dem uniform is not used for all terrain programs, - // optimization to avoid unnecessary computation and upload. - setupElevationDraw(tile , program , - options - - - - - ) { - const context = this.painter.context; - const gl = context.gl; - const uniforms = defaultTerrainUniforms(((this.sourceCache.getSource() ) ).encoding); - uniforms['u_dem_size'] = this.sourceCache.getSource().tileSize; - uniforms['u_exaggeration'] = this.exaggeration(); + const bucketIsGlobeProjection = bucket.projection.name === 'globe'; + const cameraUpVector = bucketIsGlobeProjection ? globeCameraUp : mercatorCameraUp; + const globeToMercator = bucketIsGlobeProjection ? ref_properties.globeToMercatorTransition(tr.zoom) : 0.0; + const tileMatrix = getSymbolTileProjectionMatrix(coord, bucket.getProjection(), tr); - const tr = this.painter.transform; - const tileTransform = tr.projection.createTileTransform(tr, tr.worldSize); + const s = tr.calculatePixelsToTileUnitsMatrix(tile); + const labelPlaneMatrixRendering = getLabelPlaneMatrixForRendering(tileMatrix, tile.tileID.canonical, pitchWithMap, rotateWithMap, tr, bucket.getProjection(), s); + // labelPlaneMatrixInv is used for converting vertex pos to tile coordinates needed for sampling elevation. + const labelPlaneMatrixInv = painter.terrain && pitchWithMap && alongLine ? ref_properties.invert$1(ref_properties.create(), labelPlaneMatrixRendering) : identityMat4; + const glCoordMatrix = getGlCoordMatrix(tileMatrix, tile.tileID.canonical, pitchWithMap, rotateWithMap, tr, bucket.getProjection(), s); - const id = tile.tileID.canonical; - uniforms['u_tile_tl_up'] = tileTransform.upVector(id, 0, 0); - uniforms['u_tile_tr_up'] = tileTransform.upVector(id, transform.EXTENT, 0); - uniforms['u_tile_br_up'] = tileTransform.upVector(id, transform.EXTENT, transform.EXTENT); - uniforms['u_tile_bl_up'] = tileTransform.upVector(id, 0, transform.EXTENT); - uniforms['u_tile_up_scale'] = tileTransform.upVectorScale(id); + const hasVariableAnchors = variablePlacement && bucket.hasTextData(); + const updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' && + hasVariableAnchors && + bucket.hasIconData(); - let demTile = null; - let prevDemTile = null; - let morphingPhase = 1.0; + if (alongLine) { + const elevation = tr.elevation; + const getElevation = elevation ? elevation.getAtTileOffsetFunc(coord, tr.center.lat, tr.worldSize, bucket.getProjection()) : (_ => [0, 0, 0]); + const labelPlaneMatrixPlacement = getLabelPlaneMatrixForPlacement(tileMatrix, tile.tileID.canonical, pitchWithMap, rotateWithMap, tr, bucket.getProjection(), s); - if (options && options.morphing && this._useVertexMorphing) { - const srcTile = options.morphing.srcDemTile; - const dstTile = options.morphing.dstDemTile; - morphingPhase = options.morphing.phase; + updateLineLabels(bucket, tileMatrix, painter, isText, labelPlaneMatrixPlacement, glCoordMatrix, pitchWithMap, keepUpright, getElevation, coord); + } - if (srcTile && dstTile) { - if (this._prepareDemTileUniforms(tile, srcTile, uniforms, "_prev")) - prevDemTile = srcTile; - if (this._prepareDemTileUniforms(tile, dstTile, uniforms)) - demTile = dstTile; - } + const projectedPosOnLabelSpace = alongLine || (isText && variablePlacement) || updateTextFitIcon; + const matrix = painter.translatePosMatrix(tileMatrix, tile, translate, translateAnchor); + const uLabelPlaneMatrix = projectedPosOnLabelSpace ? identityMat4 : labelPlaneMatrixRendering; + const uglCoordMatrix = painter.translatePosMatrix(glCoordMatrix, tile, translate, translateAnchor, true); + const invMatrix = bucket.getProjection().createInversionMatrix(tr, coord.canonical); + + const baseDefines = ([] ); + if (painter.terrain && pitchWithMap) { + baseDefines.push('PITCH_WITH_MAP_TERRAIN'); + } + if (bucketIsGlobeProjection) { + baseDefines.push('PROJECTION_GLOBE_VIEW'); + } + if (projectedPosOnLabelSpace) { + baseDefines.push('PROJECTED_POS_ON_VIEWPORT'); } - if (prevDemTile && demTile) { - // Both DEM textures are expected to be correctly set if geomorphing is enabled - context.activeTexture.set(gl.TEXTURE2); - (demTile.demTexture ).bind(gl.NEAREST, gl.CLAMP_TO_EDGE, gl.NEAREST); - context.activeTexture.set(gl.TEXTURE4); - (prevDemTile.demTexture ).bind(gl.NEAREST, gl.CLAMP_TO_EDGE, gl.NEAREST); + const hasHalo = isSDF && layer.paint.get(isText ? 'text-halo-width' : 'icon-halo-width').constantOr(1) !== 0; - uniforms["u_dem_lerp"] = morphingPhase; + let uniformValues; + if (isSDF) { + if (!bucket.iconsInText) { + uniformValues = symbolSDFUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, + matrix, uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, true, coord, globeToMercator, mercatorCenter, invMatrix, cameraUpVector, bucket.getProjection()); + } else { + uniformValues = symbolTextAndIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, + matrix, uLabelPlaneMatrix, uglCoordMatrix, texSize, texSizeIcon, coord, globeToMercator, mercatorCenter, invMatrix, cameraUpVector, bucket.getProjection()); + } } else { - demTile = this.terrainTileForTile[tile.tileID.key]; - context.activeTexture.set(gl.TEXTURE2); - const demTexture = this._prepareDemTileUniforms(tile, demTile, uniforms) ? - (demTile.demTexture ) : this.emptyDEMTexture; - demTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); + uniformValues = symbolIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, + uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, coord, globeToMercator, mercatorCenter, invMatrix, cameraUpVector, bucket.getProjection()); } - context.activeTexture.set(gl.TEXTURE3); - if (options && options.useDepthForOcclusion) { - this._depthTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); - uniforms['u_depth_size_inv'] = [1 / this._depthFBO.width, 1 / this._depthFBO.height]; + const program = painter.useProgram(getSymbolProgramName(isSDF, isText, bucket), programConfiguration, baseDefines); + + const state = { + program, + buffers, + uniformValues, + atlasTexture, + atlasTextureIcon, + atlasInterpolation, + atlasInterpolationIcon, + isSDF, + hasHalo, + tile, + labelPlaneMatrixInv + }; + + if (hasSortKey && bucket.canOverlap) { + sortFeaturesByKey = true; + const oldSegments = buffers.segments.get(); + for (const segment of oldSegments) { + tileRenderState.push({ + segments: new ref_properties.SegmentVector([segment]), + sortKey: ((segment.sortKey ) ), + state + }); + } } else { - this.emptyDepthBufferTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); - uniforms['u_depth_size_inv'] = [1, 1]; + tileRenderState.push({ + segments: buffers.segments, + sortKey: 0, + state + }); } + } - if (options && options.useMeterToDem && demTile) { - const meterToDEM = (1 << demTile.tileID.canonical.z) * transform.mercatorZfromAltitude(1, this.painter.transform.center.lat) * this.sourceCache.getSource().tileSize; - uniforms['u_meter_to_dem'] = meterToDEM; - } - if (options && options.labelPlaneMatrixInv) { - uniforms['u_label_plane_matrix_inv'] = options.labelPlaneMatrixInv; - } - program.setTerrainUniformValues(context, uniforms); + if (sortFeaturesByKey) { + tileRenderState.sort((a, b) => a.sortKey - b.sortKey); } - renderToBackBuffer(accumulatedDrapes ) { - const painter = this.painter; - const context = this.painter.context; + for (const segmentState of tileRenderState) { + const state = segmentState.state; + if (painter.terrain) { + const options = { + useDepthForOcclusion: !isGlobeProjection, + labelPlaneMatrixInv: state.labelPlaneMatrixInv + }; + painter.terrain.setupElevationDraw(state.tile, state.program, options); + } + context.activeTexture.set(gl.TEXTURE0); + state.atlasTexture.bind(state.atlasInterpolation, gl.CLAMP_TO_EDGE); + if (state.atlasTextureIcon) { + context.activeTexture.set(gl.TEXTURE1); + if (state.atlasTextureIcon) { + state.atlasTextureIcon.bind(state.atlasInterpolationIcon, gl.CLAMP_TO_EDGE); + } + } - if (accumulatedDrapes.length === 0) { - return; + if (state.isSDF) { + const uniformValues = ((state.uniformValues ) ); + if (state.hasHalo) { + uniformValues['u_is_halo'] = 1; + drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, uniformValues); + } + uniformValues['u_is_halo'] = 0; } + drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, state.uniformValues); + } +} - context.bindFramebuffer.set(null); - context.viewport.set([0, 0, painter.width, painter.height]); +function drawSymbolElements(buffers, segments, layer, painter, program, depthMode, stencilMode, colorMode, uniformValues) { + const context = painter.context; + const gl = context.gl; + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, + uniformValues, layer.id, buffers.layoutVertexBuffer, + buffers.indexBuffer, segments, layer.paint, + painter.transform.zoom, buffers.programConfigurations.get(layer.id), + buffers.dynamicLayoutVertexBuffer, buffers.opacityVertexBuffer, buffers.globeExtVertexBuffer); +} - this.renderingToTexture = false; - drawTerrainRaster(painter, this, this.proxySourceCache, accumulatedDrapes, this._updateTimestamp); - this.renderingToTexture = true; +// - accumulatedDrapes.splice(0, accumulatedDrapes.length); - } + + + + + + + + + - // For each proxy tile, render all layers until the non-draped layer (and - // render the tile to the screen) before advancing to the next proxy tile. - // Returns the last drawn index that is used as a start - // layer for interleaved draped rendering. - // Apart to layer-by-layer rendering used in 2D, here we have proxy-tile-by-proxy-tile - // rendering. - renderBatch(startLayerIndex ) { - if (this._drapedRenderBatches.length === 0) { - return startLayerIndex + 1; - } + + + + + - this.renderingToTexture = true; - const painter = this.painter; - const context = this.painter.context; - const psc = this.proxySourceCache; - const proxies = this.proxiedCoords[psc.id]; +function drawCircles(painter , sourceCache , layer , coords ) { + if (painter.renderPass !== 'translucent') return; - // Consume batch of sequential drape layers and move next - const drapedLayerBatch = this._drapedRenderBatches.shift(); - transform.assert_1(drapedLayerBatch.start === startLayerIndex); + const opacity = layer.paint.get('circle-opacity'); + const strokeWidth = layer.paint.get('circle-stroke-width'); + const strokeOpacity = layer.paint.get('circle-stroke-opacity'); + const sortFeaturesByKey = layer.layout.get('circle-sort-key').constantOr(1) !== undefined; - const accumulatedDrapes = []; - const layerIds = painter.style.order; + if (opacity.constantOr(1) === 0 && (strokeWidth.constantOr(1) === 0 || strokeOpacity.constantOr(1) === 0)) { + return; + } - let poolIndex = 0; - for (const proxy of proxies) { - // bind framebuffer and assign texture to the tile (texture used in drawTerrainRaster). - const tile = psc.getTileByID(proxy.proxyTileKey); - const renderCacheIndex = psc.proxyCachedFBO[proxy.key] ? psc.proxyCachedFBO[proxy.key][startLayerIndex] : undefined; - const fbo = renderCacheIndex !== undefined ? psc.renderCache[renderCacheIndex] : this.pool[poolIndex++]; - const useRenderCache = renderCacheIndex !== undefined; + const context = painter.context; + const gl = context.gl; + const tr = painter.transform; - tile.texture = fbo.tex; + const depthMode = painter.depthModeForSublayer(0, ref_properties.DepthMode.ReadOnly); + // Turn off stencil testing to allow circles to be drawn across boundaries, + // so that large circles are not clipped to tiles + const stencilMode = ref_properties.StencilMode.disabled; + const colorMode = painter.colorModeForRenderPass(); + const isGlobeProjection = tr.projection.name === 'globe'; + const mercatorCenter = [ref_properties.mercatorXfromLng(tr.center.lng), ref_properties.mercatorYfromLat(tr.center.lat)]; - if (useRenderCache && !fbo.dirty) { - // Use cached render from previous pass, no need to render again. - accumulatedDrapes.push(tile.tileID); - continue; - } + const segmentsRenderStates = []; - context.bindFramebuffer.set(fbo.fb.framebuffer); - this.renderedToTile = false; // reset flag. - if (fbo.dirty) { - // Clear on start. - context.clear({color: transform.Color.transparent, stencil: 0}); - fbo.dirty = false; - } + for (let i = 0; i < coords.length; i++) { + const coord = coords[i]; - let currentStencilSource; // There is no need to setup stencil for the same source for consecutive layers. - for (let j = drapedLayerBatch.start; j <= drapedLayerBatch.end; ++j) { - const layer = painter.style._layers[layerIds[j]]; - const hidden = layer.isHidden(painter.transform.zoom); - transform.assert_1(this._style.isLayerDraped(layer) || hidden); - if (hidden) continue; + const tile = sourceCache.getTile(coord); + const bucket = (tile.getBucket(layer) ); + if (!bucket || bucket.projection.name !== tr.projection.name) continue; - const sourceCache = painter.style._getLayerSourceCache(layer); - const proxiedCoords = sourceCache ? this.proxyToSource[proxy.key][sourceCache.id] : [proxy]; - if (!proxiedCoords) continue; // when tile is not loaded yet for the source cache. + const programConfiguration = bucket.programConfigurations.get(layer.id); + const definesValues = circleDefinesValues(layer); + if (isGlobeProjection) { + definesValues.push('PROJECTION_GLOBE_VIEW'); + } + const program = painter.useProgram('circle', programConfiguration, ((definesValues ) )); + const layoutVertexBuffer = bucket.layoutVertexBuffer; + const globeExtVertexBuffer = bucket.globeExtVertexBuffer; + const indexBuffer = bucket.indexBuffer; + const invMatrix = tr.projection.createInversionMatrix(tr, coord.canonical); + const uniformValues = circleUniformValues(painter, coord, tile, invMatrix, mercatorCenter, layer); - const coords = ((proxiedCoords ) ); - context.viewport.set([0, 0, fbo.fb.width, fbo.fb.height]); - if (currentStencilSource !== (sourceCache ? sourceCache.id : null)) { - this._setupStencil(fbo, proxiedCoords, layer, sourceCache); - currentStencilSource = sourceCache ? sourceCache.id : null; - } - painter.renderLayer(painter, sourceCache, layer, coords); - } + const state = { + programConfiguration, + program, + layoutVertexBuffer, + globeExtVertexBuffer, + indexBuffer, + uniformValues, + tile + }; - if (this.renderedToTile) { - fbo.dirty = true; - accumulatedDrapes.push(tile.tileID); - } else if (!useRenderCache) { - --poolIndex; - transform.assert_1(poolIndex >= 0); - } - if (poolIndex === FBO_POOL_SIZE) { - poolIndex = 0; - this.renderToBackBuffer(accumulatedDrapes); + if (sortFeaturesByKey) { + const oldSegments = bucket.segments.get(); + for (const segment of oldSegments) { + segmentsRenderStates.push({ + segments: new ref_properties.SegmentVector([segment]), + sortKey: ((segment.sortKey ) ), + state + }); } + } else { + segmentsRenderStates.push({ + segments: bucket.segments, + sortKey: 0, + state + }); } - // Reset states and render last drapes - this.renderToBackBuffer(accumulatedDrapes); - this.renderingToTexture = false; - - context.bindFramebuffer.set(null); - context.viewport.set([0, 0, painter.width, painter.height]); - - return drapedLayerBatch.end + 1; } - postRender() { - // Make sure we consumed all the draped terrain batches at this point - transform.assert_1(this._drapedRenderBatches.length === 0); + if (sortFeaturesByKey) { + segmentsRenderStates.sort((a, b) => a.sortKey - b.sortKey); } - renderCacheEfficiency(style ) { - const layerCount = style.order.length; - - if (layerCount === 0) { - return {efficiency: 100.0}; - } + const terrainOptions = {useDepthForOcclusion: !isGlobeProjection}; - let uncacheableLayerCount = 0; - let drapedLayerCount = 0; - let reachedUndrapedLayer = false; - let firstUndrapedLayer; + for (const segmentsState of segmentsRenderStates) { + const {programConfiguration, program, layoutVertexBuffer, globeExtVertexBuffer, indexBuffer, uniformValues, tile} = segmentsState.state; + const segments = segmentsState.segments; - for (let i = 0; i < layerCount; ++i) { - const layer = style._layers[style.order[i]]; - if (!this._style.isLayerDraped(layer)) { - if (!reachedUndrapedLayer) { - reachedUndrapedLayer = true; - firstUndrapedLayer = layer.id; - } - } else { - if (reachedUndrapedLayer) { - ++uncacheableLayerCount; - } - ++drapedLayerCount; - } - } + if (painter.terrain) painter.terrain.setupElevationDraw(tile, program, terrainOptions); - if (drapedLayerCount === 0) { - return {efficiency: 100.0}; - } + painter.prepareDrawProgram(context, program, tile.tileID.toUnwrapped()); - return {efficiency: (1.0 - uncacheableLayerCount / drapedLayerCount) * 100.0, firstUndrapedLayer}; + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, + uniformValues, layer.id, + layoutVertexBuffer, indexBuffer, segments, + layer.paint, tr.zoom, programConfiguration, + isGlobeProjection ? globeExtVertexBuffer : null); } +} - getMinElevationBelowMSL() { - let min = 0.0; - // The maximum DEM error in meters to be conservative (SRTM). - const maxDEMError = 30.0; - this._visibleDemTiles.filter(tile => tile.dem).forEach(tile => { - const minMaxTree = (tile.dem ).tree; - min = Math.min(min, minMaxTree.minimums[0]); - }); - return min === 0.0 ? min : (min - maxDEMError) * this._exaggeration; +// + +function drawHeatmap(painter , sourceCache , layer , coords ) { + if (layer.paint.get('heatmap-opacity') === 0) { + return; } - // Performs raycast against visible DEM tiles on the screen and returns the distance travelled along the ray. - // x & y components of the position are expected to be in normalized mercator coordinates [0, 1] and z in meters. - raycast(pos , dir , exaggeration ) { - if (!this._visibleDemTiles) - return null; + if (painter.renderPass === 'offscreen') { + const context = painter.context; + const gl = context.gl; - // Perform initial raycasts against root nodes of the available dem tiles - // and use this information to sort them from closest to furthest. - const preparedTiles = this._visibleDemTiles.filter(tile => tile.dem).map(tile => { - const id = tile.tileID; - const tiles = Math.pow(2.0, id.overscaledZ); - const {x, y} = id.canonical; + // Allow kernels to be drawn across boundaries, so that + // large kernels are not clipped to tiles + const stencilMode = ref_properties.StencilMode.disabled; + // Turn on additive blending for kernels, which is a key aspect of kernel density estimation formula + const colorMode = new ref_properties.ColorMode([gl.ONE, gl.ONE], ref_properties.Color.transparent, [true, true, true, true]); + const resolutionScaling = painter.transform.projection.name === 'globe' ? 0.5 : 0.25; - // Compute tile boundaries in mercator coordinates - const minx = x / tiles; - const maxx = (x + 1) / tiles; - const miny = y / tiles; - const maxy = (y + 1) / tiles; - const tree = (tile.dem ).tree; + bindFramebuffer(context, painter, layer, resolutionScaling); - return { - minx, miny, maxx, maxy, - t: tree.raycastRoot(minx, miny, maxx, maxy, pos, dir, exaggeration), - tile - }; - }); + context.clear({color: ref_properties.Color.transparent}); - preparedTiles.sort((a, b) => { - const at = a.t !== null ? a.t : Number.MAX_VALUE; - const bt = b.t !== null ? b.t : Number.MAX_VALUE; - return at - bt; - }); + const tr = painter.transform; - for (const obj of preparedTiles) { - if (obj.t == null) - return null; + const isGlobeProjection = tr.projection.name === 'globe'; - // Perform more accurate raycast against the dem tree. First intersection is the closest on - // as all tiles are sorted from closest to furthest - const tree = (obj.tile.dem ).tree; - const t = tree.raycast(obj.minx, obj.miny, obj.maxx, obj.maxy, pos, dir, exaggeration); + const definesValues = isGlobeProjection ? ['PROJECTION_GLOBE_VIEW'] : null; + const cullMode = isGlobeProjection ? ref_properties.CullFaceMode.frontCCW : ref_properties.CullFaceMode.disabled; - if (t != null) - return t; - } + const mercatorCenter = [ref_properties.mercatorXfromLng(tr.center.lng), ref_properties.mercatorYfromLat(tr.center.lat)]; - return null; - } + for (let i = 0; i < coords.length; i++) { + const coord = coords[i]; - _createFBO() { - const painter = this.painter; - const context = painter.context; - const gl = context.gl; - const bufferSize = this.drapeBufferSize; - context.activeTexture.set(gl.TEXTURE0); - const tex = new transform.Texture(context, {width: bufferSize[0], height: bufferSize[1], data: null}, gl.RGBA); - tex.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - const fb = context.createFramebuffer(bufferSize[0], bufferSize[1], false); - fb.colorAttachment.set(tex.texture); - fb.depthAttachment = new transform.DepthStencilAttachment(context, fb.framebuffer); + // 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; - if (this._sharedDepthStencil === undefined) { - this._sharedDepthStencil = context.createRenderbuffer(context.gl.DEPTH_STENCIL, bufferSize[0], bufferSize[1]); - this._stencilRef = 0; - fb.depthAttachment.set(this._sharedDepthStencil); - context.clear({stencil: 0}); - } else { - fb.depthAttachment.set(this._sharedDepthStencil); - } + const tile = sourceCache.getTile(coord); + const bucket = (tile.getBucket(layer) ); + if (!bucket || bucket.projection.name !== tr.projection.name) continue; - if (context.extTextureFilterAnisotropic && !context.extTextureFilterAnisotropicForceOff) { - gl.texParameterf(gl.TEXTURE_2D, - context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, - context.extTextureFilterAnisotropicMax); + const programConfiguration = bucket.programConfigurations.get(layer.id); + const program = painter.useProgram('heatmap', programConfiguration, definesValues); + const {zoom} = painter.transform; + if (painter.terrain) painter.terrain.setupElevationDraw(tile, program); + + painter.prepareDrawProgram(context, program, coord.toUnwrapped()); + + const invMatrix = tr.projection.createInversionMatrix(tr, coord.canonical); + + program.draw(context, gl.TRIANGLES, ref_properties.DepthMode.disabled, stencilMode, colorMode, cullMode, + heatmapUniformValues(painter, coord, + tile, invMatrix, mercatorCenter, zoom, layer.paint.get('heatmap-intensity')), + layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, + bucket.segments, layer.paint, painter.transform.zoom, + programConfiguration, + isGlobeProjection ? bucket.globeExtVertexBuffer : null); } - return {fb, tex, dirty: false}; - } + context.viewport.set([0, 0, painter.width, painter.height]); - _initFBOPool() { - while (this.pool.length < Math.min(FBO_POOL_SIZE, this.proxyCoords.length)) { - this.pool.push(this._createFBO()); - } + } else if (painter.renderPass === 'translucent') { + painter.context.setColorMode(painter.colorModeForRenderPass()); + renderTextureToMap(painter, layer); } +} - _shouldDisableRenderCache() { - // Disable render caches on dynamic events due to fading or transitioning. - if (this._style.light && this._style.light.hasTransition()) { - return true; - } +function bindFramebuffer(context, painter, layer, scaling) { + const gl = context.gl; + const width = painter.width * scaling; + const height = painter.height * scaling; - for (const id in this._style._sourceCaches) { - if (this._style._sourceCaches[id].hasTransition()) { - return true; - } - } + context.activeTexture.set(gl.TEXTURE1); + context.viewport.set([0, 0, width, height]); - const fadingOrTransitioning = id => { - const layer = this._style._layers[id]; - const isHidden = layer.isHidden(this.painter.transform.zoom); - const crossFade = layer.getCrossfadeParameters(); - const isFading = !!crossFade && crossFade.t !== 1; - const isTransitioning = layer.hasTransition(); - return layer.type !== 'custom' && !isHidden && (isFading || isTransitioning); - }; - return this._style.order.some(fadingOrTransitioning); + let fbo = layer.heatmapFbo; + + if (!fbo || (fbo && (fbo.width !== width || fbo.height !== height))) { + if (fbo) { fbo.destroy(); } + + const 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(width, height, false); + + bindTextureToFramebuffer(context, painter, texture, fbo, width, height); + + } else { + gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); + context.bindFramebuffer.set(fbo.framebuffer); } +} - _clearRasterFadeFromRenderCache() { - let hasRasterSource = false; - for (const id in this._style._sourceCaches) { - if (this._style._sourceCaches[id]._source instanceof RasterTileSource) { - hasRasterSource = true; - break; - } - } - if (!hasRasterSource) { - return; - } +function bindTextureToFramebuffer(context, painter, texture, fbo, width, height) { + const gl = context.gl; + // Use the higher precision half-float texture where available (producing much smoother looking heatmaps); + // Otherwise, fall back to a low precision texture + const internalFormat = context.extRenderToTextureHalfFloat ? context.extTextureHalfFloat.HALF_FLOAT_OES : gl.UNSIGNED_BYTE; + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, internalFormat, null); + fbo.colorAttachment.set(texture); +} - // Check if any raster tile is in a fading state - for (let i = 0; i < this._style.order.length; ++i) { - const layer = this._style._layers[this._style.order[i]]; - const isHidden = layer.isHidden(this.painter.transform.zoom); - const sourceCache = this._style._getLayerSourceCache(layer); - if (layer.type !== 'raster' || isHidden || !sourceCache) { continue; } +function renderTextureToMap(painter, layer) { + const context = painter.context; + const gl = context.gl; - const rasterLayer = ((layer ) ); - const fadeDuration = rasterLayer.paint.get('raster-fade-duration'); - for (const proxy of this.proxyCoords) { - const proxiedCoords = this.proxyToSource[proxy.key][sourceCache.id]; - const coords = ((proxiedCoords ) ); - if (!coords) { continue; } + // 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. + const fbo = layer.heatmapFbo; + if (!fbo) return; + context.activeTexture.set(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); - for (const coord of coords) { - const tile = sourceCache.getTile(coord); - const parent = sourceCache.findLoadedParent(coord, 0); - const fade = rasterFade(tile, parent, sourceCache, this.painter.transform, fadeDuration); - const isFading = fade.opacity !== 1 || fade.mix !== 0; - if (isFading) { - this._clearRenderCacheForTile(sourceCache.id, coord); - } - } - } - } + context.activeTexture.set(gl.TEXTURE1); + let colorRampTexture = layer.colorRampTexture; + if (!colorRampTexture) { + colorRampTexture = layer.colorRampTexture = new ref_properties.Texture(context, layer.colorRamp, gl.RGBA); } + colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - _setupDrapedRenderBatches() { - const layerIds = this._style.order; - const layerCount = layerIds.length; - if (layerCount === 0) { - return; - } + painter.useProgram('heatmapTexture').draw(context, gl.TRIANGLES, + ref_properties.DepthMode.disabled, ref_properties.StencilMode.disabled, painter.colorModeForRenderPass(), ref_properties.CullFaceMode.disabled, + heatmapTextureUniformValues(painter, layer, 0, 1), + layer.id, painter.viewportBuffer, painter.quadTriangleIndexBuffer, + painter.viewportSegments, layer.paint, painter.transform.zoom); +} - const batches = []; +// - let currentLayer = 0; - let layer = this._style._layers[layerIds[currentLayer]]; - while (!this._style.isLayerDraped(layer) && layer.isHidden(this.painter.transform.zoom) && ++currentLayer < layerCount) { - layer = this._style._layers[layerIds[currentLayer]]; - } +function drawLine(painter , sourceCache , layer , coords ) { + if (painter.renderPass !== 'translucent') return; - let batchStart; - for (; currentLayer < layerCount; ++currentLayer) { - const layer = this._style._layers[layerIds[currentLayer]]; - if (layer.isHidden(this.painter.transform.zoom)) { - continue; - } - if (!this._style.isLayerDraped(layer)) { - if (batchStart !== undefined) { - batches.push({start: batchStart, end: currentLayer - 1}); - batchStart = undefined; - } - continue; - } - if (batchStart === undefined) { - batchStart = currentLayer; - } - } + const opacity = layer.paint.get('line-opacity'); + const width = layer.paint.get('line-width'); + if (opacity.constantOr(1) === 0 || width.constantOr(1) === 0) return; - if (batchStart !== undefined) { - batches.push({start: batchStart, end: currentLayer - 1}); - } + const depthMode = painter.depthModeForSublayer(0, ref_properties.DepthMode.ReadOnly); + const colorMode = painter.colorModeForRenderPass(); + const pixelRatio = (painter.terrain && painter.terrain.renderingToTexture) ? 1.0 : ref_properties.exported.devicePixelRatio; - if (this._style.map._optimizeForTerrain) { - // Draped first approach should result in a single or no batch - transform.assert_1(batches.length === 1 || batches.length === 0); - } + const dasharrayProperty = layer.paint.get('line-dasharray'); + const dasharray = dasharrayProperty.constantOr((1 )); + const capProperty = layer.layout.get('line-cap'); + const patternProperty = layer.paint.get('line-pattern'); + const image = patternProperty.constantOr((1 )); - this._drapedRenderBatches = batches; + const gradient = layer.paint.get('line-gradient'); + const crossfade = layer.getCrossfadeParameters(); + + const programId = image ? 'linePattern' : 'line'; + + const context = painter.context; + const gl = context.gl; + + const definesValues = lineDefinesValues(layer); + let useStencilMaskRenderPass = definesValues.includes('RENDER_LINE_ALPHA_DISCARD'); + if (painter.terrain && painter.terrain.clipOrMaskOverlapStencilType()) { + useStencilMaskRenderPass = false; } - _setupRenderCache(previousProxyToSource ) { - const psc = this.proxySourceCache; - if (this._shouldDisableRenderCache() || this._invalidateRenderCache) { - this._invalidateRenderCache = false; - if (psc.renderCache.length > psc.renderCachePool.length) { - const used = ((Object.values(psc.proxyCachedFBO) ) ); - psc.proxyCachedFBO = {}; - for (let i = 0; i < used.length; ++i) { - const fbos = ((Object.values(used[i]) ) ); - psc.renderCachePool.push(...fbos); - } - transform.assert_1(psc.renderCache.length === psc.renderCachePool.length); - } - return; + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + if (image && !tile.patternsLoaded()) continue; + + const bucket = (tile.getBucket(layer) ); + if (!bucket) continue; + painter.prepareDrawTile(); + + const programConfiguration = bucket.programConfigurations.get(layer.id); + const program = painter.useProgram(programId, programConfiguration, ((definesValues ) )); + + const constantPattern = patternProperty.constantOr(null); + if (constantPattern && tile.imageAtlas) { + const atlas = tile.imageAtlas; + const posTo = atlas.patternPositions[constantPattern.to.toString()]; + const posFrom = atlas.patternPositions[constantPattern.from.toString()]; + if (posTo && posFrom) programConfiguration.setConstantPatternPositions(posTo, posFrom); } - this._clearRasterFadeFromRenderCache(); + const constantDash = dasharrayProperty.constantOr(null); + const constantCap = capProperty.constantOr((null )); - const coords = this.proxyCoords; - const dirty = this._tilesDirty; - for (let i = coords.length - 1; i >= 0; i--) { - const proxy = coords[i]; - const tile = psc.getTileByID(proxy.key); + if (!image && constantDash && constantCap && tile.lineAtlas) { + const atlas = tile.lineAtlas; + const posTo = atlas.getDash(constantDash.to, constantCap); + const posFrom = atlas.getDash(constantDash.from, constantCap); + if (posTo && posFrom) programConfiguration.setConstantPatternPositions(posTo, posFrom); + } - if (psc.proxyCachedFBO[proxy.key] !== undefined) { - transform.assert_1(tile.texture); - const prev = previousProxyToSource[proxy.key]; - transform.assert_1(prev); - // Reuse previous render from cache if there was no change of - // content that was used to render proxy tile. - const current = this.proxyToSource[proxy.key]; - let equal = 0; - for (const source in current) { - const tiles = current[source]; - const prevTiles = prev[source]; - if (!prevTiles || prevTiles.length !== tiles.length || - tiles.some((t, index) => - (t !== prevTiles[index] || - (dirty[source] && dirty[source].hasOwnProperty(t.key) - ))) - ) { - equal = -1; - break; - } - ++equal; + let [trimStart, trimEnd] = layer.paint.get('line-trim-offset'); + // When line cap is 'round' or 'square', the whole line progress will beyond 1.0 or less than 0.0. + // If trim_offset begin is line begin (0.0), or trim_offset end is line end (1.0), adjust the trim + // offset with fake offset shift so that the line_progress < 0.0 or line_progress > 1.0 part will be + // correctly covered. + if (constantCap === 'round' || constantCap === 'square') { + // Fake the percentage so that it will cover the round/square cap that is beyond whole line + const fakeOffsetShift = 1.0; + // To make sure that the trim offset range is effecive + if (trimStart !== trimEnd) { + if (trimStart === 0.0) { + trimStart -= fakeOffsetShift; } - // dirty === false: doesn't need to be rendered to, just use cached render. - for (const proxyFBO in psc.proxyCachedFBO[proxy.key]) { - psc.renderCache[psc.proxyCachedFBO[proxy.key][proxyFBO]].dirty = equal < 0 || equal !== Object.values(prev).length; + if (trimEnd === 1.0) { + trimEnd += fakeOffsetShift; } } } - const sortedRenderBatches = [...this._drapedRenderBatches]; - sortedRenderBatches.sort((batchA, batchB) => { - const batchASize = batchA.end - batchA.start; - const batchBSize = batchB.end - batchB.start; - return batchBSize - batchASize; - }); - - for (const batch of sortedRenderBatches) { - for (const id of coords) { - if (psc.proxyCachedFBO[id.key]) { - continue; - } + const matrix = painter.terrain ? coord.projMatrix : null; + const uniformValues = image ? + linePatternUniformValues(painter, tile, layer, crossfade, matrix, pixelRatio) : + lineUniformValues(painter, tile, layer, crossfade, matrix, bucket.lineClipsArray.length, pixelRatio, [trimStart, trimEnd]); - // Assign renderCache FBO if there are available FBOs in pool. - let index = psc.renderCachePool.pop(); - if (index === undefined && psc.renderCache.length < RENDER_CACHE_MAX_SIZE) { - index = psc.renderCache.length; - psc.renderCache.push(this._createFBO()); + if (gradient) { + const layerGradient = bucket.gradients[layer.id]; + let gradientTexture = layerGradient.texture; + if (layer.gradientVersion !== layerGradient.version) { + let textureResolution = 256; + if (layer.stepInterpolant) { + const sourceMaxZoom = sourceCache.getSource().maxzoom; + const potentialOverzoom = coord.canonical.z === sourceMaxZoom ? + Math.ceil(1 << (painter.transform.maxZoom - coord.canonical.z)) : 1; + const lineLength = bucket.maxLineLength / ref_properties.EXTENT; + // Logical pixel tile size is 512px, and 1024px right before current zoom + 1 + const maxTilePixelSize = 1024; + // Maximum possible texture coverage heuristic, bound by hardware max texture size + const maxTextureCoverage = lineLength * maxTilePixelSize * potentialOverzoom; + textureResolution = ref_properties.clamp(ref_properties.nextPowerOfTwo(maxTextureCoverage), 256, context.maxTextureSize); } - if (index !== undefined) { - psc.proxyCachedFBO[id.key] = {}; - psc.proxyCachedFBO[id.key][batch.start] = index; - psc.renderCache[index].dirty = true; // needs to be rendered to. + layerGradient.gradient = ref_properties.renderColorRamp({ + expression: layer.gradientExpression(), + evaluationKey: 'lineProgress', + resolution: textureResolution, + image: layerGradient.gradient || undefined, + clips: bucket.lineClipsArray + }); + if (layerGradient.texture) { + layerGradient.texture.update(layerGradient.gradient); + } else { + layerGradient.texture = new ref_properties.Texture(context, layerGradient.gradient, gl.RGBA); } + layerGradient.version = layer.gradientVersion; + gradientTexture = layerGradient.texture; } + context.activeTexture.set(gl.TEXTURE1); + gradientTexture.bind(layer.stepInterpolant ? gl.NEAREST : gl.LINEAR, gl.CLAMP_TO_EDGE); } - this._tilesDirty = {}; - } - - _setupStencil(fbo , proxiedCoords , layer , sourceCache ) { - if (!sourceCache || !this._sourceTilesOverlap[sourceCache.id]) { - if (this._overlapStencilType) this._overlapStencilType = false; - return; + if (dasharray) { + context.activeTexture.set(gl.TEXTURE0); + tile.lineAtlasTexture.bind(gl.LINEAR, gl.REPEAT); + programConfiguration.updatePaintBuffers(crossfade); + } + if (image) { + context.activeTexture.set(gl.TEXTURE0); + tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + programConfiguration.updatePaintBuffers(crossfade); } - const context = this.painter.context; - const gl = context.gl; - // If needed, setup stencilling. Don't bother to remove when there is no - // more need: in such case, if there is no overlap, stencilling is disabled. - if (proxiedCoords.length <= 1) { this._overlapStencilType = false; return; } + painter.prepareDrawProgram(context, program, coord.toUnwrapped()); - const fb = fbo.fb; - let stencilRange; - if (layer.isTileClipped()) { - stencilRange = proxiedCoords.length; - this._overlapStencilMode.test = {func: gl.EQUAL, mask: 0xFF}; - this._overlapStencilType = 'Clip'; - } else if (proxiedCoords[0].overscaledZ > proxiedCoords[proxiedCoords.length - 1].overscaledZ) { - stencilRange = 1; - this._overlapStencilMode.test = {func: gl.GREATER, mask: 0xFF}; - this._overlapStencilType = 'Mask'; + const renderLine = (stencilMode) => { + program.draw(context, gl.TRIANGLES, depthMode, + stencilMode, colorMode, ref_properties.CullFaceMode.disabled, uniformValues, + layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, + layer.paint, painter.transform.zoom, programConfiguration, bucket.layoutVertexBuffer2); + }; + + if (useStencilMaskRenderPass) { + const stencilId = painter.stencilModeForClipping(coord).ref; + // When terrain is on, ensure that the stencil buffer has 0 values. + // As stencil may be disabled when it is not in overlapping stencil + // mode. Refer to stencilModeForRTTOverlap logic. + if (stencilId === 0 && painter.terrain) { + context.clear({stencil: 0}); + } + const stencilFunc = {func: gl.EQUAL, mask: 0xFF}; + + // Allow line geometry fragment to be drawn only once: + // - Invert the stencil identifier left by stencil clipping, this + // ensures that we are not conflicting with neighborhing tiles. + // - Draw Anti-Aliased pixels with a threshold set to 0.8, this + // may draw Anti-Aliased pixels more than once, but due to their + // low opacity, these pixels are usually invisible and potential + // overlapping pixel artifacts locally minimized. + uniformValues['u_alpha_discard_threshold'] = 0.8; + renderLine(new ref_properties.StencilMode(stencilFunc, stencilId, 0xFF, gl.KEEP, gl.KEEP, gl.INVERT)); + uniformValues['u_alpha_discard_threshold'] = 0.0; + renderLine(new ref_properties.StencilMode(stencilFunc, stencilId, 0xFF, gl.KEEP, gl.KEEP, gl.KEEP)); } else { - this._overlapStencilType = false; - return; - } - if (this._stencilRef + stencilRange > 255) { - context.clear({stencil: 0}); - this._stencilRef = 0; - } - this._stencilRef += stencilRange; - this._overlapStencilMode.ref = this._stencilRef; - if (layer.isTileClipped()) { - this._renderTileClippingMasks(proxiedCoords, this._overlapStencilMode.ref); + renderLine(painter.stencilModeForClipping(coord)); } } - clipOrMaskOverlapStencilType() { - return this._overlapStencilType === 'Clip' || this._overlapStencilType === 'Mask'; + // When rendering to stencil, reset the mask to make sure that the tile + // clipping reverts the stencil mask we may have drawn in the buffer. + // The stamp could be reverted by an extra draw call of line geometry, + // but tile clipping drawing is usually faster to draw than lines. + if (useStencilMaskRenderPass) { + painter.resetStencilClippingMasks(); + if (painter.terrain) { context.clear({stencil: 0}); } } +} - stencilModeForRTTOverlap(id ) { - if (!this.renderingToTexture || !this._overlapStencilType) { - return transform.StencilMode.disabled; - } - // All source tiles contributing to the same proxy are processed in sequence, in zoom descending order. - // For raster / hillshade overlap masking, ref is based on zoom dif. - // For vector layer clipping, every tile gets dedicated stencil ref. - if (this._overlapStencilType === 'Clip') { - // In immediate 2D mode, we render rects to mark clipping area and handle behavior on tile borders. - // Here, there is no need for now for this: - // 1. overlap is handled by proxy render to texture tiles (there is no overlap there) - // 2. here we handle only brief zoom out semi-transparent color intensity flickering - // and that is avoided fine by stenciling primitives as part of drawing (instead of additional tile quad step). - this._overlapStencilMode.ref = this.painter._tileClippingMaskIDs[id.key]; - } // else this._overlapStencilMode.ref is set to a single value used per proxy tile, in _setupStencil. - return this._overlapStencilMode; +// + +function drawFill(painter , sourceCache , layer , coords ) { + const color = layer.paint.get('fill-color'); + const opacity = layer.paint.get('fill-opacity'); + + if (opacity.constantOr(1) === 0) { + return; } - _renderTileClippingMasks(proxiedCoords , ref ) { - const painter = this.painter; - const context = this.painter.context; - const gl = context.gl; - painter._tileClippingMaskIDs = {}; - context.setColorMode(transform.ColorMode.disabled); - context.setDepthMode(transform.DepthMode.disabled); + const colorMode = painter.colorModeForRenderPass(); - const program = painter.useProgram('clippingMask'); + const pattern = layer.paint.get('fill-pattern'); + const pass = painter.opaquePassEnabledForLayer() && + (!pattern.constantOr((1 )) && + color.constantOr(ref_properties.Color.transparent).a === 1 && + opacity.constantOr(0) === 1) ? 'opaque' : 'translucent'; - for (const tileID of proxiedCoords) { - const id = painter._tileClippingMaskIDs[tileID.key] = --ref; - program.draw(context, gl.TRIANGLES, transform.DepthMode.disabled, - // Tests will always pass, and ref value will be written to stencil buffer. - new transform.StencilMode({func: gl.ALWAYS, mask: 0}, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE), - transform.ColorMode.disabled, transform.CullFaceMode.disabled, clippingMaskUniformValues(tileID.projMatrix), - '$clipping', painter.tileExtentBuffer, - painter.quadTriangleIndexBuffer, painter.tileExtentSegments); - } + // Draw fill + if (painter.renderPass === pass) { + const depthMode = painter.depthModeForSublayer( + 1, painter.renderPass === 'opaque' ? ref_properties.DepthMode.ReadWrite : ref_properties.DepthMode.ReadOnly); + drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, false); } - // Casts a ray from a point on screen and returns the intersection point with the terrain. - // The returned point contains the mercator coordinates in its first 3 components, and elevation - // in meter in its 4th coordinate. - pointCoordinate(screenPoint ) { - const transform$1 = this.painter.transform; - if (screenPoint.x < 0 || screenPoint.x > transform$1.width || - screenPoint.y < 0 || screenPoint.y > transform$1.height) { - return null; - } + // Draw stroke + if (painter.renderPass === 'translucent' && layer.paint.get('fill-antialias')) { - const far = [screenPoint.x, screenPoint.y, 1, 1]; - transform.transformMat4$1(far, far, transform$1.pixelMatrixInverse); - transform.scale$1(far, far, 1.0 / far[3]); - // x & y in pixel coordinates, z is altitude in meters - far[0] /= transform$1.worldSize; - far[1] /= transform$1.worldSize; - const camera = transform$1._camera.position; - const mercatorZScale = transform.mercatorZfromAltitude(1, transform$1.center.lat); - const p = [camera[0], camera[1], camera[2] / mercatorZScale, 0.0]; - const dir = transform.subtract([], far.slice(0, 3), p); - transform.normalize(dir, dir); + // 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. + const depthMode = painter.depthModeForSublayer( + layer.getPaintProperty('fill-outline-color') ? 2 : 0, ref_properties.DepthMode.ReadOnly); + drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, true); + } +} - const exaggeration = this._exaggeration; - const distanceAlongRay = this.raycast(p, dir, exaggeration); +function drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, isOutline) { + const gl = painter.context.gl; - if (distanceAlongRay === null || !distanceAlongRay) return null; - transform.scaleAndAdd(p, p, dir, distanceAlongRay); - p[3] = p[2]; - p[2] *= mercatorZScale; - return p; + const patternProperty = layer.paint.get('fill-pattern'); + const image = patternProperty && patternProperty.constantOr((1 )); + const crossfade = layer.getCrossfadeParameters(); + let drawMode, programName, uniformValues, indexBuffer, segments; + + if (!isOutline) { + programName = image ? 'fillPattern' : 'fill'; + drawMode = gl.TRIANGLES; + } else { + programName = image && !layer.getPaintProperty('fill-outline-color') ? 'fillOutlinePattern' : 'fillOutline'; + drawMode = gl.LINES; } - drawDepth() { - const painter = this.painter; - const context = painter.context; - const psc = this.proxySourceCache; + for (const coord of coords) { + const tile = sourceCache.getTile(coord); + if (image && !tile.patternsLoaded()) continue; - const width = Math.ceil(painter.width), height = Math.ceil(painter.height); - if (this._depthFBO && (this._depthFBO.width !== width || this._depthFBO.height !== height)) { - this._depthFBO.destroy(); - delete this._depthFBO; - delete this._depthTexture; - } - if (!this._depthFBO) { - const gl = context.gl; - const fbo = context.createFramebuffer(width, height, true); - context.activeTexture.set(gl.TEXTURE0); - const texture = new transform.Texture(context, {width, height, data: null}, gl.RGBA); - texture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); - fbo.colorAttachment.set(texture.texture); - const renderbuffer = context.createRenderbuffer(context.gl.DEPTH_COMPONENT16, width, height); - fbo.depthAttachment.set(renderbuffer); - this._depthFBO = fbo; - this._depthTexture = texture; - } - context.bindFramebuffer.set(this._depthFBO.framebuffer); - context.viewport.set([0, 0, width, height]); + const bucket = (tile.getBucket(layer) ); + if (!bucket) continue; + painter.prepareDrawTile(); - drawTerrainDepth(painter, this, psc, this.proxyCoords); - } + const programConfiguration = bucket.programConfigurations.get(layer.id); + const program = painter.useProgram(programName, programConfiguration); - _setupProxiedCoordsForOrtho(sourceCache , sourceCoords , previousProxyToSource ) { - if (sourceCache.getSource() instanceof ImageSource) { - return this._setupProxiedCoordsForImageSource(sourceCache, sourceCoords, previousProxyToSource); - } - this._findCoveringTileCache[sourceCache.id] = this._findCoveringTileCache[sourceCache.id] || {}; - const coords = this.proxiedCoords[sourceCache.id] = []; - const proxys = this.proxyCoords; - for (let i = 0; i < proxys.length; i++) { - const proxyTileID = proxys[i]; - const proxied = this._findTileCoveringTileID(proxyTileID, sourceCache); - if (proxied) { - transform.assert_1(proxied.hasData()); - const id = this._createProxiedId(proxyTileID, proxied, previousProxyToSource[proxyTileID.key] && previousProxyToSource[proxyTileID.key][sourceCache.id]); - coords.push(id); - this.proxyToSource[proxyTileID.key][sourceCache.id] = [id]; - } + if (image) { + painter.context.activeTexture.set(gl.TEXTURE0); + tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + programConfiguration.updatePaintBuffers(crossfade); } - let hasOverlap = false; - for (let i = 0; i < sourceCoords.length; i++) { - const tile = sourceCache.getTile(sourceCoords[i]); - if (!tile || !tile.hasData()) continue; - const proxy = this._findTileCoveringTileID(tile.tileID, this.proxySourceCache); - // Don't add the tile if already added in loop above. - if (proxy && proxy.tileID.canonical.z !== tile.tileID.canonical.z) { - const array = this.proxyToSource[proxy.tileID.key][sourceCache.id]; - const id = this._createProxiedId(proxy.tileID, tile, previousProxyToSource[proxy.tileID.key] && previousProxyToSource[proxy.tileID.key][sourceCache.id]); - if (!array) { - this.proxyToSource[proxy.tileID.key][sourceCache.id] = [id]; - } else { - // The last element is parent added in loop above. This way we get - // a list in Z descending order which is needed for stencil masking. - array.splice(array.length - 1, 0, id); - } - coords.push(id); - hasOverlap = true; - } + + const constantPattern = patternProperty.constantOr(null); + if (constantPattern && tile.imageAtlas) { + const atlas = tile.imageAtlas; + const posTo = atlas.patternPositions[constantPattern.to.toString()]; + const posFrom = atlas.patternPositions[constantPattern.from.toString()]; + if (posTo && posFrom) programConfiguration.setConstantPatternPositions(posTo, posFrom); } - this._sourceTilesOverlap[sourceCache.id] = hasOverlap; - } - _setupProxiedCoordsForImageSource(sourceCache , sourceCoords , previousProxyToSource ) { - if (!sourceCache.getSource().loaded()) return; + const tileMatrix = painter.translatePosMatrix(coord.projMatrix, tile, + layer.paint.get('fill-translate'), layer.paint.get('fill-translate-anchor')); - const coords = this.proxiedCoords[sourceCache.id] = []; - const proxys = this.proxyCoords; - const imageSource = ((sourceCache.getSource() ) ); + if (!isOutline) { + indexBuffer = bucket.indexBuffer; + segments = bucket.segments; + uniformValues = image ? + fillPatternUniformValues(tileMatrix, painter, crossfade, tile) : + fillUniformValues(tileMatrix); + } else { + indexBuffer = bucket.indexBuffer2; + segments = bucket.segments2; + const drawingBufferSize = (painter.terrain && painter.terrain.renderingToTexture) ? painter.terrain.drapeBufferSize : [gl.drawingBufferWidth, gl.drawingBufferHeight]; + uniformValues = (programName === 'fillOutlinePattern' && image) ? + fillOutlinePatternUniformValues(tileMatrix, painter, crossfade, tile, drawingBufferSize) : + fillOutlineUniformValues(tileMatrix, drawingBufferSize); + } - const anchor = new transform.pointGeometry(imageSource.tileID.x, imageSource.tileID.y)._div(1 << imageSource.tileID.z); - const aabb = imageSource.coordinates.map(transform.MercatorCoordinate.fromLngLat).reduce((acc, coord) => { - acc.min.x = Math.min(acc.min.x, coord.x - anchor.x); - acc.min.y = Math.min(acc.min.y, coord.y - anchor.y); - acc.max.x = Math.max(acc.max.x, coord.x - anchor.x); - acc.max.y = Math.max(acc.max.y, coord.y - anchor.y); - return acc; - }, {min: new transform.pointGeometry(Number.MAX_VALUE, Number.MAX_VALUE), max: new transform.pointGeometry(-Number.MAX_VALUE, -Number.MAX_VALUE)}); + painter.prepareDrawProgram(painter.context, program, coord.toUnwrapped()); - // Fast conservative check using aabb: content outside proxy tile gets clipped out by on render, anyway. - const tileOutsideImage = (tileID, imageTileID) => { - const x = tileID.wrap + tileID.canonical.x / (1 << tileID.canonical.z); - const y = tileID.canonical.y / (1 << tileID.canonical.z); - const d = transform.EXTENT / (1 << tileID.canonical.z); + program.draw(painter.context, drawMode, depthMode, + painter.stencilModeForClipping(coord), colorMode, ref_properties.CullFaceMode.disabled, uniformValues, + layer.id, bucket.layoutVertexBuffer, indexBuffer, segments, + layer.paint, painter.transform.zoom, programConfiguration); + } +} - const ix = imageTileID.wrap + imageTileID.canonical.x / (1 << imageTileID.canonical.z); - const iy = imageTileID.canonical.y / (1 << imageTileID.canonical.z); +// - return x + d < ix + aabb.min.x || x > ix + aabb.max.x || y + d < iy + aabb.min.y || y > iy + aabb.max.y; - }; +function draw$1(painter , source , layer , coords ) { + const opacity = layer.paint.get('fill-extrusion-opacity'); + if (opacity === 0) { + return; + } - for (let i = 0; i < proxys.length; i++) { - const proxyTileID = proxys[i]; - for (let j = 0; j < sourceCoords.length; j++) { - const tile = sourceCache.getTile(sourceCoords[j]); - if (!tile || !tile.hasData()) continue; + if (painter.renderPass === 'translucent') { + const depthMode = new ref_properties.DepthMode(painter.context.gl.LEQUAL, ref_properties.DepthMode.ReadWrite, painter.depthRangeFor3D); - // Setup proxied -> proxy mapping only if image on given tile wrap intersects the proxy tile. - if (tileOutsideImage(proxyTileID, tile.tileID)) continue; + if (opacity === 1 && !layer.paint.get('fill-extrusion-pattern').constantOr((1 ))) { + const colorMode = painter.colorModeForRenderPass(); + drawExtrusionTiles(painter, source, layer, coords, depthMode, ref_properties.StencilMode.disabled, colorMode); - const id = this._createProxiedId(proxyTileID, tile, previousProxyToSource[proxyTileID.key] && previousProxyToSource[proxyTileID.key][sourceCache.id]); - const array = this.proxyToSource[proxyTileID.key][sourceCache.id]; - if (!array) { - this.proxyToSource[proxyTileID.key][sourceCache.id] = [id]; - } else { - array.push(id); - } - coords.push(id); - } - } - } + } else { + // Draw transparent buildings in two passes so that only the closest surface is drawn. + // First draw all the extrusions into only the depth buffer. No colors are drawn. + drawExtrusionTiles(painter, source, layer, coords, depthMode, + ref_properties.StencilMode.disabled, + ref_properties.ColorMode.disabled); - // recycle is previous pass content that likely contains proxied ID combining proxy and source tile. - _createProxiedId(proxyTileID , tile , recycle ) { - let matrix = this.orthoMatrix; - if (recycle) { - const recycled = recycle.find(proxied => (proxied.key === tile.tileID.key)); - if (recycled) return recycled; - } - if (tile.tileID.key !== proxyTileID.key) { - const scale = proxyTileID.canonical.z - tile.tileID.canonical.z; - matrix = transform.create(); - let size, xOffset, yOffset; - const wrap = (tile.tileID.wrap - proxyTileID.wrap) << proxyTileID.overscaledZ; - if (scale > 0) { - size = transform.EXTENT >> scale; - xOffset = size * ((tile.tileID.canonical.x << scale) - proxyTileID.canonical.x + wrap); - yOffset = size * ((tile.tileID.canonical.y << scale) - proxyTileID.canonical.y); - } else { - size = transform.EXTENT << -scale; - xOffset = transform.EXTENT * (tile.tileID.canonical.x - ((proxyTileID.canonical.x + wrap) << -scale)); - yOffset = transform.EXTENT * (tile.tileID.canonical.y - (proxyTileID.canonical.y << -scale)); - } - transform.ortho(matrix, 0, size, 0, size, 0, 1); - transform.translate(matrix, matrix, [xOffset, yOffset, 0]); + // Then draw all the extrusions a second type, only coloring fragments if they have the + // same depth value as the closest fragment in the previous pass. Use the stencil buffer + // to prevent the second draw in cases where we have coincident polygons. + drawExtrusionTiles(painter, source, layer, coords, depthMode, + painter.stencilModeFor3D(), + painter.colorModeForRenderPass()); + + painter.resetStencilClippingMasks(); } - return new ProxiedTileID(tile.tileID, proxyTileID.key, matrix); } +} - // A variant of SourceCache.findLoadedParent that considers only visible - // tiles (and doesn't check SourceCache._cache). Another difference is in - // caching "not found" results along the lookup, to leave the lookup early. - // Not found is cached by this._findCoveringTileCache[key] = null; - _findTileCoveringTileID(tileID , sourceCache ) { - let tile = sourceCache.getTile(tileID); - if (tile && tile.hasData()) return tile; +function drawExtrusionTiles(painter, source, layer, coords, depthMode, stencilMode, colorMode) { + const context = painter.context; + const gl = context.gl; + const tr = painter.transform; + const patternProperty = layer.paint.get('fill-extrusion-pattern'); + const image = patternProperty.constantOr((1 )); + const crossfade = layer.getCrossfadeParameters(); + const opacity = layer.paint.get('fill-extrusion-opacity'); + const heightLift = tr.projection.name === 'globe' ? ref_properties.fillExtrusionHeightLift() : 0; + const isGlobeProjection = tr.projection.name === 'globe'; + const globeToMercator = isGlobeProjection ? ref_properties.globeToMercatorTransition(tr.zoom) : 0.0; + const mercatorCenter = [ref_properties.mercatorXfromLng(tr.center.lng), ref_properties.mercatorYfromLat(tr.center.lat)]; + const baseDefines = ([] ); + if (isGlobeProjection) { + baseDefines.push('PROJECTION_GLOBE_VIEW'); + } - const lookup = this._findCoveringTileCache[sourceCache.id]; - const key = lookup[tileID.key]; - tile = key ? sourceCache.getTileByID(key) : null; - if ((tile && tile.hasData()) || key === null) return tile; + for (const coord of coords) { + const tile = source.getTile(coord); + const bucket = (tile.getBucket(layer) ); + if (!bucket || bucket.projection.name !== tr.projection.name) continue; - transform.assert_1(!key || tile); + const programConfiguration = bucket.programConfigurations.get(layer.id); + const program = painter.useProgram(image ? 'fillExtrusionPattern' : 'fillExtrusion', programConfiguration, baseDefines); - let sourceTileID = tile ? tile.tileID : tileID; - let z = sourceTileID.overscaledZ; - const minzoom = sourceCache.getSource().minzoom; - const path = []; - if (!key) { - const maxzoom = sourceCache.getSource().maxzoom; - if (tileID.canonical.z >= maxzoom) { - const downscale = tileID.canonical.z - maxzoom; - if (sourceCache.getSource().reparseOverscaled) { - z = Math.max(tileID.canonical.z + 2, sourceCache.transform.tileZoom); - sourceTileID = new transform.OverscaledTileID(z, tileID.wrap, maxzoom, - tileID.canonical.x >> downscale, tileID.canonical.y >> downscale); - } else if (downscale !== 0) { - z = maxzoom; - sourceTileID = new transform.OverscaledTileID(z, tileID.wrap, maxzoom, - tileID.canonical.x >> downscale, tileID.canonical.y >> downscale); + if (painter.terrain) { + const terrain = painter.terrain; + if (painter.style.terrainSetForDrapingOnly()) { + terrain.setupElevationDraw(tile, program, {useMeterToDem: true}); + } else { + if (!bucket.enableTerrain) continue; + terrain.setupElevationDraw(tile, program, {useMeterToDem: true}); + flatRoofsUpdate(context, source, coord, bucket, layer, terrain); + if (!bucket.centroidVertexBuffer) { + const attrIndex = program.attributes['a_centroid_pos']; + if (attrIndex !== undefined) gl.vertexAttrib2f(attrIndex, 0, 0); } } - if (sourceTileID.key !== tileID.key) { - path.push(sourceTileID.key); - tile = sourceCache.getTile(sourceTileID); - } } - const pathToLookup = (key) => { - path.forEach(id => { lookup[id] = key; }); - path.length = 0; - }; - - for (z = z - 1; z >= minzoom && !(tile && tile.hasData()); z--) { - if (tile) { - pathToLookup(tile.tileID.key); // Store lookup to parents not loaded (yet). - } - const id = sourceTileID.calculateScaledKey(z); - tile = sourceCache.getTileByID(id); - if (tile && tile.hasData()) break; - const key = lookup[id]; - if (key === null) { - break; // There's no tile loaded and no point searching further. - } else if (key !== undefined) { - tile = sourceCache.getTileByID(key); - transform.assert_1(tile); - continue; - } - path.push(id); + if (image) { + painter.context.activeTexture.set(gl.TEXTURE0); + tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + programConfiguration.updatePaintBuffers(crossfade); + } + const constantPattern = patternProperty.constantOr(null); + if (constantPattern && tile.imageAtlas) { + const atlas = tile.imageAtlas; + const posTo = atlas.patternPositions[constantPattern.to.toString()]; + const posFrom = atlas.patternPositions[constantPattern.from.toString()]; + if (posTo && posFrom) programConfiguration.setConstantPatternPositions(posTo, posFrom); } - pathToLookup(tile ? tile.tileID.key : null); - return tile && tile.hasData() ? tile : null; - } - - findDEMTileFor(tileID ) { - return this.enabled ? this._findTileCoveringTileID(tileID, this.sourceCache) : null; - } + const matrix = painter.translatePosMatrix( + coord.projMatrix, + tile, + layer.paint.get('fill-extrusion-translate'), + layer.paint.get('fill-extrusion-translate-anchor')); - /* - * Bookkeeping if something gets rendered to the tile. - */ - prepareDrawTile(coord ) { - this.renderedToTile = true; - } + const invMatrix = tr.projection.createInversionMatrix(tr, coord.canonical); - _clearRenderCacheForTile(source , coord ) { - let sourceTiles = this._tilesDirty[source]; - if (!sourceTiles) sourceTiles = this._tilesDirty[source] = {}; - sourceTiles[coord.key] = true; - } + const shouldUseVerticalGradient = layer.paint.get('fill-extrusion-vertical-gradient'); + const uniformValues = image ? + fillExtrusionPatternUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, coord, + crossfade, tile, heightLift, globeToMercator, mercatorCenter, invMatrix) : + fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, coord, + heightLift, globeToMercator, mercatorCenter, invMatrix); - /* - * Lazily instantiate the wireframe index buffer and segment vector so that we don't - * allocate the geometry for rendering a debug wireframe until it's needed. - */ - getWirefameBuffer() { - if (!this.wireframeSegments) { - const wireframeGridIndices = createWireframeGrid(GRID_DIM + 1); - this.wireframeIndexBuffer = this.painter.context.createIndexBuffer(wireframeGridIndices); - this.wireframeSegments = transform.SegmentVector.simpleSegment(0, 0, this.gridBuffer.length, wireframeGridIndices.length); - } - return [this.wireframeIndexBuffer, this.wireframeSegments]; - } + painter.prepareDrawProgram(context, program, coord.toUnwrapped()); -} + ref_properties.assert_1(!isGlobeProjection || bucket.layoutVertexExtBuffer); -function sortByDistanceToCamera(tileIDs, painter) { - const cameraCoordinate = painter.transform.pointCoordinate(painter.transform.getCameraPoint()); - const cameraPoint = new transform.pointGeometry(cameraCoordinate.x, cameraCoordinate.y); - tileIDs.sort((a, b) => { - if (b.overscaledZ - a.overscaledZ) return b.overscaledZ - a.overscaledZ; - const aPoint = new transform.pointGeometry(a.canonical.x + (1 << a.canonical.z) * a.wrap, a.canonical.y); - const bPoint = new transform.pointGeometry(b.canonical.x + (1 << b.canonical.z) * b.wrap, b.canonical.y); - const cameraScaled = cameraPoint.mult(1 << a.canonical.z); - cameraScaled.x -= 0.5; - cameraScaled.y -= 0.5; - return cameraScaled.distSqr(aPoint) - cameraScaled.distSqr(bPoint); - }); + program.draw(context, context.gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.backCCW, + uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, + bucket.segments, layer.paint, painter.transform.zoom, + programConfiguration, + painter.terrain ? bucket.centroidVertexBuffer : null, + isGlobeProjection ? bucket.layoutVertexExtBuffer : null); + } } -/** - * Creates uniform grid of triangles, covering EXTENT x EXTENT square, with two - * adjustent traigles forming a quad, so that there are |count| columns and rows - * of these quads in EXTENT x EXTENT square. - * e.g. for count of 2: - * ------------- - * | /| /| - * | / | / | - * |/ |/ | - * ------------- - * | /| /| - * | / | / | - * |/ |/ | - * ------------- - * @param {number} count Count of rows and columns - * @private - */ -function createGrid(count ) { - const boundsArray = new transform.StructArrayLayout4i8(); - // Around the grid, add one more row/column padding for "skirt". - const indexArray = new transform.StructArrayLayout3ui6(); - const size = count + 2; - boundsArray.reserve(size * size); - indexArray.reserve((size - 1) * (size - 1) * 2); - const step = transform.EXTENT / (count - 1); - const gridBound = transform.EXTENT + step / 2; - const bound = gridBound + step; +// Flat roofs array is prepared in the bucket, except for buildings that are on tile borders. +// For them, join pieces, calculate joined size here, and then upload data. +function flatRoofsUpdate(context, source, coord, bucket, layer, terrain) { + // For all four borders: 0 - left, 1, right, 2 - top, 3 - bottom + const neighborCoord = [ + coord => { + let x = coord.canonical.x - 1; + let w = coord.wrap; + if (x < 0) { + x = (1 << coord.canonical.z) - 1; + w--; + } + return new ref_properties.OverscaledTileID(coord.overscaledZ, w, coord.canonical.z, x, coord.canonical.y); + }, + coord => { + let x = coord.canonical.x + 1; + let w = coord.wrap; + if (x === 1 << coord.canonical.z) { + x = 0; + w++; + } + return new ref_properties.OverscaledTileID(coord.overscaledZ, w, coord.canonical.z, x, coord.canonical.y); + }, + coord => new ref_properties.OverscaledTileID(coord.overscaledZ, coord.wrap, coord.canonical.z, coord.canonical.x, + (coord.canonical.y === 0 ? 1 << coord.canonical.z : coord.canonical.y) - 1), + coord => new ref_properties.OverscaledTileID(coord.overscaledZ, coord.wrap, coord.canonical.z, coord.canonical.x, + coord.canonical.y === (1 << coord.canonical.z) - 1 ? 0 : coord.canonical.y + 1) + ]; - // Skirt offset of 0x5FFF is chosen randomly to encode boolean value (skirt - // on/off) with x position (max value EXTENT = 4096) to 16-bit signed integer. - const skirtOffset = 24575; // 0x5FFF - for (let y = -step; y < bound; y += step) { - for (let x = -step; x < bound; x += step) { - const offset = (x < 0 || x > gridBound || y < 0 || y > gridBound) ? skirtOffset : 0; - const xi = transform.clamp(Math.round(x), 0, transform.EXTENT); - const yi = transform.clamp(Math.round(y), 0, transform.EXTENT); - boundsArray.emplaceBack(xi + offset, yi, xi, yi); + const getLoadedBucket = (nid) => { + const minzoom = source.getSource().minzoom; + const getBucket = (key) => { + const n = source.getTileByID(key); + if (n && n.hasData()) { + return n.getBucket(layer); + } + }; + // Look one tile zoom above and under. We do this to avoid flickering and + // use the content in Z-1 and Z+1 buckets until Z bucket is loaded or handle + // behavior on borders between different zooms. + const zoomLevels = [0, -1, 1]; + for (const i of zoomLevels) { + const z = nid.overscaledZ + i; + if (z < minzoom) continue; + const key = nid.calculateScaledKey(nid.overscaledZ + i); + const b = getBucket(key); + if (b) { + return b; + } } - } + }; - // For cases when there's no need to render "skirt", the "inner" grid indices - // are followed by skirt indices. - const skirtIndicesOffset = (size - 3) * (size - 3) * 2; - const quad = (i, j) => { - const index = j * size + i; - indexArray.emplaceBack(index + 1, index, index + size); - indexArray.emplaceBack(index + size, index + size + 1, index + 1); + const projectedToBorder = [0, 0, 0]; // [min, max, maxOffsetFromBorder] + const xjoin = (a, b) => { + projectedToBorder[0] = Math.min(a.min.y, b.min.y); + projectedToBorder[1] = Math.max(a.max.y, b.max.y); + projectedToBorder[2] = ref_properties.EXTENT - b.min.x > a.max.x ? b.min.x - ref_properties.EXTENT : a.max.x; + return projectedToBorder; }; - for (let j = 1; j < size - 2; j++) { - for (let i = 1; i < size - 2; i++) { - quad(i, j); - } - } - // Padding (skirt) indices: - [0, size - 2].forEach(j => { - for (let i = 0; i < size - 1; i++) { - quad(i, j); - quad(j, i); + const yjoin = (a, b) => { + projectedToBorder[0] = Math.min(a.min.x, b.min.x); + projectedToBorder[1] = Math.max(a.max.x, b.max.x); + projectedToBorder[2] = ref_properties.EXTENT - b.min.y > a.max.y ? b.min.y - ref_properties.EXTENT : a.max.y; + return projectedToBorder; + }; + const projectCombinedSpanToBorder = [ + (a, b) => xjoin(a, b), + (a, b) => xjoin(b, a), + (a, b) => yjoin(a, b), + (a, b) => yjoin(b, a) + ]; + + const centroid = new ref_properties.pointGeometry(0, 0); + const error = 3; // Allow intrusion of a building to the building with adjacent wall. + + let demTile, neighborDEMTile, neighborTileID; + + const flatBase = (min, max, edge, verticalEdge, maxOffsetFromBorder) => { + const points = [[verticalEdge ? edge : min, verticalEdge ? min : edge, 0], [verticalEdge ? edge : max, verticalEdge ? max : edge, 0]]; + + const coord3 = maxOffsetFromBorder < 0 ? ref_properties.EXTENT + maxOffsetFromBorder : maxOffsetFromBorder; + const thirdPoint = [verticalEdge ? coord3 : (min + max) / 2, verticalEdge ? (min + max) / 2 : coord3, 0]; + if ((edge === 0 && maxOffsetFromBorder < 0) || (edge !== 0 && maxOffsetFromBorder > 0)) { + // Third point is inside neighbor tile, not in the |coord| tile. + terrain.getForTilePoints(neighborTileID, [thirdPoint], true, neighborDEMTile); + } else { + points.push(thirdPoint); } - }); - return [boundsArray, indexArray, skirtIndicesOffset]; -} + terrain.getForTilePoints(coord, points, true, demTile); + return Math.max(points[0][2], points[1][2], thirdPoint[2]) / terrain.exaggeration(); + }; -/** - * Creates a grid of indices corresponding to the grid constructed by createGrid - * in order to render that grid as a wireframe rather than a solid mesh. It does - * not create a skirt and so only goes from 1 to count + 1, e.g. for count of 2: - * ------------- - * | /| /| - * | / | / | - * |/ |/ | - * ------------- - * | /| /| - * | / | / | - * |/ |/ | - * ------------- - * @param {number} count Count of rows and columns - * @private - */ -function createWireframeGrid(count ) { - let i, j, index; - const indexArray = new transform.StructArrayLayout2ui4(); - const size = count + 2; - // Draw two edges of a quad and its diagonal. The very last row and column have - // an additional line to close off the grid. - for (j = 1; j < count; j++) { - for (i = 1; i < count; i++) { - index = j * size + i; - indexArray.emplaceBack(index, index + 1); - indexArray.emplaceBack(index, index + size); - indexArray.emplaceBack(index + 1, index + size); + // Process all four borders: get neighboring tile + for (let i = 0; i < 4; i++) { + // borders / borderDoneWithNeighborZ: 0 - left, 1, right, 2 - top, 3 - bottom + // bucket's border i is neighboring bucket's border j: + const j = (i < 2 ? 1 : 5) - i; + // Sort by border intersection area minimums, ascending. + const a = bucket.borders[i]; + if (a.length === 0) continue; + const nid = neighborTileID = neighborCoord[i](coord); + const nBucket = getLoadedBucket(nid); + if (!nBucket || !(nBucket instanceof ref_properties.FillExtrusionBucket) || !nBucket.enableTerrain) continue; + if (bucket.borderDoneWithNeighborZ[i] === nBucket.canonical.z && + nBucket.borderDoneWithNeighborZ[j] === bucket.canonical.z) { + continue; + } - // Place an extra line at the end of each row - if (j === count - 1) indexArray.emplaceBack(index + size, index + size + 1); + neighborDEMTile = terrain.findDEMTileFor(nid); + if (!neighborDEMTile || !neighborDEMTile.dem) continue; + if (!demTile) { + const dem = terrain.findDEMTileFor(coord); + if (!(dem && dem.dem)) return; // defer update until an elevation tile is available. + demTile = dem; } - // Place an extra line at the end of each col - indexArray.emplaceBack(index + 1, index + 1 + size); - } - return indexArray; -} + const b = nBucket.borders[j]; + let ib = 0; - - - - - - - - - - - - - - - - - - - - - + const updateNeighbor = nBucket.borderDoneWithNeighborZ[j] !== bucket.canonical.z; + // If neighbors are of different canonical z, we cannot join parts but show + // all without flat roofs. + if (bucket.canonical.z !== nBucket.canonical.z) { + for (const index of a) { + bucket.encodeCentroid(undefined, bucket.featuresOnBorder[index], false); + } + if (updateNeighbor) { + for (const index of b) { + nBucket.encodeCentroid(undefined, nBucket.featuresOnBorder[index], false); + } + nBucket.borderDoneWithNeighborZ[j] = bucket.canonical.z; + nBucket.needsCentroidUpdate = true; + } + bucket.borderDoneWithNeighborZ[i] = nBucket.canonical.z; + bucket.needsCentroidUpdate = true; + continue; + } -const terrainUniforms = (context , locations ) => ({ - 'u_dem': new transform.Uniform1i(context, locations.u_dem), - 'u_dem_prev': new transform.Uniform1i(context, locations.u_dem_prev), - 'u_dem_unpack': new transform.Uniform4f(context, locations.u_dem_unpack), - 'u_dem_tl': new transform.Uniform2f(context, locations.u_dem_tl), - 'u_dem_scale': new transform.Uniform1f(context, locations.u_dem_scale), - 'u_dem_tl_prev': new transform.Uniform2f(context, locations.u_dem_tl_prev), - 'u_dem_scale_prev': new transform.Uniform1f(context, locations.u_dem_scale_prev), - 'u_dem_size': new transform.Uniform1f(context, locations.u_dem_size), - 'u_dem_lerp': new transform.Uniform1f(context, locations.u_dem_lerp), - 'u_exaggeration': new transform.Uniform1f(context, locations.u_exaggeration), - 'u_depth': new transform.Uniform1i(context, locations.u_depth), - 'u_depth_size_inv': new transform.Uniform2f(context, locations.u_depth_size_inv), - 'u_meter_to_dem': new transform.Uniform1f(context, locations.u_meter_to_dem), - 'u_label_plane_matrix_inv': new transform.UniformMatrix4f(context, locations.u_label_plane_matrix_inv), - 'u_tile_tl_up': new transform.Uniform3f(context, locations.u_tile_tl_up), - 'u_tile_tr_up': new transform.Uniform3f(context, locations.u_tile_tr_up), - 'u_tile_br_up': new transform.Uniform3f(context, locations.u_tile_br_up), - 'u_tile_bl_up': new transform.Uniform3f(context, locations.u_tile_bl_up), - 'u_tile_up_scale': new transform.Uniform1f(context, locations.u_tile_up_scale) -}); + for (let ia = 0; ia < a.length; ia++) { + const parta = bucket.featuresOnBorder[a[ia]]; + const partABorderRange = parta.borders[i]; + // Find all nBucket parts that share the border overlap. + let partb; + while (ib < b.length) { + // Pass all that are before the overlap. + partb = nBucket.featuresOnBorder[b[ib]]; + const partBBorderRange = partb.borders[j]; + if (partBBorderRange[1] > partABorderRange[0] + error) break; + if (updateNeighbor) nBucket.encodeCentroid(undefined, partb, false); + ib++; + } + if (partb && ib < b.length) { + const saveIb = ib; + let count = 0; + while (true) { + // Collect all parts overlapping parta on the edge, to make sure it is only one. + const partBBorderRange = partb.borders[j]; + if (partBBorderRange[0] > partABorderRange[1] - error) break; + count++; + if (++ib === b.length) break; + partb = nBucket.featuresOnBorder[b[ib]]; + } + partb = nBucket.featuresOnBorder[b[saveIb]]; -function defaultTerrainUniforms(encoding ) { - return { - 'u_dem': 2, - 'u_dem_prev': 4, - 'u_dem_unpack': transform.DEMData.getUnpackVector(encoding), - 'u_dem_tl': [0, 0], - 'u_dem_tl_prev': [0, 0], - 'u_dem_scale': 0, - 'u_dem_scale_prev': 0, - 'u_dem_size': 0, - 'u_dem_lerp': 1.0, - 'u_depth': 3, - 'u_depth_size_inv': [0, 0], - 'u_exaggeration': 0, - 'u_tile_tl_up': [0, 0, 1], - 'u_tile_tr_up': [0, 0, 1], - 'u_tile_br_up': [0, 0, 1], - 'u_tile_bl_up': [0, 0, 1], - 'u_tile_up_scale': 1 - }; -} + // If any of a or b crosses more than one tile edge, don't support flat roof. + if (parta.intersectsCount() > 1 || partb.intersectsCount() > 1 || count !== 1) { + if (count !== 1) { + ib = saveIb; // rewind unprocessed ib so that it is processed again for the next ia. + } -// + bucket.encodeCentroid(undefined, parta, false); + if (updateNeighbor) nBucket.encodeCentroid(undefined, partb, false); + continue; + } - - - - - - + // Now we have 1-1 matching of parts in both tiles that share the edge. Calculate flat base elevation + // as average of three points: 2 are edge points (combined span projected to border) and one is point of + // span that has maximum offset to border. + const span = projectCombinedSpanToBorder[i](parta, partb); + const edge = (i % 2) ? ref_properties.EXTENT - 1 : 0; + centroid.x = flatBase(span[0], Math.min(ref_properties.EXTENT - 1, span[1]), edge, i < 2, span[2]); + centroid.y = 0; + ref_properties.assert_1(parta.vertexArrayOffset !== undefined && parta.vertexArrayOffset < bucket.layoutVertexArray.length); + bucket.encodeCentroid(centroid, parta, false); - + ref_properties.assert_1(partb.vertexArrayOffset !== undefined && partb.vertexArrayOffset < nBucket.layoutVertexArray.length); + if (updateNeighbor) nBucket.encodeCentroid(centroid, partb, false); + } else { + ref_properties.assert_1(parta.intersectsCount() > 1 || (partb && partb.intersectsCount() > 1)); // expected at the end of border, when buildings cover corner (show building w/o flat roof). + bucket.encodeCentroid(undefined, parta, false); + } + } -const fogUniforms = (context , locations ) => ({ - 'u_fog_matrix': new transform.UniformMatrix4f(context, locations.u_fog_matrix), - 'u_fog_range': new transform.Uniform2f(context, locations.u_fog_range), - 'u_fog_color': new transform.Uniform4f(context, locations.u_fog_color), - 'u_fog_horizon_blend': new transform.Uniform1f(context, locations.u_fog_horizon_blend), - 'u_fog_temporal_offset': new transform.Uniform1f(context, locations.u_fog_temporal_offset), -}); + bucket.borderDoneWithNeighborZ[i] = nBucket.canonical.z; + bucket.needsCentroidUpdate = true; + if (updateNeighbor) { + nBucket.borderDoneWithNeighborZ[j] = bucket.canonical.z; + nBucket.needsCentroidUpdate = true; + } + } -const fogUniformValues = ( - painter , - fog , - tileID , - fogOpacity -) => { - const fogColor = fog.properties.get('color'); - const temporalOffset = (painter.frameCounter / 1000.0) % 1; - const fogColorUnpremultiplied = [ - fogColor.r / fogColor.a, - fogColor.g / fogColor.a, - fogColor.b / fogColor.a, - fogOpacity - ]; - return { - 'u_fog_matrix': tileID ? painter.transform.calculateFogTileMatrix(tileID) : painter.identityMat, - 'u_fog_range': fog.getFovAdjustedRange(painter.transform._fov), - 'u_fog_color': fogColorUnpremultiplied, - 'u_fog_horizon_blend': fog.properties.get('horizon-blend'), - 'u_fog_temporal_offset': temporalOffset - }; -}; + if (bucket.needsCentroidUpdate || (!bucket.centroidVertexBuffer && bucket.centroidVertexArray.length !== 0)) { + bucket.uploadCentroid(context); + } +} // - - - - - - - - - - +function drawRaster(painter , sourceCache , layer , tileIDs , variableOffsets , isInitialLoad ) { + if (painter.renderPass !== 'translucent') return; + if (layer.paint.get('raster-opacity') === 0) return; + if (!tileIDs.length) return; - - - - + const context = painter.context; + const gl = context.gl; + const source = sourceCache.getSource(); + const program = painter.useProgram('raster'); -function getTokenizedAttributesAndUniforms (array ) { - const result = []; + const colorMode = painter.colorModeForRenderPass(); - for (let i = 0; i < array.length; i++) { - if (array[i] === null) continue; - const token = array[i].split(' '); - result.push(token.pop()); - } - return result; -} -class Program { - - - - - - - - + // When rendering to texture, coordinates are already sorted: primary by + // proxy id and secondary sort is by Z. + const renderingToTexture = painter.terrain && painter.terrain.renderingToTexture; - static cacheKey(name , defines , programConfiguration ) { - let key = `${name}${programConfiguration ? programConfiguration.cacheKey : ''}`; - for (const define of defines) { - key += `/${define}`; - } - return key; - } + const [stencilModes, coords] = source instanceof ImageSource || renderingToTexture ? [{}, tileIDs] : + painter.stencilConfigForOverlap(tileIDs); - constructor(context , - name , - source , - configuration , - fixedUniforms , - fixedDefines ) { - const gl = context.gl; - this.program = gl.createProgram(); + const minTileZ = coords[coords.length - 1].overscaledZ; - const staticAttrInfo = getTokenizedAttributesAndUniforms(source.staticAttributes); - const dynamicAttrInfo = configuration ? configuration.getBinderAttributes() : []; - const allAttrInfo = staticAttrInfo.concat(dynamicAttrInfo); + const align = !painter.options.moving; + for (const coord of coords) { + // 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. + const depthMode = renderingToTexture ? ref_properties.DepthMode.disabled : painter.depthModeForSublayer(coord.overscaledZ - minTileZ, + layer.paint.get('raster-opacity') === 1 ? ref_properties.DepthMode.ReadWrite : ref_properties.DepthMode.ReadOnly, gl.LESS); - const staticUniformsInfo = source.staticUniforms ? getTokenizedAttributesAndUniforms(source.staticUniforms) : []; - const dynamicUniformsInfo = configuration ? configuration.getBinderUniforms() : []; - // remove duplicate uniforms - const uniformList = staticUniformsInfo.concat(dynamicUniformsInfo); - const allUniformsInfo = []; - for (const uniform of uniformList) { - if (allUniformsInfo.indexOf(uniform) < 0) allUniformsInfo.push(uniform); - } + const unwrappedTileID = coord.toUnwrapped(); + const tile = sourceCache.getTile(coord); + if (renderingToTexture && !(tile && tile.hasData())) continue; - let defines = configuration ? configuration.defines() : []; - defines = defines.concat(fixedDefines.map((define) => `#define ${define}`)); + const projMatrix = (renderingToTexture) ? coord.projMatrix : + painter.transform.calculateProjMatrix(unwrappedTileID, align); - const fragmentSource = defines.concat( - preludeFragPrecisionQualifiers, - preludeCommonSource, - prelude.fragmentSource, - preludeFog.fragmentSource, - source.fragmentSource).join('\n'); - const vertexSource = defines.concat( - preludeVertPrecisionQualifiers, - preludeCommonSource, - prelude.vertexSource, - preludeFog.vertexSource, - preludeTerrain.vertexSource, - source.vertexSource).join('\n'); - const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); - if (gl.isContextLost()) { - this.failedToCreate = true; - return; - } - gl.shaderSource(fragmentShader, fragmentSource); - gl.compileShader(fragmentShader); - transform.assert_1(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(fragmentShader) )); - gl.attachShader(this.program, fragmentShader); + const stencilMode = painter.terrain && renderingToTexture ? + painter.terrain.stencilModeForRTTOverlap(coord) : + stencilModes[coord.overscaledZ]; - const vertexShader = gl.createShader(gl.VERTEX_SHADER); - if (gl.isContextLost()) { - this.failedToCreate = true; - return; - } - gl.shaderSource(vertexShader, vertexSource); - gl.compileShader(vertexShader); - transform.assert_1(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), (gl.getShaderInfoLog(vertexShader) )); - gl.attachShader(this.program, vertexShader); + const rasterFadeDuration = isInitialLoad ? 0 : layer.paint.get('raster-fade-duration'); + tile.registerFadeDuration(rasterFadeDuration); - this.attributes = {}; - const uniformLocations = {}; + const parentTile = sourceCache.findLoadedParent(coord, 0); + const fade = rasterFade(tile, parentTile, sourceCache, painter.transform, rasterFadeDuration); + if (painter.terrain) painter.terrain.prepareDrawTile(); - this.numAttributes = allAttrInfo.length; + let parentScaleBy, parentTL; - for (let i = 0; i < this.numAttributes; i++) { - if (allAttrInfo[i]) { - gl.bindAttribLocation(this.program, i, allAttrInfo[i]); - this.attributes[allAttrInfo[i]] = i; - } - } + const textureFilter = layer.paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR; - gl.linkProgram(this.program); - transform.assert_1(gl.getProgramParameter(this.program, gl.LINK_STATUS), (gl.getProgramInfoLog(this.program) )); + context.activeTexture.set(gl.TEXTURE0); + tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE); - gl.deleteShader(vertexShader); - gl.deleteShader(fragmentShader); + context.activeTexture.set(gl.TEXTURE1); - for (let it = 0; it < allUniformsInfo.length; it++) { - const uniform = allUniformsInfo[it]; - if (uniform && !uniformLocations[uniform]) { - const uniformLocation = gl.getUniformLocation(this.program, uniform); - if (uniformLocation) { - uniformLocations[uniform] = uniformLocation; - } - } - } + if (parentTile) { + parentTile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE); + parentScaleBy = Math.pow(2, parentTile.tileID.overscaledZ - tile.tileID.overscaledZ); + parentTL = [tile.tileID.canonical.x * parentScaleBy % 1, tile.tileID.canonical.y * parentScaleBy % 1]; - this.fixedUniforms = fixedUniforms(context, uniformLocations); - this.binderUniforms = configuration ? configuration.getUniforms(context, uniformLocations) : []; - if (fixedDefines.indexOf('TERRAIN') !== -1) { - this.terrainUniforms = terrainUniforms(context, uniformLocations); - } - if (fixedDefines.indexOf('FOG') !== -1) { - this.fogUniforms = fogUniforms(context, uniformLocations); + } else { + tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE); } - } - setTerrainUniformValues(context , terrainUniformValues ) { - if (!this.terrainUniforms) return; - const uniforms = this.terrainUniforms; + const perspectiveTransform = source instanceof ImageSource ? source.perspectiveTransform : [0, 0]; + const uniformValues = rasterUniformValues(projMatrix, parentTL || [0, 0], parentScaleBy || 1, fade, layer, perspectiveTransform); - if (this.failedToCreate) return; - context.program.set(this.program); + painter.prepareDrawProgram(context, program, unwrappedTileID); - for (const name in terrainUniformValues) { - uniforms[name].set(terrainUniformValues[name]); + if (source instanceof ImageSource) { + if (source.boundsBuffer && source.boundsSegments) program.draw( + context, gl.TRIANGLES, depthMode, ref_properties.StencilMode.disabled, colorMode, ref_properties.CullFaceMode.disabled, + uniformValues, layer.id, source.boundsBuffer, + painter.quadTriangleIndexBuffer, source.boundsSegments); + } else { + const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getTileBoundsBuffers(tile); + + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, + uniformValues, layer.id, tileBoundsBuffer, + tileBoundsIndexBuffer, tileBoundsSegments); } } - setFogUniformValues(context , fogUniformsValues ) { - if (!this.fogUniforms) return; - const uniforms = this.fogUniforms; + painter.resetStencilClippingMasks(); +} - if (this.failedToCreate) return; - context.program.set(this.program); +// - for (const name in fogUniformsValues) { - if (uniforms[name].location) { - uniforms[name].set(fogUniformsValues[name]); - } - } - } +function drawBackground(painter , sourceCache , layer , coords ) { + const color = layer.paint.get('background-color'); + const opacity = layer.paint.get('background-opacity'); - draw( - context , - drawMode , - depthMode , - stencilMode , - colorMode , - cullFaceMode , - uniformValues , - layerID , - layoutVertexBuffer , - indexBuffer , - segments , - currentProperties , - zoom , - configuration , - dynamicLayoutBuffer , - dynamicLayoutBuffer2 ) { + if (opacity === 0) return; - const gl = context.gl; + const context = painter.context; + const gl = context.gl; + const transform = painter.transform; + const tileSize = transform.tileSize; + const image = layer.paint.get('background-pattern'); + if (painter.isPatternMissing(image)) return; - if (this.failedToCreate) return; + const pass = (!image && color.a === 1 && opacity === 1 && painter.opaquePassEnabledForLayer()) ? 'opaque' : 'translucent'; + if (painter.renderPass !== pass) return; - context.program.set(this.program); - context.setDepthMode(depthMode); - context.setStencilMode(stencilMode); - context.setColorMode(colorMode); - context.setCullFace(cullFaceMode); + const stencilMode = ref_properties.StencilMode.disabled; + const depthMode = painter.depthModeForSublayer(0, pass === 'opaque' ? ref_properties.DepthMode.ReadWrite : ref_properties.DepthMode.ReadOnly); + const colorMode = painter.colorModeForRenderPass(); - for (const name of Object.keys(this.fixedUniforms)) { - this.fixedUniforms[name].set(uniformValues[name]); - } + const program = painter.useProgram(image ? 'backgroundPattern' : 'background'); - if (configuration) { - configuration.setUniforms(context, this.binderUniforms, currentProperties, {zoom: (zoom )}); - } + let tileIDs = coords; + let backgroundTiles; + if (!tileIDs) { + backgroundTiles = painter.getBackgroundTiles(); + tileIDs = Object.values(backgroundTiles).map(tile => (tile ).tileID); + } - const primitiveSize = { - [gl.LINES]: 2, - [gl.TRIANGLES]: 3, - [gl.LINE_STRIP]: 1 - }[drawMode]; + if (image) { + context.activeTexture.set(gl.TEXTURE0); + painter.imageManager.bind(painter.context); + } - for (const segment of segments.get()) { - const vaos = segment.vaos || (segment.vaos = {}); - const vao = vaos[layerID] || (vaos[layerID] = new VertexArrayObject()); + const crossfade = layer.getCrossfadeParameters(); + for (const tileID of tileIDs) { + const unwrappedTileID = tileID.toUnwrapped(); + const matrix = coords ? tileID.projMatrix : painter.transform.calculateProjMatrix(unwrappedTileID); + painter.prepareDrawTile(); - vao.bind( - context, - this, - layoutVertexBuffer, - configuration ? configuration.getPaintVertexBuffers() : [], - indexBuffer, - segment.vertexOffset, - dynamicLayoutBuffer, - dynamicLayoutBuffer2 - ); + const tile = sourceCache ? sourceCache.getTile(tileID) : + backgroundTiles ? backgroundTiles[tileID.key] : new ref_properties.Tile(tileID, tileSize, transform.zoom, painter); - gl.drawElements( - drawMode, - segment.primitiveLength * primitiveSize, - gl.UNSIGNED_SHORT, - segment.primitiveOffset * primitiveSize * 2); - } + const uniformValues = image ? + backgroundPatternUniformValues(matrix, opacity, painter, image, {tileID, tileSize}, crossfade) : + backgroundUniformValues(matrix, opacity, color); + + painter.prepareDrawProgram(context, program, unwrappedTileID); + + const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getTileBoundsBuffers(tile); + + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, + uniformValues, layer.id, tileBoundsBuffer, + tileBoundsIndexBuffer, tileBoundsSegments); } } // - - - - - - - +const topColor = new ref_properties.Color(1, 0, 0, 1); +const btmColor = new ref_properties.Color(0, 1, 0, 1); +const leftColor = new ref_properties.Color(0, 0, 1, 1); +const rightColor = new ref_properties.Color(1, 0, 1, 1); +const centerColor = new ref_properties.Color(0, 1, 1, 1); - - - - - - - - - - - - - - - - +function drawDebugPadding(painter ) { + const padding = painter.transform.padding; + const lineWidth = 3; + // Top + drawHorizontalLine(painter, painter.transform.height - (padding.top || 0), lineWidth, topColor); + // Bottom + drawHorizontalLine(painter, padding.bottom || 0, lineWidth, btmColor); + // Left + drawVerticalLine(painter, padding.left || 0, lineWidth, leftColor); + // Right + drawVerticalLine(painter, painter.transform.width - (padding.right || 0), lineWidth, rightColor); + // Center + const center = painter.transform.centerPoint; + drawCrosshair(painter, center.x, painter.transform.height - center.y, centerColor); +} - - - - - - - - - +function drawDebugQueryGeometry(painter , sourceCache , coords ) { + for (let i = 0; i < coords.length; i++) { + drawTileQueryGeometry(painter, sourceCache, coords[i]); + } +} -function patternUniformValues(crossfade , painter , - tile -) { +function drawCrosshair(painter , x , y , color ) { + const size = 20; + const lineWidth = 2; + //Vertical line + drawDebugSSRect(painter, x - lineWidth / 2, y - size / 2, lineWidth, size, color); + //Horizontal line + drawDebugSSRect(painter, x - size / 2, y - lineWidth / 2, size, lineWidth, color); +} - const tileRatio = 1 / transform.pixelsToTileUnits(tile, 1, painter.transform.tileZoom); +function drawHorizontalLine(painter , y , lineWidth , color ) { + drawDebugSSRect(painter, 0, y + lineWidth / 2, painter.transform.width, lineWidth, color); +} - const numTiles = Math.pow(2, tile.tileID.overscaledZ); - const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; +function drawVerticalLine(painter , x , lineWidth , color ) { + drawDebugSSRect(painter, x - lineWidth / 2, 0, lineWidth, painter.transform.height, color); +} - const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); - const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; +function drawDebugSSRect(painter , x , y , width , height , color ) { + const context = painter.context; + const gl = context.gl; - return { - 'u_image': 0, - 'u_texsize': tile.imageAtlasTexture.size, - 'u_scale': [tileRatio, crossfade.fromScale, crossfade.toScale], - 'u_fade': crossfade.t, - // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision. - 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16], - 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF] - }; + gl.enable(gl.SCISSOR_TEST); + gl.scissor(x * ref_properties.exported.devicePixelRatio, y * ref_properties.exported.devicePixelRatio, width * ref_properties.exported.devicePixelRatio, height * ref_properties.exported.devicePixelRatio); + context.clear({color}); + gl.disable(gl.SCISSOR_TEST); } -function bgPatternUniformValues(image , crossfade , painter , - tile -) { - const imagePosA = painter.imageManager.getPattern(image.from.toString()); - const imagePosB = painter.imageManager.getPattern(image.to.toString()); - transform.assert_1(imagePosA && imagePosB); - const {width, height} = painter.imageManager.getPixelSize(); +function drawDebug(painter , sourceCache , coords ) { + for (let i = 0; i < coords.length; i++) { + drawDebugTile(painter, sourceCache, coords[i]); + } +} - const numTiles = Math.pow(2, tile.tileID.overscaledZ); - const tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; +function drawTileQueryGeometry(painter, sourceCache, coord ) { + const context = painter.context; + const gl = context.gl; - const pixelX = tileSizeAtNearestZoom * (tile.tileID.canonical.x + tile.tileID.wrap * numTiles); - const pixelY = tileSizeAtNearestZoom * tile.tileID.canonical.y; + const posMatrix = coord.projMatrix; + const program = painter.useProgram('debug'); + const tile = sourceCache.getTileByID(coord.key); + if (painter.terrain) painter.terrain.setupElevationDraw(tile, program); - return { - 'u_image': 0, - 'u_pattern_tl_a': (imagePosA ).tl, - 'u_pattern_br_a': (imagePosA ).br, - 'u_pattern_tl_b': (imagePosB ).tl, - 'u_pattern_br_b': (imagePosB ).br, - 'u_texsize': [width, height], - 'u_mix': crossfade.t, - 'u_pattern_size_a': (imagePosA ).displaySize, - 'u_pattern_size_b': (imagePosB ).displaySize, - 'u_scale_a': crossfade.fromScale, - 'u_scale_b': crossfade.toScale, - 'u_tile_units_to_pixels': 1 / transform.pixelsToTileUnits(tile, 1, painter.transform.tileZoom), - // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision. - 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16], - 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF] - }; -} + const depthMode = ref_properties.DepthMode.disabled; + const stencilMode = ref_properties.StencilMode.disabled; + const colorMode = painter.colorModeForRenderPass(); + const id = '$debug'; -// + context.activeTexture.set(gl.TEXTURE0); + // Bind the empty texture for drawing outlines + painter.emptyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - - - - - - + const queryViz = tile.queryGeometryDebugViz; + const boundsViz = tile.queryBoundsDebugViz; - - - - - - - - + if (queryViz && queryViz.vertices.length > 0) { + queryViz.lazyUpload(context); + const vertexBuffer = queryViz.vertexBuffer; + const indexBuffer = queryViz.indexBuffer; + const segments = queryViz.segments; + if (vertexBuffer != null && indexBuffer != null && segments != null) { + program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, + debugUniformValues(posMatrix, queryViz.color), id, + vertexBuffer, indexBuffer, segments); + } + } - - - - - - - - - - - - - - - - + if (boundsViz && boundsViz.vertices.length > 0) { + boundsViz.lazyUpload(context); + const vertexBuffer = boundsViz.vertexBuffer; + const indexBuffer = boundsViz.indexBuffer; + const segments = boundsViz.segments; + if (vertexBuffer != null && indexBuffer != null && segments != null) { + program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, + debugUniformValues(posMatrix, boundsViz.color), id, + vertexBuffer, indexBuffer, segments); + } + } +} -const fillExtrusionUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_lightpos': new transform.Uniform3f(context, locations.u_lightpos), - 'u_lightintensity': new transform.Uniform1f(context, locations.u_lightintensity), - 'u_lightcolor': new transform.Uniform3f(context, locations.u_lightcolor), - 'u_vertical_gradient': new transform.Uniform1f(context, locations.u_vertical_gradient), - 'u_opacity': new transform.Uniform1f(context, locations.u_opacity) -}); +function drawDebugTile(painter, sourceCache, coord ) { + const context = painter.context; + const gl = context.gl; -const fillExtrusionPatternUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_lightpos': new transform.Uniform3f(context, locations.u_lightpos), - 'u_lightintensity': new transform.Uniform1f(context, locations.u_lightintensity), - 'u_lightcolor': new transform.Uniform3f(context, locations.u_lightcolor), - 'u_vertical_gradient': new transform.Uniform1f(context, locations.u_vertical_gradient), - 'u_height_factor': new transform.Uniform1f(context, locations.u_height_factor), - // pattern uniforms - 'u_image': new transform.Uniform1i(context, locations.u_image), - 'u_texsize': new transform.Uniform2f(context, locations.u_texsize), - 'u_pixel_coord_upper': new transform.Uniform2f(context, locations.u_pixel_coord_upper), - 'u_pixel_coord_lower': new transform.Uniform2f(context, locations.u_pixel_coord_lower), - 'u_scale': new transform.Uniform3f(context, locations.u_scale), - 'u_fade': new transform.Uniform1f(context, locations.u_fade), - 'u_opacity': new transform.Uniform1f(context, locations.u_opacity) -}); + const isGlobeProjection = painter.transform.projection.name === 'globe'; + const definesValues = isGlobeProjection ? ['PROJECTION_GLOBE_VIEW'] : null; -const fillExtrusionUniformValues = ( - matrix , - painter , - shouldUseVerticalGradient , - opacity -) => { - const light = painter.style.light; - const _lp = light.properties.get('position'); - const lightPos = [_lp.x, _lp.y, _lp.z]; - const lightMat = transform.create$1(); - const anchor = light.properties.get('anchor'); - if (anchor === 'viewport') { - transform.fromRotation(lightMat, -painter.transform.angle); - transform.transformMat3(lightPos, lightPos, lightMat); + const posMatrix = coord.projMatrix; + const program = painter.useProgram('debug', null, definesValues); + const tile = sourceCache.getTileByID(coord.key); + if (painter.terrain) painter.terrain.setupElevationDraw(tile, program); + + const depthMode = ref_properties.DepthMode.disabled; + const stencilMode = ref_properties.StencilMode.disabled; + const colorMode = painter.colorModeForRenderPass(); + const id = '$debug'; + + context.activeTexture.set(gl.TEXTURE0); + // Bind the empty texture for drawing outlines + painter.emptyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + + if (isGlobeProjection) { + tile._makeGlobeTileDebugBuffers(painter.context, painter.transform.projection); + } else { + tile._makeDebugTileBoundsBuffers(painter.context, painter.transform.projection); } - const lightColor = light.properties.get('color'); + const debugBuffer = tile._tileDebugBuffer || painter.debugBuffer; + const debugIndexBuffer = tile._tileDebugIndexBuffer || painter.debugIndexBuffer; + const debugSegments = tile._tileDebugSegments || painter.debugSegments; - return { - 'u_matrix': matrix, - 'u_lightpos': lightPos, - 'u_lightintensity': light.properties.get('intensity'), - 'u_lightcolor': [lightColor.r, lightColor.g, lightColor.b], - 'u_vertical_gradient': +shouldUseVerticalGradient, - 'u_opacity': opacity - }; -}; + program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, ref_properties.CullFaceMode.disabled, + debugUniformValues(posMatrix, ref_properties.Color.red), id, + debugBuffer, debugIndexBuffer, debugSegments, + null, null, null, tile._globeTileDebugBorderBuffer); -const fillExtrusionPatternUniformValues = ( - matrix , - painter , - shouldUseVerticalGradient , - opacity , - coord , - crossfade , - tile -) => { - return transform.extend(fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity), - patternUniformValues(crossfade, painter, tile), - { - 'u_height_factor': -Math.pow(2, coord.overscaledZ) / tile.tileSize / 8 - }); -}; + const tileRawData = tile.latestRawTileData; + const tileByteLength = (tileRawData && tileRawData.byteLength) || 0; + const tileSizeKb = Math.floor(tileByteLength / 1024); + const tileSize = sourceCache.getTile(coord).tileSize; + const scaleRatio = (512 / Math.min(tileSize, 512) * (coord.overscaledZ / painter.transform.zoom)) * 0.5; + let tileIdText = coord.canonical.toString(); + if (coord.overscaledZ !== coord.canonical.z) { + tileIdText += ` => ${coord.overscaledZ}`; + } + const tileLabel = `${tileIdText} ${tileSizeKb}kb`; + drawTextToOverlay(painter, tileLabel); -// + const debugTextBuffer = tile._tileDebugTextBuffer || painter.debugBuffer; + const debugTextIndexBuffer = tile._tileDebugTextIndexBuffer || painter.quadTriangleIndexBuffer; + const debugTextSegments = tile._tileDebugTextSegments || painter.debugSegments; - - - - - + program.draw(context, gl.TRIANGLES, depthMode, stencilMode, ref_properties.ColorMode.alphaBlended, ref_properties.CullFaceMode.disabled, + debugUniformValues(posMatrix, ref_properties.Color.transparent, scaleRatio), id, + debugTextBuffer, debugTextIndexBuffer, debugTextSegments, + null, null, null, tile._globeTileDebugTextBuffer); +} - - - +function drawTextToOverlay(painter , text ) { + painter.initDebugOverlayCanvas(); + const canvas = painter.debugOverlayCanvas; + const gl = painter.context.gl; + const ctx2d = painter.debugOverlayCanvas.getContext('2d'); + ctx2d.clearRect(0, 0, canvas.width, canvas.height); - - - - + ctx2d.shadowColor = 'white'; + ctx2d.shadowBlur = 2; + ctx2d.lineWidth = 1.5; + ctx2d.strokeStyle = 'white'; + ctx2d.textBaseline = 'top'; + ctx2d.font = `bold ${36}px Open Sans, sans-serif`; + ctx2d.fillText(text, 5, 5); + ctx2d.strokeText(text, 5, 5); - - - - - - - - - - + painter.debugOverlayTexture.update(canvas); + painter.debugOverlayTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); +} - - - - - - - - - - - +// -const fillUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix) -}); + + + -const fillPatternUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_image': new transform.Uniform1i(context, locations.u_image), - 'u_texsize': new transform.Uniform2f(context, locations.u_texsize), - 'u_pixel_coord_upper': new transform.Uniform2f(context, locations.u_pixel_coord_upper), - 'u_pixel_coord_lower': new transform.Uniform2f(context, locations.u_pixel_coord_lower), - 'u_scale': new transform.Uniform3f(context, locations.u_scale), - 'u_fade': new transform.Uniform1f(context, locations.u_fade) +function drawCustom(painter , sourceCache , layer ) { -}); + const context = painter.context; + const implementation = layer.implementation; -const fillOutlineUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_world': new transform.Uniform2f(context, locations.u_world) -}); + if (painter.transform.projection.unsupportedLayers && painter.transform.projection.unsupportedLayers.includes("custom")) { + ref_properties.warnOnce('Custom layers are not yet supported with non-mercator projections. Use mercator to enable custom layers.'); + return; + } -const fillOutlinePatternUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_world': new transform.Uniform2f(context, locations.u_world), - 'u_image': new transform.Uniform1i(context, locations.u_image), - 'u_texsize': new transform.Uniform2f(context, locations.u_texsize), - 'u_pixel_coord_upper': new transform.Uniform2f(context, locations.u_pixel_coord_upper), - 'u_pixel_coord_lower': new transform.Uniform2f(context, locations.u_pixel_coord_lower), - 'u_scale': new transform.Uniform3f(context, locations.u_scale), - 'u_fade': new transform.Uniform1f(context, locations.u_fade) -}); + if (painter.renderPass === 'offscreen') { -const fillUniformValues = (matrix ) => ({ - 'u_matrix': matrix -}); + const prerender = implementation.prerender; + if (prerender) { + painter.setCustomLayerDefaults(); + context.setColorMode(painter.colorModeForRenderPass()); -const fillPatternUniformValues = ( - matrix , - painter , - crossfade , - tile -) => transform.extend( - fillUniformValues(matrix), - patternUniformValues(crossfade, painter, tile) -); + prerender.call(implementation, context.gl, painter.transform.customLayerMatrix()); -const fillOutlineUniformValues = ( - matrix , - drawingBufferSize -) => ({ - 'u_matrix': matrix, - 'u_world': drawingBufferSize -}); + context.setDirty(); + painter.setBaseState(); + } -const fillOutlinePatternUniformValues = ( - matrix , - painter , - crossfade , - tile , - drawingBufferSize -) => transform.extend( - fillPatternUniformValues(matrix, painter, crossfade, tile), - { - 'u_world': drawingBufferSize - } -); + } else if (painter.renderPass === 'translucent') { -// + painter.setCustomLayerDefaults(); - - - - - - + context.setColorMode(painter.colorModeForRenderPass()); + context.setStencilMode(ref_properties.StencilMode.disabled); - + const depthMode = implementation.renderingMode === '3d' ? + new ref_properties.DepthMode(painter.context.gl.LEQUAL, ref_properties.DepthMode.ReadWrite, painter.depthRangeFor3D) : + painter.depthModeForSublayer(0, ref_properties.DepthMode.ReadOnly); -const circleUniforms = (context , locations ) => ({ - 'u_camera_to_center_distance': new transform.Uniform1f(context, locations.u_camera_to_center_distance), - 'u_extrude_scale': new transform.UniformMatrix2f(context, locations.u_extrude_scale), - 'u_device_pixel_ratio': new transform.Uniform1f(context, locations.u_device_pixel_ratio), - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix) -}); + context.setDepthMode(depthMode); -const circleUniformValues = ( - painter , - coord , - tile , - layer -) => { - const transform$1 = painter.transform; + implementation.render(context.gl, painter.transform.customLayerMatrix()); - let extrudeScale; - if (layer.paint.get('circle-pitch-alignment') === 'map') { - extrudeScale = transform$1.calculatePixelsToTileUnitsMatrix(tile); - } else { - extrudeScale = new Float32Array([ - transform$1.pixelsToGLUnits[0], - 0, - 0, - transform$1.pixelsToGLUnits[1]]); + context.setDirty(); + painter.setBaseState(); + context.bindFramebuffer.set(null); } +} - return { - 'u_camera_to_center_distance': transform$1.cameraToCenterDistance, - 'u_matrix': painter.translatePosMatrix( - coord.projMatrix, - tile, - layer.paint.get('circle-translate'), - layer.paint.get('circle-translate-anchor')), - 'u_device_pixel_ratio': transform.exported.devicePixelRatio, - 'u_extrude_scale': extrudeScale - }; -}; +// -const circleDefinesValues = (layer ) => { - const values = []; - if (layer.paint.get('circle-pitch-alignment') === 'map') values.push('PITCH_WITH_MAP'); - if (layer.paint.get('circle-pitch-scale') === 'map') values.push('SCALE_WITH_MAP'); + - return values; -}; +const skyboxAttributes = ref_properties.createLayout([ + {name: 'a_pos_3f', components: 3, type: 'Float32'} +]); +const {members, size, alignment} = skyboxAttributes; // - - - - + + + - - - - - +function addVertex(vertexArray, x, y, z) { + vertexArray.emplaceBack( + // a_pos + x, + y, + z + ); +} - - - - +class SkyboxGeometry { + + - + + -const collisionUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_camera_to_center_distance': new transform.Uniform1f(context, locations.u_camera_to_center_distance), - 'u_extrude_scale': new transform.Uniform2f(context, locations.u_extrude_scale) -}); + constructor(context ) { + this.vertexArray = new ref_properties.StructArrayLayout3f12(); + this.indices = new ref_properties.StructArrayLayout3ui6(); -const collisionCircleUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_inv_matrix': new transform.UniformMatrix4f(context, locations.u_inv_matrix), - 'u_camera_to_center_distance': new transform.Uniform1f(context, locations.u_camera_to_center_distance), - 'u_viewport_size': new transform.Uniform2f(context, locations.u_viewport_size) -}); + addVertex(this.vertexArray, -1.0, -1.0, 1.0); + addVertex(this.vertexArray, 1.0, -1.0, 1.0); + addVertex(this.vertexArray, -1.0, 1.0, 1.0); + addVertex(this.vertexArray, 1.0, 1.0, 1.0); + addVertex(this.vertexArray, -1.0, -1.0, -1.0); + addVertex(this.vertexArray, 1.0, -1.0, -1.0); + addVertex(this.vertexArray, -1.0, 1.0, -1.0); + addVertex(this.vertexArray, 1.0, 1.0, -1.0); -const collisionUniformValues = ( - matrix , - transform$1 , - tile -) => { - const pixelRatio = transform.EXTENT / tile.tileSize; + // +x + this.indices.emplaceBack(5, 1, 3); + this.indices.emplaceBack(3, 7, 5); + // -x + this.indices.emplaceBack(6, 2, 0); + this.indices.emplaceBack(0, 4, 6); + // +y + this.indices.emplaceBack(2, 6, 7); + this.indices.emplaceBack(7, 3, 2); + // -y + this.indices.emplaceBack(5, 4, 0); + this.indices.emplaceBack(0, 1, 5); + // +z + this.indices.emplaceBack(0, 2, 3); + this.indices.emplaceBack(3, 1, 0); + // -z + this.indices.emplaceBack(7, 6, 4); + this.indices.emplaceBack(4, 5, 7); - return { - 'u_matrix': matrix, - 'u_camera_to_center_distance': transform$1.cameraToCenterDistance, - 'u_extrude_scale': [transform$1.pixelsToGLUnits[0] / pixelRatio, - transform$1.pixelsToGLUnits[1] / pixelRatio] - }; -}; + this.vertexBuffer = context.createVertexBuffer(this.vertexArray, members); + this.indexBuffer = context.createIndexBuffer(this.indices); -const collisionCircleUniformValues = ( - matrix , - invMatrix , - transform -) => { - return { - 'u_matrix': matrix, - 'u_inv_matrix': invMatrix, - 'u_camera_to_center_distance': transform.cameraToCenterDistance, - 'u_viewport_size': [transform.width, transform.height] - }; -}; + this.segment = ref_properties.SegmentVector.simpleSegment(0, 0, 36, 12); + } +} // - - - +const TRANSITION_OPACITY_ZOOM_START = 7; +const TRANSITION_OPACITY_ZOOM_END = 8; - - - - - - +function drawSky(painter , sourceCache , layer ) { + const tr = painter.transform; + const globeOrMercator = (tr.projection.name === 'mercator' || tr.projection.name === 'globe'); + // For non-mercator projection, use a forced opacity transition. This transition is set to be + // 1.0 after the sheer adjustment upper bound which ensures to be in the mercator projection. + // Note: we only render sky for globe projection during the transition to mercator. + const transitionOpacity = globeOrMercator ? 1.0 : ref_properties.smoothstep(TRANSITION_OPACITY_ZOOM_START, TRANSITION_OPACITY_ZOOM_END, tr.zoom); + const opacity = layer.paint.get('sky-opacity') * transitionOpacity; + if (opacity === 0) { + return; + } -const debugUniforms = (context , locations ) => ({ - 'u_color': new transform.UniformColor(context, locations.u_color), - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_overlay': new transform.Uniform1i(context, locations.u_overlay), - 'u_overlay_scale': new transform.Uniform1f(context, locations.u_overlay_scale), -}); + const context = painter.context; + const type = layer.paint.get('sky-type'); + const depthMode = new ref_properties.DepthMode(context.gl.LEQUAL, ref_properties.DepthMode.ReadOnly, [0, 1]); + const temporalOffset = (painter.frameCounter / 1000.0) % 1; -const debugUniformValues = (matrix , color , scaleRatio = 1) => ({ - 'u_matrix': matrix, - 'u_color': color, - 'u_overlay': 0, - 'u_overlay_scale': scaleRatio -}); + if (type === 'atmosphere') { + if (painter.renderPass === 'offscreen') { + if (layer.needsSkyboxCapture(painter)) { + captureSkybox(painter, layer, 32, 32); + layer.markSkyboxValid(painter); + } + } else if (painter.renderPass === 'sky') { + drawSkyboxFromCapture(painter, layer, depthMode, opacity, temporalOffset); + } + } else if (type === 'gradient') { + if (painter.renderPass === 'sky') { + drawSkyboxGradient(painter, layer, depthMode, opacity, temporalOffset); + } + } else { + ref_properties.assert_1(false, `${type} is unsupported sky-type`); + } +} -// +function drawSkyboxGradient(painter , layer , depthMode , opacity , temporalOffset ) { + const context = painter.context; + const gl = context.gl; + const transform = painter.transform; + const program = painter.useProgram('skyboxGradient'); - - - - - + // Lazily initialize geometry and texture if they havent been created yet. + if (!layer.skyboxGeometry) { + layer.skyboxGeometry = new SkyboxGeometry(context); + } + context.activeTexture.set(gl.TEXTURE0); + let colorRampTexture = layer.colorRampTexture; + if (!colorRampTexture) { + colorRampTexture = layer.colorRampTexture = new ref_properties.Texture(context, layer.colorRamp, gl.RGBA); + } + colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + const uniformValues = skyboxGradientUniformValues( + transform.skyboxMatrix, + layer.getCenter(painter, false), + layer.paint.get('sky-gradient-radius'), + opacity, + temporalOffset + ); - - - - - + painter.prepareDrawProgram(context, program); - - - - - + program.draw(context, gl.TRIANGLES, depthMode, ref_properties.StencilMode.disabled, + painter.colorModeForRenderPass(), ref_properties.CullFaceMode.backCW, + uniformValues, 'skyboxGradient', layer.skyboxGeometry.vertexBuffer, + layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment); +} -const heatmapUniforms = (context , locations ) => ({ - 'u_extrude_scale': new transform.Uniform1f(context, locations.u_extrude_scale), - 'u_intensity': new transform.Uniform1f(context, locations.u_intensity), - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix) -}); +function drawSkyboxFromCapture(painter , layer , depthMode , opacity , temporalOffset ) { + const context = painter.context; + const gl = context.gl; + const transform = painter.transform; + const program = painter.useProgram('skybox'); -const heatmapTextureUniforms = (context , locations ) => ({ - 'u_image': new transform.Uniform1i(context, locations.u_image), - 'u_color_ramp': new transform.Uniform1i(context, locations.u_color_ramp), - 'u_opacity': new transform.Uniform1f(context, locations.u_opacity) -}); + context.activeTexture.set(gl.TEXTURE0); -const heatmapUniformValues = ( - matrix , - tile , - zoom , - intensity -) => ({ - 'u_matrix': matrix, - 'u_extrude_scale': transform.pixelsToTileUnits(tile, 1, zoom), - 'u_intensity': intensity -}); + gl.bindTexture(gl.TEXTURE_CUBE_MAP, layer.skyboxTexture); -const heatmapTextureUniformValues = ( - painter , - layer , - textureUnit , - colorRampUnit -) => { - return { - 'u_image': textureUnit, - 'u_color_ramp': colorRampUnit, - 'u_opacity': layer.paint.get('heatmap-opacity') - }; -}; + const uniformValues = skyboxUniformValues(transform.skyboxMatrix, layer.getCenter(painter, false), 0, opacity, temporalOffset); -// + painter.prepareDrawProgram(context, program); - - - - - - - + program.draw(context, gl.TRIANGLES, depthMode, ref_properties.StencilMode.disabled, + painter.colorModeForRenderPass(), ref_properties.CullFaceMode.backCW, + uniformValues, 'skybox', layer.skyboxGeometry.vertexBuffer, + layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment); +} - - - - - - - - - - - - - +function drawSkyboxFace(context , layer , program , faceRotate , sunDirection , i ) { + const gl = context.gl; - - - - - - - - - - - + const atmosphereColor = layer.paint.get('sky-atmosphere-color'); + const atmosphereHaloColor = layer.paint.get('sky-atmosphere-halo-color'); + const sunIntensity = layer.paint.get('sky-atmosphere-sun-intensity'); - + const uniformValues = skyboxCaptureUniformValues( + ref_properties.fromMat4(ref_properties.create$1(), faceRotate), + sunDirection, + sunIntensity, + atmosphereColor, + atmosphereHaloColor); -const lineUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_pixels_to_tile_units': new transform.UniformMatrix2f(context, locations.u_pixels_to_tile_units), - 'u_device_pixel_ratio': new transform.Uniform1f(context, locations.u_device_pixel_ratio), - 'u_units_to_pixels': new transform.Uniform2f(context, locations.u_units_to_pixels), - 'u_dash_image': new transform.Uniform1i(context, locations.u_dash_image), - 'u_gradient_image': new transform.Uniform1i(context, locations.u_gradient_image), - 'u_image_height': new transform.Uniform1f(context, locations.u_image_height), - 'u_texsize': new transform.Uniform2f(context, locations.u_texsize), - 'u_scale': new transform.Uniform3f(context, locations.u_scale), - 'u_mix': new transform.Uniform1f(context, locations.u_mix), - 'u_alpha_discard_threshold': new transform.Uniform1f(context, locations.u_alpha_discard_threshold) -}); + const glFace = gl.TEXTURE_CUBE_MAP_POSITIVE_X + i; + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, glFace, layer.skyboxTexture, 0); -const linePatternUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_texsize': new transform.Uniform2f(context, locations.u_texsize), - 'u_pixels_to_tile_units': new transform.UniformMatrix2f(context, locations.u_pixels_to_tile_units), - 'u_device_pixel_ratio': new transform.Uniform1f(context, locations.u_device_pixel_ratio), - 'u_image': new transform.Uniform1i(context, locations.u_image), - 'u_units_to_pixels': new transform.Uniform2f(context, locations.u_units_to_pixels), - 'u_scale': new transform.Uniform3f(context, locations.u_scale), - 'u_fade': new transform.Uniform1f(context, locations.u_fade), - 'u_alpha_discard_threshold': new transform.Uniform1f(context, locations.u_alpha_discard_threshold) -}); + program.draw(context, gl.TRIANGLES, ref_properties.DepthMode.disabled, ref_properties.StencilMode.disabled, ref_properties.ColorMode.unblended, ref_properties.CullFaceMode.frontCW, + uniformValues, 'skyboxCapture', layer.skyboxGeometry.vertexBuffer, + layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment); +} -const lineUniformValues = ( - painter , - tile , - layer , - crossfade , - matrix , - imageHeight -) => { - const transform$1 = painter.transform; - const pixelsToTileUnits = transform$1.calculatePixelsToTileUnitsMatrix(tile); +function captureSkybox(painter , layer , width , height ) { + const context = painter.context; + const gl = context.gl; + let fbo = layer.skyboxFbo; - const values = { - 'u_matrix': calculateMatrix(painter, tile, layer, matrix), - 'u_pixels_to_tile_units': pixelsToTileUnits, - 'u_device_pixel_ratio': transform.exported.devicePixelRatio, - 'u_units_to_pixels': [ - 1 / transform$1.pixelsToGLUnits[0], - 1 / transform$1.pixelsToGLUnits[1] - ], - 'u_dash_image': 0, - 'u_gradient_image': 1, - 'u_image_height': imageHeight, - 'u_texsize': [0, 0], - 'u_scale': [0, 0, 0], - 'u_mix': 0, - 'u_alpha_discard_threshold': 0.0 - }; - if (hasDash(layer)) { - const tileZoomRatio = calculateTileRatio(tile, painter.transform); - values['u_texsize'] = tile.lineAtlasTexture.size; - values['u_scale'] = [tileZoomRatio, crossfade.fromScale, crossfade.toScale]; - values['u_mix'] = crossfade.t; + // Using absence of fbo as a signal for lazy initialization of all resources, cache resources in layer object + if (!fbo) { + fbo = layer.skyboxFbo = context.createFramebuffer(width, height, false); + layer.skyboxGeometry = new SkyboxGeometry(context); + layer.skyboxTexture = context.gl.createTexture(); + + gl.bindTexture(gl.TEXTURE_CUBE_MAP, layer.skyboxTexture); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + + for (let i = 0; i < 6; ++i) { + const glFace = gl.TEXTURE_CUBE_MAP_POSITIVE_X + i; + + // The format here could be RGB, but render tests are not happy with rendering to such a format + gl.texImage2D(glFace, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + } } - return values; -}; -const linePatternUniformValues = ( - painter , - tile , - layer , - crossfade , - matrix -) => { - const transform$1 = painter.transform; - const tileZoomRatio = calculateTileRatio(tile, transform$1); - return { - 'u_matrix': calculateMatrix(painter, tile, layer, matrix), - 'u_texsize': tile.imageAtlasTexture.size, - // camera zoom ratio - 'u_pixels_to_tile_units': transform$1.calculatePixelsToTileUnitsMatrix(tile), - 'u_device_pixel_ratio': transform.exported.devicePixelRatio, - 'u_image': 0, - 'u_scale': [tileZoomRatio, crossfade.fromScale, crossfade.toScale], - 'u_fade': crossfade.t, - 'u_units_to_pixels': [ - 1 / transform$1.pixelsToGLUnits[0], - 1 / transform$1.pixelsToGLUnits[1] - ], - 'u_alpha_discard_threshold': 0.0 - }; -}; + context.bindFramebuffer.set(fbo.framebuffer); + context.viewport.set([0, 0, width, height]); + + const sunDirection = layer.getCenter(painter, true); + const program = painter.useProgram('skyboxCapture'); + const faceRotate = new Float64Array(16); + + // +x; + ref_properties.identity(faceRotate); + ref_properties.rotateY(faceRotate, faceRotate, -Math.PI * 0.5); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 0); + // -x + ref_properties.identity(faceRotate); + ref_properties.rotateY(faceRotate, faceRotate, Math.PI * 0.5); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 1); + // +y + ref_properties.identity(faceRotate); + ref_properties.rotateX(faceRotate, faceRotate, -Math.PI * 0.5); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 2); + // -y + ref_properties.identity(faceRotate); + ref_properties.rotateX(faceRotate, faceRotate, Math.PI * 0.5); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 3); + // +z + ref_properties.identity(faceRotate); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 4); + // -z + ref_properties.identity(faceRotate); + ref_properties.rotateY(faceRotate, faceRotate, Math.PI); + drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 5); -function calculateTileRatio(tile , transform$1 ) { - return 1 / transform.pixelsToTileUnits(tile, 1, transform$1.tileZoom); + context.viewport.set([0, 0, painter.width, painter.height]); } -function calculateMatrix(painter, tile, layer, matrix) { - return painter.translatePosMatrix( - matrix ? matrix : tile.tileID.projMatrix, - tile, - layer.paint.get('line-translate'), - layer.paint.get('line-translate-anchor') - ); -} +// -const lineDefinesValues = (layer ) => { - const values = []; - if (hasDash(layer)) values.push('RENDER_LINE_DASH'); - if (layer.paint.get('line-gradient')) values.push('RENDER_LINE_GRADIENT'); +function drawAtmosphere(painter , fog ) { + const context = painter.context; + const gl = context.gl; + const tr = painter.transform; + const depthMode = new ref_properties.DepthMode(gl.LEQUAL, ref_properties.DepthMode.ReadOnly, [0, 1]); + const defines = tr.projection.name === 'globe' ? ['PROJECTION_GLOBE_VIEW', 'FOG'] : ['FOG']; + const program = painter.useProgram('globeAtmosphere', null, ((defines ) )); - const hasPattern = layer.paint.get('line-pattern').constantOr((1 )); - const hasOpacity = layer.paint.get('line-opacity').constantOr(1.0) !== 1.0; - if (!hasPattern && hasOpacity) { - values.push('RENDER_LINE_ALPHA_DISCARD'); - } - return values; -}; + const transitionT = ref_properties.globeToMercatorTransition(tr.zoom); -function hasDash(layer) { - const dashPropertyValue = layer.paint.get('line-dasharray').value; - return dashPropertyValue.value || dashPropertyValue.kind !== "constant"; + const fogColor = fog.properties.get('color').toArray01(); + const highColor = fog.properties.get('high-color').toArray01(); + const spaceColor = fog.properties.get('space-color').toArray01PremultipliedAlpha(); + + const orientation = ref_properties.identity$1([]); + + ref_properties.rotateY$1(orientation, orientation, -ref_properties.degToRad(tr._center.lng)); + ref_properties.rotateX$1(orientation, orientation, ref_properties.degToRad(tr._center.lat)); + + ref_properties.rotateZ$1(orientation, orientation, tr.angle); + ref_properties.rotateX$1(orientation, orientation, -tr._pitch); + + const rotationMatrix = ref_properties.fromQuat(new Float32Array(16), orientation); + + const starIntensity = ref_properties.mapValue(fog.properties.get('star-intensity'), 0.0, 1.0, 0.0, 0.25); + // https://www.desmos.com/calculator/oanvvpr36d + // Ensure horizon blend is 0-exclusive to prevent division by 0 in the shader + const minHorizonBlend = 0.0005; + const horizonBlend = ref_properties.mapValue(fog.properties.get('horizon-blend'), 0.0, 1.0, minHorizonBlend, 0.25); + + // Use a slightly smaller size of the globe to account for custom + // antialiasing that reduces the size of the globe of two pixels + // https://www.desmos.com/calculator/xpgmzghc37 + const globeRadius = ref_properties.globeUseCustomAntiAliasing(painter, context, tr) && horizonBlend === minHorizonBlend ? + tr.worldSize / (2.0 * Math.PI * 1.025) - 1.0 : tr.globeRadius; + + const temporalOffset = (painter.frameCounter / 1000.0) % 1; + const globeCenterInViewSpace = (((tr.globeCenterInViewSpace) ) ); + const globeCenterDistance = ref_properties.length(globeCenterInViewSpace); + const distanceToHorizon = Math.sqrt(Math.pow(globeCenterDistance, 2.0) - Math.pow(globeRadius, 2.0)); + const horizonAngle = Math.acos(distanceToHorizon / globeCenterDistance); + + const uniforms = atmosphereUniformValues( + tr.frustumCorners.TL, + tr.frustumCorners.TR, + tr.frustumCorners.BR, + tr.frustumCorners.BL, + tr.frustumCorners.horizon, + transitionT, + horizonBlend, + fogColor, + highColor, + spaceColor, + starIntensity, + temporalOffset, + horizonAngle, + rotationMatrix); + + painter.prepareDrawProgram(context, program); + + const buffer = painter.atmosphereBuffer; + if (buffer) { + program.draw(context, gl.TRIANGLES, depthMode, ref_properties.StencilMode.disabled, + ref_properties.ColorMode.alphaBlended, ref_properties.CullFaceMode.backCW, uniforms, "skybox", + buffer.vertexBuffer, buffer.indexBuffer, buffer.segments); + } } // - - - + - - - - - - - - - - - - - - - +const atmosphereLayout = ref_properties.createLayout([ + {type: 'Float32', name: 'a_pos', components: 3}, + {type: 'Float32', name: 'a_uv', components: 2} +]); -const rasterUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_tl_parent': new transform.Uniform2f(context, locations.u_tl_parent), - 'u_scale_parent': new transform.Uniform1f(context, locations.u_scale_parent), - 'u_fade_t': new transform.Uniform1f(context, locations.u_fade_t), - 'u_opacity': new transform.Uniform1f(context, locations.u_opacity), - 'u_image0': new transform.Uniform1i(context, locations.u_image0), - 'u_image1': new transform.Uniform1i(context, locations.u_image1), - 'u_brightness_low': new transform.Uniform1f(context, locations.u_brightness_low), - 'u_brightness_high': new transform.Uniform1f(context, locations.u_brightness_high), - 'u_saturation_factor': new transform.Uniform1f(context, locations.u_saturation_factor), - 'u_contrast_factor': new transform.Uniform1f(context, locations.u_contrast_factor), - 'u_spin_weights': new transform.Uniform3f(context, locations.u_spin_weights), - 'u_perspective_transform': new transform.Uniform2f(context, locations.u_perspective_transform) -}); +// -const rasterUniformValues = ( - matrix , - parentTL , - parentScaleBy , - fade , - layer , - perspectiveTransform -) => ({ - 'u_matrix': matrix, - 'u_tl_parent': parentTL, - 'u_scale_parent': parentScaleBy, - 'u_fade_t': fade.mix, - 'u_opacity': fade.opacity * layer.paint.get('raster-opacity'), - 'u_image0': 0, - 'u_image1': 1, - 'u_brightness_low': layer.paint.get('raster-brightness-min'), - 'u_brightness_high': layer.paint.get('raster-brightness-max'), - 'u_saturation_factor': saturationFactor(layer.paint.get('raster-saturation')), - 'u_contrast_factor': contrastFactor(layer.paint.get('raster-contrast')), - 'u_spin_weights': spinWeights(layer.paint.get('raster-hue-rotate')), - 'u_perspective_transform': perspectiveTransform -}); +class AtmosphereBuffer { + + + -function spinWeights(angle) { - angle *= Math.PI / 180; - const s = Math.sin(angle); - const c = Math.cos(angle); - return [ - (2 * c + 1) / 3, - (-Math.sqrt(3) * s - c + 1) / 3, - (Math.sqrt(3) * s - c + 1) / 3 - ]; -} + constructor(context ) { + const vertices = new ref_properties.StructArrayLayout5f20(); + vertices.emplaceBack(-1, 1, 1, 0, 0); + vertices.emplaceBack(1, 1, 1, 1, 0); + vertices.emplaceBack(1, -1, 1, 1, 1); + vertices.emplaceBack(-1, -1, 1, 0, 1); -function contrastFactor(contrast) { - return contrast > 0 ? - 1 / (1 - contrast) : - 1 + contrast; -} + const triangles = new ref_properties.StructArrayLayout3ui6(); + triangles.emplaceBack(0, 1, 2); + triangles.emplaceBack(2, 3, 0); -function saturationFactor(saturation) { - return saturation > 0 ? - 1 - 1 / (1.001 - saturation) : - -saturation; + this.vertexBuffer = context.createVertexBuffer(vertices, atmosphereLayout.members); + this.indexBuffer = context.createIndexBuffer(triangles); + this.segments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 2); + } + + destroy() { + this.vertexBuffer.destroy(); + this.indexBuffer.destroy(); + this.segments.destroy(); + } } // - - - +const draw = { + symbol: drawSymbols, + circle: drawCircles, + heatmap: drawHeatmap, + line: drawLine, + fill: drawFill, + 'fill-extrusion': draw$1, + hillshade: drawHillshade, + raster: drawRaster, + background: drawBackground, + sky: drawSky, + debug: drawDebug, + custom: drawCustom +}; - - - - - + + + + + - + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + - - - - + + + + + +/** + * Initialize a new painter object. + * + * @param {Canvas} gl an experimental-webgl drawing context + * @private + */ +class Painter { + + + + + + + + + + + + + + - - - - + + + + + + - - - - - - - - - - + + + - - - - - - - - - + + - - + + + + + + + + - - - + + - - + + + - - - - - - - - + - + constructor(gl , transform ) { + this.context = new ref_properties.Context(gl); + this.transform = transform; + this._tileTextures = {}; + this.frameCopies = []; + this.loadTimeStamps = []; -const symbolIconUniforms = (context , locations ) => ({ - 'u_is_size_zoom_constant': new transform.Uniform1i(context, locations.u_is_size_zoom_constant), - 'u_is_size_feature_constant': new transform.Uniform1i(context, locations.u_is_size_feature_constant), - 'u_size_t': new transform.Uniform1f(context, locations.u_size_t), - 'u_size': new transform.Uniform1f(context, locations.u_size), - 'u_camera_to_center_distance': new transform.Uniform1f(context, locations.u_camera_to_center_distance), - 'u_pitch': new transform.Uniform1f(context, locations.u_pitch), - 'u_rotate_symbol': new transform.Uniform1i(context, locations.u_rotate_symbol), - 'u_aspect_ratio': new transform.Uniform1f(context, locations.u_aspect_ratio), - 'u_fade_change': new transform.Uniform1f(context, locations.u_fade_change), - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_label_plane_matrix': new transform.UniformMatrix4f(context, locations.u_label_plane_matrix), - 'u_coord_matrix': new transform.UniformMatrix4f(context, locations.u_coord_matrix), - 'u_is_text': new transform.Uniform1i(context, locations.u_is_text), - 'u_pitch_with_map': new transform.Uniform1i(context, locations.u_pitch_with_map), - 'u_texsize': new transform.Uniform2f(context, locations.u_texsize), - 'u_tile_id': new transform.Uniform3f(context, locations.u_tile_id), - 'u_zoom_transition': new transform.Uniform1f(context, locations.u_zoom_transition), - 'u_inv_rot_matrix': new transform.UniformMatrix4f(context, locations.u_inv_rot_matrix), - 'u_merc_center': new transform.Uniform2f(context, locations.u_merc_center), - 'u_texture': new transform.Uniform1i(context, locations.u_texture) -}); + this.setup(); -const symbolSDFUniforms = (context , locations ) => ({ - 'u_is_size_zoom_constant': new transform.Uniform1i(context, locations.u_is_size_zoom_constant), - 'u_is_size_feature_constant': new transform.Uniform1i(context, locations.u_is_size_feature_constant), - 'u_size_t': new transform.Uniform1f(context, locations.u_size_t), - 'u_size': new transform.Uniform1f(context, locations.u_size), - 'u_camera_to_center_distance': new transform.Uniform1f(context, locations.u_camera_to_center_distance), - 'u_pitch': new transform.Uniform1f(context, locations.u_pitch), - 'u_rotate_symbol': new transform.Uniform1i(context, locations.u_rotate_symbol), - 'u_aspect_ratio': new transform.Uniform1f(context, locations.u_aspect_ratio), - 'u_fade_change': new transform.Uniform1f(context, locations.u_fade_change), - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_label_plane_matrix': new transform.UniformMatrix4f(context, locations.u_label_plane_matrix), - 'u_coord_matrix': new transform.UniformMatrix4f(context, locations.u_coord_matrix), - 'u_is_text': new transform.Uniform1i(context, locations.u_is_text), - 'u_pitch_with_map': new transform.Uniform1i(context, locations.u_pitch_with_map), - 'u_texsize': new transform.Uniform2f(context, locations.u_texsize), - 'u_texture': new transform.Uniform1i(context, locations.u_texture), - 'u_gamma_scale': new transform.Uniform1f(context, locations.u_gamma_scale), - 'u_device_pixel_ratio': new transform.Uniform1f(context, locations.u_device_pixel_ratio), - 'u_tile_id': new transform.Uniform3f(context, locations.u_tile_id), - 'u_zoom_transition': new transform.Uniform1f(context, locations.u_zoom_transition), - 'u_inv_rot_matrix': new transform.UniformMatrix4f(context, locations.u_inv_rot_matrix), - 'u_merc_center': new transform.Uniform2f(context, locations.u_merc_center), - 'u_is_halo': new transform.Uniform1i(context, locations.u_is_halo) -}); + // Within each layer there are multiple distinct z-planes that can be drawn to. + // This is implemented using the WebGL depth buffer. + this.numSublayers = ref_properties.SourceCache.maxUnderzooming + ref_properties.SourceCache.maxOverzooming + 1; + this.depthEpsilon = 1 / Math.pow(2, 16); -const symbolTextAndIconUniforms = (context , locations ) => ({ - 'u_is_size_zoom_constant': new transform.Uniform1i(context, locations.u_is_size_zoom_constant), - 'u_is_size_feature_constant': new transform.Uniform1i(context, locations.u_is_size_feature_constant), - 'u_size_t': new transform.Uniform1f(context, locations.u_size_t), - 'u_size': new transform.Uniform1f(context, locations.u_size), - 'u_camera_to_center_distance': new transform.Uniform1f(context, locations.u_camera_to_center_distance), - 'u_pitch': new transform.Uniform1f(context, locations.u_pitch), - 'u_rotate_symbol': new transform.Uniform1i(context, locations.u_rotate_symbol), - 'u_aspect_ratio': new transform.Uniform1f(context, locations.u_aspect_ratio), - 'u_fade_change': new transform.Uniform1f(context, locations.u_fade_change), - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_label_plane_matrix': new transform.UniformMatrix4f(context, locations.u_label_plane_matrix), - 'u_coord_matrix': new transform.UniformMatrix4f(context, locations.u_coord_matrix), - 'u_is_text': new transform.Uniform1i(context, locations.u_is_text), - 'u_pitch_with_map': new transform.Uniform1i(context, locations.u_pitch_with_map), - 'u_texsize': new transform.Uniform2f(context, locations.u_texsize), - 'u_texsize_icon': new transform.Uniform2f(context, locations.u_texsize_icon), - 'u_texture': new transform.Uniform1i(context, locations.u_texture), - 'u_texture_icon': new transform.Uniform1i(context, locations.u_texture_icon), - 'u_gamma_scale': new transform.Uniform1f(context, locations.u_gamma_scale), - 'u_device_pixel_ratio': new transform.Uniform1f(context, locations.u_device_pixel_ratio), - 'u_is_halo': new transform.Uniform1i(context, locations.u_is_halo) -}); + this.crossTileSymbolIndex = new CrossTileSymbolIndex(); -const symbolIconUniformValues = ( - functionType , - size , - rotateInShader , - pitchWithMap , - painter , - matrix , - labelPlaneMatrix , - glCoordMatrix , - isText , - texSize , - tileID , - zoomTransition , - invRotMatrix , - mercCenter -) => { - const transform = painter.transform; + this.deferredRenderGpuTimeQueries = []; + this.gpuTimers = {}; + this.frameCounter = 0; + this._backgroundTiles = {}; + } - return { - 'u_is_size_zoom_constant': +(functionType === 'constant' || functionType === 'source'), - 'u_is_size_feature_constant': +(functionType === 'constant' || functionType === 'camera'), - 'u_size_t': size ? size.uSizeT : 0, - 'u_size': size ? size.uSize : 0, - 'u_camera_to_center_distance': transform.cameraToCenterDistance, - 'u_pitch': transform.pitch / 360 * 2 * Math.PI, - 'u_rotate_symbol': +rotateInShader, - 'u_aspect_ratio': transform.width / transform.height, - 'u_fade_change': painter.options.fadeDuration ? painter.symbolFadeChange : 1, - 'u_matrix': matrix, - 'u_label_plane_matrix': labelPlaneMatrix, - 'u_coord_matrix': glCoordMatrix, - 'u_is_text': +isText, - 'u_pitch_with_map': +pitchWithMap, - 'u_texsize': texSize, - 'u_tile_id': tileID, - 'u_zoom_transition': zoomTransition, - 'u_inv_rot_matrix': invRotMatrix, - 'u_merc_center': mercCenter, - 'u_texture': 0 - }; -}; + updateTerrain(style , cameraChanging ) { + const enabled = !!style && !!style.terrain && this.transform.projection.supportsTerrain; + if (!enabled && (!this._terrain || !this._terrain.enabled)) return; + if (!this._terrain) { + this._terrain = new Terrain(this, style); + } + const terrain = this._terrain; + this.transform.elevation = enabled ? terrain : null; + terrain.update(style, this.transform, cameraChanging); + } -const symbolSDFUniformValues = ( - functionType , - size , - rotateInShader , - pitchWithMap , - painter , - matrix , - labelPlaneMatrix , - glCoordMatrix , - isText , - texSize , - isHalo , - tileID , - zoomTransition , - invRotMatrix , - mercCenter -) => { - const {cameraToCenterDistance, _pitch} = painter.transform; - - return transform.extend(symbolIconUniformValues(functionType, size, - rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, - glCoordMatrix, isText, texSize, tileID, zoomTransition, - invRotMatrix, mercCenter), { - 'u_gamma_scale': pitchWithMap ? cameraToCenterDistance * Math.cos(painter.terrain ? 0 : _pitch) : 1, - 'u_device_pixel_ratio': transform.exported.devicePixelRatio, - 'u_is_halo': +isHalo - }); -}; + _updateFog(style ) { + // Globe makes use of thin fog overlay with a fixed fog range, + // so we can skip updating fog tile culling for this projection + const isGlobe = this.transform.projection.name === 'globe'; -const symbolTextAndIconUniformValues = ( - functionType , - size , - rotateInShader , - pitchWithMap , - painter , - matrix , - labelPlaneMatrix , - glCoordMatrix , - texSizeSDF , - texSizeIcon , - tileID , - zoomTransition , - invRotMatrix , - mercCenter -) => { - return transform.extend(symbolSDFUniformValues(functionType, size, - rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, - glCoordMatrix, true, texSizeSDF, true, tileID, zoomTransition, - invRotMatrix, mercCenter), { - 'u_texsize_icon': texSizeIcon, - 'u_texture_icon': 1 - }); -}; + const fog = style.fog; + if (!fog || isGlobe || fog.getOpacity(this.transform.pitch) < 1 || fog.properties.get('horizon-blend') < 0.03) { + this.transform.fogCullDistSq = null; + return; + } -// + // We start culling where the fog opacity function hits + // 98% which leaves a non-noticeable change threshold. + const [start, end] = fog.getFovAdjustedRange(this.transform._fov); - - - - - - - - + if (start > end) { + this.transform.fogCullDistSq = null; + return; + } - - - - - + const fogBoundFraction = 0.78; + const fogCullDist = start + (end - start) * fogBoundFraction; - - - - - - - - - - - - - - - - - - - + this.transform.fogCullDistSq = fogCullDist * fogCullDist; + } + + get terrain() { + return this.transform._terrainEnabled() && this._terrain && this._terrain.enabled ? this._terrain : null; + } + + /* + * Update the GL viewport, projection matrix, and transforms to compensate + * for a new width and height value. + */ + resize(width , height ) { + this.width = width * ref_properties.exported.devicePixelRatio; + this.height = height * ref_properties.exported.devicePixelRatio; + this.context.viewport.set([0, 0, this.width, this.height]); + + if (this.style) { + for (const layerId of this.style.order) { + this.style._layers[layerId].resize(); + } + } + } + + setup() { + const context = this.context; + + const tileExtentArray = new ref_properties.StructArrayLayout2i4(); + tileExtentArray.emplaceBack(0, 0); + tileExtentArray.emplaceBack(ref_properties.EXTENT, 0); + tileExtentArray.emplaceBack(0, ref_properties.EXTENT); + tileExtentArray.emplaceBack(ref_properties.EXTENT, ref_properties.EXTENT); + this.tileExtentBuffer = context.createVertexBuffer(tileExtentArray, ref_properties.posAttributes.members); + this.tileExtentSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 2); + + const debugArray = new ref_properties.StructArrayLayout2i4(); + debugArray.emplaceBack(0, 0); + debugArray.emplaceBack(ref_properties.EXTENT, 0); + debugArray.emplaceBack(0, ref_properties.EXTENT); + debugArray.emplaceBack(ref_properties.EXTENT, ref_properties.EXTENT); + this.debugBuffer = context.createVertexBuffer(debugArray, ref_properties.posAttributes.members); + this.debugSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 5); + + const viewportArray = new ref_properties.StructArrayLayout2i4(); + viewportArray.emplaceBack(-1, -1); + viewportArray.emplaceBack(1, -1); + viewportArray.emplaceBack(-1, 1); + viewportArray.emplaceBack(1, 1); + this.viewportBuffer = context.createVertexBuffer(viewportArray, ref_properties.posAttributes.members); + this.viewportSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 2); + + const tileBoundsArray = new ref_properties.StructArrayLayout4i8(); + tileBoundsArray.emplaceBack(0, 0, 0, 0); + tileBoundsArray.emplaceBack(ref_properties.EXTENT, 0, ref_properties.EXTENT, 0); + tileBoundsArray.emplaceBack(0, ref_properties.EXTENT, 0, ref_properties.EXTENT); + tileBoundsArray.emplaceBack(ref_properties.EXTENT, ref_properties.EXTENT, ref_properties.EXTENT, ref_properties.EXTENT); + this.mercatorBoundsBuffer = context.createVertexBuffer(tileBoundsArray, ref_properties.boundsAttributes.members); + this.mercatorBoundsSegments = ref_properties.SegmentVector.simpleSegment(0, 0, 4, 2); + + const quadTriangleIndices = new ref_properties.StructArrayLayout3ui6(); + quadTriangleIndices.emplaceBack(0, 1, 2); + quadTriangleIndices.emplaceBack(2, 1, 3); + this.quadTriangleIndexBuffer = context.createIndexBuffer(quadTriangleIndices); + + const tileLineStripIndices = new ref_properties.StructArrayLayout1ui2(); + for (const i of [0, 1, 3, 2, 0]) tileLineStripIndices.emplaceBack(i); + this.debugIndexBuffer = context.createIndexBuffer(tileLineStripIndices); + + this.emptyTexture = new ref_properties.Texture(context, + new ref_properties.RGBAImage({width: 1, height: 1}, Uint8Array.of(0, 0, 0, 0)), context.gl.RGBA); + + this.identityMat = ref_properties.create(); + + const gl = this.context.gl; + this.stencilClearMode = new ref_properties.StencilMode({func: gl.ALWAYS, mask: 0}, 0x0, 0xFF, gl.ZERO, gl.ZERO, gl.ZERO); + this.loadTimeStamps.push(ref_properties.window.performance.now()); + + this.atmosphereBuffer = new AtmosphereBuffer(this.context); + } + + getMercatorTileBoundsBuffers() { + return { + tileBoundsBuffer: this.mercatorBoundsBuffer, + tileBoundsIndexBuffer: this.quadTriangleIndexBuffer, + tileBoundsSegments: this.mercatorBoundsSegments + }; + } + + getTileBoundsBuffers(tile ) { + tile._makeTileBoundsBuffers(this.context, this.transform.projection); + if (tile._tileBoundsBuffer) { + const tileBoundsBuffer = tile._tileBoundsBuffer; + const tileBoundsIndexBuffer = tile._tileBoundsIndexBuffer; + const tileBoundsSegments = tile._tileBoundsSegments; + return {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments}; + } else { + return this.getMercatorTileBoundsBuffers(); + } + } + + /* + * 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. + */ + clearStencil() { + const context = this.context; + const gl = context.gl; + + this.nextStencilID = 1; + this.currentStencilSource = undefined; + this._tileClippingMaskIDs = {}; + + // 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 }) + this.useProgram('clippingMask').draw(context, gl.TRIANGLES, + ref_properties.DepthMode.disabled, this.stencilClearMode, ref_properties.ColorMode.disabled, ref_properties.CullFaceMode.disabled, + clippingMaskUniformValues(this.identityMat), + '$clipping', this.viewportBuffer, + this.quadTriangleIndexBuffer, this.viewportSegments); + } + + resetStencilClippingMasks() { + if (!this.terrain) { + this.currentStencilSource = undefined; + this._tileClippingMaskIDs = {}; + } + } + + _renderTileClippingMasks(layer , sourceCache , tileIDs ) { + if (!sourceCache || this.currentStencilSource === sourceCache.id || !layer.isTileClipped() || !tileIDs || tileIDs.length === 0) { + return; + } + + if (this._tileClippingMaskIDs && !this.terrain) { + let dirtyStencilClippingMasks = false; + // Equivalent tile set is already rendered in stencil + for (const coord of tileIDs) { + if (this._tileClippingMaskIDs[coord.key] === undefined) { + dirtyStencilClippingMasks = true; + break; + } + } + if (!dirtyStencilClippingMasks) { + return; + } + } -const backgroundUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_opacity': new transform.Uniform1f(context, locations.u_opacity), - 'u_color': new transform.UniformColor(context, locations.u_color) -}); + this.currentStencilSource = sourceCache.id; -const backgroundPatternUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_opacity': new transform.Uniform1f(context, locations.u_opacity), - 'u_image': new transform.Uniform1i(context, locations.u_image), - 'u_pattern_tl_a': new transform.Uniform2f(context, locations.u_pattern_tl_a), - 'u_pattern_br_a': new transform.Uniform2f(context, locations.u_pattern_br_a), - 'u_pattern_tl_b': new transform.Uniform2f(context, locations.u_pattern_tl_b), - 'u_pattern_br_b': new transform.Uniform2f(context, locations.u_pattern_br_b), - 'u_texsize': new transform.Uniform2f(context, locations.u_texsize), - 'u_mix': new transform.Uniform1f(context, locations.u_mix), - 'u_pattern_size_a': new transform.Uniform2f(context, locations.u_pattern_size_a), - 'u_pattern_size_b': new transform.Uniform2f(context, locations.u_pattern_size_b), - 'u_scale_a': new transform.Uniform1f(context, locations.u_scale_a), - 'u_scale_b': new transform.Uniform1f(context, locations.u_scale_b), - 'u_pixel_coord_upper': new transform.Uniform2f(context, locations.u_pixel_coord_upper), - 'u_pixel_coord_lower': new transform.Uniform2f(context, locations.u_pixel_coord_lower), - 'u_tile_units_to_pixels': new transform.Uniform1f(context, locations.u_tile_units_to_pixels) -}); + const context = this.context; + const gl = context.gl; -const backgroundUniformValues = ( - matrix , - opacity , - color -) => ({ - 'u_matrix': matrix, - 'u_opacity': opacity, - 'u_color': color -}); + if (this.nextStencilID + tileIDs.length > 256) { + // we'll run out of fresh IDs so we need to clear and start from scratch + this.clearStencil(); + } -const backgroundPatternUniformValues = ( - matrix , - opacity , - painter , - image , - tile , - crossfade -) => transform.extend( - bgPatternUniformValues(image, crossfade, painter, tile), - { - 'u_matrix': matrix, - 'u_opacity': opacity - } -); + context.setColorMode(ref_properties.ColorMode.disabled); + context.setDepthMode(ref_properties.DepthMode.disabled); -// + const program = this.useProgram('clippingMask'); - - + this._tileClippingMaskIDs = {}; - - - - - - - + for (const tileID of tileIDs) { + const tile = sourceCache.getTile(tileID); + const id = this._tileClippingMaskIDs[tileID.key] = this.nextStencilID++; + const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = this.getTileBoundsBuffers(tile); - - - - - - - - + program.draw(context, gl.TRIANGLES, ref_properties.DepthMode.disabled, + // Tests will always pass, and ref value will be written to stencil buffer. + new ref_properties.StencilMode({func: gl.ALWAYS, mask: 0}, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE), + ref_properties.ColorMode.disabled, ref_properties.CullFaceMode.disabled, clippingMaskUniformValues(tileID.projMatrix), + '$clipping', tileBoundsBuffer, + tileBoundsIndexBuffer, tileBoundsSegments); + } + } -const skyboxUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_sun_direction': new transform.Uniform3f(context, locations.u_sun_direction), - 'u_cubemap': new transform.Uniform1i(context, locations.u_cubemap), - 'u_opacity': new transform.Uniform1f(context, locations.u_opacity), - 'u_temporal_offset': new transform.Uniform1f(context, locations.u_temporal_offset) + stencilModeFor3D() { + this.currentStencilSource = undefined; -}); + if (this.nextStencilID + 1 > 256) { + this.clearStencil(); + } -const skyboxUniformValues = ( - matrix , - sunDirection , - cubemap , - opacity , - temporalOffset -) => ({ - 'u_matrix': matrix, - 'u_sun_direction': sunDirection, - 'u_cubemap': cubemap, - 'u_opacity': opacity, - 'u_temporal_offset': temporalOffset -}); + const id = this.nextStencilID++; + const gl = this.context.gl; + return new ref_properties.StencilMode({func: gl.NOTEQUAL, mask: 0xFF}, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); + } -const skyboxGradientUniforms = (context , locations ) => ({ - 'u_matrix': new transform.UniformMatrix4f(context, locations.u_matrix), - 'u_color_ramp': new transform.Uniform1i(context, locations.u_color_ramp), - // radial gradient uniforms - 'u_center_direction': new transform.Uniform3f(context, locations.u_center_direction), - 'u_radius': new transform.Uniform1f(context, locations.u_radius), - 'u_opacity': new transform.Uniform1f(context, locations.u_opacity), - 'u_temporal_offset': new transform.Uniform1f(context, locations.u_temporal_offset) -}); + stencilModeForClipping(tileID ) { + if (this.terrain) return this.terrain.stencilModeForRTTOverlap(tileID); + const gl = this.context.gl; + return new ref_properties.StencilMode({func: gl.EQUAL, mask: 0xFF}, this._tileClippingMaskIDs[tileID.key], 0x00, gl.KEEP, gl.KEEP, gl.REPLACE); + } -const skyboxGradientUniformValues = ( - matrix , - centerDirection , - radius , //degrees - opacity , - temporalOffset -) => { - return { - 'u_matrix': matrix, - 'u_color_ramp': 0, - 'u_center_direction': centerDirection, - 'u_radius': transform.degToRad(radius), - 'u_opacity': opacity, - 'u_temporal_offset': temporalOffset - }; -}; + /* + * Sort coordinates by Z as drawing tiles is done in Z-descending order. + * All children with the same Z write the same stencil value. Children + * stencil values are greater than parent's. This is used only for raster + * and raster-dem tiles, which are already clipped to tile boundaries, to + * mask area of tile overlapped by children tiles. + * Stencil ref values continue range used in _tileClippingMaskIDs. + * + * Returns [StencilMode for tile overscaleZ map, sortedCoords]. + */ + stencilConfigForOverlap(tileIDs ) { + const gl = this.context.gl; + const coords = tileIDs.sort((a, b) => b.overscaledZ - a.overscaledZ); + const minTileZ = coords[coords.length - 1].overscaledZ; + const stencilValues = coords[0].overscaledZ - minTileZ + 1; + if (stencilValues > 1) { + this.currentStencilSource = undefined; + if (this.nextStencilID + stencilValues > 256) { + this.clearStencil(); + } + const zToStencilMode = {}; + for (let i = 0; i < stencilValues; i++) { + zToStencilMode[i + minTileZ] = new ref_properties.StencilMode({func: gl.GEQUAL, mask: 0xFF}, i + this.nextStencilID, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); + } + this.nextStencilID += stencilValues; + return [zToStencilMode, coords]; + } + return [{[minTileZ]: ref_properties.StencilMode.disabled}, coords]; + } -// - - - - - + colorModeForRenderPass() { + const gl = this.context.gl; + if (this._showOverdrawInspector) { + const numOverdrawSteps = 8; + const a = 1 / numOverdrawSteps; - - - - - - - - + return new ref_properties.ColorMode([gl.CONSTANT_COLOR, gl.ONE], new ref_properties.Color(a, a, a, 0), [true, true, true, true]); + } else if (this.renderPass === 'opaque') { + return ref_properties.ColorMode.unblended; + } else { + return ref_properties.ColorMode.alphaBlended; + } + } -const skyboxCaptureUniforms = (context , locations ) => ({ - 'u_matrix_3f': new transform.UniformMatrix3f(context, locations.u_matrix_3f), - 'u_sun_direction': new transform.Uniform3f(context, locations.u_sun_direction), - 'u_sun_intensity': new transform.Uniform1f(context, locations.u_sun_intensity), - 'u_color_tint_r': new transform.Uniform4f(context, locations.u_color_tint_r), - 'u_color_tint_m': new transform.Uniform4f(context, locations.u_color_tint_m), - 'u_luminance': new transform.Uniform1f(context, locations.u_luminance), -}); + depthModeForSublayer(n , mask , func ) { + if (!this.opaquePassEnabledForLayer()) return ref_properties.DepthMode.disabled; + const depth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon; + return new ref_properties.DepthMode(func || this.context.gl.LEQUAL, mask, [depth, depth]); + } -const skyboxCaptureUniformValues = ( - matrix , - sunDirection , - sunIntensity , - atmosphereColor , - atmosphereHaloColor -) => ({ - 'u_matrix_3f': matrix, - 'u_sun_direction': sunDirection, - 'u_sun_intensity': sunIntensity, - 'u_color_tint_r': [ - atmosphereColor.r, - atmosphereColor.g, - atmosphereColor.b, - atmosphereColor.a - ], - 'u_color_tint_m': [ - atmosphereHaloColor.r, - atmosphereHaloColor.g, - atmosphereHaloColor.b, - atmosphereHaloColor.a - ], - 'u_luminance': 5e-5, -}); + /* + * The opaque pass and 3D layers both use the depth buffer. + * Layers drawn above 3D layers need to be drawn using the + * painter's algorithm so that they appear above 3D features. + * This returns true for layers that can be drawn using the + * opaque pass. + */ + opaquePassEnabledForLayer() { + return this.currentLayer < this.opaquePassCutoff; + } -// + render(style , options ) { + this.style = style; + this.options = options; - + this.lineAtlas = style.lineAtlas; + this.imageManager = style.imageManager; + this.glyphManager = style.glyphManager; -const programUniforms = { - fillExtrusion: fillExtrusionUniforms, - fillExtrusionPattern: fillExtrusionPatternUniforms, - fill: fillUniforms, - fillPattern: fillPatternUniforms, - fillOutline: fillOutlineUniforms, - fillOutlinePattern: fillOutlinePatternUniforms, - circle: circleUniforms, - collisionBox: collisionUniforms, - collisionCircle: collisionCircleUniforms, - debug: debugUniforms, - clippingMask: clippingMaskUniforms, - heatmap: heatmapUniforms, - heatmapTexture: heatmapTextureUniforms, - hillshade: hillshadeUniforms, - hillshadePrepare: hillshadePrepareUniforms, - line: lineUniforms, - linePattern: linePatternUniforms, - raster: rasterUniforms, - symbolIcon: symbolIconUniforms, - symbolSDF: symbolSDFUniforms, - symbolTextAndIcon: symbolTextAndIconUniforms, - background: backgroundUniforms, - backgroundPattern: backgroundPatternUniforms, - terrainRaster: terrainRasterUniforms, - terrainDepth: terrainRasterUniforms, - skybox: skyboxUniforms, - skyboxGradient: skyboxGradientUniforms, - skyboxCapture: skyboxCaptureUniforms, - globeRaster: globeRasterUniforms, - globeAtmosphere: atmosphereUniforms, -}; + this.symbolFadeChange = style.placement.symbolFadeChange(ref_properties.exported.now()); -// + this.imageManager.beginFrame(); - - - - - - + const layerIds = this.style.order; + const sourceCaches = this.style._sourceCaches; -let quadTriangles ; + for (const id in sourceCaches) { + const sourceCache = sourceCaches[id]; + if (sourceCache.used) { + sourceCache.prepare(this.context); + } + } -function drawCollisionDebug(painter , sourceCache , layer , coords , translate , translateAnchor , isText ) { - const context = painter.context; - const gl = context.gl; - const program = painter.useProgram('collisionBox'); - const tileBatches = []; - let circleCount = 0; - let circleOffset = 0; + const coordsAscending = {}; + const coordsDescending = {}; + const coordsDescendingSymbol = {}; - for (let i = 0; i < coords.length; i++) { - const coord = coords[i]; - const tile = sourceCache.getTile(coord); - const bucket = (tile.getBucket(layer) ); - if (!bucket) continue; - let posMatrix = coord.projMatrix; - if (translate[0] !== 0 || translate[1] !== 0) { - posMatrix = painter.translatePosMatrix(coord.projMatrix, tile, translate, translateAnchor); + for (const id in sourceCaches) { + const sourceCache = sourceCaches[id]; + coordsAscending[id] = sourceCache.getVisibleCoordinates(); + coordsDescending[id] = coordsAscending[id].slice().reverse(); + coordsDescendingSymbol[id] = sourceCache.getVisibleCoordinates(true).reverse(); } - const buffers = isText ? bucket.textCollisionBox : bucket.iconCollisionBox; - // Get collision circle data of this bucket - const circleArray = bucket.collisionCircleArray; - if (circleArray.length > 0) { - // We need to know the projection matrix that was used for projecting collision circles to the screen. - // This might vary between buckets as the symbol placement is a continous process. This matrix is - // required for transforming points from previous screen space to the current one - const invTransform = transform.create(); - const transform$1 = posMatrix; - transform.mul(invTransform, bucket.placementInvProjMatrix, painter.transform.glCoordMatrix); - transform.mul(invTransform, invTransform, bucket.placementViewportMatrix); - - tileBatches.push({ - circleArray, - circleOffset, - transform: transform$1, - invTransform - }); + this.opaquePassCutoff = Infinity; + for (let i = 0; i < layerIds.length; i++) { + const layerId = layerIds[i]; + if (this.style._layers[layerId].is3D()) { + this.opaquePassCutoff = i; + break; + } + } - circleCount += circleArray.length / 4; // 4 values per circle - circleOffset = circleCount; + if (this.terrain) { + this.terrain.updateTileBinding(coordsDescendingSymbol); + // All render to texture is done in translucent pass to remove need + // for depth buffer allocation per tile. + this.opaquePassCutoff = 0; } - if (!buffers) continue; - if (painter.terrain) painter.terrain.setupElevationDraw(tile, program); - program.draw(context, gl.LINES, - transform.DepthMode.disabled, transform.StencilMode.disabled, - painter.colorModeForRenderPass(), - transform.CullFaceMode.disabled, - collisionUniformValues( - posMatrix, - painter.transform, - tile), - layer.id, buffers.layoutVertexBuffer, buffers.indexBuffer, - buffers.segments, null, painter.transform.zoom, null, - buffers.collisionVertexBuffer, - buffers.collisionVertexBufferExt); - } - if (!isText || !tileBatches.length) { - return; - } + if (this.transform.projection.name === 'globe' && !this.globeSharedBuffers) { + this.globeSharedBuffers = new ref_properties.GlobeSharedBuffers(this.context); + } - // Render collision circles - const circleProgram = painter.useProgram('collisionCircle'); + // Following line is billing related code. Do not change. See LICENSE.txt + if (!ref_properties.isMapAuthenticated(this.context.gl)) return; - // Construct vertex data - const vertexData = new transform.StructArrayLayout2f1f2i16(); - vertexData.resize(circleCount * 4); - vertexData._trim(); + // 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'; - let vertexOffset = 0; + for (const layerId of layerIds) { + const layer = this.style._layers[layerId]; + const sourceCache = style._getLayerSourceCache(layer); + if (!layer.hasOffscreenPass() || layer.isHidden(this.transform.zoom)) continue; - for (const batch of tileBatches) { - for (let i = 0; i < batch.circleArray.length / 4; i++) { - const circleIdx = i * 4; - const x = batch.circleArray[circleIdx + 0]; - const y = batch.circleArray[circleIdx + 1]; - const radius = batch.circleArray[circleIdx + 2]; - const collision = batch.circleArray[circleIdx + 3]; + const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; + if (!(layer.type === 'custom' || layer.isSky()) && !(coords && coords.length)) continue; - // 4 floats per vertex, 4 vertices per quad - vertexData.emplace(vertexOffset++, x, y, radius, collision, 0); - vertexData.emplace(vertexOffset++, x, y, radius, collision, 1); - vertexData.emplace(vertexOffset++, x, y, radius, collision, 2); - vertexData.emplace(vertexOffset++, x, y, radius, collision, 3); + this.renderLayer(this, sourceCache, layer, coords); } - } - if (!quadTriangles || quadTriangles.length < circleCount * 2) { - quadTriangles = createQuadTriangles(circleCount); - } - - const indexBuffer = context.createIndexBuffer(quadTriangles, true); - const vertexBuffer = context.createVertexBuffer(vertexData, transform.collisionCircleLayout.members, true); - - // Render batches - for (const batch of tileBatches) { - const uniforms = collisionCircleUniformValues( - batch.transform, - batch.invTransform, - painter.transform - ); - circleProgram.draw( - context, - gl.TRIANGLES, - transform.DepthMode.disabled, - transform.StencilMode.disabled, - painter.colorModeForRenderPass(), - transform.CullFaceMode.disabled, - uniforms, - layer.id, - vertexBuffer, - indexBuffer, - transform.SegmentVector.simpleSegment(0, batch.circleOffset * 2, batch.circleArray.length, batch.circleArray.length / 2), - null, - painter.transform.zoom, - null, - null, - null); - } + this.depthRangeFor3D = [0, 1 - ((style.order.length + 2) * this.numSublayers * this.depthEpsilon)]; - vertexBuffer.destroy(); - indexBuffer.destroy(); -} + // Terrain depth offscreen render pass ========================== + // With terrain on, renders the depth buffer into a texture. + // This texture is used for occlusion testing (labels) + if (this.terrain && (this.style.hasSymbolLayers() || this.style.hasCircleLayers())) { + this.terrain.drawDepth(); + } -function createQuadTriangles(quadCount ) { - const triCount = quadCount * 2; - const array = new transform.StructArrayLayout3ui6(); + // Rebind the main framebuffer now that all offscreen layers have been rendered: + this.context.bindFramebuffer.set(null); + this.context.viewport.set([0, 0, this.width, this.height]); - array.resize(triCount); - array._trim(); + // Clear buffers in preparation for drawing to the main framebuffer + this.context.clear({color: options.showOverdrawInspector ? ref_properties.Color.black : ref_properties.Color.transparent, depth: 1}); + this.clearStencil(); - // Two triangles and 4 vertices per quad. - for (let i = 0; i < triCount; i++) { - const idx = i * 6; + this._showOverdrawInspector = options.showOverdrawInspector; - array.uint16[idx + 0] = i * 4 + 0; - array.uint16[idx + 1] = i * 4 + 1; - array.uint16[idx + 2] = i * 4 + 2; - array.uint16[idx + 3] = i * 4 + 2; - array.uint16[idx + 4] = i * 4 + 3; - array.uint16[idx + 5] = i * 4 + 0; - } + // Opaque pass =============================================== + // Draw opaque layers top-to-bottom first. + this.renderPass = 'opaque'; - return array; -} + if (!this.terrain) { + for (this.currentLayer = layerIds.length - 1; this.currentLayer >= 0; this.currentLayer--) { + const layer = this.style._layers[layerIds[this.currentLayer]]; + const sourceCache = style._getLayerSourceCache(layer); + if (layer.isSky()) continue; + const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; -// -const identityMat4 = transform.identity(new Float32Array(16)); + this._renderTileClippingMasks(layer, sourceCache, coords); + this.renderLayer(this, sourceCache, layer, coords); + } + } - - - - - - - - - - - - - - - - - + if (this.style.fog && this.transform.projection.supportsFog) { + drawAtmosphere(this, this.style.fog); + } -function drawSymbols(painter , sourceCache , layer , coords , variableOffsets ) { - if (painter.renderPass !== 'translucent') return; + // Sky pass ====================================================== + // Draw all sky layers bottom to top. + // They are drawn at max depth, they are drawn after opaque and before + // translucent to fail depth testing and mix with translucent objects. + this.renderPass = 'sky'; + const isTransitioning = ref_properties.globeToMercatorTransition(this.transform.zoom) > 0.0; + if ((isTransitioning || this.transform.projection.name !== 'globe') && this.transform.isHorizonVisible()) { + for (this.currentLayer = 0; this.currentLayer < layerIds.length; this.currentLayer++) { + const layer = this.style._layers[layerIds[this.currentLayer]]; + const sourceCache = style._getLayerSourceCache(layer); + if (!layer.isSky()) continue; + const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; - // Disable the stencil test so that labels aren't clipped to tile boundaries. - const stencilMode = transform.StencilMode.disabled; - const colorMode = painter.colorModeForRenderPass(); - const variablePlacement = layer.layout.get('text-variable-anchor'); + this.renderLayer(this, sourceCache, layer, coords); + } + } - //Compute variable-offsets before painting since icons and text data positioning - //depend on each other in this case. - if (variablePlacement) { - updateVariableAnchors(coords, painter, layer, sourceCache, - layer.layout.get('text-rotation-alignment'), - layer.layout.get('text-pitch-alignment'), - variableOffsets - ); - } + // Translucent pass =============================================== + // Draw all other layers bottom-to-top. + this.renderPass = 'translucent'; - 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'), - stencilMode, colorMode - ); - } + this.currentLayer = 0; + while (this.currentLayer < layerIds.length) { + const layer = this.style._layers[layerIds[this.currentLayer]]; + const sourceCache = style._getLayerSourceCache(layer); - 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'), - stencilMode, colorMode - ); - } + // Nothing to draw in translucent pass for sky layers, advance + if (layer.isSky()) { + ++this.currentLayer; + continue; + } - if (sourceCache.map.showCollisionBoxes) { - drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('text-translate'), - layer.paint.get('text-translate-anchor'), true); - drawCollisionDebug(painter, sourceCache, layer, coords, layer.paint.get('icon-translate'), - layer.paint.get('icon-translate-anchor'), false); - } -} + // With terrain on and for draped layers only, issue rendering and progress + // this.currentLayer until the next non-draped layer. + // Otherwise we interleave terrain draped render with non-draped layers on top + if (this.terrain && this.style.isLayerDraped(layer)) { + if (layer.isHidden(this.transform.zoom)) { + ++this.currentLayer; + continue; + } + const terrain = (((this.terrain) ) ); + const prevLayer = this.currentLayer; + this.currentLayer = terrain.renderBatch(this.currentLayer); + ref_properties.assert_1(this.context.bindFramebuffer.current === null); + ref_properties.assert_1(this.currentLayer > prevLayer); + continue; + } -function calculateVariableRenderShift(anchor, width, height, textOffset, textScale, renderTextSize) { - const {horizontalAlign, verticalAlign} = transform.getAnchorAlignment(anchor); - const shiftX = -(horizontalAlign - 0.5) * width; - const shiftY = -(verticalAlign - 0.5) * height; - const variableOffset = transform.evaluateVariableOffset(anchor, textOffset); - return new transform.pointGeometry( - (shiftX / textScale + variableOffset[0]) * renderTextSize, - (shiftY / textScale + variableOffset[1]) * renderTextSize - ); -} + // For symbol layers in the translucent pass, we add extra tiles to the renderable set + // for cross-tile symbol fading. Symbol layers don't use tile clipping, so no need to render + // separate clipping masks + const coords = sourceCache ? + (layer.type === 'symbol' ? coordsDescendingSymbol : coordsDescending)[sourceCache.id] : + undefined; -function updateVariableAnchors(coords, painter, layer, sourceCache, rotationAlignment, pitchAlignment, variableOffsets) { - const tr = painter.transform; - const rotateWithMap = rotationAlignment === 'map'; - const pitchWithMap = pitchAlignment === 'map'; - const tileTransform = tr.projection.createTileTransform(tr, tr.worldSize); + this._renderTileClippingMasks(layer, sourceCache, sourceCache ? coordsAscending[sourceCache.id] : undefined); + this.renderLayer(this, sourceCache, layer, coords); - for (const coord of coords) { - const tile = sourceCache.getTile(coord); - const bucket = (tile.getBucket(layer) ); - if (!bucket || bucket.projection !== tr.projection.name || !bucket.text || !bucket.text.segments.get().length) { - continue; + ++this.currentLayer; } - const sizeData = bucket.textSizeData; - const size = transform.evaluateSizeForZoom(sizeData, tr.zoom); + if (this.terrain) { + this.terrain.postRender(); + } - const pixelsToTileUnits = painter.transform.calculatePixelsToTileUnitsMatrix(tile); - const labelPlaneMatrix = getLabelPlaneMatrix(coord.projMatrix, tile.tileID.canonical, pitchWithMap, rotateWithMap, painter.transform, pixelsToTileUnits); - const updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' && bucket.hasIconData(); + if (this.options.showTileBoundaries || this.options.showQueryGeometry) { + //Use source with highest maxzoom + let selectedSource = null; + const layers = ref_properties.values(this.style._layers); + layers.forEach((layer) => { + const sourceCache = style._getLayerSourceCache(layer); + if (sourceCache && !layer.isHidden(this.transform.zoom)) { + if (!selectedSource || (selectedSource.getSource().maxzoom < sourceCache.getSource().maxzoom)) { + selectedSource = sourceCache; + } + } + }); + if (selectedSource) { + if (this.options.showTileBoundaries) { + draw.debug(this, selectedSource, selectedSource.getVisibleCoordinates()); + } - if (size) { - const tileScale = Math.pow(2, tr.zoom - tile.tileID.overscaledZ); - updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, transform.symbolSize, - tr, labelPlaneMatrix, coord, tileScale, size, updateTextFitIcon, tileTransform); + ref_properties.Debug.run(() => { + if (this.options.showQueryGeometry && selectedSource) { + drawDebugQueryGeometry(this, selectedSource, selectedSource.getVisibleCoordinates()); + } + }); + } } - } -} - -function updateVariableAnchorsForBucket(bucket, rotateWithMap, pitchWithMap, variableOffsets, symbolSize, - transform$1, labelPlaneMatrix, coord, tileScale, size, updateTextFitIcon, tileTransform) { - const placedSymbols = bucket.text.placedSymbolArray; - const dynamicTextLayoutVertexArray = bucket.text.dynamicLayoutVertexArray; - const dynamicIconLayoutVertexArray = bucket.icon.dynamicLayoutVertexArray; - const placedTextShifts = {}; - const projMatrix = coord.projMatrix; - const elevation = transform$1.elevation; - const getElevation = elevation ? elevation.getAtTileOffsetFunc(coord, tileTransform) : (_ => [0, 0, 0]); - dynamicTextLayoutVertexArray.clear(); - for (let s = 0; s < placedSymbols.length; s++) { - const symbol = placedSymbols.get(s); - const skipOrientation = bucket.allowVerticalPlacement && !symbol.placedOrientation; - const variableOffset = (!symbol.hidden && symbol.crossTileID && !skipOrientation) ? variableOffsets[symbol.crossTileID] : null; + if (this.options.showPadding) { + drawDebugPadding(this); + } - if (!variableOffset) { - // These symbols are from a justification that is not being used, or a label that wasn't placed - // so we don't need to do the extra math to figure out what incremental shift to apply. - hideGlyphs(symbol.numGlyphs, dynamicTextLayoutVertexArray); - } else { - const tileAnchor = new transform.pointGeometry(symbol.tileAnchorX, symbol.tileAnchorY); - const anchorElevation = getElevation(tileAnchor); - const projectedAnchor = project(tileAnchor, pitchWithMap ? projMatrix : labelPlaneMatrix, anchorElevation[2]); - const perspectiveRatio = getPerspectiveRatio(transform$1.cameraToCenterDistance, projectedAnchor.signedDistanceFromCamera); - let renderTextSize = symbolSize.evaluateSizeForFeature(bucket.textSizeData, size, symbol) * perspectiveRatio / transform.ONE_EM; - if (pitchWithMap) { - // Go from size in pixels to equivalent size in tile units - renderTextSize *= bucket.tilePixelRatio / tileScale; - } + // Set defaults for most GL values so that anyone using the state after the render + // encounters more expected values. + this.context.setDefault(); + this.frameCounter = (this.frameCounter + 1) % Number.MAX_SAFE_INTEGER; - const {width, height, anchor, textOffset, textScale} = variableOffset; + if (this.tileLoaded && this.options.speedIndexTiming) { + this.loadTimeStamps.push(ref_properties.window.performance.now()); + this.saveCanvasCopy(); + } + } - const shift = calculateVariableRenderShift( - anchor, width, height, textOffset, textScale, renderTextSize); + renderLayer(painter , sourceCache , layer , coords ) { + if (layer.isHidden(this.transform.zoom)) return; + if (layer.type !== 'background' && layer.type !== 'sky' && layer.type !== 'custom' && !(coords && coords.length)) return; + this.id = layer.id; - // Usual case is that we take the projected anchor and add the pixel-based shift - // calculated above. In the (somewhat weird) case of pitch-aligned text, we add an equivalent - // tile-unit based shift to the anchor before projecting to the label plane. - const shiftedAnchor = pitchWithMap ? - project(tileAnchor.add(shift), labelPlaneMatrix, anchorElevation[2]).point : - projectedAnchor.point.add(rotateWithMap ? - shift.rotate(-transform$1.angle) : - shift); + this.gpuTimingStart(layer); + if (!painter.transform.projection.unsupportedLayers || !painter.transform.projection.unsupportedLayers.includes(layer.type)) { + draw[layer.type](painter, sourceCache, layer, coords, this.style.placement.variableOffsets, this.options.isInitialLoad); + } + this.gpuTimingEnd(); + } - const angle = (bucket.allowVerticalPlacement && symbol.placedOrientation === transform.WritingMode.vertical) ? Math.PI / 2 : 0; - for (let g = 0; g < symbol.numGlyphs; g++) { - transform.addDynamicAttributes(dynamicTextLayoutVertexArray, shiftedAnchor, angle); - } - //Only offset horizontal text icons - if (updateTextFitIcon && symbol.associatedIconIndex >= 0) { - placedTextShifts[symbol.associatedIconIndex] = {shiftedAnchor, angle}; - } + gpuTimingStart(layer ) { + if (!this.options.gpuTiming) return; + const ext = this.context.extTimerQuery; + // This tries to time the draw call itself, but note that the cost for drawing a layer + // may be dominated by the cost of uploading vertices to the GPU. + // To instrument that, we'd need to pass the layerTimers object down into the bucket + // uploading logic. + let layerTimer = this.gpuTimers[layer.id]; + if (!layerTimer) { + layerTimer = this.gpuTimers[layer.id] = { + calls: 0, + cpuTime: 0, + query: ext.createQueryEXT() + }; } + layerTimer.calls++; + ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, layerTimer.query); } - if (updateTextFitIcon) { - dynamicIconLayoutVertexArray.clear(); - const placedIcons = bucket.icon.placedSymbolArray; - for (let i = 0; i < placedIcons.length; i++) { - const placedIcon = placedIcons.get(i); - if (placedIcon.hidden) { - hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray); - } else { - const shift = placedTextShifts[i]; - if (!shift) { - hideGlyphs(placedIcon.numGlyphs, dynamicIconLayoutVertexArray); - } else { - for (let g = 0; g < placedIcon.numGlyphs; g++) { - transform.addDynamicAttributes(dynamicIconLayoutVertexArray, shift.shiftedAnchor, shift.angle); - } - } - } + gpuTimingDeferredRenderStart() { + if (this.options.gpuTimingDeferredRender) { + const ext = this.context.extTimerQuery; + const query = ext.createQueryEXT(); + this.deferredRenderGpuTimeQueries.push(query); + ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, query); } - bucket.icon.dynamicLayoutVertexBuffer.updateData(dynamicIconLayoutVertexArray); } - bucket.text.dynamicLayoutVertexBuffer.updateData(dynamicTextLayoutVertexArray); -} -function getSymbolProgramName(isSDF , isText , bucket ) { - if (bucket.iconsInText && isText) { - return 'symbolTextAndIcon'; - } else if (isSDF) { - return 'symbolSDF'; - } else { - return 'symbolIcon'; + gpuTimingDeferredRenderEnd() { + if (!this.options.gpuTimingDeferredRender) return; + const ext = this.context.extTimerQuery; + ext.endQueryEXT(ext.TIME_ELAPSED_EXT); } -} -function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate, translateAnchor, - rotationAlignment, pitchAlignment, keepUpright, stencilMode, colorMode) { - const context = painter.context; - const gl = context.gl; - const tr = painter.transform; - const tileTransform = tr.projection.createTileTransform(tr, tr.worldSize); + gpuTimingEnd() { + if (!this.options.gpuTiming) return; + const ext = this.context.extTimerQuery; + ext.endQueryEXT(ext.TIME_ELAPSED_EXT); + } - const rotateWithMap = rotationAlignment === 'map'; - const pitchWithMap = pitchAlignment === 'map'; - const alongLine = rotateWithMap && layer.layout.get('symbol-placement') !== 'point'; + collectGpuTimers() { + const currentLayerTimers = this.gpuTimers; + this.gpuTimers = {}; + return currentLayerTimers; + } - // 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 - const rotateInShader = rotateWithMap && !pitchWithMap && !alongLine; + collectDeferredRenderGpuQueries() { + const currentQueries = this.deferredRenderGpuTimeQueries; + this.deferredRenderGpuTimeQueries = []; + return currentQueries; + } - const hasSortKey = layer.layout.get('symbol-sort-key').constantOr(1) !== undefined; - let sortFeaturesByKey = false; + queryGpuTimers(gpuTimers ) { + const layers = {}; + for (const layerId in gpuTimers) { + const gpuTimer = gpuTimers[layerId]; + const ext = this.context.extTimerQuery; + const gpuTime = ext.getQueryObjectEXT(gpuTimer.query, ext.QUERY_RESULT_EXT) / (1000 * 1000); + ext.deleteQueryEXT(gpuTimer.query); + layers[layerId] = (gpuTime ); + } + return layers; + } - const depthMode = painter.depthModeForSublayer(0, transform.DepthMode.ReadOnly); - const mercCenter = [ - transform.mercatorXfromLng(tr.center.lng), - transform.mercatorYfromLat(tr.center.lat) - ]; - const variablePlacement = layer.layout.get('text-variable-anchor'); - const isGlobeProjection = tr.projection.name === 'globe'; - const globeToMercator = isGlobeProjection ? - transform.globeToMercatorTransition(tr.zoom) : 0.0; - const tileRenderState = []; + queryGpuTimeDeferredRender(gpuQueries ) { + if (!this.options.gpuTimingDeferredRender) return 0; + const ext = this.context.extTimerQuery; - const defines = ([] ); - if (painter.terrain && pitchWithMap) { - defines.push('PITCH_WITH_MAP_TERRAIN'); - } - if (isGlobeProjection) { - defines.push('PROJECTION_GLOBE_VIEW'); - } - if (alongLine) { - defines.push('PROJECTED_POS_ON_VIEWPORT'); + let gpuTime = 0; + for (const query of gpuQueries) { + gpuTime += ext.getQueryObjectEXT(query, ext.QUERY_RESULT_EXT) / (1000 * 1000); + ext.deleteQueryEXT(query); + } + + return gpuTime; } - for (const coord of coords) { - const tile = sourceCache.getTile(coord); - const bucket = (tile.getBucket(layer) ); - if (!bucket || bucket.projection !== tr.projection.name) continue; - const buffers = isText ? bucket.text : bucket.icon; - if (!buffers || bucket.fullyClipped || !buffers.segments.get().length) continue; - const programConfiguration = buffers.programConfigurations.get(layer.id); + /** + * 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 + * @private + */ + translatePosMatrix(matrix , tile , translate , translateAnchor , inViewportPixelUnitsUnits ) { + if (!translate[0] && !translate[1]) return matrix; - const isSDF = isText || bucket.sdfIcons; + const angle = inViewportPixelUnitsUnits ? + (translateAnchor === 'map' ? this.transform.angle : 0) : + (translateAnchor === 'viewport' ? -this.transform.angle : 0); - const sizeData = isText ? bucket.textSizeData : bucket.iconSizeData; - const transformed = pitchWithMap || tr.pitch !== 0; + if (angle) { + const sinA = Math.sin(angle); + const cosA = Math.cos(angle); + translate = [ + translate[0] * cosA - translate[1] * sinA, + translate[0] * sinA + translate[1] * cosA + ]; + } + + const translation = [ + inViewportPixelUnitsUnits ? translate[0] : pixelsToTileUnits(tile, translate[0], this.transform.zoom), + inViewportPixelUnitsUnits ? translate[1] : pixelsToTileUnits(tile, translate[1], this.transform.zoom), + 0 + ]; - const program = painter.useProgram(getSymbolProgramName(isSDF, isText, bucket), programConfiguration, defines); - const size = transform.evaluateSizeForZoom(sizeData, tr.zoom); - const coordId = [coord.canonical.x, coord.canonical.y, 1 << coord.canonical.z]; + const translatedMatrix = new Float32Array(16); + ref_properties.translate(translatedMatrix, matrix, translation); + return translatedMatrix; + } - let texSize ; - let texSizeIcon = [0, 0]; - let atlasTexture; - let atlasInterpolation; - let atlasTextureIcon = null; - let atlasInterpolationIcon; - if (isText) { - atlasTexture = tile.glyphAtlasTexture; - atlasInterpolation = gl.LINEAR; - texSize = tile.glyphAtlasTexture.size; - if (bucket.iconsInText) { - texSizeIcon = tile.imageAtlasTexture.size; - atlasTextureIcon = tile.imageAtlasTexture; - const zoomDependentSize = sizeData.kind === 'composite' || sizeData.kind === 'camera'; - atlasInterpolationIcon = transformed || painter.options.rotating || painter.options.zooming || zoomDependentSize ? gl.LINEAR : gl.NEAREST; - } + saveTileTexture(texture ) { + const textures = this._tileTextures[texture.size[0]]; + if (!textures) { + this._tileTextures[texture.size[0]] = [texture]; } else { - const iconScaled = layer.layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear; - atlasTexture = tile.imageAtlasTexture; - atlasInterpolation = isSDF || painter.options.rotating || painter.options.zooming || iconScaled || transformed ? - gl.LINEAR : - gl.NEAREST; - texSize = tile.imageAtlasTexture.size; + textures.push(texture); } + } - const s = painter.transform.calculatePixelsToTileUnitsMatrix(tile); - const labelPlaneMatrix = getLabelPlaneMatrix(coord.projMatrix, tile.tileID.canonical, pitchWithMap, rotateWithMap, painter.transform, s); - // labelPlaneMatrixInv is used for converting vertex pos to tile coordinates needed for sampling elevation. - const labelPlaneMatrixInv = painter.terrain && pitchWithMap && alongLine ? transform.invert$1(new Float32Array(16), labelPlaneMatrix) : identityMat4; - const glCoordMatrix = getGlCoordMatrix(coord.projMatrix, tile.tileID.canonical, pitchWithMap, rotateWithMap, painter.transform, s); + getTileTexture(size ) { + const textures = this._tileTextures[size]; + return textures && textures.length > 0 ? textures.pop() : null; + } - const hasVariableAnchors = variablePlacement && bucket.hasTextData(); - const updateTextFitIcon = layer.layout.get('icon-text-fit') !== 'none' && - hasVariableAnchors && - bucket.hasIconData(); + /** + * Checks whether a pattern image is needed, and if it is, whether it is not loaded. + * +* @returns true if a needed image is missing and rendering needs to be skipped. + * @private + */ + isPatternMissing(image ) { + if (!image) return false; + if (!image.from || !image.to) return true; + const imagePosA = this.imageManager.getPattern(image.from.toString()); + const imagePosB = this.imageManager.getPattern(image.to.toString()); + return !imagePosA || !imagePosB; + } - if (alongLine) { - const elevation = tr.elevation; - const getElevation = elevation ? elevation.getAtTileOffsetFunc(coord, tileTransform) : (_ => [0, 0, 0]); - updateLineLabels(bucket, coord.projMatrix, painter, isText, labelPlaneMatrix, glCoordMatrix, pitchWithMap, keepUpright, getElevation, coord); - } + /** + * Returns #defines that would need to be injected into every Program + * based on the current state of Painter. + * + * @returns {string[]} + * @private + */ + currentGlobalDefines() { + const terrain = this.terrain && !this.terrain.renderingToTexture; // Enables elevation sampling in vertex shader. + const rtt = this.terrain && this.terrain.renderingToTexture; + const fog = this.style && this.style.fog; + const defines = []; - const matrix = painter.translatePosMatrix(coord.projMatrix, tile, translate, translateAnchor), - uLabelPlaneMatrix = (alongLine || (isText && variablePlacement) || updateTextFitIcon) ? identityMat4 : labelPlaneMatrix, - uglCoordMatrix = painter.translatePosMatrix(glCoordMatrix, tile, translate, translateAnchor, true); + if (terrain) defines.push('TERRAIN'); + // When terrain is active, fog is rendered as part of draping, not as part of tile + // rendering. Removing the fog flag during tile rendering avoids additional defines. + if (fog && !rtt && fog.getOpacity(this.transform.pitch) !== 0.0) { + defines.push('FOG'); + } + if (rtt) defines.push('RENDER_TO_TEXTURE'); + if (this._showOverdrawInspector) defines.push('OVERDRAW_INSPECTOR'); + return defines; + } - const hasHalo = isSDF && layer.paint.get(isText ? 'text-halo-width' : 'icon-halo-width').constantOr(1) !== 0; + useProgram(name , programConfiguration , fixedDefines ) { + this.cache = this.cache || {}; + const defines = (((fixedDefines || []) ) ); - let uniformValues; - const invMatrix = tileTransform.createInversionMatrix(coord.toUnwrapped()); + const globalDefines = this.currentGlobalDefines(); + const allDefines = globalDefines.concat(defines); + const key = Program.cacheKey(name, allDefines, programConfiguration); - if (isSDF) { - if (!bucket.iconsInText) { - uniformValues = symbolSDFUniformValues(sizeData.kind, - size, rotateInShader, pitchWithMap, painter, matrix, - uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, true, - coordId, globeToMercator, invMatrix, mercCenter); - } else { - uniformValues = symbolTextAndIconUniformValues(sizeData.kind, - size, rotateInShader, pitchWithMap, painter, matrix, - uLabelPlaneMatrix, uglCoordMatrix, texSize, texSizeIcon, - coordId, globeToMercator, invMatrix, mercCenter); - } - } else { - uniformValues = symbolIconUniformValues(sizeData.kind, - size, rotateInShader, pitchWithMap, painter, matrix, - uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, - coordId, globeToMercator, invMatrix, mercCenter); + if (!this.cache[key]) { + this.cache[key] = new Program(this.context, name, shaders[name], programConfiguration, programUniforms[name], allDefines); } + return this.cache[key]; + } - const state = { - program, - buffers, - uniformValues, - atlasTexture, - atlasTextureIcon, - atlasInterpolation, - atlasInterpolationIcon, - isSDF, - hasHalo, - tile, - labelPlaneMatrixInv - }; + /* + * Reset some GL state to default values to avoid hard-to-debug bugs + * in custom layers. + */ + setCustomLayerDefaults() { + // Prevent custom layers from unintentionally modify the last VAO used. + // All other state is state is restored on it's own, but for VAOs it's + // simpler to unbind so that we don't have to track the state of VAOs. + this.context.unbindVAO(); - if (hasSortKey && bucket.canOverlap) { - sortFeaturesByKey = true; - const oldSegments = buffers.segments.get(); - for (const segment of oldSegments) { - tileRenderState.push({ - segments: new transform.SegmentVector([segment]), - sortKey: ((segment.sortKey ) ), - state - }); - } - } else { - tileRenderState.push({ - segments: buffers.segments, - sortKey: 0, - state - }); - } + // The default values for this state is meaningful and often expected. + // Leaving this state dirty could cause a lot of confusion for users. + this.context.cullFace.setDefault(); + this.context.frontFace.setDefault(); + this.context.cullFaceSide.setDefault(); + this.context.activeTexture.setDefault(); + this.context.pixelStoreUnpack.setDefault(); + this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(); + this.context.pixelStoreUnpackFlipY.setDefault(); } - if (sortFeaturesByKey) { - tileRenderState.sort((a, b) => a.sortKey - b.sortKey); + /* + * Set GL state that is shared by all layers. + */ + setBaseState() { + const gl = this.context.gl; + this.context.cullFace.set(false); + this.context.viewport.set([0, 0, this.width, this.height]); + this.context.blendEquation.set(gl.FUNC_ADD); } - for (const segmentState of tileRenderState) { - const state = segmentState.state; - if (painter.terrain) { - const options = { - useDepthForOcclusion: !isGlobeProjection, - labelPlaneMatrixInv: state.labelPlaneMatrixInv - }; - painter.terrain.setupElevationDraw(state.tile, state.program, options); + initDebugOverlayCanvas() { + if (this.debugOverlayCanvas == null) { + this.debugOverlayCanvas = ref_properties.window.document.createElement('canvas'); + this.debugOverlayCanvas.width = 512; + this.debugOverlayCanvas.height = 512; + const gl = this.context.gl; + this.debugOverlayTexture = new ref_properties.Texture(this.context, this.debugOverlayCanvas, gl.RGBA); } - context.activeTexture.set(gl.TEXTURE0); - state.atlasTexture.bind(state.atlasInterpolation, gl.CLAMP_TO_EDGE); - if (state.atlasTextureIcon) { - context.activeTexture.set(gl.TEXTURE1); - if (state.atlasTextureIcon) { - state.atlasTextureIcon.bind(state.atlasInterpolationIcon, gl.CLAMP_TO_EDGE); - } + } + + destroy() { + if (this._terrain) { + this._terrain.destroy(); + } + if (this.globeSharedBuffers) { + this.globeSharedBuffers.destroy(); + } + this.emptyTexture.destroy(); + if (this.debugOverlayTexture) { + this.debugOverlayTexture.destroy(); } + if (this.atmosphereBuffer) { + this.atmosphereBuffer.destroy(); + } + } - if (state.isSDF) { - const uniformValues = ((state.uniformValues ) ); - if (state.hasHalo) { - uniformValues['u_is_halo'] = 1; - drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, uniformValues); - } - uniformValues['u_is_halo'] = 0; + prepareDrawTile() { + if (this.terrain) { + this.terrain.prepareDrawTile(); } - drawSymbolElements(state.buffers, segmentState.segments, layer, painter, state.program, depthMode, stencilMode, colorMode, state.uniformValues); } -} -function drawSymbolElements(buffers, segments, layer, painter, program, depthMode, stencilMode, colorMode, uniformValues) { - const context = painter.context; - const gl = context.gl; - program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, transform.CullFaceMode.disabled, - uniformValues, layer.id, buffers.layoutVertexBuffer, - buffers.indexBuffer, segments, layer.paint, - painter.transform.zoom, buffers.programConfigurations.get(layer.id), - buffers.dynamicLayoutVertexBuffer, buffers.opacityVertexBuffer); -} + prepareDrawProgram(context , program , tileID ) { -// + // Fog is not enabled when rendering to texture so we + // can safely skip uploading uniforms in that case + if (this.terrain && this.terrain.renderingToTexture) { + return; + } - - - - - - - - + const fog = this.style.fog; - - - - - + if (fog) { + const fogOpacity = fog.getOpacity(this.transform.pitch); + const fogUniforms = fogUniformValues( + this, fog, tileID, fogOpacity, + this.transform.frustumCorners.TL, + this.transform.frustumCorners.TR, + this.transform.frustumCorners.BR, + this.transform.frustumCorners.BL, + this.transform.globeCenterInViewSpace, + this.transform.globeRadius, + [ + this.transform.width * ref_properties.exported.devicePixelRatio, + this.transform.height * ref_properties.exported.devicePixelRatio + ]); -function drawCircles(painter , sourceCache , layer , coords ) { - if (painter.renderPass !== 'translucent') return; + program.setFogUniformValues(context, fogUniforms); + } + } - const opacity = layer.paint.get('circle-opacity'); - const strokeWidth = layer.paint.get('circle-stroke-width'); - const strokeOpacity = layer.paint.get('circle-stroke-opacity'); - const sortFeaturesByKey = layer.layout.get('circle-sort-key').constantOr(1) !== undefined; + setTileLoadedFlag(flag ) { + this.tileLoaded = flag; + } - if (opacity.constantOr(1) === 0 && (strokeWidth.constantOr(1) === 0 || strokeOpacity.constantOr(1) === 0)) { - return; + saveCanvasCopy() { + this.frameCopies.push(this.canvasCopy()); + this.tileLoaded = false; } - const context = painter.context; - const gl = context.gl; + canvasCopy() { + const gl = this.context.gl; + const texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, 0); + return texture; + } - const depthMode = painter.depthModeForSublayer(0, transform.DepthMode.ReadOnly); - // Turn off stencil testing to allow circles to be drawn across boundaries, - // so that large circles are not clipped to tiles - const stencilMode = transform.StencilMode.disabled; - const colorMode = painter.colorModeForRenderPass(); + getCanvasCopiesAndTimestamps() { + return { + canvasCopies: this.frameCopies, + timeStamps: this.loadTimeStamps + }; + } - const segmentsRenderStates = []; + averageElevationNeedsEasing() { + if (!this.transform._elevation) return false; - for (let i = 0; i < coords.length; i++) { - const coord = coords[i]; + const fog = this.style && this.style.fog; + if (!fog) return false; - const tile = sourceCache.getTile(coord); - const bucket = (tile.getBucket(layer) ); - if (!bucket) continue; + const fogOpacity = fog.getOpacity(this.transform.pitch); + if (fogOpacity === 0) return false; + + return true; + } + + getBackgroundTiles() { + const oldTiles = this._backgroundTiles; + const newTiles = this._backgroundTiles = {}; + + const tileSize = 512; + const tileIDs = this.transform.coveringTiles({tileSize}); + for (const tileID of tileIDs) { + newTiles[tileID.key] = oldTiles[tileID.key] || new ref_properties.Tile(tileID, tileSize, this.transform.tileZoom, this); + } + return newTiles; + } + + clearBackgroundTiles() { + this._backgroundTiles = {}; + } +} - const programConfiguration = bucket.programConfigurations.get(layer.id); - const definesValues = circleDefinesValues(layer); - const program = painter.useProgram('circle', programConfiguration, ((definesValues ) )); - const layoutVertexBuffer = bucket.layoutVertexBuffer; - const indexBuffer = bucket.indexBuffer; - const uniformValues = circleUniformValues(painter, coord, tile, layer); +// - const state = { - programConfiguration, - program, - layoutVertexBuffer, - indexBuffer, - uniformValues, - tile - }; +/** + * @private + * An `EdgeInset` object represents screen space padding applied to the edges of the viewport. + * This shifts the apparent center or the vanishing point of the map. This is useful for adding floating UI elements + * on top of the map and having the vanishing point shift as UI elements resize. + * + * @param {number} [top=0] + * @param {number} [bottom=0] + * @param {number} [left=0] + * @param {number} [right=0] + */ +class EdgeInsets { + + + + - if (sortFeaturesByKey) { - const oldSegments = bucket.segments.get(); - for (const segment of oldSegments) { - segmentsRenderStates.push({ - segments: new transform.SegmentVector([segment]), - sortKey: ((segment.sortKey ) ), - state - }); - } - } else { - segmentsRenderStates.push({ - segments: bucket.segments, - sortKey: 0, - state - }); + constructor(top = 0, bottom = 0, left = 0, right = 0) { + if (isNaN(top) || top < 0 || + isNaN(bottom) || bottom < 0 || + isNaN(left) || left < 0 || + isNaN(right) || right < 0 + ) { + throw new Error('Invalid value for edge-insets, top, bottom, left and right must all be numbers'); } + this.top = top; + this.bottom = bottom; + this.left = left; + this.right = right; } - if (sortFeaturesByKey) { - segmentsRenderStates.sort((a, b) => a.sortKey - b.sortKey); + /** + * Interpolates the inset in-place. + * This maintains the current inset value for any inset not present in `target`. + * + * @private + * @param {PaddingOptions | EdgeInsets} start The initial padding options. + * @param {PaddingOptions} target The target padding options. + * @param {number} t The interpolation variable. + * @returns {EdgeInsets} The interpolated edge insets. + * @memberof EdgeInsets + */ + interpolate(start , target , t ) { + if (target.top != null && start.top != null) this.top = ref_properties.number(start.top, target.top, t); + if (target.bottom != null && start.bottom != null) this.bottom = ref_properties.number(start.bottom, target.bottom, t); + if (target.left != null && start.left != null) this.left = ref_properties.number(start.left, target.left, t); + if (target.right != null && start.right != null) this.right = ref_properties.number(start.right, target.right, t); + + return this; } - const isGlobeProjection = painter.transform.projection.name === 'globe'; - const terrainOptions = {useDepthForOcclusion: !isGlobeProjection}; + /** + * Utility method that computes the new apprent center or vanishing point after applying insets. + * This is in pixels and with the top left being (0.0) and +y being downwards. + * + * @private + * @param {number} width The width of the map in pixels. + * @param {number} height The height of the map in pixels. + * @returns {Point} The apparent center or vanishing point of the map. + * @memberof EdgeInsets + */ + getCenter(width , height ) { + // Clamp insets so they never overflow width/height and always calculate a valid center + const x = ref_properties.clamp((this.left + width - this.right) / 2, 0, width); + const y = ref_properties.clamp((this.top + height - this.bottom) / 2, 0, height); - for (const segmentsState of segmentsRenderStates) { - const {programConfiguration, program, layoutVertexBuffer, indexBuffer, uniformValues, tile} = segmentsState.state; - const segments = segmentsState.segments; + return new ref_properties.pointGeometry(x, y); + } - if (painter.terrain) painter.terrain.setupElevationDraw(tile, program, terrainOptions); + equals(other ) { + return this.top === other.top && + this.bottom === other.bottom && + this.left === other.left && + this.right === other.right; + } - painter.prepareDrawProgram(context, program, tile.tileID.toUnwrapped()); + clone() { + return new EdgeInsets(this.top, this.bottom, this.left, this.right); + } - program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, transform.CullFaceMode.disabled, - uniformValues, layer.id, - layoutVertexBuffer, indexBuffer, segments, - layer.paint, painter.transform.zoom, programConfiguration); + /** + * Returns the current state as json, useful when you want to have a + * read-only representation of the inset. + * + * @private + * @returns {PaddingOptions} The current padding options. + * @memberof EdgeInsets + */ + toJSON() { + return { + top: this.top, + bottom: this.bottom, + left: this.left, + right: this.right + }; } } // -function drawHeatmap(painter , sourceCache , layer , coords ) { - if (layer.paint.get('heatmap-opacity') === 0) { - return; - } + + + - if (painter.renderPass === 'offscreen') { - const context = painter.context; - const gl = context.gl; +function updateTransformOrientation(matrix , orientation ) { + // Take temporary copy of position to prevent it from being overwritten + const position = ref_properties.getColumn(matrix, 3); - // Allow kernels to be drawn across boundaries, so that - // large kernels are not clipped to tiles - const stencilMode = transform.StencilMode.disabled; - // Turn on additive blending for kernels, which is a key aspect of kernel density estimation formula - const colorMode = new transform.ColorMode([gl.ONE, gl.ONE], transform.Color.transparent, [true, true, true, true]); + // Convert quaternion to rotation matrix + ref_properties.fromQuat(matrix, orientation); + ref_properties.setColumn(matrix, 3, position); +} - bindFramebuffer(context, painter, layer); +function updateTransformPosition(matrix , position ) { + ref_properties.setColumn(matrix, 3, [position[0], position[1], position[2], 1.0]); +} - context.clear({color: transform.Color.transparent}); +function orientationFromPitchBearing(pitch , bearing ) { + // Both angles are considered to define CW rotation around their respective axes. + // Values have to be negated to achieve the proper quaternion in left handed coordinate space + const orientation = ref_properties.identity$1([]); + ref_properties.rotateZ$1(orientation, orientation, -bearing); + ref_properties.rotateX$1(orientation, orientation, -pitch); + return orientation; +} - for (let i = 0; i < coords.length; i++) { - const coord = coords[i]; +function orientationFromFrame(forward , up ) { + // Find right-vector of the resulting coordinate frame. Up-vector has to be + // sanitized first in order to remove the roll component from the orientation + const xyForward = [forward[0], forward[1], 0]; + const xyUp = [up[0], up[1], 0]; - // 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; + const epsilon = 1e-15; - const tile = sourceCache.getTile(coord); - const bucket = (tile.getBucket(layer) ); - if (!bucket) continue; + if (ref_properties.length(xyForward) >= epsilon) { + // Roll rotation can be seen as the right vector not being on the xy-plane, ie. right[2] != 0.0. + // It can be negated by projecting the up vector on top of the forward vector. + const xyDir = ref_properties.normalize([], xyForward); + ref_properties.scale$3(xyUp, xyDir, ref_properties.dot(xyUp, xyDir)); - const programConfiguration = bucket.programConfigurations.get(layer.id); - const program = painter.useProgram('heatmap', programConfiguration); - const {zoom} = painter.transform; - if (painter.terrain) painter.terrain.setupElevationDraw(tile, program); + up[0] = xyUp[0]; + up[1] = xyUp[1]; + } - painter.prepareDrawProgram(context, program, coord.toUnwrapped()); + const right = ref_properties.cross([], up, forward); + if (ref_properties.len(right) < epsilon) { + return null; + } - program.draw(context, gl.TRIANGLES, transform.DepthMode.disabled, stencilMode, colorMode, transform.CullFaceMode.disabled, - heatmapUniformValues(coord.projMatrix, - tile, zoom, layer.paint.get('heatmap-intensity')), - layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, - bucket.segments, layer.paint, painter.transform.zoom, - programConfiguration); - } + const bearing = Math.atan2(-right[1], right[0]); + const pitch = Math.atan2(Math.sqrt(forward[0] * forward[0] + forward[1] * forward[1]), -forward[2]); - context.viewport.set([0, 0, painter.width, painter.height]); + return orientationFromPitchBearing(pitch, bearing); +} - } else if (painter.renderPass === 'translucent') { - painter.context.setColorMode(painter.colorModeForRenderPass()); - renderTextureToMap(painter, layer); +/** + * Options for accessing physical properties of the underlying camera entity. + * Direct access to these properties allows more flexible and precise controlling of the camera. + * These options are also fully compatible and interchangeable with CameraOptions. All fields are optional. + * See {@link Map#setFreeCameraOptions} and {@link Map#getFreeCameraOptions}. + * + * @param {MercatorCoordinate} position Position of the camera in slightly modified web mercator coordinates. + - The size of 1 unit is the width of the projected world instead of the "mercator meter". + Coordinate [0, 0, 0] is the north-west corner and [1, 1, 0] is the south-east corner. + - Z coordinate is conformal and must respect minimum and maximum zoom values. + - Zoom is automatically computed from the altitude (z). + * @param {quat} orientation Orientation of the camera represented as a unit quaternion [x, y, z, w] in a left-handed coordinate space. + Direction of the rotation is clockwise around the respective axis. + The default pose of the camera is such that the forward vector is looking up the -Z axis. + The up vector is aligned with north orientation of the map: + forward: [0, 0, -1] + up: [0, -1, 0] + right [1, 0, 0] + Orientation can be set freely but certain constraints still apply: + - Orientation must be representable with only pitch and bearing. + - Pitch has an upper limit + * @example + * const camera = map.getFreeCameraOptions(); + * + * const position = [138.72649, 35.33974]; + * const altitude = 3000; + * + * camera.position = mapboxgl.MercatorCoordinate.fromLngLat(position, altitude); + * camera.lookAtPoint([138.73036, 35.36197]); + * + * map.setFreeCameraOptions(camera); + * @see [Example: Animate the camera around a point in 3D terrain](https://docs.mapbox.com/mapbox-gl-js/example/free-camera-point/) + * @see [Example: Animate the camera along a path](https://docs.mapbox.com/mapbox-gl-js/example/free-camera-path/) +*/ +class FreeCameraOptions { + + + + + + constructor(position , orientation ) { + this.position = position; + this.orientation = orientation; } -} -function bindFramebuffer(context, painter, layer) { - const gl = context.gl; - context.activeTexture.set(gl.TEXTURE1); + get position() { + return this._position; + } - // Use a 4x downscaled screen texture for better performance - context.viewport.set([0, 0, painter.width / 4, painter.height / 4]); + set position(position ) { + if (!position) { + this._position = null; + } else { + const mercatorCoordinate = position instanceof ref_properties.MercatorCoordinate ? position : new ref_properties.MercatorCoordinate(position[0], position[1], position[2]); + if (this._renderWorldCopies) { + mercatorCoordinate.x = ref_properties.wrap(mercatorCoordinate.x, 0, 1); + } + this._position = mercatorCoordinate; + } + } - let fbo = layer.heatmapFbo; + /** + * Helper function for setting orientation of the camera by defining a focus point + * on the map. + * + * @param {LngLatLike} location Location of the focus point on the map. + * @param {vec3?} up Up vector of the camera is necessary in certain scenarios where bearing can't be deduced + * from the viewing direction. + * @example + * const camera = map.getFreeCameraOptions(); + * + * const position = [138.72649, 35.33974]; + * const altitude = 3000; + * + * camera.position = mapboxgl.MercatorCoordinate.fromLngLat(position, altitude); + * camera.lookAtPoint([138.73036, 35.36197]); + * // Apply camera changes + * map.setFreeCameraOptions(camera); + */ + lookAtPoint(location , up ) { + this.orientation = null; + if (!this.position) { + return; + } - if (!fbo) { - const 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); + const altitude = this._elevation ? this._elevation.getAtPointOrZero(ref_properties.MercatorCoordinate.fromLngLat(location)) : 0; + const pos = this.position; + const target = ref_properties.MercatorCoordinate.fromLngLat(location, altitude); + const forward = [target.x - pos.x, target.y - pos.y, target.z - pos.z]; + if (!up) + up = [0, 0, 1]; - fbo = layer.heatmapFbo = context.createFramebuffer(painter.width / 4, painter.height / 4, false); + // flip z-component if the up vector is pointing downwards + up[2] = Math.abs(up[2]); - bindTextureToFramebuffer(context, painter, texture, fbo); + this.orientation = orientationFromFrame(forward, up); + } - } else { - gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); - context.bindFramebuffer.set(fbo.framebuffer); + /** + * Helper function for setting the orientation of the camera as a pitch and a bearing. + * + * @param {number} pitch Pitch angle in degrees. + * @param {number} bearing Bearing angle in degrees. + * @example + * const camera = map.getFreeCameraOptions(); + * + * // Update camera pitch and bearing + * camera.setPitchBearing(80, 90); + * // Apply changes + * map.setFreeCameraOptions(camera); + */ + setPitchBearing(pitch , bearing ) { + this.orientation = orientationFromPitchBearing(ref_properties.degToRad(pitch), ref_properties.degToRad(-bearing)); } } -function bindTextureToFramebuffer(context, painter, texture, fbo) { - const gl = context.gl; - // Use the higher precision half-float texture where available (producing much smoother looking heatmaps); - // Otherwise, fall back to a low precision texture - const internalFormat = context.extRenderToTextureHalfFloat ? context.extTextureHalfFloat.HALF_FLOAT_OES : gl.UNSIGNED_BYTE; - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, painter.width / 4, painter.height / 4, 0, gl.RGBA, internalFormat, null); - fbo.colorAttachment.set(texture); -} +/** + * While using the free camera API the outcome value of isZooming, isMoving and isRotating + * is not a result of the free camera API. + * If the user sets the map.interactive to true, there will be conflicting behaviors while + * interacting with map via zooming or moving using mouse or/and keyboard which will result + * in isZooming, isMoving and isRotating to return true while using free camera API. In order + * to prevent the confilicting behavior please set map.interactive to false which will result + * in muting the following events: zoom, zoomend, zoomstart, rotate, rotateend, rotatestart, + * move, moveend, movestart, pitch, pitchend, pitchstart. + */ -function renderTextureToMap(painter, layer) { - const context = painter.context; - const gl = context.gl; +class FreeCamera { + + - // 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. - const fbo = layer.heatmapFbo; - if (!fbo) return; - context.activeTexture.set(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, fbo.colorAttachment.get()); + constructor(position , orientation ) { + this._transform = ref_properties.identity([]); + this.orientation = orientation; + this.position = position; + } - context.activeTexture.set(gl.TEXTURE1); - let colorRampTexture = layer.colorRampTexture; - if (!colorRampTexture) { - colorRampTexture = layer.colorRampTexture = new transform.Texture(context, layer.colorRamp, gl.RGBA); + get mercatorPosition() { + const pos = this.position; + return new ref_properties.MercatorCoordinate(pos[0], pos[1], pos[2]); } - colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - painter.useProgram('heatmapTexture').draw(context, gl.TRIANGLES, - transform.DepthMode.disabled, transform.StencilMode.disabled, painter.colorModeForRenderPass(), transform.CullFaceMode.disabled, - heatmapTextureUniformValues(painter, layer, 0, 1), - layer.id, painter.viewportBuffer, painter.quadTriangleIndexBuffer, - painter.viewportSegments, layer.paint, painter.transform.zoom); -} + get position() { + const col = ref_properties.getColumn(this._transform, 3); + return [col[0], col[1], col[2]]; + } -// + set position(value ) { + if (value) { + updateTransformPosition(this._transform, value); + } + } -function drawLine(painter , sourceCache , layer , coords ) { - if (painter.renderPass !== 'translucent') return; + get orientation() { + return this._orientation; + } - const opacity = layer.paint.get('line-opacity'); - const width = layer.paint.get('line-width'); - if (opacity.constantOr(1) === 0 || width.constantOr(1) === 0) return; + set orientation(value ) { + this._orientation = value || ref_properties.identity$1([]); + if (value) { + updateTransformOrientation(this._transform, this._orientation); + } + } - const depthMode = painter.depthModeForSublayer(0, transform.DepthMode.ReadOnly); - const colorMode = painter.colorModeForRenderPass(); + getPitchBearing() { + const f = this.forward(); + const r = this.right(); - const dasharrayProperty = layer.paint.get('line-dasharray'); - const dasharray = dasharrayProperty.constantOr((1 )); - const capProperty = layer.layout.get('line-cap'); - const patternProperty = layer.paint.get('line-pattern'); - const image = patternProperty.constantOr((1 )); + return { + bearing: Math.atan2(-r[1], r[0]), + pitch: Math.atan2(Math.sqrt(f[0] * f[0] + f[1] * f[1]), -f[2]) + }; + } - const gradient = layer.paint.get('line-gradient'); - const crossfade = layer.getCrossfadeParameters(); + setPitchBearing(pitch , bearing ) { + this._orientation = orientationFromPitchBearing(pitch, bearing); + updateTransformOrientation(this._transform, this._orientation); + } - const programId = image ? 'linePattern' : 'line'; + forward() { + const col = ref_properties.getColumn(this._transform, 2); + // Forward direction is towards the negative Z-axis + return [-col[0], -col[1], -col[2]]; + } - const context = painter.context; - const gl = context.gl; + up() { + const col = ref_properties.getColumn(this._transform, 1); + // Up direction has to be flipped to point towards north + return [-col[0], -col[1], -col[2]]; + } - const definesValues = lineDefinesValues(layer); - let useStencilMaskRenderPass = definesValues.includes('RENDER_LINE_ALPHA_DISCARD'); - if (painter.terrain && painter.terrain.clipOrMaskOverlapStencilType()) { - useStencilMaskRenderPass = false; + right() { + const col = ref_properties.getColumn(this._transform, 0); + return [col[0], col[1], col[2]]; } - for (const coord of coords) { - const tile = sourceCache.getTile(coord); - if (image && !tile.patternsLoaded()) continue; + getCameraToWorld(worldSize , pixelsPerMeter ) { + const cameraToWorld = new Float64Array(16); + ref_properties.invert$1(cameraToWorld, this.getWorldToCamera(worldSize, pixelsPerMeter)); + return cameraToWorld; + } - const bucket = (tile.getBucket(layer) ); - if (!bucket) continue; - painter.prepareDrawTile(coord); + getWorldToCameraPosition(worldSize , pixelsPerMeter , uniformScale ) { + const invPosition = this.position; - const programConfiguration = bucket.programConfigurations.get(layer.id); - const program = painter.useProgram(programId, programConfiguration, ((definesValues ) )); + ref_properties.scale$3(invPosition, invPosition, -worldSize); + const matrix = new Float64Array(16); + ref_properties.fromScaling(matrix, [uniformScale, uniformScale, uniformScale]); + ref_properties.translate(matrix, matrix, invPosition); - const constantPattern = patternProperty.constantOr(null); - if (constantPattern && tile.imageAtlas) { - const atlas = tile.imageAtlas; - const posTo = atlas.patternPositions[constantPattern.to.toString()]; - const posFrom = atlas.patternPositions[constantPattern.from.toString()]; - if (posTo && posFrom) programConfiguration.setConstantPatternPositions(posTo, posFrom); - } + // Adjust scale on z (3rd column 3rd row) + matrix[10] *= pixelsPerMeter; - const constantDash = dasharrayProperty.constantOr(null); - const constantCap = capProperty.constantOr((null )); + return matrix; + } - if (!image && constantDash && constantCap && tile.lineAtlas) { - const atlas = tile.lineAtlas; - const posTo = atlas.getDash(constantDash.to, constantCap); - const posFrom = atlas.getDash(constantDash.from, constantCap); - if (posTo && posFrom) programConfiguration.setConstantPatternPositions(posTo, posFrom); - } + getWorldToCamera(worldSize , pixelsPerMeter ) { + // transformation chain from world space to camera space: + // 1. Height value (z) of renderables is in meters. Scale z coordinate by pixelsPerMeter + // 2. Transform from pixel coordinates to camera space with cameraMatrix^-1 + // 3. flip Y if required - const matrix = painter.terrain ? coord.projMatrix : null; - const uniformValues = image ? - linePatternUniformValues(painter, tile, layer, crossfade, matrix) : - lineUniformValues(painter, tile, layer, crossfade, matrix, bucket.lineClipsArray.length); + // worldToCamera: flip * cam^-1 * zScale + // cameraToWorld: (flip * cam^-1 * zScale)^-1 => (zScale^-1 * cam * flip^-1) + const matrix = new Float64Array(16); - if (gradient) { - const layerGradient = bucket.gradients[layer.id]; - let gradientTexture = layerGradient.texture; - if (layer.gradientVersion !== layerGradient.version) { - let textureResolution = 256; - if (layer.stepInterpolant) { - const sourceMaxZoom = sourceCache.getSource().maxzoom; - const potentialOverzoom = coord.canonical.z === sourceMaxZoom ? - Math.ceil(1 << (painter.transform.maxZoom - coord.canonical.z)) : 1; - const lineLength = bucket.maxLineLength / transform.EXTENT; - // Logical pixel tile size is 512px, and 1024px right before current zoom + 1 - const maxTilePixelSize = 1024; - // Maximum possible texture coverage heuristic, bound by hardware max texture size - const maxTextureCoverage = lineLength * maxTilePixelSize * potentialOverzoom; - textureResolution = transform.clamp(transform.nextPowerOfTwo(maxTextureCoverage), 256, context.maxTextureSize); - } - layerGradient.gradient = transform.renderColorRamp({ - expression: layer.gradientExpression(), - evaluationKey: 'lineProgress', - resolution: textureResolution, - image: layerGradient.gradient || undefined, - clips: bucket.lineClipsArray - }); - if (layerGradient.texture) { - layerGradient.texture.update(layerGradient.gradient); - } else { - layerGradient.texture = new transform.Texture(context, layerGradient.gradient, gl.RGBA); - } - layerGradient.version = layer.gradientVersion; - gradientTexture = layerGradient.texture; - } - context.activeTexture.set(gl.TEXTURE1); - gradientTexture.bind(layer.stepInterpolant ? gl.NEAREST : gl.LINEAR, gl.CLAMP_TO_EDGE); - } - if (dasharray) { - context.activeTexture.set(gl.TEXTURE0); - tile.lineAtlasTexture.bind(gl.LINEAR, gl.REPEAT); - programConfiguration.updatePaintBuffers(crossfade); - } - if (image) { - context.activeTexture.set(gl.TEXTURE0); - tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - programConfiguration.updatePaintBuffers(crossfade); - } + // Compute inverse of camera matrix and post-multiply negated translation + const invOrientation = new Float64Array(4); + const invPosition = this.position; - painter.prepareDrawProgram(context, program, coord.toUnwrapped()); + ref_properties.conjugate(invOrientation, this._orientation); + ref_properties.scale$3(invPosition, invPosition, -worldSize); - const renderLine = (stencilMode) => { - program.draw(context, gl.TRIANGLES, depthMode, - stencilMode, colorMode, transform.CullFaceMode.disabled, uniformValues, - layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, - layer.paint, painter.transform.zoom, programConfiguration, bucket.layoutVertexBuffer2); - }; + ref_properties.fromQuat(matrix, invOrientation); - if (useStencilMaskRenderPass) { - const stencilId = painter.stencilModeForClipping(coord).ref; - // When terrain is on, ensure that the stencil buffer has 0 values. - // As stencil may be disabled when it is not in overlapping stencil - // mode. Refer to stencilModeForRTTOverlap logic. - if (stencilId === 0 && painter.terrain) { - context.clear({stencil: 0}); - } - const stencilFunc = {func: gl.EQUAL, mask: 0xFF}; + ref_properties.translate(matrix, matrix, invPosition); - // Allow line geometry fragment to be drawn only once: - // - Invert the stencil identifier left by stencil clipping, this - // ensures that we are not conflicting with neighborhing tiles. - // - Draw Anti-Aliased pixels with a threshold set to 0.8, this - // may draw Anti-Aliased pixels more than once, but due to their - // low opacity, these pixels are usually invisible and potential - // overlapping pixel artifacts locally minimized. - uniformValues['u_alpha_discard_threshold'] = 0.8; - renderLine(new transform.StencilMode(stencilFunc, stencilId, 0xFF, gl.KEEP, gl.KEEP, gl.INVERT)); - uniformValues['u_alpha_discard_threshold'] = 0.0; - renderLine(new transform.StencilMode(stencilFunc, stencilId, 0xFF, gl.KEEP, gl.KEEP, gl.KEEP)); - } else { - renderLine(painter.stencilModeForClipping(coord)); - } + // Pre-multiply y (2nd row) + matrix[1] *= -1.0; + matrix[5] *= -1.0; + matrix[9] *= -1.0; + matrix[13] *= -1.0; + + // Post-multiply z (3rd column) + matrix[8] *= pixelsPerMeter; + matrix[9] *= pixelsPerMeter; + matrix[10] *= pixelsPerMeter; + matrix[11] *= pixelsPerMeter; + + return matrix; } - // When rendering to stencil, reset the mask to make sure that the tile - // clipping reverts the stencil mask we may have drawn in the buffer. - // The stamp could be reverted by an extra draw call of line geometry, - // but tile clipping drawing is usually faster to draw than lines. - if (useStencilMaskRenderPass) { - painter.resetStencilClippingMasks(); - if (painter.terrain) { context.clear({stencil: 0}); } + getCameraToClipPerspective(fovy , aspectRatio , nearZ , farZ ) { + const matrix = new Float64Array(16); + ref_properties.perspective(matrix, fovy, aspectRatio, nearZ, farZ); + return matrix; + } + + getDistanceToElevation(elevationMeters ) { + const z0 = elevationMeters === 0 ? 0 : ref_properties.mercatorZfromAltitude(elevationMeters, this.position[1]); + const f = this.forward(); + return (z0 - this.position[2]) / f[2]; + } + + clone() { + return new FreeCamera([...this.position], [...this.orientation]); } } // -function drawFill(painter , sourceCache , layer , coords ) { - const color = layer.paint.get('fill-color'); - const opacity = layer.paint.get('fill-opacity'); + + - if (opacity.constantOr(1) === 0) { - return; - } +function getProjectionAdjustments(transform , withoutRotation ) { + const interpT = getProjectionInterpolationT(transform.projection, transform.zoom, transform.width, transform.height); + const matrix = getShearAdjustment(transform.projection, transform.zoom, transform.center, interpT, withoutRotation); - const colorMode = painter.colorModeForRenderPass(); + const scaleAdjustment = getScaleAdjustment(transform); + ref_properties.scale$1(matrix, matrix, [scaleAdjustment, scaleAdjustment, 1]); - const pattern = layer.paint.get('fill-pattern'); - const pass = painter.opaquePassEnabledForLayer() && - (!pattern.constantOr((1 )) && - color.constantOr(transform.Color.transparent).a === 1 && - opacity.constantOr(0) === 1) ? 'opaque' : 'translucent'; + return matrix; +} - // Draw fill - if (painter.renderPass === pass) { - const depthMode = painter.depthModeForSublayer( - 1, painter.renderPass === 'opaque' ? transform.DepthMode.ReadWrite : transform.DepthMode.ReadOnly); - drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, false); - } +function getScaleAdjustment(transform ) { + const projection = transform.projection; + const interpT = getProjectionInterpolationT(transform.projection, transform.zoom, transform.width, transform.height); + const zoomAdjustment = getZoomAdjustment(projection, transform.center); + const zoomAdjustmentOrigin = getZoomAdjustment(projection, ref_properties.LngLat.convert(projection.center)); + const scaleAdjustment = Math.pow(2, zoomAdjustment * interpT + (1 - interpT) * zoomAdjustmentOrigin); + return scaleAdjustment; +} - // Draw stroke - if (painter.renderPass === 'translucent' && layer.paint.get('fill-antialias')) { +function getProjectionAdjustmentInverted(transform ) { + const m = getProjectionAdjustments(transform, true); + return ref_properties.invert([], [ + m[0], m[1], + m[4], m[5]]); +} - // 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. - const depthMode = painter.depthModeForSublayer( - layer.getPaintProperty('fill-outline-color') ? 2 : 0, transform.DepthMode.ReadOnly); - drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, true); - } +function getProjectionInterpolationT(projection , zoom , width , height , maxSize = Infinity) { + const range = projection.range; + if (!range) return 0; + + const size = Math.min(maxSize, Math.max(width, height)); + // The interpolation ranges are manually defined based on what makes + // sense in a 1024px wide map. Adjust the ranges to the current size + // of the map. The smaller the map, the earlier you can start unskewing. + const rangeAdjustment = Math.log(size / 1024) / Math.LN2; + const zoomA = range[0] + rangeAdjustment; + const zoomB = range[1] + rangeAdjustment; + const t = ref_properties.smoothstep(zoomA, zoomB, zoom); + return t; } -function drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, isOutline) { - const gl = painter.context.gl; +// approx. kilometers per longitude degree at equator +const offset = 1 / 40000; - const patternProperty = layer.paint.get('fill-pattern'); - const image = patternProperty && patternProperty.constantOr((1 )); - const crossfade = layer.getCrossfadeParameters(); - let drawMode, programName, uniformValues, indexBuffer, segments; +/* + * Calculates the scale difference between Mercator and the given projection at a certain location. + */ +function getZoomAdjustment(projection , loc ) { + // make sure we operate within mercator space for adjustments (they can go over for other projections) + const lat = ref_properties.clamp(loc.lat, -ref_properties.MAX_MERCATOR_LATITUDE, ref_properties.MAX_MERCATOR_LATITUDE); - if (!isOutline) { - programName = image ? 'fillPattern' : 'fill'; - drawMode = gl.TRIANGLES; - } else { - programName = image && !layer.getPaintProperty('fill-outline-color') ? 'fillOutlinePattern' : 'fillOutline'; - drawMode = gl.LINES; - } + const loc1 = new ref_properties.LngLat(loc.lng - 180 * offset, lat); + const loc2 = new ref_properties.LngLat(loc.lng + 180 * offset, lat); - for (const coord of coords) { - const tile = sourceCache.getTile(coord); - if (image && !tile.patternsLoaded()) continue; + const p1 = projection.project(loc1.lng, lat); + const p2 = projection.project(loc2.lng, lat); - const bucket = (tile.getBucket(layer) ); - if (!bucket) continue; - painter.prepareDrawTile(coord); + const m1 = ref_properties.MercatorCoordinate.fromLngLat(loc1); + const m2 = ref_properties.MercatorCoordinate.fromLngLat(loc2); - const programConfiguration = bucket.programConfigurations.get(layer.id); - const program = painter.useProgram(programName, programConfiguration); + const pdx = p2.x - p1.x; + const pdy = p2.y - p1.y; + const mdx = m2.x - m1.x; + const mdy = m2.y - m1.y; - if (image) { - painter.context.activeTexture.set(gl.TEXTURE0); - tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - programConfiguration.updatePaintBuffers(crossfade); - } + const scale = Math.sqrt((mdx * mdx + mdy * mdy) / (pdx * pdx + pdy * pdy)); - const constantPattern = patternProperty.constantOr(null); - if (constantPattern && tile.imageAtlas) { - const atlas = tile.imageAtlas; - const posTo = atlas.patternPositions[constantPattern.to.toString()]; - const posFrom = atlas.patternPositions[constantPattern.from.toString()]; - if (posTo && posFrom) programConfiguration.setConstantPatternPositions(posTo, posFrom); - } + return Math.log(scale) / Math.LN2; +} - const tileMatrix = painter.translatePosMatrix(coord.projMatrix, tile, - layer.paint.get('fill-translate'), layer.paint.get('fill-translate-anchor')); +function getShearAdjustment(projection, zoom, loc, interpT, withoutRotation ) { - if (!isOutline) { - indexBuffer = bucket.indexBuffer; - segments = bucket.segments; - uniformValues = image ? - fillPatternUniformValues(tileMatrix, painter, crossfade, tile) : - fillUniformValues(tileMatrix); - } else { - indexBuffer = bucket.indexBuffer2; - segments = bucket.segments2; - const drawingBufferSize = (painter.terrain && painter.terrain.renderingToTexture) ? painter.terrain.drapeBufferSize : [gl.drawingBufferWidth, gl.drawingBufferHeight]; - uniformValues = (programName === 'fillOutlinePattern' && image) ? - fillOutlinePatternUniformValues(tileMatrix, painter, crossfade, tile, drawingBufferSize) : - fillOutlineUniformValues(tileMatrix, drawingBufferSize); - } + // create two locations a tiny amount (~1km) east and west of the given location + const locw = new ref_properties.LngLat(loc.lng - 180 * offset, loc.lat); + const loce = new ref_properties.LngLat(loc.lng + 180 * offset, loc.lat); - painter.prepareDrawProgram(painter.context, program, coord.toUnwrapped()); + const pw = projection.project(locw.lng, locw.lat); + const pe = projection.project(loce.lng, loce.lat); - program.draw(painter.context, drawMode, depthMode, - painter.stencilModeForClipping(coord), colorMode, transform.CullFaceMode.disabled, uniformValues, - layer.id, bucket.layoutVertexBuffer, indexBuffer, segments, - layer.paint, painter.transform.zoom, programConfiguration); - } + const pdx = pe.x - pw.x; + const pdy = pe.y - pw.y; + + // Calculate how much the map would need to be rotated to make east-west in + // projected coordinates be left-right + const angleAdjust = -Math.atan2(pdy, pdx); + + // Pick a location identical to the original one except for poles to make sure we're within mercator bounds + const mc2 = ref_properties.MercatorCoordinate.fromLngLat(loc); + mc2.y = ref_properties.clamp(mc2.y, -1 + offset, 1 - offset); + const loc2 = mc2.toLngLat(); + const p2 = projection.project(loc2.lng, loc2.lat); + + // Find the projected coordinates of two locations, one slightly south and one slightly east. + // Then calculate the transform that would make the projected coordinates of the two locations be: + // - equal distances from the original location + // - perpendicular to one another + // + // Only the position of the coordinate to the north is adjusted. + // The coordinate to the east stays where it is. + const mc3 = ref_properties.MercatorCoordinate.fromLngLat(loc2); + mc3.x += offset; + const loc3 = mc3.toLngLat(); + const p3 = projection.project(loc3.lng, loc3.lat); + const pdx3 = p3.x - p2.x; + const pdy3 = p3.y - p2.y; + const delta3 = rotate(pdx3, pdy3, angleAdjust); + + const mc4 = ref_properties.MercatorCoordinate.fromLngLat(loc2); + mc4.y += offset; + const loc4 = mc4.toLngLat(); + const p4 = projection.project(loc4.lng, loc4.lat); + const pdx4 = p4.x - p2.x; + const pdy4 = p4.y - p2.y; + const delta4 = rotate(pdx4, pdy4, angleAdjust); + + const scale = Math.abs(delta3.x) / Math.abs(delta4.y); + + const unrotate = ref_properties.identity([]); + ref_properties.rotateZ(unrotate, unrotate, (-angleAdjust) * (1 - (withoutRotation ? 0 : interpT))); + + // unskew + const shear = ref_properties.identity([]); + ref_properties.scale$1(shear, shear, [1, 1 - (1 - scale) * interpT, 1]); + shear[4] = -delta4.x / delta4.y * interpT; + + // unrotate + ref_properties.rotateZ(shear, shear, angleAdjust); + + ref_properties.multiply(shear, unrotate, shear); + + return shear; +} + +function rotate(x, y, angle) { + const cos = Math.cos(angle); + const sin = Math.sin(angle); + return { + x: x * cos - y * sin, + y: x * sin + y * cos + }; } // -function draw(painter , source , layer , coords ) { - const opacity = layer.paint.get('fill-extrusion-opacity'); - if (opacity === 0) { - return; - } + + + + + + + - if (painter.renderPass === 'translucent') { - const depthMode = new transform.DepthMode(painter.context.gl.LEQUAL, transform.DepthMode.ReadWrite, painter.depthRangeFor3D); +const NUM_WORLD_COPIES = 3; +const DEFAULT_MIN_ZOOM = 0; - if (opacity === 1 && !layer.paint.get('fill-extrusion-pattern').constantOr((1 ))) { - const colorMode = painter.colorModeForRenderPass(); - drawExtrusionTiles(painter, source, layer, coords, depthMode, transform.StencilMode.disabled, colorMode); + + - } else { - // Draw transparent buildings in two passes so that only the closest surface is drawn. - // First draw all the extrusions into only the depth buffer. No colors are drawn. - drawExtrusionTiles(painter, source, layer, coords, depthMode, - transform.StencilMode.disabled, - transform.ColorMode.disabled); +/** + * A single transform, generally used for a single tile to be + * scaled, rotated, and zoomed. + * @private + */ +class Transform { + + + - // Then draw all the extrusions a second type, only coloring fragments if they have the - // same depth value as the closest fragment in the previous pass. Use the stencil buffer - // to prevent the second draw in cases where we have coincident polygons. - drawExtrusionTiles(painter, source, layer, coords, depthMode, - painter.stencilModeFor3D(), - painter.colorModeForRenderPass()); + // 2^zoom (worldSize = tileSize * scale) + - painter.resetStencilClippingMasks(); - } - } -} + // Map viewport size (not including the pixel ratio) + + -function drawExtrusionTiles(painter, source, layer, coords, depthMode, stencilMode, colorMode) { - const context = painter.context; - const gl = context.gl; - const patternProperty = layer.paint.get('fill-extrusion-pattern'); - const image = patternProperty.constantOr((1 )); - const crossfade = layer.getCrossfadeParameters(); - const opacity = layer.paint.get('fill-extrusion-opacity'); + // Bearing, radians, in [-pi, pi] + - for (const coord of coords) { - const tile = source.getTile(coord); - const bucket = (tile.getBucket(layer) ); - if (!bucket) continue; + // 2D rotation matrix in the horizontal plane, as a function of bearing + - const programConfiguration = bucket.programConfigurations.get(layer.id); - const program = painter.useProgram(image ? 'fillExtrusionPattern' : 'fillExtrusion', programConfiguration); + // Zoom, modulo 1 + - if (painter.terrain) { - const terrain = painter.terrain; - if (!bucket.enableTerrain) continue; - terrain.setupElevationDraw(tile, program, {useMeterToDem: true}); - flatRoofsUpdate(context, source, coord, bucket, layer, terrain); - if (!bucket.centroidVertexBuffer) { - const attrIndex = program.attributes['a_centroid_pos']; - if (attrIndex !== undefined) gl.vertexAttrib2f(attrIndex, 0, 0); - } - } + // The scale factor component of the conversion from pixels ([0, w] x [h, 0]) to GL + // NDC ([1, -1] x [1, -1]) (note flipped y) + - if (image) { - painter.context.activeTexture.set(gl.TEXTURE0); - tile.imageAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - programConfiguration.updatePaintBuffers(crossfade); - } - const constantPattern = patternProperty.constantOr(null); - if (constantPattern && tile.imageAtlas) { - const atlas = tile.imageAtlas; - const posTo = atlas.patternPositions[constantPattern.to.toString()]; - const posFrom = atlas.patternPositions[constantPattern.from.toString()]; - if (posTo && posFrom) programConfiguration.setConstantPatternPositions(posTo, posFrom); - } + // Distance from camera to the center, in screen pixel units, independent of zoom + - const matrix = painter.translatePosMatrix( - coord.projMatrix, - tile, - layer.paint.get('fill-extrusion-translate'), - layer.paint.get('fill-extrusion-translate-anchor')); + // Projection from mercator coordinates ([0, 0] nw, [1, 1] se) to GL clip coordinates + - const shouldUseVerticalGradient = layer.paint.get('fill-extrusion-vertical-gradient'); - const uniformValues = image ? - fillExtrusionPatternUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, coord, crossfade, tile) : - fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity); + // Translate points in mercator coordinates to be centered about the camera, with units chosen + // for screen-height-independent scaling of fog. Not affected by orientation of camera. + - painter.prepareDrawProgram(context, program, coord.toUnwrapped()); + // Projection from world coordinates (mercator scaled by worldSize) to clip coordinates + + - program.draw(context, context.gl.TRIANGLES, depthMode, stencilMode, colorMode, transform.CullFaceMode.backCCW, - uniformValues, layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, - bucket.segments, layer.paint, painter.transform.zoom, - programConfiguration, painter.terrain ? bucket.centroidVertexBuffer : null); - } -} + // Same as projMatrix, pixel-aligned to avoid fractional pixels for raster tiles + -// Flat roofs array is prepared in the bucket, except for buildings that are on tile borders. -// For them, join pieces, calculate joined size here, and then upload data. -function flatRoofsUpdate(context, source, coord, bucket, layer, terrain) { - // For all four borders: 0 - left, 1, right, 2 - top, 3 - bottom - const neighborCoord = [ - coord => { - let x = coord.canonical.x - 1; - let w = coord.wrap; - if (x < 0) { - x = (1 << coord.canonical.z) - 1; - w--; - } - return new transform.OverscaledTileID(coord.overscaledZ, w, coord.canonical.z, x, coord.canonical.y); - }, - coord => { - let x = coord.canonical.x + 1; - let w = coord.wrap; - if (x === 1 << coord.canonical.z) { - x = 0; - w++; - } - return new transform.OverscaledTileID(coord.overscaledZ, w, coord.canonical.z, x, coord.canonical.y); - }, - coord => new transform.OverscaledTileID(coord.overscaledZ, coord.wrap, coord.canonical.z, coord.canonical.x, - (coord.canonical.y === 0 ? 1 << coord.canonical.z : coord.canonical.y) - 1), - coord => new transform.OverscaledTileID(coord.overscaledZ, coord.wrap, coord.canonical.z, coord.canonical.x, - coord.canonical.y === (1 << coord.canonical.z) - 1 ? 0 : coord.canonical.y + 1) - ]; + // From world coordinates to screen pixel coordinates (projMatrix premultiplied by labelPlaneMatrix) + + - const getLoadedBucket = (nid) => { - const maxzoom = source.getSource().maxzoom; - const getBucket = (key) => { - const n = source.getTileByID(key); - if (n && n.hasData()) { - return n.getBucket(layer); - } - }; - // In overscale range, we look one tile zoom above and under. We do this to avoid - // flickering and use the content in Z-1 and Z+1 buckets until Z bucket is loaded. - let b0, b1, b2; - if (nid.overscaledZ === nid.canonical.z || nid.overscaledZ >= maxzoom) - b0 = getBucket(nid.key); - if (nid.overscaledZ >= maxzoom) - b1 = getBucket(nid.calculateScaledKey(nid.overscaledZ + 1)); - if (nid.overscaledZ > maxzoom) - b2 = getBucket(nid.calculateScaledKey(nid.overscaledZ - 1)); - return b0 || b1 || b2; - }; + + - const projectedToBorder = [0, 0, 0]; // [min, max, maxOffsetFromBorder] - const xjoin = (a, b) => { - projectedToBorder[0] = Math.min(a.min.y, b.min.y); - projectedToBorder[1] = Math.max(a.max.y, b.max.y); - projectedToBorder[2] = transform.EXTENT - b.min.x > a.max.x ? b.min.x - transform.EXTENT : a.max.x; - return projectedToBorder; - }; - const yjoin = (a, b) => { - projectedToBorder[0] = Math.min(a.min.x, b.min.x); - projectedToBorder[1] = Math.max(a.max.x, b.max.x); - projectedToBorder[2] = transform.EXTENT - b.min.y > a.max.y ? b.min.y - transform.EXTENT : a.max.y; - return projectedToBorder; - }; - const projectCombinedSpanToBorder = [ - (a, b) => xjoin(a, b), - (a, b) => xjoin(b, a), - (a, b) => yjoin(a, b), - (a, b) => yjoin(b, a) - ]; + // Transform from screen coordinates to GL NDC, [0, w] x [h, 0] --> [-1, 1] x [-1, 1] + // Roughly speaking, applies pixelsToGLUnits scaling with a translation + - const centroid = new transform.pointGeometry(0, 0); - const error = 3; // Allow intrusion of a building to the building with adjacent wall. + // Inverse of glCoordMatrix, from NDC to screen coordinates, [-1, 1] x [-1, 1] --> [0, w] x [h, 0] + - let demTile, neighborDEMTile, neighborTileID; + // globe coordinate transformation matrix + - const flatBase = (min, max, edge, verticalEdge, maxOffsetFromBorder) => { - const points = [[verticalEdge ? edge : min, verticalEdge ? min : edge, 0], [verticalEdge ? edge : max, verticalEdge ? max : edge, 0]]; + + - const coord3 = maxOffsetFromBorder < 0 ? transform.EXTENT + maxOffsetFromBorder : maxOffsetFromBorder; - const thirdPoint = [verticalEdge ? coord3 : (min + max) / 2, verticalEdge ? (min + max) / 2 : coord3, 0]; - if ((edge === 0 && maxOffsetFromBorder < 0) || (edge !== 0 && maxOffsetFromBorder > 0)) { - // Third point is inside neighbor tile, not in the |coord| tile. - terrain.getForTilePoints(neighborTileID, [thirdPoint], true, neighborDEMTile); - } else { - points.push(thirdPoint); - } - terrain.getForTilePoints(coord, points, true, demTile); - return Math.max(points[0][2], points[1][2], thirdPoint[2]) / terrain.exaggeration(); - }; + - // Process all four borders: get neighboring tile - for (let i = 0; i < 4; i++) { - // Sort by border intersection area minimums, ascending. - const a = bucket.borders[i]; - if (a.length === 0) { bucket.borderDone[i] = true; } - if (bucket.borderDone[i]) continue; - const nid = neighborTileID = neighborCoord[i](coord); - const nBucket = getLoadedBucket(nid); - if (!nBucket || !nBucket.enableTerrain) continue; + - neighborDEMTile = terrain.findDEMTileFor(nid); - if (!neighborDEMTile || !neighborDEMTile.dem) continue; - if (!demTile) { - const dem = terrain.findDEMTileFor(coord); - if (!(dem && dem.dem)) return; // defer update until an elevation tile is available. - demTile = dem; - } - const j = (i < 2 ? 1 : 5) - i; - const b = nBucket.borders[j]; - let ib = 0; - for (let ia = 0; ia < a.length; ia++) { - const parta = bucket.featuresOnBorder[a[ia]]; - const partABorderRange = parta.borders[i]; - // Find all nBucket parts that share the border overlap. - let partb; - while (ib < b.length) { - // Pass all that are before the overlap. - partb = nBucket.featuresOnBorder[b[ib]]; - const partBBorderRange = partb.borders[j]; - if (partBBorderRange[1] > partABorderRange[0] + error) break; - if (!nBucket.borderDone[j]) nBucket.encodeCentroid(undefined, partb, false); - ib++; - } - if (partb && ib < b.length) { - const saveIb = ib; - let count = 0; - while (true) { - // Collect all parts overlapping parta on the edge, to make sure it is only one. - const partBBorderRange = partb.borders[j]; - if (partBBorderRange[0] > partABorderRange[1] - error) break; - count++; - if (++ib === b.length) break; - partb = nBucket.featuresOnBorder[b[ib]]; - } - partb = nBucket.featuresOnBorder[b[saveIb]]; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + constructor(minZoom , maxZoom , minPitch , maxPitch , renderWorldCopies , projection , bounds ) { + this.tileSize = 512; // constant + + this._renderWorldCopies = renderWorldCopies === undefined ? true : renderWorldCopies; + this._minZoom = minZoom || DEFAULT_MIN_ZOOM; + this._maxZoom = maxZoom || 22; + + this._minPitch = (minPitch === undefined || minPitch === null) ? 0 : minPitch; + this._maxPitch = (maxPitch === undefined || maxPitch === null) ? 60 : maxPitch; + + this.setProjection(projection); + this.setMaxBounds(bounds); + + this.width = 0; + this.height = 0; + this._center = new ref_properties.LngLat(0, 0); + this.zoom = 0; + this.angle = 0; + this._fov = 0.6435011087932844; + this._pitch = 0; + this._nearZ = 0; + this._farZ = 0; + this._unmodified = true; + this._edgeInsets = new EdgeInsets(); + this._projMatrixCache = {}; + this._alignedProjMatrixCache = {}; + this._fogTileMatrixCache = {}; + this._distanceTileDataCache = {}; + this._camera = new FreeCamera(); + this._centerAltitude = 0; + this._averageElevation = 0; + this.cameraElevationReference = "ground"; + this._projectionScaler = 1.0; + this.globeRadius = 0; + this.globeCenterInViewSpace = [0, 0, 0]; + + // Move the horizon closer to the center. 0 would not shift the horizon. 1 would put the horizon at the center. + this._horizonShift = 0.1; + } + + clone() { + const clone = new Transform(this._minZoom, this._maxZoom, this._minPitch, this.maxPitch, this._renderWorldCopies, this.getProjection()); + clone._elevation = this._elevation; + clone._centerAltitude = this._centerAltitude; + clone._centerAltitudeValidForExaggeration = this._centerAltitudeValidForExaggeration; + clone.tileSize = this.tileSize; + clone.width = this.width; + clone.height = this.height; + clone.cameraElevationReference = this.cameraElevationReference; + clone._center = this._center; + clone._setZoom(this.zoom); + clone._seaLevelZoom = this._seaLevelZoom; + clone.angle = this.angle; + clone._fov = this._fov; + clone._pitch = this._pitch; + clone._nearZ = this._nearZ; + clone._farZ = this._farZ; + clone._averageElevation = this._averageElevation; + clone._unmodified = this._unmodified; + clone._edgeInsets = this._edgeInsets.clone(); + clone._camera = this._camera.clone(); + clone._calcMatrices(); + clone.freezeTileCoverage = this.freezeTileCoverage; + clone.frustumCorners = this.frustumCorners; + return clone; + } - // If any of a or b crosses more than one tile edge, don't support flat roof. - if (parta.intersectsCount() > 1 || partb.intersectsCount() > 1 || count !== 1) { - if (count !== 1) { - ib = saveIb; // rewind unprocessed ib so that it is processed again for the next ia. - } + get elevation() { return this._elevation; } + set elevation(elevation ) { + if (this._elevation === elevation) return; + this._elevation = elevation; + this._updateCameraOnTerrain(); + this._calcMatrices(); + } + updateElevation(constrainCameraOverTerrain ) { // On render, no need for higher granularity on update reasons. + const centerAltitudeChanged = this._elevation && this._elevation.exaggeration() !== this._centerAltitudeValidForExaggeration; + if (this._seaLevelZoom == null || centerAltitudeChanged) { + this._updateCameraOnTerrain(); + } + if (constrainCameraOverTerrain || centerAltitudeChanged) { + this._constrainCameraAltitude(); + } + this._calcMatrices(); + } - bucket.encodeCentroid(undefined, parta, false); - if (!nBucket.borderDone[j]) nBucket.encodeCentroid(undefined, partb, false); - continue; - } + getProjection() { + return (ref_properties.pick(this.projection, ['name', 'center', 'parallels']) ); + } - // Now we have 1-1 matching of parts in both tiles that share the edge. Calculate flat base elevation - // as average of three points: 2 are edge points (combined span projected to border) and one is point of - // span that has maximum offset to border. - const span = projectCombinedSpanToBorder[i](parta, partb); - const edge = (i % 2) ? transform.EXTENT - 1 : 0; - centroid.x = flatBase(span[0], Math.min(transform.EXTENT - 1, span[1]), edge, i < 2, span[2]); - centroid.y = 0; - transform.assert_1(parta.vertexArrayOffset !== undefined && parta.vertexArrayOffset < bucket.layoutVertexArray.length); - bucket.encodeCentroid(centroid, parta, false); + // Returns whether the projection changes + setProjection(projection ) { + this.projectionOptions = projection || {name: 'mercator'}; - transform.assert_1(partb.vertexArrayOffset !== undefined && partb.vertexArrayOffset < nBucket.layoutVertexArray.length); - if (!nBucket.borderDone[j]) nBucket.encodeCentroid(centroid, partb, false); - } else { - transform.assert_1(parta.intersectsCount() > 1 || (partb && partb.intersectsCount() > 1)); // expected at the end of border, when buildings cover corner (show building w/o flat roof). - bucket.encodeCentroid(undefined, parta, false); - } - } + const oldProjection = this.projection ? this.getProjection() : undefined; + this.projection = ref_properties.getProjection(this.projectionOptions); + const newProjection = this.getProjection(); - bucket.borderDone[i] = bucket.needsCentroidUpdate = true; - if (!nBucket.borderDone[j]) { - nBucket.borderDone[j] = nBucket.needsCentroidUpdate = true; + const projectionHasChanged = !ref_properties.deepEqual(oldProjection, newProjection); + if (projectionHasChanged) { + this._calcMatrices(); } + + return projectionHasChanged; } - if (bucket.needsCentroidUpdate || (!bucket.centroidVertexBuffer && bucket.centroidVertexArray.length !== 0)) { - bucket.uploadCentroid(context); + get minZoom() { return this._minZoom; } + set minZoom(zoom ) { + if (this._minZoom === zoom) return; + this._minZoom = zoom; + this.zoom = Math.max(this.zoom, zoom); } -} -// + get maxZoom() { return this._maxZoom; } + set maxZoom(zoom ) { + if (this._maxZoom === zoom) return; + this._maxZoom = zoom; + this.zoom = Math.min(this.zoom, zoom); + } -function drawRaster(painter , sourceCache , layer , tileIDs , variableOffsets , isInitialLoad ) { - if (painter.renderPass !== 'translucent') return; - if (layer.paint.get('raster-opacity') === 0) return; - if (!tileIDs.length) return; + get minPitch() { return this._minPitch; } + set minPitch(pitch ) { + if (this._minPitch === pitch) return; + this._minPitch = pitch; + this.pitch = Math.max(this.pitch, pitch); + } - const context = painter.context; - const gl = context.gl; - const source = sourceCache.getSource(); - const program = painter.useProgram('raster'); + get maxPitch() { return this._maxPitch; } + set maxPitch(pitch ) { + if (this._maxPitch === pitch) return; + this._maxPitch = pitch; + this.pitch = Math.min(this.pitch, pitch); + } - const colorMode = painter.colorModeForRenderPass(); + get renderWorldCopies() { + return this._renderWorldCopies && this.projection.supportsWorldCopies === true; + } + set renderWorldCopies(renderWorldCopies ) { + if (renderWorldCopies === undefined) { + renderWorldCopies = true; + } else if (renderWorldCopies === null) { + renderWorldCopies = false; + } - // When rendering to texture, coordinates are already sorted: primary by - // proxy id and secondary sort is by Z. - const renderingToTexture = painter.terrain && painter.terrain.renderingToTexture; + this._renderWorldCopies = renderWorldCopies; + } - const [stencilModes, coords] = source instanceof ImageSource || renderingToTexture ? [{}, tileIDs] : - painter.stencilConfigForOverlap(tileIDs); + get worldSize() { + return this.tileSize * this.scale; + } - const minTileZ = coords[coords.length - 1].overscaledZ; + get cameraWorldSize() { + const distance = Math.max(this._camera.getDistanceToElevation(this._averageElevation), Number.EPSILON); + return this._worldSizeFromZoom(this._zoomFromMercatorZ(distance)); + } - const align = !painter.options.moving; - for (const coord of coords) { - // 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. - const depthMode = renderingToTexture ? transform.DepthMode.disabled : painter.depthModeForSublayer(coord.overscaledZ - minTileZ, - layer.paint.get('raster-opacity') === 1 ? transform.DepthMode.ReadWrite : transform.DepthMode.ReadOnly, gl.LESS); + get pixelsPerMeter() { + return this.projection.pixelsPerMeter(this.center.lat, this.worldSize); + } - const unwrappedTileID = coord.toUnwrapped(); - const tile = sourceCache.getTile(coord); - if (renderingToTexture && !(tile && tile.hasData())) continue; + get cameraPixelsPerMeter() { + return ref_properties.mercatorZfromAltitude(this.center.lat, this.cameraWorldSize); + } - const projMatrix = (renderingToTexture) ? coord.projMatrix : - painter.transform.calculateProjMatrix(unwrappedTileID, align); + get centerOffset() { + return this.centerPoint._sub(this.size._div(2)); + } - const stencilMode = painter.terrain && renderingToTexture ? - painter.terrain.stencilModeForRTTOverlap(coord) : - stencilModes[coord.overscaledZ]; + get size() { + return new ref_properties.pointGeometry(this.width, this.height); + } - const rasterFadeDuration = isInitialLoad ? 0 : layer.paint.get('raster-fade-duration'); - tile.registerFadeDuration(rasterFadeDuration); + get bearing() { + return ref_properties.wrap(this.rotation, -180, 180); + } - const parentTile = sourceCache.findLoadedParent(coord, 0); - const fade = rasterFade(tile, parentTile, sourceCache, painter.transform, rasterFadeDuration); - if (painter.terrain) painter.terrain.prepareDrawTile(coord); + set bearing(bearing ) { + this.rotation = bearing; + } - let parentScaleBy, parentTL; + get rotation() { + return -this.angle / Math.PI * 180; + } - const textureFilter = layer.paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR; + set rotation(rotation ) { + const b = -rotation * Math.PI / 180; + if (this.angle === b) return; + this._unmodified = false; + this.angle = b; + this._calcMatrices(); - context.activeTexture.set(gl.TEXTURE0); - tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE); + // 2x2 matrix for rotating points + this.rotationMatrix = ref_properties.create$2(); + ref_properties.rotate(this.rotationMatrix, this.rotationMatrix, this.angle); + } - context.activeTexture.set(gl.TEXTURE1); + get pitch() { + return this._pitch / Math.PI * 180; + } + set pitch(pitch ) { + const p = ref_properties.clamp(pitch, this.minPitch, this.maxPitch) / 180 * Math.PI; + if (this._pitch === p) return; + this._unmodified = false; + this._pitch = p; + this._calcMatrices(); + } - if (parentTile) { - parentTile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE); - parentScaleBy = Math.pow(2, parentTile.tileID.overscaledZ - tile.tileID.overscaledZ); - parentTL = [tile.tileID.canonical.x * parentScaleBy % 1, tile.tileID.canonical.y * parentScaleBy % 1]; + get fov() { + return this._fov / Math.PI * 180; + } + set fov(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(); + } - } else { - tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE); + get averageElevation() { + return this._averageElevation; + } + set averageElevation(averageElevation ) { + this._averageElevation = averageElevation; + this._calcFogMatrices(); + this._distanceTileDataCache = {}; + } + + get zoom() { return this._zoom; } + set zoom(zoom ) { + const z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom); + if (this._zoom === z) return; + this._unmodified = false; + this._setZoom(z); + this._updateSeaLevelZoom(); + this._constrain(); + this._calcMatrices(); + } + _setZoom(z ) { + this._zoom = z; + this.scale = this.zoomScale(z); + this.tileZoom = Math.floor(z); + this.zoomFraction = z - this.tileZoom; + } + + _updateCameraOnTerrain() { + if (!this._elevation || !this._elevation.isDataAvailableAtPoint(this.locationCoordinate(this.center))) { + // Elevation data not loaded yet, reset + this._centerAltitude = 0; + this._seaLevelZoom = null; + this._centerAltitudeValidForExaggeration = undefined; + return; } + const elevation = this._elevation; + this._centerAltitude = elevation.getAtPointOrZero(this.locationCoordinate(this.center)); + this._centerAltitudeValidForExaggeration = elevation.exaggeration(); + this._updateSeaLevelZoom(); + } - const perspectiveTransform = source instanceof ImageSource ? source.perspectiveTransform : [0, 0]; - const uniformValues = rasterUniformValues(projMatrix, parentTL || [0, 0], parentScaleBy || 1, fade, layer, perspectiveTransform); + _updateSeaLevelZoom() { + if (this._centerAltitudeValidForExaggeration === undefined) { + return; + } + const height = this.cameraToCenterDistance; + const terrainElevation = this.pixelsPerMeter * this._centerAltitude; + const mercatorZ = (terrainElevation + height) / this.worldSize; - painter.prepareDrawProgram(context, program, unwrappedTileID); + // MSL (Mean Sea Level) zoom describes the distance of the camera to the sea level (altitude). + // It is used only for manipulating the camera location. The standard zoom (this._zoom) + // defines the camera distance to the terrain (height). Its behavior and conceptual + // meaning in determining which tiles to stream is same with or without the terrain. + this._seaLevelZoom = this._zoomFromMercatorZ(mercatorZ); + } - if (source instanceof ImageSource) { - program.draw(context, gl.TRIANGLES, depthMode, transform.StencilMode.disabled, colorMode, transform.CullFaceMode.disabled, - uniformValues, layer.id, source.boundsBuffer, - painter.quadTriangleIndexBuffer, source.boundsSegments); - } else { - const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getTileBoundsBuffers(tile); + sampleAverageElevation() { + if (!this._elevation) return 0; + const elevation = this._elevation; - program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, transform.CullFaceMode.disabled, - uniformValues, layer.id, tileBoundsBuffer, - tileBoundsIndexBuffer, tileBoundsSegments); + const elevationSamplePoints = [ + [0.5, 0.2], + [0.3, 0.5], + [0.5, 0.5], + [0.7, 0.5], + [0.5, 0.8] + ]; + + const horizon = this.horizonLineFromTop(); + + let elevationSum = 0.0; + let weightSum = 0.0; + for (let i = 0; i < elevationSamplePoints.length; i++) { + const pt = new ref_properties.pointGeometry( + elevationSamplePoints[i][0] * this.width, + horizon + elevationSamplePoints[i][1] * (this.height - horizon) + ); + const hit = elevation.pointCoordinate(pt); + if (!hit) continue; + + const distanceToHit = Math.hypot(hit[0] - this._camera.position[0], hit[1] - this._camera.position[1]); + const weight = 1 / distanceToHit; + elevationSum += hit[3] * weight; + weightSum += weight; } + + if (weightSum === 0) return NaN; + return elevationSum / weightSum; } - painter.resetStencilClippingMasks(); -} + get center() { return this._center; } + set center(center ) { + if (center.lat === this._center.lat && center.lng === this._center.lng) return; -// + this._unmodified = false; + this._center = center; + if (this._terrainEnabled()) { + if (this.cameraElevationReference === "ground") { + this._updateCameraOnTerrain(); + } else { + this._updateZoomFromElevation(); + } + } + this._constrain(); + this._calcMatrices(); + } -function drawBackground(painter , sourceCache , layer , coords ) { - const color = layer.paint.get('background-color'); - const opacity = layer.paint.get('background-opacity'); + _updateZoomFromElevation() { + if (this._seaLevelZoom == null || !this._elevation) + return; - if (opacity === 0) return; + // Compute zoom level from the height of the camera relative to the terrain + const seaLevelZoom = this._seaLevelZoom; + const elevationAtCenter = this._elevation.getAtPointOrZero(this.locationCoordinate(this.center)); + const mercatorElevation = this.pixelsPerMeter / this.worldSize * elevationAtCenter; + const altitude = this._mercatorZfromZoom(seaLevelZoom); + const minHeight = this._mercatorZfromZoom(this._maxZoom); + const height = Math.max(altitude - mercatorElevation, minHeight); - const context = painter.context; - const gl = context.gl; - const transform$1 = painter.transform; - const tileSize = transform$1.tileSize; - const image = layer.paint.get('background-pattern'); - if (painter.isPatternMissing(image)) return; + this._setZoom(this._zoomFromMercatorZ(height)); + } - const pass = (!image && color.a === 1 && opacity === 1 && painter.opaquePassEnabledForLayer()) ? 'opaque' : 'translucent'; - if (painter.renderPass !== pass) return; + get padding() { return this._edgeInsets.toJSON(); } + set padding(padding ) { + if (this._edgeInsets.equals(padding)) return; + this._unmodified = false; + //Update edge-insets inplace + this._edgeInsets.interpolate(this._edgeInsets, padding, 1); + this._calcMatrices(); + } - const stencilMode = transform.StencilMode.disabled; - const depthMode = painter.depthModeForSublayer(0, pass === 'opaque' ? transform.DepthMode.ReadWrite : transform.DepthMode.ReadOnly); - const colorMode = painter.colorModeForRenderPass(); + /** + * Computes a zoom value relative to a map plane that goes through the provided mercator position. + * + * @param {MercatorCoordinate} position A position defining the altitude of the the map plane. + * @returns {number} The zoom value. + */ + computeZoomRelativeTo(position ) { + // Find map center position on the target plane by casting a ray from screen center towards the plane. + // Direct distance to the target position is used if the target position is above camera position. + const centerOnTargetAltitude = this.rayIntersectionCoordinate(this.pointRayIntersection(this.centerPoint, position.toAltitude())); - const program = painter.useProgram(image ? 'backgroundPattern' : 'background'); + let targetPosition ; + if (position.z < this._camera.position[2]) { + targetPosition = [centerOnTargetAltitude.x, centerOnTargetAltitude.y, centerOnTargetAltitude.z]; + } else { + targetPosition = [position.x, position.y, position.z]; + } - let tileIDs = coords; - let backgroundTiles; - if (!tileIDs) { - backgroundTiles = painter.getBackgroundTiles(); - tileIDs = Object.values(backgroundTiles).map(tile => (tile ).tileID); + const distToTarget = ref_properties.length(ref_properties.sub([], this._camera.position, targetPosition)); + return ref_properties.clamp(this._zoomFromMercatorZ(distToTarget), this._minZoom, this._maxZoom); } - if (image) { - context.activeTexture.set(gl.TEXTURE0); - painter.imageManager.bind(painter.context); - } + setFreeCameraOptions(options ) { + if (!this.height) + return; - const crossfade = layer.getCrossfadeParameters(); - for (const tileID of tileIDs) { - const unwrappedTileID = tileID.toUnwrapped(); - const matrix = coords ? tileID.projMatrix : painter.transform.calculateProjMatrix(unwrappedTileID); - painter.prepareDrawTile(tileID); + if (!options.position && !options.orientation) + return; - const tile = sourceCache ? sourceCache.getTile(tileID) : - backgroundTiles ? backgroundTiles[tileID.key] : new transform.Tile(tileID, tileSize, transform$1.zoom, painter); + // Camera state must be up-to-date before accessing its getters + this._updateCameraState(); - const uniformValues = image ? - backgroundPatternUniformValues(matrix, opacity, painter, image, {tileID, tileSize}, crossfade) : - backgroundUniformValues(matrix, opacity, color); + let changed = false; + if (options.orientation && !ref_properties.exactEquals(options.orientation, this._camera.orientation)) { + changed = this._setCameraOrientation(options.orientation); + } - painter.prepareDrawProgram(context, program, unwrappedTileID); + if (options.position) { + const newPosition = [options.position.x, options.position.y, options.position.z]; + if (!ref_properties.exactEquals$1(newPosition, this._camera.position)) { + this._setCameraPosition(newPosition); + changed = true; + } + } - const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = painter.getTileBoundsBuffers(tile); + if (changed) { + this._updateStateFromCamera(); + this.recenterOnTerrain(); + } + } - program.draw(context, gl.TRIANGLES, depthMode, stencilMode, colorMode, transform.CullFaceMode.disabled, - uniformValues, layer.id, tileBoundsBuffer, - tileBoundsIndexBuffer, tileBoundsSegments); + getFreeCameraOptions() { + this._updateCameraState(); + const pos = this._camera.position; + const options = new FreeCameraOptions(); + options.position = new ref_properties.MercatorCoordinate(pos[0], pos[1], pos[2]); + options.orientation = this._camera.orientation; + options._elevation = this.elevation; + options._renderWorldCopies = this.renderWorldCopies; + + return options; } -} -// + _setCameraOrientation(orientation ) { + // zero-length quaternions are not valid + if (!ref_properties.length$1(orientation)) + return false; -const topColor = new transform.Color(1, 0, 0, 1); -const btmColor = new transform.Color(0, 1, 0, 1); -const leftColor = new transform.Color(0, 0, 1, 1); -const rightColor = new transform.Color(1, 0, 1, 1); -const centerColor = new transform.Color(0, 1, 1, 1); + ref_properties.normalize$1(orientation, orientation); -function drawDebugPadding(painter ) { - const padding = painter.transform.padding; - const lineWidth = 3; - // Top - drawHorizontalLine(painter, painter.transform.height - (padding.top || 0), lineWidth, topColor); - // Bottom - drawHorizontalLine(painter, padding.bottom || 0, lineWidth, btmColor); - // Left - drawVerticalLine(painter, padding.left || 0, lineWidth, leftColor); - // Right - drawVerticalLine(painter, painter.transform.width - (padding.right || 0), lineWidth, rightColor); - // Center - const center = painter.transform.centerPoint; - drawCrosshair(painter, center.x, painter.transform.height - center.y, centerColor); -} + // The new orientation must be sanitized by making sure it can be represented + // with a pitch and bearing. Roll-component must be removed and the camera can't be upside down + const forward = ref_properties.transformQuat([], [0, 0, -1], orientation); + const up = ref_properties.transformQuat([], [0, -1, 0], orientation); -function drawDebugQueryGeometry(painter , sourceCache , coords ) { - for (let i = 0; i < coords.length; i++) { - drawTileQueryGeometry(painter, sourceCache, coords[i]); - } -} + if (up[2] < 0.0) + return false; -function drawCrosshair(painter , x , y , color ) { - const size = 20; - const lineWidth = 2; - //Vertical line - drawDebugSSRect(painter, x - lineWidth / 2, y - size / 2, lineWidth, size, color); - //Horizontal line - drawDebugSSRect(painter, x - size / 2, y - lineWidth / 2, size, lineWidth, color); -} + const updatedOrientation = orientationFromFrame(forward, up); + if (!updatedOrientation) + return false; -function drawHorizontalLine(painter , y , lineWidth , color ) { - drawDebugSSRect(painter, 0, y + lineWidth / 2, painter.transform.width, lineWidth, color); -} + this._camera.orientation = updatedOrientation; + return true; + } -function drawVerticalLine(painter , x , lineWidth , color ) { - drawDebugSSRect(painter, x - lineWidth / 2, 0, lineWidth, painter.transform.height, color); -} + _setCameraPosition(position ) { + // Altitude must be clamped to respect min and max zoom + const minWorldSize = this.zoomScale(this.minZoom) * this.tileSize; + const maxWorldSize = this.zoomScale(this.maxZoom) * this.tileSize; + const distToCenter = this.cameraToCenterDistance; -function drawDebugSSRect(painter , x , y , width , height , color ) { - const context = painter.context; - const gl = context.gl; + position[2] = ref_properties.clamp(position[2], distToCenter / maxWorldSize, distToCenter / minWorldSize); + this._camera.position = position; + } - gl.enable(gl.SCISSOR_TEST); - gl.scissor(x * transform.exported.devicePixelRatio, y * transform.exported.devicePixelRatio, width * transform.exported.devicePixelRatio, height * transform.exported.devicePixelRatio); - context.clear({color}); - gl.disable(gl.SCISSOR_TEST); -} + /** + * The center of the screen in pixels with the top-left corner being (0,0) + * and +y axis pointing downwards. This accounts for padding. + * + * @readonly + * @type {Point} + * @memberof Transform + */ + get centerPoint() { + return this._edgeInsets.getCenter(this.width, this.height); + } -function drawDebug(painter , sourceCache , coords ) { - for (let i = 0; i < coords.length; i++) { - drawDebugTile(painter, sourceCache, coords[i]); + /** + * Returns the vertical half-fov, accounting for padding, in radians. + * + * @readonly + * @type {number} + * @private + */ + get fovAboveCenter() { + return this._fov * (0.5 + this.centerOffset.y / this.height); } -} -function drawTileQueryGeometry(painter, sourceCache, coord ) { - const context = painter.context; - const gl = context.gl; + /** + * Returns true if the padding options are equal. + * + * @param {PaddingOptions} padding The padding options to compare. + * @returns {boolean} True if the padding options are equal. + * @memberof Transform + */ + isPaddingEqual(padding ) { + return this._edgeInsets.equals(padding); + } - const posMatrix = coord.projMatrix; - const program = painter.useProgram('debug'); - const tile = sourceCache.getTileByID(coord.key); - if (painter.terrain) painter.terrain.setupElevationDraw(tile, program); + /** + * Helper method to update edge-insets inplace. + * + * @param {PaddingOptions} start The initial padding options. + * @param {PaddingOptions} target The target padding options. + * @param {number} t The interpolation variable. + * @memberof Transform + */ + interpolatePadding(start , target , t ) { + this._unmodified = false; + this._edgeInsets.interpolate(start, target, t); + this._constrain(); + this._calcMatrices(); + } - const depthMode = transform.DepthMode.disabled; - const stencilMode = transform.StencilMode.disabled; - const colorMode = painter.colorModeForRenderPass(); - const id = '$debug'; + /** + * Return the highest zoom level that fully includes all tiles within the transform's boundaries. + * @param {Object} options Options. + * @param {number} options.tileSize Tile size, expressed in screen pixels. + * @param {boolean} options.roundZoom Target zoom level. If true, the value will be rounded to the closest integer. Otherwise the value will be floored. + * @returns {number} An integer zoom level at which all tiles will be visible. + */ + coveringZoomLevel(options ) { + const z = (options.roundZoom ? Math.round : Math.floor)( + this.zoom + this.scaleZoom(this.tileSize / options.tileSize) + ); + // At negative zoom levels load tiles from z0 because negative tile zoom levels don't exist. + return Math.max(0, z); + } - context.activeTexture.set(gl.TEXTURE0); - // Bind the empty texture for drawing outlines - painter.emptyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + /** + * Return any "wrapped" copies of a given tile coordinate that are visible + * in the current view. + * + * @private + */ + getVisibleUnwrappedCoordinates(tileID ) { + const result = [new ref_properties.UnwrappedTileID(0, tileID)]; + if (this.renderWorldCopies) { + const utl = this.pointCoordinate(new ref_properties.pointGeometry(0, 0)); + const utr = this.pointCoordinate(new ref_properties.pointGeometry(this.width, 0)); + const ubl = this.pointCoordinate(new ref_properties.pointGeometry(this.width, this.height)); + const ubr = this.pointCoordinate(new ref_properties.pointGeometry(0, this.height)); + const w0 = Math.floor(Math.min(utl.x, utr.x, ubl.x, ubr.x)); + const w1 = Math.floor(Math.max(utl.x, utr.x, ubl.x, ubr.x)); + + // Add an extra copy of the world on each side to properly render ImageSources and CanvasSources. + // Both sources draw outside the tile boundaries of the tile that "contains them" so we need + // to add extra copies on both sides in case offscreen tiles need to draw into on-screen ones. + const extraWorldCopy = 1; - if (tile.queryGeometryDebugViz && tile.queryGeometryDebugViz.vertices.length > 0) { - tile.queryGeometryDebugViz.lazyUpload(context); - const vertexBuffer = tile.queryGeometryDebugViz.vertexBuffer; - const indexBuffer = tile.queryGeometryDebugViz.indexBuffer; - const segments = tile.queryGeometryDebugViz.segments; - if (vertexBuffer != null && indexBuffer != null && segments != null) { - program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, transform.CullFaceMode.disabled, - debugUniformValues(posMatrix, tile.queryGeometryDebugViz.color), id, - vertexBuffer, indexBuffer, segments); + for (let w = w0 - extraWorldCopy; w <= w1 + extraWorldCopy; w++) { + if (w === 0) continue; + result.push(new ref_properties.UnwrappedTileID(w, tileID)); + } } + return result; } - if (tile.queryBoundsDebugViz && tile.queryBoundsDebugViz.vertices.length > 0) { - tile.queryBoundsDebugViz.lazyUpload(context); - const vertexBuffer = tile.queryBoundsDebugViz.vertexBuffer; - const indexBuffer = tile.queryBoundsDebugViz.indexBuffer; - const segments = tile.queryBoundsDebugViz.segments; - if (vertexBuffer != null && indexBuffer != null && segments != null) { - program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, transform.CullFaceMode.disabled, - debugUniformValues(posMatrix, tile.queryBoundsDebugViz.color), id, - vertexBuffer, indexBuffer, segments); - } - } -} + /** + * 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 + * @returns {Array} OverscaledTileIDs + * @private + */ + coveringTiles( + options + + + + + + + + + ) { + let z = this.coveringZoomLevel(options); + const actualZ = z; -function drawDebugTile(painter, sourceCache, coord ) { - const context = painter.context; - const gl = context.gl; + const useElevationData = this.elevation && !options.isTerrainDEM; + const isMercator = this.projection.name === 'mercator'; - const posMatrix = coord.projMatrix; - const program = painter.useProgram('debug'); - const tile = sourceCache.getTileByID(coord.key); - if (painter.terrain) painter.terrain.setupElevationDraw(tile, program); + if (options.minzoom !== undefined && z < options.minzoom) return []; + if (options.maxzoom !== undefined && z > options.maxzoom) z = options.maxzoom; - const depthMode = transform.DepthMode.disabled; - const stencilMode = transform.StencilMode.disabled; - const colorMode = painter.colorModeForRenderPass(); - const id = '$debug'; + const centerCoord = this.locationCoordinate(this.center); + const centerLatitude = this.center.lat; + const numTiles = 1 << z; + const centerPoint = [numTiles * centerCoord.x, numTiles * centerCoord.y, 0]; + const isGlobe = this.projection.name === 'globe'; + const zInMeters = !isGlobe; + const cameraFrustum = ref_properties.Frustum.fromInvProjectionMatrix(this.invProjMatrix, this.worldSize, z, zInMeters); + const cameraCoord = isGlobe ? this._camera.mercatorPosition : this.pointCoordinate(this.getCameraPoint()); + const meterToTile = numTiles * ref_properties.mercatorZfromAltitude(1, this.center.lat); + const cameraAltitude = this._camera.position[2] / ref_properties.mercatorZfromAltitude(1, this.center.lat); + const cameraPoint = [numTiles * cameraCoord.x, numTiles * cameraCoord.y, cameraAltitude * (zInMeters ? 1 : meterToTile)]; + // Let's consider an example for !roundZoom: e.g. tileZoom 16 is used from zoom 16 all the way to zoom 16.99. + // This would mean that the minimal distance to split would be based on distance from camera to center of 16.99 zoom. + // The same is already incorporated in logic behind roundZoom for raster (so there is no adjustment needed in following line). + // 0.02 added to compensate for precision errors, see "coveringTiles for terrain" test in transform.test.js. + const zoomSplitDistance = this.cameraToCenterDistance / options.tileSize * (options.roundZoom ? 1 : 0.502); - context.activeTexture.set(gl.TEXTURE0); - // Bind the empty texture for drawing outlines - painter.emptyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); + // No change of LOD behavior for pitch lower than 60 and when there is no top padding: return only tile ids from the requested zoom level + const minZoom = this.pitch <= 60.0 && this._edgeInsets.top <= this._edgeInsets.bottom && !this._elevation && !this.projection.isReprojectedInTileSpace ? z : 0; - tile._makeDebugTileBoundsBuffers(painter.context, painter.transform.projection); + // When calculating tile cover for terrain, create deep AABB for nodes, to ensure they intersect frustum: for sources, + // other than DEM, use minimum of visible DEM tiles and center altitude as upper bound (pitch is always less than 90°). + const maxRange = options.isTerrainDEM && this._elevation ? this._elevation.exaggeration() * 10000 : this._centerAltitude; + const minRange = options.isTerrainDEM ? -maxRange : this._elevation ? this._elevation.getMinElevationBelowMSL() : 0; - const debugBuffer = tile._tileDebugBuffer || painter.debugBuffer; - const debugIndexBuffer = tile._tileDebugIndexBuffer || painter.debugIndexBuffer; - const debugSegments = tile._tileDebugSegments || painter.debugSegments; + const scaleAdjustment = this.projection.isReprojectedInTileSpace ? getScaleAdjustment(this) : 1.0; - program.draw(context, gl.LINE_STRIP, depthMode, stencilMode, colorMode, transform.CullFaceMode.disabled, - debugUniformValues(posMatrix, transform.Color.red), id, - debugBuffer, debugIndexBuffer, debugSegments); + const relativeScaleAtMercatorCoord = mc => { + // Calculate how scale compares between projected coordinates and mercator coordinates. + // Returns a length. The units don't matter since the result is only + // used in a ratio with other values returned by this function. - const tileRawData = tile.latestRawTileData; - const tileByteLength = (tileRawData && tileRawData.byteLength) || 0; - const tileSizeKb = Math.floor(tileByteLength / 1024); - const tileSize = sourceCache.getTile(coord).tileSize; - const scaleRatio = (512 / Math.min(tileSize, 512) * (coord.overscaledZ / painter.transform.zoom)) * 0.5; - let tileIdText = coord.canonical.toString(); - if (coord.overscaledZ !== coord.canonical.z) { - tileIdText += ` => ${coord.overscaledZ}`; - } - const tileLabel = `${tileIdText} ${tileSizeKb}kb`; - drawTextToOverlay(painter, tileLabel); + // Construct a small square in Mercator coordinates. + const offset = 1 / 40000; + const mcEast = new ref_properties.MercatorCoordinate(mc.x + offset, mc.y, mc.z); + const mcSouth = new ref_properties.MercatorCoordinate(mc.x, mc.y + offset, mc.z); - program.draw(context, gl.TRIANGLES, depthMode, stencilMode, transform.ColorMode.alphaBlended, transform.CullFaceMode.disabled, - debugUniformValues(posMatrix, transform.Color.transparent, scaleRatio), id, - painter.debugBuffer, painter.quadTriangleIndexBuffer, painter.debugSegments); -} + // Convert the square to projected coordinates. + const ll = mc.toLngLat(); + const llEast = mcEast.toLngLat(); + const llSouth = mcSouth.toLngLat(); + const p = this.locationCoordinate(ll); + const pEast = this.locationCoordinate(llEast); + const pSouth = this.locationCoordinate(llSouth); -function drawTextToOverlay(painter , text ) { - painter.initDebugOverlayCanvas(); - const canvas = painter.debugOverlayCanvas; - const gl = painter.context.gl; - const ctx2d = painter.debugOverlayCanvas.getContext('2d'); - ctx2d.clearRect(0, 0, canvas.width, canvas.height); + // Calculate the size of each edge of the reprojected square + const dx = Math.hypot(pEast.x - p.x, pEast.y - p.y); + const dy = Math.hypot(pSouth.x - p.x, pSouth.y - p.y); - ctx2d.shadowColor = 'white'; - ctx2d.shadowBlur = 2; - ctx2d.lineWidth = 1.5; - ctx2d.strokeStyle = 'white'; - ctx2d.textBaseline = 'top'; - ctx2d.font = `bold ${36}px Open Sans, sans-serif`; - ctx2d.fillText(text, 5, 5); - ctx2d.strokeText(text, 5, 5); + // Calculate the size of a projected square that would have the + // same area as the reprojected square. + return Math.sqrt(dx * dy) * scaleAdjustment / offset; + }; - painter.debugOverlayTexture.update(canvas); - painter.debugOverlayTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); -} + const newRootTile = (wrap ) => { + const max = maxRange; + const min = minRange; + return { + // With elevation, this._elevation provides z coordinate values. For 2D: + // All tiles are on zero elevation plane => z difference is zero + aabb: ref_properties.tileAABB(this, numTiles, 0, 0, 0, wrap, min, max, this.projection), + zoom: 0, + x: 0, + y: 0, + minZ: min, + maxZ: max, + wrap, + fullyVisible: false + }; + }; -// + // Do a depth-first traversal to find visible tiles and proper levels of detail + const stack = []; + let result = []; + const maxZoom = z; + const overscaledZ = options.reparseOverscaled ? actualZ : z; + const square = a => a * a; + const cameraHeightSqr = square((cameraAltitude - this._centerAltitude) * meterToTile); // in tile coordinates. - - - + const getAABBFromElevation = (it) => { + ref_properties.assert_1(this._elevation); + if (!this._elevation || !it.tileID || !isMercator) return; // To silence flow. + const minmax = this._elevation.getMinMaxForTile(it.tileID); + const aabb = it.aabb; + if (minmax) { + aabb.min[2] = minmax.min; + aabb.max[2] = minmax.max; + aabb.center[2] = (aabb.min[2] + aabb.max[2]) / 2; + } else { + it.shouldSplit = shouldSplit(it); + if (!it.shouldSplit) { + // At final zoom level, while corresponding DEM tile is not loaded yet, + // assume center elevation. This covers ground to horizon and prevents + // loading unnecessary tiles until DEM cover is fully loaded. + aabb.min[2] = aabb.max[2] = aabb.center[2] = this._centerAltitude; + } + } + }; -function drawCustom(painter , sourceCache , layer ) { + // Scale distance to split for acute angles. + // dzSqr: z component of camera to tile distance, square. + // dSqr: 3D distance of camera to tile, square. + const distToSplitScale = (dzSqr, dSqr) => { + // When the angle between camera to tile ray and tile plane is smaller + // than acuteAngleThreshold, scale the distance to split. Scaling is adaptive: smaller + // the angle, the scale gets lower value. Although it seems early to start at 45, + // it is not: scaling kicks in around 60 degrees pitch. + const acuteAngleThresholdSin = 0.707; // Math.sin(45) + const stretchTile = 1.1; + // Distances longer than 'dz / acuteAngleThresholdSin' gets scaled + // following geometric series sum: every next dz length in distance can be + // 'stretchTile times' longer. It is further, the angle is sharper. Total, + // adjusted, distance would then be: + // = dz / acuteAngleThresholdSin + (dz * stretchTile + dz * stretchTile ^ 2 + ... + dz * stretchTile ^ k), + // where k = (d - dz / acuteAngleThresholdSin) / dz = d / dz - 1 / acuteAngleThresholdSin; + // = dz / acuteAngleThresholdSin + dz * ((stretchTile ^ (k + 1) - 1) / (stretchTile - 1) - 1) + // or put differently, given that k is based on d and dz, tile on distance d could be used on distance scaled by: + // 1 / acuteAngleThresholdSin + (stretchTile ^ (k + 1) - 1) / (stretchTile - 1) - 1 + if (dSqr * square(acuteAngleThresholdSin) < dzSqr) return 1.0; // Early return, no scale. + const r = Math.sqrt(dSqr / dzSqr); + const k = r - 1 / acuteAngleThresholdSin; + return r / (1 / acuteAngleThresholdSin + (Math.pow(stretchTile, k + 1) - 1) / (stretchTile - 1) - 1); + }; - const context = painter.context; - const implementation = layer.implementation; + const shouldSplit = (it) => { + if (it.zoom < minZoom) { + return true; + } else if (it.zoom === maxZoom) { + return false; + } + if (it.shouldSplit != null) { + return it.shouldSplit; + } + const dx = it.aabb.distanceX(cameraPoint); + const dy = it.aabb.distanceY(cameraPoint); + let dzSqr = cameraHeightSqr; - if (painter.transform.projection.unsupportedLayers && painter.transform.projection.unsupportedLayers.includes("custom")) { - transform.warnOnce('Custom layers are not yet supported with non-mercator projections. Use mercator to enable custom layers.'); - return; - } + let tileScaleAdjustment = 1; + if (isGlobe) { + dzSqr = square(it.aabb.distanceZ(cameraPoint)); + // Compensate physical sizes of the tiles when determining which zoom level to use. + // In practice tiles closer to poles should use more aggressive LOD as their + // physical size is already smaller than size of tiles near the equator. + const tilesAtZoom = Math.pow(2, it.zoom); + const minLat = ref_properties.latFromMercatorY((it.y + 1) / tilesAtZoom); + const maxLat = ref_properties.latFromMercatorY((it.y) / tilesAtZoom); + const closestLat = Math.min(Math.max(centerLatitude, minLat), maxLat); + + const relativeTileScale = ref_properties.circumferenceAtLatitude(closestLat) / ref_properties.circumferenceAtLatitude(centerLatitude); + + // With globe, the rendered scale does not exactly match the mercator scale at low zoom levels. + // Account for this difference during LOD of loading so that you load the correct size tiles. + // We try to compromise between two conflicting requirements: + // - loading tiles at the camera's zoom level (for visual and styling consistency) + // - loading correct size tiles (to reduce the number of tiles loaded) + // These are arbitrarily balanced: + if (closestLat === centerLatitude) { + // For tiles that are in the middle of the viewport, prioritize matching the camera + // zoom and allow divergence from the true scale. + const maxDivergence = 0.3; + tileScaleAdjustment = 1 / Math.max(1, this._mercatorScaleRatio - maxDivergence); + } else { + // For other tiles, use the real scale to reduce tile counts near poles. + tileScaleAdjustment = Math.min(1, relativeTileScale / this._mercatorScaleRatio); + } - if (painter.renderPass === 'offscreen') { + // Ensure that all tiles near the center have the same zoom level. + // With LOD tile loading, tile zoom levels can change when scale slightly changes. + // These differences can be pretty different in globe view. Work around this by + // making more tiles match the center tile's zoom level. If the tiles are nearly big enough, + // round up. Only apply this adjustment before the transition to mercator rendering has started. + if (this.zoom <= ref_properties.GLOBE_ZOOM_THRESHOLD_MIN && it.zoom === maxZoom - 1 && relativeTileScale >= 0.9) { + return true; + } + } else { + ref_properties.assert_1(zInMeters); + if (useElevationData) { + dzSqr = square(it.aabb.distanceZ(cameraPoint) * meterToTile); + } + if (this.projection.isReprojectedInTileSpace && actualZ <= 5) { + // In other projections, not all tiles are the same size. + // Account for the tile size difference by adjusting the distToSplit. + // Adjust by the ratio of the area at the tile center to the area at the map center. + // Adjustments are only needed at lower zooms where tiles are not similarly sized. + const numTiles = Math.pow(2, it.zoom); + const relativeScale = relativeScaleAtMercatorCoord(new ref_properties.MercatorCoordinate((it.x + 0.5) / numTiles, (it.y + 0.5) / numTiles)); + // Fudge the ratio slightly so that all tiles near the center have the same zoom level. + tileScaleAdjustment = relativeScale > 0.85 ? 1 : relativeScale; + } + } - const prerender = implementation.prerender; - if (prerender) { - painter.setCustomLayerDefaults(); - context.setColorMode(painter.colorModeForRenderPass()); + const distanceSqr = dx * dx + dy * dy + dzSqr; + const distToSplit = (1 << maxZoom - it.zoom) * zoomSplitDistance * tileScaleAdjustment; + const distToSplitSqr = square(distToSplit * distToSplitScale(Math.max(dzSqr, cameraHeightSqr), distanceSqr)); - prerender.call(implementation, context.gl, painter.transform.customLayerMatrix()); + return distanceSqr < distToSplitSqr; + }; - context.setDirty(); - painter.setBaseState(); + if (this.renderWorldCopies) { + // Render copy of the globe thrice on both sides + for (let i = 1; i <= NUM_WORLD_COPIES; i++) { + stack.push(newRootTile(-i)); + stack.push(newRootTile(i)); + } } - } else if (painter.renderPass === 'translucent') { - - painter.setCustomLayerDefaults(); + stack.push(newRootTile(0)); - context.setColorMode(painter.colorModeForRenderPass()); - context.setStencilMode(transform.StencilMode.disabled); + while (stack.length > 0) { + const it = stack.pop(); + const x = it.x; + const y = it.y; + let fullyVisible = it.fullyVisible; - const depthMode = implementation.renderingMode === '3d' ? - new transform.DepthMode(painter.context.gl.LEQUAL, transform.DepthMode.ReadWrite, painter.depthRangeFor3D) : - painter.depthModeForSublayer(0, transform.DepthMode.ReadOnly); + // Visibility of a tile is not required if any of its ancestor is fully inside the frustum + if (!fullyVisible) { + const intersectResult = it.aabb.intersects(cameraFrustum); - context.setDepthMode(depthMode); + if (intersectResult === 0) + continue; - implementation.render(context.gl, painter.transform.customLayerMatrix()); + fullyVisible = intersectResult === 2; + } - context.setDirty(); - painter.setBaseState(); - context.bindFramebuffer.set(null); - } -} + // Have we reached the target depth or is the tile too far away to be any split further? + if (it.zoom === maxZoom || !shouldSplit(it)) { + const tileZoom = it.zoom === maxZoom ? overscaledZ : it.zoom; + if (!!options.minzoom && options.minzoom > tileZoom) { + // Not within source tile range. + continue; + } -// + const dx = centerPoint[0] - ((0.5 + x + (it.wrap << it.zoom)) * (1 << (z - it.zoom))); + const dy = centerPoint[1] - 0.5 - y; + const id = it.tileID ? it.tileID : new ref_properties.OverscaledTileID(tileZoom, it.wrap, it.zoom, x, y); + result.push({tileID: id, distanceSq: dx * dx + dy * dy}); + continue; + } -const skyboxAttributes = transform.createLayout([ - {name: 'a_pos_3f', components: 3, type: 'Float32'} -]); -const {members, size, alignment} = skyboxAttributes; + for (let i = 0; i < 4; i++) { + const childX = (x << 1) + (i % 2); + const childY = (y << 1) + (i >> 1); -// - - - + const aabb = isMercator ? it.aabb.quadrant(i) : ref_properties.tileAABB(this, numTiles, it.zoom + 1, childX, childY, it.wrap, it.minZ, it.maxZ, this.projection); + const child = {aabb, zoom: it.zoom + 1, x: childX, y: childY, wrap: it.wrap, fullyVisible, tileID: undefined, shouldSplit: undefined, minZ: it.minZ, maxZ: it.maxZ}; + if (useElevationData && !isGlobe) { + child.tileID = new ref_properties.OverscaledTileID(it.zoom + 1 === maxZoom ? overscaledZ : it.zoom + 1, it.wrap, it.zoom + 1, childX, childY); + getAABBFromElevation(child); + } + stack.push(child); + } + } -function addVertex(vertexArray, x, y, z) { - vertexArray.emplaceBack( - // a_pos - x, - y, - z - ); -} + if (this.fogCullDistSq) { + const fogCullDistSq = this.fogCullDistSq; + const horizonLineFromTop = this.horizonLineFromTop(); + result = result.filter(entry => { + const min = [0, 0, 0, 1]; + const max = [ref_properties.EXTENT, ref_properties.EXTENT, 0, 1]; -class SkyboxGeometry { - - - - - + const fogTileMatrix = this.calculateFogTileMatrix(entry.tileID.toUnwrapped()); - constructor(context ) { - this.vertexArray = new transform.StructArrayLayout3f12(); - this.indices = new transform.StructArrayLayout3ui6(); + ref_properties.transformMat4$1(min, min, fogTileMatrix); + ref_properties.transformMat4$1(max, max, fogTileMatrix); - addVertex(this.vertexArray, -1.0, -1.0, 1.0); - addVertex(this.vertexArray, 1.0, -1.0, 1.0); - addVertex(this.vertexArray, -1.0, 1.0, 1.0); - addVertex(this.vertexArray, 1.0, 1.0, 1.0); - addVertex(this.vertexArray, -1.0, -1.0, -1.0); - addVertex(this.vertexArray, 1.0, -1.0, -1.0); - addVertex(this.vertexArray, -1.0, 1.0, -1.0); - addVertex(this.vertexArray, 1.0, 1.0, -1.0); + const sqDist = ref_properties.getAABBPointSquareDist(min, max); - // +x - this.indices.emplaceBack(5, 1, 3); - this.indices.emplaceBack(3, 7, 5); - // -x - this.indices.emplaceBack(6, 2, 0); - this.indices.emplaceBack(0, 4, 6); - // +y - this.indices.emplaceBack(2, 6, 7); - this.indices.emplaceBack(7, 3, 2); - // -y - this.indices.emplaceBack(5, 4, 0); - this.indices.emplaceBack(0, 1, 5); - // +z - this.indices.emplaceBack(0, 2, 3); - this.indices.emplaceBack(3, 1, 0); - // -z - this.indices.emplaceBack(7, 6, 4); - this.indices.emplaceBack(4, 5, 7); + if (sqDist === 0) { return true; } - this.vertexBuffer = context.createVertexBuffer(this.vertexArray, members); - this.indexBuffer = context.createIndexBuffer(this.indices); + let overHorizonLine = false; - this.segment = transform.SegmentVector.simpleSegment(0, 0, 36, 12); - } -} + // Terrain loads at one zoom level lower than the raster data, + // so the following checks whether the terrain sits above the horizon and ensures that + // when mountains stick out above the fog (due to horizon-blend), + // we haven’t accidentally culled some of the raster tiles we need to draw on them. + // If we don’t do this, the terrain is default black color and may flash in and out as we move toward it. -// + const elevation = this._elevation; -const TRANSITION_OPACITY_ZOOM_START = 7; -const TRANSITION_OPACITY_ZOOM_END = 8; + if (elevation && sqDist > fogCullDistSq && horizonLineFromTop !== 0) { + const projMatrix = this.calculateProjMatrix(entry.tileID.toUnwrapped()); -function drawSky(painter , sourceCache , layer ) { - const tr = painter.transform; - const globeOrMercator = (tr.projection.name === 'mercator' || tr.projection.name === 'globe'); - // For non-mercator projection, use a forced opacity transition. This transition is set to be - // 1.0 after the sheer adjustment upper bound which ensures to be in the mercator projection. - // Note: we only render sky for globe projection during the transition to mercator. - const transitionOpacity = globeOrMercator ? 1.0 : transform.smoothstep(TRANSITION_OPACITY_ZOOM_START, TRANSITION_OPACITY_ZOOM_END, tr.zoom); - const opacity = layer.paint.get('sky-opacity') * transitionOpacity; - if (opacity === 0) { - return; - } + let minmax; + if (!options.isTerrainDEM) { + minmax = elevation.getMinMaxForTile(entry.tileID); + } - const context = painter.context; - const type = layer.paint.get('sky-type'); - const depthMode = new transform.DepthMode(context.gl.LEQUAL, transform.DepthMode.ReadOnly, [0, 1]); - const temporalOffset = (painter.frameCounter / 1000.0) % 1; + if (!minmax) { minmax = {min: minRange, max: maxRange}; } - if (type === 'atmosphere') { - if (painter.renderPass === 'offscreen') { - if (layer.needsSkyboxCapture(painter)) { - captureSkybox(painter, layer, 32, 32); - layer.markSkyboxValid(painter); - } - } else if (painter.renderPass === 'sky') { - drawSkyboxFromCapture(painter, layer, depthMode, opacity, temporalOffset); - } - } else if (type === 'gradient') { - if (painter.renderPass === 'sky') { - drawSkyboxGradient(painter, layer, depthMode, opacity, temporalOffset); - } - } else { - transform.assert_1(false, `${type} is unsupported sky-type`); - } -} + // ensure that we want `this.rotation` instead of `this.bearing` here + const cornerFar = ref_properties.furthestTileCorner(this.rotation); -function drawSkyboxGradient(painter , layer , depthMode , opacity , temporalOffset ) { - const context = painter.context; - const gl = context.gl; - const transform$1 = painter.transform; - const program = painter.useProgram('skyboxGradient'); + const farX = cornerFar[0] * ref_properties.EXTENT; + const farY = cornerFar[1] * ref_properties.EXTENT; - // Lazily initialize geometry and texture if they havent been created yet. - if (!layer.skyboxGeometry) { - layer.skyboxGeometry = new SkyboxGeometry(context); - } - context.activeTexture.set(gl.TEXTURE0); - let colorRampTexture = layer.colorRampTexture; - if (!colorRampTexture) { - colorRampTexture = layer.colorRampTexture = new transform.Texture(context, layer.colorRamp, gl.RGBA); - } - colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); - const uniformValues = skyboxGradientUniformValues( - transform$1.skyboxMatrix, - layer.getCenter(painter, false), - layer.paint.get('sky-gradient-radius'), - opacity, - temporalOffset - ); + const worldFar = [farX, farY, minmax.max]; - painter.prepareDrawProgram(context, program); + // World to NDC + ref_properties.transformMat4(worldFar, worldFar, projMatrix); - program.draw(context, gl.TRIANGLES, depthMode, transform.StencilMode.disabled, - painter.colorModeForRenderPass(), transform.CullFaceMode.backCW, - uniformValues, 'skyboxGradient', layer.skyboxGeometry.vertexBuffer, - layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment); -} + // NDC to Screen + const screenCoordY = (1 - worldFar[1]) * this.height * 0.5; -function drawSkyboxFromCapture(painter , layer , depthMode , opacity , temporalOffset ) { - const context = painter.context; - const gl = context.gl; - const transform$1 = painter.transform; - const program = painter.useProgram('skybox'); + // Prevent cutting tiles crossing over the horizon line to + // prevent pop-in and out within the fog culling range + overHorizonLine = screenCoordY < horizonLineFromTop; + } - context.activeTexture.set(gl.TEXTURE0); + return sqDist < fogCullDistSq || overHorizonLine; + }); + } - gl.bindTexture(gl.TEXTURE_CUBE_MAP, layer.skyboxTexture); + const cover = result.sort((a, b) => a.distanceSq - b.distanceSq).map(a => a.tileID); + // Relax the assertion on terrain, on high zoom we use distance to center of tile + // while camera might be closer to selected center of map. + ref_properties.assert_1(!cover.length || this.elevation || cover[0].overscaledZ === overscaledZ || !isMercator); + return cover; + } - const uniformValues = skyboxUniformValues(transform$1.skyboxMatrix, layer.getCenter(painter, false), 0, opacity, temporalOffset); + resize(width , height ) { + this.width = width; + this.height = height; - painter.prepareDrawProgram(context, program); + this.pixelsToGLUnits = [2 / width, -2 / height]; + this._constrain(); + this._calcMatrices(); + } - program.draw(context, gl.TRIANGLES, depthMode, transform.StencilMode.disabled, - painter.colorModeForRenderPass(), transform.CullFaceMode.backCW, - uniformValues, 'skybox', layer.skyboxGeometry.vertexBuffer, - layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment); -} + get unmodified() { return this._unmodified; } -function drawSkyboxFace(context , layer , program , faceRotate , sunDirection , i ) { - const gl = context.gl; + zoomScale(zoom ) { return Math.pow(2, zoom); } + scaleZoom(scale ) { return Math.log(scale) / Math.LN2; } - const atmosphereColor = layer.paint.get('sky-atmosphere-color'); - const atmosphereHaloColor = layer.paint.get('sky-atmosphere-halo-color'); - const sunIntensity = layer.paint.get('sky-atmosphere-sun-intensity'); + // Transform from LngLat to Point in world coordinates [-180, 180] x [90, -90] --> [0, this.worldSize] x [0, this.worldSize] + project(lnglat ) { + const lat = ref_properties.clamp(lnglat.lat, -ref_properties.MAX_MERCATOR_LATITUDE, ref_properties.MAX_MERCATOR_LATITUDE); + const projectedLngLat = this.projection.project(lnglat.lng, lat); + return new ref_properties.pointGeometry( + projectedLngLat.x * this.worldSize, + projectedLngLat.y * this.worldSize); + } - const uniformValues = skyboxCaptureUniformValues( - transform.fromMat4([], faceRotate), - sunDirection, - sunIntensity, - atmosphereColor, - atmosphereHaloColor); + // Transform from Point in world coordinates to LngLat [0, this.worldSize] x [0, this.worldSize] --> [-180, 180] x [90, -90] + unproject(point ) { + return this.projection.unproject(point.x / this.worldSize, point.y / this.worldSize); + } - const glFace = gl.TEXTURE_CUBE_MAP_POSITIVE_X + i; - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, glFace, layer.skyboxTexture, 0); + // Point at center in world coordinates. + get point() { return this.project(this.center); } - program.draw(context, gl.TRIANGLES, transform.DepthMode.disabled, transform.StencilMode.disabled, transform.ColorMode.unblended, transform.CullFaceMode.frontCW, - uniformValues, 'skyboxCapture', layer.skyboxGeometry.vertexBuffer, - layer.skyboxGeometry.indexBuffer, layer.skyboxGeometry.segment); -} + setLocationAtPoint(lnglat , point ) { + let x, y; + const centerPoint = this.centerPoint; -function captureSkybox(painter , layer , width , height ) { - const context = painter.context; - const gl = context.gl; - let fbo = layer.skyboxFbo; + if (this.projection.name === 'globe') { + // Pixel coordinates are applied directly to the globe + const worldSize = this.worldSize; + x = (point.x - centerPoint.x) / worldSize; + y = (point.y - centerPoint.y) / worldSize; + } else { + const a = this.pointCoordinate(point); + const b = this.pointCoordinate(centerPoint); + x = a.x - b.x; + y = a.y - b.y; + } - // Using absence of fbo as a signal for lazy initialization of all resources, cache resources in layer object - if (!fbo) { - fbo = layer.skyboxFbo = context.createFramebuffer(width, height, false); - layer.skyboxGeometry = new SkyboxGeometry(context); - layer.skyboxTexture = context.gl.createTexture(); + const loc = this.locationCoordinate(lnglat); + this.setLocation(new ref_properties.MercatorCoordinate(loc.x - x, loc.y - y)); + } - gl.bindTexture(gl.TEXTURE_CUBE_MAP, layer.skyboxTexture); - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + setLocation(location ) { + this.center = this.coordinateLocation(location); + if (this.projection.wrap) { + this.center = this.center.wrap(); + } + } - for (let i = 0; i < 6; ++i) { - const glFace = gl.TEXTURE_CUBE_MAP_POSITIVE_X + i; + /** + * Given a location, return the screen point that corresponds to it. In 3D mode + * (with terrain) this behaves the same as in 2D mode. + * This method is coupled with {@see pointLocation} in 3D mode to model map manipulation + * using flat plane approach to keep constant elevation above ground. + * @param {LngLat} lnglat location + * @returns {Point} screen point + * @private + */ + locationPoint(lnglat ) { + return this.projection.locationPoint(this, lnglat); + } - // The format here could be RGB, but render tests are not happy with rendering to such a format - gl.texImage2D(glFace, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - } + /** + * Given a location, return the screen point that corresponds to it + * In 3D mode (when terrain is enabled) elevation is sampled for the point before + * projecting it. In 2D mode, behaves the same locationPoint. + * @param {LngLat} lnglat location + * @returns {Point} screen point + * @private + */ + locationPoint3D(lnglat ) { + return this.projection.locationPoint(this, lnglat, true); } - context.bindFramebuffer.set(fbo.framebuffer); - context.viewport.set([0, 0, width, height]); + /** + * Given a point on screen, return its lnglat + * @param {Point} p screen point + * @returns {LngLat} lnglat location + * @private + */ + pointLocation(p ) { + return this.coordinateLocation(this.pointCoordinate(p)); + } - const sunDirection = layer.getCenter(painter, true); - const program = painter.useProgram('skyboxCapture'); - const faceRotate = new Float64Array(16); + /** + * Given a point on screen, return its lnglat + * In 3D mode (map with terrain) returns location of terrain raycast point. + * In 2D mode, behaves the same as {@see pointLocation}. + * @param {Point} p screen point + * @returns {LngLat} lnglat location + * @private + */ + pointLocation3D(p ) { + return this.coordinateLocation(this.pointCoordinate3D(p)); + } - // +x; - transform.identity(faceRotate); - transform.rotateY(faceRotate, faceRotate, -Math.PI * 0.5); - drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 0); - // -x - transform.identity(faceRotate); - transform.rotateY(faceRotate, faceRotate, Math.PI * 0.5); - drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 1); - // +y - transform.identity(faceRotate); - transform.rotateX(faceRotate, faceRotate, -Math.PI * 0.5); - drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 2); - // -y - transform.identity(faceRotate); - transform.rotateX(faceRotate, faceRotate, Math.PI * 0.5); - drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 3); - // +z - transform.identity(faceRotate); - drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 4); - // -z - transform.identity(faceRotate); - transform.rotateY(faceRotate, faceRotate, Math.PI); - drawSkyboxFace(context, layer, program, faceRotate, sunDirection, 5); + /** + * Given a geographical lngLat, return an unrounded + * coordinate that represents it at this transform's zoom level. + * @param {LngLat} lngLat + * @returns {Coordinate} + * @private + */ + locationCoordinate(lngLat , altitude ) { + const z = altitude ? + ref_properties.mercatorZfromAltitude(altitude, lngLat.lat) : + undefined; + const projectedLngLat = this.projection.project(lngLat.lng, lngLat.lat); + return new ref_properties.MercatorCoordinate( + projectedLngLat.x, + projectedLngLat.y, + z); + } - context.viewport.set([0, 0, painter.width, painter.height]); -} + /** + * Given a Coordinate, return its geographical position. + * @param {Coordinate} coord + * @returns {LngLat} lngLat + * @private + */ + coordinateLocation(coord ) { + return this.projection.unproject(coord.x, coord.y); + } -// + /** + * Casts a ray from a point on screen and returns the Ray, + * and the extent along it, at which it intersects the map plane. + * + * @param {Point} p Viewport pixel co-ordinates. + * @param {number} z Optional altitude of the map plane, defaulting to elevation at center. + * @returns {{ p0: Vec4, p1: Vec4, t: number }} p0,p1 are two points on the ray. + * t is the fractional extent along the ray at which the ray intersects the map plane. + * @private + */ + pointRayIntersection(p , z ) { + const targetZ = (z !== undefined && z !== null) ? z : this._centerAltitude; + // 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. -function drawGlobeAtmosphere(painter ) { - const context = painter.context; - const gl = context.gl; - const transform$1 = painter.transform; - const depthMode = new transform.DepthMode(gl.LEQUAL, transform.DepthMode.ReadOnly, [0, 1]); - const program = painter.useProgram('globeAtmosphere'); + const p0 = [p.x, p.y, 0, 1]; + const p1 = [p.x, p.y, 1, 1]; - // Compute center and approximate radius of the globe on screen coordinates - const viewMatrix = transform$1._camera.getWorldToCamera(transform$1.worldSize, 1.0); - const viewToProj = transform$1._camera.getCameraToClipPerspective(transform$1._fov, transform$1.width / transform$1.height, transform$1._nearZ, transform$1._farZ); - const globeToView = transform.mul([], viewMatrix, transform.calculateGlobeMatrix(transform$1, transform$1.worldSize)); - const viewToScreen = transform.mul([], transform$1.labelPlaneMatrix, viewToProj); + ref_properties.transformMat4$1(p0, p0, this.pixelMatrixInverse); + ref_properties.transformMat4$1(p1, p1, this.pixelMatrixInverse); - const centerOnViewSpace = transform.transformMat4([], [0, 0, 0], globeToView); - const radiusOnViewSpace = transform.add([], centerOnViewSpace, [transform$1.worldSize / Math.PI / 2.0, 0, 0]); + const w0 = p0[3]; + const w1 = p1[3]; + ref_properties.scale$2(p0, p0, 1 / w0); + ref_properties.scale$2(p1, p1, 1 / w1); - const centerOnScreen = transform.transformMat4([], centerOnViewSpace, viewToScreen); - const radiusOnScreen = transform.transformMat4([], radiusOnViewSpace, viewToScreen); + const z0 = p0[2]; + const z1 = p1[2]; - const pixelRadius = transform.length(transform.sub([], radiusOnScreen, centerOnScreen)); - const fadeOutTransition = 1.0 - transform.globeToMercatorTransition(transform$1.zoom); + const t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0); - const uniforms = atmosphereUniformValues( - centerOnScreen, - pixelRadius, - [transform$1.width, transform$1.height], - transform.exported.devicePixelRatio, - fadeOutTransition, // opacity - 2.0, // fadeout range - [1.0, 1.0, 1.0], // start color - [0.0118, 0.7451, 0.9882]); // end color + return {p0, p1, t}; + } - painter.prepareDrawProgram(context, program); + screenPointToMercatorRay(p ) { + const p0 = [p.x, p.y, 0, 1]; + const p1 = [p.x, p.y, 1, 1]; - const sharedBuffers = painter.globeSharedBuffers; - if (sharedBuffers) { - program.draw(context, gl.TRIANGLES, depthMode, transform.StencilMode.disabled, - transform.ColorMode.alphaBlended, transform.CullFaceMode.backCW, uniforms, "skybox", - sharedBuffers.atmosphereVertexBuffer, - sharedBuffers.atmosphereIndexBuffer, - sharedBuffers.atmosphereSegments); - } -} + ref_properties.transformMat4$1(p0, p0, this.pixelMatrixInverse); + ref_properties.transformMat4$1(p1, p1, this.pixelMatrixInverse); -// + ref_properties.scale$2(p0, p0, 1 / p0[3]); + ref_properties.scale$2(p1, p1, 1 / p1[3]); -const draw$1 = { - symbol: drawSymbols, - circle: drawCircles, - heatmap: drawHeatmap, - line: drawLine, - fill: drawFill, - 'fill-extrusion': draw, - hillshade: drawHillshade, - raster: drawRaster, - background: drawBackground, - sky: drawSky, - debug: drawDebug, - custom: drawCustom -}; + // Convert altitude from meters to pixels. + p0[2] = ref_properties.mercatorZfromAltitude(p0[2], this._center.lat) * this.worldSize; + p1[2] = ref_properties.mercatorZfromAltitude(p1[2], this._center.lat) * this.worldSize; - - - - - - - - - - - - - + ref_properties.scale$2(p0, p0, 1 / this.worldSize); + ref_properties.scale$2(p1, p1, 1 / this.worldSize); - - - - - + return new ref_properties.Ray([p0[0], p0[1], p0[2]], ref_properties.normalize([], ref_properties.sub([], p1, p0))); + } - - - - - - - - - - - - - - + /** + * Helper method to convert the ray intersection with the map plane to MercatorCoordinate. + * + * @param {RayIntersectionResult} rayIntersection + * @returns {MercatorCoordinate} + * @private + */ + rayIntersectionCoordinate(rayIntersection ) { + const {p0, p1, t} = rayIntersection; -/** - * Initialize a new painter object. - * - * @param {Canvas} gl an experimental-webgl drawing context - * @private - */ -class Painter { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + const z0 = ref_properties.mercatorZfromAltitude(p0[2], this._center.lat); + const z1 = ref_properties.mercatorZfromAltitude(p1[2], this._center.lat); - constructor(gl , transform$1 ) { - this.context = new transform.Context(gl); - this.transform = transform$1; - this._tileTextures = {}; - this.frameCopies = []; - this.loadTimeStamps = []; + return new ref_properties.MercatorCoordinate( + ref_properties.number(p0[0], p1[0], t) / this.worldSize, + ref_properties.number(p0[1], p1[1], t) / this.worldSize, + ref_properties.number(z0, z1, t)); + } - this.setup(); + /** + * Given a point on screen, returns MercatorCoordinate. + * @param {Point} p Top left origin screen point, in pixels. + * @param {number} z Optional altitude of the map plane, defaulting to elevation at center. + * @private + */ + pointCoordinate(p , z = this._centerAltitude) { + return this.projection.pointCoordinate(this, p.x, p.y, z); + } - // Within each layer there are multiple distinct z-planes that can be drawn to. - // This is implemented using the WebGL depth buffer. - this.numSublayers = transform.SourceCache.maxUnderzooming + transform.SourceCache.maxOverzooming + 1; - this.depthEpsilon = 1 / Math.pow(2, 16); + /** + * Given a point on screen, returns MercatorCoordinate. + * In 3D mode, raycast to terrain. In 2D mode, behaves the same as {@see pointCoordinate}. + * For p above terrain, don't return point behind camera but clamp p.y at the top of terrain. + * @param {Point} p top left origin screen point, in pixels. + * @private + */ + pointCoordinate3D(p ) { + if (!this.elevation) return this.pointCoordinate(p); + let raycast = this.projection.pointCoordinate3D(this, p.x, p.y); + if (raycast) return new ref_properties.MercatorCoordinate(raycast[0], raycast[1], raycast[2]); + let start = 0, end = this.horizonLineFromTop(); + if (p.y > end) return this.pointCoordinate(p); // holes between tiles below horizon line or below bottom. + const samples = 10; + const threshold = 0.02 * end; + const r = p.clone(); - this.crossTileSymbolIndex = new CrossTileSymbolIndex(); + for (let i = 0; i < samples && end - start > threshold; i++) { + r.y = ref_properties.number(start, end, 0.66); // non uniform binary search favoring points closer to horizon. + const rCast = this.projection.pointCoordinate3D(this, r.x, r.y); + if (rCast) { + end = r.y; + raycast = rCast; + } else { + start = r.y; + } + } + return raycast ? new ref_properties.MercatorCoordinate(raycast[0], raycast[1], raycast[2]) : this.pointCoordinate(p); + } - this.gpuTimers = {}; - this.frameCounter = 0; - this._backgroundTiles = {}; + /** + * Returns true if a screenspace Point p, is above the horizon. + * In non-globe projections, this approximates the map as an infinite plane and does not account for z0-z3 + * wherein the map is small quad with whitespace above the north pole and below the south pole. + * + * @param {Point} p + * @returns {boolean} + * @private + */ + isPointAboveHorizon(p ) { + return this.projection.isPointAboveHorizon(this, p); } - updateTerrain(style , cameraChanging ) { - const enabled = !!style && !!style.terrain && this.transform.projection.supportsTerrain; - if (!enabled && (!this._terrain || !this._terrain.enabled)) return; - if (!this._terrain) { - this._terrain = new Terrain$1(this, style); - } - const terrain = this._terrain; - this.transform.elevation = enabled ? terrain : null; - terrain.update(style, this.transform, cameraChanging); + /** + * Given a coordinate, return the screen point that corresponds to it + * @param {Coordinate} coord + * @param {boolean} sampleTerrainIn3D in 3D mode (terrain enabled), sample elevation for the point. + * If false, do the same as in 2D mode, assume flat camera elevation plane for all points. + * @returns {Point} screen point + * @private + */ + _coordinatePoint(coord , sampleTerrainIn3D ) { + const elevation = sampleTerrainIn3D && this.elevation ? this.elevation.getAtPointOrZero(coord, this._centerAltitude) : this._centerAltitude; + const p = [coord.x * this.worldSize, coord.y * this.worldSize, elevation + coord.toAltitude(), 1]; + ref_properties.transformMat4$1(p, p, this.pixelMatrix); + return p[3] > 0 ? + new ref_properties.pointGeometry(p[0] / p[3], p[1] / p[3]) : + new ref_properties.pointGeometry(Number.MAX_VALUE, Number.MAX_VALUE); } - _updateFog(style ) { - const fog = style.fog; - if (!fog || fog.getOpacity(this.transform.pitch) < 1 || fog.properties.get('horizon-blend') < 0.03) { - this.transform.fogCullDistSq = null; - return; - } + _getBounds(min , max ) { + const topLeft = new ref_properties.pointGeometry(this._edgeInsets.left, this._edgeInsets.top); + const topRight = new ref_properties.pointGeometry(this.width - this._edgeInsets.right, this._edgeInsets.top); + const bottomRight = new ref_properties.pointGeometry(this.width - this._edgeInsets.right, this.height - this._edgeInsets.bottom); + const bottomLeft = new ref_properties.pointGeometry(this._edgeInsets.left, this.height - this._edgeInsets.bottom); - // We start culling where the fog opacity function hits - // 98% which leaves a non-noticeable change threshold. - const [start, end] = fog.getFovAdjustedRange(this.transform._fov); + // Consider far points at the maximum possible elevation + // and near points at the minimum to ensure full coverage. + let tl = this.pointCoordinate(topLeft, min); + let tr = this.pointCoordinate(topRight, min); + const br = this.pointCoordinate(bottomRight, max); + const bl = this.pointCoordinate(bottomLeft, max); - if (start > end) { - this.transform.fogCullDistSq = null; - return; - } + // Snap points if off the edges of map (Latitude is too high or low). + const slope = (p1, p2) => (p2.y - p1.y) / (p2.x - p1.x); - const fogBoundFraction = 0.78; - const fogCullDist = start + (end - start) * fogBoundFraction; + if (tl.y > 1 && tr.y >= 0) tl = new ref_properties.MercatorCoordinate((1 - bl.y) / slope(bl, tl) + bl.x, 1); + else if (tl.y < 0 && tr.y <= 1) tl = new ref_properties.MercatorCoordinate(-bl.y / slope(bl, tl) + bl.x, 0); - this.transform.fogCullDistSq = fogCullDist * fogCullDist; + if (tr.y > 1 && tl.y >= 0) tr = new ref_properties.MercatorCoordinate((1 - br.y) / slope(br, tr) + br.x, 1); + else if (tr.y < 0 && tl.y <= 1) tr = new ref_properties.MercatorCoordinate(-br.y / slope(br, tr) + br.x, 0); + + return new ref_properties.LngLatBounds() + .extend(this.coordinateLocation(tl)) + .extend(this.coordinateLocation(tr)) + .extend(this.coordinateLocation(bl)) + .extend(this.coordinateLocation(br)); } - get terrain() { - return this.transform._terrainEnabled() && this._terrain && this._terrain.enabled ? this._terrain : null; + _getBounds3D() { + ref_properties.assert_1(this.elevation); + const elevation = ((this.elevation ) ); + if (!elevation.visibleDemTiles.length) { return this._getBounds(0, 0); } + const minmax = elevation.visibleDemTiles.reduce((acc, t) => { + if (t.dem) { + const tree = t.dem.tree; + acc.min = Math.min(acc.min, tree.minimums[0]); + acc.max = Math.max(acc.max, tree.maximums[0]); + } + return acc; + }, {min: Number.MAX_VALUE, max: 0}); + ref_properties.assert_1(minmax.min !== Number.MAX_VALUE); + return this._getBounds(minmax.min * elevation.exaggeration(), minmax.max * elevation.exaggeration()); } - /* - * Update the GL viewport, projection matrix, and transforms to compensate - * for a new width and height value. + /** + * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not + * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region. + * + * @returns {LngLatBounds} Returns a {@link LngLatBounds} object describing the map's geographical bounds. */ - resize(width , height ) { - this.width = width * transform.exported.devicePixelRatio; - this.height = height * transform.exported.devicePixelRatio; - this.context.viewport.set([0, 0, this.width, this.height]); + getBounds() { + if (this._terrainEnabled()) return this._getBounds3D(); + return this._getBounds(0, 0); + } - if (this.style) { - for (const layerId of this.style.order) { - this.style._layers[layerId].resize(); - } - } + /** + * Returns position of horizon line from the top of the map in pixels. + * If horizon is not visible, returns 0 by default or a negative value if called with clampToTop = false. + * @private + */ + horizonLineFromTop(clampToTop = true) { + // h is height of space above map center to horizon. + const h = this.height / 2 / Math.tan(this._fov / 2) / Math.tan(Math.max(this._pitch, 0.1)) + this.centerOffset.y; + const offset = this.height / 2 - h * (1 - this._horizonShift); + return clampToTop ? Math.max(0, offset) : offset; } - setup() { - const context = this.context; + /** + * Returns the maximum geographical bounds the map is constrained to, or `null` if none set. + * @returns {LngLatBounds} {@link LngLatBounds}. + */ + getMaxBounds() { + return this.maxBounds; + } - const tileExtentArray = new transform.StructArrayLayout2i4(); - tileExtentArray.emplaceBack(0, 0); - tileExtentArray.emplaceBack(transform.EXTENT, 0); - tileExtentArray.emplaceBack(0, transform.EXTENT); - tileExtentArray.emplaceBack(transform.EXTENT, transform.EXTENT); - this.tileExtentBuffer = context.createVertexBuffer(tileExtentArray, transform.posAttributes.members); - this.tileExtentSegments = transform.SegmentVector.simpleSegment(0, 0, 4, 2); + /** + * Sets or clears the map's geographical constraints. + * + * @param {LngLatBounds} bounds A {@link LngLatBounds} object describing the new geographic boundaries of the map. + */ + setMaxBounds(bounds ) { + this.maxBounds = bounds; - const debugArray = new transform.StructArrayLayout2i4(); - debugArray.emplaceBack(0, 0); - debugArray.emplaceBack(transform.EXTENT, 0); - debugArray.emplaceBack(0, transform.EXTENT); - debugArray.emplaceBack(transform.EXTENT, transform.EXTENT); - this.debugBuffer = context.createVertexBuffer(debugArray, transform.posAttributes.members); - this.debugSegments = transform.SegmentVector.simpleSegment(0, 0, 4, 5); + this.minLat = -ref_properties.MAX_MERCATOR_LATITUDE; + this.maxLat = ref_properties.MAX_MERCATOR_LATITUDE; + this.minLng = -180; + this.maxLng = 180; - const viewportArray = new transform.StructArrayLayout2i4(); - viewportArray.emplaceBack(-1, -1); - viewportArray.emplaceBack(1, -1); - viewportArray.emplaceBack(-1, 1); - viewportArray.emplaceBack(1, 1); - this.viewportBuffer = context.createVertexBuffer(viewportArray, transform.posAttributes.members); - this.viewportSegments = transform.SegmentVector.simpleSegment(0, 0, 4, 2); + if (bounds) { + this.minLat = bounds.getSouth(); + this.maxLat = bounds.getNorth(); + this.minLng = bounds.getWest(); + this.maxLng = bounds.getEast(); + if (this.maxLng < this.minLng) this.maxLng += 360; + } - const tileBoundsArray = new transform.StructArrayLayout4i8(); - tileBoundsArray.emplaceBack(0, 0, 0, 0); - tileBoundsArray.emplaceBack(transform.EXTENT, 0, transform.EXTENT, 0); - tileBoundsArray.emplaceBack(0, transform.EXTENT, 0, transform.EXTENT); - tileBoundsArray.emplaceBack(transform.EXTENT, transform.EXTENT, transform.EXTENT, transform.EXTENT); - this.mercatorBoundsBuffer = context.createVertexBuffer(tileBoundsArray, transform.boundsAttributes.members); - this.mercatorBoundsSegments = transform.SegmentVector.simpleSegment(0, 0, 4, 2); + this.worldMinX = ref_properties.mercatorXfromLng(this.minLng) * this.tileSize; + this.worldMaxX = ref_properties.mercatorXfromLng(this.maxLng) * this.tileSize; + this.worldMinY = ref_properties.mercatorYfromLat(this.maxLat) * this.tileSize; + this.worldMaxY = ref_properties.mercatorYfromLat(this.minLat) * this.tileSize; - const quadTriangleIndices = new transform.StructArrayLayout3ui6(); - quadTriangleIndices.emplaceBack(0, 1, 2); - quadTriangleIndices.emplaceBack(2, 1, 3); - this.quadTriangleIndexBuffer = context.createIndexBuffer(quadTriangleIndices); + this._constrain(); + } - const tileLineStripIndices = new transform.StructArrayLayout1ui2(); - for (const i of [0, 1, 3, 2, 0]) tileLineStripIndices.emplaceBack(i); - this.debugIndexBuffer = context.createIndexBuffer(tileLineStripIndices); + calculatePosMatrix(unwrappedTileID , worldSize ) { + return this.projection.createTileMatrix(this, worldSize, unwrappedTileID); + } - this.emptyTexture = new transform.Texture(context, { - width: 1, - height: 1, - data: new Uint8Array([0, 0, 0, 0]) - }, context.gl.RGBA); + calculateDistanceTileData(unwrappedTileID ) { + const distanceDataKey = unwrappedTileID.key; + const cache = this._distanceTileDataCache; + if (cache[distanceDataKey]) { + return cache[distanceDataKey]; + } - this.identityMat = transform.create(); + //Calculate the offset of the tile + const canonical = unwrappedTileID.canonical; + const windowScaleFactor = 1 / this.height; + const scale = this.cameraWorldSize / this.zoomScale(canonical.z); + const unwrappedX = canonical.x + Math.pow(2, canonical.z) * unwrappedTileID.wrap; + const tX = unwrappedX * scale; + const tY = canonical.y * scale; - const gl = this.context.gl; - this.stencilClearMode = new transform.StencilMode({func: gl.ALWAYS, mask: 0}, 0x0, 0xFF, gl.ZERO, gl.ZERO, gl.ZERO); - this.loadTimeStamps.push(transform.window.performance.now()); - } + const center = this.point; - getMercatorTileBoundsBuffers() { - return { - tileBoundsBuffer: this.mercatorBoundsBuffer, - tileBoundsIndexBuffer: this.quadTriangleIndexBuffer, - tileBoundsSegments: this.mercatorBoundsSegments - }; - } + // Calculate the bearing vector by rotating unit vector [0, -1] clockwise + const angle = this.angle; + const bX = Math.sin(-angle); + const bY = -Math.cos(-angle); - getTileBoundsBuffers(tile ) { - tile._makeTileBoundsBuffers(this.context, this.transform.projection); - if (tile._tileBoundsBuffer) { - const tileBoundsBuffer = tile._tileBoundsBuffer; - const tileBoundsIndexBuffer = tile._tileBoundsIndexBuffer; - const tileBoundsSegments = tile._tileBoundsSegments; - return {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments}; - } else { - return this.getMercatorTileBoundsBuffers(); - } + const cX = (center.x - tX) * windowScaleFactor; + const cY = (center.y - tY) * windowScaleFactor; + cache[distanceDataKey] = { + bearing: [bX, bY], + center: [cX, cY], + scale: (scale / ref_properties.EXTENT) * windowScaleFactor + }; + return cache[distanceDataKey]; } - /* - * 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. + /** + * Calculate the fogTileMatrix that, given a tile coordinate, can be used to + * calculate its position relative to the camera in units of pixels divided + * by the map height. Used with fog for consistent computation of distance + * from camera. + * + * @param {UnwrappedTileID} unwrappedTileID; + * @private */ - clearStencil() { - const context = this.context; - const gl = context.gl; + calculateFogTileMatrix(unwrappedTileID ) { + const fogTileMatrixKey = unwrappedTileID.key; + const cache = this._fogTileMatrixCache; + if (cache[fogTileMatrixKey]) { + return cache[fogTileMatrixKey]; + } - this.nextStencilID = 1; - this.currentStencilSource = undefined; - this._tileClippingMaskIDs = {}; + const posMatrix = this.projection.createTileMatrix(this, this.cameraWorldSize, unwrappedTileID); + ref_properties.multiply(posMatrix, this.worldToFogMatrix, posMatrix); - // 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 }) - this.useProgram('clippingMask').draw(context, gl.TRIANGLES, - transform.DepthMode.disabled, this.stencilClearMode, transform.ColorMode.disabled, transform.CullFaceMode.disabled, - clippingMaskUniformValues(this.identityMat), - '$clipping', this.viewportBuffer, - this.quadTriangleIndexBuffer, this.viewportSegments); + cache[fogTileMatrixKey] = new Float32Array(posMatrix); + return cache[fogTileMatrixKey]; } - resetStencilClippingMasks() { - if (!this.terrain) { - this.currentStencilSource = undefined; - this._tileClippingMaskIDs = {}; + /** + * Calculate the projMatrix that, given a tile coordinate, would be used to display the tile on the screen. + * @param {UnwrappedTileID} unwrappedTileID; + * @private + */ + calculateProjMatrix(unwrappedTileID , aligned = false) { + const projMatrixKey = unwrappedTileID.key; + const cache = aligned ? this._alignedProjMatrixCache : this._projMatrixCache; + if (cache[projMatrixKey]) { + return cache[projMatrixKey]; } - } - _renderTileClippingMasks(layer , sourceCache , tileIDs ) { - if (!sourceCache || this.currentStencilSource === sourceCache.id || !layer.isTileClipped() || !tileIDs || tileIDs.length === 0) { - return; - } + const posMatrix = this.calculatePosMatrix(unwrappedTileID, this.worldSize); + const projMatrix = this.projection.isReprojectedInTileSpace ? + this.mercatorMatrix : (aligned ? this.alignedProjMatrix : this.projMatrix); + ref_properties.multiply(posMatrix, projMatrix, posMatrix); - if (this._tileClippingMaskIDs && !this.terrain) { - let dirtyStencilClippingMasks = false; - // Equivalent tile set is already rendered in stencil - for (const coord of tileIDs) { - if (this._tileClippingMaskIDs[coord.key] === undefined) { - dirtyStencilClippingMasks = true; - break; - } - } - if (!dirtyStencilClippingMasks) { - return; - } + cache[projMatrixKey] = new Float32Array(posMatrix); + return cache[projMatrixKey]; + } + + calculatePixelsToTileUnitsMatrix(tile ) { + const key = tile.tileID.key; + const cache = this._pixelsToTileUnitsCache; + if (cache[key]) { + return cache[key]; } - this.currentStencilSource = sourceCache.id; + const matrix = getPixelsToTileUnitsMatrix(tile, this); + cache[key] = matrix; + return cache[key]; + } - const context = this.context; - const gl = context.gl; + customLayerMatrix() { + return this.mercatorMatrix.slice(); + } - if (this.nextStencilID + tileIDs.length > 256) { - // we'll run out of fresh IDs so we need to clear and start from scratch - this.clearStencil(); - } + recenterOnTerrain() { - context.setColorMode(transform.ColorMode.disabled); - context.setDepthMode(transform.DepthMode.disabled); + if (!this._elevation || this.projection.name === 'globe') + return; - const program = this.useProgram('clippingMask'); + const elevation = this._elevation; + this._updateCameraState(); - this._tileClippingMaskIDs = {}; + // Cast a ray towards the sea level and find the intersection point with the terrain. + // We need to use a camera position that exists in the same coordinate space as the data. + // The default camera position might have been compensated by the active projection model. + const mercPixelsPerMeter = ref_properties.mercatorZfromAltitude(1, this._center.lat) * this.worldSize; + const start = this._computeCameraPosition(mercPixelsPerMeter); + const dir = this._camera.forward(); - for (const tileID of tileIDs) { - const tile = sourceCache.getTile(tileID); - const id = this._tileClippingMaskIDs[tileID.key] = this.nextStencilID++; - const {tileBoundsBuffer, tileBoundsIndexBuffer, tileBoundsSegments} = this.getTileBoundsBuffers(tile); + // The raycast function expects z-component to be in meters + const metersToMerc = ref_properties.mercatorZfromAltitude(1.0, this._center.lat); + start[2] /= metersToMerc; + dir[2] /= metersToMerc; + ref_properties.normalize(dir, dir); - program.draw(context, gl.TRIANGLES, transform.DepthMode.disabled, - // Tests will always pass, and ref value will be written to stencil buffer. - new transform.StencilMode({func: gl.ALWAYS, mask: 0}, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE), - transform.ColorMode.disabled, transform.CullFaceMode.disabled, clippingMaskUniformValues(tileID.projMatrix), - '$clipping', tileBoundsBuffer, - tileBoundsIndexBuffer, tileBoundsSegments); - } - } + const t = elevation.raycast(start, dir, elevation.exaggeration()); - stencilModeFor3D() { - this.currentStencilSource = undefined; + if (t) { + const point = ref_properties.scaleAndAdd([], start, dir, t); + const newCenter = new ref_properties.MercatorCoordinate(point[0], point[1], ref_properties.mercatorZfromAltitude(point[2], ref_properties.latFromMercatorY(point[1]))); - if (this.nextStencilID + 1 > 256) { - this.clearStencil(); - } + const camToNew = [newCenter.x - start[0], newCenter.y - start[1], newCenter.z - start[2] * metersToMerc]; + const maxAltitude = (newCenter.z + ref_properties.length(camToNew)) * this._projectionScaler; + this._seaLevelZoom = this._zoomFromMercatorZ(maxAltitude); - const id = this.nextStencilID++; - const gl = this.context.gl; - return new transform.StencilMode({func: gl.NOTEQUAL, mask: 0xFF}, id, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); + // Camera zoom has to be updated as the orbit distance might have changed + this._centerAltitude = newCenter.toAltitude(); + this._center = this.coordinateLocation(newCenter); + this._updateZoomFromElevation(); + this._constrain(); + this._calcMatrices(); + } } - stencilModeForClipping(tileID ) { - if (this.terrain) return this.terrain.stencilModeForRTTOverlap(tileID); - const gl = this.context.gl; - return new transform.StencilMode({func: gl.EQUAL, mask: 0xFF}, this._tileClippingMaskIDs[tileID.key], 0x00, gl.KEEP, gl.KEEP, gl.REPLACE); - } + _constrainCameraAltitude() { + if (!this._elevation) + return; - /* - * Sort coordinates by Z as drawing tiles is done in Z-descending order. - * All children with the same Z write the same stencil value. Children - * stencil values are greater than parent's. This is used only for raster - * and raster-dem tiles, which are already clipped to tile boundaries, to - * mask area of tile overlapped by children tiles. - * Stencil ref values continue range used in _tileClippingMaskIDs. - * - * Returns [StencilMode for tile overscaleZ map, sortedCoords]. - */ - stencilConfigForOverlap(tileIDs ) { - const gl = this.context.gl; - const coords = tileIDs.sort((a, b) => b.overscaledZ - a.overscaledZ); - const minTileZ = coords[coords.length - 1].overscaledZ; - const stencilValues = coords[0].overscaledZ - minTileZ + 1; - if (stencilValues > 1) { - this.currentStencilSource = undefined; - if (this.nextStencilID + stencilValues > 256) { - this.clearStencil(); - } - const zToStencilMode = {}; - for (let i = 0; i < stencilValues; i++) { - zToStencilMode[i + minTileZ] = new transform.StencilMode({func: gl.GEQUAL, mask: 0xFF}, i + this.nextStencilID, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); - } - this.nextStencilID += stencilValues; - return [zToStencilMode, coords]; - } - return [{[minTileZ]: transform.StencilMode.disabled}, coords]; - } + const elevation = this._elevation; + this._updateCameraState(); - colorModeForRenderPass() { - const gl = this.context.gl; - if (this._showOverdrawInspector) { - const numOverdrawSteps = 8; - const a = 1 / numOverdrawSteps; + // Find uncompensated camera position for elevation sampling. + // The default camera position might have been compensated by the active projection model. + const mercPixelsPerMeter = ref_properties.mercatorZfromAltitude(1, this._center.lat) * this.worldSize; + const pos = this._computeCameraPosition(mercPixelsPerMeter); - return new transform.ColorMode([gl.CONSTANT_COLOR, gl.ONE], new transform.Color(a, a, a, 0), [true, true, true, true]); - } else if (this.renderPass === 'opaque') { - return transform.ColorMode.unblended; - } else { - return transform.ColorMode.alphaBlended; - } - } + const elevationAtCamera = elevation.getAtPointOrZero(new ref_properties.MercatorCoordinate(...pos)); + const minHeight = this._minimumHeightOverTerrain() * Math.cos(ref_properties.degToRad(this._maxPitch)); + const terrainElevation = this.pixelsPerMeter / this.worldSize * elevationAtCamera; + const cameraHeight = this._camera.position[2] - terrainElevation; - depthModeForSublayer(n , mask , func ) { - if (!this.opaquePassEnabledForLayer()) return transform.DepthMode.disabled; - const depth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon; - return new transform.DepthMode(func || this.context.gl.LEQUAL, mask, [depth, depth]); - } + if (cameraHeight < minHeight) { + const center = this.locationCoordinate(this._center, this._centerAltitude); + const cameraToCenter = [center.x - pos[0], center.y - pos[1], center.z - pos[2]]; + const prevDistToCamera = ref_properties.length(cameraToCenter); - /* - * The opaque pass and 3D layers both use the depth buffer. - * Layers drawn above 3D layers need to be drawn using the - * painter's algorithm so that they appear above 3D features. - * This returns true for layers that can be drawn using the - * opaque pass. - */ - opaquePassEnabledForLayer() { - return this.currentLayer < this.opaquePassCutoff; - } + // Adjust the camera vector so that the camera is placed above the terrain. + // Distance between the camera and the center point is kept constant. + cameraToCenter[2] -= (minHeight - cameraHeight) / this._projectionScaler; - render(style , options ) { - this.style = style; - this.options = options; + const newDistToCamera = ref_properties.length(cameraToCenter); + if (newDistToCamera === 0) + return; - this.lineAtlas = style.lineAtlas; - this.imageManager = style.imageManager; - this.glyphManager = style.glyphManager; + ref_properties.scale$3(cameraToCenter, cameraToCenter, prevDistToCamera / newDistToCamera * this._projectionScaler); + this._camera.position = [center.x - cameraToCenter[0], center.y - cameraToCenter[1], center.z * this._projectionScaler - cameraToCenter[2]]; - this.symbolFadeChange = style.placement.symbolFadeChange(transform.exported.now()); + this._camera.orientation = orientationFromFrame(cameraToCenter, this._camera.up()); + this._updateStateFromCamera(); + } + } - this.imageManager.beginFrame(); + _constrain() { + if (!this.center || !this.width || !this.height || this._constraining) return; - const layerIds = this.style.order; - const sourceCaches = this.style._sourceCaches; + this._constraining = true; - for (const id in sourceCaches) { - const sourceCache = sourceCaches[id]; - if (sourceCache.used) { - sourceCache.prepare(this.context); - } + // alternate constraining for non-Mercator projections + if (this.projection.isReprojectedInTileSpace) { + const center = this.center; + center.lat = ref_properties.clamp(center.lat, this.minLat, this.maxLat); + if (this.maxBounds || !this.renderWorldCopies) center.lng = ref_properties.clamp(center.lng, this.minLng, this.maxLng); + this.center = center; + this._constraining = false; + return; } - const coordsAscending = {}; - const coordsDescending = {}; - const coordsDescendingSymbol = {}; + const unmodified = this._unmodified; + const {x, y} = this.point; + let s = 0; + let x2 = x; + let y2 = y; + const w2 = this.width / 2; + const h2 = this.height / 2; - for (const id in sourceCaches) { - const sourceCache = sourceCaches[id]; - coordsAscending[id] = sourceCache.getVisibleCoordinates(); - coordsDescending[id] = coordsAscending[id].slice().reverse(); - coordsDescendingSymbol[id] = sourceCache.getVisibleCoordinates(true).reverse(); + const minY = this.worldMinY * this.scale; + const maxY = this.worldMaxY * this.scale; + if (y - h2 < minY) y2 = minY + h2; + if (y + h2 > maxY) y2 = maxY - h2; + if (maxY - minY < this.height) { + s = Math.max(s, this.height / (maxY - minY)); + y2 = (maxY + minY) / 2; } - this.opaquePassCutoff = Infinity; - for (let i = 0; i < layerIds.length; i++) { - const layerId = layerIds[i]; - if (this.style._layers[layerId].is3D()) { - this.opaquePassCutoff = i; - break; + if (this.maxBounds || !this._renderWorldCopies || !this.projection.wrap) { + const minX = this.worldMinX * this.scale; + const maxX = this.worldMaxX * this.scale; + + // Translate to positive positions with the map center in the center position. + // This ensures that the map snaps to the correct edge. + const shift = this.worldSize / 2 - (minX + maxX) / 2; + x2 = (x + shift + this.worldSize) % this.worldSize - shift; + + if (x2 - w2 < minX) x2 = minX + w2; + if (x2 + w2 > maxX) x2 = maxX - w2; + if (maxX - minX < this.width) { + s = Math.max(s, this.width / (maxX - minX)); + x2 = (maxX + minX) / 2; } } - if (this.terrain) { - this.terrain.updateTileBinding(coordsDescendingSymbol); - // All render to texture is done in translucent pass to remove need - // for depth buffer allocation per tile. - this.opaquePassCutoff = 0; + if (x2 !== x || y2 !== y) { // pan the map to fit the range + this.center = this.unproject(new ref_properties.pointGeometry(x2, y2)); } - - if (this.transform.projection.name === 'globe' && !this.globeSharedBuffers) { - this.globeSharedBuffers = new transform.GlobeSharedBuffers(this.context); + if (s) { // scale the map to fit the range + this.zoom += this.scaleZoom(s); } - // Following line is billing related code. Do not change. See LICENSE.txt - if (!transform.isMapAuthenticated(this.context.gl)) return; + this._constrainCameraAltitude(); + this._unmodified = unmodified; + this._constraining = false; + } - // 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'; + /** + * Returns the minimum zoom at which `this.width` can fit max longitude range + * and `this.height` can fit max latitude range. + * + * @returns {number} The zoom value. + */ + _minZoomForBounds() { + let minZoom = Math.max(0, this.scaleZoom(this.height / (this.worldMaxY - this.worldMinY))); + if (this.maxBounds) { + minZoom = Math.max(minZoom, this.scaleZoom(this.width / (this.worldMaxX - this.worldMinX))); + } + return minZoom; + } - for (const layerId of layerIds) { - const layer = this.style._layers[layerId]; - const sourceCache = style._getLayerSourceCache(layer); - if (!layer.hasOffscreenPass() || layer.isHidden(this.transform.zoom)) continue; + /** + * Returns the maximum distance of the camera from the center of the bounds, such that + * `this.width` can fit max longitude range and `this.height` can fit max latitude range. + * In mercator units. + * + * @returns {number} The mercator z coordinate. + */ + _maxCameraBoundsDistance() { + return this._mercatorZfromZoom(this._minZoomForBounds()); + } - const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; - if (!(layer.type === 'custom' || layer.isSky()) && !(coords && coords.length)) continue; + _calcMatrices() { + if (!this.height) return; - this.renderLayer(this, sourceCache, layer, coords); - } + const offset = this.centerOffset; - this.depthRangeFor3D = [0, 1 - ((style.order.length + 2) * this.numSublayers * this.depthEpsilon)]; + // Z-axis uses pixel coordinates when globe mode is enabled + const pixelsPerMeter = this.pixelsPerMeter; - // Terrain depth offscreen render pass ========================== - // With terrain on, renders the depth buffer into a texture. - // This texture is used for occlusion testing (labels) - if (this.terrain && (this.style.hasSymbolLayers() || this.style.hasCircleLayers())) { - this.terrain.drawDepth(); + if (this.projection.name === 'globe') { + const centerScale = ref_properties.mercatorZfromAltitude(1, this.center.lat) * this.worldSize; + const refScale = ref_properties.mercatorZfromAltitude(1, ref_properties.GLOBE_SCALE_MATCH_LATITUDE) * this.worldSize; + this._mercatorScaleRatio = centerScale / refScale; } - // Rebind the main framebuffer now that all offscreen layers have been rendered: - this.context.bindFramebuffer.set(null); - this.context.viewport.set([0, 0, this.width, this.height]); + const projectionT = getProjectionInterpolationT(this.projection, this.zoom, this.width, this.height, 1024); + this._projectionScaler = this.projection.pixelSpaceConversion(this.center.lat, this.worldSize, projectionT); - // Clear buffers in preparation for drawing to the main framebuffer - // If fog is enabled, use the fog color as default clear color. - let clearColor = transform.Color.transparent; - if (this.style.fog && this.style.fog.getOpacity(this.transform.pitch)) { - clearColor = this.style.fog.properties.get('color'); - } - this.context.clear({color: options.showOverdrawInspector ? transform.Color.black : clearColor, depth: 1}); - this.clearStencil(); + this.cameraToCenterDistance = this.getCameraToCenterDistance(this.projection); - this._showOverdrawInspector = options.showOverdrawInspector; + this._updateCameraState(); - // Opaque pass =============================================== - // Draw opaque layers top-to-bottom first. - this.renderPass = 'opaque'; + this._farZ = this.projection.farthestPixelDistance(this); - if (!this.terrain) { - for (this.currentLayer = layerIds.length - 1; this.currentLayer >= 0; this.currentLayer--) { - const layer = this.style._layers[layerIds[this.currentLayer]]; - const sourceCache = style._getLayerSourceCache(layer); - if (layer.isSky()) continue; - const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; + // The larger the value of nearZ is + // - the more depth precision is available for features (good) + // - clipping starts appearing sooner when the camera is close to 3d features (bad) + // + // Smaller values worked well for mapbox-gl-js but deckgl was encountering precision issues + // when rendering it's layers using custom layers. This value was experimentally chosen and + // seems to solve z-fighting issues in deckgl while not clipping buildings too close to the camera. + this._nearZ = this.height / 50; - this._renderTileClippingMasks(layer, sourceCache, coords); - this.renderLayer(this, sourceCache, layer, coords); - } - } + const zUnit = this.projection.zAxisUnit === "meters" ? pixelsPerMeter : 1.0; + const worldToCamera = this._camera.getWorldToCamera(this.worldSize, zUnit); + const cameraToClip = this._camera.getCameraToClipPerspective(this._fov, this.width / this.height, this._nearZ, this._farZ); - // Sky pass ====================================================== - // Draw all sky layers bottom to top. - // They are drawn at max depth, they are drawn after opaque and before - // translucent to fail depth testing and mix with translucent objects. - this.renderPass = 'sky'; - const isTransitioning = transform.globeToMercatorTransition(this.transform.zoom) > 0.0; - if ((isTransitioning || this.transform.projection.name !== 'globe') && this.transform.isHorizonVisible()) { - for (this.currentLayer = 0; this.currentLayer < layerIds.length; this.currentLayer++) { - const layer = this.style._layers[layerIds[this.currentLayer]]; - const sourceCache = style._getLayerSourceCache(layer); - if (!layer.isSky()) continue; - const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; + // Apply center of perspective offset + cameraToClip[8] = -offset.x * 2 / this.width; + cameraToClip[9] = offset.y * 2 / this.height; - this.renderLayer(this, sourceCache, layer, coords); - } - } - if (this.transform.projection.name === 'globe') { - drawGlobeAtmosphere(this); + let m = ref_properties.mul([], cameraToClip, worldToCamera); + + if (this.projection.isReprojectedInTileSpace) { + // Projections undistort as you zoom in (shear, scale, rotate). + // Apply the undistortion around the center of the map. + const mc = this.locationCoordinate(this.center); + const adjustments = ref_properties.identity([]); + ref_properties.translate(adjustments, adjustments, [mc.x * this.worldSize, mc.y * this.worldSize, 0]); + ref_properties.multiply(adjustments, adjustments, getProjectionAdjustments(this)); + ref_properties.translate(adjustments, adjustments, [-mc.x * this.worldSize, -mc.y * this.worldSize, 0]); + ref_properties.multiply(m, m, adjustments); + this.inverseAdjustmentMatrix = getProjectionAdjustmentInverted(this); + } else { + this.inverseAdjustmentMatrix = [1, 0, 0, 1]; } - // Translucent pass =============================================== - // Draw all other layers bottom-to-top. - this.renderPass = 'translucent'; + // The mercatorMatrix can be used to transform points from mercator coordinates + // ([0, 0] nw, [1, 1] se) to GL coordinates. + this.mercatorMatrix = ref_properties.scale$1([], m, [this.worldSize, this.worldSize, this.worldSize / pixelsPerMeter, 1.0]); - this.currentLayer = 0; - while (this.currentLayer < layerIds.length) { - const layer = this.style._layers[layerIds[this.currentLayer]]; - const sourceCache = style._getLayerSourceCache(layer); + this.projMatrix = m; - // Nothing to draw in translucent pass for sky layers, advance - if (layer.isSky()) { - ++this.currentLayer; - continue; - } + // For tile cover calculation, use inverted of base (non elevated) matrix + // as tile elevations are in tile coordinates and relative to center elevation. + this.invProjMatrix = ref_properties.invert$1(new Float64Array(16), this.projMatrix); - // With terrain on and for draped layers only, issue rendering and progress - // this.currentLayer until the next non-draped layer. - // Otherwise we interleave terrain draped render with non-draped layers on top - if (this.terrain && this.style.isLayerDraped(layer)) { - if (layer.isHidden(this.transform.zoom)) { - ++this.currentLayer; - continue; - } - const terrain = (((this.terrain) ) ); - const prevLayer = this.currentLayer; - this.currentLayer = terrain.renderBatch(this.currentLayer); - transform.assert_1(this.context.bindFramebuffer.current === null); - transform.assert_1(this.currentLayer > prevLayer); - continue; - } + const clipToCamera = ref_properties.invert$1([], cameraToClip); + this.frustumCorners = ref_properties.FrustumCorners.fromInvProjectionMatrix(clipToCamera, this.horizonLineFromTop(), this.height); - // For symbol layers in the translucent pass, we add extra tiles to the renderable set - // for cross-tile symbol fading. Symbol layers don't use tile clipping, so no need to render - // separate clipping masks - const coords = sourceCache ? - (layer.type === 'symbol' ? coordsDescendingSymbol : coordsDescending)[sourceCache.id] : - undefined; + const view = new Float32Array(16); + ref_properties.identity(view); + ref_properties.scale$1(view, view, [1, -1, 1]); + ref_properties.rotateX(view, view, this._pitch); + ref_properties.rotateZ(view, view, this.angle); - this._renderTileClippingMasks(layer, sourceCache, sourceCache ? coordsAscending[sourceCache.id] : undefined); - this.renderLayer(this, sourceCache, layer, coords); + const projection = ref_properties.perspective(new Float32Array(16), this._fov, this.width / this.height, this._nearZ, this._farZ); + // The distance in pixels the skybox needs to be shifted down by to meet the shifted horizon. + const skyboxHorizonShift = (Math.PI / 2 - this._pitch) * (this.height / this._fov) * this._horizonShift; + // Apply center of perspective offset to skybox projection + projection[8] = -offset.x * 2 / this.width; + projection[9] = (offset.y + skyboxHorizonShift) * 2 / this.height; + this.skyboxMatrix = ref_properties.multiply(view, projection, view); - ++this.currentLayer; - } + // 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. + const point = this.point; + const x = point.x, y = point.y; + const 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; + const alignedM = new Float64Array(m); + ref_properties.translate(alignedM, alignedM, [ dx > 0.5 ? dx - 1 : dx, dy > 0.5 ? dy - 1 : dy, 0 ]); + this.alignedProjMatrix = alignedM; - if (this.terrain) { - this.terrain.postRender(); - } + m = ref_properties.create(); + ref_properties.scale$1(m, m, [this.width / 2, -this.height / 2, 1]); + ref_properties.translate(m, m, [1, -1, 0]); + this.labelPlaneMatrix = m; - if (this.options.showTileBoundaries || this.options.showQueryGeometry) { - //Use source with highest maxzoom - let selectedSource = null; - const layers = transform.values(this.style._layers); - layers.forEach((layer) => { - const sourceCache = style._getLayerSourceCache(layer); - if (sourceCache && !layer.isHidden(this.transform.zoom)) { - if (!selectedSource || (selectedSource.getSource().maxzoom < sourceCache.getSource().maxzoom)) { - selectedSource = sourceCache; - } - } - }); - if (selectedSource) { - if (this.options.showTileBoundaries) { - draw$1.debug(this, selectedSource, selectedSource.getVisibleCoordinates()); - } + m = ref_properties.create(); + ref_properties.scale$1(m, m, [1, -1, 1]); + ref_properties.translate(m, m, [-1, -1, 0]); + ref_properties.scale$1(m, m, [2 / this.width, 2 / this.height, 1]); + this.glCoordMatrix = m; - transform.Debug.run(() => { - if (this.options.showQueryGeometry && selectedSource) { - drawDebugQueryGeometry(this, selectedSource, selectedSource.getVisibleCoordinates()); - } - }); - } - } + // matrix for conversion from location to screen coordinates + this.pixelMatrix = ref_properties.multiply(new Float64Array(16), this.labelPlaneMatrix, this.projMatrix); - if (this.options.showPadding) { - drawDebugPadding(this); - } + this._calcFogMatrices(); + this._distanceTileDataCache = {}; - // Set defaults for most GL values so that anyone using the state after the render - // encounters more expected values. - this.context.setDefault(); - this.frameCounter = (this.frameCounter + 1) % Number.MAX_SAFE_INTEGER; + // inverse matrix for conversion from screen coordinates to location + m = ref_properties.invert$1(new Float64Array(16), this.pixelMatrix); + if (!m) throw new Error("failed to invert matrix"); + this.pixelMatrixInverse = m; - if (this.tileLoaded && this.options.speedIndexTiming) { - this.loadTimeStamps.push(transform.window.performance.now()); - this.saveCanvasCopy(); - } - } + if (this.projection.name === 'globe' || this.mercatorFromTransition) { + this.globeMatrix = ref_properties.calculateGlobeMatrix(this); - renderLayer(painter , sourceCache , layer , coords ) { - if (layer.isHidden(this.transform.zoom)) return; - if (layer.type !== 'background' && layer.type !== 'sky' && layer.type !== 'custom' && !(coords && coords.length)) return; - this.id = layer.id; + const globeCenter = [this.globeMatrix[12], this.globeMatrix[13], this.globeMatrix[14]]; - this.gpuTimingStart(layer); - if (!painter.transform.projection.unsupportedLayers || !painter.transform.projection.unsupportedLayers.includes(layer.type)) { - draw$1[layer.type](painter, sourceCache, layer, coords, this.style.placement.variableOffsets, this.options.isInitialLoad); + this.globeCenterInViewSpace = ref_properties.transformMat4(globeCenter, globeCenter, worldToCamera); + this.globeRadius = this.worldSize / 2.0 / Math.PI - 1.0; + } else { + this.globeMatrix = m; } - this.gpuTimingEnd(); - } - gpuTimingStart(layer ) { - if (!this.options.gpuTiming) return; - const ext = this.context.extTimerQuery; - // This tries to time the draw call itself, but note that the cost for drawing a layer - // may be dominated by the cost of uploading vertices to the GPU. - // To instrument that, we'd need to pass the layerTimers object down into the bucket - // uploading logic. - let layerTimer = this.gpuTimers[layer.id]; - if (!layerTimer) { - layerTimer = this.gpuTimers[layer.id] = { - calls: 0, - cpuTime: 0, - query: ext.createQueryEXT() - }; - } - layerTimer.calls++; - ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, layerTimer.query); + this._projMatrixCache = {}; + this._alignedProjMatrixCache = {}; + this._pixelsToTileUnitsCache = {}; } - gpuTimingEnd() { - if (!this.options.gpuTiming) return; - const ext = this.context.extTimerQuery; - ext.endQueryEXT(ext.TIME_ELAPSED_EXT); - } + _calcFogMatrices() { + this._fogTileMatrixCache = {}; - collectGpuTimers() { - const currentLayerTimers = this.gpuTimers; - this.gpuTimers = {}; - return currentLayerTimers; - } + const cameraWorldSize = this.cameraWorldSize; + const cameraPixelsPerMeter = this.cameraPixelsPerMeter; + const cameraPos = this._camera.position; - queryGpuTimers(gpuTimers ) { - const layers = {}; - for (const layerId in gpuTimers) { - const gpuTimer = gpuTimers[layerId]; - const ext = this.context.extTimerQuery; - const gpuTime = ext.getQueryObjectEXT(gpuTimer.query, ext.QUERY_RESULT_EXT) / (1000 * 1000); - ext.deleteQueryEXT(gpuTimer.query); - layers[layerId] = gpuTime; - } - return layers; + // The mercator fog matrix encodes transformation necessary to transform a position to camera fog space (in meters): + // translates p to camera origin and transforms it from pixels to meters. The windowScaleFactor is used to have a + // consistent transformation across different window sizes. + // - p = p - cameraOrigin + // - p.xy = p.xy * cameraWorldSize * windowScaleFactor + // - p.z = p.z * cameraPixelsPerMeter * windowScaleFactor + const windowScaleFactor = 1 / this.height / this._projectionScaler; + const metersToPixel = [cameraWorldSize, cameraWorldSize, cameraPixelsPerMeter]; + ref_properties.scale$3(metersToPixel, metersToPixel, windowScaleFactor); + ref_properties.scale$3(cameraPos, cameraPos, -1); + ref_properties.multiply$2(cameraPos, cameraPos, metersToPixel); + + const m = ref_properties.create(); + ref_properties.translate(m, m, cameraPos); + ref_properties.scale$1(m, m, metersToPixel); + this.mercatorFogMatrix = m; + + // The worldToFogMatrix can be used for conversion from world coordinates to relative camera position in + // units of fractions of the map height. Later composed with tile position to construct the fog tile matrix. + this.worldToFogMatrix = this._camera.getWorldToCameraPosition(cameraWorldSize, cameraPixelsPerMeter, windowScaleFactor); } - /** - * 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 - * @private - */ - translatePosMatrix(matrix , tile , translate , translateAnchor , inViewportPixelUnitsUnits ) { - if (!translate[0] && !translate[1]) return matrix; + _computeCameraPosition(targetPixelsPerMeter ) { + targetPixelsPerMeter = targetPixelsPerMeter || this.pixelsPerMeter; + const pixelSpaceConversion = targetPixelsPerMeter / this.pixelsPerMeter; - const angle = inViewportPixelUnitsUnits ? - (translateAnchor === 'map' ? this.transform.angle : 0) : - (translateAnchor === 'viewport' ? -this.transform.angle : 0); + const dir = this._camera.forward(); + const center = this.point; - if (angle) { - const sinA = Math.sin(angle); - const cosA = Math.cos(angle); - translate = [ - translate[0] * cosA - translate[1] * sinA, - translate[0] * sinA + translate[1] * cosA - ]; - } + // Compute camera position using the following vector math: camera.position = map.center - camera.forward * cameraToCenterDist + // Camera distance to the center can be found in mercator units by subtracting the center elevation from + // camera's zenith position (which can be deduced from the zoom level) + const zoom = this._seaLevelZoom ? this._seaLevelZoom : this._zoom; + const altitude = this._mercatorZfromZoom(zoom) * pixelSpaceConversion; + const distance = altitude - targetPixelsPerMeter / this.worldSize * this._centerAltitude; - const translation = [ - inViewportPixelUnitsUnits ? translate[0] : transform.pixelsToTileUnits(tile, translate[0], this.transform.zoom), - inViewportPixelUnitsUnits ? translate[1] : transform.pixelsToTileUnits(tile, translate[1], this.transform.zoom), - 0 + return [ + center.x / this.worldSize - dir[0] * distance, + center.y / this.worldSize - dir[1] * distance, + targetPixelsPerMeter / this.worldSize * this._centerAltitude - dir[2] * distance ]; - - const translatedMatrix = new Float32Array(16); - transform.translate(translatedMatrix, matrix, translation); - return translatedMatrix; } - saveTileTexture(texture ) { - const textures = this._tileTextures[texture.size[0]]; - if (!textures) { - this._tileTextures[texture.size[0]] = [texture]; - } else { - textures.push(texture); - } - } + _updateCameraState() { + if (!this.height) return; - getTileTexture(size ) { - const textures = this._tileTextures[size]; - return textures && textures.length > 0 ? textures.pop() : null; + // Set camera orientation and move it to a proper distance from the map + this._camera.setPitchBearing(this._pitch, this.angle); + this._camera.position = this._computeCameraPosition(); } /** - * Checks whether a pattern image is needed, and if it is, whether it is not loaded. + * Apply a 3d translation to the camera position, but clamping it so that + * it respects the maximum longitude and latitude range set. * -* @returns true if a needed image is missing and rendering needs to be skipped. - * @private + * @param {vec3} translation The translation vector. */ - isPatternMissing(image ) { - if (!image) return false; - if (!image.from || !image.to) return true; - const imagePosA = this.imageManager.getPattern(image.from.toString()); - const imagePosB = this.imageManager.getPattern(image.to.toString()); - return !imagePosA || !imagePosB; - } + _translateCameraConstrained(translation ) { + const maxDistance = this._maxCameraBoundsDistance(); + // Define a ceiling in mercator Z + const maxZ = maxDistance * Math.cos(this._pitch); + const z = this._camera.position[2]; + const deltaZ = translation[2]; + let t = 1; + // we only need to clamp if the camera is moving upwards + if (deltaZ > 0) { + t = Math.min((maxZ - z) / deltaZ, 1); + } - /** - * Returns #defines that would need to be injected into every Program - * based on the current state of Painter. - * - * @returns {string[]} - * @private - */ - currentGlobalDefines() { - const terrain = this.terrain && !this.terrain.renderingToTexture; // Enables elevation sampling in vertex shader. - const rtt = this.terrain && this.terrain.renderingToTexture; - const fog = this.style && this.style.fog; - const defines = []; + this._camera.position = ref_properties.scaleAndAdd([], this._camera.position, translation, t); + this._updateStateFromCamera(); - if (terrain) defines.push('TERRAIN'); - // When terrain is active, fog is rendered as part of draping, not as part of tile - // rendering. Removing the fog flag during tile rendering avoids additional defines. - if (fog && !rtt && fog.getOpacity(this.transform.pitch) !== 0.0) { - defines.push('FOG'); - } - if (rtt) defines.push('RENDER_TO_TEXTURE'); - if (this._showOverdrawInspector) defines.push('OVERDRAW_INSPECTOR'); - return defines; + if (this.projection.wrap) + this.center = this.center.wrap(); } - useProgram(name , programConfiguration , fixedDefines ) { - this.cache = this.cache || {}; - const defines = (((fixedDefines || []) ) ); + _updateStateFromCamera() { + const position = this._camera.position; + const dir = this._camera.forward(); + const {pitch, bearing} = this._camera.getPitchBearing(); - const globalDefines = this.currentGlobalDefines(); - const allDefines = globalDefines.concat(defines); - const key = Program.cacheKey(name, allDefines, programConfiguration); + // Compute zoom from the distance between camera and terrain + const centerAltitude = ref_properties.mercatorZfromAltitude(this._centerAltitude, this.center.lat) * this._projectionScaler; + const minHeight = this._mercatorZfromZoom(this._maxZoom) * Math.cos(ref_properties.degToRad(this._maxPitch)); + const height = Math.max((position[2] - centerAltitude) / Math.cos(pitch), minHeight); + const zoom = this._zoomFromMercatorZ(height); - if (!this.cache[key]) { - this.cache[key] = new Program(this.context, name, shaders[name], programConfiguration, programUniforms[name], allDefines); - } - return this.cache[key]; - } + // Cast a ray towards the ground to find the center point + ref_properties.scaleAndAdd(position, position, dir, height); - /* - * Reset some GL state to default values to avoid hard-to-debug bugs - * in custom layers. - */ - setCustomLayerDefaults() { - // Prevent custom layers from unintentionally modify the last VAO used. - // All other state is state is restored on it's own, but for VAOs it's - // simpler to unbind so that we don't have to track the state of VAOs. - this.context.unbindVAO(); + this._pitch = ref_properties.clamp(pitch, ref_properties.degToRad(this.minPitch), ref_properties.degToRad(this.maxPitch)); + this.angle = ref_properties.wrap(bearing, -Math.PI, Math.PI); + this._setZoom(ref_properties.clamp(zoom, this._minZoom, this._maxZoom)); + this._updateSeaLevelZoom(); - // The default values for this state is meaningful and often expected. - // Leaving this state dirty could cause a lot of confusion for users. - this.context.cullFace.setDefault(); - this.context.frontFace.setDefault(); - this.context.cullFaceSide.setDefault(); - this.context.activeTexture.setDefault(); - this.context.pixelStoreUnpack.setDefault(); - this.context.pixelStoreUnpackPremultiplyAlpha.setDefault(); - this.context.pixelStoreUnpackFlipY.setDefault(); + this._center = this.coordinateLocation(new ref_properties.MercatorCoordinate(position[0], position[1], position[2])); + this._unmodified = false; + this._constrain(); + this._calcMatrices(); } - /* - * Set GL state that is shared by all layers. - */ - setBaseState() { - const gl = this.context.gl; - this.context.cullFace.set(false); - this.context.viewport.set([0, 0, this.width, this.height]); - this.context.blendEquation.set(gl.FUNC_ADD); + _worldSizeFromZoom(zoom ) { + return Math.pow(2.0, zoom) * this.tileSize; } - initDebugOverlayCanvas() { - if (this.debugOverlayCanvas == null) { - this.debugOverlayCanvas = transform.window.document.createElement('canvas'); - this.debugOverlayCanvas.width = 512; - this.debugOverlayCanvas.height = 512; - const gl = this.context.gl; - this.debugOverlayTexture = new transform.Texture(this.context, this.debugOverlayCanvas, gl.RGBA); - } + _mercatorZfromZoom(zoom ) { + return this.cameraToCenterDistance / this._worldSizeFromZoom(zoom); } - destroy() { - if (this._terrain) { - this._terrain.destroy(); - } - if (this.globeSharedBuffers) { - this.globeSharedBuffers.destroy(); - } - this.emptyTexture.destroy(); - if (this.debugOverlayTexture) { - this.debugOverlayTexture.destroy(); - } + _minimumHeightOverTerrain() { + // Determine minimum height for the camera over the terrain related to current zoom. + // Values above than 2 allow max-pitch camera closer to e.g. top of the hill, exposing + // drape raster overscale artifacts or cut terrain (see under it) as it gets clipped on + // near plane. Returned value is in mercator coordinates. + const MAX_DRAPE_OVERZOOM = 2; + const zoom = Math.min((this._seaLevelZoom != null ? this._seaLevelZoom : this._zoom) + MAX_DRAPE_OVERZOOM, this._maxZoom); + return this._mercatorZfromZoom(zoom); } - prepareDrawTile(tileID ) { - if (this.terrain) { - this.terrain.prepareDrawTile(tileID); + _zoomFromMercatorZ(z ) { + return this.scaleZoom(this.cameraToCenterDistance / (z * this.tileSize)); + } + + _terrainEnabled() { + if (!this._elevation) return false; + if (!this.projection.supportsTerrain) { + ref_properties.warnOnce('Terrain is not yet supported with alternate projections. Use mercator or globe to enable terrain.'); + return false; } + return true; } - prepareDrawProgram(context , program , tileID ) { + // Check if any of the four corners are off the edge of the rendered map + // This function will return `false` for all non-mercator projection + anyCornerOffEdge(p0 , p1 ) { + const minX = Math.min(p0.x, p1.x); + const maxX = Math.max(p0.x, p1.x); + const minY = Math.min(p0.y, p1.y); + const maxY = Math.max(p0.y, p1.y); - // Fog is not enabled when rendering to texture so we - // can safely skip uploading uniforms in that case - if (this.terrain && this.terrain.renderingToTexture) { - return; + const horizon = this.horizonLineFromTop(false); + if (minY < horizon) return true; + + if (this.projection.name !== 'mercator') { + return false; } - const fog = this.style.fog; + const min = new ref_properties.pointGeometry(minX, minY); + const max = new ref_properties.pointGeometry(maxX, maxY); - if (fog) { - const fogOpacity = fog.getOpacity(this.transform.pitch); - if (fogOpacity !== 0.0) { - program.setFogUniformValues(context, fogUniformValues(this, fog, tileID, fogOpacity)); + const corners = [ + min, max, + new ref_properties.pointGeometry(minX, maxY), + new ref_properties.pointGeometry(maxX, minY), + ]; + + const minWX = (this.renderWorldCopies) ? -NUM_WORLD_COPIES : 0; + const maxWX = (this.renderWorldCopies) ? 1 + NUM_WORLD_COPIES : 1; + const minWY = 0; + const maxWY = 1; + + for (const corner of corners) { + const rayIntersection = this.pointRayIntersection(corner); + // Point is above the horizon + if (rayIntersection.t < 0) { + return true; + } + // Point is off the bondaries of the map + const coordinate = this.rayIntersectionCoordinate(rayIntersection); + if (coordinate.x < minWX || coordinate.y < minWY || + coordinate.x > maxWX || coordinate.y > maxWY) { + return true; } } - } - setTileLoadedFlag(flag ) { - this.tileLoaded = flag; + return false; } - saveCanvasCopy() { - this.frameCopies.push(this.canvasCopy()); - this.tileLoaded = false; - } + // Checks the four corners of the frustum to see if they lie in the map's quad. + // + isHorizonVisible() { - canvasCopy() { - const gl = this.context.gl; - const texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, 0); - return texture; - } + // we consider the horizon as visible if the angle between + // a the top plane of the frustum and the map plane is smaller than this threshold. + const horizonAngleEpsilon = 2; + if (this.pitch + ref_properties.radToDeg(this.fovAboveCenter) > (90 - horizonAngleEpsilon)) { + return true; + } - getCanvasCopiesAndTimestamps() { - return { - canvasCopies: this.frameCopies, - timeStamps: this.loadTimeStamps - }; + return this.anyCornerOffEdge(new ref_properties.pointGeometry(0, 0), new ref_properties.pointGeometry(this.width, this.height)); } - averageElevationNeedsEasing() { - if (!this.transform._elevation) return false; - - const fog = this.style && this.style.fog; - if (!fog) return false; - - const fogOpacity = fog.getOpacity(this.transform.pitch); - if (fogOpacity === 0) return false; - - return true; + /** + * Converts a zoom delta value into a physical distance travelled in web mercator coordinates. + * + * @param {vec3} center Destination mercator point of the movement. + * @param {number} zoomDelta Change in the zoom value. + * @returns {number} The distance in mercator coordinates. + */ + zoomDeltaToMovement(center , zoomDelta ) { + const distance = ref_properties.length(ref_properties.sub([], this._camera.position, center)); + const relativeZoom = this._zoomFromMercatorZ(distance) + zoomDelta; + return distance - this._mercatorZfromZoom(relativeZoom); } - getBackgroundTiles() { - const oldTiles = this._backgroundTiles; - const newTiles = this._backgroundTiles = {}; - - const tileSize = 512; - const tileIDs = this.transform.coveringTiles({tileSize}); - for (const tileID of tileIDs) { - newTiles[tileID.key] = oldTiles[tileID.key] || new transform.Tile(tileID, tileSize, this.transform.tileZoom, this); + /* + * The camera looks at the map from a 3D (lng, lat, altitude) location. Let's use `cameraLocation` + * as the name for the location under the camera and on the surface of the earth (lng, lat, 0). + * `cameraPoint` is the projected position of the `cameraLocation`. + * + * This point is useful to us because only fill-extrusions that are between `cameraPoint` and + * the query point on the surface of the earth can extend and intersect the query. + * + * When the map is not pitched the `cameraPoint` is equivalent to the center of the map because + * the camera is right above the center of the map. + */ + getCameraPoint() { + if (this.projection.name === 'globe') { + // Find precise location of the projected camera position on the curved surface + const center = [this.globeMatrix[12], this.globeMatrix[13], this.globeMatrix[14]]; + const pos = projectClamped(center, this.pixelMatrix); + return new ref_properties.pointGeometry(pos[0], pos[1]); + } else { + const pitch = this._pitch; + const yOffset = Math.tan(pitch) * (this.cameraToCenterDistance || 1); + return this.centerPoint.add(new ref_properties.pointGeometry(0, yOffset)); } - return newTiles; } - clearBackgroundTiles() { - this._backgroundTiles = {}; + getCameraToCenterDistance(projection ) { + const t = getProjectionInterpolationT(projection, this.zoom, this.width, this.height, 1024); + const projectionScaler = projection.pixelSpaceConversion(this.center.lat, this.worldSize, t); + return 0.5 / Math.tan(this._fov * 0.5) * this.height * projectionScaler; } } @@ -64486,13 +67992,13 @@ function throttle(fn , time ) { * @returns {Hash} `this` */ class Hash { - + constructor(hashName ) { this._hashName = hashName && encodeURIComponent(hashName); - transform.bindAll([ + ref_properties.bindAll([ '_getCurrentHash', '_onHashChange', '_updateHash' @@ -64508,10 +68014,10 @@ class Hash { * @param {Object} map * @returns {Hash} `this` */ - addTo(map ) { + addTo(map ) { this._map = map; - transform.window.addEventListener('hashchange', this._onHashChange, false); - this._map.on('moveend', this._updateHash); + ref_properties.window.addEventListener('hashchange', this._onHashChange, false); + map.on('moveend', this._updateHash); return this; } @@ -64520,25 +68026,29 @@ class Hash { * * @returns {Popup} `this` */ - remove() { - transform.window.removeEventListener('hashchange', this._onHashChange, false); + remove() { + if (!this._map) return this; + this._map.off('moveend', this._updateHash); + ref_properties.window.removeEventListener('hashchange', this._onHashChange, false); clearTimeout(this._updateHash()); - delete this._map; + this._map = undefined; return this; } - getHashString(mapFeedback ) { - const center = this._map.getCenter(), - zoom = Math.round(this._map.getZoom() * 100) / 100, + getHashString(mapFeedback ) { + const map = this._map; + if (!map) return ''; + const center = map.getCenter(), + zoom = Math.round(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(); + bearing = map.getBearing(), + pitch = map.getPitch(); let hash = ''; if (mapFeedback) { // new map feedback site has some constraints that don't allow @@ -64554,7 +68064,7 @@ class Hash { if (this._hashName) { const hashName = this._hashName; let found = false; - const parts = transform.window.location.hash.slice(1).split('&').map(part => { + const parts = ref_properties.window.location.hash.slice(1).split('&').map(part => { const key = part.split('=')[0]; if (key === hashName) { found = true; @@ -64571,9 +68081,9 @@ class Hash { return `#${hash}`; } - _getCurrentHash() { + _getCurrentHash() { // Get the current hash from location, stripped from its number sign - const hash = transform.window.location.hash.replace('#', ''); + const hash = ref_properties.window.location.hash.replace('#', ''); if (this._hashName) { // Split the parameter-styled hash into parts and find the value we need let keyval; @@ -64589,11 +68099,13 @@ class Hash { return hash.split('/'); } - _onHashChange() { + _onHashChange() { + const map = this._map; + if (!map) return false; const loc = this._getCurrentHash(); if (loc.length >= 3 && !loc.some(v => isNaN(v))) { - const bearing = this._map.dragRotate.isEnabled() && this._map.touchZoomRotate.isEnabled() ? +(loc[3] || 0) : this._map.getBearing(); - this._map.jumpTo({ + const bearing = map.dragRotate.isEnabled() && map.touchZoomRotate.isEnabled() ? +(loc[3] || 0) : map.getBearing(); + map.jumpTo({ center: [+loc[2], +loc[1]], zoom: +loc[0], bearing, @@ -64606,36 +68118,38 @@ class Hash { _updateHashUnthrottled() { // Replace if already present, else append the updated hash string - const location = transform.window.location.href.replace(/(#.+)?$/, this.getHashString()); - transform.window.history.replaceState(transform.window.history.state, null, location); + const location = ref_properties.window.location.href.replace(/(#.+)?$/, this.getHashString()); + ref_properties.window.history.replaceState(ref_properties.window.history.state, null, location); } } // + + const defaultInertiaOptions = { linearity: 0.3, - easing: transform.bezier(0, 0, 0.3, 1), + easing: ref_properties.bezier(0, 0, 0.3, 1), }; -const defaultPanInertiaOptions = transform.extend({ +const defaultPanInertiaOptions = ref_properties.extend({ deceleration: 2500, maxSpeed: 1400 }, defaultInertiaOptions); -const defaultZoomInertiaOptions = transform.extend({ +const defaultZoomInertiaOptions = ref_properties.extend({ deceleration: 20, maxSpeed: 1400 }, defaultInertiaOptions); -const defaultBearingInertiaOptions = transform.extend({ +const defaultBearingInertiaOptions = ref_properties.extend({ deceleration: 1000, maxSpeed: 360 }, defaultInertiaOptions); -const defaultPitchInertiaOptions = transform.extend({ +const defaultPitchInertiaOptions = ref_properties.extend({ deceleration: 1000, maxSpeed: 90 }, defaultInertiaOptions); @@ -64664,19 +68178,19 @@ class HandlerInertia { record(settings ) { this._drainInertiaBuffer(); - this._inertiaBuffer.push({time: transform.exported.now(), settings}); + this._inertiaBuffer.push({time: ref_properties.exported.now(), settings}); } _drainInertiaBuffer() { const inertia = this._inertiaBuffer, - now = transform.exported.now(), + now = ref_properties.exported.now(), cutoff = 160; //msec while (inertia.length > 0 && now - inertia[0].time > cutoff) inertia.shift(); } - _onMoveEnd(panInertiaOptions ) { + _onMoveEnd(panInertiaOptions ) { this._drainInertiaBuffer(); if (this._inertiaBuffer.length < 2) { return; @@ -64686,7 +68200,7 @@ class HandlerInertia { zoom: 0, bearing: 0, pitch: 0, - pan: new transform.pointGeometry(0, 0), + pan: new ref_properties.pointGeometry(0, 0), pinchAround: undefined, around: undefined }; @@ -64706,7 +68220,7 @@ class HandlerInertia { const easeOptions = {}; if (deltas.pan.mag()) { - const result = calculateEasing(deltas.pan.mag(), duration, transform.extend({}, defaultPanInertiaOptions, panInertiaOptions || {})); + const result = calculateEasing(deltas.pan.mag(), duration, ref_properties.extend({}, defaultPanInertiaOptions, panInertiaOptions || {})); easeOptions.offset = deltas.pan.mult(result.amount / deltas.pan.mag()); easeOptions.center = this._map.transform.center; extendDuration(easeOptions, result); @@ -64720,7 +68234,7 @@ class HandlerInertia { if (deltas.bearing) { const result = calculateEasing(deltas.bearing, duration, defaultBearingInertiaOptions); - easeOptions.bearing = this._map.transform.bearing + transform.clamp(result.amount, -179, 179); + easeOptions.bearing = this._map.transform.bearing + ref_properties.clamp(result.amount, -179, 179); extendDuration(easeOptions, result); } @@ -64736,10 +68250,8 @@ class HandlerInertia { } this.clear(); - return transform.extend(easeOptions, { - noMoveStart: true - }); - + easeOptions.noMoveStart = true; + return easeOptions; } } @@ -64754,7 +68266,7 @@ function extendDuration(easeOptions, result) { function calculateEasing(amount, inertiaDuration , inertiaOptions) { const {maxSpeed, linearity, deceleration} = inertiaOptions; - const speed = transform.clamp( + const speed = ref_properties.clamp( amount * linearity / (inertiaDuration / 1000), -maxSpeed, maxSpeed); @@ -64799,7 +68311,7 @@ function calculateEasing(amount, inertiaDuration , inertiaOptions) { * @see [Example: Display popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/) * @see [Example: Display popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) */ -class MapMouseEvent extends transform.Event { +class MapMouseEvent extends ref_properties.Event { /** * The type of originating event. For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events). */ @@ -64899,9 +68411,9 @@ class MapMouseEvent extends transform.Event { * @private */ constructor(type , map , originalEvent , data = {}) { - const point = DOM.mousePos(map.getCanvasContainer(), originalEvent); + const point = mousePos(map.getCanvasContainer(), originalEvent); const lngLat = map.unproject(point); - super(type, transform.extend({point, lngLat, originalEvent}, data)); + super(type, ref_properties.extend({point, lngLat, originalEvent}, data)); this._defaultPrevented = false; this.target = map; } @@ -64948,7 +68460,7 @@ class MapMouseEvent extends transform.Event { * @see [Reference: `Map` events API documentation](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events) * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/) */ -class MapTouchEvent extends transform.Event { +class MapTouchEvent extends ref_properties.Event { /** * The type of originating event. For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events). */ @@ -65045,11 +68557,11 @@ class MapTouchEvent extends transform.Event { */ constructor(type , map , originalEvent ) { const touches = type === "touchend" ? originalEvent.changedTouches : originalEvent.touches; - const points = DOM.touchPos(map.getCanvasContainer(), touches); + const points = touchPos(map.getCanvasContainer(), touches); const lngLats = points.map((t) => map.unproject(t)); const point = points.reduce((prev, curr, i, arr) => { return prev.add(curr.div(arr.length)); - }, new transform.pointGeometry(0, 0)); + }, new ref_properties.pointGeometry(0, 0)); const lngLat = map.unproject(point); super(type, {points, point, lngLats, lngLat, originalEvent}); this._defaultPrevented = false; @@ -65077,7 +68589,7 @@ class MapTouchEvent extends transform.Event { * // } * @see [Reference: `Map` events API documentation](https://docs.mapbox.com/mapbox-gl-js/api/map/#map-events) */ -class MapWheelEvent extends transform.Event { +class MapWheelEvent extends ref_properties.Event { /** * The type of originating event. For a full list of available events, see [`Map` events](/mapbox-gl-js/api/map/#map-events). */ @@ -65200,11 +68712,14 @@ class MapWheelEvent extends transform.Event { */ // + + + class MapEventHandler { - + @@ -65214,16 +68729,16 @@ class MapEventHandler { } reset() { - delete this._mousedownPos; + this._mousedownPos = undefined; } - wheel(e ) { + wheel(e ) { // If mapEvent.preventDefault() is called by the user, prevent handlers such as: // - ScrollZoom return this._firePreventable(new MapWheelEvent(e.type, this._map, e)); } - mousedown(e , point ) { + mousedown(e , point ) { this._mousedownPos = point; // If mapEvent.preventDefault() is called by the user, prevent handlers such as: // - MousePan @@ -65238,7 +68753,7 @@ class MapEventHandler { } preclick(e ) { - const synth = transform.extend({}, e); + const synth = ref_properties.extend({}, e); synth.type = 'preclick'; this._map.fire(new MapMouseEvent(synth.type, this._map, synth)); } @@ -65249,7 +68764,7 @@ class MapEventHandler { this._map.fire(new MapMouseEvent(e.type, this._map, e)); } - dblclick(e ) { + dblclick(e ) { // If mapEvent.preventDefault() is called by the user, prevent handlers such as: // - DblClickZoom return this._firePreventable(new MapMouseEvent(e.type, this._map, e)); @@ -65263,7 +68778,7 @@ class MapEventHandler { this._map.fire(new MapMouseEvent(e.type, this._map, e)); } - touchstart(e ) { + touchstart(e ) { // If mapEvent.preventDefault() is called by the user, prevent handlers such as: // - TouchPan // - TouchZoom @@ -65286,7 +68801,7 @@ class MapEventHandler { this._map.fire(new MapTouchEvent(e.type, this._map, e)); } - _firePreventable(mapEvent ) { + _firePreventable(mapEvent ) { this._map.fire(mapEvent); if (mapEvent.defaultPrevented) { // returning an object marks the handler as active and resets other handlers @@ -65294,11 +68809,11 @@ class MapEventHandler { } } - isEnabled() { + isEnabled() { return true; } - isActive() { + isActive() { return false; } enable() {} @@ -65308,7 +68823,7 @@ class MapEventHandler { class BlockableMapEventHandler { - + constructor(map ) { this._map = map; @@ -65316,7 +68831,7 @@ class BlockableMapEventHandler { reset() { this._delayContextMenu = false; - delete this._contextMenuEvent; + this._contextMenuEvent = undefined; } mousemove(e ) { @@ -65350,11 +68865,11 @@ class BlockableMapEventHandler { } } - isEnabled() { + isEnabled() { return true; } - isActive() { + isActive() { return false; } enable() {} @@ -65364,6 +68879,8 @@ class BlockableMapEventHandler { // + + /** * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box. @@ -65402,7 +68919,7 @@ class BoxZoomHandler { * @example * const isBoxZoomEnabled = map.boxZoom.isEnabled(); */ - isEnabled() { + isEnabled() { return !!this._enabled; } @@ -65413,7 +68930,7 @@ class BoxZoomHandler { * @example * const isBoxZoomActive = map.boxZoom.isActive(); */ - isActive() { + isActive() { return !!this._active; } @@ -65443,7 +68960,7 @@ class BoxZoomHandler { if (!this.isEnabled()) return; if (!(e.shiftKey && e.button === 0)) return; - DOM.disableDrag(); + disableDrag(); this._startPos = this._lastPos = point; this._active = true; } @@ -65461,7 +68978,7 @@ class BoxZoomHandler { this._lastPos = pos; if (!this._box) { - this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container); + this._box = create$1('div', 'mapboxgl-boxzoom', this._container); this._container.classList.add('mapboxgl-crosshair'); this._fireEvent('boxzoomstart', e); } @@ -65480,7 +68997,7 @@ class BoxZoomHandler { }); } - mouseupWindow(e , point ) { + mouseupWindow(e , point ) { if (!this._active) return; if (e.button !== 0) return; @@ -65490,14 +69007,14 @@ class BoxZoomHandler { this.reset(); - DOM.suppressClick(); + suppressClick(); if (p0.x === p1.x && p0.y === p1.y) { this._fireEvent('boxzoomcancel', e); } else { - this._map.fire(new transform.Event('boxzoomend', {originalEvent: e})); + this._map.fire(new ref_properties.Event('boxzoomend', {originalEvent: e})); return { - cameraAnimation: map => map.fitScreenCoordinates(p0, p1, this._map.getBearing(), {linear: false}) + cameraAnimation: (map ) => map.fitScreenCoordinates(p0, p1, this._map.getBearing(), {linear: false}) }; } } @@ -65525,21 +69042,23 @@ class BoxZoomHandler { this._box = (null ); } - DOM.enableDrag(); + enableDrag(); delete this._startPos; delete this._lastPos; } - _fireEvent(type , e ) { - return this._map.fire(new transform.Event(type, {originalEvent: e})); + _fireEvent(type , e ) { + return this._map.fire(new ref_properties.Event(type, {originalEvent: e})); } } // -function indexTouches(touches , points ) { - transform.assert_1(touches.length === points.length); + + +function indexTouches(touches , points ) { + ref_properties.assert_1(touches.length === points.length); const obj = {}; for (let i = 0; i < touches.length; i++) { obj[touches[i].identifier] = points[i]; @@ -65550,7 +69069,7 @@ function indexTouches(touches , points ) { // function getCentroid(points ) { - const sum = new transform.pointGeometry(0, 0); + const sum = new ref_properties.pointGeometry(0, 0); for (const point of points) { sum._add(point); } @@ -65564,7 +69083,7 @@ const MAX_DIST = 30; class SingleTapRecognizer { - + @@ -65575,9 +69094,9 @@ class SingleTapRecognizer { } reset() { - delete this.centroid; - delete this.startTime; - delete this.touches; + this.centroid = undefined; + this.startTime = 0; + this.touches = {}; this.aborted = false; } @@ -65590,7 +69109,7 @@ class SingleTapRecognizer { return; } - if (this.startTime === undefined) { + if (this.startTime === 0) { this.startTime = e.timeStamp; } @@ -65613,7 +69132,7 @@ class SingleTapRecognizer { } } - touchend(e , points , mapTouches ) { + touchend(e , points , mapTouches ) { if (!this.centroid || e.timeStamp - this.startTime > MAX_TOUCH_TIME) { this.aborted = true; } @@ -65632,7 +69151,7 @@ class TapRecognizer { - + constructor(options ) { @@ -65643,7 +69162,7 @@ class TapRecognizer { reset() { this.lastTime = Infinity; - delete this.lastTap; + this.lastTap = undefined; this.count = 0; this.singleTap.reset(); } @@ -65656,7 +69175,7 @@ class TapRecognizer { this.singleTap.touchmove(e, points, mapTouches); } - touchend(e , points , mapTouches ) { + touchend(e , points , mapTouches ) { const tap = this.singleTap.touchend(e, points, mapTouches); if (tap) { const soonEnough = e.timeStamp - this.lastTime < MAX_TAP_INTERVAL; @@ -65681,6 +69200,7 @@ class TapRecognizer { // + class TapZoomHandler { @@ -65719,7 +69239,7 @@ class TapZoomHandler { this._zoomOut.touchmove(e, points, mapTouches); } - touchend(e , points , mapTouches ) { + touchend(e , points , mapTouches ) { const zoomInPoint = this._zoomIn.touchend(e, points, mapTouches); const zoomOutPoint = this._zoomOut.touchend(e, points, mapTouches); @@ -65761,17 +69281,18 @@ class TapZoomHandler { this.reset(); } - isEnabled() { + isEnabled() { return this._enabled; } - isActive() { + isActive() { return this._active; } } // + const LEFT_BUTTON = 0; const RIGHT_BUTTON = 2; @@ -65791,8 +69312,8 @@ class MouseHandler { - - + + @@ -65808,34 +69329,34 @@ class MouseHandler { reset() { this._active = false; this._moved = false; - delete this._lastPoint; - delete this._eventButton; + this._lastPoint = undefined; + this._eventButton = undefined; } - _correctButton(e , button ) { //eslint-disable-line + _correctButton(e , button ) { //eslint-disable-line return false; // implemented by child } - _move(lastPoint , point ) { //eslint-disable-line + _move(lastPoint , point ) { //eslint-disable-line return {}; // implemented by child } mousedown(e , point ) { if (this._lastPoint) return; - const eventButton = DOM.mouseButton(e); + const eventButton = mouseButton(e); if (!this._correctButton(e, eventButton)) return; this._lastPoint = point; this._eventButton = eventButton; } - mousemoveWindow(e , point ) { + mousemoveWindow(e , point ) { const lastPoint = this._lastPoint; if (!lastPoint) return; e.preventDefault(); - if (buttonStillPressed(e, this._eventButton)) { + if (this._eventButton != null && buttonStillPressed(e, this._eventButton)) { // Some browsers don't fire a `mouseup` when the mouseup occurs outside // the window or iframe: // https://github.com/mapbox/mapbox-gl-js/issues/4622 @@ -65856,9 +69377,9 @@ class MouseHandler { mouseupWindow(e ) { if (!this._lastPoint) return; - const eventButton = DOM.mouseButton(e); + const eventButton = mouseButton(e); if (eventButton !== this._eventButton) return; - if (this._moved) DOM.suppressClick(); + if (this._moved) suppressClick(); this.reset(); } @@ -65871,11 +69392,11 @@ class MouseHandler { this.reset(); } - isEnabled() { + isEnabled() { return this._enabled; } - isActive() { + isActive() { return this._active; } } @@ -65886,11 +69407,11 @@ class MousePanHandler extends MouseHandler { super.mousedown(e, point); if (this._lastPoint) this._active = true; } - _correctButton(e , button ) { + _correctButton(e , button ) { return button === LEFT_BUTTON && !e.ctrlKey; } - _move(lastPoint , point ) { + _move(lastPoint , point ) { return { around: point, panDelta: point.sub(lastPoint) @@ -65899,11 +69420,11 @@ class MousePanHandler extends MouseHandler { } class MouseRotateHandler extends MouseHandler { - _correctButton(e , button ) { + _correctButton(e , button ) { return (button === LEFT_BUTTON && e.ctrlKey) || (button === RIGHT_BUTTON); } - _move(lastPoint , point ) { + _move(lastPoint , point ) { const degreesPerPixelMoved = 0.8; const bearingDelta = (point.x - lastPoint.x) * degreesPerPixelMoved; if (bearingDelta) { @@ -65920,11 +69441,11 @@ class MouseRotateHandler extends MouseHandler { } class MousePitchHandler extends MouseHandler { - _correctButton(e , button ) { + _correctButton(e , button ) { return (button === LEFT_BUTTON && e.ctrlKey) || (button === RIGHT_BUTTON); } - _move(lastPoint , point ) { + _move(lastPoint , point ) { const degreesPerPixelMoved = -0.5; const pitchDelta = (point.y - lastPoint.y) * degreesPerPixelMoved; if (pitchDelta) { @@ -65941,6 +69462,7 @@ class MousePitchHandler extends MouseHandler { } // + class TouchPanHandler { @@ -65961,20 +69483,20 @@ class TouchPanHandler { this._minTouches = 1; this._clickTolerance = options.clickTolerance || 1; this.reset(); - transform.bindAll(['_addTouchPanBlocker', '_showTouchPanBlockerAlert'], this); + ref_properties.bindAll(['_addTouchPanBlocker', '_showTouchPanBlockerAlert'], this); } reset() { this._active = false; this._touches = {}; - this._sum = new transform.pointGeometry(0, 0); + this._sum = new ref_properties.pointGeometry(0, 0); } - touchstart(e , points , mapTouches ) { + touchstart(e , points , mapTouches ) { return this._calculateTransform(e, points, mapTouches); } - touchmove(e , points , mapTouches ) { + touchmove(e , points , mapTouches ) { if (!this._active || mapTouches.length < this._minTouches) return; // if cooperative gesture handling is set to true, require two fingers to touch pan @@ -66006,13 +69528,13 @@ class TouchPanHandler { this.reset(); } - _calculateTransform(e , points , mapTouches ) { + _calculateTransform(e , points , mapTouches ) { if (mapTouches.length > 0) this._active = true; const touches = indexTouches(mapTouches, points); - const touchPointSum = new transform.pointGeometry(0, 0); - const touchDeltaSum = new transform.pointGeometry(0, 0); + const touchPointSum = new ref_properties.pointGeometry(0, 0); + const touchDeltaSum = new ref_properties.pointGeometry(0, 0); let touchDeltaCount = 0; for (const identifier in touches) { @@ -66061,17 +69583,17 @@ class TouchPanHandler { this.reset(); } - isEnabled() { + isEnabled() { return this._enabled; } - isActive() { + isActive() { return this._active; } _addTouchPanBlocker() { if (this._map && !this._alertContainer) { - this._alertContainer = DOM.create('div', 'mapboxgl-touch-pan-blocker', this._map._container); + this._alertContainer = create$1('div', 'mapboxgl-touch-pan-blocker', this._map._container); this._alertContainer.textContent = this._map._getUIString('TouchPanBlocker.Message'); @@ -66096,14 +69618,15 @@ class TouchPanHandler { // + class TwoTouchHandler { - - - + + + constructor() { @@ -66112,11 +69635,11 @@ class TwoTouchHandler { reset() { this._active = false; - delete this._firstTwoTouches; + this._firstTwoTouches = undefined; } _start(points ) {} //eslint-disable-line - _move(points , pinchAround , e ) { return {}; } //eslint-disable-line + _move(points , pinchAround , e ) { return {}; } //eslint-disable-line touchstart(e , points , mapTouches ) { //console.log(e.target, e.targetTouches.length ? e.targetTouches[0].target : null); @@ -66132,12 +69655,13 @@ class TwoTouchHandler { this._start([points[0], points[1]]); } - touchmove(e , points , mapTouches ) { - if (!this._firstTwoTouches) return; + touchmove(e , points , mapTouches ) { + const firstTouches = this._firstTwoTouches; + if (!firstTouches) return; e.preventDefault(); - const [idA, idB] = this._firstTwoTouches; + const [idA, idB] = firstTouches; const a = getTouchById(mapTouches, points, idA); const b = getTouchById(mapTouches, points, idB); if (!a || !b) return; @@ -66156,7 +69680,7 @@ class TwoTouchHandler { const b = getTouchById(mapTouches, points, idB); if (a && b) return; - if (this._active) DOM.suppressClick(); + if (this._active) suppressClick(); this.reset(); } @@ -66175,11 +69699,11 @@ class TwoTouchHandler { this.reset(); } - isEnabled() { + isEnabled() { return this._enabled; } - isActive() { + isActive() { return this._active; } } @@ -66205,15 +69729,15 @@ class TouchZoomHandler extends TwoTouchHandler { reset() { super.reset(); - delete this._distance; - delete this._startDistance; + this._distance = 0; + this._startDistance = 0; } _start(points ) { this._startDistance = this._distance = points[0].dist(points[1]); } - _move(points , pinchAround ) { + _move(points , pinchAround ) { const lastDistance = this._distance; this._distance = points[0].dist(points[1]); if (!this._active && Math.abs(getZoomDelta(this._distance, this._startDistance)) < ZOOM_THRESHOLD) return; @@ -66238,9 +69762,9 @@ class TouchRotateHandler extends TwoTouchHandler { reset() { super.reset(); - delete this._minDiameter; - delete this._startVector; - delete this._vector; + this._minDiameter = 0; + this._startVector = undefined; + this._vector = undefined; } _start(points ) { @@ -66248,7 +69772,7 @@ class TouchRotateHandler extends TwoTouchHandler { this._minDiameter = points[0].dist(points[1]); } - _move(points , pinchAround ) { + _move(points , pinchAround ) { const lastVector = this._vector; this._vector = points[0].sub(points[1]); @@ -66261,7 +69785,7 @@ class TouchRotateHandler extends TwoTouchHandler { }; } - _isBelowThreshold(vector ) { + _isBelowThreshold(vector ) { /* * The threshold before a rotation actually happens is configured in * pixels alongth circumference of the circle formed by the two fingers. @@ -66297,8 +69821,8 @@ const ALLOWED_SINGLE_TOUCH_TIME = 100; class TouchPitchHandler extends TwoTouchHandler { - - + + constructor(map ) { @@ -66309,8 +69833,8 @@ class TouchPitchHandler extends TwoTouchHandler { reset() { super.reset(); this._valid = undefined; - delete this._firstMove; - delete this._lastPoints; + this._firstMove = undefined; + this._lastPoints = undefined; } _start(points ) { @@ -66318,14 +69842,15 @@ class TouchPitchHandler extends TwoTouchHandler { if (isVertical(points[0].sub(points[1]))) { // fingers are more horizontal than vertical this._valid = false; - } } - _move(points , center , e ) { - const vectorA = points[0].sub(this._lastPoints[0]); - const vectorB = points[1].sub(this._lastPoints[1]); + _move(points , center , e ) { + const lastPoints = this._lastPoints; + if (!lastPoints) return; + const vectorA = points[0].sub(lastPoints[0]); + const vectorB = points[1].sub(lastPoints[1]); if (this._map._cooperativeGestures && e.touches.length < 3) return; @@ -66342,7 +69867,7 @@ class TouchPitchHandler extends TwoTouchHandler { }; } - gestureBeginsVertically(vectorA , vectorB , timeStamp ) { + gestureBeginsVertically(vectorA , vectorB , timeStamp ) { if (this._valid !== undefined) return this._valid; const threshold = 2; @@ -66355,7 +69880,7 @@ class TouchPitchHandler extends TwoTouchHandler { // One finger has moved and the other has not. // If enough time has passed, decide it is not a pitch. if (!movedA || !movedB) { - if (this._firstMove === undefined) { + if (this._firstMove == null) { this._firstMove = timeStamp; } @@ -66375,8 +69900,9 @@ class TouchPitchHandler extends TwoTouchHandler { // + -const defaultOptions = { +const defaultOptions$5 = { panStep: 100, bearingStep: 15, pitchStep: 10 @@ -66412,7 +69938,7 @@ class KeyboardHandler { * @private */ constructor() { - const stepOptions = defaultOptions; + const stepOptions = defaultOptions$5; this._panStep = stepOptions.panStep; this._bearingStep = stepOptions.bearingStep; this._pitchStep = stepOptions.pitchStep; @@ -66427,7 +69953,7 @@ class KeyboardHandler { this._active = false; } - keydown(e ) { + keydown(e ) { if (e.altKey || e.ctrlKey || e.metaKey) return; let zoomDir = 0; @@ -66543,7 +70069,7 @@ class KeyboardHandler { * @example * const isKeyboardEnabled = map.keyboard.isEnabled(); */ - isEnabled() { + isEnabled() { return this._enabled; } @@ -66556,7 +70082,7 @@ class KeyboardHandler { * @example * const isKeyboardActive = map.keyboard.isActive(); */ - isActive() { + isActive() { return this._active; } @@ -66652,7 +70178,7 @@ class ScrollZoomHandler { this._defaultZoomRate = defaultZoomRate; this._wheelZoomRate = wheelZoomRate; - transform.bindAll(['_onTimeout', '_addScrollZoomBlocker', '_showBlockerAlert', '_isFullscreen'], this); + ref_properties.bindAll(['_onTimeout', '_addScrollZoomBlocker', '_showBlockerAlert', '_isFullscreen'], this); } @@ -66687,7 +70213,7 @@ class ScrollZoomHandler { * @example * const isScrollZoomEnabled = map.scrollZoom.isEnabled(); */ - isEnabled() { + isEnabled() { return !!this._enabled; } @@ -66696,11 +70222,11 @@ class ScrollZoomHandler { * render is called, so _active is not a good candidate for determining if a scroll zoom animation is in * progress. */ - isActive() { + isActive() { return !!this._active || this._finishTimeout !== undefined; } - isZooming() { + isZooming() { return !!this._zooming; } @@ -66752,8 +70278,8 @@ class ScrollZoomHandler { } // Remove `any` cast when https://github.com/facebook/flow/issues/4879 is fixed. - let value = e.deltaMode === (transform.window.WheelEvent ).DOM_DELTA_LINE ? e.deltaY * 40 : e.deltaY; - const now = transform.exported.now(), + let value = e.deltaMode === (ref_properties.window.WheelEvent ).DOM_DELTA_LINE ? e.deltaY * 40 : e.deltaY; + const now = ref_properties.exported.now(), timeDelta = now - (this._lastWheelEventTime || 0); this._lastWheelEventTime = now; @@ -66828,7 +70354,7 @@ class ScrollZoomHandler { delete this._finishTimeout; } - const pos = DOM.mousePos(this._el, e); + const pos = mousePos(this._el, e); this._aroundPoint = this._aroundCenter ? this._map.transform.centerPoint : pos; this._aroundCoord = this._map.transform.pointCoordinate3D(this._aroundPoint); this._targetZoom = undefined; @@ -66839,7 +70365,7 @@ class ScrollZoomHandler { } } - renderFrame() { + renderFrame() { if (!this._frameId) return; this._frameId = null; @@ -66887,11 +70413,11 @@ class ScrollZoomHandler { let finished = false; let zoom; if (this._type === 'wheel' && startZoom && easing) { - transform.assert_1(easing && typeof startZoom === 'number'); + ref_properties.assert_1(easing && typeof startZoom === 'number'); - const t = Math.min((transform.exported.now() - this._lastWheelEventTime) / 200, 1); + const t = Math.min((ref_properties.exported.now() - this._lastWheelEventTime) / 200, 1); const k = easing(t); - zoom = transform.number(startZoom, targetZoom, k); + zoom = ref_properties.number(startZoom, targetZoom, k); if (t < 1) { if (!this._frameId) { this._frameId = true; @@ -66926,23 +70452,23 @@ class ScrollZoomHandler { }; } - _smoothOutEasing(duration ) { - let easing = transform.ease; + _smoothOutEasing(duration ) { + let easing = ref_properties.ease; if (this._prevEase) { const ease = this._prevEase, - t = (transform.exported.now() - ease.start) / ease.duration, + t = (ref_properties.exported.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 = transform.bezier(x, y, 0.25, 1); + easing = ref_properties.bezier(x, y, 0.25, 1); } this._prevEase = { - start: transform.exported.now(), + start: ref_properties.exported.now(), duration, easing }; @@ -66960,9 +70486,9 @@ class ScrollZoomHandler { _addScrollZoomBlocker() { if (this._map && !this._alertContainer) { - this._alertContainer = DOM.create('div', 'mapboxgl-scroll-zoom-blocker', this._map._container); + this._alertContainer = create$1('div', 'mapboxgl-scroll-zoom-blocker', this._map._container); - if (/(Mac|iPad)/i.test(transform.window.navigator.userAgent)) { + if (/(Mac|iPad)/i.test(ref_properties.window.navigator.userAgent)) { this._alertContainer.textContent = this._map._getUIString('ScrollZoomBlocker.CmdMessage'); } else { this._alertContainer.textContent = this._map._getUIString('ScrollZoomBlocker.CtrlMessage'); @@ -66973,8 +70499,8 @@ class ScrollZoomHandler { } } - _isFullscreen() { - return !!transform.window.document.fullscreenElement; + _isFullscreen() { + return !!ref_properties.window.document.fullscreenElement || !!ref_properties.window.document.webkitFullscreenElement; } _showBlockerAlert() { @@ -67043,7 +70569,7 @@ class DoubleClickZoomHandler { * @example * const isDoubleClickZoomEnabled = map.doubleClickZoom.isEnabled(); */ - isEnabled() { + isEnabled() { return this._clickZoom.isEnabled() && this._tapZoom.isEnabled(); } @@ -67054,7 +70580,7 @@ class DoubleClickZoomHandler { * @example * const isDoubleClickZoomActive = map.doubleClickZoom.isActive(); */ - isActive() { + isActive() { return this._clickZoom.isActive() || this._tapZoom.isActive(); } } @@ -67063,6 +70589,7 @@ class DoubleClickZoomHandler { + class ClickZoomHandler { @@ -67081,7 +70608,7 @@ class ClickZoomHandler { this.reset(); } - dblclick(e , point ) { + dblclick(e , point ) { e.preventDefault(); return { cameraAnimation: (map ) => { @@ -67103,23 +70630,24 @@ class ClickZoomHandler { this.reset(); } - isEnabled() { + isEnabled() { return this._enabled; } - isActive() { + isActive() { return this._active; } } // + class TapDragZoomHandler { - + @@ -67136,9 +70664,9 @@ class TapDragZoomHandler { reset() { this._active = false; - delete this._swipePoint; - delete this._swipeTouch; - delete this._tapTime; + this._swipePoint = undefined; + this._swipeTouch = 0; + this._tapTime = 0; this._tap.reset(); } @@ -67158,7 +70686,7 @@ class TapDragZoomHandler { } - touchmove(e , points , mapTouches ) { + touchmove(e , points , mapTouches ) { if (!this._tapTime) { this._tap.touchmove(e, points, mapTouches); } else if (this._swipePoint) { @@ -67205,11 +70733,11 @@ class TapDragZoomHandler { this.reset(); } - isEnabled() { + isEnabled() { return this._enabled; } - isActive() { + isActive() { return this._active; } } @@ -67295,7 +70823,7 @@ class DragPanHandler { * @example * const isDragPanEnabled = map.dragPan.isEnabled(); */ - isEnabled() { + isEnabled() { return this._mousePan.isEnabled() && this._touchPan.isEnabled(); } @@ -67306,7 +70834,7 @@ class DragPanHandler { * @example * const isDragPanActive = map.dragPan.isActive(); */ - isActive() { + isActive() { return this._mousePan.isActive() || this._touchPan.isActive(); } } @@ -67370,7 +70898,7 @@ class DragRotateHandler { * @example * const isDragRotateEnabled = map.dragRotate.isEnabled(); */ - isEnabled() { + isEnabled() { return this._mouseRotate.isEnabled() && (!this._pitchWithRotate || this._mousePitch.isEnabled()); } @@ -67381,7 +70909,7 @@ class DragRotateHandler { * @example * const isDragRotateActive = map.dragRotate.isActive(); */ - isActive() { + isActive() { return this._mouseRotate.isActive() || this._mousePitch.isActive(); } } @@ -67459,7 +70987,7 @@ class TouchZoomRotateHandler { * @example * const isTouchZoomRotateEnabled = map.touchZoomRotate.isEnabled(); */ - isEnabled() { + isEnabled() { return this._touchZoom.isEnabled() && (this._rotationDisabled || this._touchRotate.isEnabled()) && this._tapDragZoom.isEnabled(); @@ -67472,7 +71000,7 @@ class TouchZoomRotateHandler { * @example * const isTouchZoomRotateActive = map.touchZoomRotate.isActive(); */ - isActive() { + isActive() { return this._touchZoom.isActive() || this._touchRotate.isActive() || this._tapDragZoom.isActive(); } @@ -67503,11 +71031,13 @@ class TouchZoomRotateHandler { // + + const isMoving = p => p.zoom || p.drag || p.pitch || p.rotate; -class RenderFrameEvent extends transform.Event { +class RenderFrameEvent extends ref_properties.Event { } @@ -67523,31 +71053,31 @@ class TrackingEllipsoid { } setup(center , pointOnSurface ) { - const centerToSurface = transform.sub([], pointOnSurface, center); + const centerToSurface = ref_properties.sub([], pointOnSurface, center); if (centerToSurface[2] < 0) { - this.radius = transform.length(transform.div([], centerToSurface, this.constants)); + this.radius = ref_properties.length(ref_properties.div([], centerToSurface, this.constants)); } else { // The point on surface is above the center. This can happen for example when the camera is // below the clicked point (like a mountain) Use slightly shorter radius for less aggressive movement - this.radius = transform.length([centerToSurface[0], centerToSurface[1], 0]); + this.radius = ref_properties.length([centerToSurface[0], centerToSurface[1], 0]); } } // Cast a ray from the center of the ellipsoid and the intersection point. projectRay(dir ) { // Perform the intersection test against a unit sphere - transform.div(dir, dir, this.constants); - transform.normalize(dir, dir); - transform.mul$1(dir, dir, this.constants); + ref_properties.div(dir, dir, this.constants); + ref_properties.normalize(dir, dir); + ref_properties.mul$1(dir, dir, this.constants); - const intersection = transform.scale$2([], dir, this.radius); + const intersection = ref_properties.scale$3([], dir, this.radius); if (intersection[2] > 0) { // The intersection point is above horizon so special handling is required. // Otherwise direction of the movement would be inverted due to the ellipsoid shape - const h = transform.scale$2([], [0, 0, 1], transform.dot(intersection, [0, 0, 1])); - const r = transform.scale$2([], transform.normalize([], [intersection[0], intersection[1], 0]), this.radius); - const p = transform.add([], intersection, transform.scale$2([], transform.sub([], transform.add([], r, h), intersection), 2)); + const h = ref_properties.scale$3([], [0, 0, 1], ref_properties.dot(intersection, [0, 0, 1])); + const r = ref_properties.scale$3([], ref_properties.normalize([], [intersection[0], intersection[1], 0]), this.radius); + const p = ref_properties.add([], intersection, ref_properties.scale$3([], ref_properties.sub([], ref_properties.add([], r, h), intersection), 2)); intersection[0] = p[0]; intersection[1] = p[1]; @@ -67574,25 +71104,25 @@ class TrackingEllipsoid { - - - - - - - - - - - + + + + + + + + + + + - + // All handler methods that are called with events can optionally return a `HandlerResult`. - + @@ -67613,7 +71143,7 @@ class TrackingEllipsoid { - + function hasChange(result ) { return (result.panDelta && result.panDelta.mag()) || result.zoomDelta || result.bearingDelta || result.pitchDelta; @@ -67624,7 +71154,7 @@ class HandlerManager { - + @@ -67653,7 +71183,7 @@ class HandlerManager { this._addDefaultHandlers(options); - transform.bindAll(['handleEvent', 'handleWindowEvent'], this); + ref_properties.bindAll(['handleEvent', 'handleWindowEvent'], this); const el = this._el; @@ -67679,8 +71209,8 @@ class HandlerManager { // window-level event listeners give us the best shot at capturing events that // fall outside the map canvas element. Use `{capture: true}` for the move event // to prevent map move events from being fired during a drag. - [transform.window.document, 'mousemove', {capture: true}], - [transform.window.document, 'mouseup', undefined], + [ref_properties.window.document, 'mousemove', {capture: true}], + [ref_properties.window.document, 'mouseup', undefined], [el, 'mouseover', undefined], [el, 'mouseout', undefined], @@ -67693,18 +71223,18 @@ class HandlerManager { [el, 'wheel', {passive: false}], [el, 'contextmenu', undefined], - [transform.window, 'blur', undefined] + [ref_properties.window, 'blur', undefined] ]; for (const [target, type, listenerOptions] of this._listeners) { - const listener = target === transform.window.document ? this.handleWindowEvent : this.handleEvent; + const listener = target === ref_properties.window.document ? this.handleWindowEvent : this.handleEvent; target.addEventListener((type ), (listener ), listenerOptions); } } destroy() { for (const [target, type, listenerOptions] of this._listeners) { - const listener = target === transform.window.document ? this.handleWindowEvent : this.handleEvent; + const listener = target === ref_properties.window.document ? this.handleWindowEvent : this.handleEvent; target.removeEventListener((type ), (listener ), listenerOptions); } } @@ -67779,26 +71309,26 @@ class HandlerManager { this._changes = []; } - isActive() { + isActive() { for (const {handler} of this._handlers) { if (handler.isActive()) return true; } return false; } - isZooming() { + isZooming() { return !!this._eventsInProgress.zoom || this._map.scrollZoom.isZooming(); } - isRotating() { + isRotating() { return !!this._eventsInProgress.rotate; } - isMoving() { - return Boolean(isMoving(this._eventsInProgress)) || this.isZooming(); + isMoving() { + return !!isMoving(this._eventsInProgress) || this.isZooming(); } - _blockedByActive(activeHandlers , allowed , myName ) { + _blockedByActive(activeHandlers , allowed , myName ) { for (const name in activeHandlers) { if (name === myName) continue; if (!allowed || allowed.indexOf(name) < 0) { @@ -67812,7 +71342,7 @@ class HandlerManager { this.handleEvent(e, `${e.type}Window`); } - _getMapTouches(touches ) { + _getMapTouches(touches ) { const mapTouches = []; for (const t of touches) { const target = ((t.target ) ); @@ -67826,7 +71356,7 @@ class HandlerManager { handleEvent(e , eventName ) { this._updatingCamera = true; - transform.assert_1(e.timeStamp !== undefined); + ref_properties.assert_1(e.timeStamp !== undefined); const isRenderFrame = e.type === 'renderFrame'; const inputEvent = isRenderFrame ? undefined : ((e ) ); @@ -67841,14 +71371,14 @@ class HandlerManager { const activeHandlers = {}; const mapTouches = e.touches ? this._getMapTouches(((e ) ).touches) : undefined; - const points = mapTouches ? DOM.touchPos(this._el, mapTouches) : + const points = mapTouches ? touchPos(this._el, mapTouches) : isRenderFrame ? undefined : // renderFrame event doesn't have any points - DOM.mousePos(this._el, ((e ) )); + mousePos(this._el, ((e ) )); for (const {handlerName, handler, allowed} of this._handlers) { if (!handler.isEnabled()) continue; - let data ; + let data ; if (this._blockedByActive(activeHandlers, allowed, handlerName)) { handler.reset(); @@ -67898,7 +71428,7 @@ class HandlerManager { mergeHandlerResult(mergedHandlerResult , eventsInProgress , handlerResult , name , e ) { if (!handlerResult) return; - transform.extend(mergedHandlerResult, handlerResult); + ref_properties.extend(mergedHandlerResult, handlerResult); const eventData = {handlerName: name, originalEvent: handlerResult.originalEvent || e}; @@ -67924,7 +71454,7 @@ class HandlerManager { for (const [change, eventsInProgress, deactivatedHandlers] of this._changes) { - if (change.panDelta) combined.panDelta = (combined.panDelta || new transform.pointGeometry(0, 0))._add(change.panDelta); + if (change.panDelta) combined.panDelta = (combined.panDelta || new ref_properties.pointGeometry(0, 0))._add(change.panDelta); if (change.zoomDelta) combined.zoomDelta = (combined.zoomDelta || 0) + change.zoomDelta; if (change.bearingDelta) combined.bearingDelta = (combined.bearingDelta || 0) + change.bearingDelta; if (change.pitchDelta) combined.pitchDelta = (combined.pitchDelta || 0) + change.pitchDelta; @@ -67933,8 +71463,8 @@ class HandlerManager { if (change.pinchAround !== undefined) combined.pinchAround = change.pinchAround; if (change.noInertia) combined.noInertia = change.noInertia; - transform.extend(combinedEventsInProgress, eventsInProgress); - transform.extend(combinedDeactivatedHandlers, deactivatedHandlers); + ref_properties.extend(combinedEventsInProgress, eventsInProgress); + ref_properties.extend(combinedDeactivatedHandlers, deactivatedHandlers); } this._updateMapTransform(combined, combinedEventsInProgress, combinedDeactivatedHandlers); @@ -67968,7 +71498,8 @@ class HandlerManager { } if (!hasChange(combinedResult)) { - return this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true); + this._fireEvents(combinedEventsInProgress, deactivatedHandlers, true); + return; } let {panDelta, zoomDelta, bearingDelta, pitchDelta, around, aroundCoord, pinchAround} = combinedResult; @@ -67997,14 +71528,29 @@ class HandlerManager { // Compute Mercator 3D camera offset based on screenspace panDelta const panVec = [0, 0, 0]; if (panDelta) { - transform.assert_1(this._dragOrigin, '_dragOrigin should have been setup with a previous dragstart'); + ref_properties.assert_1(this._dragOrigin, '_dragOrigin should have been setup with a previous dragstart'); const startPoint = tr.pointCoordinate(around); - const endPoint = tr.pointCoordinate(around.sub(panDelta)); + if (tr.projection.name === 'globe') { + const startLat = ref_properties.latFromMercatorY(startPoint.y); + const centerLat = tr.center.lat; + + // Compute pan vector directly in pixel coordinates for the globe. + // Rotate the globe a bit faster when dragging near poles to compensate + // different pixel-per-meter ratios (ie. pixel-to-physical-rotation is lower) + const scale = Math.min(ref_properties.mercatorZfromAltitude(1, startLat) / ref_properties.mercatorZfromAltitude(1, centerLat), 2); - if (startPoint && endPoint) { - panVec[0] = endPoint.x - startPoint.x; - panVec[1] = endPoint.y - startPoint.y; + panDelta = panDelta.rotate(-tr.angle); + + panVec[0] = -panDelta.x / tr.worldSize * scale; + panVec[1] = -panDelta.y / tr.worldSize * scale; + } else { + const endPoint = tr.pointCoordinate(around.sub(panDelta)); + + if (startPoint && endPoint) { + panVec[0] = endPoint.x - startPoint.x; + panVec[1] = endPoint.y - startPoint.y; + } } } @@ -68016,18 +71562,18 @@ class HandlerManager { // This way the zoom interpolation can be kept linear and independent of the (possible) terrain elevation const pickedPosition = aroundCoord ? toVec3(aroundCoord) : toVec3(tr.pointCoordinate3D(around)); - const aroundRay = {dir: transform.normalize([], transform.sub([], pickedPosition, tr._camera.position))}; + const aroundRay = {dir: ref_properties.normalize([], ref_properties.sub([], pickedPosition, tr._camera.position))}; if (aroundRay.dir[2] < 0) { // Special handling is required if the ray created from the cursor is heading up. // This scenario is possible if user is trying to zoom towards a feature like a hill or a mountain. // Convert zoomDelta to a movement vector as if the camera would be orbiting around the picked point const movement = tr.zoomDeltaToMovement(pickedPosition, zoomDelta); - transform.scale$2(zoomVec, aroundRay.dir, movement); + ref_properties.scale$3(zoomVec, aroundRay.dir, movement); } } // Mutate camera state via CameraAPI - const translation = transform.add(panVec, panVec, zoomVec); + const translation = ref_properties.add(panVec, panVec, zoomVec); tr._translateCameraConstrained(translation); if (zoomDelta && Math.abs(tr.zoom - originalZoom) > 0.0001) { @@ -68104,7 +71650,7 @@ class HandlerManager { } this._map.easeTo(inertialEase, {originalEvent: originalEndEvent}); } else { - this._map.fire(new transform.Event('moveend', {originalEvent: originalEndEvent})); + this._map.fire(new ref_properties.Event('moveend', {originalEvent: originalEndEvent})); if (shouldSnapToNorth(this._map.getBearing())) { this._map.resetNorth(); } @@ -68115,13 +71661,13 @@ class HandlerManager { } _fireEvent(type , e ) { - this._map.fire(new transform.Event(type, e ? {originalEvent: e} : {})); + this._map.fire(new ref_properties.Event(type, e ? {originalEvent: e} : {})); } - _requestFrame() { + _requestFrame() { this._map.triggerRepaint(); return this._map._renderTaskQueue.add(timeStamp => { - delete this._frameId; + this._frameId = undefined; this.handleEvent(new RenderFrameEvent('renderFrame', {timeStamp})); this._applyChanges(); }); @@ -68136,6 +71682,12 @@ class HandlerManager { // + + +/** + * A helper type: converts all Object type values to non-maybe types. + */ + /** * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo}, controlling the desired location, @@ -68143,15 +71695,18 @@ class HandlerManager { * camera value for that property will remain unchanged. * * @typedef {Object} CameraOptions - * @property {LngLatLike} center The desired center. + * @property {LngLatLike} center The location to place at the screen 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, `bearing: 90` orients the map so that east is up. * @property {number} pitch The desired pitch in degrees. The pitch is the angle towards the horizon - * measured in degrees with a range between 0 and 60 degrees. For example, pitch: 0 provides the appearance + * measured in degrees with a range between 0 and 85 degrees. For example, pitch: 0 provides the appearance * of looking straight down at the map, while pitch: 60 tilts the user's perspective towards the horizon. * Increasing the pitch value is often used to display 3D objects. - * @property {LngLatLike} around If `zoom` is specified, `around` determines the point around which the zoom is centered. + * @property {LngLatLike} around The location serving as the origin for a change in `zoom`, `pitch` and/or `bearing`. + * This location will remain at the same screen position following the transform. + * This is useful for drawing attention to a location that is not in the screen center. + * `center` is ignored if `around` is included. * @property {PaddingOptions} padding Dimensions in pixels applied on each side of the viewport for shifting the vanishing point. * @example * // set the map's initial perspective with CameraOptions @@ -68174,9 +71729,16 @@ class HandlerManager { - + + + + + + + + /** * 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 @@ -68202,6 +71764,8 @@ class HandlerManager { + + @@ -68236,7 +71800,7 @@ const freeCameraNotSupportedWarning = 'map.setFreeCameraOptions(...) and map.get * @see [Example: Fit a map to a bounding box](https://docs.mapbox.com/mapbox-gl-js/example/fitbounds/) */ -class Camera extends transform.Evented { +class Camera extends ref_properties.Evented { @@ -68249,8 +71813,8 @@ class Camera extends transform.Evented { - - + + @@ -68258,14 +71822,14 @@ class Camera extends transform.Evented { - constructor(transform$1 , options ) { + constructor(transform , options ) { super(); this._moving = false; this._zooming = false; - this.transform = transform$1; + this.transform = transform; this._bearingSnap = options.bearingSnap; - transform.bindAll(['_renderFrameCallback'], this); + ref_properties.bindAll(['_renderFrameCallback'], this); //addAssertions(this); } @@ -68287,7 +71851,7 @@ class Camera extends transform.Evented { * const {lng, lat} = map.getCenter(); * @see [Tutorial: Use Mapbox GL JS in a React app](https://docs.mapbox.com/help/tutorials/use-mapbox-gl-js-with-react/#store-the-new-coordinates) */ - getCenter() { return new transform.LngLat(this.transform.center.lng, this.transform.center.lat); } + getCenter() { return new ref_properties.LngLat(this.transform.center.lng, this.transform.center.lat); } /** * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`. @@ -68301,7 +71865,7 @@ class Camera extends transform.Evented { * @example * map.setCenter([-74, 38]); */ - setCenter(center , eventData ) { + setCenter(center , eventData ) { return this.jumpTo({center}, eventData); } @@ -68322,9 +71886,9 @@ class Camera extends transform.Evented { * map.panBy([-74, 38], {duration: 5000}); * @see [Example: Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ - panBy(offset , options , eventData ) { - offset = transform.pointGeometry.convert(offset).mult(-1); - return this.panTo(this.transform.center, transform.extend({offset}, options), eventData); + panBy(offset , options , eventData ) { + offset = ref_properties.pointGeometry.convert(offset).mult(-1); + return this.panTo(this.transform.center, ref_properties.extend({offset}, options), eventData); } /** @@ -68344,8 +71908,8 @@ class Camera extends transform.Evented { * map.panTo([-74, 38], {duration: 5000}); * @see [Example: Update a feature in realtime](https://docs.mapbox.com/mapbox-gl-js/example/live-update-feature/) */ - panTo(lnglat , options , eventData ) { - return this.easeTo(transform.extend({ + panTo(lnglat , options , eventData ) { + return this.easeTo(ref_properties.extend({ center: lnglat }, options), eventData); } @@ -68377,7 +71941,7 @@ class Camera extends transform.Evented { * // Zoom to the zoom level 5 without an animated transition * map.setZoom(5); */ - setZoom(zoom , eventData ) { + setZoom(zoom , eventData ) { this.jumpTo({zoom}, eventData); return this; } @@ -68405,8 +71969,8 @@ class Camera extends transform.Evented { * offset: [100, 50] * }); */ - zoomTo(zoom , options , eventData ) { - return this.easeTo(transform.extend({ + zoomTo(zoom , options , eventData ) { + return this.easeTo(ref_properties.extend({ zoom }, options), eventData); } @@ -68428,7 +71992,7 @@ class Camera extends transform.Evented { * // zoom the map in one level with a custom animation duration * map.zoomIn({duration: 1000}); */ - zoomIn(options , eventData ) { + zoomIn(options , eventData ) { this.zoomTo(this.getZoom() + 1, options, eventData); return this; } @@ -68450,7 +72014,7 @@ class Camera extends transform.Evented { * // zoom the map out one level with a custom animation offset * map.zoomOut({offset: [80, 60]}); */ - zoomOut(options , eventData ) { + zoomOut(options , eventData ) { this.zoomTo(this.getZoom() - 1, options, eventData); return this; } @@ -68485,7 +72049,7 @@ class Camera extends transform.Evented { * // Rotate the map to 90 degrees. * map.setBearing(90); */ - setBearing(bearing , eventData ) { + setBearing(bearing , eventData ) { this.jumpTo({bearing}, eventData); return this; } @@ -68515,7 +72079,7 @@ class Camera extends transform.Evented { * // Sets a left padding of 300px, and a top padding of 50px * map.setPadding({left: 300, top: 50}); */ - setPadding(padding , eventData ) { + setPadding(padding , eventData ) { this.jumpTo({padding}, eventData); return this; } @@ -68526,7 +72090,8 @@ class Camera extends transform.Evented { * * @memberof Map# * @param {number} bearing The desired bearing. - * @param {AnimationOptions | null} options Options object. + * @param {EasingOptions | null} options Options describing the destination and animation of the transition. + * Accepts {@link CameraOptions} and {@link AnimationOptions}. * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method. * @fires Map.event:movestart * @fires Map.event:moveend @@ -68537,8 +72102,8 @@ class Camera extends transform.Evented { * // rotateTo with an animation of 2 seconds. * map.rotateTo(30, {duration: 2000}); */ - rotateTo(bearing , options , eventData ) { - return this.easeTo(transform.extend({ + rotateTo(bearing , options , eventData ) { + return this.easeTo(ref_properties.extend({ bearing }, options), eventData); } @@ -68547,7 +72112,8 @@ class Camera extends transform.Evented { * Rotates the map so that north is up (0° bearing), with an animated transition. * * @memberof Map# - * @param {AnimationOptions | null} options Options object. + * @param {EasingOptions | null} options Options describing the destination and animation of the transition. + * Accepts {@link CameraOptions} and {@link AnimationOptions}. * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method. * @fires Map.event:movestart * @fires Map.event:moveend @@ -68556,8 +72122,8 @@ class Camera extends transform.Evented { * // resetNorth with an animation of 2 seconds. * map.resetNorth({duration: 2000}); */ - resetNorth(options , eventData ) { - this.rotateTo(0, transform.extend({duration: 1000}, options), eventData); + resetNorth(options , eventData ) { + this.rotateTo(0, ref_properties.extend({duration: 1000}, options), eventData); return this; } @@ -68565,7 +72131,8 @@ class Camera extends transform.Evented { * Rotates and pitches the map so that north is up (0° bearing) and pitch is 0°, with an animated transition. * * @memberof Map# - * @param {AnimationOptions | null} options Options object. + * @param {EasingOptions | null} options Options describing the destination and animation of the transition. + * Accepts {@link CameraOptions} and {@link AnimationOptions}. * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method. * @fires Map.event:movestart * @fires Map.event:moveend @@ -68574,8 +72141,8 @@ class Camera extends transform.Evented { * // resetNorthPitch with an animation of 2 seconds. * map.resetNorthPitch({duration: 2000}); */ - resetNorthPitch(options , eventData ) { - this.easeTo(transform.extend({ + resetNorthPitch(options , eventData ) { + this.easeTo(ref_properties.extend({ bearing: 0, pitch: 0, duration: 1000 @@ -68588,7 +72155,8 @@ class Camera extends transform.Evented { * close enough to it (within the `bearingSnap` threshold). * * @memberof Map# - * @param {AnimationOptions | null} options Options object. + * @param {EasingOptions | null} options Options describing the destination and animation of the transition. + * Accepts {@link CameraOptions} and {@link AnimationOptions}. * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method. * @fires Map.event:movestart * @fires Map.event:moveend @@ -68597,7 +72165,7 @@ class Camera extends transform.Evented { * // snapToNorth with an animation of 2 seconds. * map.snapToNorth({duration: 2000}); */ - snapToNorth(options , eventData ) { + snapToNorth(options , eventData ) { if (Math.abs(this.getBearing()) < this._bearingSnap) { return this.resetNorth(options, eventData); } @@ -68628,7 +72196,7 @@ class Camera extends transform.Evented { * // setPitch with an animation of 2 seconds. * map.setPitch(80, {duration: 2000}); */ - setPitch(pitch , eventData ) { + setPitch(pitch , eventData ) { this.jumpTo({pitch}, eventData); return this; } @@ -68637,6 +72205,7 @@ class Camera extends transform.Evented { * Returns a {@link CameraOptions} object for the highest zoom level * up to and including `Map#getMaxZoom()` that fits the bounds * in the viewport at the specified bearing. + * This function isn't supported with globe projection. * * @memberof Map# * @param {LngLatBoundsLike} bounds Calculate the center for these bounds in the viewport and use @@ -68655,20 +72224,24 @@ class Camera extends transform.Evented { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); */ - cameraForBounds(bounds , options ) { - bounds = transform.LngLatBounds.convert(bounds); - const bearing = options && options.bearing || 0; + cameraForBounds(bounds , options ) { + if (this.transform.projection.name === 'globe') { + ref_properties.warnOnce('Globe projection does not support cameraForBounds API, this API may behave unexpectedly."'); + } + + bounds = ref_properties.LngLatBounds.convert(bounds); + const bearing = (options && options.bearing) || 0; return this._cameraForBoxAndBearing(bounds.getNorthWest(), bounds.getSouthEast(), bearing, options); } - _extendCameraOptions(options ) { + _extendCameraOptions(options ) { const defaultPadding = { top: 0, bottom: 0, right: 0, left: 0 }; - options = transform.extend({ + options = ref_properties.extend({ padding: defaultPadding, offset: [0, 0], maxZoom: this.transform.maxZoom @@ -68683,7 +72256,7 @@ class Camera extends transform.Evented { left: p }; } - options.padding = transform.extend(defaultPadding, options.padding); + options.padding = ref_properties.extend(defaultPadding, options.padding); return options; } @@ -68710,28 +72283,41 @@ class Camera extends transform.Evented { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); */ - _cameraForBoxAndBearing(p0 , p1 , bearing , options ) { + _cameraForBoxAndBearing(p0 , p1 , bearing , options ) { const eOptions = this._extendCameraOptions(options); const tr = this.transform; const edgePadding = tr.padding; - // We want to calculate the upper right and lower left of the box defined by p0 and p1 - // in a coordinate system rotate to match the destination bearing. - const p0world = tr.project(transform.LngLat.convert(p0)); - const p1world = tr.project(transform.LngLat.convert(p1)); - const p0rotated = p0world.rotate(-transform.degToRad(bearing)); - const p1rotated = p1world.rotate(-transform.degToRad(bearing)); - - const upperRight = new transform.pointGeometry(Math.max(p0rotated.x, p1rotated.x), Math.max(p0rotated.y, p1rotated.y)); - const lowerLeft = new transform.pointGeometry(Math.min(p0rotated.x, p1rotated.x), Math.min(p0rotated.y, p1rotated.y)); + // We want to calculate the corners of the box defined by p0 and p1 in a coordinate system + // rotated to match the destination bearing. All four corners of the box must be taken + // into account because of camera rotation. + const p0world = tr.project(ref_properties.LngLat.convert(p0)); + const p1world = tr.project(ref_properties.LngLat.convert(p1)); + const p2world = new ref_properties.pointGeometry(p0world.x, p1world.y); + const p3world = new ref_properties.pointGeometry(p1world.x, p0world.y); + + const angleRadians = -ref_properties.degToRad(bearing); + const p0rotated = p0world.rotate(angleRadians); + const p1rotated = p1world.rotate(angleRadians); + const p2rotated = p2world.rotate(angleRadians); + const p3rotated = p3world.rotate(angleRadians); + + const upperRight = new ref_properties.pointGeometry( + Math.max(p0rotated.x, p1rotated.x, p2rotated.x, p3rotated.x), + Math.max(p0rotated.y, p1rotated.y, p2rotated.y, p3rotated.y) + ); + const lowerLeft = new ref_properties.pointGeometry( + Math.min(p0rotated.x, p1rotated.x, p2rotated.x, p3rotated.x), + Math.min(p0rotated.y, p1rotated.y, p2rotated.y, p3rotated.y) + ); // Calculate zoom: consider the original bbox and padding. const size = upperRight.sub(lowerLeft); - const scaleX = (tr.width - (edgePadding.left + edgePadding.right + eOptions.padding.left + eOptions.padding.right)) / size.x; - const scaleY = (tr.height - (edgePadding.top + edgePadding.bottom + eOptions.padding.top + eOptions.padding.bottom)) / size.y; + const scaleX = (tr.width - ((edgePadding.left || 0) + (edgePadding.right || 0) + eOptions.padding.left + eOptions.padding.right)) / size.x; + const scaleY = (tr.height - ((edgePadding.top || 0) + (edgePadding.bottom || 0) + eOptions.padding.top + eOptions.padding.bottom)) / size.y; if (scaleY < 0 || scaleX < 0) { - transform.warnOnce( + ref_properties.warnOnce( 'Map cannot fit within canvas with the given bounds, padding, and/or offset.' ); return; @@ -68739,10 +72325,13 @@ class Camera extends transform.Evented { const zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), eOptions.maxZoom); // Calculate center: apply the zoom, the configured offset, as well as offset that exists as a result of padding. - const offset = (typeof eOptions.offset.x === 'number') ? new transform.pointGeometry(eOptions.offset.x, eOptions.offset.y) : transform.pointGeometry.convert(eOptions.offset); + const offset = (typeof eOptions.offset.x === 'number' && typeof eOptions.offset.y === 'number') ? + new ref_properties.pointGeometry(eOptions.offset.x, eOptions.offset.y) : + ref_properties.pointGeometry.convert(eOptions.offset); + const paddingOffsetX = (eOptions.padding.left - eOptions.padding.right) / 2; const paddingOffsetY = (eOptions.padding.top - eOptions.padding.bottom) / 2; - const paddingOffset = new transform.pointGeometry(paddingOffsetX, paddingOffsetY); + const paddingOffset = new ref_properties.pointGeometry(paddingOffsetX, paddingOffsetY); const rotatedPaddingOffset = paddingOffset.rotate(bearing * Math.PI / 180); const offsetAtInitialZoom = offset.add(rotatedPaddingOffset); const offsetAtFinalZoom = offsetAtInitialZoom.mult(tr.scale / tr.zoomScale(zoom)); @@ -68771,24 +72360,24 @@ class Camera extends transform.Evented { * `center`, `zoom`, `bearing` and `pitch`. If map is unable to fit, method will warn and return undefined. * @private */ - _cameraForBox(p0 , p1 , minAltitude , maxAltitude , options ) { + _cameraForBox(p0 , p1 , minAltitude , maxAltitude , options ) { const eOptions = this._extendCameraOptions(options); minAltitude = minAltitude || 0; maxAltitude = maxAltitude || 0; - p0 = transform.LngLat.convert(p0); - p1 = transform.LngLat.convert(p1); + p0 = ref_properties.LngLat.convert(p0); + p1 = ref_properties.LngLat.convert(p1); const tr = this.transform.clone(); tr.padding = eOptions.padding; const camera = this.getFreeCameraOptions(); - const focus = new transform.LngLat((p0.lng + p1.lng) * 0.5, (p0.lat + p1.lat) * 0.5); + const focus = new ref_properties.LngLat((p0.lng + p1.lng) * 0.5, (p0.lat + p1.lat) * 0.5); const focusAltitude = (minAltitude + maxAltitude) * 0.5; - if (tr._camera.position[2] < transform.mercatorZfromAltitude(focusAltitude, focus.lat)) { - transform.warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.'); + if (tr._camera.position[2] < ref_properties.mercatorZfromAltitude(focusAltitude, focus.lat)) { + ref_properties.warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.'); return; } @@ -68796,8 +72385,8 @@ class Camera extends transform.Evented { tr.setFreeCameraOptions(camera); - const coord0 = transform.MercatorCoordinate.fromLngLat(p0); - const coord1 = transform.MercatorCoordinate.fromLngLat(p1); + const coord0 = ref_properties.MercatorCoordinate.fromLngLat(p0); + const coord1 = ref_properties.MercatorCoordinate.fromLngLat(p1); const toVec3 = (p ) => [p.x, p.y, p.z]; @@ -68819,30 +72408,30 @@ class Camera extends transform.Evented { const maxX = Math.max(z2 * coord0.x, z2 * coord1.x); const maxY = Math.max(z2 * coord0.y, z2 * coord1.y); - const aabb = new transform.Aabb([minX, minY, minAltitude], [maxX, maxY, maxAltitude]); + const aabb = new ref_properties.Aabb([minX, minY, minAltitude], [maxX, maxY, maxAltitude]); - const frustum = transform.Frustum.fromInvProjectionMatrix(tr.invProjMatrix, tr.worldSize, z, zInMeters); + const frustum = ref_properties.Frustum.fromInvProjectionMatrix(tr.invProjMatrix, tr.worldSize, z, zInMeters); // Stop marching when frustum intersection // reports any aabb point not fully inside if (aabb.intersects(frustum) !== 2) { // Went too far, step one iteration back if (halfDistanceToGround) { - tr._camera.position = transform.scaleAndAdd([], tr._camera.position, centerMercatorRay.dir, -halfDistanceToGround); + tr._camera.position = ref_properties.scaleAndAdd([], tr._camera.position, centerMercatorRay.dir, -halfDistanceToGround); tr._updateStateFromCamera(); } break; } - const cameraPositionToGround = transform.sub([], tr._camera.position, centerIntersectionCoord); - halfDistanceToGround = 0.5 * transform.length(cameraPositionToGround); + const cameraPositionToGround = ref_properties.sub([], tr._camera.position, centerIntersectionCoord); + halfDistanceToGround = 0.5 * ref_properties.length(cameraPositionToGround); // March the camera position forward by half the distance to the ground - tr._camera.position = transform.scaleAndAdd([], tr._camera.position, centerMercatorRay.dir, halfDistanceToGround); + tr._camera.position = ref_properties.scaleAndAdd([], tr._camera.position, centerMercatorRay.dir, halfDistanceToGround); try { tr._updateStateFromCamera(); } catch (e) { - transform.warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.'); + ref_properties.warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.'); return; } } while (++steps < maxMarchingSteps); @@ -68859,6 +72448,7 @@ class Camera extends transform.Evented { * 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. * If a padding is set on the map, the bounds are fit to the inset. + * This function isn't supported with globe projection. * * @memberof Map# * @param {LngLatBoundsLike} bounds Center these bounds in the viewport and use the highest @@ -68875,14 +72465,18 @@ class Camera extends transform.Evented { * @fires Map.event:movestart * @fires Map.event:moveend * @returns {Map} Returns itself to allow for method chaining. - * @example + * @example * const bbox = [[-79, 43], [-73, 45]]; * map.fitBounds(bbox, { * padding: {top: 10, bottom:25, left: 15, right: 5} * }); * @see [Example: Fit a map to a bounding box](https://www.mapbox.com/mapbox-gl-js/example/fitbounds/) */ - fitBounds(bounds , options , eventData ) { + fitBounds(bounds , options , eventData ) { + if (this.transform.projection.name === 'globe') { + ref_properties.warnOnce('Globe projection does not support fitBounds API, this API may behave unexpectedly.'); + } + return this._fitInternal( this.cameraForBounds(bounds, options), options, @@ -68894,8 +72488,8 @@ class Camera extends transform.Evented { if (!elevation) return; - const point2 = new transform.pointGeometry(point0.x, point1.y); - const point3 = new transform.pointGeometry(point1.x, point0.y); + const point2 = new ref_properties.pointGeometry(point0.x, point1.y); + const point3 = new ref_properties.pointGeometry(point1.x, point0.y); const r0 = elevation.pointCoordinate(point0); if (!r0) return; @@ -68906,10 +72500,10 @@ class Camera extends transform.Evented { const r3 = elevation.pointCoordinate(point3); if (!r3) return; - const m0 = new transform.MercatorCoordinate(r0[0], r0[1]).toLngLat(); - const m1 = new transform.MercatorCoordinate(r1[0], r1[1]).toLngLat(); - const m2 = new transform.MercatorCoordinate(r2[0], r2[1]).toLngLat(); - const m3 = new transform.MercatorCoordinate(r3[0], r3[1]).toLngLat(); + const m0 = new ref_properties.MercatorCoordinate(r0[0], r0[1]).toLngLat(); + const m1 = new ref_properties.MercatorCoordinate(r1[0], r1[1]).toLngLat(); + const m2 = new ref_properties.MercatorCoordinate(r2[0], r2[1]).toLngLat(); + const m3 = new ref_properties.MercatorCoordinate(r3[0], r3[1]).toLngLat(); const minLng = Math.min(m0.lng, Math.min(m1.lng, Math.min(m2.lng, m3.lng))); const minLat = Math.min(m0.lat, Math.min(m1.lat, Math.min(m2.lat, m3.lat))); @@ -68920,8 +72514,8 @@ class Camera extends transform.Evented { const minAltitude = Math.min(r0[3], Math.min(r1[3], Math.min(r2[3], r3[3]))); const maxAltitude = Math.max(r0[3], Math.max(r1[3], Math.max(r2[3], r3[3]))); - const minLngLat = new transform.LngLat(minLng, minLat); - const maxLngLat = new transform.LngLat(maxLng, maxLat); + const minLngLat = new ref_properties.LngLat(minLng, minLat); + const maxLngLat = new ref_properties.LngLat(maxLng, maxLat); return {minLngLat, maxLngLat, minAltitude, maxAltitude}; } @@ -68930,6 +72524,7 @@ class Camera extends transform.Evented { * Pans, rotates and zooms the map to to fit the box made by points p0 and p1 * once the map is rotated to the specified bearing. To zoom without rotating, * pass in the current map bearing. + * This function isn't supported with globe projection. * * @memberof Map# * @param {PointLike} p0 First point on screen, in pixel coordinates. @@ -68947,7 +72542,7 @@ class Camera extends transform.Evented { * @fires Map.event:movestart * @fires Map.event:moveend * @returns {Map} Returns itself to allow for method chaining. - * @example + * @example * const p0 = [220, 400]; * const p1 = [500, 900]; * map.fitScreenCoordinates(p0, p1, map.getBearing(), { @@ -68955,10 +72550,14 @@ class Camera extends transform.Evented { * }); * @see Used by {@link BoxZoomHandler} */ - fitScreenCoordinates(p0 , p1 , bearing , options , eventData ) { + fitScreenCoordinates(p0 , p1 , bearing , options , eventData ) { + if (this.transform.projection.name === 'globe') { + ref_properties.warnOnce('Globe projection does not support fitScreenCoordinates API, this API may behave unexpectedly.'); + } + let lngLat0, lngLat1, minAltitude, maxAltitude; - const point0 = transform.pointGeometry.convert(p0); - const point1 = transform.pointGeometry.convert(p1); + const point0 = ref_properties.pointGeometry.convert(p0); + const point1 = ref_properties.pointGeometry.convert(p1); const raycast = this._raycastElevationBox(point0, point1); @@ -68979,8 +72578,8 @@ class Camera extends transform.Evented { if (this.transform.pitch === 0) { return this._fitInternal( this._cameraForBoxAndBearing( - this.transform.pointLocation(transform.pointGeometry.convert(p0)), - this.transform.pointLocation(transform.pointGeometry.convert(p1)), + this.transform.pointLocation(ref_properties.pointGeometry.convert(p0)), + this.transform.pointLocation(ref_properties.pointGeometry.convert(p1)), bearing, options), options, @@ -68997,11 +72596,11 @@ class Camera extends transform.Evented { options, eventData); } - _fitInternal(calculatedOptions , options , eventData ) { + _fitInternal(calculatedOptions , options , eventData ) { // cameraForBounds warns + returns undefined if unable to fit: if (!calculatedOptions) return this; - options = transform.extend(calculatedOptions, options); + options = ref_properties.extend(calculatedOptions, options); // Explicitly remove the padding field because, calculatedOptions already accounts for padding by setting zoom and center accordingly. delete options.padding; @@ -69042,7 +72641,7 @@ class Camera extends transform.Evented { * @see [Example: Jump to a series of locations](https://docs.mapbox.com/mapbox-gl-js/example/jump-to/) * @see [Example: Update a feature in realtime](https://docs.mapbox.com/mapbox-gl-js/example/live-update-feature/) */ - jumpTo(options , eventData ) { + jumpTo(options , eventData ) { this.stop(); const tr = options.preloadOnly ? this.transform.clone() : this.transform; @@ -69056,7 +72655,7 @@ class Camera extends transform.Evented { } if (options.center !== undefined) { - tr.center = transform.LngLat.convert(options.center); + tr.center = ref_properties.LngLat.convert(options.center); } if ('bearing' in options && tr.bearing !== +options.bearing) { @@ -69078,28 +72677,28 @@ class Camera extends transform.Evented { return this; } - this.fire(new transform.Event('movestart', eventData)) - .fire(new transform.Event('move', eventData)); + this.fire(new ref_properties.Event('movestart', eventData)) + .fire(new ref_properties.Event('move', eventData)); if (zoomChanged) { - this.fire(new transform.Event('zoomstart', eventData)) - .fire(new transform.Event('zoom', eventData)) - .fire(new transform.Event('zoomend', eventData)); + this.fire(new ref_properties.Event('zoomstart', eventData)) + .fire(new ref_properties.Event('zoom', eventData)) + .fire(new ref_properties.Event('zoomend', eventData)); } if (bearingChanged) { - this.fire(new transform.Event('rotatestart', eventData)) - .fire(new transform.Event('rotate', eventData)) - .fire(new transform.Event('rotateend', eventData)); + this.fire(new ref_properties.Event('rotatestart', eventData)) + .fire(new ref_properties.Event('rotate', eventData)) + .fire(new ref_properties.Event('rotateend', eventData)); } if (pitchChanged) { - this.fire(new transform.Event('pitchstart', eventData)) - .fire(new transform.Event('pitch', eventData)) - .fire(new transform.Event('pitchend', eventData)); + this.fire(new ref_properties.Event('pitchstart', eventData)) + .fire(new ref_properties.Event('pitch', eventData)) + .fire(new ref_properties.Event('pitchend', eventData)); } - return this.fire(new transform.Event('moveend', eventData)); + return this.fire(new ref_properties.Event('moveend', eventData)); } /** @@ -69122,7 +72721,7 @@ class Camera extends transform.Evented { */ getFreeCameraOptions() { if (!this.transform.projection.supportsFreeCamera) { - transform.warnOnce(freeCameraNotSupportedWarning); + ref_properties.warnOnce(freeCameraNotSupportedWarning); } return this.transform.getFreeCameraOptions(); } @@ -69162,12 +72761,12 @@ class Camera extends transform.Evented { * * map.setFreeCameraOptions(camera); */ - setFreeCameraOptions(options , eventData ) { + setFreeCameraOptions(options , eventData ) { const tr = this.transform; if (!tr.projection.supportsFreeCamera) { - transform.warnOnce(freeCameraNotSupportedWarning); - return; + ref_properties.warnOnce(freeCameraNotSupportedWarning); + return this; } this.stop(); @@ -69182,28 +72781,28 @@ class Camera extends transform.Evented { const pitchChanged = prevPitch !== tr.pitch; const bearingChanged = prevBearing !== tr.bearing; - this.fire(new transform.Event('movestart', eventData)) - .fire(new transform.Event('move', eventData)); + this.fire(new ref_properties.Event('movestart', eventData)) + .fire(new ref_properties.Event('move', eventData)); if (zoomChanged) { - this.fire(new transform.Event('zoomstart', eventData)) - .fire(new transform.Event('zoom', eventData)) - .fire(new transform.Event('zoomend', eventData)); + this.fire(new ref_properties.Event('zoomstart', eventData)) + .fire(new ref_properties.Event('zoom', eventData)) + .fire(new ref_properties.Event('zoomend', eventData)); } if (bearingChanged) { - this.fire(new transform.Event('rotatestart', eventData)) - .fire(new transform.Event('rotate', eventData)) - .fire(new transform.Event('rotateend', eventData)); + this.fire(new ref_properties.Event('rotatestart', eventData)) + .fire(new ref_properties.Event('rotate', eventData)) + .fire(new ref_properties.Event('rotateend', eventData)); } if (pitchChanged) { - this.fire(new transform.Event('pitchstart', eventData)) - .fire(new transform.Event('pitch', eventData)) - .fire(new transform.Event('pitchend', eventData)); + this.fire(new ref_properties.Event('pitchstart', eventData)) + .fire(new ref_properties.Event('pitch', eventData)) + .fire(new ref_properties.Event('pitchend', eventData)); } - this.fire(new transform.Event('moveend', eventData)); + this.fire(new ref_properties.Event('moveend', eventData)); return this; } @@ -69217,7 +72816,7 @@ class Camera extends transform.Evented { * unless `options` includes `essential: true`. * * @memberof Map# - * @param {CameraOptions & AnimationOptions} options Options describing the destination and animation of the transition. + * @param {EasingOptions} options Options describing the destination and animation of the transition. * Accepts {@link CameraOptions} and {@link AnimationOptions}. * @param {Object | null} eventData Additional properties to be added to event objects of events triggered by this method. * @fires Map.event:movestart @@ -69248,16 +72847,16 @@ class Camera extends transform.Evented { * }); * @see [Example: Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) */ - easeTo(options , eventData ) { + easeTo(options , eventData ) { this._stop(false, options.easeId); - options = transform.extend({ + options = ref_properties.extend({ offset: [0, 0], duration: 500, - easing: transform.ease + easing: ref_properties.ease }, options); - if (options.animate === false || (!options.essential && transform.exported.prefersReducedMotion)) options.duration = 0; + if (options.animate === false || (!options.essential && ref_properties.exported.prefersReducedMotion)) options.duration = 0; const tr = this.transform, startZoom = this.getZoom(), @@ -69270,22 +72869,42 @@ class Camera extends transform.Evented { pitch = 'pitch' in options ? +options.pitch : startPitch, padding = 'padding' in options ? options.padding : tr.padding; - const offsetAsPoint = transform.pointGeometry.convert(options.offset); - let pointAtOffset = tr.centerPoint.add(offsetAsPoint); - const locationAtOffset = tr.projection.name === 'globe' ? - tr.pointCoordinate(pointAtOffset).toLngLat() : - tr.pointLocation(pointAtOffset); - const center = transform.LngLat.convert(options.center || locationAtOffset); - this._normalizeCenter(center); + const offsetAsPoint = ref_properties.pointGeometry.convert(options.offset); - const from = tr.project(locationAtOffset); - const delta = tr.project(center).sub(from); + let pointAtOffset; + let from; + let delta; + + if (tr.projection.name === 'globe') { + // Pixel coordinates will be applied directly to translate the globe + const centerCoord = ref_properties.MercatorCoordinate.fromLngLat(tr.center); + + const rotatedOffset = offsetAsPoint.rotate(-tr.angle); + centerCoord.x += rotatedOffset.x / tr.worldSize; + centerCoord.y += rotatedOffset.y / tr.worldSize; + + const locationAtOffset = centerCoord.toLngLat(); + const center = ref_properties.LngLat.convert(options.center || locationAtOffset); + this._normalizeCenter(center); + + pointAtOffset = tr.centerPoint.add(rotatedOffset); + from = new ref_properties.pointGeometry(centerCoord.x, centerCoord.y).mult(tr.worldSize); + delta = new ref_properties.pointGeometry(ref_properties.mercatorXfromLng(center.lng), ref_properties.mercatorYfromLat(center.lat)).mult(tr.worldSize).sub(from); + } else { + pointAtOffset = tr.centerPoint.add(offsetAsPoint); + const locationAtOffset = tr.pointLocation(pointAtOffset); + const center = ref_properties.LngLat.convert(options.center || locationAtOffset); + this._normalizeCenter(center); + + from = tr.project(locationAtOffset); + delta = tr.project(center).sub(from); + } const finalScale = tr.zoomScale(zoom - startZoom); let around, aroundPoint; if (options.around) { - around = transform.LngLat.convert(options.around); + around = ref_properties.LngLat.convert(options.around); aroundPoint = tr.locationPoint(around); } @@ -69296,13 +72915,13 @@ class Camera extends transform.Evented { const frame = (tr) => (k) => { if (zoomChanged) { - tr.zoom = transform.number(startZoom, zoom, k); + tr.zoom = ref_properties.number(startZoom, zoom, k); } if (bearingChanged) { - tr.bearing = transform.number(startBearing, bearing, k); + tr.bearing = ref_properties.number(startBearing, bearing, k); } if (pitchChanged) { - tr.pitch = transform.number(startPitch, pitch, k); + tr.pitch = ref_properties.number(startPitch, pitch, k); } if (paddingChanged) { tr.interpolatePadding(startPadding, padding, k); @@ -69364,29 +72983,29 @@ class Camera extends transform.Evented { this.transform.cameraElevationReference = "sea"; if (!noMoveStart && !currently.moving) { - this.fire(new transform.Event('movestart', eventData)); + this.fire(new ref_properties.Event('movestart', eventData)); } if (this._zooming && !currently.zooming) { - this.fire(new transform.Event('zoomstart', eventData)); + this.fire(new ref_properties.Event('zoomstart', eventData)); } if (this._rotating && !currently.rotating) { - this.fire(new transform.Event('rotatestart', eventData)); + this.fire(new ref_properties.Event('rotatestart', eventData)); } if (this._pitching && !currently.pitching) { - this.fire(new transform.Event('pitchstart', eventData)); + this.fire(new ref_properties.Event('pitchstart', eventData)); } } _fireMoveEvents(eventData ) { - this.fire(new transform.Event('move', eventData)); + this.fire(new ref_properties.Event('move', eventData)); if (this._zooming) { - this.fire(new transform.Event('zoom', eventData)); + this.fire(new ref_properties.Event('zoom', eventData)); } if (this._rotating) { - this.fire(new transform.Event('rotate', eventData)); + this.fire(new ref_properties.Event('rotate', eventData)); } if (this._pitching) { - this.fire(new transform.Event('pitch', eventData)); + this.fire(new ref_properties.Event('pitch', eventData)); } } @@ -69396,7 +73015,7 @@ class Camera extends transform.Evented { if (this._easeId && easeId && this._easeId === easeId) { return; } - delete this._easeId; + this._easeId = undefined; this.transform.cameraElevationReference = "ground"; const wasZooming = this._zooming; @@ -69409,15 +73028,15 @@ class Camera extends transform.Evented { this._padding = false; if (wasZooming) { - this.fire(new transform.Event('zoomend', eventData)); + this.fire(new ref_properties.Event('zoomend', eventData)); } if (wasRotating) { - this.fire(new transform.Event('rotateend', eventData)); + this.fire(new ref_properties.Event('rotateend', eventData)); } if (wasPitching) { - this.fire(new transform.Event('pitchend', eventData)); + this.fire(new ref_properties.Event('pitchend', eventData)); } - this.fire(new transform.Event('moveend', eventData)); + this.fire(new ref_properties.Event('moveend', eventData)); } /** @@ -69479,10 +73098,10 @@ class Camera extends transform.Evented { * @see [Example: Slowly fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto-options/) * @see [Example: Fly to a location based on scroll position](https://www.mapbox.com/mapbox-gl-js/example/scroll-fly-to/) */ - flyTo(options , eventData ) { + flyTo(options , eventData ) { // Fall through to jumpTo if user has set prefers-reduced-motion - if (!options.essential && transform.exported.prefersReducedMotion) { - const coercedOptions = transform.pick(options, ['center', 'zoom', 'bearing', 'pitch', 'around']); + if (!options.essential && ref_properties.exported.prefersReducedMotion) { + const coercedOptions = ref_properties.pick(options, ['center', 'zoom', 'bearing', 'pitch', 'around']); return this.jumpTo(coercedOptions, eventData); } @@ -69496,11 +73115,11 @@ class Camera extends transform.Evented { this.stop(); - options = transform.extend({ + options = ref_properties.extend({ offset: [0, 0], speed: 1.2, curve: 1.42, - easing: transform.ease + easing: ref_properties.ease }, options); const tr = this.transform, @@ -69509,16 +73128,16 @@ class Camera extends transform.Evented { startPitch = this.getPitch(), startPadding = this.getPadding(); - const zoom = 'zoom' in options ? transform.clamp(+options.zoom, tr.minZoom, tr.maxZoom) : startZoom; + const zoom = 'zoom' in options ? ref_properties.clamp(+options.zoom, tr.minZoom, tr.maxZoom) : startZoom; const bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing; const pitch = 'pitch' in options ? +options.pitch : startPitch; const padding = 'padding' in options ? options.padding : tr.padding; const scale = tr.zoomScale(zoom - startZoom); - const offsetAsPoint = transform.pointGeometry.convert(options.offset); + const offsetAsPoint = ref_properties.pointGeometry.convert(options.offset); let pointAtOffset = tr.centerPoint.add(offsetAsPoint); const locationAtOffset = tr.pointLocation(pointAtOffset); - const center = transform.LngLat.convert(options.center || locationAtOffset); + const center = ref_properties.LngLat.convert(options.center || locationAtOffset); this._normalizeCenter(center); const from = tr.project(locationAtOffset); @@ -69535,7 +73154,7 @@ class Camera extends transform.Evented { u1 = delta.mag(); if ('minZoom' in options) { - const minZoom = transform.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom); + const minZoom = ref_properties.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom); // wm: Maximum visible span, measured in pixels with respect to the initial // scale. const wMax = w0 / tr.zoomScale(minZoom - startZoom); @@ -69613,10 +73232,10 @@ class Camera extends transform.Evented { tr.zoom = k === 1 ? zoom : startZoom + tr.scaleZoom(scale); if (bearingChanged) { - tr.bearing = transform.number(startBearing, bearing, k); + tr.bearing = ref_properties.number(startBearing, bearing, k); } if (pitchChanged) { - tr.pitch = transform.number(startPitch, pitch, k); + tr.pitch = ref_properties.number(startPitch, pitch, k); } if (paddingChanged) { tr.interpolatePadding(startPadding, padding, k); @@ -69627,7 +73246,7 @@ class Camera extends transform.Evented { const newCenter = k === 1 ? center : tr.unproject(from.add(delta.mult(u(s))).mult(scale)); tr.setLocationAtPoint(tr.renderWorldCopies ? newCenter.wrap() : newCenter, pointAtOffset); - tr._updateCenterElevation(); + tr._updateCameraOnTerrain(); if (!options.preloadOnly) { this._fireMoveEvents(eventData); @@ -69653,7 +73272,7 @@ class Camera extends transform.Evented { return this; } - isEasing() { + isEasing() { return !!this._easeFrameId; } @@ -69672,8 +73291,8 @@ class Camera extends transform.Evented { _stop(allowGestures , easeId ) { if (this._easeFrameId) { this._cancelRenderFrame(this._easeFrameId); - delete this._easeFrameId; - delete this._onEaseFrame; + this._easeFrameId = undefined; + this._onEaseFrame = undefined; } if (this._onEaseEnd) { @@ -69681,7 +73300,7 @@ class Camera extends transform.Evented { // animation, which sets a new _onEaseEnd. Ensure we don't delete // it unintentionally. const onEaseEnd = this._onEaseEnd; - delete this._onEaseEnd; + this._onEaseEnd = undefined; onEaseEnd.call(this, easeId); } if (!allowGestures) { @@ -69698,7 +73317,7 @@ class Camera extends transform.Evented { frame(1); finish(); } else { - this._easeStart = transform.exported.now(); + this._easeStart = ref_properties.exported.now(); this._easeOptions = options; this._onEaseFrame = frame; this._onEaseEnd = finish; @@ -69708,8 +73327,9 @@ class Camera extends transform.Evented { // Callback for map._requestRenderFrame _renderFrameCallback() { - const t = Math.min((transform.exported.now() - this._easeStart) / this._easeOptions.duration, 1); - this._onEaseFrame(this._easeOptions.easing(t)); + const t = Math.min((ref_properties.exported.now() - this._easeStart) / this._easeOptions.duration, 1); + const frame = this._onEaseFrame; + if (frame) frame(this._easeOptions.easing(t)); if (t < 1) { this._easeFrameId = this._requestRenderFrame(this._renderFrameCallback); } else { @@ -69718,8 +73338,8 @@ class Camera extends transform.Evented { } // convert bearing so that it's numerically close to the current one so that it interpolates properly - _normalizeBearing(bearing , currentBearing ) { - bearing = transform.wrap(bearing, -180, 180); + _normalizeBearing(bearing , currentBearing ) { + bearing = ref_properties.wrap(bearing, -180, 180); const diff = Math.abs(bearing - currentBearing); if (Math.abs(bearing - 360 - currentBearing) < diff) bearing -= 360; if (Math.abs(bearing + 360 - currentBearing) < diff) bearing += 360; @@ -69739,7 +73359,7 @@ class Camera extends transform.Evented { } // emulates frame function for some transform - _emulate(frame , duration , initialTransform ) { + _emulate(frame , duration , initialTransform ) { const frameRate = 15; const numFrames = Math.ceil(duration * frameRate / 1000); @@ -69758,26 +73378,26 @@ class Camera extends transform.Evented { // - ___start events needs to be fired before ___ and ___end events // - another ___start event can't be fired before a ___end event has been fired for the previous one function addAssertions(camera ) { //eslint-disable-line - transform.Debug.run(() => { + ref_properties.Debug.run(() => { const inProgress = {}; ['drag', 'zoom', 'rotate', 'pitch', 'move'].forEach(name => { inProgress[name] = false; camera.on(`${name}start`, () => { - transform.assert_1(!inProgress[name], `"${name}start" fired twice without a "${name}end"`); + ref_properties.assert_1(!inProgress[name], `"${name}start" fired twice without a "${name}end"`); inProgress[name] = true; - transform.assert_1(inProgress.move); + ref_properties.assert_1(inProgress.move); }); camera.on(name, () => { - transform.assert_1(inProgress[name]); - transform.assert_1(inProgress.move); + ref_properties.assert_1(inProgress[name]); + ref_properties.assert_1(inProgress.move); }); camera.on(`${name}end`, () => { - transform.assert_1(inProgress.move); - transform.assert_1(inProgress[name]); + ref_properties.assert_1(inProgress.move); + ref_properties.assert_1(inProgress[name]); inProgress[name] = false; }); }); @@ -69791,7 +73411,7 @@ let canary; //eslint-disable-line // - + @@ -69826,7 +73446,7 @@ class AttributionControl { constructor(options = {}) { this.options = options; - transform.bindAll([ + ref_properties.bindAll([ '_toggleAttribution', '_updateEditLink', '_updateData', @@ -69834,21 +73454,21 @@ class AttributionControl { ], this); } - getDefaultPosition() { + getDefaultPosition() { return 'bottom-right'; } - onAdd(map ) { + onAdd(map ) { const compact = this.options && this.options.compact; this._map = map; - this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-attrib'); - this._compactButton = DOM.create('button', 'mapboxgl-ctrl-attrib-button', this._container); - DOM.create('span', `mapboxgl-ctrl-icon`, this._compactButton).setAttribute('aria-hidden', true); + this._container = create$1('div', 'mapboxgl-ctrl mapboxgl-ctrl-attrib'); + this._compactButton = create$1('button', 'mapboxgl-ctrl-attrib-button', this._container); + create$1('span', `mapboxgl-ctrl-icon`, this._compactButton).setAttribute('aria-hidden', 'true'); this._compactButton.type = 'button'; this._compactButton.addEventListener('click', this._toggleAttribution); this._setElementTitle(this._compactButton, 'ToggleAttribution'); - this._innerContainer = DOM.create('div', 'mapboxgl-ctrl-attrib-inner', this._container); + this._innerContainer = create$1('div', 'mapboxgl-ctrl-attrib-inner', this._container); this._innerContainer.setAttribute('role', 'list'); if (compact) { @@ -69908,7 +73528,7 @@ class AttributionControl { const params = [ {key: 'owner', value: this.styleOwner}, {key: 'id', value: this.styleId}, - {key: 'access_token', value: this._map._requestManager._customAccessToken || transform.config.ACCESS_TOKEN} + {key: 'access_token', value: this._map._requestManager._customAccessToken || ref_properties.config.ACCESS_TOKEN} ]; if (editLink) { @@ -69918,7 +73538,7 @@ class AttributionControl { } return acc; }, `?`); - editLink.href = `${transform.config.FEEDBACK_URL}/${paramString}${this._map._hash ? this._map._hash.getHashString(true) : ''}`; + editLink.href = `${ref_properties.config.FEEDBACK_URL}/${paramString}${this._map._hash ? this._map._hash.getHashString(true) : ''}`; editLink.rel = 'noopener nofollow'; this._setElementTitle(editLink, 'MapFeedback'); } @@ -69998,7 +73618,7 @@ class AttributionControl { // - + /** * A `LogoControl` is a control that adds the Mapbox watermark @@ -70015,14 +73635,13 @@ class LogoControl { constructor() { - transform.bindAll(['_updateLogo'], this); - transform.bindAll(['_updateCompact'], this); + ref_properties.bindAll(['_updateLogo', '_updateCompact'], this); } - onAdd(map ) { + onAdd(map ) { this._map = map; - this._container = DOM.create('div', 'mapboxgl-ctrl'); - const anchor = DOM.create('a', 'mapboxgl-ctrl-logo'); + this._container = create$1('div', 'mapboxgl-ctrl'); + const anchor = create$1('a', 'mapboxgl-ctrl-logo'); anchor.target = "_blank"; anchor.rel = "noopener nofollow"; anchor.href = "https://www.mapbox.com/"; @@ -70046,7 +73665,7 @@ class LogoControl { this._map.off('resize', this._updateCompact); } - getDefaultPosition() { + getDefaultPosition() { return 'bottom-left'; } @@ -70056,7 +73675,7 @@ class LogoControl { } } - _logoRequired() { + _logoRequired() { if (!this._map.style) return true; const sourceCaches = this._map.style._sourceCaches; if (Object.entries(sourceCaches).length === 0) return true; @@ -70125,7 +73744,7 @@ class TaskQueue { } run(timeStamp = 0) { - transform.assert_1(!this._currentlyRunning); + ref_properties.assert_1(!this._currentlyRunning); const queue = this._currentlyRunning = this._queue; // Tasks queued by callbacks in the current queue should be executed @@ -70170,36 +73789,36 @@ class TaskQueue { * * @private */ -function smartWrap(lngLat , priorPos , transform$1 ) { - lngLat = new transform.LngLat(lngLat.lng, lngLat.lat); +function smartWrap(lngLat , priorPos , transform ) { + lngLat = new ref_properties.LngLat(lngLat.lng, lngLat.lat); // First, try shifting one world in either direction, and see if either is closer to the // prior position. Don't shift away if it new position is further from center. // This preserves object constancy when the map center is auto-wrapped during animations, // but don't allow it to run away on horizon (points towards horizon get closer and closer). if (priorPos) { - const left = new transform.LngLat(lngLat.lng - 360, lngLat.lat); - const right = new transform.LngLat(lngLat.lng + 360, lngLat.lat); + const left = new ref_properties.LngLat(lngLat.lng - 360, lngLat.lat); + const right = new ref_properties.LngLat(lngLat.lng + 360, lngLat.lat); // Unless offscreen, keep the marker within same wrap distance to center. This is to prevent // running it to infinity `lng` near horizon when bearing is ~90°. - const withinWrap = Math.ceil(Math.abs(lngLat.lng - transform$1.center.lng) / 360) * 360; - const delta = transform$1.locationPoint(lngLat).distSqr(priorPos); - const offscreen = priorPos.x < 0 || priorPos.y < 0 || priorPos.x > transform$1.width || priorPos.y > transform$1.height; - if (transform$1.locationPoint(left).distSqr(priorPos) < delta && (offscreen || Math.abs(left.lng - transform$1.center.lng) < withinWrap)) { + const withinWrap = Math.ceil(Math.abs(lngLat.lng - transform.center.lng) / 360) * 360; + const delta = transform.locationPoint(lngLat).distSqr(priorPos); + const offscreen = priorPos.x < 0 || priorPos.y < 0 || priorPos.x > transform.width || priorPos.y > transform.height; + if (transform.locationPoint(left).distSqr(priorPos) < delta && (offscreen || Math.abs(left.lng - transform.center.lng) < withinWrap)) { lngLat = left; - } else if (transform$1.locationPoint(right).distSqr(priorPos) < delta && (offscreen || Math.abs(right.lng - transform$1.center.lng) < withinWrap)) { + } else if (transform.locationPoint(right).distSqr(priorPos) < delta && (offscreen || Math.abs(right.lng - transform.center.lng) < withinWrap)) { 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$1.center.lng) > 180) { - const pos = transform$1.locationPoint(lngLat); - if (pos.x >= 0 && pos.y >= 0 && pos.x <= transform$1.width && pos.y <= transform$1.height) { + while (Math.abs(lngLat.lng - transform.center.lng) > 180) { + const pos = transform.locationPoint(lngLat); + if (pos.x >= 0 && pos.y >= 0 && pos.x <= transform.width && pos.y <= transform.height) { break; } - if (lngLat.lng > transform$1.center.lng) { + if (lngLat.lng > transform.center.lng) { lngLat.lng -= 360; } else { lngLat.lng += 360; @@ -70235,11 +73854,6 @@ const anchorTranslate = { }; // - - - - - @@ -70286,8 +73900,8 @@ const TERRAIN_OCCLUDED_OPACITY = 0.2; * @see [Example: Add custom icons with Markers](https://www.mapbox.com/mapbox-gl-js/example/custom-marker-icons/) * @see [Example: Create a draggable Marker](https://www.mapbox.com/mapbox-gl-js/example/drag-a-marker/) */ -class Marker extends transform.Evented { - +class Marker extends ref_properties.Evented { + @@ -70315,11 +73929,11 @@ class Marker extends transform.Evented { super(); // For backward compatibility -- the constructor used to accept the element as a // required first argument, before it was made optional. - if (options instanceof transform.window.HTMLElement || legacyOptions) { - options = transform.extend({element: options}, legacyOptions); + if (options instanceof ref_properties.window.HTMLElement || legacyOptions) { + options = ref_properties.extend({element: options}, legacyOptions); } - transform.bindAll([ + ref_properties.bindAll([ '_update', '_onMove', '_onUp', @@ -70329,48 +73943,48 @@ class Marker extends transform.Evented { '_clearFadeTimer' ], this); - this._anchor = options && options.anchor || 'center'; - this._color = options && options.color || '#3FB1CE'; - this._scale = options && options.scale || 1; - this._draggable = options && options.draggable || false; - this._clickTolerance = options && options.clickTolerance || 0; + this._anchor = (options && options.anchor) || 'center'; + this._color = (options && options.color) || '#3FB1CE'; + this._scale = (options && options.scale) || 1; + this._draggable = (options && options.draggable) || false; + this._clickTolerance = (options && options.clickTolerance) || 0; this._isDragging = false; this._state = 'inactive'; - this._rotation = options && options.rotation || 0; - this._rotationAlignment = options && options.rotationAlignment || 'auto'; - this._pitchAlignment = options && options.pitchAlignment && options.pitchAlignment !== 'auto' ? options.pitchAlignment : this._rotationAlignment; + this._rotation = (options && options.rotation) || 0; + this._rotationAlignment = (options && options.rotationAlignment) || 'auto'; + this._pitchAlignment = (options && options.pitchAlignment && options.pitchAlignment) || 'auto'; this._updateMoving = () => this._update(true); if (!options || !options.element) { this._defaultMarker = true; - this._element = DOM.create('div'); + this._element = create$1('div'); // create default map marker SVG const defaultHeight = 41; const defaultWidth = 27; - const svg = DOM.createSVG('svg', { + const svg = createSVG('svg', { display: 'block', height: `${defaultHeight * this._scale}px`, width: `${defaultWidth * this._scale}px`, viewBox: `0 0 ${defaultWidth} ${defaultHeight}` }, this._element); - const gradient = DOM.createSVG('radialGradient', {id: 'shadowGradient'}, DOM.createSVG('defs', {}, svg)); - DOM.createSVG('stop', {offset: '10%', 'stop-opacity': 0.4}, gradient); - DOM.createSVG('stop', {offset: '100%', 'stop-opacity': 0.05}, gradient); - DOM.createSVG('ellipse', {cx: 13.5, cy: 34.8, rx: 10.5, ry: 5.25, fill: 'url(#shadowGradient)'}, svg); // shadow + const gradient = createSVG('radialGradient', {id: 'shadowGradient'}, createSVG('defs', {}, svg)); + createSVG('stop', {offset: '10%', 'stop-opacity': 0.4}, gradient); + createSVG('stop', {offset: '100%', 'stop-opacity': 0.05}, gradient); + createSVG('ellipse', {cx: 13.5, cy: 34.8, rx: 10.5, ry: 5.25, fill: 'url(#shadowGradient)'}, svg); // shadow - DOM.createSVG('path', { // marker shape + createSVG('path', { // marker shape fill: this._color, d: 'M27,13.5C27,19.07 20.25,27 14.75,34.5C14.02,35.5 12.98,35.5 12.25,34.5C6.75,27 0,19.22 0,13.5C0,6.04 6.04,0 13.5,0C20.96,0 27,6.04 27,13.5Z' }, svg); - DOM.createSVG('path', { // border + createSVG('path', { // border opacity: 0.25, d: 'M13.5,0C6.04,0 0,6.04 0,13.5C0,19.22 6.75,27 12.25,34.5C13,35.52 14.02,35.5 14.75,34.5C20.25,27 27,19.07 27,13.5C27,6.04 20.96,0 13.5,0ZM13.5,1C20.42,1 26,6.58 26,13.5C26,15.9 24.5,19.18 22.22,22.74C19.95,26.3 16.71,30.14 13.94,33.91C13.74,34.18 13.61,34.32 13.5,34.44C13.39,34.32 13.26,34.18 13.06,33.91C10.28,30.13 7.41,26.31 5.02,22.77C2.62,19.23 1,15.95 1,13.5C1,6.58 6.58,1 13.5,1Z' }, svg); - DOM.createSVG('circle', {fill: 'white', cx: 13.5, cy: 13.5, r: 5.5}, svg); // circle + createSVG('circle', {fill: 'white', cx: 13.5, cy: 13.5, r: 5.5}, svg); // circle // 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 @@ -70379,10 +73993,10 @@ class Marker extends transform.Evented { // the y value of the center of the shadow ellipse relative to the svg top left is 34.8 // offset to the svg center "height (41 / 2)" gives 34.8 - (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 - this._offset = transform.pointGeometry.convert(options && options.offset || [0, -14]); + this._offset = ref_properties.pointGeometry.convert((options && options.offset) || [0, -14]); } else { this._element = options.element; - this._offset = transform.pointGeometry.convert(options && options.offset || [0, 0]); + this._offset = ref_properties.pointGeometry.convert((options && options.offset) || [0, 0]); } if (!this._element.hasAttribute('aria-label')) this._element.setAttribute('aria-label', 'Map marker'); @@ -70413,7 +74027,7 @@ class Marker extends transform.Evented { * .setLngLat([30.5, 50.5]) * .addTo(map); // add the marker to the map */ - addTo(map ) { + addTo(map ) { if (map === this._map) { return this; } @@ -70430,7 +74044,7 @@ class Marker extends transform.Evented { // 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); + map.on('click', this._onMapClick); return this; } @@ -70443,20 +74057,21 @@ class Marker extends transform.Evented { * marker.remove(); * @returns {Marker} Returns itself to allow for method chaining. */ - remove() { - if (this._map) { - this._map.off('click', this._onMapClick); - this._map.off('move', this._updateMoving); - this._map.off('moveend', this._update); - this._map.off('mousedown', this._addDragHandler); - this._map.off('touchstart', this._addDragHandler); - this._map.off('mouseup', this._onUp); - this._map.off('touchend', this._onUp); - this._map.off('mousemove', this._onMove); - this._map.off('touchmove', this._onMove); - this._map.off('remove', this._clearFadeTimer); - this._map._removeMarker(this); - delete this._map; + remove() { + const map = this._map; + if (map) { + map.off('click', this._onMapClick); + map.off('move', this._updateMoving); + map.off('moveend', this._update); + map.off('mousedown', this._addDragHandler); + map.off('touchstart', this._addDragHandler); + map.off('mouseup', this._onUp); + map.off('touchend', this._onUp); + map.off('mousemove', this._onMove); + map.off('touchmove', this._onMove); + map.off('remove', this._clearFadeTimer); + map._removeMarker(this); + this._map = undefined; } this._clearFadeTimer(); this._element.remove(); @@ -70479,7 +74094,7 @@ class Marker extends transform.Evented { * console.log(`Longitude: ${lngLat.lng}, Latitude: ${lngLat.lat}`); * @see [Example: Create a draggable Marker](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-marker/) */ - getLngLat() { + getLngLat() { return this._lngLat; } @@ -70497,8 +74112,8 @@ class Marker extends transform.Evented { * @see [Example: Create a draggable Marker](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-marker/) * @see [Example: Add a marker using a place name](https://docs.mapbox.com/mapbox-gl-js/example/marker-from-geocode/) */ - setLngLat(lnglat ) { - this._lngLat = transform.LngLat.convert(lnglat); + setLngLat(lnglat ) { + this._lngLat = ref_properties.LngLat.convert(lnglat); this._pos = null; if (this._popup) this._popup.setLngLat(this._lngLat); this._update(true); @@ -70512,7 +74127,7 @@ class Marker extends transform.Evented { * @example * const element = marker.getElement(); */ - getElement() { + getElement() { return this._element; } @@ -70529,7 +74144,7 @@ class Marker extends transform.Evented { * .addTo(map); * @see [Example: Attach a popup to a marker instance](https://docs.mapbox.com/mapbox-gl-js/example/set-popup/) */ - setPopup(popup ) { + setPopup(popup ) { if (this._popup) { this._popup.remove(); this._popup = null; @@ -70558,6 +74173,7 @@ class Marker extends transform.Evented { } : this._offset; } this._popup = popup; + popup._marker = this; if (this._lngLat) this._popup.setLngLat(this._lngLat); this._element.setAttribute('role', 'button'); @@ -70605,7 +74221,7 @@ class Marker extends transform.Evented { * * console.log(marker.getPopup()); // return the popup instance */ - getPopup() { + getPopup() { return this._popup; } @@ -70621,46 +74237,59 @@ class Marker extends transform.Evented { * * marker.togglePopup(); // toggle popup open or closed */ - togglePopup() { + togglePopup() { const popup = this._popup; if (!popup) { return this; } else if (popup.isOpen()) { popup.remove(); this._element.setAttribute('aria-expanded', 'false'); - } else { + } else if (this._map) { popup.addTo(this._map); this._element.setAttribute('aria-expanded', 'true'); } return this; } + _behindTerrain() { + const map = this._map; + if (!map) return false; + const unprojected = map.unproject(this._pos); + const camera = map.getFreeCameraOptions(); + if (!camera.position) return false; + const cameraLngLat = camera.position.toLngLat(); + const toClosestSurface = cameraLngLat.distanceTo(unprojected); + const toMarker = cameraLngLat.distanceTo(this._lngLat); + return toClosestSurface < toMarker * 0.9; + + } + _evaluateOpacity() { - const position = this._pos ? this._pos.sub(this._transformedOffset()) : null; + const map = this._map; + if (!map) return; - if (!this._withinScreenBounds(position)) { + const pos = this._pos; + + if (!pos || pos.x < 0 || pos.x > map.transform.width || pos.y < 0 || pos.y > map.transform.height) { this._clearFadeTimer(); return; } - - const mapLocation = this._map.unproject(position); - - let terrainOccluded = false; - if (this._map.transform._terrainEnabled() && this._map.getTerrain()) { - const camera = this._map.getFreeCameraOptions(); - if (camera.position) { - const cameraPos = camera.position.toLngLat(); - // the distance to the marker lat/lng + marker offset location - const offsetDistance = cameraPos.distanceTo(mapLocation); - const distance = cameraPos.distanceTo(this._lngLat); - terrainOccluded = offsetDistance < distance * 0.9; + const mapLocation = map.unproject(pos); + let opacity; + if (map._usingGlobe() && ref_properties.isLngLatBehindGlobe(map.transform, this._lngLat)) { + opacity = 0; + } else { + opacity = 1 - map._queryFogOpacity(mapLocation); + if (map.transform._terrainEnabled() && map.getTerrain() && this._behindTerrain()) { + opacity *= TERRAIN_OCCLUDED_OPACITY; } } - const fogOpacity = this._map._queryFogOpacity(mapLocation); - const opacity = (1.0 - fogOpacity) * (terrainOccluded ? TERRAIN_OCCLUDED_OPACITY : 1.0); this._element.style.opacity = `${opacity}`; - if (this._popup) this._popup._setOpacity(`${opacity}`); + this._element.style.pointerEvents = opacity > 0 ? 'auto' : 'none'; + if (this._popup) { + this._popup._setOpacity(opacity); + } this._fadeTimer = null; } @@ -70672,53 +74301,77 @@ class Marker extends transform.Evented { } } - _withinScreenBounds(position ) { - const tr = this._map.transform; - return !!position && - position.x >= 0 && position.x < tr.width && - position.y >= 0 && position.y < tr.height; - } - _updateDOM() { - const pos = this._pos || new transform.pointGeometry(0, 0); - const pitch = this._calculatePitch(); - const rotation = this._calculateRotation(); - this._element.style.transform = `${anchorTranslate[this._anchor]} translate(${pos.x}px, ${pos.y}px) rotateX(${pitch}deg) rotateZ(${rotation}deg)`; + const pos = this._pos; + const map = this._map; + if (!pos || !map) { return; } + + const rotation = this._calculateXYTransform() + this._calculateZTransform(); + const offset = this._offset.mult(this._scale); + + this._element.style.transform = ` + translate(${pos.x}px,${pos.y}px) ${anchorTranslate[this._anchor]} + ${rotation} + translate(${offset.x}px,${offset.y}px) + `; } - _calculatePitch() { - if (this._pitchAlignment === "viewport" || this._pitchAlignment === "auto") { - return 0; - } if (this._pitchAlignment === "map") { - return this._map.getPitch(); + _calculateXYTransform() { + const pos = this._pos; + const map = this._map; + + if (this.getPitchAlignment() !== 'map' || !map || !pos) { return ''; } + if (!map._usingGlobe()) { + const pitch = map.getPitch(); + return pitch ? `rotateX(${pitch}deg)` : ''; } - return 0; + const tilt = ref_properties.radToDeg(ref_properties.globeTiltAtLngLat(map.transform, this._lngLat)); + const posFromCenter = pos.sub(ref_properties.globeCenterToScreenPoint(map.transform)); + const tiltOverDist = tilt / (Math.abs(posFromCenter.x) + Math.abs(posFromCenter.y)); + const yTilt = posFromCenter.x * tiltOverDist; + const xTilt = -posFromCenter.y * tiltOverDist; + if (!xTilt && !yTilt) { return ''; } + return `rotateX(${xTilt}deg) rotateY(${yTilt}deg)`; + } + + _calculateZTransform() { + const spin = this._calculateRotation(); + return spin ? `rotateZ(${spin}deg)` : ``; } - _calculateRotation() { + _calculateRotation() { if (this._rotationAlignment === "viewport" || this._rotationAlignment === "auto") { return this._rotation; - } if (this._rotationAlignment === "map") { + } if (this._map && this._rotationAlignment === "map") { + const pos = this._pos; + const map = this._map; + if (pos && map && map._usingGlobe()) { + const north = map.project(new ref_properties.LngLat(this._lngLat.lng, this._lngLat.lat + .001)); + const south = map.project(new ref_properties.LngLat(this._lngLat.lng, this._lngLat.lat - .001)); + const diff = south.sub(north); + return this._rotation + ref_properties.radToDeg(Math.atan2(diff.y, diff.x)) - 90; + } return this._rotation - this._map.getBearing(); } return 0; } _update(delaySnap ) { - transform.window.cancelAnimationFrame(this._updateFrameId); - if (!this._map) return; + ref_properties.window.cancelAnimationFrame(this._updateFrameId); + const map = this._map; + if (!map) return; - if (this._map.transform.renderWorldCopies) { - this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); + if (map.transform.renderWorldCopies) { + this._lngLat = smartWrap(this._lngLat, this._pos, map.transform); } - this._pos = this._map.project(this._lngLat)._add(this._transformedOffset()); + this._pos = map.project(this._lngLat); // 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 (delaySnap === true) { - this._updateFrameId = transform.window.requestAnimationFrame(() => { + this._updateFrameId = ref_properties.window.requestAnimationFrame(() => { if (this._element && this._pos && this._anchor) { this._pos = this._pos.round(); this._updateDOM(); @@ -70728,33 +74381,19 @@ class Marker extends transform.Evented { this._pos = this._pos.round(); } - this._map._requestDomTask(() => { + map._requestDomTask(() => { if (!this._map) return; if (this._element && this._pos && this._anchor) { this._updateDOM(); } - if ((this._map.getTerrain() || this._map.getFog()) && !this._fadeTimer) { + if ((map._usingGlobe() || map.getTerrain() || map.getFog()) && !this._fadeTimer) { this._fadeTimer = setTimeout(this._evaluateOpacity.bind(this), 60); } }); } - /** - * This is initially added to fix the behavior of default symbols only, in order - * to prevent any regression for custom symbols in client code. - * @private - */ - _transformedOffset() { - if (!this._defaultMarker) return this._offset; - const tr = this._map.transform; - const offset = this._offset.mult(this._scale); - if (this._rotationAlignment === "map") offset._rotate(tr.angle); - if (this._pitchAlignment === "map") offset.y *= Math.cos(tr._pitch); - return offset; - } - /** * Get the marker's offset. * @@ -70762,7 +74401,7 @@ class Marker extends transform.Evented { * @example * const offset = marker.getOffset(); */ - getOffset() { + getOffset() { return this._offset; } @@ -70774,21 +74413,24 @@ class Marker extends transform.Evented { * @example * marker.setOffset([0, 1]); */ - setOffset(offset ) { - this._offset = transform.pointGeometry.convert(offset); + setOffset(offset ) { + this._offset = ref_properties.pointGeometry.convert(offset); this._update(); return this; } _onMove(e ) { + const map = this._map; + if (!map) return; + if (!this._isDragging) { - const clickTolerance = this._clickTolerance || this._map._clickTolerance; + const clickTolerance = this._clickTolerance || map._clickTolerance; this._isDragging = e.point.dist(this._pointerdownPos) >= clickTolerance; } if (!this._isDragging) return; this._pos = e.point.sub(this._positionDelta); - this._lngLat = this._map.unproject(this._pos); + this._lngLat = map.unproject(this._pos); this.setLngLat(this._lngLat); // suppress click event so that popups don't toggle on drag this._element.style.pointerEvents = 'none'; @@ -70808,7 +74450,7 @@ class Marker extends transform.Evented { * @type {Object} * @property {Marker} marker The object that is being dragged. */ - this.fire(new transform.Event('dragstart')); + this.fire(new ref_properties.Event('dragstart')); } /** @@ -70820,7 +74462,7 @@ class Marker extends transform.Evented { * @type {Object} * @property {Marker} marker The object that is being dragged. */ - this.fire(new transform.Event('drag')); + this.fire(new ref_properties.Event('drag')); } _onUp() { @@ -70829,8 +74471,12 @@ class Marker extends transform.Evented { this._positionDelta = null; this._pointerdownPos = null; this._isDragging = false; - this._map.off('mousemove', this._onMove); - this._map.off('touchmove', this._onMove); + + const map = this._map; + if (map) { + map.off('mousemove', this._onMove); + map.off('touchmove', this._onMove); + } // only fire dragend if it was preceded by at least one drag event if (this._state === 'active') { @@ -70843,13 +74489,16 @@ class Marker extends transform.Evented { * @type {Object} * @property {Marker} marker The object that was dragged. */ - this.fire(new transform.Event('dragend')); + this.fire(new ref_properties.Event('dragend')); } this._state = 'inactive'; } _addDragHandler(e ) { + const map = this._map; + if (!map) return; + if (this._element.contains((e.originalEvent.target ))) { e.preventDefault(); @@ -70859,15 +74508,15 @@ class Marker extends transform.Evented { // to calculate the new marker position. // If we don't do this, the marker 'jumps' to the click position // creating a jarring UX effect. - this._positionDelta = e.point.sub(this._pos).add(this._transformedOffset()); + this._positionDelta = e.point.sub(this._pos); this._pointerdownPos = e.point; this._state = 'pending'; - this._map.on('mousemove', this._onMove); - this._map.on('touchmove', this._onMove); - this._map.once('mouseup', this._onUp); - this._map.once('touchend', this._onUp); + map.on('mousemove', this._onMove); + map.on('touchmove', this._onMove); + map.once('mouseup', this._onUp); + map.once('touchend', this._onUp); } } @@ -70879,18 +74528,19 @@ class Marker extends transform.Evented { * @example * marker.setDraggable(true); */ - setDraggable(shouldBeDraggable ) { + setDraggable(shouldBeDraggable ) { this._draggable = !!shouldBeDraggable; // convert possible undefined value to false // handle case where map may not exist yet // for example, when setDraggable is called before addTo - if (this._map) { + const map = this._map; + if (map) { if (shouldBeDraggable) { - this._map.on('mousedown', this._addDragHandler); - this._map.on('touchstart', this._addDragHandler); + map.on('mousedown', this._addDragHandler); + map.on('touchstart', this._addDragHandler); } else { - this._map.off('mousedown', this._addDragHandler); - this._map.off('touchstart', this._addDragHandler); + map.off('mousedown', this._addDragHandler); + map.off('touchstart', this._addDragHandler); } } @@ -70904,7 +74554,7 @@ class Marker extends transform.Evented { * @example * const isMarkerDraggable = marker.isDraggable(); */ - isDraggable() { + isDraggable() { return this._draggable; } @@ -70916,7 +74566,7 @@ class Marker extends transform.Evented { * @example * marker.setRotation(45); */ - setRotation(rotation ) { + setRotation(rotation ) { this._rotation = rotation || 0; this._update(); return this; @@ -70929,7 +74579,7 @@ class Marker extends transform.Evented { * @example * const rotation = marker.getRotation(); */ - getRotation() { + getRotation() { return this._rotation; } @@ -70941,7 +74591,7 @@ class Marker extends transform.Evented { * @example * marker.setRotationAlignment('viewport'); */ - setRotationAlignment(alignment ) { + setRotationAlignment(alignment ) { this._rotationAlignment = alignment || 'auto'; this._update(); return this; @@ -70954,8 +74604,8 @@ class Marker extends transform.Evented { * @example * const alignment = marker.getRotationAlignment(); */ - getRotationAlignment() { - return this._rotationAlignment; + getRotationAlignment() { + return this._rotationAlignment === `auto` ? 'viewport' : this._rotationAlignment; } /** @@ -70966,21 +74616,21 @@ class Marker extends transform.Evented { * @example * marker.setPitchAlignment('map'); */ - setPitchAlignment(alignment ) { - this._pitchAlignment = alignment && alignment !== 'auto' ? alignment : this._rotationAlignment; + setPitchAlignment(alignment ) { + this._pitchAlignment = alignment || 'auto'; this._update(); return this; } /** - * Returns the current `pitchAlignment` property of the marker. + * Returns the current `pitchAlignment` behavior of the marker. * - * @returns {string} The current pitch alignment of the marker in degrees. + * @returns {string} The current pitch alignment of the marker. * @example * const alignment = marker.getPitchAlignment(); */ - getPitchAlignment() { - return this._pitchAlignment; + getPitchAlignment() { + return this._pitchAlignment === `auto` ? this.getRotationAlignment() : this._pitchAlignment; } } @@ -71012,7 +74662,7 @@ class EasedVariable { if (timeStamp <= this._startTime) return this._start; if (timeStamp >= this._endTime) return this._end; - const t = transform.easeCubicInOut((timeStamp - this._startTime) / (this._endTime - this._startTime)); + const t = ref_properties.easeCubicInOut((timeStamp - this._startTime) / (this._endTime - this._startTime)); return this._start * (1 - t) + this._end * t; } @@ -71066,21 +74716,16 @@ const defaultLocale = { 'GeolocateControl.FindMyLocation': 'Find my location', 'GeolocateControl.LocationNotAvailable': 'Location not available', 'LogoControl.Title': 'Mapbox logo', + 'Map.Title': 'Map', 'NavigationControl.ResetBearing': 'Reset bearing to north', 'NavigationControl.ZoomIn': 'Zoom in', 'NavigationControl.ZoomOut': 'Zoom out', - 'ScaleControl.Feet': 'ft', - 'ScaleControl.Meters': 'm', - 'ScaleControl.Kilometers': 'km', - 'ScaleControl.Miles': 'mi', - 'ScaleControl.NauticalMiles': 'nm', 'ScrollZoomBlocker.CtrlMessage': 'Use ctrl + scroll to zoom the map', 'ScrollZoomBlocker.CmdMessage': 'Use ⌘ + scroll to zoom the map', 'TouchPanBlocker.Message': 'Use two fingers to move the map' }; // -const {HTMLImageElement, HTMLElement, ImageBitmap} = transform.window; @@ -71091,17 +74736,24 @@ const {HTMLImageElement, HTMLElement, ImageBitmap} = transform.window; + + + + + + - + /* eslint-disable no-use-before-define */ + /* eslint-enable no-use-before-define */ @@ -71143,12 +74795,15 @@ const AVERAGE_ELEVATION_CHANGE_THRESHOLD = 1e-4; // meters + - + + + const defaultMinZoom = -2; @@ -71158,7 +74813,7 @@ const defaultMaxZoom = 22; const defaultMinPitch = 0; const defaultMaxPitch = 85; -const defaultOptions$1 = { +const defaultOptions$4 = { center: [0, 0], zoom: 0, bearing: 0, @@ -71194,6 +74849,7 @@ const defaultOptions$1 = { optimizeForTerrain: true, renderWorldCopies: true, refreshExpiredTiles: true, + minTileCacheSize: null, maxTileCacheSize: null, localIdeographFontFamily: 'sans-serif', localFontFamily: null, @@ -71274,12 +74930,23 @@ const defaultOptions$1 = { * @param {number} [options.pitch=0] The initial [pitch](https://docs.mapbox.com/help/glossary/camera#pitch) (tilt) of the map, measured in degrees away from the plane of the screen (0-85). 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 {LngLatBoundsLike} [options.bounds=null] The initial bounds of the map. If `bounds` is specified, it overrides `center` and `zoom` constructor options. * @param {Object} [options.fitBoundsOptions] A {@link Map#fitBounds} options object to use _only_ when fitting the initial `bounds` provided above. + * @param {string} [options.language=null] A string representing the language used for the map's data and UI components. Languages can only be set on Mapbox vector tile sources. + * By default, GL JS will not set a language so that the language of Mapbox tiles will be determined by the vector tile source's TileJSON. + * Valid language strings must be a [BCP-47 language code](https://en.wikipedia.org/wiki/IETF_language_tag#List_of_subtags). Unsupported BCP-47 codes will not include any translations. Invalid codes will result in an recoverable error. + * If a label has no translation for the selected language, it will display in the label's local language. + * If option is set to `auto`, GL JS will select a user's preferred language as determined by the browser's `window.navigator.language` property. + * If the `locale` property is not set separately, this language will also be used to localize the UI for supported languages. + * @param {string} [options.worldview] Sets the map's worldview. A worldview determines the way that certain disputed boundaries + * are rendered. By default, GL JS will not set a worldview so that the worldview of Mapbox tiles will be determined by the vector tile source's TileJSON. + * Valid worldview strings must be an [ISO alpha-2 country code](https://en.wikipedia.org/wiki/ISO_3166-1#Current_codes). Unsupported + * ISO alpha-2 codes will fall back to the TileJSON's default worldview. Invalid codes will result in a recoverable error. * @param {boolean} [options.optimizeForTerrain=true] With terrain on, if `true`, the map will render for performance priority, which may lead to layer reordering allowing to maximize performance (layers that are draped over terrain will be drawn first, including fill, line, background, hillshade and raster). Otherwise, if set to `false`, the map will always be drawn for layer order priority. * @param {boolean} [options.renderWorldCopies=true] If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`: * - When the map is zoomed out far enough that a single representation of the world does not fill the map's entire * container, there will be blank space beyond 180 and -180 degrees longitude. * - Features that cross 180 and -180 degrees longitude will be cut in two (with one portion on the right edge of the * map and the other on the left edge of the map) at every zoom level. + * @param {number} [options.minTileCacheSize=null] The minimum number of tiles stored in the tile cache for a given source. 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. If omitted, the cache will be dynamically sized based on the current viewport. * @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='sans-serif'] Defines a CSS font-family for locally overriding generation of glyphs in the 'CJK Unified Ideographs', 'Hiragana', 'Katakana', 'Hangul Syllables' and 'CJK Symbols and Punctuation' ranges. * In these ranges, font settings from the map's style will be ignored, except for font-weight keywords (light/regular/medium/bold). @@ -71295,13 +74962,14 @@ const defaultOptions$1 = { * @param {boolean} [options.crossSourceCollisions=true] If `true`, symbols from multiple sources can collide with each other during collision detection. If `false`, collision detection is run separately for the symbols in each source. * @param {string} [options.accessToken=null] If specified, map will use this [token](https://docs.mapbox.com/help/glossary/access-token/) instead of the one defined in `mapboxgl.accessToken`. * @param {Object} [options.locale=null] A patch to apply to the default localization table for UI strings such as control tooltips. The `locale` object maps namespaced UI string IDs to translated strings in the target language; - * see `src/ui/default_locale.js` for an example with all supported string IDs. The object may specify all UI strings (thereby adding support for a new translation) or only a subset of strings (thereby patching the default translation table). + * see [`src/ui/default_locale.js`](https://github.com/mapbox/mapbox-gl-js/blob/main/src/ui/default_locale.js) for an example with all supported string IDs. The object may specify all UI strings (thereby adding support for a new translation) or only a subset of strings (thereby patching the default translation table). * @param {boolean} [options.testMode=false] Silences errors and warnings generated due to an invalid accessToken, useful when using the library to write unit tests. - * @param {ProjectionSpecification} [options.projection='mercator'] The [projection](https://docs.mapbox.com/help/glossary/projection/) the map should be rendered in. + * @param {ProjectionSpecification} [options.projection='mercator'] The [projection](https://docs.mapbox.com/mapbox-gl-js/style-spec/projection/) the map should be rendered in. * Supported projections are: * * [Albers](https://en.wikipedia.org/wiki/Albers_projection) equal-area conic projection as `albers` * * [Equal Earth](https://en.wikipedia.org/wiki/Equal_Earth_projection) equal-area pseudocylindrical projection as `equalEarth` * * [Equirectangular](https://en.wikipedia.org/wiki/Equirectangular_projection) (Plate Carrée/WGS84) as `equirectangular` + * * 3d Globe as `globe` * * [Lambert Conformal Conic](https://en.wikipedia.org/wiki/Lambert_conformal_conic_projection) as `lambertConformalConic` * * [Mercator](https://en.wikipedia.org/wiki/Mercator_projection) cylindrical map projection as `mercator` * * [Natural Earth](https://en.wikipedia.org/wiki/Natural_Earth_projection) pseudocylindrical map projection as `naturalEarth` @@ -71332,7 +75000,7 @@ const defaultOptions$1 = { class Map extends Camera { - + @@ -71357,8 +75025,7 @@ class Map extends Camera { - // accounts for placement finishing as well - + // accounts for placement finishing as well @@ -71373,7 +75040,6 @@ class Map extends Camera { - @@ -71390,10 +75056,18 @@ class Map extends Camera { + - - + + + + + // `_explicitProjection represents projection as set by a call to map.setProjection() + // For the actual projection displayed, use `transform.projection`. + // (The two diverge above the transition zoom threshold in Globe view or when _explicitProjection === null + // a null _explicitProjection indicates the map defaults to first the stylesheet projection if present, then Mercator) + /** @section {Interaction handlers} */ @@ -71447,9 +75121,9 @@ class Map extends Camera { constructor(options ) { - transform.PerformanceUtils.mark(transform.PerformanceMarkers.create); + ref_properties.PerformanceUtils.mark(ref_properties.PerformanceMarkers.create); - options = transform.extend({}, defaultOptions$1, options); + options = ref_properties.extend({}, defaultOptions$4, options); if (options.minZoom != null && options.maxZoom != null && options.minZoom > options.maxZoom) { throw new Error(`maxZoom must be greater than or equal to minZoom`); @@ -71467,8 +75141,14 @@ class Map extends Camera { throw new Error(`maxPitch must be less than or equal to ${defaultMaxPitch}`); } - const transform$1 = new transform.Transform(options.minZoom, options.maxZoom, options.minPitch, options.maxPitch, options.renderWorldCopies); - super(transform$1, options); + // disable antialias with OS/iOS 15.4 and 15.5 due to rendering bug + if (options.antialias && ref_properties.isSafariWithAntialiasingBug(ref_properties.window)) { + options.antialias = false; + ref_properties.warnOnce('Antialiasing is disabled for this WebGL context to avoid browser bug: https://github.com/mapbox/mapbox-gl-js/issues/11609'); + } + + const transform = new Transform(options.minZoom, options.maxZoom, options.minPitch, options.maxPitch, options.renderWorldCopies); + super(transform, options); this._interactive = options.interactive; this._minTileCacheSize = options.minTileCacheSize; @@ -71485,44 +75165,49 @@ class Map extends Camera { this._crossFadingFactor = 1; this._collectResourceTiming = options.collectResourceTiming; this._optimizeForTerrain = options.optimizeForTerrain; + this._language = options.language === 'auto' ? ref_properties.window.navigator.language : options.language; + this._worldview = options.worldview; this._renderTaskQueue = new TaskQueue(); this._domRenderTaskQueue = new TaskQueue(); this._controls = []; this._markers = []; - this._mapId = transform.uniqueId(); - this._locale = transform.extend({}, defaultLocale, options.locale); + this._mapId = ref_properties.uniqueId(); + this._locale = ref_properties.extend({}, defaultLocale, options.locale); this._clickTolerance = options.clickTolerance; this._cooperativeGestures = options.cooperativeGestures; this._containerWidth = 0; this._containerHeight = 0; this._averageElevationLastSampledAt = -Infinity; + this._averageElevationExaggeration = 0; this._averageElevation = new EasedVariable(0); - this._requestManager = new transform.RequestManager(options.transformRequest, options.accessToken, options.testMode); + this._explicitProjection = null; // Fallback to stylesheet by default + + this._requestManager = new ref_properties.RequestManager(options.transformRequest, options.accessToken, options.testMode); this._silenceAuthErrors = !!options.testMode; if (typeof options.container === 'string') { - this._container = transform.window.document.getElementById(options.container); + this._container = ref_properties.window.document.getElementById(options.container); if (!this._container) { throw new Error(`Container '${options.container}' not found.`); } - } else if (options.container instanceof HTMLElement) { + } else if (options.container instanceof ref_properties.window.HTMLElement) { this._container = options.container; } else { throw new Error(`Invalid type: 'container' must be a String or HTMLElement.`); } if (this._container.childNodes.length > 0) { - transform.warnOnce(`The map container element should be empty, otherwise the map's interactivity will be negatively impacted. If you want to display a message when WebGL is not supported, use the Mapbox GL Supported plugin instead.`); + ref_properties.warnOnce(`The map container element should be empty, otherwise the map's interactivity will be negatively impacted. If you want to display a message when WebGL is not supported, use the Mapbox GL Supported plugin instead.`); } if (options.maxBounds) { this.setMaxBounds(options.maxBounds); } - transform.bindAll([ + ref_properties.bindAll([ '_onWindowOnline', '_onWindowResize', '_onMapScroll', @@ -71540,11 +75225,11 @@ class Map extends Camera { this.on('moveend', () => this._update(false)); this.on('zoom', () => this._update(true)); - if (typeof transform.window !== 'undefined') { - transform.window.addEventListener('online', this._onWindowOnline, false); - transform.window.addEventListener('resize', this._onWindowResize, false); - transform.window.addEventListener('orientationchange', this._onWindowResize, false); - transform.window.addEventListener('webkitfullscreenchange', this._onWindowResize, false); + if (typeof ref_properties.window !== 'undefined') { + ref_properties.window.addEventListener('online', this._onWindowOnline, false); + ref_properties.window.addEventListener('resize', this._onWindowResize, false); + ref_properties.window.addEventListener('orientationchange', this._onWindowResize, false); + ref_properties.window.addEventListener('webkitfullscreenchange', this._onWindowResize, false); } this.handlers = new HandlerManager(this, options); @@ -71573,7 +75258,7 @@ class Map extends Camera { if (options.bounds) { this.resize(); - this.fitBounds(options.bounds, transform.extend({}, options.fitBoundsOptions, {duration: 0})); + this.fitBounds(options.bounds, ref_properties.extend({}, options.fitBoundsOptions, {duration: 0})); } } @@ -71592,10 +75277,10 @@ class Map extends Camera { }); this.on('data', (event ) => { this._update(event.dataType === 'style'); - this.fire(new transform.Event(`${event.dataType}data`, event)); + this.fire(new ref_properties.Event(`${event.dataType}data`, event)); }); this.on('dataloading', (event ) => { - this.fire(new transform.Event(`${event.dataType}dataloading`, event)); + this.fire(new ref_properties.Event(`${event.dataType}dataloading`, event)); }); } @@ -71605,7 +75290,7 @@ class Map extends Camera { * @private * @returns {number} */ - _getMapId() { + _getMapId() { return this._mapId; } @@ -71623,7 +75308,7 @@ class Map extends Camera { * map.addControl(new mapboxgl.NavigationControl()); * @see [Example: Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/) */ - addControl(control , position ) { + addControl(control , position ) { if (position === undefined) { if (control.getDefaultPosition) { position = control.getDefaultPosition(); @@ -71632,7 +75317,7 @@ class Map extends Camera { } } if (!control || !control.onAdd) { - return this.fire(new transform.ErrorEvent(new Error( + return this.fire(new ref_properties.ErrorEvent(new Error( 'Invalid argument to map.addControl(). Argument must be a control with onAdd and onRemove methods.'))); } const controlElement = control.onAdd(this); @@ -71660,9 +75345,9 @@ class Map extends Camera { * // Remove zoom and rotation controls from the map. * map.removeControl(navigation); */ - removeControl(control ) { + removeControl(control ) { if (!control || !control.onRemove) { - return this.fire(new transform.ErrorEvent(new Error( + return this.fire(new ref_properties.ErrorEvent(new Error( 'Invalid argument to map.removeControl(). Argument must be a control with onAdd and onRemove methods.'))); } const ci = this._controls.indexOf(control); @@ -71685,7 +75370,7 @@ class Map extends Camera { * const added = map.hasControl(navigation); * // added === true */ - hasControl(control ) { + hasControl(control ) { return this._controls.indexOf(control) > -1; } @@ -71696,7 +75381,7 @@ class Map extends Camera { * @example * const container = map.getContainer(); */ - getContainer() { + getContainer() { return this._container; } @@ -71715,7 +75400,7 @@ class Map extends Camera { * @see [Example: Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) * @see [Example: Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) */ - getCanvasContainer() { + getCanvasContainer() { return this._canvasContainer; } @@ -71729,7 +75414,7 @@ class Map extends Camera { * @see [Example: Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) * @see [Example: Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/) */ - getCanvas() { + getCanvas() { return this._canvas; } @@ -71753,7 +75438,7 @@ class Map extends Camera { * const mapDiv = document.getElementById('map'); * if (mapDiv.style.visibility === true) map.resize(); */ - resize(eventData ) { + resize(eventData ) { this._updateContainerDimensions(); // do nothing if container remained the same size @@ -71766,13 +75451,13 @@ class Map extends Camera { const fireMoving = !this._moving; if (fireMoving) { - this.fire(new transform.Event('movestart', eventData)) - .fire(new transform.Event('move', eventData)); + this.fire(new ref_properties.Event('movestart', eventData)) + .fire(new ref_properties.Event('move', eventData)); } - this.fire(new transform.Event('resize', eventData)); + this.fire(new ref_properties.Event('resize', eventData)); - if (fireMoving) this.fire(new transform.Event('moveend', eventData)); + if (fireMoving) this.fire(new ref_properties.Event('moveend', eventData)); return this; } @@ -71781,12 +75466,16 @@ class Map extends Camera { * Returns the map's geographical bounds. When the bearing or pitch is non-zero, the visible region is not * an axis-aligned rectangle, and the result is the smallest bounds that encompasses the visible region. * If a padding is set on the map, the bounds returned are for the inset. + * This function isn't supported with globe projection. * * @returns {LngLatBounds} The geographical bounds of the map as {@link LngLatBounds}. * @example * const bounds = map.getBounds(); */ - getBounds() { + getBounds() { + if (this.transform.projection.name === 'globe') { + ref_properties.warnOnce('Globe projection does not support getBounds API, this API may behave unexpectedly."'); + } return this.transform.getBounds(); } @@ -71823,8 +75512,8 @@ class Map extends Camera { * // Set the map's max bounds. * map.setMaxBounds(bounds); */ - setMaxBounds(bounds ) { - this.transform.setMaxBounds(transform.LngLatBounds.convert(bounds)); + setMaxBounds(bounds ) { + this.transform.setMaxBounds(ref_properties.LngLatBounds.convert(bounds)); return this._update(); } @@ -71844,7 +75533,7 @@ class Map extends Camera { * @example * map.setMinZoom(12.25); */ - setMinZoom(minZoom ) { + setMinZoom(minZoom ) { minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom; @@ -71855,9 +75544,9 @@ class Map extends Camera { if (this.getZoom() < minZoom) { this.setZoom(minZoom); } else { - this.fire(new transform.Event('zoomstart')) - .fire(new transform.Event('zoom')) - .fire(new transform.Event('zoomend')); + this.fire(new ref_properties.Event('zoomstart')) + .fire(new ref_properties.Event('zoom')) + .fire(new ref_properties.Event('zoomend')); } return this; @@ -71872,7 +75561,7 @@ class Map extends Camera { * @example * const minZoom = map.getMinZoom(); */ - getMinZoom() { return this.transform.minZoom; } + getMinZoom() { return this.transform.minZoom; } /** * Sets or clears the map's maximum zoom level. @@ -71885,7 +75574,7 @@ class Map extends Camera { * @example * map.setMaxZoom(18.75); */ - setMaxZoom(maxZoom ) { + setMaxZoom(maxZoom ) { maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom; @@ -71896,9 +75585,9 @@ class Map extends Camera { if (this.getZoom() > maxZoom) { this.setZoom(maxZoom); } else { - this.fire(new transform.Event('zoomstart')) - .fire(new transform.Event('zoom')) - .fire(new transform.Event('zoomend')); + this.fire(new ref_properties.Event('zoomstart')) + .fire(new ref_properties.Event('zoom')) + .fire(new ref_properties.Event('zoomend')); } return this; @@ -71913,7 +75602,7 @@ class Map extends Camera { * @example * const maxZoom = map.getMaxZoom(); */ - getMaxZoom() { return this.transform.maxZoom; } + getMaxZoom() { return this.transform.maxZoom; } /** * Sets or clears the map's minimum pitch. @@ -71925,7 +75614,7 @@ class Map extends Camera { * @example * map.setMinPitch(5); */ - setMinPitch(minPitch ) { + setMinPitch(minPitch ) { minPitch = minPitch === null || minPitch === undefined ? defaultMinPitch : minPitch; @@ -71940,9 +75629,9 @@ class Map extends Camera { if (this.getPitch() < minPitch) { this.setPitch(minPitch); } else { - this.fire(new transform.Event('pitchstart')) - .fire(new transform.Event('pitch')) - .fire(new transform.Event('pitchend')); + this.fire(new ref_properties.Event('pitchstart')) + .fire(new ref_properties.Event('pitch')) + .fire(new ref_properties.Event('pitchend')); } return this; @@ -71957,7 +75646,7 @@ class Map extends Camera { * @example * const minPitch = map.getMinPitch(); */ - getMinPitch() { return this.transform.minPitch; } + getMinPitch() { return this.transform.minPitch; } /** * Sets or clears the map's maximum pitch. @@ -71970,7 +75659,7 @@ class Map extends Camera { * @example * map.setMaxPitch(70); */ - setMaxPitch(maxPitch ) { + setMaxPitch(maxPitch ) { maxPitch = maxPitch === null || maxPitch === undefined ? defaultMaxPitch : maxPitch; @@ -71985,14 +75674,14 @@ class Map extends Camera { if (this.getPitch() > maxPitch) { this.setPitch(maxPitch); } else { - this.fire(new transform.Event('pitchstart')) - .fire(new transform.Event('pitch')) - .fire(new transform.Event('pitchend')); + this.fire(new ref_properties.Event('pitchstart')) + .fire(new ref_properties.Event('pitch')) + .fire(new ref_properties.Event('pitchend')); } return this; - } else throw new Error(`maxPitch must be greater than the current minPitch`); + } else throw new Error(`maxPitch must be greater than or equal to minPitch`); } /** @@ -72002,7 +75691,7 @@ class Map extends Camera { * @example * const maxPitch = map.getMaxPitch(); */ - getMaxPitch() { return this.transform.maxPitch; } + getMaxPitch() { return this.transform.maxPitch; } /** * Returns the state of `renderWorldCopies`. If `true`, multiple copies of the world will be rendered side by side beyond -180 and 180 degrees longitude. If set to `false`: @@ -72016,7 +75705,7 @@ class Map extends Camera { * const worldCopiesRendered = map.getRenderWorldCopies(); * @see [Example: Render world copies](https://docs.mapbox.com/mapbox-gl-js/example/render-world-copies/) */ - getRenderWorldCopies() { return this.transform.renderWorldCopies; } + getRenderWorldCopies() { return this.transform.renderWorldCopies; } /** * Sets the state of `renderWorldCopies`. @@ -72033,11 +75722,90 @@ class Map extends Camera { * map.setRenderWorldCopies(true); * @see [Example: Render world copies](https://docs.mapbox.com/mapbox-gl-js/example/render-world-copies/) */ - setRenderWorldCopies(renderWorldCopies ) { + setRenderWorldCopies(renderWorldCopies ) { this.transform.renderWorldCopies = renderWorldCopies; return this._update(); } + /** + * Returns the code for the map's language which is used for translating map labels. + * + * @private + * @returns {string} Returns the map's language code. + * @example + * const language = map.getLanguage(); + */ + getLanguage() { + return this._language; + } + + /** + * Sets the map's language. + * + * @private + * @param {string} language A string representing the desired language. `undefined` or `null` will remove the current map language and reset the map to the default language as determined by `window.navigator.language`. + * @returns {Map} Returns itself to allow for method chaining. + * @example + * map.setLanguage('es'); + * + * @example + * map.setLanguage('auto'); + */ + setLanguage(language ) { + this._language = language === 'auto' ? ref_properties.window.navigator.language : language; + + if (this.style) { + for (const id in this.style._sourceCaches) { + const source = this.style._sourceCaches[id]._source; + if (source._setLanguage) { + source._setLanguage(this._language); + } + } + } + + for (const control of this._controls) { + if (control._setLanguage) { + control._setLanguage(this._language); + } + } + + return this; + } + + /** + * Returns the code for the map's worldview. + * + * @private + * @returns {string} Returns the map's worldview code. + * @example + * const worldview = map.getWorldview(); + */ + getWorldview() { + return this._worldview; + } + + /** + * Sets the map's worldview. + * + * @private + * @param {string} worldview A string representing the desired worldview. `undefined` or `null` will cause the map to fall back to the TileJSON's default worldview. + * @returns {Map} Returns itself to allow for method chaining. + * @example + * map.setWorldView('JP'); + */ + setWorldview(worldview ) { + this._worldview = worldview; + if (this.style) { + for (const id in this.style._sourceCaches) { + const source = this.style._sourceCaches[id]._source; + if (source._setWorldview) { + source._setWorldview(worldview); + } + } + } + return this; + } + /** @section {Point conversion} */ /** @@ -72047,10 +75815,27 @@ class Map extends Camera { * @example * const projection = map.getProjection(); */ - getProjection() { - return this.transform.getProjection(); + getProjection() { + if (this._explicitProjection) { + return this._explicitProjection; + } + if (this.style && this.style.stylesheet && this.style.stylesheet.projection) { + return this.style.stylesheet.projection; + } + return {name: "mercator", center:[0, 0]}; } + /** + * Returns true if map [projection](https://docs.mapbox.com/mapbox-gl-js/style-spec/projection/) has been set to globe AND the map is at a low enough zoom level that globe view is enabled. + * @private + * @returns {boolean} Returns `globe-is-active` boolean. + * @example + * if (map._usingGlobe()) { + * // do globe things here + * } + */ + _usingGlobe() { return this.transform.projection.name === 'globe'; } + /** * Sets the map's projection. If called with `null` or `undefined`, the map will reset to Mercator. * @@ -72067,14 +75852,56 @@ class Map extends Camera { * @see [Example: Display a web map using an alternate projection](https://docs.mapbox.com/mapbox-gl-js/example/map-projection/) * @see [Example: Use different map projections for web maps](https://docs.mapbox.com/mapbox-gl-js/example/projections/) */ - setProjection(projection ) { + setProjection(projection ) { this._lazyInitEmptyStyle(); - if (typeof projection === 'string') { + if (!projection) { + projection = null; + } else if (typeof projection === 'string') { projection = (({name: projection} ) ); } - this._runtimeProjection = projection; - this.style.updateProjection(); - this._transitionFromGlobe = false; + return this._updateProjection(projection); + } + + _updateProjection(explicitProjection ) { + const prevProjection = this.getProjection(); + if (explicitProjection === null) { + this._explicitProjection = null; + } + const projection = explicitProjection || this.getProjection(); + + let projectionHasChanged; + // At high zoom on globe, set transform projection to Mercator while _explicitProjection stays globe. + if (projection && projection.name === 'globe' && this.transform.zoom >= ref_properties.GLOBE_ZOOM_THRESHOLD_MAX) { + projectionHasChanged = this.transform.setProjection({name: 'mercator'}); + this.transform.mercatorFromTransition = true; + } else { + projectionHasChanged = this.transform.setProjection(projection); + this.transform.mercatorFromTransition = false; + } + + // When called through setProjection, update _explicitProjection + if (explicitProjection) { + this._explicitProjection = (explicitProjection.name === "globe" ? + {name:'globe', center:[0, 0]} : + this.transform.getProjection()); + } + + this.style.applyProjectionUpdate(); + + if (projectionHasChanged) { + // If a zoom transition on globe + if (prevProjection.name === 'globe' && this.getProjection().name === 'globe') { + this.style._forceSymbolLayerUpdate(); + } else { + // If a switch between different projections + this.painter.clearBackgroundTiles(); + for (const id in this.style._sourceCaches) { + this.style._sourceCaches[id].clearTiles(); + } + } + this._update(true); + } + return this; } @@ -72092,8 +75919,8 @@ class Map extends Camera { * const coordinate = [-122.420679, 37.772537]; * const point = map.project(coordinate); */ - project(lnglat ) { - return this.transform.locationPoint3D(transform.LngLat.convert(lnglat)); + project(lnglat ) { + return this.transform.locationPoint3D(ref_properties.LngLat.convert(lnglat)); } /** @@ -72110,8 +75937,8 @@ class Map extends Camera { * const coordinate = map.unproject(e.point); * }); */ - unproject(point ) { - return this.transform.pointLocation3D(transform.pointGeometry.convert(point)); + unproject(point ) { + return this.transform.pointLocation3D(ref_properties.pointGeometry.convert(point)); } /** @section {Movement state} */ @@ -72124,7 +75951,7 @@ class Map extends Camera { * const isMoving = map.isMoving(); */ isMoving() { - return this._moving || this.handlers && this.handlers.isMoving(); + return this._moving || (this.handlers && this.handlers.isMoving()) || false; } /** @@ -72135,7 +75962,7 @@ class Map extends Camera { * const isZooming = map.isZooming(); */ isZooming() { - return this._zooming || this.handlers && this.handlers.isZooming(); + return this._zooming || (this.handlers && this.handlers.isZooming()) || false; } /** @@ -72146,10 +75973,10 @@ class Map extends Camera { * map.isRotating(); */ isRotating() { - return this._rotating || this.handlers && this.handlers.isRotating(); + return this._rotating || (this.handlers && this.handlers.isRotating()) || false; } - _createDelegatedListener(type , layers , listener ) { + _createDelegatedListener(type , layers , listener ) { if (type === 'mouseenter' || type === 'mouseover') { let mousein = false; const mousemove = (e) => { @@ -72199,7 +76026,7 @@ class Map extends Camera { } }; - return {layers: new Set(layers), listener, delegates: {[type]: delegate}}; + return {layers: new Set(layers), listener, delegates: {[(type )]: delegate}}; } } @@ -72317,7 +76144,7 @@ class Map extends Camera { * @see [Example: Create a hover effect](https://docs.mapbox.com/mapbox-gl-js/example/hover-styles/) * @see [Example: Display popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/) */ - on(type , layerIds , listener ) { + on(type , layerIds , listener ) { if (listener === undefined) { return super.on(type, layerIds); } @@ -72377,7 +76204,7 @@ class Map extends Camera { * @see [Example: Animate the camera around a point with 3D terrain](https://docs.mapbox.com/mapbox-gl-js/example/free-camera-point/) * @see [Example: Play map locations as a slideshow](https://docs.mapbox.com/mapbox-gl-js/example/playback-locations/) */ - once(type , layerIds , listener ) { + once(type , layerIds , listener ) { if (listener === undefined) { return super.once(type, layerIds); @@ -72420,7 +76247,7 @@ class Map extends Camera { * }); * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/) */ - off(type , layerIds , listener ) { + off(type , layerIds , listener ) { if (listener === undefined) { return super.off(type, layerIds); } @@ -72541,7 +76368,7 @@ class Map extends Camera { * @see [Example: Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) * @see [Example: Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) */ - queryRenderedFeatures(geometry , options ) { + queryRenderedFeatures(geometry , options ) { // The first parameter can be omitted entirely, making this effectively an overloaded method // with two signatures: // @@ -72555,7 +76382,7 @@ class Map extends Camera { return []; } - if (options === undefined && geometry !== undefined && !(geometry instanceof transform.pointGeometry) && !Array.isArray(geometry)) { + if (options === undefined && geometry !== undefined && !(geometry instanceof ref_properties.pointGeometry) && !Array.isArray(geometry)) { options = (geometry ); geometry = undefined; } @@ -72603,7 +76430,7 @@ class Map extends Camera { * * @see [Example: Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/) */ - querySourceFeatures(sourceId , parameters ) { + querySourceFeatures(sourceId , parameters ) { return this.style.querySourceFeatures(sourceId, parameters); } @@ -72626,8 +76453,8 @@ class Map extends Camera { queryTerrainElevation(lnglat , options ) { const elevation = this.transform.elevation; if (elevation) { - options = transform.extend({}, {exaggerated: true}, options); - return elevation.getAtPoint(transform.MercatorCoordinate.fromLngLat(lnglat), null, options.exaggerated); + options = ref_properties.extend({}, {exaggerated: true}, options); + return elevation.getAtPoint(ref_properties.MercatorCoordinate.fromLngLat(lnglat), null, options.exaggerated); } return null; } @@ -72660,8 +76487,8 @@ class Map extends Camera { * * @see [Example: Change a map's style](https://www.mapbox.com/mapbox-gl-js/example/setstyle/) */ - setStyle(style , options ) { - options = transform.extend({}, {localIdeographFontFamily: this._localIdeographFontFamily, localFontFamily: this._localFontFamily}, options); + setStyle(style , options ) { + options = ref_properties.extend({}, {localIdeographFontFamily: this._localIdeographFontFamily, localFontFamily: this._localFontFamily}, options); if ((options.diff !== false && options.localIdeographFontFamily === this._localIdeographFontFamily && @@ -72675,7 +76502,7 @@ class Map extends Camera { } } - _getUIString(key ) { + _getUIString(key ) { const str = this._locale[key]; if (str == null) { throw new Error(`Missing UI string '${key}'`); @@ -72684,11 +76511,11 @@ class Map extends Camera { return str; } - _updateStyle(style , options ) { + _updateStyle(style , options ) { if (this.style) { this.style.setEventedParent(null); this.style._remove(); - delete this.style; + this.style = (undefined ); // we lazy-init it so it's never undefined when accessed } if (style) { @@ -72716,10 +76543,10 @@ class Map extends Camera { _diffStyle(style , options ) { if (typeof style === 'string') { const url = this._requestManager.normalizeStyleURL(style); - const request = this._requestManager.transformRequest(url, transform.ResourceType.Style); - transform.getJSON(request, (error , json ) => { + const request = this._requestManager.transformRequest(url, ref_properties.ResourceType.Style); + ref_properties.getJSON(request, (error , json ) => { if (error) { - this.fire(new transform.ErrorEvent(error)); + this.fire(new ref_properties.ErrorEvent(error)); } else if (json) { this._updateDiff(json, options); } @@ -72735,7 +76562,7 @@ class Map extends Camera { this._update(true); } } catch (e) { - transform.warnOnce( + ref_properties.warnOnce( `Unable to perform style diff: ${e.message || e.error || e}. Rebuilding the style from scratch.` ); this._updateStyle(style, options); @@ -72753,7 +76580,7 @@ class Map extends Camera { * }); * */ - getStyle() { + getStyle() { if (this.style) { return this.style.serialize(); } @@ -72767,8 +76594,11 @@ class Map extends Camera { * @example * const styleLoadStatus = map.isStyleLoaded(); */ - isStyleLoaded() { - if (!this.style) return transform.warnOnce('There is no style added to the map.'); + isStyleLoaded() { + if (!this.style) { + ref_properties.warnOnce('There is no style added to the map.'); + return false; + } return this.style.loaded(); } @@ -72806,7 +76636,7 @@ class Map extends Camera { * @see Example: GeoJSON source: [Add live realtime data](https://docs.mapbox.com/mapbox-gl-js/example/live-geojson/) * @see Example: Raster DEM source: [Add hillshading](https://docs.mapbox.com/mapbox-gl-js/example/hillshade/) */ - addSource(id , source ) { + addSource(id , source ) { this._lazyInitEmptyStyle(); this.style.addSource(id, source); return this._update(true); @@ -72821,14 +76651,8 @@ class Map extends Camera { * @example * const sourceLoaded = map.isSourceLoaded('bathymetry-data'); */ - isSourceLoaded(id ) { - const sourceCaches = this.style && this.style._getSourceCaches(id); - if (sourceCaches.length === 0) { - this.fire(new transform.ErrorEvent(new Error(`There is no source with ID '${id}'`))); - return; - } - - return sourceCaches.every(sc => sc.loaded()); + isSourceLoaded(id ) { + return !!this.style && this.style._isSourceCacheLoaded(id); } /** @@ -72840,7 +76664,7 @@ class Map extends Camera { * const tilesLoaded = map.areTilesLoaded(); */ - areTilesLoaded() { + areTilesLoaded() { const sources = this.style && this.style._sourceCaches; for (const id in sources) { const source = sources[id]; @@ -72863,7 +76687,7 @@ class Map extends Camera { */ addSourceType(name , SourceType , callback ) { this._lazyInitEmptyStyle(); - return this.style.addSourceType(name, SourceType, callback); + this.style.addSourceType(name, SourceType, callback); } /** @@ -72874,7 +76698,7 @@ class Map extends Camera { * @example * map.removeSource('bathymetry-data'); */ - removeSource(id ) { + removeSource(id ) { this.style.removeSource(id); this._updateTerrain(); return this._update(true); @@ -72900,7 +76724,7 @@ class Map extends Camera { * @see [Example: Animate a point](https://docs.mapbox.com/mapbox-gl-js/example/animate-point-along-line/) * @see [Example: Add live realtime data](https://docs.mapbox.com/mapbox-gl-js/example/live-geojson/) */ - getSource(id ) { + getSource(id ) { return this.style.getSource(id); } @@ -72957,19 +76781,20 @@ class Map extends Camera { this._lazyInitEmptyStyle(); const version = 0; - if (image instanceof HTMLImageElement || (ImageBitmap && image instanceof ImageBitmap)) { - const {width, height, data} = transform.exported.getImageData(image); - this.style.addImage(id, {data: new transform.RGBAImage({width, height}, data), pixelRatio, stretchX, stretchY, content, sdf, version}); + if (image instanceof ref_properties.window.HTMLImageElement || (ref_properties.window.ImageBitmap && image instanceof ref_properties.window.ImageBitmap)) { + const {width, height, data} = ref_properties.exported.getImageData(image); + this.style.addImage(id, {data: new ref_properties.RGBAImage({width, height}, data), pixelRatio, stretchX, stretchY, content, sdf, version}); } else if (image.width === undefined || image.height === undefined) { - return this.fire(new transform.ErrorEvent(new Error( + this.fire(new ref_properties.ErrorEvent(new Error( 'Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, ' + 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`'))); } else { - const {width, height, data} = image; + const {width, height} = image; const userImage = ((image ) ); + const data = userImage.data; this.style.addImage(id, { - data: new transform.RGBAImage({width, height}, new Uint8Array(data)), + data: new ref_properties.RGBAImage({width, height}, new Uint8Array(data)), pixelRatio, stretchX, stretchY, @@ -72995,37 +76820,48 @@ class Map extends Camera { * or [`line-pattern`](https://docs.mapbox.com/mapbox-gl-js/style-spec/#paint-line-line-pattern). * * @param {string} id The ID of the image. - * @param {HTMLImageElement | ImageBitmap | ImageData | {width: number, height: number, data: (Uint8Array | Uint8ClampedArray)} | StyleImageInterface} image The image as an `HTMLImageElement`, `ImageData`, `ImageBitmap` or object with `width`, `height`, and `data` + * @param {HTMLImageElement | ImageBitmap | ImageData | StyleImageInterface} image The image as an `HTMLImageElement`, [`ImageData`](https://developer.mozilla.org/en-US/docs/Web/API/ImageData), [`ImageBitmap`](https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap) or object with `width`, `height`, and `data` * properties with the same format as `ImageData`. * * @example - * // If an image with the ID 'cat' already exists in the style's sprite, - * // replace that image with a new image, 'other-cat-icon.png'. - * if (map.hasImage('cat')) map.updateImage('cat', './other-cat-icon.png'); + * // Load an image from an external URL. + * map.loadImage('http://placekitten.com/50/50', (error, image) => { + * if (error) throw error; + * // If an image with the ID 'cat' already exists in the style's sprite, + * // replace that image with a new image, 'other-cat-icon.png'. + * if (map.hasImage('cat')) map.updateImage('cat', image); + * }); */ updateImage(id , image ) { const existingImage = this.style.getImage(id); if (!existingImage) { - return this.fire(new transform.ErrorEvent(new Error( + this.fire(new ref_properties.ErrorEvent(new Error( 'The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.'))); + return; } - const imageData = (image instanceof HTMLImageElement || (ImageBitmap && image instanceof ImageBitmap)) ? transform.exported.getImageData(image) : image; - const {width, height, data} = imageData; + const imageData = (image instanceof ref_properties.window.HTMLImageElement || (ref_properties.window.ImageBitmap && image instanceof ref_properties.window.ImageBitmap)) ? ref_properties.exported.getImageData(image) : image; + const {width, height} = imageData; + // Flow can't refine the type enough to exclude ImageBitmap + const data = ((imageData ).data ); if (width === undefined || height === undefined) { - return this.fire(new transform.ErrorEvent(new Error( + this.fire(new ref_properties.ErrorEvent(new Error( 'Invalid arguments to map.updateImage(). The second argument must be an `HTMLImageElement`, `ImageData`, `ImageBitmap`, ' + 'or object with `width`, `height`, and `data` properties with the same format as `ImageData`'))); + return; } if (width !== existingImage.data.width || height !== existingImage.data.height) { - return this.fire(new transform.ErrorEvent(new Error( - 'The width and height of the updated image must be that same as the previous version of the image'))); + this.fire(new ref_properties.ErrorEvent(new Error( + `The width and height of the updated image (${width}, ${height}) + must be that same as the previous version of the image + (${existingImage.data.width}, ${existingImage.data.height})`))); + return; } - const copy = !(image instanceof HTMLImageElement || (ImageBitmap && image instanceof ImageBitmap)); + const copy = !(image instanceof ref_properties.window.HTMLImageElement || (ref_properties.window.ImageBitmap && image instanceof ref_properties.window.ImageBitmap)); existingImage.data.replace(data, copy); this.style.updateImage(id, existingImage); @@ -73046,7 +76882,7 @@ class Map extends Camera { */ hasImage(id ) { if (!id) { - this.fire(new transform.ErrorEvent(new Error('Missing required image id'))); + this.fire(new ref_properties.ErrorEvent(new Error('Missing required image id'))); return false; } @@ -73087,8 +76923,8 @@ class Map extends Camera { * @see [Example: Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/) */ loadImage(url , callback ) { - transform.getImage(this._requestManager.transformRequest(url, transform.ResourceType.Image), (err, img) => { - callback(err, img instanceof HTMLImageElement ? transform.exported.getImageData(img) : img); + ref_properties.getImage(this._requestManager.transformRequest(url, ref_properties.ResourceType.Image), (err, img) => { + callback(err, img instanceof ref_properties.window.HTMLImageElement ? ref_properties.exported.getImageData(img) : img); }); } @@ -73103,7 +76939,7 @@ class Map extends Camera { * const allImages = map.listImages(); * */ - listImages() { + listImages() { return this.style.listImages(); } @@ -73214,11 +77050,13 @@ class Map extends Camera { * // Add the layer before the existing `cities` layer * }, 'cities'); * - * @see [Example: Create and style clusters](https://docs.mapbox.com/mapbox-gl-js/example/cluster/) - * @see [Example: Add a vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/vector-source/) - * @see [Example: Add a WMS source](https://docs.mapbox.com/mapbox-gl-js/example/wms/) + * @see [Example: Select features around a clicked point](https://docs.mapbox.com/mapbox-gl-js/example/queryrenderedfeatures-around-point/) (fill layer) + * @see [Example: Add a new layer below labels](https://docs.mapbox.com/mapbox-gl-js/example/geojson-layer-in-stack/) + * @see [Example: Create and style clusters](https://docs.mapbox.com/mapbox-gl-js/example/cluster/) (circle layer) + * @see [Example: Add a vector tile source](https://docs.mapbox.com/mapbox-gl-js/example/vector-source/) (line layer) + * @see [Example: Add a WMS layer](https://docs.mapbox.com/mapbox-gl-js/example/wms/) (raster layer) */ - addLayer(layer , beforeId ) { + addLayer(layer , beforeId ) { this._lazyInitEmptyStyle(); this.style.addLayer(layer, beforeId); return this._update(true); @@ -73235,7 +77073,7 @@ class Map extends Camera { * // Move a layer with ID 'polygon' before the layer with ID 'country-label'. The `polygon` layer will appear beneath the `country-label` layer on the map. * map.moveLayer('polygon', 'country-label'); */ - moveLayer(id , beforeId ) { + moveLayer(id , beforeId ) { this.style.moveLayer(id, beforeId); return this._update(true); } @@ -73253,7 +77091,7 @@ class Map extends Camera { * // If a layer with ID 'state-data' exists, remove it. * if (map.getLayer('state-data')) map.removeLayer('state-data'); */ - removeLayer(id ) { + removeLayer(id ) { this.style.removeLayer(id); return this._update(true); } @@ -73271,7 +77109,7 @@ class Map extends Camera { * @see [Example: Filter symbols by toggling a list](https://www.mapbox.com/mapbox-gl-js/example/filter-markers/) * @see [Example: Filter symbols by text input](https://www.mapbox.com/mapbox-gl-js/example/filter-markers-by-input/) */ - getLayer(id ) { + getLayer(id ) { return this.style.getLayer(id); } @@ -73295,7 +77133,7 @@ class Map extends Camera { * map.setLayerZoomRange('my-layer', 2, 5); * */ - setLayerZoomRange(layerId , minzoom , maxzoom ) { + setLayerZoomRange(layerId , minzoom , maxzoom ) { this.style.setLayerZoomRange(layerId, minzoom, maxzoom); return this._update(true); } @@ -73333,7 +77171,7 @@ class Map extends Camera { * @see [Example: Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) * @see [Tutorial: Show changes over time](https://docs.mapbox.com/help/tutorials/show-changes-over-time/) */ - setFilter(layerId , filter , options = {}) { + setFilter(layerId , filter , options = {}) { this.style.setFilter(layerId, filter, options); return this._update(true); } @@ -73346,7 +77184,7 @@ class Map extends Camera { * @example * const filter = map.getFilter('myLayer'); */ - getFilter(layerId ) { + getFilter(layerId ) { return this.style.getFilter(layerId); } @@ -73366,7 +77204,7 @@ class Map extends Camera { * @see [Example: Adjust a layer's opacity](https://www.mapbox.com/mapbox-gl-js/example/adjust-layer-opacity/) * @see [Example: Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) */ - setPaintProperty(layerId , name , value , options = {}) { + setPaintProperty(layerId , name , value , options = {}) { this.style.setPaintProperty(layerId, name, value, options); return this._update(true); } @@ -73380,7 +77218,7 @@ class Map extends Camera { * @example * const paintProperty = map.getPaintProperty('mySymbolLayer', 'icon-color'); */ - getPaintProperty(layerId , name ) { + getPaintProperty(layerId , name ) { return this.style.getPaintProperty(layerId, name); } @@ -73397,7 +77235,7 @@ class Map extends Camera { * map.setLayoutProperty('my-layer', 'visibility', 'none'); * @see [Example: Show and hide layers](https://docs.mapbox.com/mapbox-gl-js/example/toggle-layers/) */ - setLayoutProperty(layerId , name , value , options = {}) { + setLayoutProperty(layerId , name , value , options = {}) { this.style.setLayoutProperty(layerId, name, value, options); return this._update(true); } @@ -73411,7 +77249,7 @@ class Map extends Camera { * @example * const layoutProperty = map.getLayoutProperty('mySymbolLayer', 'icon-anchor'); */ - getLayoutProperty(layerId , name ) { + getLayoutProperty(layerId , name ) { return this.style.getLayoutProperty(layerId, name); } @@ -73420,15 +77258,18 @@ class Map extends Camera { /** * Sets the any combination of light values. * - * @param {Object} light Light properties to set. Must conform to the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#light). + * @param {LightSpecification} light Light properties to set. Must conform to the [Light Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#light). * @param {Object} [options] Options object. * @param {boolean} [options.validate=true] Whether to check if the filter conforms to the Mapbox GL Style Specification. Disabling validation is a performance optimization that should only be used if you have previously validated the values you will be passing to this function. * @returns {Map} Returns itself to allow for method chaining. * @example - * const layerVisibility = map.getLayoutProperty('my-layer', 'visibility'); - * @see [Example: Show and hide layers](https://docs.mapbox.com/mapbox-gl-js/example/toggle-layers/) + * map.setLight({ + * "anchor": "viewport", + * "color": "blue", + * "intensity": 0.5 + * }); */ - setLight(light , options = {}) { + setLight(light , options = {}) { this._lazyInitEmptyStyle(); this.style.setLight(light, options); return this._update(true); @@ -73437,11 +77278,11 @@ class Map extends Camera { /** * Returns the value of the light object. * - * @returns {Object} Light properties of the style. + * @returns {LightSpecification} Light properties of the style. * @example * const light = map.getLight(); */ - getLight() { + getLight() { return this.style.getLight(); } @@ -73449,7 +77290,7 @@ class Map extends Camera { /** * Sets the terrain property of the style. * - * @param {Object} terrain Terrain properties to set. Must conform to the [Terrain Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/terrain/). + * @param {TerrainSpecification} terrain Terrain properties to set. Must conform to the [Terrain Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/terrain/). * If `null` or `undefined` is provided, function removes terrain. * @returns {Map} Returns itself to allow for method chaining. * @example @@ -73462,7 +77303,7 @@ class Map extends Camera { * // add the DEM source as a terrain layer with exaggerated height * map.setTerrain({'source': 'mapbox-dem', 'exaggeration': 1.5}); */ - setTerrain(terrain ) { + setTerrain(terrain ) { this._lazyInitEmptyStyle(); if (!terrain && this.transform.projection.requiresDraping) { this.style.setTerrainForDraping(); @@ -73473,42 +77314,35 @@ class Map extends Camera { return this._update(true); } - _updateProjection() { - const proj = this.transform.projection; - const zoom = this.transform.zoom; - - if (proj.name === 'globe' && zoom >= transform.GLOBE_ZOOM_THRESHOLD_MAX && !this._transitionFromGlobe) { - this.setProjection({name: 'mercator'}); - this._transitionFromGlobe = true; - } - } - /** * Returns the terrain specification or `null` if terrain isn't set on the map. * - * @returns {Object | null} Terrain specification properties of the style. + * @returns {TerrainSpecification | null} Terrain specification properties of the style. * @example * const terrain = map.getTerrain(); */ - getTerrain() { + getTerrain() { return this.style ? this.style.getTerrain() : null; } /** * Sets the fog property of the style. * - * @param {Object} fog The fog properties to set. Must conform to the [Fog Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/fog/). + * @param {FogSpecification} fog The fog properties to set. Must conform to the [Fog Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/fog/). * If `null` or `undefined` is provided, this function call removes the fog from the map. * @returns {Map} Returns itself to allow for method chaining. * @example * map.setFog({ - * "range": [1.0, 12.0], - * "color": 'white', - * "horizon-blend": 0.1 + * "range": [0.8, 8], + * "color": "#dc9f9f", + * "horizon-blend": 0.5, + * "high-color": "#245bde", + * "space-color": "#000000", + * "star-intensity": 0.15 * }); * @see [Example: Add fog to a map](https://docs.mapbox.com/mapbox-gl-js/example/add-fog/) */ - setFog(fog ) { + setFog(fog ) { this._lazyInitEmptyStyle(); this.style.setFog(fog); return this._update(true); @@ -73517,11 +77351,11 @@ class Map extends Camera { /** * Returns the fog specification or `null` if fog is not set on the map. * - * @returns {Object} Fog specification properties of the style. + * @returns {FogSpecification} Fog specification properties of the style. * @example * const fog = map.getFog(); */ - getFog() { + getFog() { return this.style ? this.style.getFog() : null; } @@ -73539,7 +77373,7 @@ class Map extends Camera { */ _queryFogOpacity(lnglat ) { if (!this.style || !this.style.fog) return 0.0; - return this.style.fog.getOpacityAtLatLng(transform.LngLat.convert(lnglat), this.transform); + return this.style.fog.getOpacityAtLatLng(ref_properties.LngLat.convert(lnglat), this.transform); } /** @section {Feature state} */ @@ -73582,7 +77416,7 @@ class Map extends Camera { * @see [Example: Create a hover effect](https://docs.mapbox.com/mapbox-gl-js/example/hover-styles/) * @see [Tutorial: Create interactive hover effects with Mapbox GL JS](https://docs.mapbox.com/help/tutorials/create-interactive-hover-effects-with-mapbox-gl-js/) */ - setFeatureState(feature , state ) { + setFeatureState(feature , state ) { this.style.setFeatureState(feature, state); return this._update(); } @@ -73634,7 +77468,7 @@ class Map extends Camera { * }); * */ - removeFeatureState(feature , key ) { + removeFeatureState(feature , key ) { this.style.removeFeatureState(feature, key); return this._update(); } @@ -73679,26 +77513,27 @@ class Map extends Camera { const height = this._container.getBoundingClientRect().height || 300; let transformValues; + let transformScaleWidth; + let transformScaleHeight; let el = this._container; - while (el && !transformValues) { - const transformMatrix = transform.window.getComputedStyle(el).transform; - if (transformMatrix && transformMatrix !== 'none') transformValues = transformMatrix.match(/matrix.*\((.+)\)/)[1].split(', '); + while (el && (!transformScaleWidth || !transformScaleHeight)) { + const transformMatrix = ref_properties.window.getComputedStyle(el).transform; + if (transformMatrix && transformMatrix !== 'none') { + transformValues = transformMatrix.match(/matrix.*\((.+)\)/)[1].split(', '); + if (transformValues[0] && transformValues[0] !== '0' && transformValues[0] !== '1') transformScaleWidth = transformValues[0]; + if (transformValues[3] && transformValues[3] !== '0' && transformValues[3] !== '1') transformScaleHeight = transformValues[3]; + } el = el.parentElement; } - if (transformValues) { - this._containerWidth = transformValues[0] && transformValues[0] !== '0' ? Math.abs(width / transformValues[0]) : width; - this._containerHeight = transformValues[3] && transformValues[3] !== '0' ? Math.abs(height / transformValues[3]) : height; - } else { - this._containerWidth = width; - this._containerHeight = height; - } + this._containerWidth = transformScaleWidth ? Math.abs(width / transformScaleWidth) : width; + this._containerHeight = transformScaleHeight ? Math.abs(height / transformScaleHeight) : height; } _detectMissingCSS() { - const computedColor = transform.window.getComputedStyle(this._missingCSSCanary).getPropertyValue('background-color'); + const computedColor = ref_properties.window.getComputedStyle(this._missingCSSCanary).getPropertyValue('background-color'); if (computedColor !== 'rgb(250, 128, 114)') { - transform.warnOnce('This page appears to be missing CSS declarations for ' + + ref_properties.warnOnce('This page appears to be missing CSS declarations for ' + 'Mapbox GL JS, which may cause the map to display incorrectly. ' + 'Please ensure your page includes mapbox-gl.css, as described ' + 'in https://www.mapbox.com/mapbox-gl-js/api/.'); @@ -73709,36 +77544,36 @@ class Map extends Camera { const container = this._container; container.classList.add('mapboxgl-map'); - const missingCSSCanary = this._missingCSSCanary = DOM.create('div', 'mapboxgl-canary', container); + const missingCSSCanary = this._missingCSSCanary = create$1('div', 'mapboxgl-canary', container); missingCSSCanary.style.visibility = 'hidden'; this._detectMissingCSS(); - const canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container); + const canvasContainer = this._canvasContainer = create$1('div', 'mapboxgl-canvas-container', container); if (this._interactive) { canvasContainer.classList.add('mapboxgl-interactive'); } - this._canvas = DOM.create('canvas', 'mapboxgl-canvas', canvasContainer); + this._canvas = create$1('canvas', 'mapboxgl-canvas', canvasContainer); 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'); + this._canvas.setAttribute('aria-label', this._getUIString('Map.Title')); this._canvas.setAttribute('role', 'region'); this._updateContainerDimensions(); this._resizeCanvas(this._containerWidth, this._containerHeight); - const controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container); + const controlContainer = this._controlContainer = create$1('div', 'mapboxgl-control-container', container); const positions = this._controlPositions = {}; ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach((positionName) => { - positions[positionName] = DOM.create('div', `mapboxgl-ctrl-${positionName}`, controlContainer); + positions[positionName] = create$1('div', `mapboxgl-ctrl-${positionName}`, controlContainer); }); this._container.addEventListener('scroll', this._onMapScroll, false); } _resizeCanvas(width , height ) { - const pixelRatio = transform.exported.devicePixelRatio || 1; + const pixelRatio = ref_properties.exported.devicePixelRatio || 1; // Request the required canvas size (rounded up) taking the pixelratio into account. this._canvas.width = pixelRatio * Math.ceil(width); @@ -73761,7 +77596,7 @@ class Map extends Camera { } _setupPainter() { - const attributes = transform.extend({}, supported.webGLContextAttributes, { + const attributes = ref_properties.extend({}, supported.webGLContextAttributes, { failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat, preserveDrawingBuffer: this._preserveDrawingBuffer, antialias: this._antialias || false @@ -73771,11 +77606,11 @@ class Map extends Camera { this._canvas.getContext('experimental-webgl', attributes); if (!gl) { - this.fire(new transform.ErrorEvent(new Error('Failed to initialize WebGL'))); + this.fire(new ref_properties.ErrorEvent(new Error('Failed to initialize WebGL'))); return; } - transform.storeAuthState(gl, true); + ref_properties.storeAuthState(gl, true); this.painter = new Painter(gl, this.transform); this.on('data', (event ) => { @@ -73784,7 +77619,7 @@ class Map extends Camera { } }); - transform.exported$1.testSupport(gl); + ref_properties.exported$1.testSupport(gl); } _contextLost(event ) { @@ -73793,17 +77628,17 @@ class Map extends Camera { this._frame.cancel(); this._frame = null; } - this.fire(new transform.Event('webglcontextlost', {originalEvent: event})); + this.fire(new ref_properties.Event('webglcontextlost', {originalEvent: event})); } _contextRestored(event ) { this._setupPainter(); this.resize(); this._update(); - this.fire(new transform.Event('webglcontextrestored', {originalEvent: event})); + this.fire(new ref_properties.Event('webglcontextrestored', {originalEvent: event})); } - _onMapScroll(event ) { + _onMapScroll(event ) { if (event.target !== this._container) return; // Revert any scroll which would move the canvas outside of the view @@ -73825,7 +77660,7 @@ class Map extends Camera { * @example * const isLoaded = map.loaded(); */ - loaded() { + loaded() { return !this._styleDirty && !this._sourcesDirty && !!this.style && this.style.loaded(); } @@ -73837,7 +77672,7 @@ class Map extends Camera { * @returns {Map} this * @private */ - _update(updateStyle ) { + _update(updateStyle ) { if (!this.style) return this; this._styleDirty = this._styleDirty || updateStyle; @@ -73890,18 +77725,16 @@ class Map extends Camera { * @private */ _render(paintStartTimeStamp ) { + const m = ref_properties.PerformanceUtils.beginMeasure('render'); + let gpuTimer; const extTimerQuery = this.painter.context.extTimerQuery; - const frameStartTime = transform.exported.now(); + const frameStartTime = ref_properties.exported.now(); if (this.listens('gpu-timing-frame')) { gpuTimer = extTimerQuery.createQueryEXT(); extTimerQuery.beginQueryEXT(extTimerQuery.TIME_ELAPSED_EXT, gpuTimer); } - const m = transform.PerformanceUtils.beginMeasure('render'); - - let averageElevationChanged = this._updateAverageElevation(frameStartTime); - // A custom layer may have used the context asynchronously. Mark the state as dirty. this.painter.context.setDirty(); this.painter.setBaseState(); @@ -73911,7 +77744,16 @@ class Map extends Camera { // A task queue callback may have fired a user event which may have removed the map if (this._removed) return; - this._updateProjection(); + // In globe view, change to/from Mercator when zoom threshold is crossed. + if (this.getProjection().name === 'globe') { + if (this.transform.zoom >= ref_properties.GLOBE_ZOOM_THRESHOLD_MAX) { + if (this.transform.projection.name === 'globe') { + this._updateProjection(); + } + } else if (this.transform.projection.name === 'mercator') { + this._updateProjection(); + } + } let crossFading = false; const fadeDuration = this._isInitialLoad ? 0 : this._fadeDuration; @@ -73924,10 +77766,10 @@ class Map extends Camera { const zoom = this.transform.zoom; const pitch = this.transform.pitch; - const now = transform.exported.now(); + const now = ref_properties.exported.now(); this.style.zoomHistory.update(zoom, now); - const parameters = new transform.EvaluationParameters(zoom, { + const parameters = new ref_properties.EvaluationParameters(zoom, { now, fadeDuration, pitch, @@ -73954,13 +77796,17 @@ class Map extends Camera { // 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 + let averageElevationChanged = false; if (this.style && this._sourcesDirty) { this._sourcesDirty = false; this.painter._updateFog(this.style); this._updateTerrain(); // Terrain DEM source updates here and skips update in style._updateSources. + averageElevationChanged = this._updateAverageElevation(frameStartTime); this.style._updateSources(this.transform); // Update positions of markers on enabling/disabling terrain this._forceMarkerUpdate(); + } else { + averageElevationChanged = this._updateAverageElevation(frameStartTime); } this._placementDirty = this.style && this.style._updatePlacement(this.painter.transform, this.showCollisionBoxes, fadeDuration, this._crossSourceCollisions); @@ -73979,16 +77825,17 @@ class Map extends Camera { isInitialLoad: this._isInitialLoad, showPadding: this.showPadding, gpuTiming: !!this.listens('gpu-timing-layer'), + gpuTimingDeferredRender: !!this.listens('gpu-timing-deferred-render'), speedIndexTiming: this.speedIndexTiming, }); } - this.fire(new transform.Event('render')); + this.fire(new ref_properties.Event('render')); if (this.loaded() && !this._loaded) { this._loaded = true; - transform.PerformanceUtils.mark(transform.PerformanceMarkers.load); - this.fire(new transform.Event('load')); + ref_properties.PerformanceUtils.mark(ref_properties.PerformanceMarkers.load); + this.fire(new ref_properties.Event('load')); } if (this.style && (this.style.hasTransitions() || crossFading)) { @@ -74002,20 +77849,26 @@ class Map extends Camera { this.style._releaseSymbolFadeTiles(); } - if (this.listens('gpu-timing-frame')) { - const renderCPUTime = transform.exported.now() - frameStartTime; + if (gpuTimer) { + const renderCPUTime = ref_properties.exported.now() - frameStartTime; extTimerQuery.endQueryEXT(extTimerQuery.TIME_ELAPSED_EXT, gpuTimer); setTimeout(() => { const renderGPUTime = extTimerQuery.getQueryObjectEXT(gpuTimer, extTimerQuery.QUERY_RESULT_EXT) / (1000 * 1000); extTimerQuery.deleteQueryEXT(gpuTimer); - this.fire(new transform.Event('gpu-timing-frame', { + this.fire(new ref_properties.Event('gpu-timing-frame', { cpuTime: renderCPUTime, gpuTime: renderGPUTime })); + ref_properties.window.performance.mark('frame-gpu', { + startTime: frameStartTime, + detail: { + gpuTime: renderGPUTime + } + }); }, 50); // Wait 50ms to give time for all GPU calls to finish before querying } - transform.PerformanceUtils.endMeasure(m); + ref_properties.PerformanceUtils.endMeasure(m); if (this.listens('gpu-timing-layer')) { // Resetting the Painter's per-layer timing queries here allows us to isolate @@ -74025,12 +77878,21 @@ class Map extends Camera { setTimeout(() => { const renderedLayerTimes = this.painter.queryGpuTimers(frameLayerQueries); - this.fire(new transform.Event('gpu-timing-layer', { + this.fire(new ref_properties.Event('gpu-timing-layer', { layerTimes: renderedLayerTimes })); }, 50); // Wait 50ms to give time for all GPU calls to finish before querying } + if (this.listens('gpu-timing-deferred-render')) { + const deferredRenderQueries = this.painter.collectDeferredRenderGpuQueries(); + + setTimeout(() => { + const gpuTime = this.painter.queryGpuTimeDeferredRender(deferredRenderQueries); + this.fire(new ref_properties.Event('gpu-timing-deferred-render', {gpuTime})); + }, 50); // Wait 50ms to give time for all GPU calls to finish before querying + } + // Schedule another render frame if it's needed. // // Even though `_styleDirty` and `_sourcesDirty` are reset in this @@ -74052,12 +77914,12 @@ class Map extends Camera { } else { this._triggerFrame(false); if (willIdle) { - this.fire(new transform.Event('idle')); + this.fire(new ref_properties.Event('idle')); this._isInitialLoad = false; // check the options to see if need to calculate the speed index if (this.speedIndexTiming) { const speedIndexNumber = this._calculateSpeedIndex(); - this.fire(new transform.Event('speedindexcompleted', {speedIndex: speedIndexNumber})); + this.fire(new ref_properties.Event('speedindexcompleted', {speedIndex: speedIndexNumber})); this.speedIndexTiming = false; } } @@ -74068,10 +77930,8 @@ class Map extends Camera { this._fullyLoaded = true; // Following line is billing related code. Do not change. See LICENSE.txt this._authenticate(); - transform.PerformanceUtils.mark(transform.PerformanceMarkers.fullLoad); + ref_properties.PerformanceUtils.mark(ref_properties.PerformanceMarkers.fullLoad); } - - return this; } _forceMarkerUpdate() { @@ -74103,6 +77963,12 @@ class Map extends Camera { if (timeoutElapsed && !this._averageElevation.isEasing(timeStamp)) { const currentElevation = this.transform.averageElevation; let newElevation = this.transform.sampleAverageElevation(); + let exaggerationChanged = false; + if (this.transform.elevation) { + exaggerationChanged = this.transform.elevation.exaggeration() !== this._averageElevationExaggeration; + // $FlowIgnore[incompatible-use] + this._averageElevationExaggeration = this.transform.elevation.exaggeration(); + } // New elevation is NaN if no terrain tiles were available if (isNaN(newElevation)) { @@ -74114,7 +77980,7 @@ class Map extends Camera { const elevationChange = Math.abs(currentElevation - newElevation); if (elevationChange > AVERAGE_ELEVATION_EASE_THRESHOLD) { - if (this._isInitialLoad) { + if (this._isInitialLoad || exaggerationChanged) { this._averageElevation.jumpTo(newElevation); return applyUpdate(newElevation); } else { @@ -74147,24 +78013,24 @@ class Map extends Camera { ******************************************************************************/ _authenticate() { - transform.getMapSessionAPI(this._getMapId(), this._requestManager._skuToken, this._requestManager._customAccessToken, (err) => { + ref_properties.getMapSessionAPI(this._getMapId(), this._requestManager._skuToken, this._requestManager._customAccessToken, (err) => { if (err) { // throwing an error here will cause the callback to be called again unnecessarily - if (err.message === transform.AUTH_ERR_MSG || err.status === 401) { + if (err.message === ref_properties.AUTH_ERR_MSG || (err ).status === 401) { const gl = this.painter.context.gl; - transform.storeAuthState(gl, false); + ref_properties.storeAuthState(gl, false); if (this._logoControl instanceof LogoControl) { this._logoControl._updateLogo(); } if (gl) gl.clear(gl.DEPTH_BUFFER_BIT | gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT); if (!this._silenceAuthErrors) { - this.fire(new transform.ErrorEvent(new Error('A valid Mapbox access token is required to use Mapbox GL JS. To create an account or a new access token, visit https://account.mapbox.com/'))); + this.fire(new ref_properties.ErrorEvent(new Error('A valid Mapbox access token is required to use Mapbox GL JS. To create an account or a new access token, visit https://account.mapbox.com/'))); } } } }); - transform.postMapLoadEvent(this._getMapId(), this._requestManager._skuToken, this._requestManager._customAccessToken, () => {}); + ref_properties.postMapLoadEvent(this._getMapId(), this._requestManager._skuToken, this._requestManager._customAccessToken, () => {}); } /***** END WARNING - REMOVAL OR MODIFICATION OF THE @@ -74246,14 +78112,15 @@ class Map extends Camera { this.style.destroy(); } this.painter.destroy(); - this.handlers.destroy(); - delete this.handlers; + if (this.handlers) this.handlers.destroy(); + this.handlers = undefined; this.setStyle(null); - if (typeof transform.window !== 'undefined') { - transform.window.removeEventListener('resize', this._onWindowResize, false); - transform.window.removeEventListener('orientationchange', this._onWindowResize, false); - transform.window.removeEventListener('webkitfullscreenchange', this._onWindowResize, false); - transform.window.removeEventListener('online', this._onWindowOnline, false); + + if (typeof ref_properties.window !== 'undefined') { + ref_properties.window.removeEventListener('resize', this._onWindowResize, false); + ref_properties.window.removeEventListener('orientationchange', this._onWindowResize, false); + ref_properties.window.removeEventListener('webkitfullscreenchange', this._onWindowResize, false); + ref_properties.window.removeEventListener('online', this._onWindowOnline, false); } const extension = this.painter.context.gl.getExtension('WEBGL_lose_context'); @@ -74263,10 +78130,10 @@ class Map extends Camera { removeNode(this._missingCSSCanary); this._container.classList.remove('mapboxgl-map'); - transform.PerformanceUtils.clearMetrics(); - transform.removeAuthState(this.painter.context.gl); + ref_properties.PerformanceUtils.clearMetrics(); + ref_properties.removeAuthState(this.painter.context.gl); this._removed = true; - this.fire(new transform.Event('remove')); + this.fire(new ref_properties.Event('remove')); } /** @@ -74287,9 +78154,9 @@ class Map extends Camera { _triggerFrame(render ) { this._renderNextFrame = this._renderNextFrame || render; if (this.style && !this._frame) { - this._frame = transform.exported.frame((paintStartTimeStamp ) => { + this._frame = ref_properties.exported.frame((paintStartTimeStamp ) => { const isRenderFrame = !!this._renderNextFrame; - transform.PerformanceUtils.frame(paintStartTimeStamp, isRenderFrame); + ref_properties.PerformanceUtils.frame(paintStartTimeStamp, isRenderFrame); this._frame = null; this._renderNextFrame = null; if (isRenderFrame) { @@ -74305,9 +78172,9 @@ class Map extends Camera { * @private * @returns {Object} Returns `this` | Promise. */ - _preloadTiles(transform$1 ) { - const sources = this.style && (Object.values(this.style._sourceCaches) ) || []; - transform.asyncAll(sources, (source, done) => source._preloadTiles(transform$1, done), () => { + _preloadTiles(transform ) { + const sources = this.style ? (Object.values(this.style._sourceCaches) ) : []; + ref_properties.asyncAll(sources, (source, done) => source._preloadTiles(transform, done), () => { this.triggerRepaint(); }); @@ -74468,7 +78335,7 @@ class Map extends Camera { // for cache browser tests _setCacheLimits(limit , checkThreshold ) { - transform.setCacheLimits(limit, checkThreshold); + ref_properties.setCacheLimits(limit, checkThreshold); } /** @@ -74480,7 +78347,7 @@ class Map extends Camera { * @var {string} version */ - get version() { return transform.version; } + get version() { return ref_properties.version; } } function removeNode(node) { @@ -74598,6 +78465,7 @@ function removeNode(node) { // + @@ -74605,7 +78473,7 @@ function removeNode(node) { -const defaultOptions$2 = { +const defaultOptions$3 = { showCompass: true, showZoom: true, visualizePitch: false @@ -74632,51 +78500,56 @@ const defaultOptions$2 = { * @see [Example: Add a third party vector tile source](https://www.mapbox.com/mapbox-gl-js/example/third-party/) */ class NavigationControl { - + - + constructor(options ) { - this.options = transform.extend({}, defaultOptions$2, options); + this.options = ref_properties.extend({}, defaultOptions$3, options); - this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-group'); - this._container.addEventListener('contextmenu', (e) => e.preventDefault()); + this._container = create$1('div', 'mapboxgl-ctrl mapboxgl-ctrl-group'); + this._container.addEventListener('contextmenu', (e ) => e.preventDefault()); if (this.options.showZoom) { - transform.bindAll([ + ref_properties.bindAll([ '_setButtonTitle', '_updateZoomButtons' ], this); - this._zoomInButton = this._createButton('mapboxgl-ctrl-zoom-in', (e) => this._map.zoomIn({}, {originalEvent: e})); - DOM.create('span', `mapboxgl-ctrl-icon`, this._zoomInButton).setAttribute('aria-hidden', true); - this._zoomOutButton = this._createButton('mapboxgl-ctrl-zoom-out', (e) => this._map.zoomOut({}, {originalEvent: e})); - DOM.create('span', `mapboxgl-ctrl-icon`, this._zoomOutButton).setAttribute('aria-hidden', true); + this._zoomInButton = this._createButton('mapboxgl-ctrl-zoom-in', (e) => { if (this._map) this._map.zoomIn({}, {originalEvent: e}); }); + create$1('span', `mapboxgl-ctrl-icon`, this._zoomInButton).setAttribute('aria-hidden', 'true'); + this._zoomOutButton = this._createButton('mapboxgl-ctrl-zoom-out', (e) => { if (this._map) this._map.zoomOut({}, {originalEvent: e}); }); + create$1('span', `mapboxgl-ctrl-icon`, this._zoomOutButton).setAttribute('aria-hidden', 'true'); } if (this.options.showCompass) { - transform.bindAll([ + ref_properties.bindAll([ '_rotateCompassArrow' ], this); this._compass = this._createButton('mapboxgl-ctrl-compass', (e) => { + const map = this._map; + if (!map) return; if (this.options.visualizePitch) { - this._map.resetNorthPitch({}, {originalEvent: e}); + map.resetNorthPitch({}, {originalEvent: e}); } else { - this._map.resetNorth({}, {originalEvent: e}); + map.resetNorth({}, {originalEvent: e}); } }); - this._compassIcon = DOM.create('span', 'mapboxgl-ctrl-icon', this._compass); - this._compassIcon.setAttribute('aria-hidden', true); + this._compassIcon = create$1('span', 'mapboxgl-ctrl-icon', this._compass); + this._compassIcon.setAttribute('aria-hidden', 'true'); } } _updateZoomButtons() { - const zoom = this._map.getZoom(); - const isMax = zoom === this._map.getMaxZoom(); - const isMin = zoom === this._map.getMinZoom(); + const map = this._map; + if (!map) return; + + const zoom = map.getZoom(); + const isMax = zoom === map.getMaxZoom(); + const isMin = zoom === map.getMinZoom(); this._zoomInButton.disabled = isMax; this._zoomOutButton.disabled = isMin; this._zoomInButton.setAttribute('aria-disabled', isMax.toString()); @@ -74684,62 +78557,67 @@ class NavigationControl { } _rotateCompassArrow() { + const map = this._map; + if (!map) return; + const rotate = this.options.visualizePitch ? - `scale(${1 / Math.pow(Math.cos(this._map.transform.pitch * (Math.PI / 180)), 0.5)}) rotateX(${this._map.transform.pitch}deg) rotateZ(${this._map.transform.angle * (180 / Math.PI)}deg)` : - `rotate(${this._map.transform.angle * (180 / Math.PI)}deg)`; + `scale(${1 / Math.pow(Math.cos(map.transform.pitch * (Math.PI / 180)), 0.5)}) rotateX(${map.transform.pitch}deg) rotateZ(${map.transform.angle * (180 / Math.PI)}deg)` : + `rotate(${map.transform.angle * (180 / Math.PI)}deg)`; - this._map._requestDomTask(() => { + map._requestDomTask(() => { if (this._compassIcon) { this._compassIcon.style.transform = rotate; } }); } - onAdd(map ) { + onAdd(map ) { this._map = map; if (this.options.showZoom) { this._setButtonTitle(this._zoomInButton, 'ZoomIn'); this._setButtonTitle(this._zoomOutButton, 'ZoomOut'); - this._map.on('zoom', this._updateZoomButtons); + map.on('zoom', this._updateZoomButtons); this._updateZoomButtons(); } if (this.options.showCompass) { this._setButtonTitle(this._compass, 'ResetBearing'); if (this.options.visualizePitch) { - this._map.on('pitch', this._rotateCompassArrow); + map.on('pitch', this._rotateCompassArrow); } - this._map.on('rotate', this._rotateCompassArrow); + map.on('rotate', this._rotateCompassArrow); this._rotateCompassArrow(); - this._handler = new MouseRotateWrapper(this._map, this._compass, this.options.visualizePitch); + this._handler = new MouseRotateWrapper(map, this._compass, this.options.visualizePitch); } return this._container; } onRemove() { + const map = this._map; + if (!map) return; this._container.remove(); if (this.options.showZoom) { - this._map.off('zoom', this._updateZoomButtons); + map.off('zoom', this._updateZoomButtons); } if (this.options.showCompass) { if (this.options.visualizePitch) { - this._map.off('pitch', this._rotateCompassArrow); + map.off('pitch', this._rotateCompassArrow); } - this._map.off('rotate', this._rotateCompassArrow); - this._handler.off(); - delete this._handler; + map.off('rotate', this._rotateCompassArrow); + if (this._handler) this._handler.off(); + this._handler = undefined; } - - delete this._map; + this._map = undefined; } - _createButton(className , fn ) { - const a = DOM.create('button', className, this._container); + _createButton(className , fn ) { + const a = create$1('button', className, this._container); a.type = 'button'; a.addEventListener('click', fn); return a; } _setButtonTitle(button , title ) { + if (!this._map) return; const str = this._map._getUIString(`NavigationControl.${title}`); button.setAttribute('aria-label', str); if (button.firstElementChild) button.firstElementChild.setAttribute('title', str); @@ -74763,7 +78641,7 @@ class MouseRotateWrapper { this.map = map; if (pitch) this.mousePitch = new MousePitchHandler({clickTolerance: map.dragRotate._mousePitch._clickTolerance}); - transform.bindAll(['mousedown', 'mousemove', 'mouseup', 'touchstart', 'touchmove', 'touchend', 'reset'], this); + ref_properties.bindAll(['mousedown', 'mousemove', 'mouseup', 'touchstart', 'touchmove', 'touchend', 'reset'], this); element.addEventListener('mousedown', this.mousedown); element.addEventListener('touchstart', this.touchstart, {passive: false}); element.addEventListener('touchmove', this.touchmove); @@ -74774,16 +78652,18 @@ class MouseRotateWrapper { down(e , point ) { this.mouseRotate.mousedown(e, point); if (this.mousePitch) this.mousePitch.mousedown(e, point); - DOM.disableDrag(); + disableDrag(); } move(e , point ) { const map = this.map; const r = this.mouseRotate.mousemoveWindow(e, point); - if (r && r.bearingDelta) map.setBearing(map.getBearing() + r.bearingDelta); + const delta = r && r.bearingDelta; + if (delta) map.setBearing(map.getBearing() + delta); if (this.mousePitch) { const p = this.mousePitch.mousemoveWindow(e, point); - if (p && p.pitchDelta) map.setPitch(map.getPitch() + p.pitchDelta); + const delta = p && p.pitchDelta; + if (delta) map.setPitch(map.getPitch() + delta); } } @@ -74798,19 +78678,19 @@ class MouseRotateWrapper { } offTemp() { - DOM.enableDrag(); - transform.window.removeEventListener('mousemove', this.mousemove); - transform.window.removeEventListener('mouseup', this.mouseup); + enableDrag(); + ref_properties.window.removeEventListener('mousemove', this.mousemove); + ref_properties.window.removeEventListener('mouseup', this.mouseup); } mousedown(e ) { - this.down(transform.extend({}, e, {ctrlKey: true, preventDefault: () => e.preventDefault()}), DOM.mousePos(this.element, e)); - transform.window.addEventListener('mousemove', this.mousemove); - transform.window.addEventListener('mouseup', this.mouseup); + this.down(ref_properties.extend({}, e, {ctrlKey: true, preventDefault: () => e.preventDefault()}), mousePos(this.element, e)); + ref_properties.window.addEventListener('mousemove', this.mousemove); + ref_properties.window.addEventListener('mouseup', this.mouseup); } mousemove(e ) { - this.move(e, DOM.mousePos(this.element, e)); + this.move(e, mousePos(this.element, e)); } mouseup(e ) { @@ -74823,7 +78703,7 @@ class MouseRotateWrapper { if (e.targetTouches.length !== 1) { this.reset(); } else { - this._startPos = this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0]; + this._startPos = this._lastPos = touchPos(this.element, e.targetTouches)[0]; this.down((({type: 'mousedown', button: 0, ctrlKey: true, preventDefault: () => e.preventDefault()} ) ), this._startPos); } } @@ -74832,7 +78712,7 @@ class MouseRotateWrapper { if (e.targetTouches.length !== 1) { this.reset(); } else { - this._lastPos = DOM.touchPos(this.element, e.targetTouches)[0]; + this._lastPos = touchPos(this.element, e.targetTouches)[0]; this.move((({preventDefault: () => e.preventDefault()} ) ), this._lastPos); } } @@ -74862,11 +78742,12 @@ class MouseRotateWrapper { - - - - + + + + + @@ -74879,7 +78760,7 @@ class MouseRotateWrapper { -const defaultOptions$3 = { +const defaultOptions$2 = { positionOptions: { enableHighAccuracy: false, maximumAge: 0, @@ -74894,31 +78775,6 @@ const defaultOptions$3 = { showUserHeading: false }; -let supportsGeolocation; - -function checkGeolocationSupport(callback) { - if (supportsGeolocation !== undefined) { - callback(supportsGeolocation); - - } else if (transform.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 - transform.window.navigator.permissions.query({name: 'geolocation'}).then((p) => { - supportsGeolocation = p.state !== 'denied'; - callback(supportsGeolocation); - }); - - } else { - supportsGeolocation = !!transform.window.navigator.geolocation; - callback(supportsGeolocation); - } -} - -let numberOfWatches = 0; -let noTimeout = false; - /** * A `GeolocateControl` control provides a button that uses the browser's geolocation * API to locate the user on the map. @@ -74947,6 +78803,7 @@ let noTimeout = false; * @param {Object} [options.showAccuracyCircle=true] By default, if `showUserLocation` is `true`, a transparent circle will be drawn around the user location indicating the accuracy (95% confidence level) of the user's location. Set to `false` to disable. Always disabled when `showUserLocation` is `false`. * @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. * @param {Object} [options.showUserHeading=false] If `true` an arrow will be drawn next to the user location dot indicating the device's heading. This only has affect when `trackUserLocation` is `true`. + * @param {Object} [options.geolocation=window.navigator.geolocation] `window.navigator.geolocation` by default; you can provide an object with the same shape to customize geolocation handling. * * @example * map.addControl(new mapboxgl.GeolocateControl({ @@ -74958,7 +78815,7 @@ let noTimeout = false; * })); * @see [Example: Locate the user](https://www.mapbox.com/mapbox-gl-js/example/locate-user/) */ -class GeolocateControl extends transform.Evented { +class GeolocateControl extends ref_properties.Evented { @@ -74975,13 +78832,17 @@ class GeolocateControl extends transform.Evented { // set to true once the control has been setup - - constructor(options ) { + + + + + constructor(options ) { super(); - this.options = transform.extend({}, defaultOptions$3, options); + const geolocation = ref_properties.window.navigator.geolocation; + this.options = ref_properties.extend({geolocation}, defaultOptions$2, options); - transform.bindAll([ + ref_properties.bindAll([ '_onSuccess', '_onError', '_onZoom', @@ -74989,25 +78850,25 @@ class GeolocateControl extends transform.Evented { '_setupUI', '_updateCamera', '_updateMarker', - '_updateMarkerRotation' + '_updateMarkerRotation', + '_onDeviceOrientation' ], this); - // by referencing the function with .bind(), we can correctly remove from window's event listeners - this._onDeviceOrientationListener = this._onDeviceOrientation.bind(this); this._updateMarkerRotationThrottled = throttle(this._updateMarkerRotation, 20); + this._numberOfWatches = 0; } - onAdd(map ) { + onAdd(map ) { this._map = map; - this._container = DOM.create('div', `mapboxgl-ctrl mapboxgl-ctrl-group`); - checkGeolocationSupport(this._setupUI); + this._container = create$1('div', `mapboxgl-ctrl mapboxgl-ctrl-group`); + this._checkGeolocationSupport(this._setupUI); return this._container; } onRemove() { // clear the geolocation watch if exists if (this._geolocationWatchID !== undefined) { - transform.window.navigator.geolocation.clearWatch(this._geolocationWatchID); + this.options.geolocation.clearWatch(this._geolocationWatchID); this._geolocationWatchID = (undefined ); } @@ -75022,8 +78883,26 @@ class GeolocateControl extends transform.Evented { this._container.remove(); this._map.off('zoom', this._onZoom); this._map = (undefined ); - numberOfWatches = 0; - noTimeout = false; + this._numberOfWatches = 0; + this._noTimeout = false; + } + + _checkGeolocationSupport(callback ) { + if (this._supportsGeolocation !== undefined) { + callback(this._supportsGeolocation); + } else if (ref_properties.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 + ref_properties.window.navigator.permissions.query({name: 'geolocation'}).then((p) => { + this._supportsGeolocation = p.state !== 'denied'; + callback(this._supportsGeolocation); + }); + } else { + this._supportsGeolocation = !!this.geolocation; + callback(this._supportsGeolocation); + } } /** @@ -75033,11 +78912,11 @@ class GeolocateControl extends transform.Evented { * @returns {boolean} Returns `true` if position is outside the map's maxbounds, otherwise returns `false`. * @private */ - _isOutOfMapMaxBounds(position ) { + _isOutOfMapMaxBounds(position ) { const bounds = this._map.getMaxBounds(); const coordinates = position.coords; - return bounds && ( + return !!bounds && ( coordinates.longitude < bounds.getWest() || coordinates.longitude > bounds.getEast() || coordinates.latitude < bounds.getSouth() || @@ -75069,7 +78948,7 @@ class GeolocateControl extends transform.Evented { case 'ACTIVE_ERROR': break; default: - transform.assert_1(false, `Unexpected watchState ${this._watchState}`); + ref_properties.assert_1(false, `Unexpected watchState ${this._watchState}`); } } @@ -75088,7 +78967,7 @@ class GeolocateControl extends transform.Evented { if (this._isOutOfMapMaxBounds(position)) { this._setErrorState(); - this.fire(new transform.Event('outofmaxbounds', position)); + this.fire(new ref_properties.Event('outofmaxbounds', position)); this._updateMarker(); this._finish(); @@ -75118,7 +78997,7 @@ class GeolocateControl extends transform.Evented { this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); break; default: - transform.assert_1(false, `Unexpected watchState ${this._watchState}`); + ref_properties.assert_1(false, `Unexpected watchState ${this._watchState}`); } } @@ -75137,7 +79016,7 @@ class GeolocateControl extends transform.Evented { this._dotElement.classList.remove('mapboxgl-user-location-dot-stale'); } - this.fire(new transform.Event('geolocate', position)); + this.fire(new ref_properties.Event('geolocate', position)); this._finish(); } @@ -75148,10 +79027,10 @@ class GeolocateControl extends transform.Evented { * @private */ _updateCamera(position ) { - const center = new transform.LngLat(position.coords.longitude, position.coords.latitude); + const center = new ref_properties.LngLat(position.coords.longitude, position.coords.latitude); const radius = position.coords.accuracy; const bearing = this._map.getBearing(); - const options = transform.extend({bearing}, this.options.fitBoundsOptions); + const options = ref_properties.extend({bearing}, this.options.fitBoundsOptions); this._map.fitBounds(center.toBounds(radius), options, { geolocateSource: true // tag this camera change so it won't cause the control to change to background state @@ -75166,7 +79045,7 @@ class GeolocateControl extends transform.Evented { */ _updateMarker(position ) { if (position) { - const center = new transform.LngLat(position.coords.longitude, position.coords.latitude); + const center = new ref_properties.LngLat(position.coords.longitude, position.coords.latitude); this._accuracyCircleMarker.setLngLat(center).addTo(this._map); this._userLocationDotMarker.setLngLat(center).addTo(this._map); this._accuracy = position.coords.accuracy; @@ -75180,12 +79059,14 @@ class GeolocateControl extends transform.Evented { } _updateCircleRadius() { - transform.assert_1(this._circleElement); - const y = this._map._containerHeight / 2; - const a = this._map.unproject([0, y]); - const b = this._map.unproject([100, y]); - const metersPerPixel = a.distanceTo(b) / 100; - const circleDiameter = Math.ceil(2.0 * this._accuracy / metersPerPixel); + ref_properties.assert_1(this._circleElement); + const map = this._map; + const tr = map.transform; + + const pixelsPerMeter = ref_properties.mercatorZfromAltitude(1.0, tr._center.lat) * tr.worldSize; + ref_properties.assert_1(pixelsPerMeter !== 0.0); + const circleDiameter = Math.ceil(2.0 * this._accuracy * pixelsPerMeter); + this._circleElement.style.width = `${circleDiameter}px`; this._circleElement.style.height = `${circleDiameter}px`; } @@ -75234,7 +79115,7 @@ class GeolocateControl extends transform.Evented { if (this._geolocationWatchID !== undefined) { this._clearWatch(); } - } else if (error.code === 3 && noTimeout) { + } else if (error.code === 3 && this._noTimeout) { // this represents a forced error state // this was triggered to force immediate geolocation when a watch is already present // see https://github.com/mapbox/mapbox-gl-js/issues/8214 @@ -75249,7 +79130,7 @@ class GeolocateControl extends transform.Evented { this._dotElement.classList.add('mapboxgl-user-location-dot-stale'); } - this.fire(new transform.Event('error', error)); + this.fire(new ref_properties.Event('error', error)); this._finish(); } @@ -75261,13 +79142,13 @@ class GeolocateControl extends transform.Evented { _setupUI(supported ) { this._container.addEventListener('contextmenu', (e ) => e.preventDefault()); - this._geolocateButton = DOM.create('button', `mapboxgl-ctrl-geolocate`, this._container); - DOM.create('span', `mapboxgl-ctrl-icon`, this._geolocateButton).setAttribute('aria-hidden', true); + this._geolocateButton = create$1('button', `mapboxgl-ctrl-geolocate`, this._container); + create$1('span', `mapboxgl-ctrl-icon`, this._geolocateButton).setAttribute('aria-hidden', 'true'); this._geolocateButton.type = 'button'; if (supported === false) { - transform.warnOnce('Geolocation support is not available so the GeolocateControl will be disabled.'); + ref_properties.warnOnce('Geolocation support is not available so the GeolocateControl will be disabled.'); const title = this._map._getUIString('GeolocateControl.LocationNotAvailable'); this._geolocateButton.disabled = true; this._geolocateButton.setAttribute('aria-label', title); @@ -75285,9 +79166,9 @@ class GeolocateControl extends transform.Evented { // 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'); - this._dotElement.appendChild(DOM.create('div', 'mapboxgl-user-location-dot')); - this._dotElement.appendChild(DOM.create('div', 'mapboxgl-user-location-heading')); + this._dotElement = create$1('div', 'mapboxgl-user-location'); + this._dotElement.appendChild(create$1('div', 'mapboxgl-user-location-dot')); + this._dotElement.appendChild(create$1('div', 'mapboxgl-user-location-heading')); this._userLocationDotMarker = new Marker({ element: this._dotElement, @@ -75295,7 +79176,7 @@ class GeolocateControl extends transform.Evented { pitchAlignment: 'map' }); - this._circleElement = DOM.create('div', 'mapboxgl-user-location-accuracy-circle'); + this._circleElement = create$1('div', 'mapboxgl-user-location-accuracy-circle'); this._accuracyCircleMarker = new Marker({element: this._circleElement, pitchAlignment: 'map'}); if (this.options.trackUserLocation) this._watchState = 'OFF'; @@ -75318,7 +79199,7 @@ class GeolocateControl extends transform.Evented { this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); - this.fire(new transform.Event('trackuserlocationend')); + this.fire(new ref_properties.Event('trackuserlocationend')); } }); } @@ -75378,9 +79259,9 @@ class GeolocateControl extends transform.Evented { * }); * @returns {boolean} Returns `false` if called before control was added to a map, otherwise returns `true`. */ - trigger() { + trigger() { if (!this._setup) { - transform.warnOnce('Geolocate control triggered before added to a map'); + ref_properties.warnOnce('Geolocate control triggered before added to a map'); return false; } if (this.options.trackUserLocation) { @@ -75390,15 +79271,15 @@ class GeolocateControl extends transform.Evented { // turn on the GeolocateControl this._watchState = 'WAITING_ACTIVE'; - this.fire(new transform.Event('trackuserlocationstart')); + this.fire(new ref_properties.Event('trackuserlocationstart')); break; case 'WAITING_ACTIVE': case 'ACTIVE_LOCK': case 'ACTIVE_ERROR': case 'BACKGROUND_ERROR': - // turn off the GeolocateControl - numberOfWatches--; - noTimeout = false; + // turn off the Geolocate Control + this._numberOfWatches--; + this._noTimeout = false; this._watchState = 'OFF'; this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-active'); @@ -75406,7 +79287,7 @@ class GeolocateControl extends transform.Evented { this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background'); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-background-error'); - this.fire(new transform.Event('trackuserlocationend')); + this.fire(new ref_properties.Event('trackuserlocationend')); break; case 'BACKGROUND': this._watchState = 'ACTIVE_LOCK'; @@ -75414,10 +79295,10 @@ class GeolocateControl extends transform.Evented { // set camera to last known location if (this._lastKnownPosition) this._updateCamera(this._lastKnownPosition); - this.fire(new transform.Event('trackuserlocationstart')); + this.fire(new ref_properties.Event('trackuserlocationstart')); break; default: - transform.assert_1(false, `Unexpected watchState ${this._watchState}`); + ref_properties.assert_1(false, `Unexpected watchState ${this._watchState}`); } // incoming state setup @@ -75443,7 +79324,7 @@ class GeolocateControl extends transform.Evented { case 'OFF': break; default: - transform.assert_1(false, `Unexpected watchState ${this._watchState}`); + ref_properties.assert_1(false, `Unexpected watchState ${this._watchState}`); } // manage geolocation.watchPosition / geolocation.clearWatch @@ -75456,17 +79337,17 @@ class GeolocateControl extends transform.Evented { this._geolocateButton.classList.add('mapboxgl-ctrl-geolocate-waiting'); this._geolocateButton.setAttribute('aria-pressed', 'true'); - numberOfWatches++; + this._numberOfWatches++; let positionOptions; - if (numberOfWatches > 1) { + if (this._numberOfWatches > 1) { positionOptions = {maximumAge:600000, timeout:0}; - noTimeout = true; + this._noTimeout = true; } else { positionOptions = this.options.positionOptions; - noTimeout = false; + this._noTimeout = false; } - this._geolocationWatchID = transform.window.navigator.geolocation.watchPosition( + this._geolocationWatchID = this.options.geolocation.watchPosition( this._onSuccess, this._onError, positionOptions); if (this.options.showUserHeading) { @@ -75474,7 +79355,7 @@ class GeolocateControl extends transform.Evented { } } } else { - transform.window.navigator.geolocation.getCurrentPosition( + this.options.geolocation.getCurrentPosition( this._onSuccess, this._onError, this.options.positionOptions); // This timeout ensures that we still call finish() even if @@ -75487,16 +79368,16 @@ class GeolocateControl extends transform.Evented { _addDeviceOrientationListener() { const addListener = () => { - if ('ondeviceorientationabsolute' in transform.window) { - transform.window.addEventListener('deviceorientationabsolute', this._onDeviceOrientationListener); + if ('ondeviceorientationabsolute' in ref_properties.window) { + ref_properties.window.addEventListener('deviceorientationabsolute', this._onDeviceOrientation); } else { - transform.window.addEventListener('deviceorientation', this._onDeviceOrientationListener); + ref_properties.window.addEventListener('deviceorientation', this._onDeviceOrientation); } }; - if (typeof transform.window.DeviceMotionEvent !== "undefined" && - typeof transform.window.DeviceMotionEvent.requestPermission === 'function') { - //$FlowFixMe[incompatible-type] + if (typeof ref_properties.window.DeviceMotionEvent !== "undefined" && + typeof ref_properties.window.DeviceMotionEvent.requestPermission === 'function') { + // $FlowFixMe DeviceOrientationEvent.requestPermission() .then(response => { if (response === 'granted') { @@ -75510,10 +79391,10 @@ class GeolocateControl extends transform.Evented { } _clearWatch() { - transform.window.navigator.geolocation.clearWatch(this._geolocationWatchID); + this.options.geolocation.clearWatch(this._geolocationWatchID); - transform.window.removeEventListener('deviceorientation', this._onDeviceOrientationListener); - transform.window.removeEventListener('deviceorientationabsolute', this._onDeviceOrientationListener); + ref_properties.window.removeEventListener('deviceorientation', this._onDeviceOrientation); + ref_properties.window.removeEventListener('deviceorientationabsolute', this._onDeviceOrientation); this._geolocationWatchID = (undefined ); this._geolocateButton.classList.remove('mapboxgl-ctrl-geolocate-waiting'); @@ -75667,7 +79548,7 @@ class GeolocateControl extends transform.Evented { // - + @@ -75676,7 +79557,7 @@ class GeolocateControl extends transform.Evented { -const defaultOptions$4 = { +const defaultOptions$1 = { maxWidth: 100, unit: 'metric' }; @@ -75701,41 +79582,49 @@ const defaultOptions$4 = { class ScaleControl { + constructor(options ) { - this.options = transform.extend({}, defaultOptions$4, options); + this.options = ref_properties.extend({}, defaultOptions$1, options); - transform.bindAll([ - '_onMove', + ref_properties.bindAll([ + '_update', 'setUnit' ], this); } - getDefaultPosition() { + getDefaultPosition() { return 'bottom-left'; } - _onMove() { - updateScale(this._map, this._container, this.options); + _update() { + updateScale(this._map, this._container, this._language, this.options); } - onAdd(map ) { + onAdd(map ) { this._map = map; - this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer()); + this._language = map.getLanguage(); + this._container = create$1('div', 'mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer()); + this._container.dir = 'auto'; - this._map.on('move', this._onMove); - this._onMove(); + this._map.on('move', this._update); + this._update(); return this._container; } onRemove() { this._container.remove(); - this._map.off('move', this._onMove); + this._map.off('move', this._update); this._map = (undefined ); } + _setLanguage(language ) { + this._language = language; + this._update(); + } + /** * Set the scale's unit of the distance. * @@ -75743,20 +79632,21 @@ class ScaleControl { */ setUnit(unit ) { this.options.unit = unit; - updateScale(this._map, this._container, this.options); + this._update(); } } -function updateScale(map, container, options) { +function updateScale(map, container, language, 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. - const maxWidth = options && options.maxWidth || 100; + const maxWidth = (options && options.maxWidth) || 100; const y = map._containerHeight / 2; - const left = map.unproject([0, y]); - const right = map.unproject([maxWidth, y]); + const x = (map._containerWidth / 2) - maxWidth / 2; + const left = map.unproject([x, y]); + const right = map.unproject([x + maxWidth, y]); const maxMeters = left.distanceTo(right); // 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. @@ -75765,26 +79655,36 @@ function updateScale(map, container, options) { const maxFeet = 3.2808 * maxMeters; if (maxFeet > 5280) { const maxMiles = maxFeet / 5280; - setScale(container, maxWidth, maxMiles, map._getUIString('ScaleControl.Miles'), map); + setScale(container, maxWidth, maxMiles, language, 'mile', map); } else { - setScale(container, maxWidth, maxFeet, map._getUIString('ScaleControl.Feet'), map); + setScale(container, maxWidth, maxFeet, language, 'foot', map); } } else if (options && options.unit === 'nautical') { const maxNauticals = maxMeters / 1852; - setScale(container, maxWidth, maxNauticals, map._getUIString('ScaleControl.NauticalMiles'), map); + setScale(container, maxWidth, maxNauticals, language, 'nautical-mile', map); } else if (maxMeters >= 1000) { - setScale(container, maxWidth, maxMeters / 1000, map._getUIString('ScaleControl.Kilometers'), map); + setScale(container, maxWidth, maxMeters / 1000, language, 'kilometer', map); } else { - setScale(container, maxWidth, maxMeters, map._getUIString('ScaleControl.Meters'), map); + setScale(container, maxWidth, maxMeters, language, 'meter', map); } } -function setScale(container, maxWidth, maxDistance, unit, map) { +function setScale(container, maxWidth, maxDistance, language, unit, map) { const distance = getRoundNum(maxDistance); const ratio = distance / maxDistance; + map._requestDomTask(() => { container.style.width = `${maxWidth * ratio}px`; - container.innerHTML = `${distance} ${unit}`; + + // Intl.NumberFormat doesn't support nautical-mile as a unit, + // so we are hardcoding `nm` as a unit symbol for all locales + if (unit === 'nautical-mile') { + container.innerHTML = `${distance} nm`; + return; + } + + // $FlowFixMe — flow v0.142.0 doesn't support optional `locales` argument and `unit` style option + container.innerHTML = new Intl.NumberFormat(language, {style: 'unit', unitDisplay: 'narrow', unit}).format(distance); }); } @@ -75838,32 +79738,32 @@ class FullscreenControl { constructor(options ) { this._fullscreen = false; if (options && options.container) { - if (options.container instanceof transform.window.HTMLElement) { + if (options.container instanceof ref_properties.window.HTMLElement) { this._container = options.container; } else { - transform.warnOnce('Full screen control \'container\' must be a DOM element.'); + ref_properties.warnOnce('Full screen control \'container\' must be a DOM element.'); } } - transform.bindAll([ + ref_properties.bindAll([ '_onClickFullscreen', '_changeIcon' ], this); - if ('onfullscreenchange' in transform.window.document) { + if ('onfullscreenchange' in ref_properties.window.document) { this._fullscreenchange = 'fullscreenchange'; - } else if ('onwebkitfullscreenchange' in transform.window.document) { + } else if ('onwebkitfullscreenchange' in ref_properties.window.document) { this._fullscreenchange = 'webkitfullscreenchange'; } } - onAdd(map ) { + onAdd(map ) { this._map = map; if (!this._container) this._container = this._map.getContainer(); - this._controlContainer = DOM.create('div', `mapboxgl-ctrl mapboxgl-ctrl-group`); + this._controlContainer = create$1('div', `mapboxgl-ctrl mapboxgl-ctrl-group`); if (this._checkFullscreenSupport()) { this._setupUI(); } else { this._controlContainer.style.display = 'none'; - transform.warnOnce('This device does not support fullscreen mode.'); + ref_properties.warnOnce('This device does not support fullscreen mode.'); } return this._controlContainer; } @@ -75871,23 +79771,23 @@ class FullscreenControl { onRemove() { this._controlContainer.remove(); this._map = (null ); - transform.window.document.removeEventListener(this._fullscreenchange, this._changeIcon); + ref_properties.window.document.removeEventListener(this._fullscreenchange, this._changeIcon); } - _checkFullscreenSupport() { + _checkFullscreenSupport() { return !!( - transform.window.document.fullscreenEnabled || - (transform.window.document ).webkitFullscreenEnabled + ref_properties.window.document.fullscreenEnabled || + (ref_properties.window.document ).webkitFullscreenEnabled ); } _setupUI() { - const button = this._fullscreenButton = DOM.create('button', (`mapboxgl-ctrl-fullscreen`), this._controlContainer); - DOM.create('span', `mapboxgl-ctrl-icon`, button).setAttribute('aria-hidden', true); + const button = this._fullscreenButton = create$1('button', (`mapboxgl-ctrl-fullscreen`), this._controlContainer); + create$1('span', `mapboxgl-ctrl-icon`, button).setAttribute('aria-hidden', 'true'); button.type = 'button'; this._updateTitle(); this._fullscreenButton.addEventListener('click', this._onClickFullscreen); - transform.window.document.addEventListener(this._fullscreenchange, this._changeIcon); + ref_properties.window.document.addEventListener(this._fullscreenchange, this._changeIcon); } _updateTitle() { @@ -75896,18 +79796,18 @@ class FullscreenControl { if (this._fullscreenButton.firstElementChild) this._fullscreenButton.firstElementChild.setAttribute('title', title); } - _getTitle() { + _getTitle() { return this._map._getUIString(this._isFullscreen() ? 'FullscreenControl.Exit' : 'FullscreenControl.Enter'); } - _isFullscreen() { + _isFullscreen() { return this._fullscreen; } _changeIcon() { const fullscreenElement = - transform.window.document.fullscreenElement || - (transform.window.document ).webkitFullscreenElement; + ref_properties.window.document.fullscreenElement || + (ref_properties.window.document ).webkitFullscreenElement; if ((fullscreenElement === this._container) !== this._fullscreen) { this._fullscreen = !this._fullscreen; @@ -75919,10 +79819,10 @@ class FullscreenControl { _onClickFullscreen() { if (this._isFullscreen()) { - if (transform.window.document.exitFullscreen) { - (transform.window.document ).exitFullscreen(); - } else if (transform.window.document.webkitCancelFullScreen) { - (transform.window.document ).webkitCancelFullScreen(); + if (ref_properties.window.document.exitFullscreen) { + (ref_properties.window.document ).exitFullscreen(); + } else if (ref_properties.window.document.webkitCancelFullScreen) { + (ref_properties.window.document ).webkitCancelFullScreen(); } } else if (this._container.requestFullscreen) { this._container.requestFullscreen(); @@ -75937,8 +79837,9 @@ class FullscreenControl { + -const defaultOptions$5 = { +const defaultOptions = { closeButton: true, closeOnClick: true, focusAfterOpen: true, @@ -76023,23 +79924,24 @@ const focusQuerySelector = [ * @see [Example: Display a popup on click](https://www.mapbox.com/mapbox-gl-js/example/popup-on-click/) * @see [Example: Attach a popup to a marker instance](https://www.mapbox.com/mapbox-gl-js/example/set-popup/) */ -class Popup extends transform.Evented { - - +class Popup extends ref_properties.Evented { + - - - + + + + + constructor(options ) { super(); - this.options = transform.extend(Object.create(defaultOptions$5), options); - transform.bindAll(['_update', '_onClose', 'remove', '_onMouseMove', '_onMouseUp', '_onDrag'], this); + this.options = ref_properties.extend(Object.create(defaultOptions), options); + ref_properties.bindAll(['_update', '_onClose', 'remove', '_onMouseEvent'], this); this._classList = new Set(options && options.className ? options.className.trim().split(/\s+/) : []); } @@ -76059,28 +79961,28 @@ class Popup extends transform.Evented { * @see [Example: Display a popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/) * @see [Example: Show polygon information on click](https://docs.mapbox.com/mapbox-gl-js/example/polygon-popup-on-click/) */ - addTo(map ) { + addTo(map ) { if (this._map) this.remove(); this._map = map; if (this.options.closeOnClick) { - this._map.on('preclick', this._onClose); + map.on('preclick', this._onClose); } if (this.options.closeOnMove) { - this._map.on('move', this._onClose); + map.on('move', this._onClose); } - this._map.on('remove', this.remove); + map.on('remove', this.remove); this._update(); this._focusFirstElement(); if (this._trackPointer) { - this._map.on('mousemove', this._onMouseMove); - this._map.on('mouseup', this._onMouseUp); - this._map._canvasContainer.classList.add('mapboxgl-track-pointer'); + map.on('mousemove', this._onMouseEvent); + map.on('mouseup', this._onMouseEvent); + map._canvasContainer.classList.add('mapboxgl-track-pointer'); } else { - this._map.on('move', this._update); + map.on('move', this._update); } /** @@ -76102,7 +80004,7 @@ class Popup extends transform.Evented { * }); * */ - this.fire(new transform.Event('open')); + this.fire(new ref_properties.Event('open')); return this; } @@ -76114,7 +80016,7 @@ class Popup extends transform.Evented { * @example * const isPopupOpen = popup.isOpen(); */ - isOpen() { + isOpen() { return !!this._map; } @@ -76126,25 +80028,27 @@ class Popup extends transform.Evented { * popup.remove(); * @returns {Popup} Returns itself to allow for method chaining. */ - remove() { + remove() { if (this._content) { this._content.remove(); } if (this._container) { this._container.remove(); - delete this._container; + this._container = undefined; } - if (this._map) { - this._map.off('move', this._update); - this._map.off('move', this._onClose); - this._map.off('click', this._onClose); - this._map.off('remove', this.remove); - this._map.off('mousemove', this._onMouseMove); - this._map.off('mouseup', this._onMouseUp); - this._map.off('drag', this._onDrag); - delete this._map; + const map = this._map; + if (map) { + map.off('move', this._update); + map.off('move', this._onClose); + map.off('preclick', this._onClose); + map.off('click', this._onClose); + map.off('remove', this.remove); + map.off('mousemove', this._onMouseEvent); + map.off('mouseup', this._onMouseEvent); + map.off('drag', this._onMouseEvent); + this._map = undefined; } /** @@ -76166,7 +80070,7 @@ class Popup extends transform.Evented { * }); * */ - this.fire(new transform.Event('close')); + this.fire(new ref_properties.Event('close')); return this; } @@ -76182,7 +80086,7 @@ class Popup extends transform.Evented { * @example * const lngLat = popup.getLngLat(); */ - getLngLat() { + getLngLat() { return this._lngLat; } @@ -76194,18 +80098,19 @@ class Popup extends transform.Evented { * @example * popup.setLngLat([-122.4194, 37.7749]); */ - setLngLat(lnglat ) { - this._lngLat = transform.LngLat.convert(lnglat); + setLngLat(lnglat ) { + this._lngLat = ref_properties.LngLat.convert(lnglat); this._pos = null; this._trackPointer = false; this._update(); - if (this._map) { - this._map.on('move', this._update); - this._map.off('mousemove', this._onMouseMove); - this._map._canvasContainer.classList.remove('mapboxgl-track-pointer'); + const map = this._map; + if (map) { + map.on('move', this._update); + map.off('mousemove', this._onMouseEvent); + map._canvasContainer.classList.remove('mapboxgl-track-pointer'); } return this; @@ -76222,15 +80127,16 @@ class Popup extends transform.Evented { * .addTo(map); * @returns {Popup} Returns itself to allow for method chaining. */ - trackPointer() { + trackPointer() { this._trackPointer = true; this._pos = null; this._update(); - if (this._map) { - this._map.off('move', this._update); - this._map.on('mousemove', this._onMouseMove); - this._map.on('drag', this._onDrag); - this._map._canvasContainer.classList.add('mapboxgl-track-pointer'); + const map = this._map; + if (map) { + map.off('move', this._update); + map.on('mousemove', this._onMouseEvent); + map.on('drag', this._onMouseEvent); + map._canvasContainer.classList.add('mapboxgl-track-pointer'); } return this; @@ -76250,7 +80156,7 @@ class Popup extends transform.Evented { * popupElem.style.fontSize = "25px"; * @returns {HTMLElement} Returns container element. */ - getElement() { + getElement() { return this._container; } @@ -76269,8 +80175,8 @@ class Popup extends transform.Evented { * .setText('Hello, world!') * .addTo(map); */ - setText(text ) { - return this.setDOMContent(transform.window.document.createTextNode(text)); + setText(text ) { + return this.setDOMContent(ref_properties.window.document.createTextNode(text)); } /** @@ -76292,9 +80198,9 @@ class Popup extends transform.Evented { * @see [Example: Display a popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/) * @see [Example: Attach a popup to a marker instance](https://docs.mapbox.com/mapbox-gl-js/example/set-popup/) */ - setHTML(html ) { - const frag = transform.window.document.createDocumentFragment(); - const temp = transform.window.document.createElement('body'); + setHTML(html ) { + const frag = ref_properties.window.document.createDocumentFragment(); + const temp = ref_properties.window.document.createElement('body'); let child; temp.innerHTML = html; while (true) { @@ -76313,7 +80219,7 @@ class Popup extends transform.Evented { * @example * const maxWidth = popup.getMaxWidth(); */ - getMaxWidth() { + getMaxWidth() { return this._container && this._container.style.maxWidth; } @@ -76326,7 +80232,7 @@ class Popup extends transform.Evented { * @example * popup.setMaxWidth('50'); */ - setMaxWidth(maxWidth ) { + setMaxWidth(maxWidth ) { this.options.maxWidth = maxWidth; this._update(); return this; @@ -76346,21 +80252,30 @@ class Popup extends transform.Evented { * .setDOMContent(div) * .addTo(map); */ - setDOMContent(htmlNode ) { - if (this._content) { + setDOMContent(htmlNode ) { + let content = this._content; + if (content) { // Clear out children first. - while (this._content.hasChildNodes()) { - if (this._content.firstChild) { - this._content.removeChild(this._content.firstChild); + while (content.hasChildNodes()) { + if (content.firstChild) { + content.removeChild(content.firstChild); } } } else { - this._content = DOM.create('div', 'mapboxgl-popup-content', this._container); + content = this._content = create$1('div', 'mapboxgl-popup-content', this._container || undefined); } // The close button should be the last tabbable element inside the popup for a good keyboard UX. - this._content.appendChild(htmlNode); - this._createCloseButton(); + content.appendChild(htmlNode); + + if (this.options.closeButton) { + const button = this._closeButton = create$1('button', 'mapboxgl-popup-close-button', content); + button.type = 'button'; + button.setAttribute('aria-label', 'Close popup'); + button.setAttribute('aria-hidden', 'true'); + button.innerHTML = '×'; + button.addEventListener('click', this._onClose); + } this._update(); this._focusFirstElement(); return this; @@ -76376,11 +80291,9 @@ class Popup extends transform.Evented { * const popup = new mapboxgl.Popup(); * popup.addClassName('some-class'); */ - addClassName(className ) { + addClassName(className ) { this._classList.add(className); - if (this._container) { - this._updateClassList(); - } + this._updateClassList(); return this; } @@ -76394,11 +80307,9 @@ class Popup extends transform.Evented { * const popup = new mapboxgl.Popup({className: 'some classes'}); * popup.removeClassName('some'); */ - removeClassName(className ) { + removeClassName(className ) { this._classList.delete(className); - if (this._container) { - this._updateClassList(); - } + this._updateClassList(); return this; } @@ -76422,7 +80333,7 @@ class Popup extends transform.Evented { * @example * popup.setOffset(10); */ - setOffset (offset ) { + setOffset (offset ) { this.options.offset = offset; this._update(); return this; @@ -76439,7 +80350,7 @@ class Popup extends transform.Evented { * const popup = new mapboxgl.Popup(); * popup.toggleClassName('highlighted'); */ - toggleClassName(className ) { + toggleClassName(className ) { let finalState ; if (this._classList.delete(className)) { finalState = false; @@ -76447,65 +80358,50 @@ class Popup extends transform.Evented { this._classList.add(className); finalState = true; } - if (this._container) { - this._updateClassList(); - } + this._updateClassList(); return finalState; } - _createCloseButton() { - 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.setAttribute('aria-hidden', 'true'); - this._closeButton.innerHTML = '×'; - this._closeButton.addEventListener('click', this._onClose); - } - } - - _onMouseUp(event ) { + _onMouseEvent(event ) { this._update(event.point); } - _onMouseMove(event ) { - this._update(event.point); - } + _getAnchor(bottomY ) { + if (this.options.anchor) { return this.options.anchor; } - _onDrag(event ) { - this._update(event.point); - } + const map = this._map; + const container = this._container; + const pos = this._pos; - _getAnchor(offset ) { - if (this.options.anchor) { return this.options.anchor; } + if (!map || !container || !pos) return 'bottom'; - const pos = this._pos; - const width = this._container.offsetWidth; - const height = this._container.offsetHeight; - let anchorComponents; + const width = container.offsetWidth; + const height = container.offsetHeight; - if (pos.y + offset.bottom.y < height) { - anchorComponents = ['top']; - } else if (pos.y > this._map.transform.height - height) { - anchorComponents = ['bottom']; - } else { - anchorComponents = []; - } + const isTop = pos.y + bottomY < height; + const isBottom = pos.y > map.transform.height - height; + const isLeft = pos.x < width / 2; + const isRight = pos.x > map.transform.width - width / 2; - if (pos.x < width / 2) { - anchorComponents.push('left'); - } else if (pos.x > this._map.transform.width - width / 2) { - anchorComponents.push('right'); + if (isTop) { + if (isLeft) return 'top-left'; + if (isRight) return 'top-right'; + return 'top'; } - - if (anchorComponents.length === 0) { - return 'bottom'; + if (isBottom) { + if (isLeft) return 'bottom-left'; + if (isRight) return 'bottom-right'; } - return ((anchorComponents.join('-') ) ); + if (isLeft) return 'left'; + if (isRight) return 'right'; + return 'bottom'; } _updateClassList() { + const container = this._container; + if (!container) return; + const classes = [...this._classList]; classes.push('mapboxgl-popup'); if (this._anchor) { @@ -76514,42 +80410,52 @@ class Popup extends transform.Evented { if (this._trackPointer) { classes.push('mapboxgl-popup-track-pointer'); } - this._container.className = classes.join(' '); + container.className = classes.join(' '); } - _update(cursor ) { + _update(cursor ) { const hasPosition = this._lngLat || this._trackPointer; + const map = this._map; + const content = this._content; + + if (!map || !hasPosition || !content) { return; } - if (!this._map || !hasPosition || !this._content) { return; } + let container = this._container; - 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 (!container) { + container = this._container = create$1('div', 'mapboxgl-popup', map.getContainer()); + this._tip = create$1('div', 'mapboxgl-popup-tip', container); + container.appendChild(content); } - if (this.options.maxWidth && this._container.style.maxWidth !== this.options.maxWidth) { - this._container.style.maxWidth = this.options.maxWidth; + if (this.options.maxWidth && container.style.maxWidth !== this.options.maxWidth) { + container.style.maxWidth = this.options.maxWidth; } - if (this._map.transform.renderWorldCopies && !this._trackPointer) { - this._lngLat = smartWrap(this._lngLat, this._pos, this._map.transform); + if (map.transform.renderWorldCopies && !this._trackPointer) { + this._lngLat = smartWrap(this._lngLat, this._pos, map.transform); } if (!this._trackPointer || cursor) { - const pos = this._pos = this._trackPointer && cursor ? cursor : this._map.project(this._lngLat); + const pos = this._pos = this._trackPointer && cursor ? cursor : map.project(this._lngLat); - const offset = normalizeOffset(this.options.offset); - const anchor = this._anchor = this._getAnchor(offset); + const offsetBottom = normalizeOffset(this.options.offset); + const anchor = this._anchor = this._getAnchor(offsetBottom.y); + const offset = normalizeOffset(this.options.offset, anchor); - const offsetedPos = pos.add(offset[anchor]).round(); - this._map._requestDomTask(() => { + const offsetedPos = pos.add(offset).round(); + map._requestDomTask(() => { if (this._container && anchor) { this._container.style.transform = `${anchorTranslate[anchor]} translate(${offsetedPos.x}px,${offsetedPos.y}px)`; } }); } + if (!this._marker && map._usingGlobe()) { + const opacity = ref_properties.isLngLatBehindGlobe(map.transform, this._lngLat) ? 0 : 1; + this._setOpacity(opacity); + } + this._updateClassList(); } @@ -76566,70 +80472,52 @@ class Popup extends transform.Evented { } _setOpacity(opacity ) { - if (this._content) this._content.style.opacity = opacity; - if (this._tip) this._tip.style.opacity = opacity; + if (this._container) { + this._container.style.opacity = `${opacity}`; + } + if (this._content) { + this._content.style.pointerEvents = opacity ? 'auto' : 'none'; + } } } -function normalizeOffset(offset ) { - if (!offset) offset = (new transform.pointGeometry(0, 0)); - +// returns a normalized offset for a given anchor +function normalizeOffset(offset = new ref_properties.pointGeometry(0, 0), anchor = 'bottom') { if (typeof offset === 'number') { // input specifies a radius from which to calculate offsets at all positions const cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2))); - return { - 'center': new transform.pointGeometry(0, 0), - 'top': new transform.pointGeometry(0, offset), - 'top-left': new transform.pointGeometry(cornerOffset, cornerOffset), - 'top-right': new transform.pointGeometry(-cornerOffset, cornerOffset), - 'bottom': new transform.pointGeometry(0, -offset), - 'bottom-left': new transform.pointGeometry(cornerOffset, -cornerOffset), - 'bottom-right': new transform.pointGeometry(-cornerOffset, -cornerOffset), - 'left': new transform.pointGeometry(offset, 0), - 'right': new transform.pointGeometry(-offset, 0) - }; + switch (anchor) { + case 'top': return new ref_properties.pointGeometry(0, offset); + case 'top-left': return new ref_properties.pointGeometry(cornerOffset, cornerOffset); + case 'top-right': return new ref_properties.pointGeometry(-cornerOffset, cornerOffset); + case 'bottom': return new ref_properties.pointGeometry(0, -offset); + case 'bottom-left': return new ref_properties.pointGeometry(cornerOffset, -cornerOffset); + case 'bottom-right': return new ref_properties.pointGeometry(-cornerOffset, -cornerOffset); + case 'left': return new ref_properties.pointGeometry(offset, 0); + case 'right': return new ref_properties.pointGeometry(-offset, 0); + } + return new ref_properties.pointGeometry(0, 0); + } - } else if (offset instanceof transform.pointGeometry || Array.isArray(offset)) { + if (offset instanceof ref_properties.pointGeometry || Array.isArray(offset)) { // input specifies a single offset to be applied to all positions - const convertedOffset = transform.pointGeometry.convert(offset); - return { - 'center': convertedOffset, - '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 { - 'center': transform.pointGeometry.convert(offset['center'] || [0, 0]), - 'top': transform.pointGeometry.convert(offset['top'] || [0, 0]), - 'top-left': transform.pointGeometry.convert(offset['top-left'] || [0, 0]), - 'top-right': transform.pointGeometry.convert(offset['top-right'] || [0, 0]), - 'bottom': transform.pointGeometry.convert(offset['bottom'] || [0, 0]), - 'bottom-left': transform.pointGeometry.convert(offset['bottom-left'] || [0, 0]), - 'bottom-right': transform.pointGeometry.convert(offset['bottom-right'] || [0, 0]), - 'left': transform.pointGeometry.convert(offset['left'] || [0, 0]), - 'right': transform.pointGeometry.convert(offset['right'] || [0, 0]) - }; + return ref_properties.pointGeometry.convert(offset); } + + // input specifies an offset per position + return ref_properties.pointGeometry.convert(offset[anchor] || [0, 0]); } // -const performance$1 = transform.window.performance; +const performance$1 = ref_properties.window.performance; // separate from PerformanceUtils to avoid circular dependency const WorkerPerformanceUtils = { getPerformanceMetricsAsync(callback ) { - const metrics = transform.PerformanceUtils.getPerformanceMetrics(); + const metrics = ref_properties.PerformanceUtils.getPerformanceMetrics(); const dispatcher = new Dispatcher(getGlobalWorkerPool(), this); const createTime = performance$1.getEntriesByName('create', 'mark')[0].startTime; @@ -76641,7 +80529,8 @@ const WorkerPerformanceUtils = { const sums = {}; for (const result of results) { - for (const measure of result.measures) { + for (const measure of result.entries) { + if (measure.entryType !== 'measure') continue; sums[measure.name] = (sums[measure.name] || 0) + measure.duration; } @@ -76657,6 +80546,8 @@ const WorkerPerformanceUtils = { metrics.parseTile = metrics.parseTile1 + metrics.parseTile2; + metrics.timelines = [ref_properties.PerformanceUtils.getWorkerPerformanceMetrics(), ...results]; + return callback(undefined, metrics); }); } @@ -76665,10 +80556,10 @@ const WorkerPerformanceUtils = { // const exported = { - version: transform.version, + version: ref_properties.version, supported, - setRTLTextPlugin: transform.setRTLTextPlugin, - getRTLTextPluginStatus: transform.getRTLTextPluginStatus, + setRTLTextPlugin: ref_properties.setRTLTextPlugin, + getRTLTextPluginStatus: ref_properties.getRTLTextPluginStatus, Map, NavigationControl, GeolocateControl, @@ -76678,16 +80569,17 @@ const exported = { Popup, Marker, Style, - LngLat: transform.LngLat, - LngLatBounds: transform.LngLatBounds, - Point: transform.pointGeometry, - MercatorCoordinate: transform.MercatorCoordinate, - FreeCameraOptions: transform.FreeCameraOptions, - Evented: transform.Evented, - config: transform.config, + LngLat: ref_properties.LngLat, + LngLatBounds: ref_properties.LngLatBounds, + Point: ref_properties.pointGeometry, + MercatorCoordinate: ref_properties.MercatorCoordinate, + FreeCameraOptions, + Evented: ref_properties.Evented, + config: ref_properties.config, /** * Initializes resources like WebWorkers that can be shared across maps to lower load - * times in some situations. `mapboxgl.workerUrl` and `mapboxgl.workerCount`, if being + * times in some situations. [`mapboxgl.workerUrl`](https://docs.mapbox.com/mapbox-gl-js/api/properties/#workerurl) + * and [`mapboxgl.workerCount`](https://docs.mapbox.com/mapbox-gl-js/api/properties/#workercount), if being * used, must be set before `prewarm()` is called to have an effect. * * By default, the lifecycle of these resources is managed automatically, and they are @@ -76695,10 +80587,10 @@ const exported = { * resources ahead of time and ensures they are not cleared when the last `Map` * is removed from the page. This allows them to be re-used by new `Map` instances that * are created later. They can be manually cleared by calling - * `mapboxgl.clearPrewarmedResources()`. This is only necessary if your web page - * remains active but stops using maps altogether. `prewarm()` is idempotent - * and has guards against being executed multiple times, and any resources - * allocated by `prewarm()` are created synchronously. + * [`mapboxgl.clearPrewarmedResources()`](https://docs.mapbox.com/mapbox-gl-js/api/properties/#clearprewarmedresources). + * This is only necessary if your web page remains active but stops using maps altogether. + * `prewarm()` is idempotent and has guards against being executed multiple times, + * and any resources allocated by `prewarm()` are created synchronously. * * This is primarily useful when using Mapbox GL JS maps in a single page app, * in which a user navigates between various views, resulting in @@ -76710,7 +80602,7 @@ const exported = { */ prewarm, /** - * Clears up resources that have previously been created by `mapboxgl.prewarm()`. + * Clears up resources that have previously been created by [`mapboxgl.prewarm()](https://docs.mapbox.com/mapbox-gl-js/api/properties/#prewarm)`. * Note that this is typically not necessary. You should only call this function * if you expect the user of your app to not return to a Map view at any point * in your application. @@ -76731,11 +80623,11 @@ const exported = { * @see [Example: Display a map](https://www.mapbox.com/mapbox-gl-js/example/simple-map/) */ get accessToken() { - return transform.config.ACCESS_TOKEN; + return ref_properties.config.ACCESS_TOKEN; }, set accessToken(token ) { - transform.config.ACCESS_TOKEN = token; + ref_properties.config.ACCESS_TOKEN = token; }, /** @@ -76747,11 +80639,11 @@ const exported = { * mapboxgl.baseApiUrl = 'https://api.mapbox.com'; */ get baseApiUrl() { - return transform.config.API_URL; + return ref_properties.config.API_URL; }, set baseApiUrl(url ) { - transform.config.API_URL = url; + ref_properties.config.API_URL = url; }, /** @@ -76782,11 +80674,11 @@ const exported = { * mapboxgl.maxParallelImageRequests = 10; */ get maxParallelImageRequests() { - return transform.config.MAX_PARALLEL_IMAGE_REQUESTS; + return ref_properties.config.MAX_PARALLEL_IMAGE_REQUESTS; }, set maxParallelImageRequests(numRequests ) { - transform.config.MAX_PARALLEL_IMAGE_REQUESTS = numRequests; + ref_properties.config.MAX_PARALLEL_IMAGE_REQUESTS = numRequests; }, /** @@ -76807,7 +80699,7 @@ const exported = { * mapboxgl.clearStorage(); */ clearStorage(callback ) { - transform.clearTileCache(callback); + ref_properties.clearTileCache(callback); }, /** * Provides an interface for loading mapbox-gl's WebWorker bundle from a self-hosted URL. @@ -76849,23 +80741,76 @@ const exported = { * * @var {number} time */ - setNow: transform.exported.setNow, + setNow: ref_properties.exported.setNow, /** * Restores the internal animation timing to follow regular computer time (`performance.now()`). */ - restoreNow: transform.exported.restoreNow + restoreNow: ref_properties.exported.restoreNow }; //This gets automatically stripped out in production builds. -transform.Debug.extend(exported, {isSafari: transform.isSafari, getPerformanceMetrics: transform.PerformanceUtils.getPerformanceMetrics, getPerformanceMetricsAsync: WorkerPerformanceUtils.getPerformanceMetricsAsync}); +ref_properties.Debug.extend(exported, {isSafari: ref_properties.isSafari, getPerformanceMetrics: ref_properties.PerformanceUtils.getPerformanceMetrics, getPerformanceMetricsAsync: WorkerPerformanceUtils.getPerformanceMetricsAsync}); + +/** + * Gets the version of Mapbox GL JS in use as specified in `package.json`, + * `CHANGELOG.md`, and the GitHub release. + * + * @var {string} version + * @example + * console.log(`Mapbox GL JS v${mapboxgl.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 (for example, a software WebGL renderer + * would be used). + * @return {boolean} + * @example + * // Show an alert if the browser does not support Mapbox GL + * if (!mapboxgl.supported()) { + * alert('Your browser does not support Mapbox GL'); + * } + * @see [Example: 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 the Arabic and Hebrew languages, which are written right-to-left. Mapbox Studio loads this plugin by default. + * + * @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, or no arguments if the plugin loads successfully. + * @param {boolean} lazy If set to `true`, MapboxGL will defer loading the plugin until right-to-left text is encountered, and + * right-to-left text will be rendered only after the plugin finishes loading. + * @example + * mapboxgl.setRTLTextPlugin('https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.2.0/mapbox-gl-rtl-text.js'); + * @see [Example: Add support for right-to-left scripts](https://www.mapbox.com/mapbox-gl-js/example/mapbox-gl-rtl-text/) + */ + +/** + * Gets the map's [RTL text plugin](https://www.mapbox.com/mapbox-gl-js/plugins/#mapbox-gl-rtl-text) status. + * The status can be `unavailable` (not requested or removed), `loading`, `loaded`, or `error`. + * If the status is `loaded` and the plugin is requested again, an error will be thrown. + * + * @function getRTLTextPluginStatus + * @example + * const pluginStatus = mapboxgl.getRTLTextPluginStatus(); + */ + +var mapboxgl = exported; // canary assert: used to confirm that asserts have been removed from production build -transform.assert_1(true, 'canary assert'); +ref_properties.assert_1(true, 'canary assert'); -return exported; +return mapboxgl; -}); +})); // @@ -76873,5 +80818,5 @@ var mapboxgl$1 = mapboxgl; return mapboxgl$1; -}))); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwYm94LWdsLWRldi5qcyIsInNvdXJjZXMiOlsiLi4vbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvYXNzZXJ0L25vZGVfbW9kdWxlcy91dGlsL3N1cHBvcnQvaXNCdWZmZXJCcm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIi4uL25vZGVfbW9kdWxlcy9hc3NlcnQvbm9kZV9tb2R1bGVzL3V0aWwvdXRpbC5qcyIsIi4uL25vZGVfbW9kdWxlcy9hc3NlcnQvYXNzZXJ0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdW5pdGJlemllci9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L3BvaW50LWdlb21ldHJ5L2luZGV4LmpzIiwiLi4vc3JjL3V0aWwvYnJvd3Nlci93aW5kb3cuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9jb21tb24uanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vbWF0MmQuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vbWF0NC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3ZlYzMuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWM0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vcXVhdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3F1YXQyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjMi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvZGVlcF9lcXVhbC5qcyIsIi4uL3NyYy91dGlsL3V0aWwuanMiLCIuLi9zcmMvdXRpbC9icm93c2VyLmpzIiwiLi4vc3JjL3V0aWwvY29uZmlnLmpzIiwiLi4vc3JjL3V0aWwvd2VicF9zdXBwb3J0ZWQuanMiLCIuLi9zcmMvdXRpbC9za3VfdG9rZW4uanMiLCIuLi9zcmMvdXRpbC9tYXBib3guanMiLCIuLi9zcmMvdXRpbC90aWxlX3JlcXVlc3RfY2FjaGUuanMiLCIuLi9zcmMvdXRpbC9hamF4LmpzIiwiLi4vc3JjL3V0aWwvZXZlbnRlZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9jb25zdGFudHMuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2V4dGVuZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3BhcnNpbmdfZXJyb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3Njb3BlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9jc3Njb2xvcnBhcnNlci9jc3Njb2xvcnBhcnNlci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2NvbGxhdG9yLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi92YWx1ZXMuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2xpdGVyYWwuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3J1bnRpbWVfZXJyb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2Fzc2VydGlvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvZm9ybWF0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbWFnZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29lcmNpb24uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2V2YWx1YXRpb25fY29udGV4dC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vY29tcG91bmRfZXhwcmVzc2lvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29sbGF0b3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL3dpdGhpbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaXNfY29uc3RhbnQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL3Zhci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vcGFyc2luZ19jb250ZXh0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9zdG9wcy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvc3RlcC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2NvbG9yX3NwYWNlcy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvYWxlc2NlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9sZXQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2F0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW5kZXhfb2YuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL21hdGNoLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jYXNlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9zbGljZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29tcGFyaXNvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbnVtYmVyX2Zvcm1hdC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGVuZ3RoLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbmRleC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvcmVzdWx0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9nZXRfdHlwZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2Z1bmN0aW9uL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX29iamVjdC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2FycmF5LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfbnVtYmVyLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZnVuY3Rpb24uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9leHByZXNzaW9uLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfYm9vbGVhbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2NvbG9yLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZW51bS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZmlsdGVyLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfcHJvcGVydHkuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9wYWludF9wcm9wZXJ0eS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2xheW91dF9wcm9wZXJ0eS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2xheWVyLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfc3RyaW5nLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfc291cmNlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfbGlnaHQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV90ZXJyYWluLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZm9nLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZm9ybWF0dGVkLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfaW1hZ2UuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9wcm9qZWN0aW9uLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGUuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9nbHlwaHNfdXJsLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGVfc3R5bGUubWluLmpzIiwiLi4vc3JjL3N0eWxlL3ZhbGlkYXRlX3N0eWxlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dyaWQtaW5kZXgvZ3JpZC1pbmRleC5qcyIsIi4uL3NyYy91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMiLCIuLi9zcmMvc3R5bGUvem9vbV9oaXN0b3J5LmpzIiwiLi4vc3JjL3V0aWwvaXNfY2hhcl9pbl91bmljb2RlX2Jsb2NrLmpzIiwiLi4vc3JjL3V0aWwvc2NyaXB0X2RldGVjdGlvbi5qcyIsIi4uL3NyYy9zb3VyY2UvcnRsX3RleHRfcGx1Z2luLmpzIiwiLi4vc3JjL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyIsIi4uL3NyYy9zdHlsZS9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3NoYWRlcnMvZW5jb2RlX2F0dHJpYnV0ZS5qcyIsIi4uL3NyYy91dGlsL3N0cnVjdF9hcnJheS5qcyIsIi4uL3NyYy9kYXRhL2FycmF5X3R5cGVzLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3BhdHRlcm5fYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9kYXNoX2F0dHJpYnV0ZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvbXVybXVyaGFzaC1qcy9tdXJtdXJoYXNoM19nYy5qcyIsIi4uL25vZGVfbW9kdWxlcy9tdXJtdXJoYXNoLWpzL211cm11cmhhc2gyX2djLmpzIiwiLi4vbm9kZV9tb2R1bGVzL211cm11cmhhc2gtanMvaW5kZXguanMiLCIuLi9zcmMvZGF0YS9mZWF0dXJlX3Bvc2l0aW9uX21hcC5qcyIsIi4uL3NyYy9yZW5kZXIvdW5pZm9ybV9iaW5kaW5nLmpzIiwiLi4vc3JjL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2NpcmNsZV9hdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL2RhdGEvc2VnbWVudC5qcyIsIi4uL3NyYy9kYXRhL2luZGV4X2FycmF5X3R5cGUuanMiLCIuLi9zcmMvZGF0YS9leHRlbnQuanMiLCIuLi9zcmMvZ2VvL2xuZ19sYXRfYm91bmRzLmpzIiwiLi4vc3JjL2dlby9sbmdfbGF0LmpzIiwiLi4vc3JjL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL3Jlc2FtcGxlLmpzIiwiLi4vc3JjL2RhdGEvbG9hZF9nZW9tZXRyeS5qcyIsIi4uL3NyYy9kYXRhL2V2YWx1YXRpb25fZmVhdHVyZS5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9jaXJjbGVfYnVja2V0LmpzIiwiLi4vc3JjL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzLmpzIiwiLi4vc3JjL3N0eWxlL3F1ZXJ5X3V0aWxzLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3V0aWwvcHJpbWl0aXZlcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9jaXJjbGVfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvaGVhdG1hcF9idWNrZXQuanMiLCIuLi9zcmMvdXRpbC9pbWFnZS5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvdXRpbC9jb2xvcl9yYW1wLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGlsbHNoYWRlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGlsbHNoYWRlX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfYXR0cmlidXRlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9xdWlja3NlbGVjdC9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2NsYXNzaWZ5X3JpbmdzLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3BhdHRlcm5fYnVja2V0X2ZlYXR1cmVzLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0LmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2F0dHJpYnV0ZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWxheWVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9pbmRleC5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9maWxsX2V4dHJ1c2lvbl9idWNrZXQuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9saW5lX2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvbGluZV9hdHRyaWJ1dGVzX2V4dC5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9saW5lX2J1Y2tldC5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9zeW1ib2xfYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9zeW1ib2wvb25lX2VtLmpzIiwiLi4vc3JjL3N5bWJvbC9zeW1ib2xfc2l6ZS5qcyIsIi4uL3NyYy9zeW1ib2wvdHJhbnNmb3JtX3RleHQuanMiLCIuLi9zcmMvc3ltYm9sL21lcmdlbGluZXMuanMiLCIuLi9zcmMvdXRpbC92ZXJ0aWNhbGl6ZV9wdW5jdHVhdGlvbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL3BiZi9pbmRleC5qcyIsIi4uL3NyYy9zdHlsZS9wYXJzZV9nbHlwaF9wYmYuanMiLCIuLi9ub2RlX21vZHVsZXMvcG90cGFjay9pbmRleC5tanMiLCIuLi9zcmMvcmVuZGVyL2ltYWdlX2F0bGFzLmpzIiwiLi4vc3JjL3N5bWJvbC9zaGFwaW5nLmpzIiwiLi4vc3JjL3N5bWJvbC9hbmNob3IuanMiLCIuLi9zcmMvc3ltYm9sL2NoZWNrX21heF9hbmdsZS5qcyIsIi4uL3NyYy9zeW1ib2wvZ2V0X2FuY2hvcnMuanMiLCIuLi9zcmMvc3ltYm9sL2NsaXBfbGluZS5qcyIsIi4uL3NyYy9zdHlsZS9sb2FkX2dseXBoX3JhbmdlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdGlueS1zZGYvaW5kZXguanMiLCIuLi9zcmMvcmVuZGVyL2dseXBoX21hbmFnZXIuanMiLCIuLi9zcmMvc3ltYm9sL3F1YWRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL3RpbnlxdWV1ZS9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2ZpbmRfcG9sZV9vZl9pbmFjY2Vzc2liaWxpdHkuanMiLCIuLi9zcmMvc3ltYm9sL3N5bWJvbF9sYXlvdXQuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldC5qcyIsIi4uL3NyYy91dGlsL3Jlc29sdmVfdG9rZW5zLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlL2Zvcm1hdF9zZWN0aW9uX292ZXJyaWRlLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9iYWNrZ3JvdW5kX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvYmFja2dyb3VuZF9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL3NreV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL3NreV9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9zdHlsZS9jcmVhdGVfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvcmVuZGVyL3RleHR1cmUuanMiLCIuLi9zcmMvcmVuZGVyL2xpbmVfYXRsYXMuanMiLCIuLi9zcmMvdXRpbC90aHJvdHRsZWRfaW52b2tlci5qcyIsIi4uL3NyYy91dGlsL3BlcmZvcm1hbmNlLmpzIiwiLi4vc3JjL3V0aWwvc2NoZWR1bGVyLmpzIiwiLi4vc3JjL3V0aWwvYWN0b3IuanMiLCIuLi9zcmMvc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvd2hvb3RzLWpzL2luZGV4Lm1qcyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9pZC5qcyIsIi4uL3NyYy9nbC9pbmRleF9idWZmZXIuanMiLCIuLi9zcmMvZ2wvdmVydGV4X2J1ZmZlci5qcyIsIi4uL3NyYy9nbC92YWx1ZS5qcyIsIi4uL3NyYy9nbC9mcmFtZWJ1ZmZlci5qcyIsIi4uL3NyYy9nbC9kZXB0aF9tb2RlLmpzIiwiLi4vc3JjL2dsL3N0ZW5jaWxfbW9kZS5qcyIsIi4uL3NyYy9nbC9jb2xvcl9tb2RlLmpzIiwiLi4vc3JjL2dsL2N1bGxfZmFjZV9tb2RlLmpzIiwiLi4vc3JjL2dsL2NvbnRleHQuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQuanMiLCIuLi9zcmMvdXRpbC9kaWN0aW9uYXJ5X2NvZGVyLmpzIiwiLi4vc3JjL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uLmpzIiwiLi4vc3JjL3NvdXJjZS9zb3VyY2Vfc3RhdGUuanMiLCIuLi9zcmMvZGF0YS9kZW1fdHJlZS5qcyIsIi4uL3NyYy9kYXRhL2RlbV9kYXRhLmpzIiwiLi4vc3JjL3NvdXJjZS90aWxlX2NhY2hlLmpzIiwiLi4vc3JjL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMiLCIuLi9zcmMvdGVycmFpbi9lbGV2YXRpb24uanMiLCIuLi9zcmMvZGF0YS9mZWF0dXJlX2luZGV4LmpzIiwiLi4vc3JjL3V0aWwvZGVidWcuanMiLCIuLi9zcmMvZGF0YS9wb3NfYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9kYXRhL2RlYnVnX3Zpei5qcyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9tZXNoLmpzIiwiLi4vc3JjL2RhdGEvYm91bmRzX2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvc291cmNlL3RpbGUuanMiLCIuLi9zcmMvdGVycmFpbi9nbG9iZV9hdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2dsb2JlX3RpbGVfdHJhbnNmb3JtLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2Zhcl96LmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2dsb2JlLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzIiwiLi4vc3JjL3JlbmRlci9nbHlwaF9hdGxhcy5qcyIsIi4uL3NyYy9zb3VyY2Uvd29ya2VyX3RpbGUuanMiLCIuLi9zcmMvc291cmNlL3ZlY3Rvcl90aWxlX3dvcmtlcl9zb3VyY2UuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3JlZl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2ZsYXRfdGlsZV90cmFuc2Zvcm0uanMiLCIuLi9zcmMvZ2VvL3Byb2plY3Rpb24vYWxiZXJzLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2VxdWFsX2VhcnRoLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2VxdWlyZWN0YW5ndWxhci5qcyIsIi4uL3NyYy9nZW8vcHJvamVjdGlvbi9sYW1iZXJ0LmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL21lcmNhdG9yLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL25hdHVyYWxfZWFydGguanMiLCIuLi9zcmMvZ2VvL3Byb2plY3Rpb24vd2lua2VsX3RyaXBlbC5qcyIsIi4uL3NyYy9nZW8vcHJvamVjdGlvbi9jeWxpbmRyaWNhbF9lcXVhbF9hcmVhLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2luZGV4LmpzIiwiLi4vc3JjL2dlby9lZGdlX2luc2V0cy5qcyIsIi4uL3NyYy91aS9mcmVlX2NhbWVyYS5qcyIsIi4uL3NyYy9nZW8vcHJvamVjdGlvbi9hZGp1c3RtZW50cy5qcyIsIi4uL3NyYy9nZW8vdHJhbnNmb3JtLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZ3JvdXBfYnlfbGF5b3V0LmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4LmpzIiwiLi4vc3JjL3NvdXJjZS9yYXN0ZXJfZGVtX3RpbGVfd29ya2VyX3NvdXJjZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L2dlb2pzb24tcmV3aW5kL2luZGV4LmpzIiwiLi4vc3JjL3NvdXJjZS9nZW9qc29uX3dyYXBwZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvdnQtcGJmL2xpYi9nZW9qc29uX3dyYXBwZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvdnQtcGJmL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvc29ydC5qcyIsIi4uL25vZGVfbW9kdWxlcy9rZGJ1c2gvc3JjL3JhbmdlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvd2l0aGluLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvc3VwZXJjbHVzdGVyL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3NpbXBsaWZ5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2ZlYXR1cmUuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9jbGlwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvdHJhbnNmb3JtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3RpbGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvaW5kZXguanMiLCIuLi9zcmMvc291cmNlL2dlb2pzb25fd29ya2VyX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2Uvd29ya2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvbWFwYm94LWdsLXN1cHBvcnRlZC9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2RvbS5qcyIsIi4uL3NyYy9zdHlsZS9sb2FkX3Nwcml0ZS5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9pbWFnZS5qcyIsIi4uL3NyYy9yZW5kZXIvaW1hZ2VfbWFuYWdlci5qcyIsIi4uL3NyYy9zdHlsZS9saWdodC5qcyIsIi4uL3NyYy9zdHlsZS90ZXJyYWluLmpzIiwiLi4vc3JjL3N0eWxlL2ZvZ19oZWxwZXJzLmpzIiwiLi4vc3JjL3N0eWxlL2ZvZy5qcyIsIi4uL3NyYy91dGlsL2Rpc3BhdGNoZXIuanMiLCIuLi9zcmMvc3R5bGUvcXVlcnlfZ2VvbWV0cnkuanMiLCIuLi9zcmMvc291cmNlL2xvYWRfdGlsZWpzb24uanMiLCIuLi9zcmMvc291cmNlL3RpbGVfYm91bmRzLmpzIiwiLi4vc3JjL3NvdXJjZS92ZWN0b3JfdGlsZV9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL3Jhc3Rlcl90aWxlX3NvdXJjZS5qcyIsIi4uL3NyYy91dGlsL29mZnNjcmVlbl9jYW52YXNfc3VwcG9ydGVkLmpzIiwiLi4vc3JjL3NvdXJjZS9yYXN0ZXJfZGVtX3RpbGVfc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9nZW9qc29uX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2UvaW1hZ2Vfc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS92aWRlb19zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL2NhbnZhc19zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2UvcXVlcnlfZmVhdHVyZXMuanMiLCIuLi9zcmMvdXRpbC9icm93c2VyL3dlYl93b3JrZXIuanMiLCIuLi9zcmMvdXRpbC93b3JrZXJfcG9vbC5qcyIsIi4uL3NyYy91dGlsL2dsb2JhbF93b3JrZXJfcG9vbC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2RlcmVmLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZW1wdHkuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9kaWZmLmpzIiwiLi4vc3JjL3N5bWJvbC9wYXRoX2ludGVycG9sYXRvci5qcyIsIi4uL3NyYy9zeW1ib2wvZ3JpZF9pbmRleC5qcyIsIi4uL3NyYy9zeW1ib2wvcHJvamVjdGlvbi5qcyIsIi4uL3NyYy9zeW1ib2wvY29sbGlzaW9uX2luZGV4LmpzIiwiLi4vc3JjL3N5bWJvbC9wbGFjZW1lbnQuanMiLCIuLi9zcmMvc3R5bGUvcGF1c2VhYmxlX3BsYWNlbWVudC5qcyIsIi4uL3NyYy9zeW1ib2wvY3Jvc3NfdGlsZV9zeW1ib2xfaW5kZXguanMiLCIuLi9zcmMvc3R5bGUvc3R5bGUuanMiLCIuLi9zcmMvc2hhZGVycy9zaGFkZXJzLmpzIiwiLi4vc3JjL3JlbmRlci92ZXJ0ZXhfYXJyYXlfb2JqZWN0LmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2hpbGxzaGFkZV9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2hpbGxzaGFkZS5qcyIsIi4uL3NyYy90ZXJyYWluL3RlcnJhaW5fcmFzdGVyX3Byb2dyYW0uanMiLCIuLi9zcmMvdGVycmFpbi9nbG9iZV9yYXN0ZXJfcHJvZ3JhbS5qcyIsIi4uL3NyYy90ZXJyYWluL2RyYXdfdGVycmFpbl9yYXN0ZXIuanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vY2xpcHBpbmdfbWFza19wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9yYXN0ZXJfZmFkZS5qcyIsIi4uL3NyYy90ZXJyYWluL3RlcnJhaW4uanMiLCIuLi9zcmMvcmVuZGVyL2ZvZy5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9wYXR0ZXJuLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2ZpbGxfZXh0cnVzaW9uX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vZmlsbF9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2NpcmNsZV9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2NvbGxpc2lvbl9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2RlYnVnX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vaGVhdG1hcF9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2xpbmVfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9yYXN0ZXJfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9zeW1ib2xfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9iYWNrZ3JvdW5kX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vc2t5Ym94X3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vc2t5Ym94X2NhcHR1cmVfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9wcm9ncmFtX3VuaWZvcm1zLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2NvbGxpc2lvbl9kZWJ1Zy5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19zeW1ib2wuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfY2lyY2xlLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2hlYXRtYXAuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfbGluZS5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19maWxsLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2ZpbGxfZXh0cnVzaW9uLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X3Jhc3Rlci5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19iYWNrZ3JvdW5kLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2RlYnVnLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2N1c3RvbS5qcyIsIi4uL3NyYy9yZW5kZXIvc2t5Ym94X2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvcmVuZGVyL3NreWJveF9nZW9tZXRyeS5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19za3kuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfZ2xvYmVfYXRtb3NwaGVyZS5qcyIsIi4uL3NyYy9yZW5kZXIvcGFpbnRlci5qcyIsIi4uL3NyYy91dGlsL3Rocm90dGxlLmpzIiwiLi4vc3JjL3VpL2hhc2guanMiLCIuLi9zcmMvdWkvaGFuZGxlcl9pbmVydGlhLmpzIiwiLi4vc3JjL3VpL2V2ZW50cy5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL21hcF9ldmVudC5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL2JveF96b29tLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvaGFuZGxlcl91dGlsLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvdGFwX3JlY29nbml6ZXIuanMiLCIuLi9zcmMvdWkvaGFuZGxlci90YXBfem9vbS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL21vdXNlLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvdG91Y2hfcGFuLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvdG91Y2hfem9vbV9yb3RhdGUuanMiLCIuLi9zcmMvdWkvaGFuZGxlci9rZXlib2FyZC5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL3Njcm9sbF96b29tLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvc2hpbS9kYmxjbGlja196b29tLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvY2xpY2tfem9vbS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL3RhcF9kcmFnX3pvb20uanMiLCIuLi9zcmMvdWkvaGFuZGxlci9zaGltL2RyYWdfcGFuLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvc2hpbS9kcmFnX3JvdGF0ZS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL3NoaW0vdG91Y2hfem9vbV9yb3RhdGUuanMiLCIuLi9zcmMvdWkvaGFuZGxlcl9tYW5hZ2VyLmpzIiwiLi4vc3JjL3VpL2NhbWVyYS5qcyIsIi4uL3NyYy91aS9jb250cm9sL2F0dHJpYnV0aW9uX2NvbnRyb2wuanMiLCIuLi9zcmMvdWkvY29udHJvbC9sb2dvX2NvbnRyb2wuanMiLCIuLi9zcmMvdXRpbC90YXNrX3F1ZXVlLmpzIiwiLi4vc3JjL3V0aWwvc21hcnRfd3JhcC5qcyIsIi4uL3NyYy91aS9hbmNob3IuanMiLCIuLi9zcmMvdWkvbWFya2VyLmpzIiwiLi4vc3JjL3V0aWwvZWFzZWRfdmFyaWFibGUuanMiLCIuLi9zcmMvdWkvZGVmYXVsdF9sb2NhbGUuanMiLCIuLi9zcmMvdWkvbWFwLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvbmF2aWdhdGlvbl9jb250cm9sLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvZ2VvbG9jYXRlX2NvbnRyb2wuanMiLCIuLi9zcmMvdWkvY29udHJvbC9zY2FsZV9jb250cm9sLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvZnVsbHNjcmVlbl9jb250cm9sLmpzIiwiLi4vc3JjL3VpL3BvcHVwLmpzIiwiLi4vc3JjL3V0aWwvd29ya2VyX3BlcmZvcm1hbmNlX3V0aWxzLmpzIiwiLi4vc3JjL2luZGV4LmpzIiwiLi4vcm9sbHVwL21hcGJveGdsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBvYmplY3RBc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbi8vIGNvbXBhcmUgYW5kIGlzQnVmZmVyIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvYmxvYi82ODBlOWU1ZTQ4OGYyMmFhYzI3NTk5YTU3ZGM4NDRhNjMxNTkyOGRkL2luZGV4LmpzXG4vLyBvcmlnaW5hbCBub3RpY2U6XG5cbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHggPSBhLmxlbmd0aDtcbiAgdmFyIHkgPSBiLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXTtcbiAgICAgIHkgPSBiW2ldO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmICh5IDwgeCkge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuZnVuY3Rpb24gaXNCdWZmZXIoYikge1xuICBpZiAoZ2xvYmFsLkJ1ZmZlciAmJiB0eXBlb2YgZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWwuQnVmZmVyLmlzQnVmZmVyKGIpO1xuICB9XG4gIHJldHVybiAhIShiICE9IG51bGwgJiYgYi5faXNCdWZmZXIpO1xufVxuXG4vLyBiYXNlZCBvbiBub2RlIGFzc2VydCwgb3JpZ2luYWwgbm90aWNlOlxuLy8gTkI6IFRoZSBVUkwgdG8gdGhlIENvbW1vbkpTIHNwZWMgaXMga2VwdCBqdXN0IGZvciB0cmFkaXRpb24uXG4vLyAgICAgbm9kZS1hc3NlcnQgaGFzIGV2b2x2ZWQgYSBsb3Qgc2luY2UgdGhlbiwgYm90aCBpbiBBUEkgYW5kIGJlaGF2aW9yLlxuXG4vLyBodHRwOi8vd2lraS5jb21tb25qcy5vcmcvd2lraS9Vbml0X1Rlc3RpbmcvMS4wXG4vL1xuLy8gVEhJUyBJUyBOT1QgVEVTVEVEIE5PUiBMSUtFTFkgVE8gV09SSyBPVVRTSURFIFY4IVxuLy9cbi8vIE9yaWdpbmFsbHkgZnJvbSBuYXJ3aGFsLmpzIChodHRwOi8vbmFyd2hhbGpzLm9yZylcbi8vIENvcHlyaWdodCAoYykgMjAwOSBUaG9tYXMgUm9iaW5zb24gPDI4MG5vcnRoLmNvbT5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAnU29mdHdhcmUnKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOXG4vLyBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OXG4vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsLycpO1xudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcFNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyIGZ1bmN0aW9uc0hhdmVOYW1lcyA9IChmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb28oKSB7fS5uYW1lID09PSAnZm9vJztcbn0oKSk7XG5mdW5jdGlvbiBwVG9TdHJpbmcgKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaik7XG59XG5mdW5jdGlvbiBpc1ZpZXcoYXJyYnVmKSB7XG4gIGlmIChpc0J1ZmZlcihhcnJidWYpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsLkFycmF5QnVmZmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhcnJidWYpO1xuICB9XG4gIGlmICghYXJyYnVmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChhcnJidWYgaW5zdGFuY2VvZiBEYXRhVmlldykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChhcnJidWYuYnVmZmVyICYmIGFycmJ1Zi5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbi8vIDEuIFRoZSBhc3NlcnQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0aGF0IHRocm93XG4vLyBBc3NlcnRpb25FcnJvcidzIHdoZW4gcGFydGljdWxhciBjb25kaXRpb25zIGFyZSBub3QgbWV0LiBUaGVcbi8vIGFzc2VydCBtb2R1bGUgbXVzdCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlLlxuXG52YXIgYXNzZXJ0ID0gbW9kdWxlLmV4cG9ydHMgPSBvaztcblxuLy8gMi4gVGhlIEFzc2VydGlvbkVycm9yIGlzIGRlZmluZWQgaW4gYXNzZXJ0LlxuLy8gbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7IG1lc3NhZ2U6IG1lc3NhZ2UsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiBhY3R1YWwsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IGV4cGVjdGVkIH0pXG5cbnZhciByZWdleCA9IC9cXHMqZnVuY3Rpb25cXHMrKFteXFwoXFxzXSopXFxzKi87XG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbGpoYXJiL2Z1bmN0aW9uLnByb3RvdHlwZS5uYW1lL2Jsb2IvYWRlZWVlYzhiZmNjNjA2OGIxODdkN2Q5ZmIzZDViYjFkM2EzMDg5OS9pbXBsZW1lbnRhdGlvbi5qc1xuZnVuY3Rpb24gZ2V0TmFtZShmdW5jKSB7XG4gIGlmICghdXRpbC5pc0Z1bmN0aW9uKGZ1bmMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMpIHtcbiAgICByZXR1cm4gZnVuYy5uYW1lO1xuICB9XG4gIHZhciBzdHIgPSBmdW5jLnRvU3RyaW5nKCk7XG4gIHZhciBtYXRjaCA9IHN0ci5tYXRjaChyZWdleCk7XG4gIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTtcbn1cbmFzc2VydC5Bc3NlcnRpb25FcnJvciA9IGZ1bmN0aW9uIEFzc2VydGlvbkVycm9yKG9wdGlvbnMpIHtcbiAgdGhpcy5uYW1lID0gJ0Fzc2VydGlvbkVycm9yJztcbiAgdGhpcy5hY3R1YWwgPSBvcHRpb25zLmFjdHVhbDtcbiAgdGhpcy5leHBlY3RlZCA9IG9wdGlvbnMuZXhwZWN0ZWQ7XG4gIHRoaXMub3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yO1xuICBpZiAob3B0aW9ucy5tZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubWVzc2FnZSA9IGdldE1lc3NhZ2UodGhpcyk7XG4gICAgdGhpcy5nZW5lcmF0ZWRNZXNzYWdlID0gdHJ1ZTtcbiAgfVxuICB2YXIgc3RhY2tTdGFydEZ1bmN0aW9uID0gb3B0aW9ucy5zdGFja1N0YXJ0RnVuY3Rpb24gfHwgZmFpbDtcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgc3RhY2tTdGFydEZ1bmN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBub24gdjggYnJvd3NlcnMgc28gd2UgY2FuIGhhdmUgYSBzdGFja3RyYWNlXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcigpO1xuICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgIHZhciBvdXQgPSBlcnIuc3RhY2s7XG5cbiAgICAgIC8vIHRyeSB0byBzdHJpcCB1c2VsZXNzIGZyYW1lc1xuICAgICAgdmFyIGZuX25hbWUgPSBnZXROYW1lKHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gICAgICB2YXIgaWR4ID0gb3V0LmluZGV4T2YoJ1xcbicgKyBmbl9uYW1lKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAvLyBvbmNlIHdlIGhhdmUgbG9jYXRlZCB0aGUgZnVuY3Rpb24gZnJhbWVcbiAgICAgICAgLy8gd2UgbmVlZCB0byBzdHJpcCBvdXQgZXZlcnl0aGluZyBiZWZvcmUgaXQgKGFuZCBpdHMgbGluZSlcbiAgICAgICAgdmFyIG5leHRfbGluZSA9IG91dC5pbmRleE9mKCdcXG4nLCBpZHggKyAxKTtcbiAgICAgICAgb3V0ID0gb3V0LnN1YnN0cmluZyhuZXh0X2xpbmUgKyAxKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGFjayA9IG91dDtcbiAgICB9XG4gIH1cbn07XG5cbi8vIGFzc2VydC5Bc3NlcnRpb25FcnJvciBpbnN0YW5jZW9mIEVycm9yXG51dGlsLmluaGVyaXRzKGFzc2VydC5Bc3NlcnRpb25FcnJvciwgRXJyb3IpO1xuXG5mdW5jdGlvbiB0cnVuY2F0ZShzLCBuKSB7XG4gIGlmICh0eXBlb2YgcyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPCBuID8gcyA6IHMuc2xpY2UoMCwgbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc3BlY3Qoc29tZXRoaW5nKSB7XG4gIGlmIChmdW5jdGlvbnNIYXZlTmFtZXMgfHwgIXV0aWwuaXNGdW5jdGlvbihzb21ldGhpbmcpKSB7XG4gICAgcmV0dXJuIHV0aWwuaW5zcGVjdChzb21ldGhpbmcpO1xuICB9XG4gIHZhciByYXduYW1lID0gZ2V0TmFtZShzb21ldGhpbmcpO1xuICB2YXIgbmFtZSA9IHJhd25hbWUgPyAnOiAnICsgcmF3bmFtZSA6ICcnO1xuICByZXR1cm4gJ1tGdW5jdGlvbicgKyAgbmFtZSArICddJztcbn1cbmZ1bmN0aW9uIGdldE1lc3NhZ2Uoc2VsZikge1xuICByZXR1cm4gdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmFjdHVhbCksIDEyOCkgKyAnICcgK1xuICAgICAgICAgc2VsZi5vcGVyYXRvciArICcgJyArXG4gICAgICAgICB0cnVuY2F0ZShpbnNwZWN0KHNlbGYuZXhwZWN0ZWQpLCAxMjgpO1xufVxuXG4vLyBBdCBwcmVzZW50IG9ubHkgdGhlIHRocmVlIGtleXMgbWVudGlvbmVkIGFib3ZlIGFyZSB1c2VkIGFuZFxuLy8gdW5kZXJzdG9vZCBieSB0aGUgc3BlYy4gSW1wbGVtZW50YXRpb25zIG9yIHN1YiBtb2R1bGVzIGNhbiBwYXNzXG4vLyBvdGhlciBrZXlzIHRvIHRoZSBBc3NlcnRpb25FcnJvcidzIGNvbnN0cnVjdG9yIC0gdGhleSB3aWxsIGJlXG4vLyBpZ25vcmVkLlxuXG4vLyAzLiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbXVzdCB0aHJvdyBhbiBBc3NlcnRpb25FcnJvclxuLy8gd2hlbiBhIGNvcnJlc3BvbmRpbmcgY29uZGl0aW9uIGlzIG5vdCBtZXQsIHdpdGggYSBtZXNzYWdlIHRoYXRcbi8vIG1heSBiZSB1bmRlZmluZWQgaWYgbm90IHByb3ZpZGVkLiAgQWxsIGFzc2VydGlvbiBtZXRob2RzIHByb3ZpZGVcbi8vIGJvdGggdGhlIGFjdHVhbCBhbmQgZXhwZWN0ZWQgdmFsdWVzIHRvIHRoZSBhc3NlcnRpb24gZXJyb3IgZm9yXG4vLyBkaXNwbGF5IHB1cnBvc2VzLlxuXG5mdW5jdGlvbiBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yLCBzdGFja1N0YXJ0RnVuY3Rpb24pIHtcbiAgdGhyb3cgbmV3IGFzc2VydC5Bc3NlcnRpb25FcnJvcih7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBhY3R1YWw6IGFjdHVhbCxcbiAgICBleHBlY3RlZDogZXhwZWN0ZWQsXG4gICAgb3BlcmF0b3I6IG9wZXJhdG9yLFxuICAgIHN0YWNrU3RhcnRGdW5jdGlvbjogc3RhY2tTdGFydEZ1bmN0aW9uXG4gIH0pO1xufVxuXG4vLyBFWFRFTlNJT04hIGFsbG93cyBmb3Igd2VsbCBiZWhhdmVkIGVycm9ycyBkZWZpbmVkIGVsc2V3aGVyZS5cbmFzc2VydC5mYWlsID0gZmFpbDtcblxuLy8gNC4gUHVyZSBhc3NlcnRpb24gdGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIHRydXRoeSwgYXMgZGV0ZXJtaW5lZFxuLy8gYnkgISFndWFyZC5cbi8vIGFzc2VydC5vayhndWFyZCwgbWVzc2FnZV9vcHQpO1xuLy8gVGhpcyBzdGF0ZW1lbnQgaXMgZXF1aXZhbGVudCB0byBhc3NlcnQuZXF1YWwodHJ1ZSwgISFndWFyZCxcbi8vIG1lc3NhZ2Vfb3B0KTsuIFRvIHRlc3Qgc3RyaWN0bHkgZm9yIHRoZSB2YWx1ZSB0cnVlLCB1c2Vcbi8vIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCBndWFyZCwgbWVzc2FnZV9vcHQpOy5cblxuZnVuY3Rpb24gb2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09JywgYXNzZXJ0Lm9rKTtcbn1cbmFzc2VydC5vayA9IG9rO1xuXG4vLyA1LiBUaGUgZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIHNoYWxsb3csIGNvZXJjaXZlIGVxdWFsaXR5IHdpdGhcbi8vID09LlxuLy8gYXNzZXJ0LmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gZXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9IGV4cGVjdGVkKSBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5lcXVhbCk7XG59O1xuXG4vLyA2LiBUaGUgbm9uLWVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBmb3Igd2hldGhlciB0d28gb2JqZWN0cyBhcmUgbm90IGVxdWFsXG4vLyB3aXRoICE9IGFzc2VydC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uIG5vdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCA9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9JywgYXNzZXJ0Lm5vdEVxdWFsKTtcbiAgfVxufTtcblxuLy8gNy4gVGhlIGVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBhIGRlZXAgZXF1YWxpdHkgcmVsYXRpb24uXG4vLyBhc3NlcnQuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LmRlZXBFcXVhbCA9IGZ1bmN0aW9uIGRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBmYWxzZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwRXF1YWwnLCBhc3NlcnQuZGVlcEVxdWFsKTtcbiAgfVxufTtcblxuYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIGRlZXBTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmICghX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ2RlZXBTdHJpY3RFcXVhbCcsIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIHN0cmljdCwgbWVtb3MpIHtcbiAgLy8gNy4xLiBBbGwgaWRlbnRpY2FsIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgYXMgZGV0ZXJtaW5lZCBieSA9PT0uXG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAmJiBpc0J1ZmZlcihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gY29tcGFyZShhY3R1YWwsIGV4cGVjdGVkKSA9PT0gMDtcblxuICAvLyA3LjIuIElmIHRoZSBleHBlY3RlZCB2YWx1ZSBpcyBhIERhdGUgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIERhdGUgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoZSBzYW1lIHRpbWUuXG4gIH0gZWxzZSBpZiAodXRpbC5pc0RhdGUoYWN0dWFsKSAmJiB1dGlsLmlzRGF0ZShleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gYWN0dWFsLmdldFRpbWUoKSA9PT0gZXhwZWN0ZWQuZ2V0VGltZSgpO1xuXG4gIC8vIDcuMyBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCB0aGUgYWN0dWFsIHZhbHVlIGlzXG4gIC8vIGVxdWl2YWxlbnQgaWYgaXQgaXMgYWxzbyBhIFJlZ0V4cCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzb3VyY2UgYW5kXG4gIC8vIHByb3BlcnRpZXMgKGBnbG9iYWxgLCBgbXVsdGlsaW5lYCwgYGxhc3RJbmRleGAsIGBpZ25vcmVDYXNlYCkuXG4gIH0gZWxzZSBpZiAodXRpbC5pc1JlZ0V4cChhY3R1YWwpICYmIHV0aWwuaXNSZWdFeHAoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5zb3VyY2UgPT09IGV4cGVjdGVkLnNvdXJjZSAmJlxuICAgICAgICAgICBhY3R1YWwuZ2xvYmFsID09PSBleHBlY3RlZC5nbG9iYWwgJiZcbiAgICAgICAgICAgYWN0dWFsLm11bHRpbGluZSA9PT0gZXhwZWN0ZWQubXVsdGlsaW5lICYmXG4gICAgICAgICAgIGFjdHVhbC5sYXN0SW5kZXggPT09IGV4cGVjdGVkLmxhc3RJbmRleCAmJlxuICAgICAgICAgICBhY3R1YWwuaWdub3JlQ2FzZSA9PT0gZXhwZWN0ZWQuaWdub3JlQ2FzZTtcblxuICAvLyA3LjQuIE90aGVyIHBhaXJzIHRoYXQgZG8gbm90IGJvdGggcGFzcyB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcsXG4gIC8vIGVxdWl2YWxlbmNlIGlzIGRldGVybWluZWQgYnkgPT0uXG4gIH0gZWxzZSBpZiAoKGFjdHVhbCA9PT0gbnVsbCB8fCB0eXBlb2YgYWN0dWFsICE9PSAnb2JqZWN0JykgJiZcbiAgICAgICAgICAgICAoZXhwZWN0ZWQgPT09IG51bGwgfHwgdHlwZW9mIGV4cGVjdGVkICE9PSAnb2JqZWN0JykpIHtcbiAgICByZXR1cm4gc3RyaWN0ID8gYWN0dWFsID09PSBleHBlY3RlZCA6IGFjdHVhbCA9PSBleHBlY3RlZDtcblxuICAvLyBJZiBib3RoIHZhbHVlcyBhcmUgaW5zdGFuY2VzIG9mIHR5cGVkIGFycmF5cywgd3JhcCB0aGVpciB1bmRlcmx5aW5nXG4gIC8vIEFycmF5QnVmZmVycyBpbiBhIEJ1ZmZlciBlYWNoIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlXG4gIC8vIFRoaXMgb3B0aW1pemF0aW9uIHJlcXVpcmVzIHRoZSBhcnJheXMgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGNoZWNrZWQgYnlcbiAgLy8gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAoYWthIHBUb1N0cmluZykuIE5ldmVyIHBlcmZvcm0gYmluYXJ5XG4gIC8vIGNvbXBhcmlzb25zIGZvciBGbG9hdCpBcnJheXMsIHRob3VnaCwgc2luY2UgZS5nLiArMCA9PT0gLTAgYnV0IHRoZWlyXG4gIC8vIGJpdCBwYXR0ZXJucyBhcmUgbm90IGlkZW50aWNhbC5cbiAgfSBlbHNlIGlmIChpc1ZpZXcoYWN0dWFsKSAmJiBpc1ZpZXcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgcFRvU3RyaW5nKGFjdHVhbCkgPT09IHBUb1N0cmluZyhleHBlY3RlZCkgJiZcbiAgICAgICAgICAgICAhKGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fFxuICAgICAgICAgICAgICAgYWN0dWFsIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSkge1xuICAgIHJldHVybiBjb21wYXJlKG5ldyBVaW50OEFycmF5KGFjdHVhbC5idWZmZXIpLFxuICAgICAgICAgICAgICAgICAgIG5ldyBVaW50OEFycmF5KGV4cGVjdGVkLmJ1ZmZlcikpID09PSAwO1xuXG4gIC8vIDcuNSBGb3IgYWxsIG90aGVyIE9iamVjdCBwYWlycywgaW5jbHVkaW5nIEFycmF5IG9iamVjdHMsIGVxdWl2YWxlbmNlIGlzXG4gIC8vIGRldGVybWluZWQgYnkgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChhcyB2ZXJpZmllZFxuICAvLyB3aXRoIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCksIHRoZSBzYW1lIHNldCBvZiBrZXlzXG4gIC8vIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLCBlcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnlcbiAgLy8gY29ycmVzcG9uZGluZyBrZXksIGFuZCBhbiBpZGVudGljYWwgJ3Byb3RvdHlwZScgcHJvcGVydHkuIE5vdGU6IHRoaXNcbiAgLy8gYWNjb3VudHMgZm9yIGJvdGggbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcyBvbiBBcnJheXMuXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYWN0dWFsKSAhPT0gaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG1lbW9zID0gbWVtb3MgfHwge2FjdHVhbDogW10sIGV4cGVjdGVkOiBbXX07XG5cbiAgICB2YXIgYWN0dWFsSW5kZXggPSBtZW1vcy5hY3R1YWwuaW5kZXhPZihhY3R1YWwpO1xuICAgIGlmIChhY3R1YWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIGlmIChhY3R1YWxJbmRleCA9PT0gbWVtb3MuZXhwZWN0ZWQuaW5kZXhPZihleHBlY3RlZCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVtb3MuYWN0dWFsLnB1c2goYWN0dWFsKTtcbiAgICBtZW1vcy5leHBlY3RlZC5wdXNoKGV4cGVjdGVkKTtcblxuICAgIHJldHVybiBvYmpFcXVpdihhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyhvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xufVxuXG5mdW5jdGlvbiBvYmpFcXVpdihhLCBiLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSB7XG4gIGlmIChhID09PSBudWxsIHx8IGEgPT09IHVuZGVmaW5lZCB8fCBiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gZmFsc2U7XG4gIC8vIGlmIG9uZSBpcyBhIHByaW1pdGl2ZSwgdGhlIG90aGVyIG11c3QgYmUgc2FtZVxuICBpZiAodXRpbC5pc1ByaW1pdGl2ZShhKSB8fCB1dGlsLmlzUHJpbWl0aXZlKGIpKVxuICAgIHJldHVybiBhID09PSBiO1xuICBpZiAoc3RyaWN0ICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihhKSAhPT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGIpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgdmFyIGFJc0FyZ3MgPSBpc0FyZ3VtZW50cyhhKTtcbiAgdmFyIGJJc0FyZ3MgPSBpc0FyZ3VtZW50cyhiKTtcbiAgaWYgKChhSXNBcmdzICYmICFiSXNBcmdzKSB8fCAoIWFJc0FyZ3MgJiYgYklzQXJncykpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBpZiAoYUlzQXJncykge1xuICAgIGEgPSBwU2xpY2UuY2FsbChhKTtcbiAgICBiID0gcFNsaWNlLmNhbGwoYik7XG4gICAgcmV0dXJuIF9kZWVwRXF1YWwoYSwgYiwgc3RyaWN0KTtcbiAgfVxuICB2YXIga2EgPSBvYmplY3RLZXlzKGEpO1xuICB2YXIga2IgPSBvYmplY3RLZXlzKGIpO1xuICB2YXIga2V5LCBpO1xuICAvLyBoYXZpbmcgdGhlIHNhbWUgbnVtYmVyIG9mIG93bmVkIHByb3BlcnRpZXMgKGtleXMgaW5jb3Jwb3JhdGVzXG4gIC8vIGhhc093blByb3BlcnR5KVxuICBpZiAoa2EubGVuZ3RoICE9PSBrYi5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvL3RoZSBzYW1lIHNldCBvZiBrZXlzIChhbHRob3VnaCBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgb3JkZXIpLFxuICBrYS5zb3J0KCk7XG4gIGtiLnNvcnQoKTtcbiAgLy9+fn5jaGVhcCBrZXkgdGVzdFxuICBmb3IgKGkgPSBrYS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmIChrYVtpXSAhPT0ga2JbaV0pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9lcXVpdmFsZW50IHZhbHVlcyBmb3IgZXZlcnkgY29ycmVzcG9uZGluZyBrZXksIGFuZFxuICAvL35+fnBvc3NpYmx5IGV4cGVuc2l2ZSBkZWVwIHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBrZXkgPSBrYVtpXTtcbiAgICBpZiAoIV9kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0sIHN0cmljdCwgYWN0dWFsVmlzaXRlZE9iamVjdHMpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyA4LiBUaGUgbm9uLWVxdWl2YWxlbmNlIGFzc2VydGlvbiB0ZXN0cyBmb3IgYW55IGRlZXAgaW5lcXVhbGl0eS5cbi8vIGFzc2VydC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RGVlcEVxdWFsID0gZnVuY3Rpb24gbm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnbm90RGVlcEVxdWFsJywgYXNzZXJ0Lm5vdERlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWwgPSBub3REZWVwU3RyaWN0RXF1YWw7XG5mdW5jdGlvbiBub3REZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCB0cnVlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBTdHJpY3RFcXVhbCcsIG5vdERlZXBTdHJpY3RFcXVhbCk7XG4gIH1cbn1cblxuXG4vLyA5LiBUaGUgc3RyaWN0IGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzdHJpY3QgZXF1YWxpdHksIGFzIGRldGVybWluZWQgYnkgPT09LlxuLy8gYXNzZXJ0LnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnN0cmljdEVxdWFsID0gZnVuY3Rpb24gc3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJz09PScsIGFzc2VydC5zdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDEwLiBUaGUgc3RyaWN0IG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHN0cmljdCBpbmVxdWFsaXR5LCBhc1xuLy8gZGV0ZXJtaW5lZCBieSAhPT0uICBhc3NlcnQubm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT09IGV4cGVjdGVkKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnIT09JywgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkge1xuICBpZiAoIWFjdHVhbCB8fCAhZXhwZWN0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV4cGVjdGVkKSA9PSAnW29iamVjdCBSZWdFeHBdJykge1xuICAgIHJldHVybiBleHBlY3RlZC50ZXN0KGFjdHVhbCk7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSWdub3JlLiAgVGhlIGluc3RhbmNlb2YgY2hlY2sgZG9lc24ndCB3b3JrIGZvciBhcnJvdyBmdW5jdGlvbnMuXG4gIH1cblxuICBpZiAoRXJyb3IuaXNQcm90b3R5cGVPZihleHBlY3RlZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZXhwZWN0ZWQuY2FsbCh7fSwgYWN0dWFsKSA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gX3RyeUJsb2NrKGJsb2NrKSB7XG4gIHZhciBlcnJvcjtcbiAgdHJ5IHtcbiAgICBibG9jaygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3IgPSBlO1xuICB9XG4gIHJldHVybiBlcnJvcjtcbn1cblxuZnVuY3Rpb24gX3Rocm93cyhzaG91bGRUaHJvdywgYmxvY2ssIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIHZhciBhY3R1YWw7XG5cbiAgaWYgKHR5cGVvZiBibG9jayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYmxvY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgbWVzc2FnZSA9IGV4cGVjdGVkO1xuICAgIGV4cGVjdGVkID0gbnVsbDtcbiAgfVxuXG4gIGFjdHVhbCA9IF90cnlCbG9jayhibG9jayk7XG5cbiAgbWVzc2FnZSA9IChleHBlY3RlZCAmJiBleHBlY3RlZC5uYW1lID8gJyAoJyArIGV4cGVjdGVkLm5hbWUgKyAnKS4nIDogJy4nKSArXG4gICAgICAgICAgICAobWVzc2FnZSA/ICcgJyArIG1lc3NhZ2UgOiAnLicpO1xuXG4gIGlmIChzaG91bGRUaHJvdyAmJiAhYWN0dWFsKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnTWlzc2luZyBleHBlY3RlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICB2YXIgdXNlclByb3ZpZGVkTWVzc2FnZSA9IHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJztcbiAgdmFyIGlzVW53YW50ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgdXRpbC5pc0Vycm9yKGFjdHVhbCk7XG4gIHZhciBpc1VuZXhwZWN0ZWRFeGNlcHRpb24gPSAhc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmICFleHBlY3RlZDtcblxuICBpZiAoKGlzVW53YW50ZWRFeGNlcHRpb24gJiZcbiAgICAgIHVzZXJQcm92aWRlZE1lc3NhZ2UgJiZcbiAgICAgIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fFxuICAgICAgaXNVbmV4cGVjdGVkRXhjZXB0aW9uKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCAnR290IHVud2FudGVkIGV4Y2VwdGlvbicgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGlmICgoc2hvdWxkVGhyb3cgJiYgYWN0dWFsICYmIGV4cGVjdGVkICYmXG4gICAgICAhZXhwZWN0ZWRFeGNlcHRpb24oYWN0dWFsLCBleHBlY3RlZCkpIHx8ICghc2hvdWxkVGhyb3cgJiYgYWN0dWFsKSkge1xuICAgIHRocm93IGFjdHVhbDtcbiAgfVxufVxuXG4vLyAxMS4gRXhwZWN0ZWQgdG8gdGhyb3cgYW4gZXJyb3I6XG4vLyBhc3NlcnQudGhyb3dzKGJsb2NrLCBFcnJvcl9vcHQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0LnRocm93cyA9IGZ1bmN0aW9uKGJsb2NrLCAvKm9wdGlvbmFsKi9lcnJvciwgLypvcHRpb25hbCovbWVzc2FnZSkge1xuICBfdGhyb3dzKHRydWUsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG4vLyBFWFRFTlNJT04hIFRoaXMgaXMgYW5ub3lpbmcgdG8gd3JpdGUgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbmFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyhmYWxzZSwgYmxvY2ssIGVycm9yLCBtZXNzYWdlKTtcbn07XG5cbmFzc2VydC5pZkVycm9yID0gZnVuY3Rpb24oZXJyKSB7IGlmIChlcnIpIHRocm93IGVycjsgfTtcblxuLy8gRXhwb3NlIGEgc3RyaWN0IG9ubHkgdmFyaWFudCBvZiBhc3NlcnRcbmZ1bmN0aW9uIHN0cmljdCh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSBmYWlsKHZhbHVlLCB0cnVlLCBtZXNzYWdlLCAnPT0nLCBzdHJpY3QpO1xufVxuYXNzZXJ0LnN0cmljdCA9IG9iamVjdEFzc2lnbihzdHJpY3QsIGFzc2VydCwge1xuICBlcXVhbDogYXNzZXJ0LnN0cmljdEVxdWFsLFxuICBkZWVwRXF1YWw6IGFzc2VydC5kZWVwU3RyaWN0RXF1YWwsXG4gIG5vdEVxdWFsOiBhc3NlcnQubm90U3RyaWN0RXF1YWwsXG4gIG5vdERlZXBFcXVhbDogYXNzZXJ0Lm5vdERlZXBTdHJpY3RFcXVhbFxufSk7XG5hc3NlcnQuc3RyaWN0LnN0cmljdCA9IGFzc2VydC5zdHJpY3Q7XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59O1xuIiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbiAqIGFyZSBtZXQ6XG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRVxuICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSXG4gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUlxuICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsXG4gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sXG4gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1JcbiAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUllcbiAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICpcbiAqIFBvcnRlZCBmcm9tIFdlYmtpdFxuICogaHR0cDovL3N2bi53ZWJraXQub3JnL3JlcG9zaXRvcnkvd2Via2l0L3RydW5rL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1VuaXRCZXppZXIuaFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gVW5pdEJlemllcjtcblxuZnVuY3Rpb24gVW5pdEJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIHBvbHlub21pYWwgY29lZmZpY2llbnRzLCBpbXBsaWNpdCBmaXJzdCBhbmQgbGFzdCBjb250cm9sIHBvaW50cyBhcmUgKDAsMCkgYW5kICgxLDEpLlxuICAgIHRoaXMuY3ggPSAzLjAgKiBwMXg7XG4gICAgdGhpcy5ieCA9IDMuMCAqIChwMnggLSBwMXgpIC0gdGhpcy5jeDtcbiAgICB0aGlzLmF4ID0gMS4wIC0gdGhpcy5jeCAtIHRoaXMuYng7XG5cbiAgICB0aGlzLmN5ID0gMy4wICogcDF5O1xuICAgIHRoaXMuYnkgPSAzLjAgKiAocDJ5IC0gcDF5KSAtIHRoaXMuY3k7XG4gICAgdGhpcy5heSA9IDEuMCAtIHRoaXMuY3kgLSB0aGlzLmJ5O1xuXG4gICAgdGhpcy5wMXggPSBwMXg7XG4gICAgdGhpcy5wMXkgPSBwMnk7XG4gICAgdGhpcy5wMnggPSBwMng7XG4gICAgdGhpcy5wMnkgPSBwMnk7XG59XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNhbXBsZUN1cnZlWCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAvLyBgYXggdF4zICsgYnggdF4yICsgY3ggdCcgZXhwYW5kZWQgdXNpbmcgSG9ybmVyJ3MgcnVsZS5cbiAgICByZXR1cm4gKCh0aGlzLmF4ICogdCArIHRoaXMuYngpICogdCArIHRoaXMuY3gpICogdDtcbn07XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNhbXBsZUN1cnZlWSA9IGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gKCh0aGlzLmF5ICogdCArIHRoaXMuYnkpICogdCArIHRoaXMuY3kpICogdDtcbn07XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVggPSBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuICgzLjAgKiB0aGlzLmF4ICogdCArIDIuMCAqIHRoaXMuYngpICogdCArIHRoaXMuY3g7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zb2x2ZUN1cnZlWCA9IGZ1bmN0aW9uKHgsIGVwc2lsb24pIHtcbiAgICBpZiAodHlwZW9mIGVwc2lsb24gPT09ICd1bmRlZmluZWQnKSBlcHNpbG9uID0gMWUtNjtcblxuICAgIHZhciB0MCwgdDEsIHQyLCB4MiwgaTtcblxuICAgIC8vIEZpcnN0IHRyeSBhIGZldyBpdGVyYXRpb25zIG9mIE5ld3RvbidzIG1ldGhvZCAtLSBub3JtYWxseSB2ZXJ5IGZhc3QuXG4gICAgZm9yICh0MiA9IHgsIGkgPSAwOyBpIDwgODsgaSsrKSB7XG5cbiAgICAgICAgeDIgPSB0aGlzLnNhbXBsZUN1cnZlWCh0MikgLSB4O1xuICAgICAgICBpZiAoTWF0aC5hYnMoeDIpIDwgZXBzaWxvbikgcmV0dXJuIHQyO1xuXG4gICAgICAgIHZhciBkMiA9IHRoaXMuc2FtcGxlQ3VydmVEZXJpdmF0aXZlWCh0Mik7XG4gICAgICAgIGlmIChNYXRoLmFicyhkMikgPCAxZS02KSBicmVhaztcblxuICAgICAgICB0MiA9IHQyIC0geDIgLyBkMjtcbiAgICB9XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGJpc2VjdGlvbiBtZXRob2QgZm9yIHJlbGlhYmlsaXR5LlxuICAgIHQwID0gMC4wO1xuICAgIHQxID0gMS4wO1xuICAgIHQyID0geDtcblxuICAgIGlmICh0MiA8IHQwKSByZXR1cm4gdDA7XG4gICAgaWYgKHQyID4gdDEpIHJldHVybiB0MTtcblxuICAgIHdoaWxlICh0MCA8IHQxKSB7XG5cbiAgICAgICAgeDIgPSB0aGlzLnNhbXBsZUN1cnZlWCh0Mik7XG4gICAgICAgIGlmIChNYXRoLmFicyh4MiAtIHgpIDwgZXBzaWxvbikgcmV0dXJuIHQyO1xuXG4gICAgICAgIGlmICh4ID4geDIpIHtcbiAgICAgICAgICAgIHQwID0gdDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0MSA9IHQyO1xuICAgICAgICB9XG5cbiAgICAgICAgdDIgPSAodDEgLSB0MCkgKiAwLjUgKyB0MDtcbiAgICB9XG5cbiAgICAvLyBGYWlsdXJlLlxuICAgIHJldHVybiB0Mjtcbn07XG5cblVuaXRCZXppZXIucHJvdG90eXBlLnNvbHZlID0gZnVuY3Rpb24oeCwgZXBzaWxvbikge1xuICAgIHJldHVybiB0aGlzLnNhbXBsZUN1cnZlWSh0aGlzLnNvbHZlQ3VydmVYKHgsIGVwc2lsb24pKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbi8qKlxuICogQSBzdGFuZGFsb25lIHBvaW50IGdlb21ldHJ5IHdpdGggdXNlZnVsIGFjY2Vzc29yLCBjb21wYXJpc29uLCBhbmRcbiAqIG1vZGlmaWNhdGlvbiBtZXRob2RzLlxuICpcbiAqIEBjbGFzcyBQb2ludFxuICogQHBhcmFtIHtOdW1iZXJ9IHggdGhlIHgtY29vcmRpbmF0ZS4gdGhpcyBjb3VsZCBiZSBsb25naXR1ZGUgb3Igc2NyZWVuXG4gKiBwaXhlbHMsIG9yIGFueSBvdGhlciBzb3J0IG9mIHVuaXQuXG4gKiBAcGFyYW0ge051bWJlcn0geSB0aGUgeS1jb29yZGluYXRlLiB0aGlzIGNvdWxkIGJlIGxhdGl0dWRlIG9yIHNjcmVlblxuICogcGl4ZWxzLCBvciBhbnkgb3RoZXIgc29ydCBvZiB1bml0LlxuICogQGV4YW1wbGVcbiAqIHZhciBwb2ludCA9IG5ldyBQb2ludCgtNzcsIDM4KTtcbiAqL1xuZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbn1cblxuUG9pbnQucHJvdG90eXBlID0ge1xuXG4gICAgLyoqXG4gICAgICogQ2xvbmUgdGhpcyBwb2ludCwgcmV0dXJuaW5nIGEgbmV3IHBvaW50IHRoYXQgY2FuIGJlIG1vZGlmaWVkXG4gICAgICogd2l0aG91dCBhZmZlY3RpbmcgdGhlIG9sZCBvbmUuXG4gICAgICogQHJldHVybiB7UG9pbnR9IHRoZSBjbG9uZVxuICAgICAqL1xuICAgIGNsb25lOiBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLngsIHRoaXMueSk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIHRvIGFub3RoZXIgcG9pbnQsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgYWRkOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQocCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgdG8gZnJvbSBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBzdWI6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3N1YihwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyBieSBwb2ludCxcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBtdWx0QnlQb2ludDogICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0QnlQb2ludChwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIERpdmlkZSB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgYnkgcG9pbnQsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgZGl2QnlQb2ludDogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2QnlQb2ludChwKTsgfSxcblxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyBieSBhIGZhY3RvcixcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBrIGZhY3RvclxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBtdWx0OiAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHQoayk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXZpZGUgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IGEgZmFjdG9yLFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IGsgZmFjdG9yXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIGRpdjogICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fZGl2KGspOyB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHRoaXMgcG9pbnQgYXJvdW5kIHRoZSAwLCAwIG9yaWdpbiBieSBhbiBhbmdsZSBhLFxuICAgICAqIGdpdmVuIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYSBhbmdsZSB0byByb3RhdGUgYXJvdW5kLCBpbiByYWRpYW5zXG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIHJvdGF0ZTogIGZ1bmN0aW9uKGEpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKGEpOyB9LFxuXG4gICAgLyoqXG4gICAgICogUm90YXRlIHRoaXMgcG9pbnQgYXJvdW5kIHAgcG9pbnQgYnkgYW4gYW5nbGUgYSxcbiAgICAgKiBnaXZlbiBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGEgYW5nbGUgdG8gcm90YXRlIGFyb3VuZCwgaW4gcmFkaWFuc1xuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgUG9pbnQgdG8gcm90YXRlIGFyb3VuZFxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICByb3RhdGVBcm91bmQ6ICBmdW5jdGlvbihhLHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlQXJvdW5kKGEscCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0aGlzIHBvaW50IGJ5IGEgNHgxIHRyYW5zZm9ybWF0aW9uIG1hdHJpeFxuICAgICAqIEBwYXJhbSB7QXJyYXk8TnVtYmVyPn0gbSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgbWF0TXVsdDogZnVuY3Rpb24obSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tYXRNdWx0KG0pOyB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoaXMgcG9pbnQgYnV0IGFzIGEgdW5pdCB2ZWN0b3IgZnJvbSAwLCAwLCBtZWFuaW5nXG4gICAgICogdGhhdCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgcmVzdWx0aW5nIHBvaW50IHRvIHRoZSAwLCAwXG4gICAgICogY29vcmRpbmF0ZSB3aWxsIGJlIGVxdWFsIHRvIDEgYW5kIHRoZSBhbmdsZSBmcm9tIHRoZSByZXN1bHRpbmdcbiAgICAgKiBwb2ludCB0byB0aGUgMCwgMCBjb29yZGluYXRlIHdpbGwgYmUgdGhlIHNhbWUgYXMgYmVmb3JlLlxuICAgICAqIEByZXR1cm4ge1BvaW50fSB1bml0IHZlY3RvciBwb2ludFxuICAgICAqL1xuICAgIHVuaXQ6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl91bml0KCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIGEgcGVycGVuZGljdWxhciBwb2ludCwgd2hlcmUgdGhlIG5ldyB5IGNvb3JkaW5hdGVcbiAgICAgKiBpcyB0aGUgb2xkIHggY29vcmRpbmF0ZSBhbmQgdGhlIG5ldyB4IGNvb3JkaW5hdGUgaXMgdGhlIG9sZCB5XG4gICAgICogY29vcmRpbmF0ZSBtdWx0aXBsaWVkIGJ5IC0xXG4gICAgICogQHJldHVybiB7UG9pbnR9IHBlcnBlbmRpY3VsYXIgcG9pbnRcbiAgICAgKi9cbiAgICBwZXJwOiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpOyB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgdmVyc2lvbiBvZiB0aGlzIHBvaW50IHdpdGggdGhlIHggJiB5IGNvb3JkaW5hdGVzXG4gICAgICogcm91bmRlZCB0byBpbnRlZ2Vycy5cbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gcm91bmRlZCBwb2ludFxuICAgICAqL1xuICAgIHJvdW5kOiAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpOyB9LFxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBtYWdpdHVkZSBvZiB0aGlzIHBvaW50OiB0aGlzIGlzIHRoZSBFdWNsaWRlYW5cbiAgICAgKiBkaXN0YW5jZSBmcm9tIHRoZSAwLCAwIGNvb3JkaW5hdGUgdG8gdGhpcyBwb2ludCdzIHggYW5kIHlcbiAgICAgKiBjb29yZGluYXRlcy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IG1hZ25pdHVkZVxuICAgICAqL1xuICAgIG1hZzogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSnVkZ2Ugd2hldGhlciB0aGlzIHBvaW50IGlzIGVxdWFsIHRvIGFub3RoZXIgcG9pbnQsIHJldHVybmluZ1xuICAgICAqIHRydWUgb3IgZmFsc2UuXG4gICAgICogQHBhcmFtIHtQb2ludH0gb3RoZXIgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gd2hldGhlciB0aGUgcG9pbnRzIGFyZSBlcXVhbFxuICAgICAqL1xuICAgIGVxdWFsczogZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9PT0gb3RoZXIueCAmJlxuICAgICAgICAgICAgICAgdGhpcy55ID09PSBvdGhlci55O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBwb2ludCB0byBhbm90aGVyIHBvaW50XG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAgICovXG4gICAgZGlzdDogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcihwKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIHBvaW50IHRvIGFub3RoZXIgcG9pbnQsXG4gICAgICogd2l0aG91dCB0aGUgc3F1YXJlIHJvb3Qgc3RlcC4gVXNlZnVsIGlmIHlvdSdyZSBjb21wYXJpbmdcbiAgICAgKiByZWxhdGl2ZSBkaXN0YW5jZXMuXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAgICovXG4gICAgZGlzdFNxcjogZnVuY3Rpb24ocCkge1xuICAgICAgICB2YXIgZHggPSBwLnggLSB0aGlzLngsXG4gICAgICAgICAgICBkeSA9IHAueSAtIHRoaXMueTtcbiAgICAgICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFuZ2xlIGZyb20gdGhlIDAsIDAgY29vcmRpbmF0ZSB0byB0aGlzIHBvaW50LCBpbiByYWRpYW5zXG4gICAgICogY29vcmRpbmF0ZXMuXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICAgICAqL1xuICAgIGFuZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55LCB0aGlzLngpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFuZ2xlIGZyb20gdGhpcyBwb2ludCB0byBhbm90aGVyIHBvaW50LCBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtQb2ludH0gYiB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gICAgICovXG4gICAgYW5nbGVUbzogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnkgLSBiLnksIHRoaXMueCAtIGIueCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgYW5nbGUgYmV0d2VlbiB0aGlzIHBvaW50IGFuZCBhbm90aGVyIHBvaW50LCBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtQb2ludH0gYiB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGFuZ2xlXG4gICAgICovXG4gICAgYW5nbGVXaXRoOiBmdW5jdGlvbihiKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFuZ2xlV2l0aFNlcChiLngsIGIueSk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICogRmluZCB0aGUgYW5nbGUgb2YgdGhlIHR3byB2ZWN0b3JzLCBzb2x2aW5nIHRoZSBmb3JtdWxhIGZvclxuICAgICAqIHRoZSBjcm9zcyBwcm9kdWN0IGEgeCBiID0gfGF8fGJ8c2luKM64KSBmb3IgzrguXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHggdGhlIHgtY29vcmRpbmF0ZVxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB5IHRoZSB5LWNvb3JkaW5hdGVcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBhbmdsZSBpbiByYWRpYW5zXG4gICAgICovXG4gICAgYW5nbGVXaXRoU2VwOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKFxuICAgICAgICAgICAgdGhpcy54ICogeSAtIHRoaXMueSAqIHgsXG4gICAgICAgICAgICB0aGlzLnggKiB4ICsgdGhpcy55ICogeSk7XG4gICAgfSxcblxuICAgIF9tYXRNdWx0OiBmdW5jdGlvbihtKSB7XG4gICAgICAgIHZhciB4ID0gbVswXSAqIHRoaXMueCArIG1bMV0gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gbVsyXSAqIHRoaXMueCArIG1bM10gKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfYWRkOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCArPSBwLng7XG4gICAgICAgIHRoaXMueSArPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfc3ViOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAtPSBwLng7XG4gICAgICAgIHRoaXMueSAtPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfbXVsdDogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggKj0gaztcbiAgICAgICAgdGhpcy55ICo9IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZGl2OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAvPSBrO1xuICAgICAgICB0aGlzLnkgLz0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9tdWx0QnlQb2ludDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggKj0gcC54O1xuICAgICAgICB0aGlzLnkgKj0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2RpdkJ5UG9pbnQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54IC89IHAueDtcbiAgICAgICAgdGhpcy55IC89IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF91bml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fZGl2KHRoaXMubWFnKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3BlcnA6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueTtcbiAgICAgICAgdGhpcy55ID0gdGhpcy54O1xuICAgICAgICB0aGlzLnggPSAteTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3RhdGU6IGZ1bmN0aW9uKGFuZ2xlKSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICB4ID0gY29zICogdGhpcy54IC0gc2luICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IHNpbiAqIHRoaXMueCArIGNvcyAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3RhdGVBcm91bmQ6IGZ1bmN0aW9uKGFuZ2xlLCBwKSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICB4ID0gcC54ICsgY29zICogKHRoaXMueCAtIHAueCkgLSBzaW4gKiAodGhpcy55IC0gcC55KSxcbiAgICAgICAgICAgIHkgPSBwLnkgKyBzaW4gKiAodGhpcy54IC0gcC54KSArIGNvcyAqICh0aGlzLnkgLSBwLnkpO1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3JvdW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy54ID0gTWF0aC5yb3VuZCh0aGlzLngpO1xuICAgICAgICB0aGlzLnkgPSBNYXRoLnJvdW5kKHRoaXMueSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5cbi8qKlxuICogQ29uc3RydWN0IGEgcG9pbnQgZnJvbSBhbiBhcnJheSBpZiBuZWNlc3NhcnksIG90aGVyd2lzZSBpZiB0aGUgaW5wdXRcbiAqIGlzIGFscmVhZHkgYSBQb2ludCwgb3IgYW4gdW5rbm93biB0eXBlLCByZXR1cm4gaXQgdW5jaGFuZ2VkXG4gKiBAcGFyYW0ge0FycmF5PE51bWJlcj58UG9pbnR8Kn0gYSBhbnkga2luZCBvZiBpbnB1dCB2YWx1ZVxuICogQHJldHVybiB7UG9pbnR9IGNvbnN0cnVjdGVkIHBvaW50LCBvciBwYXNzZWQtdGhyb3VnaCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKiAvLyB0aGlzXG4gKiB2YXIgcG9pbnQgPSBQb2ludC5jb252ZXJ0KFswLCAxXSk7XG4gKiAvLyBpcyBlcXVpdmFsZW50IHRvXG4gKiB2YXIgcG9pbnQgPSBuZXcgUG9pbnQoMCwgMSk7XG4gKi9cblBvaW50LmNvbnZlcnQgPSBmdW5jdGlvbiAoYSkge1xuICAgIGlmIChhIGluc3RhbmNlb2YgUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoYVswXSwgYVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xufTtcbiIsIi8vIEBmbG93XG4vKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cbmltcG9ydCB0eXBlIHtXaW5kb3d9IGZyb20gJy4uLy4uL3R5cGVzL3dpbmRvdy5qcyc7XG5cbi8vIHNoaW0gd2luZG93IGZvciB0aGUgY2FzZSBvZiByZXF1aXJpbmcgdGhlIGJyb3dzZXIgYnVuZGxlIGluIE5vZGVcbmV4cG9ydCBkZWZhdWx0IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IChzZWxmOiBXaW5kb3cpIDogKCh7fTogYW55KTogV2luZG93KTtcbiIsIi8qKlxyXG4gKiBDb21tb24gdXRpbGl0aWVzXHJcbiAqIEBtb2R1bGUgZ2xNYXRyaXhcclxuICovXG4vLyBDb25maWd1cmF0aW9uIENvbnN0YW50c1xuZXhwb3J0IHZhciBFUFNJTE9OID0gMC4wMDAwMDE7XG5leHBvcnQgdmFyIEFSUkFZX1RZUEUgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IEZsb2F0MzJBcnJheSA6IEFycmF5O1xuZXhwb3J0IHZhciBSQU5ET00gPSBNYXRoLnJhbmRvbTtcbi8qKlxyXG4gKiBTZXRzIHRoZSB0eXBlIG9mIGFycmF5IHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdmVjdG9ycyBhbmQgbWF0cmljZXNcclxuICpcclxuICogQHBhcmFtIHtGbG9hdDMyQXJyYXlDb25zdHJ1Y3RvciB8IEFycmF5Q29uc3RydWN0b3J9IHR5cGUgQXJyYXkgdHlwZSwgc3VjaCBhcyBGbG9hdDMyQXJyYXkgb3IgQXJyYXlcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRNYXRyaXhBcnJheVR5cGUodHlwZSkge1xuICBBUlJBWV9UWVBFID0gdHlwZTtcbn1cbnZhciBkZWdyZWUgPSBNYXRoLlBJIC8gMTgwO1xuLyoqXHJcbiAqIENvbnZlcnQgRGVncmVlIFRvIFJhZGlhblxyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBBbmdsZSBpbiBEZWdyZWVzXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdG9SYWRpYW4oYSkge1xuICByZXR1cm4gYSAqIGRlZ3JlZTtcbn1cbi8qKlxyXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCB0aGUgYXJndW1lbnRzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSB2YWx1ZSwgd2l0aGluIGFuIGFic29sdXRlXHJcbiAqIG9yIHJlbGF0aXZlIHRvbGVyYW5jZSBvZiBnbE1hdHJpeC5FUFNJTE9OIChhbiBhYnNvbHV0ZSB0b2xlcmFuY2UgaXMgdXNlZCBmb3IgdmFsdWVzIGxlc3NcclxuICogdGhhbiBvciBlcXVhbCB0byAxLjAsIGFuZCBhIHJlbGF0aXZlIHRvbGVyYW5jZSBpcyB1c2VkIGZvciBsYXJnZXIgdmFsdWVzKVxyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBUaGUgZmlyc3QgbnVtYmVyIHRvIHRlc3QuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIFRoZSBzZWNvbmQgbnVtYmVyIHRvIHRlc3QuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBudW1iZXJzIGFyZSBhcHByb3hpbWF0ZWx5IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8PSBFUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhKSwgTWF0aC5hYnMoYikpO1xufVxuaWYgKCFNYXRoLmh5cG90KSBNYXRoLmh5cG90ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgeSA9IDAsXG4gICAgICBpID0gYXJndW1lbnRzLmxlbmd0aDtcblxuICB3aGlsZSAoaS0tKSB7XG4gICAgeSArPSBhcmd1bWVudHNbaV0gKiBhcmd1bWVudHNbaV07XG4gIH1cblxuICByZXR1cm4gTWF0aC5zcXJ0KHkpO1xufTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiAyeDIgTWF0cml4XHJcbiAqIEBtb2R1bGUgbWF0MlxyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0MlxyXG4gKlxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gYSBuZXcgMngyIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIG91dFswXSA9IDE7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBtYXQyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIG1hdHJpeCB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gYSBuZXcgMngyIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQyIHRvIGFub3RoZXJcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IGEgbWF0MiB0byB0aGUgaWRlbnRpdHkgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGUgYSBuZXcgbWF0MiB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0IEEgbmV3IDJ4MiBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMTAsIG0xMSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMTA7XG4gIG91dFszXSA9IG0xMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMTA7XG4gIG91dFszXSA9IG0xMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDJcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHtcbiAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZVxuICAvLyBzb21lIHZhbHVlc1xuICBpZiAob3V0ID09PSBhKSB7XG4gICAgdmFyIGExID0gYVsxXTtcbiAgICBvdXRbMV0gPSBhWzJdO1xuICAgIG91dFsyXSA9IGExO1xuICB9IGVsc2Uge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsyXTtcbiAgICBvdXRbMl0gPSBhWzFdO1xuICAgIG91dFszXSA9IGFbM107XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEludmVydHMgYSBtYXQyXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107IC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcblxuICB2YXIgZGV0ID0gYTAgKiBhMyAtIGEyICogYTE7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gYTMgKiBkZXQ7XG4gIG91dFsxXSA9IC1hMSAqIGRldDtcbiAgb3V0WzJdID0gLWEyICogZGV0O1xuICBvdXRbM10gPSBhMCAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDJcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkam9pbnQob3V0LCBhKSB7XG4gIC8vIENhY2hpbmcgdGhpcyB2YWx1ZSBpcyBuZXNzZWNhcnkgaWYgb3V0ID09IGFcbiAgdmFyIGEwID0gYVswXTtcbiAgb3V0WzBdID0gYVszXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluYW50KGEpIHtcbiAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsyXSAqIGFbMV07XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gbWF0MidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIG91dFswXSA9IGEwICogYjAgKyBhMiAqIGIxO1xuICBvdXRbMV0gPSBhMSAqIGIwICsgYTMgKiBiMTtcbiAgb3V0WzJdID0gYTAgKiBiMiArIGEyICogYjM7XG4gIG91dFszXSA9IGExICogYjIgKyBhMyAqIGIzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXQyIGJ5IHRoZSBnaXZlbiBhbmdsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBhMCAqIGMgKyBhMiAqIHM7XG4gIG91dFsxXSA9IGExICogYyArIGEzICogcztcbiAgb3V0WzJdID0gYTAgKiAtcyArIGEyICogYztcbiAgb3V0WzNdID0gYTEgKiAtcyArIGEzICogYztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgdGhlIG1hdDIgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgdjAgPSB2WzBdLFxuICAgICAgdjEgPSB2WzFdO1xuICBvdXRbMF0gPSBhMCAqIHYwO1xuICBvdXRbMV0gPSBhMSAqIHYwO1xuICBvdXRbMl0gPSBhMiAqIHYxO1xuICBvdXRbM10gPSBhMyAqIHYxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDIucm90YXRlKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IG1hdDIgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gLXM7XG4gIG91dFszXSA9IGM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQyLmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0Mi5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCBtYXQyIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IFNjYWxpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gdlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwibWF0MihcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0MlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdKTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIEwsIEQgYW5kIFUgbWF0cmljZXMgKExvd2VyIHRyaWFuZ3VsYXIsIERpYWdvbmFsIGFuZCBVcHBlciB0cmlhbmd1bGFyKSBieSBmYWN0b3JpemluZyB0aGUgaW5wdXQgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBMIHRoZSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gRCB0aGUgZGlhZ29uYWwgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBVIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgaW5wdXQgbWF0cml4IHRvIGZhY3Rvcml6ZVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIExEVShMLCBELCBVLCBhKSB7XG4gIExbMl0gPSBhWzJdIC8gYVswXTtcbiAgVVswXSA9IGFbMF07XG4gIFVbMV0gPSBhWzFdO1xuICBVWzNdID0gYVszXSAtIExbMl0gKiBVWzFdO1xuICByZXR1cm4gW0wsIEQsIFVdO1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIG1hdHJpeCBiIGZyb20gbWF0cml4IGFcclxuICpcclxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM107XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSk7XG59XG4vKipcclxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxyXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDIncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcclxuICogQHJldHVybnMge21hdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDIubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDIuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiAyeDMgTWF0cml4XHJcbiAqIEBtb2R1bGUgbWF0MmRcclxuICogQGRlc2NyaXB0aW9uXHJcbiAqIEEgbWF0MmQgY29udGFpbnMgc2l4IGVsZW1lbnRzIGRlZmluZWQgYXM6XHJcbiAqIDxwcmU+XHJcbiAqIFthLCBiLFxyXG4gKiAgYywgZCxcclxuICogIHR4LCB0eV1cclxuICogPC9wcmU+XHJcbiAqIFRoaXMgaXMgYSBzaG9ydCBmb3JtIGZvciB0aGUgM3gzIG1hdHJpeDpcclxuICogPHByZT5cclxuICogW2EsIGIsIDAsXHJcbiAqICBjLCBkLCAwLFxyXG4gKiAgdHgsIHR5LCAxXVxyXG4gKiA8L3ByZT5cclxuICogVGhlIGxhc3QgY29sdW1uIGlzIGlnbm9yZWQgc28gdGhlIGFycmF5IGlzIHNob3J0ZXIgYW5kIG9wZXJhdGlvbnMgYXJlIGZhc3Rlci5cclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJkXHJcbiAqXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDYpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbM10gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MmQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIG1hdHJpeCB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IGEgbmV3IDJ4MyBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MmQgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgYSBtYXQyZCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZSBhIG5ldyBtYXQyZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQ29tcG9uZW50IEEgKGluZGV4IDApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIENvbXBvbmVudCBCIChpbmRleCAxKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYyBDb21wb25lbnQgQyAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IGQgQ29tcG9uZW50IEQgKGluZGV4IDMpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eCBDb21wb25lbnQgVFggKGluZGV4IDQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eSBDb21wb25lbnQgVFkgKGluZGV4IDUpXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gQSBuZXcgbWF0MmRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNik7XG4gIG91dFswXSA9IGE7XG4gIG91dFsxXSA9IGI7XG4gIG91dFsyXSA9IGM7XG4gIG91dFszXSA9IGQ7XG4gIG91dFs0XSA9IHR4O1xuICBvdXRbNV0gPSB0eTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQyZCB0byB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge051bWJlcn0gYSBDb21wb25lbnQgQSAoaW5kZXggMClcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgQ29tcG9uZW50IEIgKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjIENvbXBvbmVudCBDIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gZCBDb21wb25lbnQgRCAoaW5kZXggMylcclxuICogQHBhcmFtIHtOdW1iZXJ9IHR4IENvbXBvbmVudCBUWCAoaW5kZXggNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IHR5IENvbXBvbmVudCBUWSAoaW5kZXggNSlcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBhLCBiLCBjLCBkLCB0eCwgdHkpIHtcbiAgb3V0WzBdID0gYTtcbiAgb3V0WzFdID0gYjtcbiAgb3V0WzJdID0gYztcbiAgb3V0WzNdID0gZDtcbiAgb3V0WzRdID0gdHg7XG4gIG91dFs1XSA9IHR5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEludmVydHMgYSBtYXQyZFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYWEgPSBhWzBdLFxuICAgICAgYWIgPSBhWzFdLFxuICAgICAgYWMgPSBhWzJdLFxuICAgICAgYWQgPSBhWzNdO1xuICB2YXIgYXR4ID0gYVs0XSxcbiAgICAgIGF0eSA9IGFbNV07XG4gIHZhciBkZXQgPSBhYSAqIGFkIC0gYWIgKiBhYztcblxuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSBhZCAqIGRldDtcbiAgb3V0WzFdID0gLWFiICogZGV0O1xuICBvdXRbMl0gPSAtYWMgKiBkZXQ7XG4gIG91dFszXSA9IGFhICogZGV0O1xuICBvdXRbNF0gPSAoYWMgKiBhdHkgLSBhZCAqIGF0eCkgKiBkZXQ7XG4gIG91dFs1XSA9IChhYiAqIGF0eCAtIGFhICogYXR5KSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzFdICogYVsyXTtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQyZCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdLFxuICAgICAgYjQgPSBiWzRdLFxuICAgICAgYjUgPSBiWzVdO1xuICBvdXRbMF0gPSBhMCAqIGIwICsgYTIgKiBiMTtcbiAgb3V0WzFdID0gYTEgKiBiMCArIGEzICogYjE7XG4gIG91dFsyXSA9IGEwICogYjIgKyBhMiAqIGIzO1xuICBvdXRbM10gPSBhMSAqIGIyICsgYTMgKiBiMztcbiAgb3V0WzRdID0gYTAgKiBiNCArIGEyICogYjUgKyBhNDtcbiAgb3V0WzVdID0gYTEgKiBiNCArIGEzICogYjUgKyBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0MmQgYnkgdGhlIGdpdmVuIGFuZ2xlXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XTtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGEwICogYyArIGEyICogcztcbiAgb3V0WzFdID0gYTEgKiBjICsgYTMgKiBzO1xuICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICBvdXRbM10gPSBhMSAqIC1zICsgYTMgKiBjO1xuICBvdXRbNF0gPSBhNDtcbiAgb3V0WzVdID0gYTU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIHRoZSBtYXQyZCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciB2MCA9IHZbMF0sXG4gICAgICB2MSA9IHZbMV07XG4gIG91dFswXSA9IGEwICogdjA7XG4gIG91dFsxXSA9IGExICogdjA7XG4gIG91dFsyXSA9IGEyICogdjE7XG4gIG91dFszXSA9IGEzICogdjE7XG4gIG91dFs0XSA9IGE0O1xuICBvdXRbNV0gPSBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2xhdGVzIHRoZSBtYXQyZCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHRoZSB2ZWMyIHRvIHRyYW5zbGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XTtcbiAgdmFyIHYwID0gdlswXSxcbiAgICAgIHYxID0gdlsxXTtcbiAgb3V0WzBdID0gYTA7XG4gIG91dFsxXSA9IGExO1xuICBvdXRbMl0gPSBhMjtcbiAgb3V0WzNdID0gYTM7XG4gIG91dFs0XSA9IGEwICogdjAgKyBhMiAqIHYxICsgYTQ7XG4gIG91dFs1XSA9IGExICogdjAgKyBhMyAqIHYxICsgYTU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQyZC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDJkLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IHM7XG4gIG91dFsyXSA9IC1zO1xuICBvdXRbM10gPSBjO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0MmQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQyZC5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgU2NhbGluZyB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gdlsxXTtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3IgdHJhbnNsYXRpb25cclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQyZC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDJkLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgVHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRyYW5zbGF0aW9uKG91dCwgdikge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAxO1xuICBvdXRbNF0gPSB2WzBdO1xuICBvdXRbNV0gPSB2WzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQyZFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgbWF0cml4IHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcIm1hdDJkKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiLCBcIiArIGFbNF0gKyBcIiwgXCIgKyBhWzVdICsgXCIpXCI7XG59XG4vKipcclxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDJkXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb2IoYSkge1xuICByZXR1cm4gTWF0aC5oeXBvdChhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLCBhWzRdLCBhWzVdLCAxKTtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQyZCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIG91dFs0XSA9IGFbNF0gLSBiWzRdO1xuICBvdXRbNV0gPSBhWzVdIC0gYls1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cclxuICpcclxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcclxuICogQHJldHVybnMge21hdDJkfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBtYXQyZCdzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF0gKiBzY2FsZTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgVGhlIHNlY29uZCBtYXRyaXguXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSBUaGUgZmlyc3QgbWF0cml4LlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgVGhlIHNlY29uZCBtYXRyaXguXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdLFxuICAgICAgYjQgPSBiWzRdLFxuICAgICAgYjUgPSBiWzVdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpICYmIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJiBNYXRoLmFicyhhNSAtIGI1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0MmQuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiAzeDMgTWF0cml4XHJcbiAqIEBtb2R1bGUgbWF0M1xyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0M1xyXG4gKlxyXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3BpZXMgdGhlIHVwcGVyLWxlZnQgM3gzIHZhbHVlcyBpbnRvIHRoZSBnaXZlbiBtYXQzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIDN4MyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgICB0aGUgc291cmNlIDR4NCBtYXRyaXhcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQ0KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzRdO1xuICBvdXRbNF0gPSBhWzVdO1xuICBvdXRbNV0gPSBhWzZdO1xuICBvdXRbNl0gPSBhWzhdO1xuICBvdXRbN10gPSBhWzldO1xuICBvdXRbOF0gPSBhWzEwXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDMgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgbWF0cml4IHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOSk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDMgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGUgYSBuZXcgbWF0MyB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA2KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIxIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDEgcG9zaXRpb24gKGluZGV4IDcpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggOClcclxuICogQHJldHVybnMge21hdDN9IEEgbmV3IG1hdDNcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTAyO1xuICBvdXRbM10gPSBtMTA7XG4gIG91dFs0XSA9IG0xMTtcbiAgb3V0WzVdID0gbTEyO1xuICBvdXRbNl0gPSBtMjA7XG4gIG91dFs3XSA9IG0yMTtcbiAgb3V0WzhdID0gbTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDMgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDMpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA1KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDYpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNylcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA4KVxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwgbTIwLCBtMjEsIG0yMikge1xuICBvdXRbMF0gPSBtMDA7XG4gIG91dFsxXSA9IG0wMTtcbiAgb3V0WzJdID0gbTAyO1xuICBvdXRbM10gPSBtMTA7XG4gIG91dFs0XSA9IG0xMTtcbiAgb3V0WzVdID0gbTEyO1xuICBvdXRbNl0gPSBtMjA7XG4gIG91dFs3XSA9IG0yMTtcbiAgb3V0WzhdID0gbTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNldCBhIG1hdDMgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDE7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNwb3NlIHRoZSB2YWx1ZXMgb2YgYSBtYXQzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2Uob3V0LCBhKSB7XG4gIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgaWYgKG91dCA9PT0gYSkge1xuICAgIHZhciBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMTIgPSBhWzVdO1xuICAgIG91dFsxXSA9IGFbM107XG4gICAgb3V0WzJdID0gYVs2XTtcbiAgICBvdXRbM10gPSBhMDE7XG4gICAgb3V0WzVdID0gYVs3XTtcbiAgICBvdXRbNl0gPSBhMDI7XG4gICAgb3V0WzddID0gYTEyO1xuICB9IGVsc2Uge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVszXTtcbiAgICBvdXRbMl0gPSBhWzZdO1xuICAgIG91dFszXSA9IGFbMV07XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzddO1xuICAgIG91dFs2XSA9IGFbMl07XG4gICAgb3V0WzddID0gYVs1XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBJbnZlcnRzIGEgbWF0M1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdO1xuICB2YXIgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdO1xuICB2YXIgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdO1xuICB2YXIgYjAxID0gYTIyICogYTExIC0gYTEyICogYTIxO1xuICB2YXIgYjExID0gLWEyMiAqIGExMCArIGExMiAqIGEyMDtcbiAgdmFyIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMDsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjE7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gYjAxICogZGV0O1xuICBvdXRbMV0gPSAoLWEyMiAqIGEwMSArIGEwMiAqIGEyMSkgKiBkZXQ7XG4gIG91dFsyXSA9IChhMTIgKiBhMDEgLSBhMDIgKiBhMTEpICogZGV0O1xuICBvdXRbM10gPSBiMTEgKiBkZXQ7XG4gIG91dFs0XSA9IChhMjIgKiBhMDAgLSBhMDIgKiBhMjApICogZGV0O1xuICBvdXRbNV0gPSAoLWExMiAqIGEwMCArIGEwMiAqIGExMCkgKiBkZXQ7XG4gIG91dFs2XSA9IGIyMSAqIGRldDtcbiAgb3V0WzddID0gKC1hMjEgKiBhMDAgKyBhMDEgKiBhMjApICogZGV0O1xuICBvdXRbOF0gPSAoYTExICogYTAwIC0gYTAxICogYTEwKSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDNcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkam9pbnQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl07XG4gIHZhciBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV07XG4gIHZhciBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF07XG4gIG91dFswXSA9IGExMSAqIGEyMiAtIGExMiAqIGEyMTtcbiAgb3V0WzFdID0gYTAyICogYTIxIC0gYTAxICogYTIyO1xuICBvdXRbMl0gPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XG4gIG91dFszXSA9IGExMiAqIGEyMCAtIGExMCAqIGEyMjtcbiAgb3V0WzRdID0gYTAwICogYTIyIC0gYTAyICogYTIwO1xuICBvdXRbNV0gPSBhMDIgKiBhMTAgLSBhMDAgKiBhMTI7XG4gIG91dFs2XSA9IGExMCAqIGEyMSAtIGExMSAqIGEyMDtcbiAgb3V0WzddID0gYTAxICogYTIwIC0gYTAwICogYTIxO1xuICBvdXRbOF0gPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl07XG4gIHZhciBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV07XG4gIHZhciBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF07XG4gIHJldHVybiBhMDAgKiAoYTIyICogYTExIC0gYTEyICogYTIxKSArIGEwMSAqICgtYTIyICogYTEwICsgYTEyICogYTIwKSArIGEwMiAqIChhMjEgKiBhMTAgLSBhMTEgKiBhMjApO1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdO1xuICB2YXIgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdO1xuICB2YXIgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdO1xuICB2YXIgYjAwID0gYlswXSxcbiAgICAgIGIwMSA9IGJbMV0sXG4gICAgICBiMDIgPSBiWzJdO1xuICB2YXIgYjEwID0gYlszXSxcbiAgICAgIGIxMSA9IGJbNF0sXG4gICAgICBiMTIgPSBiWzVdO1xuICB2YXIgYjIwID0gYls2XSxcbiAgICAgIGIyMSA9IGJbN10sXG4gICAgICBiMjIgPSBiWzhdO1xuICBvdXRbMF0gPSBiMDAgKiBhMDAgKyBiMDEgKiBhMTAgKyBiMDIgKiBhMjA7XG4gIG91dFsxXSA9IGIwMCAqIGEwMSArIGIwMSAqIGExMSArIGIwMiAqIGEyMTtcbiAgb3V0WzJdID0gYjAwICogYTAyICsgYjAxICogYTEyICsgYjAyICogYTIyO1xuICBvdXRbM10gPSBiMTAgKiBhMDAgKyBiMTEgKiBhMTAgKyBiMTIgKiBhMjA7XG4gIG91dFs0XSA9IGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMTtcbiAgb3V0WzVdID0gYjEwICogYTAyICsgYjExICogYTEyICsgYjEyICogYTIyO1xuICBvdXRbNl0gPSBiMjAgKiBhMDAgKyBiMjEgKiBhMTAgKyBiMjIgKiBhMjA7XG4gIG91dFs3XSA9IGIyMCAqIGEwMSArIGIyMSAqIGExMSArIGIyMiAqIGEyMTtcbiAgb3V0WzhdID0gYjIwICogYTAyICsgYjIxICogYTEyICsgYjIyICogYTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zbGF0ZSBhIG1hdDMgYnkgdGhlIGdpdmVuIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBhLCB2KSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV0sXG4gICAgICBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF0sXG4gICAgICB4ID0gdlswXSxcbiAgICAgIHkgPSB2WzFdO1xuICBvdXRbMF0gPSBhMDA7XG4gIG91dFsxXSA9IGEwMTtcbiAgb3V0WzJdID0gYTAyO1xuICBvdXRbM10gPSBhMTA7XG4gIG91dFs0XSA9IGExMTtcbiAgb3V0WzVdID0gYTEyO1xuICBvdXRbNl0gPSB4ICogYTAwICsgeSAqIGExMCArIGEyMDtcbiAgb3V0WzddID0geCAqIGEwMSArIHkgKiBhMTEgKyBhMjE7XG4gIG91dFs4XSA9IHggKiBhMDIgKyB5ICogYTEyICsgYTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXQzIGJ5IHRoZSBnaXZlbiBhbmdsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV0sXG4gICAgICBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF0sXG4gICAgICBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBjICogYTAwICsgcyAqIGExMDtcbiAgb3V0WzFdID0gYyAqIGEwMSArIHMgKiBhMTE7XG4gIG91dFsyXSA9IGMgKiBhMDIgKyBzICogYTEyO1xuICBvdXRbM10gPSBjICogYTEwIC0gcyAqIGEwMDtcbiAgb3V0WzRdID0gYyAqIGExMSAtIHMgKiBhMDE7XG4gIG91dFs1XSA9IGMgKiBhMTIgLSBzICogYTAyO1xuICBvdXRbNl0gPSBhMjA7XG4gIG91dFs3XSA9IGEyMTtcbiAgb3V0WzhdID0gYTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyB0aGUgbWF0MyBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciB4ID0gdlswXSxcbiAgICAgIHkgPSB2WzFdO1xuICBvdXRbMF0gPSB4ICogYVswXTtcbiAgb3V0WzFdID0geCAqIGFbMV07XG4gIG91dFsyXSA9IHggKiBhWzJdO1xuICBvdXRbM10gPSB5ICogYVszXTtcbiAgb3V0WzRdID0geSAqIGFbNF07XG4gIG91dFs1XSA9IHkgKiBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDMuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQzLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVRyYW5zbGF0aW9uKG91dCwgdikge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAxO1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSB2WzBdO1xuICBvdXRbN10gPSB2WzFdO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0My5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDMucm90YXRlKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gLXM7XG4gIG91dFs0XSA9IGM7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQzLmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0My5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IFNjYWxpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gdlsxXTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDb3BpZXMgdGhlIHZhbHVlcyBmcm9tIGEgbWF0MmQgaW50byBhIG1hdDNcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBtYXRyaXggdG8gY29weVxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQyZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gYVsyXTtcbiAgb3V0WzRdID0gYVszXTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gYVs0XTtcbiAgb3V0WzddID0gYVs1XTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGEgM3gzIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgUXVhdGVybmlvbiB0byBjcmVhdGUgbWF0cml4IGZyb21cclxuICpcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21RdWF0KG91dCwgcSkge1xuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHl4ID0geSAqIHgyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB6eCA9IHogKiB4MjtcbiAgdmFyIHp5ID0geiAqIHkyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICBvdXRbM10gPSB5eCAtIHd6O1xuICBvdXRbNl0gPSB6eCArIHd5O1xuICBvdXRbMV0gPSB5eCArIHd6O1xuICBvdXRbNF0gPSAxIC0geHggLSB6ejtcbiAgb3V0WzddID0genkgLSB3eDtcbiAgb3V0WzJdID0genggLSB3eTtcbiAgb3V0WzVdID0genkgKyB3eDtcbiAgb3V0WzhdID0gMSAtIHh4IC0geXk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyBhIDN4MyBub3JtYWwgbWF0cml4ICh0cmFuc3Bvc2UgaW52ZXJzZSkgZnJvbSB0aGUgNHg0IG1hdHJpeFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIE1hdDQgdG8gZGVyaXZlIHRoZSBub3JtYWwgbWF0cml4IGZyb21cclxuICpcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbEZyb21NYXQ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFsxXSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICBvdXRbMl0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcbiAgb3V0WzNdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFs0XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICBvdXRbNV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcbiAgb3V0WzZdID0gKGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMykgKiBkZXQ7XG4gIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICBvdXRbOF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSAyRCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcclxuICpcclxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggV2lkdGggb2YgeW91ciBnbCBjb250ZXh0XHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgSGVpZ2h0IG9mIGdsIGNvbnRleHRcclxuICogQHJldHVybnMge21hdDN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2plY3Rpb24ob3V0LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIG91dFswXSA9IDIgLyB3aWR0aDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gLTIgLyBoZWlnaHQ7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IC0xO1xuICBvdXRbN10gPSAxO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJtYXQzKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiLCBcIiArIGFbNF0gKyBcIiwgXCIgKyBhWzVdICsgXCIsIFwiICsgYVs2XSArIFwiLCBcIiArIGFbN10gKyBcIiwgXCIgKyBhWzhdICsgXCIpXCI7XG59XG4vKipcclxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDNcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byBjYWxjdWxhdGUgRnJvYmVuaXVzIG5vcm0gb2ZcclxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9iKGEpIHtcbiAgcmV0dXJuIE1hdGguaHlwb3QoYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XSwgYVs2XSwgYVs3XSwgYVs4XSk7XG59XG4vKipcclxuICogQWRkcyB0d28gbWF0MydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XTtcbiAgb3V0WzddID0gYVs3XSArIGJbN107XG4gIG91dFs4XSA9IGFbOF0gKyBiWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICBvdXRbNF0gPSBhWzRdIC0gYls0XTtcbiAgb3V0WzVdID0gYVs1XSAtIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gLSBiWzZdO1xuICBvdXRbN10gPSBhWzddIC0gYls3XTtcbiAgb3V0WzhdID0gYVs4XSAtIGJbOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICBvdXRbNF0gPSBhWzRdICogYjtcbiAgb3V0WzVdID0gYVs1XSAqIGI7XG4gIG91dFs2XSA9IGFbNl0gKiBiO1xuICBvdXRbN10gPSBhWzddICogYjtcbiAgb3V0WzhdID0gYVs4XSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQWRkcyB0d28gbWF0MydzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XSAqIHNjYWxlO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XSAqIHNjYWxlO1xuICBvdXRbN10gPSBhWzddICsgYls3XSAqIHNjYWxlO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgVGhlIGZpcnN0IG1hdHJpeC5cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgVGhlIHNlY29uZCBtYXRyaXguXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN10gJiYgYVs4XSA9PT0gYls4XTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XSxcbiAgICAgIGE2ID0gYVs2XSxcbiAgICAgIGE3ID0gYVs3XSxcbiAgICAgIGE4ID0gYVs4XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXSxcbiAgICAgIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XSxcbiAgICAgIGI2ID0gYls2XSxcbiAgICAgIGI3ID0gYls3XSxcbiAgICAgIGI4ID0gYls4XTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJiBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiYgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmIE1hdGguYWJzKGE2IC0gYjYpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE2KSwgTWF0aC5hYnMoYjYpKSAmJiBNYXRoLmFicyhhNyAtIGI3KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNyksIE1hdGguYWJzKGI3KSkgJiYgTWF0aC5hYnMoYTggLSBiOCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTgpLCBNYXRoLmFicyhiOCkpO1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0My5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0My5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDR4NCBNYXRyaXg8YnI+Rm9ybWF0OiBjb2x1bW4tbWFqb3IsIHdoZW4gdHlwZWQgb3V0IGl0IGxvb2tzIGxpa2Ugcm93LW1ham9yPGJyPlRoZSBtYXRyaWNlcyBhcmUgYmVpbmcgcG9zdCBtdWx0aXBsaWVkLlxyXG4gKiBAbW9kdWxlIG1hdDRcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDRcclxuICpcclxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgbWF0NCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSBtYXRyaXggdG8gY2xvbmVcclxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIG91dFs5XSA9IGFbOV07XG4gIG91dFsxMF0gPSBhWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdO1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDQgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgb3V0WzldID0gYVs5XTtcbiAgb3V0WzEwXSA9IGFbMTBdO1xuICBvdXRbMTFdID0gYVsxMV07XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGUgYSBuZXcgbWF0NCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMyBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA2KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEzIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDMgcG9zaXRpb24gKGluZGV4IDcpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA5KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDEwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMwIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDAgcG9zaXRpb24gKGluZGV4IDEyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMxIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDEgcG9zaXRpb24gKGluZGV4IDEzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMzIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDMgcG9zaXRpb24gKGluZGV4IDE1KVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gQSBuZXcgbWF0NFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQ0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMyBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDQpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA2KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTEzIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDMgcG9zaXRpb24gKGluZGV4IDcpXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcclxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA5KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDEwKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMwIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDAgcG9zaXRpb24gKGluZGV4IDEyKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMxIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDEgcG9zaXRpb24gKGluZGV4IDEzKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbTMzIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDMgcG9zaXRpb24gKGluZGV4IDE1KVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgbTAwLCBtMDEsIG0wMiwgbTAzLCBtMTAsIG0xMSwgbTEyLCBtMTMsIG0yMCwgbTIxLCBtMjIsIG0yMywgbTMwLCBtMzEsIG0zMiwgbTMzKSB7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0wMztcbiAgb3V0WzRdID0gbTEwO1xuICBvdXRbNV0gPSBtMTE7XG4gIG91dFs2XSA9IG0xMjtcbiAgb3V0WzddID0gbTEzO1xuICBvdXRbOF0gPSBtMjA7XG4gIG91dFs5XSA9IG0yMTtcbiAgb3V0WzEwXSA9IG0yMjtcbiAgb3V0WzExXSA9IG0yMztcbiAgb3V0WzEyXSA9IG0zMDtcbiAgb3V0WzEzXSA9IG0zMTtcbiAgb3V0WzE0XSA9IG0zMjtcbiAgb3V0WzE1XSA9IG0zMztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgYSBtYXQ0IHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5KG91dCkge1xuICBvdXRbMF0gPSAxO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMTtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0NFxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKG91dCwgYSkge1xuICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlIHNvbWUgdmFsdWVzXG4gIGlmIChvdXQgPT09IGEpIHtcbiAgICB2YXIgYTAxID0gYVsxXSxcbiAgICAgICAgYTAyID0gYVsyXSxcbiAgICAgICAgYTAzID0gYVszXTtcbiAgICB2YXIgYTEyID0gYVs2XSxcbiAgICAgICAgYTEzID0gYVs3XTtcbiAgICB2YXIgYTIzID0gYVsxMV07XG4gICAgb3V0WzFdID0gYVs0XTtcbiAgICBvdXRbMl0gPSBhWzhdO1xuICAgIG91dFszXSA9IGFbMTJdO1xuICAgIG91dFs0XSA9IGEwMTtcbiAgICBvdXRbNl0gPSBhWzldO1xuICAgIG91dFs3XSA9IGFbMTNdO1xuICAgIG91dFs4XSA9IGEwMjtcbiAgICBvdXRbOV0gPSBhMTI7XG4gICAgb3V0WzExXSA9IGFbMTRdO1xuICAgIG91dFsxMl0gPSBhMDM7XG4gICAgb3V0WzEzXSA9IGExMztcbiAgICBvdXRbMTRdID0gYTIzO1xuICB9IGVsc2Uge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVs0XTtcbiAgICBvdXRbMl0gPSBhWzhdO1xuICAgIG91dFszXSA9IGFbMTJdO1xuICAgIG91dFs0XSA9IGFbMV07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzldO1xuICAgIG91dFs3XSA9IGFbMTNdO1xuICAgIG91dFs4XSA9IGFbMl07XG4gICAgb3V0WzldID0gYVs2XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTRdO1xuICAgIG91dFsxMl0gPSBhWzNdO1xuICAgIG91dFsxM10gPSBhWzddO1xuICAgIG91dFsxNF0gPSBhWzExXTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEludmVydHMgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdO1xuICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwO1xuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwO1xuICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExO1xuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyO1xuICB2YXIgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwO1xuICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwO1xuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwO1xuICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxO1xuICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxO1xuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyOyAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG5cbiAgdmFyIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcblxuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDtcbiAgb3V0WzFdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFsyXSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xuICBvdXRbM10gPSAoYTIyICogYjA0IC0gYTIxICogYjA1IC0gYTIzICogYjAzKSAqIGRldDtcbiAgb3V0WzRdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gIG91dFs1XSA9IChhMDAgKiBiMTEgLSBhMDIgKiBiMDggKyBhMDMgKiBiMDcpICogZGV0O1xuICBvdXRbNl0gPSAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAqIGRldDtcbiAgb3V0WzddID0gKGEyMCAqIGIwNSAtIGEyMiAqIGIwMiArIGEyMyAqIGIwMSkgKiBkZXQ7XG4gIG91dFs4XSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0O1xuICBvdXRbOV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcbiAgb3V0WzEwXSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuICBvdXRbMTFdID0gKGEyMSAqIGIwMiAtIGEyMCAqIGIwNCAtIGEyMyAqIGIwMCkgKiBkZXQ7XG4gIG91dFsxMl0gPSAoYTExICogYjA3IC0gYTEwICogYjA5IC0gYTEyICogYjA2KSAqIGRldDtcbiAgb3V0WzEzXSA9IChhMDAgKiBiMDkgLSBhMDEgKiBiMDcgKyBhMDIgKiBiMDYpICogZGV0O1xuICBvdXRbMTRdID0gKGEzMSAqIGIwMSAtIGEzMCAqIGIwMyAtIGEzMiAqIGIwMCkgKiBkZXQ7XG4gIG91dFsxNV0gPSAoYTIwICogYjAzIC0gYTIxICogYjAxICsgYTIyICogYjAwKSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDRcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkam9pbnQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdO1xuICBvdXRbMF0gPSBhMTEgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMSAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpICsgYTMxICogKGExMiAqIGEyMyAtIGExMyAqIGEyMik7XG4gIG91dFsxXSA9IC0oYTAxICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMSAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpKTtcbiAgb3V0WzJdID0gYTAxICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgLSBhMTEgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMSAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpO1xuICBvdXRbM10gPSAtKGEwMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpIC0gYTExICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikgKyBhMjEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gIG91dFs0XSA9IC0oYTEwICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjAgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMCAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpKTtcbiAgb3V0WzVdID0gYTAwICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjAgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMCAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpO1xuICBvdXRbNl0gPSAtKGEwMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTEwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gIG91dFs3XSA9IGEwMCAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpIC0gYTEwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikgKyBhMjAgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKTtcbiAgb3V0WzhdID0gYTEwICogKGEyMSAqIGEzMyAtIGEyMyAqIGEzMSkgLSBhMjAgKiAoYTExICogYTMzIC0gYTEzICogYTMxKSArIGEzMCAqIChhMTEgKiBhMjMgLSBhMTMgKiBhMjEpO1xuICBvdXRbOV0gPSAtKGEwMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSk7XG4gIG91dFsxMF0gPSBhMDAgKiAoYTExICogYTMzIC0gYTEzICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzMgLSBhMDMgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSk7XG4gIG91dFsxMV0gPSAtKGEwMCAqIChhMTEgKiBhMjMgLSBhMTMgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMyAtIGEwMyAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEzIC0gYTAzICogYTExKSk7XG4gIG91dFsxMl0gPSAtKGExMCAqIChhMjEgKiBhMzIgLSBhMjIgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMiAtIGExMiAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIyIC0gYTEyICogYTIxKSk7XG4gIG91dFsxM10gPSBhMDAgKiAoYTIxICogYTMyIC0gYTIyICogYTMxKSAtIGEyMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSk7XG4gIG91dFsxNF0gPSAtKGEwMCAqIChhMTEgKiBhMzIgLSBhMTIgKiBhMzEpIC0gYTEwICogKGEwMSAqIGEzMiAtIGEwMiAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKSk7XG4gIG91dFsxNV0gPSBhMDAgKiAoYTExICogYTIyIC0gYTEyICogYTIxKSAtIGExMCAqIChhMDEgKiBhMjIgLSBhMDIgKiBhMjEpICsgYTIwICogKGEwMSAqIGExMiAtIGEwMiAqIGExMSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZGV0ZXJtaW5hbnQgb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdO1xuICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwO1xuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwO1xuICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExO1xuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyO1xuICB2YXIgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwO1xuICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwO1xuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwO1xuICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxO1xuICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxO1xuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyOyAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG5cbiAgcmV0dXJuIGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQ0c1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTsgLy8gQ2FjaGUgb25seSB0aGUgY3VycmVudCBsaW5lIG9mIHRoZSBzZWNvbmQgbWF0cml4XG5cbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgb3V0WzBdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFsxXSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbMl0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzNdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIGIwID0gYls0XTtcbiAgYjEgPSBiWzVdO1xuICBiMiA9IGJbNl07XG4gIGIzID0gYls3XTtcbiAgb3V0WzRdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFs1XSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbNl0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzddID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIGIwID0gYls4XTtcbiAgYjEgPSBiWzldO1xuICBiMiA9IGJbMTBdO1xuICBiMyA9IGJbMTFdO1xuICBvdXRbOF0gPSBiMCAqIGEwMCArIGIxICogYTEwICsgYjIgKiBhMjAgKyBiMyAqIGEzMDtcbiAgb3V0WzldID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFsxMF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzExXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICBiMCA9IGJbMTJdO1xuICBiMSA9IGJbMTNdO1xuICBiMiA9IGJbMTRdO1xuICBiMyA9IGJbMTVdO1xuICBvdXRbMTJdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFsxM10gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzE0XSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICBvdXRbMTVdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNsYXRlIGEgbWF0NCBieSB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIHggPSB2WzBdLFxuICAgICAgeSA9IHZbMV0sXG4gICAgICB6ID0gdlsyXTtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMztcbiAgdmFyIGExMCwgYTExLCBhMTIsIGExMztcbiAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICBpZiAoYSA9PT0gb3V0KSB7XG4gICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzFdICogeCArIGFbNV0gKiB5ICsgYVs5XSAqIHogKyBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsyXSAqIHggKyBhWzZdICogeSArIGFbMTBdICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gIH0gZWxzZSB7XG4gICAgYTAwID0gYVswXTtcbiAgICBhMDEgPSBhWzFdO1xuICAgIGEwMiA9IGFbMl07XG4gICAgYTAzID0gYVszXTtcbiAgICBhMTAgPSBhWzRdO1xuICAgIGExMSA9IGFbNV07XG4gICAgYTEyID0gYVs2XTtcbiAgICBhMTMgPSBhWzddO1xuICAgIGEyMCA9IGFbOF07XG4gICAgYTIxID0gYVs5XTtcbiAgICBhMjIgPSBhWzEwXTtcbiAgICBhMjMgPSBhWzExXTtcbiAgICBvdXRbMF0gPSBhMDA7XG4gICAgb3V0WzFdID0gYTAxO1xuICAgIG91dFsyXSA9IGEwMjtcbiAgICBvdXRbM10gPSBhMDM7XG4gICAgb3V0WzRdID0gYTEwO1xuICAgIG91dFs1XSA9IGExMTtcbiAgICBvdXRbNl0gPSBhMTI7XG4gICAgb3V0WzddID0gYTEzO1xuICAgIG91dFs4XSA9IGEyMDtcbiAgICBvdXRbOV0gPSBhMjE7XG4gICAgb3V0WzEwXSA9IGEyMjtcbiAgICBvdXRbMTFdID0gYTIzO1xuICAgIG91dFsxMl0gPSBhMDAgKiB4ICsgYTEwICogeSArIGEyMCAqIHogKyBhWzEyXTtcbiAgICBvdXRbMTNdID0gYTAxICogeCArIGExMSAqIHkgKyBhMjEgKiB6ICsgYVsxM107XG4gICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgIG91dFsxNV0gPSBhMDMgKiB4ICsgYTEzICogeSArIGEyMyAqIHogKyBhWzE1XTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIHRoZSBtYXQ0IGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMzIG5vdCB1c2luZyB2ZWN0b3JpemF0aW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgdGhlIHZlYzMgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXSxcbiAgICAgIHogPSB2WzJdO1xuICBvdXRbMF0gPSBhWzBdICogeDtcbiAgb3V0WzFdID0gYVsxXSAqIHg7XG4gIG91dFsyXSA9IGFbMl0gKiB4O1xuICBvdXRbM10gPSBhWzNdICogeDtcbiAgb3V0WzRdID0gYVs0XSAqIHk7XG4gIG91dFs1XSA9IGFbNV0gKiB5O1xuICBvdXRbNl0gPSBhWzZdICogeTtcbiAgb3V0WzddID0gYVs3XSAqIHk7XG4gIG91dFs4XSA9IGFbOF0gKiB6O1xuICBvdXRbOV0gPSBhWzldICogejtcbiAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgb3V0WzExXSA9IGFbMTFdICogejtcbiAgb3V0WzEyXSA9IGFbMTJdO1xuICBvdXRbMTNdID0gYVsxM107XG4gIG91dFsxNF0gPSBhWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBtYXQ0IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIGdpdmVuIGF4aXNcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkLCBheGlzKSB7XG4gIHZhciB4ID0gYXhpc1swXSxcbiAgICAgIHkgPSBheGlzWzFdLFxuICAgICAgeiA9IGF4aXNbMl07XG4gIHZhciBsZW4gPSBNYXRoLmh5cG90KHgsIHksIHopO1xuICB2YXIgcywgYywgdDtcbiAgdmFyIGEwMCwgYTAxLCBhMDIsIGEwMztcbiAgdmFyIGExMCwgYTExLCBhMTIsIGExMztcbiAgdmFyIGEyMCwgYTIxLCBhMjIsIGEyMztcbiAgdmFyIGIwMCwgYjAxLCBiMDI7XG4gIHZhciBiMTAsIGIxMSwgYjEyO1xuICB2YXIgYjIwLCBiMjEsIGIyMjtcblxuICBpZiAobGVuIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGVuID0gMSAvIGxlbjtcbiAgeCAqPSBsZW47XG4gIHkgKj0gbGVuO1xuICB6ICo9IGxlbjtcbiAgcyA9IE1hdGguc2luKHJhZCk7XG4gIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB0ID0gMSAtIGM7XG4gIGEwMCA9IGFbMF07XG4gIGEwMSA9IGFbMV07XG4gIGEwMiA9IGFbMl07XG4gIGEwMyA9IGFbM107XG4gIGExMCA9IGFbNF07XG4gIGExMSA9IGFbNV07XG4gIGExMiA9IGFbNl07XG4gIGExMyA9IGFbN107XG4gIGEyMCA9IGFbOF07XG4gIGEyMSA9IGFbOV07XG4gIGEyMiA9IGFbMTBdO1xuICBhMjMgPSBhWzExXTsgLy8gQ29uc3RydWN0IHRoZSBlbGVtZW50cyBvZiB0aGUgcm90YXRpb24gbWF0cml4XG5cbiAgYjAwID0geCAqIHggKiB0ICsgYztcbiAgYjAxID0geSAqIHggKiB0ICsgeiAqIHM7XG4gIGIwMiA9IHogKiB4ICogdCAtIHkgKiBzO1xuICBiMTAgPSB4ICogeSAqIHQgLSB6ICogcztcbiAgYjExID0geSAqIHkgKiB0ICsgYztcbiAgYjEyID0geiAqIHkgKiB0ICsgeCAqIHM7XG4gIGIyMCA9IHggKiB6ICogdCArIHkgKiBzO1xuICBiMjEgPSB5ICogeiAqIHQgLSB4ICogcztcbiAgYjIyID0geiAqIHogKiB0ICsgYzsgLy8gUGVyZm9ybSByb3RhdGlvbi1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSBhMDAgKiBiMDAgKyBhMTAgKiBiMDEgKyBhMjAgKiBiMDI7XG4gIG91dFsxXSA9IGEwMSAqIGIwMCArIGExMSAqIGIwMSArIGEyMSAqIGIwMjtcbiAgb3V0WzJdID0gYTAyICogYjAwICsgYTEyICogYjAxICsgYTIyICogYjAyO1xuICBvdXRbM10gPSBhMDMgKiBiMDAgKyBhMTMgKiBiMDEgKyBhMjMgKiBiMDI7XG4gIG91dFs0XSA9IGEwMCAqIGIxMCArIGExMCAqIGIxMSArIGEyMCAqIGIxMjtcbiAgb3V0WzVdID0gYTAxICogYjEwICsgYTExICogYjExICsgYTIxICogYjEyO1xuICBvdXRbNl0gPSBhMDIgKiBiMTAgKyBhMTIgKiBiMTEgKyBhMjIgKiBiMTI7XG4gIG91dFs3XSA9IGEwMyAqIGIxMCArIGExMyAqIGIxMSArIGEyMyAqIGIxMjtcbiAgb3V0WzhdID0gYTAwICogYjIwICsgYTEwICogYjIxICsgYTIwICogYjIyO1xuICBvdXRbOV0gPSBhMDEgKiBiMjAgKyBhMTEgKiBiMjEgKyBhMjEgKiBiMjI7XG4gIG91dFsxMF0gPSBhMDIgKiBiMjAgKyBhMTIgKiBiMjEgKyBhMjIgKiBiMjI7XG4gIG91dFsxMV0gPSBhMDMgKiBiMjAgKyBhMTMgKiBiMjEgKyBhMjMgKiBiMjI7XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFggYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWChvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGExMCA9IGFbNF07XG4gIHZhciBhMTEgPSBhWzVdO1xuICB2YXIgYTEyID0gYVs2XTtcbiAgdmFyIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdO1xuICB2YXIgYTIxID0gYVs5XTtcbiAgdmFyIGEyMiA9IGFbMTBdO1xuICB2YXIgYTIzID0gYVsxMV07XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbNF0gPSBhMTAgKiBjICsgYTIwICogcztcbiAgb3V0WzVdID0gYTExICogYyArIGEyMSAqIHM7XG4gIG91dFs2XSA9IGExMiAqIGMgKyBhMjIgKiBzO1xuICBvdXRbN10gPSBhMTMgKiBjICsgYTIzICogcztcbiAgb3V0WzhdID0gYTIwICogYyAtIGExMCAqIHM7XG4gIG91dFs5XSA9IGEyMSAqIGMgLSBhMTEgKiBzO1xuICBvdXRbMTBdID0gYTIyICogYyAtIGExMiAqIHM7XG4gIG91dFsxMV0gPSBhMjMgKiBjIC0gYTEzICogcztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFkgYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWShvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGEwMCA9IGFbMF07XG4gIHZhciBhMDEgPSBhWzFdO1xuICB2YXIgYTAyID0gYVsyXTtcbiAgdmFyIGEwMyA9IGFbM107XG4gIHZhciBhMjAgPSBhWzhdO1xuICB2YXIgYTIxID0gYVs5XTtcbiAgdmFyIGEyMiA9IGFbMTBdO1xuICB2YXIgYTIzID0gYVsxMV07XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbMF0gPSBhMDAgKiBjIC0gYTIwICogcztcbiAgb3V0WzFdID0gYTAxICogYyAtIGEyMSAqIHM7XG4gIG91dFsyXSA9IGEwMiAqIGMgLSBhMjIgKiBzO1xuICBvdXRbM10gPSBhMDMgKiBjIC0gYTIzICogcztcbiAgb3V0WzhdID0gYTAwICogcyArIGEyMCAqIGM7XG4gIG91dFs5XSA9IGEwMSAqIHMgKyBhMjEgKiBjO1xuICBvdXRbMTBdID0gYTAyICogcyArIGEyMiAqIGM7XG4gIG91dFsxMV0gPSBhMDMgKiBzICsgYTIzICogYztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGEwMCA9IGFbMF07XG4gIHZhciBhMDEgPSBhWzFdO1xuICB2YXIgYTAyID0gYVsyXTtcbiAgdmFyIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdO1xuICB2YXIgYTExID0gYVs1XTtcbiAgdmFyIGExMiA9IGFbNl07XG4gIHZhciBhMTMgPSBhWzddO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbMF0gPSBhMDAgKiBjICsgYTEwICogcztcbiAgb3V0WzFdID0gYTAxICogYyArIGExMSAqIHM7XG4gIG91dFsyXSA9IGEwMiAqIGMgKyBhMTIgKiBzO1xuICBvdXRbM10gPSBhMDMgKiBjICsgYTEzICogcztcbiAgb3V0WzRdID0gYTEwICogYyAtIGEwMCAqIHM7XG4gIG91dFs1XSA9IGExMSAqIGMgLSBhMDEgKiBzO1xuICBvdXRbNl0gPSBhMTIgKiBjIC0gYTAyICogcztcbiAgb3V0WzddID0gYTEzICogYyAtIGEwMyAqIHM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHRyYW5zbGF0aW9uXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIGRlc3QsIHZlYyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDE7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFNjYWxpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gdlsxXTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IHZbMl07XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZSBhcm91bmQgYSBnaXZlbiBheGlzXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQucm90YXRlKGRlc3QsIGRlc3QsIHJhZCwgYXhpcyk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZFxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uKG91dCwgcmFkLCBheGlzKSB7XG4gIHZhciB4ID0gYXhpc1swXSxcbiAgICAgIHkgPSBheGlzWzFdLFxuICAgICAgeiA9IGF4aXNbMl07XG4gIHZhciBsZW4gPSBNYXRoLmh5cG90KHgsIHksIHopO1xuICB2YXIgcywgYywgdDtcblxuICBpZiAobGVuIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGVuID0gMSAvIGxlbjtcbiAgeCAqPSBsZW47XG4gIHkgKj0gbGVuO1xuICB6ICo9IGxlbjtcbiAgcyA9IE1hdGguc2luKHJhZCk7XG4gIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB0ID0gMSAtIGM7IC8vIFBlcmZvcm0gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0geCAqIHggKiB0ICsgYztcbiAgb3V0WzFdID0geSAqIHggKiB0ICsgeiAqIHM7XG4gIG91dFsyXSA9IHogKiB4ICogdCAtIHkgKiBzO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB4ICogeSAqIHQgLSB6ICogcztcbiAgb3V0WzVdID0geSAqIHkgKiB0ICsgYztcbiAgb3V0WzZdID0geiAqIHkgKiB0ICsgeCAqIHM7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHggKiB6ICogdCArIHkgKiBzO1xuICBvdXRbOV0gPSB5ICogeiAqIHQgLSB4ICogcztcbiAgb3V0WzEwXSA9IHogKiB6ICogdCArIGM7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWCBheGlzXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQucm90YXRlWChkZXN0LCBkZXN0LCByYWQpO1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tWFJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOyAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gYztcbiAgb3V0WzZdID0gcztcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gLXM7XG4gIG91dFsxMF0gPSBjO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFkgYXhpc1xyXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcclxuICpcclxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XHJcbiAqICAgICBtYXQ0LnJvdGF0ZVkoZGVzdCwgZGVzdCwgcmFkKTtcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVlSb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTsgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IGM7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IC1zO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAxO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSBzO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gYztcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBaIGF4aXNcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC5yb3RhdGVaKGRlc3QsIGRlc3QsIHJhZCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21aUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSBzO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAtcztcbiAgb3V0WzVdID0gYztcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uIGFuZCB2ZWN0b3IgdHJhbnNsYXRpb25cclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcclxuICogICAgIGxldCBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcclxuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcclxuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBxLCB2KSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHh5ID0geCAqIHkyO1xuICB2YXIgeHogPSB4ICogejI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHl6ID0geSAqIHoyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSAoeXkgKyB6eik7XG4gIG91dFsxXSA9IHh5ICsgd3o7XG4gIG91dFsyXSA9IHh6IC0gd3k7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IHh5IC0gd3o7XG4gIG91dFs1XSA9IDEgLSAoeHggKyB6eik7XG4gIG91dFs2XSA9IHl6ICsgd3g7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHh6ICsgd3k7XG4gIG91dFs5XSA9IHl6IC0gd3g7XG4gIG91dFsxMF0gPSAxIC0gKHh4ICsgeXkpO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBtYXQ0IGZyb20gYSBkdWFsIHF1YXQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IE1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgRHVhbCBRdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVF1YXQyKG91dCwgYSkge1xuICB2YXIgdHJhbnNsYXRpb24gPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XTtcbiAgdmFyIG1hZ25pdHVkZSA9IGJ4ICogYnggKyBieSAqIGJ5ICsgYnogKiBieiArIGJ3ICogYnc7IC8vT25seSBzY2FsZSBpZiBpdCBtYWtlcyBzZW5zZVxuXG4gIGlmIChtYWduaXR1ZGUgPiAwKSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyIC8gbWFnbml0dWRlO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMiAvIG1hZ25pdHVkZTtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDIgLyBtYWduaXR1ZGU7XG4gIH0gZWxzZSB7XG4gICAgdHJhbnNsYXRpb25bMF0gPSAoYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSkgKiAyO1xuICAgIHRyYW5zbGF0aW9uWzFdID0gKGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnopICogMjtcbiAgICB0cmFuc2xhdGlvblsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDI7XG4gIH1cblxuICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIGEsIHRyYW5zbGF0aW9uKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IgY29tcG9uZW50IG9mIGEgdHJhbnNmb3JtYXRpb25cclxuICogIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aCBmcm9tUm90YXRpb25UcmFuc2xhdGlvbixcclxuICogIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgdHJhbnNsYXRpb24gdmVjdG9yXHJcbiAqICBvcmlnaW5hbGx5IHN1cHBsaWVkLlxyXG4gKiBAcGFyYW0gIHt2ZWMzfSBvdXQgVmVjdG9yIHRvIHJlY2VpdmUgdHJhbnNsYXRpb24gY29tcG9uZW50XHJcbiAqIEBwYXJhbSAge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcclxuICogQHJldHVybiB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb24ob3V0LCBtYXQpIHtcbiAgb3V0WzBdID0gbWF0WzEyXTtcbiAgb3V0WzFdID0gbWF0WzEzXTtcbiAgb3V0WzJdID0gbWF0WzE0XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBzY2FsaW5nIGZhY3RvciBjb21wb25lbnQgb2YgYSB0cmFuc2Zvcm1hdGlvblxyXG4gKiAgbWF0cml4LiBJZiBhIG1hdHJpeCBpcyBidWlsdCB3aXRoIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVcclxuICogIHdpdGggYSBub3JtYWxpemVkIFF1YXRlcm5pb24gcGFyYW10ZXIsIHRoZSByZXR1cm5lZCB2ZWN0b3Igd2lsbCBiZVxyXG4gKiAgdGhlIHNhbWUgYXMgdGhlIHNjYWxpbmcgdmVjdG9yXHJcbiAqICBvcmlnaW5hbGx5IHN1cHBsaWVkLlxyXG4gKiBAcGFyYW0gIHt2ZWMzfSBvdXQgVmVjdG9yIHRvIHJlY2VpdmUgc2NhbGluZyBmYWN0b3IgY29tcG9uZW50XHJcbiAqIEBwYXJhbSAge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcclxuICogQHJldHVybiB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NhbGluZyhvdXQsIG1hdCkge1xuICB2YXIgbTExID0gbWF0WzBdO1xuICB2YXIgbTEyID0gbWF0WzFdO1xuICB2YXIgbTEzID0gbWF0WzJdO1xuICB2YXIgbTIxID0gbWF0WzRdO1xuICB2YXIgbTIyID0gbWF0WzVdO1xuICB2YXIgbTIzID0gbWF0WzZdO1xuICB2YXIgbTMxID0gbWF0WzhdO1xuICB2YXIgbTMyID0gbWF0WzldO1xuICB2YXIgbTMzID0gbWF0WzEwXTtcbiAgb3V0WzBdID0gTWF0aC5oeXBvdChtMTEsIG0xMiwgbTEzKTtcbiAgb3V0WzFdID0gTWF0aC5oeXBvdChtMjEsIG0yMiwgbTIzKTtcbiAgb3V0WzJdID0gTWF0aC5oeXBvdChtMzEsIG0zMiwgbTMzKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJvdGF0aW9uYWwgY29tcG9uZW50XHJcbiAqICBvZiBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aFxyXG4gKiAgZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24sIHRoZSByZXR1cm5lZCBxdWF0ZXJuaW9uIHdpbGwgYmUgdGhlXHJcbiAqICBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIG9yaWdpbmFsbHkgc3VwcGxpZWQuXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IFF1YXRlcm5pb24gdG8gcmVjZWl2ZSB0aGUgcm90YXRpb24gY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBtYXQgTWF0cml4IHRvIGJlIGRlY29tcG9zZWQgKGlucHV0KVxyXG4gKiBAcmV0dXJuIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3RhdGlvbihvdXQsIG1hdCkge1xuICB2YXIgc2NhbGluZyA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBnZXRTY2FsaW5nKHNjYWxpbmcsIG1hdCk7XG4gIHZhciBpczEgPSAxIC8gc2NhbGluZ1swXTtcbiAgdmFyIGlzMiA9IDEgLyBzY2FsaW5nWzFdO1xuICB2YXIgaXMzID0gMSAvIHNjYWxpbmdbMl07XG4gIHZhciBzbTExID0gbWF0WzBdICogaXMxO1xuICB2YXIgc20xMiA9IG1hdFsxXSAqIGlzMjtcbiAgdmFyIHNtMTMgPSBtYXRbMl0gKiBpczM7XG4gIHZhciBzbTIxID0gbWF0WzRdICogaXMxO1xuICB2YXIgc20yMiA9IG1hdFs1XSAqIGlzMjtcbiAgdmFyIHNtMjMgPSBtYXRbNl0gKiBpczM7XG4gIHZhciBzbTMxID0gbWF0WzhdICogaXMxO1xuICB2YXIgc20zMiA9IG1hdFs5XSAqIGlzMjtcbiAgdmFyIHNtMzMgPSBtYXRbMTBdICogaXMzO1xuICB2YXIgdHJhY2UgPSBzbTExICsgc20yMiArIHNtMzM7XG4gIHZhciBTID0gMDtcblxuICBpZiAodHJhY2UgPiAwKSB7XG4gICAgUyA9IE1hdGguc3FydCh0cmFjZSArIDEuMCkgKiAyO1xuICAgIG91dFszXSA9IDAuMjUgKiBTO1xuICAgIG91dFswXSA9IChzbTIzIC0gc20zMikgLyBTO1xuICAgIG91dFsxXSA9IChzbTMxIC0gc20xMykgLyBTO1xuICAgIG91dFsyXSA9IChzbTEyIC0gc20yMSkgLyBTO1xuICB9IGVsc2UgaWYgKHNtMTEgPiBzbTIyICYmIHNtMTEgPiBzbTMzKSB7XG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBzbTExIC0gc20yMiAtIHNtMzMpICogMjtcbiAgICBvdXRbM10gPSAoc20yMyAtIHNtMzIpIC8gUztcbiAgICBvdXRbMF0gPSAwLjI1ICogUztcbiAgICBvdXRbMV0gPSAoc20xMiArIHNtMjEpIC8gUztcbiAgICBvdXRbMl0gPSAoc20zMSArIHNtMTMpIC8gUztcbiAgfSBlbHNlIGlmIChzbTIyID4gc20zMykge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20yMiAtIHNtMTEgLSBzbTMzKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMzEgLSBzbTEzKSAvIFM7XG4gICAgb3V0WzBdID0gKHNtMTIgKyBzbTIxKSAvIFM7XG4gICAgb3V0WzFdID0gMC4yNSAqIFM7XG4gICAgb3V0WzJdID0gKHNtMjMgKyBzbTMyKSAvIFM7XG4gIH0gZWxzZSB7XG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBzbTMzIC0gc20xMSAtIHNtMjIpICogMjtcbiAgICBvdXRbM10gPSAoc20xMiAtIHNtMjEpIC8gUztcbiAgICBvdXRbMF0gPSAoc20zMSArIHNtMTMpIC8gUztcbiAgICBvdXRbMV0gPSAoc20yMyArIHNtMzIpIC8gUztcbiAgICBvdXRbMl0gPSAwLjI1ICogUztcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiwgdmVjdG9yIHRyYW5zbGF0aW9uIGFuZCB2ZWN0b3Igc2NhbGVcclxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XHJcbiAqXHJcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xyXG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgdmVjKTtcclxuICogICAgIGxldCBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcclxuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcclxuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XHJcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIHNjYWxlKVxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHMgU2NhbGluZyB2ZWN0b3JcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGUob3V0LCBxLCB2LCBzKSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHh5ID0geCAqIHkyO1xuICB2YXIgeHogPSB4ICogejI7XG4gIHZhciB5eSA9IHkgKiB5MjtcbiAgdmFyIHl6ID0geSAqIHoyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIHZhciBzeCA9IHNbMF07XG4gIHZhciBzeSA9IHNbMV07XG4gIHZhciBzeiA9IHNbMl07XG4gIG91dFswXSA9ICgxIC0gKHl5ICsgenopKSAqIHN4O1xuICBvdXRbMV0gPSAoeHkgKyB3eikgKiBzeDtcbiAgb3V0WzJdID0gKHh6IC0gd3kpICogc3g7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9ICh4eSAtIHd6KSAqIHN5O1xuICBvdXRbNV0gPSAoMSAtICh4eCArIHp6KSkgKiBzeTtcbiAgb3V0WzZdID0gKHl6ICsgd3gpICogc3k7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9ICh4eiArIHd5KSAqIHN6O1xuICBvdXRbOV0gPSAoeXogLSB3eCkgKiBzejtcbiAgb3V0WzEwXSA9ICgxIC0gKHh4ICsgeXkpKSAqIHN6O1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiwgdmVjdG9yIHRyYW5zbGF0aW9uIGFuZCB2ZWN0b3Igc2NhbGUsIHJvdGF0aW5nIGFuZCBzY2FsaW5nIGFyb3VuZCB0aGUgZ2l2ZW4gb3JpZ2luXHJcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxyXG4gKlxyXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcclxuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBvcmlnaW4pO1xyXG4gKiAgICAgbGV0IHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xyXG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xyXG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcclxuICogICAgIG1hdDQuc2NhbGUoZGVzdCwgc2NhbGUpXHJcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBuZWdhdGl2ZU9yaWdpbik7XHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gcyBTY2FsaW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gbyBUaGUgb3JpZ2luIHZlY3RvciBhcm91bmQgd2hpY2ggdG8gc2NhbGUgYW5kIHJvdGF0ZVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZU9yaWdpbihvdXQsIHEsIHYsIHMsIG8pIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgdmFyIHN4ID0gc1swXTtcbiAgdmFyIHN5ID0gc1sxXTtcbiAgdmFyIHN6ID0gc1syXTtcbiAgdmFyIG94ID0gb1swXTtcbiAgdmFyIG95ID0gb1sxXTtcbiAgdmFyIG96ID0gb1syXTtcbiAgdmFyIG91dDAgPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgdmFyIG91dDEgPSAoeHkgKyB3eikgKiBzeDtcbiAgdmFyIG91dDIgPSAoeHogLSB3eSkgKiBzeDtcbiAgdmFyIG91dDQgPSAoeHkgLSB3eikgKiBzeTtcbiAgdmFyIG91dDUgPSAoMSAtICh4eCArIHp6KSkgKiBzeTtcbiAgdmFyIG91dDYgPSAoeXogKyB3eCkgKiBzeTtcbiAgdmFyIG91dDggPSAoeHogKyB3eSkgKiBzejtcbiAgdmFyIG91dDkgPSAoeXogLSB3eCkgKiBzejtcbiAgdmFyIG91dDEwID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFswXSA9IG91dDA7XG4gIG91dFsxXSA9IG91dDE7XG4gIG91dFsyXSA9IG91dDI7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IG91dDQ7XG4gIG91dFs1XSA9IG91dDU7XG4gIG91dFs2XSA9IG91dDY7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IG91dDg7XG4gIG91dFs5XSA9IG91dDk7XG4gIG91dFsxMF0gPSBvdXQxMDtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdICsgb3ggLSAob3V0MCAqIG94ICsgb3V0NCAqIG95ICsgb3V0OCAqIG96KTtcbiAgb3V0WzEzXSA9IHZbMV0gKyBveSAtIChvdXQxICogb3ggKyBvdXQ1ICogb3kgKyBvdXQ5ICogb3opO1xuICBvdXRbMTRdID0gdlsyXSArIG96IC0gKG91dDIgKiBveCArIG91dDYgKiBveSArIG91dDEwICogb3opO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIGEgNHg0IG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgUXVhdGVybmlvbiB0byBjcmVhdGUgbWF0cml4IGZyb21cclxuICpcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21RdWF0KG91dCwgcSkge1xuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHl4ID0geSAqIHgyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB6eCA9IHogKiB4MjtcbiAgdmFyIHp5ID0geiAqIHkyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICBvdXRbMV0gPSB5eCArIHd6O1xuICBvdXRbMl0gPSB6eCAtIHd5O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB5eCAtIHd6O1xuICBvdXRbNV0gPSAxIC0geHggLSB6ejtcbiAgb3V0WzZdID0genkgKyB3eDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0genggKyB3eTtcbiAgb3V0WzldID0genkgLSB3eDtcbiAgb3V0WzEwXSA9IDEgLSB4eCAtIHl5O1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgZnJ1c3R1bSBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtOdW1iZXJ9IGxlZnQgTGVmdCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IHRvcCBUb3AgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtOdW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge051bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJ1c3R1bShvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gIHZhciBybCA9IDEgLyAocmlnaHQgLSBsZWZ0KTtcbiAgdmFyIHRiID0gMSAvICh0b3AgLSBib3R0b20pO1xuICB2YXIgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMF0gPSBuZWFyICogMiAqIHJsO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSBuZWFyICogMiAqIHRiO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAocmlnaHQgKyBsZWZ0KSAqIHJsO1xuICBvdXRbOV0gPSAodG9wICsgYm90dG9tKSAqIHRiO1xuICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gIG91dFsxMV0gPSAtMTtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gZmFyICogbmVhciAqIDIgKiBuZjtcbiAgb3V0WzE1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLlxyXG4gKiBQYXNzaW5nIG51bGwvdW5kZWZpbmVkL25vIHZhbHVlIGZvciBmYXIgd2lsbCBnZW5lcmF0ZSBpbmZpbml0ZSBwcm9qZWN0aW9uIG1hdHJpeC5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge251bWJlcn0gZm92eSBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcclxuICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCBBc3BlY3QgcmF0aW8uIHR5cGljYWxseSB2aWV3cG9ydCB3aWR0aC9oZWlnaHRcclxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxyXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bSwgY2FuIGJlIG51bGwgb3IgSW5maW5pdHlcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlKG91dCwgZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpIHtcbiAgdmFyIGYgPSAxLjAgLyBNYXRoLnRhbihmb3Z5IC8gMiksXG4gICAgICBuZjtcbiAgb3V0WzBdID0gZiAvIGFzcGVjdDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gZjtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzExXSA9IC0xO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNV0gPSAwO1xuXG4gIGlmIChmYXIgIT0gbnVsbCAmJiBmYXIgIT09IEluZmluaXR5KSB7XG4gICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgICBvdXRbMTRdID0gMiAqIGZhciAqIG5lYXIgKiBuZjtcbiAgfSBlbHNlIHtcbiAgICBvdXRbMTBdID0gLTE7XG4gICAgb3V0WzE0XSA9IC0yICogbmVhcjtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZmllbGQgb2Ygdmlldy5cclxuICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBnZW5lcmF0aW5nIHByb2plY3Rpb24gbWF0cmljZXMgdG8gYmUgdXNlZFxyXG4gKiB3aXRoIHRoZSBzdGlsbCBleHBlcmllbWVudGFsIFdlYlZSIEFQSS5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge09iamVjdH0gZm92IE9iamVjdCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiB1cERlZ3JlZXMsIGRvd25EZWdyZWVzLCBsZWZ0RGVncmVlcywgcmlnaHREZWdyZWVzXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlRnJvbUZpZWxkT2ZWaWV3KG91dCwgZm92LCBuZWFyLCBmYXIpIHtcbiAgdmFyIHVwVGFuID0gTWF0aC50YW4oZm92LnVwRGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciBkb3duVGFuID0gTWF0aC50YW4oZm92LmRvd25EZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIGxlZnRUYW4gPSBNYXRoLnRhbihmb3YubGVmdERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgcmlnaHRUYW4gPSBNYXRoLnRhbihmb3YucmlnaHREZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIHhTY2FsZSA9IDIuMCAvIChsZWZ0VGFuICsgcmlnaHRUYW4pO1xuICB2YXIgeVNjYWxlID0gMi4wIC8gKHVwVGFuICsgZG93blRhbik7XG4gIG91dFswXSA9IHhTY2FsZTtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIG91dFszXSA9IDAuMDtcbiAgb3V0WzRdID0gMC4wO1xuICBvdXRbNV0gPSB5U2NhbGU7XG4gIG91dFs2XSA9IDAuMDtcbiAgb3V0WzddID0gMC4wO1xuICBvdXRbOF0gPSAtKChsZWZ0VGFuIC0gcmlnaHRUYW4pICogeFNjYWxlICogMC41KTtcbiAgb3V0WzldID0gKHVwVGFuIC0gZG93blRhbikgKiB5U2NhbGUgKiAwLjU7XG4gIG91dFsxMF0gPSBmYXIgLyAobmVhciAtIGZhcik7XG4gIG91dFsxMV0gPSAtMS4wO1xuICBvdXRbMTJdID0gMC4wO1xuICBvdXRbMTNdID0gMC4wO1xuICBvdXRbMTRdID0gZmFyICogbmVhciAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzE1XSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBvcnRob2dvbmFsIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IHJpZ2h0IFJpZ2h0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9ydGhvKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgdmFyIGxyID0gMSAvIChsZWZ0IC0gcmlnaHQpO1xuICB2YXIgYnQgPSAxIC8gKGJvdHRvbSAtIHRvcCk7XG4gIHZhciBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gIG91dFswXSA9IC0yICogbHI7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IC0yICogYnQ7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAyICogbmY7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gKGxlZnQgKyByaWdodCkgKiBscjtcbiAgb3V0WzEzXSA9ICh0b3AgKyBib3R0b20pICogYnQ7XG4gIG91dFsxNF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgbG9vay1hdCBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXMuXHJcbiAqIElmIHlvdSB3YW50IGEgbWF0cml4IHRoYXQgYWN0dWFsbHkgbWFrZXMgYW4gb2JqZWN0IGxvb2sgYXQgYW5vdGhlciBvYmplY3QsIHlvdSBzaG91bGQgdXNlIHRhcmdldFRvIGluc3RlYWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsb29rQXQob3V0LCBleWUsIGNlbnRlciwgdXApIHtcbiAgdmFyIHgwLCB4MSwgeDIsIHkwLCB5MSwgeTIsIHowLCB6MSwgejIsIGxlbjtcbiAgdmFyIGV5ZXggPSBleWVbMF07XG4gIHZhciBleWV5ID0gZXllWzFdO1xuICB2YXIgZXlleiA9IGV5ZVsyXTtcbiAgdmFyIHVweCA9IHVwWzBdO1xuICB2YXIgdXB5ID0gdXBbMV07XG4gIHZhciB1cHogPSB1cFsyXTtcbiAgdmFyIGNlbnRlcnggPSBjZW50ZXJbMF07XG4gIHZhciBjZW50ZXJ5ID0gY2VudGVyWzFdO1xuICB2YXIgY2VudGVyeiA9IGNlbnRlclsyXTtcblxuICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgZ2xNYXRyaXguRVBTSUxPTiAmJiBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCBnbE1hdHJpeC5FUFNJTE9OICYmIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gaWRlbnRpdHkob3V0KTtcbiAgfVxuXG4gIHowID0gZXlleCAtIGNlbnRlcng7XG4gIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gIHoyID0gZXlleiAtIGNlbnRlcno7XG4gIGxlbiA9IDEgLyBNYXRoLmh5cG90KHowLCB6MSwgejIpO1xuICB6MCAqPSBsZW47XG4gIHoxICo9IGxlbjtcbiAgejIgKj0gbGVuO1xuICB4MCA9IHVweSAqIHoyIC0gdXB6ICogejE7XG4gIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICBsZW4gPSBNYXRoLmh5cG90KHgwLCB4MSwgeDIpO1xuXG4gIGlmICghbGVuKSB7XG4gICAgeDAgPSAwO1xuICAgIHgxID0gMDtcbiAgICB4MiA9IDA7XG4gIH0gZWxzZSB7XG4gICAgbGVuID0gMSAvIGxlbjtcbiAgICB4MCAqPSBsZW47XG4gICAgeDEgKj0gbGVuO1xuICAgIHgyICo9IGxlbjtcbiAgfVxuXG4gIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gIHkyID0gejAgKiB4MSAtIHoxICogeDA7XG4gIGxlbiA9IE1hdGguaHlwb3QoeTAsIHkxLCB5Mik7XG5cbiAgaWYgKCFsZW4pIHtcbiAgICB5MCA9IDA7XG4gICAgeTEgPSAwO1xuICAgIHkyID0gMDtcbiAgfSBlbHNlIHtcbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHkwICo9IGxlbjtcbiAgICB5MSAqPSBsZW47XG4gICAgeTIgKj0gbGVuO1xuICB9XG5cbiAgb3V0WzBdID0geDA7XG4gIG91dFsxXSA9IHkwO1xuICBvdXRbMl0gPSB6MDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geDE7XG4gIG91dFs1XSA9IHkxO1xuICBvdXRbNl0gPSB6MTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0geDI7XG4gIG91dFs5XSA9IHkyO1xuICBvdXRbMTBdID0gejI7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gLSh4MCAqIGV5ZXggKyB4MSAqIGV5ZXkgKyB4MiAqIGV5ZXopO1xuICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSBtYXRyaXggdGhhdCBtYWtlcyBzb21ldGhpbmcgbG9vayBhdCBzb21ldGhpbmcgZWxzZS5cclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHVwIHZlYzMgcG9pbnRpbmcgdXBcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRhcmdldFRvKG91dCwgZXllLCB0YXJnZXQsIHVwKSB7XG4gIHZhciBleWV4ID0gZXllWzBdLFxuICAgICAgZXlleSA9IGV5ZVsxXSxcbiAgICAgIGV5ZXogPSBleWVbMl0sXG4gICAgICB1cHggPSB1cFswXSxcbiAgICAgIHVweSA9IHVwWzFdLFxuICAgICAgdXB6ID0gdXBbMl07XG4gIHZhciB6MCA9IGV5ZXggLSB0YXJnZXRbMF0sXG4gICAgICB6MSA9IGV5ZXkgLSB0YXJnZXRbMV0sXG4gICAgICB6MiA9IGV5ZXogLSB0YXJnZXRbMl07XG4gIHZhciBsZW4gPSB6MCAqIHowICsgejEgKiB6MSArIHoyICogejI7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgejAgKj0gbGVuO1xuICAgIHoxICo9IGxlbjtcbiAgICB6MiAqPSBsZW47XG4gIH1cblxuICB2YXIgeDAgPSB1cHkgKiB6MiAtIHVweiAqIHoxLFxuICAgICAgeDEgPSB1cHogKiB6MCAtIHVweCAqIHoyLFxuICAgICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICBsZW4gPSB4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDI7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgeDAgKj0gbGVuO1xuICAgIHgxICo9IGxlbjtcbiAgICB4MiAqPSBsZW47XG4gIH1cblxuICBvdXRbMF0gPSB4MDtcbiAgb3V0WzFdID0geDE7XG4gIG91dFsyXSA9IHgyO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB6MSAqIHgyIC0gejIgKiB4MTtcbiAgb3V0WzVdID0gejIgKiB4MCAtIHowICogeDI7XG4gIG91dFs2XSA9IHowICogeDEgLSB6MSAqIHgwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB6MDtcbiAgb3V0WzldID0gejE7XG4gIG91dFsxMF0gPSB6MjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSBleWV4O1xuICBvdXRbMTNdID0gZXlleTtcbiAgb3V0WzE0XSA9IGV5ZXo7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcclxuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRyaXhcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJtYXQ0KFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiLCBcIiArIGFbNF0gKyBcIiwgXCIgKyBhWzVdICsgXCIsIFwiICsgYVs2XSArIFwiLCBcIiArIGFbN10gKyBcIiwgXCIgKyBhWzhdICsgXCIsIFwiICsgYVs5XSArIFwiLCBcIiArIGFbMTBdICsgXCIsIFwiICsgYVsxMV0gKyBcIiwgXCIgKyBhWzEyXSArIFwiLCBcIiArIGFbMTNdICsgXCIsIFwiICsgYVsxNF0gKyBcIiwgXCIgKyBhWzE1XSArIFwiKVwiO1xufVxuLyoqXHJcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQ0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEZyb2Jlbml1cyBub3JtXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIGFbNl0sIGFbN10sIGFbOF0sIGFbOV0sIGFbMTBdLCBhWzExXSwgYVsxMl0sIGFbMTNdLCBhWzE0XSwgYVsxNV0pO1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl07XG4gIG91dFs3XSA9IGFbN10gKyBiWzddO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XTtcbiAgb3V0WzldID0gYVs5XSArIGJbOV07XG4gIG91dFsxMF0gPSBhWzEwXSArIGJbMTBdO1xuICBvdXRbMTFdID0gYVsxMV0gKyBiWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdICsgYlsxMl07XG4gIG91dFsxM10gPSBhWzEzXSArIGJbMTNdO1xuICBvdXRbMTRdID0gYVsxNF0gKyBiWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdICsgYlsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIG1hdHJpeCBiIGZyb20gbWF0cml4IGFcclxuICpcclxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIG91dFs0XSA9IGFbNF0gLSBiWzRdO1xuICBvdXRbNV0gPSBhWzVdIC0gYls1XTtcbiAgb3V0WzZdID0gYVs2XSAtIGJbNl07XG4gIG91dFs3XSA9IGFbN10gLSBiWzddO1xuICBvdXRbOF0gPSBhWzhdIC0gYls4XTtcbiAgb3V0WzldID0gYVs5XSAtIGJbOV07XG4gIG91dFsxMF0gPSBhWzEwXSAtIGJbMTBdO1xuICBvdXRbMTFdID0gYVsxMV0gLSBiWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdIC0gYlsxMl07XG4gIG91dFsxM10gPSBhWzEzXSAtIGJbMTNdO1xuICBvdXRbMTRdID0gYVsxNF0gLSBiWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdIC0gYlsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxyXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICBvdXRbNF0gPSBhWzRdICogYjtcbiAgb3V0WzVdID0gYVs1XSAqIGI7XG4gIG91dFs2XSA9IGFbNl0gKiBiO1xuICBvdXRbN10gPSBhWzddICogYjtcbiAgb3V0WzhdID0gYVs4XSAqIGI7XG4gIG91dFs5XSA9IGFbOV0gKiBiO1xuICBvdXRbMTBdID0gYVsxMF0gKiBiO1xuICBvdXRbMTFdID0gYVsxMV0gKiBiO1xuICBvdXRbMTJdID0gYVsxMl0gKiBiO1xuICBvdXRbMTNdID0gYVsxM10gKiBiO1xuICBvdXRbMTRdID0gYVsxNF0gKiBiO1xuICBvdXRbMTVdID0gYVsxNV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEFkZHMgdHdvIG1hdDQncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcclxuICogQHJldHVybnMge21hdDR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF0gKiBzY2FsZTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV0gKiBzY2FsZTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl0gKiBzY2FsZTtcbiAgb3V0WzddID0gYVs3XSArIGJbN10gKiBzY2FsZTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF0gKiBzY2FsZTtcbiAgb3V0WzldID0gYVs5XSArIGJbOV0gKiBzY2FsZTtcbiAgb3V0WzEwXSA9IGFbMTBdICsgYlsxMF0gKiBzY2FsZTtcbiAgb3V0WzExXSA9IGFbMTFdICsgYlsxMV0gKiBzY2FsZTtcbiAgb3V0WzEyXSA9IGFbMTJdICsgYlsxMl0gKiBzY2FsZTtcbiAgb3V0WzEzXSA9IGFbMTNdICsgYlsxM10gKiBzY2FsZTtcbiAgb3V0WzE0XSA9IGFbMTRdICsgYlsxNF0gKiBzY2FsZTtcbiAgb3V0WzE1XSA9IGFbMTVdICsgYlsxNV0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXSAmJiBhWzRdID09PSBiWzRdICYmIGFbNV0gPT09IGJbNV0gJiYgYVs2XSA9PT0gYls2XSAmJiBhWzddID09PSBiWzddICYmIGFbOF0gPT09IGJbOF0gJiYgYVs5XSA9PT0gYls5XSAmJiBhWzEwXSA9PT0gYlsxMF0gJiYgYVsxMV0gPT09IGJbMTFdICYmIGFbMTJdID09PSBiWzEyXSAmJiBhWzEzXSA9PT0gYlsxM10gJiYgYVsxNF0gPT09IGJbMTRdICYmIGFbMTVdID09PSBiWzE1XTtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIFRoZSBmaXJzdCBtYXRyaXguXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIFRoZSBzZWNvbmQgbWF0cml4LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XSxcbiAgICAgIGE2ID0gYVs2XSxcbiAgICAgIGE3ID0gYVs3XTtcbiAgdmFyIGE4ID0gYVs4XSxcbiAgICAgIGE5ID0gYVs5XSxcbiAgICAgIGExMCA9IGFbMTBdLFxuICAgICAgYTExID0gYVsxMV07XG4gIHZhciBhMTIgPSBhWzEyXSxcbiAgICAgIGExMyA9IGFbMTNdLFxuICAgICAgYTE0ID0gYVsxNF0sXG4gICAgICBhMTUgPSBhWzE1XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgdmFyIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XSxcbiAgICAgIGI2ID0gYls2XSxcbiAgICAgIGI3ID0gYls3XTtcbiAgdmFyIGI4ID0gYls4XSxcbiAgICAgIGI5ID0gYls5XSxcbiAgICAgIGIxMCA9IGJbMTBdLFxuICAgICAgYjExID0gYlsxMV07XG4gIHZhciBiMTIgPSBiWzEyXSxcbiAgICAgIGIxMyA9IGJbMTNdLFxuICAgICAgYjE0ID0gYlsxNF0sXG4gICAgICBiMTUgPSBiWzE1XTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJiBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiYgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmIE1hdGguYWJzKGE2IC0gYjYpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE2KSwgTWF0aC5hYnMoYjYpKSAmJiBNYXRoLmFicyhhNyAtIGI3KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNyksIE1hdGguYWJzKGI3KSkgJiYgTWF0aC5hYnMoYTggLSBiOCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTgpLCBNYXRoLmFicyhiOCkpICYmIE1hdGguYWJzKGE5IC0gYjkpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE5KSwgTWF0aC5hYnMoYjkpKSAmJiBNYXRoLmFicyhhMTAgLSBiMTApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMCksIE1hdGguYWJzKGIxMCkpICYmIE1hdGguYWJzKGExMSAtIGIxMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTExKSwgTWF0aC5hYnMoYjExKSkgJiYgTWF0aC5hYnMoYTEyIC0gYjEyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTIpLCBNYXRoLmFicyhiMTIpKSAmJiBNYXRoLmFicyhhMTMgLSBiMTMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMyksIE1hdGguYWJzKGIxMykpICYmIE1hdGguYWJzKGExNCAtIGIxNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTE0KSwgTWF0aC5hYnMoYjE0KSkgJiYgTWF0aC5hYnMoYTE1IC0gYjE1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTUpLCBNYXRoLmFicyhiMTUpKTtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiAzIERpbWVuc2lvbmFsIFZlY3RvclxyXG4gKiBAbW9kdWxlIHZlYzNcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMzXHJcbiAqXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjbG9uZVxyXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHopO1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMyBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeCwgeSwgeikge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzMgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgc291cmNlIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHksIHopIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBEaXZpZGVzIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gY2VpbFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gZmxvb3JcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIHJvdW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5yb3VuZChhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTY2FsZXMgYSB2ZWMzIGJ5IGEgc2NhbGFyIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgdmVjdG9yIGJ5XHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMzJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeik7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBuZWdhdGVcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gaW52ZXJ0XHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHZlYzNcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6O1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICBvdXRbMl0gPSBhWzJdICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdO1xufVxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMzJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIGEsIGIpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXTtcbiAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheCAqIGJ5IC0gYXkgKiBieDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzMnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVycChvdXQsIGEsIGIsIHQpIHtcbiAgdmFyIGF4ID0gYVswXTtcbiAgdmFyIGF5ID0gYVsxXTtcbiAgdmFyIGF6ID0gYVsyXTtcbiAgb3V0WzBdID0gYXggKyB0ICogKGJbMF0gLSBheCk7XG4gIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGhlcm1pdGUgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGMgdGhlIHRoaXJkIG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGhlcm1pdGUob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDtcbiAgdmFyIGZhY3RvcjEgPSBmYWN0b3JUaW1lczIgKiAoMiAqIHQgLSAzKSArIDE7XG4gIHZhciBmYWN0b3IyID0gZmFjdG9yVGltZXMyICogKHQgLSAyKSArIHQ7XG4gIHZhciBmYWN0b3IzID0gZmFjdG9yVGltZXMyICogKHQgLSAxKTtcbiAgdmFyIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiAoMyAtIDIgKiB0KTtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIGJlemllciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZCB0aGUgZm91cnRoIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYmV6aWVyKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgaW52ZXJzZUZhY3RvciA9IDEgLSB0O1xuICB2YXIgaW52ZXJzZUZhY3RvclRpbWVzVHdvID0gaW52ZXJzZUZhY3RvciAqIGludmVyc2VGYWN0b3I7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDtcbiAgdmFyIGZhY3RvcjEgPSBpbnZlcnNlRmFjdG9yVGltZXNUd28gKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yMiA9IDMgKiB0ICogaW52ZXJzZUZhY3RvclRpbWVzVHdvO1xuICB2YXIgZmFjdG9yMyA9IDMgKiBmYWN0b3JUaW1lczIgKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqIHQ7XG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQsIHNjYWxlKSB7XG4gIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgdmFyIHogPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAtIDEuMDtcbiAgdmFyIHpTY2FsZSA9IE1hdGguc3FydCgxLjAgLSB6ICogeikgKiBzY2FsZTtcbiAgb3V0WzBdID0gTWF0aC5jb3MocikgKiB6U2NhbGU7XG4gIG91dFsxXSA9IE1hdGguc2luKHIpICogelNjYWxlO1xuICBvdXRbMl0gPSB6ICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0NC5cclxuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcclxuICpcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICB2YXIgdyA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XTtcbiAgdyA9IHcgfHwgMS4wO1xuICBvdXRbMF0gPSAobVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0pIC8gdztcbiAgb3V0WzFdID0gKG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzldICogeiArIG1bMTNdKSAvIHc7XG4gIG91dFsyXSA9IChtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0pIC8gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSB0aGUgM3gzIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgb3V0WzBdID0geCAqIG1bMF0gKyB5ICogbVszXSArIHogKiBtWzZdO1xuICBvdXRbMV0gPSB4ICogbVsxXSArIHkgKiBtWzRdICsgeiAqIG1bN107XG4gIG91dFsyXSA9IHggKiBtWzJdICsgeSAqIG1bNV0gKyB6ICogbVs4XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBxdWF0XHJcbiAqIENhbiBhbHNvIGJlIHVzZWQgZm9yIGR1YWwgcXVhdGVybmlvbnMuIChNdWx0aXBseSBpdCB3aXRoIHRoZSByZWFsIHBhcnQpXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7XG4gIC8vIGJlbmNobWFya3M6IGh0dHBzOi8vanNwZXJmLmNvbS9xdWF0ZXJuaW9uLXRyYW5zZm9ybS12ZWMzLWltcGxlbWVudGF0aW9ucy1maXhlZFxuICB2YXIgcXggPSBxWzBdLFxuICAgICAgcXkgPSBxWzFdLFxuICAgICAgcXogPSBxWzJdLFxuICAgICAgcXcgPSBxWzNdO1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdOyAvLyB2YXIgcXZlYyA9IFtxeCwgcXksIHF6XTtcbiAgLy8gdmFyIHV2ID0gdmVjMy5jcm9zcyhbXSwgcXZlYywgYSk7XG5cbiAgdmFyIHV2eCA9IHF5ICogeiAtIHF6ICogeSxcbiAgICAgIHV2eSA9IHF6ICogeCAtIHF4ICogeixcbiAgICAgIHV2eiA9IHF4ICogeSAtIHF5ICogeDsgLy8gdmFyIHV1diA9IHZlYzMuY3Jvc3MoW10sIHF2ZWMsIHV2KTtcblxuICB2YXIgdXV2eCA9IHF5ICogdXZ6IC0gcXogKiB1dnksXG4gICAgICB1dXZ5ID0gcXogKiB1dnggLSBxeCAqIHV2eixcbiAgICAgIHV1dnogPSBxeCAqIHV2eSAtIHF5ICogdXZ4OyAvLyB2ZWMzLnNjYWxlKHV2LCB1diwgMiAqIHcpO1xuXG4gIHZhciB3MiA9IHF3ICogMjtcbiAgdXZ4ICo9IHcyO1xuICB1dnkgKj0gdzI7XG4gIHV2eiAqPSB3MjsgLy8gdmVjMy5zY2FsZSh1dXYsIHV1diwgMik7XG5cbiAgdXV2eCAqPSAyO1xuICB1dXZ5ICo9IDI7XG4gIHV1dnogKj0gMjsgLy8gcmV0dXJuIHZlYzMuYWRkKG91dCwgYSwgdmVjMy5hZGQob3V0LCB1diwgdXV2KSk7XG5cbiAgb3V0WzBdID0geCArIHV2eCArIHV1dng7XG4gIG91dFsxXSA9IHkgKyB1dnkgKyB1dXZ5O1xuICBvdXRbMl0gPSB6ICsgdXZ6ICsgdXV2ejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB4LWF4aXNcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXTtcbiAgclsxXSA9IHBbMV0gKiBNYXRoLmNvcyhyYWQpIC0gcFsyXSAqIE1hdGguc2luKHJhZCk7XG4gIHJbMl0gPSBwWzFdICogTWF0aC5zaW4ocmFkKSArIHBbMl0gKiBNYXRoLmNvcyhyYWQpOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB5LWF4aXNcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFsyXSAqIE1hdGguc2luKHJhZCkgKyBwWzBdICogTWF0aC5jb3MocmFkKTtcbiAgclsxXSA9IHBbMV07XG4gIHJbMl0gPSBwWzJdICogTWF0aC5jb3MocmFkKSAtIHBbMF0gKiBNYXRoLnNpbihyYWQpOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB6LWF4aXNcclxuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVaKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXSAqIE1hdGguY29zKHJhZCkgLSBwWzFdICogTWF0aC5zaW4ocmFkKTtcbiAgclsxXSA9IHBbMF0gKiBNYXRoLnNpbihyYWQpICsgcFsxXSAqIE1hdGguY29zKHJhZCk7XG4gIHJbMl0gPSBwWzJdOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdHdvIDNEIHZlY3RvcnNcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgYnogPSBiWzJdLFxuICAgICAgbWFnMSA9IE1hdGguc3FydChheCAqIGF4ICsgYXkgKiBheSArIGF6ICogYXopLFxuICAgICAgbWFnMiA9IE1hdGguc3FydChieCAqIGJ4ICsgYnkgKiBieSArIGJ6ICogYnopLFxuICAgICAgbWFnID0gbWFnMSAqIG1hZzIsXG4gICAgICBjb3NpbmUgPSBtYWcgJiYgZG90KGEsIGIpIC8gbWFnO1xuICByZXR1cm4gTWF0aC5hY29zKE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSk7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMyB0byB6ZXJvXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzMoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpO1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5kaXZpZGV9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkRGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5sZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnNxdWFyZWRMZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXHJcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMzcy5cclxuICpcclxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMzLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcclxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzNzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxyXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSAzO1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgdmVjWzJdID0gYVtpICsgMl07XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICAgIGFbaSArIDJdID0gdmVjWzJdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXHJcbiAqIDQgRGltZW5zaW9uYWwgVmVjdG9yXHJcbiAqIEBtb2R1bGUgdmVjNFxyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzRcclxuICpcclxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgdmVjNCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gY2xvbmVcclxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgdmVjNCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeCwgeSwgeiwgdykge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIG91dFszXSA9IHc7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzQgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgc291cmNlIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHksIHosIHcpIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKiBiWzJdO1xuICBvdXRbM10gPSBhWzNdICogYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBEaXZpZGVzIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gIG91dFszXSA9IGFbM10gLyBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNlaWxcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmNlaWwoYVsyXSk7XG4gIG91dFszXSA9IE1hdGguY2VpbChhWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gZmxvb3JcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICBvdXRbM10gPSBNYXRoLmZsb29yKGFbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5taW4oYVszXSwgYlszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWF4KGFbMl0sIGJbMl0pO1xuICBvdXRbM10gPSBNYXRoLm1heChhWzNdLCBiWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gcm91bmRcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLnJvdW5kKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLnJvdW5kKGFbMl0pO1xuICBvdXRbM10gPSBNYXRoLnJvdW5kKGFbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFNjYWxlcyBhIHZlYzQgYnkgYSBzY2FsYXIgbnVtYmVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSB2ZWN0b3IgdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWM0J3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgdmFyIHcgPSBiWzNdIC0gYVszXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeiwgdyk7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHZhciB3ID0gYlszXSAtIGFbM107XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHogKyB3ICogdztcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6LCB3KTtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciB3ID0gYVszXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHkgKyB6ICogeiArIHcgKiB3O1xufVxuLyoqXHJcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBuZWdhdGVcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgb3V0WzNdID0gLWFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcclxuICpcclxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGludmVydFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgb3V0WzJdID0gMS4wIC8gYVsyXTtcbiAgb3V0WzNdID0gMS4wIC8gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBOb3JtYWxpemUgYSB2ZWM0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBub3JtYWxpemVcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSB4ICogbGVuO1xuICBvdXRbMV0gPSB5ICogbGVuO1xuICBvdXRbMl0gPSB6ICogbGVuO1xuICBvdXRbM10gPSB3ICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWM0J3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdICsgYVszXSAqIGJbM107XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgY3Jvc3MtcHJvZHVjdCBvZiB0aHJlZSB2ZWN0b3JzIGluIGEgNC1kaW1lbnNpb25hbCBzcGFjZVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gcmVzdWx0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBVIHRoZSBmaXJzdCB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IFYgdGhlIHNlY29uZCB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IFcgdGhlIHRoaXJkIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjNH0gcmVzdWx0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3Jvc3Mob3V0LCB1LCB2LCB3KSB7XG4gIHZhciBBID0gdlswXSAqIHdbMV0gLSB2WzFdICogd1swXSxcbiAgICAgIEIgPSB2WzBdICogd1syXSAtIHZbMl0gKiB3WzBdLFxuICAgICAgQyA9IHZbMF0gKiB3WzNdIC0gdlszXSAqIHdbMF0sXG4gICAgICBEID0gdlsxXSAqIHdbMl0gLSB2WzJdICogd1sxXSxcbiAgICAgIEUgPSB2WzFdICogd1szXSAtIHZbM10gKiB3WzFdLFxuICAgICAgRiA9IHZbMl0gKiB3WzNdIC0gdlszXSAqIHdbMl07XG4gIHZhciBHID0gdVswXTtcbiAgdmFyIEggPSB1WzFdO1xuICB2YXIgSSA9IHVbMl07XG4gIHZhciBKID0gdVszXTtcbiAgb3V0WzBdID0gSCAqIEYgLSBJICogRSArIEogKiBEO1xuICBvdXRbMV0gPSAtKEcgKiBGKSArIEkgKiBDIC0gSiAqIEI7XG4gIG91dFsyXSA9IEcgKiBFIC0gSCAqIEMgKyBKICogQTtcbiAgb3V0WzNdID0gLShHICogRCkgKyBIICogQiAtIEkgKiBBO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjNCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdO1xuICB2YXIgYXkgPSBhWzFdO1xuICB2YXIgYXogPSBhWzJdO1xuICB2YXIgYXcgPSBhWzNdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIG91dFsyXSA9IGF6ICsgdCAqIChiWzJdIC0gYXopO1xuICBvdXRbM10gPSBhdyArIHQgKiAoYlszXSAtIGF3KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7IC8vIE1hcnNhZ2xpYSwgR2VvcmdlLiBDaG9vc2luZyBhIFBvaW50IGZyb20gdGhlIFN1cmZhY2Ugb2YgYVxuICAvLyBTcGhlcmUuIEFubi4gTWF0aC4gU3RhdGlzdC4gNDMgKDE5NzIpLCBuby4gMiwgNjQ1LS02NDYuXG4gIC8vIGh0dHA6Ly9wcm9qZWN0ZXVjbGlkLm9yZy9ldWNsaWQuYW9tcy8xMTc3NjkyNjQ0O1xuXG4gIHZhciB2MSwgdjIsIHYzLCB2NDtcbiAgdmFyIHMxLCBzMjtcblxuICBkbyB7XG4gICAgdjEgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHYyID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICBzMSA9IHYxICogdjEgKyB2MiAqIHYyO1xuICB9IHdoaWxlIChzMSA+PSAxKTtcblxuICBkbyB7XG4gICAgdjMgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHY0ID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICBzMiA9IHYzICogdjMgKyB2NCAqIHY0O1xuICB9IHdoaWxlIChzMiA+PSAxKTtcblxuICB2YXIgZCA9IE1hdGguc3FydCgoMSAtIHMxKSAvIHMyKTtcbiAgb3V0WzBdID0gc2NhbGUgKiB2MTtcbiAgb3V0WzFdID0gc2NhbGUgKiB2MjtcbiAgb3V0WzJdID0gc2NhbGUgKiB2MyAqIGQ7XG4gIG91dFszXSA9IHNjYWxlICogdjQgKiBkO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzQgd2l0aCBhIG1hdDQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0NChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXSxcbiAgICAgIHcgPSBhWzNdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSAqIHc7XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzldICogeiArIG1bMTNdICogdztcbiAgb3V0WzJdID0gbVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdICogdztcbiAgb3V0WzNdID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdICogdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWM0IHdpdGggYSBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcclxuICogQHJldHVybnMge3ZlYzR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM107IC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG5cbiAgdmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5O1xuICB2YXIgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7XG4gIHZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcbiAgdmFyIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejsgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuXG4gIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XG4gIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gIG91dFsyXSA9IGl6ICogcXcgKyBpdyAqIC1xeiArIGl4ICogLXF5IC0gaXkgKiAtcXg7XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNCB0byB6ZXJvXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKG91dCkge1xuICBvdXRbMF0gPSAwLjA7XG4gIG91dFsxXSA9IDAuMDtcbiAgb3V0WzJdID0gMC4wO1xuICBvdXRbM10gPSAwLjA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwidmVjNChcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgVGhlIGZpcnN0IHZlY3Rvci5cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM107XG59XG4vKipcclxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpO1xufVxuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zdWJ0cmFjdH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5tdWx0aXBseX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5kaXZpZGV9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zcXVhcmVkRGlzdGFuY2V9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5sZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LnNxdWFyZWRMZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXHJcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWM0cy5cclxuICpcclxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWM0LiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcclxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzRzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcclxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxyXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSA0O1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgdmVjWzJdID0gYVtpICsgMl07XG4gICAgICB2ZWNbM10gPSBhW2kgKyAzXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgICAgYVtpICsgMl0gPSB2ZWNbMl07XG4gICAgICBhW2kgKyAzXSA9IHZlY1szXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbmltcG9ydCAqIGFzIG1hdDMgZnJvbSBcIi4vbWF0My5qc1wiO1xuaW1wb3J0ICogYXMgdmVjMyBmcm9tIFwiLi92ZWMzLmpzXCI7XG5pbXBvcnQgKiBhcyB2ZWM0IGZyb20gXCIuL3ZlYzQuanNcIjtcbi8qKlxyXG4gKiBRdWF0ZXJuaW9uXHJcbiAqIEBtb2R1bGUgcXVhdFxyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgcXVhdFxyXG4gKlxyXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICB9XG5cbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgYSBxdWF0IHRvIHRoZSBpZGVudGl0eSBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDA7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0cyBhIHF1YXQgZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYW5kIHJvdGF0aW9uIGF4aXMsXHJcbiAqIHRoZW4gcmV0dXJucyBpdC5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBheGlzIHRoZSBheGlzIGFyb3VuZCB3aGljaCB0byByb3RhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgaW4gcmFkaWFuc1xyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEF4aXNBbmdsZShvdXQsIGF4aXMsIHJhZCkge1xuICByYWQgPSByYWQgKiAwLjU7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgb3V0WzBdID0gcyAqIGF4aXNbMF07XG4gIG91dFsxXSA9IHMgKiBheGlzWzFdO1xuICBvdXRbMl0gPSBzICogYXhpc1syXTtcbiAgb3V0WzNdID0gTWF0aC5jb3MocmFkKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZXRzIHRoZSByb3RhdGlvbiBheGlzIGFuZCBhbmdsZSBmb3IgYSBnaXZlblxyXG4gKiAgcXVhdGVybmlvbi4gSWYgYSBxdWF0ZXJuaW9uIGlzIGNyZWF0ZWQgd2l0aFxyXG4gKiAgc2V0QXhpc0FuZ2xlLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2FtZVxyXG4gKiAgdmFsdWVzIGFzIHByb3ZpZGllZCBpbiB0aGUgb3JpZ2luYWwgcGFyYW1ldGVyIGxpc3RcclxuICogIE9SIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHZhbHVlcy5cclxuICogRXhhbXBsZTogVGhlIHF1YXRlcm5pb24gZm9ybWVkIGJ5IGF4aXMgWzAsIDAsIDFdIGFuZFxyXG4gKiAgYW5nbGUgLTkwIGlzIHRoZSBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIGZvcm1lZCBieVxyXG4gKiAgWzAsIDAsIDFdIGFuZCAyNzAuIFRoaXMgbWV0aG9kIGZhdm9ycyB0aGUgbGF0dGVyLlxyXG4gKiBAcGFyYW0gIHt2ZWMzfSBvdXRfYXhpcyAgVmVjdG9yIHJlY2VpdmluZyB0aGUgYXhpcyBvZiByb3RhdGlvblxyXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXR9IHEgICAgIFF1YXRlcm5pb24gdG8gYmUgZGVjb21wb3NlZFxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICBBbmdsZSwgaW4gcmFkaWFucywgb2YgdGhlIHJvdGF0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXhpc0FuZ2xlKG91dF9heGlzLCBxKSB7XG4gIHZhciByYWQgPSBNYXRoLmFjb3MocVszXSkgKiAyLjA7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkIC8gMi4wKTtcblxuICBpZiAocyA+IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICBvdXRfYXhpc1swXSA9IHFbMF0gLyBzO1xuICAgIG91dF9heGlzWzFdID0gcVsxXSAvIHM7XG4gICAgb3V0X2F4aXNbMl0gPSBxWzJdIC8gcztcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBzIGlzIHplcm8sIHJldHVybiBhbnkgYXhpcyAobm8gcm90YXRpb24gLSBheGlzIGRvZXMgbm90IG1hdHRlcilcbiAgICBvdXRfYXhpc1swXSA9IDE7XG4gICAgb3V0X2F4aXNbMV0gPSAwO1xuICAgIG91dF9heGlzWzJdID0gMDtcbiAgfVxuXG4gIHJldHVybiByYWQ7XG59XG4vKipcclxuICogR2V0cyB0aGUgYW5ndWxhciBkaXN0YW5jZSBiZXR3ZWVuIHR3byB1bml0IHF1YXRlcm5pb25zXHJcbiAqXHJcbiAqIEBwYXJhbSAge1JlYWRvbmx5UXVhdH0gYSAgICAgT3JpZ2luIHVuaXQgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXR9IGIgICAgIERlc3RpbmF0aW9uIHVuaXQgcXVhdGVybmlvblxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICBBbmdsZSwgaW4gcmFkaWFucywgYmV0d2VlbiB0aGUgdHdvIHF1YXRlcm5pb25zXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5nbGUoYSwgYikge1xuICB2YXIgZG90cHJvZHVjdCA9IGRvdChhLCBiKTtcbiAgcmV0dXJuIE1hdGguYWNvcygyICogZG90cHJvZHVjdCAqIGRvdHByb2R1Y3QgLSAxKTtcbn1cbi8qKlxyXG4gKiBNdWx0aXBsaWVzIHR3byBxdWF0J3NcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl0sXG4gICAgICBidyA9IGJbM107XG4gIG91dFswXSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYng7XG4gIG91dFszXSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBYIGF4aXNcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGFuZ2xlIChpbiByYWRpYW5zKSB0byByb3RhdGVcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCByYWQpIHtcbiAgcmFkICo9IDAuNTtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGJ3ID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYXggKiBidyArIGF3ICogYng7XG4gIG91dFsxXSA9IGF5ICogYncgKyBheiAqIGJ4O1xuICBvdXRbMl0gPSBheiAqIGJ3IC0gYXkgKiBieDtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF4ICogYng7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBZIGF4aXNcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGFuZ2xlIChpbiByYWRpYW5zKSB0byByb3RhdGVcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCByYWQpIHtcbiAgcmFkICo9IDAuNTtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ5ID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGJ3ID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYXggKiBidyAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF5ICogYncgKyBhdyAqIGJ5O1xuICBvdXRbMl0gPSBheiAqIGJ3ICsgYXggKiBieTtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF5ICogYnk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBaIGF4aXNcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGFuZ2xlIChpbiByYWRpYW5zKSB0byByb3RhdGVcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVoob3V0LCBhLCByYWQpIHtcbiAgcmFkICo9IDAuNTtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ6ID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGJ3ID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYXggKiBidyArIGF5ICogYno7XG4gIG91dFsxXSA9IGF5ICogYncgLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheiAqIGJ3ICsgYXcgKiBiejtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgVyBjb21wb25lbnQgb2YgYSBxdWF0IGZyb20gdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMuXHJcbiAqIEFzc3VtZXMgdGhhdCBxdWF0ZXJuaW9uIGlzIDEgdW5pdCBpbiBsZW5ndGguXHJcbiAqIEFueSBleGlzdGluZyBXIGNvbXBvbmVudCB3aWxsIGJlIGlnbm9yZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBXIGNvbXBvbmVudCBvZlxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlVyhvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgb3V0WzNdID0gTWF0aC5zcXJ0KE1hdGguYWJzKDEuMCAtIHggKiB4IC0geSAqIHkgLSB6ICogeikpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2YgYSB1bml0IHF1YXRlcm5pb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cChvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXSxcbiAgICAgIHcgPSBhWzNdO1xuICB2YXIgciA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5ICsgeiAqIHopO1xuICB2YXIgZXQgPSBNYXRoLmV4cCh3KTtcbiAgdmFyIHMgPSByID4gMCA/IGV0ICogTWF0aC5zaW4ocikgLyByIDogMDtcbiAgb3V0WzBdID0geCAqIHM7XG4gIG91dFsxXSA9IHkgKiBzO1xuICBvdXRbMl0gPSB6ICogcztcbiAgb3V0WzNdID0gZXQgKiBNYXRoLmNvcyhyKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGUgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIGEgdW5pdCBxdWF0ZXJuaW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgdGhlIGV4cG9uZW50aWFsIG9mXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsbihvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXSxcbiAgICAgIHcgPSBhWzNdO1xuICB2YXIgciA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5ICsgeiAqIHopO1xuICB2YXIgdCA9IHIgPiAwID8gTWF0aC5hdGFuMihyLCB3KSAvIHIgOiAwO1xuICBvdXRbMF0gPSB4ICogdDtcbiAgb3V0WzFdID0geSAqIHQ7XG4gIG91dFsyXSA9IHogKiB0O1xuICBvdXRbM10gPSAwLjUgKiBNYXRoLmxvZyh4ICogeCArIHkgKiB5ICsgeiAqIHogKyB3ICogdyk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ2FsY3VsYXRlIHRoZSBzY2FsYXIgcG93ZXIgb2YgYSB1bml0IHF1YXRlcm5pb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBxdWF0ZXJuaW9uIGJ5XHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBwb3cob3V0LCBhLCBiKSB7XG4gIGxuKG91dCwgYSk7XG4gIHNjYWxlKG91dCwgb3V0LCBiKTtcbiAgZXhwKG91dCwgb3V0KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2xlcnAob3V0LCBhLCBiLCB0KSB7XG4gIC8vIGJlbmNobWFya3M6XG4gIC8vICAgIGh0dHA6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tc2xlcnAtaW1wbGVtZW50YXRpb25zXG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl0sXG4gICAgICBidyA9IGJbM107XG4gIHZhciBvbWVnYSwgY29zb20sIHNpbm9tLCBzY2FsZTAsIHNjYWxlMTsgLy8gY2FsYyBjb3NpbmVcblxuICBjb3NvbSA9IGF4ICogYnggKyBheSAqIGJ5ICsgYXogKiBieiArIGF3ICogYnc7IC8vIGFkanVzdCBzaWducyAoaWYgbmVjZXNzYXJ5KVxuXG4gIGlmIChjb3NvbSA8IDAuMCkge1xuICAgIGNvc29tID0gLWNvc29tO1xuICAgIGJ4ID0gLWJ4O1xuICAgIGJ5ID0gLWJ5O1xuICAgIGJ6ID0gLWJ6O1xuICAgIGJ3ID0gLWJ3O1xuICB9IC8vIGNhbGN1bGF0ZSBjb2VmZmljaWVudHNcblxuXG4gIGlmICgxLjAgLSBjb3NvbSA+IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICAvLyBzdGFuZGFyZCBjYXNlIChzbGVycClcbiAgICBvbWVnYSA9IE1hdGguYWNvcyhjb3NvbSk7XG4gICAgc2lub20gPSBNYXRoLnNpbihvbWVnYSk7XG4gICAgc2NhbGUwID0gTWF0aC5zaW4oKDEuMCAtIHQpICogb21lZ2EpIC8gc2lub207XG4gICAgc2NhbGUxID0gTWF0aC5zaW4odCAqIG9tZWdhKSAvIHNpbm9tO1xuICB9IGVsc2Uge1xuICAgIC8vIFwiZnJvbVwiIGFuZCBcInRvXCIgcXVhdGVybmlvbnMgYXJlIHZlcnkgY2xvc2VcbiAgICAvLyAgLi4uIHNvIHdlIGNhbiBkbyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uXG4gICAgc2NhbGUwID0gMS4wIC0gdDtcbiAgICBzY2FsZTEgPSB0O1xuICB9IC8vIGNhbGN1bGF0ZSBmaW5hbCB2YWx1ZXNcblxuXG4gIG91dFswXSA9IHNjYWxlMCAqIGF4ICsgc2NhbGUxICogYng7XG4gIG91dFsxXSA9IHNjYWxlMCAqIGF5ICsgc2NhbGUxICogYnk7XG4gIG91dFsyXSA9IHNjYWxlMCAqIGF6ICsgc2NhbGUxICogYno7XG4gIG91dFszXSA9IHNjYWxlMCAqIGF3ICsgc2NhbGUxICogYnc7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHVuaXQgcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQpIHtcbiAgLy8gSW1wbGVtZW50YXRpb24gb2YgaHR0cDovL3BsYW5uaW5nLmNzLnVpdWMuZWR1L25vZGUxOTguaHRtbFxuICAvLyBUT0RPOiBDYWxsaW5nIHJhbmRvbSAzIHRpbWVzIGlzIHByb2JhYmx5IG5vdCB0aGUgZmFzdGVzdCBzb2x1dGlvblxuICB2YXIgdTEgPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgdmFyIHUyID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gIHZhciB1MyA9IGdsTWF0cml4LlJBTkRPTSgpO1xuICB2YXIgc3FydDFNaW51c1UxID0gTWF0aC5zcXJ0KDEgLSB1MSk7XG4gIHZhciBzcXJ0VTEgPSBNYXRoLnNxcnQodTEpO1xuICBvdXRbMF0gPSBzcXJ0MU1pbnVzVTEgKiBNYXRoLnNpbigyLjAgKiBNYXRoLlBJICogdTIpO1xuICBvdXRbMV0gPSBzcXJ0MU1pbnVzVTEgKiBNYXRoLmNvcygyLjAgKiBNYXRoLlBJICogdTIpO1xuICBvdXRbMl0gPSBzcXJ0VTEgKiBNYXRoLnNpbigyLjAgKiBNYXRoLlBJICogdTMpO1xuICBvdXRbM10gPSBzcXJ0VTEgKiBNYXRoLmNvcygyLjAgKiBNYXRoLlBJICogdTMpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGludmVyc2Ugb2YgYSBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBpbnZlcnNlIG9mXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBkb3QgPSBhMCAqIGEwICsgYTEgKiBhMSArIGEyICogYTIgKyBhMyAqIGEzO1xuICB2YXIgaW52RG90ID0gZG90ID8gMS4wIC8gZG90IDogMDsgLy8gVE9ETzogV291bGQgYmUgZmFzdGVyIHRvIHJldHVybiBbMCwwLDAsMF0gaW1tZWRpYXRlbHkgaWYgZG90ID09IDBcblxuICBvdXRbMF0gPSAtYTAgKiBpbnZEb3Q7XG4gIG91dFsxXSA9IC1hMSAqIGludkRvdDtcbiAgb3V0WzJdID0gLWEyICogaW52RG90O1xuICBvdXRbM10gPSBhMyAqIGludkRvdDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBjb25qdWdhdGUgb2YgYSBxdWF0XHJcbiAqIElmIHRoZSBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQsIHRoaXMgZnVuY3Rpb24gaXMgZmFzdGVyIHRoYW4gcXVhdC5pbnZlcnNlIGFuZCBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHQuXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSBjb25qdWdhdGUgb2ZcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmp1Z2F0ZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gLWFbMF07XG4gIG91dFsxXSA9IC1hWzFdO1xuICBvdXRbMl0gPSAtYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgcXVhdGVybmlvbiBmcm9tIHRoZSBnaXZlbiAzeDMgcm90YXRpb24gbWF0cml4LlxyXG4gKlxyXG4gKiBOT1RFOiBUaGUgcmVzdWx0YW50IHF1YXRlcm5pb24gaXMgbm90IG5vcm1hbGl6ZWQsIHNvIHlvdSBzaG91bGQgYmUgc3VyZVxyXG4gKiB0byByZW5vcm1hbGl6ZSB0aGUgcXVhdGVybmlvbiB5b3Vyc2VsZiB3aGVyZSBuZWNlc3NhcnkuXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gbSByb3RhdGlvbiBtYXRyaXhcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWF0MyhvdXQsIG0pIHtcbiAgLy8gQWxnb3JpdGhtIGluIEtlbiBTaG9lbWFrZSdzIGFydGljbGUgaW4gMTk4NyBTSUdHUkFQSCBjb3Vyc2Ugbm90ZXNcbiAgLy8gYXJ0aWNsZSBcIlF1YXRlcm5pb24gQ2FsY3VsdXMgYW5kIEZhc3QgQW5pbWF0aW9uXCIuXG4gIHZhciBmVHJhY2UgPSBtWzBdICsgbVs0XSArIG1bOF07XG4gIHZhciBmUm9vdDtcblxuICBpZiAoZlRyYWNlID4gMC4wKSB7XG4gICAgLy8gfHd8ID4gMS8yLCBtYXkgYXMgd2VsbCBjaG9vc2UgdyA+IDEvMlxuICAgIGZSb290ID0gTWF0aC5zcXJ0KGZUcmFjZSArIDEuMCk7IC8vIDJ3XG5cbiAgICBvdXRbM10gPSAwLjUgKiBmUm9vdDtcbiAgICBmUm9vdCA9IDAuNSAvIGZSb290OyAvLyAxLyg0dylcblxuICAgIG91dFswXSA9IChtWzVdIC0gbVs3XSkgKiBmUm9vdDtcbiAgICBvdXRbMV0gPSAobVs2XSAtIG1bMl0pICogZlJvb3Q7XG4gICAgb3V0WzJdID0gKG1bMV0gLSBtWzNdKSAqIGZSb290O1xuICB9IGVsc2Uge1xuICAgIC8vIHx3fCA8PSAxLzJcbiAgICB2YXIgaSA9IDA7XG4gICAgaWYgKG1bNF0gPiBtWzBdKSBpID0gMTtcbiAgICBpZiAobVs4XSA+IG1baSAqIDMgKyBpXSkgaSA9IDI7XG4gICAgdmFyIGogPSAoaSArIDEpICUgMztcbiAgICB2YXIgayA9IChpICsgMikgJSAzO1xuICAgIGZSb290ID0gTWF0aC5zcXJ0KG1baSAqIDMgKyBpXSAtIG1baiAqIDMgKyBqXSAtIG1bayAqIDMgKyBrXSArIDEuMCk7XG4gICAgb3V0W2ldID0gMC41ICogZlJvb3Q7XG4gICAgZlJvb3QgPSAwLjUgLyBmUm9vdDtcbiAgICBvdXRbM10gPSAobVtqICogMyArIGtdIC0gbVtrICogMyArIGpdKSAqIGZSb290O1xuICAgIG91dFtqXSA9IChtW2ogKiAzICsgaV0gKyBtW2kgKiAzICsgal0pICogZlJvb3Q7XG4gICAgb3V0W2tdID0gKG1bayAqIDMgKyBpXSArIG1baSAqIDMgKyBrXSkgKiBmUm9vdDtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIHF1YXRlcm5pb24gZnJvbSB0aGUgZ2l2ZW4gZXVsZXIgYW5nbGUgeCwgeSwgei5cclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7eH0gQW5nbGUgdG8gcm90YXRlIGFyb3VuZCBYIGF4aXMgaW4gZGVncmVlcy5cclxuICogQHBhcmFtIHt5fSBBbmdsZSB0byByb3RhdGUgYXJvdW5kIFkgYXhpcyBpbiBkZWdyZWVzLlxyXG4gKiBAcGFyYW0ge3p9IEFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQgWiBheGlzIGluIGRlZ3JlZXMuXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUV1bGVyKG91dCwgeCwgeSwgeikge1xuICB2YXIgaGFsZlRvUmFkID0gMC41ICogTWF0aC5QSSAvIDE4MC4wO1xuICB4ICo9IGhhbGZUb1JhZDtcbiAgeSAqPSBoYWxmVG9SYWQ7XG4gIHogKj0gaGFsZlRvUmFkO1xuICB2YXIgc3ggPSBNYXRoLnNpbih4KTtcbiAgdmFyIGN4ID0gTWF0aC5jb3MoeCk7XG4gIHZhciBzeSA9IE1hdGguc2luKHkpO1xuICB2YXIgY3kgPSBNYXRoLmNvcyh5KTtcbiAgdmFyIHN6ID0gTWF0aC5zaW4oeik7XG4gIHZhciBjeiA9IE1hdGguY29zKHopO1xuICBvdXRbMF0gPSBzeCAqIGN5ICogY3ogLSBjeCAqIHN5ICogc3o7XG4gIG91dFsxXSA9IGN4ICogc3kgKiBjeiArIHN4ICogY3kgKiBzejtcbiAgb3V0WzJdID0gY3ggKiBjeSAqIHN6IC0gc3ggKiBzeSAqIGN6O1xuICBvdXRbM10gPSBjeCAqIGN5ICogY3ogKyBzeCAqIHN5ICogc3o7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHF1YXRlbmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwicXVhdChcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXRlcm5pb24gdG8gY2xvbmVcclxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGNsb25lID0gdmVjNC5jbG9uZTtcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XHJcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBmcm9tVmFsdWVzID0gdmVjNC5mcm9tVmFsdWVzO1xuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBxdWF0IHRvIGFub3RoZXJcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBzb3VyY2UgcXVhdGVybmlvblxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBjb3B5ID0gdmVjNC5jb3B5O1xuLyoqXHJcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHF1YXQgdG8gdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc2V0ID0gdmVjNC5zZXQ7XG4vKipcclxuICogQWRkcyB0d28gcXVhdCdzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3F1YXR9IG91dFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgYWRkID0gdmVjNC5hZGQ7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Lm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogU2NhbGVzIGEgcXVhdCBieSBhIHNjYWxhciBudW1iZXJcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzY2FsZSA9IHZlYzQuc2NhbGU7XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHF1YXQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZG90ID0gdmVjNC5kb3Q7XG4vKipcclxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0J3NcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlcnAgPSB2ZWM0LmxlcnA7XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IHZhciBsZW5ndGggPSB2ZWM0Lmxlbmd0aDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxdWFyZWRMZW5ndGggPSB2ZWM0LnNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0LnNxdWFyZWRMZW5ndGh9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXHJcbiAqIE5vcm1hbGl6ZSBhIHF1YXRcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXRlcm5pb24gdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIG5vcm1hbGl6ZSA9IHZlYzQubm9ybWFsaXplO1xuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHF1YXRlcm5pb25zIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgVGhlIGZpcnN0IHF1YXRlcm5pb24uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIFRoZSBzZWNvbmQgcXVhdGVybmlvbi5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgdmFyIGV4YWN0RXF1YWxzID0gdmVjNC5leGFjdEVxdWFscztcbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBxdWF0ZXJuaW9ucyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCB2YXIgZXF1YWxzID0gdmVjNC5lcXVhbHM7XG4vKipcclxuICogU2V0cyBhIHF1YXRlcm5pb24gdG8gcmVwcmVzZW50IHRoZSBzaG9ydGVzdCByb3RhdGlvbiBmcm9tIG9uZVxyXG4gKiB2ZWN0b3IgdG8gYW5vdGhlci5cclxuICpcclxuICogQm90aCB2ZWN0b3JzIGFyZSBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoLlxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb24uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBpbml0aWFsIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgZGVzdGluYXRpb24gdmVjdG9yXHJcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcclxuICovXG5cbmV4cG9ydCB2YXIgcm90YXRpb25UbyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRtcHZlYzMgPSB2ZWMzLmNyZWF0ZSgpO1xuICB2YXIgeFVuaXRWZWMzID0gdmVjMy5mcm9tVmFsdWVzKDEsIDAsIDApO1xuICB2YXIgeVVuaXRWZWMzID0gdmVjMy5mcm9tVmFsdWVzKDAsIDEsIDApO1xuICByZXR1cm4gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBkb3QgPSB2ZWMzLmRvdChhLCBiKTtcblxuICAgIGlmIChkb3QgPCAtMC45OTk5OTkpIHtcbiAgICAgIHZlYzMuY3Jvc3ModG1wdmVjMywgeFVuaXRWZWMzLCBhKTtcbiAgICAgIGlmICh2ZWMzLmxlbih0bXB2ZWMzKSA8IDAuMDAwMDAxKSB2ZWMzLmNyb3NzKHRtcHZlYzMsIHlVbml0VmVjMywgYSk7XG4gICAgICB2ZWMzLm5vcm1hbGl6ZSh0bXB2ZWMzLCB0bXB2ZWMzKTtcbiAgICAgIHNldEF4aXNBbmdsZShvdXQsIHRtcHZlYzMsIE1hdGguUEkpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGVsc2UgaWYgKGRvdCA+IDAuOTk5OTk5KSB7XG4gICAgICBvdXRbMF0gPSAwO1xuICAgICAgb3V0WzFdID0gMDtcbiAgICAgIG91dFsyXSA9IDA7XG4gICAgICBvdXRbM10gPSAxO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCBhLCBiKTtcbiAgICAgIG91dFswXSA9IHRtcHZlYzNbMF07XG4gICAgICBvdXRbMV0gPSB0bXB2ZWMzWzFdO1xuICAgICAgb3V0WzJdID0gdG1wdmVjM1syXTtcbiAgICAgIG91dFszXSA9IDEgKyBkb3Q7XG4gICAgICByZXR1cm4gbm9ybWFsaXplKG91dCwgb3V0KTtcbiAgICB9XG4gIH07XG59KCk7XG4vKipcclxuICogUGVyZm9ybXMgYSBzcGhlcmljYWwgbGluZWFyIGludGVycG9sYXRpb24gd2l0aCB0d28gY29udHJvbCBwb2ludHNcclxuICpcclxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYyB0aGUgdGhpcmQgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gZCB0aGUgZm91cnRoIG9wZXJhbmRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxbGVycCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRlbXAxID0gY3JlYXRlKCk7XG4gIHZhciB0ZW1wMiA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICAgIHNsZXJwKHRlbXAxLCBhLCBkLCB0KTtcbiAgICBzbGVycCh0ZW1wMiwgYiwgYywgdCk7XG4gICAgc2xlcnAob3V0LCB0ZW1wMSwgdGVtcDIsIDIgKiB0ICogKDEgLSB0KSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcbn0oKTtcbi8qKlxyXG4gKiBTZXRzIHRoZSBzcGVjaWZpZWQgcXVhdGVybmlvbiB3aXRoIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlblxyXG4gKiBheGVzLiBFYWNoIGF4aXMgaXMgYSB2ZWMzIGFuZCBpcyBleHBlY3RlZCB0byBiZSB1bml0IGxlbmd0aCBhbmRcclxuICogcGVycGVuZGljdWxhciB0byBhbGwgb3RoZXIgc3BlY2lmaWVkIGF4ZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2aWV3ICB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgdmlld2luZyBkaXJlY3Rpb25cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHJpZ2h0IHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhbCBcInJpZ2h0XCIgZGlyZWN0aW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB1cCAgICB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJ1cFwiIGRpcmVjdGlvblxyXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XHJcbiAqL1xuXG5leHBvcnQgdmFyIHNldEF4ZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBtYXRyID0gbWF0My5jcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvdXQsIHZpZXcsIHJpZ2h0LCB1cCkge1xuICAgIG1hdHJbMF0gPSByaWdodFswXTtcbiAgICBtYXRyWzNdID0gcmlnaHRbMV07XG4gICAgbWF0cls2XSA9IHJpZ2h0WzJdO1xuICAgIG1hdHJbMV0gPSB1cFswXTtcbiAgICBtYXRyWzRdID0gdXBbMV07XG4gICAgbWF0cls3XSA9IHVwWzJdO1xuICAgIG1hdHJbMl0gPSAtdmlld1swXTtcbiAgICBtYXRyWzVdID0gLXZpZXdbMV07XG4gICAgbWF0cls4XSA9IC12aWV3WzJdO1xuICAgIHJldHVybiBub3JtYWxpemUob3V0LCBmcm9tTWF0MyhvdXQsIG1hdHIpKTtcbiAgfTtcbn0oKTsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbmltcG9ydCAqIGFzIHF1YXQgZnJvbSBcIi4vcXVhdC5qc1wiO1xuaW1wb3J0ICogYXMgbWF0NCBmcm9tIFwiLi9tYXQ0LmpzXCI7XG4vKipcclxuICogRHVhbCBRdWF0ZXJuaW9uPGJyPlxyXG4gKiBGb3JtYXQ6IFtyZWFsLCBkdWFsXTxicj5cclxuICogUXVhdGVybmlvbiBmb3JtYXQ6IFhZWlc8YnI+XHJcbiAqIE1ha2Ugc3VyZSB0byBoYXZlIG5vcm1hbGl6ZWQgZHVhbCBxdWF0ZXJuaW9ucywgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbnMgbWF5IG5vdCB3b3JrIGFzIGludGVuZGVkLjxicj5cclxuICogQG1vZHVsZSBxdWF0MlxyXG4gKi9cblxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgZHVhbCBxdWF0XHJcbiAqXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gYSBuZXcgZHVhbCBxdWF0ZXJuaW9uIFtyZWFsIC0+IHJvdGF0aW9uLCBkdWFsIC0+IHRyYW5zbGF0aW9uXVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIGRxID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOCk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgZHFbMF0gPSAwO1xuICAgIGRxWzFdID0gMDtcbiAgICBkcVsyXSA9IDA7XG4gICAgZHFbNF0gPSAwO1xuICAgIGRxWzVdID0gMDtcbiAgICBkcVs2XSA9IDA7XG4gICAgZHFbN10gPSAwO1xuICB9XG5cbiAgZHFbM10gPSAxO1xuICByZXR1cm4gZHE7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBxdWF0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgZHVhbCBxdWF0ZXJuaW9uIHRvIGNsb25lXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gbmV3IGR1YWwgcXVhdGVybmlvblxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBkcSA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDgpO1xuICBkcVswXSA9IGFbMF07XG4gIGRxWzFdID0gYVsxXTtcbiAgZHFbMl0gPSBhWzJdO1xuICBkcVszXSA9IGFbM107XG4gIGRxWzRdID0gYVs0XTtcbiAgZHFbNV0gPSBhWzVdO1xuICBkcVs2XSA9IGFbNl07XG4gIGRxWzddID0gYVs3XTtcbiAgcmV0dXJuIGRxO1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgZHVhbCBxdWF0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcn0geDEgWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkxIFkgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MSBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdzEgVyBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHgyIFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MiBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gejIgWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcyIFcgY29tcG9uZW50XHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gbmV3IGR1YWwgcXVhdGVybmlvblxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKHgxLCB5MSwgejEsIHcxLCB4MiwgeTIsIHoyLCB3Mikge1xuICB2YXIgZHEgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg4KTtcbiAgZHFbMF0gPSB4MTtcbiAgZHFbMV0gPSB5MTtcbiAgZHFbMl0gPSB6MTtcbiAgZHFbM10gPSB3MTtcbiAgZHFbNF0gPSB4MjtcbiAgZHFbNV0gPSB5MjtcbiAgZHFbNl0gPSB6MjtcbiAgZHFbN10gPSB3MjtcbiAgcmV0dXJuIGRxO1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgZHVhbCBxdWF0IGZyb20gdGhlIGdpdmVuIHZhbHVlcyAocXVhdCBhbmQgdHJhbnNsYXRpb24pXHJcbiAqXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MSBYIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geTEgWSBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHoxIFogY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MSBXIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0geDIgWCBjb21wb25lbnQgKHRyYW5zbGF0aW9uKVxyXG4gKiBAcGFyYW0ge051bWJlcn0geTIgWSBjb21wb25lbnQgKHRyYW5zbGF0aW9uKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gejIgWiBjb21wb25lbnQgKHRyYW5zbGF0aW9uKVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG5ldyBkdWFsIHF1YXRlcm5pb25cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25WYWx1ZXMoeDEsIHkxLCB6MSwgdzEsIHgyLCB5MiwgejIpIHtcbiAgdmFyIGRxID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOCk7XG4gIGRxWzBdID0geDE7XG4gIGRxWzFdID0geTE7XG4gIGRxWzJdID0gejE7XG4gIGRxWzNdID0gdzE7XG4gIHZhciBheCA9IHgyICogMC41LFxuICAgICAgYXkgPSB5MiAqIDAuNSxcbiAgICAgIGF6ID0gejIgKiAwLjU7XG4gIGRxWzRdID0gYXggKiB3MSArIGF5ICogejEgLSBheiAqIHkxO1xuICBkcVs1XSA9IGF5ICogdzEgKyBheiAqIHgxIC0gYXggKiB6MTtcbiAgZHFbNl0gPSBheiAqIHcxICsgYXggKiB5MSAtIGF5ICogeDE7XG4gIGRxWzddID0gLWF4ICogeDEgLSBheSAqIHkxIC0gYXogKiB6MTtcbiAgcmV0dXJuIGRxO1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBkdWFsIHF1YXQgZnJvbSBhIHF1YXRlcm5pb24gYW5kIGEgdHJhbnNsYXRpb25cclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgYSBub3JtYWxpemVkIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHQgdHJhbmxhdGlvbiB2ZWN0b3JcclxuICogQHJldHVybnMge3F1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBxLCB0KSB7XG4gIHZhciBheCA9IHRbMF0gKiAwLjUsXG4gICAgICBheSA9IHRbMV0gKiAwLjUsXG4gICAgICBheiA9IHRbMl0gKiAwLjUsXG4gICAgICBieCA9IHFbMF0sXG4gICAgICBieSA9IHFbMV0sXG4gICAgICBieiA9IHFbMl0sXG4gICAgICBidyA9IHFbM107XG4gIG91dFswXSA9IGJ4O1xuICBvdXRbMV0gPSBieTtcbiAgb3V0WzJdID0gYno7XG4gIG91dFszXSA9IGJ3O1xuICBvdXRbNF0gPSBheCAqIGJ3ICsgYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFs1XSA9IGF5ICogYncgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzZdID0gYXogKiBidyArIGF4ICogYnkgLSBheSAqIGJ4O1xuICBvdXRbN10gPSAtYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBkdWFsIHF1YXQgZnJvbSBhIHRyYW5zbGF0aW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB0IHRyYW5zbGF0aW9uIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGR1YWwgcXVhdGVybmlvbiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB0KSB7XG4gIG91dFswXSA9IDA7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IHRbMF0gKiAwLjU7XG4gIG91dFs1XSA9IHRbMV0gKiAwLjU7XG4gIG91dFs2XSA9IHRbMl0gKiAwLjU7XG4gIG91dFs3XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIGR1YWwgcXVhdCBmcm9tIGEgcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGR1YWwgcXVhdGVybmlvbiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSB0aGUgcXVhdGVybmlvblxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGR1YWwgcXVhdGVybmlvbiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb24ob3V0LCBxKSB7XG4gIG91dFswXSA9IHFbMF07XG4gIG91dFsxXSA9IHFbMV07XG4gIG91dFsyXSA9IHFbMl07XG4gIG91dFszXSA9IHFbM107XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ3JlYXRlcyBhIG5ldyBkdWFsIHF1YXQgZnJvbSBhIG1hdHJpeCAoNHg0KVxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4XHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQ0KG91dCwgYSkge1xuICAvL1RPRE8gT3B0aW1pemUgdGhpc1xuICB2YXIgb3V0ZXIgPSBxdWF0LmNyZWF0ZSgpO1xuICBtYXQ0LmdldFJvdGF0aW9uKG91dGVyLCBhKTtcbiAgdmFyIHQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgbWF0NC5nZXRUcmFuc2xhdGlvbih0LCBhKTtcbiAgZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24ob3V0LCBvdXRlciwgdCk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIGR1YWwgcXVhdCB0byBhbm90aGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIHNvdXJjZSBkdWFsIHF1YXRlcm5pb25cclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgYSBkdWFsIHF1YXQgdG8gdGhlIGlkZW50aXR5IGR1YWwgcXVhdGVybmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDA7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgZHVhbCBxdWF0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge051bWJlcn0geDEgWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkxIFkgY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MSBaIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gdzEgVyBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHgyIFggY29tcG9uZW50XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MiBZIGNvbXBvbmVudFxyXG4gKiBAcGFyYW0ge051bWJlcn0gejIgWiBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHcyIFcgY29tcG9uZW50XHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgxLCB5MSwgejEsIHcxLCB4MiwgeTIsIHoyLCB3Mikge1xuICBvdXRbMF0gPSB4MTtcbiAgb3V0WzFdID0geTE7XG4gIG91dFsyXSA9IHoxO1xuICBvdXRbM10gPSB3MTtcbiAgb3V0WzRdID0geDI7XG4gIG91dFs1XSA9IHkyO1xuICBvdXRbNl0gPSB6MjtcbiAgb3V0WzddID0gdzI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogR2V0cyB0aGUgcmVhbCBwYXJ0IG9mIGEgZHVhbCBxdWF0XHJcbiAqIEBwYXJhbSAge3F1YXR9IG91dCByZWFsIHBhcnRcclxuICogQHBhcmFtICB7UmVhZG9ubHlRdWF0Mn0gYSBEdWFsIFF1YXRlcm5pb25cclxuICogQHJldHVybiB7cXVhdH0gcmVhbCBwYXJ0XHJcbiAqL1xuXG5leHBvcnQgdmFyIGdldFJlYWwgPSBxdWF0LmNvcHk7XG4vKipcclxuICogR2V0cyB0aGUgZHVhbCBwYXJ0IG9mIGEgZHVhbCBxdWF0XHJcbiAqIEBwYXJhbSAge3F1YXR9IG91dCBkdWFsIHBhcnRcclxuICogQHBhcmFtICB7UmVhZG9ubHlRdWF0Mn0gYSBEdWFsIFF1YXRlcm5pb25cclxuICogQHJldHVybiB7cXVhdH0gZHVhbCBwYXJ0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHVhbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVs0XTtcbiAgb3V0WzFdID0gYVs1XTtcbiAgb3V0WzJdID0gYVs2XTtcbiAgb3V0WzNdID0gYVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIHJlYWwgY29tcG9uZW50IG9mIGEgZHVhbCBxdWF0IHRvIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgYSBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyB0aGUgcmVhbCBwYXJ0XHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzZXRSZWFsID0gcXVhdC5jb3B5O1xuLyoqXHJcbiAqIFNldCB0aGUgZHVhbCBjb21wb25lbnQgb2YgYSBkdWFsIHF1YXQgdG8gdGhlIGdpdmVuIHF1YXRlcm5pb25cclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBhIHF1YXRlcm5pb24gcmVwcmVzZW50aW5nIHRoZSBkdWFsIHBhcnRcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0RHVhbChvdXQsIHEpIHtcbiAgb3V0WzRdID0gcVswXTtcbiAgb3V0WzVdID0gcVsxXTtcbiAgb3V0WzZdID0gcVsyXTtcbiAgb3V0WzddID0gcVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZXRzIHRoZSB0cmFuc2xhdGlvbiBvZiBhIG5vcm1hbGl6ZWQgZHVhbCBxdWF0XHJcbiAqIEBwYXJhbSAge3ZlYzN9IG91dCB0cmFuc2xhdGlvblxyXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXQyfSBhIER1YWwgUXVhdGVybmlvbiB0byBiZSBkZWNvbXBvc2VkXHJcbiAqIEByZXR1cm4ge3ZlYzN9IHRyYW5zbGF0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb24ob3V0LCBhKSB7XG4gIHZhciBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN10sXG4gICAgICBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM107XG4gIG91dFswXSA9IChheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5KSAqIDI7XG4gIG91dFsxXSA9IChheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6KSAqIDI7XG4gIG91dFsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogVHJhbnNsYXRlcyBhIGR1YWwgcXVhdCBieSB0aGUgZ2l2ZW4gdmVjdG9yXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byB0cmFuc2xhdGVcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgdmFyIGF4MSA9IGFbMF0sXG4gICAgICBheTEgPSBhWzFdLFxuICAgICAgYXoxID0gYVsyXSxcbiAgICAgIGF3MSA9IGFbM10sXG4gICAgICBieDEgPSB2WzBdICogMC41LFxuICAgICAgYnkxID0gdlsxXSAqIDAuNSxcbiAgICAgIGJ6MSA9IHZbMl0gKiAwLjUsXG4gICAgICBheDIgPSBhWzRdLFxuICAgICAgYXkyID0gYVs1XSxcbiAgICAgIGF6MiA9IGFbNl0sXG4gICAgICBhdzIgPSBhWzddO1xuICBvdXRbMF0gPSBheDE7XG4gIG91dFsxXSA9IGF5MTtcbiAgb3V0WzJdID0gYXoxO1xuICBvdXRbM10gPSBhdzE7XG4gIG91dFs0XSA9IGF3MSAqIGJ4MSArIGF5MSAqIGJ6MSAtIGF6MSAqIGJ5MSArIGF4MjtcbiAgb3V0WzVdID0gYXcxICogYnkxICsgYXoxICogYngxIC0gYXgxICogYnoxICsgYXkyO1xuICBvdXRbNl0gPSBhdzEgKiBiejEgKyBheDEgKiBieTEgLSBheTEgKiBieDEgKyBhejI7XG4gIG91dFs3XSA9IC1heDEgKiBieDEgLSBheTEgKiBieTEgLSBhejEgKiBiejEgKyBhdzI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBhcm91bmQgdGhlIFggYXhpc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgaG93IGZhciBzaG91bGQgdGhlIHJvdGF0aW9uIGJlXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWChvdXQsIGEsIHJhZCkge1xuICB2YXIgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdLFxuICAgICAgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddLFxuICAgICAgYXgxID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSxcbiAgICAgIGF5MSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnosXG4gICAgICBhejEgPSBheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4LFxuICAgICAgYXcxID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcXVhdC5yb3RhdGVYKG91dCwgYSwgcmFkKTtcbiAgYnggPSBvdXRbMF07XG4gIGJ5ID0gb3V0WzFdO1xuICBieiA9IG91dFsyXTtcbiAgYncgPSBvdXRbM107XG4gIG91dFs0XSA9IGF4MSAqIGJ3ICsgYXcxICogYnggKyBheTEgKiBieiAtIGF6MSAqIGJ5O1xuICBvdXRbNV0gPSBheTEgKiBidyArIGF3MSAqIGJ5ICsgYXoxICogYnggLSBheDEgKiBiejtcbiAgb3V0WzZdID0gYXoxICogYncgKyBhdzEgKiBieiArIGF4MSAqIGJ5IC0gYXkxICogYng7XG4gIG91dFs3XSA9IGF3MSAqIGJ3IC0gYXgxICogYnggLSBheTEgKiBieSAtIGF6MSAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYXJvdW5kIHRoZSBZIGF4aXNcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxyXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGhvdyBmYXIgc2hvdWxkIHRoZSByb3RhdGlvbiBiZVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCByYWQpIHtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XSxcbiAgICAgIGF4MSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnksXG4gICAgICBheTEgPSBheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6LFxuICAgICAgYXoxID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCxcbiAgICAgIGF3MSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHF1YXQucm90YXRlWShvdXQsIGEsIHJhZCk7XG4gIGJ4ID0gb3V0WzBdO1xuICBieSA9IG91dFsxXTtcbiAgYnogPSBvdXRbMl07XG4gIGJ3ID0gb3V0WzNdO1xuICBvdXRbNF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzVdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFs2XSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbN10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGFyb3VuZCB0aGUgWiBheGlzXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcclxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBob3cgZmFyIHNob3VsZCB0aGUgcm90YXRpb24gYmVcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVaKG91dCwgYSwgcmFkKSB7XG4gIHZhciBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM10sXG4gICAgICBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN10sXG4gICAgICBheDEgPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5LFxuICAgICAgYXkxID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieixcbiAgICAgIGF6MSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngsXG4gICAgICBhdzEgPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICBxdWF0LnJvdGF0ZVoob3V0LCBhLCByYWQpO1xuICBieCA9IG91dFswXTtcbiAgYnkgPSBvdXRbMV07XG4gIGJ6ID0gb3V0WzJdO1xuICBidyA9IG91dFszXTtcbiAgb3V0WzRdID0gYXgxICogYncgKyBhdzEgKiBieCArIGF5MSAqIGJ6IC0gYXoxICogYnk7XG4gIG91dFs1XSA9IGF5MSAqIGJ3ICsgYXcxICogYnkgKyBhejEgKiBieCAtIGF4MSAqIGJ6O1xuICBvdXRbNl0gPSBhejEgKiBidyArIGF3MSAqIGJ6ICsgYXgxICogYnkgLSBheTEgKiBieDtcbiAgb3V0WzddID0gYXcxICogYncgLSBheDEgKiBieCAtIGF5MSAqIGJ5IC0gYXoxICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBieSBhIGdpdmVuIHF1YXRlcm5pb24gKGEgKiBxKVxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHF1YXRlcm5pb24gdG8gcm90YXRlIGJ5XHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlQnlRdWF0QXBwZW5kKG91dCwgYSwgcSkge1xuICB2YXIgcXggPSBxWzBdLFxuICAgICAgcXkgPSBxWzFdLFxuICAgICAgcXogPSBxWzJdLFxuICAgICAgcXcgPSBxWzNdLFxuICAgICAgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICBvdXRbMF0gPSBheCAqIHF3ICsgYXcgKiBxeCArIGF5ICogcXogLSBheiAqIHF5O1xuICBvdXRbMV0gPSBheSAqIHF3ICsgYXcgKiBxeSArIGF6ICogcXggLSBheCAqIHF6O1xuICBvdXRbMl0gPSBheiAqIHF3ICsgYXcgKiBxeiArIGF4ICogcXkgLSBheSAqIHF4O1xuICBvdXRbM10gPSBhdyAqIHF3IC0gYXggKiBxeCAtIGF5ICogcXkgLSBheiAqIHF6O1xuICBheCA9IGFbNF07XG4gIGF5ID0gYVs1XTtcbiAgYXogPSBhWzZdO1xuICBhdyA9IGFbN107XG4gIG91dFs0XSA9IGF4ICogcXcgKyBhdyAqIHF4ICsgYXkgKiBxeiAtIGF6ICogcXk7XG4gIG91dFs1XSA9IGF5ICogcXcgKyBhdyAqIHF5ICsgYXogKiBxeCAtIGF4ICogcXo7XG4gIG91dFs2XSA9IGF6ICogcXcgKyBhdyAqIHF6ICsgYXggKiBxeSAtIGF5ICogcXg7XG4gIG91dFs3XSA9IGF3ICogcXcgLSBheCAqIHF4IC0gYXkgKiBxeSAtIGF6ICogcXo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBieSBhIGdpdmVuIHF1YXRlcm5pb24gKHEgKiBhKVxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgcXVhdGVybmlvbiB0byByb3RhdGUgYnlcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlQnlRdWF0UHJlcGVuZChvdXQsIHEsIGEpIHtcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXSxcbiAgICAgIGJ4ID0gYVswXSxcbiAgICAgIGJ5ID0gYVsxXSxcbiAgICAgIGJ6ID0gYVsyXSxcbiAgICAgIGJ3ID0gYVszXTtcbiAgb3V0WzBdID0gcXggKiBidyArIHF3ICogYnggKyBxeSAqIGJ6IC0gcXogKiBieTtcbiAgb3V0WzFdID0gcXkgKiBidyArIHF3ICogYnkgKyBxeiAqIGJ4IC0gcXggKiBiejtcbiAgb3V0WzJdID0gcXogKiBidyArIHF3ICogYnogKyBxeCAqIGJ5IC0gcXkgKiBieDtcbiAgb3V0WzNdID0gcXcgKiBidyAtIHF4ICogYnggLSBxeSAqIGJ5IC0gcXogKiBiejtcbiAgYnggPSBhWzRdO1xuICBieSA9IGFbNV07XG4gIGJ6ID0gYVs2XTtcbiAgYncgPSBhWzddO1xuICBvdXRbNF0gPSBxeCAqIGJ3ICsgcXcgKiBieCArIHF5ICogYnogLSBxeiAqIGJ5O1xuICBvdXRbNV0gPSBxeSAqIGJ3ICsgcXcgKiBieSArIHF6ICogYnggLSBxeCAqIGJ6O1xuICBvdXRbNl0gPSBxeiAqIGJ3ICsgcXcgKiBieiArIHF4ICogYnkgLSBxeSAqIGJ4O1xuICBvdXRbN10gPSBxdyAqIGJ3IC0gcXggKiBieCAtIHF5ICogYnkgLSBxeiAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYXJvdW5kIGEgZ2l2ZW4gYXhpcy4gRG9lcyB0aGUgbm9ybWFsaXNhdGlvbiBhdXRvbWF0aWNhbGx5XHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIGhvdyBmYXIgdGhlIHJvdGF0aW9uIHNob3VsZCBiZVxyXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZUFyb3VuZEF4aXMob3V0LCBhLCBheGlzLCByYWQpIHtcbiAgLy9TcGVjaWFsIGNhc2UgZm9yIHJhZCA9IDBcbiAgaWYgKE1hdGguYWJzKHJhZCkgPCBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgcmV0dXJuIGNvcHkob3V0LCBhKTtcbiAgfVxuXG4gIHZhciBheGlzTGVuZ3RoID0gTWF0aC5oeXBvdChheGlzWzBdLCBheGlzWzFdLCBheGlzWzJdKTtcbiAgcmFkID0gcmFkICogMC41O1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBieCA9IHMgKiBheGlzWzBdIC8gYXhpc0xlbmd0aDtcbiAgdmFyIGJ5ID0gcyAqIGF4aXNbMV0gLyBheGlzTGVuZ3RoO1xuICB2YXIgYnogPSBzICogYXhpc1syXSAvIGF4aXNMZW5ndGg7XG4gIHZhciBidyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBheDEgPSBhWzBdLFxuICAgICAgYXkxID0gYVsxXSxcbiAgICAgIGF6MSA9IGFbMl0sXG4gICAgICBhdzEgPSBhWzNdO1xuICBvdXRbMF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzFdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFsyXSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbM10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgdmFyIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XTtcbiAgb3V0WzRdID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzVdID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzZdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgb3V0WzddID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byBkdWFsIHF1YXQnc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgb3V0WzRdID0gYVs0XSArIGJbNF07XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XTtcbiAgb3V0WzddID0gYVs3XSArIGJbN107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gZHVhbCBxdWF0J3NcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIHZhciBheDAgPSBhWzBdLFxuICAgICAgYXkwID0gYVsxXSxcbiAgICAgIGF6MCA9IGFbMl0sXG4gICAgICBhdzAgPSBhWzNdLFxuICAgICAgYngxID0gYls0XSxcbiAgICAgIGJ5MSA9IGJbNV0sXG4gICAgICBiejEgPSBiWzZdLFxuICAgICAgYncxID0gYls3XSxcbiAgICAgIGF4MSA9IGFbNF0sXG4gICAgICBheTEgPSBhWzVdLFxuICAgICAgYXoxID0gYVs2XSxcbiAgICAgIGF3MSA9IGFbN10sXG4gICAgICBieDAgPSBiWzBdLFxuICAgICAgYnkwID0gYlsxXSxcbiAgICAgIGJ6MCA9IGJbMl0sXG4gICAgICBidzAgPSBiWzNdO1xuICBvdXRbMF0gPSBheDAgKiBidzAgKyBhdzAgKiBieDAgKyBheTAgKiBiejAgLSBhejAgKiBieTA7XG4gIG91dFsxXSA9IGF5MCAqIGJ3MCArIGF3MCAqIGJ5MCArIGF6MCAqIGJ4MCAtIGF4MCAqIGJ6MDtcbiAgb3V0WzJdID0gYXowICogYncwICsgYXcwICogYnowICsgYXgwICogYnkwIC0gYXkwICogYngwO1xuICBvdXRbM10gPSBhdzAgKiBidzAgLSBheDAgKiBieDAgLSBheTAgKiBieTAgLSBhejAgKiBiejA7XG4gIG91dFs0XSA9IGF4MCAqIGJ3MSArIGF3MCAqIGJ4MSArIGF5MCAqIGJ6MSAtIGF6MCAqIGJ5MSArIGF4MSAqIGJ3MCArIGF3MSAqIGJ4MCArIGF5MSAqIGJ6MCAtIGF6MSAqIGJ5MDtcbiAgb3V0WzVdID0gYXkwICogYncxICsgYXcwICogYnkxICsgYXowICogYngxIC0gYXgwICogYnoxICsgYXkxICogYncwICsgYXcxICogYnkwICsgYXoxICogYngwIC0gYXgxICogYnowO1xuICBvdXRbNl0gPSBhejAgKiBidzEgKyBhdzAgKiBiejEgKyBheDAgKiBieTEgLSBheTAgKiBieDEgKyBhejEgKiBidzAgKyBhdzEgKiBiejAgKyBheDEgKiBieTAgLSBheTEgKiBieDA7XG4gIG91dFs3XSA9IGF3MCAqIGJ3MSAtIGF4MCAqIGJ4MSAtIGF5MCAqIGJ5MSAtIGF6MCAqIGJ6MSArIGF3MSAqIGJ3MCAtIGF4MSAqIGJ4MCAtIGF5MSAqIGJ5MCAtIGF6MSAqIGJ6MDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQyLm11bHRpcGx5fVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcclxuICogU2NhbGVzIGEgZHVhbCBxdWF0IGJ5IGEgc2NhbGFyIG51bWJlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXQgdG8gc2NhbGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBkdWFsIHF1YXQgYnlcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICBvdXRbNF0gPSBhWzRdICogYjtcbiAgb3V0WzVdID0gYVs1XSAqIGI7XG4gIG91dFs2XSA9IGFbNl0gKiBiO1xuICBvdXRbN10gPSBhWzddICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gZHVhbCBxdWF0J3MgKFRoZSBkb3QgcHJvZHVjdCBvZiB0aGUgcmVhbCBwYXJ0cylcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZG90ID0gcXVhdC5kb3Q7XG4vKipcclxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBkdWFsIHF1YXRzJ3NcclxuICogTk9URTogVGhlIHJlc3VsdGluZyBkdWFsIHF1YXRlcm5pb25zIHdvbid0IGFsd2F5cyBiZSBub3JtYWxpemVkIChUaGUgZXJyb3IgaXMgbW9zdCBub3RpY2VhYmxlIHdoZW4gdCA9IDAuNSlcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0XHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3F1YXQyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgbXQgPSAxIC0gdDtcbiAgaWYgKGRvdChhLCBiKSA8IDApIHQgPSAtdDtcbiAgb3V0WzBdID0gYVswXSAqIG10ICsgYlswXSAqIHQ7XG4gIG91dFsxXSA9IGFbMV0gKiBtdCArIGJbMV0gKiB0O1xuICBvdXRbMl0gPSBhWzJdICogbXQgKyBiWzJdICogdDtcbiAgb3V0WzNdID0gYVszXSAqIG10ICsgYlszXSAqIHQ7XG4gIG91dFs0XSA9IGFbNF0gKiBtdCArIGJbNF0gKiB0O1xuICBvdXRbNV0gPSBhWzVdICogbXQgKyBiWzVdICogdDtcbiAgb3V0WzZdID0gYVs2XSAqIG10ICsgYls2XSAqIHQ7XG4gIG91dFs3XSA9IGFbN10gKiBtdCArIGJbN10gKiB0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGludmVyc2Ugb2YgYSBkdWFsIHF1YXQuIElmIHRoZXkgYXJlIG5vcm1hbGl6ZWQsIGNvbmp1Z2F0ZSBpcyBjaGVhcGVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgZHVhbCBxdWF0IHRvIGNhbGN1bGF0ZSBpbnZlcnNlIG9mXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgc3FsZW4gPSBzcXVhcmVkTGVuZ3RoKGEpO1xuICBvdXRbMF0gPSAtYVswXSAvIHNxbGVuO1xuICBvdXRbMV0gPSAtYVsxXSAvIHNxbGVuO1xuICBvdXRbMl0gPSAtYVsyXSAvIHNxbGVuO1xuICBvdXRbM10gPSBhWzNdIC8gc3FsZW47XG4gIG91dFs0XSA9IC1hWzRdIC8gc3FsZW47XG4gIG91dFs1XSA9IC1hWzVdIC8gc3FsZW47XG4gIG91dFs2XSA9IC1hWzZdIC8gc3FsZW47XG4gIG91dFs3XSA9IGFbN10gLyBzcWxlbjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSBjb25qdWdhdGUgb2YgYSBkdWFsIHF1YXRcclxuICogSWYgdGhlIGR1YWwgcXVhdGVybmlvbiBpcyBub3JtYWxpemVkLCB0aGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIHF1YXQyLmludmVyc2UgYW5kIHByb2R1Y2VzIHRoZSBzYW1lIHJlc3VsdC5cclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgcXVhdCB0byBjYWxjdWxhdGUgY29uanVnYXRlIG9mXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29uanVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSAtYVs0XTtcbiAgb3V0WzVdID0gLWFbNV07XG4gIG91dFs2XSA9IC1hWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIGR1YWwgcXVhdFxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgZHVhbCBxdWF0IHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbmd0aCA9IHF1YXQubGVuZ3RoO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdDIubGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgZHVhbCBxdWF0XHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBkdWFsIHF1YXQgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxdWFyZWRMZW5ndGggPSBxdWF0LnNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Mi5zcXVhcmVkTGVuZ3RofVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxyXG4gKiBOb3JtYWxpemUgYSBkdWFsIHF1YXRcclxuICpcclxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBkdWFsIHF1YXRlcm5pb24gdG8gbm9ybWFsaXplXHJcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIG1hZ25pdHVkZSA9IHNxdWFyZWRMZW5ndGgoYSk7XG5cbiAgaWYgKG1hZ25pdHVkZSA+IDApIHtcbiAgICBtYWduaXR1ZGUgPSBNYXRoLnNxcnQobWFnbml0dWRlKTtcbiAgICB2YXIgYTAgPSBhWzBdIC8gbWFnbml0dWRlO1xuICAgIHZhciBhMSA9IGFbMV0gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGEyID0gYVsyXSAvIG1hZ25pdHVkZTtcbiAgICB2YXIgYTMgPSBhWzNdIC8gbWFnbml0dWRlO1xuICAgIHZhciBiMCA9IGFbNF07XG4gICAgdmFyIGIxID0gYVs1XTtcbiAgICB2YXIgYjIgPSBhWzZdO1xuICAgIHZhciBiMyA9IGFbN107XG4gICAgdmFyIGFfZG90X2IgPSBhMCAqIGIwICsgYTEgKiBiMSArIGEyICogYjIgKyBhMyAqIGIzO1xuICAgIG91dFswXSA9IGEwO1xuICAgIG91dFsxXSA9IGExO1xuICAgIG91dFsyXSA9IGEyO1xuICAgIG91dFszXSA9IGEzO1xuICAgIG91dFs0XSA9IChiMCAtIGEwICogYV9kb3RfYikgLyBtYWduaXR1ZGU7XG4gICAgb3V0WzVdID0gKGIxIC0gYTEgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgICBvdXRbNl0gPSAoYjIgLSBhMiAqIGFfZG90X2IpIC8gbWFnbml0dWRlO1xuICAgIG91dFs3XSA9IChiMyAtIGEzICogYV9kb3RfYikgLyBtYWduaXR1ZGU7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkdWFsIHF1YXRlbmlvblxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgZHVhbCBxdWF0ZXJuaW9uIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGR1YWwgcXVhdFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInF1YXQyKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiLCBcIiArIGFbNF0gKyBcIiwgXCIgKyBhWzVdICsgXCIsIFwiICsgYVs2XSArIFwiLCBcIiArIGFbN10gKyBcIilcIjtcbn1cbi8qKlxyXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkdWFsIHF1YXRlcm5pb25zIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBkdWFsIHF1YXRlcm5pb24uXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYiB0aGUgc2Vjb25kIGR1YWwgcXVhdGVybmlvbi5cclxuICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIGR1YWwgcXVhdGVybmlvbnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXSAmJiBhWzRdID09PSBiWzRdICYmIGFbNV0gPT09IGJbNV0gJiYgYVs2XSA9PT0gYls2XSAmJiBhWzddID09PSBiWzddO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGR1YWwgcXVhdGVybmlvbnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGZpcnN0IGR1YWwgcXVhdC5cclxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBiIHRoZSBzZWNvbmQgZHVhbCBxdWF0LlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgZHVhbCBxdWF0cyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdLFxuICAgICAgYTYgPSBhWzZdLFxuICAgICAgYTcgPSBhWzddO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdLFxuICAgICAgYjQgPSBiWzRdLFxuICAgICAgYjUgPSBiWzVdLFxuICAgICAgYjYgPSBiWzZdLFxuICAgICAgYjcgPSBiWzddO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpICYmIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJiBNYXRoLmFicyhhNSAtIGI1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSkgJiYgTWF0aC5hYnMoYTYgLSBiNikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTYpLCBNYXRoLmFicyhiNikpICYmIE1hdGguYWJzKGE3IC0gYjcpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE3KSwgTWF0aC5hYnMoYjcpKTtcbn0iLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxyXG4gKiAyIERpbWVuc2lvbmFsIFZlY3RvclxyXG4gKiBAbW9kdWxlIHZlYzJcclxuICovXG5cbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMyXHJcbiAqXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gY2xvbmVcclxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgdmVjMiBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeCwgeSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzIgdG8gYW5vdGhlclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgc291cmNlIHZlY3RvclxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcclxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHkpIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogTXVsdGlwbGllcyB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBEaXZpZGVzIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjZWlsXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjZWlsKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gZmxvb3JcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZsb29yKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzInc1xyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byByb3VuZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm91bmQob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogU2NhbGVzIGEgdmVjMiBieSBhIHNjYWxhciBudW1iZXJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBBZGRzIHR3byB2ZWMyJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgIHkgPSBiWzFdIC0gYVsxXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSk7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxyXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICB5ID0gYlsxXSAtIGFbMV07XG4gIHJldHVybiB4ICogeCArIHkgKiB5O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSk7XG59XG4vKipcclxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcclxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWRMZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgcmV0dXJuIHggKiB4ICsgeSAqIHk7XG59XG4vKipcclxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGludmVydFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJzZShvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBOb3JtYWxpemUgYSB2ZWMyXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBub3JtYWxpemVcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShvdXQsIGEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5O1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgLy9UT0RPOiBldmFsdWF0ZSB1c2Ugb2YgZ2xtX2ludnNxcnQgaGVyZT9cbiAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gIH1cblxuICBvdXRbMF0gPSBhWzBdICogbGVuO1xuICBvdXRbMV0gPSBhWzFdICogbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkb3QoYSwgYikge1xuICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXTtcbn1cbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMidzXHJcbiAqIE5vdGUgdGhhdCB0aGUgY3Jvc3MgcHJvZHVjdCBtdXN0IGJ5IGRlZmluaXRpb24gcHJvZHVjZSBhIDNEIHZlY3RvclxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge3ZlYzN9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyb3NzKG91dCwgYSwgYikge1xuICB2YXIgeiA9IGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07XG4gIG91dFswXSA9IG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IHo7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcclxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMyJ3NcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV07XG4gIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG4gIHZhciByID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHNjYWxlO1xuICBvdXRbMV0gPSBNYXRoLnNpbihyKSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDJcclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cclxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzJdICogeTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzNdICogeTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyZFxyXG4gKlxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXHJcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQyZChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHkgKyBtWzRdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQzXHJcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MyhvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVszXSAqIHkgKyBtWzZdO1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxyXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQ0XHJcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzAnXHJcbiAqIDR0aCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzEnXHJcbiAqXHJcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxyXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0NChvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJvdGF0ZSBhIDJEIHZlY3RvclxyXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzJcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIHZlYzIgcG9pbnQgdG8gcm90YXRlXHJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIGIsIHJhZCkge1xuICAvL1RyYW5zbGF0ZSBwb2ludCB0byB0aGUgb3JpZ2luXG4gIHZhciBwMCA9IGFbMF0gLSBiWzBdLFxuICAgICAgcDEgPSBhWzFdIC0gYlsxXSxcbiAgICAgIHNpbkMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgY29zQyA9IE1hdGguY29zKHJhZCk7IC8vcGVyZm9ybSByb3RhdGlvbiBhbmQgdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSBwMCAqIGNvc0MgLSBwMSAqIHNpbkMgKyBiWzBdO1xuICBvdXRbMV0gPSBwMCAqIHNpbkMgKyBwMSAqIGNvc0MgKyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIEdldCB0aGUgYW5nbGUgYmV0d2VlbiB0d28gMkQgdmVjdG9yc1xyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3Qgb3BlcmFuZFxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgc2Vjb25kIG9wZXJhbmRcclxuICogQHJldHVybnMge051bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnNcclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhbmdsZShhLCBiKSB7XG4gIHZhciB4MSA9IGFbMF0sXG4gICAgICB5MSA9IGFbMV0sXG4gICAgICB4MiA9IGJbMF0sXG4gICAgICB5MiA9IGJbMV0sXG4gICAgICAvLyBtYWcgaXMgdGhlIHByb2R1Y3Qgb2YgdGhlIG1hZ25pdHVkZXMgb2YgYSBhbmQgYlxuICBtYWcgPSBNYXRoLnNxcnQoeDEgKiB4MSArIHkxICogeTEpICogTWF0aC5zcXJ0KHgyICogeDIgKyB5MiAqIHkyKSxcbiAgICAgIC8vIG1hZyAmJi4uIHNob3J0IGNpcmN1aXRzIGlmIG1hZyA9PSAwXG4gIGNvc2luZSA9IG1hZyAmJiAoeDEgKiB4MiArIHkxICogeTIpIC8gbWFnOyAvLyBNYXRoLm1pbihNYXRoLm1heChjb3NpbmUsIC0xKSwgMSkgY2xhbXBzIHRoZSBjb3NpbmUgYmV0d2VlbiAtMSBhbmQgMVxuXG4gIHJldHVybiBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5tYXgoY29zaW5lLCAtMSksIDEpKTtcbn1cbi8qKlxyXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyIHRvIHplcm9cclxuICpcclxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcclxuICpcclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xyXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxyXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzIoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiKVwiO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgZXhhY3RseSBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdO1xufVxuLyoqXHJcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxyXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cclxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSk7XG59XG4vKipcclxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmxlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3VidHJhY3R9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubXVsdGlwbHl9XHJcbiAqIEBmdW5jdGlvblxyXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGl2aWRlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZGl2ID0gZGl2aWRlO1xuLyoqXHJcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXN0YW5jZX1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIGRpc3QgPSBkaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3F1YXJlZERpc3RhbmNlfVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgc3FyRGlzdCA9IHNxdWFyZWREaXN0YW5jZTtcbi8qKlxyXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3F1YXJlZExlbmd0aH1cclxuICogQGZ1bmN0aW9uXHJcbiAqL1xuXG5leHBvcnQgdmFyIHNxckxlbiA9IHNxdWFyZWRMZW5ndGg7XG4vKipcclxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzJzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzIuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxyXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjMnMgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXHJcbiAqIEByZXR1cm5zIHtBcnJheX0gYVxyXG4gKiBAZnVuY3Rpb25cclxuICovXG5cbmV4cG9ydCB2YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlYyA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgIHZhciBpLCBsO1xuXG4gICAgaWYgKCFzdHJpZGUpIHtcbiAgICAgIHN0cmlkZSA9IDI7XG4gICAgfVxuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBsID0gTWF0aC5taW4oY291bnQgKiBzdHJpZGUgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGEubGVuZ3RoO1xuICAgIH1cblxuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICB2ZWNbMF0gPSBhW2ldO1xuICAgICAgdmVjWzFdID0gYVtpICsgMV07XG4gICAgICBmbih2ZWMsIHZlYywgYXJnKTtcbiAgICAgIGFbaV0gPSB2ZWNbMF07XG4gICAgICBhW2kgKyAxXSA9IHZlY1sxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYTtcbiAgfTtcbn0oKTsiLCIvLyBAZmxvd1xuXG4vKipcbiAqIERlZXBseSBjb21wYXJlcyB0d28gb2JqZWN0IGxpdGVyYWxzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZXBFcXVhbChhOiA/bWl4ZWQsIGI6ID9taXhlZCk6IGJvb2xlYW4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShiKSB8fCBhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChhW2ldLCBiW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnICYmIGEgIT09IG51bGwgJiYgYiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoISh0eXBlb2YgYiA9PT0gJ29iamVjdCcpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhiKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYSkge1xuICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkZWVwRXF1YWw7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVW5pdEJlemllciBmcm9tICdAbWFwYm94L3VuaXRiZXppZXInO1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93LmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7dmVjNCwgbWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcblxuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5cbmNvbnN0IERFR19UT19SQUQgPSBNYXRoLlBJIC8gMTgwO1xuY29uc3QgUkFEX1RPX0RFRyA9IDE4MCAvIE1hdGguUEk7XG5cbi8qKlxuICogQ29udmVydHMgYW4gYW5nbGUgaW4gZGVncmVlcyB0byByYWRpYW5zXG4gKiBjb3B5IGFsbCBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZSBvYmplY3RzIGludG8gdGhlIGRlc3RpbmF0aW9uLlxuICogVGhlIGxhc3Qgc291cmNlIG9iamVjdCBnaXZlbiBvdmVycmlkZXMgcHJvcGVydGllcyBmcm9tIHByZXZpb3VzXG4gKiBzb3VyY2Ugb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gYSBhbmdsZSB0byBjb252ZXJ0XG4gKiBAcmV0dXJucyB0aGUgYW5nbGUgaW4gcmFkaWFuc1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZ1RvUmFkKGE6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGEgKiBERUdfVE9fUkFEO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFuZ2xlIGluIHJhZGlhbnMgdG8gZGVncmVlc1xuICogY29weSBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZSBkZXN0aW5hdGlvbi5cbiAqIFRoZSBsYXN0IHNvdXJjZSBvYmplY3QgZ2l2ZW4gb3ZlcnJpZGVzIHByb3BlcnRpZXMgZnJvbSBwcmV2aW91c1xuICogc291cmNlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGEgYW5nbGUgdG8gY29udmVydFxuICogQHJldHVybnMgdGhlIGFuZ2xlIGluIGRlZ3JlZXNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYWRUb0RlZyhhOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBhICogUkFEX1RPX0RFRztcbn1cblxuY29uc3QgVElMRV9DT1JORVJTID0gW1swLCAwXSwgWzEsIDBdLCBbMSwgMV0sIFswLCAxXV07XG5cbi8qKlxuICogR2l2ZW4gYSBwYXJ0aWN1bGFyIGJlYXJpbmcsIHJldHVybnMgdGhlIGNvcm5lciBvZiB0aGUgdGlsZSB0aGF0cyBmYXJ0aGVzdFxuICogYWxvbmcgdGhlIGJlYXJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgYW5nbGUgaW4gZGVncmVlcyAoLTE4MCwgMTgwXVxuICogQHJldHVybnMge1F1YWRDb3JuZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZnVydGhlc3RUaWxlQ29ybmVyKGJlYXJpbmc6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIGNvbnN0IGFsaWduZWRCZWFyaW5nID0gKChiZWFyaW5nICsgNDUpICsgMzYwKSAlIDM2MDtcbiAgICBjb25zdCBjb3JuZXJJZHggPSBNYXRoLnJvdW5kKGFsaWduZWRCZWFyaW5nIC8gOTApICUgNDtcbiAgICByZXR1cm4gVElMRV9DT1JORVJTW2Nvcm5lcklkeF07XG59XG5cbi8qKlxuICogQG1vZHVsZSB1dGlsXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogR2l2ZW4gYSB2YWx1ZSBgdGAgdGhhdCB2YXJpZXMgYmV0d2VlbiAwIGFuZCAxLCByZXR1cm5cbiAqIGFuIGludGVycG9sYXRpb24gZnVuY3Rpb24gdGhhdCBlYXNlcyBiZXR3ZWVuIDAgYW5kIDEgaW4gYSBwbGVhc2luZ1xuICogY3ViaWMgaW4tb3V0IGZhc2hpb24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVhc2VDdWJpY0luT3V0KHQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHQgPD0gMCkgcmV0dXJuIDA7XG4gICAgaWYgKHQgPj0gMSkgcmV0dXJuIDE7XG4gICAgY29uc3QgdDIgPSB0ICogdCxcbiAgICAgICAgdDMgPSB0MiAqIHQ7XG4gICAgcmV0dXJuIDQgKiAodCA8IDAuNSA/IHQzIDogMyAqICh0IC0gdDIpICsgdDMgLSAwLjc1KTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBhbiBBQUJCIGZvciBhIHNldCBvZiBwb2ludHMuXG4gKlxuICogQHBhcmFtIHtQb2ludFtdfSBwb2ludHNcbiAqIEByZXR1cm5zIHt7IG1pbjogUG9pbnQsIG1heDogUG9pbnR9fVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJvdW5kcyhwb2ludHM6IFBvaW50W10pOiB7IG1pbjogUG9pbnQsIG1heDogUG9pbnR9IHtcbiAgICBsZXQgbWluWCA9IEluZmluaXR5O1xuICAgIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG4gICAgZm9yIChjb25zdCBwIG9mIHBvaW50cykge1xuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcC54KTtcbiAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHAueSk7XG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBwLngpO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcC55KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBtaW46IG5ldyBQb2ludChtaW5YLCBtaW5ZKSxcbiAgICAgICAgbWF4OiBuZXcgUG9pbnQobWF4WCwgbWF4WSksXG4gICAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzcXVhcmUgb2YgdGhlIDJEIGRpc3RhbmNlIGJldHdlZW4gYW4gQUFCQiBkZWZpbmVkIGJ5IG1pbiBhbmQgbWF4IGFuZCBhIHBvaW50LlxuICogSWYgcG9pbnQgaXMgbnVsbCBvciB1bmRlZmluZWQsIHRoZSBBQUJCIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiAoMCwwKSBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge1BvaW50fSBtaW4gVGhlIG1pbmltdW0gZXh0ZW50IG9mIHRoZSBBQUJCLlxuICogQHBhcmFtIHtQb2ludH0gbWF4IFRoZSBtYXhpbXVtIGV4dGVudCBvZiB0aGUgQUFCQi5cbiAqIEBwYXJhbSB7UG9pbnR9IFtwb2ludF0gVGhlIHBvaW50IHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIGZyb20sIG1heSBiZSB1bmRlZmluZWQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc3F1YXJlIGRpc3RhbmNlIGZyb20gdGhlIEFBQkIsIDAuMCBpZiB0aGUgQUFCQiBjb250YWlucyB0aGUgcG9pbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBQUJCUG9pbnRTcXVhcmVEaXN0KG1pbjogUG9pbnQsIG1heDogUG9pbnQsIHBvaW50OiA/UG9pbnQpOiBudW1iZXIge1xuICAgIGxldCBzcURpc3QgPSAwLjA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICBjb25zdCB2ID0gcG9pbnQgPyBwb2ludFtpXSA6IDAuMDtcbiAgICAgICAgYXNzZXJ0KG1pbltpXSA8IG1heFtpXSwgJ0ludmFsaWQgYWFiYiBtaW4gYW5kIG1heCBpbnB1dHMsIG1pbltpXSBtdXN0IGJlIDwgbWF4W2ldLicpO1xuICAgICAgICBpZiAobWluW2ldID4gdikgc3FEaXN0ICs9IChtaW5baV0gLSB2KSAqIChtaW5baV0gLSB2KTtcbiAgICAgICAgaWYgKG1heFtpXSA8IHYpIHNxRGlzdCArPSAodiAtIG1heFtpXSkgKiAodiAtIG1heFtpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNxRGlzdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIEFBQkIgaW50byBhIHBvbHlnb24gd2l0aCBjbG9ja3dpc2Ugd2luZGluZyBvcmRlci5cbiAqXG4gKiBAcGFyYW0ge1BvaW50fSBtaW4gVGhlIHRvcCBsZWZ0IHBvaW50LlxuICogQHBhcmFtIHtQb2ludH0gbWF4IFRoZSBib3R0b20gcmlnaHQgcG9pbnQuXG4gKiBAcGFyYW0ge251bWJlcn0gW2J1ZmZlcj0wXSBUaGUgYnVmZmVyIHdpZHRoLlxuICogQHBhcmFtIHtib29sZWFufSBbY2xvc2U9dHJ1ZV0gV2hldGhlciB0byBjbG9zZSB0aGUgcG9seWdvbiBvciBub3QuXG4gKiBAcmV0dXJucyB7UG9pbnRbXX0gVGhlIHBvbHlnb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2x5Z29uaXplQm91bmRzKG1pbjogUG9pbnQsIG1heDogUG9pbnQsIGJ1ZmZlcjogbnVtYmVyID0gMCwgY2xvc2U6IGJvb2xlYW4gPSB0cnVlKTogUG9pbnRbXSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gbmV3IFBvaW50KGJ1ZmZlciwgYnVmZmVyKTtcbiAgICBjb25zdCBtaW5CdWYgPSBtaW4uc3ViKG9mZnNldCk7XG4gICAgY29uc3QgbWF4QnVmID0gbWF4LmFkZChvZmZzZXQpO1xuICAgIGNvbnN0IHBvbHlnb24gPSBbbWluQnVmLCBuZXcgUG9pbnQobWF4QnVmLngsIG1pbkJ1Zi55KSwgbWF4QnVmLCBuZXcgUG9pbnQobWluQnVmLngsIG1heEJ1Zi55KV07XG5cbiAgICBpZiAoY2xvc2UpIHtcbiAgICAgICAgcG9seWdvbi5wdXNoKG1pbkJ1Zik7XG4gICAgfVxuICAgIHJldHVybiBwb2x5Z29uO1xufVxuXG4vKipcbiAqIFRha2VzIGEgY29udmV4IHJpbmcgYW5kIGV4cGFuZHMgaXQgb3V0d2FyZCBieSBhcHBseWluZyBhIGJ1ZmZlciBhcm91bmQgaXQuXG4gKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgcmluZyBpcyBpbiBjbG9ja3dpc2Ugd2luZGluZyBvcmRlci5cbiAqXG4gKiBAcGFyYW0ge1BvaW50W119IHJpbmcgVGhlIGlucHV0IHJpbmcuXG4gKiBAcGFyYW0ge251bWJlcn0gYnVmZmVyIFRoZSBidWZmZXIgd2lkdGguXG4gKiBAcmV0dXJucyB7UG9pbnRbXX0gVGhlIGV4cGFuZGVkIHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJDb252ZXhQb2x5Z29uKHJpbmc6IFBvaW50W10sIGJ1ZmZlcjogbnVtYmVyKTogUG9pbnRbXSB7XG4gICAgYXNzZXJ0KHJpbmcubGVuZ3RoID4gMiwgJ2J1ZmZlckNvbnZleFBvbHlnb24gcmVxdWlyZXMgdGhlIHJpbmcgdG8gaGF2ZSBhdGxlYXN0IDMgcG9pbnRzJyk7XG4gICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgZm9yIChsZXQgY3VycklkeCA9IDA7IGN1cnJJZHggPCByaW5nLmxlbmd0aDsgY3VycklkeCsrKSB7XG4gICAgICAgIGNvbnN0IHByZXZJZHggPSB3cmFwKGN1cnJJZHggLSAxLCAtMSwgcmluZy5sZW5ndGggLSAxKTtcbiAgICAgICAgY29uc3QgbmV4dElkeCA9IHdyYXAoY3VycklkeCArIDEsIC0xLCByaW5nLmxlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCBwcmV2ID0gcmluZ1twcmV2SWR4XTtcbiAgICAgICAgY29uc3QgY3VyciA9IHJpbmdbY3VycklkeF07XG4gICAgICAgIGNvbnN0IG5leHQgPSByaW5nW25leHRJZHhdO1xuICAgICAgICBjb25zdCBwMSA9IHByZXYuc3ViKGN1cnIpLnVuaXQoKTtcbiAgICAgICAgY29uc3QgcDIgPSBuZXh0LnN1YihjdXJyKS51bml0KCk7XG4gICAgICAgIGNvbnN0IGludGVyaW9yQW5nbGUgPSBwMi5hbmdsZVdpdGhTZXAocDEueCwgcDEueSk7XG4gICAgICAgIC8vIENhbGN1YXRlIGEgdmVjdG9yIHRoYXQgcG9pbnRzIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGFuZ2xlIGJpc2VjdG9yIGJldHdlZW4gdHdvIHNpZGVzLlxuICAgICAgICAvLyBTY2FsZSBpdCBiYXNlZCBvbiBhIHJpZ2h0IGFuZ2xlZCB0cmlhbmdsZSBjb25zdHJ1Y3RlZCBhdCB0aGF0IGNvcm5lci5cbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcDEuYWRkKHAyKS51bml0KCkubXVsdCgtMSAqIGJ1ZmZlciAvIE1hdGguc2luKGludGVyaW9yQW5nbGUgLyAyKSk7XG4gICAgICAgIG91dHB1dC5wdXNoKGN1cnIuYWRkKG9mZnNldCkpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIEdpdmVuIGdpdmVuICh4LCB5KSwgKHgxLCB5MSkgY29udHJvbCBwb2ludHMgZm9yIGEgYmV6aWVyIGN1cnZlLFxuICogcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBpbnRlcnBvbGF0ZXMgYWxvbmcgdGhhdCBjdXJ2ZS5cbiAqXG4gKiBAcGFyYW0gcDF4IGNvbnRyb2wgcG9pbnQgMSB4IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSBwMXkgY29udHJvbCBwb2ludCAxIHkgY29vcmRpbmF0ZVxuICogQHBhcmFtIHAyeCBjb250cm9sIHBvaW50IDIgeCBjb29yZGluYXRlXG4gKiBAcGFyYW0gcDJ5IGNvbnRyb2wgcG9pbnQgMiB5IGNvb3JkaW5hdGVcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZXppZXIocDF4OiBudW1iZXIsIHAxeTogbnVtYmVyLCBwMng6IG51bWJlciwgcDJ5OiBudW1iZXIpOiAodDogbnVtYmVyKSA9PiBudW1iZXIge1xuICAgIGNvbnN0IGJlemllciA9IG5ldyBVbml0QmV6aWVyKHAxeCwgcDF5LCBwMngsIHAyeSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gYmV6aWVyLnNvbHZlKHQpO1xuICAgIH07XG59XG5cbi8qKlxuICogQSBkZWZhdWx0IGJlemllci1jdXJ2ZSBwb3dlcmVkIGVhc2luZyBmdW5jdGlvbiB3aXRoXG4gKiBjb250cm9sIHBvaW50cyAoMC4yNSwgMC4xKSBhbmQgKDAuMjUsIDEpXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGVhc2UgPSBiZXppZXIoMC4yNSwgMC4xLCAwLjI1LCAxKTtcblxuLyoqXG4gKiBjb25zdHJhaW4gbiB0byB0aGUgZ2l2ZW4gcmFuZ2UgdmlhIG1pbiArIG1heFxuICpcbiAqIEBwYXJhbSBuIHZhbHVlXG4gKiBAcGFyYW0gbWluIHRoZSBtaW5pbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkXG4gKiBAcGFyYW0gbWF4IHRoZSBtYXhpbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB0aGUgY2xhbXBlZCB2YWx1ZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKG46IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIG4pKTtcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEdMU0wgc21vb3Roc3RlcC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZTAgVGhlIGxvd2VyIGVkZ2Ugb2YgdGhlIHNpZ21vaWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBlMSBUaGUgdXBwZXIgZWRnZSBvZiB0aGUgc2lnbW9pZFxuICogQHBhcmFtIHtudW1iZXJ9IHggdGhlIHZhbHVlIHRvIGJlIGludGVycG9sYXRlZFxuICogQHJldHVybnMge251bWJlcn0gaW4gdGhlIHJhbmdlIFswLCAxXVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNtb290aHN0ZXAoZTA6IG51bWJlciwgZTE6IG51bWJlciwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICB4ID0gY2xhbXAoKHggLSBlMCkgLyAoZTEgLSBlMCksIDAsIDEpO1xuICAgIHJldHVybiB4ICogeCAqICgzIC0gMiAqIHgpO1xufVxuXG4vKipcbiAqIGNvbnN0cmFpbiBuIHRvIHRoZSBnaXZlbiByYW5nZSwgZXhjbHVkaW5nIHRoZSBtaW5pbXVtLCB2aWEgbW9kdWxhciBhcml0aG1ldGljXG4gKlxuICogQHBhcmFtIG4gdmFsdWVcbiAqIEBwYXJhbSBtaW4gdGhlIG1pbmltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWQsIGV4Y2x1c2l2ZVxuICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSB2YWx1ZSB0byBiZSByZXR1cm5lZCwgaW5jbHVzaXZlXG4gKiBAcmV0dXJucyBjb25zdHJhaW5lZCBudW1iZXJcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKG46IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBkID0gbWF4IC0gbWluO1xuICAgIGNvbnN0IHcgPSAoKG4gLSBtaW4pICUgZCArIGQpICUgZCArIG1pbjtcbiAgICByZXR1cm4gKHcgPT09IG1pbikgPyBtYXggOiB3O1xufVxuXG4vKlxuICogQ2FsbCBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgYXJndW1lbnRzLFxuICogY2FsbGluZyBgY2FsbGJhY2tgIHdpdGggdGhlIGNvbXBsZXRlZCByZXN1bHRzIG9mIGFsbCBjYWxscy5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgaW5wdXQgdG8gZWFjaCBjYWxsIG9mIHRoZSBhc3luYyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmbiBhbiBhc3luYyBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSAoZGF0YSwgY2FsbGJhY2spXG4gKiBAcGFyYW0gY2FsbGJhY2sgYSBjYWxsYmFjayBydW4gYWZ0ZXIgYWxsIGFzeW5jIHdvcmsgaXMgZG9uZS5cbiAqIGNhbGxlZCB3aXRoIGFuIGFycmF5LCBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIGVhY2ggYXN5bmMgY2FsbC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3luY0FsbDxJdGVtLCBSZXN1bHQ+KFxuICAgIGFycmF5OiBBcnJheTxJdGVtPixcbiAgICBmbjogKGl0ZW06IEl0ZW0sIGZuQ2FsbGJhY2s6IENhbGxiYWNrPFJlc3VsdD4pID0+IHZvaWQsXG4gICAgY2FsbGJhY2s6IENhbGxiYWNrPEFycmF5PFJlc3VsdD4+XG4pIHtcbiAgICBpZiAoIWFycmF5Lmxlbmd0aCkgeyByZXR1cm4gY2FsbGJhY2sobnVsbCwgW10pOyB9XG4gICAgbGV0IHJlbWFpbmluZyA9IGFycmF5Lmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5KGFycmF5Lmxlbmd0aCk7XG4gICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICBhcnJheS5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIGZuKGl0ZW0sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICByZXN1bHRzW2ldID0gKChyZXN1bHQ6IGFueSk6IFJlc3VsdCk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yMTIzXG4gICAgICAgICAgICBpZiAoLS1yZW1haW5pbmcgPT09IDApIGNhbGxiYWNrKGVycm9yLCByZXN1bHRzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qXG4gKiBQb2x5ZmlsbCBmb3IgT2JqZWN0LnZhbHVlcy4gTm90IGZ1bGx5IHNwZWMgY29tcGxpYW50LCBidXQgd2UgZG9uJ3RcbiAqIG5lZWQgaXQgdG8gYmUuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlczxUPihvYmo6IHtba2V5OiBzdHJpbmddOiBUfSk6IEFycmF5PFQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG9ialtrXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qXG4gKiBDb21wdXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGtleXMgaW4gb25lIG9iamVjdCBhbmQgdGhlIGtleXNcbiAqIGluIGFub3RoZXIgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIGtleXMgZGlmZmVyZW5jZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGtleXNEaWZmZXJlbmNlPFMsIFQ+KG9iajoge1trZXk6IHN0cmluZ106IFN9LCBvdGhlcjoge1trZXk6IHN0cmluZ106IFR9KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IFtdO1xuICAgIGZvciAoY29uc3QgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCEoaSBpbiBvdGhlcikpIHtcbiAgICAgICAgICAgIGRpZmZlcmVuY2UucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlmZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGRlc3RpbmF0aW9uIG9iamVjdCBhbmQgb3B0aW9uYWxseSBtYW55IHNvdXJjZSBvYmplY3RzLFxuICogY29weSBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZSBkZXN0aW5hdGlvbi5cbiAqIFRoZSBsYXN0IHNvdXJjZSBvYmplY3QgZ2l2ZW4gb3ZlcnJpZGVzIHByb3BlcnRpZXMgZnJvbSBwcmV2aW91c1xuICogc291cmNlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGRlc3QgZGVzdGluYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gc291cmNlcyBzb3VyY2VzIGZyb20gd2hpY2ggcHJvcGVydGllcyBhcmUgcHVsbGVkXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKGRlc3Q6IE9iamVjdCwgLi4uc291cmNlczogQXJyYXk8P09iamVjdD4pOiBPYmplY3Qge1xuICAgIGZvciAoY29uc3Qgc3JjIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrIGluIHNyYykge1xuICAgICAgICAgICAgZGVzdFtrXSA9IHNyY1trXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbiBvYmplY3QgYW5kIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYXMgc3RyaW5ncywgcmV0dXJuIHZlcnNpb25cbiAqIG9mIHRoYXQgb2JqZWN0IHdpdGggb25seSB0aG9zZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSBzcmMgdGhlIG9iamVjdFxuICogQHBhcmFtIHByb3BlcnRpZXMgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgY2hvc2VuXG4gKiB0byBhcHBlYXIgb24gdGhlIHJlc3VsdGluZyBvYmplY3QuXG4gKiBAcmV0dXJucyBvYmplY3Qgd2l0aCBsaW1pdGVkIHByb3BlcnRpZXMuXG4gKiBAZXhhbXBsZVxuICogdmFyIGZvbyA9IHsgbmFtZTogJ0NoYXJsaWUnLCBhZ2U6IDEwIH07XG4gKiB2YXIganVzdE5hbWUgPSBwaWNrKGZvbywgWyduYW1lJ10pO1xuICogLy8ganVzdE5hbWUgPSB7IG5hbWU6ICdDaGFybGllJyB9XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGljayhzcmM6IE9iamVjdCwgcHJvcGVydGllczogQXJyYXk8c3RyaW5nPik6IE9iamVjdCB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGsgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICBpZiAoayBpbiBzcmMpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IHNyY1trXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5sZXQgaWQgPSAxO1xuXG4vKipcbiAqIFJldHVybiBhIHVuaXF1ZSBudW1lcmljIGlkLCBzdGFydGluZyBhdCAxIGFuZCBpbmNyZW1lbnRpbmcgd2l0aFxuICogZWFjaCBjYWxsLlxuICpcbiAqIEByZXR1cm5zIHVuaXF1ZSBudW1lcmljIGlkLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGlkKys7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgcmFuZG9tIFVVSUQgKHY0KS4gVGFrZW4gZnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vamVkLzk4Mjg4M1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWQoKTogc3RyaW5nIHtcbiAgICBmdW5jdGlvbiBiKGEpIHtcbiAgICAgICAgcmV0dXJuIGEgPyAoYSBeIE1hdGgucmFuZG9tKCkgKiAxNiA+PiBhIC8gNCkudG9TdHJpbmcoMTYpIDpcbiAgICAgICAgLy8kRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSB0aGUgaW1wbGllZCBhcnJheSBsaXRlcmFsIGNvbnZlcnNpb24gaGVyZVxuICAgICAgICAgICAgKFsxZTddICsgLVsxZTNdICsgLTRlMyArIC04ZTMgKyAtMWUxMSkucmVwbGFjZSgvWzAxOF0vZywgYik7XG4gICAgfVxuICAgIHJldHVybiBiKCk7XG59XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBnaXZlbiB2YWx1ZSBpcyBhIHBvd2VyIG9mIHR3b1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG93ZXJPZlR3byh2YWx1ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMikgJSAxID09PSAwO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgbmV4dCBwb3dlciBvZiB0d28sIG9yIHRoZSBpbnB1dCB2YWx1ZSBpZiBhbHJlYWR5IGEgcG93ZXIgb2YgdHdvXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dFBvd2VyT2ZUd28odmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHZhbHVlIDw9IDEpIHJldHVybiAxO1xuICAgIHJldHVybiBNYXRoLnBvdygyLCBNYXRoLmNlaWwoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHByZXZpb3VzIHBvd2VyIG9mIHR3bywgb3IgdGhlIGlucHV0IHZhbHVlIGlmIGFscmVhZHkgYSBwb3dlciBvZiB0d29cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmV2UG93ZXJPZlR3byh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodmFsdWUgPD0gMSkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIE1hdGgucG93KDIsIE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIHN0cmluZyB0byBtYXRjaCBVVUlEKHY0KSBvZiB0aGVcbiAqIGZvcm06IHh4eHh4eHh4LXh4eHgtNHh4eC1bODlhYl14eHgteHh4eHh4eHh4eHh4XG4gKiBAcGFyYW0gc3RyIHN0cmluZyB0byB2YWxpZGF0ZS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVV1aWQoc3RyOiA/c3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0ciA/IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzRdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC9pLnRlc3Qoc3RyKSA6IGZhbHNlO1xufVxuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIG1lbWJlciBmdW5jdGlvbiBuYW1lcyBhcyBzdHJpbmdzLCByZXBsYWNlIGFsbCBvZiB0aGVtXG4gKiB3aXRoIGJvdW5kIHZlcnNpb25zIHRoYXQgd2lsbCBhbHdheXMgcmVmZXIgdG8gYGNvbnRleHRgIGFzIGB0aGlzYC4gVGhpc1xuICogaXMgdXNlZnVsIGZvciBjbGFzc2VzIHdoZXJlIG90aGVyd2lzZSBldmVudCBiaW5kaW5ncyB3b3VsZCByZWFzc2lnblxuICogYHRoaXNgIHRvIHRoZSBldmVudGVkIG9iamVjdCBvciBzb21lIG90aGVyIHZhbHVlOiB0aGlzIGxldHMgeW91IGVuc3VyZVxuICogdGhlIGB0aGlzYCB2YWx1ZSBhbHdheXMuXG4gKlxuICogQHBhcmFtIGZucyBsaXN0IG9mIG1lbWJlciBmdW5jdGlvbiBuYW1lc1xuICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdmFsdWVcbiAqIEBleGFtcGxlXG4gKiBmdW5jdGlvbiBNeUNsYXNzKCkge1xuICogICBiaW5kQWxsKFsnb250aW1lciddLCB0aGlzKTtcbiAqICAgdGhpcy5uYW1lID0gJ1RvbSc7XG4gKiB9XG4gKiBNeUNsYXNzLnByb3RvdHlwZS5vbnRpbWVyID0gZnVuY3Rpb24oKSB7XG4gKiAgIGFsZXJ0KHRoaXMubmFtZSk7XG4gKiB9O1xuICogdmFyIG15Q2xhc3MgPSBuZXcgTXlDbGFzcygpO1xuICogc2V0VGltZW91dChteUNsYXNzLm9udGltZXIsIDEwMCk7XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZEFsbChmbnM6IEFycmF5PHN0cmluZz4sIGNvbnRleHQ6IE9iamVjdCk6IHZvaWQge1xuICAgIGZucy5mb3JFYWNoKChmbikgPT4ge1xuICAgICAgICBpZiAoIWNvbnRleHRbZm5dKSB7IHJldHVybjsgfVxuICAgICAgICBjb250ZXh0W2ZuXSA9IGNvbnRleHRbZm5dLmJpbmQoY29udGV4dCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgc3RyaW5nIGVuZHMgd2l0aCBhIHBhcnRpY3VsYXIgc3Vic3RyaW5nXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZzogc3RyaW5nLCBzdWZmaXg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdHJpbmcuaW5kZXhPZihzdWZmaXgsIHN0cmluZy5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSAhPT0gLTE7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIG9iamVjdCBieSBtYXBwaW5nIGFsbCB0aGUgdmFsdWVzIG9mIGFuIGV4aXN0aW5nIG9iamVjdCB3aGlsZVxuICogcHJlc2VydmluZyB0aGVpciBrZXlzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBPYmplY3QoaW5wdXQ6IE9iamVjdCwgaXRlcmF0b3I6IEZ1bmN0aW9uLCBjb250ZXh0PzogT2JqZWN0KTogT2JqZWN0IHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnB1dCkge1xuICAgICAgICBvdXRwdXRba2V5XSA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCB8fCB0aGlzLCBpbnB1dFtrZXldLCBrZXksIGlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gb2JqZWN0IGJ5IGZpbHRlcmluZyBvdXQgdmFsdWVzIG9mIGFuIGV4aXN0aW5nIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyT2JqZWN0KGlucHV0OiBPYmplY3QsIGl0ZXJhdG9yOiBGdW5jdGlvbiwgY29udGV4dD86IE9iamVjdCk6IE9iamVjdCB7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gaW5wdXQpIHtcbiAgICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCB8fCB0aGlzLCBpbnB1dFtrZXldLCBrZXksIGlucHV0KSkge1xuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBpbnB1dFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59XG5cbmltcG9ydCBkZWVwRXF1YWwgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2RlZXBfZXF1YWwuanMnO1xuZXhwb3J0IHtkZWVwRXF1YWx9O1xuXG4vKipcbiAqIERlZXBseSBjbG9uZXMgdHdvIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lPFQ+KGlucHV0OiBUKTogVCB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBpbnB1dC5tYXAoY2xvbmUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiBpbnB1dCkge1xuICAgICAgICByZXR1cm4gKChtYXBPYmplY3QoaW5wdXQsIGNsb25lKTogYW55KTogVCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0d28gYXJyYXlzIGhhdmUgYXQgbGVhc3Qgb25lIGNvbW1vbiBlbGVtZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheXNJbnRlcnNlY3Q8VD4oYTogQXJyYXk8VD4sIGI6IEFycmF5PFQ+KTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgbCA9IDA7IGwgPCBhLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGlmIChiLmluZGV4T2YoYVtsXSkgPj0gMCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBQcmludCBhIHdhcm5pbmcgbWVzc2FnZSB0byB0aGUgY29uc29sZSBhbmQgZW5zdXJlIGR1cGxpY2F0ZSB3YXJuaW5nIG1lc3NhZ2VzXG4gKiBhcmUgbm90IHByaW50ZWQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgd2Fybk9uY2VIaXN0b3J5OiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5PbmNlKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghd2Fybk9uY2VIaXN0b3J5W21lc3NhZ2VdKSB7XG4gICAgICAgIC8vIGNvbnNvbGUgaXNuJ3QgZGVmaW5lZCBpbiBzb21lIFdlYldvcmtlcnMsIHNlZSAjMjU1OFxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIpIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgd2Fybk9uY2VIaXN0b3J5W21lc3NhZ2VdID0gdHJ1ZTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5kaWNhdGVzIGlmIHRoZSBwcm92aWRlZCBQb2ludHMgYXJlIGluIGEgY291bnRlciBjbG9ja3dpc2UgKHRydWUpIG9yIGNsb2Nrd2lzZSAoZmFsc2UpIG9yZGVyXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHRydWUgZm9yIGEgY291bnRlciBjbG9ja3dpc2Ugc2V0IG9mIHBvaW50c1xuICovXG4vLyBodHRwOi8vYnJ5Y2Vib2UuY29tLzIwMDYvMTAvMjMvbGluZS1zZWdtZW50LWludGVyc2VjdGlvbi1hbGdvcml0aG0vXG5leHBvcnQgZnVuY3Rpb24gaXNDb3VudGVyQ2xvY2t3aXNlKGE6IFBvaW50LCBiOiBQb2ludCwgYzogUG9pbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGMueSAtIGEueSkgKiAoYi54IC0gYS54KSA+IChiLnkgLSBhLnkpICogKGMueCAtIGEueCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2lnbmVkIGFyZWEgZm9yIHRoZSBwb2x5Z29uIHJpbmcuICBQb3N0aXZlIGFyZWFzIGFyZSBleHRlcmlvciByaW5ncyBhbmRcbiAqIGhhdmUgYSBjbG9ja3dpc2Ugd2luZGluZy4gIE5lZ2F0aXZlIGFyZWFzIGFyZSBpbnRlcmlvciByaW5ncyBhbmQgaGF2ZSBhIGNvdW50ZXIgY2xvY2t3aXNlXG4gKiBvcmRlcmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHJpbmcgRXh0ZXJpb3Igb3IgaW50ZXJpb3IgcmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlU2lnbmVkQXJlYShyaW5nOiBBcnJheTxQb2ludD4pOiBudW1iZXIge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDEsIHAxLCBwMjsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICBwMSA9IHJpbmdbaV07XG4gICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgc3VtICs9IChwMi54IC0gcDEueCkgKiAocDEueSArIHAyLnkpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG4vKipcbiAqIERldGVjdHMgY2xvc2VkIHBvbHlnb25zLCBmaXJzdCArIGxhc3QgcG9pbnQgYXJlIGVxdWFsXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBwb2ludHMgYXJyYXkgb2YgcG9pbnRzXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBvaW50cyBhcmUgYSBjbG9zZWQgcG9seWdvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDbG9zZWRQb2x5Z29uKHBvaW50czogQXJyYXk8UG9pbnQ+KTogYm9vbGVhbiB7XG4gICAgLy8gSWYgaXQgaXMgMiBwb2ludHMgdGhhdCBhcmUgdGhlIHNhbWUgdGhlbiBpdCBpcyBhIHBvaW50XG4gICAgLy8gSWYgaXQgaXMgMyBwb2ludHMgd2l0aCBzdGFydCBhbmQgZW5kIHRoZSBzYW1lIHRoZW4gaXQgaXMgYSBsaW5lXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPCA0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBwMSA9IHBvaW50c1swXTtcbiAgICBjb25zdCBwMiA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAoTWF0aC5hYnMocDEueCAtIHAyLngpID4gMCB8fFxuICAgICAgICBNYXRoLmFicyhwMS55IC0gcDIueSkgPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBwb2x5Z29uIHNpbXBsaWZpY2F0aW9uIGNhbiBwcm9kdWNlIHBvbHlnb25zIHdpdGggemVybyBhcmVhIGFuZCBtb3JlIHRoYW4gMyBwb2ludHNcbiAgICByZXR1cm4gTWF0aC5hYnMoY2FsY3VsYXRlU2lnbmVkQXJlYShwb2ludHMpKSA+IDAuMDE7XG59XG5cbi8qIGdsb2JhbCBzZWxmLCBXb3JrZXJHbG9iYWxTY29wZSAqL1xuLyoqXG4gKiAgUmV0dXJucyB0cnVlIGlmIHJ1biBpbiB0aGUgd2ViLXdvcmtlciBjb250ZXh0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV29ya2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGU7XG59XG5cbi8qKlxuICogUGFyc2VzIGRhdGEgZnJvbSAnQ2FjaGUtQ29udHJvbCcgaGVhZGVycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIGNhY2hlQ29udHJvbCBWYWx1ZSBvZiAnQ2FjaGUtQ29udHJvbCcgaGVhZGVyXG4gKiBAcmV0dXJuIG9iamVjdCBjb250YWluaW5nIHBhcnNlZCBoZWFkZXIgaW5mby5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDYWNoZUNvbnRyb2woY2FjaGVDb250cm9sOiBzdHJpbmcpOiBPYmplY3Qge1xuICAgIC8vIFRha2VuIGZyb20gW1dyZWNrXShodHRwczovL2dpdGh1Yi5jb20vaGFwaWpzL3dyZWNrKVxuICAgIGNvbnN0IHJlID0gLyg/Ol58KD86XFxzKlxcLFxccyopKShbXlxceDAwLVxceDIwXFwoXFwpPD5AXFwsO1xcOlxcXFxcIlxcL1xcW1xcXVxcP1xcPVxce1xcfVxceDdGXSspKD86XFw9KD86KFteXFx4MDAtXFx4MjBcXChcXCk8PkBcXCw7XFw6XFxcXFwiXFwvXFxbXFxdXFw/XFw9XFx7XFx9XFx4N0ZdKyl8KD86XFxcIigoPzpbXlwiXFxcXF18XFxcXC4pKilcXFwiKSkpPy9nO1xuXG4gICAgY29uc3QgaGVhZGVyID0ge307XG4gICAgY2FjaGVDb250cm9sLnJlcGxhY2UocmUsICgkMCwgJDEsICQyLCAkMykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9ICQyIHx8ICQzO1xuICAgICAgICBoZWFkZXJbJDFdID0gdmFsdWUgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdHJ1ZTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuXG4gICAgaWYgKGhlYWRlclsnbWF4LWFnZSddKSB7XG4gICAgICAgIGNvbnN0IG1heEFnZSA9IHBhcnNlSW50KGhlYWRlclsnbWF4LWFnZSddLCAxMCk7XG4gICAgICAgIGlmIChpc05hTihtYXhBZ2UpKSBkZWxldGUgaGVhZGVyWydtYXgtYWdlJ107XG4gICAgICAgIGVsc2UgaGVhZGVyWydtYXgtYWdlJ10gPSBtYXhBZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcjtcbn1cblxubGV0IF9pc1NhZmFyaSA9IG51bGw7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gcnVuIGluIFdlYktpdCBkZXJpdmVkIGJyb3dzZXJzLlxuICogVGhpcyBpcyB1c2VkIGFzIGEgd29ya2Fyb3VuZCBmb3IgYSBtZW1vcnkgbGVhayBpbiBTYWZhcmkgY2F1c2VkIGJ5IHVzaW5nIFRyYW5zZmVyYWJsZSBvYmplY3RzIHRvXG4gKiB0cmFuc2ZlciBkYXRhIGJldHdlZW4gV2ViV29ya2VycyBhbmQgdGhlIG1haW4gdGhyZWFkLlxuICogaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzg3NzFcbiAqXG4gKiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgdGhlIHVuZGVybHlpbmcgU2FmYXJpIGlzc3VlIGlzIGZpeGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gc2NvcGUge1dpbmRvd09yV29ya2VyR2xvYmFsU2NvcGV9IFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBib3RoIG9uIHRoZSBtYWluIHRocmVhZCBhbmQgV2ViV29ya2VyIGNvbnRleHQsXG4gKiAgICAgIGxldCB0aGUgY2FsbGluZyBzY29wZSBwYXNzIGluIHRoZSBnbG9iYWwgc2NvcGUgb2JqZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmFyaShzY29wZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKF9pc1NhZmFyaSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHVzZXJBZ2VudCA9IHNjb3BlLm5hdmlnYXRvciA/IHNjb3BlLm5hdmlnYXRvci51c2VyQWdlbnQgOiBudWxsO1xuICAgICAgICBfaXNTYWZhcmkgPSAhIXNjb3BlLnNhZmFyaSB8fFxuICAgICAgICAhISh1c2VyQWdlbnQgJiYgKC9cXGIoaVBhZHxpUGhvbmV8aVBvZClcXGIvLnRlc3QodXNlckFnZW50KSB8fCAoISF1c2VyQWdlbnQubWF0Y2goJ1NhZmFyaScpICYmICF1c2VyQWdlbnQubWF0Y2goJ0Nocm9tZScpKSkpO1xuICAgIH1cbiAgICByZXR1cm4gX2lzU2FmYXJpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RvcmFnZUF2YWlsYWJsZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gd2luZG93W3R5cGVdO1xuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oJ19tYXBib3hfdGVzdF8nLCAxKTtcbiAgICAgICAgc3RvcmFnZS5yZW1vdmVJdGVtKCdfbWFwYm94X3Rlc3RfJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3dCYXNlNjQvQmFzZTY0X2VuY29kaW5nX2FuZF9kZWNvZGluZyNUaGVfVW5pY29kZV9Qcm9ibGVtXG4vL1VuaWNvZGUgY29tcGxpYW50IGJhc2U2NCBlbmNvZGVyIGZvciBzdHJpbmdzXG5leHBvcnQgZnVuY3Rpb24gYjY0RW5jb2RlVW5pY29kZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiB3aW5kb3cuYnRvYShcbiAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZyxcbiAgICAgICAgICAgIChtYXRjaCwgcDEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShOdW1iZXIoJzB4JyArIHAxKSk7IC8vZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgICAgfVxuICAgICAgICApXG4gICAgKTtcbn1cblxuLy8gVW5pY29kZSBjb21wbGlhbnQgZGVjb2RlciBmb3IgYmFzZTY0LWVuY29kZWQgc3RyaW5nc1xuZXhwb3J0IGZ1bmN0aW9uIGI2NERlY29kZVVuaWNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5hdG9iKHN0cikuc3BsaXQoJycpLm1hcCgoYykgPT4ge1xuICAgICAgICByZXR1cm4gJyUnICsgKCcwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7IC8vZXNsaW50LWRpc2FibGUtbGluZVxuICAgIH0pLmpvaW4oJycpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtbihtYXRyaXg6IG1hdDQsIGNvbDogbnVtYmVyKTogdmVjNCB7XG4gICAgcmV0dXJuIFttYXRyaXhbY29sICogNF0sIG1hdHJpeFtjb2wgKiA0ICsgMV0sIG1hdHJpeFtjb2wgKiA0ICsgMl0sIG1hdHJpeFtjb2wgKiA0ICsgM11dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29sdW1uKG1hdHJpeDogbWF0NCwgY29sOiBudW1iZXIsIHZhbHVlczogdmVjNCkge1xuICAgIG1hdHJpeFtjb2wgKiA0ICsgMF0gPSB2YWx1ZXNbMF07XG4gICAgbWF0cml4W2NvbCAqIDQgKyAxXSA9IHZhbHVlc1sxXTtcbiAgICBtYXRyaXhbY29sICogNCArIDJdID0gdmFsdWVzWzJdO1xuICAgIG1hdHJpeFtjb2wgKiA0ICsgM10gPSB2YWx1ZXNbM107XG59XG4iLCIvLyBAZmxvdyBzdHJpY3RcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdy5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZS5qcyc7XG5cbmxldCBsaW5rRWw7XG5cbmxldCByZWR1Y2VkTW90aW9uUXVlcnk6IE1lZGlhUXVlcnlMaXN0O1xuXG5sZXQgc3R1YlRpbWU7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgZXhwb3J0ZWQgPSB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBlaXRoZXIgcGVyZm9ybWFuY2Uubm93KCkgb3IgYSB2YWx1ZSBzZXQgYnkgc2V0Tm93LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRpbWUgdmFsdWUgaW4gbWlsbGlzZWNvbmRzLlxuICAgICAqL1xuICAgIG5vdygpOiBudW1iZXIge1xuICAgICAgICBpZiAoc3R1YlRpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0dWJUaW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgfSxcbiAgICBzZXROb3codGltZTogbnVtYmVyKSB7XG4gICAgICAgIHN0dWJUaW1lID0gdGltZTtcbiAgICB9LFxuXG4gICAgcmVzdG9yZU5vdygpIHtcbiAgICAgICAgc3R1YlRpbWUgPSB1bmRlZmluZWQ7XG4gICAgfSxcblxuICAgIGZyYW1lKGZuOiAocGFpbnRTdGFydFRpbWVzdGFtcDogbnVtYmVyKSA9PiB2b2lkKTogQ2FuY2VsYWJsZSB7XG4gICAgICAgIGNvbnN0IGZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICAgIHJldHVybiB7Y2FuY2VsOiAoKSA9PiB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoZnJhbWUpfTtcbiAgICB9LFxuXG4gICAgZ2V0SW1hZ2VEYXRhKGltZzogQ2FudmFzSW1hZ2VTb3VyY2UsIHBhZGRpbmc/OiBudW1iZXIgPSAwKTogSW1hZ2VEYXRhIHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gY3JlYXRlIGNhbnZhcyAyZCBjb250ZXh0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FudmFzLndpZHRoID0gaW1nLndpZHRoO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcbiAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xuICAgICAgICByZXR1cm4gY29udGV4dC5nZXRJbWFnZURhdGEoLXBhZGRpbmcsIC1wYWRkaW5nLCBpbWcud2lkdGggKyAyICogcGFkZGluZywgaW1nLmhlaWdodCArIDIgKiBwYWRkaW5nKTtcbiAgICB9LFxuXG4gICAgcmVzb2x2ZVVSTChwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFsaW5rRWwpIGxpbmtFbCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGxpbmtFbC5ocmVmID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIGxpbmtFbC5ocmVmO1xuICAgIH0sXG5cbiAgICBnZXQgZGV2aWNlUGl4ZWxSYXRpbygpIHsgcmV0dXJuIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOyB9LFxuICAgIGdldCBwcmVmZXJzUmVkdWNlZE1vdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF3aW5kb3cubWF0Y2hNZWRpYSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBMYXppbHkgaW5pdGlhbGl6ZSBtZWRpYSBxdWVyeS5cbiAgICAgICAgaWYgKHJlZHVjZWRNb3Rpb25RdWVyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZWR1Y2VkTW90aW9uUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVkdWNlZE1vdGlvblF1ZXJ5Lm1hdGNoZXM7XG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV4cG9ydGVkO1xuIiwiLy8gQGZsb3cgc3RyaWN0XG5cbnR5cGUgQ29uZmlnID0ge3xcbiAgQVBJX1VSTDogc3RyaW5nLFxuICBBUElfVVJMX1JFR0VYOiBSZWdFeHAsXG4gIEVWRU5UU19VUkw6ID9zdHJpbmcsXG4gIFNFU1NJT05fUEFUSDogc3RyaW5nLFxuICBGRUVEQkFDS19VUkw6IHN0cmluZyxcbiAgUkVRVUlSRV9BQ0NFU1NfVE9LRU46IGJvb2xlYW4sXG4gIFRJTEVfVVJMX1ZFUlNJT046IHN0cmluZyxcbiAgUkFTVEVSX1VSTF9QUkVGSVg6IHN0cmluZyxcbiAgQUNDRVNTX1RPS0VOOiA/c3RyaW5nLFxuICBNQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFM6IG51bWJlclxufH07XG5cbmxldCBtYXBib3hIVFRQVVJMUmVnZXg7XG5cbmNvbnN0IGNvbmZpZzogQ29uZmlnID0ge1xuICAgIEFQSV9VUkw6ICdodHRwczovL2FwaS5tYXBib3guY29tJyxcbiAgICBnZXQgQVBJX1VSTF9SRUdFWCAoKSB7XG4gICAgICAgIGlmIChtYXBib3hIVFRQVVJMUmVnZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcHJvZE1hcGJveEhUVFBVUkxSZWdleCA9IC9eKChodHRwcz86KT9cXC9cXC8pPyhbXlxcL10rXFwuKT9tYXBib3hcXC5jKG58b20pKFxcL3xcXD98JCkvaTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbWFwYm94SFRUUFVSTFJlZ2V4ID0gKHByb2Nlc3MuZW52LkFQSV9VUkxfUkVHRVggIT0gbnVsbCkgPyBuZXcgUmVnRXhwKHByb2Nlc3MuZW52LkFQSV9VUkxfUkVHRVgpIDogcHJvZE1hcGJveEhUVFBVUkxSZWdleDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBtYXBib3hIVFRQVVJMUmVnZXggPSBwcm9kTWFwYm94SFRUUFVSTFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcGJveEhUVFBVUkxSZWdleDtcbiAgICB9LFxuICAgIGdldCBFVkVOVFNfVVJMKCkge1xuICAgICAgICBpZiAoIXRoaXMuQVBJX1VSTCkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICBpZiAodGhpcy5BUElfVVJMLmluZGV4T2YoJ2h0dHBzOi8vYXBpLm1hcGJveC5jbicpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2h0dHBzOi8vZXZlbnRzLm1hcGJveC5jbi9ldmVudHMvdjInO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuQVBJX1VSTC5pbmRleE9mKCdodHRwczovL2FwaS5tYXBib3guY29tJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnaHR0cHM6Ly9ldmVudHMubWFwYm94LmNvbS9ldmVudHMvdjInO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFNFU1NJT05fUEFUSDogJy9tYXAtc2Vzc2lvbnMvdjEnLFxuICAgIEZFRURCQUNLX1VSTDogJ2h0dHBzOi8vYXBwcy5tYXBib3guY29tL2ZlZWRiYWNrJyxcbiAgICBUSUxFX1VSTF9WRVJTSU9OOiAndjQnLFxuICAgIFJBU1RFUl9VUkxfUFJFRklYOiAncmFzdGVyL3YxJyxcbiAgICBSRVFVSVJFX0FDQ0VTU19UT0tFTjogdHJ1ZSxcbiAgICBBQ0NFU1NfVE9LRU46IG51bGwsXG4gICAgTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTOiAxNlxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29uZmlnO1xuIiwiLy8gQGZsb3cgc3RyaWN0XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cuanMnO1xuXG5jb25zdCBleHBvcnRlZCA9IHtcbiAgICBzdXBwb3J0ZWQ6IGZhbHNlLFxuICAgIHRlc3RTdXBwb3J0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHBvcnRlZDtcblxubGV0IGdsRm9yVGVzdGluZztcbmxldCB3ZWJwQ2hlY2tDb21wbGV0ZSA9IGZhbHNlO1xubGV0IHdlYnBJbWdUZXN0O1xubGV0IHdlYnBJbWdUZXN0T25sb2FkQ29tcGxldGUgPSBmYWxzZTtcblxuaWYgKHdpbmRvdy5kb2N1bWVudCkge1xuICAgIHdlYnBJbWdUZXN0ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgIHdlYnBJbWdUZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZ2xGb3JUZXN0aW5nKSB0ZXN0V2VicFRleHR1cmVVcGxvYWQoZ2xGb3JUZXN0aW5nKTtcbiAgICAgICAgZ2xGb3JUZXN0aW5nID0gbnVsbDtcbiAgICAgICAgd2VicEltZ1Rlc3RPbmxvYWRDb21wbGV0ZSA9IHRydWU7XG4gICAgfTtcbiAgICB3ZWJwSW1nVGVzdC5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdlYnBDaGVja0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgZ2xGb3JUZXN0aW5nID0gbnVsbDtcbiAgICB9O1xuICAgIHdlYnBJbWdUZXN0LnNyYyA9ICdkYXRhOmltYWdlL3dlYnA7YmFzZTY0LFVrbEdSaDRBQUFCWFJVSlFWbEE0VEJFQUFBQXZBUUFBQUFmUS8vNzN2LytCaU9oL0FBQT0nO1xufVxuXG5mdW5jdGlvbiB0ZXN0U3VwcG9ydChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgaWYgKHdlYnBDaGVja0NvbXBsZXRlIHx8ICF3ZWJwSW1nVGVzdCkgcmV0dXJuO1xuXG4gICAgLy8gSFRNTEltYWdlRWxlbWVudC5jb21wbGV0ZSBpcyBzZXQgd2hlbiBhbiBpbWFnZSBpcyBkb25lIGxvYWRpbmcgaXQncyBzb3VyY2VcbiAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90LlxuICAgIC8vIEl0J3MgcG9zc2libGUgZm9yIGFuIGVycm9yIHRvIHNldCBIVE1MSW1hZ2VFbGVtZW50LmNvbXBsZXRlIHRvIHRydWUgd2hpY2ggd291bGQgdHJpZ2dlclxuICAgIC8vIHRlc3RXZWJwVGV4dHVyZVVwbG9hZCBhbmQgbWlzdGFrZW5seSBzZXQgZXhwb3J0ZWQuc3VwcG9ydGVkIHRvIHRydWUgaW4gYnJvd3NlcnMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB3ZWJwXG4gICAgLy8gVG8gYXZvaWQgdGhpcywgd2Ugc2V0IGEgZmxhZyBpbiB0aGUgaW1hZ2UncyBvbmxvYWQgaGFuZGxlciBhbmQgb25seSBjYWxsIHRlc3RXZWJwVGV4dHVyZVVwbG9hZFxuICAgIC8vIGFmdGVyIGEgc3VjY2Vzc2Z1bCBpbWFnZSBsb2FkIGV2ZW50LlxuICAgIGlmICh3ZWJwSW1nVGVzdE9ubG9hZENvbXBsZXRlKSB7XG4gICAgICAgIHRlc3RXZWJwVGV4dHVyZVVwbG9hZChnbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2xGb3JUZXN0aW5nID0gZ2w7XG5cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RXZWJwVGV4dHVyZVVwbG9hZChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgLy8gRWRnZSAxOCBzdXBwb3J0cyBXZWJQIGJ1dCBub3QgdXBsb2FkaW5nIGEgV2ViUCBpbWFnZSB0byBhIGdsIHRleHR1cmVcbiAgICAvLyBUZXN0IHN1cHBvcnQgZm9yIHRoaXMgYmVmb3JlIGFsbG93aW5nIFdlYlAgaW1hZ2VzLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy83NjcxXG4gICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgd2VicEltZ1Rlc3QpO1xuXG4gICAgICAgIC8vIFRoZSBlcnJvciBkb2VzIG5vdCBnZXQgdHJpZ2dlcmVkIGluIEVkZ2UgaWYgdGhlIGNvbnRleHQgaXMgbG9zdFxuICAgICAgICBpZiAoZ2wuaXNDb250ZXh0TG9zdCgpKSByZXR1cm47XG5cbiAgICAgICAgZXhwb3J0ZWQuc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIENhdGNoIFwiVW5zcGVjaWZpZWQgRXJyb3IuXCIgaW4gRWRnZSAxOC5cbiAgICB9XG5cbiAgICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpO1xuXG4gICAgd2VicENoZWNrQ29tcGxldGUgPSB0cnVlO1xufVxuIiwiLy8gQGZsb3dcblxuLyoqKioqIFNUQVJUIFdBUk5JTkcgUkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhFXG4qIEZPTExPV0lORyBDT0RFIFZJT0xBVEVTIFRIRSBNQVBCT1ggVEVSTVMgT0YgU0VSVklDRSAgKioqKioqXG4qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB1c2VkIHRvIGFjY2VzcyBNYXBib3gncyBBUElzLiBSZW1vdmFsIG9yIG1vZGlmaWNhdGlvblxuKiBvZiB0aGlzIGNvZGUgY2FuIHJlc3VsdCBpbiBoaWdoZXIgZmVlcyBhbmQvb3JcbiogdGVybWluYXRpb24gb2YgeW91ciBhY2NvdW50IHdpdGggTWFwYm94LlxuKlxuKiBVbmRlciB0aGUgTWFwYm94IFRlcm1zIG9mIFNlcnZpY2UsIHlvdSBtYXkgbm90IHVzZSB0aGlzIGNvZGUgdG8gYWNjZXNzIE1hcGJveFxuKiBNYXBwaW5nIEFQSXMgb3RoZXIgdGhhbiB0aHJvdWdoIE1hcGJveCBTREtzLlxuKlxuKiBUaGUgTWFwcGluZyBBUElzIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2FwaS9tYXBzLyNtYXBzXG4qIGFuZCB0aGUgTWFwYm94IFRlcm1zIG9mIFNlcnZpY2UgYXJlIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5tYXBib3guY29tL3Rvcy9cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxudHlwZSBTa3VUb2tlbk9iamVjdCA9IHt8XG4gICAgdG9rZW46IHN0cmluZyxcbiAgICB0b2tlbkV4cGlyZXNBdDogbnVtYmVyXG58fTtcblxuY29uc3QgU0tVX0lEID0gJzAxJztcblxuZnVuY3Rpb24gY3JlYXRlU2t1VG9rZW4oKTogU2t1VG9rZW5PYmplY3Qge1xuICAgIC8vIFNLVV9JRCBhbmQgVE9LRU5fVkVSU0lPTiBhcmUgc3BlY2lmaWVkIGJ5IGFuIGludGVybmFsIHNjaGVtYSBhbmQgc2hvdWxkIG5vdCBjaGFuZ2VcbiAgICBjb25zdCBUT0tFTl9WRVJTSU9OID0gJzEnO1xuICAgIGNvbnN0IGJhc2U2MmNoYXJzID0gJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJztcbiAgICAvLyBzZXNzaW9uUmFuZG9taXplciBpcyBhIHJhbmRvbWl6ZWQgMTAtZGlnaXQgYmFzZS02MiBudW1iZXJcbiAgICBsZXQgc2Vzc2lvblJhbmRvbWl6ZXIgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgc2Vzc2lvblJhbmRvbWl6ZXIgKz0gYmFzZTYyY2hhcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNjIpXTtcbiAgICB9XG4gICAgY29uc3QgZXhwaXJhdGlvbiA9IDEyICogNjAgKiA2MCAqIDEwMDA7IC8vIDEyIGhvdXJzXG4gICAgY29uc3QgdG9rZW4gPSBbVE9LRU5fVkVSU0lPTiwgU0tVX0lELCBzZXNzaW9uUmFuZG9taXplcl0uam9pbignJyk7XG4gICAgY29uc3QgdG9rZW5FeHBpcmVzQXQgPSBEYXRlLm5vdygpICsgZXhwaXJhdGlvbjtcblxuICAgIHJldHVybiB7dG9rZW4sIHRva2VuRXhwaXJlc0F0fTtcbn1cblxuZXhwb3J0IHtjcmVhdGVTa3VUb2tlbiwgU0tVX0lEfTtcblxuLyoqKioqIEVORCBXQVJOSU5HIC0gUkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhFXG5QUkVDRURJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKi9cbiIsIi8vIEBmbG93XG5cbi8qKioqKiBTVEFSVCBXQVJOSU5HIFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRIRVxuKiBGT0xMT1dJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKlxuKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCB0byBhY2Nlc3MgTWFwYm94J3MgQVBJcy4gUmVtb3ZhbCBvciBtb2RpZmljYXRpb25cbiogb2YgdGhpcyBjb2RlIGNhbiByZXN1bHQgaW4gaGlnaGVyIGZlZXMgYW5kL29yXG4qIHRlcm1pbmF0aW9uIG9mIHlvdXIgYWNjb3VudCB3aXRoIE1hcGJveC5cbipcbiogVW5kZXIgdGhlIE1hcGJveCBUZXJtcyBvZiBTZXJ2aWNlLCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBjb2RlIHRvIGFjY2VzcyBNYXBib3hcbiogTWFwcGluZyBBUElzIG90aGVyIHRoYW4gdGhyb3VnaCBNYXBib3ggU0RLcy5cbipcbiogVGhlIE1hcHBpbmcgQVBJcyBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL2RvY3MubWFwYm94LmNvbS9hcGkvbWFwcy8jbWFwc1xuKiBhbmQgdGhlIE1hcGJveCBUZXJtcyBvZiBTZXJ2aWNlIGFyZSBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubWFwYm94LmNvbS90b3MvXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdy5qcyc7XG5pbXBvcnQgd2VicFN1cHBvcnRlZCBmcm9tICcuL3dlYnBfc3VwcG9ydGVkLmpzJztcbmltcG9ydCB7Y3JlYXRlU2t1VG9rZW4sIFNLVV9JRH0gZnJvbSAnLi9za3VfdG9rZW4uanMnO1xuaW1wb3J0IHt2ZXJzaW9uIGFzIHNka1ZlcnNpb259IGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQge3V1aWQsIHZhbGlkYXRlVXVpZCwgc3RvcmFnZUF2YWlsYWJsZSwgYjY0RGVjb2RlVW5pY29kZSwgYjY0RW5jb2RlVW5pY29kZSwgd2Fybk9uY2UsIGV4dGVuZH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7cG9zdERhdGEsIFJlc291cmNlVHlwZSwgZ2V0RGF0YX0gZnJvbSAnLi9hamF4LmpzJztcblxuaW1wb3J0IHR5cGUge1JlcXVlc3RQYXJhbWV0ZXJzfSBmcm9tICcuL2FqYXguanMnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVKU09OfSBmcm9tICcuLi90eXBlcy90aWxlanNvbi5qcyc7XG5cbnR5cGUgUmVzb3VyY2VUeXBlRW51bSA9ICRLZXlzPHR5cGVvZiBSZXNvdXJjZVR5cGU+O1xuZXhwb3J0IHR5cGUgUmVxdWVzdFRyYW5zZm9ybUZ1bmN0aW9uID0gKHVybDogc3RyaW5nLCByZXNvdXJjZVR5cGU/OiBSZXNvdXJjZVR5cGVFbnVtKSA9PiBSZXF1ZXN0UGFyYW1ldGVycztcblxudHlwZSBVcmxPYmplY3QgPSB7fFxuICAgIHByb3RvY29sOiBzdHJpbmcsXG4gICAgYXV0aG9yaXR5OiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHBhcmFtczogQXJyYXk8c3RyaW5nPlxufH07XG5cbmV4cG9ydCBjb25zdCBBVVRIX0VSUl9NU0c6IHN0cmluZyA9ICdOT19BQ0NFU1NfVE9LRU4nO1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdE1hbmFnZXIge1xuICAgIF9za3VUb2tlbjogc3RyaW5nO1xuICAgIF9za3VUb2tlbkV4cGlyZXNBdDogbnVtYmVyO1xuICAgIF90cmFuc2Zvcm1SZXF1ZXN0Rm46ID9SZXF1ZXN0VHJhbnNmb3JtRnVuY3Rpb247XG4gICAgX2N1c3RvbUFjY2Vzc1Rva2VuOiA/c3RyaW5nO1xuICAgIF9zaWxlbmNlQXV0aEVycm9yczogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHRyYW5zZm9ybVJlcXVlc3RGbj86IFJlcXVlc3RUcmFuc2Zvcm1GdW5jdGlvbiwgY3VzdG9tQWNjZXNzVG9rZW4/OiBzdHJpbmcsIHNpbGVuY2VBdXRoRXJyb3JzOiA/Ym9vbGVhbikge1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm1SZXF1ZXN0Rm4gPSB0cmFuc2Zvcm1SZXF1ZXN0Rm47XG4gICAgICAgIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuID0gY3VzdG9tQWNjZXNzVG9rZW47XG4gICAgICAgIHRoaXMuX3NpbGVuY2VBdXRoRXJyb3JzID0gISFzaWxlbmNlQXV0aEVycm9ycztcbiAgICAgICAgdGhpcy5fY3JlYXRlU2t1VG9rZW4oKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlU2t1VG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHNrdVRva2VuID0gY3JlYXRlU2t1VG9rZW4oKTtcbiAgICAgICAgdGhpcy5fc2t1VG9rZW4gPSBza3VUb2tlbi50b2tlbjtcbiAgICAgICAgdGhpcy5fc2t1VG9rZW5FeHBpcmVzQXQgPSBza3VUb2tlbi50b2tlbkV4cGlyZXNBdDtcbiAgICB9XG5cbiAgICBfaXNTa3VUb2tlbkV4cGlyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpID4gdGhpcy5fc2t1VG9rZW5FeHBpcmVzQXQ7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtUmVxdWVzdCh1cmw6IHN0cmluZywgdHlwZTogUmVzb3VyY2VUeXBlRW51bSkge1xuICAgICAgICBpZiAodGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuKHVybCwgdHlwZSkgfHwge3VybH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge3VybH07XG4gICAgfVxuXG4gICAgbm9ybWFsaXplU3R5bGVVUkwodXJsOiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSByZXR1cm4gdXJsO1xuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvc3R5bGVzL3YxJHt1cmxPYmplY3QucGF0aH1gO1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUFQSVVSTCh1cmxPYmplY3QsIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IGFjY2Vzc1Rva2VuKTtcbiAgICB9XG5cbiAgICBub3JtYWxpemVHbHlwaHNVUkwodXJsOiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSByZXR1cm4gdXJsO1xuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvZm9udHMvdjEke3VybE9iamVjdC5wYXRofWA7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWtlQVBJVVJMKHVybE9iamVjdCwgdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgYWNjZXNzVG9rZW4pO1xuICAgIH1cblxuICAgIG5vcm1hbGl6ZVNvdXJjZVVSTCh1cmw6IHN0cmluZywgYWNjZXNzVG9rZW4/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWlzTWFwYm94VVJMKHVybCkpIHJldHVybiB1cmw7XG4gICAgICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlVXJsKHVybCk7XG4gICAgICAgIHVybE9iamVjdC5wYXRoID0gYC92NC8ke3VybE9iamVjdC5hdXRob3JpdHl9Lmpzb25gO1xuICAgICAgICAvLyBUaWxlSlNPTiByZXF1ZXN0cyBuZWVkIGEgc2VjdXJlIGZsYWcgYXBwZW5kZWQgdG8gdGhlaXIgVVJMcyBzb1xuICAgICAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIga25vd3MgdG8gc2VuZCBTU0wtaWZpZWQgcmVzb3VyY2UgcmVmZXJlbmNlcy5cbiAgICAgICAgdXJsT2JqZWN0LnBhcmFtcy5wdXNoKCdzZWN1cmUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VBUElVUkwodXJsT2JqZWN0LCB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbik7XG4gICAgfVxuXG4gICAgbm9ybWFsaXplU3ByaXRlVVJMKHVybDogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodXJsKTtcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSB7XG4gICAgICAgICAgICB1cmxPYmplY3QucGF0aCArPSBgJHtmb3JtYXR9JHtleHRlbnNpb259YDtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRVcmwodXJsT2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvc3R5bGVzL3YxJHt1cmxPYmplY3QucGF0aH0vc3ByaXRlJHtmb3JtYXR9JHtleHRlbnNpb259YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VBUElVUkwodXJsT2JqZWN0LCB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbiB8fCBhY2Nlc3NUb2tlbik7XG4gICAgfVxuXG4gICAgbm9ybWFsaXplVGlsZVVSTCh0aWxlVVJMOiBzdHJpbmcsIHVzZTJ4PzogYm9vbGVhbiwgcmFzdGVyVGlsZVNpemU/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5faXNTa3VUb2tlbkV4cGlyZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlU2t1VG9rZW4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aWxlVVJMICYmICFpc01hcGJveFVSTCh0aWxlVVJMKSkgcmV0dXJuIHRpbGVVUkw7XG5cbiAgICAgICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodGlsZVVSTCk7XG4gICAgICAgIGNvbnN0IGltYWdlRXh0ZW5zaW9uUmUgPSAvKFxcLihwbmd8anBnKVxcZCopKD89JCkvO1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSB3ZWJwU3VwcG9ydGVkLnN1cHBvcnRlZCA/ICcud2VicCcgOiAnJDEnO1xuXG4gICAgICAgIC8vIFRoZSB2NCBtYXBib3ggdGlsZSBBUEkgc3VwcG9ydHMgNTEyeDUxMiBpbWFnZSB0aWxlcyBidXQgdGhleSBtdXN0IGJlIHJlcXVlc3RlZCBhcyAnQDJ4JyB0aWxlcy5cbiAgICAgICAgY29uc3QgdXNlMnhBczUxMiA9IHJhc3RlclRpbGVTaXplICYmIHVybE9iamVjdC5hdXRob3JpdHkgIT09ICdyYXN0ZXInICYmIHJhc3RlclRpbGVTaXplID09PSA1MTI7XG5cbiAgICAgICAgY29uc3Qgc3VmZml4ID0gdXNlMnggfHwgdXNlMnhBczUxMiA/ICdAMngnIDogJyc7XG4gICAgICAgIHVybE9iamVjdC5wYXRoID0gdXJsT2JqZWN0LnBhdGgucmVwbGFjZShpbWFnZUV4dGVuc2lvblJlLCBgJHtzdWZmaXh9JHtleHRlbnNpb259YCk7XG5cbiAgICAgICAgaWYgKHVybE9iamVjdC5hdXRob3JpdHkgPT09ICdyYXN0ZXInKSB7XG4gICAgICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvJHtjb25maWcuUkFTVEVSX1VSTF9QUkVGSVh9JHt1cmxPYmplY3QucGF0aH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGlsZVVSTEFQSVByZWZpeFJlID0gL14uK1xcL3Y0XFwvLztcbiAgICAgICAgICAgIHVybE9iamVjdC5wYXRoID0gdXJsT2JqZWN0LnBhdGgucmVwbGFjZSh0aWxlVVJMQVBJUHJlZml4UmUsICcvJyk7XG4gICAgICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvJHtjb25maWcuVElMRV9VUkxfVkVSU0lPTn0ke3VybE9iamVjdC5wYXRofWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IGdldEFjY2Vzc1Rva2VuKHVybE9iamVjdC5wYXJhbXMpIHx8IGNvbmZpZy5BQ0NFU1NfVE9LRU47XG4gICAgICAgIGlmIChjb25maWcuUkVRVUlSRV9BQ0NFU1NfVE9LRU4gJiYgYWNjZXNzVG9rZW4gJiYgdGhpcy5fc2t1VG9rZW4pIHtcbiAgICAgICAgICAgIHVybE9iamVjdC5wYXJhbXMucHVzaChgc2t1PSR7dGhpcy5fc2t1VG9rZW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUFQSVVSTCh1cmxPYmplY3QsIGFjY2Vzc1Rva2VuKTtcbiAgICB9XG5cbiAgICBjYW5vbmljYWxpemVUaWxlVVJMKHVybDogc3RyaW5nLCByZW1vdmVBY2Nlc3NUb2tlbjogYm9vbGVhbikge1xuICAgICAgICAvLyBtYXRjaGVzIGFueSBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgYnkgYSBkb3QgYW5kIG9uZSBvciBtb3JlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvblJlID0gL1xcLltcXHddKyQvO1xuXG4gICAgICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlVXJsKHVybCk7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGggYSB2YWxpZCBNYXBib3ggdGlsZSBVUkwuXG4gICAgICAgIC8vIEhhcyB0byBiZWdpbiB3aXRoIC92NC8gb3IgL3Jhc3Rlci92MSwgd2l0aCBhIHZhbGlkIGZpbGVuYW1lICsgZXh0ZW5zaW9uXG4gICAgICAgIGlmICghdXJsT2JqZWN0LnBhdGgubWF0Y2goL14oXFwvdjRcXC98XFwvcmFzdGVyXFwvdjFcXC8pLykgfHwgIXVybE9iamVjdC5wYXRoLm1hdGNoKGV4dGVuc2lvblJlKSkge1xuICAgICAgICAgICAgLy8gTm90IGEgcHJvcGVyIE1hcGJveCB0aWxlIFVSTC5cbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVhc3NlbWJsZSB0aGUgY2Fub25pY2FsIFVSTCBmcm9tIHRoZSBwYXJ0cyB3ZSd2ZSBwYXJzZWQgYmVmb3JlLlxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJtYXBib3g6Ly9cIjtcbiAgICAgICAgaWYgKHVybE9iamVjdC5wYXRoLm1hdGNoKC9eXFwvcmFzdGVyXFwvdjFcXC8vKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHRpbGUgdXJsIGhhcyAvcmFzdGVyL3YxLywgbWFrZSB0aGUgZmluYWwgVVJMIG1hcGJveDovL3Jhc3Rlci8uLi4uXG4gICAgICAgICAgICBjb25zdCByYXN0ZXJQcmVmaXggPSBgLyR7Y29uZmlnLlJBU1RFUl9VUkxfUFJFRklYfS9gO1xuICAgICAgICAgICAgcmVzdWx0ICs9IGByYXN0ZXIvJHt1cmxPYmplY3QucGF0aC5yZXBsYWNlKHJhc3RlclByZWZpeCwgJycpfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlc1ByZWZpeCA9IGAvJHtjb25maWcuVElMRV9VUkxfVkVSU0lPTn0vYDtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgdGlsZXMvJHt1cmxPYmplY3QucGF0aC5yZXBsYWNlKHRpbGVzUHJlZml4LCAnJyl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgcXVlcnkgc3RyaW5nLCBtaW51cyB0aGUgYWNjZXNzIHRva2VuIHBhcmFtZXRlci5cbiAgICAgICAgbGV0IHBhcmFtcyA9IHVybE9iamVjdC5wYXJhbXM7XG4gICAgICAgIGlmIChyZW1vdmVBY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmZpbHRlcihwID0+ICFwLm1hdGNoKC9eYWNjZXNzX3Rva2VuPS8pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCkgcmVzdWx0ICs9IGA/JHtwYXJhbXMuam9pbignJicpfWA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY2Fub25pY2FsaXplVGlsZXNldCh0aWxlSlNPTjogVGlsZUpTT04sIHNvdXJjZVVSTD86IHN0cmluZykge1xuICAgICAgICBjb25zdCByZW1vdmVBY2Nlc3NUb2tlbiA9IHNvdXJjZVVSTCA/IGlzTWFwYm94VVJMKHNvdXJjZVVSTCkgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgY2Fub25pY2FsID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdXJsIG9mIHRpbGVKU09OLnRpbGVzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoaXNNYXBib3hIVFRQVVJMKHVybCkpIHtcbiAgICAgICAgICAgICAgICBjYW5vbmljYWwucHVzaCh0aGlzLmNhbm9uaWNhbGl6ZVRpbGVVUkwodXJsLCByZW1vdmVBY2Nlc3NUb2tlbikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYW5vbmljYWwucHVzaCh1cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYW5vbmljYWw7XG4gICAgfVxuXG4gICAgX21ha2VBUElVUkwodXJsT2JqZWN0OiBVcmxPYmplY3QsIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCBudWxsIHwgdm9pZCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGhlbHAgPSAnU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vYXBpLWRvY3VtZW50YXRpb24vI2FjY2Vzcy10b2tlbnMtYW5kLXRva2VuLXNjb3Blcyc7XG4gICAgICAgIGNvbnN0IGFwaVVybE9iamVjdCA9IHBhcnNlVXJsKGNvbmZpZy5BUElfVVJMKTtcbiAgICAgICAgdXJsT2JqZWN0LnByb3RvY29sID0gYXBpVXJsT2JqZWN0LnByb3RvY29sO1xuICAgICAgICB1cmxPYmplY3QuYXV0aG9yaXR5ID0gYXBpVXJsT2JqZWN0LmF1dGhvcml0eTtcblxuICAgICAgICBpZiAodXJsT2JqZWN0LnByb3RvY29sID09PSAnaHR0cCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSB1cmxPYmplY3QucGFyYW1zLmluZGV4T2YoJ3NlY3VyZScpO1xuICAgICAgICAgICAgaWYgKGkgPj0gMCkgdXJsT2JqZWN0LnBhcmFtcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXBpVXJsT2JqZWN0LnBhdGggIT09ICcvJykge1xuICAgICAgICAgICAgdXJsT2JqZWN0LnBhdGggPSBgJHthcGlVcmxPYmplY3QucGF0aH0ke3VybE9iamVjdC5wYXRofWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTikgcmV0dXJuIGZvcm1hdFVybCh1cmxPYmplY3QpO1xuXG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW4gfHwgY29uZmlnLkFDQ0VTU19UT0tFTjtcbiAgICAgICAgaWYgKCF0aGlzLl9zaWxlbmNlQXV0aEVycm9ycykge1xuICAgICAgICAgICAgaWYgKCFhY2Nlc3NUb2tlbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuIEFQSSBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQgdG8gdXNlIE1hcGJveCBHTC4gJHtoZWxwfWApO1xuICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuWzBdID09PSAncycpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVc2UgYSBwdWJsaWMgYWNjZXNzIHRva2VuIChway4qKSB3aXRoIE1hcGJveCBHTCwgbm90IGEgc2VjcmV0IGFjY2VzcyB0b2tlbiAoc2suKikuICR7aGVscH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVybE9iamVjdC5wYXJhbXMgPSB1cmxPYmplY3QucGFyYW1zLmZpbHRlcigoZCkgPT4gZC5pbmRleE9mKCdhY2Nlc3NfdG9rZW4nKSA9PT0gLTEpO1xuICAgICAgICB1cmxPYmplY3QucGFyYW1zLnB1c2goYGFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VuIHx8ICcnfWApO1xuICAgICAgICByZXR1cm4gZm9ybWF0VXJsKHVybE9iamVjdCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc01hcGJveFVSTCh1cmw6IHN0cmluZykge1xuICAgIHJldHVybiB1cmwuaW5kZXhPZignbWFwYm94OicpID09PSAwO1xufVxuXG5mdW5jdGlvbiBpc01hcGJveEhUVFBVUkwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29uZmlnLkFQSV9VUkxfUkVHRVgudGVzdCh1cmwpO1xufVxuXG5mdW5jdGlvbiBoYXNDYWNoZURlZmVhdGluZ1NrdSh1cmw6IHN0cmluZykge1xuICAgIHJldHVybiB1cmwuaW5kZXhPZignc2t1PScpID4gMCAmJiBpc01hcGJveEhUVFBVUkwodXJsKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4ocGFyYW1zOiBBcnJheTxzdHJpbmc+KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBwYXJhbS5tYXRjaCgvXmFjY2Vzc190b2tlbj0oLiopJC8pO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgdXJsUmUgPSAvXihcXHcrKTpcXC9cXC8oW14vP10qKShcXC9bXj9dKyk/XFw/PyguKyk/LztcblxuZnVuY3Rpb24gcGFyc2VVcmwodXJsOiBzdHJpbmcpOiBVcmxPYmplY3Qge1xuICAgIGNvbnN0IHBhcnRzID0gdXJsLm1hdGNoKHVybFJlKTtcbiAgICBpZiAoIXBhcnRzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIFVSTCBvYmplY3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvdG9jb2w6IHBhcnRzWzFdLFxuICAgICAgICBhdXRob3JpdHk6IHBhcnRzWzJdLFxuICAgICAgICBwYXRoOiBwYXJ0c1szXSB8fCAnLycsXG4gICAgICAgIHBhcmFtczogcGFydHNbNF0gPyBwYXJ0c1s0XS5zcGxpdCgnJicpIDogW11cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRVcmwob2JqOiBVcmxPYmplY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtcyA9IG9iai5wYXJhbXMubGVuZ3RoID8gYD8ke29iai5wYXJhbXMuam9pbignJicpfWAgOiAnJztcbiAgICByZXR1cm4gYCR7b2JqLnByb3RvY29sfTovLyR7b2JqLmF1dGhvcml0eX0ke29iai5wYXRofSR7cGFyYW1zfWA7XG59XG5cbmV4cG9ydCB7aXNNYXBib3hVUkwsIGlzTWFwYm94SFRUUFVSTCwgaGFzQ2FjaGVEZWZlYXRpbmdTa3V9O1xuXG5jb25zdCB0ZWxlbUV2ZW50S2V5ID0gJ21hcGJveC5ldmVudERhdGEnO1xuXG5mdW5jdGlvbiBwYXJzZUFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuOiA/c3RyaW5nKSB7XG4gICAgaWYgKCFhY2Nlc3NUb2tlbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0cyA9IGFjY2Vzc1Rva2VuLnNwbGl0KCcuJyk7XG4gICAgaWYgKCFwYXJ0cyB8fCBwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGI2NERlY29kZVVuaWNvZGUocGFydHNbMV0pKTtcbiAgICAgICAgcmV0dXJuIGpzb25EYXRhO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG50eXBlIFRlbGVtZXRyeUV2ZW50VHlwZSA9ICdhcHBVc2VyVHVybnN0aWxlJyB8ICdtYXAubG9hZCcgfCAnbWFwLmF1dGgnO1xuXG5jbGFzcyBUZWxlbWV0cnlFdmVudCB7XG4gICAgZXZlbnREYXRhOiBhbnk7XG4gICAgYW5vbklkOiA/c3RyaW5nO1xuICAgIHF1ZXVlOiBBcnJheTxhbnk+O1xuICAgIHR5cGU6IFRlbGVtZXRyeUV2ZW50VHlwZTtcbiAgICBwZW5kaW5nUmVxdWVzdDogP0NhbmNlbGFibGU7XG4gICAgX2N1c3RvbUFjY2Vzc1Rva2VuOiA/c3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVGVsZW1ldHJ5RXZlbnRUeXBlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYW5vbklkID0gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudERhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRTdG9yYWdlS2V5KGRvbWFpbjogP3N0cmluZykge1xuICAgICAgICBjb25zdCB0b2tlbkRhdGEgPSBwYXJzZUFjY2Vzc1Rva2VuKGNvbmZpZy5BQ0NFU1NfVE9LRU4pO1xuICAgICAgICBsZXQgdSA9ICcnO1xuICAgICAgICBpZiAodG9rZW5EYXRhICYmIHRva2VuRGF0YVsndSddKSB7XG4gICAgICAgICAgICB1ID0gYjY0RW5jb2RlVW5pY29kZSh0b2tlbkRhdGFbJ3UnXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1ID0gY29uZmlnLkFDQ0VTU19UT0tFTiB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG9tYWluID9cbiAgICAgICAgICAgIGAke3RlbGVtRXZlbnRLZXl9LiR7ZG9tYWlufToke3V9YCA6XG4gICAgICAgICAgICBgJHt0ZWxlbUV2ZW50S2V5fToke3V9YDtcbiAgICB9XG5cbiAgICBmZXRjaEV2ZW50RGF0YSgpIHtcbiAgICAgICAgY29uc3QgaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUgPSBzdG9yYWdlQXZhaWxhYmxlKCdsb2NhbFN0b3JhZ2UnKTtcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleSA9IHRoaXMuZ2V0U3RvcmFnZUtleSgpO1xuICAgICAgICBjb25zdCB1dWlkS2V5ID0gdGhpcy5nZXRTdG9yYWdlS2V5KCd1dWlkJyk7XG5cbiAgICAgICAgaWYgKGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAvL1JldHJpZXZlIGNhY2hlZCBkYXRhXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oc3RvcmFnZUtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudERhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odXVpZEtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHV1aWQpIHRoaXMuYW5vbklkID0gdXVpZDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZSgnVW5hYmxlIHRvIHJlYWQgZnJvbSBMb2NhbFN0b3JhZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNhdmVFdmVudERhdGEoKSB7XG4gICAgICAgIGNvbnN0IGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlID0gc3RvcmFnZUF2YWlsYWJsZSgnbG9jYWxTdG9yYWdlJyk7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSAgdGhpcy5nZXRTdG9yYWdlS2V5KCk7XG4gICAgICAgIGNvbnN0IHV1aWRLZXkgPSB0aGlzLmdldFN0b3JhZ2VLZXkoJ3V1aWQnKTtcbiAgICAgICAgaWYgKGlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh1dWlkS2V5LCB0aGlzLmFub25JZCk7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZXZlbnREYXRhKS5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkodGhpcy5ldmVudERhdGEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoJ1VuYWJsZSB0byB3cml0ZSB0byBMb2NhbFN0b3JhZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJvY2Vzc1JlcXVlc3RzKF86ID9zdHJpbmcpIHt9XG5cbiAgICAvKlxuICAgICogSWYgYW55IGV2ZW50IGRhdGEgc2hvdWxkIGJlIHBlcnNpc3RlZCBhZnRlciB0aGUgUE9TVCByZXF1ZXN0LCB0aGUgY2FsbGJhY2sgc2hvdWxkIG1vZGlmeSBldmVudERhdGFgXG4gICAgKiB0byB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIHNhdmVkLiBGb3IgdGhpcyByZWFzb24sIHRoZSBjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZCBwcmlvciB0byB0aGUgY2FsbFxuICAgICogdG8gVGVsZW1ldHJ5RXZlbnQjc2F2ZURhdGFcbiAgICAqL1xuICAgIHBvc3RFdmVudCh0aW1lc3RhbXA6IG51bWJlciwgYWRkaXRpb25hbFBheWxvYWQ6IHtbXzogc3RyaW5nXTogYW55fSwgY2FsbGJhY2s6IChlcnI6ID9FcnJvcikgPT4gdm9pZCwgY3VzdG9tQWNjZXNzVG9rZW4/OiA/c3RyaW5nKSB7XG4gICAgICAgIGlmICghY29uZmlnLkVWRU5UU19VUkwpIHJldHVybjtcbiAgICAgICAgY29uc3QgZXZlbnRzVXJsT2JqZWN0OiBVcmxPYmplY3QgPSBwYXJzZVVybChjb25maWcuRVZFTlRTX1VSTCk7XG4gICAgICAgIGV2ZW50c1VybE9iamVjdC5wYXJhbXMucHVzaChgYWNjZXNzX3Rva2VuPSR7Y3VzdG9tQWNjZXNzVG9rZW4gfHwgY29uZmlnLkFDQ0VTU19UT0tFTiB8fCAnJ31gKTtcblxuICAgICAgICBjb25zdCBwYXlsb2FkOiBPYmplY3QgPSB7XG4gICAgICAgICAgICBldmVudDogdGhpcy50eXBlLFxuICAgICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUodGltZXN0YW1wKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgc2RrSWRlbnRpZmllcjogJ21hcGJveC1nbC1qcycsXG4gICAgICAgICAgICBzZGtWZXJzaW9uLFxuICAgICAgICAgICAgc2t1SWQ6IFNLVV9JRCxcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy5hbm9uSWRcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmaW5hbFBheWxvYWQgPSBhZGRpdGlvbmFsUGF5bG9hZCA/IGV4dGVuZChwYXlsb2FkLCBhZGRpdGlvbmFsUGF5bG9hZCkgOiBwYXlsb2FkO1xuICAgICAgICBjb25zdCByZXF1ZXN0OiBSZXF1ZXN0UGFyYW1ldGVycyA9IHtcbiAgICAgICAgICAgIHVybDogZm9ybWF0VXJsKGV2ZW50c1VybE9iamVjdCksXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJyAvL1NraXAgdGhlIHByZS1mbGlnaHQgT1BUSU9OUyByZXF1ZXN0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoW2ZpbmFsUGF5bG9hZF0pXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IHBvc3REYXRhKHJlcXVlc3QsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgICB0aGlzLnNhdmVFdmVudERhdGEoKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RzKGN1c3RvbUFjY2Vzc1Rva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcXVldWVSZXF1ZXN0KGV2ZW50OiBudW1iZXIgfCB7aWQ6IG51bWJlciwgdGltZXN0YW1wOiBudW1iZXJ9LCBjdXN0b21BY2Nlc3NUb2tlbj86ID9zdHJpbmcpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKGV2ZW50KTtcbiAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdHMoY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hcExvYWRFdmVudCBleHRlbmRzIFRlbGVtZXRyeUV2ZW50IHtcbiAgICArc3VjY2Vzczoge1tfOiBudW1iZXJdOiBib29sZWFufTtcbiAgICBza3VUb2tlbjogc3RyaW5nO1xuICAgIGVycm9yQ2I6IChlcnI6ID9FcnJvcikgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignbWFwLmxvYWQnKTtcbiAgICAgICAgdGhpcy5zdWNjZXNzID0ge307XG4gICAgICAgIHRoaXMuc2t1VG9rZW4gPSAnJztcbiAgICB9XG5cbiAgICBwb3N0TWFwTG9hZEV2ZW50KG1hcElkOiBudW1iZXIsIHNrdVRva2VuOiBzdHJpbmcsIGN1c3RvbUFjY2Vzc1Rva2VuOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyOiA/RXJyb3IpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5za3VUb2tlbiA9IHNrdVRva2VuO1xuICAgICAgICB0aGlzLmVycm9yQ2IgPSBjYWxsYmFjaztcblxuICAgICAgICBpZiAoY29uZmlnLkVWRU5UU19VUkwpIHtcbiAgICAgICAgICAgIGlmIChjdXN0b21BY2Nlc3NUb2tlbiB8fCBjb25maWcuQUNDRVNTX1RPS0VOKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZVJlcXVlc3Qoe2lkOiBtYXBJZCwgdGltZXN0YW1wOiBEYXRlLm5vdygpfSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yQ2IobmV3IEVycm9yKEFVVEhfRVJSX01TRykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc1JlcXVlc3RzKGN1c3RvbUFjY2Vzc1Rva2VuPzogP3N0cmluZykge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdCB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB7aWQsIHRpbWVzdGFtcH0gPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgLy8gT25seSBvbmUgbG9hZCBldmVudCBzaG91bGQgZmlyZSBwZXIgbWFwXG4gICAgICAgIGlmIChpZCAmJiB0aGlzLnN1Y2Nlc3NbaWRdKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCF0aGlzLmFub25JZCkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaEV2ZW50RGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWxpZGF0ZVV1aWQodGhpcy5hbm9uSWQpKSB7XG4gICAgICAgICAgICB0aGlzLmFub25JZCA9IHV1aWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdEV2ZW50KHRpbWVzdGFtcCwge3NrdVRva2VuOiB0aGlzLnNrdVRva2VufSwgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JDYihlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaWQpIHRoaXMuc3VjY2Vzc1tpZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sIGN1c3RvbUFjY2Vzc1Rva2VuKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXBTZXNzaW9uQVBJIGV4dGVuZHMgVGVsZW1ldHJ5RXZlbnQge1xuICAgICtzdWNjZXNzOiB7W186IG51bWJlcl06IGJvb2xlYW59O1xuICAgIHNrdVRva2VuOiBzdHJpbmc7XG4gICAgZXJyb3JDYjogKGVycjogP0Vycm9yKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdtYXAuYXV0aCcpO1xuICAgICAgICB0aGlzLnN1Y2Nlc3MgPSB7fTtcbiAgICAgICAgdGhpcy5za3VUb2tlbiA9ICcnO1xuICAgIH1cblxuICAgIGdldFNlc3Npb24odGltZXN0YW1wOiBudW1iZXIsIHRva2VuOiBzdHJpbmcsIGNhbGxiYWNrOiAoZXJyOiA/RXJyb3IpID0+IHZvaWQsIGN1c3RvbUFjY2Vzc1Rva2VuPzogP3N0cmluZykge1xuICAgICAgICBpZiAoIWNvbmZpZy5BUElfVVJMIHx8ICFjb25maWcuU0VTU0lPTl9QQVRIKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGF1dGhVcmxPYmplY3Q6IFVybE9iamVjdCA9IHBhcnNlVXJsKGNvbmZpZy5BUElfVVJMICsgY29uZmlnLlNFU1NJT05fUEFUSCk7XG4gICAgICAgIGF1dGhVcmxPYmplY3QucGFyYW1zLnB1c2goYHNrdT0ke3Rva2VuIHx8ICcnfWApO1xuICAgICAgICBhdXRoVXJsT2JqZWN0LnBhcmFtcy5wdXNoKGBhY2Nlc3NfdG9rZW49JHtjdXN0b21BY2Nlc3NUb2tlbiB8fCBjb25maWcuQUNDRVNTX1RPS0VOIHx8ICcnfWApO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3Q6IFJlcXVlc3RQYXJhbWV0ZXJzID0ge1xuICAgICAgICAgICAgdXJsOiBmb3JtYXRVcmwoYXV0aFVybE9iamVjdCksXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJywgLy9Ta2lwIHRoZSBwcmUtZmxpZ2h0IE9QVElPTlMgcmVxdWVzdFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3QgPSBnZXREYXRhKHJlcXVlc3QsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgICB0aGlzLnNhdmVFdmVudERhdGEoKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RzKGN1c3RvbUFjY2Vzc1Rva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0U2Vzc2lvbkFQSShtYXBJZDogbnVtYmVyLCBza3VUb2tlbjogc3RyaW5nLCBjdXN0b21BY2Nlc3NUb2tlbjogc3RyaW5nLCBjYWxsYmFjazogKGVycjogP0Vycm9yKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuc2t1VG9rZW4gPSBza3VUb2tlbjtcbiAgICAgICAgdGhpcy5lcnJvckNiID0gY2FsbGJhY2s7XG5cbiAgICAgICAgaWYgKGNvbmZpZy5TRVNTSU9OX1BBVEggJiYgY29uZmlnLkFQSV9VUkwpIHtcbiAgICAgICAgICAgIGlmIChjdXN0b21BY2Nlc3NUb2tlbiB8fCBjb25maWcuQUNDRVNTX1RPS0VOKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZVJlcXVlc3Qoe2lkOiBtYXBJZCwgdGltZXN0YW1wOiBEYXRlLm5vdygpfSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yQ2IobmV3IEVycm9yKEFVVEhfRVJSX01TRykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc1JlcXVlc3RzKGN1c3RvbUFjY2Vzc1Rva2VuPzogP3N0cmluZykge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdCB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB7aWQsIHRpbWVzdGFtcH0gPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgLy8gT25seSBvbmUgbG9hZCBldmVudCBzaG91bGQgZmlyZSBwZXIgbWFwXG4gICAgICAgIGlmIChpZCAmJiB0aGlzLnN1Y2Nlc3NbaWRdKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5nZXRTZXNzaW9uKHRpbWVzdGFtcCwgdGhpcy5za3VUb2tlbiwgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JDYihlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaWQpIHRoaXMuc3VjY2Vzc1tpZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBjdXN0b21BY2Nlc3NUb2tlbik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHVybnN0aWxlRXZlbnQgZXh0ZW5kcyBUZWxlbWV0cnlFdmVudCB7XG4gICAgY29uc3RydWN0b3IoY3VzdG9tQWNjZXNzVG9rZW4/OiA/c3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCdhcHBVc2VyVHVybnN0aWxlJyk7XG4gICAgICAgIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuID0gY3VzdG9tQWNjZXNzVG9rZW47XG4gICAgfVxuXG4gICAgcG9zdFR1cm5zdGlsZUV2ZW50KHRpbGVVcmxzOiBBcnJheTxzdHJpbmc+LCBjdXN0b21BY2Nlc3NUb2tlbj86ID9zdHJpbmcpIHtcbiAgICAgICAgLy9FbmFibGVkIG9ubHkgd2hlbiBNYXBib3ggQWNjZXNzIFRva2VuIGlzIHNldCBhbmQgYSBzb3VyY2UgdXNlc1xuICAgICAgICAvLyBtYXBib3ggdGlsZXMuXG4gICAgICAgIGlmIChjb25maWcuRVZFTlRTX1VSTCAmJlxuICAgICAgICAgICAgY29uZmlnLkFDQ0VTU19UT0tFTiAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aWxlVXJscykgJiZcbiAgICAgICAgICAgIHRpbGVVcmxzLnNvbWUodXJsID0+IGlzTWFwYm94VVJMKHVybCkgfHwgaXNNYXBib3hIVFRQVVJMKHVybCkpKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlUmVxdWVzdChEYXRlLm5vdygpLCBjdXN0b21BY2Nlc3NUb2tlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9jZXNzUmVxdWVzdHMoY3VzdG9tQWNjZXNzVG9rZW4/OiA/c3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdSZXF1ZXN0IHx8IHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYW5vbklkIHx8ICF0aGlzLmV2ZW50RGF0YS5sYXN0U3VjY2VzcyB8fCAhdGhpcy5ldmVudERhdGEudG9rZW5VKSB7XG4gICAgICAgICAgICAvL1JldHJpZXZlIGNhY2hlZCBkYXRhXG4gICAgICAgICAgICB0aGlzLmZldGNoRXZlbnREYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b2tlbkRhdGEgPSBwYXJzZUFjY2Vzc1Rva2VuKGNvbmZpZy5BQ0NFU1NfVE9LRU4pO1xuICAgICAgICBjb25zdCB0b2tlblUgPSB0b2tlbkRhdGEgPyB0b2tlbkRhdGFbJ3UnXSA6IGNvbmZpZy5BQ0NFU1NfVE9LRU47XG4gICAgICAgIC8vUmVzZXQgZXZlbnQgZGF0YSBjYWNoZSBpZiB0aGUgYWNjZXNzIHRva2VuIG93bmVyIGNoYW5nZWQuXG4gICAgICAgIGxldCBkdWVGb3JFdmVudCA9IHRva2VuVSAhPT0gdGhpcy5ldmVudERhdGEudG9rZW5VO1xuXG4gICAgICAgIGlmICghdmFsaWRhdGVVdWlkKHRoaXMuYW5vbklkKSkge1xuICAgICAgICAgICAgdGhpcy5hbm9uSWQgPSB1dWlkKCk7XG4gICAgICAgICAgICBkdWVGb3JFdmVudCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXh0VXBkYXRlID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAvLyBSZWNvcmQgdHVybnN0aWxlIGV2ZW50IG9uY2UgcGVyIGNhbGVuZGFyIGRheS5cbiAgICAgICAgaWYgKHRoaXMuZXZlbnREYXRhLmxhc3RTdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VXBkYXRlID0gbmV3IERhdGUodGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MpO1xuICAgICAgICAgICAgY29uc3QgbmV4dERhdGUgPSBuZXcgRGF0ZShuZXh0VXBkYXRlKTtcbiAgICAgICAgICAgIGNvbnN0IGRheXNFbGFwc2VkID0gKG5leHRVcGRhdGUgLSB0aGlzLmV2ZW50RGF0YS5sYXN0U3VjY2VzcykgLyAoMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgICAgICAgICBkdWVGb3JFdmVudCA9IGR1ZUZvckV2ZW50IHx8IGRheXNFbGFwc2VkID49IDEgfHwgZGF5c0VsYXBzZWQgPCAtMSB8fCBsYXN0VXBkYXRlLmdldERhdGUoKSAhPT0gbmV4dERhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHVlRm9yRXZlbnQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkdWVGb3JFdmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlcXVlc3RzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvc3RFdmVudChuZXh0VXBkYXRlLCB7XCJlbmFibGVkLnRlbGVtZXRyeVwiOiBmYWxzZX0sIChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MgPSBuZXh0VXBkYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnREYXRhLnRva2VuVSA9IHRva2VuVTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgIH1cbn1cblxuY29uc3QgdHVybnN0aWxlRXZlbnRfID0gbmV3IFR1cm5zdGlsZUV2ZW50KCk7XG5leHBvcnQgY29uc3QgcG9zdFR1cm5zdGlsZUV2ZW50ID0gdHVybnN0aWxlRXZlbnRfLnBvc3RUdXJuc3RpbGVFdmVudC5iaW5kKHR1cm5zdGlsZUV2ZW50Xyk7XG5cbmNvbnN0IG1hcExvYWRFdmVudF8gPSBuZXcgTWFwTG9hZEV2ZW50KCk7XG5leHBvcnQgY29uc3QgcG9zdE1hcExvYWRFdmVudCA9IG1hcExvYWRFdmVudF8ucG9zdE1hcExvYWRFdmVudC5iaW5kKG1hcExvYWRFdmVudF8pO1xuXG5jb25zdCBtYXBTZXNzaW9uQVBJXyA9IG5ldyBNYXBTZXNzaW9uQVBJKCk7XG5leHBvcnQgY29uc3QgZ2V0TWFwU2Vzc2lvbkFQSSA9IG1hcFNlc3Npb25BUElfLmdldFNlc3Npb25BUEkuYmluZChtYXBTZXNzaW9uQVBJXyk7XG5cbmNvbnN0IGF1dGhlbnRpY2F0ZWRNYXBzID0gbmV3IFNldCgpO1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlQXV0aFN0YXRlKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHN0YXRlOiBib29sZWFuKSB7XG4gICAgaWYgKHN0YXRlKSB7XG4gICAgICAgIGF1dGhlbnRpY2F0ZWRNYXBzLmFkZChnbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXV0aGVudGljYXRlZE1hcHMuZGVsZXRlKGdsKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hcEF1dGhlbnRpY2F0ZWQoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhdXRoZW50aWNhdGVkTWFwcy5oYXMoZ2wpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXV0aFN0YXRlKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICBhdXRoZW50aWNhdGVkTWFwcy5kZWxldGUoZ2wpO1xufVxuXG4vKioqKiogRU5EIFdBUk5JTkcgLSBSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSEVcblBSRUNFRElORyBDT0RFIFZJT0xBVEVTIFRIRSBNQVBCT1ggVEVSTVMgT0YgU0VSVklDRSAgKioqKioqL1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt3YXJuT25jZSwgcGFyc2VDYWNoZUNvbnRyb2x9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93LmpzJztcblxuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuL2Rpc3BhdGNoZXIuanMnO1xuXG5jb25zdCBDQUNIRV9OQU1FID0gJ21hcGJveC10aWxlcyc7XG5sZXQgY2FjaGVMaW1pdCA9IDUwMDsgLy8gNTBNQiAvICgxMDBLQi90aWxlKSB+PSA1MDAgdGlsZXNcbmxldCBjYWNoZUNoZWNrVGhyZXNob2xkID0gNTA7XG5cbmNvbnN0IE1JTl9USU1FX1VOVElMX0VYUElSWSA9IDEwMDAgKiA2MCAqIDc7IC8vIDcgbWludXRlcy4gU2tpcCBjYWNoaW5nIHRpbGVzIHdpdGggYSBzaG9ydCBlbm91Z2ggbWF4IGFnZS5cblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VPcHRpb25zID0ge1xuICAgIHN0YXR1czogbnVtYmVyLFxuICAgIHN0YXR1c1RleHQ6IHN0cmluZyxcbiAgICBoZWFkZXJzOiB3aW5kb3cuSGVhZGVyc1xufTtcblxuLy8gV2UncmUgdXNpbmcgYSBnbG9iYWwgc2hhcmVkIGNhY2hlIG9iamVjdC4gTm9ybWFsbHksIHJlcXVlc3RpbmcgYWQtaG9jIENhY2hlIG9iamVjdHMgaXMgZmluZSwgYnV0XG4vLyBTYWZhcmkgaGFzIGEgbWVtb3J5IGxlYWsgaW4gd2hpY2ggaXQgZmFpbHMgdG8gcmVsZWFzZSBtZW1vcnkgd2hlbiByZXF1ZXN0aW5nIGtleXMoKSBmcm9tIGEgQ2FjaGVcbi8vIG9iamVjdC4gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDM5OTEgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5sZXQgc2hhcmVkQ2FjaGU6ID9Qcm9taXNlPENhY2hlPjtcblxuZnVuY3Rpb24gY2FjaGVPcGVuKCkge1xuICAgIGlmICh3aW5kb3cuY2FjaGVzICYmICFzaGFyZWRDYWNoZSkge1xuICAgICAgICBzaGFyZWRDYWNoZSA9IHdpbmRvdy5jYWNoZXMub3BlbihDQUNIRV9OQU1FKTtcbiAgICB9XG59XG5cbi8vIFdlJ3JlIG5ldmVyIGNsb3NpbmcgdGhlIGNhY2hlLCBidXQgb3VyIHVuaXQgdGVzdHMgcmVseSBvbiBjaGFuZ2luZyBvdXQgdGhlIGdsb2JhbCB3aW5kb3cuY2FjaGVzXG4vLyBvYmplY3QsIHNvIHdlIGhhdmUgYSBmdW5jdGlvbiBzcGVjaWZpY2FsbHkgZm9yIHVuaXQgdGVzdHMgdGhhdCBhbGxvd3MgcmVzZXR0aW5nIHRoZSBzaGFyZWQgY2FjaGUuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVDbG9zZSgpIHtcbiAgICBzaGFyZWRDYWNoZSA9IHVuZGVmaW5lZDtcbn1cblxubGV0IHJlc3BvbnNlQ29uc3RydWN0b3JTdXBwb3J0c1JlYWRhYmxlU3RyZWFtO1xuZnVuY3Rpb24gcHJlcGFyZUJvZHkocmVzcG9uc2U6IFJlc3BvbnNlLCBjYWxsYmFjaykge1xuICAgIGlmIChyZXNwb25zZUNvbnN0cnVjdG9yU3VwcG9ydHNSZWFkYWJsZVN0cmVhbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXcgUmVzcG9uc2UobmV3IFJlYWRhYmxlU3RyZWFtKCkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgICAgICAgICByZXNwb25zZUNvbnN0cnVjdG9yU3VwcG9ydHNSZWFkYWJsZVN0cmVhbSA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIEVkZ2VcbiAgICAgICAgICAgIHJlc3BvbnNlQ29uc3RydWN0b3JTdXBwb3J0c1JlYWRhYmxlU3RyZWFtID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2VDb25zdHJ1Y3RvclN1cHBvcnRzUmVhZGFibGVTdHJlYW0pIHtcbiAgICAgICAgY2FsbGJhY2socmVzcG9uc2UuYm9keSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2UuYmxvYigpLnRoZW4oY2FsbGJhY2spO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlUHV0KHJlcXVlc3Q6IFJlcXVlc3QsIHJlc3BvbnNlOiBSZXNwb25zZSwgcmVxdWVzdFRpbWU6IG51bWJlcikge1xuICAgIGNhY2hlT3BlbigpO1xuICAgIGlmICghc2hhcmVkQ2FjaGUpIHJldHVybjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IFJlc3BvbnNlT3B0aW9ucyA9IHtcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IG5ldyB3aW5kb3cuSGVhZGVycygpXG4gICAgfTtcbiAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHYsIGspID0+IG9wdGlvbnMuaGVhZGVycy5zZXQoaywgdikpO1xuXG4gICAgY29uc3QgY2FjaGVDb250cm9sID0gcGFyc2VDYWNoZUNvbnRyb2wocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NhY2hlLUNvbnRyb2wnKSB8fCAnJyk7XG4gICAgaWYgKGNhY2hlQ29udHJvbFsnbm8tc3RvcmUnXSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjYWNoZUNvbnRyb2xbJ21heC1hZ2UnXSkge1xuICAgICAgICBvcHRpb25zLmhlYWRlcnMuc2V0KCdFeHBpcmVzJywgbmV3IERhdGUocmVxdWVzdFRpbWUgKyBjYWNoZUNvbnRyb2xbJ21heC1hZ2UnXSAqIDEwMDApLnRvVVRDU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVVbnRpbEV4cGlyeSA9IG5ldyBEYXRlKG9wdGlvbnMuaGVhZGVycy5nZXQoJ0V4cGlyZXMnKSkuZ2V0VGltZSgpIC0gcmVxdWVzdFRpbWU7XG4gICAgaWYgKHRpbWVVbnRpbEV4cGlyeSA8IE1JTl9USU1FX1VOVElMX0VYUElSWSkgcmV0dXJuO1xuXG4gICAgcHJlcGFyZUJvZHkocmVzcG9uc2UsIGJvZHkgPT4ge1xuICAgICAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IG5ldyB3aW5kb3cuUmVzcG9uc2UoYm9keSwgb3B0aW9ucyk7XG5cbiAgICAgICAgY2FjaGVPcGVuKCk7XG4gICAgICAgIGlmICghc2hhcmVkQ2FjaGUpIHJldHVybjtcbiAgICAgICAgc2hhcmVkQ2FjaGVcbiAgICAgICAgICAgIC50aGVuKGNhY2hlID0+IGNhY2hlLnB1dChzdHJpcFF1ZXJ5UGFyYW1ldGVycyhyZXF1ZXN0LnVybCksIGNsb25lZFJlc3BvbnNlKSlcbiAgICAgICAgICAgIC5jYXRjaChlID0+IHdhcm5PbmNlKGUubWVzc2FnZSkpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzdHJpcFF1ZXJ5UGFyYW1ldGVycyh1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHN0YXJ0ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICByZXR1cm4gc3RhcnQgPCAwID8gdXJsIDogdXJsLnNsaWNlKDAsIHN0YXJ0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlR2V0KHJlcXVlc3Q6IFJlcXVlc3QsIGNhbGxiYWNrOiAoZXJyb3I6ID9hbnksIHJlc3BvbnNlOiA/UmVzcG9uc2UsIGZyZXNoOiA/Ym9vbGVhbikgPT4gdm9pZCkge1xuICAgIGNhY2hlT3BlbigpO1xuICAgIGlmICghc2hhcmVkQ2FjaGUpIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgIGNvbnN0IHN0cmlwcGVkVVJMID0gc3RyaXBRdWVyeVBhcmFtZXRlcnMocmVxdWVzdC51cmwpO1xuXG4gICAgc2hhcmVkQ2FjaGVcbiAgICAgICAgLnRoZW4oY2FjaGUgPT4ge1xuICAgICAgICAgICAgLy8gbWFudWFsbHkgc3RyaXAgVVJMIGluc3RlYWQgb2YgYGlnbm9yZVNlYXJjaDogdHJ1ZWAgYmVjYXVzZSBvZiBhIGtub3duXG4gICAgICAgICAgICAvLyBwZXJmb3JtYW5jZSBpc3N1ZSBpbiBDaHJvbWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzg0MzFcbiAgICAgICAgICAgIGNhY2hlLm1hdGNoKHN0cmlwcGVkVVJMKVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJlc2ggPSBpc0ZyZXNoKHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZWluc2VydCBpbnRvIGNhY2hlIHNvIHRoYXQgb3JkZXIgb2Yga2V5cyBpbiB0aGUgY2FjaGUgaXMgdGhlIG9yZGVyIG9mIGFjY2Vzcy5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBsaW5lIG1ha2VzIHRoZSBjYWNoZSBhIExSVSBpbnN0ZWFkIG9mIGEgRklGTyBjYWNoZS5cbiAgICAgICAgICAgICAgICAgICAgY2FjaGUuZGVsZXRlKHN0cmlwcGVkVVJMKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wdXQoc3RyaXBwZWRVUkwsIHJlc3BvbnNlLmNsb25lKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UsIGZyZXNoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChjYWxsYmFjayk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChjYWxsYmFjayk7XG5cbn1cblxuZnVuY3Rpb24gaXNGcmVzaChyZXNwb25zZSkge1xuICAgIGlmICghcmVzcG9uc2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBleHBpcmVzID0gbmV3IERhdGUocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0V4cGlyZXMnKSB8fCAwKTtcbiAgICBjb25zdCBjYWNoZUNvbnRyb2wgPSBwYXJzZUNhY2hlQ29udHJvbChyZXNwb25zZS5oZWFkZXJzLmdldCgnQ2FjaGUtQ29udHJvbCcpIHx8ICcnKTtcbiAgICByZXR1cm4gZXhwaXJlcyA+IERhdGUubm93KCkgJiYgIWNhY2hlQ29udHJvbFsnbm8tY2FjaGUnXTtcbn1cblxuLy8gYEluZmluaXR5YCB0cmlnZ2VycyBhIGNhY2hlIGNoZWNrIGFmdGVyIHRoZSBmaXJzdCB0aWxlIGlzIGxvYWRlZFxuLy8gc28gdGhhdCBhIGNoZWNrIGlzIHJ1biBhdCBsZWFzdCBvbmNlIG9uIGVhY2ggcGFnZSBsb2FkLlxubGV0IGdsb2JhbEVudHJ5Q291bnRlciA9IEluZmluaXR5O1xuXG4vLyBUaGUgY2FjaGUgY2hlY2sgZ2V0cyBydW4gb24gYSB3b3JrZXIuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdFxuLy8gcHJvZmlsaW5nIHNvbWV0aW1lcyBzaG93cyB0aGlzIGFzIHRha2luZyB1cCBzaWduaWZpY2FudCB0aW1lIG9uIHRoZVxuLy8gdGhyZWFkIGl0IGdldHMgY2FsbGVkIGZyb20uIEFuZCBzb21ldGltZXMgaXQgZG9lc24ndC4gSXQgKm1heSogYmVcbi8vIGZpbmUgdG8gcnVuIHRoaXMgb24gdGhlIG1haW4gdGhyZWFkIGJ1dCBvdXQgb2YgY2F1dGlvbiB0aGlzIGlzIGJlaW5nXG4vLyBkaXNwYXRjaGVkIG9uIGEgd29ya2VyLiBUaGlzIGNhbiBiZSBpbnZlc3RpZ2F0ZWQgZnVydGhlciBpbiB0aGUgZnV0dXJlLlxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlRW50cnlQb3NzaWJseUFkZGVkKGRpc3BhdGNoZXI6IERpc3BhdGNoZXIpIHtcbiAgICBnbG9iYWxFbnRyeUNvdW50ZXIrKztcbiAgICBpZiAoZ2xvYmFsRW50cnlDb3VudGVyID4gY2FjaGVDaGVja1RocmVzaG9sZCkge1xuICAgICAgICBkaXNwYXRjaGVyLmdldEFjdG9yKCkuc2VuZCgnZW5mb3JjZUNhY2hlU2l6ZUxpbWl0JywgY2FjaGVMaW1pdCk7XG4gICAgICAgIGdsb2JhbEVudHJ5Q291bnRlciA9IDA7XG4gICAgfVxufVxuXG4vLyBydW5zIG9uIHdvcmtlciwgc2VlIGFib3ZlIGNvbW1lbnRcbmV4cG9ydCBmdW5jdGlvbiBlbmZvcmNlQ2FjaGVTaXplTGltaXQobGltaXQ6IG51bWJlcikge1xuICAgIGNhY2hlT3BlbigpO1xuICAgIGlmICghc2hhcmVkQ2FjaGUpIHJldHVybjtcblxuICAgIHNoYXJlZENhY2hlXG4gICAgICAgIC50aGVuKGNhY2hlID0+IHtcbiAgICAgICAgICAgIGNhY2hlLmtleXMoKS50aGVuKGtleXMgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSBsaW1pdDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhY2hlLmRlbGV0ZShrZXlzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclRpbGVDYWNoZShjYWxsYmFjaz86IChlcnI6ID9FcnJvcikgPT4gdm9pZCkge1xuICAgIGNvbnN0IHByb21pc2UgPSB3aW5kb3cuY2FjaGVzLmRlbGV0ZShDQUNIRV9OQU1FKTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgcHJvbWlzZS5jYXRjaChjYWxsYmFjaykudGhlbigoKSA9PiBjYWxsYmFjaygpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDYWNoZUxpbWl0cyhsaW1pdDogbnVtYmVyLCBjaGVja1RocmVzaG9sZDogbnVtYmVyKSB7XG4gICAgY2FjaGVMaW1pdCA9IGxpbWl0O1xuICAgIGNhY2hlQ2hlY2tUaHJlc2hvbGQgPSBjaGVja1RocmVzaG9sZDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cuanMnO1xuaW1wb3J0IHtleHRlbmQsIHdhcm5PbmNlLCBpc1dvcmtlcn0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7aXNNYXBib3hIVFRQVVJMLCBoYXNDYWNoZURlZmVhdGluZ1NrdX0gZnJvbSAnLi9tYXBib3guanMnO1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2NvbmZpZy5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge2NhY2hlR2V0LCBjYWNoZVB1dH0gZnJvbSAnLi90aWxlX3JlcXVlc3RfY2FjaGUuanMnO1xuaW1wb3J0IHdlYnBTdXBwb3J0ZWQgZnJvbSAnLi93ZWJwX3N1cHBvcnRlZC5qcyc7XG5cbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUuanMnO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGEgcmVzb3VyY2UuXG4gKiBAcHJpdmF0ZVxuICogQHJlYWRvbmx5XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5jb25zdCBSZXNvdXJjZVR5cGUgPSB7XG4gICAgVW5rbm93bjogJ1Vua25vd24nLFxuICAgIFN0eWxlOiAnU3R5bGUnLFxuICAgIFNvdXJjZTogJ1NvdXJjZScsXG4gICAgVGlsZTogJ1RpbGUnLFxuICAgIEdseXBoczogJ0dseXBocycsXG4gICAgU3ByaXRlSW1hZ2U6ICdTcHJpdGVJbWFnZScsXG4gICAgU3ByaXRlSlNPTjogJ1Nwcml0ZUpTT04nLFxuICAgIEltYWdlOiAnSW1hZ2UnXG59O1xuZXhwb3J0IHtSZXNvdXJjZVR5cGV9O1xuXG5pZiAodHlwZW9mIE9iamVjdC5mcmVlemUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIE9iamVjdC5mcmVlemUoUmVzb3VyY2VUeXBlKTtcbn1cblxuLyoqXG4gKiBBIGBSZXF1ZXN0UGFyYW1ldGVyc2Agb2JqZWN0IHRvIGJlIHJldHVybmVkIGZyb20gTWFwLm9wdGlvbnMudHJhbnNmb3JtUmVxdWVzdCBjYWxsYmFja3MuXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSZXF1ZXN0UGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHJlcXVlc3RlZC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBoZWFkZXJzIFRoZSBoZWFkZXJzIHRvIGJlIHNlbnQgd2l0aCB0aGUgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXRob2QgUmVxdWVzdCBtZXRob2QgYCdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCdgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJvZHkgUmVxdWVzdCBib2R5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgUmVzcG9uc2UgYm9keSB0eXBlIHRvIGJlIHJldHVybmVkIGAnc3RyaW5nJyB8ICdqc29uJyB8ICdhcnJheUJ1ZmZlcidgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNyZWRlbnRpYWxzIGAnc2FtZS1vcmlnaW4nfCdpbmNsdWRlJ2AgVXNlICdpbmNsdWRlJyB0byBzZW5kIGNvb2tpZXMgd2l0aCBjcm9zcy1vcmlnaW4gcmVxdWVzdHMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNvbGxlY3RSZXNvdXJjZVRpbWluZyBJZiB0cnVlLCBSZXNvdXJjZSBUaW1pbmcgQVBJIGluZm9ybWF0aW9uIHdpbGwgYmUgY29sbGVjdGVkIGZvciB0aGVzZSB0cmFuc2Zvcm1lZCByZXF1ZXN0cyBhbmQgcmV0dXJuZWQgaW4gYSByZXNvdXJjZVRpbWluZyBwcm9wZXJ0eSBvZiByZWxldmFudCBkYXRhIGV2ZW50cy5cbiAqIEBleGFtcGxlXG4gKiAvLyB1c2UgdHJhbnNmb3JtUmVxdWVzdCB0byBtb2RpZnkgcmVxdWVzdHMgdGhhdCBiZWdpbiB3aXRoIGBodHRwOi8vbXlIb3N0YFxuICogY29uc3QgbWFwID0gbmV3IE1hcCh7XG4gKiAgICAgY29udGFpbmVyOiAnbWFwJyxcbiAqICAgICBzdHlsZTogJ21hcGJveDovL3N0eWxlcy9tYXBib3gvc3RyZWV0cy12MTEnLFxuICogICAgIHRyYW5zZm9ybVJlcXVlc3Q6ICh1cmwsIHJlc291cmNlVHlwZSkgPT4ge1xuICogICAgICAgICBpZiAocmVzb3VyY2VUeXBlID09PSAnU291cmNlJyAmJiB1cmwuaW5kZXhPZignaHR0cDovL215SG9zdCcpID4gLTEpIHtcbiAqICAgICAgICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgICAgICAgICAgdXJsOiB1cmwucmVwbGFjZSgnaHR0cCcsICdodHRwcycpLFxuICogICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsnbXktY3VzdG9tLWhlYWRlcic6IHRydWV9LFxuICogICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScgIC8vIEluY2x1ZGUgY29va2llcyBmb3IgY3Jvc3Mtb3JpZ2luIHJlcXVlc3RzXG4gKiAgICAgICAgICAgICB9O1xuICogICAgICAgICB9XG4gKiAgICAgfVxuICogfSk7XG4gKlxuICovXG5leHBvcnQgdHlwZSBSZXF1ZXN0UGFyYW1ldGVycyA9IHtcbiAgICB1cmw6IHN0cmluZyxcbiAgICBoZWFkZXJzPzogT2JqZWN0LFxuICAgIG1ldGhvZD86ICdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcsXG4gICAgYm9keT86IHN0cmluZyxcbiAgICB0eXBlPzogJ3N0cmluZycgfCAnanNvbicgfCAnYXJyYXlCdWZmZXInLFxuICAgIGNyZWRlbnRpYWxzPzogJ3NhbWUtb3JpZ2luJyB8ICdpbmNsdWRlJyxcbiAgICBjb2xsZWN0UmVzb3VyY2VUaW1pbmc/OiBib29sZWFuXG59O1xuXG5leHBvcnQgdHlwZSBSZXNwb25zZUNhbGxiYWNrPFQ+ID0gKGVycm9yOiA/RXJyb3IsIGRhdGE6ID9ULCBjYWNoZUNvbnRyb2w6ID9zdHJpbmcsIGV4cGlyZXM6ID9zdHJpbmcpID0+IHZvaWQ7XG5cbmNsYXNzIEFKQVhFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICB1cmw6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyLCB1cmw6IHN0cmluZykge1xuICAgICAgICBpZiAoc3RhdHVzID09PSA0MDEgJiYgaXNNYXBib3hIVFRQVVJMKHVybCkpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgKz0gJzogeW91IG1heSBoYXZlIHByb3ZpZGVkIGFuIGludmFsaWQgTWFwYm94IGFjY2VzcyB0b2tlbi4gU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vYXBpLWRvY3VtZW50YXRpb24vI2FjY2Vzcy10b2tlbnMtYW5kLXRva2VuLXNjb3Blcyc7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfSAoJHt0aGlzLnN0YXR1c30pOiAke3RoaXMudXJsfWA7XG4gICAgfVxufVxuXG4vLyBFbnN1cmUgdGhhdCB3ZSdyZSBzZW5kaW5nIHRoZSBjb3JyZWN0IHJlZmVycmVyIGZyb20gYmxvYiBVUkwgd29ya2VyIGJ1bmRsZXMuXG4vLyBGb3IgZmlsZXMgbG9hZGVkIGZyb20gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLCBgbG9jYXRpb24ub3JpZ2luYCB3aWxsIGJlIHNldFxuLy8gdG8gdGhlIHN0cmluZyghKSBcIm51bGxcIiAoRmlyZWZveCksIG9yIFwiZmlsZTovL1wiIChDaHJvbWUsIFNhZmFyaSwgRWRnZSwgSUUpLFxuLy8gYW5kIHdlIHdpbGwgc2V0IGFuIGVtcHR5IHJlZmVycmVyLiBPdGhlcndpc2UsIHdlJ3JlIHVzaW5nIHRoZSBkb2N1bWVudCdzIFVSTC5cbi8qIGdsb2JhbCBzZWxmICovXG5leHBvcnQgY29uc3QgZ2V0UmVmZXJyZXIgPSBpc1dvcmtlcigpID9cbiAgICAoKSA9PiBzZWxmLndvcmtlciAmJiBzZWxmLndvcmtlci5yZWZlcnJlciA6XG4gICAgKCkgPT4gKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2Jsb2I6JyA/IHdpbmRvdy5wYXJlbnQgOiB3aW5kb3cpLmxvY2F0aW9uLmhyZWY7XG5cbi8vIERldGVybWluZXMgd2hldGhlciBhIFVSTCBpcyBhIGZpbGU6Ly8gVVJMLiBUaGlzIGlzIG9idmlvdXNseSB0aGUgY2FzZSBpZiBpdCBiZWdpbnNcbi8vIHdpdGggZmlsZTovLy4gUmVsYXRpdmUgVVJMcyBhcmUgYWxzbyBmaWxlOi8vIFVSTHMgaWZmIHRoZSBvcmlnaW5hbCBkb2N1bWVudCB3YXMgbG9hZGVkXG4vLyB2aWEgYSBmaWxlOi8vIFVSTC5cbmNvbnN0IGlzRmlsZVVSTCA9IHVybCA9PiAvXmZpbGU6Ly50ZXN0KHVybCkgfHwgKC9eZmlsZTovLnRlc3QoZ2V0UmVmZXJyZXIoKSkgJiYgIS9eXFx3KzovLnRlc3QodXJsKSk7XG5cbmZ1bmN0aW9uIG1ha2VGZXRjaFJlcXVlc3QocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxhbnk+KTogQ2FuY2VsYWJsZSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyB3aW5kb3cuQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyB3aW5kb3cuUmVxdWVzdChyZXF1ZXN0UGFyYW1ldGVycy51cmwsIHtcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0UGFyYW1ldGVycy5tZXRob2QgfHwgJ0dFVCcsXG4gICAgICAgIGJvZHk6IHJlcXVlc3RQYXJhbWV0ZXJzLmJvZHksXG4gICAgICAgIGNyZWRlbnRpYWxzOiByZXF1ZXN0UGFyYW1ldGVycy5jcmVkZW50aWFscyxcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdFBhcmFtZXRlcnMuaGVhZGVycyxcbiAgICAgICAgcmVmZXJyZXI6IGdldFJlZmVycmVyKCksXG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWxcbiAgICB9KTtcbiAgICBsZXQgY29tcGxldGUgPSBmYWxzZTtcbiAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FjaGVJZ25vcmluZ1NlYXJjaCA9IGhhc0NhY2hlRGVmZWF0aW5nU2t1KHJlcXVlc3QudXJsKTtcblxuICAgIGlmIChyZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnanNvbicpIHtcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldCgnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZU9yRmV0Y2ggPSAoZXJyLCBjYWNoZWRSZXNwb25zZSwgcmVzcG9uc2VJc0ZyZXNoKSA9PiB7XG4gICAgICAgIGlmIChhYm9ydGVkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgLy8gRG8gZmV0Y2ggaW4gY2FzZSBvZiBjYWNoZSBlcnJvci5cbiAgICAgICAgICAgIC8vIEhUVFAgcGFnZXMgaW4gRWRnZSB0cmlnZ2VyIGEgc2VjdXJpdHkgZXJyb3IgdGhhdCBjYW4gYmUgaWdub3JlZC5cbiAgICAgICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gJ1NlY3VyaXR5RXJyb3InKSB7XG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZWRSZXNwb25zZSAmJiByZXNwb25zZUlzRnJlc2gpIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5pc2hSZXF1ZXN0KGNhY2hlZFJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZWRSZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZG8gcmV2YWxpZGF0aW9uIHdpdGggJ0lmLU5vbmUtTWF0Y2gnIGJlY2F1c2UgdGhlbiB0aGVcbiAgICAgICAgICAgIC8vIHJlcXVlc3QgZG9lc24ndCBoYXZlIHNpbXBsZSBjb3JzIGhlYWRlcnMuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXF1ZXN0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgd2luZG93LmZldGNoKHJlcXVlc3QpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVhYmxlUmVzcG9uc2UgPSBjYWNoZUlnbm9yaW5nU2VhcmNoID8gcmVzcG9uc2UuY2xvbmUoKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmlzaFJlcXVlc3QocmVzcG9uc2UsIGNhY2hlYWJsZVJlc3BvbnNlLCByZXF1ZXN0VGltZSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBBSkFYRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCwgcmVzcG9uc2Uuc3RhdHVzLCByZXF1ZXN0UGFyYW1ldGVycy51cmwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IDIwKSB7XG4gICAgICAgICAgICAgICAgLy8gc2lsZW5jZSBleHBlY3RlZCBBYm9ydEVycm9yXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGZpbmlzaFJlcXVlc3QgPSAocmVzcG9uc2UsIGNhY2hlYWJsZVJlc3BvbnNlLCByZXF1ZXN0VGltZSkgPT4ge1xuICAgICAgICAoXG4gICAgICAgICAgICByZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnYXJyYXlCdWZmZXInID8gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSA6XG4gICAgICAgICAgICByZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnanNvbicgPyByZXNwb25zZS5qc29uKCkgOlxuICAgICAgICAgICAgcmVzcG9uc2UudGV4dCgpXG4gICAgICAgICkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChjYWNoZWFibGVSZXNwb25zZSAmJiByZXF1ZXN0VGltZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBuZWVkcyB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjYWNoZSBhZnRlciBpdCBoYXMgY29tcGxldGVseSBsb2FkZWQuXG4gICAgICAgICAgICAgICAgLy8gVW50aWwgaXQgaXMgZnVsbHkgbG9hZGVkIHRoZXJlIGlzIGEgY2hhbmNlIGl0IHdpbGwgYmUgYWJvcnRlZC4gQWJvcnRpbmcgd2hpbGVcbiAgICAgICAgICAgICAgICAvLyByZWFkaW5nIHRoZSBib2R5IGNhbiBjYXVzZSB0aGUgY2FjaGUgaW5zZXJ0aW9uIHRvIGVycm9yLiBXZSBjb3VsZCBjYXRjaCB0aGlzIGVycm9yXG4gICAgICAgICAgICAgICAgLy8gaW4gbW9zdCBicm93c2VycyBidXQgaW4gRmlyZWZveCBpdCBzZWVtcyB0byBzb21ldGltZXMgY3Jhc2ggdGhlIHRhYi4gQWRkaW5nXG4gICAgICAgICAgICAgICAgLy8gaXQgdG8gdGhlIGNhY2hlIGhlcmUgYXZvaWRzIHRoYXQgZXJyb3IuXG4gICAgICAgICAgICAgICAgY2FjaGVQdXQocmVxdWVzdCwgY2FjaGVhYmxlUmVzcG9uc2UsIHJlcXVlc3RUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCwgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NhY2hlLUNvbnRyb2wnKSwgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0V4cGlyZXMnKSk7XG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBpZiAoIWFib3J0ZWQpIGNhbGxiYWNrKG5ldyBFcnJvcihlcnIubWVzc2FnZSkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgaWYgKGNhY2hlSWdub3JpbmdTZWFyY2gpIHtcbiAgICAgICAgY2FjaGVHZXQocmVxdWVzdCwgdmFsaWRhdGVPckZldGNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0ZU9yRmV0Y2gobnVsbCwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIGlmICghY29tcGxldGUpIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9fTtcbn1cblxuZnVuY3Rpb24gbWFrZVhNTEh0dHBSZXF1ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8YW55Pik6IENhbmNlbGFibGUge1xuICAgIGNvbnN0IHhocjogWE1MSHR0cFJlcXVlc3QgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0UGFyYW1ldGVycy5tZXRob2QgfHwgJ0dFVCcsIHJlcXVlc3RQYXJhbWV0ZXJzLnVybCwgdHJ1ZSk7XG4gICAgaWYgKHJlcXVlc3RQYXJhbWV0ZXJzLnR5cGUgPT09ICdhcnJheUJ1ZmZlcicpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgfVxuICAgIGZvciAoY29uc3QgayBpbiByZXF1ZXN0UGFyYW1ldGVycy5oZWFkZXJzKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGssIHJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnNba10pO1xuICAgIH1cbiAgICBpZiAocmVxdWVzdFBhcmFtZXRlcnMudHlwZSA9PT0gJ2pzb24nKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAndGV4dCc7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgIH1cbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdFBhcmFtZXRlcnMuY3JlZGVudGlhbHMgPT09ICdpbmNsdWRlJztcbiAgICB4aHIub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKHhoci5zdGF0dXNUZXh0KSk7XG4gICAgfTtcbiAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBpZiAoKCh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwKSB8fCB4aHIuc3RhdHVzID09PSAwKSAmJiB4aHIucmVzcG9uc2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBkYXRhOiBtaXhlZCA9IHhoci5yZXNwb25zZTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnanNvbicpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSdyZSBtYW51YWxseSBwYXJzaW5nIEpTT04gaGVyZSB0byBnZXQgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEsIHhoci5nZXRSZXNwb25zZUhlYWRlcignQ2FjaGUtQ29udHJvbCcpLCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0V4cGlyZXMnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgQUpBWEVycm9yKHhoci5zdGF0dXNUZXh0LCB4aHIuc3RhdHVzLCByZXF1ZXN0UGFyYW1ldGVycy51cmwpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgeGhyLnNlbmQocmVxdWVzdFBhcmFtZXRlcnMuYm9keSk7XG4gICAgcmV0dXJuIHtjYW5jZWw6ICgpID0+IHhoci5hYm9ydCgpfTtcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VSZXF1ZXN0ID0gZnVuY3Rpb24ocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxhbnk+KTogQ2FuY2VsYWJsZSB7XG4gICAgLy8gV2UncmUgdHJ5aW5nIHRvIHVzZSB0aGUgRmV0Y2ggQVBJIGlmIHBvc3NpYmxlLiBIb3dldmVyLCBpbiBzb21lIHNpdHVhdGlvbnMgd2UgY2FuJ3QgdXNlIGl0OlxuICAgIC8vIC0gU2FmYXJpIGV4cG9zZXMgd2luZG93LkFib3J0Q29udHJvbGxlciwgYnV0IGl0IGRvZXNuJ3Qgd29yayBhY3R1YWxseSBhYm9ydCBhbnkgcmVxdWVzdHMgaW5cbiAgICAvLyAgIG9sZGVyIHZlcnNpb25zIChzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3NDk4MCNjMikuIEluIHRoaXMgY2FzZSxcbiAgICAvLyAgIHdlIGRpc3BhdGNoIHRoZSByZXF1ZXN0IHRvIHRoZSBtYWluIHRocmVhZCBzbyB0aGF0IHdlIGNhbiBnZXQgYW4gYWNjdXJhdGUgcmVmZXJyZXIgaGVhZGVyLlxuICAgIC8vIC0gUmVxdWVzdHMgZm9yIHJlc291cmNlcyB3aXRoIHRoZSBmaWxlOi8vIFVSSSBzY2hlbWUgZG9uJ3Qgd29yayB3aXRoIHRoZSBGZXRjaCBBUEkgZWl0aGVyLiBJblxuICAgIC8vICAgdGhpcyBjYXNlIHdlIHVuY29uZGl0aW9uYWxseSB1c2UgWEhSIG9uIHRoZSBjdXJyZW50IHRocmVhZCBzaW5jZSByZWZlcnJlcnMgZG9uJ3QgbWF0dGVyLlxuICAgIGlmICghaXNGaWxlVVJMKHJlcXVlc3RQYXJhbWV0ZXJzLnVybCkpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5mZXRjaCAmJiB3aW5kb3cuUmVxdWVzdCAmJiB3aW5kb3cuQWJvcnRDb250cm9sbGVyICYmIHdpbmRvdy5SZXF1ZXN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgnc2lnbmFsJykpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlRmV0Y2hSZXF1ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzV29ya2VyKCkgJiYgc2VsZi53b3JrZXIgJiYgc2VsZi53b3JrZXIuYWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlT25NYWluVGhyZWFkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLndvcmtlci5hY3Rvci5zZW5kKCdnZXRSZXNvdXJjZScsIHJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjaywgdW5kZWZpbmVkLCBxdWV1ZU9uTWFpblRocmVhZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1ha2VYTUxIdHRwUmVxdWVzdChyZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEpTT04gPSBmdW5jdGlvbihyZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPE9iamVjdD4pOiBDYW5jZWxhYmxlIHtcbiAgICByZXR1cm4gbWFrZVJlcXVlc3QoZXh0ZW5kKHJlcXVlc3RQYXJhbWV0ZXJzLCB7dHlwZTogJ2pzb24nfSksIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8QXJyYXlCdWZmZXI+KTogQ2FuY2VsYWJsZSB7XG4gICAgcmV0dXJuIG1ha2VSZXF1ZXN0KGV4dGVuZChyZXF1ZXN0UGFyYW1ldGVycywge3R5cGU6ICdhcnJheUJ1ZmZlcid9KSwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0IGNvbnN0IHBvc3REYXRhID0gZnVuY3Rpb24ocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxzdHJpbmc+KTogQ2FuY2VsYWJsZSB7XG4gICAgcmV0dXJuIG1ha2VSZXF1ZXN0KGV4dGVuZChyZXF1ZXN0UGFyYW1ldGVycywge21ldGhvZDogJ1BPU1QnfSksIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhID0gZnVuY3Rpb24ocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxzdHJpbmc+KTogQ2FuY2VsYWJsZSB7XG4gICAgcmV0dXJuIG1ha2VSZXF1ZXN0KGV4dGVuZChyZXF1ZXN0UGFyYW1ldGVycywge21ldGhvZDogJ0dFVCd9KSwgY2FsbGJhY2spO1xufTtcblxuZnVuY3Rpb24gc2FtZU9yaWdpbih1cmwpIHtcbiAgICBjb25zdCBhOiBIVE1MQW5jaG9yRWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIHJldHVybiBhLnByb3RvY29sID09PSB3aW5kb3cuZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgJiYgYS5ob3N0ID09PSB3aW5kb3cuZG9jdW1lbnQubG9jYXRpb24uaG9zdDtcbn1cblxuY29uc3QgdHJhbnNwYXJlbnRQbmdVcmwgPSAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FZQUFBQWZGY1NKQUFBQUMwbEVRVlFZVjJOZ0FBSUFBQVVBQWFyVnlGRUFBQUFBU1VWT1JLNUNZSUk9JztcblxuZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0ltYWdlKGRhdGE6IEFycmF5QnVmZmVyLCBjYWxsYmFjazogQ2FsbGJhY2s8SFRNTEltYWdlRWxlbWVudD4pIHtcbiAgICBjb25zdCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBuZXcgd2luZG93LkltYWdlKCk7XG4gICAgY29uc3QgVVJMID0gd2luZG93LlVSTDtcbiAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBpbWcpO1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGltZy5zcmMpO1xuICAgICAgICAvLyBwcmV2ZW50IGltYWdlIGRhdGFVUkkgbWVtb3J5IGxlYWsgaW4gU2FmYXJpO1xuICAgICAgICAvLyBidXQgZG9uJ3QgZnJlZSB0aGUgaW1hZ2UgaW1tZWRpYXRlbHkgYmVjYXVzZSBpdCBtaWdodCBiZSB1cGxvYWRlZCBpbiB0aGUgbmV4dCBmcmFtZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMTAyMjZcbiAgICAgICAgaW1nLm9ubG9hZCA9IG51bGw7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geyBpbWcuc3JjID0gdHJhbnNwYXJlbnRQbmdVcmw7IH0pO1xuICAgIH07XG4gICAgaW1nLm9uZXJyb3IgPSAoKSA9PiBjYWxsYmFjayhuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGltYWdlLiBQbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSBhIHN1cHBvcnRlZCBpbWFnZSB0eXBlIHN1Y2ggYXMgUE5HIG9yIEpQRUcuIE5vdGUgdGhhdCBTVkdzIGFyZSBub3Qgc3VwcG9ydGVkLicpKTtcbiAgICBjb25zdCBibG9iOiBCbG9iID0gbmV3IHdpbmRvdy5CbG9iKFtuZXcgVWludDhBcnJheShkYXRhKV0sIHt0eXBlOiAnaW1hZ2UvcG5nJ30pO1xuICAgIGltZy5zcmMgPSBkYXRhLmJ5dGVMZW5ndGggPyBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpIDogdHJhbnNwYXJlbnRQbmdVcmw7XG59XG5cbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9JbWFnZUJpdG1hcChkYXRhOiBBcnJheUJ1ZmZlciwgY2FsbGJhY2s6IENhbGxiYWNrPEltYWdlQml0bWFwPikge1xuICAgIGNvbnN0IGJsb2I6IEJsb2IgPSBuZXcgd2luZG93LkJsb2IoW25ldyBVaW50OEFycmF5KGRhdGEpXSwge3R5cGU6ICdpbWFnZS9wbmcnfSk7XG4gICAgd2luZG93LmNyZWF0ZUltYWdlQml0bWFwKGJsb2IpLnRoZW4oKGltZ0JpdG1hcCkgPT4ge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBpbWdCaXRtYXApO1xuICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihgQ291bGQgbm90IGxvYWQgaW1hZ2UgYmVjYXVzZSBvZiAke2UubWVzc2FnZX0uIFBsZWFzZSBtYWtlIHN1cmUgdG8gdXNlIGEgc3VwcG9ydGVkIGltYWdlIHR5cGUgc3VjaCBhcyBQTkcgb3IgSlBFRy4gTm90ZSB0aGF0IFNWR3MgYXJlIG5vdCBzdXBwb3J0ZWQuYCkpO1xuICAgIH0pO1xufVxuXG5sZXQgaW1hZ2VRdWV1ZSwgbnVtSW1hZ2VSZXF1ZXN0cztcbmV4cG9ydCBjb25zdCByZXNldEltYWdlUmVxdWVzdFF1ZXVlID0gKCkgPT4ge1xuICAgIGltYWdlUXVldWUgPSBbXTtcbiAgICBudW1JbWFnZVJlcXVlc3RzID0gMDtcbn07XG5yZXNldEltYWdlUmVxdWVzdFF1ZXVlKCk7XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZSA9IGZ1bmN0aW9uKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8SFRNTEltYWdlRWxlbWVudCB8IEltYWdlQml0bWFwPik6IENhbmNlbGFibGUge1xuICAgIGlmICh3ZWJwU3VwcG9ydGVkLnN1cHBvcnRlZCkge1xuICAgICAgICBpZiAoIXJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0UGFyYW1ldGVycy5oZWFkZXJzLmFjY2VwdCA9ICdpbWFnZS93ZWJwLCovKic7XG4gICAgfVxuXG4gICAgLy8gbGltaXQgY29uY3VycmVudCBpbWFnZSBsb2FkcyB0byBoZWxwIHdpdGggcmFzdGVyIHNvdXJjZXMgcGVyZm9ybWFuY2Ugb24gYmlnIHNjcmVlbnNcbiAgICBpZiAobnVtSW1hZ2VSZXF1ZXN0cyA+PSBjb25maWcuTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZCA9IHtcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICBjYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsKCkgeyB0aGlzLmNhbmNlbGxlZCA9IHRydWU7IH1cbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2VRdWV1ZS5wdXNoKHF1ZXVlZCk7XG4gICAgICAgIHJldHVybiBxdWV1ZWQ7XG4gICAgfVxuICAgIG51bUltYWdlUmVxdWVzdHMrKztcblxuICAgIGxldCBhZHZhbmNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFkdmFuY2VJbWFnZVJlcXVlc3RRdWV1ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGFkdmFuY2VkKSByZXR1cm47XG4gICAgICAgIGFkdmFuY2VkID0gdHJ1ZTtcbiAgICAgICAgbnVtSW1hZ2VSZXF1ZXN0cy0tO1xuICAgICAgICBhc3NlcnQobnVtSW1hZ2VSZXF1ZXN0cyA+PSAwKTtcbiAgICAgICAgd2hpbGUgKGltYWdlUXVldWUubGVuZ3RoICYmIG51bUltYWdlUmVxdWVzdHMgPCBjb25maWcuTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbWFnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBjb25zdCB7cmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrLCBjYW5jZWxsZWR9ID0gcmVxdWVzdDtcbiAgICAgICAgICAgIGlmICghY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5jYW5jZWwgPSBnZXRJbWFnZShyZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2spLmNhbmNlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyByZXF1ZXN0IHRoZSBpbWFnZSB3aXRoIFhIUiB0byB3b3JrIGFyb3VuZCBjYWNoaW5nIGlzc3Vlc1xuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMTQ3MFxuICAgIGNvbnN0IHJlcXVlc3QgPSBnZXRBcnJheUJ1ZmZlcihyZXF1ZXN0UGFyYW1ldGVycywgKGVycjogP0Vycm9yLCBkYXRhOiA/QXJyYXlCdWZmZXIsIGNhY2hlQ29udHJvbDogP3N0cmluZywgZXhwaXJlczogP3N0cmluZykgPT4ge1xuXG4gICAgICAgIGFkdmFuY2VJbWFnZVJlcXVlc3RRdWV1ZSgpO1xuXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5jcmVhdGVJbWFnZUJpdG1hcCkge1xuICAgICAgICAgICAgICAgIGFycmF5QnVmZmVyVG9JbWFnZUJpdG1hcChkYXRhLCAoZXJyLCBpbWdCaXRtYXApID0+IGNhbGxiYWNrKGVyciwgaW1nQml0bWFwLCBjYWNoZUNvbnRyb2wsIGV4cGlyZXMpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJyYXlCdWZmZXJUb0ltYWdlKGRhdGEsIChlcnIsIGltZykgPT4gY2FsbGJhY2soZXJyLCBpbWcsIGNhY2hlQ29udHJvbCwgZXhwaXJlcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICBhZHZhbmNlSW1hZ2VSZXF1ZXN0UXVldWUoKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmlkZW8gPSBmdW5jdGlvbih1cmxzOiBBcnJheTxzdHJpbmc+LCBjYWxsYmFjazogQ2FsbGJhY2s8SFRNTFZpZGVvRWxlbWVudD4pOiBDYW5jZWxhYmxlIHtcbiAgICBjb25zdCB2aWRlbzogSFRNTFZpZGVvRWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLm11dGVkID0gdHJ1ZTtcbiAgICB2aWRlby5vbmxvYWRzdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCB2aWRlbyk7XG4gICAgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgczogSFRNTFNvdXJjZUVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc291cmNlJyk7XG4gICAgICAgIGlmICghc2FtZU9yaWdpbih1cmxzW2ldKSkge1xuICAgICAgICAgICAgdmlkZW8uY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICAgICAgfVxuICAgICAgICBzLnNyYyA9IHVybHNbaV07XG4gICAgICAgIHZpZGVvLmFwcGVuZENoaWxkKHMpO1xuICAgIH1cbiAgICByZXR1cm4ge2NhbmNlbDogKCkgPT4ge319O1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuL3V0aWwuanMnO1xuXG50eXBlIExpc3RlbmVyID0gKE9iamVjdCkgPT4gYW55O1xudHlwZSBMaXN0ZW5lcnMgPSB7W186IHN0cmluZ106IEFycmF5PExpc3RlbmVyPiB9O1xuXG5mdW5jdGlvbiBfYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgbGlzdGVuZXJMaXN0OiBMaXN0ZW5lcnMpIHtcbiAgICBjb25zdCBsaXN0ZW5lckV4aXN0cyA9IGxpc3RlbmVyTGlzdFt0eXBlXSAmJiBsaXN0ZW5lckxpc3RbdHlwZV0uaW5kZXhPZihsaXN0ZW5lcikgIT09IC0xO1xuICAgIGlmICghbGlzdGVuZXJFeGlzdHMpIHtcbiAgICAgICAgbGlzdGVuZXJMaXN0W3R5cGVdID0gbGlzdGVuZXJMaXN0W3R5cGVdIHx8IFtdO1xuICAgICAgICBsaXN0ZW5lckxpc3RbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgbGlzdGVuZXJMaXN0OiBMaXN0ZW5lcnMpIHtcbiAgICBpZiAobGlzdGVuZXJMaXN0ICYmIGxpc3RlbmVyTGlzdFt0eXBlXSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVyTGlzdFt0eXBlXS5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGlzdGVuZXJMaXN0W3R5cGVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudCB7XG4gICAgK3R5cGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgZGF0YTogT2JqZWN0ID0ge30pIHtcbiAgICAgICAgZXh0ZW5kKHRoaXMsIGRhdGEpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIEVycm9yTGlrZSB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBlcnJvcjogRXJyb3JMaWtlO1xuXG4gICAgY29uc3RydWN0b3IoZXJyb3I6IEVycm9yTGlrZSwgZGF0YTogT2JqZWN0ID0ge30pIHtcbiAgICAgICAgc3VwZXIoJ2Vycm9yJywgZXh0ZW5kKHtlcnJvcn0sIGRhdGEpKTtcbiAgICB9XG59XG5cbi8qKlxuICogYEV2ZW50ZWRgIG1peGVzIG1ldGhvZHMgaW50byBvdGhlciBjbGFzc2VzIGZvciBldmVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogVW5sZXNzIHlvdSBhcmUgZGV2ZWxvcGluZyBhIHBsdWdpbiB5b3Ugd2lsbCBtb3N0IGxpa2VseSB1c2UgdGhlc2UgbWV0aG9kcyB0aHJvdWdoIGNsYXNzZXMgbGlrZSBgTWFwYCBvciBgUG9wdXBgLlxuICpcbiAqIEZvciBsaXN0cyBvZiBldmVudHMgeW91IGNhbiBsaXN0ZW4gZm9yLCBzZWUgQVBJIGRvY3VtZW50YXRpb24gZm9yIHNwZWNpZmljIGNsYXNzZXM6IFtgTWFwYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpLCBbYE1hcmtlcmBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKSwgW2BQb3B1cGBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKSwgYW5kIFtgR2VvbG9jYXRpb25Db250cm9sYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpLlxuICpcbiAqIEBtaXhpbiBFdmVudGVkXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudGVkIHtcbiAgICBfbGlzdGVuZXJzOiBMaXN0ZW5lcnM7XG4gICAgX29uZVRpbWVMaXN0ZW5lcnM6IExpc3RlbmVycztcbiAgICBfZXZlbnRlZFBhcmVudDogP0V2ZW50ZWQ7XG4gICAgX2V2ZW50ZWRQYXJlbnREYXRhOiA/KE9iamVjdCB8ICgpID0+IE9iamVjdCk7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gYSBzcGVjaWZpZWQgZXZlbnQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIGFkZCBhIGxpc3RlbiBmb3IuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC5cbiAgICAgKiAgIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIGBmaXJlYCxcbiAgICAgKiAgIGV4dGVuZGVkIHdpdGggYHRhcmdldGAgYW5kIGB0eXBlYCBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICovXG4gICAgb24odHlwZTogKiwgbGlzdGVuZXI6IExpc3RlbmVyKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycyB8fCB7fTtcbiAgICAgICAgX2FkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXMuX2xpc3RlbmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKi9cbiAgICBvZmYodHlwZTogKiwgbGlzdGVuZXI6IExpc3RlbmVyKSB7XG4gICAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB0aGlzLl9saXN0ZW5lcnMpO1xuICAgICAgICBfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fb25lVGltZUxpc3RlbmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIHRvIGEgc3BlY2lmaWVkIGV2ZW50IHR5cGUuXG4gICAgICpcbiAgICAgKiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgZmlyc3QgdGltZSB0aGUgZXZlbnQgZmlyZXMgYWZ0ZXIgdGhlIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBsaXN0ZW4gZm9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIChPcHRpb25hbCkgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBmaXJlZCBvbmNlLlxuICAgICAqICAgSWYgbm90IHByb3ZpZGVkLCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQgb25jZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGB0aGlzYCB8IFByb21pc2UuXG4gICAgICovXG4gICAgb25jZSh0eXBlOiAqLCBsaXN0ZW5lcj86IExpc3RlbmVyKTogdGhpcyB8IFByb21pc2U8RXZlbnQ+IHtcbiAgICAgICAgaWYgKCFsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gdGhpcy5vbmNlKHR5cGUsIHJlc29sdmUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMgPSB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzIHx8IHt9O1xuICAgICAgICBfYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fb25lVGltZUxpc3RlbmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZmlyZShldmVudDogRXZlbnQsIHByb3BlcnRpZXM/OiBPYmplY3QpIHtcbiAgICAgICAgLy8gQ29tcGF0aWJpbGl0eSB3aXRoICh0eXBlOiBzdHJpbmcsIHByb3BlcnRpZXM6IE9iamVjdCkgc2lnbmF0dXJlIGZyb20gcHJldmlvdXMgdmVyc2lvbnMuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNjUyMixcbiAgICAgICAgLy8gICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWRyYXcvaXNzdWVzLzc2NlxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoZXZlbnQsIHByb3BlcnRpZXMgfHwge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHlwZSA9IGV2ZW50LnR5cGU7XG5cbiAgICAgICAgaWYgKHRoaXMubGlzdGVucyh0eXBlKSkge1xuICAgICAgICAgICAgKGV2ZW50OiBhbnkpLnRhcmdldCA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBhZGRpbmcgb3IgcmVtb3ZpbmcgbGlzdGVuZXJzIGluc2lkZSBvdGhlciBsaXN0ZW5lcnMgd29uJ3QgY2F1c2UgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzICYmIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSA/IHRoaXMuX2xpc3RlbmVyc1t0eXBlXS5zbGljZSgpIDogW107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG9uZVRpbWVMaXN0ZW5lcnMgPSB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzICYmIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbdHlwZV0gPyB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3R5cGVdLnNsaWNlKCkgOiBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2Ygb25lVGltZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzKTtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fZXZlbnRlZFBhcmVudDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBleHRlbmQoXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5fZXZlbnRlZFBhcmVudERhdGEgPT09ICdmdW5jdGlvbicgPyB0aGlzLl9ldmVudGVkUGFyZW50RGF0YSgpIDogdGhpcy5fZXZlbnRlZFBhcmVudERhdGFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBhcmVudC5maXJlKGV2ZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAvLyBUbyBlbnN1cmUgdGhhdCBubyBlcnJvciBldmVudHMgYXJlIGRyb3BwZWQsIHByaW50IHRoZW0gdG8gdGhlXG4gICAgICAgIC8vIGNvbnNvbGUgaWYgdGhleSBoYXZlIG5vIGxpc3RlbmVycy5cbiAgICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIEVycm9yRXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdGFuY2Ugb2YgRXZlbnRlZCBvciBhbnkgZm9yd2FyZGVkIGluc3RhbmNlcyBvZiBFdmVudGVkIGhhdmUgYSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSByZWdpc3RlcmVkIGxpc3RlbmVyIGZvciBzcGVjaWZpZWQgZXZlbnQgdHlwZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsaXN0ZW5zKHR5cGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gISEoXG4gICAgICAgICAgICAodGhpcy5fbGlzdGVuZXJzICYmIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSAmJiB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICh0aGlzLl9vbmVUaW1lTGlzdGVuZXJzICYmIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbdHlwZV0gJiYgdGhpcy5fb25lVGltZUxpc3RlbmVyc1t0eXBlXS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgKHRoaXMuX2V2ZW50ZWRQYXJlbnQgJiYgdGhpcy5fZXZlbnRlZFBhcmVudC5saXN0ZW5zKHR5cGUpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1YmJsZSBhbGwgZXZlbnRzIGZpcmVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgRXZlbnRlZCB0byB0aGlzIHBhcmVudCBpbnN0YW5jZSBvZiBFdmVudGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXRFdmVudGVkUGFyZW50KHBhcmVudDogP0V2ZW50ZWQsIGRhdGE/OiBPYmplY3QgfCAoKSA9PiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRlZFBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5fZXZlbnRlZFBhcmVudERhdGEgPSBkYXRhO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbi8vIE5vdGU6IERvIG5vdCBpbmhlcml0IGZyb20gRXJyb3IuIEl0IGJyZWFrcyB3aGVuIHRyYW5zcGlsaW5nIHRvIEVTNS5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgaWRlbnRpZmllcjogP3N0cmluZztcbiAgICBsaW5lOiA/bnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3Ioa2V5OiA/c3RyaW5nLCB2YWx1ZTogP3sgX19saW5lX186IG51bWJlciB9LCBtZXNzYWdlOiBzdHJpbmcsIGlkZW50aWZpZXI6ID9zdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gKGtleSA/IGAke2tleX06IGAgOiAnJykgKyBtZXNzYWdlO1xuICAgICAgICBpZiAoaWRlbnRpZmllcikgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcblxuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5fX2xpbmVfXykge1xuICAgICAgICAgICAgdGhpcy5saW5lID0gdmFsdWUuX19saW5lX187XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQ29uc3RhbnRzKG9wdGlvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBjb25zdGFudHMgPSBvcHRpb25zLnZhbHVlO1xuXG4gICAgaWYgKGNvbnN0YW50cykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBjb25zdGFudHMsICdjb25zdGFudHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYXMgb2YgdjgnKV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChvdXRwdXQ6IGFueSwgLi4uaW5wdXRzOiBBcnJheTxhbnk+KSB7XG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBpbnB1dHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrIGluIGlucHV0KSB7XG4gICAgICAgICAgICBvdXRwdXRba10gPSBpbnB1dFtrXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIiwiLy8gQGZsb3dcblxuLy8gVHVybiBqc29ubGludC1saW5lcy1wcmltaXRpdmVzIG9iamVjdHMgaW50byBwcmltaXRpdmUgb2JqZWN0c1xuZXhwb3J0IGZ1bmN0aW9uIHVuYnVuZGxlKHZhbHVlOiBtaXhlZCkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlciB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlT2YoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFVuYnVuZGxlKHZhbHVlOiBtaXhlZCk6IG1peGVkIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChkZWVwVW5idW5kbGUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlciB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pKSB7XG4gICAgICAgIGNvbnN0IHVuYnVuZGxlZFZhbHVlOiB7IFtrZXk6IHN0cmluZ106IG1peGVkIH0gPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHVuYnVuZGxlZFZhbHVlW2tleV0gPSBkZWVwVW5idW5kbGUodmFsdWVba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuYnVuZGxlZFZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB1bmJ1bmRsZSh2YWx1ZSk7XG59XG4iLCIvLyBAZmxvd1xuXG5jbGFzcyBQYXJzaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKGtleTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFyc2luZ0Vycm9yO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4vZXhwcmVzc2lvbi5qcyc7XG5cbi8qKlxuICogVHJhY2tzIGBsZXRgIGJpbmRpbmdzIGR1cmluZyBleHByZXNzaW9uIHBhcnNpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTY29wZSB7XG4gICAgcGFyZW50OiA/U2NvcGU7XG4gICAgYmluZGluZ3M6IHtbXzogc3RyaW5nXTogRXhwcmVzc2lvbn07XG4gICAgY29uc3RydWN0b3IocGFyZW50PzogU2NvcGUsIGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4gPSBbXSkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBleHByZXNzaW9uXSBvZiBiaW5kaW5ncykge1xuICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1tuYW1lXSA9IGV4cHJlc3Npb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25jYXQoYmluZGluZ3M6IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPikge1xuICAgICAgICByZXR1cm4gbmV3IFNjb3BlKHRoaXMsIGJpbmRpbmdzKTtcbiAgICB9XG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogRXhwcmVzc2lvbiB7XG4gICAgICAgIGlmICh0aGlzLmJpbmRpbmdzW25hbWVdKSB7IHJldHVybiB0aGlzLmJpbmRpbmdzW25hbWVdOyB9XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkgeyByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0KG5hbWUpOyB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtuYW1lfSBub3QgZm91bmQgaW4gc2NvcGUuYCk7XG4gICAgfVxuXG4gICAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5iaW5kaW5nc1tuYW1lXSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmhhcyhuYW1lKSA6IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2NvcGU7XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgdHlwZSBOdWxsVHlwZVQgPSB7IGtpbmQ6ICdudWxsJyB9O1xuZXhwb3J0IHR5cGUgTnVtYmVyVHlwZVQgPSB7IGtpbmQ6ICdudW1iZXInIH07XG5leHBvcnQgdHlwZSBTdHJpbmdUeXBlVCA9IHsga2luZDogJ3N0cmluZycgfTtcbmV4cG9ydCB0eXBlIEJvb2xlYW5UeXBlVCA9IHsga2luZDogJ2Jvb2xlYW4nIH07XG5leHBvcnQgdHlwZSBDb2xvclR5cGVUID0geyBraW5kOiAnY29sb3InIH07XG5leHBvcnQgdHlwZSBPYmplY3RUeXBlVCA9IHsga2luZDogJ29iamVjdCcgfTtcbmV4cG9ydCB0eXBlIFZhbHVlVHlwZVQgPSB7IGtpbmQ6ICd2YWx1ZScgfTtcbmV4cG9ydCB0eXBlIEVycm9yVHlwZVQgPSB7IGtpbmQ6ICdlcnJvcicgfTtcbmV4cG9ydCB0eXBlIENvbGxhdG9yVHlwZVQgPSB7IGtpbmQ6ICdjb2xsYXRvcicgfTtcbmV4cG9ydCB0eXBlIEZvcm1hdHRlZFR5cGVUID0geyBraW5kOiAnZm9ybWF0dGVkJyB9O1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZVR5cGVUID0geyBraW5kOiAncmVzb2x2ZWRJbWFnZScgfTtcblxuZXhwb3J0IHR5cGUgRXZhbHVhdGlvbktpbmQgPSAnY29uc3RhbnQnIHwgJ3NvdXJjZScgfCAnY2FtZXJhJyB8ICdjb21wb3NpdGUnO1xuXG5leHBvcnQgdHlwZSBUeXBlID1cbiAgICBOdWxsVHlwZVQgfFxuICAgIE51bWJlclR5cGVUIHxcbiAgICBTdHJpbmdUeXBlVCB8XG4gICAgQm9vbGVhblR5cGVUIHxcbiAgICBDb2xvclR5cGVUIHxcbiAgICBPYmplY3RUeXBlVCB8XG4gICAgVmFsdWVUeXBlVCB8XG4gICAgQXJyYXlUeXBlIHwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIEVycm9yVHlwZVQgfFxuICAgIENvbGxhdG9yVHlwZVQgfFxuICAgIEZvcm1hdHRlZFR5cGVUIHxcbiAgICBSZXNvbHZlZEltYWdlVHlwZVRcblxuZXhwb3J0IHR5cGUgQXJyYXlUeXBlID0ge1xuICAgIGtpbmQ6ICdhcnJheScsXG4gICAgaXRlbVR5cGU6IFR5cGUsXG4gICAgTjogP251bWJlclxufVxuXG5leHBvcnQgdHlwZSBOYXRpdmVUeXBlID0gJ251bWJlcicgfCAnc3RyaW5nJyB8ICdib29sZWFuJyB8ICdudWxsJyB8ICdhcnJheScgfCAnb2JqZWN0J1xuXG5leHBvcnQgY29uc3QgTnVsbFR5cGUgPSB7a2luZDogJ251bGwnfTtcbmV4cG9ydCBjb25zdCBOdW1iZXJUeXBlID0ge2tpbmQ6ICdudW1iZXInfTtcbmV4cG9ydCBjb25zdCBTdHJpbmdUeXBlID0ge2tpbmQ6ICdzdHJpbmcnfTtcbmV4cG9ydCBjb25zdCBCb29sZWFuVHlwZSA9IHtraW5kOiAnYm9vbGVhbid9O1xuZXhwb3J0IGNvbnN0IENvbG9yVHlwZSA9IHtraW5kOiAnY29sb3InfTtcbmV4cG9ydCBjb25zdCBPYmplY3RUeXBlID0ge2tpbmQ6ICdvYmplY3QnfTtcbmV4cG9ydCBjb25zdCBWYWx1ZVR5cGUgPSB7a2luZDogJ3ZhbHVlJ307XG5leHBvcnQgY29uc3QgRXJyb3JUeXBlID0ge2tpbmQ6ICdlcnJvcid9O1xuZXhwb3J0IGNvbnN0IENvbGxhdG9yVHlwZSA9IHtraW5kOiAnY29sbGF0b3InfTtcbmV4cG9ydCBjb25zdCBGb3JtYXR0ZWRUeXBlID0ge2tpbmQ6ICdmb3JtYXR0ZWQnfTtcbmV4cG9ydCBjb25zdCBSZXNvbHZlZEltYWdlVHlwZSA9IHtraW5kOiAncmVzb2x2ZWRJbWFnZSd9O1xuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXkoaXRlbVR5cGU6IFR5cGUsIE46ID9udW1iZXIpOiBBcnJheVR5cGUge1xuICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6ICdhcnJheScsXG4gICAgICAgIGl0ZW1UeXBlLFxuICAgICAgICBOXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3RyaW5nKHR5cGU6IFR5cGUpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICAgICAgY29uc3QgaXRlbVR5cGUgPSB0b1N0cmluZyh0eXBlLml0ZW1UeXBlKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0eXBlLk4gPT09ICdudW1iZXInID9cbiAgICAgICAgICAgIGBhcnJheTwke2l0ZW1UeXBlfSwgJHt0eXBlLk59PmAgOlxuICAgICAgICAgICAgdHlwZS5pdGVtVHlwZS5raW5kID09PSAndmFsdWUnID8gJ2FycmF5JyA6IGBhcnJheTwke2l0ZW1UeXBlfT5gO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0eXBlLmtpbmQ7XG4gICAgfVxufVxuXG5jb25zdCB2YWx1ZU1lbWJlclR5cGVzID0gW1xuICAgIE51bGxUeXBlLFxuICAgIE51bWJlclR5cGUsXG4gICAgU3RyaW5nVHlwZSxcbiAgICBCb29sZWFuVHlwZSxcbiAgICBDb2xvclR5cGUsXG4gICAgRm9ybWF0dGVkVHlwZSxcbiAgICBPYmplY3RUeXBlLFxuICAgIGFycmF5KFZhbHVlVHlwZSksXG4gICAgUmVzb2x2ZWRJbWFnZVR5cGVcbl07XG5cbi8qKlxuICogUmV0dXJucyBudWxsIGlmIGB0YCBpcyBhIHN1YnR5cGUgb2YgYGV4cGVjdGVkYDsgb3RoZXJ3aXNlIHJldHVybnMgYW5cbiAqIGVycm9yIG1lc3NhZ2UuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTdWJ0eXBlKGV4cGVjdGVkOiBUeXBlLCB0OiBUeXBlKTogP3N0cmluZyB7XG4gICAgaWYgKHQua2luZCA9PT0gJ2Vycm9yJykge1xuICAgICAgICAvLyBFcnJvciBpcyBhIHN1YnR5cGUgb2YgZXZlcnkgdHlwZVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGV4cGVjdGVkLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICAgICAgaWYgKHQua2luZCA9PT0gJ2FycmF5JyAmJlxuICAgICAgICAgICAgKCh0Lk4gPT09IDAgJiYgdC5pdGVtVHlwZS5raW5kID09PSAndmFsdWUnKSB8fCAhY2hlY2tTdWJ0eXBlKGV4cGVjdGVkLml0ZW1UeXBlLCB0Lml0ZW1UeXBlKSkgJiZcbiAgICAgICAgICAgICh0eXBlb2YgZXhwZWN0ZWQuTiAhPT0gJ251bWJlcicgfHwgZXhwZWN0ZWQuTiA9PT0gdC5OKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGVjdGVkLmtpbmQgPT09IHQua2luZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGV4cGVjdGVkLmtpbmQgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgZm9yIChjb25zdCBtZW1iZXJUeXBlIG9mIHZhbHVlTWVtYmVyVHlwZXMpIHtcbiAgICAgICAgICAgIGlmICghY2hlY2tTdWJ0eXBlKG1lbWJlclR5cGUsIHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYEV4cGVjdGVkICR7dG9TdHJpbmcoZXhwZWN0ZWQpfSBidXQgZm91bmQgJHt0b1N0cmluZyh0KX0gaW5zdGVhZC5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFR5cGUocHJvdmlkZWQ6IFR5cGUsIGFsbG93ZWRUeXBlczogQXJyYXk8VHlwZT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gYWxsb3dlZFR5cGVzLnNvbWUodCA9PiB0LmtpbmQgPT09IHByb3ZpZGVkLmtpbmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE5hdGl2ZVR5cGUocHJvdmlkZWQ6IGFueSwgYWxsb3dlZFR5cGVzOiBBcnJheTxOYXRpdmVUeXBlPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhbGxvd2VkVHlwZXMuc29tZSh0ID0+IHtcbiAgICAgICAgaWYgKHQgPT09ICdudWxsJykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVkID09PSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKHQgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHByb3ZpZGVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVkICYmICFBcnJheS5pc0FycmF5KHByb3ZpZGVkKSAmJiB0eXBlb2YgcHJvdmlkZWQgPT09ICdvYmplY3QnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHQgPT09IHR5cGVvZiBwcm92aWRlZDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwiLy8gKGMpIERlYW4gTWNOYW1lZSA8ZGVhbkBnbWFpbC5jb20+LCAyMDEyLlxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWFubS9jc3MtY29sb3ItcGFyc2VyLWpzXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbi8vIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1Ncbi8vIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci9cbnZhciBrQ1NTQ29sb3JUYWJsZSA9IHtcbiAgXCJ0cmFuc3BhcmVudFwiOiBbMCwwLDAsMF0sIFwiYWxpY2VibHVlXCI6IFsyNDAsMjQ4LDI1NSwxXSxcbiAgXCJhbnRpcXVld2hpdGVcIjogWzI1MCwyMzUsMjE1LDFdLCBcImFxdWFcIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJhcXVhbWFyaW5lXCI6IFsxMjcsMjU1LDIxMiwxXSwgXCJhenVyZVwiOiBbMjQwLDI1NSwyNTUsMV0sXG4gIFwiYmVpZ2VcIjogWzI0NSwyNDUsMjIwLDFdLCBcImJpc3F1ZVwiOiBbMjU1LDIyOCwxOTYsMV0sXG4gIFwiYmxhY2tcIjogWzAsMCwwLDFdLCBcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsMjM1LDIwNSwxXSxcbiAgXCJibHVlXCI6IFswLDAsMjU1LDFdLCBcImJsdWV2aW9sZXRcIjogWzEzOCw0MywyMjYsMV0sXG4gIFwiYnJvd25cIjogWzE2NSw0Miw0MiwxXSwgXCJidXJseXdvb2RcIjogWzIyMiwxODQsMTM1LDFdLFxuICBcImNhZGV0Ymx1ZVwiOiBbOTUsMTU4LDE2MCwxXSwgXCJjaGFydHJldXNlXCI6IFsxMjcsMjU1LDAsMV0sXG4gIFwiY2hvY29sYXRlXCI6IFsyMTAsMTA1LDMwLDFdLCBcImNvcmFsXCI6IFsyNTUsMTI3LDgwLDFdLFxuICBcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsMTQ5LDIzNywxXSwgXCJjb3Juc2lsa1wiOiBbMjU1LDI0OCwyMjAsMV0sXG4gIFwiY3JpbXNvblwiOiBbMjIwLDIwLDYwLDFdLCBcImN5YW5cIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJkYXJrYmx1ZVwiOiBbMCwwLDEzOSwxXSwgXCJkYXJrY3lhblwiOiBbMCwxMzksMTM5LDFdLFxuICBcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwxMzQsMTEsMV0sIFwiZGFya2dyYXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtncmVlblwiOiBbMCwxMDAsMCwxXSwgXCJkYXJrZ3JleVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2toYWtpXCI6IFsxODksMTgzLDEwNywxXSwgXCJkYXJrbWFnZW50YVwiOiBbMTM5LDAsMTM5LDFdLFxuICBcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwxMDcsNDcsMV0sIFwiZGFya29yYW5nZVwiOiBbMjU1LDE0MCwwLDFdLFxuICBcImRhcmtvcmNoaWRcIjogWzE1Myw1MCwyMDQsMV0sIFwiZGFya3JlZFwiOiBbMTM5LDAsMCwxXSxcbiAgXCJkYXJrc2FsbW9uXCI6IFsyMzMsMTUwLDEyMiwxXSwgXCJkYXJrc2VhZ3JlZW5cIjogWzE0MywxODgsMTQzLDFdLFxuICBcImRhcmtzbGF0ZWJsdWVcIjogWzcyLDYxLDEzOSwxXSwgXCJkYXJrc2xhdGVncmF5XCI6IFs0Nyw3OSw3OSwxXSxcbiAgXCJkYXJrc2xhdGVncmV5XCI6IFs0Nyw3OSw3OSwxXSwgXCJkYXJrdHVycXVvaXNlXCI6IFswLDIwNiwyMDksMV0sXG4gIFwiZGFya3Zpb2xldFwiOiBbMTQ4LDAsMjExLDFdLCBcImRlZXBwaW5rXCI6IFsyNTUsMjAsMTQ3LDFdLFxuICBcImRlZXBza3libHVlXCI6IFswLDE5MSwyNTUsMV0sIFwiZGltZ3JheVwiOiBbMTA1LDEwNSwxMDUsMV0sXG4gIFwiZGltZ3JleVwiOiBbMTA1LDEwNSwxMDUsMV0sIFwiZG9kZ2VyYmx1ZVwiOiBbMzAsMTQ0LDI1NSwxXSxcbiAgXCJmaXJlYnJpY2tcIjogWzE3OCwzNCwzNCwxXSwgXCJmbG9yYWx3aGl0ZVwiOiBbMjU1LDI1MCwyNDAsMV0sXG4gIFwiZm9yZXN0Z3JlZW5cIjogWzM0LDEzOSwzNCwxXSwgXCJmdWNoc2lhXCI6IFsyNTUsMCwyNTUsMV0sXG4gIFwiZ2FpbnNib3JvXCI6IFsyMjAsMjIwLDIyMCwxXSwgXCJnaG9zdHdoaXRlXCI6IFsyNDgsMjQ4LDI1NSwxXSxcbiAgXCJnb2xkXCI6IFsyNTUsMjE1LDAsMV0sIFwiZ29sZGVucm9kXCI6IFsyMTgsMTY1LDMyLDFdLFxuICBcImdyYXlcIjogWzEyOCwxMjgsMTI4LDFdLCBcImdyZWVuXCI6IFswLDEyOCwwLDFdLFxuICBcImdyZWVueWVsbG93XCI6IFsxNzMsMjU1LDQ3LDFdLCBcImdyZXlcIjogWzEyOCwxMjgsMTI4LDFdLFxuICBcImhvbmV5ZGV3XCI6IFsyNDAsMjU1LDI0MCwxXSwgXCJob3RwaW5rXCI6IFsyNTUsMTA1LDE4MCwxXSxcbiAgXCJpbmRpYW5yZWRcIjogWzIwNSw5Miw5MiwxXSwgXCJpbmRpZ29cIjogWzc1LDAsMTMwLDFdLFxuICBcIml2b3J5XCI6IFsyNTUsMjU1LDI0MCwxXSwgXCJraGFraVwiOiBbMjQwLDIzMCwxNDAsMV0sXG4gIFwibGF2ZW5kZXJcIjogWzIzMCwyMzAsMjUwLDFdLCBcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwyNDAsMjQ1LDFdLFxuICBcImxhd25ncmVlblwiOiBbMTI0LDI1MiwwLDFdLCBcImxlbW9uY2hpZmZvblwiOiBbMjU1LDI1MCwyMDUsMV0sXG4gIFwibGlnaHRibHVlXCI6IFsxNzMsMjE2LDIzMCwxXSwgXCJsaWdodGNvcmFsXCI6IFsyNDAsMTI4LDEyOCwxXSxcbiAgXCJsaWdodGN5YW5cIjogWzIyNCwyNTUsMjU1LDFdLCBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsMjUwLDIxMCwxXSxcbiAgXCJsaWdodGdyYXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0Z3JlZW5cIjogWzE0NCwyMzgsMTQ0LDFdLFxuICBcImxpZ2h0Z3JleVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRwaW5rXCI6IFsyNTUsMTgyLDE5MywxXSxcbiAgXCJsaWdodHNhbG1vblwiOiBbMjU1LDE2MCwxMjIsMV0sIFwibGlnaHRzZWFncmVlblwiOiBbMzIsMTc4LDE3MCwxXSxcbiAgXCJsaWdodHNreWJsdWVcIjogWzEzNSwyMDYsMjUwLDFdLCBcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksMTM2LDE1MywxXSxcbiAgXCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LDEzNiwxNTMsMV0sIFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwxOTYsMjIyLDFdLFxuICBcImxpZ2h0eWVsbG93XCI6IFsyNTUsMjU1LDIyNCwxXSwgXCJsaW1lXCI6IFswLDI1NSwwLDFdLFxuICBcImxpbWVncmVlblwiOiBbNTAsMjA1LDUwLDFdLCBcImxpbmVuXCI6IFsyNTAsMjQwLDIzMCwxXSxcbiAgXCJtYWdlbnRhXCI6IFsyNTUsMCwyNTUsMV0sIFwibWFyb29uXCI6IFsxMjgsMCwwLDFdLFxuICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwyMDUsMTcwLDFdLCBcIm1lZGl1bWJsdWVcIjogWzAsMCwyMDUsMV0sXG4gIFwibWVkaXVtb3JjaGlkXCI6IFsxODYsODUsMjExLDFdLCBcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LDExMiwyMTksMV0sXG4gIFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLDE3OSwxMTMsMV0sIFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsMTA0LDIzOCwxXSxcbiAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwyNTAsMTU0LDFdLCBcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsMjA5LDIwNCwxXSxcbiAgXCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwyMSwxMzMsMV0sIFwibWlkbmlnaHRibHVlXCI6IFsyNSwyNSwxMTIsMV0sXG4gIFwibWludGNyZWFtXCI6IFsyNDUsMjU1LDI1MCwxXSwgXCJtaXN0eXJvc2VcIjogWzI1NSwyMjgsMjI1LDFdLFxuICBcIm1vY2Nhc2luXCI6IFsyNTUsMjI4LDE4MSwxXSwgXCJuYXZham93aGl0ZVwiOiBbMjU1LDIyMiwxNzMsMV0sXG4gIFwibmF2eVwiOiBbMCwwLDEyOCwxXSwgXCJvbGRsYWNlXCI6IFsyNTMsMjQ1LDIzMCwxXSxcbiAgXCJvbGl2ZVwiOiBbMTI4LDEyOCwwLDFdLCBcIm9saXZlZHJhYlwiOiBbMTA3LDE0MiwzNSwxXSxcbiAgXCJvcmFuZ2VcIjogWzI1NSwxNjUsMCwxXSwgXCJvcmFuZ2VyZWRcIjogWzI1NSw2OSwwLDFdLFxuICBcIm9yY2hpZFwiOiBbMjE4LDExMiwyMTQsMV0sIFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LDIzMiwxNzAsMV0sXG4gIFwicGFsZWdyZWVuXCI6IFsxNTIsMjUxLDE1MiwxXSwgXCJwYWxldHVycXVvaXNlXCI6IFsxNzUsMjM4LDIzOCwxXSxcbiAgXCJwYWxldmlvbGV0cmVkXCI6IFsyMTksMTEyLDE0NywxXSwgXCJwYXBheWF3aGlwXCI6IFsyNTUsMjM5LDIxMywxXSxcbiAgXCJwZWFjaHB1ZmZcIjogWzI1NSwyMTgsMTg1LDFdLCBcInBlcnVcIjogWzIwNSwxMzMsNjMsMV0sXG4gIFwicGlua1wiOiBbMjU1LDE5MiwyMDMsMV0sIFwicGx1bVwiOiBbMjIxLDE2MCwyMjEsMV0sXG4gIFwicG93ZGVyYmx1ZVwiOiBbMTc2LDIyNCwyMzAsMV0sIFwicHVycGxlXCI6IFsxMjgsMCwxMjgsMV0sXG4gIFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLDUxLDE1MywxXSxcbiAgXCJyZWRcIjogWzI1NSwwLDAsMV0sIFwicm9zeWJyb3duXCI6IFsxODgsMTQzLDE0MywxXSxcbiAgXCJyb3lhbGJsdWVcIjogWzY1LDEwNSwyMjUsMV0sIFwic2FkZGxlYnJvd25cIjogWzEzOSw2OSwxOSwxXSxcbiAgXCJzYWxtb25cIjogWzI1MCwxMjgsMTE0LDFdLCBcInNhbmR5YnJvd25cIjogWzI0NCwxNjQsOTYsMV0sXG4gIFwic2VhZ3JlZW5cIjogWzQ2LDEzOSw4NywxXSwgXCJzZWFzaGVsbFwiOiBbMjU1LDI0NSwyMzgsMV0sXG4gIFwic2llbm5hXCI6IFsxNjAsODIsNDUsMV0sIFwic2lsdmVyXCI6IFsxOTIsMTkyLDE5MiwxXSxcbiAgXCJza3libHVlXCI6IFsxMzUsMjA2LDIzNSwxXSwgXCJzbGF0ZWJsdWVcIjogWzEwNiw5MCwyMDUsMV0sXG4gIFwic2xhdGVncmF5XCI6IFsxMTIsMTI4LDE0NCwxXSwgXCJzbGF0ZWdyZXlcIjogWzExMiwxMjgsMTQ0LDFdLFxuICBcInNub3dcIjogWzI1NSwyNTAsMjUwLDFdLCBcInNwcmluZ2dyZWVuXCI6IFswLDI1NSwxMjcsMV0sXG4gIFwic3RlZWxibHVlXCI6IFs3MCwxMzAsMTgwLDFdLCBcInRhblwiOiBbMjEwLDE4MCwxNDAsMV0sXG4gIFwidGVhbFwiOiBbMCwxMjgsMTI4LDFdLCBcInRoaXN0bGVcIjogWzIxNiwxOTEsMjE2LDFdLFxuICBcInRvbWF0b1wiOiBbMjU1LDk5LDcxLDFdLCBcInR1cnF1b2lzZVwiOiBbNjQsMjI0LDIwOCwxXSxcbiAgXCJ2aW9sZXRcIjogWzIzOCwxMzAsMjM4LDFdLCBcIndoZWF0XCI6IFsyNDUsMjIyLDE3OSwxXSxcbiAgXCJ3aGl0ZVwiOiBbMjU1LDI1NSwyNTUsMV0sIFwid2hpdGVzbW9rZVwiOiBbMjQ1LDI0NSwyNDUsMV0sXG4gIFwieWVsbG93XCI6IFsyNTUsMjU1LDAsMV0sIFwieWVsbG93Z3JlZW5cIjogWzE1NCwyMDUsNTAsMV19XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19ieXRlKGkpIHsgIC8vIENsYW1wIHRvIGludGVnZXIgMCAuLiAyNTUuXG4gIGkgPSBNYXRoLnJvdW5kKGkpOyAgLy8gU2VlbXMgdG8gYmUgd2hhdCBDaHJvbWUgZG9lcyAodnMgdHJ1bmNhdGlvbikuXG4gIHJldHVybiBpIDwgMCA/IDAgOiBpID4gMjU1ID8gMjU1IDogaTtcbn1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2Zsb2F0KGYpIHsgIC8vIENsYW1wIHRvIGZsb2F0IDAuMCAuLiAxLjAuXG4gIHJldHVybiBmIDwgMCA/IDAgOiBmID4gMSA/IDEgOiBmO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfaW50KHN0cikgeyAgLy8gaW50IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlRmxvYXQoc3RyKSAvIDEwMCAqIDI1NSk7XG4gIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUludChzdHIpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2Zsb2F0KHN0cikgeyAgLy8gZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSAvIDEwMCk7XG4gIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpKTtcbn1cblxuZnVuY3Rpb24gY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSB7XG4gIGlmIChoIDwgMCkgaCArPSAxO1xuICBlbHNlIGlmIChoID4gMSkgaCAtPSAxO1xuXG4gIGlmIChoICogNiA8IDEpIHJldHVybiBtMSArIChtMiAtIG0xKSAqIGggKiA2O1xuICBpZiAoaCAqIDIgPCAxKSByZXR1cm4gbTI7XG4gIGlmIChoICogMyA8IDIpIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyLzMgLSBoKSAqIDY7XG4gIHJldHVybiBtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDU1NDb2xvcihjc3Nfc3RyKSB7XG4gIC8vIFJlbW92ZSBhbGwgd2hpdGVzcGFjZSwgbm90IGNvbXBsaWFudCwgYnV0IHNob3VsZCBqdXN0IGJlIG1vcmUgYWNjZXB0aW5nLlxuICB2YXIgc3RyID0gY3NzX3N0ci5yZXBsYWNlKC8gL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIENvbG9yIGtleXdvcmRzIChhbmQgdHJhbnNwYXJlbnQpIGxvb2t1cC5cbiAgaWYgKHN0ciBpbiBrQ1NTQ29sb3JUYWJsZSkgcmV0dXJuIGtDU1NDb2xvclRhYmxlW3N0cl0uc2xpY2UoKTsgIC8vIGR1cC5cblxuICAvLyAjYWJjIGFuZCAjYWJjMTIzIHN5bnRheC5cbiAgaWYgKHN0clswXSA9PT0gJyMnKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDQpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKChpdiAmIDB4ZjAwKSA+PiA0KSB8ICgoaXYgJiAweGYwMCkgPj4gOCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZjApIHwgKChpdiAmIDB4ZjApID4+IDQpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYpIHwgKChpdiAmIDB4ZikgPDwgNCksXG4gICAgICAgICAgICAgIDFdO1xuICAgIH0gZWxzZSBpZiAoc3RyLmxlbmd0aCA9PT0gNykge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoaXYgJiAweGZmMDAwMCkgPj4gMTYsXG4gICAgICAgICAgICAgIChpdiAmIDB4ZmYwMCkgPj4gOCxcbiAgICAgICAgICAgICAgaXYgJiAweGZmLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBvcCA9IHN0ci5pbmRleE9mKCcoJyksIGVwID0gc3RyLmluZGV4T2YoJyknKTtcbiAgaWYgKG9wICE9PSAtMSAmJiBlcCArIDEgPT09IHN0ci5sZW5ndGgpIHtcbiAgICB2YXIgZm5hbWUgPSBzdHIuc3Vic3RyKDAsIG9wKTtcbiAgICB2YXIgcGFyYW1zID0gc3RyLnN1YnN0cihvcCsxLCBlcC0ob3ArMSkpLnNwbGl0KCcsJyk7XG4gICAgdmFyIGFscGhhID0gMTsgIC8vIFRvIGFsbG93IGNhc2UgZmFsbHRocm91Z2guXG4gICAgc3dpdGNoIChmbmFtZSkge1xuICAgICAgY2FzZSAncmdiYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAncmdiJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gW3BhcnNlX2Nzc19pbnQocGFyYW1zWzBdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1sxXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMl0pLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGNhc2UgJ2hzbGEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ2hzbCc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGggPSAoKChwYXJzZUZsb2F0KHBhcmFtc1swXSkgJSAzNjApICsgMzYwKSAlIDM2MCkgLyAzNjA7ICAvLyAwIC4uIDFcbiAgICAgICAgLy8gTk9URShkZWFubSk6IEFjY29yZGluZyB0byB0aGUgQ1NTIHNwZWMgcy9sIHNob3VsZCBvbmx5IGJlXG4gICAgICAgIC8vIHBlcmNlbnRhZ2VzLCBidXQgd2UgZG9uJ3QgYm90aGVyIGFuZCBsZXQgZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgICAgICAgdmFyIHMgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzFdKTtcbiAgICAgICAgdmFyIGwgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzJdKTtcbiAgICAgICAgdmFyIG0yID0gbCA8PSAwLjUgPyBsICogKHMgKyAxKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICAgIHZhciBtMSA9IGwgKiAyIC0gbTI7XG4gICAgICAgIHJldHVybiBbY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKzEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaC0xLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudHJ5IHsgZXhwb3J0cy5wYXJzZUNTU0NvbG9yID0gcGFyc2VDU1NDb2xvciB9IGNhdGNoKGUpIHsgfVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtwYXJzZUNTU0NvbG9yfSBmcm9tICdjc3Njb2xvcnBhcnNlcic7XG5cbi8qKlxuICogQW4gUkdCQSBjb2xvciB2YWx1ZS4gQ3JlYXRlIGluc3RhbmNlcyBmcm9tIGNvbG9yIHN0cmluZ3MgdXNpbmcgdGhlIHN0YXRpY1xuICogbWV0aG9kIGBDb2xvci5wYXJzZWAuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIFJHQiBjaGFubmVsIHZhbHVlcyBpbiB0aGUgcmFuZ2VcbiAqIGBbMCwgMV1gLCBwcmVtdWx0aXBsaWVkIGJ5IEEuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHIgVGhlIHJlZCBjaGFubmVsLlxuICogQHBhcmFtIHtudW1iZXJ9IGcgVGhlIGdyZWVuIGNoYW5uZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gYiBUaGUgYmx1ZSBjaGFubmVsLlxuICogQHBhcmFtIHtudW1iZXJ9IGEgVGhlIGFscGhhIGNoYW5uZWwuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDb2xvciB7XG4gICAgcjogbnVtYmVyO1xuICAgIGc6IG51bWJlcjtcbiAgICBiOiBudW1iZXI7XG4gICAgYTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYTogbnVtYmVyID0gMSkge1xuICAgICAgICB0aGlzLnIgPSByO1xuICAgICAgICB0aGlzLmcgPSBnO1xuICAgICAgICB0aGlzLmIgPSBiO1xuICAgICAgICB0aGlzLmEgPSBhO1xuICAgIH1cblxuICAgIHN0YXRpYyBibGFjazogQ29sb3I7XG4gICAgc3RhdGljIHdoaXRlOiBDb2xvcjtcbiAgICBzdGF0aWMgdHJhbnNwYXJlbnQ6IENvbG9yO1xuICAgIHN0YXRpYyByZWQ6IENvbG9yO1xuICAgIHN0YXRpYyBibHVlOiBDb2xvcjtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyB2YWxpZCBDU1MgY29sb3Igc3RyaW5ncyBhbmQgcmV0dXJucyBhIGBDb2xvcmAgaW5zdGFuY2UuXG4gICAgICogQHJldHVybnMgQSBgQ29sb3JgIGluc3RhbmNlLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgaW5wdXQgaXMgbm90IGEgdmFsaWQgY29sb3Igc3RyaW5nLlxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShpbnB1dD86IHN0cmluZyB8IENvbG9yIHwgbnVsbCk6IENvbG9yIHwgdm9pZCB7XG4gICAgICAgIGlmICghaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZ2JhID0gcGFyc2VDU1NDb2xvcihpbnB1dCk7XG4gICAgICAgIGlmICghcmdiYSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IoXG4gICAgICAgICAgICByZ2JhWzBdIC8gMjU1ICogcmdiYVszXSxcbiAgICAgICAgICAgIHJnYmFbMV0gLyAyNTUgKiByZ2JhWzNdLFxuICAgICAgICAgICAgcmdiYVsyXSAvIDI1NSAqIHJnYmFbM10sXG4gICAgICAgICAgICByZ2JhWzNdXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBSR0JBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbG9yIHZhbHVlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gUkdCQSBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgcHVycGxlID0gbmV3IENvbG9yLnBhcnNlKCdwdXJwbGUnKTtcbiAgICAgKiBwdXJwbGUudG9TdHJpbmc7IC8vID0gXCJyZ2JhKDEyOCwwLDEyOCwxKVwiXG4gICAgICogdmFyIHRyYW5zbHVjZW50R3JlZW4gPSBuZXcgQ29sb3IucGFyc2UoJ3JnYmEoMjYsIDIwNywgMjYsIC43MyknKTtcbiAgICAgKiB0cmFuc2x1Y2VudEdyZWVuLnRvU3RyaW5nKCk7IC8vID0gXCJyZ2JhKDI2LDIwNywyNiwwLjczKVwiXG4gICAgICovXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgW3IsIGcsIGIsIGFdID0gdGhpcy50b0FycmF5KCk7XG4gICAgICAgIHJldHVybiBgcmdiYSgke01hdGgucm91bmQocil9LCR7TWF0aC5yb3VuZChnKX0sJHtNYXRoLnJvdW5kKGIpfSwke2F9KWA7XG4gICAgfVxuXG4gICAgdG9BcnJheSgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHtyLCBnLCBiLCBhfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBhID09PSAwID8gWzAsIDAsIDAsIDBdIDogW1xuICAgICAgICAgICAgciAqIDI1NSAvIGEsXG4gICAgICAgICAgICBnICogMjU1IC8gYSxcbiAgICAgICAgICAgIGIgKiAyNTUgLyBhLFxuICAgICAgICAgICAgYVxuICAgICAgICBdO1xuICAgIH1cbn1cblxuQ29sb3IuYmxhY2sgPSBuZXcgQ29sb3IoMCwgMCwgMCwgMSk7XG5Db2xvci53aGl0ZSA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKTtcbkNvbG9yLnRyYW5zcGFyZW50ID0gbmV3IENvbG9yKDAsIDAsIDAsIDApO1xuQ29sb3IucmVkID0gbmV3IENvbG9yKDEsIDAsIDAsIDEpO1xuQ29sb3IuYmx1ZSA9IG5ldyBDb2xvcigwLCAwLCAxLCAxKTtcblxuZXhwb3J0IGRlZmF1bHQgQ29sb3I7XG4iLCIvLyBAZmxvd1xuXG4vLyBGbG93IHR5cGUgZGVjbGFyYXRpb25zIGZvciBJbnRsIGNyaWJiZWQgZnJvbVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzEyNzBcblxuZGVjbGFyZSB2YXIgSW50bDoge1xuICAgIENvbGxhdG9yOiBDbGFzczxJbnRsJENvbGxhdG9yPlxufTtcblxuZGVjbGFyZSBjbGFzcyBJbnRsJENvbGxhdG9yIHtcbiAgICBjb25zdHJ1Y3RvciAoXG4gICAgICAgIGxvY2FsZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgb3B0aW9ucz86IENvbGxhdG9yT3B0aW9uc1xuICAgICk6IEludGwkQ29sbGF0b3I7XG5cbiAgICBzdGF0aWMgKFxuICAgICAgICBsb2NhbGVzPzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIG9wdGlvbnM/OiBDb2xsYXRvck9wdGlvbnNcbiAgICApOiBJbnRsJENvbGxhdG9yO1xuXG4gICAgY29tcGFyZSAoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXI7XG5cbiAgICByZXNvbHZlZE9wdGlvbnMoKTogYW55O1xufVxuXG50eXBlIENvbGxhdG9yT3B0aW9ucyA9IHtcbiAgICBsb2NhbGVNYXRjaGVyPzogJ2xvb2t1cCcgfCAnYmVzdCBmaXQnLFxuICAgIHVzYWdlPzogJ3NvcnQnIHwgJ3NlYXJjaCcsXG4gICAgc2Vuc2l0aXZpdHk/OiAnYmFzZScgfCAnYWNjZW50JyB8ICdjYXNlJyB8ICd2YXJpYW50JyxcbiAgICBpZ25vcmVQdW5jdHVhdGlvbj86IGJvb2xlYW4sXG4gICAgbnVtZXJpYz86IGJvb2xlYW4sXG4gICAgY2FzZUZpcnN0PzogJ3VwcGVyJyB8ICdsb3dlcicgfCAnZmFsc2UnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbGxhdG9yIHtcbiAgICBsb2NhbGU6IHN0cmluZyB8IG51bGw7XG4gICAgc2Vuc2l0aXZpdHk6ICdiYXNlJyB8ICdhY2NlbnQnIHwgJ2Nhc2UnIHwgJ3ZhcmlhbnQnO1xuICAgIGNvbGxhdG9yOiBJbnRsJENvbGxhdG9yO1xuXG4gICAgY29uc3RydWN0b3IoY2FzZVNlbnNpdGl2ZTogYm9vbGVhbiwgZGlhY3JpdGljU2Vuc2l0aXZlOiBib29sZWFuLCBsb2NhbGU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgaWYgKGNhc2VTZW5zaXRpdmUpXG4gICAgICAgICAgICB0aGlzLnNlbnNpdGl2aXR5ID0gZGlhY3JpdGljU2Vuc2l0aXZlID8gJ3ZhcmlhbnQnIDogJ2Nhc2UnO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnNlbnNpdGl2aXR5ID0gZGlhY3JpdGljU2Vuc2l0aXZlID8gJ2FjY2VudCcgOiAnYmFzZSc7XG5cbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY29sbGF0b3IgPSBuZXcgSW50bC5Db2xsYXRvcih0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlIDogW10sXG4gICAgICAgICAgICB7c2Vuc2l0aXZpdHk6IHRoaXMuc2Vuc2l0aXZpdHksIHVzYWdlOiAnc2VhcmNoJ30pO1xuICAgIH1cblxuICAgIGNvbXBhcmUobGhzOiBzdHJpbmcsIHJoczogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGF0b3IuY29tcGFyZShsaHMsIHJocyk7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gV2UgY3JlYXRlIGEgQ29sbGF0b3Igd2l0aG91dCBcInVzYWdlOiBzZWFyY2hcIiBiZWNhdXNlIHdlIGRvbid0IHdhbnRcbiAgICAgICAgLy8gdGhlIHNlYXJjaCBvcHRpb25zIGVuY29kZWQgaW4gb3VyIHJlc3VsdCAoZS5nLiBcImVuLXUtY28tc2VhcmNoXCIpXG4gICAgICAgIHJldHVybiBuZXcgSW50bC5Db2xsYXRvcih0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlIDogW10pXG4gICAgICAgICAgICAucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi91dGlsL2NvbG9yLmpzJztcbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuXG5leHBvcnQgY2xhc3MgRm9ybWF0dGVkU2VjdGlvbiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGltYWdlOiBSZXNvbHZlZEltYWdlIHwgbnVsbDtcbiAgICBzY2FsZTogbnVtYmVyIHwgbnVsbDtcbiAgICBmb250U3RhY2s6IHN0cmluZyB8IG51bGw7XG4gICAgdGV4dENvbG9yOiBDb2xvciB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcih0ZXh0OiBzdHJpbmcsIGltYWdlOiBSZXNvbHZlZEltYWdlIHwgbnVsbCwgc2NhbGU6IG51bWJlciB8IG51bGwsIGZvbnRTdGFjazogc3RyaW5nIHwgbnVsbCwgdGV4dENvbG9yOiBDb2xvciB8IG51bGwpIHtcbiAgICAgICAgLy8gY29tYmluZSBjaGFyYWN0ZXJzIHNvIHRoYXQgZGlhY3JpdGljIG1hcmtzIGFyZSBub3Qgc2VwYXJhdGUgY29kZSBwb2ludHNcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dC5ub3JtYWxpemUgPyB0ZXh0Lm5vcm1hbGl6ZSgpIDogdGV4dDtcbiAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuICAgICAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgICAgIHRoaXMuZm9udFN0YWNrID0gZm9udFN0YWNrO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRleHRDb2xvcjtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1hdHRlZCB7XG4gICAgc2VjdGlvbnM6IEFycmF5PEZvcm1hdHRlZFNlY3Rpb24+O1xuXG4gICAgY29uc3RydWN0b3Ioc2VjdGlvbnM6IEFycmF5PEZvcm1hdHRlZFNlY3Rpb24+KSB7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9ucztcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVN0cmluZyh1bmZvcm1hdHRlZDogc3RyaW5nKTogRm9ybWF0dGVkIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0ZWQoW25ldyBGb3JtYXR0ZWRTZWN0aW9uKHVuZm9ybWF0dGVkLCBudWxsLCBudWxsLCBudWxsLCBudWxsKV0pO1xuICAgIH1cblxuICAgIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhdGhpcy5zZWN0aW9ucy5zb21lKHNlY3Rpb24gPT4gc2VjdGlvbi50ZXh0Lmxlbmd0aCAhPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY3Rpb24uaW1hZ2UgJiYgc2VjdGlvbi5pbWFnZS5uYW1lLmxlbmd0aCAhPT0gMCkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmYWN0b3J5KHRleHQ6IEZvcm1hdHRlZCB8IHN0cmluZyk6IEZvcm1hdHRlZCB7XG4gICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBGb3JtYXR0ZWQuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5tYXAoc2VjdGlvbiA9PiBzZWN0aW9uLnRleHQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkOiBBcnJheTxtaXhlZD4gPSBbXCJmb3JtYXRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnNlY3Rpb25zKSB7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5pbWFnZSkge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChbXCJpbWFnZVwiLCBzZWN0aW9uLmltYWdlLm5hbWVdKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChzZWN0aW9uLnRleHQpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBtaXhlZCB9ID0ge307XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5mb250U3RhY2spIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zW1widGV4dC1mb250XCJdID0gW1wibGl0ZXJhbFwiLCBzZWN0aW9uLmZvbnRTdGFjay5zcGxpdCgnLCcpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnNjYWxlKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1tcImZvbnQtc2NhbGVcIl0gPSBzZWN0aW9uLnNjYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24udGV4dENvbG9yKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1tcInRleHQtY29sb3JcIl0gPSAoW1wicmdiYVwiXTogQXJyYXk8bWl4ZWQ+KS5jb25jYXQoc2VjdGlvbi50ZXh0Q29sb3IudG9BcnJheSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlZEltYWdlT3B0aW9ucyA9IHtcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYXZhaWxhYmxlOiBib29sZWFuXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNvbHZlZEltYWdlIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYXZhaWxhYmxlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUmVzb2x2ZWRJbWFnZU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICAgICAgICB0aGlzLmF2YWlsYWJsZSA9IG9wdGlvbnMuYXZhaWxhYmxlO1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21TdHJpbmcobmFtZTogc3RyaW5nKTogUmVzb2x2ZWRJbWFnZSB8IG51bGwge1xuICAgICAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsOyAvLyB0cmVhdCBlbXB0eSB2YWx1ZXMgYXMgbm8gaW1hZ2VcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZEltYWdlKHtuYW1lLCBhdmFpbGFibGU6IGZhbHNlfSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gW1wiaW1hZ2VcIiwgdGhpcy5uYW1lXTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCBDb2xvciBmcm9tICcuLi91dGlsL2NvbG9yLmpzJztcbmltcG9ydCBDb2xsYXRvciBmcm9tICcuL3R5cGVzL2NvbGxhdG9yLmpzJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuaW1wb3J0IFJlc29sdmVkSW1hZ2UgZnJvbSAnLi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5pbXBvcnQge051bGxUeXBlLCBOdW1iZXJUeXBlLCBTdHJpbmdUeXBlLCBCb29sZWFuVHlwZSwgQ29sb3JUeXBlLCBPYmplY3RUeXBlLCBWYWx1ZVR5cGUsIENvbGxhdG9yVHlwZSwgRm9ybWF0dGVkVHlwZSwgUmVzb2x2ZWRJbWFnZVR5cGUsIGFycmF5fSBmcm9tICcuL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSR0JBKHI6IG1peGVkLCBnOiBtaXhlZCwgYjogbWl4ZWQsIGE/OiBtaXhlZCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghKFxuICAgICAgICB0eXBlb2YgciA9PT0gJ251bWJlcicgJiYgciA+PSAwICYmIHIgPD0gMjU1ICYmXG4gICAgICAgIHR5cGVvZiBnID09PSAnbnVtYmVyJyAmJiBnID49IDAgJiYgZyA8PSAyNTUgJiZcbiAgICAgICAgdHlwZW9mIGIgPT09ICdudW1iZXInICYmIGIgPj0gMCAmJiBiIDw9IDI1NVxuICAgICkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgYSA9PT0gJ251bWJlcicgPyBbciwgZywgYiwgYV0gOiBbciwgZywgYl07XG4gICAgICAgIHJldHVybiBgSW52YWxpZCByZ2JhIHZhbHVlIFske3ZhbHVlLmpvaW4oJywgJyl9XTogJ3InLCAnZycsIGFuZCAnYicgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NS5gO1xuICAgIH1cblxuICAgIGlmICghKFxuICAgICAgICB0eXBlb2YgYSA9PT0gJ3VuZGVmaW5lZCcgfHwgKHR5cGVvZiBhID09PSAnbnVtYmVyJyAmJiBhID49IDAgJiYgYSA8PSAxKVxuICAgICkpIHtcbiAgICAgICAgcmV0dXJuIGBJbnZhbGlkIHJnYmEgdmFsdWUgWyR7W3IsIGcsIGIsIGFdLmpvaW4oJywgJyl9XTogJ2EnIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxLmA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCB0eXBlIFZhbHVlID0gbnVsbCB8IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBDb2xvciB8IENvbGxhdG9yIHwgRm9ybWF0dGVkIHwgUmVzb2x2ZWRJbWFnZSB8ICRSZWFkT25seUFycmF5PFZhbHVlPiB8IHsgK1tzdHJpbmddOiBWYWx1ZSB9XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbHVlKG1peGVkOiBtaXhlZCk6IGJvb2xlYW4ge1xuICAgIGlmIChtaXhlZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWl4ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChtaXhlZCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWl4ZWQgaW5zdGFuY2VvZiBDb2xsYXRvcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1peGVkIGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWl4ZWQgaW5zdGFuY2VvZiBSZXNvbHZlZEltYWdlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtaXhlZCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1peGVkKSB7XG4gICAgICAgICAgICBpZiAoIWlzVmFsdWUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWl4ZWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1peGVkKSB7XG4gICAgICAgICAgICBpZiAoIWlzVmFsdWUobWl4ZWRba2V5XSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVPZih2YWx1ZTogVmFsdWUpOiBUeXBlIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIE51bGxUeXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gU3RyaW5nVHlwZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuVHlwZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlclR5cGU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgIHJldHVybiBDb2xvclR5cGU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxhdG9yKSB7XG4gICAgICAgIHJldHVybiBDb2xsYXRvclR5cGU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZvcm1hdHRlZCkge1xuICAgICAgICByZXR1cm4gRm9ybWF0dGVkVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVzb2x2ZWRJbWFnZSkge1xuICAgICAgICByZXR1cm4gUmVzb2x2ZWRJbWFnZVR5cGU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIGxldCBpdGVtVHlwZTogVHlwZSB8IHR5cGVvZiB1bmRlZmluZWQ7XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdHlwZU9mKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKCFpdGVtVHlwZSkge1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlID0gdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgPT09IHQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSBWYWx1ZVR5cGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJyYXkoaXRlbVR5cGUgfHwgVmFsdWVUeXBlLCBsZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdFR5cGU7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWU6IFZhbHVlKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xvciB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZvcm1hdHRlZCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFJlc29sdmVkSW1hZ2UpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7Q29sb3IsIENvbGxhdG9yfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7aXNWYWx1ZSwgdHlwZU9mLCBDb2xvcn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi4vdHlwZXMvZm9ybWF0dGVkLmpzJztcblxuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtWYWx1ZX0gIGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuXG5jbGFzcyBMaXRlcmFsIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICB2YWx1ZTogVmFsdWU7XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCB2YWx1ZTogVmFsdWUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGAnbGl0ZXJhbCcgZXhwcmVzc2lvbiByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIGlmICghaXNWYWx1ZShhcmdzWzFdKSlcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBpbnZhbGlkIHZhbHVlYCk7XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSAoYXJnc1sxXTogYW55KTtcbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlT2YodmFsdWUpO1xuXG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZTogaW5mZXIgdGhlIGl0ZW0gdHlwZSBpZiBwb3NzaWJsZSBmb3IgemVyby1sZW5ndGggYXJyYXlzXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ2FycmF5JyAmJlxuICAgICAgICAgICAgdHlwZS5OID09PSAwICYmXG4gICAgICAgICAgICBleHBlY3RlZCAmJlxuICAgICAgICAgICAgZXhwZWN0ZWQua2luZCA9PT0gJ2FycmF5JyAmJlxuICAgICAgICAgICAgKHR5cGVvZiBleHBlY3RlZC5OICE9PSAnbnVtYmVyJyB8fCBleHBlY3RlZC5OID09PSAwKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHR5cGUgPSBleHBlY3RlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTGl0ZXJhbCh0eXBlLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZCgpIHt9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudHlwZS5raW5kID09PSAnYXJyYXknIHx8IHRoaXMudHlwZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIFtcImxpdGVyYWxcIiwgdGhpcy52YWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICAvLyBDb25zdGFudC1mb2xkaW5nIGNhbiBnZW5lcmF0ZSBMaXRlcmFsIGV4cHJlc3Npb25zIHRoYXQgeW91XG4gICAgICAgICAgICAvLyBjb3VsZG4ndCBhY3R1YWxseSBnZW5lcmF0ZSB3aXRoIGEgXCJsaXRlcmFsXCIgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gaW1wbGVtZW50IGFuIGVxdWl2YWxlbnQgc2VyaWFsaXphdGlvbiBoZXJlXG4gICAgICAgICAgICByZXR1cm4gW1wicmdiYVwiXS5jb25jYXQodGhpcy52YWx1ZS50b0FycmF5KCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBGb3JtYXR0ZWQpIHtcbiAgICAgICAgICAgIC8vIFNhbWUgYXMgQ29sb3JcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KHRoaXMudmFsdWUgPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ2Jvb2xlYW4nKTtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy52YWx1ZTogYW55KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGl0ZXJhbDtcbiIsIi8vIEBmbG93XG5cbmNsYXNzIFJ1bnRpbWVFcnJvciB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICB0aGlzLm5hbWUgPSAnRXhwcmVzc2lvbkV2YWx1YXRpb25FcnJvcic7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUnVudGltZUVycm9yO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge1xuICAgIE9iamVjdFR5cGUsXG4gICAgVmFsdWVUeXBlLFxuICAgIFN0cmluZ1R5cGUsXG4gICAgTnVtYmVyVHlwZSxcbiAgICBCb29sZWFuVHlwZSxcbiAgICBjaGVja1N1YnR5cGUsXG4gICAgdG9TdHJpbmcsXG4gICAgYXJyYXlcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmNvbnN0IHR5cGVzID0ge1xuICAgIHN0cmluZzogU3RyaW5nVHlwZSxcbiAgICBudW1iZXI6IE51bWJlclR5cGUsXG4gICAgYm9vbGVhbjogQm9vbGVhblR5cGUsXG4gICAgb2JqZWN0OiBPYmplY3RUeXBlXG59O1xuXG5jbGFzcyBBc3NlcnRpb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgYXJnczogQXJyYXk8RXhwcmVzc2lvbj4pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuYCk7XG5cbiAgICAgICAgbGV0IGkgPSAxO1xuICAgICAgICBsZXQgdHlwZTtcblxuICAgICAgICBjb25zdCBuYW1lOiBzdHJpbmcgPSAoYXJnc1swXTogYW55KTtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIGxldCBpdGVtVHlwZTtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gYXJnc1sxXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnIHx8ICEodHlwZSBpbiB0eXBlcykgfHwgdHlwZSA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdUaGUgaXRlbSB0eXBlIGFyZ3VtZW50IG9mIFwiYXJyYXlcIiBtdXN0IGJlIG9uZSBvZiBzdHJpbmcsIG51bWJlciwgYm9vbGVhbicsIDEpO1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlID0gdHlwZXNbdHlwZV07XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSA9IFZhbHVlVHlwZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IE47XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3NbMl0gIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBhcmdzWzJdICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1syXSA8IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMl0gIT09IE1hdGguZmxvb3IoYXJnc1syXSkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdUaGUgbGVuZ3RoIGFyZ3VtZW50IHRvIFwiYXJyYXlcIiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBsaXRlcmFsJywgMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE4gPSBhcmdzWzJdO1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHlwZSA9IGFycmF5KGl0ZW1UeXBlLCBOKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydCh0eXBlc1tuYW1lXSwgbmFtZSk7XG4gICAgICAgICAgICB0eXBlID0gdHlwZXNbbmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZWQgPSBbXTtcbiAgICAgICAgZm9yICg7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1tpXSwgaSwgVmFsdWVUeXBlKTtcbiAgICAgICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goaW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odHlwZSwgcGFyc2VkKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuYXJnc1tpXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBjaGVja1N1YnR5cGUodGhpcy50eXBlLCB0eXBlT2YodmFsdWUpKTtcbiAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IHRoaXMuYXJncy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgdmFsdWUgdG8gYmUgb2YgdHlwZSAke3RvU3RyaW5nKHRoaXMudHlwZSl9LCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YodmFsdWUpKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2VydChmYWxzZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5hcmdzLmZvckVhY2goZm4pO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3MuZXZlcnkoYXJnID0+IGFyZy5vdXRwdXREZWZpbmVkKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW3R5cGUua2luZF07XG4gICAgICAgIGlmICh0eXBlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gdHlwZS5pdGVtVHlwZTtcbiAgICAgICAgICAgIGlmIChpdGVtVHlwZS5raW5kID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIGl0ZW1UeXBlLmtpbmQgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUua2luZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKGl0ZW1UeXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IE4gPSB0eXBlLk47XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBOID09PSAnbnVtYmVyJyB8fCB0aGlzLmFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goTik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkLmNvbmNhdCh0aGlzLmFyZ3MubWFwKGFyZyA9PiBhcmcuc2VyaWFsaXplKCkpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFzc2VydGlvbjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7TnVtYmVyVHlwZSwgVmFsdWVUeXBlLCBGb3JtYXR0ZWRUeXBlLCBhcnJheSwgU3RyaW5nVHlwZSwgQ29sb3JUeXBlLCBSZXNvbHZlZEltYWdlVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IEZvcm1hdHRlZCwge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5pbXBvcnQge3RvU3RyaW5nLCB0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxudHlwZSBGb3JtYXR0ZWRTZWN0aW9uRXhwcmVzc2lvbiA9IHtcbiAgICAvLyBDb250ZW50IG9mIGEgc2VjdGlvbiBtYXkgYmUgSW1hZ2UgZXhwcmVzc2lvbiBvciBvdGhlclxuICAgIC8vIHR5cGUgb2YgZXhwcmVzc2lvbiB0aGF0IGlzIGNvZXJjYWJsZSB0byAnc3RyaW5nJy5cbiAgICBjb250ZW50OiBFeHByZXNzaW9uLFxuICAgIHNjYWxlOiBFeHByZXNzaW9uIHwgbnVsbDtcbiAgICBmb250OiBFeHByZXNzaW9uIHwgbnVsbDtcbiAgICB0ZXh0Q29sb3I6IEV4cHJlc3Npb24gfCBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGb3JtYXRFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbkV4cHJlc3Npb24+O1xuXG4gICAgY29uc3RydWN0b3Ioc2VjdGlvbnM6IEFycmF5PEZvcm1hdHRlZFNlY3Rpb25FeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLnR5cGUgPSBGb3JtYXR0ZWRUeXBlO1xuICAgICAgICB0aGlzLnNlY3Rpb25zID0gc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEFyZyA9IGFyZ3NbMV07XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaXJzdEFyZykgJiYgdHlwZW9mIGZpcnN0QXJnID09PSAnb2JqZWN0JykgIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFuIGltYWdlIG9yIHRleHQgc2VjdGlvbi5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zOiBBcnJheTxGb3JtYXR0ZWRTZWN0aW9uRXhwcmVzc2lvbj4gPSBbXTtcbiAgICAgICAgbGV0IG5leHRUb2tlbk1heUJlT2JqZWN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGFyZ3MubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBhcmcgPSAoYXJnc1tpXTogYW55KTtcblxuICAgICAgICAgICAgaWYgKG5leHRUb2tlbk1heUJlT2JqZWN0ICYmIHR5cGVvZiBhcmcgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgICAgICAgICAgIG5leHRUb2tlbk1heUJlT2JqZWN0ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBsZXQgc2NhbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChhcmdbJ2ZvbnQtc2NhbGUnXSkge1xuICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IGNvbnRleHQucGFyc2UoYXJnWydmb250LXNjYWxlJ10sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNjYWxlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgZm9udCA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ1sndGV4dC1mb250J10pIHtcbiAgICAgICAgICAgICAgICAgICAgZm9udCA9IGNvbnRleHQucGFyc2UoYXJnWyd0ZXh0LWZvbnQnXSwgMSwgYXJyYXkoU3RyaW5nVHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB0ZXh0Q29sb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChhcmdbJ3RleHQtY29sb3InXSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3IgPSBjb250ZXh0LnBhcnNlKGFyZ1sndGV4dC1jb2xvciddLCAxLCBDb2xvclR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRleHRDb2xvcikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEV4cHJlc3Npb24gPSBzZWN0aW9uc1tzZWN0aW9ucy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBsYXN0RXhwcmVzc2lvbi5zY2FsZSA9IHNjYWxlO1xuICAgICAgICAgICAgICAgIGxhc3RFeHByZXNzaW9uLmZvbnQgPSBmb250O1xuICAgICAgICAgICAgICAgIGxhc3RFeHByZXNzaW9uLnRleHRDb2xvciA9IHRleHRDb2xvcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGNvbnRleHQucGFyc2UoYXJnc1tpXSwgMSwgVmFsdWVUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qga2luZCA9IGNvbnRlbnQudHlwZS5raW5kO1xuICAgICAgICAgICAgICAgIGlmIChraW5kICE9PSAnc3RyaW5nJyAmJiBraW5kICE9PSAndmFsdWUnICYmIGtpbmQgIT09ICdudWxsJyAmJiBraW5kICE9PSAncmVzb2x2ZWRJbWFnZScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBGb3JtYXR0ZWQgdGV4dCB0eXBlIG11c3QgYmUgJ3N0cmluZycsICd2YWx1ZScsICdpbWFnZScgb3IgJ251bGwnLmApO1xuXG4gICAgICAgICAgICAgICAgbmV4dFRva2VuTWF5QmVPYmplY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe2NvbnRlbnQsIHNjYWxlOiBudWxsLCBmb250OiBudWxsLCB0ZXh0Q29sb3I6IG51bGx9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ybWF0RXhwcmVzc2lvbihzZWN0aW9ucyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBldmFsdWF0ZVNlY3Rpb24gPSBzZWN0aW9uID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRlZENvbnRlbnQgPSBzZWN0aW9uLmNvbnRlbnQuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIGlmICh0eXBlT2YoZXZhbHVhdGVkQ29udGVudCkgPT09IFJlc29sdmVkSW1hZ2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0ZWRTZWN0aW9uKCcnLCBldmFsdWF0ZWRDb250ZW50LCBudWxsLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0ZWRTZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhldmFsdWF0ZWRDb250ZW50KSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zY2FsZSA/IHNlY3Rpb24uc2NhbGUuZXZhbHVhdGUoY3R4KSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uZm9udCA/IHNlY3Rpb24uZm9udC5ldmFsdWF0ZShjdHgpLmpvaW4oJywnKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24udGV4dENvbG9yID8gc2VjdGlvbi50ZXh0Q29sb3IuZXZhbHVhdGUoY3R4KSA6IG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0ZWQodGhpcy5zZWN0aW9ucy5tYXAoZXZhbHVhdGVTZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5zZWN0aW9ucykge1xuICAgICAgICAgICAgZm4oc2VjdGlvbi5jb250ZW50KTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnNjYWxlKSB7XG4gICAgICAgICAgICAgICAgZm4oc2VjdGlvbi5zY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5mb250KSB7XG4gICAgICAgICAgICAgICAgZm4oc2VjdGlvbi5mb250KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnRleHRDb2xvcikge1xuICAgICAgICAgICAgICAgIGZuKHNlY3Rpb24udGV4dENvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIC8vIFRlY2huaWNhbGx5IHRoZSBjb21iaW5hdG9yaWMgc2V0IG9mIGFsbCBjaGlsZHJlblxuICAgICAgICAvLyBVc3VhbGx5LCB0aGlzLnRleHQgd2lsbCBiZSB1bmRlZmluZWQgYW55d2F5XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJmb3JtYXRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnNlY3Rpb25zKSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goc2VjdGlvbi5jb250ZW50LnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnNjYWxlKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1snZm9udC1zY2FsZSddID0gc2VjdGlvbi5zY2FsZS5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmZvbnQpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zWyd0ZXh0LWZvbnQnXSA9IHNlY3Rpb24uZm9udC5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnRleHRDb2xvcikge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbJ3RleHQtY29sb3InXSA9IHNlY3Rpb24udGV4dENvbG9yLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7UmVzb2x2ZWRJbWFnZVR5cGUsIFN0cmluZ1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZUV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGlucHV0OiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gUmVzb2x2ZWRJbWFnZVR5cGU7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgdHdvIGFyZ3VtZW50cy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFN0cmluZ1R5cGUpO1xuICAgICAgICBpZiAoIW5hbWUpIHJldHVybiBjb250ZXh0LmVycm9yKGBObyBpbWFnZSBuYW1lIHByb3ZpZGVkLmApO1xuXG4gICAgICAgIHJldHVybiBuZXcgSW1hZ2VFeHByZXNzaW9uKG5hbWUpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgZXZhbHVhdGVkSW1hZ2VOYW1lID0gdGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKGV2YWx1YXRlZEltYWdlTmFtZSk7XG4gICAgICAgIGlmICh2YWx1ZSAmJiBjdHguYXZhaWxhYmxlSW1hZ2VzKSB2YWx1ZS5hdmFpbGFibGUgPSBjdHguYXZhaWxhYmxlSW1hZ2VzLmluZGV4T2YoZXZhbHVhdGVkSW1hZ2VOYW1lKSA+IC0xO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIC8vIFRoZSBvdXRwdXQgb2YgaW1hZ2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgaW1hZ2VzIGluIHRoZSBldmFsdWF0aW9uIGNvbnRleHRcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIFtcImltYWdlXCIsIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHtCb29sZWFuVHlwZSwgQ29sb3JUeXBlLCBOdW1iZXJUeXBlLCBTdHJpbmdUeXBlLCBWYWx1ZVR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7Q29sb3IsIHRvU3RyaW5nIGFzIHZhbHVlVG9TdHJpbmcsIHZhbGlkYXRlUkdCQX0gZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvci5qcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5pbXBvcnQgRm9ybWF0RXhwcmVzc2lvbiBmcm9tICcuLi9kZWZpbml0aW9ucy9mb3JtYXQuanMnO1xuaW1wb3J0IEltYWdlRXhwcmVzc2lvbiBmcm9tICcuLi9kZWZpbml0aW9ucy9pbWFnZS5qcyc7XG5pbXBvcnQgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuY29uc3QgdHlwZXMgPSB7XG4gICAgJ3RvLWJvb2xlYW4nOiBCb29sZWFuVHlwZSxcbiAgICAndG8tY29sb3InOiBDb2xvclR5cGUsXG4gICAgJ3RvLW51bWJlcic6IE51bWJlclR5cGUsXG4gICAgJ3RvLXN0cmluZyc6IFN0cmluZ1R5cGVcbn07XG5cbi8qKlxuICogU3BlY2lhbCBmb3JtIGZvciBlcnJvci1jb2FsZXNjaW5nIGNvZXJjaW9uIGV4cHJlc3Npb25zIFwidG8tbnVtYmVyXCIsXG4gKiBcInRvLWNvbG9yXCIuICBTaW5jZSB0aGVzZSBjb2VyY2lvbnMgY2FuIGZhaWwgYXQgcnVudGltZSwgdGhleSBhY2NlcHQgbXVsdGlwbGVcbiAqIGFyZ3VtZW50cywgb25seSBldmFsdWF0aW5nIG9uZSBhdCBhIHRpbWUgdW50aWwgb25lIHN1Y2NlZWRzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvZXJjaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBhcmdzOiBBcnJheTxFeHByZXNzaW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IChhcmdzWzBdOiBhbnkpO1xuICAgICAgICBhc3NlcnQodHlwZXNbbmFtZV0sIG5hbWUpO1xuXG4gICAgICAgIGlmICgobmFtZSA9PT0gJ3RvLWJvb2xlYW4nIHx8IG5hbWUgPT09ICd0by1zdHJpbmcnKSAmJiBhcmdzLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBvbmUgYXJndW1lbnQuYCk7XG5cbiAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVzW25hbWVdO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCBpLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBwYXJzZWQucHVzaChpbnB1dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IENvZXJjaW9uKHR5cGUsIHBhcnNlZCk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5hcmdzWzBdLmV2YWx1YXRlKGN0eCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZS5raW5kID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICBsZXQgaW5wdXQ7XG4gICAgICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgICAgIGVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb2xvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjdHgucGFyc2VDb2xvcihpbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjKSByZXR1cm4gYztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5sZW5ndGggPCAzIHx8IGlucHV0Lmxlbmd0aCA+IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gYEludmFsaWQgcmJnYSB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KGlucHV0KX06IGV4cGVjdGVkIGFuIGFycmF5IGNvbnRhaW5pbmcgZWl0aGVyIHRocmVlIG9yIGZvdXIgbnVtZXJpYyB2YWx1ZXMuYDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gdmFsaWRhdGVSR0JBKGlucHV0WzBdLCBpbnB1dFsxXSwgaW5wdXRbMl0sIGlucHV0WzNdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKChpbnB1dFswXTogYW55KSAvIDI1NSwgKGlucHV0WzFdOiBhbnkpIC8gMjU1LCAoaW5wdXRbMl06IGFueSkgLyAyNTUsIChpbnB1dFszXTogYW55KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGVycm9yIHx8IGBDb3VsZCBub3QgcGFyc2UgY29sb3IgZnJvbSB2YWx1ZSAnJHt0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gaW5wdXQgOiBTdHJpbmcoSlNPTi5zdHJpbmdpZnkoaW5wdXQpKX0nYCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKG51bSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBDb3VsZCBub3QgY29udmVydCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gdG8gbnVtYmVyLmApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZS5raW5kID09PSAnZm9ybWF0dGVkJykge1xuICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gZXhwbGljaXQgJ3RvLWZvcm1hdHRlZCcgYnV0IHRoaXMgY29lcmNpb24gY2FuIGJlIGltcGxpY2l0bHlcbiAgICAgICAgICAgIC8vIGNyZWF0ZWQgYnkgcHJvcGVydGllcyB0aGF0IGV4cGVjdCB0aGUgJ2Zvcm1hdHRlZCcgdHlwZS5cbiAgICAgICAgICAgIHJldHVybiBGb3JtYXR0ZWQuZnJvbVN0cmluZyh2YWx1ZVRvU3RyaW5nKHRoaXMuYXJnc1swXS5ldmFsdWF0ZShjdHgpKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdyZXNvbHZlZEltYWdlJykge1xuICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkSW1hZ2UuZnJvbVN0cmluZyh2YWx1ZVRvU3RyaW5nKHRoaXMuYXJnc1swXS5ldmFsdWF0ZShjdHgpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVUb1N0cmluZyh0aGlzLmFyZ3NbMF0uZXZhbHVhdGUoY3R4KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzLmV2ZXJ5KGFyZyA9PiBhcmcub3V0cHV0RGVmaW5lZCgpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ2Zvcm1hdHRlZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybWF0RXhwcmVzc2lvbihbe2NvbnRlbnQ6IHRoaXMuYXJnc1swXSwgc2NhbGU6IG51bGwsIGZvbnQ6IG51bGwsIHRleHRDb2xvcjogbnVsbH1dKS5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ3Jlc29sdmVkSW1hZ2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEltYWdlRXhwcmVzc2lvbih0aGlzLmFyZ3NbMF0pLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtgdG8tJHt0aGlzLnR5cGUua2luZH1gXTtcbiAgICAgICAgdGhpcy5lYWNoQ2hpbGQoY2hpbGQgPT4geyBzZXJpYWxpemVkLnB1c2goY2hpbGQuc2VyaWFsaXplKCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2VyY2lvbjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Q29sb3J9IGZyb20gJy4vdmFsdWVzLmpzJztcblxuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7Rm9ybWF0dGVkU2VjdGlvbn0gZnJvbSAnLi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuaW1wb3J0IHR5cGUge0dsb2JhbFByb3BlcnRpZXMsIEZlYXR1cmUsIEZlYXR1cmVTdGF0ZX0gZnJvbSAnLi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZURpc3RhbmNlRGF0YX0gZnJvbSAnLi4vZmVhdHVyZV9maWx0ZXIvaW5kZXguanMnO1xuXG5jb25zdCBnZW9tZXRyeVR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5jbGFzcyBFdmFsdWF0aW9uQ29udGV4dCB7XG4gICAgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcztcbiAgICBmZWF0dXJlOiA/RmVhdHVyZTtcbiAgICBmZWF0dXJlU3RhdGU6ID9GZWF0dXJlU3RhdGU7XG4gICAgZm9ybWF0dGVkU2VjdGlvbjogP0Zvcm1hdHRlZFNlY3Rpb247XG4gICAgYXZhaWxhYmxlSW1hZ2VzOiA/QXJyYXk8c3RyaW5nPjtcbiAgICBjYW5vbmljYWw6ID9DYW5vbmljYWxUaWxlSUQ7XG4gICAgZmVhdHVyZVRpbGVDb29yZDogP1BvaW50O1xuICAgIGZlYXR1cmVEaXN0YW5jZURhdGE6ID9GZWF0dXJlRGlzdGFuY2VEYXRhO1xuXG4gICAgX3BhcnNlQ29sb3JDYWNoZToge1tfOiBzdHJpbmddOiA/Q29sb3J9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFscyA9IChudWxsOiBhbnkpO1xuICAgICAgICB0aGlzLmZlYXR1cmUgPSBudWxsO1xuICAgICAgICB0aGlzLmZlYXR1cmVTdGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZm9ybWF0dGVkU2VjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX3BhcnNlQ29sb3JDYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLmF2YWlsYWJsZUltYWdlcyA9IG51bGw7XG4gICAgICAgIHRoaXMuY2Fub25pY2FsID0gbnVsbDtcbiAgICAgICAgdGhpcy5mZWF0dXJlVGlsZUNvb3JkID0gbnVsbDtcbiAgICAgICAgdGhpcy5mZWF0dXJlRGlzdGFuY2VEYXRhID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZSAmJiAnaWQnIGluIHRoaXMuZmVhdHVyZSA/IHRoaXMuZmVhdHVyZS5pZCA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2VvbWV0cnlUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlID8gdHlwZW9mIHRoaXMuZmVhdHVyZS50eXBlID09PSAnbnVtYmVyJyA/IGdlb21ldHJ5VHlwZXNbdGhpcy5mZWF0dXJlLnR5cGVdIDogdGhpcy5mZWF0dXJlLnR5cGUgOiBudWxsO1xuICAgIH1cblxuICAgIGdlb21ldHJ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlICYmICdnZW9tZXRyeScgaW4gdGhpcy5mZWF0dXJlID8gdGhpcy5mZWF0dXJlLmdlb21ldHJ5IDogbnVsbDtcbiAgICB9XG5cbiAgICBjYW5vbmljYWxJRCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fub25pY2FsO1xuICAgIH1cblxuICAgIHByb3BlcnRpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgJiYgdGhpcy5mZWF0dXJlLnByb3BlcnRpZXMgfHwge307XG4gICAgfVxuXG4gICAgZGlzdGFuY2VGcm9tQ2VudGVyKCkge1xuICAgICAgICBpZiAodGhpcy5mZWF0dXJlVGlsZUNvb3JkICYmIHRoaXMuZmVhdHVyZURpc3RhbmNlRGF0YSkge1xuXG4gICAgICAgICAgICBjb25zdCBjID0gdGhpcy5mZWF0dXJlRGlzdGFuY2VEYXRhLmNlbnRlcjtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5mZWF0dXJlRGlzdGFuY2VEYXRhLnNjYWxlO1xuICAgICAgICAgICAgY29uc3Qge3gsIHl9ID0gdGhpcy5mZWF0dXJlVGlsZUNvb3JkO1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIHZlY3RvciBgZGAgKGxlZnQgaGFuZGVkKVxuICAgICAgICAgICAgY29uc3QgZFggPSB4ICogc2NhbGUgLSBjWzBdO1xuICAgICAgICAgICAgY29uc3QgZFkgPSB5ICogc2NhbGUgLSBjWzFdO1xuXG4gICAgICAgICAgICAvLyBUaGUgYmVhcmluZyB2ZWN0b3IgYGJgIChsZWZ0IGhhbmRlZClcbiAgICAgICAgICAgIGNvbnN0IGJYID0gdGhpcy5mZWF0dXJlRGlzdGFuY2VEYXRhLmJlYXJpbmdbMF07XG4gICAgICAgICAgICBjb25zdCBiWSA9IHRoaXMuZmVhdHVyZURpc3RhbmNlRGF0YS5iZWFyaW5nWzFdO1xuXG4gICAgICAgICAgICAvLyBEaXN0YW5jZSBpcyBjYWxjdWxhdGVkIGFzIGBkb3QoZCwgdilgXG4gICAgICAgICAgICBjb25zdCBkaXN0ID0gKGJYICogZFggKyBiWSAqIGRZKTtcbiAgICAgICAgICAgIHJldHVybiBkaXN0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcGFyc2VDb2xvcihpbnB1dDogc3RyaW5nKTogP0NvbG9yIHtcbiAgICAgICAgbGV0IGNhY2hlZCA9IHRoaXMuX3BhcnNlQ29sb3JDYWNoZVtpbnB1dF07XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgICBjYWNoZWQgPSB0aGlzLl9wYXJzZUNvbG9yQ2FjaGVbaW5wdXRdID0gQ29sb3IucGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmFsdWF0aW9uQ29udGV4dDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7dG9TdHJpbmd9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5pbXBvcnQgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb24sIEV4cHJlc3Npb25SZWdpc3RyeX0gZnJvbSAnLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtWYWx1ZX0gZnJvbSAnLi92YWx1ZXMuanMnO1xuXG5leHBvcnQgdHlwZSBWYXJhcmdzID0ge3wgdHlwZTogVHlwZSB8fTtcbnR5cGUgU2lnbmF0dXJlID0gQXJyYXk8VHlwZT4gfCBWYXJhcmdzO1xudHlwZSBFdmFsdWF0ZSA9IChFdmFsdWF0aW9uQ29udGV4dCwgQXJyYXk8RXhwcmVzc2lvbj4pID0+IFZhbHVlO1xudHlwZSBEZWZpbml0aW9uID0gW1R5cGUsIFNpZ25hdHVyZSwgRXZhbHVhdGVdIHxcbiAgICB7fHR5cGU6IFR5cGUsIG92ZXJsb2FkczogQXJyYXk8W1NpZ25hdHVyZSwgRXZhbHVhdGVdPnx9O1xuXG5jbGFzcyBDb21wb3VuZEV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHlwZTogVHlwZTtcbiAgICBfZXZhbHVhdGU6IEV2YWx1YXRlO1xuICAgIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgc3RhdGljIGRlZmluaXRpb25zOiB7W186IHN0cmluZ106IERlZmluaXRpb24gfTtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdHlwZTogVHlwZSwgZXZhbHVhdGU6IEV2YWx1YXRlLCBhcmdzOiBBcnJheTxFeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLl9ldmFsdWF0ZSA9IGV2YWx1YXRlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2YWx1YXRlKGN0eCwgdGhpcy5hcmdzKTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PG1peGVkPiB7XG4gICAgICAgIHJldHVybiBbdGhpcy5uYW1lXS5jb25jYXQodGhpcy5hcmdzLm1hcChhcmcgPT4gYXJnLnNlcmlhbGl6ZSgpKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGNvbnN0IG9wOiBzdHJpbmcgPSAoYXJnc1swXTogYW55KTtcbiAgICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IENvbXBvdW5kRXhwcmVzc2lvbi5kZWZpbml0aW9uc1tvcF07XG4gICAgICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYFVua25vd24gZXhwcmVzc2lvbiBcIiR7b3B9XCIuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbLi4uXV0uYCwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3cgY2hlY2sgYXJndW1lbnQgdHlwZXMgYWdhaW5zdCBlYWNoIHNpZ25hdHVyZVxuICAgICAgICBjb25zdCB0eXBlID0gQXJyYXkuaXNBcnJheShkZWZpbml0aW9uKSA/XG4gICAgICAgICAgICBkZWZpbml0aW9uWzBdIDogZGVmaW5pdGlvbi50eXBlO1xuXG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZU92ZXJsb2FkcyA9IEFycmF5LmlzQXJyYXkoZGVmaW5pdGlvbikgP1xuICAgICAgICAgICAgW1tkZWZpbml0aW9uWzFdLCBkZWZpbml0aW9uWzJdXV0gOlxuICAgICAgICAgICAgZGVmaW5pdGlvbi5vdmVybG9hZHM7XG5cbiAgICAgICAgY29uc3Qgb3ZlcmxvYWRzID0gYXZhaWxhYmxlT3ZlcmxvYWRzLmZpbHRlcigoW3NpZ25hdHVyZV0pID0+IChcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KHNpZ25hdHVyZSkgfHwgLy8gdmFyYWdzXG4gICAgICAgICAgICBzaWduYXR1cmUubGVuZ3RoID09PSBhcmdzLmxlbmd0aCAtIDEgLy8gY29ycmVjdCBwYXJhbSBjb3VudFxuICAgICAgICApKTtcblxuICAgICAgICBsZXQgc2lnbmF0dXJlQ29udGV4dDogUGFyc2luZ0NvbnRleHQgPSAobnVsbDogYW55KTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbXMsIGV2YWx1YXRlXSBvZiBvdmVybG9hZHMpIHtcbiAgICAgICAgICAgIC8vIFVzZSBhIGZyZXNoIGNvbnRleHQgZm9yIGVhY2ggYXR0ZW1wdGVkIHNpZ25hdHVyZSBzbyB0aGF0LCBpZlxuICAgICAgICAgICAgLy8gd2UgZXZlbnR1YWxseSBzdWNjZWVkLCB3ZSBoYXZlbid0IHBvbGx1dGVkIGBjb250ZXh0LmVycm9yc2AuXG4gICAgICAgICAgICBzaWduYXR1cmVDb250ZXh0ID0gbmV3IFBhcnNpbmdDb250ZXh0KGNvbnRleHQucmVnaXN0cnksIGNvbnRleHQucGF0aCwgbnVsbCwgY29udGV4dC5zY29wZSk7XG5cbiAgICAgICAgICAgIC8vIEZpcnN0IHBhcnNlIGFsbCB0aGUgYXJncywgcG90ZW50aWFsbHkgY29lcmNpbmcgdG8gdGhlXG4gICAgICAgICAgICAvLyB0eXBlcyBleHBlY3RlZCBieSB0aGlzIG92ZXJsb2FkLlxuICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJnczogQXJyYXk8RXhwcmVzc2lvbj4gPSBbXTtcbiAgICAgICAgICAgIGxldCBhcmdQYXJzZUZhaWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZFR5cGUgPSBBcnJheS5pc0FycmF5KHBhcmFtcykgP1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaSAtIDFdIDpcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnR5cGU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBzaWduYXR1cmVDb250ZXh0LnBhcnNlKGFyZywgMSArIHBhcnNlZEFyZ3MubGVuZ3RoLCBleHBlY3RlZFR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ1BhcnNlRmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhcnNlZEFyZ3MucHVzaChwYXJzZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFyZ1BhcnNlRmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gQ291bGRuJ3QgY29lcmNlIGFyZ3Mgb2YgdGhpcyBvdmVybG9hZCB0byBleHBlY3RlZCB0eXBlLCBtb3ZlXG4gICAgICAgICAgICAgICAgLy8gb24gdG8gbmV4dCBvbmUuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gcGFyc2VkQXJncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQ29udGV4dC5lcnJvcihgRXhwZWN0ZWQgJHtwYXJhbXMubGVuZ3RofSBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke3BhcnNlZEFyZ3MubGVuZ3RofSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyc2VkQXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkID0gQXJyYXkuaXNBcnJheShwYXJhbXMpID8gcGFyYW1zW2ldIDogcGFyYW1zLnR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJnID0gcGFyc2VkQXJnc1tpXTtcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVDb250ZXh0LmNvbmNhdChpICsgMSkuY2hlY2tTdWJ0eXBlKGV4cGVjdGVkLCBhcmcudHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzaWduYXR1cmVDb250ZXh0LmVycm9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvdW5kRXhwcmVzc2lvbihvcCwgdHlwZSwgZXZhbHVhdGUsIHBhcnNlZEFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KCFzaWduYXR1cmVDb250ZXh0IHx8IHNpZ25hdHVyZUNvbnRleHQuZXJyb3JzLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIGlmIChvdmVybG9hZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb250ZXh0LmVycm9ycy5wdXNoKC4uLnNpZ25hdHVyZUNvbnRleHQuZXJyb3JzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkID0gb3ZlcmxvYWRzLmxlbmd0aCA/IG92ZXJsb2FkcyA6IGF2YWlsYWJsZU92ZXJsb2FkcztcbiAgICAgICAgICAgIGNvbnN0IHNpZ25hdHVyZXMgPSBleHBlY3RlZFxuICAgICAgICAgICAgICAgIC5tYXAoKFtwYXJhbXNdKSA9PiBzdHJpbmdpZnlTaWduYXR1cmUocGFyYW1zKSlcbiAgICAgICAgICAgICAgICAuam9pbignIHwgJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFjdHVhbFR5cGVzID0gW107XG4gICAgICAgICAgICAvLyBGb3IgZXJyb3IgbWVzc2FnZSwgcmUtcGFyc2UgYXJndW1lbnRzIHdpdGhvdXQgdHJ5aW5nIHRvXG4gICAgICAgICAgICAvLyBhcHBseSBhbnkgY29lcmNpb25zXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIDEgKyBhY3R1YWxUeXBlcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBhY3R1YWxUeXBlcy5wdXNoKHRvU3RyaW5nKHBhcnNlZC50eXBlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhcmd1bWVudHMgb2YgdHlwZSAke3NpZ25hdHVyZXN9LCBidXQgZm91bmQgKCR7YWN0dWFsVHlwZXMuam9pbignLCAnKX0pIGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVnaXN0ZXIoXG4gICAgICAgIHJlZ2lzdHJ5OiBFeHByZXNzaW9uUmVnaXN0cnksXG4gICAgICAgIGRlZmluaXRpb25zOiB7W186IHN0cmluZ106IERlZmluaXRpb24gfVxuICAgICkge1xuICAgICAgICBhc3NlcnQoIUNvbXBvdW5kRXhwcmVzc2lvbi5kZWZpbml0aW9ucyk7XG4gICAgICAgIENvbXBvdW5kRXhwcmVzc2lvbi5kZWZpbml0aW9ucyA9IGRlZmluaXRpb25zO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5W25hbWVdID0gQ29tcG91bmRFeHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlTaWduYXR1cmUoc2lnbmF0dXJlOiBTaWduYXR1cmUpOiBzdHJpbmcge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNpZ25hdHVyZSkpIHtcbiAgICAgICAgcmV0dXJuIGAoJHtzaWduYXR1cmUubWFwKHRvU3RyaW5nKS5qb2luKCcsICcpfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgKCR7dG9TdHJpbmcoc2lnbmF0dXJlLnR5cGUpfS4uLilgO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29tcG91bmRFeHByZXNzaW9uO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtTdHJpbmdUeXBlLCBCb29sZWFuVHlwZSwgQ29sbGF0b3JUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgQ29sbGF0b3IgZnJvbSAnLi4vdHlwZXMvY29sbGF0b3IuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbGxhdG9yRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgY2FzZVNlbnNpdGl2ZTogRXhwcmVzc2lvbjtcbiAgICBkaWFjcml0aWNTZW5zaXRpdmU6IEV4cHJlc3Npb247XG4gICAgbG9jYWxlOiBFeHByZXNzaW9uIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKGNhc2VTZW5zaXRpdmU6IEV4cHJlc3Npb24sIGRpYWNyaXRpY1NlbnNpdGl2ZTogRXhwcmVzc2lvbiwgbG9jYWxlOiBFeHByZXNzaW9uIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnR5cGUgPSBDb2xsYXRvclR5cGU7XG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlO1xuICAgICAgICB0aGlzLmNhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlO1xuICAgICAgICB0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZSA9IGRpYWNyaXRpY1NlbnNpdGl2ZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gKGFyZ3NbMV06IGFueSk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG9wdGlvbnMpKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYENvbGxhdG9yIG9wdGlvbnMgYXJndW1lbnQgbXVzdCBiZSBhbiBvYmplY3QuYCk7XG5cbiAgICAgICAgY29uc3QgY2FzZVNlbnNpdGl2ZSA9IGNvbnRleHQucGFyc2UoXG4gICAgICAgICAgICBvcHRpb25zWydjYXNlLXNlbnNpdGl2ZSddID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IG9wdGlvbnNbJ2Nhc2Utc2Vuc2l0aXZlJ10sIDEsIEJvb2xlYW5UeXBlKTtcbiAgICAgICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkaWFjcml0aWNTZW5zaXRpdmUgPSBjb250ZXh0LnBhcnNlKFxuICAgICAgICAgICAgb3B0aW9uc1snZGlhY3JpdGljLXNlbnNpdGl2ZSddID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IG9wdGlvbnNbJ2RpYWNyaXRpYy1zZW5zaXRpdmUnXSwgMSwgQm9vbGVhblR5cGUpO1xuICAgICAgICBpZiAoIWRpYWNyaXRpY1NlbnNpdGl2ZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGxvY2FsZSA9IG51bGw7XG4gICAgICAgIGlmIChvcHRpb25zWydsb2NhbGUnXSkge1xuICAgICAgICAgICAgbG9jYWxlID0gY29udGV4dC5wYXJzZShvcHRpb25zWydsb2NhbGUnXSwgMSwgU3RyaW5nVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWxvY2FsZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IENvbGxhdG9yRXhwcmVzc2lvbihjYXNlU2Vuc2l0aXZlLCBkaWFjcml0aWNTZW5zaXRpdmUsIGxvY2FsZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbGxhdG9yKHRoaXMuY2FzZVNlbnNpdGl2ZS5ldmFsdWF0ZShjdHgpLCB0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZS5ldmFsdWF0ZShjdHgpLCB0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlLmV2YWx1YXRlKGN0eCkgOiBudWxsKTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuY2FzZVNlbnNpdGl2ZSk7XG4gICAgICAgIGZuKHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlKTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKSB7XG4gICAgICAgICAgICBmbih0aGlzLmxvY2FsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICAvLyBUZWNobmljYWxseSB0aGUgc2V0IG9mIHBvc3NpYmxlIG91dHB1dHMgaXMgdGhlIGNvbWJpbmF0b3JpYyBzZXQgb2YgQ29sbGF0b3JzIHByb2R1Y2VkXG4gICAgICAgIC8vIGJ5IGFsbCBwb3NzaWJsZSBvdXRwdXRzIG9mIGxvY2FsZS9jYXNlU2Vuc2l0aXZlL2RpYWNyaXRpY1NlbnNpdGl2ZVxuICAgICAgICAvLyBCdXQgZm9yIHRoZSBwcmltYXJ5IHVzZSBvZiBDb2xsYXRvcnMgaW4gY29tcGFyaXNvbiBvcGVyYXRvcnMsIHdlIGlnbm9yZSB0aGUgQ29sbGF0b3Inc1xuICAgICAgICAvLyBwb3NzaWJsZSBvdXRwdXRzIGFueXdheSwgc28gd2UgY2FuIGdldCBhd2F5IHdpdGggbGVhdmluZyB0aGlzIGZhbHNlIGZvciBub3cuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgICAgICAgb3B0aW9uc1snY2FzZS1zZW5zaXRpdmUnXSA9IHRoaXMuY2FzZVNlbnNpdGl2ZS5zZXJpYWxpemUoKTtcbiAgICAgICAgb3B0aW9uc1snZGlhY3JpdGljLXNlbnNpdGl2ZSddID0gdGhpcy5kaWFjcml0aWNTZW5zaXRpdmUuc2VyaWFsaXplKCk7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsZSkge1xuICAgICAgICAgICAgb3B0aW9uc1snbG9jYWxlJ10gPSB0aGlzLmxvY2FsZS5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1wiY29sbGF0b3JcIiwgb3B0aW9uc107XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtpc1ZhbHVlfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7Qm9vbGVhblR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge0dlb0pTT04sIEdlb0pTT05Qb2x5Z29uLCBHZW9KU09OTXVsdGlQb2x5Z29ufSBmcm9tICdAbWFwYm94L2dlb2pzb24tdHlwZXMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuXG50eXBlIEdlb0pTT05Qb2x5Z29ucyA9fCBHZW9KU09OUG9seWdvbiB8IEdlb0pTT05NdWx0aVBvbHlnb247XG5cbi8vIG1pblgsIG1pblksIG1heFgsIG1heFlcbnR5cGUgQkJveCA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuY29uc3QgRVhURU5UID0gODE5MjtcblxuZnVuY3Rpb24gdXBkYXRlQkJveChiYm94OiBCQm94LCBjb29yZDogUG9pbnQpIHtcbiAgICBiYm94WzBdID0gTWF0aC5taW4oYmJveFswXSwgY29vcmRbMF0pO1xuICAgIGJib3hbMV0gPSBNYXRoLm1pbihiYm94WzFdLCBjb29yZFsxXSk7XG4gICAgYmJveFsyXSA9IE1hdGgubWF4KGJib3hbMl0sIGNvb3JkWzBdKTtcbiAgICBiYm94WzNdID0gTWF0aC5tYXgoYmJveFszXSwgY29vcmRbMV0pO1xufVxuXG5mdW5jdGlvbiBtZXJjYXRvclhmcm9tTG5nKGxuZzogbnVtYmVyKSB7XG4gICAgcmV0dXJuICgxODAgKyBsbmcpIC8gMzYwO1xufVxuXG5mdW5jdGlvbiBtZXJjYXRvcllmcm9tTGF0KGxhdDogbnVtYmVyKSB7XG4gICAgcmV0dXJuICgxODAgLSAoMTgwIC8gTWF0aC5QSSAqIE1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkgLyA0ICsgbGF0ICogTWF0aC5QSSAvIDM2MCkpKSkgLyAzNjA7XG59XG5cbmZ1bmN0aW9uIGJveFdpdGhpbkJveChiYm94MTogQkJveCwgYmJveDI6IEJCb3gpIHtcbiAgICBpZiAoYmJveDFbMF0gPD0gYmJveDJbMF0pIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYmJveDFbMl0gPj0gYmJveDJbMl0pIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYmJveDFbMV0gPD0gYmJveDJbMV0pIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYmJveDFbM10gPj0gYmJveDJbM10pIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0VGlsZUNvb3JkaW5hdGVzKHAsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgY29uc3QgeCA9IG1lcmNhdG9yWGZyb21MbmcocFswXSk7XG4gICAgY29uc3QgeSA9IG1lcmNhdG9yWWZyb21MYXQocFsxXSk7XG4gICAgY29uc3QgdGlsZXNBdFpvb20gPSBNYXRoLnBvdygyLCBjYW5vbmljYWwueik7XG4gICAgcmV0dXJuIFtNYXRoLnJvdW5kKHggKiB0aWxlc0F0Wm9vbSAqIEVYVEVOVCksIE1hdGgucm91bmQoeSAqIHRpbGVzQXRab29tICogRVhURU5UKV07XG59XG5cbmZ1bmN0aW9uIG9uQm91bmRhcnkocCwgcDEsIHAyKSB7XG4gICAgY29uc3QgeDEgPSBwWzBdIC0gcDFbMF07XG4gICAgY29uc3QgeTEgPSBwWzFdIC0gcDFbMV07XG4gICAgY29uc3QgeDIgPSBwWzBdIC0gcDJbMF07XG4gICAgY29uc3QgeTIgPSBwWzFdIC0gcDJbMV07XG4gICAgcmV0dXJuICh4MSAqIHkyIC0geDIgKiB5MSA9PT0gMCkgJiYgKHgxICogeDIgPD0gMCkgJiYgKHkxICogeTIgPD0gMCk7XG59XG5cbmZ1bmN0aW9uIHJheUludGVyc2VjdChwLCBwMSwgcDIpIHtcbiAgICByZXR1cm4gKChwMVsxXSA+IHBbMV0pICE9PSAocDJbMV0gPiBwWzFdKSkgJiYgKHBbMF0gPCAocDJbMF0gLSBwMVswXSkgKiAocFsxXSAtIHAxWzFdKSAvIChwMlsxXSAtIHAxWzFdKSArIHAxWzBdKTtcbn1cblxuLy8gcmF5IGNhc3RpbmcgYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgaWYgcG9pbnQgaXMgaW4gcG9seWdvblxuZnVuY3Rpb24gcG9pbnRXaXRoaW5Qb2x5Z29uKHBvaW50LCByaW5ncykge1xuICAgIGxldCBpbnNpZGUgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmluZyA9IHJpbmdzW2ldO1xuICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuMiA9IHJpbmcubGVuZ3RoOyBqIDwgbGVuMiAtIDE7IGorKykge1xuICAgICAgICAgICAgaWYgKG9uQm91bmRhcnkocG9pbnQsIHJpbmdbal0sIHJpbmdbaiArIDFdKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJheUludGVyc2VjdChwb2ludCwgcmluZ1tqXSwgcmluZ1tqICsgMV0pKSBpbnNpZGUgPSAhaW5zaWRlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnNpZGU7XG59XG5cbmZ1bmN0aW9uIHBvaW50V2l0aGluUG9seWdvbnMocG9pbnQsIHBvbHlnb25zKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocG9pbnRXaXRoaW5Qb2x5Z29uKHBvaW50LCBwb2x5Z29uc1tpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBlcnAodjEsIHYyKSB7XG4gICAgcmV0dXJuICh2MVswXSAqIHYyWzFdIC0gdjFbMV0gKiB2MlswXSk7XG59XG5cbi8vIGNoZWNrIGlmIHAxIGFuZCBwMiBhcmUgaW4gZGlmZmVyZW50IHNpZGVzIG9mIGxpbmUgc2VnbWVudCBxMS0+cTJcbmZ1bmN0aW9uICB0d29TaWRlZChwMSwgcDIsIHExLCBxMikge1xuICAgIC8vIHExLT5wMSAoeDEsIHkxKSwgcTEtPnAyICh4MiwgeTIpLCBxMS0+cTIgKHgzLCB5MylcbiAgICBjb25zdCB4MSA9IHAxWzBdIC0gcTFbMF07XG4gICAgY29uc3QgeTEgPSBwMVsxXSAtIHExWzFdO1xuICAgIGNvbnN0IHgyID0gcDJbMF0gLSBxMVswXTtcbiAgICBjb25zdCB5MiA9IHAyWzFdIC0gcTFbMV07XG4gICAgY29uc3QgeDMgPSBxMlswXSAtIHExWzBdO1xuICAgIGNvbnN0IHkzID0gcTJbMV0gLSBxMVsxXTtcbiAgICBjb25zdCBkZXQxID0gKHgxICogeTMgLSB4MyAqIHkxKTtcbiAgICBjb25zdCBkZXQyID0gICh4MiAqIHkzIC0geDMgKiB5Mik7XG4gICAgaWYgKChkZXQxID4gMCAmJiBkZXQyIDwgMCkgfHwgKGRldDEgPCAwICYmIGRldDIgPiAwKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLy8gYSwgYiBhcmUgZW5kIHBvaW50cyBmb3IgbGluZSBzZWdtZW50MSwgYyBhbmQgZCBhcmUgZW5kIHBvaW50cyBmb3IgbGluZSBzZWdtZW50MlxuZnVuY3Rpb24gbGluZUludGVyc2VjdExpbmUoYSwgYiwgYywgZCkge1xuICAgIC8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBhcmUgcGFyYWxsZWwgb3Igbm90XG4gICAgLy8gcHJlY29uZGl0aW9uIGlzIGVuZCBwb2ludCBhLCBiIGlzIGluc2lkZSBwb2x5Z29uLCBpZiBsaW5lIGEtPmIgaXNcbiAgICAvLyBwYXJhbGxlbCB0byBwb2x5Z29uIGVkZ2UgYy0+ZCwgdGhlbiBhLT5iIHdvbid0IGludGVyc2VjdCB3aXRoIGMtPmRcbiAgICBjb25zdCB2ZWN0b3JQID0gW2JbMF0gLSBhWzBdLCBiWzFdIC0gYVsxXV07XG4gICAgY29uc3QgdmVjdG9yUSA9IFtkWzBdIC0gY1swXSwgZFsxXSAtIGNbMV1dO1xuICAgIGlmIChwZXJwKHZlY3RvclEsIHZlY3RvclApID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBJZiBsaW5lcyBhcmUgaW50ZXJzZWN0aW5nIHdpdGggZWFjaCBvdGhlciwgdGhlIHJlbGF0aXZlIGxvY2F0aW9uIHNob3VsZCBiZTpcbiAgICAvLyBhIGFuZCBiIGxpZSBpbiBkaWZmZXJlbnQgc2lkZXMgb2Ygc2VnbWVudCBjLT5kXG4gICAgLy8gYyBhbmQgZCBsaWUgaW4gZGlmZmVyZW50IHNpZGVzIG9mIHNlZ21lbnQgYS0+YlxuICAgIGlmICh0d29TaWRlZChhLCBiLCBjLCBkKSAmJiB0d29TaWRlZChjLCBkLCBhLCBiKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsaW5lSW50ZXJzZWN0UG9seWdvbihwMSwgcDIsIHBvbHlnb24pIHtcbiAgICBmb3IgKGNvbnN0IHJpbmcgb2YgcG9seWdvbikge1xuICAgICAgICAvLyBsb29wIHRocm91Z2ggZXZlcnkgZWRnZSBvZiB0aGUgcmluZ1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJpbmcubGVuZ3RoIC0gMTsgKytqKSB7XG4gICAgICAgICAgICBpZiAobGluZUludGVyc2VjdExpbmUocDEsIHAyLCByaW5nW2pdLCByaW5nW2ogKyAxXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29uKGxpbmUsIHBvbHlnb24pIHtcbiAgICAvLyBGaXJzdCwgY2hlY2sgaWYgZ2VvbWV0cnkgcG9pbnRzIG9mIGxpbmUgc2VnbWVudHMgYXJlIGFsbCBpbnNpZGUgcG9seWdvblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoIXBvaW50V2l0aGluUG9seWdvbihsaW5lW2ldLCBwb2x5Z29uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2Vjb25kLCBjaGVjayBpZiB0aGVyZSBpcyBsaW5lIHNlZ21lbnQgaW50ZXJzZWN0aW5nIHBvbHlnb24gZWRnZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgICAgaWYgKGxpbmVJbnRlcnNlY3RQb2x5Z29uKGxpbmVbaV0sIGxpbmVbaSArIDFdLCBwb2x5Z29uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsaW5lU3RyaW5nV2l0aGluUG9seWdvbnMobGluZSwgcG9seWdvbnMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChsaW5lU3RyaW5nV2l0aGluUG9seWdvbihsaW5lLCBwb2x5Z29uc1tpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVQb2x5Z29uKGNvb3JkaW5hdGVzLCBiYm94LCBjYW5vbmljYWwpIHtcbiAgICBjb25zdCBwb2x5Z29uID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZGluYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByaW5nID0gW107XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29vcmRpbmF0ZXNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkID0gZ2V0VGlsZUNvb3JkaW5hdGVzKGNvb3JkaW5hdGVzW2ldW2pdLCBjYW5vbmljYWwpO1xuICAgICAgICAgICAgdXBkYXRlQkJveChiYm94LCBjb29yZCk7XG4gICAgICAgICAgICByaW5nLnB1c2goY29vcmQpO1xuICAgICAgICB9XG4gICAgICAgIHBvbHlnb24ucHVzaChyaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvbHlnb247XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVQb2x5Z29ucyhjb29yZGluYXRlcywgYmJveCwgY2Fub25pY2FsKSB7XG4gICAgY29uc3QgcG9seWdvbnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBvbHlnb24gPSBnZXRUaWxlUG9seWdvbihjb29yZGluYXRlc1tpXSwgYmJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvbHlnb25zO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQb2ludChwLCBiYm94LCBwb2x5QkJveCwgd29ybGRTaXplKSB7XG4gICAgaWYgKHBbMF0gPCBwb2x5QkJveFswXSB8fCBwWzBdID4gcG9seUJCb3hbMl0pIHtcbiAgICAgICAgY29uc3QgaGFsZldvcmxkU2l6ZSA9IHdvcmxkU2l6ZSAqIDAuNTtcbiAgICAgICAgbGV0IHNoaWZ0ID0gKHBbMF0gLSBwb2x5QkJveFswXSA+IGhhbGZXb3JsZFNpemUpID8gLXdvcmxkU2l6ZSA6IChwb2x5QkJveFswXSAtIHBbMF0gPiBoYWxmV29ybGRTaXplKSA/IHdvcmxkU2l6ZSA6IDA7XG4gICAgICAgIGlmIChzaGlmdCA9PT0gMCkge1xuICAgICAgICAgICAgc2hpZnQgPSAocFswXSAtIHBvbHlCQm94WzJdID4gaGFsZldvcmxkU2l6ZSkgPyAtd29ybGRTaXplIDogKHBvbHlCQm94WzJdIC0gcFswXSA+IGhhbGZXb3JsZFNpemUpID8gd29ybGRTaXplIDogMDtcbiAgICAgICAgfVxuICAgICAgICBwWzBdICs9IHNoaWZ0O1xuICAgIH1cbiAgICB1cGRhdGVCQm94KGJib3gsIHApO1xufVxuXG5mdW5jdGlvbiByZXNldEJCb3goYmJveCkge1xuICAgIGJib3hbMF0gPSBiYm94WzFdID0gSW5maW5pdHk7XG4gICAgYmJveFsyXSA9IGJib3hbM10gPSAtSW5maW5pdHk7XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVQb2ludHMoZ2VvbWV0cnksIHBvaW50QkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCkge1xuICAgIGNvbnN0IHdvcmxkU2l6ZSA9IE1hdGgucG93KDIsIGNhbm9uaWNhbC56KSAqIEVYVEVOVDtcbiAgICBjb25zdCBzaGlmdHMgPSBbY2Fub25pY2FsLnggKiBFWFRFTlQsIGNhbm9uaWNhbC55ICogRVhURU5UXTtcbiAgICBjb25zdCB0aWxlUG9pbnRzID0gW107XG4gICAgZm9yIChjb25zdCBwb2ludHMgb2YgZ2VvbWV0cnkpIHtcbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBwb2ludHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBbcG9pbnQueCArIHNoaWZ0c1swXSwgcG9pbnQueSArIHNoaWZ0c1sxXV07XG4gICAgICAgICAgICB1cGRhdGVQb2ludChwLCBwb2ludEJCb3gsIHBvbHlCQm94LCB3b3JsZFNpemUpO1xuICAgICAgICAgICAgdGlsZVBvaW50cy5wdXNoKHApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aWxlUG9pbnRzO1xufVxuXG5mdW5jdGlvbiBnZXRUaWxlTGluZXMoZ2VvbWV0cnksIGxpbmVCQm94LCBwb2x5QkJveCwgY2Fub25pY2FsKSB7XG4gICAgY29uc3Qgd29ybGRTaXplID0gTWF0aC5wb3coMiwgY2Fub25pY2FsLnopICogRVhURU5UO1xuICAgIGNvbnN0IHNoaWZ0cyA9IFtjYW5vbmljYWwueCAqIEVYVEVOVCwgY2Fub25pY2FsLnkgKiBFWFRFTlRdO1xuICAgIGNvbnN0IHRpbGVMaW5lcyA9IFtdO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBnZW9tZXRyeSkge1xuICAgICAgICBjb25zdCB0aWxlTGluZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIGxpbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBbcG9pbnQueCArIHNoaWZ0c1swXSwgcG9pbnQueSArIHNoaWZ0c1sxXV07XG4gICAgICAgICAgICB1cGRhdGVCQm94KGxpbmVCQm94LCBwKTtcbiAgICAgICAgICAgIHRpbGVMaW5lLnB1c2gocCk7XG4gICAgICAgIH1cbiAgICAgICAgdGlsZUxpbmVzLnB1c2godGlsZUxpbmUpO1xuICAgIH1cbiAgICBpZiAobGluZUJCb3hbMl0gLSBsaW5lQkJveFswXSA8PSB3b3JsZFNpemUgLyAyKSB7XG4gICAgICAgIHJlc2V0QkJveChsaW5lQkJveCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiB0aWxlTGluZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBsaW5lKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlUG9pbnQocCwgbGluZUJCb3gsIHBvbHlCQm94LCB3b3JsZFNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aWxlTGluZXM7XG59XG5cbmZ1bmN0aW9uIHBvaW50c1dpdGhpblBvbHlnb25zKGN0eDogRXZhbHVhdGlvbkNvbnRleHQsIHBvbHlnb25HZW9tZXRyeTogR2VvSlNPTlBvbHlnb25zKSB7XG4gICAgY29uc3QgcG9pbnRCQm94ID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuICAgIGNvbnN0IHBvbHlCQm94ID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuXG4gICAgY29uc3QgY2Fub25pY2FsID0gY3R4LmNhbm9uaWNhbElEKCk7XG5cbiAgICBpZiAocG9seWdvbkdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBjb25zdCB0aWxlUG9seWdvbiA9IGdldFRpbGVQb2x5Z29uKHBvbHlnb25HZW9tZXRyeS5jb29yZGluYXRlcywgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGNvbnN0IHRpbGVQb2ludHMgPSBnZXRUaWxlUG9pbnRzKGN0eC5nZW9tZXRyeSgpLCBwb2ludEJCb3gsIHBvbHlCQm94LCBjYW5vbmljYWwpO1xuICAgICAgICBpZiAoIWJveFdpdGhpbkJveChwb2ludEJCb3gsIHBvbHlCQm94KSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgdGlsZVBvaW50cykge1xuICAgICAgICAgICAgaWYgKCFwb2ludFdpdGhpblBvbHlnb24ocG9pbnQsIHRpbGVQb2x5Z29uKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwb2x5Z29uR2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgY29uc3QgdGlsZVBvbHlnb25zID0gZ2V0VGlsZVBvbHlnb25zKHBvbHlnb25HZW9tZXRyeS5jb29yZGluYXRlcywgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGNvbnN0IHRpbGVQb2ludHMgPSBnZXRUaWxlUG9pbnRzKGN0eC5nZW9tZXRyeSgpLCBwb2ludEJCb3gsIHBvbHlCQm94LCBjYW5vbmljYWwpO1xuICAgICAgICBpZiAoIWJveFdpdGhpbkJveChwb2ludEJCb3gsIHBvbHlCQm94KSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgdGlsZVBvaW50cykge1xuICAgICAgICAgICAgaWYgKCFwb2ludFdpdGhpblBvbHlnb25zKHBvaW50LCB0aWxlUG9seWdvbnMpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gbGluZXNXaXRoaW5Qb2x5Z29ucyhjdHg6IEV2YWx1YXRpb25Db250ZXh0LCBwb2x5Z29uR2VvbWV0cnk6IEdlb0pTT05Qb2x5Z29ucykge1xuICAgIGNvbnN0IGxpbmVCQm94ID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuICAgIGNvbnN0IHBvbHlCQm94ID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuXG4gICAgY29uc3QgY2Fub25pY2FsID0gY3R4LmNhbm9uaWNhbElEKCk7XG5cbiAgICBpZiAocG9seWdvbkdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBjb25zdCB0aWxlUG9seWdvbiA9IGdldFRpbGVQb2x5Z29uKHBvbHlnb25HZW9tZXRyeS5jb29yZGluYXRlcywgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGNvbnN0IHRpbGVMaW5lcyA9IGdldFRpbGVMaW5lcyhjdHguZ2VvbWV0cnkoKSwgbGluZUJCb3gsIHBvbHlCQm94LCBjYW5vbmljYWwpO1xuICAgICAgICBpZiAoIWJveFdpdGhpbkJveChsaW5lQkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHRpbGVMaW5lcykge1xuICAgICAgICAgICAgaWYgKCFsaW5lU3RyaW5nV2l0aGluUG9seWdvbihsaW5lLCB0aWxlUG9seWdvbikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9seWdvbkdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIGNvbnN0IHRpbGVQb2x5Z29ucyA9IGdldFRpbGVQb2x5Z29ucyhwb2x5Z29uR2VvbWV0cnkuY29vcmRpbmF0ZXMsIHBvbHlCQm94LCBjYW5vbmljYWwpO1xuICAgICAgICBjb25zdCB0aWxlTGluZXMgPSBnZXRUaWxlTGluZXMoY3R4Lmdlb21ldHJ5KCksIGxpbmVCQm94LCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgaWYgKCFib3hXaXRoaW5Cb3gobGluZUJCb3gsIHBvbHlCQm94KSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiB0aWxlTGluZXMpIHtcbiAgICAgICAgICAgIGlmICghbGluZVN0cmluZ1dpdGhpblBvbHlnb25zKGxpbmUsIHRpbGVQb2x5Z29ucykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuY2xhc3MgV2l0aGluIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBnZW9qc29uOiBHZW9KU09OXG4gICAgZ2VvbWV0cmllczogR2VvSlNPTlBvbHlnb25zO1xuXG4gICAgY29uc3RydWN0b3IoZ2VvanNvbjogR2VvSlNPTiwgZ2VvbWV0cmllczogR2VvSlNPTlBvbHlnb25zKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IEJvb2xlYW5UeXBlO1xuICAgICAgICB0aGlzLmdlb2pzb24gPSBnZW9qc29uO1xuICAgICAgICB0aGlzLmdlb21ldHJpZXMgPSBnZW9tZXRyaWVzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGAnd2l0aGluJyBleHByZXNzaW9uIHJlcXVpcmVzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG4gICAgICAgIGlmIChpc1ZhbHVlKGFyZ3NbMV0pKSB7XG4gICAgICAgICAgICBjb25zdCBnZW9qc29uID0gKGFyZ3NbMV06IE9iamVjdCk7XG4gICAgICAgICAgICBpZiAoZ2VvanNvbi50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBnZW9qc29uLmZlYXR1cmVzW2ldLmdlb21ldHJ5LnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2l0aGluKGdlb2pzb24sIGdlb2pzb24uZmVhdHVyZXNbaV0uZ2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChnZW9qc29uLnR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBnZW9qc29uLmdlb21ldHJ5LnR5cGU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdQb2x5Z29uJyB8fCB0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpdGhpbihnZW9qc29uLCBnZW9qc29uLmdlb21ldHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdlb2pzb24udHlwZSAgPT09ICdQb2x5Z29uJyB8fCBnZW9qc29uLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaXRoaW4oZ2VvanNvbiwgZ2VvanNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYCd3aXRoaW4nIGV4cHJlc3Npb24gcmVxdWlyZXMgdmFsaWQgZ2VvanNvbiBvYmplY3QgdGhhdCBjb250YWlucyBwb2x5Z29uIGdlb21ldHJ5IHR5cGUuYCk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBpZiAoY3R4Lmdlb21ldHJ5KCkgIT0gbnVsbCAmJiBjdHguY2Fub25pY2FsSUQoKSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4Lmdlb21ldHJ5VHlwZSgpID09PSAnUG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvaW50c1dpdGhpblBvbHlnb25zKGN0eCwgdGhpcy5nZW9tZXRyaWVzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4Lmdlb21ldHJ5VHlwZSgpID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGluZXNXaXRoaW5Qb2x5Z29ucyhjdHgsIHRoaXMuZ2VvbWV0cmllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZCgpIHt9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgcmV0dXJuIFtcIndpdGhpblwiLCB0aGlzLmdlb2pzb25dO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBXaXRoaW47XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4vY29tcG91bmRfZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgV2l0aGluIGZyb20gJy4vZGVmaW5pdGlvbnMvd2l0aGluLmpzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuL2V4cHJlc3Npb24uanMnO1xuXG5mdW5jdGlvbiBpc0ZlYXR1cmVDb25zdGFudChlOiBFeHByZXNzaW9uKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ2dldCcgJiYgZS5hcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGUubmFtZSA9PT0gJ2ZlYXR1cmUtc3RhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZS5uYW1lID09PSAnaGFzJyAmJiBlLmFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBlLm5hbWUgPT09ICdwcm9wZXJ0aWVzJyB8fFxuICAgICAgICAgICAgZS5uYW1lID09PSAnZ2VvbWV0cnktdHlwZScgfHxcbiAgICAgICAgICAgIGUubmFtZSA9PT0gJ2lkJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICgvXmZpbHRlci0vLnRlc3QoZS5uYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGUgaW5zdGFuY2VvZiBXaXRoaW4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuICAgIGUuZWFjaENoaWxkKGFyZyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgIWlzRmVhdHVyZUNvbnN0YW50KGFyZykpIHsgcmVzdWx0ID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc1N0YXRlQ29uc3RhbnQoZTogRXhwcmVzc2lvbikge1xuICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT09ICdmZWF0dXJlLXN0YXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuICAgIGUuZWFjaENoaWxkKGFyZyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgIWlzU3RhdGVDb25zdGFudChhcmcpKSB7IHJlc3VsdCA9IGZhbHNlOyB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGU6IEV4cHJlc3Npb24sIHByb3BlcnRpZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbiAmJiBwcm9wZXJ0aWVzLmluZGV4T2YoZS5uYW1lKSA+PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuICAgIGUuZWFjaENoaWxkKChhcmcpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGFyZywgcHJvcGVydGllcykpIHsgcmVzdWx0ID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQge2lzRmVhdHVyZUNvbnN0YW50LCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzU3RhdGVDb25zdGFudH07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0ICBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuXG5jbGFzcyBWYXIgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBib3VuZEV4cHJlc3Npb246IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGJvdW5kRXhwcmVzc2lvbjogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBib3VuZEV4cHJlc3Npb24udHlwZTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5ib3VuZEV4cHJlc3Npb24gPSBib3VuZEV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyIHx8IHR5cGVvZiBhcmdzWzFdICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGAndmFyJyBleHByZXNzaW9uIHJlcXVpcmVzIGV4YWN0bHkgb25lIHN0cmluZyBsaXRlcmFsIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBhcmdzWzFdO1xuICAgICAgICBpZiAoIWNvbnRleHQuc2NvcGUuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVW5rbm93biB2YXJpYWJsZSBcIiR7bmFtZX1cIi4gTWFrZSBzdXJlIFwiJHtuYW1lfVwiIGhhcyBiZWVuIGJvdW5kIGluIGFuIGVuY2xvc2luZyBcImxldFwiIGV4cHJlc3Npb24gYmVmb3JlIHVzaW5nIGl0LmAsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBWYXIobmFtZSwgY29udGV4dC5zY29wZS5nZXQobmFtZSkpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRFeHByZXNzaW9uLmV2YWx1YXRlKGN0eCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKCkge31cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiBbXCJ2YXJcIiwgdGhpcy5uYW1lXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZhcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTY29wZSBmcm9tICcuL3Njb3BlLmpzJztcbmltcG9ydCB7Y2hlY2tTdWJ0eXBlfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCBQYXJzaW5nRXJyb3IgZnJvbSAnLi9wYXJzaW5nX2Vycm9yLmpzJztcbmltcG9ydCBMaXRlcmFsIGZyb20gJy4vZGVmaW5pdGlvbnMvbGl0ZXJhbC5qcyc7XG5pbXBvcnQgQXNzZXJ0aW9uIGZyb20gJy4vZGVmaW5pdGlvbnMvYXNzZXJ0aW9uLmpzJztcbmltcG9ydCBDb2VyY2lvbiBmcm9tICcuL2RlZmluaXRpb25zL2NvZXJjaW9uLmpzJztcbmltcG9ydCBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4vY29tcG91bmRfZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgQ29sbGF0b3JFeHByZXNzaW9uIGZyb20gJy4vZGVmaW5pdGlvbnMvY29sbGF0b3IuanMnO1xuaW1wb3J0IFdpdGhpbiBmcm9tICcuL2RlZmluaXRpb25zL3dpdGhpbi5qcyc7XG5pbXBvcnQge2lzR2xvYmFsUHJvcGVydHlDb25zdGFudCwgaXNGZWF0dXJlQ29uc3RhbnR9IGZyb20gJy4vaXNfY29uc3RhbnQuanMnO1xuaW1wb3J0IFZhciBmcm9tICcuL2RlZmluaXRpb25zL3Zhci5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9uLCBFeHByZXNzaW9uUmVnaXN0cnl9IGZyb20gJy4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogU3RhdGUgYXNzb2NpYXRlZCBwYXJzaW5nIGF0IGEgZ2l2ZW4gcG9pbnQgaW4gYW4gZXhwcmVzc2lvbiB0cmVlLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgUGFyc2luZ0NvbnRleHQge1xuICAgIHJlZ2lzdHJ5OiBFeHByZXNzaW9uUmVnaXN0cnk7XG4gICAgcGF0aDogQXJyYXk8bnVtYmVyPjtcbiAgICBrZXk6IHN0cmluZztcbiAgICBzY29wZTogU2NvcGU7XG4gICAgZXJyb3JzOiBBcnJheTxQYXJzaW5nRXJyb3I+O1xuXG4gICAgLy8gVGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhpcyBleHByZXNzaW9uLiBQcm92aWRlZCBvbmx5IHRvIGFsbG93IEV4cHJlc3Npb25cbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgdG8gaW5mZXIgYXJndW1lbnQgdHlwZXM6IEV4cHJlc3Npb24jcGFyc2UoKSBuZWVkIG5vdFxuICAgIC8vIGNoZWNrIHRoYXQgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBwYXJzZWQgZXhwcmVzc2lvbiBtYXRjaGVzXG4gICAgLy8gYGV4cGVjdGVkVHlwZWAuXG4gICAgZXhwZWN0ZWRUeXBlOiA/VHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICByZWdpc3RyeTogRXhwcmVzc2lvblJlZ2lzdHJ5LFxuICAgICAgICBwYXRoOiBBcnJheTxudW1iZXI+ID0gW10sXG4gICAgICAgIGV4cGVjdGVkVHlwZTogP1R5cGUsXG4gICAgICAgIHNjb3BlOiBTY29wZSA9IG5ldyBTY29wZSgpLFxuICAgICAgICBlcnJvcnM6IEFycmF5PFBhcnNpbmdFcnJvcj4gPSBbXVxuICAgICkge1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMua2V5ID0gcGF0aC5tYXAocGFydCA9PiBgWyR7cGFydH1dYCkuam9pbignJyk7XG4gICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgIHRoaXMuZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBleHByIHRoZSBKU09OIGV4cHJlc3Npb24gdG8gcGFyc2VcbiAgICAgKiBAcGFyYW0gaW5kZXggdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGluZGV4IGlmIHRoaXMgZXhwcmVzc2lvbiBpcyBhbiBhcmd1bWVudCBvZiBhIHBhcmVudCBleHByZXNzaW9uIHRoYXQncyBiZWluZyBwYXJzZWRcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zLm9taXRUeXBlQW5ub3RhdGlvbnMgc2V0IHRydWUgdG8gb21pdCBpbmZlcnJlZCB0eXBlIGFubm90YXRpb25zLiAgQ2FsbGVyIGJld2FyZTogd2l0aCB0aGlzIG9wdGlvbiBzZXQsIHRoZSBwYXJzZWQgZXhwcmVzc2lvbidzIHR5cGUgd2lsbCBOT1Qgc2F0aXNmeSBgZXhwZWN0ZWRUeXBlYCBpZiBpdCB3b3VsZCBub3JtYWxseSBiZSB3cmFwcGVkIGluIGFuIGluZmVycmVkIGFubm90YXRpb24uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwYXJzZShcbiAgICAgICAgZXhwcjogbWl4ZWQsXG4gICAgICAgIGluZGV4PzogbnVtYmVyLFxuICAgICAgICBleHBlY3RlZFR5cGU/OiA/VHlwZSxcbiAgICAgICAgYmluZGluZ3M/OiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4sXG4gICAgICAgIG9wdGlvbnM6IHt0eXBlQW5ub3RhdGlvbj86ICdhc3NlcnQnIHwgJ2NvZXJjZScgfCAnb21pdCd9ID0ge31cbiAgICApOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uY2F0KGluZGV4LCBleHBlY3RlZFR5cGUsIGJpbmRpbmdzKS5fcGFyc2UoZXhwciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlKGV4cHIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIF9wYXJzZShleHByOiBtaXhlZCwgb3B0aW9uczoge3R5cGVBbm5vdGF0aW9uPzogJ2Fzc2VydCcgfCAnY29lcmNlJyB8ICdvbWl0J30pOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChleHByID09PSBudWxsIHx8IHR5cGVvZiBleHByID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZXhwciA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBleHByID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgZXhwciA9IFsnbGl0ZXJhbCcsIGV4cHJdO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYW5ub3RhdGUocGFyc2VkLCB0eXBlLCB0eXBlQW5ub3RhdGlvbjogJ2Fzc2VydCcgfCAnY29lcmNlJyB8ICdvbWl0Jykge1xuICAgICAgICAgICAgaWYgKHR5cGVBbm5vdGF0aW9uID09PSAnYXNzZXJ0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHR5cGUsIFtwYXJzZWRdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZUFubm90YXRpb24gPT09ICdjb2VyY2UnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2VyY2lvbih0eXBlLCBbcGFyc2VkXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShleHByKSkge1xuICAgICAgICAgICAgaWYgKGV4cHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYEV4cGVjdGVkIGFuIGFycmF5IHdpdGggYXQgbGVhc3Qgb25lIGVsZW1lbnQuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbXV0uYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG9wID0gZXhwclswXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3AgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcihgRXhwcmVzc2lvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGJ1dCBmb3VuZCAke3R5cGVvZiBvcH0gaW5zdGVhZC4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFsuLi5dXS5gLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgRXhwciA9IHRoaXMucmVnaXN0cnlbb3BdO1xuICAgICAgICAgICAgaWYgKEV4cHIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VkID0gRXhwci5wYXJzZShleHByLCB0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5leHBlY3RlZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSB0aGlzLmV4cGVjdGVkVHlwZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsID0gcGFyc2VkLnR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB3ZSBleHBlY3QgYSBudW1iZXIsIHN0cmluZywgYm9vbGVhbiwgb3IgYXJyYXkgYnV0IGhhdmUgYSB2YWx1ZSwgd3JhcCBpdCBpbiBhbiBhc3NlcnRpb24uXG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UgZXhwZWN0IGEgY29sb3Igb3IgZm9ybWF0dGVkIHN0cmluZywgYnV0IGhhdmUgYSBzdHJpbmcgb3IgdmFsdWUsIHdyYXAgaXQgaW4gYSBjb2VyY2lvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBkbyBzdGF0aWMgdHlwZS1jaGVja2luZy5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgYmVoYXZpb3JzIGFyZSBvdmVycmlkYWJsZSBmb3I6XG4gICAgICAgICAgICAgICAgICAgIC8vICAgKiBUaGUgXCJjb2FsZXNjZVwiIG9wZXJhdG9yLCB3aGljaCBuZWVkcyB0byBvbWl0IHR5cGUgYW5ub3RhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgIC8vICAgKiBTdHJpbmctdmFsdWVkIHByb3BlcnRpZXMgKGUuZy4gYHRleHQtZmllbGRgKSwgd2hlcmUgY29lcmNpb24gaXMgbW9yZSBjb252ZW5pZW50IHRoYW4gYXNzZXJ0aW9uLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGV4cGVjdGVkLmtpbmQgPT09ICdzdHJpbmcnIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdudW1iZXInIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdib29sZWFuJyB8fCBleHBlY3RlZC5raW5kID09PSAnb2JqZWN0JyB8fCBleHBlY3RlZC5raW5kID09PSAnYXJyYXknKSAmJiBhY3R1YWwua2luZCA9PT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gYW5ub3RhdGUocGFyc2VkLCBleHBlY3RlZCwgb3B0aW9ucy50eXBlQW5ub3RhdGlvbiB8fCAnYXNzZXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV4cGVjdGVkLmtpbmQgPT09ICdjb2xvcicgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ2Zvcm1hdHRlZCcgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ3Jlc29sdmVkSW1hZ2UnKSAmJiAoYWN0dWFsLmtpbmQgPT09ICd2YWx1ZScgfHwgYWN0dWFsLmtpbmQgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gYW5ub3RhdGUocGFyc2VkLCBleHBlY3RlZCwgb3B0aW9ucy50eXBlQW5ub3RhdGlvbiB8fCAnY29lcmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja1N1YnR5cGUoZXhwZWN0ZWQsIGFjdHVhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gZXhwcmVzc2lvbidzIGFyZ3VtZW50cyBhcmUgYWxsIGxpdGVyYWxzLCB3ZSBjYW4gZXZhbHVhdGVcbiAgICAgICAgICAgICAgICAvLyBpdCBpbW1lZGlhdGVseSBhbmQgcmVwbGFjZSBpdCB3aXRoIGEgbGl0ZXJhbCB2YWx1ZSBpbiB0aGVcbiAgICAgICAgICAgICAgICAvLyBwYXJzZWQvY29tcGlsZWQgcmVzdWx0LiBFeHByZXNzaW9ucyB0aGF0IGV4cGVjdCBhbiBpbWFnZSBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBub3QgYmUgcmVzb2x2ZWQgaGVyZSBzbyB3ZSBjYW4gbGF0ZXIgZ2V0IHRoZSBhdmFpbGFibGUgaW1hZ2VzLlxuICAgICAgICAgICAgICAgIGlmICghKHBhcnNlZCBpbnN0YW5jZW9mIExpdGVyYWwpICYmIChwYXJzZWQudHlwZS5raW5kICE9PSAncmVzb2x2ZWRJbWFnZScpICYmIGlzQ29uc3RhbnQocGFyc2VkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlYyA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gbmV3IExpdGVyYWwocGFyc2VkLnR5cGUsIHBhcnNlZC5ldmFsdWF0ZShlYykpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKGBVbmtub3duIGV4cHJlc3Npb24gXCIke29wfVwiLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLmAsIDApO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHByID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYCd1bmRlZmluZWQnIHZhbHVlIGludmFsaWQuIFVzZSBudWxsIGluc3RlYWQuYCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cHIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgQmFyZSBvYmplY3RzIGludmFsaWQuIFVzZSBbXCJsaXRlcmFsXCIsIHsuLi59XSBpbnN0ZWFkLmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYEV4cGVjdGVkIGFuIGFycmF5LCBidXQgZm91bmQgJHt0eXBlb2YgZXhwcn0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgY29udGV4dCBzdWl0YWJsZSBmb3IgcGFyc2luZyB0aGUgc3ViZXhwcmVzc2lvbiBhdFxuICAgICAqIGluZGV4IGBpbmRleGAsIG9wdGlvbmFsbHkgYXBwZW5kaW5nIHRvICdsZXQnIGJpbmRpbmcgbWFwLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IGBlcnJvcnNgIHByb3BlcnR5LCBpbnRlbmRlZCBmb3IgY29sbGVjdGluZyBlcnJvcnMgd2hpbGVcbiAgICAgKiBwYXJzaW5nLCBpcyBjb3BpZWQgYnkgcmVmZXJlbmNlIHJhdGhlciB0aGFuIGNsb25lZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbmNhdChpbmRleDogbnVtYmVyLCBleHBlY3RlZFR5cGU/OiA/VHlwZSwgYmluZGluZ3M/OiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4pIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyB0aGlzLnBhdGguY29uY2F0KGluZGV4KSA6IHRoaXMucGF0aDtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBiaW5kaW5ncyA/IHRoaXMuc2NvcGUuY29uY2F0KGJpbmRpbmdzKSA6IHRoaXMuc2NvcGU7XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2luZ0NvbnRleHQoXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5LFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGV4cGVjdGVkVHlwZSB8fCBudWxsLFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICB0aGlzLmVycm9yc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1c2ggYSBwYXJzaW5nIChvciB0eXBlIGNoZWNraW5nKSBlcnJvciBpbnRvIHRoZSBgdGhpcy5lcnJvcnNgXG4gICAgICogQHBhcmFtIGVycm9yIFRoZSBtZXNzYWdlXG4gICAgICogQHBhcmFtIGtleXMgT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBzb3VyY2Ugb2YgdGhlIGVycm9yIGF0IGEgY2hpbGRcbiAgICAgKiBvZiB0aGUgY3VycmVudCBleHByZXNzaW9uIGF0IGB0aGlzLmtleWAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBlcnJvcihlcnJvcjogc3RyaW5nLCAuLi5rZXlzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGAke3RoaXMua2V5fSR7a2V5cy5tYXAoayA9PiBgWyR7a31dYCkuam9pbignJyl9YDtcbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgUGFyc2luZ0Vycm9yKGtleSwgZXJyb3IpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG51bGwgaWYgYHRgIGlzIGEgc3VidHlwZSBvZiBgZXhwZWN0ZWRgOyBvdGhlcndpc2UgcmV0dXJucyBhblxuICAgICAqIGVycm9yIG1lc3NhZ2UgYW5kIGFsc28gcHVzaGVzIGl0IHRvIGB0aGlzLmVycm9yc2AuXG4gICAgICovXG4gICAgY2hlY2tTdWJ0eXBlKGV4cGVjdGVkOiBUeXBlLCB0OiBUeXBlKTogP3N0cmluZyB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gY2hlY2tTdWJ0eXBlKGV4cGVjdGVkLCB0KTtcbiAgICAgICAgaWYgKGVycm9yKSB0aGlzLmVycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFyc2luZ0NvbnRleHQ7XG5cbmZ1bmN0aW9uIGlzQ29uc3RhbnQoZXhwcmVzc2lvbjogRXhwcmVzc2lvbikge1xuICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVmFyKSB7XG4gICAgICAgIHJldHVybiBpc0NvbnN0YW50KGV4cHJlc3Npb24uYm91bmRFeHByZXNzaW9uKTtcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24gJiYgZXhwcmVzc2lvbi5uYW1lID09PSAnZXJyb3InKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb2xsYXRvckV4cHJlc3Npb24pIHtcbiAgICAgICAgLy8gQWx0aG91Z2ggdGhlIHJlc3VsdHMgb2YgYSBDb2xsYXRvciBleHByZXNzaW9uIHdpdGggZml4ZWQgYXJndW1lbnRzXG4gICAgICAgIC8vIGdlbmVyYWxseSBzaG91bGRuJ3QgY2hhbmdlIGJldHdlZW4gZXhlY3V0aW9ucywgd2UgY2FuJ3Qgc2VyaWFsaXplIHRoZW1cbiAgICAgICAgLy8gYXMgY29uc3RhbnQgZXhwcmVzc2lvbnMgYmVjYXVzZSByZXN1bHRzIGNoYW5nZSBiYXNlZCBvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFdpdGhpbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaXNUeXBlQW5ub3RhdGlvbiA9IGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb2VyY2lvbiB8fFxuICAgICAgICBleHByZXNzaW9uIGluc3RhbmNlb2YgQXNzZXJ0aW9uO1xuXG4gICAgbGV0IGNoaWxkcmVuQ29uc3RhbnQgPSB0cnVlO1xuICAgIGV4cHJlc3Npb24uZWFjaENoaWxkKGNoaWxkID0+IHtcbiAgICAgICAgLy8gV2UgY2FuIF9hbG1vc3RfIGFzc3VtZSB0aGF0IGlmIGBleHByZXNzaW9uc2AgY2hpbGRyZW4gYXJlIGNvbnN0YW50LFxuICAgICAgICAvLyB0aGV5IHdvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGV2YWx1YXRlZCB0byBMaXRlcmFsIHZhbHVlcyB3aGVuIHRoZXlcbiAgICAgICAgLy8gd2VyZSBwYXJzZWQuICBUeXBlIGFubm90YXRpb25zIGFyZSB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIHRoZXkgbWlnaHRcbiAgICAgICAgLy8gaGF2ZSBiZWVuIGluZmVycmVkIGFuZCBhZGRlZCBhZnRlciBhIGNoaWxkIHdhcyBwYXJzZWQuXG5cbiAgICAgICAgLy8gU28gd2UgcmVjdXJzZSBpbnRvIGlzQ29uc3RhbnQoKSBmb3IgdGhlIGNoaWxkcmVuIG9mIHR5cGUgYW5ub3RhdGlvbnMsXG4gICAgICAgIC8vIGJ1dCBvdGhlcndpc2Ugc2ltcGx5IGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgTGl0ZXJhbHMuXG4gICAgICAgIGlmIChpc1R5cGVBbm5vdGF0aW9uKSB7XG4gICAgICAgICAgICBjaGlsZHJlbkNvbnN0YW50ID0gY2hpbGRyZW5Db25zdGFudCAmJiBpc0NvbnN0YW50KGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkcmVuQ29uc3RhbnQgPSBjaGlsZHJlbkNvbnN0YW50ICYmIGNoaWxkIGluc3RhbmNlb2YgTGl0ZXJhbDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghY2hpbGRyZW5Db25zdGFudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRmVhdHVyZUNvbnN0YW50KGV4cHJlc3Npb24pICYmXG4gICAgICAgIGlzR2xvYmFsUHJvcGVydHlDb25zdGFudChleHByZXNzaW9uLCBbJ3pvb20nLCAnaGVhdG1hcC1kZW5zaXR5JywgJ2xpbmUtcHJvZ3Jlc3MnLCAnc2t5LXJhZGlhbC1wcm9ncmVzcycsICdhY2N1bXVsYXRlZCcsICdpcy1zdXBwb3J0ZWQtc2NyaXB0JywgJ3BpdGNoJywgJ2Rpc3RhbmNlLWZyb20tY2VudGVyJ10pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuL3J1bnRpbWVfZXJyb3IuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi9leHByZXNzaW9uLmpzJztcblxuZXhwb3J0IHR5cGUgU3RvcHMgPSBBcnJheTxbbnVtYmVyLCBFeHByZXNzaW9uXT47XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc3RvcCA8PSBpbnB1dCwgb3IgMCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8oc3RvcHM6IEFycmF5PG51bWJlcj4sIGlucHV0OiBudW1iZXIpIHtcbiAgICBjb25zdCBsYXN0SW5kZXggPSBzdG9wcy5sZW5ndGggLSAxO1xuICAgIGxldCBsb3dlckluZGV4ID0gMDtcbiAgICBsZXQgdXBwZXJJbmRleCA9IGxhc3RJbmRleDtcbiAgICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgICBsZXQgY3VycmVudFZhbHVlLCBuZXh0VmFsdWU7XG5cbiAgICB3aGlsZSAobG93ZXJJbmRleCA8PSB1cHBlckluZGV4KSB7XG4gICAgICAgIGN1cnJlbnRJbmRleCA9IE1hdGguZmxvb3IoKGxvd2VySW5kZXggKyB1cHBlckluZGV4KSAvIDIpO1xuICAgICAgICBjdXJyZW50VmFsdWUgPSBzdG9wc1tjdXJyZW50SW5kZXhdO1xuICAgICAgICBuZXh0VmFsdWUgPSBzdG9wc1tjdXJyZW50SW5kZXggKyAxXTtcblxuICAgICAgICBpZiAoY3VycmVudFZhbHVlIDw9IGlucHV0KSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSBsYXN0SW5kZXggfHwgaW5wdXQgPCBuZXh0VmFsdWUpIHsgLy8gU2VhcmNoIGNvbXBsZXRlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG93ZXJJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFZhbHVlID4gaW5wdXQpIHtcbiAgICAgICAgICAgIHVwcGVySW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcignSW5wdXQgaXMgbm90IGEgbnVtYmVyLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge051bWJlclR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHtmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvfSBmcm9tICcuLi9zdG9wcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtTdG9wc30gZnJvbSAnLi4vc3RvcHMuanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jbGFzcyBTdGVwIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcblxuICAgIGlucHV0OiBFeHByZXNzaW9uO1xuICAgIGxhYmVsczogQXJyYXk8bnVtYmVyPjtcbiAgICBvdXRwdXRzOiBBcnJheTxFeHByZXNzaW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGlucHV0OiBFeHByZXNzaW9uLCBzdG9wczogU3RvcHMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgIHRoaXMubGFiZWxzID0gW107XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtsYWJlbCwgZXhwcmVzc2lvbl0gb2Ygc3RvcHMpIHtcbiAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2goZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggLSAxIDwgNCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke2FyZ3MubGVuZ3RoIC0gMX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFyZ3MubGVuZ3RoIC0gMSkgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBzdG9wczogU3RvcHMgPSBbXTtcblxuICAgICAgICBsZXQgb3V0cHV0VHlwZTogVHlwZSA9IChudWxsOiBhbnkpO1xuICAgICAgICBpZiAoY29udGV4dC5leHBlY3RlZFR5cGUgJiYgY29udGV4dC5leHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGkgPT09IDEgPyAtSW5maW5pdHkgOiBhcmdzW2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdzW2kgKyAxXTtcblxuICAgICAgICAgICAgY29uc3QgbGFiZWxLZXkgPSBpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVLZXkgPSBpICsgMTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsYWJlbCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcInN0ZXBcIiBleHByZXNzaW9ucyBtdXN0IGJlIGRlZmluZWQgdXNpbmcgbGl0ZXJhbCBudW1lcmljIHZhbHVlcyAobm90IGNvbXB1dGVkIGV4cHJlc3Npb25zKSBmb3IgdGhlIGlucHV0IHZhbHVlcy4nLCBsYWJlbEtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG9wcy5sZW5ndGggJiYgc3RvcHNbc3RvcHMubGVuZ3RoIC0gMV1bMF0gPj0gbGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcInN0ZXBcIiBleHByZXNzaW9ucyBtdXN0IGJlIGFycmFuZ2VkIHdpdGggaW5wdXQgdmFsdWVzIGluIHN0cmljdGx5IGFzY2VuZGluZyBvcmRlci4nLCBsYWJlbEtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IGNvbnRleHQucGFyc2UodmFsdWUsIHZhbHVlS2V5LCBvdXRwdXRUeXBlKTtcbiAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHBhcnNlZC50eXBlO1xuICAgICAgICAgICAgc3RvcHMucHVzaChbbGFiZWwsIHBhcnNlZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTdGVwKG91dHB1dFR5cGUsIGlucHV0LCBzdG9wcyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmxhYmVscztcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHRoaXMub3V0cHV0cztcblxuICAgICAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbMF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKCh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk6IG51bWJlcik7XG4gICAgICAgIGlmICh2YWx1ZSA8PSBsYWJlbHNbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9wQ291bnQgPSBsYWJlbHMubGVuZ3RoO1xuICAgICAgICBpZiAodmFsdWUgPj0gbGFiZWxzW3N0b3BDb3VudCAtIDFdKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1tzdG9wQ291bnQgLSAxXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKGxhYmVscywgdmFsdWUpO1xuICAgICAgICByZXR1cm4gb3V0cHV0c1tpbmRleF0uZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgICAgICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgdGhpcy5vdXRwdXRzKSB7XG4gICAgICAgICAgICBmbihleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm91dHB1dHMuZXZlcnkob3V0ID0+IG91dC5vdXRwdXREZWZpbmVkKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcInN0ZXBcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaCh0aGlzLmxhYmVsc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5vdXRwdXRzW2ldLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0ZXA7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ29sb3IgZnJvbSAnLi9jb2xvci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXIoYTogbnVtYmVyLCBiOiBudW1iZXIsIHQ6IG51bWJlcikge1xuICAgIHJldHVybiAoYSAqICgxIC0gdCkpICsgKGIgKiB0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yKGZyb206IENvbG9yLCB0bzogQ29sb3IsIHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgQ29sb3IoXG4gICAgICAgIG51bWJlcihmcm9tLnIsIHRvLnIsIHQpLFxuICAgICAgICBudW1iZXIoZnJvbS5nLCB0by5nLCB0KSxcbiAgICAgICAgbnVtYmVyKGZyb20uYiwgdG8uYiwgdCksXG4gICAgICAgIG51bWJlcihmcm9tLmEsIHRvLmEsIHQpXG4gICAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5KGZyb206IEFycmF5PG51bWJlcj4sIHRvOiBBcnJheTxudW1iZXI+LCB0OiBudW1iZXIpOiBBcnJheTxudW1iZXI+IHtcbiAgICByZXR1cm4gZnJvbS5tYXAoKGQsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIG51bWJlcihkLCB0b1tpXSwgdCk7XG4gICAgfSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ29sb3IgZnJvbSAnLi9jb2xvci5qcyc7XG5cbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlTnVtYmVyfSBmcm9tICcuL2ludGVycG9sYXRlLmpzJztcblxudHlwZSBMQUJDb2xvciA9IHtcbiAgICBsOiBudW1iZXIsXG4gICAgYTogbnVtYmVyLFxuICAgIGI6IG51bWJlcixcbiAgICBhbHBoYTogbnVtYmVyXG59O1xuXG50eXBlIEhDTENvbG9yID0ge1xuICAgIGg6IG51bWJlcixcbiAgICBjOiBudW1iZXIsXG4gICAgbDogbnVtYmVyLFxuICAgIGFscGhhOiBudW1iZXJcbn07XG5cbi8vIENvbnN0YW50c1xuY29uc3QgWG4gPSAwLjk1MDQ3MCwgLy8gRDY1IHN0YW5kYXJkIHJlZmVyZW50XG4gICAgWW4gPSAxLFxuICAgIFpuID0gMS4wODg4MzAsXG4gICAgdDAgPSA0IC8gMjksXG4gICAgdDEgPSA2IC8gMjksXG4gICAgdDIgPSAzICogdDEgKiB0MSxcbiAgICB0MyA9IHQxICogdDEgKiB0MSxcbiAgICBkZWcycmFkID0gTWF0aC5QSSAvIDE4MCxcbiAgICByYWQyZGVnID0gMTgwIC8gTWF0aC5QSTtcblxuLy8gVXRpbGl0aWVzXG5mdW5jdGlvbiB4eXoybGFiKHQ6IG51bWJlcikge1xuICAgIHJldHVybiB0ID4gdDMgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDtcbn1cblxuZnVuY3Rpb24gbGFiMnh5eih0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdCA+IHQxID8gdCAqIHQgKiB0IDogdDIgKiAodCAtIHQwKTtcbn1cblxuZnVuY3Rpb24geHl6MnJnYih4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gMjU1ICogKHggPD0gMC4wMDMxMzA4ID8gMTIuOTIgKiB4IDogMS4wNTUgKiBNYXRoLnBvdyh4LCAxIC8gMi40KSAtIDAuMDU1KTtcbn1cblxuZnVuY3Rpb24gcmdiMnh5eih4OiBudW1iZXIpIHtcbiAgICB4IC89IDI1NTtcbiAgICByZXR1cm4geCA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbn1cblxuLy8gTEFCXG5mdW5jdGlvbiByZ2JUb0xhYihyZ2JDb2xvcjogQ29sb3IpOiBMQUJDb2xvciB7XG4gICAgY29uc3QgYiA9IHJnYjJ4eXoocmdiQ29sb3IuciksXG4gICAgICAgIGEgPSByZ2IyeHl6KHJnYkNvbG9yLmcpLFxuICAgICAgICBsID0gcmdiMnh5eihyZ2JDb2xvci5iKSxcbiAgICAgICAgeCA9IHh5ejJsYWIoKDAuNDEyNDU2NCAqIGIgKyAwLjM1NzU3NjEgKiBhICsgMC4xODA0Mzc1ICogbCkgLyBYbiksXG4gICAgICAgIHkgPSB4eXoybGFiKCgwLjIxMjY3MjkgKiBiICsgMC43MTUxNTIyICogYSArIDAuMDcyMTc1MCAqIGwpIC8gWW4pLFxuICAgICAgICB6ID0geHl6MmxhYigoMC4wMTkzMzM5ICogYiArIDAuMTE5MTkyMCAqIGEgKyAwLjk1MDMwNDEgKiBsKSAvIFpuKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGw6IDExNiAqIHkgLSAxNixcbiAgICAgICAgYTogNTAwICogKHggLSB5KSxcbiAgICAgICAgYjogMjAwICogKHkgLSB6KSxcbiAgICAgICAgYWxwaGE6IHJnYkNvbG9yLmFcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBsYWJUb1JnYihsYWJDb2xvcjogTEFCQ29sb3IpOiBDb2xvciB7XG4gICAgbGV0IHkgPSAobGFiQ29sb3IubCArIDE2KSAvIDExNixcbiAgICAgICAgeCA9IGlzTmFOKGxhYkNvbG9yLmEpID8geSA6IHkgKyBsYWJDb2xvci5hIC8gNTAwLFxuICAgICAgICB6ID0gaXNOYU4obGFiQ29sb3IuYikgPyB5IDogeSAtIGxhYkNvbG9yLmIgLyAyMDA7XG4gICAgeSA9IFluICogbGFiMnh5eih5KTtcbiAgICB4ID0gWG4gKiBsYWIyeHl6KHgpO1xuICAgIHogPSBabiAqIGxhYjJ4eXooeik7XG4gICAgcmV0dXJuIG5ldyBDb2xvcihcbiAgICAgICAgeHl6MnJnYigzLjI0MDQ1NDIgKiB4IC0gMS41MzcxMzg1ICogeSAtIDAuNDk4NTMxNCAqIHopLCAvLyBENjUgLT4gc1JHQlxuICAgICAgICB4eXoycmdiKC0wLjk2OTI2NjAgKiB4ICsgMS44NzYwMTA4ICogeSArIDAuMDQxNTU2MCAqIHopLFxuICAgICAgICB4eXoycmdiKDAuMDU1NjQzNCAqIHggLSAwLjIwNDAyNTkgKiB5ICsgMS4wNTcyMjUyICogeiksXG4gICAgICAgIGxhYkNvbG9yLmFscGhhXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVMYWIoZnJvbTogTEFCQ29sb3IsIHRvOiBMQUJDb2xvciwgdDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbDogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5sLCB0by5sLCB0KSxcbiAgICAgICAgYTogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5hLCB0by5hLCB0KSxcbiAgICAgICAgYjogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5iLCB0by5iLCB0KSxcbiAgICAgICAgYWxwaGE6IGludGVycG9sYXRlTnVtYmVyKGZyb20uYWxwaGEsIHRvLmFscGhhLCB0KVxuICAgIH07XG59XG5cbi8vIEhDTFxuZnVuY3Rpb24gcmdiVG9IY2wocmdiQ29sb3I6IENvbG9yKTogSENMQ29sb3Ige1xuICAgIGNvbnN0IHtsLCBhLCBifSA9IHJnYlRvTGFiKHJnYkNvbG9yKTtcbiAgICBjb25zdCBoID0gTWF0aC5hdGFuMihiLCBhKSAqIHJhZDJkZWc7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaDogaCA8IDAgPyBoICsgMzYwIDogaCxcbiAgICAgICAgYzogTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpLFxuICAgICAgICBsLFxuICAgICAgICBhbHBoYTogcmdiQ29sb3IuYVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGhjbFRvUmdiKGhjbENvbG9yOiBIQ0xDb2xvcik6IENvbG9yIHtcbiAgICBjb25zdCBoID0gaGNsQ29sb3IuaCAqIGRlZzJyYWQsXG4gICAgICAgIGMgPSBoY2xDb2xvci5jLFxuICAgICAgICBsID0gaGNsQ29sb3IubDtcbiAgICByZXR1cm4gbGFiVG9SZ2Ioe1xuICAgICAgICBsLFxuICAgICAgICBhOiBNYXRoLmNvcyhoKSAqIGMsXG4gICAgICAgIGI6IE1hdGguc2luKGgpICogYyxcbiAgICAgICAgYWxwaGE6IGhjbENvbG9yLmFscGhhXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlSHVlKGE6IG51bWJlciwgYjogbnVtYmVyLCB0OiBudW1iZXIpIHtcbiAgICBjb25zdCBkID0gYiAtIGE7XG4gICAgcmV0dXJuIGEgKyB0ICogKGQgPiAxODAgfHwgZCA8IC0xODAgPyBkIC0gMzYwICogTWF0aC5yb3VuZChkIC8gMzYwKSA6IGQpO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUhjbChmcm9tOiBIQ0xDb2xvciwgdG86IEhDTENvbG9yLCB0OiBudW1iZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBoOiBpbnRlcnBvbGF0ZUh1ZShmcm9tLmgsIHRvLmgsIHQpLFxuICAgICAgICBjOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmMsIHRvLmMsIHQpLFxuICAgICAgICBsOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmwsIHRvLmwsIHQpLFxuICAgICAgICBhbHBoYTogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5hbHBoYSwgdG8uYWxwaGEsIHQpXG4gICAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGxhYiA9IHtcbiAgICBmb3J3YXJkOiByZ2JUb0xhYixcbiAgICByZXZlcnNlOiBsYWJUb1JnYixcbiAgICBpbnRlcnBvbGF0ZTogaW50ZXJwb2xhdGVMYWJcbn07XG5cbmV4cG9ydCBjb25zdCBoY2wgPSB7XG4gICAgZm9yd2FyZDogcmdiVG9IY2wsXG4gICAgcmV2ZXJzZTogaGNsVG9SZ2IsXG4gICAgaW50ZXJwb2xhdGU6IGludGVycG9sYXRlSGNsXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFVuaXRCZXppZXIgZnJvbSAnQG1hcGJveC91bml0YmV6aWVyJztcblxuaW1wb3J0ICogYXMgaW50ZXJwb2xhdGUgZnJvbSAnLi4vLi4vdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQge3RvU3RyaW5nLCBOdW1iZXJUeXBlLCBDb2xvclR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7ZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUb30gZnJvbSAnLi4vc3RvcHMuanMnO1xuaW1wb3J0IHtoY2wsIGxhYn0gZnJvbSAnLi4vLi4vdXRpbC9jb2xvcl9zcGFjZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7U3RvcHN9IGZyb20gJy4uL3N0b3BzLmpzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgSW50ZXJwb2xhdGlvblR5cGUgPVxuICAgIHsgbmFtZTogJ2xpbmVhcicgfSB8XG4gICAgeyBuYW1lOiAnZXhwb25lbnRpYWwnLCBiYXNlOiBudW1iZXIgfSB8XG4gICAgeyBuYW1lOiAnY3ViaWMtYmV6aWVyJywgY29udHJvbFBvaW50czogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfTtcblxuY2xhc3MgSW50ZXJwb2xhdGUgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuXG4gICAgb3BlcmF0b3I6ICdpbnRlcnBvbGF0ZScgfCAnaW50ZXJwb2xhdGUtaGNsJyB8ICdpbnRlcnBvbGF0ZS1sYWInO1xuICAgIGludGVycG9sYXRpb246IEludGVycG9sYXRpb25UeXBlO1xuICAgIGlucHV0OiBFeHByZXNzaW9uO1xuICAgIGxhYmVsczogQXJyYXk8bnVtYmVyPjtcbiAgICBvdXRwdXRzOiBBcnJheTxFeHByZXNzaW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIG9wZXJhdG9yOiAnaW50ZXJwb2xhdGUnIHwgJ2ludGVycG9sYXRlLWhjbCcgfCAnaW50ZXJwb2xhdGUtbGFiJywgaW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGlvblR5cGUsIGlucHV0OiBFeHByZXNzaW9uLCBzdG9wczogU3RvcHMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICB0aGlzLmludGVycG9sYXRpb24gPSBpbnRlcnBvbGF0aW9uO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG5cbiAgICAgICAgdGhpcy5sYWJlbHMgPSBbXTtcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2xhYmVsLCBleHByZXNzaW9uXSBvZiBzdG9wcykge1xuICAgICAgICAgICAgdGhpcy5sYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICB0aGlzLm91dHB1dHMucHVzaChleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcnBvbGF0aW9uRmFjdG9yKGludGVycG9sYXRpb246IEludGVycG9sYXRpb25UeXBlLCBpbnB1dDogbnVtYmVyLCBsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyKSB7XG4gICAgICAgIGxldCB0ID0gMDtcbiAgICAgICAgaWYgKGludGVycG9sYXRpb24ubmFtZSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICAgICAgdCA9IGV4cG9uZW50aWFsSW50ZXJwb2xhdGlvbihpbnB1dCwgaW50ZXJwb2xhdGlvbi5iYXNlLCBsb3dlciwgdXBwZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRpb24ubmFtZSA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgICAgIHQgPSBleHBvbmVudGlhbEludGVycG9sYXRpb24oaW5wdXQsIDEsIGxvd2VyLCB1cHBlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGlvbi5uYW1lID09PSAnY3ViaWMtYmV6aWVyJykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGludGVycG9sYXRpb24uY29udHJvbFBvaW50cztcbiAgICAgICAgICAgIGNvbnN0IHViID0gbmV3IFVuaXRCZXppZXIoY1swXSwgY1sxXSwgY1syXSwgY1szXSk7XG4gICAgICAgICAgICB0ID0gdWIuc29sdmUoZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCAxLCBsb3dlciwgdXBwZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBsZXQgW29wZXJhdG9yLCBpbnRlcnBvbGF0aW9uLCBpbnB1dCwgLi4ucmVzdF0gPSBhcmdzO1xuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpbnRlcnBvbGF0aW9uKSB8fCBpbnRlcnBvbGF0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIGludGVycG9sYXRpb24gdHlwZSBleHByZXNzaW9uLmAsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGludGVycG9sYXRpb25bMF0gPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0ge25hbWU6ICdsaW5lYXInfTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uWzBdID09PSAnZXhwb25lbnRpYWwnKSB7XG4gICAgICAgICAgICBjb25zdCBiYXNlID0gaW50ZXJwb2xhdGlvblsxXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYmFzZSAhPT0gJ251bWJlcicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cG9uZW50aWFsIGludGVycG9sYXRpb24gcmVxdWlyZXMgYSBudW1lcmljIGJhc2UuYCwgMSwgMSk7XG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdleHBvbmVudGlhbCcsXG4gICAgICAgICAgICAgICAgYmFzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0aW9uWzBdID09PSAnY3ViaWMtYmV6aWVyJykge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbFBvaW50cyA9IGludGVycG9sYXRpb24uc2xpY2UoMSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY29udHJvbFBvaW50cy5sZW5ndGggIT09IDQgfHxcbiAgICAgICAgICAgICAgICBjb250cm9sUG9pbnRzLnNvbWUodCA9PiB0eXBlb2YgdCAhPT0gJ251bWJlcicgfHwgdCA8IDAgfHwgdCA+IDEpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignQ3ViaWMgYmV6aWVyIGludGVycG9sYXRpb24gcmVxdWlyZXMgZm91ciBudW1lcmljIGFyZ3VtZW50cyB3aXRoIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEuJywgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2N1YmljLWJlemllcicsXG4gICAgICAgICAgICAgICAgY29udHJvbFBvaW50czogKGNvbnRyb2xQb2ludHM6IGFueSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVW5rbm93biBpbnRlcnBvbGF0aW9uIHR5cGUgJHtTdHJpbmcoaW50ZXJwb2xhdGlvblswXSl9YCwgMSwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggLSAxIDwgNCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke2FyZ3MubGVuZ3RoIC0gMX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGFyZ3MubGVuZ3RoIC0gMSkgJSAyICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGlucHV0LCAyLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgc3RvcHM6IFN0b3BzID0gW107XG5cbiAgICAgICAgbGV0IG91dHB1dFR5cGU6IFR5cGUgPSAobnVsbDogYW55KTtcbiAgICAgICAgaWYgKG9wZXJhdG9yID09PSAnaW50ZXJwb2xhdGUtaGNsJyB8fCBvcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlLWxhYicpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBDb2xvclR5cGU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5leHBlY3RlZFR5cGUgJiYgY29udGV4dC5leHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IHJlc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3RbaSArIDFdO1xuXG4gICAgICAgICAgICBjb25zdCBsYWJlbEtleSA9IGkgKyAzO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVLZXkgPSBpICsgNDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBsYWJlbCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBkZWZpbmVkIHVzaW5nIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZXMgKG5vdCBjb21wdXRlZCBleHByZXNzaW9ucykgZm9yIHRoZSBpbnB1dCB2YWx1ZXMuJywgbGFiZWxLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RvcHMubGVuZ3RoICYmIHN0b3BzW3N0b3BzLmxlbmd0aCAtIDFdWzBdID49IGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb25zIG11c3QgYmUgYXJyYW5nZWQgd2l0aCBpbnB1dCB2YWx1ZXMgaW4gc3RyaWN0bHkgYXNjZW5kaW5nIG9yZGVyLicsIGxhYmVsS2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY29udGV4dC5wYXJzZSh2YWx1ZSwgdmFsdWVLZXksIG91dHB1dFR5cGUpO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IG91dHB1dFR5cGUgfHwgcGFyc2VkLnR5cGU7XG4gICAgICAgICAgICBzdG9wcy5wdXNoKFtsYWJlbCwgcGFyc2VkXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3V0cHV0VHlwZS5raW5kICE9PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgb3V0cHV0VHlwZS5raW5kICE9PSAnY29sb3InICYmXG4gICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgIG91dHB1dFR5cGUua2luZCA9PT0gJ2FycmF5JyAmJlxuICAgICAgICAgICAgICAgIG91dHB1dFR5cGUuaXRlbVR5cGUua2luZCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygb3V0cHV0VHlwZS5OID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBUeXBlICR7dG9TdHJpbmcob3V0cHV0VHlwZSl9IGlzIG5vdCBpbnRlcnBvbGF0YWJsZS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJwb2xhdGUob3V0cHV0VHlwZSwgKG9wZXJhdG9yOiBhbnkpLCBpbnRlcnBvbGF0aW9uLCBpbnB1dCwgc3RvcHMpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5sYWJlbHM7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLm91dHB1dHM7XG5cbiAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICgodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBudW1iZXIpO1xuICAgICAgICBpZiAodmFsdWUgPD0gbGFiZWxzWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcENvdW50ID0gbGFiZWxzLmxlbmd0aDtcbiAgICAgICAgaWYgKHZhbHVlID49IGxhYmVsc1tzdG9wQ291bnQgLSAxXSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbc3RvcENvdW50IC0gMV0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhsYWJlbHMsIHZhbHVlKTtcbiAgICAgICAgY29uc3QgbG93ZXIgPSBsYWJlbHNbaW5kZXhdO1xuICAgICAgICBjb25zdCB1cHBlciA9IGxhYmVsc1tpbmRleCArIDFdO1xuICAgICAgICBjb25zdCB0ID0gSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvcih0aGlzLmludGVycG9sYXRpb24sIHZhbHVlLCBsb3dlciwgdXBwZXIpO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dExvd2VyID0gb3V0cHV0c1tpbmRleF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0VXBwZXIgPSBvdXRwdXRzW2luZGV4ICsgMV0uZXZhbHVhdGUoY3R4KTtcblxuICAgICAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIChpbnRlcnBvbGF0ZVt0aGlzLnR5cGUua2luZC50b0xvd2VyQ2FzZSgpXTogYW55KShvdXRwdXRMb3dlciwgb3V0cHV0VXBwZXIsIHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uYW1lc3BhY2VcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wZXJhdG9yID09PSAnaW50ZXJwb2xhdGUtaGNsJykge1xuICAgICAgICAgICAgcmV0dXJuIGhjbC5yZXZlcnNlKGhjbC5pbnRlcnBvbGF0ZShoY2wuZm9yd2FyZChvdXRwdXRMb3dlciksIGhjbC5mb3J3YXJkKG91dHB1dFVwcGVyKSwgdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxhYi5yZXZlcnNlKGxhYi5pbnRlcnBvbGF0ZShsYWIuZm9yd2FyZChvdXRwdXRMb3dlciksIGxhYi5mb3J3YXJkKG91dHB1dFVwcGVyKSwgdCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICAgICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgZm4oZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRzLmV2ZXJ5KG91dCA9PiBvdXQub3V0cHV0RGVmaW5lZCgpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgbGV0IGludGVycG9sYXRpb247XG4gICAgICAgIGlmICh0aGlzLmludGVycG9sYXRpb24ubmFtZSA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSBbXCJsaW5lYXJcIl07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnRlcnBvbGF0aW9uLm5hbWUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgICAgIGlmICAodGhpcy5pbnRlcnBvbGF0aW9uLmJhc2UgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0gW1wibGluZWFyXCJdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0gW1wiZXhwb25lbnRpYWxcIiwgdGhpcy5pbnRlcnBvbGF0aW9uLmJhc2VdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IFtcImN1YmljLWJlemllclwiIF0uY29uY2F0KHRoaXMuaW50ZXJwb2xhdGlvbi5jb250cm9sUG9pbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbdGhpcy5vcGVyYXRvciwgaW50ZXJwb2xhdGlvbiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxhYmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzW2ldLFxuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0c1tpXS5zZXJpYWxpemUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJhdGlvIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiBleHBvbmVudGlhbCBmdW5jdGlvblxuICogc3RvcHMuXG4gKiBIb3cgaXQgd29ya3M6IFR3byBjb25zZWN1dGl2ZSBzdG9wIHZhbHVlcyBkZWZpbmUgYSAoc2NhbGVkIGFuZCBzaGlmdGVkKSBleHBvbmVudGlhbCBmdW5jdGlvbiBgZih4KSA9IGEgKiBiYXNlXnggKyBiYCwgd2hlcmUgYGJhc2VgIGlzIHRoZSB1c2VyLXNwZWNpZmllZCBiYXNlLFxuICogYW5kIGBhYCBhbmQgYGJgIGFyZSBjb25zdGFudHMgYWZmb3JkaW5nIHN1ZmZpY2llbnQgZGVncmVlcyBvZiBmcmVlZG9tIHRvIGZpdFxuICogdGhlIGZ1bmN0aW9uIHRvIHRoZSBnaXZlbiBzdG9wcy5cbiAqXG4gKiBIZXJlJ3MgYSBiaXQgb2YgYWxnZWJyYSB0aGF0IGxldHMgdXMgY29tcHV0ZSBgZih4KWAgZGlyZWN0bHkgZnJvbSB0aGUgc3RvcFxuICogdmFsdWVzIHdpdGhvdXQgZXhwbGljaXRseSBzb2x2aW5nIGZvciBgYWAgYW5kIGBiYDpcbiAqXG4gKiBGaXJzdCBzdG9wIHZhbHVlOiBgZih4MCkgPSB5MCA9IGEgKiBiYXNlXngwICsgYmBcbiAqIFNlY29uZCBzdG9wIHZhbHVlOiBgZih4MSkgPSB5MSA9IGEgKiBiYXNlXngxICsgYmBcbiAqID0+IGB5MSAtIHkwID0gYShiYXNlXngxIC0gYmFzZV54MClgXG4gKiA9PiBgYSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApYFxuICpcbiAqIERlc2lyZWQgdmFsdWU6IGBmKHgpID0geSA9IGEgKiBiYXNlXnggKyBiYFxuICogPT4gYGYoeCkgPSB5MCArIGEgKiAoYmFzZV54IC0gYmFzZV54MClgXG4gKlxuICogRnJvbSB0aGUgYWJvdmUsIHdlIGNhbiByZXBsYWNlIHRoZSBgYWAgaW4gYGEgKiAoYmFzZV54IC0gYmFzZV54MClgIGFuZCBkbyBhXG4gKiBsaXR0bGUgYWxnZWJyYTpcbiAqIGBgYFxuICogYSAqIChiYXNlXnggLSBiYXNlXngwKSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApICogKGJhc2VeeCAtIGJhc2VeeDApXG4gKiAgICAgICAgICAgICAgICAgICAgID0gKHkxIC0geTApICogKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgLSBiYXNlXngwKVxuICogYGBgXG4gKlxuICogSWYgd2UgbGV0IGAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSBiYXNlXngwKWAsIHRoZW4gd2UgaGF2ZVxuICogYGYoeCkgPSB5MCArICh5MSAtIHkwKSAqIHJhdGlvYC4gIEluIG90aGVyIHdvcmRzLCBgcmF0aW9gIG1heSBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZhY3RvciBiZXR3ZWVuIHRoZSB0d28gc3RvcHMnIG91dHB1dCB2YWx1ZXMuXG4gKlxuICogKE5vdGU6IGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm0gZm9yIGByYXRpb2AsXG4gKiBgKGJhc2VeKHgteDApIC0gMSkgLyAoYmFzZV4oeDEteDApIC0gMSkgYCwgaXMgZXF1aXZhbGVudCwgYnV0IHJlcXVpcmVzIGZld2VyXG4gKiBleHBlbnNpdmUgYE1hdGgucG93KClgIG9wZXJhdGlvbnMuKVxuICpcbiAqIEBwcml2YXRlXG4qL1xuZnVuY3Rpb24gZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCBiYXNlLCBsb3dlclZhbHVlLCB1cHBlclZhbHVlKSB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IHVwcGVyVmFsdWUgLSBsb3dlclZhbHVlO1xuICAgIGNvbnN0IHByb2dyZXNzID0gaW5wdXQgLSBsb3dlclZhbHVlO1xuXG4gICAgaWYgKGRpZmZlcmVuY2UgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIGlmIChiYXNlID09PSAxKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmVzcyAvIGRpZmZlcmVuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChNYXRoLnBvdyhiYXNlLCBwcm9ncmVzcykgLSAxKSAvIChNYXRoLnBvdyhiYXNlLCBkaWZmZXJlbmNlKSAtIDEpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW50ZXJwb2xhdGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7Y2hlY2tTdWJ0eXBlLCBWYWx1ZVR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jbGFzcyBDb2FsZXNjZSBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBhcmdzOiBBcnJheTxFeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKFwiRXhwZWN0ZWN0ZWQgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LlwiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3V0cHV0VHlwZTogVHlwZSA9IChudWxsOiBhbnkpO1xuICAgICAgICBjb25zdCBleHBlY3RlZFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgaWYgKGV4cGVjdGVkVHlwZSAmJiBleHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncy5zbGljZSgxKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY29udGV4dC5wYXJzZShhcmcsIDEgKyBwYXJzZWRBcmdzLmxlbmd0aCwgb3V0cHV0VHlwZSwgdW5kZWZpbmVkLCB7dHlwZUFubm90YXRpb246ICdvbWl0J30pO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IG91dHB1dFR5cGUgfHwgcGFyc2VkLnR5cGU7XG4gICAgICAgICAgICBwYXJzZWRBcmdzLnB1c2gocGFyc2VkKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQob3V0cHV0VHlwZSk7XG5cbiAgICAgICAgLy8gQWJvdmUsIHdlIHBhcnNlIGFyZ3VtZW50cyB3aXRob3V0IGluZmVycmVkIHR5cGUgYW5ub3RhdGlvbiBzbyB0aGF0XG4gICAgICAgIC8vIHRoZXkgZG9uJ3QgcHJvZHVjZSBhIHJ1bnRpbWUgZXJyb3IgZm9yIGBudWxsYCBpbnB1dCwgd2hpY2ggd291bGRcbiAgICAgICAgLy8gcHJlZW1wdCB0aGUgZGVzaXJlZCBudWxsLWNvYWxlc2NpbmcgYmVoYXZpb3IuXG4gICAgICAgIC8vIFRodXMsIGlmIGFueSBvZiBvdXIgYXJndW1lbnRzIHdvdWxkIGhhdmUgbmVlZGVkIGFuIGFubm90YXRpb24sIHdlXG4gICAgICAgIC8vIG5lZWQgdG8gd3JhcCB0aGUgZW5jbG9zaW5nIGNvYWxlc2NlIGV4cHJlc3Npb24gd2l0aCBpdCBpbnN0ZWFkLlxuICAgICAgICBjb25zdCBuZWVkc0Fubm90YXRpb24gPSBleHBlY3RlZFR5cGUgJiZcbiAgICAgICAgICAgIHBhcnNlZEFyZ3Muc29tZShhcmcgPT4gY2hlY2tTdWJ0eXBlKGV4cGVjdGVkVHlwZSwgYXJnLnR5cGUpKTtcblxuICAgICAgICByZXR1cm4gbmVlZHNBbm5vdGF0aW9uID9cbiAgICAgICAgICAgIG5ldyBDb2FsZXNjZShWYWx1ZVR5cGUsIHBhcnNlZEFyZ3MpIDpcbiAgICAgICAgICAgIG5ldyBDb2FsZXNjZSgob3V0cHV0VHlwZTogYW55KSwgcGFyc2VkQXJncyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgbGV0IGFyZ0NvdW50ID0gMDtcbiAgICAgICAgbGV0IGZpcnN0SW1hZ2U7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIHRoaXMuYXJncykge1xuICAgICAgICAgICAgYXJnQ291bnQrKztcbiAgICAgICAgICAgIHJlc3VsdCA9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBmaXJzdCByZXF1ZXN0ZWQgaW1hZ2UgaW4gYSBjb2FsZXNjZSBzdGF0ZW1lbnRcbiAgICAgICAgICAgIC8vIGlmIGNvYWxlc2NlIGNhbid0IGZpbmQgYSB2YWxpZCBpbWFnZSwgd2UgcmV0dXJuIHRoZSBmaXJzdCBpbWFnZSBzbyBzdHlsZWltYWdlbWlzc2luZyBjYW4gZmlyZVxuICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQgaW5zdGFuY2VvZiBSZXNvbHZlZEltYWdlICYmICFyZXN1bHQuYXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gc2V0IHRvIGZpcnN0IGltYWdlXG4gICAgICAgICAgICAgICAgaWYgKCFmaXJzdEltYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0SW1hZ2UgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgLy8gaWYgd2UgcmVhY2ggdGhlIGVuZCwgcmV0dXJuIHRoZSBmaXJzdCBpbWFnZVxuICAgICAgICAgICAgICAgIGlmIChhcmdDb3VudCA9PT0gdGhpcy5hcmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RJbWFnZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLmFyZ3MuZm9yRWFjaChmbik7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJncy5ldmVyeShhcmcgPT4gYXJnLm91dHB1dERlZmluZWQoKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wiY29hbGVzY2VcIl07XG4gICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29hbGVzY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0ICBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuXG5jbGFzcyBMZXQgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT47XG4gICAgcmVzdWx0OiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoYmluZGluZ3M6IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPiwgcmVzdWx0OiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHJlc3VsdC50eXBlO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gW10uY29uY2F0KGJpbmRpbmdzKTtcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQuZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiB0aGlzLmJpbmRpbmdzKSB7XG4gICAgICAgICAgICBmbihiaW5kaW5nWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBmbih0aGlzLnJlc3VsdCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIGNvbnN0IGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGFyZ3NbaV07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgc3RyaW5nLCBidXQgZm91bmQgJHt0eXBlb2YgbmFtZX0gaW5zdGVhZC5gLCBpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9bXmEtekEtWjAtOV9dLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYFZhcmlhYmxlIG5hbWVzIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yICdfJy5gLCBpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaSArIDFdLCBpICsgMSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgYmluZGluZ3MucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBhcmdzLmxlbmd0aCAtIDEsIGNvbnRleHQuZXhwZWN0ZWRUeXBlLCBiaW5kaW5ncyk7XG4gICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gbmV3IExldChiaW5kaW5ncywgcmVzdWx0KTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQub3V0cHV0RGVmaW5lZCgpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImxldFwiXTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgZXhwcl0gb2YgdGhpcy5iaW5kaW5ncykge1xuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKG5hbWUsIGV4cHIuc2VyaWFsaXplKCkpO1xuICAgICAgICB9XG4gICAgICAgIHNlcmlhbGl6ZWQucHVzaCh0aGlzLnJlc3VsdC5zZXJpYWxpemUoKSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGV0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHthcnJheSwgVmFsdWVUeXBlLCBOdW1iZXJUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvci5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGUsIEFycmF5VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1ZhbHVlfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuXG5jbGFzcyBBdCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5kZXg6IEV4cHJlc3Npb247XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBpbmRleDogRXhwcmVzc2lvbiwgaW5wdXQ6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAzKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIDIgYXJndW1lbnRzLCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGNvbnRleHQucGFyc2UoYXJnc1syXSwgMiwgYXJyYXkoY29udGV4dC5leHBlY3RlZFR5cGUgfHwgVmFsdWVUeXBlKSk7XG5cbiAgICAgICAgaWYgKCFpbmRleCB8fCAhaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHQ6IEFycmF5VHlwZSA9IChpbnB1dC50eXBlOiBhbnkpO1xuICAgICAgICByZXR1cm4gbmV3IEF0KHQuaXRlbVR5cGUsIGluZGV4LCBpbnB1dCk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpbmRleCA9ICgodGhpcy5pbmRleC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBudW1iZXIpO1xuICAgICAgICBjb25zdCBhcnJheSA9ICgodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBBcnJheTxWYWx1ZT4pO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEFycmF5IGluZGV4IG91dCBvZiBib3VuZHM6ICR7aW5kZXh9IDwgMC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA+PSBhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEFycmF5IGluZGV4IG91dCBvZiBib3VuZHM6ICR7aW5kZXh9ID4gJHthcnJheS5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCAhPT0gTWF0aC5mbG9vcihpbmRleCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEFycmF5IGluZGV4IG11c3QgYmUgYW4gaW50ZWdlciwgYnV0IGZvdW5kICR7aW5kZXh9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJyYXlbaW5kZXhdO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbmRleCk7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiBbXCJhdFwiLCB0aGlzLmluZGV4LnNlcmlhbGl6ZSgpLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEF0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtCb29sZWFuVHlwZSwgU3RyaW5nVHlwZSwgVmFsdWVUeXBlLCBOdWxsVHlwZSwgdG9TdHJpbmcsIE51bWJlclR5cGUsIGlzVmFsaWRUeXBlLCBpc1ZhbGlkTmF0aXZlVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmNsYXNzIEluIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBuZWVkbGU6IEV4cHJlc3Npb247XG4gICAgaGF5c3RhY2s6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihuZWVkbGU6IEV4cHJlc3Npb24sIGhheXN0YWNrOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IEJvb2xlYW5UeXBlO1xuICAgICAgICB0aGlzLm5lZWRsZSA9IG5lZWRsZTtcbiAgICAgICAgdGhpcy5oYXlzdGFjayA9IGhheXN0YWNrO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIDIgYXJndW1lbnRzLCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZWVkbGUgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG5cbiAgICAgICAgY29uc3QgaGF5c3RhY2sgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMl0sIDIsIFZhbHVlVHlwZSk7XG5cbiAgICAgICAgaWYgKCFuZWVkbGUgfHwgIWhheXN0YWNrKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIWlzVmFsaWRUeXBlKG5lZWRsZS50eXBlLCBbQm9vbGVhblR5cGUsIFN0cmluZ1R5cGUsIE51bWJlclR5cGUsIE51bGxUeXBlLCBWYWx1ZVR5cGVdKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kICR7dG9TdHJpbmcobmVlZGxlLnR5cGUpfSBpbnN0ZWFkYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEluKG5lZWRsZSwgaGF5c3RhY2spO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgbmVlZGxlID0gKHRoaXMubmVlZGxlLmV2YWx1YXRlKGN0eCk6IGFueSk7XG4gICAgICAgIGNvbnN0IGhheXN0YWNrID0gKHRoaXMuaGF5c3RhY2suZXZhbHVhdGUoY3R4KTogYW55KTtcblxuICAgICAgICBpZiAoIWhheXN0YWNrKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkTmF0aXZlVHlwZShuZWVkbGUsIFsnYm9vbGVhbicsICdzdHJpbmcnLCAnbnVtYmVyJywgJ251bGwnXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKG5lZWRsZSkpfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkTmF0aXZlVHlwZShoYXlzdGFjaywgWydzdHJpbmcnLCAnYXJyYXknXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHNlY29uZCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGFycmF5IG9yIHN0cmluZywgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKGhheXN0YWNrKSl9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGF5c3RhY2suaW5kZXhPZihuZWVkbGUpID49IDA7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLm5lZWRsZSk7XG4gICAgICAgIGZuKHRoaXMuaGF5c3RhY2spO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIFtcImluXCIsIHRoaXMubmVlZGxlLnNlcmlhbGl6ZSgpLCB0aGlzLmhheXN0YWNrLnNlcmlhbGl6ZSgpXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEluO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtCb29sZWFuVHlwZSwgU3RyaW5nVHlwZSwgVmFsdWVUeXBlLCBOdWxsVHlwZSwgdG9TdHJpbmcsIE51bWJlclR5cGUsIGlzVmFsaWRUeXBlLCBpc1ZhbGlkTmF0aXZlVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmNsYXNzIEluZGV4T2YgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIG5lZWRsZTogRXhwcmVzc2lvbjtcbiAgICBoYXlzdGFjazogRXhwcmVzc2lvbjtcbiAgICBmcm9tSW5kZXg6ID9FeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IobmVlZGxlOiBFeHByZXNzaW9uLCBoYXlzdGFjazogRXhwcmVzc2lvbiwgZnJvbUluZGV4PzogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBOdW1iZXJUeXBlO1xuICAgICAgICB0aGlzLm5lZWRsZSA9IG5lZWRsZTtcbiAgICAgICAgdGhpcy5oYXlzdGFjayA9IGhheXN0YWNrO1xuICAgICAgICB0aGlzLmZyb21JbmRleCA9IGZyb21JbmRleDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMiB8fCAgYXJncy5sZW5ndGggPj0gNSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIDMgb3IgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5lZWRsZSA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgVmFsdWVUeXBlKTtcblxuICAgICAgICBjb25zdCBoYXlzdGFjayA9IGNvbnRleHQucGFyc2UoYXJnc1syXSwgMiwgVmFsdWVUeXBlKTtcblxuICAgICAgICBpZiAoIW5lZWRsZSB8fCAhaGF5c3RhY2spIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIWlzVmFsaWRUeXBlKG5lZWRsZS50eXBlLCBbQm9vbGVhblR5cGUsIFN0cmluZ1R5cGUsIE51bWJlclR5cGUsIE51bGxUeXBlLCBWYWx1ZVR5cGVdKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kICR7dG9TdHJpbmcobmVlZGxlLnR5cGUpfSBpbnN0ZWFkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21JbmRleCA9IGNvbnRleHQucGFyc2UoYXJnc1szXSwgMywgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWZyb21JbmRleCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4T2YobmVlZGxlLCBoYXlzdGFjaywgZnJvbUluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhPZihuZWVkbGUsIGhheXN0YWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgbmVlZGxlID0gKHRoaXMubmVlZGxlLmV2YWx1YXRlKGN0eCk6IGFueSk7XG4gICAgICAgIGNvbnN0IGhheXN0YWNrID0gKHRoaXMuaGF5c3RhY2suZXZhbHVhdGUoY3R4KTogYW55KTtcblxuICAgICAgICBpZiAoIWlzVmFsaWROYXRpdmVUeXBlKG5lZWRsZSwgWydib29sZWFuJywgJ3N0cmluZycsICdudW1iZXInLCAnbnVsbCddKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YobmVlZGxlKSl9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWROYXRpdmVUeXBlKGhheXN0YWNrLCBbJ3N0cmluZycsICdhcnJheSddKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YoaGF5c3RhY2spKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZyb21JbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gKHRoaXMuZnJvbUluZGV4LmV2YWx1YXRlKGN0eCk6IG51bWJlcik7XG4gICAgICAgICAgICByZXR1cm4gaGF5c3RhY2suaW5kZXhPZihuZWVkbGUsIGZyb21JbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGF5c3RhY2suaW5kZXhPZihuZWVkbGUpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5uZWVkbGUpO1xuICAgICAgICBmbih0aGlzLmhheXN0YWNrKTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbUluZGV4KSB7XG4gICAgICAgICAgICBmbih0aGlzLmZyb21JbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBpZiAodGhpcy5mcm9tSW5kZXggIT0gbnVsbCAmJiB0aGlzLmZyb21JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tSW5kZXggPSB0aGlzLmZyb21JbmRleC5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgIHJldHVybiBbXCJpbmRleC1vZlwiLCB0aGlzLm5lZWRsZS5zZXJpYWxpemUoKSwgdGhpcy5oYXlzdGFjay5zZXJpYWxpemUoKSwgZnJvbUluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1wiaW5kZXgtb2ZcIiwgdGhpcy5uZWVkbGUuc2VyaWFsaXplKCksIHRoaXMuaGF5c3RhY2suc2VyaWFsaXplKCldO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW5kZXhPZjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQge1ZhbHVlVHlwZSwgdHlwZSBUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuXG4vLyBNYXAgaW5wdXQgbGFiZWwgdmFsdWVzIHRvIG91dHB1dCBleHByZXNzaW9uIGluZGV4XG50eXBlIENhc2VzID0ge1tudW1iZXIgfCBzdHJpbmddOiBudW1iZXJ9O1xuXG5jbGFzcyBNYXRjaCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXRUeXBlOiBUeXBlO1xuXG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG4gICAgY2FzZXM6IENhc2VzO1xuICAgIG91dHB1dHM6IEFycmF5PEV4cHJlc3Npb24+O1xuICAgIG90aGVyd2lzZTogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKGlucHV0VHlwZTogVHlwZSwgb3V0cHV0VHlwZTogVHlwZSwgaW5wdXQ6IEV4cHJlc3Npb24sIGNhc2VzOiBDYXNlcywgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj4sIG90aGVyd2lzZTogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLmlucHV0VHlwZSA9IGlucHV0VHlwZTtcbiAgICAgICAgdGhpcy50eXBlID0gb3V0cHV0VHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmNhc2VzID0gY2FzZXM7XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IG91dHB1dHM7XG4gICAgICAgIHRoaXMub3RoZXJ3aXNlID0gb3RoZXJ3aXNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDUpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5ICR7YXJncy5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICUgMiAhPT0gMSlcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuYCk7XG5cbiAgICAgICAgbGV0IGlucHV0VHlwZTtcbiAgICAgICAgbGV0IG91dHB1dFR5cGU7XG4gICAgICAgIGlmIChjb250ZXh0LmV4cGVjdGVkVHlwZSAmJiBjb250ZXh0LmV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FzZXMgPSB7fTtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IGFyZ3MubGVuZ3RoIC0gMTsgaSArPSAyKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxzID0gYXJnc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXJnc1tpICsgMV07XG5cbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShsYWJlbHMpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWxzID0gW2xhYmVsc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxhYmVsQ29udGV4dCA9IGNvbnRleHQuY29uY2F0KGkpO1xuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKCdFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYnJhbmNoIGxhYmVsLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIGxhYmVscykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdudW1iZXInICYmIHR5cGVvZiBsYWJlbCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcihgQnJhbmNoIGxhYmVscyBtdXN0IGJlIG51bWJlcnMgb3Igc3RyaW5ncy5gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcicgJiYgTWF0aC5hYnMobGFiZWwpID4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcihgQnJhbmNoIGxhYmVscyBtdXN0IGJlIGludGVnZXJzIG5vIGxhcmdlciB0aGFuICR7TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9LmApO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGFiZWwgPT09ICdudW1iZXInICYmIE1hdGguZmxvb3IobGFiZWwpICE9PSBsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKGBOdW1lcmljIGJyYW5jaCBsYWJlbHMgbXVzdCBiZSBpbnRlZ2VyIHZhbHVlcy5gKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlucHV0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFR5cGUgPSB0eXBlT2YobGFiZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFiZWxDb250ZXh0LmNoZWNrU3VidHlwZShpbnB1dFR5cGUsIHR5cGVPZihsYWJlbCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FzZXNbU3RyaW5nKGxhYmVsKV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoJ0JyYW5jaCBsYWJlbHMgbXVzdCBiZSB1bmlxdWUuJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FzZXNbU3RyaW5nKGxhYmVsKV0gPSBvdXRwdXRzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5wYXJzZSh2YWx1ZSwgaSwgb3V0cHV0VHlwZSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCByZXN1bHQudHlwZTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaChyZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG4gICAgICAgIGlmICghaW5wdXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG90aGVyd2lzZSA9IGNvbnRleHQucGFyc2UoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBhcmdzLmxlbmd0aCAtIDEsIG91dHB1dFR5cGUpO1xuICAgICAgICBpZiAoIW90aGVyd2lzZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgYXNzZXJ0KGlucHV0VHlwZSAmJiBvdXRwdXRUeXBlKTtcblxuICAgICAgICBpZiAoaW5wdXQudHlwZS5raW5kICE9PSAndmFsdWUnICYmIGNvbnRleHQuY29uY2F0KDEpLmNoZWNrU3VidHlwZSgoaW5wdXRUeXBlOiBhbnkpLCBpbnB1dC50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE1hdGNoKChpbnB1dFR5cGU6IGFueSksIChvdXRwdXRUeXBlOiBhbnkpLCBpbnB1dCwgY2FzZXMsIG91dHB1dHMsIG90aGVyd2lzZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9ICh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9ICh0eXBlT2YoaW5wdXQpID09PSB0aGlzLmlucHV0VHlwZSAmJiB0aGlzLm91dHB1dHNbdGhpcy5jYXNlc1tpbnB1dF1dKSB8fCB0aGlzLm90aGVyd2lzZTtcbiAgICAgICAgcmV0dXJuIG91dHB1dC5ldmFsdWF0ZShjdHgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgICAgIHRoaXMub3V0cHV0cy5mb3JFYWNoKGZuKTtcbiAgICAgICAgZm4odGhpcy5vdGhlcndpc2UpO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm91dHB1dHMuZXZlcnkob3V0ID0+IG91dC5vdXRwdXREZWZpbmVkKCkpICYmIHRoaXMub3RoZXJ3aXNlLm91dHB1dERlZmluZWQoKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcIm1hdGNoXCIsIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuXG4gICAgICAgIC8vIFNvcnQgc28gc2VyaWFsaXphdGlvbiBoYXMgYW4gYXJiaXRyYXJ5IGRlZmluZWQgb3JkZXIsIGV2ZW4gdGhvdWdoXG4gICAgICAgIC8vIGJyYW5jaCBvcmRlciBkb2Vzbid0IGFmZmVjdCBldmFsdWF0aW9uXG4gICAgICAgIGNvbnN0IHNvcnRlZExhYmVscyA9IE9iamVjdC5rZXlzKHRoaXMuY2FzZXMpLnNvcnQoKTtcblxuICAgICAgICAvLyBHcm91cCBicmFuY2hlcyBieSB1bmlxdWUgbWF0Y2ggZXhwcmVzc2lvbiB0byBzdXBwb3J0IGNvbmRlbnNlZFxuICAgICAgICAvLyBzZXJpYWxpemF0aW9ucyBvZiB0aGUgZm9ybSBbY2FzZTEsIGNhc2UyLCAuLi5dIC0+IG1hdGNoRXhwcmVzc2lvblxuICAgICAgICBjb25zdCBncm91cGVkQnlPdXRwdXQ6IEFycmF5PFtudW1iZXIsIEFycmF5PG51bWJlciB8IHN0cmluZz5dPiA9IFtdO1xuICAgICAgICBjb25zdCBvdXRwdXRMb29rdXA6IHtbaW5kZXg6IG51bWJlcl06IG51bWJlcn0gPSB7fTsgLy8gbG9va3VwIGluZGV4IGludG8gZ3JvdXBlZEJ5T3V0cHV0IGZvciBhIGdpdmVuIG91dHB1dCBleHByZXNzaW9uXG4gICAgICAgIGZvciAoY29uc3QgbGFiZWwgb2Ygc29ydGVkTGFiZWxzKSB7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRJbmRleCA9IG91dHB1dExvb2t1cFt0aGlzLmNhc2VzW2xhYmVsXV07XG4gICAgICAgICAgICBpZiAob3V0cHV0SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgc2VlaW5nIHRoaXMgb3V0cHV0LCBhZGQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZ3JvdXBlZCBsaXN0XG4gICAgICAgICAgICAgICAgb3V0cHV0TG9va3VwW3RoaXMuY2FzZXNbbGFiZWxdXSA9IGdyb3VwZWRCeU91dHB1dC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZ3JvdXBlZEJ5T3V0cHV0LnB1c2goW3RoaXMuY2FzZXNbbGFiZWxdLCBbbGFiZWxdXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIHNlZW4gdGhpcyBleHByZXNzaW9uIGJlZm9yZSwgYWRkIHRoZSBsYWJlbCB0byB0aGF0IG91dHB1dCdzIGdyb3VwXG4gICAgICAgICAgICAgICAgZ3JvdXBlZEJ5T3V0cHV0W291dHB1dEluZGV4XVsxXS5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvZXJjZUxhYmVsID0gKGxhYmVsKSA9PiB0aGlzLmlucHV0VHlwZS5raW5kID09PSAnbnVtYmVyJyA/IE51bWJlcihsYWJlbCkgOiBsYWJlbDtcblxuICAgICAgICBmb3IgKGNvbnN0IFtvdXRwdXRJbmRleCwgbGFiZWxzXSBvZiBncm91cGVkQnlPdXRwdXQpIHtcbiAgICAgICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBhIHNpbmdsZSBsYWJlbCBtYXRjaGVzIHRoaXMgb3V0cHV0IGV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goY29lcmNlTGFiZWwobGFiZWxzWzBdKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFycmF5IG9mIGxpdGVyYWwgbGFiZWxzIHBvaW50aW5nIHRvIHRoaXMgb3V0cHV0IGV4cHJlc3Npb25cbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnB1c2gobGFiZWxzLm1hcChjb2VyY2VMYWJlbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMub3V0cHV0c1tvdXRwdXRJbmRleF0uc2VyaWFsaXplKCkpO1xuICAgICAgICB9XG4gICAgICAgIHNlcmlhbGl6ZWQucHVzaCh0aGlzLm90aGVyd2lzZS5zZXJpYWxpemUoKSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWF0Y2g7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7Qm9vbGVhblR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG50eXBlIEJyYW5jaGVzID0gQXJyYXk8W0V4cHJlc3Npb24sIEV4cHJlc3Npb25dPjtcblxuY2xhc3MgQ2FzZSBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG5cbiAgICBicmFuY2hlczogQnJhbmNoZXM7XG4gICAgb3RoZXJ3aXNlOiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgYnJhbmNoZXM6IEJyYW5jaGVzLCBvdGhlcndpc2U6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5icmFuY2hlcyA9IGJyYW5jaGVzO1xuICAgICAgICB0aGlzLm90aGVyd2lzZSA9IG90aGVyd2lzZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCA0KVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDMgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke2FyZ3MubGVuZ3RoIC0gMX0uYCk7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAlIDIgIT09IDApXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gb2RkIG51bWJlciBvZiBhcmd1bWVudHMuYCk7XG5cbiAgICAgICAgbGV0IG91dHB1dFR5cGU6ID9UeXBlO1xuICAgICAgICBpZiAoY29udGV4dC5leHBlY3RlZFR5cGUgJiYgY29udGV4dC5leHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnJhbmNoZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgdGVzdCA9IGNvbnRleHQucGFyc2UoYXJnc1tpXSwgaSwgQm9vbGVhblR5cGUpO1xuICAgICAgICAgICAgaWYgKCF0ZXN0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5wYXJzZShhcmdzW2kgKyAxXSwgaSArIDEsIG91dHB1dFR5cGUpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBicmFuY2hlcy5wdXNoKFt0ZXN0LCByZXN1bHRdKTtcblxuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IG91dHB1dFR5cGUgfHwgcmVzdWx0LnR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlcndpc2UgPSBjb250ZXh0LnBhcnNlKGFyZ3NbYXJncy5sZW5ndGggLSAxXSwgYXJncy5sZW5ndGggLSAxLCBvdXRwdXRUeXBlKTtcbiAgICAgICAgaWYgKCFvdGhlcndpc2UpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGFzc2VydChvdXRwdXRUeXBlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDYXNlKChvdXRwdXRUeXBlOiBhbnkpLCBicmFuY2hlcywgb3RoZXJ3aXNlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgW3Rlc3QsIGV4cHJlc3Npb25dIG9mIHRoaXMuYnJhbmNoZXMpIHtcbiAgICAgICAgICAgIGlmICh0ZXN0LmV2YWx1YXRlKGN0eCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm90aGVyd2lzZS5ldmFsdWF0ZShjdHgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdGVzdCwgZXhwcmVzc2lvbl0gb2YgdGhpcy5icmFuY2hlcykge1xuICAgICAgICAgICAgZm4odGVzdCk7XG4gICAgICAgICAgICBmbihleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBmbih0aGlzLm90aGVyd2lzZSk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoZXMuZXZlcnkoKFtfLCBvdXRdKSA9PiBvdXQub3V0cHV0RGVmaW5lZCgpKSAmJiB0aGlzLm90aGVyd2lzZS5vdXRwdXREZWZpbmVkKCk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wiY2FzZVwiXTtcbiAgICAgICAgdGhpcy5lYWNoQ2hpbGQoY2hpbGQgPT4geyBzZXJpYWxpemVkLnB1c2goY2hpbGQuc2VyaWFsaXplKCkpOyB9KTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYXNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtWYWx1ZVR5cGUsIE51bWJlclR5cGUsIFN0cmluZ1R5cGUsIGFycmF5LCB0b1N0cmluZywgaXNWYWxpZFR5cGUsIGlzVmFsaWROYXRpdmVUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuY2xhc3MgU2xpY2UgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGlucHV0OiBFeHByZXNzaW9uO1xuICAgIGJlZ2luSW5kZXg6IEV4cHJlc3Npb247XG4gICAgZW5kSW5kZXg6ID9FeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgaW5wdXQ6IEV4cHJlc3Npb24sIGJlZ2luSW5kZXg6IEV4cHJlc3Npb24sIGVuZEluZGV4PzogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuYmVnaW5JbmRleCA9IGJlZ2luSW5kZXg7XG4gICAgICAgIHRoaXMuZW5kSW5kZXggPSBlbmRJbmRleDtcblxuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAyIHx8ICBhcmdzLmxlbmd0aCA+PSA1KSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgMyBvciA0IGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG4gICAgICAgIGNvbnN0IGJlZ2luSW5kZXggPSBjb250ZXh0LnBhcnNlKGFyZ3NbMl0sIDIsIE51bWJlclR5cGUpO1xuXG4gICAgICAgIGlmICghaW5wdXQgfHwgIWJlZ2luSW5kZXgpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmICghaXNWYWxpZFR5cGUoaW5wdXQudHlwZSwgW2FycmF5KFZhbHVlVHlwZSksIFN0cmluZ1R5cGUsIFZhbHVlVHlwZV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKGlucHV0LnR5cGUpfSBpbnN0ZWFkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gY29udGV4dC5wYXJzZShhcmdzWzNdLCAzLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgICAgIGlmICghZW5kSW5kZXgpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTbGljZShpbnB1dC50eXBlLCBpbnB1dCwgYmVnaW5JbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTbGljZShpbnB1dC50eXBlLCBpbnB1dCwgYmVnaW5JbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gKHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KTogYW55KTtcbiAgICAgICAgY29uc3QgYmVnaW5JbmRleCA9ICh0aGlzLmJlZ2luSW5kZXguZXZhbHVhdGUoY3R4KTogbnVtYmVyKTtcblxuICAgICAgICBpZiAoIWlzVmFsaWROYXRpdmVUeXBlKGlucHV0LCBbJ3N0cmluZycsICdhcnJheSddKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZihpbnB1dCkpfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gKHRoaXMuZW5kSW5kZXguZXZhbHVhdGUoY3R4KTogbnVtYmVyKTtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5zbGljZShiZWdpbkluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5wdXQuc2xpY2UoYmVnaW5JbmRleCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICAgICAgZm4odGhpcy5iZWdpbkluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGZuKHRoaXMuZW5kSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5kSW5kZXggIT0gbnVsbCAmJiB0aGlzLmVuZEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gdGhpcy5lbmRJbmRleC5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgIHJldHVybiBbXCJzbGljZVwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpLCB0aGlzLmJlZ2luSW5kZXguc2VyaWFsaXplKCksIGVuZEluZGV4XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1wic2xpY2VcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKSwgdGhpcy5iZWdpbkluZGV4LnNlcmlhbGl6ZSgpXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNsaWNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt0b1N0cmluZywgVmFsdWVUeXBlLCBCb29sZWFuVHlwZSwgQ29sbGF0b3JUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgQXNzZXJ0aW9uIGZyb20gJy4vYXNzZXJ0aW9uLmpzJztcbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG50eXBlIENvbXBhcmlzb25PcGVyYXRvciA9ICc9PScgfCAnIT0nIHwgJzwnIHwgJz4nIHwgJzw9JyB8ICc+PScgO1xuXG5mdW5jdGlvbiBpc0NvbXBhcmFibGVUeXBlKG9wOiBDb21wYXJpc29uT3BlcmF0b3IsIHR5cGU6IFR5cGUpIHtcbiAgICBpZiAob3AgPT09ICc9PScgfHwgb3AgPT09ICchPScpIHtcbiAgICAgICAgLy8gZXF1YWxpdHkgb3BlcmF0b3JcbiAgICAgICAgcmV0dXJuIHR5cGUua2luZCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdudWxsJyB8fFxuICAgICAgICAgICAgdHlwZS5raW5kID09PSAndmFsdWUnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG9yZGVyaW5nIG9wZXJhdG9yXG4gICAgICAgIHJldHVybiB0eXBlLmtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICd2YWx1ZSc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlcShjdHgsIGEsIGIpIHsgcmV0dXJuIGEgPT09IGI7IH1cbmZ1bmN0aW9uIG5lcShjdHgsIGEsIGIpIHsgcmV0dXJuIGEgIT09IGI7IH1cbmZ1bmN0aW9uIGx0KGN0eCwgYSwgYikgeyByZXR1cm4gYSA8IGI7IH1cbmZ1bmN0aW9uIGd0KGN0eCwgYSwgYikgeyByZXR1cm4gYSA+IGI7IH1cbmZ1bmN0aW9uIGx0ZXEoY3R4LCBhLCBiKSB7IHJldHVybiBhIDw9IGI7IH1cbmZ1bmN0aW9uIGd0ZXEoY3R4LCBhLCBiKSB7IHJldHVybiBhID49IGI7IH1cblxuZnVuY3Rpb24gZXFDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gYy5jb21wYXJlKGEsIGIpID09PSAwOyB9XG5mdW5jdGlvbiBuZXFDb2xsYXRlKGN0eCwgYSwgYiwgYykgeyByZXR1cm4gIWVxQ29sbGF0ZShjdHgsIGEsIGIsIGMpOyB9XG5mdW5jdGlvbiBsdENvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiBjLmNvbXBhcmUoYSwgYikgPCAwOyB9XG5mdW5jdGlvbiBndENvbGxhdGUoY3R4LCBhLCBiLCBjKSB7IHJldHVybiBjLmNvbXBhcmUoYSwgYikgPiAwOyB9XG5mdW5jdGlvbiBsdGVxQ29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA8PSAwOyB9XG5mdW5jdGlvbiBndGVxQ29sbGF0ZShjdHgsIGEsIGIsIGMpIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA+PSAwOyB9XG5cbi8qKlxuICogU3BlY2lhbCBmb3JtIGZvciBjb21wYXJpc29uIG9wZXJhdG9ycywgaW1wbGVtZW50aW5nIHRoZSBzaWduYXR1cmVzOlxuICogLSAoVCwgVCwgP0NvbGxhdG9yKSA9PiBib29sZWFuXG4gKiAtIChULCB2YWx1ZSwgP0NvbGxhdG9yKSA9PiBib29sZWFuXG4gKiAtICh2YWx1ZSwgVCwgP0NvbGxhdG9yKSA9PiBib29sZWFuXG4gKlxuICogRm9yIGluZXF1YWxpdGllcywgVCBtdXN0IGJlIGVpdGhlciB2YWx1ZSwgc3RyaW5nLCBvciBudW1iZXIuIEZvciA9PS8hPSwgaXRcbiAqIGNhbiBhbHNvIGJlIGJvb2xlYW4gb3IgbnVsbC5cbiAqXG4gKiBFcXVhbGl0eSBzZW1hbnRpY3MgYXJlIGVxdWl2YWxlbnQgdG8gSmF2YXNjcmlwdCdzIHN0cmljdCBlcXVhbGl0eSAoPT09LyE9PSlcbiAqIC0tIGkuZS4sIHdoZW4gdGhlIGFyZ3VtZW50cycgdHlwZXMgZG9uJ3QgbWF0Y2gsID09IGV2YWx1YXRlcyB0byBmYWxzZSwgIT0gdG9cbiAqIHRydWUuXG4gKlxuICogV2hlbiB0eXBlcyBkb24ndCBtYXRjaCBpbiBhbiBvcmRlcmluZyBjb21wYXJpc29uLCBhIHJ1bnRpbWUgZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG1ha2VDb21wYXJpc29uKG9wOiBDb21wYXJpc29uT3BlcmF0b3IsIGNvbXBhcmVCYXNpYywgY29tcGFyZVdpdGhDb2xsYXRvcikge1xuICAgIGNvbnN0IGlzT3JkZXJDb21wYXJpc29uID0gb3AgIT09ICc9PScgJiYgb3AgIT09ICchPSc7XG5cbiAgICByZXR1cm4gY2xhc3MgQ29tcGFyaXNvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgICAgICB0eXBlOiBUeXBlO1xuICAgICAgICBsaHM6IEV4cHJlc3Npb247XG4gICAgICAgIHJoczogRXhwcmVzc2lvbjtcbiAgICAgICAgY29sbGF0b3I6ID9FeHByZXNzaW9uO1xuICAgICAgICBoYXNVbnR5cGVkQXJndW1lbnQ6IGJvb2xlYW47XG5cbiAgICAgICAgY29uc3RydWN0b3IobGhzOiBFeHByZXNzaW9uLCByaHM6IEV4cHJlc3Npb24sIGNvbGxhdG9yOiA/RXhwcmVzc2lvbikge1xuICAgICAgICAgICAgdGhpcy50eXBlID0gQm9vbGVhblR5cGU7XG4gICAgICAgICAgICB0aGlzLmxocyA9IGxocztcbiAgICAgICAgICAgIHRoaXMucmhzID0gcmhzO1xuICAgICAgICAgICAgdGhpcy5jb2xsYXRvciA9IGNvbGxhdG9yO1xuICAgICAgICAgICAgdGhpcy5oYXNVbnR5cGVkQXJndW1lbnQgPSBsaHMudHlwZS5raW5kID09PSAndmFsdWUnIHx8IHJocy50eXBlLmtpbmQgPT09ICd2YWx1ZSc7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMyAmJiBhcmdzLmxlbmd0aCAhPT0gNClcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy5gKTtcblxuICAgICAgICAgICAgY29uc3Qgb3A6IENvbXBhcmlzb25PcGVyYXRvciA9IChhcmdzWzBdOiBhbnkpO1xuXG4gICAgICAgICAgICBsZXQgbGhzID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgaWYgKCFsaHMpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgaWYgKCFpc0NvbXBhcmFibGVUeXBlKG9wLCBsaHMudHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jb25jYXQoMSkuZXJyb3IoYFwiJHtvcH1cIiBjb21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdHlwZSAnJHt0b1N0cmluZyhsaHMudHlwZSl9Jy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByaHMgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMl0sIDIsIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIXJocykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoIWlzQ29tcGFyYWJsZVR5cGUob3AsIHJocy50eXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbmNhdCgyKS5lcnJvcihgXCIke29wfVwiIGNvbXBhcmlzb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciB0eXBlICcke3RvU3RyaW5nKHJocy50eXBlKX0nLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbGhzLnR5cGUua2luZCAhPT0gcmhzLnR5cGUua2luZCAmJlxuICAgICAgICAgICAgICAgIGxocy50eXBlLmtpbmQgIT09ICd2YWx1ZScgJiZcbiAgICAgICAgICAgICAgICByaHMudHlwZS5raW5kICE9PSAndmFsdWUnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQ2Fubm90IGNvbXBhcmUgdHlwZXMgJyR7dG9TdHJpbmcobGhzLnR5cGUpfScgYW5kICcke3RvU3RyaW5nKHJocy50eXBlKX0nLmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNPcmRlckNvbXBhcmlzb24pIHtcbiAgICAgICAgICAgICAgICAvLyB0eXBpbmcgcnVsZXMgc3BlY2lmaWMgdG8gbGVzcy9ncmVhdGVyIHRoYW4gb3BlcmF0b3JzXG4gICAgICAgICAgICAgICAgaWYgKGxocy50eXBlLmtpbmQgPT09ICd2YWx1ZScgJiYgcmhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgICAgICAvLyAodmFsdWUsIFQpXG4gICAgICAgICAgICAgICAgICAgIGxocyA9IG5ldyBBc3NlcnRpb24ocmhzLnR5cGUsIFtsaHNdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxocy50eXBlLmtpbmQgIT09ICd2YWx1ZScgJiYgcmhzLnR5cGUua2luZCA9PT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgICAgICAvLyAoVCwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHJocyA9IG5ldyBBc3NlcnRpb24obGhzLnR5cGUsIFtyaHNdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb2xsYXRvciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGxocy50eXBlLmtpbmQgIT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIHJocy50eXBlLmtpbmQgIT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIGxocy50eXBlLmtpbmQgIT09ICd2YWx1ZScgJiZcbiAgICAgICAgICAgICAgICAgICAgcmhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQ2Fubm90IHVzZSBjb2xsYXRvciB0byBjb21wYXJlIG5vbi1zdHJpbmcgdHlwZXMuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbGxhdG9yID0gY29udGV4dC5wYXJzZShhcmdzWzNdLCAzLCBDb2xsYXRvclR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICghY29sbGF0b3IpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhcmlzb24obGhzLCByaHMsIGNvbGxhdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGxocyA9IHRoaXMubGhzLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICBjb25zdCByaHMgPSB0aGlzLnJocy5ldmFsdWF0ZShjdHgpO1xuXG4gICAgICAgICAgICBpZiAoaXNPcmRlckNvbXBhcmlzb24gJiYgdGhpcy5oYXNVbnR5cGVkQXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsdCA9IHR5cGVPZihsaHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ0ID0gdHlwZU9mKHJocyk7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0eXBlIGlzIHN0cmluZyBvciBudW1iZXIsIGFuZCBlcXVhbFxuICAgICAgICAgICAgICAgIGlmIChsdC5raW5kICE9PSBydC5raW5kIHx8ICEobHQua2luZCA9PT0gJ3N0cmluZycgfHwgbHQua2luZCA9PT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIGFyZ3VtZW50cyBmb3IgXCIke29wfVwiIHRvIGJlIChzdHJpbmcsIHN0cmluZykgb3IgKG51bWJlciwgbnVtYmVyKSwgYnV0IGZvdW5kICgke2x0LmtpbmR9LCAke3J0LmtpbmR9KSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuY29sbGF0b3IgJiYgIWlzT3JkZXJDb21wYXJpc29uICYmIHRoaXMuaGFzVW50eXBlZEFyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbHQgPSB0eXBlT2YobGhzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBydCA9IHR5cGVPZihyaHMpO1xuICAgICAgICAgICAgICAgIGlmIChsdC5raW5kICE9PSAnc3RyaW5nJyB8fCBydC5raW5kICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZUJhc2ljKGN0eCwgbGhzLCByaHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGF0b3IgP1xuICAgICAgICAgICAgICAgIGNvbXBhcmVXaXRoQ29sbGF0b3IoY3R4LCBsaHMsIHJocywgdGhpcy5jb2xsYXRvci5ldmFsdWF0ZShjdHgpKSA6XG4gICAgICAgICAgICAgICAgY29tcGFyZUJhc2ljKGN0eCwgbGhzLCByaHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICAgICAgZm4odGhpcy5saHMpO1xuICAgICAgICAgICAgZm4odGhpcy5yaHMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29sbGF0b3IpIHtcbiAgICAgICAgICAgICAgICBmbih0aGlzLmNvbGxhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbb3BdO1xuICAgICAgICAgICAgdGhpcy5lYWNoQ2hpbGQoY2hpbGQgPT4geyBzZXJpYWxpemVkLnB1c2goY2hpbGQuc2VyaWFsaXplKCkpOyB9KTtcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEVxdWFscyA9IG1ha2VDb21wYXJpc29uKCc9PScsIGVxLCBlcUNvbGxhdGUpO1xuZXhwb3J0IGNvbnN0IE5vdEVxdWFscyA9IG1ha2VDb21wYXJpc29uKCchPScsIG5lcSwgbmVxQ29sbGF0ZSk7XG5leHBvcnQgY29uc3QgTGVzc1RoYW4gPSBtYWtlQ29tcGFyaXNvbignPCcsIGx0LCBsdENvbGxhdGUpO1xuZXhwb3J0IGNvbnN0IEdyZWF0ZXJUaGFuID0gbWFrZUNvbXBhcmlzb24oJz4nLCBndCwgZ3RDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBMZXNzVGhhbk9yRXF1YWwgPSBtYWtlQ29tcGFyaXNvbignPD0nLCBsdGVxLCBsdGVxQ29sbGF0ZSk7XG5leHBvcnQgY29uc3QgR3JlYXRlclRoYW5PckVxdWFsID0gbWFrZUNvbXBhcmlzb24oJz49JywgZ3RlcSwgZ3RlcUNvbGxhdGUpO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtTdHJpbmdUeXBlLCBOdW1iZXJUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZGVjbGFyZSB2YXIgSW50bDoge1xuICAgIE51bWJlckZvcm1hdDogQ2xhc3M8SW50bCROdW1iZXJGb3JtYXQ+XG59O1xuXG5kZWNsYXJlIGNsYXNzIEludGwkTnVtYmVyRm9ybWF0IHtcbiAgICBjb25zdHJ1Y3RvciAoXG4gICAgICAgIGxvY2FsZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgb3B0aW9ucz86IE51bWJlckZvcm1hdE9wdGlvbnNcbiAgICApOiBJbnRsJE51bWJlckZvcm1hdDtcblxuICAgIHN0YXRpYyAoXG4gICAgICAgIGxvY2FsZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgb3B0aW9ucz86IE51bWJlckZvcm1hdE9wdGlvbnNcbiAgICApOiBJbnRsJE51bWJlckZvcm1hdDtcblxuICAgIGZvcm1hdChhOiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgICByZXNvbHZlZE9wdGlvbnMoKTogYW55O1xufVxuXG50eXBlIE51bWJlckZvcm1hdE9wdGlvbnMgPSB7XG4gICAgc3R5bGU/OiAnZGVjaW1hbCcgfCAnY3VycmVuY3knIHwgJ3BlcmNlbnQnO1xuICAgIGN1cnJlbmN5PzogbnVsbCB8IHN0cmluZztcbiAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM/OiBudWxsIHwgc3RyaW5nO1xuICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0cz86IG51bGwgfCBzdHJpbmc7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOdW1iZXJGb3JtYXQgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIG51bWJlcjogRXhwcmVzc2lvbjtcbiAgICBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsOyAgIC8vIEJDUCA0NyBsYW5ndWFnZSB0YWdcbiAgICBjdXJyZW5jeTogRXhwcmVzc2lvbiB8IG51bGw7IC8vIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUsIHJlcXVpcmVkIGlmIHN0eWxlPWN1cnJlbmN5XG4gICAgbWluRnJhY3Rpb25EaWdpdHM6IEV4cHJlc3Npb24gfCBudWxsOyAvLyBEZWZhdWx0IDBcbiAgICBtYXhGcmFjdGlvbkRpZ2l0czogRXhwcmVzc2lvbiB8IG51bGw7IC8vIERlZmF1bHQgM1xuXG4gICAgY29uc3RydWN0b3IobnVtYmVyOiBFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIGxvY2FsZTogRXhwcmVzc2lvbiB8IG51bGwsXG4gICAgICAgICAgICAgICAgY3VycmVuY3k6IEV4cHJlc3Npb24gfCBudWxsLFxuICAgICAgICAgICAgICAgIG1pbkZyYWN0aW9uRGlnaXRzOiBFeHByZXNzaW9uIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBtYXhGcmFjdGlvbkRpZ2l0czogRXhwcmVzc2lvbiB8IG51bGwpIHtcbiAgICAgICAgdGhpcy50eXBlID0gU3RyaW5nVHlwZTtcbiAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7XG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlO1xuICAgICAgICB0aGlzLmN1cnJlbmN5ID0gY3VycmVuY3k7XG4gICAgICAgIHRoaXMubWluRnJhY3Rpb25EaWdpdHMgPSBtaW5GcmFjdGlvbkRpZ2l0cztcbiAgICAgICAgdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cyA9IG1heEZyYWN0aW9uRGlnaXRzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDMpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgdHdvIGFyZ3VtZW50cy5gKTtcblxuICAgICAgICBjb25zdCBudW1iZXIgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICBpZiAoIW51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IChhcmdzWzJdOiBhbnkpO1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShvcHRpb25zKSlcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBOdW1iZXJGb3JtYXQgb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5gKTtcblxuICAgICAgICBsZXQgbG9jYWxlID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ2xvY2FsZSddKSB7XG4gICAgICAgICAgICBsb2NhbGUgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ2xvY2FsZSddLCAxLCBTdHJpbmdUeXBlKTtcbiAgICAgICAgICAgIGlmICghbG9jYWxlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjdXJyZW5jeSA9IG51bGw7XG4gICAgICAgIGlmIChvcHRpb25zWydjdXJyZW5jeSddKSB7XG4gICAgICAgICAgICBjdXJyZW5jeSA9IGNvbnRleHQucGFyc2Uob3B0aW9uc1snY3VycmVuY3knXSwgMSwgU3RyaW5nVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbmN5KSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtaW5GcmFjdGlvbkRpZ2l0cyA9IG51bGw7XG4gICAgICAgIGlmIChvcHRpb25zWydtaW4tZnJhY3Rpb24tZGlnaXRzJ10pIHtcbiAgICAgICAgICAgIG1pbkZyYWN0aW9uRGlnaXRzID0gY29udGV4dC5wYXJzZShvcHRpb25zWydtaW4tZnJhY3Rpb24tZGlnaXRzJ10sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICAgICAgaWYgKCFtaW5GcmFjdGlvbkRpZ2l0cykgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWF4RnJhY3Rpb25EaWdpdHMgPSBudWxsO1xuICAgICAgICBpZiAob3B0aW9uc1snbWF4LWZyYWN0aW9uLWRpZ2l0cyddKSB7XG4gICAgICAgICAgICBtYXhGcmFjdGlvbkRpZ2l0cyA9IGNvbnRleHQucGFyc2Uob3B0aW9uc1snbWF4LWZyYWN0aW9uLWRpZ2l0cyddLCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgICAgIGlmICghbWF4RnJhY3Rpb25EaWdpdHMpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJGb3JtYXQobnVtYmVyLCBsb2NhbGUsIGN1cnJlbmN5LCBtaW5GcmFjdGlvbkRpZ2l0cywgbWF4RnJhY3Rpb25EaWdpdHMpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLk51bWJlckZvcm1hdCh0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlLmV2YWx1YXRlKGN0eCkgOiBbXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdHlsZTogdGhpcy5jdXJyZW5jeSA/IFwiY3VycmVuY3lcIiA6IFwiZGVjaW1hbFwiLFxuICAgICAgICAgICAgICAgIGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5ID8gdGhpcy5jdXJyZW5jeS5ldmFsdWF0ZShjdHgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogdGhpcy5taW5GcmFjdGlvbkRpZ2l0cyA/IHRoaXMubWluRnJhY3Rpb25EaWdpdHMuZXZhbHVhdGUoY3R4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IHRoaXMubWF4RnJhY3Rpb25EaWdpdHMgPyB0aGlzLm1heEZyYWN0aW9uRGlnaXRzLmV2YWx1YXRlKGN0eCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KS5mb3JtYXQodGhpcy5udW1iZXIuZXZhbHVhdGUoY3R4KSk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLm51bWJlcik7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsZSkge1xuICAgICAgICAgICAgZm4odGhpcy5sb2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbmN5KSB7XG4gICAgICAgICAgICBmbih0aGlzLmN1cnJlbmN5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5taW5GcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICAgICAgZm4odGhpcy5taW5GcmFjdGlvbkRpZ2l0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWF4RnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubWF4RnJhY3Rpb25EaWdpdHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbJ2xvY2FsZSddID0gdGhpcy5sb2NhbGUuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3VycmVuY3kpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbJ2N1cnJlbmN5J10gPSB0aGlzLmN1cnJlbmN5LnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1pbkZyYWN0aW9uRGlnaXRzKSB7XG4gICAgICAgICAgICBvcHRpb25zWydtaW4tZnJhY3Rpb24tZGlnaXRzJ10gPSB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1heEZyYWN0aW9uRGlnaXRzKSB7XG4gICAgICAgICAgICBvcHRpb25zWydtYXgtZnJhY3Rpb24tZGlnaXRzJ10gPSB0aGlzLm1heEZyYWN0aW9uRGlnaXRzLnNlcmlhbGl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXCJudW1iZXItZm9ybWF0XCIsIHRoaXMubnVtYmVyLnNlcmlhbGl6ZSgpLCBvcHRpb25zXTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge051bWJlclR5cGUsIHRvU3RyaW5nfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jbGFzcyBMZW5ndGggaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGlucHV0OiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gTnVtYmVyVHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KSB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCAxIGFyZ3VtZW50LCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEpO1xuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoaW5wdXQudHlwZS5raW5kICE9PSAnYXJyYXknICYmIGlucHV0LnR5cGUua2luZCAhPT0gJ3N0cmluZycgJiYgaW5wdXQudHlwZS5raW5kICE9PSAndmFsdWUnKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFyZ3VtZW50IG9mIHR5cGUgc3RyaW5nIG9yIGFycmF5LCBidXQgZm91bmQgJHt0b1N0cmluZyhpbnB1dC50eXBlKX0gaW5zdGVhZC5gKTtcblxuICAgICAgICByZXR1cm4gbmV3IExlbmd0aChpbnB1dCk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5sZW5ndGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvZiB0eXBlIHN0cmluZyBvciBhcnJheSwgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKGlucHV0KSl9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJsZW5ndGhcIl07XG4gICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGVuZ3RoO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICB0eXBlIFR5cGUsXG4gICAgTnVtYmVyVHlwZSxcbiAgICBTdHJpbmdUeXBlLFxuICAgIEJvb2xlYW5UeXBlLFxuICAgIENvbG9yVHlwZSxcbiAgICBPYmplY3RUeXBlLFxuICAgIFZhbHVlVHlwZSxcbiAgICBFcnJvclR5cGUsXG4gICAgQ29sbGF0b3JUeXBlLFxuICAgIGFycmF5LFxuICAgIHRvU3RyaW5nIGFzIHR5cGVUb1N0cmluZ1xufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmltcG9ydCB7dHlwZU9mLCBDb2xvciwgdmFsaWRhdGVSR0JBLCB0b1N0cmluZyBhcyB2YWx1ZVRvU3RyaW5nfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuaW1wb3J0IENvbXBvdW5kRXhwcmVzc2lvbiBmcm9tICcuLi9jb21wb3VuZF9leHByZXNzaW9uLmpzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvci5qcyc7XG5pbXBvcnQgTGV0IGZyb20gJy4vbGV0LmpzJztcbmltcG9ydCBWYXIgZnJvbSAnLi92YXIuanMnO1xuaW1wb3J0IExpdGVyYWwgZnJvbSAnLi9saXRlcmFsLmpzJztcbmltcG9ydCBBc3NlcnRpb24gZnJvbSAnLi9hc3NlcnRpb24uanMnO1xuaW1wb3J0IENvZXJjaW9uIGZyb20gJy4vY29lcmNpb24uanMnO1xuaW1wb3J0IEF0IGZyb20gJy4vYXQuanMnO1xuaW1wb3J0IEluIGZyb20gJy4vaW4uanMnO1xuaW1wb3J0IEluZGV4T2YgZnJvbSAnLi9pbmRleF9vZi5qcyc7XG5pbXBvcnQgTWF0Y2ggZnJvbSAnLi9tYXRjaC5qcyc7XG5pbXBvcnQgQ2FzZSBmcm9tICcuL2Nhc2UuanMnO1xuaW1wb3J0IFNsaWNlIGZyb20gJy4vc2xpY2UuanMnO1xuaW1wb3J0IFN0ZXAgZnJvbSAnLi9zdGVwLmpzJztcbmltcG9ydCBJbnRlcnBvbGF0ZSBmcm9tICcuL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCBDb2FsZXNjZSBmcm9tICcuL2NvYWxlc2NlLmpzJztcbmltcG9ydCB7XG4gICAgRXF1YWxzLFxuICAgIE5vdEVxdWFscyxcbiAgICBMZXNzVGhhbixcbiAgICBHcmVhdGVyVGhhbixcbiAgICBMZXNzVGhhbk9yRXF1YWwsXG4gICAgR3JlYXRlclRoYW5PckVxdWFsXG59IGZyb20gJy4vY29tcGFyaXNvbi5qcyc7XG5pbXBvcnQgQ29sbGF0b3JFeHByZXNzaW9uIGZyb20gJy4vY29sbGF0b3IuanMnO1xuaW1wb3J0IE51bWJlckZvcm1hdCBmcm9tICcuL251bWJlcl9mb3JtYXQuanMnO1xuaW1wb3J0IEZvcm1hdEV4cHJlc3Npb24gZnJvbSAnLi9mb3JtYXQuanMnO1xuaW1wb3J0IEltYWdlRXhwcmVzc2lvbiBmcm9tICcuL2ltYWdlLmpzJztcbmltcG9ydCBMZW5ndGggZnJvbSAnLi9sZW5ndGguanMnO1xuaW1wb3J0IFdpdGhpbiBmcm9tICcuL3dpdGhpbi5qcyc7XG5cbmltcG9ydCB0eXBlIHtWYXJhcmdzfSBmcm9tICcuLi9jb21wb3VuZF9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9uUmVnaXN0cnl9IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuXG5jb25zdCBleHByZXNzaW9uczogRXhwcmVzc2lvblJlZ2lzdHJ5ID0ge1xuICAgIC8vIHNwZWNpYWwgZm9ybXNcbiAgICAnPT0nOiBFcXVhbHMsXG4gICAgJyE9JzogTm90RXF1YWxzLFxuICAgICc+JzogR3JlYXRlclRoYW4sXG4gICAgJzwnOiBMZXNzVGhhbixcbiAgICAnPj0nOiBHcmVhdGVyVGhhbk9yRXF1YWwsXG4gICAgJzw9JzogTGVzc1RoYW5PckVxdWFsLFxuICAgICdhcnJheSc6IEFzc2VydGlvbixcbiAgICAnYXQnOiBBdCxcbiAgICAnYm9vbGVhbic6IEFzc2VydGlvbixcbiAgICAnY2FzZSc6IENhc2UsXG4gICAgJ2NvYWxlc2NlJzogQ29hbGVzY2UsXG4gICAgJ2NvbGxhdG9yJzogQ29sbGF0b3JFeHByZXNzaW9uLFxuICAgICdmb3JtYXQnOiBGb3JtYXRFeHByZXNzaW9uLFxuICAgICdpbWFnZSc6IEltYWdlRXhwcmVzc2lvbixcbiAgICAnaW4nOiBJbixcbiAgICAnaW5kZXgtb2YnOiBJbmRleE9mLFxuICAgICdpbnRlcnBvbGF0ZSc6IEludGVycG9sYXRlLFxuICAgICdpbnRlcnBvbGF0ZS1oY2wnOiBJbnRlcnBvbGF0ZSxcbiAgICAnaW50ZXJwb2xhdGUtbGFiJzogSW50ZXJwb2xhdGUsXG4gICAgJ2xlbmd0aCc6IExlbmd0aCxcbiAgICAnbGV0JzogTGV0LFxuICAgICdsaXRlcmFsJzogTGl0ZXJhbCxcbiAgICAnbWF0Y2gnOiBNYXRjaCxcbiAgICAnbnVtYmVyJzogQXNzZXJ0aW9uLFxuICAgICdudW1iZXItZm9ybWF0JzogTnVtYmVyRm9ybWF0LFxuICAgICdvYmplY3QnOiBBc3NlcnRpb24sXG4gICAgJ3NsaWNlJzogU2xpY2UsXG4gICAgJ3N0ZXAnOiBTdGVwLFxuICAgICdzdHJpbmcnOiBBc3NlcnRpb24sXG4gICAgJ3RvLWJvb2xlYW4nOiBDb2VyY2lvbixcbiAgICAndG8tY29sb3InOiBDb2VyY2lvbixcbiAgICAndG8tbnVtYmVyJzogQ29lcmNpb24sXG4gICAgJ3RvLXN0cmluZyc6IENvZXJjaW9uLFxuICAgICd2YXInOiBWYXIsXG4gICAgJ3dpdGhpbic6IFdpdGhpblxufTtcblxuZnVuY3Rpb24gcmdiYShjdHgsIFtyLCBnLCBiLCBhXSkge1xuICAgIHIgPSByLmV2YWx1YXRlKGN0eCk7XG4gICAgZyA9IGcuZXZhbHVhdGUoY3R4KTtcbiAgICBiID0gYi5ldmFsdWF0ZShjdHgpO1xuICAgIGNvbnN0IGFscGhhID0gYSA/IGEuZXZhbHVhdGUoY3R4KSA6IDE7XG4gICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZVJHQkEociwgZywgYiwgYWxwaGEpO1xuICAgIGlmIChlcnJvcikgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIG5ldyBDb2xvcihyIC8gMjU1ICogYWxwaGEsIGcgLyAyNTUgKiBhbHBoYSwgYiAvIDI1NSAqIGFscGhhLCBhbHBoYSk7XG59XG5cbmZ1bmN0aW9uIGhhcyhrZXksIG9iaikge1xuICAgIHJldHVybiBrZXkgaW4gb2JqO1xufVxuXG5mdW5jdGlvbiBnZXQoa2V5LCBvYmopIHtcbiAgICBjb25zdCB2ID0gb2JqW2tleV07XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiB2O1xufVxuXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2godiwgYSwgaSwgaikge1xuICAgIHdoaWxlIChpIDw9IGopIHtcbiAgICAgICAgY29uc3QgbSA9IChpICsgaikgPj4gMTtcbiAgICAgICAgaWYgKGFbbV0gPT09IHYpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGFbbV0gPiB2KVxuICAgICAgICAgICAgaiA9IG0gLSAxO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBpID0gbSArIDE7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdmFyYXJncyh0eXBlOiBUeXBlKTogVmFyYXJncyB7XG4gICAgcmV0dXJuIHt0eXBlfTtcbn1cblxuQ29tcG91bmRFeHByZXNzaW9uLnJlZ2lzdGVyKGV4cHJlc3Npb25zLCB7XG4gICAgJ2Vycm9yJzogW1xuICAgICAgICBFcnJvclR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7IHRocm93IG5ldyBSdW50aW1lRXJyb3Iodi5ldmFsdWF0ZShjdHgpKTsgfVxuICAgIF0sXG4gICAgJ3R5cGVvZic6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4gdHlwZVRvU3RyaW5nKHR5cGVPZih2LmV2YWx1YXRlKGN0eCkpKVxuICAgIF0sXG4gICAgJ3RvLXJnYmEnOiBbXG4gICAgICAgIGFycmF5KE51bWJlclR5cGUsIDQpLFxuICAgICAgICBbQ29sb3JUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdi5ldmFsdWF0ZShjdHgpLnRvQXJyYXkoKTtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ3JnYic6IFtcbiAgICAgICAgQ29sb3JUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIHJnYmFcbiAgICBdLFxuICAgICdyZ2JhJzogW1xuICAgICAgICBDb2xvclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlLCBOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgcmdiYVxuICAgIF0sXG4gICAgJ2hhcyc6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhblR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5XSkgPT4gaGFzKGtleS5ldmFsdWF0ZShjdHgpLCBjdHgucHJvcGVydGllcygpKVxuICAgICAgICAgICAgXSwgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlLCBPYmplY3RUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5LCBvYmpdKSA9PiBoYXMoa2V5LmV2YWx1YXRlKGN0eCksIG9iai5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgXVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnZ2V0Jzoge1xuICAgICAgICB0eXBlOiBWYWx1ZVR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5XSkgPT4gZ2V0KGtleS5ldmFsdWF0ZShjdHgpLCBjdHgucHJvcGVydGllcygpKVxuICAgICAgICAgICAgXSwgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlLCBPYmplY3RUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5LCBvYmpdKSA9PiBnZXQoa2V5LmV2YWx1YXRlKGN0eCksIG9iai5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgXVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnZmVhdHVyZS1zdGF0ZSc6IFtcbiAgICAgICAgVmFsdWVUeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZV0sXG4gICAgICAgIChjdHgsIFtrZXldKSA9PiBnZXQoa2V5LmV2YWx1YXRlKGN0eCksIGN0eC5mZWF0dXJlU3RhdGUgfHwge30pXG4gICAgXSxcbiAgICAncHJvcGVydGllcyc6IFtcbiAgICAgICAgT2JqZWN0VHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5wcm9wZXJ0aWVzKClcbiAgICBdLFxuICAgICdnZW9tZXRyeS10eXBlJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdlb21ldHJ5VHlwZSgpXG4gICAgXSxcbiAgICAnaWQnOiBbXG4gICAgICAgIFZhbHVlVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5pZCgpXG4gICAgXSxcbiAgICAnem9vbSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLnpvb21cbiAgICBdLFxuICAgICdwaXRjaCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLnBpdGNoIHx8IDBcbiAgICBdLFxuICAgICdkaXN0YW5jZS1mcm9tLWNlbnRlcic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5kaXN0YW5jZUZyb21DZW50ZXIoKVxuICAgIF0sXG4gICAgJ2hlYXRtYXAtZGVuc2l0eSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLmhlYXRtYXBEZW5zaXR5IHx8IDBcbiAgICBdLFxuICAgICdsaW5lLXByb2dyZXNzJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMubGluZVByb2dyZXNzIHx8IDBcbiAgICBdLFxuICAgICdza3ktcmFkaWFsLXByb2dyZXNzJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMuc2t5UmFkaWFsUHJvZ3Jlc3MgfHwgMFxuICAgIF0sXG4gICAgJ2FjY3VtdWxhdGVkJzogW1xuICAgICAgICBWYWx1ZVR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2xvYmFscy5hY2N1bXVsYXRlZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN0eC5nbG9iYWxzLmFjY3VtdWxhdGVkXG4gICAgXSxcbiAgICAnKyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJyonOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIHZhcmFyZ3MoTnVtYmVyVHlwZSksXG4gICAgICAgIChjdHgsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSAxO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCAqPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICctJzoge1xuICAgICAgICB0eXBlOiBOdW1iZXJUeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2EsIGJdKSA9PiBhLmV2YWx1YXRlKGN0eCkgLSBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sIFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2FdKSA9PiAtYS5ldmFsdWF0ZShjdHgpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICcvJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFthLCBiXSkgPT4gYS5ldmFsdWF0ZShjdHgpIC8gYi5ldmFsdWF0ZShjdHgpXG4gICAgXSxcbiAgICAnJSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAlIGIuZXZhbHVhdGUoY3R4KVxuICAgIF0sXG4gICAgJ2xuMic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguTE4yXG4gICAgXSxcbiAgICAncGknOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoKSA9PiBNYXRoLlBJXG4gICAgXSxcbiAgICAnZSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguRVxuICAgIF0sXG4gICAgJ14nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW2IsIGVdKSA9PiBNYXRoLnBvdyhiLmV2YWx1YXRlKGN0eCksIGUuZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdzcXJ0JzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFt4XSkgPT4gTWF0aC5zcXJ0KHguZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdsb2cxMCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nKG4uZXZhbHVhdGUoY3R4KSkgLyBNYXRoLkxOMTBcbiAgICBdLFxuICAgICdsbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdsb2cyJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5sb2cobi5ldmFsdWF0ZShjdHgpKSAvIE1hdGguTE4yXG4gICAgXSxcbiAgICAnc2luJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5zaW4obi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2Nvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguY29zKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICd0YW4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLnRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXNpbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXNpbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYWNvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYWNvcyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXRhbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnbWluJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICB2YXJhcmdzKE51bWJlclR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBNYXRoLm1pbiguLi5hcmdzLm1hcChhcmcgPT4gYXJnLmV2YWx1YXRlKGN0eCkpKVxuICAgIF0sXG4gICAgJ21heCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4gTWF0aC5tYXgoLi4uYXJncy5tYXAoYXJnID0+IGFyZy5ldmFsdWF0ZShjdHgpKSlcbiAgICBdLFxuICAgICdhYnMnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmFicyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAncm91bmQnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ID0gbi5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgLy8gSmF2YXNjcmlwdCdzIE1hdGgucm91bmQoKSByb3VuZHMgdG93YXJkcyArSW5maW5pdHkgZm9yIGhhbGZ3YXlcbiAgICAgICAgICAgIC8vIHZhbHVlcywgZXZlbiB3aGVuIHRoZXkncmUgbmVnYXRpdmUuIEl0J3MgbW9yZSBjb21tb24gdG8gcm91bmRcbiAgICAgICAgICAgIC8vIGF3YXkgZnJvbSAwIChlLmcuLCB0aGlzIGlzIHdoYXQgcHl0aG9uIGFuZCBDKysgZG8pXG4gICAgICAgICAgICByZXR1cm4gdiA8IDAgPyAtTWF0aC5yb3VuZCgtdikgOiBNYXRoLnJvdW5kKHYpO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmxvb3InOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmZsb29yKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdjZWlsJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5jZWlsKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdmaWx0ZXItPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSA9PT0gKHY6IGFueSkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguaWQoKSA9PT0gKHY6IGFueSkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItdHlwZS09PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICh2OiBhbnkpLnZhbHVlXG4gICAgXSxcbiAgICAnZmlsdGVyLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLTw9JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIFZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhIDw9IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPD0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPD0gYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci0+PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA+PSBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT49JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5pZCgpO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhID49IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaGFzJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrXSkgPT4gKGs6IGFueSkudmFsdWUgaW4gY3R4LnByb3BlcnRpZXMoKVxuICAgIF0sXG4gICAgJ2ZpbHRlci1oYXMtaWQnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gKGN0eC5pZCgpICE9PSBudWxsICYmIGN0eC5pZCgpICE9PSB1bmRlZmluZWQpXG4gICAgXSxcbiAgICAnZmlsdGVyLXR5cGUtaW4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbYXJyYXkoU3RyaW5nVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4Lmdlb21ldHJ5VHlwZSgpKSA+PSAwXG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLWluJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW2FycmF5KFZhbHVlVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4LmlkKCkpID49IDBcbiAgICBdLFxuICAgICdmaWx0ZXItaW4tc21hbGwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgYXJyYXkoVmFsdWVUeXBlKV0sXG4gICAgICAgIC8vIGFzc3VtZXMgdiBpcyBhbiBhcnJheSBsaXRlcmFsXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gKHY6IGFueSkudmFsdWUuaW5kZXhPZihjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSkgPj0gMFxuICAgIF0sXG4gICAgJ2ZpbHRlci1pbi1sYXJnZSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBhcnJheShWYWx1ZVR5cGUpXSxcbiAgICAgICAgLy8gYXNzdW1lcyB2IGlzIGEgYXJyYXkgbGl0ZXJhbCB3aXRoIHZhbHVlcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBvZiBhIHNpbmdsZSB0eXBlXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gYmluYXJ5U2VhcmNoKGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdLCAodjogYW55KS52YWx1ZSwgMCwgKHY6IGFueSkudmFsdWUubGVuZ3RoIC0gMSlcbiAgICBdLFxuICAgICdhbGwnOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAmJiBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZy5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdhbnknOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSB8fCBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJyEnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbQm9vbGVhblR5cGVdLFxuICAgICAgICAoY3R4LCBbYl0pID0+ICFiLmV2YWx1YXRlKGN0eClcbiAgICBdLFxuICAgICdpcy1zdXBwb3J0ZWQtc2NyaXB0JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAvLyBBdCBwYXJzZSB0aW1lIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUsIHNvIHdlIG5lZWQgdG8gZXhjbHVkZSB0aGlzIGV4cHJlc3Npb24gd2l0aCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnRcbiAgICAgICAgKGN0eCwgW3NdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc1N1cHBvcnRlZFNjcmlwdCA9IGN0eC5nbG9iYWxzICYmIGN0eC5nbG9iYWxzLmlzU3VwcG9ydGVkU2NyaXB0O1xuICAgICAgICAgICAgaWYgKGlzU3VwcG9ydGVkU2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkU2NyaXB0KHMuZXZhbHVhdGUoY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ3VwY2FzZSc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBbc10pID0+IHMuZXZhbHVhdGUoY3R4KS50b1VwcGVyQ2FzZSgpXG4gICAgXSxcbiAgICAnZG93bmNhc2UnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3NdKSA9PiBzLmV2YWx1YXRlKGN0eCkudG9Mb3dlckNhc2UoKVxuICAgIF0sXG4gICAgJ2NvbmNhdCc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgdmFyYXJncyhWYWx1ZVR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBhcmdzLm1hcChhcmcgPT4gdmFsdWVUb1N0cmluZyhhcmcuZXZhbHVhdGUoY3R4KSkpLmpvaW4oJycpXG4gICAgXSxcbiAgICAncmVzb2x2ZWQtbG9jYWxlJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbQ29sbGF0b3JUeXBlXSxcbiAgICAgICAgKGN0eCwgW2NvbGxhdG9yXSkgPT4gY29sbGF0b3IuZXZhbHVhdGUoY3R4KS5yZXNvbHZlZExvY2FsZSgpXG4gICAgXVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGV4cHJlc3Npb25zO1xuIiwiLy8gQGZsb3dcblxuLyoqXG4gKiBBIHR5cGUgdXNlZCBmb3IgcmV0dXJuaW5nIGFuZCBwcm9wYWdhdGluZyBlcnJvcnMuIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB1bmlvblxuICogcmVwcmVzZW50cyBzdWNjZXNzIGFuZCBjb250YWlucyBhIHZhbHVlLCBhbmQgdGhlIHNlY29uZCByZXByZXNlbnRzIGFuIGVycm9yIGFuZFxuICogY29udGFpbnMgYW4gZXJyb3IgdmFsdWUuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgdHlwZSBSZXN1bHQ8VCwgRT4gPVxuICAgIHwge3wgcmVzdWx0OiAnc3VjY2VzcycsIHZhbHVlOiBUIHx9XG4gICAgfCB7fCByZXN1bHQ6ICdlcnJvcicsIHZhbHVlOiBFIHx9O1xuXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VzczxULCBFPih2YWx1ZTogVCk6IFJlc3VsdDxULCBFPiB7XG4gICAgcmV0dXJuIHtyZXN1bHQ6ICdzdWNjZXNzJywgdmFsdWV9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3I8VCwgRT4odmFsdWU6IEUpOiBSZXN1bHQ8VCwgRT4ge1xuICAgIHJldHVybiB7cmVzdWx0OiAnZXJyb3InLCB2YWx1ZX07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3BlY1sncHJvcGVydHktdHlwZSddID09PSAnZGF0YS1kcml2ZW4nIHx8IHNwZWNbJ3Byb3BlcnR5LXR5cGUnXSA9PT0gJ2Nyb3NzLWZhZGVkLWRhdGEtZHJpdmVuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzcGVjLmV4cHJlc3Npb24gJiYgc3BlYy5leHByZXNzaW9uLnBhcmFtZXRlcnMuaW5kZXhPZignem9vbScpID4gLTE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0ludGVycG9sYXRpb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzcGVjLmV4cHJlc3Npb24gJiYgc3BlYy5leHByZXNzaW9uLmludGVycG9sYXRlZDtcbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFR5cGUodmFsOiBtaXhlZCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikge1xuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWw7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgKiBhcyBjb2xvclNwYWNlcyBmcm9tICcuLi91dGlsL2NvbG9yX3NwYWNlcy5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0ICogYXMgaW50ZXJwb2xhdGUgZnJvbSAnLi4vdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQgSW50ZXJwb2xhdGUgZnJvbSAnLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuaW1wb3J0IHtzdXBwb3J0c0ludGVycG9sYXRpb259IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge2ZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG99IGZyb20gJy4uL2V4cHJlc3Npb24vc3RvcHMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaWRlbnRpdHlGdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMpIHtcbiAgICBjb25zdCBpc0NvbG9yID0gcHJvcGVydHlTcGVjLnR5cGUgPT09ICdjb2xvcic7XG4gICAgY29uc3Qgem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgPSBwYXJhbWV0ZXJzLnN0b3BzICYmIHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdID09PSAnb2JqZWN0JztcbiAgICBjb25zdCBmZWF0dXJlRGVwZW5kZW50ID0gem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgfHwgcGFyYW1ldGVycy5wcm9wZXJ0eSAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHpvb21EZXBlbmRlbnQgPSB6b29tQW5kRmVhdHVyZURlcGVuZGVudCB8fCAhZmVhdHVyZURlcGVuZGVudDtcbiAgICBjb25zdCB0eXBlID0gcGFyYW1ldGVycy50eXBlIHx8IChzdXBwb3J0c0ludGVycG9sYXRpb24ocHJvcGVydHlTcGVjKSA/ICdleHBvbmVudGlhbCcgOiAnaW50ZXJ2YWwnKTtcblxuICAgIGlmIChpc0NvbG9yKSB7XG4gICAgICAgIHBhcmFtZXRlcnMgPSBleHRlbmQoe30sIHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLnN0b3BzKSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnN0b3BzID0gcGFyYW1ldGVycy5zdG9wcy5tYXAoKHN0b3ApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3N0b3BbMF0sIENvbG9yLnBhcnNlKHN0b3BbMV0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuZGVmYXVsdCkge1xuICAgICAgICAgICAgcGFyYW1ldGVycy5kZWZhdWx0ID0gQ29sb3IucGFyc2UocGFyYW1ldGVycy5kZWZhdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZGVmYXVsdCA9IENvbG9yLnBhcnNlKHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXJzLmNvbG9yU3BhY2UgJiYgcGFyYW1ldGVycy5jb2xvclNwYWNlICE9PSAncmdiJyAmJiAhY29sb3JTcGFjZXNbcGFyYW1ldGVycy5jb2xvclNwYWNlXSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uYW1lc3BhY2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbG9yIHNwYWNlOiAke3BhcmFtZXRlcnMuY29sb3JTcGFjZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgaW5uZXJGdW47XG4gICAgbGV0IGhhc2hlZFN0b3BzO1xuICAgIGxldCBjYXRlZ29yaWNhbEtleVR5cGU7XG4gICAgaWYgKHR5cGUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgaW5uZXJGdW4gPSBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50ZXJ2YWwnKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgICBpbm5lckZ1biA9IGV2YWx1YXRlQ2F0ZWdvcmljYWxGdW5jdGlvbjtcblxuICAgICAgICAvLyBGb3IgY2F0ZWdvcmljYWwgZnVuY3Rpb25zLCBnZW5lcmF0ZSBhbiBPYmplY3QgYXMgYSBoYXNobWFwIG9mIHRoZSBzdG9wcyBmb3IgZmFzdCBzZWFyY2hpbmdcbiAgICAgICAgaGFzaGVkU3RvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGNvbnN0IHN0b3Agb2YgcGFyYW1ldGVycy5zdG9wcykge1xuICAgICAgICAgICAgaGFzaGVkU3RvcHNbc3RvcFswXV0gPSBzdG9wWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5mZXIga2V5IHR5cGUgYmFzZWQgb24gZmlyc3Qgc3RvcCBrZXktLSB1c2VkIHRvIGVuY2ZvcmNlIHN0cmljdCB0eXBlIGNoZWNraW5nIGxhdGVyXG4gICAgICAgIGNhdGVnb3JpY2FsS2V5VHlwZSA9IHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaWRlbnRpdHknKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJZGVudGl0eUZ1bmN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmdW5jdGlvbiB0eXBlIFwiJHt0eXBlfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKHpvb21BbmRGZWF0dXJlRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVGdW5jdGlvbnMgPSB7fTtcbiAgICAgICAgY29uc3Qgem9vbVN0b3BzID0gW107XG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgcGFyYW1ldGVycy5zdG9wcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RvcCA9IHBhcmFtZXRlcnMuc3RvcHNbc107XG4gICAgICAgICAgICBjb25zdCB6b29tID0gc3RvcFswXS56b29tO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtZXRlcnMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHBhcmFtZXRlcnMucHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHBhcmFtZXRlcnMuZGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgc3RvcHM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB6b29tU3RvcHMucHVzaCh6b29tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0uc3RvcHMucHVzaChbc3RvcFswXS52YWx1ZSwgc3RvcFsxXV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZUZ1bmN0aW9uU3RvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB6IG9mIHpvb21TdG9wcykge1xuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uU3RvcHMucHVzaChbZmVhdHVyZUZ1bmN0aW9uc1t6XS56b29tLCBjcmVhdGVGdW5jdGlvbihmZWF0dXJlRnVuY3Rpb25zW3pdLCBwcm9wZXJ0eVNwZWMpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uVHlwZSA9IHtuYW1lOiAnbGluZWFyJ307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29tcG9zaXRlJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBmZWF0dXJlRnVuY3Rpb25TdG9wcy5tYXAocyA9PiBzWzBdKSxcbiAgICAgICAgICAgIGV2YWx1YXRlKHt6b29tfSwgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICBzdG9wczogZmVhdHVyZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6IHBhcmFtZXRlcnMuYmFzZVxuICAgICAgICAgICAgICAgIH0sIHByb3BlcnR5U3BlYywgem9vbSkuZXZhbHVhdGUoem9vbSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh6b29tRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb25UeXBlID0gdHlwZSA9PT0gJ2V4cG9uZW50aWFsJyA/XG4gICAgICAgICAgICB7bmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogcGFyYW1ldGVycy5iYXNlICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmJhc2UgOiAxfSA6IG51bGw7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY2FtZXJhJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBwYXJhbWV0ZXJzLnN0b3BzLm1hcChzID0+IHNbMF0pLFxuICAgICAgICAgICAgZXZhbHVhdGU6ICh7em9vbX0pID0+IGlubmVyRnVuKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgem9vbSwgaGFzaGVkU3RvcHMsIGNhdGVnb3JpY2FsS2V5VHlwZSlcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogJ3NvdXJjZScsXG4gICAgICAgICAgICBldmFsdWF0ZShfLCBmZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmZWF0dXJlICYmIGZlYXR1cmUucHJvcGVydGllcyA/IGZlYXR1cmUucHJvcGVydGllc1twYXJhbWV0ZXJzLnByb3BlcnR5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29hbGVzY2UocGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lckZ1bihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIHZhbHVlLCBoYXNoZWRTdG9wcywgY2F0ZWdvcmljYWxLZXlUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvYWxlc2NlKGEsIGIsIGMpIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYTtcbiAgICBpZiAoYiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYjtcbiAgICBpZiAoYyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVDYXRlZ29yaWNhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQsIGhhc2hlZFN0b3BzLCBrZXlUeXBlKSB7XG4gICAgY29uc3QgZXZhbHVhdGVkID0gdHlwZW9mIGlucHV0ID09PSBrZXlUeXBlID8gaGFzaGVkU3RvcHNbaW5wdXRdIDogdW5kZWZpbmVkOyAvLyBFbmZvcmNlIHN0cmljdCB0eXBpbmcgb24gaW5wdXRcbiAgICByZXR1cm4gY29hbGVzY2UoZXZhbHVhdGVkLCBwYXJhbWV0ZXJzLmRlZmF1bHQsIHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQpIHtcbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xufVxuXG5mdW5jdGlvbiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCBpbnB1dCkge1xuICAgIGNvbnN0IGJhc2UgPSBwYXJhbWV0ZXJzLmJhc2UgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYmFzZSA6IDE7XG5cbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuICAgIGNvbnN0IHQgPSBpbnRlcnBvbGF0aW9uRmFjdG9yKFxuICAgICAgICBpbnB1dCwgYmFzZSxcbiAgICAgICAgcGFyYW1ldGVycy5zdG9wc1tpbmRleF1bMF0sXG4gICAgICAgIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXggKyAxXVswXSk7XG5cbiAgICBjb25zdCBvdXRwdXRMb3dlciA9IHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xuICAgIGNvbnN0IG91dHB1dFVwcGVyID0gcGFyYW1ldGVycy5zdG9wc1tpbmRleCArIDFdWzFdO1xuICAgIGxldCBpbnRlcnAgPSBpbnRlcnBvbGF0ZVtwcm9wZXJ0eVNwZWMudHlwZV0gfHwgaWRlbnRpdHlGdW5jdGlvbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbmFtZXNwYWNlXG5cbiAgICBpZiAocGFyYW1ldGVycy5jb2xvclNwYWNlICYmIHBhcmFtZXRlcnMuY29sb3JTcGFjZSAhPT0gJ3JnYicpIHtcbiAgICAgICAgY29uc3QgY29sb3JzcGFjZSA9IGNvbG9yU3BhY2VzW3BhcmFtZXRlcnMuY29sb3JTcGFjZV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBpbnRlcnAgPSAoYSwgYikgPT4gY29sb3JzcGFjZS5yZXZlcnNlKGNvbG9yc3BhY2UuaW50ZXJwb2xhdGUoY29sb3JzcGFjZS5mb3J3YXJkKGEpLCBjb2xvcnNwYWNlLmZvcndhcmQoYiksIHQpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG91dHB1dExvd2VyLmV2YWx1YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBldmFsdWF0ZSguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkTG93ZXIgPSBvdXRwdXRMb3dlci5ldmFsdWF0ZS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRlZFVwcGVyID0gb3V0cHV0VXBwZXIuZXZhbHVhdGUuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGZpbGwtb3V0bGluZS1jb2xvciwgd2hpY2ggaGFzIG5vIHNwZWMgZGVmYXVsdC5cbiAgICAgICAgICAgICAgICBpZiAoZXZhbHVhdGVkTG93ZXIgPT09IHVuZGVmaW5lZCB8fCBldmFsdWF0ZWRVcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcnAoZXZhbHVhdGVkTG93ZXIsIGV2YWx1YXRlZFVwcGVyLCB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJwKG91dHB1dExvd2VyLCBvdXRwdXRVcHBlciwgdCk7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlSWRlbnRpdHlGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0KSB7XG4gICAgaWYgKHByb3BlcnR5U3BlYy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgIGlucHV0ID0gQ29sb3IucGFyc2UoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAocHJvcGVydHlTcGVjLnR5cGUgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgIGlucHV0ID0gRm9ybWF0dGVkLmZyb21TdHJpbmcoaW5wdXQudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIGlmIChwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ3Jlc29sdmVkSW1hZ2UnKSB7XG4gICAgICAgIGlucHV0ID0gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKGlucHV0LnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSBpZiAoZ2V0VHlwZShpbnB1dCkgIT09IHByb3BlcnR5U3BlYy50eXBlICYmIChwcm9wZXJ0eVNwZWMudHlwZSAhPT0gJ2VudW0nIHx8ICFwcm9wZXJ0eVNwZWMudmFsdWVzW2lucHV0XSkpIHtcbiAgICAgICAgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBjb2FsZXNjZShpbnB1dCwgcGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJhdGlvIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiBleHBvbmVudGlhbCBmdW5jdGlvblxuICogc3RvcHMuXG4gKlxuICogSG93IGl0IHdvcmtzOlxuICogVHdvIGNvbnNlY3V0aXZlIHN0b3AgdmFsdWVzIGRlZmluZSBhIChzY2FsZWQgYW5kIHNoaWZ0ZWQpIGV4cG9uZW50aWFsXG4gKiBmdW5jdGlvbiBgZih4KSA9IGEgKiBiYXNlXnggKyBiYCwgd2hlcmUgYGJhc2VgIGlzIHRoZSB1c2VyLXNwZWNpZmllZCBiYXNlLFxuICogYW5kIGBhYCBhbmQgYGJgIGFyZSBjb25zdGFudHMgYWZmb3JkaW5nIHN1ZmZpY2llbnQgZGVncmVlcyBvZiBmcmVlZG9tIHRvIGZpdFxuICogdGhlIGZ1bmN0aW9uIHRvIHRoZSBnaXZlbiBzdG9wcy5cbiAqXG4gKiBIZXJlJ3MgYSBiaXQgb2YgYWxnZWJyYSB0aGF0IGxldHMgdXMgY29tcHV0ZSBgZih4KWAgZGlyZWN0bHkgZnJvbSB0aGUgc3RvcFxuICogdmFsdWVzIHdpdGhvdXQgZXhwbGljaXRseSBzb2x2aW5nIGZvciBgYWAgYW5kIGBiYDpcbiAqXG4gKiBGaXJzdCBzdG9wIHZhbHVlOiBgZih4MCkgPSB5MCA9IGEgKiBiYXNlXngwICsgYmBcbiAqIFNlY29uZCBzdG9wIHZhbHVlOiBgZih4MSkgPSB5MSA9IGEgKiBiYXNlXngxICsgYmBcbiAqID0+IGB5MSAtIHkwID0gYShiYXNlXngxIC0gYmFzZV54MClgXG4gKiA9PiBgYSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApYFxuICpcbiAqIERlc2lyZWQgdmFsdWU6IGBmKHgpID0geSA9IGEgKiBiYXNlXnggKyBiYFxuICogPT4gYGYoeCkgPSB5MCArIGEgKiAoYmFzZV54IC0gYmFzZV54MClgXG4gKlxuICogRnJvbSB0aGUgYWJvdmUsIHdlIGNhbiByZXBsYWNlIHRoZSBgYWAgaW4gYGEgKiAoYmFzZV54IC0gYmFzZV54MClgIGFuZCBkbyBhXG4gKiBsaXR0bGUgYWxnZWJyYTpcbiAqIGBgYFxuICogYSAqIChiYXNlXnggLSBiYXNlXngwKSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApICogKGJhc2VeeCAtIGJhc2VeeDApXG4gKiAgICAgICAgICAgICAgICAgICAgID0gKHkxIC0geTApICogKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgLSBiYXNlXngwKVxuICogYGBgXG4gKlxuICogSWYgd2UgbGV0IGAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSBiYXNlXngwKWAsIHRoZW4gd2UgaGF2ZVxuICogYGYoeCkgPSB5MCArICh5MSAtIHkwKSAqIHJhdGlvYC4gIEluIG90aGVyIHdvcmRzLCBgcmF0aW9gIG1heSBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZhY3RvciBiZXR3ZWVuIHRoZSB0d28gc3RvcHMnIG91dHB1dCB2YWx1ZXMuXG4gKlxuICogKE5vdGU6IGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm0gZm9yIGByYXRpb2AsXG4gKiBgKGJhc2VeKHgteDApIC0gMSkgLyAoYmFzZV4oeDEteDApIC0gMSkgYCwgaXMgZXF1aXZhbGVudCwgYnV0IHJlcXVpcmVzIGZld2VyXG4gKiBleHBlbnNpdmUgYE1hdGgucG93KClgIG9wZXJhdGlvbnMuKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGludGVycG9sYXRpb25GYWN0b3IoaW5wdXQsIGJhc2UsIGxvd2VyVmFsdWUsIHVwcGVyVmFsdWUpIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gdXBwZXJWYWx1ZSAtIGxvd2VyVmFsdWU7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBpbnB1dCAtIGxvd2VyVmFsdWU7XG5cbiAgICBpZiAoZGlmZmVyZW5jZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzIC8gZGlmZmVyZW5jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKE1hdGgucG93KGJhc2UsIHByb2dyZXNzKSAtIDEpIC8gKE1hdGgucG93KGJhc2UsIGRpZmZlcmVuY2UpIC0gMSk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcbmltcG9ydCBQYXJzaW5nRXJyb3IgZnJvbSAnLi9wYXJzaW5nX2Vycm9yLmpzJztcbmltcG9ydCBQYXJzaW5nQ29udGV4dCBmcm9tICcuL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IENvbXBvdW5kRXhwcmVzc2lvbiBmcm9tICcuL2NvbXBvdW5kX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IFN0ZXAgZnJvbSAnLi9kZWZpbml0aW9ucy9zdGVwLmpzJztcbmltcG9ydCBJbnRlcnBvbGF0ZSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCBDb2FsZXNjZSBmcm9tICcuL2RlZmluaXRpb25zL2NvYWxlc2NlLmpzJztcbmltcG9ydCBMZXQgZnJvbSAnLi9kZWZpbml0aW9ucy9sZXQuanMnO1xuaW1wb3J0IGRlZmluaXRpb25zIGZyb20gJy4vZGVmaW5pdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgaXNDb25zdGFudCBmcm9tICcuL2lzX2NvbnN0YW50LmpzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCB7c3VjY2VzcywgZXJyb3J9IGZyb20gJy4uL3V0aWwvcmVzdWx0LmpzJztcbmltcG9ydCB7c3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24sIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sIHN1cHBvcnRzSW50ZXJwb2xhdGlvbn0gZnJvbSAnLi4vdXRpbC9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUge1R5cGUsIEV2YWx1YXRpb25LaW5kfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtWYWx1ZX0gZnJvbSAnLi92YWx1ZXMuanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMuanMnO1xuaW1wb3J0IHR5cGUge1Jlc3VsdH0gZnJvbSAnLi4vdXRpbC9yZXN1bHQuanMnO1xuaW1wb3J0IHR5cGUge0ludGVycG9sYXRpb25UeXBlfSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCB0eXBlIHtQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVEaXN0YW5jZURhdGF9IGZyb20gJy4uL2ZlYXR1cmVfZmlsdGVyL2luZGV4LmpzJztcblxuZXhwb3J0IHR5cGUgRmVhdHVyZSA9IHtcbiAgICArdHlwZTogMSB8IDIgfCAzIHwgJ1Vua25vd24nIHwgJ1BvaW50JyB8ICdNdWx0aVBvaW50JyB8ICdMaW5lU3RyaW5nJyB8ICdNdWx0aUxpbmVTdHJpbmcnIHwgJ1BvbHlnb24nIHwgJ011bHRpUG9seWdvbicsXG4gICAgK2lkPzogYW55LFxuICAgICtwcm9wZXJ0aWVzOiB7W186IHN0cmluZ106IGFueX0sXG4gICAgK3BhdHRlcm5zPzoge1tfOiBzdHJpbmddOiB7XCJtaW5cIjogc3RyaW5nLCBcIm1pZFwiOiBzdHJpbmcsIFwibWF4XCI6IHN0cmluZ319LFxuICAgICtnZW9tZXRyeT86IEFycmF5PEFycmF5PFBvaW50Pj5cbn07XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVTdGF0ZSA9IHtbXzogc3RyaW5nXTogYW55fTtcblxuZXhwb3J0IHR5cGUgR2xvYmFsUHJvcGVydGllcyA9ICRSZWFkT25seTx7XG4gICAgem9vbTogbnVtYmVyLFxuICAgIHBpdGNoPzogbnVtYmVyLFxuICAgIGhlYXRtYXBEZW5zaXR5PzogbnVtYmVyLFxuICAgIGxpbmVQcm9ncmVzcz86IG51bWJlcixcbiAgICBza3lSYWRpYWxQcm9ncmVzcz86IG51bWJlcixcbiAgICBpc1N1cHBvcnRlZFNjcmlwdD86IChfOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4gICAgYWNjdW11bGF0ZWQ/OiBWYWx1ZVxufT47XG5cbmV4cG9ydCBjbGFzcyBTdHlsZUV4cHJlc3Npb24ge1xuICAgIGV4cHJlc3Npb246IEV4cHJlc3Npb247XG5cbiAgICBfZXZhbHVhdG9yOiBFdmFsdWF0aW9uQ29udGV4dDtcbiAgICBfZGVmYXVsdFZhbHVlOiBWYWx1ZTtcbiAgICBfd2FybmluZ0hpc3Rvcnk6IHtba2V5OiBzdHJpbmddOiBib29sZWFufTtcbiAgICBfZW51bVZhbHVlczogP3tbXzogc3RyaW5nXTogYW55fTtcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IEV4cHJlc3Npb24sIHByb3BlcnR5U3BlYzogP1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMuX3dhcm5pbmdIaXN0b3J5ID0ge307XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvciA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dCgpO1xuICAgICAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBwcm9wZXJ0eVNwZWMgPyBnZXREZWZhdWx0VmFsdWUocHJvcGVydHlTcGVjKSA6IG51bGw7XG4gICAgICAgIHRoaXMuX2VudW1WYWx1ZXMgPSBwcm9wZXJ0eVNwZWMgJiYgcHJvcGVydHlTcGVjLnR5cGUgPT09ICdlbnVtJyA/IHByb3BlcnR5U3BlYy52YWx1ZXMgOiBudWxsO1xuICAgIH1cblxuICAgIGV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbiwgZmVhdHVyZVRpbGVDb29yZD86IFBvaW50LCBmZWF0dXJlRGlzdGFuY2VEYXRhPzogRmVhdHVyZURpc3RhbmNlRGF0YSk6IGFueSB7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5nbG9iYWxzID0gZ2xvYmFscztcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmUgPSBmZWF0dXJlO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZVN0YXRlID0gZmVhdHVyZVN0YXRlO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuY2Fub25pY2FsID0gY2Fub25pY2FsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuYXZhaWxhYmxlSW1hZ2VzID0gYXZhaWxhYmxlSW1hZ2VzIHx8IG51bGw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mb3JtYXR0ZWRTZWN0aW9uID0gZm9ybWF0dGVkU2VjdGlvbjtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVUaWxlQ29vcmQgPSBmZWF0dXJlVGlsZUNvb3JkIHx8IG51bGw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlRGlzdGFuY2VEYXRhID0gZmVhdHVyZURpc3RhbmNlRGF0YSB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uLCBmZWF0dXJlVGlsZUNvb3JkPzogUG9pbnQsIGZlYXR1cmVEaXN0YW5jZURhdGE/OiBGZWF0dXJlRGlzdGFuY2VEYXRhKTogYW55IHtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSBnbG9iYWxzO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGZlYXR1cmUgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVTdGF0ZSA9IGZlYXR1cmVTdGF0ZSB8fCBudWxsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuY2Fub25pY2FsID0gY2Fub25pY2FsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuYXZhaWxhYmxlSW1hZ2VzID0gYXZhaWxhYmxlSW1hZ2VzIHx8IG51bGw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mb3JtYXR0ZWRTZWN0aW9uID0gZm9ybWF0dGVkU2VjdGlvbiB8fCBudWxsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZVRpbGVDb29yZCA9IGZlYXR1cmVUaWxlQ29vcmQgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVEaXN0YW5jZURhdGEgPSBmZWF0dXJlRGlzdGFuY2VEYXRhIHx8IG51bGw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh0aGlzLl9ldmFsdWF0b3IpO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicgJiYgdmFsICE9PSB2YWwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9lbnVtVmFsdWVzICYmICEodmFsIGluIHRoaXMuX2VudW1WYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgdmFsdWUgdG8gYmUgb25lIG9mICR7T2JqZWN0LmtleXModGhpcy5fZW51bVZhbHVlcykubWFwKHYgPT4gSlNPTi5zdHJpbmdpZnkodikpLmpvaW4oJywgJyl9LCBidXQgZm91bmQgJHtKU09OLnN0cmluZ2lmeSh2YWwpfSBpbnN0ZWFkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl93YXJuaW5nSGlzdG9yeVtlLm1lc3NhZ2VdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2FybmluZ0hpc3RvcnlbZS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFeHByZXNzaW9uKGV4cHJlc3Npb246IG1peGVkKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZXhwcmVzc2lvbikgJiYgZXhwcmVzc2lvbi5sZW5ndGggPiAwICYmXG4gICAgICAgIHR5cGVvZiBleHByZXNzaW9uWzBdID09PSAnc3RyaW5nJyAmJiBleHByZXNzaW9uWzBdIGluIGRlZmluaXRpb25zO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuZCB0eXBlY2hlY2sgdGhlIGdpdmVuIHN0eWxlIHNwZWMgSlNPTiBleHByZXNzaW9uLiAgSWZcbiAqIG9wdGlvbnMuZGVmYXVsdFZhbHVlIGlzIHByb3ZpZGVkLCB0aGVuIHRoZSByZXN1bHRpbmcgU3R5bGVFeHByZXNzaW9uJ3NcbiAqIGBldmFsdWF0ZSgpYCBtZXRob2Qgd2lsbCBoYW5kbGUgZXJyb3JzIGJ5IGxvZ2dpbmcgYSB3YXJuaW5nIChvbmNlIHBlclxuICogbWVzc2FnZSkgYW5kIHJldHVybmluZyB0aGUgZGVmYXVsdCB2YWx1ZS4gIE90aGVyd2lzZSwgaXQgd2lsbCB0aHJvd1xuICogZXZhbHVhdGlvbiBlcnJvcnMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogbWl4ZWQsIHByb3BlcnR5U3BlYzogP1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKTogUmVzdWx0PFN0eWxlRXhwcmVzc2lvbiwgQXJyYXk8UGFyc2luZ0Vycm9yPj4ge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzaW5nQ29udGV4dChkZWZpbml0aW9ucywgW10sIHByb3BlcnR5U3BlYyA/IGdldEV4cGVjdGVkVHlwZShwcm9wZXJ0eVNwZWMpIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIEZvciBzdHJpbmctdmFsdWVkIHByb3BlcnRpZXMsIGNvZXJjZSB0byBzdHJpbmcgYXQgdGhlIHRvcCBsZXZlbCByYXRoZXIgdGhhbiBhc3NlcnRpbmcuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VyLnBhcnNlKGV4cHJlc3Npb24sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsXG4gICAgICAgIHByb3BlcnR5U3BlYyAmJiBwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ3N0cmluZycgPyB7dHlwZUFubm90YXRpb246ICdjb2VyY2UnfSA6IHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgICBhc3NlcnQocGFyc2VyLmVycm9ycy5sZW5ndGggPiAwKTtcbiAgICAgICAgcmV0dXJuIGVycm9yKHBhcnNlci5lcnJvcnMpO1xuICAgIH1cblxuICAgIHJldHVybiBzdWNjZXNzKG5ldyBTdHlsZUV4cHJlc3Npb24ocGFyc2VkLCBwcm9wZXJ0eVNwZWMpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFpvb21Db25zdGFudEV4cHJlc3Npb248S2luZDogRXZhbHVhdGlvbktpbmQ+IHtcbiAgICBraW5kOiBLaW5kO1xuICAgIGlzU3RhdGVEZXBlbmRlbnQ6IGJvb2xlYW47XG4gICAgX3N0eWxlRXhwcmVzc2lvbjogU3R5bGVFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3Ioa2luZDogS2luZCwgZXhwcmVzc2lvbjogU3R5bGVFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMua2luZCA9IGtpbmQ7XG4gICAgICAgIHRoaXMuX3N0eWxlRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMuaXNTdGF0ZURlcGVuZGVudCA9IGtpbmQgIT09ICgnY29uc3RhbnQnOiBFdmFsdWF0aW9uS2luZCkgJiYgIWlzQ29uc3RhbnQuaXNTdGF0ZUNvbnN0YW50KGV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gICAgfVxuXG4gICAgZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMsIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPiwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMsIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFpvb21EZXBlbmRlbnRFeHByZXNzaW9uPEtpbmQ6IEV2YWx1YXRpb25LaW5kPiB7XG4gICAga2luZDogS2luZDtcbiAgICB6b29tU3RvcHM6IEFycmF5PG51bWJlcj47XG4gICAgaXNTdGF0ZURlcGVuZGVudDogYm9vbGVhbjtcblxuICAgIF9zdHlsZUV4cHJlc3Npb246IFN0eWxlRXhwcmVzc2lvbjtcbiAgICBpbnRlcnBvbGF0aW9uVHlwZTogP0ludGVycG9sYXRpb25UeXBlO1xuXG4gICAgY29uc3RydWN0b3Ioa2luZDogS2luZCwgZXhwcmVzc2lvbjogU3R5bGVFeHByZXNzaW9uLCB6b29tU3RvcHM6IEFycmF5PG51bWJlcj4sIGludGVycG9sYXRpb25UeXBlPzogSW50ZXJwb2xhdGlvblR5cGUpIHtcbiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgdGhpcy56b29tU3RvcHMgPSB6b29tU3RvcHM7XG4gICAgICAgIHRoaXMuX3N0eWxlRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMuaXNTdGF0ZURlcGVuZGVudCA9IGtpbmQgIT09ICgnY2FtZXJhJzogRXZhbHVhdGlvbktpbmQpICYmICFpc0NvbnN0YW50LmlzU3RhdGVDb25zdGFudChleHByZXNzaW9uLmV4cHJlc3Npb24pO1xuICAgICAgICB0aGlzLmludGVycG9sYXRpb25UeXBlID0gaW50ZXJwb2xhdGlvblR5cGU7XG4gICAgfVxuXG4gICAgZXZhbHVhdGVXaXRob3V0RXJyb3JIYW5kbGluZyhnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlRXhwcmVzc2lvbi5ldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMsIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPiwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMsIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgIH1cblxuICAgIGludGVycG9sYXRpb25GYWN0b3IoaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLmludGVycG9sYXRpb25UeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvcih0aGlzLmludGVycG9sYXRpb25UeXBlLCBpbnB1dCwgbG93ZXIsIHVwcGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBDb25zdGFudEV4cHJlc3Npb24gPSB7XG4gICAga2luZDogJ2NvbnN0YW50JyxcbiAgICArZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pID0+IGFueSxcbn1cblxuZXhwb3J0IHR5cGUgU291cmNlRXhwcmVzc2lvbiA9IHtcbiAgICBraW5kOiAnc291cmNlJyxcbiAgICBpc1N0YXRlRGVwZW5kZW50OiBib29sZWFuLFxuICAgICtldmFsdWF0ZTogKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPiwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pID0+IGFueSxcbn07XG5cbmV4cG9ydCB0eXBlIENhbWVyYUV4cHJlc3Npb24gPSB7XG4gICAga2luZDogJ2NhbWVyYScsXG4gICAgK2V2YWx1YXRlOiAoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KSA9PiBhbnksXG4gICAgK2ludGVycG9sYXRpb25GYWN0b3I6IChpbnB1dDogbnVtYmVyLCBsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgem9vbVN0b3BzOiBBcnJheTxudW1iZXI+LFxuICAgIGludGVycG9sYXRpb25UeXBlOiA/SW50ZXJwb2xhdGlvblR5cGVcbn07XG5cbmV4cG9ydCB0eXBlIENvbXBvc2l0ZUV4cHJlc3Npb24gPSB7XG4gICAga2luZDogJ2NvbXBvc2l0ZScsXG4gICAgaXNTdGF0ZURlcGVuZGVudDogYm9vbGVhbixcbiAgICArZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKSA9PiBhbnksXG4gICAgK2ludGVycG9sYXRpb25GYWN0b3I6IChpbnB1dDogbnVtYmVyLCBsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgem9vbVN0b3BzOiBBcnJheTxudW1iZXI+LFxuICAgIGludGVycG9sYXRpb25UeXBlOiA/SW50ZXJwb2xhdGlvblR5cGVcbn07XG5cbmV4cG9ydCB0eXBlIFN0eWxlUHJvcGVydHlFeHByZXNzaW9uID1cbiAgICB8IENvbnN0YW50RXhwcmVzc2lvblxuICAgIHwgU291cmNlRXhwcmVzc2lvblxuICAgIHwgQ2FtZXJhRXhwcmVzc2lvblxuICAgIHwgQ29tcG9zaXRlRXhwcmVzc2lvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RXhwcmVzc2lvbihleHByZXNzaW9uOiBtaXhlZCwgcHJvcGVydHlTcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFJlc3VsdDxTdHlsZVByb3BlcnR5RXhwcmVzc2lvbiwgQXJyYXk8UGFyc2luZ0Vycm9yPj4ge1xuICAgIGV4cHJlc3Npb24gPSBjcmVhdGVFeHByZXNzaW9uKGV4cHJlc3Npb24sIHByb3BlcnR5U3BlYyk7XG4gICAgaWYgKGV4cHJlc3Npb24ucmVzdWx0ID09PSAnZXJyb3InKSB7XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IGV4cHJlc3Npb24udmFsdWUuZXhwcmVzc2lvbjtcblxuICAgIGNvbnN0IGlzRmVhdHVyZUNvbnN0YW50ID0gaXNDb25zdGFudC5pc0ZlYXR1cmVDb25zdGFudChwYXJzZWQpO1xuICAgIGlmICghaXNGZWF0dXJlQ29uc3RhbnQgJiYgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKHByb3BlcnR5U3BlYykpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKFtuZXcgUGFyc2luZ0Vycm9yKCcnLCAnZGF0YSBleHByZXNzaW9ucyBub3Qgc3VwcG9ydGVkJyldKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1pvb21Db25zdGFudCA9IGlzQ29uc3RhbnQuaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KHBhcnNlZCwgWyd6b29tJywgJ3BpdGNoJywgJ2Rpc3RhbmNlLWZyb20tY2VudGVyJ10pO1xuICAgIGlmICghaXNab29tQ29uc3RhbnQgJiYgIXN1cHBvcnRzWm9vbUV4cHJlc3Npb24ocHJvcGVydHlTcGVjKSkge1xuICAgICAgICByZXR1cm4gZXJyb3IoW25ldyBQYXJzaW5nRXJyb3IoJycsICd6b29tIGV4cHJlc3Npb25zIG5vdCBzdXBwb3J0ZWQnKV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHpvb21DdXJ2ZSA9IGZpbmRab29tQ3VydmUocGFyc2VkKTtcbiAgICBpZiAoIXpvb21DdXJ2ZSAmJiAhaXNab29tQ29uc3RhbnQpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKFtuZXcgUGFyc2luZ0Vycm9yKCcnLCAnXCJ6b29tXCIgZXhwcmVzc2lvbiBtYXkgb25seSBiZSB1c2VkIGFzIGlucHV0IHRvIGEgdG9wLWxldmVsIFwic3RlcFwiIG9yIFwiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9uLicpXSk7XG4gICAgfSBlbHNlIGlmICh6b29tQ3VydmUgaW5zdGFuY2VvZiBQYXJzaW5nRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yKFt6b29tQ3VydmVdKTtcbiAgICB9IGVsc2UgaWYgKHpvb21DdXJ2ZSBpbnN0YW5jZW9mIEludGVycG9sYXRlICYmICFzdXBwb3J0c0ludGVycG9sYXRpb24ocHJvcGVydHlTcGVjKSkge1xuICAgICAgICByZXR1cm4gZXJyb3IoW25ldyBQYXJzaW5nRXJyb3IoJycsICdcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbnMgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGlzIHByb3BlcnR5JyldKTtcbiAgICB9XG5cbiAgICBpZiAoIXpvb21DdXJ2ZSkge1xuICAgICAgICByZXR1cm4gc3VjY2Vzcyhpc0ZlYXR1cmVDb25zdGFudCA/XG4gICAgICAgICAgICAobmV3IFpvb21Db25zdGFudEV4cHJlc3Npb24oJ2NvbnN0YW50JywgZXhwcmVzc2lvbi52YWx1ZSk6IENvbnN0YW50RXhwcmVzc2lvbikgOlxuICAgICAgICAgICAgKG5ldyBab29tQ29uc3RhbnRFeHByZXNzaW9uKCdzb3VyY2UnLCBleHByZXNzaW9uLnZhbHVlKTogU291cmNlRXhwcmVzc2lvbikpO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVycG9sYXRpb25UeXBlID0gem9vbUN1cnZlIGluc3RhbmNlb2YgSW50ZXJwb2xhdGUgPyB6b29tQ3VydmUuaW50ZXJwb2xhdGlvbiA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiBzdWNjZXNzKGlzRmVhdHVyZUNvbnN0YW50ID9cbiAgICAgICAgKG5ldyBab29tRGVwZW5kZW50RXhwcmVzc2lvbignY2FtZXJhJywgZXhwcmVzc2lvbi52YWx1ZSwgem9vbUN1cnZlLmxhYmVscywgaW50ZXJwb2xhdGlvblR5cGUpOiBDYW1lcmFFeHByZXNzaW9uKSA6XG4gICAgICAgIChuZXcgWm9vbURlcGVuZGVudEV4cHJlc3Npb24oJ2NvbXBvc2l0ZScsIGV4cHJlc3Npb24udmFsdWUsIHpvb21DdXJ2ZS5sYWJlbHMsIGludGVycG9sYXRpb25UeXBlKTogQ29tcG9zaXRlRXhwcmVzc2lvbikpO1xufVxuXG5pbXBvcnQge2lzRnVuY3Rpb24sIGNyZWF0ZUZ1bmN0aW9ufSBmcm9tICcuLi9mdW5jdGlvbi9pbmRleC5qcyc7XG5pbXBvcnQge0NvbG9yfSBmcm9tICcuL3ZhbHVlcy5qcyc7XG5cbi8vIHNlcmlhbGl6YXRpb24gd3JhcHBlciBmb3Igb2xkLXN0eWxlIHN0b3AgZnVuY3Rpb25zIG5vcm1hbGl6ZWQgdG8gdGhlXG4vLyBleHByZXNzaW9uIGludGVyZmFjZVxuZXhwb3J0IGNsYXNzIFN0eWxlUHJvcGVydHlGdW5jdGlvbjxUPiB7XG4gICAgX3BhcmFtZXRlcnM6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+O1xuICAgIF9zcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcblxuICAgIGtpbmQ6IEV2YWx1YXRpb25LaW5kO1xuICAgIGV2YWx1YXRlOiAoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUpID0+IGFueTtcbiAgICBpbnRlcnBvbGF0aW9uRmFjdG9yOiA/KGlucHV0OiBudW1iZXIsIGxvd2VyOiBudW1iZXIsIHVwcGVyOiBudW1iZXIpID0+IG51bWJlcjtcbiAgICB6b29tU3RvcHM6ID9BcnJheTxudW1iZXI+O1xuXG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVyczogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD4sIHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICB0aGlzLl9zcGVjaWZpY2F0aW9uID0gc3BlY2lmaWNhdGlvbjtcbiAgICAgICAgZXh0ZW5kKHRoaXMsIGNyZWF0ZUZ1bmN0aW9uKHRoaXMuX3BhcmFtZXRlcnMsIHRoaXMuX3NwZWNpZmljYXRpb24pKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVzZXJpYWxpemUoc2VyaWFsaXplZDoge19wYXJhbWV0ZXJzOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPiwgX3NwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSkge1xuICAgICAgICByZXR1cm4gKChuZXcgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uKHNlcmlhbGl6ZWQuX3BhcmFtZXRlcnMsIHNlcmlhbGl6ZWQuX3NwZWNpZmljYXRpb24pKTogU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uPFQ+KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc2VyaWFsaXplKGlucHV0OiBTdHlsZVByb3BlcnR5RnVuY3Rpb248VD4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIF9wYXJhbWV0ZXJzOiBpbnB1dC5fcGFyYW1ldGVycyxcbiAgICAgICAgICAgIF9zcGVjaWZpY2F0aW9uOiBpbnB1dC5fc3BlY2lmaWNhdGlvblxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BlcnR5RXhwcmVzc2lvbjxUPih2YWx1ZTogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD4sIHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKTogU3R5bGVQcm9wZXJ0eUV4cHJlc3Npb24ge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gKG5ldyBTdHlsZVByb3BlcnR5RnVuY3Rpb24odmFsdWUsIHNwZWNpZmljYXRpb24pOiBhbnkpO1xuXG4gICAgfSBlbHNlIGlmIChpc0V4cHJlc3Npb24odmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24odmFsdWUsIHNwZWNpZmljYXRpb24pO1xuICAgICAgICBpZiAoZXhwcmVzc2lvbi5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGhhdmUgYmVlbiBjYXVnaHQgaW4gdmFsaWRhdGlvblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGV4cHJlc3Npb24udmFsdWUubWFwKGVyciA9PiBgJHtlcnIua2V5fTogJHtlcnIubWVzc2FnZX1gKS5qb2luKCcsICcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi52YWx1ZTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjb25zdGFudDogYW55ID0gdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHNwZWNpZmljYXRpb24udHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgY29uc3RhbnQgPSBDb2xvci5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6ICdjb25zdGFudCcsXG4gICAgICAgICAgICBldmFsdWF0ZTogKCkgPT4gY29uc3RhbnRcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbi8vIFpvb20tZGVwZW5kZW50IGV4cHJlc3Npb25zIG1heSBvbmx5IHVzZSBbXCJ6b29tXCJdIGFzIHRoZSBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCJcbi8vIGV4cHJlc3Npb24gKGNvbGxlY3RpdmVseSByZWZlcnJlZCB0byBhcyBhIFwiY3VydmVcIikuIFRoZSBjdXJ2ZSBtYXkgYmUgd3JhcHBlZCBpbiBvbmUgb3IgbW9yZSBcImxldFwiIG9yXG4vLyBcImNvYWxlc2NlXCIgZXhwcmVzc2lvbnMuXG5mdW5jdGlvbiBmaW5kWm9vbUN1cnZlKGV4cHJlc3Npb246IEV4cHJlc3Npb24pOiBTdGVwIHwgSW50ZXJwb2xhdGUgfCBQYXJzaW5nRXJyb3IgfCBudWxsIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIExldCkge1xuICAgICAgICByZXN1bHQgPSBmaW5kWm9vbUN1cnZlKGV4cHJlc3Npb24ucmVzdWx0KTtcblxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENvYWxlc2NlKSB7XG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGV4cHJlc3Npb24uYXJncykge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmluZFpvb21DdXJ2ZShhcmcpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKChleHByZXNzaW9uIGluc3RhbmNlb2YgU3RlcCB8fCBleHByZXNzaW9uIGluc3RhbmNlb2YgSW50ZXJwb2xhdGUpICYmXG4gICAgICAgIGV4cHJlc3Npb24uaW5wdXQgaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24gJiZcbiAgICAgICAgZXhwcmVzc2lvbi5pbnB1dC5uYW1lID09PSAnem9vbScpIHtcblxuICAgICAgICByZXN1bHQgPSBleHByZXNzaW9uO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQYXJzaW5nRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBleHByZXNzaW9uLmVhY2hDaGlsZCgoY2hpbGQpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGRSZXN1bHQgPSBmaW5kWm9vbUN1cnZlKGNoaWxkKTtcbiAgICAgICAgaWYgKGNoaWxkUmVzdWx0IGluc3RhbmNlb2YgUGFyc2luZ0Vycm9yKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBjaGlsZFJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmICghcmVzdWx0ICYmIGNoaWxkUmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBuZXcgUGFyc2luZ0Vycm9yKCcnLCAnXCJ6b29tXCIgZXhwcmVzc2lvbiBtYXkgb25seSBiZSB1c2VkIGFzIGlucHV0IHRvIGEgdG9wLWxldmVsIFwic3RlcFwiIG9yIFwiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9uLicpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCAmJiBjaGlsZFJlc3VsdCAmJiByZXN1bHQgIT09IGNoaWxkUmVzdWx0KSB7XG4gICAgICAgICAgICByZXN1bHQgPSBuZXcgUGFyc2luZ0Vycm9yKCcnLCAnT25seSBvbmUgem9vbS1iYXNlZCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgc3ViZXhwcmVzc2lvbiBtYXkgYmUgdXNlZCBpbiBhbiBleHByZXNzaW9uLicpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5pbXBvcnQge0NvbG9yVHlwZSwgU3RyaW5nVHlwZSwgTnVtYmVyVHlwZSwgQm9vbGVhblR5cGUsIFZhbHVlVHlwZSwgRm9ybWF0dGVkVHlwZSwgUmVzb2x2ZWRJbWFnZVR5cGUsIGFycmF5fSBmcm9tICcuL3R5cGVzLmpzJztcblxuZnVuY3Rpb24gZ2V0RXhwZWN0ZWRUeXBlKHNwZWM6IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKTogVHlwZSB7XG4gICAgY29uc3QgdHlwZXMgPSB7XG4gICAgICAgIGNvbG9yOiBDb2xvclR5cGUsXG4gICAgICAgIHN0cmluZzogU3RyaW5nVHlwZSxcbiAgICAgICAgbnVtYmVyOiBOdW1iZXJUeXBlLFxuICAgICAgICBlbnVtOiBTdHJpbmdUeXBlLFxuICAgICAgICBib29sZWFuOiBCb29sZWFuVHlwZSxcbiAgICAgICAgZm9ybWF0dGVkOiBGb3JtYXR0ZWRUeXBlLFxuICAgICAgICByZXNvbHZlZEltYWdlOiBSZXNvbHZlZEltYWdlVHlwZVxuICAgIH07XG5cbiAgICBpZiAoc3BlYy50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIHJldHVybiBhcnJheSh0eXBlc1tzcGVjLnZhbHVlXSB8fCBWYWx1ZVR5cGUsIHNwZWMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZXNbc3BlYy50eXBlXTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbHVlKHNwZWM6IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKTogVmFsdWUge1xuICAgIGlmIChzcGVjLnR5cGUgPT09ICdjb2xvcicgJiYgaXNGdW5jdGlvbihzcGVjLmRlZmF1bHQpKSB7XG4gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgaGVhdG1hcC1jb2xvcjogaXQgdXNlcyB0aGUgJ2RlZmF1bHQ6JyB0byBkZWZpbmUgYVxuICAgICAgICAvLyBkZWZhdWx0IGNvbG9yIHJhbXAsIGJ1dCBjcmVhdGVFeHByZXNzaW9uIGV4cGVjdHMgYSBzaW1wbGUgdmFsdWUgdG8gZmFsbFxuICAgICAgICAvLyBiYWNrIHRvIGluIGNhc2Ugb2YgcnVudGltZSBlcnJvcnNcbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvcigwLCAwLCAwLCAwKTtcbiAgICB9IGVsc2UgaWYgKHNwZWMudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICByZXR1cm4gQ29sb3IucGFyc2Uoc3BlYy5kZWZhdWx0KSB8fCBudWxsO1xuICAgIH0gZWxzZSBpZiAoc3BlYy5kZWZhdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNwZWMuZGVmYXVsdDtcbiAgICB9XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCB2YWxpZGF0ZVNwZWMgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBvYmplY3QgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGVsZW1lbnRTcGVjcyA9IG9wdGlvbnMudmFsdWVTcGVjIHx8IHt9O1xuICAgIGNvbnN0IGVsZW1lbnRWYWxpZGF0b3JzID0gb3B0aW9ucy5vYmplY3RFbGVtZW50VmFsaWRhdG9ycyB8fCB7fTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3QgdHlwZSA9IGdldFR5cGUob2JqZWN0KTtcbiAgICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgb2JqZWN0LCBgb2JqZWN0IGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2JqZWN0S2V5IGluIG9iamVjdCkge1xuICAgICAgICBjb25zdCBlbGVtZW50U3BlY0tleSA9IG9iamVjdEtleS5zcGxpdCgnLicpWzBdOyAvLyB0cmVhdCAncGFpbnQuKicgYXMgJ3BhaW50J1xuICAgICAgICBjb25zdCBlbGVtZW50U3BlYyA9IGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV0gfHwgZWxlbWVudFNwZWNzWycqJ107XG5cbiAgICAgICAgbGV0IHZhbGlkYXRlRWxlbWVudDtcbiAgICAgICAgaWYgKGVsZW1lbnRWYWxpZGF0b3JzW2VsZW1lbnRTcGVjS2V5XSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50ID0gZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV0pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IHZhbGlkYXRlU3BlYztcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50VmFsaWRhdG9yc1snKiddKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSBlbGVtZW50VmFsaWRhdG9yc1snKiddO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRTcGVjc1snKiddKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSB2YWxpZGF0ZVNwZWM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgb2JqZWN0W29iamVjdEtleV0sIGB1bmtub3duIHByb3BlcnR5IFwiJHtvYmplY3RLZXl9XCJgKSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVFbGVtZW50KHtcbiAgICAgICAgICAgIGtleTogKGtleSA/IGAke2tleX0uYCA6IGtleSkgKyBvYmplY3RLZXksXG4gICAgICAgICAgICB2YWx1ZTogb2JqZWN0W29iamVjdEtleV0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGVsZW1lbnRTcGVjLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3QsXG4gICAgICAgICAgICBvYmplY3RLZXlcbiAgICAgICAgfSwgb2JqZWN0KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50U3BlY0tleSBpbiBlbGVtZW50U3BlY3MpIHtcbiAgICAgICAgLy8gRG9uJ3QgY2hlY2sgYHJlcXVpcmVkYCB3aGVuIHRoZXJlJ3MgYSBjdXN0b20gdmFsaWRhdG9yIGZvciB0aGF0IHByb3BlcnR5LlxuICAgICAgICBpZiAoZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50U3BlY3NbZWxlbWVudFNwZWNLZXldLnJlcXVpcmVkICYmIGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV1bJ2RlZmF1bHQnXSA9PT0gdW5kZWZpbmVkICYmIG9iamVjdFtlbGVtZW50U3BlY0tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIG9iamVjdCwgYG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCIke2VsZW1lbnRTcGVjS2V5fVwiYCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIlxuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUFycmF5KG9wdGlvbnMpIHtcbiAgICBjb25zdCBhcnJheSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgYXJyYXlTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbGlkYXRlQXJyYXlFbGVtZW50ID0gb3B0aW9ucy5hcnJheUVsZW1lbnRWYWxpZGF0b3IgfHwgdmFsaWRhdGU7XG5cbiAgICBpZiAoZ2V0VHlwZShhcnJheSkgIT09ICdhcnJheScpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksIGBhcnJheSBleHBlY3RlZCwgJHtnZXRUeXBlKGFycmF5KX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgaWYgKGFycmF5U3BlYy5sZW5ndGggJiYgYXJyYXkubGVuZ3RoICE9PSBhcnJheVNwZWMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGFycmF5LCBgYXJyYXkgbGVuZ3RoICR7YXJyYXlTcGVjLmxlbmd0aH0gZXhwZWN0ZWQsIGxlbmd0aCAke2FycmF5Lmxlbmd0aH0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgaWYgKGFycmF5U3BlY1snbWluLWxlbmd0aCddICYmIGFycmF5Lmxlbmd0aCA8IGFycmF5U3BlY1snbWluLWxlbmd0aCddKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGFycmF5LCBgYXJyYXkgbGVuZ3RoIGF0IGxlYXN0ICR7YXJyYXlTcGVjWydtaW4tbGVuZ3RoJ119IGV4cGVjdGVkLCBsZW5ndGggJHthcnJheS5sZW5ndGh9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIGxldCBhcnJheUVsZW1lbnRTcGVjID0ge1xuICAgICAgICBcInR5cGVcIjogYXJyYXlTcGVjLnZhbHVlLFxuICAgICAgICBcInZhbHVlc1wiOiBhcnJheVNwZWMudmFsdWVzLFxuICAgICAgICBcIm1pbmltdW1cIjogYXJyYXlTcGVjLm1pbmltdW0sXG4gICAgICAgIFwibWF4aW11bVwiOiBhcnJheVNwZWMubWF4aW11bVxuICAgIH07XG5cbiAgICBpZiAoc3R5bGVTcGVjLiR2ZXJzaW9uIDwgNykge1xuICAgICAgICBhcnJheUVsZW1lbnRTcGVjLmZ1bmN0aW9uID0gYXJyYXlTcGVjLmZ1bmN0aW9uO1xuICAgIH1cblxuICAgIGlmIChnZXRUeXBlKGFycmF5U3BlYy52YWx1ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGFycmF5RWxlbWVudFNwZWMgPSBhcnJheVNwZWMudmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5RWxlbWVudCh7XG4gICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgIGFycmF5SW5kZXg6IGksXG4gICAgICAgICAgICB2YWx1ZTogYXJyYXlbaV0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGFycmF5RWxlbWVudFNwZWMsXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIGtleTogYCR7a2V5fVske2l9XWBcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyKG9wdGlvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3QgdmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgbGV0IHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgIHR5cGUgPSAnTmFOJztcbiAgICB9XG5cbiAgICBpZiAodHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBudW1iZXIgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgaWYgKCdtaW5pbXVtJyBpbiB2YWx1ZVNwZWMpIHtcbiAgICAgICAgbGV0IHNwZWNNaW4gPSB2YWx1ZVNwZWMubWluaW11bTtcbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWVTcGVjLm1pbmltdW0pID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICBjb25zdCBpID0gb3B0aW9ucy5hcnJheUluZGV4O1xuICAgICAgICAgICAgc3BlY01pbiA9IHZhbHVlU3BlYy5taW5pbXVtW2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA8IHNwZWNNaW4pIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgJHt2YWx1ZX0gaXMgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlICR7c3BlY01pbn1gKV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoJ21heGltdW0nIGluIHZhbHVlU3BlYykge1xuICAgICAgICBsZXQgc3BlY01heCA9IHZhbHVlU3BlYy5tYXhpbXVtO1xuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZVNwZWMubWF4aW11bSkgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBvcHRpb25zLmFycmF5SW5kZXg7XG4gICAgICAgICAgICBzcGVjTWF4ID0gdmFsdWVTcGVjLm1heGltdW1baV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID4gc3BlY01heCkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGAke3ZhbHVlfSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgJHtzcGVjTWF4fWApXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IHZhbGlkYXRlT2JqZWN0IGZyb20gJy4vdmFsaWRhdGVfb2JqZWN0LmpzJztcbmltcG9ydCB2YWxpZGF0ZUFycmF5IGZyb20gJy4vdmFsaWRhdGVfYXJyYXkuanMnO1xuaW1wb3J0IHZhbGlkYXRlTnVtYmVyIGZyb20gJy4vdmFsaWRhdGVfbnVtYmVyLmpzJztcbmltcG9ydCB7aXNFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQge1xuICAgIHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uLFxuICAgIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sXG4gICAgc3VwcG9ydHNJbnRlcnBvbGF0aW9uXG59IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbnN0IGZ1bmN0aW9uVmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgY29uc3QgZnVuY3Rpb25UeXBlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZS50eXBlKTtcbiAgICBsZXQgc3RvcEtleVR5cGU7XG4gICAgbGV0IHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICBsZXQgcHJldmlvdXNTdG9wRG9tYWluVmFsdWU7XG4gICAgbGV0IHByZXZpb3VzU3RvcERvbWFpblpvb207XG5cbiAgICBjb25zdCBpc1pvb21GdW5jdGlvbiA9IGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNQcm9wZXJ0eUZ1bmN0aW9uID0gIWlzWm9vbUZ1bmN0aW9uO1xuICAgIGNvbnN0IGlzWm9vbUFuZFByb3BlcnR5RnVuY3Rpb24gPVxuICAgICAgICBnZXRUeXBlKG9wdGlvbnMudmFsdWUuc3RvcHMpID09PSAnYXJyYXknICYmXG4gICAgICAgIGdldFR5cGUob3B0aW9ucy52YWx1ZS5zdG9wc1swXSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgZ2V0VHlwZShvcHRpb25zLnZhbHVlLnN0b3BzWzBdWzBdKSA9PT0gJ29iamVjdCc7XG5cbiAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgICAgICB2YWx1ZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLmZ1bmN0aW9uLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgIHN0b3BzOiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICBkZWZhdWx0OiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnaWRlbnRpdHknICYmIGlzWm9vbUZ1bmN0aW9uKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwicHJvcGVydHlcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlICE9PSAnaWRlbnRpdHknICYmICFvcHRpb25zLnZhbHVlLnN0b3BzKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic3RvcHNcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnZXhwb25lbnRpYWwnICYmIG9wdGlvbnMudmFsdWVTcGVjLmV4cHJlc3Npb24gJiYgIXN1cHBvcnRzSW50ZXJwb2xhdGlvbihvcHRpb25zLnZhbHVlU3BlYykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ2V4cG9uZW50aWFsIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0eWxlU3BlYy4kdmVyc2lvbiA+PSA4KSB7XG4gICAgICAgIGlmIChpc1Byb3BlcnR5RnVuY3Rpb24gJiYgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3Byb3BlcnR5IGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzWm9vbUZ1bmN0aW9uICYmICFzdXBwb3J0c1pvb21FeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3pvb20gZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZ1bmN0aW9uVHlwZSA9PT0gJ2NhdGVnb3JpY2FsJyB8fCBpc1pvb21BbmRQcm9wZXJ0eUZ1bmN0aW9uKSAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wicHJvcGVydHlcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3BzKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSA9PT0gJ2lkZW50aXR5Jykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnaWRlbnRpdHkgZnVuY3Rpb24gbWF5IG5vdCBoYXZlIGEgXCJzdG9wc1wiIHByb3BlcnR5JyldO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGVycm9ycyA9IFtdO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG5cbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5KHtcbiAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogb3B0aW9ucy52YWx1ZVNwZWMsXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICBhcnJheUVsZW1lbnRWYWxpZGF0b3I6IHZhbGlkYXRlRnVuY3Rpb25TdG9wXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgPT09ICdhcnJheScgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCB2YWx1ZSwgJ2FycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc3RvcCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3Aob3B0aW9ucykge1xuICAgICAgICBsZXQgZXJyb3JzID0gW107XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICAgICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWUpICE9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWUpfSBmb3VuZGApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYXJyYXkgbGVuZ3RoIDIgZXhwZWN0ZWQsIGxlbmd0aCAke3ZhbHVlLmxlbmd0aH0gZm91bmRgKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNab29tQW5kUHJvcGVydHlGdW5jdGlvbikge1xuICAgICAgICAgICAgaWYgKGdldFR5cGUodmFsdWVbMF0pICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgb2JqZWN0IGV4cGVjdGVkLCAke2dldFR5cGUodmFsdWVbMF0pfSBmb3VuZGApXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS56b29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ29iamVjdCBzdG9wIGtleSBtdXN0IGhhdmUgem9vbScpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZVswXS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHZhbHVlJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RvcERvbWFpblpvb20gJiYgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA+IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWVbMF0uem9vbSwgJ3N0b3Agem9vbSB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pICE9PSBwcmV2aW91c1N0b3BEb21haW5ab29tKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluWm9vbSA9IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU3RvcERvbWFpblZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzoge3pvb206IHt9fSxcbiAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7em9vbTogdmFsaWRhdGVOdW1iZXIsIHZhbHVlOiB2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZX1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVTdG9wRG9tYWluVmFsdWUoe1xuICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzoge30sXG4gICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICAgICAgfSwgdmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4cHJlc3Npb24oZGVlcFVuYnVuZGxlKHZhbHVlWzFdKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bMV1gLCB2YWx1ZVsxXSwgJ2V4cHJlc3Npb25zIGFyZSBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiBzdG9wcy4nKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAga2V5OiBgJHtrZXl9WzFdYCxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVsxXSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogZnVuY3Rpb25WYWx1ZVNwZWMsXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlU3RvcERvbWFpblZhbHVlKG9wdGlvbnMsIHN0b3ApIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldFR5cGUob3B0aW9ucy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZSk7XG5cbiAgICAgICAgY29uc3QgcmVwb3J0VmFsdWUgPSBvcHRpb25zLnZhbHVlICE9PSBudWxsID8gb3B0aW9ucy52YWx1ZSA6IHN0b3A7XG5cbiAgICAgICAgaWYgKCFzdG9wS2V5VHlwZSkge1xuICAgICAgICAgICAgc3RvcEtleVR5cGUgPSB0eXBlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHN0b3BLZXlUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCBgJHt0eXBlfSBzdG9wIGRvbWFpbiB0eXBlIG11c3QgbWF0Y2ggcHJldmlvdXMgc3RvcCBkb21haW4gdHlwZSAke3N0b3BLZXlUeXBlfWApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlICE9PSAnbnVtYmVyJyAmJiB0eXBlICE9PSAnc3RyaW5nJyAmJiB0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyLCBzdHJpbmcsIG9yIGJvb2xlYW4nKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZSAhPT0gJ251bWJlcicgJiYgZnVuY3Rpb25UeXBlICE9PSAnY2F0ZWdvcmljYWwnKSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBudW1iZXIgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgO1xuICAgICAgICAgICAgaWYgKHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKGZ1bmN0aW9uVmFsdWVTcGVjKSAmJiBmdW5jdGlvblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJ1xcbklmIHlvdSBpbnRlbmRlZCB0byB1c2UgYSBjYXRlZ29yaWNhbCBmdW5jdGlvbiwgc3BlY2lmeSBgXCJ0eXBlXCI6IFwiY2F0ZWdvcmljYWxcImAuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsIG1lc3NhZ2UpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgJiYgdHlwZSA9PT0gJ251bWJlcicgJiYgKCFpc0Zpbml0ZSh2YWx1ZSkgfHwgTWF0aC5mbG9vcih2YWx1ZSkgIT09IHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgYGludGVnZXIgZXhwZWN0ZWQsIGZvdW5kICR7dmFsdWV9YCldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiB0eXBlID09PSAnbnVtYmVyJyAmJiBwcmV2aW91c1N0b3BEb21haW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgJiYgdmFsdWUgaW4gc3RvcERvbWFpblZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgJ3N0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZScpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0b3BEb21haW5WYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh7XG4gICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGZ1bmN0aW9uVmFsdWVTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbiwgY3JlYXRlUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB7ZGVlcFVuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcbmltcG9ydCB7aXNTdGF0ZUNvbnN0YW50LCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzRmVhdHVyZUNvbnN0YW50fSBmcm9tICcuLi9leHByZXNzaW9uL2lzX2NvbnN0YW50LmpzJztcbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi4vZXhwcmVzc2lvbi9jb21wb3VuZF9leHByZXNzaW9uLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRXhwcmVzc2lvbihvcHRpb25zOiBhbnkpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdwcm9wZXJ0eScgPyBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24gOiBjcmVhdGVFeHByZXNzaW9uKShkZWVwVW5idW5kbGUob3B0aW9ucy52YWx1ZSksIG9wdGlvbnMudmFsdWVTcGVjKTtcbiAgICBpZiAoZXhwcmVzc2lvbi5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udmFsdWUubWFwKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7b3B0aW9ucy5rZXl9JHtlcnJvci5rZXl9YCwgb3B0aW9ucy52YWx1ZSwgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb25PYmogPSAoZXhwcmVzc2lvbi52YWx1ZTogYW55KS5leHByZXNzaW9uIHx8IChleHByZXNzaW9uLnZhbHVlOiBhbnkpLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbjtcblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAncHJvcGVydHknICYmIChvcHRpb25zLnByb3BlcnR5S2V5ID09PSAndGV4dC1mb250JykgJiZcbiAgICAgICAgIWV4cHJlc3Npb25PYmoub3V0cHV0RGVmaW5lZCgpKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgYEludmFsaWQgZGF0YSBleHByZXNzaW9uIGZvciBcIiR7b3B0aW9ucy5wcm9wZXJ0eUtleX1cIi4gT3V0cHV0IHZhbHVlcyBtdXN0IGJlIGNvbnRhaW5lZCBhcyBsaXRlcmFscyB3aXRoaW4gdGhlIGV4cHJlc3Npb24uYCldO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAncHJvcGVydHknICYmIG9wdGlvbnMucHJvcGVydHlUeXBlID09PSAnbGF5b3V0JyAmJlxuICAgICAgICAoIWlzU3RhdGVDb25zdGFudChleHByZXNzaW9uT2JqKSkpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnXCJmZWF0dXJlLXN0YXRlXCIgZGF0YSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGxheW91dCBwcm9wZXJ0aWVzLicpXTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgcmV0dXJuIGRpc2FsbG93ZWRGaWx0ZXJQYXJhbWV0ZXJzKGV4cHJlc3Npb25PYmosIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ICYmIG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQuaW5kZXhPZignY2x1c3RlcicpID09PSAwKSB7XG4gICAgICAgIGlmICghaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGV4cHJlc3Npb25PYmosIFsnem9vbScsICdmZWF0dXJlLXN0YXRlJ10pKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdcInpvb21cIiBhbmQgXCJmZWF0dXJlLXN0YXRlXCIgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBjbHVzdGVyIHByb3BlcnRpZXMuJyldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAnY2x1c3Rlci1pbml0aWFsJyAmJiAhaXNGZWF0dXJlQ29uc3RhbnQoZXhwcmVzc2lvbk9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ0ZlYXR1cmUgZGF0YSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGluaXRpYWwgZXhwcmVzc2lvbiBwYXJ0IG9mIGNsdXN0ZXIgcHJvcGVydGllcy4nKV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNhbGxvd2VkRmlsdGVyUGFyYW1ldGVycyhlOiBFeHByZXNzaW9uLCBvcHRpb25zOiBhbnkpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBkaXNhbGxvd2VkUGFyYW1ldGVycyA9IG5ldyBTZXQoW1xuICAgICAgICAnem9vbScsXG4gICAgICAgICdmZWF0dXJlLXN0YXRlJyxcbiAgICAgICAgJ3BpdGNoJyxcbiAgICAgICAgJ2Rpc3RhbmNlLWZyb20tY2VudGVyJ1xuICAgIF0pO1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2Ygb3B0aW9ucy52YWx1ZVNwZWMuZXhwcmVzc2lvbi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGRpc2FsbG93ZWRQYXJhbWV0ZXJzLmRlbGV0ZShwYXJhbSk7XG4gICAgfVxuXG4gICAgaWYgKGRpc2FsbG93ZWRQYXJhbWV0ZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uKSB7XG4gICAgICAgIGlmIChkaXNhbGxvd2VkUGFyYW1ldGVycy5oYXMoZS5uYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCBgW1wiJHtlLm5hbWV9XCJdIGV4cHJlc3Npb24gaXMgbm90IHN1cHBvcnRlZCBpbiBhIGZpbHRlciBmb3IgYSAke29wdGlvbnMub2JqZWN0LnR5cGV9IGxheWVyIHdpdGggaWQ6ICR7b3B0aW9ucy5vYmplY3QuaWR9YCldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGUuZWFjaENoaWxkKChhcmcpID0+IHtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4uZGlzYWxsb3dlZEZpbHRlclBhcmFtZXRlcnMoYXJnLCBvcHRpb25zKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQm9vbGVhbihvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIGlmICh0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBib29sZWFuIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IHtwYXJzZUNTU0NvbG9yfSBmcm9tICdjc3Njb2xvcnBhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQ29sb3Iob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VDU1NDb2xvcih2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgXCIke3ZhbHVlfVwiIGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIlxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCB7dW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUVudW0ob3B0aW9ucykge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlU3BlYy52YWx1ZXMpKSB7IC8vIDw9djdcbiAgICAgICAgaWYgKHZhbHVlU3BlYy52YWx1ZXMuaW5kZXhPZih1bmJ1bmRsZSh2YWx1ZSkpID09PSAtMSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZXhwZWN0ZWQgb25lIG9mIFske3ZhbHVlU3BlYy52YWx1ZXMuam9pbignLCAnKX1dLCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA+PXY4XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZVNwZWMudmFsdWVzKS5pbmRleE9mKHVuYnVuZGxlKHZhbHVlKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBleHBlY3RlZCBvbmUgb2YgWyR7T2JqZWN0LmtleXModmFsdWVTcGVjLnZhbHVlcykuam9pbignLCAnKX1dLCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQge2lzRmVhdHVyZUNvbnN0YW50fSBmcm9tICcuLi9leHByZXNzaW9uL2lzX2NvbnN0YW50LmpzJztcbmltcG9ydCB7ZGVlcFVuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcbmltcG9ydCBsYXRlc3QgZnJvbSAnLi4vcmVmZXJlbmNlL2xhdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7R2xvYmFsUHJvcGVydGllcywgRmVhdHVyZX0gZnJvbSAnLi4vZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuZXhwb3J0IHR5cGUgRmVhdHVyZURpc3RhbmNlRGF0YSA9IHtiZWFyaW5nOiBbbnVtYmVyLCBudW1iZXJdLCBjZW50ZXI6IFtudW1iZXIsIG51bWJlcl0sIHNjYWxlOiBudW1iZXJ9O1xudHlwZSBGaWx0ZXJFeHByZXNzaW9uID0gKGdsb2JhbFByb3BlcnRpZXM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU6IEZlYXR1cmUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgZmVhdHVyZVRpbGVDb29yZD86IFBvaW50LCBmZWF0dXJlRGlzdGFuY2VEYXRhPzogRmVhdHVyZURpc3RhbmNlRGF0YSkgPT4gYm9vbGVhbjtcbmV4cG9ydCB0eXBlIEZlYXR1cmVGaWx0ZXIgPSB7ZmlsdGVyOiBGaWx0ZXJFeHByZXNzaW9uLCBkeW5hbWljRmlsdGVyPzogRmlsdGVyRXhwcmVzc2lvbiwgbmVlZEdlb21ldHJ5OiBib29sZWFuLCBuZWVkRmVhdHVyZTogYm9vbGVhbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUZpbHRlcjtcbmV4cG9ydCB7aXNFeHByZXNzaW9uRmlsdGVyLCBpc0R5bmFtaWNGaWx0ZXIsIGV4dHJhY3RTdGF0aWNGaWx0ZXJ9O1xuXG5mdW5jdGlvbiBpc0V4cHJlc3Npb25GaWx0ZXIoZmlsdGVyOiBhbnkpIHtcbiAgICBpZiAoZmlsdGVyID09PSB0cnVlIHx8IGZpbHRlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcikgfHwgZmlsdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN3aXRjaCAoZmlsdGVyWzBdKSB7XG4gICAgY2FzZSAnaGFzJzpcbiAgICAgICAgcmV0dXJuIGZpbHRlci5sZW5ndGggPj0gMiAmJiBmaWx0ZXJbMV0gIT09ICckaWQnICYmIGZpbHRlclsxXSAhPT0gJyR0eXBlJztcblxuICAgIGNhc2UgJ2luJzpcbiAgICAgICAgcmV0dXJuIGZpbHRlci5sZW5ndGggPj0gMyAmJiAodHlwZW9mIGZpbHRlclsxXSAhPT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheShmaWx0ZXJbMl0pKTtcblxuICAgIGNhc2UgJyFpbic6XG4gICAgY2FzZSAnIWhhcyc6XG4gICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNhc2UgJz09JzpcbiAgICBjYXNlICchPSc6XG4gICAgY2FzZSAnPic6XG4gICAgY2FzZSAnPj0nOlxuICAgIGNhc2UgJzwnOlxuICAgIGNhc2UgJzw9JzpcbiAgICAgICAgcmV0dXJuIGZpbHRlci5sZW5ndGggIT09IDMgfHwgKEFycmF5LmlzQXJyYXkoZmlsdGVyWzFdKSB8fCBBcnJheS5pc0FycmF5KGZpbHRlclsyXSkpO1xuXG4gICAgY2FzZSAnYW55JzpcbiAgICBjYXNlICdhbGwnOlxuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmlsdGVyLnNsaWNlKDEpKSB7XG4gICAgICAgICAgICBpZiAoIWlzRXhwcmVzc2lvbkZpbHRlcihmKSAmJiB0eXBlb2YgZiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGEgZmlsdGVyIGV4cHJlc3NlZCBhcyBuZXN0ZWQgYXJyYXlzLCByZXR1cm4gYSBuZXcgZnVuY3Rpb25cbiAqIHRoYXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlICh3aXRoIGEgLnByb3BlcnRpZXMgb3IgLnRhZ3MgcHJvcGVydHkpXG4gKiBwYXNzZXMgaXRzIHRlc3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlciBtYXBib3ggZ2wgZmlsdGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJUeXBlIHRoZSB0eXBlIG9mIHRoZSBsYXllciB0aGlzIGZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdG8uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGZpbHRlci1ldmFsdWF0aW5nIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlcihmaWx0ZXI6IGFueSwgbGF5ZXJUeXBlPzogc3RyaW5nID0gJ2ZpbGwnKTogRmVhdHVyZUZpbHRlciB7XG4gICAgaWYgKGZpbHRlciA9PT0gbnVsbCB8fCBmaWx0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge2ZpbHRlcjogKCkgPT4gdHJ1ZSwgbmVlZEdlb21ldHJ5OiBmYWxzZSwgbmVlZEZlYXR1cmU6IGZhbHNlfTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRXhwcmVzc2lvbkZpbHRlcihmaWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IGNvbnZlcnRGaWx0ZXIoZmlsdGVyKTtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyRXhwID0gKChmaWx0ZXI6IGFueSk6IHN0cmluZ1tdIHwgc3RyaW5nIHwgYm9vbGVhbik7XG5cbiAgICBsZXQgc3RhdGljRmlsdGVyID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgICBzdGF0aWNGaWx0ZXIgPSBleHRyYWN0U3RhdGljRmlsdGVyKGZpbHRlckV4cCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG5gRmFpbGVkIHRvIGV4dHJhY3Qgc3RhdGljIGZpbHRlci4gRmlsdGVyIHdpbGwgY29udGludWUgd29ya2luZywgYnV0IGF0IGhpZ2hlciBtZW1vcnkgdXNhZ2UgYW5kIHNsb3dlciBmcmFtZXJhdGUuXG5UaGlzIGlzIG1vc3QgbGlrZWx5IGEgYnVnLCBwbGVhc2UgcmVwb3J0IHRoaXMgdmlhIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy9uZXc/YXNzaWduZWVzPSZsYWJlbHM9JnRlbXBsYXRlPUJ1Z19yZXBvcnQubWRcbmFuZCBwYXN0ZSB0aGUgY29udGVudHMgb2YgdGhpcyBtZXNzYWdlIGluIHRoZSByZXBvcnQuXG5UaGFuayB5b3UhXG5GaWx0ZXIgRXhwcmVzc2lvbjpcbiR7SlNPTi5zdHJpbmdpZnkoZmlsdGVyRXhwLCBudWxsLCAyKX1cbiAgICAgICAgYCk7XG4gICAgfVxuXG4gICAgLy8gQ29tcGlsZSB0aGUgc3RhdGljIGNvbXBvbmVudCBvZiB0aGUgZmlsdGVyXG4gICAgY29uc3QgZmlsdGVyU3BlYyA9IGxhdGVzdFtgZmlsdGVyXyR7bGF5ZXJUeXBlfWBdO1xuICAgIGNvbnN0IGNvbXBpbGVkU3RhdGljRmlsdGVyID0gY3JlYXRlRXhwcmVzc2lvbihzdGF0aWNGaWx0ZXIsIGZpbHRlclNwZWMpO1xuXG4gICAgbGV0IGZpbHRlckZ1bmMgPSBudWxsO1xuICAgIGlmIChjb21waWxlZFN0YXRpY0ZpbHRlci5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBpbGVkU3RhdGljRmlsdGVyLnZhbHVlLm1hcChlcnIgPT4gYCR7ZXJyLmtleX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbignLCAnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmlsdGVyRnVuYyA9IChnbG9iYWxQcm9wZXJ0aWVzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlOiBGZWF0dXJlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQpID0+IGNvbXBpbGVkU3RhdGljRmlsdGVyLnZhbHVlLmV2YWx1YXRlKGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzdGF0aWMgY29tcG9uZW50IGlzIG5vdCBlcXVhbCB0byB0aGUgZW50aXJlIGZpbHRlciB0aGVuIHdlIGhhdmUgYSBkeW5hbWljIGNvbXBvbmVudFxuICAgIC8vIENvbXBpbGUgdGhlIGR5bmFtaWMgY29tcG9uZW50IHNlcGFyYXRlbHlcbiAgICBsZXQgZHluYW1pY0ZpbHRlckZ1bmMgPSBudWxsO1xuICAgIGxldCBuZWVkRmVhdHVyZSA9IG51bGw7XG4gICAgaWYgKHN0YXRpY0ZpbHRlciAhPT0gZmlsdGVyRXhwKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkRHluYW1pY0ZpbHRlciA9IGNyZWF0ZUV4cHJlc3Npb24oZmlsdGVyRXhwLCBmaWx0ZXJTcGVjKTtcblxuICAgICAgICBpZiAoY29tcGlsZWREeW5hbWljRmlsdGVyLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBpbGVkRHluYW1pY0ZpbHRlci52YWx1ZS5tYXAoZXJyID0+IGAke2Vyci5rZXl9OiAke2Vyci5tZXNzYWdlfWApLmpvaW4oJywgJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHluYW1pY0ZpbHRlckZ1bmMgPSAoZ2xvYmFsUHJvcGVydGllczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZTogRmVhdHVyZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBmZWF0dXJlVGlsZUNvb3JkPzogUG9pbnQsIGZlYXR1cmVEaXN0YW5jZURhdGE/OiBGZWF0dXJlRGlzdGFuY2VEYXRhKSA9PiBjb21waWxlZER5bmFtaWNGaWx0ZXIudmFsdWUuZXZhbHVhdGUoZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZSwge30sIGNhbm9uaWNhbCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZlYXR1cmVUaWxlQ29vcmQsIGZlYXR1cmVEaXN0YW5jZURhdGEpO1xuICAgICAgICAgICAgbmVlZEZlYXR1cmUgPSAhaXNGZWF0dXJlQ29uc3RhbnQoY29tcGlsZWREeW5hbWljRmlsdGVyLnZhbHVlLmV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZmlsdGVyRnVuYyA9ICgoZmlsdGVyRnVuYzogYW55KTogRmlsdGVyRXhwcmVzc2lvbik7XG4gICAgY29uc3QgbmVlZEdlb21ldHJ5ID0gZ2VvbWV0cnlOZWVkZWQoc3RhdGljRmlsdGVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGZpbHRlcjogZmlsdGVyRnVuYyxcbiAgICAgICAgZHluYW1pY0ZpbHRlcjogZHluYW1pY0ZpbHRlckZ1bmMgPyBkeW5hbWljRmlsdGVyRnVuYyA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmVlZEdlb21ldHJ5LFxuICAgICAgICBuZWVkRmVhdHVyZTogISFuZWVkRmVhdHVyZVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGF0aWNGaWx0ZXIoZmlsdGVyOiBhbnkpOiBhbnkge1xuICAgIGlmICghaXNEeW5hbWljRmlsdGVyKGZpbHRlcikpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9XG5cbiAgICAvLyBTaGFsbG93IGNvcHkgc28gd2UgY2FuIHJlcGxhY2UgZXhwcmVzc2lvbnMgaW4tcGxhY2VcbiAgICBsZXQgcmVzdWx0ID0gZGVlcFVuYnVuZGxlKGZpbHRlcik7XG5cbiAgICAvLyAxLiBVbmlvbiBicmFuY2hlc1xuICAgIHVuaW9uRHluYW1pY0JyYW5jaGVzKHJlc3VsdCk7XG5cbiAgICAvLyAyLiBDb2xsYXBzZSBkeW5hbWljIGNvbmRpdGlvbnMgdG8gIGB0cnVlYFxuICAgIHJlc3VsdCA9IGNvbGxhcHNlRHluYW1pY0Jvb2xlYW5FeHByZXNzaW9ucyhyZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29sbGFwc2VEeW5hbWljQm9vbGVhbkV4cHJlc3Npb25zKGV4cHJlc3Npb246IGFueSk6IGFueSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24pKSB7XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbGxhcHNlZCA9IGNvbGxhcHNlZEV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgaWYgKGNvbGxhcHNlZCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gY29sbGFwc2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb2xsYXBzZWQubWFwKChzdWJFeHByZXNzaW9uKSA9PiBjb2xsYXBzZUR5bmFtaWNCb29sZWFuRXhwcmVzc2lvbnMoc3ViRXhwcmVzc2lvbikpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXMgdGhlIGV4cHJlc3Npb24gYW5kIHJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgYnJhbmNoaW5nIG9uIGFcbiAqIGBkeW5hbWljYCBjb25kaXRpb25hbCAoc3VjaCBhcyBgWydwaXRjaCddYCBvciBgWydkaXN0YW5jZS1mcm9tLWNlbnRlciddYClcbiAqIGludG8gYW4gYGFueWAgZXhwcmVzc2lvbi5cbiAqIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCBwb3NzaWJsZSBvdXRjb21lcyBvZiBhIGBkeW5hbWljYCBicmFuY2ggYXJlIGNvbnNpZGVyZWRcbiAqIHdoZW4gZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiB1cGZyb250IGR1cmluZyBmaWx0ZXJpbmcuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBmaWx0ZXIgdGhlIGZpbHRlciBleHByZXNzaW9uIG11dGF0ZWQgaW4tcGxhY2UuXG4gKi9cbmZ1bmN0aW9uIHVuaW9uRHluYW1pY0JyYW5jaGVzKGZpbHRlcjogYW55KSB7XG4gICAgbGV0IGlzQnJhbmNoaW5nRHluYW1pY2FsbHkgPSBmYWxzZTtcbiAgICBjb25zdCBicmFuY2hlcyA9IFtdO1xuXG4gICAgaWYgKGZpbHRlclswXSA9PT0gJ2Nhc2UnKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlsdGVyLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgaXNCcmFuY2hpbmdEeW5hbWljYWxseSA9IGlzQnJhbmNoaW5nRHluYW1pY2FsbHkgfHwgaXNEeW5hbWljRmlsdGVyKGZpbHRlcltpXSk7XG4gICAgICAgICAgICBicmFuY2hlcy5wdXNoKGZpbHRlcltpICsgMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJhbmNoZXMucHVzaChmaWx0ZXJbZmlsdGVyLmxlbmd0aCAtIDFdKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlclswXSA9PT0gJ21hdGNoJykge1xuICAgICAgICBpc0JyYW5jaGluZ0R5bmFtaWNhbGx5ID0gaXNCcmFuY2hpbmdEeW5hbWljYWxseSB8fCBpc0R5bmFtaWNGaWx0ZXIoZmlsdGVyWzFdKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IGZpbHRlci5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGJyYW5jaGVzLnB1c2goZmlsdGVyW2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJhbmNoZXMucHVzaChmaWx0ZXJbZmlsdGVyLmxlbmd0aCAtIDFdKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlclswXSA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgIGlzQnJhbmNoaW5nRHluYW1pY2FsbHkgPSBpc0JyYW5jaGluZ0R5bmFtaWNhbGx5IHx8IGlzRHluYW1pY0ZpbHRlcihmaWx0ZXJbMV0pO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlsdGVyLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgYnJhbmNoZXMucHVzaChmaWx0ZXJbaSArIDFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0JyYW5jaGluZ0R5bmFtaWNhbGx5KSB7XG4gICAgICAgIGZpbHRlci5sZW5ndGggPSAwO1xuICAgICAgICBmaWx0ZXIucHVzaCgnYW55JywgLi4uYnJhbmNoZXMpO1xuICAgIH1cblxuICAgIC8vIHRyYXZlcnNlIGFuZCByZWN1cnNlIGludG8gY2hpbGRyZW5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGZpbHRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICB1bmlvbkR5bmFtaWNCcmFuY2hlcyhmaWx0ZXJbaV0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNEeW5hbWljRmlsdGVyKGZpbHRlcjogYW55KTogYm9vbGVhbiB7XG4gICAgLy8gQmFzZSBDYXNlc1xuICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGlzUm9vdEV4cHJlc3Npb25EeW5hbWljKGZpbHRlclswXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBmaWx0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBmaWx0ZXJbaV07XG4gICAgICAgIGlmIChpc0R5bmFtaWNGaWx0ZXIoY2hpbGQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNSb290RXhwcmVzc2lvbkR5bmFtaWMoZXhwcmVzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24gPT09ICdwaXRjaCcgfHxcbiAgICAgICAgZXhwcmVzc2lvbiA9PT0gJ2Rpc3RhbmNlLWZyb20tY2VudGVyJztcbn1cblxuY29uc3QgZHluYW1pY0NvbmRpdGlvbkV4cHJlc3Npb25zID0gbmV3IFNldChbXG4gICAgJ2luJyxcbiAgICAnPT0nLFxuICAgICchPScsXG4gICAgJz4nLFxuICAgICc+PScsXG4gICAgJzwnLFxuICAgICc8PScsXG4gICAgJ3RvLWJvb2xlYW4nXG5dKTtcblxuZnVuY3Rpb24gY29sbGFwc2VkRXhwcmVzc2lvbihleHByZXNzaW9uOiBhbnkpOiBhbnkge1xuICAgIGlmIChkeW5hbWljQ29uZGl0aW9uRXhwcmVzc2lvbnMuaGFzKGV4cHJlc3Npb25bMF0pKSB7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbSA9IGV4cHJlc3Npb25baV07XG4gICAgICAgICAgICBpZiAoaXNEeW5hbWljRmlsdGVyKHBhcmFtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHByZXNzaW9uO1xufVxuXG4vLyBDb21wYXJpc29uIGZ1bmN0aW9uIHRvIHNvcnQgbnVtYmVycyBhbmQgc3RyaW5nc1xuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBnZW9tZXRyeU5lZWRlZChmaWx0ZXIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChmaWx0ZXJbMF0gPT09ICd3aXRoaW4nKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgZmlsdGVyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBpZiAoZ2VvbWV0cnlOZWVkZWQoZmlsdGVyW2luZGV4XSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGaWx0ZXIoZmlsdGVyOiA/QXJyYXk8YW55Pik6IG1peGVkIHtcbiAgICBpZiAoIWZpbHRlcikgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgb3AgPSBmaWx0ZXJbMF07XG4gICAgaWYgKGZpbHRlci5sZW5ndGggPD0gMSkgcmV0dXJuIChvcCAhPT0gJ2FueScpO1xuICAgIGNvbnN0IGNvbnZlcnRlZCA9XG4gICAgICAgIG9wID09PSAnPT0nID8gY29udmVydENvbXBhcmlzb25PcChmaWx0ZXJbMV0sIGZpbHRlclsyXSwgJz09JykgOlxuICAgICAgICBvcCA9PT0gJyE9JyA/IGNvbnZlcnROZWdhdGlvbihjb252ZXJ0Q29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCAnPT0nKSkgOlxuICAgICAgICBvcCA9PT0gJzwnIHx8XG4gICAgICAgIG9wID09PSAnPicgfHxcbiAgICAgICAgb3AgPT09ICc8PScgfHxcbiAgICAgICAgb3AgPT09ICc+PScgPyBjb252ZXJ0Q29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCBvcCkgOlxuICAgICAgICBvcCA9PT0gJ2FueScgPyBjb252ZXJ0RGlzanVuY3Rpb25PcChmaWx0ZXIuc2xpY2UoMSkpIDpcbiAgICAgICAgb3AgPT09ICdhbGwnID8gWydhbGwnXS5jb25jYXQoZmlsdGVyLnNsaWNlKDEpLm1hcChjb252ZXJ0RmlsdGVyKSkgOlxuICAgICAgICBvcCA9PT0gJ25vbmUnID8gWydhbGwnXS5jb25jYXQoZmlsdGVyLnNsaWNlKDEpLm1hcChjb252ZXJ0RmlsdGVyKS5tYXAoY29udmVydE5lZ2F0aW9uKSkgOlxuICAgICAgICBvcCA9PT0gJ2luJyA/IGNvbnZlcnRJbk9wKGZpbHRlclsxXSwgZmlsdGVyLnNsaWNlKDIpKSA6XG4gICAgICAgIG9wID09PSAnIWluJyA/IGNvbnZlcnROZWdhdGlvbihjb252ZXJ0SW5PcChmaWx0ZXJbMV0sIGZpbHRlci5zbGljZSgyKSkpIDpcbiAgICAgICAgb3AgPT09ICdoYXMnID8gY29udmVydEhhc09wKGZpbHRlclsxXSkgOlxuICAgICAgICBvcCA9PT0gJyFoYXMnID8gY29udmVydE5lZ2F0aW9uKGNvbnZlcnRIYXNPcChmaWx0ZXJbMV0pKSA6XG4gICAgICAgIG9wID09PSAnd2l0aGluJyA/IGZpbHRlciA6XG4gICAgICAgIHRydWU7XG4gICAgcmV0dXJuIGNvbnZlcnRlZDtcbn1cblxuZnVuY3Rpb24gY29udmVydENvbXBhcmlzb25PcChwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcDogc3RyaW5nKSB7XG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgIGNhc2UgJyR0eXBlJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLXR5cGUtJHtvcH1gLCB2YWx1ZV07XG4gICAgY2FzZSAnJGlkJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWlkLSR7b3B9YCwgdmFsdWVdO1xuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci0ke29wfWAsIHByb3BlcnR5LCB2YWx1ZV07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0RGlzanVuY3Rpb25PcChmaWx0ZXJzOiBBcnJheTxBcnJheTxhbnk+Pikge1xuICAgIHJldHVybiBbJ2FueSddLmNvbmNhdChmaWx0ZXJzLm1hcChjb252ZXJ0RmlsdGVyKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRJbk9wKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlczogQXJyYXk8YW55Pikge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICckdHlwZSc6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci10eXBlLWluYCwgWydsaXRlcmFsJywgdmFsdWVzXV07XG4gICAgY2FzZSAnJGlkJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWlkLWluYCwgWydsaXRlcmFsJywgdmFsdWVzXV07XG4gICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAyMDAgJiYgIXZhbHVlcy5zb21lKHYgPT4gdHlwZW9mIHYgIT09IHR5cGVvZiB2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gWydmaWx0ZXItaW4tbGFyZ2UnLCBwcm9wZXJ0eSwgWydsaXRlcmFsJywgdmFsdWVzLnNvcnQoY29tcGFyZSldXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbJ2ZpbHRlci1pbi1zbWFsbCcsIHByb3BlcnR5LCBbJ2xpdGVyYWwnLCB2YWx1ZXNdXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydEhhc09wKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgY2FzZSAnJHR5cGUnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICckaWQnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaGFzLWlkYF07XG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWhhc2AsIHByb3BlcnR5XTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnROZWdhdGlvbihmaWx0ZXI6IG1peGVkKSB7XG4gICAgcmV0dXJuIFsnIScsIGZpbHRlcl07XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdmFsaWRhdGVFbnVtIGZyb20gJy4vdmFsaWRhdGVfZW51bS5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcbmltcG9ydCB7aXNFeHByZXNzaW9uRmlsdGVyfSBmcm9tICcuLi9mZWF0dXJlX2ZpbHRlci9pbmRleC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRmlsdGVyKG9wdGlvbnMpIHtcbiAgICBpZiAoaXNFeHByZXNzaW9uRmlsdGVyKGRlZXBVbmJ1bmRsZShvcHRpb25zLnZhbHVlKSkpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJUeXBlID0gZGVlcFVuYnVuZGxlKG9wdGlvbnMubGF5ZXJUeXBlKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlRXhwcmVzc2lvbihleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiAnZmlsdGVyJyxcbiAgICAgICAgICAgIC8vIFdlIGRlZmF1bHQgdG8gYSBsYXllclR5cGUgb2YgYGZpbGxgIGJlY2F1c2UgdGhhdCBwb2ludHMgdG8gYSBub24tZHluYW1pYyBmaWx0ZXIgZGVmaW5pdGlvbiB3aXRoaW4gdGhlIHN0eWxlLXNwZWMuXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjW2BmaWx0ZXJfJHtsYXllclR5cGUgfHwgJ2ZpbGwnfWBdXG4gICAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVOb25FeHByZXNzaW9uRmlsdGVyKG9wdGlvbnMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVOb25FeHByZXNzaW9uRmlsdGVyKG9wdGlvbnMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgIT09ICdhcnJheScpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBhcnJheSBleHBlY3RlZCwgJHtnZXRUeXBlKHZhbHVlKX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgbGV0IHR5cGU7XG5cbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBpZiAodmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ2ZpbHRlciBhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3QgMSBlbGVtZW50JyldO1xuICAgIH1cblxuICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVFbnVtKHtcbiAgICAgICAga2V5OiBgJHtrZXl9WzBdYCxcbiAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5maWx0ZXJfb3BlcmF0b3IsXG4gICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgfSkpO1xuXG4gICAgc3dpdGNoICh1bmJ1bmRsZSh2YWx1ZVswXSkpIHtcbiAgICBjYXNlICc8JzpcbiAgICBjYXNlICc8PSc6XG4gICAgY2FzZSAnPic6XG4gICAgY2FzZSAnPj0nOlxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDIgJiYgdW5idW5kbGUodmFsdWVbMV0pID09PSAnJHR5cGUnKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBcIiR0eXBlXCIgY2Fubm90IGJlIHVzZSB3aXRoIG9wZXJhdG9yIFwiJHt2YWx1ZVswXX1cImApKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSAnPT0nOlxuICAgIGNhc2UgJyE9JzpcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgZmlsdGVyIGFycmF5IGZvciBvcGVyYXRvciBcIiR7dmFsdWVbMF19XCIgbXVzdCBoYXZlIDMgZWxlbWVudHNgKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgJ2luJzpcbiAgICBjYXNlICchaW4nOlxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlWzFdKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVsxXWAsIHZhbHVlWzFdLCBgc3RyaW5nIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlW2ldKTtcbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZSh2YWx1ZVsxXSkgPT09ICckdHlwZScpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlRW51bSh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fVske2l9XWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVtpXSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuZ2VvbWV0cnlfdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdudW1iZXInICYmIHR5cGUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVske2l9XWAsIHZhbHVlW2ldLCBgc3RyaW5nLCBudW1iZXIsIG9yIGJvb2xlYW4gZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdhbnknOlxuICAgIGNhc2UgJ2FsbCc6XG4gICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVOb25FeHByZXNzaW9uRmlsdGVyKHtcbiAgICAgICAgICAgICAgICBrZXk6IGAke2tleX1bJHtpfV1gLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVtpXSxcbiAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdoYXMnOlxuICAgIGNhc2UgJyFoYXMnOlxuICAgICAgICB0eXBlID0gZ2V0VHlwZSh2YWx1ZVsxXSk7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGZpbHRlciBhcnJheSBmb3IgXCIke3ZhbHVlWzBdfVwiIG9wZXJhdG9yIG11c3QgaGF2ZSAyIGVsZW1lbnRzYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bMV1gLCB2YWx1ZVsxXSwgYHN0cmluZyBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICBjYXNlICd3aXRoaW4nOlxuICAgICAgICB0eXBlID0gZ2V0VHlwZSh2YWx1ZVsxXSk7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGZpbHRlciBhcnJheSBmb3IgXCIke3ZhbHVlWzBdfVwiIG9wZXJhdG9yIG11c3QgaGF2ZSAyIGVsZW1lbnRzYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bMV1gLCB2YWx1ZVsxXSwgYG9iamVjdCBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIlxuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IHtpc0Z1bmN0aW9ufSBmcm9tICcuLi9mdW5jdGlvbi9pbmRleC5qcyc7XG5pbXBvcnQge3VuYnVuZGxlLCBkZWVwVW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuaW1wb3J0IHtzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbn0gZnJvbSAnLi4vdXRpbC9wcm9wZXJ0aWVzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eShvcHRpb25zLCBwcm9wZXJ0eVR5cGUpIHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IHByb3BlcnR5S2V5ID0gb3B0aW9ucy5vYmplY3RLZXk7XG4gICAgY29uc3QgbGF5ZXJTcGVjID0gc3R5bGVTcGVjW2Ake3Byb3BlcnR5VHlwZX1fJHtvcHRpb25zLmxheWVyVHlwZX1gXTtcblxuICAgIGlmICghbGF5ZXJTcGVjKSByZXR1cm4gW107XG5cbiAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBwcm9wZXJ0eUtleS5tYXRjaCgvXiguKiktdHJhbnNpdGlvbiQvKTtcbiAgICBpZiAocHJvcGVydHlUeXBlID09PSAncGFpbnQnICYmIHRyYW5zaXRpb25NYXRjaCAmJiBsYXllclNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXSAmJiBsYXllclNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXS50cmFuc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnRyYW5zaXRpb24sXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYyB8fCBsYXllclNwZWNbcHJvcGVydHlLZXldO1xuICAgIGlmICghdmFsdWVTcGVjKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgdW5rbm93biBwcm9wZXJ0eSBcIiR7cHJvcGVydHlLZXl9XCJgKV07XG4gICAgfVxuXG4gICAgbGV0IHRva2VuTWF0Y2g7XG4gICAgaWYgKGdldFR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJiBzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbih2YWx1ZVNwZWMpICYmICF2YWx1ZVNwZWMudG9rZW5zICYmICh0b2tlbk1hdGNoID0gL157KFtefV0rKX0kLy5leGVjKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAga2V5LCB2YWx1ZSxcbiAgICAgICAgICAgIGBcIiR7cHJvcGVydHlLZXl9XCIgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcnBvbGF0aW9uIHN5bnRheFxcbmAgK1xuICAgICAgICAgICAgICAgIGBVc2UgYW4gaWRlbnRpdHkgcHJvcGVydHkgZnVuY3Rpb24gaW5zdGVhZDogXFxgeyBcInR5cGVcIjogXCJpZGVudGl0eVwiLCBcInByb3BlcnR5XCI6ICR7SlNPTi5zdHJpbmdpZnkodG9rZW5NYXRjaFsxXSl9IH1cXGAuYCldO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXG4gICAgaWYgKG9wdGlvbnMubGF5ZXJUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICBpZiAocHJvcGVydHlLZXkgPT09ICd0ZXh0LWZpZWxkJyAmJiBzdHlsZSAmJiAhc3R5bGUuZ2x5cGhzKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICd1c2Ugb2YgXCJ0ZXh0LWZpZWxkXCIgcmVxdWlyZXMgYSBzdHlsZSBcImdseXBoc1wiIHByb3BlcnR5JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleSA9PT0gJ3RleHQtZm9udCcgJiYgaXNGdW5jdGlvbihkZWVwVW5idW5kbGUodmFsdWUpKSAmJiB1bmJ1bmRsZSh2YWx1ZS50eXBlKSA9PT0gJ2lkZW50aXR5Jykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnXCJ0ZXh0LWZvbnRcIiBkb2VzIG5vdCBzdXBwb3J0IGlkZW50aXR5IGZ1bmN0aW9ucycpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlU3BlYyxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgZXhwcmVzc2lvbkNvbnRleHQ6ICdwcm9wZXJ0eScsXG4gICAgICAgIHByb3BlcnR5VHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICB9KSk7XG59XG4iLCJcbmltcG9ydCB2YWxpZGF0ZVByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGVfcHJvcGVydHkuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVBhaW50UHJvcGVydHkob3B0aW9ucykge1xuICAgIHJldHVybiB2YWxpZGF0ZVByb3BlcnR5KG9wdGlvbnMsICdwYWludCcpO1xufVxuIiwiXG5pbXBvcnQgdmFsaWRhdGVQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlX3Byb3BlcnR5LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHZhbGlkYXRlUHJvcGVydHkob3B0aW9ucywgJ2xheW91dCcpO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHt1bmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QuanMnO1xuaW1wb3J0IHZhbGlkYXRlRmlsdGVyIGZyb20gJy4vdmFsaWRhdGVfZmlsdGVyLmpzJztcbmltcG9ydCB2YWxpZGF0ZVBhaW50UHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZV9wYWludF9wcm9wZXJ0eS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlX2xheW91dF9wcm9wZXJ0eS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVTcGVjIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IGV4dGVuZCBmcm9tICcuLi91dGlsL2V4dGVuZC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGF5ZXIob3B0aW9ucykge1xuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGNvbnN0IGxheWVyID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG5cbiAgICBpZiAoIWxheWVyLnR5cGUgJiYgIWxheWVyLnJlZikge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsICdlaXRoZXIgXCJ0eXBlXCIgb3IgXCJyZWZcIiBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG4gICAgbGV0IHR5cGUgPSB1bmJ1bmRsZShsYXllci50eXBlKTtcbiAgICBjb25zdCByZWYgPSB1bmJ1bmRsZShsYXllci5yZWYpO1xuXG4gICAgaWYgKGxheWVyLmlkKSB7XG4gICAgICAgIGNvbnN0IGxheWVySWQgPSB1bmJ1bmRsZShsYXllci5pZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5hcnJheUluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG90aGVyTGF5ZXIgPSBzdHlsZS5sYXllcnNbaV07XG4gICAgICAgICAgICBpZiAodW5idW5kbGUob3RoZXJMYXllci5pZCkgPT09IGxheWVySWQpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuaWQsIGBkdXBsaWNhdGUgbGF5ZXIgaWQgXCIke2xheWVyLmlkfVwiLCBwcmV2aW91c2x5IHVzZWQgYXQgbGluZSAke290aGVyTGF5ZXIuaWQuX19saW5lX199YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdyZWYnIGluIGxheWVyKSB7XG4gICAgICAgIFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ2ZpbHRlcicsICdsYXlvdXQnXS5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICBpZiAocCBpbiBsYXllcikge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllcltwXSwgYFwiJHtwfVwiIGlzIHByb2hpYml0ZWQgZm9yIHJlZiBsYXllcnNgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBwYXJlbnQ7XG5cbiAgICAgICAgc3R5bGUubGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICBpZiAodW5idW5kbGUobGF5ZXIuaWQpID09PSByZWYpIHBhcmVudCA9IGxheWVyO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnJlZiwgYHJlZiBsYXllciBcIiR7cmVmfVwiIG5vdCBmb3VuZGApKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQucmVmKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIucmVmLCAncmVmIGNhbm5vdCByZWZlcmVuY2UgYW5vdGhlciByZWYgbGF5ZXInKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0eXBlID0gdW5idW5kbGUocGFyZW50LnR5cGUpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICghKHR5cGUgPT09ICdiYWNrZ3JvdW5kJyB8fCB0eXBlID09PSAnc2t5JykpIHtcbiAgICAgICAgaWYgKCFsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgJ21pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzb3VyY2VcIicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHN0eWxlLnNvdXJjZXMgJiYgc3R5bGUuc291cmNlc1tsYXllci5zb3VyY2VdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlVHlwZSA9IHNvdXJjZSAmJiB1bmJ1bmRsZShzb3VyY2UudHlwZSk7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5zb3VyY2UsIGBzb3VyY2UgXCIke2xheWVyLnNvdXJjZX1cIiBub3QgZm91bmRgKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmIHR5cGUgPT09ICdyYXN0ZXInKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgYGxheWVyIFwiJHtsYXllci5pZH1cIiByZXF1aXJlcyBhIHJhc3RlciBzb3VyY2VgKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgPT09ICdyYXN0ZXInICYmIHR5cGUgIT09ICdyYXN0ZXInKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgYGxheWVyIFwiJHtsYXllci5pZH1cIiByZXF1aXJlcyBhIHZlY3RvciBzb3VyY2VgKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmICFsYXllclsnc291cmNlLWxheWVyJ10pIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsIGBsYXllciBcIiR7bGF5ZXIuaWR9XCIgbXVzdCBzcGVjaWZ5IGEgXCJzb3VyY2UtbGF5ZXJcImApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZSA9PT0gJ3Jhc3Rlci1kZW0nICYmIHR5cGUgIT09ICdoaWxsc2hhZGUnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnNvdXJjZSwgJ3Jhc3Rlci1kZW0gc291cmNlIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBsYXllciB0eXBlIFxcJ2hpbGxzaGFkZVxcJy4nKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdsaW5lJyAmJiBsYXllci5wYWludCAmJiBsYXllci5wYWludFsnbGluZS1ncmFkaWVudCddICYmXG4gICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2VUeXBlICE9PSAnZ2VvanNvbicgfHwgIXNvdXJjZS5saW5lTWV0cmljcykpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsIGBsYXllciBcIiR7bGF5ZXIuaWR9XCIgc3BlY2lmaWVzIGEgbGluZS1ncmFkaWVudCwgd2hpY2ggcmVxdWlyZXMgYSBHZW9KU09OIHNvdXJjZSB3aXRoIFxcYGxpbmVNZXRyaWNzXFxgIGVuYWJsZWQuYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IGxheWVyLFxuICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5sYXllcixcbiAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAnKicoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZW5mb3JjZSB0aGUgc3BlYydzIGBcInJlcXVpcmVzXCI6IHRydWVgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggcmVmcztcbiAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgcmVxdWlyZW1lbnQgaXMgdmFsaWRhdGVkIGFib3ZlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzU3NzIuXG4gICAgICAgICAgICB0eXBlKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVNwZWMoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGAke2tleX0udHlwZWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBsYXllci50eXBlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5sYXllci50eXBlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBsYXllcixcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0S2V5OiAndHlwZSdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaWx0ZXIob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZUZpbHRlcihleHRlbmQoe2xheWVyVHlwZTogdHlwZX0sIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXlvdXQob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnKicob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZUxheW91dFByb3BlcnR5KGV4dGVuZCh7bGF5ZXJUeXBlOiB0eXBlfSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGFpbnQob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnKicob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVBhaW50UHJvcGVydHkoZXh0ZW5kKHtsYXllclR5cGU6IHR5cGV9LCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCJcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBzdHJpbmcgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHt1bmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QuanMnO1xuaW1wb3J0IHZhbGlkYXRlRW51bSBmcm9tICcuL3ZhbGlkYXRlX2VudW0uanMnO1xuaW1wb3J0IHZhbGlkYXRlRXhwcmVzc2lvbiBmcm9tICcuL3ZhbGlkYXRlX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuXG5jb25zdCBvYmplY3RFbGVtZW50VmFsaWRhdG9ycyA9IHtcbiAgICBwcm9tb3RlSWQ6IHZhbGlkYXRlUHJvbW90ZUlkXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVNvdXJjZShvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcblxuICAgIGlmICghdmFsdWUudHlwZSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1widHlwZVwiIGlzIHJlcXVpcmVkJyldO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB1bmJ1bmRsZSh2YWx1ZS50eXBlKTtcbiAgICBsZXQgZXJyb3JzO1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAndmVjdG9yJzpcbiAgICBjYXNlICdyYXN0ZXInOlxuICAgIGNhc2UgJ3Jhc3Rlci1kZW0nOlxuICAgICAgICBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjW2Bzb3VyY2VfJHt0eXBlLnJlcGxhY2UoJy0nLCAnXycpfWBdLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yc1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcblxuICAgIGNhc2UgJ2dlb2pzb24nOlxuICAgICAgICBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnNvdXJjZV9nZW9qc29uLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yc1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZhbHVlLmNsdXN0ZXIpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiB2YWx1ZS5jbHVzdGVyUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtvcGVyYXRvciwgbWFwRXhwcl0gPSB2YWx1ZS5jbHVzdGVyUHJvcGVydGllc1twcm9wXTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWR1Y2VFeHByID0gdHlwZW9mIG9wZXJhdG9yID09PSAnc3RyaW5nJyA/IFtvcGVyYXRvciwgWydhY2N1bXVsYXRlZCddLCBbJ2dldCcsIHByb3BdXSA6IG9wZXJhdG9yO1xuXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVFeHByZXNzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9LiR7cHJvcH0ubWFwYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1hcEV4cHIsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiAnY2x1c3Rlci1tYXAnXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fS4ke3Byb3B9LnJlZHVjZWAsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZWR1Y2VFeHByLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uQ29udGV4dDogJ2NsdXN0ZXItcmVkdWNlJ1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5zb3VyY2VfdmlkZW8sXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcblxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX2ltYWdlLFxuICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSk7XG5cbiAgICBjYXNlICdjYW52YXMnOlxuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBudWxsLCBgUGxlYXNlIHVzZSBydW50aW1lIEFQSXMgdG8gYWRkIGNhbnZhcyBzb3VyY2VzLCByYXRoZXIgdGhhbiBpbmNsdWRpbmcgdGhlbSBpbiBzdHlsZXNoZWV0cy5gLCAnc291cmNlLmNhbnZhcycpXTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUVudW0oe1xuICAgICAgICAgICAga2V5OiBgJHtrZXl9LnR5cGVgLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHt2YWx1ZXM6IFsndmVjdG9yJywgJ3Jhc3RlcicsICdyYXN0ZXItZGVtJywgJ2dlb2pzb24nLCAndmlkZW8nLCAnaW1hZ2UnXX0sXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvbW90ZUlkKHtrZXksIHZhbHVlfSkge1xuICAgIGlmIChnZXRUeXBlKHZhbHVlKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3RyaW5nKHtrZXksIHZhbHVlfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmcoe2tleTogYCR7a2V5fS4ke3Byb3B9YCwgdmFsdWU6IHZhbHVlW3Byb3BdfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGlnaHQob3B0aW9ucykge1xuICAgIGNvbnN0IGxpZ2h0ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCBsaWdodFNwZWMgPSBzdHlsZVNwZWMubGlnaHQ7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3Qgcm9vdFR5cGUgPSBnZXRUeXBlKGxpZ2h0KTtcbiAgICBpZiAobGlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ2xpZ2h0JywgbGlnaHQsIGBvYmplY3QgZXhwZWN0ZWQsICR7cm9vdFR5cGV9IGZvdW5kYCldKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBsaWdodCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXSAmJiBsaWdodFNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGxpZ2h0W2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaWdodFNwZWNba2V5XSkge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBsaWdodFtrZXldLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogbGlnaHRTcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGlnaHRba2V5XSwgYHVua25vd24gcHJvcGVydHkgXCIke2tleX1cImApXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQge3VuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVUZXJyYWluKG9wdGlvbnMpIHtcbiAgICBjb25zdCB0ZXJyYWluID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3QgdGVycmFpblNwZWMgPSBzdHlsZVNwZWMudGVycmFpbjtcbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBjb25zdCByb290VHlwZSA9IGdldFR5cGUodGVycmFpbik7XG4gICAgaWYgKHRlcnJhaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ3RlcnJhaW4nLCB0ZXJyYWluLCBgb2JqZWN0IGV4cGVjdGVkLCAke3Jvb3RUeXBlfSBmb3VuZGApXSk7XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGVycmFpbikge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiB0ZXJyYWluU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dICYmIHRlcnJhaW5TcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0udHJhbnNpdGlvbikge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0ZXJyYWluW2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZXJyYWluU3BlY1trZXldKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRlcnJhaW5ba2V5XSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHRlcnJhaW5TcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdGVycmFpbltrZXldLCBgdW5rbm93biBwcm9wZXJ0eSBcIiR7a2V5fVwiYCldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGVycmFpbi5zb3VyY2UpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHRlcnJhaW4sIGB0ZXJyYWluIGlzIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzb3VyY2VcImApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBzdHlsZS5zb3VyY2VzICYmIHN0eWxlLnNvdXJjZXNbdGVycmFpbi5zb3VyY2VdO1xuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlICYmIHVuYnVuZGxlKHNvdXJjZS50eXBlKTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB0ZXJyYWluLnNvdXJjZSwgYHNvdXJjZSBcIiR7dGVycmFpbi5zb3VyY2V9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgIT09ICdyYXN0ZXItZGVtJykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHRlcnJhaW4uc291cmNlLCBgdGVycmFpbiBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgc291cmNlIG9mIHR5cGUgJHtzb3VyY2VUeXBlfSwgaXQgb25seSBiZSB1c2VkIHdpdGggYSBcInJhc3Rlci1kZW1cIiBzb3VyY2UgdHlwZWApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCJcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVGb2cob3B0aW9ucykge1xuICAgIGNvbnN0IGZvZyA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGNvbnN0IGZvZ1NwZWMgPSBzdHlsZVNwZWMuZm9nO1xuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGNvbnN0IHJvb3RUeXBlID0gZ2V0VHlwZShmb2cpO1xuICAgIGlmIChmb2cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ2ZvZycsIGZvZywgYG9iamVjdCBleHBlY3RlZCwgJHtyb290VHlwZX0gZm91bmRgKV0pO1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIGZvZykge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiBmb2dTcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0gJiYgZm9nU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZm9nW2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb2dTcGVjW2tleV0pIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZm9nW2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBmb2dTcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgZm9nW2tleV0sIGB1bmtub3duIHByb3BlcnR5IFwiJHtrZXl9XCJgKV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdmFsaWRhdGVTdHJpbmcgZnJvbSAnLi92YWxpZGF0ZV9zdHJpbmcuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdHRlZChvcHRpb25zOiBhbnkpIHtcbiAgICBpZiAodmFsaWRhdGVTdHJpbmcob3B0aW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnMpO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB2YWxpZGF0ZUV4cHJlc3Npb24gZnJvbSAnLi92YWxpZGF0ZV9leHByZXNzaW9uLmpzJztcbmltcG9ydCB2YWxpZGF0ZVN0cmluZyBmcm9tICcuL3ZhbGlkYXRlX3N0cmluZy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlSW1hZ2Uob3B0aW9uczogYW55KSB7XG4gICAgaWYgKHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlRXhwcmVzc2lvbihvcHRpb25zKTtcbn1cbiIsImltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVQcm9qZWN0aW9uKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm9qZWN0aW9uID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCBwcm9qZWN0aW9uU3BlYyA9IHN0eWxlU3BlYy5wcm9qZWN0aW9uO1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcblxuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGNvbnN0IHJvb3RUeXBlID0gZ2V0VHlwZShwcm9qZWN0aW9uKTtcblxuICAgIGlmIChyb290VHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvamVjdGlvbikge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9qZWN0aW9uW2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBwcm9qZWN0aW9uU3BlY1trZXldLFxuICAgICAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChyb290VHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdChbbmV3IFZhbGlkYXRpb25FcnJvcigncHJvamVjdGlvbicsIHByb2plY3Rpb24sIGBvYmplY3Qgb3Igc3RyaW5nIGV4cGVjdGVkLCAke3Jvb3RUeXBlfSBmb3VuZGApXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIlxuaW1wb3J0IGV4dGVuZCBmcm9tICcuLi91dGlsL2V4dGVuZC5qcyc7XG5pbXBvcnQge3VuYnVuZGxlLCBkZWVwVW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuaW1wb3J0IHtpc0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IHtpc0Z1bmN0aW9ufSBmcm9tICcuLi9mdW5jdGlvbi9pbmRleC5qcyc7XG5cbmltcG9ydCB2YWxpZGF0ZUZ1bmN0aW9uIGZyb20gJy4vdmFsaWRhdGVfZnVuY3Rpb24uanMnO1xuaW1wb3J0IHZhbGlkYXRlRXhwcmVzc2lvbiBmcm9tICcuL3ZhbGlkYXRlX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHZhbGlkYXRlT2JqZWN0IGZyb20gJy4vdmFsaWRhdGVfb2JqZWN0LmpzJztcbmltcG9ydCB2YWxpZGF0ZUFycmF5IGZyb20gJy4vdmFsaWRhdGVfYXJyYXkuanMnO1xuaW1wb3J0IHZhbGlkYXRlQm9vbGVhbiBmcm9tICcuL3ZhbGlkYXRlX2Jvb2xlYW4uanMnO1xuaW1wb3J0IHZhbGlkYXRlTnVtYmVyIGZyb20gJy4vdmFsaWRhdGVfbnVtYmVyLmpzJztcbmltcG9ydCB2YWxpZGF0ZUNvbG9yIGZyb20gJy4vdmFsaWRhdGVfY29sb3IuanMnO1xuaW1wb3J0IHZhbGlkYXRlQ29uc3RhbnRzIGZyb20gJy4vdmFsaWRhdGVfY29uc3RhbnRzLmpzJztcbmltcG9ydCB2YWxpZGF0ZUVudW0gZnJvbSAnLi92YWxpZGF0ZV9lbnVtLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZpbHRlciBmcm9tICcuL3ZhbGlkYXRlX2ZpbHRlci5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMYXllciBmcm9tICcuL3ZhbGlkYXRlX2xheWVyLmpzJztcbmltcG9ydCB2YWxpZGF0ZVNvdXJjZSBmcm9tICcuL3ZhbGlkYXRlX3NvdXJjZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMaWdodCBmcm9tICcuL3ZhbGlkYXRlX2xpZ2h0LmpzJztcbmltcG9ydCB2YWxpZGF0ZVRlcnJhaW4gZnJvbSAnLi92YWxpZGF0ZV90ZXJyYWluLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZvZyBmcm9tICcuL3ZhbGlkYXRlX2ZvZy5qcyc7XG5pbXBvcnQgdmFsaWRhdGVTdHJpbmcgZnJvbSAnLi92YWxpZGF0ZV9zdHJpbmcuanMnO1xuaW1wb3J0IHZhbGlkYXRlRm9ybWF0dGVkIGZyb20gJy4vdmFsaWRhdGVfZm9ybWF0dGVkLmpzJztcbmltcG9ydCB2YWxpZGF0ZUltYWdlIGZyb20gJy4vdmFsaWRhdGVfaW1hZ2UuanMnO1xuaW1wb3J0IHZhbGlkYXRlUHJvamVjdGlvbiBmcm9tICcuL3ZhbGlkYXRlX3Byb2plY3Rpb24uanMnO1xuXG5jb25zdCBWQUxJREFUT1JTID0ge1xuICAgICcqJygpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG4gICAgJ2FycmF5JzogdmFsaWRhdGVBcnJheSxcbiAgICAnYm9vbGVhbic6IHZhbGlkYXRlQm9vbGVhbixcbiAgICAnbnVtYmVyJzogdmFsaWRhdGVOdW1iZXIsXG4gICAgJ2NvbG9yJzogdmFsaWRhdGVDb2xvcixcbiAgICAnY29uc3RhbnRzJzogdmFsaWRhdGVDb25zdGFudHMsXG4gICAgJ2VudW0nOiB2YWxpZGF0ZUVudW0sXG4gICAgJ2ZpbHRlcic6IHZhbGlkYXRlRmlsdGVyLFxuICAgICdmdW5jdGlvbic6IHZhbGlkYXRlRnVuY3Rpb24sXG4gICAgJ2xheWVyJzogdmFsaWRhdGVMYXllcixcbiAgICAnb2JqZWN0JzogdmFsaWRhdGVPYmplY3QsXG4gICAgJ3NvdXJjZSc6IHZhbGlkYXRlU291cmNlLFxuICAgICdsaWdodCc6IHZhbGlkYXRlTGlnaHQsXG4gICAgJ3RlcnJhaW4nOiB2YWxpZGF0ZVRlcnJhaW4sXG4gICAgJ2ZvZyc6IHZhbGlkYXRlRm9nLFxuICAgICdzdHJpbmcnOiB2YWxpZGF0ZVN0cmluZyxcbiAgICAnZm9ybWF0dGVkJzogdmFsaWRhdGVGb3JtYXR0ZWQsXG4gICAgJ3Jlc29sdmVkSW1hZ2UnOiB2YWxpZGF0ZUltYWdlLFxuICAgICdwcm9qZWN0aW9uJzogdmFsaWRhdGVQcm9qZWN0aW9uXG59O1xuXG4vLyBNYWluIHJlY3Vyc2l2ZSB2YWxpZGF0aW9uIGZ1bmN0aW9uLiBUcmFja3M6XG4vL1xuLy8gLSBrZXk6IHN0cmluZyByZXByZXNlbnRpbmcgbG9jYXRpb24gb2YgdmFsaWRhdGlvbiBpbiBzdHlsZSB0cmVlLiBVc2VkIG9ubHlcbi8vICAgZm9yIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3IgcmVwb3J0aW5nLlxuLy8gLSB2YWx1ZTogY3VycmVudCB2YWx1ZSBmcm9tIHN0eWxlIGJlaW5nIGV2YWx1YXRlZC4gTWF5IGJlIGFueXRoaW5nIGZyb20gYVxuLy8gICBoaWdoIGxldmVsIG9iamVjdCB0aGF0IG5lZWRzIHRvIGJlIGRlc2NlbmRlZCBpbnRvIGRlZXBlciBvciBhIHNpbXBsZVxuLy8gICBzY2FsYXIgdmFsdWUuXG4vLyAtIHZhbHVlU3BlYzogY3VycmVudCBzcGVjIGJlaW5nIGV2YWx1YXRlZC4gVHJhY2tzIHZhbHVlLlxuLy8gLSBzdHlsZVNwZWM6IGN1cnJlbnQgZnVsbCBzcGVjIGJlaW5nIGV2YWx1YXRlZC5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGUob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcblxuICAgIGlmICh2YWx1ZVNwZWMuZXhwcmVzc2lvbiAmJiBpc0Z1bmN0aW9uKHVuYnVuZGxlKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2UgaWYgKHZhbHVlU3BlYy5leHByZXNzaW9uICYmIGlzRXhwcmVzc2lvbihkZWVwVW5idW5kbGUodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVFeHByZXNzaW9uKG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIGlmICh2YWx1ZVNwZWMudHlwZSAmJiBWQUxJREFUT1JTW3ZhbHVlU3BlYy50eXBlXSkge1xuICAgICAgICByZXR1cm4gVkFMSURBVE9SU1t2YWx1ZVNwZWMudHlwZV0ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlT2JqZWN0KGV4dGVuZCh7fSwgb3B0aW9ucywge1xuICAgICAgICAgICAgdmFsdWVTcGVjOiB2YWx1ZVNwZWMudHlwZSA/IHN0eWxlU3BlY1t2YWx1ZVNwZWMudHlwZV0gOiB2YWx1ZVNwZWNcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcblxuICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMpO1xuICAgIGlmIChlcnJvcnMubGVuZ3RoKSByZXR1cm4gZXJyb3JzO1xuXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoJ3tmb250c3RhY2t9JykgPT09IC0xKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1wiZ2x5cGhzXCIgdXJsIG11c3QgaW5jbHVkZSBhIFwie2ZvbnRzdGFja31cIiB0b2tlbicpKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUuaW5kZXhPZigne3JhbmdlfScpID09PSAtMSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdcImdseXBoc1wiIHVybCBtdXN0IGluY2x1ZGUgYSBcIntyYW5nZX1cIiB0b2tlbicpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiXG5pbXBvcnQgdmFsaWRhdGVDb25zdGFudHMgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9jb25zdGFudHMuanMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGUuanMnO1xuaW1wb3J0IGxhdGVzdFN0eWxlU3BlYyBmcm9tICcuL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuaW1wb3J0IHZhbGlkYXRlR2x5cGhzVVJMIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfZ2x5cGhzX3VybC5qcyc7XG5cbmltcG9ydCB2YWxpZGF0ZVNvdXJjZSBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX3NvdXJjZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMaWdodCBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xpZ2h0LmpzJztcbmltcG9ydCB2YWxpZGF0ZVRlcnJhaW4gZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV90ZXJyYWluLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZvZyBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZvZy5qcyc7XG5pbXBvcnQgdmFsaWRhdGVMYXllciBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xheWVyLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZpbHRlciBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZpbHRlci5qcyc7XG5pbXBvcnQgdmFsaWRhdGVQYWludFByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHkuanMnO1xuaW1wb3J0IHZhbGlkYXRlTGF5b3V0UHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHkuanMnO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgTWFwYm94IEdMIHN0eWxlIGFnYWluc3QgdGhlIHN0eWxlIHNwZWNpZmljYXRpb24uIFRoaXMgZW50cnlwb2ludCxcbiAqIGBtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluYCwgaXMgZGVzaWduZWQgdG8gcHJvZHVjZSBhc1xuICogc21hbGwgYSBicm93c2VyaWZ5IGJ1bmRsZSBhcyBwb3NzaWJsZSBieSBvbWl0dGluZyB1bm5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5XG4gKiBhbmQgbGVnYWN5IHN0eWxlIHNwZWNpZmljYXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc3R5bGUgVGhlIHN0eWxlIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3R5bGVTcGVjXSBUaGUgc3R5bGUgc3BlY2lmaWNhdGlvbiB0byB2YWxpZGF0ZSBhZ2FpbnN0LlxuICogICAgIElmIG9taXR0ZWQsIHRoZSBsYXRlc3Qgc3R5bGUgc3BlYyBpcyB1c2VkLlxuICogQHJldHVybnMge0FycmF5PFZhbGlkYXRpb25FcnJvcj59XG4gKiBAZXhhbXBsZVxuICogICB2YXIgdmFsaWRhdGUgPSByZXF1aXJlKCdtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluJyk7XG4gKiAgIHZhciBlcnJvcnMgPSB2YWxpZGF0ZShzdHlsZSk7XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3R5bGVNaW4oc3R5bGUsIHN0eWxlU3BlYyA9IGxhdGVzdFN0eWxlU3BlYykge1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgIGtleTogJycsXG4gICAgICAgIHZhbHVlOiBzdHlsZSxcbiAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuJHJvb3QsXG4gICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICBnbHlwaHM6IHZhbGlkYXRlR2x5cGhzVVJMLFxuICAgICAgICAgICAgJyonKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKTtcblxuICAgIGlmIChzdHlsZS5jb25zdGFudHMpIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUNvbnN0YW50cyh7XG4gICAgICAgICAgICBrZXk6ICdjb25zdGFudHMnLFxuICAgICAgICAgICAgdmFsdWU6IHN0eWxlLmNvbnN0YW50cyxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydEVycm9ycyhlcnJvcnMpO1xufVxuXG52YWxpZGF0ZVN0eWxlTWluLnNvdXJjZSA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZVNvdXJjZSk7XG52YWxpZGF0ZVN0eWxlTWluLmxpZ2h0ID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlTGlnaHQpO1xudmFsaWRhdGVTdHlsZU1pbi50ZXJyYWluID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlVGVycmFpbik7XG52YWxpZGF0ZVN0eWxlTWluLmZvZyA9IHdyYXBDbGVhbkVycm9ycyh2YWxpZGF0ZUZvZyk7XG52YWxpZGF0ZVN0eWxlTWluLmxheWVyID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlTGF5ZXIpO1xudmFsaWRhdGVTdHlsZU1pbi5maWx0ZXIgPSB3cmFwQ2xlYW5FcnJvcnModmFsaWRhdGVGaWx0ZXIpO1xudmFsaWRhdGVTdHlsZU1pbi5wYWludFByb3BlcnR5ID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSk7XG52YWxpZGF0ZVN0eWxlTWluLmxheW91dFByb3BlcnR5ID0gd3JhcENsZWFuRXJyb3JzKHZhbGlkYXRlTGF5b3V0UHJvcGVydHkpO1xuXG5mdW5jdGlvbiBzb3J0RXJyb3JzKGVycm9ycykge1xuICAgIHJldHVybiBbXS5jb25jYXQoZXJyb3JzKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIHJldHVybiBhLmxpbmUgLSBiLmxpbmU7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHdyYXBDbGVhbkVycm9ycyhpbm5lcikge1xuICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBzb3J0RXJyb3JzKGlubmVyLmFwcGx5KHRoaXMsIGFyZ3MpKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0ZVN0eWxlTWluO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB2YWxpZGF0ZVN0eWxlTWluIGZyb20gJy4uL3N0eWxlLXNwZWMvdmFsaWRhdGVfc3R5bGUubWluLmpzJztcbmltcG9ydCB7RXJyb3JFdmVudH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcblxuaW1wb3J0IHR5cGUge0V2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5cbnR5cGUgVmFsaWRhdGlvbkVycm9yID0ge1xuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBsaW5lOiBudW1iZXIsXG4gICAgaWRlbnRpZmllcj86IHN0cmluZ1xufTtcblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yID0gKE9iamVjdCkgPT4gJFJlYWRPbmx5QXJyYXk8VmFsaWRhdGlvbkVycm9yPjtcblxudHlwZSBWYWxpZGF0ZVN0eWxlID0ge1xuICAgIChPYmplY3QsID9PYmplY3QpOiAkUmVhZE9ubHlBcnJheTxWYWxpZGF0aW9uRXJyb3I+LFxuICAgIHNvdXJjZTogVmFsaWRhdG9yLFxuICAgIGxheWVyOiBWYWxpZGF0b3IsXG4gICAgbGlnaHQ6IFZhbGlkYXRvcixcbiAgICB0ZXJyYWluOiBWYWxpZGF0b3IsXG4gICAgZm9nOiBWYWxpZGF0b3IsXG4gICAgZmlsdGVyOiBWYWxpZGF0b3IsXG4gICAgcGFpbnRQcm9wZXJ0eTogVmFsaWRhdG9yLFxuICAgIGxheW91dFByb3BlcnR5OiBWYWxpZGF0b3Jcbn07XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVN0eWxlID0gKHZhbGlkYXRlU3R5bGVNaW46IFZhbGlkYXRlU3R5bGUpO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVTb3VyY2UgPSB2YWxpZGF0ZVN0eWxlLnNvdXJjZTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxpZ2h0ID0gdmFsaWRhdGVTdHlsZS5saWdodDtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVRlcnJhaW4gPSB2YWxpZGF0ZVN0eWxlLnRlcnJhaW47XG5leHBvcnQgY29uc3QgdmFsaWRhdGVGb2cgPSB2YWxpZGF0ZVN0eWxlLmZvZztcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUZpbHRlciA9IHZhbGlkYXRlU3R5bGUuZmlsdGVyO1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSA9IHZhbGlkYXRlU3R5bGUucGFpbnRQcm9wZXJ0eTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxheW91dFByb3BlcnR5ID0gdmFsaWRhdGVTdHlsZS5sYXlvdXRQcm9wZXJ0eTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVtaXRWYWxpZGF0aW9uRXJyb3JzKGVtaXR0ZXI6IEV2ZW50ZWQsIGVycm9yczogPyRSZWFkT25seUFycmF5PHttZXNzYWdlOiBzdHJpbmcsIGlkZW50aWZpZXI/OiBzdHJpbmd9Pik6IGJvb2xlYW4ge1xuICAgIGxldCBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgIGVtaXR0ZXIuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSkpKTtcbiAgICAgICAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc0Vycm9ycztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBHcmlkSW5kZXg7XG5cbnZhciBOVU1fUEFSQU1TID0gMztcblxuZnVuY3Rpb24gR3JpZEluZGV4KGV4dGVudCwgbiwgcGFkZGluZykge1xuICAgIHZhciBjZWxscyA9IHRoaXMuY2VsbHMgPSBbXTtcblxuICAgIGlmIChleHRlbnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICB0aGlzLmFycmF5QnVmZmVyID0gZXh0ZW50O1xuICAgICAgICB2YXIgYXJyYXkgPSBuZXcgSW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgZXh0ZW50ID0gYXJyYXlbMF07XG4gICAgICAgIG4gPSBhcnJheVsxXTtcbiAgICAgICAgcGFkZGluZyA9IGFycmF5WzJdO1xuXG4gICAgICAgIHRoaXMuZCA9IG4gKyAyICogcGFkZGluZztcbiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmQgKiB0aGlzLmQ7IGsrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gYXJyYXlbTlVNX1BBUkFNUyArIGtdO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGFycmF5W05VTV9QQVJBTVMgKyBrICsgMV07XG4gICAgICAgICAgICBjZWxscy5wdXNoKHN0YXJ0ID09PSBlbmQgP1xuICAgICAgICAgICAgICAgICAgICBudWxsIDpcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkuc3ViYXJyYXkoc3RhcnQsIGVuZCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBrZXlzT2Zmc2V0ID0gYXJyYXlbTlVNX1BBUkFNUyArIGNlbGxzLmxlbmd0aF07XG4gICAgICAgIHZhciBiYm94ZXNPZmZzZXQgPSBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoICsgMV07XG4gICAgICAgIHRoaXMua2V5cyA9IGFycmF5LnN1YmFycmF5KGtleXNPZmZzZXQsIGJib3hlc09mZnNldCk7XG4gICAgICAgIHRoaXMuYmJveGVzID0gYXJyYXkuc3ViYXJyYXkoYmJveGVzT2Zmc2V0KTtcblxuICAgICAgICB0aGlzLmluc2VydCA9IHRoaXMuX2luc2VydFJlYWRvbmx5O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kID0gbiArIDIgKiBwYWRkaW5nO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZCAqIHRoaXMuZDsgaSsrKSB7XG4gICAgICAgICAgICBjZWxscy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5iYm94ZXMgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLm4gPSBuO1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xuICAgIHRoaXMucGFkZGluZyA9IHBhZGRpbmc7XG4gICAgdGhpcy5zY2FsZSA9IG4gLyBleHRlbnQ7XG4gICAgdGhpcy51aWQgPSAwO1xuXG4gICAgdmFyIHAgPSAocGFkZGluZyAvIG4pICogZXh0ZW50O1xuICAgIHRoaXMubWluID0gLXA7XG4gICAgdGhpcy5tYXggPSBleHRlbnQgKyBwO1xufVxuXG5cbkdyaWRJbmRleC5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24oa2V5LCB4MSwgeTEsIHgyLCB5Mikge1xuICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9pbnNlcnRDZWxsLCB0aGlzLnVpZCsrKTtcbiAgICB0aGlzLmtleXMucHVzaChrZXkpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeDEpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeTEpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeDIpO1xuICAgIHRoaXMuYmJveGVzLnB1c2goeTIpO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0UmVhZG9ubHkgPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyAnQ2Fubm90IGluc2VydCBpbnRvIGEgR3JpZEluZGV4IGNyZWF0ZWQgZnJvbSBhbiBBcnJheUJ1ZmZlci4nO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5faW5zZXJ0Q2VsbCA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIHVpZCkge1xuICAgIHRoaXMuY2VsbHNbY2VsbEluZGV4XS5wdXNoKHVpZCk7XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgbWluID0gdGhpcy5taW47XG4gICAgdmFyIG1heCA9IHRoaXMubWF4O1xuICAgIGlmICh4MSA8PSBtaW4gJiYgeTEgPD0gbWluICYmIG1heCA8PSB4MiAmJiBtYXggPD0geTIgJiYgIWludGVyc2VjdGlvblRlc3QpIHtcbiAgICAgICAgLy8gV2UgdXNlIGBBcnJheSNzbGljZWAgYmVjYXVzZSBgdGhpcy5rZXlzYCBtYXkgYmUgYSBgSW50MzJBcnJheWAgYW5kXG4gICAgICAgIC8vIHNvbWUgYnJvd3NlcnMgKFNhZmFyaSBhbmQgSUUpIGRvIG5vdCBzdXBwb3J0IGBUeXBlZEFycmF5I3NsaWNlYFxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9UeXBlZEFycmF5L3NsaWNlI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5rZXlzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgdmFyIHNlZW5VaWRzID0ge307XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9xdWVyeUNlbGwsIHJlc3VsdCwgc2VlblVpZHMsIGludGVyc2VjdGlvblRlc3QpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX3F1ZXJ5Q2VsbCA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIHJlc3VsdCwgc2VlblVpZHMsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbHNbY2VsbEluZGV4XTtcbiAgICBpZiAoY2VsbCAhPT0gbnVsbCkge1xuICAgICAgICB2YXIga2V5cyA9IHRoaXMua2V5cztcbiAgICAgICAgdmFyIGJib3hlcyA9IHRoaXMuYmJveGVzO1xuICAgICAgICBmb3IgKHZhciB1ID0gMDsgdSA8IGNlbGwubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgIHZhciB1aWQgPSBjZWxsW3VdO1xuICAgICAgICAgICAgaWYgKHNlZW5VaWRzW3VpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSB1aWQgKiA0O1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb25UZXN0ID9cbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uVGVzdChiYm94ZXNbb2Zmc2V0ICsgMF0sIGJib3hlc1tvZmZzZXQgKyAxXSwgYmJveGVzW29mZnNldCArIDJdLCBiYm94ZXNbb2Zmc2V0ICsgM10pIDpcbiAgICAgICAgICAgICAgICAgICAgKCh4MSA8PSBiYm94ZXNbb2Zmc2V0ICsgMl0pICYmXG4gICAgICAgICAgICAgICAgICAgICh5MSA8PSBiYm94ZXNbb2Zmc2V0ICsgM10pICYmXG4gICAgICAgICAgICAgICAgICAgICh4MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMF0pICYmXG4gICAgICAgICAgICAgICAgICAgICh5MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMV0pKSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkc1t1aWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5c1t1aWRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkc1t1aWRdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5fZm9yRWFjaENlbGwgPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgZm4sIGFyZzEsIGFyZzIsIGludGVyc2VjdGlvblRlc3QpIHtcbiAgICB2YXIgY3gxID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHgxKTtcbiAgICB2YXIgY3kxID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHkxKTtcbiAgICB2YXIgY3gyID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHgyKTtcbiAgICB2YXIgY3kyID0gdGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHkyKTtcbiAgICBmb3IgKHZhciB4ID0gY3gxOyB4IDw9IGN4MjsgeCsrKSB7XG4gICAgICAgIGZvciAodmFyIHkgPSBjeTE7IHkgPD0gY3kyOyB5KyspIHtcbiAgICAgICAgICAgIHZhciBjZWxsSW5kZXggPSB0aGlzLmQgKiB5ICsgeDtcbiAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb25UZXN0ICYmICFpbnRlcnNlY3Rpb25UZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udmVydEZyb21DZWxsQ29vcmQoeCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZCh5KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKHggKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKHkgKyAxKSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGZuLmNhbGwodGhpcywgeDEsIHkxLCB4MiwgeTIsIGNlbGxJbmRleCwgYXJnMSwgYXJnMiwgaW50ZXJzZWN0aW9uVGVzdCkpIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX2NvbnZlcnRGcm9tQ2VsbENvb3JkID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMucGFkZGluZykgLyB0aGlzLnNjYWxlO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5fY29udmVydFRvQ2VsbENvb3JkID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLmQgLSAxLCBNYXRoLmZsb29yKHggKiB0aGlzLnNjYWxlKSArIHRoaXMucGFkZGluZykpO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS50b0FycmF5QnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuYXJyYXlCdWZmZXIpIHJldHVybiB0aGlzLmFycmF5QnVmZmVyO1xuXG4gICAgdmFyIGNlbGxzID0gdGhpcy5jZWxscztcblxuICAgIHZhciBtZXRhZGF0YUxlbmd0aCA9IE5VTV9QQVJBTVMgKyB0aGlzLmNlbGxzLmxlbmd0aCArIDEgKyAxO1xuICAgIHZhciB0b3RhbENlbGxMZW5ndGggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0b3RhbENlbGxMZW5ndGggKz0gdGhpcy5jZWxsc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIGFycmF5ID0gbmV3IEludDMyQXJyYXkobWV0YWRhdGFMZW5ndGggKyB0b3RhbENlbGxMZW5ndGggKyB0aGlzLmtleXMubGVuZ3RoICsgdGhpcy5iYm94ZXMubGVuZ3RoKTtcbiAgICBhcnJheVswXSA9IHRoaXMuZXh0ZW50O1xuICAgIGFycmF5WzFdID0gdGhpcy5uO1xuICAgIGFycmF5WzJdID0gdGhpcy5wYWRkaW5nO1xuXG4gICAgdmFyIG9mZnNldCA9IG1ldGFkYXRhTGVuZ3RoO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgY2VsbHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGNlbGwgPSBjZWxsc1trXTtcbiAgICAgICAgYXJyYXlbTlVNX1BBUkFNUyArIGtdID0gb2Zmc2V0O1xuICAgICAgICBhcnJheS5zZXQoY2VsbCwgb2Zmc2V0KTtcbiAgICAgICAgb2Zmc2V0ICs9IGNlbGwubGVuZ3RoO1xuICAgIH1cblxuICAgIGFycmF5W05VTV9QQVJBTVMgKyBjZWxscy5sZW5ndGhdID0gb2Zmc2V0O1xuICAgIGFycmF5LnNldCh0aGlzLmtleXMsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHRoaXMua2V5cy5sZW5ndGg7XG5cbiAgICBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoICsgMV0gPSBvZmZzZXQ7XG4gICAgYXJyYXkuc2V0KHRoaXMuYmJveGVzLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSB0aGlzLmJib3hlcy5sZW5ndGg7XG5cbiAgICByZXR1cm4gYXJyYXkuYnVmZmVyO1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IEdyaWQgZnJvbSAnZ3JpZC1pbmRleCc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcbmltcG9ydCB7U3R5bGVQcm9wZXJ0eUZ1bmN0aW9uLCBTdHlsZUV4cHJlc3Npb24sIFpvb21EZXBlbmRlbnRFeHByZXNzaW9uLCBab29tQ29uc3RhbnRFeHByZXNzaW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IENvbXBvdW5kRXhwcmVzc2lvbiBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vY29tcG91bmRfZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgZXhwcmVzc2lvbnMgZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2luZGV4LmpzJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93LmpzJztcbmNvbnN0IHtJbWFnZURhdGEsIEltYWdlQml0bWFwfSA9IHdpbmRvdztcblxuaW1wb3J0IHR5cGUge1RyYW5zZmVyYWJsZX0gZnJvbSAnLi4vdHlwZXMvdHJhbnNmZXJhYmxlLmpzJztcblxudHlwZSBTZXJpYWxpemVkT2JqZWN0ID0ge1tfOiBzdHJpbmddOiBTZXJpYWxpemVkIH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWQgPVxuICAgIHwgbnVsbFxuICAgIHwgdm9pZFxuICAgIHwgYm9vbGVhblxuICAgIHwgbnVtYmVyXG4gICAgfCBzdHJpbmdcbiAgICB8IEJvb2xlYW5cbiAgICB8IE51bWJlclxuICAgIHwgU3RyaW5nXG4gICAgfCBEYXRlXG4gICAgfCBSZWdFeHBcbiAgICB8IEFycmF5QnVmZmVyXG4gICAgfCAkQXJyYXlCdWZmZXJWaWV3XG4gICAgfCBJbWFnZURhdGFcbiAgICB8IEFycmF5PFNlcmlhbGl6ZWQ+XG4gICAgfCBTZXJpYWxpemVkT2JqZWN0O1xuXG50eXBlIFJlZ2lzdHJ5ID0ge1xuICAgIFtfOiBzdHJpbmddOiB7XG4gICAgICAgIGtsYXNzOiBDbGFzczxhbnk+LFxuICAgICAgICBvbWl0OiAkUmVhZE9ubHlBcnJheTxzdHJpbmc+LFxuICAgICAgICBzaGFsbG93OiAkUmVhZE9ubHlBcnJheTxzdHJpbmc+XG4gICAgfVxufTtcblxudHlwZSBSZWdpc3Rlck9wdGlvbnM8VD4gPSB7XG4gICAgb21pdD86ICRSZWFkT25seUFycmF5PCRLZXlzPFQ+PixcbiAgICBzaGFsbG93PzogJFJlYWRPbmx5QXJyYXk8JEtleXM8VD4+XG59XG5cbmNvbnN0IHJlZ2lzdHJ5OiBSZWdpc3RyeSA9IHt9O1xuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBnaXZlbiBjbGFzcyBhcyBzZXJpYWxpemFibGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBvcHRpb25zLm9taXQgTGlzdCBvZiBwcm9wZXJ0aWVzIHRvIG9taXQgZnJvbSBzZXJpYWxpemF0aW9uIChlLmcuLCBjYWNoZWQvY29tcHV0ZWQgcHJvcGVydGllcylcbiAqIEBwYXJhbSBvcHRpb25zLnNoYWxsb3cgTGlzdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgYnkgYSBzaW1wbGUgc2hhbGxvdyBjb3B5LCByYXRoZXIgdGhhbiBieSBhIHJlY3Vyc2l2ZSBjYWxsIHRvIHNlcmlhbGl6ZSgpLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlcjxUOiBhbnk+KG5hbWU6IHN0cmluZywga2xhc3M6IENsYXNzPFQ+LCBvcHRpb25zOiBSZWdpc3Rlck9wdGlvbnM8VD4gPSB7fSkge1xuICAgIGFzc2VydCghcmVnaXN0cnlbbmFtZV0sIGAke25hbWV9IGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5gKTtcbiAgICAoT2JqZWN0LmRlZmluZVByb3BlcnR5OiBhbnkpKGtsYXNzLCAnX2NsYXNzUmVnaXN0cnlLZXknLCB7XG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB3cml0ZWFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgcmVnaXN0cnlbbmFtZV0gPSB7XG4gICAgICAgIGtsYXNzLFxuICAgICAgICBvbWl0OiBvcHRpb25zLm9taXQgfHwgW10sXG4gICAgICAgIHNoYWxsb3c6IG9wdGlvbnMuc2hhbGxvdyB8fCBbXVxuICAgIH07XG59XG5cbnJlZ2lzdGVyKCdPYmplY3QnLCBPYmplY3QpO1xuXG50eXBlIFNlcmlhbGl6ZWRHcmlkID0geyBidWZmZXI6IEFycmF5QnVmZmVyIH07XG5cbkdyaWQuc2VyaWFsaXplID0gZnVuY3Rpb24gc2VyaWFsaXplKGdyaWQ6IEdyaWQsIHRyYW5zZmVyYWJsZXM/OiBBcnJheTxUcmFuc2ZlcmFibGU+KTogU2VyaWFsaXplZEdyaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGdyaWQudG9BcnJheUJ1ZmZlcigpO1xuICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChidWZmZXIpO1xuICAgIH1cbiAgICByZXR1cm4ge2J1ZmZlcn07XG59O1xuXG5HcmlkLmRlc2VyaWFsaXplID0gZnVuY3Rpb24gZGVzZXJpYWxpemUoc2VyaWFsaXplZDogU2VyaWFsaXplZEdyaWQpOiBHcmlkIHtcbiAgICByZXR1cm4gbmV3IEdyaWQoc2VyaWFsaXplZC5idWZmZXIpO1xufTtcbnJlZ2lzdGVyKCdHcmlkJywgR3JpZCk7XG5cbnJlZ2lzdGVyKCdDb2xvcicsIENvbG9yKTtcbnJlZ2lzdGVyKCdFcnJvcicsIEVycm9yKTtcbnJlZ2lzdGVyKCdSZXNvbHZlZEltYWdlJywgUmVzb2x2ZWRJbWFnZSk7XG5cbnJlZ2lzdGVyKCdTdHlsZVByb3BlcnR5RnVuY3Rpb24nLCBTdHlsZVByb3BlcnR5RnVuY3Rpb24pO1xucmVnaXN0ZXIoJ1N0eWxlRXhwcmVzc2lvbicsIFN0eWxlRXhwcmVzc2lvbiwge29taXQ6IFsnX2V2YWx1YXRvciddfSk7XG5cbnJlZ2lzdGVyKCdab29tRGVwZW5kZW50RXhwcmVzc2lvbicsIFpvb21EZXBlbmRlbnRFeHByZXNzaW9uKTtcbnJlZ2lzdGVyKCdab29tQ29uc3RhbnRFeHByZXNzaW9uJywgWm9vbUNvbnN0YW50RXhwcmVzc2lvbik7XG5yZWdpc3RlcignQ29tcG91bmRFeHByZXNzaW9uJywgQ29tcG91bmRFeHByZXNzaW9uLCB7b21pdDogWydfZXZhbHVhdGUnXX0pO1xuZm9yIChjb25zdCBuYW1lIGluIGV4cHJlc3Npb25zKSB7XG4gICAgaWYgKChleHByZXNzaW9uc1tuYW1lXTogYW55KS5fY2xhc3NSZWdpc3RyeUtleSkgY29udGludWU7XG4gICAgcmVnaXN0ZXIoYEV4cHJlc3Npb25fJHtuYW1lfWAsIGV4cHJlc3Npb25zW25hbWVdKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWwgJiYgdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAodmFsIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgKHZhbC5jb25zdHJ1Y3RvciAmJiB2YWwuY29uc3RydWN0b3IubmFtZSA9PT0gJ0FycmF5QnVmZmVyJykpO1xufVxuXG5mdW5jdGlvbiBpc0ltYWdlQml0bWFwKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEltYWdlQml0bWFwICYmXG4gICAgICAgIHZhbCBpbnN0YW5jZW9mIEltYWdlQml0bWFwO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgZ2l2ZW4gb2JqZWN0IGZvciB0cmFuc2ZlciB0byBvciBmcm9tIGEgd2ViIHdvcmtlci5cbiAqXG4gKiBGb3Igbm9uLWJ1aWx0aW4gdHlwZXMsIHJlY3Vyc2l2ZWx5IHNlcmlhbGl6ZSBlYWNoIHByb3BlcnR5IChwb3NzaWJseVxuICogb21pdHRpbmcgY2VydGFpbiBwcm9wZXJ0aWVzIC0gc2VlIHJlZ2lzdGVyKCkpLCBhbmQgcGFja2FnZSB0aGUgcmVzdWx0IGFsb25nXG4gKiB3aXRoIHRoZSBjb25zdHJ1Y3RvcidzIGBuYW1lYCBzbyB0aGF0IHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvciBjYW4gYmVcbiAqIGxvb2tlZCB1cCBpbiBgZGVzZXJpYWxpemUoKWAuXG4gKlxuICogSWYgYSBgdHJhbnNmZXJhYmxlc2AgYXJyYXkgaXMgcHJvdmlkZWQsIGFkZCBhbnkgdHJhbnNmZXJhYmxlIG9iamVjdHMgKGkuZS4sXG4gKiBhbnkgQXJyYXlCdWZmZXJzIG9yIEFycmF5QnVmZmVyIHZpZXdzKSB0byB0aGUgbGlzdC4gKElmIGEgY29weSBpcyBuZWVkZWQsXG4gKiB0aGlzIHNob3VsZCBoYXBwZW4gaW4gdGhlIGNsaWVudCBjb2RlLCBiZWZvcmUgdXNpbmcgc2VyaWFsaXplKCkuKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUoaW5wdXQ6IG1peGVkLCB0cmFuc2ZlcmFibGVzOiA/QXJyYXk8VHJhbnNmZXJhYmxlPik6IFNlcmlhbGl6ZWQge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fFxuICAgICAgICBpbnB1dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEJvb2xlYW4gfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBOdW1iZXIgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheUJ1ZmZlcihpbnB1dCkgfHwgaXNJbWFnZUJpdG1hcChpbnB1dCkpIHtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaCgoKGlucHV0OiBhbnkpOiBBcnJheUJ1ZmZlcikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0KSkge1xuICAgICAgICBjb25zdCB2aWV3OiAkQXJyYXlCdWZmZXJWaWV3ID0gKGlucHV0OiBhbnkpO1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKHZpZXcuYnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlldztcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChpbnB1dC5kYXRhLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkOiBBcnJheTxTZXJpYWxpemVkPiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXQpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChzZXJpYWxpemUoaXRlbSwgdHJhbnNmZXJhYmxlcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGtsYXNzID0gKGlucHV0LmNvbnN0cnVjdG9yOiBhbnkpO1xuICAgICAgICBjb25zdCBuYW1lID0ga2xhc3MuX2NsYXNzUmVnaXN0cnlLZXk7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHVucmVnaXN0ZXJlZCBjbGFzc2ApO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChyZWdpc3RyeVtuYW1lXSk7XG5cbiAgICAgICAgY29uc3QgcHJvcGVydGllczogU2VyaWFsaXplZE9iamVjdCA9IGtsYXNzLnNlcmlhbGl6ZSA/XG4gICAgICAgICAgICAvLyAoVGVtcG9yYXJ5IHdvcmthcm91bmQpIGFsbG93IGEgY2xhc3MgdG8gcHJvdmlkZSBzdGF0aWNcbiAgICAgICAgICAgIC8vIGBzZXJpYWxpemUoKWAgYW5kIGBkZXNlcmlhbGl6ZSgpYCBtZXRob2RzIHRvIGJ5cGFzcyB0aGUgZ2VuZXJpY1xuICAgICAgICAgICAgLy8gYXBwcm9hY2guXG4gICAgICAgICAgICAvLyBUaGlzIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGxldHMgdXMgdXNlIHRoZSBnZW5lcmljIHNlcmlhbGl6YXRpb25cbiAgICAgICAgICAgIC8vIGFwcHJvYWNoIGZvciBvYmplY3RzIHdob3NlIG1lbWJlcnMgaW5jbHVkZSBpbnN0YW5jZXMgb2YgZHluYW1pY1xuICAgICAgICAgICAgLy8gU3RydWN0QXJyYXkgdHlwZXMuIE9uY2Ugd2UgcmVmYWN0b3IgU3RydWN0QXJyYXkgdG8gYmUgc3RhdGljLFxuICAgICAgICAgICAgLy8gd2UgY2FuIHJlbW92ZSB0aGlzIGNvbXBsZXhpdHkuXG4gICAgICAgICAgICAoa2xhc3Muc2VyaWFsaXplKGlucHV0LCB0cmFuc2ZlcmFibGVzKTogU2VyaWFsaXplZE9iamVjdCkgOiB7fTtcblxuICAgICAgICBpZiAoIWtsYXNzLnNlcmlhbGl6ZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICAvLyBhbnkgY2FzdCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzUzOTNcbiAgICAgICAgICAgICAgICBpZiAoIShpbnB1dDogYW55KS5oYXNPd25Qcm9wZXJ0eShrZXkpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAocmVnaXN0cnlbbmFtZV0ub21pdC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSAoaW5wdXQ6IGFueSlba2V5XTtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzW2tleV0gPSByZWdpc3RyeVtuYW1lXS5zaGFsbG93LmluZGV4T2Yoa2V5KSA+PSAwID9cbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgOlxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocHJvcGVydHksIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLm1lc3NhZ2UgPSBpbnB1dC5tZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHN0YXRpY2FsbHkgc2VyaWFsaXplZCBvYmplY3Qgc3Vydml2ZXMgdHJhbnNmZXIgb2YgJG5hbWUgcHJvcGVydHlcbiAgICAgICAgICAgIGFzc2VydCghdHJhbnNmZXJhYmxlcyB8fCBwcm9wZXJ0aWVzICE9PSB0cmFuc2ZlcmFibGVzW3RyYW5zZmVyYWJsZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnRpZXMuJG5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignJG5hbWUgcHJvcGVydHkgaXMgcmVzZXJ2ZWQgZm9yIHdvcmtlciBzZXJpYWxpemF0aW9uIGxvZ2ljLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lICE9PSAnT2JqZWN0Jykge1xuICAgICAgICAgICAgcHJvcGVydGllcy4kbmFtZSA9IG5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbid0IHNlcmlhbGl6ZSBvYmplY3Qgb2YgdHlwZSAke3R5cGVvZiBpbnB1dH1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplKGlucHV0OiBTZXJpYWxpemVkKTogbWl4ZWQge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fFxuICAgICAgICBpbnB1dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIEJvb2xlYW4gfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBOdW1iZXIgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmcgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgICAgIGlzQXJyYXlCdWZmZXIoaW5wdXQpIHx8XG4gICAgICAgIGlzSW1hZ2VCaXRtYXAoaW5wdXQpIHx8XG4gICAgICAgIEFycmF5QnVmZmVyLmlzVmlldyhpbnB1dCkgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICByZXR1cm4gaW5wdXQubWFwKGRlc2VyaWFsaXplKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBuYW1lID0gKGlucHV0OiBhbnkpLiRuYW1lIHx8ICdPYmplY3QnO1xuXG4gICAgICAgIGNvbnN0IHtrbGFzc30gPSByZWdpc3RyeVtuYW1lXTtcbiAgICAgICAgaWYgKCFrbGFzcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBkZXNlcmlhbGl6ZSB1bnJlZ2lzdGVyZWQgY2xhc3MgJHtuYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtsYXNzLmRlc2VyaWFsaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gKGtsYXNzLmRlc2VyaWFsaXplOiB0eXBlb2YgZGVzZXJpYWxpemUpKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUoa2xhc3MucHJvdG90eXBlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICckbmFtZScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoaW5wdXQ6IFNlcmlhbGl6ZWRPYmplY3QpW2tleV07XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHJlZ2lzdHJ5W25hbWVdLnNoYWxsb3cuaW5kZXhPZihrZXkpID49IDAgPyB2YWx1ZSA6IGRlc2VyaWFsaXplKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBkZXNlcmlhbGl6ZSBvYmplY3Qgb2YgdHlwZSAke3R5cGVvZiBpbnB1dH1gKTtcbn1cbiIsIi8vIEBmbG93XG5cbmNsYXNzIFpvb21IaXN0b3J5IHtcbiAgICBsYXN0Wm9vbTogbnVtYmVyO1xuICAgIGxhc3RGbG9vclpvb206IG51bWJlcjtcbiAgICBsYXN0SW50ZWdlclpvb206IG51bWJlcjtcbiAgICBsYXN0SW50ZWdlclpvb21UaW1lOiBudW1iZXI7XG4gICAgZmlyc3Q6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5maXJzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlKHo6IG51bWJlciwgbm93OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZmxvb3JaID0gTWF0aC5mbG9vcih6KTtcblxuICAgICAgICBpZiAodGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICB0aGlzLmxhc3RJbnRlZ2VyWm9vbVRpbWUgPSAwO1xuICAgICAgICAgICAgdGhpcy5sYXN0Wm9vbSA9IHo7XG4gICAgICAgICAgICB0aGlzLmxhc3RGbG9vclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPiBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaICsgMTtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tVGltZSA9IG5vdztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPCBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb21UaW1lID0gbm93O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHogIT09IHRoaXMubGFzdFpvb20pIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFpvb20gPSB6O1xuICAgICAgICAgICAgdGhpcy5sYXN0Rmxvb3Jab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBab29tSGlzdG9yeTtcbiIsIi8vIEBmbG93XG5cbi8vIFRoZSBmb2xsb3dpbmcgdGFibGUgY29tZXMgZnJvbSA8aHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvMTIuMC4wL3VjZC9CbG9ja3MudHh0Pi5cbi8vIEtlZXAgaXQgc3luY2hyb25pemVkIHdpdGggPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL0Jsb2Nrcy50eHQ+LlxuXG50eXBlIFVuaWNvZGVCbG9ja0xvb2t1cCA9IHtba2V5OiBzdHJpbmddOiAoY2hhcjogbnVtYmVyKSA9PiBib29sZWFufTtcblxuY29uc3QgdW5pY29kZUJsb2NrTG9va3VwOiBVbmljb2RlQmxvY2tMb29rdXAgPSB7XG4gICAgLy8gJ0Jhc2ljIExhdGluJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMDAwICYmIGNoYXIgPD0gMHgwMDdGLFxuICAgICdMYXRpbi0xIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDAwODAgJiYgY2hhciA8PSAweDAwRkYsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDAxMDAgJiYgY2hhciA8PSAweDAxN0YsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweDAxODAgJiYgY2hhciA8PSAweDAyNEYsXG4gICAgLy8gJ0lQQSBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMjUwICYmIGNoYXIgPD0gMHgwMkFGLFxuICAgIC8vICdTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDAyQjAgJiYgY2hhciA8PSAweDAyRkYsXG4gICAgLy8gJ0NvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDMwMCAmJiBjaGFyIDw9IDB4MDM2RixcbiAgICAvLyAnR3JlZWsgYW5kIENvcHRpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDM3MCAmJiBjaGFyIDw9IDB4MDNGRixcbiAgICAvLyAnQ3lyaWxsaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDA0MDAgJiYgY2hhciA8PSAweDA0RkYsXG4gICAgLy8gJ0N5cmlsbGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDA1MDAgJiYgY2hhciA8PSAweDA1MkYsXG4gICAgLy8gJ0FybWVuaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNTMwICYmIGNoYXIgPD0gMHgwNThGLFxuICAgIC8vJ0hlYnJldyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDU5MCAmJiBjaGFyIDw9IDB4MDVGRixcbiAgICAnQXJhYmljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNjAwICYmIGNoYXIgPD0gMHgwNkZGLFxuICAgIC8vJ1N5cmlhYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDcwMCAmJiBjaGFyIDw9IDB4MDc0RixcbiAgICAnQXJhYmljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDA3NTAgJiYgY2hhciA8PSAweDA3N0YsXG4gICAgLy8gJ1RoYWFuYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDc4MCAmJiBjaGFyIDw9IDB4MDdCRixcbiAgICAvLyAnTktvJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwN0MwICYmIGNoYXIgPD0gMHgwN0ZGLFxuICAgIC8vICdTYW1hcml0YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDA4MDAgJiYgY2hhciA8PSAweDA4M0YsXG4gICAgLy8gJ01hbmRhaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDA4NDAgJiYgY2hhciA8PSAweDA4NUYsXG4gICAgLy8gJ1N5cmlhYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgwODYwICYmIGNoYXIgPD0gMHgwODZGLFxuICAgICdBcmFiaWMgRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDhBMCAmJiBjaGFyIDw9IDB4MDhGRixcbiAgICAvLyAnRGV2YW5hZ2FyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDkwMCAmJiBjaGFyIDw9IDB4MDk3RixcbiAgICAvLyAnQmVuZ2FsaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDk4MCAmJiBjaGFyIDw9IDB4MDlGRixcbiAgICAvLyAnR3VybXVraGknOiAoY2hhcikgPT4gY2hhciA+PSAweDBBMDAgJiYgY2hhciA8PSAweDBBN0YsXG4gICAgLy8gJ0d1amFyYXRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwQTgwICYmIGNoYXIgPD0gMHgwQUZGLFxuICAgIC8vICdPcml5YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEIwMCAmJiBjaGFyIDw9IDB4MEI3RixcbiAgICAvLyAnVGFtaWwnOiAoY2hhcikgPT4gY2hhciA+PSAweDBCODAgJiYgY2hhciA8PSAweDBCRkYsXG4gICAgLy8gJ1RlbHVndSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEMwMCAmJiBjaGFyIDw9IDB4MEM3RixcbiAgICAvLyAnS2FubmFkYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEM4MCAmJiBjaGFyIDw9IDB4MENGRixcbiAgICAvLyAnTWFsYXlhbGFtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRDAwICYmIGNoYXIgPD0gMHgwRDdGLFxuICAgIC8vICdTaW5oYWxhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRDgwICYmIGNoYXIgPD0gMHgwREZGLFxuICAgIC8vICdUaGFpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRTAwICYmIGNoYXIgPD0gMHgwRTdGLFxuICAgIC8vICdMYW8nOiAoY2hhcikgPT4gY2hhciA+PSAweDBFODAgJiYgY2hhciA8PSAweDBFRkYsXG4gICAgLy8gJ1RpYmV0YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDBGMDAgJiYgY2hhciA8PSAweDBGRkYsXG4gICAgLy8gJ015YW5tYXInOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMDAgJiYgY2hhciA8PSAweDEwOUYsXG4gICAgLy8gJ0dlb3JnaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEEwICYmIGNoYXIgPD0gMHgxMEZGLFxuICAgICdIYW5ndWwgSmFtbyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEwMCAmJiBjaGFyIDw9IDB4MTFGRixcbiAgICAvLyAnRXRoaW9waWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEyMDAgJiYgY2hhciA8PSAweDEzN0YsXG4gICAgLy8gJ0V0aGlvcGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDEzODAgJiYgY2hhciA8PSAweDEzOUYsXG4gICAgLy8gJ0NoZXJva2VlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxM0EwICYmIGNoYXIgPD0gMHgxM0ZGLFxuICAgICdVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNDAwICYmIGNoYXIgPD0gMHgxNjdGLFxuICAgIC8vICdPZ2hhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTY4MCAmJiBjaGFyIDw9IDB4MTY5RixcbiAgICAvLyAnUnVuaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE2QTAgJiYgY2hhciA8PSAweDE2RkYsXG4gICAgLy8gJ1RhZ2Fsb2cnOiAoY2hhcikgPT4gY2hhciA+PSAweDE3MDAgJiYgY2hhciA8PSAweDE3MUYsXG4gICAgLy8gJ0hhbnVub28nOiAoY2hhcikgPT4gY2hhciA+PSAweDE3MjAgJiYgY2hhciA8PSAweDE3M0YsXG4gICAgLy8gJ0J1aGlkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzQwICYmIGNoYXIgPD0gMHgxNzVGLFxuICAgIC8vICdUYWdiYW53YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTc2MCAmJiBjaGFyIDw9IDB4MTc3RixcbiAgICAnS2htZXInOiAoY2hhcikgPT4gY2hhciA+PSAweDE3ODAgJiYgY2hhciA8PSAweDE3RkYsXG4gICAgLy8gJ01vbmdvbGlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTgwMCAmJiBjaGFyIDw9IDB4MThBRixcbiAgICAnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MThCMCAmJiBjaGFyIDw9IDB4MThGRixcbiAgICAvLyAnTGltYnUnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5MDAgJiYgY2hhciA8PSAweDE5NEYsXG4gICAgLy8gJ1RhaSBMZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTk1MCAmJiBjaGFyIDw9IDB4MTk3RixcbiAgICAvLyAnTmV3IFRhaSBMdWUnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5ODAgJiYgY2hhciA8PSAweDE5REYsXG4gICAgLy8gJ0tobWVyIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5RTAgJiYgY2hhciA8PSAweDE5RkYsXG4gICAgLy8gJ0J1Z2luZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQTAwICYmIGNoYXIgPD0gMHgxQTFGLFxuICAgIC8vICdUYWkgVGhhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUEyMCAmJiBjaGFyIDw9IDB4MUFBRixcbiAgICAvLyAnQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIEV4dGVuZGVkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQUIwICYmIGNoYXIgPD0gMHgxQUZGLFxuICAgIC8vICdCYWxpbmVzZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUIwMCAmJiBjaGFyIDw9IDB4MUI3RixcbiAgICAvLyAnU3VuZGFuZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQjgwICYmIGNoYXIgPD0gMHgxQkJGLFxuICAgIC8vICdCYXRhayc6IChjaGFyKSA9PiBjaGFyID49IDB4MUJDMCAmJiBjaGFyIDw9IDB4MUJGRixcbiAgICAvLyAnTGVwY2hhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQzAwICYmIGNoYXIgPD0gMHgxQzRGLFxuICAgIC8vICdPbCBDaGlraSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUM1MCAmJiBjaGFyIDw9IDB4MUM3RixcbiAgICAvLyAnQ3lyaWxsaWMgRXh0ZW5kZWQtQyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUM4MCAmJiBjaGFyIDw9IDB4MUM4RixcbiAgICAvLyAnR2VvcmdpYW4gRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFDOTAgJiYgY2hhciA8PSAweDFDQkYsXG4gICAgLy8gJ1N1bmRhbmVzZSBTdXBwbGVtZW50JzogKGNoYXIpID0+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+IGNoYXIgPj0gMHgxMEM4MCAmJiBjaGFyIDw9IDB4MTBDRkYsXG4gICAgLy8gJ0hhbmlmaSBSb2hpbmd5YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBEMDAgJiYgY2hhciA8PSAweDEwRDNGLFxuICAgIC8vICdSdW1pIE51bWVyYWwgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBFNjAgJiYgY2hhciA8PSAweDEwRTdGLFxuICAgIC8vICdPbGQgU29nZGlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTBGMDAgJiYgY2hhciA8PSAweDEwRjJGLFxuICAgIC8vICdTb2dkaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEYzMCAmJiBjaGFyIDw9IDB4MTBGNkYsXG4gICAgLy8gJ0VseW1haWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwRkUwICYmIGNoYXIgPD0gMHgxMEZGRixcbiAgICAvLyAnQnJhaG1pJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTAwMCAmJiBjaGFyIDw9IDB4MTEwN0YsXG4gICAgLy8gJ0thaXRoaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEwODAgJiYgY2hhciA8PSAweDExMENGLFxuICAgIC8vICdTb3JhIFNvbXBlbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMEQwICYmIGNoYXIgPD0gMHgxMTBGRixcbiAgICAvLyAnQ2hha21hJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTEwMCAmJiBjaGFyIDw9IDB4MTExNEYsXG4gICAgLy8gJ01haGFqYW5pJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTE1MCAmJiBjaGFyIDw9IDB4MTExN0YsXG4gICAgLy8gJ1NoYXJhZGEnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMTgwICYmIGNoYXIgPD0gMHgxMTFERixcbiAgICAvLyAnU2luaGFsYSBBcmNoYWljIE51bWJlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMUUwICYmIGNoYXIgPD0gMHgxMTFGRixcbiAgICAvLyAnS2hvamtpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTIwMCAmJiBjaGFyIDw9IDB4MTEyNEYsXG4gICAgLy8gJ011bHRhbmknOiAoY2hhcikgPT4gY2hhciA+PSAweDExMjgwICYmIGNoYXIgPD0gMHgxMTJBRixcbiAgICAvLyAnS2h1ZGF3YWRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTJCMCAmJiBjaGFyIDw9IDB4MTEyRkYsXG4gICAgLy8gJ0dyYW50aGEnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMzAwICYmIGNoYXIgPD0gMHgxMTM3RixcbiAgICAvLyAnTmV3YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE0MDAgJiYgY2hhciA8PSAweDExNDdGLFxuICAgIC8vICdUaXJodXRhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTQ4MCAmJiBjaGFyIDw9IDB4MTE0REYsXG4gICAgLy8gJ1NpZGRoYW0nOiAoY2hhcikgPT4gY2hhciA+PSAweDExNTgwICYmIGNoYXIgPD0gMHgxMTVGRixcbiAgICAvLyAnTW9kaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2MDAgJiYgY2hhciA8PSAweDExNjVGLFxuICAgIC8vICdNb25nb2xpYW4gU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2NjAgJiYgY2hhciA8PSAweDExNjdGLFxuICAgIC8vICdUYWtyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2ODAgJiYgY2hhciA8PSAweDExNkNGLFxuICAgIC8vICdBaG9tJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTcwMCAmJiBjaGFyIDw9IDB4MTE3M0YsXG4gICAgLy8gJ0RvZ3JhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTgwMCAmJiBjaGFyIDw9IDB4MTE4NEYsXG4gICAgLy8gJ1dhcmFuZyBDaXRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMThBMCAmJiBjaGFyIDw9IDB4MTE4RkYsXG4gICAgLy8gJ05hbmRpbmFnYXJpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTlBMCAmJiBjaGFyIDw9IDB4MTE5RkYsXG4gICAgLy8gJ1phbmFiYXphciBTcXVhcmUnOiAoY2hhcikgPT4gY2hhciA+PSAweDExQTAwICYmIGNoYXIgPD0gMHgxMUE0RixcbiAgICAvLyAnU295b21ibyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTFBNTAgJiYgY2hhciA8PSAweDExQUFGLFxuICAgIC8vICdQYXUgQ2luIEhhdSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTFBQzAgJiYgY2hhciA8PSAweDExQUZGLFxuICAgIC8vICdCaGFpa3N1a2knOiAoY2hhcikgPT4gY2hhciA+PSAweDExQzAwICYmIGNoYXIgPD0gMHgxMUM2RixcbiAgICAvLyAnTWFyY2hlbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTFDNzAgJiYgY2hhciA8PSAweDExQ0JGLFxuICAgIC8vICdNYXNhcmFtIEdvbmRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUQwMCAmJiBjaGFyIDw9IDB4MTFENUYsXG4gICAgLy8gJ0d1bmphbGEgR29uZGknOiAoY2hhcikgPT4gY2hhciA+PSAweDExRDYwICYmIGNoYXIgPD0gMHgxMURBRixcbiAgICAvLyAnTWFrYXNhcic6IChjaGFyKSA9PiBjaGFyID49IDB4MTFFRTAgJiYgY2hhciA8PSAweDExRUZGLFxuICAgIC8vICdUYW1pbCBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUZDMCAmJiBjaGFyIDw9IDB4MTFGRkYsXG4gICAgLy8gJ0N1bmVpZm9ybSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTIwMDAgJiYgY2hhciA8PSAweDEyM0ZGLFxuICAgIC8vICdDdW5laWZvcm0gTnVtYmVycyBhbmQgUHVuY3R1YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDEyNDAwICYmIGNoYXIgPD0gMHgxMjQ3RixcbiAgICAvLyAnRWFybHkgRHluYXN0aWMgQ3VuZWlmb3JtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMjQ4MCAmJiBjaGFyIDw9IDB4MTI1NEYsXG4gICAgLy8gJ0VneXB0aWFuIEhpZXJvZ2x5cGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMzAwMCAmJiBjaGFyIDw9IDB4MTM0MkYsXG4gICAgLy8gJ0VneXB0aWFuIEhpZXJvZ2x5cGggRm9ybWF0IENvbnRyb2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMzQzMCAmJiBjaGFyIDw9IDB4MTM0M0YsXG4gICAgLy8gJ0FuYXRvbGlhbiBIaWVyb2dseXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTQ0MDAgJiYgY2hhciA8PSAweDE0NjdGLFxuICAgIC8vICdCYW11bSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNjgwMCAmJiBjaGFyIDw9IDB4MTZBM0YsXG4gICAgLy8gJ01ybyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTZBNDAgJiYgY2hhciA8PSAweDE2QTZGLFxuICAgIC8vICdCYXNzYSBWYWgnOiAoY2hhcikgPT4gY2hhciA+PSAweDE2QUQwICYmIGNoYXIgPD0gMHgxNkFGRixcbiAgICAvLyAnUGFoYXdoIEhtb25nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkIwMCAmJiBjaGFyIDw9IDB4MTZCOEYsXG4gICAgLy8gJ01lZGVmYWlkcmluJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkU0MCAmJiBjaGFyIDw9IDB4MTZFOUYsXG4gICAgLy8gJ01pYW8nOiAoY2hhcikgPT4gY2hhciA+PSAweDE2RjAwICYmIGNoYXIgPD0gMHgxNkY5RixcbiAgICAvLyAnSWRlb2dyYXBoaWMgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDE2RkUwICYmIGNoYXIgPD0gMHgxNkZGRixcbiAgICAvLyAnVGFuZ3V0JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzAwMCAmJiBjaGFyIDw9IDB4MTg3RkYsXG4gICAgLy8gJ1Rhbmd1dCBDb21wb25lbnRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxODgwMCAmJiBjaGFyIDw9IDB4MThBRkYsXG4gICAgLy8gJ0thbmEgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUIwMDAgJiYgY2hhciA8PSAweDFCMEZGLFxuICAgIC8vICdLYW5hIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDFCMTAwICYmIGNoYXIgPD0gMHgxQjEyRixcbiAgICAvLyAnU21hbGwgS2FuYSBFeHRlbnNpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDFCMTMwICYmIGNoYXIgPD0gMHgxQjE2RixcbiAgICAvLyAnTnVzaHUnOiAoY2hhcikgPT4gY2hhciA+PSAweDFCMTcwICYmIGNoYXIgPD0gMHgxQjJGRixcbiAgICAvLyAnRHVwbG95YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDFCQzAwICYmIGNoYXIgPD0gMHgxQkM5RixcbiAgICAvLyAnU2hvcnRoYW5kIEZvcm1hdCBDb250cm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUJDQTAgJiYgY2hhciA8PSAweDFCQ0FGLFxuICAgIC8vICdCeXphbnRpbmUgTXVzaWNhbCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDAwMCAmJiBjaGFyIDw9IDB4MUQwRkYsXG4gICAgLy8gJ011c2ljYWwgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQxMDAgJiYgY2hhciA8PSAweDFEMUZGLFxuICAgIC8vICdBbmNpZW50IEdyZWVrIE11c2ljYWwgTm90YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMjAwICYmIGNoYXIgPD0gMHgxRDI0RixcbiAgICAvLyAnTWF5YW4gTnVtZXJhbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMkUwICYmIGNoYXIgPD0gMHgxRDJGRixcbiAgICAvLyAnVGFpIFh1YW4gSmluZyBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDMwMCAmJiBjaGFyIDw9IDB4MUQzNUYsXG4gICAgLy8gJ0NvdW50aW5nIFJvZCBOdW1lcmFscyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQzNjAgJiYgY2hhciA8PSAweDFEMzdGLFxuICAgIC8vICdNYXRoZW1hdGljYWwgQWxwaGFudW1lcmljIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFENDAwICYmIGNoYXIgPD0gMHgxRDdGRixcbiAgICAvLyAnU3V0dG9uIFNpZ25Xcml0aW5nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDgwMCAmJiBjaGFyIDw9IDB4MURBQUYsXG4gICAgLy8gJ0dsYWdvbGl0aWMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUUwMDAgJiYgY2hhciA8PSAweDFFMDJGLFxuICAgIC8vICdOeWlha2VuZyBQdWFjaHVlIEhtb25nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTEwMCAmJiBjaGFyIDw9IDB4MUUxNEYsXG4gICAgLy8gJ1dhbmNobyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUUyQzAgJiYgY2hhciA8PSAweDFFMkZGLFxuICAgIC8vICdNZW5kZSBLaWtha3VpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTgwMCAmJiBjaGFyIDw9IDB4MUU4REYsXG4gICAgLy8gJ0FkbGFtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTkwMCAmJiBjaGFyIDw9IDB4MUU5NUYsXG4gICAgLy8gJ0luZGljIFNpeWFxIE51bWJlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFFQzcwICYmIGNoYXIgPD0gMHgxRUNCRixcbiAgICAvLyAnT3R0b21hbiBTaXlhcSBOdW1iZXJzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRUQwMCAmJiBjaGFyIDw9IDB4MUVENEYsXG4gICAgLy8gJ0FyYWJpYyBNYXRoZW1hdGljYWwgQWxwaGFiZXRpYyBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRUUwMCAmJiBjaGFyIDw9IDB4MUVFRkYsXG4gICAgLy8gJ01haGpvbmcgVGlsZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMDAwICYmIGNoYXIgPD0gMHgxRjAyRixcbiAgICAvLyAnRG9taW5vIFRpbGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjAzMCAmJiBjaGFyIDw9IDB4MUYwOUYsXG4gICAgLy8gJ1BsYXlpbmcgQ2FyZHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMEEwICYmIGNoYXIgPD0gMHgxRjBGRixcbiAgICAvLyAnRW5jbG9zZWQgQWxwaGFudW1lcmljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMTAwICYmIGNoYXIgPD0gMHgxRjFGRixcbiAgICAvLyAnRW5jbG9zZWQgSWRlb2dyYXBoaWMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYyMDAgJiYgY2hhciA8PSAweDFGMkZGLFxuICAgIC8vICdNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjMwMCAmJiBjaGFyIDw9IDB4MUY1RkYsXG4gICAgLy8gJ0Vtb3RpY29ucyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY2MDAgJiYgY2hhciA8PSAweDFGNjRGLFxuICAgIC8vICdPcm5hbWVudGFsIERpbmdiYXRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjY1MCAmJiBjaGFyIDw9IDB4MUY2N0YsXG4gICAgLy8gJ1RyYW5zcG9ydCBhbmQgTWFwIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGNjgwICYmIGNoYXIgPD0gMHgxRjZGRixcbiAgICAvLyAnQWxjaGVtaWNhbCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjcwMCAmJiBjaGFyIDw9IDB4MUY3N0YsXG4gICAgLy8gJ0dlb21ldHJpYyBTaGFwZXMgRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGNzgwICYmIGNoYXIgPD0gMHgxRjdGRixcbiAgICAvLyAnU3VwcGxlbWVudGFsIEFycm93cy1DJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjgwMCAmJiBjaGFyIDw9IDB4MUY4RkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBTeW1ib2xzIGFuZCBQaWN0b2dyYXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY5MDAgJiYgY2hhciA8PSAweDFGOUZGLFxuICAgIC8vICdDaGVzcyBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRkEwMCAmJiBjaGFyIDw9IDB4MUZBNkYsXG4gICAgLy8gJ1N5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGQTcwICYmIGNoYXIgPD0gMHgxRkFGRixcbiAgICAvLyAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQic6IChjaGFyKSA9PiBjaGFyID49IDB4MjAwMDAgJiYgY2hhciA8PSAweDJBNkRGLFxuICAgIC8vICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBDJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQTcwMCAmJiBjaGFyIDw9IDB4MkI3M0YsXG4gICAgLy8gJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEQnOiAoY2hhcikgPT4gY2hhciA+PSAweDJCNzQwICYmIGNoYXIgPD0gMHgyQjgxRixcbiAgICAvLyAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gRSc6IChjaGFyKSA9PiBjaGFyID49IDB4MkI4MjAgJiYgY2hhciA8PSAweDJDRUFGLFxuICAgIC8vICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBGJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQ0VCMCAmJiBjaGFyIDw9IDB4MkVCRUYsXG4gICAgLy8gJ0NKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MkY4MDAgJiYgY2hhciA8PSAweDJGQTFGLFxuICAgIC8vICdUYWdzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhFMDAwMCAmJiBjaGFyIDw9IDB4RTAwN0YsXG4gICAgLy8gJ1ZhcmlhdGlvbiBTZWxlY3RvcnMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4RTAxMDAgJiYgY2hhciA8PSAweEUwMUVGLFxuICAgIC8vICdTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4RjAwMDAgJiYgY2hhciA8PSAweEZGRkZGLFxuICAgIC8vICdTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQic6IChjaGFyKSA9PiBjaGFyID49IDB4MTAwMDAwICYmIGNoYXIgPD0gMHgxMEZGRkYsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB1bmljb2RlQmxvY2tMb29rdXA7XG4iLCIvLyBAZmxvd1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5cbmltcG9ydCBpc0NoYXIgZnJvbSAnLi9pc19jaGFyX2luX3VuaWNvZGVfYmxvY2suanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyhjaGFyczogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGNoYXJzKSB7XG4gICAgICAgIGlmICghY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcoY2hhci5jaGFyQ29kZUF0KDApKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUoY2hhcnM6IHN0cmluZykge1xuICAgIGZvciAoY29uc3QgY2hhciBvZiBjaGFycykge1xuICAgICAgICBpZiAoY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXIuY2hhckNvZGVBdCgwKSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGxvd3NMZXR0ZXJTcGFjaW5nKGNoYXJzOiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgICAgaWYgKCFjaGFyQWxsb3dzTGV0dGVyU3BhY2luZyhjaGFyLmNoYXJDb2RlQXQoMCkpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhckFsbG93c0xldHRlclNwYWNpbmcoY2hhcjogbnVtYmVyKSB7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljJ10oY2hhcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaXNDaGFyWydBcmFiaWMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljIEV4dGVuZGVkLUEnXShjaGFyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpc0NoYXJbJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSddKGNoYXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJ10oY2hhcikpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcoY2hhcjogbnVtYmVyKSB7XG4gICAgLy8gUmV0dXJuIGVhcmx5IGZvciBjaGFyYWN0ZXJzIG91dHNpZGUgYWxsIGlkZW9ncmFwaGljIHJhbmdlcy5cbiAgICBpZiAoY2hhciA8IDB4MkU4MCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8gRXh0ZW5kZWQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgUmFkaWNhbHMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3Ryb2tlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGlyYWdhbmEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5neGkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydWZXJ0aWNhbCBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBTeWxsYWJsZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgbG9naWMgY29tZXMgZnJvbVxuLy8gPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzEyLjAuMC91Y2QvVmVydGljYWxPcmllbnRhdGlvbi50eHQ+LlxuLy8gS2VlcCBpdCBzeW5jaHJvbml6ZWQgd2l0aFxuLy8gPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL1ZlcnRpY2FsT3JpZW50YXRpb24udHh0Pi5cbi8vIFRoZSBkYXRhIGZpbGUgZGVub3RlcyB3aXRoIOKAnFXigJ0gb3Ig4oCcVHXigJ0gYW55IGNvZGVwb2ludCB0aGF0IG1heSBiZSBkcmF3blxuLy8gdXByaWdodCBpbiB2ZXJ0aWNhbCB0ZXh0IGJ1dCBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVwcmlnaHQgYW5kXG4vLyDigJxuZXV0cmFs4oCdIGNoYXJhY3RlcnMuXG5cbi8vIEJsb2NrcyBpbiB0aGUgVW5pY29kZSBzdXBwbGVtZW50YXJ5IHBsYW5lcyBhcmUgZXhjbHVkZWQgZnJvbSB0aGlzIG1vZHVsZSBkdWVcbi8vIHRvIDxodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC9pc3N1ZXMvMjk+LlxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlcG9pbnQgaWRlbnRpZmllcyBhIGNoYXJhY3RlciB3aXRoXG4gKiB1cHJpZ2h0IG9yaWVudGF0aW9uLlxuICpcbiAqIEEgY2hhcmFjdGVyIGhhcyB1cHJpZ2h0IG9yaWVudGF0aW9uIGlmIGl0IGlzIGRyYXduIHVwcmlnaHQgKHVucm90YXRlZClcbiAqIHdoZXRoZXIgdGhlIGxpbmUgaXMgb3JpZW50ZWQgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHksIGV2ZW4gaWYgYm90aFxuICogYWRqYWNlbnQgY2hhcmFjdGVycyBjYW4gYmUgcm90YXRlZC4gRm9yIGV4YW1wbGUsIGEgQ2hpbmVzZSBjaGFyYWN0ZXIgaXNcbiAqIGFsd2F5cyBkcmF3biB1cHJpZ2h0LiBBbiB1cHJpZ2h0bHkgb3JpZW50ZWQgY2hhcmFjdGVyIGNhdXNlcyBhbiBhZGphY2VudFxuICog4oCcbmV1dHJhbOKAnSBjaGFyYWN0ZXIgdG8gYmUgZHJhd24gdXByaWdodCBhcyB3ZWxsLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjaGFyOiBudW1iZXIpIHtcbiAgICBpZiAoY2hhciA9PT0gMHgwMkVBIC8qIG1vZGlmaWVyIGxldHRlciB5aW4gZGVwYXJ0aW5nIHRvbmUgbWFyayAqLyB8fFxuICAgICAgICBjaGFyID09PSAweDAyRUIgLyogbW9kaWZpZXIgbGV0dGVyIHlhbmcgZGVwYXJ0aW5nIHRvbmUgbWFyayAqLykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gZWFybHkgZm9yIGNoYXJhY3RlcnMgb3V0c2lkZSBhbGwgcmFuZ2VzIHdob3NlIGNoYXJhY3RlcnMgcmVtYWluXG4gICAgLy8gdXByaWdodCBpbiB2ZXJ0aWNhbCB3cml0aW5nIG1vZGUuXG4gICAgaWYgKGNoYXIgPCAweDExMDApIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChpc0NoYXJbJ0JvcG9tb2ZvIEV4dGVuZGVkJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0JvcG9tb2ZvJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHhGRTQ5IC8qIGRhc2hlZCBvdmVybGluZSAqLyAmJiBjaGFyIDw9IDB4RkU0RikgLyogd2F2eSBsb3cgbGluZSAqLykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHknXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFN0cm9rZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHgzMDA4IC8qIGxlZnQgYW5nbGUgYnJhY2tldCAqLyAmJiBjaGFyIDw9IDB4MzAxMSkgLyogcmlnaHQgYmxhY2sgbGVudGljdWxhciBicmFja2V0ICovKSAmJlxuICAgICAgICAgICAgISgoY2hhciA+PSAweDMwMTQgLyogbGVmdCB0b3J0b2lzZSBzaGVsbCBicmFja2V0ICovICYmIGNoYXIgPD0gMHgzMDFGKSAvKiBsb3cgZG91YmxlIHByaW1lIHF1b3RhdGlvbiBtYXJrICovKSAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHgzMDMwIC8qIHdhdnkgZGFzaCAqLykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIYW5ndWwgSmFtbyBFeHRlbmRlZC1BJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbmd1bCBKYW1vIEV4dGVuZGVkLUInXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIEphbW8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIFN5bGxhYmxlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIaXJhZ2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0thbmJ1biddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5neGkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyICE9PSAweDMwRkMgLyoga2F0YWthbmEtaGlyYWdhbmEgcHJvbG9uZ2VkIHNvdW5kIG1hcmsgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0hhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKGNoYXIgIT09IDB4RkYwOCAvKiBmdWxsd2lkdGggbGVmdCBwYXJlbnRoZXNpcyAqLyAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjA5IC8qIGZ1bGx3aWR0aCByaWdodCBwYXJlbnRoZXNpcyAqLyAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjBEIC8qIGZ1bGx3aWR0aCBoeXBoZW4tbWludXMgKi8gJiZcbiAgICAgICAgICAgICEoKGNoYXIgPj0gMHhGRjFBIC8qIGZ1bGx3aWR0aCBjb2xvbiAqLyAmJiBjaGFyIDw9IDB4RkYxRSkgLyogZnVsbHdpZHRoIGdyZWF0ZXItdGhhbiBzaWduICovKSAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjNCIC8qIGZ1bGx3aWR0aCBsZWZ0IHNxdWFyZSBicmFja2V0ICovICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGM0QgLyogZnVsbHdpZHRoIHJpZ2h0IHNxdWFyZSBicmFja2V0ICovICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGM0YgLyogZnVsbHdpZHRoIGxvdyBsaW5lICovICYmXG4gICAgICAgICAgICAhKGNoYXIgPj0gMHhGRjVCIC8qIGZ1bGx3aWR0aCBsZWZ0IGN1cmx5IGJyYWNrZXQgKi8gJiYgY2hhciA8PSAweEZGREYpICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGRTMgLyogZnVsbHdpZHRoIG1hY3JvbiAqLyAmJlxuICAgICAgICAgICAgIShjaGFyID49IDB4RkZFOCAvKiBoYWxmd2lkdGggZm9ybXMgbGlnaHQgdmVydGljYWwgKi8gJiYgY2hhciA8PSAweEZGRUYpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydTbWFsbCBGb3JtIFZhcmlhbnRzJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHhGRTU4IC8qIHNtYWxsIGVtIGRhc2ggKi8gJiYgY2hhciA8PSAweEZFNUUpIC8qIHNtYWxsIHJpZ2h0IHRvcnRvaXNlIHNoZWxsIGJyYWNrZXQgKi8pICYmXG4gICAgICAgICAgICAhKChjaGFyID49IDB4RkU2MyAvKiBzbWFsbCBoeXBoZW4tbWludXMgKi8gJiYgY2hhciA8PSAweEZFNjYpIC8qIHNtYWxsIGVxdWFscyBzaWduICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzIEV4dGVuZGVkJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1ZlcnRpY2FsIEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1lpamluZyBIZXhhZ3JhbSBTeW1ib2xzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1lpIFN5bGxhYmxlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFVuaWNvZGUgY29kZXBvaW50IGlkZW50aWZpZXMgYSBjaGFyYWN0ZXIgd2l0aFxuICogbmV1dHJhbCBvcmllbnRhdGlvbi5cbiAqXG4gKiBBIGNoYXJhY3RlciBoYXMgbmV1dHJhbCBvcmllbnRhdGlvbiBpZiBpdCBtYXkgYmUgZHJhd24gcm90YXRlZCBvciB1bnJvdGF0ZWRcbiAqIHdoZW4gdGhlIGxpbmUgaXMgb3JpZW50ZWQgdmVydGljYWxseSwgZGVwZW5kaW5nIG9uIHRoZSBvcmllbnRhdGlvbiBvZiB0aGVcbiAqIGFkamFjZW50IGNoYXJhY3RlcnMuIEZvciBleGFtcGxlLCBhbG9uZyBhIHZlcnRpY2xseSBvcmllbnRlZCBsaW5lLCB0aGUgdnVsZ2FyXG4gKiBmcmFjdGlvbiDCvSBpcyBkcmF3biB1cHJpZ2h0IGFtb25nIENoaW5lc2UgY2hhcmFjdGVycyBidXQgcm90YXRlZCBhbW9uZyBMYXRpblxuICogbGV0dGVycy4gQSBuZXV0cmFsbHkgb3JpZW50ZWQgY2hhcmFjdGVyIGRvZXMgbm90IGluZmx1ZW5jZSB3aGV0aGVyIGFuXG4gKiBhZGphY2VudCBjaGFyYWN0ZXIgaXMgZHJhd24gdXByaWdodCBvciByb3RhdGVkLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXJIYXNOZXV0cmFsVmVydGljYWxPcmllbnRhdGlvbihjaGFyOiBudW1iZXIpIHtcbiAgICBpZiAoaXNDaGFyWydMYXRpbi0xIFN1cHBsZW1lbnQnXShjaGFyKSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gMHgwMEE3IC8qIHNlY3Rpb24gc2lnbiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEE5IC8qIGNvcHlyaWdodCBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQUUgLyogcmVnaXN0ZXJlZCBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQjEgLyogcGx1cy1taW51cyBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQkMgLyogdnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQkQgLyogdnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQkUgLyogdnVsZ2FyIGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwRDcgLyogbXVsdGlwbGljYXRpb24gc2lnbiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEY3IC8qIGRpdmlzaW9uIHNpZ24gKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0dlbmVyYWwgUHVuY3R1YXRpb24nXShjaGFyKSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gMHgyMDE2IC8qIGRvdWJsZSB2ZXJ0aWNhbCBsaW5lICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMjAgLyogZGFnZ2VyICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMjEgLyogZG91YmxlIGRhZ2dlciAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDMwIC8qIHBlciBtaWxsZSBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMzEgLyogcGVyIHRlbiB0aG91c2FuZCBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwM0IgLyogcmVmZXJlbmNlIG1hcmsgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAzQyAvKiBkb3VibGUgZXhjbGFtYXRpb24gbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDQyIC8qIGFzdGVyaXNtICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNDcgLyogZG91YmxlIHF1ZXN0aW9uIG1hcmsgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjA0OCAvKiBxdWVzdGlvbiBleGNsYW1hdGlvbiBtYXJrICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNDkgLyogZXhjbGFtYXRpb24gcXVlc3Rpb24gbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDUxIC8qIHR3byBhc3Rlcmlza3MgYWxpZ25lZCB2ZXJ0aWNhbGx5ICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydMZXR0ZXJsaWtlIFN5bWJvbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnTnVtYmVyIEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ01pc2NlbGxhbmVvdXMgVGVjaG5pY2FsJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKChjaGFyID49IDB4MjMwMCAvKiBkaWFtZXRlciBzaWduICovICYmIGNoYXIgPD0gMHgyMzA3IC8qIHdhdnkgbGluZSAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjMwQyAvKiBib3R0b20gcmlnaHQgY3JvcCAqLyAmJiBjaGFyIDw9IDB4MjMxRiAvKiBib3R0b20gcmlnaHQgY29ybmVyICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyMzI0IC8qIHVwIGFycm93aGVhZCBiZXR3ZWVuIHR3byBob3Jpem9udGFsIGJhcnMgKi8gJiYgY2hhciA8PSAweDIzMjggLyoga2V5Ym9hcmQgKi8pIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIzMkIgLyogZXJhc2UgdG8gdGhlIGxlZnQgKi8gfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjM3RCAvKiBzaG91bGRlcmVkIG9wZW4gYm94ICovICYmIGNoYXIgPD0gMHgyMzlBIC8qIGNsZWFyIHNjcmVlbiBzeW1ib2wgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzQkUgLyogZGVudGlzdHJ5IHN5bWJvbCBsaWdodCB2ZXJ0aWNhbCBhbmQgdG9wIHJpZ2h0ICovICYmIGNoYXIgPD0gMHgyM0NEIC8qIHNxdWFyZSBmb290ICovKSB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyM0NGIC8qIGVqZWN0IHN5bWJvbCAqLyB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyM0QxIC8qIG1ldHJpY2FsIGJyZXZlICovICYmIGNoYXIgPD0gMHgyM0RCIC8qIGZ1c2UgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzRTIgLyogd2hpdGUgdHJhcGV6aXVtICovICYmIGNoYXIgPD0gMHgyM0ZGKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnQ29udHJvbCBQaWN0dXJlcyddKGNoYXIpICYmIGNoYXIgIT09IDB4MjQyMyAvKiBvcGVuIGJveCAqLykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnRW5jbG9zZWQgQWxwaGFudW1lcmljcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydHZW9tZXRyaWMgU2hhcGVzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ01pc2NlbGxhbmVvdXMgU3ltYm9scyddKGNoYXIpKSB7XG4gICAgICAgIGlmICghKChjaGFyID49IDB4MjYxQSAvKiBibGFjayBsZWZ0IHBvaW50aW5nIGluZGV4ICovICYmIGNoYXIgPD0gMHgyNjFGKSAvKiB3aGl0ZSBkb3duIHBvaW50aW5nIGluZGV4ICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnTWlzY2VsbGFuZW91cyBTeW1ib2xzIGFuZCBBcnJvd3MnXShjaGFyKSkge1xuICAgICAgICBpZiAoKGNoYXIgPj0gMHgyQjEyIC8qIHNxdWFyZSB3aXRoIHRvcCBoYWxmIGJsYWNrICovICYmIGNoYXIgPD0gMHgyQjJGIC8qIHdoaXRlIHZlcnRpY2FsIGVsbGlwc2UgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDJCNTAgLyogd2hpdGUgbWVkaXVtIHN0YXIgKi8gJiYgY2hhciA8PSAweDJCNTkgLyogaGVhdnkgY2lyY2xlZCBzYWx0aXJlICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyQkI4IC8qIHVwd2FyZHMgd2hpdGUgYXJyb3cgZnJvbSBiYXIgd2l0aCBob3Jpem9udGFsIGJhciAqLyAmJiBjaGFyIDw9IDB4MkJFQikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydQcml2YXRlIFVzZSBBcmVhJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1NtYWxsIEZvcm0gVmFyaWFudHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICBpZiAoY2hhciA9PT0gMHgyMjFFIC8qIGluZmluaXR5ICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4MjIzNCAvKiB0aGVyZWZvcmUgKi8gfHxcbiAgICAgICAgY2hhciA9PT0gMHgyMjM1IC8qIGJlY2F1c2UgKi8gfHxcbiAgICAgICAgKGNoYXIgPj0gMHgyNzAwIC8qIGJsYWNrIHNhZmV0eSBzY2lzc29ycyAqLyAmJiBjaGFyIDw9IDB4Mjc2NyAvKiByb3RhdGVkIGZsb3JhbCBoZWFydCBidWxsZXQgKi8pIHx8XG4gICAgICAgIChjaGFyID49IDB4Mjc3NiAvKiBkaW5nYmF0IG5lZ2F0aXZlIGNpcmNsZWQgZGlnaXQgb25lICovICYmIGNoYXIgPD0gMHgyNzkzIC8qIGRpbmdiYXQgbmVnYXRpdmUgY2lyY2xlZCBzYW5zLXNlcmlmIG51bWJlciB0ZW4gKi8pIHx8XG4gICAgICAgIGNoYXIgPT09IDB4RkZGQyAvKiBvYmplY3QgcmVwbGFjZW1lbnQgY2hhcmFjdGVyICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4RkZGRCAvKiByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKi8pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlcG9pbnQgaWRlbnRpZmllcyBhIGNoYXJhY3RlciB3aXRoXG4gKiByb3RhdGVkIG9yaWVudGF0aW9uLlxuICpcbiAqIEEgY2hhcmFjdGVyIGhhcyByb3RhdGVkIG9yaWVudGF0aW9uIGlmIGl0IGlzIGRyYXduIHJvdGF0ZWQgd2hlbiB0aGUgbGluZSBpc1xuICogb3JpZW50ZWQgdmVydGljYWxseSwgZXZlbiBpZiBib3RoIGFkamFjZW50IGNoYXJhY3RlcnMgYXJlIHVwcmlnaHQuIEZvclxuICogZXhhbXBsZSwgYSBMYXRpbiBsZXR0ZXIgaXMgZHJhd24gcm90YXRlZCBhbG9uZyBhIHZlcnRpY2FsIGxpbmUuIEEgcm90YXRlZFxuICogY2hhcmFjdGVyIGNhdXNlcyBhbiBhZGphY2VudCDigJxuZXV0cmFs4oCdIGNoYXJhY3RlciB0byBiZSBkcmF3biByb3RhdGVkIGFzIHdlbGwuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhckhhc1JvdGF0ZWRWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXI6IG51bWJlcikge1xuICAgIHJldHVybiAhKGNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjaGFyKSB8fFxuICAgICAgICAgICAgIGNoYXJIYXNOZXV0cmFsVmVydGljYWxPcmllbnRhdGlvbihjaGFyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFySW5Db21wbGV4U2hhcGluZ1NjcmlwdChjaGFyOiBudW1iZXIpIHtcbiAgICByZXR1cm4gaXNDaGFyWydBcmFiaWMnXShjaGFyKSB8fFxuICAgICAgICAgICBpc0NoYXJbJ0FyYWJpYyBTdXBwbGVtZW50J10oY2hhcikgfHxcbiAgICAgICAgICAgaXNDaGFyWydBcmFiaWMgRXh0ZW5kZWQtQSddKGNoYXIpIHx8XG4gICAgICAgICAgIGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BJ10oY2hhcikgfHxcbiAgICAgICAgICAgaXNDaGFyWydBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUInXShjaGFyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJJblJUTFNjcmlwdChjaGFyOiBudW1iZXIpIHtcbiAgICAvLyBNYWluIGJsb2NrcyBmb3IgSGVicmV3LCBBcmFiaWMsIFRoYWFuYSBhbmQgb3RoZXIgUlRMIHNjcmlwdHNcbiAgICByZXR1cm4gKGNoYXIgPj0gMHgwNTkwICYmIGNoYXIgPD0gMHgwOEZGKSB8fFxuICAgICAgICBpc0NoYXJbJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSddKGNoYXIpIHx8XG4gICAgICAgIGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJ10oY2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFySW5TdXBwb3J0ZWRTY3JpcHQoY2hhcjogbnVtYmVyLCBjYW5SZW5kZXJSVEw6IGJvb2xlYW4pIHtcbiAgICAvLyBUaGlzIGlzIGEgcm91Z2ggaGV1cmlzdGljOiB3aGV0aGVyIHdlIFwiY2FuIHJlbmRlclwiIGEgc2NyaXB0XG4gICAgLy8gYWN0dWFsbHkgZGVwZW5kcyBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgZm9udCBiZWluZyB1c2VkXG4gICAgLy8gYW5kIHdoZXRoZXIgZGlmZmVyZW5jZXMgZnJvbSB0aGUgaWRlYWwgcmVuZGVyaW5nIGFyZSBjb25zaWRlcmVkXG4gICAgLy8gc2VtYW50aWNhbGx5IHNpZ25pZmljYW50LlxuXG4gICAgLy8gRXZlbiBpbiBMYXRpbiBzY3JpcHQsIHdlIFwiY2FuJ3QgcmVuZGVyXCIgY29tYmluYXRpb25zIHN1Y2ggYXMgdGhlIGZpXG4gICAgLy8gbGlnYXR1cmUsIGJ1dCB3ZSBkb24ndCBjb25zaWRlciB0aGF0IHNlbWFudGljYWxseSBzaWduaWZpY2FudC5cbiAgICBpZiAoIWNhblJlbmRlclJUTCAmJiBjaGFySW5SVExTY3JpcHQoY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoKGNoYXIgPj0gMHgwOTAwICYmIGNoYXIgPD0gMHgwREZGKSB8fFxuICAgICAgICAvLyBNYWluIGJsb2NrcyBmb3IgSW5kaWMgc2NyaXB0cyBhbmQgU2luaGFsYVxuICAgICAgICAoY2hhciA+PSAweDBGMDAgJiYgY2hhciA8PSAweDEwOUYpIHx8XG4gICAgICAgIC8vIE1haW4gYmxvY2tzIGZvciBUaWJldGFuIGFuZCBNeWFubWFyXG4gICAgICAgIGlzQ2hhclsnS2htZXInXShjaGFyKSkge1xuICAgICAgICAvLyBUaGVzZSBibG9ja3MgY292ZXIgY29tbW9uIHNjcmlwdHMgdGhhdCByZXF1aXJlXG4gICAgICAgIC8vIGNvbXBsZXggdGV4dCBzaGFwaW5nLCBiYXNlZCBvbiB1bmljb2RlIHNjcmlwdCBtZXRhZGF0YTpcbiAgICAgICAgLy8gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcy9jbGRyL3RydW5rL2NvbW1vbi9wcm9wZXJ0aWVzL3NjcmlwdE1ldGFkYXRhLnR4dFxuICAgICAgICAvLyB3aGVyZSBcIldlYiBSYW5rIDw9IDMyXCIgXCJTaGFwaW5nIFJlcXVpcmVkID0gWUVTXCJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0NvbnRhaW5zUlRMVGV4dChjaGFyczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGNoYXJzKSB7XG4gICAgICAgIGlmIChjaGFySW5SVExTY3JpcHQoY2hhci5jaGFyQ29kZUF0KDApKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdJblN1cHBvcnRlZFNjcmlwdChjaGFyczogc3RyaW5nLCBjYW5SZW5kZXJSVEw6IGJvb2xlYW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgICAgaWYgKCFjaGFySW5TdXBwb3J0ZWRTY3JpcHQoY2hhci5jaGFyQ29kZUF0KDApLCBjYW5SZW5kZXJSVEwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0V2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHtnZXRBcnJheUJ1ZmZlcn0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge2lzV29ya2VyfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5cbmNvbnN0IHN0YXR1cyA9IHtcbiAgICB1bmF2YWlsYWJsZTogJ3VuYXZhaWxhYmxlJywgLy8gTm90IGxvYWRlZFxuICAgIGRlZmVycmVkOiAnZGVmZXJyZWQnLCAvLyBUaGUgcGx1Z2luIFVSTCBoYXMgYmVlbiBzcGVjaWZpZWQsIGJ1dCBsb2FkaW5nIGhhcyBiZWVuIGRlZmVycmVkXG4gICAgbG9hZGluZzogJ2xvYWRpbmcnLCAvLyByZXF1ZXN0IGluLWZsaWdodFxuICAgIGxvYWRlZDogJ2xvYWRlZCcsXG4gICAgZXJyb3I6ICdlcnJvcidcbn07XG5cbmV4cG9ydCB0eXBlIFBsdWdpblN0YXRlID0ge1xuICAgIHBsdWdpblN0YXR1czogJFZhbHVlczx0eXBlb2Ygc3RhdHVzPjtcbiAgICBwbHVnaW5VUkw6ID9zdHJpbmdcbn07XG5cbnR5cGUgUGx1Z2luU3RhdGVTeW5jQ2FsbGJhY2sgPSAoc3RhdGU6IFBsdWdpblN0YXRlKSA9PiB2b2lkO1xubGV0IF9jb21wbGV0aW9uQ2FsbGJhY2sgPSBudWxsO1xuXG4vL1ZhcmlhYmxlcyBkZWZpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGx1Z2luXG5sZXQgcGx1Z2luU3RhdHVzID0gc3RhdHVzLnVuYXZhaWxhYmxlO1xubGV0IHBsdWdpblVSTCA9IG51bGw7XG5cbmV4cG9ydCBjb25zdCB0cmlnZ2VyUGx1Z2luQ29tcGxldGlvbkV2ZW50ID0gZnVuY3Rpb24oZXJyb3I6ID9FcnJvcikge1xuICAgIC8vIE5ldHdvcmtFcnJvcidzIGFyZSBub3QgY29ycmVjdGx5IHJlZmxlY3RlZCBieSB0aGUgcGx1Z2luIHN0YXR1cyB3aGljaCBwcmV2ZW50cyByZWxvYWRpbmcgcGx1Z2luXG4gICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycgJiYgZXJyb3IuaW5kZXhPZignTmV0d29ya0Vycm9yJykgPiAtMSkge1xuICAgICAgICBwbHVnaW5TdGF0dXMgPSBzdGF0dXMuZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKF9jb21wbGV0aW9uQ2FsbGJhY2spIHtcbiAgICAgICAgX2NvbXBsZXRpb25DYWxsYmFjayhlcnJvcik7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gc2VuZFBsdWdpblN0YXRlVG9Xb3JrZXIoKSB7XG4gICAgZXZlbnRlZC5maXJlKG5ldyBFdmVudCgncGx1Z2luU3RhdGVDaGFuZ2UnLCB7cGx1Z2luU3RhdHVzLCBwbHVnaW5VUkx9KSk7XG59XG5cbmV4cG9ydCBjb25zdCBldmVudGVkID0gbmV3IEV2ZW50ZWQoKTtcblxuZXhwb3J0IGNvbnN0IGdldFJUTFRleHRQbHVnaW5TdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHBsdWdpblN0YXR1cztcbn07XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlID0gZnVuY3Rpb24oY2FsbGJhY2s6IFBsdWdpblN0YXRlU3luY0NhbGxiYWNrKSB7XG4gICAgLy8gRG8gYW4gaW5pdGlhbCBzeW5jIG9mIHRoZSBzdGF0ZVxuICAgIGNhbGxiYWNrKHtwbHVnaW5TdGF0dXMsIHBsdWdpblVSTH0pO1xuICAgIC8vIExpc3RlbiBmb3IgYWxsIGZ1dHVyZSBzdGF0ZSBjaGFuZ2VzXG4gICAgZXZlbnRlZC5vbigncGx1Z2luU3RhdGVDaGFuZ2UnLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIGNhbGxiYWNrO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyUlRMVGV4dFBsdWdpbiA9IGZ1bmN0aW9uKCkge1xuICAgIHBsdWdpblN0YXR1cyA9IHN0YXR1cy51bmF2YWlsYWJsZTtcbiAgICBwbHVnaW5VUkwgPSBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFJUTFRleHRQbHVnaW4gPSBmdW5jdGlvbih1cmw6IHN0cmluZywgY2FsbGJhY2s6ID9DYWxsYmFjazx7ZXJyOiA/RXJyb3J9PiwgZGVmZXJyZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmIChwbHVnaW5TdGF0dXMgPT09IHN0YXR1cy5kZWZlcnJlZCB8fCBwbHVnaW5TdGF0dXMgPT09IHN0YXR1cy5sb2FkaW5nIHx8IHBsdWdpblN0YXR1cyA9PT0gc3RhdHVzLmxvYWRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFJUTFRleHRQbHVnaW4gY2Fubm90IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4nKTtcbiAgICB9XG4gICAgcGx1Z2luVVJMID0gYnJvd3Nlci5yZXNvbHZlVVJMKHVybCk7XG4gICAgcGx1Z2luU3RhdHVzID0gc3RhdHVzLmRlZmVycmVkO1xuICAgIF9jb21wbGV0aW9uQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICBzZW5kUGx1Z2luU3RhdGVUb1dvcmtlcigpO1xuXG4gICAgLy9TdGFydCBkb3dubG9hZGluZyB0aGUgcGx1Z2luIGltbWVkaWF0ZWx5IGlmIG5vdCBpbnRlbmRpbmcgdG8gbGF6eS1sb2FkXG4gICAgaWYgKCFkZWZlcnJlZCkge1xuICAgICAgICBkb3dubG9hZFJUTFRleHRQbHVnaW4oKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZG93bmxvYWRSVExUZXh0UGx1Z2luID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHBsdWdpblN0YXR1cyAhPT0gc3RhdHVzLmRlZmVycmVkIHx8ICFwbHVnaW5VUkwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdydGwtdGV4dC1wbHVnaW4gY2Fubm90IGJlIGRvd25sb2FkZWQgdW5sZXNzIGEgcGx1Z2luVVJMIGlzIHNwZWNpZmllZCcpO1xuICAgIH1cbiAgICBwbHVnaW5TdGF0dXMgPSBzdGF0dXMubG9hZGluZztcbiAgICBzZW5kUGx1Z2luU3RhdGVUb1dvcmtlcigpO1xuICAgIGlmIChwbHVnaW5VUkwpIHtcbiAgICAgICAgZ2V0QXJyYXlCdWZmZXIoe3VybDogcGx1Z2luVVJMfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyUGx1Z2luQ29tcGxldGlvbkV2ZW50KGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luU3RhdHVzID0gc3RhdHVzLmxvYWRlZDtcbiAgICAgICAgICAgICAgICBzZW5kUGx1Z2luU3RhdGVUb1dvcmtlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgcGx1Z2luOiB7XG4gICAgYXBwbHlBcmFiaWNTaGFwaW5nOiA/RnVuY3Rpb24sXG4gICAgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0OiA/KHN0cmluZywgQXJyYXk8bnVtYmVyPikgPT4gQXJyYXk8c3RyaW5nPixcbiAgICBwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ6ID8oc3RyaW5nLCBBcnJheTxudW1iZXI+LCBBcnJheTxudW1iZXI+KSA9PiBBcnJheTxbc3RyaW5nLCBBcnJheTxudW1iZXI+XT4sXG4gICAgaXNMb2FkZWQ6ICgpID0+IGJvb2xlYW4sXG4gICAgaXNMb2FkaW5nOiAoKSA9PiBib29sZWFuLFxuICAgIHNldFN0YXRlOiAoc3RhdGU6IFBsdWdpblN0YXRlKSA9PiB2b2lkLFxuICAgIGlzUGFyc2VkOiAoKSA9PiBib29sZWFuLFxuICAgIGdldFBsdWdpblVSTDogKCkgPT4gP3N0cmluZ1xufSA9IHtcbiAgICBhcHBseUFyYWJpY1NoYXBpbmc6IG51bGwsXG4gICAgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0OiBudWxsLFxuICAgIHByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dDogbnVsbCxcbiAgICBpc0xvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpblN0YXR1cyA9PT0gc3RhdHVzLmxvYWRlZCB8fCAvLyBNYWluIFRocmVhZDogbG9hZGVkIGlmIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIHJldHVybmVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICAgICAgcGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZyAhPSBudWxsOyAvLyBXZWItd29ya2VyOiBsb2FkZWQgaWYgdGhlIHBsdWdpbiBmdW5jdGlvbnMgaGF2ZSBiZWVuIGNvbXBpbGVkXG4gICAgfSxcbiAgICBpc0xvYWRpbmcoKSB7IC8vIE1haW4gVGhyZWFkIE9ubHk6IHF1ZXJ5IHRoZSBsb2FkaW5nIHN0YXR1cywgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgaW4gdGhlIHdvcmtlciBjb250ZXh0LlxuICAgICAgICByZXR1cm4gcGx1Z2luU3RhdHVzID09PSBzdGF0dXMubG9hZGluZztcbiAgICB9LFxuICAgIHNldFN0YXRlKHN0YXRlOiBQbHVnaW5TdGF0ZSkgeyAvLyBXb3JrZXIgdGhyZWFkIG9ubHk6IHRoaXMgdGVsbHMgdGhlIHdvcmtlciB0aHJlYWRzIHRoYXQgdGhlIHBsdWdpbiBpcyBhdmFpbGFibGUgb24gdGhlIE1haW4gdGhyZWFkXG4gICAgICAgIGFzc2VydChpc1dvcmtlcigpLCAnQ2Fubm90IHNldCB0aGUgc3RhdGUgb2YgdGhlIHJ0bC10ZXh0LXBsdWdpbiB3aGVuIG5vdCBpbiB0aGUgd2ViLXdvcmtlciBjb250ZXh0Jyk7XG5cbiAgICAgICAgcGx1Z2luU3RhdHVzID0gc3RhdGUucGx1Z2luU3RhdHVzO1xuICAgICAgICBwbHVnaW5VUkwgPSBzdGF0ZS5wbHVnaW5VUkw7XG4gICAgfSxcbiAgICBpc1BhcnNlZCgpOiBib29sZWFuIHtcbiAgICAgICAgYXNzZXJ0KGlzV29ya2VyKCksICdydGwtdGV4dC1wbHVnaW4gaXMgb25seSBwYXJzZWQgb24gdGhlIHdvcmtlci10aHJlYWRzJyk7XG5cbiAgICAgICAgcmV0dXJuIHBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcgIT0gbnVsbCAmJlxuICAgICAgICAgICAgcGx1Z2luLnByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCAhPSBudWxsICYmXG4gICAgICAgICAgICBwbHVnaW4ucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0ICE9IG51bGw7XG4gICAgfSxcbiAgICBnZXRQbHVnaW5VUkwoKTogP3N0cmluZyB7XG4gICAgICAgIGFzc2VydChpc1dvcmtlcigpLCAncnRsLXRleHQtcGx1Z2luIHVybCBjYW4gb25seSBiZSBxdWVyaWVkIGZyb20gdGhlIHdvcmtlciB0aHJlYWRzJyk7XG4gICAgICAgIHJldHVybiBwbHVnaW5VUkw7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGxhenlMb2FkUlRMVGV4dFBsdWdpbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghcGx1Z2luLmlzTG9hZGluZygpICYmXG4gICAgICAgICFwbHVnaW4uaXNMb2FkZWQoKSAmJlxuICAgICAgICBnZXRSVExUZXh0UGx1Z2luU3RhdHVzKCkgPT09ICdkZWZlcnJlZCdcbiAgICApIHtcbiAgICAgICAgZG93bmxvYWRSVExUZXh0UGx1Z2luKCk7XG4gICAgfVxufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBab29tSGlzdG9yeSBmcm9tICcuL3pvb21faGlzdG9yeS5qcyc7XG5pbXBvcnQge2lzU3RyaW5nSW5TdXBwb3J0ZWRTY3JpcHR9IGZyb20gJy4uL3V0aWwvc2NyaXB0X2RldGVjdGlvbi5qcyc7XG5pbXBvcnQge3BsdWdpbiBhcyBydGxUZXh0UGx1Z2lufSBmcm9tICcuLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luLmpzJztcblxuaW1wb3J0IHR5cGUge1RyYW5zaXRpb25TcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgQ3Jvc3NmYWRlUGFyYW1ldGVycyA9IHtcbiAgICBmcm9tU2NhbGU6IG51bWJlcixcbiAgICB0b1NjYWxlOiBudW1iZXIsXG4gICAgdDogbnVtYmVyXG59O1xuXG5jbGFzcyBFdmFsdWF0aW9uUGFyYW1ldGVycyB7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIHBpdGNoOiBudW1iZXI7XG4gICAgbm93OiBudW1iZXI7XG4gICAgZmFkZUR1cmF0aW9uOiBudW1iZXI7XG4gICAgem9vbUhpc3Rvcnk6IFpvb21IaXN0b3J5O1xuICAgIHRyYW5zaXRpb246IFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uO1xuXG4gICAgLy8gXCJvcHRpb25zXCIgbWF5IGFsc28gYmUgYW5vdGhlciBFdmFsdWF0aW9uUGFyYW1ldGVycyB0byBjb3B5LCBzZWUgQ3Jvc3NGYWRlZFByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGVcbiAgICBjb25zdHJ1Y3Rvcih6b29tOiBudW1iZXIsIG9wdGlvbnM/OiAqKSB7XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG5cbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMubm93ID0gb3B0aW9ucy5ub3c7XG4gICAgICAgICAgICB0aGlzLmZhZGVEdXJhdGlvbiA9IG9wdGlvbnMuZmFkZUR1cmF0aW9uO1xuICAgICAgICAgICAgdGhpcy56b29tSGlzdG9yeSA9IG9wdGlvbnMuem9vbUhpc3Rvcnk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBvcHRpb25zLnRyYW5zaXRpb247XG4gICAgICAgICAgICB0aGlzLnBpdGNoID0gb3B0aW9ucy5waXRjaDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm93ID0gMDtcbiAgICAgICAgICAgIHRoaXMuZmFkZUR1cmF0aW9uID0gMDtcbiAgICAgICAgICAgIHRoaXMuem9vbUhpc3RvcnkgPSBuZXcgWm9vbUhpc3RvcnkoKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IHt9O1xuICAgICAgICAgICAgdGhpcy5waXRjaCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1N1cHBvcnRlZFNjcmlwdChzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmdJblN1cHBvcnRlZFNjcmlwdChzdHIsIHJ0bFRleHRQbHVnaW4uaXNMb2FkZWQoKSk7XG4gICAgfVxuXG4gICAgY3Jvc3NGYWRpbmdGYWN0b3IoKSB7XG4gICAgICAgIGlmICh0aGlzLmZhZGVEdXJhdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oKHRoaXMubm93IC0gdGhpcy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb21UaW1lKSAvIHRoaXMuZmFkZUR1cmF0aW9uLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTogQ3Jvc3NmYWRlUGFyYW1ldGVycyB7XG4gICAgICAgIGNvbnN0IHogPSB0aGlzLnpvb207XG4gICAgICAgIGNvbnN0IGZyYWN0aW9uID0geiAtIE1hdGguZmxvb3Ioeik7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLmNyb3NzRmFkaW5nRmFjdG9yKCk7XG5cbiAgICAgICAgcmV0dXJuIHogPiB0aGlzLnpvb21IaXN0b3J5Lmxhc3RJbnRlZ2VyWm9vbSA/XG4gICAgICAgICAgICB7ZnJvbVNjYWxlOiAyLCB0b1NjYWxlOiAxLCB0OiBmcmFjdGlvbiArICgxIC0gZnJhY3Rpb24pICogdH0gOlxuICAgICAgICAgICAge2Zyb21TY2FsZTogMC41LCB0b1NjYWxlOiAxLCB0OiAxIC0gKDEgLSB0KSAqIGZyYWN0aW9ufTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2YWx1YXRpb25QYXJhbWV0ZXJzO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtjbG9uZSwgZXh0ZW5kLCBlYXNlQ3ViaWNJbk91dH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCAqIGFzIGludGVycG9sYXRlIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQge25vcm1hbGl6ZVByb3BlcnR5RXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5cbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIHtTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9zdHlsZS1zcGVjLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgICBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbixcbiAgICBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUge1xuICAgIEZlYXR1cmUsXG4gICAgRmVhdHVyZVN0YXRlLFxuICAgIFN0eWxlUHJvcGVydHlFeHByZXNzaW9uLFxuICAgIFNvdXJjZUV4cHJlc3Npb24sXG4gICAgQ29tcG9zaXRlRXhwcmVzc2lvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMnO1xuXG50eXBlIFRpbWVQb2ludCA9IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgQ3Jvc3NGYWRlZDxUPiA9IHtcbiAgICB0bzogVCxcbiAgICBmcm9tOiBULFxuICAgIG90aGVyPzogVFxufTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgbnVtYmVyIG9mIGNsYXNzZXMgdGhhdCBkZWZpbmUgc3RhdGUgYW5kIGJlaGF2aW9yIGZvciBwYWludCBhbmQgbGF5b3V0IHByb3BlcnRpZXMsIG1vc3RcbiAqIGltcG9ydGFudGx5IHRoZWlyIHJlc3BlY3RpdmUgZXZhbHVhdGlvbiBjaGFpbnM6XG4gKlxuICogICAgICAgVHJhbnNpdGlvbmFibGUgcGFpbnQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDihpIgVHJhbnNpdGlvbmluZyBwYWludCBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIOKGkiBQb3NzaWJseSBldmFsdWF0ZWQgcGFpbnQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDihpIgRnVsbHkgZXZhbHVhdGVkIHBhaW50IHByb3BlcnR5IHZhbHVlXG4gKlxuICogICAgICAgTGF5b3V0IHByb3BlcnR5IHZhbHVlXG4gKiAgICAg4oaSIFBvc3NpYmx5IGV2YWx1YXRlZCBsYXlvdXQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDihpIgRnVsbHkgZXZhbHVhdGVkIGxheW91dCBwcm9wZXJ0eSB2YWx1ZVxuICpcbiAqIEBtb2R1bGVcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiAgSW1wbGVtZW50YXRpb25zIG9mIHRoZSBgUHJvcGVydHlgIGludGVyZmFjZTpcbiAqXG4gKiAgKiBIb2xkIG1ldGFkYXRhIGFib3V0IGEgcHJvcGVydHkgdGhhdCdzIGluZGVwZW5kZW50IG9mIGFueSBzcGVjaWZpYyB2YWx1ZTogc3R1ZmYgbGlrZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUsXG4gKiAgICB0aGUgZGVmYXVsdCB2YWx1ZSwgZXRjLiBUaGlzIGNvbWVzIGZyb20gdGhlIHN0eWxlIHNwZWNpZmljYXRpb24gSlNPTi5cbiAqICAqIERlZmluZSBiZWhhdmlvciB0aGF0IG5lZWRzIHRvIGJlIHBvbHltb3JwaGljIGFjcm9zcyBkaWZmZXJlbnQgcHJvcGVydGllczogXCJwb3NzaWJseSBldmFsdWF0aW5nXCJcbiAqICAgIGFuIGlucHV0IHZhbHVlIChzZWUgYmVsb3cpLCBhbmQgaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHR3byBwb3NzaWJseS1ldmFsdXRlZCB2YWx1ZXMuXG4gKlxuICogIFRoZSB0eXBlIGBUYCBpcyB0aGUgZnVsbHktZXZhbHVhdGVkIHZhbHVlIHR5cGUgKGUuZy4gYG51bWJlcmAsIGBzdHJpbmdgLCBgQ29sb3JgKS5cbiAqICBUaGUgdHlwZSBgUmAgaXMgdGhlIGludGVybWVkaWF0ZSBcInBvc3NpYmx5IGV2YWx1YXRlZFwiIHZhbHVlIHR5cGUuIFNlZSBiZWxvdy5cbiAqXG4gKiAgVGhlcmUgYXJlIHR3byBtYWluIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgaW50ZXJmYWNlIC0tIG9uZSBmb3IgcHJvcGVydGllcyB0aGF0IGFsbG93IGRhdGEtZHJpdmVuIHZhbHVlcyxcbiAqICBhbmQgb25lIGZvciBwcm9wZXJ0aWVzIHRoYXQgZG9uJ3QuIFRoZXJlIGFyZSBhIGZldyBcInNwZWNpYWwgY2FzZVwiIGltcGxlbWVudGF0aW9ucyBhcyB3ZWxsOiBvbmUgZm9yIHByb3BlcnRpZXNcbiAqICB3aGljaCBjcm9zcy1mYWRlIGJldHdlZW4gdHdvIHZhbHVlcyByYXRoZXIgdGhhbiBpbnRlcnBvbGF0aW5nLCBvbmUgZm9yIGBoZWF0bWFwLWNvbG9yYCBhbmQgYGxpbmUtZ3JhZGllbnRgLFxuICogIGFuZCBvbmUgZm9yIGBsaWdodC1wb3NpdGlvbmAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9wZXJ0eTxULCBSPiB7XG4gICAgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPik6IFI7XG4gICAgaW50ZXJwb2xhdGUoYTogUiwgYjogUiwgdDogbnVtYmVyKTogUjtcbn1cblxuLyoqXG4gKiAgYFByb3BlcnR5VmFsdWVgIHJlcHJlc2VudHMgdGhlIHZhbHVlIHBhcnQgb2YgYSBwcm9wZXJ0eSBrZXktdmFsdWUgdW5pdC4gSXQncyB1c2VkIHRvIHJlcHJlc2VudCBib3RoXG4gKiAgcGFpbnQgYW5kIGxheW91dCBwcm9wZXJ0eSB2YWx1ZXMsIGFuZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZWlyIHByb3BlcnR5IHN1cHBvcnRzIGRhdGEtZHJpdmVuXG4gKiAgZXhwcmVzc2lvbnMuXG4gKlxuICogIGBQcm9wZXJ0eVZhbHVlYCBzdG9yZXMgdGhlIHJhdyBpbnB1dCB2YWx1ZSBhcyBzZWVuIGluIGEgc3R5bGUgb3IgYSBydW50aW1lIHN0eWxpbmcgQVBJIGNhbGwsIGkuZS4gb25lIG9mIHRoZVxuICogIGZvbGxvd2luZzpcbiAqXG4gKiAgICAqIEEgY29uc3RhbnQgdmFsdWUgb2YgdGhlIHR5cGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm9wZXJ0eVxuICogICAgKiBBIGZ1bmN0aW9uIHdoaWNoIHByb2R1Y2VzIGEgdmFsdWUgb2YgdGhhdCB0eXBlIChidXQgZnVuY3Rpb25zIGFyZSBxdWFzaS1kZXByZWNhdGVkIGluIGZhdm9yIG9mIGV4cHJlc3Npb25zKVxuICogICAgKiBBbiBleHByZXNzaW9uIHdoaWNoIHByb2R1Y2VzIGEgdmFsdWUgb2YgdGhhdCB0eXBlXG4gKiAgICAqIFwidW5kZWZpbmVkXCIvXCJub3QgcHJlc2VudFwiLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9wZXJ0eSBpcyBhc3N1bWVkIHRvIHRha2Ugb24gaXRzIGRlZmF1bHQgdmFsdWUuXG4gKlxuICogIEluIGFkZGl0aW9uIHRvIHN0b3JpbmcgdGhlIG9yaWdpbmFsIGlucHV0IHZhbHVlLCBgUHJvcGVydHlWYWx1ZWAgYWxzbyBzdG9yZXMgYSBub3JtYWxpemVkIHJlcHJlc2VudGF0aW9uLFxuICogIGVmZmVjdGl2ZWx5IHRyZWF0aW5nIGZ1bmN0aW9ucyBhcyBpZiB0aGV5IGFyZSBleHByZXNzaW9ucywgYW5kIGNvbnN0YW50IG9yIGRlZmF1bHQgdmFsdWVzIGFzIGlmIHRoZXkgYXJlXG4gKiAgKGNvbnN0YW50KSBleHByZXNzaW9ucy5cbiAqXG4gKiAgQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFByb3BlcnR5VmFsdWU8VCwgUj4ge1xuICAgIHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPjtcbiAgICB2YWx1ZTogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD4gfCB2b2lkO1xuICAgIGV4cHJlc3Npb246IFN0eWxlUHJvcGVydHlFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydHk6IFByb3BlcnR5PFQsIFI+LCB2YWx1ZTogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD4gfCB2b2lkKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBub3JtYWxpemVQcm9wZXJ0eUV4cHJlc3Npb24odmFsdWUgPT09IHVuZGVmaW5lZCA/IHByb3BlcnR5LnNwZWNpZmljYXRpb24uZGVmYXVsdCA6IHZhbHVlLCBwcm9wZXJ0eS5zcGVjaWZpY2F0aW9uKTtcbiAgICB9XG5cbiAgICBpc0RhdGFEcml2ZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24ua2luZCA9PT0gJ3NvdXJjZScgfHwgdGhpcy5leHByZXNzaW9uLmtpbmQgPT09ICdjb21wb3NpdGUnO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPik6IFIge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eS5wb3NzaWJseUV2YWx1YXRlKHRoaXMsIHBhcmFtZXRlcnMsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0gVHJhbnNpdGlvbmFibGUgLS0tLS0tLVxuXG5leHBvcnQgdHlwZSBUcmFuc2l0aW9uUGFyYW1ldGVycyA9IHtcbiAgICBub3c6IFRpbWVQb2ludCxcbiAgICB0cmFuc2l0aW9uOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvblxufTtcblxuLyoqXG4gKiBQYWludCBwcm9wZXJ0aWVzIGFyZSBfdHJhbnNpdGlvbmFibGVfOiB0aGV5IGNhbiBjaGFuZ2UgaW4gYSBmbHVpZCBtYW5uZXIsIGludGVycG9sYXRpbmcgb3IgY3Jvc3MtZmFkaW5nIGJldHdlZW5cbiAqIG9sZCBhbmQgbmV3IHZhbHVlLiBUaGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24sIGFuZCB0aGUgZGVsYXkgYmVmb3JlIGl0IGJlZ2lucywgaXMgY29uZmlndXJhYmxlLlxuICpcbiAqIGBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVgIGlzIGEgY29tcG9zaXRpb25hbCBjbGFzcyB0aGF0IHN0b3JlcyBib3RoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBhbmQgdGhhdCB0cmFuc2l0aW9uXG4gKiBjb25maWd1cmF0aW9uLlxuICpcbiAqIEEgYFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZWAgY2FuIGNhbGN1bGF0ZSB0aGUgbmV4dCBzdGVwIGluIHRoZSBldmFsdWF0aW9uIGNoYWluIGZvciBwYWludCBwcm9wZXJ0eSB2YWx1ZXM6XG4gKiBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZTxULCBSPiB7XG4gICAgcHJvcGVydHk6IFByb3BlcnR5PFQsIFI+O1xuICAgIHZhbHVlOiBQcm9wZXJ0eVZhbHVlPFQsIFI+O1xuICAgIHRyYW5zaXRpb246IFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uIHwgdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPikge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXcgUHJvcGVydHlWYWx1ZShwcm9wZXJ0eSwgdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICB0cmFuc2l0aW9uZWQocGFyYW1ldGVyczogVHJhbnNpdGlvblBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgIHByaW9yOiBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPik6IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlPFQsIFI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZSh0aGlzLnByb3BlcnR5LCB0aGlzLnZhbHVlLCBwcmlvciwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgICAgZXh0ZW5kKHt9LCBwYXJhbWV0ZXJzLnRyYW5zaXRpb24sIHRoaXMudHJhbnNpdGlvbiksIHBhcmFtZXRlcnMubm93KTtcbiAgICB9XG5cbiAgICB1bnRyYW5zaXRpb25lZCgpOiBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPiB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWUodGhpcy5wcm9wZXJ0eSwgdGhpcy52YWx1ZSwgbnVsbCwge30sIDApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgfVxufVxuXG4vKipcbiAqIEEgaGVscGVyIHR5cGU6IGdpdmVuIGFuIG9iamVjdCB0eXBlIGBQcm9wZXJ0aWVzYCB3aG9zZSB2YWx1ZXMgYXJlIGVhY2ggb2YgdHlwZSBgUHJvcGVydHk8VCwgUj5gLCBpdCBjYWxjdWxhdGVzXG4gKiBhbiBvYmplY3QgdHlwZSB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBvZiB0eXBlIGBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWU8VCwgUj5gLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnR5cGUgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlczxQcm9wczogT2JqZWN0PlxuICAgID0gJEV4YWN0PCRPYmpNYXA8UHJvcHMsIDxULCBSPihwOiBQcm9wZXJ0eTxULCBSPikgPT4gVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlPFQsIFI+Pj5cblxuLyoqXG4gKiBgVHJhbnNpdGlvbmFibGVgIHN0b3JlcyBhIG1hcCBvZiBhbGwgKHByb3BlcnR5IG5hbWUsIGBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVgKSBwYWlycyBmb3IgcGFpbnQgcHJvcGVydGllcyBvZiBhXG4gKiBnaXZlbiBsYXllciB0eXBlLiBJdCBjYW4gY2FsY3VsYXRlIHRoZSBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVgcyBmb3IgYWxsIG9mIHRoZW0gYXQgb25jZSwgcHJvZHVjaW5nIGFcbiAqIGBUcmFuc2l0aW9uaW5nYCBpbnN0YW5jZSBmb3IgdGhlIHNhbWUgc2V0IG9mIHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zaXRpb25hYmxlPFByb3BzOiBPYmplY3Q+IHtcbiAgICBfcHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz47XG4gICAgX3ZhbHVlczogVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlcyk6IGFueSk7XG4gICAgfVxuXG4gICAgZ2V0VmFsdWU8Uzogc3RyaW5nLCBUPihuYW1lOiBTKTogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD4gfCB2b2lkIHtcbiAgICAgICAgcmV0dXJuIGNsb25lKHRoaXMuX3ZhbHVlc1tuYW1lXS52YWx1ZS52YWx1ZSk7XG4gICAgfVxuXG4gICAgc2V0VmFsdWU8Uzogc3RyaW5nLCBUPihuYW1lOiBTLCB2YWx1ZTogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD4gfCB2b2lkKSB7XG4gICAgICAgIGlmICghdGhpcy5fdmFsdWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXNbbmFtZV0gPSBuZXcgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlKHRoaXMuX3ZhbHVlc1tuYW1lXS5wcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvIG5vdCBfcmVtb3ZlXyBhbiBvd24gcHJvcGVydHkgaW4gdGhlIGNhc2Ugd2hlcmUgYSB2YWx1ZSBpcyBiZWluZyByZXNldFxuICAgICAgICAvLyB0byB0aGUgZGVmYXVsdDogdGhlIHRyYW5zaXRpb24gbWlnaHQgc3RpbGwgYmUgbm9uLWRlZmF1bHQuXG4gICAgICAgIHRoaXMuX3ZhbHVlc1tuYW1lXS52YWx1ZSA9IG5ldyBQcm9wZXJ0eVZhbHVlKHRoaXMuX3ZhbHVlc1tuYW1lXS5wcm9wZXJ0eSwgdmFsdWUgPT09IG51bGwgPyB1bmRlZmluZWQgOiBjbG9uZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIGdldFRyYW5zaXRpb248Uzogc3RyaW5nPihuYW1lOiBTKTogVHJhbnNpdGlvblNwZWNpZmljYXRpb24gfCB2b2lkIHtcbiAgICAgICAgcmV0dXJuIGNsb25lKHRoaXMuX3ZhbHVlc1tuYW1lXS50cmFuc2l0aW9uKTtcbiAgICB9XG5cbiAgICBzZXRUcmFuc2l0aW9uPFM6IHN0cmluZz4obmFtZTogUywgdmFsdWU6IFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uIHwgdm9pZCkge1xuICAgICAgICBpZiAoIXRoaXMuX3ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWVzW25hbWVdID0gbmV3IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZSh0aGlzLl92YWx1ZXNbbmFtZV0ucHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZhbHVlc1tuYW1lXS50cmFuc2l0aW9uID0gY2xvbmUodmFsdWUpIHx8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKHByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0cmFuc2l0aW9uID0gdGhpcy5nZXRUcmFuc2l0aW9uKHByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbYCR7cHJvcGVydHl9LXRyYW5zaXRpb25gXSA9IHRyYW5zaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0cmFuc2l0aW9uZWQocGFyYW1ldGVyczogVHJhbnNpdGlvblBhcmFtZXRlcnMsIHByaW9yOiBUcmFuc2l0aW9uaW5nPFByb3BzPik6IFRyYW5zaXRpb25pbmc8UHJvcHM+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFRyYW5zaXRpb25pbmcodGhpcy5fcHJvcGVydGllcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICByZXN1bHQuX3ZhbHVlc1twcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNbcHJvcGVydHldLnRyYW5zaXRpb25lZChwYXJhbWV0ZXJzLCBwcmlvci5fdmFsdWVzW3Byb3BlcnR5XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB1bnRyYW5zaXRpb25lZCgpOiBUcmFuc2l0aW9uaW5nPFByb3BzPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUcmFuc2l0aW9uaW5nKHRoaXMuX3Byb3BlcnRpZXMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSkge1xuICAgICAgICAgICAgcmVzdWx0Ll92YWx1ZXNbcHJvcGVydHldID0gdGhpcy5fdmFsdWVzW3Byb3BlcnR5XS51bnRyYW5zaXRpb25lZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tIFRyYW5zaXRpb25pbmcgLS0tLS0tLVxuXG4vKipcbiAqIGBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZWAgaW1wbGVtZW50cyB0aGUgZmlyc3Qgb2YgdHdvIGludGVybWVkaWF0ZSBzdGVwcyBpbiB0aGUgZXZhbHVhdGlvbiBjaGFpbiBvZiBhIHBhaW50XG4gKiBwcm9wZXJ0eSB2YWx1ZS4gSW4gdGhpcyBzdGVwLCB0cmFuc2l0aW9ucyBiZXR3ZWVuIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgaGFuZGxlZDogYXMgbG9uZyBhcyB0aGUgdHJhbnNpdGlvbiBpcyBpblxuICogcHJvZ3Jlc3MsIGBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZWAgbWFpbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBwcmlvciB2YWx1ZSwgYW5kIGludGVycG9sYXRlcyBiZXR3ZWVuIGl0IGFuZFxuICogdGhlIG5ldyB2YWx1ZSBiYXNlZCBvbiB0aGUgY3VycmVudCB0aW1lIGFuZCB0aGUgY29uZmlndXJlZCB0cmFuc2l0aW9uIGR1cmF0aW9uIGFuZCBkZWxheS4gVGhlIHByb2R1Y3QgaXMgdGhlIG5leHRcbiAqIHN0ZXAgaW4gdGhlIGV2YWx1YXRpb24gY2hhaW46IHRoZSBcInBvc3NpYmx5IGV2YWx1YXRlZFwiIHJlc3VsdCB0eXBlIGBSYC4gU2VlIGJlbG93IGZvciBtb3JlIG9uIHRoaXMgY29uY2VwdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPiB7XG4gICAgcHJvcGVydHk6IFByb3BlcnR5PFQsIFI+O1xuICAgIHZhbHVlOiBQcm9wZXJ0eVZhbHVlPFQsIFI+O1xuICAgIHByaW9yOiA/VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj47XG4gICAgYmVnaW46IFRpbWVQb2ludDtcbiAgICBlbmQ6IFRpbWVQb2ludDtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBQcm9wZXJ0eTxULCBSPixcbiAgICAgICAgICAgICAgICB2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPixcbiAgICAgICAgICAgICAgICBwcmlvcjogP1RyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlPFQsIFI+LFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uLFxuICAgICAgICAgICAgICAgIG5vdzogVGltZVBvaW50KSB7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdHJhbnNpdGlvbi5kZWxheSB8fCAwO1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHRyYW5zaXRpb24uZHVyYXRpb24gfHwgMDtcbiAgICAgICAgbm93ID0gbm93IHx8IDA7XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmJlZ2luID0gbm93ICsgZGVsYXk7XG4gICAgICAgIHRoaXMuZW5kID0gdGhpcy5iZWdpbiArIGR1cmF0aW9uO1xuICAgICAgICBpZiAocHJvcGVydHkuc3BlY2lmaWNhdGlvbi50cmFuc2l0aW9uICYmICh0cmFuc2l0aW9uLmRlbGF5IHx8IHRyYW5zaXRpb24uZHVyYXRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLnByaW9yID0gcHJpb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KTogUiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IHBhcmFtZXRlcnMubm93IHx8IDA7XG4gICAgICAgIGNvbnN0IGZpbmFsVmFsdWUgPSB0aGlzLnZhbHVlLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycywgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICBjb25zdCBwcmlvciA9IHRoaXMucHJpb3I7XG4gICAgICAgIGlmICghcHJpb3IpIHtcbiAgICAgICAgICAgIC8vIE5vIHByaW9yIHZhbHVlLlxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAobm93ID4gdGhpcy5lbmQpIHtcbiAgICAgICAgICAgIC8vIFRyYW5zaXRpb24gZnJvbSBwcmlvciB2YWx1ZSBpcyBub3cgY29tcGxldGUuXG4gICAgICAgICAgICB0aGlzLnByaW9yID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBmaW5hbFZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUuaXNEYXRhRHJpdmVuKCkpIHtcbiAgICAgICAgICAgIC8vIFRyYW5zaXRpb25zIHRvIGRhdGEtZHJpdmVuIHByb3BlcnRpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgICAgICAvLyBXZSBzbmFwIGltbWVkaWF0ZWx5IHRvIHRoZSBkYXRhLWRyaXZlbiB2YWx1ZSBzbyB0aGF0LCB3aGVuIHdlIHBlcmZvcm0gbGF5b3V0LFxuICAgICAgICAgICAgLy8gd2Ugc2VlIHRoZSBkYXRhLWRyaXZlbiBmdW5jdGlvbiBhbmQgY2FuIHVzZSBpdCB0byBwb3B1bGF0ZSB2ZXJ0ZXggYnVmZmVycy5cbiAgICAgICAgICAgIHRoaXMucHJpb3IgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAobm93IDwgdGhpcy5iZWdpbikge1xuICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiBoYXNuJ3Qgc3RhcnRlZCB5ZXQuXG4gICAgICAgICAgICByZXR1cm4gcHJpb3IucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJbnRlcnBvbGF0ZSBiZXR3ZWVuIHJlY3Vyc2l2ZWx5LWNhbGN1bGF0ZWQgcHJpb3IgdmFsdWUgYW5kIGZpbmFsLlxuICAgICAgICAgICAgY29uc3QgdCA9IChub3cgLSB0aGlzLmJlZ2luKSAvICh0aGlzLmVuZCAtIHRoaXMuYmVnaW4pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHkuaW50ZXJwb2xhdGUocHJpb3IucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyksIGZpbmFsVmFsdWUsIGVhc2VDdWJpY0luT3V0KHQpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj5gLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnR5cGUgVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzPFByb3BzOiBPYmplY3Q+XG4gICAgPSAkRXhhY3Q8JE9iak1hcDxQcm9wcywgPFQsIFI+KHA6IFByb3BlcnR5PFQsIFI+KSA9PiBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPj4+XG5cbi8qKlxuICogYFRyYW5zaXRpb25pbmdgIHN0b3JlcyBhIG1hcCBvZiBhbGwgKHByb3BlcnR5IG5hbWUsIGBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZWApIHBhaXJzIGZvciBwYWludCBwcm9wZXJ0aWVzIG9mIGFcbiAqIGdpdmVuIGxheWVyIHR5cGUuIEl0IGNhbiBjYWxjdWxhdGUgdGhlIHBvc3NpYmx5LWV2YWx1YXRlZCB2YWx1ZXMgZm9yIGFsbCBvZiB0aGVtIGF0IG9uY2UsIHByb2R1Y2luZyBhXG4gKiBgUG9zc2libHlFdmFsdWF0ZWRgIGluc3RhbmNlIGZvciB0aGUgc2FtZSBzZXQgb2YgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvbmluZzxQcm9wczogT2JqZWN0PiB7XG4gICAgX3Byb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+O1xuICAgIF92YWx1ZXM6IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzKTogYW55KTtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiBQb3NzaWJseUV2YWx1YXRlZDxQcm9wcz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgUG9zc2libHlFdmFsdWF0ZWQodGhpcy5fcHJvcGVydGllcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICByZXN1bHQuX3ZhbHVlc1twcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNbcHJvcGVydHldLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycywgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsdWVzW3Byb3BlcnR5XS5wcmlvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0gTGF5b3V0IC0tLS0tLS1cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgUHJvcGVydHlWYWx1ZTxULCBSPmAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudHlwZSBQcm9wZXJ0eVZhbHVlczxQcm9wczogT2JqZWN0PlxuICAgID0gJEV4YWN0PCRPYmpNYXA8UHJvcHMsIDxULCBSPihwOiBQcm9wZXJ0eTxULCBSPikgPT4gUHJvcGVydHlWYWx1ZTxULCBSPj4+XG5cbi8qKlxuICogQmVjYXVzZSBsYXlvdXQgcHJvcGVydGllcyBhcmUgbm90IHRyYW5zaXRpb25hYmxlLCB0aGV5IGhhdmUgYSBzaW1wbGVyIHJlcHJlc2VudGF0aW9uIGFuZCBldmFsdWF0aW9uIGNoYWluIHRoYW5cbiAqIHBhaW50IHByb3BlcnRpZXM6IGBQcm9wZXJ0eVZhbHVlYHMgYXJlIHBvc3NpYmx5IGV2YWx1YXRlZCwgcHJvZHVjaW5nIHBvc3NpYmx5IGV2YWx1YXRlZCB2YWx1ZXMsIHdoaWNoIGFyZSB0aGVuXG4gKiBmdWxseSBldmFsdWF0ZWQuXG4gKlxuICogYExheW91dGAgc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFByb3BlcnR5VmFsdWVgKSBwYWlycyBmb3IgbGF5b3V0IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS4gSXQgY2FuIGNhbGN1bGF0ZSB0aGUgcG9zc2libHktZXZhbHVhdGVkIHZhbHVlcyBmb3IgYWxsIG9mIHRoZW0gYXQgb25jZSwgcHJvZHVjaW5nIGFcbiAqIGBQb3NzaWJseUV2YWx1YXRlZGAgaW5zdGFuY2UgZm9yIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXlvdXQ8UHJvcHM6IE9iamVjdD4ge1xuICAgIF9wcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPjtcbiAgICBfdmFsdWVzOiBQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0UHJvcGVydHlWYWx1ZXMpOiBhbnkpO1xuICAgIH1cblxuICAgIGdldFZhbHVlPFM6IHN0cmluZz4obmFtZTogUykge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy5fdmFsdWVzW25hbWVdLnZhbHVlKTtcbiAgICB9XG5cbiAgICBzZXRWYWx1ZTxTOiBzdHJpbmc+KG5hbWU6IFMsIHZhbHVlOiAqKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eVZhbHVlKHRoaXMuX3ZhbHVlc1tuYW1lXS5wcm9wZXJ0eSwgdmFsdWUgPT09IG51bGwgPyB1bmRlZmluZWQgOiBjbG9uZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiBQb3NzaWJseUV2YWx1YXRlZDxQcm9wcz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgUG9zc2libHlFdmFsdWF0ZWQodGhpcy5fcHJvcGVydGllcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICByZXN1bHQuX3ZhbHVlc1twcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNbcHJvcGVydHldLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycywgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tIFBvc3NpYmx5RXZhbHVhdGVkIC0tLS0tLS1cblxuLyoqXG4gKiBcIlBvc3NpYmx5IGV2YWx1YXRlZCB2YWx1ZVwiIGlzIGFuIGludGVybWVkaWF0ZSBzdGFnZSBpbiB0aGUgZXZhbHVhdGlvbiBjaGFpbiBmb3IgYm90aCBwYWludCBhbmQgbGF5b3V0IHByb3BlcnR5XG4gKiB2YWx1ZXMuIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3RhZ2UgaXMgdG8gb3B0aW1pemUgYXdheSB1bm5lY2Vzc2FyeSByZWNhbGN1bGF0aW9ucyBmb3IgZGF0YS1kcml2ZW4gcHJvcGVydGllcy4gQ29kZVxuICogd2hpY2ggdXNlcyBkYXRhLWRyaXZlbiBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBhc3N1bWUgdGhhdCB0aGUgdmFsdWUgaXMgZGVwZW5kZW50IG9uIGZlYXR1cmUgZGF0YSwgYW5kIHJlcXVlc3QgdGhhdCBpdFxuICogYmUgZXZhbHVhdGVkIGZvciBlYWNoIGZlYXR1cmUuIEJ1dCB3aGVuIHRoYXQgcHJvcGVydHkgdmFsdWUgaXMgaW4gZmFjdCBhIGNvbnN0YW50IG9yIGNhbWVyYSBmdW5jdGlvbiwgdGhlIGNhbGN1bGF0aW9uXG4gKiB3aWxsIG5vdCBhY3R1YWxseSBkZXBlbmQgb24gdGhlIGZlYXR1cmUsIGFuZCB3ZSBjYW4gYmVuZWZpdCBmcm9tIHJldHVybmluZyB0aGUgcHJpb3IgcmVzdWx0IG9mIGhhdmluZyBkb25lIHRoZVxuICogZXZhbHVhdGlvbiBvbmNlLCBhaGVhZCBvZiB0aW1lLCBpbiBhbiBpbnRlcm1lZGlhdGUgc3RlcCB3aG9zZSBpbnB1dHMgYXJlIGp1c3QgdGhlIHZhbHVlIGFuZCBcImdsb2JhbFwiIHBhcmFtZXRlcnNcbiAqIHN1Y2ggYXMgY3VycmVudCB6b29tIGxldmVsLlxuICpcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCByZXByZXNlbnRzIHRoZSB0aHJlZSBwb3NzaWJsZSBvdXRjb21lcyBvZiB0aGlzIHN0ZXA6IGlmIHRoZSBpbnB1dCB2YWx1ZSB3YXMgYSBjb25zdGFudCBvclxuICogY2FtZXJhIGV4cHJlc3Npb24sIHRoZW4gdGhlIFwicG9zc2libHkgZXZhbHVhdGVkXCIgcmVzdWx0IGlzIGEgY29uc3RhbnQgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGlucHV0IHZhbHVlIHdhcyBlaXRoZXJcbiAqIGEgc291cmNlIG9yIGNvbXBvc2l0ZSBleHByZXNzaW9uLCBhbmQgd2UgbXVzdCBkZWZlciBmaW5hbCBldmFsdWF0aW9uIHVudGlsIHN1cHBsaWVkIGEgZmVhdHVyZS4gV2Ugc2VwYXJhdGVcbiAqIHRoZSBzb3VyY2UgYW5kIGNvbXBvc2l0ZSBjYXNlcyBiZWNhdXNlIHRoZXkgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgd2hlbiBnZW5lcmF0aW5nIEdMIGF0dHJpYnV0ZXMsIGJ1ZmZlcnMsIGFuZFxuICogdW5pZm9ybXMuXG4gKlxuICogTm90ZSB0aGF0IGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCAoYW5kIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgLCBiZWxvdykgYXJlIF9ub3RfIHVzZWQgZm9yIHByb3BlcnRpZXMgdGhhdFxuICogZG8gbm90IGFsbG93IGRhdGEtZHJpdmVuIHZhbHVlcy4gRm9yIHN1Y2ggcHJvcGVydGllcywgd2Uga25vdyB0aGF0IHRoZSBcInBvc3NpYmx5IGV2YWx1YXRlZFwiIHJlc3VsdCBpcyBhbHdheXMgYSBjb25zdGFudFxuICogc2NhbGFyIHZhbHVlLiBTZWUgYmVsb3cuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudHlwZSBQb3NzaWJseUV2YWx1YXRlZFZhbHVlPFQ+ID1cbiAgICB8IHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogVH1cbiAgICB8IFNvdXJjZUV4cHJlc3Npb25cbiAgICB8IENvbXBvc2l0ZUV4cHJlc3Npb247XG5cbi8qKlxuICogYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZWAgaXMgdXNlZCBmb3IgZGF0YS1kcml2ZW4gcGFpbnQgYW5kIGxheW91dCBwcm9wZXJ0eSB2YWx1ZXMuIEl0IGhvbGRzIGFcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFZhbHVlYCBhbmQgdGhlIGBHbG9iYWxQcm9wZXJ0aWVzYCB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSBpdC4gWW91J3JlIG5vdCBhbGxvd2VkIHRvIHN1cHBseVxuICogYSBkaWZmZXJlbnQgc2V0IG9mIGBHbG9iYWxQcm9wZXJ0aWVzYCB3aGVuIHBlcmZvcm1pbmcgdGhlIGZpbmFsIGV2YWx1YXRpb24gYmVjYXVzZSB0aGV5IHdvdWxkIGJlIGlnbm9yZWQgaW4gdGhlXG4gKiBjYXNlIHdoZXJlIHRoZSBpbnB1dCB2YWx1ZSB3YXMgYSBjb25zdGFudCBvciBjYW1lcmEgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPiB7XG4gICAgcHJvcGVydHk6IERhdGFEcml2ZW5Qcm9wZXJ0eTxUPjtcbiAgICB2YWx1ZTogUG9zc2libHlFdmFsdWF0ZWRWYWx1ZTxUPjtcbiAgICBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycztcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5OiBEYXRhRHJpdmVuUHJvcGVydHk8VD4sIHZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFZhbHVlPFQ+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICB9XG5cbiAgICBpc0NvbnN0YW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnO1xuICAgIH1cblxuICAgIGNvbnN0YW50T3IodmFsdWU6IFQpOiBUIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZShmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5LmV2YWx1YXRlKHRoaXMudmFsdWUsIHRoaXMucGFyYW1ldGVycywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgaGVscGVyIHR5cGU6IGdpdmVuIGFuIG9iamVjdCB0eXBlIGBQcm9wZXJ0aWVzYCB3aG9zZSB2YWx1ZXMgYXJlIGVhY2ggb2YgdHlwZSBgUHJvcGVydHk8VCwgUj5gLCBpdCBjYWxjdWxhdGVzXG4gKiBhbiBvYmplY3QgdHlwZSB3aXRoIHRoZSBzYW1lIGtleXMsIGFuZCB2YWx1ZXMgb2YgdHlwZSBgUmAuXG4gKlxuICogRm9yIHByb3BlcnRpZXMgdGhhdCBkb24ndCBhbGxvdyBkYXRhLWRyaXZlbiB2YWx1ZXMsIGBSYCBpcyBhIHNjYWxhciB0eXBlIHN1Y2ggYXMgYG51bWJlcmAsIGBzdHJpbmdgLCBvciBgQ29sb3JgLlxuICogRm9yIGRhdGEtZHJpdmVuIHByb3BlcnRpZXMsIGl0IGlzIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgLiBDcml0aWNhbGx5LCB0aGUgdHlwZSBkZWZpbml0aW9ucyBhcmUgc2V0IHVwXG4gKiBpbiBhIHdheSB0aGF0IGFsbG93cyBmbG93IHRvIGtub3cgd2hpY2ggb2YgdGhlc2UgdHdvIGNhc2VzIGFwcGxpZXMgZm9yIGFueSBnaXZlbiBwcm9wZXJ0eSBuYW1lLCBhbmQgaWYgeW91IGF0dGVtcHRcbiAqIHRvIHVzZSBhIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVgIGFzIGlmIGl0IHdhcyBhIHNjYWxhciwgb3IgdmljZSB2ZXJzYSwgeW91IHdpbGwgZ2V0IGEgdHlwZSBlcnJvci4gKEhvd2V2ZXIsXG4gKiB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjYXNlIGluIHdoaWNoIGZsb3cgZmFpbHMgdG8gcHJvZHVjZSBhIHR5cGUgZXJyb3IgdGhhdCB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mOiBpbiBhIGNvbnRleHQgc3VjaFxuICogYXMgYGxheWVyLnBhaW50LmdldCgnZm9vLW9wYWNpdHknKSA9PT0gMGAsIGlmIGBmb28tb3BhY2l0eWAgaXMgZGF0YS1kcml2ZW4sIHRoYW4gdGhlIGxlZnQtaGFuZCBzaWRlIGlzIG9mIHR5cGVcbiAqIGBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPmAsIGJ1dCBmbG93IHdpbGwgbm90IGNvbXBsYWluIGFib3V0IGNvbXBhcmluZyB0aGlzIHRvIGEgbnVtYmVyIHVzaW5nIGA9PT1gLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yMzU5LilcbiAqXG4gKiBUaGVyZSdzIGFsc28gYSB0aGlyZCwgc3BlY2lhbCBjYXNlIHBvc3NpYmxpdHkgZm9yIGBSYDogZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIGl0J3MgYD9Dcm9zc0ZhZGVkPFQ+YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG50eXBlIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM6IE9iamVjdD5cbiAgICA9ICRFeGFjdDwkT2JqTWFwPFByb3BzLCA8VCwgUj4ocDogUHJvcGVydHk8VCwgUj4pID0+IFI+PlxuXG4vKipcbiAqIGBQb3NzaWJseUV2YWx1YXRlZGAgc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFJgKSBwYWlycyBmb3IgcGFpbnQgb3IgbGF5b3V0IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBQb3NzaWJseUV2YWx1YXRlZDxQcm9wczogT2JqZWN0PiB7XG4gICAgX3Byb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+O1xuICAgIF92YWx1ZXM6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4pIHtcbiAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IChPYmplY3QuY3JlYXRlKHByb3BlcnRpZXMuZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzKTogYW55KTtcbiAgICB9XG5cbiAgICBnZXQ8Uzogc3RyaW5nPihuYW1lOiBTKTogJEVsZW1lbnRUeXBlPFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZXM8UHJvcHM+LCBTPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXNbbmFtZV07XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIHByb3BlcnRpZXMgdGhhdCBkbyBub3QgcGVybWl0IGRhdGEtZHJpdmVuIChzb3VyY2Ugb3IgY29tcG9zaXRlKSBleHByZXNzaW9ucy5cbiAqIFRoaXMgcmVzdHJpY3Rpb24gYWxsb3dzIHVzIHRvIGRlY2xhcmUgc3RhdGljYWxseSB0aGF0IHRoZSByZXN1bHQgb2YgcG9zc2libHkgZXZhbHVhdGluZyB0aGlzIGtpbmQgb2YgcHJvcGVydHlcbiAqIGlzIGluIGZhY3QgYWx3YXlzIHRoZSBzY2FsYXIgdHlwZSBgVGAsIGFuZCBjYW4gYmUgdXNlZCB3aXRob3V0IGZ1cnRoZXIgZXZhbHVhdGluZyB0aGUgdmFsdWUgb24gYSBwZXItZmVhdHVyZSBiYXNpcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgRGF0YUNvbnN0YW50UHJvcGVydHk8VD4gaW1wbGVtZW50cyBQcm9wZXJ0eTxULCBUPiB7XG4gICAgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgVD4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogVCB7XG4gICAgICAgIGFzc2VydCghdmFsdWUuaXNEYXRhRHJpdmVuKCkpO1xuICAgICAgICByZXR1cm4gdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhOiBULCBiOiBULCB0OiBudW1iZXIpOiBUIHtcbiAgICAgICAgY29uc3QgaW50ZXJwOiA/KGE6IFQsIGI6IFQsIHQ6IG51bWJlcikgPT4gVCA9IChpbnRlcnBvbGF0ZTogYW55KVt0aGlzLnNwZWNpZmljYXRpb24udHlwZV07XG4gICAgICAgIGlmIChpbnRlcnApIHtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcnAoYSwgYiwgdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgUHJvcGVydHlgIGZvciBwcm9wZXJ0aWVzIHRoYXQgcGVybWl0IGRhdGEtZHJpdmVuIChzb3VyY2Ugb3IgY29tcG9zaXRlKSBleHByZXNzaW9ucy5cbiAqIFRoZSByZXN1bHQgb2YgcG9zc2libHkgZXZhbHVhdGluZyB0aGlzIGtpbmQgb2YgcHJvcGVydHkgaXMgYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPmA7IG9idGFpbmluZ1xuICogYSBzY2FsYXIgdmFsdWUgYFRgIHJlcXVpcmVzIGZ1cnRoZXIgZXZhbHVhdGlvbiBvbiBhIHBlci1mZWF0dXJlIGJhc2lzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhRHJpdmVuUHJvcGVydHk8VD4gaW1wbGVtZW50cyBQcm9wZXJ0eTxULCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcbiAgICBvdmVycmlkZXM6ID9PYmplY3Q7XG5cbiAgICBjb25zdHJ1Y3RvcihzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbiwgb3ZlcnJpZGVzPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgICAgIHRoaXMub3ZlcnJpZGVzID0gb3ZlcnJpZGVzO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+PiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPik6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPiB7XG4gICAgICAgIGlmICh2YWx1ZS5leHByZXNzaW9uLmtpbmQgPT09ICdjb25zdGFudCcgfHwgdmFsdWUuZXhwcmVzc2lvbi5raW5kID09PSAnY2FtZXJhJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUodGhpcywge2tpbmQ6ICdjb25zdGFudCcsIHZhbHVlOiB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMsIChudWxsOiBhbnkpLCB7fSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpfSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB2YWx1ZS5leHByZXNzaW9uLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGludGVycG9sYXRlKGE6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPixcbiAgICAgICAgICAgICAgICBiOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4sXG4gICAgICAgICAgICAgICAgdDogbnVtYmVyKTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+IHtcbiAgICAgICAgLy8gSWYgZWl0aGVyIHBvc3NpYmx5LWV2YWx1YXRlZCB2YWx1ZSBpcyBub24tY29uc3RhbnQsIGdpdmUgdXA6IHdlIGFyZW4ndCBhYmxlIHRvIGludGVycG9sYXRlIGRhdGEtZHJpdmVuIHZhbHVlcy5cbiAgICAgICAgaWYgKGEudmFsdWUua2luZCAhPT0gJ2NvbnN0YW50JyB8fCBiLnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGhhY2sgc29sZWx5IGZvciBmaWxsLW91dGxpbmUtY29sb3IuIFRoZSB1bmRlZmluZWQgdmFsdWUgaXMgc3Vic2VxdWVudGx5IGhhbmRsZWQgaW5cbiAgICAgICAgLy8gRmlsbFN0eWxlTGF5ZXIjcmVjYWxjdWxhdGUsIHdoaWNoIHNldHMgZmlsbC1vdXRsaW5lLWNvbG9yIHRvIHRoZSBmaWxsLWNvbG9yIHZhbHVlIGlmIHRoZSBmb3JtZXJcbiAgICAgICAgLy8gaXMgYSBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUgY29udGFpbmluZyBhIGNvbnN0YW50IHVuZGVmaW5lZCB2YWx1ZS4gSW4gYWRkaXRpb24gdG8gdGhlXG4gICAgICAgIC8vIHJldHVybiB2YWx1ZSBoZXJlLCB0aGUgb3RoZXIgc291cmNlIG9mIGEgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlIGNvbnRhaW5pbmcgYSBjb25zdGFudFxuICAgICAgICAvLyB1bmRlZmluZWQgdmFsdWUgaXMgdGhlIFwiZGVmYXVsdCB2YWx1ZVwiIGZvciBmaWxsLW91dGxpbmUtY29sb3IgaGVsZCBpblxuICAgICAgICAvLyBgUHJvcGVydGllcyNkZWZhdWx0UG9zc2libHlFdmFsdWF0ZWRWYWx1ZXNgLCB3aGljaCBzZXJ2ZXMgYXMgdGhlIHByb3RvdHlwZSBvZlxuICAgICAgICAvLyBgUG9zc2libHlFdmFsdWF0ZWQjX3ZhbHVlc2AuXG4gICAgICAgIGlmIChhLnZhbHVlLnZhbHVlID09PSB1bmRlZmluZWQgfHwgYi52YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6ICh1bmRlZmluZWQ6IGFueSl9LCBhLnBhcmFtZXRlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW50ZXJwOiA/KGE6IFQsIGI6IFQsIHQ6IG51bWJlcikgPT4gVCA9IChpbnRlcnBvbGF0ZTogYW55KVt0aGlzLnNwZWNpZmljYXRpb24udHlwZV07XG4gICAgICAgIGlmIChpbnRlcnApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogaW50ZXJwKGEudmFsdWUudmFsdWUsIGIudmFsdWUudmFsdWUsIHQpfSwgYS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZhbHVhdGUodmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkVmFsdWU8VD4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogVCB7XG4gICAgICAgIGlmICh2YWx1ZS5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuZXZhbHVhdGUocGFyYW1ldGVycywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYFByb3BlcnR5YCBmb3IgIGRhdGEgZHJpdmVuIGBsaW5lLXBhdHRlcm5gIHdoaWNoIGFyZSB0cmFuc2l0aW9uZWQgYnkgY3Jvc3MtZmFkaW5nXG4gKiByYXRoZXIgdGhhbiBpbnRlcnBvbGF0aW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGNsYXNzIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHk8VD4gZXh0ZW5kcyBEYXRhRHJpdmVuUHJvcGVydHk8P0Nyb3NzRmFkZWQ8VD4+IHtcblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8P0Nyb3NzRmFkZWQ8VD4sIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTw/Q3Jvc3NGYWRlZDxUPj4+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPD9Dcm9zc0ZhZGVkPFQ+PiB7XG4gICAgICAgIGlmICh2YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6IHVuZGVmaW5lZH0sIHBhcmFtZXRlcnMpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkVmFsdWUgPSB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMsIChudWxsOiBhbnkpLCB7fSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgY29uc3QgaXNJbWFnZUV4cHJlc3Npb24gPSB2YWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLnR5cGUgPT09ICdyZXNvbHZlZEltYWdlJztcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0YW50VmFsdWUgPSBpc0ltYWdlRXhwcmVzc2lvbiAmJiB0eXBlb2YgZXZhbHVhdGVkVmFsdWUgIT09ICdzdHJpbmcnID8gZXZhbHVhdGVkVmFsdWUubmFtZSA6IGV2YWx1YXRlZFZhbHVlO1xuICAgICAgICAgICAgY29uc3QgY29uc3RhbnQgPSB0aGlzLl9jYWxjdWxhdGUoY29uc3RhbnRWYWx1ZSwgY29uc3RhbnRWYWx1ZSwgY29uc3RhbnRWYWx1ZSwgcGFyYW1ldGVycyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6IGNvbnN0YW50fSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXhwcmVzc2lvbi5raW5kID09PSAnY2FtZXJhJykge1xuICAgICAgICAgICAgY29uc3QgY2FtZXJhVmFsID0gdGhpcy5fY2FsY3VsYXRlKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiBwYXJhbWV0ZXJzLnpvb20gLSAxLjB9KSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogcGFyYW1ldGVycy56b29tfSksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206IHBhcmFtZXRlcnMuem9vbSArIDEuMH0pLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogY2FtZXJhVmFsfSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzb3VyY2Ugb3IgY29tcG9zaXRlIGV4cHJlc3Npb25cbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHZhbHVlLmV4cHJlc3Npb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZhbHVhdGUodmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkVmFsdWU8P0Nyb3NzRmFkZWQ8VD4+LCBnbG9iYWxzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPik6ID9Dcm9zc0ZhZGVkPFQ+IHtcbiAgICAgICAgaWYgKHZhbHVlLmtpbmQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgICAgICBjb25zdCBjb25zdGFudCA9IHZhbHVlLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShjb25zdGFudCwgY29uc3RhbnQsIGNvbnN0YW50LCBnbG9iYWxzKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5raW5kID09PSAnY29tcG9zaXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShcbiAgICAgICAgICAgICAgICB2YWx1ZS5ldmFsdWF0ZSh7em9vbTogTWF0aC5mbG9vcihnbG9iYWxzLnpvb20pIC0gMS4wfSwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5ldmFsdWF0ZSh7em9vbTogTWF0aC5mbG9vcihnbG9iYWxzLnpvb20pfSwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5ldmFsdWF0ZSh7em9vbTogTWF0aC5mbG9vcihnbG9iYWxzLnpvb20pICsgMS4wfSwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSxcbiAgICAgICAgICAgICAgICBnbG9iYWxzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jYWxjdWxhdGUobWluOiBULCBtaWQ6IFQsIG1heDogVCwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiBDcm9zc0ZhZGVkPFQ+IHtcbiAgICAgICAgY29uc3QgeiA9IHBhcmFtZXRlcnMuem9vbTtcbiAgICAgICAgLy8gdWdseSBoYWNrIGFsZXJ0OiB3aGVuIGV2YWx1YXRpbmcgbm9uLWNvbnN0YW50IGRhc2hlcyBvbiB0aGUgd29ya2VyIHNpZGUsXG4gICAgICAgIC8vIHdlIG5lZWQgYWxsIHRocmVlIHZhbHVlcyB0byBwYWNrIGludG8gdGhlIGF0bGFzOyB0aGUgaWYgY29uZGl0aW9uIGlzIGFsd2F5cyBmYWxzZSB0aGVyZTtcbiAgICAgICAgLy8gd2lsbCBiZSByZW1vdmVkIGFmdGVyIHJlbW92aW5nIGNyb3NzLWZhZGluZ1xuICAgICAgICByZXR1cm4geiA+IHBhcmFtZXRlcnMuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tID9cbiAgICAgICAgICAgIHtmcm9tOiBtaW4sIHRvOiBtaWQsIG90aGVyOiBtYXh9IDpcbiAgICAgICAgICAgIHtmcm9tOiBtYXgsIHRvOiBtaWQsIG90aGVyOiBtaW59O1xuICAgIH1cblxuICAgIGludGVycG9sYXRlKGE6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTw/Q3Jvc3NGYWRlZDxUPj4pOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8P0Nyb3NzRmFkZWQ8VD4+IHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgUHJvcGVydHlgIGZvciBgKi1wYXR0ZXJuYCBhbmQgYGxpbmUtZGFzaGFycmF5YCwgd2hpY2ggYXJlIHRyYW5zaXRpb25lZCBieSBjcm9zcy1mYWRpbmdcbiAqIHJhdGhlciB0aGFuIGludGVycG9sYXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRmFkZWRQcm9wZXJ0eTxUPiBpbXBsZW1lbnRzIFByb3BlcnR5PFQsID9Dcm9zc0ZhZGVkPFQ+PiB7XG4gICAgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgP0Nyb3NzRmFkZWQ8VD4+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogP0Nyb3NzRmFkZWQ8VD4ge1xuICAgICAgICBpZiAodmFsdWUudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5leHByZXNzaW9uLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0YW50ID0gdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzLCAobnVsbDogYW55KSwge30sIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGUoY29uc3RhbnQsIGNvbnN0YW50LCBjb25zdGFudCwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQoIXZhbHVlLmlzRGF0YURyaXZlbigpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGUoXG4gICAgICAgICAgICAgICAgdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoTWF0aC5mbG9vcihwYXJhbWV0ZXJzLnpvb20gLSAxLjApLCBwYXJhbWV0ZXJzKSksXG4gICAgICAgICAgICAgICAgdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoTWF0aC5mbG9vcihwYXJhbWV0ZXJzLnpvb20pLCBwYXJhbWV0ZXJzKSksXG4gICAgICAgICAgICAgICAgdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoTWF0aC5mbG9vcihwYXJhbWV0ZXJzLnpvb20gKyAxLjApLCBwYXJhbWV0ZXJzKSksXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY2FsY3VsYXRlKG1pbjogVCwgbWlkOiBULCBtYXg6IFQsIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogP0Nyb3NzRmFkZWQ8VD4ge1xuICAgICAgICBjb25zdCB6ID0gcGFyYW1ldGVycy56b29tO1xuICAgICAgICByZXR1cm4geiA+IHBhcmFtZXRlcnMuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tID8ge2Zyb206IG1pbiwgdG86IG1pZH0gOiB7ZnJvbTogbWF4LCB0bzogbWlkfTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhOiA/Q3Jvc3NGYWRlZDxUPik6ID9Dcm9zc0ZhZGVkPFQ+IHtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIGBoZWF0bWFwLWNvbG9yYCBhbmQgYGxpbmUtZ3JhZGllbnRgLiBJbnRlcnBvbGF0aW9uIGlzIGEgbm8tb3AsIGFuZFxuICogZXZhbHVhdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSBpbiBvcmRlciB0byBpbmRpY2F0ZSBpdHMgcHJlc2VuY2UsIGJ1dCB0aGUgcmVhbFxuICogZXZhbHVhdGlvbiBoYXBwZW5zIGluIFN0eWxlTGF5ZXIgY2xhc3Nlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmV4cG9ydCBjbGFzcyBDb2xvclJhbXBQcm9wZXJ0eSBpbXBsZW1lbnRzIFByb3BlcnR5PENvbG9yLCBib29sZWFuPiB7XG4gICAgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWU6IFByb3BlcnR5VmFsdWU8Q29sb3IsIGJvb2xlYW4+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXZhbHVlLmV4cHJlc3Npb24uZXZhbHVhdGUocGFyYW1ldGVycywgKG51bGw6IGFueSksIHt9LCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGUoKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxufVxuXG4vKipcbiAqIGBQcm9wZXJ0aWVzYCBob2xkcyBvYmplY3RzIGNvbnRhaW5pbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBsYXlvdXQgb3IgcGFpbnQgcHJvcGVydHkgc2V0IG9mIGEgZ2l2ZW5cbiAqIGxheWVyIHR5cGUuIFRoZXNlIG9iamVjdHMgYXJlIGltbXV0YWJsZSwgYW5kIHRoZXkgYXJlIHVzZWQgYXMgdGhlIHByb3RvdHlwZXMgZm9yIHRoZSBgX3ZhbHVlc2AgbWVtYmVycyBvZlxuICogYFRyYW5zaXRpb25hYmxlYCwgYFRyYW5zaXRpb25pbmdgLCBgTGF5b3V0YCwgYW5kIGBQb3NzaWJseUV2YWx1YXRlZGAuIFRoaXMgYWxsb3dzIHRoZXNlIGNsYXNzZXMgdG8gYXZvaWRcbiAqIGRvaW5nIHdvcmsgaW4gdGhlIGNvbW1vbiBjYXNlIHdoZXJlIGEgcHJvcGVydHkgaGFzIG5vIGV4cGxpY2l0IHZhbHVlIHNldCBhbmQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gdGFrZVxuICogb24gdGhlIGRlZmF1bHQgdmFsdWU6IHVzaW5nIGBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpYCwgdGhleSBjYW4gaXRlcmF0ZSBvdmVyXG4gKiBvbmx5IHRoZSBfb3duXyBwcm9wZXJ0aWVzIG9mIGBfdmFsdWVzYCwgc2tpcHBpbmcgcmVwZWF0ZWQgY2FsY3VsYXRpb24gb2YgdHJhbnNpdGlvbnMgYW5kIHBvc3NpYmxlL2ZpbmFsXG4gKiBldmFsdWF0aW9ucyBmb3IgZGVmYXVsdHMsIHRoZSByZXN1bHQgb2Ygd2hpY2ggd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFByb3BlcnRpZXM8UHJvcHM6IE9iamVjdD4ge1xuICAgIHByb3BlcnRpZXM6IFByb3BzO1xuICAgIGRlZmF1bHRQcm9wZXJ0eVZhbHVlczogUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuICAgIGRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzOiBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzPFByb3BzPjtcbiAgICBkZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzOiBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuICAgIGRlZmF1bHRQb3NzaWJseUV2YWx1YXRlZFZhbHVlczogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG4gICAgb3ZlcnJpZGFibGVQcm9wZXJ0aWVzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydGllczogUHJvcHMpIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5kZWZhdWx0UHJvcGVydHlWYWx1ZXMgPSAoe306IGFueSk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXMgPSAoe306IGFueSk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlcyA9ICh7fTogYW55KTtcbiAgICAgICAgdGhpcy5kZWZhdWx0UG9zc2libHlFdmFsdWF0ZWRWYWx1ZXMgPSAoe306IGFueSk7XG4gICAgICAgIHRoaXMub3ZlcnJpZGFibGVQcm9wZXJ0aWVzID0gKFtdOiBhbnkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BlcnRpZXNbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKHByb3Auc3BlY2lmaWNhdGlvbi5vdmVycmlkYWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcnJpZGFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFByb3BlcnR5VmFsdWUgPSB0aGlzLmRlZmF1bHRQcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVZhbHVlKHByb3AsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlID0gdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgIG5ldyBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWUocHJvcCk7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXNbcHJvcGVydHldID1cbiAgICAgICAgICAgICAgICBkZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlLnVudHJhbnNpdGlvbmVkKCk7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRQb3NzaWJseUV2YWx1YXRlZFZhbHVlc1twcm9wZXJ0eV0gPVxuICAgICAgICAgICAgICAgIGRlZmF1bHRQcm9wZXJ0eVZhbHVlLnBvc3NpYmx5RXZhbHVhdGUoKHt9OiBhbnkpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0RhdGFEcml2ZW5Qcm9wZXJ0eScsIERhdGFEcml2ZW5Qcm9wZXJ0eSk7XG5yZWdpc3RlcignRGF0YUNvbnN0YW50UHJvcGVydHknLCBEYXRhQ29uc3RhbnRQcm9wZXJ0eSk7XG5yZWdpc3RlcignQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eScsIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHkpO1xucmVnaXN0ZXIoJ0Nyb3NzRmFkZWRQcm9wZXJ0eScsIENyb3NzRmFkZWRQcm9wZXJ0eSk7XG5yZWdpc3RlcignQ29sb3JSYW1wUHJvcGVydHknLCBDb2xvclJhbXBQcm9wZXJ0eSk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2NsYW1wfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuXG4vKipcbiAqIFBhY2tzIHR3byBudW1iZXJzLCBpbnRlcnByZXRlZCBhcyA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VycywgaW50byBhIHNpbmdsZVxuICogZmxvYXQuICBVbnBhY2sgdGhlbSBpbiB0aGUgc2hhZGVyIHVzaW5nIHRoZSBgdW5wYWNrX2Zsb2F0KClgIGZ1bmN0aW9uLFxuICogZGVmaW5lZCBpbiBfcHJlbHVkZS52ZXJ0ZXguZ2xzbFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWNrVWludDhUb0Zsb2F0KGE6IG51bWJlciwgYjogbnVtYmVyKSB7XG4gICAgLy8gY29lcmNlIGEgYW5kIGIgdG8gOC1iaXQgaW50c1xuICAgIGEgPSBjbGFtcChNYXRoLmZsb29yKGEpLCAwLCAyNTUpO1xuICAgIGIgPSBjbGFtcChNYXRoLmZsb29yKGIpLCAwLCAyNTUpO1xuICAgIHJldHVybiAyNTYgKiBhICsgYjtcbn1cbiIsIi8vIEBmbG93XG5cbi8vIE5vdGU6IGFsbCBcInNpemVzXCIgYXJlIG1lYXN1cmVkIGluIGJ5dGVzXG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUge1RyYW5zZmVyYWJsZX0gZnJvbSAnLi4vdHlwZXMvdHJhbnNmZXJhYmxlLmpzJztcblxuY29uc3Qgdmlld1R5cGVzID0ge1xuICAgICdJbnQ4JzogSW50OEFycmF5LFxuICAgICdVaW50OCc6IFVpbnQ4QXJyYXksXG4gICAgJ0ludDE2JzogSW50MTZBcnJheSxcbiAgICAnVWludDE2JzogVWludDE2QXJyYXksXG4gICAgJ0ludDMyJzogSW50MzJBcnJheSxcbiAgICAnVWludDMyJzogVWludDMyQXJyYXksXG4gICAgJ0Zsb2F0MzInOiBGbG9hdDMyQXJyYXlcbn07XG5cbmV4cG9ydCB0eXBlIFZpZXdUeXBlID0gJEtleXM8dHlwZW9mIHZpZXdUeXBlcz47XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0IHtcbiAgICBfcG9zMTogbnVtYmVyO1xuICAgIF9wb3MyOiBudW1iZXI7XG4gICAgX3BvczQ6IG51bWJlcjtcbiAgICBfcG9zODogbnVtYmVyO1xuICAgICtfc3RydWN0QXJyYXk6IFN0cnVjdEFycmF5O1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZSBwcm90b3R5cGUgb2Ygc3ViIGNsYXNzZXMuXG4gICAgc2l6ZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJ1Y3RBcnJheX0gc3RydWN0QXJyYXkgVGhlIFN0cnVjdEFycmF5IHRoZSBzdHJ1Y3QgaXMgc3RvcmVkIGluXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgc3RydWN0IGluIHRoZSBTdHJ1Y3RBcnJheS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHN0cnVjdEFycmF5OiBTdHJ1Y3RBcnJheSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICAodGhpczogYW55KS5fc3RydWN0QXJyYXkgPSBzdHJ1Y3RBcnJheTtcbiAgICAgICAgdGhpcy5fcG9zMSA9IGluZGV4ICogdGhpcy5zaXplO1xuICAgICAgICB0aGlzLl9wb3MyID0gdGhpcy5fcG9zMSAvIDI7XG4gICAgICAgIHRoaXMuX3BvczQgPSB0aGlzLl9wb3MxIC8gNDtcbiAgICAgICAgdGhpcy5fcG9zOCA9IHRoaXMuX3BvczEgLyA4O1xuICAgIH1cbn1cblxuY29uc3QgREVGQVVMVF9DQVBBQ0lUWSA9IDEyODtcbmNvbnN0IFJFU0laRV9NVUxUSVBMSUVSID0gNTtcblxuZXhwb3J0IHR5cGUgU3RydWN0QXJyYXlNZW1iZXIgPSB7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHR5cGU6IFZpZXdUeXBlLFxuICAgIGNvbXBvbmVudHM6IG51bWJlcixcbiAgICBvZmZzZXQ6IG51bWJlclxufTtcblxuZXhwb3J0IHR5cGUgU3RydWN0QXJyYXlMYXlvdXQgPSB7XG4gICAgbWVtYmVyczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBhbGlnbm1lbnQ6ID9udW1iZXJcbn1cblxuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFN0cnVjdEFycmF5ID0ge1xuICAgIGxlbmd0aDogbnVtYmVyLFxuICAgIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlclxufTtcblxuLyoqXG4gKiBgU3RydWN0QXJyYXlgIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIG92ZXIgYEFycmF5QnVmZmVyYCBhbmQgYFR5cGVkQXJyYXlgXG4gKiBtYWtpbmcgaXQgYmVoYXZlIGxpa2UgYW4gYXJyYXkgb2YgdHlwZWQgc3RydWN0cy5cbiAqXG4gKiBDb25jZXB0dWFsbHksIGEgU3RydWN0QXJyYXkgaXMgY29tcHJpc2VkIG9mIGVsZW1lbnRzLCBpLmUuLCBpbnN0YW5jZXMgb2YgaXRzXG4gKiBhc3NvY2lhdGVkIHN0cnVjdCB0eXBlLiBFYWNoIHBhcnRpY3VsYXIgc3RydWN0IHR5cGUsIHRvZ2V0aGVyIHdpdGggYW5cbiAqIGFsaWdubWVudCBzaXplLCBkZXRlcm1pbmVzIHRoZSBtZW1vcnkgbGF5b3V0IG9mIGEgU3RydWN0QXJyYXkgd2hvc2UgZWxlbWVudHNcbiAqIGFyZSBvZiB0aGF0IHR5cGUuICBUaHVzLCBmb3IgZWFjaCBzdWNoIGxheW91dCB0aGF0IHdlIG5lZWQsIHdlIGhhdmVcbiAqIGEgY29ycnNlcG9uZGluZyBTdHJ1Y3RBcnJheUxheW91dCBjbGFzcywgaW5oZXJpdGluZyBmcm9tIFN0cnVjdEFycmF5IGFuZFxuICogaW1wbGVtZW50aW5nIGBlbXBsYWNlQmFjaygpYCBhbmQgYF9yZWZyZXNoVmlld3MoKWAuXG4gKlxuICogSW4gc29tZSBjYXNlcywgd2hlcmUgd2UgbmVlZCB0byBhY2Nlc3MgcGFydGljdWxhciBlbGVtZW50cyBvZiBhIFN0cnVjdEFycmF5LFxuICogd2UgaW1wbGVtZW50IGEgbW9yZSBzcGVjaWZpYyBzdWJjbGFzcyB0aGF0IGluaGVyaXRzIGZyb20gb25lIG9mIHRoZVxuICogU3RydWN0QXJyYXlMYXlvdXRzIGFuZCBhZGRzIGEgYGdldChpKTogVGAgYWNjZXNzb3IgdGhhdCByZXR1cm5zIGEgc3RydWN0dXJlZFxuICogb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIHByb3hpZXMgaW50byB0aGUgdW5kZXJseWluZyBtZW1vcnkgc3BhY2UgZm9yIHRoZVxuICogaS10aCBlbGVtZW50LiAgVGhpcyBhZmZvcmRzIHRoZSBjb252aWVuY2Ugb2Ygd29ya2luZyB3aXRoIChzZWVtaW5nbHkpIHBsYWluXG4gKiBKYXZhc2NyaXB0IG9iamVjdHMgd2l0aG91dCB0aGUgb3ZlcmhlYWQgb2Ygc2VyaWFsaXppbmcvZGVzZXJpYWxpemluZyB0aGVtXG4gKiBpbnRvIEFycmF5QnVmZmVycyBmb3IgZWZmaWNpZW50IHdlYiB3b3JrZXIgdHJhbnNmZXIuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXkge1xuICAgIGNhcGFjaXR5OiBudW1iZXI7XG4gICAgbGVuZ3RoOiBudW1iZXI7XG4gICAgaXNUcmFuc2ZlcnJlZDogYm9vbGVhbjtcbiAgICBhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXI7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlIHByb3RvdHlwZS5cbiAgICBtZW1iZXJzOiBBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj47XG4gICAgYnl0ZXNQZXJFbGVtZW50OiBudW1iZXI7XG4gICAgK2VtcGxhY2VCYWNrOiBGdW5jdGlvbjtcbiAgICArZW1wbGFjZTogRnVuY3Rpb247XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pc1RyYW5zZmVycmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2FwYWNpdHkgPSAtMTtcbiAgICAgICAgdGhpcy5yZXNpemUoMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIGEgU3RydWN0QXJyYXkgaW5zdGFuY2UuICBTZXJpYWxpemVzIGJvdGggdGhlIHJhdyBkYXRhIGFuZCB0aGVcbiAgICAgKiBtZXRhZGF0YSBuZWVkZWQgdG8gcmVjb25zdHJ1Y3QgdGhlIFN0cnVjdEFycmF5IGJhc2UgY2xhc3MgZHVyaW5nXG4gICAgICogZGVzZXJpYWxpemF0aW9uLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljIHNlcmlhbGl6ZShhcnJheTogU3RydWN0QXJyYXksIHRyYW5zZmVyYWJsZXM/OiBBcnJheTxUcmFuc2ZlcmFibGU+KTogU2VyaWFsaXplZFN0cnVjdEFycmF5IHtcbiAgICAgICAgYXNzZXJ0KCFhcnJheS5pc1RyYW5zZmVycmVkKTtcblxuICAgICAgICBhcnJheS5fdHJpbSgpO1xuXG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICBhcnJheS5pc1RyYW5zZmVycmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChhcnJheS5hcnJheUJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVuZ3RoOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlcjogYXJyYXkuYXJyYXlCdWZmZXIsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIGRlc2VyaWFsaXplKGlucHV0OiBTZXJpYWxpemVkU3RydWN0QXJyYXkpIHtcbiAgICAgICAgY29uc3Qgc3RydWN0QXJyYXkgPSBPYmplY3QuY3JlYXRlKHRoaXMucHJvdG90eXBlKTtcbiAgICAgICAgc3RydWN0QXJyYXkuYXJyYXlCdWZmZXIgPSBpbnB1dC5hcnJheUJ1ZmZlcjtcbiAgICAgICAgc3RydWN0QXJyYXkubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICBzdHJ1Y3RBcnJheS5jYXBhY2l0eSA9IGlucHV0LmFycmF5QnVmZmVyLmJ5dGVMZW5ndGggLyBzdHJ1Y3RBcnJheS5ieXRlc1BlckVsZW1lbnQ7XG4gICAgICAgIHN0cnVjdEFycmF5Ll9yZWZyZXNoVmlld3MoKTtcbiAgICAgICAgcmV0dXJuIHN0cnVjdEFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSB0aGUgYXJyYXkgdG8gZGlzY2FyZCB1bnVzZWQgY2FwYWNpdHkuXG4gICAgICovXG4gICAgX3RyaW0oKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPT0gdGhpcy5jYXBhY2l0eSkge1xuICAgICAgICAgICAgdGhpcy5jYXBhY2l0eSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IHRoaXMuYXJyYXlCdWZmZXIuc2xpY2UoMCwgdGhpcy5sZW5ndGggKiB0aGlzLmJ5dGVzUGVyRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoVmlld3MoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgdG8gMCB3aXRob3V0IGRlLWFsbG9jYXRpbmcgY2FwY2FjaXR5LlxuICAgICAqL1xuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplIHRoZSBhcnJheS5cbiAgICAgKiBJZiBgbmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGxlbmd0aCB0aGVuIGFkZGl0aW9uYWwgZWxlbWVudHMgd2l0aCB1bmRlZmluZWQgdmFsdWVzIGFyZSBhZGRlZC5cbiAgICAgKiBJZiBgbmAgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IGxlbmd0aCB0aGVuIHRoZSBhcnJheSB3aWxsIGJlIHJlZHVjZWQgdG8gdGhlIGZpcnN0IGBuYCBlbGVtZW50cy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbmV3IHNpemUgb2YgdGhlIGFycmF5LlxuICAgICAqL1xuICAgIHJlc2l6ZShuOiBudW1iZXIpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICB0aGlzLnJlc2VydmUobik7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZSBhIHBsYW5uZWQgaW5jcmVhc2UgaW4gc2l6ZSwgc28gdGhhdCBhbnkgbmVjZXNzYXJ5IGFsbG9jYXRpb24gbWF5XG4gICAgICogYmUgZG9uZSBvbmNlLCBhaGVhZCBvZiB0aW1lLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBleHBlY3RlZCBzaXplIG9mIHRoZSBhcnJheS5cbiAgICAgKi9cbiAgICByZXNlcnZlKG46IG51bWJlcikge1xuICAgICAgICBpZiAobiA+IHRoaXMuY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FwYWNpdHkgPSBNYXRoLm1heChuLCBNYXRoLmZsb29yKHRoaXMuY2FwYWNpdHkgKiBSRVNJWkVfTVVMVElQTElFUiksIERFRkFVTFRfQ0FQQUNJVFkpO1xuICAgICAgICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLmNhcGFjaXR5ICogdGhpcy5ieXRlc1BlckVsZW1lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBvbGRVaW50OEFycmF5ID0gdGhpcy51aW50ODtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hWaWV3cygpO1xuICAgICAgICAgICAgaWYgKG9sZFVpbnQ4QXJyYXkpIHRoaXMudWludDguc2V0KG9sZFVpbnQ4QXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFR5cGVkQXJyYXkgdmlld3MgZm9yIHRoZSBjdXJyZW50IEFycmF5QnVmZmVyLlxuICAgICAqL1xuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignX3JlZnJlc2hWaWV3cygpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZWFjaCBjb25jcmV0ZSBTdHJ1Y3RBcnJheSBsYXlvdXQnKTtcbiAgICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIG1lbWJlciBmaWVsZHMsIGNyZWF0ZSBhIGZ1bGwgU3RydWN0QXJyYXlMYXlvdXQsIGluXG4gKiBwYXJ0aWN1bGFyIGNhbGN1bGF0aW5nIHRoZSBjb3JyZWN0IGJ5dGUgb2Zmc2V0IGZvciBlYWNoIGZpZWxkLiAgVGhpcyBkYXRhXG4gKiBpcyB1c2VkIGF0IGJ1aWxkIHRpbWUgdG8gZ2VuZXJhdGUgU3RydWN0QXJyYXlMYXlvdXRfKiNlbXBsYWNlQmFjaygpIGFuZFxuICogb3RoZXIgYWNjZXNzb3JzLCBhbmQgYXQgcnVudGltZSBmb3IgYmluZGluZyB2ZXJ0ZXggYnVmZmVyIGF0dHJpYnV0ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTGF5b3V0KFxuICAgIG1lbWJlcnM6IEFycmF5PHsgbmFtZTogc3RyaW5nLCB0eXBlOiBWaWV3VHlwZSwgK2NvbXBvbmVudHM/OiBudW1iZXIsIH0+LFxuICAgIGFsaWdubWVudDogbnVtYmVyID0gMVxuKTogU3RydWN0QXJyYXlMYXlvdXQge1xuXG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgbGV0IG1heFNpemUgPSAwO1xuICAgIGNvbnN0IGxheW91dE1lbWJlcnMgPSBtZW1iZXJzLm1hcCgobWVtYmVyKSA9PiB7XG4gICAgICAgIGFzc2VydChtZW1iZXIubmFtZS5sZW5ndGgpO1xuICAgICAgICBjb25zdCB0eXBlU2l6ZSA9IHNpemVPZihtZW1iZXIudHlwZSk7XG4gICAgICAgIGNvbnN0IG1lbWJlck9mZnNldCA9IG9mZnNldCA9IGFsaWduKG9mZnNldCwgTWF0aC5tYXgoYWxpZ25tZW50LCB0eXBlU2l6ZSkpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gbWVtYmVyLmNvbXBvbmVudHMgfHwgMTtcblxuICAgICAgICBtYXhTaXplID0gTWF0aC5tYXgobWF4U2l6ZSwgdHlwZVNpemUpO1xuICAgICAgICBvZmZzZXQgKz0gdHlwZVNpemUgKiBjb21wb25lbnRzO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBtZW1iZXIubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IG1lbWJlci50eXBlLFxuICAgICAgICAgICAgY29tcG9uZW50cyxcbiAgICAgICAgICAgIG9mZnNldDogbWVtYmVyT2Zmc2V0LFxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2l6ZSA9IGFsaWduKG9mZnNldCwgTWF0aC5tYXgobWF4U2l6ZSwgYWxpZ25tZW50KSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBtZW1iZXJzOiBsYXlvdXRNZW1iZXJzLFxuICAgICAgICBzaXplLFxuICAgICAgICBhbGlnbm1lbnRcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBzaXplT2YodHlwZTogVmlld1R5cGUpOiBudW1iZXIge1xuICAgIHJldHVybiB2aWV3VHlwZXNbdHlwZV0uQllURVNfUEVSX0VMRU1FTlQ7XG59XG5cbmZ1bmN0aW9uIGFsaWduKG9mZnNldDogbnVtYmVyLCBzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLmNlaWwob2Zmc2V0IC8gc2l6ZSkgKiBzaXplO1xufVxuXG5leHBvcnQge1N0cnVjdEFycmF5LCBTdHJ1Y3QsIHZpZXdUeXBlcywgY3JlYXRlTGF5b3V0fTtcbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3RydWN0LWFycmF5cy5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG4vLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge1N0cnVjdCwgU3RydWN0QXJyYXl9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJpNCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyaTQucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQ7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyaTQnLCBTdHJ1Y3RBcnJheUxheW91dDJpNCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDRpOCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDQ7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0NGk4LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA4O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0NGk4JywgU3RydWN0QXJyYXlMYXlvdXQ0aTgpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEludDE2WzJdXG4gKiBbNF06IFVpbnQ4WzRdXG4gKiBbOF06IEZsb2F0MzJbMV1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJpNHViMWYxMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiA2O1xuICAgICAgICBjb25zdCBvMSA9IGkgKiAxMjtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMztcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgNF0gPSB2MjtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDVdID0gdjM7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyA2XSA9IHY0O1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgN10gPSB2NTtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMl0gPSB2NjtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJpNHViMWYxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyaTR1YjFmMTInLCBTdHJ1Y3RBcnJheUxheW91dDJpNHViMWYxMik7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogRmxvYXQzMlszXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0M2YxMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAzO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAyXSA9IHYyO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0M2YxMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQzZjEyJywgU3RydWN0QXJyYXlMYXlvdXQzZjEyKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBVaW50MTZbMTBdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQxMHVpMjAgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIsIHY4OiBudW1iZXIsIHY5OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMTA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA0XSA9IHY0O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDVdID0gdjU7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNl0gPSB2NjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA3XSA9IHY3O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDhdID0gdjg7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgOV0gPSB2OTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDEwdWkyMC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMjA7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQxMHVpMjAnLCBTdHJ1Y3RBcnJheUxheW91dDEwdWkyMCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDE2WzhdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ4dWkxNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2Nyk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogODtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA2XSA9IHY2O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDddID0gdjc7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ4dWkxNi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTY7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ4dWkxNicsIFN0cnVjdEFycmF5TGF5b3V0OHVpMTYpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEludDE2WzRdXG4gKiBbOF06IFVpbnQxNls0XVxuICogWzE2XTogSW50MTZbNF1cbiAqIFsyNF06IEludDE2WzRdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTRpNGkzMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIsIHY4OiBudW1iZXIsIHY5OiBudW1iZXIsIHYxMDogbnVtYmVyLCB2MTE6IG51bWJlciwgdjEyOiBudW1iZXIsIHYxMzogbnVtYmVyLCB2MTQ6IG51bWJlciwgdjE1OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIsIHYxMjogbnVtYmVyLCB2MTM6IG51bWJlciwgdjE0OiBudW1iZXIsIHYxNTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDE2O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA0XSA9IHY0O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDVdID0gdjU7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNl0gPSB2NjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA3XSA9IHY3O1xuICAgICAgICB0aGlzLmludDE2W28yICsgOF0gPSB2ODtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDldID0gdjk7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxMF0gPSB2MTA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxMV0gPSB2MTE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxMl0gPSB2MTI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxM10gPSB2MTM7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxNF0gPSB2MTQ7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxNV0gPSB2MTU7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTRpNGkzMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMzI7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTRpNGkzMicsIFN0cnVjdEFycmF5TGF5b3V0NGk0dWk0aTRpMzIpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQzMlsxXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MXVsNCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICB1aW50MzI6IFVpbnQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAxO1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQxdWw0LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0MXVsNCcsIFN0cnVjdEFycmF5TGF5b3V0MXVsNCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbNV1cbiAqIFsxMl06IEZsb2F0MzJbNF1cbiAqIFsyOF06IEludDE2WzFdXG4gKiBbMzJdOiBVaW50MzJbMV1cbiAqIFszNl06IFVpbnQxNlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0NWk0ZjFpMXVsMnVpNDAgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuICAgIHVpbnQzMjogVWludDMyQXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIsIHYxMTogbnVtYmVyLCB2MTI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMik7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIsIHY4OiBudW1iZXIsIHY5OiBudW1iZXIsIHYxMDogbnVtYmVyLCB2MTE6IG51bWJlciwgdjEyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMjA7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDEwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDNdID0gdjU7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDRdID0gdjY7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDVdID0gdjc7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDZdID0gdjg7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxNF0gPSB2OTtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyA4XSA9IHYxMDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxOF0gPSB2MTE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTldID0gdjEyO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0NWk0ZjFpMXVsMnVpNDAucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQwO1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0NWk0ZjFpMXVsMnVpNDAnLCBTdHJ1Y3RBcnJheUxheW91dDVpNGYxaTF1bDJ1aTQwKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlszXVxuICogWzhdOiBJbnQxNlsyXVxuICogWzEyXTogSW50MTZbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDNpMmkyaTE2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2Nik7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogODtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDRdID0gdjM7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA1XSA9IHY0O1xuICAgICAgICB0aGlzLmludDE2W28yICsgNl0gPSB2NTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDddID0gdjY7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQzaTJpMmkxNi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTY7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQzaTJpMmkxNicsIFN0cnVjdEFycmF5TGF5b3V0M2kyaTJpMTYpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbMl1cbiAqIFs4XTogRmxvYXQzMlsxXVxuICogWzEyXTogSW50MTZbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJmMWYyaTE2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvNCA9IGkgKiA0O1xuICAgICAgICBjb25zdCBvMiA9IGkgKiA4O1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgNl0gPSB2MztcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDddID0gdjQ7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyZjFmMmkxNi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTY7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyZjFmMmkxNicsIFN0cnVjdEFycmF5TGF5b3V0MmYxZjJpMTYpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQ4WzJdXG4gKiBbNF06IEZsb2F0MzJbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJ1YjJmMTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8xID0gaSAqIDEyO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAzO1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDJdID0gdjM7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQydWIyZjEyLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxMjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDJ1YjJmMTInLCBTdHJ1Y3RBcnJheUxheW91dDJ1YjJmMTIpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQxNlszXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0M3VpNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDM7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQzdWk2LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA2O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0M3VpNicsIFN0cnVjdEFycmF5TGF5b3V0M3VpNik7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbM11cbiAqIFs4XTogRmxvYXQzMlsyXVxuICogWzE2XTogVWludDE2WzJdXG4gKiBbMjBdOiBVaW50MzJbM11cbiAqIFszMl06IFVpbnQxNlszXVxuICogWzQwXTogRmxvYXQzMlsyXVxuICogWzQ4XTogVWludDhbM11cbiAqIFs1Ml06IFVpbnQzMlsxXVxuICogWzU2XTogSW50MTZbMV1cbiAqIFs1OF06IFVpbnQ4WzFdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQzaTJmMnVpM3VsM3VpMmYzdWIxdWwxaTF1YjYwIGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuICAgIHVpbnQzMjogVWludDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIsIHY4OiBudW1iZXIsIHY5OiBudW1iZXIsIHYxMDogbnVtYmVyLCB2MTE6IG51bWJlciwgdjEyOiBudW1iZXIsIHYxMzogbnVtYmVyLCB2MTQ6IG51bWJlciwgdjE1OiBudW1iZXIsIHYxNjogbnVtYmVyLCB2MTc6IG51bWJlciwgdjE4OiBudW1iZXIsIHYxOTogbnVtYmVyLCB2MjA6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjApO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIsIHYxMjogbnVtYmVyLCB2MTM6IG51bWJlciwgdjE0OiBudW1iZXIsIHYxNTogbnVtYmVyLCB2MTY6IG51bWJlciwgdjE3OiBudW1iZXIsIHYxODogbnVtYmVyLCB2MTk6IG51bWJlciwgdjIwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMzA7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDE1O1xuICAgICAgICBjb25zdCBvMSA9IGkgKiA2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMl0gPSB2MztcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgM10gPSB2NDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA4XSA9IHY1O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDldID0gdjY7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgNV0gPSB2NztcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyA2XSA9IHY4O1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDddID0gdjk7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTZdID0gdjEwO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDE3XSA9IHYxMTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxOF0gPSB2MTI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDEwXSA9IHYxMztcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMTFdID0gdjE0O1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgNDhdID0gdjE1O1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgNDldID0gdjE2O1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgNTBdID0gdjE3O1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDEzXSA9IHYxODtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDI4XSA9IHYxOTtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDU4XSA9IHYyMDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDNpMmYydWkzdWwzdWkyZjN1YjF1bDFpMXViNjAucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDYwO1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0M2kyZjJ1aTN1bDN1aTJmM3ViMXVsMWkxdWI2MCcsIFN0cnVjdEFycmF5TGF5b3V0M2kyZjJ1aTN1bDN1aTJmM3ViMXVsMWkxdWI2MCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbM11cbiAqIFs4XTogRmxvYXQzMlsyXVxuICogWzE2XTogSW50MTZbNl1cbiAqIFsyOF06IFVpbnQxNlsxNV1cbiAqIFs2MF06IFVpbnQzMlsxXVxuICogWzY0XTogRmxvYXQzMlszXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0M2kyZjZpMTV1aTF1bDNmNzYgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG4gICAgdWludDMyOiBVaW50MzJBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIsIHYxMTogbnVtYmVyLCB2MTI6IG51bWJlciwgdjEzOiBudW1iZXIsIHYxNDogbnVtYmVyLCB2MTU6IG51bWJlciwgdjE2OiBudW1iZXIsIHYxNzogbnVtYmVyLCB2MTg6IG51bWJlciwgdjE5OiBudW1iZXIsIHYyMDogbnVtYmVyLCB2MjE6IG51bWJlciwgdjIyOiBudW1iZXIsIHYyMzogbnVtYmVyLCB2MjQ6IG51bWJlciwgdjI1OiBudW1iZXIsIHYyNjogbnVtYmVyLCB2Mjc6IG51bWJlciwgdjI4OiBudW1iZXIsIHYyOTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5LCB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIsIHY4OiBudW1iZXIsIHY5OiBudW1iZXIsIHYxMDogbnVtYmVyLCB2MTE6IG51bWJlciwgdjEyOiBudW1iZXIsIHYxMzogbnVtYmVyLCB2MTQ6IG51bWJlciwgdjE1OiBudW1iZXIsIHYxNjogbnVtYmVyLCB2MTc6IG51bWJlciwgdjE4OiBudW1iZXIsIHYxOTogbnVtYmVyLCB2MjA6IG51bWJlciwgdjIxOiBudW1iZXIsIHYyMjogbnVtYmVyLCB2MjM6IG51bWJlciwgdjI0OiBudW1iZXIsIHYyNTogbnVtYmVyLCB2MjY6IG51bWJlciwgdjI3OiBudW1iZXIsIHYyODogbnVtYmVyLCB2Mjk6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAzODtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMTk7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDJdID0gdjM7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDNdID0gdjQ7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA4XSA9IHY1O1xuICAgICAgICB0aGlzLmludDE2W28yICsgOV0gPSB2NjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDEwXSA9IHY3O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMTFdID0gdjg7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxMl0gPSB2OTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDEzXSA9IHYxMDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxNF0gPSB2MTE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTVdID0gdjEyO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDE2XSA9IHYxMztcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxN10gPSB2MTQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMThdID0gdjE1O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDE5XSA9IHYxNjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyMF0gPSB2MTc7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMjFdID0gdjE4O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDIyXSA9IHYxOTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyM10gPSB2MjA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMjRdID0gdjIxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDI1XSA9IHYyMjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyNl0gPSB2MjM7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMjddID0gdjI0O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDI4XSA9IHYyNTtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyAxNV0gPSB2MjY7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDE2XSA9IHYyNztcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMTddID0gdjI4O1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxOF0gPSB2Mjk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQzaTJmNmkxNXVpMXVsM2Y3Ni5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNzY7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQzaTJmNmkxNXVpMXVsM2Y3NicsIFN0cnVjdEFycmF5TGF5b3V0M2kyZjZpMTV1aTF1bDNmNzYpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbMV1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDFmNCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMTtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDFmNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNDtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDFmNCcsIFN0cnVjdEFycmF5TGF5b3V0MWY0KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlszXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0M2k2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAzO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0M2k2LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA2O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0M2k2JywgU3RydWN0QXJyYXlMYXlvdXQzaTYpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbN11cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDdmMjggZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDc7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDNdID0gdjM7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDVdID0gdjU7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDZdID0gdjY7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ3ZjI4LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAyODtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDdmMjgnLCBTdHJ1Y3RBcnJheUxheW91dDdmMjgpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQzMlsxXVxuICogWzRdOiBVaW50MTZbM11cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDF1bDN1aTEyIGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQzMjogVWludDMyQXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDM7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDY7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyXSA9IHYxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDNdID0gdjI7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNF0gPSB2MztcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDF1bDN1aTEyLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxMjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDF1bDN1aTEyJywgU3RydWN0QXJyYXlMYXlvdXQxdWwzdWkxMik7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDE2WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQydWk0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlcikge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAyO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJ1aTQucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQ7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQydWk0JywgU3RydWN0QXJyYXlMYXlvdXQydWk0KTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBVaW50MTZbMV1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDF1aTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0MXVpMi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMjtcbnJlZ2lzdGVyKCdTdHJ1Y3RBcnJheUxheW91dDF1aTInLCBTdHJ1Y3RBcnJheUxheW91dDF1aTIpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDJmOCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjE7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyZjgucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDg7XG5yZWdpc3RlcignU3RydWN0QXJyYXlMYXlvdXQyZjgnLCBTdHJ1Y3RBcnJheUxheW91dDJmOCk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogRmxvYXQzMls0XVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0NGYxNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlcikge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2Myk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgbzQgPSBpICogNDtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgM10gPSB2MztcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDRmMTYucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDE2O1xucmVnaXN0ZXIoJ1N0cnVjdEFycmF5TGF5b3V0NGYxNicsIFN0cnVjdEFycmF5TGF5b3V0NGYxNik7XG5cbmNsYXNzIENvbGxpc2lvbkJveFN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgX3N0cnVjdEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheTtcbiAgICBwcm9qZWN0ZWRBbmNob3JYOiBudW1iZXI7XG4gICAgcHJvamVjdGVkQW5jaG9yWTogbnVtYmVyO1xuICAgIHByb2plY3RlZEFuY2hvclo6IG51bWJlcjtcbiAgICB0aWxlQW5jaG9yWDogbnVtYmVyO1xuICAgIHRpbGVBbmNob3JZOiBudW1iZXI7XG4gICAgeDE6IG51bWJlcjtcbiAgICB5MTogbnVtYmVyO1xuICAgIHgyOiBudW1iZXI7XG4gICAgeTI6IG51bWJlcjtcbiAgICBwYWRkaW5nOiBudW1iZXI7XG4gICAgZmVhdHVyZUluZGV4OiBudW1iZXI7XG4gICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyO1xuICAgIGJ1Y2tldEluZGV4OiBudW1iZXI7XG4gICAgZ2V0IHByb2plY3RlZEFuY2hvclgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF07IH1cbiAgICBnZXQgcHJvamVjdGVkQW5jaG9yWSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXTsgfVxuICAgIGdldCBwcm9qZWN0ZWRBbmNob3JaKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDJdOyB9XG4gICAgZ2V0IHRpbGVBbmNob3JYKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDNdOyB9XG4gICAgZ2V0IHRpbGVBbmNob3JZKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDRdOyB9XG4gICAgZ2V0IHgxKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgM107IH1cbiAgICBnZXQgeTEoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyA0XTsgfVxuICAgIGdldCB4MigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDVdOyB9XG4gICAgZ2V0IHkyKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgNl07IH1cbiAgICBnZXQgcGFkZGluZygpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxNF07IH1cbiAgICBnZXQgZmVhdHVyZUluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyA4XTsgfVxuICAgIGdldCBzb3VyY2VMYXllckluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxOF07IH1cbiAgICBnZXQgYnVja2V0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE5XTsgfVxufVxuXG5Db2xsaXNpb25Cb3hTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSA0MDtcblxuZXhwb3J0IHR5cGUgQ29sbGlzaW9uQm94ID0gQ29sbGlzaW9uQm94U3RydWN0O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsaXNpb25Cb3hBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0NWk0ZjFpMXVsMnVpNDAge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgQ29sbGlzaW9uQm94U3RydWN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldChpbmRleDogbnVtYmVyKTogQ29sbGlzaW9uQm94U3RydWN0IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IENvbGxpc2lvbkJveFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignQ29sbGlzaW9uQm94QXJyYXknLCBDb2xsaXNpb25Cb3hBcnJheSk7XG5cbmNsYXNzIFBsYWNlZFN5bWJvbFN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgX3N0cnVjdEFycmF5OiBQbGFjZWRTeW1ib2xBcnJheTtcbiAgICBwcm9qZWN0ZWRBbmNob3JYOiBudW1iZXI7XG4gICAgcHJvamVjdGVkQW5jaG9yWTogbnVtYmVyO1xuICAgIHByb2plY3RlZEFuY2hvclo6IG51bWJlcjtcbiAgICB0aWxlQW5jaG9yWDogbnVtYmVyO1xuICAgIHRpbGVBbmNob3JZOiBudW1iZXI7XG4gICAgZ2x5cGhTdGFydEluZGV4OiBudW1iZXI7XG4gICAgbnVtR2x5cGhzOiBudW1iZXI7XG4gICAgdmVydGV4U3RhcnRJbmRleDogbnVtYmVyO1xuICAgIGxpbmVTdGFydEluZGV4OiBudW1iZXI7XG4gICAgbGluZUxlbmd0aDogbnVtYmVyO1xuICAgIHNlZ21lbnQ6IG51bWJlcjtcbiAgICBsb3dlclNpemU6IG51bWJlcjtcbiAgICB1cHBlclNpemU6IG51bWJlcjtcbiAgICBsaW5lT2Zmc2V0WDogbnVtYmVyO1xuICAgIGxpbmVPZmZzZXRZOiBudW1iZXI7XG4gICAgd3JpdGluZ01vZGU6IG51bWJlcjtcbiAgICBwbGFjZWRPcmllbnRhdGlvbjogbnVtYmVyO1xuICAgIGhpZGRlbjogbnVtYmVyO1xuICAgIGNyb3NzVGlsZUlEOiBudW1iZXI7XG4gICAgYXNzb2NpYXRlZEljb25JbmRleDogbnVtYmVyO1xuICAgIGZsaXBTdGF0ZTogbnVtYmVyO1xuICAgIGdldCBwcm9qZWN0ZWRBbmNob3JYKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdOyB9XG4gICAgZ2V0IHByb2plY3RlZEFuY2hvclkoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV07IH1cbiAgICBnZXQgcHJvamVjdGVkQW5jaG9yWigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyXTsgfVxuICAgIGdldCB0aWxlQW5jaG9yWCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDJdOyB9XG4gICAgZ2V0IHRpbGVBbmNob3JZKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgM107IH1cbiAgICBnZXQgZ2x5cGhTdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyA4XTsgfVxuICAgIGdldCBudW1HbHlwaHMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDldOyB9XG4gICAgZ2V0IHZlcnRleFN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDVdOyB9XG4gICAgZ2V0IGxpbmVTdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyA2XTsgfVxuICAgIGdldCBsaW5lTGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyA3XTsgfVxuICAgIGdldCBzZWdtZW50KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxNl07IH1cbiAgICBnZXQgbG93ZXJTaXplKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxN107IH1cbiAgICBnZXQgdXBwZXJTaXplKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxOF07IH1cbiAgICBnZXQgbGluZU9mZnNldFgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAxMF07IH1cbiAgICBnZXQgbGluZU9mZnNldFkoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAxMV07IH1cbiAgICBnZXQgd3JpdGluZ01vZGUoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgNDhdOyB9XG4gICAgZ2V0IHBsYWNlZE9yaWVudGF0aW9uKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSArIDQ5XTsgfVxuICAgIHNldCBwbGFjZWRPcmllbnRhdGlvbih4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSArIDQ5XSA9IHg7IH1cbiAgICBnZXQgaGlkZGVuKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSArIDUwXTsgfVxuICAgIHNldCBoaWRkZW4oeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyA1MF0gPSB4OyB9XG4gICAgZ2V0IGNyb3NzVGlsZUlEKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAxM107IH1cbiAgICBzZXQgY3Jvc3NUaWxlSUQoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMTNdID0geDsgfVxuICAgIGdldCBhc3NvY2lhdGVkSWNvbkluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDI4XTsgfVxuICAgIGdldCBmbGlwU3RhdGUoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgNThdOyB9XG4gICAgc2V0IGZsaXBTdGF0ZSh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSArIDU4XSA9IHg7IH1cbn1cblxuUGxhY2VkU3ltYm9sU3RydWN0LnByb3RvdHlwZS5zaXplID0gNjA7XG5cbmV4cG9ydCB0eXBlIFBsYWNlZFN5bWJvbCA9IFBsYWNlZFN5bWJvbFN0cnVjdDtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgUGxhY2VkU3ltYm9sQXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDNpMmYydWkzdWwzdWkyZjN1YjF1bDFpMXViNjAge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgUGxhY2VkU3ltYm9sU3RydWN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldChpbmRleDogbnVtYmVyKTogUGxhY2VkU3ltYm9sU3RydWN0IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IFBsYWNlZFN5bWJvbFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignUGxhY2VkU3ltYm9sQXJyYXknLCBQbGFjZWRTeW1ib2xBcnJheSk7XG5cbmNsYXNzIFN5bWJvbEluc3RhbmNlU3RydWN0IGV4dGVuZHMgU3RydWN0IHtcbiAgICBfc3RydWN0QXJyYXk6IFN5bWJvbEluc3RhbmNlQXJyYXk7XG4gICAgcHJvamVjdGVkQW5jaG9yWDogbnVtYmVyO1xuICAgIHByb2plY3RlZEFuY2hvclk6IG51bWJlcjtcbiAgICBwcm9qZWN0ZWRBbmNob3JaOiBudW1iZXI7XG4gICAgdGlsZUFuY2hvclg6IG51bWJlcjtcbiAgICB0aWxlQW5jaG9yWTogbnVtYmVyO1xuICAgIHJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4OiBudW1iZXI7XG4gICAgY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4OiBudW1iZXI7XG4gICAgbGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleDogbnVtYmVyO1xuICAgIHZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4OiBudW1iZXI7XG4gICAgcGxhY2VkSWNvblN5bWJvbEluZGV4OiBudW1iZXI7XG4gICAgdmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXg6IG51bWJlcjtcbiAgICBrZXk6IG51bWJlcjtcbiAgICB0ZXh0Qm94U3RhcnRJbmRleDogbnVtYmVyO1xuICAgIHRleHRCb3hFbmRJbmRleDogbnVtYmVyO1xuICAgIHZlcnRpY2FsVGV4dEJveFN0YXJ0SW5kZXg6IG51bWJlcjtcbiAgICB2ZXJ0aWNhbFRleHRCb3hFbmRJbmRleDogbnVtYmVyO1xuICAgIGljb25Cb3hTdGFydEluZGV4OiBudW1iZXI7XG4gICAgaWNvbkJveEVuZEluZGV4OiBudW1iZXI7XG4gICAgdmVydGljYWxJY29uQm94U3RhcnRJbmRleDogbnVtYmVyO1xuICAgIHZlcnRpY2FsSWNvbkJveEVuZEluZGV4OiBudW1iZXI7XG4gICAgZmVhdHVyZUluZGV4OiBudW1iZXI7XG4gICAgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXM6IG51bWJlcjtcbiAgICBudW1WZXJ0aWNhbEdseXBoVmVydGljZXM6IG51bWJlcjtcbiAgICBudW1JY29uVmVydGljZXM6IG51bWJlcjtcbiAgICBudW1WZXJ0aWNhbEljb25WZXJ0aWNlczogbnVtYmVyO1xuICAgIHVzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzOiBudW1iZXI7XG4gICAgY3Jvc3NUaWxlSUQ6IG51bWJlcjtcbiAgICB0ZXh0T2Zmc2V0MDogbnVtYmVyO1xuICAgIHRleHRPZmZzZXQxOiBudW1iZXI7XG4gICAgY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXI6IG51bWJlcjtcbiAgICBnZXQgcHJvamVjdGVkQW5jaG9yWCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAwXTsgfVxuICAgIGdldCBwcm9qZWN0ZWRBbmNob3JZKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdOyB9XG4gICAgZ2V0IHByb2plY3RlZEFuY2hvclooKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl07IH1cbiAgICBnZXQgdGlsZUFuY2hvclgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAyXTsgfVxuICAgIGdldCB0aWxlQW5jaG9yWSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDNdOyB9XG4gICAgZ2V0IHJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDhdOyB9XG4gICAgZ2V0IGNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA5XTsgfVxuICAgIGdldCBsZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDEwXTsgfVxuICAgIGdldCB2ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxMV07IH1cbiAgICBnZXQgcGxhY2VkSWNvblN5bWJvbEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDEyXTsgfVxuICAgIGdldCB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxM107IH1cbiAgICBnZXQga2V5KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxNF07IH1cbiAgICBnZXQgdGV4dEJveFN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE1XTsgfVxuICAgIGdldCB0ZXh0Qm94RW5kSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE2XTsgfVxuICAgIGdldCB2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxN107IH1cbiAgICBnZXQgdmVydGljYWxUZXh0Qm94RW5kSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE4XTsgfVxuICAgIGdldCBpY29uQm94U3RhcnRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTldOyB9XG4gICAgZ2V0IGljb25Cb3hFbmRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMjBdOyB9XG4gICAgZ2V0IHZlcnRpY2FsSWNvbkJveFN0YXJ0SW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDIxXTsgfVxuICAgIGdldCB2ZXJ0aWNhbEljb25Cb3hFbmRJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMjJdOyB9XG4gICAgZ2V0IGZlYXR1cmVJbmRleCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMjNdOyB9XG4gICAgZ2V0IG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyNF07IH1cbiAgICBnZXQgbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyNV07IH1cbiAgICBnZXQgbnVtSWNvblZlcnRpY2VzKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyNl07IH1cbiAgICBnZXQgbnVtVmVydGljYWxJY29uVmVydGljZXMoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDI3XTsgfVxuICAgIGdldCB1c2VSdW50aW1lQ29sbGlzaW9uQ2lyY2xlcygpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMjhdOyB9XG4gICAgZ2V0IGNyb3NzVGlsZUlEKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAxNV07IH1cbiAgICBzZXQgY3Jvc3NUaWxlSUQoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMTVdID0geDsgfVxuICAgIGdldCB0ZXh0T2Zmc2V0MCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDE2XTsgfVxuICAgIGdldCB0ZXh0T2Zmc2V0MSgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDE3XTsgfVxuICAgIGdldCBjb2xsaXNpb25DaXJjbGVEaWFtZXRlcigpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDE4XTsgfVxufVxuXG5TeW1ib2xJbnN0YW5jZVN0cnVjdC5wcm90b3R5cGUuc2l6ZSA9IDc2O1xuXG5leHBvcnQgdHlwZSBTeW1ib2xJbnN0YW5jZSA9IFN5bWJvbEluc3RhbmNlU3RydWN0O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBTeW1ib2xJbnN0YW5jZUFycmF5IGV4dGVuZHMgU3RydWN0QXJyYXlMYXlvdXQzaTJmNmkxNXVpMXVsM2Y3NiB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBTeW1ib2xJbnN0YW5jZVN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQoaW5kZXg6IG51bWJlcik6IFN5bWJvbEluc3RhbmNlU3RydWN0IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IFN5bWJvbEluc3RhbmNlU3RydWN0KHRoaXMsIGluZGV4KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdTeW1ib2xJbnN0YW5jZUFycmF5JywgU3ltYm9sSW5zdGFuY2VBcnJheSk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEdseXBoT2Zmc2V0QXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDFmNCB7XG4gICAgZ2V0b2Zmc2V0WChpbmRleDogbnVtYmVyKSB7IHJldHVybiB0aGlzLmZsb2F0MzJbaW5kZXggKiAxICsgMF07IH1cbn1cblxucmVnaXN0ZXIoJ0dseXBoT2Zmc2V0QXJyYXknLCBHbHlwaE9mZnNldEFycmF5KTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgU3ltYm9sTGluZVZlcnRleEFycmF5IGV4dGVuZHMgU3RydWN0QXJyYXlMYXlvdXQzaTYge1xuICAgIGdldHgoaW5kZXg6IG51bWJlcikgeyByZXR1cm4gdGhpcy5pbnQxNltpbmRleCAqIDMgKyAwXTsgfVxuICAgIGdldHkoaW5kZXg6IG51bWJlcikgeyByZXR1cm4gdGhpcy5pbnQxNltpbmRleCAqIDMgKyAxXTsgfVxuICAgIGdldHRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yKGluZGV4OiBudW1iZXIpIHsgcmV0dXJuIHRoaXMuaW50MTZbaW5kZXggKiAzICsgMl07IH1cbn1cblxucmVnaXN0ZXIoJ1N5bWJvbExpbmVWZXJ0ZXhBcnJheScsIFN5bWJvbExpbmVWZXJ0ZXhBcnJheSk7XG5cbmNsYXNzIEZlYXR1cmVJbmRleFN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgX3N0cnVjdEFycmF5OiBGZWF0dXJlSW5kZXhBcnJheTtcbiAgICBmZWF0dXJlSW5kZXg6IG51bWJlcjtcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXI7XG4gICAgYnVja2V0SW5kZXg6IG51bWJlcjtcbiAgICBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldDogbnVtYmVyO1xuICAgIGdldCBmZWF0dXJlSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDBdOyB9XG4gICAgZ2V0IHNvdXJjZUxheWVySW5kZXgoKSB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDJdOyB9XG4gICAgZ2V0IGJ1Y2tldEluZGV4KCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAzXTsgfVxuICAgIGdldCBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgNF07IH1cbn1cblxuRmVhdHVyZUluZGV4U3RydWN0LnByb3RvdHlwZS5zaXplID0gMTI7XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVJbmRleCA9IEZlYXR1cmVJbmRleFN0cnVjdDtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgRmVhdHVyZUluZGV4QXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDF1bDN1aTEyIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIEZlYXR1cmVJbmRleFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQoaW5kZXg6IG51bWJlcik6IEZlYXR1cmVJbmRleFN0cnVjdCB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGZWF0dXJlSW5kZXhTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0ZlYXR1cmVJbmRleEFycmF5JywgRmVhdHVyZUluZGV4QXJyYXkpO1xuXG5jbGFzcyBGaWxsRXh0cnVzaW9uQ2VudHJvaWRTdHJ1Y3QgZXh0ZW5kcyBTdHJ1Y3Qge1xuICAgIF9zdHJ1Y3RBcnJheTogRmlsbEV4dHJ1c2lvbkNlbnRyb2lkQXJyYXk7XG4gICAgYV9jZW50cm9pZF9wb3MwOiBudW1iZXI7XG4gICAgYV9jZW50cm9pZF9wb3MxOiBudW1iZXI7XG4gICAgZ2V0IGFfY2VudHJvaWRfcG9zMCgpIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMF07IH1cbiAgICBnZXQgYV9jZW50cm9pZF9wb3MxKCkgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxXTsgfVxufVxuXG5GaWxsRXh0cnVzaW9uQ2VudHJvaWRTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSA0O1xuXG5leHBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uQ2VudHJvaWQgPSBGaWxsRXh0cnVzaW9uQ2VudHJvaWRTdHJ1Y3Q7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGxFeHRydXNpb25DZW50cm9pZEFycmF5IGV4dGVuZHMgU3RydWN0QXJyYXlMYXlvdXQydWk0IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIEZpbGxFeHRydXNpb25DZW50cm9pZFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQoaW5kZXg6IG51bWJlcik6IEZpbGxFeHRydXNpb25DZW50cm9pZFN0cnVjdCB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGaWxsRXh0cnVzaW9uQ2VudHJvaWRTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0ZpbGxFeHRydXNpb25DZW50cm9pZEFycmF5JywgRmlsbEV4dHJ1c2lvbkNlbnRyb2lkQXJyYXkpO1xuXG5leHBvcnQge1xuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0dWIxZjEyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2YxMixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDEwdWkyMCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDh1aTE2LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk0dWk0aTRpMzIsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxdWw0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NWk0ZjFpMXVsMnVpNDAsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzaTJpMmkxNixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJmMWYyaTE2LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MnViMmYxMixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDN1aTYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzaTJmMnVpM3VsM3VpMmYzdWIxdWwxaTF1YjYwLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2kyZjZpMTV1aTF1bDNmNzYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxZjQsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzaTYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ3ZjI4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MXVsM3VpMTIsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQydWk0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MXVpMixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJmOCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDRmMTYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTQgYXMgUG9zQXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ0aTggYXMgUmFzdGVyQm91bmRzQXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTQgYXMgQ2lyY2xlTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTQgYXMgRmlsbExheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk4IGFzIEZpbGxFeHRydXNpb25MYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNCBhcyBIZWF0bWFwTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTR1YjFmMTIgYXMgTGluZUxheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2YxMiBhcyBMaW5lRXh0TGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxMHVpMjAgYXMgUGF0dGVybkxheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0OHVpMTYgYXMgRGFzaExheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk0dWk0aTRpMzIgYXMgU3ltYm9sTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzZjEyIGFzIFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDF1bDQgYXMgU3ltYm9sT3BhY2l0eUFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2kyaTJpMTYgYXMgQ29sbGlzaW9uQm94TGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyZjFmMmkxNiBhcyBDb2xsaXNpb25DaXJjbGVMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJ1YjJmMTIgYXMgQ29sbGlzaW9uVmVydGV4QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzZjEyIGFzIENvbGxpc2lvblZlcnRleEV4dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M3VpNiBhcyBRdWFkVHJpYW5nbGVBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDdmMjggYXMgR2xvYmVWZXJ0ZXhBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDN1aTYgYXMgVHJpYW5nbGVJbmRleEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MnVpNCBhcyBMaW5lSW5kZXhBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDF1aTIgYXMgTGluZVN0cmlwSW5kZXhBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDNmMTIgYXMgU2t5Ym94VmVydGV4QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ0aTggYXMgVGlsZUJvdW5kc0FycmF5XG59O1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7Y3JlYXRlTGF5b3V0fSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmNvbnN0IHBhdHRlcm5BdHRyaWJ1dGVzID0gY3JlYXRlTGF5b3V0KFtcbiAgICAvLyBbdGwueCwgdGwueSwgYnIueCwgYnIueV1cbiAgICB7bmFtZTogJ2FfcGF0dGVybl90bycsIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50MTYnfSxcbiAgICB7bmFtZTogJ2FfcGF0dGVybl9mcm9tJywgY29tcG9uZW50czogNCwgdHlwZTogJ1VpbnQxNid9LFxuICAgIHtuYW1lOiAnYV9waXhlbF9yYXRpb190bycsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MTYnfSxcbiAgICB7bmFtZTogJ2FfcGl4ZWxfcmF0aW9fZnJvbScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MTYnfSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBwYXR0ZXJuQXR0cmlidXRlcztcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5jb25zdCBkYXNoQXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX2Rhc2hfdG8nLCBjb21wb25lbnRzOiA0LCB0eXBlOiAnVWludDE2J30sIC8vIFt4LCB5LCB3aWR0aCwgdW51c2VkXVxuICAgIHtuYW1lOiAnYV9kYXNoX2Zyb20nLCBjb21wb25lbnRzOiA0LCB0eXBlOiAnVWludDE2J31cbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBkYXNoQXR0cmlidXRlcztcbiIsIi8qKlxuICogSlMgSW1wbGVtZW50YXRpb24gb2YgTXVybXVySGFzaDMgKHIxMzYpIChhcyBvZiBNYXkgMjAsIDIwMTEpXG4gKiBcbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzpnYXJ5LmNvdXJ0QGdtYWlsLmNvbVwiPkdhcnkgQ291cnQ8L2E+XG4gKiBAc2VlIGh0dHA6Ly9naXRodWIuY29tL2dhcnljb3VydC9tdXJtdXJoYXNoLWpzXG4gKiBAYXV0aG9yIDxhIGhyZWY9XCJtYWlsdG86YWFwcGxlYnlAZ21haWwuY29tXCI+QXVzdGluIEFwcGxlYnk8L2E+XG4gKiBAc2VlIGh0dHA6Ly9zaXRlcy5nb29nbGUuY29tL3NpdGUvbXVybXVyaGFzaC9cbiAqIFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBBU0NJSSBvbmx5XG4gKiBAcGFyYW0ge251bWJlcn0gc2VlZCBQb3NpdGl2ZSBpbnRlZ2VyIG9ubHlcbiAqIEByZXR1cm4ge251bWJlcn0gMzItYml0IHBvc2l0aXZlIGludGVnZXIgaGFzaCBcbiAqL1xuXG5mdW5jdGlvbiBtdXJtdXJoYXNoM18zMl9nYyhrZXksIHNlZWQpIHtcblx0dmFyIHJlbWFpbmRlciwgYnl0ZXMsIGgxLCBoMWIsIGMxLCBjMWIsIGMyLCBjMmIsIGsxLCBpO1xuXHRcblx0cmVtYWluZGVyID0ga2V5Lmxlbmd0aCAmIDM7IC8vIGtleS5sZW5ndGggJSA0XG5cdGJ5dGVzID0ga2V5Lmxlbmd0aCAtIHJlbWFpbmRlcjtcblx0aDEgPSBzZWVkO1xuXHRjMSA9IDB4Y2M5ZTJkNTE7XG5cdGMyID0gMHgxYjg3MzU5Mztcblx0aSA9IDA7XG5cdFxuXHR3aGlsZSAoaSA8IGJ5dGVzKSB7XG5cdCAgXHRrMSA9IFxuXHQgIFx0ICAoKGtleS5jaGFyQ29kZUF0KGkpICYgMHhmZikpIHxcblx0ICBcdCAgKChrZXkuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgOCkgfFxuXHQgIFx0ICAoKGtleS5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCAxNikgfFxuXHQgIFx0ICAoKGtleS5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCAyNCk7XG5cdFx0KytpO1xuXHRcdFxuXHRcdGsxID0gKCgoKGsxICYgMHhmZmZmKSAqIGMxKSArICgoKChrMSA+Pj4gMTYpICogYzEpICYgMHhmZmZmKSA8PCAxNikpKSAmIDB4ZmZmZmZmZmY7XG5cdFx0azEgPSAoazEgPDwgMTUpIHwgKGsxID4+PiAxNyk7XG5cdFx0azEgPSAoKCgoazEgJiAweGZmZmYpICogYzIpICsgKCgoKGsxID4+PiAxNikgKiBjMikgJiAweGZmZmYpIDw8IDE2KSkpICYgMHhmZmZmZmZmZjtcblxuXHRcdGgxIF49IGsxO1xuICAgICAgICBoMSA9IChoMSA8PCAxMykgfCAoaDEgPj4+IDE5KTtcblx0XHRoMWIgPSAoKCgoaDEgJiAweGZmZmYpICogNSkgKyAoKCgoaDEgPj4+IDE2KSAqIDUpICYgMHhmZmZmKSA8PCAxNikpKSAmIDB4ZmZmZmZmZmY7XG5cdFx0aDEgPSAoKChoMWIgJiAweGZmZmYpICsgMHg2YjY0KSArICgoKChoMWIgPj4+IDE2KSArIDB4ZTY1NCkgJiAweGZmZmYpIDw8IDE2KSk7XG5cdH1cblx0XG5cdGsxID0gMDtcblx0XG5cdHN3aXRjaCAocmVtYWluZGVyKSB7XG5cdFx0Y2FzZSAzOiBrMSBePSAoa2V5LmNoYXJDb2RlQXQoaSArIDIpICYgMHhmZikgPDwgMTY7XG5cdFx0Y2FzZSAyOiBrMSBePSAoa2V5LmNoYXJDb2RlQXQoaSArIDEpICYgMHhmZikgPDwgODtcblx0XHRjYXNlIDE6IGsxIF49IChrZXkuY2hhckNvZGVBdChpKSAmIDB4ZmYpO1xuXHRcdFxuXHRcdGsxID0gKCgoazEgJiAweGZmZmYpICogYzEpICsgKCgoKGsxID4+PiAxNikgKiBjMSkgJiAweGZmZmYpIDw8IDE2KSkgJiAweGZmZmZmZmZmO1xuXHRcdGsxID0gKGsxIDw8IDE1KSB8IChrMSA+Pj4gMTcpO1xuXHRcdGsxID0gKCgoazEgJiAweGZmZmYpICogYzIpICsgKCgoKGsxID4+PiAxNikgKiBjMikgJiAweGZmZmYpIDw8IDE2KSkgJiAweGZmZmZmZmZmO1xuXHRcdGgxIF49IGsxO1xuXHR9XG5cdFxuXHRoMSBePSBrZXkubGVuZ3RoO1xuXG5cdGgxIF49IGgxID4+PiAxNjtcblx0aDEgPSAoKChoMSAmIDB4ZmZmZikgKiAweDg1ZWJjYTZiKSArICgoKChoMSA+Pj4gMTYpICogMHg4NWViY2E2YikgJiAweGZmZmYpIDw8IDE2KSkgJiAweGZmZmZmZmZmO1xuXHRoMSBePSBoMSA+Pj4gMTM7XG5cdGgxID0gKCgoKGgxICYgMHhmZmZmKSAqIDB4YzJiMmFlMzUpICsgKCgoKGgxID4+PiAxNikgKiAweGMyYjJhZTM1KSAmIDB4ZmZmZikgPDwgMTYpKSkgJiAweGZmZmZmZmZmO1xuXHRoMSBePSBoMSA+Pj4gMTY7XG5cblx0cmV0dXJuIGgxID4+PiAwO1xufVxuXG5pZih0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gbXVybXVyaGFzaDNfMzJfZ2Ncbn0iLCIvKipcbiAqIEpTIEltcGxlbWVudGF0aW9uIG9mIE11cm11ckhhc2gyXG4gKiBcbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzpnYXJ5LmNvdXJ0QGdtYWlsLmNvbVwiPkdhcnkgQ291cnQ8L2E+XG4gKiBAc2VlIGh0dHA6Ly9naXRodWIuY29tL2dhcnljb3VydC9tdXJtdXJoYXNoLWpzXG4gKiBAYXV0aG9yIDxhIGhyZWY9XCJtYWlsdG86YWFwcGxlYnlAZ21haWwuY29tXCI+QXVzdGluIEFwcGxlYnk8L2E+XG4gKiBAc2VlIGh0dHA6Ly9zaXRlcy5nb29nbGUuY29tL3NpdGUvbXVybXVyaGFzaC9cbiAqIFxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBBU0NJSSBvbmx5XG4gKiBAcGFyYW0ge251bWJlcn0gc2VlZCBQb3NpdGl2ZSBpbnRlZ2VyIG9ubHlcbiAqIEByZXR1cm4ge251bWJlcn0gMzItYml0IHBvc2l0aXZlIGludGVnZXIgaGFzaFxuICovXG5cbmZ1bmN0aW9uIG11cm11cmhhc2gyXzMyX2djKHN0ciwgc2VlZCkge1xuICB2YXJcbiAgICBsID0gc3RyLmxlbmd0aCxcbiAgICBoID0gc2VlZCBeIGwsXG4gICAgaSA9IDAsXG4gICAgaztcbiAgXG4gIHdoaWxlIChsID49IDQpIHtcbiAgXHRrID0gXG4gIFx0ICAoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZikpIHxcbiAgXHQgICgoc3RyLmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDgpIHxcbiAgXHQgICgoc3RyLmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDE2KSB8XG4gIFx0ICAoKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCAyNCk7XG4gICAgXG4gICAgayA9ICgoKGsgJiAweGZmZmYpICogMHg1YmQxZTk5NSkgKyAoKCgoayA+Pj4gMTYpICogMHg1YmQxZTk5NSkgJiAweGZmZmYpIDw8IDE2KSk7XG4gICAgayBePSBrID4+PiAyNDtcbiAgICBrID0gKCgoayAmIDB4ZmZmZikgKiAweDViZDFlOTk1KSArICgoKChrID4+PiAxNikgKiAweDViZDFlOTk1KSAmIDB4ZmZmZikgPDwgMTYpKTtcblxuXHRoID0gKCgoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1KSArICgoKChoID4+PiAxNikgKiAweDViZDFlOTk1KSAmIDB4ZmZmZikgPDwgMTYpKSBeIGs7XG5cbiAgICBsIC09IDQ7XG4gICAgKytpO1xuICB9XG4gIFxuICBzd2l0Y2ggKGwpIHtcbiAgY2FzZSAzOiBoIF49IChzdHIuY2hhckNvZGVBdChpICsgMikgJiAweGZmKSA8PCAxNjtcbiAgY2FzZSAyOiBoIF49IChzdHIuY2hhckNvZGVBdChpICsgMSkgJiAweGZmKSA8PCA4O1xuICBjYXNlIDE6IGggXj0gKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhmZik7XG4gICAgICAgICAgaCA9ICgoKGggJiAweGZmZmYpICogMHg1YmQxZTk5NSkgKyAoKCgoaCA+Pj4gMTYpICogMHg1YmQxZTk5NSkgJiAweGZmZmYpIDw8IDE2KSk7XG4gIH1cblxuICBoIF49IGggPj4+IDEzO1xuICBoID0gKCgoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1KSArICgoKChoID4+PiAxNikgKiAweDViZDFlOTk1KSAmIDB4ZmZmZikgPDwgMTYpKTtcbiAgaCBePSBoID4+PiAxNTtcblxuICByZXR1cm4gaCA+Pj4gMDtcbn1cblxuaWYodHlwZW9mIG1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gbXVybXVyaGFzaDJfMzJfZ2Ncbn1cbiIsInZhciBtdXJtdXIzID0gcmVxdWlyZShcIi4vbXVybXVyaGFzaDNfZ2MuanNcIilcbnZhciBtdXJtdXIyID0gcmVxdWlyZShcIi4vbXVybXVyaGFzaDJfZ2MuanNcIilcblxubW9kdWxlLmV4cG9ydHMgPSBtdXJtdXIzXG5tb2R1bGUuZXhwb3J0cy5tdXJtdXIzID0gbXVybXVyM1xubW9kdWxlLmV4cG9ydHMubXVybXVyMiA9IG11cm11cjJcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBtdXJtdXIzIGZyb20gJ211cm11cmhhc2gtanMnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxudHlwZSBTZXJpYWxpemVkRmVhdHVyZVBvc2l0aW9uTWFwID0ge1xuICAgIGlkczogRmxvYXQ2NEFycmF5O1xuICAgIHBvc2l0aW9uczogVWludDMyQXJyYXk7XG59O1xuXG50eXBlIEZlYXR1cmVQb3NpdGlvbiA9IHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgZW5kOiBudW1iZXI7XG59O1xuXG4vLyBBIHRyYW5zZmVyYWJsZSBkYXRhIHN0cnVjdHVyZSB0aGF0IG1hcHMgZmVhdHVyZSBpZHMgdG8gdGhlaXIgaW5kaWNlcyBhbmQgYnVmZmVyIG9mZnNldHNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZlYXR1cmVQb3NpdGlvbk1hcCB7XG4gICAgaWRzOiBBcnJheTxudW1iZXI+O1xuICAgIHBvc2l0aW9uczogQXJyYXk8bnVtYmVyPjtcbiAgICBpbmRleGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaWRzID0gW107XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gW107XG4gICAgICAgIHRoaXMuaW5kZXhlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkZChpZDogbWl4ZWQsIGluZGV4OiBudW1iZXIsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuaWRzLnB1c2goZ2V0TnVtZXJpY0lkKGlkKSk7XG4gICAgICAgIHRoaXMucG9zaXRpb25zLnB1c2goaW5kZXgsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIGdldFBvc2l0aW9ucyhpZDogbWl4ZWQpOiBBcnJheTxGZWF0dXJlUG9zaXRpb24+IHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuaW5kZXhlZCk7XG5cbiAgICAgICAgY29uc3QgaW50SWQgPSBnZXROdW1lcmljSWQoaWQpO1xuXG4gICAgICAgIC8vIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGlkIGluIHRoaXMuaWRzO1xuICAgICAgICAvLyByZWxpZXMgb24gaWRzL3Bvc2l0aW9ucyBiZWluZyBzb3J0ZWQgYnkgaWQsIHdoaWNoIGhhcHBlbnMgaW4gc2VyaWFsaXphdGlvblxuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBqID0gdGhpcy5pZHMubGVuZ3RoIC0gMTtcbiAgICAgICAgd2hpbGUgKGkgPCBqKSB7XG4gICAgICAgICAgICBjb25zdCBtID0gKGkgKyBqKSA+PiAxO1xuICAgICAgICAgICAgaWYgKHRoaXMuaWRzW21dID49IGludElkKSB7XG4gICAgICAgICAgICAgICAgaiA9IG07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGkgPSBtICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMuaWRzW2ldID09PSBpbnRJZCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnBvc2l0aW9uc1szICogaV07XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucG9zaXRpb25zWzMgKiBpICsgMV07XG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLnBvc2l0aW9uc1szICogaSArIDJdO1xuICAgICAgICAgICAgcG9zaXRpb25zLnB1c2goe2luZGV4LCBzdGFydCwgZW5kfSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9ucztcbiAgICB9XG5cbiAgICBzdGF0aWMgc2VyaWFsaXplKG1hcDogRmVhdHVyZVBvc2l0aW9uTWFwLCB0cmFuc2ZlcmFibGVzOiBBcnJheTxBcnJheUJ1ZmZlcj4pOiBTZXJpYWxpemVkRmVhdHVyZVBvc2l0aW9uTWFwIHtcbiAgICAgICAgY29uc3QgaWRzID0gbmV3IEZsb2F0NjRBcnJheShtYXAuaWRzKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gbmV3IFVpbnQzMkFycmF5KG1hcC5wb3NpdGlvbnMpO1xuXG4gICAgICAgIHNvcnQoaWRzLCBwb3NpdGlvbnMsIDAsIGlkcy5sZW5ndGggLSAxKTtcblxuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGlkcy5idWZmZXIsIHBvc2l0aW9ucy5idWZmZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtpZHMsIHBvc2l0aW9uc307XG4gICAgfVxuXG4gICAgc3RhdGljIGRlc2VyaWFsaXplKG9iajogU2VyaWFsaXplZEZlYXR1cmVQb3NpdGlvbk1hcCk6IEZlYXR1cmVQb3NpdGlvbk1hcCB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBGZWF0dXJlUG9zaXRpb25NYXAoKTtcbiAgICAgICAgLy8gYWZ0ZXIgdHJhbnNmZXJyaW5nLCB3ZSBvbmx5IHVzZSB0aGVzZSBhcnJheXMgc3RhdGljYWxseSAobm8gcHVzaGVzKSxcbiAgICAgICAgLy8gc28gVHlwZWRBcnJheSB2cyBBcnJheSBkaXN0aW5jdGlvbiB0aGF0IGZsb3cgcG9pbnRzIG91dCBkb2Vzbid0IG1hdHRlclxuICAgICAgICBtYXAuaWRzID0gKG9iai5pZHM6IGFueSk7XG4gICAgICAgIG1hcC5wb3NpdGlvbnMgPSAob2JqLnBvc2l0aW9uczogYW55KTtcbiAgICAgICAgbWFwLmluZGV4ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0TnVtZXJpY0lkKHZhbHVlOiBtaXhlZCkge1xuICAgIGNvbnN0IG51bVZhbHVlID0gK3ZhbHVlO1xuICAgIGlmICghaXNOYU4obnVtVmFsdWUpICYmIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSIDw9IG51bVZhbHVlICYmIG51bVZhbHVlIDw9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgIHJldHVybiBudW1WYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG11cm11cjMoU3RyaW5nKHZhbHVlKSk7XG59XG5cbi8vIGN1c3RvbSBxdWlja3NvcnQgdGhhdCBzb3J0cyBpZHMsIGluZGljZXMgYW5kIG9mZnNldHMgdG9nZXRoZXIgKGJ5IGlkcylcbi8vIHVzZXMgSG9hcmUgcGFydGl0aW9uaW5nICYgbWFudWFsIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24gdG8gYXZvaWQgd29yc3QgY2FzZSBzY2VuYXJpb3NcbmZ1bmN0aW9uIHNvcnQoaWRzLCBwb3NpdGlvbnMsIGxlZnQsIHJpZ2h0KSB7XG4gICAgd2hpbGUgKGxlZnQgPCByaWdodCkge1xuICAgICAgICBjb25zdCBwaXZvdCA9IGlkc1sobGVmdCArIHJpZ2h0KSA+PiAxXTtcbiAgICAgICAgbGV0IGkgPSBsZWZ0IC0gMTtcbiAgICAgICAgbGV0IGogPSByaWdodCArIDE7XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGRvIGkrKzsgd2hpbGUgKGlkc1tpXSA8IHBpdm90KTtcbiAgICAgICAgICAgIGRvIGotLTsgd2hpbGUgKGlkc1tqXSA+IHBpdm90KTtcbiAgICAgICAgICAgIGlmIChpID49IGopIGJyZWFrO1xuICAgICAgICAgICAgc3dhcChpZHMsIGksIGopO1xuICAgICAgICAgICAgc3dhcChwb3NpdGlvbnMsIDMgKiBpLCAzICogaik7XG4gICAgICAgICAgICBzd2FwKHBvc2l0aW9ucywgMyAqIGkgKyAxLCAzICogaiArIDEpO1xuICAgICAgICAgICAgc3dhcChwb3NpdGlvbnMsIDMgKiBpICsgMiwgMyAqIGogKyAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqIC0gbGVmdCA8IHJpZ2h0IC0gaikge1xuICAgICAgICAgICAgc29ydChpZHMsIHBvc2l0aW9ucywgbGVmdCwgaik7XG4gICAgICAgICAgICBsZWZ0ID0gaiArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3J0KGlkcywgcG9zaXRpb25zLCBqICsgMSwgcmlnaHQpO1xuICAgICAgICAgICAgcmlnaHQgPSBqO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIGNvbnN0IHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuXG5yZWdpc3RlcignRmVhdHVyZVBvc2l0aW9uTWFwJywgRmVhdHVyZVBvc2l0aW9uTWFwKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQuanMnO1xuXG5leHBvcnQgdHlwZSBVbmlmb3JtVmFsdWVzPFVzOiBPYmplY3Q+XG4gICAgPSAkRXhhY3Q8JE9iak1hcDxVcywgPFY+KHU6IFVuaWZvcm08Vj4pID0+IFY+PjtcbmV4cG9ydCB0eXBlIFVuaWZvcm1Mb2NhdGlvbnMgPSB7W186IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9ufTtcblxuY2xhc3MgVW5pZm9ybTxUPiB7XG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcbiAgICBsb2NhdGlvbjogP1dlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICAgIGN1cnJlbnQ6IFQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgdGhpcy5nbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICB9XG5cbiAgICArc2V0OiAodjogVCkgPT4gdm9pZDtcbn1cblxuY2xhc3MgVW5pZm9ybTFpIGV4dGVuZHMgVW5pZm9ybTxudW1iZXI+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSAwO1xuICAgIH1cblxuICAgIHNldCh2OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudCAhPT0gdikge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFpKHRoaXMubG9jYXRpb24sIHYpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBVbmlmb3JtMWYgZXh0ZW5kcyBVbmlmb3JtPG51bWJlcj4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IDA7XG4gICAgfVxuXG4gICAgc2V0KHY6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSB2KSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWYodGhpcy5sb2NhdGlvbiwgdik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVuaWZvcm0yZiBleHRlbmRzIFVuaWZvcm08W251bWJlciwgbnVtYmVyXT4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IFswLCAwXTtcbiAgICB9XG5cbiAgICBzZXQodjogW251bWJlciwgbnVtYmVyXSk6IHZvaWQge1xuICAgICAgICBpZiAodlswXSAhPT0gdGhpcy5jdXJyZW50WzBdIHx8IHZbMV0gIT09IHRoaXMuY3VycmVudFsxXSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTJmKHRoaXMubG9jYXRpb24sIHZbMF0sIHZbMV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBVbmlmb3JtM2YgZXh0ZW5kcyBVbmlmb3JtPFtudW1iZXIsIG51bWJlciwgbnVtYmVyXT4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IFswLCAwLCAwXTtcbiAgICB9XG5cbiAgICBzZXQodjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKTogdm9pZCB7XG4gICAgICAgIGlmICh2WzBdICE9PSB0aGlzLmN1cnJlbnRbMF0gfHwgdlsxXSAhPT0gdGhpcy5jdXJyZW50WzFdIHx8IHZbMl0gIT09IHRoaXMuY3VycmVudFsyXSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNmKHRoaXMubG9jYXRpb24sIHZbMF0sIHZbMV0sIHZbMl0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBVbmlmb3JtNGYgZXh0ZW5kcyBVbmlmb3JtPFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gWzAsIDAsIDAsIDBdO1xuICAgIH1cblxuICAgIHNldCh2OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IHZvaWQge1xuICAgICAgICBpZiAodlswXSAhPT0gdGhpcy5jdXJyZW50WzBdIHx8IHZbMV0gIT09IHRoaXMuY3VycmVudFsxXSB8fFxuICAgICAgICAgICAgdlsyXSAhPT0gdGhpcy5jdXJyZW50WzJdIHx8IHZbM10gIT09IHRoaXMuY3VycmVudFszXSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTRmKHRoaXMubG9jYXRpb24sIHZbMF0sIHZbMV0sIHZbMl0sIHZbM10pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBVbmlmb3JtQ29sb3IgZXh0ZW5kcyBVbmlmb3JtPENvbG9yPiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gQ29sb3IudHJhbnNwYXJlbnQ7XG4gICAgfVxuXG4gICAgc2V0KHY6IENvbG9yKTogdm9pZCB7XG4gICAgICAgIGlmICh2LnIgIT09IHRoaXMuY3VycmVudC5yIHx8IHYuZyAhPT0gdGhpcy5jdXJyZW50LmcgfHxcbiAgICAgICAgICAgIHYuYiAhPT0gdGhpcy5jdXJyZW50LmIgfHwgdi5hICE9PSB0aGlzLmN1cnJlbnQuYSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTRmKHRoaXMubG9jYXRpb24sIHYuciwgdi5nLCB2LmIsIHYuYSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IGVtcHR5TWF0NCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuY2xhc3MgVW5pZm9ybU1hdHJpeDRmIGV4dGVuZHMgVW5pZm9ybTxGbG9hdDMyQXJyYXk+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBlbXB0eU1hdDQ7XG4gICAgfVxuXG4gICAgc2V0KHY6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xuICAgICAgICAvLyBUaGUgdmFzdCBtYWpvcml0eSBvZiBtYXRyaXggY29tcGFyaXNvbnMgdGhhdCB3aWxsIHRyaXAgdGhpcyBzZXRcbiAgICAgICAgLy8gaGFwcGVuIGF0IGk9MTIgb3IgaT0wLCBzbyB3ZSBjaGVjayB0aG9zZSBmaXJzdCB0byBhdm9pZCBsb3RzIG9mXG4gICAgICAgIC8vIHVubmVjZXNzYXJ5IGl0ZXJhdGlvbjpcbiAgICAgICAgaWYgKHZbMTJdICE9PSB0aGlzLmN1cnJlbnRbMTJdIHx8IHZbMF0gIT09IHRoaXMuY3VycmVudFswXSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLmxvY2F0aW9uLCBmYWxzZSwgdik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodltpXSAhPT0gdGhpcy5jdXJyZW50W2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5sb2NhdGlvbiwgZmFsc2UsIHYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBlbXB0eU1hdDMgPSBuZXcgRmxvYXQzMkFycmF5KDkpO1xuY2xhc3MgVW5pZm9ybU1hdHJpeDNmIGV4dGVuZHMgVW5pZm9ybTxGbG9hdDMyQXJyYXk+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBlbXB0eU1hdDM7XG4gICAgfVxuXG4gICAgc2V0KHY6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZbaV0gIT09IHRoaXMuY3VycmVudFtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4M2Z2KHRoaXMubG9jYXRpb24sIGZhbHNlLCB2KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgZW1wdHlNYXQyID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcbmNsYXNzIFVuaWZvcm1NYXRyaXgyZiBleHRlbmRzIFVuaWZvcm08RmxvYXQzMkFycmF5PiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gZW1wdHlNYXQyO1xuICAgIH1cblxuICAgIHNldCh2OiBGbG9hdDMyQXJyYXkpOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGlmICh2W2ldICE9PSB0aGlzLmN1cnJlbnRbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDJmdih0aGlzLmxvY2F0aW9uLCBmYWxzZSwgdik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7XG4gICAgVW5pZm9ybSxcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtM2YsXG4gICAgVW5pZm9ybTRmLFxuICAgIFVuaWZvcm1Db2xvcixcbiAgICBVbmlmb3JtTWF0cml4MmYsXG4gICAgVW5pZm9ybU1hdHJpeDNmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufTtcblxuZXhwb3J0IHR5cGUgVW5pZm9ybUJpbmRpbmdzID0ge1tfOiBzdHJpbmddOiBVbmlmb3JtPGFueT59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtwYWNrVWludDhUb0Zsb2F0fSBmcm9tICcuLi9zaGFkZXJzL2VuY29kZV9hdHRyaWJ1dGUuanMnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQge3N1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuaW1wb3J0IHtQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWV9IGZyb20gJy4uL3N0eWxlL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHtTdHJ1Y3RBcnJheUxheW91dDFmNCwgU3RydWN0QXJyYXlMYXlvdXQyZjgsIFN0cnVjdEFycmF5TGF5b3V0NGYxNiwgUGF0dGVybkxheW91dEFycmF5LCBEYXNoTGF5b3V0QXJyYXl9IGZyb20gJy4vYXJyYXlfdHlwZXMuanMnO1xuaW1wb3J0IHtjbGFtcH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCBwYXR0ZXJuQXR0cmlidXRlcyBmcm9tICcuL2J1Y2tldC9wYXR0ZXJuX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IGRhc2hBdHRyaWJ1dGVzIGZyb20gJy4vYnVja2V0L2Rhc2hfYXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCBGZWF0dXJlUG9zaXRpb25NYXAgZnJvbSAnLi9mZWF0dXJlX3Bvc2l0aW9uX21hcC5qcyc7XG5pbXBvcnQge1xuICAgIFVuaWZvcm0sXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm1Db2xvcixcbiAgICBVbmlmb3JtNGYsXG4gICAgdHlwZSBVbmlmb3JtTG9jYXRpb25zXG59IGZyb20gJy4uL3JlbmRlci91bmlmb3JtX2JpbmRpbmcuanMnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGVkU3R5bGVMYXllcn0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvdHlwZWRfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7U3RydWN0QXJyYXksIFN0cnVjdEFycmF5TWVtYmVyfSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgICBGZWF0dXJlLFxuICAgIEZlYXR1cmVTdGF0ZSxcbiAgICBHbG9iYWxQcm9wZXJ0aWVzLFxuICAgIFNvdXJjZUV4cHJlc3Npb24sXG4gICAgQ29tcG9zaXRlRXhwcmVzc2lvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge1Bvc3NpYmx5RXZhbHVhdGVkfSBmcm9tICcuLi9zdHlsZS9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX3N0YXRlLmpzJztcbmltcG9ydCB0eXBlIHtGb3JtYXR0ZWRTZWN0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuZXhwb3J0IHR5cGUgQmluZGVyVW5pZm9ybSA9IHtcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICBiaW5kaW5nOiBVbmlmb3JtPGFueT5cbn07XG5cbmZ1bmN0aW9uIHBhY2tDb2xvcihjb2xvcjogQ29sb3IpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBwYWNrVWludDhUb0Zsb2F0KDI1NSAqIGNvbG9yLnIsIDI1NSAqIGNvbG9yLmcpLFxuICAgICAgICBwYWNrVWludDhUb0Zsb2F0KDI1NSAqIGNvbG9yLmIsIDI1NSAqIGNvbG9yLmEpXG4gICAgXTtcbn1cblxuLyoqXG4gKiAgYEJpbmRlcmAgaXMgdGhlIGludGVyZmFjZSBkZWZpbml0aW9uIGZvciB0aGUgc3RyYXRlZ2llcyBmb3IgY29uc3RydWN0aW5nLFxuICogIHVwbG9hZGluZywgYW5kIGJpbmRpbmcgcGFpbnQgcHJvcGVydHkgZGF0YSBhcyBHTFNMIGF0dHJpYnV0ZXMuIE1vc3Qgc3R5bGUtXG4gKiAgc3BlYyBwcm9wZXJ0aWVzIGhhdmUgYSAxOjEgcmVsYXRpb25zaGlwIHRvIHNoYWRlciBhdHRyaWJ1dGUvdW5pZm9ybXMsIGJ1dFxuICogIHNvbWUgcmVxdWlyZSBtdWx0aXBsZSB2YWx1ZXMgcGVyIGZlYXR1cmUgdG8gYmUgcGFzc2VkIHRvIHRoZSBHUFUsIGFuZCBpblxuICogIHRob3NlIGNhc2VzIHdlIGJpbmQgbXVsdGlwbGUgYXR0cmlidXRlcy91bmlmb3Jtcy5cbiAqXG4gKiAgSXQgaGFzIHRocmVlIGltcGxlbWVudGF0aW9ucywgb25lIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBzdHJhdGVnaWVzIHdlIHVzZTpcbiAqXG4gKiAgKiBGb3IgX2NvbnN0YW50XyBwcm9wZXJ0aWVzIC0tIHRob3NlIHdob3NlIHZhbHVlIGlzIGEgY29uc3RhbnQsIG9yIHRoZSBjb25zdGFudFxuICogICAgcmVzdWx0IG9mIGV2YWx1YXRpbmcgYSBjYW1lcmEgZXhwcmVzc2lvbiBhdCBhIHBhcnRpY3VsYXIgY2FtZXJhIHBvc2l0aW9uIC0tIHdlXG4gKiAgICBkb24ndCBuZWVkIGEgdmVydGV4IGF0dHJpYnV0ZSBidWZmZXIsIGFuZCBpbnN0ZWFkIHVzZSBhIHVuaWZvcm0uXG4gKiAgKiBGb3IgZGF0YSBleHByZXNzaW9ucywgd2UgdXNlIGEgdmVydGV4IGJ1ZmZlciB3aXRoIGEgc2luZ2xlIGF0dHJpYnV0ZSB2YWx1ZSxcbiAqICAgIHRoZSBldmFsdWF0ZWQgcmVzdWx0IG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBmZWF0dXJlLlxuICogICogRm9yIGNvbXBvc2l0ZSBleHByZXNzaW9ucywgd2UgdXNlIGEgdmVydGV4IGJ1ZmZlciB3aXRoIHR3byBhdHRyaWJ1dGVzOiBtaW4gYW5kXG4gKiAgICBtYXggdmFsdWVzIGNvdmVyaW5nIHRoZSByYW5nZSBvZiB6b29tcyBhdCB3aGljaCB3ZSBleHBlY3QgdGhlIHRpbGUgdG8gYmVcbiAqICAgIGRpc3BsYXllZC4gVGhlc2UgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIGJ5IGV2YWx1YXRpbmcgdGhlIGNvbXBvc2l0ZSBleHByZXNzaW9uIGZvclxuICogICAgdGhlIGdpdmVuIGZlYXR1cmUgYXQgc3RyYXRlZ2ljYWxseSBjaG9zZW4gem9vbSBsZXZlbHMuIEluIGFkZGl0aW9uIHRvIHRoaXNcbiAqICAgIGF0dHJpYnV0ZSBkYXRhLCB3ZSBhbHNvIHVzZSBhIHVuaWZvcm0gdmFsdWUgd2hpY2ggdGhlIHNoYWRlciB1c2VzIHRvIGludGVycG9sYXRlXG4gKiAgICBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCB2YWx1ZSBhdCB0aGUgZmluYWwgZGlzcGxheWVkIHpvb20gbGV2ZWwuIFRoZSB1c2Ugb2YgYVxuICogICAgdW5pZm9ybSBhbGxvd3MgdXMgdG8gY2hlYXBseSB1cGRhdGUgdGhlIHZhbHVlIG9uIGV2ZXJ5IGZyYW1lLlxuICpcbiAqICBOb3RlIHRoYXQgdGhlIHNoYWRlciBzb3VyY2UgdmFyaWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlJ3JlIHVzaW5nIGEgdW5pZm9ybSBvclxuICogIGF0dHJpYnV0ZS4gV2UgZHluYW1pY2FsbHkgY29tcGlsZSBzaGFkZXJzIGF0IHJ1bnRpbWUgdG8gYWNjb21tb2RhdGUgdGhpcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmludGVyZmFjZSBBdHRyaWJ1dGVCaW5kZXIge1xuICAgIHBvcHVsYXRlUGFpbnRBcnJheShsZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbik6IHZvaWQ7XG4gICAgdXBkYXRlUGFpbnRBcnJheShzdGFydDogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pOiB2b2lkO1xuICAgIHVwbG9hZChDb250ZXh0KTogdm9pZDtcbiAgICBkZXN0cm95KCk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBVbmlmb3JtQmluZGVyIHtcbiAgICB1bmlmb3JtTmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgc2V0VW5pZm9ybSh1bmlmb3JtOiBVbmlmb3JtPCo+LCBnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBjdXJyZW50VmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTwqPiwgdW5pZm9ybU5hbWU6IHN0cmluZyk6IHZvaWQ7XG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24sIG5hbWU6IHN0cmluZyk6ICRTaGFwZTxVbmlmb3JtPCo+Pjtcbn1cblxuY2xhc3MgQ29uc3RhbnRCaW5kZXIgaW1wbGVtZW50cyBVbmlmb3JtQmluZGVyIHtcbiAgICB2YWx1ZTogbWl4ZWQ7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIHVuaWZvcm1OYW1lczogQXJyYXk8c3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBtaXhlZCwgbmFtZXM6IEFycmF5PHN0cmluZz4sIHR5cGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMudW5pZm9ybU5hbWVzID0gbmFtZXMubWFwKG5hbWUgPT4gYHVfJHtuYW1lfWApO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIH1cblxuICAgIHNldFVuaWZvcm0odW5pZm9ybTogVW5pZm9ybTwqPiwgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgY3VycmVudFZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bWl4ZWQ+KTogdm9pZCB7XG4gICAgICAgIHVuaWZvcm0uc2V0KGN1cnJlbnRWYWx1ZS5jb25zdGFudE9yKHRoaXMudmFsdWUpKTtcbiAgICB9XG5cbiAgICBnZXRCaW5kaW5nKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiwgXzogc3RyaW5nKTogJFNoYXBlPFVuaWZvcm08YW55Pj4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudHlwZSA9PT0gJ2NvbG9yJykgP1xuICAgICAgICAgICAgbmV3IFVuaWZvcm1Db2xvcihjb250ZXh0LCBsb2NhdGlvbikgOlxuICAgICAgICAgICAgbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgfVxufVxuXG5jbGFzcyBDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXIgaW1wbGVtZW50cyBVbmlmb3JtQmluZGVyIHtcbiAgICB1bmlmb3JtTmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgcGF0dGVybkZyb206ID9BcnJheTxudW1iZXI+O1xuICAgIHBhdHRlcm5UbzogP0FycmF5PG51bWJlcj47XG4gICAgcGl4ZWxSYXRpb0Zyb206IG51bWJlcjtcbiAgICBwaXhlbFJhdGlvVG86IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHZhbHVlOiBtaXhlZCwgbmFtZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy51bmlmb3JtTmFtZXMgPSBuYW1lcy5tYXAobmFtZSA9PiBgdV8ke25hbWV9YCk7XG4gICAgICAgIHRoaXMucGF0dGVybkZyb20gPSBudWxsO1xuICAgICAgICB0aGlzLnBhdHRlcm5UbyA9IG51bGw7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpb0Zyb20gPSAxLjA7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpb1RvID0gMS4wO1xuICAgIH1cblxuICAgIHNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbzogSW1hZ2VQb3NpdGlvbiwgcG9zRnJvbTogSW1hZ2VQb3NpdGlvbikge1xuICAgICAgICB0aGlzLnBpeGVsUmF0aW9Gcm9tID0gcG9zRnJvbS5waXhlbFJhdGlvO1xuICAgICAgICB0aGlzLnBpeGVsUmF0aW9UbyA9IHBvc1RvLnBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMucGF0dGVybkZyb20gPSBwb3NGcm9tLnRsLmNvbmNhdChwb3NGcm9tLmJyKTtcbiAgICAgICAgdGhpcy5wYXR0ZXJuVG8gPSBwb3NUby50bC5jb25jYXQocG9zVG8uYnIpO1xuICAgIH1cblxuICAgIHNldFVuaWZvcm0odW5pZm9ybTogVW5pZm9ybTwqPiwgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgY3VycmVudFZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bWl4ZWQ+LCB1bmlmb3JtTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9XG4gICAgICAgICAgICB1bmlmb3JtTmFtZSA9PT0gJ3VfcGF0dGVybl90bycgfHwgdW5pZm9ybU5hbWUgPT09ICd1X2Rhc2hfdG8nID8gdGhpcy5wYXR0ZXJuVG8gOlxuICAgICAgICAgICAgdW5pZm9ybU5hbWUgPT09ICd1X3BhdHRlcm5fZnJvbScgfHwgdW5pZm9ybU5hbWUgPT09ICd1X2Rhc2hfZnJvbScgPyB0aGlzLnBhdHRlcm5Gcm9tIDpcbiAgICAgICAgICAgIHVuaWZvcm1OYW1lID09PSAndV9waXhlbF9yYXRpb190bycgPyB0aGlzLnBpeGVsUmF0aW9UbyA6XG4gICAgICAgICAgICB1bmlmb3JtTmFtZSA9PT0gJ3VfcGl4ZWxfcmF0aW9fZnJvbScgPyB0aGlzLnBpeGVsUmF0aW9Gcm9tIDogbnVsbDtcbiAgICAgICAgaWYgKHBvcykgdW5pZm9ybS5zZXQocG9zKTtcbiAgICB9XG5cbiAgICBnZXRCaW5kaW5nKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiwgbmFtZTogc3RyaW5nKTogJFNoYXBlPFVuaWZvcm08YW55Pj4ge1xuICAgICAgICByZXR1cm4gbmFtZSA9PT0gJ3VfcGF0dGVybl9mcm9tJyB8fCBuYW1lID09PSAndV9wYXR0ZXJuX3RvJyB8fCBuYW1lID09PSAndV9kYXNoX2Zyb20nIHx8IG5hbWUgPT09ICd1X2Rhc2hfdG8nID9cbiAgICAgICAgICAgIG5ldyBVbmlmb3JtNGYoY29udGV4dCwgbG9jYXRpb24pIDpcbiAgICAgICAgICAgIG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb24pO1xuICAgIH1cbn1cblxuY2xhc3MgU291cmNlRXhwcmVzc2lvbkJpbmRlciBpbXBsZW1lbnRzIEF0dHJpYnV0ZUJpbmRlciB7XG4gICAgZXhwcmVzc2lvbjogU291cmNlRXhwcmVzc2lvbjtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgbWF4VmFsdWU6IG51bWJlcjtcblxuICAgIHBhaW50VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5O1xuICAgIHBhaW50VmVydGV4QXR0cmlidXRlczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuICAgIHBhaW50VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogU291cmNlRXhwcmVzc2lvbiwgbmFtZXM6IEFycmF5PHN0cmluZz4sIHR5cGU6IHN0cmluZywgUGFpbnRWZXJ0ZXhBcnJheTogQ2xhc3M8U3RydWN0QXJyYXk+KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMubWF4VmFsdWUgPSAwO1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGBhXyR7bmFtZX1gLFxuICAgICAgICAgICAgdHlwZTogJ0Zsb2F0MzInLFxuICAgICAgICAgICAgY29tcG9uZW50czogdHlwZSA9PT0gJ2NvbG9yJyA/IDIgOiAxLFxuICAgICAgICAgICAgb2Zmc2V0OiAwXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5ID0gbmV3IFBhaW50VmVydGV4QXJyYXkoKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkobmV3TGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBhaW50VmVydGV4QXJyYXkubGVuZ3RoO1xuICAgICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShhdmFpbGFibGVJbWFnZXMpKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKDApLCBmZWF0dXJlLCB7fSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMsIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkucmVzaXplKG5ld0xlbmd0aCk7XG4gICAgICAgIHRoaXMuX3NldFBhaW50VmFsdWUoc3RhcnQsIG5ld0xlbmd0aCwgdmFsdWUpO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhaW50QXJyYXkoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206IDB9LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIHVuZGVmaW5lZCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgdGhpcy5fc2V0UGFpbnRWYWx1ZShzdGFydCwgZW5kLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgX3NldFBhaW50VmFsdWUoc3RhcnQsIGVuZCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgY29uc3QgY29sb3IgPSBwYWNrQ29sb3IodmFsdWUpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShpLCBjb2xvclswXSwgY29sb3JbMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShpLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1heFZhbHVlID0gTWF0aC5tYXgodGhpcy5tYXhWYWx1ZSwgTWF0aC5hYnModmFsdWUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLnBhaW50VmVydGV4QXJyYXkgJiYgdGhpcy5wYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEJ1ZmZlciAmJiB0aGlzLnBhaW50VmVydGV4QnVmZmVyLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLnBhaW50VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5wYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyIGltcGxlbWVudHMgQXR0cmlidXRlQmluZGVyLCBVbmlmb3JtQmluZGVyIHtcbiAgICBleHByZXNzaW9uOiBDb21wb3NpdGVFeHByZXNzaW9uO1xuICAgIHVuaWZvcm1OYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgdXNlSW50ZWdlclpvb206IGJvb2xlYW47XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG1heFZhbHVlOiBudW1iZXI7XG5cbiAgICBwYWludFZlcnRleEFycmF5OiBTdHJ1Y3RBcnJheTtcbiAgICBwYWludFZlcnRleEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcbiAgICBwYWludFZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IENvbXBvc2l0ZUV4cHJlc3Npb24sIG5hbWVzOiBBcnJheTxzdHJpbmc+LCB0eXBlOiBzdHJpbmcsIHVzZUludGVnZXJab29tOiBib29sZWFuLCB6b29tOiBudW1iZXIsIFBhaW50VmVydGV4QXJyYXk6IENsYXNzPFN0cnVjdEFycmF5Pikge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLnVuaWZvcm1OYW1lcyA9IG5hbWVzLm1hcChuYW1lID0+IGB1XyR7bmFtZX1fdGApO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnVzZUludGVnZXJab29tID0gdXNlSW50ZWdlclpvb207XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgICAgIHRoaXMubWF4VmFsdWUgPSAwO1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGBhXyR7bmFtZX1gLFxuICAgICAgICAgICAgdHlwZTogJ0Zsb2F0MzInLFxuICAgICAgICAgICAgY29tcG9uZW50czogdHlwZSA9PT0gJ2NvbG9yJyA/IDQgOiAyLFxuICAgICAgICAgICAgb2Zmc2V0OiAwXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5ID0gbmV3IFBhaW50VmVydGV4QXJyYXkoKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkobmV3TGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aGlzLnpvb20pLCBmZWF0dXJlLCB7fSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMsIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSArIDEpLCBmZWF0dXJlLCB7fSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMsIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUobmV3TGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fc2V0UGFpbnRWYWx1ZShzdGFydCwgbmV3TGVuZ3RoLCBtaW4sIG1heCk7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFpbnRBcnJheShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206IHRoaXMuem9vbX0sIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgdW5kZWZpbmVkLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206IHRoaXMuem9vbSArIDF9LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIHVuZGVmaW5lZCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgdGhpcy5fc2V0UGFpbnRWYWx1ZShzdGFydCwgZW5kLCBtaW4sIG1heCk7XG4gICAgfVxuXG4gICAgX3NldFBhaW50VmFsdWUoc3RhcnQsIGVuZCwgbWluLCBtYXgpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgY29uc3QgbWluQ29sb3IgPSBwYWNrQ29sb3IobWluKTtcbiAgICAgICAgICAgIGNvbnN0IG1heENvbG9yID0gcGFja0NvbG9yKG1heCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5lbXBsYWNlKGksIG1pbkNvbG9yWzBdLCBtaW5Db2xvclsxXSwgbWF4Q29sb3JbMF0sIG1heENvbG9yWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5LmVtcGxhY2UoaSwgbWluLCBtYXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IE1hdGgubWF4KHRoaXMubWF4VmFsdWUsIE1hdGguYWJzKG1pbiksIE1hdGguYWJzKG1heCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhaW50VmVydGV4QnVmZmVyICYmIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnBhaW50VmVydGV4QXJyYXksIHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzLCB0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRVbmlmb3JtKHVuaWZvcm06IFVuaWZvcm08Kj4sIGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudFpvb20gPSB0aGlzLnVzZUludGVnZXJab29tID8gTWF0aC5mbG9vcihnbG9iYWxzLnpvb20pIDogZ2xvYmFscy56b29tO1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBjbGFtcCh0aGlzLmV4cHJlc3Npb24uaW50ZXJwb2xhdGlvbkZhY3RvcihjdXJyZW50Wm9vbSwgdGhpcy56b29tLCB0aGlzLnpvb20gKyAxKSwgMCwgMSk7XG4gICAgICAgIHVuaWZvcm0uc2V0KGZhY3Rvcik7XG4gICAgfVxuXG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24sIF86IHN0cmluZyk6IFVuaWZvcm0xZiB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICB9XG59XG5cbmNsYXNzIENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIgaW1wbGVtZW50cyBBdHRyaWJ1dGVCaW5kZXIge1xuICAgIGV4cHJlc3Npb246IENvbXBvc2l0ZUV4cHJlc3Npb247XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIHVzZUludGVnZXJab29tOiBib29sZWFuO1xuICAgIHpvb206IG51bWJlcjtcbiAgICBsYXllcklkOiBzdHJpbmc7XG5cbiAgICB6b29tSW5QYWludFZlcnRleEFycmF5OiBTdHJ1Y3RBcnJheTtcbiAgICB6b29tT3V0UGFpbnRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXk7XG4gICAgem9vbUluUGFpbnRWZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXI7XG4gICAgem9vbU91dFBhaW50VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuICAgIHBhaW50VmVydGV4QXR0cmlidXRlczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogQ29tcG9zaXRlRXhwcmVzc2lvbiwgbmFtZXM6IEFycmF5PHN0cmluZz4sIHR5cGU6IHN0cmluZywgdXNlSW50ZWdlclpvb206IGJvb2xlYW4sIHpvb206IG51bWJlciwgUGFpbnRWZXJ0ZXhBcnJheTogQ2xhc3M8U3RydWN0QXJyYXk+LCBsYXllcklkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy51c2VJbnRlZ2VyWm9vbSA9IHVzZUludGVnZXJab29tO1xuICAgICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLmxheWVySWQgPSBsYXllcklkO1xuXG4gICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzID0gKHR5cGUgPT09ICdhcnJheScgPyBkYXNoQXR0cmlidXRlcyA6IHBhdHRlcm5BdHRyaWJ1dGVzKS5tZW1iZXJzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBhc3NlcnQoYGFfJHtuYW1lc1tpXX1gID09PSB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlc1tpXS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheSA9IG5ldyBQYWludFZlcnRleEFycmF5KCk7XG4gICAgICAgIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkgPSBuZXcgUGFpbnRWZXJ0ZXhBcnJheSgpO1xuICAgIH1cblxuICAgIHBvcHVsYXRlUGFpbnRBcnJheShsZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkubGVuZ3RoO1xuICAgICAgICB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkucmVzaXplKGxlbmd0aCk7XG4gICAgICAgIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkucmVzaXplKGxlbmd0aCk7XG4gICAgICAgIHRoaXMuX3NldFBhaW50VmFsdWVzKHN0YXJ0LCBsZW5ndGgsIGZlYXR1cmUucGF0dGVybnMgJiYgZmVhdHVyZS5wYXR0ZXJuc1t0aGlzLmxheWVySWRdLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFpbnRBcnJheShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgdGhpcy5fc2V0UGFpbnRWYWx1ZXMoc3RhcnQsIGVuZCwgZmVhdHVyZS5wYXR0ZXJucyAmJiBmZWF0dXJlLnBhdHRlcm5zW3RoaXMubGF5ZXJJZF0sIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICBfc2V0UGFpbnRWYWx1ZXMoc3RhcnQsIGVuZCwgcGF0dGVybnMsIHBvc2l0aW9ucykge1xuICAgICAgICBpZiAoIXBvc2l0aW9ucyB8fCAhcGF0dGVybnMpIHJldHVybjtcblxuICAgICAgICBjb25zdCB7bWluLCBtaWQsIG1heH0gPSBwYXR0ZXJucztcbiAgICAgICAgY29uc3QgaW1hZ2VNaW4gPSBwb3NpdGlvbnNbbWluXTtcbiAgICAgICAgY29uc3QgaW1hZ2VNaWQgPSBwb3NpdGlvbnNbbWlkXTtcbiAgICAgICAgY29uc3QgaW1hZ2VNYXggPSBwb3NpdGlvbnNbbWF4XTtcbiAgICAgICAgaWYgKCFpbWFnZU1pbiB8fCAhaW1hZ2VNaWQgfHwgIWltYWdlTWF4KSByZXR1cm47XG5cbiAgICAgICAgLy8gV2UgcG9wdWxhdGUgdHdvIHBhaW50IGFycmF5cyBiZWNhdXNlLCBmb3IgY3Jvc3MtZmFkZWQgcHJvcGVydGllcywgd2UgZG9uJ3Qga25vdyB3aGljaCBkaXJlY3Rpb25cbiAgICAgICAgLy8gd2UncmUgY3Jvc3MtZmFkaW5nIHRvIGF0IGxheW91dCB0aW1lLiBJbiBvcmRlciB0byBrZWVwIHZlcnRleCBhdHRyaWJ1dGVzIHRvIGEgbWluaW11bSBhbmQgbm90IHBhc3NcbiAgICAgICAgLy8gdW5uZWNlc3NhcnkgdmVydGV4IGRhdGEgdG8gdGhlIHNoYWRlcnMsIHdlIGRldGVybWluZSB3aGljaCB0byB1cGxvYWQgYXQgZHJhdyB0aW1lLlxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fc2V0UGFpbnRWYWx1ZSh0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXksIGksIGltYWdlTWlkLCBpbWFnZU1pbik7XG4gICAgICAgICAgICB0aGlzLl9zZXRQYWludFZhbHVlKHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXksIGksIGltYWdlTWlkLCBpbWFnZU1heCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc2V0UGFpbnRWYWx1ZShhcnJheSwgaSwgcG9zQSwgcG9zQikge1xuICAgICAgICBhcnJheS5lbXBsYWNlKGksXG4gICAgICAgICAgICBwb3NBLnRsWzBdLCBwb3NBLnRsWzFdLCBwb3NBLmJyWzBdLCBwb3NBLmJyWzFdLFxuICAgICAgICAgICAgcG9zQi50bFswXSwgcG9zQi50bFsxXSwgcG9zQi5iclswXSwgcG9zQi5iclsxXSxcbiAgICAgICAgICAgIHBvc0EucGl4ZWxSYXRpbywgcG9zQi5waXhlbFJhdGlvXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIgJiYgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy56b29tSW5QYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpO1xuICAgICAgICAgICAgdGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyKSB0aGlzLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyKSB0aGlzLnpvb21JblBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cbi8qKlxuICogUHJvZ3JhbUNvbmZpZ3VyYXRpb24gY29udGFpbnMgdGhlIGxvZ2ljIGZvciBiaW5kaW5nIHN0eWxlIGxheWVyIHByb3BlcnRpZXMgYW5kIHRpbGVcbiAqIGxheWVyIGZlYXR1cmUgZGF0YSBpbnRvIEdMIHByb2dyYW0gdW5pZm9ybXMgYW5kIHZlcnRleCBhdHRyaWJ1dGVzLlxuICpcbiAqIE5vbi1kYXRhLWRyaXZlbiBwcm9wZXJ0eSB2YWx1ZXMgYXJlIGJvdW5kIHRvIHNoYWRlciB1bmlmb3Jtcy4gRGF0YS1kcml2ZW4gcHJvcGVydHlcbiAqIHZhbHVlcyBhcmUgYm91bmQgdG8gdmVydGV4IGF0dHJpYnV0ZXMuIEluIG9yZGVyIHRvIHN1cHBvcnQgYSB1bmlmb3JtIEdMU0wgc3ludGF4IG92ZXJcbiAqIGJvdGgsIFtNYXBib3ggR0wgU2hhZGVyc10oaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtc2hhZGVycykgZGVmaW5lcyBhIGAjcHJhZ21hYFxuICogYWJzdHJhY3Rpb24sIHdoaWNoIFByb2dyYW1Db25maWd1cmF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcuIEF0IHJ1bnRpbWUsXG4gKiBpdCBleGFtaW5lcyB0aGUgYXR0cmlidXRlcyBvZiBhIHBhcnRpY3VsYXIgbGF5ZXIsIGNvbWJpbmVzIHRoaXMgd2l0aCBmaXhlZCBrbm93bGVkZ2VcbiAqIGFib3V0IGhvdyBsYXllcnMgb2YgdGhlIHBhcnRpY3VsYXIgdHlwZSBhcmUgaW1wbGVtZW50ZWQsIGFuZCBkZXRlcm1pbmVzIHdoaWNoIHVuaWZvcm1zXG4gKiBhbmQgdmVydGV4IGF0dHJpYnV0ZXMgd2lsbCBiZSByZXF1aXJlZC4gSXQgY2FuIHRoZW4gc3Vic3RpdHV0ZSB0aGUgYXBwcm9wcmlhdGUgdGV4dFxuICogaW50byB0aGUgc2hhZGVyIHNvdXJjZSBjb2RlLCBjcmVhdGUgYW5kIGxpbmsgYSBwcm9ncmFtLCBhbmQgYmluZCB0aGUgdW5pZm9ybXMgYW5kXG4gKiB2ZXJ0ZXggYXR0cmlidXRlcyBpbiBwcmVwYXJhdGlvbiBmb3IgZHJhd2luZy5cbiAqXG4gKiBXaGVuIGEgdmVjdG9yIHRpbGUgaXMgcGFyc2VkLCB0aGlzIHNhbWUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvXG4gKiBwb3B1bGF0ZSB0aGUgYXR0cmlidXRlIGJ1ZmZlcnMgbmVlZGVkIGZvciBkYXRhLWRyaXZlbiBzdHlsaW5nIHVzaW5nIHRoZSB6b29tXG4gKiBsZXZlbCBhbmQgZmVhdHVyZSBwcm9wZXJ0eSBkYXRhLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2dyYW1Db25maWd1cmF0aW9uIHtcbiAgICBiaW5kZXJzOiB7W186IHN0cmluZ106IChBdHRyaWJ1dGVCaW5kZXIgfCBVbmlmb3JtQmluZGVyKSB9O1xuICAgIGNhY2hlS2V5OiBzdHJpbmc7XG5cbiAgICBfYnVmZmVyczogQXJyYXk8VmVydGV4QnVmZmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBUeXBlZFN0eWxlTGF5ZXIsIHpvb206IG51bWJlciwgZmlsdGVyUHJvcGVydGllczogKF86IHN0cmluZykgPT4gYm9vbGVhbiA9ICgpID0+IHRydWUpIHtcbiAgICAgICAgdGhpcy5iaW5kZXJzID0ge307XG4gICAgICAgIHRoaXMuX2J1ZmZlcnMgPSBbXTtcblxuICAgICAgICBjb25zdCBrZXlzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBsYXllci5wYWludC5fdmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAoIWZpbHRlclByb3BlcnRpZXMocHJvcGVydHkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbGF5ZXIucGFpbnQuZ2V0KHByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKSB8fCAhc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24odmFsdWUucHJvcGVydHkuc3BlY2lmaWNhdGlvbikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gcGFpbnRBdHRyaWJ1dGVOYW1lcyhwcm9wZXJ0eSwgbGF5ZXIudHlwZSk7XG4gICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID0gdmFsdWUudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gdmFsdWUucHJvcGVydHkuc3BlY2lmaWNhdGlvbi50eXBlO1xuICAgICAgICAgICAgY29uc3QgdXNlSW50ZWdlclpvb20gPSB2YWx1ZS5wcm9wZXJ0eS51c2VJbnRlZ2VyWm9vbTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BUeXBlID0gdmFsdWUucHJvcGVydHkuc3BlY2lmaWNhdGlvblsncHJvcGVydHktdHlwZSddO1xuICAgICAgICAgICAgY29uc3QgaXNDcm9zc0ZhZGVkID0gcHJvcFR5cGUgPT09ICdjcm9zcy1mYWRlZCcgfHwgcHJvcFR5cGUgPT09ICdjcm9zcy1mYWRlZC1kYXRhLWRyaXZlbic7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUV4Y2VwdGlvbiA9IFN0cmluZyhwcm9wZXJ0eSkgPT09ICdsaW5lLWRhc2hhcnJheScgJiYgKGxheWVyLmxheW91dDogYW55KS5nZXQoJ2xpbmUtY2FwJykudmFsdWUua2luZCAhPT0gJ2NvbnN0YW50JztcblxuICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50JyAmJiAhc291cmNlRXhjZXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kZXJzW3Byb3BlcnR5XSA9IGlzQ3Jvc3NGYWRlZCA/XG4gICAgICAgICAgICAgICAgICAgIG5ldyBDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXIoZXhwcmVzc2lvbi52YWx1ZSwgbmFtZXMpIDpcbiAgICAgICAgICAgICAgICAgICAgbmV3IENvbnN0YW50QmluZGVyKGV4cHJlc3Npb24udmFsdWUsIG5hbWVzLCB0eXBlKTtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goYC91XyR7cHJvcGVydHl9YCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09PSAnc291cmNlJyB8fCBzb3VyY2VFeGNlcHRpb24gfHwgaXNDcm9zc0ZhZGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgU3RydWN0QXJyYXlMYXlvdXQgPSBsYXlvdXRUeXBlKHByb3BlcnR5LCB0eXBlLCAnc291cmNlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kZXJzW3Byb3BlcnR5XSA9IGlzQ3Jvc3NGYWRlZCA/XG4gICAgICAgICAgICAgICAgICAgIG5ldyBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyKGV4cHJlc3Npb24sIG5hbWVzLCB0eXBlLCB1c2VJbnRlZ2VyWm9vbSwgem9vbSwgU3RydWN0QXJyYXlMYXlvdXQsIGxheWVyLmlkKSA6XG4gICAgICAgICAgICAgICAgICAgIG5ldyBTb3VyY2VFeHByZXNzaW9uQmluZGVyKGV4cHJlc3Npb24sIG5hbWVzLCB0eXBlLCBTdHJ1Y3RBcnJheUxheW91dCk7XG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGAvYV8ke3Byb3BlcnR5fWApO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IFN0cnVjdEFycmF5TGF5b3V0ID0gbGF5b3V0VHlwZShwcm9wZXJ0eSwgdHlwZSwgJ2NvbXBvc2l0ZScpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZGVyc1twcm9wZXJ0eV0gPSBuZXcgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlcihleHByZXNzaW9uLCBuYW1lcywgdHlwZSwgdXNlSW50ZWdlclpvb20sIHpvb20sIFN0cnVjdEFycmF5TGF5b3V0KTtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goYC96XyR7cHJvcGVydHl9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhY2hlS2V5ID0ga2V5cy5zb3J0KCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgZ2V0TWF4VmFsdWUocHJvcGVydHk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgIHJldHVybiBiaW5kZXIgaW5zdGFuY2VvZiBTb3VyY2VFeHByZXNzaW9uQmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXIgPyBiaW5kZXIubWF4VmFsdWUgOiAwO1xuICAgIH1cblxuICAgIHBvcHVsYXRlUGFpbnRBcnJheXMobmV3TGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoYmluZGVyIGluc3RhbmNlb2YgU291cmNlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIpXG4gICAgICAgICAgICAgICAgKGJpbmRlcjogQXR0cmlidXRlQmluZGVyKS5wb3B1bGF0ZVBhaW50QXJyYXkobmV3TGVuZ3RoLCBmZWF0dXJlLCBpbWFnZVBvc2l0aW9ucywgYXZhaWxhYmxlSW1hZ2VzLCBjYW5vbmljYWwsIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbzogSW1hZ2VQb3NpdGlvbiwgcG9zRnJvbTogSW1hZ2VQb3NpdGlvbikge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXIpXG4gICAgICAgICAgICAgICAgYmluZGVyLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbywgcG9zRnJvbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVQYWludEFycmF5cyhmZWF0dXJlU3RhdGVzOiBGZWF0dXJlU3RhdGVzLCBmZWF0dXJlTWFwOiBGZWF0dXJlUG9zaXRpb25NYXAsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgbGF5ZXI6IFR5cGVkU3R5bGVMYXllciwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgZGlydHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBmZWF0dXJlU3RhdGVzKSB7XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBmZWF0dXJlTWFwLmdldFBvc2l0aW9ucyhpZCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9zIG9mIHBvc2l0aW9ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSB2dExheWVyLmZlYXR1cmUocG9zLmluZGV4KTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYmluZGVyIGluc3RhbmNlb2YgU291cmNlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgYmluZGVyIGluc3RhbmNlb2YgQ3Jvc3NGYWRlZENvbXBvc2l0ZUJpbmRlcikgJiYgKGJpbmRlcjogYW55KS5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vQUhNOiBSZW1vdmUgYWZ0ZXIgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzYyNTVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbGF5ZXIucGFpbnQuZ2V0KHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIChiaW5kZXI6IGFueSkuZXhwcmVzc2lvbiA9IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgKGJpbmRlcjogQXR0cmlidXRlQmluZGVyKS51cGRhdGVQYWludEFycmF5KHBvcy5zdGFydCwgcG9zLmVuZCwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlc1tpZF0sIGF2YWlsYWJsZUltYWdlcywgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaXJ0eTtcbiAgICB9XG5cbiAgICBkZWZpbmVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoYmluZGVyIGluc3RhbmNlb2YgQ29uc3RhbnRCaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uYmluZGVyLnVuaWZvcm1OYW1lcy5tYXAobmFtZSA9PiBgI2RlZmluZSBIQVNfVU5JRk9STV8ke25hbWV9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZ2V0QmluZGVyQXR0cmlidXRlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKGJpbmRlciBpbnN0YW5jZW9mIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5kZXIucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJpbmRlci5wYWludFZlcnRleEF0dHJpYnV0ZXNbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZ2V0QmluZGVyVW5pZm9ybXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHVuaWZvcm1zID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKGJpbmRlciBpbnN0YW5jZW9mIENvbnN0YW50QmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENyb3NzRmFkZWRDb25zdGFudEJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB1bmlmb3JtTmFtZSBvZiBiaW5kZXIudW5pZm9ybU5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLnB1c2godW5pZm9ybU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pZm9ybXM7XG4gICAgfVxuXG4gICAgZ2V0UGFpbnRWZXJ0ZXhCdWZmZXJzKCk6IEFycmF5PFZlcnRleEJ1ZmZlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVycztcbiAgICB9XG5cbiAgICBnZXRVbmlmb3Jtcyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBBcnJheTxCaW5kZXJVbmlmb3JtPiB7XG4gICAgICAgIGNvbnN0IHVuaWZvcm1zID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKGJpbmRlciBpbnN0YW5jZW9mIENvbnN0YW50QmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENyb3NzRmFkZWRDb25zdGFudEJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIGJpbmRlci51bmlmb3JtTmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmluZGluZyA9IGJpbmRlci5nZXRCaW5kaW5nKGNvbnRleHQsIGxvY2F0aW9uc1tuYW1lXSwgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtcy5wdXNoKHtuYW1lLCBwcm9wZXJ0eSwgYmluZGluZ30pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmlmb3JtcztcbiAgICB9XG5cbiAgICBzZXRVbmlmb3JtczxQcm9wZXJ0aWVzOiBPYmplY3Q+KGNvbnRleHQ6IENvbnRleHQsIGJpbmRlclVuaWZvcm1zOiBBcnJheTxCaW5kZXJVbmlmb3JtPiwgcHJvcGVydGllczogUG9zc2libHlFdmFsdWF0ZWQ8UHJvcGVydGllcz4sIGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMpIHtcbiAgICAgICAgLy8gVW5pZm9ybSBzdGF0ZSBiaW5kaW5ncyBhcmUgb3duZWQgYnkgdGhlIFByb2dyYW0sIGJ1dCB3ZSBzZXQgdGhlbVxuICAgICAgICAvLyBmcm9tIHdpdGhpbiB0aGUgUHJvZ3JhbUNvbmZpZ3VyYXRpb24ncyBiaW5kZXIgbWVtYmVycy5cbiAgICAgICAgZm9yIChjb25zdCB7bmFtZSwgcHJvcGVydHksIGJpbmRpbmd9IG9mIGJpbmRlclVuaWZvcm1zKSB7XG4gICAgICAgICAgICAodGhpcy5iaW5kZXJzW3Byb3BlcnR5XTogYW55KS5zZXRVbmlmb3JtKGJpbmRpbmcsIGdsb2JhbHMsIHByb3BlcnRpZXMuZ2V0KHByb3BlcnR5KSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVQYWludEJ1ZmZlcnMoY3Jvc3NmYWRlPzogQ3Jvc3NmYWRlUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLl9idWZmZXJzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoY3Jvc3NmYWRlICYmIGJpbmRlciBpbnN0YW5jZW9mIENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuVmVydGV4QnVmZmVyID0gY3Jvc3NmYWRlLmZyb21TY2FsZSA9PT0gMiA/IGJpbmRlci56b29tSW5QYWludFZlcnRleEJ1ZmZlciA6IGJpbmRlci56b29tT3V0UGFpbnRWZXJ0ZXhCdWZmZXI7XG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm5WZXJ0ZXhCdWZmZXIpIHRoaXMuX2J1ZmZlcnMucHVzaChwYXR0ZXJuVmVydGV4QnVmZmVyKTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmICgoYmluZGVyIGluc3RhbmNlb2YgU291cmNlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKSAmJiBiaW5kZXIucGFpbnRWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9idWZmZXJzLnB1c2goYmluZGVyLnBhaW50VmVydGV4QnVmZmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKGJpbmRlciBpbnN0YW5jZW9mIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyKVxuICAgICAgICAgICAgICAgIGJpbmRlci51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVQYWludEJ1ZmZlcnMoKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChiaW5kZXIgaW5zdGFuY2VvZiBTb3VyY2VFeHByZXNzaW9uQmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ3Jvc3NGYWRlZENvbXBvc2l0ZUJpbmRlcilcbiAgICAgICAgICAgICAgICBiaW5kZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8TGF5ZXI6IFR5cGVkU3R5bGVMYXllcj4ge1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczoge1tfOiBzdHJpbmddOiBQcm9ncmFtQ29uZmlndXJhdGlvbn07XG4gICAgbmVlZHNVcGxvYWQ6IGJvb2xlYW47XG4gICAgX2ZlYXR1cmVNYXA6IEZlYXR1cmVQb3NpdGlvbk1hcDtcbiAgICBfYnVmZmVyT2Zmc2V0OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcnM6ICRSZWFkT25seUFycmF5PExheWVyPiwgem9vbTogbnVtYmVyLCBmaWx0ZXJQcm9wZXJ0aWVzOiAoXzogc3RyaW5nKSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZSkge1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXIuaWRdID0gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uKGxheWVyLCB6b29tLCBmaWx0ZXJQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5lZWRzVXBsb2FkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZlYXR1cmVNYXAgPSBuZXcgRmVhdHVyZVBvc2l0aW9uTWFwKCk7XG4gICAgICAgIHRoaXMuX2J1ZmZlck9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5cyhsZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgaW5kZXg6IG51bWJlciwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1trZXldLnBvcHVsYXRlUGFpbnRBcnJheXMobGVuZ3RoLCBmZWF0dXJlLCBpbWFnZVBvc2l0aW9ucywgYXZhaWxhYmxlSW1hZ2VzLCBjYW5vbmljYWwsIGZvcm1hdHRlZFNlY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZlYXR1cmUuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fZmVhdHVyZU1hcC5hZGQoZmVhdHVyZS5pZCwgaW5kZXgsIHRoaXMuX2J1ZmZlck9mZnNldCwgbGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9idWZmZXJPZmZzZXQgPSBsZW5ndGg7XG5cbiAgICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFpbnRBcnJheXMoZmVhdHVyZVN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBsYXllcnM6ICRSZWFkT25seUFycmF5PFR5cGVkU3R5bGVMYXllcj4sIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllci5pZF0udXBkYXRlUGFpbnRBcnJheXMoZmVhdHVyZVN0YXRlcywgdGhpcy5fZmVhdHVyZU1hcCwgdnRMYXllciwgbGF5ZXIsIGF2YWlsYWJsZUltYWdlcywgaW1hZ2VQb3NpdGlvbnMpIHx8IHRoaXMubmVlZHNVcGxvYWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQobGF5ZXJJZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllcklkXTtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMubmVlZHNVcGxvYWQpIHJldHVybjtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIGluIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllcklkXS51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXJJZF0uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBhdHRyaWJ1dGVOYW1lRXhjZXB0aW9ucyA9IHtcbiAgICAndGV4dC1vcGFjaXR5JzogWydvcGFjaXR5J10sXG4gICAgJ2ljb24tb3BhY2l0eSc6IFsnb3BhY2l0eSddLFxuICAgICd0ZXh0LWNvbG9yJzogWydmaWxsX2NvbG9yJ10sXG4gICAgJ2ljb24tY29sb3InOiBbJ2ZpbGxfY29sb3InXSxcbiAgICAndGV4dC1oYWxvLWNvbG9yJzogWydoYWxvX2NvbG9yJ10sXG4gICAgJ2ljb24taGFsby1jb2xvcic6IFsnaGFsb19jb2xvciddLFxuICAgICd0ZXh0LWhhbG8tYmx1cic6IFsnaGFsb19ibHVyJ10sXG4gICAgJ2ljb24taGFsby1ibHVyJzogWydoYWxvX2JsdXInXSxcbiAgICAndGV4dC1oYWxvLXdpZHRoJzogWydoYWxvX3dpZHRoJ10sXG4gICAgJ2ljb24taGFsby13aWR0aCc6IFsnaGFsb193aWR0aCddLFxuICAgICdsaW5lLWdhcC13aWR0aCc6IFsnZ2Fwd2lkdGgnXSxcbiAgICAnbGluZS1wYXR0ZXJuJzogWydwYXR0ZXJuX3RvJywgJ3BhdHRlcm5fZnJvbScsICdwaXhlbF9yYXRpb190bycsICdwaXhlbF9yYXRpb19mcm9tJ10sXG4gICAgJ2ZpbGwtcGF0dGVybic6IFsncGF0dGVybl90bycsICdwYXR0ZXJuX2Zyb20nLCAncGl4ZWxfcmF0aW9fdG8nLCAncGl4ZWxfcmF0aW9fZnJvbSddLFxuICAgICdmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuJzogWydwYXR0ZXJuX3RvJywgJ3BhdHRlcm5fZnJvbScsICdwaXhlbF9yYXRpb190bycsICdwaXhlbF9yYXRpb19mcm9tJ10sXG4gICAgJ2xpbmUtZGFzaGFycmF5JzogWydkYXNoX3RvJywgJ2Rhc2hfZnJvbSddXG59O1xuXG5mdW5jdGlvbiBwYWludEF0dHJpYnV0ZU5hbWVzKHByb3BlcnR5LCB0eXBlKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWVFeGNlcHRpb25zW3Byb3BlcnR5XSB8fCBbcHJvcGVydHkucmVwbGFjZShgJHt0eXBlfS1gLCAnJykucmVwbGFjZSgvLS9nLCAnXycpXTtcbn1cblxuY29uc3QgcHJvcGVydHlFeGNlcHRpb25zID0ge1xuICAgICdsaW5lLXBhdHRlcm4nOiB7XG4gICAgICAgICdzb3VyY2UnOiBQYXR0ZXJuTGF5b3V0QXJyYXksXG4gICAgICAgICdjb21wb3NpdGUnOiBQYXR0ZXJuTGF5b3V0QXJyYXlcbiAgICB9LFxuICAgICdmaWxsLXBhdHRlcm4nOiB7XG4gICAgICAgICdzb3VyY2UnOiBQYXR0ZXJuTGF5b3V0QXJyYXksXG4gICAgICAgICdjb21wb3NpdGUnOiBQYXR0ZXJuTGF5b3V0QXJyYXlcbiAgICB9LFxuICAgICdmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuJzp7XG4gICAgICAgICdzb3VyY2UnOiBQYXR0ZXJuTGF5b3V0QXJyYXksXG4gICAgICAgICdjb21wb3NpdGUnOiBQYXR0ZXJuTGF5b3V0QXJyYXlcbiAgICB9LFxuICAgICdsaW5lLWRhc2hhcnJheSc6IHsgLy8gdGVtcG9yYXJ5IGxheW91dFxuICAgICAgICAnc291cmNlJzogRGFzaExheW91dEFycmF5LFxuICAgICAgICAnY29tcG9zaXRlJzogRGFzaExheW91dEFycmF5XG4gICAgfVxufTtcblxuY29uc3QgZGVmYXVsdExheW91dHMgPSB7XG4gICAgJ2NvbG9yJzoge1xuICAgICAgICAnc291cmNlJzogU3RydWN0QXJyYXlMYXlvdXQyZjgsXG4gICAgICAgICdjb21wb3NpdGUnOiBTdHJ1Y3RBcnJheUxheW91dDRmMTZcbiAgICB9LFxuICAgICdudW1iZXInOiB7XG4gICAgICAgICdzb3VyY2UnOiBTdHJ1Y3RBcnJheUxheW91dDFmNCxcbiAgICAgICAgJ2NvbXBvc2l0ZSc6IFN0cnVjdEFycmF5TGF5b3V0MmY4XG4gICAgfVxufTtcblxuZnVuY3Rpb24gbGF5b3V0VHlwZShwcm9wZXJ0eSwgdHlwZSwgYmluZGVyVHlwZSkge1xuICAgIGNvbnN0IGxheW91dEV4Y2VwdGlvbiA9IHByb3BlcnR5RXhjZXB0aW9uc1twcm9wZXJ0eV07XG4gICAgcmV0dXJuICBsYXlvdXRFeGNlcHRpb24gJiYgbGF5b3V0RXhjZXB0aW9uW2JpbmRlclR5cGVdIHx8IGRlZmF1bHRMYXlvdXRzW3R5cGVdW2JpbmRlclR5cGVdO1xufVxuXG5yZWdpc3RlcignQ29uc3RhbnRCaW5kZXInLCBDb25zdGFudEJpbmRlcik7XG5yZWdpc3RlcignQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyJywgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyKTtcbnJlZ2lzdGVyKCdTb3VyY2VFeHByZXNzaW9uQmluZGVyJywgU291cmNlRXhwcmVzc2lvbkJpbmRlcik7XG5yZWdpc3RlcignQ3Jvc3NGYWRlZENvbXBvc2l0ZUJpbmRlcicsIENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIpO1xucmVnaXN0ZXIoJ0NvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXInLCBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKTtcbnJlZ2lzdGVyKCdQcm9ncmFtQ29uZmlndXJhdGlvbicsIFByb2dyYW1Db25maWd1cmF0aW9uLCB7b21pdDogWydfYnVmZmVycyddfSk7XG5yZWdpc3RlcignUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQnLCBQcm9ncmFtQ29uZmlndXJhdGlvblNldCk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2VuZHNXaXRoLCBmaWx0ZXJPYmplY3R9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcbmltcG9ydCB7XG4gICAgdmFsaWRhdGVTdHlsZSxcbiAgICB2YWxpZGF0ZUxheW91dFByb3BlcnR5LFxuICAgIHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSxcbiAgICBlbWl0VmFsaWRhdGlvbkVycm9yc1xufSBmcm9tICcuL3ZhbGlkYXRlX3N0eWxlLmpzJztcbmltcG9ydCB7RXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCB7TGF5b3V0LCBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUHJvcGVydGllcywgUG9zc2libHlFdmFsdWF0ZWQsIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZX0gZnJvbSAnLi9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7c3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCBQcm9ncmFtQ29uZmlndXJhdGlvbiBmcm9tICcuLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQgZmVhdHVyZUZpbHRlciBmcm9tICcuLi9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyL2luZGV4LmpzJztcblxuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtCdWNrZXR9IGZyb20gJy4uL2RhdGEvYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVGaWx0ZXJ9IGZyb20gJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXIvaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge1RyYW5zaXRpb25QYXJhbWV0ZXJzLCBQcm9wZXJ0eVZhbHVlfSBmcm9tICcuL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvblBhcmFtZXRlcnMsIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgTGF5ZXJTcGVjaWZpY2F0aW9uLFxuICAgIEZpbHRlclNwZWNpZmljYXRpb25cbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7Q3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGZyb20gJy4vc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAuanMnO1xuaW1wb3J0IHR5cGUge1N0eWxlU2V0dGVyT3B0aW9uc30gZnJvbSAnLi9zdHlsZS5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZXNwYWNlUXVlcnlHZW9tZXRyeX0gZnJvbSAnLi9xdWVyeV9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgdHlwZSB7REVNU2FtcGxlcn0gZnJvbSAnLi4vdGVycmFpbi9lbGV2YXRpb24uanMnO1xuXG5jb25zdCBUUkFOU0lUSU9OX1NVRkZJWCA9ICctdHJhbnNpdGlvbic7XG5cbmNsYXNzIFN0eWxlTGF5ZXIgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBtaXhlZDtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgc291cmNlOiBzdHJpbmc7XG4gICAgc291cmNlTGF5ZXI6ID9zdHJpbmc7XG4gICAgbWluem9vbTogP251bWJlcjtcbiAgICBtYXh6b29tOiA/bnVtYmVyO1xuICAgIGZpbHRlcjogRmlsdGVyU3BlY2lmaWNhdGlvbiB8IHZvaWQ7XG4gICAgdmlzaWJpbGl0eTogJ3Zpc2libGUnIHwgJ25vbmUnIHwgdm9pZDtcbiAgICBfY3Jvc3NmYWRlUGFyYW1ldGVyczogQ3Jvc3NmYWRlUGFyYW1ldGVycztcblxuICAgIF91bmV2YWx1YXRlZExheW91dDogTGF5b3V0PGFueT47XG4gICAgK2xheW91dDogbWl4ZWQ7XG5cbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8YW55PjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPGFueT47XG4gICAgK3BhaW50OiBtaXhlZDtcblxuICAgIF9mZWF0dXJlRmlsdGVyOiBGZWF0dXJlRmlsdGVyO1xuICAgIF9maWx0ZXJDb21waWxlZDogYm9vbGVhbjtcblxuICAgICtxdWVyeVJhZGl1czogKGJ1Y2tldDogQnVja2V0KSA9PiBudW1iZXI7XG4gICAgK3F1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmU6IChxdWVyeUdlb21ldHJ5OiBUaWxlc3BhY2VRdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxldmF0aW9uSGVscGVyOiA/REVNU2FtcGxlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFZlcnRleEFycmF5T2Zmc2V0OiBudW1iZXIpID0+IGJvb2xlYW4gfCBudW1iZXI7XG5cbiAgICArb25BZGQ6ID8obWFwOiBNYXApID0+IHZvaWQ7XG4gICAgK29uUmVtb3ZlOiA/KG1hcDogTWFwKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbiB8IEN1c3RvbUxheWVySW50ZXJmYWNlLCBwcm9wZXJ0aWVzOiAkUmVhZE9ubHk8e2xheW91dD86IFByb3BlcnRpZXM8Kj4sIHBhaW50PzogUHJvcGVydGllczwqPn0+KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5pZCA9IGxheWVyLmlkO1xuICAgICAgICB0aGlzLnR5cGUgPSBsYXllci50eXBlO1xuICAgICAgICB0aGlzLl9mZWF0dXJlRmlsdGVyID0ge2ZpbHRlcjogKCkgPT4gdHJ1ZSwgbmVlZEdlb21ldHJ5OiBmYWxzZSwgbmVlZEZlYXR1cmU6IGZhbHNlfTtcbiAgICAgICAgdGhpcy5fZmlsdGVyQ29tcGlsZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ2N1c3RvbScpIHJldHVybjtcblxuICAgICAgICBsYXllciA9ICgobGF5ZXI6IGFueSk6IExheWVyU3BlY2lmaWNhdGlvbik7XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IGxheWVyLm1ldGFkYXRhO1xuICAgICAgICB0aGlzLm1pbnpvb20gPSBsYXllci5taW56b29tO1xuICAgICAgICB0aGlzLm1heHpvb20gPSBsYXllci5tYXh6b29tO1xuXG4gICAgICAgIGlmIChsYXllci50eXBlICE9PSAnYmFja2dyb3VuZCcgJiYgbGF5ZXIudHlwZSAhPT0gJ3NreScpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbGF5ZXIuc291cmNlO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VMYXllciA9IGxheWVyWydzb3VyY2UtbGF5ZXInXTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gbGF5ZXIuZmlsdGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnRpZXMubGF5b3V0KSB7XG4gICAgICAgICAgICB0aGlzLl91bmV2YWx1YXRlZExheW91dCA9IG5ldyBMYXlvdXQocHJvcGVydGllcy5sYXlvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnRpZXMucGFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQgPSBuZXcgVHJhbnNpdGlvbmFibGUocHJvcGVydGllcy5wYWludCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gbGF5ZXIucGFpbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBhaW50UHJvcGVydHkocHJvcGVydHksIGxheWVyLnBhaW50W3Byb3BlcnR5XSwge3ZhbGlkYXRlOiBmYWxzZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBsYXllci5sYXlvdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldExheW91dFByb3BlcnR5KHByb3BlcnR5LCBsYXllci5sYXlvdXRbcHJvcGVydHldLCB7dmFsaWRhdGU6IGZhbHNlfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudW50cmFuc2l0aW9uZWQoKTtcbiAgICAgICAgICAgIC8vJEZsb3dGaXhNZVxuICAgICAgICAgICAgdGhpcy5wYWludCA9IG5ldyBQb3NzaWJseUV2YWx1YXRlZChwcm9wZXJ0aWVzLnBhaW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENyb3NzZmFkZVBhcmFtZXRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jcm9zc2ZhZGVQYXJhbWV0ZXJzO1xuICAgIH1cblxuICAgIGdldExheW91dFByb3BlcnR5KG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3Zpc2liaWxpdHknKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52aXNpYmlsaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LmdldFZhbHVlKG5hbWUpO1xuICAgIH1cblxuICAgIHNldExheW91dFByb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGBsYXllcnMuJHt0aGlzLmlkfS5sYXlvdXQuJHtuYW1lfWA7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVMYXlvdXRQcm9wZXJ0eSwga2V5LCBuYW1lLCB2YWx1ZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmFtZSA9PT0gJ3Zpc2liaWxpdHknKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2liaWxpdHkgPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBnZXRQYWludFByb3BlcnR5KG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAoZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5nZXRUcmFuc2l0aW9uKG5hbWUuc2xpY2UoMCwgLVRSQU5TSVRJT05fU1VGRklYLmxlbmd0aCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuZ2V0VmFsdWUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRQYWludFByb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IG1peGVkLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYGxheWVycy4ke3RoaXMuaWR9LnBhaW50LiR7bmFtZX1gO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSwga2V5LCBuYW1lLCB2YWx1ZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNldFRyYW5zaXRpb24obmFtZS5zbGljZSgwLCAtVFJBTlNJVElPTl9TVUZGSVgubGVuZ3RoKSwgKHZhbHVlOiBhbnkpIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2l0aW9uYWJsZSA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tuYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ3Jvc3NGYWRlZFByb3BlcnR5ID0gdHJhbnNpdGlvbmFibGUucHJvcGVydHkuc3BlY2lmaWNhdGlvbltcInByb3BlcnR5LXR5cGVcIl0gPT09ICdjcm9zcy1mYWRlZC1kYXRhLWRyaXZlbic7XG4gICAgICAgICAgICBjb25zdCB3YXNEYXRhRHJpdmVuID0gdHJhbnNpdGlvbmFibGUudmFsdWUuaXNEYXRhRHJpdmVuKCk7XG4gICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRyYW5zaXRpb25hYmxlLnZhbHVlO1xuXG4gICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKG5hbWUpO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tuYW1lXS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGlzRGF0YURyaXZlbiA9IG5ld1ZhbHVlLmlzRGF0YURyaXZlbigpO1xuXG4gICAgICAgICAgICAvLyBpZiBhIGNyb3NzLWZhZGVkIHZhbHVlIGlzIGNoYW5nZWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBuZXcgaWNvbnMgZ2V0IGFkZGVkIHRvIGVhY2ggdGlsZSdzIGljb25BdGxhc1xuICAgICAgICAgICAgLy8gc28gYSBjYWxsIHRvIF91cGRhdGVMYXllciBpcyBuZWNlc3NhcnksIGFuZCB3ZSByZXR1cm4gdHJ1ZSBmcm9tIHRoaXMgZnVuY3Rpb24gc28gaXQgZ2V0cyBjYWxsZWQgaW5cbiAgICAgICAgICAgIC8vIFN0eWxlI3NldFBhaW50UHJvcGVydHlcbiAgICAgICAgICAgIHJldHVybiBpc0RhdGFEcml2ZW4gfHwgd2FzRGF0YURyaXZlbiB8fCBpc0Nyb3NzRmFkZWRQcm9wZXJ0eSB8fCB0aGlzLl9oYW5kbGVPdmVycmlkYWJsZVBhaW50UHJvcGVydHlVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9oYW5kbGVTcGVjaWFsUGFpbnRQcm9wZXJ0eVVwZGF0ZShfOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gTm8tb3A7IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtSWRzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIC8vIE5vLW9wOyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZXJpdmVkIGNsYXNzZXMuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1Db25maWd1cmF0aW9uKF86IG51bWJlcik6IFByb2dyYW1Db25maWd1cmF0aW9uIHwgbnVsbCB7XG4gICAgICAgIC8vIE5vLW9wOyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZXJpdmVkIGNsYXNzZXMuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIF9oYW5kbGVPdmVycmlkYWJsZVBhaW50UHJvcGVydHlVcGRhdGU8VCwgUj4obmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPiwgbmV3VmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj4pOiBib29sZWFuIHtcbiAgICAgICAgLy8gTm8tb3A7IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzSGlkZGVuKHpvb206IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5taW56b29tICYmIHpvb20gPCB0aGlzLm1pbnpvb20pIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy5tYXh6b29tICYmIHpvb20gPj0gdGhpcy5tYXh6b29tKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJpbGl0eSA9PT0gJ25vbmUnO1xuICAgIH1cblxuICAgIHVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudHJhbnNpdGlvbmVkKHBhcmFtZXRlcnMsIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCk7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludC5oYXNUcmFuc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcmVjYWxjdWxhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBpZiAocGFyYW1ldGVycy5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLl9jcm9zc2ZhZGVQYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQpIHtcbiAgICAgICAgICAgICh0aGlzOiBhbnkpLmxheW91dCA9IHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycywgdW5kZWZpbmVkLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgKHRoaXM6IGFueSkucGFpbnQgPSB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzLCB1bmRlZmluZWQsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBvdXRwdXQ6IGFueSA9IHtcbiAgICAgICAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAgICAgICAndHlwZSc6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICdzb3VyY2UnOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICdzb3VyY2UtbGF5ZXInOiB0aGlzLnNvdXJjZUxheWVyLFxuICAgICAgICAgICAgJ21ldGFkYXRhJzogdGhpcy5tZXRhZGF0YSxcbiAgICAgICAgICAgICdtaW56b29tJzogdGhpcy5taW56b29tLFxuICAgICAgICAgICAgJ21heHpvb20nOiB0aGlzLm1heHpvb20sXG4gICAgICAgICAgICAnZmlsdGVyJzogdGhpcy5maWx0ZXIsXG4gICAgICAgICAgICAnbGF5b3V0JzogdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQgJiYgdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuc2VyaWFsaXplKCksXG4gICAgICAgICAgICAncGFpbnQnOiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50ICYmIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuc2VyaWFsaXplKClcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy52aXNpYmlsaXR5KSB7XG4gICAgICAgICAgICBvdXRwdXQubGF5b3V0ID0gb3V0cHV0LmxheW91dCB8fCB7fTtcbiAgICAgICAgICAgIG91dHB1dC5sYXlvdXQudmlzaWJpbGl0eSA9IHRoaXMudmlzaWJpbGl0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJPYmplY3Qob3V0cHV0LCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhKGtleSA9PT0gJ2xheW91dCcgJiYgIU9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpICYmXG4gICAgICAgICAgICAgICAgIShrZXkgPT09ICdwYWludCcgJiYgIU9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGUodmFsaWRhdGU6IEZ1bmN0aW9uLCBrZXk6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogbWl4ZWQsIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlLmNhbGwodmFsaWRhdGVTdHlsZSwge1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgbGF5ZXJUeXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBvYmplY3RLZXk6IG5hbWUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yNDA3XG4gICAgICAgICAgICBzdHlsZToge2dseXBoczogdHJ1ZSwgc3ByaXRlOiB0cnVlfVxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgaXMzRCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzU2t5KCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNUaWxlQ2xpcHBlZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGhhc09mZnNjcmVlblBhc3MoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNpemUoKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICB9XG5cbiAgICBpc1N0YXRlRGVwZW5kZW50KCkge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluICh0aGlzOiBhbnkpLnBhaW50Ll92YWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKHRoaXM6IGFueSkucGFpbnQuZ2V0KHByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKSB8fCAhc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24odmFsdWUucHJvcGVydHkuc3BlY2lmaWNhdGlvbikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCh2YWx1ZS52YWx1ZS5raW5kID09PSAnc291cmNlJyB8fCB2YWx1ZS52YWx1ZS5raW5kID09PSAnY29tcG9zaXRlJykgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZS5pc1N0YXRlRGVwZW5kZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbXBpbGVGaWx0ZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZmlsdGVyQ29tcGlsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZlYXR1cmVGaWx0ZXIgPSBmZWF0dXJlRmlsdGVyKHRoaXMuZmlsdGVyKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlckNvbXBpbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGludmFsaWRhdGVDb21waWxlZEZpbHRlcigpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyQ29tcGlsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBkeW5hbWljRmlsdGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmVhdHVyZUZpbHRlci5keW5hbWljRmlsdGVyO1xuICAgIH1cblxuICAgIGR5bmFtaWNGaWx0ZXJOZWVkc0ZlYXR1cmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mZWF0dXJlRmlsdGVyLm5lZWRGZWF0dXJlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3R5bGVMYXllcjtcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5jb25zdCBsYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3MnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfVxuXSwgNCk7XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dDtcbmV4cG9ydCBjb25zdCB7bWVtYmVycywgc2l6ZSwgYWxpZ25tZW50fSA9IGxheW91dDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7d2Fybk9uY2V9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5cbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5cbmltcG9ydCB0eXBlIFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4uL3JlbmRlci92ZXJ0ZXhfYXJyYXlfb2JqZWN0LmpzJztcbmltcG9ydCB0eXBlIHtTdHJ1Y3RBcnJheX0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5leHBvcnQgdHlwZSBTZWdtZW50ID0ge1xuICAgIHNvcnRLZXk6IG51bWJlciB8IHZvaWQsXG4gICAgdmVydGV4T2Zmc2V0OiBudW1iZXIsXG4gICAgcHJpbWl0aXZlT2Zmc2V0OiBudW1iZXIsXG4gICAgdmVydGV4TGVuZ3RoOiBudW1iZXIsXG4gICAgcHJpbWl0aXZlTGVuZ3RoOiBudW1iZXIsXG4gICAgdmFvczoge1tfOiBzdHJpbmddOiBWZXJ0ZXhBcnJheU9iamVjdH1cbn1cblxuY2xhc3MgU2VnbWVudFZlY3RvciB7XG4gICAgc3RhdGljIE1BWF9WRVJURVhfQVJSQVlfTEVOR1RIOiBudW1iZXI7XG4gICAgc2VnbWVudHM6IEFycmF5PFNlZ21lbnQ+O1xuXG4gICAgY29uc3RydWN0b3Ioc2VnbWVudHM/OiBBcnJheTxTZWdtZW50PiA9IFtdKSB7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBzZWdtZW50cztcbiAgICB9XG5cbiAgICBwcmVwYXJlU2VnbWVudChudW1WZXJ0aWNlczogbnVtYmVyLCBsYXlvdXRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXksIGluZGV4QXJyYXk6IFN0cnVjdEFycmF5LCBzb3J0S2V5PzogbnVtYmVyKTogU2VnbWVudCB7XG4gICAgICAgIGxldCBzZWdtZW50OiBTZWdtZW50ID0gdGhpcy5zZWdtZW50c1t0aGlzLnNlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAobnVtVmVydGljZXMgPiBTZWdtZW50VmVjdG9yLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIKSB3YXJuT25jZShgTWF4IHZlcnRpY2VzIHBlciBzZWdtZW50IGlzICR7U2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSH06IGJ1Y2tldCByZXF1ZXN0ZWQgJHtudW1WZXJ0aWNlc31gKTtcbiAgICAgICAgaWYgKCFzZWdtZW50IHx8IHNlZ21lbnQudmVydGV4TGVuZ3RoICsgbnVtVmVydGljZXMgPiBTZWdtZW50VmVjdG9yLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIIHx8IHNlZ21lbnQuc29ydEtleSAhPT0gc29ydEtleSkge1xuICAgICAgICAgICAgc2VnbWVudCA9ICh7XG4gICAgICAgICAgICAgICAgdmVydGV4T2Zmc2V0OiBsYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgcHJpbWl0aXZlT2Zmc2V0OiBpbmRleEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhMZW5ndGg6IDAsXG4gICAgICAgICAgICAgICAgcHJpbWl0aXZlTGVuZ3RoOiAwXG4gICAgICAgICAgICB9OiBhbnkpO1xuICAgICAgICAgICAgaWYgKHNvcnRLZXkgIT09IHVuZGVmaW5lZCkgc2VnbWVudC5zb3J0S2V5ID0gc29ydEtleTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VnbWVudDtcbiAgICB9XG5cbiAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlZ21lbnRzO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiB0aGlzLnNlZ21lbnRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgaW4gc2VnbWVudC52YW9zKSB7XG4gICAgICAgICAgICAgICAgc2VnbWVudC52YW9zW2tdLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBzaW1wbGVTZWdtZW50KHZlcnRleE9mZnNldDogbnVtYmVyLCBwcmltaXRpdmVPZmZzZXQ6IG51bWJlciwgdmVydGV4TGVuZ3RoOiBudW1iZXIsIHByaW1pdGl2ZUxlbmd0aDogbnVtYmVyKTogU2VnbWVudFZlY3RvciB7XG4gICAgICAgIHJldHVybiBuZXcgU2VnbWVudFZlY3Rvcihbe1xuICAgICAgICAgICAgdmVydGV4T2Zmc2V0LFxuICAgICAgICAgICAgcHJpbWl0aXZlT2Zmc2V0LFxuICAgICAgICAgICAgdmVydGV4TGVuZ3RoLFxuICAgICAgICAgICAgcHJpbWl0aXZlTGVuZ3RoLFxuICAgICAgICAgICAgdmFvczoge30sXG4gICAgICAgICAgICBzb3J0S2V5OiAwXG4gICAgICAgIH1dKTtcbiAgICB9XG59XG5cbi8qXG4gKiBUaGUgbWF4aW11bSBzaXplIG9mIGEgdmVydGV4IGFycmF5LiBUaGlzIGxpbWl0IGlzIGltcG9zZWQgYnkgV2ViR0wncyAxNiBiaXRcbiAqIGFkZHJlc3Npbmcgb2YgdmVydGV4IGJ1ZmZlcnMuXG4gKiBAcHJpdmF0ZVxuICogQHJlYWRvbmx5XG4gKi9cblNlZ21lbnRWZWN0b3IuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEggPSBNYXRoLnBvdygyLCAxNikgLSAxO1xuXG5yZWdpc3RlcignU2VnbWVudFZlY3RvcicsIFNlZ21lbnRWZWN0b3IpO1xuZXhwb3J0IGRlZmF1bHQgU2VnbWVudFZlY3RvcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgTGluZUluZGV4QXJyYXksXG4gICAgVHJpYW5nbGVJbmRleEFycmF5LFxuICAgIExpbmVTdHJpcEluZGV4QXJyYXlcbn0gZnJvbSAnLi9hcnJheV90eXBlcy5qcyc7XG5cbi8qKlxuICogQW4gaW5kZXggYXJyYXkgc3RvcmVzIFVpbnQxNiBpbmRpY2VzIG9mIHZlcnRleGVzIGluIGEgY29ycmVzcG9uZGluZyB2ZXJ0ZXggYXJyYXkuIFdlIHVzZVxuICogdGhyZWUga2luZHMgb2YgaW5kZXggYXJyYXlzOiBhcnJheXMgc3RvcmluZyBncm91cHMgb2YgdGhyZWUgaW5kaWNlcywgZm9ybWluZyB0cmlhbmdsZXM7XG4gKiBhcnJheXMgc3RvcmluZyBwYWlycyBvZiBpbmRpY2VzLCBmb3JtaW5nIGxpbmUgc2VnbWVudHM7IGFuZCBhcnJheXMgc3RvcmluZyBzaW5nbGUgaW5kaWNlcyxcbiAqIGZvcm1pbmcgYSBsaW5lIHN0cmlwLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IHtMaW5lSW5kZXhBcnJheSwgVHJpYW5nbGVJbmRleEFycmF5LCBMaW5lU3RyaXBJbmRleEFycmF5fTtcbiIsIi8vIEBmbG93XG5cbi8qKlxuICogVGhlIG1heGltdW0gdmFsdWUgb2YgYSBjb29yZGluYXRlIGluIHRoZSBpbnRlcm5hbCB0aWxlIGNvb3JkaW5hdGUgc3lzdGVtLiBDb29yZGluYXRlcyBvZlxuICogYWxsIHNvdXJjZSBmZWF0dXJlcyBub3JtYWxpemVkIHRvIHRoaXMgZXh0ZW50IHVwb24gbG9hZC5cbiAqXG4gKiBUaGUgdmFsdWUgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgZm9sbG93aW5nOlxuICpcbiAqICogVmVydGV4IGJ1ZmZlciBzdG9yZSBwb3NpdGlvbnMgYXMgc2lnbmVkIDE2IGJpdCBpbnRlZ2Vycy5cbiAqICogT25lIGJpdCBpcyBsb3N0IGZvciBzaWduZWRuZXNzIHRvIHN1cHBvcnQgdGlsZSBidWZmZXJzLlxuICogKiBPbmUgYml0IGlzIGxvc3QgYmVjYXVzZSB0aGUgbGluZSB2ZXJ0ZXggYnVmZmVyIHVzZWQgdG8gcGFjayAxIGJpdCBvZiBvdGhlciBkYXRhIGludG8gdGhlIGludC5cbiAqICogT25lIGJpdCBpcyBsb3N0IHRvIHN1cHBvcnQgZmVhdHVyZXMgZXh0ZW5kaW5nIHBhc3QgdGhlIGV4dGVudCBvbiB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdGlsZS5cbiAqICogVGhpcyBsZWF2ZXMgdXMgd2l0aCAyXjEzID0gODE5MlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmVhZG9ubHlcbiAqL1xuZXhwb3J0IGRlZmF1bHQgODE5MjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBMbmdMYXQgZnJvbSAnLi9sbmdfbGF0LmpzJztcblxuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gJy4vbG5nX2xhdC5qcyc7XG5cbi8qKlxuICogQSBgTG5nTGF0Qm91bmRzYCBvYmplY3QgcmVwcmVzZW50cyBhIGdlb2dyYXBoaWNhbCBib3VuZGluZyBib3gsXG4gKiBkZWZpbmVkIGJ5IGl0cyBzb3V0aHdlc3QgYW5kIG5vcnRoZWFzdCBwb2ludHMgaW4gbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZS5cbiAqXG4gKiBJZiBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIHRoZSBjb25zdHJ1Y3RvciwgYSBgbnVsbGAgYm91bmRpbmcgYm94IGlzIGNyZWF0ZWQuXG4gKlxuICogTm90ZSB0aGF0IGFueSBNYXBib3ggR0wgbWV0aG9kIHRoYXQgYWNjZXB0cyBhIGBMbmdMYXRCb3VuZHNgIG9iamVjdCBhcyBhbiBhcmd1bWVudCBvciBvcHRpb25cbiAqIGNhbiBhbHNvIGFjY2VwdCBhbiBgQXJyYXlgIG9mIHR3byB7QGxpbmsgTG5nTGF0TGlrZX0gY29uc3RydWN0cyBhbmQgd2lsbCBwZXJmb3JtIGFuIGltcGxpY2l0IGNvbnZlcnNpb24uXG4gKiBUaGlzIGZsZXhpYmxlIHR5cGUgaXMgZG9jdW1lbnRlZCBhcyB7QGxpbmsgTG5nTGF0Qm91bmRzTGlrZX0uXG4gKlxuICogQHBhcmFtIHtMbmdMYXRMaWtlfSBbc3ddIFRoZSBzb3V0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gKiBAcGFyYW0ge0xuZ0xhdExpa2V9IFtuZV0gVGhlIG5vcnRoZWFzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzdyA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpO1xuICogY29uc3QgbmUgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45Mzk3LCA0MC44MDAyKTtcbiAqIGNvbnN0IGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoc3csIG5lKTtcbiAqL1xuY2xhc3MgTG5nTGF0Qm91bmRzIHtcbiAgICBfbmU6IExuZ0xhdDtcbiAgICBfc3c6IExuZ0xhdDtcblxuICAgIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgdG9vIGZsZXhpYmxlIHRvIHR5cGUuIEl0IHNob3VsZCBub3QgYmUgc28gZmxleGlibGUuXG4gICAgY29uc3RydWN0b3Ioc3c6IGFueSwgbmU6IGFueSkge1xuICAgICAgICBpZiAoIXN3KSB7XG4gICAgICAgICAgICAvLyBub29wXG4gICAgICAgIH0gZWxzZSBpZiAobmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U291dGhXZXN0KHN3KS5zZXROb3J0aEVhc3QobmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHN3Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTb3V0aFdlc3QoW3N3WzBdLCBzd1sxXV0pLnNldE5vcnRoRWFzdChbc3dbMl0sIHN3WzNdXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFNvdXRoV2VzdChzd1swXSkuc2V0Tm9ydGhFYXN0KHN3WzFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBuZSBBIHtAbGluayBMbmdMYXRMaWtlfSBvYmplY3QgZGVzY3JpYmluZyB0aGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzdyA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpO1xuICAgICAqIGNvbnN0IG5lID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTM5NywgNDAuODAwMik7XG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhzdywgbmUpO1xuICAgICAqIGxsYi5zZXROb3J0aEVhc3QoWy03My45Mzk3LCA0Mi44MDAyXSk7XG4gICAgICovXG4gICAgc2V0Tm9ydGhFYXN0KG5lOiBMbmdMYXRMaWtlKSB7XG4gICAgICAgIHRoaXMuX25lID0gbmUgaW5zdGFuY2VvZiBMbmdMYXQgPyBuZXcgTG5nTGF0KG5lLmxuZywgbmUubGF0KSA6IExuZ0xhdC5jb252ZXJ0KG5lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzb3V0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IHN3IEEge0BsaW5rIExuZ0xhdExpa2V9IG9iamVjdCBkZXNjcmliaW5nIHRoZSBzb3V0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kc30gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHN3ID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTg3NiwgNDAuNzY2MSk7XG4gICAgICogY29uc3QgbmUgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45Mzk3LCA0MC44MDAyKTtcbiAgICAgKiBjb25zdCBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKHN3LCBuZSk7XG4gICAgICogbGxiLnNldFNvdXRoV2VzdChbLTczLjk4NzYsIDQwLjI2NjFdKTtcbiAgICAgKi9cbiAgICBzZXRTb3V0aFdlc3Qoc3c6IExuZ0xhdExpa2UpIHtcbiAgICAgICAgdGhpcy5fc3cgPSBzdyBpbnN0YW5jZW9mIExuZ0xhdCA/IG5ldyBMbmdMYXQoc3cubG5nLCBzdy5sYXQpIDogTG5nTGF0LmNvbnZlcnQoc3cpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHRlbmQgdGhlIGJvdW5kcyB0byBpbmNsdWRlIGEgZ2l2ZW4gTG5nTGF0TGlrZSBvciBMbmdMYXRCb3VuZHNMaWtlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfExuZ0xhdEJvdW5kc0xpa2V9IG9iaiBPYmplY3QgdG8gZXh0ZW5kIHRvLlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzdyA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpO1xuICAgICAqIGNvbnN0IG5lID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTM5NywgNDAuODAwMik7XG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhzdywgbmUpO1xuICAgICAqIGxsYi5leHRlbmQoWy03Mi45ODc2LCA0Mi4yNjYxXSk7XG4gICAgICovXG4gICAgZXh0ZW5kKG9iajogTG5nTGF0TGlrZSB8IExuZ0xhdEJvdW5kc0xpa2UpIHtcbiAgICAgICAgY29uc3Qgc3cgPSB0aGlzLl9zdyxcbiAgICAgICAgICAgIG5lID0gdGhpcy5fbmU7XG4gICAgICAgIGxldCBzdzIsIG5lMjtcblxuICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTG5nTGF0KSB7XG4gICAgICAgICAgICBzdzIgPSBvYmo7XG4gICAgICAgICAgICBuZTIgPSBvYmo7XG5cbiAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBMbmdMYXRCb3VuZHMpIHtcbiAgICAgICAgICAgIHN3MiA9IG9iai5fc3c7XG4gICAgICAgICAgICBuZTIgPSBvYmouX25lO1xuXG4gICAgICAgICAgICBpZiAoIXN3MiB8fCAhbmUyKSByZXR1cm4gdGhpcztcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgICAgIGlmIChvYmoubGVuZ3RoID09PSA0IHx8IG9iai5ldmVyeShBcnJheS5pc0FycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsbmdMYXRCb3VuZHNPYmogPSAoKG9iajogYW55KTogTG5nTGF0Qm91bmRzTGlrZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dGVuZChMbmdMYXRCb3VuZHMuY29udmVydChsbmdMYXRCb3VuZHNPYmopKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsbmdMYXRPYmogPSAoKG9iajogYW55KTogTG5nTGF0TGlrZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dGVuZChMbmdMYXQuY29udmVydChsbmdMYXRPYmopKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc3cgJiYgIW5lKSB7XG4gICAgICAgICAgICB0aGlzLl9zdyA9IG5ldyBMbmdMYXQoc3cyLmxuZywgc3cyLmxhdCk7XG4gICAgICAgICAgICB0aGlzLl9uZSA9IG5ldyBMbmdMYXQobmUyLmxuZywgbmUyLmxhdCk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN3LmxuZyA9IE1hdGgubWluKHN3Mi5sbmcsIHN3LmxuZyk7XG4gICAgICAgICAgICBzdy5sYXQgPSBNYXRoLm1pbihzdzIubGF0LCBzdy5sYXQpO1xuICAgICAgICAgICAgbmUubG5nID0gTWF0aC5tYXgobmUyLmxuZywgbmUubG5nKTtcbiAgICAgICAgICAgIG5lLmxhdCA9IE1hdGgubWF4KG5lMi5sYXQsIG5lLmxhdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZSBlcXVpZGlzdGFudCBmcm9tIHRoZSBib3VuZGluZyBib3gncyBjb3JuZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIGJvdW5kaW5nIGJveCdzIGNlbnRlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLmdldENlbnRlcigpOyAvLyA9IExuZ0xhdCB7bG5nOiAtNzMuOTYzNjUsIGxhdDogNDAuNzgzMTV9XG4gICAgICovXG4gICAgZ2V0Q2VudGVyKCk6IExuZ0xhdCB7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KCh0aGlzLl9zdy5sbmcgKyB0aGlzLl9uZS5sbmcpIC8gMiwgKHRoaXMuX3N3LmxhdCArIHRoaXMuX25lLmxhdCkgLyAyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3V0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgc291dGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAgICAgKiBsbGIuZ2V0U291dGhXZXN0KCk7IC8vIExuZ0xhdCB7bG5nOiAtNzMuOTg3NiwgbGF0OiA0MC43NjYxfVxuICAgICAqL1xuICAgIGdldFNvdXRoV2VzdCgpOiBMbmdMYXQgeyByZXR1cm4gdGhpcy5fc3c7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG5vcnRoZWFzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBub3J0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi5nZXROb3J0aEVhc3QoKTsgLy8gTG5nTGF0IHtsbmc6IC03My45Mzk3LCBsYXQ6IDQwLjgwMDJ9XG4gICAgICovXG4gICAgZ2V0Tm9ydGhFYXN0KCk6IExuZ0xhdCB7IHJldHVybiB0aGlzLl9uZTsgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbm9ydGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIG5vcnRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLmdldE5vcnRoV2VzdCgpOyAvLyBMbmdMYXQge2xuZzogLTczLjk4NzYsIGxhdDogNDAuODAwMn1cbiAgICAgKi9cbiAgICBnZXROb3J0aFdlc3QoKTogTG5nTGF0IHsgcmV0dXJuIG5ldyBMbmdMYXQodGhpcy5nZXRXZXN0KCksIHRoaXMuZ2V0Tm9ydGgoKSk7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNvdXRoZWFzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBzb3V0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi5nZXRTb3V0aEVhc3QoKTsgLy8gTG5nTGF0IHtsbmc6IC03My45Mzk3LCBsYXQ6IDQwLjc2NjF9XG4gICAgICovXG4gICAgZ2V0U291dGhFYXN0KCk6IExuZ0xhdCB7IHJldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0RWFzdCgpLCB0aGlzLmdldFNvdXRoKCkpOyB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB3ZXN0IGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB3ZXN0IGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLmdldFdlc3QoKTsgLy8gLTczLjk4NzZcbiAgICAgKi9cbiAgICBnZXRXZXN0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdy5sbmc7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNvdXRoIGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzb3V0aCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi5nZXRTb3V0aCgpOyAvLyA0MC43NjYxXG4gICAgICovXG4gICAgZ2V0U291dGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N3LmxhdDsgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZWFzdCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgZWFzdCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi5nZXRFYXN0KCk7IC8vIC03My45Mzk3XG4gICAgICovXG4gICAgZ2V0RWFzdCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbmUubG5nOyB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBub3J0aCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbm9ydGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAgICAgKiBsbGIuZ2V0Tm9ydGgoKTsgLy8gNDAuODAwMlxuICAgICAqL1xuICAgIGdldE5vcnRoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9uZS5sYXQ7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gVGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhbiBhcnJheSwgY29uc2lzdGluZyBvZiB0aGVcbiAgICAgKiAgIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IGNvb3JkaW5hdGVzIG9mIHRoZSBib3VuZGluZyByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbnVtYmVycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLnRvQXJyYXkoKTsgLy8gPSBbWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXV1cbiAgICAgKi9cbiAgICB0b0FycmF5KCkge1xuICAgICAgICByZXR1cm4gW3RoaXMuX3N3LnRvQXJyYXkoKSwgdGhpcy5fbmUudG9BcnJheSgpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBib3VuZGluZyBib3ggcmVwcmVzZW50cyBhcyBhIHN0cmluZyBvZiB0aGUgZm9ybWF0XG4gICAgICogICBgJ0xuZ0xhdEJvdW5kcyhMbmdMYXQobG5nLCBsYXQpLCBMbmdMYXQobG5nLCBsYXQpKSdgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAgICAgKiBsbGIudG9TdHJpbmcoKTsgLy8gPSBcIkxuZ0xhdEJvdW5kcyhMbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpLCBMbmdMYXQoLTczLjkzOTcsIDQwLjgwMDIpKVwiXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgTG5nTGF0Qm91bmRzKCR7dGhpcy5fc3cudG9TdHJpbmcoKX0sICR7dGhpcy5fbmUudG9TdHJpbmcoKX0pYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgYm91bmRpbmcgYm94IGlzIGFuIGVtcHR5L2BudWxsYC10eXBlIGJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGJvdW5kcyBoYXZlIGJlZW4gZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcygpO1xuICAgICAqIGxsYi5pc0VtcHR5KCk7IC8vIHRydWVcbiAgICAgKiBsbGIuc2V0Tm9ydGhFYXN0KFstNzMuOTg3NiwgNDAuNzY2MV0pO1xuICAgICAqIGxsYi5zZXRTb3V0aFdlc3QoWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLmlzRW1wdHkoKTsgLy8gZmFsc2VcbiAgICAgKi9cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gISh0aGlzLl9zdyAmJiB0aGlzLl9uZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBDaGVjayBpZiB0aGUgcG9pbnQgaXMgd2l0aGluIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBsbmdsYXQgR2VvZ3JhcGhpYyBwb2ludCB0byBjaGVjayBhZ2FpbnN0LlxuICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgYm91bmRpbmcgYm94LlxuICAgICogQGV4YW1wbGVcbiAgICAqIGNvbnN0IGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoXG4gICAgKiAgIG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpLFxuICAgICogICBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45Mzk3LCA0MC44MDAyKVxuICAgICogKTtcbiAgICAqXG4gICAgKiBjb25zdCBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk1NjcsIDQwLjc3ODkpO1xuICAgICpcbiAgICAqIGNvbnNvbGUubG9nKGxsYi5jb250YWlucyhsbCkpOyAvLyA9IHRydWVcbiAgICAqL1xuICAgIGNvbnRhaW5zKGxuZ2xhdDogTG5nTGF0TGlrZSkge1xuICAgICAgICBjb25zdCB7bG5nLCBsYXR9ID0gTG5nTGF0LmNvbnZlcnQobG5nbGF0KTtcblxuICAgICAgICBjb25zdCBjb250YWluc0xhdGl0dWRlID0gdGhpcy5fc3cubGF0IDw9IGxhdCAmJiBsYXQgPD0gdGhpcy5fbmUubGF0O1xuICAgICAgICBsZXQgY29udGFpbnNMb25naXR1ZGUgPSB0aGlzLl9zdy5sbmcgPD0gbG5nICYmIGxuZyA8PSB0aGlzLl9uZS5sbmc7XG4gICAgICAgIGlmICh0aGlzLl9zdy5sbmcgPiB0aGlzLl9uZS5sbmcpIHsgLy8gd3JhcHBlZCBjb29yZGluYXRlc1xuICAgICAgICAgICAgY29udGFpbnNMb25naXR1ZGUgPSB0aGlzLl9zdy5sbmcgPj0gbG5nICYmIGxuZyA+PSB0aGlzLl9uZS5sbmc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFpbnNMYXRpdHVkZSAmJiBjb250YWluc0xvbmdpdHVkZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbiBhcnJheSB0byBhIGBMbmdMYXRCb3VuZHNgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIElmIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0IGlzIHBhc3NlZCBpbiwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXQgdW5jaGFuZ2VkLlxuICAgICAqXG4gICAgICogSW50ZXJuYWxseSwgdGhlIGZ1bmN0aW9uIGNhbGxzIGBMbmdMYXQjY29udmVydGAgdG8gY29udmVydCBhcnJheXMgdG8gYExuZ0xhdGAgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRCb3VuZHNMaWtlfSBpbnB1dCBBbiBhcnJheSBvZiB0d28gY29vcmRpbmF0ZXMgdG8gY29udmVydCwgb3IgYSBgTG5nTGF0Qm91bmRzYCBvYmplY3QgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IEEgbmV3IGBMbmdMYXRCb3VuZHNgIG9iamVjdCwgaWYgYSBjb252ZXJzaW9uIG9jY3VycmVkLCBvciB0aGUgb3JpZ2luYWwgYExuZ0xhdEJvdW5kc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgYXJyID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dO1xuICAgICAqIGNvbnN0IGxsYiA9IG1hcGJveGdsLkxuZ0xhdEJvdW5kcy5jb252ZXJ0KGFycik7XG4gICAgICogY29uc29sZS5sb2cobGxiKTsgICAvLyA9IExuZ0xhdEJvdW5kcyB7X3N3OiBMbmdMYXQge2xuZzogLTczLjk4NzYsIGxhdDogNDAuNzY2MX0sIF9uZTogTG5nTGF0IHtsbmc6IC03My45Mzk3LCBsYXQ6IDQwLjgwMDJ9fVxuICAgICAqL1xuICAgIHN0YXRpYyBjb252ZXJ0KGlucHV0OiBMbmdMYXRCb3VuZHNMaWtlKTogTG5nTGF0Qm91bmRzIHtcbiAgICAgICAgaWYgKCFpbnB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIExuZ0xhdEJvdW5kcykgcmV0dXJuIGlucHV0O1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdEJvdW5kcyhpbnB1dCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEge0BsaW5rIExuZ0xhdEJvdW5kc30gb2JqZWN0LCBhbiBhcnJheSBvZiB7QGxpbmsgTG5nTGF0TGlrZX0gb2JqZWN0cyBpbiBbc3csIG5lXSBvcmRlcixcbiAqIG9yIGFuIGFycmF5IG9mIG51bWJlcnMgaW4gW3dlc3QsIHNvdXRoLCBlYXN0LCBub3J0aF0gb3JkZXIuXG4gKlxuICogQHR5cGVkZWYge0xuZ0xhdEJvdW5kcyB8IFtMbmdMYXRMaWtlLCBMbmdMYXRMaWtlXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdfSBMbmdMYXRCb3VuZHNMaWtlXG4gKiBAZXhhbXBsZVxuICogY29uc3QgdjEgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFxuICogICBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45ODc2LCA0MC43NjYxKSxcbiAqICAgbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTM5NywgNDAuODAwMilcbiAqICk7XG4gKiBjb25zdCB2MiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gKiBjb25zdCB2MyA9IFtbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdXTtcbiAqL1xuZXhwb3J0IHR5cGUgTG5nTGF0Qm91bmRzTGlrZSA9IExuZ0xhdEJvdW5kcyB8IFtMbmdMYXRMaWtlLCBMbmdMYXRMaWtlXSB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG5leHBvcnQgZGVmYXVsdCBMbmdMYXRCb3VuZHM7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3dyYXB9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgTG5nTGF0Qm91bmRzIGZyb20gJy4vbG5nX2xhdF9ib3VuZHMuanMnO1xuXG4vKlxuKiBBcHByb3hpbWF0ZSByYWRpdXMgb2YgdGhlIGVhcnRoIGluIG1ldGVycy5cbiogVXNlcyB0aGUgV0dTLTg0IGFwcHJveGltYXRpb24uIFRoZSByYWRpdXMgYXQgdGhlIGVxdWF0b3IgaXMgfjYzNzgxMzcgYW5kIGF0IHRoZSBwb2xlcyBpcyB+NjM1Njc1Mi4gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV29ybGRfR2VvZGV0aWNfU3lzdGVtI1dHUzg0XG4qIDYzNzEwMDguOCBpcyBvbmUgcHVibGlzaGVkIFwiYXZlcmFnZSByYWRpdXNcIiBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRWFydGhfcmFkaXVzI01lYW5fcmFkaXVzLCBvciBmdHA6Ly9hdGhlbmEuZnN2LmN2dXQuY3ovWkZHL2dyczgwLU1vcml0ei5wZGYgcC40XG4qL1xuZXhwb3J0IGNvbnN0IGVhcnRoUmFkaXVzID0gNjM3MTAwOC44O1xuXG4vKipcbiAqIEEgYExuZ0xhdGAgb2JqZWN0IHJlcHJlc2VudHMgYSBnaXZlbiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIGNvb3JkaW5hdGUsIG1lYXN1cmVkIGluIGRlZ3JlZXMuXG4gKiBUaGVzZSBjb29yZGluYXRlcyB1c2UgbG9uZ2l0dWRlLCBsYXRpdHVkZSBjb29yZGluYXRlIG9yZGVyIChhcyBvcHBvc2VkIHRvIGxhdGl0dWRlLCBsb25naXR1ZGUpXG4gKiB0byBtYXRjaCB0aGUgW0dlb0pTT04gc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM3OTQ2I3NlY3Rpb24tNCksXG4gKiB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBPR0M6Q1JTODQgY29vcmRpbmF0ZSByZWZlcmVuY2Ugc3lzdGVtLlxuICpcbiAqIE5vdGUgdGhhdCBhbnkgTWFwYm94IEdMIG1ldGhvZCB0aGF0IGFjY2VwdHMgYSBgTG5nTGF0YCBvYmplY3QgYXMgYW4gYXJndW1lbnQgb3Igb3B0aW9uXG4gKiBjYW4gYWxzbyBhY2NlcHQgYW4gYEFycmF5YCBvZiB0d28gbnVtYmVycyBhbmQgd2lsbCBwZXJmb3JtIGFuIGltcGxpY2l0IGNvbnZlcnNpb24uXG4gKiBUaGlzIGZsZXhpYmxlIHR5cGUgaXMgZG9jdW1lbnRlZCBhcyB7QGxpbmsgTG5nTGF0TGlrZX0uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxuZyBMb25naXR1ZGUsIG1lYXN1cmVkIGluIGRlZ3JlZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gbGF0IExhdGl0dWRlLCBtZWFzdXJlZCBpbiBkZWdyZWVzLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtMTIzLjk3NDksIDQwLjc3MzYpO1xuICogY29uc29sZS5sb2cobGwubG5nKTsgLy8gPSAtMTIzLjk3NDlcbiAqIEBzZWUgW0V4YW1wbGU6IEdldCBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tb3VzZS1wb3NpdGlvbi8pXG4gKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGEgcG9wdXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAvKVxuICogQHNlZSBbRXhhbXBsZTogSGlnaGxpZ2h0IGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91c2luZy1ib3gtcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcbiAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIHRpbWVsaW5lIGFuaW1hdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90aW1lbGluZS1hbmltYXRpb24vKVxuICovXG5jbGFzcyBMbmdMYXQge1xuICAgIGxuZzogbnVtYmVyO1xuICAgIGxhdDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IobG5nOiBudW1iZXIsIGxhdDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpc05hTihsbmcpIHx8IGlzTmFOKGxhdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBMbmdMYXQgb2JqZWN0OiAoJHtsbmd9LCAke2xhdH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sbmcgPSArbG5nO1xuICAgICAgICB0aGlzLmxhdCA9ICtsYXQ7XG4gICAgICAgIGlmICh0aGlzLmxhdCA+IDkwIHx8IHRoaXMubGF0IDwgLTkwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgTG5nTGF0IGxhdGl0dWRlIHZhbHVlOiBtdXN0IGJlIGJldHdlZW4gLTkwIGFuZCA5MCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBgTG5nTGF0YCBvYmplY3Qgd2hvc2UgbG9uZ2l0dWRlIGlzIHdyYXBwZWQgdG8gdGhlIHJhbmdlICgtMTgwLCAxODApLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIHdyYXBwZWQgYExuZ0xhdGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KDI4Ni4wMjUxLCA0MC43NzM2KTtcbiAgICAgKiBjb25zdCB3cmFwcGVkID0gbGwud3JhcCgpO1xuICAgICAqIGNvbnNvbGUubG9nKHdyYXBwZWQubG5nKTsgLy8gPSAtNzMuOTc0OVxuICAgICAqL1xuICAgIHdyYXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KHdyYXAodGhpcy5sbmcsIC0xODAsIDE4MCksIHRoaXMubGF0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBUaGUgY29vcmRpbmF0ZXMgcmVwcmVzZXRlZCBhcyBhbiBhcnJheSBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45NzQ5LCA0MC43NzM2KTtcbiAgICAgKiBsbC50b0FycmF5KCk7IC8vID0gWy03My45NzQ5LCA0MC43NzM2XVxuICAgICAqL1xuICAgIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5sbmcsIHRoaXMubGF0XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyByZXByZXNlbnQgYXMgYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29vcmRpbmF0ZXMgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcgb2YgdGhlIGZvcm1hdCBgJ0xuZ0xhdChsbmcsIGxhdCknYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTc0OSwgNDAuNzczNik7XG4gICAgICogbGwudG9TdHJpbmcoKTsgLy8gPSBcIkxuZ0xhdCgtNzMuOTc0OSwgNDAuNzczNilcIlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYExuZ0xhdCgke3RoaXMubG5nfSwgJHt0aGlzLmxhdH0pYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSBkaXN0YW5jZSBiZXR3ZWVuIGEgcGFpciBvZiBjb29yZGluYXRlcyBpbiBtZXRlcnMuXG4gICAgICogVXNlcyB0aGUgSGF2ZXJzaW5lIEZvcm11bGEgKGZyb20gUi5XLiBTaW5ub3R0LCBcIlZpcnR1ZXMgb2YgdGhlIEhhdmVyc2luZVwiLCBTa3kgYW5kIFRlbGVzY29wZSwgdm9sLiA2OCwgbm8uIDIsIDE5ODQsIHAuIDE1OSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nTGF0IENvb3JkaW5hdGVzIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IERpc3RhbmNlIGluIG1ldGVycyBiZXR3ZWVuIHRoZSB0d28gY29vcmRpbmF0ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBuZXdZb3JrID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzQuMDA2MCwgNDAuNzEyOCk7XG4gICAgICogY29uc3QgbG9zQW5nZWxlcyA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTExOC4yNDM3LCAzNC4wNTIyKTtcbiAgICAgKiBuZXdZb3JrLmRpc3RhbmNlVG8obG9zQW5nZWxlcyk7IC8vID0gMzkzNTc1MS42OTA4OTM5ODcsIFwidHJ1ZSBkaXN0YW5jZVwiIHVzaW5nIGEgbm9uLXNwaGVyaWNhbCBhcHByb3hpbWF0aW9uIGlzIH4zOTY2a21cbiAgICAgKi9cbiAgICBkaXN0YW5jZVRvKGxuZ0xhdDogTG5nTGF0KSB7XG4gICAgICAgIGNvbnN0IHJhZCA9IE1hdGguUEkgLyAxODA7XG4gICAgICAgIGNvbnN0IGxhdDEgPSB0aGlzLmxhdCAqIHJhZDtcbiAgICAgICAgY29uc3QgbGF0MiA9IGxuZ0xhdC5sYXQgKiByYWQ7XG4gICAgICAgIGNvbnN0IGEgPSBNYXRoLnNpbihsYXQxKSAqIE1hdGguc2luKGxhdDIpICsgTWF0aC5jb3MobGF0MSkgKiBNYXRoLmNvcyhsYXQyKSAqIE1hdGguY29zKChsbmdMYXQubG5nIC0gdGhpcy5sbmcpICogcmFkKTtcblxuICAgICAgICBjb25zdCBtYXhNZXRlcnMgPSBlYXJ0aFJhZGl1cyAqIE1hdGguYWNvcyhNYXRoLm1pbihhLCAxKSk7XG4gICAgICAgIHJldHVybiBtYXhNZXRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGBMbmdMYXRCb3VuZHNgIGZyb20gdGhlIGNvb3JkaW5hdGVzIGV4dGVuZGVkIGJ5IGEgZ2l2ZW4gYHJhZGl1c2AuIFRoZSByZXR1cm5lZCBgTG5nTGF0Qm91bmRzYCBjb21wbGV0ZWx5IGNvbnRhaW5zIHRoZSBgcmFkaXVzYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXVzPTBdIERpc3RhbmNlIGluIG1ldGVycyBmcm9tIHRoZSBjb29yZGluYXRlcyB0byBleHRlbmQgdGhlIGJvdW5kcy5cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBBIG5ldyBgTG5nTGF0Qm91bmRzYCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb29yZGluYXRlcyBleHRlbmRlZCBieSB0aGUgYHJhZGl1c2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk3NDksIDQwLjc3MzYpO1xuICAgICAqIGxsLnRvQm91bmRzKDEwMCkudG9BcnJheSgpOyAvLyA9IFtbLTczLjk3NTAxODYyMTQxMzI4LCA0MC43NzM1MTAxNjg0NzIyOV0sIFstNzMuOTc0NzgxMzc4NTg2NzMsIDQwLjc3MzY4OTgzMTUyNzcxXV1cbiAgICAgKi9cbiAgICB0b0JvdW5kcyhyYWRpdXM/OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGNvbnN0IGVhcnRoQ2lyY3VtZmVyZW5jZUluTWV0ZXJzQXRFcXVhdG9yID0gNDAwNzUwMTc7XG4gICAgICAgIGNvbnN0IGxhdEFjY3VyYWN5ID0gMzYwICogcmFkaXVzIC8gZWFydGhDaXJjdW1mZXJlbmNlSW5NZXRlcnNBdEVxdWF0b3IsXG4gICAgICAgICAgICBsbmdBY2N1cmFjeSA9IGxhdEFjY3VyYWN5IC8gTWF0aC5jb3MoKE1hdGguUEkgLyAxODApICogdGhpcy5sYXQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0Qm91bmRzKG5ldyBMbmdMYXQodGhpcy5sbmcgLSBsbmdBY2N1cmFjeSwgdGhpcy5sYXQgLSBsYXRBY2N1cmFjeSksXG4gICAgICAgICAgICBuZXcgTG5nTGF0KHRoaXMubG5nICsgbG5nQWNjdXJhY3ksIHRoaXMubGF0ICsgbGF0QWNjdXJhY3kpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbiBhcnJheSBvZiB0d28gbnVtYmVycyBvciBhbiBvYmplY3Qgd2l0aCBgbG5nYCBhbmQgYGxhdGAgb3IgYGxvbmAgYW5kIGBsYXRgIHByb3BlcnRpZXNcbiAgICAgKiB0byBhIGBMbmdMYXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIElmIGEgYExuZ0xhdGAgb2JqZWN0IGlzIHBhc3NlZCBpbiwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXQgdW5jaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBpbnB1dCBBbiBhcnJheSBvZiB0d28gbnVtYmVycyBvciBvYmplY3QgdG8gY29udmVydCwgb3IgYSBgTG5nTGF0YCBvYmplY3QgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IEEgbmV3IGBMbmdMYXRgIG9iamVjdCwgaWYgYSBjb252ZXJzaW9uIG9jY3VycmVkLCBvciB0aGUgb3JpZ2luYWwgYExuZ0xhdGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgYXJyID0gWy03My45NzQ5LCA0MC43NzM2XTtcbiAgICAgKiBjb25zdCBsbCA9IG1hcGJveGdsLkxuZ0xhdC5jb252ZXJ0KGFycik7XG4gICAgICogY29uc29sZS5sb2cobGwpOyAgIC8vID0gTG5nTGF0IHtsbmc6IC03My45NzQ5LCBsYXQ6IDQwLjc3MzZ9XG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnQoaW5wdXQ6IExuZ0xhdExpa2UpOiBMbmdMYXQge1xuICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBMbmdMYXQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkgJiYgKGlucHV0Lmxlbmd0aCA9PT0gMiB8fCBpbnB1dC5sZW5ndGggPT09IDMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChOdW1iZXIoaW5wdXRbMF0pLCBOdW1iZXIoaW5wdXRbMV0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpICYmIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgaW5wdXQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTG5nTGF0KFxuICAgICAgICAgICAgICAgIC8vIGZsb3cgY2FuJ3QgcmVmaW5lIHRoaXMgdG8gaGF2ZSBvbmUgb2YgbG5nIG9yIGxhdCwgc28gd2UgaGF2ZSB0byBjYXN0IHRvIGFueVxuICAgICAgICAgICAgICAgIE51bWJlcignbG5nJyBpbiBpbnB1dCA/IChpbnB1dDogYW55KS5sbmcgOiAoaW5wdXQ6IGFueSkubG9uKSxcbiAgICAgICAgICAgICAgICBOdW1iZXIoaW5wdXQubGF0KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgTG5nTGF0TGlrZWAgYXJndW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBMbmdMYXQgaW5zdGFuY2UsIGFuIG9iamVjdCB7bG5nOiA8bG5nPiwgbGF0OiA8bGF0Pn0sIGFuIG9iamVjdCB7bG9uOiA8bG5nPiwgbGF0OiA8bGF0Pn0sIG9yIGFuIGFycmF5IG9mIFs8bG5nPiwgPGxhdD5dXCIpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIHtAbGluayBMbmdMYXR9IG9iamVjdCwgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnMgcmVwcmVzZW50aW5nIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUsXG4gKiBvciBhbiBvYmplY3Qgd2l0aCBgbG5nYCBhbmQgYGxhdGAgb3IgYGxvbmAgYW5kIGBsYXRgIHByb3BlcnRpZXMuXG4gKlxuICogQHR5cGVkZWYge0xuZ0xhdCB8IHtsbmc6IG51bWJlciwgbGF0OiBudW1iZXJ9IHwge2xvbjogbnVtYmVyLCBsYXQ6IG51bWJlcn0gfCBbbnVtYmVyLCBudW1iZXJdfSBMbmdMYXRMaWtlXG4gKiBAZXhhbXBsZVxuICogY29uc3QgdjEgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC0xMjIuNDIwNjc5LCAzNy43NzI1MzcpO1xuICogY29uc3QgdjIgPSBbLTEyMi40MjA2NzksIDM3Ljc3MjUzN107XG4gKiBjb25zdCB2MyA9IHtsb246IC0xMjIuNDIwNjc5LCBsYXQ6IDM3Ljc3MjUzN307XG4gKi9cbmV4cG9ydCB0eXBlIExuZ0xhdExpa2UgPSBMbmdMYXQgfCB7bG5nOiBudW1iZXIsIGxhdDogbnVtYmVyfSB8IHtsb246IG51bWJlciwgbGF0OiBudW1iZXJ9IHwgW251bWJlciwgbnVtYmVyXTtcblxuZXhwb3J0IGRlZmF1bHQgTG5nTGF0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IExuZ0xhdCwge2VhcnRoUmFkaXVzfSBmcm9tICcuLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSAnLi4vZ2VvL2xuZ19sYXQuanMnO1xuXG4vKlxuICogVGhlIGF2ZXJhZ2UgY2lyY3VtZmVyZW5jZSBvZiB0aGUgd29ybGQgaW4gbWV0ZXJzLlxuICovXG5jb25zdCBlYXJ0aENpcmN1bWZlcmVuY2UgPSAyICogTWF0aC5QSSAqIGVhcnRoUmFkaXVzOyAvLyBtZXRlcnNcblxuLypcbiAqIFRoZSBjaXJjdW1mZXJlbmNlIGF0IGEgbGluZSBvZiBsYXRpdHVkZSBpbiBtZXRlcnMuXG4gKi9cbmZ1bmN0aW9uIGNpcmN1bWZlcmVuY2VBdExhdGl0dWRlKGxhdGl0dWRlOiBudW1iZXIpIHtcbiAgICByZXR1cm4gZWFydGhDaXJjdW1mZXJlbmNlICogTWF0aC5jb3MobGF0aXR1ZGUgKiBNYXRoLlBJIC8gMTgwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmNhdG9yWGZyb21MbmcobG5nOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKDE4MCArIGxuZykgLyAzNjA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJjYXRvcllmcm9tTGF0KGxhdDogbnVtYmVyKSB7XG4gICAgcmV0dXJuICgxODAgLSAoMTgwIC8gTWF0aC5QSSAqIE1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkgLyA0ICsgbGF0ICogTWF0aC5QSSAvIDM2MCkpKSkgLyAzNjA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoYWx0aXR1ZGU6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYWx0aXR1ZGUgLyBjaXJjdW1mZXJlbmNlQXRMYXRpdHVkZShsYXQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG5nRnJvbU1lcmNhdG9yWCh4OiBudW1iZXIpIHtcbiAgICByZXR1cm4geCAqIDM2MCAtIDE4MDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhdEZyb21NZXJjYXRvclkoeTogbnVtYmVyKSB7XG4gICAgY29uc3QgeTIgPSAxODAgLSB5ICogMzYwO1xuICAgIHJldHVybiAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbHRpdHVkZUZyb21NZXJjYXRvclooejogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICByZXR1cm4geiAqIGNpcmN1bWZlcmVuY2VBdExhdGl0dWRlKGxhdEZyb21NZXJjYXRvclkoeSkpO1xufVxuXG5leHBvcnQgY29uc3QgTUFYX01FUkNBVE9SX0xBVElUVURFID0gODUuMDUxMTI5O1xuXG4vKipcbiAqIERldGVybWluZSB0aGUgTWVyY2F0b3Igc2NhbGUgZmFjdG9yIGZvciBhIGdpdmVuIGxhdGl0dWRlLCBzZWVcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01lcmNhdG9yX3Byb2plY3Rpb24jU2NhbGVfZmFjdG9yXG4gKlxuICogQXQgdGhlIGVxdWF0b3IgdGhlIHNjYWxlIGZhY3RvciB3aWxsIGJlIDEsIHdoaWNoIGluY3JlYXNlcyBhdCBoaWdoZXIgbGF0aXR1ZGVzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsYXQgTGF0aXR1ZGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHNjYWxlIGZhY3RvclxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmNhdG9yU2NhbGUobGF0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gMSAvIE1hdGguY29zKGxhdCAqIE1hdGguUEkgLyAxODApO1xufVxuXG4vKipcbiAqIEEgYE1lcmNhdG9yQ29vcmRpbmF0ZWAgb2JqZWN0IHJlcHJlc2VudHMgYSBwcm9qZWN0ZWQgdGhyZWUgZGltZW5zaW9uYWwgcG9zaXRpb24uXG4gKlxuICogYE1lcmNhdG9yQ29vcmRpbmF0ZWAgdXNlcyB0aGUgd2ViIG1lcmNhdG9yIHByb2plY3Rpb24gKFtFUFNHOjM4NTddKGh0dHBzOi8vZXBzZy5pby8zODU3KSkgd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgdW5pdHM6XG4gKiAtIHRoZSBzaXplIG9mIDEgdW5pdCBpcyB0aGUgd2lkdGggb2YgdGhlIHByb2plY3RlZCB3b3JsZCBpbnN0ZWFkIG9mIHRoZSBcIm1lcmNhdG9yIG1ldGVyXCJcbiAqIC0gdGhlIG9yaWdpbiBvZiB0aGUgY29vcmRpbmF0ZSBzcGFjZSBpcyBhdCB0aGUgbm9ydGgtd2VzdCBjb3JuZXIgaW5zdGVhZCBvZiB0aGUgbWlkZGxlLlxuICpcbiAqIEZvciBleGFtcGxlLCBgTWVyY2F0b3JDb29yZGluYXRlKDAsIDAsIDApYCBpcyB0aGUgbm9ydGgtd2VzdCBjb3JuZXIgb2YgdGhlIG1lcmNhdG9yIHdvcmxkIGFuZFxuICogYE1lcmNhdG9yQ29vcmRpbmF0ZSgxLCAxLCAwKWAgaXMgdGhlIHNvdXRoLWVhc3QgY29ybmVyLiBJZiB5b3UgYXJlIGZhbWlsaWFyIHdpdGhcbiAqIFt2ZWN0b3IgdGlsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvdmVjdG9yLXRpbGUtc3BlYykgaXQgbWF5IGJlIGhlbHBmdWwgdG8gdGhpbmtcbiAqIG9mIHRoZSBjb29yZGluYXRlIHNwYWNlIGFzIHRoZSBgMC8wLzBgIHRpbGUgd2l0aCBhbiBleHRlbnQgb2YgYDFgLlxuICpcbiAqIFRoZSBgemAgZGltZW5zaW9uIG9mIGBNZXJjYXRvckNvb3JkaW5hdGVgIGlzIGNvbmZvcm1hbC4gQSBjdWJlIGluIHRoZSBtZXJjYXRvciBjb29yZGluYXRlIHNwYWNlIHdvdWxkIGJlIHJlbmRlcmVkIGFzIGEgY3ViZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeCBjb21wb25lbnQgb2YgdGhlIHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHkgY29tcG9uZW50IG9mIHRoZSBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSB6IFRoZSB6IGNvbXBvbmVudCBvZiB0aGUgcG9zaXRpb24uXG4gKiBAZXhhbXBsZVxuICogY29uc3QgbnVsbElzbGFuZCA9IG5ldyBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUoMC41LCAwLjUsIDApO1xuICpcbiAqIEBzZWUgW0V4YW1wbGU6IEFkZCBhIGN1c3RvbSBzdHlsZSBsYXllcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jdXN0b20tc3R5bGUtbGF5ZXIvKVxuICovXG5jbGFzcyBNZXJjYXRvckNvb3JkaW5hdGUge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgejogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciA9IDApIHtcbiAgICAgICAgdGhpcy54ID0gK3g7XG4gICAgICAgIHRoaXMueSA9ICt5O1xuICAgICAgICB0aGlzLnogPSArejtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9qZWN0IGEgYExuZ0xhdGAgdG8gYSBgTWVyY2F0b3JDb29yZGluYXRlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbG5nTGF0TGlrZSBUaGUgbG9jYXRpb24gdG8gcHJvamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWx0aXR1ZGUgVGhlIGFsdGl0dWRlIGluIG1ldGVycyBvZiB0aGUgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge01lcmNhdG9yQ29vcmRpbmF0ZX0gVGhlIHByb2plY3RlZCBtZXJjYXRvciBjb29yZGluYXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgY29vcmQgPSBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdCh7bG5nOiAwLCBsYXQ6IDB9LCAwKTtcbiAgICAgKiBjb25zb2xlLmxvZyhjb29yZCk7IC8vIE1lcmNhdG9yQ29vcmRpbmF0ZSgwLjUsIDAuNSwgMClcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUxuZ0xhdChsbmdMYXRMaWtlOiBMbmdMYXRMaWtlLCBhbHRpdHVkZTogbnVtYmVyID0gMCkge1xuICAgICAgICBjb25zdCBsbmdMYXQgPSBMbmdMYXQuY29udmVydChsbmdMYXRMaWtlKTtcblxuICAgICAgICByZXR1cm4gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShcbiAgICAgICAgICAgICAgICBtZXJjYXRvclhmcm9tTG5nKGxuZ0xhdC5sbmcpLFxuICAgICAgICAgICAgICAgIG1lcmNhdG9yWWZyb21MYXQobG5nTGF0LmxhdCksXG4gICAgICAgICAgICAgICAgbWVyY2F0b3JaZnJvbUFsdGl0dWRlKGFsdGl0dWRlLCBsbmdMYXQubGF0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYExuZ0xhdGAgZm9yIHRoZSBjb29yZGluYXRlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIGBMbmdMYXRgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNvb3JkID0gbmV3IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZSgwLjUsIDAuNSwgMCk7XG4gICAgICogY29uc3QgbG5nTGF0ID0gY29vcmQudG9MbmdMYXQoKTsgLy8gTG5nTGF0KDAsIDApXG4gICAgICovXG4gICAgdG9MbmdMYXQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KFxuICAgICAgICAgICAgICAgIGxuZ0Zyb21NZXJjYXRvclgodGhpcy54KSxcbiAgICAgICAgICAgICAgICBsYXRGcm9tTWVyY2F0b3JZKHRoaXMueSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGFsdGl0dWRlIGluIG1ldGVycyBvZiB0aGUgY29vcmRpbmF0ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBhbHRpdHVkZSBpbiBtZXRlcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBjb29yZCA9IG5ldyBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUoMCwgMCwgMC4wMik7XG4gICAgICogY29vcmQudG9BbHRpdHVkZSgpOyAvLyA2OTE0LjI4MTk1NjI5NTMzOVxuICAgICAqL1xuICAgIHRvQWx0aXR1ZGUoKSB7XG4gICAgICAgIHJldHVybiBhbHRpdHVkZUZyb21NZXJjYXRvcloodGhpcy56LCB0aGlzLnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIG9mIDEgbWV0ZXIgaW4gYE1lcmNhdG9yQ29vcmRpbmF0ZWAgdW5pdHMgYXQgdGhpcyBsYXRpdHVkZS5cbiAgICAgKlxuICAgICAqIEZvciBjb29yZGluYXRlcyBpbiByZWFsIHdvcmxkIHVuaXRzIHVzaW5nIG1ldGVycywgdGhpcyBuYXR1cmFsbHkgcHJvdmlkZXMgdGhlIHNjYWxlXG4gICAgICogdG8gdHJhbnNmb3JtIGludG8gYE1lcmNhdG9yQ29vcmRpbmF0ZWBzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gRGlzdGFuY2Ugb2YgMSBtZXRlciBpbiBgTWVyY2F0b3JDb29yZGluYXRlYCB1bml0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIENhbGN1bGF0ZSBhIG5ldyBNZXJjYXRvckNvb3JkaW5hdGUgdGhhdCBpcyAxNTAgbWV0ZXJzIHdlc3Qgb2YgdGhlIG90aGVyIGNvb3JkLlxuICAgICAqIGNvbnN0IGNvb3JkID0gbmV3IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZSgwLjUsIDAuMjUsIDApO1xuICAgICAqIGNvbnN0IG9mZnNldEluTWV0ZXJzID0gMTUwO1xuICAgICAqIGNvbnN0IG9mZnNldEluTWVyY2F0b3JDb29yZGluYXRlVW5pdHMgPSBvZmZzZXRJbk1ldGVycyAqIGNvb3JkLm1ldGVySW5NZXJjYXRvckNvb3JkaW5hdGVVbml0cygpO1xuICAgICAqIGNvbnN0IHdlc3RDb29yZCA9IG5ldyBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUoY29vcmQueCAtIG9mZnNldEluTWVyY2F0b3JDb29yZGluYXRlVW5pdHMsIGNvb3JkLnksIGNvb3JkLnopO1xuICAgICAqL1xuICAgIG1ldGVySW5NZXJjYXRvckNvb3JkaW5hdGVVbml0cygpIHtcbiAgICAgICAgLy8gMSBtZXRlciAvIGNpcmN1bWZlcmVuY2UgYXQgZXF1YXRvciBpbiBtZXRlcnMgKiBNZXJjYXRvciBwcm9qZWN0aW9uIHNjYWxlIGZhY3RvciBhdCB0aGlzIGxhdGl0dWRlXG4gICAgICAgIHJldHVybiAxIC8gZWFydGhDaXJjdW1mZXJlbmNlICogbWVyY2F0b3JTY2FsZShsYXRGcm9tTWVyY2F0b3JZKHRoaXMueSkpO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBNZXJjYXRvckNvb3JkaW5hdGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmZ1bmN0aW9uIHBvaW50VG9MaW5lRGlzdChweCwgcHksIGF4LCBheSwgYngsIGJ5KSB7XG4gICAgY29uc3QgZHggPSBheCAtIGJ4O1xuICAgIGNvbnN0IGR5ID0gYXkgLSBieTtcbiAgICByZXR1cm4gTWF0aC5hYnMoKGF5IC0gcHkpICogZHggLSAoYXggLSBweCkgKiBkeSkgLyBNYXRoLmh5cG90KGR4LCBkeSk7XG59XG5cbmZ1bmN0aW9uIGFkZFJlc2FtcGxlZChyZXNhbXBsZWQsIG14MCwgbXkwLCBteDIsIG15Miwgc3RhcnQsIGVuZCwgcmVwcm9qZWN0LCB0b2xlcmFuY2UpIHtcbiAgICBjb25zdCBteDEgPSAobXgwICsgbXgyKSAvIDI7XG4gICAgY29uc3QgbXkxID0gKG15MCArIG15MikgLyAyO1xuICAgIGNvbnN0IG1pZCA9IG5ldyBQb2ludChteDEsIG15MSk7XG4gICAgcmVwcm9qZWN0KG1pZCk7XG4gICAgY29uc3QgZXJyID0gcG9pbnRUb0xpbmVEaXN0KG1pZC54LCBtaWQueSwgc3RhcnQueCwgc3RhcnQueSwgZW5kLngsIGVuZC55KTtcblxuICAgIC8vIGlmIHJlcHJvamVjdGVkIG1pZFBvaW50IGlzIHRvbyBmYXIgZnJvbSBnZW9tZXRyaWMgbWlkcG9pbnQsIHJlY3Vyc2UgaW50byB0d28gaGFsdmVzXG4gICAgaWYgKGVyciA+PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgLy8gd2UncmUgdmVyeSB1bmxpa2VseSB0byBoaXQgbWF4IGNhbGwgc3RhY2sgZXhjZWVkZWQgaGVyZSxcbiAgICAgICAgLy8gYnV0IHdlIG1pZ2h0IHdhbnQgdG8gc2FmZWd1YXJkIGFnYWluc3QgaXQgaW4gdGhlIGZ1dHVyZVxuICAgICAgICBhZGRSZXNhbXBsZWQocmVzYW1wbGVkLCBteDAsIG15MCwgbXgxLCBteTEsIHN0YXJ0LCBtaWQsIHJlcHJvamVjdCwgdG9sZXJhbmNlKTtcbiAgICAgICAgYWRkUmVzYW1wbGVkKHJlc2FtcGxlZCwgbXgxLCBteTEsIG14MiwgbXkyLCBtaWQsIGVuZCwgcmVwcm9qZWN0LCB0b2xlcmFuY2UpO1xuXG4gICAgfSBlbHNlIHsgLy8gb3RoZXJ3aXNlLCBqdXN0IGFkZCB0aGUgcG9pbnRcbiAgICAgICAgcmVzYW1wbGVkLnB1c2goZW5kKTtcbiAgICB9XG59XG5cbi8vIHJlcHJvamVjdCBhbmQgcmVzYW1wbGUgYSBsaW5lLCBhZGRpbmcgcG9pbnQgd2hlcmUgbmVjZXNzYXJ5IGZvciBsaW5lcyB0aGF0IGJlY29tZSBjdXJ2ZXM7XG4vLyBub3RlIHRoYXQgdGhpcyBvcGVyYXRpb24gaXMgbXV0YWJsZSAobW9kaWZ5aW5nIG9yaWdpbmFsIHBvaW50cykgZm9yIHBlcmZvcm1hbmNlXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXNhbXBsZShsaW5lOiBBcnJheTxQb2ludD4sIHJlcHJvamVjdDogKFBvaW50KSA9PiBQb2ludCwgdG9sZXJhbmNlOiBudW1iZXIpOiBBcnJheTxQb2ludD4ge1xuICAgIGNvbnN0IHJlc2FtcGxlZCA9IFtdO1xuICAgIGxldCBteDAsIG15MCwgcHJldjtcblxuICAgIGZvciAoY29uc3QgcG9pbnQgb2YgbGluZSkge1xuICAgICAgICBjb25zdCB7eCwgeX0gPSBwb2ludDtcbiAgICAgICAgcmVwcm9qZWN0KHBvaW50KTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgYWRkUmVzYW1wbGVkKHJlc2FtcGxlZCwgbXgwLCBteTAsIHgsIHksIHByZXYsIHBvaW50LCByZXByb2plY3QsIHRvbGVyYW5jZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNhbXBsZWQucHVzaChwb2ludCk7XG4gICAgICAgIH1cblxuICAgICAgICBteDAgPSB4O1xuICAgICAgICBteTAgPSB5O1xuICAgICAgICBwcmV2ID0gcG9pbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc2FtcGxlZDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7d2Fybk9uY2UsIGNsYW1wfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuXG5pbXBvcnQgRVhURU5UIGZyb20gJy4vZXh0ZW50LmpzJztcbmltcG9ydCB7bG5nRnJvbU1lcmNhdG9yWCwgbGF0RnJvbU1lcmNhdG9yWX0gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHJlc2FtcGxlIGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3Jlc2FtcGxlLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVUcmFuc2Zvcm19IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcblxuLy8gVGhlc2UgYm91bmRzIGRlZmluZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBzdXBwb3J0ZWQgY29vcmRpbmF0ZSB2YWx1ZXMuXG4vLyBXaGlsZSB2aXNpYmxlIGNvb3JkaW5hdGVzIGFyZSB3aXRoaW4gWzAsIEVYVEVOVF0sIHRpbGVzIG1heSB0aGVvcmV0aWNhbGx5XG4vLyBjb250YWluIGNvb3JkaW5hdGVzIHdpdGhpbiBbLUluZmluaXR5LCBJbmZpbml0eV0uIE91ciByYW5nZSBpcyBsaW1pdGVkIGJ5IHRoZVxuLy8gbnVtYmVyIG9mIGJpdHMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvb3JkaW5hdGUuXG5jb25zdCBCSVRTID0gMTU7XG5jb25zdCBNQVggPSBNYXRoLnBvdygyLCBCSVRTIC0gMSkgLSAxO1xuY29uc3QgTUlOID0gLU1BWCAtIDE7XG5cbmZ1bmN0aW9uIHByZXBhcmVQb2ludChwb2ludDogUG9pbnQsIHNjYWxlOiBudW1iZXIpIHtcbiAgICBjb25zdCB4ID0gTWF0aC5yb3VuZChwb2ludC54ICogc2NhbGUpO1xuICAgIGNvbnN0IHkgPSBNYXRoLnJvdW5kKHBvaW50LnkgKiBzY2FsZSk7XG4gICAgcG9pbnQueCA9IGNsYW1wKHgsIE1JTiwgTUFYKTtcbiAgICBwb2ludC55ID0gY2xhbXAoeSwgTUlOLCBNQVgpO1xuICAgIGlmICh4IDwgcG9pbnQueCB8fCB4ID4gcG9pbnQueCArIDEgfHwgeSA8IHBvaW50LnkgfHwgeSA+IHBvaW50LnkgKyAxKSB7XG4gICAgICAgIC8vIHdhcm4gd2hlbiBleGNlZWRpbmcgYWxsb3dlZCBleHRlbnQgZXhjZXB0IGZvciB0aGUgMS1weC1vZmYgY2FzZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvODk5MlxuICAgICAgICB3YXJuT25jZSgnR2VvbWV0cnkgZXhjZWVkcyBhbGxvd2VkIGV4dGVudCwgcmVkdWNlIHlvdXIgdmVjdG9yIHRpbGUgYnVmZmVyIHNpemUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50O1xufVxuXG4vLyBhIHN1YnNldCBvZiBWZWN0b3JUaWxlR2VvbWV0cnlcbnR5cGUgRmVhdHVyZVdpdGhHZW9tZXRyeSA9IHtcbiAgICBleHRlbnQ6IG51bWJlcjtcbiAgICB0eXBlOiAxIHwgMiB8IDM7XG4gICAgbG9hZEdlb21ldHJ5KCk6IEFycmF5PEFycmF5PFBvaW50Pj47XG59XG5cbi8qKlxuICogTG9hZHMgYSBnZW9tZXRyeSBmcm9tIGEgVmVjdG9yVGlsZUZlYXR1cmUgYW5kIHNjYWxlcyBpdCB0byB0aGUgY29tbW9uIGV4dGVudFxuICogdXNlZCBpbnRlcm5hbGx5LlxuICogQHBhcmFtIHtWZWN0b3JUaWxlRmVhdHVyZX0gZmVhdHVyZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbG9hZEdlb21ldHJ5KGZlYXR1cmU6IEZlYXR1cmVXaXRoR2VvbWV0cnksIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgdGlsZVRyYW5zZm9ybT86IFRpbGVUcmFuc2Zvcm0pOiBBcnJheTxBcnJheTxQb2ludD4+IHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IGZlYXR1cmUubG9hZEdlb21ldHJ5KCk7XG4gICAgY29uc3QgZXh0ZW50ID0gZmVhdHVyZS5leHRlbnQ7XG4gICAgY29uc3QgZXh0ZW50U2NhbGUgPSBFWFRFTlQgLyBleHRlbnQ7XG5cbiAgICBpZiAoY2Fub25pY2FsICYmIHRpbGVUcmFuc2Zvcm0gJiYgdGlsZVRyYW5zZm9ybS5wcm9qZWN0aW9uLmlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZSkge1xuICAgICAgICBjb25zdCB6MiA9IDEgPDwgY2Fub25pY2FsLno7XG4gICAgICAgIGNvbnN0IHtzY2FsZSwgeCwgeSwgcHJvamVjdGlvbn0gPSB0aWxlVHJhbnNmb3JtO1xuXG4gICAgICAgIGNvbnN0IHJlcHJvamVjdCA9IChwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsbmcgPSBsbmdGcm9tTWVyY2F0b3JYKChjYW5vbmljYWwueCArIHAueCAvIGV4dGVudCkgLyB6Mik7XG4gICAgICAgICAgICBjb25zdCBsYXQgPSBsYXRGcm9tTWVyY2F0b3JZKChjYW5vbmljYWwueSArIHAueSAvIGV4dGVudCkgLyB6Mik7XG4gICAgICAgICAgICBjb25zdCBwMiA9IHByb2plY3Rpb24ucHJvamVjdChsbmcsIGxhdCk7XG4gICAgICAgICAgICBwLnggPSAocDIueCAqIHNjYWxlIC0geCkgKiBleHRlbnQ7XG4gICAgICAgICAgICBwLnkgPSAocDIueSAqIHNjYWxlIC0geSkgKiBleHRlbnQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnZW9tZXRyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUudHlwZSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5W2ldID0gcmVzYW1wbGUoZ2VvbWV0cnlbaV0sIHJlcHJvamVjdCwgMSk7IC8vIHJlc2FtcGxlIGxpbmVzIGFuZCBwb2x5Z29uc1xuXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBwb2ludHNcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIGdlb21ldHJ5W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgcG9pbnQgZmVhdHVyZXMgb3V0c2lkZSB0aWxlIGJvdW5kYXJpZXMgbm93OyBpdCdkIGJlIGhhcmRlciB0byBkbyBsYXRlclxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBjb29yZHMgYXJlIHJlcHJvamVjdGVkIGFuZCBubyBsb25nZXIgYXhpcy1hbGlnbmVkOyBpZGVhbGx5IHRoaXMgd291bGQgaGFwcGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdCBkZXBlbmRpbmcgb24gaG93IHRoZSBnZW9tZXRyeSBpcyB1c2VkLCBidXQgd2UgZm9yZWdvIHRoZSBjb21wbGV4aXR5IGZvciBub3dcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAueCA8IDAgfHwgcC54ID49IGV4dGVudCB8fCBwLnkgPCAwIHx8IHAueSA+PSBleHRlbnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICByZXByb2plY3QocCk7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUucHVzaChwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnlbaV0gPSBsaW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBsaW5lKSB7XG4gICAgICAgICAgICBwcmVwYXJlUG9pbnQocCwgZXh0ZW50U2NhbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGdlb21ldHJ5O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuL2xvYWRfZ2VvbWV0cnkuanMnO1xuXG50eXBlIEV2YWx1YXRpb25GZWF0dXJlID0ge1xuICAgICt0eXBlOiAxIHwgMiB8IDMgfCAnVW5rbm93bicgfCAnUG9pbnQnIHwgJ011bHRpUG9pbnQnIHwgJ0xpbmVTdHJpbmcnIHwgJ011bHRpTGluZVN0cmluZycgfCAnUG9seWdvbicgfCAnTXVsdGlQb2x5Z29uJyxcbiAgICAraWQ/OiBhbnksXG4gICAgK3Byb3BlcnRpZXM6IHtbXzogc3RyaW5nXTogYW55fSxcbiAgICArcGF0dGVybnM/OiB7W186IHN0cmluZ106IHtcIm1pblwiOiBzdHJpbmcsIFwibWlkXCI6IHN0cmluZywgXCJtYXhcIjogc3RyaW5nfX0sXG4gICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj5cbn07XG5cbi8qKlxuICogQ29uc3RydWN0IGEgbmV3IGZlYXR1cmUgYmFzZWQgb24gYSBWZWN0b3JUaWxlRmVhdHVyZSBmb3IgZXhwcmVzc2lvbiBldmFsdWF0aW9uLCB0aGUgZ2VvbWV0cnkgb2Ygd2hpY2hcbiAqIHdpbGwgYmUgbG9hZGVkIGJhc2VkIG9uIG5lY2Vzc2l0eS5cbiAqIEBwYXJhbSB7VmVjdG9yVGlsZUZlYXR1cmV9IGZlYXR1cmVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbmVlZEdlb21ldHJ5XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b0V2YWx1YXRpb25GZWF0dXJlKGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLCBuZWVkR2VvbWV0cnk6IGJvb2xlYW4pOiBFdmFsdWF0aW9uRmVhdHVyZSB7XG4gICAgcmV0dXJuIHt0eXBlOiBmZWF0dXJlLnR5cGUsXG4gICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICBwcm9wZXJ0aWVzOmZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgZ2VvbWV0cnk6IG5lZWRHZW9tZXRyeSA/IGxvYWRHZW9tZXRyeShmZWF0dXJlKSA6IFtdfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Q2lyY2xlTGF5b3V0QXJyYXl9IGZyb20gJy4uL2FycmF5X3R5cGVzLmpzJztcblxuaW1wb3J0IHttZW1iZXJzIGFzIGxheW91dEF0dHJpYnV0ZXN9IGZyb20gJy4vY2lyY2xlX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vc2VnbWVudC5qcyc7XG5pbXBvcnQge1Byb2dyYW1Db25maWd1cmF0aW9uU2V0fSBmcm9tICcuLi9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHtUcmlhbmdsZUluZGV4QXJyYXl9IGZyb20gJy4uL2luZGV4X2FycmF5X3R5cGUuanMnO1xuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuLi9sb2FkX2dlb21ldHJ5LmpzJztcbmltcG9ydCB0b0V2YWx1YXRpb25GZWF0dXJlIGZyb20gJy4uL2V2YWx1YXRpb25fZmVhdHVyZS5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2V4dGVudC5qcyc7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5cbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgICBCdWNrZXQsXG4gICAgQnVja2V0UGFyYW1ldGVycyxcbiAgICBCdWNrZXRGZWF0dXJlLFxuICAgIEluZGV4ZWRGZWF0dXJlLFxuICAgIFBvcHVsYXRlUGFyYW1ldGVyc1xufSBmcm9tICcuLi9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUgQ2lyY2xlU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9jaXJjbGVfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgSGVhdG1hcFN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvaGVhdG1hcF9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvaW5kZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZXN9IGZyb20gJy4uLy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUuanMnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uLy4uL3JlbmRlci9pbWFnZV9hdGxhcy5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZVRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuXG5mdW5jdGlvbiBhZGRDaXJjbGVWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIHgsIHksIGV4dHJ1ZGVYLCBleHRydWRlWSkge1xuICAgIGxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAoeCAqIDIpICsgKChleHRydWRlWCArIDEpIC8gMiksXG4gICAgICAgICh5ICogMikgKyAoKGV4dHJ1ZGVZICsgMSkgLyAyKSk7XG59XG5cbi8qKlxuICogQ2lyY2xlcyBhcmUgcmVwcmVzZW50ZWQgYnkgdHdvIHRyaWFuZ2xlcy5cbiAqXG4gKiBFYWNoIGNvcm5lciBoYXMgYSBwb3MgdGhhdCBpcyB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUgYW5kIGFuIGV4dHJ1c2lvblxuICogdmVjdG9yIHRoYXQgaXMgd2hlcmUgaXQgcG9pbnRzLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ2lyY2xlQnVja2V0PExheWVyOiBDaXJjbGVTdHlsZUxheWVyIHwgSGVhdG1hcFN0eWxlTGF5ZXI+IGltcGxlbWVudHMgQnVja2V0IHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHpvb206IG51bWJlcjtcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xuICAgIGxheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIGxheWVyczogQXJyYXk8TGF5ZXI+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxMYXllcj47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcklkczogQXJyYXk8c3RyaW5nPjtcblxuICAgIGxheW91dFZlcnRleEFycmF5OiBDaXJjbGVMYXlvdXRBcnJheTtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG5cbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8TGF5ZXI+O1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQnVja2V0UGFyYW1ldGVyczxMYXllcj4pIHtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3B0aW9ucy5vdmVyc2NhbGluZztcbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRpb25zLmxheWVycztcbiAgICAgICAgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChsYXllciA9PiBsYXllci5pZCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuICAgICAgICB0aGlzLmhhc1BhdHRlcm4gPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IENpcmNsZUxheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uU2V0KG9wdGlvbnMubGF5ZXJzLCBvcHRpb25zLnpvb20pO1xuICAgICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoKGwpID0+IGwuaXNTdGF0ZURlcGVuZGVudCgpKS5tYXAoKGwpID0+IGwuaWQpO1xuICAgIH1cblxuICAgIHBvcHVsYXRlKGZlYXR1cmVzOiBBcnJheTxJbmRleGVkRmVhdHVyZT4sIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIHRpbGVUcmFuc2Zvcm06IFRpbGVUcmFuc2Zvcm0pIHtcbiAgICAgICAgY29uc3Qgc3R5bGVMYXllciA9IHRoaXMubGF5ZXJzWzBdO1xuICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlcyA9IFtdO1xuICAgICAgICBsZXQgY2lyY2xlU29ydEtleSA9IG51bGw7XG5cbiAgICAgICAgLy8gSGVhdG1hcCBsYXllcnMgYXJlIGhhbmRsZWQgaW4gdGhpcyBidWNrZXQgYW5kIGhhdmUgbm8gZXZhbHVhdGVkIHByb3BlcnRpZXMsIHNvIHdlIGNoZWNrIG91ciBhY2Nlc3NcbiAgICAgICAgaWYgKHN0eWxlTGF5ZXIudHlwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgIGNpcmNsZVNvcnRLZXkgPSAoKHN0eWxlTGF5ZXI6IGFueSk6IENpcmNsZVN0eWxlTGF5ZXIpLmxheW91dC5nZXQoJ2NpcmNsZS1zb3J0LWtleScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaWQsIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSBvZiBmZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3QgbmVlZEdlb21ldHJ5ID0gdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5O1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGlvbkZlYXR1cmUgPSB0b0V2YWx1YXRpb25GZWF0dXJlKGZlYXR1cmUsIG5lZWRHZW9tZXRyeSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aGlzLnpvb20pLCBldmFsdWF0aW9uRmVhdHVyZSwgY2Fub25pY2FsKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvcnRLZXkgPSBjaXJjbGVTb3J0S2V5ID9cbiAgICAgICAgICAgICAgICBjaXJjbGVTb3J0S2V5LmV2YWx1YXRlKGV2YWx1YXRpb25GZWF0dXJlLCB7fSwgY2Fub25pY2FsKSA6XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlOiBCdWNrZXRGZWF0dXJlID0ge1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0eXBlOiBmZWF0dXJlLnR5cGUsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogbmVlZEdlb21ldHJ5ID8gZXZhbHVhdGlvbkZlYXR1cmUuZ2VvbWV0cnkgOiBsb2FkR2VvbWV0cnkoZmVhdHVyZSwgY2Fub25pY2FsLCB0aWxlVHJhbnNmb3JtKSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuczoge30sXG4gICAgICAgICAgICAgICAgc29ydEtleVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYnVja2V0RmVhdHVyZXMucHVzaChidWNrZXRGZWF0dXJlKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNpcmNsZVNvcnRLZXkpIHtcbiAgICAgICAgICAgIGJ1Y2tldEZlYXR1cmVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBhLnNvcnRLZXkgaXMgYWx3YXlzIGEgbnVtYmVyIHdoZW4gaW4gdXNlXG4gICAgICAgICAgICAgICAgcmV0dXJuICgoYS5zb3J0S2V5OiBhbnkpOiBudW1iZXIpIC0gKChiLnNvcnRLZXk6IGFueSk6IG51bWJlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgYnVja2V0RmVhdHVyZSBvZiBidWNrZXRGZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3Qge2dlb21ldHJ5LCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gPSBidWNrZXRGZWF0dXJlO1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVzW2luZGV4XS5mZWF0dXJlO1xuXG4gICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoYnVja2V0RmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBvcHRpb25zLmF2YWlsYWJsZUltYWdlcywgY2Fub25pY2FsKTtcbiAgICAgICAgICAgIG9wdGlvbnMuZmVhdHVyZUluZGV4Lmluc2VydChmZWF0dXJlLCBnZW9tZXRyeSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIHRoaXMuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKHN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXMoc3RhdGVzLCB2dExheWVyLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLCBhdmFpbGFibGVJbWFnZXMsIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgdXBsb2FkUGVuZGluZygpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnVwbG9hZGVkIHx8IHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy51cGxvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LCBsYXlvdXRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICB0aGlzLnVwbG9hZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0VmVydGV4QnVmZmVyKSByZXR1cm47XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZShmZWF0dXJlOiBCdWNrZXRGZWF0dXJlLCBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgaW5kZXg6IG51bWJlciwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcmluZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBwb2ludC54O1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBwb2ludC55O1xuXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IGluY2x1ZGUgcG9pbnRzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHRpbGUgYm91bmRhcmllcy5cbiAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeCA+PSBFWFRFTlQgfHwgeSA8IDAgfHwgeSA+PSBFWFRFTlQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBnZW9tZXRyeSB3aWxsIGJlIG9mIHRoZSBQb2ludCB0eXBlLCBhbmQgd2UnbGwgZGVyaXZlXG4gICAgICAgICAgICAgICAgLy8gdHdvIHRyaWFuZ2xlcyBmcm9tIGl0LlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8g4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAgICAgICAgICAgICAgLy8g4pSCIDMgICAgIDIg4pSCXG4gICAgICAgICAgICAgICAgLy8g4pSCICAgICAgICAg4pSCXG4gICAgICAgICAgICAgICAgLy8g4pSCIDAgICAgIDEg4pSCXG4gICAgICAgICAgICAgICAgLy8g4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG5cbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXksIGZlYXR1cmUuc29ydEtleSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAtMSwgLTEpO1xuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAxLCAtMSk7XG4gICAgICAgICAgICAgICAgYWRkQ2lyY2xlVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHgsIHksIDEsIDEpO1xuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAtMSwgMSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMSwgaW5kZXggKyAyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMywgaW5kZXggKyAyKTtcblxuICAgICAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUsIGluZGV4LCB7fSwgYXZhaWxhYmxlSW1hZ2VzLCBjYW5vbmljYWwpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0NpcmNsZUJ1Y2tldCcsIENpcmNsZUJ1Y2tldCwge29taXQ6IFsnbGF5ZXJzJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2lyY2xlQnVja2V0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtpc0NvdW50ZXJDbG9ja3dpc2V9IGZyb20gJy4vdXRpbC5qcyc7XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuZXhwb3J0IHtwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkUG9pbnQsIHBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uLCBwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lLCBwb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24sIGRpc3RUb1NlZ21lbnRTcXVhcmVkLCBwb2x5Z29uSW50ZXJzZWN0c0JveH07XG5cbnR5cGUgTGluZSA9IEFycmF5PFBvaW50PjtcbnR5cGUgTXVsdGlMaW5lID0gQXJyYXk8TGluZT47XG50eXBlIFJpbmcgPSBBcnJheTxQb2ludD47XG50eXBlIFBvbHlnb24gPSBBcnJheTxQb2ludD47XG50eXBlIE11bHRpUG9seWdvbiA9IEFycmF5PFBvbHlnb24+O1xuXG5mdW5jdGlvbiBwb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24ocG9seWdvbkE6IFBvbHlnb24sIHBvbHlnb25COiBQb2x5Z29uKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uQS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQocG9seWdvbkIsIHBvbHlnb25BW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uQi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQocG9seWdvbkEsIHBvbHlnb25CW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxpbmVJbnRlcnNlY3RzTGluZShwb2x5Z29uQSwgcG9seWdvbkIpKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcG9seWdvbkludGVyc2VjdHNCdWZmZXJlZFBvaW50KHBvbHlnb246IFBvbHlnb24sIHBvaW50OiBQb2ludCwgcmFkaXVzOiBudW1iZXIpIHtcbiAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQocG9seWdvbiwgcG9pbnQpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAocG9pbnRJbnRlcnNlY3RzQnVmZmVyZWRMaW5lKHBvaW50LCBwb2x5Z29uLCByYWRpdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uKHBvbHlnb246IFBvbHlnb24sIG11bHRpUG9seWdvbjogTXVsdGlQb2x5Z29uKSB7XG5cbiAgICBpZiAocG9seWdvbi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIG11bHRpUG9seWdvbkNvbnRhaW5zUG9pbnQobXVsdGlQb2x5Z29uLCBwb2x5Z29uWzBdKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBtID0gMDsgbSA8IG11bHRpUG9seWdvbi5sZW5ndGg7IG0rKykge1xuICAgICAgICBjb25zdCByaW5nID0gbXVsdGlQb2x5Z29uW21dO1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJpbmcubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChwb2x5Z29uLCByaW5nW25dKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG11bHRpUG9seWdvbkNvbnRhaW5zUG9pbnQobXVsdGlQb2x5Z29uLCBwb2x5Z29uW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBtdWx0aVBvbHlnb24ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKGxpbmVJbnRlcnNlY3RzTGluZShwb2x5Z29uLCBtdWx0aVBvbHlnb25ba10pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmUocG9seWdvbjogUG9seWdvbiwgbXVsdGlMaW5lOiBNdWx0aUxpbmUsIHJhZGl1czogbnVtYmVyKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdWx0aUxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGluZSA9IG11bHRpTGluZVtpXTtcblxuICAgICAgICBpZiAocG9seWdvbi5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW5lLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb24sIGxpbmVba10pKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lSW50ZXJzZWN0c0J1ZmZlcmVkTGluZShwb2x5Z29uLCBsaW5lLCByYWRpdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsaW5lSW50ZXJzZWN0c0J1ZmZlcmVkTGluZShsaW5lQTogTGluZSwgbGluZUI6IExpbmUsIHJhZGl1czogbnVtYmVyKSB7XG5cbiAgICBpZiAobGluZUEubGVuZ3RoID4gMSkge1xuICAgICAgICBpZiAobGluZUludGVyc2VjdHNMaW5lKGxpbmVBLCBsaW5lQikpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYW55IHBvaW50IGluIGVpdGhlciBsaW5lIGlzIHdpdGhpbiByYWRpdXMgb2YgdGhlIG90aGVyIGxpbmVcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaW5lQi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHBvaW50SW50ZXJzZWN0c0J1ZmZlcmVkTGluZShsaW5lQltqXSwgbGluZUEsIHJhZGl1cykpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW5lQS5sZW5ndGg7IGsrKykge1xuICAgICAgICBpZiAocG9pbnRJbnRlcnNlY3RzQnVmZmVyZWRMaW5lKGxpbmVBW2tdLCBsaW5lQiwgcmFkaXVzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsaW5lSW50ZXJzZWN0c0xpbmUobGluZUE6IExpbmUsIGxpbmVCOiBMaW5lKSB7XG4gICAgaWYgKGxpbmVBLmxlbmd0aCA9PT0gMCB8fCBsaW5lQi5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVBLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBhMCA9IGxpbmVBW2ldO1xuICAgICAgICBjb25zdCBhMSA9IGxpbmVBW2kgKyAxXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsaW5lQi5sZW5ndGggLSAxOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGIwID0gbGluZUJbal07XG4gICAgICAgICAgICBjb25zdCBiMSA9IGxpbmVCW2ogKyAxXTtcbiAgICAgICAgICAgIGlmIChsaW5lU2VnbWVudEludGVyc2VjdHNMaW5lU2VnbWVudChhMCwgYTEsIGIwLCBiMSkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZVNlZ21lbnRJbnRlcnNlY3RzTGluZVNlZ21lbnQoYTA6IFBvaW50LCBhMTogUG9pbnQsIGIwOiBQb2ludCwgYjE6IFBvaW50KSB7XG4gICAgcmV0dXJuIGlzQ291bnRlckNsb2Nrd2lzZShhMCwgYjAsIGIxKSAhPT0gaXNDb3VudGVyQ2xvY2t3aXNlKGExLCBiMCwgYjEpICYmXG4gICAgICAgIGlzQ291bnRlckNsb2Nrd2lzZShhMCwgYTEsIGIwKSAhPT0gaXNDb3VudGVyQ2xvY2t3aXNlKGEwLCBhMSwgYjEpO1xufVxuXG5mdW5jdGlvbiBwb2ludEludGVyc2VjdHNCdWZmZXJlZExpbmUocDogUG9pbnQsIGxpbmU6IExpbmUsIHJhZGl1czogbnVtYmVyKSB7XG4gICAgY29uc3QgcmFkaXVzU3F1YXJlZCA9IHJhZGl1cyAqIHJhZGl1cztcblxuICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHAuZGlzdFNxcihsaW5lWzBdKSA8IHJhZGl1c1NxdWFyZWQ7XG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gRmluZCBsaW5lIHNlZ21lbnRzIHRoYXQgaGF2ZSBhIGRpc3RhbmNlIDw9IHJhZGl1c14yIHRvIHBcbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSB0cmVhdCB0aGUgbGluZSBhcyBcImNvbnRhaW5pbmcgcG9pbnQgcFwiLlxuICAgICAgICBjb25zdCB2ID0gbGluZVtpIC0gMV0sIHcgPSBsaW5lW2ldO1xuICAgICAgICBpZiAoZGlzdFRvU2VnbWVudFNxdWFyZWQocCwgdiwgdykgPCByYWRpdXNTcXVhcmVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTUwMTcyNS8zMzEzNzkuXG5mdW5jdGlvbiBkaXN0VG9TZWdtZW50U3F1YXJlZChwOiBQb2ludCwgdjogUG9pbnQsIHc6IFBvaW50KSB7XG4gICAgY29uc3QgbDIgPSB2LmRpc3RTcXIodyk7XG4gICAgaWYgKGwyID09PSAwKSByZXR1cm4gcC5kaXN0U3FyKHYpO1xuICAgIGNvbnN0IHQgPSAoKHAueCAtIHYueCkgKiAody54IC0gdi54KSArIChwLnkgLSB2LnkpICogKHcueSAtIHYueSkpIC8gbDI7XG4gICAgaWYgKHQgPCAwKSByZXR1cm4gcC5kaXN0U3FyKHYpO1xuICAgIGlmICh0ID4gMSkgcmV0dXJuIHAuZGlzdFNxcih3KTtcbiAgICByZXR1cm4gcC5kaXN0U3FyKHcuc3ViKHYpLl9tdWx0KHQpLl9hZGQodikpO1xufVxuXG4vLyBwb2ludCBpbiBwb2x5Z29uIHJheSBjYXN0aW5nIGFsZ29yaXRobVxuZnVuY3Rpb24gbXVsdGlQb2x5Z29uQ29udGFpbnNQb2ludChyaW5nczogQXJyYXk8UmluZz4sIHA6IFBvaW50KSB7XG4gICAgbGV0IGMgPSBmYWxzZSxcbiAgICAgICAgcmluZywgcDEsIHAyO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCByaW5ncy5sZW5ndGg7IGsrKykge1xuICAgICAgICByaW5nID0gcmluZ3Nba107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gcmluZy5sZW5ndGggLSAxOyBpIDwgcmluZy5sZW5ndGg7IGogPSBpKyspIHtcbiAgICAgICAgICAgIHAxID0gcmluZ1tpXTtcbiAgICAgICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgICAgIGlmICgoKHAxLnkgPiBwLnkpICE9PSAocDIueSA+IHAueSkpICYmIChwLnggPCAocDIueCAtIHAxLngpICogKHAueSAtIHAxLnkpIC8gKHAyLnkgLSBwMS55KSArIHAxLngpKSB7XG4gICAgICAgICAgICAgICAgYyA9ICFjO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiBwb2x5Z29uQ29udGFpbnNQb2ludChyaW5nOiBSaW5nLCBwOiBQb2ludCkge1xuICAgIGxldCBjID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSByaW5nLmxlbmd0aCAtIDE7IGkgPCByaW5nLmxlbmd0aDsgaiA9IGkrKykge1xuICAgICAgICBjb25zdCBwMSA9IHJpbmdbaV07XG4gICAgICAgIGNvbnN0IHAyID0gcmluZ1tqXTtcbiAgICAgICAgaWYgKCgocDEueSA+IHAueSkgIT09IChwMi55ID4gcC55KSkgJiYgKHAueCA8IChwMi54IC0gcDEueCkgKiAocC55IC0gcDEueSkgLyAocDIueSAtIHAxLnkpICsgcDEueCkpIHtcbiAgICAgICAgICAgIGMgPSAhYztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gcG9seWdvbkludGVyc2VjdHNCb3gocmluZzogUmluZywgYm94WDE6IG51bWJlciwgYm94WTE6IG51bWJlciwgYm94WDI6IG51bWJlciwgYm94WTI6IG51bWJlcikge1xuICAgIGZvciAoY29uc3QgcCBvZiByaW5nKSB7XG4gICAgICAgIGlmIChib3hYMSA8PSBwLnggJiZcbiAgICAgICAgICAgIGJveFkxIDw9IHAueSAmJlxuICAgICAgICAgICAgYm94WDIgPj0gcC54ICYmXG4gICAgICAgICAgICBib3hZMiA+PSBwLnkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvcm5lcnMgPSBbXG4gICAgICAgIG5ldyBQb2ludChib3hYMSwgYm94WTEpLFxuICAgICAgICBuZXcgUG9pbnQoYm94WDEsIGJveFkyKSxcbiAgICAgICAgbmV3IFBvaW50KGJveFgyLCBib3hZMiksXG4gICAgICAgIG5ldyBQb2ludChib3hYMiwgYm94WTEpXTtcblxuICAgIGlmIChyaW5nLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb3JuZXIgb2YgY29ybmVycykge1xuICAgICAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHJpbmcsIGNvcm5lcikpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5nLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBwMSA9IHJpbmdbaV07XG4gICAgICAgIGNvbnN0IHAyID0gcmluZ1tpICsgMV07XG4gICAgICAgIGlmIChlZGdlSW50ZXJzZWN0c0JveChwMSwgcDIsIGNvcm5lcnMpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGVkZ2VJbnRlcnNlY3RzQm94KGUxOiBQb2ludCwgZTI6IFBvaW50LCBjb3JuZXJzOiBBcnJheTxQb2ludD4pIHtcbiAgICBjb25zdCB0bCA9IGNvcm5lcnNbMF07XG4gICAgY29uc3QgYnIgPSBjb3JuZXJzWzJdO1xuICAgIC8vIHRoZSBlZGdlIGFuZCBib3ggZG8gbm90IGludGVyc2VjdCBpbiBlaXRoZXIgdGhlIHggb3IgeSBkaW1lbnNpb25zXG4gICAgaWYgKCgoZTEueCA8IHRsLngpICYmIChlMi54IDwgdGwueCkpIHx8XG4gICAgICAgICgoZTEueCA+IGJyLngpICYmIChlMi54ID4gYnIueCkpIHx8XG4gICAgICAgICgoZTEueSA8IHRsLnkpICYmIChlMi55IDwgdGwueSkpIHx8XG4gICAgICAgICgoZTEueSA+IGJyLnkpICYmIChlMi55ID4gYnIueSkpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBjaGVjayBpZiBhbGwgY29ybmVycyBvZiB0aGUgYm94IGFyZSBvbiB0aGUgc2FtZSBzaWRlIG9mIHRoZSBlZGdlXG4gICAgY29uc3QgZGlyID0gaXNDb3VudGVyQ2xvY2t3aXNlKGUxLCBlMiwgY29ybmVyc1swXSk7XG4gICAgcmV0dXJuIGRpciAhPT0gaXNDb3VudGVyQ2xvY2t3aXNlKGUxLCBlMiwgY29ybmVyc1sxXSkgfHxcbiAgICAgICAgZGlyICE9PSBpc0NvdW50ZXJDbG9ja3dpc2UoZTEsIGUyLCBjb3JuZXJzWzJdKSB8fFxuICAgICAgICBkaXIgIT09IGlzQ291bnRlckNsb2Nrd2lzZShlMSwgZTIsIGNvcm5lcnNbM10pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgdHlwZSB7UG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSBmcm9tICcuL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBDaXJjbGVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBMaW5lQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1heGltdW1QYWludFZhbHVlKHByb3BlcnR5OiBzdHJpbmcsIGxheWVyOiBTdHlsZUxheWVyLCBidWNrZXQ6IENpcmNsZUJ1Y2tldDwqPiB8IExpbmVCdWNrZXQpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlID0gKChsYXllci5wYWludDogYW55KS5nZXQocHJvcGVydHkpOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8YW55PikudmFsdWU7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCkuZ2V0TWF4VmFsdWUocHJvcGVydHkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZURpc3RhbmNlKHRyYW5zbGF0ZTogW251bWJlciwgbnVtYmVyXSkge1xuICAgIHJldHVybiBNYXRoLnNxcnQodHJhbnNsYXRlWzBdICogdHJhbnNsYXRlWzBdICsgdHJhbnNsYXRlWzFdICogdHJhbnNsYXRlWzFdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZShxdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUFuY2hvcjogJ3ZpZXdwb3J0JyB8ICdtYXAnLFxuICAgICAgICAgICAgICAgICAgIGJlYXJpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0czogbnVtYmVyKSB7XG4gICAgaWYgKCF0cmFuc2xhdGVbMF0gJiYgIXRyYW5zbGF0ZVsxXSkge1xuICAgICAgICByZXR1cm4gcXVlcnlHZW9tZXRyeTtcbiAgICB9XG4gICAgY29uc3QgcHQgPSBQb2ludC5jb252ZXJ0KHRyYW5zbGF0ZSkuX211bHQocGl4ZWxzVG9UaWxlVW5pdHMpO1xuXG4gICAgaWYgKHRyYW5zbGF0ZUFuY2hvciA9PT0gXCJ2aWV3cG9ydFwiKSB7XG4gICAgICAgIHB0Ll9yb3RhdGUoLWJlYXJpbmcpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXJ5R2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBxdWVyeUdlb21ldHJ5W2ldO1xuICAgICAgICB0cmFuc2xhdGVkLnB1c2gocG9pbnQuc3ViKHB0KSk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGlsZXNwYWNlVHJhbnNsYXRlKHRyYW5zbGF0ZTogW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlQW5jaG9yOiAndmlld3BvcnQnIHwgJ21hcCcsXG4gICAgICAgICAgICAgICAgICAgIGJlYXJpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IG51bWJlcik6IFBvaW50IHtcbiAgICBjb25zdCBwdCA9IFBvaW50LmNvbnZlcnQodHJhbnNsYXRlKS5fbXVsdChwaXhlbHNUb1RpbGVVbml0cyk7XG5cbiAgICBpZiAodHJhbnNsYXRlQW5jaG9yID09PSBcInZpZXdwb3J0XCIpIHtcbiAgICAgICAgcHQuX3JvdGF0ZSgtYmVhcmluZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHB0O1xufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuZXhwb3J0IHR5cGUgTGF5b3V0UHJvcHMgPSB7fFxuICAgIFwiY2lyY2xlLXNvcnQta2V5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IGxheW91dDogUHJvcGVydGllczxMYXlvdXRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJjaXJjbGUtc29ydC1rZXlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfY2lyY2xlXCJdW1wiY2lyY2xlLXNvcnQta2V5XCJdKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcImNpcmNsZS1yYWRpdXNcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJjaXJjbGUtY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImNpcmNsZS1ibHVyXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiY2lyY2xlLW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJjaXJjbGUtdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJjaXJjbGUtcGl0Y2gtYWxpZ25tZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImNpcmNsZS1zdHJva2UtY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImNpcmNsZS1zdHJva2Utb3BhY2l0eVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImNpcmNsZS1yYWRpdXNcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtcmFkaXVzXCJdKSxcbiAgICBcImNpcmNsZS1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1jb2xvclwiXSksXG4gICAgXCJjaXJjbGUtYmx1clwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1ibHVyXCJdKSxcbiAgICBcImNpcmNsZS1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLW9wYWNpdHlcIl0pLFxuICAgIFwiY2lyY2xlLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJjaXJjbGUtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwiY2lyY2xlLXBpdGNoLXNjYWxlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIl0pLFxuICAgIFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiXSksXG4gICAgXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXN0cm9rZS13aWR0aFwiXSksXG4gICAgXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXN0cm9rZS1jb2xvclwiXSksXG4gICAgXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQsIGxheW91dCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiwgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt2ZWMzLCB2ZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5jbGFzcyBSYXkge1xuICAgIHBvczogdmVjMztcbiAgICBkaXI6IHZlYzM7XG5cbiAgICBjb25zdHJ1Y3Rvcihwb3NfOiB2ZWMzLCBkaXJfOiB2ZWMzKSB7XG4gICAgICAgIHRoaXMucG9zID0gcG9zXztcbiAgICAgICAgdGhpcy5kaXIgPSBkaXJfO1xuICAgIH1cblxuICAgIGludGVyc2VjdHNQbGFuZShwdDogdmVjMywgbm9ybWFsOiB2ZWMzLCBvdXQ6IHZlYzMpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgRCA9IHZlYzMuZG90KG5vcm1hbCwgdGhpcy5kaXIpO1xuXG4gICAgICAgIC8vIHJheSBpcyBwYXJhbGxlbCB0byBwbGFuZSwgc28gaXQgbWlzc2VzXG4gICAgICAgIGlmIChNYXRoLmFicyhEKSA8IDFlLTYpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgY29uc3QgdCA9IChcbiAgICAgICAgICAgIChwdFswXSAtIHRoaXMucG9zWzBdKSAqIG5vcm1hbFswXSArXG4gICAgICAgICAgICAocHRbMV0gLSB0aGlzLnBvc1sxXSkgKiBub3JtYWxbMV0gK1xuICAgICAgICAgICAgKHB0WzJdIC0gdGhpcy5wb3NbMl0pICogbm9ybWFsWzJdKSAvIEQ7XG5cbiAgICAgICAgb3V0WzBdID0gdGhpcy5wb3NbMF0gKyB0aGlzLmRpclswXSAqIHQ7XG4gICAgICAgIG91dFsxXSA9IHRoaXMucG9zWzFdICsgdGhpcy5kaXJbMV0gKiB0O1xuICAgICAgICBvdXRbMl0gPSB0aGlzLnBvc1syXSArIHRoaXMuZGlyWzJdICogdDtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjbG9zZXN0UG9pbnRPblNwaGVyZShjZW50ZXI6IHZlYzMsIHI6IG51bWJlciwgb3V0OiB2ZWMzKTogYm9vbGVhbiB7XG4gICAgICAgIGFzc2VydCh2ZWMzLnNxdWFyZWRMZW5ndGgodGhpcy5kaXIpID4gMC4wICYmIHIgPj0gMC4wKTtcblxuICAgICAgICBpZiAodmVjMy5lcXVhbHModGhpcy5wb3MsIGNlbnRlcikgfHwgciA9PT0gMC4wKSB7XG4gICAgICAgICAgICBvdXRbMF0gPSBvdXRbMV0gPSBvdXRbMl0gPSAwO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2R4LCBkeSwgZHpdID0gdGhpcy5kaXI7XG5cbiAgICAgICAgY29uc3QgcHggPSB0aGlzLnBvc1swXSAtIGNlbnRlclswXTtcbiAgICAgICAgY29uc3QgcHkgPSB0aGlzLnBvc1sxXSAtIGNlbnRlclsxXTtcbiAgICAgICAgY29uc3QgcHogPSB0aGlzLnBvc1syXSAtIGNlbnRlclsyXTtcblxuICAgICAgICBjb25zdCBhID0gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6O1xuICAgICAgICBjb25zdCBiID0gMi4wICogKHB4ICogZHggKyBweSAqIGR5ICsgcHogKiBkeik7XG4gICAgICAgIGNvbnN0IGMgPSAocHggKiBweCArIHB5ICogcHkgKyBweiAqIHB6KSAtIHIgKiByO1xuICAgICAgICBjb25zdCBkID0gYiAqIGIgLSA0ICogYSAqIGM7XG5cbiAgICAgICAgaWYgKGQgPCAwLjApIHtcbiAgICAgICAgICAgIC8vIE5vIGludGVyc2VjdGlvbiwgZmluZCBkaXN0YW5jZSBiZXR3ZWVuIGNsb3Nlc3QgcG9pbnRzXG4gICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5tYXgoLWIgLyAyLCAwLjApO1xuICAgICAgICAgICAgY29uc3QgZ3ggPSBweCArIGR4ICogdDsgLy8gcG9pbnQgdG8gZ2xvYmVcbiAgICAgICAgICAgIGNvbnN0IGd5ID0gcHkgKyBkeSAqIHQ7XG4gICAgICAgICAgICBjb25zdCBneiA9IHB6ICsgZHogKiB0O1xuICAgICAgICAgICAgY29uc3QgZ2xlbiA9IE1hdGguaHlwb3QoZ3gsIGd5LCBneik7XG4gICAgICAgICAgICBvdXRbMF0gPSBneCAqIHIgLyBnbGVuO1xuICAgICAgICAgICAgb3V0WzFdID0gZ3kgKiByIC8gZ2xlbjtcbiAgICAgICAgICAgIG91dFsyXSA9IGd6ICogciAvIGdsZW47XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydChhID4gMC4wKTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSAoLWIgLSBNYXRoLnNxcnQoZCkpIC8gKDIuMCAqIGEpO1xuXG4gICAgICAgICAgICBpZiAodCA8IDAuMCkge1xuICAgICAgICAgICAgICAgIC8vIFJheSBpcyBwb2ludGluZyBhd2F5IGZyb20gdGhlIHNwaGVyZVxuICAgICAgICAgICAgICAgIGNvbnN0IHBsZW4gPSBNYXRoLmh5cG90KHB4LCBweSwgcHopO1xuICAgICAgICAgICAgICAgIG91dFswXSA9IHB4ICogciAvIHBsZW47XG4gICAgICAgICAgICAgICAgb3V0WzFdID0gcHkgKiByIC8gcGxlbjtcbiAgICAgICAgICAgICAgICBvdXRbMl0gPSBweiAqIHIgLyBwbGVuO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRbMF0gPSBweCArIGR4ICogdDtcbiAgICAgICAgICAgICAgICBvdXRbMV0gPSBweSArIGR5ICogdDtcbiAgICAgICAgICAgICAgICBvdXRbMl0gPSBweiArIGR6ICogdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgRnJ1c3R1bSB7XG4gICAgcG9pbnRzOiBBcnJheTxBcnJheTxudW1iZXI+PjtcbiAgICBwbGFuZXM6IEFycmF5PEFycmF5PG51bWJlcj4+O1xuXG4gICAgY29uc3RydWN0b3IocG9pbnRzXzogQXJyYXk8QXJyYXk8bnVtYmVyPj4sIHBsYW5lc186IEFycmF5PEFycmF5PG51bWJlcj4+KSB7XG4gICAgICAgIHRoaXMucG9pbnRzID0gcG9pbnRzXztcbiAgICAgICAgdGhpcy5wbGFuZXMgPSBwbGFuZXNfO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSW52UHJvamVjdGlvbk1hdHJpeChpbnZQcm9qOiBGbG9hdDY0QXJyYXksIHdvcmxkU2l6ZTogbnVtYmVyLCB6b29tOiBudW1iZXIsIHpJbk1ldGVyczogYm9vbGVhbik6IEZydXN0dW0ge1xuICAgICAgICBjb25zdCBjbGlwU3BhY2VDb3JuZXJzID0gW1xuICAgICAgICAgICAgWy0xLCAxLCAtMSwgMV0sXG4gICAgICAgICAgICBbIDEsIDEsIC0xLCAxXSxcbiAgICAgICAgICAgIFsgMSwgLTEsIC0xLCAxXSxcbiAgICAgICAgICAgIFstMSwgLTEsIC0xLCAxXSxcbiAgICAgICAgICAgIFstMSwgMSwgMSwgMV0sXG4gICAgICAgICAgICBbIDEsIDEsIDEsIDFdLFxuICAgICAgICAgICAgWyAxLCAtMSwgMSwgMV0sXG4gICAgICAgICAgICBbLTEsIC0xLCAxLCAxXVxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHNjYWxlID0gTWF0aC5wb3coMiwgem9vbSk7XG5cbiAgICAgICAgLy8gVHJhbnNmb3JtIGZydXN0dW0gY29ybmVyIHBvaW50cyBmcm9tIGNsaXAgc3BhY2UgdG8gdGlsZSBzcGFjZVxuICAgICAgICBjb25zdCBmcnVzdHVtQ29vcmRzID0gY2xpcFNwYWNlQ29ybmVyc1xuICAgICAgICAgICAgLm1hcCh2ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gdmVjNC50cmFuc2Zvcm1NYXQ0KFtdLCB2LCBpbnZQcm9qKTtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0gMS4wIC8gc1szXSAvIHdvcmxkU2l6ZSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIC8vIFogc2NhbGUgaW4gbWV0ZXJzLlxuICAgICAgICAgICAgICAgIHJldHVybiB2ZWM0Lm11bChzLCBzLCBbaywgaywgekluTWV0ZXJzID8gMS4wIC8gc1szXSA6IGssIGtdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZydXN0dW1QbGFuZVBvaW50SW5kaWNlcyA9IFtcbiAgICAgICAgICAgIFswLCAxLCAyXSwgIC8vIG5lYXJcbiAgICAgICAgICAgIFs2LCA1LCA0XSwgIC8vIGZhclxuICAgICAgICAgICAgWzAsIDMsIDddLCAgLy8gbGVmdFxuICAgICAgICAgICAgWzIsIDEsIDVdLCAgLy8gcmlnaHRcbiAgICAgICAgICAgIFszLCAyLCA2XSwgIC8vIGJvdHRvbVxuICAgICAgICAgICAgWzAsIDQsIDVdICAgLy8gdG9wXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgZnJ1c3R1bVBsYW5lcyA9IGZydXN0dW1QbGFuZVBvaW50SW5kaWNlcy5tYXAoKHA6IEFycmF5PG51bWJlcj4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSB2ZWMzLnN1YihbXSwgZnJ1c3R1bUNvb3Jkc1twWzBdXSwgZnJ1c3R1bUNvb3Jkc1twWzFdXSk7XG4gICAgICAgICAgICBjb25zdCBiID0gdmVjMy5zdWIoW10sIGZydXN0dW1Db29yZHNbcFsyXV0sIGZydXN0dW1Db29yZHNbcFsxXV0pO1xuICAgICAgICAgICAgY29uc3QgbiA9IHZlYzMubm9ybWFsaXplKFtdLCB2ZWMzLmNyb3NzKFtdLCBhLCBiKSk7XG4gICAgICAgICAgICBjb25zdCBkID0gLXZlYzMuZG90KG4sIGZydXN0dW1Db29yZHNbcFsxXV0pO1xuICAgICAgICAgICAgcmV0dXJuIG4uY29uY2F0KGQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IEZydXN0dW0oZnJ1c3R1bUNvb3JkcywgZnJ1c3R1bVBsYW5lcyk7XG4gICAgfVxufVxuXG5jbGFzcyBBYWJiIHtcbiAgICBtaW46IHZlYzM7XG4gICAgbWF4OiB2ZWMzO1xuICAgIGNlbnRlcjogdmVjMztcblxuICAgIGNvbnN0cnVjdG9yKG1pbl86IHZlYzMsIG1heF86IHZlYzMpIHtcbiAgICAgICAgdGhpcy5taW4gPSBtaW5fO1xuICAgICAgICB0aGlzLm1heCA9IG1heF87XG4gICAgICAgIHRoaXMuY2VudGVyID0gdmVjMy5zY2FsZShbXSwgdmVjMy5hZGQoW10sIHRoaXMubWluLCB0aGlzLm1heCksIDAuNSk7XG4gICAgfVxuXG4gICAgcXVhZHJhbnQoaW5kZXg6IG51bWJlcik6IEFhYmIge1xuICAgICAgICBjb25zdCBzcGxpdCA9IFsoaW5kZXggJSAyKSA9PT0gMCwgaW5kZXggPCAyXTtcbiAgICAgICAgY29uc3QgcU1pbiA9IHZlYzMuY2xvbmUodGhpcy5taW4pO1xuICAgICAgICBjb25zdCBxTWF4ID0gdmVjMy5jbG9uZSh0aGlzLm1heCk7XG4gICAgICAgIGZvciAobGV0IGF4aXMgPSAwOyBheGlzIDwgc3BsaXQubGVuZ3RoOyBheGlzKyspIHtcbiAgICAgICAgICAgIHFNaW5bYXhpc10gPSBzcGxpdFtheGlzXSA/IHRoaXMubWluW2F4aXNdIDogdGhpcy5jZW50ZXJbYXhpc107XG4gICAgICAgICAgICBxTWF4W2F4aXNdID0gc3BsaXRbYXhpc10gPyB0aGlzLmNlbnRlcltheGlzXSA6IHRoaXMubWF4W2F4aXNdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRlbXBvcmFyaWx5LCBlbGV2YXRpb24gaXMgY29uc3RhbnQsIGhlbmNlIHF1YWRyYW50Lm1heC56ID0gdGhpcy5tYXguelxuICAgICAgICBxTWF4WzJdID0gdGhpcy5tYXhbMl07XG4gICAgICAgIHJldHVybiBuZXcgQWFiYihxTWluLCBxTWF4KTtcbiAgICB9XG5cbiAgICBkaXN0YW5jZVgocG9pbnQ6IEFycmF5PG51bWJlcj4pOiBudW1iZXIge1xuICAgICAgICBjb25zdCBwb2ludE9uQWFiYiA9IE1hdGgubWF4KE1hdGgubWluKHRoaXMubWF4WzBdLCBwb2ludFswXSksIHRoaXMubWluWzBdKTtcbiAgICAgICAgcmV0dXJuIHBvaW50T25BYWJiIC0gcG9pbnRbMF07XG4gICAgfVxuXG4gICAgZGlzdGFuY2VZKHBvaW50OiBBcnJheTxudW1iZXI+KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcG9pbnRPbkFhYmIgPSBNYXRoLm1heChNYXRoLm1pbih0aGlzLm1heFsxXSwgcG9pbnRbMV0pLCB0aGlzLm1pblsxXSk7XG4gICAgICAgIHJldHVybiBwb2ludE9uQWFiYiAtIHBvaW50WzFdO1xuICAgIH1cblxuICAgIGRpc3RhbmNlWihwb2ludDogQXJyYXk8bnVtYmVyPik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBvaW50T25BYWJiID0gTWF0aC5tYXgoTWF0aC5taW4odGhpcy5tYXhbMl0sIHBvaW50WzJdKSwgdGhpcy5taW5bMl0pO1xuICAgICAgICByZXR1cm4gcG9pbnRPbkFhYmIgLSBwb2ludFsyXTtcbiAgICB9XG5cbiAgICBnZXRDb3JuZXJzKCkge1xuICAgICAgICBjb25zdCBtbiA9IHRoaXMubWluO1xuICAgICAgICBjb25zdCBteCA9IHRoaXMubWF4O1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgW21uWzBdLCBtblsxXSwgbW5bMl1dLFxuICAgICAgICAgICAgW214WzBdLCBtblsxXSwgbW5bMl1dLFxuICAgICAgICAgICAgW214WzBdLCBteFsxXSwgbW5bMl1dLFxuICAgICAgICAgICAgW21uWzBdLCBteFsxXSwgbW5bMl1dLFxuICAgICAgICAgICAgW21uWzBdLCBtblsxXSwgbXhbMl1dLFxuICAgICAgICAgICAgW214WzBdLCBtblsxXSwgbXhbMl1dLFxuICAgICAgICAgICAgW214WzBdLCBteFsxXSwgbXhbMl1dLFxuICAgICAgICAgICAgW21uWzBdLCBteFsxXSwgbXhbMl1dLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm1zIGEgZnJ1c3R1bS1hYWJiIGludGVyc2VjdGlvbiB0ZXN0LiBSZXR1cm5zIDAgaWYgdGhlcmUncyBubyBpbnRlcnNlY3Rpb24sXG4gICAgLy8gMSBpZiBzaGFwZXMgYXJlIGludGVyc2VjdGluZyBhbmQgMiBpZiB0aGUgYWFiYiBpZiBmdWxseSBpbnNpZGUgdGhlIGZydXN0dW0uXG4gICAgaW50ZXJzZWN0cyhmcnVzdHVtOiBGcnVzdHVtKTogbnVtYmVyIHtcbiAgICAgICAgLy8gRXhlY3V0ZSBzZXBhcmF0aW5nIGF4aXMgdGVzdCBiZXR3ZWVuIHR3byBjb252ZXggb2JqZWN0cyB0byBmaW5kIGludGVyc2VjdGlvbnNcbiAgICAgICAgLy8gRWFjaCBmcnVzdHVtIHBsYW5lIHRvZ2V0aGVyIHdpdGggMyBtYWpvciBheGVzIGRlZmluZSB0aGUgc2VwYXJhdGluZyBheGVzXG5cbiAgICAgICAgY29uc3QgYWFiYlBvaW50cyA9IHRoaXMuZ2V0Q29ybmVycygpO1xuICAgICAgICBsZXQgZnVsbHlJbnNpZGUgPSB0cnVlO1xuXG4gICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgZnJ1c3R1bS5wbGFuZXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBsYW5lID0gZnJ1c3R1bS5wbGFuZXNbcF07XG4gICAgICAgICAgICBsZXQgcG9pbnRzSW5zaWRlID0gMDtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhYWJiUG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcG9pbnRzSW5zaWRlICs9IHZlYzMuZG90KHBsYW5lLCBhYWJiUG9pbnRzW2ldKSArIHBsYW5lWzNdID49IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwb2ludHNJbnNpZGUgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG5cbiAgICAgICAgICAgIGlmIChwb2ludHNJbnNpZGUgIT09IGFhYmJQb2ludHMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZ1bGx5SW5zaWRlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnVsbHlJbnNpZGUpXG4gICAgICAgICAgICByZXR1cm4gMjtcblxuICAgICAgICBmb3IgKGxldCBheGlzID0gMDsgYXhpcyA8IDM7IGF4aXMrKykge1xuICAgICAgICAgICAgbGV0IHByb2pNaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgbGV0IHByb2pNYXggPSAtTnVtYmVyLk1BWF9WQUxVRTtcblxuICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBmcnVzdHVtLnBvaW50cy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2plY3RlZFBvaW50ID0gZnJ1c3R1bS5wb2ludHNbcF1bYXhpc10gLSB0aGlzLm1pbltheGlzXTtcblxuICAgICAgICAgICAgICAgIHByb2pNaW4gPSBNYXRoLm1pbihwcm9qTWluLCBwcm9qZWN0ZWRQb2ludCk7XG4gICAgICAgICAgICAgICAgcHJvak1heCA9IE1hdGgubWF4KHByb2pNYXgsIHByb2plY3RlZFBvaW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb2pNYXggPCAwIHx8IHByb2pNaW4gPiB0aGlzLm1heFtheGlzXSAtIHRoaXMubWluW2F4aXNdKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxufVxuZXhwb3J0IHtcbiAgICBBYWJiLFxuICAgIEZydXN0dW0sXG4gICAgUmF5XG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXIuanMnO1xuXG5pbXBvcnQgQ2lyY2xlQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L2NpcmNsZV9idWNrZXQuanMnO1xuaW1wb3J0IHtwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkUG9pbnR9IGZyb20gJy4uLy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzLmpzJztcbmltcG9ydCB7Z2V0TWF4aW11bVBhaW50VmFsdWUsIHRyYW5zbGF0ZURpc3RhbmNlLCB0aWxlc3BhY2VUcmFuc2xhdGV9IGZyb20gJy4uL3F1ZXJ5X3V0aWxzLmpzJztcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vY2lyY2xlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHtUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgTGF5b3V0LCBQb3NzaWJseUV2YWx1YXRlZH0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge3ZlYzQsIHZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgUHJvZ3JhbUNvbmZpZ3VyYXRpb24gZnJvbSAnLi4vLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHtSYXl9IGZyb20gJy4uLy4uL3V0aWwvcHJpbWl0aXZlcy5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGV9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSB7QnVja2V0LCBCdWNrZXRQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSB7TGF5b3V0UHJvcHMsIFBhaW50UHJvcHN9IGZyb20gJy4vY2lyY2xlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZXNwYWNlUXVlcnlHZW9tZXRyeX0gZnJvbSAnLi4vcXVlcnlfZ2VvbWV0cnkuanMnO1xuaW1wb3J0IHR5cGUge0RFTVNhbXBsZXJ9IGZyb20gJy4uLy4uL3RlcnJhaW4vZWxldmF0aW9uLmpzJztcblxuY2xhc3MgQ2lyY2xlU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF91bmV2YWx1YXRlZExheW91dDogTGF5b3V0PExheW91dFByb3BzPjtcbiAgICBsYXlvdXQ6IFBvc3NpYmx5RXZhbHVhdGVkPExheW91dFByb3BzPjtcblxuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIGNyZWF0ZUJ1Y2tldChwYXJhbWV0ZXJzOiBCdWNrZXRQYXJhbWV0ZXJzPCo+KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2lyY2xlQnVja2V0KHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHF1ZXJ5UmFkaXVzKGJ1Y2tldDogQnVja2V0KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgY2lyY2xlQnVja2V0OiBDaXJjbGVCdWNrZXQ8Q2lyY2xlU3R5bGVMYXllcj4gPSAoYnVja2V0OiBhbnkpO1xuICAgICAgICByZXR1cm4gZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2NpcmNsZS1yYWRpdXMnLCB0aGlzLCBjaXJjbGVCdWNrZXQpICtcbiAgICAgICAgICAgIGdldE1heGltdW1QYWludFZhbHVlKCdjaXJjbGUtc3Ryb2tlLXdpZHRoJywgdGhpcywgY2lyY2xlQnVja2V0KSArXG4gICAgICAgICAgICB0cmFuc2xhdGVEaXN0YW5jZSh0aGlzLnBhaW50LmdldCgnY2lyY2xlLXRyYW5zbGF0ZScpKTtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnk6IFRpbGVzcGFjZVF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbGV2YXRpb25IZWxwZXI6ID9ERU1TYW1wbGVyKTogYm9vbGVhbiB7XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0aWxlc3BhY2VUcmFuc2xhdGUoXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnY2lyY2xlLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2NpcmNsZS10cmFuc2xhdGUtYW5jaG9yJyksXG4gICAgICAgICAgICB0cmFuc2Zvcm0uYW5nbGUsIHF1ZXJ5R2VvbWV0cnkucGl4ZWxUb1RpbGVVbml0c0ZhY3Rvcik7XG5cbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtcmFkaXVzJykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSArXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnY2lyY2xlLXN0cm9rZS13aWR0aCcpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5SW50ZXJzZWN0c0NpcmNsZShxdWVyeUdlb21ldHJ5LCBnZW9tZXRyeSwgdHJhbnNmb3JtLCBwaXhlbFBvc01hdHJpeCwgZWxldmF0aW9uSGVscGVyLFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCcsXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnY2lyY2xlLXBpdGNoLXNjYWxlJykgPT09ICdtYXAnLCB0cmFuc2xhdGlvbiwgc2l6ZSk7XG4gICAgfVxuXG4gICAgZ2V0UHJvZ3JhbUlkcygpIHtcbiAgICAgICAgcmV0dXJuIFsnY2lyY2xlJ107XG4gICAgfVxuXG4gICAgZ2V0UHJvZ3JhbUNvbmZpZ3VyYXRpb24oem9vbTogbnVtYmVyKTogUHJvZ3JhbUNvbmZpZ3VyYXRpb24ge1xuICAgICAgICByZXR1cm4gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uKHRoaXMsIHpvb20pO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5SW50ZXJzZWN0c0NpcmNsZShxdWVyeUdlb21ldHJ5OiBUaWxlc3BhY2VRdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbkhlbHBlcjogP0RFTVNhbXBsZXIsXG4gICAgICAgICAgICAgICAgICAgICAgIGFsaWduV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbjogUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICAgIHNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmIChhbGlnbldpdGhNYXAgJiYgcXVlcnlHZW9tZXRyeS5xdWVyeUdlb21ldHJ5LmlzQWJvdmVIb3Jpem9uKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBGb3IgcGl0Y2gtYWxpZ25tZW50OiBtYXAsIGNvbXBhcmUgZmVhdHVyZSBnZW9tZXRyeSB0byBxdWVyeSBnZW9tZXRyeSBpbiB0aGUgcGxhbmUgb2YgdGhlIHRpbGVcbiAgICAvLyAvLyBPdGhlcndpc2UsIGNvbXBhcmUgZ2VvbWV0cnkgaW4gdGhlIHBsYW5lIG9mIHRoZSB2aWV3cG9ydFxuICAgIC8vIC8vIEEgY2lyY2xlIHdpdGggZml4ZWQgc2NhbGluZyByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQgZ2V0cyBsYXJnZXIgaW4gdGlsZSBzcGFjZSBhcyBpdCBtb3ZlcyBpbnRvIHRoZSBkaXN0YW5jZVxuICAgIC8vIC8vIEEgY2lyY2xlIHdpdGggZml4ZWQgc2NhbGluZyByZWxhdGl2ZSB0byB0aGUgbWFwIGdldHMgc21hbGxlciBpbiB2aWV3cG9ydCBzcGFjZSBhcyBpdCBtb3ZlcyBpbnRvIHRoZSBkaXN0YW5jZVxuICAgIGlmIChhbGlnbldpdGhNYXApIHNpemUgKj0gcXVlcnlHZW9tZXRyeS5waXhlbFRvVGlsZVVuaXRzRmFjdG9yO1xuXG4gICAgZm9yIChjb25zdCByaW5nIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcmluZykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZFBvaW50ID0gcG9pbnQuYWRkKHRyYW5zbGF0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IHogPSAoZWxldmF0aW9uSGVscGVyICYmIHRyYW5zZm9ybS5lbGV2YXRpb24pID9cbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm0uZWxldmF0aW9uLmV4YWdnZXJhdGlvbigpICogZWxldmF0aW9uSGVscGVyLmdldEVsZXZhdGlvbkF0KHRyYW5zbGF0ZWRQb2ludC54LCB0cmFuc2xhdGVkUG9pbnQueSwgdHJ1ZSkgOlxuICAgICAgICAgICAgICAgIDA7XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUG9pbnQgPSBhbGlnbldpdGhNYXAgPyB0cmFuc2xhdGVkUG9pbnQgOiBwcm9qZWN0UG9pbnQodHJhbnNsYXRlZFBvaW50LCB6LCBwaXhlbFBvc01hdHJpeCk7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFBvbHlnb24gPSBhbGlnbldpdGhNYXAgP1xuICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnkudGlsZXNwYWNlUmF5cy5tYXAoKHIpID0+IGludGVyc2VjdEF0SGVpZ2h0KHIsIHopKSA6XG4gICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeS5xdWVyeUdlb21ldHJ5LnNjcmVlbkdlb21ldHJ5O1xuXG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0ZWRDZW50ZXIgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtwb2ludC54LCBwb2ludC55LCB6LCAxXSwgcGl4ZWxQb3NNYXRyaXgpO1xuICAgICAgICAgICAgaWYgKCFzY2FsZVdpdGhNYXAgJiYgYWxpZ25XaXRoTWFwKSB7XG4gICAgICAgICAgICAgICAgc2l6ZSAqPSBwcm9qZWN0ZWRDZW50ZXJbM10gLyB0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NhbGVXaXRoTWFwICYmICFhbGlnbldpdGhNYXApIHtcbiAgICAgICAgICAgICAgICBzaXplICo9IHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gcHJvamVjdGVkQ2VudGVyWzNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocG9seWdvbkludGVyc2VjdHNCdWZmZXJlZFBvaW50KHRyYW5zZm9ybWVkUG9seWdvbiwgdHJhbnNmb3JtZWRQb2ludCwgc2l6ZSkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0UG9pbnQocDogUG9pbnQsIHo6IG51bWJlciwgcGl4ZWxQb3NNYXRyaXg6IEZsb2F0MzJBcnJheSkge1xuICAgIGNvbnN0IHBvaW50ID0gdmVjNC50cmFuc2Zvcm1NYXQ0KFtdLCBbcC54LCBwLnksIHosIDFdLCBwaXhlbFBvc01hdHJpeCk7XG4gICAgcmV0dXJuIG5ldyBQb2ludChwb2ludFswXSAvIHBvaW50WzNdLCBwb2ludFsxXSAvIHBvaW50WzNdKTtcbn1cblxuY29uc3Qgb3JpZ2luID0gdmVjMy5mcm9tVmFsdWVzKDAsIDAsIDApO1xuY29uc3QgdXAgPSB2ZWMzLmZyb21WYWx1ZXMoMCwgMCwgMSk7XG5cbmZ1bmN0aW9uIGludGVyc2VjdEF0SGVpZ2h0KHI6IFJheSwgejogbnVtYmVyKTogUG9pbnQge1xuICAgIGNvbnN0IGludGVyc2VjdGlvblB0ID0gdmVjMy5jcmVhdGUoKTtcbiAgICBvcmlnaW5bMl0gPSB6O1xuICAgIGNvbnN0IGludGVyc2VjdHMgPSByLmludGVyc2VjdHNQbGFuZShvcmlnaW4sIHVwLCBpbnRlcnNlY3Rpb25QdCk7XG4gICAgYXNzZXJ0KGludGVyc2VjdHMsICd0aWxlc3BhY2VQb2ludCBzaG91bGQgYWx3YXlzIGJlIGJlbG93IGhvcml6b24sIGFuZCBzaW5jZSBjYW1lcmEgY2Fubm90IGhhdmUgcGl0Y2ggPjkwLCByYXkgc2hvdWxkIGFsd2F5cyBpbnRlcnNlY3QnKTtcblxuICAgIHJldHVybiBuZXcgUG9pbnQoaW50ZXJzZWN0aW9uUHRbMF0sIGludGVyc2VjdGlvblB0WzFdKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2lyY2xlU3R5bGVMYXllcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDaXJjbGVCdWNrZXQgZnJvbSAnLi9jaXJjbGVfYnVja2V0LmpzJztcblxuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcblxuaW1wb3J0IHR5cGUgSGVhdG1hcFN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvaGVhdG1hcF9zdHlsZV9sYXllci5qcyc7XG5cbmNsYXNzIEhlYXRtYXBCdWNrZXQgZXh0ZW5kcyBDaXJjbGVCdWNrZXQ8SGVhdG1hcFN0eWxlTGF5ZXI+IHtcbiAgICAvLyBOZWVkZWQgZm9yIGZsb3cgdG8gYWNjZXB0IG9taXQ6IFsnbGF5ZXJzJ10gYmVsb3csIGR1ZSB0b1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy80MjYyXG4gICAgbGF5ZXJzOiBBcnJheTxIZWF0bWFwU3R5bGVMYXllcj47XG59XG5cbnJlZ2lzdGVyKCdIZWF0bWFwQnVja2V0JywgSGVhdG1hcEJ1Y2tldCwge29taXQ6IFsnbGF5ZXJzJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgSGVhdG1hcEJ1Y2tldDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcblxuZXhwb3J0IHR5cGUgU2l6ZSA9IHtcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyXG59O1xuXG50eXBlIFBvaW50ID0ge1xuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXJcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUltYWdlKGltYWdlOiAqLCB7d2lkdGgsIGhlaWdodH06IFNpemUsIGNoYW5uZWxzOiBudW1iZXIsIGRhdGE/OiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogY2hhbm5lbHMpO1xuICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlcik7XG4gICAgfSBlbHNlIGlmIChkYXRhLmxlbmd0aCAhPT0gd2lkdGggKiBoZWlnaHQgKiBjaGFubmVscykge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbWlzbWF0Y2hlZCBpbWFnZSBzaXplJyk7XG4gICAgfVxuICAgIGltYWdlLndpZHRoID0gd2lkdGg7XG4gICAgaW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGltYWdlLmRhdGEgPSBkYXRhO1xuICAgIHJldHVybiBpbWFnZTtcbn1cblxuZnVuY3Rpb24gcmVzaXplSW1hZ2UoaW1hZ2U6ICosIHt3aWR0aCwgaGVpZ2h0fTogU2l6ZSwgY2hhbm5lbHM6IG51bWJlcikge1xuICAgIGlmICh3aWR0aCA9PT0gaW1hZ2Uud2lkdGggJiYgaGVpZ2h0ID09PSBpbWFnZS5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0ltYWdlID0gY3JlYXRlSW1hZ2Uoe30sIHt3aWR0aCwgaGVpZ2h0fSwgY2hhbm5lbHMpO1xuXG4gICAgY29weUltYWdlKGltYWdlLCBuZXdJbWFnZSwge3g6IDAsIHk6IDB9LCB7eDogMCwgeTogMH0sIHtcbiAgICAgICAgd2lkdGg6IE1hdGgubWluKGltYWdlLndpZHRoLCB3aWR0aCksXG4gICAgICAgIGhlaWdodDogTWF0aC5taW4oaW1hZ2UuaGVpZ2h0LCBoZWlnaHQpXG4gICAgfSwgY2hhbm5lbHMpO1xuXG4gICAgaW1hZ2Uud2lkdGggPSB3aWR0aDtcbiAgICBpbWFnZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgaW1hZ2UuZGF0YSA9IG5ld0ltYWdlLmRhdGE7XG59XG5cbmZ1bmN0aW9uIGNvcHlJbWFnZShzcmNJbWc6ICosIGRzdEltZzogKiwgc3JjUHQ6IFBvaW50LCBkc3RQdDogUG9pbnQsIHNpemU6IFNpemUsIGNoYW5uZWxzOiBudW1iZXIpIHtcbiAgICBpZiAoc2l6ZS53aWR0aCA9PT0gMCB8fCBzaXplLmhlaWdodCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZHN0SW1nO1xuICAgIH1cblxuICAgIGlmIChzaXplLndpZHRoID4gc3JjSW1nLndpZHRoIHx8XG4gICAgICAgIHNpemUuaGVpZ2h0ID4gc3JjSW1nLmhlaWdodCB8fFxuICAgICAgICBzcmNQdC54ID4gc3JjSW1nLndpZHRoIC0gc2l6ZS53aWR0aCB8fFxuICAgICAgICBzcmNQdC55ID4gc3JjSW1nLmhlaWdodCAtIHNpemUuaGVpZ2h0KSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2Ugc291cmNlIGNvb3JkaW5hdGVzIGZvciBpbWFnZSBjb3B5Jyk7XG4gICAgfVxuXG4gICAgaWYgKHNpemUud2lkdGggPiBkc3RJbWcud2lkdGggfHxcbiAgICAgICAgc2l6ZS5oZWlnaHQgPiBkc3RJbWcuaGVpZ2h0IHx8XG4gICAgICAgIGRzdFB0LnggPiBkc3RJbWcud2lkdGggLSBzaXplLndpZHRoIHx8XG4gICAgICAgIGRzdFB0LnkgPiBkc3RJbWcuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBkZXN0aW5hdGlvbiBjb29yZGluYXRlcyBmb3IgaW1hZ2UgY29weScpO1xuICAgIH1cblxuICAgIGNvbnN0IHNyY0RhdGEgPSBzcmNJbWcuZGF0YTtcbiAgICBjb25zdCBkc3REYXRhID0gZHN0SW1nLmRhdGE7XG5cbiAgICBhc3NlcnQoc3JjRGF0YSAhPT0gZHN0RGF0YSk7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgY29uc3Qgc3JjT2Zmc2V0ID0gKChzcmNQdC55ICsgeSkgKiBzcmNJbWcud2lkdGggKyBzcmNQdC54KSAqIGNoYW5uZWxzO1xuICAgICAgICBjb25zdCBkc3RPZmZzZXQgPSAoKGRzdFB0LnkgKyB5KSAqIGRzdEltZy53aWR0aCArIGRzdFB0LngpICogY2hhbm5lbHM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZS53aWR0aCAqIGNoYW5uZWxzOyBpKyspIHtcbiAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0ICsgaV0gPSBzcmNEYXRhW3NyY09mZnNldCArIGldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkc3RJbWc7XG59XG5cbmV4cG9ydCBjbGFzcyBBbHBoYUltYWdlIHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIGRhdGE6IFVpbnQ4QXJyYXk7XG5cbiAgICBjb25zdHJ1Y3RvcihzaXplOiBTaXplLCBkYXRhPzogVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgICAgIGNyZWF0ZUltYWdlKHRoaXMsIHNpemUsIDEsIGRhdGEpO1xuICAgIH1cblxuICAgIHJlc2l6ZShzaXplOiBTaXplKSB7XG4gICAgICAgIHJlc2l6ZUltYWdlKHRoaXMsIHNpemUsIDEpO1xuICAgIH1cblxuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFscGhhSW1hZ2Uoe3dpZHRoOiB0aGlzLndpZHRoLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0fSwgbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvcHkoc3JjSW1nOiBBbHBoYUltYWdlLCBkc3RJbWc6IEFscGhhSW1hZ2UsIHNyY1B0OiBQb2ludCwgZHN0UHQ6IFBvaW50LCBzaXplOiBTaXplKSB7XG4gICAgICAgIGNvcHlJbWFnZShzcmNJbWcsIGRzdEltZywgc3JjUHQsIGRzdFB0LCBzaXplLCAxKTtcbiAgICB9XG59XG5cbi8vIE5vdCBwcmVtdWx0aXBsaWVkLCBiZWNhdXNlIEltYWdlRGF0YSBpcyBub3QgcHJlbXVsdGlwbGllZC5cbi8vIFVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCBtdXN0IGJlIHVzZWQgd2hlbiB1cGxvYWRpbmcgdG8gYSB0ZXh0dXJlLlxuZXhwb3J0IGNsYXNzIFJHQkFJbWFnZSB7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcblxuICAgIC8vIGRhdGEgbXVzdCBiZSBhIFVpbnQ4QXJyYXkgaW5zdGVhZCBvZiBVaW50OENsYW1wZWRBcnJheSBiZWNhdXNlIHRleEltYWdlMkQgZG9lcyBub3RcbiAgICAvLyBzdXBwb3J0IFVpbnQ4Q2xhbXBlZEFycmF5IGluIGFsbCBicm93c2Vyc1xuICAgIGRhdGE6IFVpbnQ4QXJyYXk7XG5cbiAgICBjb25zdHJ1Y3RvcihzaXplOiBTaXplLCBkYXRhPzogVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgICAgIGNyZWF0ZUltYWdlKHRoaXMsIHNpemUsIDQsIGRhdGEpO1xuICAgIH1cblxuICAgIHJlc2l6ZShzaXplOiBTaXplKSB7XG4gICAgICAgIHJlc2l6ZUltYWdlKHRoaXMsIHNpemUsIDQpO1xuICAgIH1cblxuICAgIHJlcGxhY2UoZGF0YTogVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5LCBjb3B5PzogYm9vbGVhbikge1xuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnNldChkYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KGRhdGEuYnVmZmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSR0JBSW1hZ2Uoe3dpZHRoOiB0aGlzLndpZHRoLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0fSwgbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNvcHkoc3JjSW1nOiBSR0JBSW1hZ2UgfCBJbWFnZURhdGEsIGRzdEltZzogUkdCQUltYWdlLCBzcmNQdDogUG9pbnQsIGRzdFB0OiBQb2ludCwgc2l6ZTogU2l6ZSkge1xuICAgICAgICBjb3B5SW1hZ2Uoc3JjSW1nLCBkc3RJbWcsIHNyY1B0LCBkc3RQdCwgc2l6ZSwgNCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignQWxwaGFJbWFnZScsIEFscGhhSW1hZ2UpO1xucmVnaXN0ZXIoJ1JHQkFJbWFnZScsIFJHQkFJbWFnZSk7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdC5qcyc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcblxuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuXG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwiaGVhdG1hcC1yYWRpdXNcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJoZWF0bWFwLXdlaWdodFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImhlYXRtYXAtaW50ZW5zaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJoZWF0bWFwLWNvbG9yXCI6IENvbG9yUmFtcFByb3BlcnR5LFxuICAgIFwiaGVhdG1hcC1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJoZWF0bWFwLXJhZGl1c1wiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLXJhZGl1c1wiXSksXG4gICAgXCJoZWF0bWFwLXdlaWdodFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLXdlaWdodFwiXSksXG4gICAgXCJoZWF0bWFwLWludGVuc2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGVhdG1hcFwiXVtcImhlYXRtYXAtaW50ZW5zaXR5XCJdKSxcbiAgICBcImhlYXRtYXAtY29sb3JcIjogbmV3IENvbG9yUmFtcFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLWNvbG9yXCJdKSxcbiAgICBcImhlYXRtYXAtb3BhY2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGVhdG1hcFwiXVtcImhlYXRtYXAtb3BhY2l0eVwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtSR0JBSW1hZ2V9IGZyb20gJy4vaW1hZ2UuanMnO1xuaW1wb3J0IHtpc1Bvd2VyT2ZUd299IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZVByb3BlcnR5RXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcblxuZXhwb3J0IHR5cGUgQ29sb3JSYW1wUGFyYW1zID0ge1xuICAgIGV4cHJlc3Npb246IFN0eWxlUHJvcGVydHlFeHByZXNzaW9uO1xuICAgIGV2YWx1YXRpb25LZXk6IHN0cmluZztcbiAgICByZXNvbHV0aW9uPzogbnVtYmVyO1xuICAgIGltYWdlPzogUkdCQUltYWdlO1xuICAgIGNsaXBzPzogQXJyYXk8T2JqZWN0Pjtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbiBleHByZXNzaW9uIHRoYXQgc2hvdWxkIGV2YWx1YXRlIHRvIGEgY29sb3IgcmFtcCxcbiAqIHJldHVybiBhIFJHQkEgaW1hZ2UgcmVwcmVzZW50aW5nIHRoYXQgcmFtcCBleHByZXNzaW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJDb2xvclJhbXAocGFyYW1zOiBDb2xvclJhbXBQYXJhbXMpOiBSR0JBSW1hZ2Uge1xuICAgIGNvbnN0IGV2YWx1YXRpb25HbG9iYWxzID0ge307XG4gICAgY29uc3Qgd2lkdGggPSBwYXJhbXMucmVzb2x1dGlvbiB8fCAyNTY7XG4gICAgY29uc3QgaGVpZ2h0ID0gcGFyYW1zLmNsaXBzID8gcGFyYW1zLmNsaXBzLmxlbmd0aCA6IDE7XG4gICAgY29uc3QgaW1hZ2UgPSBwYXJhbXMuaW1hZ2UgfHwgbmV3IFJHQkFJbWFnZSh7d2lkdGgsIGhlaWdodH0pO1xuXG4gICAgYXNzZXJ0KGlzUG93ZXJPZlR3byh3aWR0aCkpO1xuXG4gICAgY29uc3QgcmVuZGVyUGl4ZWwgPSAoc3RyaWRlLCBpbmRleCwgcHJvZ3Jlc3MpID0+IHtcbiAgICAgICAgZXZhbHVhdGlvbkdsb2JhbHNbcGFyYW1zLmV2YWx1YXRpb25LZXldID0gcHJvZ3Jlc3M7XG4gICAgICAgIGNvbnN0IHB4Q29sb3IgPSBwYXJhbXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSgoZXZhbHVhdGlvbkdsb2JhbHM6IGFueSkpO1xuICAgICAgICAvLyB0aGUgY29sb3JzIGFyZSBiZWluZyB1bnByZW11bHRpcGxpZWQgYmVjYXVzZSBDb2xvciB1c2VzXG4gICAgICAgIC8vIHByZW11bHRpcGxpZWQgdmFsdWVzLCBhbmQgdGhlIFRleHR1cmUgY2xhc3MgZXhwZWN0cyB1bnByZW11bHRpcGxpZWQgb25lc1xuICAgICAgICBpbWFnZS5kYXRhW3N0cmlkZSArIGluZGV4ICsgMF0gPSBNYXRoLmZsb29yKHB4Q29sb3IuciAqIDI1NSAvIHB4Q29sb3IuYSk7XG4gICAgICAgIGltYWdlLmRhdGFbc3RyaWRlICsgaW5kZXggKyAxXSA9IE1hdGguZmxvb3IocHhDb2xvci5nICogMjU1IC8gcHhDb2xvci5hKTtcbiAgICAgICAgaW1hZ2UuZGF0YVtzdHJpZGUgKyBpbmRleCArIDJdID0gTWF0aC5mbG9vcihweENvbG9yLmIgKiAyNTUgLyBweENvbG9yLmEpO1xuICAgICAgICBpbWFnZS5kYXRhW3N0cmlkZSArIGluZGV4ICsgM10gPSBNYXRoLmZsb29yKHB4Q29sb3IuYSAqIDI1NSk7XG4gICAgfTtcblxuICAgIGlmICghcGFyYW1zLmNsaXBzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IHdpZHRoOyBpKyssIGogKz0gNCkge1xuICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBpIC8gKHdpZHRoIC0gMSk7XG5cbiAgICAgICAgICAgIHJlbmRlclBpeGVsKDAsIGosIHByb2dyZXNzKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGNsaXAgPSAwLCBzdHJpZGUgPSAwOyBjbGlwIDwgaGVpZ2h0OyArK2NsaXAsIHN0cmlkZSArPSB3aWR0aCAqIDQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IHdpZHRoOyBpKyssIGogKz0gNCkge1xuICAgICAgICAgICAgICAgIC8vIFJlbWFwIHByb2dyZXNzIGJldHdlZW4gY2xpcHNcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IGkgLyAod2lkdGggLSAxKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBwYXJhbXMuY2xpcHNbY2xpcF07XG4gICAgICAgICAgICAgICAgY29uc3QgZXZhbHVhdGlvblByb2dyZXNzID0gc3RhcnQgKiAoMSAtIHByb2dyZXNzKSArIGVuZCAqIHByb2dyZXNzO1xuICAgICAgICAgICAgICAgIHJlbmRlclBpeGVsKHN0cmlkZSwgaiwgZXZhbHVhdGlvblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbWFnZTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyLmpzJztcblxuaW1wb3J0IEhlYXRtYXBCdWNrZXQgZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQvaGVhdG1hcF9idWNrZXQuanMnO1xuaW1wb3J0IHtSR0JBSW1hZ2V9IGZyb20gJy4uLy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9oZWF0bWFwX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHtyZW5kZXJDb2xvclJhbXB9IGZyb20gJy4uLy4uL3V0aWwvY29sb3JfcmFtcC5qcyc7XG5pbXBvcnQge1RyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZH0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge3F1ZXJ5SW50ZXJzZWN0c0NpcmNsZX0gZnJvbSAnLi9jaXJjbGVfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHtnZXRNYXhpbXVtUGFpbnRWYWx1ZX0gZnJvbSAnLi4vcXVlcnlfdXRpbHMuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgdHlwZSB7QnVja2V0LCBCdWNrZXRQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBUZXh0dXJlIGZyb20gJy4uLy4uL3JlbmRlci90ZXh0dXJlLmpzJztcbmltcG9ydCB0eXBlIEZyYW1lYnVmZmVyIGZyb20gJy4uLy4uL2dsL2ZyYW1lYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHtQYWludFByb3BzfSBmcm9tICcuL2hlYXRtYXBfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCBQcm9ncmFtQ29uZmlndXJhdGlvbiBmcm9tICcuLi8uLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZXNwYWNlUXVlcnlHZW9tZXRyeX0gZnJvbSAnLi4vcXVlcnlfZ2VvbWV0cnkuanMnO1xuaW1wb3J0IHR5cGUge0RFTVNhbXBsZXJ9IGZyb20gJy4uLy4uL3RlcnJhaW4vZWxldmF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGV9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSBDaXJjbGVCdWNrZXQgZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldC5qcyc7XG5cbmNsYXNzIEhlYXRtYXBTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG5cbiAgICBoZWF0bWFwRmJvOiA/RnJhbWVidWZmZXI7XG4gICAgY29sb3JSYW1wOiBSR0JBSW1hZ2U7XG4gICAgY29sb3JSYW1wVGV4dHVyZTogP1RleHR1cmU7XG5cbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjcmVhdGVCdWNrZXQocGFyYW1ldGVyczogQnVja2V0UGFyYW1ldGVyczwqPikge1xuICAgICAgICByZXR1cm4gbmV3IEhlYXRtYXBCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG5cbiAgICAgICAgLy8gbWFrZSBzdXJlIGNvbG9yIHJhbXAgdGV4dHVyZSBpcyBnZW5lcmF0ZWQgZm9yIGRlZmF1bHQgaGVhdG1hcCBjb2xvciB0b29cbiAgICAgICAgdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2hlYXRtYXAtY29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDb2xvclJhbXAoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVDb2xvclJhbXAoKSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbJ2hlYXRtYXAtY29sb3InXS52YWx1ZS5leHByZXNzaW9uO1xuICAgICAgICB0aGlzLmNvbG9yUmFtcCA9IHJlbmRlckNvbG9yUmFtcCh7XG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgZXZhbHVhdGlvbktleTogJ2hlYXRtYXBEZW5zaXR5JyxcbiAgICAgICAgICAgIGltYWdlOiB0aGlzLmNvbG9yUmFtcFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb2xvclJhbXBUZXh0dXJlID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLmhlYXRtYXBGYm8pIHtcbiAgICAgICAgICAgIHRoaXMuaGVhdG1hcEZiby5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmhlYXRtYXBGYm8gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoYnVja2V0OiBCdWNrZXQpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2hlYXRtYXAtcmFkaXVzJywgdGhpcywgKChidWNrZXQ6IGFueSk6IENpcmNsZUJ1Y2tldDwqPikpO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUocXVlcnlHZW9tZXRyeTogVGlsZXNwYWNlUXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxQb3NNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbkhlbHBlcjogP0RFTVNhbXBsZXIpOiBib29sZWFuIHtcblxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wYWludC5nZXQoJ2hlYXRtYXAtcmFkaXVzJykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5SW50ZXJzZWN0c0NpcmNsZShcbiAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnksIGdlb21ldHJ5LCB0cmFuc2Zvcm0sIHBpeGVsUG9zTWF0cml4LCBlbGV2YXRpb25IZWxwZXIsXG4gICAgICAgICAgICB0cnVlLCB0cnVlLCBuZXcgUG9pbnQoMCwgMCksIHNpemUpO1xuICAgIH1cblxuICAgIGhhc09mZnNjcmVlblBhc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhaW50LmdldCgnaGVhdG1hcC1vcGFjaXR5JykgIT09IDAgJiYgdGhpcy52aXNpYmlsaXR5ICE9PSAnbm9uZSc7XG4gICAgfVxuXG4gICAgZ2V0UHJvZ3JhbUlkcygpIHtcbiAgICAgICAgcmV0dXJuIFsnaGVhdG1hcCcsICdoZWF0bWFwVGV4dHVyZSddO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1Db25maWd1cmF0aW9uKHpvb206IG51bWJlcik6IFByb2dyYW1Db25maWd1cmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvbih0aGlzLCB6b29tKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlYXRtYXBTdHlsZUxheWVyO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiPixcbiAgICBcImhpbGxzaGFkZS1leGFnZ2VyYXRpb25cIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcImhpbGxzaGFkZS1zaGFkb3ctY29sb3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Q29sb3I+LFxuICAgIFwiaGlsbHNoYWRlLWhpZ2hsaWdodC1jb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJoaWxsc2hhZGUtYWNjZW50LWNvbG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PENvbG9yPixcbnx9O1xuXG5jb25zdCBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvblwiXSksXG4gICAgXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWFuY2hvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3JcIl0pLFxuICAgIFwiaGlsbHNoYWRlLWV4YWdnZXJhdGlvblwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLWV4YWdnZXJhdGlvblwiXSksXG4gICAgXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCJdKSxcbiAgICBcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIl0pLFxuICAgIFwiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXIuanMnO1xuXG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL2hpbGxzaGFkZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7VHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIFBvc3NpYmx5RXZhbHVhdGVkfSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUge1BhaW50UHJvcHN9IGZyb20gJy4vaGlsbHNoYWRlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgUHJvZ3JhbUNvbmZpZ3VyYXRpb24gZnJvbSAnLi4vLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMnO1xuXG5jbGFzcyBIaWxsc2hhZGVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgaGFzT2Zmc2NyZWVuUGFzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFpbnQuZ2V0KCdoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uJykgIT09IDAgJiYgdGhpcy52aXNpYmlsaXR5ICE9PSAnbm9uZSc7XG4gICAgfVxuXG4gICAgZ2V0UHJvZ3JhbUlkcygpIHtcbiAgICAgICAgcmV0dXJuIFsnaGlsbHNoYWRlJywgJ2hpbGxzaGFkZVByZXBhcmUnXTtcbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtQ29uZmlndXJhdGlvbih6b29tOiBudW1iZXIpOiBQcm9ncmFtQ29uZmlndXJhdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb24odGhpcywgem9vbSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIaWxsc2hhZGVTdHlsZUxheWVyO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7Y3JlYXRlTGF5b3V0fSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmNvbnN0IGxheW91dCA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3BvcycsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9XG5dLCA0KTtcblxuZXhwb3J0IGRlZmF1bHQgbGF5b3V0O1xuZXhwb3J0IGNvbnN0IHttZW1iZXJzLCBzaXplLCBhbGlnbm1lbnR9ID0gbGF5b3V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVhcmN1dDtcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBlYXJjdXQ7XG5cbmZ1bmN0aW9uIGVhcmN1dChkYXRhLCBob2xlSW5kaWNlcywgZGltKSB7XG5cbiAgICBkaW0gPSBkaW0gfHwgMjtcblxuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGgsXG4gICAgICAgIG91dGVyTm9kZSA9IGxpbmtlZExpc3QoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSwgdHJ1ZSksXG4gICAgICAgIHRyaWFuZ2xlcyA9IFtdO1xuXG4gICAgaWYgKCFvdXRlck5vZGUgfHwgb3V0ZXJOb2RlLm5leHQgPT09IG91dGVyTm9kZS5wcmV2KSByZXR1cm4gdHJpYW5nbGVzO1xuXG4gICAgdmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIGludlNpemU7XG5cbiAgICBpZiAoaGFzSG9sZXMpIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSk7XG5cbiAgICAvLyBpZiB0aGUgc2hhcGUgaXMgbm90IHRvbyBzaW1wbGUsIHdlJ2xsIHVzZSB6LW9yZGVyIGN1cnZlIGhhc2ggbGF0ZXI7IGNhbGN1bGF0ZSBwb2x5Z29uIGJib3hcbiAgICBpZiAoZGF0YS5sZW5ndGggPiA4MCAqIGRpbSkge1xuICAgICAgICBtaW5YID0gbWF4WCA9IGRhdGFbMF07XG4gICAgICAgIG1pblkgPSBtYXhZID0gZGF0YVsxXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltKSB7XG4gICAgICAgICAgICB4ID0gZGF0YVtpXTtcbiAgICAgICAgICAgIHkgPSBkYXRhW2kgKyAxXTtcbiAgICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5O1xuICAgICAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtaW5YLCBtaW5ZIGFuZCBpbnZTaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvblxuICAgICAgICBpbnZTaXplID0gTWF0aC5tYXgobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKTtcbiAgICAgICAgaW52U2l6ZSA9IGludlNpemUgIT09IDAgPyAxIC8gaW52U2l6ZSA6IDA7XG4gICAgfVxuXG4gICAgZWFyY3V0TGlua2VkKG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xuXG4gICAgcmV0dXJuIHRyaWFuZ2xlcztcbn1cblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlKSB7XG4gICAgdmFyIGksIGxhc3Q7XG5cbiAgICBpZiAoY2xvY2t3aXNlID09PSAoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pID4gMCkpIHtcbiAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH1cblxuICAgIGlmIChsYXN0ICYmIGVxdWFscyhsYXN0LCBsYXN0Lm5leHQpKSB7XG4gICAgICAgIHJlbW92ZU5vZGUobGFzdCk7XG4gICAgICAgIGxhc3QgPSBsYXN0Lm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3Q7XG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkge1xuICAgIGlmICghc3RhcnQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoIWVuZCkgZW5kID0gc3RhcnQ7XG5cbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBhZ2FpbjtcbiAgICBkbyB7XG4gICAgICAgIGFnYWluID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFwLnN0ZWluZXIgJiYgKGVxdWFscyhwLCBwLm5leHQpIHx8IGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID09PSAwKSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHAgPSBlbmQgPSBwLnByZXY7XG4gICAgICAgICAgICBpZiAocCA9PT0gcC5uZXh0KSBicmVhaztcbiAgICAgICAgICAgIGFnYWluID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7XG5cbiAgICByZXR1cm4gZW5kO1xufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCBwYXNzKSB7XG4gICAgaWYgKCFlYXIpIHJldHVybjtcblxuICAgIC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbiAgICBpZiAoIXBhc3MgJiYgaW52U2l6ZSkgaW5kZXhDdXJ2ZShlYXIsIG1pblgsIG1pblksIGludlNpemUpO1xuXG4gICAgdmFyIHN0b3AgPSBlYXIsXG4gICAgICAgIHByZXYsIG5leHQ7XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcbiAgICB3aGlsZSAoZWFyLnByZXYgIT09IGVhci5uZXh0KSB7XG4gICAgICAgIHByZXYgPSBlYXIucHJldjtcbiAgICAgICAgbmV4dCA9IGVhci5uZXh0O1xuXG4gICAgICAgIGlmIChpbnZTaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSA6IGlzRWFyKGVhcikpIHtcbiAgICAgICAgICAgIC8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwcmV2LmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goZWFyLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gobmV4dC5pIC8gZGltKTtcblxuICAgICAgICAgICAgcmVtb3ZlTm9kZShlYXIpO1xuXG4gICAgICAgICAgICAvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0ZXggbGVhZHMgdG8gbGVzcyBzbGl2ZXIgdHJpYW5nbGVzXG4gICAgICAgICAgICBlYXIgPSBuZXh0Lm5leHQ7XG4gICAgICAgICAgICBzdG9wID0gbmV4dC5uZXh0O1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVhciA9IG5leHQ7XG5cbiAgICAgICAgLy8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcbiAgICAgICAgaWYgKGVhciA9PT0gc3RvcCkge1xuICAgICAgICAgICAgLy8gdHJ5IGZpbHRlcmluZyBwb2ludHMgYW5kIHNsaWNpbmcgYWdhaW5cbiAgICAgICAgICAgIGlmICghcGFzcykge1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDEpO1xuXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgY3VyaW5nIGFsbCBzbWFsbCBzZWxmLWludGVyc2VjdGlvbnMgbG9jYWxseVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgZWFyID0gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzLCBkaW0pO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAyKTtcblxuICAgICAgICAgICAgLy8gYXMgYSBsYXN0IHJlc29ydCwgdHJ5IHNwbGl0dGluZyB0aGUgcmVtYWluaW5nIHBvbHlnb24gaW50byB0d29cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMikge1xuICAgICAgICAgICAgICAgIHNwbGl0RWFyY3V0KGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gY2hlY2sgd2hldGhlciBhIHBvbHlnb24gbm9kZSBmb3JtcyBhIHZhbGlkIGVhciB3aXRoIGFkamFjZW50IG5vZGVzXG5mdW5jdGlvbiBpc0VhcihlYXIpIHtcbiAgICB2YXIgYSA9IGVhci5wcmV2LFxuICAgICAgICBiID0gZWFyLFxuICAgICAgICBjID0gZWFyLm5leHQ7XG5cbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cbiAgICAvLyBub3cgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgb3RoZXIgcG9pbnRzIGluc2lkZSB0aGUgcG90ZW50aWFsIGVhclxuICAgIHZhciBwID0gZWFyLm5leHQubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBlYXIucHJldikge1xuICAgICAgICBpZiAocG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIGludlNpemUpIHtcbiAgICB2YXIgYSA9IGVhci5wcmV2LFxuICAgICAgICBiID0gZWFyLFxuICAgICAgICBjID0gZWFyLm5leHQ7XG5cbiAgICBpZiAoYXJlYShhLCBiLCBjKSA+PSAwKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cbiAgICAvLyB0cmlhbmdsZSBiYm94OyBtaW4gJiBtYXggYXJlIGNhbGN1bGF0ZWQgbGlrZSB0aGlzIGZvciBzcGVlZFxuICAgIHZhciBtaW5UWCA9IGEueCA8IGIueCA/IChhLnggPCBjLnggPyBhLnggOiBjLngpIDogKGIueCA8IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1pblRZID0gYS55IDwgYi55ID8gKGEueSA8IGMueSA/IGEueSA6IGMueSkgOiAoYi55IDwgYy55ID8gYi55IDogYy55KSxcbiAgICAgICAgbWF4VFggPSBhLnggPiBiLnggPyAoYS54ID4gYy54ID8gYS54IDogYy54KSA6IChiLnggPiBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtYXhUWSA9IGEueSA+IGIueSA/IChhLnkgPiBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA+IGMueSA/IGIueSA6IGMueSk7XG5cbiAgICAvLyB6LW9yZGVyIHJhbmdlIGZvciB0aGUgY3VycmVudCB0cmlhbmdsZSBiYm94O1xuICAgIHZhciBtaW5aID0gek9yZGVyKG1pblRYLCBtaW5UWSwgbWluWCwgbWluWSwgaW52U2l6ZSksXG4gICAgICAgIG1heFogPSB6T3JkZXIobWF4VFgsIG1heFRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHZhciBwID0gZWFyLnByZXZaLFxuICAgICAgICBuID0gZWFyLm5leHRaO1xuXG4gICAgLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gYm90aCBkaXJlY3Rpb25zXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblogJiYgbiAmJiBuLnogPD0gbWF4Wikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAucHJldlo7XG5cbiAgICAgICAgaWYgKG4gIT09IGVhci5wcmV2ICYmIG4gIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgbi54LCBuLnkpICYmXG4gICAgICAgICAgICBhcmVhKG4ucHJldiwgbiwgbi5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIG4gPSBuLm5leHRaO1xuICAgIH1cblxuICAgIC8vIGxvb2sgZm9yIHJlbWFpbmluZyBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuICAgIH1cblxuICAgIC8vIGxvb2sgZm9yIHJlbWFpbmluZyBwb2ludHMgaW4gaW5jcmVhc2luZyB6LW9yZGVyXG4gICAgd2hpbGUgKG4gJiYgbi56IDw9IG1heFopIHtcbiAgICAgICAgaWYgKG4gIT09IGVhci5wcmV2ICYmIG4gIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgbi54LCBuLnkpICYmXG4gICAgICAgICAgICBhcmVhKG4ucHJldiwgbiwgbi5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIG4gPSBuLm5leHRaO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBnbyB0aHJvdWdoIGFsbCBwb2x5Z29uIG5vZGVzIGFuZCBjdXJlIHNtYWxsIGxvY2FsIHNlbGYtaW50ZXJzZWN0aW9uc1xuZnVuY3Rpb24gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhzdGFydCwgdHJpYW5nbGVzLCBkaW0pIHtcbiAgICB2YXIgcCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGEgPSBwLnByZXYsXG4gICAgICAgICAgICBiID0gcC5uZXh0Lm5leHQ7XG5cbiAgICAgICAgaWYgKCFlcXVhbHMoYSwgYikgJiYgaW50ZXJzZWN0cyhhLCBwLCBwLm5leHQsIGIpICYmIGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSkge1xuXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChhLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocC5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGIuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSB0d28gbm9kZXMgaW52b2x2ZWRcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICByZW1vdmVOb2RlKHAubmV4dCk7XG5cbiAgICAgICAgICAgIHAgPSBzdGFydCA9IGI7XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gZmlsdGVyUG9pbnRzKHApO1xufVxuXG4vLyB0cnkgc3BsaXR0aW5nIHBvbHlnb24gaW50byB0d28gYW5kIHRyaWFuZ3VsYXRlIHRoZW0gaW5kZXBlbmRlbnRseVxuZnVuY3Rpb24gc3BsaXRFYXJjdXQoc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgLy8gbG9vayBmb3IgYSB2YWxpZCBkaWFnb25hbCB0aGF0IGRpdmlkZXMgdGhlIHBvbHlnb24gaW50byB0d29cbiAgICB2YXIgYSA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGIgPSBhLm5leHQubmV4dDtcbiAgICAgICAgd2hpbGUgKGIgIT09IGEucHJldikge1xuICAgICAgICAgICAgaWYgKGEuaSAhPT0gYi5pICYmIGlzVmFsaWREaWFnb25hbChhLCBiKSkge1xuICAgICAgICAgICAgICAgIC8vIHNwbGl0IHRoZSBwb2x5Z29uIGluIHR3byBieSB0aGUgZGlhZ29uYWxcbiAgICAgICAgICAgICAgICB2YXIgYyA9IHNwbGl0UG9seWdvbihhLCBiKTtcblxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciBjb2xpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG4gICAgICAgICAgICAgICAgYSA9IGZpbHRlclBvaW50cyhhLCBhLm5leHQpO1xuICAgICAgICAgICAgICAgIGMgPSBmaWx0ZXJQb2ludHMoYywgYy5uZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmXG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGEsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGIgPSBiLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGEubmV4dDtcbiAgICB9IHdoaWxlIChhICE9PSBzdGFydCk7XG59XG5cbi8vIGxpbmsgZXZlcnkgaG9sZSBpbnRvIHRoZSBvdXRlciBsb29wLCBwcm9kdWNpbmcgYSBzaW5nbGUtcmluZyBwb2x5Z29uIHdpdGhvdXQgaG9sZXNcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSkge1xuICAgIHZhciBxdWV1ZSA9IFtdLFxuICAgICAgICBpLCBsZW4sIHN0YXJ0LCBlbmQsIGxpc3Q7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICBsaXN0ID0gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlKTtcbiAgICAgICAgaWYgKGxpc3QgPT09IGxpc3QubmV4dCkgbGlzdC5zdGVpbmVyID0gdHJ1ZTtcbiAgICAgICAgcXVldWUucHVzaChnZXRMZWZ0bW9zdChsaXN0KSk7XG4gICAgfVxuXG4gICAgcXVldWUuc29ydChjb21wYXJlWCk7XG5cbiAgICAvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuICAgIGZvciAoaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlKHF1ZXVlW2ldLCBvdXRlck5vZGUpO1xuICAgICAgICBvdXRlck5vZGUgPSBmaWx0ZXJQb2ludHMob3V0ZXJOb2RlLCBvdXRlck5vZGUubmV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dGVyTm9kZTtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVgoYSwgYikge1xuICAgIHJldHVybiBhLnggLSBiLng7XG59XG5cbi8vIGZpbmQgYSBicmlkZ2UgYmV0d2VlbiB2ZXJ0aWNlcyB0aGF0IGNvbm5lY3RzIGhvbGUgd2l0aCBhbiBvdXRlciByaW5nIGFuZCBhbmQgbGluayBpdFxuZnVuY3Rpb24gZWxpbWluYXRlSG9sZShob2xlLCBvdXRlck5vZGUpIHtcbiAgICB2YXIgYnJpZGdlID0gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKTtcbiAgICBpZiAoIWJyaWRnZSkge1xuICAgICAgICByZXR1cm4gb3V0ZXJOb2RlO1xuICAgIH1cblxuICAgIHZhciBicmlkZ2VSZXZlcnNlID0gc3BsaXRQb2x5Z29uKGJyaWRnZSwgaG9sZSk7XG5cbiAgICAvLyBmaWx0ZXIgY29sbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcbiAgICB2YXIgZmlsdGVyZWRCcmlkZ2UgPSBmaWx0ZXJQb2ludHMoYnJpZGdlLCBicmlkZ2UubmV4dCk7XG4gICAgZmlsdGVyUG9pbnRzKGJyaWRnZVJldmVyc2UsIGJyaWRnZVJldmVyc2UubmV4dCk7XG5cbiAgICAvLyBDaGVjayBpZiBpbnB1dCBub2RlIHdhcyByZW1vdmVkIGJ5IHRoZSBmaWx0ZXJpbmdcbiAgICByZXR1cm4gb3V0ZXJOb2RlID09PSBicmlkZ2UgPyBmaWx0ZXJlZEJyaWRnZSA6IG91dGVyTm9kZTtcbn1cblxuLy8gRGF2aWQgRWJlcmx5J3MgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGEgYnJpZGdlIGJldHdlZW4gaG9sZSBhbmQgb3V0ZXIgcG9seWdvblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgdmFyIHAgPSBvdXRlck5vZGUsXG4gICAgICAgIGh4ID0gaG9sZS54LFxuICAgICAgICBoeSA9IGhvbGUueSxcbiAgICAgICAgcXggPSAtSW5maW5pdHksXG4gICAgICAgIG07XG5cbiAgICAvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XG4gICAgLy8gc2VnbWVudCdzIGVuZHBvaW50IHdpdGggbGVzc2VyIHggd2lsbCBiZSBwb3RlbnRpYWwgY29ubmVjdGlvbiBwb2ludFxuICAgIGRvIHtcbiAgICAgICAgaWYgKGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55KSB7XG4gICAgICAgICAgICB2YXIgeCA9IHAueCArIChoeSAtIHAueSkgKiAocC5uZXh0LnggLSBwLngpIC8gKHAubmV4dC55IC0gcC55KTtcbiAgICAgICAgICAgIGlmICh4IDw9IGh4ICYmIHggPiBxeCkge1xuICAgICAgICAgICAgICAgIHF4ID0geDtcbiAgICAgICAgICAgICAgICBpZiAoeCA9PT0gaHgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5ID09PSBwLnkpIHJldHVybiBwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAubmV4dC55KSByZXR1cm4gcC5uZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtID0gcC54IDwgcC5uZXh0LnggPyBwIDogcC5uZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gb3V0ZXJOb2RlKTtcblxuICAgIGlmICghbSkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAoaHggPT09IHF4KSByZXR1cm4gbTsgLy8gaG9sZSB0b3VjaGVzIG91dGVyIHNlZ21lbnQ7IHBpY2sgbGVmdG1vc3QgZW5kcG9pbnRcblxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIG9mIGhvbGUgcG9pbnQsIHNlZ21lbnQgaW50ZXJzZWN0aW9uIGFuZCBlbmRwb2ludDtcbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcbiAgICAvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBwb2ludCBvZiB0aGUgbWluaW11bSBhbmdsZSB3aXRoIHRoZSByYXkgYXMgY29ubmVjdGlvbiBwb2ludFxuXG4gICAgdmFyIHN0b3AgPSBtLFxuICAgICAgICBteCA9IG0ueCxcbiAgICAgICAgbXkgPSBtLnksXG4gICAgICAgIHRhbk1pbiA9IEluZmluaXR5LFxuICAgICAgICB0YW47XG5cbiAgICBwID0gbTtcblxuICAgIGRvIHtcbiAgICAgICAgaWYgKGh4ID49IHAueCAmJiBwLnggPj0gbXggJiYgaHggIT09IHAueCAmJlxuICAgICAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShoeSA8IG15ID8gaHggOiBxeCwgaHksIG14LCBteSwgaHkgPCBteSA/IHF4IDogaHgsIGh5LCBwLngsIHAueSkpIHtcblxuICAgICAgICAgICAgdGFuID0gTWF0aC5hYnMoaHkgLSBwLnkpIC8gKGh4IC0gcC54KTsgLy8gdGFuZ2VudGlhbFxuXG4gICAgICAgICAgICBpZiAobG9jYWxseUluc2lkZShwLCBob2xlKSAmJlxuICAgICAgICAgICAgICAgICh0YW4gPCB0YW5NaW4gfHwgKHRhbiA9PT0gdGFuTWluICYmIChwLnggPiBtLnggfHwgKHAueCA9PT0gbS54ICYmIHNlY3RvckNvbnRhaW5zU2VjdG9yKG0sIHApKSkpKSkge1xuICAgICAgICAgICAgICAgIG0gPSBwO1xuICAgICAgICAgICAgICAgIHRhbk1pbiA9IHRhbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RvcCk7XG5cbiAgICByZXR1cm4gbTtcbn1cblxuLy8gd2hldGhlciBzZWN0b3IgaW4gdmVydGV4IG0gY29udGFpbnMgc2VjdG9yIGluIHZlcnRleCBwIGluIHRoZSBzYW1lIGNvb3JkaW5hdGVzXG5mdW5jdGlvbiBzZWN0b3JDb250YWluc1NlY3RvcihtLCBwKSB7XG4gICAgcmV0dXJuIGFyZWEobS5wcmV2LCBtLCBwLnByZXYpIDwgMCAmJiBhcmVhKHAubmV4dCwgbSwgbS5uZXh0KSA8IDA7XG59XG5cbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbmZ1bmN0aW9uIGluZGV4Q3VydmUoc3RhcnQsIG1pblgsIG1pblksIGludlNpemUpIHtcbiAgICB2YXIgcCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAueiA9PT0gbnVsbCkgcC56ID0gek9yZGVyKHAueCwgcC55LCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgcC5wcmV2WiA9IHAucHJldjtcbiAgICAgICAgcC5uZXh0WiA9IHAubmV4dDtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICBwLnByZXZaLm5leHRaID0gbnVsbDtcbiAgICBwLnByZXZaID0gbnVsbDtcblxuICAgIHNvcnRMaW5rZWQocCk7XG59XG5cbi8vIFNpbW9uIFRhdGhhbSdzIGxpbmtlZCBsaXN0IG1lcmdlIHNvcnQgYWxnb3JpdGhtXG4vLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbFxuZnVuY3Rpb24gc29ydExpbmtlZChsaXN0KSB7XG4gICAgdmFyIGksIHAsIHEsIGUsIHRhaWwsIG51bU1lcmdlcywgcFNpemUsIHFTaXplLFxuICAgICAgICBpblNpemUgPSAxO1xuXG4gICAgZG8ge1xuICAgICAgICBwID0gbGlzdDtcbiAgICAgICAgbGlzdCA9IG51bGw7XG4gICAgICAgIHRhaWwgPSBudWxsO1xuICAgICAgICBudW1NZXJnZXMgPSAwO1xuXG4gICAgICAgIHdoaWxlIChwKSB7XG4gICAgICAgICAgICBudW1NZXJnZXMrKztcbiAgICAgICAgICAgIHEgPSBwO1xuICAgICAgICAgICAgcFNpemUgPSAwO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluU2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcFNpemUrKztcbiAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICBpZiAoIXEpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcVNpemUgPSBpblNpemU7XG5cbiAgICAgICAgICAgIHdoaWxlIChwU2l6ZSA+IDAgfHwgKHFTaXplID4gMCAmJiBxKSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHBTaXplICE9PSAwICYmIChxU2l6ZSA9PT0gMCB8fCAhcSB8fCBwLnogPD0gcS56KSkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcDtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHE7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBxU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0YWlsKSB0YWlsLm5leHRaID0gZTtcbiAgICAgICAgICAgICAgICBlbHNlIGxpc3QgPSBlO1xuXG4gICAgICAgICAgICAgICAgZS5wcmV2WiA9IHRhaWw7XG4gICAgICAgICAgICAgICAgdGFpbCA9IGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHAgPSBxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGFpbC5uZXh0WiA9IG51bGw7XG4gICAgICAgIGluU2l6ZSAqPSAyO1xuXG4gICAgfSB3aGlsZSAobnVtTWVyZ2VzID4gMSk7XG5cbiAgICByZXR1cm4gbGlzdDtcbn1cblxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgaW52ZXJzZSBvZiB0aGUgbG9uZ2VyIHNpZGUgb2YgZGF0YSBiYm94XG5mdW5jdGlvbiB6T3JkZXIoeCwgeSwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIC8vIGNvb3JkcyBhcmUgdHJhbnNmb3JtZWQgaW50byBub24tbmVnYXRpdmUgMTUtYml0IGludGVnZXIgcmFuZ2VcbiAgICB4ID0gMzI3NjcgKiAoeCAtIG1pblgpICogaW52U2l6ZTtcbiAgICB5ID0gMzI3NjcgKiAoeSAtIG1pblkpICogaW52U2l6ZTtcblxuICAgIHggPSAoeCB8ICh4IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gICAgeCA9ICh4IHwgKHggPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgICB4ID0gKHggfCAoeCA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICAgIHggPSAoeCB8ICh4IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgICB5ID0gKHkgfCAoeSA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeSA9ICh5IHwgKHkgPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB5ID0gKHkgfCAoeSA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgcmV0dXJuIHggfCAoeSA8PCAxKTtcbn1cblxuLy8gZmluZCB0aGUgbGVmdG1vc3Qgbm9kZSBvZiBhIHBvbHlnb24gcmluZ1xuZnVuY3Rpb24gZ2V0TGVmdG1vc3Qoc3RhcnQpIHtcbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBsZWZ0bW9zdCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAueCA8IGxlZnRtb3N0LnggfHwgKHAueCA9PT0gbGVmdG1vc3QueCAmJiBwLnkgPCBsZWZ0bW9zdC55KSkgbGVmdG1vc3QgPSBwO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHJldHVybiBsZWZ0bW9zdDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2ludCBsaWVzIHdpdGhpbiBhIGNvbnZleCB0cmlhbmdsZVxuZnVuY3Rpb24gcG9pbnRJblRyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSkge1xuICAgIHJldHVybiAoY3ggLSBweCkgKiAoYXkgLSBweSkgLSAoYXggLSBweCkgKiAoY3kgLSBweSkgPj0gMCAmJlxuICAgICAgICAgICAoYXggLSBweCkgKiAoYnkgLSBweSkgLSAoYnggLSBweCkgKiAoYXkgLSBweSkgPj0gMCAmJlxuICAgICAgICAgICAoYnggLSBweCkgKiAoY3kgLSBweSkgLSAoY3ggLSBweCkgKiAoYnkgLSBweSkgPj0gMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBkaWFnb25hbCBiZXR3ZWVuIHR3byBwb2x5Z29uIG5vZGVzIGlzIHZhbGlkIChsaWVzIGluIHBvbHlnb24gaW50ZXJpb3IpXG5mdW5jdGlvbiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikge1xuICAgIHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgIWludGVyc2VjdHNQb2x5Z29uKGEsIGIpICYmIC8vIGRvbmVzJ3QgaW50ZXJzZWN0IG90aGVyIGVkZ2VzXG4gICAgICAgICAgIChsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkgJiYgbWlkZGxlSW5zaWRlKGEsIGIpICYmIC8vIGxvY2FsbHkgdmlzaWJsZVxuICAgICAgICAgICAgKGFyZWEoYS5wcmV2LCBhLCBiLnByZXYpIHx8IGFyZWEoYSwgYi5wcmV2LCBiKSkgfHwgLy8gZG9lcyBub3QgY3JlYXRlIG9wcG9zaXRlLWZhY2luZyBzZWN0b3JzXG4gICAgICAgICAgICBlcXVhbHMoYSwgYikgJiYgYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPiAwICYmIGFyZWEoYi5wcmV2LCBiLCBiLm5leHQpID4gMCk7IC8vIHNwZWNpYWwgemVyby1sZW5ndGggY2FzZVxufVxuXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXG5mdW5jdGlvbiBhcmVhKHAsIHEsIHIpIHtcbiAgICByZXR1cm4gKHEueSAtIHAueSkgKiAoci54IC0gcS54KSAtIChxLnggLSBwLngpICogKHIueSAtIHEueSk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBwb2ludHMgYXJlIGVxdWFsXG5mdW5jdGlvbiBlcXVhbHMocDEsIHAyKSB7XG4gICAgcmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGludGVyc2VjdFxuZnVuY3Rpb24gaW50ZXJzZWN0cyhwMSwgcTEsIHAyLCBxMikge1xuICAgIHZhciBvMSA9IHNpZ24oYXJlYShwMSwgcTEsIHAyKSk7XG4gICAgdmFyIG8yID0gc2lnbihhcmVhKHAxLCBxMSwgcTIpKTtcbiAgICB2YXIgbzMgPSBzaWduKGFyZWEocDIsIHEyLCBwMSkpO1xuICAgIHZhciBvNCA9IHNpZ24oYXJlYShwMiwgcTIsIHExKSk7XG5cbiAgICBpZiAobzEgIT09IG8yICYmIG8zICE9PSBvNCkgcmV0dXJuIHRydWU7IC8vIGdlbmVyYWwgY2FzZVxuXG4gICAgaWYgKG8xID09PSAwICYmIG9uU2VnbWVudChwMSwgcDIsIHExKSkgcmV0dXJuIHRydWU7IC8vIHAxLCBxMSBhbmQgcDIgYXJlIGNvbGxpbmVhciBhbmQgcDIgbGllcyBvbiBwMXExXG4gICAgaWYgKG8yID09PSAwICYmIG9uU2VnbWVudChwMSwgcTIsIHExKSkgcmV0dXJuIHRydWU7IC8vIHAxLCBxMSBhbmQgcTIgYXJlIGNvbGxpbmVhciBhbmQgcTIgbGllcyBvbiBwMXExXG4gICAgaWYgKG8zID09PSAwICYmIG9uU2VnbWVudChwMiwgcDEsIHEyKSkgcmV0dXJuIHRydWU7IC8vIHAyLCBxMiBhbmQgcDEgYXJlIGNvbGxpbmVhciBhbmQgcDEgbGllcyBvbiBwMnEyXG4gICAgaWYgKG80ID09PSAwICYmIG9uU2VnbWVudChwMiwgcTEsIHEyKSkgcmV0dXJuIHRydWU7IC8vIHAyLCBxMiBhbmQgcTEgYXJlIGNvbGxpbmVhciBhbmQgcTEgbGllcyBvbiBwMnEyXG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIGZvciBjb2xsaW5lYXIgcG9pbnRzIHAsIHEsIHIsIGNoZWNrIGlmIHBvaW50IHEgbGllcyBvbiBzZWdtZW50IHByXG5mdW5jdGlvbiBvblNlZ21lbnQocCwgcSwgcikge1xuICAgIHJldHVybiBxLnggPD0gTWF0aC5tYXgocC54LCByLngpICYmIHEueCA+PSBNYXRoLm1pbihwLngsIHIueCkgJiYgcS55IDw9IE1hdGgubWF4KHAueSwgci55KSAmJiBxLnkgPj0gTWF0aC5taW4ocC55LCByLnkpO1xufVxuXG5mdW5jdGlvbiBzaWduKG51bSkge1xuICAgIHJldHVybiBudW0gPiAwID8gMSA6IG51bSA8IDAgPyAtMSA6IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5mdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbihhLCBiKSB7XG4gICAgdmFyIHAgPSBhO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAuaSAhPT0gYS5pICYmIHAubmV4dC5pICE9PSBhLmkgJiYgcC5pICE9PSBiLmkgJiYgcC5uZXh0LmkgIT09IGIuaSAmJlxuICAgICAgICAgICAgICAgIGludGVyc2VjdHMocCwgcC5uZXh0LCBhLCBiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpcyBsb2NhbGx5IGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbG9jYWxseUluc2lkZShhLCBiKSB7XG4gICAgcmV0dXJuIGFyZWEoYS5wcmV2LCBhLCBhLm5leHQpIDwgMCA/XG4gICAgICAgIGFyZWEoYSwgYiwgYS5uZXh0KSA+PSAwICYmIGFyZWEoYSwgYS5wcmV2LCBiKSA+PSAwIDpcbiAgICAgICAgYXJlYShhLCBiLCBhLnByZXYpIDwgMCB8fCBhcmVhKGEsIGEubmV4dCwgYikgPCAwO1xufVxuXG4vLyBjaGVjayBpZiB0aGUgbWlkZGxlIHBvaW50IG9mIGEgcG9seWdvbiBkaWFnb25hbCBpcyBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIG1pZGRsZUluc2lkZShhLCBiKSB7XG4gICAgdmFyIHAgPSBhLFxuICAgICAgICBpbnNpZGUgPSBmYWxzZSxcbiAgICAgICAgcHggPSAoYS54ICsgYi54KSAvIDIsXG4gICAgICAgIHB5ID0gKGEueSArIGIueSkgLyAyO1xuICAgIGRvIHtcbiAgICAgICAgaWYgKCgocC55ID4gcHkpICE9PSAocC5uZXh0LnkgPiBweSkpICYmIHAubmV4dC55ICE9PSBwLnkgJiZcbiAgICAgICAgICAgICAgICAocHggPCAocC5uZXh0LnggLSBwLngpICogKHB5IC0gcC55KSAvIChwLm5leHQueSAtIHAueSkgKyBwLngpKVxuICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBpbnNpZGU7XG59XG5cbi8vIGxpbmsgdHdvIHBvbHlnb24gdmVydGljZXMgd2l0aCBhIGJyaWRnZTsgaWYgdGhlIHZlcnRpY2VzIGJlbG9uZyB0byB0aGUgc2FtZSByaW5nLCBpdCBzcGxpdHMgcG9seWdvbiBpbnRvIHR3bztcbi8vIGlmIG9uZSBiZWxvbmdzIHRvIHRoZSBvdXRlciByaW5nIGFuZCBhbm90aGVyIHRvIGEgaG9sZSwgaXQgbWVyZ2VzIGl0IGludG8gYSBzaW5nbGUgcmluZ1xuZnVuY3Rpb24gc3BsaXRQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgYTIgPSBuZXcgTm9kZShhLmksIGEueCwgYS55KSxcbiAgICAgICAgYjIgPSBuZXcgTm9kZShiLmksIGIueCwgYi55KSxcbiAgICAgICAgYW4gPSBhLm5leHQsXG4gICAgICAgIGJwID0gYi5wcmV2O1xuXG4gICAgYS5uZXh0ID0gYjtcbiAgICBiLnByZXYgPSBhO1xuXG4gICAgYTIubmV4dCA9IGFuO1xuICAgIGFuLnByZXYgPSBhMjtcblxuICAgIGIyLm5leHQgPSBhMjtcbiAgICBhMi5wcmV2ID0gYjI7XG5cbiAgICBicC5uZXh0ID0gYjI7XG4gICAgYjIucHJldiA9IGJwO1xuXG4gICAgcmV0dXJuIGIyO1xufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gaW5zZXJ0Tm9kZShpLCB4LCB5LCBsYXN0KSB7XG4gICAgdmFyIHAgPSBuZXcgTm9kZShpLCB4LCB5KTtcblxuICAgIGlmICghbGFzdCkge1xuICAgICAgICBwLnByZXYgPSBwO1xuICAgICAgICBwLm5leHQgPSBwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcC5uZXh0ID0gbGFzdC5uZXh0O1xuICAgICAgICBwLnByZXYgPSBsYXN0O1xuICAgICAgICBsYXN0Lm5leHQucHJldiA9IHA7XG4gICAgICAgIGxhc3QubmV4dCA9IHA7XG4gICAgfVxuICAgIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlKHApIHtcbiAgICBwLm5leHQucHJldiA9IHAucHJldjtcbiAgICBwLnByZXYubmV4dCA9IHAubmV4dDtcblxuICAgIGlmIChwLnByZXZaKSBwLnByZXZaLm5leHRaID0gcC5uZXh0WjtcbiAgICBpZiAocC5uZXh0WikgcC5uZXh0Wi5wcmV2WiA9IHAucHJldlo7XG59XG5cbmZ1bmN0aW9uIE5vZGUoaSwgeCwgeSkge1xuICAgIC8vIHZlcnRleCBpbmRleCBpbiBjb29yZGluYXRlcyBhcnJheVxuICAgIHRoaXMuaSA9IGk7XG5cbiAgICAvLyB2ZXJ0ZXggY29vcmRpbmF0ZXNcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG5cbiAgICAvLyBwcmV2aW91cyBhbmQgbmV4dCB2ZXJ0ZXggbm9kZXMgaW4gYSBwb2x5Z29uIHJpbmdcbiAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgIHRoaXMubmV4dCA9IG51bGw7XG5cbiAgICAvLyB6LW9yZGVyIGN1cnZlIHZhbHVlXG4gICAgdGhpcy56ID0gbnVsbDtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcbiAgICB0aGlzLnByZXZaID0gbnVsbDtcbiAgICB0aGlzLm5leHRaID0gbnVsbDtcblxuICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG4gICAgdGhpcy5zdGVpbmVyID0gZmFsc2U7XG59XG5cbi8vIHJldHVybiBhIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwb2x5Z29uIGFyZWEgYW5kIGl0cyB0cmlhbmd1bGF0aW9uIGFyZWE7XG4vLyB1c2VkIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiB0cmlhbmd1bGF0aW9uXG5lYXJjdXQuZGV2aWF0aW9uID0gZnVuY3Rpb24gKGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0sIHRyaWFuZ2xlcykge1xuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDtcbiAgICB2YXIgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGg7XG5cbiAgICB2YXIgcG9seWdvbkFyZWEgPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIDAsIG91dGVyTGVuLCBkaW0pKTtcbiAgICBpZiAoaGFzSG9sZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgcG9seWdvbkFyZWEgLT0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0cmlhbmdsZXNBcmVhID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gdHJpYW5nbGVzW2ldICogZGltO1xuICAgICAgICB2YXIgYiA9IHRyaWFuZ2xlc1tpICsgMV0gKiBkaW07XG4gICAgICAgIHZhciBjID0gdHJpYW5nbGVzW2kgKyAyXSAqIGRpbTtcbiAgICAgICAgdHJpYW5nbGVzQXJlYSArPSBNYXRoLmFicyhcbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtjXSkgKiAoZGF0YVtiICsgMV0gLSBkYXRhW2EgKyAxXSkgLVxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2JdKSAqIChkYXRhW2MgKyAxXSAtIGRhdGFbYSArIDFdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvbHlnb25BcmVhID09PSAwICYmIHRyaWFuZ2xlc0FyZWEgPT09IDAgPyAwIDpcbiAgICAgICAgTWF0aC5hYnMoKHRyaWFuZ2xlc0FyZWEgLSBwb2x5Z29uQXJlYSkgLyBwb2x5Z29uQXJlYSk7XG59O1xuXG5mdW5jdGlvbiBzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0pIHtcbiAgICAgICAgc3VtICs9IChkYXRhW2pdIC0gZGF0YVtpXSkgKiAoZGF0YVtpICsgMV0gKyBkYXRhW2ogKyAxXSk7XG4gICAgICAgIGogPSBpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG4vLyB0dXJuIGEgcG9seWdvbiBpbiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGZvcm0gKGUuZy4gYXMgaW4gR2VvSlNPTikgaW50byBhIGZvcm0gRWFyY3V0IGFjY2VwdHNcbmVhcmN1dC5mbGF0dGVuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgZGltID0gZGF0YVswXVswXS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IHt2ZXJ0aWNlczogW10sIGhvbGVzOiBbXSwgZGltZW5zaW9uczogZGltfSxcbiAgICAgICAgaG9sZUluZGV4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgZGltOyBkKyspIHJlc3VsdC52ZXJ0aWNlcy5wdXNoKGRhdGFbaV1bal1bZF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgaG9sZUluZGV4ICs9IGRhdGFbaSAtIDFdLmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdC5ob2xlcy5wdXNoKGhvbGVJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHF1aWNrc2VsZWN0KGFyciwgaywgbGVmdCwgcmlnaHQsIGNvbXBhcmUpIHtcbiAgICBxdWlja3NlbGVjdFN0ZXAoYXJyLCBrLCBsZWZ0IHx8IDAsIHJpZ2h0IHx8IChhcnIubGVuZ3RoIC0gMSksIGNvbXBhcmUgfHwgZGVmYXVsdENvbXBhcmUpO1xufVxuXG5mdW5jdGlvbiBxdWlja3NlbGVjdFN0ZXAoYXJyLCBrLCBsZWZ0LCByaWdodCwgY29tcGFyZSkge1xuXG4gICAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7XG4gICAgICAgICAgICB2YXIgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICAgICAgICB2YXIgbSA9IGsgLSBsZWZ0ICsgMTtcbiAgICAgICAgICAgIHZhciB6ID0gTWF0aC5sb2cobik7XG4gICAgICAgICAgICB2YXIgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICAgICAgICB2YXIgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7XG4gICAgICAgICAgICB2YXIgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIG0gKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICB2YXIgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHF1aWNrc2VsZWN0U3RlcChhcnIsIGssIG5ld0xlZnQsIG5ld1JpZ2h0LCBjb21wYXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ID0gYXJyW2tdO1xuICAgICAgICB2YXIgaSA9IGxlZnQ7XG4gICAgICAgIHZhciBqID0gcmlnaHQ7XG5cbiAgICAgICAgc3dhcChhcnIsIGxlZnQsIGspO1xuICAgICAgICBpZiAoY29tcGFyZShhcnJbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyLCBsZWZ0LCByaWdodCk7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBqKSB7XG4gICAgICAgICAgICBzd2FwKGFyciwgaSwgaik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJbaV0sIHQpIDwgMCkgaSsrO1xuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyW2pdLCB0KSA+IDApIGotLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21wYXJlKGFycltsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyLCBsZWZ0LCBqKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgICBzd2FwKGFyciwgaiwgcmlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGogPD0gaykgbGVmdCA9IGogKyAxO1xuICAgICAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc3dhcChhcnIsIGksIGopIHtcbiAgICB2YXIgdG1wID0gYXJyW2ldO1xuICAgIGFycltpXSA9IGFycltqXTtcbiAgICBhcnJbal0gPSB0bXA7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgcXVpY2tzZWxlY3QgZnJvbSAncXVpY2tzZWxlY3QnO1xuXG5pbXBvcnQge2NhbGN1bGF0ZVNpZ25lZEFyZWF9IGZyb20gJy4vdXRpbC5qcyc7XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG4vLyBjbGFzc2lmaWVzIGFuIGFycmF5IG9mIHJpbmdzIGludG8gcG9seWdvbnMgd2l0aCBvdXRlciByaW5ncyBhbmQgaG9sZXNcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsYXNzaWZ5UmluZ3MocmluZ3M6IEFycmF5PEFycmF5PFBvaW50Pj4sIG1heFJpbmdzOiBudW1iZXIpIHtcbiAgICBjb25zdCBsZW4gPSByaW5ncy5sZW5ndGg7XG5cbiAgICBpZiAobGVuIDw9IDEpIHJldHVybiBbcmluZ3NdO1xuXG4gICAgY29uc3QgcG9seWdvbnMgPSBbXTtcbiAgICBsZXQgcG9seWdvbixcbiAgICAgICAgY2N3O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBhcmVhID0gY2FsY3VsYXRlU2lnbmVkQXJlYShyaW5nc1tpXSk7XG4gICAgICAgIGlmIChhcmVhID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAocmluZ3NbaV06IGFueSkuYXJlYSA9IE1hdGguYWJzKGFyZWEpO1xuXG4gICAgICAgIGlmIChjY3cgPT09IHVuZGVmaW5lZCkgY2N3ID0gYXJlYSA8IDA7XG5cbiAgICAgICAgaWYgKGNjdyA9PT0gYXJlYSA8IDApIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgcG9seWdvbiA9IFtyaW5nc1tpXV07XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIChwb2x5Z29uOiBhbnkpLnB1c2gocmluZ3NbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwb2x5Z29uKSBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuXG4gICAgLy8gRWFyY3V0IHBlcmZvcm1hbmNlIGRlZ3JhZGVzIHdpdGggdGhlICMgb2YgcmluZ3MgaW4gYSBwb2x5Z29uLiBGb3IgdGhpc1xuICAgIC8vIHJlYXNvbiwgd2UgbGltaXQgc3RyaXAgb3V0IGFsbCBidXQgdGhlIGBtYXhSaW5nc2AgbGFyZ2VzdCByaW5ncy5cbiAgICBpZiAobWF4UmluZ3MgPiAxKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcG9seWdvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uc1tqXS5sZW5ndGggPD0gbWF4UmluZ3MpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcXVpY2tzZWxlY3QocG9seWdvbnNbal0sIG1heFJpbmdzLCAxLCBwb2x5Z29uc1tqXS5sZW5ndGggLSAxLCBjb21wYXJlQXJlYXMpO1xuICAgICAgICAgICAgcG9seWdvbnNbal0gPSBwb2x5Z29uc1tqXS5zbGljZSgwLCBtYXhSaW5ncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9seWdvbnM7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVBcmVhcyhhLCBiKSB7XG4gICAgcmV0dXJuIGIuYXJlYSAtIGEuYXJlYTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSBGaWxsU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIEZpbGxFeHRydXNpb25TdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIExpbmVTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXIuanMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0RmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0LmpzJztcblxudHlwZSBQYXR0ZXJuU3R5bGVMYXllcnMgPVxuICAgIEFycmF5PExpbmVTdHlsZUxheWVyPiB8XG4gICAgQXJyYXk8RmlsbFN0eWxlTGF5ZXI+IHxcbiAgICBBcnJheTxGaWxsRXh0cnVzaW9uU3R5bGVMYXllcj47XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQYXR0ZXJuKHR5cGU6IHN0cmluZywgbGF5ZXJzOiBQYXR0ZXJuU3R5bGVMYXllcnMsIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycykge1xuICAgIGNvbnN0IHBhdHRlcm5zID0gb3B0aW9ucy5wYXR0ZXJuRGVwZW5kZW5jaWVzO1xuICAgIGxldCBoYXNQYXR0ZXJuID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHkgPSBsYXllci5wYWludC5nZXQoYCR7dHlwZX0tcGF0dGVybmApO1xuICAgICAgICBpZiAoIXBhdHRlcm5Qcm9wZXJ0eS5pc0NvbnN0YW50KCkpIHtcbiAgICAgICAgICAgIGhhc1BhdHRlcm4gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uc3RhbnRQYXR0ZXJuID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IobnVsbCk7XG4gICAgICAgIGlmIChjb25zdGFudFBhdHRlcm4pIHtcbiAgICAgICAgICAgIGhhc1BhdHRlcm4gPSB0cnVlO1xuICAgICAgICAgICAgcGF0dGVybnNbY29uc3RhbnRQYXR0ZXJuLnRvXSA9ICB0cnVlO1xuICAgICAgICAgICAgcGF0dGVybnNbY29uc3RhbnRQYXR0ZXJuLmZyb21dID0gIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGFzUGF0dGVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFBhdHRlcm5EZXBlbmRlbmNpZXModHlwZTogc3RyaW5nLCBsYXllcnM6IFBhdHRlcm5TdHlsZUxheWVycywgcGF0dGVybkZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUsIHpvb206IG51bWJlciwgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBvcHRpb25zLnBhdHRlcm5EZXBlbmRlbmNpZXM7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgY29uc3QgcGF0dGVyblByb3BlcnR5ID0gbGF5ZXIucGFpbnQuZ2V0KGAke3R5cGV9LXBhdHRlcm5gKTtcblxuICAgICAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHlWYWx1ZSA9IHBhdHRlcm5Qcm9wZXJ0eS52YWx1ZTtcbiAgICAgICAgaWYgKHBhdHRlcm5Qcm9wZXJ0eVZhbHVlLmtpbmQgIT09IFwiY29uc3RhbnRcIikge1xuICAgICAgICAgICAgbGV0IG1pbiA9IHBhdHRlcm5Qcm9wZXJ0eVZhbHVlLmV2YWx1YXRlKHt6b29tOiB6b29tIC0gMX0sIHBhdHRlcm5GZWF0dXJlLCB7fSwgb3B0aW9ucy5hdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgbGV0IG1pZCA9IHBhdHRlcm5Qcm9wZXJ0eVZhbHVlLmV2YWx1YXRlKHt6b29tfSwgcGF0dGVybkZlYXR1cmUsIHt9LCBvcHRpb25zLmF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICBsZXQgbWF4ID0gcGF0dGVyblByb3BlcnR5VmFsdWUuZXZhbHVhdGUoe3pvb206IHpvb20gKyAxfSwgcGF0dGVybkZlYXR1cmUsIHt9LCBvcHRpb25zLmF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICBtaW4gPSBtaW4gJiYgbWluLm5hbWUgPyBtaW4ubmFtZSA6IG1pbjtcbiAgICAgICAgICAgIG1pZCA9IG1pZCAmJiBtaWQubmFtZSA/IG1pZC5uYW1lIDogbWlkO1xuICAgICAgICAgICAgbWF4ID0gbWF4ICYmIG1heC5uYW1lID8gbWF4Lm5hbWUgOiBtYXg7XG4gICAgICAgICAgICAvLyBhZGQgdG8gcGF0dGVybkRlcGVuZGVuY2llc1xuICAgICAgICAgICAgcGF0dGVybnNbbWluXSA9IHRydWU7XG4gICAgICAgICAgICBwYXR0ZXJuc1ttaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhdHRlcm5zW21heF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBzYXZlIGZvciBsYXlvdXRcbiAgICAgICAgICAgIHBhdHRlcm5GZWF0dXJlLnBhdHRlcm5zW2xheWVyLmlkXSA9IHttaW4sIG1pZCwgbWF4fTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGF0dGVybkZlYXR1cmU7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0ZpbGxMYXlvdXRBcnJheX0gZnJvbSAnLi4vYXJyYXlfdHlwZXMuanMnO1xuXG5pbXBvcnQge21lbWJlcnMgYXMgbGF5b3V0QXR0cmlidXRlc30gZnJvbSAnLi9maWxsX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vc2VnbWVudC5qcyc7XG5pbXBvcnQge1Byb2dyYW1Db25maWd1cmF0aW9uU2V0fSBmcm9tICcuLi9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHtMaW5lSW5kZXhBcnJheSwgVHJpYW5nbGVJbmRleEFycmF5fSBmcm9tICcuLi9pbmRleF9hcnJheV90eXBlLmpzJztcbmltcG9ydCBlYXJjdXQgZnJvbSAnZWFyY3V0JztcbmltcG9ydCBjbGFzc2lmeVJpbmdzIGZyb20gJy4uLy4uL3V0aWwvY2xhc3NpZnlfcmluZ3MuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuY29uc3QgRUFSQ1VUX01BWF9SSU5HUyA9IDUwMDtcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5pbXBvcnQge2hhc1BhdHRlcm4sIGFkZFBhdHRlcm5EZXBlbmRlbmNpZXN9IGZyb20gJy4vcGF0dGVybl9idWNrZXRfZmVhdHVyZXMuanMnO1xuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuLi9sb2FkX2dlb21ldHJ5LmpzJztcbmltcG9ydCB0b0V2YWx1YXRpb25GZWF0dXJlIGZyb20gJy4uL2V2YWx1YXRpb25fZmVhdHVyZS5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcblxuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRQYXJhbWV0ZXJzLFxuICAgIEJ1Y2tldEZlYXR1cmUsXG4gICAgSW5kZXhlZEZlYXR1cmUsXG4gICAgUG9wdWxhdGVQYXJhbWV0ZXJzXG59IGZyb20gJy4uL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBGaWxsU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC9pbmRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL3ZlcnRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi4vLi4vc291cmNlL3NvdXJjZV9zdGF0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vLi4vcmVuZGVyL2ltYWdlX2F0bGFzLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlVHJhbnNmb3JtfSBmcm9tICcuLi8uLi9nZW8vcHJvamVjdGlvbi90aWxlX3RyYW5zZm9ybS5qcyc7XG5cbmNsYXNzIEZpbGxCdWNrZXQgaW1wbGVtZW50cyBCdWNrZXQge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG92ZXJzY2FsaW5nOiBudW1iZXI7XG4gICAgbGF5ZXJzOiBBcnJheTxGaWxsU3R5bGVMYXllcj47XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PEZpbGxTdHlsZUxheWVyPjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHBhdHRlcm5GZWF0dXJlczogQXJyYXk8QnVja2V0RmVhdHVyZT47XG5cbiAgICBsYXlvdXRWZXJ0ZXhBcnJheTogRmlsbExheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXkyOiBMaW5lSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjI6IEluZGV4QnVmZmVyO1xuXG4gICAgaGFzUGF0dGVybjogYm9vbGVhbjtcbiAgICBwcm9ncmFtQ29uZmlndXJhdGlvbnM6IFByb2dyYW1Db25maWd1cmF0aW9uU2V0PEZpbGxTdHlsZUxheWVyPjtcbiAgICBzZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICBzZWdtZW50czI6IFNlZ21lbnRWZWN0b3I7XG4gICAgdXBsb2FkZWQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPEZpbGxTdHlsZUxheWVyPikge1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhdHRlcm5GZWF0dXJlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgRmlsbExheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5MiA9IG5ldyBMaW5lSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMyID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKChsKSA9PiBsLmlzU3RhdGVEZXBlbmRlbnQoKSkubWFwKChsKSA9PiBsLmlkKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlczogQXJyYXk8SW5kZXhlZEZlYXR1cmU+LCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCB0aWxlVHJhbnNmb3JtOiBUaWxlVHJhbnNmb3JtKSB7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGhhc1BhdHRlcm4oJ2ZpbGwnLCB0aGlzLmxheWVycywgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGZpbGxTb3J0S2V5ID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0LmdldCgnZmlsbC1zb3J0LWtleScpO1xuICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlcyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qge2ZlYXR1cmUsIGlkLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5lZWRHZW9tZXRyeSA9IHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeTtcbiAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRpb25GZWF0dXJlID0gdG9FdmFsdWF0aW9uRmVhdHVyZShmZWF0dXJlLCBuZWVkR2VvbWV0cnkpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLmZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKSwgZXZhbHVhdGlvbkZlYXR1cmUsIGNhbm9uaWNhbCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzb3J0S2V5ID0gZmlsbFNvcnRLZXkgP1xuICAgICAgICAgICAgICAgIGZpbGxTb3J0S2V5LmV2YWx1YXRlKGV2YWx1YXRpb25GZWF0dXJlLCB7fSwgY2Fub25pY2FsLCBvcHRpb25zLmF2YWlsYWJsZUltYWdlcykgOlxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgY29uc3QgYnVja2V0RmVhdHVyZTogQnVja2V0RmVhdHVyZSA9IHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogZmVhdHVyZS50eXBlLFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IG5lZWRHZW9tZXRyeSA/IGV2YWx1YXRpb25GZWF0dXJlLmdlb21ldHJ5IDogbG9hZEdlb21ldHJ5KGZlYXR1cmUsIGNhbm9uaWNhbCwgdGlsZVRyYW5zZm9ybSksXG4gICAgICAgICAgICAgICAgcGF0dGVybnM6IHt9LFxuICAgICAgICAgICAgICAgIHNvcnRLZXlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGJ1Y2tldEZlYXR1cmVzLnB1c2goYnVja2V0RmVhdHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsbFNvcnRLZXkpIHtcbiAgICAgICAgICAgIGJ1Y2tldEZlYXR1cmVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBhLnNvcnRLZXkgaXMgYWx3YXlzIGEgbnVtYmVyIHdoZW4gaW4gdXNlXG4gICAgICAgICAgICAgICAgcmV0dXJuICgoYS5zb3J0S2V5OiBhbnkpOiBudW1iZXIpIC0gKChiLnNvcnRLZXk6IGFueSk6IG51bWJlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgYnVja2V0RmVhdHVyZSBvZiBidWNrZXRGZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3Qge2dlb21ldHJ5LCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gPSBidWNrZXRGZWF0dXJlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0dGVybkZlYXR1cmUgPSBhZGRQYXR0ZXJuRGVwZW5kZW5jaWVzKCdmaWxsJywgdGhpcy5sYXllcnMsIGJ1Y2tldEZlYXR1cmUsIHRoaXMuem9vbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgLy8gcGF0dGVybiBmZWF0dXJlcyBhcmUgYWRkZWQgb25seSBvbmNlIHRoZSBwYXR0ZXJuIGlzIGxvYWRlZCBpbnRvIHRoZSBpbWFnZSBhdGxhc1xuICAgICAgICAgICAgICAgIC8vIHNvIGFyZSBzdG9yZWQgZHVyaW5nIHBvcHVsYXRlIHVudGlsIGxhdGVyIHVwZGF0ZWQgd2l0aCBwb3NpdGlvbnMgYnkgdGlsZSB3b3JrZXIgaW4gYWRkRmVhdHVyZXNcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHRlcm5GZWF0dXJlcy5wdXNoKHBhdHRlcm5GZWF0dXJlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGJ1Y2tldEZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwgY2Fub25pY2FsLCB7fSwgb3B0aW9ucy5hdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXNbaW5kZXhdLmZlYXR1cmU7XG4gICAgICAgICAgICBvcHRpb25zLmZlYXR1cmVJbmRleC5pbnNlcnQoZmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4LCB0aGlzLmluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZShzdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycywgYXZhaWxhYmxlSW1hZ2VzLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZXMob3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgdGhpcy5wYXR0ZXJuRmVhdHVyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmVhdHVyZShmZWF0dXJlLCBmZWF0dXJlLmdlb21ldHJ5LCBmZWF0dXJlLmluZGV4LCBjYW5vbmljYWwsIGltYWdlUG9zaXRpb25zLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVwbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGxheW91dEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhCdWZmZXIyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlcjIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzMi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZShmZWF0dXJlOiBCdWNrZXRGZWF0dXJlLCBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgaW5kZXg6IG51bWJlciwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4gPSBbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHBvbHlnb24gb2YgY2xhc3NpZnlSaW5ncyhnZW9tZXRyeSwgRUFSQ1VUX01BWF9SSU5HUykpIHtcbiAgICAgICAgICAgIGxldCBudW1WZXJ0aWNlcyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgcG9seWdvbikge1xuICAgICAgICAgICAgICAgIG51bVZlcnRpY2VzICs9IHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0cmlhbmdsZVNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KG51bVZlcnRpY2VzLCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICAgICAgY29uc3QgdHJpYW5nbGVJbmRleCA9IHRyaWFuZ2xlU2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaG9sZUluZGljZXMgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJpbmcgIT09IHBvbHlnb25bMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaG9sZUluZGljZXMucHVzaChmbGF0dGVuZWQubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZVNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzMi5wcmVwYXJlU2VnbWVudChyaW5nLmxlbmd0aCwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5Mik7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZUluZGV4ID0gbGluZVNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhyaW5nWzBdLngsIHJpbmdbMF0ueSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5Mi5lbXBsYWNlQmFjayhsaW5lSW5kZXggKyByaW5nLmxlbmd0aCAtIDEsIGxpbmVJbmRleCk7XG4gICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocmluZ1swXS54KTtcbiAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChyaW5nWzBdLnkpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socmluZ1tpXS54LCByaW5nW2ldLnkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkyLmVtcGxhY2VCYWNrKGxpbmVJbmRleCArIGkgLSAxLCBsaW5lSW5kZXggKyBpKTtcbiAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocmluZ1tpXS54KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocmluZ1tpXS55KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsaW5lU2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGluZVNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbmRpY2VzID0gZWFyY3V0KGZsYXR0ZW5lZCwgaG9sZUluZGljZXMpO1xuICAgICAgICAgICAgYXNzZXJ0KGluZGljZXMubGVuZ3RoICUgMyA9PT0gMCk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgICAgICAgICAgICAgdHJpYW5nbGVJbmRleCArIGluZGljZXNbaV0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2kgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgdHJpYW5nbGVJbmRleCArIGluZGljZXNbaSArIDJdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJpYW5nbGVTZWdtZW50LnZlcnRleExlbmd0aCArPSBudW1WZXJ0aWNlcztcbiAgICAgICAgICAgIHRyaWFuZ2xlU2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gaW5kaWNlcy5sZW5ndGggLyAzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUsIGluZGV4LCBpbWFnZVBvc2l0aW9ucywgYXZhaWxhYmxlSW1hZ2VzLCBjYW5vbmljYWwpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0ZpbGxCdWNrZXQnLCBGaWxsQnVja2V0LCB7b21pdDogWydsYXllcnMnLCAncGF0dGVybkZlYXR1cmVzJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgRmlsbEJ1Y2tldDtcbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gQGZsb3dcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcblxuaW1wb3J0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBDb2xvclJhbXBQcm9wZXJ0eVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcblxuaW1wb3J0IHR5cGUgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cbmV4cG9ydCB0eXBlIExheW91dFByb3BzID0ge3xcbiAgICBcImZpbGwtc29ydC1rZXlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImZpbGwtc29ydC1rZXlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfZmlsbFwiXVtcImZpbGwtc29ydC1rZXlcIl0pLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwiZmlsbC1hbnRpYWxpYXNcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJmaWxsLW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJmaWxsLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJmaWxsLW91dGxpbmUtY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImZpbGwtdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiZmlsbC10cmFuc2xhdGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwiZmlsbC1wYXR0ZXJuXCI6IENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHk8UmVzb2x2ZWRJbWFnZT4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJmaWxsLWFudGlhbGlhc1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtYW50aWFsaWFzXCJdKSxcbiAgICBcImZpbGwtb3BhY2l0eVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLW9wYWNpdHlcIl0pLFxuICAgIFwiZmlsbC1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLWNvbG9yXCJdKSxcbiAgICBcImZpbGwtb3V0bGluZS1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLW91dGxpbmUtY29sb3JcIl0pLFxuICAgIFwiZmlsbC10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwiZmlsbC1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGxcIl1bXCJmaWxsLXBhdHRlcm5cIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQsIGxheW91dCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiwgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXIuanMnO1xuXG5pbXBvcnQgRmlsbEJ1Y2tldCBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC9maWxsX2J1Y2tldC5qcyc7XG5pbXBvcnQge3BvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29ufSBmcm9tICcuLi8uLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cy5qcyc7XG5pbXBvcnQge3RyYW5zbGF0ZURpc3RhbmNlLCB0cmFuc2xhdGV9IGZyb20gJy4uL3F1ZXJ5X3V0aWxzLmpzJztcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vZmlsbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7VHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIExheW91dCwgUG9zc2libHlFdmFsdWF0ZWR9IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IFByb2dyYW1Db25maWd1cmF0aW9uIGZyb20gJy4uLy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzJztcblxuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZX0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtCdWNrZXRQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtMYXlvdXRQcm9wcywgUGFpbnRQcm9wc30gZnJvbSAnLi9maWxsX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVzcGFjZVF1ZXJ5R2VvbWV0cnl9IGZyb20gJy4uL3F1ZXJ5X2dlb21ldHJ5LmpzJztcblxuY2xhc3MgRmlsbFN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdW5ldmFsdWF0ZWRMYXlvdXQ6IExheW91dDxMYXlvdXRQcm9wcz47XG4gICAgbGF5b3V0OiBQb3NzaWJseUV2YWx1YXRlZDxMYXlvdXRQcm9wcz47XG5cbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtSWRzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHRoaXMucGFpbnQuZ2V0KCdmaWxsLXBhdHRlcm4nKTtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBwYXR0ZXJuICYmIHBhdHRlcm4uY29uc3RhbnRPcigoMTogYW55KSk7XG5cbiAgICAgICAgY29uc3QgaWRzID0gW2ltYWdlID8gJ2ZpbGxQYXR0ZXJuJyA6ICdmaWxsJ107XG5cbiAgICAgICAgaWYgKHRoaXMucGFpbnQuZ2V0KCdmaWxsLWFudGlhbGlhcycpKSB7XG4gICAgICAgICAgICBpZHMucHVzaChpbWFnZSAmJiAhdGhpcy5nZXRQYWludFByb3BlcnR5KCdmaWxsLW91dGxpbmUtY29sb3InKSA/ICdmaWxsT3V0bGluZVBhdHRlcm4nIDogJ2ZpbGxPdXRsaW5lJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaWRzO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1Db25maWd1cmF0aW9uKHpvb206IG51bWJlcik6IFByb2dyYW1Db25maWd1cmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvbih0aGlzLCB6b29tKTtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZShwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHN1cGVyLnJlY2FsY3VsYXRlKHBhcmFtZXRlcnMsIGF2YWlsYWJsZUltYWdlcyk7XG5cbiAgICAgICAgY29uc3Qgb3V0bGluZUNvbG9yID0gdGhpcy5wYWludC5fdmFsdWVzWydmaWxsLW91dGxpbmUtY29sb3InXTtcbiAgICAgICAgaWYgKG91dGxpbmVDb2xvci52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnICYmIG91dGxpbmVDb2xvci52YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhaW50Ll92YWx1ZXNbJ2ZpbGwtb3V0bGluZS1jb2xvciddID0gdGhpcy5wYWludC5fdmFsdWVzWydmaWxsLWNvbG9yJ107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVCdWNrZXQocGFyYW1ldGVyczogQnVja2V0UGFyYW1ldGVyczwqPikge1xuICAgICAgICByZXR1cm4gbmV3IEZpbGxCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZURpc3RhbmNlKHRoaXMucGFpbnQuZ2V0KCdmaWxsLXRyYW5zbGF0ZScpKTtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnk6IFRpbGVzcGFjZVF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAocXVlcnlHZW9tZXRyeS5xdWVyeUdlb21ldHJ5LmlzQWJvdmVIb3Jpem9uKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZFBvbHlnb24gPSB0cmFuc2xhdGUocXVlcnlHZW9tZXRyeS50aWxlc3BhY2VHZW9tZXRyeSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdmaWxsLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2ZpbGwtdHJhbnNsYXRlLWFuY2hvcicpLFxuICAgICAgICAgICAgdHJhbnNmb3JtLmFuZ2xlLCBxdWVyeUdlb21ldHJ5LnBpeGVsVG9UaWxlVW5pdHNGYWN0b3IpO1xuICAgICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb24odHJhbnNsYXRlZFBvbHlnb24sIGdlb21ldHJ5KTtcbiAgICB9XG5cbiAgICBpc1RpbGVDbGlwcGVkKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGxTdHlsZUxheWVyO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7Y3JlYXRlTGF5b3V0fSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmV4cG9ydCBjb25zdCBmaWxsRXh0cnVzaW9uQXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3Bvc19ub3JtYWxfZWQnLCBjb21wb25lbnRzOiA0LCB0eXBlOiAnSW50MTYnfVxuXSk7XG5cbmV4cG9ydCBjb25zdCBjZW50cm9pZEF0dHJpYnV0ZXMgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9jZW50cm9pZF9wb3MnLCAgY29tcG9uZW50czogMiwgdHlwZTogJ1VpbnQxNid9XG5dKTtcblxuZXhwb3J0IGNvbnN0IHttZW1iZXJzLCBzaXplLCBhbGlnbm1lbnR9ID0gZmlsbEV4dHJ1c2lvbkF0dHJpYnV0ZXM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlRmVhdHVyZTtcblxuZnVuY3Rpb24gVmVjdG9yVGlsZUZlYXR1cmUocGJmLCBlbmQsIGV4dGVudCwga2V5cywgdmFsdWVzKSB7XG4gICAgLy8gUHVibGljXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0ge307XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQ7XG4gICAgdGhpcy50eXBlID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fZ2VvbWV0cnkgPSAtMTtcbiAgICB0aGlzLl9rZXlzID0ga2V5cztcbiAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkRmVhdHVyZSwgdGhpcywgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZlYXR1cmUodGFnLCBmZWF0dXJlLCBwYmYpIHtcbiAgICBpZiAodGFnID09IDEpIGZlYXR1cmUuaWQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAyKSByZWFkVGFnKHBiZiwgZmVhdHVyZSk7XG4gICAgZWxzZSBpZiAodGFnID09IDMpIGZlYXR1cmUudHlwZSA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDQpIGZlYXR1cmUuX2dlb21ldHJ5ID0gcGJmLnBvcztcbn1cblxuZnVuY3Rpb24gcmVhZFRhZyhwYmYsIGZlYXR1cmUpIHtcbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIga2V5ID0gZmVhdHVyZS5fa2V5c1twYmYucmVhZFZhcmludCgpXSxcbiAgICAgICAgICAgIHZhbHVlID0gZmVhdHVyZS5fdmFsdWVzW3BiZi5yZWFkVmFyaW50KCldO1xuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbn1cblxuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXMgPSBbJ1Vua25vd24nLCAnUG9pbnQnLCAnTGluZVN0cmluZycsICdQb2x5Z29uJ107XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICBsaW5lcyA9IFtdLFxuICAgICAgICBsaW5lO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICB2YXIgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgICAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgICAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuXG4gICAgICAgICAgICBpZiAoY21kID09PSAxKSB7IC8vIG1vdmVUb1xuICAgICAgICAgICAgICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZS5wdXNoKG5ldyBQb2ludCh4LCB5KSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgPT09IDcpIHtcblxuICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBuaWstdmVjdG9yLXRpbGUvaXNzdWVzLzkwXG4gICAgICAgICAgICBpZiAobGluZSkge1xuICAgICAgICAgICAgICAgIGxpbmUucHVzaChsaW5lWzBdLmNsb25lKCkpOyAvLyBjbG9zZVBvbHlnb25cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcblxuICAgIHJldHVybiBsaW5lcztcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5iYm94ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgeDEgPSBJbmZpbml0eSxcbiAgICAgICAgeDIgPSAtSW5maW5pdHksXG4gICAgICAgIHkxID0gSW5maW5pdHksXG4gICAgICAgIHkyID0gLUluZmluaXR5O1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICB2YXIgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgICAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgICAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgaWYgKHggPCB4MSkgeDEgPSB4O1xuICAgICAgICAgICAgaWYgKHggPiB4MikgeDIgPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCB5MSkgeTEgPSB5O1xuICAgICAgICAgICAgaWYgKHkgPiB5MikgeTIgPSB5O1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY21kICE9PSA3KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbeDEsIHkxLCB4MiwgeTJdO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTiA9IGZ1bmN0aW9uKHgsIHksIHopIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZXh0ZW50ICogTWF0aC5wb3coMiwgeiksXG4gICAgICAgIHgwID0gdGhpcy5leHRlbnQgKiB4LFxuICAgICAgICB5MCA9IHRoaXMuZXh0ZW50ICogeSxcbiAgICAgICAgY29vcmRzID0gdGhpcy5sb2FkR2VvbWV0cnkoKSxcbiAgICAgICAgdHlwZSA9IFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW3RoaXMudHlwZV0sXG4gICAgICAgIGksIGo7XG5cbiAgICBmdW5jdGlvbiBwcm9qZWN0KGxpbmUpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaW5lLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcCA9IGxpbmVbal0sIHkyID0gMTgwIC0gKHAueSArIHkwKSAqIDM2MCAvIHNpemU7XG4gICAgICAgICAgICBsaW5lW2pdID0gW1xuICAgICAgICAgICAgICAgIChwLnggKyB4MCkgKiAzNjAgLyBzaXplIC0gMTgwLFxuICAgICAgICAgICAgICAgIDM2MCAvIE1hdGguUEkgKiBNYXRoLmF0YW4oTWF0aC5leHAoeTIgKiBNYXRoLlBJIC8gMTgwKSkgLSA5MFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgY2FzZSAxOlxuICAgICAgICB2YXIgcG9pbnRzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBvaW50c1tpXSA9IGNvb3Jkc1tpXVswXTtcbiAgICAgICAgfVxuICAgICAgICBjb29yZHMgPSBwb2ludHM7XG4gICAgICAgIHByb2plY3QoY29vcmRzKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDI6XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHByb2plY3QoY29vcmRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgMzpcbiAgICAgICAgY29vcmRzID0gY2xhc3NpZnlSaW5ncyhjb29yZHMpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY29vcmRzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcHJvamVjdChjb29yZHNbaV1bal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gJ011bHRpJyArIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgdHlwZTogXCJGZWF0dXJlXCIsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNvb3Jkc1xuICAgICAgICB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXNcbiAgICB9O1xuXG4gICAgaWYgKCdpZCcgaW4gdGhpcykge1xuICAgICAgICByZXN1bHQuaWQgPSB0aGlzLmlkO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBjbGFzc2lmaWVzIGFuIGFycmF5IG9mIHJpbmdzIGludG8gcG9seWdvbnMgd2l0aCBvdXRlciByaW5ncyBhbmQgaG9sZXNcblxuZnVuY3Rpb24gY2xhc3NpZnlSaW5ncyhyaW5ncykge1xuICAgIHZhciBsZW4gPSByaW5ncy5sZW5ndGg7XG5cbiAgICBpZiAobGVuIDw9IDEpIHJldHVybiBbcmluZ3NdO1xuXG4gICAgdmFyIHBvbHlnb25zID0gW10sXG4gICAgICAgIHBvbHlnb24sXG4gICAgICAgIGNjdztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGFyZWEgPSBzaWduZWRBcmVhKHJpbmdzW2ldKTtcbiAgICAgICAgaWYgKGFyZWEgPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChjY3cgPT09IHVuZGVmaW5lZCkgY2N3ID0gYXJlYSA8IDA7XG5cbiAgICAgICAgaWYgKGNjdyA9PT0gYXJlYSA8IDApIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgcG9seWdvbiA9IFtyaW5nc1tpXV07XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvbHlnb24ucHVzaChyaW5nc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG5cbiAgICByZXR1cm4gcG9seWdvbnM7XG59XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEocmluZykge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDEsIHAxLCBwMjsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICBwMSA9IHJpbmdbaV07XG4gICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgc3VtICs9IChwMi54IC0gcDEueCkgKiAocDEueSArIHAyLnkpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUxheWVyO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlTGF5ZXIocGJmLCBlbmQpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnZlcnNpb24gPSAxO1xuICAgIHRoaXMubmFtZSA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSA0MDk2O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fa2V5cyA9IFtdO1xuICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgIHRoaXMuX2ZlYXR1cmVzID0gW107XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkTGF5ZXIsIHRoaXMsIGVuZCk7XG5cbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gcmVhZExheWVyKHRhZywgbGF5ZXIsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDE1KSBsYXllci52ZXJzaW9uID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDEpIGxheWVyLm5hbWUgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgbGF5ZXIuZXh0ZW50ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGxheWVyLl9mZWF0dXJlcy5wdXNoKHBiZi5wb3MpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgbGF5ZXIuX2tleXMucHVzaChwYmYucmVhZFN0cmluZygpKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDQpIGxheWVyLl92YWx1ZXMucHVzaChyZWFkVmFsdWVNZXNzYWdlKHBiZikpO1xufVxuXG5mdW5jdGlvbiByZWFkVmFsdWVNZXNzYWdlKHBiZikge1xuICAgIHZhciB2YWx1ZSA9IG51bGwsXG4gICAgICAgIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIHRhZyA9IHBiZi5yZWFkVmFyaW50KCkgPj4gMztcblxuICAgICAgICB2YWx1ZSA9IHRhZyA9PT0gMSA/IHBiZi5yZWFkU3RyaW5nKCkgOlxuICAgICAgICAgICAgdGFnID09PSAyID8gcGJmLnJlYWRGbG9hdCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMyA/IHBiZi5yZWFkRG91YmxlKCkgOlxuICAgICAgICAgICAgdGFnID09PSA0ID8gcGJmLnJlYWRWYXJpbnQ2NCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNSA/IHBiZi5yZWFkVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA2ID8gcGJmLnJlYWRTVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA3ID8gcGJmLnJlYWRCb29sZWFuKCkgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gcmV0dXJuIGZlYXR1cmUgYGlgIGZyb20gdGhpcyBsYXllciBhcyBhIGBWZWN0b3JUaWxlRmVhdHVyZWBcblZlY3RvclRpbGVMYXllci5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uKGkpIHtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSB0aGlzLl9mZWF0dXJlcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignZmVhdHVyZSBpbmRleCBvdXQgb2YgYm91bmRzJyk7XG5cbiAgICB0aGlzLl9wYmYucG9zID0gdGhpcy5fZmVhdHVyZXNbaV07XG5cbiAgICB2YXIgZW5kID0gdGhpcy5fcGJmLnJlYWRWYXJpbnQoKSArIHRoaXMuX3BiZi5wb3M7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3JUaWxlRmVhdHVyZSh0aGlzLl9wYmYsIGVuZCwgdGhpcy5leHRlbnQsIHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlbGF5ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlKHBiZiwgZW5kKSB7XG4gICAgdGhpcy5sYXllcnMgPSBwYmYucmVhZEZpZWxkcyhyZWFkVGlsZSwge30sIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRUaWxlKHRhZywgbGF5ZXJzLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAzKSB7XG4gICAgICAgIHZhciBsYXllciA9IG5ldyBWZWN0b3JUaWxlTGF5ZXIocGJmLCBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyk7XG4gICAgICAgIGlmIChsYXllci5sZW5ndGgpIGxheWVyc1tsYXllci5uYW1lXSA9IGxheWVyO1xuICAgIH1cbn1cblxuIiwibW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVsYXllci5qcycpO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXksIEZpbGxFeHRydXNpb25DZW50cm9pZEFycmF5fSBmcm9tICcuLi9hcnJheV90eXBlcy5qcyc7XG5cbmltcG9ydCB7bWVtYmVycyBhcyBsYXlvdXRBdHRyaWJ1dGVzLCBjZW50cm9pZEF0dHJpYnV0ZXN9IGZyb20gJy4vZmlsbF9leHRydXNpb25fYXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9zZWdtZW50LmpzJztcbmltcG9ydCB7UHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXR9IGZyb20gJy4uL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQge1RyaWFuZ2xlSW5kZXhBcnJheX0gZnJvbSAnLi4vaW5kZXhfYXJyYXlfdHlwZS5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2V4dGVudC5qcyc7XG5pbXBvcnQgZWFyY3V0IGZyb20gJ2VhcmN1dCc7XG5pbXBvcnQgbXZ0IGZyb20gJ0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuY29uc3QgdmVjdG9yVGlsZUZlYXR1cmVUeXBlcyA9IG12dC5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcztcbmltcG9ydCBjbGFzc2lmeVJpbmdzIGZyb20gJy4uLy4uL3V0aWwvY2xhc3NpZnlfcmluZ3MuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuY29uc3QgRUFSQ1VUX01BWF9SSU5HUyA9IDUwMDtcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5pbXBvcnQge2hhc1BhdHRlcm4sIGFkZFBhdHRlcm5EZXBlbmRlbmNpZXN9IGZyb20gJy4vcGF0dGVybl9idWNrZXRfZmVhdHVyZXMuanMnO1xuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuLi9sb2FkX2dlb21ldHJ5LmpzJztcbmltcG9ydCB0b0V2YWx1YXRpb25GZWF0dXJlIGZyb20gJy4uL2V2YWx1YXRpb25fZmVhdHVyZS5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUuanMnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgQnVja2V0RmVhdHVyZSxcbiAgICBJbmRleGVkRmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0LmpzJztcblxuaW1wb3J0IHR5cGUgRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL2luZGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi4vLi4vc291cmNlL3NvdXJjZV9zdGF0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vLi4vcmVuZGVyL2ltYWdlX2F0bGFzLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlVHJhbnNmb3JtfSBmcm9tICcuLi8uLi9nZW8vcHJvamVjdGlvbi90aWxlX3RyYW5zZm9ybS5qcyc7XG5cbmNvbnN0IEZBQ1RPUiA9IE1hdGgucG93KDIsIDEzKTtcblxuLy8gQWxzbyBkZWNsYXJlZCBpbiBfcHJlbHVkZV90ZXJyYWluLnZlcnRleC5nbHNsXG4vLyBVc2VkIHRvIHNjYWxlIG1vc3QgbGlrZWx5IGVsZXZhdGlvbiB2YWx1ZXMgdG8gZml0IHdlbGwgaW4gYW4gdWludDE2XG4vLyAoRWxldmF0aW9uIG9mIERlYWQgU2VhICsgRUxFVkFUSU9OX09GRlNFVCkgKiBFTEVWQVRJT05fU0NBTEUgaXMgcm91Z2hseSAwXG4vLyAoSGVpZ2h0IG9mIG10IGV2ZXJlc3QgKyBFTEVWQVRJT05fT0ZGU0VUKSAqIEVMRVZBVElPTl9TQ0FMRSBpcyByb3VnaGx5IDY0a1xuZXhwb3J0IGNvbnN0IEVMRVZBVElPTl9TQ0FMRSA9IDcuMDtcbmV4cG9ydCBjb25zdCBFTEVWQVRJT05fT0ZGU0VUID0gNDUwO1xuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgodmVydGV4QXJyYXksIHgsIHksIG54UmF0aW8sIG55U2lnbiwgbm9ybWFsVXAsIHRvcCwgZSkge1xuICAgIHZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAvLyBhX3Bvc19ub3JtYWxfZWQ6XG4gICAgICAgIC8vIEVuY29kZSB0b3AgYW5kIHNpZGUvdXAgbm9ybWFsIHVzaW5nIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzXG4gICAgICAgICh4IDw8IDEpICsgdG9wLFxuICAgICAgICAoeSA8PCAxKSArIG5vcm1hbFVwLFxuICAgICAgICAvLyBkeGR5IGlzIHNpZ25lZCwgZW5jb2RlIHF1YWRyYW50IGluZm8gdXNpbmcgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdFxuICAgICAgICAoTWF0aC5mbG9vcihueFJhdGlvICogRkFDVE9SKSA8PCAxKSArIG55U2lnbixcbiAgICAgICAgLy8gZWRnZWRpc3RhbmNlICh1c2VkIGZvciB3cmFwcGluZyBwYXR0ZXJucyBhcm91bmQgZXh0cnVzaW9uIHNpZGVzKVxuICAgICAgICBNYXRoLnJvdW5kKGUpXG4gICAgKTtcbn1cblxuY2xhc3MgUGFydE1ldGFkYXRhIHtcbiAgICBhY2M6IFBvaW50O1xuICAgIG1pbjogUG9pbnQ7XG4gICAgbWF4OiBQb2ludDtcbiAgICBwb2x5Q291bnQ6IEFycmF5PHtlZGdlczogbnVtYmVyLCB0b3A6IG51bWJlcn0+O1xuICAgIGN1cnJlbnRQb2x5Q291bnQ6IHtlZGdlczogbnVtYmVyLCB0b3A6IG51bWJlcn07XG4gICAgYm9yZGVyczogQXJyYXk8W251bWJlciwgbnVtYmVyXT47IC8vIEFycmF5PFttaW4sIG1heF0+XG4gICAgdmVydGV4QXJyYXlPZmZzZXQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFjYyA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICAgICAgdGhpcy5wb2x5Q291bnQgPSBbXTtcbiAgICB9XG5cbiAgICBzdGFydFJpbmcocDogUG9pbnQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UG9seUNvdW50ID0ge2VkZ2VzOiAwLCB0b3A6IDB9O1xuICAgICAgICB0aGlzLnBvbHlDb3VudC5wdXNoKHRoaXMuY3VycmVudFBvbHlDb3VudCk7XG4gICAgICAgIGlmICh0aGlzLm1pbikgcmV0dXJuO1xuICAgICAgICB0aGlzLm1pbiA9IG5ldyBQb2ludChwLngsIHAueSk7XG4gICAgICAgIHRoaXMubWF4ID0gbmV3IFBvaW50KHAueCwgcC55KTtcbiAgICB9XG5cbiAgICBhcHBlbmQocDogUG9pbnQsIHByZXY6IFBvaW50KSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBvbHlDb3VudC5lZGdlcysrO1xuXG4gICAgICAgIHRoaXMuYWNjLl9hZGQocCk7XG4gICAgICAgIGxldCBjaGVja0JvcmRlcnMgPSAhIXRoaXMuYm9yZGVycztcblxuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLm1pbiwgbWF4ID0gdGhpcy5tYXg7XG4gICAgICAgIGlmIChwLnggPCBtaW4ueCkge1xuICAgICAgICAgICAgbWluLnggPSBwLng7XG4gICAgICAgICAgICBjaGVja0JvcmRlcnMgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHAueCA+IG1heC54KSB7XG4gICAgICAgICAgICBtYXgueCA9IHAueDtcbiAgICAgICAgICAgIGNoZWNrQm9yZGVycyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAueSA8IG1pbi55KSB7XG4gICAgICAgICAgICBtaW4ueSA9IHAueTtcbiAgICAgICAgICAgIGNoZWNrQm9yZGVycyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocC55ID4gbWF4LnkpIHtcbiAgICAgICAgICAgIG1heC55ID0gcC55O1xuICAgICAgICAgICAgY2hlY2tCb3JkZXJzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKChwLnggPT09IDAgfHwgcC54ID09PSBFWFRFTlQpICYmIHAueCA9PT0gcHJldi54KSAhPT0gKChwLnkgPT09IDAgfHwgcC55ID09PSBFWFRFTlQpICYmIHAueSA9PT0gcHJldi55KSkge1xuICAgICAgICAgICAgLy8gQ3VzdG9tIGRlZmluZWQgZ2VvanNvbiBidWlsZGluZ3MgYXJlIGN1dCBvbiBib3JkZXJzLiBQb2ludHMgYXJlXG4gICAgICAgICAgICAvLyByZXBlYXRlZCB3aGVuIGVkZ2UgY3V0cyB0aWxlIGNvcm5lciAocmVhc29uIGZvciB1c2luZyB4b3IpLlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQm9yZGVyT3ZlcmxhcChwLCBwcmV2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tCb3JkZXJzKSB0aGlzLmNoZWNrQm9yZGVySW50ZXJzZWN0aW9uKHAsIHByZXYpO1xuICAgIH1cblxuICAgIGNoZWNrQm9yZGVySW50ZXJzZWN0aW9uKHA6IFBvaW50LCBwcmV2OiBQb2ludCkge1xuICAgICAgICBpZiAoKHByZXYueCA8IDApICE9PSAocC54IDwgMCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQm9yZGVySW50ZXJzZWN0aW9uKDAsIGludGVycG9sYXRlKHByZXYueSwgcC55LCAoMCAtIHByZXYueCkgLyAocC54IC0gcHJldi54KSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocHJldi54ID4gRVhURU5UKSAhPT0gKHAueCA+IEVYVEVOVCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQm9yZGVySW50ZXJzZWN0aW9uKDEsIGludGVycG9sYXRlKHByZXYueSwgcC55LCAoRVhURU5UIC0gcHJldi54KSAvIChwLnggLSBwcmV2LngpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwcmV2LnkgPCAwKSAhPT0gKHAueSA8IDApKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEJvcmRlckludGVyc2VjdGlvbigyLCBpbnRlcnBvbGF0ZShwcmV2LngsIHAueCwgKDAgLSBwcmV2LnkpIC8gKHAueSAtIHByZXYueSkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHByZXYueSA+IEVYVEVOVCkgIT09IChwLnkgPiBFWFRFTlQpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEJvcmRlckludGVyc2VjdGlvbigzLCBpbnRlcnBvbGF0ZShwcmV2LngsIHAueCwgKEVYVEVOVCAtIHByZXYueSkgLyAocC55IC0gcHJldi55KSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkQm9yZGVySW50ZXJzZWN0aW9uKGluZGV4OiAwIHwgMSB8IDIgfCAzLCBpOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJvcmRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYm9yZGVycyA9IFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyLk1BWF9WQUxVRSwgLU51bWJlci5NQVhfVkFMVUVdLFxuICAgICAgICAgICAgICAgIFtOdW1iZXIuTUFYX1ZBTFVFLCAtTnVtYmVyLk1BWF9WQUxVRV0sXG4gICAgICAgICAgICAgICAgW051bWJlci5NQVhfVkFMVUUsIC1OdW1iZXIuTUFYX1ZBTFVFXSxcbiAgICAgICAgICAgICAgICBbTnVtYmVyLk1BWF9WQUxVRSwgLU51bWJlci5NQVhfVkFMVUVdXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGIgPSB0aGlzLmJvcmRlcnNbaW5kZXhdO1xuICAgICAgICBpZiAoaSA8IGJbMF0pIGJbMF0gPSBpO1xuICAgICAgICBpZiAoaSA+IGJbMV0pIGJbMV0gPSBpO1xuICAgIH1cblxuICAgIHByb2Nlc3NCb3JkZXJPdmVybGFwKHA6IFBvaW50LCBwcmV2OiBQb2ludCkge1xuICAgICAgICBpZiAocC54ID09PSBwcmV2LngpIHtcbiAgICAgICAgICAgIGlmIChwLnkgPT09IHByZXYueSkgcmV0dXJuOyAvLyBjdXN0b20gZGVmaW5lZCBnZW9qc29uIGNvdWxkIGhhdmUgcG9pbnRzIHJlcGVhdGVkLlxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwLnggPT09IDAgPyAwIDogMTtcbiAgICAgICAgICAgIHRoaXMuYWRkQm9yZGVySW50ZXJzZWN0aW9uKGluZGV4LCBwcmV2LnkpO1xuICAgICAgICAgICAgdGhpcy5hZGRCb3JkZXJJbnRlcnNlY3Rpb24oaW5kZXgsIHAueSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQocC55ID09PSBwcmV2LnkpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwLnkgPT09IDAgPyAyIDogMztcbiAgICAgICAgICAgIHRoaXMuYWRkQm9yZGVySW50ZXJzZWN0aW9uKGluZGV4LCBwcmV2LngpO1xuICAgICAgICAgICAgdGhpcy5hZGRCb3JkZXJJbnRlcnNlY3Rpb24oaW5kZXgsIHAueCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjZW50cm9pZCgpOiBQb2ludCB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5wb2x5Q291bnQucmVkdWNlKChhY2MsIHApID0+IGFjYyArIHAuZWRnZXMsIDApO1xuICAgICAgICByZXR1cm4gY291bnQgIT09IDAgPyB0aGlzLmFjYy5kaXYoY291bnQpLl9yb3VuZCgpIDogbmV3IFBvaW50KDAsIDApO1xuICAgIH1cblxuICAgIHNwYW4oKTogUG9pbnQge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KHRoaXMubWF4LnggLSB0aGlzLm1pbi54LCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSk7XG4gICAgfVxuXG4gICAgaW50ZXJzZWN0c0NvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvcmRlcnMucmVkdWNlKChhY2MsIHApID0+IGFjYyArICsocFswXSAhPT0gTnVtYmVyLk1BWF9WQUxVRSksIDApO1xuICAgIH1cbn1cblxuY2xhc3MgRmlsbEV4dHJ1c2lvbkJ1Y2tldCBpbXBsZW1lbnRzIEJ1Y2tldCB7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICB6b29tOiBudW1iZXI7XG4gICAgb3ZlcnNjYWxpbmc6IG51bWJlcjtcbiAgICBlbmFibGVUZXJyYWluOiBib29sZWFuO1xuICAgIGxheWVyczogQXJyYXk8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+O1xuICAgIGxheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxGaWxsRXh0cnVzaW9uU3R5bGVMYXllcj47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcklkczogQXJyYXk8c3RyaW5nPjtcblxuICAgIGxheW91dFZlcnRleEFycmF5OiBGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXk7XG4gICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBjZW50cm9pZFZlcnRleEFycmF5OiBGaWxsRXh0cnVzaW9uQ2VudHJvaWRBcnJheTtcbiAgICBjZW50cm9pZFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIGhhc1BhdHRlcm46IGJvb2xlYW47XG4gICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb25zOiBQcm9ncmFtQ29uZmlndXJhdGlvblNldDxGaWxsRXh0cnVzaW9uU3R5bGVMYXllcj47XG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgdXBsb2FkZWQ6IGJvb2xlYW47XG4gICAgZmVhdHVyZXM6IEFycmF5PEJ1Y2tldEZlYXR1cmU+O1xuXG4gICAgZmVhdHVyZXNPbkJvcmRlcjogQXJyYXk8UGFydE1ldGFkYXRhPjtcbiAgICAvLyBib3JkZXJzIC8gYm9yZGVyRG9uZTogMCAtIGxlZnQsIDEsIHJpZ2h0LCAyIC0gdG9wLCAzIC0gYm90dG9tXG4gICAgYm9yZGVyczogQXJyYXk8QXJyYXk8bnVtYmVyPj47IC8vIEZvciBlYWNoIHNpZGUsIGluZGljZXMgaW50byBmZWF0dXJlc09uQm9yZGVyIGFycmF5LlxuICAgIGJvcmRlckRvbmU6IEFycmF5PGJvb2xlYW4+O1xuICAgIG5lZWRzQ2VudHJvaWRVcGRhdGU6IGJvb2xlYW47XG4gICAgdGlsZVRvTWV0ZXI6IG51bWJlcjsgLy8gY2FjaGUgY29udmVyc2lvbi5cblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJ1Y2tldFBhcmFtZXRlcnM8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGluZyA9IG9wdGlvbnMub3ZlcnNjYWxpbmc7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gb3B0aW9ucy5sYXllcnM7XG4gICAgICAgIHRoaXMubGF5ZXJJZHMgPSB0aGlzLmxheWVycy5tYXAobGF5ZXIgPT4gbGF5ZXIuaWQpO1xuICAgICAgICB0aGlzLmluZGV4ID0gb3B0aW9ucy5pbmRleDtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5jZW50cm9pZFZlcnRleEFycmF5ID0gbmV3IEZpbGxFeHRydXNpb25DZW50cm9pZEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQob3B0aW9ucy5sYXllcnMsIG9wdGlvbnMuem9vbSk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXcgU2VnbWVudFZlY3RvcigpO1xuICAgICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoKGwpID0+IGwuaXNTdGF0ZURlcGVuZGVudCgpKS5tYXAoKGwpID0+IGwuaWQpO1xuICAgICAgICB0aGlzLmVuYWJsZVRlcnJhaW4gPSBvcHRpb25zLmVuYWJsZVRlcnJhaW47XG4gICAgfVxuXG4gICAgcG9wdWxhdGUoZmVhdHVyZXM6IEFycmF5PEluZGV4ZWRGZWF0dXJlPiwgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgdGlsZVRyYW5zZm9ybTogVGlsZVRyYW5zZm9ybSkge1xuICAgICAgICB0aGlzLmZlYXR1cmVzID0gW107XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGhhc1BhdHRlcm4oJ2ZpbGwtZXh0cnVzaW9uJywgdGhpcy5sYXllcnMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmZlYXR1cmVzT25Cb3JkZXIgPSBbXTtcbiAgICAgICAgdGhpcy5ib3JkZXJzID0gW1tdLCBbXSwgW10sIFtdXTtcbiAgICAgICAgdGhpcy5ib3JkZXJEb25lID0gW2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlXTtcbiAgICAgICAgdGhpcy50aWxlVG9NZXRlciA9IHRpbGVUb01ldGVyKGNhbm9uaWNhbCk7XG5cbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaWQsIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSBvZiBmZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3QgbmVlZEdlb21ldHJ5ID0gdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5O1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGlvbkZlYXR1cmUgPSB0b0V2YWx1YXRpb25GZWF0dXJlKGZlYXR1cmUsIG5lZWRHZW9tZXRyeSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aGlzLnpvb20pLCBldmFsdWF0aW9uRmVhdHVyZSwgY2Fub25pY2FsKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldEZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogbmVlZEdlb21ldHJ5ID8gZXZhbHVhdGlvbkZlYXR1cmUuZ2VvbWV0cnkgOiBsb2FkR2VvbWV0cnkoZmVhdHVyZSwgY2Fub25pY2FsLCB0aWxlVHJhbnNmb3JtKSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogZmVhdHVyZS50eXBlLFxuICAgICAgICAgICAgICAgIHBhdHRlcm5zOiB7fVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgdmVydGV4QXJyYXlPZmZzZXQgPSB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnB1c2goYWRkUGF0dGVybkRlcGVuZGVuY2llcygnZmlsbC1leHRydXNpb24nLCB0aGlzLmxheWVycywgYnVja2V0RmVhdHVyZSwgdGhpcy56b29tLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmVhdHVyZShidWNrZXRGZWF0dXJlLCBidWNrZXRGZWF0dXJlLmdlb21ldHJ5LCBpbmRleCwgY2Fub25pY2FsLCB7fSwgb3B0aW9ucy5hdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvcHRpb25zLmZlYXR1cmVJbmRleC5pbnNlcnQoZmVhdHVyZSwgYnVja2V0RmVhdHVyZS5nZW9tZXRyeSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIHRoaXMuaW5kZXgsIHZlcnRleEFycmF5T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNvcnRCb3JkZXJzKCk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZXMob3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgdGhpcy5mZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3Qge2dlb21ldHJ5fSA9IGZlYXR1cmU7XG4gICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoZmVhdHVyZSwgZ2VvbWV0cnksIGZlYXR1cmUuaW5kZXgsIGNhbm9uaWNhbCwgaW1hZ2VQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zb3J0Qm9yZGVycygpO1xuICAgIH1cblxuICAgIHVwZGF0ZShzdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycywgYXZhaWxhYmxlSW1hZ2VzLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMudXBsb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbGF5b3V0QXR0cmlidXRlcyk7XG4gICAgICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgdGhpcy51cGxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdXBsb2FkQ2VudHJvaWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAodGhpcy5jZW50cm9pZFZlcnRleEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuY2VudHJvaWRWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY2VudHJvaWRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmNlbnRyb2lkVmVydGV4QXJyYXksIGNlbnRyb2lkQXR0cmlidXRlcy5tZW1iZXJzLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5lZWRzQ2VudHJvaWRVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2VudHJvaWRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLmNlbnRyb2lkVmVydGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmVlZHNDZW50cm9pZFVwZGF0ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5jZW50cm9pZFZlcnRleEJ1ZmZlcikgdGhpcy5jZW50cm9pZFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIGluZGV4OiBudW1iZXIsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5lbmFibGVUZXJyYWluID8gbmV3IFBhcnRNZXRhZGF0YSgpIDogbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IHBvbHlnb24gb2YgY2xhc3NpZnlSaW5ncyhnZW9tZXRyeSwgRUFSQ1VUX01BWF9SSU5HUykpIHtcbiAgICAgICAgICAgIGxldCBudW1WZXJ0aWNlcyA9IDA7XG4gICAgICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcblxuICAgICAgICAgICAgaWYgKHBvbHlnb24ubGVuZ3RoID09PSAwIHx8IGlzRW50aXJlbHlPdXRzaWRlKHBvbHlnb25bMF0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJpbmcgPSBwb2x5Z29uW2ldO1xuICAgICAgICAgICAgICAgIGlmIChyaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbnVtVmVydGljZXMgKz0gcmluZy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBsZXQgZWRnZURpc3RhbmNlID0gMDtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEpIG1ldGFkYXRhLnN0YXJ0UmluZyhyaW5nWzBdKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcmluZy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwMSA9IHJpbmdbcF07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcDIgPSByaW5nW3AgLSAxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0JvdW5kYXJ5RWRnZShwMSwgcDIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhKSBtZXRhZGF0YS5hcHBlbmQocDEsIHAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC52ZXJ0ZXhMZW5ndGggKyA0ID4gU2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBwMS5zdWIocDIpLl9wZXJwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2l2ZW4gdGhhdCBueiA9PT0gMCwgZW5jb2RlIG54IC8gKGFicyhueCkgKyBhYnMobnkpKSBhbmQgc2lnbnMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpbmZvcm1hdGlvbiBpcyBzdWZmaWNpZW50IHRvIHJlY29uc3RydWN0IG5vcm1hbCB2ZWN0b3IgaW4gdmVydGV4IHNoYWRlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBueFJhdGlvID0gZC54IC8gKE1hdGguYWJzKGQueCkgKyBNYXRoLmFicyhkLnkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBueVNpZ24gPSBkLnkgPiAwID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzdCA9IHAyLmRpc3QocDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZGdlRGlzdGFuY2UgKyBkaXN0ID4gMzI3NjgpIGVkZ2VEaXN0YW5jZSA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgcDEueCwgcDEueSwgbnhSYXRpbywgbnlTaWduLCAwLCAwLCBlZGdlRGlzdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwMS54LCBwMS55LCBueFJhdGlvLCBueVNpZ24sIDAsIDEsIGVkZ2VEaXN0YW5jZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlRGlzdGFuY2UgKz0gZGlzdDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwMi54LCBwMi55LCBueFJhdGlvLCBueVNpZ24sIDAsIDAsIGVkZ2VEaXN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHAyLngsIHAyLnksIG54UmF0aW8sIG55U2lnbiwgMCwgMSwgZWRnZURpc3RhbmNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDilIzilIDilIDilIDilIDilIDilIDilJBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDilIIgMCAgMSDilIIgQ291bnRlci1jbG9ja3dpc2Ugd2luZGluZyBvcmRlci5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDilIIgICAgICDilIIgVHJpYW5nbGUgMTogMCA9PiAyID0+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDilIIgMiAgMyDilIIgVHJpYW5nbGUgMjogMSA9PiAyID0+IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDilJTilIDilIDilIDilIDilIDilIDilJhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soYm90dG9tUmlnaHQsIGJvdHRvbVJpZ2h0ICsgMiwgYm90dG9tUmlnaHQgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soYm90dG9tUmlnaHQgKyAxLCBib3R0b21SaWdodCArIDIsIGJvdHRvbVJpZ2h0ICsgMyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWdtZW50LnZlcnRleExlbmd0aCArIG51bVZlcnRpY2VzID4gU2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQgPSB0aGlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KG51bVZlcnRpY2VzLCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL09ubHkgdHJpYW5ndWxhdGUgYW5kIGRyYXcgdGhlIGFyZWEgb2YgdGhlIGZlYXR1cmUgaWYgaXQgaXMgYSBwb2x5Z29uXG4gICAgICAgICAgICAvL090aGVyIGZlYXR1cmUgdHlwZXMgKGUuZy4gTGluZVN0cmluZykgZG8gbm90IGhhdmUgYXJlYSwgc28gdHJpYW5ndWxhdGlvbiBpcyBwb2ludGxlc3MgLyB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICh2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzW2ZlYXR1cmUudHlwZV0gIT09ICdQb2x5Z29uJylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbmVkID0gW107XG4gICAgICAgICAgICBjb25zdCBob2xlSW5kaWNlcyA9IFtdO1xuICAgICAgICAgICAgY29uc3QgdHJpYW5nbGVJbmRleCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByaW5nID0gcG9seWdvbltpXTtcbiAgICAgICAgICAgICAgICBpZiAocmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJpbmcgIT09IHBvbHlnb25bMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaG9sZUluZGljZXMucHVzaChmbGF0dGVuZWQubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSByaW5nW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwLngsIHAueSwgMCwgMCwgMSwgMSwgMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocC54KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocC55KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhKSBtZXRhZGF0YS5jdXJyZW50UG9seUNvdW50LnRvcCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kaWNlcyA9IGVhcmN1dChmbGF0dGVuZWQsIGhvbGVJbmRpY2VzKTtcbiAgICAgICAgICAgIGFzc2VydChpbmRpY2VzLmxlbmd0aCAlIDMgPT09IDApO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGluZGljZXMubGVuZ3RoOyBqICs9IDMpIHtcbiAgICAgICAgICAgICAgICAvLyBDb3VudGVyLWNsb2Nrd2lzZSB3aW5kaW5nIG9yZGVyLlxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgICAgICAgICAgICAgdHJpYW5nbGVJbmRleCArIGluZGljZXNbal0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2ogKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgdHJpYW5nbGVJbmRleCArIGluZGljZXNbaiArIDFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gaW5kaWNlcy5sZW5ndGggLyAzO1xuICAgICAgICAgICAgc2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gbnVtVmVydGljZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0YWRhdGEgJiYgbWV0YWRhdGEucG9seUNvdW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFdoZW4gYnVpbGRpbmcgaXMgc3BsaXQgYmV0d2VlbiB0aWxlcywgZG9uJ3QgaGFuZGxlIGZsYXQgcm9vZnMgaGVyZS5cbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5ib3JkZXJzKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RvcmUgdG8gdGhlIGJ1Y2tldC4gRmxhdCByb29mcyBhcmUgaGFuZGxlZCBpbiBmbGF0Um9vZnNVcGRhdGUsXG4gICAgICAgICAgICAgICAgLy8gYWZ0ZXIgam9pbmluZyBwYXJ0cyB0aGF0IGxheSBpbiBkaWZmZXJlbnQgYnVja2V0cy5cbiAgICAgICAgICAgICAgICBtZXRhZGF0YS52ZXJ0ZXhBcnJheU9mZnNldCA9IHRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9yZGVycyA9IG1ldGFkYXRhLmJvcmRlcnM7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZlYXR1cmVzT25Cb3JkZXIucHVzaChtZXRhZGF0YSkgLSAxO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChib3JkZXJzW2ldWzBdICE9PSBOdW1iZXIuTUFYX1ZBTFVFKSB7IHRoaXMuYm9yZGVyc1tpXS5wdXNoKGluZGV4KTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW5jb2RlQ2VudHJvaWQobWV0YWRhdGEuYm9yZGVycyA/IHVuZGVmaW5lZCA6IG1ldGFkYXRhLmNlbnRyb2lkKCksIG1ldGFkYXRhKTtcbiAgICAgICAgICAgIGFzc2VydCghdGhpcy5jZW50cm9pZFZlcnRleEFycmF5Lmxlbmd0aCB8fCB0aGlzLmNlbnRyb2lkVmVydGV4QXJyYXkubGVuZ3RoID09PSB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlLCBpbmRleCwgaW1hZ2VQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlcywgY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICBzb3J0Qm9yZGVycygpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIC8vIFNvcnQgYnkgYm9yZGVyIGludGVyc2VjdGlvbiBhcmVhIG1pbmltdW1zLCBhc2NlbmRpbmcuXG4gICAgICAgICAgICB0aGlzLmJvcmRlcnNbaV0uc29ydCgoYSwgYikgPT4gdGhpcy5mZWF0dXJlc09uQm9yZGVyW2FdLmJvcmRlcnNbaV1bMF0gLSB0aGlzLmZlYXR1cmVzT25Cb3JkZXJbYl0uYm9yZGVyc1tpXVswXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbmNvZGVDZW50cm9pZChjOiBQb2ludCwgbWV0YWRhdGE6IFBhcnRNZXRhZGF0YSwgYXBwZW5kOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBsZXQgeCwgeTtcbiAgICAgICAgLy8gRW5jb2RlZCBjZW50cm9pZCB4IGFuZCB5OlxuICAgICAgICAvLyAgICAgeCAgICAgeVxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgLy8gICAgIDAgICAgIDAgICAgRGVmYXVsdCwgbm8gZmxhdCByb29mLlxuICAgICAgICAvLyAgICAgMCAgICAgMSAgICBIaWRlLCB1c2VkIHRvIGhpZGUgcGFydHMgb2YgYnVpbGRpbmdzIG9uIGJvcmRlciB3aGlsZSBleHBlY3RpbmcgdGhlIG90aGVyIHNpZGUgdG8gZ2V0IGxvYWRlZFxuICAgICAgICAvLyAgICA+MCAgICAgMCAgICBFbGV2YXRpb24gZW5jb2RlZCB0byB1aW50MTYgd29yZFxuICAgICAgICAvLyAgICA+MCAgICA+MCAgICBFbmNvZGVkIGNlbnRyb2lkIHBvc2l0aW9uIGFuZCB4ICYgeSBzcGFuXG4gICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICBpZiAoYy55ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BhbiA9IG1ldGFkYXRhLnNwYW4oKS5fbXVsdCh0aGlzLnRpbGVUb01ldGVyKTtcbiAgICAgICAgICAgICAgICB4ID0gKE1hdGgubWF4KGMueCwgMSkgPDwgMykgKyBNYXRoLm1pbig3LCBNYXRoLnJvdW5kKHNwYW4ueCAvIDEwKSk7XG4gICAgICAgICAgICAgICAgeSA9IChNYXRoLm1heChjLnksIDEpIDw8IDMpICsgTWF0aC5taW4oNywgTWF0aC5yb3VuZChzcGFuLnkgLyAxMCkpO1xuICAgICAgICAgICAgfSBlbHNlIHsgLy8gZW5jb2RlIGhlaWdodDpcbiAgICAgICAgICAgICAgICB4ID0gTWF0aC5jZWlsKChjLnggKyBFTEVWQVRJT05fT0ZGU0VUKSAqIEVMRVZBVElPTl9TQ0FMRSk7XG4gICAgICAgICAgICAgICAgeSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIGltcG9zc2libGUgc2l0dWF0aW9uIChidWlsZGluZyB0aGF0IGhhcyB3aWR0aCBhbmQgZG9lc24ndCBjcm9zcyBib3JkZXIgY2Fubm90IGhhdmUgY2VudHJvaWRcbiAgICAgICAgICAgIC8vIGF0IGJvcmRlcikgdG8gZW5jb2RlIHVucHJvY2Vzc2VkIGJvcmRlciBidWlsZGluZzogaXQgaXMgaW5pdGlhbGx5IChhcHBlbmQgPT09IHRydWUpIGhpZGRlbiB1bnRpbFxuICAgICAgICAgICAgLy8gY29tcHV0aW5nIGNlbnRyb2lkIGZvciBqb2luZWQgYnVpbGRpbmcgcGFydHMgaW4gcmVuZGVyaW5nIHRocmVhZCAoZmxhdFJvb2ZzVXBkYXRlKS4gSWYgaXQgaW50ZXJzZWN0cyBtb3JlIHRoYW5cbiAgICAgICAgICAgIC8vIHR3byBib3JkZXJzLCBmbGF0IHJvb2YgYXBwcm9hY2ggaXMgbm90IGFwcGxpZWQuXG4gICAgICAgICAgICB4ID0gMDtcbiAgICAgICAgICAgIHkgPSArYXBwZW5kOyAvLyBIaWRlICgxKSBpbml0aWFsbHkgd2hlbiBjcmVhdGluZyAtIHZpc2liaWxpdHkgaXMgY2hhbmdlZCBpbiBkcmF3X2ZpbGxfZXh0cnVzaW9uIGFzIHNvb24gYXMgbmVpZ2hib3IgdGlsZSBnZXRzIGxvYWRlZC5cbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2VydChhcHBlbmQgfHwgbWV0YWRhdGEudmVydGV4QXJyYXlPZmZzZXQgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGxldCBvZmZzZXQgPSBhcHBlbmQgPyB0aGlzLmNlbnRyb2lkVmVydGV4QXJyYXkubGVuZ3RoIDogbWV0YWRhdGEudmVydGV4QXJyYXlPZmZzZXQ7XG4gICAgICAgIGZvciAoY29uc3QgcG9seUluZm8gb2YgbWV0YWRhdGEucG9seUNvdW50KSB7XG4gICAgICAgICAgICBpZiAoYXBwZW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZW50cm9pZFZlcnRleEFycmF5LnJlc2l6ZSh0aGlzLmNlbnRyb2lkVmVydGV4QXJyYXkubGVuZ3RoICsgcG9seUluZm8uZWRnZXMgKiA0ICsgcG9seUluZm8udG9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seUluZm8uZWRnZXMgKiAyOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNlbnRyb2lkVmVydGV4QXJyYXkuZW1wbGFjZShvZmZzZXQrKywgMCwgeSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZW50cm9pZFZlcnRleEFycmF5LmVtcGxhY2Uob2Zmc2V0KyssIHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5SW5mby50b3A7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheS5lbXBsYWNlKG9mZnNldCsrLCB4LCB5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxucmVnaXN0ZXIoJ0ZpbGxFeHRydXNpb25CdWNrZXQnLCBGaWxsRXh0cnVzaW9uQnVja2V0LCB7b21pdDogWydsYXllcnMnLCAnZmVhdHVyZXMnXX0pO1xucmVnaXN0ZXIoJ1BhcnRNZXRhZGF0YScsIFBhcnRNZXRhZGF0YSk7XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGxFeHRydXNpb25CdWNrZXQ7XG5cbmZ1bmN0aW9uIGlzQm91bmRhcnlFZGdlKHAxLCBwMikge1xuICAgIHJldHVybiAocDEueCA9PT0gcDIueCAmJiAocDEueCA8IDAgfHwgcDEueCA+IEVYVEVOVCkpIHx8XG4gICAgICAgIChwMS55ID09PSBwMi55ICYmIChwMS55IDwgMCB8fCBwMS55ID4gRVhURU5UKSk7XG59XG5cbmZ1bmN0aW9uIGlzRW50aXJlbHlPdXRzaWRlKHJpbmcpIHtcbiAgICAvLyBEaXNjYXJkIHJpbmdzIHdpdGggY29ybmVycyBvbiBib3JkZXIgaWYgYWxsIG90aGVyIHZlcnRpY2VzIGFyZSBvdXRzaWRlOiB0aGV5IGdldCBkZWZpbmVkXG4gICAgLy8gYWxzbyBpbiB0aGUgdGlsZSBhY3Jvc3MgdGhlIGJvcmRlci4gRXZlbnR1YWwgemVybyBhcmVhIHJpbmdzIGF0IGJvcmRlciBhcmUgZGlzY2FyZGVkIGJ5IGNsYXNzaWZ5UmluZ3NcbiAgICAvLyBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBoYW5kbGUgdGhhdCBjYXNlIGhlcmUuXG4gICAgcmV0dXJuIHJpbmcuZXZlcnkocCA9PiBwLnggPD0gMCkgfHxcbiAgICAgICAgcmluZy5ldmVyeShwID0+IHAueCA+PSBFWFRFTlQpIHx8XG4gICAgICAgIHJpbmcuZXZlcnkocCA9PiBwLnkgPD0gMCkgfHxcbiAgICAgICAgcmluZy5ldmVyeShwID0+IHAueSA+PSBFWFRFTlQpO1xufVxuXG5mdW5jdGlvbiB0aWxlVG9NZXRlcihjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCkge1xuICAgIGNvbnN0IGNpcmN1bWZlcmVuY2VBdEVxdWF0b3IgPSA0MDA3NTAxNztcbiAgICBjb25zdCBtZXJjYXRvclkgPSBjYW5vbmljYWwueSAvICgxIDw8IGNhbm9uaWNhbC56KTtcbiAgICBjb25zdCBleHAgPSBNYXRoLmV4cChNYXRoLlBJICogKDEgLSAyICogbWVyY2F0b3JZKSk7XG4gICAgLy8gc2ltcGxpZnkgY29zKDIgKiBhdGFuKGUpIC0gUEkvMikgZnJvbSBtZXJjYXRvcl9jb29yZGluYXRlLmpzLCByZW1vdmUgdHJpZ29ub21ldHJpY3MuXG4gICAgcmV0dXJuIGNpcmN1bWZlcmVuY2VBdEVxdWF0b3IgKiAyICogZXhwIC8gKGV4cCAqIGV4cCArIDEpIC8gRVhURU5UIC8gKDEgPDwgY2Fub25pY2FsLnopO1xufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcImZpbGwtZXh0cnVzaW9uLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwiZmlsbC1leHRydXNpb24tcGF0dGVyblwiOiBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5PFJlc29sdmVkSW1hZ2U+LFxuICAgIFwiZmlsbC1leHRydXNpb24taGVpZ2h0XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiZmlsbC1leHRydXNpb24tYmFzZVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiZmlsbC1leHRydXNpb24tb3BhY2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tcGF0dGVyblwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLWhlaWdodFwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1iYXNlXCJdKSxcbiAgICBcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLXZlcnRpY2FsLWdyYWRpZW50XCJdKSxcbn0pO1xuXG4vLyBOb3RlOiB3aXRob3V0IGFkZGluZyB0aGUgZXhwbGljaXQgdHlwZSBhbm5vdGF0aW9uLCBGbG93IGluZmVycyB3ZWFrZXIgdHlwZXNcbi8vIGZvciB0aGVzZSBvYmplY3RzIGZyb20gdGhlaXIgdXNlIGluIHRoZSBjb25zdHJ1Y3RvciB0byBTdHlsZUxheWVyLCBhc1xuLy8ge2xheW91dD86IFByb3BlcnRpZXM8Li4uPiwgcGFpbnQ6IFByb3BlcnRpZXM8Li4uPn1cbmV4cG9ydCBkZWZhdWx0ICh7IHBhaW50IH06ICRFeGFjdDx7XG4gIHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+XG59Pik7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgRmlsbEV4dHJ1c2lvbkJ1Y2tldCwge0VMRVZBVElPTl9TQ0FMRSwgRUxFVkFUSU9OX09GRlNFVH0gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQvZmlsbF9leHRydXNpb25fYnVja2V0LmpzJztcbmltcG9ydCB7cG9seWdvbkludGVyc2VjdHNQb2x5Z29uLCBwb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbn0gZnJvbSAnLi4vLi4vdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMuanMnO1xuaW1wb3J0IHt0cmFuc2xhdGVEaXN0YW5jZSwgdGlsZXNwYWNlVHJhbnNsYXRlfSBmcm9tICcuLi9xdWVyeV91dGlscy5qcyc7XG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHtUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWR9IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IFByb2dyYW1Db25maWd1cmF0aW9uIGZyb20gJy4uLy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzJztcbmltcG9ydCB7dmVjMiwgdmVjNH0gZnJvbSAnZ2wtbWF0cml4JztcblxuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZX0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtCdWNrZXRQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSB7UGFpbnRQcm9wc30gZnJvbSAnLi9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVzcGFjZVF1ZXJ5R2VvbWV0cnl9IGZyb20gJy4uL3F1ZXJ5X2dlb21ldHJ5LmpzJztcbmltcG9ydCB0eXBlIHtERU1TYW1wbGVyfSBmcm9tICcuLi8uLi90ZXJyYWluL2VsZXZhdGlvbi5qcyc7XG5cbmNsYXNzIEZpbGxFeHRydXNpb25TdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsbEV4dHJ1c2lvbkJ1Y2tldChwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBxdWVyeVJhZGl1cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlRGlzdGFuY2UodGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZScpKTtcbiAgICB9XG5cbiAgICBpczNEKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtSWRzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgcGF0dGVyblByb3BlcnR5ID0gdGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXBhdHRlcm4nKTtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcigoMTogYW55KSk7XG4gICAgICAgIHJldHVybiBbaW1hZ2UgPyAnZmlsbEV4dHJ1c2lvblBhdHRlcm4nIDogJ2ZpbGxFeHRydXNpb24nXTtcbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtQ29uZmlndXJhdGlvbih6b29tOiBudW1iZXIpOiBQcm9ncmFtQ29uZmlndXJhdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb24odGhpcywgem9vbSk7XG4gICAgfVxuXG4gICAgcXVlcnlJbnRlcnNlY3RzRmVhdHVyZShxdWVyeUdlb21ldHJ5OiBUaWxlc3BhY2VRdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxldmF0aW9uSGVscGVyOiA/REVNU2FtcGxlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFZlcnRleEFycmF5T2Zmc2V0OiBudW1iZXIpOiBib29sZWFuIHwgbnVtYmVyIHtcblxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRpbGVzcGFjZVRyYW5zbGF0ZSh0aGlzLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tdHJhbnNsYXRlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybS5hbmdsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeS5waXhlbFRvVGlsZVVuaXRzRmFjdG9yKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLWhlaWdodCcpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tYmFzZScpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG5cbiAgICAgICAgY29uc3QgY2VudHJvaWQgPSBbMCwgMF07XG4gICAgICAgIGNvbnN0IHRlcnJhaW5WaXNpYmxlID0gZWxldmF0aW9uSGVscGVyICYmIHRyYW5zZm9ybS5lbGV2YXRpb247XG4gICAgICAgIGNvbnN0IGV4YWdnZXJhdGlvbiA9IHRyYW5zZm9ybS5lbGV2YXRpb24gPyB0cmFuc2Zvcm0uZWxldmF0aW9uLmV4YWdnZXJhdGlvbigpIDogMTtcbiAgICAgICAgaWYgKHRlcnJhaW5WaXNpYmxlKSB7XG4gICAgICAgICAgICBjb25zdCBjZW50cm9pZFZlcnRleEFycmF5ID0gcXVlcnlHZW9tZXRyeS50aWxlLmdldEJ1Y2tldCh0aGlzKS5jZW50cm9pZFZlcnRleEFycmF5O1xuXG4gICAgICAgICAgICAvLyBTZWUgRmlsbEV4dHJ1c2lvbkJ1Y2tldCNlbmNvZGVDZW50cm9pZCgpLCBjZW50cm9pZCBpcyBpbnNlcnRlZCBhdCB2ZXJ0ZXhPZmZzZXQgKyAxXG4gICAgICAgICAgICBjb25zdCBjZW50cm9pZE9mZnNldCA9IGxheW91dFZlcnRleEFycmF5T2Zmc2V0ICsgMTtcbiAgICAgICAgICAgIGlmIChjZW50cm9pZE9mZnNldCA8IGNlbnRyb2lkVmVydGV4QXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VudHJvaWRWZXJ0ZXhPYmplY3QgPSBjZW50cm9pZFZlcnRleEFycmF5LmdldChjZW50cm9pZE9mZnNldCk7XG4gICAgICAgICAgICAgICAgY2VudHJvaWRbMF0gPSBjZW50cm9pZFZlcnRleE9iamVjdC5hX2NlbnRyb2lkX3BvczA7XG4gICAgICAgICAgICAgICAgY2VudHJvaWRbMV0gPSBjZW50cm9pZFZlcnRleE9iamVjdC5hX2NlbnRyb2lkX3BvczE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYXJseSBleGl0IGlmIGZpbGwgZXh0cnVzaW9uIGlzIHN0aWxsIGhpZGRlbiB3aGlsZSB3YWl0aW5nIGZvciBiYWNrZmlsbFxuICAgICAgICBjb25zdCBpc0hpZGRlbiA9IGNlbnRyb2lkWzBdID09PSAwICYmIGNlbnRyb2lkWzFdID09PSAxO1xuICAgICAgICBpZiAoaXNIaWRkZW4pIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBkZW1TYW1wbGVyID0gdGVycmFpblZpc2libGUgPyBlbGV2YXRpb25IZWxwZXIgOiBudWxsO1xuICAgICAgICBjb25zdCBwcm9qZWN0ZWQgPSBwcm9qZWN0RXh0cnVzaW9uKGdlb21ldHJ5LCBiYXNlLCBoZWlnaHQsIHRyYW5zbGF0aW9uLCBwaXhlbFBvc01hdHJpeCwgZGVtU2FtcGxlciwgY2VudHJvaWQsIGV4YWdnZXJhdGlvbiwgdHJhbnNmb3JtLmNlbnRlci5sYXQpO1xuICAgICAgICBjb25zdCBwcm9qZWN0ZWRCYXNlID0gcHJvamVjdGVkWzBdO1xuICAgICAgICBjb25zdCBwcm9qZWN0ZWRUb3AgPSBwcm9qZWN0ZWRbMV07XG5cbiAgICAgICAgY29uc3Qgc2NyZWVuUXVlcnkgPSBxdWVyeUdlb21ldHJ5LnF1ZXJ5R2VvbWV0cnk7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZFF1ZXJ5R2VvbWV0cnkgPSBzY3JlZW5RdWVyeS5pc1BvaW50UXVlcnkoKSA/IHNjcmVlblF1ZXJ5LnNjcmVlbkJvdW5kcyA6IHNjcmVlblF1ZXJ5LnNjcmVlbkdlb21ldHJ5O1xuICAgICAgICByZXR1cm4gY2hlY2tJbnRlcnNlY3Rpb24ocHJvamVjdGVkQmFzZSwgcHJvamVjdGVkVG9wLCBwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gICAgcmV0dXJuIGEueCAqIGIueCArIGEueSAqIGIueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVyc2VjdGlvbkRpc3RhbmNlKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PiwgcHJvamVjdGVkRmFjZTogQXJyYXk8UG9pbnQ+KSB7XG5cbiAgICBpZiAocHJvamVjdGVkUXVlcnlHZW9tZXRyeS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gRm9yIHBvaW50IHF1ZXJpZXMgY2FsY3VsYXRlIHRoZSB6IGF0IHdoaWNoIHRoZSBwb2ludCBpbnRlcnNlY3RzIHRoZSBmYWNlXG4gICAgICAgIC8vIHVzaW5nIGJhcnljZW50cmljIGNvb3JkaW5hdGVzLlxuXG4gICAgICAgIC8vIEZpbmQgdGhlIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIG9mIHRoZSBwcm9qZWN0ZWQgcG9pbnQgd2l0aGluIHRoZSBmaXJzdFxuICAgICAgICAvLyB0cmlhbmdsZSBvZiB0aGUgZmFjZSwgdXNpbmcgb25seSB0aGUgeHkgcGxhbmUuIEl0IGRvZXNuJ3QgbWF0dGVyIGlmIHRoZVxuICAgICAgICAvLyBwb2ludCBpcyBvdXRzaWRlIHRoZSBmaXJzdCB0cmlhbmdsZSBiZWNhdXNlIGFsbCB0aGUgdHJpYW5nbGVzIGluIHRoZSBmYWNlXG4gICAgICAgIC8vIGFyZSBpbiB0aGUgc2FtZSBwbGFuZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBwb2ludHMgYXJlIGNvaW5jaWRlbnQgYW5kIHVzZSBvdGhlciBwb2ludHMgaWYgdGhleSBhcmUuXG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgY29uc3QgYSA9IHByb2plY3RlZEZhY2VbaSsrXTtcbiAgICAgICAgbGV0IGI7XG4gICAgICAgIHdoaWxlICghYiB8fCBhLmVxdWFscyhiKSkge1xuICAgICAgICAgICAgYiA9IHByb2plY3RlZEZhY2VbaSsrXTtcbiAgICAgICAgICAgIGlmICghYikgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB1bnRpbCBwb2ludCBgY2AgaXMgbm90IGNvbGluZWFyIHdpdGggcG9pbnRzIGBhYCBhbmQgYGJgLlxuICAgICAgICBmb3IgKDsgaSA8IHByb2plY3RlZEZhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBwcm9qZWN0ZWRGYWNlW2ldO1xuXG4gICAgICAgICAgICBjb25zdCBwID0gcHJvamVjdGVkUXVlcnlHZW9tZXRyeVswXTtcblxuICAgICAgICAgICAgY29uc3QgYWIgPSBiLnN1YihhKTtcbiAgICAgICAgICAgIGNvbnN0IGFjID0gYy5zdWIoYSk7XG4gICAgICAgICAgICBjb25zdCBhcCA9IHAuc3ViKGEpO1xuXG4gICAgICAgICAgICBjb25zdCBkb3RBQkFCID0gZG90KGFiLCBhYik7XG4gICAgICAgICAgICBjb25zdCBkb3RBQkFDID0gZG90KGFiLCBhYyk7XG4gICAgICAgICAgICBjb25zdCBkb3RBQ0FDID0gZG90KGFjLCBhYyk7XG4gICAgICAgICAgICBjb25zdCBkb3RBUEFCID0gZG90KGFwLCBhYik7XG4gICAgICAgICAgICBjb25zdCBkb3RBUEFDID0gZG90KGFwLCBhYyk7XG4gICAgICAgICAgICBjb25zdCBkZW5vbSA9IGRvdEFCQUIgKiBkb3RBQ0FDIC0gZG90QUJBQyAqIGRvdEFCQUM7XG5cbiAgICAgICAgICAgIGNvbnN0IHYgPSAoZG90QUNBQyAqIGRvdEFQQUIgLSBkb3RBQkFDICogZG90QVBBQykgLyBkZW5vbTtcbiAgICAgICAgICAgIGNvbnN0IHcgPSAoZG90QUJBQiAqIGRvdEFQQUMgLSBkb3RBQkFDICogZG90QVBBQikgLyBkZW5vbTtcbiAgICAgICAgICAgIGNvbnN0IHUgPSAxIC0gdiAtIHc7XG5cbiAgICAgICAgICAgIC8vIFVzZSB0aGUgYmFyeWNlbnRyaWMgd2VpZ2h0aW5nIGFsb25nIHdpdGggdGhlIG9yaWdpbmFsIHRyaWFuZ2xlIHogY29vcmRpbmF0ZXMgdG8gZ2V0IHRoZSBwb2ludCBvZiBpbnRlcnNlY3Rpb24uXG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGEueiAqIHUgKyBiLnogKiB2ICsgYy56ICogdztcblxuICAgICAgICAgICAgaWYgKGlzRmluaXRlKGRpc3RhbmNlKSkgcmV0dXJuIGRpc3RhbmNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGNvdW50cyBhcyBjbG9zZXN0IGlzIGxlc3MgY2xlYXIgd2hlbiB0aGUgcXVlcnkgaXMgYSBib3guIFRoaXNcbiAgICAgICAgLy8gcmV0dXJucyB0aGUgZGlzdGFuY2UgdG8gdGhlIG5lYXJlc3QgcG9pbnQgb24gdGhlIGZhY2UsIHdoZXRoZXIgaXQgaXNcbiAgICAgICAgLy8gd2l0aGluIHRoZSBxdWVyeSBvciBub3QuIEl0IGNvdWxkIGJlIG1vcmUgY29ycmVjdCB0byByZXR1cm4gdGhlXG4gICAgICAgIC8vIGRpc3RhbmNlIHRvIHRoZSBjbG9zZXN0IHBvaW50IHdpdGhpbiB0aGUgcXVlcnkgYm94IGJ1dCB0aGlzIHdvdWxkIGJlXG4gICAgICAgIC8vIG1vcmUgY29tcGxpY2F0ZWQgYW5kIGV4cGVuc2l2ZSB0byBjYWxjdWxhdGUgd2l0aCBsaXR0bGUgYmVuZWZpdC5cbiAgICAgICAgbGV0IGNsb3Nlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcHJvamVjdGVkRmFjZSkge1xuICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlID0gTWF0aC5taW4oY2xvc2VzdERpc3RhbmNlLCBwLnopO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbG9zZXN0RGlzdGFuY2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbihwcm9qZWN0ZWRCYXNlOiBBcnJheTxQb2ludD4sIHByb2plY3RlZFRvcDogQXJyYXk8UG9pbnQ+LCBwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4pIHtcbiAgICBsZXQgY2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG5cbiAgICBpZiAocG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb24ocHJvamVjdGVkUXVlcnlHZW9tZXRyeSwgcHJvamVjdGVkVG9wKSkge1xuICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSBnZXRJbnRlcnNlY3Rpb25EaXN0YW5jZShwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5LCBwcm9qZWN0ZWRUb3BbMF0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IHIgPSAwOyByIDwgcHJvamVjdGVkVG9wLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGNvbnN0IHJpbmdUb3AgPSBwcm9qZWN0ZWRUb3Bbcl07XG4gICAgICAgIGNvbnN0IHJpbmdCYXNlID0gcHJvamVjdGVkQmFzZVtyXTtcbiAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCByaW5nVG9wLmxlbmd0aCAtIDE7IHArKykge1xuICAgICAgICAgICAgY29uc3QgdG9wQSA9IHJpbmdUb3BbcF07XG4gICAgICAgICAgICBjb25zdCB0b3BCID0gcmluZ1RvcFtwICsgMV07XG4gICAgICAgICAgICBjb25zdCBiYXNlQSA9IHJpbmdCYXNlW3BdO1xuICAgICAgICAgICAgY29uc3QgYmFzZUIgPSByaW5nQmFzZVtwICsgMV07XG4gICAgICAgICAgICBjb25zdCBmYWNlID0gW3RvcEEsIHRvcEIsIGJhc2VCLCBiYXNlQSwgdG9wQV07XG4gICAgICAgICAgICBpZiAocG9seWdvbkludGVyc2VjdHNQb2x5Z29uKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnksIGZhY2UpKSB7XG4gICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlID0gTWF0aC5taW4oY2xvc2VzdERpc3RhbmNlLCBnZXRJbnRlcnNlY3Rpb25EaXN0YW5jZShwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5LCBmYWNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xvc2VzdERpc3RhbmNlID09PSBJbmZpbml0eSA/IGZhbHNlIDogY2xvc2VzdERpc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0RXh0cnVzaW9uKGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCB6QmFzZTogbnVtYmVyLCB6VG9wOiBudW1iZXIsIHRyYW5zbGF0aW9uOiBQb2ludCwgbTogRmxvYXQzMkFycmF5LCBkZW1TYW1wbGVyOiA/REVNU2FtcGxlciwgY2VudHJvaWQ6IHZlYzIsIGV4YWdnZXJhdGlvbjogbnVtYmVyLCBsYXQ6IG51bWJlcikge1xuICAgIGlmIChkZW1TYW1wbGVyKSB7XG4gICAgICAgIHJldHVybiBwcm9qZWN0RXh0cnVzaW9uM0QoZ2VvbWV0cnksIHpCYXNlLCB6VG9wLCB0cmFuc2xhdGlvbiwgbSwgZGVtU2FtcGxlciwgY2VudHJvaWQsIGV4YWdnZXJhdGlvbiwgbGF0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcHJvamVjdEV4dHJ1c2lvbjJEKGdlb21ldHJ5LCB6QmFzZSwgelRvcCwgdHJhbnNsYXRpb24sIG0pO1xuICAgIH1cbn1cblxuLypcbiAqIFByb2plY3QgdGhlIGdlb21ldHJ5IHVzaW5nIG1hdHJpeCBgbWAuIFRoaXMgaXMgZXNzZW50aWFsbHkgZG9pbmdcbiAqIGB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtwLngsIHAueSwgeiwgMV0sIG0pYCBidXQgdGhlIG11bHRpcGxpY2F0aW9uXG4gKiBpcyBpbmxpbmVkIHNvIHRoYXQgcGFydHMgb2YgdGhlIHByb2plY3Rpb24gdGhhdCBhcmUgdGhlIHNhbWUgYWNyb3NzXG4gKiBkaWZmZXJlbnQgcG9pbnRzIGNhbiBvbmx5IGJlIGRvbmUgb25jZS4gVGhpcyBwcm9kdWNlZCBhIG1lYXN1cmFibGVcbiAqIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LlxuICovXG5mdW5jdGlvbiBwcm9qZWN0RXh0cnVzaW9uMkQoZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIHpCYXNlOiBudW1iZXIsIHpUb3A6IG51bWJlciwgdHJhbnNsYXRpb246IFBvaW50LCBtOiBGbG9hdDMyQXJyYXkpIHtcbiAgICBjb25zdCBwcm9qZWN0ZWRCYXNlID0gW107XG4gICAgY29uc3QgcHJvamVjdGVkVG9wID0gW107XG5cbiAgICBjb25zdCBiYXNlWFogPSBtWzhdICogekJhc2U7XG4gICAgY29uc3QgYmFzZVlaID0gbVs5XSAqIHpCYXNlO1xuICAgIGNvbnN0IGJhc2VaWiA9IG1bMTBdICogekJhc2U7XG4gICAgY29uc3QgYmFzZVdaID0gbVsxMV0gKiB6QmFzZTtcbiAgICBjb25zdCB0b3BYWiA9IG1bOF0gKiB6VG9wO1xuICAgIGNvbnN0IHRvcFlaID0gbVs5XSAqIHpUb3A7XG4gICAgY29uc3QgdG9wWlogPSBtWzEwXSAqIHpUb3A7XG4gICAgY29uc3QgdG9wV1ogPSBtWzExXSAqIHpUb3A7XG5cbiAgICBmb3IgKGNvbnN0IHIgb2YgZ2VvbWV0cnkpIHtcbiAgICAgICAgY29uc3QgcmluZ0Jhc2UgPSBbXTtcbiAgICAgICAgY29uc3QgcmluZ1RvcCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2Ygcikge1xuICAgICAgICAgICAgY29uc3QgeCA9IHAueCArIHRyYW5zbGF0aW9uLng7XG4gICAgICAgICAgICBjb25zdCB5ID0gcC55ICsgdHJhbnNsYXRpb24ueTtcblxuICAgICAgICAgICAgY29uc3Qgc1ggPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVsxMl07XG4gICAgICAgICAgICBjb25zdCBzWSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzEzXTtcbiAgICAgICAgICAgIGNvbnN0IHNaID0gbVsyXSAqIHggKyBtWzZdICogeSArIG1bMTRdO1xuICAgICAgICAgICAgY29uc3Qgc1cgPSBtWzNdICogeCArIG1bN10gKiB5ICsgbVsxNV07XG5cbiAgICAgICAgICAgIGNvbnN0IGJhc2VYID0gc1ggKyBiYXNlWFo7XG4gICAgICAgICAgICBjb25zdCBiYXNlWSA9IHNZICsgYmFzZVlaO1xuICAgICAgICAgICAgY29uc3QgYmFzZVogPSBzWiArIGJhc2VaWjtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VXID0gTWF0aC5tYXgoc1cgKyBiYXNlV1osIDAuMDAwMDEpO1xuXG4gICAgICAgICAgICBjb25zdCB0b3BYID0gc1ggKyB0b3BYWjtcbiAgICAgICAgICAgIGNvbnN0IHRvcFkgPSBzWSArIHRvcFlaO1xuICAgICAgICAgICAgY29uc3QgdG9wWiA9IHNaICsgdG9wWlo7XG4gICAgICAgICAgICBjb25zdCB0b3BXID0gTWF0aC5tYXgoc1cgKyB0b3BXWiwgMC4wMDAwMSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGIgPSBuZXcgUG9pbnQoYmFzZVggLyBiYXNlVywgYmFzZVkgLyBiYXNlVyk7XG4gICAgICAgICAgICBiLnogPSBiYXNlWiAvIGJhc2VXO1xuICAgICAgICAgICAgcmluZ0Jhc2UucHVzaChiKTtcblxuICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBQb2ludCh0b3BYIC8gdG9wVywgdG9wWSAvIHRvcFcpO1xuICAgICAgICAgICAgdC56ID0gdG9wWiAvIHRvcFc7XG4gICAgICAgICAgICByaW5nVG9wLnB1c2godCk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvamVjdGVkQmFzZS5wdXNoKHJpbmdCYXNlKTtcbiAgICAgICAgcHJvamVjdGVkVG9wLnB1c2gocmluZ1RvcCk7XG4gICAgfVxuICAgIHJldHVybiBbcHJvamVjdGVkQmFzZSwgcHJvamVjdGVkVG9wXTtcbn1cblxuLypcbiAqIFByb2plY3RzIGEgZmlsbCBleHRydXNpb24gdmVydGljZXMgdG8gc2NyZWVuIHdoaWxlIGFjY291bnRpbmcgZm9yIHRlcnJhaW4uXG4gKiBUaGlzIGFuZCBpdHMgZGVwZW5kZW50IGZ1bmN0aW9ucyBhcmUgcG9ydGVkIGRpcmVjdGx5IGZyb20gYGZpbGxfZXh0cnVzaW9uLnZlcnRleC5nbHNsYFxuICogd2l0aCBhIGZldyBjby1vcmRpbmF0ZSBzcGFjZSBkaWZmZXJlbmNlcy5cbiAqXG4gKiAtIE1hdHJpeCBgbWAgcHJvamVjdHMgdG8gc2NyZWVuLXBpeGVsIHNwYWNlIGluc3RlYWQgb2YgdG8gZ2wtY29vcmRpbmF0ZXMgKE5EQylcbiAqIC0gVGV4dHVyZSBxdWVyeWluZyBpcyBwZXJmb3JtZWQgaW4gdGV4dHVyZSBwaXhlbCBjb29yZGluYXRlcyBpbnN0ZWFkIG9mICBub3JtYWxpemVkIHV2IGNvb3JkaW5hdGVzLlxuICogLSBIZWlnaHQgb2Zmc2V0IGNhbGN1bGF0aW9uIGZvciBmaWxsLWV4dHJ1c2lvbi1iYXNlIGlzIG9mZnNldCB3aXRoIC0xIGluc3RlYWQgb2YgLTUgdG8gcHJldmVudCB1bmRlcmdyb3VuZCBwaWNraW5nLlxuICovXG5mdW5jdGlvbiBwcm9qZWN0RXh0cnVzaW9uM0QoZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIHpCYXNlOiBudW1iZXIsIHpUb3A6IG51bWJlciwgdHJhbnNsYXRpb246IFBvaW50LCBtOiBGbG9hdDMyQXJyYXksIGRlbVNhbXBsZXI6IERFTVNhbXBsZXIsIGNlbnRyb2lkOiB2ZWMyLCBleGFnZ2VyYXRpb246IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICBjb25zdCBwcm9qZWN0ZWRCYXNlID0gW107XG4gICAgY29uc3QgcHJvamVjdGVkVG9wID0gW107XG4gICAgY29uc3QgdiA9IFswLCAwLCAwLCAxXTtcblxuICAgIGZvciAoY29uc3QgciBvZiBnZW9tZXRyeSkge1xuICAgICAgICBjb25zdCByaW5nQmFzZSA9IFtdO1xuICAgICAgICBjb25zdCByaW5nVG9wID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiByKSB7XG4gICAgICAgICAgICBjb25zdCB4ID0gcC54ICsgdHJhbnNsYXRpb24ueDtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBwLnkgKyB0cmFuc2xhdGlvbi55O1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0T2Zmc2V0ID0gZ2V0VGVycmFpbkhlaWdodE9mZnNldCh4LCB5LCB6QmFzZSwgelRvcCwgZGVtU2FtcGxlciwgY2VudHJvaWQsIGV4YWdnZXJhdGlvbiwgbGF0KTtcblxuICAgICAgICAgICAgdlswXSA9IHg7XG4gICAgICAgICAgICB2WzFdID0geTtcbiAgICAgICAgICAgIHZbMl0gPSBoZWlnaHRPZmZzZXQuYmFzZTtcbiAgICAgICAgICAgIHZbM10gPSAxO1xuICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHYsIHYsIG0pO1xuICAgICAgICAgICAgdlszXSA9IE1hdGgubWF4KHZbM10sIDAuMDAwMDEpO1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IHRvUG9pbnQoW3ZbMF0gLyB2WzNdLCB2WzFdIC8gdlszXSwgdlsyXSAvIHZbM11dKTtcblxuICAgICAgICAgICAgdlswXSA9IHg7XG4gICAgICAgICAgICB2WzFdID0geTtcbiAgICAgICAgICAgIHZbMl0gPSBoZWlnaHRPZmZzZXQudG9wO1xuICAgICAgICAgICAgdlszXSA9IDE7XG4gICAgICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQodiwgdiwgbSk7XG4gICAgICAgICAgICB2WzNdID0gTWF0aC5tYXgodlszXSwgMC4wMDAwMSk7XG4gICAgICAgICAgICBjb25zdCB0b3AgPSB0b1BvaW50KFt2WzBdIC8gdlszXSwgdlsxXSAvIHZbM10sIHZbMl0gLyB2WzNdXSk7XG5cbiAgICAgICAgICAgIHJpbmdCYXNlLnB1c2goYmFzZSk7XG4gICAgICAgICAgICByaW5nVG9wLnB1c2godG9wKTtcbiAgICAgICAgfVxuICAgICAgICBwcm9qZWN0ZWRCYXNlLnB1c2gocmluZ0Jhc2UpO1xuICAgICAgICBwcm9qZWN0ZWRUb3AucHVzaChyaW5nVG9wKTtcbiAgICB9XG4gICAgcmV0dXJuIFtwcm9qZWN0ZWRCYXNlLCBwcm9qZWN0ZWRUb3BdO1xufVxuXG5mdW5jdGlvbiB0b1BvaW50KHY6IHZlYzQpOiBQb2ludCB7XG4gICAgY29uc3QgcCA9IG5ldyBQb2ludCh2WzBdLCB2WzFdKTtcbiAgICBwLnogPSB2WzJdO1xuICAgIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiBnZXRUZXJyYWluSGVpZ2h0T2Zmc2V0KHg6IG51bWJlciwgeTogbnVtYmVyLCB6QmFzZTogbnVtYmVyLCB6VG9wOiBudW1iZXIsIGRlbVNhbXBsZXI6IERFTVNhbXBsZXIsIGNlbnRyb2lkOiB2ZWMyLCBleGFnZ2VyYXRpb246IG51bWJlciwgbGF0OiBudW1iZXIpOiB7IGJhc2U6IG51bWJlciwgdG9wOiBudW1iZXJ9IHtcbiAgICBjb25zdCBlbGUgPSBleGFnZ2VyYXRpb24gKiBkZW1TYW1wbGVyLmdldEVsZXZhdGlvbkF0KHgsIHksIHRydWUsIHRydWUpO1xuICAgIGNvbnN0IGZsYXRSb29mID0gY2VudHJvaWRbMF0gIT09IDA7XG4gICAgY29uc3QgY2VudHJvaWRFbGV2YXRpb24gPSBmbGF0Um9vZiA/IGNlbnRyb2lkWzFdID09PSAwID8gZXhhZ2dlcmF0aW9uICogZWxldmF0aW9uRnJvbVVpbnQxNihjZW50cm9pZFswXSkgOiBleGFnZ2VyYXRpb24gKiBmbGF0RWxldmF0aW9uKGRlbVNhbXBsZXIsIGNlbnRyb2lkLCBsYXQpIDogZWxlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGJhc2U6IGVsZSArICh6QmFzZSA9PT0gMCkgPyAtMSA6IHpCYXNlLCAvLyBVc2UgLTEgaW5zdGVhZCBvZiAtNSBpbiBzaGFkZXIgdG8gcHJldmVudCBwaWNraW5nIHVuZGVyZ3JvdW5kXG4gICAgICAgIHRvcDogZmxhdFJvb2YgPyBNYXRoLm1heChjZW50cm9pZEVsZXZhdGlvbiArIHpUb3AsIGVsZSArIHpCYXNlICsgMikgOiBlbGUgKyB6VG9wXG4gICAgfTtcbn1cblxuLy8gRWxldmF0aW9uIGlzIGVuY29kZWQgaW50byB1bml0MTYgaW4gZmlsbF9leHRydXNpb25fYnVja2V0LmpzIEZpbGxFeHRydXNpb25CdWNrZXQjZW5jb2RlQ2VudHJvaWRcbmZ1bmN0aW9uIGVsZXZhdGlvbkZyb21VaW50MTYobjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbiAvIEVMRVZBVElPTl9TQ0FMRSAtIEVMRVZBVElPTl9PRkZTRVQ7XG59XG5cbi8vIEVxdWl2YWxlbnQgR1BVIHNpZGUgZnVuY3Rpb24gaXMgaW4gX3ByZWx1ZGVfdGVycmFpbi52ZXJ0ZXguZ2xzbFxuZnVuY3Rpb24gZmxhdEVsZXZhdGlvbihkZW1TYW1wbGVyOiBERU1TYW1wbGVyLCBjZW50cm9pZDogdmVjMiwgbGF0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFNwYW4gYW5kIHBvcyBhcmUgcGFja2VkIHR3byAxNiBiaXQgdWludDE2IHZhbHVlcyBpbiBmaWxsX2V4dHJ1c2lvbl9idWNrZXQuanMgRmlsbEV4dHJ1c2lvbkJ1Y2tldCNlbmNvZGVDZW50cm9pZFxuICAgIC8vIHBvcyBpcyBlbmNvZGVkIGJ5IDw8IGJ5IDMgYml0cyB0aHVzIGRpdmlkaW5nIGJ5IDggcGVyZm9ybXMgZXF1aXZhbGVudCBvZiByaWdodCBzaGlmdGluZyBpdCBiYWNrLlxuICAgIGNvbnN0IHBvc1ggPSBNYXRoLmZsb29yKGNlbnRyb2lkWzBdIC8gOCk7XG4gICAgY29uc3QgcG9zWSA9IE1hdGguZmxvb3IoY2VudHJvaWRbMV0gLyA4KTtcblxuICAgIC8vIFNwYW4gaXMgc3RvcmVkIGluIHRoZSBsb3dlciB0aHJlZSBiaXRzIGluIG11bHRpcGxlcyBvZiAxMFxuICAgIGNvbnN0IHNwYW5YID0gMTAgKiAoY2VudHJvaWRbMF0gLSBwb3NYICogOCk7XG4gICAgY29uc3Qgc3BhblkgPSAxMCAqIChjZW50cm9pZFsxXSAtIHBvc1kgKiA4KTtcblxuICAgIC8vIEdldCBoZWlnaHQgYXQgY2VudHJvaWRcbiAgICBjb25zdCB6ID0gZGVtU2FtcGxlci5nZXRFbGV2YXRpb25BdChwb3NYLCBwb3NZLCB0cnVlLCB0cnVlKTtcbiAgICBjb25zdCBtZXRlclRvREVNID0gZGVtU2FtcGxlci5nZXRNZXRlclRvREVNKGxhdCk7XG5cbiAgICBjb25zdCB3WCA9IE1hdGguZmxvb3IoMC41ICogKHNwYW5YICogbWV0ZXJUb0RFTSAtIDEpKTtcbiAgICBjb25zdCB3WSA9IE1hdGguZmxvb3IoMC41ICogKHNwYW5ZICogbWV0ZXJUb0RFTSAtIDEpKTtcblxuICAgIGNvbnN0IHBvc1B4ID0gZGVtU2FtcGxlci50aWxlQ29vcmRUb1BpeGVsKHBvc1gsIHBvc1kpO1xuXG4gICAgY29uc3Qgb2Zmc2V0WCA9IDIgKiB3WCArIDE7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IDIgKiB3WSArIDE7XG4gICAgY29uc3QgY29ybmVycyA9IGZvdXJTYW1wbGUoZGVtU2FtcGxlciwgcG9zUHgueCAtIHdYLCBwb3NQeC55IC0gd1ksIG9mZnNldFgsIG9mZnNldFkpO1xuXG4gICAgY29uc3QgZGlmZlggPSBNYXRoLmFicyhjb3JuZXJzWzBdIC0gY29ybmVyc1sxXSk7XG4gICAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhjb3JuZXJzWzJdIC0gY29ybmVyc1szXSk7XG4gICAgY29uc3QgZGlmZlogPSBNYXRoLmFicyhjb3JuZXJzWzBdIC0gY29ybmVyc1syXSk7XG4gICAgY29uc3QgZGlmZlcgPSBNYXRoLmFicyhjb3JuZXJzWzFdIC0gY29ybmVyc1szXSk7XG5cbiAgICBjb25zdCBkaWZmU3VtWCA9IGRpZmZYICsgZGlmZlk7XG4gICAgY29uc3QgZGlmZlN1bVkgPSBkaWZmWiArIGRpZmZXO1xuXG4gICAgY29uc3Qgc2xvcGVYID0gTWF0aC5taW4oMC4yNSwgbWV0ZXJUb0RFTSAqIDAuNSAqIGRpZmZTdW1YIC8gb2Zmc2V0WCk7XG4gICAgY29uc3Qgc2xvcGVZID0gTWF0aC5taW4oMC4yNSwgbWV0ZXJUb0RFTSAqIDAuNSAqIGRpZmZTdW1ZIC8gb2Zmc2V0WSk7XG5cbiAgICByZXR1cm4geiArIE1hdGgubWF4KHNsb3BlWCAqIHNwYW5YLCBzbG9wZVkgKiBzcGFuWSk7XG59XG5cbmZ1bmN0aW9uIGZvdXJTYW1wbGUoZGVtU2FtcGxlcjogREVNU2FtcGxlciwgcG9zWDogbnVtYmVyLCBwb3NZOiBudW1iZXIsIG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyKTogdmVjNCB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgZGVtU2FtcGxlci5nZXRFbGV2YXRpb25BdFBpeGVsKHBvc1gsIHBvc1ksIHRydWUpLFxuICAgICAgICBkZW1TYW1wbGVyLmdldEVsZXZhdGlvbkF0UGl4ZWwocG9zWCArIG9mZnNldFksIHBvc1ksIHRydWUpLFxuICAgICAgICBkZW1TYW1wbGVyLmdldEVsZXZhdGlvbkF0UGl4ZWwocG9zWCwgcG9zWSArIG9mZnNldFksIHRydWUpLFxuICAgICAgICBkZW1TYW1wbGVyLmdldEVsZXZhdGlvbkF0UGl4ZWwocG9zWCArIG9mZnNldFgsIHBvc1kgKyBvZmZzZXRZLCB0cnVlKVxuICAgIF07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGxFeHRydXNpb25TdHlsZUxheWVyO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7Y3JlYXRlTGF5b3V0fSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmNvbnN0IGxpbmVMYXlvdXRBdHRyaWJ1dGVzID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zX25vcm1hbCcsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV9kYXRhJywgY29tcG9uZW50czogNCwgdHlwZTogJ1VpbnQ4J30sXG4gICAge25hbWU6ICdhX2xpbmVzb2ZhcicsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdGbG9hdDMyJ31cbl0sIDQpO1xuXG5leHBvcnQgZGVmYXVsdCBsaW5lTGF5b3V0QXR0cmlidXRlcztcbmV4cG9ydCBjb25zdCB7bWVtYmVycywgc2l6ZSwgYWxpZ25tZW50fSA9IGxpbmVMYXlvdXRBdHRyaWJ1dGVzO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7Y3JlYXRlTGF5b3V0fSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmNvbnN0IGxpbmVMYXlvdXRBdHRyaWJ1dGVzRXh0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcGFja2VkJywgY29tcG9uZW50czogMywgdHlwZTogJ0Zsb2F0MzInfVxuXSk7XG5cbmV4cG9ydCBkZWZhdWx0IGxpbmVMYXlvdXRBdHRyaWJ1dGVzRXh0O1xuZXhwb3J0IGNvbnN0IHttZW1iZXJzLCBzaXplLCBhbGlnbm1lbnR9ID0gbGluZUxheW91dEF0dHJpYnV0ZXNFeHQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0xpbmVMYXlvdXRBcnJheSwgTGluZUV4dExheW91dEFycmF5fSBmcm9tICcuLi9hcnJheV90eXBlcy5qcyc7XG5cbmltcG9ydCB7bWVtYmVycyBhcyBsYXlvdXRBdHRyaWJ1dGVzfSBmcm9tICcuL2xpbmVfYXR0cmlidXRlcy5qcyc7XG5pbXBvcnQge21lbWJlcnMgYXMgbGF5b3V0QXR0cmlidXRlc0V4dH0gZnJvbSAnLi9saW5lX2F0dHJpYnV0ZXNfZXh0LmpzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL3NlZ21lbnQuanMnO1xuaW1wb3J0IHtQcm9ncmFtQ29uZmlndXJhdGlvblNldH0gZnJvbSAnLi4vcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzJztcbmltcG9ydCB7VHJpYW5nbGVJbmRleEFycmF5fSBmcm9tICcuLi9pbmRleF9hcnJheV90eXBlLmpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZXh0ZW50LmpzJztcbmltcG9ydCBtdnQgZnJvbSAnQG1hcGJveC92ZWN0b3ItdGlsZSc7XG5jb25zdCB2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzID0gbXZ0LlZlY3RvclRpbGVGZWF0dXJlLnR5cGVzO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcbmltcG9ydCB7aGFzUGF0dGVybiwgYWRkUGF0dGVybkRlcGVuZGVuY2llc30gZnJvbSAnLi9wYXR0ZXJuX2J1Y2tldF9mZWF0dXJlcy5qcyc7XG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4uL2xvYWRfZ2VvbWV0cnkuanMnO1xuaW1wb3J0IHRvRXZhbHVhdGlvbkZlYXR1cmUgZnJvbSAnLi4vZXZhbHVhdGlvbl9mZWF0dXJlLmpzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgQnVja2V0RmVhdHVyZSxcbiAgICBJbmRleGVkRmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIExpbmVTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7U2VnbWVudH0gZnJvbSAnLi4vc2VnbWVudC5qcyc7XG5pbXBvcnQge1JHQkFJbWFnZX0gZnJvbSAnLi4vLi4vdXRpbC9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgVGV4dHVyZSBmcm9tICcuLi8uLi9yZW5kZXIvdGV4dHVyZS5qcyc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC9pbmRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL3ZlcnRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZXN9IGZyb20gJy4uLy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUuanMnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uLy4uL3JlbmRlci9pbWFnZV9hdGxhcy5qcyc7XG5pbXBvcnQgdHlwZSBMaW5lQXRsYXMgZnJvbSAnLi4vLi4vcmVuZGVyL2xpbmVfYXRsYXMuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVUcmFuc2Zvcm19IGZyb20gJy4uLy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcblxuLy8gTk9URSBPTiBFWFRSVURFIFNDQUxFOlxuLy8gc2NhbGUgdGhlIGV4dHJ1c2lvbiB2ZWN0b3Igc28gdGhhdCB0aGUgbm9ybWFsIGxlbmd0aCBpcyB0aGlzIHZhbHVlLlxuLy8gY29udGFpbnMgdGhlIFwidGV4dHVyZVwiIG5vcm1hbHMgKC0xLi4xKS4gdGhpcyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBleHRydWRlXG4vLyBub3JtYWxzIGZvciBsaW5lIGpvaW5zLCBiZWNhdXNlIHRoZSB4LXZhbHVlIHJlbWFpbnMgMCBmb3IgdGhlIHRleHR1cmVcbi8vIG5vcm1hbCBhcnJheSwgd2hpbGUgdGhlIGV4dHJ1ZGUgbm9ybWFsIGFjdHVhbGx5IG1vdmVzIHRoZSB2ZXJ0ZXggdG8gY3JlYXRlXG4vLyB0aGUgYWN1dGUvYmV2ZWxsZWQgbGluZSBqb2luLlxuY29uc3QgRVhUUlVERV9TQ0FMRSA9IDYzO1xuXG4vKlxuICogU2hhcnAgY29ybmVycyBjYXVzZSBkYXNoZWQgbGluZXMgdG8gdGlsdCBiZWNhdXNlIHRoZSBkaXN0YW5jZSBhbG9uZyB0aGUgbGluZVxuICogaXMgdGhlIHNhbWUgYXQgYm90aCB0aGUgaW5uZXIgYW5kIG91dGVyIGNvcm5lcnMuIFRvIGltcHJvdmUgdGhlIGFwcGVhcmFuY2Ugb2ZcbiAqIGRhc2hlZCBsaW5lcyB3ZSBhZGQgZXh0cmEgcG9pbnRzIG5lYXIgc2hhcnAgY29ybmVycyBzbyB0aGF0IGEgc21hbGxlciBwYXJ0XG4gKiBvZiB0aGUgbGluZSBpcyB0aWx0ZWQuXG4gKlxuICogQ09TX0hBTEZfU0hBUlBfQ09STkVSIGNvbnRyb2xzIGhvdyBzaGFycCBhIGNvcm5lciBoYXMgdG8gYmUgZm9yIHVzIHRvIGFkZCBhblxuICogZXh0cmEgdmVydGV4LiBUaGUgZGVmYXVsdCBpcyA3NSBkZWdyZWVzLlxuICpcbiAqIFRoZSBuZXdseSBjcmVhdGVkIHZlcnRpY2VzIGFyZSBwbGFjZWQgU0hBUlBfQ09STkVSX09GRlNFVCBwaXhlbHMgZnJvbSB0aGUgY29ybmVyLlxuICovXG5jb25zdCBDT1NfSEFMRl9TSEFSUF9DT1JORVIgPSBNYXRoLmNvcyg3NSAvIDIgKiAoTWF0aC5QSSAvIDE4MCkpO1xuY29uc3QgU0hBUlBfQ09STkVSX09GRlNFVCA9IDE1O1xuXG4vLyBBbmdsZSBwZXIgdHJpYW5nbGUgZm9yIGFwcHJveGltYXRpbmcgcm91bmQgbGluZSBqb2lucy5cbmNvbnN0IERFR19QRVJfVFJJQU5HTEUgPSAyMDtcblxudHlwZSBMaW5lQ2xpcHMgPSB7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbn1cblxudHlwZSBHcmFkaWVudFRleHR1cmUgPSB7XG4gICAgdGV4dHVyZTogVGV4dHVyZTtcbiAgICBncmFkaWVudDogP1JHQkFJbWFnZTtcbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgTGluZUJ1Y2tldCBpbXBsZW1lbnRzIEJ1Y2tldCB7XG4gICAgZGlzdGFuY2U6IG51bWJlcjtcbiAgICB0b3RhbERpc3RhbmNlOiBudW1iZXI7XG4gICAgbWF4TGluZUxlbmd0aDogbnVtYmVyO1xuICAgIHNjYWxlZERpc3RhbmNlOiBudW1iZXI7XG4gICAgbGluZVNvRmFyOiBudW1iZXI7XG4gICAgbGluZUNsaXBzOiA/TGluZUNsaXBzO1xuXG4gICAgZTE6IG51bWJlcjtcbiAgICBlMjogbnVtYmVyO1xuXG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICB6b29tOiBudW1iZXI7XG4gICAgb3ZlcnNjYWxpbmc6IG51bWJlcjtcbiAgICBsYXllcnM6IEFycmF5PExpbmVTdHlsZUxheWVyPjtcbiAgICBsYXllcklkczogQXJyYXk8c3RyaW5nPjtcbiAgICBncmFkaWVudHM6IHtbc3RyaW5nXTogR3JhZGllbnRUZXh0dXJlfTtcbiAgICBzdGF0ZURlcGVuZGVudExheWVyczogQXJyYXk8YW55PjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHBhdHRlcm5GZWF0dXJlczogQXJyYXk8QnVja2V0RmVhdHVyZT47XG4gICAgbGluZUNsaXBzQXJyYXk6IEFycmF5PExpbmVDbGlwcz47XG5cbiAgICBsYXlvdXRWZXJ0ZXhBcnJheTogTGluZUxheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuICAgIGxheW91dFZlcnRleEFycmF5MjogTGluZUV4dExheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG5cbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8TGluZVN0eWxlTGF5ZXI+O1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQnVja2V0UGFyYW1ldGVyczxMaW5lU3R5bGVMYXllcj4pIHtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3B0aW9ucy5vdmVyc2NhbGluZztcbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRpb25zLmxheWVycztcbiAgICAgICAgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChsYXllciA9PiBsYXllci5pZCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuICAgICAgICB0aGlzLmhhc1BhdHRlcm4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYXR0ZXJuRmVhdHVyZXMgPSBbXTtcbiAgICAgICAgdGhpcy5saW5lQ2xpcHNBcnJheSA9IFtdO1xuICAgICAgICB0aGlzLmdyYWRpZW50cyA9IHt9O1xuICAgICAgICB0aGlzLmxheWVycy5mb3JFYWNoKGxheWVyID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3JhZGllbnRzW2xheWVyLmlkXSA9IHt9O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5ID0gbmV3IExpbmVMYXlvdXRBcnJheSgpO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5MiA9IG5ldyBMaW5lRXh0TGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMubWF4TGluZUxlbmd0aCA9IDA7XG5cbiAgICAgICAgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKChsKSA9PiBsLmlzU3RhdGVEZXBlbmRlbnQoKSkubWFwKChsKSA9PiBsLmlkKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlczogQXJyYXk8SW5kZXhlZEZlYXR1cmU+LCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCB0aWxlVHJhbnNmb3JtOiBUaWxlVHJhbnNmb3JtKSB7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGhhc1BhdHRlcm4oJ2xpbmUnLCB0aGlzLmxheWVycywgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGxpbmVTb3J0S2V5ID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0LmdldCgnbGluZS1zb3J0LWtleScpO1xuICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlcyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qge2ZlYXR1cmUsIGlkLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5lZWRHZW9tZXRyeSA9IHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeTtcbiAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRpb25GZWF0dXJlID0gdG9FdmFsdWF0aW9uRmVhdHVyZShmZWF0dXJlLCBuZWVkR2VvbWV0cnkpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLmZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKSwgZXZhbHVhdGlvbkZlYXR1cmUsIGNhbm9uaWNhbCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzb3J0S2V5ID0gbGluZVNvcnRLZXkgP1xuICAgICAgICAgICAgICAgIGxpbmVTb3J0S2V5LmV2YWx1YXRlKGV2YWx1YXRpb25GZWF0dXJlLCB7fSwgY2Fub25pY2FsKSA6XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlOiBCdWNrZXRGZWF0dXJlID0ge1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0eXBlOiBmZWF0dXJlLnR5cGUsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogbmVlZEdlb21ldHJ5ID8gZXZhbHVhdGlvbkZlYXR1cmUuZ2VvbWV0cnkgOiBsb2FkR2VvbWV0cnkoZmVhdHVyZSwgY2Fub25pY2FsLCB0aWxlVHJhbnNmb3JtKSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuczoge30sXG4gICAgICAgICAgICAgICAgc29ydEtleVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYnVja2V0RmVhdHVyZXMucHVzaChidWNrZXRGZWF0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lU29ydEtleSkge1xuICAgICAgICAgICAgYnVja2V0RmVhdHVyZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGEuc29ydEtleSBpcyBhbHdheXMgYSBudW1iZXIgd2hlbiBpbiB1c2VcbiAgICAgICAgICAgICAgICByZXR1cm4gKChhLnNvcnRLZXk6IGFueSk6IG51bWJlcikgLSAoKGIuc29ydEtleTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge2xpbmVBdGxhcywgZmVhdHVyZUluZGV4fSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGhhc0ZlYXR1cmVEYXNoZXMgPSB0aGlzLmFkZENvbnN0YW50RGFzaGVzKGxpbmVBdGxhcyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBidWNrZXRGZWF0dXJlIG9mIGJ1Y2tldEZlYXR1cmVzKSB7XG4gICAgICAgICAgICBjb25zdCB7Z2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSA9IGJ1Y2tldEZlYXR1cmU7XG5cbiAgICAgICAgICAgIGlmIChoYXNGZWF0dXJlRGFzaGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlRGFzaGVzKGJ1Y2tldEZlYXR1cmUsIGxpbmVBdGxhcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuQnVja2V0RmVhdHVyZSA9IGFkZFBhdHRlcm5EZXBlbmRlbmNpZXMoJ2xpbmUnLCB0aGlzLmxheWVycywgYnVja2V0RmVhdHVyZSwgdGhpcy56b29tLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAvLyBwYXR0ZXJuIGZlYXR1cmVzIGFyZSBhZGRlZCBvbmx5IG9uY2UgdGhlIHBhdHRlcm4gaXMgbG9hZGVkIGludG8gdGhlIGltYWdlIGF0bGFzXG4gICAgICAgICAgICAgICAgLy8gc28gYXJlIHN0b3JlZCBkdXJpbmcgcG9wdWxhdGUgdW50aWwgbGF0ZXIgdXBkYXRlZCB3aXRoIHBvc2l0aW9ucyBieSB0aWxlIHdvcmtlciBpbiBhZGRGZWF0dXJlc1xuICAgICAgICAgICAgICAgIHRoaXMucGF0dGVybkZlYXR1cmVzLnB1c2gocGF0dGVybkJ1Y2tldEZlYXR1cmUpO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmVhdHVyZShidWNrZXRGZWF0dXJlLCBnZW9tZXRyeSwgaW5kZXgsIGNhbm9uaWNhbCwgbGluZUF0bGFzLnBvc2l0aW9ucywgb3B0aW9ucy5hdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXNbaW5kZXhdLmZlYXR1cmU7XG4gICAgICAgICAgICBmZWF0dXJlSW5kZXguaW5zZXJ0KGZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwgc291cmNlTGF5ZXJJbmRleCwgdGhpcy5pbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRDb25zdGFudERhc2hlcyhsaW5lQXRsYXM6IExpbmVBdGxhcykge1xuICAgICAgICBsZXQgaGFzRmVhdHVyZURhc2hlcyA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhc2hQcm9wZXJ0eVZhbHVlID0gbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLWRhc2hhcnJheScpLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgY2FwUHJvcGVydHlWYWx1ZSA9IGxheWVyLmxheW91dC5nZXQoJ2xpbmUtY2FwJykudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChkYXNoUHJvcGVydHlWYWx1ZS5raW5kICE9PSAnY29uc3RhbnQnIHx8IGNhcFByb3BlcnR5VmFsdWUua2luZCAhPT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgICAgIGhhc0ZlYXR1cmVEYXNoZXMgPSB0cnVlO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0Q2FwID0gY2FwUHJvcGVydHlWYWx1ZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdERhc2ggPSBkYXNoUHJvcGVydHlWYWx1ZS52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnN0RGFzaCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgbGluZUF0bGFzLmFkZERhc2goY29uc3REYXNoLmZyb20sIGNvbnN0Q2FwKTtcbiAgICAgICAgICAgICAgICBsaW5lQXRsYXMuYWRkRGFzaChjb25zdERhc2gudG8sIGNvbnN0Q2FwKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uc3REYXNoLm90aGVyKSBsaW5lQXRsYXMuYWRkRGFzaChjb25zdERhc2gub3RoZXIsIGNvbnN0Q2FwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNGZWF0dXJlRGFzaGVzO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmVEYXNoZXMoZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgbGluZUF0bGFzOiBMaW5lQXRsYXMpIHtcblxuICAgICAgICBjb25zdCB6b29tID0gdGhpcy56b29tO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhc2hQcm9wZXJ0eVZhbHVlID0gbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLWRhc2hhcnJheScpLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgY2FwUHJvcGVydHlWYWx1ZSA9IGxheWVyLmxheW91dC5nZXQoJ2xpbmUtY2FwJykudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChkYXNoUHJvcGVydHlWYWx1ZS5raW5kID09PSAnY29uc3RhbnQnICYmIGNhcFByb3BlcnR5VmFsdWUua2luZCA9PT0gJ2NvbnN0YW50JykgY29udGludWU7XG5cbiAgICAgICAgICAgIGxldCBtaW5EYXNoQXJyYXksIG1pZERhc2hBcnJheSwgbWF4RGFzaEFycmF5LCBtaW5DYXAsIG1pZENhcCwgbWF4Q2FwO1xuXG4gICAgICAgICAgICBpZiAoZGFzaFByb3BlcnR5VmFsdWUua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0RGFzaCA9IGRhc2hQcm9wZXJ0eVZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghY29uc3REYXNoKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBtaW5EYXNoQXJyYXkgPSBjb25zdERhc2gub3RoZXIgfHwgY29uc3REYXNoLnRvO1xuICAgICAgICAgICAgICAgIG1pZERhc2hBcnJheSA9IGNvbnN0RGFzaC50bztcbiAgICAgICAgICAgICAgICBtYXhEYXNoQXJyYXkgPSBjb25zdERhc2guZnJvbTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtaW5EYXNoQXJyYXkgPSBkYXNoUHJvcGVydHlWYWx1ZS5ldmFsdWF0ZSh7em9vbTogem9vbSAtIDF9LCBmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICBtaWREYXNoQXJyYXkgPSBkYXNoUHJvcGVydHlWYWx1ZS5ldmFsdWF0ZSh7em9vbX0sIGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgIG1heERhc2hBcnJheSA9IGRhc2hQcm9wZXJ0eVZhbHVlLmV2YWx1YXRlKHt6b29tOiB6b29tICsgMX0sIGZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2FwUHJvcGVydHlWYWx1ZS5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICAgICAgbWluQ2FwID0gbWlkQ2FwID0gbWF4Q2FwID0gY2FwUHJvcGVydHlWYWx1ZS52YWx1ZTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtaW5DYXAgPSBjYXBQcm9wZXJ0eVZhbHVlLmV2YWx1YXRlKHt6b29tOiB6b29tIC0gMX0sIGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgIG1pZENhcCA9IGNhcFByb3BlcnR5VmFsdWUuZXZhbHVhdGUoe3pvb219LCBmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICBtYXhDYXAgPSBjYXBQcm9wZXJ0eVZhbHVlLmV2YWx1YXRlKHt6b29tOiB6b29tICsgMX0sIGZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lQXRsYXMuYWRkRGFzaChtaW5EYXNoQXJyYXksIG1pbkNhcCk7XG4gICAgICAgICAgICBsaW5lQXRsYXMuYWRkRGFzaChtaWREYXNoQXJyYXksIG1pZENhcCk7XG4gICAgICAgICAgICBsaW5lQXRsYXMuYWRkRGFzaChtYXhEYXNoQXJyYXksIG1heENhcCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IGxpbmVBdGxhcy5nZXRLZXkobWluRGFzaEFycmF5LCBtaW5DYXApO1xuICAgICAgICAgICAgY29uc3QgbWlkID0gbGluZUF0bGFzLmdldEtleShtaWREYXNoQXJyYXksIG1pZENhcCk7XG4gICAgICAgICAgICBjb25zdCBtYXggPSBsaW5lQXRsYXMuZ2V0S2V5KG1heERhc2hBcnJheSwgbWF4Q2FwKTtcblxuICAgICAgICAgICAgLy8gc2F2ZSBwb3NpdGlvbnMgZm9yIHBhaW50IGFycmF5XG4gICAgICAgICAgICBmZWF0dXJlLnBhdHRlcm5zW2xheWVyLmlkXSA9IHttaW4sIG1pZCwgbWF4fTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgdXBkYXRlKHN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259KSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXMoc3RhdGVzLCB2dExheWVyLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLCBhdmFpbGFibGVJbWFnZXMsIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICBhZGRGZWF0dXJlcyhvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiB0aGlzLnBhdHRlcm5GZWF0dXJlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUsIGZlYXR1cmUuZ2VvbWV0cnksIGZlYXR1cmUuaW5kZXgsIGNhbm9uaWNhbCwgaW1hZ2VQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgdXBsb2FkUGVuZGluZygpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnVwbG9hZGVkIHx8IHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy51cGxvYWRlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0VmVydGV4QXJyYXkyLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyMiA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXkyLCBsYXlvdXRBdHRyaWJ1dGVzRXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbGF5b3V0QXR0cmlidXRlcyk7XG4gICAgICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgdGhpcy51cGxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGxpbmVGZWF0dXJlQ2xpcHMoZmVhdHVyZTogQnVja2V0RmVhdHVyZSk6ID9MaW5lQ2xpcHMge1xuICAgICAgICBpZiAoISFmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KCdtYXBib3hfY2xpcF9zdGFydCcpICYmIGZlYXR1cmUucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgnbWFwYm94X2NsaXBfZW5kJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gK2ZlYXR1cmUucHJvcGVydGllc1snbWFwYm94X2NsaXBfc3RhcnQnXTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9ICtmZWF0dXJlLnByb3BlcnRpZXNbJ21hcGJveF9jbGlwX2VuZCddO1xuICAgICAgICAgICAgcmV0dXJuIHtzdGFydCwgZW5kfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIGluZGV4OiBudW1iZXIsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5ZXJzWzBdLmxheW91dDtcbiAgICAgICAgY29uc3Qgam9pbiA9IGxheW91dC5nZXQoJ2xpbmUtam9pbicpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KTtcbiAgICAgICAgY29uc3QgY2FwID0gbGF5b3V0LmdldCgnbGluZS1jYXAnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG4gICAgICAgIGNvbnN0IG1pdGVyTGltaXQgPSBsYXlvdXQuZ2V0KCdsaW5lLW1pdGVyLWxpbWl0Jyk7XG4gICAgICAgIGNvbnN0IHJvdW5kTGltaXQgPSBsYXlvdXQuZ2V0KCdsaW5lLXJvdW5kLWxpbWl0Jyk7XG4gICAgICAgIHRoaXMubGluZUNsaXBzID0gdGhpcy5saW5lRmVhdHVyZUNsaXBzKGZlYXR1cmUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBnZW9tZXRyeSkge1xuICAgICAgICAgICAgdGhpcy5hZGRMaW5lKGxpbmUsIGZlYXR1cmUsIGpvaW4sIGNhcCwgbWl0ZXJMaW1pdCwgcm91bmRMaW1pdCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5wb3B1bGF0ZVBhaW50QXJyYXlzKHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlLCBpbmRleCwgaW1hZ2VQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlcywgY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICBhZGRMaW5lKHZlcnRpY2VzOiBBcnJheTxQb2ludD4sIGZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUsIGpvaW46IHN0cmluZywgY2FwOiBzdHJpbmcsIG1pdGVyTGltaXQ6IG51bWJlciwgcm91bmRMaW1pdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuZGlzdGFuY2UgPSAwO1xuICAgICAgICB0aGlzLnNjYWxlZERpc3RhbmNlID0gMDtcbiAgICAgICAgdGhpcy50b3RhbERpc3RhbmNlID0gMDtcbiAgICAgICAgdGhpcy5saW5lU29GYXIgPSAwO1xuXG4gICAgICAgIGlmICh0aGlzLmxpbmVDbGlwcykge1xuICAgICAgICAgICAgdGhpcy5saW5lQ2xpcHNBcnJheS5wdXNoKHRoaXMubGluZUNsaXBzKTtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgZGlzdGFuY2UsIGluIHRpbGUgdW5pdHMsIG9mIHRoaXMgdGlsZWQgbGluZSBmZWF0dXJlXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWxEaXN0YW5jZSArPSB2ZXJ0aWNlc1tpXS5kaXN0KHZlcnRpY2VzW2kgKyAxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNjYWxlZERpc3RhbmNlKCk7XG4gICAgICAgICAgICB0aGlzLm1heExpbmVMZW5ndGggPSBNYXRoLm1heCh0aGlzLm1heExpbmVMZW5ndGgsIHRoaXMudG90YWxEaXN0YW5jZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc1BvbHlnb24gPSB2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdQb2x5Z29uJztcblxuICAgICAgICAvLyBJZiB0aGUgbGluZSBoYXMgZHVwbGljYXRlIHZlcnRpY2VzIGF0IHRoZSBlbmRzLCBhZGp1c3Qgc3RhcnQvbGVuZ3RoIHRvIHJlbW92ZSB0aGVtLlxuICAgICAgICBsZXQgbGVuID0gdmVydGljZXMubGVuZ3RoO1xuICAgICAgICB3aGlsZSAobGVuID49IDIgJiYgdmVydGljZXNbbGVuIC0gMV0uZXF1YWxzKHZlcnRpY2VzW2xlbiAtIDJdKSkge1xuICAgICAgICAgICAgbGVuLS07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpcnN0ID0gMDtcbiAgICAgICAgd2hpbGUgKGZpcnN0IDwgbGVuIC0gMSAmJiB2ZXJ0aWNlc1tmaXJzdF0uZXF1YWxzKHZlcnRpY2VzW2ZpcnN0ICsgMV0pKSB7XG4gICAgICAgICAgICBmaXJzdCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWdub3JlIGludmFsaWQgZ2VvbWV0cnkuXG4gICAgICAgIGlmIChsZW4gPCAoaXNQb2x5Z29uID8gMyA6IDIpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGpvaW4gPT09ICdiZXZlbCcpIG1pdGVyTGltaXQgPSAxLjA1O1xuXG4gICAgICAgIGNvbnN0IHNoYXJwQ29ybmVyT2Zmc2V0ID0gdGhpcy5vdmVyc2NhbGluZyA8PSAxNiA/XG4gICAgICAgICAgICBTSEFSUF9DT1JORVJfT0ZGU0VUICogRVhURU5UIC8gKDUxMiAqIHRoaXMub3ZlcnNjYWxpbmcpIDpcbiAgICAgICAgICAgIDA7XG5cbiAgICAgICAgLy8gd2UgY291bGQgYmUgbW9yZSBwcmVjaXNlLCBidXQgaXQgd291bGQgb25seSBzYXZlIGEgbmVnbGlnaWJsZSBhbW91bnQgb2Ygc3BhY2VcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQobGVuICogMTAsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRWZXJ0ZXg7XG4gICAgICAgIGxldCBwcmV2VmVydGV4ID0gKCh1bmRlZmluZWQ6IGFueSk6IFBvaW50KTtcbiAgICAgICAgbGV0IG5leHRWZXJ0ZXggPSAoKHVuZGVmaW5lZDogYW55KTogUG9pbnQpO1xuICAgICAgICBsZXQgcHJldk5vcm1hbCA9ICgodW5kZWZpbmVkOiBhbnkpOiBQb2ludCk7XG4gICAgICAgIGxldCBuZXh0Tm9ybWFsID0gKCh1bmRlZmluZWQ6IGFueSk6IFBvaW50KTtcblxuICAgICAgICAvLyB0aGUgbGFzdCB0d28gdmVydGljZXMgYWRkZWRcbiAgICAgICAgdGhpcy5lMSA9IHRoaXMuZTIgPSAtMTtcblxuICAgICAgICBpZiAoaXNQb2x5Z29uKSB7XG4gICAgICAgICAgICBjdXJyZW50VmVydGV4ID0gdmVydGljZXNbbGVuIC0gMl07XG4gICAgICAgICAgICBuZXh0Tm9ybWFsID0gdmVydGljZXNbZmlyc3RdLnN1YihjdXJyZW50VmVydGV4KS5fdW5pdCgpLl9wZXJwKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykge1xuXG4gICAgICAgICAgICBuZXh0VmVydGV4ID0gaSA9PT0gbGVuIC0gMSA/XG4gICAgICAgICAgICAgICAgKGlzUG9seWdvbiA/IHZlcnRpY2VzW2ZpcnN0ICsgMV0gOiAodW5kZWZpbmVkOiBhbnkpKSA6IC8vIGlmIGl0J3MgYSBwb2x5Z29uLCB0cmVhdCB0aGUgbGFzdCB2ZXJ0ZXggbGlrZSB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpICsgMV07IC8vIGp1c3QgdGhlIG5leHQgdmVydGV4XG5cbiAgICAgICAgICAgIC8vIGlmIHR3byBjb25zZWN1dGl2ZSB2ZXJ0aWNlcyBleGlzdCwgc2tpcCB0aGUgY3VycmVudCBvbmVcbiAgICAgICAgICAgIGlmIChuZXh0VmVydGV4ICYmIHZlcnRpY2VzW2ldLmVxdWFscyhuZXh0VmVydGV4KSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmIChuZXh0Tm9ybWFsKSBwcmV2Tm9ybWFsID0gbmV4dE5vcm1hbDtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VmVydGV4KSBwcmV2VmVydGV4ID0gY3VycmVudFZlcnRleDtcblxuICAgICAgICAgICAgY3VycmVudFZlcnRleCA9IHZlcnRpY2VzW2ldO1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG5vcm1hbCB0b3dhcmRzIHRoZSBuZXh0IHZlcnRleCBpbiB0aGlzIGxpbmUuIEluIGNhc2VcbiAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIG5leHQgdmVydGV4LCBwcmV0ZW5kIHRoYXQgdGhlIGxpbmUgaXMgY29udGludWluZyBzdHJhaWdodCxcbiAgICAgICAgICAgIC8vIG1lYW5pbmcgdGhhdCB3ZSBhcmUganVzdCB1c2luZyB0aGUgcHJldmlvdXMgbm9ybWFsLlxuICAgICAgICAgICAgbmV4dE5vcm1hbCA9IG5leHRWZXJ0ZXggPyBuZXh0VmVydGV4LnN1YihjdXJyZW50VmVydGV4KS5fdW5pdCgpLl9wZXJwKCkgOiBwcmV2Tm9ybWFsO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgcHJldmlvdXMgbm9ybWFsLCB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgYVxuICAgICAgICAgICAgLy8gbm9uLWNsb3NlZCBsaW5lLCBzbyB3ZSdyZSBkb2luZyBhIHN0cmFpZ2h0IFwiam9pblwiLlxuICAgICAgICAgICAgcHJldk5vcm1hbCA9IHByZXZOb3JtYWwgfHwgbmV4dE5vcm1hbDtcblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBub3JtYWwgb2YgdGhlIGpvaW4gZXh0cnVzaW9uLiBJdCBpcyB0aGUgYW5nbGUgYmlzZWN0b3JcbiAgICAgICAgICAgIC8vIG9mIHRoZSBzZWdtZW50cyBiZXR3ZWVuIHRoZSBwcmV2aW91cyBsaW5lIGFuZCB0aGUgbmV4dCBsaW5lLlxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgMTgwwrAgYW5nbGVzLCB0aGUgcHJldiBhbmQgbmV4dCBub3JtYWxzIGNhbmNlbCBlYWNoIG90aGVyIG91dDpcbiAgICAgICAgICAgIC8vIHByZXZOb3JtYWwgKyBuZXh0Tm9ybWFsID0gKDAsIDApLCBpdHMgbWFnbml0dWRlIGlzIDAsIHNvIHRoZSB1bml0IHZlY3RvciB3b3VsZCBiZVxuICAgICAgICAgICAgLy8gdW5kZWZpbmVkLiBJbiB0aGF0IGNhc2UsIHdlJ3JlIGtlZXBpbmcgdGhlIGpvaW5Ob3JtYWwgYXQgKDAsIDApLCBzbyB0aGF0IHRoZSBjb3NIYWxmQW5nbGVcbiAgICAgICAgICAgIC8vIGJlbG93IHdpbGwgYWxzbyBiZWNvbWUgMCBhbmQgbWl0ZXJMZW5ndGggd2lsbCBiZWNvbWUgSW5maW5pdHkuXG4gICAgICAgICAgICBsZXQgam9pbk5vcm1hbCA9IHByZXZOb3JtYWwuYWRkKG5leHROb3JtYWwpO1xuICAgICAgICAgICAgaWYgKGpvaW5Ob3JtYWwueCAhPT0gMCB8fCBqb2luTm9ybWFsLnkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBqb2luTm9ybWFsLl91bml0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiAgam9pbk5vcm1hbCAgICAgcHJldk5vcm1hbFxuICAgICAgICAgICAgICogICAgICAgICAgICAg4oaWICAgICAg4oaRXG4gICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAuX19fX19fX18uIHByZXZWZXJ0ZXhcbiAgICAgICAgICAgICAqICAgICAgICAgICAgICAgIHxcbiAgICAgICAgICAgICAqIG5leHROb3JtYWwgIOKGkCAgfCAgY3VycmVudFZlcnRleFxuICAgICAgICAgICAgICogICAgICAgICAgICAgICAgfFxuICAgICAgICAgICAgICogICAgIG5leHRWZXJ0ZXggIVxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgY29zaW5lcyBvZiB0aGUgYW5nbGUgKGFuZCBpdHMgaGFsZikgdXNpbmcgZG90IHByb2R1Y3RcbiAgICAgICAgICAgIGNvbnN0IGNvc0FuZ2xlID0gcHJldk5vcm1hbC54ICogbmV4dE5vcm1hbC54ICsgcHJldk5vcm1hbC55ICogbmV4dE5vcm1hbC55O1xuICAgICAgICAgICAgY29uc3QgY29zSGFsZkFuZ2xlID0gam9pbk5vcm1hbC54ICogbmV4dE5vcm1hbC54ICsgam9pbk5vcm1hbC55ICogbmV4dE5vcm1hbC55O1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgbWl0ZXIgKHRoZSByYXRpbyBvZiB0aGUgbWl0ZXIgdG8gdGhlIHdpZHRoKVxuICAgICAgICAgICAgLy8gYXMgdGhlIGludmVyc2Ugb2YgY29zaW5lIG9mIHRoZSBhbmdsZSBiZXR3ZWVuIG5leHQgYW5kIGpvaW4gbm9ybWFsc1xuICAgICAgICAgICAgY29uc3QgbWl0ZXJMZW5ndGggPSBjb3NIYWxmQW5nbGUgIT09IDAgPyAxIC8gY29zSGFsZkFuZ2xlIDogSW5maW5pdHk7XG5cbiAgICAgICAgICAgIC8vIGFwcHJveGltYXRlIGFuZ2xlIGZyb20gY29zaW5lXG4gICAgICAgICAgICBjb25zdCBhcHByb3hBbmdsZSA9IDIgKiBNYXRoLnNxcnQoMiAtIDIgKiBjb3NIYWxmQW5nbGUpO1xuXG4gICAgICAgICAgICBjb25zdCBpc1NoYXJwQ29ybmVyID0gY29zSGFsZkFuZ2xlIDwgQ09TX0hBTEZfU0hBUlBfQ09STkVSICYmIHByZXZWZXJ0ZXggJiYgbmV4dFZlcnRleDtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVUdXJuc0xlZnQgPSBwcmV2Tm9ybWFsLnggKiBuZXh0Tm9ybWFsLnkgLSBwcmV2Tm9ybWFsLnkgKiBuZXh0Tm9ybWFsLnggPiAwO1xuXG4gICAgICAgICAgICBpZiAoaXNTaGFycENvcm5lciAmJiBpID4gZmlyc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2U2VnbWVudExlbmd0aCA9IGN1cnJlbnRWZXJ0ZXguZGlzdChwcmV2VmVydGV4KTtcbiAgICAgICAgICAgICAgICBpZiAocHJldlNlZ21lbnRMZW5ndGggPiAyICogc2hhcnBDb3JuZXJPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UHJldlZlcnRleCA9IGN1cnJlbnRWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXguc3ViKHByZXZWZXJ0ZXgpLl9tdWx0KHNoYXJwQ29ybmVyT2Zmc2V0IC8gcHJldlNlZ21lbnRMZW5ndGgpLl9yb3VuZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZShwcmV2VmVydGV4LCBuZXdQcmV2VmVydGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KG5ld1ByZXZWZXJ0ZXgsIHByZXZOb3JtYWwsIDAsIDAsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBwcmV2VmVydGV4ID0gbmV3UHJldlZlcnRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRoZSBqb2luIGlmIGEgbWlkZGxlIHZlcnRleCwgb3RoZXJ3aXNlIHRoZSBjYXAuXG4gICAgICAgICAgICBjb25zdCBtaWRkbGVWZXJ0ZXggPSBwcmV2VmVydGV4ICYmIG5leHRWZXJ0ZXg7XG4gICAgICAgICAgICBsZXQgY3VycmVudEpvaW4gPSBtaWRkbGVWZXJ0ZXggPyBqb2luIDogaXNQb2x5Z29uID8gJ2J1dHQnIDogY2FwO1xuXG4gICAgICAgICAgICBpZiAobWlkZGxlVmVydGV4ICYmIGN1cnJlbnRKb2luID09PSAncm91bmQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoIDwgcm91bmRMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Sm9pbiA9ICdtaXRlcic7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaXRlckxlbmd0aCA8PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRKb2luID0gJ2Zha2Vyb3VuZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdtaXRlcicgJiYgbWl0ZXJMZW5ndGggPiBtaXRlckxpbWl0KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEpvaW4gPSAnYmV2ZWwnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdiZXZlbCcpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgbWF4aW11bSBleHRydWRlIGxlbmd0aCBpcyAxMjggLyA2MyA9IDIgdGltZXMgdGhlIHdpZHRoIG9mIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgLy8gc28gaWYgbWl0ZXJMZW5ndGggPj0gMiB3ZSBuZWVkIHRvIGRyYXcgYSBkaWZmZXJlbnQgdHlwZSBvZiBiZXZlbCBoZXJlLlxuICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA+IDIpIGN1cnJlbnRKb2luID0gJ2ZsaXBiZXZlbCc7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbWl0ZXJMZW5ndGggaXMgcmVhbGx5IHNtYWxsIGFuZCB0aGUgbGluZSBiZXZlbCB3b3VsZG4ndCBiZSB2aXNpYmxlLFxuICAgICAgICAgICAgICAgIC8vIGp1c3QgZHJhdyBhIG1pdGVyIGpvaW4gdG8gc2F2ZSBhIHRyaWFuZ2xlLlxuICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA8IG1pdGVyTGltaXQpIGN1cnJlbnRKb2luID0gJ21pdGVyJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBmYXIgYWxvbmcgdGhlIGxpbmUgdGhlIGN1cnJlbnRWZXJ0ZXggaXNcbiAgICAgICAgICAgIGlmIChwcmV2VmVydGV4KSB0aGlzLnVwZGF0ZURpc3RhbmNlKHByZXZWZXJ0ZXgsIGN1cnJlbnRWZXJ0ZXgpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdtaXRlcicpIHtcblxuICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwuX211bHQobWl0ZXJMZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBqb2luTm9ybWFsLCAwLCAwLCBzZWdtZW50KTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2ZsaXBiZXZlbCcpIHtcbiAgICAgICAgICAgICAgICAvLyBtaXRlciBpcyB0b28gYmlnLCBmbGlwIHRoZSBkaXJlY3Rpb24gdG8gbWFrZSBhIGJldmVsZWQgam9pblxuXG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbW9zdCBwYXJhbGxlbCBsaW5lc1xuICAgICAgICAgICAgICAgICAgICBqb2luTm9ybWFsID0gbmV4dE5vcm1hbC5tdWx0KC0xKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJldmVsTGVuZ3RoID0gbWl0ZXJMZW5ndGggKiBwcmV2Tm9ybWFsLmFkZChuZXh0Tm9ybWFsKS5tYWcoKSAvIHByZXZOb3JtYWwuc3ViKG5leHROb3JtYWwpLm1hZygpO1xuICAgICAgICAgICAgICAgICAgICBqb2luTm9ybWFsLl9wZXJwKCkuX211bHQoYmV2ZWxMZW5ndGggKiAobGluZVR1cm5zTGVmdCA/IC0xIDogMSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgam9pbk5vcm1hbCwgMCwgMCwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGpvaW5Ob3JtYWwubXVsdCgtMSksIDAsIDAsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnYmV2ZWwnIHx8IGN1cnJlbnRKb2luID09PSAnZmFrZXJvdW5kJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IC1NYXRoLnNxcnQobWl0ZXJMZW5ndGggKiBtaXRlckxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldEEgPSBsaW5lVHVybnNMZWZ0ID8gb2Zmc2V0IDogMDtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRCID0gbGluZVR1cm5zTGVmdCA/IDAgOiBvZmZzZXQ7XG5cbiAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYSBiZXZlbFxuICAgICAgICAgICAgICAgIGlmIChwcmV2VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBwcmV2Tm9ybWFsLCBvZmZzZXRBLCBvZmZzZXRCLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEpvaW4gPT09ICdmYWtlcm91bmQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBqb2luIGFuZ2xlIGlzIHNoYXJwIGVub3VnaCB0aGF0IGEgcm91bmQgam9pbiB3b3VsZCBiZSB2aXNpYmxlLlxuICAgICAgICAgICAgICAgICAgICAvLyBCZXZlbCBqb2lucyBmaWxsIHRoZSBnYXAgYmV0d2VlbiBzZWdtZW50cyB3aXRoIGEgc2luZ2xlIHBpZSBzbGljZSB0cmlhbmdsZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcm91bmQgam9pbiBieSBhZGRpbmcgbXVsdGlwbGUgcGllIHNsaWNlcy4gVGhlIGpvaW4gaXNuJ3QgYWN0dWFsbHkgcm91bmQsIGJ1dFxuICAgICAgICAgICAgICAgICAgICAvLyBpdCBsb29rcyBsaWtlIGl0IGlzIGF0IHRoZSBzaXplcyB3ZSByZW5kZXIgbGluZXMgYXQuXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcGljayB0aGUgbnVtYmVyIG9mIHRyaWFuZ2xlcyBmb3IgYXBwcm94aW1hdGluZyByb3VuZCBqb2luIGJ5IGJhc2VkIG9uIHRoZSBhbmdsZSBiZXR3ZWVuIG5vcm1hbHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IE1hdGgucm91bmQoKGFwcHJveEFuZ2xlICogMTgwIC8gTWF0aC5QSSkgLyBERUdfUEVSX1RSSUFOR0xFKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtID0gMTsgbSA8IG47IG0rKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBtIC8gbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICE9PSAwLjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHByb3hpbWF0ZSBzcGhlcmljYWwgaW50ZXJwb2xhdGlvbiBodHRwczovL29ic2VydmFibGVocS5jb20vQG1vdXJuZXIvYXBwcm94aW1hdGluZy1nZW9tZXRyaWMtc2xlcnBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0MiA9IHQgLSAwLjU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQSA9IDEuMDkwNCArIGNvc0FuZ2xlICogKC0zLjI0NTIgKyBjb3NBbmdsZSAqICgzLjU1NjQ1IC0gY29zQW5nbGUgKiAxLjQzNTE5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQiA9IDAuODQ4MDEzICsgY29zQW5nbGUgKiAoLTEuMDYwMjEgKyBjb3NBbmdsZSAqIDAuMjE1NjM4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCArIHQgKiB0MiAqICh0IC0gMSkgKiAoQSAqIHQyICogdDIgKyBCKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dHJ1ZGUgPSBuZXh0Tm9ybWFsLnN1YihwcmV2Tm9ybWFsKS5fbXVsdCh0KS5fYWRkKHByZXZOb3JtYWwpLl91bml0KCkuX211bHQobGluZVR1cm5zTGVmdCA/IC0xIDogMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEhhbGZWZXJ0ZXgoY3VycmVudFZlcnRleCwgZXh0cnVkZS54LCBleHRydWRlLnksIGZhbHNlLCBsaW5lVHVybnNMZWZ0LCAwLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXh0VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG5leHQgc2VnbWVudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgbmV4dE5vcm1hbCwgLW9mZnNldEEsIC1vZmZzZXRCLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdidXR0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBqb2luTm9ybWFsLCAwLCAwLCBzZWdtZW50KTsgLy8gYnV0dCBjYXBcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ3NxdWFyZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBwcmV2VmVydGV4ID8gMSA6IC0xOyAvLyBjbG9zaW5nIG9yIHN0YXJ0aW5nIHNxdWFyZSBjYXBcblxuICAgICAgICAgICAgICAgIGlmICghcHJldlZlcnRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgam9pbk5vcm1hbCwgb2Zmc2V0LCBvZmZzZXQsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIG1ha2UgdGhlIGNhcCBpdCdzIG93biBxdWFkIHRvIGF2b2lkIHRoZSBjYXAgYWZmZWN0aW5nIHRoZSBsaW5lIGRpc3RhbmNlXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGpvaW5Ob3JtYWwsIDAsIDAsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHByZXZWZXJ0ZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGpvaW5Ob3JtYWwsIG9mZnNldCwgb2Zmc2V0LCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdyb3VuZCcpIHtcblxuICAgICAgICAgICAgICAgIGlmIChwcmV2VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHByZXZpb3VzIHNlZ21lbnQgd2l0aCBidXR0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBwcmV2Tm9ybWFsLCAwLCAwLCBzZWdtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgcm91bmQgY2FwIG9yIGxpbmVqb2luIGF0IGVuZCBvZiBzZWdtZW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBwcmV2Tm9ybWFsLCAxLCAxLCBzZWdtZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHRWZXJ0ZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHJvdW5kIGNhcCBiZWZvcmUgZmlyc3Qgc2VnbWVudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgbmV4dE5vcm1hbCwgLTEsIC0xLCBzZWdtZW50LCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBuZXh0IHNlZ21lbnQgd2l0aCBhIGJ1dHRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIG5leHROb3JtYWwsIDAsIDAsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzU2hhcnBDb3JuZXIgJiYgaSA8IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2VnbWVudExlbmd0aCA9IGN1cnJlbnRWZXJ0ZXguZGlzdChuZXh0VmVydGV4KTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dFNlZ21lbnRMZW5ndGggPiAyICogc2hhcnBDb3JuZXJPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q3VycmVudFZlcnRleCA9IGN1cnJlbnRWZXJ0ZXguYWRkKG5leHRWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXgpLl9tdWx0KHNoYXJwQ29ybmVyT2Zmc2V0IC8gbmV4dFNlZ21lbnRMZW5ndGgpLl9yb3VuZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEaXN0YW5jZShjdXJyZW50VmVydGV4LCBuZXdDdXJyZW50VmVydGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KG5ld0N1cnJlbnRWZXJ0ZXgsIG5leHROb3JtYWwsIDAsIDAsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmVydGV4ID0gbmV3Q3VycmVudFZlcnRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgdHdvIHZlcnRpY2VzIHRvIHRoZSBidWZmZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHAgdGhlIGxpbmUgdmVydGV4IHRvIGFkZCBidWZmZXIgdmVydGljZXMgZm9yXG4gICAgICogQHBhcmFtIG5vcm1hbCB2ZXJ0ZXggbm9ybWFsXG4gICAgICogQHBhcmFtIGVuZExlZnQgZXh0cnVkZSB0byBzaGlmdCB0aGUgbGVmdCB2ZXJ0ZXggYWxvbmcgdGhlIGxpbmVcbiAgICAgKiBAcGFyYW0gZW5kUmlnaHQgZXh0cnVkZSB0byBzaGlmdCB0aGUgbGVmdCB2ZXJ0ZXggYWxvbmcgdGhlIGxpbmVcbiAgICAgKiBAcGFyYW0gc2VnbWVudCB0aGUgc2VnbWVudCBvYmplY3QgdG8gYWRkIHRoZSB2ZXJ0ZXggdG9cbiAgICAgKiBAcGFyYW0gcm91bmQgd2hldGhlciB0aGlzIGlzIGEgcm91bmQgY2FwXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGRDdXJyZW50VmVydGV4KHA6IFBvaW50LCBub3JtYWw6IFBvaW50LCBlbmRMZWZ0OiBudW1iZXIsIGVuZFJpZ2h0OiBudW1iZXIsIHNlZ21lbnQ6IFNlZ21lbnQsIHJvdW5kOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgLy8gbGVmdCBhbmQgcmlnaHQgZXh0cnVkZSB2ZWN0b3JzLCBwZXJwZW5kaWN1bGFybHkgc2hpZnRlZCBieSBlbmRMZWZ0L2VuZFJpZ2h0XG4gICAgICAgIGNvbnN0IGxlZnRYID0gbm9ybWFsLnggKyBub3JtYWwueSAqIGVuZExlZnQ7XG4gICAgICAgIGNvbnN0IGxlZnRZID0gbm9ybWFsLnkgLSBub3JtYWwueCAqIGVuZExlZnQ7XG4gICAgICAgIGNvbnN0IHJpZ2h0WCA9IC1ub3JtYWwueCArIG5vcm1hbC55ICogZW5kUmlnaHQ7XG4gICAgICAgIGNvbnN0IHJpZ2h0WSA9IC1ub3JtYWwueSAtIG5vcm1hbC54ICogZW5kUmlnaHQ7XG5cbiAgICAgICAgdGhpcy5hZGRIYWxmVmVydGV4KHAsIGxlZnRYLCBsZWZ0WSwgcm91bmQsIGZhbHNlLCBlbmRMZWZ0LCBzZWdtZW50KTtcbiAgICAgICAgdGhpcy5hZGRIYWxmVmVydGV4KHAsIHJpZ2h0WCwgcmlnaHRZLCByb3VuZCwgdHJ1ZSwgLWVuZFJpZ2h0LCBzZWdtZW50KTtcbiAgICB9XG5cbiAgICBhZGRIYWxmVmVydGV4KHt4LCB5fTogUG9pbnQsIGV4dHJ1ZGVYOiBudW1iZXIsIGV4dHJ1ZGVZOiBudW1iZXIsIHJvdW5kOiBib29sZWFuLCB1cDogYm9vbGVhbiwgZGlyOiBudW1iZXIsIHNlZ21lbnQ6IFNlZ21lbnQpIHtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgICAgIC8vIGFfcG9zX25vcm1hbFxuICAgICAgICAgICAgLy8gRW5jb2RlIHJvdW5kL3VwIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzXG4gICAgICAgICAgICAoeCA8PCAxKSArIChyb3VuZCA/IDEgOiAwKSxcbiAgICAgICAgICAgICh5IDw8IDEpICsgKHVwID8gMSA6IDApLFxuICAgICAgICAgICAgLy8gYV9kYXRhXG4gICAgICAgICAgICAvLyBhZGQgMTI4IHRvIHN0b3JlIGEgYnl0ZSBpbiBhbiB1bnNpZ25lZCBieXRlXG4gICAgICAgICAgICBNYXRoLnJvdW5kKEVYVFJVREVfU0NBTEUgKiBleHRydWRlWCkgKyAxMjgsXG4gICAgICAgICAgICBNYXRoLnJvdW5kKEVYVFJVREVfU0NBTEUgKiBleHRydWRlWSkgKyAxMjgsXG4gICAgICAgICAgICAoKGRpciA9PT0gMCA/IDAgOiAoZGlyIDwgMCA/IC0xIDogMSkpICsgMSksXG4gICAgICAgICAgICAwLCAvLyB1bnVzZWRcbiAgICAgICAgICAgIC8vIGFfbGluZXNvZmFyXG4gICAgICAgICAgICB0aGlzLmxpbmVTb0Zhcik7XG5cbiAgICAgICAgLy8gQ29uc3RydWN0cyBhIHNlY29uZCB2ZXJ0ZXggYnVmZmVyIHdpdGggaGlnaGVyIHByZWNpc2lvbiBsaW5lIHByb2dyZXNzXG4gICAgICAgIGlmICh0aGlzLmxpbmVDbGlwcykge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheTIuZW1wbGFjZUJhY2sodGhpcy5zY2FsZWREaXN0YW5jZSwgdGhpcy5saW5lQ2xpcHNBcnJheS5sZW5ndGgsIHRoaXMubGluZVNvRmFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGUgPSBzZWdtZW50LnZlcnRleExlbmd0aCsrO1xuICAgICAgICBpZiAodGhpcy5lMSA+PSAwICYmIHRoaXMuZTIgPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKHRoaXMuZTEsIHRoaXMuZTIsIGUpO1xuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGgrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAodXApIHtcbiAgICAgICAgICAgIHRoaXMuZTIgPSBlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lMSA9IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVTY2FsZWREaXN0YW5jZSgpIHtcbiAgICAgICAgLy8gS25vd2luZyB0aGUgcmF0aW8gb2YgdGhlIGZ1bGwgbGluZXN0cmluZyBjb3ZlcmVkIGJ5IHRoaXMgdGlsZWQgZmVhdHVyZSwgYXMgd2VsbFxuICAgICAgICAvLyBhcyB0aGUgdG90YWwgZGlzdGFuY2UgKGluIHRpbGUgdW5pdHMpIG9mIHRoaXMgdGlsZWQgZmVhdHVyZSwgYW5kIHRoZSBkaXN0YW5jZVxuICAgICAgICAvLyAoaW4gdGlsZSB1bml0cykgb2YgdGhlIGN1cnJlbnQgdmVydGV4LCB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSByZWxhdGl2ZSBkaXN0YW5jZVxuICAgICAgICAvLyBvZiB0aGlzIHZlcnRleCBhbG9uZyB0aGUgZnVsbCBsaW5lc3RyaW5nIGZlYXR1cmUuXG4gICAgICAgIGlmICh0aGlzLmxpbmVDbGlwcykge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZVNoYXJlID0gdGhpcy5saW5lQ2xpcHMuZW5kIC0gdGhpcy5saW5lQ2xpcHMuc3RhcnQ7XG4gICAgICAgICAgICBjb25zdCB0b3RhbEZlYXR1cmVMZW5ndGggPSB0aGlzLnRvdGFsRGlzdGFuY2UgLyBmZWF0dXJlU2hhcmU7XG4gICAgICAgICAgICB0aGlzLnNjYWxlZERpc3RhbmNlID0gdGhpcy5kaXN0YW5jZSAvIHRoaXMudG90YWxEaXN0YW5jZTtcbiAgICAgICAgICAgIHRoaXMubGluZVNvRmFyID0gdG90YWxGZWF0dXJlTGVuZ3RoICogdGhpcy5saW5lQ2xpcHMuc3RhcnQgKyB0aGlzLmRpc3RhbmNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5saW5lU29GYXIgPSB0aGlzLmRpc3RhbmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlRGlzdGFuY2UocHJldjogUG9pbnQsIG5leHQ6IFBvaW50KSB7XG4gICAgICAgIHRoaXMuZGlzdGFuY2UgKz0gcHJldi5kaXN0KG5leHQpO1xuICAgICAgICB0aGlzLnVwZGF0ZVNjYWxlZERpc3RhbmNlKCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignTGluZUJ1Y2tldCcsIExpbmVCdWNrZXQsIHtvbWl0OiBbJ2xheWVycycsICdwYXR0ZXJuRmVhdHVyZXMnXX0pO1xuXG5leHBvcnQgZGVmYXVsdCBMaW5lQnVja2V0O1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuZXhwb3J0IHR5cGUgTGF5b3V0UHJvcHMgPSB7fFxuICAgIFwibGluZS1jYXBcIjogRGF0YURyaXZlblByb3BlcnR5PFwiYnV0dFwiIHwgXCJyb3VuZFwiIHwgXCJzcXVhcmVcIj4sXG4gICAgXCJsaW5lLWpvaW5cIjogRGF0YURyaXZlblByb3BlcnR5PFwiYmV2ZWxcIiB8IFwicm91bmRcIiB8IFwibWl0ZXJcIj4sXG4gICAgXCJsaW5lLW1pdGVyLWxpbWl0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLXJvdW5kLWxpbWl0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLXNvcnQta2V5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IGxheW91dDogUHJvcGVydGllczxMYXlvdXRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJsaW5lLWNhcFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9saW5lXCJdW1wibGluZS1jYXBcIl0pLFxuICAgIFwibGluZS1qb2luXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X2xpbmVcIl1bXCJsaW5lLWpvaW5cIl0pLFxuICAgIFwibGluZS1taXRlci1saW1pdFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X2xpbmVcIl1bXCJsaW5lLW1pdGVyLWxpbWl0XCJdKSxcbiAgICBcImxpbmUtcm91bmQtbGltaXRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9saW5lXCJdW1wibGluZS1yb3VuZC1saW1pdFwiXSksXG4gICAgXCJsaW5lLXNvcnQta2V5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X2xpbmVcIl1bXCJsaW5lLXNvcnQta2V5XCJdKSxcbn0pO1xuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcImxpbmUtb3BhY2l0eVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImxpbmUtY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImxpbmUtdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwibGluZS10cmFuc2xhdGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwibGluZS13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImxpbmUtZ2FwLXdpZHRoXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwibGluZS1vZmZzZXRcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLWJsdXJcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLWRhc2hhcnJheVwiOiBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5PEFycmF5PG51bWJlcj4+LFxuICAgIFwibGluZS1wYXR0ZXJuXCI6IENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHk8UmVzb2x2ZWRJbWFnZT4sXG4gICAgXCJsaW5lLWdyYWRpZW50XCI6IENvbG9yUmFtcFByb3BlcnR5LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwibGluZS1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtb3BhY2l0eVwiXSksXG4gICAgXCJsaW5lLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtY29sb3JcIl0pLFxuICAgIFwibGluZS10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwibGluZS13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXdpZHRoXCJdKSxcbiAgICBcImxpbmUtZ2FwLXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtZ2FwLXdpZHRoXCJdKSxcbiAgICBcImxpbmUtb2Zmc2V0XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtb2Zmc2V0XCJdKSxcbiAgICBcImxpbmUtYmx1clwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLWJsdXJcIl0pLFxuICAgIFwibGluZS1kYXNoYXJyYXlcIjogbmV3IENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtZGFzaGFycmF5XCJdKSxcbiAgICBcImxpbmUtcGF0dGVyblwiOiBuZXcgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1wYXR0ZXJuXCJdKSxcbiAgICBcImxpbmUtZ3JhZGllbnRcIjogbmV3IENvbG9yUmFtcFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLWdyYWRpZW50XCJdKSxcbn0pO1xuXG4vLyBOb3RlOiB3aXRob3V0IGFkZGluZyB0aGUgZXhwbGljaXQgdHlwZSBhbm5vdGF0aW9uLCBGbG93IGluZmVycyB3ZWFrZXIgdHlwZXNcbi8vIGZvciB0aGVzZSBvYmplY3RzIGZyb20gdGhlaXIgdXNlIGluIHRoZSBjb25zdHJ1Y3RvciB0byBTdHlsZUxheWVyLCBhc1xuLy8ge2xheW91dD86IFByb3BlcnRpZXM8Li4uPiwgcGFpbnQ6IFByb3BlcnRpZXM8Li4uPn1cbmV4cG9ydCBkZWZhdWx0ICh7IHBhaW50LCBsYXlvdXQgfTogJEV4YWN0PHtcbiAgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4sIGxheW91dDogUHJvcGVydGllczxMYXlvdXRQcm9wcz5cbn0+KTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IExpbmVCdWNrZXQgZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQvbGluZV9idWNrZXQuanMnO1xuaW1wb3J0IHtwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lfSBmcm9tICcuLi8uLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cy5qcyc7XG5pbXBvcnQge2dldE1heGltdW1QYWludFZhbHVlLCB0cmFuc2xhdGVEaXN0YW5jZSwgdHJhbnNsYXRlfSBmcm9tICcuLi9xdWVyeV91dGlscy5qcyc7XG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL2xpbmVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHtUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgTGF5b3V0LCBQb3NzaWJseUV2YWx1YXRlZCwgRGF0YURyaXZlblByb3BlcnR5fSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCBQcm9ncmFtQ29uZmlndXJhdGlvbiBmcm9tICcuLi8uLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5cbmltcG9ydCBTdGVwIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9zdGVwLmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGUsIFpvb21Db25zdGFudEV4cHJlc3Npb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7QnVja2V0LCBCdWNrZXRQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSB7TGF5b3V0UHJvcHMsIFBhaW50UHJvcHN9IGZyb20gJy4vbGluZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVzcGFjZVF1ZXJ5R2VvbWV0cnl9IGZyb20gJy4uL3F1ZXJ5X2dlb21ldHJ5LmpzJztcblxuY2xhc3MgTGluZUZsb29yd2lkdGhQcm9wZXJ0eSBleHRlbmRzIERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+IHtcbiAgICB1c2VJbnRlZ2VyWm9vbTogdHJ1ZTtcblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSksIHtcbiAgICAgICAgICAgIG5vdzogcGFyYW1ldGVycy5ub3csXG4gICAgICAgICAgICBmYWRlRHVyYXRpb246IHBhcmFtZXRlcnMuZmFkZUR1cmF0aW9uLFxuICAgICAgICAgICAgem9vbUhpc3Rvcnk6IHBhcmFtZXRlcnMuem9vbUhpc3RvcnksXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBwYXJhbWV0ZXJzLnRyYW5zaXRpb25cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdXBlci5wb3NzaWJseUV2YWx1YXRlKHZhbHVlLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZSh2YWx1ZSwgZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSB7XG4gICAgICAgIGdsb2JhbHMgPSBleHRlbmQoe30sIGdsb2JhbHMsIHt6b29tOiBNYXRoLmZsb29yKGdsb2JhbHMuem9vbSl9KTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmV2YWx1YXRlKHZhbHVlLCBnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuICAgIH1cbn1cblxuY29uc3QgbGluZUZsb29yd2lkdGhQcm9wZXJ0eSA9IG5ldyBMaW5lRmxvb3J3aWR0aFByb3BlcnR5KHByb3BlcnRpZXMucGFpbnQucHJvcGVydGllc1snbGluZS13aWR0aCddLnNwZWNpZmljYXRpb24pO1xubGluZUZsb29yd2lkdGhQcm9wZXJ0eS51c2VJbnRlZ2VyWm9vbSA9IHRydWU7XG5cbmNsYXNzIExpbmVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3VuZXZhbHVhdGVkTGF5b3V0OiBMYXlvdXQ8TGF5b3V0UHJvcHM+O1xuICAgIGxheW91dDogUG9zc2libHlFdmFsdWF0ZWQ8TGF5b3V0UHJvcHM+O1xuXG4gICAgZ3JhZGllbnRWZXJzaW9uOiBudW1iZXI7XG4gICAgc3RlcEludGVycG9sYW50OiBib29sZWFuO1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuZ3JhZGllbnRWZXJzaW9uID0gMDtcbiAgICB9XG5cbiAgICBfaGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnbGluZS1ncmFkaWVudCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb246IFpvb21Db25zdGFudEV4cHJlc3Npb248J3NvdXJjZSc+ID0gKCh0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbJ2xpbmUtZ3JhZGllbnQnXS52YWx1ZS5leHByZXNzaW9uKTogYW55KTtcbiAgICAgICAgICAgIHRoaXMuc3RlcEludGVycG9sYW50ID0gZXhwcmVzc2lvbi5fc3R5bGVFeHByZXNzaW9uICYmIGV4cHJlc3Npb24uX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uIGluc3RhbmNlb2YgU3RlcDtcbiAgICAgICAgICAgIHRoaXMuZ3JhZGllbnRWZXJzaW9uID0gKHRoaXMuZ3JhZGllbnRWZXJzaW9uICsgMSkgJSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdyYWRpZW50RXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1snbGluZS1ncmFkaWVudCddLnZhbHVlLmV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgcmVjYWxjdWxhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBzdXBlci5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzLCBhdmFpbGFibGVJbWFnZXMpO1xuXG4gICAgICAgICh0aGlzLnBhaW50Ll92YWx1ZXM6IGFueSlbJ2xpbmUtZmxvb3J3aWR0aCddID1cbiAgICAgICAgICAgIGxpbmVGbG9vcndpZHRoUHJvcGVydHkucG9zc2libHlFdmFsdWF0ZSh0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQuX3ZhbHVlc1snbGluZS13aWR0aCddLnZhbHVlLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBjcmVhdGVCdWNrZXQocGFyYW1ldGVyczogQnVja2V0UGFyYW1ldGVyczwqPikge1xuICAgICAgICByZXR1cm4gbmV3IExpbmVCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgZ2V0UHJvZ3JhbUlkcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eSA9IHRoaXMucGFpbnQuZ2V0KCdsaW5lLXBhdHRlcm4nKTtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcigoMTogYW55KSk7XG4gICAgICAgIGNvbnN0IHByb2dyYW1JZCA9IGltYWdlID8gJ2xpbmVQYXR0ZXJuJyA6ICdsaW5lJztcbiAgICAgICAgcmV0dXJuIFtwcm9ncmFtSWRdO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1Db25maWd1cmF0aW9uKHpvb206IG51bWJlcik6IFByb2dyYW1Db25maWd1cmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvbih0aGlzLCB6b29tKTtcbiAgICB9XG5cbiAgICBxdWVyeVJhZGl1cyhidWNrZXQ6IEJ1Y2tldCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGxpbmVCdWNrZXQ6IExpbmVCdWNrZXQgPSAoYnVja2V0OiBhbnkpO1xuICAgICAgICBjb25zdCB3aWR0aCA9IGdldExpbmVXaWR0aChcbiAgICAgICAgICAgIGdldE1heGltdW1QYWludFZhbHVlKCdsaW5lLXdpZHRoJywgdGhpcywgbGluZUJ1Y2tldCksXG4gICAgICAgICAgICBnZXRNYXhpbXVtUGFpbnRWYWx1ZSgnbGluZS1nYXAtd2lkdGgnLCB0aGlzLCBsaW5lQnVja2V0KSk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGdldE1heGltdW1QYWludFZhbHVlKCdsaW5lLW9mZnNldCcsIHRoaXMsIGxpbmVCdWNrZXQpO1xuICAgICAgICByZXR1cm4gd2lkdGggLyAyICsgTWF0aC5hYnMob2Zmc2V0KSArIHRyYW5zbGF0ZURpc3RhbmNlKHRoaXMucGFpbnQuZ2V0KCdsaW5lLXRyYW5zbGF0ZScpKTtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnk6IFRpbGVzcGFjZVF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAocXVlcnlHZW9tZXRyeS5xdWVyeUdlb21ldHJ5LmlzQWJvdmVIb3Jpem9uKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZFBvbHlnb24gPSB0cmFuc2xhdGUocXVlcnlHZW9tZXRyeS50aWxlc3BhY2VHZW9tZXRyeSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdsaW5lLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2xpbmUtdHJhbnNsYXRlLWFuY2hvcicpLFxuICAgICAgICAgICAgdHJhbnNmb3JtLmFuZ2xlLCBxdWVyeUdlb21ldHJ5LnBpeGVsVG9UaWxlVW5pdHNGYWN0b3IpO1xuICAgICAgICBjb25zdCBoYWxmV2lkdGggPSBxdWVyeUdlb21ldHJ5LnBpeGVsVG9UaWxlVW5pdHNGYWN0b3IgLyAyICogZ2V0TGluZVdpZHRoKFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2xpbmUtd2lkdGgnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpLFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2xpbmUtZ2FwLXdpZHRoJykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSk7XG4gICAgICAgIGNvbnN0IGxpbmVPZmZzZXQgPSB0aGlzLnBhaW50LmdldCgnbGluZS1vZmZzZXQnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuICAgICAgICBpZiAobGluZU9mZnNldCkge1xuICAgICAgICAgICAgZ2VvbWV0cnkgPSBvZmZzZXRMaW5lKGdlb21ldHJ5LCBsaW5lT2Zmc2V0ICogcXVlcnlHZW9tZXRyeS5waXhlbFRvVGlsZVVuaXRzRmFjdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lKHRyYW5zbGF0ZWRQb2x5Z29uLCBnZW9tZXRyeSwgaGFsZldpZHRoKTtcbiAgICB9XG5cbiAgICBpc1RpbGVDbGlwcGVkKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpbmVTdHlsZUxheWVyO1xuXG5mdW5jdGlvbiBnZXRMaW5lV2lkdGgobGluZVdpZHRoLCBsaW5lR2FwV2lkdGgpIHtcbiAgICBpZiAobGluZUdhcFdpZHRoID4gMCkge1xuICAgICAgICByZXR1cm4gbGluZUdhcFdpZHRoICsgMiAqIGxpbmVXaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbGluZVdpZHRoO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gb2Zmc2V0TGluZShyaW5ncywgb2Zmc2V0KSB7XG4gICAgY29uc3QgbmV3UmluZ3MgPSBbXTtcbiAgICBjb25zdCB6ZXJvID0gbmV3IFBvaW50KDAsIDApO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcmluZ3MubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgY29uc3QgcmluZyA9IHJpbmdzW2tdO1xuICAgICAgICBjb25zdCBuZXdSaW5nID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYSA9IHJpbmdbaSAtIDFdO1xuICAgICAgICAgICAgY29uc3QgYiA9IHJpbmdbaV07XG4gICAgICAgICAgICBjb25zdCBjID0gcmluZ1tpICsgMV07XG4gICAgICAgICAgICBjb25zdCBhVG9CID0gaSA9PT0gMCA/IHplcm8gOiBiLnN1YihhKS5fdW5pdCgpLl9wZXJwKCk7XG4gICAgICAgICAgICBjb25zdCBiVG9DID0gaSA9PT0gcmluZy5sZW5ndGggLSAxID8gemVybyA6IGMuc3ViKGIpLl91bml0KCkuX3BlcnAoKTtcbiAgICAgICAgICAgIGNvbnN0IGV4dHJ1ZGUgPSBhVG9CLl9hZGQoYlRvQykuX3VuaXQoKTtcblxuICAgICAgICAgICAgY29uc3QgY29zSGFsZkFuZ2xlID0gZXh0cnVkZS54ICogYlRvQy54ICsgZXh0cnVkZS55ICogYlRvQy55O1xuICAgICAgICAgICAgZXh0cnVkZS5fbXVsdCgxIC8gY29zSGFsZkFuZ2xlKTtcblxuICAgICAgICAgICAgbmV3UmluZy5wdXNoKGV4dHJ1ZGUuX211bHQob2Zmc2V0KS5fYWRkKGIpKTtcbiAgICAgICAgfVxuICAgICAgICBuZXdSaW5ncy5wdXNoKG5ld1JpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UmluZ3M7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5leHBvcnQgY29uc3Qgc3ltYm9sTGF5b3V0QXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3Bvc19vZmZzZXQnLCAgIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV90ZXhfc2l6ZScsICAgICBjb21wb25lbnRzOiA0LCB0eXBlOiAnVWludDE2J30sXG4gICAge25hbWU6ICdhX3BpeGVsb2Zmc2V0JywgIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV96X3RpbGVfYW5jaG9yJywgY29tcG9uZW50czogNCwgdHlwZTogJ0ludDE2J31cbl0sIDQpO1xuXG5leHBvcnQgY29uc3QgZHluYW1pY0xheW91dEF0dHJpYnV0ZXMgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wcm9qZWN0ZWRfcG9zJywgY29tcG9uZW50czogMywgdHlwZTogJ0Zsb2F0MzInfVxuXSwgNCk7XG5cbmV4cG9ydCBjb25zdCBwbGFjZW1lbnRPcGFjaXR5QXR0cmlidXRlcyA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX2ZhZGVfb3BhY2l0eScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MzInfVxuXSwgNCk7XG5cbmV4cG9ydCBjb25zdCBjb2xsaXNpb25WZXJ0ZXhBdHRyaWJ1dGVzID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcGxhY2VkJywgY29tcG9uZW50czogMiwgdHlwZTogJ1VpbnQ4J30sXG4gICAge25hbWU6ICdhX3NoaWZ0JywgY29tcG9uZW50czogMiwgdHlwZTogJ0Zsb2F0MzInfSxcbl0pO1xuXG5leHBvcnQgY29uc3QgY29sbGlzaW9uVmVydGV4QXR0cmlidXRlc0V4dCA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3NpemVfc2NhbGUnLCBjb21wb25lbnRzOiAxLCB0eXBlOiAnRmxvYXQzMid9LFxuICAgIHtuYW1lOiAnYV9wYWRkaW5nJywgY29tcG9uZW50czogMiwgdHlwZTogJ0Zsb2F0MzInfSxcbl0pO1xuXG5leHBvcnQgY29uc3QgY29sbGlzaW9uQm94ID0gY3JlYXRlTGF5b3V0KFtcbiAgICAvLyB0aGUgYm94IGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUgYW5jaG9yIHBvaW50XG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdwcm9qZWN0ZWRBbmNob3JYJ30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdwcm9qZWN0ZWRBbmNob3JZJ30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdwcm9qZWN0ZWRBbmNob3JaJ30sXG5cbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ3RpbGVBbmNob3JYJ30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICd0aWxlQW5jaG9yWSd9LFxuXG4gICAgLy8gZGlzdGFuY2VzIHRvIHRoZSBlZGdlcyBmcm9tIHRoZSBhbmNob3JcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAneDEnfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAneTEnfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAneDInfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAneTInfSxcblxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAncGFkZGluZyd9LFxuXG4gICAgLy8gdGhlIGluZGV4IG9mIHRoZSBmZWF0dXJlIGluIHRoZSBvcmlnaW5hbCB2ZWN0b3J0aWxlXG4gICAge3R5cGU6ICdVaW50MzInLCBuYW1lOiAnZmVhdHVyZUluZGV4J30sXG4gICAgLy8gdGhlIHNvdXJjZSBsYXllciB0aGUgZmVhdHVyZSBhcHBlYXJzIGluXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnc291cmNlTGF5ZXJJbmRleCd9LFxuICAgIC8vIHRoZSBidWNrZXQgdGhlIGZlYXR1cmUgYXBwZWFycyBpblxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ2J1Y2tldEluZGV4J30sXG5dKTtcblxuZXhwb3J0IGNvbnN0IGNvbGxpc2lvbkJveExheW91dCA9IGNyZWF0ZUxheW91dChbIC8vIHVzZWQgdG8gcmVuZGVyIGNvbGxpc2lvbiBib3hlcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAge25hbWU6ICdhX3BvcycsICAgICAgICAgICAgIGNvbXBvbmVudHM6IDMsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV9hbmNob3JfcG9zJywgICAgICBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2FfZXh0cnVkZScsICAgICAgICAgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J31cbl0sIDQpO1xuXG5leHBvcnQgY29uc3QgY29sbGlzaW9uQ2lyY2xlTGF5b3V0ID0gY3JlYXRlTGF5b3V0KFsgLy8gdXNlZCB0byByZW5kZXIgY29sbGlzaW9uIGNpcmNsZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgIHtuYW1lOiAnYV9wb3NfMmYnLCAgICAgY29tcG9uZW50czogMiwgdHlwZTogJ0Zsb2F0MzInfSxcbiAgICB7bmFtZTogJ2FfcmFkaXVzJywgICAgIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdGbG9hdDMyJ30sXG4gICAge25hbWU6ICdhX2ZsYWdzJywgICAgICBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfVxuXSwgNCk7XG5cbmV4cG9ydCBjb25zdCBxdWFkVHJpYW5nbGUgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAndHJpYW5nbGUnLCBjb21wb25lbnRzOiAzLCB0eXBlOiAnVWludDE2J30sXG5dKTtcblxuZXhwb3J0IGNvbnN0IHBsYWNlbWVudCA9IGNyZWF0ZUxheW91dChbXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdwcm9qZWN0ZWRBbmNob3JYJ30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdwcm9qZWN0ZWRBbmNob3JZJ30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdwcm9qZWN0ZWRBbmNob3JaJ30sXG4gICAge3R5cGU6ICdGbG9hdDMyJywgbmFtZTogJ3RpbGVBbmNob3JYJ30sXG4gICAge3R5cGU6ICdGbG9hdDMyJywgbmFtZTogJ3RpbGVBbmNob3JZJ30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnZ2x5cGhTdGFydEluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnbnVtR2x5cGhzJ30sXG4gICAge3R5cGU6ICdVaW50MzInLCBuYW1lOiAndmVydGV4U3RhcnRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDMyJywgbmFtZTogJ2xpbmVTdGFydEluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MzInLCBuYW1lOiAnbGluZUxlbmd0aCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ3NlZ21lbnQnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdsb3dlclNpemUnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICd1cHBlclNpemUnfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnbGluZU9mZnNldFgnfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnbGluZU9mZnNldFknfSxcbiAgICB7dHlwZTogJ1VpbnQ4JywgbmFtZTogJ3dyaXRpbmdNb2RlJ30sXG4gICAge3R5cGU6ICdVaW50OCcsIG5hbWU6ICdwbGFjZWRPcmllbnRhdGlvbid9LFxuICAgIHt0eXBlOiAnVWludDgnLCBuYW1lOiAnaGlkZGVuJ30sXG4gICAge3R5cGU6ICdVaW50MzInLCBuYW1lOiAnY3Jvc3NUaWxlSUQnfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ2Fzc29jaWF0ZWRJY29uSW5kZXgnfSxcbiAgICB7dHlwZTogJ1VpbnQ4JywgbmFtZTogJ2ZsaXBTdGF0ZSd9XG5dKTtcblxuZXhwb3J0IGNvbnN0IHN5bWJvbEluc3RhbmNlID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ3Byb2plY3RlZEFuY2hvclgnfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ3Byb2plY3RlZEFuY2hvclknfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ3Byb2plY3RlZEFuY2hvclonfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAndGlsZUFuY2hvclgnfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAndGlsZUFuY2hvclknfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ3JpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4J30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdjZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgnfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ2xlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgnfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ3ZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4J30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdwbGFjZWRJY29uU3ltYm9sSW5kZXgnfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ3ZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAna2V5J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAndGV4dEJveFN0YXJ0SW5kZXgnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICd0ZXh0Qm94RW5kSW5kZXgnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICd2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAndmVydGljYWxUZXh0Qm94RW5kSW5kZXgnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdpY29uQm94U3RhcnRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ2ljb25Cb3hFbmRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ3ZlcnRpY2FsSWNvbkJveFN0YXJ0SW5kZXgnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICd2ZXJ0aWNhbEljb25Cb3hFbmRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ2ZlYXR1cmVJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ251bUhvcml6b250YWxHbHlwaFZlcnRpY2VzJ30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzJ30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnbnVtSWNvblZlcnRpY2VzJ30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnbnVtVmVydGljYWxJY29uVmVydGljZXMnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICd1c2VSdW50aW1lQ29sbGlzaW9uQ2lyY2xlcyd9LFxuICAgIHt0eXBlOiAnVWludDMyJywgbmFtZTogJ2Nyb3NzVGlsZUlEJ30sXG4gICAge3R5cGU6ICdGbG9hdDMyJywgY29tcG9uZW50czogMiwgbmFtZTogJ3RleHRPZmZzZXQnfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnY29sbGlzaW9uQ2lyY2xlRGlhbWV0ZXInfSxcbl0pO1xuXG5leHBvcnQgY29uc3QgZ2x5cGhPZmZzZXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdvZmZzZXRYJ31cbl0pO1xuXG5leHBvcnQgY29uc3QgbGluZVZlcnRleCA9IGNyZWF0ZUxheW91dChbXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICd4J30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICd5J30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICd0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcid9XG5dKTtcbiIsIi8vIEBmbG93XG4vLyBPTkVfRU0gY29uc3RhbnQgdXNlZCB0byBnbyBiZXR3ZWVuIFwiZW1cIiB1bml0cyB1c2VkIGluIHN0eWxlIHNwZWMgYW5kIFwicG9pbnRzXCIgdXNlZCBpbnRlcm5hbGx5IGZvciBsYXlvdXRcblxuZXhwb3J0IGRlZmF1bHQgMjQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCBJbnRlcnBvbGF0ZSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IHtjbGFtcH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7UHJvcGVydHlWYWx1ZSwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSBmcm9tICcuLi9zdHlsZS9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIHtJbnRlcnBvbGF0aW9uVHlwZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2ludGVycG9sYXRlLmpzJztcblxuY29uc3QgU0laRV9QQUNLX0ZBQ1RPUiA9IDEyODtcblxuZXhwb3J0IHtnZXRTaXplRGF0YSwgZXZhbHVhdGVTaXplRm9yRmVhdHVyZSwgZXZhbHVhdGVTaXplRm9yWm9vbSwgU0laRV9QQUNLX0ZBQ1RPUn07XG5cbmV4cG9ydCB0eXBlIFNpemVEYXRhID0ge1xuICAgIGtpbmQ6ICdjb25zdGFudCcsXG4gICAgbGF5b3V0U2l6ZTogbnVtYmVyXG59IHwge1xuICAgIGtpbmQ6ICdzb3VyY2UnXG59IHwge1xuICAgIGtpbmQ6ICdjYW1lcmEnLFxuICAgIG1pblpvb206IG51bWJlcixcbiAgICBtYXhab29tOiBudW1iZXIsXG4gICAgbWluU2l6ZTogbnVtYmVyLFxuICAgIG1heFNpemU6IG51bWJlcixcbiAgICBpbnRlcnBvbGF0aW9uVHlwZTogP0ludGVycG9sYXRpb25UeXBlXG59IHwge1xuICAgIGtpbmQ6ICdjb21wb3NpdGUnLFxuICAgIG1pblpvb206IG51bWJlcixcbiAgICBtYXhab29tOiBudW1iZXIsXG4gICAgaW50ZXJwb2xhdGlvblR5cGU6ID9JbnRlcnBvbGF0aW9uVHlwZVxufTtcblxuLy8gRm9yIHt0ZXh0LGljb259LXNpemUsIGdldCB0aGUgYnVja2V0LWxldmVsIGRhdGEgdGhhdCB3aWxsIGJlIG5lZWRlZCBieVxuLy8gdGhlIHBhaW50ZXIgdG8gc2V0IHN5bWJvbC1zaXplLXJlbGF0ZWQgdW5pZm9ybXNcbmZ1bmN0aW9uIGdldFNpemVEYXRhKHRpbGVab29tOiBudW1iZXIsIHZhbHVlOiBQcm9wZXJ0eVZhbHVlPG51bWJlciwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG51bWJlcj4+KTogU2l6ZURhdGEge1xuICAgIGNvbnN0IHtleHByZXNzaW9ufSA9IHZhbHVlO1xuXG4gICAgaWYgKGV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICBjb25zdCBsYXlvdXRTaXplID0gZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGlsZVpvb20gKyAxKSk7XG4gICAgICAgIHJldHVybiB7a2luZDogJ2NvbnN0YW50JywgbGF5b3V0U2l6ZX07XG5cbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24ua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgcmV0dXJuIHtraW5kOiAnc291cmNlJ307XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7em9vbVN0b3BzLCBpbnRlcnBvbGF0aW9uVHlwZX0gPSBleHByZXNzaW9uO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBjb3ZlcmluZyB6b29tIHN0b3BzIGZvciB6b29tLWRlcGVuZGVudCB2YWx1ZXNcbiAgICAgICAgbGV0IGxvd2VyID0gMDtcbiAgICAgICAgd2hpbGUgKGxvd2VyIDwgem9vbVN0b3BzLmxlbmd0aCAmJiB6b29tU3RvcHNbbG93ZXJdIDw9IHRpbGVab29tKSBsb3dlcisrO1xuICAgICAgICBsb3dlciA9IE1hdGgubWF4KDAsIGxvd2VyIC0gMSk7XG4gICAgICAgIGxldCB1cHBlciA9IGxvd2VyO1xuICAgICAgICB3aGlsZSAodXBwZXIgPCB6b29tU3RvcHMubGVuZ3RoICYmIHpvb21TdG9wc1t1cHBlcl0gPCB0aWxlWm9vbSArIDEpIHVwcGVyKys7XG4gICAgICAgIHVwcGVyID0gTWF0aC5taW4oem9vbVN0b3BzLmxlbmd0aCAtIDEsIHVwcGVyKTtcblxuICAgICAgICBjb25zdCBtaW5ab29tID0gem9vbVN0b3BzW2xvd2VyXTtcbiAgICAgICAgY29uc3QgbWF4Wm9vbSA9IHpvb21TdG9wc1t1cHBlcl07XG5cbiAgICAgICAgLy8gV2UnZCBsaWtlIHRvIGJlIGFibGUgdG8gdXNlIENhbWVyYUV4cHJlc3Npb24gb3IgQ29tcG9zaXRlRXhwcmVzc2lvbiBpbiB0aGVzZVxuICAgICAgICAvLyByZXR1cm4gdHlwZXMgcmF0aGVyIHRoYW4gRXhwcmVzc2lvblNwZWNpZmljYXRpb24sIGJ1dCB0aGUgZm9ybWVyIGFyZSBub3RcbiAgICAgICAgLy8gdHJhbnNmZXJyYWJsZSBhY3Jvc3MgV2ViIFdvcmtlciBib3VuZGFyaWVzLlxuICAgICAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09PSAnY29tcG9zaXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIHtraW5kOiAnY29tcG9zaXRlJywgbWluWm9vbSwgbWF4Wm9vbSwgaW50ZXJwb2xhdGlvblR5cGV9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZm9yIGNhbWVyYSBmdW5jdGlvbnMsIGFsc28gc2F2ZSBvZmYgdGhlIGZ1bmN0aW9uIHZhbHVlc1xuICAgICAgICAvLyBldmFsdWF0ZWQgYXQgdGhlIGNvdmVyaW5nIHpvb20gbGV2ZWxzXG4gICAgICAgIGNvbnN0IG1pblNpemUgPSBleHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhtaW5ab29tKSk7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSBleHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhtYXhab29tKSk7XG5cbiAgICAgICAgcmV0dXJuIHtraW5kOiAnY2FtZXJhJywgbWluWm9vbSwgbWF4Wm9vbSwgbWluU2l6ZSwgbWF4U2l6ZSwgaW50ZXJwb2xhdGlvblR5cGV9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVTaXplRm9yRmVhdHVyZShzaXplRGF0YTogU2l6ZURhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt1U2l6ZSwgdVNpemVUfTogeyB1U2l6ZTogbnVtYmVyLCB1U2l6ZVQ6IG51bWJlciB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bG93ZXJTaXplLCB1cHBlclNpemV9OiB7IGxvd2VyU2l6ZTogbnVtYmVyLCB1cHBlclNpemU6IG51bWJlcn0pIHtcbiAgICBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgcmV0dXJuIGxvd2VyU2l6ZSAvIFNJWkVfUEFDS19GQUNUT1I7XG4gICAgfSBlbHNlIGlmIChzaXplRGF0YS5raW5kID09PSAnY29tcG9zaXRlJykge1xuICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUobG93ZXJTaXplIC8gU0laRV9QQUNLX0ZBQ1RPUiwgdXBwZXJTaXplIC8gU0laRV9QQUNLX0ZBQ1RPUiwgdVNpemVUKTtcbiAgICB9XG4gICAgcmV0dXJuIHVTaXplO1xufVxuXG5mdW5jdGlvbiBldmFsdWF0ZVNpemVGb3Jab29tKHNpemVEYXRhOiBTaXplRGF0YSwgem9vbTogbnVtYmVyKSB7XG4gICAgbGV0IHVTaXplVCA9IDA7XG4gICAgbGV0IHVTaXplID0gMDtcblxuICAgIGlmIChzaXplRGF0YS5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgIHVTaXplID0gc2l6ZURhdGEubGF5b3V0U2l6ZTtcblxuICAgIH0gZWxzZSBpZiAoc2l6ZURhdGEua2luZCAhPT0gJ3NvdXJjZScpIHtcbiAgICAgICAgY29uc3Qge2ludGVycG9sYXRpb25UeXBlLCBtaW5ab29tLCBtYXhab29tfSA9IHNpemVEYXRhO1xuXG4gICAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNvdWxkIGdldCB0aGUgZXhhY3QgdmFsdWUgb2YgdGhlIGNhbWVyYSBmdW5jdGlvblxuICAgICAgICAvLyBhdCB6ID0gdHIuem9vbSwgd2UgaW50ZW50aW9uYWxseSBkbyBub3Q6IGluc3RlYWQsIHdlIGludGVycG9sYXRlXG4gICAgICAgIC8vIGJldHdlZW4gdGhlIGNhbWVyYSBmdW5jdGlvbiB2YWx1ZXMgYXQgYSBwYWlyIG9mIHpvb20gc3RvcHMgY292ZXJpbmdcbiAgICAgICAgLy8gW3RpbGVab29tLCB0aWxlWm9vbSArIDFdIGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGlzXG4gICAgICAgIC8vIHJlc3RyaWN0aW9uIG9uIGNvbXBvc2l0ZSBmdW5jdGlvbnNcbiAgICAgICAgY29uc3QgdCA9ICFpbnRlcnBvbGF0aW9uVHlwZSA/IDAgOiBjbGFtcChcbiAgICAgICAgICAgIEludGVycG9sYXRlLmludGVycG9sYXRpb25GYWN0b3IoaW50ZXJwb2xhdGlvblR5cGUsIHpvb20sIG1pblpvb20sIG1heFpvb20pLCAwLCAxKTtcblxuICAgICAgICBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ2NhbWVyYScpIHtcbiAgICAgICAgICAgIHVTaXplID0gaW50ZXJwb2xhdGUoc2l6ZURhdGEubWluU2l6ZSwgc2l6ZURhdGEubWF4U2l6ZSwgdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1U2l6ZVQgPSB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt1U2l6ZVQsIHVTaXplfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7cGx1Z2luIGFzIHJ0bFRleHRQbHVnaW59IGZyb20gJy4uL3NvdXJjZS9ydGxfdGV4dF9wbHVnaW4uanMnO1xuXG5pbXBvcnQgdHlwZSBTeW1ib2xTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVRleHQodGV4dDogc3RyaW5nLCBsYXllcjogU3ltYm9sU3R5bGVMYXllciwgZmVhdHVyZTogRmVhdHVyZSkge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtdHJhbnNmb3JtJykuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgIGlmICh0cmFuc2Zvcm0gPT09ICd1cHBlcmNhc2UnKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnRvTG9jYWxlVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0cmFuc2Zvcm0gPT09ICdsb3dlcmNhc2UnKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHJ0bFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nKSB7XG4gICAgICAgIHRleHQgPSBydGxUZXh0UGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZyh0ZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odGV4dDogRm9ybWF0dGVkLCBsYXllcjogU3ltYm9sU3R5bGVMYXllciwgZmVhdHVyZTogRmVhdHVyZSk6IEZvcm1hdHRlZCB7XG4gICAgdGV4dC5zZWN0aW9ucy5mb3JFYWNoKHNlY3Rpb24gPT4ge1xuICAgICAgICBzZWN0aW9uLnRleHQgPSB0cmFuc2Zvcm1UZXh0KHNlY3Rpb24udGV4dCwgbGF5ZXIsIGZlYXR1cmUpO1xuICAgIH0pO1xuICAgIHJldHVybiB0ZXh0O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge1N5bWJvbEZlYXR1cmV9IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZmVhdHVyZXM6IEFycmF5PFN5bWJvbEZlYXR1cmU+KTogQXJyYXk8U3ltYm9sRmVhdHVyZT4ge1xuICAgIGNvbnN0IGxlZnRJbmRleDoge1tfOiBzdHJpbmddOiBudW1iZXJ9ID0ge307XG4gICAgY29uc3QgcmlnaHRJbmRleDoge1tfOiBzdHJpbmddOiBudW1iZXJ9ID0ge307XG4gICAgY29uc3QgbWVyZ2VkRmVhdHVyZXMgPSBbXTtcbiAgICBsZXQgbWVyZ2VkSW5kZXggPSAwO1xuXG4gICAgZnVuY3Rpb24gYWRkKGspIHtcbiAgICAgICAgbWVyZ2VkRmVhdHVyZXMucHVzaChmZWF0dXJlc1trXSk7XG4gICAgICAgIG1lcmdlZEluZGV4Kys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VGcm9tUmlnaHQobGVmdEtleTogc3RyaW5nLCByaWdodEtleTogc3RyaW5nLCBnZW9tKSB7XG4gICAgICAgIGNvbnN0IGkgPSByaWdodEluZGV4W2xlZnRLZXldO1xuICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtsZWZ0S2V5XTtcbiAgICAgICAgcmlnaHRJbmRleFtyaWdodEtleV0gPSBpO1xuXG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLnBvcCgpO1xuICAgICAgICBtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeVswXSA9IG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLmNvbmNhdChnZW9tWzBdKTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyZ2VGcm9tTGVmdChsZWZ0S2V5OiBzdHJpbmcsIHJpZ2h0S2V5OiBzdHJpbmcsIGdlb20pIHtcbiAgICAgICAgY29uc3QgaSA9IGxlZnRJbmRleFtyaWdodEtleV07XG4gICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbcmlnaHRLZXldO1xuICAgICAgICBsZWZ0SW5kZXhbbGVmdEtleV0gPSBpO1xuXG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLnNoaWZ0KCk7XG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdID0gZ2VvbVswXS5jb25jYXQobWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnlbMF0pO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRLZXkodGV4dCwgZ2VvbSwgb25SaWdodCkge1xuICAgICAgICBjb25zdCBwb2ludCA9IG9uUmlnaHQgPyBnZW9tWzBdW2dlb21bMF0ubGVuZ3RoIC0gMV0gOiBnZW9tWzBdWzBdO1xuICAgICAgICByZXR1cm4gYCR7dGV4dH06JHtwb2ludC54fToke3BvaW50Lnl9YDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGZlYXR1cmVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlc1trXTtcbiAgICAgICAgY29uc3QgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBmZWF0dXJlLnRleHQgPyBmZWF0dXJlLnRleHQudG9TdHJpbmcoKSA6IG51bGw7XG5cbiAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICBhZGQoayk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxlZnRLZXkgPSBnZXRLZXkodGV4dCwgZ2VvbSksXG4gICAgICAgICAgICByaWdodEtleSA9IGdldEtleSh0ZXh0LCBnZW9tLCB0cnVlKTtcblxuICAgICAgICBpZiAoKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkgJiYgKHJpZ2h0S2V5IGluIGxlZnRJbmRleCkgJiYgKHJpZ2h0SW5kZXhbbGVmdEtleV0gIT09IGxlZnRJbmRleFtyaWdodEtleV0pKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBsaW5lcyB3aXRoIHRoZSBzYW1lIHRleHQgYWRqYWNlbnQgdG8gYm90aCBlbmRzIG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlIGFsbCB0aHJlZVxuICAgICAgICAgICAgY29uc3QgaiA9IG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuICAgICAgICAgICAgY29uc3QgaSA9IG1lcmdlRnJvbVJpZ2h0KGxlZnRLZXksIHJpZ2h0S2V5LCBtZXJnZWRGZWF0dXJlc1tqXS5nZW9tZXRyeSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbbGVmdEtleV07XG4gICAgICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtyaWdodEtleV07XG5cbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbZ2V0S2V5KHRleHQsIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5LCB0cnVlKV0gPSBpO1xuICAgICAgICAgICAgbWVyZ2VkRmVhdHVyZXNbal0uZ2VvbWV0cnkgPSAobnVsbDogYW55KTtcblxuICAgICAgICB9IGVsc2UgaWYgKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkge1xuICAgICAgICAgICAgLy8gZm91bmQgbWVyZ2VhYmxlIGxpbmUgYWRqYWNlbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlXG4gICAgICAgICAgICBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyaWdodEtleSBpbiBsZWZ0SW5kZXgpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIG1lcmdlYWJsZSBsaW5lIGFkamFjZW50IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbGluZSwgbWVyZ2VcbiAgICAgICAgICAgIG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyBhZGphY2VudCBsaW5lcywgYWRkIGFzIGEgbmV3IGl0ZW1cbiAgICAgICAgICAgIGFkZChrKTtcbiAgICAgICAgICAgIGxlZnRJbmRleFtsZWZ0S2V5XSA9IG1lcmdlZEluZGV4IC0gMTtcbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbcmlnaHRLZXldID0gbWVyZ2VkSW5kZXggLSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZEZlYXR1cmVzLmZpbHRlcigoZikgPT4gZi5nZW9tZXRyeSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2NoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbn0gZnJvbSAnLi9zY3JpcHRfZGV0ZWN0aW9uLmpzJztcblxuZXhwb3J0IGNvbnN0IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcCA9IHtcbiAgICAnISc6ICfvuJUnLFxuICAgICcjJzogJ++8gycsXG4gICAgJyQnOiAn77yEJyxcbiAgICAnJSc6ICfvvIUnLFxuICAgICcmJzogJ++8hicsXG4gICAgJygnOiAn77i1JyxcbiAgICAnKSc6ICfvuLYnLFxuICAgICcqJzogJ++8iicsXG4gICAgJysnOiAn77yLJyxcbiAgICAnLCc6ICfvuJAnLFxuICAgICctJzogJ++4sicsXG4gICAgJy4nOiAn44O7JyxcbiAgICAnLyc6ICfvvI8nLFxuICAgICc6JzogJ++4kycsXG4gICAgJzsnOiAn77iUJyxcbiAgICAnPCc6ICfvuL8nLFxuICAgICc9JzogJ++8nScsXG4gICAgJz4nOiAn77mAJyxcbiAgICAnPyc6ICfvuJYnLFxuICAgICdAJzogJ++8oCcsXG4gICAgJ1snOiAn77mHJyxcbiAgICAnXFxcXCc6ICfvvLwnLFxuICAgICddJzogJ++5iCcsXG4gICAgJ14nOiAn77y+JyxcbiAgICAnXyc6ICfvuLMnLFxuICAgICdgJzogJ++9gCcsXG4gICAgJ3snOiAn77i3JyxcbiAgICAnfCc6ICfigJUnLFxuICAgICd9JzogJ++4uCcsXG4gICAgJ34nOiAn772eJyxcbiAgICAnwqInOiAn77+gJyxcbiAgICAnwqMnOiAn77+hJyxcbiAgICAnwqUnOiAn77+lJyxcbiAgICAnwqYnOiAn77+kJyxcbiAgICAnwqwnOiAn77+iJyxcbiAgICAnwq8nOiAn77+jJyxcbiAgICAn4oCTJzogJ++4sicsXG4gICAgJ+KAlCc6ICfvuLEnLFxuICAgICfigJgnOiAn77mDJyxcbiAgICAn4oCZJzogJ++5hCcsXG4gICAgJ+KAnCc6ICfvuYEnLFxuICAgICfigJ0nOiAn77mCJyxcbiAgICAn4oCmJzogJ++4mScsXG4gICAgJ+KApyc6ICfjg7snLFxuICAgICfigqknOiAn77+mJyxcbiAgICAn44CBJzogJ++4kScsXG4gICAgJ+OAgic6ICfvuJInLFxuICAgICfjgIgnOiAn77i/JyxcbiAgICAn44CJJzogJ++5gCcsXG4gICAgJ+OAiic6ICfvuL0nLFxuICAgICfjgIsnOiAn77i+JyxcbiAgICAn44CMJzogJ++5gScsXG4gICAgJ+OAjSc6ICfvuYInLFxuICAgICfjgI4nOiAn77mDJyxcbiAgICAn44CPJzogJ++5hCcsXG4gICAgJ+OAkCc6ICfvuLsnLFxuICAgICfjgJEnOiAn77i8JyxcbiAgICAn44CUJzogJ++4uScsXG4gICAgJ+OAlSc6ICfvuLonLFxuICAgICfjgJYnOiAn77iXJyxcbiAgICAn44CXJzogJ++4mCcsXG4gICAgJ++8gSc6ICfvuJUnLFxuICAgICfvvIgnOiAn77i1JyxcbiAgICAn77yJJzogJ++4ticsXG4gICAgJ++8jCc6ICfvuJAnLFxuICAgICfvvI0nOiAn77iyJyxcbiAgICAn77yOJzogJ+ODuycsXG4gICAgJ++8mic6ICfvuJMnLFxuICAgICfvvJsnOiAn77iUJyxcbiAgICAn77ycJzogJ++4vycsXG4gICAgJ++8nic6ICfvuYAnLFxuICAgICfvvJ8nOiAn77iWJyxcbiAgICAn77y7JzogJ++5hycsXG4gICAgJ++8vSc6ICfvuYgnLFxuICAgICfvvL8nOiAn77izJyxcbiAgICAn772bJzogJ++4tycsXG4gICAgJ++9nCc6ICfigJUnLFxuICAgICfvvZ0nOiAn77i4JyxcbiAgICAn772fJzogJ++4tScsXG4gICAgJ++9oCc6ICfvuLYnLFxuICAgICfvvaEnOiAn77iSJyxcbiAgICAn772iJzogJ++5gScsXG4gICAgJ++9oyc6ICfvuYInXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKGlucHV0OiBzdHJpbmcsIHNraXBDb250ZXh0Q2hlY2tpbmc6IGJvb2xlYW4pIHtcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5leHRDaGFyQ29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSArIDEpIHx8IG51bGw7XG4gICAgICAgIGNvbnN0IHByZXZDaGFyQ29kZSA9IGlucHV0LmNoYXJDb2RlQXQoaSAtIDEpIHx8IG51bGw7XG5cbiAgICAgICAgY29uc3QgY2FuUmVwbGFjZVB1bmN0dWF0aW9uID0gc2tpcENvbnRleHRDaGVja2luZyB8fCAoXG4gICAgICAgICAgICAoIW5leHRDaGFyQ29kZSB8fCAhY2hhckhhc1JvdGF0ZWRWZXJ0aWNhbE9yaWVudGF0aW9uKG5leHRDaGFyQ29kZSkgfHwgdmVydGljYWxpemVkQ2hhcmFjdGVyTWFwW2lucHV0W2kgKyAxXV0pICYmXG4gICAgICAgICAgICAoIXByZXZDaGFyQ29kZSB8fCAhY2hhckhhc1JvdGF0ZWRWZXJ0aWNhbE9yaWVudGF0aW9uKHByZXZDaGFyQ29kZSkgfHwgdmVydGljYWxpemVkQ2hhcmFjdGVyTWFwW2lucHV0W2kgLSAxXV0pXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGNhblJlcGxhY2VQdW5jdHVhdGlvbiAmJiB2ZXJ0aWNhbGl6ZWRDaGFyYWN0ZXJNYXBbaW5wdXRbaV1dKSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gdmVydGljYWxpemVkQ2hhcmFjdGVyTWFwW2lucHV0W2ldXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dCArPSBpbnB1dFtpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnRpY2FsQ2xvc2VQdW5jdHVhdGlvbihjaHI6IHN0cmluZykge1xuICAgIHJldHVybiBjaHIgPT09ICfvuLYnIHx8IGNociA9PT0gJ++5iCcgfHwgY2hyID09PSAn77i4JyB8fCBjaHIgPT09ICfvuYQnIHx8IGNociA9PT0gJ++5gicgfHwgY2hyID09PSAn77i+JyB8fFxuICAgICAgICAgICBjaHIgPT09ICfvuLwnIHx8IGNociA9PT0gJ++4uicgfHwgY2hyID09PSAn77iYJyB8fCBjaHIgPT09ICfvuYAnIHx8IGNociA9PT0gJ++4kCcgfHwgY2hyID09PSAn77iTJyB8fFxuICAgICAgICAgICBjaHIgPT09ICfvuJQnIHx8IGNociA9PT0gJ++9gCcgfHwgY2hyID09PSAn77+jJyB8fCBjaHIgPT09ICfvuJEnIHx8IGNociA9PT0gJ++4kic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcnRpY2FsT3BlblB1bmN0dWF0aW9uKGNocjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGNociA9PT0gJ++4tScgfHwgY2hyID09PSAn77mHJyB8fCBjaHIgPT09ICfvuLcnIHx8IGNociA9PT0gJ++5gycgfHwgY2hyID09PSAn77mBJyB8fCBjaHIgPT09ICfvuL0nIHx8XG4gICAgICAgICAgIGNociA9PT0gJ++4uycgfHwgY2hyID09PSAn77i5JyB8fCBjaHIgPT09ICfvuJcnIHx8IGNociA9PT0gJ++4vyc7XG59XG4iLCIvKiEgaWVlZTc1NC4gQlNELTMtQ2xhdXNlIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBiZjtcblxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0Jyk7XG5cbmZ1bmN0aW9uIFBiZihidWYpIHtcbiAgICB0aGlzLmJ1ZiA9IEFycmF5QnVmZmVyLmlzVmlldyAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYnVmKSA/IGJ1ZiA6IG5ldyBVaW50OEFycmF5KGJ1ZiB8fCAwKTtcbiAgICB0aGlzLnBvcyA9IDA7XG4gICAgdGhpcy50eXBlID0gMDtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmLmxlbmd0aDtcbn1cblxuUGJmLlZhcmludCAgPSAwOyAvLyB2YXJpbnQ6IGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIHNpbnQzMiwgc2ludDY0LCBib29sLCBlbnVtXG5QYmYuRml4ZWQ2NCA9IDE7IC8vIDY0LWJpdDogZG91YmxlLCBmaXhlZDY0LCBzZml4ZWQ2NFxuUGJmLkJ5dGVzICAgPSAyOyAvLyBsZW5ndGgtZGVsaW1pdGVkOiBzdHJpbmcsIGJ5dGVzLCBlbWJlZGRlZCBtZXNzYWdlcywgcGFja2VkIHJlcGVhdGVkIGZpZWxkc1xuUGJmLkZpeGVkMzIgPSA1OyAvLyAzMi1iaXQ6IGZsb2F0LCBmaXhlZDMyLCBzZml4ZWQzMlxuXG52YXIgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KSxcbiAgICBTSElGVF9SSUdIVF8zMiA9IDEgLyBTSElGVF9MRUZUXzMyO1xuXG4vLyBUaHJlc2hvbGQgY2hvc2VuIGJhc2VkIG9uIGJvdGggYmVuY2htYXJraW5nIGFuZCBrbm93bGVkZ2UgYWJvdXQgYnJvd3NlciBzdHJpbmdcbi8vIGRhdGEgc3RydWN0dXJlcyAod2hpY2ggY3VycmVudGx5IHN3aXRjaCBzdHJ1Y3R1cmUgdHlwZXMgYXQgMTIgYnl0ZXMgb3IgbW9yZSlcbnZhciBURVhUX0RFQ09ERVJfTUlOX0xFTkdUSCA9IDEyO1xudmFyIHV0ZjhUZXh0RGVjb2RlciA9IHR5cGVvZiBUZXh0RGVjb2RlciA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogbmV3IFRleHREZWNvZGVyKCd1dGY4Jyk7XG5cblBiZi5wcm90b3R5cGUgPSB7XG5cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5idWYgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvLyA9PT0gUkVBRElORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgcmVhZEZpZWxkczogZnVuY3Rpb24ocmVhZEZpZWxkLCByZXN1bHQsIGVuZCkge1xuICAgICAgICBlbmQgPSBlbmQgfHwgdGhpcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5yZWFkVmFyaW50KCksXG4gICAgICAgICAgICAgICAgdGFnID0gdmFsID4+IDMsXG4gICAgICAgICAgICAgICAgc3RhcnRQb3MgPSB0aGlzLnBvcztcblxuICAgICAgICAgICAgdGhpcy50eXBlID0gdmFsICYgMHg3O1xuICAgICAgICAgICAgcmVhZEZpZWxkKHRhZywgcmVzdWx0LCB0aGlzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucG9zID09PSBzdGFydFBvcykgdGhpcy5za2lwKHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgcmVhZE1lc3NhZ2U6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRGaWVsZHMocmVhZEZpZWxkLCByZXN1bHQsIHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MpO1xuICAgIH0sXG5cbiAgICByZWFkRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkSW50MzIodGhpcy5idWYsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gNjQtYml0IGludCBoYW5kbGluZyBpcyBiYXNlZCBvbiBnaXRodWIuY29tL2Rwdy9ub2RlLWJ1ZmZlci1tb3JlLWludHMgKE1JVC1saWNlbnNlZClcblxuICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zKSArIHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zICsgNCkgKiBTSElGVF9MRUZUXzMyO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gcmVhZFVJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MpICsgcmVhZEludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyArIDQpICogU0hJRlRfTEVGVF8zMjtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZEZsb2F0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IGllZWU3NTQucmVhZCh0aGlzLmJ1ZiwgdGhpcy5wb3MsIHRydWUsIDIzLCA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSBpZWVlNzU0LnJlYWQodGhpcy5idWYsIHRoaXMucG9zLCB0cnVlLCA1MiwgOCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ6IGZ1bmN0aW9uKGlzU2lnbmVkKSB7XG4gICAgICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgICAgIHZhbCwgYjtcblxuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgID0gIGIgJiAweDdmOyAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCA3OyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCAxNDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgfD0gKGIgJiAweDdmKSA8PCAyMTsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zXTsgICB2YWwgfD0gKGIgJiAweDBmKSA8PCAyODtcblxuICAgICAgICByZXR1cm4gcmVhZFZhcmludFJlbWFpbmRlcih2YWwsIGlzU2lnbmVkLCB0aGlzKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHsgLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2Mi4wLjFcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFZhcmludCh0cnVlKTtcbiAgICB9LFxuXG4gICAgcmVhZFNWYXJpbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbnVtID0gdGhpcy5yZWFkVmFyaW50KCk7XG4gICAgICAgIHJldHVybiBudW0gJSAyID09PSAxID8gKG51bSArIDEpIC8gLTIgOiBudW0gLyAyOyAvLyB6aWd6YWcgZW5jb2RpbmdcbiAgICB9LFxuXG4gICAgcmVhZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgfSxcblxuICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcztcbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcblxuICAgICAgICBpZiAoZW5kIC0gcG9zID49IFRFWFRfREVDT0RFUl9NSU5fTEVOR1RIICYmIHV0ZjhUZXh0RGVjb2Rlcikge1xuICAgICAgICAgICAgLy8gbG9uZ2VyIHN0cmluZ3MgYXJlIGZhc3Qgd2l0aCB0aGUgYnVpbHQtaW4gYnJvd3NlciBUZXh0RGVjb2RlciBBUElcbiAgICAgICAgICAgIHJldHVybiByZWFkVXRmOFRleHREZWNvZGVyKHRoaXMuYnVmLCBwb3MsIGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2hvcnQgc3RyaW5ncyBhcmUgZmFzdCB3aXRoIG91ciBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAgICAgICAgcmV0dXJuIHJlYWRVdGY4KHRoaXMuYnVmLCBwb3MsIGVuZCk7XG4gICAgfSxcblxuICAgIHJlYWRCeXRlczogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLFxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5idWYuc3ViYXJyYXkodGhpcy5wb3MsIGVuZCk7XG4gICAgICAgIHRoaXMucG9zID0gZW5kO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH0sXG5cbiAgICAvLyB2ZXJib3NlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOyBkb2Vzbid0IGFmZmVjdCBnemlwcGVkIHNpemVcblxuICAgIHJlYWRQYWNrZWRWYXJpbnQ6IGZ1bmN0aW9uKGFyciwgaXNTaWduZWQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkVmFyaW50KGlzU2lnbmVkKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkVmFyaW50KGlzU2lnbmVkKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU1ZhcmludCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRCb29sZWFuOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRCb29sZWFuKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZsb2F0OiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRmxvYXQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRG91YmxlOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDMyOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDMyKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gUGJmLkJ5dGVzKSByZXR1cm4gYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkMzIoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQ2NDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQ2NCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDY0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG5cbiAgICBza2lwOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB2YWwgJiAweDc7XG4gICAgICAgIGlmICh0eXBlID09PSBQYmYuVmFyaW50KSB3aGlsZSAodGhpcy5idWZbdGhpcy5wb3MrK10gPiAweDdmKSB7fVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuQnl0ZXMpIHRoaXMucG9zID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcztcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkMzIpIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDY0KSB0aGlzLnBvcyArPSA4O1xuICAgICAgICBlbHNlIHRocm93IG5ldyBFcnJvcignVW5pbXBsZW1lbnRlZCB0eXBlOiAnICsgdHlwZSk7XG4gICAgfSxcblxuICAgIC8vID09PSBXUklUSU5HID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICB3cml0ZVRhZzogZnVuY3Rpb24odGFnLCB0eXBlKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoKHRhZyA8PCAzKSB8IHR5cGUpO1xuICAgIH0sXG5cbiAgICByZWFsbG9jOiBmdW5jdGlvbihtaW4pIHtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDE2O1xuXG4gICAgICAgIHdoaWxlIChsZW5ndGggPCB0aGlzLnBvcyArIG1pbikgbGVuZ3RoICo9IDI7XG5cbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgICAgICAgICAgYnVmLnNldCh0aGlzLmJ1Zik7XG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KDAsIHRoaXMubGVuZ3RoKTtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDMyOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCB2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQzMjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgTWF0aC5mbG9vcih2YWwgKiBTSElGVF9SSUdIVF8zMiksIHRoaXMucG9zICsgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIE1hdGguZmxvb3IodmFsICogU0hJRlRfUklHSFRfMzIpLCB0aGlzLnBvcyArIDQpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZVZhcmludDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHZhbCA9ICt2YWwgfHwgMDtcblxuICAgICAgICBpZiAodmFsID4gMHhmZmZmZmZmIHx8IHZhbCA8IDApIHtcbiAgICAgICAgICAgIHdyaXRlQmlnVmFyaW50KHZhbCwgdGhpcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG5cbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAgICAgICAgICAgdmFsICYgMHg3ZiAgfCAodmFsID4gMHg3ZiA/IDB4ODAgOiAwKTsgaWYgKHZhbCA8PSAweDdmKSByZXR1cm47XG4gICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+PSA3KSAmIDB4N2YpIHwgKHZhbCA+IDB4N2YgPyAweDgwIDogMCk7IGlmICh2YWwgPD0gMHg3ZikgcmV0dXJuO1xuICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+Pj0gNykgJiAweDdmKSB8ICh2YWwgPiAweDdmID8gMHg4MCA6IDApOyBpZiAodmFsIDw9IDB4N2YpIHJldHVybjtcbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAgICh2YWwgPj4+IDcpICYgMHg3ZjtcbiAgICB9LFxuXG4gICAgd3JpdGVTVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwgPCAwID8gLXZhbCAqIDIgLSAxIDogdmFsICogMik7XG4gICAgfSxcblxuICAgIHdyaXRlQm9vbGVhbjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoQm9vbGVhbih2YWwpKTtcbiAgICB9LFxuXG4gICAgd3JpdGVTdHJpbmc6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKHN0ci5sZW5ndGggKiA0KTtcblxuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgc3RyaW5nIGxlbmd0aFxuXG4gICAgICAgIHZhciBzdGFydFBvcyA9IHRoaXMucG9zO1xuICAgICAgICAvLyB3cml0ZSB0aGUgc3RyaW5nIGRpcmVjdGx5IHRvIHRoZSBidWZmZXIgYW5kIHNlZSBob3cgbXVjaCB3YXMgd3JpdHRlblxuICAgICAgICB0aGlzLnBvcyA9IHdyaXRlVXRmOCh0aGlzLmJ1Ziwgc3RyLCB0aGlzLnBvcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIGlmIChsZW4gPj0gMHg4MCkgbWFrZVJvb21Gb3JFeHRyYUxlbmd0aChzdGFydFBvcywgbGVuLCB0aGlzKTtcblxuICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgbWVzc2FnZSBsZW5ndGggaW4gdGhlIHJlc2VydmVkIHBsYWNlIGFuZCByZXN0b3JlIHRoZSBwb3NpdGlvblxuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0UG9zIC0gMTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgfSxcblxuICAgIHdyaXRlRmxvYXQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIGllZWU3NTQud3JpdGUodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MsIHRydWUsIDIzLCA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVEb3VibGU6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIGllZWU3NTQud3JpdGUodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MsIHRydWUsIDUyLCA4KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVCeXRlczogZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgIHZhciBsZW4gPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucmVhbGxvYyhsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IGJ1ZmZlcltpXTtcbiAgICB9LFxuXG4gICAgd3JpdGVSYXdNZXNzYWdlOiBmdW5jdGlvbihmbiwgb2JqKSB7XG4gICAgICAgIHRoaXMucG9zKys7IC8vIHJlc2VydmUgMSBieXRlIGZvciBzaG9ydCBtZXNzYWdlIGxlbmd0aFxuXG4gICAgICAgIC8vIHdyaXRlIHRoZSBtZXNzYWdlIGRpcmVjdGx5IHRvIHRoZSBidWZmZXIgYW5kIHNlZSBob3cgbXVjaCB3YXMgd3JpdHRlblxuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgZm4ob2JqLCB0aGlzKTtcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMucG9zIC0gc3RhcnRQb3M7XG5cbiAgICAgICAgaWYgKGxlbiA+PSAweDgwKSBtYWtlUm9vbUZvckV4dHJhTGVuZ3RoKHN0YXJ0UG9zLCBsZW4sIHRoaXMpO1xuXG4gICAgICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSBtZXNzYWdlIGxlbmd0aCBpbiB0aGUgcmVzZXJ2ZWQgcGxhY2UgYW5kIHJlc3RvcmUgdGhlIHBvc2l0aW9uXG4gICAgICAgIHRoaXMucG9zID0gc3RhcnRQb3MgLSAxO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICB9LFxuXG4gICAgd3JpdGVNZXNzYWdlOiBmdW5jdGlvbih0YWcsIGZuLCBvYmopIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVSYXdNZXNzYWdlKGZuLCBvYmopO1xuICAgIH0sXG5cbiAgICB3cml0ZVBhY2tlZFZhcmludDogICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFZhcmludCwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkU1ZhcmludDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU1ZhcmludCwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRCb29sZWFuOiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRCb29sZWFuLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEZsb2F0OiAgICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZsb2F0LCBhcnIpOyAgICB9LFxuICAgIHdyaXRlUGFja2VkRG91YmxlOiAgIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRG91YmxlLCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDMyOiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDMyLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNGaXhlZDMyLCBhcnIpOyB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQ2NDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQ2NCwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQ2NDogZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQ2NCwgYXJyKTsgfSxcblxuICAgIHdyaXRlQnl0ZXNGaWVsZDogZnVuY3Rpb24odGFnLCBidWZmZXIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlcyhidWZmZXIpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlU1ZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTdHJpbmdGaWVsZDogZnVuY3Rpb24odGFnLCBzdHIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTtcbiAgICB9LFxuICAgIHdyaXRlRmxvYXRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRG91YmxlKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUJvb2xlYW5GaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludEZpZWxkKHRhZywgQm9vbGVhbih2YWwpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiByZWFkVmFyaW50UmVtYWluZGVyKGwsIHMsIHApIHtcbiAgICB2YXIgYnVmID0gcC5idWYsXG4gICAgICAgIGgsIGI7XG5cbiAgICBiID0gYnVmW3AucG9zKytdOyBoICA9IChiICYgMHg3MCkgPj4gNDsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDdmKSA8PCAzOyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCB8PSAoYiAmIDB4N2YpIDw8IDEwOyBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgICBiID0gYnVmW3AucG9zKytdOyBoIHw9IChiICYgMHg3ZikgPDwgMTc7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDdmKSA8PCAyNDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCB8PSAoYiAmIDB4MDEpIDw8IDMxOyBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcblxuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMnKTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2tlZEVuZChwYmYpIHtcbiAgICByZXR1cm4gcGJmLnR5cGUgPT09IFBiZi5CeXRlcyA/XG4gICAgICAgIHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zIDogcGJmLnBvcyArIDE7XG59XG5cbmZ1bmN0aW9uIHRvTnVtKGxvdywgaGlnaCwgaXNTaWduZWQpIHtcbiAgICBpZiAoaXNTaWduZWQpIHtcbiAgICAgICAgcmV0dXJuIGhpZ2ggKiAweDEwMDAwMDAwMCArIChsb3cgPj4+IDApO1xuICAgIH1cblxuICAgIHJldHVybiAoKGhpZ2ggPj4+IDApICogMHgxMDAwMDAwMDApICsgKGxvdyA+Pj4gMCk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50KHZhbCwgcGJmKSB7XG4gICAgdmFyIGxvdywgaGlnaDtcblxuICAgIGlmICh2YWwgPj0gMCkge1xuICAgICAgICBsb3cgID0gKHZhbCAlIDB4MTAwMDAwMDAwKSB8IDA7XG4gICAgICAgIGhpZ2ggPSAodmFsIC8gMHgxMDAwMDAwMDApIHwgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsb3cgID0gfigtdmFsICUgMHgxMDAwMDAwMDApO1xuICAgICAgICBoaWdoID0gfigtdmFsIC8gMHgxMDAwMDAwMDApO1xuXG4gICAgICAgIGlmIChsb3cgXiAweGZmZmZmZmZmKSB7XG4gICAgICAgICAgICBsb3cgPSAobG93ICsgMSkgfCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG93ID0gMDtcbiAgICAgICAgICAgIGhpZ2ggPSAoaGlnaCArIDEpIHwgMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2YWwgPj0gMHgxMDAwMDAwMDAwMDAwMDAwMCB8fCB2YWwgPCAtMHgxMDAwMDAwMDAwMDAwMDAwMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHZhcmludCBkb2VzblxcJ3QgZml0IGludG8gMTAgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBwYmYucmVhbGxvYygxMCk7XG5cbiAgICB3cml0ZUJpZ1ZhcmludExvdyhsb3csIGhpZ2gsIHBiZik7XG4gICAgd3JpdGVCaWdWYXJpbnRIaWdoKGhpZ2gsIHBiZik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50TG93KGxvdywgaGlnaCwgcGJmKSB7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdID0gbG93ICYgMHg3ZiB8IDB4ODA7IGxvdyA+Pj49IDc7XG4gICAgcGJmLmJ1ZltwYmYucG9zXSAgID0gbG93ICYgMHg3Zjtcbn1cblxuZnVuY3Rpb24gd3JpdGVCaWdWYXJpbnRIaWdoKGhpZ2gsIHBiZikge1xuICAgIHZhciBsc2IgPSAoaGlnaCAmIDB4MDcpIDw8IDQ7XG5cbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gfD0gbHNiICAgICAgICAgfCAoKGhpZ2ggPj4+PSAzKSA/IDB4ODAgOiAwKTsgaWYgKCFoaWdoKSByZXR1cm47XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdICA9IGhpZ2ggJiAweDdmIHwgKChoaWdoID4+Pj0gNykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3ZiB8ICgoaGlnaCA+Pj49IDcpID8gMHg4MCA6IDApOyBpZiAoIWhpZ2gpIHJldHVybjtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gID0gaGlnaCAmIDB4N2YgfCAoKGhpZ2ggPj4+PSA3KSA/IDB4ODAgOiAwKTsgaWYgKCFoaWdoKSByZXR1cm47XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdICA9IGhpZ2ggJiAweDdmIHwgKChoaWdoID4+Pj0gNykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3Zjtcbn1cblxuZnVuY3Rpb24gbWFrZVJvb21Gb3JFeHRyYUxlbmd0aChzdGFydFBvcywgbGVuLCBwYmYpIHtcbiAgICB2YXIgZXh0cmFMZW4gPVxuICAgICAgICBsZW4gPD0gMHgzZmZmID8gMSA6XG4gICAgICAgIGxlbiA8PSAweDFmZmZmZiA/IDIgOlxuICAgICAgICBsZW4gPD0gMHhmZmZmZmZmID8gMyA6IE1hdGguZmxvb3IoTWF0aC5sb2cobGVuKSAvIChNYXRoLkxOMiAqIDcpKTtcblxuICAgIC8vIGlmIDEgYnl0ZSBpc24ndCBlbm91Z2ggZm9yIGVuY29kaW5nIG1lc3NhZ2UgbGVuZ3RoLCBzaGlmdCB0aGUgZGF0YSB0byB0aGUgcmlnaHRcbiAgICBwYmYucmVhbGxvYyhleHRyYUxlbik7XG4gICAgZm9yICh2YXIgaSA9IHBiZi5wb3MgLSAxOyBpID49IHN0YXJ0UG9zOyBpLS0pIHBiZi5idWZbaSArIGV4dHJhTGVuXSA9IHBiZi5idWZbaV07XG59XG5cbmZ1bmN0aW9uIHdyaXRlUGFja2VkVmFyaW50KGFyciwgcGJmKSAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVZhcmludChhcnJbaV0pOyAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU1ZhcmludChhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNWYXJpbnQoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRmxvYXQoYXJyLCBwYmYpICAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZsb2F0KGFycltpXSk7ICAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRG91YmxlKGFyciwgcGJmKSAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZURvdWJsZShhcnJbaV0pOyAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkQm9vbGVhbihhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUJvb2xlYW4oYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQzMihhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZpeGVkMzIoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkMzIoYXJyLCBwYmYpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNGaXhlZDMyKGFycltpXSk7IH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQ2NChhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZpeGVkNjQoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkNjQoYXJyLCBwYmYpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNGaXhlZDY0KGFycltpXSk7IH1cblxuLy8gQnVmZmVyIGNvZGUgYmVsb3cgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlciwgTUlULWxpY2Vuc2VkXG5cbmZ1bmN0aW9uIHJlYWRVSW50MzIoYnVmLCBwb3MpIHtcbiAgICByZXR1cm4gKChidWZbcG9zXSkgfFxuICAgICAgICAoYnVmW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgKGJ1Zltwb3MgKyAyXSA8PCAxNikpICtcbiAgICAgICAgKGJ1Zltwb3MgKyAzXSAqIDB4MTAwMDAwMCk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlSW50MzIoYnVmLCB2YWwsIHBvcykge1xuICAgIGJ1Zltwb3NdID0gdmFsO1xuICAgIGJ1Zltwb3MgKyAxXSA9ICh2YWwgPj4+IDgpO1xuICAgIGJ1Zltwb3MgKyAyXSA9ICh2YWwgPj4+IDE2KTtcbiAgICBidWZbcG9zICsgM10gPSAodmFsID4+PiAyNCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRJbnQzMihidWYsIHBvcykge1xuICAgIHJldHVybiAoKGJ1Zltwb3NdKSB8XG4gICAgICAgIChidWZbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAoYnVmW3BvcyArIDJdIDw8IDE2KSkgK1xuICAgICAgICAoYnVmW3BvcyArIDNdIDw8IDI0KTtcbn1cblxuZnVuY3Rpb24gcmVhZFV0ZjgoYnVmLCBwb3MsIGVuZCkge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICB2YXIgaSA9IHBvcztcblxuICAgIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgICAgIHZhciBiMCA9IGJ1ZltpXTtcbiAgICAgICAgdmFyIGMgPSBudWxsOyAvLyBjb2RlcG9pbnRcbiAgICAgICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPVxuICAgICAgICAgICAgYjAgPiAweEVGID8gNCA6XG4gICAgICAgICAgICBiMCA+IDB4REYgPyAzIDpcbiAgICAgICAgICAgIGIwID4gMHhCRiA/IDIgOiAxO1xuXG4gICAgICAgIGlmIChpICsgYnl0ZXNQZXJTZXF1ZW5jZSA+IGVuZCkgYnJlYWs7XG5cbiAgICAgICAgdmFyIGIxLCBiMiwgYjM7XG5cbiAgICAgICAgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChiMCA8IDB4ODApIHtcbiAgICAgICAgICAgICAgICBjID0gYjA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYnl0ZXNQZXJTZXF1ZW5jZSA9PT0gMikge1xuICAgICAgICAgICAgYjEgPSBidWZbaSArIDFdO1xuICAgICAgICAgICAgaWYgKChiMSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgYyA9IChiMCAmIDB4MUYpIDw8IDB4NiB8IChiMSAmIDB4M0YpO1xuICAgICAgICAgICAgICAgIGlmIChjIDw9IDB4N0YpIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDMpIHtcbiAgICAgICAgICAgIGIxID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgIGIyID0gYnVmW2kgKyAyXTtcbiAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjIgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICAgIGMgPSAoYjAgJiAweEYpIDw8IDB4QyB8IChiMSAmIDB4M0YpIDw8IDB4NiB8IChiMiAmIDB4M0YpO1xuICAgICAgICAgICAgICAgIGlmIChjIDw9IDB4N0ZGIHx8IChjID49IDB4RDgwMCAmJiBjIDw9IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDQpIHtcbiAgICAgICAgICAgIGIxID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgIGIyID0gYnVmW2kgKyAyXTtcbiAgICAgICAgICAgIGIzID0gYnVmW2kgKyAzXTtcbiAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjIgJiAweEMwKSA9PT0gMHg4MCAmJiAoYjMgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICAgIGMgPSAoYjAgJiAweEYpIDw8IDB4MTIgfCAoYjEgJiAweDNGKSA8PCAweEMgfCAoYjIgJiAweDNGKSA8PCAweDYgfCAoYjMgJiAweDNGKTtcbiAgICAgICAgICAgICAgICBpZiAoYyA8PSAweEZGRkYgfHwgYyA+PSAweDExMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICBjID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgYyA9IDB4RkZGRDtcbiAgICAgICAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoYyA+IDB4RkZGRikge1xuICAgICAgICAgICAgYyAtPSAweDEwMDAwO1xuICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG4gICAgICAgICAgICBjID0gMHhEQzAwIHwgYyAmIDB4M0ZGO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG4gICAgICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiByZWFkVXRmOFRleHREZWNvZGVyKGJ1ZiwgcG9zLCBlbmQpIHtcbiAgICByZXR1cm4gdXRmOFRleHREZWNvZGVyLmRlY29kZShidWYuc3ViYXJyYXkocG9zLCBlbmQpKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVVdGY4KGJ1Ziwgc3RyLCBwb3MpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgYywgbGVhZDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIGNvZGUgcG9pbnRcblxuICAgICAgICBpZiAoYyA+IDB4RDdGRiAmJiBjIDwgMHhFMDAwKSB7XG4gICAgICAgICAgICBpZiAobGVhZCkge1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMHhEQzAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEVGO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkQ7XG4gICAgICAgICAgICAgICAgICAgIGxlYWQgPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjID0gbGVhZCAtIDB4RDgwMCA8PCAxMCB8IGMgLSAweERDMDAgfCAweDEwMDAwO1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjID4gMHhEQkZGIHx8IChpICsgMSA9PT0gc3RyLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4RUY7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJGO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobGVhZCkge1xuICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4RUY7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJEO1xuICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4NiB8IDB4QzA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweEMgfCAweEUwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4MTIgfCAweEYwO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweEMgJiAweDNGIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHg2ICYgMHgzRiB8IDB4ODA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZbcG9zKytdID0gYyAmIDB4M0YgfCAweDgwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwb3M7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0FscGhhSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuXG5pbXBvcnQgUHJvdG9idWYgZnJvbSAncGJmJztcbmNvbnN0IGJvcmRlciA9IDM7XG5cbmltcG9ydCB0eXBlIHtTdHlsZUdseXBofSBmcm9tICcuL3N0eWxlX2dseXBoLmpzJztcblxuZnVuY3Rpb24gcmVhZEZvbnRzdGFja3ModGFnOiBudW1iZXIsIGdseXBoRGF0YToge2dseXBoczogQXJyYXk8U3R5bGVHbHlwaD4sIGFzY2VuZGVyPzogbnVtYmVyLCBkZXNjZW5kZXI/OiBudW1iZXJ9LCBwYmY6IFByb3RvYnVmKSB7XG4gICAgZ2x5cGhEYXRhLmdseXBocyA9IFtdO1xuICAgIGlmICh0YWcgPT09IDEpIHtcbiAgICAgICAgcGJmLnJlYWRNZXNzYWdlKHJlYWRGb250c3RhY2ssIGdseXBoRGF0YSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkRm9udHN0YWNrKHRhZzogbnVtYmVyLCAgZ2x5cGhEYXRhOiB7Z2x5cGhzOiBBcnJheTxTdHlsZUdseXBoPiwgYXNjZW5kZXI/OiBudW1iZXIsIGRlc2NlbmRlcj86IG51bWJlcn0sIHBiZjogUHJvdG9idWYpIHtcbiAgICBpZiAodGFnID09PSAzKSB7XG4gICAgICAgIGNvbnN0IHtpZCwgYml0bWFwLCB3aWR0aCwgaGVpZ2h0LCBsZWZ0LCB0b3AsIGFkdmFuY2V9ID0gcGJmLnJlYWRNZXNzYWdlKHJlYWRHbHlwaCwge30pO1xuICAgICAgICBnbHlwaERhdGEuZ2x5cGhzLnB1c2goe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBiaXRtYXA6IG5ldyBBbHBoYUltYWdlKHtcbiAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGggKyAyICogYm9yZGVyLFxuICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0ICsgMiAqIGJvcmRlclxuICAgICAgICAgICAgfSwgYml0bWFwKSxcbiAgICAgICAgICAgIG1ldHJpY3M6IHt3aWR0aCwgaGVpZ2h0LCBsZWZ0LCB0b3AsIGFkdmFuY2V9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGFnID09PSA0KSB7XG4gICAgICAgIGdseXBoRGF0YS5hc2NlbmRlciA9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgIH0gZWxzZSBpZiAodGFnID09PSA1KSB7XG4gICAgICAgIGdseXBoRGF0YS5kZXNjZW5kZXIgPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRHbHlwaCh0YWc6IG51bWJlciwgZ2x5cGg6IE9iamVjdCwgcGJmOiBQcm90b2J1Zikge1xuICAgIGlmICh0YWcgPT09IDEpIGdseXBoLmlkID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGdseXBoLmJpdG1hcCA9IHBiZi5yZWFkQnl0ZXMoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDMpIGdseXBoLndpZHRoID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDQpIGdseXBoLmhlaWdodCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA1KSBnbHlwaC5sZWZ0ID0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA2KSBnbHlwaC50b3AgPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDcpIGdseXBoLmFkdmFuY2UgPSBwYmYucmVhZFZhcmludCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoZGF0YTogQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5KToge2dseXBoczogQXJyYXk8U3R5bGVHbHlwaD4sIGFzY2VuZGVyPzogbnVtYmVyLCBkZXNjZW5kZXI/OiBudW1iZXJ9IHtcbiAgICByZXR1cm4gbmV3IFByb3RvYnVmKGRhdGEpLnJlYWRGaWVsZHMocmVhZEZvbnRzdGFja3MsIHt9KTtcbn1cblxuZXhwb3J0IGNvbnN0IEdMWVBIX1BCRl9CT1JERVIgPSBib3JkZXI7XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHBvdHBhY2soYm94ZXMpIHtcblxuICAgIC8vIGNhbGN1bGF0ZSB0b3RhbCBib3ggYXJlYSBhbmQgbWF4aW11bSBib3ggd2lkdGhcbiAgICBsZXQgYXJlYSA9IDA7XG4gICAgbGV0IG1heFdpZHRoID0gMDtcblxuICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICAgIGFyZWEgKz0gYm94LncgKiBib3guaDtcbiAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgYm94LncpO1xuICAgIH1cblxuICAgIC8vIHNvcnQgdGhlIGJveGVzIGZvciBpbnNlcnRpb24gYnkgaGVpZ2h0LCBkZXNjZW5kaW5nXG4gICAgYm94ZXMuc29ydCgoYSwgYikgPT4gYi5oIC0gYS5oKTtcblxuICAgIC8vIGFpbSBmb3IgYSBzcXVhcmlzaCByZXN1bHRpbmcgY29udGFpbmVyLFxuICAgIC8vIHNsaWdodGx5IGFkanVzdGVkIGZvciBzdWItMTAwJSBzcGFjZSB1dGlsaXphdGlvblxuICAgIGNvbnN0IHN0YXJ0V2lkdGggPSBNYXRoLm1heChNYXRoLmNlaWwoTWF0aC5zcXJ0KGFyZWEgLyAwLjk1KSksIG1heFdpZHRoKTtcblxuICAgIC8vIHN0YXJ0IHdpdGggYSBzaW5nbGUgZW1wdHkgc3BhY2UsIHVuYm91bmRlZCBhdCB0aGUgYm90dG9tXG4gICAgY29uc3Qgc3BhY2VzID0gW3t4OiAwLCB5OiAwLCB3OiBzdGFydFdpZHRoLCBoOiBJbmZpbml0eX1dO1xuXG4gICAgbGV0IHdpZHRoID0gMDtcbiAgICBsZXQgaGVpZ2h0ID0gMDtcblxuICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICAgIC8vIGxvb2sgdGhyb3VnaCBzcGFjZXMgYmFja3dhcmRzIHNvIHRoYXQgd2UgY2hlY2sgc21hbGxlciBzcGFjZXMgZmlyc3RcbiAgICAgICAgZm9yIChsZXQgaSA9IHNwYWNlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3Qgc3BhY2UgPSBzcGFjZXNbaV07XG5cbiAgICAgICAgICAgIC8vIGxvb2sgZm9yIGVtcHR5IHNwYWNlcyB0aGF0IGNhbiBhY2NvbW1vZGF0ZSB0aGUgY3VycmVudCBib3hcbiAgICAgICAgICAgIGlmIChib3gudyA+IHNwYWNlLncgfHwgYm94LmggPiBzcGFjZS5oKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gZm91bmQgdGhlIHNwYWNlOyBhZGQgdGhlIGJveCB0byBpdHMgdG9wLWxlZnQgY29ybmVyXG4gICAgICAgICAgICAvLyB8LS0tLS0tLXwtLS0tLS0tfFxuICAgICAgICAgICAgLy8gfCAgYm94ICB8ICAgICAgIHxcbiAgICAgICAgICAgIC8vIHxfX19fX19ffCAgICAgICB8XG4gICAgICAgICAgICAvLyB8ICAgICAgICAgc3BhY2UgfFxuICAgICAgICAgICAgLy8gfF9fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgIGJveC54ID0gc3BhY2UueDtcbiAgICAgICAgICAgIGJveC55ID0gc3BhY2UueTtcblxuICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBib3gueSArIGJveC5oKTtcbiAgICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGJveC54ICsgYm94LncpO1xuXG4gICAgICAgICAgICBpZiAoYm94LncgPT09IHNwYWNlLncgJiYgYm94LmggPT09IHNwYWNlLmgpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBtYXRjaGVzIHRoZSBib3ggZXhhY3RseTsgcmVtb3ZlIGl0XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IHNwYWNlcy5wb3AoKTtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IHNwYWNlcy5sZW5ndGgpIHNwYWNlc1tpXSA9IGxhc3Q7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm94LmggPT09IHNwYWNlLmgpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBtYXRjaGVzIHRoZSBib3ggaGVpZ2h0OyB1cGRhdGUgaXQgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgICAgICAvLyB8LS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18XG4gICAgICAgICAgICAgICAgLy8gfCAgYm94ICB8IHVwZGF0ZWQgc3BhY2UgfFxuICAgICAgICAgICAgICAgIC8vIHxfX19fX19ffF9fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICBzcGFjZS54ICs9IGJveC53O1xuICAgICAgICAgICAgICAgIHNwYWNlLncgLT0gYm94Lnc7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm94LncgPT09IHNwYWNlLncpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBtYXRjaGVzIHRoZSBib3ggd2lkdGg7IHVwZGF0ZSBpdCBhY2NvcmRpbmdseVxuICAgICAgICAgICAgICAgIC8vIHwtLS0tLS0tLS0tLS0tLS18XG4gICAgICAgICAgICAgICAgLy8gfCAgICAgIGJveCAgICAgIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX19fX19fX19ffFxuICAgICAgICAgICAgICAgIC8vIHwgdXBkYXRlZCBzcGFjZSB8XG4gICAgICAgICAgICAgICAgLy8gfF9fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICBzcGFjZS55ICs9IGJveC5oO1xuICAgICAgICAgICAgICAgIHNwYWNlLmggLT0gYm94Lmg7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBib3ggc3BsaXRzIHRoZSBzcGFjZSBpbnRvIHR3byBzcGFjZXNcbiAgICAgICAgICAgICAgICAvLyB8LS0tLS0tLXwtLS0tLS0tLS0tLXxcbiAgICAgICAgICAgICAgICAvLyB8ICBib3ggIHwgbmV3IHNwYWNlIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX3xfX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICAvLyB8IHVwZGF0ZWQgc3BhY2UgICAgIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICBzcGFjZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHg6IHNwYWNlLnggKyBib3gudyxcbiAgICAgICAgICAgICAgICAgICAgeTogc3BhY2UueSxcbiAgICAgICAgICAgICAgICAgICAgdzogc3BhY2UudyAtIGJveC53LFxuICAgICAgICAgICAgICAgICAgICBoOiBib3guaFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNwYWNlLnkgKz0gYm94Lmg7XG4gICAgICAgICAgICAgICAgc3BhY2UuaCAtPSBib3guaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdzogd2lkdGgsIC8vIGNvbnRhaW5lciB3aWR0aFxuICAgICAgICBoOiBoZWlnaHQsIC8vIGNvbnRhaW5lciBoZWlnaHRcbiAgICAgICAgZmlsbDogKGFyZWEgLyAod2lkdGggKiBoZWlnaHQpKSB8fCAwIC8vIHNwYWNlIHV0aWxpemF0aW9uXG4gICAgfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7UkdCQUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlLmpzJztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5pbXBvcnQgcG90cGFjayBmcm9tICdwb3RwYWNrJztcblxuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2ltYWdlLmpzJztcbmltcG9ydCB0eXBlIEltYWdlTWFuYWdlciBmcm9tICcuL2ltYWdlX21hbmFnZXIuanMnO1xuaW1wb3J0IHR5cGUgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUuanMnO1xuXG5jb25zdCBJTUFHRV9QQURESU5HOiBudW1iZXIgPSAxO1xuZXhwb3J0IHtJTUFHRV9QQURESU5HfTtcblxudHlwZSBSZWN0ID0ge1xuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgdzogbnVtYmVyLFxuICAgIGg6IG51bWJlclxufTtcblxuZXhwb3J0IGNsYXNzIEltYWdlUG9zaXRpb24ge1xuICAgIHBhZGRlZFJlY3Q6IFJlY3Q7XG4gICAgcGl4ZWxSYXRpbzogbnVtYmVyO1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICBzdHJldGNoWTogP0FycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuICAgIHN0cmV0Y2hYOiA/QXJyYXk8W251bWJlciwgbnVtYmVyXT47XG4gICAgY29udGVudDogP1tudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgY29uc3RydWN0b3IocGFkZGVkUmVjdDogUmVjdCwge3BpeGVsUmF0aW8sIHZlcnNpb24sIHN0cmV0Y2hYLCBzdHJldGNoWSwgY29udGVudH06IFN0eWxlSW1hZ2UpIHtcbiAgICAgICAgdGhpcy5wYWRkZWRSZWN0ID0gcGFkZGVkUmVjdDtcbiAgICAgICAgdGhpcy5waXhlbFJhdGlvID0gcGl4ZWxSYXRpbztcbiAgICAgICAgdGhpcy5zdHJldGNoWCA9IHN0cmV0Y2hYO1xuICAgICAgICB0aGlzLnN0cmV0Y2hZID0gc3RyZXRjaFk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgfVxuXG4gICAgZ2V0IHRsKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnggKyBJTUFHRV9QQURESU5HLFxuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnkgKyBJTUFHRV9QQURESU5HXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZ2V0IGJyKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnggKyB0aGlzLnBhZGRlZFJlY3QudyAtIElNQUdFX1BBRERJTkcsXG4gICAgICAgICAgICB0aGlzLnBhZGRlZFJlY3QueSArIHRoaXMucGFkZGVkUmVjdC5oIC0gSU1BR0VfUEFERElOR1xuICAgICAgICBdO1xuICAgIH1cblxuICAgIGdldCBkaXNwbGF5U2l6ZSgpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICh0aGlzLnBhZGRlZFJlY3QudyAtIElNQUdFX1BBRERJTkcgKiAyKSAvIHRoaXMucGl4ZWxSYXRpbyxcbiAgICAgICAgICAgICh0aGlzLnBhZGRlZFJlY3QuaCAtIElNQUdFX1BBRERJTkcgKiAyKSAvIHRoaXMucGl4ZWxSYXRpb1xuICAgICAgICBdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hZ2VBdGxhcyB7XG4gICAgaW1hZ2U6IFJHQkFJbWFnZTtcbiAgICBpY29uUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259O1xuICAgIHBhdHRlcm5Qb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn07XG4gICAgaGF2ZVJlbmRlckNhbGxiYWNrczogQXJyYXk8c3RyaW5nPjtcbiAgICB1cGxvYWRlZDogP2Jvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihpY29uczoge1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfSwgcGF0dGVybnM6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0pIHtcbiAgICAgICAgY29uc3QgaWNvblBvc2l0aW9ucyA9IHt9LCBwYXR0ZXJuUG9zaXRpb25zID0ge307XG4gICAgICAgIHRoaXMuaGF2ZVJlbmRlckNhbGxiYWNrcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGJpbnMgPSBbXTtcblxuICAgICAgICB0aGlzLmFkZEltYWdlcyhpY29ucywgaWNvblBvc2l0aW9ucywgYmlucyk7XG4gICAgICAgIHRoaXMuYWRkSW1hZ2VzKHBhdHRlcm5zLCBwYXR0ZXJuUG9zaXRpb25zLCBiaW5zKTtcblxuICAgICAgICBjb25zdCB7dywgaH0gPSBwb3RwYWNrKGJpbnMpO1xuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBSR0JBSW1hZ2Uoe3dpZHRoOiB3IHx8IDEsIGhlaWdodDogaCB8fCAxfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBpY29ucykge1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gaWNvbnNbaWRdO1xuICAgICAgICAgICAgY29uc3QgYmluID0gaWNvblBvc2l0aW9uc1tpZF0ucGFkZGVkUmVjdDtcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwge3g6IDAsIHk6IDB9LCB7eDogYmluLnggKyBJTUFHRV9QQURESU5HLCB5OiBiaW4ueSArIElNQUdFX1BBRERJTkd9LCBzcmMuZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHBhdHRlcm5zKSB7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSBwYXR0ZXJuc1tpZF07XG4gICAgICAgICAgICBjb25zdCBiaW4gPSBwYXR0ZXJuUG9zaXRpb25zW2lkXS5wYWRkZWRSZWN0O1xuICAgICAgICAgICAgY29uc3QgeCA9IGJpbi54ICsgSU1BR0VfUEFERElORyxcbiAgICAgICAgICAgICAgICB5ID0gYmluLnkgKyBJTUFHRV9QQURESU5HLFxuICAgICAgICAgICAgICAgIHcgPSBzcmMuZGF0YS53aWR0aCxcbiAgICAgICAgICAgICAgICBoID0gc3JjLmRhdGEuaGVpZ2h0O1xuXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHt4OiAwLCB5OiAwfSwge3gsIHl9LCBzcmMuZGF0YSk7XG4gICAgICAgICAgICAvLyBBZGQgMSBwaXhlbCB3cmFwcGVkIHBhZGRpbmcgb24gZWFjaCBzaWRlIG9mIHRoZSBpbWFnZS5cbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwge3g6IDAsIHk6IGggLSAxfSwge3gsIHk6IHkgLSAxfSwge3dpZHRoOiB3LCBoZWlnaHQ6IDF9KTsgLy8gVFxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7eDogMCwgeTogICAgIDB9LCB7eCwgeTogeSArIGh9LCB7d2lkdGg6IHcsIGhlaWdodDogMX0pOyAvLyBCXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHt4OiB3IC0gMSwgeTogMH0sIHt4OiB4IC0gMSwgeX0sIHt3aWR0aDogMSwgaGVpZ2h0OiBofSk7IC8vIExcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwge3g6IDAsICAgICB5OiAwfSwge3g6IHggKyB3LCB5fSwge3dpZHRoOiAxLCBoZWlnaHQ6IGh9KTsgLy8gUlxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuICAgICAgICB0aGlzLmljb25Qb3NpdGlvbnMgPSBpY29uUG9zaXRpb25zO1xuICAgICAgICB0aGlzLnBhdHRlcm5Qb3NpdGlvbnMgPSBwYXR0ZXJuUG9zaXRpb25zO1xuICAgIH1cblxuICAgIGFkZEltYWdlcyhpbWFnZXM6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0sIHBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSwgYmluczogQXJyYXk8UmVjdD4pIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBpbWFnZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IGltYWdlc1tpZF07XG4gICAgICAgICAgICBjb25zdCBiaW4gPSB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICAgIHc6IHNyYy5kYXRhLndpZHRoICsgMiAqIElNQUdFX1BBRERJTkcsXG4gICAgICAgICAgICAgICAgaDogc3JjLmRhdGEuaGVpZ2h0ICsgMiAqIElNQUdFX1BBRERJTkcsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYmlucy5wdXNoKGJpbik7XG4gICAgICAgICAgICBwb3NpdGlvbnNbaWRdID0gbmV3IEltYWdlUG9zaXRpb24oYmluLCBzcmMpO1xuXG4gICAgICAgICAgICBpZiAoc3JjLmhhc1JlbmRlckNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXZlUmVuZGVyQ2FsbGJhY2tzLnB1c2goaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGF0Y2hVcGRhdGVkSW1hZ2VzKGltYWdlTWFuYWdlcjogSW1hZ2VNYW5hZ2VyLCB0ZXh0dXJlOiBUZXh0dXJlKSB7XG4gICAgICAgIGltYWdlTWFuYWdlci5kaXNwYXRjaFJlbmRlckNhbGxiYWNrcyh0aGlzLmhhdmVSZW5kZXJDYWxsYmFja3MpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gaW1hZ2VNYW5hZ2VyLnVwZGF0ZWRJbWFnZXMpIHtcbiAgICAgICAgICAgIHRoaXMucGF0Y2hVcGRhdGVkSW1hZ2UodGhpcy5pY29uUG9zaXRpb25zW25hbWVdLCBpbWFnZU1hbmFnZXIuZ2V0SW1hZ2UobmFtZSksIHRleHR1cmUpO1xuICAgICAgICAgICAgdGhpcy5wYXRjaFVwZGF0ZWRJbWFnZSh0aGlzLnBhdHRlcm5Qb3NpdGlvbnNbbmFtZV0sIGltYWdlTWFuYWdlci5nZXRJbWFnZShuYW1lKSwgdGV4dHVyZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXRjaFVwZGF0ZWRJbWFnZShwb3NpdGlvbjogP0ltYWdlUG9zaXRpb24sIGltYWdlOiA/U3R5bGVJbWFnZSwgdGV4dHVyZTogVGV4dHVyZSkge1xuICAgICAgICBpZiAoIXBvc2l0aW9uIHx8ICFpbWFnZSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChwb3NpdGlvbi52ZXJzaW9uID09PSBpbWFnZS52ZXJzaW9uKSByZXR1cm47XG5cbiAgICAgICAgcG9zaXRpb24udmVyc2lvbiA9IGltYWdlLnZlcnNpb247XG4gICAgICAgIGNvbnN0IFt4LCB5XSA9IHBvc2l0aW9uLnRsO1xuICAgICAgICB0ZXh0dXJlLnVwZGF0ZShpbWFnZS5kYXRhLCB1bmRlZmluZWQsIHt4LCB5fSk7XG4gICAgfVxuXG59XG5cbnJlZ2lzdGVyKCdJbWFnZVBvc2l0aW9uJywgSW1hZ2VQb3NpdGlvbik7XG5yZWdpc3RlcignSW1hZ2VBdGxhcycsIEltYWdlQXRsYXMpO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtcbiAgICBjaGFySGFzVXByaWdodFZlcnRpY2FsT3JpZW50YXRpb24sXG4gICAgY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcsXG4gICAgY2hhckluQ29tcGxleFNoYXBpbmdTY3JpcHRcbn0gZnJvbSAnLi4vdXRpbC9zY3JpcHRfZGV0ZWN0aW9uLmpzJztcbmltcG9ydCB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uIGZyb20gJy4uL3V0aWwvdmVydGljYWxpemVfcHVuY3R1YXRpb24uanMnO1xuaW1wb3J0IHtwbHVnaW4gYXMgcnRsVGV4dFBsdWdpbn0gZnJvbSAnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbi5qcyc7XG5pbXBvcnQgT05FX0VNIGZyb20gJy4vb25lX2VtLmpzJztcbmltcG9ydCB7d2Fybk9uY2V9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZUdseXBoLCBHbHlwaE1ldHJpY3N9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2dseXBoLmpzJztcbmltcG9ydCB7R0xZUEhfUEJGX0JPUkRFUn0gZnJvbSAnLi4vc3R5bGUvcGFyc2VfZ2x5cGhfcGJmLmpzJztcbmltcG9ydCB0eXBlIHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMuanMnO1xuaW1wb3J0IHtJTUFHRV9QQURESU5HfSBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMuanMnO1xuaW1wb3J0IHR5cGUge0dseXBoUmVjdCwgR2x5cGhQb3NpdGlvbnN9IGZyb20gJy4uL3JlbmRlci9nbHlwaF9hdGxhcy5qcyc7XG5pbXBvcnQgRm9ybWF0dGVkLCB7Rm9ybWF0dGVkU2VjdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5cbmNvbnN0IFdyaXRpbmdNb2RlID0ge1xuICAgIGhvcml6b250YWw6IDEsXG4gICAgdmVydGljYWw6IDIsXG4gICAgaG9yaXpvbnRhbE9ubHk6IDNcbn07XG5cbmNvbnN0IFNIQVBJTkdfREVGQVVMVF9PRkZTRVQgPSAtMTc7XG5leHBvcnQge3NoYXBlVGV4dCwgc2hhcGVJY29uLCBmaXRJY29uVG9UZXh0LCBnZXRBbmNob3JBbGlnbm1lbnQsIFdyaXRpbmdNb2RlLCBTSEFQSU5HX0RFRkFVTFRfT0ZGU0VUfTtcblxuLy8gVGhlIHBvc2l0aW9uIG9mIGEgZ2x5cGggcmVsYXRpdmUgdG8gdGhlIHRleHQncyBhbmNob3IgcG9pbnQuXG5leHBvcnQgdHlwZSBQb3NpdGlvbmVkR2x5cGggPSB7XG4gICAgZ2x5cGg6IG51bWJlcixcbiAgICBpbWFnZU5hbWU6IHN0cmluZyB8IG51bGwsXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB2ZXJ0aWNhbDogYm9vbGVhbixcbiAgICBzY2FsZTogbnVtYmVyLFxuICAgIGZvbnRTdGFjazogc3RyaW5nLFxuICAgIHNlY3Rpb25JbmRleDogbnVtYmVyLFxuICAgIG1ldHJpY3M6IEdseXBoTWV0cmljcyxcbiAgICByZWN0OiBHbHlwaFJlY3QgfCBudWxsLFxuICAgIGxvY2FsR2x5cGg/OiBib29sZWFuXG59O1xuXG5leHBvcnQgdHlwZSBQb3NpdGlvbmVkTGluZSA9IHtcbiAgICBwb3NpdGlvbmVkR2x5cGhzOiBBcnJheTxQb3NpdGlvbmVkR2x5cGg+LFxuICAgIGxpbmVPZmZzZXQ6IG51bWJlclxufTtcblxuLy8gQSBjb2xsZWN0aW9uIG9mIHBvc2l0aW9uZWQgZ2x5cGhzIGFuZCBzb21lIG1ldGFkYXRhXG5leHBvcnQgdHlwZSBTaGFwaW5nID0ge1xuICAgIHBvc2l0aW9uZWRMaW5lczogQXJyYXk8UG9zaXRpb25lZExpbmU+LFxuICAgIHRvcDogbnVtYmVyLFxuICAgIGJvdHRvbTogbnVtYmVyLFxuICAgIGxlZnQ6IG51bWJlcixcbiAgICByaWdodDogbnVtYmVyLFxuICAgIHdyaXRpbmdNb2RlOiAxIHwgMixcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgaWNvbnNJblRleHQ6IGJvb2xlYW4sXG4gICAgdmVydGljYWxpemFibGU6IGJvb2xlYW4sXG4gICAgaGFzQmFzZWxpbmU6IGJvb2xlYW5cbn07XG5cbmZ1bmN0aW9uIGlzRW1wdHkocG9zaXRpb25lZExpbmVzOiBBcnJheTxQb3NpdGlvbmVkTGluZT4pIHtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcG9zaXRpb25lZExpbmVzKSB7XG4gICAgICAgIGlmIChsaW5lLnBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCB0eXBlIFN5bWJvbEFuY2hvciA9ICdjZW50ZXInIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICd0b3AnIHwgJ2JvdHRvbScgfCAndG9wLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ2JvdHRvbS1yaWdodCc7XG5leHBvcnQgdHlwZSBUZXh0SnVzdGlmeSA9ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0JztcblxuLy8gTWF4IG51bWJlciBvZiBpbWFnZXMgaW4gbGFiZWwgaXMgNjQwMSBVK0UwMDDigJNVK0Y4RkYgdGhhdCBjb3ZlcnNcbi8vIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSBVbmljb2RlIFByaXZhdGUgVXNlIEFyZWEgKFBVQSkuXG5jb25zdCBQVUFiZWdpbiA9IDB4RTAwMDtcbmNvbnN0IFBVQWVuZCA9IDB4RjhGRjtcblxuY2xhc3MgU2VjdGlvbk9wdGlvbnMge1xuICAgIC8vIFRleHQgb3B0aW9uc1xuICAgIHNjYWxlOiBudW1iZXI7XG4gICAgZm9udFN0YWNrOiBzdHJpbmc7XG4gICAgLy8gSW1hZ2Ugb3B0aW9uc1xuICAgIGltYWdlTmFtZTogc3RyaW5nIHwgbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNjYWxlID0gMS4wO1xuICAgICAgICB0aGlzLmZvbnRTdGFjayA9IFwiXCI7XG4gICAgICAgIHRoaXMuaW1hZ2VOYW1lID0gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZm9yVGV4dChzY2FsZTogbnVtYmVyIHwgbnVsbCwgZm9udFN0YWNrOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGV4dE9wdGlvbnMgPSBuZXcgU2VjdGlvbk9wdGlvbnMoKTtcbiAgICAgICAgdGV4dE9wdGlvbnMuc2NhbGUgPSBzY2FsZSB8fCAxO1xuICAgICAgICB0ZXh0T3B0aW9ucy5mb250U3RhY2sgPSBmb250U3RhY2s7XG4gICAgICAgIHJldHVybiB0ZXh0T3B0aW9ucztcbiAgICB9XG5cbiAgICBzdGF0aWMgZm9ySW1hZ2UoaW1hZ2VOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VPcHRpb25zID0gbmV3IFNlY3Rpb25PcHRpb25zKCk7XG4gICAgICAgIGltYWdlT3B0aW9ucy5pbWFnZU5hbWUgPSBpbWFnZU5hbWU7XG4gICAgICAgIHJldHVybiBpbWFnZU9wdGlvbnM7XG4gICAgfVxuXG59XG5cbmNsYXNzIFRhZ2dlZFN0cmluZyB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIHNlY3Rpb25JbmRleDogQXJyYXk8bnVtYmVyPiAvLyBtYXBzIGVhY2ggY2hhcmFjdGVyIGluICd0ZXh0JyB0byBpdHMgY29ycmVzcG9uZGluZyBlbnRyeSBpbiAnc2VjdGlvbnMnXG4gICAgc2VjdGlvbnM6IEFycmF5PFNlY3Rpb25PcHRpb25zPlxuICAgIGltYWdlU2VjdGlvbklEOiBudW1iZXIgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IFwiXCI7XG4gICAgICAgIHRoaXMuc2VjdGlvbkluZGV4ID0gW107XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5pbWFnZVNlY3Rpb25JRCA9IG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21GZWF0dXJlKHRleHQ6IEZvcm1hdHRlZCwgZGVmYXVsdEZvbnRTdGFjazogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBUYWdnZWRTdHJpbmcoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0LnNlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uID0gdGV4dC5zZWN0aW9uc1tpXTtcbiAgICAgICAgICAgIGlmICghc2VjdGlvbi5pbWFnZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRUZXh0U2VjdGlvbihzZWN0aW9uLCBkZWZhdWx0Rm9udFN0YWNrKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFkZEltYWdlU2VjdGlvbihzZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGxlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBnZXRTZWN0aW9uKGluZGV4OiBudW1iZXIpOiBTZWN0aW9uT3B0aW9ucyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY3Rpb25zW3RoaXMuc2VjdGlvbkluZGV4W2luZGV4XV07XG4gICAgfVxuXG4gICAgZ2V0U2VjdGlvbnMoKTogQXJyYXk8U2VjdGlvbk9wdGlvbnM+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VjdGlvbnM7XG4gICAgfVxuXG4gICAgZ2V0U2VjdGlvbkluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWN0aW9uSW5kZXhbaW5kZXhdO1xuICAgIH1cblxuICAgIGdldENoYXJDb2RlKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0LmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIHZlcnRpY2FsaXplUHVuY3R1YXRpb24oc2tpcENvbnRleHRDaGVja2luZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnRleHQgPSB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKHRoaXMudGV4dCwgc2tpcENvbnRleHRDaGVja2luZyk7XG4gICAgfVxuXG4gICAgdHJpbSgpIHtcbiAgICAgICAgbGV0IGJlZ2lubmluZ1doaXRlc3BhY2UgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDtcbiAgICAgICAgICAgIGkgPCB0aGlzLnRleHQubGVuZ3RoICYmIHdoaXRlc3BhY2VbdGhpcy50ZXh0LmNoYXJDb2RlQXQoaSldO1xuICAgICAgICAgICAgaSsrKSB7XG4gICAgICAgICAgICBiZWdpbm5pbmdXaGl0ZXNwYWNlKys7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHRyYWlsaW5nV2hpdGVzcGFjZSA9IHRoaXMudGV4dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnRleHQubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGkgPj0gMCAmJiBpID49IGJlZ2lubmluZ1doaXRlc3BhY2UgJiYgd2hpdGVzcGFjZVt0aGlzLnRleHQuY2hhckNvZGVBdChpKV07XG4gICAgICAgICAgICBpLS0pIHtcbiAgICAgICAgICAgIHRyYWlsaW5nV2hpdGVzcGFjZS0tO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5zdWJzdHJpbmcoYmVnaW5uaW5nV2hpdGVzcGFjZSwgdHJhaWxpbmdXaGl0ZXNwYWNlKTtcbiAgICAgICAgdGhpcy5zZWN0aW9uSW5kZXggPSB0aGlzLnNlY3Rpb25JbmRleC5zbGljZShiZWdpbm5pbmdXaGl0ZXNwYWNlLCB0cmFpbGluZ1doaXRlc3BhY2UpO1xuICAgIH1cblxuICAgIHN1YnN0cmluZyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IFRhZ2dlZFN0cmluZyB7XG4gICAgICAgIGNvbnN0IHN1YnN0cmluZyA9IG5ldyBUYWdnZWRTdHJpbmcoKTtcbiAgICAgICAgc3Vic3RyaW5nLnRleHQgPSB0aGlzLnRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgICBzdWJzdHJpbmcuc2VjdGlvbkluZGV4ID0gdGhpcy5zZWN0aW9uSW5kZXguc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgIHN1YnN0cmluZy5zZWN0aW9ucyA9IHRoaXMuc2VjdGlvbnM7XG4gICAgICAgIHJldHVybiBzdWJzdHJpbmc7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgICB9XG5cbiAgICBnZXRNYXhTY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VjdGlvbkluZGV4LnJlZHVjZSgobWF4LCBpbmRleCkgPT4gTWF0aC5tYXgobWF4LCB0aGlzLnNlY3Rpb25zW2luZGV4XS5zY2FsZSksIDApO1xuICAgIH1cblxuICAgIGFkZFRleHRTZWN0aW9uKHNlY3Rpb246IEZvcm1hdHRlZFNlY3Rpb24sIGRlZmF1bHRGb250U3RhY2s6IHN0cmluZykge1xuICAgICAgICB0aGlzLnRleHQgKz0gc2VjdGlvbi50ZXh0O1xuICAgICAgICB0aGlzLnNlY3Rpb25zLnB1c2goU2VjdGlvbk9wdGlvbnMuZm9yVGV4dChzZWN0aW9uLnNjYWxlLCBzZWN0aW9uLmZvbnRTdGFjayB8fCBkZWZhdWx0Rm9udFN0YWNrKSk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWN0aW9ucy5sZW5ndGggLSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlY3Rpb24udGV4dC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdGhpcy5zZWN0aW9uSW5kZXgucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRJbWFnZVNlY3Rpb24oc2VjdGlvbjogRm9ybWF0dGVkU2VjdGlvbikge1xuICAgICAgICBjb25zdCBpbWFnZU5hbWUgPSBzZWN0aW9uLmltYWdlID8gc2VjdGlvbi5pbWFnZS5uYW1lIDogJyc7XG4gICAgICAgIGlmIChpbWFnZU5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB3YXJuT25jZShgQ2FuJ3QgYWRkIEZvcm1hdHRlZFNlY3Rpb24gd2l0aCBhbiBlbXB0eSBpbWFnZS5gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5leHRJbWFnZVNlY3Rpb25DaGFyQ29kZSA9IHRoaXMuZ2V0TmV4dEltYWdlU2VjdGlvbkNoYXJDb2RlKCk7XG4gICAgICAgIGlmICghbmV4dEltYWdlU2VjdGlvbkNoYXJDb2RlKSB7XG4gICAgICAgICAgICB3YXJuT25jZShgUmVhY2hlZCBtYXhpbXVtIG51bWJlciBvZiBpbWFnZXMgJHtQVUFlbmQgLSBQVUFiZWdpbiArIDJ9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRleHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShuZXh0SW1hZ2VTZWN0aW9uQ2hhckNvZGUpO1xuICAgICAgICB0aGlzLnNlY3Rpb25zLnB1c2goU2VjdGlvbk9wdGlvbnMuZm9ySW1hZ2UoaW1hZ2VOYW1lKSk7XG4gICAgICAgIHRoaXMuc2VjdGlvbkluZGV4LnB1c2godGhpcy5zZWN0aW9ucy5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICBnZXROZXh0SW1hZ2VTZWN0aW9uQ2hhckNvZGUoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5pbWFnZVNlY3Rpb25JRCkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZVNlY3Rpb25JRCA9IFBVQWJlZ2luO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VTZWN0aW9uSUQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbWFnZVNlY3Rpb25JRCA+PSBQVUFlbmQpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gKyt0aGlzLmltYWdlU2VjdGlvbklEO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYnJlYWtMaW5lcyhpbnB1dDogVGFnZ2VkU3RyaW5nLCBsaW5lQnJlYWtQb2ludHM6IEFycmF5PG51bWJlcj4pOiBBcnJheTxUYWdnZWRTdHJpbmc+IHtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGNvbnN0IHRleHQgPSBpbnB1dC50ZXh0O1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgZm9yIChjb25zdCBsaW5lQnJlYWsgb2YgbGluZUJyZWFrUG9pbnRzKSB7XG4gICAgICAgIGxpbmVzLnB1c2goaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCBsaW5lQnJlYWspKTtcbiAgICAgICAgc3RhcnQgPSBsaW5lQnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgbGluZXMucHVzaChpbnB1dC5zdWJzdHJpbmcoc3RhcnQsIHRleHQubGVuZ3RoKSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gc2hhcGVUZXh0KHRleHQ6IEZvcm1hdHRlZCxcbiAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tfOiBzdHJpbmddOiB7Z2x5cGhzOiB7W186IG51bWJlcl06ID9TdHlsZUdseXBofSwgYXNjZW5kZXI/OiBudW1iZXIsIGRlc2NlbmRlcj86IG51bWJlcn19LFxuICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25zOiBHbHlwaFBvc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSxcbiAgICAgICAgICAgICAgICAgICBkZWZhdWx0Rm9udFN0YWNrOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgdGV4dEFuY2hvcjogU3ltYm9sQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZ5OiBUZXh0SnVzdGlmeSxcbiAgICAgICAgICAgICAgICAgICBzcGFjaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIHdyaXRpbmdNb2RlOiAxIHwgMixcbiAgICAgICAgICAgICAgICAgICBhbGxvd1ZlcnRpY2FsUGxhY2VtZW50OiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgIHN5bWJvbFBsYWNlbWVudDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgIGxheW91dFRleHRTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgbGF5b3V0VGV4dFNpemVUaGlzWm9vbTogbnVtYmVyKTogU2hhcGluZyB8IGZhbHNlIHtcbiAgICBjb25zdCBsb2dpY2FsSW5wdXQgPSBUYWdnZWRTdHJpbmcuZnJvbUZlYXR1cmUodGV4dCwgZGVmYXVsdEZvbnRTdGFjayk7XG5cbiAgICBpZiAod3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsKSB7XG4gICAgICAgIGxvZ2ljYWxJbnB1dC52ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKGFsbG93VmVydGljYWxQbGFjZW1lbnQpO1xuICAgIH1cblxuICAgIGxldCBsaW5lczogQXJyYXk8VGFnZ2VkU3RyaW5nPjtcblxuICAgIGNvbnN0IHtwcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQsIHByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dH0gPSBydGxUZXh0UGx1Z2luO1xuICAgIGlmIChwcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQgJiYgbG9naWNhbElucHV0LnNlY3Rpb25zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBCaWRpIGRvZXNuJ3QgaGF2ZSB0byBiZSBzdHlsZS1hd2FyZVxuICAgICAgICBsaW5lcyA9IFtdO1xuICAgICAgICBjb25zdCB1bnRhZ2dlZExpbmVzID1cbiAgICAgICAgICAgIHByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dChsb2dpY2FsSW5wdXQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVMaW5lQnJlYWtzKGxvZ2ljYWxJbnB1dCwgc3BhY2luZywgbWF4V2lkdGgsIGdseXBoTWFwLCBpbWFnZVBvc2l0aW9ucywgc3ltYm9sUGxhY2VtZW50LCBsYXlvdXRUZXh0U2l6ZSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdW50YWdnZWRMaW5lcykge1xuICAgICAgICAgICAgY29uc3QgdGFnZ2VkTGluZSA9IG5ldyBUYWdnZWRTdHJpbmcoKTtcbiAgICAgICAgICAgIHRhZ2dlZExpbmUudGV4dCA9IGxpbmU7XG4gICAgICAgICAgICB0YWdnZWRMaW5lLnNlY3Rpb25zID0gbG9naWNhbElucHV0LnNlY3Rpb25zO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGFnZ2VkTGluZS5zZWN0aW9uSW5kZXgucHVzaCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpbmVzLnB1c2godGFnZ2VkTGluZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dCkge1xuICAgICAgICAvLyBOZWVkIHZlcnNpb24gb2YgbWFwYm94LWdsLXJ0bC10ZXh0IHdpdGggc3R5bGUgc3VwcG9ydCBmb3IgY29tYmluaW5nIFJUTCB0ZXh0XG4gICAgICAgIC8vIHdpdGggZm9ybWF0dGluZ1xuICAgICAgICBsaW5lcyA9IFtdO1xuICAgICAgICBjb25zdCBwcm9jZXNzZWRMaW5lcyA9XG4gICAgICAgICAgICBwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQobG9naWNhbElucHV0LnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbElucHV0LnNlY3Rpb25JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVMaW5lQnJlYWtzKGxvZ2ljYWxJbnB1dCwgc3BhY2luZywgbWF4V2lkdGgsIGdseXBoTWFwLCBpbWFnZVBvc2l0aW9ucywgc3ltYm9sUGxhY2VtZW50LCBsYXlvdXRUZXh0U2l6ZSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcHJvY2Vzc2VkTGluZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhZ2dlZExpbmUgPSBuZXcgVGFnZ2VkU3RyaW5nKCk7XG4gICAgICAgICAgICB0YWdnZWRMaW5lLnRleHQgPSBsaW5lWzBdO1xuICAgICAgICAgICAgdGFnZ2VkTGluZS5zZWN0aW9uSW5kZXggPSBsaW5lWzFdO1xuICAgICAgICAgICAgdGFnZ2VkTGluZS5zZWN0aW9ucyA9IGxvZ2ljYWxJbnB1dC5zZWN0aW9ucztcbiAgICAgICAgICAgIGxpbmVzLnB1c2godGFnZ2VkTGluZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcyA9IGJyZWFrTGluZXMobG9naWNhbElucHV0LCBkZXRlcm1pbmVMaW5lQnJlYWtzKGxvZ2ljYWxJbnB1dCwgc3BhY2luZywgbWF4V2lkdGgsIGdseXBoTWFwLCBpbWFnZVBvc2l0aW9ucywgc3ltYm9sUGxhY2VtZW50LCBsYXlvdXRUZXh0U2l6ZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc2l0aW9uZWRMaW5lcyA9IFtdO1xuICAgIGNvbnN0IHNoYXBpbmcgPSB7XG4gICAgICAgIHBvc2l0aW9uZWRMaW5lcyxcbiAgICAgICAgdGV4dDogbG9naWNhbElucHV0LnRvU3RyaW5nKCksXG4gICAgICAgIHRvcDogdHJhbnNsYXRlWzFdLFxuICAgICAgICBib3R0b206IHRyYW5zbGF0ZVsxXSxcbiAgICAgICAgbGVmdDogdHJhbnNsYXRlWzBdLFxuICAgICAgICByaWdodDogdHJhbnNsYXRlWzBdLFxuICAgICAgICB3cml0aW5nTW9kZSxcbiAgICAgICAgaWNvbnNJblRleHQ6IGZhbHNlLFxuICAgICAgICB2ZXJ0aWNhbGl6YWJsZTogZmFsc2UsXG4gICAgICAgIGhhc0Jhc2VsaW5lOiBmYWxzZVxuICAgIH07XG5cbiAgICBzaGFwZUxpbmVzKHNoYXBpbmcsIGdseXBoTWFwLCBnbHlwaFBvc2l0aW9ucywgaW1hZ2VQb3NpdGlvbnMsIGxpbmVzLCBsaW5lSGVpZ2h0LCB0ZXh0QW5jaG9yLCB0ZXh0SnVzdGlmeSwgd3JpdGluZ01vZGUsIHNwYWNpbmcsIGFsbG93VmVydGljYWxQbGFjZW1lbnQsIGxheW91dFRleHRTaXplVGhpc1pvb20pO1xuICAgIGlmIChpc0VtcHR5KHBvc2l0aW9uZWRMaW5lcykpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBzaGFwaW5nO1xufVxuXG4vLyB1c2luZyBjb21wdXRlZCBwcm9wZXJ0aWVzIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMzgwXG4vKiBlc2xpbnQgbm8tdXNlbGVzcy1jb21wdXRlZC1rZXk6IDAgKi9cblxuY29uc3Qgd2hpdGVzcGFjZToge1tfOiBudW1iZXJdOiBib29sZWFufSA9IHtcbiAgICBbMHgwOV06IHRydWUsIC8vIHRhYlxuICAgIFsweDBhXTogdHJ1ZSwgLy8gbmV3bGluZVxuICAgIFsweDBiXTogdHJ1ZSwgLy8gdmVydGljYWwgdGFiXG4gICAgWzB4MGNdOiB0cnVlLCAvLyBmb3JtIGZlZWRcbiAgICBbMHgwZF06IHRydWUsIC8vIGNhcnJpYWdlIHJldHVyblxuICAgIFsweDIwXTogdHJ1ZSwgLy8gc3BhY2Vcbn07XG5cbmNvbnN0IGJyZWFrYWJsZToge1tfOiBudW1iZXJdOiBib29sZWFufSA9IHtcbiAgICBbMHgwYV06ICAgdHJ1ZSwgLy8gbmV3bGluZVxuICAgIFsweDIwXTogICB0cnVlLCAvLyBzcGFjZVxuICAgIFsweDI2XTogICB0cnVlLCAvLyBhbXBlcnNhbmRcbiAgICBbMHgyOF06ICAgdHJ1ZSwgLy8gbGVmdCBwYXJlbnRoZXNpc1xuICAgIFsweDI5XTogICB0cnVlLCAvLyByaWdodCBwYXJlbnRoZXNpc1xuICAgIFsweDJiXTogICB0cnVlLCAvLyBwbHVzIHNpZ25cbiAgICBbMHgyZF06ICAgdHJ1ZSwgLy8gaHlwaGVuLW1pbnVzXG4gICAgWzB4MmZdOiAgIHRydWUsIC8vIHNvbGlkdXNcbiAgICBbMHhhZF06ICAgdHJ1ZSwgLy8gc29mdCBoeXBoZW5cbiAgICBbMHhiN106ICAgdHJ1ZSwgLy8gbWlkZGxlIGRvdFxuICAgIFsweDIwMGJdOiB0cnVlLCAvLyB6ZXJvLXdpZHRoIHNwYWNlXG4gICAgWzB4MjAxMF06IHRydWUsIC8vIGh5cGhlblxuICAgIFsweDIwMTNdOiB0cnVlLCAvLyBlbiBkYXNoXG4gICAgWzB4MjAyN106IHRydWUgIC8vIGludGVycHVuY3RcbiAgICAvLyBNYW55IG90aGVyIGNoYXJhY3RlcnMgbWF5IGJlIHJlYXNvbmFibGUgYnJlYWtwb2ludHNcbiAgICAvLyBDb25zaWRlciBcIm5ldXRyYWwgb3JpZW50YXRpb25cIiBjaGFyYWN0ZXJzIGF0IHNjcmlwdERldGVjdGlvbi5jaGFySGFzTmV1dHJhbFZlcnRpY2FsT3JpZW50YXRpb25cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzM2NThcbn07XG5cbmZ1bmN0aW9uIGdldEdseXBoQWR2YW5jZShjb2RlUG9pbnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uOiBTZWN0aW9uT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tfOiBzdHJpbmddOiB7Z2x5cGhzOiB7W186IG51bWJlcl06ID9TdHlsZUdseXBofSwgYXNjZW5kZXI/OiBudW1iZXIsIGRlc2NlbmRlcj86IG51bWJlcn19LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRUZXh0U2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXNlY3Rpb24uaW1hZ2VOYW1lKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IGdseXBoTWFwW3NlY3Rpb24uZm9udFN0YWNrXTtcbiAgICAgICAgY29uc3QgZ2x5cGggPSBwb3NpdGlvbnMgJiYgcG9zaXRpb25zLmdseXBoc1tjb2RlUG9pbnRdO1xuICAgICAgICBpZiAoIWdseXBoKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIGdseXBoLm1ldHJpY3MuYWR2YW5jZSAqIHNlY3Rpb24uc2NhbGUgKyBzcGFjaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGltYWdlUG9zaXRpb24gPSBpbWFnZVBvc2l0aW9uc1tzZWN0aW9uLmltYWdlTmFtZV07XG4gICAgICAgIGlmICghaW1hZ2VQb3NpdGlvbikgcmV0dXJuIDA7XG4gICAgICAgIHJldHVybiBpbWFnZVBvc2l0aW9uLmRpc3BsYXlTaXplWzBdICogc2VjdGlvbi5zY2FsZSAqIE9ORV9FTSAvIGxheW91dFRleHRTaXplICsgc3BhY2luZztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZUF2ZXJhZ2VMaW5lV2lkdGgobG9naWNhbElucHV0OiBUYWdnZWRTdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhNYXA6IHtbXzogc3RyaW5nXToge2dseXBoczoge1tfOiBudW1iZXJdOiA/U3R5bGVHbHlwaH0sIGFzY2VuZGVyPzogbnVtYmVyLCBkZXNjZW5kZXI/OiBudW1iZXJ9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFRleHRTaXplOiBudW1iZXIpIHtcbiAgICBsZXQgdG90YWxXaWR0aCA9IDA7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbG9naWNhbElucHV0Lmxlbmd0aCgpOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBsb2dpY2FsSW5wdXQuZ2V0U2VjdGlvbihpbmRleCk7XG4gICAgICAgIHRvdGFsV2lkdGggKz0gZ2V0R2x5cGhBZHZhbmNlKGxvZ2ljYWxJbnB1dC5nZXRDaGFyQ29kZShpbmRleCksIHNlY3Rpb24sIGdseXBoTWFwLCBpbWFnZVBvc2l0aW9ucywgc3BhY2luZywgbGF5b3V0VGV4dFNpemUpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVDb3VudCA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0b3RhbFdpZHRoIC8gbWF4V2lkdGgpKTtcbiAgICByZXR1cm4gdG90YWxXaWR0aCAvIGxpbmVDb3VudDtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlQmFkbmVzcyhsaW5lV2lkdGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0V2lkdGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuYWx0eTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xhc3RCcmVhazogYm9vbGVhbikge1xuICAgIGNvbnN0IHJhZ2dlZG5lc3MgPSBNYXRoLnBvdyhsaW5lV2lkdGggLSB0YXJnZXRXaWR0aCwgMik7XG4gICAgaWYgKGlzTGFzdEJyZWFrKSB7XG4gICAgICAgIC8vIEZhdm9yIGZpbmFscyBsaW5lcyBzaG9ydGVyIHRoYW4gYXZlcmFnZSBvdmVyIGxvbmdlciB0aGFuIGF2ZXJhZ2VcbiAgICAgICAgaWYgKGxpbmVXaWR0aCA8IHRhcmdldFdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmFnZ2VkbmVzcyAvIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmFnZ2VkbmVzcyAqIDI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmFnZ2VkbmVzcyArIE1hdGguYWJzKHBlbmFsdHkpICogcGVuYWx0eTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlUGVuYWx0eShjb2RlUG9pbnQ6IG51bWJlciwgbmV4dENvZGVQb2ludDogbnVtYmVyLCBwZW5hbGl6YWJsZUlkZW9ncmFwaGljQnJlYWs6IGJvb2xlYW4pIHtcbiAgICBsZXQgcGVuYWx0eSA9IDA7XG4gICAgLy8gRm9yY2UgYnJlYWsgb24gbmV3bGluZVxuICAgIGlmIChjb2RlUG9pbnQgPT09IDB4MGEpIHtcbiAgICAgICAgcGVuYWx0eSAtPSAxMDAwMDtcbiAgICB9XG4gICAgLy8gUGVuYWxpemUgYnJlYWtzIGJldHdlZW4gY2hhcmFjdGVycyB0aGF0IGFsbG93IGlkZW9ncmFwaGljIGJyZWFraW5nIGJlY2F1c2VcbiAgICAvLyB0aGV5IGFyZSBsZXNzIHByZWZlcmFibGUgdGhhbiBicmVha3MgYXQgc3BhY2VzIChvciB6ZXJvIHdpZHRoIHNwYWNlcykuXG4gICAgaWYgKHBlbmFsaXphYmxlSWRlb2dyYXBoaWNCcmVhaykge1xuICAgICAgICBwZW5hbHR5ICs9IDE1MDtcbiAgICB9XG5cbiAgICAvLyBQZW5hbGl6ZSBvcGVuIHBhcmVudGhlc2lzIGF0IGVuZCBvZiBsaW5lXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gMHgyOCB8fCBjb2RlUG9pbnQgPT09IDB4ZmYwOCkge1xuICAgICAgICBwZW5hbHR5ICs9IDUwO1xuICAgIH1cblxuICAgIC8vIFBlbmFsaXplIGNsb3NlIHBhcmVudGhlc2lzIGF0IGJlZ2lubmluZyBvZiBsaW5lXG4gICAgaWYgKG5leHRDb2RlUG9pbnQgPT09IDB4MjkgfHwgbmV4dENvZGVQb2ludCA9PT0gMHhmZjA5KSB7XG4gICAgICAgIHBlbmFsdHkgKz0gNTA7XG4gICAgfVxuICAgIHJldHVybiBwZW5hbHR5O1xufVxuXG50eXBlIEJyZWFrID0ge1xuICAgIGluZGV4OiBudW1iZXIsXG4gICAgeDogbnVtYmVyLFxuICAgIHByaW9yQnJlYWs6ID9CcmVhayxcbiAgICBiYWRuZXNzOiBudW1iZXJcbn07XG5cbmZ1bmN0aW9uIGV2YWx1YXRlQnJlYWsoYnJlYWtJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICBicmVha1g6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0V2lkdGg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsQnJlYWtzOiBBcnJheTxCcmVhaz4sXG4gICAgICAgICAgICAgICAgICAgICAgIHBlbmFsdHk6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgaXNMYXN0QnJlYWs6IGJvb2xlYW4pOiBCcmVhayB7XG4gICAgLy8gV2UgY291bGQgc2tpcCBldmFsdWF0aW5nIGJyZWFrcyB3aGVyZSB0aGUgbGluZSBsZW5ndGggKGJyZWFrWCAtIHByaW9yQnJlYWsueCkgPiBtYXhXaWR0aFxuICAgIC8vICAuLi5idXQgaW4gZmFjdCB3ZSBhbGxvdyBsaW5lcyBsb25nZXIgdGhhbiBtYXhXaWR0aCAoaWYgdGhlcmUncyBubyBicmVhayBwb2ludHMpXG4gICAgLy8gIC4uLmFuZCB3aGVuIHRhcmdldFdpZHRoIGFuZCBtYXhXaWR0aCBhcmUgY2xvc2UsIHN0cmljdGx5IGVuZm9yY2luZyBtYXhXaWR0aCBjYW4gZ2l2ZVxuICAgIC8vICAgICBtb3JlIGxvcHNpZGVkIHJlc3VsdHMuXG5cbiAgICBsZXQgYmVzdFByaW9yQnJlYWs6ID9CcmVhayA9IG51bGw7XG4gICAgbGV0IGJlc3RCcmVha0JhZG5lc3MgPSBjYWxjdWxhdGVCYWRuZXNzKGJyZWFrWCwgdGFyZ2V0V2lkdGgsIHBlbmFsdHksIGlzTGFzdEJyZWFrKTtcblxuICAgIGZvciAoY29uc3QgcG90ZW50aWFsQnJlYWsgb2YgcG90ZW50aWFsQnJlYWtzKSB7XG4gICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IGJyZWFrWCAtIHBvdGVudGlhbEJyZWFrLng7XG4gICAgICAgIGNvbnN0IGJyZWFrQmFkbmVzcyA9XG4gICAgICAgICAgICBjYWxjdWxhdGVCYWRuZXNzKGxpbmVXaWR0aCwgdGFyZ2V0V2lkdGgsIHBlbmFsdHksIGlzTGFzdEJyZWFrKSArIHBvdGVudGlhbEJyZWFrLmJhZG5lc3M7XG4gICAgICAgIGlmIChicmVha0JhZG5lc3MgPD0gYmVzdEJyZWFrQmFkbmVzcykge1xuICAgICAgICAgICAgYmVzdFByaW9yQnJlYWsgPSBwb3RlbnRpYWxCcmVhaztcbiAgICAgICAgICAgIGJlc3RCcmVha0JhZG5lc3MgPSBicmVha0JhZG5lc3M7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpbmRleDogYnJlYWtJbmRleCxcbiAgICAgICAgeDogYnJlYWtYLFxuICAgICAgICBwcmlvckJyZWFrOiBiZXN0UHJpb3JCcmVhayxcbiAgICAgICAgYmFkbmVzczogYmVzdEJyZWFrQmFkbmVzc1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGxlYXN0QmFkQnJlYWtzKGxhc3RMaW5lQnJlYWs6ID9CcmVhayk6IEFycmF5PG51bWJlcj4ge1xuICAgIGlmICghbGFzdExpbmVCcmVhaykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBsZWFzdEJhZEJyZWFrcyhsYXN0TGluZUJyZWFrLnByaW9yQnJlYWspLmNvbmNhdChsYXN0TGluZUJyZWFrLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lTGluZUJyZWFrcyhsb2dpY2FsSW5wdXQ6IFRhZ2dlZFN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tfOiBzdHJpbmddOiB7Z2x5cGhzOiB7W186IG51bWJlcl06ID9TdHlsZUdseXBofSwgYXNjZW5kZXI/OiBudW1iZXIsIGRlc2NlbmRlcj86IG51bWJlcn19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sUGxhY2VtZW50OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFRleHRTaXplOiBudW1iZXIpOiBBcnJheTxudW1iZXI+IHtcbiAgICBpZiAoc3ltYm9sUGxhY2VtZW50ICE9PSAncG9pbnQnKVxuICAgICAgICByZXR1cm4gW107XG5cbiAgICBpZiAoIWxvZ2ljYWxJbnB1dClcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgcG90ZW50aWFsTGluZUJyZWFrcyA9IFtdO1xuICAgIGNvbnN0IHRhcmdldFdpZHRoID0gZGV0ZXJtaW5lQXZlcmFnZUxpbmVXaWR0aChsb2dpY2FsSW5wdXQsIHNwYWNpbmcsIG1heFdpZHRoLCBnbHlwaE1hcCwgaW1hZ2VQb3NpdGlvbnMsIGxheW91dFRleHRTaXplKTtcblxuICAgIGNvbnN0IGhhc1NlcnZlclN1Z2dlc3RlZEJyZWFrcG9pbnRzID0gbG9naWNhbElucHV0LnRleHQuaW5kZXhPZihcIlxcdTIwMGJcIikgPj0gMDtcblxuICAgIGxldCBjdXJyZW50WCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvZ2ljYWxJbnB1dC5sZW5ndGgoKTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHNlY3Rpb24gPSBsb2dpY2FsSW5wdXQuZ2V0U2VjdGlvbihpKTtcbiAgICAgICAgY29uc3QgY29kZVBvaW50ID0gbG9naWNhbElucHV0LmdldENoYXJDb2RlKGkpO1xuICAgICAgICBpZiAoIXdoaXRlc3BhY2VbY29kZVBvaW50XSkgY3VycmVudFggKz0gZ2V0R2x5cGhBZHZhbmNlKGNvZGVQb2ludCwgc2VjdGlvbiwgZ2x5cGhNYXAsIGltYWdlUG9zaXRpb25zLCBzcGFjaW5nLCBsYXlvdXRUZXh0U2l6ZSk7XG5cbiAgICAgICAgLy8gSWRlb2dyYXBoaWMgY2hhcmFjdGVycywgc3BhY2VzLCBhbmQgd29yZC1icmVha2luZyBwdW5jdHVhdGlvbiB0aGF0IG9mdGVuIGFwcGVhciB3aXRob3V0XG4gICAgICAgIC8vIHN1cnJvdW5kaW5nIHNwYWNlcy5cbiAgICAgICAgaWYgKChpIDwgbG9naWNhbElucHV0Lmxlbmd0aCgpIC0gMSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW9ncmFwaGljQnJlYWsgPSBjaGFyQWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyhjb2RlUG9pbnQpO1xuICAgICAgICAgICAgaWYgKGJyZWFrYWJsZVtjb2RlUG9pbnRdIHx8IGlkZW9ncmFwaGljQnJlYWsgfHwgc2VjdGlvbi5pbWFnZU5hbWUpIHtcblxuICAgICAgICAgICAgICAgIHBvdGVudGlhbExpbmVCcmVha3MucHVzaChcbiAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVCcmVhayhcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbExpbmVCcmVha3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVQZW5hbHR5KGNvZGVQb2ludCwgbG9naWNhbElucHV0LmdldENoYXJDb2RlKGkgKyAxKSwgaWRlb2dyYXBoaWNCcmVhayAmJiBoYXNTZXJ2ZXJTdWdnZXN0ZWRCcmVha3BvaW50cyksXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlYXN0QmFkQnJlYWtzKFxuICAgICAgICBldmFsdWF0ZUJyZWFrKFxuICAgICAgICAgICAgbG9naWNhbElucHV0Lmxlbmd0aCgpLFxuICAgICAgICAgICAgY3VycmVudFgsXG4gICAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICAgIHBvdGVudGlhbExpbmVCcmVha3MsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgdHJ1ZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRBbmNob3JBbGlnbm1lbnQoYW5jaG9yOiBTeW1ib2xBbmNob3IpIHtcbiAgICBsZXQgaG9yaXpvbnRhbEFsaWduID0gMC41LCB2ZXJ0aWNhbEFsaWduID0gMC41O1xuXG4gICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICBob3Jpem9udGFsQWxpZ24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICBob3Jpem9udGFsQWxpZ24gPSAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGFuY2hvcikge1xuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgIHZlcnRpY2FsQWxpZ24gPSAxO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgICB2ZXJ0aWNhbEFsaWduID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ259O1xufVxuXG5mdW5jdGlvbiBzaGFwZUxpbmVzKHNoYXBpbmc6IFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB7W186IHN0cmluZ106IHtnbHlwaHM6IHtbXzogbnVtYmVyXTogP1N0eWxlR2x5cGh9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfX0sXG4gICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25zOiBHbHlwaFBvc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzOiBBcnJheTxUYWdnZWRTdHJpbmc+LFxuICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHRleHRBbmNob3I6IFN5bWJvbEFuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgdGV4dEp1c3RpZnk6IFRleHRKdXN0aWZ5LFxuICAgICAgICAgICAgICAgICAgICB3cml0aW5nTW9kZTogMSB8IDIsXG4gICAgICAgICAgICAgICAgICAgIHNwYWNpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0VGV4dFNpemVUaGlzWm9vbTogbnVtYmVyKSB7XG5cbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IHkgPSAwO1xuXG4gICAgbGV0IG1heExpbmVMZW5ndGggPSAwO1xuICAgIGxldCBtYXhMaW5lSGVpZ2h0ID0gMDtcblxuICAgIGNvbnN0IGp1c3RpZnkgPVxuICAgICAgICB0ZXh0SnVzdGlmeSA9PT0gJ3JpZ2h0JyA/IDEgOlxuICAgICAgICB0ZXh0SnVzdGlmeSA9PT0gJ2xlZnQnID8gMCA6IDAuNTtcblxuICAgIGxldCBoYXNCYXNlbGluZSA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGxpbmUuZ2V0U2VjdGlvbnMoKTtcbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5pbWFnZU5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBnbHlwaERhdGEgPSBnbHlwaE1hcFtzZWN0aW9uLmZvbnRTdGFja107XG4gICAgICAgICAgICBpZiAoIWdseXBoRGF0YSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGhhc0Jhc2VsaW5lID0gZ2x5cGhEYXRhLmFzY2VuZGVyICE9PSB1bmRlZmluZWQgJiYgZ2x5cGhEYXRhLmRlc2NlbmRlciAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCFoYXNCYXNlbGluZSkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoYXNCYXNlbGluZSkgYnJlYWs7XG4gICAgfVxuXG4gICAgbGV0IGxpbmVJbmRleCA9IDA7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGxpbmUudHJpbSgpO1xuXG4gICAgICAgIGNvbnN0IGxpbmVNYXhTY2FsZSA9IGxpbmUuZ2V0TWF4U2NhbGUoKTtcbiAgICAgICAgY29uc3QgbWF4TGluZU9mZnNldCA9IChsaW5lTWF4U2NhbGUgLSAxKSAqIE9ORV9FTTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25lZExpbmUgPSB7cG9zaXRpb25lZEdseXBoczogW10sIGxpbmVPZmZzZXQ6IDB9O1xuICAgICAgICBzaGFwaW5nLnBvc2l0aW9uZWRMaW5lc1tsaW5lSW5kZXhdID0gcG9zaXRpb25lZExpbmU7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uZWRHbHlwaHMgPSBwb3NpdGlvbmVkTGluZS5wb3NpdGlvbmVkR2x5cGhzO1xuICAgICAgICBsZXQgbGluZU9mZnNldCA9IDAuMDtcblxuICAgICAgICBpZiAoIWxpbmUubGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIHkgKz0gbGluZUhlaWdodDsgLy8gU3RpbGwgbmVlZCBhIGxpbmUgZmVlZCBhZnRlciBlbXB0eSBsaW5lXG4gICAgICAgICAgICArK2xpbmVJbmRleDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJpZ2dlc3RIZWlnaHQgPSAwO1xuICAgICAgICBsZXQgYmFzZWxpbmVPZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoKCk7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGxpbmUuZ2V0U2VjdGlvbihpKTtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25JbmRleCA9IGxpbmUuZ2V0U2VjdGlvbkluZGV4KGkpO1xuICAgICAgICAgICAgY29uc3QgY29kZVBvaW50ID0gbGluZS5nZXRDaGFyQ29kZShpKTtcblxuICAgICAgICAgICAgbGV0IHNlY3Rpb25TY2FsZSA9IHNlY3Rpb24uc2NhbGU7XG4gICAgICAgICAgICBsZXQgbWV0cmljcyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgaW1hZ2VOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB2ZXJ0aWNhbEFkdmFuY2UgPSBPTkVfRU07XG4gICAgICAgICAgICBsZXQgZ2x5cGhPZmZzZXQgPSAwO1xuXG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9ICEod3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLmhvcml6b250YWwgfHxcbiAgICAgICAgICAgICAgICAvLyBEb24ndCB2ZXJ0aWNhbGl6ZSBnbHlwaHMgdGhhdCBoYXZlIG5vIHVwcmlnaHQgb3JpZW50YXRpb24gaWYgdmVydGljYWwgcGxhY2VtZW50IGlzIGRpc2FibGVkLlxuICAgICAgICAgICAgICAgICghYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiAhY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uKGNvZGVQb2ludCkpIHx8XG4gICAgICAgICAgICAgICAgLy8gSWYgdmVydGljYWwgcGxhY2VtZW50IGlzIGVuYWJsZWQsIGRvbid0IHZlcnRpY2FsaXplIGdseXBocyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIGZyb20gY29tcGxleCB0ZXh0IGxheW91dCBzY3JpcHQsIG9yIHdoaXRlc3BhY2VzLlxuICAgICAgICAgICAgICAgIChhbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmICh3aGl0ZXNwYWNlW2NvZGVQb2ludF0gfHwgY2hhckluQ29tcGxleFNoYXBpbmdTY3JpcHQoY29kZVBvaW50KSkpKTtcblxuICAgICAgICAgICAgaWYgKCFzZWN0aW9uLmltYWdlTmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIEZpbmQgZ2x5cGggcG9zaXRpb24gaW4gdGhlIGdseXBoIGF0bGFzLCBpZiBiaXRtYXAgaXMgbnVsbCxcbiAgICAgICAgICAgICAgICAvLyBnbHlwaFBvc2l0aW9uIHdpbGwgbm90IGV4aXQgaW4gdGhlIGdseXBoUG9zaXRpb24gbWFwXG4gICAgICAgICAgICAgICAgY29uc3QgZ2x5cGhQb3NpdGlvbkRhdGEgPSBnbHlwaFBvc2l0aW9uc1tzZWN0aW9uLmZvbnRTdGFja107XG4gICAgICAgICAgICAgICAgaWYgKCFnbHlwaFBvc2l0aW9uRGF0YSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKGdseXBoUG9zaXRpb25EYXRhW2NvZGVQb2ludF0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjdCA9IGdseXBoUG9zaXRpb25EYXRhW2NvZGVQb2ludF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGdseXBoRGF0YSA9IGdseXBoTWFwW3NlY3Rpb24uZm9udFN0YWNrXTtcbiAgICAgICAgICAgICAgICBpZiAoIWdseXBoRGF0YSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2x5cGggPSBnbHlwaERhdGEuZ2x5cGhzW2NvZGVQb2ludF07XG4gICAgICAgICAgICAgICAgaWYgKCFnbHlwaCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBtZXRyaWNzID0gZ2x5cGgubWV0cmljcztcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFkdmFuY2UgPSBjb2RlUG9pbnQgIT09IDB4MjAwYiA/IE9ORV9FTSA6IDA7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBtYWtlIGRpZmZlcmVudCBmb250cyBhbGlnbmVkLCB0aGV5IG11c3Qgc2hhcmUgYSBnZW5lcmFsIGJhc2VsaW5lIHRoYXQgYWxpZ25zIHdpdGggZXZlcnlcbiAgICAgICAgICAgICAgICAvLyBmb250J3MgcmVhbCBiYXNlbGluZS4gR2x5cGgncyBvZmZzZXQgaXMgY291bnRlZCBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIsIHdoZXJlIHRoZSBhc2NlbmRlciBsaW5lXG4gICAgICAgICAgICAgICAgLy8gc3RhcnRzLlxuICAgICAgICAgICAgICAgIC8vIEZpcnN0IG9mIGFsbCwgZWFjaCBnbHlwaCdzIGJhc2VsaW5lIGxpZXMgb24gdGhlIGNlbnRlciBsaW5lIG9mIHRoZSBzaGFwaW5nIGxpbmUuIFNpbmNlIGFzY2VuZGVyXG4gICAgICAgICAgICAgICAgLy8gaXMgYWJvdmUgdGhlIGJhc2VsaW5lLCB0aGUgZ2x5cGhPZmZzZXQgaXMgdGhlIG5lZ2F0aXZlIHNoaWZ0LiBUaGVuLCBpbiBvcmRlciB0byBtYWtlIGdseXBocyBmaXQgaW5cbiAgICAgICAgICAgICAgICAvLyB0aGUgc2hhcGluZyBib3gsIGZvciBlYWNoIGxpbmUsIHdlIHNoaWZ0IHRoZSBnbHlwaCB3aXRoIGJpZ2dlc3QgaGVpZ2h0KHdpdGggc2NhbGUpIHRvIG1ha2UgaXRzIGNlbnRlclxuICAgICAgICAgICAgICAgIC8vIGxpZSBvbiB0aGUgY2VudGVyIGxpbmUgb2YgdGhlIGxpbmUsIHdoaWNoIHdpbGwgbGVhZCB0byBhIGJhc2VsaW5lIHNoaWZ0LiBUaGVuIGFkanVzdCB0aGUgd2hvbGUgbGluZVxuICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGJhc2VsaW5lIG9mZnNldCB3ZSBjYWxjdWxhdGVkIGZyb20gdGhlIHNoaWZ0LlxuICAgICAgICAgICAgICAgIGlmIChoYXNCYXNlbGluZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhc2NlbmRlciA9IGdseXBoRGF0YS5hc2NlbmRlciAhPT0gdW5kZWZpbmVkID8gTWF0aC5hYnMoZ2x5cGhEYXRhLmFzY2VuZGVyKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRlciA9IGdseXBoRGF0YS5kZXNjZW5kZXIgIT09IHVuZGVmaW5lZCA/IE1hdGguYWJzKGdseXBoRGF0YS5kZXNjZW5kZXIpIDogMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoYXNjZW5kZXIgKyBkZXNjZW5kZXIpICogc2VjdGlvblNjYWxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmlnZ2VzdEhlaWdodCA8IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaWdnZXN0SGVpZ2h0ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldCA9IChhc2NlbmRlciAtIGRlc2NlbmRlcikgLyAyICogc2VjdGlvblNjYWxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGdseXBoT2Zmc2V0ID0gLWFzY2VuZGVyICogc2VjdGlvblNjYWxlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGZvbnQncyBiYXNlbGluZSBpcyBub3QgYXBwbGljYWJsZSwgZmFsbCBiYWNrIHRvIHVzZSBhIGRlZmF1bHQgYmFzZWxpbmUgb2Zmc2V0LCBzZWVcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hhcGluZzo6eU9mZnNldC4gU2luY2Ugd2UncmUgbGF5aW5nIG91dCBhdCAyNCBwb2ludHMsIHdlIG5lZWQgYWxzbyBjYWxjdWxhdGUgaG93IG11Y2ggaXQgd2lsbFxuICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHdoZW4gd2Ugc2NhbGUgdXAgb3IgZG93bi5cbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhPZmZzZXQgPSBTSEFQSU5HX0RFRkFVTFRfT0ZGU0VUICsgKGxpbmVNYXhTY2FsZSAtIHNlY3Rpb25TY2FsZSkgKiBPTkVfRU07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZVBvc2l0aW9uID0gaW1hZ2VQb3NpdGlvbnNbc2VjdGlvbi5pbWFnZU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghaW1hZ2VQb3NpdGlvbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgaW1hZ2VOYW1lID0gc2VjdGlvbi5pbWFnZU5hbWU7XG4gICAgICAgICAgICAgICAgc2hhcGluZy5pY29uc0luVGV4dCA9IHNoYXBpbmcuaWNvbnNJblRleHQgfHwgdHJ1ZTtcbiAgICAgICAgICAgICAgICByZWN0ID0gaW1hZ2VQb3NpdGlvbi5wYWRkZWRSZWN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSBpbWFnZVBvc2l0aW9uLmRpc3BsYXlTaXplO1xuICAgICAgICAgICAgICAgIC8vIElmIG5lZWRlZCwgYWxsb3cgdG8gc2V0IHNjYWxlIGZhY3RvciBmb3IgYW4gaW1hZ2UgdXNpbmdcbiAgICAgICAgICAgICAgICAvLyBhbGlhcyBcImltYWdlLXNjYWxlXCIgdGhhdCBjb3VsZCBiZSBhbGlhcyBmb3IgXCJmb250LXNjYWxlXCJcbiAgICAgICAgICAgICAgICAvLyB3aGVuIEZvcm1hdHRlZFNlY3Rpb24gaXMgYW4gaW1hZ2Ugc2VjdGlvbi5cbiAgICAgICAgICAgICAgICBzZWN0aW9uU2NhbGUgPSBzZWN0aW9uU2NhbGUgKiBPTkVfRU0gLyBsYXlvdXRUZXh0U2l6ZVRoaXNab29tO1xuXG4gICAgICAgICAgICAgICAgbWV0cmljcyA9IHt3aWR0aDogc2l6ZVswXSxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzaXplWzFdLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBJTUFHRV9QQURESU5HLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IC1HTFlQSF9QQkZfQk9SREVSLFxuICAgICAgICAgICAgICAgICAgICBhZHZhbmNlOiB2ZXJ0aWNhbCA/IHNpemVbMV0gOiBzaXplWzBdLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbEdseXBoOiBmYWxzZX07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWhhc0Jhc2VsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGdseXBoT2Zmc2V0ID0gU0hBUElOR19ERUZBVUxUX09GRlNFVCArIGxpbmVNYXhTY2FsZSAqIE9ORV9FTSAtIHNpemVbMV0gKiBzZWN0aW9uU2NhbGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmFzZWQgb24gbm9kZS1mb250bmlrOiAndG9wID0gaGVpZ2h0QWJvdmVCYXNlbGluZSAtIEFzY2VuZGVyJyhpdCBpcyBub3QgdmFsaWQgZm9yIGxvY2FsbHlcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGVkIGdseXBoKS4gU2luY2UgdGhlIHRvcCBpcyBhIGNvbnN0YW50OiBnbHlwaCdzIGJvcmRlclNpemUuIFNvIGlmIHdlIHNldCBpbWFnZSBnbHlwaCB3aXRoXG4gICAgICAgICAgICAgICAgICAgIC8vICdhc2NlbmRlciA9IGhlaWdodCcsIGl0IG1lYW5zIHdlIHB1bGwgZG93biB0aGUgZ2x5cGggdW5kZXIgYmFzZWxpbmUgd2l0aCBhIGRpc3RhbmNlIG9mIGdseXBoJ3MgYm9yZGVyU2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VBc2NlbmRlciA9IG1ldHJpY3MuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBnbHlwaE9mZnNldCA9IC1pbWFnZUFzY2VuZGVyICogc2VjdGlvblNjYWxlO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZlcnRpY2FsQWR2YW5jZSA9IG1ldHJpY3MuYWR2YW5jZTtcblxuICAgICAgICAgICAgICAgIC8vIERpZmZlcmVuY2UgYmV0d2VlbiBoZWlnaHQgb2YgYW4gaW1hZ2UgYW5kIG9uZSBFTSBhdCBtYXggbGluZSBzY2FsZS5cbiAgICAgICAgICAgICAgICAvLyBQdXNoZXMgY3VycmVudCBsaW5lIGRvd24gaWYgYW4gaW1hZ2Ugc2l6ZSBpcyBvdmVyIDEgRU0gYXQgbWF4IGxpbmUgc2NhbGUuXG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHZlcnRpY2FsID8gc2l6ZVswXSA6IHNpemVbMV0pICogc2VjdGlvblNjYWxlIC0gT05FX0VNICogbGluZU1heFNjYWxlO1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiAwICYmIG9mZnNldCA+IGxpbmVPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZU9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbmVkR2x5cGhzLnB1c2goe2dseXBoOiBjb2RlUG9pbnQsIGltYWdlTmFtZSwgeCwgeTogeSArIGdseXBoT2Zmc2V0LCB2ZXJ0aWNhbCwgc2NhbGU6IHNlY3Rpb25TY2FsZSwgbG9jYWxHbHlwaDogbWV0cmljcy5sb2NhbEdseXBoLCBmb250U3RhY2s6IHNlY3Rpb24uZm9udFN0YWNrLCBzZWN0aW9uSW5kZXgsIG1ldHJpY3MsIHJlY3R9KTtcbiAgICAgICAgICAgICAgICB4ICs9IG1ldHJpY3MuYWR2YW5jZSAqIHNlY3Rpb25TY2FsZSArIHNwYWNpbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNoYXBpbmcudmVydGljYWxpemFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaHMucHVzaCh7Z2x5cGg6IGNvZGVQb2ludCwgaW1hZ2VOYW1lLCB4LCB5OiB5ICsgZ2x5cGhPZmZzZXQsIHZlcnRpY2FsLCBzY2FsZTogc2VjdGlvblNjYWxlLCBsb2NhbEdseXBoOiBtZXRyaWNzLmxvY2FsR2x5cGgsIGZvbnRTdGFjazogc2VjdGlvbi5mb250U3RhY2ssIHNlY3Rpb25JbmRleCwgbWV0cmljcywgcmVjdH0pO1xuICAgICAgICAgICAgICAgIHggKz0gdmVydGljYWxBZHZhbmNlICogc2VjdGlvblNjYWxlICsgc3BhY2luZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkganVzdGlmeSBpZiB3ZSBwbGFjZWQgYXQgbGVhc3Qgb25lIGdseXBoXG4gICAgICAgIGlmIChwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IHggLSBzcGFjaW5nO1xuICAgICAgICAgICAgbWF4TGluZUxlbmd0aCA9IE1hdGgubWF4KGxpbmVMZW5ndGgsIG1heExpbmVMZW5ndGgpO1xuICAgICAgICAgICAgLy8gSnVzdGlmeSB0aGUgbGluZSBzbyB0aGF0IGl0cyB0b3AgaXMgYWxpZ25lZCB3aXRoIHRoZSBjdXJyZW50IGhlaWdodCBvZiB5LCBhbmQgaXRzIGhvcml6b250YWwgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIC8vIGFyZSBqdXN0aWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBUZXh0SnVzdGlmeVR5cGVcbiAgICAgICAgICAgIGlmIChoYXNCYXNlbGluZSkge1xuICAgICAgICAgICAgICAgIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHMsIGp1c3RpZnksIGxpbmVPZmZzZXQsIGJhc2VsaW5lT2Zmc2V0LCBsaW5lSGVpZ2h0ICogbGluZU1heFNjYWxlIC8gMik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNjYWxlZCBsaW5lIGhlaWdodCBvZmZzZXQgaXMgY291bnRlZCBpbiBnbHlwaE9mZnNldCwgc28gaGVyZSBqdXN0IHVzZSBhbiB1bnNjYWxlZCBsaW5lIGhlaWdodFxuICAgICAgICAgICAgICAgIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHMsIGp1c3RpZnksIGxpbmVPZmZzZXQsIDAsIGxpbmVIZWlnaHQgLyAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHggPSAwO1xuICAgICAgICBjb25zdCBjdXJyZW50TGluZUhlaWdodCA9IGxpbmVIZWlnaHQgKiBsaW5lTWF4U2NhbGUgKyBsaW5lT2Zmc2V0O1xuICAgICAgICBwb3NpdGlvbmVkTGluZS5saW5lT2Zmc2V0ID0gTWF0aC5tYXgobGluZU9mZnNldCwgbWF4TGluZU9mZnNldCk7XG4gICAgICAgIHkgKz0gY3VycmVudExpbmVIZWlnaHQ7XG4gICAgICAgIG1heExpbmVIZWlnaHQgPSBNYXRoLm1heChjdXJyZW50TGluZUhlaWdodCwgbWF4TGluZUhlaWdodCk7XG4gICAgICAgICsrbGluZUluZGV4O1xuICAgIH1cblxuICAgIGNvbnN0IGhlaWdodCA9IHk7XG4gICAgY29uc3Qge2hvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbn0gPSBnZXRBbmNob3JBbGlnbm1lbnQodGV4dEFuY2hvcik7XG4gICAgYWxpZ24oc2hhcGluZy5wb3NpdGlvbmVkTGluZXMsIGp1c3RpZnksIGhvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbiwgbWF4TGluZUxlbmd0aCwgaGVpZ2h0KTtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIGJvdW5kaW5nIGJveFxuICAgIHNoYXBpbmcudG9wICs9IC12ZXJ0aWNhbEFsaWduICogaGVpZ2h0O1xuICAgIHNoYXBpbmcuYm90dG9tID0gc2hhcGluZy50b3AgKyBoZWlnaHQ7XG4gICAgc2hhcGluZy5sZWZ0ICs9IC1ob3Jpem9udGFsQWxpZ24gKiBtYXhMaW5lTGVuZ3RoO1xuICAgIHNoYXBpbmcucmlnaHQgPSBzaGFwaW5nLmxlZnQgKyBtYXhMaW5lTGVuZ3RoO1xuICAgIHNoYXBpbmcuaGFzQmFzZWxpbmUgPSBoYXNCYXNlbGluZTtcbn1cblxuLy8ganVzdGlmeSByaWdodCA9IDEsIGxlZnQgPSAwLCBjZW50ZXIgPSAwLjVcbmZ1bmN0aW9uIGp1c3RpZnlMaW5lKHBvc2l0aW9uZWRHbHlwaHM6IEFycmF5PFBvc2l0aW9uZWRHbHlwaD4sXG4gICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5OiAxIHwgMCB8IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lT2Zmc2V0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICBoYWxmTGluZUhlaWdodDogbnVtYmVyKSB7XG4gICAgaWYgKCFqdXN0aWZ5ICYmICFsaW5lT2Zmc2V0ICYmICFiYXNlbGluZU9mZnNldCAmJiAhaGFsZkxpbmVIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbmQgPSBwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgbGFzdEdseXBoID0gcG9zaXRpb25lZEdseXBoc1tlbmRdO1xuICAgIGNvbnN0IGxhc3RBZHZhbmNlID0gbGFzdEdseXBoLm1ldHJpY3MuYWR2YW5jZSAqIGxhc3RHbHlwaC5zY2FsZTtcbiAgICBjb25zdCBsaW5lSW5kZW50ID0gKGxhc3RHbHlwaC54ICsgbGFzdEFkdmFuY2UpICoganVzdGlmeTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDw9IGVuZDsgaisrKSB7XG4gICAgICAgIHBvc2l0aW9uZWRHbHlwaHNbal0ueCAtPSBsaW5lSW5kZW50O1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnkgKz0gbGluZU9mZnNldCArIGJhc2VsaW5lT2Zmc2V0ICsgaGFsZkxpbmVIZWlnaHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhbGlnbihwb3NpdGlvbmVkTGluZXM6IEFycmF5PFBvc2l0aW9uZWRMaW5lPixcbiAgICAgICAgICAgICAgIGp1c3RpZnk6IG51bWJlcixcbiAgICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbjogbnVtYmVyLFxuICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogbnVtYmVyLFxuICAgICAgICAgICAgICAgbWF4TGluZUxlbmd0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgYmxvY2tIZWlnaHQ6IG51bWJlcikge1xuICAgIGNvbnN0IHNoaWZ0WCA9IChqdXN0aWZ5IC0gaG9yaXpvbnRhbEFsaWduKSAqIG1heExpbmVMZW5ndGg7XG5cbiAgICBjb25zdCBzaGlmdFkgPSAtYmxvY2tIZWlnaHQgKiB2ZXJ0aWNhbEFsaWduO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBwb3NpdGlvbmVkTGluZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwb3NpdGlvbmVkR2x5cGggb2YgbGluZS5wb3NpdGlvbmVkR2x5cGhzKSB7XG4gICAgICAgICAgICBwb3NpdGlvbmVkR2x5cGgueCArPSBzaGlmdFg7XG4gICAgICAgICAgICBwb3NpdGlvbmVkR2x5cGgueSArPSBzaGlmdFk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFBvc2l0aW9uZWRJY29uID0ge1xuICAgIGltYWdlOiBJbWFnZVBvc2l0aW9uLFxuICAgIHRvcDogbnVtYmVyLFxuICAgIGJvdHRvbTogbnVtYmVyLFxuICAgIGxlZnQ6IG51bWJlcixcbiAgICByaWdodDogbnVtYmVyLFxuICAgIGNvbGxpc2lvblBhZGRpbmc/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXVxufTtcblxuZnVuY3Rpb24gc2hhcGVJY29uKGltYWdlOiBJbWFnZVBvc2l0aW9uLCBpY29uT2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLCBpY29uQW5jaG9yOiBTeW1ib2xBbmNob3IpOiBQb3NpdGlvbmVkSWNvbiB7XG4gICAgY29uc3Qge2hvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbn0gPSBnZXRBbmNob3JBbGlnbm1lbnQoaWNvbkFuY2hvcik7XG4gICAgY29uc3QgZHggPSBpY29uT2Zmc2V0WzBdO1xuICAgIGNvbnN0IGR5ID0gaWNvbk9mZnNldFsxXTtcbiAgICBjb25zdCB4MSA9IGR4IC0gaW1hZ2UuZGlzcGxheVNpemVbMF0gKiBob3Jpem9udGFsQWxpZ247XG4gICAgY29uc3QgeDIgPSB4MSArIGltYWdlLmRpc3BsYXlTaXplWzBdO1xuICAgIGNvbnN0IHkxID0gZHkgLSBpbWFnZS5kaXNwbGF5U2l6ZVsxXSAqIHZlcnRpY2FsQWxpZ247XG4gICAgY29uc3QgeTIgPSB5MSArIGltYWdlLmRpc3BsYXlTaXplWzFdO1xuICAgIHJldHVybiB7aW1hZ2UsIHRvcDogeTEsIGJvdHRvbTogeTIsIGxlZnQ6IHgxLCByaWdodDogeDJ9O1xufVxuXG5mdW5jdGlvbiBmaXRJY29uVG9UZXh0KHNoYXBlZEljb246IFBvc2l0aW9uZWRJY29uLCBzaGFwZWRUZXh0OiBTaGFwaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Rml0OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFsgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyIF0sXG4gICAgICAgICAgICAgICAgICAgICAgIGljb25PZmZzZXQ6IFsgbnVtYmVyLCBudW1iZXIgXSwgZm9udFNjYWxlOiBudW1iZXIpOiBQb3NpdGlvbmVkSWNvbiB7XG4gICAgYXNzZXJ0KHRleHRGaXQgIT09ICdub25lJyk7XG4gICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkocGFkZGluZykgJiYgcGFkZGluZy5sZW5ndGggPT09IDQpO1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KGljb25PZmZzZXQpICYmIGljb25PZmZzZXQubGVuZ3RoID09PSAyKTtcblxuICAgIGNvbnN0IGltYWdlID0gc2hhcGVkSWNvbi5pbWFnZTtcblxuICAgIGxldCBjb2xsaXNpb25QYWRkaW5nO1xuICAgIGlmIChpbWFnZS5jb250ZW50KSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBpbWFnZS5jb250ZW50O1xuICAgICAgICBjb25zdCBwaXhlbFJhdGlvID0gaW1hZ2UucGl4ZWxSYXRpbyB8fCAxO1xuICAgICAgICBjb2xsaXNpb25QYWRkaW5nID0gW1xuICAgICAgICAgICAgY29udGVudFswXSAvIHBpeGVsUmF0aW8sXG4gICAgICAgICAgICBjb250ZW50WzFdIC8gcGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIGltYWdlLmRpc3BsYXlTaXplWzBdIC0gY29udGVudFsyXSAvIHBpeGVsUmF0aW8sXG4gICAgICAgICAgICBpbWFnZS5kaXNwbGF5U2l6ZVsxXSAtIGNvbnRlbnRbM10gLyBwaXhlbFJhdGlvXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLy8gV2UgZG9uJ3QgcmVzcGVjdCB0aGUgaWNvbi1hbmNob3IsIGJlY2F1c2UgaWNvbi10ZXh0LWZpdCBpcyBzZXQuIEluc3RlYWQsXG4gICAgLy8gdGhlIGljb24gd2lsbCBiZSBjZW50ZXJlZCBvbiB0aGUgdGV4dCwgdGhlbiBzdHJldGNoZWQgaW4gdGhlIGdpdmVuXG4gICAgLy8gZGltZW5zaW9ucy5cblxuICAgIGNvbnN0IHRleHRMZWZ0ID0gc2hhcGVkVGV4dC5sZWZ0ICogZm9udFNjYWxlO1xuICAgIGNvbnN0IHRleHRSaWdodCA9IHNoYXBlZFRleHQucmlnaHQgKiBmb250U2NhbGU7XG5cbiAgICBsZXQgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0O1xuICAgIGlmICh0ZXh0Rml0ID09PSAnd2lkdGgnIHx8IHRleHRGaXQgPT09ICdib3RoJykge1xuICAgICAgICAvLyBTdHJldGNoZWQgaG9yaXpvbnRhbGx5IHRvIHRoZSB0ZXh0IHdpZHRoXG4gICAgICAgIGxlZnQgPSBpY29uT2Zmc2V0WzBdICsgdGV4dExlZnQgLSBwYWRkaW5nWzNdO1xuICAgICAgICByaWdodCA9IGljb25PZmZzZXRbMF0gKyB0ZXh0UmlnaHQgKyBwYWRkaW5nWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENlbnRlcmVkIG9uIHRoZSB0ZXh0XG4gICAgICAgIGxlZnQgPSBpY29uT2Zmc2V0WzBdICsgKHRleHRMZWZ0ICsgdGV4dFJpZ2h0IC0gaW1hZ2UuZGlzcGxheVNpemVbMF0pIC8gMjtcbiAgICAgICAgcmlnaHQgPSBsZWZ0ICsgaW1hZ2UuZGlzcGxheVNpemVbMF07XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dFRvcCA9IHNoYXBlZFRleHQudG9wICogZm9udFNjYWxlO1xuICAgIGNvbnN0IHRleHRCb3R0b20gPSBzaGFwZWRUZXh0LmJvdHRvbSAqIGZvbnRTY2FsZTtcbiAgICBpZiAodGV4dEZpdCA9PT0gJ2hlaWdodCcgfHwgdGV4dEZpdCA9PT0gJ2JvdGgnKSB7XG4gICAgICAgIC8vIFN0cmV0Y2hlZCB2ZXJ0aWNhbGx5IHRvIHRoZSB0ZXh0IGhlaWdodFxuICAgICAgICB0b3AgPSBpY29uT2Zmc2V0WzFdICsgdGV4dFRvcCAtIHBhZGRpbmdbMF07XG4gICAgICAgIGJvdHRvbSA9IGljb25PZmZzZXRbMV0gKyB0ZXh0Qm90dG9tICsgcGFkZGluZ1syXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDZW50ZXJlZCBvbiB0aGUgdGV4dFxuICAgICAgICB0b3AgPSBpY29uT2Zmc2V0WzFdICsgKHRleHRUb3AgKyB0ZXh0Qm90dG9tIC0gaW1hZ2UuZGlzcGxheVNpemVbMV0pIC8gMjtcbiAgICAgICAgYm90dG9tID0gdG9wICsgaW1hZ2UuZGlzcGxheVNpemVbMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtpbWFnZSwgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBjb2xsaXNpb25QYWRkaW5nfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcblxuY2xhc3MgQW5jaG9yIGV4dGVuZHMgUG9pbnQge1xuICAgIGFuZ2xlOiBhbnk7XG4gICAgejogbnVtYmVyO1xuICAgIHNlZ21lbnQ6IG51bWJlciB8IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcih4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCBhbmdsZTogbnVtYmVyLCBzZWdtZW50PzogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKHgsIHkpO1xuICAgICAgICB0aGlzLmFuZ2xlID0gYW5nbGU7XG4gICAgICAgIHRoaXMueiA9IHo7XG4gICAgICAgIGlmIChzZWdtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudCA9IHNlZ21lbnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy5hbmdsZSwgdGhpcy5zZWdtZW50KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdBbmNob3InLCBBbmNob3IpO1xuXG5leHBvcnQgZGVmYXVsdCBBbmNob3I7XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgZGVmYXVsdCBjaGVja01heEFuZ2xlO1xuXG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIEFuY2hvciBmcm9tICcuL2FuY2hvci5qcyc7XG5cbi8qKlxuICogTGFiZWxzIHBsYWNlZCBhcm91bmQgcmVhbGx5IHNoYXJwIGFuZ2xlcyBhcmVuJ3QgcmVhZGFibGUuIENoZWNrIGlmIGFueVxuICogcGFydCBvZiB0aGUgcG90ZW50aWFsIGxhYmVsIGhhcyBhIGNvbWJpbmVkIGFuZ2xlIHRoYXQgaXMgdG9vIGJpZy5cbiAqXG4gKiBAcGFyYW0gbGluZVxuICogQHBhcmFtIGFuY2hvciBUaGUgcG9pbnQgb24gdGhlIGxpbmUgYXJvdW5kIHdoaWNoIHRoZSBsYWJlbCBpcyBhbmNob3JlZC5cbiAqIEBwYXJhbSBsYWJlbExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBsYWJlbCBpbiBnZW9tZXRyeSB1bml0cy5cbiAqIEBwYXJhbSB3aW5kb3dTaXplIFRoZSBjaGVjayBmYWlscyBpZiB0aGUgY29tYmluZWQgYW5nbGVzIHdpdGhpbiBhIHBhcnQgb2YgdGhlIGxpbmUgdGhhdCBpcyBgd2luZG93U2l6ZWAgbG9uZyBpcyB0b28gYmlnLlxuICogQHBhcmFtIG1heEFuZ2xlIFRoZSBtYXhpbXVtIGNvbWJpbmVkIGFuZ2xlIHRoYXQgYW55IHdpbmRvdyBhbG9uZyB0aGUgbGFiZWwgaXMgYWxsb3dlZCB0byBoYXZlLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBsYWJlbCBzaG91bGQgYmUgcGxhY2VkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja01heEFuZ2xlKGxpbmU6IEFycmF5PFBvaW50PiwgYW5jaG9yOiBBbmNob3IsIGxhYmVsTGVuZ3RoOiBudW1iZXIsIHdpbmRvd1NpemU6IG51bWJlciwgbWF4QW5nbGU6IG51bWJlcikge1xuXG4gICAgLy8gaG9yaXpvbnRhbCBsYWJlbHMgYWx3YXlzIHBhc3NcbiAgICBpZiAoYW5jaG9yLnNlZ21lbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG5cbiAgICBsZXQgcCA9IGFuY2hvcjtcbiAgICBsZXQgaW5kZXggPSBhbmNob3Iuc2VnbWVudCArIDE7XG4gICAgbGV0IGFuY2hvckRpc3RhbmNlID0gMDtcblxuICAgIC8vIG1vdmUgYmFja3dhcmRzIGFsb25nIHRoZSBsaW5lIHRvIHRoZSBmaXJzdCBzZWdtZW50IHRoZSBsYWJlbCBhcHBlYXJzIG9uXG4gICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlID4gLWxhYmVsTGVuZ3RoIC8gMikge1xuICAgICAgICBpbmRleC0tO1xuXG4gICAgICAgIC8vIHRoZXJlIGlzbid0IGVub3VnaCByb29tIGZvciB0aGUgbGFiZWwgYWZ0ZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZVxuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgYW5jaG9yRGlzdGFuY2UgLT0gbGluZVtpbmRleF0uZGlzdChwKTtcbiAgICAgICAgcCA9IGxpbmVbaW5kZXhdO1xuICAgIH1cblxuICAgIGFuY2hvckRpc3RhbmNlICs9IGxpbmVbaW5kZXhdLmRpc3QobGluZVtpbmRleCArIDFdKTtcbiAgICBpbmRleCsrO1xuXG4gICAgLy8gc3RvcmUgcmVjZW50IGNvcm5lcnMgYW5kIHRoZWlyIHRvdGFsIGFuZ2xlIGRpZmZlcmVuY2VcbiAgICBjb25zdCByZWNlbnRDb3JuZXJzID0gW107XG4gICAgbGV0IHJlY2VudEFuZ2xlRGVsdGEgPSAwO1xuXG4gICAgLy8gbW92ZSBmb3J3YXJkcyBieSB0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbCBhbmQgY2hlY2sgYW5nbGVzIGFsb25nIHRoZSB3YXlcbiAgICB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgPCBsYWJlbExlbmd0aCAvIDIpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IGxpbmVbaW5kZXggLSAxXTtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGxpbmVbaW5kZXhdO1xuICAgICAgICBjb25zdCBuZXh0ID0gbGluZVtpbmRleCArIDFdO1xuXG4gICAgICAgIC8vIHRoZXJlIGlzbid0IGVub3VnaCByb29tIGZvciB0aGUgbGFiZWwgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGxpbmVcbiAgICAgICAgaWYgKCFuZXh0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGFuZ2xlRGVsdGEgPSBwcmV2LmFuZ2xlVG8oY3VycmVudCkgLSBjdXJyZW50LmFuZ2xlVG8obmV4dCk7XG4gICAgICAgIC8vIHJlc3RyaWN0IGFuZ2xlIHRvIC1waS4ucGkgcmFuZ2VcbiAgICAgICAgYW5nbGVEZWx0YSA9IE1hdGguYWJzKCgoYW5nbGVEZWx0YSArIDMgKiBNYXRoLlBJKSAlIChNYXRoLlBJICogMikpIC0gTWF0aC5QSSk7XG5cbiAgICAgICAgcmVjZW50Q29ybmVycy5wdXNoKHtcbiAgICAgICAgICAgIGRpc3RhbmNlOiBhbmNob3JEaXN0YW5jZSxcbiAgICAgICAgICAgIGFuZ2xlRGVsdGFcbiAgICAgICAgfSk7XG4gICAgICAgIHJlY2VudEFuZ2xlRGVsdGEgKz0gYW5nbGVEZWx0YTtcblxuICAgICAgICAvLyByZW1vdmUgY29ybmVycyB0aGF0IGFyZSBmYXIgZW5vdWdoIGF3YXkgZnJvbSB0aGUgbGlzdCBvZiByZWNlbnQgYW5jaG9yc1xuICAgICAgICB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgLSByZWNlbnRDb3JuZXJzWzBdLmRpc3RhbmNlID4gd2luZG93U2l6ZSkge1xuICAgICAgICAgICAgcmVjZW50QW5nbGVEZWx0YSAtPSByZWNlbnRDb3JuZXJzLnNoaWZ0KCkuYW5nbGVEZWx0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZSBzdW0gb2YgYW5nbGVzIHdpdGhpbiB0aGUgd2luZG93IGFyZWEgZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlLiBjaGVjayBmYWlscy5cbiAgICAgICAgaWYgKHJlY2VudEFuZ2xlRGVsdGEgPiBtYXhBbmdsZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGFuY2hvckRpc3RhbmNlICs9IGN1cnJlbnQuZGlzdChuZXh0KTtcbiAgICB9XG5cbiAgICAvLyBubyBwYXJ0IG9mIHRoZSBsaW5lIGhhZCBhbiBhbmdsZSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZC4gY2hlY2sgcGFzc2VzLlxuICAgIHJldHVybiB0cnVlO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtudW1iZXIgYXMgaW50ZXJwb2xhdGV9IGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5cbmltcG9ydCBBbmNob3IgZnJvbSAnLi4vc3ltYm9sL2FuY2hvci5qcyc7XG5pbXBvcnQgY2hlY2tNYXhBbmdsZSBmcm9tICcuL2NoZWNrX21heF9hbmdsZS5qcyc7XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge1NoYXBpbmcsIFBvc2l0aW9uZWRJY29ufSBmcm9tICcuL3NoYXBpbmcuanMnO1xuXG5leHBvcnQge2dldEFuY2hvcnMsIGdldENlbnRlckFuY2hvcn07XG5cbmZ1bmN0aW9uIGdldExpbmVMZW5ndGgobGluZTogQXJyYXk8UG9pbnQ+KTogbnVtYmVyIHtcbiAgICBsZXQgbGluZUxlbmd0aCA9IDA7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW5lLmxlbmd0aCAtIDE7IGsrKykge1xuICAgICAgICBsaW5lTGVuZ3RoICs9IGxpbmVba10uZGlzdChsaW5lW2sgKyAxXSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lTGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBnZXRBbmdsZVdpbmRvd1NpemUoc2hhcGVkVGV4dDogP1NoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94U2NhbGU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHNoYXBlZFRleHQgP1xuICAgICAgICAzIC8gNSAqIGdseXBoU2l6ZSAqIGJveFNjYWxlIDpcbiAgICAgICAgMDtcbn1cblxuZnVuY3Rpb24gZ2V0U2hhcGVkTGFiZWxMZW5ndGgoc2hhcGVkVGV4dDogP1NoYXBpbmcsIHNoYXBlZEljb246ID9Qb3NpdGlvbmVkSWNvbik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgICBzaGFwZWRUZXh0ID8gc2hhcGVkVGV4dC5yaWdodCAtIHNoYXBlZFRleHQubGVmdCA6IDAsXG4gICAgICAgIHNoYXBlZEljb24gPyBzaGFwZWRJY29uLnJpZ2h0IC0gc2hhcGVkSWNvbi5sZWZ0IDogMCk7XG59XG5cbmZ1bmN0aW9uIGdldENlbnRlckFuY2hvcihsaW5lOiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgbWF4QW5nbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0OiA/U2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRJY29uOiA/UG9zaXRpb25lZEljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgYm94U2NhbGU6IG51bWJlcikge1xuICAgIGNvbnN0IGFuZ2xlV2luZG93U2l6ZSA9IGdldEFuZ2xlV2luZG93U2l6ZShzaGFwZWRUZXh0LCBnbHlwaFNpemUsIGJveFNjYWxlKTtcbiAgICBjb25zdCBsYWJlbExlbmd0aCA9IGdldFNoYXBlZExhYmVsTGVuZ3RoKHNoYXBlZFRleHQsIHNoYXBlZEljb24pICogYm94U2NhbGU7XG5cbiAgICBsZXQgcHJldkRpc3RhbmNlID0gMDtcbiAgICBjb25zdCBjZW50ZXJEaXN0YW5jZSA9IGdldExpbmVMZW5ndGgobGluZSkgLyAyO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKykge1xuXG4gICAgICAgIGNvbnN0IGEgPSBsaW5lW2ldLFxuICAgICAgICAgICAgYiA9IGxpbmVbaSArIDFdO1xuXG4gICAgICAgIGNvbnN0IHNlZ21lbnREaXN0YW5jZSA9IGEuZGlzdChiKTtcblxuICAgICAgICBpZiAocHJldkRpc3RhbmNlICsgc2VnbWVudERpc3RhbmNlID4gY2VudGVyRGlzdGFuY2UpIHtcbiAgICAgICAgICAgIC8vIFRoZSBjZW50ZXIgaXMgb24gdGhpcyBzZWdtZW50XG4gICAgICAgICAgICBjb25zdCB0ID0gKGNlbnRlckRpc3RhbmNlIC0gcHJldkRpc3RhbmNlKSAvIHNlZ21lbnREaXN0YW5jZSxcbiAgICAgICAgICAgICAgICB4ID0gaW50ZXJwb2xhdGUoYS54LCBiLngsIHQpLFxuICAgICAgICAgICAgICAgIHkgPSBpbnRlcnBvbGF0ZShhLnksIGIueSwgdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBBbmNob3IoeCwgeSwgMCwgYi5hbmdsZVRvKGEpLCBpKTtcbiAgICAgICAgICAgIGlmICghYW5nbGVXaW5kb3dTaXplIHx8IGNoZWNrTWF4QW5nbGUobGluZSwgYW5jaG9yLCBsYWJlbExlbmd0aCwgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYW5jaG9yO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2RGlzdGFuY2UgKz0gc2VnbWVudERpc3RhbmNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0QW5jaG9ycyhsaW5lOiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgIHNwYWNpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgbWF4QW5nbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dDogP1NoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb246ID9Qb3NpdGlvbmVkSWNvbixcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIGJveFNjYWxlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJzY2FsaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHRpbGVFeHRlbnQ6IG51bWJlcikge1xuXG4gICAgLy8gUmVzYW1wbGUgYSBsaW5lIHRvIGdldCBhbmNob3IgcG9pbnRzIGZvciBsYWJlbHMgYW5kIGNoZWNrIHRoYXQgZWFjaFxuICAgIC8vIHBvdGVudGlhbCBsYWJlbCBwYXNzZXMgdGV4dC1tYXgtYW5nbGUgY2hlY2sgYW5kIGhhcyBlbm91Z2ggZnJvb20gdG8gZml0XG4gICAgLy8gb24gdGhlIGxpbmUuXG5cbiAgICBjb25zdCBhbmdsZVdpbmRvd1NpemUgPSBnZXRBbmdsZVdpbmRvd1NpemUoc2hhcGVkVGV4dCwgZ2x5cGhTaXplLCBib3hTY2FsZSk7XG4gICAgY29uc3Qgc2hhcGVkTGFiZWxMZW5ndGggPSBnZXRTaGFwZWRMYWJlbExlbmd0aChzaGFwZWRUZXh0LCBzaGFwZWRJY29uKTtcbiAgICBjb25zdCBsYWJlbExlbmd0aCA9IHNoYXBlZExhYmVsTGVuZ3RoICogYm94U2NhbGU7XG5cbiAgICAvLyBJcyB0aGUgbGluZSBjb250aW51ZWQgZnJvbSBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kYXJ5P1xuICAgIGNvbnN0IGlzTGluZUNvbnRpbnVlZCA9IGxpbmVbMF0ueCA9PT0gMCB8fCBsaW5lWzBdLnggPT09IHRpbGVFeHRlbnQgfHwgbGluZVswXS55ID09PSAwIHx8IGxpbmVbMF0ueSA9PT0gdGlsZUV4dGVudDtcblxuICAgIC8vIElzIHRoZSBsYWJlbCBsb25nLCByZWxhdGl2ZSB0byB0aGUgc3BhY2luZz9cbiAgICAvLyBJZiBzbywgYWRqdXN0IHRoZSBzcGFjaW5nIHNvIHRoZXJlIGlzIGFsd2F5cyBhIG1pbmltdW0gc3BhY2Ugb2YgYHNwYWNpbmcgLyA0YCBiZXR3ZWVuIGxhYmVsIGVkZ2VzLlxuICAgIGlmIChzcGFjaW5nIC0gbGFiZWxMZW5ndGggPCBzcGFjaW5nIC8gNCkge1xuICAgICAgICBzcGFjaW5nID0gbGFiZWxMZW5ndGggKyBzcGFjaW5nIC8gNDtcbiAgICB9XG5cbiAgICAvLyBPZmZzZXQgdGhlIGZpcnN0IGFuY2hvciBieTpcbiAgICAvLyBFaXRoZXIgaGFsZiB0aGUgbGFiZWwgbGVuZ3RoIHBsdXMgYSBmaXhlZCBleHRyYSBvZmZzZXQgaWYgdGhlIGxpbmUgaXMgbm90IGNvbnRpbnVlZFxuICAgIC8vIE9yIGhhbGYgdGhlIHNwYWNpbmcgaWYgdGhlIGxpbmUgaXMgY29udGludWVkLlxuXG4gICAgLy8gRm9yIG5vbi1jb250aW51ZWQgbGluZXMsIGFkZCBhIGJpdCBvZiBmaXhlZCBleHRyYSBvZmZzZXQgdG8gYXZvaWQgY29sbGlzaW9ucyBhdCBUIGludGVyc2VjdGlvbnMuXG4gICAgY29uc3QgZml4ZWRFeHRyYU9mZnNldCA9IGdseXBoU2l6ZSAqIDI7XG5cbiAgICBjb25zdCBvZmZzZXQgPSAhaXNMaW5lQ29udGludWVkID9cbiAgICAgICAgKChzaGFwZWRMYWJlbExlbmd0aCAvIDIgKyBmaXhlZEV4dHJhT2Zmc2V0KSAqIGJveFNjYWxlICogb3ZlcnNjYWxpbmcpICUgc3BhY2luZyA6XG4gICAgICAgIChzcGFjaW5nIC8gMiAqIG92ZXJzY2FsaW5nKSAlIHNwYWNpbmc7XG5cbiAgICByZXR1cm4gcmVzYW1wbGUobGluZSwgb2Zmc2V0LCBzcGFjaW5nLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlLCBsYWJlbExlbmd0aCwgaXNMaW5lQ29udGludWVkLCBmYWxzZSwgdGlsZUV4dGVudCk7XG59XG5cbmZ1bmN0aW9uIHJlc2FtcGxlKGxpbmUsIG9mZnNldCwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGgsIGlzTGluZUNvbnRpbnVlZCwgcGxhY2VBdE1pZGRsZSwgdGlsZUV4dGVudCkge1xuXG4gICAgY29uc3QgaGFsZkxhYmVsTGVuZ3RoID0gbGFiZWxMZW5ndGggLyAyO1xuICAgIGNvbnN0IGxpbmVMZW5ndGggPSBnZXRMaW5lTGVuZ3RoKGxpbmUpO1xuXG4gICAgbGV0IGRpc3RhbmNlID0gMCxcbiAgICAgICAgbWFya2VkRGlzdGFuY2UgPSBvZmZzZXQgLSBzcGFjaW5nO1xuXG4gICAgbGV0IGFuY2hvcnMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspIHtcblxuICAgICAgICBjb25zdCBhID0gbGluZVtpXSxcbiAgICAgICAgICAgIGIgPSBsaW5lW2kgKyAxXTtcblxuICAgICAgICBjb25zdCBzZWdtZW50RGlzdCA9IGEuZGlzdChiKSxcbiAgICAgICAgICAgIGFuZ2xlID0gYi5hbmdsZVRvKGEpO1xuXG4gICAgICAgIHdoaWxlIChtYXJrZWREaXN0YW5jZSArIHNwYWNpbmcgPCBkaXN0YW5jZSArIHNlZ21lbnREaXN0KSB7XG4gICAgICAgICAgICBtYXJrZWREaXN0YW5jZSArPSBzcGFjaW5nO1xuXG4gICAgICAgICAgICBjb25zdCB0ID0gKG1hcmtlZERpc3RhbmNlIC0gZGlzdGFuY2UpIC8gc2VnbWVudERpc3QsXG4gICAgICAgICAgICAgICAgeCA9IGludGVycG9sYXRlKGEueCwgYi54LCB0KSxcbiAgICAgICAgICAgICAgICB5ID0gaW50ZXJwb2xhdGUoYS55LCBiLnksIHQpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBwb2ludCBpcyB3aXRoaW4gdGhlIHRpbGUgYm91bmRhcmllcyBhbmQgdGhhdFxuICAgICAgICAgICAgLy8gdGhlIGxhYmVsIHdvdWxkIGZpdCBiZWZvcmUgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBsaW5lXG4gICAgICAgICAgICAvLyBpZiBwbGFjZWQgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgIGlmICh4ID49IDAgJiYgeCA8IHRpbGVFeHRlbnQgJiYgeSA+PSAwICYmIHkgPCB0aWxlRXh0ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlZERpc3RhbmNlIC0gaGFsZkxhYmVsTGVuZ3RoID49IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgbWFya2VkRGlzdGFuY2UgKyBoYWxmTGFiZWxMZW5ndGggPD0gbGluZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBBbmNob3IoeCwgeSwgMCwgYW5nbGUsIGkpO1xuICAgICAgICAgICAgICAgIGFuY2hvci5fcm91bmQoKTtcblxuICAgICAgICAgICAgICAgIGlmICghYW5nbGVXaW5kb3dTaXplIHx8IGNoZWNrTWF4QW5nbGUobGluZSwgYW5jaG9yLCBsYWJlbExlbmd0aCwgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9ycy5wdXNoKGFuY2hvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGlzdGFuY2UgKz0gc2VnbWVudERpc3Q7XG4gICAgfVxuXG4gICAgaWYgKCFwbGFjZUF0TWlkZGxlICYmICFhbmNob3JzLmxlbmd0aCAmJiAhaXNMaW5lQ29udGludWVkKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBhdHRlbXB0IGF0IGZpbmRpbmcgYW5jaG9ycyBhdCB3aGljaCBsYWJlbHMgY2FuIGJlIHBsYWNlZCBmYWlsZWQuXG4gICAgICAgIC8vIFRyeSBhZ2FpbiwgYnV0IHRoaXMgdGltZSBqdXN0IHRyeSBwbGFjaW5nIG9uZSBhbmNob3IgYXQgdGhlIG1pZGRsZSBvZiB0aGUgbGluZS5cbiAgICAgICAgLy8gVGhpcyBoYXMgdGhlIG1vc3QgZWZmZWN0IGZvciBzaG9ydCBsaW5lcyBpbiBvdmVyc2NhbGVkIHRpbGVzLCBzaW5jZSB0aGVcbiAgICAgICAgLy8gaW5pdGlhbCBvZmZzZXQgdXNlZCBpbiBvdmVyc2NhbGVkIHRpbGVzIGlzIGNhbGN1bGF0ZWQgdG8gYWxpZ24gbGFiZWxzIHdpdGggcG9zaXRpb25zIGluXG4gICAgICAgIC8vIHBhcmVudCB0aWxlcyBpbnN0ZWFkIG9mIHBsYWNpbmcgdGhlIGxhYmVsIGFzIGNsb3NlIHRvIHRoZSBiZWdpbm5pbmcgYXMgcG9zc2libGUuXG4gICAgICAgIGFuY2hvcnMgPSByZXNhbXBsZShsaW5lLCBkaXN0YW5jZSAvIDIsIHNwYWNpbmcsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUsIGxhYmVsTGVuZ3RoLCBpc0xpbmVDb250aW51ZWQsIHRydWUsIHRpbGVFeHRlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNob3JzO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGlwTGluZTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXJ0IG9mIGEgbXVsdGlsaW5lIHRoYXQgaW50ZXJzZWN0cyB3aXRoIHRoZSBwcm92aWRlZCByZWN0YW5ndWxhciBib3guXG4gKlxuICogQHBhcmFtIGxpbmVzXG4gKiBAcGFyYW0geDEgdGhlIGxlZnQgZWRnZSBvZiB0aGUgYm94XG4gKiBAcGFyYW0geTEgdGhlIHRvcCBlZGdlIG9mIHRoZSBib3hcbiAqIEBwYXJhbSB4MiB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgYm94XG4gKiBAcGFyYW0geTIgdGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBib3hcbiAqIEByZXR1cm5zIGxpbmVzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjbGlwTGluZShsaW5lczogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcik6IEFycmF5PEFycmF5PFBvaW50Pj4ge1xuICAgIGNvbnN0IGNsaXBwZWRMaW5lcyA9IFtdO1xuXG4gICAgZm9yIChsZXQgbCA9IDA7IGwgPCBsaW5lcy5sZW5ndGg7IGwrKykge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbbF07XG4gICAgICAgIGxldCBjbGlwcGVkTGluZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcDAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgbGV0IHAxID0gbGluZVtpICsgMV07XG5cbiAgICAgICAgICAgIGlmIChwMC54IDwgeDEgJiYgcDEueCA8IHgxKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnggPCB4MSkge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHgxLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDEgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueCA8IHgxKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQoeDEsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MSAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocDAueSA8IHkxICYmIHAxLnkgPCB5MSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC55IDwgeTEpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTEgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnkgPCB5MSkge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MSAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkxKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAwLnggPj0geDIgJiYgcDEueCA+PSB4Mikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC54ID49IHgyKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQoeDIsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MiAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS54ID49IHgyKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQoeDIsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MiAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocDAueSA+PSB5MiAmJiBwMS55ID49IHkyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnkgPj0geTIpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTIgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MikuX3JvdW5kKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnkgPj0geTIpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTIgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MikuX3JvdW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghY2xpcHBlZExpbmUgfHwgIXAwLmVxdWFscyhjbGlwcGVkTGluZVtjbGlwcGVkTGluZS5sZW5ndGggLSAxXSkpIHtcbiAgICAgICAgICAgICAgICBjbGlwcGVkTGluZSA9IFtwMF07XG4gICAgICAgICAgICAgICAgY2xpcHBlZExpbmVzLnB1c2goY2xpcHBlZExpbmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGlwcGVkTGluZS5wdXNoKHAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkTGluZXM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2dldEFycmF5QnVmZmVyLCBSZXNvdXJjZVR5cGV9IGZyb20gJy4uL3V0aWwvYWpheC5qcyc7XG5cbmltcG9ydCBwYXJzZUdseXBoUEJGIGZyb20gJy4vcGFyc2VfZ2x5cGhfcGJmLmpzJztcblxuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4vc3R5bGVfZ2x5cGguanMnO1xuaW1wb3J0IHR5cGUge1JlcXVlc3RNYW5hZ2VyfSBmcm9tICcuLi91dGlsL21hcGJveC5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGZvbnRzdGFjazogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybFRlbXBsYXRlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWFuYWdlcjogUmVxdWVzdE1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2s8e2dseXBoczoge1tudW1iZXJdOiBTdHlsZUdseXBoIHwgbnVsbH0sIGFzY2VuZGVyPzogbnVtYmVyLCBkZXNjZW5kZXI/OiBudW1iZXJ9Pikge1xuICAgIGNvbnN0IGJlZ2luID0gcmFuZ2UgKiAyNTY7XG4gICAgY29uc3QgZW5kID0gYmVnaW4gKyAyNTU7XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChcbiAgICAgICAgcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplR2x5cGhzVVJMKHVybFRlbXBsYXRlKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3tmb250c3RhY2t9JywgZm9udHN0YWNrKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3tyYW5nZX0nLCBgJHtiZWdpbn0tJHtlbmR9YCksXG4gICAgICAgIFJlc291cmNlVHlwZS5HbHlwaHMpO1xuXG4gICAgZ2V0QXJyYXlCdWZmZXIocmVxdWVzdCwgKGVycjogP0Vycm9yLCBkYXRhOiA/QXJyYXlCdWZmZXIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBnbHlwaHMgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IGdseXBoRGF0YSA9IHBhcnNlR2x5cGhQQkYoZGF0YSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBoRGF0YS5nbHlwaHMpIHtcbiAgICAgICAgICAgICAgICBnbHlwaHNbZ2x5cGguaWRdID0gZ2x5cGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7Z2x5cGhzLCBhc2NlbmRlcjogZ2x5cGhEYXRhLmFzY2VuZGVyLCBkZXNjZW5kZXI6IGdseXBoRGF0YS5kZXNjZW5kZXJ9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwiY29uc3QgSU5GID0gMWUyMDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlueVNERiB7XG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBmb250U2l6ZSA9IDI0LFxuICAgICAgICBidWZmZXIgPSAzLFxuICAgICAgICByYWRpdXMgPSA4LFxuICAgICAgICBjdXRvZmYgPSAwLjI1LFxuICAgICAgICBmb250RmFtaWx5ID0gJ3NhbnMtc2VyaWYnLFxuICAgICAgICBmb250V2VpZ2h0ID0gJ25vcm1hbCcsXG4gICAgICAgIGZvbnRTdHlsZSA9ICdub3JtYWwnXG4gICAgfSkge1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgdGhpcy5jdXRvZmYgPSBjdXRvZmY7XG4gICAgICAgIHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXG4gICAgICAgIC8vIG1ha2UgdGhlIGNhbnZhcyBzaXplIGJpZyBlbm91Z2ggdG8gYm90aCBoYXZlIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGFyb3VuZCB0aGUgZ2x5cGhcbiAgICAgICAgLy8gZm9yIFwiaGFsb1wiLCBhbmQgYWNjb3VudCBmb3Igc29tZSBnbHlwaHMgcG9zc2libHkgYmVpbmcgbGFyZ2VyIHRoYW4gdGhlaXIgZm9udCBzaXplXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemUgPSBmb250U2l6ZSArIGJ1ZmZlciAqIDQ7XG5cbiAgICAgICAgY29uc3QgY2FudmFzID0gdGhpcy5fY3JlYXRlQ2FudmFzKHNpemUpO1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLmN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHt3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWV9KTtcbiAgICAgICAgY3R4LmZvbnQgPSBgJHtmb250U3R5bGV9ICR7Zm9udFdlaWdodH0gJHtmb250U2l6ZX1weCAke2ZvbnRGYW1pbHl9YDtcblxuICAgICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ2FscGhhYmV0aWMnO1xuICAgICAgICBjdHgudGV4dEFsaWduID0gJ2xlZnQnOyAvLyBOZWNlc3Nhcnkgc28gdGhhdCBSVEwgdGV4dCBkb2Vzbid0IGhhdmUgZGlmZmVyZW50IGFsaWdubWVudFxuICAgICAgICBjdHguZmlsbFN0eWxlID0gJ2JsYWNrJztcblxuICAgICAgICAvLyB0ZW1wb3JhcnkgYXJyYXlzIGZvciB0aGUgZGlzdGFuY2UgdHJhbnNmb3JtXG4gICAgICAgIHRoaXMuZ3JpZE91dGVyID0gbmV3IEZsb2F0NjRBcnJheShzaXplICogc2l6ZSk7XG4gICAgICAgIHRoaXMuZ3JpZElubmVyID0gbmV3IEZsb2F0NjRBcnJheShzaXplICogc2l6ZSk7XG4gICAgICAgIHRoaXMuZiA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSk7XG4gICAgICAgIHRoaXMueiA9IG5ldyBGbG9hdDY0QXJyYXkoc2l6ZSArIDEpO1xuICAgICAgICB0aGlzLnYgPSBuZXcgVWludDE2QXJyYXkoc2l6ZSk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNhbnZhcyhzaXplKSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIGNhbnZhcztcbiAgICB9XG5cbiAgICBkcmF3KGNoYXIpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgd2lkdGg6IGdseXBoQWR2YW5jZSxcbiAgICAgICAgICAgIGFjdHVhbEJvdW5kaW5nQm94QXNjZW50LFxuICAgICAgICAgICAgYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50LFxuICAgICAgICAgICAgYWN0dWFsQm91bmRpbmdCb3hMZWZ0LFxuICAgICAgICAgICAgYWN0dWFsQm91bmRpbmdCb3hSaWdodFxuICAgICAgICB9ID0gdGhpcy5jdHgubWVhc3VyZVRleHQoY2hhcik7XG5cbiAgICAgICAgLy8gVGhlIGludGVnZXIvcGl4ZWwgcGFydCBvZiB0aGUgdG9wIGFsaWdubWVudCBpcyBlbmNvZGVkIGluIG1ldHJpY3MuZ2x5cGhUb3BcbiAgICAgICAgLy8gVGhlIHJlbWFpbmRlciBpcyBpbXBsaWNpdGx5IGVuY29kZWQgaW4gdGhlIHJhc3Rlcml6YXRpb25cbiAgICAgICAgY29uc3QgZ2x5cGhUb3AgPSBNYXRoLmZsb29yKGFjdHVhbEJvdW5kaW5nQm94QXNjZW50KTtcbiAgICAgICAgY29uc3QgZ2x5cGhMZWZ0ID0gMDtcblxuICAgICAgICAvLyBJZiB0aGUgZ2x5cGggb3ZlcmZsb3dzIHRoZSBjYW52YXMgc2l6ZSwgaXQgd2lsbCBiZSBjbGlwcGVkIGF0IHRoZSBib3R0b20vcmlnaHRcbiAgICAgICAgY29uc3QgZ2x5cGhXaWR0aCA9IE1hdGgubWluKHRoaXMuc2l6ZSAtIHRoaXMuYnVmZmVyLCBNYXRoLmNlaWwoYWN0dWFsQm91bmRpbmdCb3hSaWdodCAtIGFjdHVhbEJvdW5kaW5nQm94TGVmdCkpO1xuICAgICAgICBjb25zdCBnbHlwaEhlaWdodCA9IE1hdGgubWluKHRoaXMuc2l6ZSAtIHRoaXMuYnVmZmVyLCBNYXRoLmNlaWwoYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQpICsgTWF0aC5jZWlsKGFjdHVhbEJvdW5kaW5nQm94RGVzY2VudCkpO1xuXG4gICAgICAgIGNvbnN0IHdpZHRoID0gZ2x5cGhXaWR0aCArIDIgKiB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gZ2x5cGhIZWlnaHQgKyAyICogdGhpcy5idWZmZXI7XG5cbiAgICAgICAgY29uc3QgbGVuID0gd2lkdGggKiBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobGVuKTtcbiAgICAgICAgY29uc3QgZ2x5cGggPSB7ZGF0YSwgd2lkdGgsIGhlaWdodCwgZ2x5cGhXaWR0aCwgZ2x5cGhIZWlnaHQsIGdseXBoVG9wLCBnbHlwaExlZnQsIGdseXBoQWR2YW5jZX07XG4gICAgICAgIGlmIChnbHlwaFdpZHRoID09PSAwIHx8IGdseXBoSGVpZ2h0ID09PSAwKSByZXR1cm4gZ2x5cGg7XG5cbiAgICAgICAgY29uc3Qge2N0eCwgYnVmZmVyLCBncmlkSW5uZXIsIGdyaWRPdXRlcn0gPSB0aGlzO1xuICAgICAgICBjdHguY2xlYXJSZWN0KGJ1ZmZlciwgYnVmZmVyLCBnbHlwaFdpZHRoLCBnbHlwaEhlaWdodCk7XG4gICAgICAgIGN0eC5maWxsVGV4dChjaGFyLCBidWZmZXIsIGJ1ZmZlciArIGdseXBoVG9wICsgMSk7XG4gICAgICAgIGNvbnN0IGltZ0RhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKGJ1ZmZlciwgYnVmZmVyLCBnbHlwaFdpZHRoLCBnbHlwaEhlaWdodCk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBncmlkcyBvdXRzaWRlIHRoZSBnbHlwaCByYW5nZSB0byBhbHBoYSAwXG4gICAgICAgIGdyaWRPdXRlci5maWxsKElORiwgMCwgbGVuKTtcbiAgICAgICAgZ3JpZElubmVyLmZpbGwoMCwgMCwgbGVuKTtcblxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGdseXBoSGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgZ2x5cGhXaWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYSA9IGltZ0RhdGEuZGF0YVs0ICogKHkgKiBnbHlwaFdpZHRoICsgeCkgKyAzXSAvIDI1NTsgLy8gYWxwaGEgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAoYSA9PT0gMCkgY29udGludWU7IC8vIGVtcHR5IHBpeGVsc1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaiA9ICh5ICsgYnVmZmVyKSAqIHdpZHRoICsgeCArIGJ1ZmZlcjtcblxuICAgICAgICAgICAgICAgIGlmIChhID09PSAxKSB7IC8vIGZ1bGx5IGRyYXduIHBpeGVsc1xuICAgICAgICAgICAgICAgICAgICBncmlkT3V0ZXJbal0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBncmlkSW5uZXJbal0gPSBJTkY7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBhbGlhc2VkIHBpeGVsc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkID0gMC41IC0gYTtcbiAgICAgICAgICAgICAgICAgICAgZ3JpZE91dGVyW2pdID0gZCA+IDAgPyBkICogZCA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGdyaWRJbm5lcltqXSA9IGQgPCAwID8gZCAqIGQgOiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVkdChncmlkT3V0ZXIsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCB0aGlzLmYsIHRoaXMudiwgdGhpcy56KTtcbiAgICAgICAgZWR0KGdyaWRJbm5lciwgYnVmZmVyLCBidWZmZXIsIGdseXBoV2lkdGgsIGdseXBoSGVpZ2h0LCB3aWR0aCwgdGhpcy5mLCB0aGlzLnYsIHRoaXMueik7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZCA9IE1hdGguc3FydChncmlkT3V0ZXJbaV0pIC0gTWF0aC5zcXJ0KGdyaWRJbm5lcltpXSk7XG4gICAgICAgICAgICBkYXRhW2ldID0gTWF0aC5yb3VuZCgyNTUgLSAyNTUgKiAoZCAvIHRoaXMucmFkaXVzICsgdGhpcy5jdXRvZmYpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnbHlwaDtcbiAgICB9XG59XG5cbi8vIDJEIEV1Y2xpZGVhbiBzcXVhcmVkIGRpc3RhbmNlIHRyYW5zZm9ybSBieSBGZWx6ZW5zendhbGIgJiBIdXR0ZW5sb2NoZXIgaHR0cHM6Ly9jcy5icm93bi5lZHUvfnBmZi9wYXBlcnMvZHQtZmluYWwucGRmXG5mdW5jdGlvbiBlZHQoZGF0YSwgeDAsIHkwLCB3aWR0aCwgaGVpZ2h0LCBncmlkU2l6ZSwgZiwgdiwgeikge1xuICAgIGZvciAobGV0IHggPSB4MDsgeCA8IHgwICsgd2lkdGg7IHgrKykgZWR0MWQoZGF0YSwgeTAgKiBncmlkU2l6ZSArIHgsIGdyaWRTaXplLCBoZWlnaHQsIGYsIHYsIHopO1xuICAgIGZvciAobGV0IHkgPSB5MDsgeSA8IHkwICsgaGVpZ2h0OyB5KyspIGVkdDFkKGRhdGEsIHkgKiBncmlkU2l6ZSArIHgwLCAxLCB3aWR0aCwgZiwgdiwgeik7XG59XG5cbi8vIDFEIHNxdWFyZWQgZGlzdGFuY2UgdHJhbnNmb3JtXG5mdW5jdGlvbiBlZHQxZChncmlkLCBvZmZzZXQsIHN0cmlkZSwgbGVuZ3RoLCBmLCB2LCB6KSB7XG4gICAgdlswXSA9IDA7XG4gICAgelswXSA9IC1JTkY7XG4gICAgelsxXSA9IElORjtcbiAgICBmWzBdID0gZ3JpZFtvZmZzZXRdO1xuXG4gICAgZm9yIChsZXQgcSA9IDEsIGsgPSAwLCBzID0gMDsgcSA8IGxlbmd0aDsgcSsrKSB7XG4gICAgICAgIGZbcV0gPSBncmlkW29mZnNldCArIHEgKiBzdHJpZGVdO1xuICAgICAgICBjb25zdCBxMiA9IHEgKiBxO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjb25zdCByID0gdltrXTtcbiAgICAgICAgICAgIHMgPSAoZltxXSAtIGZbcl0gKyBxMiAtIHIgKiByKSAvIChxIC0gcikgLyAyO1xuICAgICAgICB9IHdoaWxlIChzIDw9IHpba10gJiYgLS1rID4gLTEpO1xuXG4gICAgICAgIGsrKztcbiAgICAgICAgdltrXSA9IHE7XG4gICAgICAgIHpba10gPSBzO1xuICAgICAgICB6W2sgKyAxXSA9IElORjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBxID0gMCwgayA9IDA7IHEgPCBsZW5ndGg7IHErKykge1xuICAgICAgICB3aGlsZSAoeltrICsgMV0gPCBxKSBrKys7XG4gICAgICAgIGNvbnN0IHIgPSB2W2tdO1xuICAgICAgICBjb25zdCBxciA9IHEgLSByO1xuICAgICAgICBncmlkW29mZnNldCArIHEgKiBzdHJpZGVdID0gZltyXSArIHFyICogcXI7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGxvYWRHbHlwaFJhbmdlIGZyb20gJy4uL3N0eWxlL2xvYWRfZ2x5cGhfcmFuZ2UuanMnO1xuXG5pbXBvcnQgVGlueVNERiBmcm9tICdAbWFwYm94L3Rpbnktc2RmJztcbmltcG9ydCBpc0NoYXIgZnJvbSAnLi4vdXRpbC9pc19jaGFyX2luX3VuaWNvZGVfYmxvY2suanMnO1xuaW1wb3J0IHthc3luY0FsbH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7QWxwaGFJbWFnZX0gZnJvbSAnLi4vdXRpbC9pbWFnZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZUdseXBofSBmcm9tICcuLi9zdHlsZS9zdHlsZV9nbHlwaC5qcyc7XG5pbXBvcnQgdHlwZSB7UmVxdWVzdE1hbmFnZXJ9IGZyb20gJy4uL3V0aWwvbWFwYm94LmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuXG4vKlxuICBTREZfU0NBTEUgY29udHJvbHMgdGhlIHBpeGVsIGRlbnNpdHkgb2YgbG9jYWxseSBnZW5lcmF0ZWQgZ2x5cGhzIHJlbGF0aXZlXG4gIHRvIFwibm9ybWFsXCIgU0RGcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGF0IDI0cHQgZm9udCBhbmQgYSBcInBpeGVsIHJhdGlvXCIgb2YgMS5cbiAgVGhlIEdseXBoTWFuYWdlciB3aWxsIGdlbmVyYXRlIGdseXBocyBTREZfU0NBTEUgdGltZXMgYXMgbGFyZ2UsXG4gIGJ1dCB3aXRoIHRoZSBzYW1lIGdseXBoIG1ldHJpY3MsIGFuZCB0aGUgcXVhZCBnZW5lcmF0aW9uIGNvZGUgd2lsbCBzY2FsZSB0aGVtXG4gIGJhY2sgZG93biBzbyB0aGV5IGRpc3BsYXkgYXQgdGhlIHNhbWUgc2l6ZS5cblxuICBUaGUgY2hvaWNlIG9mIFNERl9TQ0FMRSBpcyBhIHRyYWRlLW9mZiBiZXR3ZWVuIHBlcmZvcm1hbmNlIGFuZCBxdWFsaXR5LlxuICBHbHlwaCBnZW5lcmF0aW9uIHRpbWUgZ3Jvd3MgcXVhZHJhdGljYWxseSB3aXRoIHRoZSB0aGUgc2NhbGUsIHdoaWxlIHF1YWxpdHlcbiAgaW1wcm92ZW1lbnRzIGRyb3Agb2ZmIHJhcGlkbHkgd2hlbiB0aGUgc2NhbGUgaXMgaGlnaGVyIHRoYW4gdGhlIHBpeGVsIHJhdGlvXG4gIG9mIHRoZSBkZXZpY2UuIFRoZSBzY2FsZSBvZiAyIGJ1eXMgbm90aWNlYWJsZSBpbXByb3ZlbWVudHMgb24gSERQSSBzY3JlZW5zXG4gIGF0IGFjY2VwdGFibGUgY29zdC5cblxuICBUaGUgc2NhbGUgY2FuIGJlIGFueSB2YWx1ZSwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIHNtYWxsIGRpc3RvcnRpb25zLCB0aGVzZVxuICBwaXhlbC1iYXNlZCB2YWx1ZXMgbXVzdCBjb21lIG91dCB0byBpbnRlZ2VyczpcbiAgIC0gXCJsb2NhbEdseXBoUGFkZGluZ1wiIGluIEdseXBoQXRsYXNcbiAgIC0gRm9udC9DYW52YXMvQnVmZmVyIHNpemUgZm9yIFRpbnlTREZcbiAgbG9jYWxHbHlwaFBhZGRpbmcgKyBidWZmZXIgc2hvdWxkIGVxdWFsIDQgKiBTREZfU0NBTEUuIFNvIGlmIHlvdSB3YW50ZWQgdG9cbiAgdXNlIGFuIFNERl9TQ0FMRSBvZiAxLjc1LCB5b3UgY291bGQgbWFudWFsbHkgc2V0IGxvY2FsR2x5cGhBZGRpbmcgdG8gMiBhbmRcbiAgYnVmZmVyIHRvIDUuXG4qL1xuZXhwb3J0IGNvbnN0IFNERl9TQ0FMRSA9IDI7XG5cbnR5cGUgRW50cnkgPSB7XG4gICAgLy8gbnVsbCBtZWFucyB3ZSd2ZSByZXF1ZXN0ZWQgdGhlIHJhbmdlLCBidXQgdGhlIGdseXBoIHdhc24ndCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LlxuICAgIGdseXBoczoge1tpZDogbnVtYmVyXTogU3R5bGVHbHlwaCB8IG51bGx9LFxuICAgIHJlcXVlc3RzOiB7W3JhbmdlOiBudW1iZXJdOiBBcnJheTxDYWxsYmFjazx7Z2x5cGhzOiB7W251bWJlcl06IFN0eWxlR2x5cGggfCBudWxsfSwgYXNjZW5kZXI/OiBudW1iZXIsIGRlc2NlbmRlcj86IG51bWJlcn0+Pn0sXG4gICAgcmFuZ2VzOiB7W3JhbmdlOiBudW1iZXJdOiBib29sZWFuIHwgbnVsbH0sXG4gICAgdGlueVNERj86IFRpbnlTREYsXG4gICAgYXNjZW5kZXI/OiBudW1iZXIsXG4gICAgZGVzY2VuZGVyPzogbnVtYmVyXG59O1xuXG5leHBvcnQgY29uc3QgTG9jYWxHbHlwaE1vZGUgPSB7XG4gICAgbm9uZTogMCxcbiAgICBpZGVvZ3JhcGhzOiAxLFxuICAgIGFsbDogMlxufTtcblxuY2xhc3MgR2x5cGhNYW5hZ2VyIHtcbiAgICByZXF1ZXN0TWFuYWdlcjogUmVxdWVzdE1hbmFnZXI7XG4gICAgbG9jYWxGb250RmFtaWx5OiA/c3RyaW5nO1xuICAgIGxvY2FsR2x5cGhNb2RlOiBudW1iZXI7XG4gICAgZW50cmllczoge1tfOiBzdHJpbmddOiBFbnRyeX07XG4gICAgLy8gTXVsdGlwbGUgZm9udHN0YWNrcyBtYXkgc2hhcmUgdGhlIHNhbWUgbG9jYWwgZ2x5cGhzLCBzbyBrZWVwIGFuIGluZGV4XG4gICAgLy8gaW50byB0aGUgZ2x5cGhzIGJhc2VkIHNvbGV5IG9uIGZvbnQgd2VpZ2h0XG4gICAgbG9jYWxHbHlwaHM6IHtbXzogc3RyaW5nXToge2dseXBoczoge1tpZDogbnVtYmVyXTogU3R5bGVHbHlwaCB8IG51bGx9LCBhc2NlbmRlcjogP251bWJlciwgZGVzY2VuZGVyOiA/bnVtYmVyfX07XG4gICAgdXJsOiA/c3RyaW5nO1xuXG4gICAgLy8gZXhwb3NlZCBhcyBzdGF0aWNzIHRvIGVuYWJsZSBzdHViYmluZyBpbiB1bml0IHRlc3RzXG4gICAgc3RhdGljIGxvYWRHbHlwaFJhbmdlOiB0eXBlb2YgbG9hZEdseXBoUmFuZ2U7XG4gICAgc3RhdGljIFRpbnlTREY6IENsYXNzPFRpbnlTREY+O1xuXG4gICAgY29uc3RydWN0b3IocmVxdWVzdE1hbmFnZXI6IFJlcXVlc3RNYW5hZ2VyLCBsb2NhbEdseXBoTW9kZTogbnVtYmVyLCBsb2NhbEZvbnRGYW1pbHk6ID9zdHJpbmcpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0TWFuYWdlciA9IHJlcXVlc3RNYW5hZ2VyO1xuICAgICAgICB0aGlzLmxvY2FsR2x5cGhNb2RlID0gbG9jYWxHbHlwaE1vZGU7XG4gICAgICAgIHRoaXMubG9jYWxGb250RmFtaWx5ID0gbG9jYWxGb250RmFtaWx5O1xuICAgICAgICB0aGlzLmVudHJpZXMgPSB7fTtcbiAgICAgICAgdGhpcy5sb2NhbEdseXBocyA9IHtcbiAgICAgICAgICAgIC8vIE9ubHkgdGhlc2UgZm91ciBmb250IHdlaWdodHMgYXJlIHN1cHBvcnRlZFxuICAgICAgICAgICAgJzIwMCc6IHt9LFxuICAgICAgICAgICAgJzQwMCc6IHt9LFxuICAgICAgICAgICAgJzUwMCc6IHt9LFxuICAgICAgICAgICAgJzkwMCc6IHt9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc2V0VVJMKHVybDogP3N0cmluZykge1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICB9XG5cbiAgICBnZXRHbHlwaHMoZ2x5cGhzOiB7W3N0YWNrOiBzdHJpbmddOiBBcnJheTxudW1iZXI+fSwgY2FsbGJhY2s6IENhbGxiYWNrPHtbc3RhY2s6IHN0cmluZ106IHtnbHlwaHM6IHtbXzogbnVtYmVyXTogP1N0eWxlR2x5cGh9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfX0+KSB7XG4gICAgICAgIGNvbnN0IGFsbCA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RhY2sgaW4gZ2x5cGhzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGdseXBoc1tzdGFja10pIHtcbiAgICAgICAgICAgICAgICBhbGwucHVzaCh7c3RhY2ssIGlkfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhc3luY0FsbChhbGwsICh7c3RhY2ssIGlkfSwgZm5DYWxsYmFjazogQ2FsbGJhY2s8e3N0YWNrOiBzdHJpbmcsIGlkOiBudW1iZXIsIGdseXBoOiA/U3R5bGVHbHlwaH0+KSA9PiB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSB0aGlzLmVudHJpZXNbc3RhY2tdO1xuICAgICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5lbnRyaWVzW3N0YWNrXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHM6IHt9LFxuICAgICAgICAgICAgICAgICAgICByYW5nZXM6IHt9LFxuICAgICAgICAgICAgICAgICAgICBhc2NlbmRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBkZXNjZW5kZXI6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBnbHlwaCA9IGVudHJ5LmdseXBoc1tpZF07XG4gICAgICAgICAgICBpZiAoZ2x5cGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2sobnVsbCwge3N0YWNrLCBpZCwgZ2x5cGh9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdseXBoID0gdGhpcy5fdGlueVNERihlbnRyeSwgc3RhY2ssIGlkKTtcbiAgICAgICAgICAgIGlmIChnbHlwaCkge1xuICAgICAgICAgICAgICAgIGVudHJ5LmdseXBoc1tpZF0gPSBnbHlwaDtcbiAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKG51bGwsIHtzdGFjaywgaWQsIGdseXBofSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IE1hdGguZmxvb3IoaWQgLyAyNTYpO1xuICAgICAgICAgICAgaWYgKHJhbmdlICogMjU2ID4gNjU1MzUpIHtcbiAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKG5ldyBFcnJvcignZ2x5cGhzID4gNjU1MzUgbm90IHN1cHBvcnRlZCcpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbnRyeS5yYW5nZXNbcmFuZ2VdKSB7XG4gICAgICAgICAgICAgICAgZm5DYWxsYmFjayhudWxsLCB7c3RhY2ssIGlkLCBnbHlwaH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJlcXVlc3RzID0gZW50cnkucmVxdWVzdHNbcmFuZ2VdO1xuICAgICAgICAgICAgaWYgKCFyZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RzID0gZW50cnkucmVxdWVzdHNbcmFuZ2VdID0gW107XG4gICAgICAgICAgICAgICAgR2x5cGhNYW5hZ2VyLmxvYWRHbHlwaFJhbmdlKHN0YWNrLCByYW5nZSwgKHRoaXMudXJsOiBhbnkpLCB0aGlzLnJlcXVlc3RNYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICAoZXJyLCByZXNwb25zZTogP3tnbHlwaHM6IHtbXzogbnVtYmVyXTogU3R5bGVHbHlwaCB8IG51bGx9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuYXNjZW5kZXIgPSByZXNwb25zZS5hc2NlbmRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5kZXNjZW5kZXIgPSByZXNwb25zZS5kZXNjZW5kZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiByZXNwb25zZS5nbHlwaHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9kb2VzQ2hhclN1cHBvcnRMb2NhbEdseXBoKCtpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdseXBoc1sraWRdID0gcmVzcG9uc2UuZ2x5cGhzWytpZF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucmFuZ2VzW3JhbmdlXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNiIG9mIHJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IoZXJyLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZW50cnkucmVxdWVzdHNbcmFuZ2VdO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVxdWVzdHMucHVzaCgoZXJyLCByZXN1bHQ6ID97Z2x5cGhzOiB7W186IG51bWJlcl06IFN0eWxlR2x5cGggfCBudWxsfSwgYXNjZW5kZXI/OiBudW1iZXIsIGRlc2NlbmRlcj86IG51bWJlcn0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKG51bGwsIHtzdGFjaywgaWQsIGdseXBoOiByZXN1bHQuZ2x5cGhzW2lkXSB8fCBudWxsfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIChlcnIsIGdseXBoczogP0FycmF5PHtzdGFjazogc3RyaW5nLCBpZDogbnVtYmVyLCBnbHlwaDogP1N0eWxlR2x5cGh9PikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGdseXBocykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB7c3RhY2ssIGlkLCBnbHlwaH0gb2YgZ2x5cGhzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBnbHlwaCBzbyB0aGF0IG91ciBvd24gY29weSBvZiBpdHMgQXJyYXlCdWZmZXIgZG9lc24ndCBnZXQgdHJhbnNmZXJyZWQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRbc3RhY2tdID09PSB1bmRlZmluZWQpIHJlc3VsdFtzdGFja10gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFtzdGFja10uZ2x5cGhzID09PSB1bmRlZmluZWQpIHJlc3VsdFtzdGFja10uZ2x5cGhzID0ge307XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtzdGFja10uZ2x5cGhzW2lkXSA9IGdseXBoICYmIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBnbHlwaC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcDogZ2x5cGguYml0bWFwLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzOiBnbHlwaC5tZXRyaWNzXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtzdGFja10uYXNjZW5kZXIgPSB0aGlzLmVudHJpZXNbc3RhY2tdLmFzY2VuZGVyO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbc3RhY2tdLmRlc2NlbmRlciA9IHRoaXMuZW50cmllc1tzdGFja10uZGVzY2VuZGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9kb2VzQ2hhclN1cHBvcnRMb2NhbEdseXBoKGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxHbHlwaE1vZGUgPT09IExvY2FsR2x5cGhNb2RlLm5vbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxvY2FsR2x5cGhNb2RlID09PSBMb2NhbEdseXBoTW9kZS5hbGwpIHtcbiAgICAgICAgICAgIHJldHVybiAhIXRoaXMubG9jYWxGb250RmFtaWx5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbmV3LWNhcCAqL1xuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5sb2NhbEZvbnRGYW1pbHkgJiZcbiAgICAgICAgICAgIChpc0NoYXJbJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnXShpZCkgfHxcbiAgICAgICAgICAgICAgICBpc0NoYXJbJ0hhbmd1bCBTeWxsYWJsZXMnXShpZCkgfHxcbiAgICAgICAgICAgICAgICBpc0NoYXJbJ0hpcmFnYW5hJ10oaWQpIHx8XG4gICAgICAgICAgICAgICAgaXNDaGFyWydLYXRha2FuYSddKGlkKSkgfHxcbiAgICAgICAgICAgICAgICAvLyBnbC1uYXRpdmUgcGFyaXR5OiBFeHRlbmQgSWRlb2dyYXBocyByYXN0ZXJpemF0aW9uIHJhbmdlIHRvIGluY2x1ZGUgQ0pLIHN5bWJvbHMgYW5kIHB1bmN0dWF0aW9uc1xuICAgICAgICAgICAgICAgIGlzQ2hhclsnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJ10oaWQpO1xuICAgICAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuZXctY2FwICovXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdGlueVNERihlbnRyeTogRW50cnksIHN0YWNrOiBzdHJpbmcsIGlkOiBudW1iZXIpOiA/U3R5bGVHbHlwaCB7XG4gICAgICAgIGNvbnN0IGZvbnRGYW1pbHkgPSB0aGlzLmxvY2FsRm9udEZhbWlseTtcbiAgICAgICAgaWYgKCFmb250RmFtaWx5IHx8ICF0aGlzLl9kb2VzQ2hhclN1cHBvcnRMb2NhbEdseXBoKGlkKSkgcmV0dXJuO1xuXG4gICAgICAgIGxldCB0aW55U0RGID0gZW50cnkudGlueVNERjtcbiAgICAgICAgaWYgKCF0aW55U0RGKSB7XG4gICAgICAgICAgICBsZXQgZm9udFdlaWdodCA9ICc0MDAnO1xuICAgICAgICAgICAgaWYgKC9ib2xkL2kudGVzdChzdGFjaykpIHtcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0ID0gJzkwMCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9tZWRpdW0vaS50ZXN0KHN0YWNrKSkge1xuICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQgPSAnNTAwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoL2xpZ2h0L2kudGVzdChzdGFjaykpIHtcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0ID0gJzIwMCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZvbnRTaXplID0gMjQgKiBTREZfU0NBTEU7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSAzICogU0RGX1NDQUxFO1xuICAgICAgICAgICAgY29uc3QgcmFkaXVzID0gOCAqIFNERl9TQ0FMRTtcbiAgICAgICAgICAgIHRpbnlTREYgPSBlbnRyeS50aW55U0RGID0gbmV3IEdseXBoTWFuYWdlci5UaW55U0RGKHtmb250RmFtaWx5LCBmb250V2VpZ2h0LCBmb250U2l6ZSwgYnVmZmVyLCByYWRpdXN9KTtcbiAgICAgICAgICAgIHRpbnlTREYuZm9udFdlaWdodCA9IGZvbnRXZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sb2NhbEdseXBoc1t0aW55U0RGLmZvbnRXZWlnaHRdW2lkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxHbHlwaHNbdGlueVNERi5mb250V2VpZ2h0XVtpZF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGFyID0gU3RyaW5nLmZyb21DaGFyQ29kZShpZCk7XG4gICAgICAgIGNvbnN0IHtkYXRhLCB3aWR0aCwgaGVpZ2h0LCBnbHlwaFdpZHRoLCBnbHlwaEhlaWdodCwgZ2x5cGhMZWZ0LCBnbHlwaFRvcCwgZ2x5cGhBZHZhbmNlfSA9IHRpbnlTREYuZHJhdyhjaGFyKTtcbiAgICAgICAgLypcbiAgICAgICAgVGlueVNERidzIFwidG9wXCIgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGFscGhhYmV0aWMgYmFzZWxpbmUgdG8gdGhlXG4gICAgICAgICB0b3Agb2YgdGhlIGdseXBoLlxuXG4gICAgICAgIFNlcnZlci1nZW5lcmF0ZWQgZm9udHMgc3BlY2lmeSBcInRvcFwiIHJlbGF0aXZlIHRvIGFuIG9yaWdpbiBhYm92ZSB0aGVcbiAgICAgICAgIGVtIGJveCAodGhlIG9yaWdpbiBjb21lcyBmcm9tIEZyZWVUeXBlLCBidXQgSSdtIHVuY2xlYXIgb24gZXhhY3RseVxuICAgICAgICAgaG93IGl0J3MgZGVyaXZlZClcbiAgICAgICAgICByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvc2RmLWdseXBoLWZvdW5kcnlcblxuICAgICAgICBTZXJ2ZXIgZm9udHMgZG9uJ3QgeWV0IGluY2x1ZGUgYmFzZWxpbmUgaW5mb3JtYXRpb24sIHNvIHdlIGNhbid0IGxpbmVcbiAgICAgICAgdXAgZXhhY3RseSB3aXRoIHRoZW0gKGFuZCB0aGV5IGRvbid0IGxpbmUgdXAgd2l0aCBlYWNoIG90aGVyKVxuICAgICAgICAgIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9ub2RlLWZvbnRuaWsvcHVsbC8xNjBcblxuICAgICAgICBUbyBhcHByb3hpbWF0ZWx5IGFsaWduIFRpbnlTREYgZ2x5cGhzIHdpdGggc2VydmVyLXByb3ZpZGVkIGdseXBocywgd2VcbiAgICAgICAgdXNlIHRoaXMgYmFzZWxpbmUgYWRqdXN0bWVudCBmYWN0b3IgY2FsaWJyYXRlZCB0byBiZSBpbiBiZXR3ZWVuIERJTiBQcm9cbiAgICAgICAgYW5kIEFyaWFsIFVuaWNvZGUgKGJ1dCBjbG9zZXIgdG8gQXJpYWwgVW5pY29kZSlcbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgYmFzZWxpbmVBZGp1c3RtZW50ID0gMjc7XG5cbiAgICAgICAgY29uc3QgZ2x5cGggPSB0aGlzLmxvY2FsR2x5cGhzW3RpbnlTREYuZm9udFdlaWdodF1baWRdID0ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBiaXRtYXA6IG5ldyBBbHBoYUltYWdlKHt3aWR0aCwgaGVpZ2h0fSwgZGF0YSksXG4gICAgICAgICAgICBtZXRyaWNzOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGdseXBoV2lkdGggLyBTREZfU0NBTEUsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBnbHlwaEhlaWdodCAvIFNERl9TQ0FMRSxcbiAgICAgICAgICAgICAgICBsZWZ0OiBnbHlwaExlZnQgLyBTREZfU0NBTEUsXG4gICAgICAgICAgICAgICAgdG9wOiBnbHlwaFRvcCAvIFNERl9TQ0FMRSAtIGJhc2VsaW5lQWRqdXN0bWVudCxcbiAgICAgICAgICAgICAgICBhZHZhbmNlOiBnbHlwaEFkdmFuY2UgLyBTREZfU0NBTEUsXG4gICAgICAgICAgICAgICAgbG9jYWxHbHlwaDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZ2x5cGg7XG4gICAgfVxufVxuXG5HbHlwaE1hbmFnZXIubG9hZEdseXBoUmFuZ2UgPSBsb2FkR2x5cGhSYW5nZTtcbkdseXBoTWFuYWdlci5UaW55U0RGID0gVGlueVNERjtcblxuZXhwb3J0IGRlZmF1bHQgR2x5cGhNYW5hZ2VyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQge0dMWVBIX1BCRl9CT1JERVJ9IGZyb20gJy4uL3N0eWxlL3BhcnNlX2dseXBoX3BiZi5qcyc7XG5cbmltcG9ydCB0eXBlIEFuY2hvciBmcm9tICcuL2FuY2hvci5qcyc7XG5pbXBvcnQgdHlwZSB7UG9zaXRpb25lZEljb24sIFNoYXBpbmd9IGZyb20gJy4vc2hhcGluZy5qcyc7XG5pbXBvcnQge0lNQUdFX1BBRERJTkd9IGZyb20gJy4uL3JlbmRlci9pbWFnZV9hdGxhcy5qcyc7XG5pbXBvcnQge1NERl9TQ0FMRX0gZnJvbSAnLi4vcmVuZGVyL2dseXBoX21hbmFnZXIuanMnO1xuaW1wb3J0IHR5cGUgU3ltYm9sU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmV9IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZX0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfaW1hZ2UuanMnO1xuaW1wb3J0IHtpc1ZlcnRpY2FsQ2xvc2VQdW5jdHVhdGlvbiwgaXNWZXJ0aWNhbE9wZW5QdW5jdHVhdGlvbn0gZnJvbSAnLi4vdXRpbC92ZXJ0aWNhbGl6ZV9wdW5jdHVhdGlvbi5qcyc7XG5pbXBvcnQgT05FX0VNIGZyb20gJy4vb25lX2VtLmpzJztcbmltcG9ydCB7d2Fybk9uY2V9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5cbi8qKlxuICogQSB0ZXh0dXJlZCBxdWFkIGZvciByZW5kZXJpbmcgYSBzaW5nbGUgaWNvbiBvciBnbHlwaC5cbiAqXG4gKiBUaGUgem9vbSByYW5nZSB0aGUgZ2x5cGggY2FuIGJlIHNob3duIGlzIGRlZmluZWQgYnkgbWluU2NhbGUgYW5kIG1heFNjYWxlLlxuICpcbiAqIEBwYXJhbSB0bCBUaGUgb2Zmc2V0IG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIHRyIFRoZSBvZmZzZXQgb2YgdGhlIHRvcCByaWdodCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIGJsIFRoZSBvZmZzZXQgb2YgdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0gYnIgVGhlIG9mZnNldCBvZiB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0gdGV4IFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCB0eXBlIFN5bWJvbFF1YWQgPSB7XG4gICAgdGw6IFBvaW50LFxuICAgIHRyOiBQb2ludCxcbiAgICBibDogUG9pbnQsXG4gICAgYnI6IFBvaW50LFxuICAgIHRleDoge1xuICAgICAgICB4OiBudW1iZXIsXG4gICAgICAgIHk6IG51bWJlcixcbiAgICAgICAgdzogbnVtYmVyLFxuICAgICAgICBoOiBudW1iZXJcbiAgICB9LFxuICAgIHBpeGVsT2Zmc2V0VEw6IFBvaW50LFxuICAgIHBpeGVsT2Zmc2V0QlI6IFBvaW50LFxuICAgIHdyaXRpbmdNb2RlOiBhbnkgfCB2b2lkLFxuICAgIGdseXBoT2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIHNlY3Rpb25JbmRleDogbnVtYmVyLFxuICAgIGlzU0RGOiBib29sZWFuLFxuICAgIG1pbkZvbnRTY2FsZVg6IG51bWJlcixcbiAgICBtaW5Gb250U2NhbGVZOiBudW1iZXJcbn07XG5cbi8vIElmIHlvdSBoYXZlIGEgMTBweCBpY29uIHRoYXQgaXNuJ3QgcGVyZmVjdGx5IGFsaWduZWQgdG8gdGhlIHBpeGVsIGdyaWQgaXQgd2lsbCBjb3ZlciAxMSBhY3R1YWxcbi8vIHBpeGVscy4gVGhlIHF1YWQgbmVlZHMgdG8gYmUgcGFkZGVkIHRvIGFjY291bnQgZm9yIHRoaXMsIG90aGVyd2lzZSB0aGV5J2xsIGxvb2sgc2xpZ2h0bHkgY2xpcHBlZFxuLy8gb24gb25lIGVkZ2UgaW4gc29tZSBjYXNlcy5cbmNvbnN0IGJvcmRlciA9IElNQUdFX1BBRERJTkc7XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBxdWFkcyB1c2VkIGZvciByZW5kZXJpbmcgYW4gaWNvbi5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJY29uUXVhZHMoXG4gICAgICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogUG9zaXRpb25lZEljb24sXG4gICAgICAgICAgICAgICAgICAgICAgaWNvblJvdGF0ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgIGlzU0RGSWNvbjogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICBoYXNJY29uVGV4dEZpdDogYm9vbGVhbik6IEFycmF5PFN5bWJvbFF1YWQ+IHtcbiAgICBjb25zdCBxdWFkcyA9IFtdO1xuXG4gICAgY29uc3QgaW1hZ2UgPSBzaGFwZWRJY29uLmltYWdlO1xuICAgIGNvbnN0IHBpeGVsUmF0aW8gPSBpbWFnZS5waXhlbFJhdGlvO1xuICAgIGNvbnN0IGltYWdlV2lkdGggPSBpbWFnZS5wYWRkZWRSZWN0LncgLSAyICogYm9yZGVyO1xuICAgIGNvbnN0IGltYWdlSGVpZ2h0ID0gaW1hZ2UucGFkZGVkUmVjdC5oIC0gMiAqIGJvcmRlcjtcblxuICAgIGNvbnN0IGljb25XaWR0aCA9IHNoYXBlZEljb24ucmlnaHQgLSBzaGFwZWRJY29uLmxlZnQ7XG4gICAgY29uc3QgaWNvbkhlaWdodCA9IHNoYXBlZEljb24uYm90dG9tIC0gc2hhcGVkSWNvbi50b3A7XG5cbiAgICBjb25zdCBzdHJldGNoWCA9IGltYWdlLnN0cmV0Y2hYIHx8IFtbMCwgaW1hZ2VXaWR0aF1dO1xuICAgIGNvbnN0IHN0cmV0Y2hZID0gaW1hZ2Uuc3RyZXRjaFkgfHwgW1swLCBpbWFnZUhlaWdodF1dO1xuXG4gICAgY29uc3QgcmVkdWNlUmFuZ2VzID0gKHN1bSwgcmFuZ2UpID0+IHN1bSArIHJhbmdlWzFdIC0gcmFuZ2VbMF07XG4gICAgY29uc3Qgc3RyZXRjaFdpZHRoID0gc3RyZXRjaFgucmVkdWNlKHJlZHVjZVJhbmdlcywgMCk7XG4gICAgY29uc3Qgc3RyZXRjaEhlaWdodCA9IHN0cmV0Y2hZLnJlZHVjZShyZWR1Y2VSYW5nZXMsIDApO1xuICAgIGNvbnN0IGZpeGVkV2lkdGggPSBpbWFnZVdpZHRoIC0gc3RyZXRjaFdpZHRoO1xuICAgIGNvbnN0IGZpeGVkSGVpZ2h0ID0gaW1hZ2VIZWlnaHQgLSBzdHJldGNoSGVpZ2h0O1xuXG4gICAgbGV0IHN0cmV0Y2hPZmZzZXRYID0gMDtcbiAgICBsZXQgc3RyZXRjaENvbnRlbnRXaWR0aCA9IHN0cmV0Y2hXaWR0aDtcbiAgICBsZXQgc3RyZXRjaE9mZnNldFkgPSAwO1xuICAgIGxldCBzdHJldGNoQ29udGVudEhlaWdodCA9IHN0cmV0Y2hIZWlnaHQ7XG4gICAgbGV0IGZpeGVkT2Zmc2V0WCA9IDA7XG4gICAgbGV0IGZpeGVkQ29udGVudFdpZHRoID0gZml4ZWRXaWR0aDtcbiAgICBsZXQgZml4ZWRPZmZzZXRZID0gMDtcbiAgICBsZXQgZml4ZWRDb250ZW50SGVpZ2h0ID0gZml4ZWRIZWlnaHQ7XG5cbiAgICBpZiAoaW1hZ2UuY29udGVudCAmJiBoYXNJY29uVGV4dEZpdCkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gaW1hZ2UuY29udGVudDtcbiAgICAgICAgc3RyZXRjaE9mZnNldFggPSBzdW1XaXRoaW5SYW5nZShzdHJldGNoWCwgMCwgY29udGVudFswXSk7XG4gICAgICAgIHN0cmV0Y2hPZmZzZXRZID0gc3VtV2l0aGluUmFuZ2Uoc3RyZXRjaFksIDAsIGNvbnRlbnRbMV0pO1xuICAgICAgICBzdHJldGNoQ29udGVudFdpZHRoID0gc3VtV2l0aGluUmFuZ2Uoc3RyZXRjaFgsIGNvbnRlbnRbMF0sIGNvbnRlbnRbMl0pO1xuICAgICAgICBzdHJldGNoQ29udGVudEhlaWdodCA9IHN1bVdpdGhpblJhbmdlKHN0cmV0Y2hZLCBjb250ZW50WzFdLCBjb250ZW50WzNdKTtcbiAgICAgICAgZml4ZWRPZmZzZXRYID0gY29udGVudFswXSAtIHN0cmV0Y2hPZmZzZXRYO1xuICAgICAgICBmaXhlZE9mZnNldFkgPSBjb250ZW50WzFdIC0gc3RyZXRjaE9mZnNldFk7XG4gICAgICAgIGZpeGVkQ29udGVudFdpZHRoID0gY29udGVudFsyXSAtIGNvbnRlbnRbMF0gLSBzdHJldGNoQ29udGVudFdpZHRoO1xuICAgICAgICBmaXhlZENvbnRlbnRIZWlnaHQgPSBjb250ZW50WzNdIC0gY29udGVudFsxXSAtIHN0cmV0Y2hDb250ZW50SGVpZ2h0O1xuICAgIH1cblxuICAgIGNvbnN0IG1ha2VCb3ggPSAobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbGVmdEVtID0gZ2V0RW1PZmZzZXQobGVmdC5zdHJldGNoIC0gc3RyZXRjaE9mZnNldFgsIHN0cmV0Y2hDb250ZW50V2lkdGgsIGljb25XaWR0aCwgc2hhcGVkSWNvbi5sZWZ0KTtcbiAgICAgICAgY29uc3QgbGVmdFB4ID0gZ2V0UHhPZmZzZXQobGVmdC5maXhlZCAtIGZpeGVkT2Zmc2V0WCwgZml4ZWRDb250ZW50V2lkdGgsIGxlZnQuc3RyZXRjaCwgc3RyZXRjaFdpZHRoKTtcblxuICAgICAgICBjb25zdCB0b3BFbSA9IGdldEVtT2Zmc2V0KHRvcC5zdHJldGNoIC0gc3RyZXRjaE9mZnNldFksIHN0cmV0Y2hDb250ZW50SGVpZ2h0LCBpY29uSGVpZ2h0LCBzaGFwZWRJY29uLnRvcCk7XG4gICAgICAgIGNvbnN0IHRvcFB4ID0gZ2V0UHhPZmZzZXQodG9wLmZpeGVkIC0gZml4ZWRPZmZzZXRZLCBmaXhlZENvbnRlbnRIZWlnaHQsIHRvcC5zdHJldGNoLCBzdHJldGNoSGVpZ2h0KTtcblxuICAgICAgICBjb25zdCByaWdodEVtID0gZ2V0RW1PZmZzZXQocmlnaHQuc3RyZXRjaCAtIHN0cmV0Y2hPZmZzZXRYLCBzdHJldGNoQ29udGVudFdpZHRoLCBpY29uV2lkdGgsIHNoYXBlZEljb24ubGVmdCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0UHggPSBnZXRQeE9mZnNldChyaWdodC5maXhlZCAtIGZpeGVkT2Zmc2V0WCwgZml4ZWRDb250ZW50V2lkdGgsIHJpZ2h0LnN0cmV0Y2gsIHN0cmV0Y2hXaWR0aCk7XG5cbiAgICAgICAgY29uc3QgYm90dG9tRW0gPSBnZXRFbU9mZnNldChib3R0b20uc3RyZXRjaCAtIHN0cmV0Y2hPZmZzZXRZLCBzdHJldGNoQ29udGVudEhlaWdodCwgaWNvbkhlaWdodCwgc2hhcGVkSWNvbi50b3ApO1xuICAgICAgICBjb25zdCBib3R0b21QeCA9IGdldFB4T2Zmc2V0KGJvdHRvbS5maXhlZCAtIGZpeGVkT2Zmc2V0WSwgZml4ZWRDb250ZW50SGVpZ2h0LCBib3R0b20uc3RyZXRjaCwgc3RyZXRjaEhlaWdodCk7XG5cbiAgICAgICAgY29uc3QgdGwgPSBuZXcgUG9pbnQobGVmdEVtLCB0b3BFbSk7XG4gICAgICAgIGNvbnN0IHRyID0gbmV3IFBvaW50KHJpZ2h0RW0sIHRvcEVtKTtcbiAgICAgICAgY29uc3QgYnIgPSBuZXcgUG9pbnQocmlnaHRFbSwgYm90dG9tRW0pO1xuICAgICAgICBjb25zdCBibCA9IG5ldyBQb2ludChsZWZ0RW0sIGJvdHRvbUVtKTtcbiAgICAgICAgY29uc3QgcGl4ZWxPZmZzZXRUTCA9IG5ldyBQb2ludChsZWZ0UHggLyBwaXhlbFJhdGlvLCB0b3BQeCAvIHBpeGVsUmF0aW8pO1xuICAgICAgICBjb25zdCBwaXhlbE9mZnNldEJSID0gbmV3IFBvaW50KHJpZ2h0UHggLyBwaXhlbFJhdGlvLCBib3R0b21QeCAvIHBpeGVsUmF0aW8pO1xuXG4gICAgICAgIGNvbnN0IGFuZ2xlID0gaWNvblJvdGF0ZSAqIE1hdGguUEkgLyAxODA7XG5cbiAgICAgICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICAgICAgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgICAgIG1hdHJpeCA9IFtjb3MsIC1zaW4sIHNpbiwgY29zXTtcblxuICAgICAgICAgICAgdGwuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgIHRyLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgICAgICBibC5fbWF0TXVsdChtYXRyaXgpO1xuICAgICAgICAgICAgYnIuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHgxID0gbGVmdC5zdHJldGNoICsgbGVmdC5maXhlZDtcbiAgICAgICAgY29uc3QgeDIgPSByaWdodC5zdHJldGNoICsgcmlnaHQuZml4ZWQ7XG4gICAgICAgIGNvbnN0IHkxID0gdG9wLnN0cmV0Y2ggKyB0b3AuZml4ZWQ7XG4gICAgICAgIGNvbnN0IHkyID0gYm90dG9tLnN0cmV0Y2ggKyBib3R0b20uZml4ZWQ7XG5cbiAgICAgICAgY29uc3Qgc3ViUmVjdCA9IHtcbiAgICAgICAgICAgIHg6IGltYWdlLnBhZGRlZFJlY3QueCArIGJvcmRlciArIHgxLFxuICAgICAgICAgICAgeTogaW1hZ2UucGFkZGVkUmVjdC55ICsgYm9yZGVyICsgeTEsXG4gICAgICAgICAgICB3OiB4MiAtIHgxLFxuICAgICAgICAgICAgaDogeTIgLSB5MVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG1pbkZvbnRTY2FsZVggPSBmaXhlZENvbnRlbnRXaWR0aCAvIHBpeGVsUmF0aW8gLyBpY29uV2lkdGg7XG4gICAgICAgIGNvbnN0IG1pbkZvbnRTY2FsZVkgPSBmaXhlZENvbnRlbnRIZWlnaHQgLyBwaXhlbFJhdGlvIC8gaWNvbkhlaWdodDtcblxuICAgICAgICAvLyBJY29uIHF1YWQgaXMgcGFkZGVkLCBzbyB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFsc28gbmVlZCB0byBiZSBwYWRkZWQuXG4gICAgICAgIHJldHVybiB7dGwsIHRyLCBibCwgYnIsIHRleDogc3ViUmVjdCwgd3JpdGluZ01vZGU6IHVuZGVmaW5lZCwgZ2x5cGhPZmZzZXQ6IFswLCAwXSwgc2VjdGlvbkluZGV4OiAwLCBwaXhlbE9mZnNldFRMLCBwaXhlbE9mZnNldEJSLCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZLCBpc1NERjogaXNTREZJY29ufTtcbiAgICB9O1xuXG4gICAgaWYgKCFoYXNJY29uVGV4dEZpdCB8fCAoIWltYWdlLnN0cmV0Y2hYICYmICFpbWFnZS5zdHJldGNoWSkpIHtcbiAgICAgICAgcXVhZHMucHVzaChtYWtlQm94KFxuICAgICAgICAgICAge2ZpeGVkOiAwLCBzdHJldGNoOiAtMX0sXG4gICAgICAgICAgICB7Zml4ZWQ6IDAsIHN0cmV0Y2g6IC0xfSxcbiAgICAgICAgICAgIHtmaXhlZDogMCwgc3RyZXRjaDogaW1hZ2VXaWR0aCArIDF9LFxuICAgICAgICAgICAge2ZpeGVkOiAwLCBzdHJldGNoOiBpbWFnZUhlaWdodCArIDF9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeEN1dHMgPSBzdHJldGNoWm9uZXNUb0N1dHMoc3RyZXRjaFgsIGZpeGVkV2lkdGgsIHN0cmV0Y2hXaWR0aCk7XG4gICAgICAgIGNvbnN0IHlDdXRzID0gc3RyZXRjaFpvbmVzVG9DdXRzKHN0cmV0Y2hZLCBmaXhlZEhlaWdodCwgc3RyZXRjaEhlaWdodCk7XG5cbiAgICAgICAgZm9yIChsZXQgeGkgPSAwOyB4aSA8IHhDdXRzLmxlbmd0aCAtIDE7IHhpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHgxID0geEN1dHNbeGldO1xuICAgICAgICAgICAgY29uc3QgeDIgPSB4Q3V0c1t4aSArIDFdO1xuICAgICAgICAgICAgZm9yIChsZXQgeWkgPSAwOyB5aSA8IHlDdXRzLmxlbmd0aCAtIDE7IHlpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB5MSA9IHlDdXRzW3lpXTtcbiAgICAgICAgICAgICAgICBjb25zdCB5MiA9IHlDdXRzW3lpICsgMV07XG4gICAgICAgICAgICAgICAgcXVhZHMucHVzaChtYWtlQm94KHgxLCB5MSwgeDIsIHkyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVhZHM7XG59XG5cbmZ1bmN0aW9uIHN1bVdpdGhpblJhbmdlKHJhbmdlcywgbWluLCBtYXgpIHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGNvbnN0IHJhbmdlIG9mIHJhbmdlcykge1xuICAgICAgICBzdW0gKz0gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHJhbmdlWzFdKSkgLSBNYXRoLm1heChtaW4sIE1hdGgubWluKG1heCwgcmFuZ2VbMF0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cblxuZnVuY3Rpb24gc3RyZXRjaFpvbmVzVG9DdXRzKHN0cmV0Y2hab25lcywgZml4ZWRTaXplLCBzdHJldGNoU2l6ZSkge1xuICAgIGNvbnN0IGN1dHMgPSBbe2ZpeGVkOiAtYm9yZGVyLCBzdHJldGNoOiAwfV07XG5cbiAgICBmb3IgKGNvbnN0IFtjMSwgYzJdIG9mIHN0cmV0Y2hab25lcykge1xuICAgICAgICBjb25zdCBsYXN0ID0gY3V0c1tjdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjdXRzLnB1c2goe1xuICAgICAgICAgICAgZml4ZWQ6IGMxIC0gbGFzdC5zdHJldGNoLFxuICAgICAgICAgICAgc3RyZXRjaDogbGFzdC5zdHJldGNoXG4gICAgICAgIH0pO1xuICAgICAgICBjdXRzLnB1c2goe1xuICAgICAgICAgICAgZml4ZWQ6IGMxIC0gbGFzdC5zdHJldGNoLFxuICAgICAgICAgICAgc3RyZXRjaDogbGFzdC5zdHJldGNoICsgKGMyIC0gYzEpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjdXRzLnB1c2goe1xuICAgICAgICBmaXhlZDogZml4ZWRTaXplICsgYm9yZGVyLFxuICAgICAgICBzdHJldGNoOiBzdHJldGNoU2l6ZVxuICAgIH0pO1xuICAgIHJldHVybiBjdXRzO1xufVxuXG5mdW5jdGlvbiBnZXRFbU9mZnNldChzdHJldGNoT2Zmc2V0LCBzdHJldGNoU2l6ZSwgaWNvblNpemUsIGljb25PZmZzZXQpIHtcbiAgICByZXR1cm4gc3RyZXRjaE9mZnNldCAvIHN0cmV0Y2hTaXplICogaWNvblNpemUgKyBpY29uT2Zmc2V0O1xufVxuXG5mdW5jdGlvbiBnZXRQeE9mZnNldChmaXhlZE9mZnNldCwgZml4ZWRTaXplLCBzdHJldGNoT2Zmc2V0LCBzdHJldGNoU2l6ZSkge1xuICAgIHJldHVybiBmaXhlZE9mZnNldCAtIGZpeGVkU2l6ZSAqIHN0cmV0Y2hPZmZzZXQgLyBzdHJldGNoU2l6ZTtcbn1cblxuZnVuY3Rpb24gZ2V0Um90YXRlT2Zmc2V0KHRleHRPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCB4ID0gdGV4dE9mZnNldFswXSwgeSA9IHRleHRPZmZzZXRbMV07XG4gICAgY29uc3QgcHJvZHVjdCA9IHggKiB5O1xuICAgIGlmIChwcm9kdWN0ID4gMCkge1xuICAgICAgICByZXR1cm4gW3gsIC15XTtcbiAgICB9IGVsc2UgaWYgKHByb2R1Y3QgPCAwKSB7XG4gICAgICAgIHJldHVybiBbLXgsIHldO1xuICAgIH0gZWxzZSBpZiAoeCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW3ksIHhdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbeSwgLXhdO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWlkbGluZU9mZnNldChzaGFwaW5nLCBsaW5lSGVpZ2h0LCBwcmV2aW91c09mZnNldCwgbGluZUluZGV4KSB7XG4gICAgY29uc3QgY3VycmVudExpbmVIZWlnaHQgPSAobGluZUhlaWdodCArIHNoYXBpbmcucG9zaXRpb25lZExpbmVzW2xpbmVJbmRleF0ubGluZU9mZnNldCk7XG4gICAgaWYgKGxpbmVJbmRleCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcHJldmlvdXNPZmZzZXQgKyBjdXJyZW50TGluZUhlaWdodCAvIDIuMDtcbiAgICB9XG4gICAgY29uc3QgYWJvdmVMaW5lSGVpZ2h0ID0gKGxpbmVIZWlnaHQgKyBzaGFwaW5nLnBvc2l0aW9uZWRMaW5lc1tsaW5lSW5kZXggLSAxXS5saW5lT2Zmc2V0KTtcbiAgICByZXR1cm4gcHJldmlvdXNPZmZzZXQgKyAoY3VycmVudExpbmVIZWlnaHQgKyBhYm92ZUxpbmVIZWlnaHQpIC8gMi4wO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgcXVhZHMgdXNlZCBmb3IgcmVuZGVyaW5nIGEgdGV4dCBsYWJlbC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbHlwaFF1YWRzKGFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgICBzaGFwaW5nOiBTaGFwaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgICAgICBsYXllcjogU3ltYm9sU3R5bGVMYXllcixcbiAgICAgICAgICAgICAgICAgICAgICAgYWxvbmdMaW5lOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1hcDoge1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudDogYm9vbGVhbik6IEFycmF5PFN5bWJvbFF1YWQ+IHtcbiAgICBjb25zdCBxdWFkcyA9IFtdO1xuICAgIGlmIChzaGFwaW5nLnBvc2l0aW9uZWRMaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBxdWFkcztcblxuICAgIGNvbnN0IHRleHRSb3RhdGUgPSBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KSAqIE1hdGguUEkgLyAxODA7XG4gICAgY29uc3Qgcm90YXRlT2Zmc2V0ID0gZ2V0Um90YXRlT2Zmc2V0KHRleHRPZmZzZXQpO1xuXG4gICAgbGV0IHNoYXBpbmdIZWlnaHQgPSBNYXRoLmFicyhzaGFwaW5nLnRvcCAtIHNoYXBpbmcuYm90dG9tKTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2Ygc2hhcGluZy5wb3NpdGlvbmVkTGluZXMpIHtcbiAgICAgICAgc2hhcGluZ0hlaWdodCAtPSBsaW5lLmxpbmVPZmZzZXQ7XG4gICAgfVxuICAgIGNvbnN0IGxpbmVDb3VudHMgPSBzaGFwaW5nLnBvc2l0aW9uZWRMaW5lcy5sZW5ndGg7XG4gICAgY29uc3QgbGluZUhlaWdodCA9IHNoYXBpbmdIZWlnaHQgLyBsaW5lQ291bnRzO1xuICAgIGxldCBjdXJyZW50T2Zmc2V0ID0gc2hhcGluZy50b3AgLSB0ZXh0T2Zmc2V0WzFdO1xuICAgIGZvciAobGV0IGxpbmVJbmRleCA9IDA7IGxpbmVJbmRleCA8IGxpbmVDb3VudHM7ICsrbGluZUluZGV4KSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBzaGFwaW5nLnBvc2l0aW9uZWRMaW5lc1tsaW5lSW5kZXhdO1xuICAgICAgICBjdXJyZW50T2Zmc2V0ID0gZ2V0TWlkbGluZU9mZnNldChzaGFwaW5nLCBsaW5lSGVpZ2h0LCBjdXJyZW50T2Zmc2V0LCBsaW5lSW5kZXgpO1xuICAgICAgICBmb3IgKGNvbnN0IHBvc2l0aW9uZWRHbHlwaCBvZiBsaW5lLnBvc2l0aW9uZWRHbHlwaHMpIHtcbiAgICAgICAgICAgIGlmICghcG9zaXRpb25lZEdseXBoLnJlY3QpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdGV4dHVyZVJlY3QgPSBwb3NpdGlvbmVkR2x5cGgucmVjdCB8fCB7fTtcblxuICAgICAgICAgICAgLy8gVGhlIHJlY3RzIGhhdmUgYW4gYWRkaXRpb25hbCBidWZmZXIgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlaXIgc2l6ZS5cbiAgICAgICAgICAgIGNvbnN0IGdseXBoUGFkZGluZyA9IDEuMDtcbiAgICAgICAgICAgIGxldCByZWN0QnVmZmVyID0gR0xZUEhfUEJGX0JPUkRFUiArIGdseXBoUGFkZGluZztcbiAgICAgICAgICAgIGxldCBpc1NERiA9IHRydWU7XG4gICAgICAgICAgICBsZXQgcGl4ZWxSYXRpbyA9IDEuMDtcbiAgICAgICAgICAgIGxldCBsaW5lT2Zmc2V0ID0gMC4wO1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uZWRHbHlwaC5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGltYWdlTWFwW3Bvc2l0aW9uZWRHbHlwaC5pbWFnZU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghaW1hZ2UpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChpbWFnZS5zZGYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fybk9uY2UoXCJTREYgaW1hZ2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGZvcm1hdHRlZCB0ZXh0IGFuZCB3aWxsIGJlIGlnbm9yZWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNTREYgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBwaXhlbFJhdGlvID0gaW1hZ2UucGl4ZWxSYXRpbztcbiAgICAgICAgICAgICAgICByZWN0QnVmZmVyID0gSU1BR0VfUEFERElORyAvIHBpeGVsUmF0aW87XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvdGF0ZVZlcnRpY2FsR2x5cGggPSAoYWxvbmdMaW5lIHx8IGFsbG93VmVydGljYWxQbGFjZW1lbnQpICYmIHBvc2l0aW9uZWRHbHlwaC52ZXJ0aWNhbDtcbiAgICAgICAgICAgIGNvbnN0IGhhbGZBZHZhbmNlID0gcG9zaXRpb25lZEdseXBoLm1ldHJpY3MuYWR2YW5jZSAqIHBvc2l0aW9uZWRHbHlwaC5zY2FsZSAvIDI7XG4gICAgICAgICAgICBjb25zdCBtZXRyaWNzID0gcG9zaXRpb25lZEdseXBoLm1ldHJpY3M7XG4gICAgICAgICAgICBjb25zdCByZWN0ID0gcG9zaXRpb25lZEdseXBoLnJlY3Q7XG4gICAgICAgICAgICBpZiAocmVjdCA9PT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIEFsaWduIGltYWdlcyBhbmQgc2NhbGVkIGdseXBocyBpbiB0aGUgbWlkZGxlIG9mIGEgdmVydGljYWwgbGluZS5cbiAgICAgICAgICAgIGlmIChhbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIHNoYXBpbmcudmVydGljYWxpemFibGUpIHtcbiAgICAgICAgICAgICAgICAvLyBpbWFnZSdzIGFkdmFuY2UgZm9yIHZlcnRpY2FsIHNoYXBpbmcgaXMgaXRzIGhlaWdodCwgc28gdGhhdCB3ZSBoYXZlIHRvIHRha2UgdGhlIGRpZmZlcmVuY2UgaW50b1xuICAgICAgICAgICAgICAgIC8vIGFjY291bnQgYWZ0ZXIgaW1hZ2UgZ2x5cGggaXMgcm90YXRlZFxuICAgICAgICAgICAgICAgIGxpbmVPZmZzZXQgPSBwb3NpdGlvbmVkR2x5cGguaW1hZ2VOYW1lID8gaGFsZkFkdmFuY2UgLSBwb3NpdGlvbmVkR2x5cGgubWV0cmljcy53aWR0aCAqIHBvc2l0aW9uZWRHbHlwaC5zY2FsZSAvIDIuMCA6IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGdseXBoT2Zmc2V0ID0gYWxvbmdMaW5lID9cbiAgICAgICAgICAgICAgICBbcG9zaXRpb25lZEdseXBoLnggKyBoYWxmQWR2YW5jZSwgcG9zaXRpb25lZEdseXBoLnldIDpcbiAgICAgICAgICAgICAgICBbMCwgMF07XG5cbiAgICAgICAgICAgIGxldCBidWlsdEluT2Zmc2V0ID0gWzAsIDBdO1xuICAgICAgICAgICAgbGV0IHZlcnRpY2FsaXplZExhYmVsT2Zmc2V0ID0gWzAsIDBdO1xuICAgICAgICAgICAgbGV0IHVzZVJvdGF0ZU9mZnNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCFhbG9uZ0xpbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAocm90YXRlVmVydGljYWxHbHlwaCkge1xuICAgICAgICAgICAgICAgIC8vIFZlcnRpY2FsIFBPSSBsYWJlbHMgdGhhdCBhcmUgcm90YXRlZCA5MGRlZyBDVyBhbmQgd2hvc2UgZ2x5cGhzIG11c3QgcHJlc2VydmUgdXByaWdodCBvcmllbnRhdGlvblxuICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYmUgcm90YXRlZCA5MGRlZyBDQ1cuIEFmdGVyIGEgcXVhZCBpcyByb3RhdGVkLCBpdCBpcyB0cmFuc2xhdGVkIHRvIHRoZSBvcmlnaW5hbCBidWlsdC1pbiBvZmZzZXQuXG4gICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsaXplZExhYmVsT2Zmc2V0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtwb3NpdGlvbmVkR2x5cGgueCArIGhhbGZBZHZhbmNlICsgcm90YXRlT2Zmc2V0WzBdLCBwb3NpdGlvbmVkR2x5cGgueSArIHJvdGF0ZU9mZnNldFsxXSAtIGxpbmVPZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICB1c2VSb3RhdGVPZmZzZXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1aWx0SW5PZmZzZXQgPSAgW3Bvc2l0aW9uZWRHbHlwaC54ICsgaGFsZkFkdmFuY2UgKyB0ZXh0T2Zmc2V0WzBdLCBwb3NpdGlvbmVkR2x5cGgueSArIHRleHRPZmZzZXRbMV0gLSBsaW5lT2Zmc2V0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZGRlZFdpZHRoID1cbiAgICAgICAgICAgICAgICByZWN0LncgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgLyAocGl4ZWxSYXRpbyAqIChwb3NpdGlvbmVkR2x5cGgubG9jYWxHbHlwaCA/IFNERl9TQ0FMRSA6IDEpKTtcbiAgICAgICAgICAgIGNvbnN0ICBwYWRkZWRIZWlnaHQgPVxuICAgICAgICAgICAgICAgIHJlY3QuaCAqIHBvc2l0aW9uZWRHbHlwaC5zY2FsZSAvIChwaXhlbFJhdGlvICogKHBvc2l0aW9uZWRHbHlwaC5sb2NhbEdseXBoID8gU0RGX1NDQUxFIDogMSkpO1xuXG4gICAgICAgICAgICBsZXQgdGwsIHRyLCBibCwgYnI7XG4gICAgICAgICAgICBpZiAoIXJvdGF0ZVZlcnRpY2FsR2x5cGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4MSA9IChtZXRyaWNzLmxlZnQgLSByZWN0QnVmZmVyKSAqIHBvc2l0aW9uZWRHbHlwaC5zY2FsZSAtIGhhbGZBZHZhbmNlICsgYnVpbHRJbk9mZnNldFswXTtcbiAgICAgICAgICAgICAgICBjb25zdCB5MSA9ICgtbWV0cmljcy50b3AgLSByZWN0QnVmZmVyKSAqIHBvc2l0aW9uZWRHbHlwaC5zY2FsZSArIGJ1aWx0SW5PZmZzZXRbMV07XG4gICAgICAgICAgICAgICAgY29uc3QgeDIgPSB4MSArIHBhZGRlZFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHkyID0geTEgKyBwYWRkZWRIZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICB0bCA9IG5ldyBQb2ludCh4MSwgeTEpO1xuICAgICAgICAgICAgICAgIHRyID0gbmV3IFBvaW50KHgyLCB5MSk7XG4gICAgICAgICAgICAgICAgYmwgPSBuZXcgUG9pbnQoeDEsIHkyKTtcbiAgICAgICAgICAgICAgICBiciA9IG5ldyBQb2ludCh4MiwgeTIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgdmVydGljYWwgZ2x5cGggcGxhY2VtZW50LCBmb2xsb3cgdGhlIHN0ZXBzIHRvIHB1dCB0aGUgZ2x5cGggYml0bWFwIGluIHJpZ2h0IGNvb3JkaW5hdGVzOlxuICAgICAgICAgICAgICAgIC8vIDEuIFJvdGF0ZSB0aGUgZ2x5cGggYnkgdXNpbmcgb3JpZ2luYWwgZ2x5cGggY29vcmRpbmF0ZXMgaW5zdGVhZCBvZiBwYWRkZWQgY29vcmRpbmF0ZXMsIHNpbmNlIHRoZVxuICAgICAgICAgICAgICAgIC8vIHJvdGF0aW9uIGNlbnRlciBhbmQgeE9mZnNldENvcnJlY3Rpb24gYXJlIGFsbCBiYXNlZCBvbiBvcmlnaW5hbCBnbHlwaCdzIHNpemUuXG4gICAgICAgICAgICAgICAgLy8gMi4gRG8geCBvZmZzZXQgY29ycmVjdGlvbiBzbyB0aGF0ICd0bCcgaXMgc2hpZnRlZCB0byB0aGUgc2FtZSB4IGNvb3JkaW5hdGUgYmVmb3JlIHJvdGF0aW9uLlxuICAgICAgICAgICAgICAgIC8vIDMuIEFkanVzdCBnbHlwaCBwb3NpdG9uIGZvciAndGwnIGJ5IGFwcGx5aW5nIHZlcnRpYWwgcGFkZGluZyBhbmQgaG9yaXpvbnRhbCBzaGlmdCwgbm93ICd0bCcgaXMgdGhlXG4gICAgICAgICAgICAgICAgLy8gY29vcmRpbmF0ZSB3aGVyZSB3ZSBkcmF3IHRoZSBnbHlwaCBiaXRtYXAuXG4gICAgICAgICAgICAgICAgLy8gNC4gQ2FsY3VsYXRlIG90aGVyIHRocmVlIGJpdG1hcCBjb29yZGluYXRlcy5cblxuICAgICAgICAgICAgICAgIC8vIFZlcnRpY2FsLXN1cHBvcnRpbmcgZ2x5cGhzIGFyZSBsYWlkIG91dCBpbiAyNHgyNCBwb2ludCBib3hlcyAoMSBzcXVhcmUgZW0pXG4gICAgICAgICAgICAgICAgLy8gSW4gaG9yaXpvbnRhbCBvcmllbnRhdGlvbiwgdGhlIFwieVNoaWZ0XCIgaXMgdGhlIG5lZ2F0aXZlIHZhbHVlIG9mIHRoZSBoZWlnaHQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIHRoZSBnbHlwaCBpcyBhYm92ZSB0aGUgaG9yaXpvbnRhbCBtaWRsaW5lLlxuICAgICAgICAgICAgICAgIC8vIEJ5IHJvdGF0aW5nIGNvdW50ZXItY2xvY2t3aXNlIGFyb3VuZCB0aGUgcG9pbnQgYXQgdGhlIGNlbnRlciBvZiB0aGUgbGVmdFxuICAgICAgICAgICAgICAgIC8vIGVkZ2Ugb2YgYSAyNHgyNCBsYXlvdXQgYm94IGNlbnRlcmVkIGJlbG93IHRoZSBtaWRsaW5lLCB3ZSBhbGlnbiB0aGUgbWlkbGluZVxuICAgICAgICAgICAgICAgIC8vIG9mIHRoZSByb3RhdGVkIGdseXBocyB3aXRoIHRoZSBob3Jpem9udGFsIG1pZGxpbmUsIHNvIHRoZSB5U2hpZnQgaXMgbm8gbG9uZ2VyXG4gICAgICAgICAgICAgICAgLy8gbmVjZXNzYXJ5LCBidXQgd2UgYWxzbyBwdWxsIHRoZSBnbHlwaCB0byB0aGUgbGVmdCBhbG9uZyB0aGUgeCBheGlzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHlTaGlmdCA9IChwb3NpdGlvbmVkR2x5cGgueSAtIGN1cnJlbnRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IG5ldyBQb2ludCgtaGFsZkFkdmFuY2UsIGhhbGZBZHZhbmNlIC0geVNoaWZ0KTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbFJvdGF0aW9uID0gLU1hdGguUEkgLyAyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsT2Zmc2V0Q29ycmVjdGlvbiA9IG5ldyBQb2ludCguLi52ZXJ0aWNhbGl6ZWRMYWJlbE9mZnNldCk7XG4gICAgICAgICAgICAgICAgLy8gUmVsYXRpdmUgcG9zaXRpb24gYmVmb3JlIHJvdGF0aW9uXG4gICAgICAgICAgICAgICAgLy8gdGwgLS0tLS0gdHJcbiAgICAgICAgICAgICAgICAvLyAgIHwgICAgIHxcbiAgICAgICAgICAgICAgICAvLyAgIHwgICAgIHxcbiAgICAgICAgICAgICAgICAvLyBibCAtLS0tLSBiclxuICAgICAgICAgICAgICAgIHRsID0gbmV3IFBvaW50KC1oYWxmQWR2YW5jZSArIGJ1aWx0SW5PZmZzZXRbMF0sIGJ1aWx0SW5PZmZzZXRbMV0pO1xuICAgICAgICAgICAgICAgIHRsLl9yb3RhdGVBcm91bmQodmVydGljYWxSb3RhdGlvbiwgY2VudGVyKS5fYWRkKHZlcnRpY2FsT2Zmc2V0Q29ycmVjdGlvbik7XG5cbiAgICAgICAgICAgICAgICAvLyBSZWxhdGl2ZSBwb3NpdGlvbiBhZnRlciByb3RhdGluZ1xuICAgICAgICAgICAgICAgIC8vIHRyIC0tLS0tIGJyXG4gICAgICAgICAgICAgICAgLy8gICB8ICAgICB8XG4gICAgICAgICAgICAgICAgLy8gICB8ICAgICB8XG4gICAgICAgICAgICAgICAgLy8gdGwgLS0tLS0gYmxcbiAgICAgICAgICAgICAgICAvLyBBZnRlciByb3RhdGlvbiwgZ2x5cGggbGllcyBvbiB0aGUgaG9yaXpvbnRhbCBtaWRsaW5lLlxuICAgICAgICAgICAgICAgIC8vIFNoaWZ0IGJhY2sgdG8gdGwncyBvcmlnaW5hbCB4IGNvb3JkaW5hdGUgYmVmb3JlIHJvdGF0aW9uIGJ5IGFwcGx5aW5nICd4T2Zmc2V0Q29ycmVjdGlvbicuXG4gICAgICAgICAgICAgICAgdGwueCArPSAteVNoaWZ0ICsgaGFsZkFkdmFuY2U7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgcGFkZGluZyBmb3IgeSBjb29yZGluYXRlJ3MganVzdGlmaWNhdGlvblxuICAgICAgICAgICAgICAgIHRsLnkgLT0gKG1ldHJpY3MubGVmdCAtIHJlY3RCdWZmZXIpICogcG9zaXRpb25lZEdseXBoLnNjYWxlO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRqdXN0IHggY29vcmRpbmF0ZSBhY2NvcmRpbmcgdG8gZ2x5cGggYml0bWFwJ3MgaGVpZ2h0IGFuZCB0aGUgdmVjdGljYWwgYWR2YW5jZVxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsQWR2YW5jZSA9IHBvc2l0aW9uZWRHbHlwaC5pbWFnZU5hbWUgPyBtZXRyaWNzLmFkdmFuY2UgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgOlxuICAgICAgICAgICAgICAgICAgICBPTkVfRU0gKiBwb3NpdGlvbmVkR2x5cGguc2NhbGU7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgd2V0aGVyIHRoZSBnbHlwaCBpcyBnZW5lcmF0ZWQgZnJvbSBzZXJ2ZXIgc2lkZSBvciBsb2NhbGx5XG4gICAgICAgICAgICAgICAgY29uc3QgY2hyID0gU3RyaW5nLmZyb21DaGFyQ29kZShwb3NpdGlvbmVkR2x5cGguZ2x5cGgpO1xuICAgICAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsQ2xvc2VQdW5jdHVhdGlvbihjaHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBsYWNlIHZlcnRpY2FsIHB1bmN0dWF0aW9uIGluIHJpZ2h0IHBsYWNlLCBwdWxsIGRvd24gMSBwaXhlbCdzIHNwYWNlIGZvciBjbG9zZSBwdW5jdHVhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgdGwueCArPSAoLXJlY3RCdWZmZXIgKyAxKSAqIHBvc2l0aW9uZWRHbHlwaC5zY2FsZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzVmVydGljYWxPcGVuUHVuY3R1YXRpb24oY2hyKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0ID0gdmVydGljYWxBZHZhbmNlIC0gbWV0cmljcy5oZWlnaHQgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBsYWNlIHZlcnRpY2FsIHB1bmN0dWF0aW9uIGluIHJpZ2h0IHBsYWNlLCBwdWxsIHVwIDEgcGl4ZWwncyBzcGFjZSBmb3Igb3BlbiBwdW5jdHVhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgdGwueCArPSB4T2Zmc2V0ICsgKC1yZWN0QnVmZmVyIC0gMSkgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcG9zaXRpb25lZEdseXBoLmltYWdlTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtZXRyaWNzLndpZHRoICsgcmVjdEJ1ZmZlciAqIDIpICE9PSByZWN0LncgfHwgbWV0cmljcy5oZWlnaHQgKyByZWN0QnVmZmVyICogMiAhPT0gcmVjdC5oKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbGx5IGdlbmVyYXRlZCBnbHlwaHMnIGJpdG1hcCBkbyBub3QgaGF2ZSBleGFjdCAncmVjdEJ1ZmZlcicgcGFkZGVkIGFyb3VuZCB0aGUgZ2x5cGhzLFxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgdGhlIG9yaWdpbmFsIHRsIGRvIGhhdmUgZGlzdGFuY2Ugb2YgcmVjdEJ1ZmZlciBwYWRkZWQgdG8gdGhlIHRvcCBvZiB0aGUgZ2x5cGguXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcmZlY3RQYWRkZWRIZWlnaHQgPSAobWV0cmljcy5oZWlnaHQgKyByZWN0QnVmZmVyICogMikgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gdmVydGljYWxBZHZhbmNlIC0gcGVyZmVjdFBhZGRlZEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdGwueCArPSBkZWx0YSAvIDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGxhY2UgdGhlIGdseXBoIGJpdG1hcCByaWdodCBpbiB0aGUgY2VudGVyIG9mIHRoZSAyNHgyNCBwb2ludCBib3hlc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9IHZlcnRpY2FsQWR2YW5jZSAtIHBhZGRlZEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdGwueCArPSBkZWx0YSAvIDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBvdGhlciB0aHJlZSBwb2ludHNcbiAgICAgICAgICAgICAgICB0ciA9IG5ldyBQb2ludCh0bC54LCB0bC55IC0gcGFkZGVkV2lkdGgpO1xuICAgICAgICAgICAgICAgIGJsID0gbmV3IFBvaW50KHRsLnggKyBwYWRkZWRIZWlnaHQsIHRsLnkpO1xuICAgICAgICAgICAgICAgIGJyID0gbmV3IFBvaW50KHRsLnggKyBwYWRkZWRIZWlnaHQsIHRsLnkgLSBwYWRkZWRXaWR0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0ZXh0Um90YXRlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNlbnRlcjtcbiAgICAgICAgICAgICAgICBpZiAoIWFsb25nTGluZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodXNlUm90YXRlT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBuZXcgUG9pbnQocm90YXRlT2Zmc2V0WzBdLCByb3RhdGVPZmZzZXRbMV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbmV3IFBvaW50KHRleHRPZmZzZXRbMF0sIHRleHRPZmZzZXRbMV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbmV3IFBvaW50KDAsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0bC5fcm90YXRlQXJvdW5kKHRleHRSb3RhdGUsIGNlbnRlcik7XG4gICAgICAgICAgICAgICAgdHIuX3JvdGF0ZUFyb3VuZCh0ZXh0Um90YXRlLCBjZW50ZXIpO1xuICAgICAgICAgICAgICAgIGJsLl9yb3RhdGVBcm91bmQodGV4dFJvdGF0ZSwgY2VudGVyKTtcbiAgICAgICAgICAgICAgICBici5fcm90YXRlQXJvdW5kKHRleHRSb3RhdGUsIGNlbnRlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBpeGVsT2Zmc2V0VEwgPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICAgICAgICBjb25zdCBwaXhlbE9mZnNldEJSID0gbmV3IFBvaW50KDAsIDApO1xuICAgICAgICAgICAgY29uc3QgbWluRm9udFNjYWxlWCA9IDA7XG4gICAgICAgICAgICBjb25zdCBtaW5Gb250U2NhbGVZID0gMDtcbiAgICAgICAgICAgIHF1YWRzLnB1c2goe3RsLCB0ciwgYmwsIGJyLCB0ZXg6IHRleHR1cmVSZWN0LCB3cml0aW5nTW9kZTogc2hhcGluZy53cml0aW5nTW9kZSwgZ2x5cGhPZmZzZXQsIHNlY3Rpb25JbmRleDogcG9zaXRpb25lZEdseXBoLnNlY3Rpb25JbmRleCwgaXNTREYsIHBpeGVsT2Zmc2V0VEwsIHBpeGVsT2Zmc2V0QlIsIG1pbkZvbnRTY2FsZVgsIG1pbkZvbnRTY2FsZVl9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWFkcztcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlueVF1ZXVlIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhID0gW10sIGNvbXBhcmUgPSBkZWZhdWx0Q29tcGFyZSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7XG5cbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9ICh0aGlzLmxlbmd0aCA+PiAxKSAtIDE7IGkgPj0gMDsgaS0tKSB0aGlzLl9kb3duKGkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChpdGVtKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgICB0aGlzLl91cCh0aGlzLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIHBvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMuZGF0YVswXTtcbiAgICAgICAgY29uc3QgYm90dG9tID0gdGhpcy5kYXRhLnBvcCgpO1xuICAgICAgICB0aGlzLmxlbmd0aC0tO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVswXSA9IGJvdHRvbTtcbiAgICAgICAgICAgIHRoaXMuX2Rvd24oMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG9wO1xuICAgIH1cblxuICAgIHBlZWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbMF07XG4gICAgfVxuXG4gICAgX3VwKHBvcykge1xuICAgICAgICBjb25zdCB7ZGF0YSwgY29tcGFyZX0gPSB0aGlzO1xuICAgICAgICBjb25zdCBpdGVtID0gZGF0YVtwb3NdO1xuXG4gICAgICAgIHdoaWxlIChwb3MgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSAocG9zIC0gMSkgPj4gMTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBkYXRhW3BhcmVudF07XG4gICAgICAgICAgICBpZiAoY29tcGFyZShpdGVtLCBjdXJyZW50KSA+PSAwKSBicmVhaztcbiAgICAgICAgICAgIGRhdGFbcG9zXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICBwb3MgPSBwYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW3Bvc10gPSBpdGVtO1xuICAgIH1cblxuICAgIF9kb3duKHBvcykge1xuICAgICAgICBjb25zdCB7ZGF0YSwgY29tcGFyZX0gPSB0aGlzO1xuICAgICAgICBjb25zdCBoYWxmTGVuZ3RoID0gdGhpcy5sZW5ndGggPj4gMTtcbiAgICAgICAgY29uc3QgaXRlbSA9IGRhdGFbcG9zXTtcblxuICAgICAgICB3aGlsZSAocG9zIDwgaGFsZkxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGxlZnQgPSAocG9zIDw8IDEpICsgMTtcbiAgICAgICAgICAgIGxldCBiZXN0ID0gZGF0YVtsZWZ0XTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gbGVmdCArIDE7XG5cbiAgICAgICAgICAgIGlmIChyaWdodCA8IHRoaXMubGVuZ3RoICYmIGNvbXBhcmUoZGF0YVtyaWdodF0sIGJlc3QpIDwgMCkge1xuICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodDtcbiAgICAgICAgICAgICAgICBiZXN0ID0gZGF0YVtyaWdodF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29tcGFyZShiZXN0LCBpdGVtKSA+PSAwKSBicmVhaztcblxuICAgICAgICAgICAgZGF0YVtwb3NdID0gYmVzdDtcbiAgICAgICAgICAgIHBvcyA9IGxlZnQ7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhW3Bvc10gPSBpdGVtO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBRdWV1ZSBmcm9tICd0aW55cXVldWUnO1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQge2Rpc3RUb1NlZ21lbnRTcXVhcmVkfSBmcm9tICcuL2ludGVyc2VjdGlvbl90ZXN0cy5qcyc7XG5cbi8qKlxuICogRmluZHMgYW4gYXBwcm94aW1hdGlvbiBvZiBhIHBvbHlnb24ncyBQb2xlIE9mIEluYWNjZXNzaWJpbGl0eSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Qb2xlX29mX2luYWNjZXNzaWJpbGl0eVxuICogVGhpcyBpcyBhIGNvcHkgb2YgaHR0cDovL2dpdGh1Yi5jb20vbWFwYm94L3BvbHlsYWJlbCBhZGFwdGVkIHRvIHVzZSBQb2ludHNcbiAqXG4gKiBAcGFyYW0gcG9seWdvblJpbmdzIGZpcnN0IGl0ZW0gaW4gYXJyYXkgaXMgdGhlIG91dGVyIHJpbmcgZm9sbG93ZWQgb3B0aW9uYWxseSBieSB0aGUgbGlzdCBvZiBob2xlcywgc2hvdWxkIGJlIGFuIGVsZW1lbnQgb2YgdGhlIHJlc3VsdCBvZiB1dGlsL2NsYXNzaWZ5X3JpbmdzXG4gKiBAcGFyYW0gcHJlY2lzaW9uIFNwZWNpZmllZCBpbiBpbnB1dCBjb29yZGluYXRlIHVuaXRzLiBJZiAwIHJldHVybnMgYWZ0ZXIgZmlyc3QgcnVuLCBpZiA+IDAgcmVwZWF0ZWRseSBuYXJyb3dzIHRoZSBzZWFyY2ggc3BhY2UgdW50aWwgdGhlIHJhZGl1cyBvZiB0aGUgYXJlYSBzZWFyY2hlZCBmb3IgdGhlIGJlc3QgcG9sZSBpcyBsZXNzIHRoYW4gcHJlY2lzaW9uXG4gKiBAcGFyYW0gZGVidWcgUHJpbnQgc29tZSBzdGF0aXN0aWNzIHRvIHRoZSBjb25zb2xlIGR1cmluZyBleGVjdXRpb25cbiAqIEByZXR1cm5zIFBvbGUgb2YgSW5hY2Nlc3NpYmlsaXR5LlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHBvbHlnb25SaW5nczogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgcHJlY2lzaW9uPzogbnVtYmVyID0gMSwgZGVidWc/OiBib29sZWFuID0gZmFsc2UpOiBQb2ludCB7XG4gICAgLy8gZmluZCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBvdXRlciByaW5nXG4gICAgbGV0IG1pblggPSBJbmZpbml0eSwgbWluWSA9IEluZmluaXR5LCBtYXhYID0gLUluZmluaXR5LCBtYXhZID0gLUluZmluaXR5O1xuICAgIGNvbnN0IG91dGVyUmluZyA9IHBvbHlnb25SaW5nc1swXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dGVyUmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwID0gb3V0ZXJSaW5nW2ldO1xuICAgICAgICBpZiAoIWkgfHwgcC54IDwgbWluWCkgbWluWCA9IHAueDtcbiAgICAgICAgaWYgKCFpIHx8IHAueSA8IG1pblkpIG1pblkgPSBwLnk7XG4gICAgICAgIGlmICghaSB8fCBwLnggPiBtYXhYKSBtYXhYID0gcC54O1xuICAgICAgICBpZiAoIWkgfHwgcC55ID4gbWF4WSkgbWF4WSA9IHAueTtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aCA9IG1heFggLSBtaW5YO1xuICAgIGNvbnN0IGhlaWdodCA9IG1heFkgLSBtaW5ZO1xuICAgIGNvbnN0IGNlbGxTaXplID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCk7XG4gICAgbGV0IGggPSBjZWxsU2l6ZSAvIDI7XG5cbiAgICAvLyBhIHByaW9yaXR5IHF1ZXVlIG9mIGNlbGxzIGluIG9yZGVyIG9mIHRoZWlyIFwicG90ZW50aWFsXCIgKG1heCBkaXN0YW5jZSB0byBwb2x5Z29uKVxuICAgIGNvbnN0IGNlbGxRdWV1ZSA9IG5ldyBRdWV1ZShbXSwgY29tcGFyZU1heCk7XG5cbiAgICBpZiAoY2VsbFNpemUgPT09IDApIHJldHVybiBuZXcgUG9pbnQobWluWCwgbWluWSk7XG5cbiAgICAvLyBjb3ZlciBwb2x5Z29uIHdpdGggaW5pdGlhbCBjZWxsc1xuICAgIGZvciAobGV0IHggPSBtaW5YOyB4IDwgbWF4WDsgeCArPSBjZWxsU2l6ZSkge1xuICAgICAgICBmb3IgKGxldCB5ID0gbWluWTsgeSA8IG1heFk7IHkgKz0gY2VsbFNpemUpIHtcbiAgICAgICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKHggKyBoLCB5ICsgaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0YWtlIGNlbnRyb2lkIGFzIHRoZSBmaXJzdCBiZXN0IGd1ZXNzXG4gICAgbGV0IGJlc3RDZWxsID0gZ2V0Q2VudHJvaWRDZWxsKHBvbHlnb25SaW5ncyk7XG4gICAgbGV0IG51bVByb2JlcyA9IGNlbGxRdWV1ZS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoY2VsbFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAvLyBwaWNrIHRoZSBtb3N0IHByb21pc2luZyBjZWxsIGZyb20gdGhlIHF1ZXVlXG4gICAgICAgIGNvbnN0IGNlbGwgPSBjZWxsUXVldWUucG9wKCk7XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBiZXN0IGNlbGwgaWYgd2UgZm91bmQgYSBiZXR0ZXIgb25lXG4gICAgICAgIGlmIChjZWxsLmQgPiBiZXN0Q2VsbC5kIHx8ICFiZXN0Q2VsbC5kKSB7XG4gICAgICAgICAgICBiZXN0Q2VsbCA9IGNlbGw7XG4gICAgICAgICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKCdmb3VuZCBiZXN0ICVkIGFmdGVyICVkIHByb2JlcycsIE1hdGgucm91bmQoMWU0ICogY2VsbC5kKSAvIDFlNCwgbnVtUHJvYmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRvIG5vdCBkcmlsbCBkb3duIGZ1cnRoZXIgaWYgdGhlcmUncyBubyBjaGFuY2Ugb2YgYSBiZXR0ZXIgc29sdXRpb25cbiAgICAgICAgaWYgKGNlbGwubWF4IC0gYmVzdENlbGwuZCA8PSBwcmVjaXNpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHNwbGl0IHRoZSBjZWxsIGludG8gZm91ciBjZWxsc1xuICAgICAgICBoID0gY2VsbC5oIC8gMjtcbiAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoY2VsbC5wLnggLSBoLCBjZWxsLnAueSAtIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICBjZWxsUXVldWUucHVzaChuZXcgQ2VsbChjZWxsLnAueCArIGgsIGNlbGwucC55IC0gaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKGNlbGwucC54IC0gaCwgY2VsbC5wLnkgKyBoLCBoLCBwb2x5Z29uUmluZ3MpKTtcbiAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoY2VsbC5wLnggKyBoLCBjZWxsLnAueSArIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICBudW1Qcm9iZXMgKz0gNDtcbiAgICB9XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coYG51bSBwcm9iZXM6ICR7bnVtUHJvYmVzfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhgYmVzdCBkaXN0YW5jZTogJHtiZXN0Q2VsbC5kfWApO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0Q2VsbC5wO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlTWF4KGEsIGIpIHtcbiAgICByZXR1cm4gYi5tYXggLSBhLm1heDtcbn1cblxuZnVuY3Rpb24gQ2VsbCh4LCB5LCBoLCBwb2x5Z29uKSB7XG4gICAgdGhpcy5wID0gbmV3IFBvaW50KHgsIHkpO1xuICAgIHRoaXMuaCA9IGg7IC8vIGhhbGYgdGhlIGNlbGwgc2l6ZVxuICAgIHRoaXMuZCA9IHBvaW50VG9Qb2x5Z29uRGlzdCh0aGlzLnAsIHBvbHlnb24pOyAvLyBkaXN0YW5jZSBmcm9tIGNlbGwgY2VudGVyIHRvIHBvbHlnb25cbiAgICB0aGlzLm1heCA9IHRoaXMuZCArIHRoaXMuaCAqIE1hdGguU1FSVDI7IC8vIG1heCBkaXN0YW5jZSB0byBwb2x5Z29uIHdpdGhpbiBhIGNlbGxcbn1cblxuLy8gc2lnbmVkIGRpc3RhbmNlIGZyb20gcG9pbnQgdG8gcG9seWdvbiBvdXRsaW5lIChuZWdhdGl2ZSBpZiBwb2ludCBpcyBvdXRzaWRlKVxuZnVuY3Rpb24gcG9pbnRUb1BvbHlnb25EaXN0KHAsIHBvbHlnb24pIHtcbiAgICBsZXQgaW5zaWRlID0gZmFsc2U7XG4gICAgbGV0IG1pbkRpc3RTcSA9IEluZmluaXR5O1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBwb2x5Z29uLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSBwb2x5Z29uW2tdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDE7IGkgPCBsZW47IGogPSBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByaW5nW2ldO1xuICAgICAgICAgICAgY29uc3QgYiA9IHJpbmdbal07XG5cbiAgICAgICAgICAgIGlmICgoYS55ID4gcC55ICE9PSBiLnkgPiBwLnkpICYmXG4gICAgICAgICAgICAgICAgKHAueCA8IChiLnggLSBhLngpICogKHAueSAtIGEueSkgLyAoYi55IC0gYS55KSArIGEueCkpIGluc2lkZSA9ICFpbnNpZGU7XG5cbiAgICAgICAgICAgIG1pbkRpc3RTcSA9IE1hdGgubWluKG1pbkRpc3RTcSwgZGlzdFRvU2VnbWVudFNxdWFyZWQocCwgYSwgYikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChpbnNpZGUgPyAxIDogLTEpICogTWF0aC5zcXJ0KG1pbkRpc3RTcSk7XG59XG5cbi8vIGdldCBwb2x5Z29uIGNlbnRyb2lkXG5mdW5jdGlvbiBnZXRDZW50cm9pZENlbGwocG9seWdvbikge1xuICAgIGxldCBhcmVhID0gMDtcbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IHkgPSAwO1xuICAgIGNvbnN0IHBvaW50cyA9IHBvbHlnb25bMF07XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBvaW50cy5sZW5ndGgsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIGNvbnN0IGEgPSBwb2ludHNbaV07XG4gICAgICAgIGNvbnN0IGIgPSBwb2ludHNbal07XG4gICAgICAgIGNvbnN0IGYgPSBhLnggKiBiLnkgLSBiLnggKiBhLnk7XG4gICAgICAgIHggKz0gKGEueCArIGIueCkgKiBmO1xuICAgICAgICB5ICs9IChhLnkgKyBiLnkpICogZjtcbiAgICAgICAgYXJlYSArPSBmICogMztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDZWxsKHggLyBhcmVhLCB5IC8gYXJlYSwgMCwgcG9seWdvbik7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQW5jaG9yIGZyb20gJy4vYW5jaG9yLmpzJztcblxuaW1wb3J0IHtnZXRBbmNob3JzLCBnZXRDZW50ZXJBbmNob3J9IGZyb20gJy4vZ2V0X2FuY2hvcnMuanMnO1xuaW1wb3J0IGNsaXBMaW5lIGZyb20gJy4vY2xpcF9saW5lLmpzJztcbmltcG9ydCB7c2hhcGVUZXh0LCBzaGFwZUljb24sIFdyaXRpbmdNb2RlLCBmaXRJY29uVG9UZXh0fSBmcm9tICcuL3NoYXBpbmcuanMnO1xuaW1wb3J0IHtnZXRHbHlwaFF1YWRzLCBnZXRJY29uUXVhZHN9IGZyb20gJy4vcXVhZHMuanMnO1xuaW1wb3J0IHt3YXJuT25jZSwgZGVnVG9SYWR9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge1xuICAgIGFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUsXG4gICAgYWxsb3dzTGV0dGVyU3BhY2luZ1xufSBmcm9tICcuLi91dGlsL3NjcmlwdF9kZXRlY3Rpb24uanMnO1xuaW1wb3J0IGZpbmRQb2xlT2ZJbmFjY2Vzc2liaWxpdHkgZnJvbSAnLi4vdXRpbC9maW5kX3BvbGVfb2ZfaW5hY2Nlc3NpYmlsaXR5LmpzJztcbmltcG9ydCBjbGFzc2lmeVJpbmdzIGZyb20gJy4uL3V0aWwvY2xhc3NpZnlfcmluZ3MuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQgU3ltYm9sQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQge1NJWkVfUEFDS19GQUNUT1J9IGZyb20gJy4vc3ltYm9sX3NpemUuanMnO1xuaW1wb3J0IE9ORV9FTSBmcm9tICcuL29uZV9lbS5qcyc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7U2hhcGluZywgUG9zaXRpb25lZEljb24sIFRleHRKdXN0aWZ5fSBmcm9tICcuL3NoYXBpbmcuanMnO1xuaW1wb3J0IHR5cGUge0NvbGxpc2lvbkJveEFycmF5fSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtTeW1ib2xGZWF0dXJlfSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGguanMnO1xuaW1wb3J0IHR5cGUgU3ltYm9sU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uL3JlbmRlci9pbWFnZV9hdGxhcy5qcyc7XG5pbXBvcnQgdHlwZSB7R2x5cGhQb3NpdGlvbnN9IGZyb20gJy4uL3JlbmRlci9nbHlwaF9hdGxhcy5qcyc7XG5pbXBvcnQgdHlwZSB7UG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSBmcm9tICcuLi9zdHlsZS9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIHtQcm9qZWN0aW9ufSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9pbmRleC5qcyc7XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBtdXJtdXIzIGZyb20gJ211cm11cmhhc2gtanMnO1xuXG4vLyBUaGUgc3ltYm9sIGxheW91dCBwcm9jZXNzIG5lZWRzIGB0ZXh0LXNpemVgIGV2YWx1YXRlZCBhdCB1cCB0byBmaXZlIGRpZmZlcmVudCB6b29tIGxldmVscywgYW5kXG4vLyBgaWNvbi1zaXplYCBhdCB1cCB0byB0aHJlZTpcbi8vXG4vLyAgIDEuIGB0ZXh0LXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQuIFVzZWQgdG8gY2FsY3VsYXRlIGEgcGVyLWZlYXR1cmUgc2l6ZSBmb3Igc291cmNlIGB0ZXh0LXNpemVgXG4vLyAgICAgICBleHByZXNzaW9ucywgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgYm94IGRpbWVuc2lvbnMgZm9yIGljb24tdGV4dC1maXQuXG4vLyAgIDIuIGBpY29uLXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQuIFVzZWQgdG8gY2FsY3VsYXRlIGEgcGVyLWZlYXR1cmUgc2l6ZSBmb3Igc291cmNlIGBpY29uLXNpemVgXG4vLyAgICAgICBleHByZXNzaW9ucy5cbi8vICAgMy4gYHRleHQtc2l6ZWAgYW5kIGBpY29uLXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQsIHBsdXMgb25lLiBVc2VkIHRvIGNhbGN1bGF0ZSBjb2xsaXNpb24gYm94ZXMuXG4vLyAgIDQuIGB0ZXh0LXNpemVgIGF0IHpvb20gbGV2ZWwgMTguIFVzZWQgZm9yIHNvbWV0aGluZyBsaW5lLXN5bWJvbC1wbGFjZW1lbnQtcmVsYXRlZC5cbi8vICAgNS4gIEZvciBjb21wb3NpdGUgYCotc2l6ZWAgZXhwcmVzc2lvbnM6IHR3byB6b29tIGxldmVscyBvZiBjdXJ2ZSBzdG9wcyB0aGF0IFwiY292ZXJcIiB0aGUgem9vbSBsZXZlbCBvZiB0aGVcbi8vICAgICAgIGJ1Y2tldC4gVGhlc2UgZ28gaW50byBhIHZlcnRleCBidWZmZXIgYW5kIGFyZSB1c2VkIGJ5IHRoZSBzaGFkZXIgdG8gaW50ZXJwb2xhdGUgdGhlIHNpemUgYXQgcmVuZGVyIHRpbWUuXG4vL1xuLy8gKDEpIGFuZCAoMikgYXJlIHN0b3JlZCBpbiBgYnVja2V0LmxheWVyc1swXS5sYXlvdXRgLiBUaGUgcmVtYWluZGVyIGFyZSBiZWxvdy5cbi8vXG50eXBlIFNpemVzID0ge1xuICAgIGxheW91dFRleHRTaXplOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPiwgLy8gKDMpXG4gICAgbGF5b3V0SWNvblNpemU6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+LCAvLyAoMylcbiAgICB0ZXh0TWF4U2l6ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG51bWJlcj4sICAgIC8vICg0KVxuICAgIGNvbXBvc2l0ZVRleHRTaXplczogW1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+LCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPl0sIC8vICg1KVxuICAgIGNvbXBvc2l0ZUljb25TaXplczogW1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+LCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPl0sIC8vICg1KVxufTtcblxuZXhwb3J0IHR5cGUgVGV4dEFuY2hvciA9ICdjZW50ZXInIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICd0b3AnIHwgJ2JvdHRvbScgfCAndG9wLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ2JvdHRvbS1yaWdodCc7XG5cbi8vIFRoZSByYWRpYWwgb2Zmc2V0IGlzIHRvIHRoZSBlZGdlIG9mIHRoZSB0ZXh0IGJveFxuLy8gSW4gdGhlIGhvcml6b250YWwgZGlyZWN0aW9uLCB0aGUgZWRnZSBvZiB0aGUgdGV4dCBib3ggaXMgd2hlcmUgZ2x5cGhzIHN0YXJ0XG4vLyBCdXQgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbiwgdGhlIGdseXBocyBhcHBlYXIgdG8gXCJzdGFydFwiIGF0IHRoZSBiYXNlbGluZVxuLy8gV2UgZG9uJ3QgYWN0dWFsbHkgbG9hZCBiYXNlbGluZSBkYXRhLCBidXQgd2UgYXNzdW1lIGFuIG9mZnNldCBvZiBPTkVfRU0gLSAxN1xuLy8gKHNlZSBcInlPZmZzZXRcIiBpbiBzaGFwaW5nLmpzKVxuY29uc3QgYmFzZWxpbmVPZmZzZXQgPSA3O1xuY29uc3QgSU5WQUxJRF9URVhUX09GRlNFVCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbmNvbnN0IHNxcnQyID0gTWF0aC5zcXJ0KDIpO1xuXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVWYXJpYWJsZU9mZnNldChhbmNob3I6IFRleHRBbmNob3IsIG9mZnNldDogW251bWJlciwgbnVtYmVyXSkge1xuXG4gICAgZnVuY3Rpb24gZnJvbVJhZGlhbE9mZnNldChhbmNob3I6IFRleHRBbmNob3IsIHJhZGlhbE9mZnNldDogbnVtYmVyKSB7XG4gICAgICAgIGxldCB4ID0gMCwgeSA9IDA7XG4gICAgICAgIGlmIChyYWRpYWxPZmZzZXQgPCAwKSByYWRpYWxPZmZzZXQgPSAwOyAvLyBJZ25vcmUgbmVnYXRpdmUgb2Zmc2V0LlxuICAgICAgICAvLyBzb2x2ZSBmb3IgciB3aGVyZSByXjIgKyByXjIgPSByYWRpYWxPZmZzZXReMlxuICAgICAgICBjb25zdCBoeXBvdGVudXNlID0gcmFkaWFsT2Zmc2V0IC8gc3FydDI7XG4gICAgICAgIHN3aXRjaCAoYW5jaG9yKSB7XG4gICAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgICAgIHkgPSBoeXBvdGVudXNlIC0gYmFzZWxpbmVPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICAgICAgeSA9IC1oeXBvdGVudXNlICsgYmFzZWxpbmVPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHkgPSAtcmFkaWFsT2Zmc2V0ICsgYmFzZWxpbmVPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIHkgPSByYWRpYWxPZmZzZXQgLSBiYXNlbGluZU9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICAgICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgICAgIHggPSAtaHlwb3RlbnVzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgICAgIHggPSBoeXBvdGVudXNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgeCA9IHJhZGlhbE9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICB4ID0gLXJhZGlhbE9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tVGV4dE9mZnNldChhbmNob3I6IFRleHRBbmNob3IsIG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyKSB7XG4gICAgICAgIGxldCB4ID0gMCwgeSA9IDA7XG4gICAgICAgIC8vIFVzZSBhYnNvbHV0ZSBvZmZzZXQgdmFsdWVzLlxuICAgICAgICBvZmZzZXRYID0gTWF0aC5hYnMob2Zmc2V0WCk7XG4gICAgICAgIG9mZnNldFkgPSBNYXRoLmFicyhvZmZzZXRZKTtcblxuICAgICAgICBzd2l0Y2ggKGFuY2hvcikge1xuICAgICAgICBjYXNlICd0b3AtcmlnaHQnOlxuICAgICAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICB5ID0gb2Zmc2V0WSAtIGJhc2VsaW5lT2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHkgPSAtb2Zmc2V0WSArIGJhc2VsaW5lT2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGFuY2hvcikge1xuICAgICAgICBjYXNlICd0b3AtcmlnaHQnOlxuICAgICAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICB4ID0gLW9mZnNldFg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgeCA9IG9mZnNldFg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuXG4gICAgcmV0dXJuIChvZmZzZXRbMV0gIT09IElOVkFMSURfVEVYVF9PRkZTRVQpID8gZnJvbVRleHRPZmZzZXQoYW5jaG9yLCBvZmZzZXRbMF0sIG9mZnNldFsxXSkgOiBmcm9tUmFkaWFsT2Zmc2V0KGFuY2hvciwgb2Zmc2V0WzBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcmZvcm1TeW1ib2xMYXlvdXQoYnVja2V0OiBTeW1ib2xCdWNrZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB7W186IHN0cmluZ106IHtnbHlwaHM6IHtbXzogbnVtYmVyXTogP1N0eWxlR2x5cGh9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25zOiBHbHlwaFBvc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXA6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVab29tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb246IFByb2plY3Rpb24pIHtcbiAgICBidWNrZXQuY3JlYXRlQXJyYXlzKCk7XG5cbiAgICBjb25zdCB0aWxlU2l6ZSA9IDUxMiAqIGJ1Y2tldC5vdmVyc2NhbGluZztcbiAgICBidWNrZXQudGlsZVBpeGVsUmF0aW8gPSBFWFRFTlQgLyB0aWxlU2l6ZTtcbiAgICBidWNrZXQuY29tcGFyZVRleHQgPSB7fTtcbiAgICBidWNrZXQuaWNvbnNOZWVkTGluZWFyID0gZmFsc2U7XG5cbiAgICBjb25zdCBsYXlvdXQgPSBidWNrZXQubGF5ZXJzWzBdLmxheW91dDtcbiAgICBjb25zdCB1bmV2YWx1YXRlZExheW91dFZhbHVlcyA9IGJ1Y2tldC5sYXllcnNbMF0uX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXM7XG5cbiAgICBjb25zdCBzaXplcyA9IHt9O1xuXG4gICAgaWYgKGJ1Y2tldC50ZXh0U2l6ZURhdGEua2luZCA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgY29uc3Qge21pblpvb20sIG1heFpvb219ID0gYnVja2V0LnRleHRTaXplRGF0YTtcbiAgICAgICAgc2l6ZXMuY29tcG9zaXRlVGV4dFNpemVzID0gW1xuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1pblpvb20pLCBjYW5vbmljYWwpLFxuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1heFpvb20pLCBjYW5vbmljYWwpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgaWYgKGJ1Y2tldC5pY29uU2l6ZURhdGEua2luZCA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgY29uc3Qge21pblpvb20sIG1heFpvb219ID0gYnVja2V0Lmljb25TaXplRGF0YTtcbiAgICAgICAgc2l6ZXMuY29tcG9zaXRlSWNvblNpemVzID0gW1xuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1pblpvb20pLCBjYW5vbmljYWwpLFxuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1heFpvb20pLCBjYW5vbmljYWwpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgc2l6ZXMubGF5b3V0VGV4dFNpemUgPSB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10ucG9zc2libHlFdmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGlsZVpvb20gKyAxKSwgY2Fub25pY2FsKTtcbiAgICBzaXplcy5sYXlvdXRJY29uU2l6ZSA9IHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWydpY29uLXNpemUnXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aWxlWm9vbSArIDEpLCBjYW5vbmljYWwpO1xuICAgIHNpemVzLnRleHRNYXhTaXplID0gdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKDE4KSwgY2Fub25pY2FsKTtcblxuICAgIGNvbnN0IHRleHRBbG9uZ0xpbmUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyAmJiBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCc7XG4gICAgY29uc3QgdGV4dFNpemUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXNpemUnKTtcblxuICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBidWNrZXQuZmVhdHVyZXMpIHtcbiAgICAgICAgY29uc3QgZm9udHN0YWNrID0gbGF5b3V0LmdldCgndGV4dC1mb250JykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCkuam9pbignLCcpO1xuICAgICAgICBjb25zdCBsYXlvdXRUZXh0U2l6ZVRoaXNab29tID0gdGV4dFNpemUuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgICAgIGNvbnN0IGxheW91dFRleHRTaXplID0gc2l6ZXMubGF5b3V0VGV4dFNpemUuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgICAgIGNvbnN0IGxheW91dEljb25TaXplID0gc2l6ZXMubGF5b3V0SWNvblNpemUuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG5cbiAgICAgICAgY29uc3Qgc2hhcGVkVGV4dE9yaWVudGF0aW9ucyA9IHtcbiAgICAgICAgICAgIGhvcml6b250YWw6IHt9LFxuICAgICAgICAgICAgdmVydGljYWw6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB0ZXh0ID0gZmVhdHVyZS50ZXh0O1xuICAgICAgICBsZXQgdGV4dE9mZnNldDogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuZm9ybWF0dGVkVGV4dCA9IHRleHQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHNwYWNpbmcgPSBsYXlvdXQuZ2V0KCd0ZXh0LWxldHRlci1zcGFjaW5nJykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCkgKiBPTkVfRU07XG4gICAgICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gbGF5b3V0LmdldCgndGV4dC1saW5lLWhlaWdodCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpICogT05FX0VNO1xuICAgICAgICAgICAgY29uc3Qgc3BhY2luZ0lmQWxsb3dlZCA9IGFsbG93c0xldHRlclNwYWNpbmcodW5mb3JtYXR0ZWRUZXh0KSA/IHNwYWNpbmcgOiAwO1xuXG4gICAgICAgICAgICBjb25zdCB0ZXh0QW5jaG9yID0gbGF5b3V0LmdldCgndGV4dC1hbmNob3InKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKTtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlVGV4dEFuY2hvciA9IGxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG5cbiAgICAgICAgICAgIGlmICghdmFyaWFibGVUZXh0QW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFkaWFsT2Zmc2V0ID0gbGF5b3V0LmdldCgndGV4dC1yYWRpYWwtb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICAgICAgLy8gTGF5ZXJzIHdpdGggdmFyaWFibGUgYW5jaG9ycyB1c2UgdGhlIGB0ZXh0LXJhZGlhbC1vZmZzZXRgIHByb3BlcnR5IGFuZCB0aGUgW3gsIHldIG9mZnNldCB2ZWN0b3JcbiAgICAgICAgICAgICAgICAvLyBpcyBjYWxjdWxhdGVkIGF0IHBsYWNlbWVudCB0aW1lIGluc3RlYWQgb2YgbGF5b3V0IHRpbWVcbiAgICAgICAgICAgICAgICBpZiAocmFkaWFsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzdHlsZSBzcGVjIHNheXMgZG9uJ3QgdXNlIGB0ZXh0LW9mZnNldGAgYW5kIGB0ZXh0LXJhZGlhbC1vZmZzZXRgIHRvZ2V0aGVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IHNwZWNpZnkgd2hhdCBoYXBwZW5zIGlmIHlvdSB1c2UgYm90aC4gV2UgZ28gd2l0aCB0aGUgcmFkaWFsIG9mZnNldC5cbiAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCA9IGV2YWx1YXRlVmFyaWFibGVPZmZzZXQodGV4dEFuY2hvciwgW3JhZGlhbE9mZnNldCAqIE9ORV9FTSwgSU5WQUxJRF9URVhUX09GRlNFVF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQgPSAobGF5b3V0LmdldCgndGV4dC1vZmZzZXQnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKS5tYXAodCA9PiB0ICogT05FX0VNKTogYW55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0SnVzdGlmeSA9IHRleHRBbG9uZ0xpbmUgP1xuICAgICAgICAgICAgICAgIFwiY2VudGVyXCIgOlxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtanVzdGlmeScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpO1xuXG4gICAgICAgICAgICBjb25zdCBzeW1ib2xQbGFjZW1lbnQgPSBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50Jyk7XG4gICAgICAgICAgICBjb25zdCBpc1BvaW50UGxhY2VtZW50ID0gc3ltYm9sUGxhY2VtZW50ID09PSAncG9pbnQnO1xuICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBzeW1ib2xQbGFjZW1lbnQgPT09ICdwb2ludCcgP1xuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtbWF4LXdpZHRoJykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCkgKiBPTkVfRU0gOlxuICAgICAgICAgICAgICAgIDA7XG5cbiAgICAgICAgICAgIGNvbnN0IGFkZFZlcnRpY2FsU2hhcGluZ0lmTmVlZGVkID0gKHRleHRKdXN0aWZ5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIGFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUodW5mb3JtYXR0ZWRUZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbCBQT0kgbGFiZWwgcGxhY2VtZW50IGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIHNjcmlwdHMgdGhhdCBzdXBwb3J0IHZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRpbmcgbW9kZSwgdGh1cywgZGVmYXVsdCBsZWZ0IGp1c3RpZmljYXRpb24gaXMgdXNlZC4gSWYgTGF0aW5cbiAgICAgICAgICAgICAgICAgICAgLy8gc2NyaXB0cyB3b3VsZCBuZWVkIHRvIGJlIHN1cHBvcnRlZCwgdGhpcyBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgb3RoZXIganVzdGlmaWNhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwgPSBzaGFwZVRleHQodGV4dCwgZ2x5cGhNYXAsIGdseXBoUG9zaXRpb25zLCBpbWFnZVBvc2l0aW9ucywgZm9udHN0YWNrLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgdGV4dEFuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SnVzdGlmeSwgc3BhY2luZ0lmQWxsb3dlZCwgdGV4dE9mZnNldCwgV3JpdGluZ01vZGUudmVydGljYWwsIHRydWUsIHN5bWJvbFBsYWNlbWVudCwgbGF5b3V0VGV4dFNpemUsIGxheW91dFRleHRTaXplVGhpc1pvb20pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgbGF5ZXIgdXNlcyB0ZXh0LXZhcmlhYmxlLWFuY2hvciwgZ2VuZXJhdGUgc2hhcGluZ3MgZm9yIGFsbCBqdXN0aWZpY2F0aW9uIHBvc3NpYmlsaXRpZXMuXG4gICAgICAgICAgICBpZiAoIXRleHRBbG9uZ0xpbmUgJiYgdmFyaWFibGVUZXh0QW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QganVzdGlmaWNhdGlvbnMgPSB0ZXh0SnVzdGlmeSA9PT0gXCJhdXRvXCIgP1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVRleHRBbmNob3IubWFwKGEgPT4gZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbihhKSkgOlxuICAgICAgICAgICAgICAgICAgICBbdGV4dEp1c3RpZnldO1xuXG4gICAgICAgICAgICAgICAgbGV0IHNpbmdsZUxpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGp1c3RpZmljYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGp1c3RpZmljYXRpb246IFRleHRKdXN0aWZ5ID0ganVzdGlmaWNhdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWxbanVzdGlmaWNhdGlvbl0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2luZ2xlTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNoYXBpbmcgZm9yIHRoZSBmaXJzdCBqdXN0aWZpY2F0aW9uIHdhcyBvbmx5IGEgc2luZ2xlIGxpbmUsIHdlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gcmUtdXNlIGl0IGZvciB0aGUgb3RoZXIganVzdGlmaWNhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbFtqdXN0aWZpY2F0aW9uXSA9IHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbFswXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHVzaW5nIHRleHQtdmFyaWFibGUtYW5jaG9yIGZvciB0aGUgbGF5ZXIsIHdlIHVzZSBhIGNlbnRlciBhbmNob3IgZm9yIGFsbCBzaGFwaW5ncyBhbmQgYXBwbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvZmZzZXRzIGZvciB0aGUgYW5jaG9yIGluIHRoZSBwbGFjZW1lbnQgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBpbmcgPSBzaGFwZVRleHQodGV4dCwgZ2x5cGhNYXAsIGdseXBoUG9zaXRpb25zLCBpbWFnZVBvc2l0aW9ucywgZm9udHN0YWNrLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZmljYXRpb24sIHNwYWNpbmdJZkFsbG93ZWQsIHRleHRPZmZzZXQsIFdyaXRpbmdNb2RlLmhvcml6b250YWwsIGZhbHNlLCBzeW1ib2xQbGFjZW1lbnQsIGxheW91dFRleHRTaXplLCBsYXlvdXRUZXh0U2l6ZVRoaXNab29tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGFwaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsW2p1c3RpZmljYXRpb25dID0gc2hhcGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVMaW5lID0gc2hhcGluZy5wb3NpdGlvbmVkTGluZXMubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYWRkVmVydGljYWxTaGFwaW5nSWZOZWVkZWQoJ2xlZnQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRKdXN0aWZ5ID09PSBcImF1dG9cIikge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0SnVzdGlmeSA9IGdldEFuY2hvckp1c3RpZmljYXRpb24odGV4dEFuY2hvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFkZCBob3Jpem9udGFsIHNoYXBpbmcgZm9yIGFsbCBwb2ludCBsYWJlbHMgYW5kIGxpbmUgbGFiZWxzIHRoYXQgbmVlZCBob3Jpem9udGFsIHdyaXRpbmcgbW9kZS5cbiAgICAgICAgICAgICAgICBpZiAoaXNQb2ludFBsYWNlbWVudCB8fCAoKGxheW91dC5nZXQoXCJ0ZXh0LXdyaXRpbmctbW9kZVwiKS5pbmRleE9mKCdob3Jpem9udGFsJykgPj0gMCkgfHwgIWFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUodW5mb3JtYXR0ZWRUZXh0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcGluZyA9IHNoYXBlVGV4dCh0ZXh0LCBnbHlwaE1hcCwgZ2x5cGhQb3NpdGlvbnMsIGltYWdlUG9zaXRpb25zLCBmb250c3RhY2ssIG1heFdpZHRoLCBsaW5lSGVpZ2h0LCB0ZXh0QW5jaG9yLCB0ZXh0SnVzdGlmeSwgc3BhY2luZ0lmQWxsb3dlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCwgV3JpdGluZ01vZGUuaG9yaXpvbnRhbCwgZmFsc2UsIHN5bWJvbFBsYWNlbWVudCwgbGF5b3V0VGV4dFNpemUsIGxheW91dFRleHRTaXplVGhpc1pvb20pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcGluZykgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsW3RleHRKdXN0aWZ5XSA9IHNoYXBpbmc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmVydGljYWwgcG9pbnQgbGFiZWwgKGlmIGFsbG93VmVydGljYWxQbGFjZW1lbnQgaXMgZW5hYmxlZCkuXG4gICAgICAgICAgICAgICAgYWRkVmVydGljYWxTaGFwaW5nSWZOZWVkZWQoc3ltYm9sUGxhY2VtZW50ID09PSAncG9pbnQnID8gJ2xlZnQnIDogdGV4dEp1c3RpZnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNoYXBlZEljb247XG4gICAgICAgIGxldCBpc1NERkljb24gPSBmYWxzZTtcbiAgICAgICAgaWYgKGZlYXR1cmUuaWNvbiAmJiBmZWF0dXJlLmljb24ubmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBpbWFnZU1hcFtmZWF0dXJlLmljb24ubmFtZV07XG4gICAgICAgICAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICBzaGFwZWRJY29uID0gc2hhcGVJY29uKFxuICAgICAgICAgICAgICAgICAgICBpbWFnZVBvc2l0aW9uc1tmZWF0dXJlLmljb24ubmFtZV0sXG4gICAgICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24tb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCksXG4gICAgICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24tYW5jaG9yJykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCkpO1xuICAgICAgICAgICAgICAgIGlzU0RGSWNvbiA9IGltYWdlLnNkZjtcbiAgICAgICAgICAgICAgICBpZiAoYnVja2V0LnNkZkljb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LnNkZkljb25zID0gaW1hZ2Uuc2RmO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVja2V0LnNkZkljb25zICE9PSBpbWFnZS5zZGYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fybk9uY2UoJ1N0eWxlIHNoZWV0IHdhcm5pbmc6IENhbm5vdCBtaXggU0RGIGFuZCBub24tU0RGIGljb25zIGluIG9uZSBidWZmZXInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGltYWdlLnBpeGVsUmF0aW8gIT09IGJ1Y2tldC5waXhlbFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5pY29uc05lZWRMaW5lYXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0LmdldCgnaWNvbi1yb3RhdGUnKS5jb25zdGFudE9yKDEpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5pY29uc05lZWRMaW5lYXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNoYXBlZFRleHQgPSBnZXREZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmcoc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsKSB8fCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsO1xuICAgICAgICBpZiAoIWJ1Y2tldC5pY29uc0luVGV4dCkge1xuICAgICAgICAgICAgYnVja2V0Lmljb25zSW5UZXh0ID0gc2hhcGVkVGV4dCA/IHNoYXBlZFRleHQuaWNvbnNJblRleHQgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hhcGVkVGV4dCB8fCBzaGFwZWRJY29uKSB7XG4gICAgICAgICAgICBhZGRGZWF0dXJlKGJ1Y2tldCwgZmVhdHVyZSwgc2hhcGVkVGV4dE9yaWVudGF0aW9ucywgc2hhcGVkSWNvbiwgaW1hZ2VNYXAsIHNpemVzLCBsYXlvdXRUZXh0U2l6ZSwgbGF5b3V0SWNvblNpemUsIHRleHRPZmZzZXQsIGlzU0RGSWNvbiwgYXZhaWxhYmxlSW1hZ2VzLCBjYW5vbmljYWwsIHByb2plY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dDb2xsaXNpb25Cb3hlcykge1xuICAgICAgICBidWNrZXQuZ2VuZXJhdGVDb2xsaXNpb25EZWJ1Z0J1ZmZlcnModGlsZVpvb20sIGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheSk7XG4gICAgfVxufVxuXG4vLyBDaG9vc2UgdGhlIGp1c3RpZmljYXRpb24gdGhhdCBtYXRjaGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIFRleHRBbmNob3JcbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmNob3JKdXN0aWZpY2F0aW9uKGFuY2hvcjogVGV4dEFuY2hvcik6IFRleHRKdXN0aWZ5ICB7XG4gICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH1cbiAgICByZXR1cm4gJ2NlbnRlcic7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBmZWF0dXJlIGFuZCBpdHMgc2hhcGVkIHRleHQgYW5kIGljb24gZGF0YSwgYWRkIGEgJ3N5bWJvbFxuICogaW5zdGFuY2UnIGZvciBlYWNoIF9wb3NzaWJsZV8gcGxhY2VtZW50IG9mIHRoZSBzeW1ib2wgZmVhdHVyZS5cbiAqIChBdCByZW5kZXIgdGltZVBsYWNlU3ltYm9scyNwbGFjZSgpIHNlbGVjdHMgd2hpY2ggb2YgdGhlc2UgaW5zdGFuY2VzIHRvXG4gKiBzaG93IG9yIGhpZGUgYmFzZWQgb24gY29sbGlzaW9ucyB3aXRoIHN5bWJvbHMgaW4gb3RoZXIgbGF5ZXJzLilcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZEZlYXR1cmUoYnVja2V0OiBTeW1ib2xCdWNrZXQsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFN5bWJvbEZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnM6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogUG9zaXRpb25lZEljb24gfCB2b2lkLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZU1hcDoge1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZXM6IFNpemVzLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRUZXh0U2l6ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRJY29uU2l6ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgICBpc1NERkljb246IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsXG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb246IFByb2plY3Rpb24pIHtcbiAgICAvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBsYWJlbHMgdGhhdCBqdW1wIGFyb3VuZCB3aGVuIHpvb21pbmcgd2UgbmVlZFxuICAgIC8vIHRvIHVzZSBhIHRleHQtc2l6ZSB2YWx1ZSB0aGF0IGlzIHRoZSBzYW1lIGZvciBhbGwgem9vbSBsZXZlbHMuXG4gICAgLy8gYnVja2V0IGNhbGN1bGF0ZXMgdGV4dC1zaXplIGF0IGEgaGlnaCB6b29tIGxldmVsIHNvIHRoYXQgYWxsIHRpbGVzIGNhblxuICAgIC8vIHVzZSB0aGUgc2FtZSB2YWx1ZSB3aGVuIGNhbGN1bGF0aW5nIGFuY2hvciBwb3NpdGlvbnMuXG4gICAgbGV0IHRleHRNYXhTaXplID0gc2l6ZXMudGV4dE1heFNpemUuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgaWYgKHRleHRNYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGV4dE1heFNpemUgPSBsYXlvdXRUZXh0U2l6ZTtcbiAgICB9XG4gICAgY29uc3QgbGF5b3V0ID0gYnVja2V0LmxheWVyc1swXS5sYXlvdXQ7XG4gICAgY29uc3QgaWNvbk9mZnNldCA9IGxheW91dC5nZXQoJ2ljb24tb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgY29uc3QgZGVmYXVsdFNoYXBpbmcgPSBnZXREZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmcoc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsKSB8fCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsO1xuICAgIGNvbnN0IGdseXBoU2l6ZSA9IE9ORV9FTSxcbiAgICAgICAgZm9udFNjYWxlID0gbGF5b3V0VGV4dFNpemUgLyBnbHlwaFNpemUsXG4gICAgICAgIHRleHRNYXhCb3hTY2FsZSA9IGJ1Y2tldC50aWxlUGl4ZWxSYXRpbyAqIHRleHRNYXhTaXplIC8gZ2x5cGhTaXplLFxuICAgICAgICBpY29uQm94U2NhbGUgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiBsYXlvdXRJY29uU2l6ZSxcbiAgICAgICAgc3ltYm9sTWluRGlzdGFuY2UgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiBsYXlvdXQuZ2V0KCdzeW1ib2wtc3BhY2luZycpLFxuICAgICAgICB0ZXh0UGFkZGluZyA9IGxheW91dC5nZXQoJ3RleHQtcGFkZGluZycpICogYnVja2V0LnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICBpY29uUGFkZGluZyA9IGxheW91dC5nZXQoJ2ljb24tcGFkZGluZycpICogYnVja2V0LnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICB0ZXh0TWF4QW5nbGUgPSBkZWdUb1JhZChsYXlvdXQuZ2V0KCd0ZXh0LW1heC1hbmdsZScpKSxcbiAgICAgICAgdGV4dEFsb25nTGluZSA9IGxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnICYmIGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSAhPT0gJ3BvaW50JyxcbiAgICAgICAgaWNvbkFsb25nTGluZSA9IGxheW91dC5nZXQoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnICYmIGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSAhPT0gJ3BvaW50JyxcbiAgICAgICAgc3ltYm9sUGxhY2VtZW50ID0gbGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpLFxuICAgICAgICB0ZXh0UmVwZWF0RGlzdGFuY2UgPSBzeW1ib2xNaW5EaXN0YW5jZSAvIDI7XG5cbiAgICBjb25zdCBpY29uVGV4dEZpdCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKTtcbiAgICBsZXQgdmVydGljYWxseVNoYXBlZEljb247XG5cbiAgICAvLyBBZGp1c3Qgc2hhcGVkIGljb24gc2l6ZSB3aGVuIGljb24tdGV4dC1maXQgaXMgdXNlZC5cbiAgICBpZiAoc2hhcGVkSWNvbiAmJiBpY29uVGV4dEZpdCAhPT0gJ25vbmUnKSB7XG4gICAgICAgIGlmIChidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICB2ZXJ0aWNhbGx5U2hhcGVkSWNvbiA9IGZpdEljb25Ub1RleHQoc2hhcGVkSWNvbiwgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCwgaWNvblRleHRGaXQsXG4gICAgICAgICAgICAgICAgbGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdC1wYWRkaW5nJyksIGljb25PZmZzZXQsIGZvbnRTY2FsZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZmF1bHRTaGFwaW5nKSB7XG4gICAgICAgICAgICBzaGFwZWRJY29uID0gZml0SWNvblRvVGV4dChzaGFwZWRJY29uLCBkZWZhdWx0U2hhcGluZywgaWNvblRleHRGaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0LXBhZGRpbmcnKSwgaWNvbk9mZnNldCwgZm9udFNjYWxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFkZFN5bWJvbEF0QW5jaG9yID0gKGxpbmUsIGFuY2hvciwgY2Fub25pY2FsSWQpID0+IHtcbiAgICAgICAgaWYgKGFuY2hvci54IDwgMCB8fCBhbmNob3IueCA+PSBFWFRFTlQgfHwgYW5jaG9yLnkgPCAwIHx8IGFuY2hvci55ID49IEVYVEVOVCkge1xuICAgICAgICAgICAgLy8gU3ltYm9sIGxheWVycyBhcmUgZHJhd24gYWNyb3NzIHRpbGUgYm91bmRhcmllcywgV2UgZmlsdGVyIG91dCBzeW1ib2xzXG4gICAgICAgICAgICAvLyBvdXRzaWRlIG91ciB0aWxlIGJvdW5kYXJpZXMgKHdoaWNoIG1heSBiZSBpbmNsdWRlZCBpbiB2ZWN0b3IgdGlsZSBidWZmZXJzKVxuICAgICAgICAgICAgLy8gdG8gcHJldmVudCBkb3VibGUtZHJhd2luZyBzeW1ib2xzLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qge3gsIHksIHp9ID0gcHJvamVjdGlvbi5wcm9qZWN0VGlsZVBvaW50KGFuY2hvci54LCBhbmNob3IueSwgY2Fub25pY2FsSWQpO1xuICAgICAgICBjb25zdCBwcm9qZWN0ZWRBbmNob3IgPSBuZXcgQW5jaG9yKHgsIHksIHosIDAsIHVuZGVmaW5lZCk7XG5cbiAgICAgICAgYWRkU3ltYm9sKGJ1Y2tldCwgYW5jaG9yLCBwcm9qZWN0ZWRBbmNob3IsIGxpbmUsIHNoYXBlZFRleHRPcmllbnRhdGlvbnMsIHNoYXBlZEljb24sIGltYWdlTWFwLCB2ZXJ0aWNhbGx5U2hhcGVkSWNvbiwgYnVja2V0LmxheWVyc1swXSxcbiAgICAgICAgICAgIGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheSwgZmVhdHVyZS5pbmRleCwgZmVhdHVyZS5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgYnVja2V0LmluZGV4LCB0ZXh0UGFkZGluZywgdGV4dEFsb25nTGluZSwgdGV4dE9mZnNldCxcbiAgICAgICAgICAgIGljb25Cb3hTY2FsZSwgaWNvblBhZGRpbmcsIGljb25BbG9uZ0xpbmUsIGljb25PZmZzZXQsXG4gICAgICAgICAgICBmZWF0dXJlLCBzaXplcywgaXNTREZJY29uLCBhdmFpbGFibGVJbWFnZXMsIGNhbm9uaWNhbCk7XG4gICAgfTtcblxuICAgIGlmIChzeW1ib2xQbGFjZW1lbnQgPT09ICdsaW5lJykge1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgY2xpcExpbmUoZmVhdHVyZS5nZW9tZXRyeSwgMCwgMCwgRVhURU5ULCBFWFRFTlQpKSB7XG4gICAgICAgICAgICBjb25zdCBhbmNob3JzID0gZ2V0QW5jaG9ycyhcbiAgICAgICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgICAgIHN5bWJvbE1pbkRpc3RhbmNlLFxuICAgICAgICAgICAgICAgIHRleHRNYXhBbmdsZSxcbiAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsIHx8IGRlZmF1bHRTaGFwaW5nLFxuICAgICAgICAgICAgICAgIHNoYXBlZEljb24sXG4gICAgICAgICAgICAgICAgZ2x5cGhTaXplLFxuICAgICAgICAgICAgICAgIHRleHRNYXhCb3hTY2FsZSxcbiAgICAgICAgICAgICAgICBidWNrZXQub3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICAgICAgRVhURU5UXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhbmNob3Igb2YgYW5jaG9ycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBlZFRleHQgPSBkZWZhdWx0U2hhcGluZztcbiAgICAgICAgICAgICAgICBpZiAoIXNoYXBlZFRleHQgfHwgIWFuY2hvcklzVG9vQ2xvc2UoYnVja2V0LCBzaGFwZWRUZXh0LnRleHQsIHRleHRSZXBlYXREaXN0YW5jZSwgYW5jaG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihsaW5lLCBhbmNob3IsIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChzeW1ib2xQbGFjZW1lbnQgPT09ICdsaW5lLWNlbnRlcicpIHtcbiAgICAgICAgLy8gTm8gY2xpcHBpbmcsIG11bHRpcGxlIGxpbmVzIHBlciBmZWF0dXJlIGFyZSBhbGxvd2VkXG4gICAgICAgIC8vIFwibGluZXNcIiB3aXRoIG9ubHkgb25lIHBvaW50IGFyZSBpZ25vcmVkIGFzIGluIGNsaXBMaW5lc1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGdldENlbnRlckFuY2hvcihcbiAgICAgICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dE1heEFuZ2xlLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsIHx8IGRlZmF1bHRTaGFwaW5nLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZWRJY29uLFxuICAgICAgICAgICAgICAgICAgICBnbHlwaFNpemUsXG4gICAgICAgICAgICAgICAgICAgIHRleHRNYXhCb3hTY2FsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihsaW5lLCBhbmNob3IsIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGNvbnN0IHBvbHlnb24gb2YgY2xhc3NpZnlSaW5ncyhmZWF0dXJlLmdlb21ldHJ5LCAwKSkge1xuICAgICAgICAgICAgLy8gMTYgaGVyZSByZXByZXNlbnRzIDIgcGl4ZWxzXG4gICAgICAgICAgICBjb25zdCBwb2kgPSBmaW5kUG9sZU9mSW5hY2Nlc3NpYmlsaXR5KHBvbHlnb24sIDE2KTtcbiAgICAgICAgICAgIGFkZFN5bWJvbEF0QW5jaG9yKHBvbHlnb25bMF0sIG5ldyBBbmNob3IocG9pLngsIHBvaS55LCAwLCAwLCB1bmRlZmluZWQpLCBjYW5vbmljYWwpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzgwOFxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgYWRkU3ltYm9sQXRBbmNob3IobGluZSwgbmV3IEFuY2hvcihsaW5lWzBdLngsIGxpbmVbMF0ueSwgMCwgMCwgdW5kZWZpbmVkKSwgY2Fub25pY2FsKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmVhdHVyZS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnRzIG9mIGZlYXR1cmUuZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgYWRkU3ltYm9sQXRBbmNob3IoW3BvaW50XSwgbmV3IEFuY2hvcihwb2ludC54LCBwb2ludC55LCAwLCAwLCB1bmRlZmluZWQpLCBjYW5vbmljYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBNQVhfR0xZUEhfSUNPTl9TSVpFID0gMjU1O1xuY29uc3QgTUFYX1BBQ0tFRF9TSVpFID0gTUFYX0dMWVBIX0lDT05fU0laRSAqIFNJWkVfUEFDS19GQUNUT1I7XG5leHBvcnQge01BWF9QQUNLRURfU0laRX07XG5cbmZ1bmN0aW9uIGFkZFRleHRWZXJ0aWNlcyhidWNrZXQ6IFN5bWJvbEJ1Y2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3I6IFBvaW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVBbmNob3I6IFBvaW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHQ6IFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXA6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBTeW1ib2xGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgbGluZUFycmF5OiB7bGluZVN0YXJ0SW5kZXg6IG51bWJlciwgbGluZUxlbmd0aDogbnVtYmVyfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nTW9kZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudFR5cGVzOiBBcnJheTwndmVydGljYWwnIHwgJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnPixcbiAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlczoge1tfOiBzdHJpbmddOiBudW1iZXJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZEljb25JbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzOiBTaXplcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICBjb25zdCBnbHlwaFF1YWRzID0gZ2V0R2x5cGhRdWFkcyhhbmNob3IsIHNoYXBlZFRleHQsIHRleHRPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsIHRleHRBbG9uZ0xpbmUsIGZlYXR1cmUsIGltYWdlTWFwLCBidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCk7XG5cbiAgICBjb25zdCBzaXplRGF0YSA9IGJ1Y2tldC50ZXh0U2l6ZURhdGE7XG4gICAgbGV0IHRleHRTaXplRGF0YSA9IG51bGw7XG5cbiAgICBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgdGV4dFNpemVEYXRhID0gW1xuICAgICAgICAgICAgU0laRV9QQUNLX0ZBQ1RPUiAqIGxheWVyLmxheW91dC5nZXQoJ3RleHQtc2l6ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0ZXh0U2l6ZURhdGFbMF0gPiBNQVhfUEFDS0VEX1NJWkUpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGAke2J1Y2tldC5sYXllcklkc1swXX06IFZhbHVlIGZvciBcInRleHQtc2l6ZVwiIGlzID49ICR7TUFYX0dMWVBIX0lDT05fU0laRX0uIFJlZHVjZSB5b3VyIFwidGV4dC1zaXplXCIuYCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgIHRleHRTaXplRGF0YSA9IFtcbiAgICAgICAgICAgIFNJWkVfUEFDS19GQUNUT1IgKiBzaXplcy5jb21wb3NpdGVUZXh0U2l6ZXNbMF0uZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCksXG4gICAgICAgICAgICBTSVpFX1BBQ0tfRkFDVE9SICogc2l6ZXMuY29tcG9zaXRlVGV4dFNpemVzWzFdLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0ZXh0U2l6ZURhdGFbMF0gPiBNQVhfUEFDS0VEX1NJWkUgfHwgdGV4dFNpemVEYXRhWzFdID4gTUFYX1BBQ0tFRF9TSVpFKSB7XG4gICAgICAgICAgICB3YXJuT25jZShgJHtidWNrZXQubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJ0ZXh0LXNpemVcIiBpcyA+PSAke01BWF9HTFlQSF9JQ09OX1NJWkV9LiBSZWR1Y2UgeW91ciBcInRleHQtc2l6ZVwiLmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVja2V0LmFkZFN5bWJvbHMoXG4gICAgICAgIGJ1Y2tldC50ZXh0LFxuICAgICAgICBnbHlwaFF1YWRzLFxuICAgICAgICB0ZXh0U2l6ZURhdGEsXG4gICAgICAgIHRleHRPZmZzZXQsXG4gICAgICAgIHRleHRBbG9uZ0xpbmUsXG4gICAgICAgIGZlYXR1cmUsXG4gICAgICAgIHdyaXRpbmdNb2RlLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHRpbGVBbmNob3IsXG4gICAgICAgIGxpbmVBcnJheS5saW5lU3RhcnRJbmRleCxcbiAgICAgICAgbGluZUFycmF5LmxpbmVMZW5ndGgsXG4gICAgICAgIHBsYWNlZEljb25JbmRleCxcbiAgICAgICAgYXZhaWxhYmxlSW1hZ2VzLFxuICAgICAgICBjYW5vbmljYWwpO1xuXG4gICAgLy8gVGhlIHBsYWNlZFN5bWJvbEFycmF5IGlzIHVzZWQgYXQgcmVuZGVyIHRpbWUgaW4gZHJhd1RpbGVTeW1ib2xzXG4gICAgLy8gVGhlc2UgaW5kaWNlcyBhbGxvdyBhY2Nlc3MgdG8gdGhlIGFycmF5IGF0IGNvbGxpc2lvbiBkZXRlY3Rpb24gdGltZVxuICAgIGZvciAoY29uc3QgcGxhY2VtZW50VHlwZSBvZiBwbGFjZW1lbnRUeXBlcykge1xuICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlc1twbGFjZW1lbnRUeXBlXSA9IGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5Lmxlbmd0aCAtIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdseXBoUXVhZHMubGVuZ3RoICogNDtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEhvcml6b250YWxTaGFwaW5nKGhvcml6b250YWxTaGFwaW5nOiB7W186IFRleHRKdXN0aWZ5XTogU2hhcGluZ30pOiBTaGFwaW5nIHwgbnVsbCB7XG4gICAgLy8gV2UgZG9uJ3QgY2FyZSB3aGljaCBzaGFwaW5nIHdlIGdldCBiZWNhdXNlIHRoaXMgaXMgdXNlZCBmb3IgY29sbGlzaW9uIHB1cnBvc2VzXG4gICAgLy8gYW5kIGFsbCB0aGUganVzdGlmaWNhdGlvbnMgaGF2ZSB0aGUgc2FtZSBjb2xsaXNpb24gYm94XG4gICAgZm9yIChjb25zdCBqdXN0aWZpY2F0aW9uOiBhbnkgaW4gaG9yaXpvbnRhbFNoYXBpbmcpIHtcbiAgICAgICAgcmV0dXJuIGhvcml6b250YWxTaGFwaW5nW2p1c3RpZmljYXRpb25dO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQm94Q29sbGlzaW9uRmVhdHVyZShjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGVkQW5jaG9yOiBBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZUFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZDogT2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0OiA/W251bWJlciwgbnVtYmVyXSk6IG51bWJlciB7XG4gICAgbGV0IHkxID0gc2hhcGVkLnRvcDtcbiAgICBsZXQgeTIgPSBzaGFwZWQuYm90dG9tO1xuICAgIGxldCB4MSA9IHNoYXBlZC5sZWZ0O1xuICAgIGxldCB4MiA9IHNoYXBlZC5yaWdodDtcblxuICAgIGNvbnN0IGNvbGxpc2lvblBhZGRpbmcgPSBzaGFwZWQuY29sbGlzaW9uUGFkZGluZztcbiAgICBpZiAoY29sbGlzaW9uUGFkZGluZykge1xuICAgICAgICB4MSAtPSBjb2xsaXNpb25QYWRkaW5nWzBdO1xuICAgICAgICB5MSAtPSBjb2xsaXNpb25QYWRkaW5nWzFdO1xuICAgICAgICB4MiArPSBjb2xsaXNpb25QYWRkaW5nWzJdO1xuICAgICAgICB5MiArPSBjb2xsaXNpb25QYWRkaW5nWzNdO1xuICAgIH1cblxuICAgIGlmIChyb3RhdGUpIHtcbiAgICAgICAgLy8gQWNjb3VudCBmb3IgKi1yb3RhdGUgaW4gcG9pbnQgY29sbGlzaW9uIGJveGVzXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNjA3NVxuICAgICAgICAvLyBEb2Vzbid0IGFjY291bnQgZm9yIGljb24tdGV4dC1maXRcblxuICAgICAgICBjb25zdCB0bCA9IG5ldyBQb2ludCh4MSwgeTEpO1xuICAgICAgICBjb25zdCB0ciA9IG5ldyBQb2ludCh4MiwgeTEpO1xuICAgICAgICBjb25zdCBibCA9IG5ldyBQb2ludCh4MSwgeTIpO1xuICAgICAgICBjb25zdCBiciA9IG5ldyBQb2ludCh4MiwgeTIpO1xuXG4gICAgICAgIGNvbnN0IHJvdGF0ZVJhZGlhbnMgPSBkZWdUb1JhZChyb3RhdGUpO1xuICAgICAgICBsZXQgcm90YXRlQ2VudGVyID0gbmV3IFBvaW50KDAsIDApO1xuXG4gICAgICAgIGlmICh0ZXh0T2Zmc2V0KSB7XG4gICAgICAgICAgICByb3RhdGVDZW50ZXIgPSBuZXcgUG9pbnQodGV4dE9mZnNldFswXSwgdGV4dE9mZnNldFsxXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0bC5fcm90YXRlQXJvdW5kKHJvdGF0ZVJhZGlhbnMsIHJvdGF0ZUNlbnRlcik7XG4gICAgICAgIHRyLl9yb3RhdGVBcm91bmQocm90YXRlUmFkaWFucywgcm90YXRlQ2VudGVyKTtcbiAgICAgICAgYmwuX3JvdGF0ZUFyb3VuZChyb3RhdGVSYWRpYW5zLCByb3RhdGVDZW50ZXIpO1xuICAgICAgICBici5fcm90YXRlQXJvdW5kKHJvdGF0ZVJhZGlhbnMsIHJvdGF0ZUNlbnRlcik7XG5cbiAgICAgICAgLy8gQ29sbGlzaW9uIGZlYXR1cmVzIHJlcXVpcmUgYW4gXCJvbi1heGlzXCIgZ2VvbWV0cnksXG4gICAgICAgIC8vIHNvIHRha2UgdGhlIGVudmVsb3BlIG9mIHRoZSByb3RhdGVkIGdlb21ldHJ5XG4gICAgICAgIC8vIChtYXkgYmUgcXVpdGUgbGFyZ2UgZm9yIHdpZGUgbGFiZWxzIHJvdGF0ZWQgNDUgZGVncmVlcylcbiAgICAgICAgeDEgPSBNYXRoLm1pbih0bC54LCB0ci54LCBibC54LCBici54KTtcbiAgICAgICAgeDIgPSBNYXRoLm1heCh0bC54LCB0ci54LCBibC54LCBici54KTtcbiAgICAgICAgeTEgPSBNYXRoLm1pbih0bC55LCB0ci55LCBibC55LCBici55KTtcbiAgICAgICAgeTIgPSBNYXRoLm1heCh0bC55LCB0ci55LCBibC55LCBici55KTtcbiAgICB9XG5cbiAgICBjb2xsaXNpb25Cb3hBcnJheS5lbXBsYWNlQmFjayhwcm9qZWN0ZWRBbmNob3IueCwgcHJvamVjdGVkQW5jaG9yLnksIHByb2plY3RlZEFuY2hvci56LCB0aWxlQW5jaG9yLngsIHRpbGVBbmNob3IueSwgeDEsIHkxLCB4MiwgeTIsIHBhZGRpbmcsIGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgpO1xuXG4gICAgcmV0dXJuIGNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCAtIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUNpcmNsZUNvbGxpc2lvbkZlYXR1cmUoc2hhcGVkOiBPYmplY3QpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAoc2hhcGVkLmNvbGxpc2lvblBhZGRpbmcpIHtcbiAgICAgICAgLy8gQ29tcHV0ZSBoZWlnaHQgb2YgdGhlIHNoYXBlIGluIGdseXBoIG1ldHJpY3MgYW5kIGFwcGx5IHBhZGRpbmcuXG4gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgcGl4ZWwgYmFzZWQgJ3RleHQtcGFkZGluZycgaXMgYXBwbGllZCBhdCBydW50aW1lXG4gICAgICAgIHNoYXBlZC50b3AgLT0gc2hhcGVkLmNvbGxpc2lvblBhZGRpbmdbMV07XG4gICAgICAgIHNoYXBlZC5ib3R0b20gKz0gc2hhcGVkLmNvbGxpc2lvblBhZGRpbmdbM107XG4gICAgfVxuXG4gICAgLy8gU2V0IG1pbmltdW0gYm94IGhlaWdodCB0byBhdm9pZCB2ZXJ5IG1hbnkgc21hbGwgbGFiZWxzXG4gICAgY29uc3QgaGVpZ2h0ID0gc2hhcGVkLmJvdHRvbSAtIHNoYXBlZC50b3A7XG4gICAgcmV0dXJuIGhlaWdodCA+IDAgPyBNYXRoLm1heCgxMCwgaGVpZ2h0KSA6IG51bGw7XG59XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIGxhYmVsICYgaWNvbiBwbGFjZW1lbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRkU3ltYm9sKGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgIGFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgIHByb2plY3RlZEFuY2hvcjogQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgIGxpbmU6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zOiBhbnksXG4gICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogUG9zaXRpb25lZEljb24gfCB2b2lkLFxuICAgICAgICAgICAgICAgICAgIGltYWdlTWFwOiB7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9LFxuICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsbHlTaGFwZWRJY29uOiBQb3NpdGlvbmVkSWNvbiB8IHZvaWQsXG4gICAgICAgICAgICAgICAgICAgbGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIHRleHRQYWRkaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgdGV4dEFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIGljb25Cb3hTY2FsZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIGljb25QYWRkaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgaWNvbkFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICBpY29uT2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFN5bWJvbEZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgc2l6ZXM6IFNpemVzLFxuICAgICAgICAgICAgICAgICAgIGlzU0RGSWNvbjogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sXG4gICAgICAgICAgICAgICAgICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICBjb25zdCBsaW5lQXJyYXkgPSBidWNrZXQuYWRkVG9MaW5lVmVydGV4QXJyYXkoYW5jaG9yLCBsaW5lKTtcbiAgICBsZXQgdGV4dEJveEluZGV4LCBpY29uQm94SW5kZXgsIHZlcnRpY2FsVGV4dEJveEluZGV4LCB2ZXJ0aWNhbEljb25Cb3hJbmRleDtcbiAgICBsZXQgdGV4dENpcmNsZSwgdmVydGljYWxUZXh0Q2lyY2xlLCB2ZXJ0aWNhbEljb25DaXJjbGU7XG5cbiAgICBsZXQgbnVtSWNvblZlcnRpY2VzID0gMDtcbiAgICBsZXQgbnVtVmVydGljYWxJY29uVmVydGljZXMgPSAwO1xuICAgIGxldCBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyA9IDA7XG4gICAgbGV0IG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA9IDA7XG4gICAgbGV0IHBsYWNlZEljb25TeW1ib2xJbmRleCA9IC0xO1xuICAgIGxldCB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCA9IC0xO1xuICAgIGNvbnN0IHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzID0ge307XG4gICAgbGV0IGtleSA9IG11cm11cjMoJycpO1xuXG4gICAgbGV0IHRleHRPZmZzZXQwID0gMDtcbiAgICBsZXQgdGV4dE9mZnNldDEgPSAwO1xuICAgIGlmIChsYXllci5fdW5ldmFsdWF0ZWRMYXlvdXQuZ2V0VmFsdWUoJ3RleHQtcmFkaWFsLW9mZnNldCcpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgW3RleHRPZmZzZXQwLCB0ZXh0T2Zmc2V0MV0gPSAobGF5ZXIubGF5b3V0LmdldCgndGV4dC1vZmZzZXQnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKS5tYXAodCA9PiB0ICogT05FX0VNKTogYW55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0T2Zmc2V0MCA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtcmFkaWFsLW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpICogT05FX0VNO1xuICAgICAgICB0ZXh0T2Zmc2V0MSA9IElOVkFMSURfVEVYVF9PRkZTRVQ7XG4gICAgfVxuXG4gICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwpIHtcbiAgICAgICAgY29uc3QgdmVydGljYWxTaGFwaW5nID0gc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbDtcbiAgICAgICAgaWYgKHRleHRBbG9uZ0xpbmUpIHtcbiAgICAgICAgICAgIHZlcnRpY2FsVGV4dENpcmNsZSA9IGV2YWx1YXRlQ2lyY2xlQ29sbGlzaW9uRmVhdHVyZSh2ZXJ0aWNhbFNoYXBpbmcpO1xuICAgICAgICAgICAgaWYgKHZlcnRpY2FsbHlTaGFwZWRJY29uKSB7XG4gICAgICAgICAgICAgICAgdmVydGljYWxJY29uQ2lyY2xlID0gZXZhbHVhdGVDaXJjbGVDb2xsaXNpb25GZWF0dXJlKHZlcnRpY2FsbHlTaGFwZWRJY29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRSb3RhdGlvbiA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtcm90YXRlJykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbFRleHRSb3RhdGlvbiA9IHRleHRSb3RhdGlvbiArIDkwLjA7XG4gICAgICAgICAgICB2ZXJ0aWNhbFRleHRCb3hJbmRleCA9IGV2YWx1YXRlQm94Q29sbGlzaW9uRmVhdHVyZShjb2xsaXNpb25Cb3hBcnJheSwgcHJvamVjdGVkQW5jaG9yLCBhbmNob3IsIGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgsIHZlcnRpY2FsU2hhcGluZywgdGV4dFBhZGRpbmcsIHZlcnRpY2FsVGV4dFJvdGF0aW9uLCB0ZXh0T2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICh2ZXJ0aWNhbGx5U2hhcGVkSWNvbikge1xuICAgICAgICAgICAgICAgIHZlcnRpY2FsSWNvbkJveEluZGV4ID0gZXZhbHVhdGVCb3hDb2xsaXNpb25GZWF0dXJlKGNvbGxpc2lvbkJveEFycmF5LCBwcm9qZWN0ZWRBbmNob3IsIGFuY2hvciwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCwgdmVydGljYWxseVNoYXBlZEljb24sIGljb25QYWRkaW5nLCB2ZXJ0aWNhbFRleHRSb3RhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvL1BsYWNlIGljb24gZmlyc3QsIHNvIHRleHQgY2FuIGhhdmUgYSByZWZlcmVuY2UgdG8gaXRzIGluZGV4IGluIHRoZSBwbGFjZWQgc3ltYm9sIGFycmF5LlxuICAgIC8vVGV4dCBzeW1ib2xzIGNhbiBsYXppbHkgc2hpZnQgYXQgcmVuZGVyLXRpbWUgYmVjYXVzZSBvZiB2YXJpYWJsZSBhbmNob3IgcGxhY2VtZW50LlxuICAgIC8vSWYgdGhlIHN0eWxlIHNwZWNpZmllcyBhbiBgaWNvbi10ZXh0LWZpdGAgdGhlbiB0aGUgaWNvbiB3b3VsZCBoYXZlIHRvIHNoaWZ0IGFsb25nIHdpdGggaXQuXG4gICAgLy8gRm9yIG1vcmUgaW5mbyBjaGVjayBgdXBkYXRlVmFyaWFibGVBbmNob3JzYCBpbiBgZHJhd19zeW1ib2wuanNgIC5cbiAgICBpZiAoc2hhcGVkSWNvbikge1xuICAgICAgICBjb25zdCBpY29uUm90YXRlID0gbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1yb3RhdGUnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgaGFzSWNvblRleHRGaXQgPSBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0JykgIT09ICdub25lJztcbiAgICAgICAgY29uc3QgaWNvblF1YWRzID0gZ2V0SWNvblF1YWRzKHNoYXBlZEljb24sIGljb25Sb3RhdGUsIGlzU0RGSWNvbiwgaGFzSWNvblRleHRGaXQpO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbEljb25RdWFkcyA9IHZlcnRpY2FsbHlTaGFwZWRJY29uID8gZ2V0SWNvblF1YWRzKHZlcnRpY2FsbHlTaGFwZWRJY29uLCBpY29uUm90YXRlLCBpc1NERkljb24sIGhhc0ljb25UZXh0Rml0KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWNvbkJveEluZGV4ID0gZXZhbHVhdGVCb3hDb2xsaXNpb25GZWF0dXJlKGNvbGxpc2lvbkJveEFycmF5LCBwcm9qZWN0ZWRBbmNob3IsIGFuY2hvciwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCwgc2hhcGVkSWNvbiwgaWNvblBhZGRpbmcsIGljb25Sb3RhdGUpO1xuICAgICAgICBudW1JY29uVmVydGljZXMgPSBpY29uUXVhZHMubGVuZ3RoICogNDtcblxuICAgICAgICBjb25zdCBzaXplRGF0YSA9IGJ1Y2tldC5pY29uU2l6ZURhdGE7XG4gICAgICAgIGxldCBpY29uU2l6ZURhdGEgPSBudWxsO1xuXG4gICAgICAgIGlmIChzaXplRGF0YS5raW5kID09PSAnc291cmNlJykge1xuICAgICAgICAgICAgaWNvblNpemVEYXRhID0gW1xuICAgICAgICAgICAgICAgIFNJWkVfUEFDS19GQUNUT1IgKiBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXNpemUnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChpY29uU2l6ZURhdGFbMF0gPiBNQVhfUEFDS0VEX1NJWkUpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZShgJHtidWNrZXQubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJpY29uLXNpemVcIiBpcyA+PSAke01BWF9HTFlQSF9JQ09OX1NJWkV9LiBSZWR1Y2UgeW91ciBcImljb24tc2l6ZVwiLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgICAgICBpY29uU2l6ZURhdGEgPSBbXG4gICAgICAgICAgICAgICAgU0laRV9QQUNLX0ZBQ1RPUiAqIHNpemVzLmNvbXBvc2l0ZUljb25TaXplc1swXS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKSxcbiAgICAgICAgICAgICAgICBTSVpFX1BBQ0tfRkFDVE9SICogc2l6ZXMuY29tcG9zaXRlSWNvblNpemVzWzFdLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGljb25TaXplRGF0YVswXSA+IE1BWF9QQUNLRURfU0laRSB8fCBpY29uU2l6ZURhdGFbMV0gPiBNQVhfUEFDS0VEX1NJWkUpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZShgJHtidWNrZXQubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJpY29uLXNpemVcIiBpcyA+PSAke01BWF9HTFlQSF9JQ09OX1NJWkV9LiBSZWR1Y2UgeW91ciBcImljb24tc2l6ZVwiLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnVja2V0LmFkZFN5bWJvbHMoXG4gICAgICAgICAgICBidWNrZXQuaWNvbixcbiAgICAgICAgICAgIGljb25RdWFkcyxcbiAgICAgICAgICAgIGljb25TaXplRGF0YSxcbiAgICAgICAgICAgIGljb25PZmZzZXQsXG4gICAgICAgICAgICBpY29uQWxvbmdMaW5lLFxuICAgICAgICAgICAgZmVhdHVyZSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgcHJvamVjdGVkQW5jaG9yLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgbGluZUFycmF5LmxpbmVTdGFydEluZGV4LFxuICAgICAgICAgICAgbGluZUFycmF5LmxpbmVMZW5ndGgsXG4gICAgICAgICAgICAvLyBUaGUgaWNvbiBpdHNlbGYgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIHN5bWJvbCBzaW5jZSB0aGUgdGV4dCBpc250IHBsYWNlZCB5ZXRcbiAgICAgICAgICAgIC0xLFxuICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzLFxuICAgICAgICAgICAgY2Fub25pY2FsKTtcblxuICAgICAgICBwbGFjZWRJY29uU3ltYm9sSW5kZXggPSBidWNrZXQuaWNvbi5wbGFjZWRTeW1ib2xBcnJheS5sZW5ndGggLSAxO1xuXG4gICAgICAgIGlmICh2ZXJ0aWNhbEljb25RdWFkcykge1xuICAgICAgICAgICAgbnVtVmVydGljYWxJY29uVmVydGljZXMgPSB2ZXJ0aWNhbEljb25RdWFkcy5sZW5ndGggKiA0O1xuXG4gICAgICAgICAgICBidWNrZXQuYWRkU3ltYm9scyhcbiAgICAgICAgICAgICAgICBidWNrZXQuaWNvbixcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbEljb25RdWFkcyxcbiAgICAgICAgICAgICAgICBpY29uU2l6ZURhdGEsXG4gICAgICAgICAgICAgICAgaWNvbk9mZnNldCxcbiAgICAgICAgICAgICAgICBpY29uQWxvbmdMaW5lLFxuICAgICAgICAgICAgICAgIGZlYXR1cmUsXG4gICAgICAgICAgICAgICAgV3JpdGluZ01vZGUudmVydGljYWwsXG4gICAgICAgICAgICAgICAgcHJvamVjdGVkQW5jaG9yLFxuICAgICAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgICAgICBsaW5lQXJyYXkubGluZVN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgbGluZUFycmF5LmxpbmVMZW5ndGgsXG4gICAgICAgICAgICAgICAgLy8gVGhlIGljb24gaXRzZWxmIGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBzeW1ib2wgc2luY2UgdGhlIHRleHQgaXNudCBwbGFjZWQgeWV0XG4gICAgICAgICAgICAgICAgLTEsXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzLFxuICAgICAgICAgICAgICAgIGNhbm9uaWNhbCk7XG5cbiAgICAgICAgICAgIHZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4ID0gYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXkubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QganVzdGlmaWNhdGlvbjogYW55IGluIHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCkge1xuICAgICAgICBjb25zdCBzaGFwaW5nID0gc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsW2p1c3RpZmljYXRpb25dO1xuXG4gICAgICAgIGlmICghdGV4dEJveEluZGV4KSB7XG4gICAgICAgICAgICBrZXkgPSBtdXJtdXIzKHNoYXBpbmcudGV4dCk7XG4gICAgICAgICAgICAvLyBBcyBhIGNvbGxpc2lvbiBhcHByb3hpbWF0aW9uLCB3ZSBjYW4gdXNlIGVpdGhlciB0aGUgdmVydGljYWwgb3IgYW55IG9mIHRoZSBob3Jpem9udGFsIHZlcnNpb25zIG9mIHRoZSBmZWF0dXJlXG4gICAgICAgICAgICAvLyBXZSdyZSBjb3VudGluZyBvbiBhbGwgdmVyc2lvbnMgaGF2aW5nIHNpbWlsYXIgZGltZW5zaW9uc1xuICAgICAgICAgICAgaWYgKHRleHRBbG9uZ0xpbmUpIHtcbiAgICAgICAgICAgICAgICB0ZXh0Q2lyY2xlID0gZXZhbHVhdGVDaXJjbGVDb2xsaXNpb25GZWF0dXJlKHNoYXBpbmcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Um90YXRlID0gbGF5ZXIubGF5b3V0LmdldCgndGV4dC1yb3RhdGUnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKTtcbiAgICAgICAgICAgICAgICB0ZXh0Qm94SW5kZXggPSBldmFsdWF0ZUJveENvbGxpc2lvbkZlYXR1cmUoY29sbGlzaW9uQm94QXJyYXksIHByb2plY3RlZEFuY2hvciwgYW5jaG9yLCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCBzaGFwaW5nLCB0ZXh0UGFkZGluZywgdGV4dFJvdGF0ZSwgdGV4dE9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaW5nbGVMaW5lID0gc2hhcGluZy5wb3NpdGlvbmVkTGluZXMubGVuZ3RoID09PSAxO1xuICAgICAgICBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyArPSBhZGRUZXh0VmVydGljZXMoXG4gICAgICAgICAgICBidWNrZXQsIHByb2plY3RlZEFuY2hvciwgYW5jaG9yLCBzaGFwaW5nLCBpbWFnZU1hcCwgbGF5ZXIsIHRleHRBbG9uZ0xpbmUsIGZlYXR1cmUsIHRleHRPZmZzZXQsIGxpbmVBcnJheSxcbiAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwgPyBXcml0aW5nTW9kZS5ob3Jpem9udGFsIDogV3JpdGluZ01vZGUuaG9yaXpvbnRhbE9ubHksXG4gICAgICAgICAgICBzaW5nbGVMaW5lID8gKE9iamVjdC5rZXlzKHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbCk6IGFueSkgOiBbanVzdGlmaWNhdGlvbl0sXG4gICAgICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcywgcGxhY2VkSWNvblN5bWJvbEluZGV4LCBzaXplcywgYXZhaWxhYmxlSW1hZ2VzLCBjYW5vbmljYWwpO1xuXG4gICAgICAgIGlmIChzaW5nbGVMaW5lKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsKSB7XG4gICAgICAgIG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyArPSBhZGRUZXh0VmVydGljZXMoXG4gICAgICAgICAgICBidWNrZXQsIHByb2plY3RlZEFuY2hvciwgYW5jaG9yLCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsLCBpbWFnZU1hcCwgbGF5ZXIsIHRleHRBbG9uZ0xpbmUsIGZlYXR1cmUsXG4gICAgICAgICAgICB0ZXh0T2Zmc2V0LCBsaW5lQXJyYXksIFdyaXRpbmdNb2RlLnZlcnRpY2FsLCBbJ3ZlcnRpY2FsJ10sIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLCB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCwgc2l6ZXMsIGF2YWlsYWJsZUltYWdlcywgY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBydW50aW1lIGNvbGxpc2lvbiBjaXJjbGVzIHNob3VsZCBiZSB1c2VkIGZvciBhbnkgb2YgdGhlIGNvbGxpc2lvbiBmZWF0dXJlcy5cbiAgICAvLyBJdCBpcyBlbm91Z2ggdG8gY2hvb3NlIHRoZSB0YWxsZXN0IGZlYXR1cmUgc2hhcGUgYXMgY2lyY2xlcyBhcmUgYWx3YXlzIHBsYWNlZCBvbiBhIGxpbmUuXG4gICAgLy8gQWxsIG1lYXN1cmVtZW50cyBhcmUgaW4gZ2x5cGggbWV0cmljcyBhbmQgbGF0ZXIgY29udmVydGVkIGludG8gcGl4ZWxzIHVzaW5nIHByb3BlciBmb250IHNpemUgXCJsYXlvdXRUZXh0U2l6ZVwiXG4gICAgbGV0IGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyID0gLTE7XG5cbiAgICBjb25zdCBnZXRDb2xsaXNpb25DaXJjbGVIZWlnaHQgPSAoZGlhbWV0ZXI6ID9udW1iZXIsIHByZXZIZWlnaHQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiBkaWFtZXRlciA/IE1hdGgubWF4KGRpYW1ldGVyLCBwcmV2SGVpZ2h0KSA6IHByZXZIZWlnaHQ7XG4gICAgfTtcblxuICAgIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyID0gZ2V0Q29sbGlzaW9uQ2lyY2xlSGVpZ2h0KHRleHRDaXJjbGUsIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyKTtcbiAgICBjb2xsaXNpb25DaXJjbGVEaWFtZXRlciA9IGdldENvbGxpc2lvbkNpcmNsZUhlaWdodCh2ZXJ0aWNhbFRleHRDaXJjbGUsIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyKTtcbiAgICBjb2xsaXNpb25DaXJjbGVEaWFtZXRlciA9IGdldENvbGxpc2lvbkNpcmNsZUhlaWdodCh2ZXJ0aWNhbEljb25DaXJjbGUsIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyKTtcbiAgICBjb25zdCB1c2VSdW50aW1lQ29sbGlzaW9uQ2lyY2xlcyA9IChjb2xsaXNpb25DaXJjbGVEaWFtZXRlciA+IC0xKSA/IDEgOiAwO1xuXG4gICAgaWYgKGJ1Y2tldC5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCA+PSBTeW1ib2xCdWNrZXQuTUFYX0dMWVBIUykgd2Fybk9uY2UoXG4gICAgICAgIFwiVG9vIG1hbnkgZ2x5cGhzIGJlaW5nIHJlbmRlcmVkIGluIGEgdGlsZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTA3XCJcbiAgICApO1xuXG4gICAgaWYgKGZlYXR1cmUuc29ydEtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJ1Y2tldC5hZGRUb1NvcnRLZXlSYW5nZXMoYnVja2V0LnN5bWJvbEluc3RhbmNlcy5sZW5ndGgsIGZlYXR1cmUuc29ydEtleSk7XG4gICAgfVxuXG4gICAgYnVja2V0LnN5bWJvbEluc3RhbmNlcy5lbXBsYWNlQmFjayhcbiAgICAgICAgcHJvamVjdGVkQW5jaG9yLngsXG4gICAgICAgIHByb2plY3RlZEFuY2hvci55LFxuICAgICAgICBwcm9qZWN0ZWRBbmNob3IueixcbiAgICAgICAgYW5jaG9yLngsXG4gICAgICAgIGFuY2hvci55LFxuICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy5yaWdodCA+PSAwID8gcGxhY2VkVGV4dFN5bWJvbEluZGljZXMucmlnaHQgOiAtMSxcbiAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMuY2VudGVyID49IDAgPyBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy5jZW50ZXIgOiAtMSxcbiAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMubGVmdCA+PSAwID8gcGxhY2VkVGV4dFN5bWJvbEluZGljZXMubGVmdCA6IC0xLFxuICAgICAgICBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy52ZXJ0aWNhbCAgPj0gMCA/IHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLnZlcnRpY2FsIDogLTEsXG4gICAgICAgIHBsYWNlZEljb25TeW1ib2xJbmRleCxcbiAgICAgICAgdmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXgsXG4gICAgICAgIGtleSxcbiAgICAgICAgdGV4dEJveEluZGV4ICE9PSB1bmRlZmluZWQgPyB0ZXh0Qm94SW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICB0ZXh0Qm94SW5kZXggIT09IHVuZGVmaW5lZCA/IHRleHRCb3hJbmRleCArIDEgOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICB2ZXJ0aWNhbFRleHRCb3hJbmRleCAhPT0gdW5kZWZpbmVkID8gdmVydGljYWxUZXh0Qm94SW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICB2ZXJ0aWNhbFRleHRCb3hJbmRleCAhPT0gdW5kZWZpbmVkID8gdmVydGljYWxUZXh0Qm94SW5kZXggKyAxIDogYnVja2V0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgaWNvbkJveEluZGV4ICE9PSB1bmRlZmluZWQgPyBpY29uQm94SW5kZXggOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICBpY29uQm94SW5kZXggIT09IHVuZGVmaW5lZCA/IGljb25Cb3hJbmRleCArIDEgOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICB2ZXJ0aWNhbEljb25Cb3hJbmRleCA/IHZlcnRpY2FsSWNvbkJveEluZGV4IDogYnVja2V0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgdmVydGljYWxJY29uQm94SW5kZXggPyB2ZXJ0aWNhbEljb25Cb3hJbmRleCArIDEgOiBidWNrZXQuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoLFxuICAgICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICAgIG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzLFxuICAgICAgICBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMsXG4gICAgICAgIG51bUljb25WZXJ0aWNlcyxcbiAgICAgICAgbnVtVmVydGljYWxJY29uVmVydGljZXMsXG4gICAgICAgIHVzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzLFxuICAgICAgICAwLFxuICAgICAgICB0ZXh0T2Zmc2V0MCxcbiAgICAgICAgdGV4dE9mZnNldDEsXG4gICAgICAgIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyKTtcbn1cblxuZnVuY3Rpb24gYW5jaG9ySXNUb29DbG9zZShidWNrZXQ6IGFueSwgdGV4dDogc3RyaW5nLCByZXBlYXREaXN0YW5jZTogbnVtYmVyLCBhbmNob3I6IFBvaW50KSB7XG4gICAgY29uc3QgY29tcGFyZVRleHQgPSBidWNrZXQuY29tcGFyZVRleHQ7XG4gICAgaWYgKCEodGV4dCBpbiBjb21wYXJlVGV4dCkpIHtcbiAgICAgICAgY29tcGFyZVRleHRbdGV4dF0gPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBvdGhlckFuY2hvcnMgPSBjb21wYXJlVGV4dFt0ZXh0XTtcbiAgICAgICAgZm9yIChsZXQgayA9IG90aGVyQW5jaG9ycy5sZW5ndGggLSAxOyBrID49IDA7IGstLSkge1xuICAgICAgICAgICAgaWYgKGFuY2hvci5kaXN0KG90aGVyQW5jaG9yc1trXSkgPCByZXBlYXREaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgd2l0aGluIHJlcGVhdERpc3RhbmNlIG9mIG9uZSBhbmNob3IsIHN0b3AgbG9va2luZ1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIGFuY2hvciBpcyBub3Qgd2l0aGluIHJlcGVhdERpc3RhbmNlIG9mIGFueSBvdGhlciBhbmNob3IsIGFkZCB0byBhcnJheVxuICAgIGNvbXBhcmVUZXh0W3RleHRdLnB1c2goYW5jaG9yKTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3N5bWJvbExheW91dEF0dHJpYnV0ZXMsXG4gICAgY29sbGlzaW9uVmVydGV4QXR0cmlidXRlcyxcbiAgICBjb2xsaXNpb25WZXJ0ZXhBdHRyaWJ1dGVzRXh0LFxuICAgIGNvbGxpc2lvbkJveExheW91dCxcbiAgICBkeW5hbWljTGF5b3V0QXR0cmlidXRlc1xufSBmcm9tICcuL3N5bWJvbF9hdHRyaWJ1dGVzLmpzJztcblxuaW1wb3J0IHtTeW1ib2xMYXlvdXRBcnJheSxcbiAgICBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXksXG4gICAgU3ltYm9sT3BhY2l0eUFycmF5LFxuICAgIENvbGxpc2lvbkJveExheW91dEFycmF5LFxuICAgIENvbGxpc2lvblZlcnRleEV4dEFycmF5LFxuICAgIENvbGxpc2lvblZlcnRleEFycmF5LFxuICAgIFBsYWNlZFN5bWJvbEFycmF5LFxuICAgIFN5bWJvbEluc3RhbmNlQXJyYXksXG4gICAgR2x5cGhPZmZzZXRBcnJheSxcbiAgICBTeW1ib2xMaW5lVmVydGV4QXJyYXlcbn0gZnJvbSAnLi4vYXJyYXlfdHlwZXMuanMnO1xuXG5pbXBvcnQgT05FX0VNIGZyb20gJy4uLy4uL3N5bWJvbC9vbmVfZW0uanMnO1xuaW1wb3J0ICogYXMgc3ltYm9sU2l6ZSBmcm9tICcuLi8uLi9zeW1ib2wvc3ltYm9sX3NpemUuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vc2VnbWVudC5qcyc7XG5pbXBvcnQge1Byb2dyYW1Db25maWd1cmF0aW9uU2V0fSBmcm9tICcuLi9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHtUcmlhbmdsZUluZGV4QXJyYXksIExpbmVJbmRleEFycmF5fSBmcm9tICcuLi9pbmRleF9hcnJheV90eXBlLmpzJztcbmltcG9ydCB0cmFuc2Zvcm1UZXh0IGZyb20gJy4uLy4uL3N5bWJvbC90cmFuc2Zvcm1fdGV4dC5qcyc7XG5pbXBvcnQgbWVyZ2VMaW5lcyBmcm9tICcuLi8uLi9zeW1ib2wvbWVyZ2VsaW5lcy5qcyc7XG5pbXBvcnQge2FsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUsIHN0cmluZ0NvbnRhaW5zUlRMVGV4dH0gZnJvbSAnLi4vLi4vdXRpbC9zY3JpcHRfZGV0ZWN0aW9uLmpzJztcbmltcG9ydCB7V3JpdGluZ01vZGV9IGZyb20gJy4uLy4uL3N5bWJvbC9zaGFwaW5nLmpzJztcbmltcG9ydCBsb2FkR2VvbWV0cnkgZnJvbSAnLi4vbG9hZF9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgdG9FdmFsdWF0aW9uRmVhdHVyZSBmcm9tICcuLi9ldmFsdWF0aW9uX2ZlYXR1cmUuanMnO1xuaW1wb3J0IG12dCBmcm9tICdAbWFwYm94L3ZlY3Rvci10aWxlJztcbmNvbnN0IHZlY3RvclRpbGVGZWF0dXJlVHlwZXMgPSBtdnQuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXM7XG5pbXBvcnQge3ZlcnRpY2FsaXplZENoYXJhY3Rlck1hcH0gZnJvbSAnLi4vLi4vdXRpbC92ZXJ0aWNhbGl6ZV9wdW5jdHVhdGlvbi5qcyc7XG5pbXBvcnQgQW5jaG9yIGZyb20gJy4uLy4uL3N5bWJvbC9hbmNob3IuanMnO1xuaW1wb3J0IHtnZXRTaXplRGF0YX0gZnJvbSAnLi4vLi4vc3ltYm9sL3N5bWJvbF9zaXplLmpzJztcbmltcG9ydCB7TUFYX1BBQ0tFRF9TSVpFfSBmcm9tICcuLi8uLi9zeW1ib2wvc3ltYm9sX2xheW91dC5qcyc7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuaW1wb3J0IFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcbmltcG9ydCB7cGx1Z2luIGFzIGdsb2JhbFJUTFRleHRQbHVnaW4sIGdldFJUTFRleHRQbHVnaW5TdGF0dXN9IGZyb20gJy4uLy4uL3NvdXJjZS9ydGxfdGV4dF9wbHVnaW4uanMnO1xuaW1wb3J0IHttYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlELCBPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgSW5kZXhlZEZlYXR1cmUsXG4gICAgUG9wdWxhdGVQYXJhbWV0ZXJzXG59IGZyb20gJy4uL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSB7Q29sbGlzaW9uQm94QXJyYXksIENvbGxpc2lvbkJveCwgU3ltYm9sSW5zdGFuY2V9IGZyb20gJy4uL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtTdHJ1Y3RBcnJheSwgU3RydWN0QXJyYXlNZW1iZXJ9IGZyb20gJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcbmltcG9ydCBTeW1ib2xTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvaW5kZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHtTeW1ib2xRdWFkfSBmcm9tICcuLi8uLi9zeW1ib2wvcXVhZHMuanMnO1xuaW1wb3J0IHR5cGUge1NpemVEYXRhfSBmcm9tICcuLi8uLi9zeW1ib2wvc3ltYm9sX3NpemUuanMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZXN9IGZyb20gJy4uLy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUuanMnO1xuaW1wb3J0IHR5cGUge0ltYWdlUG9zaXRpb259IGZyb20gJy4uLy4uL3JlbmRlci9pbWFnZV9hdGxhcy5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZVRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuZXhwb3J0IHR5cGUgU2luZ2xlQ29sbGlzaW9uQm94ID0ge1xuICAgIHgxOiBudW1iZXI7XG4gICAgeTE6IG51bWJlcjtcbiAgICB4MjogbnVtYmVyO1xuICAgIHkyOiBudW1iZXI7XG4gICAgcGFkZGluZzogbnVtYmVyO1xuICAgIHByb2plY3RlZEFuY2hvclg6IG51bWJlcjtcbiAgICBwcm9qZWN0ZWRBbmNob3JZOiBudW1iZXI7XG4gICAgcHJvamVjdGVkQW5jaG9yWjogbnVtYmVyO1xuICAgIHRpbGVBbmNob3JYOiBudW1iZXI7XG4gICAgdGlsZUFuY2hvclk6IG51bWJlcjtcbiAgICBlbGV2YXRpb24/OiBudW1iZXI7XG4gICAgdGlsZUlEPzogT3ZlcnNjYWxlZFRpbGVJRDtcbn07XG5cbmV4cG9ydCB0eXBlIENvbGxpc2lvbkFycmF5cyA9IHtcbiAgICB0ZXh0Qm94PzogU2luZ2xlQ29sbGlzaW9uQm94O1xuICAgIHZlcnRpY2FsVGV4dEJveD86IFNpbmdsZUNvbGxpc2lvbkJveDtcbiAgICBpY29uQm94PzogU2luZ2xlQ29sbGlzaW9uQm94O1xuICAgIHZlcnRpY2FsSWNvbkJveD86IFNpbmdsZUNvbGxpc2lvbkJveDtcbiAgICB0ZXh0RmVhdHVyZUluZGV4PzogbnVtYmVyO1xuICAgIHZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleD86IG51bWJlcjtcbiAgICBpY29uRmVhdHVyZUluZGV4PzogbnVtYmVyO1xuICAgIHZlcnRpY2FsSWNvbkZlYXR1cmVJbmRleD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFN5bWJvbEZlYXR1cmUgPSB7fFxuICAgIHNvcnRLZXk6IG51bWJlciB8IHZvaWQsXG4gICAgdGV4dDogRm9ybWF0dGVkIHwgdm9pZCxcbiAgICBpY29uOiA/UmVzb2x2ZWRJbWFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICBwcm9wZXJ0aWVzOiBPYmplY3QsXG4gICAgdHlwZTogJ1BvaW50JyB8ICdMaW5lU3RyaW5nJyB8ICdQb2x5Z29uJyxcbiAgICBpZD86IGFueVxufH07XG5cbmV4cG9ydCB0eXBlIFNvcnRLZXlSYW5nZSA9IHtcbiAgICBzb3J0S2V5OiBudW1iZXIsXG4gICAgc3ltYm9sSW5zdGFuY2VTdGFydDogbnVtYmVyLFxuICAgIHN5bWJvbEluc3RhbmNlRW5kOiBudW1iZXJcbn07XG5cbi8vIE9wYWNpdHkgYXJyYXlzIGFyZSBmcmVxdWVudGx5IHVwZGF0ZWQgYnV0IGRvbid0IGNvbnRhaW4gYSBsb3Qgb2YgaW5mb3JtYXRpb24sIHNvIHdlIHBhY2sgdGhlbVxuLy8gdGlnaHQuIEVhY2ggVWludDMyIGlzIGFjdHVhbGx5IGZvdXIgZHVwbGljYXRlIFVpbnQ4cyBmb3IgdGhlIGZvdXIgY29ybmVycyBvZiBhIGdseXBoXG4vLyA3IGJpdHMgYXJlIGZvciB0aGUgY3VycmVudCBvcGFjaXR5LCBhbmQgdGhlIGxvd2VzdCBiaXQgaXMgdGhlIHRhcmdldCBvcGFjaXR5XG5cbi8vIGFjdHVhbGx5IGRlZmluZWQgaW4gc3ltYm9sX2F0dHJpYnV0ZXMuanNcbi8vIGNvbnN0IHBsYWNlbWVudE9wYWNpdHlBdHRyaWJ1dGVzID0gW1xuLy8gICAgIHsgbmFtZTogJ2FfZmFkZV9vcGFjaXR5JywgY29tcG9uZW50czogMSwgdHlwZTogJ1VpbnQzMicgfVxuLy8gXTtcbmNvbnN0IHNoYWRlck9wYWNpdHlBdHRyaWJ1dGVzID0gW1xuICAgIHtuYW1lOiAnYV9mYWRlX29wYWNpdHknLCBjb21wb25lbnRzOiAxLCB0eXBlOiAnVWludDgnLCBvZmZzZXQ6IDB9XG5dO1xuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgoYXJyYXksIHByb2plY3RlZEFuY2hvclgsIHByb2plY3RlZEFuY2hvclksIHByb2plY3RlZEFuY2hvclosIHRpbGVBbmNob3JYLCB0aWxlQW5jaG9yWSwgb3gsIG95LCB0eCwgdHksIHNpemVWZXJ0ZXgsIGlzU0RGOiBib29sZWFuLCBwaXhlbE9mZnNldFgsIHBpeGVsT2Zmc2V0WSwgbWluRm9udFNjYWxlWCwgbWluRm9udFNjYWxlWSkge1xuICAgIGNvbnN0IGFTaXplWCA9IHNpemVWZXJ0ZXggPyBNYXRoLm1pbihNQVhfUEFDS0VEX1NJWkUsIE1hdGgucm91bmQoc2l6ZVZlcnRleFswXSkpIDogMDtcbiAgICBjb25zdCBhU2l6ZVkgPSBzaXplVmVydGV4ID8gTWF0aC5taW4oTUFYX1BBQ0tFRF9TSVpFLCBNYXRoLnJvdW5kKHNpemVWZXJ0ZXhbMV0pKSA6IDA7XG5cbiAgICBhcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgLy8gYV9wb3Nfb2Zmc2V0XG4gICAgICAgIHByb2plY3RlZEFuY2hvclgsXG4gICAgICAgIHByb2plY3RlZEFuY2hvclksXG4gICAgICAgIE1hdGgucm91bmQob3ggKiAzMiksXG4gICAgICAgIE1hdGgucm91bmQob3kgKiAzMiksXG5cbiAgICAgICAgLy8gYV9kYXRhXG4gICAgICAgIHR4LCAvLyB4IGNvb3JkaW5hdGUgb2Ygc3ltYm9sIG9uIGdseXBoIGF0bGFzIHRleHR1cmVcbiAgICAgICAgdHksIC8vIHkgY29vcmRpbmF0ZSBvZiBzeW1ib2wgb24gZ2x5cGggYXRsYXMgdGV4dHVyZVxuICAgICAgICAoYVNpemVYIDw8IDEpICsgKGlzU0RGID8gMSA6IDApLFxuICAgICAgICBhU2l6ZVksXG4gICAgICAgIHBpeGVsT2Zmc2V0WCAqIDE2LFxuICAgICAgICBwaXhlbE9mZnNldFkgKiAxNixcbiAgICAgICAgbWluRm9udFNjYWxlWCAqIDI1NixcbiAgICAgICAgbWluRm9udFNjYWxlWSAqIDI1NixcblxuICAgICAgICAvLyBhX3Bvc3pcbiAgICAgICAgcHJvamVjdGVkQW5jaG9yWixcbiAgICAgICAgdGlsZUFuY2hvclgsXG4gICAgICAgIHRpbGVBbmNob3JZLFxuICAgICAgICAwXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gYWRkRHluYW1pY0F0dHJpYnV0ZXMoZHluYW1pY0xheW91dFZlcnRleEFycmF5OiBTdHJ1Y3RBcnJheSwgcDogUG9pbnQsIGFuZ2xlOiBudW1iZXIpIHtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socC54LCBwLnksIGFuZ2xlKTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socC54LCBwLnksIGFuZ2xlKTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socC54LCBwLnksIGFuZ2xlKTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2socC54LCBwLnksIGFuZ2xlKTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNSVExUZXh0KGZvcm1hdHRlZFRleHQ6IEZvcm1hdHRlZCk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBmb3JtYXR0ZWRUZXh0LnNlY3Rpb25zKSB7XG4gICAgICAgIGlmIChzdHJpbmdDb250YWluc1JUTFRleHQoc2VjdGlvbi50ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgY2xhc3MgU3ltYm9sQnVmZmVycyB7XG4gICAgbGF5b3V0VmVydGV4QXJyYXk6IFN5bWJvbExheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8U3ltYm9sU3R5bGVMYXllcj47XG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG5cbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXk6IFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBvcGFjaXR5VmVydGV4QXJyYXk6IFN5bWJvbE9wYWNpdHlBcnJheTtcbiAgICBvcGFjaXR5VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBwbGFjZWRTeW1ib2xBcnJheTogUGxhY2VkU3ltYm9sQXJyYXk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9ncmFtQ29uZmlndXJhdGlvbnM6IFByb2dyYW1Db25maWd1cmF0aW9uU2V0PFN5bWJvbFN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgU3ltYm9sTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IHByb2dyYW1Db25maWd1cmF0aW9ucztcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuZHluYW1pY0xheW91dFZlcnRleEFycmF5ID0gbmV3IFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSgpO1xuICAgICAgICB0aGlzLm9wYWNpdHlWZXJ0ZXhBcnJheSA9IG5ldyBTeW1ib2xPcGFjaXR5QXJyYXkoKTtcbiAgICAgICAgdGhpcy5wbGFjZWRTeW1ib2xBcnJheSA9IG5ldyBQbGFjZWRTeW1ib2xBcnJheSgpO1xuICAgIH1cblxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5Lmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICB0aGlzLm9wYWNpdHlWZXJ0ZXhBcnJheS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQsIGR5bmFtaWNJbmRleEJ1ZmZlcjogYm9vbGVhbiwgdXBsb2FkPzogYm9vbGVhbiwgdXBkYXRlPzogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgc3ltYm9sTGF5b3V0QXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSwgZHluYW1pY0luZGV4QnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBkeW5hbWljTGF5b3V0QXR0cmlidXRlcy5tZW1iZXJzLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eVZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMub3BhY2l0eVZlcnRleEFycmF5LCBzaGFkZXJPcGFjaXR5QXR0cmlidXRlcywgdHJ1ZSk7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgcGVyZm9ybWFuY2UgaGFjayBzbyB0aGF0IHdlIGNhbiB3cml0ZSB0byBvcGFjaXR5VmVydGV4QXJyYXkgd2l0aCB1aW50MzJzXG4gICAgICAgICAgICAvLyBldmVuIHRob3VnaCB0aGUgc2hhZGVycyByZWFkIHVpbnQ4c1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyLml0ZW1TaXplID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBsb2FkIHx8IHVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm9wYWNpdHlWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoJ1N5bWJvbEJ1ZmZlcnMnLCBTeW1ib2xCdWZmZXJzKTtcblxuY2xhc3MgQ29sbGlzaW9uQnVmZmVycyB7XG4gICAgbGF5b3V0VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5O1xuICAgIGxheW91dEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheSB8IExpbmVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuXG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXk6IENvbGxpc2lvblZlcnRleEFycmF5O1xuICAgIGNvbGxpc2lvblZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXlFeHQ6IENvbGxpc2lvblZlcnRleEV4dEFycmF5O1xuICAgIGNvbGxpc2lvblZlcnRleEJ1ZmZlckV4dDogVmVydGV4QnVmZmVyO1xuXG4gICAgY29uc3RydWN0b3IoTGF5b3V0QXJyYXk6IENsYXNzPFN0cnVjdEFycmF5PixcbiAgICAgICAgICAgICAgICBsYXlvdXRBdHRyaWJ1dGVzOiBBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj4sXG4gICAgICAgICAgICAgICAgSW5kZXhBcnJheTogQ2xhc3M8VHJpYW5nbGVJbmRleEFycmF5IHwgTGluZUluZGV4QXJyYXk+KSB7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5sYXlvdXRBdHRyaWJ1dGVzID0gbGF5b3V0QXR0cmlidXRlcztcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IEluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uVmVydGV4QXJyYXkgPSBuZXcgQ29sbGlzaW9uVmVydGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25WZXJ0ZXhBcnJheUV4dCA9IG5ldyBDb2xsaXNpb25WZXJ0ZXhFeHRBcnJheSgpO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5sYXlvdXRBdHRyaWJ1dGVzKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmNvbGxpc2lvblZlcnRleEFycmF5LCBjb2xsaXNpb25WZXJ0ZXhBdHRyaWJ1dGVzLm1lbWJlcnMsIHRydWUpO1xuICAgICAgICB0aGlzLmNvbGxpc2lvblZlcnRleEJ1ZmZlckV4dCA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuY29sbGlzaW9uVmVydGV4QXJyYXlFeHQsIGNvbGxpc2lvblZlcnRleEF0dHJpYnV0ZXNFeHQubWVtYmVycywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmNvbGxpc2lvblZlcnRleEJ1ZmZlckV4dC5kZXN0cm95KCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcignQ29sbGlzaW9uQnVmZmVycycsIENvbGxpc2lvbkJ1ZmZlcnMpO1xuXG4vKipcbiAqIFVubGlrZSBvdGhlciBidWNrZXRzLCB3aGljaCBzaW1wbHkgaW1wbGVtZW50ICNhZGRGZWF0dXJlIHdpdGggdHlwZS1zcGVjaWZpY1xuICogbG9naWMgZm9yIChlc3NlbnRpYWxseSkgdHJpYW5ndWxhdGluZyBmZWF0dXJlIGdlb21ldHJpZXMsIFN5bWJvbEJ1Y2tldFxuICogcmVxdWlyZXMgc3BlY2lhbGl6ZWQgYmVoYXZpb3I6XG4gKlxuICogMS4gV29ya2VyVGlsZSNwYXJzZSgpLCB0aGUgbG9naWNhbCBvd25lciBvZiB0aGUgYnVja2V0IGNyZWF0aW9uIHByb2Nlc3MsXG4gKiAgICBjYWxscyBTeW1ib2xCdWNrZXQjcG9wdWxhdGUoKSwgd2hpY2ggcmVzb2x2ZXMgdGV4dCBhbmQgaWNvbiB0b2tlbnMgb25cbiAqICAgIGVhY2ggZmVhdHVyZSwgYWRkcyBlYWNoIGdseXBocyBhbmQgc3ltYm9scyBuZWVkZWQgdG8gdGhlIHBhc3NlZC1pblxuICogICAgY29sbGVjdGlvbnMgb3B0aW9ucy5nbHlwaERlcGVuZGVuY2llcyBhbmQgb3B0aW9ucy5pY29uRGVwZW5kZW5jaWVzLCBhbmRcbiAqICAgIHN0b3JlcyB0aGUgZmVhdHVyZSBkYXRhIGZvciB1c2UgaW4gc3Vic2VxdWVudCBzdGVwICh0aGlzLmZlYXR1cmVzKS5cbiAqXG4gKiAyLiBXb3JrZXJUaWxlIGFzeW5jaHJvbm91c2x5IHJlcXVlc3RzIGZyb20gdGhlIG1haW4gdGhyZWFkIGFsbCBvZiB0aGUgZ2x5cGhzXG4gKiAgICBhbmQgaWNvbnMgbmVlZGVkIChieSB0aGlzIGJ1Y2tldCBhbmQgYW55IG90aGVycykuIFdoZW4gZ2x5cGhzIGFuZCBpY29uc1xuICogICAgaGF2ZSBiZWVuIHJlY2VpdmVkLCB0aGUgV29ya2VyVGlsZSBjcmVhdGVzIGEgQ29sbGlzaW9uSW5kZXggYW5kIGludm9rZXM6XG4gKlxuICogMy4gcGVyZm9ybVN5bWJvbExheW91dChidWNrZXQsIHN0YWNrcywgaWNvbnMpIHBlcmZvcm0gdGV4dHMgc2hhcGluZyBhbmRcbiAqICAgIGxheW91dCBvbiBhIFN5bWJvbCBCdWNrZXQuIFRoaXMgc3RlcCBwb3B1bGF0ZXM6XG4gKiAgICAgIGB0aGlzLnN5bWJvbEluc3RhbmNlc2A6IG1ldGFkYXRhIG9uIGdlbmVyYXRlZCBzeW1ib2xzXG4gKiAgICAgIGBjb2xsaXNpb25Cb3hBcnJheWA6IGNvbGxpc2lvbiBkYXRhIGZvciB1c2UgYnkgZm9yZWdyb3VuZFxuICogICAgICBgdGhpcy50ZXh0YDogU3ltYm9sQnVmZmVycyBmb3IgdGV4dCBzeW1ib2xzXG4gKiAgICAgIGB0aGlzLmljb25zYDogU3ltYm9sQnVmZmVycyBmb3IgaWNvbnNcbiAqICAgICAgYHRoaXMuaWNvbkNvbGxpc2lvbkJveGA6IERlYnVnIFN5bWJvbEJ1ZmZlcnMgZm9yIGljb24gY29sbGlzaW9uIGJveGVzXG4gKiAgICAgIGB0aGlzLnRleHRDb2xsaXNpb25Cb3hgOiBEZWJ1ZyBTeW1ib2xCdWZmZXJzIGZvciB0ZXh0IGNvbGxpc2lvbiBib3hlc1xuICogICAgVGhlIHJlc3VsdHMgYXJlIHNlbnQgdG8gdGhlIGZvcmVncm91bmQgZm9yIHJlbmRlcmluZ1xuICpcbiAqIDQuIHBlcmZvcm1TeW1ib2xQbGFjZW1lbnQoYnVja2V0LCBjb2xsaXNpb25JbmRleCkgaXMgcnVuIG9uIHRoZSBmb3JlZ3JvdW5kLFxuICogICAgYW5kIHVzZXMgdGhlIENvbGxpc2lvbkluZGV4IGFsb25nIHdpdGggY3VycmVudCBjYW1lcmEgc2V0dGluZ3MgdG8gZGV0ZXJtaW5lXG4gKiAgICB3aGljaCBzeW1ib2xzIGNhbiBhY3R1YWxseSBzaG93IG9uIHRoZSBtYXAuIENvbGxpZGVkIHN5bWJvbHMgYXJlIGhpZGRlblxuICogICAgdXNpbmcgYSBkeW5hbWljIFwiT3BhY2l0eVZlcnRleEFycmF5XCIuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3ltYm9sQnVja2V0IGltcGxlbWVudHMgQnVja2V0IHtcbiAgICBzdGF0aWMgTUFYX0dMWVBIUzogbnVtYmVyO1xuICAgIHN0YXRpYyBhZGREeW5hbWljQXR0cmlidXRlczogdHlwZW9mIGFkZER5bmFtaWNBdHRyaWJ1dGVzO1xuXG4gICAgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5O1xuICAgIHpvb206IG51bWJlcjtcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xuICAgIGxheWVyczogQXJyYXk8U3ltYm9sU3R5bGVMYXllcj47XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PFN5bWJvbFN0eWxlTGF5ZXI+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG5cbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHNkZkljb25zOiBib29sZWFuO1xuICAgIGljb25zSW5UZXh0OiBib29sZWFuO1xuICAgIGljb25zTmVlZExpbmVhcjogYm9vbGVhbjtcbiAgICBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXI7XG4gICAganVzdFJlbG9hZGVkOiBib29sZWFuO1xuICAgIGhhc1BhdHRlcm46IGJvb2xlYW47XG4gICAgZnVsbHlDbGlwcGVkOiBib29sZWFuO1xuXG4gICAgdGV4dFNpemVEYXRhOiBTaXplRGF0YTtcbiAgICBpY29uU2l6ZURhdGE6IFNpemVEYXRhO1xuXG4gICAgZ2x5cGhPZmZzZXRBcnJheTogR2x5cGhPZmZzZXRBcnJheTtcbiAgICBsaW5lVmVydGV4QXJyYXk6IFN5bWJvbExpbmVWZXJ0ZXhBcnJheTtcbiAgICBmZWF0dXJlczogQXJyYXk8U3ltYm9sRmVhdHVyZT47XG4gICAgc3ltYm9sSW5zdGFuY2VzOiBTeW1ib2xJbnN0YW5jZUFycmF5O1xuICAgIGNvbGxpc2lvbkFycmF5czogQXJyYXk8Q29sbGlzaW9uQXJyYXlzPjtcbiAgICBzb3J0S2V5UmFuZ2VzOiBBcnJheTxTb3J0S2V5UmFuZ2U+O1xuICAgIHBpeGVsUmF0aW86IG51bWJlcjtcbiAgICB0aWxlUGl4ZWxSYXRpbzogbnVtYmVyO1xuICAgIGNvbXBhcmVUZXh0OiB7W186IHN0cmluZ106IEFycmF5PFBvaW50Pn07XG4gICAgZmFkZVN0YXJ0VGltZTogbnVtYmVyO1xuICAgIHNvcnRGZWF0dXJlc0J5S2V5OiBib29sZWFuO1xuICAgIHNvcnRGZWF0dXJlc0J5WTogYm9vbGVhbjtcbiAgICBjYW5PdmVybGFwOiBib29sZWFuO1xuICAgIHNvcnRlZEFuZ2xlOiBudW1iZXI7XG4gICAgZmVhdHVyZVNvcnRPcmRlcjogQXJyYXk8bnVtYmVyPjtcblxuICAgIGNvbGxpc2lvbkNpcmNsZUFycmF5OiBBcnJheTxudW1iZXI+O1xuICAgIHBsYWNlbWVudEludlByb2pNYXRyaXg6IG1hdDQ7XG4gICAgcGxhY2VtZW50Vmlld3BvcnRNYXRyaXg6IG1hdDQ7XG5cbiAgICB0ZXh0OiBTeW1ib2xCdWZmZXJzO1xuICAgIGljb246IFN5bWJvbEJ1ZmZlcnM7XG4gICAgdGV4dENvbGxpc2lvbkJveDogQ29sbGlzaW9uQnVmZmVycztcbiAgICBpY29uQ29sbGlzaW9uQm94OiBDb2xsaXNpb25CdWZmZXJzO1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcjtcbiAgICBzb3VyY2VJRDogc3RyaW5nO1xuICAgIHN5bWJvbEluc3RhbmNlSW5kZXhlczogQXJyYXk8bnVtYmVyPjtcbiAgICB3cml0aW5nTW9kZXM6IEFycmF5PG51bWJlcj47XG4gICAgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudDogYm9vbGVhbjtcbiAgICBoYXNSVExUZXh0OiBib29sZWFuO1xuICAgIHByb2plY3Rpb246ID9zdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPFN5bWJvbFN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQm94QXJyYXkgPSBvcHRpb25zLmNvbGxpc2lvbkJveEFycmF5O1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpbyA9IG9wdGlvbnMucGl4ZWxSYXRpbztcbiAgICAgICAgdGhpcy5zb3VyY2VMYXllckluZGV4ID0gb3B0aW9ucy5zb3VyY2VMYXllckluZGV4O1xuICAgICAgICB0aGlzLmhhc1BhdHRlcm4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNSVExUZXh0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZnVsbHlDbGlwcGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ydEtleVJhbmdlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXkgPSBbXTtcbiAgICAgICAgdGhpcy5wbGFjZW1lbnRJbnZQcm9qTWF0cml4ID0gbWF0NC5pZGVudGl0eShbXSk7XG4gICAgICAgIHRoaXMucGxhY2VtZW50Vmlld3BvcnRNYXRyaXggPSBtYXQ0LmlkZW50aXR5KFtdKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzWzBdO1xuICAgICAgICBjb25zdCB1bmV2YWx1YXRlZExheW91dFZhbHVlcyA9IGxheWVyLl91bmV2YWx1YXRlZExheW91dC5fdmFsdWVzO1xuXG4gICAgICAgIHRoaXMudGV4dFNpemVEYXRhID0gZ2V0U2l6ZURhdGEodGhpcy56b29tLCB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10pO1xuICAgICAgICB0aGlzLmljb25TaXplRGF0YSA9IGdldFNpemVEYXRhKHRoaXMuem9vbSwgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddKTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheWVyc1swXS5sYXlvdXQ7XG4gICAgICAgIGNvbnN0IHNvcnRLZXkgPSBsYXlvdXQuZ2V0KCdzeW1ib2wtc29ydC1rZXknKTtcbiAgICAgICAgY29uc3Qgek9yZGVyID0gbGF5b3V0LmdldCgnc3ltYm9sLXotb3JkZXInKTtcbiAgICAgICAgdGhpcy5jYW5PdmVybGFwID1cbiAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtYWxsb3ctb3ZlcmxhcCcpIHx8XG4gICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLWFsbG93LW92ZXJsYXAnKSB8fFxuICAgICAgICAgICAgbGF5b3V0LmdldCgndGV4dC1pZ25vcmUtcGxhY2VtZW50JykgfHxcbiAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24taWdub3JlLXBsYWNlbWVudCcpO1xuICAgICAgICB0aGlzLnNvcnRGZWF0dXJlc0J5S2V5ID0gek9yZGVyICE9PSAndmlld3BvcnQteScgJiYgc29ydEtleS5jb25zdGFudE9yKDEpICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHpPcmRlckJ5Vmlld3BvcnRZID0gek9yZGVyID09PSAndmlld3BvcnQteScgfHwgKHpPcmRlciA9PT0gJ2F1dG8nICYmICF0aGlzLnNvcnRGZWF0dXJlc0J5S2V5KTtcbiAgICAgICAgdGhpcy5zb3J0RmVhdHVyZXNCeVkgPSB6T3JkZXJCeVZpZXdwb3J0WSAmJiB0aGlzLmNhbk92ZXJsYXA7XG5cbiAgICAgICAgdGhpcy53cml0aW5nTW9kZXMgPSBsYXlvdXQuZ2V0KCd0ZXh0LXdyaXRpbmctbW9kZScpLm1hcCh3bSA9PiBXcml0aW5nTW9kZVt3bV0pO1xuXG4gICAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcyA9IHRoaXMubGF5ZXJzLmZpbHRlcigobCkgPT4gbC5pc1N0YXRlRGVwZW5kZW50KCkpLm1hcCgobCkgPT4gbC5pZCk7XG5cbiAgICAgICAgdGhpcy5zb3VyY2VJRCA9IG9wdGlvbnMuc291cmNlSUQ7XG4gICAgfVxuXG4gICAgY3JlYXRlQXJyYXlzKCkge1xuICAgICAgICB0aGlzLnRleHQgPSBuZXcgU3ltYm9sQnVmZmVycyhuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQodGhpcy5sYXllcnMsIHRoaXMuem9vbSwgcHJvcGVydHkgPT4gL150ZXh0Ly50ZXN0KHByb3BlcnR5KSkpO1xuICAgICAgICB0aGlzLmljb24gPSBuZXcgU3ltYm9sQnVmZmVycyhuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQodGhpcy5sYXllcnMsIHRoaXMuem9vbSwgcHJvcGVydHkgPT4gL15pY29uLy50ZXN0KHByb3BlcnR5KSkpO1xuXG4gICAgICAgIHRoaXMuZ2x5cGhPZmZzZXRBcnJheSA9IG5ldyBHbHlwaE9mZnNldEFycmF5KCk7XG4gICAgICAgIHRoaXMubGluZVZlcnRleEFycmF5ID0gbmV3IFN5bWJvbExpbmVWZXJ0ZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnN5bWJvbEluc3RhbmNlcyA9IG5ldyBTeW1ib2xJbnN0YW5jZUFycmF5KCk7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlR2x5cGhEZXBlbmRlbmNpZXModGV4dDogc3RyaW5nLCBzdGFjazoge1tfOiBudW1iZXJdOiBib29sZWFufSwgdGV4dEFsb25nTGluZTogYm9vbGVhbiwgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudDogYm9vbGVhbiwgZG9lc0FsbG93VmVydGljYWxXcml0aW5nTW9kZTogYm9vbGVhbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN0YWNrW3RleHQuY2hhckNvZGVBdChpKV0gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgZG9lc0FsbG93VmVydGljYWxXcml0aW5nTW9kZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsQ2hhciA9IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcFt0ZXh0LmNoYXJBdChpKV07XG4gICAgICAgICAgICAgICAgaWYgKHZlcnRpY2FsQ2hhcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFja1t2ZXJ0aWNhbENoYXIuY2hhckNvZGVBdCgwKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBvcHVsYXRlKGZlYXR1cmVzOiBBcnJheTxJbmRleGVkRmVhdHVyZT4sIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIHRpbGVUcmFuc2Zvcm06IFRpbGVUcmFuc2Zvcm0pIHtcbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmxheWVyc1swXTtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0gbGF5ZXIubGF5b3V0O1xuXG4gICAgICAgIGNvbnN0IHRleHRGb250ID0gbGF5b3V0LmdldCgndGV4dC1mb250Jyk7XG4gICAgICAgIGNvbnN0IHRleHRGaWVsZCA9IGxheW91dC5nZXQoJ3RleHQtZmllbGQnKTtcbiAgICAgICAgY29uc3QgaWNvbkltYWdlID0gbGF5b3V0LmdldCgnaWNvbi1pbWFnZScpO1xuICAgICAgICBjb25zdCBoYXNUZXh0ID1cbiAgICAgICAgICAgICh0ZXh0RmllbGQudmFsdWUua2luZCAhPT0gJ2NvbnN0YW50JyB8fFxuICAgICAgICAgICAgICAgICh0ZXh0RmllbGQudmFsdWUudmFsdWUgaW5zdGFuY2VvZiBGb3JtYXR0ZWQgJiYgIXRleHRGaWVsZC52YWx1ZS52YWx1ZS5pc0VtcHR5KCkpIHx8XG4gICAgICAgICAgICAgICAgdGV4dEZpZWxkLnZhbHVlLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID4gMCkgJiZcbiAgICAgICAgICAgICh0ZXh0Rm9udC52YWx1ZS5raW5kICE9PSAnY29uc3RhbnQnIHx8IHRleHRGb250LnZhbHVlLnZhbHVlLmxlbmd0aCA+IDApO1xuICAgICAgICAvLyB3ZSBzaG91bGQgYWx3YXlzIHJlc29sdmUgdGhlIGljb24taW1hZ2UgdmFsdWUgaWYgdGhlIHByb3BlcnR5IHdhcyBkZWZpbmVkIGluIHRoZSBzdHlsZVxuICAgICAgICAvLyB0aGlzIGFsbG93cyB1cyB0byBmaXJlIHRoZSBzdHlsZWltYWdlbWlzc2luZyBldmVudCBpZiBpbWFnZSBldmFsdWF0aW9uIHJldHVybnMgbnVsbFxuICAgICAgICAvLyB0aGUgb25seSB3YXkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBudWxsIHJldHVybmVkIGZyb20gYSBjb2FsZXNjZSBzdGF0ZW1lbnQgd2l0aCBubyB2YWxpZCBpbWFnZXNcbiAgICAgICAgLy8gYW5kIG51bGwgcmV0dXJuZWQgYmVjYXVzZSBpY29uLWltYWdlIHdhc24ndCBkZWZpbmVkIGlzIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90IGljb25JbWFnZS5wYXJhbWV0ZXJzIGlzIGFuIGVtcHR5IG9iamVjdFxuICAgICAgICBjb25zdCBoYXNJY29uID0gaWNvbkltYWdlLnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcgfHwgISFpY29uSW1hZ2UudmFsdWUudmFsdWUgfHwgT2JqZWN0LmtleXMoaWNvbkltYWdlLnBhcmFtZXRlcnMpLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IHN5bWJvbFNvcnRLZXkgPSBsYXlvdXQuZ2V0KCdzeW1ib2wtc29ydC1rZXknKTtcblxuICAgICAgICB0aGlzLmZlYXR1cmVzID0gW107XG5cbiAgICAgICAgaWYgKCFoYXNUZXh0ICYmICFoYXNJY29uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpY29ucyA9IG9wdGlvbnMuaWNvbkRlcGVuZGVuY2llcztcbiAgICAgICAgY29uc3Qgc3RhY2tzID0gb3B0aW9ucy5nbHlwaERlcGVuZGVuY2llcztcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlSW1hZ2VzID0gb3B0aW9ucy5hdmFpbGFibGVJbWFnZXM7XG4gICAgICAgIGNvbnN0IGdsb2JhbFByb3BlcnRpZXMgPSBuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHtmZWF0dXJlLCBpZCwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXh9IG9mIGZlYXR1cmVzKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IG5lZWRHZW9tZXRyeSA9IGxheWVyLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeTtcbiAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRpb25GZWF0dXJlID0gdG9FdmFsdWF0aW9uRmVhdHVyZShmZWF0dXJlLCBuZWVkR2VvbWV0cnkpO1xuICAgICAgICAgICAgaWYgKCFsYXllci5fZmVhdHVyZUZpbHRlci5maWx0ZXIoZ2xvYmFsUHJvcGVydGllcywgZXZhbHVhdGlvbkZlYXR1cmUsIGNhbm9uaWNhbCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFuZWVkR2VvbWV0cnkpIGV2YWx1YXRpb25GZWF0dXJlLmdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUsIGNhbm9uaWNhbCwgdGlsZVRyYW5zZm9ybSk7XG5cbiAgICAgICAgICAgIGxldCB0ZXh0OiBGb3JtYXR0ZWQgfCB2b2lkO1xuICAgICAgICAgICAgaWYgKGhhc1RleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBFeHByZXNzaW9uIGV2YWx1YXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGNvZXJjZSB0byBGb3JtYXR0ZWRcbiAgICAgICAgICAgICAgICAvLyBidXQgcGxhaW4gc3RyaW5nIHRva2VuIGV2YWx1YXRpb24gc2tpcHMgdGhhdCBwYXRod2F5IHNvIGRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24gaGVyZS5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFRva2VucyA9IGxheWVyLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucygndGV4dC1maWVsZCcsIGV2YWx1YXRpb25GZWF0dXJlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkVGV4dCA9IEZvcm1hdHRlZC5mYWN0b3J5KHJlc29sdmVkVG9rZW5zKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNSVExUZXh0KGZvcm1hdHRlZFRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzUlRMVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuaGFzUlRMVGV4dCB8fCAvLyBub24tcnRsIHRleHQgc28gY2FuIHByb2NlZWQgc2FmZWx5XG4gICAgICAgICAgICAgICAgICAgIGdldFJUTFRleHRQbHVnaW5TdGF0dXMoKSA9PT0gJ3VuYXZhaWxhYmxlJyB8fCAvLyBXZSBkb24ndCBpbnRlbmQgdG8gbGF6eS1sb2FkIHRoZSBydGwgdGV4dCBwbHVnaW4sIHNvIHByb2NlZWQgd2l0aCBpbmNvcnJlY3Qgc2hhcGluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1JUTFRleHQgJiYgZ2xvYmFsUlRMVGV4dFBsdWdpbi5pc1BhcnNlZCgpIC8vIFVzZSB0aGUgcnRsVGV4dCBwbHVnaW4gdG8gc2hhcGUgdGV4dFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdHJhbnNmb3JtVGV4dChmb3JtYXR0ZWRUZXh0LCBsYXllciwgZXZhbHVhdGlvbkZlYXR1cmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGljb246ID9SZXNvbHZlZEltYWdlO1xuICAgICAgICAgICAgaWYgKGhhc0ljb24pIHtcbiAgICAgICAgICAgICAgICAvLyBFeHByZXNzaW9uIGV2YWx1YXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGNvZXJjZSB0byBJbWFnZVxuICAgICAgICAgICAgICAgIC8vIGJ1dCBwbGFpbiBzdHJpbmcgdG9rZW4gZXZhbHVhdGlvbiBza2lwcyB0aGF0IHBhdGh3YXkgc28gZG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gY29udmVyc2lvbiBoZXJlLlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVG9rZW5zID0gbGF5ZXIuZ2V0VmFsdWVBbmRSZXNvbHZlVG9rZW5zKCdpY29uLWltYWdlJywgZXZhbHVhdGlvbkZlYXR1cmUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRUb2tlbnMgaW5zdGFuY2VvZiBSZXNvbHZlZEltYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGljb24gPSByZXNvbHZlZFRva2VucztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpY29uID0gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKHJlc29sdmVkVG9rZW5zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghdGV4dCAmJiAhaWNvbikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc29ydEtleSA9IHRoaXMuc29ydEZlYXR1cmVzQnlLZXkgP1xuICAgICAgICAgICAgICAgIHN5bWJvbFNvcnRLZXkuZXZhbHVhdGUoZXZhbHVhdGlvbkZlYXR1cmUsIHt9LCBjYW5vbmljYWwpIDpcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEZlYXR1cmU6IFN5bWJvbEZlYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICBpY29uLFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IGV2YWx1YXRpb25GZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0eXBlOiB2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzW2ZlYXR1cmUudHlwZV0sXG4gICAgICAgICAgICAgICAgc29ydEtleVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaChzeW1ib2xGZWF0dXJlKTtcblxuICAgICAgICAgICAgaWYgKGljb24pIHtcbiAgICAgICAgICAgICAgICBpY29uc1tpY29uLm5hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250U3RhY2sgPSB0ZXh0Rm9udC5ldmFsdWF0ZShldmFsdWF0aW9uRmVhdHVyZSwge30sIGNhbm9uaWNhbCkuam9pbignLCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRBbG9uZ0xpbmUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyAmJiBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCc7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ID0gdGhpcy53cml0aW5nTW9kZXMgJiYgdGhpcy53cml0aW5nTW9kZXMuaW5kZXhPZihXcml0aW5nTW9kZS52ZXJ0aWNhbCkgPj0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGV4dC5zZWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlY3Rpb24uaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvZXNBbGxvd1ZlcnRpY2FsV3JpdGluZ01vZGUgPSBhbGxvd3NWZXJ0aWNhbFdyaXRpbmdNb2RlKHRleHQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWN0aW9uRm9udCA9IHNlY3Rpb24uZm9udFN0YWNrIHx8IGZvbnRTdGFjaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25TdGFjayA9IHN0YWNrc1tzZWN0aW9uRm9udF0gPSBzdGFja3Nbc2VjdGlvbkZvbnRdIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHbHlwaERlcGVuZGVuY2llcyhzZWN0aW9uLnRleHQsIHNlY3Rpb25TdGFjaywgdGV4dEFsb25nTGluZSwgdGhpcy5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50LCBkb2VzQWxsb3dWZXJ0aWNhbFdyaXRpbmdNb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBzZWN0aW9uIGltYWdlIHRvIHRoZSBsaXN0IG9mIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25zW3NlY3Rpb24uaW1hZ2UubmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgICAgICAvLyBNZXJnZSBhZGphY2VudCBsaW5lcyB3aXRoIHRoZSBzYW1lIHRleHQgdG8gaW1wcm92ZSBsYWJlbGxpbmcuXG4gICAgICAgICAgICAvLyBJdCdzIGJldHRlciB0byBwbGFjZSBsYWJlbHMgb24gb25lIGxvbmcgbGluZSB0aGFuIG9uIG1hbnkgc2hvcnQgc2VnbWVudHMuXG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVzID0gbWVyZ2VMaW5lcyh0aGlzLmZlYXR1cmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNvcnRGZWF0dXJlc0J5S2V5KSB7XG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBhLnNvcnRLZXkgaXMgYWx3YXlzIGEgbnVtYmVyIHdoZW4gc29ydEZlYXR1cmVzQnlLZXkgaXMgdHJ1ZVxuICAgICAgICAgICAgICAgIHJldHVybiAoKGEuc29ydEtleTogYW55KTogbnVtYmVyKSAtICgoYi5zb3J0S2V5OiBhbnkpOiBudW1iZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoc3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0pIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnRleHQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5sYXllcnMsIGF2YWlsYWJsZUltYWdlcywgaW1hZ2VQb3NpdGlvbnMpO1xuICAgICAgICB0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5sYXllcnMsIGF2YWlsYWJsZUltYWdlcywgaW1hZ2VQb3NpdGlvbnMpO1xuICAgIH1cblxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIC8vIFdoZW4gdGhlIGJ1Y2tldCBlbmNvdW50ZXJzIG9ubHkgcnRsLXRleHQgYnV0IHRoZSBwbHVnaW4gaXNuJ3QgbG9hZGVkLCBubyBzeW1ib2wgaW5zdGFuY2VzIHdpbGwgYmUgY3JlYXRlZC5cbiAgICAgICAgLy8gSW4gb3JkZXIgZm9yIHRoZSBidWNrZXQgdG8gYmUgc2VyaWFsaXplZCwgYW5kIG5vdCBkaXNjYXJkZWQgYXMgYW4gZW1wdHkgYnVja2V0IGJvdGggY2hlY2tzIGFyZSBuZWNlc3NhcnkuXG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGggPT09IDAgJiYgIXRoaXMuaGFzUlRMVGV4dDtcbiAgICB9XG5cbiAgICB1cGxvYWRQZW5kaW5nKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMudXBsb2FkZWQgfHwgdGhpcy50ZXh0LnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCB8fCB0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy51cGxvYWRlZCAmJiB0aGlzLmhhc0RlYnVnRGF0YSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRDb2xsaXNpb25Cb3gudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy5pY29uQ29sbGlzaW9uQm94LnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRleHQudXBsb2FkKGNvbnRleHQsIHRoaXMuc29ydEZlYXR1cmVzQnlZLCAhdGhpcy51cGxvYWRlZCwgdGhpcy50ZXh0LnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCk7XG4gICAgICAgIHRoaXMuaWNvbi51cGxvYWQoY29udGV4dCwgdGhpcy5zb3J0RmVhdHVyZXNCeVksICF0aGlzLnVwbG9hZGVkLCB0aGlzLmljb24ucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkKTtcbiAgICAgICAgdGhpcy51cGxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGVzdHJveURlYnVnRGF0YSgpIHtcbiAgICAgICAgdGhpcy50ZXh0Q29sbGlzaW9uQm94LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pY29uQ29sbGlzaW9uQm94LmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnRleHQuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmljb24uZGVzdHJveSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnRGF0YSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lEZWJ1Z0RhdGEoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFRvTGluZVZlcnRleEFycmF5KGFuY2hvcjogQW5jaG9yLCBsaW5lOiBhbnkpIHtcbiAgICAgICAgY29uc3QgbGluZVN0YXJ0SW5kZXggPSB0aGlzLmxpbmVWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgICAgIGlmIChhbmNob3Iuc2VnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgc3VtRm9yd2FyZExlbmd0aCA9IGFuY2hvci5kaXN0KGxpbmVbYW5jaG9yLnNlZ21lbnQgKyAxXSk7XG4gICAgICAgICAgICBsZXQgc3VtQmFja3dhcmRMZW5ndGggPSBhbmNob3IuZGlzdChsaW5lW2FuY2hvci5zZWdtZW50XSk7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGFuY2hvci5zZWdtZW50ICsgMTsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXSA9IHt4OiBsaW5lW2ldLngsIHk6IGxpbmVbaV0ueSwgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3I6IHN1bUZvcndhcmRMZW5ndGh9O1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGluZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1bUZvcndhcmRMZW5ndGggKz0gbGluZVtpICsgMV0uZGlzdChsaW5lW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYW5jaG9yLnNlZ21lbnQgfHwgMDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1tpXSA9IHt4OiBsaW5lW2ldLngsIHk6IGxpbmVbaV0ueSwgdGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3I6IHN1bUJhY2t3YXJkTGVuZ3RofTtcbiAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtQmFja3dhcmRMZW5ndGggKz0gbGluZVtpIC0gMV0uZGlzdChsaW5lW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayh2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC50aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxpbmVTdGFydEluZGV4LFxuICAgICAgICAgICAgbGluZUxlbmd0aDogdGhpcy5saW5lVmVydGV4QXJyYXkubGVuZ3RoIC0gbGluZVN0YXJ0SW5kZXhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhZGRTeW1ib2xzKGFycmF5czogU3ltYm9sQnVmZmVycyxcbiAgICAgICAgICAgICAgIHF1YWRzOiBBcnJheTxTeW1ib2xRdWFkPixcbiAgICAgICAgICAgICAgIHNpemVWZXJ0ZXg6IGFueSxcbiAgICAgICAgICAgICAgIGxpbmVPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICBhbG9uZ0xpbmU6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICBmZWF0dXJlOiBTeW1ib2xGZWF0dXJlLFxuICAgICAgICAgICAgICAgd3JpdGluZ01vZGU6IGFueSxcbiAgICAgICAgICAgICAgIGxhYmVsQW5jaG9yOiBBbmNob3IsXG4gICAgICAgICAgICAgICB0aWxlQW5jaG9yOiBBbmNob3IsXG4gICAgICAgICAgICAgICBsaW5lU3RhcnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgbGluZUxlbmd0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgYXNzb2NpYXRlZEljb25JbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICAgICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICAgICAgY29uc3QgaW5kZXhBcnJheSA9IGFycmF5cy5pbmRleEFycmF5O1xuICAgICAgICBjb25zdCBsYXlvdXRWZXJ0ZXhBcnJheSA9IGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheTtcblxuICAgICAgICBjb25zdCBzZWdtZW50ID0gYXJyYXlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQgKiBxdWFkcy5sZW5ndGgsIGxheW91dFZlcnRleEFycmF5LCBpbmRleEFycmF5LCB0aGlzLmNhbk92ZXJsYXAgPyBmZWF0dXJlLnNvcnRLZXkgOiB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCBnbHlwaE9mZnNldEFycmF5U3RhcnQgPSB0aGlzLmdseXBoT2Zmc2V0QXJyYXkubGVuZ3RoO1xuICAgICAgICBjb25zdCB2ZXJ0ZXhTdGFydEluZGV4ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgY29uc3QgYW5nbGUgPSAodGhpcy5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIHdyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCkgPyBNYXRoLlBJIC8gMiA6IDA7XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBmZWF0dXJlLnRleHQgJiYgZmVhdHVyZS50ZXh0LnNlY3Rpb25zO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVhZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHt0bCwgdHIsIGJsLCBiciwgdGV4LCBwaXhlbE9mZnNldFRMLCBwaXhlbE9mZnNldEJSLCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZLCBnbHlwaE9mZnNldCwgaXNTREYsIHNlY3Rpb25JbmRleH0gPSBxdWFkc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgICAgIGNvbnN0IHkgPSBnbHlwaE9mZnNldFsxXTtcbiAgICAgICAgICAgIGFkZFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgbGFiZWxBbmNob3IueCwgbGFiZWxBbmNob3IueSwgbGFiZWxBbmNob3IueiwgdGlsZUFuY2hvci54LCB0aWxlQW5jaG9yLnksIHRsLngsIHkgKyB0bC55LCB0ZXgueCwgdGV4LnksIHNpemVWZXJ0ZXgsIGlzU0RGLCBwaXhlbE9mZnNldFRMLngsIHBpeGVsT2Zmc2V0VEwueSwgbWluRm9udFNjYWxlWCwgbWluRm9udFNjYWxlWSk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGxhYmVsQW5jaG9yLngsIGxhYmVsQW5jaG9yLnksIGxhYmVsQW5jaG9yLnosIHRpbGVBbmNob3IueCwgdGlsZUFuY2hvci55LCB0ci54LCB5ICsgdHIueSwgdGV4LnggKyB0ZXgudywgdGV4LnksIHNpemVWZXJ0ZXgsIGlzU0RGLCBwaXhlbE9mZnNldEJSLngsIHBpeGVsT2Zmc2V0VEwueSwgbWluRm9udFNjYWxlWCwgbWluRm9udFNjYWxlWSk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGxhYmVsQW5jaG9yLngsIGxhYmVsQW5jaG9yLnksIGxhYmVsQW5jaG9yLnosIHRpbGVBbmNob3IueCwgdGlsZUFuY2hvci55LCBibC54LCB5ICsgYmwueSwgdGV4LngsIHRleC55ICsgdGV4LmgsIHNpemVWZXJ0ZXgsIGlzU0RGLCBwaXhlbE9mZnNldFRMLngsIHBpeGVsT2Zmc2V0QlIueSwgbWluRm9udFNjYWxlWCwgbWluRm9udFNjYWxlWSk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGxhYmVsQW5jaG9yLngsIGxhYmVsQW5jaG9yLnksIGxhYmVsQW5jaG9yLnosIHRpbGVBbmNob3IueCwgdGlsZUFuY2hvci55LCBici54LCB5ICsgYnIueSwgdGV4LnggKyB0ZXgudywgdGV4LnkgKyB0ZXguaCwgc2l6ZVZlcnRleCwgaXNTREYsIHBpeGVsT2Zmc2V0QlIueCwgcGl4ZWxPZmZzZXRCUi55LCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZKTtcblxuICAgICAgICAgICAgYWRkRHluYW1pY0F0dHJpYnV0ZXMoYXJyYXlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgbGFiZWxBbmNob3IsIGFuZ2xlKTtcblxuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyAxLCBpbmRleCArIDIpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDEsIGluZGV4ICsgMiwgaW5kZXggKyAzKTtcblxuICAgICAgICAgICAgc2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gNDtcbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IDI7XG5cbiAgICAgICAgICAgIHRoaXMuZ2x5cGhPZmZzZXRBcnJheS5lbXBsYWNlQmFjayhnbHlwaE9mZnNldFswXSk7XG5cbiAgICAgICAgICAgIGlmIChpID09PSBxdWFkcy5sZW5ndGggLSAxIHx8IHNlY3Rpb25JbmRleCAhPT0gcXVhZHNbaSArIDFdLnNlY3Rpb25JbmRleCkge1xuICAgICAgICAgICAgICAgIGFycmF5cy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyhsYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUsIGZlYXR1cmUuaW5kZXgsIHt9LCBhdmFpbGFibGVJbWFnZXMsIGNhbm9uaWNhbCwgc2VjdGlvbnMgJiYgc2VjdGlvbnNbc2VjdGlvbkluZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheXMucGxhY2VkU3ltYm9sQXJyYXkuZW1wbGFjZUJhY2sobGFiZWxBbmNob3IueCwgbGFiZWxBbmNob3IueSwgbGFiZWxBbmNob3IueiwgdGlsZUFuY2hvci54LCB0aWxlQW5jaG9yLnksXG4gICAgICAgICAgICBnbHlwaE9mZnNldEFycmF5U3RhcnQsIHRoaXMuZ2x5cGhPZmZzZXRBcnJheS5sZW5ndGggLSBnbHlwaE9mZnNldEFycmF5U3RhcnQsIHZlcnRleFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICBsaW5lU3RhcnRJbmRleCwgbGluZUxlbmd0aCwgKHRpbGVBbmNob3Iuc2VnbWVudDogYW55KSxcbiAgICAgICAgICAgIHNpemVWZXJ0ZXggPyBzaXplVmVydGV4WzBdIDogMCwgc2l6ZVZlcnRleCA/IHNpemVWZXJ0ZXhbMV0gOiAwLFxuICAgICAgICAgICAgbGluZU9mZnNldFswXSwgbGluZU9mZnNldFsxXSxcbiAgICAgICAgICAgIHdyaXRpbmdNb2RlLFxuICAgICAgICAgICAgLy8gcGxhY2VkT3JpZW50YXRpb24gaXMgbnVsbCBpbml0aWFsbHk7IHdpbGwgYmUgdXBkYXRlZCB0byBob3Jpem9udGFsKDEpL3ZlcnRpY2FsKDIpIGlmIHBsYWNlZFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIChmYWxzZTogYW55KSxcbiAgICAgICAgICAgIC8vIFRoZSBjcm9zc1RpbGVJRCBpcyBvbmx5IGZpbGxlZC91c2VkIG9uIHRoZSBmb3JlZ3JvdW5kIGZvciBkeW5hbWljIHRleHQgYW5jaG9yc1xuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGFzc29jaWF0ZWRJY29uSW5kZXgsXG4gICAgICAgICAgICAvLyBmbGlwU3RhdGUgaXMgdW5rbm93biBpbml0aWFsbHk7IHdpbGwgYmUgdXBkYXRlZCB0byBmbGlwUmVxdWlyZWQoMSkvZmxpcE5vdFJlcXVpcmVkKDIpIGR1cmluZyBsaW5lIGxhYmVsIHJlcHJvamVjdGlvblxuICAgICAgICAgICAgMFxuICAgICAgICApO1xuICAgIH1cblxuICAgIF9jb21taXRMYXlvdXRWZXJ0ZXgoYXJyYXk6IFN0cnVjdEFycmF5LCBib3hUaWxlQW5jaG9yWDogbnVtYmVyLCBib3hUaWxlQW5jaG9yWTogbnVtYmVyLCBib3hUaWxlQW5jaG9yWjogbnVtYmVyLCB0aWxlQW5jaG9yWDogbnVtYmVyLCB0aWxlQW5jaG9yWTogbnVtYmVyLCBleHRydWRlOiBQb2ludCkge1xuICAgICAgICBhcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgICAgIC8vIHBvc1xuICAgICAgICAgICAgYm94VGlsZUFuY2hvclgsXG4gICAgICAgICAgICBib3hUaWxlQW5jaG9yWSxcbiAgICAgICAgICAgIGJveFRpbGVBbmNob3JaLFxuICAgICAgICAgICAgLy8gYV9hbmNob3JfcG9zXG4gICAgICAgICAgICB0aWxlQW5jaG9yWCxcbiAgICAgICAgICAgIHRpbGVBbmNob3JZLFxuICAgICAgICAgICAgLy8gZXh0cnVkZVxuICAgICAgICAgICAgTWF0aC5yb3VuZChleHRydWRlLngpLFxuICAgICAgICAgICAgTWF0aC5yb3VuZChleHRydWRlLnkpKTtcbiAgICB9XG5cbiAgICBfYWRkQ29sbGlzaW9uRGVidWdWZXJ0aWNlcyhib3g6IENvbGxpc2lvbkJveCwgc2NhbGU6IG51bWJlciwgYXJyYXlzOiBDb2xsaXNpb25CdWZmZXJzLCBib3hUaWxlQW5jaG9yWDogbnVtYmVyLCBib3hUaWxlQW5jaG9yWTogbnVtYmVyLCBib3hUaWxlQW5jaG9yWjogbnVtYmVyLCBzeW1ib2xJbnN0YW5jZTogU3ltYm9sSW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IGFycmF5cy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LCBhcnJheXMubGF5b3V0VmVydGV4QXJyYXksIGFycmF5cy5pbmRleEFycmF5KTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcbiAgICAgICAgY29uc3Qgc3ltYm9sVGlsZUFuY2hvclggPSBzeW1ib2xJbnN0YW5jZS50aWxlQW5jaG9yWDtcbiAgICAgICAgY29uc3Qgc3ltYm9sVGlsZUFuY2hvclkgPSBzeW1ib2xJbnN0YW5jZS50aWxlQW5jaG9yWTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgYXJyYXlzLmNvbGxpc2lvblZlcnRleEFycmF5LmVtcGxhY2VCYWNrKDAsIDAsIDAsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJyYXlzLmNvbGxpc2lvblZlcnRleEFycmF5RXh0LmVtcGxhY2VCYWNrKHNjYWxlLCAtYm94LnBhZGRpbmcsIC1ib3gucGFkZGluZyk7XG4gICAgICAgIGFycmF5cy5jb2xsaXNpb25WZXJ0ZXhBcnJheUV4dC5lbXBsYWNlQmFjayhzY2FsZSwgIGJveC5wYWRkaW5nLCAtYm94LnBhZGRpbmcpO1xuICAgICAgICBhcnJheXMuY29sbGlzaW9uVmVydGV4QXJyYXlFeHQuZW1wbGFjZUJhY2soc2NhbGUsICBib3gucGFkZGluZywgIGJveC5wYWRkaW5nKTtcbiAgICAgICAgYXJyYXlzLmNvbGxpc2lvblZlcnRleEFycmF5RXh0LmVtcGxhY2VCYWNrKHNjYWxlLCAtYm94LnBhZGRpbmcsICBib3gucGFkZGluZyk7XG5cbiAgICAgICAgdGhpcy5fY29tbWl0TGF5b3V0VmVydGV4KGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgYm94VGlsZUFuY2hvclgsIGJveFRpbGVBbmNob3JZLCBib3hUaWxlQW5jaG9yWiwgc3ltYm9sVGlsZUFuY2hvclgsIHN5bWJvbFRpbGVBbmNob3JZLCBuZXcgUG9pbnQoYm94LngxLCBib3gueTEpKTtcbiAgICAgICAgdGhpcy5fY29tbWl0TGF5b3V0VmVydGV4KGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgYm94VGlsZUFuY2hvclgsIGJveFRpbGVBbmNob3JZLCBib3hUaWxlQW5jaG9yWiwgc3ltYm9sVGlsZUFuY2hvclgsIHN5bWJvbFRpbGVBbmNob3JZLCBuZXcgUG9pbnQoYm94LngyLCBib3gueTEpKTtcbiAgICAgICAgdGhpcy5fY29tbWl0TGF5b3V0VmVydGV4KGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgYm94VGlsZUFuY2hvclgsIGJveFRpbGVBbmNob3JZLCBib3hUaWxlQW5jaG9yWiwgc3ltYm9sVGlsZUFuY2hvclgsIHN5bWJvbFRpbGVBbmNob3JZLCBuZXcgUG9pbnQoYm94LngyLCBib3gueTIpKTtcbiAgICAgICAgdGhpcy5fY29tbWl0TGF5b3V0VmVydGV4KGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgYm94VGlsZUFuY2hvclgsIGJveFRpbGVBbmNob3JZLCBib3hUaWxlQW5jaG9yWiwgc3ltYm9sVGlsZUFuY2hvclgsIHN5bWJvbFRpbGVBbmNob3JZLCBuZXcgUG9pbnQoYm94LngxLCBib3gueTIpKTtcblxuICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuXG4gICAgICAgIGNvbnN0IGluZGV4QXJyYXk6IExpbmVJbmRleEFycmF5ID0gKGFycmF5cy5pbmRleEFycmF5OiBhbnkpO1xuICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIDEpO1xuICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMSwgaW5kZXggKyAyKTtcbiAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDIsIGluZGV4ICsgMyk7XG4gICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyAzLCBpbmRleCk7XG5cbiAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gNDtcbiAgICB9XG5cbiAgICBfYWRkVGV4dERlYnVnQ29sbGlzaW9uQm94ZXMoc2l6ZTogYW55LCB6b29tOiBudW1iZXIsIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCBpbnN0YW5jZTogU3ltYm9sSW5zdGFuY2UpIHtcbiAgICAgICAgZm9yIChsZXQgYiA9IHN0YXJ0SW5kZXg7IGIgPCBlbmRJbmRleDsgYisrKSB7XG4gICAgICAgICAgICBjb25zdCBib3g6IENvbGxpc2lvbkJveCA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoYik6IGFueSk7XG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuZ2V0U3ltYm9sSW5zdGFuY2VUZXh0U2l6ZShzaXplLCBpbnN0YW5jZSwgem9vbSwgYik7XG5cbiAgICAgICAgICAgIHRoaXMuX2FkZENvbGxpc2lvbkRlYnVnVmVydGljZXMoYm94LCBzY2FsZSwgdGhpcy50ZXh0Q29sbGlzaW9uQm94LCBib3gucHJvamVjdGVkQW5jaG9yWCwgYm94LnByb2plY3RlZEFuY2hvclksIGJveC5wcm9qZWN0ZWRBbmNob3JaLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYWRkSWNvbkRlYnVnQ29sbGlzaW9uQm94ZXMoc2l6ZTogYW55LCB6b29tOiBudW1iZXIsIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCBpbnN0YW5jZTogU3ltYm9sSW5zdGFuY2UpIHtcbiAgICAgICAgZm9yIChsZXQgYiA9IHN0YXJ0SW5kZXg7IGIgPCBlbmRJbmRleDsgYisrKSB7XG4gICAgICAgICAgICBjb25zdCBib3g6IENvbGxpc2lvbkJveCA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoYik6IGFueSk7XG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuZ2V0U3ltYm9sSW5zdGFuY2VJY29uU2l6ZShzaXplLCB6b29tLCBiKTtcblxuICAgICAgICAgICAgdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0aWNlcyhib3gsIHNjYWxlLCB0aGlzLmljb25Db2xsaXNpb25Cb3gsIGJveC5wcm9qZWN0ZWRBbmNob3JYLCBib3gucHJvamVjdGVkQW5jaG9yWSwgYm94LnByb2plY3RlZEFuY2hvclosIGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdlbmVyYXRlQ29sbGlzaW9uRGVidWdCdWZmZXJzKHpvb206IG51bWJlciwgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RlYnVnRGF0YSgpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lEZWJ1Z0RhdGEoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGV4dENvbGxpc2lvbkJveCA9IG5ldyBDb2xsaXNpb25CdWZmZXJzKENvbGxpc2lvbkJveExheW91dEFycmF5LCBjb2xsaXNpb25Cb3hMYXlvdXQubWVtYmVycywgTGluZUluZGV4QXJyYXkpO1xuICAgICAgICB0aGlzLmljb25Db2xsaXNpb25Cb3ggPSBuZXcgQ29sbGlzaW9uQnVmZmVycyhDb2xsaXNpb25Cb3hMYXlvdXRBcnJheSwgY29sbGlzaW9uQm94TGF5b3V0Lm1lbWJlcnMsIExpbmVJbmRleEFycmF5KTtcblxuICAgICAgICBjb25zdCBpY29uU2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbSh0aGlzLmljb25TaXplRGF0YSwgem9vbSk7XG4gICAgICAgIGNvbnN0IHRleHRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHRoaXMudGV4dFNpemVEYXRhLCB6b29tKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRleHREZWJ1Z0NvbGxpc2lvbkJveGVzKHRleHRTaXplLCB6b29tLCBjb2xsaXNpb25Cb3hBcnJheSwgc3ltYm9sSW5zdGFuY2UudGV4dEJveFN0YXJ0SW5kZXgsIHN5bWJvbEluc3RhbmNlLnRleHRCb3hFbmRJbmRleCwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgdGhpcy5fYWRkVGV4dERlYnVnQ29sbGlzaW9uQm94ZXModGV4dFNpemUsIHpvb20sIGNvbGxpc2lvbkJveEFycmF5LCBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4LCBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgdGhpcy5fYWRkSWNvbkRlYnVnQ29sbGlzaW9uQm94ZXMoaWNvblNpemUsIHpvb20sIGNvbGxpc2lvbkJveEFycmF5LCBzeW1ib2xJbnN0YW5jZS5pY29uQm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UuaWNvbkJveEVuZEluZGV4LCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLl9hZGRJY29uRGVidWdDb2xsaXNpb25Cb3hlcyhpY29uU2l6ZSwgem9vbSwgY29sbGlzaW9uQm94QXJyYXksIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsSWNvbkJveFN0YXJ0SW5kZXgsIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsSWNvbkJveEVuZEluZGV4LCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTeW1ib2xJbnN0YW5jZVRleHRTaXplKHRleHRTaXplOiBhbnksIGluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSwgem9vbTogbnVtYmVyLCBib3hJbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbEluZGV4ID0gaW5zdGFuY2UucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXggPj0gMCA/XG4gICAgICAgICAgICBpbnN0YW5jZS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCA6IGluc3RhbmNlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCA+PSAwID9cbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXggOiBpbnN0YW5jZS5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4ID49IDAgP1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4IDogaW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXggPj0gMCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCA6IGJveEluZGV4O1xuXG4gICAgICAgIGNvbnN0IHN5bWJvbDogYW55ID0gdGhpcy50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChzeW1ib2xJbmRleCk7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3JGZWF0dXJlKHRoaXMudGV4dFNpemVEYXRhLCB0ZXh0U2l6ZSwgc3ltYm9sKSAvIE9ORV9FTTtcblxuICAgICAgICByZXR1cm4gdGhpcy50aWxlUGl4ZWxSYXRpbyAqIGZlYXR1cmVTaXplO1xuICAgIH1cblxuICAgIGdldFN5bWJvbEluc3RhbmNlSWNvblNpemUoaWNvblNpemU6IGFueSwgem9vbTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbDogYW55ID0gdGhpcy5pY29uLnBsYWNlZFN5bWJvbEFycmF5LmdldChpbmRleCk7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3JGZWF0dXJlKHRoaXMuaWNvblNpemVEYXRhLCBpY29uU2l6ZSwgc3ltYm9sKTtcblxuICAgICAgICByZXR1cm4gdGhpcy50aWxlUGl4ZWxSYXRpbyAqIGZlYXR1cmVTaXplO1xuICAgIH1cblxuICAgIF9jb21taXREZWJ1Z0NvbGxpc2lvblZlcnRleFVwZGF0ZShhcnJheTogU3RydWN0QXJyYXksIHNjYWxlOiBudW1iZXIsIHBhZGRpbmc6IG51bWJlcikge1xuICAgICAgICBhcnJheS5lbXBsYWNlQmFjayhzY2FsZSwgLXBhZGRpbmcsIC1wYWRkaW5nKTtcbiAgICAgICAgYXJyYXkuZW1wbGFjZUJhY2soc2NhbGUsICBwYWRkaW5nLCAtcGFkZGluZyk7XG4gICAgICAgIGFycmF5LmVtcGxhY2VCYWNrKHNjYWxlLCAgcGFkZGluZywgIHBhZGRpbmcpO1xuICAgICAgICBhcnJheS5lbXBsYWNlQmFjayhzY2FsZSwgLXBhZGRpbmcsICBwYWRkaW5nKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlVGV4dERlYnVnQ29sbGlzaW9uQm94ZXMoc2l6ZTogYW55LCB6b29tOiBudW1iZXIsIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCBpbnN0YW5jZTogU3ltYm9sSW5zdGFuY2UpIHtcbiAgICAgICAgZm9yIChsZXQgYiA9IHN0YXJ0SW5kZXg7IGIgPCBlbmRJbmRleDsgYisrKSB7XG4gICAgICAgICAgICBjb25zdCBib3g6IENvbGxpc2lvbkJveCA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoYik6IGFueSk7XG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuZ2V0U3ltYm9sSW5zdGFuY2VUZXh0U2l6ZShzaXplLCBpbnN0YW5jZSwgem9vbSwgYik7XG4gICAgICAgICAgICBjb25zdCBhcnJheSA9IHRoaXMudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheUV4dDtcbiAgICAgICAgICAgIHRoaXMuX2NvbW1pdERlYnVnQ29sbGlzaW9uVmVydGV4VXBkYXRlKGFycmF5LCBzY2FsZSwgYm94LnBhZGRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZUljb25EZWJ1Z0NvbGxpc2lvbkJveGVzKHNpemU6IGFueSwgem9vbTogbnVtYmVyLCBjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXksIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcikge1xuICAgICAgICBmb3IgKGxldCBiID0gc3RhcnRJbmRleDsgYiA8IGVuZEluZGV4OyBiKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChiKTogYW55KTtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5nZXRTeW1ib2xJbnN0YW5jZUljb25TaXplKHNpemUsIHpvb20sIGIpO1xuICAgICAgICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXlFeHQ7XG4gICAgICAgICAgICB0aGlzLl9jb21taXREZWJ1Z0NvbGxpc2lvblZlcnRleFVwZGF0ZShhcnJheSwgc2NhbGUsIGJveC5wYWRkaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZUNvbGxpc2lvbkRlYnVnQnVmZmVycyh6b29tOiBudW1iZXIsIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzRGVidWdEYXRhKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhKCkpIHRoaXMudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheUV4dC5jbGVhcigpO1xuICAgICAgICBpZiAodGhpcy5oYXNJY29uQ29sbGlzaW9uQm94RGF0YSgpKSB0aGlzLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXlFeHQuY2xlYXIoKTtcblxuICAgICAgICBjb25zdCBpY29uU2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbSh0aGlzLmljb25TaXplRGF0YSwgem9vbSk7XG4gICAgICAgIGNvbnN0IHRleHRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHRoaXMudGV4dFNpemVEYXRhLCB6b29tKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRleHREZWJ1Z0NvbGxpc2lvbkJveGVzKHRleHRTaXplLCB6b29tLCBjb2xsaXNpb25Cb3hBcnJheSwgc3ltYm9sSW5zdGFuY2UudGV4dEJveFN0YXJ0SW5kZXgsIHN5bWJvbEluc3RhbmNlLnRleHRCb3hFbmRJbmRleCwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGV4dERlYnVnQ29sbGlzaW9uQm94ZXModGV4dFNpemUsIHpvb20sIGNvbGxpc2lvbkJveEFycmF5LCBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4LCBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSWNvbkRlYnVnQ29sbGlzaW9uQm94ZXMoaWNvblNpemUsIHpvb20sIGNvbGxpc2lvbkJveEFycmF5LCBzeW1ib2xJbnN0YW5jZS5pY29uQm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UuaWNvbkJveEVuZEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUljb25EZWJ1Z0NvbGxpc2lvbkJveGVzKGljb25TaXplLCB6b29tLCBjb2xsaXNpb25Cb3hBcnJheSwgc3ltYm9sSW5zdGFuY2UudmVydGljYWxJY29uQm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UudmVydGljYWxJY29uQm94RW5kSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSAmJiB0aGlzLnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyRXh0KSB7XG4gICAgICAgICAgICB0aGlzLnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyRXh0LnVwZGF0ZURhdGEodGhpcy50ZXh0Q29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5RXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNJY29uQ29sbGlzaW9uQm94RGF0YSgpICYmIHRoaXMuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXJFeHQpIHtcbiAgICAgICAgICAgIHRoaXMuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXJFeHQudXBkYXRlRGF0YSh0aGlzLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXlFeHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlc2UgZmxhdCBhcnJheXMgYXJlIG1lYW50IHRvIGJlIHF1aWNrZXIgdG8gaXRlcmF0ZSBvdmVyIHRoYW4gdGhlIHNvdXJjZVxuICAgIC8vIENvbGxpc2lvbkJveEFycmF5XG4gICAgX2Rlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXNGb3JTeW1ib2woY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICB0ZXh0U3RhcnRJbmRleDogbnVtYmVyLCB0ZXh0RW5kSW5kZXg6IG51bWJlcixcbiAgICAgICAgdmVydGljYWxUZXh0U3RhcnRJbmRleDogbnVtYmVyLCB2ZXJ0aWNhbFRleHRFbmRJbmRleDogbnVtYmVyLFxuICAgICAgICBpY29uU3RhcnRJbmRleDogbnVtYmVyLCBpY29uRW5kSW5kZXg6IG51bWJlcixcbiAgICAgICAgdmVydGljYWxJY29uU3RhcnRJbmRleDogbnVtYmVyLCB2ZXJ0aWNhbEljb25FbmRJbmRleDogbnVtYmVyKTogQ29sbGlzaW9uQXJyYXlzIHtcblxuICAgICAgICBjb25zdCBjb2xsaXNpb25BcnJheXMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgayA9IHRleHRTdGFydEluZGV4OyBrIDwgdGV4dEVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChrKTogYW55KTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy50ZXh0Qm94ID0ge3gxOiBib3gueDEsIHkxOiBib3gueTEsIHgyOiBib3gueDIsIHkyOiBib3gueTIsIHBhZGRpbmc6IGJveC5wYWRkaW5nLCBwcm9qZWN0ZWRBbmNob3JYOiBib3gucHJvamVjdGVkQW5jaG9yWCwgcHJvamVjdGVkQW5jaG9yWTogYm94LnByb2plY3RlZEFuY2hvclksIHByb2plY3RlZEFuY2hvclo6IGJveC5wcm9qZWN0ZWRBbmNob3JaLCB0aWxlQW5jaG9yWDogYm94LnRpbGVBbmNob3JYLCB0aWxlQW5jaG9yWTogYm94LnRpbGVBbmNob3JZfTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy50ZXh0RmVhdHVyZUluZGV4ID0gYm94LmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgIGJyZWFrOyAvLyBPbmx5IG9uZSBib3ggYWxsb3dlZCBwZXIgaW5zdGFuY2VcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrID0gdmVydGljYWxUZXh0U3RhcnRJbmRleDsgayA8IHZlcnRpY2FsVGV4dEVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChrKTogYW55KTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbFRleHRCb3ggPSB7eDE6IGJveC54MSwgeTE6IGJveC55MSwgeDI6IGJveC54MiwgeTI6IGJveC55MiwgcGFkZGluZzogYm94LnBhZGRpbmcsIHByb2plY3RlZEFuY2hvclg6IGJveC5wcm9qZWN0ZWRBbmNob3JYLCBwcm9qZWN0ZWRBbmNob3JZOiBib3gucHJvamVjdGVkQW5jaG9yWSwgcHJvamVjdGVkQW5jaG9yWjogYm94LnByb2plY3RlZEFuY2hvclosIHRpbGVBbmNob3JYOiBib3gudGlsZUFuY2hvclgsIHRpbGVBbmNob3JZOiBib3gudGlsZUFuY2hvcll9O1xuICAgICAgICAgICAgY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleCA9IGJveC5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICBicmVhazsgLy8gT25seSBvbmUgYm94IGFsbG93ZWQgcGVyIGluc3RhbmNlXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgayA9IGljb25TdGFydEluZGV4OyBrIDwgaWNvbkVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIC8vIEFuIGljb24gY2FuIG9ubHkgaGF2ZSBvbmUgYm94IG5vdywgc28gdGhpcyBpbmRleGluZyBpcyBhIGJpdCB2ZXN0aWdpYWwuLi5cbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChrKTogYW55KTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy5pY29uQm94ID0ge3gxOiBib3gueDEsIHkxOiBib3gueTEsIHgyOiBib3gueDIsIHkyOiBib3gueTIsIHBhZGRpbmc6IGJveC5wYWRkaW5nLCBwcm9qZWN0ZWRBbmNob3JYOiBib3gucHJvamVjdGVkQW5jaG9yWCwgcHJvamVjdGVkQW5jaG9yWTogYm94LnByb2plY3RlZEFuY2hvclksIHByb2plY3RlZEFuY2hvclo6IGJveC5wcm9qZWN0ZWRBbmNob3JaLCB0aWxlQW5jaG9yWDogYm94LnRpbGVBbmNob3JYLCB0aWxlQW5jaG9yWTogYm94LnRpbGVBbmNob3JZfTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy5pY29uRmVhdHVyZUluZGV4ID0gYm94LmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgIGJyZWFrOyAvLyBPbmx5IG9uZSBib3ggYWxsb3dlZCBwZXIgaW5zdGFuY2VcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrID0gdmVydGljYWxJY29uU3RhcnRJbmRleDsgayA8IHZlcnRpY2FsSWNvbkVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIC8vIEFuIGljb24gY2FuIG9ubHkgaGF2ZSBvbmUgYm94IG5vdywgc28gdGhpcyBpbmRleGluZyBpcyBhIGJpdCB2ZXN0aWdpYWwuLi5cbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChrKTogYW55KTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbEljb25Cb3ggPSB7eDE6IGJveC54MSwgeTE6IGJveC55MSwgeDI6IGJveC54MiwgeTI6IGJveC55MiwgcGFkZGluZzogYm94LnBhZGRpbmcsIHByb2plY3RlZEFuY2hvclg6IGJveC5wcm9qZWN0ZWRBbmNob3JYLCBwcm9qZWN0ZWRBbmNob3JZOiBib3gucHJvamVjdGVkQW5jaG9yWSwgcHJvamVjdGVkQW5jaG9yWjogYm94LnByb2plY3RlZEFuY2hvclosIHRpbGVBbmNob3JYOiBib3gudGlsZUFuY2hvclgsIHRpbGVBbmNob3JZOiBib3gudGlsZUFuY2hvcll9O1xuICAgICAgICAgICAgY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsSWNvbkZlYXR1cmVJbmRleCA9IGJveC5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICBicmVhazsgLy8gT25seSBvbmUgYm94IGFsbG93ZWQgcGVyIGluc3RhbmNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxpc2lvbkFycmF5cztcbiAgICB9XG5cbiAgICBkZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSkge1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkFycmF5cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHRoaXMuY29sbGlzaW9uQXJyYXlzLnB1c2godGhpcy5fZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlc0ZvclN5bWJvbChcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94RW5kSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UudmVydGljYWxUZXh0Qm94U3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5pY29uQm94U3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5pY29uQm94RW5kSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UudmVydGljYWxJY29uQm94U3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbEljb25Cb3hFbmRJbmRleFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNUZXh0RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dC5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGhhc0ljb25EYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uLnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgaGFzRGVidWdEYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0Q29sbGlzaW9uQm94ICYmIHRoaXMuaWNvbkNvbGxpc2lvbkJveDtcbiAgICB9XG5cbiAgICBoYXNUZXh0Q29sbGlzaW9uQm94RGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzRGVidWdEYXRhKCkgJiYgdGhpcy50ZXh0Q29sbGlzaW9uQm94LnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgaGFzSWNvbkNvbGxpc2lvbkJveERhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0RlYnVnRGF0YSgpICYmIHRoaXMuaWNvbkNvbGxpc2lvbkJveC5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2woaWNvbk9yVGV4dDogU3ltYm9sQnVmZmVycywgcGxhY2VkU3ltYm9sSW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwbGFjZWRTeW1ib2wgPSBpY29uT3JUZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChwbGFjZWRTeW1ib2xJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBwbGFjZWRTeW1ib2wudmVydGV4U3RhcnRJbmRleCArIHBsYWNlZFN5bWJvbC5udW1HbHlwaHMgKiA0O1xuICAgICAgICBmb3IgKGxldCB2ZXJ0ZXhJbmRleCA9IHBsYWNlZFN5bWJvbC52ZXJ0ZXhTdGFydEluZGV4OyB2ZXJ0ZXhJbmRleCA8IGVuZEluZGV4OyB2ZXJ0ZXhJbmRleCArPSA0KSB7XG4gICAgICAgICAgICBpY29uT3JUZXh0LmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodmVydGV4SW5kZXgsIHZlcnRleEluZGV4ICsgMSwgdmVydGV4SW5kZXggKyAyKTtcbiAgICAgICAgICAgIGljb25PclRleHQuaW5kZXhBcnJheS5lbXBsYWNlQmFjayh2ZXJ0ZXhJbmRleCArIDEsIHZlcnRleEluZGV4ICsgMiwgdmVydGV4SW5kZXggKyAzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFNvcnRlZFN5bWJvbEluZGV4ZXMoYW5nbGU6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5zb3J0ZWRBbmdsZSA9PT0gYW5nbGUgJiYgdGhpcy5zeW1ib2xJbnN0YW5jZUluZGV4ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgICBjb25zdCByb3RhdGVkWXMgPSBbXTtcbiAgICAgICAgY29uc3QgZmVhdHVyZUluZGV4ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goaSk7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHJvdGF0ZWRZcy5wdXNoKE1hdGgucm91bmQoc2luICogc3ltYm9sSW5zdGFuY2UudGlsZUFuY2hvclggKyBjb3MgKiBzeW1ib2xJbnN0YW5jZS50aWxlQW5jaG9yWSkgfCAwKTtcbiAgICAgICAgICAgIGZlYXR1cmVJbmRleGVzLnB1c2goc3ltYm9sSW5zdGFuY2UuZmVhdHVyZUluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5zb3J0KChhSW5kZXgsIGJJbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChyb3RhdGVkWXNbYUluZGV4XSAtIHJvdGF0ZWRZc1tiSW5kZXhdKSB8fFxuICAgICAgICAgICAgICAgICAgIChmZWF0dXJlSW5kZXhlc1tiSW5kZXhdIC0gZmVhdHVyZUluZGV4ZXNbYUluZGV4XSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgYWRkVG9Tb3J0S2V5UmFuZ2VzKHN5bWJvbEluc3RhbmNlSW5kZXg6IG51bWJlciwgc29ydEtleTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLnNvcnRLZXlSYW5nZXNbdGhpcy5zb3J0S2V5UmFuZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAobGFzdCAmJiBsYXN0LnNvcnRLZXkgPT09IHNvcnRLZXkpIHtcbiAgICAgICAgICAgIGxhc3Quc3ltYm9sSW5zdGFuY2VFbmQgPSBzeW1ib2xJbnN0YW5jZUluZGV4ICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc29ydEtleVJhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzb3J0S2V5LFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlU3RhcnQ6IHN5bWJvbEluc3RhbmNlSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2VFbmQ6IHN5bWJvbEluc3RhbmNlSW5kZXggKyAxXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNvcnRGZWF0dXJlcyhhbmdsZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5zb3J0RmVhdHVyZXNCeVkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuc29ydGVkQW5nbGUgPT09IGFuZ2xlKSByZXR1cm47XG5cbiAgICAgICAgLy8gVGhlIGN1cnJlbnQgYXBwcm9hY2ggdG8gc29ydGluZyBkb2Vzbid0IHNvcnQgYWNyb3NzIHNlZ21lbnRzIHNvIGRvbid0IHRyeS5cbiAgICAgICAgLy8gU29ydGluZyB3aXRoaW4gc2VnbWVudHMgc2VwYXJhdGVseSBzZWVtZWQgbm90IHRvIGJlIHdvcnRoIHRoZSBjb21wbGV4aXR5LlxuICAgICAgICBpZiAodGhpcy50ZXh0LnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDEgfHwgdGhpcy5pY29uLnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDEpIHJldHVybjtcblxuICAgICAgICAvLyBJZiB0aGUgc3ltYm9scyBhcmUgYWxsb3dlZCB0byBvdmVybGFwIHNvcnQgdGhlbSBieSB0aGVpciB2ZXJ0aWNhbCBzY3JlZW4gcG9zaXRpb24uXG4gICAgICAgIC8vIFRoZSBpbmRleCBhcnJheSBidWZmZXIgaXMgcmV3cml0dGVuIHRvIHJlZmVyZW5jZSB0aGUgKHVuY2hhbmdlZCkgdmVydGljZXMgaW4gdGhlXG4gICAgICAgIC8vIHNvcnRlZCBvcmRlci5cblxuICAgICAgICAvLyBUbyBhdm9pZCBzb3J0aW5nIHRoZSBhY3R1YWwgc3ltYm9sSW5zdGFuY2UgYXJyYXkgd2Ugc29ydCBhbiBhcnJheSBvZiBpbmRleGVzLlxuICAgICAgICB0aGlzLnN5bWJvbEluc3RhbmNlSW5kZXhlcyA9IHRoaXMuZ2V0U29ydGVkU3ltYm9sSW5kZXhlcyhhbmdsZSk7XG4gICAgICAgIHRoaXMuc29ydGVkQW5nbGUgPSBhbmdsZTtcblxuICAgICAgICB0aGlzLnRleHQuaW5kZXhBcnJheS5jbGVhcigpO1xuICAgICAgICB0aGlzLmljb24uaW5kZXhBcnJheS5jbGVhcigpO1xuXG4gICAgICAgIHRoaXMuZmVhdHVyZVNvcnRPcmRlciA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnN5bWJvbEluc3RhbmNlSW5kZXhlcykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSB0aGlzLnN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVTb3J0T3JkZXIucHVzaChzeW1ib2xJbnN0YW5jZS5mZWF0dXJlSW5kZXgpO1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhcbiAgICAgICAgICAgIF0uZm9yRWFjaCgoaW5kZXgsIGksIGFycmF5KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBhZGQgYSBnaXZlbiBpbmRleCB0aGUgZmlyc3QgdGltZSBpdCBzaG93cyB1cCxcbiAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBkdXBsaWNhdGUgb3BhY2l0eSBlbnRyaWVzIHdoZW4gbXVsdGlwbGUganVzdGlmaWNhdGlvbnNcbiAgICAgICAgICAgICAgICAvLyBzaGFyZSB0aGUgc2FtZSBnbHlwaHMuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgYXJyYXkuaW5kZXhPZihpbmRleCkgPT09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJbmRpY2VzRm9yUGxhY2VkU3ltYm9sKHRoaXMudGV4dCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSW5kaWNlc0ZvclBsYWNlZFN5bWJvbCh0aGlzLnRleHQsIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnBsYWNlZEljb25TeW1ib2xJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRJbmRpY2VzRm9yUGxhY2VkU3ltYm9sKHRoaXMuaWNvbiwgc3ltYm9sSW5zdGFuY2UucGxhY2VkSWNvblN5bWJvbEluZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy5pY29uLCBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50ZXh0LmluZGV4QnVmZmVyKSB0aGlzLnRleHQuaW5kZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLnRleHQuaW5kZXhBcnJheSk7XG4gICAgICAgIGlmICh0aGlzLmljb24uaW5kZXhCdWZmZXIpIHRoaXMuaWNvbi5pbmRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMuaWNvbi5pbmRleEFycmF5KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdTeW1ib2xCdWNrZXQnLCBTeW1ib2xCdWNrZXQsIHtcbiAgICBvbWl0OiBbJ2xheWVycycsICdjb2xsaXNpb25Cb3hBcnJheScsICdmZWF0dXJlcycsICdjb21wYXJlVGV4dCddXG59KTtcblxuLy8gdGhpcyBjb25zdGFudCBpcyBiYXNlZCBvbiB0aGUgc2l6ZSBvZiBTdHJ1Y3RBcnJheSBpbmRleGVzIHVzZWQgaW4gYSBzeW1ib2xcbi8vIGJ1Y2tldC0tbmFtZWx5LCBnbHlwaE9mZnNldEFycmF5U3RhcnRcbi8vIGVnIHRoZSBtYXggdmFsaWQgVUludDE2IGlzIDY1LDUzNVxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTA3IGZvciBtb3RpdmF0aW9uXG4vLyBsaW5lU3RhcnRJbmRleCBhbmQgdGV4dEJveFN0YXJ0SW5kZXggY291bGQgcG90ZW50aWFsbHkgYmUgY29uY2VybnNcbi8vIGJ1dCB3ZSBleHBlY3QgdGhlcmUgdG8gYmUgbWFueSBmZXdlciBib3hlcy9saW5lcyB0aGFuIGdseXBoc1xuU3ltYm9sQnVja2V0Lk1BWF9HTFlQSFMgPSA2NTUzNTtcblxuU3ltYm9sQnVja2V0LmFkZER5bmFtaWNBdHRyaWJ1dGVzID0gYWRkRHluYW1pY0F0dHJpYnV0ZXM7XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbEJ1Y2tldDtcbmV4cG9ydCB7YWRkRHluYW1pY0F0dHJpYnV0ZXN9O1xuIiwiLy8gQGZsb3dcbmV4cG9ydCBkZWZhdWx0IHJlc29sdmVUb2tlbnM7XG5cbi8qKlxuICogUmVwbGFjZSB0b2tlbnMgaW4gYSBzdHJpbmcgdGVtcGxhdGUgd2l0aCB2YWx1ZXMgaW4gYW4gb2JqZWN0XG4gKlxuICogQHBhcmFtIHByb3BlcnRpZXMgYSBrZXkvdmFsdWUgcmVsYXRpb25zaGlwIGJldHdlZW4gdG9rZW5zIGFuZCByZXBsYWNlbWVudHNcbiAqIEBwYXJhbSB0ZXh0IHRoZSB0ZW1wbGF0ZSBzdHJpbmdcbiAqIEByZXR1cm5zIHRoZSB0ZW1wbGF0ZSB3aXRoIHRva2VucyByZXBsYWNlZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVRva2Vucyhwcm9wZXJ0aWVzOiB7K1tzdHJpbmddOiBtaXhlZH0sIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZSgveyhbXnt9XSspfS9nLCAobWF0Y2gsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gcHJvcGVydGllcyA/IFN0cmluZyhwcm9wZXJ0aWVzW2tleV0pIDogJyc7XG4gICAgfSk7XG59XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdC5qcyc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcblxuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuXG5pbXBvcnQge1xuICAgIENvbG9yVHlwZVxufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSBMYXlvdXRQcm9wcyA9IHt8XG4gICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwicG9pbnRcIiB8IFwibGluZVwiIHwgXCJsaW5lLWNlbnRlclwiPixcbiAgICBcInN5bWJvbC1zcGFjaW5nXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJzeW1ib2wtYXZvaWQtZWRnZXNcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJzeW1ib2wtc29ydC1rZXlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJzeW1ib2wtei1vcmRlclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcImF1dG9cIiB8IFwidmlld3BvcnQteVwiIHwgXCJzb3VyY2VcIj4sXG4gICAgXCJpY29uLWFsbG93LW92ZXJsYXBcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJpY29uLWlnbm9yZS1wbGFjZW1lbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJpY29uLW9wdGlvbmFsXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIiB8IFwiYXV0b1wiPixcbiAgICBcImljb24tc2l6ZVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImljb24tdGV4dC1maXRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJub25lXCIgfCBcIndpZHRoXCIgfCBcImhlaWdodFwiIHwgXCJib3RoXCI+LFxuICAgIFwiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdPixcbiAgICBcImljb24taW1hZ2VcIjogRGF0YURyaXZlblByb3BlcnR5PFJlc29sdmVkSW1hZ2U+LFxuICAgIFwiaWNvbi1yb3RhdGVcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLXBhZGRpbmdcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcImljb24ta2VlcC11cHJpZ2h0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwiaWNvbi1vZmZzZXRcIjogRGF0YURyaXZlblByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiaWNvbi1hbmNob3JcIjogRGF0YURyaXZlblByb3BlcnR5PFwiY2VudGVyXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwidG9wXCIgfCBcImJvdHRvbVwiIHwgXCJ0b3AtbGVmdFwiIHwgXCJ0b3AtcmlnaHRcIiB8IFwiYm90dG9tLWxlZnRcIiB8IFwiYm90dG9tLXJpZ2h0XCI+LFxuICAgIFwiaWNvbi1waXRjaC1hbGlnbm1lbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIiB8IFwiYXV0b1wiPixcbiAgICBcInRleHQtcGl0Y2gtYWxpZ25tZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCIgfCBcImF1dG9cIj4sXG4gICAgXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiIHwgXCJhdXRvXCI+LFxuICAgIFwidGV4dC1maWVsZFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Rm9ybWF0dGVkPixcbiAgICBcInRleHQtZm9udFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8QXJyYXk8c3RyaW5nPj4sXG4gICAgXCJ0ZXh0LXNpemVcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LW1heC13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtbGluZS1oZWlnaHRcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1qdXN0aWZ5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxcImF1dG9cIiB8IFwibGVmdFwiIHwgXCJjZW50ZXJcIiB8IFwicmlnaHRcIj4sXG4gICAgXCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxBcnJheTxcImNlbnRlclwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcInRvcFwiIHwgXCJib3R0b21cIiB8IFwidG9wLWxlZnRcIiB8IFwidG9wLXJpZ2h0XCIgfCBcImJvdHRvbS1sZWZ0XCIgfCBcImJvdHRvbS1yaWdodFwiPj4sXG4gICAgXCJ0ZXh0LWFuY2hvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8XCJjZW50ZXJcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJ0b3BcIiB8IFwiYm90dG9tXCIgfCBcInRvcC1sZWZ0XCIgfCBcInRvcC1yaWdodFwiIHwgXCJib3R0b20tbGVmdFwiIHwgXCJib3R0b20tcmlnaHRcIj4sXG4gICAgXCJ0ZXh0LW1heC1hbmdsZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC13cml0aW5nLW1vZGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8QXJyYXk8XCJob3Jpem9udGFsXCIgfCBcInZlcnRpY2FsXCI+PixcbiAgICBcInRleHQtcm90YXRlXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1wYWRkaW5nXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LWtlZXAtdXByaWdodFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcInRleHQtdHJhbnNmb3JtXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxcIm5vbmVcIiB8IFwidXBwZXJjYXNlXCIgfCBcImxvd2VyY2FzZVwiPixcbiAgICBcInRleHQtb2Zmc2V0XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBcInRleHQtYWxsb3ctb3ZlcmxhcFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcInRleHQtb3B0aW9uYWxcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG58fTtcblxuY29uc3QgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcInN5bWJvbC1wbGFjZW1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJzeW1ib2wtcGxhY2VtZW50XCJdKSxcbiAgICBcInN5bWJvbC1zcGFjaW5nXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLXNwYWNpbmdcIl0pLFxuICAgIFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLWF2b2lkLWVkZ2VzXCJdKSxcbiAgICBcInN5bWJvbC1zb3J0LWtleVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJzeW1ib2wtc29ydC1rZXlcIl0pLFxuICAgIFwic3ltYm9sLXotb3JkZXJcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJzeW1ib2wtei1vcmRlclwiXSksXG4gICAgXCJpY29uLWFsbG93LW92ZXJsYXBcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLWFsbG93LW92ZXJsYXBcIl0pLFxuICAgIFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCJdKSxcbiAgICBcImljb24tb3B0aW9uYWxcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLW9wdGlvbmFsXCJdKSxcbiAgICBcImljb24tcm90YXRpb24tYWxpZ25tZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnRcIl0pLFxuICAgIFwiaWNvbi1zaXplXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tc2l6ZVwiXSksXG4gICAgXCJpY29uLXRleHQtZml0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi10ZXh0LWZpdFwiXSksXG4gICAgXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXRleHQtZml0LXBhZGRpbmdcIl0pLFxuICAgIFwiaWNvbi1pbWFnZVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLWltYWdlXCJdKSxcbiAgICBcImljb24tcm90YXRlXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tcm90YXRlXCJdKSxcbiAgICBcImljb24tcGFkZGluZ1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tcGFkZGluZ1wiXSksXG4gICAgXCJpY29uLWtlZXAtdXByaWdodFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24ta2VlcC11cHJpZ2h0XCJdKSxcbiAgICBcImljb24tb2Zmc2V0XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tb2Zmc2V0XCJdKSxcbiAgICBcImljb24tYW5jaG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tYW5jaG9yXCJdKSxcbiAgICBcImljb24tcGl0Y2gtYWxpZ25tZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1waXRjaC1hbGlnbm1lbnRcIl0pLFxuICAgIFwidGV4dC1waXRjaC1hbGlnbm1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiXSksXG4gICAgXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtcm90YXRpb24tYWxpZ25tZW50XCJdKSxcbiAgICBcInRleHQtZmllbGRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1maWVsZFwiXSksXG4gICAgXCJ0ZXh0LWZvbnRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1mb250XCJdKSxcbiAgICBcInRleHQtc2l6ZVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LXNpemVcIl0pLFxuICAgIFwidGV4dC1tYXgtd2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1tYXgtd2lkdGhcIl0pLFxuICAgIFwidGV4dC1saW5lLWhlaWdodFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWxpbmUtaGVpZ2h0XCJdKSxcbiAgICBcInRleHQtbGV0dGVyLXNwYWNpbmdcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1sZXR0ZXItc3BhY2luZ1wiXSksXG4gICAgXCJ0ZXh0LWp1c3RpZnlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1qdXN0aWZ5XCJdKSxcbiAgICBcInRleHQtcmFkaWFsLW9mZnNldFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIl0pLFxuICAgIFwidGV4dC12YXJpYWJsZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LXZhcmlhYmxlLWFuY2hvclwiXSksXG4gICAgXCJ0ZXh0LWFuY2hvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWFuY2hvclwiXSksXG4gICAgXCJ0ZXh0LW1heC1hbmdsZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtbWF4LWFuZ2xlXCJdKSxcbiAgICBcInRleHQtd3JpdGluZy1tb2RlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC13cml0aW5nLW1vZGVcIl0pLFxuICAgIFwidGV4dC1yb3RhdGVcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1yb3RhdGVcIl0pLFxuICAgIFwidGV4dC1wYWRkaW5nXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1wYWRkaW5nXCJdKSxcbiAgICBcInRleHQta2VlcC11cHJpZ2h0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1rZWVwLXVwcmlnaHRcIl0pLFxuICAgIFwidGV4dC10cmFuc2Zvcm1cIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC10cmFuc2Zvcm1cIl0pLFxuICAgIFwidGV4dC1vZmZzZXRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1vZmZzZXRcIl0pLFxuICAgIFwidGV4dC1hbGxvdy1vdmVybGFwXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1hbGxvdy1vdmVybGFwXCJdKSxcbiAgICBcInRleHQtaWdub3JlLXBsYWNlbWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtaWdub3JlLXBsYWNlbWVudFwiXSksXG4gICAgXCJ0ZXh0LW9wdGlvbmFsXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1vcHRpb25hbFwiXSksXG59KTtcblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJpY29uLW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJpY29uLWhhbG8tY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImljb24taGFsby13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImljb24taGFsby1ibHVyXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaWNvbi10cmFuc2xhdGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJ0ZXh0LW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJ0ZXh0LWhhbG8tY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcInRleHQtaGFsby13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtaGFsby1ibHVyXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC10cmFuc2xhdGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJpY29uLW9wYWNpdHlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLW9wYWNpdHlcIl0pLFxuICAgIFwiaWNvbi1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24tY29sb3JcIl0pLFxuICAgIFwiaWNvbi1oYWxvLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1wiaWNvbi1oYWxvLWNvbG9yXCJdKSxcbiAgICBcImljb24taGFsby13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24taGFsby13aWR0aFwiXSksXG4gICAgXCJpY29uLWhhbG8tYmx1clwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24taGFsby1ibHVyXCJdKSxcbiAgICBcImljb24tdHJhbnNsYXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24tdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgXCJ0ZXh0LW9wYWNpdHlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LW9wYWNpdHlcIl0pLFxuICAgIFwidGV4dC1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtY29sb3JcIl0sIHsgcnVudGltZVR5cGU6IENvbG9yVHlwZSwgZ2V0T3ZlcnJpZGU6IChvKSA9PiBvLnRleHRDb2xvciwgaGFzT3ZlcnJpZGU6IChvKSA9PiAhIW8udGV4dENvbG9yIH0pLFxuICAgIFwidGV4dC1oYWxvLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1widGV4dC1oYWxvLWNvbG9yXCJdKSxcbiAgICBcInRleHQtaGFsby13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtaGFsby13aWR0aFwiXSksXG4gICAgXCJ0ZXh0LWhhbG8tYmx1clwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtaGFsby1ibHVyXCJdKSxcbiAgICBcInRleHQtdHJhbnNsYXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LXRyYW5zbGF0ZVwiXSksXG4gICAgXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCwgbGF5b3V0IH06ICRFeGFjdDx7XG4gIHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+LCBsYXlvdXQ6IFByb3BlcnRpZXM8TGF5b3V0UHJvcHM+XG59Pik7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtab29tQ29uc3RhbnRFeHByZXNzaW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IHtOdWxsVHlwZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzLmpzJztcbmltcG9ydCB7UG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSBmcm9tICcuL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcblxuLy8gVGhpcyBpcyBhbiBpbnRlcm5hbCBleHByZXNzaW9uIGNsYXNzLiBJdCBpcyBvbmx5IHVzZWQgaW4gR0wgSlMgYW5kXG4vLyBoYXMgR0wgSlMgZGVwZW5kZW5jaWVzIHdoaWNoIGNhbiBicmVhayB0aGUgc3RhbmRhbG9uZSBzdHlsZS1zcGVjIG1vZHVsZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybWF0U2VjdGlvbk92ZXJyaWRlPFQ+IGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBkZWZhdWx0VmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPjtcblxuICAgIGNvbnN0cnVjdG9yKGRlZmF1bHRWYWx1ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+KSB7XG4gICAgICAgIGFzc2VydChkZWZhdWx0VmFsdWUucHJvcGVydHkub3ZlcnJpZGVzICE9PSB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLnR5cGUgPSBkZWZhdWx0VmFsdWUucHJvcGVydHkub3ZlcnJpZGVzID8gZGVmYXVsdFZhbHVlLnByb3BlcnR5Lm92ZXJyaWRlcy5ydW50aW1lVHlwZSA6IE51bGxUeXBlO1xuICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KSB7XG4gICAgICAgIGlmIChjdHguZm9ybWF0dGVkU2VjdGlvbikge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGVzID0gdGhpcy5kZWZhdWx0VmFsdWUucHJvcGVydHkub3ZlcnJpZGVzO1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlcyAmJiBvdmVycmlkZXMuaGFzT3ZlcnJpZGUoY3R4LmZvcm1hdHRlZFNlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlcy5nZXRPdmVycmlkZShjdHguZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3R4LmZlYXR1cmUgJiYgY3R4LmZlYXR1cmVTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlLmV2YWx1YXRlKGN0eC5mZWF0dXJlLCBjdHguZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLmRlZmF1bHQ7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdFZhbHVlLmlzQ29uc3RhbnQoKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwcjogWm9vbUNvbnN0YW50RXhwcmVzc2lvbjwnc291cmNlJz4gPSAoKHRoaXMuZGVmYXVsdFZhbHVlLnZhbHVlKTogYW55KTtcbiAgICAgICAgICAgIGZuKGV4cHIuX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbm5vdCBiZSBzdGF0aWNhbGx5IGV2YWx1YXRlZCwgYXMgdGhlIG91dHB1dCBkZXBlbmRzIG9uIHRoZSBldmFsdWF0aW9uIGNvbnRleHQuXG4gICAgb3V0cHV0RGVmaW5lZCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5yZWdpc3RlcignRm9ybWF0U2VjdGlvbk92ZXJyaWRlJywgRm9ybWF0U2VjdGlvbk92ZXJyaWRlLCB7b21pdDogWydkZWZhdWx0VmFsdWUnXX0pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXIuanMnO1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgU3ltYm9sQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMnO1xuaW1wb3J0IHJlc29sdmVUb2tlbnMgZnJvbSAnLi4vLi4vdXRpbC9yZXNvbHZlX3Rva2Vucy5qcyc7XG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL3N5bWJvbF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHtcbiAgICBUcmFuc2l0aW9uYWJsZSxcbiAgICBUcmFuc2l0aW9uaW5nLFxuICAgIExheW91dCxcbiAgICBQb3NzaWJseUV2YWx1YXRlZCxcbiAgICBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUsXG4gICAgUHJvcGVydHlWYWx1ZVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHtcbiAgICBpc0V4cHJlc3Npb24sXG4gICAgU3R5bGVFeHByZXNzaW9uLFxuICAgIFpvb21Db25zdGFudEV4cHJlc3Npb24sXG4gICAgWm9vbURlcGVuZGVudEV4cHJlc3Npb25cbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcblxuaW1wb3J0IHR5cGUge0J1Y2tldFBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIHtMYXlvdXRQcm9wcywgUGFpbnRQcm9wc30gZnJvbSAnLi9zeW1ib2xfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZSwgU291cmNlRXhwcmVzc2lvbiwgQ29tcG9zaXRlRXhwcmVzc2lvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQge0Zvcm1hdHRlZFR5cGV9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy5qcyc7XG5pbXBvcnQge3R5cGVPZn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuaW1wb3J0IEZvcm1hdFNlY3Rpb25PdmVycmlkZSBmcm9tICcuLi9mb3JtYXRfc2VjdGlvbl9vdmVycmlkZS5qcyc7XG5pbXBvcnQgRm9ybWF0RXhwcmVzc2lvbiBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvZm9ybWF0LmpzJztcbmltcG9ydCBMaXRlcmFsIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9saXRlcmFsLmpzJztcbmltcG9ydCBQcm9ncmFtQ29uZmlndXJhdGlvbiBmcm9tICcuLi8uLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5cbmNsYXNzIFN5bWJvbFN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdW5ldmFsdWF0ZWRMYXlvdXQ6IExheW91dDxMYXlvdXRQcm9wcz47XG4gICAgbGF5b3V0OiBQb3NzaWJseUV2YWx1YXRlZDxMYXlvdXRQcm9wcz47XG5cbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZShwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHN1cGVyLnJlY2FsY3VsYXRlKHBhcmFtZXRlcnMsIGF2YWlsYWJsZUltYWdlcyk7XG5cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgnaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddID0gJ21hcCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ2ljb24tcm90YXRpb24tYWxpZ25tZW50J10gPSAndmlld3BvcnQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID0gJ21hcCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ3RleHQtcm90YXRpb24tYWxpZ25tZW50J10gPSAndmlld3BvcnQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdW5zcGVjaWZpZWQsIGAqLXBpdGNoLWFsaWdubWVudGAgaW5oZXJpdHMgYCotcm90YXRpb24tYWxpZ25tZW50YFxuICAgICAgICBpZiAodGhpcy5sYXlvdXQuZ2V0KCd0ZXh0LXBpdGNoLWFsaWdubWVudCcpID09PSAnYXV0bycpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ3RleHQtcGl0Y2gtYWxpZ25tZW50J10gPSB0aGlzLmxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgnaWNvbi1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWydpY29uLXBpdGNoLWFsaWdubWVudCddID0gdGhpcy5sYXlvdXQuZ2V0KCdpY29uLXJvdGF0aW9uLWFsaWdubWVudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd3JpdGluZ01vZGVzID0gdGhpcy5sYXlvdXQuZ2V0KCd0ZXh0LXdyaXRpbmctbW9kZScpO1xuICAgICAgICBpZiAod3JpdGluZ01vZGVzKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgZHVwbGljYXRlcywgcHJlc2VydmluZyBvcmRlclxuICAgICAgICAgICAgY29uc3QgZGVkdXBlZCA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBtIG9mIHdyaXRpbmdNb2Rlcykge1xuICAgICAgICAgICAgICAgIGlmIChkZWR1cGVkLmluZGV4T2YobSkgPCAwKSBkZWR1cGVkLnB1c2gobSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWyd0ZXh0LXdyaXRpbmctbW9kZSddID0gZGVkdXBlZDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSA9PT0gJ3BvaW50Jykge1xuICAgICAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZSBmb3IgJ3BvaW50JyBwbGFjZW1lbnQgc3ltYm9sc1xuICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1sndGV4dC13cml0aW5nLW1vZGUnXSA9IFsnaG9yaXpvbnRhbCddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGVmYXVsdCB2YWx1ZSBmb3IgJ2xpbmUnIHBsYWNlbWVudCBzeW1ib2xzXG4gICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWyd0ZXh0LXdyaXRpbmctbW9kZSddID0gWydob3Jpem9udGFsJywgJ3ZlcnRpY2FsJ107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZXRQYWludE92ZXJyaWRlcygpO1xuICAgIH1cblxuICAgIGdldFZhbHVlQW5kUmVzb2x2ZVRva2VucyhuYW1lOiAqLCBmZWF0dXJlOiBGZWF0dXJlLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5sYXlvdXQuZ2V0KG5hbWUpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIGNvbnN0IHVuZXZhbHVhdGVkID0gdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuX3ZhbHVlc1tuYW1lXTtcbiAgICAgICAgaWYgKCF1bmV2YWx1YXRlZC5pc0RhdGFEcml2ZW4oKSAmJiAhaXNFeHByZXNzaW9uKHVuZXZhbHVhdGVkLnZhbHVlKSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVUb2tlbnMoZmVhdHVyZS5wcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8Kj4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTeW1ib2xCdWNrZXQocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcXVlcnlJbnRlcnNlY3RzRmVhdHVyZSgpOiBib29sZWFuIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlKTsgLy8gU2hvdWxkIHRha2UgYSBkaWZmZXJlbnQgcGF0aCBpbiBGZWF0dXJlSW5kZXhcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF9zZXRQYWludE92ZXJyaWRlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBvdmVycmlkYWJsZSBvZiBwcm9wZXJ0aWVzLnBhaW50Lm92ZXJyaWRhYmxlUHJvcGVydGllcykge1xuICAgICAgICAgICAgaWYgKCFTeW1ib2xTdHlsZUxheWVyLmhhc1BhaW50T3ZlcnJpZGUodGhpcy5sYXlvdXQsIG92ZXJyaWRhYmxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGVuID0gdGhpcy5wYWludC5nZXQob3ZlcnJpZGFibGUpO1xuICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBuZXcgRm9ybWF0U2VjdGlvbk92ZXJyaWRlKG92ZXJyaWRlbik7XG4gICAgICAgICAgICBjb25zdCBzdHlsZUV4cHJlc3Npb24gPSBuZXcgU3R5bGVFeHByZXNzaW9uKG92ZXJyaWRlLCBvdmVycmlkZW4ucHJvcGVydHkuc3BlY2lmaWNhdGlvbik7XG4gICAgICAgICAgICBsZXQgZXhwcmVzc2lvbiA9IG51bGw7XG4gICAgICAgICAgICBpZiAob3ZlcnJpZGVuLnZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcgfHwgb3ZlcnJpZGVuLnZhbHVlLmtpbmQgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IChuZXcgWm9vbUNvbnN0YW50RXhwcmVzc2lvbignc291cmNlJywgc3R5bGVFeHByZXNzaW9uKTogU291cmNlRXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gPSAobmV3IFpvb21EZXBlbmRlbnRFeHByZXNzaW9uKCdjb21wb3NpdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZW4udmFsdWUuem9vbVN0b3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlbi52YWx1ZS5faW50ZXJwb2xhdGlvblR5cGUpOiBDb21wb3NpdGVFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGFpbnQuX3ZhbHVlc1tvdmVycmlkYWJsZV0gPSBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKG92ZXJyaWRlbi5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZW4ucGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfaGFuZGxlT3ZlcnJpZGFibGVQYWludFByb3BlcnR5VXBkYXRlPFQsIFI+KG5hbWU6IHN0cmluZywgb2xkVmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj4sIG5ld1ZhbHVlOiBQcm9wZXJ0eVZhbHVlPFQsIFI+KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXQgfHwgb2xkVmFsdWUuaXNEYXRhRHJpdmVuKCkgfHwgbmV3VmFsdWUuaXNEYXRhRHJpdmVuKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3ltYm9sU3R5bGVMYXllci5oYXNQYWludE92ZXJyaWRlKHRoaXMubGF5b3V0LCBuYW1lKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaGFzUGFpbnRPdmVycmlkZShsYXlvdXQ6IFBvc3NpYmx5RXZhbHVhdGVkPExheW91dFByb3BzPiwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgdGV4dEZpZWxkID0gbGF5b3V0LmdldCgndGV4dC1maWVsZCcpO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHByb3BlcnRpZXMucGFpbnQucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICBsZXQgaGFzT3ZlcnJpZGVzID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY2hlY2tTZWN0aW9ucyA9IChzZWN0aW9ucykgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm92ZXJyaWRlcyAmJiBwcm9wZXJ0eS5vdmVycmlkZXMuaGFzT3ZlcnJpZGUoc2VjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzT3ZlcnJpZGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGV4dEZpZWxkLnZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcgJiYgdGV4dEZpZWxkLnZhbHVlLnZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgICAgICBjaGVja1NlY3Rpb25zKHRleHRGaWVsZC52YWx1ZS52YWx1ZS5zZWN0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGV4dEZpZWxkLnZhbHVlLmtpbmQgPT09ICdzb3VyY2UnKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNoZWNrRXhwcmVzc2lvbiA9IChleHByZXNzaW9uOiBFeHByZXNzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc092ZXJyaWRlcykgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBMaXRlcmFsICYmIHR5cGVPZihleHByZXNzaW9uLnZhbHVlKSA9PT0gRm9ybWF0dGVkVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWQ6IEZvcm1hdHRlZCA9ICgoZXhwcmVzc2lvbi52YWx1ZSk6IGFueSk7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrU2VjdGlvbnMoZm9ybWF0dGVkLnNlY3Rpb25zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBGb3JtYXRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrU2VjdGlvbnMoZXhwcmVzc2lvbi5zZWN0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5lYWNoQ2hpbGQoY2hlY2tFeHByZXNzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBleHByOiBab29tQ29uc3RhbnRFeHByZXNzaW9uPCdzb3VyY2UnPiA9ICgodGV4dEZpZWxkLnZhbHVlKTogYW55KTtcbiAgICAgICAgICAgIGlmIChleHByLl9zdHlsZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBjaGVja0V4cHJlc3Npb24oZXhwci5fc3R5bGVFeHByZXNzaW9uLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc092ZXJyaWRlcztcbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtQ29uZmlndXJhdGlvbih6b29tOiBudW1iZXIpOiBQcm9ncmFtQ29uZmlndXJhdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb24odGhpcywgem9vbSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTeW1ib2xTdHlsZUxheWVyO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcImJhY2tncm91bmQtY29sb3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Q29sb3I+LFxuICAgIFwiYmFja2dyb3VuZC1wYXR0ZXJuXCI6IENyb3NzRmFkZWRQcm9wZXJ0eTxSZXNvbHZlZEltYWdlPixcbiAgICBcImJhY2tncm91bmQtb3BhY2l0eVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfYmFja2dyb3VuZFwiXVtcImJhY2tncm91bmQtY29sb3JcIl0pLFxuICAgIFwiYmFja2dyb3VuZC1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfYmFja2dyb3VuZFwiXVtcImJhY2tncm91bmQtcGF0dGVyblwiXSksXG4gICAgXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2JhY2tncm91bmRcIl1bXCJiYWNrZ3JvdW5kLW9wYWNpdHlcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQgfTogJEV4YWN0PHtcbiAgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz5cbn0+KTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyLmpzJztcblxuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9iYWNrZ3JvdW5kX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHtUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWR9IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7UGFpbnRQcm9wc30gZnJvbSAnLi9iYWNrZ3JvdW5kX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5cbmNsYXNzIEJhY2tncm91bmRTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgZ2V0UHJvZ3JhbUlkcygpIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLnBhaW50LmdldCgnYmFja2dyb3VuZC1wYXR0ZXJuJyk7XG4gICAgICAgIHJldHVybiBbaW1hZ2UgPyAnYmFja2dyb3VuZFBhdHRlcm4nIDogJ2JhY2tncm91bmQnXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhY2tncm91bmRTdHlsZUxheWVyO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcInJhc3Rlci1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItaHVlLXJvdGF0ZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwicmFzdGVyLWJyaWdodG5lc3MtbWluXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInJhc3Rlci1zYXR1cmF0aW9uXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItY29udHJhc3RcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInJhc3Rlci1yZXNhbXBsaW5nXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibGluZWFyXCIgfCBcIm5lYXJlc3RcIj4sXG4gICAgXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwicmFzdGVyLW9wYWNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1vcGFjaXR5XCJdKSxcbiAgICBcInJhc3Rlci1odWUtcm90YXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItaHVlLXJvdGF0ZVwiXSksXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiXSksXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1tYXhcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiXSksXG4gICAgXCJyYXN0ZXItc2F0dXJhdGlvblwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfcmFzdGVyXCJdW1wicmFzdGVyLXNhdHVyYXRpb25cIl0pLFxuICAgIFwicmFzdGVyLWNvbnRyYXN0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItY29udHJhc3RcIl0pLFxuICAgIFwicmFzdGVyLXJlc2FtcGxpbmdcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1yZXNhbXBsaW5nXCJdKSxcbiAgICBcInJhc3Rlci1mYWRlLWR1cmF0aW9uXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXIuanMnO1xuXG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL3Jhc3Rlcl9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7VHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIFBvc3NpYmx5RXZhbHVhdGVkfSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUge1BhaW50UHJvcHN9IGZyb20gJy4vcmFzdGVyX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5cbmNsYXNzIFJhc3RlclN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtSWRzKCkge1xuICAgICAgICByZXR1cm4gWydyYXN0ZXInXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3RlclN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vLi4vdWkvbWFwLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxudHlwZSBDdXN0b21SZW5kZXJNZXRob2QgPSAoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgbWF0cml4OiBBcnJheTxudW1iZXI+KSA9PiB2b2lkO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY3VzdG9tIHN0eWxlIGxheWVycy4gVGhpcyBpcyBhIHNwZWNpZmljYXRpb24gZm9yXG4gKiBpbXBsZW1lbnRlcnMgdG8gbW9kZWw6IGl0IGlzIG5vdCBhbiBleHBvcnRlZCBtZXRob2Qgb3IgY2xhc3MuXG4gKlxuICogQ3VzdG9tIGxheWVycyBhbGxvdyBhIHVzZXIgdG8gcmVuZGVyIGRpcmVjdGx5IGludG8gdGhlIG1hcCdzIEdMIGNvbnRleHQgdXNpbmcgdGhlIG1hcCdzIGNhbWVyYS5cbiAqIFRoZXNlIGxheWVycyBjYW4gYmUgYWRkZWQgYmV0d2VlbiBhbnkgcmVndWxhciBsYXllcnMgdXNpbmcge0BsaW5rIE1hcCNhZGRMYXllcn0uXG4gKlxuICogQ3VzdG9tIGxheWVycyBtdXN0IGhhdmUgYSB1bmlxdWUgYGlkYCBhbmQgbXVzdCBoYXZlIHRoZSBgdHlwZWAgb2YgYFwiY3VzdG9tXCJgLlxuICogVGhleSBtdXN0IGltcGxlbWVudCBgcmVuZGVyYCBhbmQgbWF5IGltcGxlbWVudCBgcHJlcmVuZGVyYCwgYG9uQWRkYCBhbmQgYG9uUmVtb3ZlYC5cbiAqIFRoZXkgY2FuIHRyaWdnZXIgcmVuZGVyaW5nIHVzaW5nIHtAbGluayBNYXAjdHJpZ2dlclJlcGFpbnR9XG4gKiBhbmQgdGhleSBzaG91bGQgYXBwcm9wcmlhdGVseSBoYW5kbGUge0BsaW5rIE1hcC5ldmVudDp3ZWJnbGNvbnRleHRsb3N0fSBhbmRcbiAqIHtAbGluayBNYXAuZXZlbnQ6d2ViZ2xjb250ZXh0cmVzdG9yZWR9LlxuICpcbiAqIFRoZSBgcmVuZGVyaW5nTW9kZWAgcHJvcGVydHkgY29udHJvbHMgd2hldGhlciB0aGUgbGF5ZXIgaXMgdHJlYXRlZCBhcyBhIGBcIjJkXCJgIG9yIGBcIjNkXCJgIG1hcCBsYXllci4gVXNlOlxuICogLSBgXCJyZW5kZXJpbmdNb2RlXCI6IFwiM2RcImAgdG8gdXNlIHRoZSBkZXB0aCBidWZmZXIgYW5kIHNoYXJlIGl0IHdpdGggb3RoZXIgbGF5ZXJzXG4gKiAtIGBcInJlbmRlcmluZ01vZGVcIjogXCIyZFwiYCB0byBhZGQgYSBsYXllciB3aXRoIG5vIGRlcHRoLiBJZiB5b3UgbmVlZCB0byB1c2UgdGhlIGRlcHRoIGJ1ZmZlciBmb3IgYSBgXCIyZFwiYCBsYXllciB5b3UgbXVzdCB1c2UgYW4gb2Zmc2NyZWVuXG4gKiAgIGZyYW1lYnVmZmVyIGFuZCB7QGxpbmsgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UjcHJlcmVuZGVyfS5cbiAqXG4gKiBAaW50ZXJmYWNlIEN1c3RvbUxheWVySW50ZXJmYWNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgQSB1bmlxdWUgbGF5ZXIgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBUaGUgbGF5ZXIncyB0eXBlLiBNdXN0IGJlIGBcImN1c3RvbVwiYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZW5kZXJpbmdNb2RlIEVpdGhlciBgXCIyZFwiYCBvciBgXCIzZFwiYC4gRGVmYXVsdHMgdG8gYFwiMmRcImAuXG4gKiBAZXhhbXBsZVxuICogLy8gQ3VzdG9tIGxheWVyIGltcGxlbWVudGVkIGFzIEVTNiBjbGFzc1xuICogY2xhc3MgTnVsbElzbGFuZExheWVyIHtcbiAqICAgICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICAgICAgdGhpcy5pZCA9ICdudWxsLWlzbGFuZCc7XG4gKiAgICAgICAgIHRoaXMudHlwZSA9ICdjdXN0b20nO1xuICogICAgICAgICB0aGlzLnJlbmRlcmluZ01vZGUgPSAnMmQnO1xuICogICAgIH1cbiAqXG4gKiAgICAgb25BZGQobWFwLCBnbCkge1xuICogICAgICAgICBjb25zdCB2ZXJ0ZXhTb3VyY2UgPSBgXG4gKiAgICAgICAgIHVuaWZvcm0gbWF0NCB1X21hdHJpeDtcbiAqICAgICAgICAgdm9pZCBtYWluKCkge1xuICogICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoMC41LCAwLjUsIDAuMCwgMS4wKTtcbiAqICAgICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IDIwLjA7XG4gKiAgICAgICAgIH1gO1xuICpcbiAqICAgICAgICAgY29uc3QgZnJhZ21lbnRTb3VyY2UgPSBgXG4gKiAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAqICAgICAgICAgICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wLCAwLjAsIDAuMCwgMS4wKTtcbiAqICAgICAgICAgfWA7XG4gKlxuICogICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG4gKiAgICAgICAgIGdsLnNoYWRlclNvdXJjZSh2ZXJ0ZXhTaGFkZXIsIHZlcnRleFNvdXJjZSk7XG4gKiAgICAgICAgIGdsLmNvbXBpbGVTaGFkZXIodmVydGV4U2hhZGVyKTtcbiAqICAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSKTtcbiAqICAgICAgICAgZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNvdXJjZSk7XG4gKiAgICAgICAgIGdsLmNvbXBpbGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpO1xuICpcbiAqICAgICAgICAgdGhpcy5wcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICogICAgICAgICBnbC5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpO1xuICogICAgICAgICBnbC5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7XG4gKiAgICAgICAgIGdsLmxpbmtQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gKiAgICAgfVxuICpcbiAqICAgICByZW5kZXIoZ2wsIG1hdHJpeCkge1xuICogICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gKiAgICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgXCJ1X21hdHJpeFwiKSwgZmFsc2UsIG1hdHJpeCk7XG4gKiAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCAxKTtcbiAqICAgICB9XG4gKiB9XG4gKlxuICogbWFwLm9uKCdsb2FkJywgKCkgPT4ge1xuICogICAgIG1hcC5hZGRMYXllcihuZXcgTnVsbElzbGFuZExheWVyKCkpO1xuICogfSk7XG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSBjdXN0b20gc3R5bGUgbGF5ZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2N1c3RvbS1zdHlsZS1sYXllci8pXG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSAzRCBtb2RlbF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLTNkLW1vZGVsLylcbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgbGF5ZXIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIE1hcCB3aXRoIHtAbGluayBNYXAjYWRkTGF5ZXJ9LiBUaGlzXG4gKiBnaXZlcyB0aGUgbGF5ZXIgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBnbCByZXNvdXJjZXMgYW5kIHJlZ2lzdGVyIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBDdXN0b21MYXllckludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvbkFkZFxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY3VzdG9tIGxheWVyIHdhcyBqdXN0IGFkZGVkIHRvLlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBnbCBjb250ZXh0IGZvciB0aGUgbWFwLlxuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBsYXllciBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIE1hcCB3aXRoIHtAbGluayBNYXAjcmVtb3ZlTGF5ZXJ9LiBUaGlzXG4gKiBnaXZlcyB0aGUgbGF5ZXIgYSBjaGFuY2UgdG8gY2xlYW4gdXAgZ2wgcmVzb3VyY2VzIGFuZCBldmVudCBsaXN0ZW5lcnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgQ3VzdG9tTGF5ZXJJbnRlcmZhY2VcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgb25SZW1vdmVcbiAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcCB0aGlzIGN1c3RvbSBsYXllciB3YXMganVzdCBhZGRlZCB0by5cbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgZ2wgY29udGV4dCBmb3IgdGhlIG1hcC5cbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgZHVyaW5nIGEgcmVuZGVyIGZyYW1lIHRvIGFsbG93IGEgbGF5ZXIgdG8gcHJlcGFyZSByZXNvdXJjZXMgb3IgcmVuZGVyIGludG8gYSB0ZXh0dXJlLlxuICpcbiAqIFRoZSBsYXllciBjYW5ub3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGN1cnJlbnQgR0wgc3RhdGUgYW5kIG11c3QgYmluZCBhIGZyYW1lYnVmZmVyIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgQ3VzdG9tTGF5ZXJJbnRlcmZhY2VcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgcHJlcmVuZGVyXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIG1hcCdzIGdsIGNvbnRleHQuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IG1hdHJpeCBUaGUgbWFwJ3MgY2FtZXJhIG1hdHJpeC4gSXQgcHJvamVjdHMgc3BoZXJpY2FsIG1lcmNhdG9yXG4gKiBjb29yZGluYXRlcyB0byBnbCBjb29yZGluYXRlcy4gVGhlIG1lcmNhdG9yIGNvb3JkaW5hdGUgYFswLCAwXWAgcmVwcmVzZW50cyB0aGVcbiAqIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgbWVyY2F0b3Igd29ybGQgYW5kIGBbMSwgMV1gIHJlcHJlc2VudHMgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuIFdoZW5cbiAqIHRoZSBgcmVuZGVyaW5nTW9kZWAgaXMgYFwiM2RcImAsIHRoZSB6IGNvb3JkaW5hdGUgaXMgY29uZm9ybWFsLiBBIGJveCB3aXRoIGlkZW50aWNhbCB4LCB5LCBhbmQgelxuICogbGVuZ3RocyBpbiBtZXJjYXRvciB1bml0cyB3b3VsZCBiZSByZW5kZXJlZCBhcyBhIGN1YmUuIHtAbGluayBNZXJjYXRvckNvb3JkaW5hdGV9LmZyb21MbmdMYXRcbiAqIGNhbiBiZSB1c2VkIHRvIHByb2plY3QgYSBgTG5nTGF0YCB0byBhIG1lcmNhdG9yIGNvb3JkaW5hdGUuXG4gKi9cblxuLyoqXG4gKiBDYWxsZWQgZHVyaW5nIGEgcmVuZGVyIGZyYW1lIGFsbG93aW5nIHRoZSBsYXllciB0byBkcmF3IGludG8gdGhlIEdMIGNvbnRleHQuXG4gKlxuICogVGhlIGxheWVyIGNhbiBhc3N1bWUgYmxlbmRpbmcgYW5kIGRlcHRoIHN0YXRlIGlzIHNldCB0byBhbGxvdyB0aGUgbGF5ZXIgdG8gcHJvcGVybHlcbiAqIGJsZW5kIGFuZCBjbGlwIG90aGVyIGxheWVycy4gVGhlIGxheWVyIGNhbm5vdCBtYWtlIGFueSBvdGhlciBhc3N1bXB0aW9ucyBhYm91dCB0aGVcbiAqIGN1cnJlbnQgR0wgc3RhdGUuXG4gKlxuICogSWYgdGhlIGxheWVyIG5lZWRzIHRvIHJlbmRlciB0byBhIHRleHR1cmUsIGl0IHNob3VsZCBpbXBsZW1lbnQgdGhlIGBwcmVyZW5kZXJgIG1ldGhvZFxuICogdG8gZG8gdGhpcyBhbmQgb25seSB1c2UgdGhlIGByZW5kZXJgIG1ldGhvZCBmb3IgZHJhd2luZyBkaXJlY3RseSBpbnRvIHRoZSBtYWluIGZyYW1lYnVmZmVyLlxuICpcbiAqIFRoZSBibGVuZCBmdW5jdGlvbiBpcyBzZXQgdG8gYGdsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpYC4gVGhpcyBleHBlY3RzXG4gKiBjb2xvcnMgdG8gYmUgcHJvdmlkZWQgaW4gcHJlbXVsdGlwbGllZCBhbHBoYSBmb3JtIHdoZXJlIHRoZSBgcmAsIGBnYCBhbmQgYGJgIHZhbHVlcyBhcmUgYWxyZWFkeVxuICogbXVsdGlwbGllZCBieSB0aGUgYGFgIHZhbHVlLiBJZiB5b3UgYXJlIHVuYWJsZSB0byBwcm92aWRlIGNvbG9ycyBpbiBwcmVtdWx0aXBsaWVkIGZvcm0geW91XG4gKiBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIGJsZW5kIGZ1bmN0aW9uIHRvXG4gKiBgZ2wuYmxlbmRGdW5jU2VwYXJhdGUoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpYC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBDdXN0b21MYXllckludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSByZW5kZXJcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgbWFwJ3MgZ2wgY29udGV4dC5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gbWF0cml4IFRoZSBtYXAncyBjYW1lcmEgbWF0cml4LiBJdCBwcm9qZWN0cyBzcGhlcmljYWwgbWVyY2F0b3JcbiAqIGNvb3JkaW5hdGVzIHRvIGdsIGNvb3JkaW5hdGVzLiBUaGUgc3BoZXJpY2FsIG1lcmNhdG9yIGNvb3JkaW5hdGUgYFswLCAwXWAgcmVwcmVzZW50cyB0aGVcbiAqIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgbWVyY2F0b3Igd29ybGQgYW5kIGBbMSwgMV1gIHJlcHJlc2VudHMgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuIFdoZW5cbiAqIHRoZSBgcmVuZGVyaW5nTW9kZWAgaXMgYFwiM2RcImAsIHRoZSB6IGNvb3JkaW5hdGUgaXMgY29uZm9ybWFsLiBBIGJveCB3aXRoIGlkZW50aWNhbCB4LCB5LCBhbmQgelxuICogbGVuZ3RocyBpbiBtZXJjYXRvciB1bml0cyB3b3VsZCBiZSByZW5kZXJlZCBhcyBhIGN1YmUuIHtAbGluayBNZXJjYXRvckNvb3JkaW5hdGV9LmZyb21MbmdMYXRcbiAqIGNhbiBiZSB1c2VkIHRvIHByb2plY3QgYSBgTG5nTGF0YCB0byBhIG1lcmNhdG9yIGNvb3JkaW5hdGUuXG4gKi9cbmV4cG9ydCB0eXBlIEN1c3RvbUxheWVySW50ZXJmYWNlID0ge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgdHlwZTogXCJjdXN0b21cIixcbiAgICByZW5kZXJpbmdNb2RlOiBcIjJkXCIgfCBcIjNkXCIsXG4gICAgcmVuZGVyOiBDdXN0b21SZW5kZXJNZXRob2QsXG4gICAgcHJlcmVuZGVyOiA/Q3VzdG9tUmVuZGVyTWV0aG9kLFxuICAgIG9uQWRkOiA/KG1hcDogTWFwLCBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSA9PiB2b2lkLFxuICAgIG9uUmVtb3ZlOiA/KG1hcDogTWFwLCBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUN1c3RvbVN0eWxlTGF5ZXIobGF5ZXJPYmplY3Q6IEN1c3RvbUxheWVySW50ZXJmYWNlKSB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgY29uc3QgaWQgPSBsYXllck9iamVjdC5pZDtcblxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBsYXllcnMuJHtpZH06IG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJpZFwiYFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXJPYmplY3QucmVuZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgbWVzc2FnZTogYGxheWVycy4ke2lkfTogbWlzc2luZyByZXF1aXJlZCBtZXRob2QgXCJyZW5kZXJcImBcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGxheWVyT2JqZWN0LnJlbmRlcmluZ01vZGUgJiZcbiAgICAgICAgbGF5ZXJPYmplY3QucmVuZGVyaW5nTW9kZSAhPT0gJzJkJyAmJlxuICAgICAgICBsYXllck9iamVjdC5yZW5kZXJpbmdNb2RlICE9PSAnM2QnKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBsYXllcnMuJHtpZH06IHByb3BlcnR5IFwicmVuZGVyaW5nTW9kZVwiIG11c3QgYmUgZWl0aGVyIFwiMmRcIiBvciBcIjNkXCJgXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG5cbmNsYXNzIEN1c3RvbVN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcblxuICAgIGltcGxlbWVudGF0aW9uOiBDdXN0b21MYXllckludGVyZmFjZTtcblxuICAgIGNvbnN0cnVjdG9yKGltcGxlbWVudGF0aW9uOiBDdXN0b21MYXllckludGVyZmFjZSkge1xuICAgICAgICBzdXBlcihpbXBsZW1lbnRhdGlvbiwge30pO1xuICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uID0gaW1wbGVtZW50YXRpb247XG4gICAgfVxuXG4gICAgaXMzRCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1wbGVtZW50YXRpb24ucmVuZGVyaW5nTW9kZSA9PT0gJzNkJztcbiAgICB9XG5cbiAgICBoYXNPZmZzY3JlZW5QYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbXBsZW1lbnRhdGlvbi5wcmVyZW5kZXIgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZSgpIHt9XG4gICAgdXBkYXRlVHJhbnNpdGlvbnMoKSB7fVxuICAgIGhhc1RyYW5zaXRpb24oKSB7fVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBhc3NlcnQoZmFsc2UsIFwiQ3VzdG9tIGxheWVycyBjYW5ub3QgYmUgc2VyaWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICBpZiAodGhpcy5pbXBsZW1lbnRhdGlvbi5vbkFkZCkge1xuICAgICAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvbi5vbkFkZChtYXAsIG1hcC5wYWludGVyLmNvbnRleHQuZ2wpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25SZW1vdmUobWFwOiBNYXApIHtcbiAgICAgICAgaWYgKHRoaXMuaW1wbGVtZW50YXRpb24ub25SZW1vdmUpIHtcbiAgICAgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb24ub25SZW1vdmUobWFwLCBtYXAucGFpbnRlci5jb250ZXh0LmdsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ3VzdG9tU3R5bGVMYXllcjtcbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gQGZsb3dcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcblxuaW1wb3J0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBDb2xvclJhbXBQcm9wZXJ0eVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcblxuaW1wb3J0IHR5cGUgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJza3ktdHlwZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcImdyYWRpZW50XCIgfCBcImF0bW9zcGhlcmVcIj4sXG4gICAgXCJza3ktYXRtb3NwaGVyZS1zdW5cIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJza3ktYXRtb3NwaGVyZS1zdW4taW50ZW5zaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJza3ktZ3JhZGllbnQtY2VudGVyXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwic2t5LWdyYWRpZW50LXJhZGl1c1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwic2t5LWdyYWRpZW50XCI6IENvbG9yUmFtcFByb3BlcnR5LFxuICAgIFwic2t5LWF0bW9zcGhlcmUtaGFsby1jb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJza3ktYXRtb3NwaGVyZS1jb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJza3ktb3BhY2l0eVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwic2t5LXR5cGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3NreVwiXVtcInNreS10eXBlXCJdKSxcbiAgICBcInNreS1hdG1vc3BoZXJlLXN1blwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc2t5XCJdW1wic2t5LWF0bW9zcGhlcmUtc3VuXCJdKSxcbiAgICBcInNreS1hdG1vc3BoZXJlLXN1bi1pbnRlbnNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3NreVwiXVtcInNreS1hdG1vc3BoZXJlLXN1bi1pbnRlbnNpdHlcIl0pLFxuICAgIFwic2t5LWdyYWRpZW50LWNlbnRlclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc2t5XCJdW1wic2t5LWdyYWRpZW50LWNlbnRlclwiXSksXG4gICAgXCJza3ktZ3JhZGllbnQtcmFkaXVzXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9za3lcIl1bXCJza3ktZ3JhZGllbnQtcmFkaXVzXCJdKSxcbiAgICBcInNreS1ncmFkaWVudFwiOiBuZXcgQ29sb3JSYW1wUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc2t5XCJdW1wic2t5LWdyYWRpZW50XCJdKSxcbiAgICBcInNreS1hdG1vc3BoZXJlLWhhbG8tY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3NreVwiXVtcInNreS1hdG1vc3BoZXJlLWhhbG8tY29sb3JcIl0pLFxuICAgIFwic2t5LWF0bW9zcGhlcmUtY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3NreVwiXVtcInNreS1hdG1vc3BoZXJlLWNvbG9yXCJdKSxcbiAgICBcInNreS1vcGFjaXR5XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9za3lcIl1bXCJza3ktb3BhY2l0eVwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9za3lfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge1RyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZH0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge3JlbmRlckNvbG9yUmFtcH0gZnJvbSAnLi4vLi4vdXRpbC9jb2xvcl9yYW1wLmpzJztcbmltcG9ydCB0eXBlIHtQYWludFByb3BzfSBmcm9tICcuL3NreV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIFRleHR1cmUgZnJvbSAnLi4vLi4vcmVuZGVyL3RleHR1cmUuanMnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi8uLi9yZW5kZXIvcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIEZyYW1lYnVmZmVyIGZyb20gJy4uLy4uL2dsL2ZyYW1lYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHtSR0JBSW1hZ2V9IGZyb20gJy4uLy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHR5cGUgU2t5Ym94R2VvbWV0cnkgZnJvbSAnLi4vLi4vcmVuZGVyL3NreWJveF9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgdHlwZSB7TGlnaHRQb3NpdGlvbn0gZnJvbSAnLi4vbGlnaHQuanMnO1xuaW1wb3J0IHt3YXJuT25jZSwgZGVnVG9SYWR9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge3ZlYzMsIHF1YXR9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbmZ1bmN0aW9uIGdldENlbGVzdGlhbERpcmVjdGlvbihhemltdXRoOiBudW1iZXIsIGFsdGl0dWRlOiBudW1iZXIsIGxlZnRIYW5kZWQ6IGJvb2xlYW4pOiB2ZWMzIHtcbiAgICBjb25zdCB1cCA9IHZlYzMuZnJvbVZhbHVlcygwLCAwLCAxKTtcbiAgICBjb25zdCByb3RhdGlvbiA9IHF1YXQuaWRlbnRpdHkocXVhdC5jcmVhdGUoKSk7XG5cbiAgICBxdWF0LnJvdGF0ZVkocm90YXRpb24sIHJvdGF0aW9uLCBsZWZ0SGFuZGVkID8gLWRlZ1RvUmFkKGF6aW11dGgpICsgTWF0aC5QSSA6IGRlZ1RvUmFkKGF6aW11dGgpKTtcbiAgICBxdWF0LnJvdGF0ZVgocm90YXRpb24sIHJvdGF0aW9uLCAtZGVnVG9SYWQoYWx0aXR1ZGUpKTtcbiAgICB2ZWMzLnRyYW5zZm9ybVF1YXQodXAsIHVwLCByb3RhdGlvbik7XG5cbiAgICByZXR1cm4gdmVjMy5ub3JtYWxpemUodXAsIHVwKTtcbn1cblxuY2xhc3MgU2t5TGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG4gICAgX2xpZ2h0UG9zaXRpb246IExpZ2h0UG9zaXRpb247XG5cbiAgICBza3lib3hGYm86ID9GcmFtZWJ1ZmZlcjtcbiAgICBza3lib3hUZXh0dXJlOiA/V2ViR0xUZXh0dXJlO1xuICAgIF9za3lib3hJbnZhbGlkYXRlZDogP2Jvb2xlYW47XG5cbiAgICBjb2xvclJhbXA6IFJHQkFJbWFnZTtcbiAgICBjb2xvclJhbXBUZXh0dXJlOiA/VGV4dHVyZTtcblxuICAgIHNreWJveEdlb21ldHJ5OiBTa3lib3hHZW9tZXRyeTtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgICAgICB0aGlzLl91cGRhdGVDb2xvclJhbXAoKTtcbiAgICB9XG5cbiAgICBfaGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnc2t5LWdyYWRpZW50Jykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCk7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3NreS1hdG1vc3BoZXJlLXN1bicgfHxcbiAgICAgICAgICAgICAgICAgICBuYW1lID09PSAnc2t5LWF0bW9zcGhlcmUtaGFsby1jb2xvcicgfHxcbiAgICAgICAgICAgICAgICAgICBuYW1lID09PSAnc2t5LWF0bW9zcGhlcmUtY29sb3InIHx8XG4gICAgICAgICAgICAgICAgICAgbmFtZSA9PT0gJ3NreS1hdG1vc3BoZXJlLXN1bi1pbnRlbnNpdHknKSB7XG4gICAgICAgICAgICB0aGlzLl9za3lib3hJbnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlQ29sb3JSYW1wKCkge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzWydza3ktZ3JhZGllbnQnXS52YWx1ZS5leHByZXNzaW9uO1xuICAgICAgICB0aGlzLmNvbG9yUmFtcCA9IHJlbmRlckNvbG9yUmFtcCh7XG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgZXZhbHVhdGlvbktleTogJ3NreVJhZGlhbFByb2dyZXNzJ1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuY29sb3JSYW1wVGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5jb2xvclJhbXBUZXh0dXJlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY29sb3JSYW1wVGV4dHVyZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZWVkc1NreWJveENhcHR1cmUocGFpbnRlcjogUGFpbnRlcikge1xuICAgICAgICBpZiAoISF0aGlzLl9za3lib3hJbnZhbGlkYXRlZCB8fCAhdGhpcy5za3lib3hUZXh0dXJlIHx8ICF0aGlzLnNreWJveEdlb21ldHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGFpbnQuZ2V0KCdza3ktYXRtb3NwaGVyZS1zdW4nKSkge1xuICAgICAgICAgICAgY29uc3QgbGlnaHRQb3NpdGlvbiA9IHBhaW50ZXIuc3R5bGUubGlnaHQucHJvcGVydGllcy5nZXQoJ3Bvc2l0aW9uJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGlnaHRQb3NpdGlvbi5hemltdXRoYWwgIT09IGxpZ2h0UG9zaXRpb24uYXppbXV0aGFsIHx8XG4gICAgICAgICAgICAgICAgICAgdGhpcy5fbGlnaHRQb3NpdGlvbi5wb2xhciAhPT0gbGlnaHRQb3NpdGlvbi5wb2xhcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENlbnRlcihwYWludGVyOiBQYWludGVyLCBsZWZ0SGFuZGVkOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnBhaW50LmdldCgnc2t5LXR5cGUnKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdhdG1vc3BoZXJlJykge1xuICAgICAgICAgICAgY29uc3Qgc3VuUG9zaXRpb24gPSB0aGlzLnBhaW50LmdldCgnc2t5LWF0bW9zcGhlcmUtc3VuJyk7XG4gICAgICAgICAgICBjb25zdCB1c2VMaWdodFBvc2l0aW9uID0gIXN1blBvc2l0aW9uO1xuICAgICAgICAgICAgY29uc3QgbGlnaHQgPSBwYWludGVyLnN0eWxlLmxpZ2h0O1xuICAgICAgICAgICAgY29uc3QgbGlnaHRQb3NpdGlvbiA9IGxpZ2h0LnByb3BlcnRpZXMuZ2V0KCdwb3NpdGlvbicpO1xuXG4gICAgICAgICAgICBpZiAodXNlTGlnaHRQb3NpdGlvbiAmJiBsaWdodC5wcm9wZXJ0aWVzLmdldCgnYW5jaG9yJykgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZSgnVGhlIHN1biBkaXJlY3Rpb24gaXMgYXR0YWNoZWQgdG8gYSBsaWdodCB3aXRoIHZpZXdwb3J0IGFuY2hvciwgbGlnaHRpbmcgbWF5IGJlaGF2ZSB1bmV4cGVjdGVkbHkuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1c2VMaWdodFBvc2l0aW9uID9cbiAgICAgICAgICAgICAgICBnZXRDZWxlc3RpYWxEaXJlY3Rpb24obGlnaHRQb3NpdGlvbi5hemltdXRoYWwsIC1saWdodFBvc2l0aW9uLnBvbGFyICsgOTAsIGxlZnRIYW5kZWQpIDpcbiAgICAgICAgICAgICAgICBnZXRDZWxlc3RpYWxEaXJlY3Rpb24oc3VuUG9zaXRpb25bMF0sIC1zdW5Qb3NpdGlvblsxXSArIDkwLCBsZWZ0SGFuZGVkKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZ3JhZGllbnQnKSB7XG4gICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLnBhaW50LmdldCgnc2t5LWdyYWRpZW50LWNlbnRlcicpO1xuICAgICAgICAgICAgcmV0dXJuIGdldENlbGVzdGlhbERpcmVjdGlvbihkaXJlY3Rpb25bMF0sIC1kaXJlY3Rpb25bMV0gKyA5MCwgbGVmdEhhbmRlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpczNEKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNTa3koKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIG1hcmtTa3lib3hWYWxpZChwYWludGVyOiBQYWludGVyKSB7XG4gICAgICAgIHRoaXMuX3NreWJveEludmFsaWRhdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2xpZ2h0UG9zaXRpb24gPSBwYWludGVyLnN0eWxlLmxpZ2h0LnByb3BlcnRpZXMuZ2V0KCdwb3NpdGlvbicpO1xuICAgIH1cblxuICAgIGhhc09mZnNjcmVlblBhc3MoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1JZHMoKTogc3RyaW5nW10gfCBudWxsIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMucGFpbnQuZ2V0KCdza3ktdHlwZScpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2F0bW9zcGhlcmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gWydza3lib3hDYXB0dXJlJywgJ3NreWJveCddO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdncmFkaWVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiBbJ3NreWJveEdyYWRpZW50J107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTa3lMYXllcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBjaXJjbGUgZnJvbSAnLi9zdHlsZV9sYXllci9jaXJjbGVfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IGhlYXRtYXAgZnJvbSAnLi9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCBoaWxsc2hhZGUgZnJvbSAnLi9zdHlsZV9sYXllci9oaWxsc2hhZGVfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IGZpbGwgZnJvbSAnLi9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uIGZyb20gJy4vc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IGxpbmUgZnJvbSAnLi9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCBzeW1ib2wgZnJvbSAnLi9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IGJhY2tncm91bmQgZnJvbSAnLi9zdHlsZV9sYXllci9iYWNrZ3JvdW5kX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCByYXN0ZXIgZnJvbSAnLi9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IEN1c3RvbVN0eWxlTGF5ZXIgZnJvbSAnLi9zdHlsZV9sYXllci9jdXN0b21fc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHNreSBmcm9tICcuL3N0eWxlX2xheWVyL3NreV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7Q3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGZyb20gJy4vc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyLmpzJztcblxuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5cbmNvbnN0IHN1YmNsYXNzZXMgPSB7XG4gICAgY2lyY2xlLFxuICAgIGhlYXRtYXAsXG4gICAgaGlsbHNoYWRlLFxuICAgIGZpbGwsXG4gICAgJ2ZpbGwtZXh0cnVzaW9uJzogZmlsbEV4dHJ1c2lvbixcbiAgICBsaW5lLFxuICAgIHN5bWJvbCxcbiAgICBiYWNrZ3JvdW5kLFxuICAgIHJhc3RlcixcbiAgICBza3lcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZVN0eWxlTGF5ZXIobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbiB8IEN1c3RvbUxheWVySW50ZXJmYWNlKSB7XG4gICAgaWYgKGxheWVyLnR5cGUgPT09ICdjdXN0b20nKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tU3R5bGVMYXllcihsYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBzdWJjbGFzc2VzW2xheWVyLnR5cGVdKGxheWVyKTtcbiAgICB9XG59XG5cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cuanMnO1xuY29uc3Qge0hUTUxJbWFnZUVsZW1lbnQsIEhUTUxDYW52YXNFbGVtZW50LCBIVE1MVmlkZW9FbGVtZW50LCBJbWFnZURhdGEsIEltYWdlQml0bWFwfSA9IHdpbmRvdztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtSR0JBSW1hZ2UsIEFscGhhSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuXG5leHBvcnQgdHlwZSBUZXh0dXJlRm9ybWF0ID1cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnUkdCQSc+XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ0FMUEhBJz47XG5leHBvcnQgdHlwZSBUZXh0dXJlRmlsdGVyID1cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTElORUFSJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTElORUFSX01JUE1BUF9ORUFSRVNUJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTkVBUkVTVCc+O1xuZXhwb3J0IHR5cGUgVGV4dHVyZVdyYXAgPVxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdSRVBFQVQnPlxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdDTEFNUF9UT19FREdFJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTUlSUk9SRURfUkVQRUFUJz47XG5cbnR5cGUgRW1wdHlJbWFnZSA9IHtcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIGRhdGE6IG51bGxcbn1cblxuZXhwb3J0IHR5cGUgVGV4dHVyZUltYWdlID1cbiAgICB8IFJHQkFJbWFnZVxuICAgIHwgQWxwaGFJbWFnZVxuICAgIHwgSFRNTEltYWdlRWxlbWVudFxuICAgIHwgSFRNTENhbnZhc0VsZW1lbnRcbiAgICB8IEhUTUxWaWRlb0VsZW1lbnRcbiAgICB8IEltYWdlRGF0YVxuICAgIHwgRW1wdHlJbWFnZVxuICAgIHwgSW1hZ2VCaXRtYXA7XG5cbmNsYXNzIFRleHR1cmUge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgc2l6ZTogW251bWJlciwgbnVtYmVyXTtcbiAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmU7XG4gICAgZm9ybWF0OiBUZXh0dXJlRm9ybWF0O1xuICAgIGZpbHRlcjogP1RleHR1cmVGaWx0ZXI7XG4gICAgd3JhcDogP1RleHR1cmVXcmFwO1xuICAgIHVzZU1pcG1hcDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGltYWdlOiBUZXh0dXJlSW1hZ2UsIGZvcm1hdDogVGV4dHVyZUZvcm1hdCwgb3B0aW9uczogP3sgcHJlbXVsdGlwbHk/OiBib29sZWFuLCB1c2VNaXBtYXA/OiBib29sZWFuIH0pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGNvbnRleHQuZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZShpbWFnZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdXBkYXRlKGltYWdlOiBUZXh0dXJlSW1hZ2UsIG9wdGlvbnM6ID97cHJlbXVsdGlwbHk/OiBib29sZWFuLCB1c2VNaXBtYXA/OiBib29sZWFufSwgcG9zaXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0pIHtcbiAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gaW1hZ2U7XG4gICAgICAgIGNvbnN0IHtjb250ZXh0fSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHtnbH0gPSBjb250ZXh0O1xuXG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG5cbiAgICAgICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrRmxpcFkuc2V0KGZhbHNlKTtcbiAgICAgICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrLnNldCgxKTtcbiAgICAgICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXQodGhpcy5mb3JtYXQgPT09IGdsLlJHQkEgJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMucHJlbXVsdGlwbHkgIT09IGZhbHNlKSk7XG5cbiAgICAgICAgaWYgKCFwb3NpdGlvbiAmJiAoIXRoaXMuc2l6ZSB8fCB0aGlzLnNpemVbMF0gIT09IHdpZHRoIHx8IHRoaXMuc2l6ZVsxXSAhPT0gaGVpZ2h0KSkge1xuICAgICAgICAgICAgdGhpcy5zaXplID0gW3dpZHRoLCBoZWlnaHRdO1xuXG4gICAgICAgICAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSW1hZ2VEYXRhIHx8IChJbWFnZUJpdG1hcCAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwKSkge1xuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5mb3JtYXQsIHRoaXMuZm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5mb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRoaXMuZm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZS5kYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qge3gsIHl9ID0gcG9zaXRpb24gfHwge3g6IDAsIHk6IDB9O1xuICAgICAgICAgICAgaWYgKGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlRGF0YSB8fCAoSW1hZ2VCaXRtYXAgJiYgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCkpIHtcbiAgICAgICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIHgsIHksIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXNlTWlwbWFwID0gQm9vbGVhbihvcHRpb25zICYmIG9wdGlvbnMudXNlTWlwbWFwICYmIHRoaXMuaXNTaXplUG93ZXJPZlR3bygpKTtcbiAgICAgICAgaWYgKHRoaXMudXNlTWlwbWFwKSB7XG4gICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmQoZmlsdGVyOiBUZXh0dXJlRmlsdGVyLCB3cmFwOiBUZXh0dXJlV3JhcCkge1xuICAgICAgICBjb25zdCB7Y29udGV4dH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7Z2x9ID0gY29udGV4dDtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcblxuICAgICAgICBpZiAoZmlsdGVyICE9PSB0aGlzLmZpbHRlcikge1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlcik7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUixcbiAgICAgICAgICAgICAgICB0aGlzLnVzZU1pcG1hcCA/IChmaWx0ZXIgPT09IGdsLk5FQVJFU1QgPyBnbC5ORUFSRVNUX01JUE1BUF9ORUFSRVNUIDogZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUKSA6IGZpbHRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdyYXAgIT09IHRoaXMud3JhcCkge1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgd3JhcCk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCB3cmFwKTtcbiAgICAgICAgICAgIHRoaXMud3JhcCA9IHdyYXA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1NpemVQb3dlck9mVHdvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXplWzBdID09PSB0aGlzLnNpemVbMV0gJiYgKE1hdGgubG9nKHRoaXMuc2l6ZVswXSkgLyBNYXRoLkxOMikgJSAxID09PSAwO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGNvbnN0IHtnbH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGdsLmRlbGV0ZVRleHR1cmUodGhpcy50ZXh0dXJlKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gKG51bGw6IGFueSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUZXh0dXJlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt3YXJuT25jZSwgbmV4dFBvd2VyT2ZUd299IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge0FscGhhSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcblxuLyoqXG4gKiBBIExpbmVBdGxhcyBsZXRzIHVzIHJldXNlIHJlbmRlcmVkIGRhc2hlZCBsaW5lc1xuICogYnkgd3JpdGluZyBtYW55IG9mIHRoZW0gdG8gYSB0ZXh0dXJlIGFuZCB0aGVuIGZldGNoaW5nIHRoZWlyIHBvc2l0aW9uc1xuICogdXNpbmcgLmdldERhc2guXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBMaW5lQXRsYXMge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgbmV4dFJvdzogbnVtYmVyO1xuICAgIGltYWdlOiBBbHBoYUltYWdlO1xuICAgIHBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBhbnl9O1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy5uZXh0Um93ID0gMDtcbiAgICAgICAgdGhpcy5pbWFnZSA9IG5ldyBBbHBoYUltYWdlKHt3aWR0aCwgaGVpZ2h0fSk7XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0ge307XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBkYXNoIGxpbmUgcGF0dGVybi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZGFzaGFycmF5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmVDYXAgdGhlIHR5cGUgb2YgbGluZSBjYXBzIHRvIGJlIGFkZGVkIHRvIGRhc2hlc1xuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHBvc2l0aW9uIG9mIGRhc2ggdGV4dHVyZSBpbiB7IHksIGhlaWdodCwgd2lkdGggfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0RGFzaChkYXNoYXJyYXk6IEFycmF5PG51bWJlcj4sIGxpbmVDYXA6IHN0cmluZykge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShkYXNoYXJyYXksIGxpbmVDYXApO1xuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbnNba2V5XTtcbiAgICB9XG5cbiAgICB0cmltKCkge1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0ID0gbmV4dFBvd2VyT2ZUd28odGhpcy5uZXh0Um93KTtcbiAgICAgICAgdGhpcy5pbWFnZS5yZXNpemUoe3dpZHRoLCBoZWlnaHR9KTtcbiAgICB9XG5cbiAgICBnZXRLZXkoZGFzaGFycmF5OiBBcnJheTxudW1iZXI+LCBsaW5lQ2FwOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZGFzaGFycmF5LmpvaW4oJywnKSArIGxpbmVDYXA7XG4gICAgfVxuXG4gICAgZ2V0RGFzaFJhbmdlcyhkYXNoYXJyYXk6IEFycmF5PG51bWJlcj4sIGxpbmVBdGxhc1dpZHRoOiBudW1iZXIsIHN0cmV0Y2g6IG51bWJlcikge1xuICAgICAgICAvLyBJZiBkYXNoYXJyYXkgaGFzIGFuIG9kZCBsZW5ndGgsIGJvdGggdGhlIGZpcnN0IGFuZCBsYXN0IHBhcnRzXG4gICAgICAgIC8vIGFyZSBkYXNoZXMgYW5kIHNob3VsZCBiZSBqb2luZWQgc2VhbWxlc3NseS5cbiAgICAgICAgY29uc3Qgb2RkRGFzaEFycmF5ID0gZGFzaGFycmF5Lmxlbmd0aCAlIDIgPT09IDE7XG5cbiAgICAgICAgY29uc3QgcmFuZ2VzID0gW107XG5cbiAgICAgICAgbGV0IGxlZnQgPSBvZGREYXNoQXJyYXkgPyAtZGFzaGFycmF5W2Rhc2hhcnJheS5sZW5ndGggLSAxXSAqIHN0cmV0Y2ggOiAwO1xuICAgICAgICBsZXQgcmlnaHQgPSBkYXNoYXJyYXlbMF0gKiBzdHJldGNoO1xuICAgICAgICBsZXQgaXNEYXNoID0gdHJ1ZTtcblxuICAgICAgICByYW5nZXMucHVzaCh7bGVmdCwgcmlnaHQsIGlzRGFzaCwgemVyb0xlbmd0aDogZGFzaGFycmF5WzBdID09PSAwfSk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnREYXNoTGVuZ3RoID0gZGFzaGFycmF5WzBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGRhc2hhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaXNEYXNoID0gIWlzRGFzaDtcblxuICAgICAgICAgICAgY29uc3QgZGFzaExlbmd0aCA9IGRhc2hhcnJheVtpXTtcbiAgICAgICAgICAgIGxlZnQgPSBjdXJyZW50RGFzaExlbmd0aCAqIHN0cmV0Y2g7XG4gICAgICAgICAgICBjdXJyZW50RGFzaExlbmd0aCArPSBkYXNoTGVuZ3RoO1xuICAgICAgICAgICAgcmlnaHQgPSBjdXJyZW50RGFzaExlbmd0aCAqIHN0cmV0Y2g7XG5cbiAgICAgICAgICAgIHJhbmdlcy5wdXNoKHtsZWZ0LCByaWdodCwgaXNEYXNoLCB6ZXJvTGVuZ3RoOiBkYXNoTGVuZ3RoID09PSAwfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmFuZ2VzO1xuICAgIH1cblxuICAgIGFkZFJvdW5kRGFzaChyYW5nZXM6IE9iamVjdCwgc3RyZXRjaDogbnVtYmVyLCBuOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgaGFsZlN0cmV0Y2ggPSBzdHJldGNoIC8gMjtcblxuICAgICAgICBmb3IgKGxldCB5ID0gLW47IHkgPD0gbjsgeSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLm5leHRSb3cgKyBuICsgeTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy53aWR0aCAqIHJvdztcbiAgICAgICAgICAgIGxldCBjdXJySW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gcmFuZ2VzW2N1cnJJbmRleF07XG5cbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHggLyByYW5nZS5yaWdodCA+IDEpIHsgcmFuZ2UgPSByYW5nZXNbKytjdXJySW5kZXhdOyB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0TGVmdCA9IE1hdGguYWJzKHggLSByYW5nZS5sZWZ0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0UmlnaHQgPSBNYXRoLmFicyh4IC0gcmFuZ2UucmlnaHQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pbkRpc3QgPSBNYXRoLm1pbihkaXN0TGVmdCwgZGlzdFJpZ2h0KTtcbiAgICAgICAgICAgICAgICBsZXQgc2lnbmVkRGlzdGFuY2U7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0TWlkZGxlID0gIHkgLyBuICogKGhhbGZTdHJldGNoICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLmlzRGFzaCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXN0RWRnZSA9IGhhbGZTdHJldGNoIC0gTWF0aC5hYnMoZGlzdE1pZGRsZSk7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25lZERpc3RhbmNlID0gTWF0aC5zcXJ0KG1pbkRpc3QgKiBtaW5EaXN0ICsgZGlzdEVkZ2UgKiBkaXN0RWRnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmVkRGlzdGFuY2UgPSBoYWxmU3RyZXRjaCAtIE1hdGguc3FydChtaW5EaXN0ICogbWluRGlzdCArIGRpc3RNaWRkbGUgKiBkaXN0TWlkZGxlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlLmRhdGFbaW5kZXggKyB4XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgc2lnbmVkRGlzdGFuY2UgKyAxMjgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFJlZ3VsYXJEYXNoKHJhbmdlczogT2JqZWN0LCBjYXBMZW5ndGg6IG51bWJlcikge1xuXG4gICAgICAgIC8vIENvbGxhcHNlIGFueSB6ZXJvLWxlbmd0aCByYW5nZVxuICAgICAgICAvLyBDb2xsYXBzZSBuZWlnaGJvdXJpbmcgc2FtZS10eXBlIHBhcnRzIGludG8gYSBzaW5nbGUgcGFydFxuICAgICAgICBmb3IgKGxldCBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IHJhbmdlc1tpICsgMV07XG4gICAgICAgICAgICBpZiAocGFydC56ZXJvTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCAmJiBuZXh0LmlzRGFzaCA9PT0gcGFydC5pc0Rhc2gpIHtcbiAgICAgICAgICAgICAgICBuZXh0LmxlZnQgPSBwYXJ0LmxlZnQ7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbWJpbmUgdGhlIGZpcnN0IGFuZCBsYXN0IHBhcnRzIGlmIHBvc3NpYmxlXG4gICAgICAgIGNvbnN0IGZpcnN0ID0gcmFuZ2VzWzBdO1xuICAgICAgICBjb25zdCBsYXN0ID0gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGZpcnN0LmlzRGFzaCA9PT0gbGFzdC5pc0Rhc2gpIHtcbiAgICAgICAgICAgIGZpcnN0LmxlZnQgPSBsYXN0LmxlZnQgLSB0aGlzLndpZHRoO1xuICAgICAgICAgICAgbGFzdC5yaWdodCA9IGZpcnN0LnJpZ2h0ICsgdGhpcy53aWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy53aWR0aCAqIHRoaXMubmV4dFJvdztcbiAgICAgICAgbGV0IGN1cnJJbmRleCA9IDA7XG4gICAgICAgIGxldCByYW5nZSA9IHJhbmdlc1tjdXJySW5kZXhdO1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBpZiAoeCAvIHJhbmdlLnJpZ2h0ID4gMSkge1xuICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ2VzWysrY3VyckluZGV4XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGlzdExlZnQgPSBNYXRoLmFicyh4IC0gcmFuZ2UubGVmdCk7XG4gICAgICAgICAgICBjb25zdCBkaXN0UmlnaHQgPSBNYXRoLmFicyh4IC0gcmFuZ2UucmlnaHQpO1xuXG4gICAgICAgICAgICBjb25zdCBtaW5EaXN0ID0gTWF0aC5taW4oZGlzdExlZnQsIGRpc3RSaWdodCk7XG4gICAgICAgICAgICBjb25zdCBzaWduZWREaXN0YW5jZSA9IChyYW5nZS5pc0Rhc2ggPyBtaW5EaXN0IDogLW1pbkRpc3QpICsgY2FwTGVuZ3RoO1xuXG4gICAgICAgICAgICB0aGlzLmltYWdlLmRhdGFbaW5kZXggKyB4XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgc2lnbmVkRGlzdGFuY2UgKyAxMjgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZERhc2goZGFzaGFycmF5OiBBcnJheTxudW1iZXI+LCBsaW5lQ2FwOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoZGFzaGFycmF5LCBsaW5lQ2FwKTtcbiAgICAgICAgaWYgKHRoaXMucG9zaXRpb25zW2tleV0pIHJldHVybiB0aGlzLnBvc2l0aW9uc1trZXldO1xuXG4gICAgICAgIGNvbnN0IHJvdW5kID0gbGluZUNhcCA9PT0gJ3JvdW5kJztcbiAgICAgICAgY29uc3QgbiA9IHJvdW5kID8gNyA6IDA7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IDIgKiBuICsgMTtcblxuICAgICAgICBpZiAodGhpcy5uZXh0Um93ICsgaGVpZ2h0ID4gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKCdMaW5lQXRsYXMgb3V0IG9mIHNwYWNlJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRhc2hhcnJheSBpcyBlbXB0eSwgZHJhd3MgYSBmdWxsIGxpbmUgKG5vIGRhc2ggb3Igbm8gZ2FwIGxlbmd0aCByZXByZXNlbnRlZCwgZGVmYXVsdCBiZWhhdmlvcilcbiAgICAgICAgaWYgKGRhc2hhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGluc2VydCBhIHNpbmdsZSBkYXNoIHJhbmdlIGluIG9yZGVyIHRvIGRyYXcgYSBmdWxsIGxpbmVcbiAgICAgICAgICAgIGRhc2hhcnJheS5wdXNoKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxlbmd0aCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGFzaGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZGFzaGFycmF5W2ldIDwgMCkge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKCdOZWdhdGl2ZSB2YWx1ZSBpcyBmb3VuZCBpbiBsaW5lIGRhc2hhcnJheSwgcmVwbGFjaW5nIHZhbHVlcyB3aXRoIDAnKTtcbiAgICAgICAgICAgICAgICBkYXNoYXJyYXlbaV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVuZ3RoICs9IGRhc2hhcnJheVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmV0Y2ggPSB0aGlzLndpZHRoIC8gbGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2VzID0gdGhpcy5nZXREYXNoUmFuZ2VzKGRhc2hhcnJheSwgdGhpcy53aWR0aCwgc3RyZXRjaCk7XG5cbiAgICAgICAgICAgIGlmIChyb3VuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkUm91bmREYXNoKHJhbmdlcywgc3RyZXRjaCwgbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcExlbmd0aCA9IGxpbmVDYXAgPT09ICdzcXVhcmUnID8gMC41ICogc3RyZXRjaCA6IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRSZWd1bGFyRGFzaChyYW5nZXMsIGNhcExlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB5ID0gdGhpcy5uZXh0Um93ICsgbjtcblxuICAgICAgICB0aGlzLm5leHRSb3cgKz0gaGVpZ2h0O1xuXG4gICAgICAgIGNvbnN0IHBvcyA9IHtcbiAgICAgICAgICAgIHRsOiBbeSwgbl0sXG4gICAgICAgICAgICBicjogW2xlbmd0aCwgMF1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnNba2V5XSA9IHBvcztcbiAgICAgICAgcmV0dXJuIHBvcztcbiAgICB9XG59XG5cbnJlZ2lzdGVyKCdMaW5lQXRsYXMnLCBMaW5lQXRsYXMpO1xuXG5leHBvcnQgZGVmYXVsdCBMaW5lQXRsYXM7XG4iLCIvLyBAZmxvd1xuXG4vKipcbiAqIEludm9rZXMgdGhlIHdyYXBwZWQgZnVuY3Rpb24gaW4gYSBub24tYmxvY2tpbmcgd2F5IHdoZW4gdHJpZ2dlcigpIGlzIGNhbGxlZC4gSW52b2NhdGlvbiByZXF1ZXN0c1xuICogYXJlIGlnbm9yZWQgdW50aWwgdGhlIGZ1bmN0aW9uIHdhcyBhY3R1YWxseSBpbnZva2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFRocm90dGxlZEludm9rZXIge1xuICAgIF9jaGFubmVsOiBNZXNzYWdlQ2hhbm5lbDtcbiAgICBfdHJpZ2dlcmVkOiBib29sZWFuO1xuICAgIF9jYWxsYmFjazogRnVuY3Rpb25cblxuICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLl90cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwucG9ydDIub25tZXNzYWdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJpZ2dlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90cmlnZ2VyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UodHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2NoYW5uZWw7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gKCkgPT4ge307XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUaHJvdHRsZWRJbnZva2VyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdy5qcyc7XG5pbXBvcnQgdHlwZSB7UmVxdWVzdFBhcmFtZXRlcnN9IGZyb20gJy4uL3V0aWwvYWpheC5qcyc7XG5cbmNvbnN0IHBlcmZvcm1hbmNlID0gd2luZG93LnBlcmZvcm1hbmNlO1xuXG5leHBvcnQgdHlwZSBQZXJmb3JtYW5jZU1ldHJpY3MgPSB7XG4gICAgbG9hZFRpbWU6IG51bWJlcixcbiAgICBmdWxsTG9hZFRpbWU6IG51bWJlcixcbiAgICBmcHM6IG51bWJlcixcbiAgICBwZXJjZW50RHJvcHBlZEZyYW1lczogbnVtYmVyLFxuICAgIHBhcnNlVGlsZTogbnVtYmVyLFxuICAgIHBhcnNlVGlsZTE6IG51bWJlcixcbiAgICBwYXJzZVRpbGUyOiBudW1iZXIsXG4gICAgd29ya2VyVGFzazogbnVtYmVyLFxuICAgIHdvcmtlckluaXRpYWxpemF0aW9uOiBudW1iZXIsXG4gICAgd29ya2VyRXZhbHVhdGVTY3JpcHQ6IG51bWJlcixcbiAgICB3b3JrZXJJZGxlOiBudW1iZXIsXG4gICAgd29ya2VySWRsZVBlcmNlbnQ6IG51bWJlcixcbiAgICBwbGFjZW1lbnRUaW1lOiBudW1iZXJcbn07XG5cbmV4cG9ydCBjb25zdCBQZXJmb3JtYW5jZU1hcmtlcnMgPSB7XG4gICAgY3JlYXRlOiAnY3JlYXRlJyxcbiAgICBsb2FkOiAnbG9hZCcsXG4gICAgZnVsbExvYWQ6ICdmdWxsTG9hZCdcbn07XG5cbmxldCBsYXN0RnJhbWVUaW1lID0gbnVsbDtcbmxldCBmdWxsTG9hZEZpbmlzaGVkID0gZmFsc2U7XG5sZXQgZnJhbWVUaW1lcyA9IFtdO1xubGV0IHBsYWNlbWVudFRpbWUgPSAwO1xuY29uc3QgZnJhbWVTZXF1ZW5jZXMgPSBbZnJhbWVUaW1lc107XG5sZXQgaSA9IDA7XG5cbi8vIFRoZSBtYXggbWlsbGlzZWNvbmRzIHdlIHNob3VsZCBzcGVuZCB0byByZW5kZXIgYSBzaW5nbGUgZnJhbWUuXG4vLyBUaGlzIHZhbHVlIG1heSBuZWVkIHRvIGJlIHR3ZWFrZWQuIEkgY2hvc2UgMTQgYnkgaW5jcmVhc2luZyBmcmFtZVxuLy8gdGltZXMgd2l0aCBidXN5IHdvcmsgYW5kIG1lYXN1cmluZyB0aGUgbnVtYmVyIG9mIGRyb3BwZWQgZnJhbWVzLlxuLy8gT24gYSBwYWdlIHdpdGggb25seSBhIG1hcCwgbW9yZSBmcmFtZXMgc3RhcnRlZCBiZWluZyBkcm9wcGVkIGFmdGVyXG4vLyBnb2luZyBhYm92ZSAxNG1zLiBXZSBtaWdodCB3YW50IHRvIGxvd2VyIHRoaXMgdG8gbGVhdmUgbW9yZSByb29tXG4vLyBmb3Igb3RoZXIgd29yay5cbmNvbnN0IENQVV9GUkFNRV9CVURHRVQgPSAxNDtcblxuY29uc3QgZnJhbWVyYXRlVGFyZ2V0ID0gNjA7XG5jb25zdCBmcmFtZVRpbWVUYXJnZXQgPSAxMDAwIC8gZnJhbWVyYXRlVGFyZ2V0O1xuXG5leHBvcnQgY29uc3QgUGVyZm9ybWFuY2VVdGlscyA9IHtcbiAgICBtYXJrKG1hcmtlcjogJEtleXM8dHlwZW9mIFBlcmZvcm1hbmNlTWFya2Vycz4pIHtcbiAgICAgICAgcGVyZm9ybWFuY2UubWFyayhtYXJrZXIpO1xuXG4gICAgICAgIGlmIChtYXJrZXIgPT09IFBlcmZvcm1hbmNlTWFya2Vycy5mdWxsTG9hZCkge1xuICAgICAgICAgICAgZnVsbExvYWRGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lYXN1cmUobmFtZTogc3RyaW5nLCBiZWdpbj86IHN0cmluZywgZW5kPzogc3RyaW5nKSB7XG4gICAgICAgIHBlcmZvcm1hbmNlLm1lYXN1cmUobmFtZSwgYmVnaW4sIGVuZCk7XG4gICAgfSxcbiAgICBiZWdpbk1lYXN1cmUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG1hcmsgPSBuYW1lICsgaSsrO1xuICAgICAgICBwZXJmb3JtYW5jZS5tYXJrKG1hcmspO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWFyayxcbiAgICAgICAgICAgIG5hbWVcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIGVuZE1lYXN1cmUobTogeyBuYW1lOiBzdHJpbmcsIG1hcms6IHN0cmluZyB9KSB7XG4gICAgICAgIHBlcmZvcm1hbmNlLm1lYXN1cmUobS5uYW1lLCBtLm1hcmspO1xuICAgIH0sXG4gICAgcmVjb3JkUGxhY2VtZW50VGltZSh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgLy8gSWdub3JlIHBsYWNlbWVudFRpbWVzIGR1cmluZyBsb2FkaW5nXG4gICAgICAgIGlmICghZnVsbExvYWRGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcGxhY2VtZW50VGltZSArPSB0aW1lO1xuICAgIH0sXG4gICAgZnJhbWUodGltZXN0YW1wOiBudW1iZXIsIGlzUmVuZGVyRnJhbWU6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgY3VyclRpbWVzdGFtcCA9IHRpbWVzdGFtcDtcbiAgICAgICAgaWYgKGxhc3RGcmFtZVRpbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZnJhbWVUaW1lID0gY3VyclRpbWVzdGFtcCAtIGxhc3RGcmFtZVRpbWU7XG4gICAgICAgICAgICBmcmFtZVRpbWVzLnB1c2goZnJhbWVUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1JlbmRlckZyYW1lKSB7XG4gICAgICAgICAgICBsYXN0RnJhbWVUaW1lID0gY3VyclRpbWVzdGFtcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhc3RGcmFtZVRpbWUgPSBudWxsO1xuICAgICAgICAgICAgZnJhbWVUaW1lcyA9IFtdO1xuICAgICAgICAgICAgZnJhbWVTZXF1ZW5jZXMucHVzaChmcmFtZVRpbWVzKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgY2xlYXJNZXRyaWNzKCkge1xuICAgICAgICBsYXN0RnJhbWVUaW1lID0gbnVsbDtcbiAgICAgICAgZnJhbWVUaW1lcyA9IFtdO1xuICAgICAgICBwbGFjZW1lbnRUaW1lID0gMDtcbiAgICAgICAgZnVsbExvYWRGaW5pc2hlZCA9IGZhbHNlO1xuXG4gICAgICAgIHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMoJ2xvYWRUaW1lJyk7XG4gICAgICAgIHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMoJ2Z1bGxMb2FkVGltZScpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbWFya2VyIGluIFBlcmZvcm1hbmNlTWFya2Vycykge1xuICAgICAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJNYXJrcyhQZXJmb3JtYW5jZU1hcmtlcnNbbWFya2VyXSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk6IFBlcmZvcm1hbmNlTWV0cmljcyB7XG4gICAgICAgIGNvbnN0IG1ldHJpY3MgPSB7fTtcblxuICAgICAgICBwZXJmb3JtYW5jZS5tZWFzdXJlKCdsb2FkVGltZScsIFBlcmZvcm1hbmNlTWFya2Vycy5jcmVhdGUsIFBlcmZvcm1hbmNlTWFya2Vycy5sb2FkKTtcbiAgICAgICAgcGVyZm9ybWFuY2UubWVhc3VyZSgnZnVsbExvYWRUaW1lJywgUGVyZm9ybWFuY2VNYXJrZXJzLmNyZWF0ZSwgUGVyZm9ybWFuY2VNYXJrZXJzLmZ1bGxMb2FkKTtcblxuICAgICAgICBjb25zdCBtZWFzdXJlcyA9IHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeVR5cGUoJ21lYXN1cmUnKTtcbiAgICAgICAgZm9yIChjb25zdCBtZWFzdXJlIG9mIG1lYXN1cmVzKSB7XG4gICAgICAgICAgICBtZXRyaWNzW21lYXN1cmUubmFtZV0gPSAobWV0cmljc1ttZWFzdXJlLm5hbWVdIHx8IDApICsgbWVhc3VyZS5kdXJhdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSBwZXJmZWN0IHdheSBvZiBtZWFzdXJpbmcgdGhlIGFjdHVhbCBudW1iZXIgb2YgZHJvcHBlZCBmcmFtZXMuXG4gICAgICAgIC8vIFRoZSBiZXN0IHdheSBvZiBkZXRlcm1pbmluZyB3aGVuIGZyYW1lcyBoYXBwZW4gaXMgdGhlIHRpbWVzdGFtcCBwYXNzZWQgdG9cbiAgICAgICAgLy8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lLiBJbiBDaHJvbWUgYW5kIEZpcmVmb3ggdGhlIHRpbWVzdGFtcHMgYXJlIGdlbmVyYWxseVxuICAgICAgICAvLyBtdWx0aXBsZXMgb2YgMTAwMC82MG1zICgrLTJtcykuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0aW1lc3RhbXBzIHZhcnkgYSBsb3QgbW9yZSBpbiBTYWZhcmkuXG4gICAgICAgIC8vIEl0J3Mgbm90IHVuY29tbW9uIHRvIHNlZSBhIDI0bXMgZGlmZmVyZW5jZSBmb2xsb3dlZGQgYnkgYSA4bXMgZGlmZmVyZW5jZS5cbiAgICAgICAgLy8gSSdtIG5vdCBzdXJlLCBidXQgSSB0aGluayB0aGVzZSBtaWdodCBub3QgYmUgZHJvcHBlZCBmcmFtZXMgKGR1ZSB0byBtdWx0aXBsZVxuICAgICAgICAvLyBidWZmZXJpbmc/KS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRm9yIFNhZmFyaSwgSSB0aGluayBjb21wYXJpbmcgdGhlIG51bWJlciBvZiBleHBlY3RlZCBmcmFtZXMgd2l0aCB0aGUgbnVtYmVyIG9mIGFjdHVhbFxuICAgICAgICAvLyBmcmFtZXMgaXMgYSBtb3JlIGFjY3VyYXRlIHdheSBvZiBtZWFzdXJpbmcgZHJvcHBlZCBmcmFtZXMgdGhhbiBjb21wYXJpbmdcbiAgICAgICAgLy8gaW5kaXZpZHVhbCBmcmFtZSB0aW1lIGRpZmZlcmVuY2VzIHRvIGEgdGFyZ2V0IHRpbWUuIEluIEZpcmVmb3ggYW5kIENocm9tZVxuICAgICAgICAvLyBib3RoIGFwcHJvYWNoZXMgcHJvZHVjZSB0aGUgc2FtZSByZXN1bHQgbW9zdCBvZiB0aGUgdGltZS5cbiAgICAgICAgbGV0IGRyb3BwZWRGcmFtZXMgPSAwO1xuICAgICAgICBsZXQgdG90YWxGcmFtZVRpbWVTdW0gPSAwO1xuICAgICAgICBsZXQgdG90YWxGcmFtZXMgPSAwO1xuICAgICAgICBtZXRyaWNzLmphbmsgPSAwO1xuXG4gICAgICAgIGZvciAoY29uc3QgZnJhbWVUaW1lcyBvZiBmcmFtZVNlcXVlbmNlcykge1xuICAgICAgICAgICAgaWYgKCFmcmFtZVRpbWVzLmxlbmd0aCkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBmcmFtZVRpbWVTdW0gPSBmcmFtZVRpbWVzLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiArIGN1cnIsIDApO1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRGcmFtZXMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGZyYW1lVGltZVN1bSAvIGZyYW1lVGltZVRhcmdldCkpO1xuICAgICAgICAgICAgZHJvcHBlZEZyYW1lcyArPSBleHBlY3RlZEZyYW1lcyAtIGZyYW1lVGltZXMubGVuZ3RoO1xuICAgICAgICAgICAgdG90YWxGcmFtZVRpbWVTdW0gKz0gZnJhbWVUaW1lU3VtO1xuICAgICAgICAgICAgdG90YWxGcmFtZXMgKz0gZnJhbWVUaW1lcy5sZW5ndGg7XG5cbiAgICAgICAgICAgIC8vIEphbmsgaXMgYSBjaGFuZ2UgaW4gdGhlIGZyYW1lIHJhdGUuXG4gICAgICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgZnJhbWUgaGFzIGEgd29yc2UgcmF0ZSB0aGFuIHRoZSBwcmV2aW91cyBmcmFtZS5cbiAgICAgICAgICAgIC8vIEEgY29uc2lzdGVudCByYXRlIGRvZXMgbm90IGluY3JlYXNlIGphbmsgZXZlbiBpZiBpdCBpcyBjb250aW51b3NseSBkcm9wcGluZyBmcmFtZXMuXG4gICAgICAgICAgICAvLyBBIG9uZS1vZmYgZnJhbWUgZG9lcyBub3QgaW5jcmVhc2UgamFuayBldmVuIGlmIGl0IGlzIHJlYWxseSBsb25nLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IHRoYXQgYWNjdXJhdGUgaW4gU2FmYXJpIGJlY2F1c2UgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYW5pbWF0aW9uIGZyYW1lXG4gICAgICAgICAgICAvLyB0aW1lcyBpcyBub3QgYXMgY2xvc2UgdG8gYSBtdWx0aXBsZSBvZiAxMDAwLzYwbXMuXG4gICAgICAgICAgICBjb25zdCByb3VuZGVkVGltZXMgPSBmcmFtZVRpbWVzLm1hcChmcmFtZVRpbWUgPT4gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChmcmFtZVRpbWUgLyBmcmFtZVRpbWVUYXJnZXQpKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJvdW5kZWRUaW1lcy5sZW5ndGggLSAxOyBuKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocm91bmRlZFRpbWVzW24gKyAxXSA+IHJvdW5kZWRUaW1lc1tuXSkge1xuICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLmphbmsrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXZnRnJhbWVUaW1lID0gdG90YWxGcmFtZVRpbWVTdW0gLyB0b3RhbEZyYW1lcyAvIDEwMDA7XG4gICAgICAgIG1ldHJpY3MuZnBzID0gMSAvIGF2Z0ZyYW1lVGltZTtcbiAgICAgICAgbWV0cmljcy5kcm9wcGVkRnJhbWVzID0gZHJvcHBlZEZyYW1lcztcbiAgICAgICAgbWV0cmljcy5wZXJjZW50RHJvcHBlZEZyYW1lcyA9IChkcm9wcGVkRnJhbWVzIC8gKHRvdGFsRnJhbWVzICsgZHJvcHBlZEZyYW1lcykpICogMTAwO1xuXG4gICAgICAgIG1ldHJpY3MuY3B1RnJhbWVCdWRnZXRFeGNlZWRlZCA9IDA7XG4gICAgICAgIGNvbnN0IHJlbmRlckZyYW1lcyA9IHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUoJ3JlbmRlcicpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlbmRlckZyYW1lIG9mIHJlbmRlckZyYW1lcykge1xuICAgICAgICAgICAgbWV0cmljcy5jcHVGcmFtZUJ1ZGdldEV4Y2VlZGVkICs9IE1hdGgubWF4KDAsIHJlbmRlckZyYW1lLmR1cmF0aW9uIC0gQ1BVX0ZSQU1FX0JVREdFVCk7XG4gICAgICAgIH1cblxuICAgICAgICBtZXRyaWNzLnBsYWNlbWVudFRpbWUgPSBwbGFjZW1lbnRUaW1lO1xuXG4gICAgICAgIHJldHVybiBtZXRyaWNzO1xuICAgIH0sXG5cbiAgICBnZXRXb3JrZXJQZXJmb3JtYW5jZU1ldHJpY3MoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHRpbWVPcmlnaW46IHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4sXG4gICAgICAgICAgICBtZWFzdXJlczogcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZShcIm1lYXN1cmVcIilcbiAgICAgICAgfSkpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQZXJmb3JtYW5jZU1lYXN1cmVtZW50KHJlcXVlc3Q6ID9SZXF1ZXN0UGFyYW1ldGVycykge1xuICAgIGNvbnN0IHVybCA9IHJlcXVlc3QgPyByZXF1ZXN0LnVybC50b1N0cmluZygpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKHVybCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBlcmZvcm1hbmNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFRocm90dGxlZEludm9rZXIgZnJvbSAnLi90aHJvdHRsZWRfaW52b2tlci5qcyc7XG5pbXBvcnQge2JpbmRBbGwsIGlzV29ya2VyfSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IHtQZXJmb3JtYW5jZVV0aWxzfSBmcm9tICcuL3BlcmZvcm1hbmNlLmpzJztcblxuY2xhc3MgU2NoZWR1bGVyIHtcblxuICAgIHRhc2tzOiB7IFtudW1iZXJdOiBhbnkgfTtcbiAgICB0YXNrUXVldWU6IEFycmF5PG51bWJlcj47XG4gICAgaW52b2tlcjogVGhyb3R0bGVkSW52b2tlcjtcbiAgICBuZXh0SWQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRhc2tzID0ge307XG4gICAgICAgIHRoaXMudGFza1F1ZXVlID0gW107XG4gICAgICAgIGJpbmRBbGwoWydwcm9jZXNzJ10sIHRoaXMpO1xuICAgICAgICB0aGlzLmludm9rZXIgPSBuZXcgVGhyb3R0bGVkSW52b2tlcih0aGlzLnByb2Nlc3MpO1xuXG4gICAgICAgIHRoaXMubmV4dElkID0gMDtcbiAgICB9XG5cbiAgICBhZGQoZm46ICgpID0+IHZvaWQsIG1ldGFkYXRhOiBPYmplY3QpIHtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLm5leHRJZCsrO1xuICAgICAgICBjb25zdCBwcmlvcml0eSA9IGdldFByaW9yaXR5KG1ldGFkYXRhKTtcblxuICAgICAgICBpZiAocHJpb3JpdHkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgdGFza3Mgd2l0aCBwcmlvcml0eSAwIGltbWVkaWF0ZWx5LiBEbyBub3QgeWllbGQgdG8gdGhlIGV2ZW50IGxvb3AuXG4gICAgICAgICAgICBjb25zdCBtID0gaXNXb3JrZXIoKSA/IFBlcmZvcm1hbmNlVXRpbHMuYmVnaW5NZWFzdXJlKCd3b3JrZXJUYXNrJykgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlmIChtKSBQZXJmb3JtYW5jZVV0aWxzLmVuZE1lYXN1cmUobSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNhbmNlbDogKCkgPT4ge31cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRhc2tzW2lkXSA9IHtmbiwgbWV0YWRhdGEsIHByaW9yaXR5LCBpZH07XG4gICAgICAgIHRoaXMudGFza1F1ZXVlLnB1c2goaWQpO1xuICAgICAgICB0aGlzLmludm9rZXIudHJpZ2dlcigpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudGFza3NbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByb2Nlc3MoKSB7XG4gICAgICAgIGNvbnN0IG0gPSBpc1dvcmtlcigpID8gUGVyZm9ybWFuY2VVdGlscy5iZWdpbk1lYXN1cmUoJ3dvcmtlclRhc2snKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudGFza1F1ZXVlID0gdGhpcy50YXNrUXVldWUuZmlsdGVyKGlkID0+ICEhdGhpcy50YXNrc1tpZF0pO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMudGFza1F1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5waWNrKCk7XG4gICAgICAgICAgICBpZiAoaWQgPT09IG51bGwpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgdGFzayA9IHRoaXMudGFza3NbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMudGFza3NbaWRdO1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYW5vdGhlciBwcm9jZXNzIGNhbGwgaWYgd2Uga25vdyB0aGVyZSdzIG1vcmUgdG8gcHJvY2VzcyBfYmVmb3JlXyBpbnZva2luZyB0aGVcbiAgICAgICAgICAgIC8vIGN1cnJlbnQgdGFzay4gVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCBwcm9jZXNzaW5nIGNvbnRpbnVlcyBldmVuIGlmIHRoZSBjdXJyZW50IHRhc2tcbiAgICAgICAgICAgIC8vIGRvZXNuJ3QgZXhlY3V0ZSBzdWNjZXNzZnVsbHkuXG4gICAgICAgICAgICBpZiAodGhpcy50YXNrUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZva2VyLnRyaWdnZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGFzaykge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0YXNrIElEIGRvZXNuJ3QgaGF2ZSBhc3NvY2lhdGVkIHRhc2sgZGF0YSBhbnltb3JlLCBpdCB3YXMgY2FuY2VsZWQuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0YXNrLmZuKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAobSkgUGVyZm9ybWFuY2VVdGlscy5lbmRNZWFzdXJlKG0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGljaygpIHtcbiAgICAgICAgbGV0IG1pbkluZGV4ID0gbnVsbDtcbiAgICAgICAgbGV0IG1pblByaW9yaXR5ID0gSW5maW5pdHk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50YXNrUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy50YXNrUXVldWVbaV07XG4gICAgICAgICAgICBjb25zdCB0YXNrID0gdGhpcy50YXNrc1tpZF07XG4gICAgICAgICAgICBpZiAodGFzay5wcmlvcml0eSA8IG1pblByaW9yaXR5KSB7XG4gICAgICAgICAgICAgICAgbWluUHJpb3JpdHkgPSB0YXNrLnByaW9yaXR5O1xuICAgICAgICAgICAgICAgIG1pbkluZGV4ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWluSW5kZXggPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMudGFza1F1ZXVlW21pbkluZGV4XTtcbiAgICAgICAgdGhpcy50YXNrUXVldWUuc3BsaWNlKG1pbkluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5pbnZva2VyLnJlbW92ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHJpb3JpdHkoe3R5cGUsIGlzU3ltYm9sVGlsZSwgem9vbX06IE9iamVjdCkge1xuICAgIHpvb20gPSB6b29tIHx8IDA7XG4gICAgaWYgKHR5cGUgPT09ICdtZXNzYWdlJykgcmV0dXJuIDA7XG4gICAgaWYgKHR5cGUgPT09ICdtYXliZVByZXBhcmUnICYmICFpc1N5bWJvbFRpbGUpIHJldHVybiAxMDAgLSB6b29tO1xuICAgIGlmICh0eXBlID09PSAncGFyc2VUaWxlJyAmJiAhaXNTeW1ib2xUaWxlKSByZXR1cm4gMjAwIC0gem9vbTtcbiAgICBpZiAodHlwZSA9PT0gJ3BhcnNlVGlsZScgJiYgaXNTeW1ib2xUaWxlKSByZXR1cm4gMzAwIC0gem9vbTtcbiAgICBpZiAodHlwZSA9PT0gJ21heWJlUHJlcGFyZScgJiYgaXNTeW1ib2xUaWxlKSByZXR1cm4gNDAwIC0gem9vbTtcbiAgICByZXR1cm4gNTAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBTY2hlZHVsZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2JpbmRBbGwsIGlzV29ya2VyLCBpc1NhZmFyaX0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cuanMnO1xuaW1wb3J0IHtzZXJpYWxpemUsIGRlc2VyaWFsaXplfSBmcm9tICcuL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuaW1wb3J0IFNjaGVkdWxlciBmcm9tICcuL3NjaGVkdWxlci5qcyc7XG5cbmltcG9ydCB0eXBlIHtUcmFuc2ZlcmFibGV9IGZyb20gJy4uL3R5cGVzL3RyYW5zZmVyYWJsZS5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZS5qcyc7XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFtBY3RvciBkZXNpZ24gcGF0dGVybl0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BY3Rvcl9tb2RlbClcbiAqIHRoYXQgbWFpbnRhaW5zIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhc3luY2hyb25vdXMgdGFza3MgYW5kIHRoZSBvYmplY3RzXG4gKiB0aGF0IHNwaW4gdGhlbSBvZmYgLSBpbiB0aGlzIGNhc2UsIHRhc2tzIGxpa2UgcGFyc2luZyBwYXJ0cyBvZiBzdHlsZXMsXG4gKiBvd25lZCBieSB0aGUgc3R5bGVzXG4gKlxuICogQHBhcmFtIHtXZWJXb3JrZXJ9IHRhcmdldFxuICogQHBhcmFtIHtXZWJXb3JrZXJ9IHBhcmVudFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBtYXBJZCBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgTWFwIGluc3RhbmNlIHVzaW5nIHRoaXMgQWN0b3IuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBBY3RvciB7XG4gICAgdGFyZ2V0OiBhbnk7XG4gICAgcGFyZW50OiBhbnk7XG4gICAgbWFwSWQ6ID9udW1iZXI7XG4gICAgY2FsbGJhY2tzOiB7IG51bWJlcjogYW55IH07XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGNhbmNlbENhbGxiYWNrczogeyBudW1iZXI6IENhbmNlbGFibGUgfTtcbiAgICBnbG9iYWxTY29wZTogYW55O1xuICAgIHNjaGVkdWxlcjogU2NoZWR1bGVyO1xuXG4gICAgY29uc3RydWN0b3IodGFyZ2V0OiBhbnksIHBhcmVudDogYW55LCBtYXBJZDogP251bWJlcikge1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMubWFwSWQgPSBtYXBJZDtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgPSB7fTtcbiAgICAgICAgdGhpcy5jYW5jZWxDYWxsYmFja3MgPSB7fTtcbiAgICAgICAgYmluZEFsbChbJ3JlY2VpdmUnXSwgdGhpcyk7XG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnJlY2VpdmUsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5nbG9iYWxTY29wZSA9IGlzV29ya2VyKCkgPyB0YXJnZXQgOiB3aW5kb3c7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gbmV3IFNjaGVkdWxlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZSBmcm9tIGEgbWFpbi10aHJlYWQgbWFwIHRvIGEgV29ya2VyIG9yIGZyb20gYSBXb3JrZXIgYmFjayB0b1xuICAgICAqIGEgbWFpbi10aHJlYWQgbWFwIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIG5hbWUgb2YgdGhlIHRhcmdldCBtZXRob2QgdG8gaW52b2tlIG9yICdbc291cmNlLXR5cGVdLltzb3VyY2UtbmFtZV0ubmFtZScgZm9yIGEgbWV0aG9kIG9uIGEgV29ya2VyU291cmNlLlxuICAgICAqIEBwYXJhbSB0YXJnZXRNYXBJZCBBIHBhcnRpY3VsYXIgbWFwSWQgdG8gd2hpY2ggdG8gc2VuZCB0aGlzIG1lc3NhZ2UuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZW5kKHR5cGU6IHN0cmluZywgZGF0YTogbWl4ZWQsIGNhbGxiYWNrOiA/RnVuY3Rpb24sIHRhcmdldE1hcElkOiA/c3RyaW5nLCBtdXN0UXVldWU6IGJvb2xlYW4gPSBmYWxzZSwgY2FsbGJhY2tNZXRhZGF0YT86IE9iamVjdCk6ID9DYW5jZWxhYmxlIHtcbiAgICAgICAgLy8gV2UncmUgdXNpbmcgYSBzdHJpbmcgSUQgaW5zdGVhZCBvZiBudW1iZXJzIGJlY2F1c2UgdGhleSBhcmUgYmVpbmcgdXNlZCBhcyBvYmplY3Qga2V5c1xuICAgICAgICAvLyBhbnl3YXksIGFuZCB0aHVzIHN0cmluZ2lmaWVkIGltcGxpY2l0bHkuIFdlIHVzZSByYW5kb20gSURzIGJlY2F1c2UgYW4gYWN0b3IgbWF5IHJlY2VpdmVcbiAgICAgICAgLy8gbWVzc2FnZSBmcm9tIG11bHRpcGxlIG90aGVyIGFjdG9ycyB3aGljaCBjb3VsZCBydW4gaW4gZGlmZmVyZW50IGV4ZWN1dGlvbiBjb250ZXh0LiBBXG4gICAgICAgIC8vIGxpbmVhcmx5IGluY3JlYXNpbmcgSUQgY291bGQgcHJvZHVjZSBjb2xsaXNpb25zLlxuICAgICAgICBjb25zdCBpZCA9IE1hdGgucm91bmQoKE1hdGgucmFuZG9tKCkgKiAxZTE4KSkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygwLCAxMCk7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2subWV0YWRhdGEgPSBjYWxsYmFja01ldGFkYXRhO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVyczogP0FycmF5PFRyYW5zZmVyYWJsZT4gPSBpc1NhZmFyaSh0aGlzLmdsb2JhbFNjb3BlKSA/IHVuZGVmaW5lZCA6IFtdO1xuICAgICAgICB0aGlzLnRhcmdldC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBoYXNDYWxsYmFjazogISFjYWxsYmFjayxcbiAgICAgICAgICAgIHRhcmdldE1hcElkLFxuICAgICAgICAgICAgbXVzdFF1ZXVlLFxuICAgICAgICAgICAgc291cmNlTWFwSWQ6IHRoaXMubWFwSWQsXG4gICAgICAgICAgICBkYXRhOiBzZXJpYWxpemUoZGF0YSwgYnVmZmVycylcbiAgICAgICAgfSwgYnVmZmVycyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBjYWxsYmFjayB0byBudWxsIHNvIHRoYXQgaXQgbmV2ZXIgZmlyZXMgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgYWJvcnRlZC5cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy50YXJnZXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJzxjYW5jZWw+JyxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWFwSWQsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU1hcElkOiB0aGlzLm1hcElkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVjZWl2ZShtZXNzYWdlOiBPYmplY3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgICAgIGlkID0gZGF0YS5pZDtcblxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS50YXJnZXRNYXBJZCAmJiB0aGlzLm1hcElkICE9PSBkYXRhLnRhcmdldE1hcElkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnPGNhbmNlbD4nKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9yaWdpbmFsIHJlcXVlc3QgZnJvbSB0aGUgcXVldWUuIFRoaXMgaXMgb25seSBwb3NzaWJsZSBpZiBpdFxuICAgICAgICAgICAgLy8gaGFzbid0IGJlZW4ga2lja2VkIG9mZiB5ZXQuIFRoZSBpZCB3aWxsIHJlbWFpbiBpbiB0aGUgcXVldWUsIGJ1dCBiZWNhdXNlXG4gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIHRhc2ssIGl0IHdpbGwgYmUgZHJvcHBlZCBvbmNlIGl0J3MgdGltZSB0byBleGVjdXRlIGl0LlxuICAgICAgICAgICAgY29uc3QgY2FuY2VsID0gdGhpcy5jYW5jZWxDYWxsYmFja3NbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FuY2VsQ2FsbGJhY2tzW2lkXTtcbiAgICAgICAgICAgIGlmIChjYW5jZWwpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWwuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZGF0YS5tdXN0UXVldWUgfHwgaXNXb3JrZXIoKSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciB3b3JrZXIgdGFza3MgdGhhdCBhcmUgb2Z0ZW4gY2FuY2VsbGVkLCBzdWNoIGFzIGxvYWRUaWxlLCBzdG9yZSB0aGVtIGJlZm9yZSBhY3R1YWxseVxuICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgdGhlbS4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSB3YW50IHRvIGtlZXAgcmVjZWl2aW5nIDxjYW5jZWw+IG1lc3NhZ2VzLlxuICAgICAgICAgICAgICAgIC8vIFNvbWUgdGFza3MgbWF5IHRha2UgYSB3aGlsZSBpbiB0aGUgd29ya2VyIHRocmVhZCwgc28gYmVmb3JlIGV4ZWN1dGluZyB0aGUgbmV4dCB0YXNrXG4gICAgICAgICAgICAgICAgLy8gaW4gb3VyIHF1ZXVlLCBwb3N0TWVzc2FnZSBwcmVlbXB0cyB0aGlzIGFuZCA8Y2FuY2VsPiBtZXNzYWdlcyBjYW4gYmUgcHJvY2Vzc2VkLlxuICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHVzaW5nIGEgTWVzc2FnZUNoYW5uZWwgb2JqZWN0IHRvIGdldCB0aHJvdHRsZSB0aGUgcHJvY2VzcygpIGZsb3cgdG8gb25lIGF0IGEgdGltZS5cbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2lkXTtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IChjYWxsYmFjayAmJiBjYWxsYmFjay5tZXRhZGF0YSkgfHwge3R5cGU6IFwibWVzc2FnZVwifTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbENhbGxiYWNrc1tpZF0gPSB0aGlzLnNjaGVkdWxlci5hZGQoKCkgPT4gdGhpcy5wcm9jZXNzVGFzayhpZCwgZGF0YSksIG1ldGFkYXRhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIG1haW4gdGhyZWFkLCBwcm9jZXNzIG1lc3NhZ2VzIGltbWVkaWF0ZWx5IHNvIHRoYXQgb3RoZXIgd29yayBkb2VzIG5vdCBzbGlwIGluXG4gICAgICAgICAgICAgICAgLy8gYmV0d2VlbiBnZXR0aW5nIHBhcnRpYWwgZGF0YSBiYWNrIGZyb20gd29ya2Vycy5cbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NUYXNrKGlkLCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3NUYXNrKGlkOiBudW1iZXIsIHRhc2s6IGFueSkge1xuICAgICAgICBpZiAodGFzay50eXBlID09PSAnPHJlc3BvbnNlPicpIHtcbiAgICAgICAgICAgIC8vIFRoZSBkb25lKCkgZnVuY3Rpb24gaW4gdGhlIGNvdW50ZXJwYXJ0IGhhcyBiZWVuIGNhbGxlZCwgYW5kIHdlIGFyZSBub3dcbiAgICAgICAgICAgIC8vIGZpcmluZyB0aGUgY2FsbGJhY2sgaW4gdGhlIG9yaWdpbmF0aW5nIGFjdG9yLCBpZiB0aGVyZSBpcyBvbmUuXG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2lkXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tpZF07XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgYSByZXNwb25zZSwgYnV0IGRvbid0IGhhdmUgYSBjYWxsYmFjaywgdGhlIHJlcXVlc3Qgd2FzIGNhbmNlbGVkLlxuICAgICAgICAgICAgICAgIGlmICh0YXNrLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRlc2VyaWFsaXplKHRhc2suZXJyb3IpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkZXNlcmlhbGl6ZSh0YXNrLmRhdGEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBidWZmZXJzOiA/QXJyYXk8VHJhbnNmZXJhYmxlPiA9IGlzU2FmYXJpKHRoaXMuZ2xvYmFsU2NvcGUpID8gdW5kZWZpbmVkIDogW107XG4gICAgICAgICAgICBjb25zdCBkb25lID0gdGFzay5oYXNDYWxsYmFjayA/IChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jYW5jZWxDYWxsYmFja3NbaWRdO1xuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICc8cmVzcG9uc2U+JyxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTWFwSWQ6IHRoaXMubWFwSWQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgPyBzZXJpYWxpemUoZXJyKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHNlcmlhbGl6ZShkYXRhLCBidWZmZXJzKVxuICAgICAgICAgICAgICAgIH0sIGJ1ZmZlcnMpO1xuICAgICAgICAgICAgfSA6IChfKSA9PiB7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSAoZGVzZXJpYWxpemUodGFzay5kYXRhKTogYW55KTtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFt0YXNrLnR5cGVdKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFzay50eXBlID09ICdsb2FkVGlsZScsICdyZW1vdmVUaWxlJywgZXRjLlxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50W3Rhc2sudHlwZV0odGFzay5zb3VyY2VNYXBJZCwgcGFyYW1zLCBkb25lKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wYXJlbnQuZ2V0V29ya2VyU291cmNlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFzay50eXBlID09IHNvdXJjZXR5cGUubWV0aG9kXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IHRhc2sudHlwZS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlID0gKHRoaXMucGFyZW50OiBhbnkpLmdldFdvcmtlclNvdXJjZSh0YXNrLnNvdXJjZU1hcElkLCBrZXlzWzBdLCBwYXJhbXMuc291cmNlKTtcbiAgICAgICAgICAgICAgICBzY29wZVtrZXlzWzFdXShwYXJhbXMsIGRvbmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBObyBmdW5jdGlvbiB3YXMgZm91bmQuXG4gICAgICAgICAgICAgICAgZG9uZShuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGZ1bmN0aW9uICR7dGFzay50eXBlfWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnJlY2VpdmUsIGZhbHNlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFjdG9yO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHttYXQyfSBmcm9tICdnbC1tYXRyaXgnO1xuXG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50LmpzJztcblxuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZVRyYW5zZm9ybX0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgcGl4ZWwgdmFsdWUgYXQgYSB0aGUgZ2l2ZW4gem9vbSBsZXZlbCB0byB0aWxlIHVuaXRzLlxuICpcbiAqIFRoZSBzaGFkZXJzIG1vc3RseSBjYWxjdWxhdGUgZXZlcnl0aGluZyBpbiB0aWxlIHVuaXRzIHNvIHN0eWxlXG4gKiBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgY29udmVydGVkIGZyb20gcGl4ZWxzIHRvIHRpbGUgdW5pdHMgdXNpbmcgdGhpcy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgYSB0cmFuc2xhdGlvbiBieSAzMCBwaXhlbHMgYXQgem9vbSA2LjUgd2lsbCBiZSBhXG4gKiB0cmFuc2xhdGlvbiBieSBwaXhlbHNUb1RpbGVVbml0cygzMCwgNi41KSB0aWxlIHVuaXRzLlxuICpcbiAqIEByZXR1cm5zIHZhbHVlIGluIHRpbGUgdW5pdHNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRpbGU6IHt0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHRpbGVTaXplOiBudW1iZXJ9LCBwaXhlbFZhbHVlOiBudW1iZXIsIHo6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHBpeGVsVmFsdWUgKiAoRVhURU5UIC8gKHRpbGUudGlsZVNpemUgKiBNYXRoLnBvdygyLCB6IC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQaXhlbHNUb1RpbGVVbml0c01hdHJpeCh0aWxlOiB7dGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB0aWxlU2l6ZTogbnVtYmVyLCArdGlsZVRyYW5zZm9ybTogVGlsZVRyYW5zZm9ybX0sIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogRmxvYXQzMkFycmF5IHtcbiAgICBjb25zdCB7c2NhbGV9ID0gdGlsZS50aWxlVHJhbnNmb3JtO1xuICAgIGNvbnN0IHMgPSBzY2FsZSAqIEVYVEVOVCAvICh0aWxlLnRpbGVTaXplICogTWF0aC5wb3coMiwgdHJhbnNmb3JtLnpvb20gLSB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiArIHRpbGUudGlsZUlELmNhbm9uaWNhbC56KSk7XG4gICAgcmV0dXJuIG1hdDIuc2NhbGUobmV3IEZsb2F0MzJBcnJheSg0KSwgdHJhbnNmb3JtLmludmVyc2VBZGp1c3RtZW50TWF0cml4LCBbcywgc10pO1xufVxuIiwiZXhwb3J0IHsgZ2V0VVJMLCBnZXRUaWxlQkJveCwgZ2V0TWVyY0Nvb3JkcyB9O1xuXG5cbi8qKlxuICogZ2V0VVJMXG4gKlxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBiYXNlVXJsICBCYXNlIHVybCBvZiB0aGUgV01TIHNlcnZlclxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBsYXllciAgICBMYXllciBuYW1lXG4gKiBAcGFyYW0gICAge051bWJlcn0gIHggICAgICAgIFRpbGUgY29vcmRpbmF0ZSB4XG4gKiBAcGFyYW0gICAge051bWJlcn0gIHkgICAgICAgIFRpbGUgY29vcmRpbmF0ZSB5XG4gKiBAcGFyYW0gICAge051bWJlcn0gIHogICAgICAgIFRpbGUgem9vbVxuICogQHBhcmFtICAgIHtPYmplY3R9ICBbb3B0aW9uc11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMuZm9ybWF0PSdpbWFnZS9wbmcnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5zZXJ2aWNlPSdXTVMnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy52ZXJzaW9uPScxLjEuMSddXG4gKiBAcGFyYW0gICAge1N0cmluZ30gIFtvcHRpb25zLnJlcXVlc3Q9J0dldE1hcCddXG4gKiBAcGFyYW0gICAge1N0cmluZ30gIFtvcHRpb25zLnNycz0nRVBTRzozODU3J11cbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgW29wdGlvbnMud2lkdGg9JzI1NiddXG4gKiBAcGFyYW0gICAge051bWJlcn0gIFtvcHRpb25zLmhlaWdodD0nMjU2J11cbiAqIEByZXR1cm5zICB7U3RyaW5nfSAgdXJsXG4gKiBAZXhhbXBsZVxuICogdmFyIGJhc2VVcmwgPSAnaHR0cDovL2dlb2RhdGEuc3RhdGUubmoudXMvaW1hZ2VyeXdtcy9OYXR1cmFsMjAxNSc7XG4gKiB2YXIgbGF5ZXIgPSAnTmF0dXJhbDIwMTUnO1xuICogdmFyIHVybCA9IHdob290cy5nZXRVUkwoYmFzZVVybCwgbGF5ZXIsIDE1NDMwOCwgMTk3MTY3LCAxOSk7XG4gKi9cbmZ1bmN0aW9uIGdldFVSTChiYXNlVXJsLCBsYXllciwgeCwgeSwgeiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgdmFyIHVybCA9IGJhc2VVcmwgKyAnPycgKyBbXG4gICAgICAgICdiYm94PScgICAgKyBnZXRUaWxlQkJveCh4LCB5LCB6KSxcbiAgICAgICAgJ2Zvcm1hdD0nICArIChvcHRpb25zLmZvcm1hdCB8fCAnaW1hZ2UvcG5nJyksXG4gICAgICAgICdzZXJ2aWNlPScgKyAob3B0aW9ucy5zZXJ2aWNlIHx8ICdXTVMnKSxcbiAgICAgICAgJ3ZlcnNpb249JyArIChvcHRpb25zLnZlcnNpb24gfHwgJzEuMS4xJyksXG4gICAgICAgICdyZXF1ZXN0PScgKyAob3B0aW9ucy5yZXF1ZXN0IHx8ICdHZXRNYXAnKSxcbiAgICAgICAgJ3Nycz0nICAgICArIChvcHRpb25zLnNycyB8fCAnRVBTRzozODU3JyksXG4gICAgICAgICd3aWR0aD0nICAgKyAob3B0aW9ucy53aWR0aCB8fCAyNTYpLFxuICAgICAgICAnaGVpZ2h0PScgICsgKG9wdGlvbnMuaGVpZ2h0IHx8IDI1NiksXG4gICAgICAgICdsYXllcnM9JyAgKyBsYXllclxuICAgIF0uam9pbignJicpO1xuXG4gICAgcmV0dXJuIHVybDtcbn1cblxuXG4vKipcbiAqIGdldFRpbGVCQm94XG4gKlxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB4ICBUaWxlIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICBUaWxlIGNvb3JkaW5hdGUgeVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB6ICBUaWxlIHpvb21cbiAqIEByZXR1cm5zICB7U3RyaW5nfSAgU3RyaW5nIG9mIHRoZSBib3VuZGluZyBib3hcbiAqL1xuZnVuY3Rpb24gZ2V0VGlsZUJCb3goeCwgeSwgeikge1xuICAgIC8vIGZvciBHb29nbGUvT1NNIHRpbGUgc2NoZW1lIHdlIG5lZWQgdG8gYWx0ZXIgdGhlIHlcbiAgICB5ID0gKE1hdGgucG93KDIsIHopIC0geSAtIDEpO1xuXG4gICAgdmFyIG1pbiA9IGdldE1lcmNDb29yZHMoeCAqIDI1NiwgeSAqIDI1NiwgeiksXG4gICAgICAgIG1heCA9IGdldE1lcmNDb29yZHMoKHggKyAxKSAqIDI1NiwgKHkgKyAxKSAqIDI1Niwgeik7XG5cbiAgICByZXR1cm4gbWluWzBdICsgJywnICsgbWluWzFdICsgJywnICsgbWF4WzBdICsgJywnICsgbWF4WzFdO1xufVxuXG5cbi8qKlxuICogZ2V0TWVyY0Nvb3Jkc1xuICpcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeCAgUGl4ZWwgY29vcmRpbmF0ZSB4XG4gKiBAcGFyYW0gICAge051bWJlcn0gIHkgIFBpeGVsIGNvb3JkaW5hdGUgeVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB6ICBUaWxlIHpvb21cbiAqIEByZXR1cm5zICB7QXJyYXl9ICAgW3gsIHldXG4gKi9cbmZ1bmN0aW9uIGdldE1lcmNDb29yZHMoeCwgeSwgeikge1xuICAgIHZhciByZXNvbHV0aW9uID0gKDIgKiBNYXRoLlBJICogNjM3ODEzNyAvIDI1NikgLyBNYXRoLnBvdygyLCB6KSxcbiAgICAgICAgbWVyY194ID0gKHggKiByZXNvbHV0aW9uIC0gMiAqIE1hdGguUEkgICogNjM3ODEzNyAvIDIuMCksXG4gICAgICAgIG1lcmNfeSA9ICh5ICogcmVzb2x1dGlvbiAtIDIgKiBNYXRoLlBJICAqIDYzNzgxMzcgLyAyLjApO1xuXG4gICAgcmV0dXJuIFttZXJjX3gsIG1lcmNfeV07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2dldFRpbGVCQm94fSBmcm9tICdAbWFwYm94L3dob290cy1qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgQ2Fub25pY2FsVGlsZUlEIHtcbiAgICB6OiBudW1iZXI7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICBrZXk6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgYXNzZXJ0KHogPj0gMCAmJiB6IDw9IDI1KTtcbiAgICAgICAgYXNzZXJ0KHggPj0gMCAmJiB4IDwgTWF0aC5wb3coMiwgeikpO1xuICAgICAgICBhc3NlcnQoeSA+PSAwICYmIHkgPCBNYXRoLnBvdygyLCB6KSk7XG4gICAgICAgIHRoaXMueiA9IHo7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHRoaXMua2V5ID0gY2FsY3VsYXRlS2V5KDAsIHosIHosIHgsIHkpO1xuICAgIH1cblxuICAgIGVxdWFscyhpZDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnogPT09IGlkLnogJiYgdGhpcy54ID09PSBpZC54ICYmIHRoaXMueSA9PT0gaWQueTtcbiAgICB9XG5cbiAgICAvLyBnaXZlbiBhIGxpc3Qgb2YgdXJscywgY2hvb3NlIGEgdXJsIHRlbXBsYXRlIGFuZCByZXR1cm4gYSB0aWxlIFVSTFxuICAgIHVybCh1cmxzOiBBcnJheTxzdHJpbmc+LCBzY2hlbWU6ID9zdHJpbmcpIHtcbiAgICAgICAgY29uc3QgYmJveCA9IGdldFRpbGVCQm94KHRoaXMueCwgdGhpcy55LCB0aGlzLnopO1xuICAgICAgICBjb25zdCBxdWFka2V5ID0gZ2V0UXVhZGtleSh0aGlzLnosIHRoaXMueCwgdGhpcy55KTtcblxuICAgICAgICByZXR1cm4gdXJsc1sodGhpcy54ICsgdGhpcy55KSAlIHVybHMubGVuZ3RoXVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3twcmVmaXh9JywgKHRoaXMueCAlIDE2KS50b1N0cmluZygxNikgKyAodGhpcy55ICUgMTYpLnRvU3RyaW5nKDE2KSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7en0nLCBTdHJpbmcodGhpcy56KSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7eH0nLCBTdHJpbmcodGhpcy54KSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7eX0nLCBTdHJpbmcoc2NoZW1lID09PSAndG1zJyA/IChNYXRoLnBvdygyLCB0aGlzLnopIC0gdGhpcy55IC0gMSkgOiB0aGlzLnkpKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3txdWFka2V5fScsIHF1YWRrZXkpXG4gICAgICAgICAgICAucmVwbGFjZSgne2Jib3gtZXBzZy0zODU3fScsIGJib3gpO1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy56fS8ke3RoaXMueH0vJHt0aGlzLnl9YDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbndyYXBwZWRUaWxlSUQge1xuICAgIHdyYXA6IG51bWJlcjtcbiAgICBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRDtcbiAgICBrZXk6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHdyYXA6IG51bWJlciwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICAgICAgdGhpcy53cmFwID0gd3JhcDtcbiAgICAgICAgdGhpcy5jYW5vbmljYWwgPSBjYW5vbmljYWw7XG4gICAgICAgIHRoaXMua2V5ID0gY2FsY3VsYXRlS2V5KHdyYXAsIGNhbm9uaWNhbC56LCBjYW5vbmljYWwueiwgY2Fub25pY2FsLngsIGNhbm9uaWNhbC55KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdmVyc2NhbGVkVGlsZUlEIHtcbiAgICBvdmVyc2NhbGVkWjogbnVtYmVyO1xuICAgIHdyYXA6IG51bWJlcjtcbiAgICBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRDtcbiAgICBrZXk6IG51bWJlcjtcbiAgICBwcm9qTWF0cml4OiBGbG9hdDMyQXJyYXk7XG5cbiAgICBjb25zdHJ1Y3RvcihvdmVyc2NhbGVkWjogbnVtYmVyLCB3cmFwOiBudW1iZXIsIHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgYXNzZXJ0KG92ZXJzY2FsZWRaID49IHopO1xuICAgICAgICB0aGlzLm92ZXJzY2FsZWRaID0gb3ZlcnNjYWxlZFo7XG4gICAgICAgIHRoaXMud3JhcCA9IHdyYXA7XG4gICAgICAgIHRoaXMuY2Fub25pY2FsID0gbmV3IENhbm9uaWNhbFRpbGVJRCh6LCAreCwgK3kpO1xuICAgICAgICB0aGlzLmtleSA9IHdyYXAgPT09IDAgJiYgb3ZlcnNjYWxlZFogPT09IHogPyB0aGlzLmNhbm9uaWNhbC5rZXkgOiBjYWxjdWxhdGVLZXkod3JhcCwgb3ZlcnNjYWxlZFosIHosIHgsIHkpO1xuICAgIH1cblxuICAgIGVxdWFscyhpZDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdmVyc2NhbGVkWiA9PT0gaWQub3ZlcnNjYWxlZFogJiYgdGhpcy53cmFwID09PSBpZC53cmFwICYmIHRoaXMuY2Fub25pY2FsLmVxdWFscyhpZC5jYW5vbmljYWwpO1xuICAgIH1cblxuICAgIHNjYWxlZFRvKHRhcmdldFo6IG51bWJlcikge1xuICAgICAgICBhc3NlcnQodGFyZ2V0WiA8PSB0aGlzLm92ZXJzY2FsZWRaKTtcbiAgICAgICAgY29uc3QgekRpZmZlcmVuY2UgPSB0aGlzLmNhbm9uaWNhbC56IC0gdGFyZ2V0WjtcbiAgICAgICAgaWYgKHRhcmdldFogPiB0aGlzLmNhbm9uaWNhbC56KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJzY2FsZWRUaWxlSUQodGFyZ2V0WiwgdGhpcy53cmFwLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0YXJnZXRaLCB0aGlzLndyYXAsIHRhcmdldFosIHRoaXMuY2Fub25pY2FsLnggPj4gekRpZmZlcmVuY2UsIHRoaXMuY2Fub25pY2FsLnkgPj4gekRpZmZlcmVuY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBjYWxjdWxhdGVTY2FsZWRLZXkgaXMgYW4gb3B0aW1pemF0aW9uOlxuICAgICAqIHdoZW4gd2l0aFdyYXAgPT0gdHJ1ZSwgaW1wbGVtZW50cyB0aGUgc2FtZSBhcyB0aGlzLnNjYWxlZFRvKHopLmtleSxcbiAgICAgKiB3aGVuIHdpdGhXcmFwID09IGZhbHNlLCBpbXBsZW1lbnRzIHRoZSBzYW1lIGFzIHRoaXMuc2NhbGVkVG8oeikud3JhcHBlZCgpLmtleS5cbiAgICAgKi9cbiAgICBjYWxjdWxhdGVTY2FsZWRLZXkodGFyZ2V0WjogbnVtYmVyLCB3aXRoV3JhcDogYm9vbGVhbiA9IHRydWUpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5vdmVyc2NhbGVkWiA9PT0gdGFyZ2V0WiAmJiB3aXRoV3JhcCkgcmV0dXJuIHRoaXMua2V5O1xuICAgICAgICBpZiAodGFyZ2V0WiA+IHRoaXMuY2Fub25pY2FsLnopIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxjdWxhdGVLZXkodGhpcy53cmFwICogK3dpdGhXcmFwLCB0YXJnZXRaLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHpEaWZmZXJlbmNlID0gdGhpcy5jYW5vbmljYWwueiAtIHRhcmdldFo7XG4gICAgICAgICAgICByZXR1cm4gY2FsY3VsYXRlS2V5KHRoaXMud3JhcCAqICt3aXRoV3JhcCwgdGFyZ2V0WiwgdGFyZ2V0WiwgdGhpcy5jYW5vbmljYWwueCA+PiB6RGlmZmVyZW5jZSwgdGhpcy5jYW5vbmljYWwueSA+PiB6RGlmZmVyZW5jZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0NoaWxkT2YocGFyZW50OiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIGlmIChwYXJlbnQud3JhcCAhPT0gdGhpcy53cmFwKSB7XG4gICAgICAgICAgICAvLyBXZSBjYW4ndCBiZSBhIGNoaWxkIGlmIHdlJ3JlIGluIGEgZGlmZmVyZW50IHdvcmxkIGNvcHlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6RGlmZmVyZW5jZSA9IHRoaXMuY2Fub25pY2FsLnogLSBwYXJlbnQuY2Fub25pY2FsLno7XG4gICAgICAgIC8vIFdlJ3JlIGZpcnN0IHRlc3RpbmcgZm9yIHogPT0gMCwgdG8gYXZvaWQgYSAzMiBiaXQgc2hpZnQsIHdoaWNoIGlzIHVuZGVmaW5lZC5cbiAgICAgICAgcmV0dXJuIHBhcmVudC5vdmVyc2NhbGVkWiA9PT0gMCB8fCAoXG4gICAgICAgICAgICBwYXJlbnQub3ZlcnNjYWxlZFogPCB0aGlzLm92ZXJzY2FsZWRaICYmXG4gICAgICAgICAgICAgICAgcGFyZW50LmNhbm9uaWNhbC54ID09PSAodGhpcy5jYW5vbmljYWwueCA+PiB6RGlmZmVyZW5jZSkgJiZcbiAgICAgICAgICAgICAgICBwYXJlbnQuY2Fub25pY2FsLnkgPT09ICh0aGlzLmNhbm9uaWNhbC55ID4+IHpEaWZmZXJlbmNlKSk7XG4gICAgfVxuXG4gICAgY2hpbGRyZW4oc291cmNlTWF4Wm9vbTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLm92ZXJzY2FsZWRaID49IHNvdXJjZU1heFpvb20pIHtcbiAgICAgICAgICAgIC8vIHJldHVybiBhIHNpbmdsZSB0aWxlIGNvb3JkIHJlcHJlc2VudGluZyBhIGFuIG92ZXJzY2FsZWQgdGlsZVxuICAgICAgICAgICAgcmV0dXJuIFtuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aGlzLm92ZXJzY2FsZWRaICsgMSwgdGhpcy53cmFwLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55KV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB6ID0gdGhpcy5jYW5vbmljYWwueiArIDE7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLmNhbm9uaWNhbC54ICogMjtcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuY2Fub25pY2FsLnkgKiAyO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IE92ZXJzY2FsZWRUaWxlSUQoeiwgdGhpcy53cmFwLCB6LCB4LCB5KSxcbiAgICAgICAgICAgIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHosIHRoaXMud3JhcCwgeiwgeCArIDEsIHkpLFxuICAgICAgICAgICAgbmV3IE92ZXJzY2FsZWRUaWxlSUQoeiwgdGhpcy53cmFwLCB6LCB4LCB5ICsgMSksXG4gICAgICAgICAgICBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB0aGlzLndyYXAsIHosIHggKyAxLCB5ICsgMSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBpc0xlc3NUaGFuKHJoczogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgICAgICBpZiAodGhpcy53cmFwIDwgcmhzLndyYXApIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy53cmFwID4gcmhzLndyYXApIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5vdmVyc2NhbGVkWiA8IHJocy5vdmVyc2NhbGVkWikgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLm92ZXJzY2FsZWRaID4gcmhzLm92ZXJzY2FsZWRaKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuY2Fub25pY2FsLnggPCByaHMuY2Fub25pY2FsLngpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy5jYW5vbmljYWwueCA+IHJocy5jYW5vbmljYWwueCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLmNhbm9uaWNhbC55IDwgcmhzLmNhbm9uaWNhbC55KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHdyYXBwZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aGlzLm92ZXJzY2FsZWRaLCAwLCB0aGlzLmNhbm9uaWNhbC56LCB0aGlzLmNhbm9uaWNhbC54LCB0aGlzLmNhbm9uaWNhbC55KTtcbiAgICB9XG5cbiAgICB1bndyYXBUbyh3cmFwOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHRoaXMub3ZlcnNjYWxlZFosIHdyYXAsIHRoaXMuY2Fub25pY2FsLnosIHRoaXMuY2Fub25pY2FsLngsIHRoaXMuY2Fub25pY2FsLnkpO1xuICAgIH1cblxuICAgIG92ZXJzY2FsZUZhY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDIsIHRoaXMub3ZlcnNjYWxlZFogLSB0aGlzLmNhbm9uaWNhbC56KTtcbiAgICB9XG5cbiAgICB0b1Vud3JhcHBlZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVbndyYXBwZWRUaWxlSUQodGhpcy53cmFwLCB0aGlzLmNhbm9uaWNhbCk7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLm92ZXJzY2FsZWRafS8ke3RoaXMuY2Fub25pY2FsLnh9LyR7dGhpcy5jYW5vbmljYWwueX1gO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlS2V5KHdyYXA6IG51bWJlciwgb3ZlcnNjYWxlZFo6IG51bWJlciwgejogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gb25seSB1c2UgMjIgYml0cyBmb3IgeCAmIHkgc28gdGhhdCB0aGUga2V5IGZpdHMgaW50byBNQVhfU0FGRV9JTlRFR0VSXG4gICAgY29uc3QgZGltID0gMSA8PCBNYXRoLm1pbih6LCAyMik7XG4gICAgbGV0IHh5ID0gZGltICogKHkgJSBkaW0pICsgKHggJSBkaW0pO1xuXG4gICAgLy8gemlnemFnLWVuY29kZSB3cmFwIGlmIHdlIGhhdmUgdGhlIHJvb20gZm9yIGl0XG4gICAgaWYgKHdyYXAgJiYgeiA8IDIyKSB7XG4gICAgICAgIGNvbnN0IGJpdHNBdmFpbGFibGUgPSAyICogKDIyIC0geik7XG4gICAgICAgIHh5ICs9IGRpbSAqIGRpbSAqICgod3JhcCA8IDAgPyAtMiAqIHdyYXAgLSAxIDogMiAqIHdyYXApICUgKDEgPDwgYml0c0F2YWlsYWJsZSkpO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSB6IGludG8gNSBiaXRzICgyNCBtYXgpIGFuZCBvdmVyc2NhbGVkWiBpbnRvIDQgYml0cyAoMTAgbWF4KVxuICAgIGNvbnN0IGtleSA9ICgoeHkgKiAzMikgKyB6KSAqIDE2ICsgKG92ZXJzY2FsZWRaIC0geik7XG4gICAgYXNzZXJ0KGtleSA+PSAwICYmIGtleSA8PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XG5cbiAgICByZXR1cm4ga2V5O1xufVxuXG5mdW5jdGlvbiBnZXRRdWFka2V5KHosIHgsIHkpIHtcbiAgICBsZXQgcXVhZGtleSA9ICcnLCBtYXNrO1xuICAgIGZvciAobGV0IGkgPSB6OyBpID4gMDsgaS0tKSB7XG4gICAgICAgIG1hc2sgPSAxIDw8IChpIC0gMSk7XG4gICAgICAgIHF1YWRrZXkgKz0gKCh4ICYgbWFzayA/IDEgOiAwKSArICh5ICYgbWFzayA/IDIgOiAwKSk7XG4gICAgfVxuICAgIHJldHVybiBxdWFka2V5O1xufVxuXG5yZWdpc3RlcignQ2Fub25pY2FsVGlsZUlEJywgQ2Fub25pY2FsVGlsZUlEKTtcbnJlZ2lzdGVyKCdPdmVyc2NhbGVkVGlsZUlEJywgT3ZlcnNjYWxlZFRpbGVJRCwge29taXQ6IFsncHJvak1hdHJpeCddfSk7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7U3RydWN0QXJyYXl9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcbmltcG9ydCB0eXBlIHtUcmlhbmdsZUluZGV4QXJyYXksIExpbmVJbmRleEFycmF5LCBMaW5lU3RyaXBJbmRleEFycmF5fSBmcm9tICcuLi9kYXRhL2luZGV4X2FycmF5X3R5cGUuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcblxuY2xhc3MgSW5kZXhCdWZmZXIge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgYnVmZmVyOiBXZWJHTEJ1ZmZlcjtcbiAgICBkeW5hbWljRHJhdzogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXkgfCBMaW5lSW5kZXhBcnJheSB8IExpbmVTdHJpcEluZGV4QXJyYXksIGR5bmFtaWNEcmF3PzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZHluYW1pY0RyYXcgPSBCb29sZWFuKGR5bmFtaWNEcmF3KTtcblxuICAgICAgICAvLyBUaGUgYm91bmQgaW5kZXggYnVmZmVyIGlzIHBhcnQgb2YgdmVydGV4IGFycmF5IG9iamVjdCBzdGF0ZS4gV2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBtb2RpZnkgd2hhdGV2ZXIgVkFPIGhhcHBlbnMgdG8gYmUgY3VycmVudGx5IGJvdW5kLCBzbyBtYWtlIHN1cmUgdGhlIGRlZmF1bHRcbiAgICAgICAgLy8gdmVydGV4IGFycmF5IHByb3ZpZGVkIGJ5IHRoZSBjb250ZXh0IGlzIGJvdW5kIGluc3RlYWQuXG4gICAgICAgIHRoaXMuY29udGV4dC51bmJpbmRWQU8oKTtcblxuICAgICAgICBjb250ZXh0LmJpbmRFbGVtZW50QnVmZmVyLnNldCh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGFycmF5LmFycmF5QnVmZmVyLCB0aGlzLmR5bmFtaWNEcmF3ID8gZ2wuRFlOQU1JQ19EUkFXIDogZ2wuU1RBVElDX0RSQVcpO1xuXG4gICAgICAgIGlmICghdGhpcy5keW5hbWljRHJhdykge1xuICAgICAgICAgICAgZGVsZXRlIGFycmF5LmFycmF5QnVmZmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZCgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRFbGVtZW50QnVmZmVyLnNldCh0aGlzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YShhcnJheTogU3RydWN0QXJyYXkpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGFzc2VydCh0aGlzLmR5bmFtaWNEcmF3KTtcbiAgICAgICAgLy8gVGhlIHJpZ2h0IFZBTyB3aWxsIGdldCB0aGlzIGJ1ZmZlciByZS1ib3VuZCBsYXRlciBpbiBWZXJ0ZXhBcnJheU9iamVjdCNiaW5kXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNTYyMFxuICAgICAgICB0aGlzLmNvbnRleHQudW5iaW5kVkFPKCk7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCAwLCBhcnJheS5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW5kZXhCdWZmZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBTdHJ1Y3RBcnJheSxcbiAgICBTdHJ1Y3RBcnJheU1lbWJlclxufSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmltcG9ydCB0eXBlIFByb2dyYW0gZnJvbSAnLi4vcmVuZGVyL3Byb2dyYW0uanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcblxuLyoqXG4gKiBAZW51bSB7c3RyaW5nfSBBdHRyaWJ1dGVUeXBlXG4gKiBAcHJpdmF0ZVxuICogQHJlYWRvbmx5XG4gKi9cbmNvbnN0IEF0dHJpYnV0ZVR5cGUgPSB7XG4gICAgSW50ODogICAnQllURScsXG4gICAgVWludDg6ICAnVU5TSUdORURfQllURScsXG4gICAgSW50MTY6ICAnU0hPUlQnLFxuICAgIFVpbnQxNjogJ1VOU0lHTkVEX1NIT1JUJyxcbiAgICBJbnQzMjogICdJTlQnLFxuICAgIFVpbnQzMjogJ1VOU0lHTkVEX0lOVCcsXG4gICAgRmxvYXQzMjogJ0ZMT0FUJ1xufTtcblxuLyoqXG4gKiBUaGUgYFZlcnRleEJ1ZmZlcmAgY2xhc3MgdHVybnMgYSBgU3RydWN0QXJyYXlgIGludG8gYSBXZWJHTCBidWZmZXIuIEVhY2ggbWVtYmVyIG9mIHRoZSBTdHJ1Y3RBcnJheSdzXG4gKiBTdHJ1Y3QgdHlwZSBpcyBjb252ZXJ0ZWQgdG8gYSBXZWJHTCBhdHJpYnV0ZS5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFZlcnRleEJ1ZmZlciB7XG4gICAgbGVuZ3RoOiBudW1iZXI7XG4gICAgYXR0cmlidXRlczogJFJlYWRPbmx5QXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuICAgIGl0ZW1TaXplOiBudW1iZXI7XG4gICAgZHluYW1pY0RyYXc6ID9ib29sZWFuO1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgYnVmZmVyOiBXZWJHTEJ1ZmZlcjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBkeW5hbWljRHJhdyBXaGV0aGVyIHRoaXMgYnVmZmVyIHdpbGwgYmUgcmVwZWF0ZWRseSB1cGRhdGVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgYXJyYXk6IFN0cnVjdEFycmF5LCBhdHRyaWJ1dGVzOiAkUmVhZE9ubHlBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj4sIGR5bmFtaWNEcmF3PzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICAgICAgdGhpcy5pdGVtU2l6ZSA9IGFycmF5LmJ5dGVzUGVyRWxlbWVudDtcbiAgICAgICAgdGhpcy5keW5hbWljRHJhdyA9IGR5bmFtaWNEcmF3O1xuXG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5idWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgY29udGV4dC5iaW5kVmVydGV4QnVmZmVyLnNldCh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBhcnJheS5hcnJheUJ1ZmZlciwgdGhpcy5keW5hbWljRHJhdyA/IGdsLkRZTkFNSUNfRFJBVyA6IGdsLlNUQVRJQ19EUkFXKTtcblxuICAgICAgICBpZiAoIXRoaXMuZHluYW1pY0RyYXcpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBhcnJheS5hcnJheUJ1ZmZlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kVmVydGV4QnVmZmVyLnNldCh0aGlzLmJ1ZmZlcik7XG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YShhcnJheTogU3RydWN0QXJyYXkpIHtcbiAgICAgICAgYXNzZXJ0KGFycmF5Lmxlbmd0aCA9PT0gdGhpcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5iaW5kKCk7XG4gICAgICAgIGdsLmJ1ZmZlclN1YkRhdGEoZ2wuQVJSQVlfQlVGRkVSLCAwLCBhcnJheS5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW5hYmxlQXR0cmlidXRlcyhnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwcm9ncmFtOiBQcm9ncmFtPCo+KSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBtZW1iZXIgPSB0aGlzLmF0dHJpYnV0ZXNbal07XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJJbmRleDogbnVtYmVyIHwgdm9pZCA9IHByb2dyYW0uYXR0cmlidXRlc1ttZW1iZXIubmFtZV07XG4gICAgICAgICAgICBpZiAoYXR0cmliSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGF0dHJpYkluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgYXR0cmlidXRlIHBvaW50ZXJzIGluIGEgV2ViR0wgY29udGV4dC5cbiAgICAgKiBAcGFyYW0gZ2wgVGhlIFdlYkdMIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHByb2dyYW0gVGhlIGFjdGl2ZSBXZWJHTCBwcm9ncmFtLlxuICAgICAqIEBwYXJhbSB2ZXJ0ZXhPZmZzZXQgSW5kZXggb2YgdGhlIHN0YXJ0aW5nIHZlcnRleCBvZiB0aGUgc2VnbWVudC5cbiAgICAgKi9cbiAgICBzZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwcm9ncmFtOiBQcm9ncmFtPCo+LCB2ZXJ0ZXhPZmZzZXQ6ID9udW1iZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlciA9IHRoaXMuYXR0cmlidXRlc1tqXTtcbiAgICAgICAgICAgIGNvbnN0IGF0dHJpYkluZGV4OiBudW1iZXIgfCB2b2lkID0gcHJvZ3JhbS5hdHRyaWJ1dGVzW21lbWJlci5uYW1lXTtcblxuICAgICAgICAgICAgaWYgKGF0dHJpYkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyLmNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgICAgIChnbDogYW55KVtBdHRyaWJ1dGVUeXBlW21lbWJlci50eXBlXV0sXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1TaXplLFxuICAgICAgICAgICAgICAgICAgICBtZW1iZXIub2Zmc2V0ICsgKHRoaXMuaXRlbVNpemUgKiAodmVydGV4T2Zmc2V0IHx8IDApKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSBHTCBidWZmZXIgYm91bmQgdG8gdGhlIGdpdmVuIFdlYkdMIGNvbnRleHQuXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgZ2wuZGVsZXRlQnVmZmVyKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJ1ZmZlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVydGV4QnVmZmVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgICBCbGVuZEZ1bmNUeXBlLFxuICAgIEJsZW5kRXF1YXRpb25UeXBlLFxuICAgIENvbG9yTWFza1R5cGUsXG4gICAgRGVwdGhSYW5nZVR5cGUsXG4gICAgRGVwdGhNYXNrVHlwZSxcbiAgICBTdGVuY2lsRnVuY1R5cGUsXG4gICAgU3RlbmNpbE9wVHlwZSxcbiAgICBEZXB0aEZ1bmNUeXBlLFxuICAgIFRleHR1cmVVbml0VHlwZSxcbiAgICBWaWV3cG9ydFR5cGUsXG4gICAgQ3VsbEZhY2VNb2RlVHlwZSxcbiAgICBGcm9udEZhY2VUeXBlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBWYWx1ZTxUPiB7XG4gICAgY3VycmVudDogVDtcbiAgICBkZWZhdWx0OiBUO1xuICAgIGRpcnR5OiBib29sZWFuO1xuICAgIGdldCgpOiBUO1xuICAgIHNldERlZmF1bHQoKTogdm9pZDtcbiAgICBzZXQodmFsdWU6IFQpOiB2b2lkO1xufVxuXG5jbGFzcyBCYXNlVmFsdWU8VD4gaW1wbGVtZW50cyBWYWx1ZTxUPiB7XG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dDtcbiAgICBjdXJyZW50OiBUO1xuICAgIGRlZmF1bHQ6IFQ7XG4gICAgZGlydHk6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmdldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdGhpcy5kZWZhdWx0O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0KCk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50O1xuICAgIH1cbiAgICBzZXQodmFsdWU6IFQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAvLyBvdmVycmlkZGVuIGluIGNoaWxkIGNsYXNzZXM7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdCgpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdDsgLy8gb3ZlcnJpZGVuIGluIGNoaWxkIGNsYXNzZXNcbiAgICB9XG4gICAgc2V0RGVmYXVsdCgpIHtcbiAgICAgICAgdGhpcy5zZXQodGhpcy5kZWZhdWx0KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhckNvbG9yIGV4dGVuZHMgQmFzZVZhbHVlPENvbG9yPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBDb2xvciB7XG4gICAgICAgIHJldHVybiBDb2xvci50cmFuc3BhcmVudDtcbiAgICB9XG4gICAgc2V0KHY6IENvbG9yKSB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2LnIgPT09IGMuciAmJiB2LmcgPT09IGMuZyAmJiB2LmIgPT09IGMuYiAmJiB2LmEgPT09IGMuYSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmNsZWFyQ29sb3Iodi5yLCB2LmcsIHYuYiwgdi5hKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsZWFyRGVwdGggZXh0ZW5kcyBCYXNlVmFsdWU8bnVtYmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgc2V0KHY6IG51bWJlcikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuY2xlYXJEZXB0aCh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsZWFyU3RlbmNpbCBleHRlbmRzIEJhc2VWYWx1ZTxudW1iZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBzZXQodjogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5jbGVhclN0ZW5jaWwodik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb2xvck1hc2sgZXh0ZW5kcyBCYXNlVmFsdWU8Q29sb3JNYXNrVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogQ29sb3JNYXNrVHlwZSB7XG4gICAgICAgIHJldHVybiBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV07XG4gICAgfVxuICAgIHNldCh2OiBDb2xvck1hc2tUeXBlKSB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2WzBdID09PSBjWzBdICYmIHZbMV0gPT09IGNbMV0gJiYgdlsyXSA9PT0gY1syXSAmJiB2WzNdID09PSBjWzNdICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuY29sb3JNYXNrKHZbMF0sIHZbMV0sIHZbMl0sIHZbM10pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVwdGhNYXNrIGV4dGVuZHMgQmFzZVZhbHVlPERlcHRoTWFza1R5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IERlcHRoTWFza1R5cGUge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2V0KHY6IERlcHRoTWFza1R5cGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmRlcHRoTWFzayh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0ZW5jaWxNYXNrIGV4dGVuZHMgQmFzZVZhbHVlPG51bWJlcj4ge1xuICAgIGdldERlZmF1bHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDB4RkY7XG4gICAgfVxuICAgIHNldCh2OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLnN0ZW5jaWxNYXNrKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RlbmNpbEZ1bmMgZXh0ZW5kcyBCYXNlVmFsdWU8U3RlbmNpbEZ1bmNUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBTdGVuY2lsRnVuY1R5cGUge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZnVuYzogdGhpcy5nbC5BTFdBWVMsXG4gICAgICAgICAgICByZWY6IDAsXG4gICAgICAgICAgICBtYXNrOiAweEZGXG4gICAgICAgIH07XG4gICAgfVxuICAgIHNldCh2OiBTdGVuY2lsRnVuY1R5cGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHYuZnVuYyA9PT0gYy5mdW5jICYmIHYucmVmID09PSBjLnJlZiAmJiB2Lm1hc2sgPT09IGMubWFzayAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICAvLyBBc3N1bWUgVU5TSUdORURfSU5UXzI0Xzggc3RvcmFnZSwgd2l0aCA4IGJpdHMgZGVkaWNhdGVkIHRvIHN0ZW5jaWwuXG4gICAgICAgIC8vIFBsZWFzZSByZXZpc2UgeW91ciBzdGVuY2lsIHZhbHVlcyBpZiB0aGlzIHRocmVzaG9sZCBpcyB0cmlnZ2VyZWQuXG4gICAgICAgIGFzc2VydCh2LnJlZiA+PSAwICYmIHYucmVmIDw9IDI1NSk7XG4gICAgICAgIHRoaXMuZ2wuc3RlbmNpbEZ1bmModi5mdW5jLCB2LnJlZiwgdi5tYXNrKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0ZW5jaWxPcCBleHRlbmRzIEJhc2VWYWx1ZTxTdGVuY2lsT3BUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBTdGVuY2lsT3BUeXBlIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICByZXR1cm4gW2dsLktFRVAsIGdsLktFRVAsIGdsLktFRVBdO1xuICAgIH1cbiAgICBzZXQodjogU3RlbmNpbE9wVHlwZSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodlswXSA9PT0gY1swXSAmJiB2WzFdID09PSBjWzFdICYmIHZbMl0gPT09IGNbMl0gJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5zdGVuY2lsT3AodlswXSwgdlsxXSwgdlsyXSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGVuY2lsVGVzdCBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aFJhbmdlIGV4dGVuZHMgQmFzZVZhbHVlPERlcHRoUmFuZ2VUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBEZXB0aFJhbmdlVHlwZSB7XG4gICAgICAgIHJldHVybiBbMCwgMV07XG4gICAgfVxuICAgIHNldCh2OiBEZXB0aFJhbmdlVHlwZSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodlswXSA9PT0gY1swXSAmJiB2WzFdID09PSBjWzFdICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuZGVwdGhSYW5nZSh2WzBdLCB2WzFdKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRoVGVzdCBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRoRnVuYyBleHRlbmRzIEJhc2VWYWx1ZTxEZXB0aEZ1bmNUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBEZXB0aEZ1bmNUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuTEVTUztcbiAgICB9XG4gICAgc2V0KHY6IERlcHRoRnVuY1R5cGUpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmRlcHRoRnVuYyh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJsZW5kIGV4dGVuZHMgQmFzZVZhbHVlPGJvb2xlYW4+IHtcbiAgICBnZXREZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNldCh2OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgZ2wuZW5hYmxlKGdsLkJMRU5EKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCbGVuZEZ1bmMgZXh0ZW5kcyBCYXNlVmFsdWU8QmxlbmRGdW5jVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogQmxlbmRGdW5jVHlwZSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgcmV0dXJuIFtnbC5PTkUsIGdsLlpFUk9dO1xuICAgIH1cbiAgICBzZXQodjogQmxlbmRGdW5jVHlwZSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodlswXSA9PT0gY1swXSAmJiB2WzFdID09PSBjWzFdICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuYmxlbmRGdW5jKHZbMF0sIHZbMV0pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmxlbmRDb2xvciBleHRlbmRzIEJhc2VWYWx1ZTxDb2xvcj4ge1xuICAgIGdldERlZmF1bHQoKTogQ29sb3Ige1xuICAgICAgICByZXR1cm4gQ29sb3IudHJhbnNwYXJlbnQ7XG4gICAgfVxuICAgIHNldCh2OiBDb2xvcikge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodi5yID09PSBjLnIgJiYgdi5nID09PSBjLmcgJiYgdi5iID09PSBjLmIgJiYgdi5hID09PSBjLmEgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5ibGVuZENvbG9yKHYuciwgdi5nLCB2LmIsIHYuYSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCbGVuZEVxdWF0aW9uIGV4dGVuZHMgQmFzZVZhbHVlPEJsZW5kRXF1YXRpb25UeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBCbGVuZEVxdWF0aW9uVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsLkZVTkNfQUREO1xuICAgIH1cbiAgICBzZXQodjogQmxlbmRFcXVhdGlvblR5cGUpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmJsZW5kRXF1YXRpb24odik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDdWxsRmFjZSBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wuZGlzYWJsZShnbC5DVUxMX0ZBQ0UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDdWxsRmFjZVNpZGUgZXh0ZW5kcyBCYXNlVmFsdWU8Q3VsbEZhY2VNb2RlVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogQ3VsbEZhY2VNb2RlVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsLkJBQ0s7XG4gICAgfVxuICAgIHNldCh2OiBDdWxsRmFjZU1vZGVUeXBlKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5jdWxsRmFjZSh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZyb250RmFjZSBleHRlbmRzIEJhc2VWYWx1ZTxGcm9udEZhY2VUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBGcm9udEZhY2VUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2wuQ0NXO1xuICAgIH1cbiAgICBzZXQodjogRnJvbnRGYWNlVHlwZSkge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuZnJvbnRGYWNlKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvZ3JhbSBleHRlbmRzIEJhc2VWYWx1ZTw/V2ViR0xQcm9ncmFtPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBXZWJHTFByb2dyYW0ge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2V0KHY6ID9XZWJHTFByb2dyYW0pIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0odik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBY3RpdmVUZXh0dXJlVW5pdCBleHRlbmRzIEJhc2VWYWx1ZTxUZXh0dXJlVW5pdFR5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IFRleHR1cmVVbml0VHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsLlRFWFRVUkUwO1xuICAgIH1cbiAgICBzZXQodjogVGV4dHVyZVVuaXRUeXBlKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5hY3RpdmVUZXh0dXJlKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmlld3BvcnQgZXh0ZW5kcyBCYXNlVmFsdWU8Vmlld3BvcnRUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBWaWV3cG9ydFR5cGUge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIHJldHVybiBbMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0XTtcbiAgICB9XG4gICAgc2V0KHY6IFZpZXdwb3J0VHlwZSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodlswXSA9PT0gY1swXSAmJiB2WzFdID09PSBjWzFdICYmIHZbMl0gPT09IGNbMl0gJiYgdlszXSA9PT0gY1szXSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLnZpZXdwb3J0KHZbMF0sIHZbMV0sIHZbMl0sIHZbM10pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZEZyYW1lYnVmZmVyIGV4dGVuZHMgQmFzZVZhbHVlPD9XZWJHTEZyYW1lYnVmZmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBXZWJHTEZyYW1lYnVmZmVyIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xGcmFtZWJ1ZmZlcikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRSZW5kZXJidWZmZXIgZXh0ZW5kcyBCYXNlVmFsdWU8P1dlYkdMUmVuZGVyYnVmZmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBXZWJHTFJlbmRlcmJ1ZmZlciB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXQodjogP1dlYkdMUmVuZGVyYnVmZmVyKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5iaW5kUmVuZGVyYnVmZmVyKGdsLlJFTkRFUkJVRkZFUiwgdik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5kVGV4dHVyZSBleHRlbmRzIEJhc2VWYWx1ZTw/V2ViR0xUZXh0dXJlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBXZWJHTFRleHR1cmUge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2V0KHY6ID9XZWJHTFRleHR1cmUpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZFZlcnRleEJ1ZmZlciBleHRlbmRzIEJhc2VWYWx1ZTw/V2ViR0xCdWZmZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IFdlYkdMQnVmZmVyIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xCdWZmZXIpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRFbGVtZW50QnVmZmVyIGV4dGVuZHMgQmFzZVZhbHVlPD9XZWJHTEJ1ZmZlcj4ge1xuICAgIGdldERlZmF1bHQoKTogV2ViR0xCdWZmZXIge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2V0KHY6ID9XZWJHTEJ1ZmZlcikge1xuICAgICAgICAvLyBBbHdheXMgcmViaW5kXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5kVmVydGV4QXJyYXlPRVMgZXh0ZW5kcyBCYXNlVmFsdWU8YW55PiB7XG4gICAgdmFvOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQpO1xuICAgICAgICB0aGlzLnZhbyA9IGNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3Q7XG4gICAgfVxuICAgIGdldERlZmF1bHQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbyB8fCB2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy52YW8uYmluZFZlcnRleEFycmF5T0VTKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGl4ZWxTdG9yZVVucGFjayBleHRlbmRzIEJhc2VWYWx1ZTxudW1iZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiA0O1xuICAgIH1cbiAgICBzZXQodjogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfQUxJR05NRU5ULCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhIGV4dGVuZHMgQmFzZVZhbHVlPGJvb2xlYW4+IHtcbiAgICBnZXREZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNldCh2OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsICh2OiBhbnkpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBpeGVsU3RvcmVVbnBhY2tGbGlwWSBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgKHY6IGFueSkpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5jbGFzcyBGcmFtZWJ1ZmZlckF0dGFjaG1lbnQ8VD4gZXh0ZW5kcyBCYXNlVmFsdWU8P1Q+IHtcbiAgICBwYXJlbnQ6IFdlYkdMRnJhbWVidWZmZXI7XG4gICAgY29udGV4dDogQ29udGV4dDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIHBhcmVudDogV2ViR0xGcmFtZWJ1ZmZlcikge1xuICAgICAgICBzdXBlcihjb250ZXh0KTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGdldERlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbG9yQXR0YWNobWVudCBleHRlbmRzIEZyYW1lYnVmZmVyQXR0YWNobWVudDxXZWJHTFRleHR1cmU+IHtcbiAgICBzZXREaXJ0eSgpIHtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xUZXh0dXJlKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQodGhpcy5wYXJlbnQpO1xuICAgICAgICAvLyBub3RlOiBpdCdzIHBvc3NpYmxlIHRvIGF0dGFjaCBhIHJlbmRlcmJ1ZmZlciB0byB0aGUgY29sb3JcbiAgICAgICAgLy8gYXR0YWNobWVudCBwb2ludCwgYnV0IHRodXMgZmFyIE1CR0wgb25seSB1c2VzIHRleHR1cmVzIGZvciBjb2xvclxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgdiwgMCk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aEF0dGFjaG1lbnQgZXh0ZW5kcyBGcmFtZWJ1ZmZlckF0dGFjaG1lbnQ8V2ViR0xSZW5kZXJidWZmZXI+IHtcbiAgICBhdHRhY2htZW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmdsLkRFUFRIX0FUVEFDSE1FTlQ7IH1cbiAgICBzZXQodjogP1dlYkdMUmVuZGVyYnVmZmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQodGhpcy5wYXJlbnQpO1xuICAgICAgICAvLyBub3RlOiBpdCdzIHBvc3NpYmxlIHRvIGF0dGFjaCBhIHRleHR1cmUgdG8gdGhlIGRlcHRoIGF0dGFjaG1lbnRcbiAgICAgICAgLy8gcG9pbnQsIGJ1dCB0aHVzIGZhciBNQkdMIG9ubHkgdXNlcyByZW5kZXJidWZmZXJzIGZvciBkZXB0aFxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCB0aGlzLmF0dGFjaG1lbnQoKSwgZ2wuUkVOREVSQlVGRkVSLCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgZXh0ZW5kcyBEZXB0aEF0dGFjaG1lbnQge1xuICAgIGF0dGFjaG1lbnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOyB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtDb2xvckF0dGFjaG1lbnQsIERlcHRoQXR0YWNobWVudH0gZnJvbSAnLi92YWx1ZS5qcyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi9jb250ZXh0LmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuY2xhc3MgRnJhbWVidWZmZXIge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBmcmFtZWJ1ZmZlcjogV2ViR0xGcmFtZWJ1ZmZlcjtcbiAgICBjb2xvckF0dGFjaG1lbnQ6IENvbG9yQXR0YWNobWVudDtcbiAgICBkZXB0aEF0dGFjaG1lbnQ6IERlcHRoQXR0YWNobWVudDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBoYXNEZXB0aDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGNvbnN0IGZibyA9IHRoaXMuZnJhbWVidWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG4gICAgICAgIHRoaXMuY29sb3JBdHRhY2htZW50ID0gbmV3IENvbG9yQXR0YWNobWVudChjb250ZXh0LCBmYm8pO1xuICAgICAgICBpZiAoaGFzRGVwdGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhBdHRhY2htZW50ID0gbmV3IERlcHRoQXR0YWNobWVudChjb250ZXh0LCBmYm8pO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKSA9PT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLmNvbG9yQXR0YWNobWVudC5nZXQoKTtcbiAgICAgICAgaWYgKHRleHR1cmUpIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwdGhBdHRhY2htZW50KSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJidWZmZXIgPSB0aGlzLmRlcHRoQXR0YWNobWVudC5nZXQoKTtcbiAgICAgICAgICAgIGlmIChyZW5kZXJidWZmZXIpIGdsLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyZW5kZXJidWZmZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGcmFtZWJ1ZmZlcjtcbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7RGVwdGhGdW5jVHlwZSwgRGVwdGhNYXNrVHlwZSwgRGVwdGhSYW5nZVR5cGV9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5jb25zdCBBTFdBWVMgPSAweDAyMDc7XG5cbmNsYXNzIERlcHRoTW9kZSB7XG4gICAgZnVuYzogRGVwdGhGdW5jVHlwZTtcbiAgICBtYXNrOiBEZXB0aE1hc2tUeXBlO1xuICAgIHJhbmdlOiBEZXB0aFJhbmdlVHlwZTtcblxuICAgIC8vIERlcHRoTWFzayBlbnVtc1xuICAgIHN0YXRpYyBSZWFkT25seTogYm9vbGVhbjtcbiAgICBzdGF0aWMgUmVhZFdyaXRlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZGVwdGhGdW5jOiBEZXB0aEZ1bmNUeXBlLCBkZXB0aE1hc2s6IERlcHRoTWFza1R5cGUsIGRlcHRoUmFuZ2U6IERlcHRoUmFuZ2VUeXBlKSB7XG4gICAgICAgIHRoaXMuZnVuYyA9IGRlcHRoRnVuYztcbiAgICAgICAgdGhpcy5tYXNrID0gZGVwdGhNYXNrO1xuICAgICAgICB0aGlzLnJhbmdlID0gZGVwdGhSYW5nZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGlzYWJsZWQ6ICRSZWFkT25seTxEZXB0aE1vZGU+O1xufVxuXG5EZXB0aE1vZGUuUmVhZE9ubHkgPSBmYWxzZTtcbkRlcHRoTW9kZS5SZWFkV3JpdGUgPSB0cnVlO1xuXG5EZXB0aE1vZGUuZGlzYWJsZWQgPSBuZXcgRGVwdGhNb2RlKEFMV0FZUywgRGVwdGhNb2RlLlJlYWRPbmx5LCBbMCwgMV0pO1xuXG5leHBvcnQgZGVmYXVsdCBEZXB0aE1vZGU7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUge1N0ZW5jaWxPcENvbnN0YW50LCBTdGVuY2lsVGVzdH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IEFMV0FZUyA9IDB4MDIwNztcbmNvbnN0IEtFRVAgPSAweDFFMDA7XG5cbmNsYXNzIFN0ZW5jaWxNb2RlIHtcbiAgICB0ZXN0OiBTdGVuY2lsVGVzdDtcbiAgICByZWY6IG51bWJlcjtcbiAgICBtYXNrOiBudW1iZXI7XG4gICAgZmFpbDogU3RlbmNpbE9wQ29uc3RhbnQ7XG4gICAgZGVwdGhGYWlsOiBTdGVuY2lsT3BDb25zdGFudDtcbiAgICBwYXNzOiBTdGVuY2lsT3BDb25zdGFudDtcblxuICAgIGNvbnN0cnVjdG9yKHRlc3Q6IFN0ZW5jaWxUZXN0LCByZWY6IG51bWJlciwgbWFzazogbnVtYmVyLCBmYWlsOiBTdGVuY2lsT3BDb25zdGFudCxcbiAgICAgICAgZGVwdGhGYWlsOiBTdGVuY2lsT3BDb25zdGFudCwgcGFzczogU3RlbmNpbE9wQ29uc3RhbnQpIHtcbiAgICAgICAgdGhpcy50ZXN0ID0gdGVzdDtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMubWFzayA9IG1hc2s7XG4gICAgICAgIHRoaXMuZmFpbCA9IGZhaWw7XG4gICAgICAgIHRoaXMuZGVwdGhGYWlsID0gZGVwdGhGYWlsO1xuICAgICAgICB0aGlzLnBhc3MgPSBwYXNzO1xuICAgIH1cblxuICAgIHN0YXRpYyBkaXNhYmxlZDogJFJlYWRPbmx5PFN0ZW5jaWxNb2RlPjtcbn1cblxuU3RlbmNpbE1vZGUuZGlzYWJsZWQgPSBuZXcgU3RlbmNpbE1vZGUoe2Z1bmM6IEFMV0FZUywgbWFzazogMH0sIDAsIDAsIEtFRVAsIEtFRVAsIEtFRVApO1xuXG5leHBvcnQgZGVmYXVsdCBTdGVuY2lsTW9kZTtcbiIsIi8vIEBmbG93XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcblxuaW1wb3J0IHR5cGUge0JsZW5kRnVuY1R5cGUsIENvbG9yTWFza1R5cGV9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5jb25zdCBaRVJPID0gMHgwMDAwO1xuY29uc3QgT05FID0gMHgwMDAxO1xuY29uc3QgT05FX01JTlVTX1NSQ19BTFBIQSA9IDB4MDMwMztcblxuY2xhc3MgQ29sb3JNb2RlIHtcbiAgICBibGVuZEZ1bmN0aW9uOiBCbGVuZEZ1bmNUeXBlO1xuICAgIGJsZW5kQ29sb3I6IENvbG9yO1xuICAgIG1hc2s6IENvbG9yTWFza1R5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihibGVuZEZ1bmN0aW9uOiBCbGVuZEZ1bmNUeXBlLCBibGVuZENvbG9yOiBDb2xvciwgbWFzazogQ29sb3JNYXNrVHlwZSkge1xuICAgICAgICB0aGlzLmJsZW5kRnVuY3Rpb24gPSBibGVuZEZ1bmN0aW9uO1xuICAgICAgICB0aGlzLmJsZW5kQ29sb3IgPSBibGVuZENvbG9yO1xuICAgICAgICB0aGlzLm1hc2sgPSBtYXNrO1xuICAgIH1cblxuICAgIHN0YXRpYyBSZXBsYWNlOiBCbGVuZEZ1bmNUeXBlO1xuXG4gICAgc3RhdGljIGRpc2FibGVkOiAkUmVhZE9ubHk8Q29sb3JNb2RlPjtcbiAgICBzdGF0aWMgdW5ibGVuZGVkOiAkUmVhZE9ubHk8Q29sb3JNb2RlPjtcbiAgICBzdGF0aWMgYWxwaGFCbGVuZGVkOiAkUmVhZE9ubHk8Q29sb3JNb2RlPjtcbn1cblxuQ29sb3JNb2RlLlJlcGxhY2UgPSBbT05FLCBaRVJPXTtcblxuQ29sb3JNb2RlLmRpc2FibGVkID0gbmV3IENvbG9yTW9kZShDb2xvck1vZGUuUmVwbGFjZSwgQ29sb3IudHJhbnNwYXJlbnQsIFtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZV0pO1xuQ29sb3JNb2RlLnVuYmxlbmRlZCA9IG5ldyBDb2xvck1vZGUoQ29sb3JNb2RlLlJlcGxhY2UsIENvbG9yLnRyYW5zcGFyZW50LCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuQ29sb3JNb2RlLmFscGhhQmxlbmRlZCA9IG5ldyBDb2xvck1vZGUoW09ORSwgT05FX01JTlVTX1NSQ19BTFBIQV0sIENvbG9yLnRyYW5zcGFyZW50LCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xvck1vZGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7Q3VsbEZhY2VNb2RlVHlwZSwgRnJvbnRGYWNlVHlwZX0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IEJBQ0sgPSAweDA0MDU7XG5jb25zdCBGUk9OVCA9IDB4MDQwNDtcbmNvbnN0IENDVyA9IDB4MDkwMTtcbmNvbnN0IENXID0gMHgwOTAwO1xuXG5jbGFzcyBDdWxsRmFjZU1vZGUge1xuICAgIGVuYWJsZTogYm9vbGVhbjtcbiAgICBtb2RlOiBDdWxsRmFjZU1vZGVUeXBlO1xuICAgIGZyb250RmFjZTogRnJvbnRGYWNlVHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKGVuYWJsZTogYm9vbGVhbiwgbW9kZTogQ3VsbEZhY2VNb2RlVHlwZSwgZnJvbnRGYWNlOiBGcm9udEZhY2VUeXBlKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlID0gZW5hYmxlO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICB0aGlzLmZyb250RmFjZSA9IGZyb250RmFjZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGlzYWJsZWQ6ICRSZWFkT25seTxDdWxsRmFjZU1vZGU+O1xuICAgIHN0YXRpYyBiYWNrQ0NXOiAkUmVhZE9ubHk8Q3VsbEZhY2VNb2RlPjtcbiAgICBzdGF0aWMgYmFja0NXOiAkUmVhZE9ubHk8Q3VsbEZhY2VNb2RlPjtcbiAgICBzdGF0aWMgZnJvbnRDVzogJFJlYWRPbmx5PEN1bGxGYWNlTW9kZT47XG4gICAgc3RhdGljIGZyb250Q0NXOiAkUmVhZE9ubHk8Q3VsbEZhY2VNb2RlPjtcbn1cblxuQ3VsbEZhY2VNb2RlLmRpc2FibGVkID0gbmV3IEN1bGxGYWNlTW9kZShmYWxzZSwgQkFDSywgQ0NXKTtcbkN1bGxGYWNlTW9kZS5iYWNrQ0NXID0gbmV3IEN1bGxGYWNlTW9kZSh0cnVlLCBCQUNLLCBDQ1cpO1xuQ3VsbEZhY2VNb2RlLmJhY2tDVyA9IG5ldyBDdWxsRmFjZU1vZGUodHJ1ZSwgQkFDSywgQ1cpO1xuQ3VsbEZhY2VNb2RlLmZyb250Q1cgPSBuZXcgQ3VsbEZhY2VNb2RlKHRydWUsIEZST05ULCBDVyk7XG5DdWxsRmFjZU1vZGUuZnJvbnRDQ1cgPSBuZXcgQ3VsbEZhY2VNb2RlKHRydWUsIEZST05ULCBDQ1cpO1xuXG5leHBvcnQgZGVmYXVsdCBDdWxsRmFjZU1vZGU7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IEluZGV4QnVmZmVyIGZyb20gJy4vaW5kZXhfYnVmZmVyLmpzJztcblxuaW1wb3J0IFZlcnRleEJ1ZmZlciBmcm9tICcuL3ZlcnRleF9idWZmZXIuanMnO1xuaW1wb3J0IEZyYW1lYnVmZmVyIGZyb20gJy4vZnJhbWVidWZmZXIuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuL2RlcHRoX21vZGUuanMnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4vc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi9jb2xvcl9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi9jdWxsX2ZhY2VfbW9kZS5qcyc7XG5pbXBvcnQge2RlZXBFcXVhbH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7Q2xlYXJDb2xvciwgQ2xlYXJEZXB0aCwgQ2xlYXJTdGVuY2lsLCBDb2xvck1hc2ssIERlcHRoTWFzaywgU3RlbmNpbE1hc2ssIFN0ZW5jaWxGdW5jLCBTdGVuY2lsT3AsIFN0ZW5jaWxUZXN0LCBEZXB0aFJhbmdlLCBEZXB0aFRlc3QsIERlcHRoRnVuYywgQmxlbmQsIEJsZW5kRnVuYywgQmxlbmRDb2xvciwgQmxlbmRFcXVhdGlvbiwgQ3VsbEZhY2UsIEN1bGxGYWNlU2lkZSwgRnJvbnRGYWNlLCBQcm9ncmFtLCBBY3RpdmVUZXh0dXJlVW5pdCwgVmlld3BvcnQsIEJpbmRGcmFtZWJ1ZmZlciwgQmluZFJlbmRlcmJ1ZmZlciwgQmluZFRleHR1cmUsIEJpbmRWZXJ0ZXhCdWZmZXIsIEJpbmRFbGVtZW50QnVmZmVyLCBCaW5kVmVydGV4QXJyYXlPRVMsIFBpeGVsU3RvcmVVbnBhY2ssIFBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLCBQaXhlbFN0b3JlVW5wYWNrRmxpcFl9IGZyb20gJy4vdmFsdWUuanMnO1xuXG5pbXBvcnQgdHlwZSB7VHJpYW5nbGVJbmRleEFycmF5LCBMaW5lSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheX0gZnJvbSAnLi4vZGF0YS9pbmRleF9hcnJheV90eXBlLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgICBTdHJ1Y3RBcnJheSxcbiAgICBTdHJ1Y3RBcnJheU1lbWJlclxufSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG50eXBlIENsZWFyQXJncyA9IHtcbiAgICBjb2xvcj86IENvbG9yLFxuICAgIGRlcHRoPzogbnVtYmVyLFxuICAgIHN0ZW5jaWw/OiBudW1iZXJcbn07XG5cbmNsYXNzIENvbnRleHQge1xuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG4gICAgZXh0VmVydGV4QXJyYXlPYmplY3Q6IGFueTtcbiAgICBjdXJyZW50TnVtQXR0cmlidXRlczogP251bWJlcjtcbiAgICBtYXhUZXh0dXJlU2l6ZTogbnVtYmVyO1xuXG4gICAgY2xlYXJDb2xvcjogQ2xlYXJDb2xvcjtcbiAgICBjbGVhckRlcHRoOiBDbGVhckRlcHRoO1xuICAgIGNsZWFyU3RlbmNpbDogQ2xlYXJTdGVuY2lsO1xuICAgIGNvbG9yTWFzazogQ29sb3JNYXNrO1xuICAgIGRlcHRoTWFzazogRGVwdGhNYXNrO1xuICAgIHN0ZW5jaWxNYXNrOiBTdGVuY2lsTWFzaztcbiAgICBzdGVuY2lsRnVuYzogU3RlbmNpbEZ1bmM7XG4gICAgc3RlbmNpbE9wOiBTdGVuY2lsT3A7XG4gICAgc3RlbmNpbFRlc3Q6IFN0ZW5jaWxUZXN0O1xuICAgIGRlcHRoUmFuZ2U6IERlcHRoUmFuZ2U7XG4gICAgZGVwdGhUZXN0OiBEZXB0aFRlc3Q7XG4gICAgZGVwdGhGdW5jOiBEZXB0aEZ1bmM7XG4gICAgYmxlbmQ6IEJsZW5kO1xuICAgIGJsZW5kRnVuYzogQmxlbmRGdW5jO1xuICAgIGJsZW5kQ29sb3I6IEJsZW5kQ29sb3I7XG4gICAgYmxlbmRFcXVhdGlvbjogQmxlbmRFcXVhdGlvbjtcbiAgICBjdWxsRmFjZTogQ3VsbEZhY2U7XG4gICAgY3VsbEZhY2VTaWRlOiBDdWxsRmFjZVNpZGU7XG4gICAgZnJvbnRGYWNlOiBGcm9udEZhY2U7XG4gICAgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgICBhY3RpdmVUZXh0dXJlOiBBY3RpdmVUZXh0dXJlVW5pdDtcbiAgICB2aWV3cG9ydDogVmlld3BvcnQ7XG4gICAgYmluZEZyYW1lYnVmZmVyOiBCaW5kRnJhbWVidWZmZXI7XG4gICAgYmluZFJlbmRlcmJ1ZmZlcjogQmluZFJlbmRlcmJ1ZmZlcjtcbiAgICBiaW5kVGV4dHVyZTogQmluZFRleHR1cmU7XG4gICAgYmluZFZlcnRleEJ1ZmZlcjogQmluZFZlcnRleEJ1ZmZlcjtcbiAgICBiaW5kRWxlbWVudEJ1ZmZlcjogQmluZEVsZW1lbnRCdWZmZXI7XG4gICAgYmluZFZlcnRleEFycmF5T0VTOiBCaW5kVmVydGV4QXJyYXlPRVM7XG4gICAgcGl4ZWxTdG9yZVVucGFjazogUGl4ZWxTdG9yZVVucGFjaztcbiAgICBwaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYTogUGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGE7XG4gICAgcGl4ZWxTdG9yZVVucGFja0ZsaXBZOiBQaXhlbFN0b3JlVW5wYWNrRmxpcFk7XG5cbiAgICBleHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWM6IGFueTtcbiAgICBleHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXg6IGFueTtcbiAgICBleHRUZXh0dXJlSGFsZkZsb2F0OiBhbnk7XG4gICAgZXh0UmVuZGVyVG9UZXh0dXJlSGFsZkZsb2F0OiBhbnk7XG4gICAgZXh0VGltZXJRdWVyeTogYW55O1xuXG4gICAgZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljRm9yY2VPZmY6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCA9IHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuXG4gICAgICAgIHRoaXMuY2xlYXJDb2xvciA9IG5ldyBDbGVhckNvbG9yKHRoaXMpO1xuICAgICAgICB0aGlzLmNsZWFyRGVwdGggPSBuZXcgQ2xlYXJEZXB0aCh0aGlzKTtcbiAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwgPSBuZXcgQ2xlYXJTdGVuY2lsKHRoaXMpO1xuICAgICAgICB0aGlzLmNvbG9yTWFzayA9IG5ldyBDb2xvck1hc2sodGhpcyk7XG4gICAgICAgIHRoaXMuZGVwdGhNYXNrID0gbmV3IERlcHRoTWFzayh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsTWFzayA9IG5ldyBTdGVuY2lsTWFzayh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsRnVuYyA9IG5ldyBTdGVuY2lsRnVuYyh0aGlzKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsT3AgPSBuZXcgU3RlbmNpbE9wKHRoaXMpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0ID0gbmV3IFN0ZW5jaWxUZXN0KHRoaXMpO1xuICAgICAgICB0aGlzLmRlcHRoUmFuZ2UgPSBuZXcgRGVwdGhSYW5nZSh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXB0aFRlc3QgPSBuZXcgRGVwdGhUZXN0KHRoaXMpO1xuICAgICAgICB0aGlzLmRlcHRoRnVuYyA9IG5ldyBEZXB0aEZ1bmModGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmQgPSBuZXcgQmxlbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmRGdW5jID0gbmV3IEJsZW5kRnVuYyh0aGlzKTtcbiAgICAgICAgdGhpcy5ibGVuZENvbG9yID0gbmV3IEJsZW5kQ29sb3IodGhpcyk7XG4gICAgICAgIHRoaXMuYmxlbmRFcXVhdGlvbiA9IG5ldyBCbGVuZEVxdWF0aW9uKHRoaXMpO1xuICAgICAgICB0aGlzLmN1bGxGYWNlID0gbmV3IEN1bGxGYWNlKHRoaXMpO1xuICAgICAgICB0aGlzLmN1bGxGYWNlU2lkZSA9IG5ldyBDdWxsRmFjZVNpZGUodGhpcyk7XG4gICAgICAgIHRoaXMuZnJvbnRGYWNlID0gbmV3IEZyb250RmFjZSh0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gbmV3IFByb2dyYW0odGhpcyk7XG4gICAgICAgIHRoaXMuYWN0aXZlVGV4dHVyZSA9IG5ldyBBY3RpdmVUZXh0dXJlVW5pdCh0aGlzKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydCA9IG5ldyBWaWV3cG9ydCh0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kRnJhbWVidWZmZXIgPSBuZXcgQmluZEZyYW1lYnVmZmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmJpbmRSZW5kZXJidWZmZXIgPSBuZXcgQmluZFJlbmRlcmJ1ZmZlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kVGV4dHVyZSA9IG5ldyBCaW5kVGV4dHVyZSh0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kVmVydGV4QnVmZmVyID0gbmV3IEJpbmRWZXJ0ZXhCdWZmZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmluZEVsZW1lbnRCdWZmZXIgPSBuZXcgQmluZEVsZW1lbnRCdWZmZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmluZFZlcnRleEFycmF5T0VTID0gdGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCAmJiBuZXcgQmluZFZlcnRleEFycmF5T0VTKHRoaXMpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2sgPSBuZXcgUGl4ZWxTdG9yZVVucGFjayh0aGlzKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSA9IG5ldyBQaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYSh0aGlzKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkgPSBuZXcgUGl4ZWxTdG9yZVVucGFja0ZsaXBZKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljID0gKFxuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnKSB8fFxuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJykgfHxcbiAgICAgICAgICAgIGdsLmdldEV4dGVuc2lvbignV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycpXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYykge1xuICAgICAgICAgICAgdGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXggPSBnbC5nZXRQYXJhbWV0ZXIodGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMuTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpY0ZvcmNlT2ZmID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5leHRUZXh0dXJlSGFsZkZsb2F0ID0gZ2wuZ2V0RXh0ZW5zaW9uKCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Jyk7XG4gICAgICAgIGlmICh0aGlzLmV4dFRleHR1cmVIYWxmRmxvYXQpIHtcbiAgICAgICAgICAgIGdsLmdldEV4dGVuc2lvbignT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInKTtcbiAgICAgICAgICAgIHRoaXMuZXh0UmVuZGVyVG9UZXh0dXJlSGFsZkZsb2F0ID0gZ2wuZ2V0RXh0ZW5zaW9uKCdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXh0VGltZXJRdWVyeSA9IGdsLmdldEV4dGVuc2lvbignRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5Jyk7XG4gICAgICAgIHRoaXMubWF4VGV4dHVyZVNpemUgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSk7XG4gICAgfVxuXG4gICAgc2V0RGVmYXVsdCgpIHtcbiAgICAgICAgdGhpcy51bmJpbmRWQU8oKTtcblxuICAgICAgICB0aGlzLmNsZWFyQ29sb3Iuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNsZWFyRGVwdGguc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNsZWFyU3RlbmNpbC5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY29sb3JNYXNrLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5kZXB0aE1hc2suc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxNYXNrLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsRnVuYy5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc3RlbmNpbE9wLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsVGVzdC5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZGVwdGhSYW5nZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZGVwdGhUZXN0LnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5kZXB0aEZ1bmMuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmJsZW5kLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5ibGVuZEZ1bmMuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmJsZW5kQ29sb3Iuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmJsZW5kRXF1YXRpb24uc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmN1bGxGYWNlLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jdWxsRmFjZVNpZGUuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmZyb250RmFjZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuYWN0aXZlVGV4dHVyZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuYmluZEZyYW1lYnVmZmVyLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucGl4ZWxTdG9yZVVucGFja0ZsaXBZLnNldERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBzZXREaXJ0eSgpIHtcbiAgICAgICAgdGhpcy5jbGVhckNvbG9yLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jbGVhckRlcHRoLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbG9yTWFzay5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVwdGhNYXNrLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGVuY2lsTWFzay5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RlbmNpbEZ1bmMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0ZW5jaWxPcC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RlbmNpbFRlc3QuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlcHRoUmFuZ2UuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmRlcHRoVGVzdC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVwdGhGdW5jLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ibGVuZC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmxlbmRGdW5jLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ibGVuZENvbG9yLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ibGVuZEVxdWF0aW9uLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jdWxsRmFjZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuY3VsbEZhY2VTaWRlLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mcm9udEZhY2UuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnByb2dyYW0uZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmFjdGl2ZVRleHR1cmUuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZXdwb3J0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iaW5kRnJhbWVidWZmZXIuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJpbmRSZW5kZXJidWZmZXIuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJpbmRUZXh0dXJlLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iaW5kVmVydGV4QnVmZmVyLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5iaW5kRWxlbWVudEJ1ZmZlci5kaXJ0eSA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmV4dFZlcnRleEFycmF5T2JqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRWZXJ0ZXhBcnJheU9FUy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMucGl4ZWxTdG9yZVVucGFja0ZsaXBZLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjcmVhdGVJbmRleEJ1ZmZlcihhcnJheTogVHJpYW5nbGVJbmRleEFycmF5IHwgTGluZUluZGV4QXJyYXkgfCBMaW5lU3RyaXBJbmRleEFycmF5LCBkeW5hbWljRHJhdz86IGJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbmRleEJ1ZmZlcih0aGlzLCBhcnJheSwgZHluYW1pY0RyYXcpO1xuICAgIH1cblxuICAgIGNyZWF0ZVZlcnRleEJ1ZmZlcihhcnJheTogU3RydWN0QXJyYXksIGF0dHJpYnV0ZXM6ICRSZWFkT25seUFycmF5PFN0cnVjdEFycmF5TWVtYmVyPiwgZHluYW1pY0RyYXc/OiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiBuZXcgVmVydGV4QnVmZmVyKHRoaXMsIGFycmF5LCBhdHRyaWJ1dGVzLCBkeW5hbWljRHJhdyk7XG4gICAgfVxuXG4gICAgY3JlYXRlUmVuZGVyYnVmZmVyKHN0b3JhZ2VGb3JtYXQ6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgIGNvbnN0IHJibyA9IGdsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmJpbmRSZW5kZXJidWZmZXIuc2V0KHJibyk7XG4gICAgICAgIGdsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoZ2wuUkVOREVSQlVGRkVSLCBzdG9yYWdlRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5iaW5kUmVuZGVyYnVmZmVyLnNldChudWxsKTtcblxuICAgICAgICByZXR1cm4gcmJvO1xuICAgIH1cblxuICAgIGNyZWF0ZUZyYW1lYnVmZmVyKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBoYXNEZXB0aDogYm9vbGVhbikge1xuICAgICAgICByZXR1cm4gbmV3IEZyYW1lYnVmZmVyKHRoaXMsIHdpZHRoLCBoZWlnaHQsIGhhc0RlcHRoKTtcbiAgICB9XG5cbiAgICBjbGVhcih7Y29sb3IsIGRlcHRoLCBzdGVuY2lsfTogQ2xlYXJBcmdzKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgbGV0IG1hc2sgPSAwO1xuXG4gICAgICAgIGlmIChjb2xvcikge1xuICAgICAgICAgICAgbWFzayB8PSBnbC5DT0xPUl9CVUZGRVJfQklUO1xuICAgICAgICAgICAgdGhpcy5jbGVhckNvbG9yLnNldChjb2xvcik7XG4gICAgICAgICAgICB0aGlzLmNvbG9yTWFzay5zZXQoW3RydWUsIHRydWUsIHRydWUsIHRydWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVwdGggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBtYXNrIHw9IGdsLkRFUFRIX0JVRkZFUl9CSVQ7XG5cbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHBsYXRmb3JtcyB3aGVyZSBjbGVhckRlcHRoIGRvZXNuJ3Qgc2VlbSB0byB3b3JrXG4gICAgICAgICAgICAvLyB3aXRob3V0IHJlc2V0aW5nIHRoZSBkZXB0aFJhbmdlLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzM0MzdcbiAgICAgICAgICAgIHRoaXMuZGVwdGhSYW5nZS5zZXQoWzAsIDFdKTtcblxuICAgICAgICAgICAgdGhpcy5jbGVhckRlcHRoLnNldChkZXB0aCk7XG4gICAgICAgICAgICB0aGlzLmRlcHRoTWFzay5zZXQodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHN0ZW5jaWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBtYXNrIHw9IGdsLlNURU5DSUxfQlVGRkVSX0JJVDtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsLnNldChzdGVuY2lsKTtcbiAgICAgICAgICAgIHRoaXMuc3RlbmNpbE1hc2suc2V0KDB4RkYpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wuY2xlYXIobWFzayk7XG4gICAgfVxuXG4gICAgc2V0Q3VsbEZhY2UoY3VsbEZhY2VNb2RlOiAkUmVhZE9ubHk8Q3VsbEZhY2VNb2RlPikge1xuICAgICAgICBpZiAoY3VsbEZhY2VNb2RlLmVuYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuY3VsbEZhY2Uuc2V0KGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VsbEZhY2Uuc2V0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5jdWxsRmFjZVNpZGUuc2V0KGN1bGxGYWNlTW9kZS5tb2RlKTtcbiAgICAgICAgICAgIHRoaXMuZnJvbnRGYWNlLnNldChjdWxsRmFjZU1vZGUuZnJvbnRGYWNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldERlcHRoTW9kZShkZXB0aE1vZGU6ICRSZWFkT25seTxEZXB0aE1vZGU+KSB7XG4gICAgICAgIGlmIChkZXB0aE1vZGUuZnVuYyA9PT0gdGhpcy5nbC5BTFdBWVMgJiYgIWRlcHRoTW9kZS5tYXNrKSB7XG4gICAgICAgICAgICB0aGlzLmRlcHRoVGVzdC5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZXB0aFRlc3Quc2V0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5kZXB0aEZ1bmMuc2V0KGRlcHRoTW9kZS5mdW5jKTtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhNYXNrLnNldChkZXB0aE1vZGUubWFzayk7XG4gICAgICAgICAgICB0aGlzLmRlcHRoUmFuZ2Uuc2V0KGRlcHRoTW9kZS5yYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTdGVuY2lsTW9kZShzdGVuY2lsTW9kZTogJFJlYWRPbmx5PFN0ZW5jaWxNb2RlPikge1xuICAgICAgICBpZiAoc3RlbmNpbE1vZGUudGVzdC5mdW5jID09PSB0aGlzLmdsLkFMV0FZUyAmJiAhc3RlbmNpbE1vZGUubWFzaykge1xuICAgICAgICAgICAgdGhpcy5zdGVuY2lsVGVzdC5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGVuY2lsVGVzdC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxNYXNrLnNldChzdGVuY2lsTW9kZS5tYXNrKTtcbiAgICAgICAgICAgIHRoaXMuc3RlbmNpbE9wLnNldChbc3RlbmNpbE1vZGUuZmFpbCwgc3RlbmNpbE1vZGUuZGVwdGhGYWlsLCBzdGVuY2lsTW9kZS5wYXNzXSk7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxGdW5jLnNldCh7XG4gICAgICAgICAgICAgICAgZnVuYzogc3RlbmNpbE1vZGUudGVzdC5mdW5jLFxuICAgICAgICAgICAgICAgIHJlZjogc3RlbmNpbE1vZGUucmVmLFxuICAgICAgICAgICAgICAgIG1hc2s6IHN0ZW5jaWxNb2RlLnRlc3QubWFza1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDb2xvck1vZGUoY29sb3JNb2RlOiAkUmVhZE9ubHk8Q29sb3JNb2RlPikge1xuICAgICAgICBpZiAoZGVlcEVxdWFsKGNvbG9yTW9kZS5ibGVuZEZ1bmN0aW9uLCBDb2xvck1vZGUuUmVwbGFjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYmxlbmQuc2V0KGZhbHNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYmxlbmQuc2V0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5ibGVuZEZ1bmMuc2V0KGNvbG9yTW9kZS5ibGVuZEZ1bmN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuYmxlbmRDb2xvci5zZXQoY29sb3JNb2RlLmJsZW5kQ29sb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb2xvck1hc2suc2V0KGNvbG9yTW9kZS5tYXNrKTtcbiAgICB9XG5cbiAgICB1bmJpbmRWQU8oKSB7XG4gICAgICAgIC8vIFVuYmluZGluZyB0aGUgVkFPIHByZXZlbnRzIG90aGVyIHRoaW5ncyAoY3VzdG9tIGxheWVycywgbmV3IGJ1ZmZlciBjcmVhdGlvbikgZnJvbVxuICAgICAgICAvLyB1bmludGVudGlvbmFsbHkgY2hhbmdpbmcgdGhlIHN0YXRlIG9mIHRoZSBsYXN0IFZBTyB1c2VkLlxuICAgICAgICBpZiAodGhpcy5leHRWZXJ0ZXhBcnJheU9iamVjdCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kVmVydGV4QXJyYXlPRVMuc2V0KG51bGwpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb250ZXh0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge0NvbGxpc2lvbkJveEFycmF5fSBmcm9tICcuL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlIGZyb20gJy4uL3N0eWxlL3N0eWxlLmpzJztcbmltcG9ydCB0eXBlIHtUeXBlZFN0eWxlTGF5ZXJ9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3R5cGVkX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIEZlYXR1cmVJbmRleCBmcm9tICcuL2ZlYXR1cmVfaW5kZXguanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX3N0YXRlLmpzJztcbmltcG9ydCB0eXBlIHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMuanMnO1xuaW1wb3J0IHR5cGUgTGluZUF0bGFzIGZyb20gJy4uL3JlbmRlci9saW5lX2F0bGFzLmpzJztcbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlVHJhbnNmb3JtfSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi90aWxlX3RyYW5zZm9ybS5qcyc7XG5cbmV4cG9ydCB0eXBlIEJ1Y2tldFBhcmFtZXRlcnM8TGF5ZXI6IFR5cGVkU3R5bGVMYXllcj4gPSB7XG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBsYXllcnM6IEFycmF5PExheWVyPixcbiAgICB6b29tOiBudW1iZXIsXG4gICAgcGl4ZWxSYXRpbzogbnVtYmVyLFxuICAgIG92ZXJzY2FsaW5nOiBudW1iZXIsXG4gICAgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5LFxuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICBzb3VyY2VJRDogc3RyaW5nLFxuICAgIGVuYWJsZVRlcnJhaW46IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgUG9wdWxhdGVQYXJhbWV0ZXJzID0ge1xuICAgIGZlYXR1cmVJbmRleDogRmVhdHVyZUluZGV4LFxuICAgIGljb25EZXBlbmRlbmNpZXM6IHt9LFxuICAgIHBhdHRlcm5EZXBlbmRlbmNpZXM6IHt9LFxuICAgIGdseXBoRGVwZW5kZW5jaWVzOiB7fSxcbiAgICBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sXG4gICAgbGluZUF0bGFzOiBMaW5lQXRsYXNcbn1cblxuZXhwb3J0IHR5cGUgSW5kZXhlZEZlYXR1cmUgPSB7XG4gICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgaWQ6IG51bWJlciB8IHN0cmluZyxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbn1cblxuZXhwb3J0IHR5cGUgQnVja2V0RmVhdHVyZSA9IHt8XG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG4gICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgcHJvcGVydGllczogT2JqZWN0LFxuICAgIHR5cGU6IDEgfCAyIHwgMyxcbiAgICBpZD86IGFueSxcbiAgICArcGF0dGVybnM6IHtbXzogc3RyaW5nXToge1wibWluXCI6IHN0cmluZywgXCJtaWRcIjogc3RyaW5nLCBcIm1heFwiOiBzdHJpbmd9fSxcbiAgICBzb3J0S2V5PzogbnVtYmVyXG58fTtcblxuLyoqXG4gKiBUaGUgYEJ1Y2tldGAgaW50ZXJmYWNlIGlzIHRoZSBzaW5nbGUgcG9pbnQgb2Yga25vd2xlZGdlIGFib3V0IHR1cm5pbmcgdmVjdG9yXG4gKiB0aWxlcyBpbnRvIFdlYkdMIGJ1ZmZlcnMuXG4gKlxuICogYEJ1Y2tldGAgaXMgYW4gYWJzdHJhY3QgaW50ZXJmYWNlLiBBbiBpbXBsZW1lbnRhdGlvbiBleGlzdHMgZm9yIGVhY2ggc3R5bGUgbGF5ZXIgdHlwZS5cbiAqIENyZWF0ZSBhIGJ1Y2tldCB2aWEgdGhlIGBTdHlsZUxheWVyI2NyZWF0ZUJ1Y2tldGAgbWV0aG9kLlxuICpcbiAqIFRoZSBjb25jcmV0ZSBidWNrZXQgdHlwZXMsIHVzaW5nIGxheW91dCBvcHRpb25zIGZyb20gdGhlIHN0eWxlIGxheWVyLFxuICogdHJhbnNmb3JtIGZlYXR1cmUgZ2VvbWV0cmllcyBpbnRvIHZlcnRleCBhbmQgaW5kZXggZGF0YSBmb3IgdXNlIGJ5IHRoZVxuICogdmVydGV4IHNoYWRlci4gIFRoZXkgYWxzbyAodmlhIGBQcm9ncmFtQ29uZmlndXJhdGlvbmApIHVzZSBmZWF0dXJlXG4gKiBwcm9wZXJ0aWVzIGFuZCB0aGUgem9vbSBsZXZlbCB0byBwb3B1bGF0ZSB0aGUgYXR0cmlidXRlcyBuZWVkZWQgZm9yXG4gKiBkYXRhLWRyaXZlbiBzdHlsaW5nLlxuICpcbiAqIEJ1Y2tldHMgYXJlIGRlc2lnbmVkIHRvIGJlIGJ1aWx0IG9uIGEgd29ya2VyIHRocmVhZCBhbmQgdGhlbiBzZXJpYWxpemVkIGFuZFxuICogdHJhbnNmZXJyZWQgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgZm9yIHJlbmRlcmluZy4gIE9uIHRoZSB3b3JrZXIgc2lkZSwgYVxuICogYnVja2V0J3MgdmVydGV4LCBpbmRleCwgYW5kIGF0dHJpYnV0ZSBkYXRhIGlzIHN0b3JlZCBpbiBgYnVja2V0LmFycmF5czpcbiAqIEFycmF5R3JvdXBgLiAgV2hlbiBhIGJ1Y2tldCdzIGRhdGEgaXMgc2VyaWFsaXplZCBhbmQgc2VudCBiYWNrIHRvIHRoZSBtYWluXG4gKiB0aHJlYWQsIGlzIGdldHMgZGVzZXJpYWxpemVkICh1c2luZyBgbmV3IEJ1Y2tldChzZXJpYWxpemVkQnVja2V0RGF0YSlgLCB3aXRoXG4gKiB0aGUgYXJyYXkgZGF0YSBub3cgc3RvcmVkIGluIGBidWNrZXQuYnVmZmVyczogQnVmZmVyR3JvdXBgLiAgQnVmZmVyR3JvdXBzXG4gKiBob2xkIHRoZSBzYW1lIGRhdGEgYXMgQXJyYXlHcm91cHMsIGJ1dCBhcmUgdHVuZWQgZm9yIGNvbnN1bXB0aW9uIGJ5IFdlYkdMLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0IHtcbiAgICBsYXllcklkczogQXJyYXk8c3RyaW5nPjtcbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgICtsYXllcnM6IEFycmF5PGFueT47XG4gICAgK3N0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxhbnk+O1xuICAgICtzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHBvcHVsYXRlKGZlYXR1cmVzOiBBcnJheTxJbmRleGVkRmVhdHVyZT4sIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIHRpbGVUcmFuc2Zvcm06IFRpbGVUcmFuc2Zvcm0pOiB2b2lkO1xuICAgIHVwZGF0ZShzdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSk6IHZvaWQ7XG4gICAgaXNFbXB0eSgpOiBib29sZWFuO1xuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpOiB2b2lkO1xuICAgIHVwbG9hZFBlbmRpbmcoKTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFJlbGVhc2UgdGhlIFdlYkdMIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlcnMuIE5vdGUgdGhhdCBiZWNhdXNlXG4gICAgICogYnVja2V0cyBhcmUgc2hhcmVkIGJldHdlZW4gbGF5ZXJzIGhhdmluZyB0aGUgc2FtZSBsYXlvdXQgcHJvcGVydGllcywgdGhleVxuICAgICAqIG11c3QgYmUgZGVzdHJveWVkIGluIGdyb3VwcyAoYWxsIGJ1Y2tldHMgZm9yIGEgdGlsZSwgb3IgYWxsIHN5bWJvbCBidWNrZXRzKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUoaW5wdXQ6IEFycmF5PEJ1Y2tldD4sIHN0eWxlOiBTdHlsZSk6IHtbXzogc3RyaW5nXTogQnVja2V0fSB7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG5cbiAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtYXAncyBzdHlsZSBoYXMgYmVlbiBzZXQgdG8gbnVsbCB3aGlsZVxuICAgIC8vIHRoaXMgYnVja2V0IGhhcyBiZWVuIHBhcnNpbmcuXG4gICAgaWYgKCFzdHlsZSkgcmV0dXJuIG91dHB1dDtcblxuICAgIGZvciAoY29uc3QgYnVja2V0IG9mIGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGxheWVycyA9IGJ1Y2tldC5sYXllcklkc1xuICAgICAgICAgICAgLm1hcCgoaWQpID0+IHN0eWxlLmdldExheWVyKGlkKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgaWYgKGxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbG9vayB1cCBTdHlsZUxheWVyIG9iamVjdHMgZnJvbSBsYXllciBpZHMgKHNpbmNlIHdlIGRvbid0XG4gICAgICAgIC8vIHdhbnQgdG8gd2FzdGUgdGltZSBzZXJpYWxpemluZy9jb3B5aW5nIHRoZW0gZnJvbSB0aGUgd29ya2VyKVxuICAgICAgICAoYnVja2V0OiBhbnkpLmxheWVycyA9IGxheWVycztcbiAgICAgICAgaWYgKChidWNrZXQ6IGFueSkuc3RhdGVEZXBlbmRlbnRMYXllcklkcykge1xuICAgICAgICAgICAgKGJ1Y2tldDogYW55KS5zdGF0ZURlcGVuZGVudExheWVycyA9IChidWNrZXQ6IGFueSkuc3RhdGVEZXBlbmRlbnRMYXllcklkcy5tYXAoKGxJZCkgPT4gbGF5ZXJzLmZpbHRlcigobCkgPT4gbC5pZCA9PT0gbElkKVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIG91dHB1dFtsYXllci5pZF0gPSBidWNrZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIiwiLy8gQGZsb3cgc3RyaWN0XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuY2xhc3MgRGljdGlvbmFyeUNvZGVyIHtcbiAgICBfc3RyaW5nVG9OdW1iZXI6IHtbXzogc3RyaW5nXTogbnVtYmVyIH07XG4gICAgX251bWJlclRvU3RyaW5nOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3Ioc3RyaW5nczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICB0aGlzLl9zdHJpbmdUb051bWJlciA9IHt9O1xuICAgICAgICB0aGlzLl9udW1iZXJUb1N0cmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZyA9IHN0cmluZ3NbaV07XG4gICAgICAgICAgICB0aGlzLl9zdHJpbmdUb051bWJlcltzdHJpbmddID0gaTtcbiAgICAgICAgICAgIHRoaXMuX251bWJlclRvU3RyaW5nW2ldID0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW5jb2RlKHN0cmluZzogc3RyaW5nKSB7XG4gICAgICAgIGFzc2VydChzdHJpbmcgaW4gdGhpcy5fc3RyaW5nVG9OdW1iZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyaW5nVG9OdW1iZXJbc3RyaW5nXTtcbiAgICB9XG5cbiAgICBkZWNvZGUobjogbnVtYmVyKSB7XG4gICAgICAgIGFzc2VydChuIDwgdGhpcy5fbnVtYmVyVG9TdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlclRvU3RyaW5nW25dO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGljdGlvbmFyeUNvZGVyO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIHtHZW9KU09OR2VvbWV0cnl9IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5cbmNsYXNzIEZlYXR1cmUge1xuICAgIHR5cGU6ICdGZWF0dXJlJztcbiAgICBfZ2VvbWV0cnk6ID9HZW9KU09OR2VvbWV0cnk7XG4gICAgcHJvcGVydGllczoge307XG4gICAgaWQ6IG51bWJlciB8IHN0cmluZyB8IHZvaWQ7XG5cbiAgICBfdmVjdG9yVGlsZUZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlO1xuXG4gICAgY29uc3RydWN0b3IodmVjdG9yVGlsZUZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLCB6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyLCBpZDogc3RyaW5nIHwgbnVtYmVyIHwgdm9pZCkge1xuICAgICAgICB0aGlzLnR5cGUgPSAnRmVhdHVyZSc7XG5cbiAgICAgICAgdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUgPSB2ZWN0b3JUaWxlRmVhdHVyZTtcbiAgICAgICAgKHZlY3RvclRpbGVGZWF0dXJlOiBhbnkpLl96ID0gejtcbiAgICAgICAgKHZlY3RvclRpbGVGZWF0dXJlOiBhbnkpLl94ID0geDtcbiAgICAgICAgKHZlY3RvclRpbGVGZWF0dXJlOiBhbnkpLl95ID0geTtcblxuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSB2ZWN0b3JUaWxlRmVhdHVyZS5wcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgfVxuXG4gICAgZ2V0IGdlb21ldHJ5KCk6ID9HZW9KU09OR2VvbWV0cnkge1xuICAgICAgICBpZiAodGhpcy5fZ2VvbWV0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fZ2VvbWV0cnkgPSB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZS50b0dlb0pTT04oXG4gICAgICAgICAgICAgICAgKHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlOiBhbnkpLl94LFxuICAgICAgICAgICAgICAgICh0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZTogYW55KS5feSxcbiAgICAgICAgICAgICAgICAodGhpcy5fdmVjdG9yVGlsZUZlYXR1cmU6IGFueSkuX3opLmdlb21ldHJ5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW9tZXRyeTtcbiAgICB9XG5cbiAgICBzZXQgZ2VvbWV0cnkoZzogP0dlb0pTT05HZW9tZXRyeSkge1xuICAgICAgICB0aGlzLl9nZW9tZXRyeSA9IGc7XG4gICAgfVxuXG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCBqc29uID0ge1xuICAgICAgICAgICAgZ2VvbWV0cnk6IHRoaXMuZ2VvbWV0cnlcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBpIGluIHRoaXMpIHtcbiAgICAgICAgICAgIGlmIChpID09PSAnX2dlb21ldHJ5JyB8fCBpID09PSAnX3ZlY3RvclRpbGVGZWF0dXJlJykgY29udGludWU7XG4gICAgICAgICAgICBqc29uW2ldID0gKHRoaXM6IGFueSlbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcmVuZGVyL3BhaW50ZXIuanMnO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlU3RhdGVzID0ge1tmZWF0dXJlX2lkOiBzdHJpbmddOiBGZWF0dXJlU3RhdGV9O1xuZXhwb3J0IHR5cGUgTGF5ZXJGZWF0dXJlU3RhdGVzID0ge1tsYXllcjogc3RyaW5nXTogRmVhdHVyZVN0YXRlc307XG5cbi8qKlxuICogU291cmNlRmVhdHVyZVN0YXRlIG1hbmFnZXMgdGhlIHN0YXRlIGFuZCBwZW5kaW5nIGNoYW5nZXNcbiAqIHRvIGZlYXR1cmVzIGluIGEgc291cmNlLCBzZXBhcmF0ZWQgYnkgc291cmNlIGxheWVyLlxuICogc3RhdGVDaGFuZ2VzIGFuZCBkZWxldGVkU3RhdGVzIGJhdGNoIGFsbCBjaGFuZ2VzIHRvIHRoZSB0aWxlICh1cGRhdGVzIGFuZCByZW1vdmVzLCByZXNwZWN0aXZlbHkpXG4gKiBiZXR3ZWVuIGNvYWxlc2NlKCkgZXZlbnRzLiBhZGRGZWF0dXJlU3RhdGUoKSBhbmQgcmVtb3ZlRmVhdHVyZVN0YXRlKCkgYWxzbyB1cGRhdGUgdGhlaXIgY291bnRlcnBhcnQnc1xuICogbGlzdCBvZiBjaGFuZ2VzLCBzdWNoIHRoYXQgY29hbGVzY2UoKSBjYW4gYXBwbHkgdGhlIHByb3BlciBzdGF0ZSBjaGFuZ2VzIHdoaWxlIGFnbm9zdGljIHRvIHRoZSBvcmRlciBvZiBvcGVyYXRpb25zLlxuICogSW4gZGVsZXRlZFN0YXRlcywgYWxsIG51bGwncyBkZW5vdGUgY29tcGxldGUgcmVtb3ZhbCBvZiBzdGF0ZSBhdCB0aGF0IHNjb3BlXG4gKiBAcHJpdmF0ZVxuKi9cbmNsYXNzIFNvdXJjZUZlYXR1cmVTdGF0ZSB7XG4gICAgc3RhdGU6IExheWVyRmVhdHVyZVN0YXRlcztcbiAgICBzdGF0ZUNoYW5nZXM6IExheWVyRmVhdHVyZVN0YXRlcztcbiAgICBkZWxldGVkU3RhdGVzOiB7fTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN0YXRlID0ge307XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzID0ge307XG4gICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlcyA9IHt9O1xuICAgIH1cblxuICAgIHVwZGF0ZVN0YXRlKHNvdXJjZUxheWVyOiBzdHJpbmcsIGZlYXR1cmVJZDogbnVtYmVyIHwgc3RyaW5nLCBuZXdTdGF0ZTogT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBTdHJpbmcoZmVhdHVyZUlkKTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdID0gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdIHx8IHt9O1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gfHwge307XG4gICAgICAgIGV4dGVuZCh0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0sIG5ld1N0YXRlKTtcblxuICAgICAgICBpZiAodGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBmdCBpbiB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgICAgIGlmIChmdCAhPT0gZmVhdHVyZSkgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmdF0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZURlbGV0aW9uUXVldWVkID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSAmJiB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID09PSBudWxsO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmVEZWxldGlvblF1ZXVlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdTdGF0ZVtwcm9wXSkgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXVtwcm9wXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGlvbkluUXVldWUgPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdICYmIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gJiYgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXVtrZXldID09PSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRpb25JblF1ZXVlKSBkZWxldGUgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXVtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZUZlYXR1cmVTdGF0ZShzb3VyY2VMYXllcjogc3RyaW5nLCBmZWF0dXJlSWQ/OiBudW1iZXIgfCBzdHJpbmcsIGtleT86IHN0cmluZykge1xuICAgICAgICBjb25zdCBzb3VyY2VMYXllckRlbGV0ZWQgPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID09PSBudWxsO1xuICAgICAgICBpZiAoc291cmNlTGF5ZXJEZWxldGVkKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IFN0cmluZyhmZWF0dXJlSWQpO1xuXG4gICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdIHx8IHt9O1xuXG4gICAgICAgIGlmIChrZXkgJiYgZmVhdHVyZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSA9IHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gfHwge307XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXVtrZXldID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmZWF0dXJlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlSW5RdWV1ZSA9IHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSAmJiB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV07XG4gICAgICAgICAgICBpZiAodXBkYXRlSW5RdWV1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0pIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XSA9IG51bGw7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFN0YXRlKHNvdXJjZUxheWVyOiBzdHJpbmcsIGZlYXR1cmVJZDogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBTdHJpbmcoZmVhdHVyZUlkKTtcbiAgICAgICAgY29uc3QgYmFzZSA9IHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdIHx8IHt9O1xuICAgICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdIHx8IHt9O1xuXG4gICAgICAgIGNvbnN0IHJlY29uY2lsZWRTdGF0ZSA9IGV4dGVuZCh7fSwgYmFzZVtmZWF0dXJlXSwgY2hhbmdlc1tmZWF0dXJlXSk7XG5cbiAgICAgICAgLy9yZXR1cm4gZW1wdHkgb2JqZWN0IGlmIHRoZSB3aG9sZSBzb3VyY2UgbGF5ZXIgaXMgYXdhaXRpbmcgZGVsZXRpb25cbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gPT09IG51bGwpIHJldHVybiB7fTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZURlbGV0aW9ucyA9IHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZUlkXTtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlRGVsZXRpb25zID09PSBudWxsKSByZXR1cm4ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gZmVhdHVyZURlbGV0aW9ucykgZGVsZXRlIHJlY29uY2lsZWRTdGF0ZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb25jaWxlZFN0YXRlO1xuICAgIH1cblxuICAgIGluaXRpYWxpemVUaWxlU3RhdGUodGlsZTogVGlsZSwgcGFpbnRlcjogP1BhaW50ZXIpIHtcbiAgICAgICAgdGlsZS5zZXRGZWF0dXJlU3RhdGUodGhpcy5zdGF0ZSwgcGFpbnRlcik7XG4gICAgfVxuXG4gICAgY29hbGVzY2VDaGFuZ2VzKHRpbGVzOiB7W186IGFueV06IFRpbGV9LCBwYWludGVyOiBhbnkpIHtcbiAgICAgICAgLy90cmFjayBjaGFuZ2VzIHdpdGggZnVsbCBzdGF0ZSBvYmplY3RzLCBidXQgb25seSBmb3IgZmVhdHVyZXMgdGhhdCBnb3QgbW9kaWZpZWRcbiAgICAgICAgY29uc3QgZmVhdHVyZXNDaGFuZ2VkOiBMYXllckZlYXR1cmVTdGF0ZXMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUxheWVyIGluIHRoaXMuc3RhdGVDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSAgPSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyU3RhdGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN0YXRlW3NvdXJjZUxheWVyXVtmZWF0dXJlXSkgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB7fTtcbiAgICAgICAgICAgICAgICBleHRlbmQodGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0sIHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSk7XG4gICAgICAgICAgICAgICAgbGF5ZXJTdGF0ZXNbZmVhdHVyZV0gPSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXVtmZWF0dXJlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZlYXR1cmVzQ2hhbmdlZFtzb3VyY2VMYXllcl0gPSBsYXllclN0YXRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlTGF5ZXIgaW4gdGhpcy5kZWxldGVkU3RhdGVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSAgPSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyU3RhdGVzID0ge307XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmdCBpbiB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgICAgICAgICBsYXllclN0YXRlc1tmdF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZnRdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgaW4gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWxldGVXaG9sZUZlYXR1cmVTdGF0ZSA9IHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPT09IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWxldGVXaG9sZUZlYXR1cmVTdGF0ZSkgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXVtmZWF0dXJlXVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxheWVyU3RhdGVzW2ZlYXR1cmVdID0gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmZWF0dXJlc0NoYW5nZWRbc291cmNlTGF5ZXJdID0gZmVhdHVyZXNDaGFuZ2VkW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgICAgIGV4dGVuZChmZWF0dXJlc0NoYW5nZWRbc291cmNlTGF5ZXJdLCBsYXllclN0YXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcyA9IHt9O1xuICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXMgPSB7fTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZmVhdHVyZXNDaGFuZ2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGlsZXNbaWRdO1xuICAgICAgICAgICAgdGlsZS5zZXRGZWF0dXJlU3RhdGUoZmVhdHVyZXNDaGFuZ2VkLCBwYWludGVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU291cmNlRmVhdHVyZVN0YXRlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERFTURhdGEgZnJvbSBcIi4vZGVtX2RhdGEuanNcIjtcbmltcG9ydCB7dmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlfSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IHtjbGFtcH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcblxudHlwZSB2ZWMzTGlrZSA9IHZlYzMgfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbmNsYXNzIE1pcExldmVsIHtcbiAgICBzaXplOiBudW1iZXI7XG4gICAgbWluaW11bXM6IEFycmF5PG51bWJlcj47XG4gICAgbWF4aW11bXM6IEFycmF5PG51bWJlcj47XG4gICAgbGVhdmVzOiBBcnJheTxudW1iZXI+O1xuXG4gICAgY29uc3RydWN0b3Ioc2l6ZV86IG51bWJlcikge1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplXztcbiAgICAgICAgdGhpcy5taW5pbXVtcyA9IFtdO1xuICAgICAgICB0aGlzLm1heGltdW1zID0gW107XG4gICAgICAgIHRoaXMubGVhdmVzID0gW107XG4gICAgfVxuXG4gICAgZ2V0RWxldmF0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKTogeyBtaW46IG51bWJlciwgbWF4OiBudW1iZXJ9IHtcbiAgICAgICAgY29uc3QgaWR4ID0gdGhpcy50b0lkeCh4LCB5KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1pbjogdGhpcy5taW5pbXVtc1tpZHhdLFxuICAgICAgICAgICAgbWF4OiB0aGlzLm1heGltdW1zW2lkeF1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpc0xlYWYoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5sZWF2ZXNbdGhpcy50b0lkeCh4LCB5KV07XG4gICAgfVxuXG4gICAgdG9JZHgoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4geSAqIHRoaXMuc2l6ZSArIHg7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhYWJiUmF5SW50ZXJzZWN0KG1pbjogdmVjM0xpa2UsIG1heDogdmVjM0xpa2UsIHBvczogdmVjM0xpa2UsIGRpcjogdmVjM0xpa2UpOiA/bnVtYmVyIHtcbiAgICBsZXQgdE1pbiA9IDA7XG4gICAgbGV0IHRNYXggPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gICAgY29uc3QgZXBzaWxvbiA9IDFlLTE1O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGRpcltpXSkgPCBlcHNpbG9uKSB7XG4gICAgICAgICAgICAvLyBQYXJhbGxlbCByYXlcbiAgICAgICAgICAgIGlmIChwb3NbaV0gPCBtaW5baV0gfHwgcG9zW2ldID4gbWF4W2ldKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb29kID0gMS4wIC8gZGlyW2ldO1xuICAgICAgICAgICAgbGV0IHQxID0gKG1pbltpXSAtIHBvc1tpXSkgKiBvb2Q7XG4gICAgICAgICAgICBsZXQgdDIgPSAobWF4W2ldIC0gcG9zW2ldKSAqIG9vZDtcbiAgICAgICAgICAgIGlmICh0MSA+IHQyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IHQxO1xuICAgICAgICAgICAgICAgIHQxID0gdDI7XG4gICAgICAgICAgICAgICAgdDIgPSB0ZW1wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHQxID4gdE1pbilcbiAgICAgICAgICAgICAgICB0TWluID0gdDE7XG4gICAgICAgICAgICBpZiAodDIgPCB0TWF4KVxuICAgICAgICAgICAgICAgIHRNYXggPSB0MjtcbiAgICAgICAgICAgIGlmICh0TWluID4gdE1heClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0TWluO1xufVxuXG5mdW5jdGlvbiB0cmlhbmdsZVJheUludGVyc2VjdChheCwgYXksIGF6LCBieCwgYnksIGJ6LCBjeCwgY3ksIGN6LCBwb3M6IHZlYzNMaWtlLCBkaXI6IHZlYzNMaWtlKTogP251bWJlciB7XG4gICAgLy8gQ29tcHV0ZSBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyB1IGFuZCB2IHRvIGZpbmQgdGhlIGludGVyc2VjdGlvblxuICAgIGNvbnN0IGFiWCA9IGJ4IC0gYXg7XG4gICAgY29uc3QgYWJZID0gYnkgLSBheTtcbiAgICBjb25zdCBhYlogPSBieiAtIGF6O1xuXG4gICAgY29uc3QgYWNYID0gY3ggLSBheDtcbiAgICBjb25zdCBhY1kgPSBjeSAtIGF5O1xuICAgIGNvbnN0IGFjWiA9IGN6IC0gYXo7XG5cbiAgICAvLyBwdmVjID0gY3Jvc3MoZGlyLCBhKSwgZGV0ID0gZG90KGFiLCBwdmVjKVxuICAgIGNvbnN0IHB2ZWNYID0gZGlyWzFdICogYWNaIC0gZGlyWzJdICogYWNZO1xuICAgIGNvbnN0IHB2ZWNZID0gZGlyWzJdICogYWNYIC0gZGlyWzBdICogYWNaO1xuICAgIGNvbnN0IHB2ZWNaID0gZGlyWzBdICogYWNZIC0gZGlyWzFdICogYWNYO1xuICAgIGNvbnN0IGRldCA9IGFiWCAqIHB2ZWNYICsgYWJZICogcHZlY1kgKyBhYlogKiBwdmVjWjtcblxuICAgIGlmIChNYXRoLmFicyhkZXQpIDwgMWUtMTUpXG4gICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgaW52RGV0ID0gMS4wIC8gZGV0O1xuICAgIGNvbnN0IHR2ZWNYID0gcG9zWzBdIC0gYXg7XG4gICAgY29uc3QgdHZlY1kgPSBwb3NbMV0gLSBheTtcbiAgICBjb25zdCB0dmVjWiA9IHBvc1syXSAtIGF6O1xuICAgIGNvbnN0IHUgPSAodHZlY1ggKiBwdmVjWCArIHR2ZWNZICogcHZlY1kgKyB0dmVjWiAqIHB2ZWNaKSAqIGludkRldDtcblxuICAgIGlmICh1IDwgMC4wIHx8IHUgPiAxLjApXG4gICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgLy8gcXZlYyA9IGNyb3NzKHR2ZWMsIGFiKVxuICAgIGNvbnN0IHF2ZWNYID0gdHZlY1kgKiBhYlogLSB0dmVjWiAqIGFiWTtcbiAgICBjb25zdCBxdmVjWSA9IHR2ZWNaICogYWJYIC0gdHZlY1ggKiBhYlo7XG4gICAgY29uc3QgcXZlY1ogPSB0dmVjWCAqIGFiWSAtIHR2ZWNZICogYWJYO1xuICAgIGNvbnN0IHYgPSAoZGlyWzBdICogcXZlY1ggKyBkaXJbMV0gKiBxdmVjWSArIGRpclsyXSAqIHF2ZWNaKSAqIGludkRldDtcblxuICAgIGlmICh2IDwgMC4wIHx8IHUgKyB2ID4gMS4wKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiAoYWNYICogcXZlY1ggKyBhY1kgKiBxdmVjWSArIGFjWiAqIHF2ZWNaKSAqIGludkRldDtcbn1cblxuZnVuY3Rpb24gZnJhYyh2LCBsbywgaGkpIHtcbiAgICByZXR1cm4gKHYgLSBsbykgLyAoaGkgLSBsbyk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZUJvdW5kcyh4LCB5LCBkZXB0aCwgYm91bmRzTWlueCwgYm91bmRzTWlueSwgYm91bmRzTWF4eCwgYm91bmRzTWF4eSwgb3V0TWluLCBvdXRNYXgpIHtcbiAgICBjb25zdCBzY2FsZSA9IDEgPDwgZGVwdGg7XG4gICAgY29uc3QgcmFuZ2V4ID0gYm91bmRzTWF4eCAtIGJvdW5kc01pbng7XG4gICAgY29uc3QgcmFuZ2V5ID0gYm91bmRzTWF4eSAtIGJvdW5kc01pbnk7XG5cbiAgICBjb25zdCBtaW5YID0gKHggKyAwKSAvIHNjYWxlICogcmFuZ2V4ICsgYm91bmRzTWlueDtcbiAgICBjb25zdCBtYXhYID0gKHggKyAxKSAvIHNjYWxlICogcmFuZ2V4ICsgYm91bmRzTWlueDtcbiAgICBjb25zdCBtaW5ZID0gKHkgKyAwKSAvIHNjYWxlICogcmFuZ2V5ICsgYm91bmRzTWlueTtcbiAgICBjb25zdCBtYXhZID0gKHkgKyAxKSAvIHNjYWxlICogcmFuZ2V5ICsgYm91bmRzTWlueTtcblxuICAgIG91dE1pblswXSA9IG1pblg7XG4gICAgb3V0TWluWzFdID0gbWluWTtcbiAgICBvdXRNYXhbMF0gPSBtYXhYO1xuICAgIG91dE1heFsxXSA9IG1heFk7XG59XG5cbi8vIEEgc21hbGwgcGFkZGluZyB2YWx1ZSBpcyB1c2VkIHdpdGggYm91bmRpbmcgYm94ZXMgdG8gZXh0ZW5kIHRoZSBib3R0b20gYmVsb3cgc2VhIGxldmVsXG5jb25zdCBhYWJiU2tpcnRQYWRkaW5nID0gMTAwO1xuXG4vLyBBIHNwYXJzZSBtaW4gbWF4IHF1YWQgdHJlZSBmb3IgcGVyZm9ybWluZyBhY2NlbGVyYXRlZCBxdWVyaWVzIGFnYWluc3QgZGVtIGVsZXZhdGlvbiBkYXRhLlxuLy8gRWFjaCB0cmVlIG5vZGUgc3RvcmVzIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGVsZXZhdGlvbiBvZiBpdHMgY2hpbGRyZW4gbm9kZXMgYW5kIGEgZmxhZyB3aGV0aGVyIHRoZSBub2RlIGlzIGEgbGVhZi5cbi8vIE5vZGUgZGF0YSBpcyBzdG9yZWQgaW4gbm9uLWludGVybGVhdmVkIGFycmF5cyB3aGVyZSB0aGUgcm9vdCBpcyBhdCBpbmRleCAwLlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVtTWluTWF4UXVhZFRyZWUge1xuICAgIG1heGltdW1zOiBBcnJheTxudW1iZXI+O1xuICAgIG1pbmltdW1zOiBBcnJheTxudW1iZXI+O1xuICAgIGxlYXZlczogQXJyYXk8bnVtYmVyPjtcbiAgICBjaGlsZE9mZnNldHM6IEFycmF5PG51bWJlcj47XG4gICAgbm9kZUNvdW50OiBudW1iZXI7XG4gICAgZGVtOiBERU1EYXRhO1xuICAgIF9zaWJsaW5nT2Zmc2V0OiBBcnJheTxBcnJheTxudW1iZXI+PjtcblxuICAgIGNvbnN0cnVjdG9yKGRlbV86IERFTURhdGEpIHtcbiAgICAgICAgdGhpcy5tYXhpbXVtcyA9IFtdO1xuICAgICAgICB0aGlzLm1pbmltdW1zID0gW107XG4gICAgICAgIHRoaXMubGVhdmVzID0gW107XG4gICAgICAgIHRoaXMuY2hpbGRPZmZzZXRzID0gW107XG4gICAgICAgIHRoaXMubm9kZUNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5kZW0gPSBkZW1fO1xuXG4gICAgICAgIC8vIFByZWNvbXB1dGUgdGhlIG9yZGVyIG9mIDQgc2libGluZyBub2RlcyBpbiB0aGUgbWVtb3J5LiBUb3AtbGVmdCwgdG9wLXJpZ2h0LCBib3R0b20tbGVmdCwgYm90dG9tLXJpZ2h0XG4gICAgICAgIHRoaXMuX3NpYmxpbmdPZmZzZXQgPSBbXG4gICAgICAgICAgICBbMCwgMF0sXG4gICAgICAgICAgICBbMSwgMF0sXG4gICAgICAgICAgICBbMCwgMV0sXG4gICAgICAgICAgICBbMSwgMV1cbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoIXRoaXMuZGVtKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG1pcHMgPSBidWlsZERlbU1pcG1hcCh0aGlzLmRlbSk7XG4gICAgICAgIGNvbnN0IG1heEx2bCA9IG1pcHMubGVuZ3RoIC0gMTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIHJvb3Qgbm9kZVxuICAgICAgICBjb25zdCByb290TWlwID0gbWlwc1ttYXhMdmxdO1xuICAgICAgICBjb25zdCBtaW4gPSByb290TWlwLm1pbmltdW1zO1xuICAgICAgICBjb25zdCBtYXggPSByb290TWlwLm1heGltdW1zO1xuICAgICAgICBjb25zdCBsZWF2ZXMgPSByb290TWlwLmxlYXZlcztcbiAgICAgICAgdGhpcy5fYWRkTm9kZShtaW5bMF0sIG1heFswXSwgbGVhdmVzWzBdKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIHJlc3Qgb2YgdGhlIHRyZWUgcmVjdXJzaXZlbHlcbiAgICAgICAgdGhpcy5fY29uc3RydWN0KG1pcHMsIDAsIDAsIG1heEx2bCwgMCk7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybXMgcmF5Y2FzdCBhZ2FpbnN0IHRoZSB0cmVlIHJvb3Qgb25seS4gTWluIGFuZCBtYXggY29vcmRpbmF0ZXMgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgcm9vdCBub2RlXG4gICAgcmF5Y2FzdFJvb3QobWlueDogbnVtYmVyLCBtaW55OiBudW1iZXIsIG1heHg6IG51bWJlciwgbWF4eTogbnVtYmVyLCBwOiB2ZWMzTGlrZSwgZDogdmVjM0xpa2UsIGV4YWdnZXJhdGlvbjogbnVtYmVyID0gMSk6ID9udW1iZXIge1xuICAgICAgICBjb25zdCBtaW4gPSBbbWlueCwgbWlueSwgLWFhYmJTa2lydFBhZGRpbmddO1xuICAgICAgICBjb25zdCBtYXggPSBbbWF4eCwgbWF4eSwgdGhpcy5tYXhpbXVtc1swXSAqIGV4YWdnZXJhdGlvbl07XG4gICAgICAgIHJldHVybiBhYWJiUmF5SW50ZXJzZWN0KG1pbiwgbWF4LCBwLCBkKTtcbiAgICB9XG5cbiAgICByYXljYXN0KHJvb3RNaW54OiBudW1iZXIsIHJvb3RNaW55OiBudW1iZXIsIHJvb3RNYXh4OiBudW1iZXIsIHJvb3RNYXh5OiBudW1iZXIsIHA6IHZlYzNMaWtlLCBkOiB2ZWMzTGlrZSwgZXhhZ2dlcmF0aW9uOiBudW1iZXIgPSAxKTogP251bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5ub2RlQ291bnQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB0ID0gdGhpcy5yYXljYXN0Um9vdChyb290TWlueCwgcm9vdE1pbnksIHJvb3RNYXh4LCByb290TWF4eSwgcCwgZCwgZXhhZ2dlcmF0aW9uKTtcbiAgICAgICAgaWYgKHQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHRIaXRzID0gW107XG4gICAgICAgIGNvbnN0IHNvcnRlZEhpdHMgPSBbXTtcbiAgICAgICAgY29uc3QgYm91bmRzTWluID0gW107XG4gICAgICAgIGNvbnN0IGJvdW5kc01heCA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHN0YWNrID0gW3tcbiAgICAgICAgICAgIGlkeDogMCxcbiAgICAgICAgICAgIHQsXG4gICAgICAgICAgICBub2RleDogMCxcbiAgICAgICAgICAgIG5vZGV5OiAwLFxuICAgICAgICAgICAgZGVwdGg6IDBcbiAgICAgICAgfV07XG5cbiAgICAgICAgLy8gVHJhdmVyc2UgdGhlIHRyZWUgdW50aWwgc29tZXRoaW5nIGlzIGhpdCBvciB0aGUgcmF5IGVzY2FwZXNcbiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHtpZHgsIHQsIG5vZGV4LCBub2RleSwgZGVwdGh9ID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxlYXZlc1tpZHhdKSB7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIDIgdHJpYW5nbGVzIHRvIGFwcHJveGltYXRlIHRoZSBzdXJmYWNlIHBsYW5lIGZvciBtb3JlIHByZWNpc2UgdGVzdHNcbiAgICAgICAgICAgICAgICBkZWNvZGVCb3VuZHMobm9kZXgsIG5vZGV5LCBkZXB0aCwgcm9vdE1pbngsIHJvb3RNaW55LCByb290TWF4eCwgcm9vdE1heHksIGJvdW5kc01pbiwgYm91bmRzTWF4KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gMSA8PCBkZXB0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBtaW54VXYgPSAobm9kZXggKyAwKSAvIHNjYWxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heHhVdiA9IChub2RleCArIDEpIC8gc2NhbGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlueVV2ID0gKG5vZGV5ICsgMCkgLyBzY2FsZTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXh5VXYgPSAobm9kZXkgKyAxKSAvIHNjYWxlO1xuXG4gICAgICAgICAgICAgICAgLy8gNCBjb3JuZXIgcG9pbnRzIEEsIEIsIEMgYW5kIEQgZGVmaW5lcyB0aGUgKHF1YWQpIGFyZWEgY292ZXJlZCBieSB0aGlzIG5vZGVcbiAgICAgICAgICAgICAgICBjb25zdCBheiA9IHNhbXBsZUVsZXZhdGlvbihtaW54VXYsIG1pbnlVdiwgdGhpcy5kZW0pICogZXhhZ2dlcmF0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ6ID0gc2FtcGxlRWxldmF0aW9uKG1heHhVdiwgbWlueVV2LCB0aGlzLmRlbSkgKiBleGFnZ2VyYXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgY3ogPSBzYW1wbGVFbGV2YXRpb24obWF4eFV2LCBtYXh5VXYsIHRoaXMuZGVtKSAqIGV4YWdnZXJhdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCBkeiA9IHNhbXBsZUVsZXZhdGlvbihtaW54VXYsIG1heHlVdiwgdGhpcy5kZW0pICogZXhhZ2dlcmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdDA6IGFueSA9IHRyaWFuZ2xlUmF5SW50ZXJzZWN0KFxuICAgICAgICAgICAgICAgICAgICBib3VuZHNNaW5bMF0sIGJvdW5kc01pblsxXSwgYXosICAgICAvLyBBXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kc01heFswXSwgYm91bmRzTWluWzFdLCBieiwgICAgIC8vIEJcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzTWF4WzBdLCBib3VuZHNNYXhbMV0sIGN6LCAgICAgLy8gQ1xuICAgICAgICAgICAgICAgICAgICBwLCBkKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHQxOiBhbnkgPSB0cmlhbmdsZVJheUludGVyc2VjdChcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzTWF4WzBdLCBib3VuZHNNYXhbMV0sIGN6LFxuICAgICAgICAgICAgICAgICAgICBib3VuZHNNaW5bMF0sIGJvdW5kc01heFsxXSwgZHosXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kc01pblswXSwgYm91bmRzTWluWzFdLCBheixcbiAgICAgICAgICAgICAgICAgICAgcCwgZCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0TWluID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICAgIHQwICE9PSBudWxsID8gdDAgOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgICAgICAgICB0MSAhPT0gbnVsbCA/IHQxIDogTnVtYmVyLk1BWF9WQUxVRSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgcmF5IG1pZ2h0IGdvIGJlbG93IHRoZSB0d28gc3VyZmFjZSB0cmlhbmdsZXMgYnV0IGhpdCBvbmUgb2YgdGhlIHNpZGVzLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgY292ZXJzIHRoZSBjYXNlIG9mIHNraXJ0IGdlb21ldHJ5IGJldHdlZW4gdHdvIGRlbSB0aWxlcyBvZiBkaWZmZXJlbnQgem9vbSBsZXZlbFxuICAgICAgICAgICAgICAgIGlmICh0TWluID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpdFBvcyA9IHZlYzMuc2NhbGVBbmRBZGQoW10sIHAsIGQsIHQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcmFjeCA9IGZyYWMoaGl0UG9zWzBdLCBib3VuZHNNaW5bMF0sIGJvdW5kc01heFswXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYWN5ID0gZnJhYyhoaXRQb3NbMV0sIGJvdW5kc01pblsxXSwgYm91bmRzTWF4WzFdKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYmlsaW5lYXJMZXJwKGF6LCBieiwgZHosIGN6LCBmcmFjeCwgZnJhY3kpID49IGhpdFBvc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0TWluO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQZXJmb3JtIGludGVyc2VjdGlvbiB0ZXN0cyBhZ2FpbnMgZWFjaCBvZiB0aGUgNCBjaGlsZCBub2RlcyBhbmQgc3RvcmUgcmVzdWx0cyBmcm9tIGNsb3Nlc3QgdG8gZnVydGhlc3QuXG4gICAgICAgICAgICBsZXQgaGl0Q291bnQgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3NpYmxpbmdPZmZzZXQubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZVggPSAobm9kZXggPDwgMSkgKyB0aGlzLl9zaWJsaW5nT2Zmc2V0W2ldWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZVkgPSAobm9kZXkgPDwgMSkgKyB0aGlzLl9zaWJsaW5nT2Zmc2V0W2ldWzFdO1xuXG4gICAgICAgICAgICAgICAgLy8gRGVjb2RlIG5vZGUgYWFiYiBmcm9tIHRoZSBtb3J0b24gY29kZVxuICAgICAgICAgICAgICAgIGRlY29kZUJvdW5kcyhjaGlsZE5vZGVYLCBjaGlsZE5vZGVZLCBkZXB0aCArIDEsIHJvb3RNaW54LCByb290TWlueSwgcm9vdE1heHgsIHJvb3RNYXh5LCBib3VuZHNNaW4sIGJvdW5kc01heCk7XG5cbiAgICAgICAgICAgICAgICBib3VuZHNNaW5bMl0gPSAtYWFiYlNraXJ0UGFkZGluZztcbiAgICAgICAgICAgICAgICBib3VuZHNNYXhbMl0gPSB0aGlzLm1heGltdW1zW3RoaXMuY2hpbGRPZmZzZXRzW2lkeF0gKyBpXSAqIGV4YWdnZXJhdGlvbjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGFhYmJSYXlJbnRlcnNlY3QoYm91bmRzTWluLCBib3VuZHNNYXgsIHAsIGQpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgcmVzdWx0IGxpc3QgZnJvbSBmdXJ0aGVzdCB0byBjbG9zZXN0IGhpdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG9yZGVyIHdpbGwgYmUgaW52ZXJzZWQgd2hlbiBidWlsZGluZyB0aGUgc3RhY2tcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdEhpdDogbnVtYmVyID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB0SGl0c1tpXSA9IHRIaXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaGl0Q291bnQgJiYgIWFkZGVkOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0SGl0ID49IHRIaXRzW3NvcnRlZEhpdHNbal1dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkSGl0cy5zcGxpY2UoaiwgMCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWRkZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRIaXRzW2hpdENvdW50XSA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGhpdENvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb250aW51ZSByZWN1cnNpb24gZnJvbSBjbG9zZXN0IHRvIGZ1cnRoZXN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpdENvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoaXRJZHggPSBzb3J0ZWRIaXRzW2ldO1xuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBpZHg6IHRoaXMuY2hpbGRPZmZzZXRzW2lkeF0gKyBoaXRJZHgsXG4gICAgICAgICAgICAgICAgICAgIHQ6IHRIaXRzW2hpdElkeF0sXG4gICAgICAgICAgICAgICAgICAgIG5vZGV4OiAobm9kZXggPDwgMSkgKyB0aGlzLl9zaWJsaW5nT2Zmc2V0W2hpdElkeF1bMF0sXG4gICAgICAgICAgICAgICAgICAgIG5vZGV5OiAobm9kZXkgPDwgMSkgKyB0aGlzLl9zaWJsaW5nT2Zmc2V0W2hpdElkeF1bMV0sXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoOiBkZXB0aCArIDFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIF9hZGROb2RlKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgbGVhZjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMubWluaW11bXMucHVzaChtaW4pO1xuICAgICAgICB0aGlzLm1heGltdW1zLnB1c2gobWF4KTtcbiAgICAgICAgdGhpcy5sZWF2ZXMucHVzaChsZWFmKTtcbiAgICAgICAgdGhpcy5jaGlsZE9mZnNldHMucHVzaCgwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUNvdW50Kys7XG4gICAgfVxuXG4gICAgX2NvbnN0cnVjdChtaXBzOiBBcnJheTxNaXBMZXZlbD4sIHg6IG51bWJlciwgeTogbnVtYmVyLCBsdmw6IG51bWJlciwgcGFyZW50SWR4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKG1pcHNbbHZsXS5pc0xlYWYoeCwgeSkgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBwYXJlbnQgb2Zmc2V0XG4gICAgICAgIGlmICghdGhpcy5jaGlsZE9mZnNldHNbcGFyZW50SWR4XSlcbiAgICAgICAgICAgIHRoaXMuY2hpbGRPZmZzZXRzW3BhcmVudElkeF0gPSB0aGlzLm5vZGVDb3VudDtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYWxsIDQgY2hpbGRyZW4gYW5kIHBsYWNlIHRoZW0gbmV4dCB0byBlYWNoIG90aGVyIGluIG1lbW9yeVxuICAgICAgICBjb25zdCBjaGlsZEx2bCA9IGx2bCAtIDE7XG4gICAgICAgIGNvbnN0IGNoaWxkTWlwID0gbWlwc1tjaGlsZEx2bF07XG5cbiAgICAgICAgbGV0IGxlYWZNYXNrID0gMDtcbiAgICAgICAgbGV0IGZpcnN0Tm9kZUlkeDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3NpYmxpbmdPZmZzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkWCA9IHggKiAyICsgdGhpcy5fc2libGluZ09mZnNldFtpXVswXTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkWSA9IHkgKiAyICsgdGhpcy5fc2libGluZ09mZnNldFtpXVsxXTtcblxuICAgICAgICAgICAgY29uc3QgZWxldmF0aW9uID0gY2hpbGRNaXAuZ2V0RWxldmF0aW9uKGNoaWxkWCwgY2hpbGRZKTtcbiAgICAgICAgICAgIGNvbnN0IGxlYWYgPSBjaGlsZE1pcC5pc0xlYWYoY2hpbGRYLCBjaGlsZFkpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZUlkeCA9IHRoaXMuX2FkZE5vZGUoZWxldmF0aW9uLm1pbiwgZWxldmF0aW9uLm1heCwgbGVhZik7XG5cbiAgICAgICAgICAgIGlmIChsZWFmKVxuICAgICAgICAgICAgICAgIGxlYWZNYXNrIHw9IDEgPDwgaTtcbiAgICAgICAgICAgIGlmICghZmlyc3ROb2RlSWR4KVxuICAgICAgICAgICAgICAgIGZpcnN0Tm9kZUlkeCA9IG5vZGVJZHg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250aW51ZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIHRyZWUgcmVjdXJzaXZlbHkgdG8gbm9uLWxlYWYgbm9kZXMuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc2libGluZ09mZnNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCEobGVhZk1hc2sgJiAoMSA8PCBpKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3QobWlwcywgeCAqIDIgKyB0aGlzLl9zaWJsaW5nT2Zmc2V0W2ldWzBdLCB5ICogMiArIHRoaXMuX3NpYmxpbmdPZmZzZXRbaV1bMV0sIGNoaWxkTHZsLCBmaXJzdE5vZGVJZHggKyBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gYmlsaW5lYXJMZXJwKHAwMDogYW55LCBwMTA6IGFueSwgcDAxOiBhbnksIHAxMTogYW55LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIGludGVycG9sYXRlKFxuICAgICAgICBpbnRlcnBvbGF0ZShwMDAsIHAwMSwgeSksXG4gICAgICAgIGludGVycG9sYXRlKHAxMCwgcDExLCB5KSxcbiAgICAgICAgeCk7XG59XG5cbi8vIFNhbXBsZSBlbGV2YXRpb24gaW4gbm9ybWFsaXplZCB1di1zcGFjZSAoWzAsIDBdIGlzIHRoZSB0b3AgbGVmdClcbi8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjb3VudCBmb3IgZXhhZ2dlcmF0aW9uXG5leHBvcnQgZnVuY3Rpb24gc2FtcGxlRWxldmF0aW9uKGZ4OiBudW1iZXIsIGZ5OiBudW1iZXIsIGRlbTogREVNRGF0YSk6IG51bWJlciB7XG4gICAgLy8gU2FtcGxlIHBvc2l0aW9uIGluIHRleGVsc1xuICAgIGNvbnN0IGRlbVNpemUgPSBkZW0uZGltO1xuICAgIGNvbnN0IHggPSBjbGFtcChmeCAqIGRlbVNpemUgLSAwLjUsIDAsIGRlbVNpemUgLSAxKTtcbiAgICBjb25zdCB5ID0gY2xhbXAoZnkgKiBkZW1TaXplIC0gMC41LCAwLCBkZW1TaXplIC0gMSk7XG5cbiAgICAvLyBDb21wdXRlIDQgY29ybmVyIHBvaW50cyBmb3IgYmlsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgIGNvbnN0IGl4TWluID0gTWF0aC5mbG9vcih4KTtcbiAgICBjb25zdCBpeU1pbiA9IE1hdGguZmxvb3IoeSk7XG4gICAgY29uc3QgaXhNYXggPSBNYXRoLm1pbihpeE1pbiArIDEsIGRlbVNpemUgLSAxKTtcbiAgICBjb25zdCBpeU1heCA9IE1hdGgubWluKGl5TWluICsgMSwgZGVtU2l6ZSAtIDEpO1xuXG4gICAgY29uc3QgZTAwID0gZGVtLmdldChpeE1pbiwgaXlNaW4pO1xuICAgIGNvbnN0IGUxMCA9IGRlbS5nZXQoaXhNYXgsIGl5TWluKTtcbiAgICBjb25zdCBlMDEgPSBkZW0uZ2V0KGl4TWluLCBpeU1heCk7XG4gICAgY29uc3QgZTExID0gZGVtLmdldChpeE1heCwgaXlNYXgpO1xuXG4gICAgcmV0dXJuIGJpbGluZWFyTGVycChlMDAsIGUxMCwgZTAxLCBlMTEsIHggLSBpeE1pbiwgeSAtIGl5TWluKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGVtTWlwbWFwKGRlbTogREVNRGF0YSk6IEFycmF5PE1pcExldmVsPiB7XG4gICAgY29uc3QgZGVtU2l6ZSA9IGRlbS5kaW07XG5cbiAgICBjb25zdCBlbGV2YXRpb25EaWZmVGhyZXNob2xkID0gNTtcbiAgICBjb25zdCB0ZXhlbFNpemVPZk1pcDAgPSA4O1xuICAgIGNvbnN0IGxldmVsQ291bnQgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKGRlbVNpemUgLyB0ZXhlbFNpemVPZk1pcDApKTtcbiAgICBjb25zdCBtaXBzOiBBcnJheTxNaXBMZXZlbD4gPSBbXTtcblxuICAgIGxldCBibG9ja0NvdW50ID0gTWF0aC5jZWlsKE1hdGgucG93KDIsIGxldmVsQ291bnQpKTtcbiAgICBjb25zdCBibG9ja1NpemUgPSAxIC8gYmxvY2tDb3VudDtcblxuICAgIGNvbnN0IGJsb2NrU2FtcGxlcyA9ICh4LCB5LCBzaXplLCBleGNsdXNpdmUsIG91dEJvdW5kcykgPT4ge1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gZXhjbHVzaXZlID8gMSA6IDA7XG4gICAgICAgIGNvbnN0IG1pbnggPSB4ICogc2l6ZTtcbiAgICAgICAgY29uc3QgbWF4eCA9ICh4ICsgMSkgKiBzaXplIC0gcGFkZGluZztcbiAgICAgICAgY29uc3QgbWlueSA9IHkgKiBzaXplO1xuICAgICAgICBjb25zdCBtYXh5ID0gKHkgKyAxKSAqIHNpemUgLSBwYWRkaW5nO1xuXG4gICAgICAgIG91dEJvdW5kc1swXSA9IG1pbng7XG4gICAgICAgIG91dEJvdW5kc1sxXSA9IG1pbnk7XG4gICAgICAgIG91dEJvdW5kc1syXSA9IG1heHg7XG4gICAgICAgIG91dEJvdW5kc1szXSA9IG1heHk7XG4gICAgfTtcblxuICAgIC8vIFRoZSBmaXJzdCBtaXAgKDApIGlzIGJ1aWx0IGJ5IHNhbXBsaW5nIDQgY29ybmVyIHBvaW50cyBvZiBlYWNoIDh4OCB0ZXhlbCBibG9ja1xuICAgIGxldCBtaXAgPSBuZXcgTWlwTGV2ZWwoYmxvY2tDb3VudCk7XG4gICAgY29uc3QgYmxvY2tCb3VuZHMgPSBbXTtcblxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGJsb2NrQ291bnQgKiBibG9ja0NvdW50OyBpZHgrKykge1xuICAgICAgICBjb25zdCB5ID0gTWF0aC5mbG9vcihpZHggLyBibG9ja0NvdW50KTtcbiAgICAgICAgY29uc3QgeCA9IGlkeCAlIGJsb2NrQ291bnQ7XG5cbiAgICAgICAgYmxvY2tTYW1wbGVzKHgsIHksIGJsb2NrU2l6ZSwgZmFsc2UsIGJsb2NrQm91bmRzKTtcblxuICAgICAgICBjb25zdCBlMCA9IHNhbXBsZUVsZXZhdGlvbihibG9ja0JvdW5kc1swXSwgYmxvY2tCb3VuZHNbMV0sIGRlbSk7ICAgIC8vIG1pbngsIG1pbnlcbiAgICAgICAgY29uc3QgZTEgPSBzYW1wbGVFbGV2YXRpb24oYmxvY2tCb3VuZHNbMl0sIGJsb2NrQm91bmRzWzFdLCBkZW0pOyAgICAvLyBtYXh4LCBtaW55XG4gICAgICAgIGNvbnN0IGUyID0gc2FtcGxlRWxldmF0aW9uKGJsb2NrQm91bmRzWzJdLCBibG9ja0JvdW5kc1szXSwgZGVtKTsgICAgLy8gbWF4eCwgbWF4eVxuICAgICAgICBjb25zdCBlMyA9IHNhbXBsZUVsZXZhdGlvbihibG9ja0JvdW5kc1swXSwgYmxvY2tCb3VuZHNbM10sIGRlbSk7ICAgIC8vIG1pbngsIG1heHlcblxuICAgICAgICBtaXAubWluaW11bXMucHVzaChNYXRoLm1pbihlMCwgZTEsIGUyLCBlMykpO1xuICAgICAgICBtaXAubWF4aW11bXMucHVzaChNYXRoLm1heChlMCwgZTEsIGUyLCBlMykpO1xuICAgICAgICBtaXAubGVhdmVzLnB1c2goMSk7XG4gICAgfVxuXG4gICAgbWlwcy5wdXNoKG1pcCk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIHJlc3Qgb2YgdGhlIG1pcCBsZXZlbHMgZnJvbSBib3R0b20gdG8gdXBcbiAgICBmb3IgKGJsb2NrQ291bnQgLz0gMjsgYmxvY2tDb3VudCA+PSAxOyBibG9ja0NvdW50IC89IDIpIHtcbiAgICAgICAgY29uc3QgcHJldk1pcCA9IG1pcHNbbWlwcy5sZW5ndGggLSAxXTtcblxuICAgICAgICBtaXAgPSBuZXcgTWlwTGV2ZWwoYmxvY2tDb3VudCk7XG5cbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgYmxvY2tDb3VudCAqIGJsb2NrQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgICAgICBjb25zdCB5ID0gTWF0aC5mbG9vcihpZHggLyBibG9ja0NvdW50KTtcbiAgICAgICAgICAgIGNvbnN0IHggPSBpZHggJSBibG9ja0NvdW50O1xuXG4gICAgICAgICAgICAvLyBTYW1wbGUgZWxldmF0aW9uIG9mIGFsbCA0IGNoaWxkcmVuIG1pcCB0ZXhlbHMuIDQgbGVhZiBub2RlcyBjYW4gYmUgY29uY2F0ZW5hdGVkIGludG8gYSBzaW5nbGVcbiAgICAgICAgICAgIC8vIGxlYWYgaWYgdGhlIHRvdGFsIGVsZXZhdGlvbiBkaWZmZXJlbmNlIGlzIGJlbG93IHRoZSB0aHJlc2hvbGQgdmFsdWVcbiAgICAgICAgICAgIGJsb2NrU2FtcGxlcyh4LCB5LCAyLCB0cnVlLCBibG9ja0JvdW5kcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGUwID0gcHJldk1pcC5nZXRFbGV2YXRpb24oYmxvY2tCb3VuZHNbMF0sIGJsb2NrQm91bmRzWzFdKTtcbiAgICAgICAgICAgIGNvbnN0IGUxID0gcHJldk1pcC5nZXRFbGV2YXRpb24oYmxvY2tCb3VuZHNbMl0sIGJsb2NrQm91bmRzWzFdKTtcbiAgICAgICAgICAgIGNvbnN0IGUyID0gcHJldk1pcC5nZXRFbGV2YXRpb24oYmxvY2tCb3VuZHNbMl0sIGJsb2NrQm91bmRzWzNdKTtcbiAgICAgICAgICAgIGNvbnN0IGUzID0gcHJldk1pcC5nZXRFbGV2YXRpb24oYmxvY2tCb3VuZHNbMF0sIGJsb2NrQm91bmRzWzNdKTtcblxuICAgICAgICAgICAgY29uc3QgbDAgPSBwcmV2TWlwLmlzTGVhZihibG9ja0JvdW5kc1swXSwgYmxvY2tCb3VuZHNbMV0pO1xuICAgICAgICAgICAgY29uc3QgbDEgPSBwcmV2TWlwLmlzTGVhZihibG9ja0JvdW5kc1syXSwgYmxvY2tCb3VuZHNbMV0pO1xuICAgICAgICAgICAgY29uc3QgbDIgPSBwcmV2TWlwLmlzTGVhZihibG9ja0JvdW5kc1syXSwgYmxvY2tCb3VuZHNbM10pO1xuICAgICAgICAgICAgY29uc3QgbDMgPSBwcmV2TWlwLmlzTGVhZihibG9ja0JvdW5kc1swXSwgYmxvY2tCb3VuZHNbM10pO1xuXG4gICAgICAgICAgICBjb25zdCBtaW5FbGV2YXRpb24gPSBNYXRoLm1pbihlMC5taW4sIGUxLm1pbiwgZTIubWluLCBlMy5taW4pO1xuICAgICAgICAgICAgY29uc3QgbWF4RWxldmF0aW9uID0gTWF0aC5tYXgoZTAubWF4LCBlMS5tYXgsIGUyLm1heCwgZTMubWF4KTtcbiAgICAgICAgICAgIGNvbnN0IGNhbkNvbmNhdGVuYXRlID0gbDAgJiYgbDEgJiYgbDIgJiYgbDM7XG5cbiAgICAgICAgICAgIG1pcC5tYXhpbXVtcy5wdXNoKG1heEVsZXZhdGlvbik7XG4gICAgICAgICAgICBtaXAubWluaW11bXMucHVzaChtaW5FbGV2YXRpb24pO1xuXG4gICAgICAgICAgICBpZiAobWF4RWxldmF0aW9uIC0gbWluRWxldmF0aW9uIDw9IGVsZXZhdGlvbkRpZmZUaHJlc2hvbGQgJiYgY2FuQ29uY2F0ZW5hdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBBbGwgc2FtcGxlcyBoYXZlIHVuaWZvcm0gZWxldmF0aW9uLiBNYXJrIHRoaXMgYXMgYSBsZWFmXG4gICAgICAgICAgICAgICAgbWlwLmxlYXZlcy5wdXNoKDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtaXAubGVhdmVzLnB1c2goMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtaXBzLnB1c2gobWlwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWlwcztcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQge1JHQkFJbWFnZX0gZnJvbSAnLi4vdXRpbC9pbWFnZS5qcyc7XG5cbmltcG9ydCB7d2Fybk9uY2UsIGNsYW1wfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcbmltcG9ydCBEZW1NaW5NYXhRdWFkVHJlZSBmcm9tICcuL2RlbV90cmVlLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuLy8gREVNRGF0YSBpcyBhIGRhdGEgc3RydWN0dXJlIGZvciBkZWNvZGluZywgYmFja2ZpbGxpbmcsIGFuZCBzdG9yaW5nIGVsZXZhdGlvbiBkYXRhIGZvciBwcm9jZXNzaW5nIGluIHRoZSBoaWxsc2hhZGUgc2hhZGVyc1xuLy8gZGF0YSBjYW4gYmUgcG9wdWxhdGVkIGVpdGhlciBmcm9tIGEgcG5ncmF3IGltYWdlIHRpbGUgb3IgZnJvbSBzZXJsaWF6ZWQgZGF0YSBzZW50IGJhY2sgZnJvbSBhIHdvcmtlci4gV2hlbiBkYXRhIGlzIGluaXRpYWxseVxuLy8gbG9hZGVkIGZyb20gYSBpbWFnZSB0aWxlLCB3ZSBkZWNvZGUgdGhlIHBpeGVsIHZhbHVlcyB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZGVjb2RpbmcgZm9ybXVsYSwgYnV0IHdlIHN0b3JlIHRoZVxuLy8gZWxldmF0aW9uIGRhdGEgYXMgYW4gSW50MzIgdmFsdWUuIHdlIGFkZCA2NTUzNiAoMl4xNikgdG8gZWxpbWluYXRlIG5lZ2F0aXZlIHZhbHVlcyBhbmQgZW5hYmxlIHRoZSB1c2Ugb2Zcbi8vIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBjcmVhdGluZyB0aGUgdGV4dHVyZSB1c2VkIGluIHRoZSBoaWxsc2hhZGVQcmVwYXJlIHN0ZXAuXG5cbi8vIERFTURhdGEgYWxzbyBoYW5kbGVzIHRoZSBiYWNrZmlsbGluZyBvZiBkYXRhIGZyb20gYSB0aWxlJ3MgbmVpZ2hib3JpbmcgdGlsZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIGEgcGl4ZWwncyA4XG4vLyBzdXJyb3VuZGluZyBwaXhlbCB2YWx1ZXMgdG8gY29tcHV0ZSB0aGUgc2xvcGUgYXQgdGhhdCBwaXhlbCwgYW5kIHdlIGNhbm5vdCBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgc2xvcGUgYXQgcGl4ZWxzIG9uIGFcbi8vIHRpbGUncyBlZGdlIHdpdGhvdXQgYmFja2ZpbGxpbmcgZnJvbSBuZWlnaGJvcmluZyB0aWxlcy5cblxuZXhwb3J0IHR5cGUgREVNRW5jb2RpbmcgPSBcIm1hcGJveFwiIHwgXCJ0ZXJyYXJpdW1cIjtcblxuY29uc3QgdW5wYWNrVmVjdG9ycyA9IHtcbiAgICBtYXBib3g6IFs2NTUzLjYsIDI1LjYsIDAuMSwgMTAwMDAuMF0sXG4gICAgdGVycmFyaXVtOiBbMjU2LjAsIDEuMCwgMS4wIC8gMjU2LjAsIDMyNzY4LjBdXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBERU1EYXRhIHtcbiAgICB1aWQ6IG51bWJlcjtcbiAgICBkYXRhOiBVaW50MzJBcnJheTtcbiAgICBzdHJpZGU6IG51bWJlcjtcbiAgICBkaW06IG51bWJlcjtcbiAgICBlbmNvZGluZzogREVNRW5jb2Rpbmc7XG4gICAgYm9yZGVyUmVhZHk6IGJvb2xlYW47XG4gICAgX3RyZWU6IERlbU1pbk1heFF1YWRUcmVlO1xuICAgIGdldCB0cmVlKCk6IERlbU1pbk1heFF1YWRUcmVlIHtcbiAgICAgICAgaWYgKCF0aGlzLl90cmVlKSB0aGlzLl9idWlsZFF1YWRUcmVlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmVlO1xuICAgIH1cblxuICAgIC8vIFJHQkFJbWFnZSBkYXRhIGhhcyB1bmlmb3JtIDFweCBwYWRkaW5nIG9uIGFsbCBzaWRlczogc3F1YXJlIHRpbGUgZWRnZSBzaXplIGRlZmluZXMgc3RyaWRlXG4gICAgLy8gYW5kIGRpbSBpcyBjYWxjdWxhdGVkIGFzIHN0cmlkZSAtIDIuXG4gICAgY29uc3RydWN0b3IodWlkOiBudW1iZXIsIGRhdGE6IFJHQkFJbWFnZSwgZW5jb2Rpbmc6IERFTUVuY29kaW5nLCBib3JkZXJSZWFkeTogYm9vbGVhbiA9IGZhbHNlLCBidWlsZFF1YWRUcmVlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy51aWQgPSB1aWQ7XG4gICAgICAgIGlmIChkYXRhLmhlaWdodCAhPT0gZGF0YS53aWR0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0RFTSB0aWxlcyBtdXN0IGJlIHNxdWFyZScpO1xuICAgICAgICBpZiAoZW5jb2RpbmcgJiYgZW5jb2RpbmcgIT09IFwibWFwYm94XCIgJiYgZW5jb2RpbmcgIT09IFwidGVycmFyaXVtXCIpIHJldHVybiB3YXJuT25jZShcbiAgICAgICAgICAgIGBcIiR7ZW5jb2Rpbmd9XCIgaXMgbm90IGEgdmFsaWQgZW5jb2RpbmcgdHlwZS4gVmFsaWQgdHlwZXMgaW5jbHVkZSBcIm1hcGJveFwiIGFuZCBcInRlcnJhcml1bVwiLmBcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdHJpZGUgPSBkYXRhLmhlaWdodDtcbiAgICAgICAgY29uc3QgZGltID0gdGhpcy5kaW0gPSBkYXRhLmhlaWdodCAtIDI7XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50MzJBcnJheShkYXRhLmRhdGEuYnVmZmVyKTtcbiAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nIHx8ICdtYXBib3gnO1xuICAgICAgICB0aGlzLmJvcmRlclJlYWR5ID0gYm9yZGVyUmVhZHk7XG5cbiAgICAgICAgaWYgKGJvcmRlclJlYWR5KSByZXR1cm47XG5cbiAgICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgZmxhc2hpbmcgc2VhbXMgYmV0d2VlbiB0aWxlcywgaGVyZSB3ZSBhcmUgaW5pdGlhbGx5IHBvcHVsYXRpbmcgYSAxcHggYm9yZGVyIG9mIHBpeGVscyBhcm91bmQgdGhlIGltYWdlXG4gICAgICAgIC8vIHdpdGggdGhlIGRhdGEgb2YgdGhlIG5lYXJlc3QgcGl4ZWwgZnJvbSB0aGUgaW1hZ2UuIHRoaXMgZGF0YSBpcyBldmVudHVhbGx5IHJlcGxhY2VkIHdoZW4gdGhlIHRpbGUncyBuZWlnaGJvcmluZ1xuICAgICAgICAvLyB0aWxlcyBhcmUgbG9hZGVkIGFuZCB0aGUgYWNjdXJhdGUgZGF0YSBjYW4gYmUgYmFja2ZpbGxlZCB1c2luZyBERU1EYXRhI2JhY2tmaWxsQm9yZGVyXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgZGltOyB4KyspIHtcbiAgICAgICAgICAgIC8vIGxlZnQgdmVydGljYWwgYm9yZGVyXG4gICAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KC0xLCB4KV0gPSB0aGlzLmRhdGFbdGhpcy5faWR4KDAsIHgpXTtcbiAgICAgICAgICAgIC8vIHJpZ2h0IHZlcnRpY2FsIGJvcmRlclxuICAgICAgICAgICAgdGhpcy5kYXRhW3RoaXMuX2lkeChkaW0sIHgpXSA9IHRoaXMuZGF0YVt0aGlzLl9pZHgoZGltIC0gMSwgeCldO1xuICAgICAgICAgICAgLy8gbGVmdCBob3Jpem9udGFsIGJvcmRlclxuICAgICAgICAgICAgdGhpcy5kYXRhW3RoaXMuX2lkeCh4LCAtMSldID0gdGhpcy5kYXRhW3RoaXMuX2lkeCh4LCAwKV07XG4gICAgICAgICAgICAvLyByaWdodCBob3Jpem9udGFsIGJvcmRlclxuICAgICAgICAgICAgdGhpcy5kYXRhW3RoaXMuX2lkeCh4LCBkaW0pXSA9IHRoaXMuZGF0YVt0aGlzLl9pZHgoeCwgZGltIC0gMSldO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvcm5lcnNcbiAgICAgICAgdGhpcy5kYXRhW3RoaXMuX2lkeCgtMSwgLTEpXSA9IHRoaXMuZGF0YVt0aGlzLl9pZHgoMCwgMCldO1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KGRpbSwgLTEpXSA9IHRoaXMuZGF0YVt0aGlzLl9pZHgoZGltIC0gMSwgMCldO1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KC0xLCBkaW0pXSA9IHRoaXMuZGF0YVt0aGlzLl9pZHgoMCwgZGltIC0gMSldO1xuICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KGRpbSwgZGltKV0gPSB0aGlzLmRhdGFbdGhpcy5faWR4KGRpbSAtIDEsIGRpbSAtIDEpXTtcbiAgICAgICAgaWYgKGJ1aWxkUXVhZFRyZWUpIHRoaXMuX2J1aWxkUXVhZFRyZWUoKTtcbiAgICB9XG5cbiAgICBfYnVpbGRRdWFkVHJlZSgpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLl90cmVlKTtcbiAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBpbXBsaWNpdCBzcGFyc2UgcXVhZCB0cmVlIGJ5IHRyYXZlcnNpbmcgbWlwcyBmcm9tIHRvcCB0byBkb3duXG4gICAgICAgIHRoaXMuX3RyZWUgPSBuZXcgRGVtTWluTWF4UXVhZFRyZWUodGhpcyk7XG4gICAgfVxuXG4gICAgZ2V0KHg6IG51bWJlciwgeTogbnVtYmVyLCBjbGFtcFRvRWRnZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHBpeGVscyA9IG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YS5idWZmZXIpO1xuICAgICAgICBpZiAoY2xhbXBUb0VkZ2UpIHtcbiAgICAgICAgICAgIHggPSBjbGFtcCh4LCAtMSwgdGhpcy5kaW0pO1xuICAgICAgICAgICAgeSA9IGNsYW1wKHksIC0xLCB0aGlzLmRpbSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9pZHgoeCwgeSkgKiA0O1xuICAgICAgICBjb25zdCB1bnBhY2sgPSB0aGlzLmVuY29kaW5nID09PSBcInRlcnJhcml1bVwiID8gdGhpcy5fdW5wYWNrVGVycmFyaXVtIDogdGhpcy5fdW5wYWNrTWFwYm94O1xuICAgICAgICByZXR1cm4gdW5wYWNrKHBpeGVsc1tpbmRleF0sIHBpeGVsc1tpbmRleCArIDFdLCBwaXhlbHNbaW5kZXggKyAyXSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldFVucGFja1ZlY3RvcihlbmNvZGluZzogREVNRW5jb2RpbmcpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIHJldHVybiB1bnBhY2tWZWN0b3JzW2VuY29kaW5nXTtcbiAgICB9XG5cbiAgICBnZXQgdW5wYWNrVmVjdG9yKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgcmV0dXJuIHVucGFja1ZlY3RvcnNbdGhpcy5lbmNvZGluZ107XG4gICAgfVxuXG4gICAgX2lkeCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgICAgICBpZiAoeCA8IC0xIHx8IHggPj0gdGhpcy5kaW0gKyAxIHx8ICB5IDwgLTEgfHwgeSA+PSB0aGlzLmRpbSArIDEpIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2Ugc291cmNlIGNvb3JkaW5hdGVzIGZvciBERU0gZGF0YScpO1xuICAgICAgICByZXR1cm4gKHkgKyAxKSAqIHRoaXMuc3RyaWRlICsgKHggKyAxKTtcbiAgICB9XG5cbiAgICBfdW5wYWNrTWFwYm94KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgICAgICAgLy8gdW5wYWNraW5nIGZvcm11bGEgZm9yIG1hcGJveC50ZXJyYWluLXJnYjpcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cubWFwYm94LmNvbS9oZWxwL2FjY2Vzcy1lbGV2YXRpb24tZGF0YS8jbWFwYm94LXRlcnJhaW4tcmdiXG4gICAgICAgIHJldHVybiAoKHIgKiAyNTYgKiAyNTYgKyBnICogMjU2LjAgKyBiKSAvIDEwLjAgLSAxMDAwMC4wKTtcbiAgICB9XG5cbiAgICBfdW5wYWNrVGVycmFyaXVtKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgICAgICAgLy8gdW5wYWNraW5nIGZvcm11bGEgZm9yIG1hcHplbiB0ZXJyYXJpdW06XG4gICAgICAgIC8vIGh0dHBzOi8vYXdzLmFtYXpvbi5jb20vcHVibGljLWRhdGFzZXRzL3RlcnJhaW4vXG4gICAgICAgIHJldHVybiAoKHIgKiAyNTYgKyBnICsgYiAvIDI1NikgLSAzMjc2OC4wKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFjayhhbHRpdHVkZTogbnVtYmVyLCBlbmNvZGluZzogREVNRW5jb2RpbmcpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gWzAsIDAsIDAsIDBdO1xuICAgICAgICBjb25zdCB2ZWN0b3IgPSBERU1EYXRhLmdldFVucGFja1ZlY3RvcihlbmNvZGluZyk7XG4gICAgICAgIGxldCB2ID0gTWF0aC5mbG9vcigoYWx0aXR1ZGUgKyB2ZWN0b3JbM10pIC8gdmVjdG9yWzJdKTtcbiAgICAgICAgY29sb3JbMl0gPSB2ICUgMjU2O1xuICAgICAgICB2ID0gTWF0aC5mbG9vcih2IC8gMjU2KTtcbiAgICAgICAgY29sb3JbMV0gPSB2ICUgMjU2O1xuICAgICAgICB2ID0gTWF0aC5mbG9vcih2IC8gMjU2KTtcbiAgICAgICAgY29sb3JbMF0gPSB2O1xuICAgICAgICByZXR1cm4gY29sb3I7XG4gICAgfVxuXG4gICAgZ2V0UGl4ZWxzKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJHQkFJbWFnZSh7d2lkdGg6IHRoaXMuc3RyaWRlLCBoZWlnaHQ6IHRoaXMuc3RyaWRlfSwgbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlcikpO1xuICAgIH1cblxuICAgIGJhY2tmaWxsQm9yZGVyKGJvcmRlclRpbGU6IERFTURhdGEsIGR4OiBudW1iZXIsIGR5OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuZGltICE9PSBib3JkZXJUaWxlLmRpbSkgdGhyb3cgbmV3IEVycm9yKCdkZW0gZGltZW5zaW9uIG1pc21hdGNoJyk7XG5cbiAgICAgICAgbGV0IHhNaW4gPSBkeCAqIHRoaXMuZGltLFxuICAgICAgICAgICAgeE1heCA9IGR4ICogdGhpcy5kaW0gKyB0aGlzLmRpbSxcbiAgICAgICAgICAgIHlNaW4gPSBkeSAqIHRoaXMuZGltLFxuICAgICAgICAgICAgeU1heCA9IGR5ICogdGhpcy5kaW0gKyB0aGlzLmRpbTtcblxuICAgICAgICBzd2l0Y2ggKGR4KSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgICB4TWluID0geE1heCAtIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgeE1heCA9IHhNaW4gKyAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGR5KSB7XG4gICAgICAgIGNhc2UgLTE6XG4gICAgICAgICAgICB5TWluID0geU1heCAtIDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgeU1heCA9IHlNaW4gKyAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBveCA9IC1keCAqIHRoaXMuZGltO1xuICAgICAgICBjb25zdCBveSA9IC1keSAqIHRoaXMuZGltO1xuICAgICAgICBmb3IgKGxldCB5ID0geU1pbjsgeSA8IHlNYXg7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IHhNaW47IHggPCB4TWF4OyB4KyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5faWR4KHgsIHkpXSA9IGJvcmRlclRpbGUuZGF0YVt0aGlzLl9pZHgoeCArIG94LCB5ICsgb3kpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRGVzZXJpYWxpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLl90cmVlKSB0aGlzLl90cmVlLmRlbSA9IHRoaXM7XG4gICAgfVxufVxuXG5yZWdpc3RlcignREVNRGF0YScsIERFTURhdGEpO1xucmVnaXN0ZXIoJ0RlbU1pbk1heFF1YWRUcmVlJywgRGVtTWluTWF4UXVhZFRyZWUsIHtvbWl0OiBbJ2RlbSddfSk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vdGlsZS5qcyc7XG5cbi8qKlxuICogQSBbbGVhc3QtcmVjZW50bHktdXNlZCBjYWNoZV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYWNoZV9hbGdvcml0aG1zKVxuICogd2l0aCBoYXNoIGxvb2t1cCBtYWRlIHBvc3NpYmxlIGJ5IGtlZXBpbmcgYSBsaXN0IG9mIGtleXMgaW4gcGFyYWxsZWwgdG9cbiAqIGFuIGFycmF5IG9mIGRpY3Rpb25hcnkgb2YgdmFsdWVzXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVGlsZUNhY2hlIHtcbiAgICBtYXg6IG51bWJlcjtcbiAgICBkYXRhOiB7W2tleTogc3RyaW5nIHwgbnVtYmVyXTogQXJyYXk8eyB2YWx1ZTogVGlsZSwgdGltZW91dDogP1RpbWVvdXRJRH0+fTtcbiAgICBvcmRlcjogQXJyYXk8bnVtYmVyPjtcbiAgICBvblJlbW92ZTogKGVsZW1lbnQ6IFRpbGUpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heCBUaGUgbWF4IG51bWJlciBvZiBwZXJtaXR0ZWQgdmFsdWVzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25SZW1vdmUgVGhlIGNhbGxiYWNrIGNhbGxlZCB3aXRoIGl0ZW1zIHdoZW4gdGhleSBleHBpcmUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWF4OiBudW1iZXIsIG9uUmVtb3ZlOiAoZWxlbWVudDogVGlsZSkgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICAgICAgdGhpcy5vblJlbW92ZSA9IG9uUmVtb3ZlO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHJlc2V0KCkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVtb3ZlZERhdGEgb2YgdGhpcy5kYXRhW2tleV0pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZERhdGEudGltZW91dCkgY2xlYXJUaW1lb3V0KHJlbW92ZWREYXRhLnRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMub25SZW1vdmUocmVtb3ZlZERhdGEudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kYXRhID0ge307XG4gICAgICAgIHRoaXMub3JkZXIgPSBbXTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBrZXksIHZhbHVlIGNvbWJpbmF0aW9uIHRvIHRoZSBjYWNoZSwgdHJpbW1pbmcgaXRzIHNpemUgaWYgdGhpcyBwdXNoZXNcbiAgICAgKiBpdCBvdmVyIG1heCBsZW5ndGguXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge092ZXJzY2FsZWRUaWxlSUR9IHRpbGVJRCBsb29rdXAga2V5IGZvciB0aGUgaXRlbVxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBhbnkgdmFsdWVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtUaWxlQ2FjaGV9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGQodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCBkYXRhOiBUaWxlLCBleHBpcnlUaW1lb3V0OiBudW1iZXIgfCB2b2lkKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRpbGVJRC53cmFwcGVkKCkua2V5O1xuICAgICAgICBpZiAodGhpcy5kYXRhW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhW2tleV0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGFXcmFwcGVyID0ge1xuICAgICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgICB0aW1lb3V0OiB1bmRlZmluZWRcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZXhwaXJ5VGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkYXRhV3JhcHBlci50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUodGlsZUlELCBkYXRhV3JhcHBlcik7XG4gICAgICAgICAgICB9LCBleHBpcnlUaW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YVtrZXldLnB1c2goZGF0YVdyYXBwZXIpO1xuICAgICAgICB0aGlzLm9yZGVyLnB1c2goa2V5KTtcblxuICAgICAgICBpZiAodGhpcy5vcmRlci5sZW5ndGggPiB0aGlzLm1heCkge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZERhdGEgPSB0aGlzLl9nZXRBbmRSZW1vdmVCeUtleSh0aGlzLm9yZGVyWzBdKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkRGF0YSkgdGhpcy5vblJlbW92ZShyZW1vdmVkRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgdmFsdWUgYXR0YWNoZWQgdG8gYGtleWAgaXMgcHJlc2VudFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPdmVyc2NhbGVkVGlsZUlEfSB0aWxlSUQgdGhlIGtleSB0byBiZSBsb29rZWQtdXBcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgY2FjaGUgaGFzIHRoaXMgdmFsdWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGhhcyh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRpbGVJRC53cmFwcGVkKCkua2V5IGluIHRoaXMuZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGF0dGFjaGVkIHRvIGEgc3BlY2lmaWMga2V5IGFuZCByZW1vdmUgZGF0YSBmcm9tIGNhY2hlLlxuICAgICAqIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLCByZXR1cm5zIGBudWxsYFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPdmVyc2NhbGVkVGlsZUlEfSB0aWxlSUQgdGhlIGtleSB0byBsb29rIHVwXG4gICAgICogQHJldHVybnMgeyp9IHRoZSBkYXRhLCBvciBudWxsIGlmIGl0IGlzbid0IGZvdW5kXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRBbmRSZW1vdmUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogP1RpbGUge1xuICAgICAgICBpZiAoIXRoaXMuaGFzKHRpbGVJRCkpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFuZFJlbW92ZUJ5S2V5KHRpbGVJRC53cmFwcGVkKCkua2V5KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEdldCBhbmQgcmVtb3ZlIHRoZSB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICAqL1xuICAgIF9nZXRBbmRSZW1vdmVCeUtleShrZXk6IG51bWJlcik6ID9UaWxlIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YVtrZXldLnNoaWZ0KCk7XG4gICAgICAgIGlmIChkYXRhLnRpbWVvdXQpIGNsZWFyVGltZW91dChkYXRhLnRpbWVvdXQpO1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGFba2V5XS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRhdGFba2V5XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2Yoa2V5KSwgMSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGEudmFsdWU7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBHZXQgdGhlIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCAod3JhcHBlZCB0aWxlKSBrZXkuXG4gICAgICovXG4gICAgZ2V0QnlLZXkoa2V5OiBudW1iZXIpOiA/VGlsZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFba2V5XTtcbiAgICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhWzBdLnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGF0dGFjaGVkIHRvIGEgc3BlY2lmaWMga2V5IHdpdGhvdXQgcmVtb3ZpbmcgZGF0YVxuICAgICAqIGZyb20gdGhlIGNhY2hlLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgcmV0dXJucyBgbnVsbGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIHRoZSBrZXkgdG8gbG9vayB1cFxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgZGF0YSwgb3IgbnVsbCBpZiBpdCBpc24ndCBmb3VuZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6ID9UaWxlIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhcyh0aWxlSUQpKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YVt0aWxlSUQud3JhcHBlZCgpLmtleV1bMF07XG4gICAgICAgIHJldHVybiBkYXRhLnZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGtleS92YWx1ZSBjb21iaW5hdGlvbiBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIHRoZSBrZXkgZm9yIHRoZSBwYWlyIHRvIGRlbGV0ZVxuICAgICAqIEBwYXJhbSB7VGlsZX0gdmFsdWUgSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCwgcmVtb3ZlIHRoYXQgZXhhY3QgdmVyc2lvbiBvZiB0aGUgdmFsdWUuXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVtb3ZlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgdmFsdWU6ID97IHZhbHVlOiBUaWxlLCB0aW1lb3V0OiA/VGltZW91dElEfSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzKHRpbGVJRCkpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICAgICAgY29uc3Qga2V5ID0gdGlsZUlELndyYXBwZWQoKS5rZXk7XG5cbiAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gdmFsdWUgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLmRhdGFba2V5XS5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YVtrZXldW2RhdGFJbmRleF07XG4gICAgICAgIHRoaXMuZGF0YVtrZXldLnNwbGljZShkYXRhSW5kZXgsIDEpO1xuICAgICAgICBpZiAoZGF0YS50aW1lb3V0KSBjbGVhclRpbWVvdXQoZGF0YS50aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtrZXldLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25SZW1vdmUoZGF0YS52YWx1ZSk7XG4gICAgICAgIHRoaXMub3JkZXIuc3BsaWNlKHRoaXMub3JkZXIuaW5kZXhPZihrZXkpLCAxKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG1heCBzaXplIG9mIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggdGhlIG1heCBzaXplIG9mIHRoZSBjYWNoZVxuICAgICAqIEByZXR1cm5zIHtUaWxlQ2FjaGV9IHRoaXMgY2FjaGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNldE1heFNpemUobWF4OiBudW1iZXIpOiBUaWxlQ2FjaGUge1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcblxuICAgICAgICB3aGlsZSAodGhpcy5vcmRlci5sZW5ndGggPiB0aGlzLm1heCkge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZERhdGEgPSB0aGlzLl9nZXRBbmRSZW1vdmVCeUtleSh0aGlzLm9yZGVyWzBdKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkRGF0YSkgdGhpcy5vblJlbW92ZShyZW1vdmVkRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZW50cmllcyB0aGF0IGRvIG5vdCBwYXNzIGEgZmlsdGVyIGZ1bmN0aW9uLiBVc2VkIGZvciByZW1vdmluZ1xuICAgICAqIHN0YWxlIHRpbGVzIGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmaWx0ZXJGbiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRpbGUgaXMgZmlsdGVyZWQuIElmIHRoZSBzdXBwbGllZCBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgdGlsZSB3aWxsIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKi9cbiAgICBmaWx0ZXIoZmlsdGVyRm46ICh0aWxlOiBUaWxlKSA9PiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZGF0YVtrZXldKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJGbihlbnRyeS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByIG9mIHJlbW92ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKHIudmFsdWUudGlsZUlELCByKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGlsZUNhY2hlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlLmpzJztcbmltcG9ydCB7RXZlbnQsIEVycm9yRXZlbnQsIEV2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQgVGlsZUNhY2hlIGZyb20gJy4vdGlsZV9jYWNoZS5qcyc7XG5pbXBvcnQge2FzeW5jQWxsLCBrZXlzRGlmZmVyZW5jZSwgdmFsdWVzfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuaW1wb3J0IHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IFNvdXJjZUZlYXR1cmVTdGF0ZSBmcm9tICcuL3NvdXJjZV9zdGF0ZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtTb3VyY2V9IGZyb20gJy4vc291cmNlLmpzJztcbmltcG9ydCB0eXBlIHtkZWZhdWx0IGFzIE1hcGJveE1hcH0gZnJvbSAnLi4vdWkvbWFwLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlIGZyb20gJy4uL3N0eWxlL3N0eWxlLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlU3RhdGV9IGZyb20gJy4vdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcbmltcG9ydCB0eXBlIHtRdWVyeUdlb21ldHJ5LCBUaWxlc3BhY2VRdWVyeUdlb21ldHJ5fSBmcm9tICcuLi9zdHlsZS9xdWVyeV9nZW9tZXRyeS5qcyc7XG5cbi8qKlxuICogYFNvdXJjZUNhY2hlYCBpcyByZXNwb25zaWJsZSBmb3JcbiAqXG4gKiAgLSBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBgU291cmNlYFxuICogIC0gZm9yd2FyZGluZyBldmVudHMgZnJvbSBgU291cmNlYFxuICogIC0gY2FjaGluZyB0aWxlcyBsb2FkZWQgZnJvbSBhbiBpbnN0YW5jZSBvZiBgU291cmNlYFxuICogIC0gbG9hZGluZyB0aGUgdGlsZXMgbmVlZGVkIHRvIHJlbmRlciBhIGdpdmVuIHZpZXdwb3J0XG4gKiAgLSB1bmxvYWRpbmcgdGhlIGNhY2hlZCB0aWxlcyBub3QgbmVlZGVkIHRvIHJlbmRlciBhIGdpdmVuIHZpZXdwb3J0XG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU291cmNlQ2FjaGUgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG1hcDogTWFwYm94TWFwO1xuICAgIHN0eWxlOiBTdHlsZTtcblxuICAgIF9zb3VyY2U6IFNvdXJjZTtcbiAgICBfc291cmNlTG9hZGVkOiBib29sZWFuO1xuICAgIF9zb3VyY2VFcnJvcmVkOiBib29sZWFuO1xuICAgIF90aWxlczoge1tfOiBzdHJpbmcgfCBudW1iZXJdOiBUaWxlfTtcbiAgICBfcHJldkxuZzogbnVtYmVyIHwgdm9pZDtcbiAgICBfY2FjaGU6IFRpbGVDYWNoZTtcbiAgICBfdGltZXJzOiB7W186IGFueV06IFRpbWVvdXRJRH07XG4gICAgX2NhY2hlVGltZXJzOiB7W186IGFueV06IFRpbWVvdXRJRH07XG4gICAgX21pblRpbGVDYWNoZVNpemU6ID9udW1iZXI7XG4gICAgX21heFRpbGVDYWNoZVNpemU6ID9udW1iZXI7XG4gICAgX3BhdXNlZDogYm9vbGVhbjtcbiAgICBfc2hvdWxkUmVsb2FkT25SZXN1bWU6IGJvb2xlYW47XG4gICAgX2NvdmVyZWRUaWxlczoge1tfOiBudW1iZXIgfCBzdHJpbmddOiBib29sZWFufTtcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybTtcbiAgICBfaXNJZFJlbmRlcmFibGU6IChpZDogbnVtYmVyLCBzeW1ib2xMYXllcj86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgdXNlZDogYm9vbGVhbjtcbiAgICB1c2VkRm9yVGVycmFpbjogYm9vbGVhbjtcbiAgICBfc3RhdGU6IFNvdXJjZUZlYXR1cmVTdGF0ZTtcbiAgICBfbG9hZGVkUGFyZW50VGlsZXM6IHtbXzogbnVtYmVyIHwgc3RyaW5nXTogP1RpbGV9O1xuICAgIF9vbmx5U3ltYm9sczogP2Jvb2xlYW47XG5cbiAgICBzdGF0aWMgbWF4VW5kZXJ6b29taW5nOiBudW1iZXI7XG4gICAgc3RhdGljIG1heE92ZXJ6b29taW5nOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBzb3VyY2U6IFNvdXJjZSwgb25seVN5bWJvbHM/OiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5fb25seVN5bWJvbHMgPSBvbmx5U3ltYm9scztcblxuICAgICAgICBzb3VyY2Uub24oJ2RhdGEnLCAoZSkgPT4ge1xuICAgICAgICAgICAgLy8gdGhpcy5fc291cmNlTG9hZGVkIHNpZ25pZmllcyB0aGF0IHRoZSBUaWxlSlNPTiBpcyBsb2FkZWQgaWYgYXBwbGljYWJsZS5cbiAgICAgICAgICAgIC8vIGlmIHRoZSBzb3VyY2UgdHlwZSBkb2VzIG5vdCBjb21lIHdpdGggYSBUaWxlSlNPTiwgdGhlIGZsYWcgc2lnbmlmaWVzIHRoZVxuICAgICAgICAgICAgLy8gc291cmNlIGRhdGEgaGFzIGxvYWRlZCAoaW4gb3RoZXIgd29yZHMsIEdlb0pTT04gaGFzIGJlZW4gdGlsZWQgb24gdGhlIHdvcmtlciBhbmQgaXMgcmVhZHkpXG4gICAgICAgICAgICBpZiAoZS5kYXRhVHlwZSA9PT0gJ3NvdXJjZScgJiYgZS5zb3VyY2VEYXRhVHlwZSA9PT0gJ21ldGFkYXRhJykgdGhpcy5fc291cmNlTG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gZm9yIHNvdXJjZXMgd2l0aCBtdXRhYmxlIGRhdGEsIHRoaXMgZXZlbnQgZmlyZXMgd2hlbiB0aGUgdW5kZXJseWluZyBkYXRhXG4gICAgICAgICAgICAvLyB0byBhIHNvdXJjZSBpcyBjaGFuZ2VkIChmb3IgZXhhbXBsZSwgdXNpbmcgW0dlb0pTT05Tb3VyY2Ujc2V0RGF0YV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9zb3VyY2VzLyNnZW9qc29uc291cmNlI3NldGRhdGEpIG9yIFtJbWFnZVNvdXJjZSNzZXRDb29yZGluYXRlc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9zb3VyY2VzLyNpbWFnZXNvdXJjZSNzZXRjb29yZGluYXRlcykpXG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlTG9hZGVkICYmICF0aGlzLl9wYXVzZWQgJiYgZS5kYXRhVHlwZSA9PT0gXCJzb3VyY2VcIiAmJiBlLnNvdXJjZURhdGFUeXBlID09PSAnY29udGVudCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBzb3VyY2Uub24oJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlRXJyb3JlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5fdGlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fY2FjaGUgPSBuZXcgVGlsZUNhY2hlKDAsIHRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuX3RpbWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9jYWNoZVRpbWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9taW5UaWxlQ2FjaGVTaXplID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzID0ge307XG5cbiAgICAgICAgdGhpcy5fY292ZXJlZFRpbGVzID0ge307XG4gICAgICAgIHRoaXMuX3N0YXRlID0gbmV3IFNvdXJjZUZlYXR1cmVTdGF0ZSgpO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwYm94TWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9taW5UaWxlQ2FjaGVTaXplID0gbWFwID8gbWFwLl9taW5UaWxlQ2FjaGVTaXplIDogbnVsbDtcbiAgICAgICAgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9IG1hcCA/IG1hcC5fbWF4VGlsZUNhY2hlU2l6ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRydWUgaWYgbm8gdGlsZSBkYXRhIGlzIHBlbmRpbmcsIHRpbGVzIHdpbGwgbm90IGNoYW5nZSB1bmxlc3NcbiAgICAgKiBhbiBhZGRpdGlvbmFsIEFQSSBjYWxsIGlzIHJlY2VpdmVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlRXJyb3JlZCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZUxvYWRlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2UubG9hZGVkKCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGZvciAoY29uc3QgdCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW3RdO1xuICAgICAgICAgICAgaWYgKHRpbGUuc3RhdGUgIT09ICdsb2FkZWQnICYmIHRpbGUuc3RhdGUgIT09ICdlcnJvcmVkJylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZ2V0U291cmNlKCk6IFNvdXJjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gICAgfVxuXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXMuX3BhdXNlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmVzdW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3BhdXNlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzaG91bGRSZWxvYWQgPSB0aGlzLl9zaG91bGRSZWxvYWRPblJlc3VtZTtcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lID0gZmFsc2U7XG4gICAgICAgIGlmIChzaG91bGRSZWxvYWQpIHRoaXMucmVsb2FkKCk7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybSkgdGhpcy51cGRhdGUodGhpcy50cmFuc2Zvcm0pO1xuICAgIH1cblxuICAgIF9sb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgdGlsZS5pc1N5bWJvbFRpbGUgPSB0aGlzLl9vbmx5U3ltYm9scztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5sb2FkVGlsZSh0aWxlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgX3VubG9hZFRpbGUodGlsZTogVGlsZSkge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlLnVubG9hZFRpbGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLnVubG9hZFRpbGUodGlsZSwgKCkgPT4ge30pO1xuICAgIH1cblxuICAgIF9hYm9ydFRpbGUodGlsZTogVGlsZSkge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlLmFib3J0VGlsZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2UuYWJvcnRUaWxlKHRpbGUsICgpID0+IHt9KTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2Uuc2VyaWFsaXplKCk7XG4gICAgfVxuXG4gICAgcHJlcGFyZShjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICAodGhpcy5fc291cmNlLnByZXBhcmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5wcmVwYXJlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdGF0ZS5jb2FsZXNjZUNoYW5nZXModGhpcy5fdGlsZXMsIHRoaXMubWFwID8gdGhpcy5tYXAucGFpbnRlciA6IG51bGwpO1xuICAgICAgICBmb3IgKGNvbnN0IGkgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpXTtcbiAgICAgICAgICAgIHRpbGUudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICAgICAgdGlsZS5wcmVwYXJlKHRoaXMubWFwLnN0eWxlLmltYWdlTWFuYWdlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYWxsIHRpbGUgaWRzIG9yZGVyZWQgd2l0aCB6LW9yZGVyLCBhbmQgY2FzdCB0byBudW1iZXJzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRJZHMoKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMoKHRoaXMuX3RpbGVzOiBhbnkpKS5tYXAoKHRpbGU6IFRpbGUpID0+IHRpbGUudGlsZUlEKS5zb3J0KGNvbXBhcmVUaWxlSWQpLm1hcChpZCA9PiBpZC5rZXkpO1xuICAgIH1cblxuICAgIGdldFJlbmRlcmFibGVJZHMoc3ltYm9sTGF5ZXI/OiBib29sZWFuKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHJlbmRlcmFibGVzOiBBcnJheTxUaWxlPiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNJZFJlbmRlcmFibGUoK2lkLCBzeW1ib2xMYXllcikpIHJlbmRlcmFibGVzLnB1c2godGhpcy5fdGlsZXNbaWRdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3ltYm9sTGF5ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiByZW5kZXJhYmxlcy5zb3J0KChhXzogVGlsZSwgYl86IFRpbGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gYV8udGlsZUlEO1xuICAgICAgICAgICAgICAgIGNvbnN0IGIgPSBiXy50aWxlSUQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm90YXRlZEEgPSAobmV3IFBvaW50KGEuY2Fub25pY2FsLngsIGEuY2Fub25pY2FsLnkpKS5fcm90YXRlKHRoaXMudHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICBjb25zdCByb3RhdGVkQiA9IChuZXcgUG9pbnQoYi5jYW5vbmljYWwueCwgYi5jYW5vbmljYWwueSkpLl9yb3RhdGUodGhpcy50cmFuc2Zvcm0uYW5nbGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhLm92ZXJzY2FsZWRaIC0gYi5vdmVyc2NhbGVkWiB8fCByb3RhdGVkQi55IC0gcm90YXRlZEEueSB8fCByb3RhdGVkQi54IC0gcm90YXRlZEEueDtcbiAgICAgICAgICAgIH0pLm1hcCh0aWxlID0+IHRpbGUudGlsZUlELmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlbmRlcmFibGVzLm1hcCh0aWxlID0+IHRpbGUudGlsZUlEKS5zb3J0KGNvbXBhcmVUaWxlSWQpLm1hcChpZCA9PiBpZC5rZXkpO1xuICAgIH1cblxuICAgIGhhc1JlbmRlcmFibGVQYXJlbnQodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFRpbGUgPSB0aGlzLmZpbmRMb2FkZWRQYXJlbnQodGlsZUlELCAwKTtcbiAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0lkUmVuZGVyYWJsZShwYXJlbnRUaWxlLnRpbGVJRC5rZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBfaXNJZFJlbmRlcmFibGUoaWQ6IG51bWJlciwgc3ltYm9sTGF5ZXI/OiBib29sZWFuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlc1tpZF0gJiYgdGhpcy5fdGlsZXNbaWRdLmhhc0RhdGEoKSAmJlxuICAgICAgICAgICAgIXRoaXMuX2NvdmVyZWRUaWxlc1tpZF0gJiYgKHN5bWJvbExheWVyIHx8ICF0aGlzLl90aWxlc1tpZF0uaG9sZGluZ0ZvckZhZGUoKSk7XG4gICAgfVxuXG4gICAgcmVsb2FkKCkge1xuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9zaG91bGRSZWxvYWRPblJlc3VtZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jYWNoZS5yZXNldCgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaSBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbGVzW2ldLnN0YXRlICE9PSBcImVycm9yZWRcIikgdGhpcy5fcmVsb2FkVGlsZSgraSwgJ3JlbG9hZGluZycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3JlbG9hZFRpbGUoaWQ6IG51bWJlciwgc3RhdGU6IFRpbGVTdGF0ZSkge1xuICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuXG4gICAgICAgIC8vIHRoaXMgcG90ZW50aWFsbHkgZG9lcyBub3QgYWRkcmVzcyBhbGwgdW5kZXJseWluZ1xuICAgICAgICAvLyBpc3N1ZXMgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzQyNTJcbiAgICAgICAgLy8gLSBoYXJkIHRvIHRlbGwgd2l0aG91dCByZXBybyBzdGVwc1xuICAgICAgICBpZiAoIXRpbGUpIHJldHVybjtcblxuICAgICAgICAvLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFwibG9hZGluZ1wiIHRpbGVzIGFuZCBcInJlbG9hZGluZ1wiIG9yIFwiZXhwaXJlZFwiXG4gICAgICAgIC8vIHRpbGVzIGlzIHRoYXQgXCJyZWxvYWRpbmdcIi9cImV4cGlyZWRcIiB0aWxlcyBhcmUgXCJyZW5kZXJhYmxlXCIuXG4gICAgICAgIC8vIFRoZXJlZm9yZSwgYSBcImxvYWRpbmdcIiB0aWxlIGNhbm5vdCBiZWNvbWUgYSBcInJlbG9hZGluZ1wiIHRpbGUgd2l0aG91dFxuICAgICAgICAvLyBmaXJzdCBiZWNvbWluZyBhIFwibG9hZGVkXCIgdGlsZS5cbiAgICAgICAgaWYgKHRpbGUuc3RhdGUgIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgdGlsZS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9hZFRpbGUodGlsZSwgdGhpcy5fdGlsZUxvYWRlZC5iaW5kKHRoaXMsIHRpbGUsIGlkLCBzdGF0ZSkpO1xuICAgIH1cblxuICAgIF90aWxlTG9hZGVkKHRpbGU6IFRpbGUsIGlkOiBudW1iZXIsIHByZXZpb3VzU3RhdGU6IFRpbGVTdGF0ZSwgZXJyOiA/RXJyb3IpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICAgICAgICAgIGlmICgoZXJyOiBhbnkpLnN0YXR1cyAhPT0gNDA0KSB0aGlzLl9zb3VyY2UuZmlyZShuZXcgRXJyb3JFdmVudChlcnIsIHt0aWxlfSkpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY29udGludWUgdG8gdHJ5IGxvYWRpbmcgcGFyZW50L2NoaWxkcmVuIHRpbGVzIGlmIGEgdGlsZSBkb2Vzbid0IGV4aXN0ICg0MDQpXG4gICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlRm9yVGVycmFpbiA9IHRoaXMuX3NvdXJjZS50eXBlID09PSAncmFzdGVyLWRlbScgJiYgdGhpcy51c2VkRm9yVGVycmFpbjtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlRm9yVGVycmFpbiAmJiB0aGlzLm1hcC5wYWludGVyLnRlcnJhaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVycmFpbiA9IHRoaXMubWFwLnBhaW50ZXIudGVycmFpbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUodGhpcy50cmFuc2Zvcm0sIHRlcnJhaW4uZ2V0U2NhbGVkRGVtVGlsZVNpemUoKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRlcnJhaW4ucmVzZXRUaWxlTG9va3VwQ2FjaGUodGhpcy5pZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUodGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbGUudGltZUFkZGVkID0gYnJvd3Nlci5ub3coKTtcbiAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgPT09ICdleHBpcmVkJykgdGlsZS5yZWZyZXNoZWRVcG9uRXhwaXJhdGlvbiA9IHRydWU7XG4gICAgICAgIHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcihpZCwgdGlsZSk7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UudHlwZSA9PT0gJ3Jhc3Rlci1kZW0nICYmIHRpbGUuZGVtKSB0aGlzLl9iYWNrZmlsbERFTSh0aWxlKTtcbiAgICAgICAgdGhpcy5fc3RhdGUuaW5pdGlhbGl6ZVRpbGVTdGF0ZSh0aWxlLCB0aGlzLm1hcCA/IHRoaXMubWFwLnBhaW50ZXIgOiBudWxsKTtcblxuICAgICAgICB0aGlzLl9zb3VyY2UuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCB0aWxlLCBjb29yZDogdGlsZS50aWxlSUQsICdzb3VyY2VDYWNoZUlkJzogdGhpcy5pZH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEZvciByYXN0ZXIgdGVycmFpbiBzb3VyY2UsIGJhY2tmaWxsIERFTSB0byBlbGltaW5hdGUgdmlzaWJsZSB0aWxlIGJvdW5kYXJpZXNcbiAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBfYmFja2ZpbGxERU0odGlsZTogVGlsZSkge1xuICAgICAgICBjb25zdCByZW5kZXJhYmxlcyA9IHRoaXMuZ2V0UmVuZGVyYWJsZUlkcygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlbmRlcmFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJJZCA9IHJlbmRlcmFibGVzW2ldO1xuICAgICAgICAgICAgaWYgKHRpbGUubmVpZ2hib3JpbmdUaWxlcyAmJiB0aWxlLm5laWdoYm9yaW5nVGlsZXNbYm9yZGVySWRdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9yZGVyVGlsZSA9IHRoaXMuZ2V0VGlsZUJ5SUQoYm9yZGVySWQpO1xuICAgICAgICAgICAgICAgIGZpbGxCb3JkZXIodGlsZSwgYm9yZGVyVGlsZSk7XG4gICAgICAgICAgICAgICAgZmlsbEJvcmRlcihib3JkZXJUaWxlLCB0aWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGZpbGxCb3JkZXIodGlsZSwgYm9yZGVyVGlsZSkge1xuICAgICAgICAgICAgaWYgKCF0aWxlLmRlbSB8fCB0aWxlLmRlbS5ib3JkZXJSZWFkeSkgcmV0dXJuO1xuICAgICAgICAgICAgdGlsZS5uZWVkc0hpbGxzaGFkZVByZXBhcmUgPSB0cnVlO1xuICAgICAgICAgICAgdGlsZS5uZWVkc0RFTVRleHR1cmVVcGxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IGR4ID0gYm9yZGVyVGlsZS50aWxlSUQuY2Fub25pY2FsLnggLSB0aWxlLnRpbGVJRC5jYW5vbmljYWwueDtcbiAgICAgICAgICAgIGNvbnN0IGR5ID0gYm9yZGVyVGlsZS50aWxlSUQuY2Fub25pY2FsLnkgLSB0aWxlLnRpbGVJRC5jYW5vbmljYWwueTtcbiAgICAgICAgICAgIGNvbnN0IGRpbSA9IE1hdGgucG93KDIsIHRpbGUudGlsZUlELmNhbm9uaWNhbC56KTtcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlcklkID0gYm9yZGVyVGlsZS50aWxlSUQua2V5O1xuICAgICAgICAgICAgaWYgKGR4ID09PSAwICYmIGR5ID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeSkgPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGR4KSA+IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgdGhlIGRlbHRhIGNvb3JkaW5hdGUgZm9yIHdvcmxkIHdyYXBhcm91bmQuXG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGR4ICsgZGltKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBkeCArPSBkaW07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhkeCAtIGRpbSkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZHggLT0gZGltO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYm9yZGVyVGlsZS5kZW0gfHwgIXRpbGUuZGVtKSByZXR1cm47XG4gICAgICAgICAgICB0aWxlLmRlbS5iYWNrZmlsbEJvcmRlcihib3JkZXJUaWxlLmRlbSwgZHgsIGR5KTtcbiAgICAgICAgICAgIGlmICh0aWxlLm5laWdoYm9yaW5nVGlsZXMgJiYgdGlsZS5uZWlnaGJvcmluZ1RpbGVzW2JvcmRlcklkXSlcbiAgICAgICAgICAgICAgICB0aWxlLm5laWdoYm9yaW5nVGlsZXNbYm9yZGVySWRdLmJhY2tmaWxsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhIHNwZWNpZmljIHRpbGUgYnkgVGlsZUlEXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRUaWxlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6IFRpbGUge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUaWxlQnlJRCh0aWxlSUQua2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyB0aWxlIGJ5IGlkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRUaWxlQnlJRChpZDogbnVtYmVyKTogVGlsZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlc1tpZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yIGEgZ2l2ZW4gc2V0IG9mIHRpbGVzLCByZXRhaW4gY2hpbGRyZW4gdGhhdCBhcmUgbG9hZGVkIGFuZCBoYXZlIGEgem9vbVxuICAgICAqIGJldHdlZW4gYHpvb21gIChleGNsdXNpdmUpIGFuZCBgbWF4Q292ZXJpbmdab29tYCAoaW5jbHVzaXZlKVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3JldGFpbkxvYWRlZENoaWxkcmVuKFxuICAgICAgICBpZGVhbFRpbGVzOiB7W186IGFueV06IE92ZXJzY2FsZWRUaWxlSUR9LFxuICAgICAgICB6b29tOiBudW1iZXIsXG4gICAgICAgIG1heENvdmVyaW5nWm9vbTogbnVtYmVyLFxuICAgICAgICByZXRhaW46IHtbXzogYW55XTogT3ZlcnNjYWxlZFRpbGVJRH1cbiAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG5cbiAgICAgICAgICAgIC8vIG9ubHkgY29uc2lkZXIgcmVuZGVyYWJsZSB0aWxlcyB1cCB0byBtYXhDb3ZlcmluZ1pvb21cbiAgICAgICAgICAgIGlmIChyZXRhaW5baWRdIHx8XG4gICAgICAgICAgICAgICAgIXRpbGUuaGFzRGF0YSgpIHx8XG4gICAgICAgICAgICAgICAgdGlsZS50aWxlSUQub3ZlcnNjYWxlZFogPD0gem9vbSB8fFxuICAgICAgICAgICAgICAgIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaID4gbWF4Q292ZXJpbmdab29tXG4gICAgICAgICAgICApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggcGFyZW50cyBhbmQgcmV0YWluIHRoZSB0b3Btb3N0IGxvYWRlZCBvbmUgaWYgZm91bmRcbiAgICAgICAgICAgIGxldCB0b3Btb3N0TG9hZGVkSUQgPSB0aWxlLnRpbGVJRDtcbiAgICAgICAgICAgIHdoaWxlICh0aWxlICYmIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaID4gem9vbSArIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJRCA9IHRpbGUudGlsZUlELnNjYWxlZFRvKHRpbGUudGlsZUlELm92ZXJzY2FsZWRaIC0gMSk7XG5cbiAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy5fdGlsZXNbcGFyZW50SUQua2V5XTtcblxuICAgICAgICAgICAgICAgIGlmICh0aWxlICYmIHRpbGUuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcG1vc3RMb2FkZWRJRCA9IHBhcmVudElEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGFuY2VzdG9ycyBvZiB0aGUgdG9wbW9zdCBsb2FkZWQgY2hpbGQgdG8gc2VlIGlmIHRoZXJlJ3Mgb25lIHRoYXQgbmVlZGVkIGl0XG4gICAgICAgICAgICBsZXQgdGlsZUlEID0gdG9wbW9zdExvYWRlZElEO1xuICAgICAgICAgICAgd2hpbGUgKHRpbGVJRC5vdmVyc2NhbGVkWiA+IHpvb20pIHtcbiAgICAgICAgICAgICAgICB0aWxlSUQgPSB0aWxlSUQuc2NhbGVkVG8odGlsZUlELm92ZXJzY2FsZWRaIC0gMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaWRlYWxUaWxlc1t0aWxlSUQua2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBhIHBhcmVudCB0aGF0IG5lZWRlZCBhIGxvYWRlZCBjaGlsZDsgcmV0YWluIHRoYXQgY2hpbGRcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW3RvcG1vc3RMb2FkZWRJRC5rZXldID0gdG9wbW9zdExvYWRlZElEO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgbG9hZGVkIHBhcmVudCBvZiB0aGUgZ2l2ZW4gdGlsZSAodXAgdG8gbWluQ292ZXJpbmdab29tKVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZmluZExvYWRlZFBhcmVudCh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIG1pbkNvdmVyaW5nWm9vbTogbnVtYmVyKTogP1RpbGUge1xuICAgICAgICBpZiAodGlsZUlELmtleSBpbiB0aGlzLl9sb2FkZWRQYXJlbnRUaWxlcykge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fbG9hZGVkUGFyZW50VGlsZXNbdGlsZUlELmtleV07XG4gICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC50aWxlSUQub3ZlcnNjYWxlZFogPj0gbWluQ292ZXJpbmdab29tKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgeiA9IHRpbGVJRC5vdmVyc2NhbGVkWiAtIDE7IHogPj0gbWluQ292ZXJpbmdab29tOyB6LS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFRpbGVJRCA9IHRpbGVJRC5zY2FsZWRUbyh6KTtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl9nZXRMb2FkZWRUaWxlKHBhcmVudFRpbGVJRCk7XG4gICAgICAgICAgICBpZiAodGlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2dldExvYWRlZFRpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogP1RpbGUge1xuICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUlELmtleV07XG4gICAgICAgIGlmICh0aWxlICYmIHRpbGUuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGlsZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaWxlQ2FjaGUgaWdub3JlcyB3cmFwIGluIGxvb2t1cC5cbiAgICAgICAgY29uc3QgY2FjaGVkVGlsZSA9IHRoaXMuX2NhY2hlLmdldEJ5S2V5KHRoaXMuX3NvdXJjZS5yZXBhcnNlT3ZlcnNjYWxlZCA/IHRpbGVJRC53cmFwcGVkKCkua2V5IDogdGlsZUlELmNhbm9uaWNhbC5rZXkpO1xuICAgICAgICByZXR1cm4gY2FjaGVkVGlsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSB0aWxlIGNhY2hlIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdwb3J0J3Mgc2l6ZVxuICAgICAqIG9yIHRoZSBtYXhUaWxlQ2FjaGVTaXplIG9wdGlvbiBwYXNzZWQgZHVyaW5nIG1hcCBjcmVhdGlvblxuICAgICAqXG4gICAgICogTGFyZ2VyIHZpZXdwb3J0cyB1c2UgbW9yZSB0aWxlcyBhbmQgbmVlZCBsYXJnZXIgY2FjaGVzLiBMYXJnZXIgdmlld3BvcnRzXG4gICAgICogYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGZvdW5kIG9uIGRldmljZXMgd2l0aCBtb3JlIG1lbW9yeSBhbmQgb24gcGFnZXMgd2hlcmVcbiAgICAgKiB0aGUgbWFwIGlzIG1vcmUgaW1wb3J0YW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdXBkYXRlQ2FjaGVTaXplKHRyYW5zZm9ybTogVHJhbnNmb3JtLCB0aWxlU2l6ZT86IG51bWJlcikge1xuICAgICAgICB0aWxlU2l6ZSA9IHRpbGVTaXplIHx8IHRoaXMuX3NvdXJjZS50aWxlU2l6ZTtcbiAgICAgICAgY29uc3Qgd2lkdGhJblRpbGVzID0gTWF0aC5jZWlsKHRyYW5zZm9ybS53aWR0aCAvIHRpbGVTaXplKSArIDE7XG4gICAgICAgIGNvbnN0IGhlaWdodEluVGlsZXMgPSBNYXRoLmNlaWwodHJhbnNmb3JtLmhlaWdodCAvIHRpbGVTaXplKSArIDE7XG4gICAgICAgIGNvbnN0IGFwcHJveFRpbGVzSW5WaWV3ID0gd2lkdGhJblRpbGVzICogaGVpZ2h0SW5UaWxlcztcbiAgICAgICAgY29uc3QgY29tbW9uWm9vbVJhbmdlID0gNTtcblxuICAgICAgICBjb25zdCB2aWV3RGVwZW5kZW50TWF4U2l6ZSA9IE1hdGguZmxvb3IoYXBwcm94VGlsZXNJblZpZXcgKiBjb21tb25ab29tUmFuZ2UpO1xuICAgICAgICBjb25zdCBtaW5TaXplID0gdHlwZW9mIHRoaXMuX21pblRpbGVDYWNoZVNpemUgPT09ICdudW1iZXInID8gTWF0aC5tYXgodGhpcy5fbWluVGlsZUNhY2hlU2l6ZSwgdmlld0RlcGVuZGVudE1heFNpemUpIDogdmlld0RlcGVuZGVudE1heFNpemU7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB0eXBlb2YgdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9PT0gJ251bWJlcicgPyBNYXRoLm1pbih0aGlzLl9tYXhUaWxlQ2FjaGVTaXplLCBtaW5TaXplKSA6IG1pblNpemU7XG5cbiAgICAgICAgdGhpcy5fY2FjaGUuc2V0TWF4U2l6ZShtYXhTaXplKTtcbiAgICB9XG5cbiAgICBoYW5kbGVXcmFwSnVtcChsbmc6IG51bWJlcikge1xuICAgICAgICAvLyBPbiB0b3Agb2YgdGhlIHJlZ3VsYXIgei94L3kgdmFsdWVzLCBUaWxlSURzIGhhdmUgYSBgd3JhcGAgdmFsdWUgdGhhdCBzcGVjaWZ5XG4gICAgICAgIC8vIHdoaWNoIGNvcHkgb2YgdGhlIHdvcmxkIHRoZSB0aWxlIGJlbG9uZ3MgdG8uIEZvciBleGFtcGxlLCBhdCBgbG5nOiAxMGAgeW91XG4gICAgICAgIC8vIG1pZ2h0IHJlbmRlciB6L3gveS8wIHdoaWxlIGF0IGBsbmc6IDM3MGAgeW91IHdvdWxkIHJlbmRlciB6L3gveS8xLlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVuIGxuZyB2YWx1ZXMgZ2V0IHdyYXBwZWQgKGdvaW5nIGZyb20gYGxuZzogMzcwYCB0byBgbG9uZzogMTBgKSB5b3UgZXhwZWN0XG4gICAgICAgIC8vIHRvIHNlZSB0aGUgc2FtZSB0aGluZyBvbiB0aGUgc2NyZWVuICgzNzAgZGVncmVlcyBhbmQgMTAgZGVncmVlcyBpcyB0aGUgc2FtZVxuICAgICAgICAvLyBwbGFjZSBpbiB0aGUgd29ybGQpIGJ1dCBhbGwgdGhlIFRpbGVJRHMgd2lsbCBoYXZlIGRpZmZlcmVudCB3cmFwIHZhbHVlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSW4gb3JkZXIgdG8gbWFrZSB0aGlzIHRyYW5zaXRpb24gc2VhbWxlc3MsIHdlIGNhbGN1bGF0ZSB0aGUgcm91bmRlZCBkaWZmZXJlbmNlIG9mXG4gICAgICAgIC8vIFwid29ybGRzXCIgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgZnJhbWUuIElmIHRoZSBtYXAgcGFubmVkIGJ5XG4gICAgICAgIC8vIGEgd29ybGQsIHRoZW4gd2UgY2FuIGFzc2lnbiBhbGwgdGhlIHRpbGVzIG5ldyBUaWxlSURzIHdpdGggdXBkYXRlZCB3cmFwIHZhbHVlcy5cbiAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGFzc2lnbiB6L3gveS8xIGEgbmV3IGlkOiB6L3gveS8wLiBJdCBpcyB0aGUgc2FtZSB0aWxlLCBqdXN0IHJlbmRlcmVkXG4gICAgICAgIC8vIGluIGEgZGlmZmVyZW50IHBvc2l0aW9uLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcmV1c2UgdGhlIHRpbGVzIGF0IG1vcmUgaWRlYWwgbG9jYXRpb25zIGFuZCBwcmV2ZW50IGZsaWNrZXJpbmcuXG4gICAgICAgIGNvbnN0IHByZXZMbmcgPSB0aGlzLl9wcmV2TG5nID09PSB1bmRlZmluZWQgPyBsbmcgOiB0aGlzLl9wcmV2TG5nO1xuICAgICAgICBjb25zdCBsbmdEaWZmZXJlbmNlID0gbG5nIC0gcHJldkxuZztcbiAgICAgICAgY29uc3Qgd29ybGREaWZmZXJlbmNlID0gbG5nRGlmZmVyZW5jZSAvIDM2MDtcbiAgICAgICAgY29uc3Qgd3JhcERlbHRhID0gTWF0aC5yb3VuZCh3b3JsZERpZmZlcmVuY2UpO1xuICAgICAgICB0aGlzLl9wcmV2TG5nID0gbG5nO1xuXG4gICAgICAgIGlmICh3cmFwRGVsdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVzOiB7W186IHN0cmluZyB8IG51bWJlcl06IFRpbGV9ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1trZXldO1xuICAgICAgICAgICAgICAgIHRpbGUudGlsZUlEID0gdGlsZS50aWxlSUQudW53cmFwVG8odGlsZS50aWxlSUQud3JhcCArIHdyYXBEZWx0YSk7XG4gICAgICAgICAgICAgICAgdGlsZXNbdGlsZS50aWxlSUQua2V5XSA9IHRpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl90aWxlcyA9IHRpbGVzO1xuXG4gICAgICAgICAgICAvLyBSZXNldCB0aWxlIHJlbG9hZCB0aW1lcnNcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGltZXJzKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyc1tpZF0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90aW1lcnNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0VGlsZVJlbG9hZFRpbWVyKCtpZCwgdGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRpbGVzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHZpZXdwb3J0IGFuZCBhZGRzIG5ldyB0aWxlcyB0aGF0XG4gICAgICogYXJlIGluc2lkZSB0aGUgdmlld3BvcnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVwZGF0ZUZvclRlcnJhaW4gU2lnbmFscyB0byB1cGRhdGUgdGlsZXMgZXZlbiBpZiB0aGVcbiAgICAgKiBzb3VyY2UgaXMgbm90IHVzZWQgKHRoaXMudXNlZCkgYnkgbGF5ZXJzOiBpdCBpcyB1c2VkIGZvciB0ZXJyYWluLlxuICAgICAqIEBwYXJhbSB7dGlsZVNpemV9IHRpbGVTaXplIElmIG5lZWRlZCB0byBnZXQgbG93ZXIgcmVzb2x1dGlvbiBpZGVhbCBjb3ZlcixcbiAgICAgKiBvdmVycmlkZSBzb3VyY2UudGlsZVNpemUgdXNlZCBpbiB0aWxlIGNvdmVyIGNhbGN1bGF0aW9uLlxuICAgICAqL1xuICAgIHVwZGF0ZSh0cmFuc2Zvcm06IFRyYW5zZm9ybSwgdGlsZVNpemU/OiBudW1iZXIsIHVwZGF0ZUZvclRlcnJhaW4/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZUxvYWRlZCB8fCB0aGlzLl9wYXVzZWQgfHwgdGhpcy50cmFuc2Zvcm0uZnJlZXplVGlsZUNvdmVyYWdlKSB7IHJldHVybjsgfVxuICAgICAgICBhc3NlcnQoISh1cGRhdGVGb3JUZXJyYWluICYmICF0aGlzLnVzZWRGb3JUZXJyYWluKSk7XG4gICAgICAgIGlmICh0aGlzLnVzZWRGb3JUZXJyYWluICYmICF1cGRhdGVGb3JUZXJyYWluKSB7XG4gICAgICAgICAgICAvLyBJZiBzb3VyY2UgaXMgdXNlZCBmb3IgYm90aCB0ZXJyYWluIGFuZCBoaWxsc2hhZGUsIGRvbid0IHVwZGF0ZSBpdCB0d2ljZS5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlQ2FjaGVTaXplKHRyYW5zZm9ybSwgdGlsZVNpemUpO1xuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lICE9PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVdyYXBKdW1wKHRoaXMudHJhbnNmb3JtLmNlbnRlci5sbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ292ZXJlZCBpcyBhIGxpc3Qgb2YgcmV0YWluZWQgdGlsZXMgd2hvJ3MgYXJlYXMgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgb3RoZXIsXG4gICAgICAgIC8vIGJldHRlciwgcmV0YWluZWQgdGlsZXMuIFRoZXkgYXJlIG5vdCBkcmF3biBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXMgPSB7fTtcblxuICAgICAgICBsZXQgaWRlYWxUaWxlSURzO1xuICAgICAgICBpZiAoIXRoaXMudXNlZCAmJiAhdGhpcy51c2VkRm9yVGVycmFpbikge1xuICAgICAgICAgICAgaWRlYWxUaWxlSURzID0gW107XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc291cmNlLnRpbGVJRCkge1xuICAgICAgICAgICAgaWRlYWxUaWxlSURzID0gdHJhbnNmb3JtLmdldFZpc2libGVVbndyYXBwZWRDb29yZGluYXRlcyh0aGlzLl9zb3VyY2UudGlsZUlEKVxuICAgICAgICAgICAgICAgIC5tYXAoKHVud3JhcHBlZCkgPT4gbmV3IE92ZXJzY2FsZWRUaWxlSUQodW53cmFwcGVkLmNhbm9uaWNhbC56LCB1bndyYXBwZWQud3JhcCwgdW53cmFwcGVkLmNhbm9uaWNhbC56LCB1bndyYXBwZWQuY2Fub25pY2FsLngsIHVud3JhcHBlZC5jYW5vbmljYWwueSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWRlYWxUaWxlSURzID0gdHJhbnNmb3JtLmNvdmVyaW5nVGlsZXMoe1xuICAgICAgICAgICAgICAgIHRpbGVTaXplOiB0aWxlU2l6ZSB8fCB0aGlzLl9zb3VyY2UudGlsZVNpemUsXG4gICAgICAgICAgICAgICAgbWluem9vbTogdGhpcy5fc291cmNlLm1pbnpvb20sXG4gICAgICAgICAgICAgICAgbWF4em9vbTogdGhpcy5fc291cmNlLm1heHpvb20sXG4gICAgICAgICAgICAgICAgcm91bmRab29tOiB0aGlzLl9zb3VyY2Uucm91bmRab29tICYmICF1cGRhdGVGb3JUZXJyYWluLFxuICAgICAgICAgICAgICAgIHJlcGFyc2VPdmVyc2NhbGVkOiB0aGlzLl9zb3VyY2UucmVwYXJzZU92ZXJzY2FsZWQsXG4gICAgICAgICAgICAgICAgaXNUZXJyYWluREVNOiB0aGlzLnVzZWRGb3JUZXJyYWluXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5oYXNUaWxlKSB7XG4gICAgICAgICAgICAgICAgaWRlYWxUaWxlSURzID0gaWRlYWxUaWxlSURzLmZpbHRlcigoY29vcmQpID0+ICh0aGlzLl9zb3VyY2UuaGFzVGlsZTogYW55KShjb29yZCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0YWluIGlzIGEgbGlzdCBvZiB0aWxlcyB0aGF0IHdlIHNob3VsZG4ndCBkZWxldGUsIGV2ZW4gaWYgdGhleSBhcmUgbm90XG4gICAgICAgIC8vIHRoZSBtb3N0IGlkZWFsIHRpbGUgZm9yIHRoZSBjdXJyZW50IHZpZXdwb3J0LiBUaGlzIG1heSBpbmNsdWRlIHRpbGVzIGxpa2VcbiAgICAgICAgLy8gcGFyZW50IG9yIGNoaWxkIHRpbGVzIHRoYXQgYXJlICphbHJlYWR5KiBsb2FkZWQuXG4gICAgICAgIGNvbnN0IHJldGFpbiA9IHRoaXMuX3VwZGF0ZVJldGFpbmVkVGlsZXMoaWRlYWxUaWxlSURzKTtcblxuICAgICAgICBpZiAoaXNSYXN0ZXJUeXBlKHRoaXMuX3NvdXJjZS50eXBlKSAmJiBpZGVhbFRpbGVJRHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRzRm9yRmFkaW5nOiB7W186IHN0cmluZyB8IG51bWJlcl06IE92ZXJzY2FsZWRUaWxlSUR9ID0ge307XG4gICAgICAgICAgICBjb25zdCBmYWRpbmdUaWxlcyA9IHt9O1xuICAgICAgICAgICAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMocmV0YWluKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZUlEID0gcmV0YWluW2lkXTtcbiAgICAgICAgICAgICAgICBhc3NlcnQodGlsZUlELmtleSA9PT0gK2lkKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8IHRpbGUuZmFkZUVuZFRpbWUgJiYgdGlsZS5mYWRlRW5kVGltZSA8PSBicm93c2VyLm5vdygpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0aWxlIGlzIGxvYWRlZCBidXQgc3RpbGwgZmFkaW5nIGluLCBmaW5kIHBhcmVudHMgdG8gY3Jvc3MtZmFkZSB3aXRoIGl0XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50VGlsZSA9IHRoaXMuZmluZExvYWRlZFBhcmVudCh0aWxlSUQsIE1hdGgubWF4KHRpbGVJRC5vdmVyc2NhbGVkWiAtIFNvdXJjZUNhY2hlLm1heE92ZXJ6b29taW5nLCB0aGlzLl9zb3VyY2UubWluem9vbSkpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRUaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFRpbGUocGFyZW50VGlsZS50aWxlSUQpO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRzRm9yRmFkaW5nW3BhcmVudFRpbGUudGlsZUlELmtleV0gPSBwYXJlbnRUaWxlLnRpbGVJRDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmYWRpbmdUaWxlc1tpZF0gPSB0aWxlSUQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGZvciBjaGlsZHJlbiB0aWxlcyB3aXRoIHBhcmVudCB0aWxlcyBzdGlsbCBmYWRpbmcgaW4sXG4gICAgICAgICAgICAvLyByZXRhaW4gdGhlIGNoaWxkcmVuIHNvIHRoZSBwYXJlbnQgY2FuIGZhZGUgb24gdG9wXG4gICAgICAgICAgICBjb25zdCBtaW5ab29tID0gaWRlYWxUaWxlSURzW2lkZWFsVGlsZUlEcy5sZW5ndGggLSAxXS5vdmVyc2NhbGVkWjtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKHJldGFpbltpZF0gfHwgIWNoaWxkVGlsZS5oYXNEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudElEID0gY2hpbGRUaWxlLnRpbGVJRDtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50SUQub3ZlcnNjYWxlZFogPiBtaW5ab29tKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudElEID0gcGFyZW50SUQuc2NhbGVkVG8ocGFyZW50SUQub3ZlcnNjYWxlZFogLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW3BhcmVudElELmtleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlICYmIHRpbGUuaGFzRGF0YSgpICYmIGZhZGluZ1RpbGVzW3BhcmVudElELmtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldGFpbltpZF0gPSBjaGlsZFRpbGUudGlsZUlEO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gcGFyZW50c0ZvckZhZGluZykge1xuICAgICAgICAgICAgICAgIGlmICghcmV0YWluW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIHRpbGUgaXMgb25seSBuZWVkZWQgZm9yIGZhZGluZywgbWFyayBpdCBhcyBjb3ZlcmVkIHNvIHRoYXQgaXQgaXNuJ3QgcmVuZGVyZWQgb24gaXQncyBvd24uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvdmVyZWRUaWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXRhaW5baWRdID0gcGFyZW50c0ZvckZhZGluZ1tpZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZXRhaW5lZElkIGluIHJldGFpbikge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHJldGFpbmVkIHRpbGVzIGFsd2F5cyBjbGVhciBhbnkgZXhpc3RpbmcgZmFkZSBob2xkc1xuICAgICAgICAgICAgLy8gc28gdGhhdCBpZiB0aGV5J3JlIHJlbW92ZWQgYWdhaW4gdGhlaXIgZmFkZSB0aW1lciBzdGFydHMgZnJlc2guXG4gICAgICAgICAgICB0aGlzLl90aWxlc1tyZXRhaW5lZElkXS5jbGVhckZhZGVIb2xkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHRpbGVzIHdlIGRvbid0IG5lZWQgYW55bW9yZS5cbiAgICAgICAgY29uc3QgcmVtb3ZlID0ga2V5c0RpZmZlcmVuY2UoKHRoaXMuX3RpbGVzOiBhbnkpLCAocmV0YWluOiBhbnkpKTtcbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgcmVtb3ZlKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUlEXTtcbiAgICAgICAgICAgIGlmICh0aWxlLmhhc1N5bWJvbEJ1Y2tldHMgJiYgIXRpbGUuaG9sZGluZ0ZvckZhZGUoKSkge1xuICAgICAgICAgICAgICAgIHRpbGUuc2V0SG9sZER1cmF0aW9uKHRoaXMubWFwLl9mYWRlRHVyYXRpb24pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGlsZS5oYXNTeW1ib2xCdWNrZXRzIHx8IHRpbGUuc3ltYm9sRmFkZUZpbmlzaGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVUaWxlKCt0aWxlSUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGEgY2FjaGUgb2YgbG9hZGVkIHBhcmVudHNcbiAgICAgICAgdGhpcy5fdXBkYXRlTG9hZGVkUGFyZW50VGlsZUNhY2hlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX29ubHlTeW1ib2xzICYmIHRoaXMuX3NvdXJjZS5hZnRlclVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlLmFmdGVyVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWxlYXNlU3ltYm9sRmFkZVRpbGVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdGlsZXNbaWRdLmhvbGRpbmdGb3JGYWRlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVUaWxlKCtpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlUmV0YWluZWRUaWxlcyhpZGVhbFRpbGVJRHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KToge1tfOiBudW1iZXIgfCBzdHJpbmddOiBPdmVyc2NhbGVkVGlsZUlEfSB7XG4gICAgICAgIGNvbnN0IHJldGFpbjoge1tfOiBudW1iZXIgfCBzdHJpbmddOiBPdmVyc2NhbGVkVGlsZUlEfSA9IHt9O1xuICAgICAgICBpZiAoaWRlYWxUaWxlSURzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gcmV0YWluOyB9XG5cbiAgICAgICAgY29uc3QgY2hlY2tlZDoge1tfOiBudW1iZXIgfCBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgICAgICAgY29uc3QgbWluWm9vbSA9IGlkZWFsVGlsZUlEcy5yZWR1Y2UoKG1pbiwgaWQpID0+IE1hdGgubWluKG1pbiwgaWQub3ZlcnNjYWxlZFopLCBJbmZpbml0eSk7XG4gICAgICAgIGNvbnN0IG1heFpvb20gPSBpZGVhbFRpbGVJRHNbMF0ub3ZlcnNjYWxlZFo7XG4gICAgICAgIGFzc2VydChtaW5ab29tIDw9IG1heFpvb20pO1xuICAgICAgICBjb25zdCBtaW5Db3ZlcmluZ1pvb20gPSBNYXRoLm1heChtYXhab29tIC0gU291cmNlQ2FjaGUubWF4T3Zlcnpvb21pbmcsIHRoaXMuX3NvdXJjZS5taW56b29tKTtcbiAgICAgICAgY29uc3QgbWF4Q292ZXJpbmdab29tID0gTWF0aC5tYXgobWF4Wm9vbSArIFNvdXJjZUNhY2hlLm1heFVuZGVyem9vbWluZywgIHRoaXMuX3NvdXJjZS5taW56b29tKTtcblxuICAgICAgICBjb25zdCBtaXNzaW5nVGlsZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgaWRlYWxUaWxlSURzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fYWRkVGlsZSh0aWxlSUQpO1xuXG4gICAgICAgICAgICAvLyByZXRhaW4gdGhlIHRpbGUgZXZlbiBpZiBpdCdzIG5vdCBsb2FkZWQgYmVjYXVzZSBpdCdzIGFuIGlkZWFsIHRpbGUuXG4gICAgICAgICAgICByZXRhaW5bdGlsZUlELmtleV0gPSB0aWxlSUQ7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmhhc0RhdGEoKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmIChtaW5ab29tIDwgdGhpcy5fc291cmNlLm1heHpvb20pIHtcbiAgICAgICAgICAgICAgICAvLyBzYXZlIG1pc3NpbmcgdGlsZXMgdGhhdCBwb3RlbnRpYWxseSBoYXZlIGxvYWRlZCBjaGlsZHJlblxuICAgICAgICAgICAgICAgIG1pc3NpbmdUaWxlc1t0aWxlSUQua2V5XSA9IHRpbGVJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJldGFpbiBhbnkgbG9hZGVkIGNoaWxkcmVuIG9mIGlkZWFsIHRpbGVzIHVwIHRvIG1heENvdmVyaW5nWm9vbVxuICAgICAgICB0aGlzLl9yZXRhaW5Mb2FkZWRDaGlsZHJlbihtaXNzaW5nVGlsZXMsIG1pblpvb20sIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGVJRCBvZiBpZGVhbFRpbGVJRHMpIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUlELmtleV07XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmhhc0RhdGEoKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIFRoZSB0aWxlIHdlIHJlcXVpcmUgaXMgbm90IHlldCBsb2FkZWQgb3IgZG9lcyBub3QgZXhpc3Q7XG4gICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGZpbmQgY2hpbGRyZW4gdGhhdCBmdWxseSBjb3ZlciBpdC5cblxuICAgICAgICAgICAgaWYgKHRpbGVJRC5jYW5vbmljYWwueiA+PSB0aGlzLl9zb3VyY2UubWF4em9vbSkge1xuICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGxvb2tpbmcgZm9yIGFuIG92ZXJ6b29tZWQgY2hpbGQgdGlsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZENvb3JkID0gdGlsZUlELmNoaWxkcmVuKHRoaXMuX3NvdXJjZS5tYXh6b29tKVswXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFRpbGUgPSB0aGlzLmdldFRpbGUoY2hpbGRDb29yZCk7XG4gICAgICAgICAgICAgICAgaWYgKCEhY2hpbGRUaWxlICYmIGNoaWxkVGlsZS5oYXNEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW2NoaWxkQ29vcmQua2V5XSA9IGNoaWxkQ29vcmQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyB0aWxlIGlzIGNvdmVyZWQgYnkgb3Zlcnpvb21lZCBjaGlsZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYWxsIDQgaW1tZWRpYXRlIGNoaWxkcmVuIGFyZSBsb2FkZWQgKGluIG90aGVyIHdvcmRzLCB0aGUgbWlzc2luZyBpZGVhbCB0aWxlIGlzIGNvdmVyZWQpXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aWxlSUQuY2hpbGRyZW4odGhpcy5fc291cmNlLm1heHpvb20pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJldGFpbltjaGlsZHJlblswXS5rZXldICYmXG4gICAgICAgICAgICAgICAgICAgIHJldGFpbltjaGlsZHJlblsxXS5rZXldICYmXG4gICAgICAgICAgICAgICAgICAgIHJldGFpbltjaGlsZHJlblsyXS5rZXldICYmXG4gICAgICAgICAgICAgICAgICAgIHJldGFpbltjaGlsZHJlblszXS5rZXldKSBjb250aW51ZTsgLy8gdGlsZSBpcyBjb3ZlcmVkIGJ5IGNoaWxkcmVuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlIGNvdWxkbid0IGZpbmQgY2hpbGQgdGlsZXMgdGhhdCBlbnRpcmVseSBjb3ZlciB0aGUgaWRlYWwgdGlsZTsgbG9vayBmb3IgcGFyZW50cyBub3cuXG5cbiAgICAgICAgICAgIC8vIEFzIHdlIGFzY2VuZCB1cCB0aGUgdGlsZSBweXJhbWlkIG9mIHRoZSBpZGVhbCB0aWxlLCB3ZSBjaGVjayB3aGV0aGVyIHRoZSBwYXJlbnRcbiAgICAgICAgICAgIC8vIHRpbGUgaGFzIGJlZW4gcHJldmlvdXNseSByZXF1ZXN0ZWQgKGFuZCBlcnJvcmVkIGJlY2F1c2Ugd2Ugb25seSBsb29wIG92ZXIgdGlsZXMgd2l0aCBubyBkYXRhKVxuICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gcmVxdWVzdCBpdHMgcGFyZW50LlxuICAgICAgICAgICAgbGV0IHBhcmVudFdhc1JlcXVlc3RlZCA9IHRpbGUud2FzUmVxdWVzdGVkKCk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IG92ZXJzY2FsZWRaID0gdGlsZUlELm92ZXJzY2FsZWRaIC0gMTsgb3ZlcnNjYWxlZFogPj0gbWluQ292ZXJpbmdab29tOyAtLW92ZXJzY2FsZWRaKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SWQgPSB0aWxlSUQuc2NhbGVkVG8ob3ZlcnNjYWxlZFopO1xuXG4gICAgICAgICAgICAgICAgLy8gQnJlYWsgcGFyZW50IHRpbGUgYXNjZW50IGlmIHRoaXMgcm91dGUgaGFzIGJlZW4gcHJldmlvdXNseSBjaGVja2VkIGJ5IGFub3RoZXIgY2hpbGQuXG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrZWRbcGFyZW50SWQua2V5XSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2hlY2tlZFtwYXJlbnRJZC5rZXldID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHRpbGUgPSB0aGlzLmdldFRpbGUocGFyZW50SWQpO1xuICAgICAgICAgICAgICAgIGlmICghdGlsZSAmJiBwYXJlbnRXYXNSZXF1ZXN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZSA9IHRoaXMuX2FkZFRpbGUocGFyZW50SWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGlsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXRhaW5bcGFyZW50SWQua2V5XSA9IHBhcmVudElkO1xuICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBjdXJyZW50IHZhbHVlcywgc2luY2UgdGhleSdyZSB0aGUgcGFyZW50IG9mIHRoZSBuZXh0IGl0ZXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgcGFyZW50IHRpbGUgYXNjZW50IGxvb3AuXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFdhc1JlcXVlc3RlZCA9IHRpbGUud2FzUmVxdWVzdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlLmhhc0RhdGEoKSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldGFpbjtcbiAgICB9XG5cbiAgICBfdXBkYXRlTG9hZGVkUGFyZW50VGlsZUNhY2hlKCkge1xuICAgICAgICB0aGlzLl9sb2FkZWRQYXJlbnRUaWxlcyA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgdGlsZUtleSBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IFtdO1xuICAgICAgICAgICAgbGV0IHBhcmVudFRpbGU6ID9UaWxlO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRJZCA9IHRoaXMuX3RpbGVzW3RpbGVLZXldLnRpbGVJRDtcblxuICAgICAgICAgICAgLy8gRmluZCB0aGUgY2xvc2VzdCBsb2FkZWQgYW5jZXN0b3IgYnkgdHJhdmVyc2luZyB0aGUgdGlsZSB0cmVlIHRvd2FyZHMgdGhlIHJvb3QgYW5kXG4gICAgICAgICAgICAvLyBjYWNoaW5nIHJlc3VsdHMgYWxvbmcgdGhlIHdheVxuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRJZC5vdmVyc2NhbGVkWiA+IDApIHtcblxuICAgICAgICAgICAgICAgIC8vIERvIHdlIGhhdmUgYSBjYWNoZWQgcmVzdWx0IGZyb20gcHJldmlvdXMgdHJhdmVyc2Fscz9cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudElkLmtleSBpbiB0aGlzLl9sb2FkZWRQYXJlbnRUaWxlcykge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRUaWxlID0gdGhpcy5fbG9hZGVkUGFyZW50VGlsZXNbY3VycmVudElkLmtleV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhdGgucHVzaChjdXJyZW50SWQua2V5KTtcblxuICAgICAgICAgICAgICAgIC8vIElzIHRoZSBwYXJlbnQgbG9hZGVkP1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gY3VycmVudElkLnNjYWxlZFRvKGN1cnJlbnRJZC5vdmVyc2NhbGVkWiAtIDEpO1xuICAgICAgICAgICAgICAgIHBhcmVudFRpbGUgPSB0aGlzLl9nZXRMb2FkZWRUaWxlKHBhcmVudElkKTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50VGlsZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdXJyZW50SWQgPSBwYXJlbnRJZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdCBvZiB0aGlzIHRyYXZlcnNhbCB0byBhbGwgbmV3bHkgdmlzaXRlZCB0aWxlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcGF0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzW2tleV0gPSBwYXJlbnRUaWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgdGlsZSwgZ2l2ZW4gaXRzIGNvb3JkaW5hdGUsIHRvIHRoZSBweXJhbWlkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2FkZFRpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogVGlsZSB7XG4gICAgICAgIGxldCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUlELmtleV07XG4gICAgICAgIGlmICh0aWxlKVxuICAgICAgICAgICAgcmV0dXJuIHRpbGU7XG5cbiAgICAgICAgdGlsZSA9IHRoaXMuX2NhY2hlLmdldEFuZFJlbW92ZSh0aWxlSUQpO1xuICAgICAgICBpZiAodGlsZSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0VGlsZVJlbG9hZFRpbWVyKHRpbGVJRC5rZXksIHRpbGUpO1xuICAgICAgICAgICAgLy8gc2V0IHRoZSB0aWxlSUQgYmVjYXVzZSB0aGUgY2FjaGVkIHRpbGUgY291bGQgaGF2ZSBoYWQgYSBkaWZmZXJlbnQgd3JhcCB2YWx1ZVxuICAgICAgICAgICAgdGlsZS50aWxlSUQgPSB0aWxlSUQ7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZS5pbml0aWFsaXplVGlsZVN0YXRlKHRpbGUsIHRoaXMubWFwID8gdGhpcy5tYXAucGFpbnRlciA6IG51bGwpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlVGltZXJzW3RpbGVJRC5rZXldKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2NhY2hlVGltZXJzW3RpbGVJRC5rZXldKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fY2FjaGVUaW1lcnNbdGlsZUlELmtleV07XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0VGlsZVJlbG9hZFRpbWVyKHRpbGVJRC5rZXksIHRpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FjaGVkID0gQm9vbGVhbih0aWxlKTtcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaW50ZXIgPSB0aGlzLm1hcCA/IHRoaXMubWFwLnBhaW50ZXIgOiBudWxsO1xuICAgICAgICAgICAgY29uc3QgaXNSYXN0ZXIgPSB0aGlzLl9zb3VyY2UudHlwZSA9PT0gJ3Jhc3RlcicgfHwgdGhpcy5fc291cmNlLnR5cGUgPT09ICdyYXN0ZXItZGVtJztcbiAgICAgICAgICAgIHRpbGUgPSBuZXcgVGlsZSh0aWxlSUQsIHRoaXMuX3NvdXJjZS50aWxlU2l6ZSAqIHRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKSwgdGhpcy50cmFuc2Zvcm0udGlsZVpvb20sIHBhaW50ZXIsIGlzUmFzdGVyKTtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRUaWxlKHRpbGUsIHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLCB0aWxlLCB0aWxlSUQua2V5LCB0aWxlLnN0YXRlKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgc2lsZW5jZSBmbG93LlxuICAgICAgICBpZiAoIXRpbGUpIHJldHVybiAobnVsbDogYW55KTtcblxuICAgICAgICB0aWxlLnVzZXMrKztcbiAgICAgICAgdGhpcy5fdGlsZXNbdGlsZUlELmtleV0gPSB0aWxlO1xuICAgICAgICBpZiAoIWNhY2hlZCkgdGhpcy5fc291cmNlLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHt0aWxlLCBjb29yZDogdGlsZS50aWxlSUQsIGRhdGFUeXBlOiAnc291cmNlJ30pKTtcblxuICAgICAgICByZXR1cm4gdGlsZTtcbiAgICB9XG5cbiAgICBfc2V0VGlsZVJlbG9hZFRpbWVyKGlkOiBudW1iZXIsIHRpbGU6IFRpbGUpIHtcbiAgICAgICAgaWYgKGlkIGluIHRoaXMuX3RpbWVycykge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyc1tpZF0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RpbWVyc1tpZF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHBpcnlUaW1lb3V0ID0gdGlsZS5nZXRFeHBpcnlUaW1lb3V0KCk7XG4gICAgICAgIGlmIChleHBpcnlUaW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLl90aW1lcnNbaWRdID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkVGlsZShpZCwgJ2V4cGlyZWQnKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdGltZXJzW2lkXTtcbiAgICAgICAgICAgIH0sIGV4cGlyeVRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgdGlsZSwgZ2l2ZW4gaXRzIGlkLCBmcm9tIHRoZSBweXJhbWlkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcmVtb3ZlVGlsZShpZDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgIGlmICghdGlsZSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aWxlLnVzZXMtLTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3RpbGVzW2lkXTtcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVyc1tpZF0pIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcnNbaWRdKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90aW1lcnNbaWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbGUudXNlcyA+IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKHRpbGUuaGFzRGF0YSgpICYmIHRpbGUuc3RhdGUgIT09ICdyZWxvYWRpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5hZGQodGlsZS50aWxlSUQsIHRpbGUsIHRpbGUuZ2V0RXhwaXJ5VGltZW91dCgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9hYm9ydFRpbGUodGlsZSk7XG4gICAgICAgICAgICB0aGlzLl91bmxvYWRUaWxlKHRpbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCB0aWxlcyBmcm9tIHRoaXMgcHlyYW1pZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNsZWFyVGlsZXMoKSB7XG4gICAgICAgIHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVUaWxlKCtpZCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5fY2xlYXIpIHRoaXMuX3NvdXJjZS5fY2xlYXIoKTtcblxuICAgICAgICB0aGlzLl9jYWNoZS5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlYXJjaCB0aHJvdWdoIG91ciBjdXJyZW50IHRpbGVzIGFuZCBhdHRlbXB0IHRvIGZpbmQgdGhlIHRpbGVzIHRoYXQgY292ZXIgdGhlIGdpdmVuIGBxdWVyeUdlb21ldHJ5YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UXVlcnlHZW9tZXRyeX0gcXVlcnlHZW9tZXRyeVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Zpc3VhbGl6ZVF1ZXJ5R2VvbWV0cnk9ZmFsc2VdXG4gICAgICogQHBhcmFtIHtib29sZWFufSB1c2UzRFF1ZXJ5XG4gICAgICogQHJldHVybnNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRpbGVzSW4ocXVlcnlHZW9tZXRyeTogUXVlcnlHZW9tZXRyeSwgdXNlM0RRdWVyeTogYm9vbGVhbiwgdmlzdWFsaXplUXVlcnlHZW9tZXRyeTogYm9vbGVhbik6IFRpbGVzcGFjZVF1ZXJ5R2VvbWV0cnlbXSB7XG4gICAgICAgIGNvbnN0IHRpbGVSZXN1bHRzID0gW107XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm07XG4gICAgICAgIGlmICghdHJhbnNmb3JtKSByZXR1cm4gdGlsZVJlc3VsdHM7XG5cbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1t0aWxlSURdO1xuICAgICAgICAgICAgaWYgKHZpc3VhbGl6ZVF1ZXJ5R2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICB0aWxlLmNsZWFyUXVlcnlEZWJ1Z1ZpeigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRpbGUuaG9sZGluZ0ZvckZhZGUoKSkge1xuICAgICAgICAgICAgICAgIC8vIFRpbGVzIGhlbGQgZm9yIGZhZGluZyBhcmUgY292ZXJlZCBieSB0aWxlcyB0aGF0IGFyZSBjbG9zZXIgdG8gaWRlYWxcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGlsZVJlc3VsdCA9IHF1ZXJ5R2VvbWV0cnkuY29udGFpbnNUaWxlKHRpbGUsIHRyYW5zZm9ybSwgdXNlM0RRdWVyeSk7XG4gICAgICAgICAgICBpZiAodGlsZVJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHRpbGVSZXN1bHRzLnB1c2godGlsZVJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbGVSZXN1bHRzO1xuICAgIH1cblxuICAgIGdldFZpc2libGVDb29yZGluYXRlcyhzeW1ib2xMYXllcj86IGJvb2xlYW4pOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPiB7XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuZ2V0UmVuZGVyYWJsZUlkcyhzeW1ib2xMYXllcikubWFwKChpZCkgPT4gdGhpcy5fdGlsZXNbaWRdLnRpbGVJRCk7XG4gICAgICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgICAgICBjb29yZC5wcm9qTWF0cml4ID0gdGhpcy50cmFuc2Zvcm0uY2FsY3VsYXRlUHJvak1hdHJpeChjb29yZC50b1Vud3JhcHBlZCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29vcmRzO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UuaGFzVHJhbnNpdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1Jhc3RlclR5cGUodGhpcy5fc291cmNlLnR5cGUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS5mYWRlRW5kVGltZSAhPT0gdW5kZWZpbmVkICYmIHRpbGUuZmFkZUVuZFRpbWUgPj0gYnJvd3Nlci5ub3coKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBhIHBhcnRpY3VsYXIgc3RhdGUgZm9yIGEgZmVhdHVyZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2V0RmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyPzogc3RyaW5nLCBmZWF0dXJlSWQ6IG51bWJlciB8IHN0cmluZywgc3RhdGU6IE9iamVjdCkge1xuICAgICAgICBzb3VyY2VMYXllciA9IHNvdXJjZUxheWVyIHx8ICdfZ2VvanNvblRpbGVMYXllcic7XG4gICAgICAgIHRoaXMuX3N0YXRlLnVwZGF0ZVN0YXRlKHNvdXJjZUxheWVyLCBmZWF0dXJlSWQsIHN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHZhbHVlIG9mIGEgcGFydGljdWxhciBzdGF0ZSBrZXkgZm9yIGEgZmVhdHVyZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVtb3ZlRmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyPzogc3RyaW5nLCBmZWF0dXJlSWQ/OiBudW1iZXIgfCBzdHJpbmcsIGtleT86IHN0cmluZykge1xuICAgICAgICBzb3VyY2VMYXllciA9IHNvdXJjZUxheWVyIHx8ICdfZ2VvanNvblRpbGVMYXllcic7XG4gICAgICAgIHRoaXMuX3N0YXRlLnJlbW92ZUZlYXR1cmVTdGF0ZShzb3VyY2VMYXllciwgZmVhdHVyZUlkLCBrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZW50aXJlIHN0YXRlIG9iamVjdCBmb3IgYSBmZWF0dXJlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXI/OiBzdHJpbmcsIGZlYXR1cmVJZDogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIHNvdXJjZUxheWVyID0gc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlLmdldFN0YXRlKHNvdXJjZUxheWVyLCBmZWF0dXJlSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNldCBvZiBrZXlzIHRoYXQgdGhlIHRpbGUgZGVwZW5kcyBvbi4gVGhpcyBhbGxvd3MgdGlsZXMgdG9cbiAgICAgKiBiZSByZWxvYWRlZCB3aGVuIHRoZWlyIGRlcGVuZGVuY2llcyBjaGFuZ2UuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXREZXBlbmRlbmNpZXModGlsZUtleTogbnVtYmVyLCBuYW1lc3BhY2U6IHN0cmluZywgZGVwZW5kZW5jaWVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1t0aWxlS2V5XTtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIHRpbGUuc2V0RGVwZW5kZW5jaWVzKG5hbWVzcGFjZSwgZGVwZW5kZW5jaWVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbG9hZHMgYWxsIHRpbGVzIHRoYXQgZGVwZW5kIG9uIHRoZSBnaXZlbiBrZXlzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVsb2FkVGlsZXNGb3JEZXBlbmRlbmNpZXMobmFtZXNwYWNlczogQXJyYXk8c3RyaW5nPiwga2V5czogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICAgICAgaWYgKHRpbGUuaGFzRGVwZW5kZW5jeShuYW1lc3BhY2VzLCBrZXlzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFRpbGUoK2lkLCAncmVsb2FkaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2FjaGUuZmlsdGVyKHRpbGUgPT4gIXRpbGUuaGFzRGVwZW5kZW5jeShuYW1lc3BhY2VzLCBrZXlzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlbG9hZHMgYWxsIHRpbGVzIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgZm9yIG9uZSBvciBhIHNlcmllcyBvZiB0cmFuc2Zvcm1hdGlvbnNcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgdGhpc2AgfCBQcm9taXNlLlxuICAgICAqL1xuICAgIF9wcmVsb2FkVGlsZXModHJhbnNmb3JtOiBUcmFuc2Zvcm0gfCBBcnJheTxUcmFuc2Zvcm0+LCBjYWxsYmFjazogQ2FsbGJhY2s8YW55Pikge1xuICAgICAgICBjb25zdCBjb3ZlcmluZ1RpbGVzSURzOiBNYXA8bnVtYmVyLCBPdmVyc2NhbGVkVGlsZUlEPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtcyA9IEFycmF5LmlzQXJyYXkodHJhbnNmb3JtKSA/IHRyYW5zZm9ybSA6IFt0cmFuc2Zvcm1dO1xuXG4gICAgICAgIGNvbnN0IHRlcnJhaW4gPSB0aGlzLm1hcC5wYWludGVyLnRlcnJhaW47XG4gICAgICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy51c2VkRm9yVGVycmFpbiAmJiB0ZXJyYWluID8gdGVycmFpbi5nZXRTY2FsZWREZW1UaWxlU2l6ZSgpIDogdGhpcy5fc291cmNlLnRpbGVTaXplO1xuXG4gICAgICAgIGZvciAoY29uc3QgdHIgb2YgdHJhbnNmb3Jtcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZUlEcyA9IHRyLmNvdmVyaW5nVGlsZXMoe1xuICAgICAgICAgICAgICAgIHRpbGVTaXplLFxuICAgICAgICAgICAgICAgIG1pbnpvb206IHRoaXMuX3NvdXJjZS5taW56b29tLFxuICAgICAgICAgICAgICAgIG1heHpvb206IHRoaXMuX3NvdXJjZS5tYXh6b29tLFxuICAgICAgICAgICAgICAgIHJvdW5kWm9vbTogdGhpcy5fc291cmNlLnJvdW5kWm9vbSAmJiAhdGhpcy51c2VkRm9yVGVycmFpbixcbiAgICAgICAgICAgICAgICByZXBhcnNlT3ZlcnNjYWxlZDogdGhpcy5fc291cmNlLnJlcGFyc2VPdmVyc2NhbGVkLFxuICAgICAgICAgICAgICAgIGlzVGVycmFpbkRFTTogdGhpcy51c2VkRm9yVGVycmFpblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIHRpbGVJRHMpIHtcbiAgICAgICAgICAgICAgICBjb3ZlcmluZ1RpbGVzSURzLnNldCh0aWxlSUQua2V5LCB0aWxlSUQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy51c2VkRm9yVGVycmFpbikge1xuICAgICAgICAgICAgICAgIHRyLnVwZGF0ZUVsZXZhdGlvbihmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aWxlSURzID0gQXJyYXkuZnJvbShjb3ZlcmluZ1RpbGVzSURzLnZhbHVlcygpKTtcbiAgICAgICAgY29uc3QgaXNSYXN0ZXIgPSB0aGlzLl9zb3VyY2UudHlwZSA9PT0gJ3Jhc3RlcicgfHwgdGhpcy5fc291cmNlLnR5cGUgPT09ICdyYXN0ZXItZGVtJztcblxuICAgICAgICBhc3luY0FsbCh0aWxlSURzLCAodGlsZUlELCBkb25lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gbmV3IFRpbGUodGlsZUlELCB0aGlzLl9zb3VyY2UudGlsZVNpemUgKiB0aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCksIHRoaXMudHJhbnNmb3JtLnRpbGVab29tLCB0aGlzLm1hcC5wYWludGVyLCBpc1Jhc3Rlcik7XG4gICAgICAgICAgICB0aGlzLl9sb2FkVGlsZSh0aWxlLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS50eXBlID09PSAncmFzdGVyLWRlbScgJiYgdGlsZS5kZW0pIHRoaXMuX2JhY2tmaWxsREVNKHRpbGUpO1xuICAgICAgICAgICAgICAgIGRvbmUoZXJyLCB0aWxlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgfVxufVxuXG5Tb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZyA9IDEwO1xuU291cmNlQ2FjaGUubWF4VW5kZXJ6b29taW5nID0gMztcblxuZnVuY3Rpb24gY29tcGFyZVRpbGVJZChhOiBPdmVyc2NhbGVkVGlsZUlELCBiOiBPdmVyc2NhbGVkVGlsZUlEKTogbnVtYmVyIHtcbiAgICAvLyBEaWZmZXJlbnQgY29waWVzIG9mIHRoZSB3b3JsZCBhcmUgc29ydGVkIGJhc2VkIG9uIHRoZWlyIGRpc3RhbmNlIHRvIHRoZSBjZW50ZXIuXG4gICAgLy8gV3JhcCB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byB1bnNpZ25lZCBkaXN0YW5jZXMgYnkgcmVzZXJ2aW5nIG9kZCBudW1iZXIgZm9yIGNvcGllc1xuICAgIC8vIHdpdGggbmVnYXRpdmUgd3JhcCBhbmQgZXZlbiBudW1iZXJzIGZvciBjb3BpZXMgd2l0aCBwb3NpdGl2ZSB3cmFwLlxuICAgIGNvbnN0IGFXcmFwID0gTWF0aC5hYnMoYS53cmFwICogMikgLSArKGEud3JhcCA8IDApO1xuICAgIGNvbnN0IGJXcmFwID0gTWF0aC5hYnMoYi53cmFwICogMikgLSArKGIud3JhcCA8IDApO1xuICAgIHJldHVybiBhLm92ZXJzY2FsZWRaIC0gYi5vdmVyc2NhbGVkWiB8fCBiV3JhcCAtIGFXcmFwIHx8IGIuY2Fub25pY2FsLnkgLSBhLmNhbm9uaWNhbC55IHx8IGIuY2Fub25pY2FsLnggLSBhLmNhbm9uaWNhbC54O1xufVxuXG5mdW5jdGlvbiBpc1Jhc3RlclR5cGUodHlwZSkge1xuICAgIHJldHVybiB0eXBlID09PSAncmFzdGVyJyB8fCB0eXBlID09PSAnaW1hZ2UnIHx8IHR5cGUgPT09ICd2aWRlbyc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNvdXJjZUNhY2hlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge21lcmNhdG9yWmZyb21BbHRpdHVkZX0gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IERFTURhdGEgZnJvbSAnLi4vZGF0YS9kZW1fZGF0YS5qcyc7XG5pbXBvcnQgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQuanMnO1xuaW1wb3J0IHt2ZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZVRyYW5zZm9ybX0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vaW5kZXguanMnO1xuXG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlLmpzJztcblxuLyoqXG4gKiBPcHRpb25zIGNvbW1vbiB0byB7QGxpbmsgTWFwI3F1ZXJ5VGVycmFpbkVsZXZhdGlvbn0gYW5kIHtAbGluayBNYXAjdW5wcm9qZWN0M2R9LCB1c2VkIHRvIGNvbnRyb2wgaG93IGVsZXZhdGlvblxuICogZGF0YSBpcyByZXR1cm5lZC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFbGV2YXRpb25RdWVyeU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZXhhZ2dlcmF0ZWQgV2hlbiBzZXQgdG8gYHRydWVgIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBlbGV2YXRpb24gd2l0aCB0aGUgdGVycmFpbnMgYGV4YWdnZXJhdGlvbmAgb24gdGhlIHN0eWxlIGFscmVhZHkgYXBwbGllZCxcbiAqIHdoZW5gZmFsc2VgIGl0IHJldHVybnMgdGhlIHJhdyB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBkYXRhIHdpdGhvdXQgc3R5bGluZyBhcHBsaWVkLlxuICovXG5leHBvcnQgdHlwZSBFbGV2YXRpb25RdWVyeU9wdGlvbnMgPSB7XG4gICAgZXhhZ2dlcmF0ZWQ6IGJvb2xlYW5cbn07XG5cbi8qKlxuICogUHJvdmlkZXMgYWNjZXNzIHRvIGVsZXZhdGlvbiBkYXRhIGZyb20gcmFzdGVyLWRlbSBzb3VyY2UgY2FjaGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbGV2YXRpb24ge1xuICAgIC8qKlxuICAgICAqIEhlbHBlciBhcm91bmQgYGdldEF0UG9pbnRgIHRoYXQgZ3VhcmFudGVlcyB0aGF0IGEgbnVtZXJpYyB2YWx1ZSBpcyByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0ge01lcmNhdG9yQ29vcmRpbmF0ZX0gcG9pbnQgTWVyY2F0b3IgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlZmF1bHRJZk5vdExvYWRlZCBWYWx1ZSB0aGF0IGlzIHJldHVybmVkIGlmIHRoZSBkZW0gdGlsZSBvZiB0aGUgcHJvdmlkZWQgcG9pbnQgaXMgbm90IGxvYWRlZC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBBbHRpdHVkZSBpbiBtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0QXRQb2ludE9yWmVybyhwb2ludDogTWVyY2F0b3JDb29yZGluYXRlLCBkZWZhdWx0SWZOb3RMb2FkZWQ6IG51bWJlciA9IDApOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBdFBvaW50KHBvaW50LCBkZWZhdWx0SWZOb3RMb2FkZWQpIHx8IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0aXR1ZGUgYWJvdmUgc2VhIGxldmVsIGluIG1ldGVycyBhdCBzcGVjaWZpZWQgcG9pbnQuXG4gICAgICogQHBhcmFtIHtNZXJjYXRvckNvb3JkaW5hdGV9IHBvaW50IE1lcmNhdG9yIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWZhdWx0SWZOb3RMb2FkZWQgVmFsdWUgdGhhdCBpcyByZXR1cm5lZCBpZiB0aGUgREVNIHRpbGUgb2YgdGhlIHByb3ZpZGVkIHBvaW50IGlzIG5vdCBsb2FkZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBleGFnZ2VyYXRlZCBgdHJ1ZWAgaWYgc3R5bGluZyBleGFnZ2VyYXRpb24gc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHJlc3VsdGluZyBlbGV2YXRpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gQWx0aXR1ZGUgaW4gbWV0ZXJzLlxuICAgICAqIElmIHRoZXJlIGlzIG5vIGxvYWRlZCB0aWxlIHRoYXQgY2FycmllcyBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3RlZFxuICAgICAqIHBvaW50IGVsZXZhdGlvbiwgcmV0dXJucyBgZGVmYXVsdElmTm90TG9hZGVkYC5cbiAgICAgKiBEb2Vzbid0IGludm9rZSBuZXR3b3JrIHJlcXVlc3QgdG8gZmV0Y2ggdGhlIGRhdGEuXG4gICAgICovXG4gICAgZ2V0QXRQb2ludChwb2ludDogTWVyY2F0b3JDb29yZGluYXRlLCBkZWZhdWx0SWZOb3RMb2FkZWQ6ID9udW1iZXIsIGV4YWdnZXJhdGVkOiBib29sZWFuID0gdHJ1ZSk6IG51bWJlciB8IG51bGwge1xuICAgICAgICAvLyBGb3JjZSBhIGNhc3QgdG8gbnVsbCBmb3IgYm90aCBudWxsIGFuZCB1bmRlZmluZWRcbiAgICAgICAgaWYgKGRlZmF1bHRJZk5vdExvYWRlZCA9PSBudWxsKSBkZWZhdWx0SWZOb3RMb2FkZWQgPSBudWxsO1xuXG4gICAgICAgIGNvbnN0IHNyYyA9IHRoaXMuX3NvdXJjZSgpO1xuICAgICAgICBpZiAoIXNyYykgcmV0dXJuIGRlZmF1bHRJZk5vdExvYWRlZDtcbiAgICAgICAgaWYgKHBvaW50LnkgPCAwLjAgfHwgcG9pbnQueSA+IDEuMCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRJZk5vdExvYWRlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYWNoZTogU291cmNlQ2FjaGUgPSBzcmM7XG4gICAgICAgIGNvbnN0IHogPSBjYWNoZS5nZXRTb3VyY2UoKS5tYXh6b29tO1xuICAgICAgICBjb25zdCB0aWxlcyA9IDEgPDwgejtcbiAgICAgICAgY29uc3Qgd3JhcCA9IE1hdGguZmxvb3IocG9pbnQueCk7XG4gICAgICAgIGNvbnN0IHB4ID0gcG9pbnQueCAtIHdyYXA7XG4gICAgICAgIGNvbnN0IHRpbGVJRCA9IG5ldyBPdmVyc2NhbGVkVGlsZUlEKHosIHdyYXAsIHosIE1hdGguZmxvb3IocHggKiB0aWxlcyksIE1hdGguZmxvb3IocG9pbnQueSAqIHRpbGVzKSk7XG4gICAgICAgIGNvbnN0IGRlbVRpbGUgPSB0aGlzLmZpbmRERU1UaWxlRm9yKHRpbGVJRCk7XG4gICAgICAgIGlmICghKGRlbVRpbGUgJiYgZGVtVGlsZS5kZW0pKSB7IHJldHVybiBkZWZhdWx0SWZOb3RMb2FkZWQ7IH1cbiAgICAgICAgY29uc3QgZGVtOiBERU1EYXRhID0gZGVtVGlsZS5kZW07XG4gICAgICAgIGNvbnN0IHRpbGVzQXRUaWxlWm9vbSA9IDEgPDwgZGVtVGlsZS50aWxlSUQuY2Fub25pY2FsLno7XG4gICAgICAgIGNvbnN0IHggPSAocHggKiB0aWxlc0F0VGlsZVpvb20gLSBkZW1UaWxlLnRpbGVJRC5jYW5vbmljYWwueCkgKiBkZW0uZGltO1xuICAgICAgICBjb25zdCB5ID0gKHBvaW50LnkgKiB0aWxlc0F0VGlsZVpvb20gLSBkZW1UaWxlLnRpbGVJRC5jYW5vbmljYWwueSkgKiBkZW0uZGltO1xuICAgICAgICBjb25zdCBpID0gTWF0aC5mbG9vcih4KTtcbiAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IoeSk7XG4gICAgICAgIGNvbnN0IGV4YWdnZXJhdGlvbiA9IGV4YWdnZXJhdGVkID8gdGhpcy5leGFnZ2VyYXRpb24oKSA6IDE7XG5cbiAgICAgICAgcmV0dXJuIGV4YWdnZXJhdGlvbiAqIGludGVycG9sYXRlKFxuICAgICAgICAgICAgaW50ZXJwb2xhdGUoZGVtLmdldChpLCBqKSwgZGVtLmdldChpLCBqICsgMSksIHkgLSBqKSxcbiAgICAgICAgICAgIGludGVycG9sYXRlKGRlbS5nZXQoaSArIDEsIGopLCBkZW0uZ2V0KGkgKyAxLCBqICsgMSksIHkgLSBqKSxcbiAgICAgICAgICAgIHggLSBpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIHggYW5kIHkgYXJlIG9mZnNldCB3aXRoaW4gdGlsZSwgaW4gMCAuLiBFWFRFTlQgY29vcmRpbmF0ZSBzcGFjZS5cbiAgICAgKi9cbiAgICBnZXRBdFRpbGVPZmZzZXQodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRpbGVzQXRUaWxlWm9vbSA9IDEgPDwgdGlsZUlELmNhbm9uaWNhbC56O1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBdFBvaW50T3JaZXJvKG5ldyBNZXJjYXRvckNvb3JkaW5hdGUoXG4gICAgICAgICAgICB0aWxlSUQud3JhcCArICh0aWxlSUQuY2Fub25pY2FsLnggKyB4IC8gRVhURU5UKSAvIHRpbGVzQXRUaWxlWm9vbSxcbiAgICAgICAgICAgICh0aWxlSUQuY2Fub25pY2FsLnkgKyB5IC8gRVhURU5UKSAvIHRpbGVzQXRUaWxlWm9vbSkpO1xuICAgIH1cblxuICAgIGdldEF0VGlsZU9mZnNldEZ1bmModGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB0aWxlVHJhbnNmb3JtOiBUaWxlVHJhbnNmb3JtKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKHAgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxldmF0aW9uID0gdGhpcy5nZXRBdFRpbGVPZmZzZXQodGlsZUlELCBwLngsIHAueSk7XG4gICAgICAgICAgICBjb25zdCB1cFZlY3RvciA9IHRpbGVUcmFuc2Zvcm0udXBWZWN0b3IodGlsZUlELmNhbm9uaWNhbCwgcC54LCBwLnkpO1xuICAgICAgICAgICAgY29uc3QgdXBWZWN0b3JTY2FsZSA9IHRpbGVUcmFuc2Zvcm0udXBWZWN0b3JTY2FsZSh0aWxlSUQuY2Fub25pY2FsKTtcbiAgICAgICAgICAgIHZlYzMuc2NhbGUodXBWZWN0b3IsIHVwVmVjdG9yLCBlbGV2YXRpb24gKiB1cFZlY3RvclNjYWxlKTtcbiAgICAgICAgICAgIHJldHVybiB1cFZlY3RvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBCYXRjaCBmZXRjaCBmb3IgbXVsdGlwbGUgdGlsZSBwb2ludHM6IHBvaW50cyBob2xkcyBpbnB1dCBhbmQgcmV0dXJuIHZhbHVlOlxuICAgICAqIHZlYzMncyBpdGVtcyBvbiBpbmRleCAwIGFuZCAxIGRlZmluZSB4IGFuZCB5IG9mZnNldCB3aXRoaW4gdGlsZSwgaW4gWzAgLi4gRVhURU5UXVxuICAgICAqIHJhbmdlLCByZXNwZWN0aXZlbHkuIHZlYzMgaXRlbSBhdCBpbmRleCAyIGlzIG91dHB1dCB2YWx1ZSwgaW4gbWV0ZXJzLlxuICAgICAqIElmIGEgREVNIHRpbGUgdGhhdCBjb3ZlcnMgdGlsZUlEIGlzIGxvYWRlZCwgdHJ1ZSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqIE5lYXJlc3QgZmlsdGVyIHNhbXBsaW5nIG9uIGRlbSBkYXRhIGlzIGRvbmUgKG5vIGludGVycG9sYXRpb24pLlxuICAgICAqL1xuICAgIGdldEZvclRpbGVQb2ludHModGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCBwb2ludHM6IEFycmF5PHZlYzM+LCBpbnRlcnBvbGF0ZWQ6ID9ib29sZWFuLCB1c2VEZW1UaWxlOiA/VGlsZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBoZWxwZXIgPSBERU1TYW1wbGVyLmNyZWF0ZSh0aGlzLCB0aWxlSUQsIHVzZURlbVRpbGUpO1xuICAgICAgICBpZiAoIWhlbHBlcikgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICBwb2ludHMuZm9yRWFjaChwID0+IHtcbiAgICAgICAgICAgIHBbMl0gPSB0aGlzLmV4YWdnZXJhdGlvbigpICogaGVscGVyLmdldEVsZXZhdGlvbkF0KHBbMF0sIHBbMV0sIGludGVycG9sYXRlZCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZWxldmF0aW9uIG1pbmltdW0gYW5kIG1heGltdW0gZm9yIHRpbGUgaWRlbnRpZmllZCBieSBgdGlsZUlEYC5cbiAgICAgKiBAcGFyYW0ge092ZXJzY2FsZWRUaWxlSUR9IHRpbGVJRCBUaGUgYHRpbGVJZGAgaXMgYSBzdWIgdGlsZSAob3IgY292ZXJzIHRoZSBzYW1lIHNwYWNlKSBvZiB0aGUgREVNIHRpbGUgd2UgcmVhZCB0aGUgaW5mb3JtYXRpb24gZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7P3ttaW46IG51bWJlciwgbWF4OiBudW1iZXJ9fSBUaGUgbWluIGFuZCBtYXggZWxldmF0aW9uLlxuICAgICAqL1xuICAgIGdldE1pbk1heEZvclRpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogP3ttaW46IG51bWJlciwgbWF4OiBudW1iZXJ9IHtcbiAgICAgICAgY29uc3QgZGVtVGlsZSA9IHRoaXMuZmluZERFTVRpbGVGb3IodGlsZUlEKTtcbiAgICAgICAgaWYgKCEoZGVtVGlsZSAmJiBkZW1UaWxlLmRlbSkpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgY29uc3QgZGVtOiBERU1EYXRhID0gZGVtVGlsZS5kZW07XG4gICAgICAgIGNvbnN0IHRyZWUgPSBkZW0udHJlZTtcbiAgICAgICAgY29uc3QgZGVtVGlsZUlEID0gZGVtVGlsZS50aWxlSUQ7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gMSA8PCB0aWxlSUQuY2Fub25pY2FsLnogLSBkZW1UaWxlSUQuY2Fub25pY2FsLno7XG4gICAgICAgIGxldCB4T2Zmc2V0ID0gdGlsZUlELmNhbm9uaWNhbC54IC8gc2NhbGUgLSBkZW1UaWxlSUQuY2Fub25pY2FsLng7XG4gICAgICAgIGxldCB5T2Zmc2V0ID0gdGlsZUlELmNhbm9uaWNhbC55IC8gc2NhbGUgLSBkZW1UaWxlSUQuY2Fub25pY2FsLnk7XG4gICAgICAgIGxldCBpbmRleCA9IDA7IC8vIFN0YXJ0IGZyb20gREVNIHRyZWUgcm9vdC5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWxlSUQuY2Fub25pY2FsLnogLSBkZW1UaWxlSUQuY2Fub25pY2FsLno7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRyZWUubGVhdmVzW2luZGV4XSkgYnJlYWs7XG4gICAgICAgICAgICB4T2Zmc2V0ICo9IDI7XG4gICAgICAgICAgICB5T2Zmc2V0ICo9IDI7XG4gICAgICAgICAgICBjb25zdCBjaGlsZE9mZnNldCA9IDIgKiBNYXRoLmZsb29yKHlPZmZzZXQpICsgTWF0aC5mbG9vcih4T2Zmc2V0KTtcbiAgICAgICAgICAgIGluZGV4ID0gdHJlZS5jaGlsZE9mZnNldHNbaW5kZXhdICsgY2hpbGRPZmZzZXQ7XG4gICAgICAgICAgICB4T2Zmc2V0ID0geE9mZnNldCAlIDE7XG4gICAgICAgICAgICB5T2Zmc2V0ID0geU9mZnNldCAlIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHttaW46IHRoaXMuZXhhZ2dlcmF0aW9uKCkgKiB0cmVlLm1pbmltdW1zW2luZGV4XSwgbWF4OiB0aGlzLmV4YWdnZXJhdGlvbigpICogdHJlZS5tYXhpbXVtc1tpbmRleF19O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBlbGV2YXRpb24gbWluaW11bSBiZWxvdyBNU0wgZm9yIHRoZSB2aXNpYmxlIHRpbGVzLiBUaGlzIGZ1bmN0aW9uIGFjY291bnRzXG4gICAgICogZm9yIHRlcnJhaW4gZXhhZ2dlcmF0aW9uIGFuZCBpcyBjb25zZXJ2YXRpdmUgYmFzZWQgb24gdGhlIG1heGltdW0gREVNIGVycm9yLFxuICAgICAqIGRvIG5vdCBleHBlY3QgYWNjdXJhdGUgdmFsdWVzIGZyb20gdGhpcyBmdW5jdGlvbi5cbiAgICAgKiBJZiBubyBuZWdhdGl2ZSBlbGV2YXRpb24gaXMgdmlzaWJsZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDAuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIG1pbiBlbGV2YXRpb24gYmVsb3cgc2VhIGxldmVsIG9mIGFsbCB2aXNpYmxlIHRpbGVzLlxuICAgICAqL1xuICAgIGdldE1pbkVsZXZhdGlvbkJlbG93TVNMKCk6IG51bWJlciB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUHVyZSB2aXJ0dWFsIG1ldGhvZCBjYWxsZWQuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgcmF5Y2FzdCBhZ2FpbnN0IHZpc2libGUgREVNIHRpbGVzIG9uIHRoZSBzY3JlZW4gYW5kIHJldHVybnMgdGhlIGRpc3RhbmNlIHRyYXZlbGxlZCBhbG9uZyB0aGUgcmF5LlxuICAgICAqIGB4YCAmIGB5YCBjb21wb25lbnRzIG9mIHRoZSBwb3NpdGlvbiBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gbm9ybWFsaXplZCBtZXJjYXRvciBjb29yZGluYXRlcyBbMCwgMV0gYW5kIHogaW4gbWV0ZXJzLlxuICAgICAqIEBwYXJhbSB7dmVjM30gcG9zaXRpb24gVGhlIHJheSBvcmlnaW4uXG4gICAgICogQHBhcmFtIHt2ZWMzfSBkaXIgVGhlIHJheSBkaXJlY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV4YWdnZXJhdGlvbiBUaGUgdGVycmFpbiBleGFnZ2VyYXRpb24uXG4gICAgKi9cbiAgICByYXljYXN0KHBvc2l0aW9uOiB2ZWMzLCBkaXI6IHZlYzMsIGV4YWdnZXJhdGlvbjogbnVtYmVyKTogP251bWJlciB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUHVyZSB2aXJ0dWFsIG1ldGhvZCBjYWxsZWQuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBwb2ludCBvbiBzY3JlZW4sIHJldHVybnMgM0QgTWVyY2F0b3JDb29yZGluYXRlIG9uIHRlcnJhaW4uXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYHJheWNhc3RgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb2ludH0gc2NyZWVuUG9pbnQgU2NyZWVuIHBvaW50IGluIHBpeGVscyBpbiB0b3AtbGVmdCBvcmlnaW4gY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICogQHJldHVybnMge3ZlYzN9IElmIHRoZXJlIGlzIGludGVyc2VjdGlvbiB3aXRoIHRlcnJhaW4sIHJldHVybnMgM0QgTWVyY2F0b3JDb29yZGluYXRlJ3Mgb2ZcbiAgICAgKiBpbnRlcnNlY3Rpb24sIGFzIHZlYzMoeCwgeSwgeiksIG90aGVyd2lzZSBudWxsLlxuICAgICAqLyAvKiBlc2xpbnQgbm8tdW51c2VkLXZhcnM6IFtcImVycm9yXCIsIHsgXCJhcmdzXCI6IFwibm9uZVwiIH1dICovXG4gICAgcG9pbnRDb29yZGluYXRlKHNjcmVlblBvaW50OiBQb2ludCk6ID92ZWMzIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQdXJlIHZpcnR1YWwgbWV0aG9kIGNhbGxlZC4nKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEltcGxlbWVudGF0aW9uIHByb3ZpZGVzIFNvdXJjZUNhY2hlIG9mIHJhc3Rlci1kZW0gc291cmNlIHR5cGUgY2FjaGUsIGluXG4gICAgICogb3JkZXIgdG8gYWNjZXNzIGFscmVhZHkgbG9hZGVkIGNhY2hlZCB0aWxlcy5cbiAgICAgKi9cbiAgICBfc291cmNlKCk6ID9Tb3VyY2VDYWNoZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUHVyZSB2aXJ0dWFsIG1ldGhvZCBjYWxsZWQuJyk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBBIG11bHRpcGxpZXIgZGVmaW5lZCBieSBzdHlsZSBhcyB0ZXJyYWluIGV4YWdnZXJhdGlvbi4gRWxldmF0aW9uIHByb3ZpZGVkXG4gICAgICogYnkgZ2V0WFhYWCBtZXRob2RzIGlzIG11bHRpcGxpZWQgYnkgdGhpcy5cbiAgICAgKi9cbiAgICBleGFnZ2VyYXRpb24oKTogbnVtYmVyIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQdXJlIHZpcnR1YWwgbWV0aG9kIGNhbGxlZC4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb29rdXAgREVNIHRpbGUgdGhhdCBjb3JyZXNwb25kcyB0byAoY292ZXJzKSB0aWxlSUQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmaW5kREVNVGlsZUZvcihfOiBPdmVyc2NhbGVkVGlsZUlEKTogP1RpbGUge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1B1cmUgdmlydHVhbCBtZXRob2QgY2FsbGVkLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBsaXN0IG9mIERFTSB0aWxlcyB1c2VkIHRvIHJlbmRlciBjdXJyZW50IGZyYW1lLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0IHZpc2libGVEZW1UaWxlcygpOiBBcnJheTxUaWxlPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignR2V0dGVyIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MuJyk7XG4gICAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBjbGFzcyBjb21wdXRlcyBhbmQgY2FjaGVzIGRhdGEgcmVxdWlyZWQgdG8gbG9va3VwIGVsZXZhdGlvbiBvZmZzZXRzIGF0IHRoZSB0aWxlIGxldmVsLlxuICovXG5leHBvcnQgY2xhc3MgREVNU2FtcGxlciB7XG4gICAgX2RlbVRpbGU6IFRpbGU7XG4gICAgX2RlbTogREVNRGF0YTtcbiAgICBfc2NhbGU6IG51bWJlcjtcbiAgICBfb2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgY29uc3RydWN0b3IoZGVtVGlsZTogVGlsZSwgc2NhbGU6IG51bWJlciwgb2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgICAgIHRoaXMuX2RlbVRpbGUgPSBkZW1UaWxlO1xuICAgICAgICAvLyBkZW1UaWxlLmRlbSB3aWxsIGFsd2F5cyBleGlzdCBiZWNhdXNlIHRoZSBmYWN0b3J5IG1ldGhvZCBgY3JlYXRlYCBkb2VzIHRoZSBjaGVja1xuICAgICAgICAvLyBNYWtlIGZsb3cgaGFwcHkgd2l0aCBhIGNhc3QgdGhyb3VnaCBhbnlcbiAgICAgICAgdGhpcy5fZGVtID0gKCgodGhpcy5fZGVtVGlsZS5kZW0pOiBhbnkpOiBERU1EYXRhKTtcbiAgICAgICAgdGhpcy5fc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgdGhpcy5fb2Zmc2V0ID0gb2Zmc2V0O1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGUoZWxldmF0aW9uOiBFbGV2YXRpb24sIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgdXNlRGVtVGlsZTogP1RpbGUpOiA/REVNU2FtcGxlciB7XG4gICAgICAgIGNvbnN0IGRlbVRpbGUgPSB1c2VEZW1UaWxlIHx8IGVsZXZhdGlvbi5maW5kREVNVGlsZUZvcih0aWxlSUQpO1xuICAgICAgICBpZiAoIShkZW1UaWxlICYmIGRlbVRpbGUuZGVtKSkgeyByZXR1cm47IH1cbiAgICAgICAgY29uc3QgZGVtOiBERU1EYXRhID0gZGVtVGlsZS5kZW07XG4gICAgICAgIGNvbnN0IGRlbVRpbGVJRCA9IGRlbVRpbGUudGlsZUlEO1xuICAgICAgICBjb25zdCBzY2FsZSA9IDEgPDwgdGlsZUlELmNhbm9uaWNhbC56IC0gZGVtVGlsZUlELmNhbm9uaWNhbC56O1xuICAgICAgICBjb25zdCB4T2Zmc2V0ID0gKHRpbGVJRC5jYW5vbmljYWwueCAvIHNjYWxlIC0gZGVtVGlsZUlELmNhbm9uaWNhbC54KSAqIGRlbS5kaW07XG4gICAgICAgIGNvbnN0IHlPZmZzZXQgPSAodGlsZUlELmNhbm9uaWNhbC55IC8gc2NhbGUgLSBkZW1UaWxlSUQuY2Fub25pY2FsLnkpICogZGVtLmRpbTtcbiAgICAgICAgY29uc3QgayA9IGRlbVRpbGUudGlsZVNpemUgLyBFWFRFTlQgLyBzY2FsZTtcblxuICAgICAgICByZXR1cm4gbmV3IERFTVNhbXBsZXIoZGVtVGlsZSwgaywgW3hPZmZzZXQsIHlPZmZzZXRdKTtcbiAgICB9XG5cbiAgICB0aWxlQ29vcmRUb1BpeGVsKHg6IG51bWJlciwgeTogbnVtYmVyKTogUG9pbnQge1xuICAgICAgICBjb25zdCBweCA9IHggKiB0aGlzLl9zY2FsZSArIHRoaXMuX29mZnNldFswXTtcbiAgICAgICAgY29uc3QgcHkgPSB5ICogdGhpcy5fc2NhbGUgKyB0aGlzLl9vZmZzZXRbMV07XG4gICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKHB4KTtcbiAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IocHkpO1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KGksIGopO1xuICAgIH1cblxuICAgIGdldEVsZXZhdGlvbkF0KHg6IG51bWJlciwgeTogbnVtYmVyLCBpbnRlcnBvbGF0ZWQ6ID9ib29sZWFuLCBjbGFtcFRvRWRnZTogP2Jvb2xlYW4pOiBudW1iZXIge1xuICAgICAgICBjb25zdCBweCA9IHggKiB0aGlzLl9zY2FsZSArIHRoaXMuX29mZnNldFswXTtcbiAgICAgICAgY29uc3QgcHkgPSB5ICogdGhpcy5fc2NhbGUgKyB0aGlzLl9vZmZzZXRbMV07XG4gICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKHB4KTtcbiAgICAgICAgY29uc3QgaiA9IE1hdGguZmxvb3IocHkpO1xuICAgICAgICBjb25zdCBkZW0gPSB0aGlzLl9kZW07XG5cbiAgICAgICAgY2xhbXBUb0VkZ2UgPSAhIWNsYW1wVG9FZGdlO1xuXG4gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZWQgPyBpbnRlcnBvbGF0ZShcbiAgICAgICAgICAgIGludGVycG9sYXRlKGRlbS5nZXQoaSwgaiwgY2xhbXBUb0VkZ2UpLCBkZW0uZ2V0KGksIGogKyAxLCBjbGFtcFRvRWRnZSksIHB5IC0gaiksXG4gICAgICAgICAgICBpbnRlcnBvbGF0ZShkZW0uZ2V0KGkgKyAxLCBqLCBjbGFtcFRvRWRnZSksIGRlbS5nZXQoaSArIDEsIGogKyAxLCBjbGFtcFRvRWRnZSksIHB5IC0gaiksXG4gICAgICAgICAgICBweCAtIGkpIDpcbiAgICAgICAgICAgIGRlbS5nZXQoaSwgaiwgY2xhbXBUb0VkZ2UpO1xuICAgIH1cblxuICAgIGdldEVsZXZhdGlvbkF0UGl4ZWwoeDogbnVtYmVyLCB5OiBudW1iZXIsIGNsYW1wVG9FZGdlOiA/Ym9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZW0uZ2V0KHgsIHksICEhY2xhbXBUb0VkZ2UpO1xuICAgIH1cblxuICAgIGdldE1ldGVyVG9ERU0obGF0OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKDEgPDwgdGhpcy5fZGVtVGlsZS50aWxlSUQuY2Fub25pY2FsLnopICogbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIGxhdCkgKiB0aGlzLl9kZW0uc3RyaWRlO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuL2xvYWRfZ2VvbWV0cnkuanMnO1xuaW1wb3J0IHRvRXZhbHVhdGlvbkZlYXR1cmUgZnJvbSAnLi9ldmFsdWF0aW9uX2ZlYXR1cmUuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuL2V4dGVudC5qcyc7XG5pbXBvcnQgZmVhdHVyZUZpbHRlciBmcm9tICcuLi9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyL2luZGV4LmpzJztcbmltcG9ydCBHcmlkIGZyb20gJ2dyaWQtaW5kZXgnO1xuaW1wb3J0IERpY3Rpb25hcnlDb2RlciBmcm9tICcuLi91dGlsL2RpY3Rpb25hcnlfY29kZXIuanMnO1xuaW1wb3J0IHZ0IGZyb20gJ0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuaW1wb3J0IFByb3RvYnVmIGZyb20gJ3BiZic7XG5pbXBvcnQgR2VvSlNPTkZlYXR1cmUgZnJvbSAnLi4vdXRpbC92ZWN0b3J0aWxlX3RvX2dlb2pzb24uanMnO1xuaW1wb3J0IHthcnJheXNJbnRlcnNlY3QsIG1hcE9iamVjdCwgZXh0ZW5kfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgU291cmNlRmVhdHVyZVN0YXRlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2Vfc3RhdGUuanMnO1xuaW1wb3J0IHtwb2x5Z29uSW50ZXJzZWN0c0JveH0gZnJvbSAnLi4vdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMuanMnO1xuaW1wb3J0IHtQb3NzaWJseUV2YWx1YXRlZH0gZnJvbSAnLi4vc3R5bGUvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge0ZlYXR1cmVJbmRleEFycmF5fSBmcm9tICcuL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB7REVNU2FtcGxlcn0gZnJvbSAnLi4vdGVycmFpbi9lbGV2YXRpb24uanMnO1xuXG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlRmlsdGVyfSBmcm9tICcuLi9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtGaWx0ZXJTcGVjaWZpY2F0aW9uLCBQcm9tb3RlSWRTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlc3BhY2VRdWVyeUdlb21ldHJ5fSBmcm9tICcuLi9zdHlsZS9xdWVyeV9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZUluZGV4IGFzIEZlYXR1cmVJbmRleFN0cnVjdH0gZnJvbSAnLi9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZVRyYW5zZm9ybX0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuXG50eXBlIFF1ZXJ5UGFyYW1ldGVycyA9IHtcbiAgICBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgIHRpbGVSZXN1bHQ6IFRpbGVzcGFjZVF1ZXJ5R2VvbWV0cnksXG4gICAgdGlsZVRyYW5zZm9ybTogVGlsZVRyYW5zZm9ybSxcbiAgICBwYXJhbXM6IHtcbiAgICAgICAgZmlsdGVyOiBGaWx0ZXJTcGVjaWZpY2F0aW9uLFxuICAgICAgICBsYXllcnM6IEFycmF5PHN0cmluZz4sXG4gICAgICAgIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPlxuICAgIH1cbn1cblxudHlwZSBGZWF0dXJlSW5kaWNlcyA9IHtcbiAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICBmZWF0dXJlSW5kZXg6IG51bWJlcixcbiAgICBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldDogbnVtYmVyXG59IHwgRmVhdHVyZUluZGV4U3RydWN0O1xuXG5jbGFzcyBGZWF0dXJlSW5kZXgge1xuICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRDtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHo6IG51bWJlcjtcbiAgICBncmlkOiBHcmlkO1xuICAgIGZlYXR1cmVJbmRleEFycmF5OiBGZWF0dXJlSW5kZXhBcnJheTtcbiAgICBwcm9tb3RlSWQ6ID9Qcm9tb3RlSWRTcGVjaWZpY2F0aW9uO1xuXG4gICAgcmF3VGlsZURhdGE6IEFycmF5QnVmZmVyO1xuICAgIGJ1Y2tldExheWVySURzOiBBcnJheTxBcnJheTxzdHJpbmc+PjtcblxuICAgIHZ0TGF5ZXJzOiB7W186IHN0cmluZ106IFZlY3RvclRpbGVMYXllcn07XG4gICAgdnRGZWF0dXJlczoge1tfOiBzdHJpbmddOiBWZWN0b3JUaWxlRmVhdHVyZVtdfTtcbiAgICBzb3VyY2VMYXllckNvZGVyOiBEaWN0aW9uYXJ5Q29kZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHByb21vdGVJZD86ID9Qcm9tb3RlSWRTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMudGlsZUlEID0gdGlsZUlEO1xuICAgICAgICB0aGlzLnggPSB0aWxlSUQuY2Fub25pY2FsLng7XG4gICAgICAgIHRoaXMueSA9IHRpbGVJRC5jYW5vbmljYWwueTtcbiAgICAgICAgdGhpcy56ID0gdGlsZUlELmNhbm9uaWNhbC56O1xuICAgICAgICB0aGlzLmdyaWQgPSBuZXcgR3JpZChFWFRFTlQsIDE2LCAwKTtcbiAgICAgICAgdGhpcy5mZWF0dXJlSW5kZXhBcnJheSA9IG5ldyBGZWF0dXJlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb21vdGVJZCA9IHByb21vdGVJZDtcbiAgICB9XG5cbiAgICBpbnNlcnQoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCBmZWF0dXJlSW5kZXg6IG51bWJlciwgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLCBidWNrZXRJbmRleDogbnVtYmVyLCBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldDogbnVtYmVyID0gMCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmZlYXR1cmVJbmRleEFycmF5Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5mZWF0dXJlSW5kZXhBcnJheS5lbXBsYWNlQmFjayhmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldCk7XG5cbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcblxuICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IGdlb21ldHJ5Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBjb25zdCByaW5nID0gZ2VvbWV0cnlbcl07XG5cbiAgICAgICAgICAgIGNvbnN0IGJib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gcmluZ1tpXTtcbiAgICAgICAgICAgICAgICBiYm94WzBdID0gTWF0aC5taW4oYmJveFswXSwgcC54KTtcbiAgICAgICAgICAgICAgICBiYm94WzFdID0gTWF0aC5taW4oYmJveFsxXSwgcC55KTtcbiAgICAgICAgICAgICAgICBiYm94WzJdID0gTWF0aC5tYXgoYmJveFsyXSwgcC54KTtcbiAgICAgICAgICAgICAgICBiYm94WzNdID0gTWF0aC5tYXgoYmJveFszXSwgcC55KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGJib3hbMF0gPCBFWFRFTlQgJiZcbiAgICAgICAgICAgICAgICBiYm94WzFdIDwgRVhURU5UICYmXG4gICAgICAgICAgICAgICAgYmJveFsyXSA+PSAwICYmXG4gICAgICAgICAgICAgICAgYmJveFszXSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZ3JpZC5pbnNlcnQoa2V5LCBiYm94WzBdLCBiYm94WzFdLCBiYm94WzJdLCBiYm94WzNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRWVExheWVycygpOiB7W186IHN0cmluZ106IFZlY3RvclRpbGVMYXllcn0ge1xuICAgICAgICBpZiAoIXRoaXMudnRMYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMudnRMYXllcnMgPSBuZXcgdnQuVmVjdG9yVGlsZShuZXcgUHJvdG9idWYodGhpcy5yYXdUaWxlRGF0YSkpLmxheWVycztcbiAgICAgICAgICAgIHRoaXMuc291cmNlTGF5ZXJDb2RlciA9IG5ldyBEaWN0aW9uYXJ5Q29kZXIodGhpcy52dExheWVycyA/IE9iamVjdC5rZXlzKHRoaXMudnRMYXllcnMpLnNvcnQoKSA6IFsnX2dlb2pzb25UaWxlTGF5ZXInXSk7XG4gICAgICAgICAgICB0aGlzLnZ0RmVhdHVyZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXIgaW4gdGhpcy52dExheWVycykge1xuICAgICAgICAgICAgICAgIHRoaXMudnRGZWF0dXJlc1tsYXllcl0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52dExheWVycztcbiAgICB9XG5cbiAgICAvLyBGaW5kcyBub24tc3ltYm9sIGZlYXR1cmVzIGluIHRoaXMgdGlsZSBhdCBhIHBhcnRpY3VsYXIgcG9zaXRpb24uXG4gICAgcXVlcnkoYXJnczogUXVlcnlQYXJhbWV0ZXJzLCBzdHlsZUxheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfSwgc2VyaWFsaXplZExheWVyczoge1tfOiBzdHJpbmddOiBPYmplY3R9LCBzb3VyY2VGZWF0dXJlU3RhdGU6IFNvdXJjZUZlYXR1cmVTdGF0ZSk6IHtbXzogc3RyaW5nXTogQXJyYXk8eyBmZWF0dXJlSW5kZXg6IG51bWJlciwgZmVhdHVyZTogR2VvSlNPTkZlYXR1cmUgfT59IHtcbiAgICAgICAgdGhpcy5sb2FkVlRMYXllcnMoKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gYXJncy5wYXJhbXMgfHwge30sXG4gICAgICAgICAgICBmaWx0ZXIgPSBmZWF0dXJlRmlsdGVyKHBhcmFtcy5maWx0ZXIpO1xuICAgICAgICBjb25zdCB0aWxlc3BhY2VHZW9tZXRyeSA9IGFyZ3MudGlsZVJlc3VsdDtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gYXJncy50cmFuc2Zvcm07XG5cbiAgICAgICAgY29uc3QgYm91bmRzID0gdGlsZXNwYWNlR2VvbWV0cnkuYnVmZmVyZWRUaWxlc3BhY2VCb3VuZHM7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UHJlZGljYXRlID0gKGJ4MSwgYnkxLCBieDIsIGJ5MikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHBvbHlnb25JbnRlcnNlY3RzQm94KHRpbGVzcGFjZUdlb21ldHJ5LmJ1ZmZlcmVkVGlsZXNwYWNlR2VvbWV0cnksIGJ4MSwgYnkxLCBieDIsIGJ5Mik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nID0gdGhpcy5ncmlkLnF1ZXJ5KGJvdW5kcy5taW4ueCwgYm91bmRzLm1pbi55LCBib3VuZHMubWF4LngsIGJvdW5kcy5tYXgueSwgcXVlcnlQcmVkaWNhdGUpO1xuICAgICAgICBtYXRjaGluZy5zb3J0KHRvcERvd25GZWF0dXJlQ29tcGFyYXRvcik7XG5cbiAgICAgICAgbGV0IGVsZXZhdGlvbkhlbHBlciA9IG51bGw7XG4gICAgICAgIGlmICh0cmFuc2Zvcm0uZWxldmF0aW9uICYmIG1hdGNoaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGVsZXZhdGlvbkhlbHBlciA9IERFTVNhbXBsZXIuY3JlYXRlKHRyYW5zZm9ybS5lbGV2YXRpb24sIHRoaXMudGlsZUlEKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBsZXQgcHJldmlvdXNJbmRleDtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYXRjaGluZy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBtYXRjaGluZ1trXTtcblxuICAgICAgICAgICAgLy8gZG9uJ3QgY2hlY2sgdGhlIHNhbWUgZmVhdHVyZSBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBwcmV2aW91c0luZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIHByZXZpb3VzSW5kZXggPSBpbmRleDtcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmZlYXR1cmVJbmRleEFycmF5LmdldChpbmRleCk7XG4gICAgICAgICAgICBsZXQgZmVhdHVyZUdlb21ldHJ5ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMubG9hZE1hdGNoaW5nRmVhdHVyZShcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgbWF0Y2gsXG4gICAgICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgICAgIHBhcmFtcy5sYXllcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zLmF2YWlsYWJsZUltYWdlcyxcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVycyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHNvdXJjZUZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIHN0eWxlTGF5ZXI6IFN0eWxlTGF5ZXIsIGZlYXR1cmVTdGF0ZTogT2JqZWN0LCBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldDogbnVtYmVyID0gMCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZlYXR1cmVHZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUsIHRoaXMudGlsZUlELmNhbm9uaWNhbCwgYXJncy50aWxlVHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZUxheWVyLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUodGlsZXNwYWNlR2VvbWV0cnksIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgZmVhdHVyZUdlb21ldHJ5LCB0aGlzLnosIGFyZ3MudHJhbnNmb3JtLCBhcmdzLnBpeGVsUG9zTWF0cml4LCBlbGV2YXRpb25IZWxwZXIsIGxheW91dFZlcnRleEFycmF5T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBsb2FkTWF0Y2hpbmdGZWF0dXJlKFxuICAgICAgICByZXN1bHQ6IHtbXzogc3RyaW5nXTogQXJyYXk8eyBmZWF0dXJlSW5kZXg6IG51bWJlciwgZmVhdHVyZTogR2VvSlNPTkZlYXR1cmUgfT59LFxuICAgICAgICBmZWF0dXJlSW5kZXhEYXRhOiBGZWF0dXJlSW5kaWNlcyxcbiAgICAgICAgZmlsdGVyOiBGZWF0dXJlRmlsdGVyLFxuICAgICAgICBmaWx0ZXJMYXllcklEczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICBzdHlsZUxheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfSxcbiAgICAgICAgc2VyaWFsaXplZExheWVyczoge1tfOiBzdHJpbmddOiBPYmplY3R9LFxuICAgICAgICBzb3VyY2VGZWF0dXJlU3RhdGU/OiBTb3VyY2VGZWF0dXJlU3RhdGUsXG4gICAgICAgIGludGVyc2VjdGlvblRlc3Q/OiAoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIHN0eWxlTGF5ZXI6IFN0eWxlTGF5ZXIsIGZlYXR1cmVTdGF0ZTogT2JqZWN0LCBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldDogbnVtYmVyKSA9PiBib29sZWFuIHwgbnVtYmVyKSB7XG5cbiAgICAgICAgY29uc3Qge2ZlYXR1cmVJbmRleCwgYnVja2V0SW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGxheW91dFZlcnRleEFycmF5T2Zmc2V0fSA9IGZlYXR1cmVJbmRleERhdGE7XG4gICAgICAgIGNvbnN0IGxheWVySURzID0gdGhpcy5idWNrZXRMYXllcklEc1tidWNrZXRJbmRleF07XG4gICAgICAgIGlmIChmaWx0ZXJMYXllcklEcyAmJiAhYXJyYXlzSW50ZXJzZWN0KGZpbHRlckxheWVySURzLCBsYXllcklEcykpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJOYW1lID0gdGhpcy5zb3VyY2VMYXllckNvZGVyLmRlY29kZShzb3VyY2VMYXllckluZGV4KTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB0aGlzLnZ0TGF5ZXJzW3NvdXJjZUxheWVyTmFtZV07XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBzb3VyY2VMYXllci5mZWF0dXJlKGZlYXR1cmVJbmRleCk7XG5cbiAgICAgICAgaWYgKGZpbHRlci5uZWVkR2VvbWV0cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRpb25GZWF0dXJlID0gdG9FdmFsdWF0aW9uRmVhdHVyZShmZWF0dXJlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghZmlsdGVyLmZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy50aWxlSUQub3ZlcnNjYWxlZFopLCBldmFsdWF0aW9uRmVhdHVyZSwgdGhpcy50aWxlSUQuY2Fub25pY2FsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghZmlsdGVyLmZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy50aWxlSUQub3ZlcnNjYWxlZFopLCBmZWF0dXJlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdldElkKGZlYXR1cmUsIHNvdXJjZUxheWVyTmFtZSk7XG5cbiAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBsYXllcklEcy5sZW5ndGg7IGwrKykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJRCA9IGxheWVySURzW2xdO1xuXG4gICAgICAgICAgICBpZiAoZmlsdGVyTGF5ZXJJRHMgJiYgZmlsdGVyTGF5ZXJJRHMuaW5kZXhPZihsYXllcklEKSA8IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3R5bGVMYXllciA9IHN0eWxlTGF5ZXJzW2xheWVySURdO1xuXG4gICAgICAgICAgICBpZiAoIXN0eWxlTGF5ZXIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgZmVhdHVyZVN0YXRlID0ge307XG4gICAgICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2VGZWF0dXJlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBgZmVhdHVyZS1zdGF0ZWAgZXhwcmVzc2lvbiBldmFsdWF0aW9uIHJlcXVpcmVzIGZlYXR1cmUgc3RhdGUgdG8gYmUgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgZmVhdHVyZVN0YXRlID0gc291cmNlRmVhdHVyZVN0YXRlLmdldFN0YXRlKHN0eWxlTGF5ZXIuc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJywgaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkTGF5ZXIgPSBleHRlbmQoe30sIHNlcmlhbGl6ZWRMYXllcnNbbGF5ZXJJRF0pO1xuXG4gICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXIucGFpbnQgPSBldmFsdWF0ZVByb3BlcnRpZXMoc2VyaWFsaXplZExheWVyLnBhaW50LCBzdHlsZUxheWVyLnBhaW50LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXIubGF5b3V0ID0gZXZhbHVhdGVQcm9wZXJ0aWVzKHNlcmlhbGl6ZWRMYXllci5sYXlvdXQsIHN0eWxlTGF5ZXIubGF5b3V0LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdGlvblogPSAhaW50ZXJzZWN0aW9uVGVzdCB8fCBpbnRlcnNlY3Rpb25UZXN0KGZlYXR1cmUsIHN0eWxlTGF5ZXIsIGZlYXR1cmVTdGF0ZSwgbGF5b3V0VmVydGV4QXJyYXlPZmZzZXQpO1xuICAgICAgICAgICAgaWYgKCFpbnRlcnNlY3Rpb25aKSB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBhcHBsaWVkIGZvciBub24tc3ltYm9sIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGdlb2pzb25GZWF0dXJlID0gbmV3IEdlb0pTT05GZWF0dXJlKGZlYXR1cmUsIHRoaXMueiwgdGhpcy54LCB0aGlzLnksIGlkKTtcbiAgICAgICAgICAgIChnZW9qc29uRmVhdHVyZTogYW55KS5sYXllciA9IHNlcmlhbGl6ZWRMYXllcjtcbiAgICAgICAgICAgIGxldCBsYXllclJlc3VsdCA9IHJlc3VsdFtsYXllcklEXTtcbiAgICAgICAgICAgIGlmIChsYXllclJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJSZXN1bHQgPSByZXN1bHRbbGF5ZXJJRF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxheWVyUmVzdWx0LnB1c2goe2ZlYXR1cmVJbmRleCwgZmVhdHVyZTogZ2VvanNvbkZlYXR1cmUsIGludGVyc2VjdGlvblp9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdpdmVuIGEgc2V0IG9mIHN5bWJvbCBpbmRleGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbG9va2VkIHVwLFxuICAgIC8vIHJldHVybiBhIG1hdGNoaW5nIHNldCBvZiBHZW9KU09ORmVhdHVyZXNcbiAgICBsb29rdXBTeW1ib2xGZWF0dXJlcyhzeW1ib2xGZWF0dXJlSW5kZXhlczogQXJyYXk8bnVtYmVyPixcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzOiB7W3N0cmluZ106IFN0eWxlTGF5ZXJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclNwZWM6IEZpbHRlclNwZWNpZmljYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyTGF5ZXJJRHM6IEFycmF5PHN0cmluZz4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlTGF5ZXJzOiB7W186IHN0cmluZ106IFN0eWxlTGF5ZXJ9KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICB0aGlzLmxvYWRWVExheWVycygpO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGZlYXR1cmVGaWx0ZXIoZmlsdGVyU3BlYyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzeW1ib2xGZWF0dXJlSW5kZXggb2Ygc3ltYm9sRmVhdHVyZUluZGV4ZXMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZE1hdGNoaW5nRmVhdHVyZShcbiAgICAgICAgICAgICAgICByZXN1bHQsIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogc3ltYm9sRmVhdHVyZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldDogMFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgICAgIGZpbHRlckxheWVySURzLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZUltYWdlcyxcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVycyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBsb2FkRmVhdHVyZShmZWF0dXJlSW5kZXhEYXRhOiBGZWF0dXJlSW5kaWNlcyk6IFZlY3RvclRpbGVGZWF0dXJlIHtcbiAgICAgICAgY29uc3Qge2ZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleH0gPSBmZWF0dXJlSW5kZXhEYXRhO1xuXG4gICAgICAgIHRoaXMubG9hZFZUTGF5ZXJzKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyTmFtZSA9IHRoaXMuc291cmNlTGF5ZXJDb2Rlci5kZWNvZGUoc291cmNlTGF5ZXJJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZUNhY2hlID0gdGhpcy52dEZlYXR1cmVzW3NvdXJjZUxheWVyTmFtZV07XG4gICAgICAgIGlmIChmZWF0dXJlQ2FjaGVbZmVhdHVyZUluZGV4XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVDYWNoZVtmZWF0dXJlSW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyID0gdGhpcy52dExheWVyc1tzb3VyY2VMYXllck5hbWVdO1xuICAgICAgICBjb25zdCBmZWF0dXJlID0gc291cmNlTGF5ZXIuZmVhdHVyZShmZWF0dXJlSW5kZXgpO1xuICAgICAgICBmZWF0dXJlQ2FjaGVbZmVhdHVyZUluZGV4XSA9IGZlYXR1cmU7XG5cbiAgICAgICAgcmV0dXJuIGZlYXR1cmU7XG4gICAgfVxuXG4gICAgaGFzTGF5ZXIoaWQ6IHN0cmluZykge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySURzIG9mIHRoaXMuYnVja2V0TGF5ZXJJRHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBvZiBsYXllcklEcykge1xuICAgICAgICAgICAgICAgIGlmIChpZCA9PT0gbGF5ZXJJRCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0SWQoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIHNvdXJjZUxheWVySWQ6IHN0cmluZyk6IHN0cmluZyB8IG51bWJlciB8IHZvaWQge1xuICAgICAgICBsZXQgaWQgPSBmZWF0dXJlLmlkO1xuICAgICAgICBpZiAodGhpcy5wcm9tb3RlSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZW9mIHRoaXMucHJvbW90ZUlkID09PSAnc3RyaW5nJyA/IHRoaXMucHJvbW90ZUlkIDogdGhpcy5wcm9tb3RlSWRbc291cmNlTGF5ZXJJZF07XG4gICAgICAgICAgICBpZCA9IGZlYXR1cmUucHJvcGVydGllc1twcm9wTmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkID09PSAnYm9vbGVhbicpIGlkID0gIE51bWJlcihpZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoXG4gICAgJ0ZlYXR1cmVJbmRleCcsXG4gICAgRmVhdHVyZUluZGV4LFxuICAgIHtvbWl0OiBbJ3Jhd1RpbGVEYXRhJywgJ3NvdXJjZUxheWVyQ29kZXInXX1cbik7XG5cbmV4cG9ydCBkZWZhdWx0IEZlYXR1cmVJbmRleDtcblxuZnVuY3Rpb24gZXZhbHVhdGVQcm9wZXJ0aWVzKHNlcmlhbGl6ZWRQcm9wZXJ0aWVzLCBzdHlsZUxheWVyUHJvcGVydGllcywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBhdmFpbGFibGVJbWFnZXMpIHtcbiAgICByZXR1cm4gbWFwT2JqZWN0KHNlcmlhbGl6ZWRQcm9wZXJ0aWVzLCAocHJvcGVydHksIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wID0gc3R5bGVMYXllclByb3BlcnRpZXMgaW5zdGFuY2VvZiBQb3NzaWJseUV2YWx1YXRlZCA/IHN0eWxlTGF5ZXJQcm9wZXJ0aWVzLmdldChrZXkpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIHByb3AgJiYgcHJvcC5ldmFsdWF0ZSA/IHByb3AuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBhdmFpbGFibGVJbWFnZXMpIDogcHJvcDtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gdG9wRG93bkZlYXR1cmVDb21wYXJhdG9yKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGE7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93LmpzJztcblxuLyoqXG4gKiBUaGlzIGlzIGEgcHJpdmF0ZSBuYW1lc3BhY2UgZm9yIHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgd2lsbCBnZXQgYXV0b21hdGljYWxseSBzdHJpcHBlZFxuICogb3V0IGluIHByb2R1Y3Rpb24gYnVpbGRzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBEZWJ1ZyA9IHtcbiAgICBleHRlbmQoZGVzdDogT2JqZWN0LCAuLi5zb3VyY2VzOiBBcnJheTw/T2JqZWN0Pik6IE9iamVjdCB7XG4gICAgICAgIHJldHVybiBleHRlbmQoZGVzdCwgLi4uc291cmNlcyk7XG4gICAgfSxcblxuICAgIHJ1bihmbjogKCkgPT4gYW55KSB7XG4gICAgICAgIGZuKCk7XG4gICAgfSxcblxuICAgIGxvZ1RvRWxlbWVudChtZXNzYWdlOiBzdHJpbmcsIG92ZXJ3cml0ZTogYm9vbGVhbiA9IGZhbHNlLCBpZDogc3RyaW5nID0gXCJsb2dcIikge1xuICAgICAgICBjb25zdCBlbCA9IHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgaWYgKG92ZXJ3cml0ZSkgZWwuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICBlbC5pbm5lckhUTUwgKz0gYDxicj4ke21lc3NhZ2V9YDtcbiAgICAgICAgfVxuXG4gICAgfVxufTtcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3MnLCB0eXBlOiAnSW50MTYnLCBjb21wb25lbnRzOiAyfVxuXSk7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtQb3NBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheX0gZnJvbSBcIi4vYXJyYXlfdHlwZXMuanNcIjtcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gXCIuL3NlZ21lbnQuanNcIjtcbmltcG9ydCBwb3NBdHRyaWJ1dGVzIGZyb20gJy4vcG9zX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IENvbG9yIGZyb20gXCIuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanNcIjtcblxuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gXCIuLi9nbC92ZXJ0ZXhfYnVmZmVyLmpzXCI7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tIFwiLi4vZ2wvaW5kZXhfYnVmZmVyLmpzXCI7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcIi4uL2dsL2NvbnRleHQuanNcIjtcblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0byBkcmF3IGRlYnVnIGdlb21ldHJ5IGluIHRpbGUtc3BhY2VcbiAqXG4gKiBAY2xhc3MgVGlsZVNwYWNlRGVidWdCdWZmZXJcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBUaWxlU3BhY2VEZWJ1Z0J1ZmZlciB7XG4gICAgdmVydGljZXM6IFBvc0FycmF5O1xuICAgIGluZGljZXM6IExpbmVTdHJpcEluZGV4QXJyYXk7XG4gICAgdGlsZVNpemU6IG51bWJlcjtcbiAgICBuZWVkc1VwbG9hZDogYm9vbGVhbjtcbiAgICBjb2xvcjogQ29sb3I7XG5cbiAgICB2ZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXI7XG4gICAgaW5kZXhCdWZmZXI6ID9JbmRleEJ1ZmZlcjtcbiAgICBzZWdtZW50czogP1NlZ21lbnRWZWN0b3I7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aWxlU2l6ZTogbnVtYmVyLCBjb2xvcjogQ29sb3IgPSBDb2xvci5yZWQpIHtcbiAgICAgICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICB0aGlzLmluZGljZXMgPSBuZXcgTGluZVN0cmlwSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gdGlsZVNpemU7XG4gICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7XG4gICAgfVxuXG4gICAgYWRkUG9pbnRzKHBvaW50czogUG9pbnRbXSkge1xuICAgICAgICB0aGlzLmNsZWFyUG9pbnRzKCk7XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcG9pbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFBvaW50KHBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFBvaW50KHBvaW50c1swXSk7XG4gICAgfVxuXG4gICAgYWRkUG9pbnQocDogUG9pbnQpIHtcbiAgICAgICAgLy8gQWRkIGEgYm93dGllIHNoYXBlXG4gICAgICAgIGNvbnN0IGNyb3NzaGFpclNpemUgPSA4MDtcbiAgICAgICAgY29uc3QgY3VyckxpbmVMaW5lTGVuZ3RoID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMudmVydGljZXMuZW1wbGFjZUJhY2socC54LCBwLnkpO1xuICAgICAgICB0aGlzLnZlcnRpY2VzLmVtcGxhY2VCYWNrKHAueCArIGNyb3NzaGFpclNpemUgLyAyLCBwLnkpO1xuICAgICAgICB0aGlzLnZlcnRpY2VzLmVtcGxhY2VCYWNrKHAueCwgcC55IC0gY3Jvc3NoYWlyU2l6ZSAvIDIpO1xuICAgICAgICB0aGlzLnZlcnRpY2VzLmVtcGxhY2VCYWNrKHAueCwgcC55ICsgY3Jvc3NoYWlyU2l6ZSAvIDIpO1xuICAgICAgICB0aGlzLnZlcnRpY2VzLmVtcGxhY2VCYWNrKHAueCAtIGNyb3NzaGFpclNpemUgLyAyLCBwLnkpO1xuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soY3VyckxpbmVMaW5lTGVuZ3RoKTtcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKGN1cnJMaW5lTGluZUxlbmd0aCArIDEpO1xuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soY3VyckxpbmVMaW5lTGVuZ3RoICsgMik7XG4gICAgICAgIHRoaXMuaW5kaWNlcy5lbXBsYWNlQmFjayhjdXJyTGluZUxpbmVMZW5ndGggKyAzKTtcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKGN1cnJMaW5lTGluZUxlbmd0aCArIDQpO1xuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soY3VyckxpbmVMaW5lTGVuZ3RoKTtcblxuICAgICAgICB0aGlzLm5lZWRzVXBsb2FkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjbGVhclBvaW50cygpIHtcbiAgICAgICAgdGhpcy52ZXJ0aWNlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmluZGljZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9IHRydWU7XG4gICAgfVxuXG4gICAgbGF6eVVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLm5lZWRzVXBsb2FkICYmIHRoaXMuaGFzVmVydGljZXMoKSkge1xuICAgICAgICAgICAgdGhpcy51bmxvYWQoKTtcblxuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnZlcnRpY2VzLCBwb3NBdHRyaWJ1dGVzLm1lbWJlcnMsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRpY2VzLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgdGhpcy52ZXJ0aWNlcy5sZW5ndGgsIHRoaXMuaW5kaWNlcy5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzVmVydGljZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2VzLmxlbmd0aCA+IDE7XG4gICAgfVxuXG4gICAgdW5sb2FkKCkge1xuICAgICAgICBpZiAodGhpcy52ZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRleEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5pbmRleEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWdtZW50cykge1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zZWdtZW50cztcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vIEBmbG93XG4vLyBsb2dpYyBmb3IgZ2VuZXJhdGluZyBub24tTWVyY2F0b3IgYWRhcHRpdmUgcmFzdGVyIHRpbGUgcmVwcm9qZWN0aW9uIG1lc2hlcyB3aXRoIE1BUlRJTklcblxuaW1wb3J0IHRpbGVUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQge2xuZ0Zyb21NZXJjYXRvclgsIGxhdEZyb21NZXJjYXRvcll9IGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCB7VGlsZUJvdW5kc0FycmF5LCBUcmlhbmdsZUluZGV4QXJyYXl9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3Rpb259IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL2luZGV4LmpzJztcblxuY29uc3QgbWVzaFNpemUgPSAzMjtcbmNvbnN0IGdyaWRTaXplID0gbWVzaFNpemUgKyAxO1xuXG5jb25zdCBudW1UcmlhbmdsZXMgPSBtZXNoU2l6ZSAqIG1lc2hTaXplICogMiAtIDI7XG5jb25zdCBudW1QYXJlbnRUcmlhbmdsZXMgPSBudW1UcmlhbmdsZXMgLSBtZXNoU2l6ZSAqIG1lc2hTaXplO1xuXG5jb25zdCBjb29yZHMgPSBuZXcgVWludDE2QXJyYXkobnVtVHJpYW5nbGVzICogNCk7XG5cbi8vIHByZWNhbGN1bGF0ZSBSVElOIHRyaWFuZ2xlIGNvb3JkaW5hdGVzXG5mb3IgKGxldCBpID0gMDsgaSA8IG51bVRyaWFuZ2xlczsgaSsrKSB7XG4gICAgbGV0IGlkID0gaSArIDI7XG4gICAgbGV0IGF4ID0gMCwgYXkgPSAwLCBieCA9IDAsIGJ5ID0gMCwgY3ggPSAwLCBjeSA9IDA7XG5cbiAgICBpZiAoaWQgJiAxKSB7XG4gICAgICAgIGJ4ID0gYnkgPSBjeCA9IG1lc2hTaXplOyAvLyBib3R0b20tbGVmdCB0cmlhbmdsZVxuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXggPSBheSA9IGN5ID0gbWVzaFNpemU7IC8vIHRvcC1yaWdodCB0cmlhbmdsZVxuICAgIH1cblxuICAgIHdoaWxlICgoaWQgPj49IDEpID4gMSkge1xuICAgICAgICBjb25zdCBteCA9IChheCArIGJ4KSA+PiAxO1xuICAgICAgICBjb25zdCBteSA9IChheSArIGJ5KSA+PiAxO1xuXG4gICAgICAgIGlmIChpZCAmIDEpIHsgLy8gbGVmdCBoYWxmXG4gICAgICAgICAgICBieCA9IGF4OyBieSA9IGF5O1xuICAgICAgICAgICAgYXggPSBjeDsgYXkgPSBjeTtcblxuICAgICAgICB9IGVsc2UgeyAvLyByaWdodCBoYWxmXG4gICAgICAgICAgICBheCA9IGJ4OyBheSA9IGJ5O1xuICAgICAgICAgICAgYnggPSBjeDsgYnkgPSBjeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN4ID0gbXg7IGN5ID0gbXk7XG4gICAgfVxuXG4gICAgY29uc3QgayA9IGkgKiA0O1xuICAgIGNvb3Jkc1trICsgMF0gPSBheDtcbiAgICBjb29yZHNbayArIDFdID0gYXk7XG4gICAgY29vcmRzW2sgKyAyXSA9IGJ4O1xuICAgIGNvb3Jkc1trICsgM10gPSBieTtcbn1cblxuLy8gdGVtcG9yYXJ5IGFycmF5cyB3ZSdsbCByZXVzZSBmb3IgTUFSVElOSSBtZXNoIGNvZGVcbmNvbnN0IHJlcHJvamVjdGVkQ29vcmRzID0gbmV3IFVpbnQxNkFycmF5KGdyaWRTaXplICogZ3JpZFNpemUgKiAyKTtcbmNvbnN0IHVzZWQgPSBuZXcgVWludDhBcnJheShncmlkU2l6ZSAqIGdyaWRTaXplKTtcbmNvbnN0IGluZGV4TWFwID0gbmV3IFVpbnQxNkFycmF5KGdyaWRTaXplICogZ3JpZFNpemUpO1xuXG50eXBlIFRpbGVNZXNoID0ge1xuICAgIHZlcnRpY2VzOiBUaWxlQm91bmRzQXJyYXksXG4gICAgaW5kaWNlczogVHJpYW5nbGVJbmRleEFycmF5XG59O1xuXG4vLyBUaGVyZSBjYW4gYmUgdmlzaWJsZSBzZWFtcyBiZXR3ZWVuIG5laWdoYm91cmluZyB0aWxlcyBiZWNhdXNlIG9mIHByZWNpc2lvbiBpc3N1ZXNcbi8vIGFuZCByZXNhbXBsaW5nIGRpZmZlcmVuY2VzLiBBZGRpbmcgYSBiaXQgb2YgcGFkZGluZyBhcm91bmQgdGhlIGVkZ2VzIG9mIHRpbGVzIGhpZGVzXG4vLyBtb3N0IG9mIHRoZXNlIGlzc3Vlcy5cbmNvbnN0IGNvbW1vblJhc3RlclRpbGVTaXplID0gMjU2O1xuY29uc3QgcGFkZGluZ1NpemUgPSBtZXNoU2l6ZSAvIGNvbW1vblJhc3RlclRpbGVTaXplIC8gNDtcbmZ1bmN0aW9uIHNlYW1QYWRkaW5nKG4pIHtcbiAgICBpZiAobiA9PT0gMCkgcmV0dXJuIC1wYWRkaW5nU2l6ZTtcbiAgICBlbHNlIGlmIChuID09PSBncmlkU2l6ZSAtIDEpIHJldHVybiBwYWRkaW5nU2l6ZTtcbiAgICBlbHNlIHJldHVybiAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRUaWxlTWVzaChjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgcHJvamVjdGlvbjogUHJvamVjdGlvbik6IFRpbGVNZXNoIHtcbiAgICBjb25zdCBjcyA9IHRpbGVUcmFuc2Zvcm0oY2Fub25pY2FsLCBwcm9qZWN0aW9uKTtcbiAgICBjb25zdCB6MiA9IE1hdGgucG93KDIsIGNhbm9uaWNhbC56KTtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgZ3JpZFNpemU7IHkrKykge1xuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGdyaWRTaXplOyB4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxuZyA9IGxuZ0Zyb21NZXJjYXRvclgoKGNhbm9uaWNhbC54ICsgKHggKyBzZWFtUGFkZGluZyh4KSkgLyBtZXNoU2l6ZSkgLyB6Mik7XG4gICAgICAgICAgICBjb25zdCBsYXQgPSBsYXRGcm9tTWVyY2F0b3JZKChjYW5vbmljYWwueSArICh5ICsgc2VhbVBhZGRpbmcoeSkpIC8gbWVzaFNpemUpIC8gejIpO1xuICAgICAgICAgICAgY29uc3QgcCA9IHByb2plY3Rpb24ucHJvamVjdChsbmcsIGxhdCk7XG4gICAgICAgICAgICBjb25zdCBrID0geSAqIGdyaWRTaXplICsgeDtcbiAgICAgICAgICAgIHJlcHJvamVjdGVkQ29vcmRzWzIgKiBrICsgMF0gPSBNYXRoLnJvdW5kKChwLnggKiBjcy5zY2FsZSAtIGNzLngpICogRVhURU5UKTtcbiAgICAgICAgICAgIHJlcHJvamVjdGVkQ29vcmRzWzIgKiBrICsgMV0gPSBNYXRoLnJvdW5kKChwLnkgKiBjcy5zY2FsZSAtIGNzLnkpICogRVhURU5UKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVzZWQuZmlsbCgwKTtcbiAgICBpbmRleE1hcC5maWxsKDApO1xuXG4gICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBwb3NzaWJsZSB0cmlhbmdsZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHNtYWxsZXN0IGxldmVsXG4gICAgZm9yIChsZXQgaSA9IG51bVRyaWFuZ2xlcyAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGsgPSBpICogNDtcbiAgICAgICAgY29uc3QgYXggPSBjb29yZHNbayArIDBdO1xuICAgICAgICBjb25zdCBheSA9IGNvb3Jkc1trICsgMV07XG4gICAgICAgIGNvbnN0IGJ4ID0gY29vcmRzW2sgKyAyXTtcbiAgICAgICAgY29uc3QgYnkgPSBjb29yZHNbayArIDNdO1xuICAgICAgICBjb25zdCBteCA9IChheCArIGJ4KSA+PiAxO1xuICAgICAgICBjb25zdCBteSA9IChheSArIGJ5KSA+PiAxO1xuICAgICAgICBjb25zdCBjeCA9IG14ICsgbXkgLSBheTtcbiAgICAgICAgY29uc3QgY3kgPSBteSArIGF4IC0gbXg7XG5cbiAgICAgICAgY29uc3QgYUluZGV4ID0gYXkgKiBncmlkU2l6ZSArIGF4O1xuICAgICAgICBjb25zdCBiSW5kZXggPSBieSAqIGdyaWRTaXplICsgYng7XG4gICAgICAgIGNvbnN0IG1JbmRleCA9IG15ICogZ3JpZFNpemUgKyBteDtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgZXJyb3IgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbG9uZyBlZGdlIG9mIHRoZSB0cmlhbmdsZVxuICAgICAgICBjb25zdCByYXggPSByZXByb2plY3RlZENvb3Jkc1syICogYUluZGV4ICsgMF07XG4gICAgICAgIGNvbnN0IHJheSA9IHJlcHJvamVjdGVkQ29vcmRzWzIgKiBhSW5kZXggKyAxXTtcbiAgICAgICAgY29uc3QgcmJ4ID0gcmVwcm9qZWN0ZWRDb29yZHNbMiAqIGJJbmRleCArIDBdO1xuICAgICAgICBjb25zdCByYnkgPSByZXByb2plY3RlZENvb3Jkc1syICogYkluZGV4ICsgMV07XG4gICAgICAgIGNvbnN0IHJteCA9IHJlcHJvamVjdGVkQ29vcmRzWzIgKiBtSW5kZXggKyAwXTtcbiAgICAgICAgY29uc3Qgcm15ID0gcmVwcm9qZWN0ZWRDb29yZHNbMiAqIG1JbmRleCArIDFdO1xuXG4gICAgICAgIC8vIHJhc3RlciB0aWxlcyBhcmUgdHlwaWNhbGx5IDUxMnB4LCBhbmQgd2UgdXNlIDFweCBhcyBhbiBlcnJvciB0aHJlc2hvbGQ7IDgxOTIgLyA1MTIgPSAxNlxuICAgICAgICBjb25zdCBpc1VzZWQgPSBNYXRoLmh5cG90KChyYXggKyByYngpIC8gMiAtIHJteCwgKHJheSArIHJieSkgLyAyIC0gcm15KSA+PSAxNjtcblxuICAgICAgICB1c2VkW21JbmRleF0gPSB1c2VkW21JbmRleF0gfHwgKGlzVXNlZCA/IDEgOiAwKTtcblxuICAgICAgICBpZiAoaSA8IG51bVBhcmVudFRyaWFuZ2xlcykgeyAvLyBiaWdnZXIgdHJpYW5nbGVzOyBhY2N1bXVsYXRlIGVycm9yIHdpdGggY2hpbGRyZW5cbiAgICAgICAgICAgIGNvbnN0IGxlZnRDaGlsZEluZGV4ID0gKChheSArIGN5KSA+PiAxKSAqIGdyaWRTaXplICsgKChheCArIGN4KSA+PiAxKTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0Q2hpbGRJbmRleCA9ICgoYnkgKyBjeSkgPj4gMSkgKiBncmlkU2l6ZSArICgoYnggKyBjeCkgPj4gMSk7XG4gICAgICAgICAgICB1c2VkW21JbmRleF0gPSB1c2VkW21JbmRleF0gfHwgdXNlZFtsZWZ0Q2hpbGRJbmRleF0gfHwgdXNlZFtyaWdodENoaWxkSW5kZXhdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdmVydGljZXMgPSBuZXcgVGlsZUJvdW5kc0FycmF5KCk7XG4gICAgY29uc3QgaW5kaWNlcyA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcblxuICAgIGxldCBudW1WZXJ0aWNlcyA9IDA7XG5cbiAgICBmdW5jdGlvbiBhZGRWZXJ0ZXgoeCwgeSkge1xuICAgICAgICBjb25zdCBrID0geSAqIGdyaWRTaXplICsgeDtcblxuICAgICAgICBpZiAoaW5kZXhNYXBba10gPT09IDApIHtcbiAgICAgICAgICAgIHZlcnRpY2VzLmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgICAgIHJlcHJvamVjdGVkQ29vcmRzWzIgKiBrICsgMF0sXG4gICAgICAgICAgICAgICAgcmVwcm9qZWN0ZWRDb29yZHNbMiAqIGsgKyAxXSxcbiAgICAgICAgICAgICAgICB4ICogRVhURU5UIC8gbWVzaFNpemUsXG4gICAgICAgICAgICAgICAgeSAqIEVYVEVOVCAvIG1lc2hTaXplKTtcblxuICAgICAgICAgICAgLy8gc2F2ZSBuZXcgdmVydGV4IGluZGV4IHNvIHRoYXQgd2UgY2FuIHJldXNlIGl0XG4gICAgICAgICAgICBpbmRleE1hcFtrXSA9ICsrbnVtVmVydGljZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5kZXhNYXBba10gLSAxO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRyaWFuZ2xlcyhheCwgYXksIGJ4LCBieSwgY3gsIGN5KSB7XG4gICAgICAgIGNvbnN0IG14ID0gKGF4ICsgYngpID4+IDE7XG4gICAgICAgIGNvbnN0IG15ID0gKGF5ICsgYnkpID4+IDE7XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKGF4IC0gY3gpICsgTWF0aC5hYnMoYXkgLSBjeSkgPiAxICYmIHVzZWRbbXkgKiBncmlkU2l6ZSArIG14XSkge1xuICAgICAgICAgICAgLy8gdHJpYW5nbGUgZG9lc24ndCBhcHByb3hpbWF0ZSB0aGUgc3VyZmFjZSB3ZWxsIGVub3VnaDsgZHJpbGwgZG93biBmdXJ0aGVyXG4gICAgICAgICAgICBhZGRUcmlhbmdsZXMoY3gsIGN5LCBheCwgYXksIG14LCBteSk7XG4gICAgICAgICAgICBhZGRUcmlhbmdsZXMoYngsIGJ5LCBjeCwgY3ksIG14LCBteSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGFpID0gYWRkVmVydGV4KGF4LCBheSk7XG4gICAgICAgICAgICBjb25zdCBiaSA9IGFkZFZlcnRleChieCwgYnkpO1xuICAgICAgICAgICAgY29uc3QgY2kgPSBhZGRWZXJ0ZXgoY3gsIGN5KTtcbiAgICAgICAgICAgIGluZGljZXMuZW1wbGFjZUJhY2soYWksIGJpLCBjaSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRUcmlhbmdsZXMoMCwgMCwgbWVzaFNpemUsIG1lc2hTaXplLCBtZXNoU2l6ZSwgMCk7XG4gICAgYWRkVHJpYW5nbGVzKG1lc2hTaXplLCBtZXNoU2l6ZSwgMCwgMCwgMCwgbWVzaFNpemUpO1xuXG4gICAgcmV0dXJuIHt2ZXJ0aWNlcywgaW5kaWNlc307XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtjcmVhdGVMYXlvdXR9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMn0sXG4gICAge25hbWU6ICdhX3RleHR1cmVfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMn1cbl0pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt1bmlxdWVJZCwgcGFyc2VDYWNoZUNvbnRyb2x9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge2Rlc2VyaWFsaXplIGFzIGRlc2VyaWFsaXplQnVja2V0fSBmcm9tICcuLi9kYXRhL2J1Y2tldC5qcyc7XG5pbXBvcnQgRmVhdHVyZUluZGV4IGZyb20gJy4uL2RhdGEvZmVhdHVyZV9pbmRleC5qcyc7XG5pbXBvcnQgR2VvSlNPTkZlYXR1cmUgZnJvbSAnLi4vdXRpbC92ZWN0b3J0aWxlX3RvX2dlb2pzb24uanMnO1xuaW1wb3J0IGZlYXR1cmVGaWx0ZXIgZnJvbSAnLi4vc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlci9pbmRleC5qcyc7XG5pbXBvcnQgU3ltYm9sQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMnO1xuaW1wb3J0IHtDb2xsaXNpb25Cb3hBcnJheSwgVGlsZUJvdW5kc0FycmF5LCBQb3NBcnJheSwgVHJpYW5nbGVJbmRleEFycmF5LCBMaW5lU3RyaXBJbmRleEFycmF5fSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL3JlbmRlci90ZXh0dXJlLmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQge0RlYnVnfSBmcm9tICcuLi91dGlsL2RlYnVnLmpzJztcbmltcG9ydCB0b0V2YWx1YXRpb25GZWF0dXJlIGZyb20gJy4uL2RhdGEvZXZhbHVhdGlvbl9mZWF0dXJlLmpzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IFNvdXJjZUZlYXR1cmVTdGF0ZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX3N0YXRlLmpzJztcbmltcG9ydCB7bGF6eUxvYWRSVExUZXh0UGx1Z2lufSBmcm9tICcuL3J0bF90ZXh0X3BsdWdpbi5qcyc7XG5pbXBvcnQge1RpbGVTcGFjZURlYnVnQnVmZmVyfSBmcm9tICcuLi9kYXRhL2RlYnVnX3Zpei5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcbmltcG9ydCBsb2FkR2VvbWV0cnkgZnJvbSAnLi4vZGF0YS9sb2FkX2dlb21ldHJ5LmpzJztcbmltcG9ydCBlYXJjdXQgZnJvbSAnZWFyY3V0JztcbmltcG9ydCBnZXRUaWxlTWVzaCBmcm9tICcuL3RpbGVfbWVzaC5qcyc7XG5pbXBvcnQgdGlsZVRyYW5zZm9ybSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi90aWxlX3RyYW5zZm9ybS5qcyc7XG5cbmltcG9ydCBib3VuZHNBdHRyaWJ1dGVzIGZyb20gJy4uL2RhdGEvYm91bmRzX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQuanMnO1xuXG5jb25zdCBDTE9DS19TS0VXX1JFVFJZX1RJTUVPVVQgPSAzMDAwMDtcblxuaW1wb3J0IHR5cGUge0J1Y2tldH0gZnJvbSAnLi4vZGF0YS9idWNrZXQuanMnO1xuaW1wb3J0IEZpbGxCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvZmlsbF9idWNrZXQuanMnO1xuaW1wb3J0IExpbmVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvbGluZV9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7V29ya2VyVGlsZVJlc3VsdH0gZnJvbSAnLi93b3JrZXJfc291cmNlLmpzJztcbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgREVNRGF0YSBmcm9tICcuLi9kYXRhL2RlbV9kYXRhLmpzJztcbmltcG9ydCB0eXBlIHtBbHBoYUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlLmpzJztcbmltcG9ydCB0eXBlIEltYWdlQXRsYXMgZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzLmpzJztcbmltcG9ydCB0eXBlIExpbmVBdGxhcyBmcm9tICcuLi9yZW5kZXIvbGluZV9hdGxhcy5qcyc7XG5pbXBvcnQgdHlwZSBJbWFnZU1hbmFnZXIgZnJvbSAnLi4vcmVuZGVyL2ltYWdlX21hbmFnZXIuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUgRnJhbWVidWZmZXIgZnJvbSAnLi4vZ2wvZnJhbWVidWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUge0xheWVyRmVhdHVyZVN0YXRlc30gZnJvbSAnLi9zb3VyY2Vfc3RhdGUuanMnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUuanMnO1xuaW1wb3J0IHR5cGUge0ZpbHRlclNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVzcGFjZVF1ZXJ5R2VvbWV0cnl9IGZyb20gJy4uL3N0eWxlL3F1ZXJ5X2dlb21ldHJ5LmpzJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uL2dsL2luZGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7UHJvamVjdGlvbn0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge1RpbGVUcmFuc2Zvcm19IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcmVuZGVyL3BhaW50ZXIuanMnO1xuXG5leHBvcnQgdHlwZSBUaWxlU3RhdGUgPVxuICAgIHwgJ2xvYWRpbmcnICAgLy8gVGlsZSBkYXRhIGlzIGluIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcuXG4gICAgfCAnbG9hZGVkJyAgICAvLyBUaWxlIGRhdGEgaGFzIGJlZW4gbG9hZGVkLiBUaWxlIGNhbiBiZSByZW5kZXJlZC5cbiAgICB8ICdyZWxvYWRpbmcnIC8vIFRpbGUgZGF0YSBoYXMgYmVlbiBsb2FkZWQgYW5kIGlzIGJlaW5nIHVwZGF0ZWQuIFRpbGUgY2FuIGJlIHJlbmRlcmVkLlxuICAgIHwgJ3VubG9hZGVkJyAgLy8gVGlsZSBkYXRhIGhhcyBiZWVuIGRlbGV0ZWQuXG4gICAgfCAnZXJyb3JlZCcgICAvLyBUaWxlIGRhdGEgd2FzIG5vdCBsb2FkZWQgYmVjYXVzZSBvZiBhbiBlcnJvci5cbiAgICB8ICdleHBpcmVkJzsgIC8qIFRpbGUgZGF0YSB3YXMgcHJldmlvdXNseSBsb2FkZWQsIGJ1dCBoYXMgZXhwaXJlZCBwZXIgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBIVFRQIGhlYWRlcnMgYW5kIGlzIGluIHRoZSBwcm9jZXNzIG9mIHJlZnJlc2hpbmcuICovXG5cbi8vIGEgdGlsZSBib3VuZHMgb3V0bGluZSB1c2VkIGZvciBnZXR0aW5nIHJlcHJvamVjdGVkIHRpbGUgZ2VvbWV0cnkgaW4gbm9uLW1lcmNhdG9yIHByb2plY3Rpb25zXG5jb25zdCBCT1VORFNfRkVBVFVSRSA9ICgoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogMixcbiAgICAgICAgZXh0ZW50OiBFWFRFTlQsXG4gICAgICAgIGxvYWRHZW9tZXRyeSgpIHtcbiAgICAgICAgICAgIHJldHVybiBbW1xuICAgICAgICAgICAgICAgIG5ldyBQb2ludCgwLCAwKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoRVhURU5UICsgMSwgMCksXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KEVYVEVOVCArIDEsIEVYVEVOVCArIDEpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludCgwLCBFWFRFTlQgKyAxKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoMCwgMClcbiAgICAgICAgICAgIF1dO1xuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogQSB0aWxlIG9iamVjdCBpcyB0aGUgY29tYmluYXRpb24gb2YgYSBDb29yZGluYXRlLCB3aGljaCBkZWZpbmVzXG4gKiBpdHMgcGxhY2UsIGFzIHdlbGwgYXMgYSB1bmlxdWUgSUQgYW5kIGRhdGEgdHJhY2tpbmcgZm9yIGl0cyBjb250ZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVGlsZSB7XG4gICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEO1xuICAgIHVpZDogbnVtYmVyO1xuICAgIHVzZXM6IG51bWJlcjtcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuICAgIHRpbGVab29tOiBudW1iZXI7XG4gICAgYnVja2V0czoge1tfOiBzdHJpbmddOiBCdWNrZXR9O1xuICAgIGxhdGVzdEZlYXR1cmVJbmRleDogP0ZlYXR1cmVJbmRleDtcbiAgICBsYXRlc3RSYXdUaWxlRGF0YTogP0FycmF5QnVmZmVyO1xuICAgIGltYWdlQXRsYXM6ID9JbWFnZUF0bGFzO1xuICAgIGltYWdlQXRsYXNUZXh0dXJlOiBUZXh0dXJlO1xuICAgIGxpbmVBdGxhczogP0xpbmVBdGxhcztcbiAgICBsaW5lQXRsYXNUZXh0dXJlOiBUZXh0dXJlO1xuICAgIGdseXBoQXRsYXNJbWFnZTogP0FscGhhSW1hZ2U7XG4gICAgZ2x5cGhBdGxhc1RleHR1cmU6IFRleHR1cmU7XG4gICAgZXhwaXJhdGlvblRpbWU6IGFueTtcbiAgICBleHBpcmVkUmVxdWVzdENvdW50OiBudW1iZXI7XG4gICAgc3RhdGU6IFRpbGVTdGF0ZTtcbiAgICB0aW1lQWRkZWQ6IGFueTtcbiAgICBmYWRlRW5kVGltZTogYW55O1xuICAgIGNvbGxpc2lvbkJveEFycmF5OiA/Q29sbGlzaW9uQm94QXJyYXk7XG4gICAgcmVkb1doZW5Eb25lOiBib29sZWFuO1xuICAgIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbjtcbiAgICBwbGFjZW1lbnRTb3VyY2U6IGFueTtcbiAgICBhY3RvcjogP0FjdG9yO1xuICAgIHZ0TGF5ZXJzOiB7W186IHN0cmluZ106IFZlY3RvclRpbGVMYXllcn07XG4gICAgaXNTeW1ib2xUaWxlOiA/Ym9vbGVhbjtcbiAgICBpc1Jhc3RlcjogP2Jvb2xlYW47XG4gICAgX3RpbGVUcmFuc2Zvcm06IFRpbGVUcmFuc2Zvcm07XG5cbiAgICBuZWlnaGJvcmluZ1RpbGVzOiA/T2JqZWN0O1xuICAgIGRlbTogP0RFTURhdGE7XG4gICAgYWJvcnRlZDogP2Jvb2xlYW47XG4gICAgbmVlZHNIaWxsc2hhZGVQcmVwYXJlOiA/Ym9vbGVhbjtcbiAgICBuZWVkc0RFTVRleHR1cmVVcGxvYWQ6ID9ib29sZWFuO1xuICAgIHJlcXVlc3Q6ID9DYW5jZWxhYmxlO1xuICAgIHRleHR1cmU6IGFueTtcbiAgICBmYm86ID9GcmFtZWJ1ZmZlcjtcbiAgICBkZW1UZXh0dXJlOiA/VGV4dHVyZTtcbiAgICBnbG9iZUdyaWRCdWZmZXI6ID9WZXJ0ZXhCdWZmZXI7XG4gICAgZ2xvYmVQb2xlQnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuICAgIHJlZnJlc2hlZFVwb25FeHBpcmF0aW9uOiBib29sZWFuO1xuICAgIHJlbG9hZENhbGxiYWNrOiBhbnk7XG4gICAgcmVzb3VyY2VUaW1pbmc6ID9BcnJheTxQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nPjtcbiAgICBxdWVyeVBhZGRpbmc6IG51bWJlcjtcblxuICAgIHN5bWJvbEZhZGVIb2xkVW50aWw6ID9udW1iZXI7XG4gICAgaGFzU3ltYm9sQnVja2V0czogYm9vbGVhbjtcbiAgICBoYXNSVExUZXh0OiBib29sZWFuO1xuICAgIGRlcGVuZGVuY2llczogT2JqZWN0O1xuICAgIHByb2plY3Rpb246IFByb2plY3Rpb247XG5cbiAgICBxdWVyeUdlb21ldHJ5RGVidWdWaXo6IFRpbGVTcGFjZURlYnVnQnVmZmVyO1xuICAgIHF1ZXJ5Qm91bmRzRGVidWdWaXo6IFRpbGVTcGFjZURlYnVnQnVmZmVyO1xuXG4gICAgX3RpbGVEZWJ1Z0J1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBfdGlsZUJvdW5kc0J1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBfdGlsZURlYnVnSW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuICAgIF90aWxlQm91bmRzSW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuICAgIF90aWxlRGVidWdTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICBfdGlsZUJvdW5kc1NlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtPdmVyc2NhbGVkVGlsZUlEfSB0aWxlSURcbiAgICAgKiBAcGFyYW0gc2l6ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCBzaXplOiBudW1iZXIsIHRpbGVab29tOiBudW1iZXIsIHBhaW50ZXI6IGFueSwgaXNSYXN0ZXI/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudGlsZUlEID0gdGlsZUlEO1xuICAgICAgICB0aGlzLnVpZCA9IHVuaXF1ZUlkKCk7XG4gICAgICAgIHRoaXMudXNlcyA9IDA7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLnRpbGVab29tID0gdGlsZVpvb207XG4gICAgICAgIHRoaXMuYnVja2V0cyA9IHt9O1xuICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5xdWVyeVBhZGRpbmcgPSAwO1xuICAgICAgICB0aGlzLmhhc1N5bWJvbEJ1Y2tldHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNSVExUZXh0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0ge307XG4gICAgICAgIHRoaXMuaXNSYXN0ZXIgPSBpc1Jhc3RlcjtcblxuICAgICAgICAvLyBDb3VudHMgdGhlIG51bWJlciBvZiB0aW1lcyBhIHJlc3BvbnNlIHdhcyBhbHJlYWR5IGV4cGlyZWQgd2hlblxuICAgICAgICAvLyByZWNlaXZlZC4gV2UncmUgdXNpbmcgdGhpcyB0byBhZGQgYSBkZWxheSB3aGVuIG1ha2luZyBhIG5ldyByZXF1ZXN0XG4gICAgICAgIC8vIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCByZXRyeWluZyBpbW1lZGlhdGVseSBpbiBjYXNlIG9mIGEgc2VydmVyXG4gICAgICAgIC8vIHNlcnZpbmcgZXhwaXJlZCB0aWxlcy5cbiAgICAgICAgdGhpcy5leHBpcmVkUmVxdWVzdENvdW50ID0gMDtcblxuICAgICAgICB0aGlzLnN0YXRlID0gJ2xvYWRpbmcnO1xuXG4gICAgICAgIGlmIChwYWludGVyICYmIHBhaW50ZXIudHJhbnNmb3JtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2plY3Rpb24gPSBwYWludGVyLnRyYW5zZm9ybS5wcm9qZWN0aW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJGYWRlRHVyYXRpb24oZHVyYXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBmYWRlRW5kVGltZSA9IGR1cmF0aW9uICsgdGhpcy50aW1lQWRkZWQ7XG4gICAgICAgIGlmIChmYWRlRW5kVGltZSA8IGJyb3dzZXIubm93KCkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuZmFkZUVuZFRpbWUgJiYgZmFkZUVuZFRpbWUgPCB0aGlzLmZhZGVFbmRUaW1lKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5mYWRlRW5kVGltZSA9IGZhZGVFbmRUaW1lO1xuICAgIH1cblxuICAgIHdhc1JlcXVlc3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09ICdlcnJvcmVkJyB8fCB0aGlzLnN0YXRlID09PSAnbG9hZGVkJyB8fCB0aGlzLnN0YXRlID09PSAncmVsb2FkaW5nJztcbiAgICB9XG5cbiAgICBnZXQgdGlsZVRyYW5zZm9ybSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90aWxlVHJhbnNmb3JtKSB7XG4gICAgICAgICAgICB0aGlzLl90aWxlVHJhbnNmb3JtID0gdGlsZVRyYW5zZm9ybSh0aGlzLnRpbGVJRC5jYW5vbmljYWwsIHRoaXMucHJvamVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGVUcmFuc2Zvcm07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBkYXRhIG9iamVjdCB3aXRoIGEgJ2J1ZmZlcnMnIHByb3BlcnR5LCBsb2FkIGl0IGludG9cbiAgICAgKiB0aGlzIHRpbGUncyBlbGVtZW50R3JvdXBzIGFuZCBidWZmZXJzIHByb3BlcnRpZXMgYW5kIHNldCBsb2FkZWRcbiAgICAgKiB0byB0cnVlLiBJZiB0aGUgZGF0YSBpcyBudWxsLCBsaWtlIGluIHRoZSBjYXNlIG9mIGFuIGVtcHR5XG4gICAgICogR2VvSlNPTiB0aWxlLCBuby1vcCBidXQgc3RpbGwgc2V0IGxvYWRlZCB0byB0cnVlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAgICogQHBhcmFtIHBhaW50ZXJcbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZFZlY3RvckRhdGEoZGF0YTogP1dvcmtlclRpbGVSZXN1bHQsIHBhaW50ZXI6IGFueSwganVzdFJlbG9hZGVkOiA/Ym9vbGVhbikge1xuICAgICAgICB0aGlzLnVubG9hZFZlY3RvckRhdGEoKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0gJ2xvYWRlZCc7XG5cbiAgICAgICAgLy8gZW1wdHkgR2VvSlNPTiB0aWxlXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IG5ldyBDb2xsaXNpb25Cb3hBcnJheSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEuZmVhdHVyZUluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCA9IGRhdGEuZmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgaWYgKGRhdGEucmF3VGlsZURhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IHZlY3RvciB0aWxlcyBoYXZlIHJhd1RpbGVEYXRhLCBhbmQgdGhleSB3b24ndCB1cGRhdGUgaXQgZm9yXG4gICAgICAgICAgICAgICAgLy8gJ3JlbG9hZFRpbGUnXG4gICAgICAgICAgICAgICAgdGhpcy5sYXRlc3RSYXdUaWxlRGF0YSA9IGRhdGEucmF3VGlsZURhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEgPSBkYXRhLnJhd1RpbGVEYXRhO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhdGVzdFJhd1RpbGVEYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgcmF3VGlsZURhdGEgaGFzbid0IHVwZGF0ZWQsIGhvbGQgb250byBhIHBvaW50ZXIgdG8gdGhlIGxhc3RcbiAgICAgICAgICAgICAgICAvLyBvbmUgd2UgcmVjZWl2ZWRcbiAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YSA9IHRoaXMubGF0ZXN0UmF3VGlsZURhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IGRhdGEuY29sbGlzaW9uQm94QXJyYXk7XG4gICAgICAgIHRoaXMuYnVja2V0cyA9IGRlc2VyaWFsaXplQnVja2V0KGRhdGEuYnVja2V0cywgcGFpbnRlci5zdHlsZSk7XG5cbiAgICAgICAgdGhpcy5oYXNTeW1ib2xCdWNrZXRzID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLmJ1Y2tldHNbaWRdO1xuICAgICAgICAgICAgaWYgKGJ1Y2tldCBpbnN0YW5jZW9mIFN5bWJvbEJ1Y2tldCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzU3ltYm9sQnVja2V0cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGp1c3RSZWxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQuanVzdFJlbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhc1JUTFRleHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuaGFzU3ltYm9sQnVja2V0cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLmJ1Y2tldHNbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChidWNrZXQgaW5zdGFuY2VvZiBTeW1ib2xCdWNrZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5oYXNSVExUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1JUTFRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUxvYWRSVExUZXh0UGx1Z2luKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVlcnlQYWRkaW5nID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMuYnVja2V0c1tpZF07XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UGFkZGluZyA9IE1hdGgubWF4KHRoaXMucXVlcnlQYWRkaW5nLCBwYWludGVyLnN0eWxlLmdldExheWVyKGlkKS5xdWVyeVJhZGl1cyhidWNrZXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhcyA9IGRhdGEuaW1hZ2VBdGxhcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5nbHlwaEF0bGFzSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBdGxhc0ltYWdlID0gZGF0YS5nbHlwaEF0bGFzSW1hZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEubGluZUF0bGFzKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVBdGxhcyA9IGRhdGEubGluZUF0bGFzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsZWFzZSBhbnkgZGF0YSBvciBXZWJHTCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGlzIHRpbGUuXG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHVubG9hZFZlY3RvckRhdGEoKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNEYXRhKCkpIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgICAgdGhpcy5idWNrZXRzW2lkXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWNrZXRzID0ge307XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VBdGxhcykge1xuICAgICAgICAgICAgdGhpcy5pbWFnZUF0bGFzID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxpbmVBdGxhcykge1xuICAgICAgICAgICAgdGhpcy5saW5lQXRsYXMgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VBdGxhc1RleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhc1RleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGluZUF0bGFzVGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5saW5lQXRsYXNUZXh0dXJlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl90aWxlQm91bmRzQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLl90aWxlQm91bmRzQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVCb3VuZHNJbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl90aWxlQm91bmRzU2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fdGlsZUJvdW5kc0J1ZmZlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fdGlsZURlYnVnQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLl90aWxlRGVidWdCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fdGlsZURlYnVnSW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fdGlsZURlYnVnU2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fdGlsZURlYnVnQnVmZmVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdsb2JlR3JpZEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5nbG9iZUdyaWRCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5nbG9iZUdyaWRCdWZmZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2xvYmVQb2xlQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmdsb2JlUG9sZUJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmdsb2JlUG9sZUJ1ZmZlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBEZWJ1Zy5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlHZW9tZXRyeURlYnVnVml6KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeUdlb21ldHJ5RGVidWdWaXoudW5sb2FkKCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucXVlcnlHZW9tZXRyeURlYnVnVml6O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlCb3VuZHNEZWJ1Z1Zpeikge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlCb3VuZHNEZWJ1Z1Zpei51bmxvYWQoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5xdWVyeUJvdW5kc0RlYnVnVml6O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXggPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXRlID0gJ3VubG9hZGVkJztcbiAgICB9XG5cbiAgICBnZXRCdWNrZXQobGF5ZXI6IFN0eWxlTGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVja2V0c1tsYXllci5pZF07XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMuYnVja2V0c1tpZF07XG4gICAgICAgICAgICBpZiAoYnVja2V0LnVwbG9hZFBlbmRpbmcoKSkge1xuICAgICAgICAgICAgICAgIGJ1Y2tldC51cGxvYWQoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGlmICh0aGlzLmltYWdlQXRsYXMgJiYgIXRoaXMuaW1hZ2VBdGxhcy51cGxvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZUF0bGFzVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHRoaXMuaW1hZ2VBdGxhcy5pbWFnZSwgZ2wuUkdCQSk7XG4gICAgICAgICAgICB0aGlzLmltYWdlQXRsYXMudXBsb2FkZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2x5cGhBdGxhc0ltYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmdseXBoQXRsYXNUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5nbHlwaEF0bGFzSW1hZ2UsIGdsLkFMUEhBKTtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBdGxhc0ltYWdlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxpbmVBdGxhcyAmJiAhdGhpcy5saW5lQXRsYXMudXBsb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGluZUF0bGFzVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHRoaXMubGluZUF0bGFzLmltYWdlLCBnbC5BTFBIQSk7XG4gICAgICAgICAgICB0aGlzLmxpbmVBdGxhcy51cGxvYWRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcmVwYXJlKGltYWdlTWFuYWdlcjogSW1hZ2VNYW5hZ2VyKSB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhcy5wYXRjaFVwZGF0ZWRJbWFnZXMoaW1hZ2VNYW5hZ2VyLCB0aGlzLmltYWdlQXRsYXNUZXh0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFF1ZXJpZXMgbm9uLXN5bWJvbCBmZWF0dXJlcyByZW5kZXJlZCBmb3IgdGhpcyB0aWxlLlxuICAgIC8vIFN5bWJvbCBmZWF0dXJlcyBhcmUgcXVlcmllZCBnbG9iYWxseVxuICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhsYXllcnM6IHtbXzogc3RyaW5nXTogU3R5bGVMYXllcn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRMYXllcnM6IHtbc3RyaW5nXTogT2JqZWN0fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmVhdHVyZVN0YXRlOiBTb3VyY2VGZWF0dXJlU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVSZXN1bHQ6IFRpbGVzcGFjZVF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogeyBmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24sIGxheWVyczogQXJyYXk8c3RyaW5nPiwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxpemVRdWVyeUdlb21ldHJ5OiBib29sZWFuKToge1tfOiBzdHJpbmddOiBBcnJheTx7IGZlYXR1cmVJbmRleDogbnVtYmVyLCBmZWF0dXJlOiBHZW9KU09ORmVhdHVyZSB9Pn0ge1xuICAgICAgICBEZWJ1Zy5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZpc3VhbGl6ZVF1ZXJ5R2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucXVlcnlHZW9tZXRyeURlYnVnVml6KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlHZW9tZXRyeURlYnVnVml6ID0gbmV3IFRpbGVTcGFjZURlYnVnQnVmZmVyKHRoaXMudGlsZVNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucXVlcnlCb3VuZHNEZWJ1Z1Zpeikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5Qm91bmRzRGVidWdWaXogPSBuZXcgVGlsZVNwYWNlRGVidWdCdWZmZXIodGhpcy50aWxlU2l6ZSwgQ29sb3IuYmx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeUdlb21ldHJ5RGVidWdWaXouYWRkUG9pbnRzKHRpbGVSZXN1bHQudGlsZXNwYWNlR2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlCb3VuZHNEZWJ1Z1Zpei5hZGRQb2ludHModGlsZVJlc3VsdC5idWZmZXJlZFRpbGVzcGFjZUdlb21ldHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCB8fCAhdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEpXG4gICAgICAgICAgICByZXR1cm4ge307XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LnF1ZXJ5KHtcbiAgICAgICAgICAgIHRpbGVSZXN1bHQsXG4gICAgICAgICAgICBwaXhlbFBvc01hdHJpeCxcbiAgICAgICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgIHRpbGVUcmFuc2Zvcm06IHRoaXMudGlsZVRyYW5zZm9ybVxuICAgICAgICB9LCBsYXllcnMsIHNlcmlhbGl6ZWRMYXllcnMsIHNvdXJjZUZlYXR1cmVTdGF0ZSk7XG4gICAgfVxuXG4gICAgcXVlcnlTb3VyY2VGZWF0dXJlcyhyZXN1bHQ6IEFycmF5PEdlb0pTT05GZWF0dXJlPiwgcGFyYW1zOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZUluZGV4ID0gdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXg7XG4gICAgICAgIGlmICghZmVhdHVyZUluZGV4IHx8ICFmZWF0dXJlSW5kZXgucmF3VGlsZURhdGEpIHJldHVybjtcblxuICAgICAgICBjb25zdCB2dExheWVycyA9IGZlYXR1cmVJbmRleC5sb2FkVlRMYXllcnMoKTtcblxuICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IHBhcmFtcyA/IHBhcmFtcy5zb3VyY2VMYXllciA6ICcnO1xuICAgICAgICBjb25zdCBsYXllciA9IHZ0TGF5ZXJzLl9nZW9qc29uVGlsZUxheWVyIHx8IHZ0TGF5ZXJzW3NvdXJjZUxheWVyXTtcblxuICAgICAgICBpZiAoIWxheWVyKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZmlsdGVyID0gZmVhdHVyZUZpbHRlcihwYXJhbXMgJiYgcGFyYW1zLmZpbHRlcik7XG4gICAgICAgIGNvbnN0IHt6LCB4LCB5fSA9IHRoaXMudGlsZUlELmNhbm9uaWNhbDtcbiAgICAgICAgY29uc3QgY29vcmQgPSB7eiwgeCwgeX07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoaSk7XG4gICAgICAgICAgICBpZiAoZmlsdGVyLm5lZWRHZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRpb25GZWF0dXJlID0gdG9FdmFsdWF0aW9uRmVhdHVyZShmZWF0dXJlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRlci5maWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMudGlsZUlELm92ZXJzY2FsZWRaKSwgZXZhbHVhdGlvbkZlYXR1cmUsIHRoaXMudGlsZUlELmNhbm9uaWNhbCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsdGVyLmZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy50aWxlSUQub3ZlcnNjYWxlZFopLCBmZWF0dXJlKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWQgPSBmZWF0dXJlSW5kZXguZ2V0SWQoZmVhdHVyZSwgc291cmNlTGF5ZXIpO1xuICAgICAgICAgICAgY29uc3QgZ2VvanNvbkZlYXR1cmUgPSBuZXcgR2VvSlNPTkZlYXR1cmUoZmVhdHVyZSwgeiwgeCwgeSwgaWQpO1xuICAgICAgICAgICAgKGdlb2pzb25GZWF0dXJlOiBhbnkpLnRpbGUgPSBjb29yZDtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlb2pzb25GZWF0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhc0RhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSAnbG9hZGVkJyB8fCB0aGlzLnN0YXRlID09PSAncmVsb2FkaW5nJyB8fCB0aGlzLnN0YXRlID09PSAnZXhwaXJlZCc7XG4gICAgfVxuXG4gICAgcGF0dGVybnNMb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlQXRsYXMgJiYgISFPYmplY3Qua2V5cyh0aGlzLmltYWdlQXRsYXMucGF0dGVyblBvc2l0aW9ucykubGVuZ3RoO1xuICAgIH1cblxuICAgIHNldEV4cGlyeURhdGEoZGF0YTogYW55KSB7XG4gICAgICAgIGNvbnN0IHByaW9yID0gdGhpcy5leHBpcmF0aW9uVGltZTtcblxuICAgICAgICBpZiAoZGF0YS5jYWNoZUNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZENDID0gcGFyc2VDYWNoZUNvbnRyb2woZGF0YS5jYWNoZUNvbnRyb2wpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZENDWydtYXgtYWdlJ10pIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBEYXRlLm5vdygpICsgcGFyc2VkQ0NbJ21heC1hZ2UnXSAqIDEwMDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5leHBpcmVzKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gbmV3IERhdGUoZGF0YS5leHBpcmVzKS5nZXRUaW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGxldCBpc0V4cGlyZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZXhwaXJhdGlvblRpbWUgPiBub3cpIHtcbiAgICAgICAgICAgICAgICBpc0V4cGlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXByaW9yKSB7XG4gICAgICAgICAgICAgICAgaXNFeHBpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5leHBpcmF0aW9uVGltZSA8IHByaW9yKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhwaXJpbmcgZGF0ZSBpcyBnb2luZyBiYWNrd2FyZHM6XG4gICAgICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICAgICAgICAgICAgICBpc0V4cGlyZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5leHBpcmF0aW9uVGltZSAtIHByaW9yO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFkZWx0YSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXIgaXMgc2VydmluZyB0aGUgc2FtZSBleHBpcmVkIHJlc291cmNlIG92ZXIgYW5kIG92ZXI6IGZhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB0byBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICAgICAgICAgICAgICAgICAgICBpc0V4cGlyZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoYXQgZWl0aGVyIHRoZSBjbGllbnQgb3IgdGhlIHNlcnZlciBjbG9jayBpcyB3cm9uZyBhbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGludGVycG9sYXRlIGEgdmFsaWQgZXhwaXJhdGlvbiBkYXRlIChmcm9tIHRoZSBjbGllbnQgUE9WKVxuICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZpbmcgYSBtaW5pbXVtIHRpbWVvdXQuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBub3cgKyBNYXRoLm1heChkZWx0YSwgQ0xPQ0tfU0tFV19SRVRSWV9USU1FT1VUKTtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzRXhwaXJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCsrO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnZXhwaXJlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRFeHBpcnlUaW1lb3V0KCkge1xuICAgICAgICBpZiAodGhpcy5leHBpcmF0aW9uVGltZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAxMDAwICogKDEgPDwgTWF0aC5taW4odGhpcy5leHBpcmVkUmVxdWVzdENvdW50IC0gMSwgMzEpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTWF4IHZhbHVlIGZvciBgc2V0VGltZW91dGAgaW1wbGVtZW50YXRpb25zIGlzIGEgMzIgYml0IGludGVnZXI7IGNhcCB0aGlzIGFjY29yZGluZ2x5XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuZXhwaXJhdGlvblRpbWUgLSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwgTWF0aC5wb3coMiwgMzEpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGZWF0dXJlU3RhdGUoc3RhdGVzOiBMYXllckZlYXR1cmVTdGF0ZXMsIHBhaW50ZXI6ID9QYWludGVyKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXggfHxcbiAgICAgICAgICAgICF0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YSB8fFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc3RhdGVzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgICFwYWludGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2dExheWVycyA9IHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LmxvYWRWVExheWVycygpO1xuICAgICAgICBjb25zdCBhdmFpbGFibGVJbWFnZXMgPSBwYWludGVyLnN0eWxlLmxpc3RJbWFnZXMoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgICAgaWYgKCFwYWludGVyLnN0eWxlLmhhc0xheWVyKGlkKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMuYnVja2V0c1tpZF07XG4gICAgICAgICAgICAvLyBCdWNrZXRzIGFyZSBncm91cGVkIGJ5IGNvbW1vbiBzb3VyY2UtbGF5ZXJcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVySWQgPSBidWNrZXQubGF5ZXJzWzBdWydzb3VyY2VMYXllciddIHx8ICdfZ2VvanNvblRpbGVMYXllcic7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IHZ0TGF5ZXJzW3NvdXJjZUxheWVySWRdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJTdGF0ZXMgPSBzdGF0ZXNbc291cmNlTGF5ZXJJZF07XG4gICAgICAgICAgICBpZiAoIXNvdXJjZUxheWVyIHx8ICFzb3VyY2VMYXllclN0YXRlcyB8fCBPYmplY3Qua2V5cyhzb3VyY2VMYXllclN0YXRlcykubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgYnVja2V0LnVwZGF0ZShzb3VyY2VMYXllclN0YXRlcywgc291cmNlTGF5ZXIsIGF2YWlsYWJsZUltYWdlcywgdGhpcy5pbWFnZUF0bGFzICYmIHRoaXMuaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zIHx8IHt9KTtcbiAgICAgICAgICAgIGlmIChidWNrZXQgaW5zdGFuY2VvZiBMaW5lQnVja2V0IHx8IGJ1Y2tldCBpbnN0YW5jZW9mIEZpbGxCdWNrZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHBhaW50ZXIuc3R5bGUuX2dldFNvdXJjZUNhY2hlKGJ1Y2tldC5sYXllcnNbMF0uc291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpbnRlci5fdGVycmFpbiAmJiBwYWludGVyLl90ZXJyYWluLmVuYWJsZWQgJiYgc291cmNlQ2FjaGUgJiYgYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCkge1xuICAgICAgICAgICAgICAgICAgICBwYWludGVyLl90ZXJyYWluLl9jbGVhclJlbmRlckNhY2hlRm9yVGlsZShzb3VyY2VDYWNoZS5pZCwgdGhpcy50aWxlSUQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gcGFpbnRlciAmJiBwYWludGVyLnN0eWxlICYmIHBhaW50ZXIuc3R5bGUuZ2V0TGF5ZXIoaWQpO1xuICAgICAgICAgICAgaWYgKGxheWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeVBhZGRpbmcgPSBNYXRoLm1heCh0aGlzLnF1ZXJ5UGFkZGluZywgbGF5ZXIucXVlcnlSYWRpdXMoYnVja2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob2xkaW5nRm9yRmFkZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbCAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHN5bWJvbEZhZGVGaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWwgfHwgdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsIDwgYnJvd3Nlci5ub3coKTtcbiAgICB9XG5cbiAgICBjbGVhckZhZGVIb2xkKCkge1xuICAgICAgICB0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgc2V0SG9sZER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsID0gYnJvd3Nlci5ub3coKSArIGR1cmF0aW9uO1xuICAgIH1cblxuICAgIHNldERlcGVuZGVuY2llcyhuYW1lc3BhY2U6IHN0cmluZywgZGVwZW5kZW5jaWVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgaW5kZXhbZGVwXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNbbmFtZXNwYWNlXSA9IGluZGV4O1xuICAgIH1cblxuICAgIGhhc0RlcGVuZGVuY3kobmFtZXNwYWNlczogQXJyYXk8c3RyaW5nPiwga2V5czogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBvZiBuYW1lc3BhY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSB0aGlzLmRlcGVuZGVuY2llc1tuYW1lc3BhY2VdO1xuICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2xlYXJRdWVyeURlYnVnVml6KCkge1xuICAgICAgICBEZWJ1Zy5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlHZW9tZXRyeURlYnVnVml6KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeUdlb21ldHJ5RGVidWdWaXouY2xlYXJQb2ludHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5Qm91bmRzRGVidWdWaXopIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5Qm91bmRzRGVidWdWaXouY2xlYXJQb2ludHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX21ha2VEZWJ1Z1RpbGVCb3VuZHNCdWZmZXJzKGNvbnRleHQ6IENvbnRleHQsIHByb2plY3Rpb246IFByb2plY3Rpb24pIHtcbiAgICAgICAgaWYgKCFwcm9qZWN0aW9uIHx8IHByb2plY3Rpb24ubmFtZSA9PT0gJ21lcmNhdG9yJyB8fCB0aGlzLl90aWxlRGVidWdCdWZmZXIpIHJldHVybjtcblxuICAgICAgICAvLyByZXByb2plY3QgdGlsZSBvdXRsaW5lIHdpdGggYWRhcHRpdmUgcmVzYW1wbGluZ1xuICAgICAgICBjb25zdCBib3VuZHNMaW5lID0gbG9hZEdlb21ldHJ5KEJPVU5EU19GRUFUVVJFLCB0aGlzLnRpbGVJRC5jYW5vbmljYWwsIHRoaXMudGlsZVRyYW5zZm9ybSlbMF07XG5cbiAgICAgICAgLy8gZ2VuZXJhdGUgdmVydGljZXMgZm9yIGRlYnVnZ2luZyB0aWxlIGJvdW5kYXJpZXNcbiAgICAgICAgY29uc3QgZGVidWdWZXJ0aWNlcyA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICBjb25zdCBkZWJ1Z0luZGljZXMgPSBuZXcgTGluZVN0cmlwSW5kZXhBcnJheSgpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRzTGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qge3gsIHl9ID0gYm91bmRzTGluZVtpXTtcbiAgICAgICAgICAgIGRlYnVnVmVydGljZXMuZW1wbGFjZUJhY2soeCwgeSk7XG4gICAgICAgICAgICBkZWJ1Z0luZGljZXMuZW1wbGFjZUJhY2soaSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbmRpY2VzLmVtcGxhY2VCYWNrKDApO1xuXG4gICAgICAgIHRoaXMuX3RpbGVEZWJ1Z0luZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcihkZWJ1Z0luZGljZXMpO1xuICAgICAgICB0aGlzLl90aWxlRGVidWdCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihkZWJ1Z1ZlcnRpY2VzLCBib3VuZHNBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLl90aWxlRGVidWdTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCBkZWJ1Z1ZlcnRpY2VzLmxlbmd0aCwgZGVidWdJbmRpY2VzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgX21ha2VUaWxlQm91bmRzQnVmZmVycyhjb250ZXh0OiBDb250ZXh0LCBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl90aWxlQm91bmRzQnVmZmVyIHx8ICFwcm9qZWN0aW9uIHx8IHByb2plY3Rpb24ubmFtZSA9PT0gJ21lcmNhdG9yJykgcmV0dXJuO1xuXG4gICAgICAgIC8vIHJlcHJvamVjdCB0aWxlIG91dGxpbmUgd2l0aCBhZGFwdGl2ZSByZXNhbXBsaW5nXG4gICAgICAgIGNvbnN0IGJvdW5kc0xpbmUgPSBsb2FkR2VvbWV0cnkoQk9VTkRTX0ZFQVRVUkUsIHRoaXMudGlsZUlELmNhbm9uaWNhbCwgdGhpcy50aWxlVHJhbnNmb3JtKVswXTtcblxuICAgICAgICBsZXQgYm91bmRzVmVydGljZXMsIGJvdW5kc0luZGljZXM7XG4gICAgICAgIGlmICh0aGlzLmlzUmFzdGVyKSB7XG4gICAgICAgICAgICAvLyBmb3IgcmFzdGVyIHRpbGVzLCBnZW5lcmF0ZSBhbiBhZGFwdGl2ZSBNQVJUSU5JIG1lc2hcbiAgICAgICAgICAgIGNvbnN0IG1lc2ggPSBnZXRUaWxlTWVzaCh0aGlzLnRpbGVJRC5jYW5vbmljYWwsIHByb2plY3Rpb24pO1xuICAgICAgICAgICAgYm91bmRzVmVydGljZXMgPSBtZXNoLnZlcnRpY2VzO1xuICAgICAgICAgICAgYm91bmRzSW5kaWNlcyA9IG1lc2guaW5kaWNlcztcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZm9yIHZlY3RvciB0aWxlcywgZ2VuZXJhdGUgYW4gRWFyY3V0IHRyaWFuZ3VsYXRpb24gb2YgdGhlIG91dGxpbmVcbiAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzID0gbmV3IFRpbGVCb3VuZHNBcnJheSgpO1xuICAgICAgICAgICAgYm91bmRzSW5kaWNlcyA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB7eCwgeX0gb2YgYm91bmRzTGluZSkge1xuICAgICAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzLmVtcGxhY2VCYWNrKHgsIHksIDAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW5kaWNlcyA9IGVhcmN1dChib3VuZHNWZXJ0aWNlcy5pbnQxNiwgdW5kZWZpbmVkLCA0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgICAgIGJvdW5kc0luZGljZXMuZW1wbGFjZUJhY2soaW5kaWNlc1tpXSwgaW5kaWNlc1tpICsgMV0sIGluZGljZXNbaSArIDJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RpbGVCb3VuZHNCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihib3VuZHNWZXJ0aWNlcywgYm91bmRzQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy5fdGlsZUJvdW5kc0luZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcihib3VuZHNJbmRpY2VzKTtcbiAgICAgICAgdGhpcy5fdGlsZUJvdW5kc1NlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIGJvdW5kc1ZlcnRpY2VzLmxlbmd0aCwgYm91bmRzSW5kaWNlcy5sZW5ndGgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGlsZTtcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5jb25zdCBsYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdhX2dsb2JlX3BvcycsIGNvbXBvbmVudHM6IDN9LFxuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdhX21lcmNfcG9zJywgY29tcG9uZW50czogMn0sXG4gICAge3R5cGU6ICdGbG9hdDMyJywgbmFtZTogJ2FfdXYnLCBjb21wb25lbnRzOiAyfVxuXSk7XG5cbmV4cG9ydCBjb25zdCBhdG1vc3BoZXJlTGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnYV9wb3MnLCBjb21wb25lbnRzOiAzfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnYV91dicsIGNvbXBvbmVudHM6IDJ9XG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgbGF5b3V0O1xuZXhwb3J0IGNvbnN0IHttZW1iZXJzLCBzaXplLCBhbGlnbm1lbnR9ID0gbGF5b3V0O1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHtDYW5vbmljYWxUaWxlSUQsIFVud3JhcHBlZFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHttYXQ0LCB2ZWM0LCB2ZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge2xuZ0Zyb21NZXJjYXRvclgsIGxhdEZyb21NZXJjYXRvclksIG1lcmNhdG9yWmZyb21BbHRpdHVkZSwgbWVyY2F0b3JYZnJvbUxuZywgbWVyY2F0b3JZZnJvbUxhdH0gZnJvbSAnLi4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uLy4uL2RhdGEvZXh0ZW50LmpzJztcbmltcG9ydCB7ZGVnVG9SYWQsIHJhZFRvRGVnLCBnZXRDb2x1bW59IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge1JheX0gZnJvbSAnLi4vLi4vdXRpbC9wcmltaXRpdmVzLmpzJztcbmltcG9ydCB7XG4gICAgbGF0TG5nVG9FQ0VGLFxuICAgIGdsb2JlVGlsZUJvdW5kcyxcbiAgICBnbG9iZUVDRUZOb3JtYWxpemF0aW9uU2NhbGUsXG4gICAgZ2xvYmVFQ0VGVW5pdHNUb1BpeGVsU2NhbGUsXG4gICAgY2FsY3VsYXRlR2xvYmVNYXRyaXgsXG4gICAgZ2xvYmVOb3JtYWxpemVFQ0VGLFxuICAgIGdsb2JlRGVub3JtYWxpemVFQ0VGLFxuICAgIEdMT0JFX1JBRElVUyxcbn0gZnJvbSAnLi9nbG9iZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdsb2JlVGlsZVRyYW5zZm9ybSB7XG4gICAgX3RyOiBUcmFuc2Zvcm07XG4gICAgX3dvcmxkU2l6ZTogbnVtYmVyO1xuICAgIF9nbG9iZU1hdHJpeDogRmxvYXQ2NEFycmF5O1xuXG4gICAgY29uc3RydWN0b3IodHI6IFRyYW5zZm9ybSwgd29ybGRTaXplOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fdHIgPSB0cjtcbiAgICAgICAgdGhpcy5fd29ybGRTaXplID0gd29ybGRTaXplO1xuICAgICAgICB0aGlzLl9nbG9iZU1hdHJpeCA9IGNhbGN1bGF0ZUdsb2JlTWF0cml4KHRyLCB3b3JsZFNpemUpO1xuICAgIH1cblxuICAgIGNyZWF0ZVRpbGVNYXRyaXgoaWQ6IFVud3JhcHBlZFRpbGVJRCk6IG1hdDQge1xuICAgICAgICBjb25zdCBkZWNvZGUgPSBnbG9iZURlbm9ybWFsaXplRUNFRihnbG9iZVRpbGVCb3VuZHMoaWQuY2Fub25pY2FsKSk7XG4gICAgICAgIHJldHVybiBtYXQ0Lm11bHRpcGx5KFtdLCB0aGlzLl9nbG9iZU1hdHJpeCwgZGVjb2RlKTtcbiAgICB9XG5cbiAgICBjcmVhdGVJbnZlcnNpb25NYXRyaXgoaWQ6IFVud3JhcHBlZFRpbGVJRCk6IG1hdDQge1xuICAgICAgICBjb25zdCBpZGVudGl0eSA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMuX3RyLmNlbnRlcjtcbiAgICAgICAgY29uc3QgZWNlZlVuaXRzVG9QaXhlbHMgPSBnbG9iZUVDRUZVbml0c1RvUGl4ZWxTY2FsZSh0aGlzLl93b3JsZFNpemUpO1xuICAgICAgICBjb25zdCBtYXRyaXggPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDY0QXJyYXkoMTYpKTtcbiAgICAgICAgY29uc3QgZW5jb2RlID0gZ2xvYmVOb3JtYWxpemVFQ0VGKGdsb2JlVGlsZUJvdW5kcyhpZC5jYW5vbmljYWwpKTtcbiAgICAgICAgbWF0NC5tdWx0aXBseShtYXRyaXgsIG1hdHJpeCwgZW5jb2RlKTtcbiAgICAgICAgbWF0NC5yb3RhdGVZKG1hdHJpeCwgbWF0cml4LCBkZWdUb1JhZChjZW50ZXIubG5nKSk7XG4gICAgICAgIG1hdDQucm90YXRlWChtYXRyaXgsIG1hdHJpeCwgZGVnVG9SYWQoY2VudGVyLmxhdCkpO1xuXG4gICAgICAgIG1hdDQuc2NhbGUobWF0cml4LCBtYXRyaXgsIFsxLjAgLyBlY2VmVW5pdHNUb1BpeGVscywgMS4wIC8gZWNlZlVuaXRzVG9QaXhlbHMsIDEuMF0pO1xuXG4gICAgICAgIGNvbnN0IFBQTU1lcmNhdG9yID0gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEuMCwgY2VudGVyLmxhdCkgKiB0aGlzLl93b3JsZFNpemU7XG4gICAgICAgIGNvbnN0IGdsb2JlVG9NZXJjYXRvclBQTVJhdGlvID0gUFBNTWVyY2F0b3IgLyB0aGlzLl90ci5waXhlbHNQZXJNZXRlcjtcbiAgICAgICAgY29uc3Qgd29ybGRTaXplTWVyY2F0b3IgPSB0aGlzLl93b3JsZFNpemUgLyBnbG9iZVRvTWVyY2F0b3JQUE1SYXRpbztcbiAgICAgICAgY29uc3Qgd3NSYWRpdXMgPSB3b3JsZFNpemVNZXJjYXRvciAvICgyLjAgKiBNYXRoLlBJKTtcbiAgICAgICAgY29uc3QgbG9jYWxSYWRpdXMgPSBFWFRFTlQgLyAoMi4wICogTWF0aC5QSSk7XG4gICAgICAgIGNvbnN0IGVjZWZVbml0c1RvTWVyY2F0b3JQaXhlbHMgPSB3c1JhZGl1cyAvIGxvY2FsUmFkaXVzO1xuXG4gICAgICAgIG1hdDQuc2NhbGUoaWRlbnRpdHksIGlkZW50aXR5LCBbZWNlZlVuaXRzVG9NZXJjYXRvclBpeGVscywgZWNlZlVuaXRzVG9NZXJjYXRvclBpeGVscywgMS4wXSk7XG5cbiAgICAgICAgcmV0dXJuIG1hdDQubXVsdGlwbHkobWF0cml4LCBtYXRyaXgsIGlkZW50aXR5KTtcbiAgICB9XG5cbiAgICB1cFZlY3RvcihpZDogQ2Fub25pY2FsVGlsZUlELCB4OiBudW1iZXIsIHk6IG51bWJlcik6IHZlYzMge1xuICAgICAgICBjb25zdCB0aWxlcyA9IDEgPDwgaWQuejtcbiAgICAgICAgY29uc3QgbWVyY1ggPSAoeCAvIEVYVEVOVCArIGlkLngpIC8gdGlsZXM7XG4gICAgICAgIGNvbnN0IG1lcmNZID0gKHkgLyBFWFRFTlQgKyBpZC55KSAvIHRpbGVzO1xuICAgICAgICByZXR1cm4gbGF0TG5nVG9FQ0VGKGxhdEZyb21NZXJjYXRvclkobWVyY1kpLCBsbmdGcm9tTWVyY2F0b3JYKG1lcmNYKSwgMS4wKTtcbiAgICB9XG5cbiAgICB1cFZlY3RvclNjYWxlKGlkOiBDYW5vbmljYWxUaWxlSUQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBwaXhlbHNQZXJNZXRlckVDRUYgPSBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgMC4wKSAqIDIuMCAqIEdMT0JFX1JBRElVUyAqIE1hdGguUEk7XG4gICAgICAgIHJldHVybiBwaXhlbHNQZXJNZXRlckVDRUYgKiBnbG9iZUVDRUZOb3JtYWxpemF0aW9uU2NhbGUoZ2xvYmVUaWxlQm91bmRzKGlkKSk7XG4gICAgfVxuXG4gICAgcG9pbnRDb29yZGluYXRlKHg6IG51bWJlciwgeTogbnVtYmVyKTogTWVyY2F0b3JDb29yZGluYXRlIHtcbiAgICAgICAgY29uc3QgcG9pbnQwID0gW3gsIHksIDAsIDFdO1xuICAgICAgICBjb25zdCBwb2ludDEgPSBbeCwgeSwgMSwgMV07XG5cbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHBvaW50MCwgcG9pbnQwLCB0aGlzLl90ci5waXhlbE1hdHJpeEludmVyc2UpO1xuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocG9pbnQxLCBwb2ludDEsIHRoaXMuX3RyLnBpeGVsTWF0cml4SW52ZXJzZSk7XG5cbiAgICAgICAgdmVjNC5zY2FsZShwb2ludDAsIHBvaW50MCwgMSAvIHBvaW50MFszXSk7XG4gICAgICAgIHZlYzQuc2NhbGUocG9pbnQxLCBwb2ludDEsIDEgLyBwb2ludDFbM10pO1xuXG4gICAgICAgIGNvbnN0IHAwcDEgPSB2ZWMzLnN1YihbXSwgcG9pbnQxLCBwb2ludDApO1xuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB2ZWMzLm5vcm1hbGl6ZShbXSwgcDBwMSk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBnbG9iZSBvcmlnbyBpbiB3b3JsZCBzcGFjZVxuICAgICAgICBjb25zdCBnbG9iZUNlbnRlciA9IHZlYzMudHJhbnNmb3JtTWF0NChbXSwgWzAsIDAsIDBdLCB0aGlzLl9nbG9iZU1hdHJpeCk7XG4gICAgICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuX3dvcmxkU2l6ZSAvICgyLjAgKiBNYXRoLlBJKTtcblxuICAgICAgICBjb25zdCBwb2ludE9uR2xvYmUgPSBbXTtcbiAgICAgICAgY29uc3QgcmF5ID0gbmV3IFJheShwb2ludDAsIGRpcmVjdGlvbik7XG5cbiAgICAgICAgcmF5LmNsb3Nlc3RQb2ludE9uU3BoZXJlKGdsb2JlQ2VudGVyLCByYWRpdXMsIHBvaW50T25HbG9iZSk7XG5cbiAgICAgICAgLy8gVHJhbnNmb3JtIGNvb3JkaW5hdGUgYXhlcyB0byBmaW5kIGxhdCAmIGxuZyBvZiB0aGUgcG9zaXRpb25cbiAgICAgICAgY29uc3QgeGEgPSB2ZWMzLm5vcm1hbGl6ZShbXSwgZ2V0Q29sdW1uKHRoaXMuX2dsb2JlTWF0cml4LCAwKSk7XG4gICAgICAgIGNvbnN0IHlhID0gdmVjMy5ub3JtYWxpemUoW10sIGdldENvbHVtbih0aGlzLl9nbG9iZU1hdHJpeCwgMSkpO1xuICAgICAgICBjb25zdCB6YSA9IHZlYzMubm9ybWFsaXplKFtdLCBnZXRDb2x1bW4odGhpcy5fZ2xvYmVNYXRyaXgsIDIpKTtcblxuICAgICAgICBjb25zdCB4cCA9IHZlYzMuZG90KHhhLCBwb2ludE9uR2xvYmUpO1xuICAgICAgICBjb25zdCB5cCA9IHZlYzMuZG90KHlhLCBwb2ludE9uR2xvYmUpO1xuICAgICAgICBjb25zdCB6cCA9IHZlYzMuZG90KHphLCBwb2ludE9uR2xvYmUpO1xuXG4gICAgICAgIGNvbnN0IGxhdCA9IHJhZFRvRGVnKE1hdGguYXNpbigteXAgLyByYWRpdXMpKTtcbiAgICAgICAgY29uc3QgbG5nID0gcmFkVG9EZWcoTWF0aC5hdGFuMih4cCwgenApKTtcblxuICAgICAgICBjb25zdCBteCA9IG1lcmNhdG9yWGZyb21MbmcobG5nKTtcbiAgICAgICAgY29uc3QgbXkgPSBtZXJjYXRvcllmcm9tTGF0KGxhdCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNZXJjYXRvckNvb3JkaW5hdGUobXgsIG15KTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHt2ZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHtSYXl9IGZyb20gJy4uLy4uL3V0aWwvcHJpbWl0aXZlcy5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vdHJhbnNmb3JtLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZhcnRoZXN0UGl4ZWxEaXN0YW5jZU9uUGxhbmUodHI6IFRyYW5zZm9ybSwgcGl4ZWxzUGVyTWV0ZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gRmluZCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIHBvaW50IFt3aWR0aC8yICsgb2Zmc2V0LngsIGhlaWdodC8yICsgb2Zmc2V0LnldIHRvIHRoZVxuICAgIC8vIGNlbnRlciB0b3AgcG9pbnQgW3dpZHRoLzIgKyBvZmZzZXQueCwgMF0gaW4gWiB1bml0cywgdXNpbmcgdGhlIGxhdyBvZiBzaW5lcy5cbiAgICAvLyAxIFogdW5pdCBpcyBlcXVpdmFsZW50IHRvIDEgaG9yaXpvbnRhbCBweCBhdCB0aGUgY2VudGVyIG9mIHRoZSBtYXBcbiAgICAvLyAodGhlIGRpc3RhbmNlIGJldHdlZW5bd2lkdGgvMiwgaGVpZ2h0LzJdIGFuZCBbd2lkdGgvMiArIDEsIGhlaWdodC8yXSlcbiAgICBjb25zdCBmb3ZBYm92ZUNlbnRlciA9IHRyLmZvdkFib3ZlQ2VudGVyO1xuXG4gICAgLy8gQWRqdXN0IGRpc3RhbmNlIHRvIE1TTCBieSB0aGUgbWluaW11bSBwb3NzaWJsZSBlbGV2YXRpb24gdmlzaWJsZSBvbiBzY3JlZW4sXG4gICAgLy8gdGhpcyB3YXkgdGhlIGZhciBwbGFuZSBpcyBwdXNoZWQgZnVydGhlciBpbiB0aGUgY2FzZSBvZiBuZWdhdGl2ZSBlbGV2YXRpb24uXG4gICAgY29uc3QgbWluRWxldmF0aW9uSW5QaXhlbHMgPSB0ci5lbGV2YXRpb24gP1xuICAgICAgICB0ci5lbGV2YXRpb24uZ2V0TWluRWxldmF0aW9uQmVsb3dNU0woKSAqIHBpeGVsc1Blck1ldGVyIDpcbiAgICAgICAgMDtcbiAgICBjb25zdCBjYW1lcmFUb1NlYUxldmVsRGlzdGFuY2UgPSAoKHRyLl9jYW1lcmEucG9zaXRpb25bMl0gKiB0ci53b3JsZFNpemUpIC0gbWluRWxldmF0aW9uSW5QaXhlbHMpIC8gTWF0aC5jb3ModHIuX3BpdGNoKTtcbiAgICBjb25zdCB0b3BIYWxmU3VyZmFjZURpc3RhbmNlID0gTWF0aC5zaW4oZm92QWJvdmVDZW50ZXIpICogY2FtZXJhVG9TZWFMZXZlbERpc3RhbmNlIC8gTWF0aC5zaW4oTWF0aC5tYXgoTWF0aC5QSSAvIDIuMCAtIHRyLl9waXRjaCAtIGZvdkFib3ZlQ2VudGVyLCAwLjAxKSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgeiBkaXN0YW5jZSBvZiB0aGUgZmFydGhlc3QgZnJhZ21lbnQgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQuXG4gICAgY29uc3QgZnVydGhlc3REaXN0YW5jZSA9IE1hdGguc2luKHRyLl9waXRjaCkgKiB0b3BIYWxmU3VyZmFjZURpc3RhbmNlICsgY2FtZXJhVG9TZWFMZXZlbERpc3RhbmNlO1xuICAgIGNvbnN0IGhvcml6b25EaXN0YW5jZSA9IGNhbWVyYVRvU2VhTGV2ZWxEaXN0YW5jZSAqICgxIC8gdHIuX2hvcml6b25TaGlmdCk7XG5cbiAgICAvLyBBZGQgYSBiaXQgZXh0cmEgdG8gYXZvaWQgcHJlY2lzaW9uIHByb2JsZW1zIHdoZW4gYSBmcmFnbWVudCdzIGRpc3RhbmNlIGlzIGV4YWN0bHkgYGZ1cnRoZXN0RGlzdGFuY2VgXG4gICAgcmV0dXJuIE1hdGgubWluKGZ1cnRoZXN0RGlzdGFuY2UgKiAxLjAxLCBob3Jpem9uRGlzdGFuY2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmFydGhlc3RQaXhlbERpc3RhbmNlT25TcGhlcmUodHI6IFRyYW5zZm9ybSwgcGl4ZWxzUGVyTWV0ZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gRmluZCBmYXJ0aGVzdCBkaXN0YW5jZSBvZiB0aGUgZ2xvYmUgdGhhdCBpcyBwb3RlbnRpYWxseSB2aXNpYmxlIHRvIHRoZSBjYW1lcmEuXG4gICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlIHZpZXcgZnJ1c3R1bSBpcyBmdWxseSBjb3ZlcmVkIGJ5IHRoZSBtYXAgYnkgY2FzdGluZyBhIHJheVxuICAgIC8vIGZyb20gdGhlIHRvcCBsZWZ0L3JpZ2h0IGNvcm5lciBhbmQgc2VlIGlmIGl0IGludGVyc2VjdHMgd2l0aCB0aGUgZ2xvYmUuIEluIGNhc2VcbiAgICAvLyBvZiBubyBpbnRlcnNlY3Rpb24gd2UgbmVlZCB0byBmaW5kIGRpc3RhbmNlIHRvIHRoZSBob3Jpem9uIHBvaW50IHdoZXJlIHRoZVxuICAgIC8vIHN1cmZhY2Ugbm9ybWFsIGlzIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGNhbWVyYSBmb3J3YXJkIGRpcmVjdGlvbi5cbiAgICBjb25zdCBjYW1lcmFEaXN0YW5jZSA9IHRyLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U7XG4gICAgY29uc3QgY2VudGVyUGl4ZWxBbHRpdHVkZSA9IHRyLl9jZW50ZXJBbHRpdHVkZSAqIHBpeGVsc1Blck1ldGVyO1xuXG4gICAgY29uc3QgY2FtZXJhID0gdHIuX2NhbWVyYTtcbiAgICBjb25zdCBmb3J3YXJkID0gdHIuX2NhbWVyYS5mb3J3YXJkKCk7XG4gICAgY29uc3QgY2FtZXJhUG9zaXRpb24gPSB2ZWMzLmFkZChbXSwgdmVjMy5zY2FsZShbXSwgZm9yd2FyZCwgLWNhbWVyYURpc3RhbmNlKSwgWzAsIDAsIGNlbnRlclBpeGVsQWx0aXR1ZGVdKTtcblxuICAgIGNvbnN0IGdsb2JlUmFkaXVzID0gdHIud29ybGRTaXplIC8gKDIuMCAqIE1hdGguUEkpO1xuICAgIGNvbnN0IGdsb2JlQ2VudGVyID0gWzAsIDAsIC1nbG9iZVJhZGl1c107XG5cbiAgICBjb25zdCBhc3BlY3RSYXRpbyA9IHRyLndpZHRoIC8gdHIuaGVpZ2h0O1xuICAgIGNvbnN0IHRhbkZvdkFib3ZlQ2VudGVyID0gTWF0aC50YW4odHIuZm92QWJvdmVDZW50ZXIpO1xuXG4gICAgY29uc3QgdXAgPSB2ZWMzLnNjYWxlKFtdLCBjYW1lcmEudXAoKSwgdGFuRm92QWJvdmVDZW50ZXIpO1xuICAgIGNvbnN0IHJpZ2h0ID0gdmVjMy5zY2FsZShbXSwgY2FtZXJhLnJpZ2h0KCksIHRhbkZvdkFib3ZlQ2VudGVyICogYXNwZWN0UmF0aW8pO1xuICAgIGNvbnN0IGRpciA9IHZlYzMubm9ybWFsaXplKFtdLCB2ZWMzLmFkZChbXSwgdmVjMy5hZGQoW10sIGZvcndhcmQsIHVwKSwgcmlnaHQpKTtcblxuICAgIGNvbnN0IHBvaW50T25HbG9iZSA9IFtdO1xuICAgIGNvbnN0IHJheSA9IG5ldyBSYXkoY2FtZXJhUG9zaXRpb24sIGRpcik7XG5cbiAgICBsZXQgcGl4ZWxEaXN0YW5jZTtcbiAgICBpZiAocmF5LmNsb3Nlc3RQb2ludE9uU3BoZXJlKGdsb2JlQ2VudGVyLCBnbG9iZVJhZGl1cywgcG9pbnRPbkdsb2JlKSkge1xuICAgICAgICBjb25zdCBwMCA9IHZlYzMuYWRkKFtdLCBwb2ludE9uR2xvYmUsIGdsb2JlQ2VudGVyKTtcbiAgICAgICAgY29uc3QgcDEgPSB2ZWMzLnN1YihbXSwgcDAsIGNhbWVyYVBvc2l0aW9uKTtcbiAgICAgICAgLy8gR2xvYmUgaXMgZnVsbHkgY292ZXJpbmcgdGhlIHZpZXcgZnJ1c3R1bS4gUHJvamVjdCB0aGUgaW50ZXJzZWN0aW9uXG4gICAgICAgIC8vIHBvaW50IHRvIHRoZSBjYW1lcmEgdmlldyB2ZWN0b3IgaW4gb3JkZXIgdG8gZmluZCB0aGUgcGl4ZWwgZGlzdGFuY2VcbiAgICAgICAgcGl4ZWxEaXN0YW5jZSA9IE1hdGguY29zKHRyLmZvdkFib3ZlQ2VudGVyKSAqIHZlYzMubGVuZ3RoKHAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCYWNrZ3JvdW5kIHNwYWNlIGlzIHZpc2libGUuIEZpbmQgZGlzdGFuY2UgdG8gdGhlIHBvaW50IG9mIHRoZVxuICAgICAgICAvLyBnbG9iZSB3aGVyZSBzdXJmYWNlIG5vcm1hbCBpcyBwYXJhbGxlbCB0byB0aGUgdmlldyB2ZWN0b3JcbiAgICAgICAgY29uc3QgcDAgPSB2ZWMzLnN1YihbXSwgY2FtZXJhUG9zaXRpb24sIGdsb2JlQ2VudGVyKTtcbiAgICAgICAgY29uc3QgcDEgPSB2ZWMzLnN1YihbXSwgZ2xvYmVDZW50ZXIsIGNhbWVyYVBvc2l0aW9uKTtcbiAgICAgICAgdmVjMy5ub3JtYWxpemUocDEsIHAxKTtcblxuICAgICAgICBjb25zdCBjYW1lcmFIZWlnaHQgPSB2ZWMzLmxlbmd0aChwMCkgLSBnbG9iZVJhZGl1cztcbiAgICAgICAgcGl4ZWxEaXN0YW5jZSA9IE1hdGguc3FydChjYW1lcmFIZWlnaHQgKiBjYW1lcmFIZWlnaHQgKyAyICogZ2xvYmVSYWRpdXMgKiBjYW1lcmFIZWlnaHQpO1xuICAgICAgICBjb25zdCBhbmdsZSA9IE1hdGguYWNvcyhwaXhlbERpc3RhbmNlIC8gKGdsb2JlUmFkaXVzICsgY2FtZXJhSGVpZ2h0KSkgLSBNYXRoLmFjb3ModmVjMy5kb3QoZm9yd2FyZCwgcDEpKTtcbiAgICAgICAgcGl4ZWxEaXN0YW5jZSAqPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBpeGVsRGlzdGFuY2UgKiAxLjAxO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7bWF0NCwgdmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7QWFiYn0gZnJvbSAnLi4vLi4vdXRpbC9wcmltaXRpdmVzLmpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vLi4vZGF0YS9leHRlbnQuanMnO1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9sbmdfbGF0LmpzJztcbmltcG9ydCB7ZGVnVG9SYWQsIHNtb290aHN0ZXAsIGNsYW1wfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtcbiAgICBNQVhfTUVSQ0FUT1JfTEFUSVRVREUsXG4gICAgbG5nRnJvbU1lcmNhdG9yWCxcbiAgICBsYXRGcm9tTWVyY2F0b3JZLFxuICAgIG1lcmNhdG9yWmZyb21BbHRpdHVkZSxcbiAgICBtZXJjYXRvclhmcm9tTG5nLFxuICAgIG1lcmNhdG9yWWZyb21MYXRcbn0gZnJvbSAnLi4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQge0Nhbm9uaWNhbFRpbGVJRCwgT3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZS5qcyc7XG5pbXBvcnQgSW5kZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvaW5kZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vLi4vcmVuZGVyL3BhaW50ZXIuanMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vLi4vZGF0YS9zZWdtZW50LmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC92ZXJ0ZXhfYnVmZmVyLmpzJztcbmltcG9ydCB7VHJpYW5nbGVJbmRleEFycmF5LCBHbG9iZVZlcnRleEFycmF5LCBMaW5lSW5kZXhBcnJheX0gZnJvbSAnLi4vLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB7bWVtYmVycyBhcyBnbG9iZUxheW91dEF0dHJpYnV0ZXMsIGF0bW9zcGhlcmVMYXlvdXR9IGZyb20gJy4uLy4uL3RlcnJhaW4vZ2xvYmVfYXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgR2xvYmVUaWxlVHJhbnNmb3JtIGZyb20gJy4vZ2xvYmVfdGlsZV90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHtmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lLCBmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblNwaGVyZX0gZnJvbSAnLi9mYXJfei5qcyc7XG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzJztcblxuZXhwb3J0IGNvbnN0IEdMT0JFX1JBRElVUyA9IEVYVEVOVCAvIE1hdGguUEkgLyAyLjA7XG5jb25zdCBHTE9CRV9OT1JNQUxJWkFUSU9OX0JJVF9SQU5HRSA9IDE1O1xuY29uc3QgR0xPQkVfTk9STUFMSVpBVElPTl9NQVNLID0gKDEgPDwgKEdMT0JFX05PUk1BTElaQVRJT05fQklUX1JBTkdFIC0gMSkpIC0gMTtcbmNvbnN0IEdMT0JFX1ZFUlRFWF9HUklEX1NJWkUgPSA2NDtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdnbG9iZScsXG4gICAgcmVxdWlyZXNEcmFwaW5nOiB0cnVlLFxuICAgIHdyYXA6IHRydWUsXG4gICAgc3VwcG9ydHNXb3JsZENvcGllczogZmFsc2UsXG4gICAgc3VwcG9ydHNUZXJyYWluOiB0cnVlLFxuICAgIHN1cHBvcnRzRnJlZUNhbWVyYTogdHJ1ZSxcbiAgICB6QXhpc1VuaXQ6IFwicGl4ZWxzXCIsXG4gICAgY2VudGVyOiBbMCwgMF0sXG4gICAgdW5zdXBwb3J0ZWRMYXllcnM6IFtcbiAgICAgICAgJ2NpcmNsZScsXG4gICAgICAgICdoZWF0bWFwJyxcbiAgICAgICAgJ2ZpbGwtZXh0cnVzaW9uJyxcbiAgICAgICAgJ2RlYnVnJyxcbiAgICAgICAgJ2N1c3RvbSdcbiAgICBdLFxuXG4gICAgcHJvamVjdChsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgeCA9IG1lcmNhdG9yWGZyb21MbmcobG5nKTtcbiAgICAgICAgY29uc3QgeSA9IG1lcmNhdG9yWWZyb21MYXQobGF0KTtcbiAgICAgICAgcmV0dXJuIHt4LCB5LCB6OiAwfTtcbiAgICB9LFxuXG4gICAgdW5wcm9qZWN0KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGxuZyA9IGxuZ0Zyb21NZXJjYXRvclgoeCk7XG4gICAgICAgIGNvbnN0IGxhdCA9IGxhdEZyb21NZXJjYXRvclkoeSk7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KGxuZywgbGF0KTtcbiAgICB9LFxuXG4gICAgcHJvamVjdFRpbGVQb2ludCh4OiBudW1iZXIsIHk6IG51bWJlciwgaWQ6IENhbm9uaWNhbFRpbGVJRCk6IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSB7XG4gICAgICAgIGNvbnN0IHRpbGVzID0gTWF0aC5wb3coMi4wLCBpZC56KTtcbiAgICAgICAgY29uc3QgbXggPSAoeCAvIEVYVEVOVCArIGlkLngpIC8gdGlsZXM7XG4gICAgICAgIGNvbnN0IG15ID0gKHkgLyBFWFRFTlQgKyBpZC55KSAvIHRpbGVzO1xuICAgICAgICBjb25zdCBsYXQgPSBsYXRGcm9tTWVyY2F0b3JZKG15KTtcbiAgICAgICAgY29uc3QgbG5nID0gbG5nRnJvbU1lcmNhdG9yWChteCk7XG4gICAgICAgIGNvbnN0IHBvcyA9IGxhdExuZ1RvRUNFRihsYXQsIGxuZyk7XG5cbiAgICAgICAgY29uc3QgYm91bmRzID0gZ2xvYmVUaWxlQm91bmRzKGlkKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXphdGlvbk1hdHJpeCA9IGdsb2JlTm9ybWFsaXplRUNFRihib3VuZHMpO1xuICAgICAgICB2ZWMzLnRyYW5zZm9ybU1hdDQocG9zLCBwb3MsIG5vcm1hbGl6YXRpb25NYXRyaXgpO1xuXG4gICAgICAgIHJldHVybiB7eDogcG9zWzBdLCB5OiBwb3NbMV0sIHo6IHBvc1syXX07XG4gICAgfSxcblxuICAgIGxvY2F0aW9uUG9pbnQodHI6IFRyYW5zZm9ybSwgbG5nTGF0OiBMbmdMYXQpOiBQb2ludCB7XG4gICAgICAgIGNvbnN0IHBvcyA9IGxhdExuZ1RvRUNFRihsbmdMYXQubGF0LCBsbmdMYXQubG5nKTtcbiAgICAgICAgY29uc3QgdXAgPSB2ZWMzLm5vcm1hbGl6ZShbXSwgcG9zKTtcblxuICAgICAgICBjb25zdCBlbGV2YXRpb24gPSB0ci5lbGV2YXRpb24gP1xuICAgICAgICAgICAgdHIuZWxldmF0aW9uLmdldEF0UG9pbnRPclplcm8odHIubG9jYXRpb25Db29yZGluYXRlKGxuZ0xhdCksIHRyLl9jZW50ZXJBbHRpdHVkZSkgOlxuICAgICAgICAgICAgdHIuX2NlbnRlckFsdGl0dWRlO1xuXG4gICAgICAgIGNvbnN0IHVwU2NhbGUgPSBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgMCkgKiBFWFRFTlQgKiBlbGV2YXRpb247XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQocG9zLCBwb3MsIHVwLCB1cFNjYWxlKTtcbiAgICAgICAgY29uc3QgbWF0cml4ID0gY2FsY3VsYXRlR2xvYmVNYXRyaXgodHIsIHRyLndvcmxkU2l6ZSk7XG4gICAgICAgIG1hdDQubXVsdGlwbHkobWF0cml4LCB0ci5waXhlbE1hdHJpeCwgbWF0cml4KTtcbiAgICAgICAgdmVjMy50cmFuc2Zvcm1NYXQ0KHBvcywgcG9zLCBtYXRyaXgpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQocG9zWzBdLCBwb3NbMV0pO1xuICAgIH0sXG5cbiAgICBwaXhlbHNQZXJNZXRlcihsYXQ6IG51bWJlciwgd29ybGRTaXplOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCAwKSAqIHdvcmxkU2l6ZTtcbiAgICB9LFxuXG4gICAgY3JlYXRlVGlsZVRyYW5zZm9ybSh0cjogVHJhbnNmb3JtLCB3b3JsZFNpemU6IG51bWJlcik6IE9iamVjdCB7XG4gICAgICAgIHJldHVybiBuZXcgR2xvYmVUaWxlVHJhbnNmb3JtKHRyLCB3b3JsZFNpemUpO1xuICAgIH0sXG5cbiAgICBmYXJ0aGVzdFBpeGVsRGlzdGFuY2UodHI6IFRyYW5zZm9ybSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBpeGVsc1Blck1ldGVyID0gdGhpcy5waXhlbHNQZXJNZXRlcih0ci5jZW50ZXIubGF0LCB0ci53b3JsZFNpemUpO1xuICAgICAgICBjb25zdCBnbG9iZVBpeGVsRGlzdGFuY2UgPSBmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblNwaGVyZSh0ciwgcGl4ZWxzUGVyTWV0ZXIpO1xuICAgICAgICBjb25zdCB0ID0gZ2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbih0ci56b29tKTtcbiAgICAgICAgaWYgKHQgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnN0IG1lcmNhdG9yUGl4ZWxzUGVyTWV0ZXIgPSBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgdHIuY2VudGVyLmxhdCkgKiB0ci53b3JsZFNpemU7XG4gICAgICAgICAgICBjb25zdCBtZXJjYXRvclBpeGVsRGlzdGFuY2UgPSBmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lKHRyLCBtZXJjYXRvclBpeGVsc1Blck1ldGVyKTtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnbG9iZVBpeGVsRGlzdGFuY2UsIG1lcmNhdG9yUGl4ZWxEaXN0YW5jZSwgdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JlUGl4ZWxEaXN0YW5jZTtcbiAgICB9XG59O1xuXG5jb25zdCBHTE9CRV9NSU4gPSAtR0xPQkVfUkFESVVTO1xuY29uc3QgR0xPQkVfTUFYID0gR0xPQkVfUkFESVVTO1xuXG5jb25zdCBHTE9CRV9MT1dfWk9PTV9USUxFX0FBQkJTID0gW1xuICAgIC8vIHogPT0gMFxuICAgIG5ldyBBYWJiKFtHTE9CRV9NSU4sIEdMT0JFX01JTiwgR0xPQkVfTUlOXSwgW0dMT0JFX01BWCwgR0xPQkVfTUFYLCBHTE9CRV9NQVhdKSxcbiAgICAvLyB6ID09IDFcbiAgICBuZXcgQWFiYihbR0xPQkVfTUlOLCBHTE9CRV9NSU4sIEdMT0JFX01JTl0sIFswLCAwLCBHTE9CRV9NQVhdKSwgLy8geD0wLCB5PTBcbiAgICBuZXcgQWFiYihbMCwgR0xPQkVfTUlOLCBHTE9CRV9NSU5dLCBbR0xPQkVfTUFYLCAwLCBHTE9CRV9NQVhdKSwgLy8geD0xLCB5PTBcbiAgICBuZXcgQWFiYihbR0xPQkVfTUlOLCAwLCBHTE9CRV9NSU5dLCBbMCwgR0xPQkVfTUFYLCBHTE9CRV9NQVhdKSwgLy8geD0wLCB5PTFcbiAgICBuZXcgQWFiYihbMCwgMCwgR0xPQkVfTUlOXSwgW0dMT0JFX01BWCwgR0xPQkVfTUFYLCBHTE9CRV9NQVhdKSAgLy8geD0xLCB5PTFcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBnbG9iZVRpbGVCb3VuZHMoaWQ6IENhbm9uaWNhbFRpbGVJRCk6IEFhYmIge1xuICAgIGlmIChpZC56IDw9IDEpIHtcbiAgICAgICAgcmV0dXJuIEdMT0JFX0xPV19aT09NX1RJTEVfQUFCQlNbaWQueiArIGlkLnkgKiAyICsgaWQueF07XG4gICAgfVxuXG4gICAgLy8gQWZ0ZXIgem9vbSAxIHN1cmZhY2UgZnVuY3Rpb24gaXMgbW9ub3RvbmljIGZvciBhbGwgdGlsZSBwYXRjaGVzXG4gICAgLy8gPT4gaXQgaXMgZW5vdWdoIHRvIHByb2plY3QgY29ybmVyIHBvaW50c1xuICAgIGNvbnN0IFttaW4sIG1heF0gPSBnbG9iZVRpbGVMYXRMbmdDb3JuZXJzKGlkKTtcblxuICAgIGNvbnN0IGNvcm5lcnMgPSBbXG4gICAgICAgIGxhdExuZ1RvRUNFRihtaW5bMF0sIG1pblsxXSksXG4gICAgICAgIGxhdExuZ1RvRUNFRihtaW5bMF0sIG1heFsxXSksXG4gICAgICAgIGxhdExuZ1RvRUNFRihtYXhbMF0sIG1pblsxXSksXG4gICAgICAgIGxhdExuZ1RvRUNFRihtYXhbMF0sIG1heFsxXSlcbiAgICBdO1xuXG4gICAgY29uc3QgYk1pbiA9IFtHTE9CRV9NQVgsIEdMT0JFX01BWCwgR0xPQkVfTUFYXTtcbiAgICBjb25zdCBiTWF4ID0gW0dMT0JFX01JTiwgR0xPQkVfTUlOLCBHTE9CRV9NSU5dO1xuXG4gICAgZm9yIChjb25zdCBwIG9mIGNvcm5lcnMpIHtcbiAgICAgICAgYk1pblswXSA9IE1hdGgubWluKGJNaW5bMF0sIHBbMF0pO1xuICAgICAgICBiTWluWzFdID0gTWF0aC5taW4oYk1pblsxXSwgcFsxXSk7XG4gICAgICAgIGJNaW5bMl0gPSBNYXRoLm1pbihiTWluWzJdLCBwWzJdKTtcblxuICAgICAgICBiTWF4WzBdID0gTWF0aC5tYXgoYk1heFswXSwgcFswXSk7XG4gICAgICAgIGJNYXhbMV0gPSBNYXRoLm1heChiTWF4WzFdLCBwWzFdKTtcbiAgICAgICAgYk1heFsyXSA9IE1hdGgubWF4KGJNYXhbMl0sIHBbMl0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQWFiYihiTWluLCBiTWF4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JlVGlsZUxhdExuZ0Nvcm5lcnMoaWQ6IENhbm9uaWNhbFRpbGVJRCkge1xuICAgIGNvbnN0IHRpbGVTY2FsZSA9IE1hdGgucG93KDIsIGlkLnopO1xuICAgIGNvbnN0IGxlZnQgPSBpZC54IC8gdGlsZVNjYWxlO1xuICAgIGNvbnN0IHJpZ2h0ID0gKGlkLnggKyAxKSAvIHRpbGVTY2FsZTtcbiAgICBjb25zdCB0b3AgPSBpZC55IC8gdGlsZVNjYWxlO1xuICAgIGNvbnN0IGJvdHRvbSA9IChpZC55ICsgMSkgLyB0aWxlU2NhbGU7XG5cbiAgICBjb25zdCBsYXRMbmdUTCA9IFsgbGF0RnJvbU1lcmNhdG9yWSh0b3ApLCBsbmdGcm9tTWVyY2F0b3JYKGxlZnQpIF07XG4gICAgY29uc3QgbGF0TG5nQlIgPSBbIGxhdEZyb21NZXJjYXRvclkoYm90dG9tKSwgbG5nRnJvbU1lcmNhdG9yWChyaWdodCkgXTtcblxuICAgIHJldHVybiBbbGF0TG5nVEwsIGxhdExuZ0JSXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNzTGF0TG5nVG9FQ0VGKGNvc0xhdDogbnVtYmVyLCBzaW5MYXQ6IG51bWJlciwgbG5nOiBudW1iZXIsIHJhZGl1czogP251bWJlcik6IEFycmF5PG51bWJlcj4ge1xuICAgIGxuZyA9IGRlZ1RvUmFkKGxuZyk7XG5cbiAgICBpZiAoIXJhZGl1cykge1xuICAgICAgICByYWRpdXMgPSBHTE9CRV9SQURJVVM7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBsYXQgJiBsbmcgdG8gc3BoZXJpY2FsIHJlcHJlc2VudGF0aW9uLiBVc2Ugem9vbT0wIGFzIGEgcmVmZXJlbmNlXG4gICAgY29uc3Qgc3ggPSBjb3NMYXQgKiBNYXRoLnNpbihsbmcpICogcmFkaXVzO1xuICAgIGNvbnN0IHN5ID0gLXNpbkxhdCAqIHJhZGl1cztcbiAgICBjb25zdCBzeiA9IGNvc0xhdCAqIE1hdGguY29zKGxuZykgKiByYWRpdXM7XG5cbiAgICByZXR1cm4gW3N4LCBzeSwgc3pdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGF0TG5nVG9FQ0VGKGxhdDogbnVtYmVyLCBsbmc6IG51bWJlciwgcmFkaXVzOiA/bnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGNzTGF0TG5nVG9FQ0VGKE1hdGguY29zKGRlZ1RvUmFkKGxhdCkpLCBNYXRoLnNpbihkZWdUb1JhZChsYXQpKSwgbG5nLCByYWRpdXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2xvYmVFQ0VGTm9ybWFsaXphdGlvblNjYWxlKGJvdW5kczogQWFiYikge1xuICAgIGNvbnN0IG1heEV4dCA9IE1hdGgubWF4KC4uLnZlYzMuc3ViKFtdLCBib3VuZHMubWF4LCBib3VuZHMubWluKSk7XG4gICAgcmV0dXJuIEdMT0JFX05PUk1BTElaQVRJT05fTUFTSyAvIG1heEV4dDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JlTm9ybWFsaXplRUNFRihib3VuZHM6IEFhYmIpOiBGbG9hdDY0QXJyYXkge1xuICAgIGNvbnN0IG0gPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDY0QXJyYXkoMTYpKTtcbiAgICBjb25zdCBzY2FsZSA9IGdsb2JlRUNFRk5vcm1hbGl6YXRpb25TY2FsZShib3VuZHMpO1xuICAgIG1hdDQuc2NhbGUobSwgbSwgW3NjYWxlLCBzY2FsZSwgc2NhbGVdKTtcbiAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCB2ZWMzLm5lZ2F0ZShbXSwgYm91bmRzLm1pbikpO1xuICAgIHJldHVybiBtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2xvYmVEZW5vcm1hbGl6ZUVDRUYoYm91bmRzOiBBYWJiKTogRmxvYXQ2NEFycmF5IHtcbiAgICBjb25zdCBtID0gbWF0NC5pZGVudGl0eShuZXcgRmxvYXQ2NEFycmF5KDE2KSk7XG4gICAgY29uc3Qgc2NhbGUgPSAxLjAgLyBnbG9iZUVDRUZOb3JtYWxpemF0aW9uU2NhbGUoYm91bmRzKTtcbiAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBib3VuZHMubWluKTtcbiAgICBtYXQ0LnNjYWxlKG0sIG0sIFtzY2FsZSwgc2NhbGUsIHNjYWxlXSk7XG4gICAgcmV0dXJuIG07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnbG9iZUVDRUZVbml0c1RvUGl4ZWxTY2FsZSh3b3JsZFNpemU6IG51bWJlcikge1xuICAgIGNvbnN0IGxvY2FsUmFkaXVzID0gRVhURU5UIC8gKDIuMCAqIE1hdGguUEkpO1xuICAgIGNvbnN0IHdzUmFkaXVzID0gd29ybGRTaXplIC8gKDIuMCAqIE1hdGguUEkpO1xuICAgIHJldHVybiB3c1JhZGl1cyAvIGxvY2FsUmFkaXVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlR2xvYmVNYXRyaXgodHI6IFRyYW5zZm9ybSwgd29ybGRTaXplOiBudW1iZXIsIG9mZnNldD86IFtudW1iZXIsIG51bWJlcl0pOiBtYXQ0IHtcbiAgICBjb25zdCB3c1JhZGl1cyA9IHdvcmxkU2l6ZSAvICgyLjAgKiBNYXRoLlBJKTtcbiAgICBjb25zdCBzY2FsZSA9IGdsb2JlRUNFRlVuaXRzVG9QaXhlbFNjYWxlKHdvcmxkU2l6ZSk7XG5cbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgICBjb25zdCBsYXQgPSBjbGFtcCh0ci5jZW50ZXIubGF0LCAtTUFYX01FUkNBVE9SX0xBVElUVURFLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREUpO1xuICAgICAgICBjb25zdCBsbmcgPSB0ci5jZW50ZXIubG5nO1xuXG4gICAgICAgIG9mZnNldCA9IFtcbiAgICAgICAgICAgIG1lcmNhdG9yWGZyb21MbmcobG5nKSAqIHdvcmxkU2l6ZSxcbiAgICAgICAgICAgIG1lcmNhdG9yWWZyb21MYXQobGF0KSAqIHdvcmxkU2l6ZVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8vIHRyYW5zZm9ybSB0aGUgZ2xvYmUgZnJvbSByZWZlcmVuY2UgY29vcmRpbmF0ZSBzcGFjZSB0byB3b3JsZCBzcGFjZVxuICAgIGNvbnN0IHBvc01hdHJpeCA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO1xuICAgIG1hdDQudHJhbnNsYXRlKHBvc01hdHJpeCwgcG9zTWF0cml4LCBbb2Zmc2V0WzBdLCBvZmZzZXRbMV0sIC13c1JhZGl1c10pO1xuICAgIG1hdDQuc2NhbGUocG9zTWF0cml4LCBwb3NNYXRyaXgsIFtzY2FsZSwgc2NhbGUsIHNjYWxlXSk7XG4gICAgbWF0NC5yb3RhdGVYKHBvc01hdHJpeCwgcG9zTWF0cml4LCBkZWdUb1JhZCgtdHIuX2NlbnRlci5sYXQpKTtcbiAgICBtYXQ0LnJvdGF0ZVkocG9zTWF0cml4LCBwb3NNYXRyaXgsIGRlZ1RvUmFkKC10ci5fY2VudGVyLmxuZykpO1xuXG4gICAgcmV0dXJuIHBvc01hdHJpeDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUdsb2JlTWVyY2F0b3JNYXRyaXgodHI6IFRyYW5zZm9ybSk6IG1hdDQge1xuICAgIGNvbnN0IHdvcmxkU2l6ZSA9IHRyLndvcmxkU2l6ZTtcbiAgICBjb25zdCBsYXQgPSBjbGFtcCh0ci5jZW50ZXIubGF0LCAtTUFYX01FUkNBVE9SX0xBVElUVURFLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREUpO1xuICAgIGNvbnN0IHBvaW50ID0gbmV3IFBvaW50KFxuICAgICAgICBtZXJjYXRvclhmcm9tTG5nKHRyLmNlbnRlci5sbmcpICogd29ybGRTaXplLFxuICAgICAgICBtZXJjYXRvcllmcm9tTGF0KGxhdCkgKiB3b3JsZFNpemUpO1xuXG4gICAgY29uc3QgbWVyY2F0b3JaID0gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIHRyLmNlbnRlci5sYXQpICogd29ybGRTaXplO1xuICAgIGNvbnN0IHByb2plY3Rpb25TY2FsZXIgPSBtZXJjYXRvclogLyB0ci5waXhlbHNQZXJNZXRlcjtcbiAgICBjb25zdCB6U2NhbGUgPSB0ci5waXhlbHNQZXJNZXRlcjtcbiAgICBjb25zdCB3cyA9IHdvcmxkU2l6ZSAvIHByb2plY3Rpb25TY2FsZXI7XG5cbiAgICBjb25zdCBwb3NNYXRyaXggPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDY0QXJyYXkoMTYpKTtcbiAgICBtYXQ0LnRyYW5zbGF0ZShwb3NNYXRyaXgsIHBvc01hdHJpeCwgW3BvaW50LngsIHBvaW50LnksIDAuMF0pO1xuICAgIG1hdDQuc2NhbGUocG9zTWF0cml4LCBwb3NNYXRyaXgsIFt3cywgd3MsIHpTY2FsZV0pO1xuXG4gICAgcmV0dXJuIHBvc01hdHJpeDtcbn1cblxuZXhwb3J0IGNvbnN0IEdMT0JFX1pPT01fVEhSRVNIT0xEX01JTiA9IDU7XG5leHBvcnQgY29uc3QgR0xPQkVfWk9PTV9USFJFU0hPTERfTUFYID0gNjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JlVG9NZXJjYXRvclRyYW5zaXRpb24oem9vbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gc21vb3Roc3RlcChHTE9CRV9aT09NX1RIUkVTSE9MRF9NSU4sIEdMT0JFX1pPT01fVEhSRVNIT0xEX01BWCwgem9vbSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnbG9iZUJ1ZmZlcnNGb3JUaWxlTWVzaChwYWludGVyOiBQYWludGVyLCB0aWxlOiBUaWxlLCBjb29yZDogT3ZlcnNjYWxlZFRpbGVJRCwgdGlsZXM6IG51bWJlcik6IFtWZXJ0ZXhCdWZmZXIsIFZlcnRleEJ1ZmZlcl0ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgaWQgPSBjb29yZC5jYW5vbmljYWw7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBsZXQgZ3JpZEJ1ZmZlciA9IHRpbGUuZ2xvYmVHcmlkQnVmZmVyO1xuICAgIGxldCBwb2xlQnVmZmVyID0gdGlsZS5nbG9iZVBvbGVCdWZmZXI7XG5cbiAgICBpZiAoIWdyaWRCdWZmZXIpIHtcbiAgICAgICAgY29uc3QgZ3JpZE1lc2ggPSBHbG9iZVNoYXJlZEJ1ZmZlcnMuY3JlYXRlR3JpZFZlcnRpY2VzKGlkKTtcbiAgICAgICAgZ3JpZEJ1ZmZlciA9IHRpbGUuZ2xvYmVHcmlkQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIoZ3JpZE1lc2gsIGdsb2JlTGF5b3V0QXR0cmlidXRlcywgZmFsc2UpO1xuICAgIH1cblxuICAgIGlmICghcG9sZUJ1ZmZlcikge1xuICAgICAgICBjb25zdCBwb2xlTWVzaCA9IEdsb2JlU2hhcmVkQnVmZmVycy5jcmVhdGVQb2xlVHJpYW5nbGVWZXJ0aWNlcyh0aWxlcywgdHIudGlsZVNpemUgKiB0aWxlcywgY29vcmQuY2Fub25pY2FsLnkgPT09IDApO1xuICAgICAgICBwb2xlQnVmZmVyID0gdGlsZS5nbG9iZVBvbGVCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihwb2xlTWVzaCwgZ2xvYmVMYXlvdXRBdHRyaWJ1dGVzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtncmlkQnVmZmVyLCBwb2xlQnVmZmVyXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JlTWF0cml4Rm9yVGlsZShpZDogQ2Fub25pY2FsVGlsZUlELCBnbG9iZU1hdHJpeDogbWF0NCkge1xuICAgIGNvbnN0IGRlY29kZSA9IGdsb2JlRGVub3JtYWxpemVFQ0VGKGdsb2JlVGlsZUJvdW5kcyhpZCkpO1xuICAgIGNvbnN0IHBvc01hdHJpeCA9IG1hdDQuY29weShuZXcgRmxvYXQ2NEFycmF5KDE2KSwgZ2xvYmVNYXRyaXgpO1xuICAgIG1hdDQubXVsKHBvc01hdHJpeCwgcG9zTWF0cml4LCBkZWNvZGUpO1xuICAgIHJldHVybiBwb3NNYXRyaXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnbG9iZVBvbGVNYXRyaXhGb3JUaWxlKGlkOiBDYW5vbmljYWxUaWxlSUQsIHNvdXRoOiBib29sZWFuLCB0cjogVHJhbnNmb3JtKSB7XG4gICAgY29uc3QgcG9sZU1hdHJpeCA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO1xuXG4gICAgY29uc3QgdGlsZURpbSA9IE1hdGgucG93KDIsIGlkLnopO1xuICAgIGNvbnN0IHhPZmZzZXQgPSBpZC54IC0gdGlsZURpbSAvIDI7XG4gICAgY29uc3QgeVJvdGF0aW9uID0geE9mZnNldCAvIHRpbGVEaW0gKiBNYXRoLlBJICogMi4wO1xuXG4gICAgY29uc3QgcG9pbnQgPSB0ci5wb2ludDtcbiAgICBjb25zdCB3cyA9IHRyLndvcmxkU2l6ZTtcbiAgICBjb25zdCBzID0gdHIud29ybGRTaXplIC8gKHRyLnRpbGVTaXplICogdGlsZURpbSk7XG5cbiAgICBtYXQ0LnRyYW5zbGF0ZShwb2xlTWF0cml4LCBwb2xlTWF0cml4LCBbcG9pbnQueCwgcG9pbnQueSwgLSh3cyAvIE1hdGguUEkgLyAyLjApXSk7XG4gICAgbWF0NC5zY2FsZShwb2xlTWF0cml4LCBwb2xlTWF0cml4LCBbcywgcywgc10pO1xuICAgIG1hdDQucm90YXRlWChwb2xlTWF0cml4LCBwb2xlTWF0cml4LCBkZWdUb1JhZCgtdHIuX2NlbnRlci5sYXQpKTtcbiAgICBtYXQ0LnJvdGF0ZVkocG9sZU1hdHJpeCwgcG9sZU1hdHJpeCwgZGVnVG9SYWQoLXRyLl9jZW50ZXIubG5nKSk7XG4gICAgbWF0NC5yb3RhdGVZKHBvbGVNYXRyaXgsIHBvbGVNYXRyaXgsIHlSb3RhdGlvbik7XG4gICAgaWYgKHNvdXRoKSB7XG4gICAgICAgIG1hdDQuc2NhbGUocG9sZU1hdHJpeCwgcG9sZU1hdHJpeCwgWzEsIC0xLCAxXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvbGVNYXRyaXg7XG59XG5cbmV4cG9ydCBjbGFzcyBHbG9iZVNoYXJlZEJ1ZmZlcnMge1xuICAgIHBvbGVJbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgcG9sZVNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuXG4gICAgZ3JpZEluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcbiAgICBncmlkU2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG5cbiAgICBhdG1vc3BoZXJlVmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgYXRtb3NwaGVyZUluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcbiAgICBhdG1vc3BoZXJlU2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG5cbiAgICB3aXJlZnJhbWVJbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgd2lyZWZyYW1lU2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGdyaWRJbmRpY2VzID0gdGhpcy5fY3JlYXRlR3JpZEluZGljZXMoKTtcbiAgICAgICAgdGhpcy5ncmlkSW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKGdyaWRJbmRpY2VzLCB0cnVlKTtcblxuICAgICAgICBjb25zdCBncmlkUHJpbWl0aXZlcyA9IEdMT0JFX1ZFUlRFWF9HUklEX1NJWkUgKiBHTE9CRV9WRVJURVhfR1JJRF9TSVpFICogMjtcbiAgICAgICAgY29uc3QgZ3JpZFZlcnRpY2VzID0gKEdMT0JFX1ZFUlRFWF9HUklEX1NJWkUgKyAxKSAqIChHTE9CRV9WRVJURVhfR1JJRF9TSVpFICsgMSk7XG4gICAgICAgIHRoaXMuZ3JpZFNlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIGdyaWRWZXJ0aWNlcywgZ3JpZFByaW1pdGl2ZXMpO1xuXG4gICAgICAgIGNvbnN0IHBvbGVJbmRpY2VzID0gdGhpcy5fY3JlYXRlUG9sZVRyaWFuZ2xlSW5kaWNlcygpO1xuICAgICAgICB0aGlzLnBvbGVJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIocG9sZUluZGljZXMsIHRydWUpO1xuXG4gICAgICAgIGNvbnN0IHBvbGVQcmltaXRpdmVzID0gR0xPQkVfVkVSVEVYX0dSSURfU0laRTtcbiAgICAgICAgY29uc3QgcG9sZVZlcnRpY2VzID0gR0xPQkVfVkVSVEVYX0dSSURfU0laRSArIDI7XG4gICAgICAgIHRoaXMucG9sZVNlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIHBvbGVWZXJ0aWNlcywgcG9sZVByaW1pdGl2ZXMpO1xuXG4gICAgICAgIGNvbnN0IGF0bW9zcGhlcmVWZXJ0aWNlcyA9IG5ldyBHbG9iZVZlcnRleEFycmF5KCk7XG4gICAgICAgIGF0bW9zcGhlcmVWZXJ0aWNlcy5lbXBsYWNlQmFjaygtMS4wLCAxLjAsIDEuMCwgMC4wLCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgYXRtb3NwaGVyZVZlcnRpY2VzLmVtcGxhY2VCYWNrKDEuMCwgMS4wLCAxLjAsIDAuMCwgMC4wLCAxLjAsIDAuMCk7XG4gICAgICAgIGF0bW9zcGhlcmVWZXJ0aWNlcy5lbXBsYWNlQmFjaygxLjAsIC0xLjAsIDEuMCwgMC4wLCAwLjAsIDEuMCwgMS4wKTtcbiAgICAgICAgYXRtb3NwaGVyZVZlcnRpY2VzLmVtcGxhY2VCYWNrKC0xLjAsIC0xLjAsIDEuMCwgMC4wLCAwLjAsIDAuMCwgMS4wKTtcblxuICAgICAgICBjb25zdCBhdG1vc3BoZXJlVHJpYW5nbGVzID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICBhdG1vc3BoZXJlVHJpYW5nbGVzLmVtcGxhY2VCYWNrKDAsIDEsIDIpO1xuICAgICAgICBhdG1vc3BoZXJlVHJpYW5nbGVzLmVtcGxhY2VCYWNrKDIsIDMsIDApO1xuXG4gICAgICAgIHRoaXMuYXRtb3NwaGVyZVZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKGF0bW9zcGhlcmVWZXJ0aWNlcywgYXRtb3NwaGVyZUxheW91dC5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy5hdG1vc3BoZXJlSW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKGF0bW9zcGhlcmVUcmlhbmdsZXMpO1xuICAgICAgICB0aGlzLmF0bW9zcGhlcmVTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnBvbGVJbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZ3JpZEluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5wb2xlU2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmdyaWRTZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuYXRtb3NwaGVyZVZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuYXRtb3NwaGVyZUluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5hdG1vc3BoZXJlU2VnbWVudHMuZGVzdHJveSgpO1xuXG4gICAgICAgIGlmICh0aGlzLndpcmVmcmFtZUluZGV4QnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLndpcmVmcmFtZUluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMud2lyZWZyYW1lU2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZVBvbGVUcmlhbmdsZVZlcnRpY2VzKHRpbGVzOiBudW1iZXIsIHdzOiBudW1iZXIsIGlzVG9wQ2FwOiBib29sZWFuKTogR2xvYmVWZXJ0ZXhBcnJheSB7XG4gICAgICAgIGNvbnN0IGxlcnAgPSAoYSwgYiwgdCkgPT4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgICAgICAgY29uc3QgYXJyID0gbmV3IEdsb2JlVmVydGV4QXJyYXkoKTtcbiAgICAgICAgY29uc3QgcmFkaXVzID0gd3MgLyBNYXRoLlBJIC8gMi4wO1xuXG4gICAgICAgIC8vIFBsYWNlIHRoZSB0aXBcbiAgICAgICAgYXJyLmVtcGxhY2VCYWNrKDAsIC1yYWRpdXMsIDAsIDAsIDAsIDAuNSwgaXNUb3BDYXAgPyAwLjAgOiAxLjApO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0QW5nbGUgPSAwO1xuICAgICAgICBjb25zdCBlbmRBbmdsZSA9IDM2MC4wIC8gdGlsZXM7XG4gICAgICAgIGNvbnN0IGNvc0xhdCA9IE1hdGguY29zKGRlZ1RvUmFkKDg1LjApKTtcbiAgICAgICAgY29uc3Qgc2luTGF0ID0gTWF0aC5zaW4oZGVnVG9SYWQoODUuMCkpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IEdMT0JFX1ZFUlRFWF9HUklEX1NJWkU7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdXZYID0gaSAvIEdMT0JFX1ZFUlRFWF9HUklEX1NJWkU7XG4gICAgICAgICAgICBjb25zdCBhbmdsZSA9IGxlcnAoc3RhcnRBbmdsZSwgZW5kQW5nbGUsIHV2WCk7XG4gICAgICAgICAgICBjb25zdCBwID0gY3NMYXRMbmdUb0VDRUYoY29zTGF0LCBzaW5MYXQsIGFuZ2xlLCByYWRpdXMpO1xuXG4gICAgICAgICAgICBhcnIuZW1wbGFjZUJhY2socFswXSwgcFsxXSwgcFsyXSwgMCwgMCwgdXZYLCBpc1RvcENhcCA/IDAuMCA6IDEuMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIF9jcmVhdGVQb2xlVHJpYW5nbGVJbmRpY2VzKCk6IFRyaWFuZ2xlSW5kZXhBcnJheSB7XG4gICAgICAgIGNvbnN0IGFyciA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gR0xPQkVfVkVSVEVYX0dSSURfU0laRTsgaSsrKSB7XG4gICAgICAgICAgICBhcnIuZW1wbGFjZUJhY2soMCwgaSArIDEsIGkgKyAyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVHcmlkVmVydGljZXMoaWQ6IENhbm9uaWNhbFRpbGVJRCk6IEdsb2JlVmVydGV4QXJyYXkge1xuICAgICAgICBjb25zdCB0aWxlcyA9IE1hdGgucG93KDIsIGlkLnopO1xuICAgICAgICBjb25zdCBsZXJwID0gKGEsIGIsIHQpID0+IGEgKiAoMSAtIHQpICsgYiAqIHQ7XG4gICAgICAgIGNvbnN0IFtsYXRMbmdUTCwgbGF0TG5nQlJdID0gZ2xvYmVUaWxlTGF0TG5nQ29ybmVycyhpZCk7XG4gICAgICAgIGNvbnN0IGJvdW5kc0FycmF5ID0gbmV3IEdsb2JlVmVydGV4QXJyYXkoKTtcblxuICAgICAgICBjb25zdCBub3JtID0gZ2xvYmVOb3JtYWxpemVFQ0VGKGdsb2JlVGlsZUJvdW5kcyhpZCkpO1xuXG4gICAgICAgIGNvbnN0IHZlcnRleEV4dCA9IEdMT0JFX1ZFUlRFWF9HUklEX1NJWkUgKyAxO1xuICAgICAgICBib3VuZHNBcnJheS5yZXNlcnZlKEdMT0JFX1ZFUlRFWF9HUklEX1NJWkUgKiBHTE9CRV9WRVJURVhfR1JJRF9TSVpFKTtcblxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHZlcnRleEV4dDsgeSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsYXQgPSBsZXJwKGxhdExuZ1RMWzBdLCBsYXRMbmdCUlswXSwgeSAvIEdMT0JFX1ZFUlRFWF9HUklEX1NJWkUpO1xuICAgICAgICAgICAgY29uc3QgbWVyY2F0b3JZID0gbWVyY2F0b3JZZnJvbUxhdChsYXQpO1xuICAgICAgICAgICAgY29uc3QgdXZZID0gKG1lcmNhdG9yWSAqIHRpbGVzKSAtIGlkLnk7XG4gICAgICAgICAgICBjb25zdCBzaW5MYXQgPSBNYXRoLnNpbihkZWdUb1JhZChsYXQpKTtcbiAgICAgICAgICAgIGNvbnN0IGNvc0xhdCA9IE1hdGguY29zKGRlZ1RvUmFkKGxhdCkpO1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB2ZXJ0ZXhFeHQ7IHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHV2WCA9IHggLyBHTE9CRV9WRVJURVhfR1JJRF9TSVpFO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxuZyA9IGxlcnAobGF0TG5nVExbMV0sIGxhdExuZ0JSWzFdLCB1dlgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcEdsb2JlID0gY3NMYXRMbmdUb0VDRUYoY29zTGF0LCBzaW5MYXQsIGxuZyk7XG4gICAgICAgICAgICAgICAgdmVjMy50cmFuc2Zvcm1NYXQ0KHBHbG9iZSwgcEdsb2JlLCBub3JtKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1lcmNhdG9yWCA9IG1lcmNhdG9yWGZyb21MbmcobG5nKTtcblxuICAgICAgICAgICAgICAgIGJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHBHbG9iZVswXSwgcEdsb2JlWzFdLCBwR2xvYmVbMl0sIG1lcmNhdG9yWCwgbWVyY2F0b3JZLCB1dlgsIHV2WSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYm91bmRzQXJyYXk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUdyaWRJbmRpY2VzKCk6IFRyaWFuZ2xlSW5kZXhBcnJheSB7XG4gICAgICAgIGNvbnN0IGluZGV4QXJyYXkgPSBuZXcgVHJpYW5nbGVJbmRleEFycmF5KCk7XG4gICAgICAgIGNvbnN0IHF1YWRFeHQgPSBHTE9CRV9WRVJURVhfR1JJRF9TSVpFO1xuICAgICAgICBjb25zdCB2ZXJ0ZXhFeHQgPSBxdWFkRXh0ICsgMTtcbiAgICAgICAgY29uc3QgcXVhZCA9IChpLCBqKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGogKiB2ZXJ0ZXhFeHQgKyBpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDEsIGluZGV4LCBpbmRleCArIHZlcnRleEV4dCk7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgdmVydGV4RXh0LCBpbmRleCArIHZlcnRleEV4dCArIDEsIGluZGV4ICsgMSk7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcXVhZEV4dDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YWRFeHQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHF1YWQoaSwgaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGV4QXJyYXk7XG4gICAgfVxuXG4gICAgZ2V0V2lyZWZhbWVCdWZmZXIoY29udGV4dDogQ29udGV4dCk6IFtJbmRleEJ1ZmZlciwgU2VnbWVudFZlY3Rvcl0ge1xuICAgICAgICBpZiAoIXRoaXMud2lyZWZyYW1lU2VnbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpcmVmcmFtZUdyaWRJbmRpY2VzID0gdGhpcy5fY3JlYXRlV2lyZWZyYW1lR3JpZCgpO1xuICAgICAgICAgICAgdGhpcy53aXJlZnJhbWVJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIod2lyZWZyYW1lR3JpZEluZGljZXMpO1xuXG4gICAgICAgICAgICBjb25zdCB2ZXJ0ZXhCdWZmZXJMZW5ndGggPSBHTE9CRV9WRVJURVhfR1JJRF9TSVpFICogR0xPQkVfVkVSVEVYX0dSSURfU0laRTtcbiAgICAgICAgICAgIHRoaXMud2lyZWZyYW1lU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgdmVydGV4QnVmZmVyTGVuZ3RoLCB3aXJlZnJhbWVHcmlkSW5kaWNlcy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdGhpcy53aXJlZnJhbWVJbmRleEJ1ZmZlciwgdGhpcy53aXJlZnJhbWVTZWdtZW50c107XG4gICAgfVxuXG4gICAgX2NyZWF0ZVdpcmVmcmFtZUdyaWQoKTogTGluZUluZGV4QXJyYXkge1xuICAgICAgICBjb25zdCBpbmRleEFycmF5ID0gbmV3IExpbmVJbmRleEFycmF5KCk7XG5cbiAgICAgICAgY29uc3QgcXVhZEV4dCA9IEdMT0JFX1ZFUlRFWF9HUklEX1NJWkU7XG4gICAgICAgIGNvbnN0IHZlcnRleEV4dCA9IHF1YWRFeHQgKyAxO1xuXG4gICAgICAgIGNvbnN0IHF1YWQgPSAoaSwgaikgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBqICogdmVydGV4RXh0ICsgaTtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMSk7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIHZlcnRleEV4dCk7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIHZlcnRleEV4dCArIDEpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcXVhZEV4dDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YWRFeHQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHF1YWQoaSwgaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5kZXhBcnJheTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge2FsdGl0dWRlRnJvbU1lcmNhdG9yWiwgbG5nRnJvbU1lcmNhdG9yWCwgbGF0RnJvbU1lcmNhdG9yWX0gZnJvbSAnLi4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uLy4uL2RhdGEvZXh0ZW50LmpzJztcbmltcG9ydCB7dmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB0eXBlIHtQcm9qZWN0aW9ufSBmcm9tICcuL2luZGV4LmpzJztcbmltcG9ydCB7QWFiYn0gZnJvbSAnLi4vLi4vdXRpbC9wcmltaXRpdmVzLmpzJztcbmltcG9ydCB7Z2xvYmVUaWxlQm91bmRzLCBjYWxjdWxhdGVHbG9iZU1hdHJpeH0gZnJvbSAnLi9nbG9iZS5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB7VW53cmFwcGVkVGlsZUlELCBDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuZXhwb3J0IHR5cGUgVGlsZVRyYW5zZm9ybSA9IHtcbiAgICBzY2FsZTogbnVtYmVyLFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgeDI6IG51bWJlcixcbiAgICB5MjogbnVtYmVyLFxuICAgIHByb2plY3Rpb246IFByb2plY3Rpb25cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRpbGVUcmFuc2Zvcm0oaWQ6IE9iamVjdCwgcHJvamVjdGlvbjogUHJvamVjdGlvbikge1xuICAgIGlmICghcHJvamVjdGlvbi5pc1JlcHJvamVjdGVkSW5UaWxlU3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIHtzY2FsZTogMSA8PCBpZC56LCB4OiBpZC54LCB5OiBpZC55LCB4MjogaWQueCArIDEsIHkyOiBpZC55ICsgMSwgcHJvamVjdGlvbn07XG4gICAgfVxuXG4gICAgY29uc3QgcyA9IE1hdGgucG93KDIsIC1pZC56KTtcblxuICAgIGNvbnN0IHgxID0gKGlkLngpICogcztcbiAgICBjb25zdCB4MiA9IChpZC54ICsgMSkgKiBzO1xuICAgIGNvbnN0IHkxID0gKGlkLnkpICogcztcbiAgICBjb25zdCB5MiA9IChpZC55ICsgMSkgKiBzO1xuXG4gICAgY29uc3QgbG5nMSA9IGxuZ0Zyb21NZXJjYXRvclgoeDEpO1xuICAgIGNvbnN0IGxuZzIgPSBsbmdGcm9tTWVyY2F0b3JYKHgyKTtcbiAgICBjb25zdCBsYXQxID0gbGF0RnJvbU1lcmNhdG9yWSh5MSk7XG4gICAgY29uc3QgbGF0MiA9IGxhdEZyb21NZXJjYXRvclkoeTIpO1xuXG4gICAgY29uc3QgcDAgPSBwcm9qZWN0aW9uLnByb2plY3QobG5nMSwgbGF0MSk7XG4gICAgY29uc3QgcDEgPSBwcm9qZWN0aW9uLnByb2plY3QobG5nMiwgbGF0MSk7XG4gICAgY29uc3QgcDIgPSBwcm9qZWN0aW9uLnByb2plY3QobG5nMiwgbGF0Mik7XG4gICAgY29uc3QgcDMgPSBwcm9qZWN0aW9uLnByb2plY3QobG5nMSwgbGF0Mik7XG5cbiAgICBsZXQgbWluWCA9IE1hdGgubWluKHAwLngsIHAxLngsIHAyLngsIHAzLngpO1xuICAgIGxldCBtaW5ZID0gTWF0aC5taW4ocDAueSwgcDEueSwgcDIueSwgcDMueSk7XG4gICAgbGV0IG1heFggPSBNYXRoLm1heChwMC54LCBwMS54LCBwMi54LCBwMy54KTtcbiAgICBsZXQgbWF4WSA9IE1hdGgubWF4KHAwLnksIHAxLnksIHAyLnksIHAzLnkpO1xuXG4gICAgLy8gd2UgcGljayBhbiBlcnJvciB0aHJlc2hvbGQgZm9yIGNhbGN1bGF0aW5nIHRoZSBiYm94IHRoYXQgYmFsYW5jZXMgYmV0d2VlbiBwZXJmb3JtYW5jZSBhbmQgcHJlY2lzaW9uXG4gICAgY29uc3QgbWF4RXJyID0gcyAvIDE2O1xuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1NlZ21lbnQocGEsIHBiLCBheCwgYXksIGJ4LCBieSkge1xuICAgICAgICBjb25zdCBteCA9IChheCArIGJ4KSAvIDI7XG4gICAgICAgIGNvbnN0IG15ID0gKGF5ICsgYnkpIC8gMjtcblxuICAgICAgICBjb25zdCBwbSA9IHByb2plY3Rpb24ucHJvamVjdChsbmdGcm9tTWVyY2F0b3JYKG14KSwgbGF0RnJvbU1lcmNhdG9yWShteSkpO1xuICAgICAgICBjb25zdCBlcnIgPSBNYXRoLm1heCgwLCBtaW5YIC0gcG0ueCwgbWluWSAtIHBtLnksIHBtLnggLSBtYXhYLCBwbS55IC0gbWF4WSk7XG5cbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHBtLngpO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgcG0ueCk7XG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBwbS55KTtcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHBtLnkpO1xuXG4gICAgICAgIGlmIChlcnIgPiBtYXhFcnIpIHtcbiAgICAgICAgICAgIHByb2Nlc3NTZWdtZW50KHBhLCBwbSwgYXgsIGF5LCBteCwgbXkpO1xuICAgICAgICAgICAgcHJvY2Vzc1NlZ21lbnQocG0sIHBiLCBteCwgbXksIGJ4LCBieSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9jZXNzU2VnbWVudChwMCwgcDEsIHgxLCB5MSwgeDIsIHkxKTtcbiAgICBwcm9jZXNzU2VnbWVudChwMSwgcDIsIHgyLCB5MSwgeDIsIHkyKTtcbiAgICBwcm9jZXNzU2VnbWVudChwMiwgcDMsIHgyLCB5MiwgeDEsIHkyKTtcbiAgICBwcm9jZXNzU2VnbWVudChwMywgcDAsIHgxLCB5MiwgeDEsIHkxKTtcblxuICAgIC8vIGV4dGVuZCB0aGUgYmJveCBieSBtYXggZXJyb3IgdG8gbWFrZSBzdXJlIGNvb3JkcyBkb24ndCBnbyBwYXN0IHRpbGUgZXh0ZW50XG4gICAgbWluWCAtPSBtYXhFcnI7XG4gICAgbWluWSAtPSBtYXhFcnI7XG4gICAgbWF4WCArPSBtYXhFcnI7XG4gICAgbWF4WSArPSBtYXhFcnI7XG5cbiAgICBjb25zdCBtYXggPSBNYXRoLm1heChtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkpO1xuICAgIGNvbnN0IHNjYWxlID0gMSAvIG1heDtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHNjYWxlLFxuICAgICAgICB4OiBtaW5YICogc2NhbGUsXG4gICAgICAgIHk6IG1pblkgKiBzY2FsZSxcbiAgICAgICAgeDI6IG1heFggKiBzY2FsZSxcbiAgICAgICAgeTI6IG1heFkgKiBzY2FsZSxcbiAgICAgICAgcHJvamVjdGlvblxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWxlQUFCQih0cjogVHJhbnNmb3JtLCBudW1UaWxlczogbnVtYmVyLCB6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3cmFwOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgcHJvamVjdGlvbjogUHJvamVjdGlvbikge1xuICAgIGlmIChwcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgY29uc3QgdGlsZUlkID0gbmV3IFVud3JhcHBlZFRpbGVJRCh3cmFwLCBuZXcgQ2Fub25pY2FsVGlsZUlEKHosIHgsIHkpKTtcbiAgICAgICAgY29uc3QgYWFiYiA9IGdsb2JlVGlsZUJvdW5kcyh0aWxlSWQuY2Fub25pY2FsKTtcblxuICAgICAgICAvLyBUcmFuc2Zvcm0gY29ybmVycyBvZiB0aGUgYWFiYiB0byB0aGUgY29ycmVjdCBzcGFjZVxuICAgICAgICBjb25zdCBjb3JuZXJzID0gYWFiYi5nZXRDb3JuZXJzKCk7XG5cbiAgICAgICAgY29uc3QgbXggPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICBjb25zdCBjb3JuZXJNYXggPSBbLW14LCAtbXgsIC1teF07XG4gICAgICAgIGNvbnN0IGNvcm5lck1pbiA9IFtteCwgbXgsIG14XTtcbiAgICAgICAgY29uc3QgZ2xvYmVNYXRyaXggPSBjYWxjdWxhdGVHbG9iZU1hdHJpeCh0ciwgbnVtVGlsZXMpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29ybmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmVjMy50cmFuc2Zvcm1NYXQ0KGNvcm5lcnNbaV0sIGNvcm5lcnNbaV0sIGdsb2JlTWF0cml4KTtcbiAgICAgICAgICAgIHZlYzMubWluKGNvcm5lck1pbiwgY29ybmVyTWluLCBjb3JuZXJzW2ldKTtcbiAgICAgICAgICAgIHZlYzMubWF4KGNvcm5lck1heCwgY29ybmVyTWF4LCBjb3JuZXJzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQWFiYihjb3JuZXJNaW4sIGNvcm5lck1heCk7XG4gICAgfVxuXG4gICAgY29uc3QgdHQgPSB0aWxlVHJhbnNmb3JtKHt6LCB4LCB5fSwgcHJvamVjdGlvbik7XG4gICAgY29uc3QgdHggPSB0dC54IC8gdHQuc2NhbGU7XG4gICAgY29uc3QgdHkgPSB0dC55IC8gdHQuc2NhbGU7XG4gICAgY29uc3QgdHgyID0gdHQueDIgLyB0dC5zY2FsZTtcbiAgICBjb25zdCB0eTIgPSB0dC55MiAvIHR0LnNjYWxlO1xuXG4gICAgaWYgKGlzTmFOKHR4KSB8fCBpc05hTih0eDIpIHx8IGlzTmFOKHR5KSB8fCBpc05hTih0eTIpKSB7XG4gICAgICAgIGFzc2VydChmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBYWJiKFxuICAgICAgICBbKHdyYXAgKyB0eCkgKiBudW1UaWxlcywgbnVtVGlsZXMgKiB0eSwgbWluXSxcbiAgICAgICAgWyh3cmFwICArIHR4MikgKiBudW1UaWxlcywgbnVtVGlsZXMgKiB0eTIsIG1heF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGlsZVBvaW50KHRpbGVUcmFuc2Zvcm06IFRpbGVUcmFuc2Zvcm0sIHt4LCB5fToge3g6IG51bWJlciwgeTogbnVtYmVyfSwgd3JhcDogbnVtYmVyID0gMCkge1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgICgoeCAtIHdyYXApICogdGlsZVRyYW5zZm9ybS5zY2FsZSAtIHRpbGVUcmFuc2Zvcm0ueCkgKiBFWFRFTlQsXG4gICAgICAgICh5ICogdGlsZVRyYW5zZm9ybS5zY2FsZSAtIHRpbGVUcmFuc2Zvcm0ueSkgKiBFWFRFTlQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGlsZVZlYzModGlsZVRyYW5zZm9ybTogVGlsZVRyYW5zZm9ybSwgY29vcmQ6IE1lcmNhdG9yQ29vcmRpbmF0ZSwgd3JhcDogbnVtYmVyID0gMCk6IHZlYzMge1xuICAgIGNvbnN0IHggPSAoKGNvb3JkLnggLSB3cmFwKSAqIHRpbGVUcmFuc2Zvcm0uc2NhbGUgLSB0aWxlVHJhbnNmb3JtLngpICogRVhURU5UO1xuICAgIGNvbnN0IHkgPSAoY29vcmQueSAqIHRpbGVUcmFuc2Zvcm0uc2NhbGUgLSB0aWxlVHJhbnNmb3JtLnkpICogRVhURU5UO1xuICAgIHJldHVybiB2ZWMzLmZyb21WYWx1ZXMoeCwgeSwgYWx0aXR1ZGVGcm9tTWVyY2F0b3JaKGNvb3JkLnosIGNvb3JkLnkpKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7U0RGX1NDQUxFfSBmcm9tICcuLi9yZW5kZXIvZ2x5cGhfbWFuYWdlci5qcyc7XG5pbXBvcnQge0FscGhhSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcbmltcG9ydCBwb3RwYWNrIGZyb20gJ3BvdHBhY2snO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGguanMnO1xuXG5jb25zdCBnbHlwaFBhZGRpbmcgPSAxO1xuLypcbiAgICBUaGUgZ2x5cGggcGFkZGluZyBpcyBqdXN0IHRvIHByZXZlbnQgc2FtcGxpbmcgZXJyb3JzIGF0IHRoZSBib3VuZGFyaWVzIGJldHdlZW5cbiAgICBnbHlwaHMgaW4gdGhlIGF0bGFzIHRleHR1cmUsIGFuZCBmb3IgdGhhdCBwdXJwb3NlIHRoZXJlJ3Mgbm8gbmVlZCB0byBtYWtlIGl0XG4gICAgYmlnZ2VyIHdpdGggaGlnaC1yZXMgU0RGcy4gSG93ZXZlciwgbGF5b3V0IGlzIGRvbmUgYmFzZWQgb24gdGhlIGdseXBoIHNpemVcbiAgICBpbmNsdWRpbmcgdGhpcyBwYWRkaW5nLCBzbyBzY2FsaW5nIHRoaXMgcGFkZGluZyBpcyB0aGUgZWFzaWVzdCB3YXkgdG8ga2VlcFxuICAgIGxheW91dCBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBTREZfU0NBTEUgY2hhbmdlcy5cbiovXG5jb25zdCBsb2NhbEdseXBoUGFkZGluZyA9IGdseXBoUGFkZGluZyAqIFNERl9TQ0FMRTtcblxuZXhwb3J0IHR5cGUgR2x5cGhSZWN0ID0ge1xuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgdzogbnVtYmVyLFxuICAgIGg6IG51bWJlclxufTtcbi8vIHtnbHlwaElEOiBnbHlwaFJlY3R9XG5leHBvcnQgdHlwZSBHbHlwaFBvc2l0aW9uTWFwID0geyBbXzogbnVtYmVyXTogR2x5cGhSZWN0IH07XG5cbi8vIHtmb250U3RhY2s6IGdseXBoUG9pc3Rpb25NYXB9XG5leHBvcnQgdHlwZSBHbHlwaFBvc2l0aW9ucyA9IHsgW186IHN0cmluZ106IEdseXBoUG9zaXRpb25NYXAgfTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2x5cGhBdGxhcyB7XG4gICAgaW1hZ2U6IEFscGhhSW1hZ2U7XG4gICAgcG9zaXRpb25zOiBHbHlwaFBvc2l0aW9ucztcbiAgICBjb25zdHJ1Y3RvcihzdGFja3M6IHtbXzogc3RyaW5nXToge2dseXBoczoge1tfOiBudW1iZXJdOiA/U3R5bGVHbHlwaCB9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyIH19KSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHt9O1xuICAgICAgICBjb25zdCBiaW5zID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGFjayBpbiBzdGFja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGdseXBoRGF0YSA9IHN0YWNrc1tzdGFja107XG4gICAgICAgICAgICBjb25zdCBnbHlwaFBvc2l0aW9uTWFwID0gcG9zaXRpb25zW3N0YWNrXSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGdseXBoRGF0YS5nbHlwaHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBnbHlwaERhdGEuZ2x5cGhzWytpZF07XG4gICAgICAgICAgICAgICAgaWYgKCFzcmMgfHwgc3JjLmJpdG1hcC53aWR0aCA9PT0gMCB8fCBzcmMuYml0bWFwLmhlaWdodCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gc3JjLm1ldHJpY3MubG9jYWxHbHlwaCA/IGxvY2FsR2x5cGhQYWRkaW5nIDogZ2x5cGhQYWRkaW5nO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICAgICAgdzogc3JjLmJpdG1hcC53aWR0aCArIDIgKiBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICBoOiBzcmMuYml0bWFwLmhlaWdodCArIDIgKiBwYWRkaW5nXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBiaW5zLnB1c2goYmluKTtcbiAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9uTWFwW2lkXSA9IGJpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHt3LCBofSA9IHBvdHBhY2soYmlucyk7XG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEFscGhhSW1hZ2Uoe3dpZHRoOiB3IHx8IDEsIGhlaWdodDogaCB8fCAxfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGFjayBpbiBzdGFja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGdseXBoRGF0YSA9IHN0YWNrc1tzdGFja107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gZ2x5cGhEYXRhLmdseXBocykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNyYyA9IGdseXBoRGF0YS5nbHlwaHNbK2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoIXNyYyB8fCBzcmMuYml0bWFwLndpZHRoID09PSAwIHx8IHNyYy5iaXRtYXAuaGVpZ2h0ID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBiaW4gPSBwb3NpdGlvbnNbc3RhY2tdW2lkXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gc3JjLm1ldHJpY3MubG9jYWxHbHlwaCA/IGxvY2FsR2x5cGhQYWRkaW5nIDogZ2x5cGhQYWRkaW5nO1xuICAgICAgICAgICAgICAgIEFscGhhSW1hZ2UuY29weShzcmMuYml0bWFwLCBpbWFnZSwge3g6IDAsIHk6IDB9LCB7eDogYmluLnggKyBwYWRkaW5nLCB5OiBiaW4ueSArIHBhZGRpbmd9LCBzcmMuYml0bWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBwb3NpdGlvbnM7XG4gICAgfVxufVxuXG5yZWdpc3RlcignR2x5cGhBdGxhcycsIEdseXBoQXRsYXMpO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEZlYXR1cmVJbmRleCBmcm9tICcuLi9kYXRhL2ZlYXR1cmVfaW5kZXguanMnO1xuXG5pbXBvcnQge3BlcmZvcm1TeW1ib2xMYXlvdXR9IGZyb20gJy4uL3N5bWJvbC9zeW1ib2xfbGF5b3V0LmpzJztcbmltcG9ydCB7Q29sbGlzaW9uQm94QXJyYXl9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMuanMnO1xuaW1wb3J0IERpY3Rpb25hcnlDb2RlciBmcm9tICcuLi91dGlsL2RpY3Rpb25hcnlfY29kZXIuanMnO1xuaW1wb3J0IFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCBMaW5lQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0LmpzJztcbmltcG9ydCBGaWxsQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0LmpzJztcbmltcG9ydCBGaWxsRXh0cnVzaW9uQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldC5qcyc7XG5pbXBvcnQge3dhcm5PbmNlLCBtYXBPYmplY3QsIHZhbHVlc30gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBMaW5lQXRsYXMgZnJvbSAnLi4vcmVuZGVyL2xpbmVfYXRsYXMuanMnO1xuaW1wb3J0IEltYWdlQXRsYXMgZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzLmpzJztcbmltcG9ydCBHbHlwaEF0bGFzIGZyb20gJy4uL3JlbmRlci9nbHlwaF9hdGxhcy5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCB7Q2Fub25pY2FsVGlsZUlELCBPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQuanMnO1xuaW1wb3J0IHtQZXJmb3JtYW5jZVV0aWxzfSBmcm9tICcuLi91dGlsL3BlcmZvcm1hbmNlLmpzJztcbmltcG9ydCB0aWxlVHJhbnNmb3JtIGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtQcm9qZWN0aW9ufSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7QnVja2V0fSBmcm9tICcuLi9kYXRhL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBBY3RvciBmcm9tICcuLi91dGlsL2FjdG9yLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllckluZGV4IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGguanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIFdvcmtlclRpbGVQYXJhbWV0ZXJzLFxuICAgIFdvcmtlclRpbGVDYWxsYmFjayxcbn0gZnJvbSAnLi4vc291cmNlL3dvcmtlcl9zb3VyY2UuanMnO1xuaW1wb3J0IHR5cGUge1Byb21vdGVJZFNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVUcmFuc2Zvcm19IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcblxuY2xhc3MgV29ya2VyVGlsZSB7XG4gICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEO1xuICAgIHVpZDogbnVtYmVyO1xuICAgIHpvb206IG51bWJlcjtcbiAgICB0aWxlWm9vbTogbnVtYmVyO1xuICAgIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEO1xuICAgIHBpeGVsUmF0aW86IG51bWJlcjtcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuICAgIHNvdXJjZTogc3RyaW5nO1xuICAgIHByb21vdGVJZDogP1Byb21vdGVJZFNwZWNpZmljYXRpb247XG4gICAgb3ZlcnNjYWxpbmc6IG51bWJlcjtcbiAgICBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW47XG4gICAgY29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFuO1xuICAgIHJldHVybkRlcGVuZGVuY2llczogYm9vbGVhbjtcbiAgICBlbmFibGVUZXJyYWluOiBib29sZWFuO1xuICAgIGlzU3ltYm9sVGlsZTogP2Jvb2xlYW47XG4gICAgcHJvamVjdGlvbjogUHJvamVjdGlvbjtcbiAgICB0aWxlVHJhbnNmb3JtOiBUaWxlVHJhbnNmb3JtO1xuXG4gICAgc3RhdHVzOiAncGFyc2luZycgfCAnZG9uZSc7XG4gICAgZGF0YTogVmVjdG9yVGlsZTtcbiAgICBjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXk7XG5cbiAgICBhYm9ydDogPygpID0+IHZvaWQ7XG4gICAgcmVsb2FkQ2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaztcbiAgICB2ZWN0b3JUaWxlOiBWZWN0b3JUaWxlO1xuXG4gICAgY29uc3RydWN0b3IocGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnRpbGVJRCA9IG5ldyBPdmVyc2NhbGVkVGlsZUlEKHBhcmFtcy50aWxlSUQub3ZlcnNjYWxlZFosIHBhcmFtcy50aWxlSUQud3JhcCwgcGFyYW1zLnRpbGVJRC5jYW5vbmljYWwueiwgcGFyYW1zLnRpbGVJRC5jYW5vbmljYWwueCwgcGFyYW1zLnRpbGVJRC5jYW5vbmljYWwueSk7XG4gICAgICAgIHRoaXMudGlsZVpvb20gPSBwYXJhbXMudGlsZVpvb207XG4gICAgICAgIHRoaXMudWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgdGhpcy56b29tID0gcGFyYW1zLnpvb207XG4gICAgICAgIHRoaXMuY2Fub25pY2FsID0gcGFyYW1zLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpbyA9IHBhcmFtcy5waXhlbFJhdGlvO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gcGFyYW1zLnRpbGVTaXplO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHBhcmFtcy5zb3VyY2U7XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSB0aGlzLnRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKTtcbiAgICAgICAgdGhpcy5zaG93Q29sbGlzaW9uQm94ZXMgPSBwYXJhbXMuc2hvd0NvbGxpc2lvbkJveGVzO1xuICAgICAgICB0aGlzLmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9ICEhcGFyYW1zLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcbiAgICAgICAgdGhpcy5yZXR1cm5EZXBlbmRlbmNpZXMgPSAhIXBhcmFtcy5yZXR1cm5EZXBlbmRlbmNpZXM7XG4gICAgICAgIHRoaXMucHJvbW90ZUlkID0gcGFyYW1zLnByb21vdGVJZDtcbiAgICAgICAgdGhpcy5lbmFibGVUZXJyYWluID0gISFwYXJhbXMuZW5hYmxlVGVycmFpbjtcbiAgICAgICAgdGhpcy5pc1N5bWJvbFRpbGUgPSBwYXJhbXMuaXNTeW1ib2xUaWxlO1xuICAgICAgICB0aGlzLnRpbGVUcmFuc2Zvcm0gPSB0aWxlVHJhbnNmb3JtKHBhcmFtcy50aWxlSUQuY2Fub25pY2FsLCBwYXJhbXMucHJvamVjdGlvbik7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbiA9IHBhcmFtcy5wcm9qZWN0aW9uO1xuICAgIH1cblxuICAgIHBhcnNlKGRhdGE6IFZlY3RvclRpbGUsIGxheWVySW5kZXg6IFN0eWxlTGF5ZXJJbmRleCwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBhY3RvcjogQWN0b3IsIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbSA9IFBlcmZvcm1hbmNlVXRpbHMuYmVnaW5NZWFzdXJlKCdwYXJzZVRpbGUxJyk7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ3BhcnNpbmcnO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uQm94QXJyYXkgPSBuZXcgQ29sbGlzaW9uQm94QXJyYXkoKTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJDb2RlciA9IG5ldyBEaWN0aW9uYXJ5Q29kZXIoT2JqZWN0LmtleXMoZGF0YS5sYXllcnMpLnNvcnQoKSk7XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZUluZGV4ID0gbmV3IEZlYXR1cmVJbmRleCh0aGlzLnRpbGVJRCwgdGhpcy5wcm9tb3RlSWQpO1xuICAgICAgICBmZWF0dXJlSW5kZXguYnVja2V0TGF5ZXJJRHMgPSBbXTtcblxuICAgICAgICBjb25zdCBidWNrZXRzOiB7W186IHN0cmluZ106IEJ1Y2tldH0gPSB7fTtcblxuICAgICAgICAvLyB3ZSBpbml0aWFsbHkgcmVzZXJ2ZSBzcGFjZSBmb3IgYSAyNTZ4MjU2IGF0bGFzLCBidXQgdHJpbSBpdCBhZnRlciBwcm9jZXNzaW5nIGFsbCBsaW5lIGZlYXR1cmVzXG4gICAgICAgIGNvbnN0IGxpbmVBdGxhcyA9IG5ldyBMaW5lQXRsYXMoMjU2LCAyNTYpO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICBpY29uRGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgICAgICAgIHBhdHRlcm5EZXBlbmRlbmNpZXM6IHt9LFxuICAgICAgICAgICAgZ2x5cGhEZXBlbmRlbmNpZXM6IHt9LFxuICAgICAgICAgICAgbGluZUF0bGFzLFxuICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbGF5ZXJGYW1pbGllcyA9IGxheWVySW5kZXguZmFtaWxpZXNCeVNvdXJjZVt0aGlzLnNvdXJjZV07XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlTGF5ZXJJZCBpbiBsYXllckZhbWlsaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IGRhdGEubGF5ZXJzW3NvdXJjZUxheWVySWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYW55U3ltYm9sTGF5ZXJzID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgYW55T3RoZXJMYXllcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmFtaWx5IG9mIGxheWVyRmFtaWxpZXNbc291cmNlTGF5ZXJJZF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZmFtaWx5WzBdLnR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgICAgIGFueVN5bWJvbExheWVycyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYW55T3RoZXJMYXllcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTeW1ib2xUaWxlID09PSB0cnVlICYmICFhbnlTeW1ib2xMYXllcnMpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1N5bWJvbFRpbGUgPT09IGZhbHNlICYmICFhbnlPdGhlckxheWVycykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc291cmNlTGF5ZXIudmVyc2lvbiA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKGBWZWN0b3IgdGlsZSBzb3VyY2UgXCIke3RoaXMuc291cmNlfVwiIGxheWVyIFwiJHtzb3VyY2VMYXllcklkfVwiIGAgK1xuICAgICAgICAgICAgICAgICAgICBgZG9lcyBub3QgdXNlIHZlY3RvciB0aWxlIHNwZWMgdjIgYW5kIHRoZXJlZm9yZSBtYXkgaGF2ZSBzb21lIHJlbmRlcmluZyBlcnJvcnMuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVySW5kZXggPSBzb3VyY2VMYXllckNvZGVyLmVuY29kZShzb3VyY2VMYXllcklkKTtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlTGF5ZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IHNvdXJjZUxheWVyLmZlYXR1cmUoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZmVhdHVyZUluZGV4LmdldElkKGZlYXR1cmUsIHNvdXJjZUxheWVySWQpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2goe2ZlYXR1cmUsIGlkLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZhbWlseSBvZiBsYXllckZhbWlsaWVzW3NvdXJjZUxheWVySWRdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBmYW1pbHlbMF07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTeW1ib2xUaWxlICE9PSB1bmRlZmluZWQgJiYgKGxheWVyLnR5cGUgPT09ICdzeW1ib2wnKSAhPT0gdGhpcy5pc1N5bWJvbFRpbGUpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgYXNzZXJ0KGxheWVyLnNvdXJjZSA9PT0gdGhpcy5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5taW56b29tICYmIHRoaXMuem9vbSA8IE1hdGguZmxvb3IobGF5ZXIubWluem9vbSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5tYXh6b29tICYmIHRoaXMuem9vbSA+PSBsYXllci5tYXh6b29tKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIudmlzaWJpbGl0eSA9PT0gJ25vbmUnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlTGF5ZXJzKGZhbWlseSwgdGhpcy56b29tLCBhdmFpbGFibGVJbWFnZXMpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gYnVja2V0c1tsYXllci5pZF0gPSBsYXllci5jcmVhdGVCdWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogZmVhdHVyZUluZGV4LmJ1Y2tldExheWVySURzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBmYW1pbHksXG4gICAgICAgICAgICAgICAgICAgIHpvb206IHRoaXMuem9vbSxcbiAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsOiB0aGlzLmNhbm9uaWNhbCxcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxSYXRpbzogdGhpcy5waXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICBvdmVyc2NhbGluZzogdGhpcy5vdmVyc2NhbGluZyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXk6IHRoaXMuY29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlEOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlVGVycmFpbjogdGhpcy5lbmFibGVUZXJyYWluLFxuICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbWFnZXNcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGJ1Y2tldC5wb3B1bGF0ZShmZWF0dXJlcywgb3B0aW9ucywgdGhpcy50aWxlSUQuY2Fub25pY2FsLCB0aGlzLnRpbGVUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleC5idWNrZXRMYXllcklEcy5wdXNoKGZhbWlseS5tYXAoKGwpID0+IGwuaWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVBdGxhcy50cmltKCk7XG5cbiAgICAgICAgbGV0IGVycm9yOiA/RXJyb3I7XG4gICAgICAgIGxldCBnbHlwaE1hcDogP3tbXzogc3RyaW5nXToge2dseXBoczoge1tfOiBudW1iZXJdOiA/U3R5bGVHbHlwaH0sIGFzY2VuZGVyPzogbnVtYmVyLCBkZXNjZW5kZXI/OiBudW1iZXJ9fTtcbiAgICAgICAgbGV0IGljb25NYXA6ID97W186IHN0cmluZ106IFN0eWxlSW1hZ2V9O1xuICAgICAgICBsZXQgcGF0dGVybk1hcDogP3tbXzogc3RyaW5nXTogU3R5bGVJbWFnZX07XG4gICAgICAgIGNvbnN0IHRhc2tNZXRhZGF0YSA9IHt0eXBlOiAnbWF5YmVQcmVwYXJlJywgaXNTeW1ib2xUaWxlOiB0aGlzLmlzU3ltYm9sVGlsZSwgem9vbTogdGhpcy56b29tfTtcblxuICAgICAgICBjb25zdCBzdGFja3MgPSBtYXBPYmplY3Qob3B0aW9ucy5nbHlwaERlcGVuZGVuY2llcywgKGdseXBocykgPT4gT2JqZWN0LmtleXMoZ2x5cGhzKS5tYXAoTnVtYmVyKSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdGFja3MpLmxlbmd0aCkge1xuICAgICAgICAgICAgYWN0b3Iuc2VuZCgnZ2V0R2x5cGhzJywge3VpZDogdGhpcy51aWQsIHN0YWNrc30sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgIGdseXBoTWFwID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBtYXliZVByZXBhcmUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB0YXNrTWV0YWRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2x5cGhNYXAgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGljb25zID0gT2JqZWN0LmtleXMob3B0aW9ucy5pY29uRGVwZW5kZW5jaWVzKTtcbiAgICAgICAgaWYgKGljb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWN0b3Iuc2VuZCgnZ2V0SW1hZ2VzJywge2ljb25zLCBzb3VyY2U6IHRoaXMuc291cmNlLCB0aWxlSUQ6IHRoaXMudGlsZUlELCB0eXBlOiAnaWNvbnMnfSwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgaWNvbk1hcCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgbWF5YmVQcmVwYXJlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdGFza01ldGFkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGljb25NYXAgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gT2JqZWN0LmtleXMob3B0aW9ucy5wYXR0ZXJuRGVwZW5kZW5jaWVzKTtcbiAgICAgICAgaWYgKHBhdHRlcm5zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWN0b3Iuc2VuZCgnZ2V0SW1hZ2VzJywge2ljb25zOiBwYXR0ZXJucywgc291cmNlOiB0aGlzLnNvdXJjZSwgdGlsZUlEOiB0aGlzLnRpbGVJRCwgdHlwZTogJ3BhdHRlcm5zJ30sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5NYXAgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIG1heWJlUHJlcGFyZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHRhc2tNZXRhZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXR0ZXJuTWFwID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLmVuZE1lYXN1cmUobSk7XG5cbiAgICAgICAgbWF5YmVQcmVwYXJlLmNhbGwodGhpcyk7XG5cbiAgICAgICAgZnVuY3Rpb24gbWF5YmVQcmVwYXJlKCkge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2x5cGhNYXAgJiYgaWNvbk1hcCAmJiBwYXR0ZXJuTWFwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbSA9IFBlcmZvcm1hbmNlVXRpbHMuYmVnaW5NZWFzdXJlKCdwYXJzZVRpbGUyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2x5cGhBdGxhcyA9IG5ldyBHbHlwaEF0bGFzKGdseXBoTWFwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUF0bGFzID0gbmV3IEltYWdlQXRsYXMoaWNvbk1hcCwgcGF0dGVybk1hcCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBidWNrZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IGJ1Y2tldHNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldCBpbnN0YW5jZW9mIFN5bWJvbEJ1Y2tldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjYWxjdWxhdGVMYXllcnMoYnVja2V0LmxheWVycywgdGhpcy56b29tLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVN5bWJvbExheW91dChidWNrZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhNYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhBdGxhcy5wb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUF0bGFzLmljb25Qb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q29sbGlzaW9uQm94ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGlsZUlELmNhbm9uaWNhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVab29tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQucHJvamVjdGlvbiA9IHRoaXMucHJvamVjdGlvbi5uYW1lO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1Y2tldC5oYXNQYXR0ZXJuICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoYnVja2V0IGluc3RhbmNlb2YgTGluZUJ1Y2tldCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCBpbnN0YW5jZW9mIEZpbGxCdWNrZXQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQgaW5zdGFuY2VvZiBGaWxsRXh0cnVzaW9uQnVja2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjYWxjdWxhdGVMYXllcnMoYnVja2V0LmxheWVycywgdGhpcy56b29tLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmFkZEZlYXR1cmVzKG9wdGlvbnMsIHRoaXMudGlsZUlELmNhbm9uaWNhbCwgaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnZG9uZSc7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXRzOiB2YWx1ZXMoYnVja2V0cykuZmlsdGVyKGIgPT4gIWIuaXNFbXB0eSgpKSxcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheTogdGhpcy5jb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhBdGxhc0ltYWdlOiBnbHlwaEF0bGFzLmltYWdlLFxuICAgICAgICAgICAgICAgICAgICBsaW5lQXRsYXMsXG4gICAgICAgICAgICAgICAgICAgIGltYWdlQXRsYXMsXG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXNlZCBmb3IgYmVuY2htYXJraW5nOlxuICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDogdGhpcy5yZXR1cm5EZXBlbmRlbmNpZXMgPyBnbHlwaE1hcCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGljb25NYXA6IHRoaXMucmV0dXJuRGVwZW5kZW5jaWVzID8gaWNvbk1hcCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25zOiB0aGlzLnJldHVybkRlcGVuZGVuY2llcyA/IGdseXBoQXRsYXMucG9zaXRpb25zIDogbnVsbFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlVXRpbHMuZW5kTWVhc3VyZShtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVjYWxjdWxhdGVMYXllcnMobGF5ZXJzOiAkUmVhZE9ubHlBcnJheTxTdHlsZUxheWVyPiwgem9vbTogbnVtYmVyLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAvLyBMYXllcnMgYXJlIHNoYXJlZCBhbmQgbWF5IGhhdmUgYmVlbiB1c2VkIGJ5IGEgV29ya2VyVGlsZSB3aXRoIGEgZGlmZmVyZW50IHpvb20uXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh6b29tKTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICBsYXllci5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV29ya2VyVGlsZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Z2V0QXJyYXlCdWZmZXJ9IGZyb20gJy4uL3V0aWwvYWpheC5qcyc7XG5cbmltcG9ydCB2dCBmcm9tICdAbWFwYm94L3ZlY3Rvci10aWxlJztcbmltcG9ydCBQcm90b2J1ZiBmcm9tICdwYmYnO1xuaW1wb3J0IFdvcmtlclRpbGUgZnJvbSAnLi93b3JrZXJfdGlsZS5qcyc7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7Z2V0UGVyZm9ybWFuY2VNZWFzdXJlbWVudH0gZnJvbSAnLi4vdXRpbC9wZXJmb3JtYW5jZS5qcyc7XG5pbXBvcnQge0V2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBXb3JrZXJTb3VyY2UsXG4gICAgV29ya2VyVGlsZVBhcmFtZXRlcnMsXG4gICAgUmVxdWVzdGVkVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyVGlsZUNhbGxiYWNrLFxuICAgIFRpbGVQYXJhbWV0ZXJzXG59IGZyb20gJy4uL3NvdXJjZS93b3JrZXJfc291cmNlLmpzJztcblxuaW1wb3J0IHR5cGUgQWN0b3IgZnJvbSAnLi4vdXRpbC9hY3Rvci5qcyc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVySW5kZXggZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXJfaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgdHlwZSBTY2hlZHVsZXIgZnJvbSAnLi4vdXRpbC9zY2hlZHVsZXIuanMnO1xuXG5leHBvcnQgdHlwZSBMb2FkVmVjdG9yVGlsZVJlc3VsdCA9IHtcbiAgICByYXdEYXRhOiBBcnJheUJ1ZmZlcjtcbiAgICB2ZWN0b3JUaWxlPzogVmVjdG9yVGlsZTtcbiAgICBleHBpcmVzPzogYW55O1xuICAgIGNhY2hlQ29udHJvbD86IGFueTtcbiAgICByZXNvdXJjZVRpbWluZz86IEFycmF5PFBlcmZvcm1hbmNlUmVzb3VyY2VUaW1pbmc+O1xufTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgTG9hZFZlY3RvckRhdGFDYWxsYmFja1xuICogQHBhcmFtIGVycm9yXG4gKiBAcGFyYW0gdmVjdG9yVGlsZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IHR5cGUgTG9hZFZlY3RvckRhdGFDYWxsYmFjayA9IENhbGxiYWNrPD9Mb2FkVmVjdG9yVGlsZVJlc3VsdD47XG5cbmV4cG9ydCB0eXBlIEFib3J0VmVjdG9yRGF0YSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBMb2FkVmVjdG9yRGF0YSA9IChwYXJhbXM6IFJlcXVlc3RlZFRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogTG9hZFZlY3RvckRhdGFDYWxsYmFjaykgPT4gP0Fib3J0VmVjdG9yRGF0YTtcbmV4cG9ydCBjbGFzcyBEZWR1cGVkUmVxdWVzdCB7XG4gICAgZW50cmllczogeyBbc3RyaW5nXTogT2JqZWN0IH07XG4gICAgc2NoZWR1bGVyOiA/U2NoZWR1bGVyO1xuXG4gICAgY29uc3RydWN0b3Ioc2NoZWR1bGVyPzogU2NoZWR1bGVyKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IHt9O1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjtcbiAgICB9XG5cbiAgICByZXF1ZXN0KGtleTogc3RyaW5nLCBtZXRhZGF0YTogT2JqZWN0LCByZXF1ZXN0OiBhbnksIGNhbGxiYWNrOiBMb2FkVmVjdG9yRGF0YUNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzW2tleV0gPSB0aGlzLmVudHJpZXNba2V5XSB8fCB7Y2FsbGJhY2tzOiBbXX07XG5cbiAgICAgICAgaWYgKGVudHJ5LnJlc3VsdCkge1xuICAgICAgICAgICAgY29uc3QgW2VyciwgcmVzdWx0XSA9IGVudHJ5LnJlc3VsdDtcbiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVkdWxlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVyLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LCBtZXRhZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVudHJ5LmNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcblxuICAgICAgICBpZiAoIWVudHJ5LmNhbmNlbCkge1xuICAgICAgICAgICAgZW50cnkuY2FuY2VsID0gcmVxdWVzdCgoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBlbnRyeS5yZXN1bHQgPSBbZXJyLCByZXN1bHRdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2Igb2YgZW50cnkuY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVkdWxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZXIuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYihlcnIsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBtZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYihlcnIsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBkZWxldGUgdGhpcy5lbnRyaWVzW2tleV0sIDEwMDAgKiAzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5yZXN1bHQpIHJldHVybjtcbiAgICAgICAgICAgIGVudHJ5LmNhbGxiYWNrcyA9IGVudHJ5LmNhbGxiYWNrcy5maWx0ZXIoY2IgPT4gY2IgIT09IGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmICghZW50cnkuY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGVudHJ5LmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmVudHJpZXNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRWZWN0b3JUaWxlKHBhcmFtczogUmVxdWVzdGVkVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBMb2FkVmVjdG9yRGF0YUNhbGxiYWNrLCBza2lwUGFyc2U/OiBib29sZWFuKSB7XG4gICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zLnJlcXVlc3QpO1xuXG4gICAgY29uc3QgbWFrZVJlcXVlc3QgPSAoY2FsbGJhY2spID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGdldEFycmF5QnVmZmVyKHBhcmFtcy5yZXF1ZXN0LCAoZXJyOiA/RXJyb3IsIGRhdGE6ID9BcnJheUJ1ZmZlciwgY2FjaGVDb250cm9sOiA/c3RyaW5nLCBleHBpcmVzOiA/c3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgICAgICAgICAgICAgdmVjdG9yVGlsZTogc2tpcFBhcnNlID8gdW5kZWZpbmVkIDogbmV3IHZ0LlZlY3RvclRpbGUobmV3IFByb3RvYnVmKGRhdGEpKSxcbiAgICAgICAgICAgICAgICAgICAgcmF3RGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVDb250cm9sLFxuICAgICAgICAgICAgICAgICAgICBleHBpcmVzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGlmIChwYXJhbXMuZGF0YSkge1xuICAgICAgICAvLyBpZiB3ZSBhbHJlYWR5IGdvdCB0aGUgcmVzdWx0IGVhcmxpZXIgKG9uIHRoZSBtYWluIHRocmVhZCksIHJldHVybiBpdCBkaXJlY3RseVxuICAgICAgICB0aGlzLmRlZHVwZWQuZW50cmllc1trZXldID0ge3Jlc3VsdDogW251bGwsIHBhcmFtcy5kYXRhXX07XG4gICAgfVxuXG4gICAgY29uc3QgY2FsbGJhY2tNZXRhZGF0YSA9IHt0eXBlOiAncGFyc2VUaWxlJywgaXNTeW1ib2xUaWxlOiBwYXJhbXMuaXNTeW1ib2xUaWxlLCB6b29tOiBwYXJhbXMudGlsZVpvb219O1xuICAgIHJldHVybiB0aGlzLmRlZHVwZWQucmVxdWVzdChrZXksIGNhbGxiYWNrTWV0YWRhdGEsIG1ha2VSZXF1ZXN0LCBjYWxsYmFjayk7XG59XG5cbi8qKlxuICogVGhlIHtAbGluayBXb3JrZXJTb3VyY2V9IGltcGxlbWVudGF0aW9uIHRoYXQgc3VwcG9ydHMge0BsaW5rIFZlY3RvclRpbGVTb3VyY2V9LlxuICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBlYXNpbHkgcmV1c2VkIHRvIHN1cHBvcnQgY3VzdG9tIHNvdXJjZSB0eXBlc1xuICogZm9yIGRhdGEgZm9ybWF0cyB0aGF0IGNhbiBiZSBwYXJzZWQvY29udmVydGVkIGludG8gYW4gaW4tbWVtb3J5IFZlY3RvclRpbGVcbiAqIHJlcHJlc2VudGF0aW9uLiAgVG8gZG8gc28sIGNyZWF0ZSBpdCB3aXRoXG4gKiBgbmV3IFZlY3RvclRpbGVXb3JrZXJTb3VyY2UoYWN0b3IsIHN0eWxlTGF5ZXJzLCBjdXN0b21Mb2FkVmVjdG9yRGF0YUZ1bmN0aW9uKWAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSBleHRlbmRzIEV2ZW50ZWQgaW1wbGVtZW50cyBXb3JrZXJTb3VyY2Uge1xuICAgIGFjdG9yOiBBY3RvcjtcbiAgICBsYXllckluZGV4OiBTdHlsZUxheWVySW5kZXg7XG4gICAgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+O1xuICAgIGxvYWRWZWN0b3JEYXRhOiBMb2FkVmVjdG9yRGF0YTtcbiAgICBsb2FkaW5nOiB7W186IG51bWJlcl06IFdvcmtlclRpbGUgfTtcbiAgICBsb2FkZWQ6IHtbXzogbnVtYmVyXTogV29ya2VyVGlsZSB9O1xuICAgIGRlZHVwZWQ6IERlZHVwZWRSZXF1ZXN0O1xuICAgIGlzU3ByaXRlTG9hZGVkOiBib29sZWFuO1xuICAgIHNjaGVkdWxlcjogP1NjaGVkdWxlcjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBbbG9hZFZlY3RvckRhdGFdIE9wdGlvbmFsIG1ldGhvZCBmb3IgY3VzdG9tIGxvYWRpbmcgb2YgYSBWZWN0b3JUaWxlXG4gICAgICogb2JqZWN0IGJhc2VkIG9uIHBhcmFtZXRlcnMgcGFzc2VkIGZyb20gdGhlIG1haW4tdGhyZWFkIFNvdXJjZS4gU2VlXG4gICAgICoge0BsaW5rIFZlY3RvclRpbGVXb3JrZXJTb3VyY2UjbG9hZFRpbGV9LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHlcbiAgICAgKiBsb2FkcyB0aGUgcGJmIGF0IGBwYXJhbXMudXJsYC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFjdG9yOiBBY3RvciwgbGF5ZXJJbmRleDogU3R5bGVMYXllckluZGV4LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGlzU3ByaXRlTG9hZGVkOiBib29sZWFuLCBsb2FkVmVjdG9yRGF0YTogP0xvYWRWZWN0b3JEYXRhKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYWN0b3IgPSBhY3RvcjtcbiAgICAgICAgdGhpcy5sYXllckluZGV4ID0gbGF5ZXJJbmRleDtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVJbWFnZXMgPSBhdmFpbGFibGVJbWFnZXM7XG4gICAgICAgIHRoaXMubG9hZFZlY3RvckRhdGEgPSBsb2FkVmVjdG9yRGF0YSB8fCBsb2FkVmVjdG9yVGlsZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0ge307XG4gICAgICAgIHRoaXMubG9hZGVkID0ge307XG4gICAgICAgIHRoaXMuZGVkdXBlZCA9IG5ldyBEZWR1cGVkUmVxdWVzdChhY3Rvci5zY2hlZHVsZXIpO1xuICAgICAgICB0aGlzLmlzU3ByaXRlTG9hZGVkID0gaXNTcHJpdGVMb2FkZWQ7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyID0gYWN0b3Iuc2NoZWR1bGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNsb2FkVGlsZX0uIERlbGVnYXRlcyB0b1xuICAgICAqIHtAbGluayBWZWN0b3JUaWxlV29ya2VyU291cmNlI2xvYWRWZWN0b3JEYXRhfSAod2hpY2ggYnkgZGVmYXVsdCBleHBlY3RzXG4gICAgICogYSBgcGFyYW1zLnVybGAgcHJvcGVydHkpIGZvciBmZXRjaGluZyBhbmQgcHJvZHVjaW5nIGEgVmVjdG9yVGlsZSBvYmplY3QuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2FkVGlsZShwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHVpZCA9IHBhcmFtcy51aWQ7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdFBhcmFtID0gcGFyYW1zICYmIHBhcmFtcy5yZXF1ZXN0O1xuICAgICAgICBjb25zdCBwZXJmID0gcmVxdWVzdFBhcmFtICYmIHJlcXVlc3RQYXJhbS5jb2xsZWN0UmVzb3VyY2VUaW1pbmc7XG5cbiAgICAgICAgY29uc3Qgd29ya2VyVGlsZSA9IHRoaXMubG9hZGluZ1t1aWRdID0gbmV3IFdvcmtlclRpbGUocGFyYW1zKTtcbiAgICAgICAgd29ya2VyVGlsZS5hYm9ydCA9IHRoaXMubG9hZFZlY3RvckRhdGEocGFyYW1zLCAoZXJyLCByZXNwb25zZSkgPT4ge1xuXG4gICAgICAgICAgICBjb25zdCBhYm9ydGVkID0gIXRoaXMubG9hZGluZ1t1aWRdO1xuXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5sb2FkaW5nW3VpZF07XG5cbiAgICAgICAgICAgIGlmIChhYm9ydGVkIHx8IGVyciB8fCAhcmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICB3b3JrZXJUaWxlLnN0YXR1cyA9ICdkb25lJztcbiAgICAgICAgICAgICAgICBpZiAoIWFib3J0ZWQpIHRoaXMubG9hZGVkW3VpZF0gPSB3b3JrZXJUaWxlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByYXdUaWxlRGF0YSA9IHJlc3BvbnNlLnJhd0RhdGE7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUNvbnRyb2wgPSB7fTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5leHBpcmVzKSBjYWNoZUNvbnRyb2wuZXhwaXJlcyA9IHJlc3BvbnNlLmV4cGlyZXM7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuY2FjaGVDb250cm9sKSBjYWNoZUNvbnRyb2wuY2FjaGVDb250cm9sID0gcmVzcG9uc2UuY2FjaGVDb250cm9sO1xuXG4gICAgICAgICAgICAvLyByZXNwb25zZS52ZWN0b3JUaWxlIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgR2VvSlNPTiB3b3JrZXIgY2FzZSAod2hpY2ggaW5oZXJpdHMgZnJvbSB0aGlzIGNsYXNzKVxuICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSBzdHViIHRoZSB2ZWN0b3IgdGlsZSBpbnRlcmZhY2UgYXJvdW5kIEpTT04gZGF0YSBpbnN0ZWFkIG9mIHBhcnNpbmcgaXQgZGlyZWN0bHlcbiAgICAgICAgICAgIHdvcmtlclRpbGUudmVjdG9yVGlsZSA9IHJlc3BvbnNlLnZlY3RvclRpbGUgfHwgbmV3IHZ0LlZlY3RvclRpbGUobmV3IFByb3RvYnVmKHJhd1RpbGVEYXRhKSk7XG4gICAgICAgICAgICBjb25zdCBwYXJzZVRpbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd29ya2VyVGlsZS5wYXJzZSh3b3JrZXJUaWxlLnZlY3RvclRpbGUsIHRoaXMubGF5ZXJJbmRleCwgdGhpcy5hdmFpbGFibGVJbWFnZXMsIHRoaXMuYWN0b3IsIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyIHx8ICFyZXN1bHQpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVGltaW5nID0ge307XG4gICAgICAgICAgICAgICAgICAgIGlmIChwZXJmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmFuc2ZlcnJpbmcgYSBjb3B5IG9mIHJhd1RpbGVEYXRhIGJlY2F1c2UgdGhlIHdvcmtlciBuZWVkcyB0byByZXRhaW4gaXRzIGNvcHkuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZVRpbWluZ0RhdGEgPSBnZXRQZXJmb3JtYW5jZU1lYXN1cmVtZW50KHJlcXVlc3RQYXJhbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIG5lY2Vzc2FyeSB0byBldmFsIHRoZSByZXN1bHQgb2YgZ2V0RW50cmllc0J5TmFtZSgpIGhlcmUgdmlhIHBhcnNlL3N0cmluZ2lmeVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZSBldmFsdWF0aW9uIGluIHRoZSBtYWluIHRocmVhZCBjYXVzZXMgVHlwZUVycm9yOiBpbGxlZ2FsIGludm9jYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVRpbWluZ0RhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlVGltaW5nLnJlc291cmNlVGltaW5nID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXNvdXJjZVRpbWluZ0RhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBleHRlbmQoe3Jhd1RpbGVEYXRhOiByYXdUaWxlRGF0YS5zbGljZSgwKX0sIHJlc3VsdCwgY2FjaGVDb250cm9sLCByZXNvdXJjZVRpbWluZykpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTcHJpdGVMb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBwYXJzZVRpbGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKCdpc1Nwcml0ZUxvYWRlZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NoZWR1bGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHt0eXBlOiAncGFyc2VUaWxlJywgaXNTeW1ib2xUaWxlOiBwYXJhbXMuaXNTeW1ib2xUaWxlLCB6b29tOiBwYXJhbXMudGlsZVpvb219O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZXIuYWRkKHBhcnNlVGlsZSwgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VUaWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSB0aGlzLmxvYWRlZCB8fCB7fTtcbiAgICAgICAgICAgIHRoaXMubG9hZGVkW3VpZF0gPSB3b3JrZXJUaWxlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRzIHtAbGluayBXb3JrZXJTb3VyY2UjcmVsb2FkVGlsZX0uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZWxvYWRUaWxlKHBhcmFtczogV29ya2VyVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5sb2FkZWQsXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkLFxuICAgICAgICAgICAgdnRTb3VyY2UgPSB0aGlzO1xuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJUaWxlID0gbG9hZGVkW3VpZF07XG4gICAgICAgICAgICB3b3JrZXJUaWxlLnNob3dDb2xsaXNpb25Cb3hlcyA9IHBhcmFtcy5zaG93Q29sbGlzaW9uQm94ZXM7XG4gICAgICAgICAgICB3b3JrZXJUaWxlLmVuYWJsZVRlcnJhaW4gPSAhIXBhcmFtcy5lbmFibGVUZXJyYWluO1xuICAgICAgICAgICAgd29ya2VyVGlsZS5wcm9qZWN0aW9uID0gcGFyYW1zLnByb2plY3Rpb247XG5cbiAgICAgICAgICAgIGNvbnN0IGRvbmUgPSAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsb2FkQ2FsbGJhY2sgPSB3b3JrZXJUaWxlLnJlbG9hZENhbGxiYWNrO1xuICAgICAgICAgICAgICAgIGlmIChyZWxvYWRDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgd29ya2VyVGlsZS5yZWxvYWRDYWxsYmFjaztcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyVGlsZS5wYXJzZSh3b3JrZXJUaWxlLnZlY3RvclRpbGUsIHZ0U291cmNlLmxheWVySW5kZXgsIHRoaXMuYXZhaWxhYmxlSW1hZ2VzLCB2dFNvdXJjZS5hY3RvciwgcmVsb2FkQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHdvcmtlclRpbGUuc3RhdHVzID09PSAncGFyc2luZycpIHtcbiAgICAgICAgICAgICAgICB3b3JrZXJUaWxlLnJlbG9hZENhbGxiYWNrID0gZG9uZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod29ya2VyVGlsZS5zdGF0dXMgPT09ICdkb25lJykge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIHdhcyBubyB2ZWN0b3IgdGlsZSBkYXRhIG9uIHRoZSBpbml0aWFsIGxvYWQsIGRvbid0IHRyeSBhbmQgcmUtcGFyc2UgdGlsZVxuICAgICAgICAgICAgICAgIGlmICh3b3JrZXJUaWxlLnZlY3RvclRpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2VyVGlsZS5wYXJzZSh3b3JrZXJUaWxlLnZlY3RvclRpbGUsIHRoaXMubGF5ZXJJbmRleCwgdGhpcy5hdmFpbGFibGVJbWFnZXMsIHRoaXMuYWN0b3IsIGRvbmUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRzIHtAbGluayBXb3JrZXJTb3VyY2UjYWJvcnRUaWxlfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwYXJhbXNcbiAgICAgKiBAcGFyYW0gcGFyYW1zLnVpZCBUaGUgVUlEIGZvciB0aGlzIHRpbGUuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhYm9ydFRpbGUocGFyYW1zOiBUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBjb25zdCB1aWQgPSBwYXJhbXMudWlkO1xuICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5sb2FkaW5nW3VpZF07XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydCkgdGlsZS5hYm9ydCgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMubG9hZGluZ1t1aWRdO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI3JlbW92ZVRpbGV9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwYXJhbSBwYXJhbXMudWlkIFRoZSBVSUQgZm9yIHRoaXMgdGlsZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHJlbW92ZVRpbGUocGFyYW1zOiBUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLmxvYWRlZCxcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQ7XG4gICAgICAgIGlmIChsb2FkZWQgJiYgbG9hZGVkW3VpZF0pIHtcbiAgICAgICAgICAgIGRlbGV0ZSBsb2FkZWRbdWlkXTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmVjdG9yVGlsZVdvcmtlclNvdXJjZTtcbiIsIlxuZXhwb3J0IGRlZmF1bHQgWyd0eXBlJywgJ3NvdXJjZScsICdzb3VyY2UtbGF5ZXInLCAnbWluem9vbScsICdtYXh6b29tJywgJ2ZpbHRlcicsICdsYXlvdXQnXTtcbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB7VW53cmFwcGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQge21hdDQsIHZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4uL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi8uLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQgdGlsZVRyYW5zZm9ybSBmcm9tICcuL3RpbGVfdHJhbnNmb3JtLmpzJztcblxuY29uc3QgaWRlbnRpdHkgPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDY0QXJyYXkoMTYpKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmxhdFRpbGVUcmFuc2Zvcm0ge1xuICAgIF90cjogVHJhbnNmb3JtO1xuICAgIF93b3JsZFNpemU6IG51bWJlcjtcbiAgICBfaWRlbnRpdHk6IEZsb2F0NjRBcnJheTtcblxuICAgIGNvbnN0cnVjdG9yKHRyOiBUcmFuc2Zvcm0sIHdvcmxkU2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3RyID0gdHI7XG4gICAgICAgIHRoaXMuX3dvcmxkU2l6ZSA9IHdvcmxkU2l6ZTtcbiAgICB9XG5cbiAgICBjcmVhdGVJbnZlcnNpb25NYXRyaXgoKTogbWF0NCB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICB9XG5cbiAgICBjcmVhdGVUaWxlTWF0cml4KGlkOiBVbndyYXBwZWRUaWxlSUQpOiBtYXQ0IHtcbiAgICAgICAgbGV0IHNjYWxlLCBzY2FsZWRYLCBzY2FsZWRZO1xuICAgICAgICBjb25zdCBjYW5vbmljYWwgPSBpZC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IHBvc01hdHJpeCA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gdGhpcy5fdHIucHJvamVjdGlvbjtcblxuICAgICAgICBpZiAocHJvamVjdGlvbi5pc1JlcHJvamVjdGVkSW5UaWxlU3BhY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gdGlsZVRyYW5zZm9ybShjYW5vbmljYWwsIHByb2plY3Rpb24pO1xuICAgICAgICAgICAgc2NhbGUgPSAxO1xuICAgICAgICAgICAgc2NhbGVkWCA9IGNzLnggKyBpZC53cmFwICogY3Muc2NhbGU7XG4gICAgICAgICAgICBzY2FsZWRZID0gY3MueTtcbiAgICAgICAgICAgIG1hdDQuc2NhbGUocG9zTWF0cml4LCBwb3NNYXRyaXgsIFtzY2FsZSAvIGNzLnNjYWxlLCBzY2FsZSAvIGNzLnNjYWxlLCB0aGlzLl90ci5waXhlbHNQZXJNZXRlciAvIHRoaXMuX3dvcmxkU2l6ZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2NhbGUgPSB0aGlzLl93b3JsZFNpemUgLyB0aGlzLl90ci56b29tU2NhbGUoY2Fub25pY2FsLnopO1xuICAgICAgICAgICAgY29uc3QgdW53cmFwcGVkWCA9IGNhbm9uaWNhbC54ICsgTWF0aC5wb3coMiwgY2Fub25pY2FsLnopICogaWQud3JhcDtcbiAgICAgICAgICAgIHNjYWxlZFggPSB1bndyYXBwZWRYICogc2NhbGU7XG4gICAgICAgICAgICBzY2FsZWRZID0gY2Fub25pY2FsLnkgKiBzY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHBvc01hdHJpeCwgcG9zTWF0cml4LCBbc2NhbGVkWCwgc2NhbGVkWSwgMF0pO1xuICAgICAgICBtYXQ0LnNjYWxlKHBvc01hdHJpeCwgcG9zTWF0cml4LCBbc2NhbGUgLyBFWFRFTlQsIHNjYWxlIC8gRVhURU5ULCAxXSk7XG5cbiAgICAgICAgcmV0dXJuIHBvc01hdHJpeDtcbiAgICB9XG5cbiAgICBwb2ludENvb3JkaW5hdGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo/OiBudW1iZXIpOiBNZXJjYXRvckNvb3JkaW5hdGUge1xuICAgICAgICBjb25zdCBob3Jpem9uT2Zmc2V0ID0gdGhpcy5fdHIuaG9yaXpvbkxpbmVGcm9tVG9wKGZhbHNlKTtcbiAgICAgICAgY29uc3QgY2xhbXBlZCA9IG5ldyBQb2ludCh4LCBNYXRoLm1heChob3Jpem9uT2Zmc2V0LCB5KSk7XG4gICAgICAgIHJldHVybiB0aGlzLl90ci5yYXlJbnRlcnNlY3Rpb25Db29yZGluYXRlKHRoaXMuX3RyLnBvaW50UmF5SW50ZXJzZWN0aW9uKGNsYW1wZWQsIHopKTtcbiAgICB9XG5cbiAgICB1cFZlY3RvcigpOiB2ZWMzIHtcbiAgICAgICAgcmV0dXJuIFswLCAwLCAxXTtcbiAgICB9XG5cbiAgICB1cFZlY3RvclNjYWxlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2xuZ19sYXQuanMnO1xuaW1wb3J0IHtjbGFtcCwgd3JhcCwgZGVnVG9SYWQsIHJhZFRvRGVnfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHttZXJjYXRvclpmcm9tQWx0aXR1ZGUsIE1BWF9NRVJDQVRPUl9MQVRJVFVERX0gZnJvbSAnLi4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQge3ZlYzJ9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgRmxhdFRpbGVUcmFuc2Zvcm0gZnJvbSAnLi9mbGF0X3RpbGVfdHJhbnNmb3JtLmpzJztcbmltcG9ydCB7ZmFydGhlc3RQaXhlbERpc3RhbmNlT25QbGFuZX0gZnJvbSAnLi9mYXJfei5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAnYWxiZXJzJyxcbiAgICByYW5nZTogWzQsIDddLFxuICAgIGNlbnRlcjogWy05NiwgMzcuNV0sXG4gICAgcGFyYWxsZWxzOiBbMjkuNSwgNDUuNV0sXG4gICAgekF4aXNVbml0OiBcIm1ldGVyc1wiLFxuICAgIGNvbmljOiB0cnVlLFxuICAgIGlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZTogdHJ1ZSxcbiAgICB1bnN1cHBvcnRlZExheWVyczogWydjdXN0b20nXSxcblxuICAgIC8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1nZW8tcHJvamVjdGlvbiwgTUlULWxpY2Vuc2VkXG5cbiAgICBpbml0aWFsaXplQ29uc3RhbnRzKCkge1xuICAgICAgICBpZiAodGhpcy5jb25zdGFudHMgJiYgdmVjMi5leGFjdEVxdWFscyh0aGlzLnBhcmFsbGVscywgdGhpcy5jb25zdGFudHMucGFyYWxsZWxzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3kwID0gTWF0aC5zaW4oZGVnVG9SYWQodGhpcy5wYXJhbGxlbHNbMF0pKTtcbiAgICAgICAgY29uc3QgbiA9IChzeTAgKyBNYXRoLnNpbihkZWdUb1JhZCh0aGlzLnBhcmFsbGVsc1sxXSkpKSAvIDI7XG4gICAgICAgIGNvbnN0IGMgPSAxICsgc3kwICogKDIgKiBuIC0gc3kwKTtcbiAgICAgICAgY29uc3QgcjAgPSBNYXRoLnNxcnQoYykgLyBuO1xuXG4gICAgICAgIHRoaXMuY29uc3RhbnRzID0ge24sIGMsIHIwLCBwYXJhbGxlbHM6IHRoaXMucGFyYWxsZWxzfTtcbiAgICB9LFxuXG4gICAgcHJvamVjdChsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplQ29uc3RhbnRzKCk7XG5cbiAgICAgICAgY29uc3QgbGFtYmRhID0gZGVnVG9SYWQobG5nIC0gdGhpcy5jZW50ZXJbMF0pO1xuICAgICAgICBjb25zdCBwaGkgPSBkZWdUb1JhZChsYXQpO1xuXG4gICAgICAgIGNvbnN0IHtuLCBjLCByMH0gPSB0aGlzLmNvbnN0YW50cztcbiAgICAgICAgY29uc3QgciA9IE1hdGguc3FydChjIC0gMiAqIG4gKiBNYXRoLnNpbihwaGkpKSAvIG47XG4gICAgICAgIGNvbnN0IHggPSByICogTWF0aC5zaW4obGFtYmRhICogbik7XG4gICAgICAgIGNvbnN0IHkgPSByICogTWF0aC5jb3MobGFtYmRhICogbikgLSByMDtcbiAgICAgICAgcmV0dXJuIHt4LCB5LCB6OiAwfTtcbiAgICB9LFxuXG4gICAgdW5wcm9qZWN0KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnN0YW50cygpO1xuICAgICAgICBjb25zdCB7biwgYywgcjB9ID0gdGhpcy5jb25zdGFudHM7XG5cbiAgICAgICAgY29uc3QgcjB5ID0gcjAgKyB5O1xuICAgICAgICBsZXQgbCA9IE1hdGguYXRhbjIoeCwgTWF0aC5hYnMocjB5KSkgKiBNYXRoLnNpZ24ocjB5KTtcbiAgICAgICAgaWYgKHIweSAqIG4gPCAwKSB7XG4gICAgICAgICAgICBsIC09IE1hdGguUEkgKiBNYXRoLnNpZ24oeCkgKiBNYXRoLnNpZ24ocjB5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkdCA9IGRlZ1RvUmFkKHRoaXMuY2VudGVyWzBdKSAqIG47XG4gICAgICAgIGwgPSB3cmFwKGwsIC1NYXRoLlBJIC0gZHQsIE1hdGguUEkgLSBkdCk7XG5cbiAgICAgICAgY29uc3QgbG5nID0gcmFkVG9EZWcobCAvIG4pICsgdGhpcy5jZW50ZXJbMF07XG4gICAgICAgIGNvbnN0IHBoaSA9IE1hdGguYXNpbihjbGFtcCgoYyAtICh4ICogeCArIHIweSAqIHIweSkgKiBuICogbikgLyAoMiAqIG4pLCAtMSwgMSkpO1xuICAgICAgICBjb25zdCBsYXQgPSBjbGFtcChyYWRUb0RlZyhwaGkpLCAtTUFYX01FUkNBVE9SX0xBVElUVURFLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KGxuZywgbGF0KTtcbiAgICB9LFxuXG4gICAgcHJvamVjdFRpbGVQb2ludCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSB7XG4gICAgICAgIHJldHVybiB7eCwgeSwgejogMH07XG4gICAgfSxcblxuICAgIGxvY2F0aW9uUG9pbnQodHI6IFRyYW5zZm9ybSwgbG5nTGF0OiBMbmdMYXQpOiBQb2ludCB7XG4gICAgICAgIHJldHVybiB0ci5fY29vcmRpbmF0ZVBvaW50KHRyLmxvY2F0aW9uQ29vcmRpbmF0ZShsbmdMYXQpLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIHBpeGVsc1Blck1ldGVyKGxhdDogbnVtYmVyLCB3b3JsZFNpemU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIGxhdCkgKiB3b3JsZFNpemU7XG4gICAgfSxcblxuICAgIGZhcnRoZXN0UGl4ZWxEaXN0YW5jZSh0cjogVHJhbnNmb3JtKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcGl4ZWxzUGVyTWV0ZXIgPSB0aGlzLnBpeGVsc1Blck1ldGVyKHRyLmNlbnRlci5sYXQsIHRyLndvcmxkU2l6ZSk7XG4gICAgICAgIHJldHVybiBmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lKHRyLCBwaXhlbHNQZXJNZXRlcik7XG4gICAgfSxcblxuICAgIGNyZWF0ZVRpbGVUcmFuc2Zvcm0odHI6IFRyYW5zZm9ybSwgd29ybGRTaXplOiBudW1iZXIpOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4gbmV3IEZsYXRUaWxlVHJhbnNmb3JtKHRyLCB3b3JsZFNpemUpO1xuICAgIH1cbn07XG4iLCIvLyBAZmxvd1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9sbmdfbGF0LmpzJztcbmltcG9ydCB7Y2xhbXB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge21lcmNhdG9yWmZyb21BbHRpdHVkZSwgTUFYX01FUkNBVE9SX0xBVElUVURFfSBmcm9tICcuLi9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBGbGF0VGlsZVRyYW5zZm9ybSBmcm9tICcuL2ZsYXRfdGlsZV90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHtmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lfSBmcm9tICcuL2Zhcl96LmpzJztcblxuY29uc3QgYTEgPSAxLjM0MDI2NDtcbmNvbnN0IGEyID0gLTAuMDgxMTA2O1xuY29uc3QgYTMgPSAwLjAwMDg5MztcbmNvbnN0IGE0ID0gMC4wMDM3OTY7XG5jb25zdCBNID0gTWF0aC5zcXJ0KDMpIC8gMjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdlcXVhbEVhcnRoJyxcbiAgICBjZW50ZXI6IFswLCAwXSxcbiAgICByYW5nZTogWzMuNSwgN10sXG4gICAgekF4aXNVbml0OiBcIm1ldGVyc1wiLFxuICAgIGlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZTogdHJ1ZSxcbiAgICB1bnN1cHBvcnRlZExheWVyczogWydjdXN0b20nXSxcblxuICAgIHByb2plY3QobG5nOiBudW1iZXIsIGxhdDogbnVtYmVyKSB7XG4gICAgICAgIC8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1nZW8sIE1JVC1saWNlbnNlZFxuICAgICAgICBsYXQgPSBsYXQgLyAxODAgKiBNYXRoLlBJO1xuICAgICAgICBsbmcgPSBsbmcgLyAxODAgKiBNYXRoLlBJO1xuICAgICAgICBjb25zdCB0aGV0YSA9IE1hdGguYXNpbihNICogTWF0aC5zaW4obGF0KSk7XG4gICAgICAgIGNvbnN0IHRoZXRhMiA9IHRoZXRhICogdGhldGE7XG4gICAgICAgIGNvbnN0IHRoZXRhNiA9IHRoZXRhMiAqIHRoZXRhMiAqIHRoZXRhMjtcbiAgICAgICAgY29uc3QgeCA9IGxuZyAqIE1hdGguY29zKHRoZXRhKSAvIChNICogKGExICsgMyAqIGEyICogdGhldGEyICsgdGhldGE2ICogKDcgKiBhMyArIDkgKiBhNCAqIHRoZXRhMikpKTtcbiAgICAgICAgY29uc3QgeSA9IHRoZXRhICogKGExICsgYTIgKiB0aGV0YTIgKyB0aGV0YTYgKiAoYTMgKyBhNCAqIHRoZXRhMikpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiAoeCAvIE1hdGguUEkgKyAwLjUpICogMC41LFxuICAgICAgICAgICAgeTogMSAtICh5IC8gTWF0aC5QSSArIDEpICogMC41LFxuICAgICAgICAgICAgejogMFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICB1bnByb2plY3QoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLWdlbywgTUlULWxpY2Vuc2VkXG4gICAgICAgIHggPSAoMiAqIHggLSAwLjUpICogTWF0aC5QSTtcbiAgICAgICAgeSA9ICgyICogKDEgLSB5KSAtIDEpICogTWF0aC5QSTtcbiAgICAgICAgbGV0IHRoZXRhID0geTtcbiAgICAgICAgbGV0IHRoZXRhMiA9IHRoZXRhICogdGhldGE7XG4gICAgICAgIGxldCB0aGV0YTYgPSB0aGV0YTIgKiB0aGV0YTIgKiB0aGV0YTI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGRlbHRhLCBmeSwgZnB5OyBpIDwgMTI7ICsraSkge1xuICAgICAgICAgICAgZnkgPSB0aGV0YSAqIChhMSArIGEyICogdGhldGEyICsgdGhldGE2ICogKGEzICsgYTQgKiB0aGV0YTIpKSAtIHk7XG4gICAgICAgICAgICBmcHkgPSBhMSArIDMgKiBhMiAqIHRoZXRhMiArIHRoZXRhNiAqICg3ICogYTMgKyA5ICogYTQgKiB0aGV0YTIpO1xuICAgICAgICAgICAgZGVsdGEgPSBmeSAvIGZweTtcbiAgICAgICAgICAgIHRoZXRhID0gY2xhbXAodGhldGEgLSBkZWx0YSwgLU1hdGguUEkgLyAzLCBNYXRoLlBJIC8gMyk7XG4gICAgICAgICAgICB0aGV0YTIgPSB0aGV0YSAqIHRoZXRhO1xuICAgICAgICAgICAgdGhldGE2ID0gdGhldGEyICogdGhldGEyICogdGhldGEyO1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRlbHRhKSA8IDFlLTEyKSBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhbWJkYSA9IE0gKiB4ICogKGExICsgMyAqIGEyICogdGhldGEyICsgdGhldGE2ICogKDcgKiBhMyArIDkgKiBhNCAqIHRoZXRhMikpIC8gTWF0aC5jb3ModGhldGEpO1xuICAgICAgICBjb25zdCBwaGkgPSBNYXRoLmFzaW4oTWF0aC5zaW4odGhldGEpIC8gTSk7XG4gICAgICAgIGNvbnN0IGxuZyA9IGNsYW1wKGxhbWJkYSAqIDE4MCAvIE1hdGguUEksIC0xODAsIDE4MCk7XG4gICAgICAgIGNvbnN0IGxhdCA9IGNsYW1wKHBoaSAqIDE4MCAvIE1hdGguUEksIC1NQVhfTUVSQ0FUT1JfTEFUSVRVREUsIE1BWF9NRVJDQVRPUl9MQVRJVFVERSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQobG5nLCBsYXQpO1xuICAgIH0sXG5cbiAgICBwcm9qZWN0VGlsZVBvaW50KHg6IG51bWJlciwgeTogbnVtYmVyKToge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9IHtcbiAgICAgICAgcmV0dXJuIHt4LCB5LCB6OiAwfTtcbiAgICB9LFxuXG4gICAgbG9jYXRpb25Qb2ludCh0cjogVHJhbnNmb3JtLCBsbmdMYXQ6IExuZ0xhdCk6IFBvaW50IHtcbiAgICAgICAgcmV0dXJuIHRyLl9jb29yZGluYXRlUG9pbnQodHIubG9jYXRpb25Db29yZGluYXRlKGxuZ0xhdCksIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgcGl4ZWxzUGVyTWV0ZXIobGF0OiBudW1iZXIsIHdvcmxkU2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgbGF0KSAqIHdvcmxkU2l6ZTtcbiAgICB9LFxuXG4gICAgZmFydGhlc3RQaXhlbERpc3RhbmNlKHRyOiBUcmFuc2Zvcm0pOiBudW1iZXIge1xuICAgICAgICBjb25zdCBwaXhlbHNQZXJNZXRlciA9IHRoaXMucGl4ZWxzUGVyTWV0ZXIodHIuY2VudGVyLmxhdCwgdHIud29ybGRTaXplKTtcbiAgICAgICAgcmV0dXJuIGZhcnRoZXN0UGl4ZWxEaXN0YW5jZU9uUGxhbmUodHIsIHBpeGVsc1Blck1ldGVyKTtcbiAgICB9LFxuXG4gICAgY3JlYXRlVGlsZVRyYW5zZm9ybSh0cjogVHJhbnNmb3JtLCB3b3JsZFNpemU6IG51bWJlcik6IE9iamVjdCB7XG4gICAgICAgIHJldHVybiBuZXcgRmxhdFRpbGVUcmFuc2Zvcm0odHIsIHdvcmxkU2l6ZSk7XG4gICAgfVxufTtcbiIsIi8vIEBmbG93XG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2xuZ19sYXQuanMnO1xuaW1wb3J0IHtjbGFtcH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7bWVyY2F0b3JaZnJvbUFsdGl0dWRlLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREV9IGZyb20gJy4uL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IEZsYXRUaWxlVHJhbnNmb3JtIGZyb20gJy4vZmxhdF90aWxlX3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQge2ZhcnRoZXN0UGl4ZWxEaXN0YW5jZU9uUGxhbmV9IGZyb20gJy4vZmFyX3ouanMnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ2VxdWlyZWN0YW5ndWxhcicsXG4gICAgc3VwcG9ydHNXb3JsZENvcGllczogdHJ1ZSxcbiAgICBjZW50ZXI6IFswLCAwXSxcbiAgICByYW5nZTogWzMuNSwgN10sXG4gICAgekF4aXNVbml0OiBcIm1ldGVyc1wiLFxuICAgIHdyYXA6IHRydWUsXG4gICAgaXNSZXByb2plY3RlZEluVGlsZVNwYWNlOiB0cnVlLFxuICAgIHVuc3VwcG9ydGVkTGF5ZXJzOiBbJ2N1c3RvbSddLFxuXG4gICAgcHJvamVjdChsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgeCA9IDAuNSArIGxuZyAvIDM2MDtcbiAgICAgICAgY29uc3QgeSA9IDAuNSAtIGxhdCAvIDM2MDtcbiAgICAgICAgcmV0dXJuIHt4LCB5LCB6OiAwfTtcbiAgICB9LFxuXG4gICAgdW5wcm9qZWN0KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGxuZyA9ICh4IC0gMC41KSAqIDM2MDtcbiAgICAgICAgY29uc3QgbGF0ID0gY2xhbXAoKDAuNSAtIHkpICogMzYwLCAtTUFYX01FUkNBVE9SX0xBVElUVURFLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREUpO1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChsbmcsIGxhdCk7XG4gICAgfSxcblxuICAgIHByb2plY3RUaWxlUG9pbnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0ge1xuICAgICAgICByZXR1cm4ge3gsIHksIHo6IDB9O1xuICAgIH0sXG5cbiAgICBsb2NhdGlvblBvaW50KHRyOiBUcmFuc2Zvcm0sIGxuZ0xhdDogTG5nTGF0KTogUG9pbnQge1xuICAgICAgICByZXR1cm4gdHIuX2Nvb3JkaW5hdGVQb2ludCh0ci5sb2NhdGlvbkNvb3JkaW5hdGUobG5nTGF0KSwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBwaXhlbHNQZXJNZXRlcihsYXQ6IG51bWJlciwgd29ybGRTaXplOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCBsYXQpICogd29ybGRTaXplO1xuICAgIH0sXG5cbiAgICBmYXJ0aGVzdFBpeGVsRGlzdGFuY2UodHI6IFRyYW5zZm9ybSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBpeGVsc1Blck1ldGVyID0gdGhpcy5waXhlbHNQZXJNZXRlcih0ci5jZW50ZXIubGF0LCB0ci53b3JsZFNpemUpO1xuICAgICAgICByZXR1cm4gZmFydGhlc3RQaXhlbERpc3RhbmNlT25QbGFuZSh0ciwgcGl4ZWxzUGVyTWV0ZXIpO1xuICAgIH0sXG5cbiAgICBjcmVhdGVUaWxlVHJhbnNmb3JtKHRyOiBUcmFuc2Zvcm0sIHdvcmxkU2l6ZTogbnVtYmVyKTogT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGbGF0VGlsZVRyYW5zZm9ybSh0ciwgd29ybGRTaXplKTtcbiAgICB9XG59O1xuIiwiLy8gQGZsb3dcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vbG5nX2xhdC5qcyc7XG5pbXBvcnQge2NsYW1wLCBkZWdUb1JhZCwgcmFkVG9EZWd9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge21lcmNhdG9yWmZyb21BbHRpdHVkZSwgTUFYX01FUkNBVE9SX0xBVElUVURFfSBmcm9tICcuLi9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCB7dmVjMn0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBGbGF0VGlsZVRyYW5zZm9ybSBmcm9tICcuL2ZsYXRfdGlsZV90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHtmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lfSBmcm9tICcuL2Zhcl96LmpzJztcblxuY29uc3QgaGFsZlBpID0gTWF0aC5QSSAvIDI7XG5cbmZ1bmN0aW9uIHRhbnkoeSkge1xuICAgIHJldHVybiBNYXRoLnRhbigoaGFsZlBpICsgeSkgLyAyKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdsYW1iZXJ0Q29uZm9ybWFsQ29uaWMnLFxuICAgIHJhbmdlOiBbMy41LCA3XSxcblxuICAgIHpBeGlzVW5pdDogXCJtZXRlcnNcIixcbiAgICBjZW50ZXI6IFswLCAzMF0sXG4gICAgcGFyYWxsZWxzOiBbMzAsIDMwXSxcblxuICAgIGNvbmljOiB0cnVlLFxuICAgIGlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZTogdHJ1ZSxcbiAgICB1bnN1cHBvcnRlZExheWVyczogWydjdXN0b20nXSxcblxuICAgIGluaXRpYWxpemVDb25zdGFudHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnN0YW50cyAmJiB2ZWMyLmV4YWN0RXF1YWxzKHRoaXMucGFyYWxsZWxzLCB0aGlzLmNvbnN0YW50cy5wYXJhbGxlbHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB5MCA9IGRlZ1RvUmFkKHRoaXMucGFyYWxsZWxzWzBdKTtcbiAgICAgICAgY29uc3QgeTEgPSBkZWdUb1JhZCh0aGlzLnBhcmFsbGVsc1sxXSk7XG4gICAgICAgIGNvbnN0IGN5MCA9IE1hdGguY29zKHkwKTtcbiAgICAgICAgY29uc3QgbiA9IHkwID09PSB5MSA/IE1hdGguc2luKHkwKSA6IE1hdGgubG9nKGN5MCAvIE1hdGguY29zKHkxKSkgLyBNYXRoLmxvZyh0YW55KHkxKSAvIHRhbnkoeTApKTtcbiAgICAgICAgY29uc3QgZiA9IGN5MCAqIE1hdGgucG93KHRhbnkoeTApLCBuKSAvIG47XG5cbiAgICAgICAgdGhpcy5jb25zdGFudHMgPSB7biwgZiwgcGFyYWxsZWxzOiB0aGlzLnBhcmFsbGVsc307XG4gICAgfSxcblxuICAgIHByb2plY3QobG5nOiBudW1iZXIsIGxhdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnN0YW50cygpO1xuXG4gICAgICAgIC8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1nZW8sIE1JVC1saWNlbnNlZFxuICAgICAgICBsYXQgPSBkZWdUb1JhZChsYXQpO1xuICAgICAgICBsbmcgPSBkZWdUb1JhZChsbmcgLSB0aGlzLmNlbnRlclswXSk7XG5cbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IDFlLTY7XG4gICAgICAgIGNvbnN0IHtuLCBmfSA9IHRoaXMuY29uc3RhbnRzO1xuXG4gICAgICAgIGlmIChmID4gMCkge1xuICAgICAgICAgICAgaWYgKGxhdCA8IC1oYWxmUGkgKyBlcHNpbG9uKSBsYXQgPSAtaGFsZlBpICsgZXBzaWxvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsYXQgPiBoYWxmUGkgLSBlcHNpbG9uKSBsYXQgPSBoYWxmUGkgLSBlcHNpbG9uO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgciA9IGYgLyBNYXRoLnBvdyh0YW55KGxhdCksIG4pO1xuICAgICAgICBjb25zdCB4ID0gciAqIE1hdGguc2luKG4gKiBsbmcpO1xuICAgICAgICBjb25zdCB5ID0gZiAtIHIgKiBNYXRoLmNvcyhuICogbG5nKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogKHggLyBNYXRoLlBJICsgMC41KSAqIDAuNSxcbiAgICAgICAgICAgIHk6IDEgLSAoeSAvIE1hdGguUEkgKyAwLjUpICogMC41LFxuICAgICAgICAgICAgejogMFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICB1bnByb2plY3QoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplQ29uc3RhbnRzKCk7XG5cbiAgICAgICAgLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLWdlbywgTUlULWxpY2Vuc2VkXG4gICAgICAgIHggPSAoMiAqIHggLSAwLjUpICogTWF0aC5QSTtcbiAgICAgICAgeSA9ICgyICogKDEgLSB5KSAtIDAuNSkgKiBNYXRoLlBJO1xuICAgICAgICBjb25zdCB7biwgZn0gPSB0aGlzLmNvbnN0YW50cztcbiAgICAgICAgY29uc3QgZnkgPSBmIC0geTtcbiAgICAgICAgY29uc3Qgc2lnbkZ5ID0gTWF0aC5zaWduKGZ5KTtcbiAgICAgICAgY29uc3QgciA9IE1hdGguc2lnbihuKSAqIE1hdGguc3FydCh4ICogeCArIGZ5ICogZnkpO1xuICAgICAgICBsZXQgbCA9IE1hdGguYXRhbjIoeCwgTWF0aC5hYnMoZnkpKSAqIHNpZ25GeTtcblxuICAgICAgICBpZiAoZnkgKiBuIDwgMCkgbCAtPSBNYXRoLlBJICogTWF0aC5zaWduKHgpICogc2lnbkZ5O1xuXG4gICAgICAgIGNvbnN0IGxuZyA9IGNsYW1wKHJhZFRvRGVnKGwgLyBuKSArIHRoaXMuY2VudGVyWzBdLCAtMTgwLCAxODApO1xuICAgICAgICBjb25zdCBwaGkgPSAyICogTWF0aC5hdGFuKE1hdGgucG93KGYgLyByLCAxIC8gbikpIC0gaGFsZlBpO1xuICAgICAgICBjb25zdCBsYXQgPSBjbGFtcChyYWRUb0RlZyhwaGkpLCAtTUFYX01FUkNBVE9SX0xBVElUVURFLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KGxuZywgbGF0KTtcbiAgICB9LFxuXG4gICAgcHJvamVjdFRpbGVQb2ludCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSB7XG4gICAgICAgIHJldHVybiB7eCwgeSwgejogMH07XG4gICAgfSxcblxuICAgIGxvY2F0aW9uUG9pbnQodHI6IFRyYW5zZm9ybSwgbG5nTGF0OiBMbmdMYXQpOiBQb2ludCB7XG4gICAgICAgIHJldHVybiB0ci5fY29vcmRpbmF0ZVBvaW50KHRyLmxvY2F0aW9uQ29vcmRpbmF0ZShsbmdMYXQpLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIHBpeGVsc1Blck1ldGVyKGxhdDogbnVtYmVyLCB3b3JsZFNpemU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIGxhdCkgKiB3b3JsZFNpemU7XG4gICAgfSxcblxuICAgIGZhcnRoZXN0UGl4ZWxEaXN0YW5jZSh0cjogVHJhbnNmb3JtKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcGl4ZWxzUGVyTWV0ZXIgPSB0aGlzLnBpeGVsc1Blck1ldGVyKHRyLmNlbnRlci5sYXQsIHRyLndvcmxkU2l6ZSk7XG4gICAgICAgIHJldHVybiBmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lKHRyLCBwaXhlbHNQZXJNZXRlcik7XG4gICAgfSxcblxuICAgIGNyZWF0ZVRpbGVUcmFuc2Zvcm0odHI6IFRyYW5zZm9ybSwgd29ybGRTaXplOiBudW1iZXIpOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4gbmV3IEZsYXRUaWxlVHJhbnNmb3JtKHRyLCB3b3JsZFNpemUpO1xuICAgIH1cbn07XG4iLCIvLyBAZmxvd1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9sbmdfbGF0LmpzJztcbmltcG9ydCB7XG4gICAgbWVyY2F0b3JYZnJvbUxuZyxcbiAgICBtZXJjYXRvcllmcm9tTGF0LFxuICAgIG1lcmNhdG9yWmZyb21BbHRpdHVkZSxcbiAgICBsbmdGcm9tTWVyY2F0b3JYLFxuICAgIGxhdEZyb21NZXJjYXRvcllcbn0gZnJvbSAnLi4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgRmxhdFRpbGVUcmFuc2Zvcm0gZnJvbSAnLi9mbGF0X3RpbGVfdHJhbnNmb3JtLmpzJztcbmltcG9ydCB7ZmFydGhlc3RQaXhlbERpc3RhbmNlT25QbGFuZX0gZnJvbSAnLi9mYXJfei5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBuYW1lOiAnbWVyY2F0b3InLFxuICAgIHdyYXA6IHRydWUsXG4gICAgcmVxdWlyZXNEcmFwaW5nOiBmYWxzZSxcbiAgICBzdXBwb3J0c1dvcmxkQ29waWVzOiB0cnVlLFxuICAgIHN1cHBvcnRzVGVycmFpbjogdHJ1ZSxcbiAgICBzdXBwb3J0c0ZvZzogdHJ1ZSxcbiAgICBzdXBwb3J0c0ZyZWVDYW1lcmE6IHRydWUsXG4gICAgekF4aXNVbml0OiBcIm1ldGVyc1wiLFxuICAgIGNlbnRlcjogWzAsIDBdLFxuXG4gICAgcHJvamVjdChsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgeCA9IG1lcmNhdG9yWGZyb21MbmcobG5nKTtcbiAgICAgICAgY29uc3QgeSA9IG1lcmNhdG9yWWZyb21MYXQobGF0KTtcbiAgICAgICAgcmV0dXJuIHt4LCB5LCB6OiAwfTtcbiAgICB9LFxuXG4gICAgdW5wcm9qZWN0KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGxuZyA9IGxuZ0Zyb21NZXJjYXRvclgoeCk7XG4gICAgICAgIGNvbnN0IGxhdCA9IGxhdEZyb21NZXJjYXRvclkoeSk7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KGxuZywgbGF0KTtcbiAgICB9LFxuXG4gICAgcHJvamVjdFRpbGVQb2ludCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSB7XG4gICAgICAgIHJldHVybiB7eCwgeSwgejogMH07XG4gICAgfSxcblxuICAgIGxvY2F0aW9uUG9pbnQodHI6IFRyYW5zZm9ybSwgbG5nTGF0OiBMbmdMYXQpOiBQb2ludCB7XG4gICAgICAgIHJldHVybiB0ci5fY29vcmRpbmF0ZVBvaW50KHRyLmxvY2F0aW9uQ29vcmRpbmF0ZShsbmdMYXQpLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIHBpeGVsc1Blck1ldGVyKGxhdDogbnVtYmVyLCB3b3JsZFNpemU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIGxhdCkgKiB3b3JsZFNpemU7XG4gICAgfSxcblxuICAgIGZhcnRoZXN0UGl4ZWxEaXN0YW5jZSh0cjogVHJhbnNmb3JtKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcGl4ZWxzUGVyTWV0ZXIgPSB0aGlzLnBpeGVsc1Blck1ldGVyKHRyLmNlbnRlci5sYXQsIHRyLndvcmxkU2l6ZSk7XG4gICAgICAgIHJldHVybiBmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lKHRyLCBwaXhlbHNQZXJNZXRlcik7XG4gICAgfSxcblxuICAgIGNyZWF0ZVRpbGVUcmFuc2Zvcm0odHI6IFRyYW5zZm9ybSwgd29ybGRTaXplOiBudW1iZXIpOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4gbmV3IEZsYXRUaWxlVHJhbnNmb3JtKHRyLCB3b3JsZFNpemUpO1xuICAgIH1cbn07XG4iLCIvLyBAZmxvd1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9sbmdfbGF0LmpzJztcbmltcG9ydCB7Y2xhbXAsIGRlZ1RvUmFkLCByYWRUb0RlZ30gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7bWVyY2F0b3JaZnJvbUFsdGl0dWRlLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREV9IGZyb20gJy4uL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IEZsYXRUaWxlVHJhbnNmb3JtIGZyb20gJy4vZmxhdF90aWxlX3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQge2ZhcnRoZXN0UGl4ZWxEaXN0YW5jZU9uUGxhbmV9IGZyb20gJy4vZmFyX3ouanMnO1xuXG5jb25zdCBtYXhQaGkgPSBkZWdUb1JhZChNQVhfTUVSQ0FUT1JfTEFUSVRVREUpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgbmFtZTogJ25hdHVyYWxFYXJ0aCcsXG4gICAgY2VudGVyOiBbMCwgMF0sXG4gICAgcmFuZ2U6IFszLjUsIDddLFxuICAgIGlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZTogdHJ1ZSxcbiAgICB6QXhpc1VuaXQ6IFwibWV0ZXJzXCIsXG4gICAgdW5zdXBwb3J0ZWRMYXllcnM6IFsnY3VzdG9tJ10sXG5cbiAgICBwcm9qZWN0KGxuZzogbnVtYmVyLCBsYXQ6IG51bWJlcikge1xuICAgICAgICAvLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtZ2VvLCBNSVQtbGljZW5zZWRcbiAgICAgICAgbGF0ID0gZGVnVG9SYWQobGF0KTtcbiAgICAgICAgbG5nID0gZGVnVG9SYWQobG5nKTtcblxuICAgICAgICBjb25zdCBwaGkyID0gbGF0ICogbGF0O1xuICAgICAgICBjb25zdCBwaGk0ID0gcGhpMiAqIHBoaTI7XG4gICAgICAgIGNvbnN0IHggPSBsbmcgKiAoMC44NzA3IC0gMC4xMzE5NzkgKiBwaGkyICsgcGhpNCAqICgtMC4wMTM3OTEgKyBwaGk0ICogKDAuMDAzOTcxICogcGhpMiAtIDAuMDAxNTI5ICogcGhpNCkpKTtcbiAgICAgICAgY29uc3QgeSA9IGxhdCAqICgxLjAwNzIyNiArIHBoaTIgKiAoMC4wMTUwODUgKyBwaGk0ICogKC0wLjA0NDQ3NSArIDAuMDI4ODc0ICogcGhpMiAtIDAuMDA1OTE2ICogcGhpNCkpKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogKHggLyBNYXRoLlBJICsgMC41KSAqIDAuNSxcbiAgICAgICAgICAgIHk6IDEgLSAoeSAvIE1hdGguUEkgKyAxKSAqIDAuNSxcbiAgICAgICAgICAgIHo6IDBcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgdW5wcm9qZWN0KHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIC8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1nZW8sIE1JVC1saWNlbnNlZFxuICAgICAgICB4ID0gKDIgKiB4IC0gMC41KSAqIE1hdGguUEk7XG4gICAgICAgIHkgPSAoMiAqICgxIC0geSkgLSAxKSAqIE1hdGguUEk7XG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSAxZS02O1xuICAgICAgICBsZXQgcGhpID0geTtcbiAgICAgICAgbGV0IGkgPSAyNTtcbiAgICAgICAgbGV0IGRlbHRhID0gMDtcbiAgICAgICAgbGV0IHBoaTIgPSBwaGkgKiBwaGk7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgcGhpMiA9IHBoaSAqIHBoaTtcbiAgICAgICAgICAgIGNvbnN0IHBoaTQgPSBwaGkyICogcGhpMjtcbiAgICAgICAgICAgIGRlbHRhID0gKHBoaSAqICgxLjAwNzIyNiArIHBoaTIgKiAoMC4wMTUwODUgKyBwaGk0ICogKC0wLjA0NDQ3NSArIDAuMDI4ODc0ICogcGhpMiAtIDAuMDA1OTE2ICogcGhpNCkpKSAtIHkpIC9cbiAgICAgICAgICAgICAgICAoMS4wMDcyMjYgKyBwaGkyICogKDAuMDE1MDg1ICogMyArIHBoaTQgKiAoLTAuMDQ0NDc1ICogNyArIDAuMDI4ODc0ICogOSAqIHBoaTIgLSAwLjAwNTkxNiAqIDExICogcGhpNCkpKTtcbiAgICAgICAgICAgIHBoaSA9IGNsYW1wKHBoaSAtIGRlbHRhLCAtbWF4UGhpLCBtYXhQaGkpO1xuICAgICAgICB9IHdoaWxlIChNYXRoLmFicyhkZWx0YSkgPiBlcHNpbG9uICYmIC0taSA+IDApO1xuXG4gICAgICAgIHBoaTIgPSBwaGkgKiBwaGk7XG4gICAgICAgIGNvbnN0IGxhbWJkYSA9IHggLyAoMC44NzA3ICsgcGhpMiAqICgtMC4xMzE5NzkgKyBwaGkyICogKC0wLjAxMzc5MSArIHBoaTIgKiBwaGkyICogcGhpMiAqICgwLjAwMzk3MSAtIDAuMDAxNTI5ICogcGhpMikpKSk7XG5cbiAgICAgICAgY29uc3QgbG5nID0gY2xhbXAocmFkVG9EZWcobGFtYmRhKSwgLTE4MCwgMTgwKTtcbiAgICAgICAgY29uc3QgbGF0ID0gcmFkVG9EZWcocGhpKTtcblxuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChsbmcsIGxhdCk7XG4gICAgfSxcblxuICAgIHByb2plY3RUaWxlUG9pbnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0ge1xuICAgICAgICByZXR1cm4ge3gsIHksIHo6IDB9O1xuICAgIH0sXG5cbiAgICBsb2NhdGlvblBvaW50KHRyOiBUcmFuc2Zvcm0sIGxuZ0xhdDogTG5nTGF0KTogUG9pbnQge1xuICAgICAgICByZXR1cm4gdHIuX2Nvb3JkaW5hdGVQb2ludCh0ci5sb2NhdGlvbkNvb3JkaW5hdGUobG5nTGF0KSwgZmFsc2UpO1xuICAgIH0sXG5cbiAgICBwaXhlbHNQZXJNZXRlcihsYXQ6IG51bWJlciwgd29ybGRTaXplOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCBsYXQpICogd29ybGRTaXplO1xuICAgIH0sXG5cbiAgICBmYXJ0aGVzdFBpeGVsRGlzdGFuY2UodHI6IFRyYW5zZm9ybSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBpeGVsc1Blck1ldGVyID0gdGhpcy5waXhlbHNQZXJNZXRlcih0ci5jZW50ZXIubGF0LCB0ci53b3JsZFNpemUpO1xuICAgICAgICByZXR1cm4gZmFydGhlc3RQaXhlbERpc3RhbmNlT25QbGFuZSh0ciwgcGl4ZWxzUGVyTWV0ZXIpO1xuICAgIH0sXG5cbiAgICBjcmVhdGVUaWxlVHJhbnNmb3JtKHRyOiBUcmFuc2Zvcm0sIHdvcmxkU2l6ZTogbnVtYmVyKTogT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGbGF0VGlsZVRyYW5zZm9ybSh0ciwgd29ybGRTaXplKTtcbiAgICB9XG59O1xuIiwiLy8gQGZsb3dcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vbG5nX2xhdC5qcyc7XG5pbXBvcnQge2NsYW1wLCBkZWdUb1JhZCwgcmFkVG9EZWd9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge21lcmNhdG9yWmZyb21BbHRpdHVkZSwgTUFYX01FUkNBVE9SX0xBVElUVURFfSBmcm9tICcuLi9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBGbGF0VGlsZVRyYW5zZm9ybSBmcm9tICcuL2ZsYXRfdGlsZV90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHtmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lfSBmcm9tICcuL2Zhcl96LmpzJztcblxuY29uc3QgbWF4UGhpID0gZGVnVG9SYWQoTUFYX01FUkNBVE9SX0xBVElUVURFKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICd3aW5rZWxUcmlwZWwnLFxuICAgIGNlbnRlcjogWzAsIDBdLFxuICAgIHJhbmdlOiBbMy41LCA3XSxcbiAgICB6QXhpc1VuaXQ6IFwibWV0ZXJzXCIsXG4gICAgaXNSZXByb2plY3RlZEluVGlsZVNwYWNlOiB0cnVlLFxuICAgIHVuc3VwcG9ydGVkTGF5ZXJzOiBbJ2N1c3RvbSddLFxuXG4gICAgcHJvamVjdChsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICAgICAgbGF0ID0gZGVnVG9SYWQobGF0KTtcbiAgICAgICAgbG5nID0gZGVnVG9SYWQobG5nKTtcbiAgICAgICAgY29uc3QgY29zTGF0ID0gTWF0aC5jb3MobGF0KTtcbiAgICAgICAgY29uc3QgdHdvT3ZlclBpID0gMiAvIE1hdGguUEk7XG4gICAgICAgIGNvbnN0IGFscGhhID0gTWF0aC5hY29zKGNvc0xhdCAqIE1hdGguY29zKGxuZyAvIDIpKTtcbiAgICAgICAgY29uc3Qgc2luQWxwaGFPdmVyQWxwaGEgPSBNYXRoLnNpbihhbHBoYSkgLyBhbHBoYTtcbiAgICAgICAgY29uc3QgeCA9IDAuNSAqIChsbmcgKiB0d29PdmVyUGkgKyAoMiAqIGNvc0xhdCAqIE1hdGguc2luKGxuZyAvIDIpKSAvIHNpbkFscGhhT3ZlckFscGhhKSB8fCAwO1xuICAgICAgICBjb25zdCB5ID0gMC41ICogKGxhdCArIE1hdGguc2luKGxhdCkgLyBzaW5BbHBoYU92ZXJBbHBoYSkgfHwgMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6ICh4IC8gTWF0aC5QSSArIDAuNSkgKiAwLjUsXG4gICAgICAgICAgICB5OiAxIC0gKHkgLyBNYXRoLlBJICsgMSkgKiAwLjUsXG4gICAgICAgICAgICB6OiAwXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIHVucHJvamVjdCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgICAgICAvLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtZ2VvLXByb2plY3Rpb24sIE1JVC1saWNlbnNlZFxuICAgICAgICB4ID0gKDIgKiB4IC0gMC41KSAqIE1hdGguUEk7XG4gICAgICAgIHkgPSAoMiAqICgxIC0geSkgLSAxKSAqIE1hdGguUEk7XG4gICAgICAgIGxldCBsYW1iZGEgPSB4O1xuICAgICAgICBsZXQgcGhpID0geTtcbiAgICAgICAgbGV0IGkgPSAyNTtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IDFlLTY7XG4gICAgICAgIGxldCBkbGFtYmRhID0gMCwgZHBoaSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvbnN0IGNvc3BoaSA9IE1hdGguY29zKHBoaSksXG4gICAgICAgICAgICAgICAgc2lucGhpID0gTWF0aC5zaW4ocGhpKSxcbiAgICAgICAgICAgICAgICBzaW5waGkyID0gMiAqIHNpbnBoaSAqIGNvc3BoaSxcbiAgICAgICAgICAgICAgICBzaW4ycGhpID0gc2lucGhpICogc2lucGhpLFxuICAgICAgICAgICAgICAgIGNvczJwaGkgPSBjb3NwaGkgKiBjb3NwaGksXG4gICAgICAgICAgICAgICAgY29zbGFtYmRhMiA9IE1hdGguY29zKGxhbWJkYSAvIDIpLFxuICAgICAgICAgICAgICAgIHNpbmxhbWJkYTIgPSBNYXRoLnNpbihsYW1iZGEgLyAyKSxcbiAgICAgICAgICAgICAgICBzaW5sYW1iZGEgPSAyICogY29zbGFtYmRhMiAqIHNpbmxhbWJkYTIsXG4gICAgICAgICAgICAgICAgc2luMmxhbWJkYTIgPSBzaW5sYW1iZGEyICogc2lubGFtYmRhMixcbiAgICAgICAgICAgICAgICBDID0gMSAtIGNvczJwaGkgKiBjb3NsYW1iZGEyICogY29zbGFtYmRhMixcbiAgICAgICAgICAgICAgICBGID0gQyA/IDEgLyBDIDogMCxcbiAgICAgICAgICAgICAgICBFID0gQyA/IE1hdGguYWNvcyhjb3NwaGkgKiBjb3NsYW1iZGEyKSAqIE1hdGguc3FydCgxIC8gQykgOiAwLFxuICAgICAgICAgICAgICAgIGZ4ID0gMC41ICogKDIgKiBFICogY29zcGhpICogc2lubGFtYmRhMiArIGxhbWJkYSAqIDIgLyBNYXRoLlBJKSAtIHgsXG4gICAgICAgICAgICAgICAgZnkgPSAwLjUgKiAoRSAqIHNpbnBoaSArIHBoaSkgLSB5LFxuICAgICAgICAgICAgICAgIGR4ZGxhbWJkYSA9IDAuNSAqIEYgKiAoY29zMnBoaSAqIHNpbjJsYW1iZGEyICsgRSAqIGNvc3BoaSAqIGNvc2xhbWJkYTIgKiBzaW4ycGhpKSArIDEgLyBNYXRoLlBJLFxuICAgICAgICAgICAgICAgIGR4ZHBoaSA9IEYgKiAoc2lubGFtYmRhICogc2lucGhpMiAvIDQgLSBFICogc2lucGhpICogc2lubGFtYmRhMiksXG4gICAgICAgICAgICAgICAgZHlkbGFtYmRhID0gMC4xMjUgKiBGICogKHNpbnBoaTIgKiBzaW5sYW1iZGEyIC0gRSAqIHNpbnBoaSAqIGNvczJwaGkgKiBzaW5sYW1iZGEpLFxuICAgICAgICAgICAgICAgIGR5ZHBoaSA9IDAuNSAqIEYgKiAoc2luMnBoaSAqIGNvc2xhbWJkYTIgKyBFICogc2luMmxhbWJkYTIgKiBjb3NwaGkpICsgMC41LFxuICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gZHhkcGhpICogZHlkbGFtYmRhIC0gZHlkcGhpICogZHhkbGFtYmRhO1xuXG4gICAgICAgICAgICBkbGFtYmRhID0gKGZ5ICogZHhkcGhpIC0gZnggKiBkeWRwaGkpIC8gZGVub21pbmF0b3I7XG4gICAgICAgICAgICBkcGhpID0gKGZ4ICogZHlkbGFtYmRhIC0gZnkgKiBkeGRsYW1iZGEpIC8gZGVub21pbmF0b3I7XG4gICAgICAgICAgICBsYW1iZGEgPSBjbGFtcChsYW1iZGEgLSBkbGFtYmRhLCAtTWF0aC5QSSwgTWF0aC5QSSk7XG4gICAgICAgICAgICBwaGkgPSBjbGFtcChwaGkgLSBkcGhpLCAtbWF4UGhpLCBtYXhQaGkpO1xuXG4gICAgICAgIH0gd2hpbGUgKChNYXRoLmFicyhkbGFtYmRhKSA+IGVwc2lsb24gfHwgTWF0aC5hYnMoZHBoaSkgPiBlcHNpbG9uKSAmJiAtLWkgPiAwKTtcblxuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChyYWRUb0RlZyhsYW1iZGEpLCByYWRUb0RlZyhwaGkpKTtcbiAgICB9LFxuXG4gICAgcHJvamVjdFRpbGVQb2ludCh4OiBudW1iZXIsIHk6IG51bWJlcik6IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSB7XG4gICAgICAgIHJldHVybiB7eCwgeSwgejogMH07XG4gICAgfSxcblxuICAgIGxvY2F0aW9uUG9pbnQodHI6IFRyYW5zZm9ybSwgbG5nTGF0OiBMbmdMYXQpOiBQb2ludCB7XG4gICAgICAgIHJldHVybiB0ci5fY29vcmRpbmF0ZVBvaW50KHRyLmxvY2F0aW9uQ29vcmRpbmF0ZShsbmdMYXQpLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIHBpeGVsc1Blck1ldGVyKGxhdDogbnVtYmVyLCB3b3JsZFNpemU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIGxhdCkgKiB3b3JsZFNpemU7XG4gICAgfSxcblxuICAgIGZhcnRoZXN0UGl4ZWxEaXN0YW5jZSh0cjogVHJhbnNmb3JtKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcGl4ZWxzUGVyTWV0ZXIgPSB0aGlzLnBpeGVsc1Blck1ldGVyKHRyLmNlbnRlci5sYXQsIHRyLndvcmxkU2l6ZSk7XG4gICAgICAgIHJldHVybiBmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lKHRyLCBwaXhlbHNQZXJNZXRlcik7XG4gICAgfSxcblxuICAgIGNyZWF0ZVRpbGVUcmFuc2Zvcm0odHI6IFRyYW5zZm9ybSwgd29ybGRTaXplOiBudW1iZXIpOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4gbmV3IEZsYXRUaWxlVHJhbnNmb3JtKHRyLCB3b3JsZFNpemUpO1xuICAgIH1cbn07XG4iLCIvLyBAZmxvd1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9sbmdfbGF0LmpzJztcbmltcG9ydCB7Y2xhbXAsIGRlZ1RvUmFkLCByYWRUb0RlZ30gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7TUFYX01FUkNBVE9SX0xBVElUVURFfSBmcm9tICcuLi9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ocGhpOiBudW1iZXIpIHtcbiAgICBjb25zdCBjb3NQaGkgPSBNYXRoLm1heCgwLjAxLCBNYXRoLmNvcyhkZWdUb1JhZChwaGkpKSk7XG4gICAgLy8gc2NhbGUgY29vcmRpbmF0ZXMgYmV0d2VlbiAwIGFuZCAxIHRvIGF2b2lkIGNvbnN0cmFpbnQgaXNzdWVzXG4gICAgY29uc3Qgc2NhbGUgPSAxIC8gKDIgKiBNYXRoLm1heChNYXRoLlBJICogY29zUGhpLCAxIC8gY29zUGhpKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB3cmFwOiB0cnVlLFxuICAgICAgICBzdXBwb3J0c1dvcmxkQ29waWVzOiB0cnVlLFxuICAgICAgICB1bnN1cHBvcnRlZExheWVyczogWydjdXN0b20nXSxcbiAgICAgICAgcHJvamVjdChsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHggPSBkZWdUb1JhZChsbmcpICogY29zUGhpO1xuICAgICAgICAgICAgY29uc3QgeSA9IE1hdGguc2luKGRlZ1RvUmFkKGxhdCkpIC8gY29zUGhpO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHg6ICh4ICogc2NhbGUpICsgMC41LFxuICAgICAgICAgICAgICAgIHk6ICgteSAqIHNjYWxlKSArIDAuNSxcbiAgICAgICAgICAgICAgICB6OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICB1bnByb2plY3QoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHhfID0gKHggLSAwLjUpIC8gc2NhbGU7XG4gICAgICAgICAgICBjb25zdCB5XyA9IC0oeSAtIDAuNSkgLyBzY2FsZTtcbiAgICAgICAgICAgIGNvbnN0IGxuZyA9IGNsYW1wKHJhZFRvRGVnKHhfKSAvIGNvc1BoaSwgLTE4MCwgMTgwKTtcbiAgICAgICAgICAgIGNvbnN0IHkyID0geV8gKiBjb3NQaGk7XG4gICAgICAgICAgICBjb25zdCB5MyA9IE1hdGguYXNpbihjbGFtcCh5MiwgLTEsIDEpKTtcbiAgICAgICAgICAgIGNvbnN0IGxhdCA9IGNsYW1wKHJhZFRvRGVnKHkzKSwgLU1BWF9NRVJDQVRPUl9MQVRJVFVERSwgTUFYX01FUkNBVE9SX0xBVElUVURFKTtcblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQobG5nLCBsYXQpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgYWxiZXJzIGZyb20gJy4vYWxiZXJzLmpzJztcbmltcG9ydCBlcXVhbEVhcnRoIGZyb20gJy4vZXF1YWxfZWFydGguanMnO1xuaW1wb3J0IGVxdWlyZWN0YW5ndWxhciBmcm9tICcuL2VxdWlyZWN0YW5ndWxhci5qcyc7XG5pbXBvcnQgbGFtYmVydENvbmZvcm1hbENvbmljIGZyb20gJy4vbGFtYmVydC5qcyc7XG5pbXBvcnQgbWVyY2F0b3IgZnJvbSAnLi9tZXJjYXRvci5qcyc7XG5pbXBvcnQgbmF0dXJhbEVhcnRoIGZyb20gJy4vbmF0dXJhbF9lYXJ0aC5qcyc7XG5pbXBvcnQgd2lua2VsVHJpcGVsIGZyb20gJy4vd2lua2VsX3RyaXBlbC5qcyc7XG5pbXBvcnQgY3lsaW5kcmljYWxFcXVhbEFyZWEgZnJvbSAnLi9jeWxpbmRyaWNhbF9lcXVhbF9hcmVhLmpzJztcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3Rpb25TcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB7bWF0NCwgdmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7Q2Fub25pY2FsVGlsZUlELCBVbndyYXBwZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCBUcmFuc2Zvcm0gZnJvbSAnLi4vdHJhbnNmb3JtLmpzJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vbG5nX2xhdC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4uL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuXG5leHBvcnQgdHlwZSBQcm9qZWN0aW9uID0ge1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjZW50ZXI6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcGFyYWxsZWxzPzogW251bWJlciwgbnVtYmVyXSxcbiAgICByYW5nZT86IFtudW1iZXIsIG51bWJlcl0sXG4gICAgY29uaWM/OiBib29sZWFuLFxuICAgIHdyYXA/OiBib29sZWFuLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICByZXF1aXJlc0RyYXBpbmc/OiBib29sZWFuLFxuICAgIHN1cHBvcnRzVGVycmFpbj86IGJvb2xlYW47XG4gICAgc3VwcG9ydHNGb2c/OiBib29sZWFuO1xuICAgIHN1cHBvcnRzRnJlZUNhbWVyYT86IGJvb2xlYW4sXG4gICAgc3VwcG9ydHNXb3JsZENvcGllcz86IGJvb2xlYW4sXG4gICAgdW5zdXBwb3J0ZWRMYXllcnM/OiBBcnJheTxzdHJpbmc+LFxuXG4gICAgLy8gV2hldGhlciB0aGUgcHJvamVjdGlvbiByZXByb2plY3RzIGRhdGEgaW4gdGlsZSBzcGFjZVxuICAgIGlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZT86IGJvb2xlYW47XG4gICAgekF4aXNVbml0OiBcIm1ldGVyc1wiIHwgXCJwaXhlbHNcIixcbiAgICBwcm9qZWN0OiAobG5nOiBudW1iZXIsIGxhdDogbnVtYmVyKSA9PiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sXG4gICAgdW5wcm9qZWN0OiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IExuZ0xhdCxcbiAgICBsb2NhdGlvblBvaW50OiAodHI6IFRyYW5zZm9ybSwgbG5nTGF0OiBMbmdMYXQpID0+IFBvaW50LFxuICAgIHByb2plY3RUaWxlUG9pbnQ6ICh4OiBudW1iZXIsIHk6IG51bWJlciwgaWQ6IENhbm9uaWNhbFRpbGVJRCkgPT4ge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LFxuICAgIHBpeGVsc1Blck1ldGVyOiAobGF0OiBudW1iZXIsIHdvcmxkU2l6ZTogbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgZmFydGhlc3RQaXhlbERpc3RhbmNlOiAodHI6IFRyYW5zZm9ybSkgPT4gbnVtYmVyLFxuICAgIGNyZWF0ZVRpbGVUcmFuc2Zvcm06ICh0cjogVHJhbnNmb3JtLCB3b3JsZFNpemU6IG51bWJlcikgPT4gVGlsZVRyYW5zZm9ybSxcbn07XG5cbmNvbnN0IHByb2plY3Rpb25zID0ge1xuICAgIGFsYmVycyxcbiAgICBlcXVhbEVhcnRoLFxuICAgIGVxdWlyZWN0YW5ndWxhcixcbiAgICBsYW1iZXJ0Q29uZm9ybWFsQ29uaWMsXG4gICAgbWVyY2F0b3IsXG4gICAgbmF0dXJhbEVhcnRoLFxuICAgIHdpbmtlbFRyaXBlbFxufTtcblxuZnVuY3Rpb24gZ2V0Q29uaWNQcm9qZWN0aW9uKHByb2plY3Rpb246IFByb2plY3Rpb24sIGNvbmZpZzogUHJvamVjdGlvblNwZWNpZmljYXRpb24pIHtcbiAgICBpZiAoY29uZmlnLnBhcmFsbGVscykge1xuICAgICAgICAvLyBwYXJhbGxlbHMgdGhhdCBhcmUgZXF1YWwgYnV0IHdpdGggb3Bwb3NpdGUgc2lnbnMgKGUuZy4gWzEwLCAtMTBdKVxuICAgICAgICAvLyBjcmVhdGUgYSBjeWxpbmRyaWNhbCBwcm9qZWN0aW9uIHNvIHdlIHJlcGxhY2UgdGhlXG4gICAgICAgIC8vIHByb2plY3QgYW5kIHVucHJvamVjdCBmdW5jdGlvbnMgd2l0aCBlcXVpdmFsZW50IGN5bGluZHJpY2FsIHZlcnNpb25zXG4gICAgICAgIGlmIChNYXRoLmFicyhjb25maWcucGFyYWxsZWxzWzBdICsgY29uZmlnLnBhcmFsbGVsc1sxXSkgPCAwLjAxKSB7XG4gICAgICAgICAgICBsZXQgY3lsaW5kcmljYWxGdW5jdGlvbnMgPSBjeWxpbmRyaWNhbEVxdWFsQXJlYSgoY29uZmlnOiBhbnkpLnBhcmFsbGVsc1swXSk7XG5cbiAgICAgICAgICAgIGlmIChjb25maWcubmFtZSA9PT0gJ2xhbWJlcnRDb25mb3JtYWxDb25pYycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7cHJvamVjdCwgdW5wcm9qZWN0fSA9IHByb2plY3Rpb25zWydtZXJjYXRvciddO1xuICAgICAgICAgICAgICAgIGN5bGluZHJpY2FsRnVuY3Rpb25zID0ge3dyYXA6IHRydWUsIHN1cHBvcnRzV29ybGRDb3BpZXM6IHRydWUsIHByb2plY3QsIHVucHJvamVjdH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBleHRlbmQoe30sIHByb2plY3Rpb24sIGNvbmZpZywgY3lsaW5kcmljYWxGdW5jdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4dGVuZCh7fSwgcHJvamVjdGlvbiwgY29uZmlnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb2plY3Rpb24oY29uZmlnOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbikge1xuICAgIGNvbnN0IHByb2plY3Rpb24gPSBwcm9qZWN0aW9uc1tjb25maWcubmFtZV07XG4gICAgaWYgKCFwcm9qZWN0aW9uKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJvamVjdGlvbiBuYW1lOiAke2NvbmZpZy5uYW1lfWApO1xuICAgIHJldHVybiBwcm9qZWN0aW9uLmNvbmljID8gZ2V0Q29uaWNQcm9qZWN0aW9uKHByb2plY3Rpb24sIGNvbmZpZykgOiBwcm9qZWN0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBUaWxlVHJhbnNmb3JtID0ge1xuICAgIGNyZWF0ZVRpbGVNYXRyaXg6IChpZDogVW53cmFwcGVkVGlsZUlEKSA9PiBtYXQ0LFxuICAgIGNyZWF0ZUludmVyc2lvbk1hdHJpeDogKGlkOiBVbndyYXBwZWRUaWxlSUQpID0+IG1hdDQsXG4gICAgdXBWZWN0b3I6IChpZDogQ2Fub25pY2FsVGlsZUlELCB4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gdmVjMyxcbiAgICB1cFZlY3RvclNjYWxlOiAoaWQ6IENhbm9uaWNhbFRpbGVJRCkgPT4gbnVtYmVyLFxuICAgIHBvaW50Q29vcmRpbmF0ZTogKHg6IG51bWJlciwgeTogbnVtYmVyLCB6PzogbnVtYmVyKSA9PiBNZXJjYXRvckNvb3JkaW5hdGVcbn07XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtudW1iZXJ9IGZyb20gXCIuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUuanNcIjtcbmltcG9ydCBQb2ludCAgZnJvbSBcIkBtYXBib3gvcG9pbnQtZ2VvbWV0cnlcIjtcbmltcG9ydCB7Y2xhbXB9IGZyb20gXCIuLi91dGlsL3V0aWwuanNcIjtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQW4gYEVkZ2VJbnNldGAgb2JqZWN0IHJlcHJlc2VudHMgc2NyZWVuIHNwYWNlIHBhZGRpbmcgYXBwbGllZCB0byB0aGUgZWRnZXMgb2YgdGhlIHZpZXdwb3J0LlxuICogVGhpcyBzaGlmdHMgdGhlIGFwcGFyZW50IGNlbnRlciBvciB0aGUgdmFuaXNoaW5nIHBvaW50IG9mIHRoZSBtYXAuIFRoaXMgaXMgdXNlZnVsIGZvciBhZGRpbmcgZmxvYXRpbmcgVUkgZWxlbWVudHNcbiAqIG9uIHRvcCBvZiB0aGUgbWFwIGFuZCBoYXZpbmcgdGhlIHZhbmlzaGluZyBwb2ludCBzaGlmdCBhcyBVSSBlbGVtZW50cyByZXNpemUuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFt0b3A9MF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYm90dG9tPTBdXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlZnQ9MF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbcmlnaHQ9MF1cbiAqL1xuY2xhc3MgRWRnZUluc2V0cyB7XG4gICAgdG9wOiBudW1iZXI7XG4gICAgYm90dG9tOiBudW1iZXI7XG4gICAgbGVmdDogbnVtYmVyO1xuICAgIHJpZ2h0OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih0b3A6IG51bWJlciA9IDAsIGJvdHRvbTogbnVtYmVyID0gMCwgbGVmdDogbnVtYmVyID0gMCwgcmlnaHQ6IG51bWJlciA9IDApIHtcbiAgICAgICAgaWYgKGlzTmFOKHRvcCkgfHwgdG9wIDwgMCB8fFxuICAgICAgICAgICAgaXNOYU4oYm90dG9tKSB8fCBib3R0b20gPCAwIHx8XG4gICAgICAgICAgICBpc05hTihsZWZ0KSB8fCBsZWZ0IDwgMCB8fFxuICAgICAgICAgICAgaXNOYU4ocmlnaHQpIHx8IHJpZ2h0IDwgMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgZWRnZS1pbnNldHMsIHRvcCwgYm90dG9tLCBsZWZ0IGFuZCByaWdodCBtdXN0IGFsbCBiZSBudW1iZXJzJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICAgICAgdGhpcy5ib3R0b20gPSBib3R0b207XG4gICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7XG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcnBvbGF0ZXMgdGhlIGluc2V0IGluLXBsYWNlLlxuICAgICAqIFRoaXMgbWFpbnRhaW5zIHRoZSBjdXJyZW50IGluc2V0IHZhbHVlIGZvciBhbnkgaW5zZXQgbm90IHByZXNlbnQgaW4gYHRhcmdldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7UGFkZGluZ09wdGlvbnMgfCBFZGdlSW5zZXRzfSBzdGFydCBUaGUgaW5pdGlhbCBwYWRkaW5nIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtQYWRkaW5nT3B0aW9uc30gdGFyZ2V0IFRoZSB0YXJnZXQgcGFkZGluZyBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSBpbnRlcnBvbGF0aW9uIHZhcmlhYmxlLlxuICAgICAqIEByZXR1cm5zIHtFZGdlSW5zZXRzfSBUaGUgaW50ZXJwb2xhdGVkIGVkZ2UgaW5zZXRzLlxuICAgICAqIEBtZW1iZXJvZiBFZGdlSW5zZXRzXG4gICAgICovXG4gICAgaW50ZXJwb2xhdGUoc3RhcnQ6IFBhZGRpbmdPcHRpb25zIHwgRWRnZUluc2V0cywgdGFyZ2V0OiBQYWRkaW5nT3B0aW9ucywgdDogbnVtYmVyKTogRWRnZUluc2V0cyB7XG4gICAgICAgIGlmICh0YXJnZXQudG9wICE9IG51bGwgJiYgc3RhcnQudG9wICE9IG51bGwpIHRoaXMudG9wID0gbnVtYmVyKHN0YXJ0LnRvcCwgdGFyZ2V0LnRvcCwgdCk7XG4gICAgICAgIGlmICh0YXJnZXQuYm90dG9tICE9IG51bGwgJiYgc3RhcnQuYm90dG9tICE9IG51bGwpIHRoaXMuYm90dG9tID0gbnVtYmVyKHN0YXJ0LmJvdHRvbSwgdGFyZ2V0LmJvdHRvbSwgdCk7XG4gICAgICAgIGlmICh0YXJnZXQubGVmdCAhPSBudWxsICYmIHN0YXJ0LmxlZnQgIT0gbnVsbCkgdGhpcy5sZWZ0ID0gbnVtYmVyKHN0YXJ0LmxlZnQsIHRhcmdldC5sZWZ0LCB0KTtcbiAgICAgICAgaWYgKHRhcmdldC5yaWdodCAhPSBudWxsICYmIHN0YXJ0LnJpZ2h0ICE9IG51bGwpIHRoaXMucmlnaHQgPSBudW1iZXIoc3RhcnQucmlnaHQsIHRhcmdldC5yaWdodCwgdCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCBjb21wdXRlcyB0aGUgbmV3IGFwcHJlbnQgY2VudGVyIG9yIHZhbmlzaGluZyBwb2ludCBhZnRlciBhcHBseWluZyBpbnNldHMuXG4gICAgICogVGhpcyBpcyBpbiBwaXhlbHMgYW5kIHdpdGggdGhlIHRvcCBsZWZ0IGJlaW5nICgwLjApIGFuZCAreSBiZWluZyBkb3dud2FyZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIG1hcCBpbiBwaXhlbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBtYXAgaW4gcGl4ZWxzLlxuICAgICAqIEByZXR1cm5zIHtQb2ludH0gVGhlIGFwcGFyZW50IGNlbnRlciBvciB2YW5pc2hpbmcgcG9pbnQgb2YgdGhlIG1hcC5cbiAgICAgKiBAbWVtYmVyb2YgRWRnZUluc2V0c1xuICAgICAqL1xuICAgIGdldENlbnRlcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFBvaW50IHtcbiAgICAgICAgLy8gQ2xhbXAgaW5zZXRzIHNvIHRoZXkgbmV2ZXIgb3ZlcmZsb3cgd2lkdGgvaGVpZ2h0IGFuZCBhbHdheXMgY2FsY3VsYXRlIGEgdmFsaWQgY2VudGVyXG4gICAgICAgIGNvbnN0IHggPSBjbGFtcCgodGhpcy5sZWZ0ICsgd2lkdGggLSB0aGlzLnJpZ2h0KSAvIDIsIDAsIHdpZHRoKTtcbiAgICAgICAgY29uc3QgeSA9IGNsYW1wKCh0aGlzLnRvcCArIGhlaWdodCAtIHRoaXMuYm90dG9tKSAvIDIsIDAsIGhlaWdodCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh4LCB5KTtcbiAgICB9XG5cbiAgICBlcXVhbHMob3RoZXI6IFBhZGRpbmdPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvcCA9PT0gb3RoZXIudG9wICYmXG4gICAgICAgICAgICB0aGlzLmJvdHRvbSA9PT0gb3RoZXIuYm90dG9tICYmXG4gICAgICAgICAgICB0aGlzLmxlZnQgPT09IG90aGVyLmxlZnQgJiZcbiAgICAgICAgICAgIHRoaXMucmlnaHQgPT09IG90aGVyLnJpZ2h0O1xuICAgIH1cblxuICAgIGNsb25lKCk6IEVkZ2VJbnNldHMge1xuICAgICAgICByZXR1cm4gbmV3IEVkZ2VJbnNldHModGhpcy50b3AsIHRoaXMuYm90dG9tLCB0aGlzLmxlZnQsIHRoaXMucmlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgYXMganNvbiwgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gaGF2ZSBhXG4gICAgICogcmVhZC1vbmx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnNldC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge1BhZGRpbmdPcHRpb25zfSBUaGUgY3VycmVudCBwYWRkaW5nIG9wdGlvbnMuXG4gICAgICogQG1lbWJlcm9mIEVkZ2VJbnNldHNcbiAgICAgKi9cbiAgICB0b0pTT04oKTogUGFkZGluZ09wdGlvbnMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wOiB0aGlzLnRvcCxcbiAgICAgICAgICAgIGJvdHRvbTogdGhpcy5ib3R0b20sXG4gICAgICAgICAgICBsZWZ0OiB0aGlzLmxlZnQsXG4gICAgICAgICAgICByaWdodDogdGhpcy5yaWdodFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgUGFkZGluZ09wdGlvbnMgPSB7dG9wOiA/bnVtYmVyLCBib3R0b206ID9udW1iZXIsIHJpZ2h0OiA/bnVtYmVyLCBsZWZ0OiA/bnVtYmVyfTtcblxuZXhwb3J0IGRlZmF1bHQgRWRnZUluc2V0cztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUsIHttZXJjYXRvclpmcm9tQWx0aXR1ZGV9IGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCB7ZGVnVG9SYWQsIHdyYXAsIGdldENvbHVtbiwgc2V0Q29sdW1ufSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHt2ZWMzLCB2ZWM0LCBxdWF0LCBtYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHR5cGUge0VsZXZhdGlvbn0gZnJvbSAnLi4vdGVycmFpbi9lbGV2YXRpb24uanMnO1xuXG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSAnLi4vZ2VvL2xuZ19sYXQuanMnO1xuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2Zvcm1PcmllbnRhdGlvbihtYXRyaXg6IG1hdDQsIG9yaWVudGF0aW9uOiBxdWF0KSB7XG4gICAgLy8gVGFrZSB0ZW1wb3JhcnkgY29weSBvZiBwb3NpdGlvbiB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgb3ZlcndyaXR0ZW5cbiAgICBjb25zdCBwb3NpdGlvbjogdmVjNCA9IGdldENvbHVtbihtYXRyaXgsIDMpO1xuXG4gICAgLy8gQ29udmVydCBxdWF0ZXJuaW9uIHRvIHJvdGF0aW9uIG1hdHJpeFxuICAgIG1hdDQuZnJvbVF1YXQobWF0cml4LCBvcmllbnRhdGlvbik7XG4gICAgc2V0Q29sdW1uKG1hdHJpeCwgMywgcG9zaXRpb24pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2Zvcm1Qb3NpdGlvbihtYXRyaXg6IG1hdDQsIHBvc2l0aW9uOiB2ZWMzKSB7XG4gICAgc2V0Q29sdW1uKG1hdHJpeCwgMywgW3Bvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgcG9zaXRpb25bMl0sIDEuMF0pO1xufVxuXG5mdW5jdGlvbiB3cmFwQ2FtZXJhUG9zaXRpb24ocG9zaXRpb246IHZlYzMgfCBNZXJjYXRvckNvb3JkaW5hdGUpIHtcbiAgICBpZiAoIXBvc2l0aW9uKSByZXR1cm47XG4gICAgY29uc3QgbWVyY2F0b3JDb29yZGluYXRlID0gQXJyYXkuaXNBcnJheShwb3NpdGlvbikgPyBuZXcgTWVyY2F0b3JDb29yZGluYXRlKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgcG9zaXRpb25bMl0pIDogcG9zaXRpb247XG4gICAgbWVyY2F0b3JDb29yZGluYXRlLnggPSB3cmFwKG1lcmNhdG9yQ29vcmRpbmF0ZS54LCAwLCAxKTtcbiAgICByZXR1cm4gbWVyY2F0b3JDb29yZGluYXRlO1xufVxuXG5mdW5jdGlvbiBvcmllbnRhdGlvbkZyb21QaXRjaEJlYXJpbmcocGl0Y2g6IG51bWJlciwgYmVhcmluZzogbnVtYmVyKTogcXVhdCB7XG4gICAgLy8gQm90aCBhbmdsZXMgYXJlIGNvbnNpZGVyZWQgdG8gZGVmaW5lIENXIHJvdGF0aW9uIGFyb3VuZCB0aGVpciByZXNwZWN0aXZlIGF4ZXMuXG4gICAgLy8gVmFsdWVzIGhhdmUgdG8gYmUgbmVnYXRlZCB0byBhY2hpZXZlIHRoZSBwcm9wZXIgcXVhdGVybmlvbiBpbiBsZWZ0IGhhbmRlZCBjb29yZGluYXRlIHNwYWNlXG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBxdWF0LmlkZW50aXR5KFtdKTtcbiAgICBxdWF0LnJvdGF0ZVoob3JpZW50YXRpb24sIG9yaWVudGF0aW9uLCAtYmVhcmluZyk7XG4gICAgcXVhdC5yb3RhdGVYKG9yaWVudGF0aW9uLCBvcmllbnRhdGlvbiwgLXBpdGNoKTtcbiAgICByZXR1cm4gb3JpZW50YXRpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcmllbnRhdGlvbkZyb21GcmFtZShmb3J3YXJkOiB2ZWMzLCB1cDogdmVjMyk6ID9xdWF0IHtcbiAgICAvLyBGaW5kIHJpZ2h0LXZlY3RvciBvZiB0aGUgcmVzdWx0aW5nIGNvb3JkaW5hdGUgZnJhbWUuIFVwLXZlY3RvciBoYXMgdG8gYmVcbiAgICAvLyBzYW5pdGl6ZWQgZmlyc3QgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoZSByb2xsIGNvbXBvbmVudCBmcm9tIHRoZSBvcmllbnRhdGlvblxuICAgIGNvbnN0IHh5Rm9yd2FyZCA9IFtmb3J3YXJkWzBdLCBmb3J3YXJkWzFdLCAwXTtcbiAgICBjb25zdCB4eVVwID0gW3VwWzBdLCB1cFsxXSwgMF07XG5cbiAgICBjb25zdCBlcHNpbG9uID0gMWUtMTU7XG5cbiAgICBpZiAodmVjMy5sZW5ndGgoeHlGb3J3YXJkKSA+PSBlcHNpbG9uKSB7XG4gICAgICAgIC8vIFJvbGwgcm90YXRpb24gY2FuIGJlIHNlZW4gYXMgdGhlIHJpZ2h0IHZlY3RvciBub3QgYmVpbmcgb24gdGhlIHh5LXBsYW5lLCBpZS4gcmlnaHRbMl0gIT0gMC4wLlxuICAgICAgICAvLyBJdCBjYW4gYmUgbmVnYXRlZCBieSBwcm9qZWN0aW5nIHRoZSB1cCB2ZWN0b3Igb24gdG9wIG9mIHRoZSBmb3J3YXJkIHZlY3Rvci5cbiAgICAgICAgY29uc3QgeHlEaXIgPSB2ZWMzLm5vcm1hbGl6ZShbXSwgeHlGb3J3YXJkKTtcbiAgICAgICAgdmVjMy5zY2FsZSh4eVVwLCB4eURpciwgdmVjMy5kb3QoeHlVcCwgeHlEaXIpKTtcblxuICAgICAgICB1cFswXSA9IHh5VXBbMF07XG4gICAgICAgIHVwWzFdID0geHlVcFsxXTtcbiAgICB9XG5cbiAgICBjb25zdCByaWdodCA9IHZlYzMuY3Jvc3MoW10sIHVwLCBmb3J3YXJkKTtcbiAgICBpZiAodmVjMy5sZW4ocmlnaHQpIDwgZXBzaWxvbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBiZWFyaW5nID0gTWF0aC5hdGFuMigtcmlnaHRbMV0sIHJpZ2h0WzBdKTtcbiAgICBjb25zdCBwaXRjaCA9IE1hdGguYXRhbjIoTWF0aC5zcXJ0KGZvcndhcmRbMF0gKiBmb3J3YXJkWzBdICsgZm9yd2FyZFsxXSAqIGZvcndhcmRbMV0pLCAtZm9yd2FyZFsyXSk7XG5cbiAgICByZXR1cm4gb3JpZW50YXRpb25Gcm9tUGl0Y2hCZWFyaW5nKHBpdGNoLCBiZWFyaW5nKTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhY2Nlc3NpbmcgcGh5c2ljYWwgcHJvcGVydGllcyBvZiB0aGUgdW5kZXJseWluZyBjYW1lcmEgZW50aXR5LlxuICogRGlyZWN0IGFjY2VzcyB0byB0aGVzZSBwcm9wZXJ0aWVzIGFsbG93cyBtb3JlIGZsZXhpYmxlIGFuZCBwcmVjaXNlIGNvbnRyb2xsaW5nIG9mIHRoZSBjYW1lcmEuXG4gKiBUaGVzZSBvcHRpb25zIGFyZSBhbHNvIGZ1bGx5IGNvbXBhdGlibGUgYW5kIGludGVyY2hhbmdlYWJsZSB3aXRoIENhbWVyYU9wdGlvbnMuIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLlxuICogU2VlIHtAbGluayBNYXAjc2V0RnJlZUNhbWVyYU9wdGlvbnN9IGFuZCB7QGxpbmsgTWFwI2dldEZyZWVDYW1lcmFPcHRpb25zfS5cbiAqXG4gKiBAcGFyYW0ge01lcmNhdG9yQ29vcmRpbmF0ZX0gcG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIGNhbWVyYSBpbiBzbGlnaHRseSBtb2RpZmllZCB3ZWIgbWVyY2F0b3IgY29vcmRpbmF0ZXMuXG4gICAgICAgIC0gVGhlIHNpemUgb2YgMSB1bml0IGlzIHRoZSB3aWR0aCBvZiB0aGUgcHJvamVjdGVkIHdvcmxkIGluc3RlYWQgb2YgdGhlIFwibWVyY2F0b3IgbWV0ZXJcIi5cbiAgICAgICAgICBDb29yZGluYXRlIFswLCAwLCAwXSBpcyB0aGUgbm9ydGgtd2VzdCBjb3JuZXIgYW5kIFsxLCAxLCAwXSBpcyB0aGUgc291dGgtZWFzdCBjb3JuZXIuXG4gICAgICAgIC0gWiBjb29yZGluYXRlIGlzIGNvbmZvcm1hbCBhbmQgbXVzdCByZXNwZWN0IG1pbmltdW0gYW5kIG1heGltdW0gem9vbSB2YWx1ZXMuXG4gICAgICAgIC0gWm9vbSBpcyBhdXRvbWF0aWNhbGx5IGNvbXB1dGVkIGZyb20gdGhlIGFsdGl0dWRlICh6KS5cbiAqIEBwYXJhbSB7cXVhdH0gb3JpZW50YXRpb24gT3JpZW50YXRpb24gb2YgdGhlIGNhbWVyYSByZXByZXNlbnRlZCBhcyBhIHVuaXQgcXVhdGVybmlvbiBbeCwgeSwgeiwgd10gaW4gYSBsZWZ0LWhhbmRlZCBjb29yZGluYXRlIHNwYWNlLlxuICAgICAgICBEaXJlY3Rpb24gb2YgdGhlIHJvdGF0aW9uIGlzIGNsb2Nrd2lzZSBhcm91bmQgdGhlIHJlc3BlY3RpdmUgYXhpcy5cbiAgICAgICAgVGhlIGRlZmF1bHQgcG9zZSBvZiB0aGUgY2FtZXJhIGlzIHN1Y2ggdGhhdCB0aGUgZm9yd2FyZCB2ZWN0b3IgaXMgbG9va2luZyB1cCB0aGUgLVogYXhpcy5cbiAgICAgICAgVGhlIHVwIHZlY3RvciBpcyBhbGlnbmVkIHdpdGggbm9ydGggb3JpZW50YXRpb24gb2YgdGhlIG1hcDpcbiAgICAgICAgICBmb3J3YXJkOiBbMCwgMCwgLTFdXG4gICAgICAgICAgdXA6ICAgICAgWzAsIC0xLCAwXVxuICAgICAgICAgIHJpZ2h0ICAgIFsxLCAwLCAwXVxuICAgICAgICBPcmllbnRhdGlvbiBjYW4gYmUgc2V0IGZyZWVseSBidXQgY2VydGFpbiBjb25zdHJhaW50cyBzdGlsbCBhcHBseTpcbiAgICAgICAgIC0gT3JpZW50YXRpb24gbXVzdCBiZSByZXByZXNlbnRhYmxlIHdpdGggb25seSBwaXRjaCBhbmQgYmVhcmluZy5cbiAgICAgICAgIC0gUGl0Y2ggaGFzIGFuIHVwcGVyIGxpbWl0XG4gKiBAZXhhbXBsZVxuICogY29uc3QgY2FtZXJhID0gbWFwLmdldEZyZWVDYW1lcmFPcHRpb25zKCk7XG4gKlxuICogY29uc3QgcG9zaXRpb24gPSBbMTM4LjcyNjQ5LCAzNS4zMzk3NF07XG4gKiBjb25zdCBhbHRpdHVkZSA9IDMwMDA7XG4gKlxuICogY2FtZXJhLnBvc2l0aW9uID0gbWFwYm94Z2wuTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQocG9zaXRpb24sIGFsdGl0dWRlKTtcbiAqIGNhbWVyYS5sb29rQXRQb2ludChbMTM4LjczMDM2LCAzNS4zNjE5N10pO1xuICpcbiAqIG1hcC5zZXRGcmVlQ2FtZXJhT3B0aW9ucyhjYW1lcmEpO1xuICogQHNlZSBbRXhhbXBsZTogQW5pbWF0ZSB0aGUgY2FtZXJhIGFyb3VuZCBhIHBvaW50IGluIDNEIHRlcnJhaW5dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZyZWUtY2FtZXJhLXBvaW50LylcbiAqIEBzZWUgW0V4YW1wbGU6IEFuaW1hdGUgdGhlIGNhbWVyYSBhbG9uZyBhIHBhdGhdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZyZWUtY2FtZXJhLXBhdGgvKVxuKi9cbmNsYXNzIEZyZWVDYW1lcmFPcHRpb25zIHtcbiAgICBvcmllbnRhdGlvbjogP3F1YXQ7XG4gICAgX3Bvc2l0aW9uOiA/TWVyY2F0b3JDb29yZGluYXRlO1xuICAgIF9lbGV2YXRpb246ID9FbGV2YXRpb247XG4gICAgX3JlbmRlcldvcmxkQ29waWVzOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocG9zaXRpb246ID9NZXJjYXRvckNvb3JkaW5hdGUsIG9yaWVudGF0aW9uOiA/cXVhdCkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgcG9zaXRpb24oKTogP01lcmNhdG9yQ29vcmRpbmF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgICB9XG5cbiAgICBzZXQgcG9zaXRpb24ocG9zaXRpb246ID9NZXJjYXRvckNvb3JkaW5hdGUpIHtcbiAgICAgICAgdGhpcy5fcG9zaXRpb24gPSB0aGlzLl9yZW5kZXJXb3JsZENvcGllcyA/IHdyYXBDYW1lcmFQb3NpdGlvbihwb3NpdGlvbikgOiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHNldHRpbmcgb3JpZW50YXRpb24gb2YgdGhlIGNhbWVyYSBieSBkZWZpbmluZyBhIGZvY3VzIHBvaW50XG4gICAgICogb24gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbG9jYXRpb24gTG9jYXRpb24gb2YgdGhlIGZvY3VzIHBvaW50IG9uIHRoZSBtYXAuXG4gICAgICogQHBhcmFtIHt2ZWMzP30gdXAgVXAgdmVjdG9yIG9mIHRoZSBjYW1lcmEgaXMgbmVjZXNzYXJ5IGluIGNlcnRhaW4gc2NlbmFyaW9zIHdoZXJlIGJlYXJpbmcgY2FuJ3QgYmUgZGVkdWNlZFxuICAgICAqICAgICAgZnJvbSB0aGUgdmlld2luZyBkaXJlY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBjYW1lcmEgPSBtYXAuZ2V0RnJlZUNhbWVyYU9wdGlvbnMoKTtcbiAgICAgKlxuICAgICAqIGNvbnN0IHBvc2l0aW9uID0gWzEzOC43MjY0OSwgMzUuMzM5NzRdO1xuICAgICAqIGNvbnN0IGFsdGl0dWRlID0gMzAwMDtcbiAgICAgKlxuICAgICAqIGNhbWVyYS5wb3NpdGlvbiA9IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KHBvc2l0aW9uLCBhbHRpdHVkZSk7XG4gICAgICogY2FtZXJhLmxvb2tBdFBvaW50KFsxMzguNzMwMzYsIDM1LjM2MTk3XSk7XG4gICAgICogLy8gQXBwbHkgY2FtZXJhIGNoYW5nZXNcbiAgICAgKiBtYXAuc2V0RnJlZUNhbWVyYU9wdGlvbnMoY2FtZXJhKTtcbiAgICAgKi9cbiAgICBsb29rQXRQb2ludChsb2NhdGlvbjogTG5nTGF0TGlrZSwgdXA/OiB2ZWMzKSB7XG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBudWxsO1xuICAgICAgICBpZiAoIXRoaXMucG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFsdGl0dWRlID0gdGhpcy5fZWxldmF0aW9uID8gdGhpcy5fZWxldmF0aW9uLmdldEF0UG9pbnRPclplcm8oTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQobG9jYXRpb24pKSA6IDA7XG4gICAgICAgIGNvbnN0IHBvczogTWVyY2F0b3JDb29yZGluYXRlID0gdGhpcy5wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQobG9jYXRpb24sIGFsdGl0dWRlKTtcbiAgICAgICAgY29uc3QgZm9yd2FyZCA9IFt0YXJnZXQueCAtIHBvcy54LCB0YXJnZXQueSAtIHBvcy55LCB0YXJnZXQueiAtIHBvcy56XTtcbiAgICAgICAgaWYgKCF1cClcbiAgICAgICAgICAgIHVwID0gWzAsIDAsIDFdO1xuXG4gICAgICAgIC8vIGZsaXAgei1jb21wb25lbnQgaWYgdGhlIHVwIHZlY3RvciBpcyBwb2ludGluZyBkb3dud2FyZHNcbiAgICAgICAgdXBbMl0gPSBNYXRoLmFicyh1cFsyXSk7XG5cbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uRnJvbUZyYW1lKGZvcndhcmQsIHVwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHNldHRpbmcgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBjYW1lcmEgYXMgYSBwaXRjaCBhbmQgYSBiZWFyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBpdGNoIFBpdGNoIGFuZ2xlIGluIGRlZ3JlZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgQmVhcmluZyBhbmdsZSBpbiBkZWdyZWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgY2FtZXJhID0gbWFwLmdldEZyZWVDYW1lcmFPcHRpb25zKCk7XG4gICAgICpcbiAgICAgKiAvLyBVcGRhdGUgY2FtZXJhIHBpdGNoIGFuZCBiZWFyaW5nXG4gICAgICogY2FtZXJhLnNldFBpdGNoQmVhcmluZyg4MCwgOTApO1xuICAgICAqIC8vIEFwcGx5IGNoYW5nZXNcbiAgICAgKiBtYXAuc2V0RnJlZUNhbWVyYU9wdGlvbnMoY2FtZXJhKTtcbiAgICAgKi9cbiAgICBzZXRQaXRjaEJlYXJpbmcocGl0Y2g6IG51bWJlciwgYmVhcmluZzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbkZyb21QaXRjaEJlYXJpbmcoZGVnVG9SYWQocGl0Y2gpLCBkZWdUb1JhZCgtYmVhcmluZykpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBXaGlsZSB1c2luZyB0aGUgZnJlZSBjYW1lcmEgQVBJIHRoZSBvdXRjb21lIHZhbHVlIG9mIGlzWm9vbWluZywgaXNNb3ZpbmcgYW5kIGlzUm90YXRpbmdcbiAqIGlzIG5vdCBhIHJlc3VsdCBvZiB0aGUgZnJlZSBjYW1lcmEgQVBJLlxuICogSWYgdGhlIHVzZXIgc2V0cyB0aGUgbWFwLmludGVyYWN0aXZlIHRvIHRydWUsIHRoZXJlIHdpbGwgYmUgY29uZmxpY3RpbmcgYmVoYXZpb3JzIHdoaWxlXG4gKiBpbnRlcmFjdGluZyB3aXRoIG1hcCB2aWEgem9vbWluZyBvciBtb3ZpbmcgdXNpbmcgbW91c2Ugb3IvYW5kIGtleWJvYXJkIHdoaWNoIHdpbGwgcmVzdWx0XG4gKiBpbiBpc1pvb21pbmcsIGlzTW92aW5nIGFuZCBpc1JvdGF0aW5nIHRvIHJldHVybiB0cnVlIHdoaWxlIHVzaW5nIGZyZWUgY2FtZXJhIEFQSS4gSW4gb3JkZXJcbiAqIHRvIHByZXZlbnQgdGhlIGNvbmZpbGljdGluZyBiZWhhdmlvciBwbGVhc2Ugc2V0IG1hcC5pbnRlcmFjdGl2ZSB0byBmYWxzZSB3aGljaCB3aWxsIHJlc3VsdFxuICogaW4gbXV0aW5nIHRoZSBmb2xsb3dpbmcgZXZlbnRzOiB6b29tLCB6b29tZW5kLCB6b29tc3RhcnQsIHJvdGF0ZSwgcm90YXRlZW5kLCByb3RhdGVzdGFydCxcbiAqIG1vdmUsIG1vdmVlbmQsIG1vdmVzdGFydCwgcGl0Y2gsIHBpdGNoZW5kLCBwaXRjaHN0YXJ0LlxuICovXG5cbmNsYXNzIEZyZWVDYW1lcmEge1xuICAgIF90cmFuc2Zvcm06IG1hdDQ7XG4gICAgX29yaWVudGF0aW9uOiBxdWF0O1xuXG4gICAgY29uc3RydWN0b3IocG9zaXRpb246ID92ZWMzLCBvcmllbnRhdGlvbjogP3F1YXQpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtID0gbWF0NC5pZGVudGl0eShbXSk7XG4gICAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gcXVhdC5pZGVudGl0eShbXSk7XG5cbiAgICAgICAgaWYgKG9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uO1xuICAgICAgICAgICAgdXBkYXRlVHJhbnNmb3JtT3JpZW50YXRpb24odGhpcy5fdHJhbnNmb3JtLCB0aGlzLl9vcmllbnRhdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIHVwZGF0ZVRyYW5zZm9ybVBvc2l0aW9uKHRoaXMuX3RyYW5zZm9ybSwgcG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IG1lcmNhdG9yUG9zaXRpb24oKTogTWVyY2F0b3JDb29yZGluYXRlIHtcbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5wb3NpdGlvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJjYXRvckNvb3JkaW5hdGUocG9zWzBdLCBwb3NbMV0sIHBvc1syXSk7XG4gICAgfVxuXG4gICAgZ2V0IHBvc2l0aW9uKCk6IHZlYzMge1xuICAgICAgICBjb25zdCBjb2w6IHZlYzQgPSBnZXRDb2x1bW4odGhpcy5fdHJhbnNmb3JtLCAzKTtcbiAgICAgICAgcmV0dXJuIFtjb2xbMF0sIGNvbFsxXSwgY29sWzJdXTtcbiAgICB9XG5cbiAgICBzZXQgcG9zaXRpb24odmFsdWU6IHZlYzMpIHtcbiAgICAgICAgdXBkYXRlVHJhbnNmb3JtUG9zaXRpb24odGhpcy5fdHJhbnNmb3JtLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0IG9yaWVudGF0aW9uKCk6IHF1YXQge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb247XG4gICAgfVxuXG4gICAgc2V0IG9yaWVudGF0aW9uKHZhbHVlOiBxdWF0KSB7XG4gICAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gdmFsdWU7XG4gICAgICAgIHVwZGF0ZVRyYW5zZm9ybU9yaWVudGF0aW9uKHRoaXMuX3RyYW5zZm9ybSwgdGhpcy5fb3JpZW50YXRpb24pO1xuICAgIH1cblxuICAgIGdldFBpdGNoQmVhcmluZygpOiB7cGl0Y2g6IG51bWJlciwgYmVhcmluZzogbnVtYmVyfSB7XG4gICAgICAgIGNvbnN0IGYgPSB0aGlzLmZvcndhcmQoKTtcbiAgICAgICAgY29uc3QgciA9IHRoaXMucmlnaHQoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVhcmluZzogTWF0aC5hdGFuMigtclsxXSwgclswXSksXG4gICAgICAgICAgICBwaXRjaDogTWF0aC5hdGFuMihNYXRoLnNxcnQoZlswXSAqIGZbMF0gKyBmWzFdICogZlsxXSksIC1mWzJdKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldFBpdGNoQmVhcmluZyhwaXRjaDogbnVtYmVyLCBiZWFyaW5nOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSBvcmllbnRhdGlvbkZyb21QaXRjaEJlYXJpbmcocGl0Y2gsIGJlYXJpbmcpO1xuICAgICAgICB1cGRhdGVUcmFuc2Zvcm1PcmllbnRhdGlvbih0aGlzLl90cmFuc2Zvcm0sIHRoaXMuX29yaWVudGF0aW9uKTtcbiAgICB9XG5cbiAgICBmb3J3YXJkKCk6IHZlYzMge1xuICAgICAgICBjb25zdCBjb2w6IHZlYzQgPSBnZXRDb2x1bW4odGhpcy5fdHJhbnNmb3JtLCAyKTtcbiAgICAgICAgLy8gRm9yd2FyZCBkaXJlY3Rpb24gaXMgdG93YXJkcyB0aGUgbmVnYXRpdmUgWi1heGlzXG4gICAgICAgIHJldHVybiBbLWNvbFswXSwgLWNvbFsxXSwgLWNvbFsyXV07XG4gICAgfVxuXG4gICAgdXAoKTogdmVjMyB7XG4gICAgICAgIGNvbnN0IGNvbDogdmVjNCA9IGdldENvbHVtbih0aGlzLl90cmFuc2Zvcm0sIDEpO1xuICAgICAgICAvLyBVcCBkaXJlY3Rpb24gaGFzIHRvIGJlIGZsaXBwZWQgdG8gcG9pbnQgdG93YXJkcyBub3J0aFxuICAgICAgICByZXR1cm4gWy1jb2xbMF0sIC1jb2xbMV0sIC1jb2xbMl1dO1xuICAgIH1cblxuICAgIHJpZ2h0KCk6IHZlYzMge1xuICAgICAgICBjb25zdCBjb2w6IHZlYzQgPSBnZXRDb2x1bW4odGhpcy5fdHJhbnNmb3JtLCAwKTtcbiAgICAgICAgcmV0dXJuIFtjb2xbMF0sIGNvbFsxXSwgY29sWzJdXTtcbiAgICB9XG5cbiAgICBnZXRDYW1lcmFUb1dvcmxkKHdvcmxkU2l6ZTogbnVtYmVyLCBwaXhlbHNQZXJNZXRlcjogbnVtYmVyKTogRmxvYXQ2NEFycmF5IHtcbiAgICAgICAgY29uc3QgY2FtZXJhVG9Xb3JsZCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICBtYXQ0LmludmVydChjYW1lcmFUb1dvcmxkLCB0aGlzLmdldFdvcmxkVG9DYW1lcmEod29ybGRTaXplLCBwaXhlbHNQZXJNZXRlcikpO1xuICAgICAgICByZXR1cm4gY2FtZXJhVG9Xb3JsZDtcbiAgICB9XG5cbiAgICBnZXRXb3JsZFRvQ2FtZXJhUG9zaXRpb24od29ybGRTaXplOiBudW1iZXIsIHBpeGVsc1Blck1ldGVyOiBudW1iZXIsIHVuaWZvcm1TY2FsZTogbnVtYmVyKTogRmxvYXQ2NEFycmF5IHtcbiAgICAgICAgY29uc3QgaW52UG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuXG4gICAgICAgIHZlYzMuc2NhbGUoaW52UG9zaXRpb24sIGludlBvc2l0aW9uLCAtd29ybGRTaXplKTtcbiAgICAgICAgY29uc3QgbWF0cml4ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIG1hdDQuZnJvbVNjYWxpbmcobWF0cml4LCBbdW5pZm9ybVNjYWxlLCB1bmlmb3JtU2NhbGUsIHVuaWZvcm1TY2FsZV0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtYXRyaXgsIG1hdHJpeCwgaW52UG9zaXRpb24pO1xuXG4gICAgICAgIC8vIEFkanVzdCBzY2FsZSBvbiB6ICgzcmQgY29sdW1uIDNyZCByb3cpXG4gICAgICAgIG1hdHJpeFsxMF0gKj0gcGl4ZWxzUGVyTWV0ZXI7XG5cbiAgICAgICAgcmV0dXJuIG1hdHJpeDtcbiAgICB9XG5cbiAgICBnZXRXb3JsZFRvQ2FtZXJhKHdvcmxkU2l6ZTogbnVtYmVyLCBwaXhlbHNQZXJNZXRlcjogbnVtYmVyKTogRmxvYXQ2NEFycmF5IHtcbiAgICAgICAgLy8gdHJhbnNmb3JtYXRpb24gY2hhaW4gZnJvbSB3b3JsZCBzcGFjZSB0byBjYW1lcmEgc3BhY2U6XG4gICAgICAgIC8vIDEuIEhlaWdodCB2YWx1ZSAoeikgb2YgcmVuZGVyYWJsZXMgaXMgaW4gbWV0ZXJzLiBTY2FsZSB6IGNvb3JkaW5hdGUgYnkgcGl4ZWxzUGVyTWV0ZXJcbiAgICAgICAgLy8gMi4gVHJhbnNmb3JtIGZyb20gcGl4ZWwgY29vcmRpbmF0ZXMgdG8gY2FtZXJhIHNwYWNlIHdpdGggY2FtZXJhTWF0cml4Xi0xXG4gICAgICAgIC8vIDMuIGZsaXAgWSBpZiByZXF1aXJlZFxuXG4gICAgICAgIC8vIHdvcmxkVG9DYW1lcmE6IGZsaXAgKiBjYW1eLTEgKiB6U2NhbGVcbiAgICAgICAgLy8gY2FtZXJhVG9Xb3JsZDogKGZsaXAgKiBjYW1eLTEgKiB6U2NhbGUpXi0xID0+ICh6U2NhbGVeLTEgKiBjYW0gKiBmbGlwXi0xKVxuICAgICAgICBjb25zdCBtYXRyaXggPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcblxuICAgICAgICAvLyBDb21wdXRlIGludmVyc2Ugb2YgY2FtZXJhIG1hdHJpeCBhbmQgcG9zdC1tdWx0aXBseSBuZWdhdGVkIHRyYW5zbGF0aW9uXG4gICAgICAgIGNvbnN0IGludk9yaWVudGF0aW9uID0gbmV3IEZsb2F0NjRBcnJheSg0KTtcbiAgICAgICAgY29uc3QgaW52UG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uO1xuXG4gICAgICAgIHF1YXQuY29uanVnYXRlKGludk9yaWVudGF0aW9uLCB0aGlzLl9vcmllbnRhdGlvbik7XG4gICAgICAgIHZlYzMuc2NhbGUoaW52UG9zaXRpb24sIGludlBvc2l0aW9uLCAtd29ybGRTaXplKTtcblxuICAgICAgICBtYXQ0LmZyb21RdWF0KG1hdHJpeCwgaW52T3JpZW50YXRpb24pO1xuXG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG1hdHJpeCwgbWF0cml4LCBpbnZQb3NpdGlvbik7XG5cbiAgICAgICAgLy8gUHJlLW11bHRpcGx5IHkgKDJuZCByb3cpXG4gICAgICAgIG1hdHJpeFsxXSAqPSAtMS4wO1xuICAgICAgICBtYXRyaXhbNV0gKj0gLTEuMDtcbiAgICAgICAgbWF0cml4WzldICo9IC0xLjA7XG4gICAgICAgIG1hdHJpeFsxM10gKj0gLTEuMDtcblxuICAgICAgICAvLyBQb3N0LW11bHRpcGx5IHogKDNyZCBjb2x1bW4pXG4gICAgICAgIG1hdHJpeFs4XSAqPSBwaXhlbHNQZXJNZXRlcjtcbiAgICAgICAgbWF0cml4WzldICo9IHBpeGVsc1Blck1ldGVyO1xuICAgICAgICBtYXRyaXhbMTBdICo9IHBpeGVsc1Blck1ldGVyO1xuICAgICAgICBtYXRyaXhbMTFdICo9IHBpeGVsc1Blck1ldGVyO1xuXG4gICAgICAgIHJldHVybiBtYXRyaXg7XG4gICAgfVxuXG4gICAgZ2V0Q2FtZXJhVG9DbGlwUGVyc3BlY3RpdmUoZm92eTogbnVtYmVyLCBhc3BlY3RSYXRpbzogbnVtYmVyLCBuZWFyWjogbnVtYmVyLCBmYXJaOiBudW1iZXIpOiBGbG9hdDY0QXJyYXkge1xuICAgICAgICBjb25zdCBtYXRyaXggPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgbWF0NC5wZXJzcGVjdGl2ZShtYXRyaXgsIGZvdnksIGFzcGVjdFJhdGlvLCBuZWFyWiwgZmFyWik7XG4gICAgICAgIHJldHVybiBtYXRyaXg7XG4gICAgfVxuXG4gICAgZ2V0RGlzdGFuY2VUb0VsZXZhdGlvbihlbGV2YXRpb25NZXRlcnM6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHowID0gZWxldmF0aW9uTWV0ZXJzID09PSAwID8gMCA6IG1lcmNhdG9yWmZyb21BbHRpdHVkZShlbGV2YXRpb25NZXRlcnMsIHRoaXMucG9zaXRpb25bMV0pO1xuICAgICAgICBjb25zdCBmID0gdGhpcy5mb3J3YXJkKCk7XG4gICAgICAgIHJldHVybiAoejAgLSB0aGlzLnBvc2l0aW9uWzJdKSAvIGZbMl07XG4gICAgfVxuXG4gICAgY2xvbmUoKTogRnJlZUNhbWVyYSB7XG4gICAgICAgIHJldHVybiBuZXcgRnJlZUNhbWVyYShbLi4udGhpcy5wb3NpdGlvbl0sIFsuLi50aGlzLm9yaWVudGF0aW9uXSk7XG4gICAgfVxufVxuXG5leHBvcnQge1xuICAgIEZyZWVDYW1lcmEsXG4gICAgRnJlZUNhbWVyYU9wdGlvbnNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2xuZ19sYXQuanMnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge01BWF9NRVJDQVRPUl9MQVRJVFVERX0gZnJvbSAnLi4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQge21hdDQsIG1hdDJ9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQge2NsYW1wLCBzbW9vdGhzdGVwfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3Rpb259IGZyb20gJy4vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL3RyYW5zZm9ybS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFByb2plY3Rpb25BZGp1c3RtZW50cyh0cmFuc2Zvcm06IFRyYW5zZm9ybSwgd2l0aG91dFJvdGF0aW9uPzogYm9vbGVhbikge1xuICAgIGNvbnN0IGludGVycFQgPSBnZXRJbnRlcnBvbGF0aW9uVCh0cmFuc2Zvcm0pO1xuICAgIGNvbnN0IG1hdHJpeCA9IGdldFNoZWFyQWRqdXN0bWVudCh0cmFuc2Zvcm0ucHJvamVjdGlvbiwgdHJhbnNmb3JtLnpvb20sIHRyYW5zZm9ybS5jZW50ZXIsIGludGVycFQsIHdpdGhvdXRSb3RhdGlvbik7XG5cbiAgICBjb25zdCBzY2FsZUFkanVzdG1lbnQgPSBnZXRTY2FsZUFkanVzdG1lbnQodHJhbnNmb3JtKTtcbiAgICBtYXQ0LnNjYWxlKG1hdHJpeCwgbWF0cml4LCBbc2NhbGVBZGp1c3RtZW50LCBzY2FsZUFkanVzdG1lbnQsIDFdKTtcblxuICAgIHJldHVybiBtYXRyaXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2FsZUFkanVzdG1lbnQodHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICBjb25zdCBwcm9qZWN0aW9uID0gdHJhbnNmb3JtLnByb2plY3Rpb247XG4gICAgY29uc3QgaW50ZXJwVCA9IGdldEludGVycG9sYXRpb25UKHRyYW5zZm9ybSk7XG4gICAgY29uc3Qgem9vbUFkanVzdG1lbnQgPSBnZXRab29tQWRqdXN0bWVudChwcm9qZWN0aW9uLCB0cmFuc2Zvcm0uY2VudGVyKTtcbiAgICBjb25zdCB6b29tQWRqdXN0bWVudE9yaWdpbiA9IGdldFpvb21BZGp1c3RtZW50KHByb2plY3Rpb24sIExuZ0xhdC5jb252ZXJ0KHByb2plY3Rpb24uY2VudGVyKSk7XG4gICAgY29uc3Qgc2NhbGVBZGp1c3RtZW50ID0gTWF0aC5wb3coMiwgem9vbUFkanVzdG1lbnQgKiBpbnRlcnBUICsgKDEgLSBpbnRlcnBUKSAqIHpvb21BZGp1c3RtZW50T3JpZ2luKTtcbiAgICByZXR1cm4gc2NhbGVBZGp1c3RtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvamVjdGlvbkFkanVzdG1lbnRJbnZlcnRlZCh0cmFuc2Zvcm06IFRyYW5zZm9ybSkge1xuICAgIGNvbnN0IG0gPSBnZXRQcm9qZWN0aW9uQWRqdXN0bWVudHModHJhbnNmb3JtLCB0cnVlKTtcbiAgICByZXR1cm4gbWF0Mi5pbnZlcnQoW10sIFtcbiAgICAgICAgbVswXSwgbVsxXSxcbiAgICAgICAgbVs0XSwgbVs1XV0pO1xufVxuXG5mdW5jdGlvbiBnZXRJbnRlcnBvbGF0aW9uVCh0cmFuc2Zvcm06IFRyYW5zZm9ybSkge1xuICAgIGNvbnN0IHJhbmdlID0gdHJhbnNmb3JtLnByb2plY3Rpb24ucmFuZ2U7XG4gICAgaWYgKCFyYW5nZSkgcmV0dXJuIDA7XG5cbiAgICBjb25zdCBzaXplID0gTWF0aC5tYXgodHJhbnNmb3JtLndpZHRoLCB0cmFuc2Zvcm0uaGVpZ2h0KTtcbiAgICAvLyBUaGUgaW50ZXJwb2xhdGlvbiByYW5nZXMgYXJlIG1hbnVhbGx5IGRlZmluZWQgYmFzZWQgb24gd2hhdCBtYWtlc1xuICAgIC8vIHNlbnNlIGluIGEgMTAyNHB4IHdpZGUgbWFwLiBBZGp1c3QgdGhlIHJhbmdlcyB0byB0aGUgY3VycmVudCBzaXplXG4gICAgLy8gb2YgdGhlIG1hcC4gVGhlIHNtYWxsZXIgdGhlIG1hcCwgdGhlIGVhcmxpZXIgeW91IGNhbiBzdGFydCB1bnNrZXdpbmcuXG4gICAgY29uc3QgcmFuZ2VBZGp1c3RtZW50ID0gTWF0aC5sb2coc2l6ZSAvIDEwMjQpIC8gTWF0aC5MTjI7XG4gICAgY29uc3Qgem9vbUEgPSByYW5nZVswXSArIHJhbmdlQWRqdXN0bWVudDtcbiAgICBjb25zdCB6b29tQiA9IHJhbmdlWzFdICsgcmFuZ2VBZGp1c3RtZW50O1xuICAgIGNvbnN0IHQgPSBzbW9vdGhzdGVwKHpvb21BLCB6b29tQiwgdHJhbnNmb3JtLnpvb20pO1xuICAgIHJldHVybiB0O1xufVxuXG4vLyBhcHByb3guIGtpbG9tZXRlcnMgcGVyIGxvbmdpdHVkZSBkZWdyZWUgYXQgZXF1YXRvclxuY29uc3Qgb2Zmc2V0ID0gMSAvIDQwMDAwO1xuXG4vKlxuICogQ2FsY3VsYXRlcyB0aGUgc2NhbGUgZGlmZmVyZW5jZSBiZXR3ZWVuIE1lcmNhdG9yIGFuZCB0aGUgZ2l2ZW4gcHJvamVjdGlvbiBhdCBhIGNlcnRhaW4gbG9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdldFpvb21BZGp1c3RtZW50KHByb2plY3Rpb246IFByb2plY3Rpb24sIGxvYzogTG5nTGF0KSB7XG4gICAgLy8gbWFrZSBzdXJlIHdlIG9wZXJhdGUgd2l0aGluIG1lcmNhdG9yIHNwYWNlIGZvciBhZGp1c3RtZW50cyAodGhleSBjYW4gZ28gb3ZlciBmb3Igb3RoZXIgcHJvamVjdGlvbnMpXG4gICAgY29uc3QgbGF0ID0gY2xhbXAobG9jLmxhdCwgLU1BWF9NRVJDQVRPUl9MQVRJVFVERSwgTUFYX01FUkNBVE9SX0xBVElUVURFKTtcblxuICAgIGNvbnN0IGxvYzEgPSBuZXcgTG5nTGF0KGxvYy5sbmcgLSAxODAgKiBvZmZzZXQsIGxhdCk7XG4gICAgY29uc3QgbG9jMiA9IG5ldyBMbmdMYXQobG9jLmxuZyArIDE4MCAqIG9mZnNldCwgbGF0KTtcblxuICAgIGNvbnN0IHAxID0gcHJvamVjdGlvbi5wcm9qZWN0KGxvYzEubG5nLCBsYXQpO1xuICAgIGNvbnN0IHAyID0gcHJvamVjdGlvbi5wcm9qZWN0KGxvYzIubG5nLCBsYXQpO1xuXG4gICAgY29uc3QgbTEgPSBNZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdChsb2MxKTtcbiAgICBjb25zdCBtMiA9IE1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KGxvYzIpO1xuXG4gICAgY29uc3QgcGR4ID0gcDIueCAtIHAxLng7XG4gICAgY29uc3QgcGR5ID0gcDIueSAtIHAxLnk7XG4gICAgY29uc3QgbWR4ID0gbTIueCAtIG0xLng7XG4gICAgY29uc3QgbWR5ID0gbTIueSAtIG0xLnk7XG5cbiAgICBjb25zdCBzY2FsZSA9IE1hdGguc3FydCgobWR4ICogbWR4ICsgbWR5ICogbWR5KSAvIChwZHggKiBwZHggKyBwZHkgKiBwZHkpKTtcblxuICAgIHJldHVybiBNYXRoLmxvZyhzY2FsZSkgLyBNYXRoLkxOMjtcbn1cblxuZnVuY3Rpb24gZ2V0U2hlYXJBZGp1c3RtZW50KHByb2plY3Rpb24sIHpvb20sIGxvYywgaW50ZXJwVCwgd2l0aG91dFJvdGF0aW9uPzogYm9vbGVhbikge1xuXG4gICAgLy8gY3JlYXRlIHR3byBsb2NhdGlvbnMgYSB0aW55IGFtb3VudCAofjFrbSkgZWFzdCBhbmQgd2VzdCBvZiB0aGUgZ2l2ZW4gbG9jYXRpb25cbiAgICBjb25zdCBsb2N3ID0gbmV3IExuZ0xhdChsb2MubG5nIC0gMTgwICogb2Zmc2V0LCBsb2MubGF0KTtcbiAgICBjb25zdCBsb2NlID0gbmV3IExuZ0xhdChsb2MubG5nICsgMTgwICogb2Zmc2V0LCBsb2MubGF0KTtcblxuICAgIGNvbnN0IHB3ID0gcHJvamVjdGlvbi5wcm9qZWN0KGxvY3cubG5nLCBsb2N3LmxhdCk7XG4gICAgY29uc3QgcGUgPSBwcm9qZWN0aW9uLnByb2plY3QobG9jZS5sbmcsIGxvY2UubGF0KTtcblxuICAgIGNvbnN0IHBkeCA9IHBlLnggLSBwdy54O1xuICAgIGNvbnN0IHBkeSA9IHBlLnkgLSBwdy55O1xuXG4gICAgLy8gQ2FsY3VsYXRlIGhvdyBtdWNoIHRoZSBtYXAgd291bGQgbmVlZCB0byBiZSByb3RhdGVkIHRvIG1ha2UgZWFzdC13ZXN0IGluXG4gICAgLy8gcHJvamVjdGVkIGNvb3JkaW5hdGVzIGJlIGxlZnQtcmlnaHRcbiAgICBjb25zdCBhbmdsZUFkanVzdCA9IC1NYXRoLmF0YW4yKHBkeSwgcGR4KTtcblxuICAgIC8vIFBpY2sgYSBsb2NhdGlvbiBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsIG9uZSBleGNlcHQgZm9yIHBvbGVzIHRvIG1ha2Ugc3VyZSB3ZSdyZSB3aXRoaW4gbWVyY2F0b3IgYm91bmRzXG4gICAgY29uc3QgbWMyID0gTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQobG9jKTtcbiAgICBtYzIueSA9IGNsYW1wKG1jMi55LCAtMSArIG9mZnNldCwgMSAtIG9mZnNldCk7XG4gICAgY29uc3QgbG9jMiA9IG1jMi50b0xuZ0xhdCgpO1xuICAgIGNvbnN0IHAyID0gcHJvamVjdGlvbi5wcm9qZWN0KGxvYzIubG5nLCBsb2MyLmxhdCk7XG5cbiAgICAvLyBGaW5kIHRoZSBwcm9qZWN0ZWQgY29vcmRpbmF0ZXMgb2YgdHdvIGxvY2F0aW9ucywgb25lIHNsaWdodGx5IHNvdXRoIGFuZCBvbmUgc2xpZ2h0bHkgZWFzdC5cbiAgICAvLyBUaGVuIGNhbGN1bGF0ZSB0aGUgdHJhbnNmb3JtIHRoYXQgd291bGQgbWFrZSB0aGUgcHJvamVjdGVkIGNvb3JkaW5hdGVzIG9mIHRoZSB0d28gbG9jYXRpb25zIGJlOlxuICAgIC8vIC0gZXF1YWwgZGlzdGFuY2VzIGZyb20gdGhlIG9yaWdpbmFsIGxvY2F0aW9uXG4gICAgLy8gLSBwZXJwZW5kaWN1bGFyIHRvIG9uZSBhbm90aGVyXG4gICAgLy9cbiAgICAvLyBPbmx5IHRoZSBwb3NpdGlvbiBvZiB0aGUgY29vcmRpbmF0ZSB0byB0aGUgbm9ydGggaXMgYWRqdXN0ZWQuXG4gICAgLy8gVGhlIGNvb3JkaW5hdGUgdG8gdGhlIGVhc3Qgc3RheXMgd2hlcmUgaXQgaXMuXG4gICAgY29uc3QgbWMzID0gTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQobG9jMik7XG4gICAgbWMzLnggKz0gb2Zmc2V0O1xuICAgIGNvbnN0IGxvYzMgPSBtYzMudG9MbmdMYXQoKTtcbiAgICBjb25zdCBwMyA9IHByb2plY3Rpb24ucHJvamVjdChsb2MzLmxuZywgbG9jMy5sYXQpO1xuICAgIGNvbnN0IHBkeDMgPSBwMy54IC0gcDIueDtcbiAgICBjb25zdCBwZHkzID0gcDMueSAtIHAyLnk7XG4gICAgY29uc3QgZGVsdGEzID0gcm90YXRlKHBkeDMsIHBkeTMsIGFuZ2xlQWRqdXN0KTtcblxuICAgIGNvbnN0IG1jNCA9IE1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KGxvYzIpO1xuICAgIG1jNC55ICs9IG9mZnNldDtcbiAgICBjb25zdCBsb2M0ID0gbWM0LnRvTG5nTGF0KCk7XG4gICAgY29uc3QgcDQgPSBwcm9qZWN0aW9uLnByb2plY3QobG9jNC5sbmcsIGxvYzQubGF0KTtcbiAgICBjb25zdCBwZHg0ID0gcDQueCAtIHAyLng7XG4gICAgY29uc3QgcGR5NCA9IHA0LnkgLSBwMi55O1xuICAgIGNvbnN0IGRlbHRhNCA9IHJvdGF0ZShwZHg0LCBwZHk0LCBhbmdsZUFkanVzdCk7XG5cbiAgICBjb25zdCBzY2FsZSA9IE1hdGguYWJzKGRlbHRhMy54KSAvIE1hdGguYWJzKGRlbHRhNC55KTtcblxuICAgIGNvbnN0IHVucm90YXRlID0gbWF0NC5pZGVudGl0eShbXSk7XG4gICAgbWF0NC5yb3RhdGVaKHVucm90YXRlLCB1bnJvdGF0ZSwgKC1hbmdsZUFkanVzdCkgKiAoMSAtICh3aXRob3V0Um90YXRpb24gPyAwIDogaW50ZXJwVCkpKTtcblxuICAgIC8vIHVuc2tld1xuICAgIGNvbnN0IHNoZWFyID0gbWF0NC5pZGVudGl0eShbXSk7XG4gICAgbWF0NC5zY2FsZShzaGVhciwgc2hlYXIsIFsxLCAxIC0gKDEgLSBzY2FsZSkgKiBpbnRlcnBULCAxXSk7XG4gICAgc2hlYXJbNF0gPSAtZGVsdGE0LnggLyBkZWx0YTQueSAqIGludGVycFQ7XG5cbiAgICAvLyB1bnJvdGF0ZVxuICAgIG1hdDQucm90YXRlWihzaGVhciwgc2hlYXIsIGFuZ2xlQWRqdXN0KTtcblxuICAgIG1hdDQubXVsdGlwbHkoc2hlYXIsIHVucm90YXRlLCBzaGVhcik7XG5cbiAgICByZXR1cm4gc2hlYXI7XG59XG5cbmZ1bmN0aW9uIHJvdGF0ZSh4LCB5LCBhbmdsZSkge1xuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCAqIGNvcyAtIHkgKiBzaW4sXG4gICAgICAgIHk6IHggKiBzaW4gKyB5ICogY29zXG4gICAgfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBMbmdMYXQgZnJvbSAnLi9sbmdfbGF0LmpzJztcbmltcG9ydCBMbmdMYXRCb3VuZHMgZnJvbSAnLi9sbmdfbGF0X2JvdW5kcy5qcyc7XG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlLCB7bWVyY2F0b3JYZnJvbUxuZywgbWVyY2F0b3JZZnJvbUxhdCwgbWVyY2F0b3JaZnJvbUFsdGl0dWRlLCBsYXRGcm9tTWVyY2F0b3JZLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREV9IGZyb20gJy4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQge2dldFByb2plY3Rpb259IGZyb20gJy4vcHJvamVjdGlvbi9pbmRleC5qcyc7XG5pbXBvcnQge3RpbGVBQUJCfSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi90aWxlX3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQge3dyYXAsIGNsYW1wLCBwaWNrLCByYWRUb0RlZywgZGVnVG9SYWQsIGdldEFBQkJQb2ludFNxdWFyZURpc3QsIGZ1cnRoZXN0VGlsZUNvcm5lciwgd2Fybk9uY2UsIGRlZXBFcXVhbH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlfSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQge3ZlYzQsIG1hdDQsIG1hdDIsIHZlYzMsIHF1YXR9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQge0ZydXN0dW0sIFJheX0gZnJvbSAnLi4vdXRpbC9wcmltaXRpdmVzLmpzJztcbmltcG9ydCBFZGdlSW5zZXRzIGZyb20gJy4vZWRnZV9pbnNldHMuanMnO1xuaW1wb3J0IHtGcmVlQ2FtZXJhLCBGcmVlQ2FtZXJhT3B0aW9ucywgb3JpZW50YXRpb25Gcm9tRnJhbWV9IGZyb20gJy4uL3VpL2ZyZWVfY2FtZXJhLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBnZXRQcm9qZWN0aW9uQWRqdXN0bWVudHMsIHtnZXRQcm9qZWN0aW9uQWRqdXN0bWVudEludmVydGVkLCBnZXRTY2FsZUFkanVzdG1lbnR9IGZyb20gJy4vcHJvamVjdGlvbi9hZGp1c3RtZW50cy5qcyc7XG5pbXBvcnQge2dldFBpeGVsc1RvVGlsZVVuaXRzTWF0cml4fSBmcm9tICcuLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3Rpb259IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL2luZGV4LmpzJztcbmltcG9ydCB7VW53cmFwcGVkVGlsZUlELCBPdmVyc2NhbGVkVGlsZUlELCBDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIHtFbGV2YXRpb259IGZyb20gJy4uL3RlcnJhaW4vZWxldmF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHtQYWRkaW5nT3B0aW9uc30gZnJvbSAnLi9lZGdlX2luc2V0cy5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB0eXBlIHtQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZURpc3RhbmNlRGF0YX0gZnJvbSAnLi4vc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlci9pbmRleC5qcyc7XG5cbmNvbnN0IE5VTV9XT1JMRF9DT1BJRVMgPSAzO1xuY29uc3QgREVGQVVMVF9NSU5fWk9PTSA9IDA7XG5cbnR5cGUgUmF5SW50ZXJzZWN0aW9uUmVzdWx0ID0geyBwMDogdmVjNCwgcDE6IHZlYzQsIHQ6IG51bWJlcn07XG50eXBlIEVsZXZhdGlvblJlZmVyZW5jZSA9IFwic2VhXCIgfCBcImdyb3VuZFwiO1xuXG4vKipcbiAqIEEgc2luZ2xlIHRyYW5zZm9ybSwgZ2VuZXJhbGx5IHVzZWQgZm9yIGEgc2luZ2xlIHRpbGUgdG8gYmVcbiAqIHNjYWxlZCwgcm90YXRlZCwgYW5kIHpvb21lZC5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFRyYW5zZm9ybSB7XG4gICAgdGlsZVNpemU6IG51bWJlcjtcbiAgICB0aWxlWm9vbTogbnVtYmVyO1xuICAgIG1heEJvdW5kczogP0xuZ0xhdEJvdW5kcztcblxuICAgIC8vIDJeem9vbSAod29ybGRTaXplID0gdGlsZVNpemUgKiBzY2FsZSlcbiAgICBzY2FsZTogbnVtYmVyO1xuXG4gICAgLy8gTWFwIHZpZXdwb3J0IHNpemUgKG5vdCBpbmNsdWRpbmcgdGhlIHBpeGVsIHJhdGlvKVxuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG5cbiAgICAvLyBCZWFyaW5nLCByYWRpYW5zLCBpbiBbLXBpLCBwaV1cbiAgICBhbmdsZTogbnVtYmVyO1xuXG4gICAgLy8gMkQgcm90YXRpb24gbWF0cml4IGluIHRoZSBob3Jpem9udGFsIHBsYW5lLCBhcyBhIGZ1bmN0aW9uIG9mIGJlYXJpbmdcbiAgICByb3RhdGlvbk1hdHJpeDogRmxvYXQ2NEFycmF5O1xuXG4gICAgLy8gWm9vbSwgbW9kdWxvIDFcbiAgICB6b29tRnJhY3Rpb246IG51bWJlcjtcblxuICAgIC8vIFRoZSBzY2FsZSBmYWN0b3IgY29tcG9uZW50IG9mIHRoZSBjb252ZXJzaW9uIGZyb20gcGl4ZWxzIChbMCwgd10geCBbaCwgMF0pIHRvIEdMXG4gICAgLy8gTkRDIChbMSwgLTFdIHggWzEsIC0xXSkgKG5vdGUgZmxpcHBlZCB5KVxuICAgIHBpeGVsc1RvR0xVbml0czogW251bWJlciwgbnVtYmVyXTtcblxuICAgIC8vIERpc3RhbmNlIGZyb20gY2FtZXJhIHRvIHRoZSBjZW50ZXIsIGluIHNjcmVlbiBwaXhlbCB1bml0cywgaW5kZXBlbmRlbnQgb2Ygem9vbVxuICAgIGNhbWVyYVRvQ2VudGVyRGlzdGFuY2U6IG51bWJlcjtcblxuICAgIC8vIFByb2plY3Rpb24gZnJvbSBtZXJjYXRvciBjb29yZGluYXRlcyAoWzAsIDBdIG53LCBbMSwgMV0gc2UpIHRvIEdMIGNsaXAgY29vcmRpbmF0ZXNcbiAgICBtZXJjYXRvck1hdHJpeDogQXJyYXk8bnVtYmVyPjtcblxuICAgIC8vIFRyYW5zbGF0ZSBwb2ludHMgaW4gbWVyY2F0b3IgY29vcmRpbmF0ZXMgdG8gYmUgY2VudGVyZWQgYWJvdXQgdGhlIGNhbWVyYSwgd2l0aCB1bml0cyBjaG9zZW5cbiAgICAvLyBmb3Igc2NyZWVuLWhlaWdodC1pbmRlcGVuZGVudCBzY2FsaW5nIG9mIGZvZy4gTm90IGFmZmVjdGVkIGJ5IG9yaWVudGF0aW9uIG9mIGNhbWVyYS5cbiAgICBtZXJjYXRvckZvZ01hdHJpeDogQXJyYXk8bnVtYmVyPjtcblxuICAgIC8vIFByb2plY3Rpb24gZnJvbSB3b3JsZCBjb29yZGluYXRlcyAobWVyY2F0b3Igc2NhbGVkIGJ5IHdvcmxkU2l6ZSkgdG8gY2xpcCBjb29yZGluYXRlc1xuICAgIHByb2pNYXRyaXg6IEFycmF5PG51bWJlcj47XG4gICAgaW52UHJvak1hdHJpeDogRmxvYXQ2NEFycmF5O1xuXG4gICAgLy8gU2FtZSBhcyBwcm9qTWF0cml4LCBwaXhlbC1hbGlnbmVkIHRvIGF2b2lkIGZyYWN0aW9uYWwgcGl4ZWxzIGZvciByYXN0ZXIgdGlsZXNcbiAgICBhbGlnbmVkUHJvak1hdHJpeDogRmxvYXQ2NEFycmF5O1xuXG4gICAgLy8gRnJvbSB3b3JsZCBjb29yZGluYXRlcyB0byBzY3JlZW4gcGl4ZWwgY29vcmRpbmF0ZXMgKHByb2pNYXRyaXggcHJlbXVsdGlwbGllZCBieSBsYWJlbFBsYW5lTWF0cml4KVxuICAgIHBpeGVsTWF0cml4OiBGbG9hdDY0QXJyYXk7XG4gICAgcGl4ZWxNYXRyaXhJbnZlcnNlOiBGbG9hdDY0QXJyYXk7XG5cbiAgICB3b3JsZFRvRm9nTWF0cml4OiBGbG9hdDY0QXJyYXk7XG4gICAgc2t5Ym94TWF0cml4OiBGbG9hdDMyQXJyYXk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gZnJvbSBzY3JlZW4gY29vcmRpbmF0ZXMgdG8gR0wgTkRDLCBbMCwgd10geCBbaCwgMF0gLS0+IFstMSwgMV0geCBbLTEsIDFdXG4gICAgLy8gUm91Z2hseSBzcGVha2luZywgYXBwbGllcyBwaXhlbHNUb0dMVW5pdHMgc2NhbGluZyB3aXRoIGEgdHJhbnNsYXRpb25cbiAgICBnbENvb3JkTWF0cml4OiBGbG9hdDMyQXJyYXk7XG5cbiAgICAvLyBJbnZlcnNlIG9mIGdsQ29vcmRNYXRyaXgsIGZyb20gTkRDIHRvIHNjcmVlbiBjb29yZGluYXRlcywgWy0xLCAxXSB4IFstMSwgMV0gLS0+IFswLCB3XSB4IFtoLCAwXVxuICAgIGxhYmVsUGxhbmVNYXRyaXg6IEZsb2F0MzJBcnJheTtcblxuICAgIGludmVyc2VBZGp1c3RtZW50TWF0cml4OiBBcnJheTxudW1iZXI+O1xuXG4gICAgbWluTG5nOiBudW1iZXI7XG4gICAgbWF4TG5nOiBudW1iZXI7XG4gICAgbWluTGF0OiBudW1iZXI7XG4gICAgbWF4TGF0OiBudW1iZXI7XG4gICAgd29ybGRNaW5YOiBudW1iZXI7XG4gICAgd29ybGRNYXhYOiBudW1iZXI7XG4gICAgd29ybGRNaW5ZOiBudW1iZXI7XG4gICAgd29ybGRNYXhZOiBudW1iZXI7XG5cbiAgICBmcmVlemVUaWxlQ292ZXJhZ2U6IGJvb2xlYW47XG4gICAgY2FtZXJhRWxldmF0aW9uUmVmZXJlbmNlOiBFbGV2YXRpb25SZWZlcmVuY2U7XG4gICAgZm9nQ3VsbERpc3RTcTogP251bWJlcjtcbiAgICBfYXZlcmFnZUVsZXZhdGlvbjogbnVtYmVyO1xuICAgIHByb2plY3Rpb25PcHRpb25zOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbjtcbiAgICBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uO1xuICAgIF9lbGV2YXRpb246ID9FbGV2YXRpb247XG4gICAgX2ZvdjogbnVtYmVyO1xuICAgIF9waXRjaDogbnVtYmVyO1xuICAgIF96b29tOiBudW1iZXI7XG4gICAgX2NhbWVyYVpvb206ID9udW1iZXI7XG4gICAgX3VubW9kaWZpZWQ6IGJvb2xlYW47XG4gICAgX3JlbmRlcldvcmxkQ29waWVzOiBib29sZWFuO1xuICAgIF9taW5ab29tOiBudW1iZXI7XG4gICAgX21heFpvb206IG51bWJlcjtcbiAgICBfbWluUGl0Y2g6IG51bWJlcjtcbiAgICBfbWF4UGl0Y2g6IG51bWJlcjtcbiAgICBfY2VudGVyOiBMbmdMYXQ7XG4gICAgX2VkZ2VJbnNldHM6IEVkZ2VJbnNldHM7XG4gICAgX2NvbnN0cmFpbmluZzogYm9vbGVhbjtcbiAgICBfcHJvak1hdHJpeENhY2hlOiB7W186IG51bWJlcl06IEZsb2F0MzJBcnJheX07XG4gICAgX2FsaWduZWRQcm9qTWF0cml4Q2FjaGU6IHtbXzogbnVtYmVyXTogRmxvYXQzMkFycmF5fTtcbiAgICBfcGl4ZWxzVG9UaWxlVW5pdHNDYWNoZToge1tfOiBudW1iZXJdOiBGbG9hdDMyQXJyYXl9O1xuICAgIF9mb2dUaWxlTWF0cml4Q2FjaGU6IHtbXzogbnVtYmVyXTogRmxvYXQzMkFycmF5fTtcbiAgICBfZGlzdGFuY2VUaWxlRGF0YUNhY2hlOiB7W186IG51bWJlcl06IEZlYXR1cmVEaXN0YW5jZURhdGF9O1xuICAgIF9jYW1lcmE6IEZyZWVDYW1lcmE7XG4gICAgX2NlbnRlckFsdGl0dWRlOiBudW1iZXI7XG4gICAgX2hvcml6b25TaGlmdDogbnVtYmVyO1xuICAgIF9wcm9qZWN0aW9uU2NhbGVyOiBudW1iZXI7XG4gICAgX25lYXJaOiBudW1iZXI7XG4gICAgX2Zhclo6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG1pblpvb206ID9udW1iZXIsIG1heFpvb206ID9udW1iZXIsIG1pblBpdGNoOiA/bnVtYmVyLCBtYXhQaXRjaDogP251bWJlciwgcmVuZGVyV29ybGRDb3BpZXM6IGJvb2xlYW4gfCB2b2lkKSB7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7IC8vIGNvbnN0YW50XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyV29ybGRDb3BpZXMgPSByZW5kZXJXb3JsZENvcGllcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHJlbmRlcldvcmxkQ29waWVzO1xuICAgICAgICB0aGlzLl9taW5ab29tID0gbWluWm9vbSB8fCBERUZBVUxUX01JTl9aT09NO1xuICAgICAgICB0aGlzLl9tYXhab29tID0gbWF4Wm9vbSB8fCAyMjtcblxuICAgICAgICB0aGlzLl9taW5QaXRjaCA9IChtaW5QaXRjaCA9PT0gdW5kZWZpbmVkIHx8IG1pblBpdGNoID09PSBudWxsKSA/IDAgOiBtaW5QaXRjaDtcbiAgICAgICAgdGhpcy5fbWF4UGl0Y2ggPSAobWF4UGl0Y2ggPT09IHVuZGVmaW5lZCB8fCBtYXhQaXRjaCA9PT0gbnVsbCkgPyA2MCA6IG1heFBpdGNoO1xuXG4gICAgICAgIHRoaXMuc2V0UHJvamVjdGlvbigpO1xuICAgICAgICB0aGlzLnNldE1heEJvdW5kcygpO1xuXG4gICAgICAgIHRoaXMud2lkdGggPSAwO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuX2NlbnRlciA9IG5ldyBMbmdMYXQoMCwgMCk7XG4gICAgICAgIHRoaXMuem9vbSA9IDA7XG4gICAgICAgIHRoaXMuYW5nbGUgPSAwO1xuICAgICAgICB0aGlzLl9mb3YgPSAwLjY0MzUwMTEwODc5MzI4NDQ7XG4gICAgICAgIHRoaXMuX3BpdGNoID0gMDtcbiAgICAgICAgdGhpcy5fbmVhclogPSAwO1xuICAgICAgICB0aGlzLl9mYXJaID0gMDtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2VkZ2VJbnNldHMgPSBuZXcgRWRnZUluc2V0cygpO1xuICAgICAgICB0aGlzLl9wcm9qTWF0cml4Q2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5fYWxpZ25lZFByb2pNYXRyaXhDYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLl9mb2dUaWxlTWF0cml4Q2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5fZGlzdGFuY2VUaWxlRGF0YUNhY2hlID0ge307XG4gICAgICAgIHRoaXMuX2NhbWVyYSA9IG5ldyBGcmVlQ2FtZXJhKCk7XG4gICAgICAgIHRoaXMuX2NlbnRlckFsdGl0dWRlID0gMDtcbiAgICAgICAgdGhpcy5fYXZlcmFnZUVsZXZhdGlvbiA9IDA7XG4gICAgICAgIHRoaXMuY2FtZXJhRWxldmF0aW9uUmVmZXJlbmNlID0gXCJncm91bmRcIjtcbiAgICAgICAgdGhpcy5fcHJvamVjdGlvblNjYWxlciA9IDEuMDtcblxuICAgICAgICAvLyBNb3ZlIHRoZSBob3Jpem9uIGNsb3NlciB0byB0aGUgY2VudGVyLiAwIHdvdWxkIG5vdCBzaGlmdCB0aGUgaG9yaXpvbi4gMSB3b3VsZCBwdXQgdGhlIGhvcml6b24gYXQgdGhlIGNlbnRlci5cbiAgICAgICAgdGhpcy5faG9yaXpvblNoaWZ0ID0gMC4xO1xuICAgIH1cblxuICAgIGNsb25lKCk6IFRyYW5zZm9ybSB7XG4gICAgICAgIGNvbnN0IGNsb25lID0gbmV3IFRyYW5zZm9ybSh0aGlzLl9taW5ab29tLCB0aGlzLl9tYXhab29tLCB0aGlzLl9taW5QaXRjaCwgdGhpcy5tYXhQaXRjaCwgdGhpcy5fcmVuZGVyV29ybGRDb3BpZXMpO1xuICAgICAgICBjbG9uZS5zZXRQcm9qZWN0aW9uKHRoaXMuZ2V0UHJvamVjdGlvbigpKTtcbiAgICAgICAgY2xvbmUuX2VsZXZhdGlvbiA9IHRoaXMuX2VsZXZhdGlvbjtcbiAgICAgICAgY2xvbmUuX2NlbnRlckFsdGl0dWRlID0gdGhpcy5fY2VudGVyQWx0aXR1ZGU7XG4gICAgICAgIGNsb25lLnRpbGVTaXplID0gdGhpcy50aWxlU2l6ZTtcbiAgICAgICAgY2xvbmUuc2V0TWF4Qm91bmRzKHRoaXMuZ2V0TWF4Qm91bmRzKCkpO1xuICAgICAgICBjbG9uZS53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIGNsb25lLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICBjbG9uZS5jYW1lcmFFbGV2YXRpb25SZWZlcmVuY2UgPSB0aGlzLmNhbWVyYUVsZXZhdGlvblJlZmVyZW5jZTtcbiAgICAgICAgY2xvbmUuX2NlbnRlciA9IHRoaXMuX2NlbnRlcjtcbiAgICAgICAgY2xvbmUuX3NldFpvb20odGhpcy56b29tKTtcbiAgICAgICAgY2xvbmUuX2NhbWVyYVpvb20gPSB0aGlzLl9jYW1lcmFab29tO1xuICAgICAgICBjbG9uZS5hbmdsZSA9IHRoaXMuYW5nbGU7XG4gICAgICAgIGNsb25lLl9mb3YgPSB0aGlzLl9mb3Y7XG4gICAgICAgIGNsb25lLl9waXRjaCA9IHRoaXMuX3BpdGNoO1xuICAgICAgICBjbG9uZS5fbmVhclogPSB0aGlzLl9uZWFyWjtcbiAgICAgICAgY2xvbmUuX2ZhclogPSB0aGlzLl9mYXJaO1xuICAgICAgICBjbG9uZS5fYXZlcmFnZUVsZXZhdGlvbiA9IHRoaXMuX2F2ZXJhZ2VFbGV2YXRpb247XG4gICAgICAgIGNsb25lLl91bm1vZGlmaWVkID0gdGhpcy5fdW5tb2RpZmllZDtcbiAgICAgICAgY2xvbmUuX2VkZ2VJbnNldHMgPSB0aGlzLl9lZGdlSW5zZXRzLmNsb25lKCk7XG4gICAgICAgIGNsb25lLl9jYW1lcmEgPSB0aGlzLl9jYW1lcmEuY2xvbmUoKTtcbiAgICAgICAgY2xvbmUuX2NhbGNNYXRyaWNlcygpO1xuICAgICAgICBjbG9uZS5mcmVlemVUaWxlQ292ZXJhZ2UgPSB0aGlzLmZyZWV6ZVRpbGVDb3ZlcmFnZTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cblxuICAgIGdldCBlbGV2YXRpb24oKTogP0VsZXZhdGlvbiB7IHJldHVybiB0aGlzLl9lbGV2YXRpb247IH1cbiAgICBzZXQgZWxldmF0aW9uKGVsZXZhdGlvbjogP0VsZXZhdGlvbikge1xuICAgICAgICBpZiAodGhpcy5fZWxldmF0aW9uID09PSBlbGV2YXRpb24pIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWxldmF0aW9uID0gZWxldmF0aW9uO1xuICAgICAgICBpZiAoIWVsZXZhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fY2FtZXJhWm9vbSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9jZW50ZXJBbHRpdHVkZSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdXBkYXRlQ2VudGVyRWxldmF0aW9uKCkpXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2FtZXJhT25UZXJyYWluKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuICAgIHVwZGF0ZUVsZXZhdGlvbihjb25zdHJhaW5DYW1lcmFPdmVyVGVycmFpbjogYm9vbGVhbikgeyAvLyBPbiByZW5kZXIsIG5vIG5lZWQgZm9yIGhpZ2hlciBncmFudWxhcml0eSBvbiB1cGRhdGUgcmVhc29ucy5cbiAgICAgICAgaWYgKHRoaXMuX3RlcnJhaW5FbmFibGVkKCkgJiYgdGhpcy5fY2FtZXJhWm9vbSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdXBkYXRlQ2VudGVyRWxldmF0aW9uKCkpXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2FtZXJhT25UZXJyYWluKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnN0cmFpbkNhbWVyYU92ZXJUZXJyYWluKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25zdHJhaW5DYW1lcmFBbHRpdHVkZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIGdldFByb2plY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBwaWNrKHRoaXMucHJvamVjdGlvbiwgWyduYW1lJywgJ2NlbnRlcicsICdwYXJhbGxlbHMnXSk7XG4gICAgfVxuXG4gICAgc2V0UHJvamVjdGlvbihwcm9qZWN0aW9uPzogP1Byb2plY3Rpb25TcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIGlmIChwcm9qZWN0aW9uID09PSB1bmRlZmluZWQgfHwgcHJvamVjdGlvbiA9PT0gbnVsbCkgcHJvamVjdGlvbiA9IHtuYW1lOiAnbWVyY2F0b3InfTtcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uT3B0aW9ucyA9IHByb2plY3Rpb247XG5cbiAgICAgICAgY29uc3Qgb2xkUHJvamVjdGlvbiA9IHRoaXMucHJvamVjdGlvbiA/IHRoaXMuZ2V0UHJvamVjdGlvbigpIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnByb2plY3Rpb24gPSBnZXRQcm9qZWN0aW9uKHByb2plY3Rpb24pO1xuXG4gICAgICAgIGlmIChkZWVwRXF1YWwob2xkUHJvamVjdGlvbiwgdGhpcy5nZXRQcm9qZWN0aW9uKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldCBtaW5ab29tKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9taW5ab29tOyB9XG4gICAgc2V0IG1pblpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9taW5ab29tID09PSB6b29tKSByZXR1cm47XG4gICAgICAgIHRoaXMuX21pblpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnpvb20gPSBNYXRoLm1heCh0aGlzLnpvb20sIHpvb20pO1xuICAgIH1cblxuICAgIGdldCBtYXhab29tKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9tYXhab29tOyB9XG4gICAgc2V0IG1heFpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXhab29tID09PSB6b29tKSByZXR1cm47XG4gICAgICAgIHRoaXMuX21heFpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnpvb20gPSBNYXRoLm1pbih0aGlzLnpvb20sIHpvb20pO1xuICAgIH1cblxuICAgIGdldCBtaW5QaXRjaCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbWluUGl0Y2g7IH1cbiAgICBzZXQgbWluUGl0Y2gocGl0Y2g6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5fbWluUGl0Y2ggPT09IHBpdGNoKSByZXR1cm47XG4gICAgICAgIHRoaXMuX21pblBpdGNoID0gcGl0Y2g7XG4gICAgICAgIHRoaXMucGl0Y2ggPSBNYXRoLm1heCh0aGlzLnBpdGNoLCBwaXRjaCk7XG4gICAgfVxuXG4gICAgZ2V0IG1heFBpdGNoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9tYXhQaXRjaDsgfVxuICAgIHNldCBtYXhQaXRjaChwaXRjaDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXhQaXRjaCA9PT0gcGl0Y2gpIHJldHVybjtcbiAgICAgICAgdGhpcy5fbWF4UGl0Y2ggPSBwaXRjaDtcbiAgICAgICAgdGhpcy5waXRjaCA9IE1hdGgubWluKHRoaXMucGl0Y2gsIHBpdGNoKTtcbiAgICB9XG5cbiAgICBnZXQgcmVuZGVyV29ybGRDb3BpZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJXb3JsZENvcGllcyAmJiB0aGlzLnByb2plY3Rpb24uc3VwcG9ydHNXb3JsZENvcGllcyA9PT0gdHJ1ZTtcbiAgICB9XG4gICAgc2V0IHJlbmRlcldvcmxkQ29waWVzKHJlbmRlcldvcmxkQ29waWVzPzogP2Jvb2xlYW4pIHtcbiAgICAgICAgaWYgKHJlbmRlcldvcmxkQ29waWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlbmRlcldvcmxkQ29waWVzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJXb3JsZENvcGllcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVuZGVyV29ybGRDb3BpZXMgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzID0gcmVuZGVyV29ybGRDb3BpZXM7XG4gICAgfVxuXG4gICAgZ2V0IHdvcmxkU2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlU2l6ZSAqIHRoaXMuc2NhbGU7XG4gICAgfVxuXG4gICAgZ2V0IGNhbWVyYVdvcmxkU2l6ZSgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGgubWF4KHRoaXMuX2NhbWVyYS5nZXREaXN0YW5jZVRvRWxldmF0aW9uKHRoaXMuX2F2ZXJhZ2VFbGV2YXRpb24pLCBOdW1iZXIuRVBTSUxPTik7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3JsZFNpemVGcm9tWm9vbSh0aGlzLl96b29tRnJvbU1lcmNhdG9yWihkaXN0YW5jZSkpO1xuICAgIH1cblxuICAgIGdldCBwaXhlbHNQZXJNZXRlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnBpeGVsc1Blck1ldGVyKHRoaXMuY2VudGVyLmxhdCwgdGhpcy53b3JsZFNpemUpO1xuICAgIH1cblxuICAgIGdldCBjYW1lcmFQaXhlbHNQZXJNZXRlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnBpeGVsc1Blck1ldGVyKHRoaXMuY2VudGVyLmxhdCwgdGhpcy5jYW1lcmFXb3JsZFNpemUpO1xuICAgIH1cblxuICAgIGdldCBjZW50ZXJPZmZzZXQoKTogUG9pbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jZW50ZXJQb2ludC5fc3ViKHRoaXMuc2l6ZS5fZGl2KDIpKTtcbiAgICB9XG5cbiAgICBnZXQgc2l6ZSgpOiBQb2ludCB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgIH1cblxuICAgIGdldCBiZWFyaW5nKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB3cmFwKHRoaXMucm90YXRpb24sIC0xODAsIDE4MCk7XG4gICAgfVxuXG4gICAgc2V0IGJlYXJpbmcoYmVhcmluZzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMucm90YXRpb24gPSBiZWFyaW5nO1xuICAgIH1cblxuICAgIGdldCByb3RhdGlvbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gLXRoaXMuYW5nbGUgLyBNYXRoLlBJICogMTgwO1xuICAgIH1cblxuICAgIHNldCByb3RhdGlvbihyb3RhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGIgPSAtcm90YXRpb24gKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgICBpZiAodGhpcy5hbmdsZSA9PT0gYikgcmV0dXJuO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW5nbGUgPSBiO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcblxuICAgICAgICAvLyAyeDIgbWF0cml4IGZvciByb3RhdGluZyBwb2ludHNcbiAgICAgICAgdGhpcy5yb3RhdGlvbk1hdHJpeCA9IG1hdDIuY3JlYXRlKCk7XG4gICAgICAgIG1hdDIucm90YXRlKHRoaXMucm90YXRpb25NYXRyaXgsIHRoaXMucm90YXRpb25NYXRyaXgsIHRoaXMuYW5nbGUpO1xuICAgIH1cblxuICAgIGdldCBwaXRjaCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGl0Y2ggLyBNYXRoLlBJICogMTgwO1xuICAgIH1cbiAgICBzZXQgcGl0Y2gocGl0Y2g6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwID0gY2xhbXAocGl0Y2gsIHRoaXMubWluUGl0Y2gsIHRoaXMubWF4UGl0Y2gpIC8gMTgwICogTWF0aC5QSTtcbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoID09PSBwKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcGl0Y2ggPSBwO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBnZXQgZm92KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3YgLyBNYXRoLlBJICogMTgwO1xuICAgIH1cbiAgICBzZXQgZm92KGZvdjogbnVtYmVyKSB7XG4gICAgICAgIGZvdiA9IE1hdGgubWF4KDAuMDEsIE1hdGgubWluKDYwLCBmb3YpKTtcbiAgICAgICAgaWYgKHRoaXMuX2ZvdiA9PT0gZm92KSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZm92ID0gZm92IC8gMTgwICogTWF0aC5QSTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IGF2ZXJhZ2VFbGV2YXRpb24oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F2ZXJhZ2VFbGV2YXRpb247XG4gICAgfVxuICAgIHNldCBhdmVyYWdlRWxldmF0aW9uKGF2ZXJhZ2VFbGV2YXRpb246IG51bWJlcikge1xuICAgICAgICB0aGlzLl9hdmVyYWdlRWxldmF0aW9uID0gYXZlcmFnZUVsZXZhdGlvbjtcbiAgICAgICAgdGhpcy5fY2FsY0ZvZ01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IHpvb20oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3pvb207IH1cbiAgICBzZXQgem9vbSh6b29tOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgeiA9IE1hdGgubWluKE1hdGgubWF4KHpvb20sIHRoaXMubWluWm9vbSksIHRoaXMubWF4Wm9vbSk7XG4gICAgICAgIGlmICh0aGlzLl96b29tID09PSB6KSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc2V0Wm9vbSh6KTtcbiAgICAgICAgaWYgKHRoaXMuX3RlcnJhaW5FbmFibGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNhbWVyYU9uVGVycmFpbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbigpO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG4gICAgX3NldFpvb20oejogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3pvb20gPSB6O1xuICAgICAgICB0aGlzLnNjYWxlID0gdGhpcy56b29tU2NhbGUoeik7XG4gICAgICAgIHRoaXMudGlsZVpvb20gPSBNYXRoLmZsb29yKHopO1xuICAgICAgICB0aGlzLnpvb21GcmFjdGlvbiA9IHogLSB0aGlzLnRpbGVab29tO1xuICAgIH1cblxuICAgIF91cGRhdGVDZW50ZXJFbGV2YXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5fZWxldmF0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIENhbWVyYSB6b29tIGRlc2NyaWJlcyB0aGUgZGlzdGFuY2Ugb2YgdGhlIGNhbWVyYSB0byB0aGUgc2VhIGxldmVsIChhbHRpdHVkZSkuIEl0IGlzIHVzZWQgb25seSBmb3IgbWFuaXB1bGF0aW5nIHRoZSBjYW1lcmEgbG9jYXRpb24uXG4gICAgICAgIC8vIFRoZSBzdGFuZGFyZCB6b29tICh0aGlzLl96b29tKSBkZWZpbmVzIHRoZSBjYW1lcmEgZGlzdGFuY2UgdG8gdGhlIHRlcnJhaW4gKGhlaWdodCkuIEl0cyBiZWhhdmlvciBhbmQgY29uY2VwdHVhbCBtZWFuaW5nIGluIGRldGVybWluaW5nXG4gICAgICAgIC8vIHdoaWNoIHRpbGVzIHRvIHN0cmVhbSBpcyBzYW1lIHdpdGggb3Igd2l0aG91dCB0aGUgdGVycmFpbi5cbiAgICAgICAgY29uc3QgZWxldmF0aW9uQXRDZW50ZXIgPSB0aGlzLl9lbGV2YXRpb24uZ2V0QXRQb2ludE9yWmVybyh0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0aGlzLmNlbnRlciksIC0xKTtcblxuICAgICAgICBpZiAoZWxldmF0aW9uQXRDZW50ZXIgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBFbGV2YXRpb24gZGF0YSBub3QgbG9hZGVkIHlldFxuICAgICAgICAgICAgdGhpcy5fY2FtZXJhWm9vbSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jZW50ZXJBbHRpdHVkZSA9IGVsZXZhdGlvbkF0Q2VudGVyO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBQbGFjZXMgdGhlIGNhbWVyYSBhYm92ZSB0ZXJyYWluIHNvIHRoYXQgdGhlIGN1cnJlbnQgem9vbSB2YWx1ZSBpcyByZXNwZWN0ZWQgYXQgdGhlIGNlbnRlci5cbiAgICAvLyBJbiBvdGhlciB3b3JkcywgY2FtZXJhIGhlaWdodCBpbiByZWxhdGl2ZSB0byBncm91bmQgZWxldmF0aW9uIHJlbWFpbnMgY29uc3RhbnQuXG4gICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgZWxldmF0aW9uIGRhdGEgaXMgbm90IGF2YWlsYWJsZSAoeWV0KSBhdCB0aGUgY2VudGVyIHBvaW50LlxuICAgIF91cGRhdGVDYW1lcmFPblRlcnJhaW4oKSB7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcbiAgICAgICAgY29uc3QgdGVycmFpbkVsZXZhdGlvbiA9IHRoaXMucGl4ZWxzUGVyTWV0ZXIgKiB0aGlzLl9jZW50ZXJBbHRpdHVkZTtcbiAgICAgICAgdGhpcy5fY2FtZXJhWm9vbSA9IHRoaXMuX3pvb21Gcm9tTWVyY2F0b3JaKCh0ZXJyYWluRWxldmF0aW9uICsgaGVpZ2h0KSAvIHRoaXMud29ybGRTaXplKTtcbiAgICB9XG5cbiAgICBzYW1wbGVBdmVyYWdlRWxldmF0aW9uKCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5fZWxldmF0aW9uKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgZWxldmF0aW9uOiBFbGV2YXRpb24gPSB0aGlzLl9lbGV2YXRpb247XG5cbiAgICAgICAgY29uc3QgZWxldmF0aW9uU2FtcGxlUG9pbnRzID0gW1xuICAgICAgICAgICAgWzAuNSwgMC4yXSxcbiAgICAgICAgICAgIFswLjMsIDAuNV0sXG4gICAgICAgICAgICBbMC41LCAwLjVdLFxuICAgICAgICAgICAgWzAuNywgMC41XSxcbiAgICAgICAgICAgIFswLjUsIDAuOF1cbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBob3Jpem9uID0gdGhpcy5ob3Jpem9uTGluZUZyb21Ub3AoKTtcblxuICAgICAgICBsZXQgZWxldmF0aW9uU3VtID0gMC4wO1xuICAgICAgICBsZXQgd2VpZ2h0U3VtID0gMC4wO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZXZhdGlvblNhbXBsZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcHQgPSBuZXcgUG9pbnQoXG4gICAgICAgICAgICAgICAgZWxldmF0aW9uU2FtcGxlUG9pbnRzW2ldWzBdICogdGhpcy53aWR0aCxcbiAgICAgICAgICAgICAgICBob3Jpem9uICsgZWxldmF0aW9uU2FtcGxlUG9pbnRzW2ldWzFdICogKHRoaXMuaGVpZ2h0IC0gaG9yaXpvbilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBoaXQgPSBlbGV2YXRpb24ucG9pbnRDb29yZGluYXRlKHB0KTtcbiAgICAgICAgICAgIGlmICghaGl0KSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2VUb0hpdCA9IE1hdGguaHlwb3QoaGl0WzBdIC0gdGhpcy5fY2FtZXJhLnBvc2l0aW9uWzBdLCBoaXRbMV0gLSB0aGlzLl9jYW1lcmEucG9zaXRpb25bMV0pO1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0ID0gMSAvIGRpc3RhbmNlVG9IaXQ7XG4gICAgICAgICAgICBlbGV2YXRpb25TdW0gKz0gaGl0WzNdICogd2VpZ2h0O1xuICAgICAgICAgICAgd2VpZ2h0U3VtICs9IHdlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3ZWlnaHRTdW0gPT09IDApIHJldHVybiBOYU47XG4gICAgICAgIHJldHVybiBlbGV2YXRpb25TdW0gLyB3ZWlnaHRTdW07XG4gICAgfVxuXG4gICAgZ2V0IGNlbnRlcigpOiBMbmdMYXQgeyByZXR1cm4gdGhpcy5fY2VudGVyOyB9XG4gICAgc2V0IGNlbnRlcihjZW50ZXI6IExuZ0xhdCkge1xuICAgICAgICBpZiAoY2VudGVyLmxhdCA9PT0gdGhpcy5fY2VudGVyLmxhdCAmJiBjZW50ZXIubG5nID09PSB0aGlzLl9jZW50ZXIubG5nKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jZW50ZXIgPSBjZW50ZXI7XG4gICAgICAgIGlmICh0aGlzLl90ZXJyYWluRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYW1lcmFFbGV2YXRpb25SZWZlcmVuY2UgPT09IFwiZ3JvdW5kXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBlbGV2YXRpb24gZGF0YSBpcyBhdmFpbGFibGUgYXQgdGhlIG5ldyBsb2NhdGlvbi5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdXBkYXRlQ2VudGVyRWxldmF0aW9uKCkpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNhbWVyYU9uVGVycmFpbigpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FtZXJhWm9vbSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVpvb21Gcm9tRWxldmF0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIF91cGRhdGVab29tRnJvbUVsZXZhdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbWVyYVpvb20gPT0gbnVsbCB8fCAhdGhpcy5fZWxldmF0aW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIENvbXB1dGUgem9vbSBsZXZlbCBmcm9tIHRoZSBoZWlnaHQgb2YgdGhlIGNhbWVyYSByZWxhdGl2ZSB0byB0aGUgdGVycmFpblxuICAgICAgICBjb25zdCBjYW1lcmFab29tOiBudW1iZXIgPSB0aGlzLl9jYW1lcmFab29tO1xuICAgICAgICBjb25zdCBlbGV2YXRpb25BdENlbnRlciA9IHRoaXMuX2VsZXZhdGlvbi5nZXRBdFBvaW50T3JaZXJvKHRoaXMubG9jYXRpb25Db29yZGluYXRlKHRoaXMuY2VudGVyKSk7XG4gICAgICAgIGNvbnN0IG1lcmNhdG9yRWxldmF0aW9uID0gdGhpcy5waXhlbHNQZXJNZXRlciAvIHRoaXMud29ybGRTaXplICogZWxldmF0aW9uQXRDZW50ZXI7XG4gICAgICAgIGNvbnN0IGFsdGl0dWRlICA9IHRoaXMuX21lcmNhdG9yWmZyb21ab29tKGNhbWVyYVpvb20pO1xuICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSB0aGlzLl9tZXJjYXRvclpmcm9tWm9vbSh0aGlzLl9tYXhab29tKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoYWx0aXR1ZGUgLSBtZXJjYXRvckVsZXZhdGlvbiwgbWluSGVpZ2h0KTtcblxuICAgICAgICB0aGlzLl9zZXRab29tKHRoaXMuX3pvb21Gcm9tTWVyY2F0b3JaKGhlaWdodCkpO1xuICAgIH1cblxuICAgIGdldCBwYWRkaW5nKCk6IFBhZGRpbmdPcHRpb25zIHsgcmV0dXJuIHRoaXMuX2VkZ2VJbnNldHMudG9KU09OKCk7IH1cbiAgICBzZXQgcGFkZGluZyhwYWRkaW5nOiBQYWRkaW5nT3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5fZWRnZUluc2V0cy5lcXVhbHMocGFkZGluZykpIHJldHVybjtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICAvL1VwZGF0ZSBlZGdlLWluc2V0cyBpbnBsYWNlXG4gICAgICAgIHRoaXMuX2VkZ2VJbnNldHMuaW50ZXJwb2xhdGUodGhpcy5fZWRnZUluc2V0cywgcGFkZGluZywgMSk7XG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIGEgem9vbSB2YWx1ZSByZWxhdGl2ZSB0byBhIG1hcCBwbGFuZSB0aGF0IGdvZXMgdGhyb3VnaCB0aGUgcHJvdmlkZWQgbWVyY2F0b3IgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge01lcmNhdG9yQ29vcmRpbmF0ZX0gcG9zaXRpb24gQSBwb3NpdGlvbiBkZWZpbmluZyB0aGUgYWx0aXR1ZGUgb2YgdGhlIHRoZSBtYXAgcGxhbmUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHpvb20gdmFsdWUuXG4gICAgICovXG4gICAgY29tcHV0ZVpvb21SZWxhdGl2ZVRvKHBvc2l0aW9uOiBNZXJjYXRvckNvb3JkaW5hdGUpOiBudW1iZXIge1xuICAgICAgICAvLyBGaW5kIG1hcCBjZW50ZXIgcG9zaXRpb24gb24gdGhlIHRhcmdldCBwbGFuZSBieSBjYXN0aW5nIGEgcmF5IGZyb20gc2NyZWVuIGNlbnRlciB0b3dhcmRzIHRoZSBwbGFuZS5cbiAgICAgICAgLy8gRGlyZWN0IGRpc3RhbmNlIHRvIHRoZSB0YXJnZXQgcG9zaXRpb24gaXMgdXNlZCBpZiB0aGUgdGFyZ2V0IHBvc2l0aW9uIGlzIGFib3ZlIGNhbWVyYSBwb3NpdGlvbi5cbiAgICAgICAgY29uc3QgY2VudGVyT25UYXJnZXRBbHRpdHVkZSA9IHRoaXMucmF5SW50ZXJzZWN0aW9uQ29vcmRpbmF0ZSh0aGlzLnBvaW50UmF5SW50ZXJzZWN0aW9uKHRoaXMuY2VudGVyUG9pbnQsIHBvc2l0aW9uLnRvQWx0aXR1ZGUoKSkpO1xuXG4gICAgICAgIGxldCB0YXJnZXRQb3NpdGlvbjogP3ZlYzM7XG4gICAgICAgIGlmIChwb3NpdGlvbi56IDwgdGhpcy5fY2FtZXJhLnBvc2l0aW9uWzJdKSB7XG4gICAgICAgICAgICB0YXJnZXRQb3NpdGlvbiA9IFtjZW50ZXJPblRhcmdldEFsdGl0dWRlLngsIGNlbnRlck9uVGFyZ2V0QWx0aXR1ZGUueSwgY2VudGVyT25UYXJnZXRBbHRpdHVkZS56XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFBvc2l0aW9uID0gW3Bvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnpdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlzdFRvVGFyZ2V0ID0gdmVjMy5sZW5ndGgodmVjMy5zdWIoW10sIHRoaXMuX2NhbWVyYS5wb3NpdGlvbiwgdGFyZ2V0UG9zaXRpb24pKTtcbiAgICAgICAgcmV0dXJuIGNsYW1wKHRoaXMuX3pvb21Gcm9tTWVyY2F0b3JaKGRpc3RUb1RhcmdldCksIHRoaXMuX21pblpvb20sIHRoaXMuX21heFpvb20pO1xuICAgIH1cblxuICAgIHNldEZyZWVDYW1lcmFPcHRpb25zKG9wdGlvbnM6IEZyZWVDYW1lcmFPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5oZWlnaHQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLnBvc2l0aW9uICYmICFvcHRpb25zLm9yaWVudGF0aW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIENhbWVyYSBzdGF0ZSBtdXN0IGJlIHVwLXRvLWRhdGUgYmVmb3JlIGFjY2Vzc2luZyBpdHMgZ2V0dGVyc1xuICAgICAgICB0aGlzLl91cGRhdGVDYW1lcmFTdGF0ZSgpO1xuXG4gICAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGlmIChvcHRpb25zLm9yaWVudGF0aW9uICYmICFxdWF0LmV4YWN0RXF1YWxzKG9wdGlvbnMub3JpZW50YXRpb24sIHRoaXMuX2NhbWVyYS5vcmllbnRhdGlvbikpIHtcbiAgICAgICAgICAgIGNoYW5nZWQgPSB0aGlzLl9zZXRDYW1lcmFPcmllbnRhdGlvbihvcHRpb25zLm9yaWVudGF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdQb3NpdGlvbiA9IFtvcHRpb25zLnBvc2l0aW9uLngsIG9wdGlvbnMucG9zaXRpb24ueSwgb3B0aW9ucy5wb3NpdGlvbi56XTtcbiAgICAgICAgICAgIGlmICghdmVjMy5leGFjdEVxdWFscyhuZXdQb3NpdGlvbiwgdGhpcy5fY2FtZXJhLnBvc2l0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldENhbWVyYVBvc2l0aW9uKG5ld1Bvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZUZyb21DYW1lcmEoKTtcbiAgICAgICAgICAgIHRoaXMucmVjZW50ZXJPblRlcnJhaW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEZyZWVDYW1lcmFPcHRpb25zKCk6IEZyZWVDYW1lcmFPcHRpb25zIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FtZXJhU3RhdGUoKTtcbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5fY2FtZXJhLnBvc2l0aW9uO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gbmV3IEZyZWVDYW1lcmFPcHRpb25zKCk7XG4gICAgICAgIG9wdGlvbnMucG9zaXRpb24gPSBuZXcgTWVyY2F0b3JDb29yZGluYXRlKHBvc1swXSwgcG9zWzFdLCBwb3NbMl0pO1xuICAgICAgICBvcHRpb25zLm9yaWVudGF0aW9uID0gdGhpcy5fY2FtZXJhLm9yaWVudGF0aW9uO1xuICAgICAgICBvcHRpb25zLl9lbGV2YXRpb24gPSB0aGlzLmVsZXZhdGlvbjtcbiAgICAgICAgb3B0aW9ucy5fcmVuZGVyV29ybGRDb3BpZXMgPSB0aGlzLnJlbmRlcldvcmxkQ29waWVzO1xuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cblxuICAgIF9zZXRDYW1lcmFPcmllbnRhdGlvbihvcmllbnRhdGlvbjogcXVhdCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyB6ZXJvLWxlbmd0aCBxdWF0ZXJuaW9ucyBhcmUgbm90IHZhbGlkXG4gICAgICAgIGlmICghcXVhdC5sZW5ndGgob3JpZW50YXRpb24pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHF1YXQubm9ybWFsaXplKG9yaWVudGF0aW9uLCBvcmllbnRhdGlvbik7XG5cbiAgICAgICAgLy8gVGhlIG5ldyBvcmllbnRhdGlvbiBtdXN0IGJlIHNhbml0aXplZCBieSBtYWtpbmcgc3VyZSBpdCBjYW4gYmUgcmVwcmVzZW50ZWRcbiAgICAgICAgLy8gd2l0aCBhIHBpdGNoIGFuZCBiZWFyaW5nLiBSb2xsLWNvbXBvbmVudCBtdXN0IGJlIHJlbW92ZWQgYW5kIHRoZSBjYW1lcmEgY2FuJ3QgYmUgdXBzaWRlIGRvd25cbiAgICAgICAgY29uc3QgZm9yd2FyZCA9IHZlYzMudHJhbnNmb3JtUXVhdChbXSwgWzAsIDAsIC0xXSwgb3JpZW50YXRpb24pO1xuICAgICAgICBjb25zdCB1cCA9IHZlYzMudHJhbnNmb3JtUXVhdChbXSwgWzAsIC0xLCAwXSwgb3JpZW50YXRpb24pO1xuXG4gICAgICAgIGlmICh1cFsyXSA8IDAuMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB1cGRhdGVkT3JpZW50YXRpb24gPSBvcmllbnRhdGlvbkZyb21GcmFtZShmb3J3YXJkLCB1cCk7XG4gICAgICAgIGlmICghdXBkYXRlZE9yaWVudGF0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX2NhbWVyYS5vcmllbnRhdGlvbiA9IHVwZGF0ZWRPcmllbnRhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgX3NldENhbWVyYVBvc2l0aW9uKHBvc2l0aW9uOiB2ZWMzKSB7XG4gICAgICAgIC8vIEFsdGl0dWRlIG11c3QgYmUgY2xhbXBlZCB0byByZXNwZWN0IG1pbiBhbmQgbWF4IHpvb21cbiAgICAgICAgY29uc3QgbWluV29ybGRTaXplID0gdGhpcy56b29tU2NhbGUodGhpcy5taW5ab29tKSAqIHRoaXMudGlsZVNpemU7XG4gICAgICAgIGNvbnN0IG1heFdvcmxkU2l6ZSA9IHRoaXMuem9vbVNjYWxlKHRoaXMubWF4Wm9vbSkgKiB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjb25zdCBkaXN0VG9DZW50ZXIgPSB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U7XG5cbiAgICAgICAgcG9zaXRpb25bMl0gPSBjbGFtcChwb3NpdGlvblsyXSwgZGlzdFRvQ2VudGVyIC8gbWF4V29ybGRTaXplLCBkaXN0VG9DZW50ZXIgLyBtaW5Xb3JsZFNpemUpO1xuICAgICAgICB0aGlzLl9jYW1lcmEucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2VudGVyIG9mIHRoZSBzY3JlZW4gaW4gcGl4ZWxzIHdpdGggdGhlIHRvcC1sZWZ0IGNvcm5lciBiZWluZyAoMCwwKVxuICAgICAqIGFuZCAreSBheGlzIHBvaW50aW5nIGRvd253YXJkcy4gVGhpcyBhY2NvdW50cyBmb3IgcGFkZGluZy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtQb2ludH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmb3JtXG4gICAgICovXG4gICAgZ2V0IGNlbnRlclBvaW50KCk6IFBvaW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkZ2VJbnNldHMuZ2V0Q2VudGVyKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2ZXJ0aWNhbCBoYWxmLWZvdiwgYWNjb3VudGluZyBmb3IgcGFkZGluZywgaW4gcmFkaWFucy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQgZm92QWJvdmVDZW50ZXIoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvdiAqICgwLjUgKyB0aGlzLmNlbnRlck9mZnNldC55IC8gdGhpcy5oZWlnaHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFkZGluZyBvcHRpb25zIGFyZSBlcXVhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UGFkZGluZ09wdGlvbnN9IHBhZGRpbmcgVGhlIHBhZGRpbmcgb3B0aW9ucyB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYWRkaW5nIG9wdGlvbnMgYXJlIGVxdWFsLlxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zvcm1cbiAgICAgKi9cbiAgICBpc1BhZGRpbmdFcXVhbChwYWRkaW5nOiBQYWRkaW5nT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWRnZUluc2V0cy5lcXVhbHMocGFkZGluZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCB0byB1cGRhdGUgZWRnZS1pbnNldHMgaW5wbGFjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UGFkZGluZ09wdGlvbnN9IHN0YXJ0IFRoZSBpbml0aWFsIHBhZGRpbmcgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0ge1BhZGRpbmdPcHRpb25zfSB0YXJnZXQgVGhlIHRhcmdldCBwYWRkaW5nIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHQgVGhlIGludGVycG9sYXRpb24gdmFyaWFibGUuXG4gICAgICogQG1lbWJlcm9mIFRyYW5zZm9ybVxuICAgICAqL1xuICAgIGludGVycG9sYXRlUGFkZGluZyhzdGFydDogUGFkZGluZ09wdGlvbnMsIHRhcmdldDogUGFkZGluZ09wdGlvbnMsIHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2VkZ2VJbnNldHMuaW50ZXJwb2xhdGUoc3RhcnQsIHRhcmdldCwgdCk7XG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbigpO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGhpZ2hlc3Qgem9vbSBsZXZlbCB0aGF0IGZ1bGx5IGluY2x1ZGVzIGFsbCB0aWxlcyB3aXRoaW4gdGhlIHRyYW5zZm9ybSdzIGJvdW5kYXJpZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50aWxlU2l6ZSBUaWxlIHNpemUsIGV4cHJlc3NlZCBpbiBzY3JlZW4gcGl4ZWxzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5yb3VuZFpvb20gVGFyZ2V0IHpvb20gbGV2ZWwuIElmIHRydWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHJvdW5kZWQgdG8gdGhlIGNsb3Nlc3QgaW50ZWdlci4gT3RoZXJ3aXNlIHRoZSB2YWx1ZSB3aWxsIGJlIGZsb29yZWQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gQW4gaW50ZWdlciB6b29tIGxldmVsIGF0IHdoaWNoIGFsbCB0aWxlcyB3aWxsIGJlIHZpc2libGUuXG4gICAgICovXG4gICAgY292ZXJpbmdab29tTGV2ZWwob3B0aW9uczoge3JvdW5kWm9vbT86IGJvb2xlYW4sIHRpbGVTaXplOiBudW1iZXJ9KSB7XG4gICAgICAgIGNvbnN0IHogPSAob3B0aW9ucy5yb3VuZFpvb20gPyBNYXRoLnJvdW5kIDogTWF0aC5mbG9vcikoXG4gICAgICAgICAgICB0aGlzLnpvb20gKyB0aGlzLnNjYWxlWm9vbSh0aGlzLnRpbGVTaXplIC8gb3B0aW9ucy50aWxlU2l6ZSlcbiAgICAgICAgKTtcbiAgICAgICAgLy8gQXQgbmVnYXRpdmUgem9vbSBsZXZlbHMgbG9hZCB0aWxlcyBmcm9tIHowIGJlY2F1c2UgbmVnYXRpdmUgdGlsZSB6b29tIGxldmVscyBkb24ndCBleGlzdC5cbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHopO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbnkgXCJ3cmFwcGVkXCIgY29waWVzIG9mIGEgZ2l2ZW4gdGlsZSBjb29yZGluYXRlIHRoYXQgYXJlIHZpc2libGVcbiAgICAgKiBpbiB0aGUgY3VycmVudCB2aWV3LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRWaXNpYmxlVW53cmFwcGVkQ29vcmRpbmF0ZXModGlsZUlEOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW25ldyBVbndyYXBwZWRUaWxlSUQoMCwgdGlsZUlEKV07XG4gICAgICAgIGlmICh0aGlzLnJlbmRlcldvcmxkQ29waWVzKSB7XG4gICAgICAgICAgICBjb25zdCB1dGwgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQoMCwgMCkpO1xuICAgICAgICAgICAgY29uc3QgdXRyID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KHRoaXMud2lkdGgsIDApKTtcbiAgICAgICAgICAgIGNvbnN0IHVibCA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCkpO1xuICAgICAgICAgICAgY29uc3QgdWJyID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsIHRoaXMuaGVpZ2h0KSk7XG4gICAgICAgICAgICBjb25zdCB3MCA9IE1hdGguZmxvb3IoTWF0aC5taW4odXRsLngsIHV0ci54LCB1YmwueCwgdWJyLngpKTtcbiAgICAgICAgICAgIGNvbnN0IHcxID0gTWF0aC5mbG9vcihNYXRoLm1heCh1dGwueCwgdXRyLngsIHVibC54LCB1YnIueCkpO1xuXG4gICAgICAgICAgICAvLyBBZGQgYW4gZXh0cmEgY29weSBvZiB0aGUgd29ybGQgb24gZWFjaCBzaWRlIHRvIHByb3Blcmx5IHJlbmRlciBJbWFnZVNvdXJjZXMgYW5kIENhbnZhc1NvdXJjZXMuXG4gICAgICAgICAgICAvLyBCb3RoIHNvdXJjZXMgZHJhdyBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kYXJpZXMgb2YgdGhlIHRpbGUgdGhhdCBcImNvbnRhaW5zIHRoZW1cIiBzbyB3ZSBuZWVkXG4gICAgICAgICAgICAvLyB0byBhZGQgZXh0cmEgY29waWVzIG9uIGJvdGggc2lkZXMgaW4gY2FzZSBvZmZzY3JlZW4gdGlsZXMgbmVlZCB0byBkcmF3IGludG8gb24tc2NyZWVuIG9uZXMuXG4gICAgICAgICAgICBjb25zdCBleHRyYVdvcmxkQ29weSA9IDE7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHcgPSB3MCAtIGV4dHJhV29ybGRDb3B5OyB3IDw9IHcxICsgZXh0cmFXb3JsZENvcHk7IHcrKykge1xuICAgICAgICAgICAgICAgIGlmICh3ID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgVW53cmFwcGVkVGlsZUlEKHcsIHRpbGVJRCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFsbCBjb29yZGluYXRlcyB0aGF0IGNvdWxkIGNvdmVyIHRoaXMgdHJhbnNmb3JtIGZvciBhIGNvdmVyaW5nXG4gICAgICogem9vbSBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnRpbGVTaXplXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMubWluem9vbVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1heHpvb21cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucm91bmRab29tXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnJlcGFyc2VPdmVyc2NhbGVkXG4gICAgICogQHJldHVybnMge0FycmF5PE92ZXJzY2FsZWRUaWxlSUQ+fSBPdmVyc2NhbGVkVGlsZUlEc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY292ZXJpbmdUaWxlcyhcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdGlsZVNpemU6IG51bWJlcixcbiAgICAgICAgICAgIG1pbnpvb20/OiBudW1iZXIsXG4gICAgICAgICAgICBtYXh6b29tPzogbnVtYmVyLFxuICAgICAgICAgICAgcm91bmRab29tPzogYm9vbGVhbixcbiAgICAgICAgICAgIHJlcGFyc2VPdmVyc2NhbGVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIHJlbmRlcldvcmxkQ29waWVzPzogYm9vbGVhbixcbiAgICAgICAgICAgIGlzVGVycmFpbkRFTT86IGJvb2xlYW5cbiAgICAgICAgfVxuICAgICk6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+IHtcbiAgICAgICAgbGV0IHogPSB0aGlzLmNvdmVyaW5nWm9vbUxldmVsKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBhY3R1YWxaID0gejtcblxuICAgICAgICBjb25zdCB1c2VFbGV2YXRpb25EYXRhID0gdGhpcy5lbGV2YXRpb24gJiYgIW9wdGlvbnMuaXNUZXJyYWluREVNO1xuICAgICAgICBjb25zdCBpc01lcmNhdG9yID0gdGhpcy5wcm9qZWN0aW9uLm5hbWUgPT09ICdtZXJjYXRvcic7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWluem9vbSAhPT0gdW5kZWZpbmVkICYmIHogPCBvcHRpb25zLm1pbnpvb20pIHJldHVybiBbXTtcbiAgICAgICAgaWYgKG9wdGlvbnMubWF4em9vbSAhPT0gdW5kZWZpbmVkICYmIHogPiBvcHRpb25zLm1heHpvb20pIHogPSBvcHRpb25zLm1heHpvb207XG5cbiAgICAgICAgY29uc3QgY2VudGVyQ29vcmQgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0aGlzLmNlbnRlcik7XG4gICAgICAgIGNvbnN0IG51bVRpbGVzID0gMSA8PCB6O1xuICAgICAgICBjb25zdCBjZW50ZXJQb2ludCA9IFtudW1UaWxlcyAqIGNlbnRlckNvb3JkLngsIG51bVRpbGVzICogY2VudGVyQ29vcmQueSwgMF07XG4gICAgICAgIGNvbnN0IHpJbk1ldGVycyA9IHRoaXMucHJvamVjdGlvbi5uYW1lICE9PSAnZ2xvYmUnO1xuICAgICAgICBjb25zdCBjYW1lcmFGcnVzdHVtID0gRnJ1c3R1bS5mcm9tSW52UHJvamVjdGlvbk1hdHJpeCh0aGlzLmludlByb2pNYXRyaXgsIHRoaXMud29ybGRTaXplLCB6LCB6SW5NZXRlcnMpO1xuICAgICAgICBjb25zdCBjYW1lcmFDb29yZCA9IHRoaXMucG9pbnRDb29yZGluYXRlKHRoaXMuZ2V0Q2FtZXJhUG9pbnQoKSk7XG4gICAgICAgIGNvbnN0IG1ldGVyVG9UaWxlID0gbnVtVGlsZXMgKiBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgdGhpcy5jZW50ZXIubGF0KTtcbiAgICAgICAgY29uc3QgY2FtZXJhQWx0aXR1ZGUgPSB0aGlzLl9jYW1lcmEucG9zaXRpb25bMl0gLyBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgdGhpcy5jZW50ZXIubGF0KTtcbiAgICAgICAgY29uc3QgY2FtZXJhUG9pbnQgPSBbbnVtVGlsZXMgKiBjYW1lcmFDb29yZC54LCBudW1UaWxlcyAqIGNhbWVyYUNvb3JkLnksIGNhbWVyYUFsdGl0dWRlXTtcbiAgICAgICAgLy8gTGV0J3MgY29uc2lkZXIgYW4gZXhhbXBsZSBmb3IgIXJvdW5kWm9vbTogZS5nLiB0aWxlWm9vbSAxNiBpcyB1c2VkIGZyb20gem9vbSAxNiBhbGwgdGhlIHdheSB0byB6b29tIDE2Ljk5LlxuICAgICAgICAvLyBUaGlzIHdvdWxkIG1lYW4gdGhhdCB0aGUgbWluaW1hbCBkaXN0YW5jZSB0byBzcGxpdCB3b3VsZCBiZSBiYXNlZCBvbiBkaXN0YW5jZSBmcm9tIGNhbWVyYSB0byBjZW50ZXIgb2YgMTYuOTkgem9vbS5cbiAgICAgICAgLy8gVGhlIHNhbWUgaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW4gbG9naWMgYmVoaW5kIHJvdW5kWm9vbSBmb3IgcmFzdGVyIChzbyB0aGVyZSBpcyBubyBhZGp1c3RtZW50IG5lZWRlZCBpbiBmb2xsb3dpbmcgbGluZSkuXG4gICAgICAgIC8vIDAuMDIgYWRkZWQgdG8gY29tcGVuc2F0ZSBmb3IgcHJlY2lzaW9uIGVycm9ycywgc2VlIFwiY292ZXJpbmdUaWxlcyBmb3IgdGVycmFpblwiIHRlc3QgaW4gdHJhbnNmb3JtLnRlc3QuanMuXG4gICAgICAgIGNvbnN0IHpvb21TcGxpdERpc3RhbmNlID0gdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gb3B0aW9ucy50aWxlU2l6ZSAqIChvcHRpb25zLnJvdW5kWm9vbSA/IDEgOiAwLjUwMik7XG5cbiAgICAgICAgLy8gTm8gY2hhbmdlIG9mIExPRCBiZWhhdmlvciBmb3IgcGl0Y2ggbG93ZXIgdGhhbiA2MCBhbmQgd2hlbiB0aGVyZSBpcyBubyB0b3AgcGFkZGluZzogcmV0dXJuIG9ubHkgdGlsZSBpZHMgZnJvbSB0aGUgcmVxdWVzdGVkIHpvb20gbGV2ZWxcbiAgICAgICAgY29uc3QgbWluWm9vbSA9IHRoaXMucGl0Y2ggPD0gNjAuMCAmJiB0aGlzLl9lZGdlSW5zZXRzLnRvcCA8PSB0aGlzLl9lZGdlSW5zZXRzLmJvdHRvbSAmJiAhdGhpcy5fZWxldmF0aW9uICYmICF0aGlzLnByb2plY3Rpb24uaXNSZXByb2plY3RlZEluVGlsZVNwYWNlID8geiA6IDA7XG5cbiAgICAgICAgLy8gV2hlbiBjYWxjdWxhdGluZyB0aWxlIGNvdmVyIGZvciB0ZXJyYWluLCBjcmVhdGUgZGVlcCBBQUJCIGZvciBub2RlcywgdG8gZW5zdXJlIHRoZXkgaW50ZXJzZWN0IGZydXN0dW06IGZvciBzb3VyY2VzLFxuICAgICAgICAvLyBvdGhlciB0aGFuIERFTSwgdXNlIG1pbmltdW0gb2YgdmlzaWJsZSBERU0gdGlsZXMgYW5kIGNlbnRlciBhbHRpdHVkZSBhcyB1cHBlciBib3VuZCAocGl0Y2ggaXMgYWx3YXlzIGxlc3MgdGhhbiA5MMKwKS5cbiAgICAgICAgY29uc3QgbWF4UmFuZ2UgPSBvcHRpb25zLmlzVGVycmFpbkRFTSAmJiB0aGlzLl9lbGV2YXRpb24gPyB0aGlzLl9lbGV2YXRpb24uZXhhZ2dlcmF0aW9uKCkgKiAxMDAwMCA6IHRoaXMuX2NlbnRlckFsdGl0dWRlO1xuICAgICAgICBjb25zdCBtaW5SYW5nZSA9IG9wdGlvbnMuaXNUZXJyYWluREVNID8gLW1heFJhbmdlIDogdGhpcy5fZWxldmF0aW9uID8gdGhpcy5fZWxldmF0aW9uLmdldE1pbkVsZXZhdGlvbkJlbG93TVNMKCkgOiAwO1xuXG4gICAgICAgIGNvbnN0IHNjYWxlQWRqdXN0bWVudCA9IHRoaXMucHJvamVjdGlvbi5pc1JlcHJvamVjdGVkSW5UaWxlU3BhY2UgPyBnZXRTY2FsZUFkanVzdG1lbnQodGhpcykgOiAxLjA7XG5cbiAgICAgICAgY29uc3QgcmVsYXRpdmVTY2FsZUF0TWVyY2F0b3JDb29yZCA9IG1jID0+IHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBob3cgc2NhbGUgY29tcGFyZXMgYmV0d2VlbiBwcm9qZWN0ZWQgY29vcmRpbmF0ZXMgYW5kIG1lcmNhdG9yIGNvb3JkaW5hdGVzLlxuICAgICAgICAgICAgLy8gUmV0dXJucyBhIGxlbmd0aC4gVGhlIHVuaXRzIGRvbid0IG1hdHRlciBzaW5jZSB0aGUgcmVzdWx0IGlzIG9ubHlcbiAgICAgICAgICAgIC8vIHVzZWQgaW4gYSByYXRpbyB3aXRoIG90aGVyIHZhbHVlcyByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLlxuXG4gICAgICAgICAgICAvLyBDb25zdHJ1Y3QgYSBzbWFsbCBzcXVhcmUgaW4gTWVyY2F0b3IgY29vcmRpbmF0ZXMuXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAxIC8gNDAwMDA7XG4gICAgICAgICAgICBjb25zdCBtY0Vhc3QgPSBuZXcgTWVyY2F0b3JDb29yZGluYXRlKG1jLnggKyBvZmZzZXQsIG1jLnksIG1jLnopO1xuICAgICAgICAgICAgY29uc3QgbWNTb3V0aCA9IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUobWMueCwgbWMueSArIG9mZnNldCwgbWMueik7XG5cbiAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHNxdWFyZSB0byBwcm9qZWN0ZWQgY29vcmRpbmF0ZXMuXG4gICAgICAgICAgICBjb25zdCBsbCA9IG1jLnRvTG5nTGF0KCk7XG4gICAgICAgICAgICBjb25zdCBsbEVhc3QgPSBtY0Vhc3QudG9MbmdMYXQoKTtcbiAgICAgICAgICAgIGNvbnN0IGxsU291dGggPSBtY1NvdXRoLnRvTG5nTGF0KCk7XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy5sb2NhdGlvbkNvb3JkaW5hdGUobGwpO1xuICAgICAgICAgICAgY29uc3QgcEVhc3QgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsbEVhc3QpO1xuICAgICAgICAgICAgY29uc3QgcFNvdXRoID0gdGhpcy5sb2NhdGlvbkNvb3JkaW5hdGUobGxTb3V0aCk7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBlYWNoIGVkZ2Ugb2YgdGhlIHJlcHJvamVjdGVkIHNxdWFyZVxuICAgICAgICAgICAgY29uc3QgZHggPSBNYXRoLmh5cG90KHBFYXN0LnggLSBwLngsIHBFYXN0LnkgLSBwLnkpO1xuICAgICAgICAgICAgY29uc3QgZHkgPSBNYXRoLmh5cG90KHBTb3V0aC54IC0gcC54LCBwU291dGgueSAtIHAueSk7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBhIHByb2plY3RlZCBzcXVhcmUgdGhhdCB3b3VsZCBoYXZlIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBhcmVhIGFzIHRoZSByZXByb2plY3RlZCBzcXVhcmUuXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHkpICogc2NhbGVBZGp1c3RtZW50IC8gb2Zmc2V0O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG5ld1Jvb3RUaWxlID0gKHdyYXA6IG51bWJlcik6IGFueSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYXggPSBtYXhSYW5nZTtcbiAgICAgICAgICAgIGNvbnN0IG1pbiA9IG1pblJhbmdlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAvLyBXaXRoIGVsZXZhdGlvbiwgdGhpcy5fZWxldmF0aW9uIHByb3ZpZGVzIHogY29vcmRpbmF0ZSB2YWx1ZXMuIEZvciAyRDpcbiAgICAgICAgICAgICAgICAvLyBBbGwgdGlsZXMgYXJlIG9uIHplcm8gZWxldmF0aW9uIHBsYW5lID0+IHogZGlmZmVyZW5jZSBpcyB6ZXJvXG4gICAgICAgICAgICAgICAgYWFiYjogdGlsZUFBQkIodGhpcywgbnVtVGlsZXMsIDAsIDAsIDAsIHdyYXAsIG1pbiwgbWF4LCB0aGlzLnByb2plY3Rpb24pLFxuICAgICAgICAgICAgICAgIHpvb206IDAsXG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgICAgIG1pblo6IG1pbixcbiAgICAgICAgICAgICAgICBtYXhaOiBtYXgsXG4gICAgICAgICAgICAgICAgd3JhcCxcbiAgICAgICAgICAgICAgICBmdWxseVZpc2libGU6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERvIGEgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIHRvIGZpbmQgdmlzaWJsZSB0aWxlcyBhbmQgcHJvcGVyIGxldmVscyBvZiBkZXRhaWxcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBbXTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBjb25zdCBtYXhab29tID0gejtcbiAgICAgICAgY29uc3Qgb3ZlcnNjYWxlZFogPSBvcHRpb25zLnJlcGFyc2VPdmVyc2NhbGVkID8gYWN0dWFsWiA6IHo7XG4gICAgICAgIGNvbnN0IHNxdWFyZSA9IGEgPT4gYSAqIGE7XG4gICAgICAgIGNvbnN0IGNhbWVyYUhlaWdodFNxciA9IHNxdWFyZSgoY2FtZXJhQWx0aXR1ZGUgLSB0aGlzLl9jZW50ZXJBbHRpdHVkZSkgKiBtZXRlclRvVGlsZSk7IC8vIGluIHRpbGUgY29vcmRpbmF0ZXMuXG5cbiAgICAgICAgY29uc3QgZ2V0QUFCQkZyb21FbGV2YXRpb24gPSAoaXQpID0+IHtcbiAgICAgICAgICAgIGFzc2VydCh0aGlzLl9lbGV2YXRpb24pO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9lbGV2YXRpb24gfHwgIWl0LnRpbGVJRCB8fCAhaXNNZXJjYXRvcikgcmV0dXJuOyAvLyBUbyBzaWxlbmNlIGZsb3cuXG4gICAgICAgICAgICBjb25zdCBtaW5tYXggPSB0aGlzLl9lbGV2YXRpb24uZ2V0TWluTWF4Rm9yVGlsZShpdC50aWxlSUQpO1xuICAgICAgICAgICAgY29uc3QgYWFiYiA9IGl0LmFhYmI7XG4gICAgICAgICAgICBpZiAobWlubWF4KSB7XG4gICAgICAgICAgICAgICAgYWFiYi5taW5bMl0gPSBtaW5tYXgubWluO1xuICAgICAgICAgICAgICAgIGFhYmIubWF4WzJdID0gbWlubWF4Lm1heDtcbiAgICAgICAgICAgICAgICBhYWJiLmNlbnRlclsyXSA9IChhYWJiLm1pblsyXSArIGFhYmIubWF4WzJdKSAvIDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGl0LnNob3VsZFNwbGl0ID0gc2hvdWxkU3BsaXQoaXQpO1xuICAgICAgICAgICAgICAgIGlmICghaXQuc2hvdWxkU3BsaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXQgZmluYWwgem9vbSBsZXZlbCwgd2hpbGUgY29ycmVzcG9uZGluZyBERU0gdGlsZSBpcyBub3QgbG9hZGVkIHlldCxcbiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIGNlbnRlciBlbGV2YXRpb24uIFRoaXMgY292ZXJzIGdyb3VuZCB0byBob3Jpem9uIGFuZCBwcmV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2FkaW5nIHVubmVjZXNzYXJ5IHRpbGVzIHVudGlsIERFTSBjb3ZlciBpcyBmdWxseSBsb2FkZWQuXG4gICAgICAgICAgICAgICAgICAgIGFhYmIubWluWzJdID0gYWFiYi5tYXhbMl0gPSBhYWJiLmNlbnRlclsyXSA9IHRoaXMuX2NlbnRlckFsdGl0dWRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTY2FsZSBkaXN0YW5jZSB0byBzcGxpdCBmb3IgYWN1dGUgYW5nbGVzLlxuICAgICAgICAvLyBkelNxcjogeiBjb21wb25lbnQgb2YgY2FtZXJhIHRvIHRpbGUgZGlzdGFuY2UsIHNxdWFyZS5cbiAgICAgICAgLy8gZFNxcjogM0QgZGlzdGFuY2Ugb2YgY2FtZXJhIHRvIHRpbGUsIHNxdWFyZS5cbiAgICAgICAgY29uc3QgZGlzdFRvU3BsaXRTY2FsZSA9IChkelNxciwgZFNxcikgPT4ge1xuICAgICAgICAgICAgLy8gV2hlbiB0aGUgYW5nbGUgYmV0d2VlbiBjYW1lcmEgdG8gdGlsZSByYXkgYW5kIHRpbGUgcGxhbmUgaXMgc21hbGxlclxuICAgICAgICAgICAgLy8gdGhhbiBhY3V0ZUFuZ2xlVGhyZXNob2xkLCBzY2FsZSB0aGUgZGlzdGFuY2UgdG8gc3BsaXQuIFNjYWxpbmcgaXMgYWRhcHRpdmU6IHNtYWxsZXJcbiAgICAgICAgICAgIC8vIHRoZSBhbmdsZSwgdGhlIHNjYWxlIGdldHMgbG93ZXIgdmFsdWUuIEFsdGhvdWdoIGl0IHNlZW1zIGVhcmx5IHRvIHN0YXJ0IGF0IDQ1LFxuICAgICAgICAgICAgLy8gaXQgaXMgbm90OiBzY2FsaW5nIGtpY2tzIGluIGFyb3VuZCA2MCBkZWdyZWVzIHBpdGNoLlxuICAgICAgICAgICAgY29uc3QgYWN1dGVBbmdsZVRocmVzaG9sZFNpbiA9IDAuNzA3OyAvLyBNYXRoLnNpbig0NSlcbiAgICAgICAgICAgIGNvbnN0IHN0cmV0Y2hUaWxlID0gMS4xO1xuICAgICAgICAgICAgLy8gRGlzdGFuY2VzIGxvbmdlciB0aGFuICdkeiAvIGFjdXRlQW5nbGVUaHJlc2hvbGRTaW4nIGdldHMgc2NhbGVkXG4gICAgICAgICAgICAvLyBmb2xsb3dpbmcgZ2VvbWV0cmljIHNlcmllcyBzdW06IGV2ZXJ5IG5leHQgZHogbGVuZ3RoIGluIGRpc3RhbmNlIGNhbiBiZVxuICAgICAgICAgICAgLy8gJ3N0cmV0Y2hUaWxlIHRpbWVzJyBsb25nZXIuIEl0IGlzIGZ1cnRoZXIsIHRoZSBhbmdsZSBpcyBzaGFycGVyLiBUb3RhbCxcbiAgICAgICAgICAgIC8vIGFkanVzdGVkLCBkaXN0YW5jZSB3b3VsZCB0aGVuIGJlOlxuICAgICAgICAgICAgLy8gPSBkeiAvIGFjdXRlQW5nbGVUaHJlc2hvbGRTaW4gKyAoZHogKiBzdHJldGNoVGlsZSArIGR6ICogc3RyZXRjaFRpbGUgXiAyICsgLi4uICsgZHogKiBzdHJldGNoVGlsZSBeIGspLFxuICAgICAgICAgICAgLy8gd2hlcmUgayA9IChkIC0gZHogLyBhY3V0ZUFuZ2xlVGhyZXNob2xkU2luKSAvIGR6ID0gZCAvIGR6IC0gMSAvIGFjdXRlQW5nbGVUaHJlc2hvbGRTaW47XG4gICAgICAgICAgICAvLyA9IGR6IC8gYWN1dGVBbmdsZVRocmVzaG9sZFNpbiArIGR6ICogKChzdHJldGNoVGlsZSBeIChrICsgMSkgLSAxKSAvIChzdHJldGNoVGlsZSAtIDEpIC0gMSlcbiAgICAgICAgICAgIC8vIG9yIHB1dCBkaWZmZXJlbnRseSwgZ2l2ZW4gdGhhdCBrIGlzIGJhc2VkIG9uIGQgYW5kIGR6LCB0aWxlIG9uIGRpc3RhbmNlIGQgY291bGQgYmUgdXNlZCBvbiBkaXN0YW5jZSBzY2FsZWQgYnk6XG4gICAgICAgICAgICAvLyAxIC8gYWN1dGVBbmdsZVRocmVzaG9sZFNpbiArIChzdHJldGNoVGlsZSBeIChrICsgMSkgLSAxKSAvIChzdHJldGNoVGlsZSAtIDEpIC0gMVxuICAgICAgICAgICAgaWYgKGRTcXIgKiBzcXVhcmUoYWN1dGVBbmdsZVRocmVzaG9sZFNpbikgPCBkelNxcikgcmV0dXJuIDEuMDsgLy8gRWFybHkgcmV0dXJuLCBubyBzY2FsZS5cbiAgICAgICAgICAgIGNvbnN0IHIgPSBNYXRoLnNxcnQoZFNxciAvIGR6U3FyKTtcbiAgICAgICAgICAgIGNvbnN0IGsgPSAgciAtIDEgLyBhY3V0ZUFuZ2xlVGhyZXNob2xkU2luO1xuICAgICAgICAgICAgcmV0dXJuIHIgLyAoMSAvIGFjdXRlQW5nbGVUaHJlc2hvbGRTaW4gKyAoTWF0aC5wb3coc3RyZXRjaFRpbGUsIGsgKyAxKSAtIDEpIC8gKHN0cmV0Y2hUaWxlIC0gMSkgLSAxKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzaG91bGRTcGxpdCA9IChpdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0Lnpvb20gPCBtaW5ab29tKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0Lnpvb20gPT09IG1heFpvb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXQuc2hvdWxkU3BsaXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdC5zaG91bGRTcGxpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGR4ID0gaXQuYWFiYi5kaXN0YW5jZVgoY2FtZXJhUG9pbnQpO1xuICAgICAgICAgICAgY29uc3QgZHkgPSBpdC5hYWJiLmRpc3RhbmNlWShjYW1lcmFQb2ludCk7XG4gICAgICAgICAgICBsZXQgZHpTcXIgPSBjYW1lcmFIZWlnaHRTcXI7XG5cbiAgICAgICAgICAgIGlmICh1c2VFbGV2YXRpb25EYXRhKSB7XG4gICAgICAgICAgICAgICAgZHpTcXIgPSBzcXVhcmUoaXQuYWFiYi5kaXN0YW5jZVooY2FtZXJhUG9pbnQpICogbWV0ZXJUb1RpbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGlsZVNjYWxlQWRqdXN0bWVudCA9IDE7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0aW9uLmlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZSAmJiBhY3R1YWxaIDw9IDUpIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBvdGhlciBwcm9qZWN0aW9ucywgbm90IGFsbCB0aWxlcyBhcmUgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICAgICAgICAvLyBBY2NvdW50IGZvciB0aGUgdGlsZSBzaXplIGRpZmZlcmVuY2UgYnkgYWRqdXN0aW5nIHRoZSBkaXN0VG9TcGxpdC5cbiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgYnkgdGhlIHJhdGlvIG9mIHRoZSBhcmVhIGF0IHRoZSB0aWxlIGNlbnRlciB0byB0aGUgYXJlYSBhdCB0aGUgbWFwIGNlbnRlci5cbiAgICAgICAgICAgICAgICAvLyBBZGp1c3RtZW50cyBhcmUgb25seSBuZWVkZWQgYXQgbG93ZXIgem9vbXMgd2hlcmUgdGlsZXMgYXJlIG5vdCBzaW1pbGFybHkgc2l6ZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtVGlsZXMgPSBNYXRoLnBvdygyLCBpdC56b29tKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGl2ZVNjYWxlID0gcmVsYXRpdmVTY2FsZUF0TWVyY2F0b3JDb29yZChuZXcgTWVyY2F0b3JDb29yZGluYXRlKChpdC54ICsgMC41KSAvIG51bVRpbGVzLCAoaXQueSArIDAuNSkgLyBudW1UaWxlcykpO1xuICAgICAgICAgICAgICAgIC8vIEZ1ZGdlIHRoZSByYXRpbyBzbGlnaHRseSBzbyB0aGF0IGFsbCB0aWxlcyBuZWFyIHRoZSBjZW50ZXIgaGF2ZSB0aGUgc2FtZSB6b29tIGxldmVsLlxuICAgICAgICAgICAgICAgIHRpbGVTY2FsZUFkanVzdG1lbnQgPSByZWxhdGl2ZVNjYWxlID4gMC44NSA/IDEgOiByZWxhdGl2ZVNjYWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZVNxciA9IGR4ICogZHggKyBkeSAqIGR5ICsgZHpTcXI7XG4gICAgICAgICAgICBjb25zdCBkaXN0VG9TcGxpdCA9ICgxIDw8IG1heFpvb20gLSBpdC56b29tKSAqIHpvb21TcGxpdERpc3RhbmNlICogdGlsZVNjYWxlQWRqdXN0bWVudDtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RUb1NwbGl0U3FyID0gc3F1YXJlKGRpc3RUb1NwbGl0ICogZGlzdFRvU3BsaXRTY2FsZShNYXRoLm1heChkelNxciwgY2FtZXJhSGVpZ2h0U3FyKSwgZGlzdGFuY2VTcXIpKTtcblxuICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlU3FyIDwgZGlzdFRvU3BsaXRTcXI7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMucmVuZGVyV29ybGRDb3BpZXMpIHtcbiAgICAgICAgICAgIC8vIFJlbmRlciBjb3B5IG9mIHRoZSBnbG9iZSB0aHJpY2Ugb24gYm90aCBzaWRlc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gTlVNX1dPUkxEX0NPUElFUzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXdSb290VGlsZSgtaSkpO1xuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2gobmV3Um9vdFRpbGUoaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RhY2sucHVzaChuZXdSb290VGlsZSgwKSk7XG5cbiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBjb25zdCB4ID0gaXQueDtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBpdC55O1xuICAgICAgICAgICAgbGV0IGZ1bGx5VmlzaWJsZSA9IGl0LmZ1bGx5VmlzaWJsZTtcblxuICAgICAgICAgICAgLy8gVmlzaWJpbGl0eSBvZiBhIHRpbGUgaXMgbm90IHJlcXVpcmVkIGlmIGFueSBvZiBpdHMgYW5jZXN0b3IgaWYgZnVsbHkgaW5zaWRlIHRoZSBmcnVzdHVtXG4gICAgICAgICAgICBpZiAoIWZ1bGx5VmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdFJlc3VsdCA9IGl0LmFhYmIuaW50ZXJzZWN0cyhjYW1lcmFGcnVzdHVtKTtcblxuICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3RSZXN1bHQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgZnVsbHlWaXNpYmxlID0gaW50ZXJzZWN0UmVzdWx0ID09PSAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYXZlIHdlIHJlYWNoZWQgdGhlIHRhcmdldCBkZXB0aCBvciBpcyB0aGUgdGlsZSB0b28gZmFyIGF3YXkgdG8gYmUgYW55IHNwbGl0IGZ1cnRoZXI/XG4gICAgICAgICAgICBpZiAoaXQuem9vbSA9PT0gbWF4Wm9vbSB8fCAhc2hvdWxkU3BsaXQoaXQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZVpvb20gPSBpdC56b29tID09PSBtYXhab29tID8gb3ZlcnNjYWxlZFogOiBpdC56b29tO1xuICAgICAgICAgICAgICAgIGlmICghIW9wdGlvbnMubWluem9vbSAmJiBvcHRpb25zLm1pbnpvb20gPiB0aWxlWm9vbSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3Qgd2l0aGluIHNvdXJjZSB0aWxlIHJhbmdlLlxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeCA9IGNlbnRlclBvaW50WzBdIC0gKCgwLjUgKyB4ICsgKGl0LndyYXAgPDwgaXQuem9vbSkpICogKDEgPDwgKHogLSBpdC56b29tKSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGR5ID0gY2VudGVyUG9pbnRbMV0gLSAwLjUgLSB5O1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gaXQudGlsZUlEID8gaXQudGlsZUlEIDogbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZVpvb20sIGl0LndyYXAsIGl0Lnpvb20sIHgsIHkpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHt0aWxlSUQ6IGlkLCBkaXN0YW5jZVNxOiBkeCAqIGR4ICsgZHkgKiBkeX0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkWCA9ICh4IDw8IDEpICsgKGkgJSAyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFkgPSAoeSA8PCAxKSArIChpID4+IDEpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYWFiYiA9IGlzTWVyY2F0b3IgPyBpdC5hYWJiLnF1YWRyYW50KGkpIDogdGlsZUFBQkIodGhpcywgbnVtVGlsZXMsIGl0Lnpvb20gKyAxLCBjaGlsZFgsIGNoaWxkWSwgaXQud3JhcCwgaXQubWluWiwgaXQubWF4WiwgdGhpcy5wcm9qZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IHthYWJiLCB6b29tOiBpdC56b29tICsgMSwgeDogY2hpbGRYLCB5OiBjaGlsZFksIHdyYXA6IGl0LndyYXAsIGZ1bGx5VmlzaWJsZSwgdGlsZUlEOiB1bmRlZmluZWQsIHNob3VsZFNwbGl0OiB1bmRlZmluZWQsIG1pblo6IGl0Lm1pblosIG1heFo6IGl0Lm1heFp9O1xuICAgICAgICAgICAgICAgIGlmICh1c2VFbGV2YXRpb25EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkLnRpbGVJRCA9IG5ldyBPdmVyc2NhbGVkVGlsZUlEKGl0Lnpvb20gKyAxID09PSBtYXhab29tID8gb3ZlcnNjYWxlZFogOiBpdC56b29tICsgMSwgaXQud3JhcCwgaXQuem9vbSArIDEsIGNoaWxkWCwgY2hpbGRZKTtcbiAgICAgICAgICAgICAgICAgICAgZ2V0QUFCQkZyb21FbGV2YXRpb24oY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZvZ0N1bGxEaXN0U3EpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvZ0N1bGxEaXN0U3EgPSB0aGlzLmZvZ0N1bGxEaXN0U3E7XG4gICAgICAgICAgICBjb25zdCBob3Jpem9uTGluZUZyb21Ub3AgPSB0aGlzLmhvcml6b25MaW5lRnJvbVRvcCgpO1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcihlbnRyeSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWluID0gWzAsIDAsIDAsIDFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heCA9IFtFWFRFTlQsIEVYVEVOVCwgMCwgMV07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmb2dUaWxlTWF0cml4ID0gdGhpcy5jYWxjdWxhdGVGb2dUaWxlTWF0cml4KGVudHJ5LnRpbGVJRC50b1Vud3JhcHBlZCgpKTtcblxuICAgICAgICAgICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChtaW4sIG1pbiwgZm9nVGlsZU1hdHJpeCk7XG4gICAgICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KG1heCwgbWF4LCBmb2dUaWxlTWF0cml4KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNxRGlzdCA9IGdldEFBQkJQb2ludFNxdWFyZURpc3QobWluLCBtYXgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNxRGlzdCA9PT0gMCkgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgICAgICAgICAgICAgbGV0IG92ZXJIb3Jpem9uTGluZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gVGVycmFpbiBsb2FkcyBhdCBvbmUgem9vbSBsZXZlbCBsb3dlciB0aGFuIHRoZSByYXN0ZXIgZGF0YSxcbiAgICAgICAgICAgICAgICAvLyBzbyB0aGUgZm9sbG93aW5nIGNoZWNrcyB3aGV0aGVyIHRoZSB0ZXJyYWluIHNpdHMgYWJvdmUgdGhlIGhvcml6b24gYW5kIGVuc3VyZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIHdoZW4gbW91bnRhaW5zIHN0aWNrIG91dCBhYm92ZSB0aGUgZm9nIChkdWUgdG8gaG9yaXpvbi1ibGVuZCksXG4gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW7igJl0IGFjY2lkZW50YWxseSBjdWxsZWQgc29tZSBvZiB0aGUgcmFzdGVyIHRpbGVzIHdlIG5lZWQgdG8gZHJhdyBvbiB0aGVtLlxuICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbuKAmXQgZG8gdGhpcywgdGhlIHRlcnJhaW4gaXMgZGVmYXVsdCBibGFjayBjb2xvciBhbmQgbWF5IGZsYXNoIGluIGFuZCBvdXQgYXMgd2UgbW92ZSB0b3dhcmQgaXQuXG5cbiAgICAgICAgICAgICAgICBjb25zdCBlbGV2YXRpb24gPSB0aGlzLl9lbGV2YXRpb247XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxldmF0aW9uICYmIHNxRGlzdCA+IGZvZ0N1bGxEaXN0U3EgJiYgaG9yaXpvbkxpbmVGcm9tVG9wICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2pNYXRyaXggPSB0aGlzLmNhbGN1bGF0ZVByb2pNYXRyaXgoZW50cnkudGlsZUlELnRvVW53cmFwcGVkKCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBtaW5tYXg7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5pc1RlcnJhaW5ERU0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbm1heCA9IGVsZXZhdGlvbi5nZXRNaW5NYXhGb3JUaWxlKGVudHJ5LnRpbGVJRCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIW1pbm1heCkgeyBtaW5tYXggPSB7bWluOiBtaW5SYW5nZSwgbWF4OiBtYXhSYW5nZX07IH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB3ZSB3YW50IGB0aGlzLnJvdGF0aW9uYCBpbnN0ZWFkIG9mIGB0aGlzLmJlYXJpbmdgIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29ybmVyRmFyID0gZnVydGhlc3RUaWxlQ29ybmVyKHRoaXMucm90YXRpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZhclggPSBjb3JuZXJGYXJbMF0gKiBFWFRFTlQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZhclkgPSBjb3JuZXJGYXJbMV0gKiBFWFRFTlQ7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ybGRGYXIgPSBbZmFyWCwgZmFyWSwgbWlubWF4Lm1heF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV29ybGQgdG8gTkRDXG4gICAgICAgICAgICAgICAgICAgIHZlYzMudHJhbnNmb3JtTWF0NCh3b3JsZEZhciwgd29ybGRGYXIsIHByb2pNYXRyaXgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5EQyB0byBTY3JlZW5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyZWVuQ29vcmRZID0gKDEgLSB3b3JsZEZhclsxXSkgKiB0aGlzLmhlaWdodCAqIDAuNTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IGN1dHRpbmcgdGlsZXMgY3Jvc3Npbmcgb3ZlciB0aGUgaG9yaXpvbiBsaW5lIHRvXG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgcG9wLWluIGFuZCBvdXQgd2l0aGluIHRoZSBmb2cgY3VsbGluZyByYW5nZVxuICAgICAgICAgICAgICAgICAgICBvdmVySG9yaXpvbkxpbmUgPSBzY3JlZW5Db29yZFkgPCBob3Jpem9uTGluZUZyb21Ub3A7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNxRGlzdCA8IGZvZ0N1bGxEaXN0U3EgfHwgb3Zlckhvcml6b25MaW5lO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3ZlciA9IHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmRpc3RhbmNlU3EgLSBiLmRpc3RhbmNlU3EpLm1hcChhID0+IGEudGlsZUlEKTtcbiAgICAgICAgLy8gUmVsYXggdGhlIGFzc2VydGlvbiBvbiB0ZXJyYWluLCBvbiBoaWdoIHpvb20gd2UgdXNlIGRpc3RhbmNlIHRvIGNlbnRlciBvZiB0aWxlXG4gICAgICAgIC8vIHdoaWxlIGNhbWVyYSBtaWdodCBiZSBjbG9zZXIgdG8gc2VsZWN0ZWQgY2VudGVyIG9mIG1hcC5cbiAgICAgICAgYXNzZXJ0KCFjb3Zlci5sZW5ndGggfHwgdGhpcy5lbGV2YXRpb24gfHwgY292ZXJbMF0ub3ZlcnNjYWxlZFogPT09IG92ZXJzY2FsZWRaIHx8ICFpc01lcmNhdG9yKTtcbiAgICAgICAgcmV0dXJuIGNvdmVyO1xuICAgIH1cblxuICAgIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMucGl4ZWxzVG9HTFVuaXRzID0gWzIgLyB3aWR0aCwgLTIgLyBoZWlnaHRdO1xuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IHVubW9kaWZpZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl91bm1vZGlmaWVkOyB9XG5cbiAgICB6b29tU2NhbGUoem9vbTogbnVtYmVyKSB7IHJldHVybiBNYXRoLnBvdygyLCB6b29tKTsgfVxuICAgIHNjYWxlWm9vbShzY2FsZTogbnVtYmVyKSB7IHJldHVybiBNYXRoLmxvZyhzY2FsZSkgLyBNYXRoLkxOMjsgfVxuXG4gICAgLy8gVHJhbnNmb3JtIGZyb20gTG5nTGF0IHRvIFBvaW50IGluIHdvcmxkIGNvb3JkaW5hdGVzIFstMTgwLCAxODBdIHggWzkwLCAtOTBdIC0tPiBbMCwgdGhpcy53b3JsZFNpemVdIHggWzAsIHRoaXMud29ybGRTaXplXVxuICAgIHByb2plY3QobG5nbGF0OiBMbmdMYXQpIHtcbiAgICAgICAgY29uc3QgbGF0ID0gY2xhbXAobG5nbGF0LmxhdCwgLU1BWF9NRVJDQVRPUl9MQVRJVFVERSwgTUFYX01FUkNBVE9SX0xBVElUVURFKTtcbiAgICAgICAgY29uc3QgcHJvamVjdGVkTG5nTGF0ID0gdGhpcy5wcm9qZWN0aW9uLnByb2plY3QobG5nbGF0LmxuZywgbGF0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChcbiAgICAgICAgICAgICAgICBwcm9qZWN0ZWRMbmdMYXQueCAqIHRoaXMud29ybGRTaXplLFxuICAgICAgICAgICAgICAgIHByb2plY3RlZExuZ0xhdC55ICogdGhpcy53b3JsZFNpemUpO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBmcm9tIFBvaW50IGluIHdvcmxkIGNvb3JkaW5hdGVzIHRvIExuZ0xhdCBbMCwgdGhpcy53b3JsZFNpemVdIHggWzAsIHRoaXMud29ybGRTaXplXSAtLT4gWy0xODAsIDE4MF0geCBbOTAsIC05MF1cbiAgICB1bnByb2plY3QocG9pbnQ6IFBvaW50KTogTG5nTGF0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdGlvbi51bnByb2plY3QocG9pbnQueCAvIHRoaXMud29ybGRTaXplLCBwb2ludC55IC8gdGhpcy53b3JsZFNpemUpO1xuICAgIH1cblxuICAgIC8vIFBvaW50IGF0IGNlbnRlciBpbiB3b3JsZCBjb29yZGluYXRlcy5cbiAgICBnZXQgcG9pbnQoKTogUG9pbnQgeyByZXR1cm4gdGhpcy5wcm9qZWN0KHRoaXMuY2VudGVyKTsgfVxuXG4gICAgc2V0TG9jYXRpb25BdFBvaW50KGxuZ2xhdDogTG5nTGF0LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMucG9pbnRDb29yZGluYXRlKHBvaW50KTtcbiAgICAgICAgY29uc3QgYiA9IHRoaXMucG9pbnRDb29yZGluYXRlKHRoaXMuY2VudGVyUG9pbnQpO1xuICAgICAgICBjb25zdCBsb2MgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsbmdsYXQpO1xuICAgICAgICB0aGlzLnNldExvY2F0aW9uKG5ldyBNZXJjYXRvckNvb3JkaW5hdGUoXG4gICAgICAgICAgICBsb2MueCAtIChhLnggLSBiLngpLFxuICAgICAgICAgICAgbG9jLnkgLSAoYS55IC0gYi55KSkpO1xuICAgIH1cblxuICAgIHNldExvY2F0aW9uKGxvY2F0aW9uOiBNZXJjYXRvckNvb3JkaW5hdGUpIHtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLmNvb3JkaW5hdGVMb2NhdGlvbihsb2NhdGlvbik7XG4gICAgICAgIGlmICh0aGlzLnByb2plY3Rpb24ud3JhcCkge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLmNlbnRlci53cmFwKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGxvY2F0aW9uLCByZXR1cm4gdGhlIHNjcmVlbiBwb2ludCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0LiBJbiAzRCBtb2RlXG4gICAgICogKHdpdGggdGVycmFpbikgdGhpcyBiZWhhdmVzIHRoZSBzYW1lIGFzIGluIDJEIG1vZGUuXG4gICAgICogVGhpcyBtZXRob2QgaXMgY291cGxlZCB3aXRoIHtAc2VlIHBvaW50TG9jYXRpb259IGluIDNEIG1vZGUgdG8gbW9kZWwgbWFwIG1hbmlwdWxhdGlvblxuICAgICAqIHVzaW5nIGZsYXQgcGxhbmUgYXBwcm9hY2ggdG8ga2VlcCBjb25zdGFudCBlbGV2YXRpb24gYWJvdmUgZ3JvdW5kLlxuICAgICAqIEBwYXJhbSB7TG5nTGF0fSBsbmdsYXQgbG9jYXRpb25cbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IHNjcmVlbiBwb2ludFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9jYXRpb25Qb2ludChsbmdsYXQ6IExuZ0xhdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0aW9uLmxvY2F0aW9uUG9pbnQodGhpcywgbG5nbGF0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGxvY2F0aW9uLCByZXR1cm4gdGhlIHNjcmVlbiBwb2ludCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0XG4gICAgICogSW4gM0QgbW9kZSAod2hlbiB0ZXJyYWluIGlzIGVuYWJsZWQpIGVsZXZhdGlvbiBpcyBzYW1wbGVkIGZvciB0aGUgcG9pbnQgYmVmb3JlXG4gICAgICogcHJvamVjdGluZyBpdC4gSW4gMkQgbW9kZSwgYmVoYXZlcyB0aGUgc2FtZSBsb2NhdGlvblBvaW50LlxuICAgICAqIEBwYXJhbSB7TG5nTGF0fSBsbmdsYXQgbG9jYXRpb25cbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IHNjcmVlbiBwb2ludFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9jYXRpb25Qb2ludDNEKGxuZ2xhdDogTG5nTGF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb29yZGluYXRlUG9pbnQodGhpcy5sb2NhdGlvbkNvb3JkaW5hdGUobG5nbGF0KSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBwb2ludCBvbiBzY3JlZW4sIHJldHVybiBpdHMgbG5nbGF0XG4gICAgICogQHBhcmFtIHtQb2ludH0gcCBzY3JlZW4gcG9pbnRcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBsbmdsYXQgbG9jYXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHBvaW50TG9jYXRpb24ocDogUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHBvaW50IG9uIHNjcmVlbiwgcmV0dXJuIGl0cyBsbmdsYXRcbiAgICAgKiBJbiAzRCBtb2RlIChtYXAgd2l0aCB0ZXJyYWluKSByZXR1cm5zIGxvY2F0aW9uIG9mIHRlcnJhaW4gcmF5Y2FzdCBwb2ludC5cbiAgICAgKiBJbiAyRCBtb2RlLCBiZWhhdmVzIHRoZSBzYW1lIGFzIHtAc2VlIHBvaW50TG9jYXRpb259LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgc2NyZWVuIHBvaW50XG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gbG5nbGF0IGxvY2F0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwb2ludExvY2F0aW9uM0QocDogUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlM0QocCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgZ2VvZ3JhcGhpY2FsIGxuZ0xhdCwgcmV0dXJuIGFuIHVucm91bmRlZFxuICAgICAqIGNvb3JkaW5hdGUgdGhhdCByZXByZXNlbnRzIGl0IGF0IHRoaXMgdHJhbnNmb3JtJ3Mgem9vbSBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nTGF0XG4gICAgICogQHJldHVybnMge0Nvb3JkaW5hdGV9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2NhdGlvbkNvb3JkaW5hdGUobG5nTGF0OiBMbmdMYXQsIGFsdGl0dWRlPzogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHogPSBhbHRpdHVkZSA/XG4gICAgICAgICAgICBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoYWx0aXR1ZGUsIGxuZ0xhdC5sYXQpIDpcbiAgICAgICAgICAgIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcHJvamVjdGVkTG5nTGF0ID0gdGhpcy5wcm9qZWN0aW9uLnByb2plY3QobG5nTGF0LmxuZywgbG5nTGF0LmxhdCk7XG4gICAgICAgIHJldHVybiBuZXcgTWVyY2F0b3JDb29yZGluYXRlKFxuICAgICAgICAgICAgcHJvamVjdGVkTG5nTGF0LngsXG4gICAgICAgICAgICBwcm9qZWN0ZWRMbmdMYXQueSxcbiAgICAgICAgICAgIHopO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgQ29vcmRpbmF0ZSwgcmV0dXJuIGl0cyBnZW9ncmFwaGljYWwgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IGxuZ0xhdFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29vcmRpbmF0ZUxvY2F0aW9uKGNvb3JkOiBNZXJjYXRvckNvb3JkaW5hdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdGlvbi51bnByb2plY3QoY29vcmQueCwgY29vcmQueSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYSByYXkgZnJvbSBhIHBvaW50IG9uIHNjcmVlbiBhbmQgcmV0dXJucyB0aGUgUmF5LFxuICAgICAqIGFuZCB0aGUgZXh0ZW50IGFsb25nIGl0LCBhdCB3aGljaCBpdCBpbnRlcnNlY3RzIHRoZSBtYXAgcGxhbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIFZpZXdwb3J0IHBpeGVsIGNvLW9yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiBPcHRpb25hbCBhbHRpdHVkZSBvZiB0aGUgbWFwIHBsYW5lLCBkZWZhdWx0aW5nIHRvIGVsZXZhdGlvbiBhdCBjZW50ZXIuXG4gICAgICogQHJldHVybnMge3sgcDA6IHZlYzQsIHAxOiB2ZWM0LCB0OiBudW1iZXIgfX0gcDAscDEgYXJlIHR3byBwb2ludHMgb24gdGhlIHJheS5cbiAgICAgKiB0IGlzIHRoZSBmcmFjdGlvbmFsIGV4dGVudCBhbG9uZyB0aGUgcmF5IGF0IHdoaWNoIHRoZSByYXkgaW50ZXJzZWN0cyB0aGUgbWFwIHBsYW5lLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcG9pbnRSYXlJbnRlcnNlY3Rpb24ocDogUG9pbnQsIHo6ID9udW1iZXIpOiBSYXlJbnRlcnNlY3Rpb25SZXN1bHQge1xuICAgICAgICBjb25zdCB0YXJnZXRaID0gKHogIT09IHVuZGVmaW5lZCAmJiB6ICE9PSBudWxsKSA/IHogOiB0aGlzLl9jZW50ZXJBbHRpdHVkZTtcbiAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29ycmVjdCBwcm9qZWN0ZWQgeiB2YWx1ZSBmb3IgdGhlIHBvaW50LFxuICAgICAgICAvLyB1bnByb2plY3QgdHdvIHBvaW50cyB0byBnZXQgYSBsaW5lIGFuZCB0aGVuIGZpbmQgdGhlIHBvaW50IG9uIHRoYXRcbiAgICAgICAgLy8gbGluZSB3aXRoIHo9MC5cblxuICAgICAgICBjb25zdCBwMCA9IFtwLngsIHAueSwgMCwgMV07XG4gICAgICAgIGNvbnN0IHAxID0gW3AueCwgcC55LCAxLCAxXTtcblxuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocDAsIHAwLCB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSk7XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChwMSwgcDEsIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKTtcblxuICAgICAgICBjb25zdCB3MCA9IHAwWzNdO1xuICAgICAgICBjb25zdCB3MSA9IHAxWzNdO1xuICAgICAgICB2ZWM0LnNjYWxlKHAwLCBwMCwgMSAvIHcwKTtcbiAgICAgICAgdmVjNC5zY2FsZShwMSwgcDEsIDEgLyB3MSk7XG5cbiAgICAgICAgY29uc3QgejAgPSBwMFsyXTtcbiAgICAgICAgY29uc3QgejEgPSBwMVsyXTtcblxuICAgICAgICBjb25zdCB0ID0gejAgPT09IHoxID8gMCA6ICh0YXJnZXRaIC0gejApIC8gKHoxIC0gejApO1xuXG4gICAgICAgIHJldHVybiB7cDAsIHAxLCB0fTtcbiAgICB9XG5cbiAgICBzY3JlZW5Qb2ludFRvTWVyY2F0b3JSYXkocDogUG9pbnQpOiBSYXkge1xuICAgICAgICBjb25zdCBwMCA9IFtwLngsIHAueSwgMCwgMV07XG4gICAgICAgIGNvbnN0IHAxID0gW3AueCwgcC55LCAxLCAxXTtcblxuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocDAsIHAwLCB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSk7XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChwMSwgcDEsIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKTtcblxuICAgICAgICB2ZWM0LnNjYWxlKHAwLCBwMCwgMSAvIHAwWzNdKTtcbiAgICAgICAgdmVjNC5zY2FsZShwMSwgcDEsIDEgLyBwMVszXSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBhbHRpdHVkZSBmcm9tIG1ldGVycyB0byBwaXhlbHMuXG4gICAgICAgIHAwWzJdID0gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKHAwWzJdLCB0aGlzLl9jZW50ZXIubGF0KSAqIHRoaXMud29ybGRTaXplO1xuICAgICAgICBwMVsyXSA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZShwMVsyXSwgdGhpcy5fY2VudGVyLmxhdCkgKiB0aGlzLndvcmxkU2l6ZTtcblxuICAgICAgICB2ZWM0LnNjYWxlKHAwLCBwMCwgMSAvIHRoaXMud29ybGRTaXplKTtcbiAgICAgICAgdmVjNC5zY2FsZShwMSwgcDEsIDEgLyB0aGlzLndvcmxkU2l6ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBSYXkoW3AwWzBdLCBwMFsxXSwgcDBbMl1dLCB2ZWMzLm5vcm1hbGl6ZShbXSwgdmVjMy5zdWIoW10sIHAxLCBwMCkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgSGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IHRoZSByYXkgaW50ZXJzZWN0aW9uIHdpdGggdGhlIG1hcCBwbGFuZSB0byBNZXJjYXRvckNvb3JkaW5hdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JheUludGVyc2VjdGlvblJlc3VsdH0gcmF5SW50ZXJzZWN0aW9uXG4gICAgICogQHJldHVybnMge01lcmNhdG9yQ29vcmRpbmF0ZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHJheUludGVyc2VjdGlvbkNvb3JkaW5hdGUocmF5SW50ZXJzZWN0aW9uOiBSYXlJbnRlcnNlY3Rpb25SZXN1bHQpOiBNZXJjYXRvckNvb3JkaW5hdGUge1xuICAgICAgICBjb25zdCB7cDAsIHAxLCB0fSA9IHJheUludGVyc2VjdGlvbjtcblxuICAgICAgICBjb25zdCB6MCA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZShwMFsyXSwgdGhpcy5fY2VudGVyLmxhdCk7XG4gICAgICAgIGNvbnN0IHoxID0gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKHAxWzJdLCB0aGlzLl9jZW50ZXIubGF0KTtcblxuICAgICAgICByZXR1cm4gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShcbiAgICAgICAgICAgIGludGVycG9sYXRlKHAwWzBdLCBwMVswXSwgdCkgLyB0aGlzLndvcmxkU2l6ZSxcbiAgICAgICAgICAgIGludGVycG9sYXRlKHAwWzFdLCBwMVsxXSwgdCkgLyB0aGlzLndvcmxkU2l6ZSxcbiAgICAgICAgICAgIGludGVycG9sYXRlKHowLCB6MSwgdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgcG9pbnQgb24gc2NyZWVuLCByZXR1cm5zIE1lcmNhdG9yQ29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIFRvcCBsZWZ0IG9yaWdpbiBzY3JlZW4gcG9pbnQsIGluIHBpeGVscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiBPcHRpb25hbCBhbHRpdHVkZSBvZiB0aGUgbWFwIHBsYW5lLCBkZWZhdWx0aW5nIHRvIGVsZXZhdGlvbiBhdCBjZW50ZXIuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwb2ludENvb3JkaW5hdGUocDogUG9pbnQsIHo/OiBudW1iZXIgPSB0aGlzLl9jZW50ZXJBbHRpdHVkZSk6IE1lcmNhdG9yQ29vcmRpbmF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb24uY3JlYXRlVGlsZVRyYW5zZm9ybSh0aGlzLCB0aGlzLndvcmxkU2l6ZSkucG9pbnRDb29yZGluYXRlKHAueCwgcC55LCB6KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHBvaW50IG9uIHNjcmVlbiwgcmV0dXJucyBNZXJjYXRvckNvb3JkaW5hdGUuXG4gICAgICogSW4gM0QgbW9kZSwgcmF5Y2FzdCB0byB0ZXJyYWluLiBJbiAyRCBtb2RlLCBiZWhhdmVzIHRoZSBzYW1lIGFzIHtAc2VlIHBvaW50Q29vcmRpbmF0ZX0uXG4gICAgICogRm9yIHAgYWJvdmUgdGVycmFpbiwgZG9uJ3QgcmV0dXJuIHBvaW50IGJlaGluZCBjYW1lcmEgYnV0IGNsYW1wIHAueSBhdCB0aGUgdG9wIG9mIHRlcnJhaW4uXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0b3AgbGVmdCBvcmlnaW4gc2NyZWVuIHBvaW50LCBpbiBwaXhlbHMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwb2ludENvb3JkaW5hdGUzRChwOiBQb2ludCk6IE1lcmNhdG9yQ29vcmRpbmF0ZSB7XG4gICAgICAgIGlmICghdGhpcy5lbGV2YXRpb24pIHJldHVybiB0aGlzLnBvaW50Q29vcmRpbmF0ZShwKTtcbiAgICAgICAgY29uc3QgZWxldmF0aW9uID0gdGhpcy5lbGV2YXRpb247XG4gICAgICAgIGxldCByYXljYXN0ID0gdGhpcy5lbGV2YXRpb24ucG9pbnRDb29yZGluYXRlKHApO1xuICAgICAgICBpZiAocmF5Y2FzdCkgcmV0dXJuIG5ldyBNZXJjYXRvckNvb3JkaW5hdGUocmF5Y2FzdFswXSwgcmF5Y2FzdFsxXSwgcmF5Y2FzdFsyXSk7XG4gICAgICAgIGxldCBzdGFydCA9IDAsIGVuZCA9IHRoaXMuaG9yaXpvbkxpbmVGcm9tVG9wKCk7XG4gICAgICAgIGlmIChwLnkgPiBlbmQpIHJldHVybiB0aGlzLnBvaW50Q29vcmRpbmF0ZShwKTsgLy8gaG9sZXMgYmV0d2VlbiB0aWxlcyBiZWxvdyBob3Jpem9uIGxpbmUgb3IgYmVsb3cgYm90dG9tLlxuICAgICAgICBjb25zdCBzYW1wbGVzID0gMTA7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDAuMDIgKiBlbmQ7XG4gICAgICAgIGNvbnN0IHIgPSBwLmNsb25lKCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVzICYmIGVuZCAtIHN0YXJ0ID4gdGhyZXNob2xkOyBpKyspIHtcbiAgICAgICAgICAgIHIueSA9IGludGVycG9sYXRlKHN0YXJ0LCBlbmQsIDAuNjYpOyAvLyBub24gdW5pZm9ybSBiaW5hcnkgc2VhcmNoIGZhdm9yaW5nIHBvaW50cyBjbG9zZXIgdG8gaG9yaXpvbi5cbiAgICAgICAgICAgIGNvbnN0IHJDYXN0ID0gZWxldmF0aW9uLnBvaW50Q29vcmRpbmF0ZShyKTtcbiAgICAgICAgICAgIGlmIChyQ2FzdCkge1xuICAgICAgICAgICAgICAgIGVuZCA9IHIueTtcbiAgICAgICAgICAgICAgICByYXljYXN0ID0gckNhc3Q7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gci55O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYXljYXN0ID8gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShyYXljYXN0WzBdLCByYXljYXN0WzFdLCByYXljYXN0WzJdKSA6IHRoaXMucG9pbnRDb29yZGluYXRlKHApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIHNjcmVlbnNwYWNlIFBvaW50IHAsIGlzIGFib3ZlIHRoZSBob3Jpem9uLlxuICAgICAqIFRoaXMgYXBwcm94aW1hdGVzIHRoZSBtYXAgYXMgYW4gaW5maW5pdGUgcGxhbmUgYW5kIGRvZXMgbm90IGFjY291bnQgZm9yIHowLXozXG4gICAgICogd2hlcmVpbiB0aGUgbWFwIGlzIHNtYWxsIHF1YWQgd2l0aCB3aGl0ZXNwYWNlIGFib3ZlIHRoZSBub3J0aCBwb2xlIGFuZCBiZWxvdyB0aGUgc291dGggcG9sZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHBcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGlzUG9pbnRBYm92ZUhvcml6b24ocDogUG9pbnQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmVsZXZhdGlvbikge1xuICAgICAgICAgICAgY29uc3QgaG9yaXpvbiA9IHRoaXMuaG9yaXpvbkxpbmVGcm9tVG9wKCk7XG4gICAgICAgICAgICByZXR1cm4gcC55IDwgaG9yaXpvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5lbGV2YXRpb24ucG9pbnRDb29yZGluYXRlKHApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBjb29yZGluYXRlLCByZXR1cm4gdGhlIHNjcmVlbiBwb2ludCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0XG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2FtcGxlVGVycmFpbkluM0QgaW4gM0QgbW9kZSAodGVycmFpbiBlbmFibGVkKSwgc2FtcGxlIGVsZXZhdGlvbiBmb3IgdGhlIHBvaW50LlxuICAgICAqIElmIGZhbHNlLCBkbyB0aGUgc2FtZSBhcyBpbiAyRCBtb2RlLCBhc3N1bWUgZmxhdCBjYW1lcmEgZWxldmF0aW9uIHBsYW5lIGZvciBhbGwgcG9pbnRzLlxuICAgICAqIEByZXR1cm5zIHtQb2ludH0gc2NyZWVuIHBvaW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY29vcmRpbmF0ZVBvaW50KGNvb3JkOiBNZXJjYXRvckNvb3JkaW5hdGUsIHNhbXBsZVRlcnJhaW5JbjNEOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGVsZXZhdGlvbiA9IHNhbXBsZVRlcnJhaW5JbjNEICYmIHRoaXMuZWxldmF0aW9uID8gdGhpcy5lbGV2YXRpb24uZ2V0QXRQb2ludE9yWmVybyhjb29yZCwgdGhpcy5fY2VudGVyQWx0aXR1ZGUpIDogdGhpcy5fY2VudGVyQWx0aXR1ZGU7XG4gICAgICAgIGNvbnN0IHAgPSBbY29vcmQueCAqIHRoaXMud29ybGRTaXplLCBjb29yZC55ICogdGhpcy53b3JsZFNpemUsIGVsZXZhdGlvbiArIGNvb3JkLnRvQWx0aXR1ZGUoKSwgMV07XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChwLCBwLCB0aGlzLnBpeGVsTWF0cml4KTtcbiAgICAgICAgcmV0dXJuIHBbM10gPiAwID9cbiAgICAgICAgICAgIG5ldyBQb2ludChwWzBdIC8gcFszXSwgcFsxXSAvIHBbM10pIDpcbiAgICAgICAgICAgIG5ldyBQb2ludChOdW1iZXIuTUFYX1ZBTFVFLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICB9XG5cbiAgICBfZ2V0Qm91bmRzKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0b3BMZWZ0ID0gbmV3IFBvaW50KHRoaXMuX2VkZ2VJbnNldHMubGVmdCwgdGhpcy5fZWRnZUluc2V0cy50b3ApO1xuICAgICAgICBjb25zdCB0b3BSaWdodCA9IG5ldyBQb2ludCh0aGlzLndpZHRoIC0gdGhpcy5fZWRnZUluc2V0cy5yaWdodCwgdGhpcy5fZWRnZUluc2V0cy50b3ApO1xuICAgICAgICBjb25zdCBib3R0b21SaWdodCA9IG5ldyBQb2ludCh0aGlzLndpZHRoIC0gdGhpcy5fZWRnZUluc2V0cy5yaWdodCwgdGhpcy5oZWlnaHQgLSB0aGlzLl9lZGdlSW5zZXRzLmJvdHRvbSk7XG4gICAgICAgIGNvbnN0IGJvdHRvbUxlZnQgPSBuZXcgUG9pbnQodGhpcy5fZWRnZUluc2V0cy5sZWZ0LCB0aGlzLmhlaWdodCAtIHRoaXMuX2VkZ2VJbnNldHMuYm90dG9tKTtcblxuICAgICAgICAvLyBDb25zaWRlciBmYXIgcG9pbnRzIGF0IHRoZSBtYXhpbXVtIHBvc3NpYmxlIGVsZXZhdGlvblxuICAgICAgICAvLyBhbmQgbmVhciBwb2ludHMgYXQgdGhlIG1pbmltdW0gdG8gZW5zdXJlIGZ1bGwgY292ZXJhZ2UuXG4gICAgICAgIGxldCB0bCA9IHRoaXMucG9pbnRDb29yZGluYXRlKHRvcExlZnQsIG1pbik7XG4gICAgICAgIGxldCB0ciA9IHRoaXMucG9pbnRDb29yZGluYXRlKHRvcFJpZ2h0LCBtaW4pO1xuICAgICAgICBjb25zdCBiciA9IHRoaXMucG9pbnRDb29yZGluYXRlKGJvdHRvbVJpZ2h0LCBtYXgpO1xuICAgICAgICBjb25zdCBibCA9IHRoaXMucG9pbnRDb29yZGluYXRlKGJvdHRvbUxlZnQsIG1heCk7XG5cbiAgICAgICAgLy8gU25hcCBwb2ludHMgaWYgb2ZmIHRoZSBlZGdlcyBvZiBtYXAgKExhdGl0dWRlIGlzIHRvbyBoaWdoIG9yIGxvdykuXG4gICAgICAgIGNvbnN0IHNsb3BlID0gKHAxLCBwMikgPT4gKHAyLnkgLSBwMS55KSAvIChwMi54IC0gcDEueCk7XG5cbiAgICAgICAgaWYgKHRsLnkgPiAxICYmIHRyLnkgPj0gMCkgdGwgPSBuZXcgTWVyY2F0b3JDb29yZGluYXRlKCgxIC0gYmwueSkgLyBzbG9wZShibCwgdGwpICsgYmwueCwgMSk7XG4gICAgICAgIGVsc2UgaWYgKHRsLnkgPCAwICYmIHRyLnkgPD0gMSkgdGwgPSBuZXcgTWVyY2F0b3JDb29yZGluYXRlKC1ibC55IC8gc2xvcGUoYmwsIHRsKSArIGJsLngsIDApO1xuXG4gICAgICAgIGlmICh0ci55ID4gMSAmJiB0bC55ID49IDApIHRyID0gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZSgoMSAtIGJyLnkpIC8gc2xvcGUoYnIsIHRyKSArIGJyLngsIDEpO1xuICAgICAgICBlbHNlIGlmICh0ci55IDwgMCAmJiB0bC55IDw9IDEpIHRyID0gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZSgtYnIueSAvIHNsb3BlKGJyLCB0cikgKyBici54LCAwKTtcblxuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdEJvdW5kcygpXG4gICAgICAgICAgICAuZXh0ZW5kKHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRsKSlcbiAgICAgICAgICAgIC5leHRlbmQodGhpcy5jb29yZGluYXRlTG9jYXRpb24odHIpKVxuICAgICAgICAgICAgLmV4dGVuZCh0aGlzLmNvb3JkaW5hdGVMb2NhdGlvbihibCkpXG4gICAgICAgICAgICAuZXh0ZW5kKHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKGJyKSk7XG4gICAgfVxuXG4gICAgX2dldEJvdW5kczNEKCk6IExuZ0xhdEJvdW5kcyB7XG4gICAgICAgIGFzc2VydCh0aGlzLmVsZXZhdGlvbik7XG4gICAgICAgIGNvbnN0IGVsZXZhdGlvbiA9ICgodGhpcy5lbGV2YXRpb246IGFueSk6IEVsZXZhdGlvbik7XG4gICAgICAgIGlmICghZWxldmF0aW9uLnZpc2libGVEZW1UaWxlcy5sZW5ndGgpIHsgcmV0dXJuIHRoaXMuX2dldEJvdW5kcygwLCAwKTsgfVxuICAgICAgICBjb25zdCBtaW5tYXggPSBlbGV2YXRpb24udmlzaWJsZURlbVRpbGVzLnJlZHVjZSgoYWNjLCB0KSA9PiB7XG4gICAgICAgICAgICBpZiAodC5kZW0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmVlID0gdC5kZW0udHJlZTtcbiAgICAgICAgICAgICAgICBhY2MubWluID0gTWF0aC5taW4oYWNjLm1pbiwgdHJlZS5taW5pbXVtc1swXSk7XG4gICAgICAgICAgICAgICAgYWNjLm1heCA9IE1hdGgubWF4KGFjYy5tYXgsIHRyZWUubWF4aW11bXNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge21pbjogTnVtYmVyLk1BWF9WQUxVRSwgbWF4OiAwfSk7XG4gICAgICAgIGFzc2VydChtaW5tYXgubWluICE9PSBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJvdW5kcyhtaW5tYXgubWluICogZWxldmF0aW9uLmV4YWdnZXJhdGlvbigpLCBtaW5tYXgubWF4ICogZWxldmF0aW9uLmV4YWdnZXJhdGlvbigpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzLiBXaGVuIHRoZSBiZWFyaW5nIG9yIHBpdGNoIGlzIG5vbi16ZXJvLCB0aGUgdmlzaWJsZSByZWdpb24gaXMgbm90XG4gICAgICogYW4gYXhpcy1hbGlnbmVkIHJlY3RhbmdsZSwgYW5kIHRoZSByZXN1bHQgaXMgdGhlIHNtYWxsZXN0IGJvdW5kcyB0aGF0IGVuY29tcGFzc2VzIHRoZSB2aXNpYmxlIHJlZ2lvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IFJldHVybnMgYSB7QGxpbmsgTG5nTGF0Qm91bmRzfSBvYmplY3QgZGVzY3JpYmluZyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGJvdW5kcy5cbiAgICAgKi9cbiAgICBnZXRCb3VuZHMoKTogTG5nTGF0Qm91bmRzIHtcbiAgICAgICAgaWYgKHRoaXMuX3RlcnJhaW5FbmFibGVkKCkpIHJldHVybiB0aGlzLl9nZXRCb3VuZHMzRCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Qm91bmRzKDAsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgcG9zaXRpb24gb2YgaG9yaXpvbiBsaW5lIGZyb20gdGhlIHRvcCBvZiB0aGUgbWFwIGluIHBpeGVscy5cbiAgICAgKiBJZiBob3Jpem9uIGlzIG5vdCB2aXNpYmxlLCByZXR1cm5zIDAgYnkgZGVmYXVsdCBvciBhIG5lZ2F0aXZlIHZhbHVlIGlmIGNhbGxlZCB3aXRoIGNsYW1wVG9Ub3AgPSBmYWxzZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGhvcml6b25MaW5lRnJvbVRvcChjbGFtcFRvVG9wOiBib29sZWFuID0gdHJ1ZSk6IG51bWJlciB7XG4gICAgICAgIC8vIGggaXMgaGVpZ2h0IG9mIHNwYWNlIGFib3ZlIG1hcCBjZW50ZXIgdG8gaG9yaXpvbi5cbiAgICAgICAgY29uc3QgaCA9IHRoaXMuaGVpZ2h0IC8gMiAvIE1hdGgudGFuKHRoaXMuX2ZvdiAvIDIpIC8gTWF0aC50YW4oTWF0aC5tYXgodGhpcy5fcGl0Y2gsIDAuMSkpICsgdGhpcy5jZW50ZXJPZmZzZXQueTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5oZWlnaHQgLyAyIC0gaCAqICgxIC0gdGhpcy5faG9yaXpvblNoaWZ0KTtcbiAgICAgICAgcmV0dXJuIGNsYW1wVG9Ub3AgPyBNYXRoLm1heCgwLCBvZmZzZXQpIDogb2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZ2VvZ3JhcGhpY2FsIGJvdW5kcyB0aGUgbWFwIGlzIGNvbnN0cmFpbmVkIHRvLCBvciBgbnVsbGAgaWYgbm9uZSBzZXQuXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kc30ge0BsaW5rIExuZ0xhdEJvdW5kc30uXG4gICAgICovXG4gICAgZ2V0TWF4Qm91bmRzKCk6ID9MbmdMYXRCb3VuZHMge1xuICAgICAgICByZXR1cm4gdGhpcy5tYXhCb3VuZHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIG1hcCdzIGdlb2dyYXBoaWNhbCBjb25zdHJhaW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzfSBib3VuZHMgQSB7QGxpbmsgTG5nTGF0Qm91bmRzfSBvYmplY3QgZGVzY3JpYmluZyB0aGUgbmV3IGdlb2dyYXBoaWMgYm91bmRhcmllcyBvZiB0aGUgbWFwLlxuICAgICAqL1xuICAgIHNldE1heEJvdW5kcyhib3VuZHM6ID9MbmdMYXRCb3VuZHMpIHtcbiAgICAgICAgdGhpcy5tYXhCb3VuZHMgPSBib3VuZHM7XG5cbiAgICAgICAgdGhpcy5taW5MYXQgPSAtTUFYX01FUkNBVE9SX0xBVElUVURFO1xuICAgICAgICB0aGlzLm1heExhdCA9IE1BWF9NRVJDQVRPUl9MQVRJVFVERTtcbiAgICAgICAgdGhpcy5taW5MbmcgPSAtMTgwO1xuICAgICAgICB0aGlzLm1heExuZyA9IDE4MDtcblxuICAgICAgICBpZiAoYm91bmRzKSB7XG4gICAgICAgICAgICB0aGlzLm1pbkxhdCA9IGJvdW5kcy5nZXRTb3V0aCgpO1xuICAgICAgICAgICAgdGhpcy5tYXhMYXQgPSBib3VuZHMuZ2V0Tm9ydGgoKTtcbiAgICAgICAgICAgIHRoaXMubWluTG5nID0gYm91bmRzLmdldFdlc3QoKTtcbiAgICAgICAgICAgIHRoaXMubWF4TG5nID0gYm91bmRzLmdldEVhc3QoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1heExuZyA8IHRoaXMubWluTG5nKSB0aGlzLm1heExuZyArPSAzNjA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndvcmxkTWluWCA9IG1lcmNhdG9yWGZyb21MbmcodGhpcy5taW5MbmcpICogdGhpcy50aWxlU2l6ZTtcbiAgICAgICAgdGhpcy53b3JsZE1heFggPSBtZXJjYXRvclhmcm9tTG5nKHRoaXMubWF4TG5nKSAqIHRoaXMudGlsZVNpemU7XG4gICAgICAgIHRoaXMud29ybGRNaW5ZID0gbWVyY2F0b3JZZnJvbUxhdCh0aGlzLm1heExhdCkgKiB0aGlzLnRpbGVTaXplO1xuICAgICAgICB0aGlzLndvcmxkTWF4WSA9IG1lcmNhdG9yWWZyb21MYXQodGhpcy5taW5MYXQpICogdGhpcy50aWxlU2l6ZTtcblxuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVQb3NNYXRyaXgodW53cmFwcGVkVGlsZUlEOiBVbndyYXBwZWRUaWxlSUQsIHdvcmxkU2l6ZTogbnVtYmVyKTogRmxvYXQzMkFycmF5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdGlvbi5jcmVhdGVUaWxlVHJhbnNmb3JtKHRoaXMsIHdvcmxkU2l6ZSkuY3JlYXRlVGlsZU1hdHJpeCh1bndyYXBwZWRUaWxlSUQpO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZURpc3RhbmNlVGlsZURhdGEodW53cmFwcGVkVGlsZUlEOiBVbndyYXBwZWRUaWxlSUQpOiBGZWF0dXJlRGlzdGFuY2VEYXRhIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VEYXRhS2V5ID0gdW53cmFwcGVkVGlsZUlELmtleTtcbiAgICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLl9kaXN0YW5jZVRpbGVEYXRhQ2FjaGU7XG4gICAgICAgIGlmIChjYWNoZVtkaXN0YW5jZURhdGFLZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVbZGlzdGFuY2VEYXRhS2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vQ2FsY3VsYXRlIHRoZSBvZmZzZXQgb2YgdGhlIHRpbGVcbiAgICAgICAgY29uc3QgY2Fub25pY2FsID0gdW53cmFwcGVkVGlsZUlELmNhbm9uaWNhbDtcbiAgICAgICAgY29uc3Qgd2luZG93U2NhbGVGYWN0b3IgPSAxIC8gdGhpcy5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5jYW1lcmFXb3JsZFNpemUgLyB0aGlzLnpvb21TY2FsZShjYW5vbmljYWwueik7XG4gICAgICAgIGNvbnN0IHVud3JhcHBlZFggPSBjYW5vbmljYWwueCArIE1hdGgucG93KDIsIGNhbm9uaWNhbC56KSAqIHVud3JhcHBlZFRpbGVJRC53cmFwO1xuICAgICAgICBjb25zdCB0WCA9IHVud3JhcHBlZFggKiBzY2FsZTtcbiAgICAgICAgY29uc3QgdFkgPSBjYW5vbmljYWwueSAqIHNjYWxlO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMucG9pbnQ7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBiZWFyaW5nIHZlY3RvciBieSByb3RhdGluZyB1bml0IHZlY3RvciBbMCwgLTFdIGNsb2Nrd2lzZVxuICAgICAgICBjb25zdCBhbmdsZSA9IHRoaXMuYW5nbGU7XG4gICAgICAgIGNvbnN0IGJYID0gTWF0aC5zaW4oLWFuZ2xlKTtcbiAgICAgICAgY29uc3QgYlkgPSAtTWF0aC5jb3MoLWFuZ2xlKTtcblxuICAgICAgICBjb25zdCBjWCA9IChjZW50ZXIueCAtIHRYKSAqIHdpbmRvd1NjYWxlRmFjdG9yO1xuICAgICAgICBjb25zdCBjWSA9IChjZW50ZXIueSAtIHRZKSAqIHdpbmRvd1NjYWxlRmFjdG9yO1xuICAgICAgICBjYWNoZVtkaXN0YW5jZURhdGFLZXldID0ge1xuICAgICAgICAgICAgYmVhcmluZzogW2JYLCBiWV0sXG4gICAgICAgICAgICBjZW50ZXI6IFtjWCwgY1ldLFxuICAgICAgICAgICAgc2NhbGU6IChzY2FsZSAvIEVYVEVOVCkgKiB3aW5kb3dTY2FsZUZhY3RvclxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBjYWNoZVtkaXN0YW5jZURhdGFLZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgZm9nVGlsZU1hdHJpeCB0aGF0LCBnaXZlbiBhIHRpbGUgY29vcmRpbmF0ZSwgY2FuIGJlIHVzZWQgdG9cbiAgICAgKiBjYWxjdWxhdGUgaXRzIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBjYW1lcmEgaW4gdW5pdHMgb2YgcGl4ZWxzIGRpdmlkZWRcbiAgICAgKiBieSB0aGUgbWFwIGhlaWdodC4gVXNlZCB3aXRoIGZvZyBmb3IgY29uc2lzdGVudCBjb21wdXRhdGlvbiBvZiBkaXN0YW5jZVxuICAgICAqIGZyb20gY2FtZXJhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtVbndyYXBwZWRUaWxlSUR9IHVud3JhcHBlZFRpbGVJRDtcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNhbGN1bGF0ZUZvZ1RpbGVNYXRyaXgodW53cmFwcGVkVGlsZUlEOiBVbndyYXBwZWRUaWxlSUQpOiBGbG9hdDMyQXJyYXkge1xuICAgICAgICBjb25zdCBmb2dUaWxlTWF0cml4S2V5ID0gdW53cmFwcGVkVGlsZUlELmtleTtcbiAgICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLl9mb2dUaWxlTWF0cml4Q2FjaGU7XG4gICAgICAgIGlmIChjYWNoZVtmb2dUaWxlTWF0cml4S2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlW2ZvZ1RpbGVNYXRyaXhLZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9zTWF0cml4ID0gdGhpcy5jYWxjdWxhdGVQb3NNYXRyaXgodW53cmFwcGVkVGlsZUlELCB0aGlzLmNhbWVyYVdvcmxkU2l6ZSk7XG4gICAgICAgIG1hdDQubXVsdGlwbHkocG9zTWF0cml4LCB0aGlzLndvcmxkVG9Gb2dNYXRyaXgsIHBvc01hdHJpeCk7XG5cbiAgICAgICAgY2FjaGVbZm9nVGlsZU1hdHJpeEtleV0gPSBuZXcgRmxvYXQzMkFycmF5KHBvc01hdHJpeCk7XG4gICAgICAgIHJldHVybiBjYWNoZVtmb2dUaWxlTWF0cml4S2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIHByb2pNYXRyaXggdGhhdCwgZ2l2ZW4gYSB0aWxlIGNvb3JkaW5hdGUsIHdvdWxkIGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgdGlsZSBvbiB0aGUgc2NyZWVuLlxuICAgICAqIEBwYXJhbSB7VW53cmFwcGVkVGlsZUlEfSB1bndyYXBwZWRUaWxlSUQ7XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjYWxjdWxhdGVQcm9qTWF0cml4KHVud3JhcHBlZFRpbGVJRDogVW53cmFwcGVkVGlsZUlELCBhbGlnbmVkOiBib29sZWFuID0gZmFsc2UpOiBGbG9hdDMyQXJyYXkge1xuICAgICAgICBjb25zdCBwcm9qTWF0cml4S2V5ID0gdW53cmFwcGVkVGlsZUlELmtleTtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBhbGlnbmVkID8gdGhpcy5fYWxpZ25lZFByb2pNYXRyaXhDYWNoZSA6IHRoaXMuX3Byb2pNYXRyaXhDYWNoZTtcbiAgICAgICAgaWYgKGNhY2hlW3Byb2pNYXRyaXhLZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVbcHJvak1hdHJpeEtleV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NNYXRyaXggPSB0aGlzLmNhbGN1bGF0ZVBvc01hdHJpeCh1bndyYXBwZWRUaWxlSUQsIHRoaXMud29ybGRTaXplKTtcbiAgICAgICAgY29uc3QgcHJvak1hdHJpeCA9IHRoaXMucHJvamVjdGlvbi5pc1JlcHJvamVjdGVkSW5UaWxlU3BhY2UgP1xuICAgICAgICAgICAgdGhpcy5tZXJjYXRvck1hdHJpeCA6IChhbGlnbmVkID8gdGhpcy5hbGlnbmVkUHJvak1hdHJpeCA6IHRoaXMucHJvak1hdHJpeCk7XG4gICAgICAgIG1hdDQubXVsdGlwbHkocG9zTWF0cml4LCBwcm9qTWF0cml4LCBwb3NNYXRyaXgpO1xuXG4gICAgICAgIGNhY2hlW3Byb2pNYXRyaXhLZXldID0gbmV3IEZsb2F0MzJBcnJheShwb3NNYXRyaXgpO1xuICAgICAgICByZXR1cm4gY2FjaGVbcHJvak1hdHJpeEtleV07XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlUGl4ZWxzVG9UaWxlVW5pdHNNYXRyaXgodGlsZTogVGlsZSk6IEZsb2F0MzJBcnJheSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRpbGUudGlsZUlELmtleTtcbiAgICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLl9waXhlbHNUb1RpbGVVbml0c0NhY2hlO1xuICAgICAgICBpZiAoY2FjaGVba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRyaXggPSBnZXRQaXhlbHNUb1RpbGVVbml0c01hdHJpeCh0aWxlLCB0aGlzKTtcbiAgICAgICAgY2FjaGVba2V5XSA9IG1hdHJpeDtcbiAgICAgICAgcmV0dXJuIGNhY2hlW2tleV07XG4gICAgfVxuXG4gICAgY3VzdG9tTGF5ZXJNYXRyaXgoKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lcmNhdG9yTWF0cml4LnNsaWNlKCk7XG4gICAgfVxuXG4gICAgcmVjZW50ZXJPblRlcnJhaW4oKSB7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9lbGV2YXRpb24pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZWxldmF0aW9uOiBFbGV2YXRpb24gPSB0aGlzLl9lbGV2YXRpb247XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNhbWVyYVN0YXRlKCk7XG5cbiAgICAgICAgLy8gQ2FzdCBhIHJheSB0b3dhcmRzIHRoZSBzZWEgbGV2ZWwgYW5kIGZpbmQgdGhlIGludGVyc2VjdGlvbiBwb2ludCB3aXRoIHRoZSB0ZXJyYWluLlxuICAgICAgICAvLyBXZSBuZWVkIHRvIHVzZSBhIGNhbWVyYSBwb3NpdGlvbiB0aGF0IGV4aXN0cyBpbiB0aGUgc2FtZSBjb29yZGluYXRlIHNwYWNlIGFzIHRoZSBkYXRhLlxuICAgICAgICAvLyBUaGUgZGVmYXVsdCBjYW1lcmEgcG9zaXRpb24gbWlnaHQgaGF2ZSBiZWVuIGNvbXBlbnNhdGVkIGJ5IHRoZSBhY3RpdmUgcHJvamVjdGlvbiBtb2RlbC5cbiAgICAgICAgY29uc3QgbWVyY1BpeGVsc1Blck1ldGVyID0gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIHRoaXMuX2NlbnRlci5sYXQpICogdGhpcy53b3JsZFNpemU7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fY29tcHV0ZUNhbWVyYVBvc2l0aW9uKG1lcmNQaXhlbHNQZXJNZXRlcik7XG4gICAgICAgIGNvbnN0IGRpciA9IHRoaXMuX2NhbWVyYS5mb3J3YXJkKCk7XG5cbiAgICAgICAgLy8gVGhlIHJheWNhc3QgZnVuY3Rpb24gZXhwZWN0cyB6LWNvbXBvbmVudCB0byBiZSBpbiBtZXRlcnNcbiAgICAgICAgY29uc3QgbWV0ZXJzVG9NZXJjID0gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEuMCwgdGhpcy5fY2VudGVyLmxhdCk7XG4gICAgICAgIHN0YXJ0WzJdIC89IG1ldGVyc1RvTWVyYztcbiAgICAgICAgZGlyWzJdIC89IG1ldGVyc1RvTWVyYztcbiAgICAgICAgdmVjMy5ub3JtYWxpemUoZGlyLCBkaXIpO1xuXG4gICAgICAgIGNvbnN0IHQgPSBlbGV2YXRpb24ucmF5Y2FzdChzdGFydCwgZGlyLCBlbGV2YXRpb24uZXhhZ2dlcmF0aW9uKCkpO1xuXG4gICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHZlYzMuc2NhbGVBbmRBZGQoW10sIHN0YXJ0LCBkaXIsIHQpO1xuICAgICAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShwb2ludFswXSwgcG9pbnRbMV0sIG1lcmNhdG9yWmZyb21BbHRpdHVkZShwb2ludFsyXSwgbGF0RnJvbU1lcmNhdG9yWShwb2ludFsxXSkpKTtcblxuICAgICAgICAgICAgY29uc3QgY2FtVG9OZXcgPSBbbmV3Q2VudGVyLnggLSBzdGFydFswXSwgbmV3Q2VudGVyLnkgLSBzdGFydFsxXSwgbmV3Q2VudGVyLnogLSBzdGFydFsyXSAqIG1ldGVyc1RvTWVyY107XG4gICAgICAgICAgICBjb25zdCBtYXhBbHRpdHVkZSA9IChuZXdDZW50ZXIueiArIHZlYzMubGVuZ3RoKGNhbVRvTmV3KSkgKiB0aGlzLl9wcm9qZWN0aW9uU2NhbGVyO1xuICAgICAgICAgICAgdGhpcy5fY2FtZXJhWm9vbSA9IHRoaXMuX3pvb21Gcm9tTWVyY2F0b3JaKG1heEFsdGl0dWRlKTtcblxuICAgICAgICAgICAgLy8gQ2FtZXJhIHpvb20gaGFzIHRvIGJlIHVwZGF0ZWQgYXMgdGhlIG9yYml0IGRpc3RhbmNlIG1pZ2h0IGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgdGhpcy5fY2VudGVyQWx0aXR1ZGUgPSBuZXdDZW50ZXIudG9BbHRpdHVkZSgpO1xuICAgICAgICAgICAgdGhpcy5fY2VudGVyID0gdGhpcy5jb29yZGluYXRlTG9jYXRpb24obmV3Q2VudGVyKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVpvb21Gcm9tRWxldmF0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NvbnN0cmFpbkNhbWVyYUFsdGl0dWRlKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2VsZXZhdGlvbilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBlbGV2YXRpb246IEVsZXZhdGlvbiA9IHRoaXMuX2VsZXZhdGlvbjtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FtZXJhU3RhdGUoKTtcblxuICAgICAgICAvLyBGaW5kIHVuY29tcGVuc2F0ZWQgY2FtZXJhIHBvc2l0aW9uIGZvciBlbGV2YXRpb24gc2FtcGxpbmcuXG4gICAgICAgIC8vIFRoZSBkZWZhdWx0IGNhbWVyYSBwb3NpdGlvbiBtaWdodCBoYXZlIGJlZW4gY29tcGVuc2F0ZWQgYnkgdGhlIGFjdGl2ZSBwcm9qZWN0aW9uIG1vZGVsLlxuICAgICAgICBjb25zdCBtZXJjUGl4ZWxzUGVyTWV0ZXIgPSBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgdGhpcy5fY2VudGVyLmxhdCkgKiB0aGlzLndvcmxkU2l6ZTtcbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5fY29tcHV0ZUNhbWVyYVBvc2l0aW9uKG1lcmNQaXhlbHNQZXJNZXRlcik7XG5cbiAgICAgICAgY29uc3QgZWxldmF0aW9uQXRDYW1lcmEgPSBlbGV2YXRpb24uZ2V0QXRQb2ludE9yWmVybyhuZXcgTWVyY2F0b3JDb29yZGluYXRlKC4uLnBvcykpO1xuICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSB0aGlzLl9taW5pbXVtSGVpZ2h0T3ZlclRlcnJhaW4oKSAqIE1hdGguY29zKGRlZ1RvUmFkKHRoaXMuX21heFBpdGNoKSk7XG4gICAgICAgIGNvbnN0IHRlcnJhaW5FbGV2YXRpb24gPSB0aGlzLnBpeGVsc1Blck1ldGVyIC8gdGhpcy53b3JsZFNpemUgKiBlbGV2YXRpb25BdENhbWVyYTtcbiAgICAgICAgY29uc3QgY2FtZXJhSGVpZ2h0ID0gdGhpcy5fY2FtZXJhLnBvc2l0aW9uWzJdIC0gdGVycmFpbkVsZXZhdGlvbjtcblxuICAgICAgICBpZiAoY2FtZXJhSGVpZ2h0IDwgbWluSGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0aGlzLl9jZW50ZXIsIHRoaXMuX2NlbnRlckFsdGl0dWRlKTtcbiAgICAgICAgICAgIGNvbnN0IGNhbWVyYVRvQ2VudGVyID0gW2NlbnRlci54IC0gcG9zWzBdLCBjZW50ZXIueSAtIHBvc1sxXSwgY2VudGVyLnogLSBwb3NbMl1dO1xuICAgICAgICAgICAgY29uc3QgcHJldkRpc3RUb0NhbWVyYSA9IHZlYzMubGVuZ3RoKGNhbWVyYVRvQ2VudGVyKTtcblxuICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBjYW1lcmEgdmVjdG9yIHNvIHRoYXQgdGhlIGNhbWVyYSBpcyBwbGFjZWQgYWJvdmUgdGhlIHRlcnJhaW4uXG4gICAgICAgICAgICAvLyBEaXN0YW5jZSBiZXR3ZWVuIHRoZSBjYW1lcmEgYW5kIHRoZSBjZW50ZXIgcG9pbnQgaXMga2VwdCBjb25zdGFudC5cbiAgICAgICAgICAgIGNhbWVyYVRvQ2VudGVyWzJdIC09IChtaW5IZWlnaHQgLSBjYW1lcmFIZWlnaHQpIC8gdGhpcy5fcHJvamVjdGlvblNjYWxlcjtcblxuICAgICAgICAgICAgY29uc3QgbmV3RGlzdFRvQ2FtZXJhID0gdmVjMy5sZW5ndGgoY2FtZXJhVG9DZW50ZXIpO1xuICAgICAgICAgICAgaWYgKG5ld0Rpc3RUb0NhbWVyYSA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIHZlYzMuc2NhbGUoY2FtZXJhVG9DZW50ZXIsIGNhbWVyYVRvQ2VudGVyLCBwcmV2RGlzdFRvQ2FtZXJhIC8gbmV3RGlzdFRvQ2FtZXJhICogdGhpcy5fcHJvamVjdGlvblNjYWxlcik7XG4gICAgICAgICAgICB0aGlzLl9jYW1lcmEucG9zaXRpb24gPSBbY2VudGVyLnggLSBjYW1lcmFUb0NlbnRlclswXSwgY2VudGVyLnkgLSBjYW1lcmFUb0NlbnRlclsxXSwgY2VudGVyLnogKiB0aGlzLl9wcm9qZWN0aW9uU2NhbGVyIC0gY2FtZXJhVG9DZW50ZXJbMl1dO1xuXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmEub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbkZyb21GcmFtZShjYW1lcmFUb0NlbnRlciwgdGhpcy5fY2FtZXJhLnVwKCkpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGVGcm9tQ2FtZXJhKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY29uc3RyYWluKCkge1xuICAgICAgICBpZiAoIXRoaXMuY2VudGVyIHx8ICF0aGlzLndpZHRoIHx8ICF0aGlzLmhlaWdodCB8fCB0aGlzLl9jb25zdHJhaW5pbmcpIHJldHVybjtcblxuICAgICAgICB0aGlzLl9jb25zdHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgICAgIC8vIGFsdGVybmF0ZSBjb25zdHJhaW5pbmcgZm9yIG5vbi1NZXJjYXRvciBwcm9qZWN0aW9uc1xuICAgICAgICBpZiAodGhpcy5wcm9qZWN0aW9uLmlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZSkge1xuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5jZW50ZXI7XG4gICAgICAgICAgICBjZW50ZXIubGF0ID0gY2xhbXAoY2VudGVyLmxhdCwgdGhpcy5taW5MYXQsIHRoaXMubWF4TGF0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLm1heEJvdW5kcyB8fCAhdGhpcy5yZW5kZXJXb3JsZENvcGllcykgY2VudGVyLmxuZyA9IGNsYW1wKGNlbnRlci5sbmcsIHRoaXMubWluTG5nLCB0aGlzLm1heExuZyk7XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IGNlbnRlcjtcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5tb2RpZmllZCA9IHRoaXMuX3VubW9kaWZpZWQ7XG4gICAgICAgIGNvbnN0IHt4LCB5fSA9IHRoaXMucG9pbnQ7XG4gICAgICAgIGxldCBzID0gMDtcbiAgICAgICAgbGV0IHgyID0geDtcbiAgICAgICAgbGV0IHkyID0geTtcbiAgICAgICAgY29uc3QgdzIgPSB0aGlzLndpZHRoIC8gMjtcbiAgICAgICAgY29uc3QgaDIgPSB0aGlzLmhlaWdodCAvIDI7XG5cbiAgICAgICAgY29uc3QgbWluWSA9IHRoaXMud29ybGRNaW5ZICogdGhpcy5zY2FsZTtcbiAgICAgICAgY29uc3QgbWF4WSA9IHRoaXMud29ybGRNYXhZICogdGhpcy5zY2FsZTtcbiAgICAgICAgaWYgKHkgLSBoMiA8IG1pblkpIHkyID0gbWluWSArIGgyO1xuICAgICAgICBpZiAoeSArIGgyID4gbWF4WSkgeTIgPSBtYXhZIC0gaDI7XG4gICAgICAgIGlmIChtYXhZIC0gbWluWSA8IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICBzID0gTWF0aC5tYXgocywgdGhpcy5oZWlnaHQgLyAobWF4WSAtIG1pblkpKTtcbiAgICAgICAgICAgIHkyID0gKG1heFkgKyBtaW5ZKSAvIDI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tYXhCb3VuZHMgfHwgIXRoaXMuX3JlbmRlcldvcmxkQ29waWVzIHx8ICF0aGlzLnByb2plY3Rpb24ud3JhcCkge1xuICAgICAgICAgICAgY29uc3QgbWluWCA9IHRoaXMud29ybGRNaW5YICogdGhpcy5zY2FsZTtcbiAgICAgICAgICAgIGNvbnN0IG1heFggPSB0aGlzLndvcmxkTWF4WCAqIHRoaXMuc2NhbGU7XG5cbiAgICAgICAgICAgIC8vIFRyYW5zbGF0ZSB0byBwb3NpdGl2ZSBwb3NpdGlvbnMgd2l0aCB0aGUgbWFwIGNlbnRlciBpbiB0aGUgY2VudGVyIHBvc2l0aW9uLlxuICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1hcCBzbmFwcyB0byB0aGUgY29ycmVjdCBlZGdlLlxuICAgICAgICAgICAgY29uc3Qgc2hpZnQgPSB0aGlzLndvcmxkU2l6ZSAvIDIgLSAobWluWCArIG1heFgpIC8gMjtcbiAgICAgICAgICAgIHgyID0gKHggKyBzaGlmdCArIHRoaXMud29ybGRTaXplKSAlIHRoaXMud29ybGRTaXplIC0gc2hpZnQ7XG5cbiAgICAgICAgICAgIGlmICh4MiAtIHcyIDwgbWluWCkgeDIgPSBtaW5YICsgdzI7XG4gICAgICAgICAgICBpZiAoeDIgKyB3MiA+IG1heFgpIHgyID0gbWF4WCAtIHcyO1xuICAgICAgICAgICAgaWYgKG1heFggLSBtaW5YIDwgdGhpcy53aWR0aCkge1xuICAgICAgICAgICAgICAgIHMgPSBNYXRoLm1heChzLCB0aGlzLndpZHRoIC8gKG1heFggLSBtaW5YKSk7XG4gICAgICAgICAgICAgICAgeDIgPSAobWF4WCArIG1pblgpIC8gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh4MiAhPT0geCB8fCB5MiAhPT0geSkgeyAvLyBwYW4gdGhlIG1hcCB0byBmaXQgdGhlIHJhbmdlXG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMudW5wcm9qZWN0KG5ldyBQb2ludCh4MiwgeTIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocykgeyAvLyBzY2FsZSB0aGUgbWFwIHRvIGZpdCB0aGUgcmFuZ2VcbiAgICAgICAgICAgIHRoaXMuem9vbSArPSB0aGlzLnNjYWxlWm9vbShzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbkNhbWVyYUFsdGl0dWRlKCk7XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSB1bm1vZGlmaWVkO1xuICAgICAgICB0aGlzLl9jb25zdHJhaW5pbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHpvb20gYXQgd2hpY2ggYHRoaXMud2lkdGhgIGNhbiBmaXQgbWF4IGxvbmdpdHVkZSByYW5nZVxuICAgICAqIGFuZCBgdGhpcy5oZWlnaHRgIGNhbiBmaXQgbWF4IGxhdGl0dWRlIHJhbmdlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHpvb20gdmFsdWUuXG4gICAgICovXG4gICAgX21pblpvb21Gb3JCb3VuZHMoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG1pblpvb20gPSBNYXRoLm1heCgwLCB0aGlzLnNjYWxlWm9vbSh0aGlzLmhlaWdodCAvICh0aGlzLndvcmxkTWF4WSAtIHRoaXMud29ybGRNaW5ZKSkpO1xuICAgICAgICBpZiAodGhpcy5tYXhCb3VuZHMpIHtcbiAgICAgICAgICAgIG1pblpvb20gPSBNYXRoLm1heChtaW5ab29tLCB0aGlzLnNjYWxlWm9vbSh0aGlzLndpZHRoIC8gKHRoaXMud29ybGRNYXhYIC0gdGhpcy53b3JsZE1pblgpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pblpvb207XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBkaXN0YW5jZSBvZiB0aGUgY2FtZXJhIGZyb20gdGhlIGNlbnRlciBvZiB0aGUgYm91bmRzLCBzdWNoIHRoYXRcbiAgICAgKiBgdGhpcy53aWR0aGAgY2FuIGZpdCBtYXggbG9uZ2l0dWRlIHJhbmdlIGFuZCBgdGhpcy5oZWlnaHRgIGNhbiBmaXQgbWF4IGxhdGl0dWRlIHJhbmdlLlxuICAgICAqIEluIG1lcmNhdG9yIHVuaXRzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIG1lcmNhdG9yIHogY29vcmRpbmF0ZS5cbiAgICAgKi9cbiAgICBfbWF4Q2FtZXJhQm91bmRzRGlzdGFuY2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lcmNhdG9yWmZyb21ab29tKHRoaXMuX21pblpvb21Gb3JCb3VuZHMoKSk7XG4gICAgfVxuXG4gICAgX2NhbGNNYXRyaWNlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlaWdodCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGhhbGZGb3YgPSB0aGlzLl9mb3YgLyAyO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmNlbnRlck9mZnNldDtcblxuICAgICAgICAvLyBaLWF4aXMgdXNlcyBwaXhlbCBjb29yZGluYXRlcyB3aGVuIGdsb2JlIG1vZGUgaXMgZW5hYmxlZFxuICAgICAgICBjb25zdCBwaXhlbHNQZXJNZXRlciA9IHRoaXMucGl4ZWxzUGVyTWV0ZXI7XG5cbiAgICAgICAgdGhpcy5fcHJvamVjdGlvblNjYWxlciA9IHBpeGVsc1Blck1ldGVyIC8gKG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCB0aGlzLmNlbnRlci5sYXQpICogdGhpcy53b3JsZFNpemUpO1xuICAgICAgICB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgPSAwLjUgLyBNYXRoLnRhbihoYWxmRm92KSAqIHRoaXMuaGVpZ2h0ICogdGhpcy5fcHJvamVjdGlvblNjYWxlcjtcblxuICAgICAgICB0aGlzLl91cGRhdGVDYW1lcmFTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMuX2ZhclogPSB0aGlzLnByb2plY3Rpb24uZmFydGhlc3RQaXhlbERpc3RhbmNlKHRoaXMpO1xuXG4gICAgICAgIC8vIFRoZSBsYXJnZXIgdGhlIHZhbHVlIG9mIG5lYXJaIGlzXG4gICAgICAgIC8vIC0gdGhlIG1vcmUgZGVwdGggcHJlY2lzaW9uIGlzIGF2YWlsYWJsZSBmb3IgZmVhdHVyZXMgKGdvb2QpXG4gICAgICAgIC8vIC0gY2xpcHBpbmcgc3RhcnRzIGFwcGVhcmluZyBzb29uZXIgd2hlbiB0aGUgY2FtZXJhIGlzIGNsb3NlIHRvIDNkIGZlYXR1cmVzIChiYWQpXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNtYWxsZXIgdmFsdWVzIHdvcmtlZCB3ZWxsIGZvciBtYXBib3gtZ2wtanMgYnV0IGRlY2tnbCB3YXMgZW5jb3VudGVyaW5nIHByZWNpc2lvbiBpc3N1ZXNcbiAgICAgICAgLy8gd2hlbiByZW5kZXJpbmcgaXQncyBsYXllcnMgdXNpbmcgY3VzdG9tIGxheWVycy4gVGhpcyB2YWx1ZSB3YXMgZXhwZXJpbWVudGFsbHkgY2hvc2VuIGFuZFxuICAgICAgICAvLyBzZWVtcyB0byBzb2x2ZSB6LWZpZ2h0aW5nIGlzc3VlcyBpbiBkZWNrZ2wgd2hpbGUgbm90IGNsaXBwaW5nIGJ1aWxkaW5ncyB0b28gY2xvc2UgdG8gdGhlIGNhbWVyYS5cbiAgICAgICAgdGhpcy5fbmVhclogPSB0aGlzLmhlaWdodCAvIDUwO1xuXG4gICAgICAgIGNvbnN0IHpVbml0ID0gdGhpcy5wcm9qZWN0aW9uLnpBeGlzVW5pdCA9PT0gXCJtZXRlcnNcIiA/IHBpeGVsc1Blck1ldGVyIDogMS4wO1xuICAgICAgICBjb25zdCB3b3JsZFRvQ2FtZXJhID0gdGhpcy5fY2FtZXJhLmdldFdvcmxkVG9DYW1lcmEodGhpcy53b3JsZFNpemUsIHpVbml0KTtcbiAgICAgICAgY29uc3QgY2FtZXJhVG9DbGlwID0gdGhpcy5fY2FtZXJhLmdldENhbWVyYVRvQ2xpcFBlcnNwZWN0aXZlKHRoaXMuX2ZvdiwgdGhpcy53aWR0aCAvIHRoaXMuaGVpZ2h0LCB0aGlzLl9uZWFyWiwgdGhpcy5fZmFyWik7XG5cbiAgICAgICAgLy8gQXBwbHkgY2VudGVyIG9mIHBlcnNwZWN0aXZlIG9mZnNldFxuICAgICAgICBjYW1lcmFUb0NsaXBbOF0gPSAtb2Zmc2V0LnggKiAyIC8gdGhpcy53aWR0aDtcbiAgICAgICAgY2FtZXJhVG9DbGlwWzldID0gb2Zmc2V0LnkgKiAyIC8gdGhpcy5oZWlnaHQ7XG5cbiAgICAgICAgbGV0IG0gPSBtYXQ0Lm11bChbXSwgY2FtZXJhVG9DbGlwLCB3b3JsZFRvQ2FtZXJhKTtcblxuICAgICAgICBpZiAodGhpcy5wcm9qZWN0aW9uLmlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZSkge1xuICAgICAgICAgICAgLy8gUHJvamVjdGlvbnMgdW5kaXN0b3J0IGFzIHlvdSB6b29tIGluIChzaGVhciwgc2NhbGUsIHJvdGF0ZSkuXG4gICAgICAgICAgICAvLyBBcHBseSB0aGUgdW5kaXN0b3J0aW9uIGFyb3VuZCB0aGUgY2VudGVyIG9mIHRoZSBtYXAuXG4gICAgICAgICAgICBjb25zdCBtYyA9IHRoaXMubG9jYXRpb25Db29yZGluYXRlKHRoaXMuY2VudGVyKTtcbiAgICAgICAgICAgIGNvbnN0IGFkanVzdG1lbnRzID0gbWF0NC5pZGVudGl0eShbXSk7XG4gICAgICAgICAgICBtYXQ0LnRyYW5zbGF0ZShhZGp1c3RtZW50cywgYWRqdXN0bWVudHMsIFttYy54ICogdGhpcy53b3JsZFNpemUsIG1jLnkgKiB0aGlzLndvcmxkU2l6ZSwgMF0pO1xuICAgICAgICAgICAgbWF0NC5tdWx0aXBseShhZGp1c3RtZW50cywgYWRqdXN0bWVudHMsIGdldFByb2plY3Rpb25BZGp1c3RtZW50cyh0aGlzKSk7XG4gICAgICAgICAgICBtYXQ0LnRyYW5zbGF0ZShhZGp1c3RtZW50cywgYWRqdXN0bWVudHMsIFstbWMueCAqIHRoaXMud29ybGRTaXplLCAtbWMueSAqIHRoaXMud29ybGRTaXplLCAwXSk7XG4gICAgICAgICAgICBtYXQ0Lm11bHRpcGx5KG0sIG0sIGFkanVzdG1lbnRzKTtcbiAgICAgICAgICAgIHRoaXMuaW52ZXJzZUFkanVzdG1lbnRNYXRyaXggPSBnZXRQcm9qZWN0aW9uQWRqdXN0bWVudEludmVydGVkKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnZlcnNlQWRqdXN0bWVudE1hdHJpeCA9IFsxLCAwLCAwLCAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtZXJjYXRvck1hdHJpeCBjYW4gYmUgdXNlZCB0byB0cmFuc2Zvcm0gcG9pbnRzIGZyb20gbWVyY2F0b3IgY29vcmRpbmF0ZXNcbiAgICAgICAgLy8gKFswLCAwXSBudywgWzEsIDFdIHNlKSB0byBHTCBjb29yZGluYXRlcy5cbiAgICAgICAgdGhpcy5tZXJjYXRvck1hdHJpeCA9IG1hdDQuc2NhbGUoW10sIG0sIFt0aGlzLndvcmxkU2l6ZSwgdGhpcy53b3JsZFNpemUsIHRoaXMud29ybGRTaXplIC8gcGl4ZWxzUGVyTWV0ZXIsIDEuMF0pO1xuXG4gICAgICAgIHRoaXMucHJvak1hdHJpeCA9IG07XG5cbiAgICAgICAgLy8gRm9yIHRpbGUgY292ZXIgY2FsY3VsYXRpb24sIHVzZSBpbnZlcnRlZCBvZiBiYXNlIChub24gZWxldmF0ZWQpIG1hdHJpeFxuICAgICAgICAvLyBhcyB0aWxlIGVsZXZhdGlvbnMgYXJlIGluIHRpbGUgY29vcmRpbmF0ZXMgYW5kIHJlbGF0aXZlIHRvIGNlbnRlciBlbGV2YXRpb24uXG4gICAgICAgIHRoaXMuaW52UHJvak1hdHJpeCA9IG1hdDQuaW52ZXJ0KG5ldyBGbG9hdDY0QXJyYXkoMTYpLCB0aGlzLnByb2pNYXRyaXgpO1xuXG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICAgICAgbWF0NC5pZGVudGl0eSh2aWV3KTtcbiAgICAgICAgbWF0NC5zY2FsZSh2aWV3LCB2aWV3LCBbMSwgLTEsIDFdKTtcbiAgICAgICAgbWF0NC5yb3RhdGVYKHZpZXcsIHZpZXcsIHRoaXMuX3BpdGNoKTtcbiAgICAgICAgbWF0NC5yb3RhdGVaKHZpZXcsIHZpZXcsIHRoaXMuYW5nbGUpO1xuXG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSBtYXQ0LnBlcnNwZWN0aXZlKG5ldyBGbG9hdDMyQXJyYXkoMTYpLCB0aGlzLl9mb3YsIHRoaXMud2lkdGggLyB0aGlzLmhlaWdodCwgdGhpcy5fbmVhclosIHRoaXMuX2ZhclopO1xuICAgICAgICAvLyBUaGUgZGlzdGFuY2UgaW4gcGl4ZWxzIHRoZSBza3lib3ggbmVlZHMgdG8gYmUgc2hpZnRlZCBkb3duIGJ5IHRvIG1lZXQgdGhlIHNoaWZ0ZWQgaG9yaXpvbi5cbiAgICAgICAgY29uc3Qgc2t5Ym94SG9yaXpvblNoaWZ0ID0gKE1hdGguUEkgLyAyIC0gdGhpcy5fcGl0Y2gpICogKHRoaXMuaGVpZ2h0IC8gdGhpcy5fZm92KSAqIHRoaXMuX2hvcml6b25TaGlmdDtcbiAgICAgICAgLy8gQXBwbHkgY2VudGVyIG9mIHBlcnNwZWN0aXZlIG9mZnNldCB0byBza3lib3ggcHJvamVjdGlvblxuICAgICAgICBwcm9qZWN0aW9uWzhdID0gLW9mZnNldC54ICogMiAvIHRoaXMud2lkdGg7XG4gICAgICAgIHByb2plY3Rpb25bOV0gPSAob2Zmc2V0LnkgKyBza3lib3hIb3Jpem9uU2hpZnQpICogMiAvIHRoaXMuaGVpZ2h0O1xuICAgICAgICB0aGlzLnNreWJveE1hdHJpeCA9IG1hdDQubXVsdGlwbHkodmlldywgcHJvamVjdGlvbiwgdmlldyk7XG5cbiAgICAgICAgLy8gTWFrZSBhIHNlY29uZCBwcm9qZWN0aW9uIG1hdHJpeCB0aGF0IGlzIGFsaWduZWQgdG8gYSBwaXhlbCBncmlkIGZvciByZW5kZXJpbmcgcmFzdGVyIHRpbGVzLlxuICAgICAgICAvLyBXZSdyZSByb3VuZGluZyB0aGUgKGZsb2F0aW5nIHBvaW50KSB4L3kgdmFsdWVzIHRvIGFjaGlldmUgdG8gYXZvaWQgcmVuZGVyaW5nIHJhc3RlciBpbWFnZXMgdG8gZnJhY3Rpb25hbFxuICAgICAgICAvLyBjb29yZGluYXRlcy4gQWRkaXRpb25hbGx5LCB3ZSBhZGp1c3QgYnkgaGFsZiBhIHBpeGVsIGluIGVpdGhlciBkaXJlY3Rpb24gaW4gY2FzZSB0aGF0IHZpZXdwb3J0IGRpbWVuc2lvblxuICAgICAgICAvLyBpcyBhbiBvZGQgaW50ZWdlciB0byBwcmVzZXJ2ZSByZW5kZXJpbmcgdG8gdGhlIHBpeGVsIGdyaWQuIFdlJ3JlIHJvdGF0aW5nIHRoaXMgc2hpZnQgYmFzZWQgb24gdGhlIGFuZ2xlXG4gICAgICAgIC8vIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBzbyB0aGF0IDDCsCwgOTDCsCwgMTgwwrAsIGFuZCAyNzDCsCByYXN0ZXJzIGFyZSBjcmlzcCwgYW5kIGFkanVzdCB0aGUgc2hpZnQgc28gdGhhdFxuICAgICAgICAvLyBpdCBpcyBhbHdheXMgPD0gMC41IHBpeGVscy5cbiAgICAgICAgY29uc3QgcG9pbnQgPSB0aGlzLnBvaW50O1xuICAgICAgICBjb25zdCB4ID0gcG9pbnQueCwgeSA9IHBvaW50Lnk7XG4gICAgICAgIGNvbnN0IHhTaGlmdCA9ICh0aGlzLndpZHRoICUgMikgLyAyLCB5U2hpZnQgPSAodGhpcy5oZWlnaHQgJSAyKSAvIDIsXG4gICAgICAgICAgICBhbmdsZUNvcyA9IE1hdGguY29zKHRoaXMuYW5nbGUpLCBhbmdsZVNpbiA9IE1hdGguc2luKHRoaXMuYW5nbGUpLFxuICAgICAgICAgICAgZHggPSB4IC0gTWF0aC5yb3VuZCh4KSArIGFuZ2xlQ29zICogeFNoaWZ0ICsgYW5nbGVTaW4gKiB5U2hpZnQsXG4gICAgICAgICAgICBkeSA9IHkgLSBNYXRoLnJvdW5kKHkpICsgYW5nbGVDb3MgKiB5U2hpZnQgKyBhbmdsZVNpbiAqIHhTaGlmdDtcbiAgICAgICAgY29uc3QgYWxpZ25lZE0gPSBuZXcgRmxvYXQ2NEFycmF5KG0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShhbGlnbmVkTSwgYWxpZ25lZE0sIFsgZHggPiAwLjUgPyBkeCAtIDEgOiBkeCwgZHkgPiAwLjUgPyBkeSAtIDEgOiBkeSwgMCBdKTtcbiAgICAgICAgdGhpcy5hbGlnbmVkUHJvak1hdHJpeCA9IGFsaWduZWRNO1xuXG4gICAgICAgIG0gPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFt0aGlzLndpZHRoIC8gMiwgLXRoaXMuaGVpZ2h0IC8gMiwgMV0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbMSwgLTEsIDBdKTtcbiAgICAgICAgdGhpcy5sYWJlbFBsYW5lTWF0cml4ID0gbTtcblxuICAgICAgICBtID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgbWF0NC5zY2FsZShtLCBtLCBbMSwgLTEsIDFdKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobSwgbSwgWy0xLCAtMSwgMF0pO1xuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFsyIC8gdGhpcy53aWR0aCwgMiAvIHRoaXMuaGVpZ2h0LCAxXSk7XG4gICAgICAgIHRoaXMuZ2xDb29yZE1hdHJpeCA9IG07XG5cbiAgICAgICAgLy8gbWF0cml4IGZvciBjb252ZXJzaW9uIGZyb20gbG9jYXRpb24gdG8gc2NyZWVuIGNvb3JkaW5hdGVzXG4gICAgICAgIHRoaXMucGl4ZWxNYXRyaXggPSBtYXQ0Lm11bHRpcGx5KG5ldyBGbG9hdDY0QXJyYXkoMTYpLCB0aGlzLmxhYmVsUGxhbmVNYXRyaXgsIHRoaXMucHJvak1hdHJpeCk7XG5cbiAgICAgICAgdGhpcy5fY2FsY0ZvZ01hdHJpY2VzKCk7XG4gICAgICAgIHRoaXMuX2Rpc3RhbmNlVGlsZURhdGFDYWNoZSA9IHt9O1xuXG4gICAgICAgIC8vIGludmVyc2UgbWF0cml4IGZvciBjb252ZXJzaW9uIGZyb20gc2NyZWVuIGNvb3JkaW5hdGVzIHRvIGxvY2F0aW9uXG4gICAgICAgIG0gPSBtYXQ0LmludmVydChuZXcgRmxvYXQ2NEFycmF5KDE2KSwgdGhpcy5waXhlbE1hdHJpeCk7XG4gICAgICAgIGlmICghbSkgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIGludmVydCBtYXRyaXhcIik7XG4gICAgICAgIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlID0gbTtcblxuICAgICAgICB0aGlzLl9wcm9qTWF0cml4Q2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5fYWxpZ25lZFByb2pNYXRyaXhDYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLl9waXhlbHNUb1RpbGVVbml0c0NhY2hlID0ge307XG4gICAgfVxuXG4gICAgX2NhbGNGb2dNYXRyaWNlcygpIHtcbiAgICAgICAgdGhpcy5fZm9nVGlsZU1hdHJpeENhY2hlID0ge307XG5cbiAgICAgICAgY29uc3QgY2FtZXJhV29ybGRTaXplID0gdGhpcy5jYW1lcmFXb3JsZFNpemU7XG4gICAgICAgIGNvbnN0IGNhbWVyYVBpeGVsc1Blck1ldGVyID0gdGhpcy5jYW1lcmFQaXhlbHNQZXJNZXRlcjtcbiAgICAgICAgY29uc3QgY2FtZXJhUG9zID0gdGhpcy5fY2FtZXJhLnBvc2l0aW9uO1xuXG4gICAgICAgIC8vIFRoZSBtZXJjYXRvciBmb2cgbWF0cml4IGVuY29kZXMgdHJhbnNmb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHRyYW5zZm9ybSBhIHBvc2l0aW9uIHRvIGNhbWVyYSBmb2cgc3BhY2UgKGluIG1ldGVycyk6XG4gICAgICAgIC8vIHRyYW5zbGF0ZXMgcCB0byBjYW1lcmEgb3JpZ2luIGFuZCB0cmFuc2Zvcm1zIGl0IGZyb20gcGl4ZWxzIHRvIG1ldGVycy4gVGhlIHdpbmRvd1NjYWxlRmFjdG9yIGlzIHVzZWQgdG8gaGF2ZSBhXG4gICAgICAgIC8vIGNvbnNpc3RlbnQgdHJhbnNmb3JtYXRpb24gYWNyb3NzIGRpZmZlcmVudCB3aW5kb3cgc2l6ZXMuXG4gICAgICAgIC8vIC0gcCA9IHAgLSBjYW1lcmFPcmlnaW5cbiAgICAgICAgLy8gLSBwLnh5ID0gcC54eSAqIGNhbWVyYVdvcmxkU2l6ZSAqIHdpbmRvd1NjYWxlRmFjdG9yXG4gICAgICAgIC8vIC0gcC56ICA9IHAueiAgKiBjYW1lcmFQaXhlbHNQZXJNZXRlciAqIHdpbmRvd1NjYWxlRmFjdG9yXG4gICAgICAgIGNvbnN0IHdpbmRvd1NjYWxlRmFjdG9yID0gMSAvIHRoaXMuaGVpZ2h0O1xuICAgICAgICBjb25zdCBtZXRlcnNUb1BpeGVsID0gW2NhbWVyYVdvcmxkU2l6ZSwgY2FtZXJhV29ybGRTaXplLCBjYW1lcmFQaXhlbHNQZXJNZXRlcl07XG4gICAgICAgIHZlYzMuc2NhbGUobWV0ZXJzVG9QaXhlbCwgbWV0ZXJzVG9QaXhlbCwgd2luZG93U2NhbGVGYWN0b3IpO1xuICAgICAgICB2ZWMzLnNjYWxlKGNhbWVyYVBvcywgY2FtZXJhUG9zLCAtMSk7XG4gICAgICAgIHZlYzMubXVsdGlwbHkoY2FtZXJhUG9zLCBjYW1lcmFQb3MsIG1ldGVyc1RvUGl4ZWwpO1xuXG4gICAgICAgIGNvbnN0IG0gPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBjYW1lcmFQb3MpO1xuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIG1ldGVyc1RvUGl4ZWwpO1xuICAgICAgICB0aGlzLm1lcmNhdG9yRm9nTWF0cml4ID0gbTtcblxuICAgICAgICAvLyBUaGUgd29ybGRUb0ZvZ01hdHJpeCBjYW4gYmUgdXNlZCBmb3IgY29udmVyc2lvbiBmcm9tIHdvcmxkIGNvb3JkaW5hdGVzIHRvIHJlbGF0aXZlIGNhbWVyYSBwb3NpdGlvbiBpblxuICAgICAgICAvLyB1bml0cyBvZiBmcmFjdGlvbnMgb2YgdGhlIG1hcCBoZWlnaHQuIExhdGVyIGNvbXBvc2VkIHdpdGggdGlsZSBwb3NpdGlvbiB0byBjb25zdHJ1Y3QgdGhlIGZvZyB0aWxlIG1hdHJpeC5cbiAgICAgICAgdGhpcy53b3JsZFRvRm9nTWF0cml4ID0gdGhpcy5fY2FtZXJhLmdldFdvcmxkVG9DYW1lcmFQb3NpdGlvbihjYW1lcmFXb3JsZFNpemUsIGNhbWVyYVBpeGVsc1Blck1ldGVyLCB3aW5kb3dTY2FsZUZhY3Rvcik7XG4gICAgfVxuXG4gICAgX2NvbXB1dGVDYW1lcmFQb3NpdGlvbih0YXJnZXRQaXhlbHNQZXJNZXRlcjogP251bWJlcik6IHZlYzMge1xuICAgICAgICB0YXJnZXRQaXhlbHNQZXJNZXRlciA9IHRhcmdldFBpeGVsc1Blck1ldGVyIHx8IHRoaXMucGl4ZWxzUGVyTWV0ZXI7XG4gICAgICAgIGNvbnN0IHBpeGVsU3BhY2VDb252ZXJzaW9uID0gdGFyZ2V0UGl4ZWxzUGVyTWV0ZXIgLyB0aGlzLnBpeGVsc1Blck1ldGVyO1xuXG4gICAgICAgIGNvbnN0IGRpciA9IHRoaXMuX2NhbWVyYS5mb3J3YXJkKCk7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMucG9pbnQ7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBjYW1lcmEgcG9zaXRpb24gdXNpbmcgdGhlIGZvbGxvd2luZyB2ZWN0b3IgbWF0aDogY2FtZXJhLnBvc2l0aW9uID0gbWFwLmNlbnRlciAtIGNhbWVyYS5mb3J3YXJkICogY2FtZXJhVG9DZW50ZXJEaXN0XG4gICAgICAgIC8vIENhbWVyYSBkaXN0YW5jZSB0byB0aGUgY2VudGVyIGNhbiBiZSBmb3VuZCBpbiBtZXJjYXRvciB1bml0cyBieSBzdWJ0cmFjdGluZyB0aGUgY2VudGVyIGVsZXZhdGlvbiBmcm9tXG4gICAgICAgIC8vIGNhbWVyYSdzIHplbml0aCBwb3NpdGlvbiAod2hpY2ggY2FuIGJlIGRlZHVjZWQgZnJvbSB0aGUgem9vbSBsZXZlbClcbiAgICAgICAgY29uc3Qgem9vbSA9IHRoaXMuX2NhbWVyYVpvb20gPyB0aGlzLl9jYW1lcmFab29tIDogdGhpcy5fem9vbTtcbiAgICAgICAgY29uc3QgYWx0aXR1ZGUgPSB0aGlzLl9tZXJjYXRvclpmcm9tWm9vbSh6b29tKSAqIHBpeGVsU3BhY2VDb252ZXJzaW9uO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGFsdGl0dWRlIC0gdGFyZ2V0UGl4ZWxzUGVyTWV0ZXIgLyB0aGlzLndvcmxkU2l6ZSAqIHRoaXMuX2NlbnRlckFsdGl0dWRlO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBjZW50ZXIueCAvIHRoaXMud29ybGRTaXplIC0gZGlyWzBdICogZGlzdGFuY2UsXG4gICAgICAgICAgICBjZW50ZXIueSAvIHRoaXMud29ybGRTaXplIC0gZGlyWzFdICogZGlzdGFuY2UsXG4gICAgICAgICAgICB0YXJnZXRQaXhlbHNQZXJNZXRlciAvIHRoaXMud29ybGRTaXplICogdGhpcy5fY2VudGVyQWx0aXR1ZGUgLSBkaXJbMl0gKiBkaXN0YW5jZVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIF91cGRhdGVDYW1lcmFTdGF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlaWdodCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNldCBjYW1lcmEgb3JpZW50YXRpb24gYW5kIG1vdmUgaXQgdG8gYSBwcm9wZXIgZGlzdGFuY2UgZnJvbSB0aGUgbWFwXG4gICAgICAgIHRoaXMuX2NhbWVyYS5zZXRQaXRjaEJlYXJpbmcodGhpcy5fcGl0Y2gsIHRoaXMuYW5nbGUpO1xuICAgICAgICB0aGlzLl9jYW1lcmEucG9zaXRpb24gPSB0aGlzLl9jb21wdXRlQ2FtZXJhUG9zaXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBhIDNkIHRyYW5zbGF0aW9uIHRvIHRoZSBjYW1lcmEgcG9zaXRpb24sIGJ1dCBjbGFtcGluZyBpdCBzbyB0aGF0XG4gICAgICogaXQgcmVzcGVjdHMgdGhlIG1heGltdW0gbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSByYW5nZSBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3ZlYzN9IHRyYW5zbGF0aW9uIFRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IuXG4gICAgICovXG4gICAgX3RyYW5zbGF0ZUNhbWVyYUNvbnN0cmFpbmVkKHRyYW5zbGF0aW9uOiB2ZWMzKSB7XG4gICAgICAgIGNvbnN0IG1heERpc3RhbmNlID0gdGhpcy5fbWF4Q2FtZXJhQm91bmRzRGlzdGFuY2UoKTtcbiAgICAgICAgLy8gRGVmaW5lIGEgY2VpbGluZyBpbiBtZXJjYXRvciBaXG4gICAgICAgIGNvbnN0IG1heFogPSBtYXhEaXN0YW5jZSAqIE1hdGguY29zKHRoaXMuX3BpdGNoKTtcbiAgICAgICAgY29uc3QgeiA9IHRoaXMuX2NhbWVyYS5wb3NpdGlvblsyXTtcbiAgICAgICAgY29uc3QgZGVsdGFaID0gdHJhbnNsYXRpb25bMl07XG4gICAgICAgIGxldCB0ID0gMTtcbiAgICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIGNsYW1wIGlmIHRoZSBjYW1lcmEgaXMgbW92aW5nIHVwd2FyZHNcbiAgICAgICAgaWYgKGRlbHRhWiA+IDApIHtcbiAgICAgICAgICAgIHQgPSBNYXRoLm1pbigobWF4WiAtIHopIC8gZGVsdGFaLCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NhbWVyYS5wb3NpdGlvbiA9IHZlYzMuc2NhbGVBbmRBZGQoW10sIHRoaXMuX2NhbWVyYS5wb3NpdGlvbiwgdHJhbnNsYXRpb24sIHQpO1xuICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZUZyb21DYW1lcmEoKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlU3RhdGVGcm9tQ2FtZXJhKCkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuX2NhbWVyYS5wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5fY2FtZXJhLmZvcndhcmQoKTtcbiAgICAgICAgY29uc3Qge3BpdGNoLCBiZWFyaW5nfSA9IHRoaXMuX2NhbWVyYS5nZXRQaXRjaEJlYXJpbmcoKTtcblxuICAgICAgICAvLyBDb21wdXRlIHpvb20gZnJvbSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBjYW1lcmEgYW5kIHRlcnJhaW5cbiAgICAgICAgY29uc3QgY2VudGVyQWx0aXR1ZGUgPSBtZXJjYXRvclpmcm9tQWx0aXR1ZGUodGhpcy5fY2VudGVyQWx0aXR1ZGUsIHRoaXMuY2VudGVyLmxhdCkgKiB0aGlzLl9wcm9qZWN0aW9uU2NhbGVyO1xuICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSB0aGlzLl9tZXJjYXRvclpmcm9tWm9vbSh0aGlzLl9tYXhab29tKSAqIE1hdGguY29zKGRlZ1RvUmFkKHRoaXMuX21heFBpdGNoKSk7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KChwb3NpdGlvblsyXSAtIGNlbnRlckFsdGl0dWRlKSAvIE1hdGguY29zKHBpdGNoKSwgbWluSGVpZ2h0KTtcbiAgICAgICAgY29uc3Qgem9vbSA9IHRoaXMuX3pvb21Gcm9tTWVyY2F0b3JaKGhlaWdodCk7XG5cbiAgICAgICAgLy8gQ2FzdCBhIHJheSB0b3dhcmRzIHRoZSBncm91bmQgdG8gZmluZCB0aGUgY2VudGVyIHBvaW50XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQocG9zaXRpb24sIHBvc2l0aW9uLCBkaXIsIGhlaWdodCk7XG5cbiAgICAgICAgdGhpcy5fcGl0Y2ggPSBjbGFtcChwaXRjaCwgZGVnVG9SYWQodGhpcy5taW5QaXRjaCksIGRlZ1RvUmFkKHRoaXMubWF4UGl0Y2gpKTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IHdyYXAoYmVhcmluZywgLU1hdGguUEksIE1hdGguUEkpO1xuICAgICAgICB0aGlzLl9zZXRab29tKGNsYW1wKHpvb20sIHRoaXMuX21pblpvb20sIHRoaXMuX21heFpvb20pKTtcblxuICAgICAgICBpZiAodGhpcy5fdGVycmFpbkVuYWJsZWQoKSlcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNhbWVyYU9uVGVycmFpbigpO1xuXG4gICAgICAgIHRoaXMuX2NlbnRlciA9IHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKG5ldyBNZXJjYXRvckNvb3JkaW5hdGUocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdLCBwb3NpdGlvblsyXSkpO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbigpO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBfd29ybGRTaXplRnJvbVpvb20oem9vbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucG93KDIuMCwgem9vbSkgKiB0aGlzLnRpbGVTaXplO1xuICAgIH1cblxuICAgIF9tZXJjYXRvclpmcm9tWm9vbSh6b29tOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gdGhpcy5fd29ybGRTaXplRnJvbVpvb20oem9vbSk7XG4gICAgfVxuXG4gICAgX21pbmltdW1IZWlnaHRPdmVyVGVycmFpbigpIHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIG1pbmltdW0gaGVpZ2h0IGZvciB0aGUgY2FtZXJhIG92ZXIgdGhlIHRlcnJhaW4gcmVsYXRlZCB0byBjdXJyZW50IHpvb20uXG4gICAgICAgIC8vIFZhbHVlcyBhYm92ZSB0aGFuIDIgYWxsb3cgbWF4LXBpdGNoIGNhbWVyYSBjbG9zZXIgdG8gZS5nLiB0b3Agb2YgdGhlIGhpbGwsIGV4cG9zaW5nXG4gICAgICAgIC8vIGRyYXBlIHJhc3RlciBvdmVyc2NhbGUgYXJ0aWZhY3RzIG9yIGN1dCB0ZXJyYWluIChzZWUgdW5kZXIgaXQpIGFzIGl0IGdldHMgY2xpcHBlZCBvblxuICAgICAgICAvLyBuZWFyIHBsYW5lLiBSZXR1cm5lZCB2YWx1ZSBpcyBpbiBtZXJjYXRvciBjb29yZGluYXRlcy5cbiAgICAgICAgY29uc3QgTUFYX0RSQVBFX09WRVJaT09NID0gMjtcbiAgICAgICAgY29uc3Qgem9vbSA9IE1hdGgubWluKCh0aGlzLl9jYW1lcmFab29tICE9IG51bGwgPyB0aGlzLl9jYW1lcmFab29tIDogdGhpcy5fem9vbSkgKyBNQVhfRFJBUEVfT1ZFUlpPT00sIHRoaXMuX21heFpvb20pO1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVyY2F0b3JaZnJvbVpvb20oem9vbSk7XG4gICAgfVxuXG4gICAgX3pvb21Gcm9tTWVyY2F0b3JaKHo6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlWm9vbSh0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyAoeiAqIHRoaXMudGlsZVNpemUpKTtcbiAgICB9XG5cbiAgICBfdGVycmFpbkVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5fZWxldmF0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5wcm9qZWN0aW9uLnN1cHBvcnRzVGVycmFpbikge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ1RlcnJhaW4gaXMgbm90IHlldCBzdXBwb3J0ZWQgd2l0aCBhbHRlcm5hdGUgcHJvamVjdGlvbnMuIFVzZSBtZXJjYXRvciB0byBlbmFibGUgdGVycmFpbi4nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBhbnkgb2YgdGhlIGZvdXIgY29ybmVycyBhcmUgb2ZmIHRoZSBlZGdlIG9mIHRoZSByZW5kZXJlZCBtYXBcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGBmYWxzZWAgZm9yIGFsbCBub24tbWVyY2F0b3IgcHJvamVjdGlvblxuICAgIGFueUNvcm5lck9mZkVkZ2UocDA6IFBvaW50LCBwMTogUG9pbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWluWCA9IE1hdGgubWluKHAwLngsIHAxLngpO1xuICAgICAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgocDAueCwgcDEueCk7XG4gICAgICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbihwMC55LCBwMS55KTtcbiAgICAgICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHAwLnksIHAxLnkpO1xuXG4gICAgICAgIGNvbnN0IGhvcml6b24gPSB0aGlzLmhvcml6b25MaW5lRnJvbVRvcChmYWxzZSk7XG4gICAgICAgIGlmIChtaW5ZIDwgaG9yaXpvbikgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMucHJvamVjdGlvbi5uYW1lICE9PSAnbWVyY2F0b3InKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW4gPSBuZXcgUG9pbnQobWluWCwgbWluWSk7XG4gICAgICAgIGNvbnN0IG1heCA9IG5ldyBQb2ludChtYXhYLCBtYXhZKTtcblxuICAgICAgICBjb25zdCBjb3JuZXJzID0gW1xuICAgICAgICAgICAgbWluLCBtYXgsXG4gICAgICAgICAgICBuZXcgUG9pbnQobWluWCwgbWF4WSksXG4gICAgICAgICAgICBuZXcgUG9pbnQobWF4WCwgbWluWSksXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgbWluV1ggPSAodGhpcy5yZW5kZXJXb3JsZENvcGllcykgPyAtTlVNX1dPUkxEX0NPUElFUyA6IDA7XG4gICAgICAgIGNvbnN0IG1heFdYID0gKHRoaXMucmVuZGVyV29ybGRDb3BpZXMpID8gMSArIE5VTV9XT1JMRF9DT1BJRVMgOiAxO1xuICAgICAgICBjb25zdCBtaW5XWSA9IDA7XG4gICAgICAgIGNvbnN0IG1heFdZID0gMTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNvcm5lciBvZiBjb3JuZXJzKSB7XG4gICAgICAgICAgICBjb25zdCByYXlJbnRlcnNlY3Rpb24gPSB0aGlzLnBvaW50UmF5SW50ZXJzZWN0aW9uKGNvcm5lcik7XG4gICAgICAgICAgICAvLyBQb2ludCBpcyBhYm92ZSB0aGUgaG9yaXpvblxuICAgICAgICAgICAgaWYgKHJheUludGVyc2VjdGlvbi50IDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUG9pbnQgaXMgb2ZmIHRoZSBib25kYXJpZXMgb2YgdGhlIG1hcFxuICAgICAgICAgICAgY29uc3QgY29vcmRpbmF0ZSA9IHRoaXMucmF5SW50ZXJzZWN0aW9uQ29vcmRpbmF0ZShyYXlJbnRlcnNlY3Rpb24pO1xuICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGUueCA8IG1pbldYIHx8IGNvb3JkaW5hdGUueSA8IG1pbldZIHx8XG4gICAgICAgICAgICAgICAgY29vcmRpbmF0ZS54ID4gbWF4V1ggfHwgY29vcmRpbmF0ZS55ID4gbWF4V1kpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVja3MgdGhlIGZvdXIgY29ybmVycyBvZiB0aGUgZnJ1c3R1bSB0byBzZWUgaWYgdGhleSBsaWUgaW4gdGhlIG1hcCdzIHF1YWQuXG4gICAgLy9cbiAgICBpc0hvcml6b25WaXNpYmxlKCk6IGJvb2xlYW4ge1xuXG4gICAgICAgIC8vIHdlIGNvbnNpZGVyIHRoZSBob3Jpem9uIGFzIHZpc2libGUgaWYgdGhlIGFuZ2xlIGJldHdlZW5cbiAgICAgICAgLy8gYSB0aGUgdG9wIHBsYW5lIG9mIHRoZSBmcnVzdHVtIGFuZCB0aGUgbWFwIHBsYW5lIGlzIHNtYWxsZXIgdGhhbiB0aGlzIHRocmVzaG9sZC5cbiAgICAgICAgY29uc3QgaG9yaXpvbkFuZ2xlRXBzaWxvbiA9IDI7XG4gICAgICAgIGlmICh0aGlzLnBpdGNoICsgcmFkVG9EZWcodGhpcy5mb3ZBYm92ZUNlbnRlcikgPiAoOTAgLSBob3Jpem9uQW5nbGVFcHNpbG9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5hbnlDb3JuZXJPZmZFZGdlKG5ldyBQb2ludCgwLCAwKSwgbmV3IFBvaW50KHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYSB6b29tIGRlbHRhIHZhbHVlIGludG8gYSBwaHlzaWNhbCBkaXN0YW5jZSB0cmF2ZWxsZWQgaW4gd2ViIG1lcmNhdG9yIGNvb3JkaW5hdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHt2ZWMzfSBjZW50ZXIgRGVzdGluYXRpb24gbWVyY2F0b3IgcG9pbnQgb2YgdGhlIG1vdmVtZW50LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6b29tRGVsdGEgQ2hhbmdlIGluIHRoZSB6b29tIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBkaXN0YW5jZSBpbiBtZXJjYXRvciBjb29yZGluYXRlcy5cbiAgICAgKi9cbiAgICB6b29tRGVsdGFUb01vdmVtZW50KGNlbnRlcjogdmVjMywgem9vbURlbHRhOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHZlYzMubGVuZ3RoKHZlYzMuc3ViKFtdLCB0aGlzLl9jYW1lcmEucG9zaXRpb24sIGNlbnRlcikpO1xuICAgICAgICBjb25zdCByZWxhdGl2ZVpvb20gPSB0aGlzLl96b29tRnJvbU1lcmNhdG9yWihkaXN0YW5jZSkgKyB6b29tRGVsdGE7XG4gICAgICAgIHJldHVybiBkaXN0YW5jZSAtIHRoaXMuX21lcmNhdG9yWmZyb21ab29tKHJlbGF0aXZlWm9vbSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUaGUgY2FtZXJhIGxvb2tzIGF0IHRoZSBtYXAgZnJvbSBhIDNEIChsbmcsIGxhdCwgYWx0aXR1ZGUpIGxvY2F0aW9uLiBMZXQncyB1c2UgYGNhbWVyYUxvY2F0aW9uYFxuICAgICAqIGFzIHRoZSBuYW1lIGZvciB0aGUgbG9jYXRpb24gdW5kZXIgdGhlIGNhbWVyYSBhbmQgb24gdGhlIHN1cmZhY2Ugb2YgdGhlIGVhcnRoIChsbmcsIGxhdCwgMCkuXG4gICAgICogYGNhbWVyYVBvaW50YCBpcyB0aGUgcHJvamVjdGVkIHBvc2l0aW9uIG9mIHRoZSBgY2FtZXJhTG9jYXRpb25gLlxuICAgICAqXG4gICAgICogVGhpcyBwb2ludCBpcyB1c2VmdWwgdG8gdXMgYmVjYXVzZSBvbmx5IGZpbGwtZXh0cnVzaW9ucyB0aGF0IGFyZSBiZXR3ZWVuIGBjYW1lcmFQb2ludGAgYW5kXG4gICAgICogdGhlIHF1ZXJ5IHBvaW50IG9uIHRoZSBzdXJmYWNlIG9mIHRoZSBlYXJ0aCBjYW4gZXh0ZW5kIGFuZCBpbnRlcnNlY3QgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogV2hlbiB0aGUgbWFwIGlzIG5vdCBwaXRjaGVkIHRoZSBgY2FtZXJhUG9pbnRgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNlbnRlciBvZiB0aGUgbWFwIGJlY2F1c2VcbiAgICAgKiB0aGUgY2FtZXJhIGlzIHJpZ2h0IGFib3ZlIHRoZSBjZW50ZXIgb2YgdGhlIG1hcC5cbiAgICAgKi9cbiAgICBnZXRDYW1lcmFQb2ludCgpIHtcbiAgICAgICAgY29uc3QgcGl0Y2ggPSB0aGlzLl9waXRjaDtcbiAgICAgICAgY29uc3QgeU9mZnNldCA9IE1hdGgudGFuKHBpdGNoKSAqICh0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgfHwgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbnRlclBvaW50LmFkZChuZXcgUG9pbnQoMCwgeU9mZnNldCkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNmb3JtO1xuIiwiXG5pbXBvcnQgcmVmUHJvcGVydGllcyBmcm9tICcuL3V0aWwvcmVmX3Byb3BlcnRpZXMuanMnO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBvYmo7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdib29sZWFuJyB8fCB0eXBlID09PSAnc3RyaW5nJyB8fCBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGwpXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBsZXQgc3RyID0gJ1snO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiBvYmopIHtcbiAgICAgICAgICAgIHN0ciArPSBgJHtzdHJpbmdpZnkodmFsKX0sYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7c3RyfV1gO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopLnNvcnQoKTtcblxuICAgIGxldCBzdHIgPSAneyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHN0ciArPSBgJHtKU09OLnN0cmluZ2lmeShrZXlzW2ldKX06JHtzdHJpbmdpZnkob2JqW2tleXNbaV1dKX0sYDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3N0cn19YDtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5KGxheWVyKSB7XG4gICAgbGV0IGtleSA9ICcnO1xuICAgIGZvciAoY29uc3QgayBvZiByZWZQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGtleSArPSBgLyR7c3RyaW5naWZ5KGxheWVyW2tdKX1gO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBncm91cEJ5TGF5b3V0O1xuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGxheWVycywgcmV0dXJuIGFuIGFycmF5IG9mIGFycmF5cyBvZiBsYXllcnMgd2hlcmUgYWxsXG4gKiBsYXllcnMgaW4gZWFjaCBncm91cCBoYXZlIGlkZW50aWNhbCBsYXlvdXQtYWZmZWN0aW5nIHByb3BlcnRpZXMuIFRoZXNlXG4gKiBhcmUgdGhlIHByb3BlcnRpZXMgdGhhdCB3ZXJlIGZvcm1lcmx5IHVzZWQgYnkgZXhwbGljaXQgYHJlZmAgbWVjaGFuaXNtXG4gKiBmb3IgbGF5ZXJzOiAndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ21pbnpvb20nLCAnbWF4em9vbScsXG4gKiAnZmlsdGVyJywgYW5kICdsYXlvdXQnLlxuICpcbiAqIFRoZSBpbnB1dCBpcyBub3QgbW9kaWZpZWQuIFRoZSBvdXRwdXQgbGF5ZXJzIGFyZSByZWZlcmVuY2VzIHRvIHRoZVxuICogaW5wdXQgbGF5ZXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5PExheWVyPn0gbGF5ZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gW2NhY2hlZEtleXNdIC0gYW4gb2JqZWN0IHRvIGtlZXAgYWxyZWFkeSBjYWxjdWxhdGVkIGtleXMuXG4gKiBAcmV0dXJucyB7QXJyYXk8QXJyYXk8TGF5ZXI+Pn1cbiAqL1xuZnVuY3Rpb24gZ3JvdXBCeUxheW91dChsYXllcnMsIGNhY2hlZEtleXMpIHtcbiAgICBjb25zdCBncm91cHMgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgY29uc3QgayA9IChjYWNoZWRLZXlzICYmIGNhY2hlZEtleXNbbGF5ZXJzW2ldLmlkXSkgfHwgZ2V0S2V5KGxheWVyc1tpXSk7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgY2FjaGUgaWYgdGhlcmUgaXMgb25lXG4gICAgICAgIGlmIChjYWNoZWRLZXlzKVxuICAgICAgICAgICAgY2FjaGVkS2V5c1tsYXllcnNbaV0uaWRdID0gaztcblxuICAgICAgICBsZXQgZ3JvdXAgPSBncm91cHNba107XG4gICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgIGdyb3VwID0gZ3JvdXBzW2tdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAucHVzaChsYXllcnNbaV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBrIGluIGdyb3Vwcykge1xuICAgICAgICByZXN1bHQucHVzaChncm91cHNba10pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuL3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCBjcmVhdGVTdHlsZUxheWVyIGZyb20gJy4vY3JlYXRlX3N0eWxlX2xheWVyLmpzJztcblxuaW1wb3J0IHt2YWx1ZXN9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgZ3JvdXBCeUxheW91dCBmcm9tICcuLi9zdHlsZS1zcGVjL2dyb3VwX2J5X2xheW91dC5qcyc7XG5cbmltcG9ydCB0eXBlIHtUeXBlZFN0eWxlTGF5ZXJ9IGZyb20gJy4vc3R5bGVfbGF5ZXIvdHlwZWRfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIExheWVyQ29uZmlncyA9IHtbXzogc3RyaW5nXTogTGF5ZXJTcGVjaWZpY2F0aW9uIH07XG5leHBvcnQgdHlwZSBGYW1pbHk8TGF5ZXI6IFR5cGVkU3R5bGVMYXllcj4gPSBBcnJheTxMYXllcj47XG5cbmNsYXNzIFN0eWxlTGF5ZXJJbmRleCB7XG4gICAgZmFtaWxpZXNCeVNvdXJjZTogeyBbc291cmNlOiBzdHJpbmddOiB7IFtzb3VyY2VMYXllcjogc3RyaW5nXTogQXJyYXk8RmFtaWx5PCo+PiB9IH07XG4gICAga2V5Q2FjaGU6IHsgW3NvdXJjZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgICBfbGF5ZXJDb25maWdzOiBMYXllckNvbmZpZ3M7XG4gICAgX2xheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyIH07XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllckNvbmZpZ3M6ID9BcnJheTxMYXllclNwZWNpZmljYXRpb24+KSB7XG4gICAgICAgIHRoaXMua2V5Q2FjaGUgPSB7fTtcbiAgICAgICAgaWYgKGxheWVyQ29uZmlncykge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlKGxheWVyQ29uZmlncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXBsYWNlKGxheWVyQ29uZmlnczogQXJyYXk8TGF5ZXJTcGVjaWZpY2F0aW9uPikge1xuICAgICAgICB0aGlzLl9sYXllckNvbmZpZ3MgPSB7fTtcbiAgICAgICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMudXBkYXRlKGxheWVyQ29uZmlncywgW10pO1xuICAgIH1cblxuICAgIHVwZGF0ZShsYXllckNvbmZpZ3M6IEFycmF5PExheWVyU3BlY2lmaWNhdGlvbj4sIHJlbW92ZWRJZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllckNvbmZpZyBvZiBsYXllckNvbmZpZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2xheWVyQ29uZmlnc1tsYXllckNvbmZpZy5pZF0gPSBsYXllckNvbmZpZztcblxuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJDb25maWcuaWRdID0gY3JlYXRlU3R5bGVMYXllcihsYXllckNvbmZpZyk7XG4gICAgICAgICAgICBsYXllci5jb21waWxlRmlsdGVyKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5rZXlDYWNoZVtsYXllckNvbmZpZy5pZF0pXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMua2V5Q2FjaGVbbGF5ZXJDb25maWcuaWRdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgcmVtb3ZlZElkcykge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMua2V5Q2FjaGVbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyQ29uZmlnc1tpZF07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmFtaWxpZXNCeVNvdXJjZSA9IHt9O1xuXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IGdyb3VwQnlMYXlvdXQodmFsdWVzKHRoaXMuX2xheWVyQ29uZmlncyksIHRoaXMua2V5Q2FjaGUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJDb25maWdzIG9mIGdyb3Vwcykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJzID0gbGF5ZXJDb25maWdzLm1hcCgobGF5ZXJDb25maWcpID0+IHRoaXMuX2xheWVyc1tsYXllckNvbmZpZy5pZF0pO1xuXG4gICAgICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1swXTtcbiAgICAgICAgICAgIGlmIChsYXllci52aXNpYmlsaXR5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc291cmNlSWQgPSBsYXllci5zb3VyY2UgfHwgJyc7XG4gICAgICAgICAgICBsZXQgc291cmNlR3JvdXAgPSB0aGlzLmZhbWlsaWVzQnlTb3VyY2Vbc291cmNlSWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VHcm91cCkge1xuICAgICAgICAgICAgICAgIHNvdXJjZUdyb3VwID0gdGhpcy5mYW1pbGllc0J5U291cmNlW3NvdXJjZUlkXSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllcklkID0gbGF5ZXIuc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJztcbiAgICAgICAgICAgIGxldCBzb3VyY2VMYXllckZhbWlsaWVzID0gc291cmNlR3JvdXBbc291cmNlTGF5ZXJJZF07XG4gICAgICAgICAgICBpZiAoIXNvdXJjZUxheWVyRmFtaWxpZXMpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VMYXllckZhbWlsaWVzID0gc291cmNlR3JvdXBbc291cmNlTGF5ZXJJZF0gPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc291cmNlTGF5ZXJGYW1pbGllcy5wdXNoKGxheWVycyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0eWxlTGF5ZXJJbmRleDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBERU1EYXRhIGZyb20gJy4uL2RhdGEvZGVtX2RhdGEuanMnO1xuaW1wb3J0IHtSR0JBSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdy5qcyc7XG5cbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3IuanMnO1xuaW1wb3J0IHR5cGUge1dvcmtlckRFTVRpbGVQYXJhbWV0ZXJzLCBXb3JrZXJERU1UaWxlQ2FsbGJhY2t9IGZyb20gJy4vd29ya2VyX3NvdXJjZS5qcyc7XG5jb25zdCB7SW1hZ2VCaXRtYXB9ID0gd2luZG93O1xuXG5jbGFzcyBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlIHtcbiAgICBhY3RvcjogQWN0b3I7XG4gICAgb2Zmc2NyZWVuQ2FudmFzOiBPZmZzY3JlZW5DYW52YXM7XG4gICAgb2Zmc2NyZWVuQ2FudmFzQ29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gICAgbG9hZFRpbGUocGFyYW1zOiBXb3JrZXJERU1UaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlckRFTVRpbGVDYWxsYmFjaykge1xuICAgICAgICBjb25zdCB7dWlkLCBlbmNvZGluZywgcmF3SW1hZ2VEYXRhLCBwYWRkaW5nLCBidWlsZFF1YWRUcmVlfSA9IHBhcmFtcztcbiAgICAgICAgLy8gTWFpbiB0aHJlYWQgd2lsbCB0cmFuc2ZlciBJbWFnZUJpdG1hcCBpZiBvZmZzY3JlZW4gZGVjb2RlIHdpdGggT2Zmc2NyZWVuQ2FudmFzIGlzIHN1cHBvcnRlZCwgZWxzZSBpdCB3aWxsIHRyYW5zZmVyIGFuIGFscmVhZHkgZGVjb2RlZCBpbWFnZS5cbiAgICAgICAgY29uc3QgaW1hZ2VQaXhlbHMgPSAoSW1hZ2VCaXRtYXAgJiYgcmF3SW1hZ2VEYXRhIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApID8gdGhpcy5nZXRJbWFnZURhdGEocmF3SW1hZ2VEYXRhLCBwYWRkaW5nKSA6IHJhd0ltYWdlRGF0YTtcbiAgICAgICAgY29uc3QgZGVtID0gbmV3IERFTURhdGEodWlkLCBpbWFnZVBpeGVscywgZW5jb2RpbmcsIHBhZGRpbmcgPCAxLCBidWlsZFF1YWRUcmVlKTtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVtKTtcbiAgICB9XG5cbiAgICBnZXRJbWFnZURhdGEoaW1nQml0bWFwOiBJbWFnZUJpdG1hcCwgcGFkZGluZzogbnVtYmVyKTogUkdCQUltYWdlIHtcbiAgICAgICAgLy8gTGF6aWx5IGluaXRpYWxpemUgT2Zmc2NyZWVuQ2FudmFzXG4gICAgICAgIGlmICghdGhpcy5vZmZzY3JlZW5DYW52YXMgfHwgIXRoaXMub2Zmc2NyZWVuQ2FudmFzQ29udGV4dCkge1xuICAgICAgICAgICAgLy8gRGVtIHRpbGVzIGFyZSB0eXBpY2FsbHkgMjU2eDI1NlxuICAgICAgICAgICAgdGhpcy5vZmZzY3JlZW5DYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKGltZ0JpdG1hcC53aWR0aCwgaW1nQml0bWFwLmhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhc0NvbnRleHQgPSB0aGlzLm9mZnNjcmVlbkNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DYW52YXMud2lkdGggPSBpbWdCaXRtYXAud2lkdGg7XG4gICAgICAgIHRoaXMub2Zmc2NyZWVuQ2FudmFzLmhlaWdodCA9IGltZ0JpdG1hcC5oZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DYW52YXNDb250ZXh0LmRyYXdJbWFnZShpbWdCaXRtYXAsIDAsIDAsIGltZ0JpdG1hcC53aWR0aCwgaW1nQml0bWFwLmhlaWdodCk7XG4gICAgICAgIC8vIEluc2VydCBvciByZW1vdmUgZGVmaW5lZCBwYWRkaW5nIGFyb3VuZCB0aGUgaW1hZ2UgdG8gYWxsb3cgYmFja2ZpbGxpbmcgZm9yIG5laWdoYm9yaW5nIGRhdGEuXG4gICAgICAgIGNvbnN0IGltZ0RhdGEgPSB0aGlzLm9mZnNjcmVlbkNhbnZhc0NvbnRleHQuZ2V0SW1hZ2VEYXRhKC1wYWRkaW5nLCAtcGFkZGluZywgaW1nQml0bWFwLndpZHRoICsgMiAqIHBhZGRpbmcsIGltZ0JpdG1hcC5oZWlnaHQgKyAyICogcGFkZGluZyk7XG4gICAgICAgIHRoaXMub2Zmc2NyZWVuQ2FudmFzQ29udGV4dC5jbGVhclJlY3QoMCwgMCwgdGhpcy5vZmZzY3JlZW5DYW52YXMud2lkdGgsIHRoaXMub2Zmc2NyZWVuQ2FudmFzLmhlaWdodCk7XG4gICAgICAgIHJldHVybiBuZXcgUkdCQUltYWdlKHt3aWR0aDogaW1nRGF0YS53aWR0aCwgaGVpZ2h0OiBpbWdEYXRhLmhlaWdodH0sIGltZ0RhdGEuZGF0YSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlO1xuIiwiXG5tb2R1bGUuZXhwb3J0cyA9IHJld2luZDtcblxuZnVuY3Rpb24gcmV3aW5kKGdqLCBvdXRlcikge1xuICAgIHZhciB0eXBlID0gZ2ogJiYgZ2oudHlwZSwgaTtcblxuICAgIGlmICh0eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnai5mZWF0dXJlcy5sZW5ndGg7IGkrKykgcmV3aW5kKGdqLmZlYXR1cmVzW2ldLCBvdXRlcik7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnai5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSByZXdpbmQoZ2ouZ2VvbWV0cmllc1tpXSwgb3V0ZXIpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgcmV3aW5kKGdqLmdlb21ldHJ5LCBvdXRlcik7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICByZXdpbmRSaW5ncyhnai5jb29yZGluYXRlcywgb3V0ZXIpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2ouY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHJld2luZFJpbmdzKGdqLmNvb3JkaW5hdGVzW2ldLCBvdXRlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdqO1xufVxuXG5mdW5jdGlvbiByZXdpbmRSaW5ncyhyaW5ncywgb3V0ZXIpIHtcbiAgICBpZiAocmluZ3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICByZXdpbmRSaW5nKHJpbmdzWzBdLCBvdXRlcik7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXdpbmRSaW5nKHJpbmdzW2ldLCAhb3V0ZXIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmV3aW5kUmluZyhyaW5nLCBkaXIpIHtcbiAgICB2YXIgYXJlYSA9IDAsIGVyciA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMTsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICB2YXIgayA9IChyaW5nW2ldWzBdIC0gcmluZ1tqXVswXSkgKiAocmluZ1tqXVsxXSArIHJpbmdbaV1bMV0pO1xuICAgICAgICB2YXIgbSA9IGFyZWEgKyBrO1xuICAgICAgICBlcnIgKz0gTWF0aC5hYnMoYXJlYSkgPj0gTWF0aC5hYnMoaykgPyBhcmVhIC0gbSArIGsgOiBrIC0gbSArIGFyZWE7XG4gICAgICAgIGFyZWEgPSBtO1xuICAgIH1cbiAgICBpZiAoYXJlYSArIGVyciA+PSAwICE9PSAhIWRpcikgcmluZy5yZXZlcnNlKCk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmltcG9ydCBtdnQgZnJvbSAnQG1hcGJveC92ZWN0b3ItdGlsZSc7XG5jb25zdCB0b0dlb0pTT04gPSBtdnQuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTjtcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQuanMnO1xuXG4vLyBUaGUgZmVhdHVyZSB0eXBlIHVzZWQgYnkgZ2VvanNvbi12dCBhbmQgc3VwZXJjbHVzdGVyLiBTaG91bGQgYmUgZXh0cmFjdGVkIHRvXG4vLyBnbG9iYWwgdHlwZSBhbmQgdXNlZCBpbiBtb2R1bGUgZGVmaW5pdGlvbnMgZm9yIHRob3NlIHR3byBtb2R1bGVzLlxudHlwZSBGZWF0dXJlID0ge1xuICAgIHR5cGU6IDEsXG4gICAgaWQ6IG1peGVkLFxuICAgIHRhZ3M6IHtbXzogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbn0sXG4gICAgZ2VvbWV0cnk6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LFxufSB8IHtcbiAgICB0eXBlOiAyIHwgMyxcbiAgICBpZDogbWl4ZWQsXG4gICAgdGFnczoge1tfOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFufSxcbiAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8W251bWJlciwgbnVtYmVyXT4+LFxufVxuXG5jbGFzcyBGZWF0dXJlV3JhcHBlciBpbXBsZW1lbnRzIFZlY3RvclRpbGVGZWF0dXJlIHtcbiAgICBfZmVhdHVyZTogRmVhdHVyZTtcblxuICAgIGV4dGVudDogbnVtYmVyO1xuICAgIHR5cGU6IDEgfCAyIHwgMztcbiAgICBpZDogbnVtYmVyO1xuICAgIHByb3BlcnRpZXM6IHtbXzogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbn07XG5cbiAgICBjb25zdHJ1Y3RvcihmZWF0dXJlOiBGZWF0dXJlKSB7XG4gICAgICAgIHRoaXMuX2ZlYXR1cmUgPSBmZWF0dXJlO1xuXG4gICAgICAgIHRoaXMuZXh0ZW50ID0gRVhURU5UO1xuICAgICAgICB0aGlzLnR5cGUgPSBmZWF0dXJlLnR5cGU7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IGZlYXR1cmUudGFncztcblxuICAgICAgICAvLyBJZiB0aGUgZmVhdHVyZSBoYXMgYSB0b3AtbGV2ZWwgYGlkYCBwcm9wZXJ0eSwgY29weSBpdCBvdmVyLCBidXQgb25seVxuICAgICAgICAvLyBpZiBpdCBjYW4gYmUgY29lcmNlZCB0byBhbiBpbnRlZ2VyLCBiZWNhdXNlIHRoaXMgd3JhcHBlciBpcyB1c2VkIGZvclxuICAgICAgICAvLyBzZXJpYWxpemluZyBnZW9qc29uIGZlYXR1cmUgZGF0YSBpbnRvIHZlY3RvciB0aWxlIFBCRiBkYXRhLCBhbmQgdGhlXG4gICAgICAgIC8vIHZlY3RvciB0aWxlIHNwZWMgb25seSBzdXBwb3J0cyBpbnRlZ2VyIHZhbHVlcyBmb3IgZmVhdHVyZSBpZHMgLS1cbiAgICAgICAgLy8gYWxsb3dpbmcgbm9uLWludGVnZXIgdmFsdWVzIGhlcmUgcmVzdWx0cyBpbiBhIG5vbi1jb21wbGlhbnQgUEJGXG4gICAgICAgIC8vIHRoYXQgY2F1c2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGlzIHBhcnNlZCB3aXRoIHZlY3Rvci10aWxlLWpzXG4gICAgICAgIGlmICgnaWQnIGluIGZlYXR1cmUgJiYgIWlzTmFOKGZlYXR1cmUuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gcGFyc2VJbnQoZmVhdHVyZS5pZCwgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZEdlb21ldHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fZmVhdHVyZS50eXBlID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aGlzLl9mZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkucHVzaChbbmV3IFBvaW50KHBvaW50WzBdLCBwb2ludFsxXSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgdGhpcy5fZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChwb2ludFswXSwgcG9pbnRbMV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkucHVzaChuZXdSaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvR2VvSlNPTih4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0b0dlb0pTT04uY2FsbCh0aGlzLCB4LCB5LCB6KTtcbiAgICB9XG59XG5cbmNsYXNzIEdlb0pTT05XcmFwcGVyIGltcGxlbWVudHMgVmVjdG9yVGlsZSwgVmVjdG9yVGlsZUxheWVyIHtcbiAgICBsYXllcnM6IHtbXzogc3RyaW5nXTogVmVjdG9yVGlsZUxheWVyfTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZXh0ZW50OiBudW1iZXI7XG4gICAgbGVuZ3RoOiBudW1iZXI7XG4gICAgX2ZlYXR1cmVzOiBBcnJheTxGZWF0dXJlPjtcblxuICAgIGNvbnN0cnVjdG9yKGZlYXR1cmVzOiBBcnJheTxGZWF0dXJlPikge1xuICAgICAgICB0aGlzLmxheWVycyA9IHsnX2dlb2pzb25UaWxlTGF5ZXInOiB0aGlzfTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ19nZW9qc29uVGlsZUxheWVyJztcbiAgICAgICAgdGhpcy5leHRlbnQgPSBFWFRFTlQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLl9mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICAgIH1cblxuICAgIGZlYXR1cmUoaTogbnVtYmVyKTogVmVjdG9yVGlsZUZlYXR1cmUge1xuICAgICAgICByZXR1cm4gbmV3IEZlYXR1cmVXcmFwcGVyKHRoaXMuX2ZlYXR1cmVzW2ldKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlb0pTT05XcmFwcGVyO1xuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKVxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnQG1hcGJveC92ZWN0b3ItdGlsZScpLlZlY3RvclRpbGVGZWF0dXJlXG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTldyYXBwZXJcblxuLy8gY29uZm9ybSB0byB2ZWN0b3J0aWxlIGFwaVxuZnVuY3Rpb24gR2VvSlNPTldyYXBwZXIgKGZlYXR1cmVzLCBvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzXG4gIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoXG59XG5cbkdlb0pTT05XcmFwcGVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24gKGkpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlV3JhcHBlcih0aGlzLmZlYXR1cmVzW2ldLCB0aGlzLm9wdGlvbnMuZXh0ZW50KVxufVxuXG5mdW5jdGlvbiBGZWF0dXJlV3JhcHBlciAoZmVhdHVyZSwgZXh0ZW50KSB7XG4gIHRoaXMuaWQgPSB0eXBlb2YgZmVhdHVyZS5pZCA9PT0gJ251bWJlcicgPyBmZWF0dXJlLmlkIDogdW5kZWZpbmVkXG4gIHRoaXMudHlwZSA9IGZlYXR1cmUudHlwZVxuICB0aGlzLnJhd0dlb21ldHJ5ID0gZmVhdHVyZS50eXBlID09PSAxID8gW2ZlYXR1cmUuZ2VvbWV0cnldIDogZmVhdHVyZS5nZW9tZXRyeVxuICB0aGlzLnByb3BlcnRpZXMgPSBmZWF0dXJlLnRhZ3NcbiAgdGhpcy5leHRlbnQgPSBleHRlbnQgfHwgNDA5NlxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmluZ3MgPSB0aGlzLnJhd0dlb21ldHJ5XG4gIHRoaXMuZ2VvbWV0cnkgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG4gICAgdmFyIG5ld1JpbmcgPSBbXVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChyaW5nW2pdWzBdLCByaW5nW2pdWzFdKSlcbiAgICB9XG4gICAgdGhpcy5nZW9tZXRyeS5wdXNoKG5ld1JpbmcpXG4gIH1cbiAgcmV0dXJuIHRoaXMuZ2VvbWV0cnlcbn1cblxuRmVhdHVyZVdyYXBwZXIucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5nZW9tZXRyeSkgdGhpcy5sb2FkR2VvbWV0cnkoKVxuXG4gIHZhciByaW5ncyA9IHRoaXMuZ2VvbWV0cnlcbiAgdmFyIHgxID0gSW5maW5pdHlcbiAgdmFyIHgyID0gLUluZmluaXR5XG4gIHZhciB5MSA9IEluZmluaXR5XG4gIHZhciB5MiA9IC1JbmZpbml0eVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBjb29yZCA9IHJpbmdbal1cblxuICAgICAgeDEgPSBNYXRoLm1pbih4MSwgY29vcmQueClcbiAgICAgIHgyID0gTWF0aC5tYXgoeDIsIGNvb3JkLngpXG4gICAgICB5MSA9IE1hdGgubWluKHkxLCBjb29yZC55KVxuICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY29vcmQueSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXVxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUudG9HZW9KU09OID0gVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTlxuIiwidmFyIFBiZiA9IHJlcXVpcmUoJ3BiZicpXG52YXIgR2VvSlNPTldyYXBwZXIgPSByZXF1aXJlKCcuL2xpYi9nZW9qc29uX3dyYXBwZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZyb21WZWN0b3JUaWxlSnNcbm1vZHVsZS5leHBvcnRzLmZyb21WZWN0b3JUaWxlSnMgPSBmcm9tVmVjdG9yVGlsZUpzXG5tb2R1bGUuZXhwb3J0cy5mcm9tR2VvanNvblZ0ID0gZnJvbUdlb2pzb25WdFxubW9kdWxlLmV4cG9ydHMuR2VvSlNPTldyYXBwZXIgPSBHZW9KU09OV3JhcHBlclxuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIHZlY3Rvci10aWxlLWpzLWNyZWF0ZWQgdGlsZSB0byBwYmZcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGlsZVxuICogQHJldHVybiB7QnVmZmVyfSB1bmNvbXByZXNzZWQsIHBiZi1zZXJpYWxpemVkIHRpbGUgZGF0YVxuICovXG5mdW5jdGlvbiBmcm9tVmVjdG9yVGlsZUpzICh0aWxlKSB7XG4gIHZhciBvdXQgPSBuZXcgUGJmKClcbiAgd3JpdGVUaWxlKHRpbGUsIG91dClcbiAgcmV0dXJuIG91dC5maW5pc2goKVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZWQgYSBnZW9qc29uLXZ0LWNyZWF0ZWQgdGlsZSB0byBwYmYuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGxheWVycyAtIEFuIG9iamVjdCBtYXBwaW5nIGxheWVyIG5hbWVzIHRvIGdlb2pzb24tdnQtY3JlYXRlZCB2ZWN0b3IgdGlsZSBvYmplY3RzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIHZlY3Rvci10aWxlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBhbmQgZXh0ZW50IHRoYXQgd2VyZSB1c2VkIHRvIGNyZWF0ZSBgbGF5ZXJzYC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52ZXJzaW9uPTFdIC0gVmVyc2lvbiBvZiB2ZWN0b3ItdGlsZSBzcGVjIHVzZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5leHRlbnQ9NDA5Nl0gLSBFeHRlbnQgb2YgdGhlIHZlY3RvciB0aWxlXG4gKiBAcmV0dXJuIHtCdWZmZXJ9IHVuY29tcHJlc3NlZCwgcGJmLXNlcmlhbGl6ZWQgdGlsZSBkYXRhXG4gKi9cbmZ1bmN0aW9uIGZyb21HZW9qc29uVnQgKGxheWVycywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgbCA9IHt9XG4gIGZvciAodmFyIGsgaW4gbGF5ZXJzKSB7XG4gICAgbFtrXSA9IG5ldyBHZW9KU09OV3JhcHBlcihsYXllcnNba10uZmVhdHVyZXMsIG9wdGlvbnMpXG4gICAgbFtrXS5uYW1lID0ga1xuICAgIGxba10udmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvblxuICAgIGxba10uZXh0ZW50ID0gb3B0aW9ucy5leHRlbnRcbiAgfVxuICByZXR1cm4gZnJvbVZlY3RvclRpbGVKcyh7IGxheWVyczogbCB9KVxufVxuXG5mdW5jdGlvbiB3cml0ZVRpbGUgKHRpbGUsIHBiZikge1xuICBmb3IgKHZhciBrZXkgaW4gdGlsZS5sYXllcnMpIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDMsIHdyaXRlTGF5ZXIsIHRpbGUubGF5ZXJzW2tleV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVMYXllciAobGF5ZXIsIHBiZikge1xuICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxNSwgbGF5ZXIudmVyc2lvbiB8fCAxKVxuICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCBsYXllci5uYW1lIHx8ICcnKVxuICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCBsYXllci5leHRlbnQgfHwgNDA5NilcblxuICB2YXIgaVxuICB2YXIgY29udGV4dCA9IHtcbiAgICBrZXlzOiBbXSxcbiAgICB2YWx1ZXM6IFtdLFxuICAgIGtleWNhY2hlOiB7fSxcbiAgICB2YWx1ZWNhY2hlOiB7fVxuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29udGV4dC5mZWF0dXJlID0gbGF5ZXIuZmVhdHVyZShpKVxuICAgIHBiZi53cml0ZU1lc3NhZ2UoMiwgd3JpdGVGZWF0dXJlLCBjb250ZXh0KVxuICB9XG5cbiAgdmFyIGtleXMgPSBjb250ZXh0LmtleXNcbiAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgzLCBrZXlzW2ldKVxuICB9XG5cbiAgdmFyIHZhbHVlcyA9IGNvbnRleHQudmFsdWVzXG4gIGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDQsIHdyaXRlVmFsdWUsIHZhbHVlc1tpXSlcbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUZlYXR1cmUgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuXG4gIGlmIChmZWF0dXJlLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxLCBmZWF0dXJlLmlkKVxuICB9XG5cbiAgcGJmLndyaXRlTWVzc2FnZSgyLCB3cml0ZVByb3BlcnRpZXMsIGNvbnRleHQpXG4gIHBiZi53cml0ZVZhcmludEZpZWxkKDMsIGZlYXR1cmUudHlwZSlcbiAgcGJmLndyaXRlTWVzc2FnZSg0LCB3cml0ZUdlb21ldHJ5LCBmZWF0dXJlKVxufVxuXG5mdW5jdGlvbiB3cml0ZVByb3BlcnRpZXMgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuICB2YXIga2V5cyA9IGNvbnRleHQua2V5c1xuICB2YXIgdmFsdWVzID0gY29udGV4dC52YWx1ZXNcbiAgdmFyIGtleWNhY2hlID0gY29udGV4dC5rZXljYWNoZVxuICB2YXIgdmFsdWVjYWNoZSA9IGNvbnRleHQudmFsdWVjYWNoZVxuXG4gIGZvciAodmFyIGtleSBpbiBmZWF0dXJlLnByb3BlcnRpZXMpIHtcbiAgICB2YXIgdmFsdWUgPSBmZWF0dXJlLnByb3BlcnRpZXNba2V5XVxuXG4gICAgdmFyIGtleUluZGV4ID0ga2V5Y2FjaGVba2V5XVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgY29udGludWUgLy8gZG9uJ3QgZW5jb2RlIG51bGwgdmFsdWUgcHJvcGVydGllc1xuXG4gICAgaWYgKHR5cGVvZiBrZXlJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGtleXMucHVzaChrZXkpXG4gICAgICBrZXlJbmRleCA9IGtleXMubGVuZ3RoIC0gMVxuICAgICAga2V5Y2FjaGVba2V5XSA9IGtleUluZGV4XG4gICAgfVxuICAgIHBiZi53cml0ZVZhcmludChrZXlJbmRleClcblxuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdib29sZWFuJyAmJiB0eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgICB9XG4gICAgdmFyIHZhbHVlS2V5ID0gdHlwZSArICc6JyArIHZhbHVlXG4gICAgdmFyIHZhbHVlSW5kZXggPSB2YWx1ZWNhY2hlW3ZhbHVlS2V5XVxuICAgIGlmICh0eXBlb2YgdmFsdWVJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKVxuICAgICAgdmFsdWVJbmRleCA9IHZhbHVlcy5sZW5ndGggLSAxXG4gICAgICB2YWx1ZWNhY2hlW3ZhbHVlS2V5XSA9IHZhbHVlSW5kZXhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KHZhbHVlSW5kZXgpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWFuZCAoY21kLCBsZW5ndGgpIHtcbiAgcmV0dXJuIChsZW5ndGggPDwgMykgKyAoY21kICYgMHg3KVxufVxuXG5mdW5jdGlvbiB6aWd6YWcgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAxKSBeIChudW0gPj4gMzEpXG59XG5cbmZ1bmN0aW9uIHdyaXRlR2VvbWV0cnkgKGZlYXR1cmUsIHBiZikge1xuICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmxvYWRHZW9tZXRyeSgpXG4gIHZhciB0eXBlID0gZmVhdHVyZS50eXBlXG4gIHZhciB4ID0gMFxuICB2YXIgeSA9IDBcbiAgdmFyIHJpbmdzID0gZ2VvbWV0cnkubGVuZ3RoXG4gIGZvciAodmFyIHIgPSAwOyByIDwgcmluZ3M7IHIrKykge1xuICAgIHZhciByaW5nID0gZ2VvbWV0cnlbcl1cbiAgICB2YXIgY291bnQgPSAxXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgIGNvdW50ID0gcmluZy5sZW5ndGhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMSwgY291bnQpKSAvLyBtb3ZldG9cbiAgICAvLyBkbyBub3Qgd3JpdGUgcG9seWdvbiBjbG9zaW5nIHBhdGggYXMgbGluZXRvXG4gICAgdmFyIGxpbmVDb3VudCA9IHR5cGUgPT09IDMgPyByaW5nLmxlbmd0aCAtIDEgOiByaW5nLmxlbmd0aFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHtcbiAgICAgIGlmIChpID09PSAxICYmIHR5cGUgIT09IDEpIHtcbiAgICAgICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMiwgbGluZUNvdW50IC0gMSkpIC8vIGxpbmV0b1xuICAgICAgfVxuICAgICAgdmFyIGR4ID0gcmluZ1tpXS54IC0geFxuICAgICAgdmFyIGR5ID0gcmluZ1tpXS55IC0geVxuICAgICAgcGJmLndyaXRlVmFyaW50KHppZ3phZyhkeCkpXG4gICAgICBwYmYud3JpdGVWYXJpbnQoemlnemFnKGR5KSlcbiAgICAgIHggKz0gZHhcbiAgICAgIHkgKz0gZHlcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IDMpIHtcbiAgICAgIHBiZi53cml0ZVZhcmludChjb21tYW5kKDcsIDEpKSAvLyBjbG9zZXBhdGhcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVWYWx1ZSAodmFsdWUsIHBiZikge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZVxuICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCB2YWx1ZSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICBwYmYud3JpdGVCb29sZWFuRmllbGQoNywgdmFsdWUpXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodmFsdWUgJSAxICE9PSAwKSB7XG4gICAgICBwYmYud3JpdGVEb3VibGVGaWVsZCgzLCB2YWx1ZSlcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgcGJmLndyaXRlU1ZhcmludEZpZWxkKDYsIHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgcmlnaHQsIGRlcHRoKSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA8PSBub2RlU2l6ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbSA9IChsZWZ0ICsgcmlnaHQpID4+IDE7XG5cbiAgICBzZWxlY3QoaWRzLCBjb29yZHMsIG0sIGxlZnQsIHJpZ2h0LCBkZXB0aCAlIDIpO1xuXG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgbSAtIDEsIGRlcHRoICsgMSk7XG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbSArIDEsIHJpZ2h0LCBkZXB0aCArIDEpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3QoaWRzLCBjb29yZHMsIGssIGxlZnQsIHJpZ2h0LCBpbmMpIHtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICAgICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICAgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHNlbGVjdChpZHMsIGNvb3JkcywgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGluYyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ID0gY29vcmRzWzIgKiBrICsgaW5jXTtcbiAgICAgICAgbGV0IGkgPSBsZWZ0O1xuICAgICAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvb3Jkc1syICogcmlnaHQgKyBpbmNdID4gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIHJpZ2h0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb29yZHNbMiAqIGkgKyBpbmNdIDwgdCkgaSsrO1xuICAgICAgICAgICAgd2hpbGUgKGNvb3Jkc1syICogaiArIGluY10gPiB0KSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29vcmRzWzIgKiBsZWZ0ICsgaW5jXSA9PT0gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIGopO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBqLCByaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwSXRlbShpZHMsIGNvb3JkcywgaSwgaikge1xuICAgIHN3YXAoaWRzLCBpLCBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGksIDIgKiBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGkgKyAxLCAyICogaiArIDEpO1xufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIGNvbnN0IHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShpZHMsIGNvb3JkcywgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgbm9kZVNpemUpIHtcbiAgICBjb25zdCBzdGFjayA9IFswLCBpZHMubGVuZ3RoIC0gMSwgMF07XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IHgsIHk7XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGF4aXMgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPD0gbm9kZVNpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZWZ0OyBpIDw9IHJpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgICAgICB4ID0gY29vcmRzWzIgKiBpXTtcbiAgICAgICAgICAgICAgICB5ID0gY29vcmRzWzIgKiBpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKHggPj0gbWluWCAmJiB4IDw9IG1heFggJiYgeSA+PSBtaW5ZICYmIHkgPD0gbWF4WSkgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmICh4ID49IG1pblggJiYgeCA8PSBtYXhYICYmIHkgPj0gbWluWSAmJiB5IDw9IG1heFkpIHJlc3VsdC5wdXNoKGlkc1ttXSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEF4aXMgPSAoYXhpcyArIDEpICUgMjtcblxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IG1pblggPD0geCA6IG1pblkgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBtYXhYID49IHggOiBtYXhZID49IHkpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSArIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChyaWdodCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdpdGhpbihpZHMsIGNvb3JkcywgcXgsIHF5LCByLCBub2RlU2l6ZSkge1xuICAgIGNvbnN0IHN0YWNrID0gWzAsIGlkcy5sZW5ndGggLSAxLCAwXTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCByMiA9IHIgKiByO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBheGlzID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDw9IG5vZGVTaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNxRGlzdChjb29yZHNbMiAqIGldLCBjb29yZHNbMiAqIGkgKyAxXSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICBjb25zdCB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgY29uc3QgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmIChzcURpc3QoeCwgeSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW21dKTtcblxuICAgICAgICBjb25zdCBuZXh0QXhpcyA9IChheGlzICsgMSkgJSAyO1xuXG4gICAgICAgIGlmIChheGlzID09PSAwID8gcXggLSByIDw9IHggOiBxeSAtIHIgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBxeCArIHIgPj0geCA6IHF5ICsgciA+PSB5KSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG0gKyAxKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gocmlnaHQpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzcURpc3QoYXgsIGF5LCBieCwgYnkpIHtcbiAgICBjb25zdCBkeCA9IGF4IC0gYng7XG4gICAgY29uc3QgZHkgPSBheSAtIGJ5O1xuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cbiIsIlxuaW1wb3J0IHNvcnQgZnJvbSAnLi9zb3J0JztcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcbmltcG9ydCB3aXRoaW4gZnJvbSAnLi93aXRoaW4nO1xuXG5jb25zdCBkZWZhdWx0R2V0WCA9IHAgPT4gcFswXTtcbmNvbnN0IGRlZmF1bHRHZXRZID0gcCA9PiBwWzFdO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBLREJ1c2gge1xuICAgIGNvbnN0cnVjdG9yKHBvaW50cywgZ2V0WCA9IGRlZmF1bHRHZXRYLCBnZXRZID0gZGVmYXVsdEdldFksIG5vZGVTaXplID0gNjQsIEFycmF5VHlwZSA9IEZsb2F0NjRBcnJheSkge1xuICAgICAgICB0aGlzLm5vZGVTaXplID0gbm9kZVNpemU7XG4gICAgICAgIHRoaXMucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgICAgIGNvbnN0IEluZGV4QXJyYXlUeXBlID0gcG9pbnRzLmxlbmd0aCA8IDY1NTM2ID8gVWludDE2QXJyYXkgOiBVaW50MzJBcnJheTtcblxuICAgICAgICBjb25zdCBpZHMgPSB0aGlzLmlkcyA9IG5ldyBJbmRleEFycmF5VHlwZShwb2ludHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHMgPSBuZXcgQXJyYXlUeXBlKHBvaW50cy5sZW5ndGggKiAyKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWRzW2ldID0gaTtcbiAgICAgICAgICAgIGNvb3Jkc1syICogaV0gPSBnZXRYKHBvaW50c1tpXSk7XG4gICAgICAgICAgICBjb29yZHNbMiAqIGkgKyAxXSA9IGdldFkocG9pbnRzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvcnQoaWRzLCBjb29yZHMsIG5vZGVTaXplLCAwLCBpZHMubGVuZ3RoIC0gMSwgMCk7XG4gICAgfVxuXG4gICAgcmFuZ2UobWluWCwgbWluWSwgbWF4WCwgbWF4WSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UodGhpcy5pZHMsIHRoaXMuY29vcmRzLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB0aGlzLm5vZGVTaXplKTtcbiAgICB9XG5cbiAgICB3aXRoaW4oeCwgeSwgcikge1xuICAgICAgICByZXR1cm4gd2l0aGluKHRoaXMuaWRzLCB0aGlzLmNvb3JkcywgeCwgeSwgciwgdGhpcy5ub2RlU2l6ZSk7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgS0RCdXNoIGZyb20gJ2tkYnVzaCc7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIG1pblpvb206IDAsICAgLy8gbWluIHpvb20gdG8gZ2VuZXJhdGUgY2x1c3RlcnMgb25cbiAgICBtYXhab29tOiAxNiwgIC8vIG1heCB6b29tIGxldmVsIHRvIGNsdXN0ZXIgdGhlIHBvaW50cyBvblxuICAgIG1pblBvaW50czogMiwgLy8gbWluaW11bSBwb2ludHMgdG8gZm9ybSBhIGNsdXN0ZXJcbiAgICByYWRpdXM6IDQwLCAgIC8vIGNsdXN0ZXIgcmFkaXVzIGluIHBpeGVsc1xuICAgIGV4dGVudDogNTEyLCAgLy8gdGlsZSBleHRlbnQgKHJhZGl1cyBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIGl0KVxuICAgIG5vZGVTaXplOiA2NCwgLy8gc2l6ZSBvZiB0aGUgS0QtdHJlZSBsZWFmIG5vZGUsIGFmZmVjdHMgcGVyZm9ybWFuY2VcbiAgICBsb2c6IGZhbHNlLCAgIC8vIHdoZXRoZXIgdG8gbG9nIHRpbWluZyBpbmZvXG5cbiAgICAvLyB3aGV0aGVyIHRvIGdlbmVyYXRlIG51bWVyaWMgaWRzIGZvciBpbnB1dCBmZWF0dXJlcyAoaW4gdmVjdG9yIHRpbGVzKVxuICAgIGdlbmVyYXRlSWQ6IGZhbHNlLFxuXG4gICAgLy8gYSByZWR1Y2UgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIGN1c3RvbSBjbHVzdGVyIHByb3BlcnRpZXNcbiAgICByZWR1Y2U6IG51bGwsIC8vIChhY2N1bXVsYXRlZCwgcHJvcHMpID0+IHsgYWNjdW11bGF0ZWQuc3VtICs9IHByb3BzLnN1bTsgfVxuXG4gICAgLy8gcHJvcGVydGllcyB0byB1c2UgZm9yIGluZGl2aWR1YWwgcG9pbnRzIHdoZW4gcnVubmluZyB0aGUgcmVkdWNlclxuICAgIG1hcDogcHJvcHMgPT4gcHJvcHMgLy8gcHJvcHMgPT4gKHtzdW06IHByb3BzLm15X3ZhbHVlfSlcbn07XG5cbmNvbnN0IGZyb3VuZCA9IE1hdGguZnJvdW5kIHx8ICh0bXAgPT4gKCh4KSA9PiB7IHRtcFswXSA9ICt4OyByZXR1cm4gdG1wWzBdOyB9KSkobmV3IEZsb2F0MzJBcnJheSgxKSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1cGVyY2x1c3RlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZShkZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnRyZWVzID0gbmV3IEFycmF5KHRoaXMub3B0aW9ucy5tYXhab29tICsgMSk7XG4gICAgfVxuXG4gICAgbG9hZChwb2ludHMpIHtcbiAgICAgICAgY29uc3Qge2xvZywgbWluWm9vbSwgbWF4Wm9vbSwgbm9kZVNpemV9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIGlmIChsb2cpIGNvbnNvbGUudGltZSgndG90YWwgdGltZScpO1xuXG4gICAgICAgIGNvbnN0IHRpbWVySWQgPSBgcHJlcGFyZSAkeyAgcG9pbnRzLmxlbmd0aCAgfSBwb2ludHNgO1xuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWUodGltZXJJZCk7XG5cbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG5cbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBjbHVzdGVyIG9iamVjdCBmb3IgZWFjaCBwb2ludCBhbmQgaW5kZXggaW5wdXQgcG9pbnRzIGludG8gYSBLRC10cmVlXG4gICAgICAgIGxldCBjbHVzdGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFwb2ludHNbaV0uZ2VvbWV0cnkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2x1c3RlcnMucHVzaChjcmVhdGVQb2ludENsdXN0ZXIocG9pbnRzW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmVlc1ttYXhab29tICsgMV0gPSBuZXcgS0RCdXNoKGNsdXN0ZXJzLCBnZXRYLCBnZXRZLCBub2RlU2l6ZSwgRmxvYXQzMkFycmF5KTtcblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQodGltZXJJZCk7XG5cbiAgICAgICAgLy8gY2x1c3RlciBwb2ludHMgb24gbWF4IHpvb20sIHRoZW4gY2x1c3RlciB0aGUgcmVzdWx0cyBvbiBwcmV2aW91cyB6b29tLCBldGMuO1xuICAgICAgICAvLyByZXN1bHRzIGluIGEgY2x1c3RlciBoaWVyYXJjaHkgYWNyb3NzIHpvb20gbGV2ZWxzXG4gICAgICAgIGZvciAobGV0IHogPSBtYXhab29tOyB6ID49IG1pblpvb207IHotLSkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gK0RhdGUubm93KCk7XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBzZXQgb2YgY2x1c3RlcnMgZm9yIHRoZSB6b29tIGFuZCBpbmRleCB0aGVtIHdpdGggYSBLRC10cmVlXG4gICAgICAgICAgICBjbHVzdGVycyA9IHRoaXMuX2NsdXN0ZXIoY2x1c3RlcnMsIHopO1xuICAgICAgICAgICAgdGhpcy50cmVlc1t6XSA9IG5ldyBLREJ1c2goY2x1c3RlcnMsIGdldFgsIGdldFksIG5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xuXG4gICAgICAgICAgICBpZiAobG9nKSBjb25zb2xlLmxvZygneiVkOiAlZCBjbHVzdGVycyBpbiAlZG1zJywgeiwgY2x1c3RlcnMubGVuZ3RoLCArRGF0ZS5ub3coKSAtIG5vdyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQoJ3RvdGFsIHRpbWUnKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXRDbHVzdGVycyhiYm94LCB6b29tKSB7XG4gICAgICAgIGxldCBtaW5MbmcgPSAoKGJib3hbMF0gKyAxODApICUgMzYwICsgMzYwKSAlIDM2MCAtIDE4MDtcbiAgICAgICAgY29uc3QgbWluTGF0ID0gTWF0aC5tYXgoLTkwLCBNYXRoLm1pbig5MCwgYmJveFsxXSkpO1xuICAgICAgICBsZXQgbWF4TG5nID0gYmJveFsyXSA9PT0gMTgwID8gMTgwIDogKChiYm94WzJdICsgMTgwKSAlIDM2MCArIDM2MCkgJSAzNjAgLSAxODA7XG4gICAgICAgIGNvbnN0IG1heExhdCA9IE1hdGgubWF4KC05MCwgTWF0aC5taW4oOTAsIGJib3hbM10pKTtcblxuICAgICAgICBpZiAoYmJveFsyXSAtIGJib3hbMF0gPj0gMzYwKSB7XG4gICAgICAgICAgICBtaW5MbmcgPSAtMTgwO1xuICAgICAgICAgICAgbWF4TG5nID0gMTgwO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbkxuZyA+IG1heExuZykge1xuICAgICAgICAgICAgY29uc3QgZWFzdGVybkhlbSA9IHRoaXMuZ2V0Q2x1c3RlcnMoW21pbkxuZywgbWluTGF0LCAxODAsIG1heExhdF0sIHpvb20pO1xuICAgICAgICAgICAgY29uc3Qgd2VzdGVybkhlbSA9IHRoaXMuZ2V0Q2x1c3RlcnMoWy0xODAsIG1pbkxhdCwgbWF4TG5nLCBtYXhMYXRdLCB6b29tKTtcbiAgICAgICAgICAgIHJldHVybiBlYXN0ZXJuSGVtLmNvbmNhdCh3ZXN0ZXJuSGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnRyZWVzW3RoaXMuX2xpbWl0Wm9vbSh6b29tKV07XG4gICAgICAgIGNvbnN0IGlkcyA9IHRyZWUucmFuZ2UobG5nWChtaW5MbmcpLCBsYXRZKG1heExhdCksIGxuZ1gobWF4TG5nKSwgbGF0WShtaW5MYXQpKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSB0cmVlLnBvaW50c1tpZF07XG4gICAgICAgICAgICBjbHVzdGVycy5wdXNoKGMubnVtUG9pbnRzID8gZ2V0Q2x1c3RlckpTT04oYykgOiB0aGlzLnBvaW50c1tjLmluZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJzO1xuICAgIH1cblxuICAgIGdldENoaWxkcmVuKGNsdXN0ZXJJZCkge1xuICAgICAgICBjb25zdCBvcmlnaW5JZCA9IHRoaXMuX2dldE9yaWdpbklkKGNsdXN0ZXJJZCk7XG4gICAgICAgIGNvbnN0IG9yaWdpblpvb20gPSB0aGlzLl9nZXRPcmlnaW5ab29tKGNsdXN0ZXJJZCk7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gJ05vIGNsdXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLic7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRyZWVzW29yaWdpblpvb21dO1xuICAgICAgICBpZiAoIWluZGV4KSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IGluZGV4LnBvaW50c1tvcmlnaW5JZF07XG4gICAgICAgIGlmICghb3JpZ2luKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuXG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLm9wdGlvbnMucmFkaXVzIC8gKHRoaXMub3B0aW9ucy5leHRlbnQgKiBNYXRoLnBvdygyLCBvcmlnaW5ab29tIC0gMSkpO1xuICAgICAgICBjb25zdCBpZHMgPSBpbmRleC53aXRoaW4ob3JpZ2luLngsIG9yaWdpbi55LCByKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBpbmRleC5wb2ludHNbaWRdO1xuICAgICAgICAgICAgaWYgKGMucGFyZW50SWQgPT09IGNsdXN0ZXJJZCkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYy5udW1Qb2ludHMgPyBnZXRDbHVzdGVySlNPTihjKSA6IHRoaXMucG9pbnRzW2MuaW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cblxuICAgIGdldExlYXZlcyhjbHVzdGVySWQsIGxpbWl0LCBvZmZzZXQpIHtcbiAgICAgICAgbGltaXQgPSBsaW1pdCB8fCAxMDtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICAgICAgY29uc3QgbGVhdmVzID0gW107XG4gICAgICAgIHRoaXMuX2FwcGVuZExlYXZlcyhsZWF2ZXMsIGNsdXN0ZXJJZCwgbGltaXQsIG9mZnNldCwgMCk7XG5cbiAgICAgICAgcmV0dXJuIGxlYXZlcztcbiAgICB9XG5cbiAgICBnZXRUaWxlKHosIHgsIHkpIHtcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKHopXTtcbiAgICAgICAgY29uc3QgejIgPSBNYXRoLnBvdygyLCB6KTtcbiAgICAgICAgY29uc3Qge2V4dGVudCwgcmFkaXVzfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgcCA9IHJhZGl1cyAvIGV4dGVudDtcbiAgICAgICAgY29uc3QgdG9wID0gKHkgLSBwKSAvIHoyO1xuICAgICAgICBjb25zdCBib3R0b20gPSAoeSArIDEgKyBwKSAvIHoyO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSB7XG4gICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9hZGRUaWxlRmVhdHVyZXMoXG4gICAgICAgICAgICB0cmVlLnJhbmdlKCh4IC0gcCkgLyB6MiwgdG9wLCAoeCArIDEgKyBwKSAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgdHJlZS5wb2ludHMsIHgsIHksIHoyLCB0aWxlKTtcblxuICAgICAgICBpZiAoeCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWRkVGlsZUZlYXR1cmVzKFxuICAgICAgICAgICAgICAgIHRyZWUucmFuZ2UoMSAtIHAgLyB6MiwgdG9wLCAxLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCB6MiwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4ID09PSB6MiAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICB0cmVlLnJhbmdlKDAsIHRvcCwgcCAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCAtMSwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGUuZmVhdHVyZXMubGVuZ3RoID8gdGlsZSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20oY2x1c3RlcklkKSB7XG4gICAgICAgIGxldCBleHBhbnNpb25ab29tID0gdGhpcy5fZ2V0T3JpZ2luWm9vbShjbHVzdGVySWQpIC0gMTtcbiAgICAgICAgd2hpbGUgKGV4cGFuc2lvblpvb20gPD0gdGhpcy5vcHRpb25zLm1heFpvb20pIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihjbHVzdGVySWQpO1xuICAgICAgICAgICAgZXhwYW5zaW9uWm9vbSsrO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCAhPT0gMSkgYnJlYWs7XG4gICAgICAgICAgICBjbHVzdGVySWQgPSBjaGlsZHJlblswXS5wcm9wZXJ0aWVzLmNsdXN0ZXJfaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4cGFuc2lvblpvb207XG4gICAgfVxuXG4gICAgX2FwcGVuZExlYXZlcyhyZXN1bHQsIGNsdXN0ZXJJZCwgbGltaXQsIG9mZnNldCwgc2tpcHBlZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oY2x1c3RlcklkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGNoaWxkLnByb3BlcnRpZXM7XG5cbiAgICAgICAgICAgIGlmIChwcm9wcyAmJiBwcm9wcy5jbHVzdGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQgKyBwcm9wcy5wb2ludF9jb3VudCA8PSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgd2hvbGUgY2x1c3RlclxuICAgICAgICAgICAgICAgICAgICBza2lwcGVkICs9IHByb3BzLnBvaW50X2NvdW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVudGVyIHRoZSBjbHVzdGVyXG4gICAgICAgICAgICAgICAgICAgIHNraXBwZWQgPSB0aGlzLl9hcHBlbmRMZWF2ZXMocmVzdWx0LCBwcm9wcy5jbHVzdGVyX2lkLCBsaW1pdCwgb2Zmc2V0LCBza2lwcGVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpdCB0aGUgY2x1c3RlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2tpcHBlZCA8IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgYSBzaW5nbGUgcG9pbnRcbiAgICAgICAgICAgICAgICBza2lwcGVkKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGFkZCBhIHNpbmdsZSBwb2ludFxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSBsaW1pdCkgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2tpcHBlZDtcbiAgICB9XG5cbiAgICBfYWRkVGlsZUZlYXR1cmVzKGlkcywgcG9pbnRzLCB4LCB5LCB6MiwgdGlsZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaWRzKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgaXNDbHVzdGVyID0gYy5udW1Qb2ludHM7XG5cbiAgICAgICAgICAgIGxldCB0YWdzLCBweCwgcHk7XG4gICAgICAgICAgICBpZiAoaXNDbHVzdGVyKSB7XG4gICAgICAgICAgICAgICAgdGFncyA9IGdldENsdXN0ZXJQcm9wZXJ0aWVzKGMpO1xuICAgICAgICAgICAgICAgIHB4ID0gYy54O1xuICAgICAgICAgICAgICAgIHB5ID0gYy55O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gdGhpcy5wb2ludHNbYy5pbmRleF07XG4gICAgICAgICAgICAgICAgdGFncyA9IHAucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICBweCA9IGxuZ1gocC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSk7XG4gICAgICAgICAgICAgICAgcHkgPSBsYXRZKHAuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IFtbXG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCAqIChweCAqIHoyIC0geCkpLFxuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHRoaXMub3B0aW9ucy5leHRlbnQgKiAocHkgKiB6MiAtIHkpKVxuICAgICAgICAgICAgICAgIF1dLFxuICAgICAgICAgICAgICAgIHRhZ3NcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIGFzc2lnbiBpZFxuICAgICAgICAgICAgbGV0IGlkO1xuICAgICAgICAgICAgaWYgKGlzQ2x1c3Rlcikge1xuICAgICAgICAgICAgICAgIGlkID0gYy5pZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmdlbmVyYXRlSWQpIHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25hbGx5IGdlbmVyYXRlIGlkXG4gICAgICAgICAgICAgICAgaWQgPSBjLmluZGV4O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBvaW50c1tjLmluZGV4XS5pZCkge1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgaWQgaWYgYWxyZWFkeSBhc3NpZ25lZFxuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5wb2ludHNbYy5pbmRleF0uaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSBmLmlkID0gaWQ7XG5cbiAgICAgICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaChmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9saW1pdFpvb20oeikge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5vcHRpb25zLm1pblpvb20sIE1hdGgubWluKCt6LCB0aGlzLm9wdGlvbnMubWF4Wm9vbSArIDEpKTtcbiAgICB9XG5cbiAgICBfY2x1c3Rlcihwb2ludHMsIHpvb20pIHtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgY29uc3Qge3JhZGl1cywgZXh0ZW50LCByZWR1Y2UsIG1pblBvaW50c30gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHIgPSByYWRpdXMgLyAoZXh0ZW50ICogTWF0aC5wb3coMiwgem9vbSkpO1xuXG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBlYWNoIHBvaW50XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSB2aXNpdGVkIHRoZSBwb2ludCBhdCB0aGlzIHpvb20gbGV2ZWwsIHNraXAgaXRcbiAgICAgICAgICAgIGlmIChwLnpvb20gPD0gem9vbSkgY29udGludWU7XG4gICAgICAgICAgICBwLnpvb20gPSB6b29tO1xuXG4gICAgICAgICAgICAvLyBmaW5kIGFsbCBuZWFyYnkgcG9pbnRzXG4gICAgICAgICAgICBjb25zdCB0cmVlID0gdGhpcy50cmVlc1t6b29tICsgMV07XG4gICAgICAgICAgICBjb25zdCBuZWlnaGJvcklkcyA9IHRyZWUud2l0aGluKHAueCwgcC55LCByKTtcblxuICAgICAgICAgICAgY29uc3QgbnVtUG9pbnRzT3JpZ2luID0gcC5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgIGxldCBudW1Qb2ludHMgPSBudW1Qb2ludHNPcmlnaW47XG5cbiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcG9pbnRzIGluIGEgcG90ZW50aWFsIGNsdXN0ZXJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmVpZ2hib3JJZCBvZiBuZWlnaGJvcklkcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IG5laWdoYm9ycyB0aGF0IGFyZSBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgICAgICAgICAgIGlmIChiLnpvb20gPiB6b29tKSBudW1Qb2ludHMgKz0gYi5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2VyZSBuZWlnaGJvcnMgdG8gbWVyZ2UsIGFuZCB0aGVyZSBhcmUgZW5vdWdoIHBvaW50cyB0byBmb3JtIGEgY2x1c3RlclxuICAgICAgICAgICAgaWYgKG51bVBvaW50cyA+IG51bVBvaW50c09yaWdpbiAmJiBudW1Qb2ludHMgPj0gbWluUG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHd4ID0gcC54ICogbnVtUG9pbnRzT3JpZ2luO1xuICAgICAgICAgICAgICAgIGxldCB3eSA9IHAueSAqIG51bVBvaW50c09yaWdpbjtcblxuICAgICAgICAgICAgICAgIGxldCBjbHVzdGVyUHJvcGVydGllcyA9IHJlZHVjZSAmJiBudW1Qb2ludHNPcmlnaW4gPiAxID8gdGhpcy5fbWFwKHAsIHRydWUpIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIGVuY29kZSBib3RoIHpvb20gYW5kIHBvaW50IGluZGV4IG9uIHdoaWNoIHRoZSBjbHVzdGVyIG9yaWdpbmF0ZWQgLS0gb2Zmc2V0IGJ5IHRvdGFsIGxlbmd0aCBvZiBmZWF0dXJlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gKGkgPDwgNSkgKyAoem9vbSArIDEpICsgdGhpcy5wb2ludHMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuZWlnaGJvcklkIG9mIG5laWdoYm9ySWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYi56b29tIDw9IHpvb20pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tOyAvLyBzYXZlIHRoZSB6b29tIChzbyBpdCBkb2Vzbid0IGdldCBwcm9jZXNzZWQgdHdpY2UpXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtUG9pbnRzMiA9IGIubnVtUG9pbnRzIHx8IDE7XG4gICAgICAgICAgICAgICAgICAgIHd4ICs9IGIueCAqIG51bVBvaW50czI7IC8vIGFjY3VtdWxhdGUgY29vcmRpbmF0ZXMgZm9yIGNhbGN1bGF0aW5nIHdlaWdodGVkIGNlbnRlclxuICAgICAgICAgICAgICAgICAgICB3eSArPSBiLnkgKiBudW1Qb2ludHMyO1xuXG4gICAgICAgICAgICAgICAgICAgIGIucGFyZW50SWQgPSBpZDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVkdWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsdXN0ZXJQcm9wZXJ0aWVzKSBjbHVzdGVyUHJvcGVydGllcyA9IHRoaXMuX21hcChwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZShjbHVzdGVyUHJvcGVydGllcywgdGhpcy5fbWFwKGIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHAucGFyZW50SWQgPSBpZDtcbiAgICAgICAgICAgICAgICBjbHVzdGVycy5wdXNoKGNyZWF0ZUNsdXN0ZXIod3ggLyBudW1Qb2ludHMsIHd5IC8gbnVtUG9pbnRzLCBpZCwgbnVtUG9pbnRzLCBjbHVzdGVyUHJvcGVydGllcykpO1xuXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBsZWZ0IHBvaW50cyBhcyB1bmNsdXN0ZXJlZFxuICAgICAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2gocCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobnVtUG9pbnRzID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5laWdoYm9ySWQgb2YgbmVpZ2hib3JJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLnpvb20gPD0gem9vbSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnMucHVzaChiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbHVzdGVycztcbiAgICB9XG5cbiAgICAvLyBnZXQgaW5kZXggb2YgdGhlIHBvaW50IGZyb20gd2hpY2ggdGhlIGNsdXN0ZXIgb3JpZ2luYXRlZFxuICAgIF9nZXRPcmlnaW5JZChjbHVzdGVySWQpIHtcbiAgICAgICAgcmV0dXJuIChjbHVzdGVySWQgLSB0aGlzLnBvaW50cy5sZW5ndGgpID4+IDU7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHpvb20gb2YgdGhlIHBvaW50IGZyb20gd2hpY2ggdGhlIGNsdXN0ZXIgb3JpZ2luYXRlZFxuICAgIF9nZXRPcmlnaW5ab29tKGNsdXN0ZXJJZCkge1xuICAgICAgICByZXR1cm4gKGNsdXN0ZXJJZCAtIHRoaXMucG9pbnRzLmxlbmd0aCkgJSAzMjtcbiAgICB9XG5cbiAgICBfbWFwKHBvaW50LCBjbG9uZSkge1xuICAgICAgICBpZiAocG9pbnQubnVtUG9pbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvbmUgPyBleHRlbmQoe30sIHBvaW50LnByb3BlcnRpZXMpIDogcG9pbnQucHJvcGVydGllcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMucG9pbnRzW3BvaW50LmluZGV4XS5wcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm9wdGlvbnMubWFwKG9yaWdpbmFsKTtcbiAgICAgICAgcmV0dXJuIGNsb25lICYmIHJlc3VsdCA9PT0gb3JpZ2luYWwgPyBleHRlbmQoe30sIHJlc3VsdCkgOiByZXN1bHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDbHVzdGVyKHgsIHksIGlkLCBudW1Qb2ludHMsIHByb3BlcnRpZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBmcm91bmQoeCksIC8vIHdlaWdodGVkIGNsdXN0ZXIgY2VudGVyOyByb3VuZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBGbG9hdDMyQXJyYXkgaW5kZXhcbiAgICAgICAgeTogZnJvdW5kKHkpLFxuICAgICAgICB6b29tOiBJbmZpbml0eSwgLy8gdGhlIGxhc3Qgem9vbSB0aGUgY2x1c3RlciB3YXMgcHJvY2Vzc2VkIGF0XG4gICAgICAgIGlkLCAvLyBlbmNvZGVzIGluZGV4IG9mIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY2x1c3RlciBhbmQgaXRzIHpvb20gbGV2ZWxcbiAgICAgICAgcGFyZW50SWQ6IC0xLCAvLyBwYXJlbnQgY2x1c3RlciBpZFxuICAgICAgICBudW1Qb2ludHMsXG4gICAgICAgIHByb3BlcnRpZXNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQb2ludENsdXN0ZXIocCwgaWQpIHtcbiAgICBjb25zdCBbeCwgeV0gPSBwLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGZyb3VuZChsbmdYKHgpKSwgLy8gcHJvamVjdGVkIHBvaW50IGNvb3JkaW5hdGVzXG4gICAgICAgIHk6IGZyb3VuZChsYXRZKHkpKSxcbiAgICAgICAgem9vbTogSW5maW5pdHksIC8vIHRoZSBsYXN0IHpvb20gdGhlIHBvaW50IHdhcyBwcm9jZXNzZWQgYXRcbiAgICAgICAgaW5kZXg6IGlkLCAvLyBpbmRleCBvZiB0aGUgc291cmNlIGZlYXR1cmUgaW4gdGhlIG9yaWdpbmFsIGlucHV0IGFycmF5LFxuICAgICAgICBwYXJlbnRJZDogLTEgLy8gcGFyZW50IGNsdXN0ZXIgaWRcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbHVzdGVySlNPTihjbHVzdGVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICBpZDogY2x1c3Rlci5pZCxcbiAgICAgICAgcHJvcGVydGllczogZ2V0Q2x1c3RlclByb3BlcnRpZXMoY2x1c3RlciksXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFt4TG5nKGNsdXN0ZXIueCksIHlMYXQoY2x1c3Rlci55KV1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldENsdXN0ZXJQcm9wZXJ0aWVzKGNsdXN0ZXIpIHtcbiAgICBjb25zdCBjb3VudCA9IGNsdXN0ZXIubnVtUG9pbnRzO1xuICAgIGNvbnN0IGFiYnJldiA9XG4gICAgICAgIGNvdW50ID49IDEwMDAwID8gYCR7TWF0aC5yb3VuZChjb3VudCAvIDEwMDApICB9a2AgOlxuICAgICAgICBjb3VudCA+PSAxMDAwID8gYCR7TWF0aC5yb3VuZChjb3VudCAvIDEwMCkgLyAxMCAgfWtgIDogY291bnQ7XG4gICAgcmV0dXJuIGV4dGVuZChleHRlbmQoe30sIGNsdXN0ZXIucHJvcGVydGllcyksIHtcbiAgICAgICAgY2x1c3RlcjogdHJ1ZSxcbiAgICAgICAgY2x1c3Rlcl9pZDogY2x1c3Rlci5pZCxcbiAgICAgICAgcG9pbnRfY291bnQ6IGNvdW50LFxuICAgICAgICBwb2ludF9jb3VudF9hYmJyZXZpYXRlZDogYWJicmV2XG4gICAgfSk7XG59XG5cbi8vIGxvbmdpdHVkZS9sYXRpdHVkZSB0byBzcGhlcmljYWwgbWVyY2F0b3IgaW4gWzAuLjFdIHJhbmdlXG5mdW5jdGlvbiBsbmdYKGxuZykge1xuICAgIHJldHVybiBsbmcgLyAzNjAgKyAwLjU7XG59XG5mdW5jdGlvbiBsYXRZKGxhdCkge1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGxhdCAqIE1hdGguUEkgLyAxODApO1xuICAgIGNvbnN0IHkgPSAoMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJKTtcbiAgICByZXR1cm4geSA8IDAgPyAwIDogeSA+IDEgPyAxIDogeTtcbn1cblxuLy8gc3BoZXJpY2FsIG1lcmNhdG9yIHRvIGxvbmdpdHVkZS9sYXRpdHVkZVxuZnVuY3Rpb24geExuZyh4KSB7XG4gICAgcmV0dXJuICh4IC0gMC41KSAqIDM2MDtcbn1cbmZ1bmN0aW9uIHlMYXQoeSkge1xuICAgIGNvbnN0IHkyID0gKDE4MCAtIHkgKiAzNjApICogTWF0aC5QSSAvIDE4MDtcbiAgICByZXR1cm4gMzYwICogTWF0aC5hdGFuKE1hdGguZXhwKHkyKSkgLyBNYXRoLlBJIC0gOTA7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKGNvbnN0IGlkIGluIHNyYykgZGVzdFtpZF0gPSBzcmNbaWRdO1xuICAgIHJldHVybiBkZXN0O1xufVxuXG5mdW5jdGlvbiBnZXRYKHApIHtcbiAgICByZXR1cm4gcC54O1xufVxuZnVuY3Rpb24gZ2V0WShwKSB7XG4gICAgcmV0dXJuIHAueTtcbn1cbiIsIlxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2ltcGxpZnkoY29vcmRzLCBmaXJzdCwgbGFzdCwgc3FUb2xlcmFuY2UpIHtcbiAgICB2YXIgbWF4U3FEaXN0ID0gc3FUb2xlcmFuY2U7XG4gICAgdmFyIG1pZCA9IChsYXN0IC0gZmlyc3QpID4+IDE7XG4gICAgdmFyIG1pblBvc1RvTWlkID0gbGFzdCAtIGZpcnN0O1xuICAgIHZhciBpbmRleDtcblxuICAgIHZhciBheCA9IGNvb3Jkc1tmaXJzdF07XG4gICAgdmFyIGF5ID0gY29vcmRzW2ZpcnN0ICsgMV07XG4gICAgdmFyIGJ4ID0gY29vcmRzW2xhc3RdO1xuICAgIHZhciBieSA9IGNvb3Jkc1tsYXN0ICsgMV07XG5cbiAgICBmb3IgKHZhciBpID0gZmlyc3QgKyAzOyBpIDwgbGFzdDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBkID0gZ2V0U3FTZWdEaXN0KGNvb3Jkc1tpXSwgY29vcmRzW2kgKyAxXSwgYXgsIGF5LCBieCwgYnkpO1xuXG4gICAgICAgIGlmIChkID4gbWF4U3FEaXN0KSB7XG4gICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICBtYXhTcURpc3QgPSBkO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZCA9PT0gbWF4U3FEaXN0KSB7XG4gICAgICAgICAgICAvLyBhIHdvcmthcm91bmQgdG8gZW5zdXJlIHdlIGNob29zZSBhIHBpdm90IGNsb3NlIHRvIHRoZSBtaWRkbGUgb2YgdGhlIGxpc3QsXG4gICAgICAgICAgICAvLyByZWR1Y2luZyByZWN1cnNpb24gZGVwdGgsIGZvciBjZXJ0YWluIGRlZ2VuZXJhdGUgaW5wdXRzXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L2dlb2pzb24tdnQvaXNzdWVzLzEwNFxuICAgICAgICAgICAgdmFyIHBvc1RvTWlkID0gTWF0aC5hYnMoaSAtIG1pZCk7XG4gICAgICAgICAgICBpZiAocG9zVG9NaWQgPCBtaW5Qb3NUb01pZCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBtaW5Qb3NUb01pZCA9IHBvc1RvTWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1heFNxRGlzdCA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgIGlmIChpbmRleCAtIGZpcnN0ID4gMykgc2ltcGxpZnkoY29vcmRzLCBmaXJzdCwgaW5kZXgsIHNxVG9sZXJhbmNlKTtcbiAgICAgICAgY29vcmRzW2luZGV4ICsgMl0gPSBtYXhTcURpc3Q7XG4gICAgICAgIGlmIChsYXN0IC0gaW5kZXggPiAzKSBzaW1wbGlmeShjb29yZHMsIGluZGV4LCBsYXN0LCBzcVRvbGVyYW5jZSk7XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHB4LCBweSwgeCwgeSwgYngsIGJ5KSB7XG5cbiAgICB2YXIgZHggPSBieCAtIHg7XG4gICAgdmFyIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUZlYXR1cmUoaWQsIHR5cGUsIGdlb20sIHRhZ3MpIHtcbiAgICB2YXIgZmVhdHVyZSA9IHtcbiAgICAgICAgaWQ6IHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogaWQsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGdlb21ldHJ5OiBnZW9tLFxuICAgICAgICB0YWdzOiB0YWdzLFxuICAgICAgICBtaW5YOiBJbmZpbml0eSxcbiAgICAgICAgbWluWTogSW5maW5pdHksXG4gICAgICAgIG1heFg6IC1JbmZpbml0eSxcbiAgICAgICAgbWF4WTogLUluZmluaXR5XG4gICAgfTtcbiAgICBjYWxjQkJveChmZWF0dXJlKTtcbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuZnVuY3Rpb24gY2FsY0JCb3goZmVhdHVyZSkge1xuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeTtcbiAgICB2YXIgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50JyB8fCB0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb20pO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjYWxjTGluZUJCb3goZmVhdHVyZSwgZ2VvbVtpXSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ2VvbVtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNhbGNMaW5lQkJveChmZWF0dXJlLCBnZW9tW2ldW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb20pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgZmVhdHVyZS5taW5YID0gTWF0aC5taW4oZmVhdHVyZS5taW5YLCBnZW9tW2ldKTtcbiAgICAgICAgZmVhdHVyZS5taW5ZID0gTWF0aC5taW4oZmVhdHVyZS5taW5ZLCBnZW9tW2kgKyAxXSk7XG4gICAgICAgIGZlYXR1cmUubWF4WCA9IE1hdGgubWF4KGZlYXR1cmUubWF4WCwgZ2VvbVtpXSk7XG4gICAgICAgIGZlYXR1cmUubWF4WSA9IE1hdGgubWF4KGZlYXR1cmUubWF4WSwgZ2VvbVtpICsgMV0pO1xuICAgIH1cbn1cbiIsIlxuaW1wb3J0IHNpbXBsaWZ5IGZyb20gJy4vc2ltcGxpZnknO1xuaW1wb3J0IGNyZWF0ZUZlYXR1cmUgZnJvbSAnLi9mZWF0dXJlJztcblxuLy8gY29udmVydHMgR2VvSlNPTiBmZWF0dXJlIGludG8gYW4gaW50ZXJtZWRpYXRlIHByb2plY3RlZCBKU09OIHZlY3RvciBmb3JtYXQgd2l0aCBzaW1wbGlmaWNhdGlvbiBkYXRhXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuICAgIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YS5mZWF0dXJlc1tpXSwgb3B0aW9ucywgaSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEsIG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZ2VvanNvbiwgb3B0aW9ucywgaW5kZXgpIHtcbiAgICBpZiAoIWdlb2pzb24uZ2VvbWV0cnkpIHJldHVybjtcblxuICAgIHZhciBjb29yZHMgPSBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIHZhciB0eXBlID0gZ2VvanNvbi5nZW9tZXRyeS50eXBlO1xuICAgIHZhciB0b2xlcmFuY2UgPSBNYXRoLnBvdyhvcHRpb25zLnRvbGVyYW5jZSAvICgoMSA8PCBvcHRpb25zLm1heFpvb20pICogb3B0aW9ucy5leHRlbnQpLCAyKTtcbiAgICB2YXIgZ2VvbWV0cnkgPSBbXTtcbiAgICB2YXIgaWQgPSBnZW9qc29uLmlkO1xuICAgIGlmIChvcHRpb25zLnByb21vdGVJZCkge1xuICAgICAgICBpZCA9IGdlb2pzb24ucHJvcGVydGllc1tvcHRpb25zLnByb21vdGVJZF07XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmdlbmVyYXRlSWQpIHtcbiAgICAgICAgaWQgPSBpbmRleCB8fCAwO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBjb252ZXJ0UG9pbnQoY29vcmRzLCBnZW9tZXRyeSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydFBvaW50KGNvb3Jkc1tpXSwgZ2VvbWV0cnkpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICBjb252ZXJ0TGluZShjb29yZHMsIGdlb21ldHJ5LCB0b2xlcmFuY2UsIGZhbHNlKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubGluZU1ldHJpY3MpIHtcbiAgICAgICAgICAgIC8vIGV4cGxvZGUgaW50byBsaW5lc3RyaW5ncyB0byBiZSBhYmxlIHRvIHRyYWNrIG1ldHJpY3NcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnZlcnRMaW5lKGNvb3Jkc1tpXSwgZ2VvbWV0cnksIHRvbGVyYW5jZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZShpZCwgJ0xpbmVTdHJpbmcnLCBnZW9tZXRyeSwgZ2VvanNvbi5wcm9wZXJ0aWVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb252ZXJ0TGluZXMoY29vcmRzLCBnZW9tZXRyeSwgdG9sZXJhbmNlLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnZlcnRMaW5lcyhjb29yZHMsIGdlb21ldHJ5LCB0b2xlcmFuY2UsIHRydWUpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9seWdvbiA9IFtdO1xuICAgICAgICAgICAgY29udmVydExpbmVzKGNvb3Jkc1tpXSwgcG9seWdvbiwgdG9sZXJhbmNlLCB0cnVlKTtcbiAgICAgICAgICAgIGdlb21ldHJ5LnB1c2gocG9seWdvbik7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmdlb21ldHJ5Lmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9qc29uLmdlb21ldHJ5Lmdlb21ldHJpZXNbaV0sXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZ2VvanNvbi5wcm9wZXJ0aWVzXG4gICAgICAgICAgICB9LCBvcHRpb25zLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC4nKTtcbiAgICB9XG5cbiAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZUZlYXR1cmUoaWQsIHR5cGUsIGdlb21ldHJ5LCBnZW9qc29uLnByb3BlcnRpZXMpKTtcbn1cblxuZnVuY3Rpb24gY29udmVydFBvaW50KGNvb3Jkcywgb3V0KSB7XG4gICAgb3V0LnB1c2gocHJvamVjdFgoY29vcmRzWzBdKSk7XG4gICAgb3V0LnB1c2gocHJvamVjdFkoY29vcmRzWzFdKSk7XG4gICAgb3V0LnB1c2goMCk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRMaW5lKHJpbmcsIG91dCwgdG9sZXJhbmNlLCBpc1BvbHlnb24pIHtcbiAgICB2YXIgeDAsIHkwO1xuICAgIHZhciBzaXplID0gMDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgeCA9IHByb2plY3RYKHJpbmdbal1bMF0pO1xuICAgICAgICB2YXIgeSA9IHByb2plY3RZKHJpbmdbal1bMV0pO1xuXG4gICAgICAgIG91dC5wdXNoKHgpO1xuICAgICAgICBvdXQucHVzaCh5KTtcbiAgICAgICAgb3V0LnB1c2goMCk7XG5cbiAgICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgICAgICBpZiAoaXNQb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSAoeDAgKiB5IC0geCAqIHkwKSAvIDI7IC8vIGFyZWFcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSBNYXRoLnNxcnQoTWF0aC5wb3coeCAtIHgwLCAyKSArIE1hdGgucG93KHkgLSB5MCwgMikpOyAvLyBsZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB4MCA9IHg7XG4gICAgICAgIHkwID0geTtcbiAgICB9XG5cbiAgICB2YXIgbGFzdCA9IG91dC5sZW5ndGggLSAzO1xuICAgIG91dFsyXSA9IDE7XG4gICAgc2ltcGxpZnkob3V0LCAwLCBsYXN0LCB0b2xlcmFuY2UpO1xuICAgIG91dFtsYXN0ICsgMl0gPSAxO1xuXG4gICAgb3V0LnNpemUgPSBNYXRoLmFicyhzaXplKTtcbiAgICBvdXQuc3RhcnQgPSAwO1xuICAgIG91dC5lbmQgPSBvdXQuc2l6ZTtcbn1cblxuZnVuY3Rpb24gY29udmVydExpbmVzKHJpbmdzLCBvdXQsIHRvbGVyYW5jZSwgaXNQb2x5Z29uKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZ2VvbSA9IFtdO1xuICAgICAgICBjb252ZXJ0TGluZShyaW5nc1tpXSwgZ2VvbSwgdG9sZXJhbmNlLCBpc1BvbHlnb24pO1xuICAgICAgICBvdXQucHVzaChnZW9tKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHByb2plY3RYKHgpIHtcbiAgICByZXR1cm4geCAvIDM2MCArIDAuNTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFkoeSkge1xuICAgIHZhciBzaW4gPSBNYXRoLnNpbih5ICogTWF0aC5QSSAvIDE4MCk7XG4gICAgdmFyIHkyID0gMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJO1xuICAgIHJldHVybiB5MiA8IDAgPyAwIDogeTIgPiAxID8gMSA6IHkyO1xufVxuIiwiXG5pbXBvcnQgY3JlYXRlRmVhdHVyZSBmcm9tICcuL2ZlYXR1cmUnO1xuXG4vKiBjbGlwIGZlYXR1cmVzIGJldHdlZW4gdHdvIGF4aXMtcGFyYWxsZWwgbGluZXM6XG4gKiAgICAgfCAgICAgICAgfFxuICogIF9fX3xfX18gICAgIHwgICAgIC9cbiAqIC8gICB8ICAgXFxfX19ffF9fX18vXG4gKiAgICAgfCAgICAgICAgfFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsaXAoZmVhdHVyZXMsIHNjYWxlLCBrMSwgazIsIGF4aXMsIG1pbkFsbCwgbWF4QWxsLCBvcHRpb25zKSB7XG5cbiAgICBrMSAvPSBzY2FsZTtcbiAgICBrMiAvPSBzY2FsZTtcblxuICAgIGlmIChtaW5BbGwgPj0gazEgJiYgbWF4QWxsIDwgazIpIHJldHVybiBmZWF0dXJlczsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICBlbHNlIGlmIChtYXhBbGwgPCBrMSB8fCBtaW5BbGwgPj0gazIpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldO1xuICAgICAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgICB2YXIgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICB2YXIgbWluID0gYXhpcyA9PT0gMCA/IGZlYXR1cmUubWluWCA6IGZlYXR1cmUubWluWTtcbiAgICAgICAgdmFyIG1heCA9IGF4aXMgPT09IDAgPyBmZWF0dXJlLm1heFggOiBmZWF0dXJlLm1heFk7XG5cbiAgICAgICAgaWYgKG1pbiA+PSBrMSAmJiBtYXggPCBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWF4IDwgazEgfHwgbWluID49IGsyKSB7IC8vIHRyaXZpYWwgcmVqZWN0XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXdHZW9tZXRyeSA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgY2xpcFBvaW50cyhnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcyk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIGNsaXBMaW5lKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzLCBmYWxzZSwgb3B0aW9ucy5saW5lTWV0cmljcyk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgY2xpcExpbmVzKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzLCBmYWxzZSk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgIGNsaXBMaW5lcyhnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcywgdHJ1ZSk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBnZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBwb2x5Z29uID0gW107XG4gICAgICAgICAgICAgICAgY2xpcExpbmVzKGdlb21ldHJ5W2pdLCBwb2x5Z29uLCBrMSwgazIsIGF4aXMsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdHZW9tZXRyeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbmVNZXRyaWNzICYmIHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuZXdHZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjbGlwcGVkLnB1c2goY3JlYXRlRmVhdHVyZShmZWF0dXJlLmlkLCB0eXBlLCBuZXdHZW9tZXRyeVtqXSwgZmVhdHVyZS50YWdzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0dlb21ldHJ5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ0xpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeSA9IG5ld0dlb21ldHJ5WzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gbmV3R2VvbWV0cnkubGVuZ3RoID09PSAzID8gJ1BvaW50JyA6ICdNdWx0aVBvaW50JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5pZCwgdHlwZSwgbmV3R2VvbWV0cnksIGZlYXR1cmUudGFncykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBwZWQubGVuZ3RoID8gY2xpcHBlZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNsaXBQb2ludHMoZ2VvbSwgbmV3R2VvbSwgazEsIGsyLCBheGlzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gZ2VvbVtpICsgYXhpc107XG5cbiAgICAgICAgaWYgKGEgPj0gazEgJiYgYSA8PSBrMikge1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKGdlb21baSArIDFdKTtcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChnZW9tW2kgKyAyXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNsaXBMaW5lKGdlb20sIG5ld0dlb20sIGsxLCBrMiwgYXhpcywgaXNQb2x5Z29uLCB0cmFja01ldHJpY3MpIHtcblxuICAgIHZhciBzbGljZSA9IG5ld1NsaWNlKGdlb20pO1xuICAgIHZhciBpbnRlcnNlY3QgPSBheGlzID09PSAwID8gaW50ZXJzZWN0WCA6IGludGVyc2VjdFk7XG4gICAgdmFyIGxlbiA9IGdlb20uc3RhcnQ7XG4gICAgdmFyIHNlZ0xlbiwgdDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGggLSAzOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGF4ID0gZ2VvbVtpXTtcbiAgICAgICAgdmFyIGF5ID0gZ2VvbVtpICsgMV07XG4gICAgICAgIHZhciBheiA9IGdlb21baSArIDJdO1xuICAgICAgICB2YXIgYnggPSBnZW9tW2kgKyAzXTtcbiAgICAgICAgdmFyIGJ5ID0gZ2VvbVtpICsgNF07XG4gICAgICAgIHZhciBhID0gYXhpcyA9PT0gMCA/IGF4IDogYXk7XG4gICAgICAgIHZhciBiID0gYXhpcyA9PT0gMCA/IGJ4IDogYnk7XG4gICAgICAgIHZhciBleGl0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzZWdMZW4gPSBNYXRoLnNxcnQoTWF0aC5wb3coYXggLSBieCwgMikgKyBNYXRoLnBvdyhheSAtIGJ5LCAyKSk7XG5cbiAgICAgICAgaWYgKGEgPCBrMSkge1xuICAgICAgICAgICAgLy8gLS0tfC0tPiAgfCAobGluZSBlbnRlcnMgdGhlIGNsaXAgcmVnaW9uIGZyb20gdGhlIGxlZnQpXG4gICAgICAgICAgICBpZiAoYiA+IGsxKSB7XG4gICAgICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsxKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5zdGFydCA9IGxlbiArIHNlZ0xlbiAqIHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYSA+IGsyKSB7XG4gICAgICAgICAgICAvLyB8ICA8LS18LS0tIChsaW5lIGVudGVycyB0aGUgY2xpcCByZWdpb24gZnJvbSB0aGUgcmlnaHQpXG4gICAgICAgICAgICBpZiAoYiA8IGsyKSB7XG4gICAgICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsyKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5zdGFydCA9IGxlbiArIHNlZ0xlbiAqIHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGRQb2ludChzbGljZSwgYXgsIGF5LCBheik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPCBrMSAmJiBhID49IGsxKSB7XG4gICAgICAgICAgICAvLyA8LS18LS0tICB8IG9yIDwtLXwtLS0tLXwtLS0gKGxpbmUgZXhpdHMgdGhlIGNsaXAgcmVnaW9uIG9uIHRoZSBsZWZ0KVxuICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsxKTtcbiAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPiBrMiAmJiBhIDw9IGsyKSB7XG4gICAgICAgICAgICAvLyB8ICAtLS18LS0+IG9yIC0tLXwtLS0tLXwtLT4gKGxpbmUgZXhpdHMgdGhlIGNsaXAgcmVnaW9uIG9uIHRoZSByaWdodClcbiAgICAgICAgICAgIHQgPSBpbnRlcnNlY3Qoc2xpY2UsIGF4LCBheSwgYngsIGJ5LCBrMik7XG4gICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1BvbHlnb24gJiYgZXhpdGVkKSB7XG4gICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5lbmQgPSBsZW4gKyBzZWdMZW4gKiB0O1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKHNsaWNlKTtcbiAgICAgICAgICAgIHNsaWNlID0gbmV3U2xpY2UoZ2VvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBsZW4gKz0gc2VnTGVuO1xuICAgIH1cblxuICAgIC8vIGFkZCB0aGUgbGFzdCBwb2ludFxuICAgIHZhciBsYXN0ID0gZ2VvbS5sZW5ndGggLSAzO1xuICAgIGF4ID0gZ2VvbVtsYXN0XTtcbiAgICBheSA9IGdlb21bbGFzdCArIDFdO1xuICAgIGF6ID0gZ2VvbVtsYXN0ICsgMl07XG4gICAgYSA9IGF4aXMgPT09IDAgPyBheCA6IGF5O1xuICAgIGlmIChhID49IGsxICYmIGEgPD0gazIpIGFkZFBvaW50KHNsaWNlLCBheCwgYXksIGF6KTtcblxuICAgIC8vIGNsb3NlIHRoZSBwb2x5Z29uIGlmIGl0cyBlbmRwb2ludHMgYXJlIG5vdCB0aGUgc2FtZSBhZnRlciBjbGlwcGluZ1xuICAgIGxhc3QgPSBzbGljZS5sZW5ndGggLSAzO1xuICAgIGlmIChpc1BvbHlnb24gJiYgbGFzdCA+PSAzICYmIChzbGljZVtsYXN0XSAhPT0gc2xpY2VbMF0gfHwgc2xpY2VbbGFzdCArIDFdICE9PSBzbGljZVsxXSkpIHtcbiAgICAgICAgYWRkUG9pbnQoc2xpY2UsIHNsaWNlWzBdLCBzbGljZVsxXSwgc2xpY2VbMl0pO1xuICAgIH1cblxuICAgIC8vIGFkZCB0aGUgZmluYWwgc2xpY2VcbiAgICBpZiAoc2xpY2UubGVuZ3RoKSB7XG4gICAgICAgIG5ld0dlb20ucHVzaChzbGljZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBuZXdTbGljZShsaW5lKSB7XG4gICAgdmFyIHNsaWNlID0gW107XG4gICAgc2xpY2Uuc2l6ZSA9IGxpbmUuc2l6ZTtcbiAgICBzbGljZS5zdGFydCA9IGxpbmUuc3RhcnQ7XG4gICAgc2xpY2UuZW5kID0gbGluZS5lbmQ7XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuXG5mdW5jdGlvbiBjbGlwTGluZXMoZ2VvbSwgbmV3R2VvbSwgazEsIGsyLCBheGlzLCBpc1BvbHlnb24pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2xpcExpbmUoZ2VvbVtpXSwgbmV3R2VvbSwgazEsIGsyLCBheGlzLCBpc1BvbHlnb24sIGZhbHNlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZFBvaW50KG91dCwgeCwgeSwgeikge1xuICAgIG91dC5wdXNoKHgpO1xuICAgIG91dC5wdXNoKHkpO1xuICAgIG91dC5wdXNoKHopO1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3RYKG91dCwgYXgsIGF5LCBieCwgYnksIHgpIHtcbiAgICB2YXIgdCA9ICh4IC0gYXgpIC8gKGJ4IC0gYXgpO1xuICAgIG91dC5wdXNoKHgpO1xuICAgIG91dC5wdXNoKGF5ICsgKGJ5IC0gYXkpICogdCk7XG4gICAgb3V0LnB1c2goMSk7XG4gICAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdFkob3V0LCBheCwgYXksIGJ4LCBieSwgeSkge1xuICAgIHZhciB0ID0gKHkgLSBheSkgLyAoYnkgLSBheSk7XG4gICAgb3V0LnB1c2goYXggKyAoYnggLSBheCkgKiB0KTtcbiAgICBvdXQucHVzaCh5KTtcbiAgICBvdXQucHVzaCgxKTtcbiAgICByZXR1cm4gdDtcbn1cbiIsIlxuaW1wb3J0IGNsaXAgZnJvbSAnLi9jbGlwJztcbmltcG9ydCBjcmVhdGVGZWF0dXJlIGZyb20gJy4vZmVhdHVyZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgYnVmZmVyID0gb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudDtcbiAgICB2YXIgbWVyZ2VkID0gZmVhdHVyZXM7XG4gICAgdmFyIGxlZnQgID0gY2xpcChmZWF0dXJlcywgMSwgLTEgLSBidWZmZXIsIGJ1ZmZlciwgICAgIDAsIC0xLCAyLCBvcHRpb25zKTsgLy8gbGVmdCB3b3JsZCBjb3B5XG4gICAgdmFyIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgMSwgIDEgLSBidWZmZXIsIDIgKyBidWZmZXIsIDAsIC0xLCAyLCBvcHRpb25zKTsgLy8gcmlnaHQgd29ybGQgY29weVxuXG4gICAgaWYgKGxlZnQgfHwgcmlnaHQpIHtcbiAgICAgICAgbWVyZ2VkID0gY2xpcChmZWF0dXJlcywgMSwgLWJ1ZmZlciwgMSArIGJ1ZmZlciwgMCwgLTEsIDIsIG9wdGlvbnMpIHx8IFtdOyAvLyBjZW50ZXIgd29ybGQgY29weVxuXG4gICAgICAgIGlmIChsZWZ0KSBtZXJnZWQgPSBzaGlmdEZlYXR1cmVDb29yZHMobGVmdCwgMSkuY29uY2F0KG1lcmdlZCk7IC8vIG1lcmdlIGxlZnQgaW50byBjZW50ZXJcbiAgICAgICAgaWYgKHJpZ2h0KSBtZXJnZWQgPSBtZXJnZWQuY29uY2F0KHNoaWZ0RmVhdHVyZUNvb3JkcyhyaWdodCwgLTEpKTsgLy8gbWVyZ2UgcmlnaHQgaW50byBjZW50ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBzaGlmdEZlYXR1cmVDb29yZHMoZmVhdHVyZXMsIG9mZnNldCkge1xuICAgIHZhciBuZXdGZWF0dXJlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICB2YXIgbmV3R2VvbWV0cnk7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnIHx8IHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5LCBvZmZzZXQpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1BvbHlnb24gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGZlYXR1cmUuZ2VvbWV0cnlbal0ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UG9seWdvbi5wdXNoKHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnlbal1ba10sIG9mZnNldCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKG5ld1BvbHlnb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV3RmVhdHVyZXMucHVzaChjcmVhdGVGZWF0dXJlKGZlYXR1cmUuaWQsIHR5cGUsIG5ld0dlb21ldHJ5LCBmZWF0dXJlLnRhZ3MpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0Q29vcmRzKHBvaW50cywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld1BvaW50cyA9IFtdO1xuICAgIG5ld1BvaW50cy5zaXplID0gcG9pbnRzLnNpemU7XG5cbiAgICBpZiAocG9pbnRzLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3UG9pbnRzLnN0YXJ0ID0gcG9pbnRzLnN0YXJ0O1xuICAgICAgICBuZXdQb2ludHMuZW5kID0gcG9pbnRzLmVuZDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICBuZXdQb2ludHMucHVzaChwb2ludHNbaV0gKyBvZmZzZXQsIHBvaW50c1tpICsgMV0sIHBvaW50c1tpICsgMl0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UG9pbnRzO1xufVxuIiwiXG4vLyBUcmFuc2Zvcm1zIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIGZlYXR1cmUgaW4gdGhlIGdpdmVuIHRpbGUgZnJvbVxuLy8gbWVyY2F0b3ItcHJvamVjdGVkIHNwYWNlIGludG8gKGV4dGVudCB4IGV4dGVudCkgdGlsZSBzcGFjZS5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUodGlsZSwgZXh0ZW50KSB7XG4gICAgaWYgKHRpbGUudHJhbnNmb3JtZWQpIHJldHVybiB0aWxlO1xuXG4gICAgdmFyIHoyID0gMSA8PCB0aWxlLnosXG4gICAgICAgIHR4ID0gdGlsZS54LFxuICAgICAgICB0eSA9IHRpbGUueSxcbiAgICAgICAgaSwgaiwgaztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0aWxlLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gdGlsZS5mZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICBmZWF0dXJlLmdlb21ldHJ5ID0gW107XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaiArPSAyKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5nZW9tZXRyeS5wdXNoKHRyYW5zZm9ybVBvaW50KGdlb21bal0sIGdlb21baiArIDFdLCBleHRlbnQsIHoyLCB0eCwgdHkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZ2VvbVtqXS5sZW5ndGg7IGsgKz0gMikge1xuICAgICAgICAgICAgICAgICAgICByaW5nLnB1c2godHJhbnNmb3JtUG9pbnQoZ2VvbVtqXVtrXSwgZ2VvbVtqXVtrICsgMV0sIGV4dGVudCwgejIsIHR4LCB0eSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnB1c2gocmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aWxlLnRyYW5zZm9ybWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludCh4LCB5LCBleHRlbnQsIHoyLCB0eCwgdHkpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBNYXRoLnJvdW5kKGV4dGVudCAqICh4ICogejIgLSB0eCkpLFxuICAgICAgICBNYXRoLnJvdW5kKGV4dGVudCAqICh5ICogejIgLSB0eSkpXTtcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgeiwgdHgsIHR5LCBvcHRpb25zKSB7XG4gICAgdmFyIHRvbGVyYW5jZSA9IHogPT09IG9wdGlvbnMubWF4Wm9vbSA/IDAgOiBvcHRpb25zLnRvbGVyYW5jZSAvICgoMSA8PCB6KSAqIG9wdGlvbnMuZXh0ZW50KTtcbiAgICB2YXIgdGlsZSA9IHtcbiAgICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgICBudW1Qb2ludHM6IDAsXG4gICAgICAgIG51bVNpbXBsaWZpZWQ6IDAsXG4gICAgICAgIG51bUZlYXR1cmVzOiAwLFxuICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgIHg6IHR4LFxuICAgICAgICB5OiB0eSxcbiAgICAgICAgejogeixcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICBtaW5YOiAyLFxuICAgICAgICBtaW5ZOiAxLFxuICAgICAgICBtYXhYOiAtMSxcbiAgICAgICAgbWF4WTogMFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aWxlLm51bUZlYXR1cmVzKys7XG4gICAgICAgIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIG1pblggPSBmZWF0dXJlc1tpXS5taW5YO1xuICAgICAgICB2YXIgbWluWSA9IGZlYXR1cmVzW2ldLm1pblk7XG4gICAgICAgIHZhciBtYXhYID0gZmVhdHVyZXNbaV0ubWF4WDtcbiAgICAgICAgdmFyIG1heFkgPSBmZWF0dXJlc1tpXS5tYXhZO1xuXG4gICAgICAgIGlmIChtaW5YIDwgdGlsZS5taW5YKSB0aWxlLm1pblggPSBtaW5YO1xuICAgICAgICBpZiAobWluWSA8IHRpbGUubWluWSkgdGlsZS5taW5ZID0gbWluWTtcbiAgICAgICAgaWYgKG1heFggPiB0aWxlLm1heFgpIHRpbGUubWF4WCA9IG1heFg7XG4gICAgICAgIGlmIChtYXhZID4gdGlsZS5tYXhZKSB0aWxlLm1heFkgPSBtYXhZO1xuICAgIH1cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlLCB0b2xlcmFuY2UsIG9wdGlvbnMpIHtcblxuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgc2ltcGxpZmllZCA9IFtdO1xuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baSArIDFdKTtcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBnZW9tLCB0aWxlLCB0b2xlcmFuY2UsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBnZW9tW2ldLCB0aWxlLCB0b2xlcmFuY2UsIHR5cGUgPT09ICdQb2x5Z29uJywgaSA9PT0gMCk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcblxuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGdlb20ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHZhciBwb2x5Z29uID0gZ2VvbVtrXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBwb2x5Z29uW2ldLCB0aWxlLCB0b2xlcmFuY2UsIHRydWUsIGkgPT09IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbXBsaWZpZWQubGVuZ3RoKSB7XG4gICAgICAgIHZhciB0YWdzID0gZmVhdHVyZS50YWdzIHx8IG51bGw7XG4gICAgICAgIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgJiYgb3B0aW9ucy5saW5lTWV0cmljcykge1xuICAgICAgICAgICAgdGFncyA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZlYXR1cmUudGFncykgdGFnc1trZXldID0gZmVhdHVyZS50YWdzW2tleV07XG4gICAgICAgICAgICB0YWdzWydtYXBib3hfY2xpcF9zdGFydCddID0gZ2VvbS5zdGFydCAvIGdlb20uc2l6ZTtcbiAgICAgICAgICAgIHRhZ3NbJ21hcGJveF9jbGlwX2VuZCddID0gZ2VvbS5lbmQgLyBnZW9tLnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRpbGVGZWF0dXJlID0ge1xuICAgICAgICAgICAgZ2VvbWV0cnk6IHNpbXBsaWZpZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpUG9seWdvbicgPyAzIDpcbiAgICAgICAgICAgICAgICB0eXBlID09PSAnTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgPyAyIDogMSxcbiAgICAgICAgICAgIHRhZ3M6IHRhZ3NcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZlYXR1cmUuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRpbGVGZWF0dXJlLmlkID0gZmVhdHVyZS5pZDtcbiAgICAgICAgfVxuICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2godGlsZUZlYXR1cmUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkTGluZShyZXN1bHQsIGdlb20sIHRpbGUsIHRvbGVyYW5jZSwgaXNQb2x5Z29uLCBpc091dGVyKSB7XG4gICAgdmFyIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlO1xuXG4gICAgaWYgKHRvbGVyYW5jZSA+IDAgJiYgKGdlb20uc2l6ZSA8IChpc1BvbHlnb24gPyBzcVRvbGVyYW5jZSA6IHRvbGVyYW5jZSkpKSB7XG4gICAgICAgIHRpbGUubnVtUG9pbnRzICs9IGdlb20ubGVuZ3RoIC8gMztcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByaW5nID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgaWYgKHRvbGVyYW5jZSA9PT0gMCB8fCBnZW9tW2kgKyAyXSA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgICAgIHJpbmcucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIHJpbmcucHVzaChnZW9tW2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICB9XG5cbiAgICBpZiAoaXNQb2x5Z29uKSByZXdpbmQocmluZywgaXNPdXRlcik7XG5cbiAgICByZXN1bHQucHVzaChyaW5nKTtcbn1cblxuZnVuY3Rpb24gcmV3aW5kKHJpbmcsIGNsb2Nrd2lzZSkge1xuICAgIHZhciBhcmVhID0gMDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAyOyBpIDwgbGVuOyBqID0gaSwgaSArPSAyKSB7XG4gICAgICAgIGFyZWEgKz0gKHJpbmdbaV0gLSByaW5nW2pdKSAqIChyaW5nW2kgKyAxXSArIHJpbmdbaiArIDFdKTtcbiAgICB9XG4gICAgaWYgKGFyZWEgPiAwID09PSBjbG9ja3dpc2UpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmluZy5sZW5ndGg7IGkgPCBsZW4gLyAyOyBpICs9IDIpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcmluZ1tpXTtcbiAgICAgICAgICAgIHZhciB5ID0gcmluZ1tpICsgMV07XG4gICAgICAgICAgICByaW5nW2ldID0gcmluZ1tsZW4gLSAyIC0gaV07XG4gICAgICAgICAgICByaW5nW2kgKyAxXSA9IHJpbmdbbGVuIC0gMSAtIGldO1xuICAgICAgICAgICAgcmluZ1tsZW4gLSAyIC0gaV0gPSB4O1xuICAgICAgICAgICAgcmluZ1tsZW4gLSAxIC0gaV0gPSB5O1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgY29udmVydCBmcm9tICcuL2NvbnZlcnQnOyAgICAgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG5pbXBvcnQgY2xpcCBmcm9tICcuL2NsaXAnOyAgICAgICAgICAgLy8gc3RyaXBlIGNsaXBwaW5nIGFsZ29yaXRobVxuaW1wb3J0IHdyYXAgZnJvbSAnLi93cmFwJzsgICAgICAgICAgIC8vIGRhdGUgbGluZSBwcm9jZXNzaW5nXG5pbXBvcnQgdHJhbnNmb3JtIGZyb20gJy4vdHJhbnNmb3JtJzsgLy8gY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvblxuaW1wb3J0IGNyZWF0ZVRpbGUgZnJvbSAnLi90aWxlJzsgICAgIC8vIGZpbmFsIHNpbXBsaWZpZWQgdGlsZSBnZW5lcmF0aW9uXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlb2pzb252dChkYXRhLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIEdlb0pTT05WVChkYXRhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKHRoaXMub3B0aW9ucyksIG9wdGlvbnMpO1xuXG4gICAgdmFyIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmIChkZWJ1ZykgY29uc29sZS50aW1lKCdwcmVwcm9jZXNzIGRhdGEnKTtcblxuICAgIGlmIChvcHRpb25zLm1heFpvb20gPCAwIHx8IG9wdGlvbnMubWF4Wm9vbSA+IDI0KSB0aHJvdyBuZXcgRXJyb3IoJ21heFpvb20gc2hvdWxkIGJlIGluIHRoZSAwLTI0IHJhbmdlJyk7XG4gICAgaWYgKG9wdGlvbnMucHJvbW90ZUlkICYmIG9wdGlvbnMuZ2VuZXJhdGVJZCkgdGhyb3cgbmV3IEVycm9yKCdwcm9tb3RlSWQgYW5kIGdlbmVyYXRlSWQgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuJyk7XG5cbiAgICB2YXIgZmVhdHVyZXMgPSBjb252ZXJ0KGRhdGEsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy50aWxlcyA9IHt9O1xuICAgIHRoaXMudGlsZUNvb3JkcyA9IFtdO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgncHJlcHJvY2VzcyBkYXRhJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpbmRleDogbWF4Wm9vbTogJWQsIG1heFBvaW50czogJWQnLCBvcHRpb25zLmluZGV4TWF4Wm9vbSwgb3B0aW9ucy5pbmRleE1heFBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZSgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHt9O1xuICAgICAgICB0aGlzLnRvdGFsID0gMDtcbiAgICB9XG5cbiAgICBmZWF0dXJlcyA9IHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMpO1xuXG4gICAgLy8gc3RhcnQgc2xpY2luZyBmcm9tIHRoZSB0b3AgdGlsZSBkb3duXG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgdGhpcy5zcGxpdFRpbGUoZmVhdHVyZXMsIDAsIDAsIDApO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIGNvbnNvbGUubG9nKCdmZWF0dXJlczogJWQsIHBvaW50czogJWQnLCB0aGlzLnRpbGVzWzBdLm51bUZlYXR1cmVzLCB0aGlzLnRpbGVzWzBdLm51bVBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3RpbGVzIGdlbmVyYXRlZDonLCB0aGlzLnRvdGFsLCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSk7XG4gICAgfVxufVxuXG5HZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnMgPSB7XG4gICAgbWF4Wm9vbTogMTQsICAgICAgICAgICAgLy8gbWF4IHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIG9uXG4gICAgaW5kZXhNYXhab29tOiA1LCAgICAgICAgLy8gbWF4IHpvb20gaW4gdGhlIHRpbGUgaW5kZXhcbiAgICBpbmRleE1heFBvaW50czogMTAwMDAwLCAvLyBtYXggbnVtYmVyIG9mIHBvaW50cyBwZXIgdGlsZSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIHRvbGVyYW5jZTogMywgICAgICAgICAgIC8vIHNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpXG4gICAgZXh0ZW50OiA0MDk2LCAgICAgICAgICAgLy8gdGlsZSBleHRlbnRcbiAgICBidWZmZXI6IDY0LCAgICAgICAgICAgICAvLyB0aWxlIGJ1ZmZlciBvbiBlYWNoIHNpZGVcbiAgICBsaW5lTWV0cmljczogZmFsc2UsICAgICAvLyB3aGV0aGVyIHRvIGNhbGN1bGF0ZSBsaW5lIG1ldHJpY3NcbiAgICBwcm9tb3RlSWQ6IG51bGwsICAgICAgICAvLyBuYW1lIG9mIGEgZmVhdHVyZSBwcm9wZXJ0eSB0byBiZSBwcm9tb3RlZCB0byBmZWF0dXJlLmlkXG4gICAgZ2VuZXJhdGVJZDogZmFsc2UsICAgICAgLy8gd2hldGhlciB0byBnZW5lcmF0ZSBmZWF0dXJlIGlkcy4gQ2Fubm90IGJlIHVzZWQgd2l0aCBwcm9tb3RlSWRcbiAgICBkZWJ1ZzogMCAgICAgICAgICAgICAgICAvLyBsb2dnaW5nIGxldmVsICgwLCAxIG9yIDIpXG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLnNwbGl0VGlsZSA9IGZ1bmN0aW9uIChmZWF0dXJlcywgeiwgeCwgeSwgY3osIGN4LCBjeSkge1xuXG4gICAgdmFyIHN0YWNrID0gW2ZlYXR1cmVzLCB6LCB4LCB5XSxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgLy8gYXZvaWQgcmVjdXJzaW9uIGJ5IHVzaW5nIGEgcHJvY2Vzc2luZyBxdWV1ZVxuICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgeSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB4ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHogPSBzdGFjay5wb3AoKTtcbiAgICAgICAgZmVhdHVyZXMgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICB2YXIgejIgPSAxIDw8IHosXG4gICAgICAgICAgICBpZCA9IHRvSUQoeiwgeCwgeSksXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF07XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NyZWF0aW9uJyk7XG5cbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHosIHgsIHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6IHosIHg6IHgsIHk6IHl9KTtcblxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHosIHgsIHksIHRpbGUubnVtRmVhdHVyZXMsIHRpbGUubnVtUG9pbnRzLCB0aWxlLm51bVNpbXBsaWZpZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2NyZWF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAneicgKyB6O1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHNba2V5XSA9ICh0aGlzLnN0YXRzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWwrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGdlb21ldHJ5IGluIHRpbGUgc28gdGhhdCB3ZSBjYW4gZHJpbGwgZG93biBsYXRlciBpZiB3ZSBzdG9wIG5vd1xuICAgICAgICB0aWxlLnNvdXJjZSA9IGZlYXR1cmVzO1xuXG4gICAgICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0LXBhc3MgdGlsaW5nXG4gICAgICAgIGlmICghY3opIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgbWF4IHpvb20sIG9yIGlmIHRoZSB0aWxlIGlzIHRvbyBzaW1wbGVcbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLmluZGV4TWF4Wm9vbSB8fCB0aWxlLm51bVBvaW50cyA8PSBvcHRpb25zLmluZGV4TWF4UG9pbnRzKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBhIGRyaWxsZG93biB0byBhIHNwZWNpZmljIHRpbGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgYmFzZSB6b29tIG9yIG91ciB0YXJnZXQgdGlsZSB6b29tXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5tYXhab29tIHx8IHogPT09IGN6KSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgaXQncyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIHRhcmdldCB0aWxlXG4gICAgICAgICAgICB2YXIgbSA9IDEgPDwgKGN6IC0geik7XG4gICAgICAgICAgICBpZiAoeCAhPT0gTWF0aC5mbG9vcihjeCAvIG0pIHx8IHkgIT09IE1hdGguZmxvb3IoY3kgLyBtKSkgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB3ZSBzbGljZSBmdXJ0aGVyIGRvd24sIG5vIG5lZWQgdG8ga2VlcCBzb3VyY2UgZ2VvbWV0cnlcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY2xpcHBpbmcnKTtcblxuICAgICAgICAvLyB2YWx1ZXMgd2UnbGwgdXNlIGZvciBjbGlwcGluZ1xuICAgICAgICB2YXIgazEgPSAwLjUgKiBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICAgICAgazIgPSAwLjUgLSBrMSxcbiAgICAgICAgICAgIGszID0gMC41ICsgazEsXG4gICAgICAgICAgICBrNCA9IDEgKyBrMSxcbiAgICAgICAgICAgIHRsLCBibCwgdHIsIGJyLCBsZWZ0LCByaWdodDtcblxuICAgICAgICB0bCA9IGJsID0gdHIgPSBiciA9IG51bGw7XG5cbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCAtIGsxLCB4ICsgazMsIDAsIHRpbGUubWluWCwgdGlsZS5tYXhYLCBvcHRpb25zKTtcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCArIGsyLCB4ICsgazQsIDAsIHRpbGUubWluWCwgdGlsZS5tYXhYLCBvcHRpb25zKTtcbiAgICAgICAgZmVhdHVyZXMgPSBudWxsO1xuXG4gICAgICAgIGlmIChsZWZ0KSB7XG4gICAgICAgICAgICB0bCA9IGNsaXAobGVmdCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBibCA9IGNsaXAobGVmdCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBsZWZ0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgdHIgPSBjbGlwKHJpZ2h0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyID0gY2xpcChyaWdodCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByaWdodCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgc3RhY2sucHVzaCh0bCB8fCBbXSwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIpO1xuICAgICAgICBzdGFjay5wdXNoKGJsIHx8IFtdLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMiArIDEpO1xuICAgICAgICBzdGFjay5wdXNoKHRyIHx8IFtdLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMik7XG4gICAgICAgIHN0YWNrLnB1c2goYnIgfHwgW10sIHogKyAxLCB4ICogMiArIDEsIHkgKiAyICsgMSk7XG4gICAgfVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5nZXRUaWxlID0gZnVuY3Rpb24gKHosIHgsIHkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZXh0ZW50ID0gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmICh6IDwgMCB8fCB6ID4gMjQpIHJldHVybiBudWxsO1xuXG4gICAgdmFyIHoyID0gMSA8PCB6O1xuICAgIHggPSAoKHggJSB6MikgKyB6MikgJSB6MjsgLy8gd3JhcCB0aWxlIHggY29vcmRpbmF0ZVxuXG4gICAgdmFyIGlkID0gdG9JRCh6LCB4LCB5KTtcbiAgICBpZiAodGhpcy50aWxlc1tpZF0pIHJldHVybiB0cmFuc2Zvcm0odGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQnLCB6LCB4LCB5KTtcblxuICAgIHZhciB6MCA9IHosXG4gICAgICAgIHgwID0geCxcbiAgICAgICAgeTAgPSB5LFxuICAgICAgICBwYXJlbnQ7XG5cbiAgICB3aGlsZSAoIXBhcmVudCAmJiB6MCA+IDApIHtcbiAgICAgICAgejAtLTtcbiAgICAgICAgeDAgPSBNYXRoLmZsb29yKHgwIC8gMik7XG4gICAgICAgIHkwID0gTWF0aC5mbG9vcih5MCAvIDIpO1xuICAgICAgICBwYXJlbnQgPSB0aGlzLnRpbGVzW3RvSUQoejAsIHgwLCB5MCldO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQuc291cmNlKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIGlmIHdlIGZvdW5kIGEgcGFyZW50IHRpbGUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZ2VvbWV0cnksIHdlIGNhbiBkcmlsbCBkb3duIGZyb20gaXRcbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZm91bmQgcGFyZW50IHRpbGUgeiVkLSVkLSVkJywgejAsIHgwLCB5MCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICB0aGlzLnNwbGl0VGlsZShwYXJlbnQuc291cmNlLCB6MCwgeDAsIHkwLCB6LCB4LCB5KTtcbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2RyaWxsaW5nIGRvd24nKTtcblxuICAgIHJldHVybiB0aGlzLnRpbGVzW2lkXSA/IHRyYW5zZm9ybSh0aGlzLnRpbGVzW2lkXSwgZXh0ZW50KSA6IG51bGw7XG59O1xuXG5mdW5jdGlvbiB0b0lEKHosIHgsIHkpIHtcbiAgICByZXR1cm4gKCgoMSA8PCB6KSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpIGluIHNyYykgZGVzdFtpXSA9IHNyY1tpXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Z2V0SlNPTn0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcblxuaW1wb3J0IHtnZXRQZXJmb3JtYW5jZU1lYXN1cmVtZW50fSBmcm9tICcuLi91dGlsL3BlcmZvcm1hbmNlLmpzJztcbmltcG9ydCByZXdpbmQgZnJvbSAnQG1hcGJveC9nZW9qc29uLXJld2luZCc7XG5pbXBvcnQgR2VvSlNPTldyYXBwZXIgZnJvbSAnLi9nZW9qc29uX3dyYXBwZXIuanMnO1xuaW1wb3J0IHZ0cGJmIGZyb20gJ3Z0LXBiZic7XG5pbXBvcnQgU3VwZXJjbHVzdGVyIGZyb20gJ3N1cGVyY2x1c3Rlcic7XG5pbXBvcnQgZ2VvanNvbnZ0IGZyb20gJ2dlb2pzb24tdnQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IFZlY3RvclRpbGVXb3JrZXJTb3VyY2UgZnJvbSAnLi92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlLmpzJztcbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcblxuaW1wb3J0IHR5cGUge1xuICAgIFJlcXVlc3RlZFRpbGVQYXJhbWV0ZXJzLFxuICAgIFdvcmtlclRpbGVQYXJhbWV0ZXJzLFxuICAgIFdvcmtlclRpbGVDYWxsYmFjayxcbn0gZnJvbSAnLi4vc291cmNlL3dvcmtlcl9zb3VyY2UuanMnO1xuXG5pbXBvcnQgdHlwZSBBY3RvciBmcm9tICcuLi91dGlsL2FjdG9yLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXJJbmRleCBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcl9pbmRleC5qcyc7XG5cbmltcG9ydCB0eXBlIHtMb2FkVmVjdG9yRGF0YUNhbGxiYWNrfSBmcm9tICcuL3ZlY3Rvcl90aWxlX3dvcmtlcl9zb3VyY2UuanMnO1xuaW1wb3J0IHR5cGUge1JlcXVlc3RQYXJhbWV0ZXJzLCBSZXNwb25zZUNhbGxiYWNrfSBmcm9tICcuLi91dGlsL2FqYXguanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTkZlYXR1cmV9IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5cbmV4cG9ydCB0eXBlIExvYWRHZW9KU09OUGFyYW1ldGVycyA9IHtcbiAgICByZXF1ZXN0PzogUmVxdWVzdFBhcmFtZXRlcnMsXG4gICAgZGF0YT86IHN0cmluZyxcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBjbHVzdGVyOiBib29sZWFuLFxuICAgIHN1cGVyY2x1c3Rlck9wdGlvbnM/OiBPYmplY3QsXG4gICAgZ2VvanNvblZ0T3B0aW9ucz86IE9iamVjdCxcbiAgICBjbHVzdGVyUHJvcGVydGllcz86IE9iamVjdCxcbiAgICBmaWx0ZXI/OiBBcnJheTxtaXhlZD5cbn07XG5cbmV4cG9ydCB0eXBlIExvYWRHZW9KU09OID0gKHBhcmFtczogTG9hZEdlb0pTT05QYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxPYmplY3Q+KSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdlb0pTT05JbmRleCB7XG4gICAgZ2V0VGlsZSh6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogT2JqZWN0O1xuXG4gICAgLy8gc3VwZXJjbHVzdGVyIG1ldGhvZHNcbiAgICBnZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShjbHVzdGVySWQ6IG51bWJlcik6IG51bWJlcjtcbiAgICBnZXRDaGlsZHJlbihjbHVzdGVySWQ6IG51bWJlcik6IEFycmF5PEdlb0pTT05GZWF0dXJlPjtcbiAgICBnZXRMZWF2ZXMoY2x1c3RlcklkOiBudW1iZXIsIGxpbWl0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyKTogQXJyYXk8R2VvSlNPTkZlYXR1cmU+O1xufVxuXG5mdW5jdGlvbiBsb2FkR2VvSlNPTlRpbGUocGFyYW1zOiBSZXF1ZXN0ZWRUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IExvYWRWZWN0b3JEYXRhQ2FsbGJhY2spIHtcbiAgICBjb25zdCBjYW5vbmljYWwgPSBwYXJhbXMudGlsZUlELmNhbm9uaWNhbDtcblxuICAgIGlmICghdGhpcy5fZ2VvSlNPTkluZGV4KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTsgIC8vIHdlIGNvdWxkbid0IGxvYWQgdGhlIGZpbGVcbiAgICB9XG5cbiAgICBjb25zdCBnZW9KU09OVGlsZSA9IHRoaXMuX2dlb0pTT05JbmRleC5nZXRUaWxlKGNhbm9uaWNhbC56LCBjYW5vbmljYWwueCwgY2Fub25pY2FsLnkpO1xuICAgIGlmICghZ2VvSlNPTlRpbGUpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG51bGwpOyAvLyBub3RoaW5nIGluIHRoZSBnaXZlbiB0aWxlXG4gICAgfVxuXG4gICAgY29uc3QgZ2VvanNvbldyYXBwZXIgPSBuZXcgR2VvSlNPTldyYXBwZXIoZ2VvSlNPTlRpbGUuZmVhdHVyZXMpO1xuXG4gICAgLy8gRW5jb2RlIHRoZSBnZW9qc29uLXZ0IHRpbGUgaW50byBiaW5hcnkgdmVjdG9yIHRpbGUgZm9ybS4gIFRoaXNcbiAgICAvLyBpcyBhIGNvbnZlbmllbmNlIHRoYXQgYWxsb3dzIGBGZWF0dXJlSW5kZXhgIHRvIG9wZXJhdGUgdGhlIHNhbWUgd2F5XG4gICAgLy8gYWNyb3NzIGBWZWN0b3JUaWxlU291cmNlYCBhbmQgYEdlb0pTT05Tb3VyY2VgIGRhdGEuXG4gICAgbGV0IHBiZiA9IHZ0cGJmKGdlb2pzb25XcmFwcGVyKTtcbiAgICBpZiAocGJmLmJ5dGVPZmZzZXQgIT09IDAgfHwgcGJmLmJ5dGVMZW5ndGggIT09IHBiZi5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAvLyBDb21wYXRpYmlsaXR5IHdpdGggbm9kZSBCdWZmZXIgKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvcGJmL2lzc3Vlcy8zNSlcbiAgICAgICAgcGJmID0gbmV3IFVpbnQ4QXJyYXkocGJmKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHZlY3RvclRpbGU6IGdlb2pzb25XcmFwcGVyLFxuICAgICAgICByYXdEYXRhOiBwYmYuYnVmZmVyXG4gICAgfSk7XG59XG5cbi8qKlxuICogVGhlIHtAbGluayBXb3JrZXJTb3VyY2V9IGltcGxlbWVudGF0aW9uIHRoYXQgc3VwcG9ydHMge0BsaW5rIEdlb0pTT05Tb3VyY2V9LlxuICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBlYXNpbHkgcmV1c2VkIHRvIHN1cHBvcnQgY3VzdG9tIHNvdXJjZSB0eXBlc1xuICogZm9yIGRhdGEgZm9ybWF0cyB0aGF0IGNhbiBiZSBwYXJzZWQvY29udmVydGVkIGludG8gYW4gaW4tbWVtb3J5IEdlb0pTT05cbiAqIHJlcHJlc2VudGF0aW9uLiAgVG8gZG8gc28sIGNyZWF0ZSBpdCB3aXRoXG4gKiBgbmV3IEdlb0pTT05Xb3JrZXJTb3VyY2UoYWN0b3IsIGxheWVySW5kZXgsIGN1c3RvbUxvYWRHZW9KU09ORnVuY3Rpb24pYC5cbiAqIEZvciBhIGZ1bGwgZXhhbXBsZSwgc2VlIFttYXBib3gtZ2wtdG9wb2pzb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZlbG9wbWVudHNlZWQvbWFwYm94LWdsLXRvcG9qc29uKS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBHZW9KU09OV29ya2VyU291cmNlIGV4dGVuZHMgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSB7XG4gICAgbG9hZEdlb0pTT046IExvYWRHZW9KU09OO1xuICAgIF9nZW9KU09OSW5kZXg6IEdlb0pTT05JbmRleFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIFtsb2FkR2VvSlNPTl0gT3B0aW9uYWwgbWV0aG9kIGZvciBjdXN0b20gbG9hZGluZy9wYXJzaW5nIG9mXG4gICAgICogR2VvSlNPTiBiYXNlZCBvbiBwYXJhbWV0ZXJzIHBhc3NlZCBmcm9tIHRoZSBtYWluLXRocmVhZCBTb3VyY2UuXG4gICAgICogU2VlIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2xvYWRHZW9KU09OfS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFjdG9yOiBBY3RvciwgbGF5ZXJJbmRleDogU3R5bGVMYXllckluZGV4LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGlzU3ByaXRlTG9hZGVkOiBib29sZWFuLCBsb2FkR2VvSlNPTjogP0xvYWRHZW9KU09OKSB7XG4gICAgICAgIHN1cGVyKGFjdG9yLCBsYXllckluZGV4LCBhdmFpbGFibGVJbWFnZXMsIGlzU3ByaXRlTG9hZGVkLCBsb2FkR2VvSlNPTlRpbGUpO1xuICAgICAgICBpZiAobG9hZEdlb0pTT04pIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEdlb0pTT04gPSBsb2FkR2VvSlNPTjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgKGlmIGFwcHJvcHJpYXRlKSwgcGFyc2VzLCBhbmQgaW5kZXggZ2VvanNvbiBkYXRhIGludG8gdGlsZXMuIFRoaXNcbiAgICAgKiBwcmVwYXJhdG9yeSBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2xvYWRUaWxlfVxuICAgICAqIGNhbiBjb3JyZWN0bHkgc2VydmUgdXAgdGlsZXMuXG4gICAgICpcbiAgICAgKiBEZWZlcnMgdG8ge0BsaW5rIEdlb0pTT05Xb3JrZXJTb3VyY2UjbG9hZEdlb0pTT059IGZvciB0aGUgZmV0Y2hpbmcvcGFyc2luZyxcbiAgICAgKiBleHBlY3RpbmcgYGNhbGxiYWNrKGVycm9yLCBkYXRhKWAgdG8gYmUgY2FsbGVkIHdpdGggZWl0aGVyIGFuIGVycm9yIG9yIGFcbiAgICAgKiBwYXJzZWQgR2VvSlNPTiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBXaGVuIGBsb2FkRGF0YWAgcmVxdWVzdHMgY29tZSBpbiBmYXN0ZXIgdGhhbiB0aGV5IGNhbiBiZSBwcm9jZXNzZWQsXG4gICAgICogdGhleSBhcmUgY29hbGVzY2VkIGludG8gYSBzaW5nbGUgcmVxdWVzdCB1c2luZyB0aGUgbGF0ZXN0IGRhdGEuXG4gICAgICogU2VlIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2NvYWxlc2NlfVxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwYXJhbSBjYWxsYmFja1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZERhdGEocGFyYW1zOiBMb2FkR2VvSlNPTlBhcmFtZXRlcnMsIGNhbGxiYWNrOiBDYWxsYmFjazx7cmVzb3VyY2VUaW1pbmc/OiB7W186IHN0cmluZ106IEFycmF5PFBlcmZvcm1hbmNlUmVzb3VyY2VUaW1pbmc+fX0+KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXJhbSA9IHBhcmFtcyAmJiBwYXJhbXMucmVxdWVzdDtcbiAgICAgICAgY29uc3QgcGVyZiA9IHJlcXVlc3RQYXJhbSAmJiByZXF1ZXN0UGFyYW0uY29sbGVjdFJlc291cmNlVGltaW5nO1xuXG4gICAgICAgIHRoaXMubG9hZEdlb0pTT04ocGFyYW1zLCAoZXJyOiA/RXJyb3IsIGRhdGE6ID9PYmplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIgfHwgIWRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW5wdXQgZGF0YSBnaXZlbiB0byAnJHtwYXJhbXMuc291cmNlfScgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuYCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXdpbmQoZGF0YSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGlsZWQgPSBjcmVhdGVFeHByZXNzaW9uKHBhcmFtcy5maWx0ZXIsIHt0eXBlOiAnYm9vbGVhbicsICdwcm9wZXJ0eS10eXBlJzogJ2RhdGEtZHJpdmVuJywgb3ZlcnJpZGFibGU6IGZhbHNlLCB0cmFuc2l0aW9uOiBmYWxzZX0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVkLnJlc3VsdCA9PT0gJ2Vycm9yJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29tcGlsZWQudmFsdWUubWFwKGVyciA9PiBgJHtlcnIua2V5fTogJHtlcnIubWVzc2FnZX1gKS5qb2luKCcsICcpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBkYXRhLmZlYXR1cmVzLmZpbHRlcihmZWF0dXJlID0+IGNvbXBpbGVkLnZhbHVlLmV2YWx1YXRlKHt6b29tOiAwfSwgZmVhdHVyZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHt0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLCBmZWF0dXJlc307XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW9KU09OSW5kZXggPSBwYXJhbXMuY2x1c3RlciA/XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3VwZXJjbHVzdGVyKGdldFN1cGVyY2x1c3Rlck9wdGlvbnMocGFyYW1zKSkubG9hZChkYXRhLmZlYXR1cmVzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9qc29udnQoZGF0YSwgcGFyYW1zLmdlb2pzb25WdE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHt9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgICAgICAgICAgaWYgKHBlcmYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VUaW1pbmdEYXRhID0gZ2V0UGVyZm9ybWFuY2VNZWFzdXJlbWVudChyZXF1ZXN0UGFyYW0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIG5lY2Vzc2FyeSB0byBldmFsIHRoZSByZXN1bHQgb2YgZ2V0RW50cmllc0J5TmFtZSgpIGhlcmUgdmlhIHBhcnNlL3N0cmluZ2lmeVxuICAgICAgICAgICAgICAgICAgICAvLyBsYXRlIGV2YWx1YXRpb24gaW4gdGhlIG1haW4gdGhyZWFkIGNhdXNlcyBUeXBlRXJyb3I6IGlsbGVnYWwgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VUaW1pbmdEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzb3VyY2VUaW1pbmcgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXNvdXJjZVRpbWluZ1twYXJhbXMuc291cmNlXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzb3VyY2VUaW1pbmdEYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBJbXBsZW1lbnRzIHtAbGluayBXb3JrZXJTb3VyY2UjcmVsb2FkVGlsZX0uXG4gICAgKlxuICAgICogSWYgdGhlIHRpbGUgaXMgbG9hZGVkLCB1c2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiBWZWN0b3JUaWxlV29ya2VyU291cmNlLlxuICAgICogT3RoZXJ3aXNlLCBzdWNoIGFzIGFmdGVyIGEgc2V0RGF0YSgpIGNhbGwsIHdlIGxvYWQgdGhlIHRpbGUgZnJlc2guXG4gICAgKlxuICAgICogQHBhcmFtIHBhcmFtc1xuICAgICogQHBhcmFtIHBhcmFtcy51aWQgVGhlIFVJRCBmb3IgdGhpcyB0aWxlLlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIHJlbG9hZFRpbGUocGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLmxvYWRlZCxcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQ7XG5cbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlbG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkVGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGFuZCBwYXJzZSBHZW9KU09OIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gcGFyYW1zLiAgQ2FsbHMgYGNhbGxiYWNrYFxuICAgICAqIHdpdGggYChlcnIsIGRhdGEpYCwgd2hlcmUgYGRhdGFgIGlzIGEgcGFyc2VkIEdlb0pTT04gb2JqZWN0LlxuICAgICAqXG4gICAgICogR2VvSlNPTiBpcyBsb2FkZWQgYW5kIHBhcnNlZCBmcm9tIGBwYXJhbXMudXJsYCBpZiBpdCBleGlzdHMsIG9yIGVsc2VcbiAgICAgKiBleHBlY3RlZCBhcyBhIGxpdGVyYWwgKHN0cmluZyBvciBvYmplY3QpIGBwYXJhbXMuZGF0YWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICogQHBhcmFtIFtwYXJhbXMudXJsXSBBIFVSTCB0byB0aGUgcmVtb3RlIEdlb0pTT04gZGF0YS5cbiAgICAgKiBAcGFyYW0gW3BhcmFtcy5kYXRhXSBMaXRlcmFsIEdlb0pTT04gZGF0YS4gTXVzdCBiZSBwcm92aWRlZCBpZiBgcGFyYW1zLnVybGAgaXMgbm90LlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZEdlb0pTT04ocGFyYW1zOiBMb2FkR2VvSlNPTlBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPE9iamVjdD4pIHtcbiAgICAgICAgLy8gQmVjYXVzZSBvZiBzYW1lIG9yaWdpbiBpc3N1ZXMsIHVybHMgbXVzdCBlaXRoZXIgaW5jbHVkZSBhbiBleHBsaWNpdFxuICAgICAgICAvLyBvcmlnaW4gb3IgYWJzb2x1dGUgcGF0aC5cbiAgICAgICAgLy8gaWU6IC9mb28vYmFyLmpzb24gb3IgaHR0cDovL2V4YW1wbGUuY29tL2Jhci5qc29uXG4gICAgICAgIC8vIGJ1dCBub3QgLi4vZm9vL2Jhci5qc29uXG4gICAgICAgIGlmIChwYXJhbXMucmVxdWVzdCkge1xuICAgICAgICAgICAgZ2V0SlNPTihwYXJhbXMucmVxdWVzdCwgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXMuZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIEpTT04ucGFyc2UocGFyYW1zLmRhdGEpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBJbnB1dCBkYXRhIGdpdmVuIHRvICcke3BhcmFtcy5zb3VyY2V9JyBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBJbnB1dCBkYXRhIGdpdmVuIHRvICcke3BhcmFtcy5zb3VyY2V9JyBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5gKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShwYXJhbXM6IHtjbHVzdGVySWQ6IG51bWJlcn0sIGNhbGxiYWNrOiBDYWxsYmFjazxudW1iZXI+KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzLl9nZW9KU09OSW5kZXguZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20ocGFyYW1zLmNsdXN0ZXJJZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENsdXN0ZXJDaGlsZHJlbihwYXJhbXM6IHtjbHVzdGVySWQ6IG51bWJlcn0sIGNhbGxiYWNrOiBDYWxsYmFjazxBcnJheTxHZW9KU09ORmVhdHVyZT4+KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzLl9nZW9KU09OSW5kZXguZ2V0Q2hpbGRyZW4ocGFyYW1zLmNsdXN0ZXJJZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENsdXN0ZXJMZWF2ZXMocGFyYW1zOiB7Y2x1c3RlcklkOiBudW1iZXIsIGxpbWl0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyfSwgY2FsbGJhY2s6IENhbGxiYWNrPEFycmF5PEdlb0pTT05GZWF0dXJlPj4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoaXMuX2dlb0pTT05JbmRleC5nZXRMZWF2ZXMocGFyYW1zLmNsdXN0ZXJJZCwgcGFyYW1zLmxpbWl0LCBwYXJhbXMub2Zmc2V0KSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRTdXBlcmNsdXN0ZXJPcHRpb25zKHtzdXBlcmNsdXN0ZXJPcHRpb25zLCBjbHVzdGVyUHJvcGVydGllc30pIHtcbiAgICBpZiAoIWNsdXN0ZXJQcm9wZXJ0aWVzIHx8ICFzdXBlcmNsdXN0ZXJPcHRpb25zKSByZXR1cm4gc3VwZXJjbHVzdGVyT3B0aW9ucztcblxuICAgIGNvbnN0IG1hcEV4cHJlc3Npb25zID0ge307XG4gICAgY29uc3QgcmVkdWNlRXhwcmVzc2lvbnMgPSB7fTtcbiAgICBjb25zdCBnbG9iYWxzID0ge2FjY3VtdWxhdGVkOiBudWxsLCB6b29tOiAwfTtcbiAgICBjb25zdCBmZWF0dXJlID0ge3Byb3BlcnRpZXM6IG51bGx9O1xuICAgIGNvbnN0IHByb3BlcnR5TmFtZXMgPSBPYmplY3Qua2V5cyhjbHVzdGVyUHJvcGVydGllcyk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IFtvcGVyYXRvciwgbWFwRXhwcmVzc2lvbl0gPSBjbHVzdGVyUHJvcGVydGllc1trZXldO1xuXG4gICAgICAgIGNvbnN0IG1hcEV4cHJlc3Npb25QYXJzZWQgPSBjcmVhdGVFeHByZXNzaW9uKG1hcEV4cHJlc3Npb24pO1xuICAgICAgICBjb25zdCByZWR1Y2VFeHByZXNzaW9uUGFyc2VkID0gY3JlYXRlRXhwcmVzc2lvbihcbiAgICAgICAgICAgIHR5cGVvZiBvcGVyYXRvciA9PT0gJ3N0cmluZycgPyBbb3BlcmF0b3IsIFsnYWNjdW11bGF0ZWQnXSwgWydnZXQnLCBrZXldXSA6IG9wZXJhdG9yKTtcblxuICAgICAgICBhc3NlcnQobWFwRXhwcmVzc2lvblBhcnNlZC5yZXN1bHQgPT09ICdzdWNjZXNzJyk7XG4gICAgICAgIGFzc2VydChyZWR1Y2VFeHByZXNzaW9uUGFyc2VkLnJlc3VsdCA9PT0gJ3N1Y2Nlc3MnKTtcblxuICAgICAgICBtYXBFeHByZXNzaW9uc1trZXldID0gbWFwRXhwcmVzc2lvblBhcnNlZC52YWx1ZTtcbiAgICAgICAgcmVkdWNlRXhwcmVzc2lvbnNba2V5XSA9IHJlZHVjZUV4cHJlc3Npb25QYXJzZWQudmFsdWU7XG4gICAgfVxuXG4gICAgc3VwZXJjbHVzdGVyT3B0aW9ucy5tYXAgPSAocG9pbnRQcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllcyA9IHBvaW50UHJvcGVydGllcztcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzW2tleV0gPSBtYXBFeHByZXNzaW9uc1trZXldLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH07XG4gICAgc3VwZXJjbHVzdGVyT3B0aW9ucy5yZWR1Y2UgPSAoYWNjdW11bGF0ZWQsIGNsdXN0ZXJQcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllcyA9IGNsdXN0ZXJQcm9wZXJ0aWVzO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICBnbG9iYWxzLmFjY3VtdWxhdGVkID0gYWNjdW11bGF0ZWRba2V5XTtcbiAgICAgICAgICAgIGFjY3VtdWxhdGVkW2tleV0gPSByZWR1Y2VFeHByZXNzaW9uc1trZXldLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBzdXBlcmNsdXN0ZXJPcHRpb25zO1xufVxuXG5leHBvcnQgZGVmYXVsdCBHZW9KU09OV29ya2VyU291cmNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3IuanMnO1xuXG5pbXBvcnQgU3R5bGVMYXllckluZGV4IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4LmpzJztcbmltcG9ydCBWZWN0b3JUaWxlV29ya2VyU291cmNlIGZyb20gJy4vdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZS5qcyc7XG5pbXBvcnQgUmFzdGVyREVNVGlsZVdvcmtlclNvdXJjZSBmcm9tICcuL3Jhc3Rlcl9kZW1fdGlsZV93b3JrZXJfc291cmNlLmpzJztcbmltcG9ydCBHZW9KU09OV29ya2VyU291cmNlIGZyb20gJy4vZ2VvanNvbl93b3JrZXJfc291cmNlLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7cGx1Z2luIGFzIGdsb2JhbFJUTFRleHRQbHVnaW59IGZyb20gJy4vcnRsX3RleHRfcGx1Z2luLmpzJztcbmltcG9ydCB7ZW5mb3JjZUNhY2hlU2l6ZUxpbWl0fSBmcm9tICcuLi91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZS5qcyc7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7UGVyZm9ybWFuY2VVdGlsc30gZnJvbSAnLi4vdXRpbC9wZXJmb3JtYW5jZS5qcyc7XG5pbXBvcnQge0V2ZW50fSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHtnZXRQcm9qZWN0aW9ufSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9pbmRleC5qcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBXb3JrZXJTb3VyY2UsXG4gICAgV29ya2VyVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyREVNVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyVGlsZUNhbGxiYWNrLFxuICAgIFdvcmtlckRFTVRpbGVDYWxsYmFjayxcbiAgICBUaWxlUGFyYW1ldGVyc1xufSBmcm9tICcuLi9zb3VyY2Uvd29ya2VyX3NvdXJjZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtXb3JrZXJHbG9iYWxTY29wZUludGVyZmFjZX0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyLmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbiwgUHJvamVjdGlvblNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1BsdWdpblN0YXRlfSBmcm9tICcuL3J0bF90ZXh0X3BsdWdpbi5qcyc7XG5pbXBvcnQgdHlwZSB7UHJvamVjdGlvbn0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vaW5kZXguanMnO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdvcmtlciB7XG4gICAgc2VsZjogV29ya2VyR2xvYmFsU2NvcGVJbnRlcmZhY2U7XG4gICAgYWN0b3I6IEFjdG9yO1xuICAgIGxheWVySW5kZXhlczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVySW5kZXggfTtcbiAgICBhdmFpbGFibGVJbWFnZXM6IHtbXzogc3RyaW5nXTogQXJyYXk8c3RyaW5nPiB9O1xuICAgIHdvcmtlclNvdXJjZVR5cGVzOiB7W186IHN0cmluZ106IENsYXNzPFdvcmtlclNvdXJjZT4gfTtcbiAgICB3b3JrZXJTb3VyY2VzOiB7W186IHN0cmluZ106IHtbXzogc3RyaW5nXToge1tfOiBzdHJpbmddOiBXb3JrZXJTb3VyY2UgfSB9IH07XG4gICAgZGVtV29ya2VyU291cmNlczoge1tfOiBzdHJpbmddOiB7W186IHN0cmluZ106IFJhc3RlckRFTVRpbGVXb3JrZXJTb3VyY2UgfSB9O1xuICAgIHByb2plY3Rpb25zOiB7W186IHN0cmluZ106IFByb2plY3Rpb24gfTtcbiAgICBkZWZhdWx0UHJvamVjdGlvbjogUHJvamVjdGlvbjtcbiAgICBpc1Nwcml0ZUxvYWRlZDoge1tfOiBzdHJpbmddOiBib29sZWFuIH07XG4gICAgcmVmZXJyZXI6ID9zdHJpbmc7XG4gICAgdGVycmFpbjogP2Jvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihzZWxmOiBXb3JrZXJHbG9iYWxTY29wZUludGVyZmFjZSkge1xuICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLm1lYXN1cmUoJ3dvcmtlckV2YWx1YXRlU2NyaXB0Jyk7XG4gICAgICAgIHRoaXMuc2VsZiA9IHNlbGY7XG4gICAgICAgIHRoaXMuYWN0b3IgPSBuZXcgQWN0b3Ioc2VsZiwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5sYXllckluZGV4ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVJbWFnZXMgPSB7fTtcbiAgICAgICAgdGhpcy5pc1Nwcml0ZUxvYWRlZCA9IHt9O1xuXG4gICAgICAgIHRoaXMucHJvamVjdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5kZWZhdWx0UHJvamVjdGlvbiA9IGdldFByb2plY3Rpb24oe25hbWU6ICdtZXJjYXRvcid9KTtcblxuICAgICAgICB0aGlzLndvcmtlclNvdXJjZVR5cGVzID0ge1xuICAgICAgICAgICAgdmVjdG9yOiBWZWN0b3JUaWxlV29ya2VyU291cmNlLFxuICAgICAgICAgICAgZ2VvanNvbjogR2VvSlNPTldvcmtlclNvdXJjZVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFttYXBJZF1bc291cmNlVHlwZV1bc291cmNlTmFtZV0gPT4gd29ya2VyIHNvdXJjZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLndvcmtlclNvdXJjZXMgPSB7fTtcbiAgICAgICAgdGhpcy5kZW1Xb3JrZXJTb3VyY2VzID0ge307XG5cbiAgICAgICAgdGhpcy5zZWxmLnJlZ2lzdGVyV29ya2VyU291cmNlID0gKG5hbWU6IHN0cmluZywgV29ya2VyU291cmNlOiBDbGFzczxXb3JrZXJTb3VyY2U+KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy53b3JrZXJTb3VyY2VUeXBlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV29ya2VyIHNvdXJjZSB3aXRoIG5hbWUgXCIke25hbWV9XCIgYWxyZWFkeSByZWdpc3RlcmVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VUeXBlc1tuYW1lXSA9IFdvcmtlclNvdXJjZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUaGlzIGlzIGludm9rZWQgYnkgdGhlIFJUTCB0ZXh0IHBsdWdpbiB3aGVuIHRoZSBkb3dubG9hZCB2aWEgdGhlIGBpbXBvcnRTY3JpcHRzYCBjYWxsIGhhcyBmaW5pc2hlZCwgYW5kIHRoZSBjb2RlIGhhcyBiZWVuIHBhcnNlZC5cbiAgICAgICAgdGhpcy5zZWxmLnJlZ2lzdGVyUlRMVGV4dFBsdWdpbiA9IChydGxUZXh0UGx1Z2luOiB7YXBwbHlBcmFiaWNTaGFwaW5nOiBGdW5jdGlvbiwgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0OiBGdW5jdGlvbiwgcHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0PzogRnVuY3Rpb259KSA9PiB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsUlRMVGV4dFBsdWdpbi5pc1BhcnNlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSVEwgdGV4dCBwbHVnaW4gYWxyZWFkeSByZWdpc3RlcmVkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2xvYmFsUlRMVGV4dFBsdWdpblsnYXBwbHlBcmFiaWNTaGFwaW5nJ10gPSBydGxUZXh0UGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZztcbiAgICAgICAgICAgIGdsb2JhbFJUTFRleHRQbHVnaW5bJ3Byb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCddID0gcnRsVGV4dFBsdWdpbi5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQ7XG4gICAgICAgICAgICBnbG9iYWxSVExUZXh0UGx1Z2luWydwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQnXSA9IHJ0bFRleHRQbHVnaW4ucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNsZWFyQ2FjaGVzKG1hcElkOiBzdHJpbmcsIHVudXNlZDogbWl4ZWQsIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgZGVsZXRlIHRoaXMubGF5ZXJJbmRleGVzW21hcElkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuYXZhaWxhYmxlSW1hZ2VzW21hcElkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGNoZWNrSWZSZWFkeShtYXBJRDogc3RyaW5nLCB1bnVzZWQ6IG1peGVkLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIC8vIG5vb3AsIHVzZWQgdG8gY2hlY2sgaWYgYSB3b3JrZXIgaXMgZnVsbHkgc2V0IHVwIGFuZCByZWFkeSB0byByZWNlaXZlIG1lc3NhZ2VzXG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgc2V0UmVmZXJyZXIobWFwSUQ6IHN0cmluZywgcmVmZXJyZXI6IHN0cmluZykge1xuICAgICAgICB0aGlzLnJlZmVycmVyID0gcmVmZXJyZXI7XG4gICAgfVxuXG4gICAgc3ByaXRlTG9hZGVkKG1hcElkOiBzdHJpbmcsIGJvb2w6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5pc1Nwcml0ZUxvYWRlZFttYXBJZF0gPSBib29sO1xuICAgICAgICBmb3IgKGNvbnN0IHdvcmtlclNvdXJjZSBpbiB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdKSB7XG4gICAgICAgICAgICBjb25zdCB3cyA9IHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bd29ya2VyU291cmNlXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlIGluIHdzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdzW3NvdXJjZV0gaW5zdGFuY2VvZiBWZWN0b3JUaWxlV29ya2VyU291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdzW3NvdXJjZV0uaXNTcHJpdGVMb2FkZWQgPSBib29sO1xuICAgICAgICAgICAgICAgICAgICB3c1tzb3VyY2VdLmZpcmUobmV3IEV2ZW50KCdpc1Nwcml0ZUxvYWRlZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJbWFnZXMobWFwSWQ6IHN0cmluZywgaW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlSW1hZ2VzW21hcElkXSA9IGltYWdlcztcbiAgICAgICAgZm9yIChjb25zdCB3b3JrZXJTb3VyY2UgaW4gdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXSkge1xuICAgICAgICAgICAgY29uc3Qgd3MgPSB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3dvcmtlclNvdXJjZV07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBpbiB3cykge1xuICAgICAgICAgICAgICAgIHdzW3NvdXJjZV0uYXZhaWxhYmxlSW1hZ2VzID0gaW1hZ2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZW5hYmxlVGVycmFpbihtYXBJZDogc3RyaW5nLCBlbmFibGU6IGJvb2xlYW4sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy50ZXJyYWluID0gZW5hYmxlO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHNldFByb2plY3Rpb24obWFwSWQ6IHN0cmluZywgY29uZmlnOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLnByb2plY3Rpb25zW21hcElkXSA9IGdldFByb2plY3Rpb24oY29uZmlnKTtcbiAgICB9XG5cbiAgICBzZXRMYXllcnMobWFwSWQ6IHN0cmluZywgbGF5ZXJzOiBBcnJheTxMYXllclNwZWNpZmljYXRpb24+LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuZ2V0TGF5ZXJJbmRleChtYXBJZCkucmVwbGFjZShsYXllcnMpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHVwZGF0ZUxheWVycyhtYXBJZDogc3RyaW5nLCBwYXJhbXM6IHtsYXllcnM6IEFycmF5PExheWVyU3BlY2lmaWNhdGlvbj4sIHJlbW92ZWRJZHM6IEFycmF5PHN0cmluZz59LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuZ2V0TGF5ZXJJbmRleChtYXBJZCkudXBkYXRlKHBhcmFtcy5sYXllcnMsIHBhcmFtcy5yZW1vdmVkSWRzKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzICYge3R5cGU6IHN0cmluZ30sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlKTtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMuZW5hYmxlVGVycmFpbiA/IGV4dGVuZCh7ZW5hYmxlVGVycmFpbjogdGhpcy50ZXJyYWlufSwgcGFyYW1zKSA6IHBhcmFtcztcbiAgICAgICAgcC5wcm9qZWN0aW9uID0gdGhpcy5wcm9qZWN0aW9uc1ttYXBJZF0gfHwgdGhpcy5kZWZhdWx0UHJvamVjdGlvbjtcbiAgICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy50eXBlLCBwYXJhbXMuc291cmNlKS5sb2FkVGlsZShwLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgbG9hZERFTVRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBXb3JrZXJERU1UaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlckRFTVRpbGVDYWxsYmFjaykge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5lbmFibGVUZXJyYWluID8gZXh0ZW5kKHtidWlsZFF1YWRUcmVlOiB0aGlzLnRlcnJhaW59LCBwYXJhbXMpIDogcGFyYW1zO1xuICAgICAgICB0aGlzLmdldERFTVdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnNvdXJjZSkubG9hZFRpbGUocCwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHJlbG9hZFRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycyAmIHt0eXBlOiBzdHJpbmd9LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmVuYWJsZVRlcnJhaW4gPyBleHRlbmQoe2VuYWJsZVRlcnJhaW46IHRoaXMudGVycmFpbn0sIHBhcmFtcykgOiBwYXJhbXM7XG4gICAgICAgIHAucHJvamVjdGlvbiA9IHRoaXMucHJvamVjdGlvbnNbbWFwSWRdIHx8IHRoaXMuZGVmYXVsdFByb2plY3Rpb247XG4gICAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSwgcGFyYW1zLnNvdXJjZSkucmVsb2FkVGlsZShwLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgYWJvcnRUaWxlKG1hcElkOiBzdHJpbmcsIHBhcmFtczogVGlsZVBhcmFtZXRlcnMgJiB7dHlwZTogc3RyaW5nfSwgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xuICAgICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnR5cGUsIHBhcmFtcy5zb3VyY2UpLmFib3J0VGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICByZW1vdmVUaWxlKG1hcElkOiBzdHJpbmcsIHBhcmFtczogVGlsZVBhcmFtZXRlcnMgJiB7dHlwZTogc3RyaW5nfSwgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xuICAgICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnR5cGUsIHBhcmFtcy5zb3VyY2UpLnJlbW92ZVRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcmVtb3ZlU291cmNlKG1hcElkOiBzdHJpbmcsIHBhcmFtczoge3NvdXJjZTogc3RyaW5nfSAmIHt0eXBlOiBzdHJpbmd9LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIGFzc2VydChwYXJhbXMuc291cmNlKTtcblxuICAgICAgICBpZiAoIXRoaXMud29ya2VyU291cmNlc1ttYXBJZF0gfHxcbiAgICAgICAgICAgICF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3BhcmFtcy50eXBlXSB8fFxuICAgICAgICAgICAgIXRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bcGFyYW1zLnR5cGVdW3BhcmFtcy5zb3VyY2VdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3b3JrZXIgPSB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3BhcmFtcy50eXBlXVtwYXJhbXMuc291cmNlXTtcbiAgICAgICAgZGVsZXRlIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bcGFyYW1zLnR5cGVdW3BhcmFtcy5zb3VyY2VdO1xuXG4gICAgICAgIGlmICh3b3JrZXIucmVtb3ZlU291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdvcmtlci5yZW1vdmVTb3VyY2UocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHtAbGluayBXb3JrZXJTb3VyY2V9IHNjcmlwdCBhdCBwYXJhbXMudXJsLiAgVGhlIHNjcmlwdCBpcyBydW5cbiAgICAgKiAodXNpbmcgaW1wb3J0U2NyaXB0cykgd2l0aCBgcmVnaXN0ZXJXb3JrZXJTb3VyY2VgIGluIHNjb3BlLCB3aGljaCBpcyBhXG4gICAgICogZnVuY3Rpb24gdGFraW5nIGAobmFtZSwgd29ya2VyU291cmNlT2JqZWN0KWAuXG4gICAgICogIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZFdvcmtlclNvdXJjZShtYXA6IHN0cmluZywgcGFyYW1zOiB7IHVybDogc3RyaW5nIH0sIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zZWxmLmltcG9ydFNjcmlwdHMocGFyYW1zLnVybCk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3luY1JUTFBsdWdpblN0YXRlKG1hcDogc3RyaW5nLCBzdGF0ZTogUGx1Z2luU3RhdGUsIGNhbGxiYWNrOiBDYWxsYmFjazxib29sZWFuPikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZ2xvYmFsUlRMVGV4dFBsdWdpbi5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW5VUkwgPSBnbG9iYWxSVExUZXh0UGx1Z2luLmdldFBsdWdpblVSTCgpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGdsb2JhbFJUTFRleHRQbHVnaW4uaXNMb2FkZWQoKSAmJlxuICAgICAgICAgICAgICAgICFnbG9iYWxSVExUZXh0UGx1Z2luLmlzUGFyc2VkKCkgJiZcbiAgICAgICAgICAgICAgICBwbHVnaW5VUkwgIT0gbnVsbCAvLyBOb3QgcG9zc2libGUgd2hlbiBgaXNMb2FkZWRgIGlzIHRydWUsIGJ1dCBrZWVwcyBmbG93IGhhcHB5XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGYuaW1wb3J0U2NyaXB0cyhwbHVnaW5VUkwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlID0gZ2xvYmFsUlRMVGV4dFBsdWdpbi5pc1BhcnNlZCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gY29tcGxldGUgPyB1bmRlZmluZWQgOiBuZXcgRXJyb3IoYFJUTCBUZXh0IFBsdWdpbiBmYWlsZWQgdG8gaW1wb3J0IHNjcmlwdHMgZnJvbSAke3BsdWdpblVSTH1gKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnJvciwgY29tcGxldGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QXZhaWxhYmxlSW1hZ2VzKG1hcElkOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGF2YWlsYWJsZUltYWdlcyA9IHRoaXMuYXZhaWxhYmxlSW1hZ2VzW21hcElkXTtcblxuICAgICAgICBpZiAoIWF2YWlsYWJsZUltYWdlcykge1xuICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXZhaWxhYmxlSW1hZ2VzO1xuICAgIH1cblxuICAgIGdldExheWVySW5kZXgobWFwSWQ6IHN0cmluZykge1xuICAgICAgICBsZXQgbGF5ZXJJbmRleGVzID0gdGhpcy5sYXllckluZGV4ZXNbbWFwSWRdO1xuICAgICAgICBpZiAoIWxheWVySW5kZXhlcykge1xuICAgICAgICAgICAgbGF5ZXJJbmRleGVzID0gdGhpcy5sYXllckluZGV4ZXNbbWFwSWRdID0gbmV3IFN0eWxlTGF5ZXJJbmRleCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllckluZGV4ZXM7XG4gICAgfVxuXG4gICAgZ2V0V29ya2VyU291cmNlKG1hcElkOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdKVxuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXSA9IHt9O1xuICAgICAgICBpZiAoIXRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bdHlwZV0pXG4gICAgICAgICAgICB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3R5cGVdID0ge307XG5cbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3R5cGVdW3NvdXJjZV0pIHtcbiAgICAgICAgICAgIC8vIHVzZSBhIHdyYXBwZWQgYWN0b3Igc28gdGhhdCB3ZSBjYW4gYXR0YWNoIGEgdGFyZ2V0IG1hcElkIHBhcmFtXG4gICAgICAgICAgICAvLyB0byBhbnkgbWVzc2FnZXMgaW52b2tlZCBieSB0aGUgV29ya2VyU291cmNlXG4gICAgICAgICAgICBjb25zdCBhY3RvciA9IHtcbiAgICAgICAgICAgICAgICBzZW5kOiAodHlwZSwgZGF0YSwgY2FsbGJhY2ssIF8sIG11c3RRdWV1ZSwgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rvci5zZW5kKHR5cGUsIGRhdGEsIGNhbGxiYWNrLCBtYXBJZCwgbXVzdFF1ZXVlLCBtZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY2hlZHVsZXI6IHRoaXMuYWN0b3Iuc2NoZWR1bGVyXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXVtzb3VyY2VdID0gbmV3ICh0aGlzLndvcmtlclNvdXJjZVR5cGVzW3R5cGVdOiBhbnkpKChhY3RvcjogYW55KSwgdGhpcy5nZXRMYXllckluZGV4KG1hcElkKSwgdGhpcy5nZXRBdmFpbGFibGVJbWFnZXMobWFwSWQpLCB0aGlzLmlzU3ByaXRlTG9hZGVkW21hcElkXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXVtzb3VyY2VdO1xuICAgIH1cblxuICAgIGdldERFTVdvcmtlclNvdXJjZShtYXBJZDogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuZGVtV29ya2VyU291cmNlc1ttYXBJZF0pXG4gICAgICAgICAgICB0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdID0ge307XG5cbiAgICAgICAgaWYgKCF0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdW3NvdXJjZV0pIHtcbiAgICAgICAgICAgIHRoaXMuZGVtV29ya2VyU291cmNlc1ttYXBJZF1bc291cmNlXSA9IG5ldyBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW21hcElkXVtzb3VyY2VdO1xuICAgIH1cblxuICAgIGVuZm9yY2VDYWNoZVNpemVMaW1pdChtYXBJZDogc3RyaW5nLCBsaW1pdDogbnVtYmVyKSB7XG4gICAgICAgIGVuZm9yY2VDYWNoZVNpemVMaW1pdChsaW1pdCk7XG4gICAgfVxuXG4gICAgZ2V0V29ya2VyUGVyZm9ybWFuY2VNZXRyaWNzKG1hcElkOiBzdHJpbmcsIHBhcmFtczogYW55LCBjYWxsYmFjazogKGVycm9yOiA/RXJyb3IsIHJlc3VsdDogP09iamVjdCkgPT4gdm9pZCkge1xuICAgICAgICBjYWxsYmFjayh1bmRlZmluZWQsIFBlcmZvcm1hbmNlVXRpbHMuZ2V0V29ya2VyUGVyZm9ybWFuY2VNZXRyaWNzKCkpO1xuICAgIH1cbn1cblxuLyogZ2xvYmFsIHNlbGYsIFdvcmtlckdsb2JhbFNjb3BlICovXG5pZiAodHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSkge1xuICAgIHNlbGYud29ya2VyID0gbmV3IFdvcmtlcihzZWxmKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5zdXBwb3J0ZWQgPSBpc1N1cHBvcnRlZDtcbmV4cG9ydHMubm90U3VwcG9ydGVkUmVhc29uID0gbm90U3VwcG9ydGVkUmVhc29uO1xuXG4vKipcbiAqIFRlc3Qgd2hldGhlciB0aGUgY3VycmVudCBicm93c2VyIHN1cHBvcnRzIE1hcGJveCBHTCBKU1xuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdD1mYWxzZV0gUmV0dXJuIGBmYWxzZWBcbiAqICAgaWYgdGhlIHBlcmZvcm1hbmNlIG9mIE1hcGJveCBHTCBKUyB3b3VsZCBiZSBkcmFtYXRpY2FsbHkgd29yc2UgdGhhblxuICogICBleHBlY3RlZCAoaS5lLiBhIHNvZnR3YXJlIHJlbmRlcmVyIGlzIHdvdWxkIGJlIHVzZWQpXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1N1cHBvcnRlZChvcHRpb25zKSB7XG4gICAgcmV0dXJuICFub3RTdXBwb3J0ZWRSZWFzb24ob3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIG5vdFN1cHBvcnRlZFJlYXNvbihvcHRpb25zKSB7XG4gICAgaWYgKCFpc0Jyb3dzZXIoKSkgcmV0dXJuICdub3QgYSBicm93c2VyJztcbiAgICBpZiAoIWlzQXJyYXlTdXBwb3J0ZWQoKSkgcmV0dXJuICdpbnN1ZmZpY2VudCBBcnJheSBzdXBwb3J0JztcbiAgICBpZiAoIWlzRnVuY3Rpb25TdXBwb3J0ZWQoKSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgRnVuY3Rpb24gc3VwcG9ydCc7XG4gICAgaWYgKCFpc09iamVjdFN1cHBvcnRlZCgpKSByZXR1cm4gJ2luc3VmZmljaWVudCBPYmplY3Qgc3VwcG9ydCc7XG4gICAgaWYgKCFpc0pTT05TdXBwb3J0ZWQoKSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgSlNPTiBzdXBwb3J0JztcbiAgICBpZiAoIWlzV29ya2VyU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IHdvcmtlciBzdXBwb3J0JztcbiAgICBpZiAoIWlzVWludDhDbGFtcGVkQXJyYXlTdXBwb3J0ZWQoKSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgVWludDhDbGFtcGVkQXJyYXkgc3VwcG9ydCc7XG4gICAgaWYgKCFpc0FycmF5QnVmZmVyU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEFycmF5QnVmZmVyIHN1cHBvcnQnO1xuICAgIGlmICghaXNDYW52YXNHZXRJbWFnZURhdGFTdXBwb3J0ZWQoKSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgQ2FudmFzL2dldEltYWdlRGF0YSBzdXBwb3J0JztcbiAgICBpZiAoIWlzV2ViR0xTdXBwb3J0ZWRDYWNoZWQob3B0aW9ucyAmJiBvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpKSByZXR1cm4gJ2luc3VmZmljaWVudCBXZWJHTCBzdXBwb3J0JztcbiAgICBpZiAoIWlzTm90SUUoKSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgRUNNQVNjcmlwdCA2IHN1cHBvcnQnO1xufVxuXG5mdW5jdGlvbiBpc0Jyb3dzZXIoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIGlzQXJyYXlTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgQXJyYXkucHJvdG90eXBlICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5ldmVyeSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZmlsdGVyICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5pbmRleE9mICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZiAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUubWFwICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5zb21lICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZVJpZ2h0ICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXlcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0U3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICAgIE9iamVjdC5rZXlzICYmXG4gICAgICAgIE9iamVjdC5jcmVhdGUgJiZcbiAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mICYmXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzICYmXG4gICAgICAgIE9iamVjdC5pc1NlYWxlZCAmJlxuICAgICAgICBPYmplY3QuaXNGcm96ZW4gJiZcbiAgICAgICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSAmJlxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJlxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyAmJlxuICAgICAgICBPYmplY3Quc2VhbCAmJlxuICAgICAgICBPYmplY3QuZnJlZXplICYmXG4gICAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uc1xuICAgICk7XG59XG5cbmZ1bmN0aW9uIGlzSlNPTlN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gJ0pTT04nIGluIHdpbmRvdyAmJiAncGFyc2UnIGluIEpTT04gJiYgJ3N0cmluZ2lmeScgaW4gSlNPTjtcbn1cblxuZnVuY3Rpb24gaXNXb3JrZXJTdXBwb3J0ZWQoKSB7XG4gICAgaWYgKCEoJ1dvcmtlcicgaW4gd2luZG93ICYmICdCbG9iJyBpbiB3aW5kb3cgJiYgJ1VSTCcgaW4gd2luZG93KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbJyddLCB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH0pO1xuICAgIHZhciB3b3JrZXJVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHZhciBzdXBwb3J0ZWQ7XG4gICAgdmFyIHdvcmtlcjtcblxuICAgIHRyeSB7XG4gICAgICAgIHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVVJMKTtcbiAgICAgICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh3b3JrZXIpIHtcbiAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgIH1cbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHdvcmtlclVSTCk7XG5cbiAgICByZXR1cm4gc3VwcG9ydGVkO1xufVxuXG4vLyBJRTExIG9ubHkgc3VwcG9ydHMgYFVpbnQ4Q2xhbXBlZEFycmF5YCBhcyBvZiB2ZXJzaW9uXG4vLyBbS0IyOTI5NDM3XShodHRwczovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9lbi11cy9rYi8yOTI5NDM3KVxuZnVuY3Rpb24gaXNVaW50OENsYW1wZWRBcnJheVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gJ1VpbnQ4Q2xhbXBlZEFycmF5JyBpbiB3aW5kb3c7XG59XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLXN1cHBvcnRlZC9pc3N1ZXMvMTlcbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldztcbn1cblxuLy8gU29tZSBicm93c2VycyBvciBicm93c2VyIGV4dGVuc2lvbnMgYmxvY2sgYWNjZXNzIHRvIGNhbnZhcyBkYXRhIHRvIHByZXZlbnQgZmluZ2VycHJpbnRpbmcuXG4vLyBNYXBib3ggR0wgdXNlcyB0aGlzIEFQSSB0byBsb2FkIHNwcml0ZXMgYW5kIGltYWdlcyBpbiBnZW5lcmFsLlxuZnVuY3Rpb24gaXNDYW52YXNHZXRJbWFnZURhdGFTdXBwb3J0ZWQoKSB7XG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGltYWdlRGF0YSA9IGNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIDEsIDEpO1xuICAgIHJldHVybiBpbWFnZURhdGEgJiYgaW1hZ2VEYXRhLndpZHRoID09PSBjYW52YXMud2lkdGg7XG59XG5cbnZhciBpc1dlYkdMU3VwcG9ydGVkQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZWQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCkge1xuXG4gICAgaWYgKGlzV2ViR0xTdXBwb3J0ZWRDYWNoZVtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZVtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XSA9IGlzV2ViR0xTdXBwb3J0ZWQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZVtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XTtcbn1cblxuaXNTdXBwb3J0ZWQud2ViR0xDb250ZXh0QXR0cmlidXRlcyA9IHtcbiAgICBhbnRpYWxpYXM6IGZhbHNlLFxuICAgIGFscGhhOiB0cnVlLFxuICAgIHN0ZW5jaWw6IHRydWUsXG4gICAgZGVwdGg6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGdldFdlYkdMQ29udGV4dChmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSB7XG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBPYmplY3QuY3JlYXRlKGlzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMpO1xuICAgIGF0dHJpYnV0ZXMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA9IGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBhdHRyaWJ1dGVzKSB8fFxuICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgYXR0cmlidXRlcylcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc1dlYkdMU3VwcG9ydGVkKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpIHtcbiAgICB2YXIgZ2wgPSBnZXRXZWJHTENvbnRleHQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCk7XG4gICAgaWYgKCFnbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVHJ5IGNvbXBpbGluZyBhIHNoYWRlciBhbmQgZ2V0IGl0cyBjb21waWxlIHN0YXR1cy4gU29tZSBicm93c2VycyBsaWtlIEJyYXZlIGJsb2NrIHRoaXMgQVBJXG4gICAgLy8gdG8gcHJldmVudCBmaW5nZXJwcmludGluZy4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIG1lYW5zIHRoYXQgTWFwYm94IEdMIHdvbid0IHdvcmsuXG4gICAgdmFyIHNoYWRlcjtcbiAgICB0cnkge1xuICAgICAgICBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBzb21lIG9sZGVyIGJyb3dzZXJzIHRocm93IGFuIGV4Y2VwdGlvbiB0aGF0IGBjcmVhdGVTaGFkZXJgIGlzIG5vdCBkZWZpbmVkXG4gICAgICAgIC8vIHNvIGhhbmRsZSB0aGlzIHNlcGFyYXRlbHkgZnJvbSB0aGUgY2FzZSB3aGVyZSBicm93c2VycyBibG9jayBgY3JlYXRlU2hhZGVyYFxuICAgICAgICAvLyBmb3Igc2VjdXJpdHkgcmVhc29uc1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFzaGFkZXIgfHwgZ2wuaXNDb250ZXh0TG9zdCgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ2wuc2hhZGVyU291cmNlKHNoYWRlciwgJ3ZvaWQgbWFpbigpIHt9Jyk7XG4gICAgZ2wuY29tcGlsZVNoYWRlcihzaGFkZXIpO1xuICAgIHJldHVybiBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUykgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzTm90SUUoKSB7XG4gICAgcmV0dXJuICFkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59XG4iLCIvLyBAZmxvdyBzdHJpY3RcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93LmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuY29uc3QgRE9NID0ge307XG5leHBvcnQgZGVmYXVsdCBET007XG5cbkRPTS5jcmVhdGUgPSBmdW5jdGlvbiAodGFnTmFtZTogc3RyaW5nLCBjbGFzc05hbWU6ID9zdHJpbmcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgZWwgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbiAgICBpZiAoY2xhc3NOYW1lICE9PSB1bmRlZmluZWQpIGVsLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICBpZiAoY29udGFpbmVyKSBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHJldHVybiBlbDtcbn07XG5cbkRPTS5jcmVhdGVTVkcgPSBmdW5jdGlvbiAodGFnTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGVzOiB7W3N0cmluZ106IHN0cmluZyB8IG51bWJlcn0sIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgZWwgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIHRhZ05hbWUpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSkge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBuYW1lLCBhdHRyaWJ1dGVzW25hbWVdKTtcbiAgICB9XG4gICAgaWYgKGNvbnRhaW5lcikgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsKTtcbiAgICByZXR1cm4gZWw7XG59O1xuXG5jb25zdCBkb2NTdHlsZSA9IHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuY29uc3Qgc2VsZWN0UHJvcCA9IGRvY1N0eWxlICYmIGRvY1N0eWxlLnVzZXJTZWxlY3QgIT09IHVuZGVmaW5lZCA/ICd1c2VyU2VsZWN0JyA6ICdXZWJraXRVc2VyU2VsZWN0JztcbmxldCB1c2VyU2VsZWN0O1xuXG5ET00uZGlzYWJsZURyYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRvY1N0eWxlICYmIHNlbGVjdFByb3ApIHtcbiAgICAgICAgdXNlclNlbGVjdCA9IGRvY1N0eWxlW3NlbGVjdFByb3BdO1xuICAgICAgICBkb2NTdHlsZVtzZWxlY3RQcm9wXSA9ICdub25lJztcbiAgICB9XG59O1xuXG5ET00uZW5hYmxlRHJhZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZG9jU3R5bGUgJiYgc2VsZWN0UHJvcCkge1xuICAgICAgICBkb2NTdHlsZVtzZWxlY3RQcm9wXSA9IHVzZXJTZWxlY3Q7XG4gICAgfVxufTtcblxuLy8gU3VwcHJlc3MgdGhlIG5leHQgY2xpY2ssIGJ1dCBvbmx5IGlmIGl0J3MgaW1tZWRpYXRlLlxuY29uc3Qgc3VwcHJlc3NDbGljazogTW91c2VFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdXBwcmVzc0NsaWNrLCB0cnVlKTtcbn07XG5cbkRPTS5zdXBwcmVzc0NsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VwcHJlc3NDbGljaywgdHJ1ZSk7XG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdXBwcmVzc0NsaWNrLCB0cnVlKTtcbiAgICB9LCAwKTtcbn07XG5cbkRPTS5tb3VzZVBvcyA9IGZ1bmN0aW9uIChlbDogSFRNTEVsZW1lbnQsIGU6IE1vdXNlRXZlbnQgfCBXaGVlbEV2ZW50KSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiBnZXRTY2FsZWRQb2ludChlbCwgcmVjdCwgZSk7XG59O1xuXG5ET00udG91Y2hQb3MgPSBmdW5jdGlvbiAoZWw6IEhUTUxFbGVtZW50LCB0b3VjaGVzOiBUb3VjaExpc3QpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIHBvaW50cyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKGdldFNjYWxlZFBvaW50KGVsLCByZWN0LCB0b3VjaGVzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHM7XG59O1xuXG5ET00ubW91c2VCdXR0b24gPSBmdW5jdGlvbiAoZTogTW91c2VFdmVudCkge1xuICAgIGFzc2VydChlLnR5cGUgPT09ICdtb3VzZWRvd24nIHx8IGUudHlwZSA9PT0gJ21vdXNldXAnKTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5JbnN0YWxsVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCcgJiYgZS5idXR0b24gPT09IDIgJiYgZS5jdHJsS2V5ICYmXG4gICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0udG9VcHBlckNhc2UoKS5pbmRleE9mKCdNQUMnKSA+PSAwKSB7XG4gICAgICAgIC8vIEZpeCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzMxMzE6XG4gICAgICAgIC8vIEZpcmVmb3ggKGRldGVjdGVkIGJ5IEluc3RhbGxUcmlnZ2VyKSBvbiBNYWMgZGV0ZXJtaW5lcyBlLmJ1dHRvbiA9IDIgd2hlblxuICAgICAgICAvLyB1c2luZyBDb250cm9sICsgbGVmdCBjbGlja1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIGUuYnV0dG9uO1xufTtcblxuZnVuY3Rpb24gZ2V0U2NhbGVkUG9pbnQoZWw6IEhUTUxFbGVtZW50LCByZWN0OiBDbGllbnRSZWN0LCBlOiBNb3VzZUV2ZW50IHwgV2hlZWxFdmVudCB8IFRvdWNoKSB7XG4gICAgLy8gVW50aWwgd2UgZ2V0IHN1cHBvcnQgZm9yIHBvaW50ZXIgZXZlbnRzIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUG9pbnRlckV2ZW50KVxuICAgIC8vIHdlIHVzZSB0aGlzIGRpcnR5IHRyaWNrIHdoaWNoIHdvdWxkIG5vdCB3b3JrIGZvciB0aGUgY2FzZSBvZiByb3RhdGVkIHRyYW5zZm9ybXMsIGJ1dCB3b3JrcyB3ZWxsIGZvclxuICAgIC8vIHRoZSBjYXNlIG9mIHNpbXBsZSBzY2FsaW5nLlxuICAgIC8vIE5vdGU6IGBlbC5vZmZzZXRXaWR0aCA9PT0gcmVjdC53aWR0aGAgZWxpbWluYXRlcyB0aGUgYDAvMGAgY2FzZS5cbiAgICBjb25zdCBzY2FsaW5nID0gZWwub2Zmc2V0V2lkdGggPT09IHJlY3Qud2lkdGggPyAxIDogZWwub2Zmc2V0V2lkdGggLyByZWN0LndpZHRoO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIChlLmNsaWVudFggLSByZWN0LmxlZnQpICogc2NhbGluZyxcbiAgICAgICAgKGUuY2xpZW50WSAtIHJlY3QudG9wKSAqIHNjYWxpbmdcbiAgICApO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtnZXRKU09OLCBnZXRJbWFnZSwgUmVzb3VyY2VUeXBlfSBmcm9tICcuLi91dGlsL2FqYXguanMnO1xuXG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuaW1wb3J0IHtSR0JBSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZX0gZnJvbSAnLi9zdHlsZV9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7UmVxdWVzdE1hbmFnZXJ9IGZyb20gJy4uL3V0aWwvbWFwYm94LmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihiYXNlVVJMOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrPHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0+KTogQ2FuY2VsYWJsZSB7XG4gICAgbGV0IGpzb246IGFueSwgaW1hZ2UsIGVycm9yO1xuICAgIGNvbnN0IGZvcm1hdCA9IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyA+IDEgPyAnQDJ4JyA6ICcnO1xuXG4gICAgbGV0IGpzb25SZXF1ZXN0ID0gZ2V0SlNPTihyZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHJlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVNwcml0ZVVSTChiYXNlVVJMLCBmb3JtYXQsICcuanNvbicpLCBSZXNvdXJjZVR5cGUuU3ByaXRlSlNPTiksIChlcnI6ID9FcnJvciwgZGF0YTogP09iamVjdCkgPT4ge1xuICAgICAgICBqc29uUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAganNvbiA9IGRhdGE7XG4gICAgICAgICAgICBtYXliZUNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCBpbWFnZVJlcXVlc3QgPSBnZXRJbWFnZShyZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHJlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVNwcml0ZVVSTChiYXNlVVJMLCBmb3JtYXQsICcucG5nJyksIFJlc291cmNlVHlwZS5TcHJpdGVJbWFnZSksIChlcnIsIGltZykgPT4ge1xuICAgICAgICBpbWFnZVJlcXVlc3QgPSBudWxsO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgIGltYWdlID0gaW1nO1xuICAgICAgICAgICAgbWF5YmVDb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtYXliZUNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmIChqc29uICYmIGltYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBicm93c2VyLmdldEltYWdlRGF0YShpbWFnZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBqc29uKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIHgsIHksIHNkZiwgcGl4ZWxSYXRpbywgc3RyZXRjaFgsIHN0cmV0Y2hZLCBjb250ZW50fSA9IGpzb25baWRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgUkdCQUltYWdlKHt3aWR0aCwgaGVpZ2h0fSk7XG4gICAgICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoaW1hZ2VEYXRhLCBkYXRhLCB7eCwgeX0sIHt4OiAwLCB5OiAwfSwge3dpZHRoLCBoZWlnaHR9KTtcbiAgICAgICAgICAgICAgICByZXN1bHRbaWRdID0ge2RhdGEsIHBpeGVsUmF0aW8sIHNkZiwgc3RyZXRjaFgsIHN0cmV0Y2hZLCBjb250ZW50fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgICAgIGlmIChqc29uUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIGpzb25SZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIGpzb25SZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbWFnZVJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBpbWFnZVJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgaW1hZ2VSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1JHQkFJbWFnZX0gZnJvbSAnLi4vdXRpbC9pbWFnZS5qcyc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAuanMnO1xuXG5leHBvcnQgdHlwZSBTdHlsZUltYWdlRGF0YSA9IHtcbiAgICBkYXRhOiBSR0JBSW1hZ2UsXG4gICAgdmVyc2lvbjogbnVtYmVyLFxuICAgIGhhc1JlbmRlckNhbGxiYWNrPzogYm9vbGVhbixcbiAgICB1c2VySW1hZ2U/OiBTdHlsZUltYWdlSW50ZXJmYWNlXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZUltYWdlTWV0YWRhdGEgPSB7XG4gICAgcGl4ZWxSYXRpbzogbnVtYmVyLFxuICAgIHNkZjogYm9vbGVhbixcbiAgICBzdHJldGNoWD86IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIHN0cmV0Y2hZPzogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgY29udGVudD86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZUltYWdlID0gU3R5bGVJbWFnZURhdGEgJiBTdHlsZUltYWdlTWV0YWRhdGE7XG5cbmV4cG9ydCB0eXBlIFN0eWxlSW1hZ2VJbnRlcmZhY2UgPSB7XG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXksXG4gICAgcmVuZGVyPzogKCkgPT4gYm9vbGVhbixcbiAgICBvbkFkZD86IChtYXA6IE1hcCwgaWQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBvblJlbW92ZT86ICgpID0+IHZvaWRcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTdHlsZUltYWdlKGltYWdlOiBTdHlsZUltYWdlKSB7XG4gICAgY29uc3Qge3VzZXJJbWFnZX0gPSBpbWFnZTtcbiAgICBpZiAodXNlckltYWdlICYmIHVzZXJJbWFnZS5yZW5kZXIpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IHVzZXJJbWFnZS5yZW5kZXIoKTtcbiAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgIGltYWdlLmRhdGEucmVwbGFjZShuZXcgVWludDhBcnJheSh1c2VySW1hZ2UuZGF0YS5idWZmZXIpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBzdHlsZSBpbWFnZXMuIFRoaXMgaXMgYSBzcGVjaWZpY2F0aW9uIGZvclxuICogaW1wbGVtZW50ZXJzIHRvIG1vZGVsOiBpdCBpcyBub3QgYW4gZXhwb3J0ZWQgbWV0aG9kIG9yIGNsYXNzLlxuICpcbiAqIEltYWdlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHJlZHJhd24gZm9yIGV2ZXJ5IGZyYW1lLiBUaGV5IGNhbiBiZSB1c2VkIHRvIGFuaW1hdGVcbiAqIGljb25zIGFuZCBwYXR0ZXJucyBvciBtYWtlIHRoZW0gcmVzcG9uZCB0byB1c2VyIGlucHV0LiBTdHlsZSBpbWFnZXMgY2FuIGltcGxlbWVudCBhXG4gKiB7QGxpbmsgU3R5bGVJbWFnZUludGVyZmFjZSNyZW5kZXJ9IG1ldGhvZC4gVGhlIG1ldGhvZCBpcyBjYWxsZWQgZXZlcnkgZnJhbWUgYW5kXG4gKiBjYW4gYmUgdXNlZCB0byB1cGRhdGUgdGhlIGltYWdlLlxuICpcbiAqIEBpbnRlcmZhY2UgU3R5bGVJbWFnZUludGVyZmFjZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIFdpZHRoIGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgSGVpZ2h0IGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7VWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5fSBkYXRhIEJ5dGUgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBpbWFnZS4gVG8gZW5zdXJlIHNwYWNlIGZvciBhbGwgZm91ciBjaGFubmVscyBpbiBhbiBSR0JBIGNvbG9yLCBzaXplIG11c3QgYmUgd2lkdGggw5cgaGVpZ2h0IMOXIDQuXG4gKlxuICogQHNlZSBbRXhhbXBsZTogQWRkIGFuIGFuaW1hdGVkIGljb24gdG8gdGhlIG1hcC5dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS1hbmltYXRlZC8pXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGZsYXNoaW5nU3F1YXJlID0ge1xuICogICAgIHdpZHRoOiA2NCxcbiAqICAgICBoZWlnaHQ6IDY0LFxuICogICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KDY0ICogNjQgKiA0KSxcbiAqXG4gKiAgICAgb25BZGQobWFwKSB7XG4gKiAgICAgICAgIHRoaXMubWFwID0gbWFwO1xuICogICAgIH0sXG4gKlxuICogICAgIHJlbmRlcigpIHtcbiAqICAgICAgICAgLy8ga2VlcCByZXBhaW50aW5nIHdoaWxlIHRoZSBpY29uIGlzIG9uIHRoZSBtYXBcbiAqICAgICAgICAgdGhpcy5tYXAudHJpZ2dlclJlcGFpbnQoKTtcbiAqXG4gKiAgICAgICAgIC8vIGFsdGVybmF0ZSBiZXR3ZWVuIGJsYWNrIGFuZCB3aGl0ZSBiYXNlZCBvbiB0aGUgdGltZVxuICogICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApICUgMiA9PT0gMCAgPyAyNTUgOiAwO1xuICpcbiAqICAgICAgICAgLy8gY2hlY2sgaWYgaW1hZ2UgbmVlZHMgdG8gYmUgY2hhbmdlZFxuICogICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMucHJldmlvdXNWYWx1ZSkge1xuICogICAgICAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdmFsdWU7XG4gKlxuICogICAgICAgICAgICAgY29uc3QgYnl0ZXNQZXJQaXhlbCA9IDQ7XG4gKiAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMud2lkdGg7IHgrKykge1xuICogICAgICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQ7IHkrKykge1xuICogICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAoeSAqIHRoaXMud2lkdGggKyB4KSAqIGJ5dGVzUGVyUGl4ZWw7XG4gKiAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtvZmZzZXQgKyAwXSA9IHZhbHVlO1xuICogICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZTtcbiAqICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW29mZnNldCArIDJdID0gdmFsdWU7XG4gKiAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtvZmZzZXQgKyAzXSA9IDI1NTtcbiAqICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICB9XG4gKlxuICogICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW1hZ2UgY2hhbmdlZFxuICogICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gKiAgICAgICAgIH1cbiAqICAgICB9XG4gKiB9O1xuICpcbiAqIG1hcC5hZGRJbWFnZSgnZmxhc2hpbmdfc3F1YXJlJywgZmxhc2hpbmdTcXVhcmUpO1xuICovXG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgYmVmb3JlIGV2ZXJ5IGZyYW1lIHdoZXJlIHRoZSBpY29uIHdpbGwgYmUgdXNlZC5cbiAqIFRoZSBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdXBkYXRlIHRoZSBpbWFnZSdzIGBkYXRhYCBtZW1iZXIgd2l0aCBhIG5ldyBpbWFnZS5cbiAqXG4gKiBJZiB0aGUgbWV0aG9kIHVwZGF0ZXMgdGhlIGltYWdlIGl0IG11c3QgcmV0dXJuIGB0cnVlYCB0byBjb21taXQgdGhlIGNoYW5nZS5cbiAqIElmIHRoZSBtZXRob2QgcmV0dXJucyBgZmFsc2VgIG9yIG5vdGhpbmcgdGhlIGltYWdlIGlzIGFzc3VtZWQgdG8gbm90IGhhdmUgY2hhbmdlZC5cbiAqXG4gKiBJZiB1cGRhdGVzIGFyZSBpbmZyZXF1ZW50IGl0IG1heWJlIGVhc2llciB0byB1c2Uge0BsaW5rIE1hcCN1cGRhdGVJbWFnZX0gdG8gdXBkYXRlXG4gKiB0aGUgaW1hZ2UgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcgdGhpcyBtZXRob2QuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgU3R5bGVJbWFnZUludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSByZW5kZXJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGlzIG1ldGhvZCB1cGRhdGVkIHRoZSBpbWFnZS4gYGZhbHNlYCBpZiB0aGUgaW1hZ2Ugd2FzIG5vdCBjaGFuZ2VkLlxuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBsYXllciBoYXMgYmVlbiBhZGRlZCB0byB0aGUgTWFwIHdpdGgge0BsaW5rIE1hcCNhZGRJbWFnZX0uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgU3R5bGVJbWFnZUludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvbkFkZFxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY3VzdG9tIGxheWVyIHdhcyBqdXN0IGFkZGVkIHRvLlxuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBpY29uIGlzIHJlbW92ZWQgZnJvbSB0aGUgbWFwIHdpdGgge0BsaW5rIE1hcCNyZW1vdmVJbWFnZX0uXG4gKiBUaGlzIGdpdmVzIHRoZSBpbWFnZSBhIGNoYW5jZSB0byBjbGVhbiB1cCByZXNvdXJjZXMgYW5kIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBTdHlsZUltYWdlSW50ZXJmYWNlXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIG9uUmVtb3ZlXG4gKi9cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBwb3RwYWNrIGZyb20gJ3BvdHBhY2snO1xuXG5pbXBvcnQge0V2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHtSR0JBSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuL2ltYWdlX2F0bGFzLmpzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZS5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge3JlbmRlclN0eWxlSW1hZ2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2ltYWdlLmpzJztcbmltcG9ydCB7d2Fybk9uY2V9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge0Jpbn0gZnJvbSAncG90cGFjayc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcblxudHlwZSBQYXR0ZXJuID0ge1xuICAgIGJpbjogQmluLFxuICAgIHBvc2l0aW9uOiBJbWFnZVBvc2l0aW9uXG59O1xuXG4vLyBXaGVuIGNvcGllZCBpbnRvIHRoZSBhdGxhcyB0ZXh0dXJlLCBpbWFnZSBkYXRhIGlzIHBhZGRlZCBieSBvbmUgcGl4ZWwgb24gZWFjaCBzaWRlLiBJY29uXG4vLyBpbWFnZXMgYXJlIHBhZGRlZCB3aXRoIGZ1bGx5IHRyYW5zcGFyZW50IHBpeGVscywgd2hpbGUgcGF0dGVybiBpbWFnZXMgYXJlIHBhZGRlZCB3aXRoIGFcbi8vIGNvcHkgb2YgdGhlIGltYWdlIGRhdGEgd3JhcHBlZCBmcm9tIHRoZSBvcHBvc2l0ZSBzaWRlLiBJbiBib3RoIGNhc2VzLCB0aGlzIGVuc3VyZXMgdGhlXG4vLyBjb3JyZWN0IGJlaGF2aW9yIG9mIEdMX0xJTkVBUiB0ZXh0dXJlIHNhbXBsaW5nIG1vZGUuXG5jb25zdCBwYWRkaW5nID0gMTtcblxuLypcbiAgICBJbWFnZU1hbmFnZXIgZG9lcyB0aHJlZSB0aGluZ3M6XG5cbiAgICAgICAgMS4gVHJhY2tzIHJlcXVlc3RzIGZvciBpY29uIGltYWdlcyBmcm9tIHRpbGUgd29ya2VycyBhbmQgc2VuZHMgcmVzcG9uc2VzIHdoZW4gdGhlIHJlcXVlc3RzIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgIDIuIEJ1aWxkcyBhIHRleHR1cmUgYXRsYXMgZm9yIHBhdHRlcm4gaW1hZ2VzLlxuICAgICAgICAzLiBSZXJlbmRlcnMgcmVuZGVyYWJsZSBpbWFnZXMgb25jZSBwZXIgZnJhbWVcblxuICAgIFRoZXNlIGFyZSBkaXNwYXJhdGUgcmVzcG9uc2liaWxpdGllcyBhbmQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgaGFuZGxlZCBieSBkaWZmZXJlbnQgY2xhc3Nlcy4gV2hlbiB3ZSBpbXBsZW1lbnRcbiAgICBkYXRhLWRyaXZlbiBzdXBwb3J0IGZvciBgKi1wYXR0ZXJuYCwgd2UnbGwgbGlrZWx5IHVzZSBwZXItYnVja2V0IHBhdHRlcm4gYXRsYXNlcywgYW5kIHRoYXQgd291bGQgYmUgYSBnb29kIHRpbWVcbiAgICB0byByZWZhY3RvciB0aGlzLlxuKi9cbmNsYXNzIEltYWdlTWFuYWdlciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIGltYWdlczoge1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfTtcbiAgICB1cGRhdGVkSW1hZ2VzOiB7W186IHN0cmluZ106IGJvb2xlYW59O1xuICAgIGNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZToge1tfOiBzdHJpbmddOiBib29sZWFufTtcbiAgICBsb2FkZWQ6IGJvb2xlYW47XG4gICAgcmVxdWVzdG9yczogQXJyYXk8e2lkczogQXJyYXk8c3RyaW5nPiwgY2FsbGJhY2s6IENhbGxiYWNrPHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0+fT47XG5cbiAgICBwYXR0ZXJuczoge1tfOiBzdHJpbmddOiBQYXR0ZXJufTtcbiAgICBhdGxhc0ltYWdlOiBSR0JBSW1hZ2U7XG4gICAgYXRsYXNUZXh0dXJlOiA/VGV4dHVyZTtcbiAgICBkaXJ0eTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmltYWdlcyA9IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZWRJbWFnZXMgPSB7fTtcbiAgICAgICAgdGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWUgPSB7fTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0b3JzID0gW107XG5cbiAgICAgICAgdGhpcy5wYXR0ZXJucyA9IHt9O1xuICAgICAgICB0aGlzLmF0bGFzSW1hZ2UgPSBuZXcgUkdCQUltYWdlKHt3aWR0aDogMSwgaGVpZ2h0OiAxfSk7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIGlzTG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gICAgfVxuXG4gICAgc2V0TG9hZGVkKGxvYWRlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5sb2FkZWQgPT09IGxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7XG5cbiAgICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB7aWRzLCBjYWxsYmFja30gb2YgdGhpcy5yZXF1ZXN0b3JzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5KGlkcywgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0b3JzID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRJbWFnZShpZDogc3RyaW5nKTogP1N0eWxlSW1hZ2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbaWRdO1xuICAgIH1cblxuICAgIGFkZEltYWdlKGlkOiBzdHJpbmcsIGltYWdlOiBTdHlsZUltYWdlKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pbWFnZXNbaWRdKTtcbiAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKGlkLCBpbWFnZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VzW2lkXSA9IGltYWdlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlKGlkOiBzdHJpbmcsIGltYWdlOiBTdHlsZUltYWdlKSB7XG4gICAgICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5fdmFsaWRhdGVTdHJldGNoKGltYWdlLnN0cmV0Y2hYLCBpbWFnZS5kYXRhICYmIGltYWdlLmRhdGEud2lkdGgpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBJbWFnZSBcIiR7aWR9XCIgaGFzIGludmFsaWQgXCJzdHJldGNoWFwiIHZhbHVlYCkpKTtcbiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl92YWxpZGF0ZVN0cmV0Y2goaW1hZ2Uuc3RyZXRjaFksIGltYWdlLmRhdGEgJiYgaW1hZ2UuZGF0YS5oZWlnaHQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBJbWFnZSBcIiR7aWR9XCIgaGFzIGludmFsaWQgXCJzdHJldGNoWVwiIHZhbHVlYCkpKTtcbiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl92YWxpZGF0ZUNvbnRlbnQoaW1hZ2UuY29udGVudCwgaW1hZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBJbWFnZSBcIiR7aWR9XCIgaGFzIGludmFsaWQgXCJjb250ZW50XCIgdmFsdWVgKSkpO1xuICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlU3RyZXRjaChzdHJldGNoOiA/QXJyYXk8W251bWJlciwgbnVtYmVyXT4gfCB2b2lkLCBzaXplOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCFzdHJldGNoKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0IGxhc3QgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2Ygc3RyZXRjaCkge1xuICAgICAgICAgICAgaWYgKHBhcnRbMF0gPCBsYXN0IHx8IHBhcnRbMV0gPCBwYXJ0WzBdIHx8IHNpemUgPCBwYXJ0WzFdKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsYXN0ID0gcGFydFsxXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVDb250ZW50KGNvbnRlbnQ6ID9bbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IHZvaWQsIGltYWdlOiBTdHlsZUltYWdlKSB7XG4gICAgICAgIGlmICghY29udGVudCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCAhPT0gNCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoY29udGVudFswXSA8IDAgfHwgaW1hZ2UuZGF0YS53aWR0aCA8IGNvbnRlbnRbMF0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGNvbnRlbnRbMV0gPCAwIHx8IGltYWdlLmRhdGEuaGVpZ2h0IDwgY29udGVudFsxXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoY29udGVudFsyXSA8IDAgfHwgaW1hZ2UuZGF0YS53aWR0aCA8IGNvbnRlbnRbMl0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGNvbnRlbnRbM10gPCAwIHx8IGltYWdlLmRhdGEuaGVpZ2h0IDwgY29udGVudFszXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoY29udGVudFsyXSA8IGNvbnRlbnRbMF0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGNvbnRlbnRbM10gPCBjb250ZW50WzFdKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHVwZGF0ZUltYWdlKGlkOiBzdHJpbmcsIGltYWdlOiBTdHlsZUltYWdlKSB7XG4gICAgICAgIGNvbnN0IG9sZEltYWdlID0gdGhpcy5pbWFnZXNbaWRdO1xuICAgICAgICBhc3NlcnQob2xkSW1hZ2UpO1xuICAgICAgICBhc3NlcnQob2xkSW1hZ2UuZGF0YS53aWR0aCA9PT0gaW1hZ2UuZGF0YS53aWR0aCk7XG4gICAgICAgIGFzc2VydChvbGRJbWFnZS5kYXRhLmhlaWdodCA9PT0gaW1hZ2UuZGF0YS5oZWlnaHQpO1xuICAgICAgICBpbWFnZS52ZXJzaW9uID0gb2xkSW1hZ2UudmVyc2lvbiArIDE7XG4gICAgICAgIHRoaXMuaW1hZ2VzW2lkXSA9IGltYWdlO1xuICAgICAgICB0aGlzLnVwZGF0ZWRJbWFnZXNbaWRdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZW1vdmVJbWFnZShpZDogc3RyaW5nKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLmltYWdlc1tpZF0pO1xuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuaW1hZ2VzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuaW1hZ2VzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMucGF0dGVybnNbaWRdO1xuXG4gICAgICAgIGlmIChpbWFnZS51c2VySW1hZ2UgJiYgaW1hZ2UudXNlckltYWdlLm9uUmVtb3ZlKSB7XG4gICAgICAgICAgICBpbWFnZS51c2VySW1hZ2Uub25SZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxpc3RJbWFnZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmltYWdlcyk7XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2VzKGlkczogQXJyYXk8c3RyaW5nPiwgY2FsbGJhY2s6IENhbGxiYWNrPHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0+KSB7XG4gICAgICAgIC8vIElmIHRoZSBzcHJpdGUgaGFzIGJlZW4gbG9hZGVkLCBvciBpZiBhbGwgdGhlIGljb24gZGVwZW5kZW5jaWVzIGFyZSBhbHJlYWR5IHByZXNlbnRcbiAgICAgICAgLy8gKGkuZS4gaWYgdGhleSd2ZSBiZWVuIGFkZGVkIHZpYSBydW50aW1lIHN0eWxpbmcpLCB0aGVuIG5vdGlmeSB0aGUgcmVxdWVzdG9yIGltbWVkaWF0ZWx5LlxuICAgICAgICAvLyBPdGhlcndpc2UsIGRlbGF5IG5vdGlmaWNhdGlvbiB1bnRpbCB0aGUgc3ByaXRlIGlzIGxvYWRlZC4gQXQgdGhhdCBwb2ludCwgaWYgYW55IG9mIHRoZVxuICAgICAgICAvLyBkZXBlbmRlbmNpZXMgYXJlIHN0aWxsIHVuYXZhaWxhYmxlLCB3ZSdsbCBqdXN0IGFzc3VtZSB0aGV5IGFyZSBwZXJtYW5lbnRseSBtaXNzaW5nLlxuICAgICAgICBsZXQgaGFzQWxsRGVwZW5kZW5jaWVzID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmlzTG9hZGVkKCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmltYWdlc1tpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQWxsRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGVkKCkgfHwgaGFzQWxsRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZnkoaWRzLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RvcnMucHVzaCh7aWRzLCBjYWxsYmFja30pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX25vdGlmeShpZHM6IEFycmF5PHN0cmluZz4sIGNhbGxiYWNrOiBDYWxsYmFjazx7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9Pikge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaW1hZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3N0eWxlaW1hZ2VtaXNzaW5nJywge2lkfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmltYWdlc1tpZF07XG4gICAgICAgICAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAvLyBDbG9uZSB0aGUgaW1hZ2Ugc28gdGhhdCBvdXIgb3duIGNvcHkgb2YgaXRzIEFycmF5QnVmZmVyIGRvZXNuJ3QgZ2V0IHRyYW5zZmVycmVkLlxuICAgICAgICAgICAgICAgIHJlc3BvbnNlW2lkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaW1hZ2UuZGF0YS5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBwaXhlbFJhdGlvOiBpbWFnZS5waXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICBzZGY6IGltYWdlLnNkZixcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogaW1hZ2UudmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgc3RyZXRjaFg6IGltYWdlLnN0cmV0Y2hYLFxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoWTogaW1hZ2Uuc3RyZXRjaFksXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGltYWdlLmNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGhhc1JlbmRlckNhbGxiYWNrOiBCb29sZWFuKGltYWdlLnVzZXJJbWFnZSAmJiBpbWFnZS51c2VySW1hZ2UucmVuZGVyKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKGBJbWFnZSBcIiR7aWR9XCIgY291bGQgbm90IGJlIGxvYWRlZC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhZGRlZCB0aGUgaW1hZ2Ugd2l0aCBtYXAuYWRkSW1hZ2UoKSBvciBhIFwic3ByaXRlXCIgcHJvcGVydHkgaW4geW91ciBzdHlsZS4gWW91IGNhbiBwcm92aWRlIG1pc3NpbmcgaW1hZ2VzIGJ5IGxpc3RlbmluZyBmb3IgdGhlIFwic3R5bGVpbWFnZW1pc3NpbmdcIiBtYXAgZXZlbnQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZSk7XG4gICAgfVxuXG4gICAgLy8gUGF0dGVybiBzdHVmZlxuXG4gICAgZ2V0UGl4ZWxTaXplKCkge1xuICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSB0aGlzLmF0bGFzSW1hZ2U7XG4gICAgICAgIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG4gICAgfVxuXG4gICAgZ2V0UGF0dGVybihpZDogc3RyaW5nKTogP0ltYWdlUG9zaXRpb24ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5wYXR0ZXJuc1tpZF07XG5cbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmdldEltYWdlKGlkKTtcbiAgICAgICAgaWYgKCFpbWFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0dGVybiAmJiBwYXR0ZXJuLnBvc2l0aW9uLnZlcnNpb24gPT09IGltYWdlLnZlcnNpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuLnBvc2l0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgICAgICAgICBjb25zdCB3ID0gaW1hZ2UuZGF0YS53aWR0aCArIHBhZGRpbmcgKiAyO1xuICAgICAgICAgICAgY29uc3QgaCA9IGltYWdlLmRhdGEuaGVpZ2h0ICsgcGFkZGluZyAqIDI7XG4gICAgICAgICAgICBjb25zdCBiaW4gPSB7dywgaCwgeDogMCwgeTogMH07XG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBJbWFnZVBvc2l0aW9uKGJpbiwgaW1hZ2UpO1xuICAgICAgICAgICAgdGhpcy5wYXR0ZXJuc1tpZF0gPSB7YmluLCBwb3NpdGlvbn07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXR0ZXJuLnBvc2l0aW9uLnZlcnNpb24gPSBpbWFnZS52ZXJzaW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlUGF0dGVybkF0bGFzKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucGF0dGVybnNbaWRdLnBvc2l0aW9uO1xuICAgIH1cblxuICAgIGJpbmQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGlmICghdGhpcy5hdGxhc1RleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuYXRsYXNUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5hdGxhc0ltYWdlLCBnbC5SR0JBKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLmF0bGFzVGV4dHVyZS51cGRhdGUodGhpcy5hdGxhc0ltYWdlKTtcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXRsYXNUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlUGF0dGVybkF0bGFzKCkge1xuICAgICAgICBjb25zdCBiaW5zID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5wYXR0ZXJucykge1xuICAgICAgICAgICAgYmlucy5wdXNoKHRoaXMucGF0dGVybnNbaWRdLmJpbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7dywgaH0gPSBwb3RwYWNrKGJpbnMpO1xuXG4gICAgICAgIGNvbnN0IGRzdCA9IHRoaXMuYXRsYXNJbWFnZTtcbiAgICAgICAgZHN0LnJlc2l6ZSh7d2lkdGg6IHcgfHwgMSwgaGVpZ2h0OiBoIHx8IDF9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMucGF0dGVybnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHtiaW59ID0gdGhpcy5wYXR0ZXJuc1tpZF07XG4gICAgICAgICAgICBjb25zdCB4ID0gYmluLnggKyBwYWRkaW5nO1xuICAgICAgICAgICAgY29uc3QgeSA9IGJpbi55ICsgcGFkZGluZztcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IHRoaXMuaW1hZ2VzW2lkXS5kYXRhO1xuICAgICAgICAgICAgY29uc3QgdyA9IHNyYy53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGggPSBzcmMuaGVpZ2h0O1xuXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwge3g6IDAsIHk6IDB9LCB7eCwgeX0sIHt3aWR0aDogdywgaGVpZ2h0OiBofSk7XG5cbiAgICAgICAgICAgIC8vIEFkZCAxIHBpeGVsIHdyYXBwZWQgcGFkZGluZyBvbiBlYWNoIHNpZGUgb2YgdGhlIGltYWdlLlxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLCBkc3QsIHt4OiAwLCB5OiBoIC0gMX0sIHt4LCB5OiB5IC0gMX0sIHt3aWR0aDogdywgaGVpZ2h0OiAxfSk7IC8vIFRcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYywgZHN0LCB7eDogMCwgeTogICAgIDB9LCB7eCwgeTogeSArIGh9LCB7d2lkdGg6IHcsIGhlaWdodDogMX0pOyAvLyBCXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwge3g6IHcgLSAxLCB5OiAwfSwge3g6IHggLSAxLCB5fSwge3dpZHRoOiAxLCBoZWlnaHQ6IGh9KTsgLy8gTFxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLCBkc3QsIHt4OiAwLCAgICAgeTogMH0sIHt4OiB4ICsgdywgeX0sIHt3aWR0aDogMSwgaGVpZ2h0OiBofSk7IC8vIFJcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIGJlZ2luRnJhbWUoKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tEaXNwYXRjaGVkVGhpc0ZyYW1lID0ge307XG4gICAgfVxuXG4gICAgZGlzcGF0Y2hSZW5kZXJDYWxsYmFja3MoaWRzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG5cbiAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayBmb3IgdGhlIGltYWdlIHdhcyBhbHJlYWR5IGRpc3BhdGNoZWQgZm9yIGEgZGlmZmVyZW50IGZyYW1lXG4gICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWVbaWRdKSBjb250aW51ZTtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tEaXNwYXRjaGVkVGhpc0ZyYW1lW2lkXSA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5pbWFnZXNbaWRdO1xuICAgICAgICAgICAgYXNzZXJ0KGltYWdlKTtcblxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZCA9IHJlbmRlclN0eWxlSW1hZ2UoaW1hZ2UpO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUltYWdlKGlkLCBpbWFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEltYWdlTWFuYWdlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcblxuaW1wb3J0IHtlbmRzV2l0aCwgZXh0ZW5kLCBkZWdUb1JhZH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7RXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCB7XG4gICAgdmFsaWRhdGVTdHlsZSxcbiAgICB2YWxpZGF0ZUxpZ2h0LFxuICAgIGVtaXRWYWxpZGF0aW9uRXJyb3JzXG59IGZyb20gJy4vdmFsaWRhdGVfc3R5bGUuanMnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCB7UHJvcGVydGllcywgVHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIFBvc3NpYmx5RXZhbHVhdGVkLCBEYXRhQ29uc3RhbnRQcm9wZXJ0eX0gZnJvbSAnLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUge1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3N0eWxlLXNwZWMuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHR5cGUge1N0eWxlU2V0dGVyT3B0aW9uc30gZnJvbSAnLi4vc3R5bGUvc3R5bGUuanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIFByb3BlcnR5LFxuICAgIFByb3BlcnR5VmFsdWUsXG4gICAgVHJhbnNpdGlvblBhcmFtZXRlcnNcbn0gZnJvbSAnLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUge0xpZ2h0U3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIExpZ2h0UG9zaXRpb24gPSB7XG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB6OiBudW1iZXIsXG4gICAgYXppbXV0aGFsOiBudW1iZXIsXG4gICAgcG9sYXI6IG51bWJlcixcbn07XG5cbi8qKlxuICogQ29udmVydHMgc3BoZXJpY2FsIGNvb3JkaW5hdGVzIHRvIGNhcnRlc2lhbiBMaWdodFBvc2l0aW9uIGNvb3JkaW5hdGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gc3BoZXJpY2FsIFNwaGVyaWNhbCBjb29yZGluYXRlcywgaW4gW3JhZGlhbCwgYXppbXV0aGFsLCBwb2xhcl1cbiAqIEByZXR1cm4gTGlnaHRQb3NpdGlvbiBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwaGVyaWNhbFRvQ2FydGVzaWFuKFtyLCBhemltdXRoYWwsIHBvbGFyXTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKTogTGlnaHRQb3NpdGlvbiB7XG4gICAgLy8gV2UgYWJzdHJhY3QgXCJub3J0aFwiL1widXBcIiAoY29tcGFzcy13aXNlKSB0byBiZSAwwrAgd2hlbiByZWFsbHkgdGhpcyBpcyA5MMKwICjPgC8yKTpcbiAgICAvLyBjb3JyZWN0IGZvciB0aGF0IGhlcmVcbiAgICBjb25zdCBhID0gZGVnVG9SYWQoYXppbXV0aGFsICsgOTApLCBwID0gZGVnVG9SYWQocG9sYXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogciAqIE1hdGguY29zKGEpICogTWF0aC5zaW4ocCksXG4gICAgICAgIHk6IHIgKiBNYXRoLnNpbihhKSAqIE1hdGguc2luKHApLFxuICAgICAgICB6OiByICogTWF0aC5jb3MocCksXG4gICAgICAgIGF6aW11dGhhbCwgcG9sYXJcbiAgICB9O1xufVxuXG5jbGFzcyBMaWdodFBvc2l0aW9uUHJvcGVydHkgaW1wbGVtZW50cyBQcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIExpZ2h0UG9zaXRpb24+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNwZWNpZmljYXRpb24gPSBzdHlsZVNwZWMubGlnaHQucG9zaXRpb247XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIExpZ2h0UG9zaXRpb24+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycyk6IExpZ2h0UG9zaXRpb24ge1xuICAgICAgICByZXR1cm4gc3BoZXJpY2FsVG9DYXJ0ZXNpYW4odmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzKSk7XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGUoYTogTGlnaHRQb3NpdGlvbiwgYjogTGlnaHRQb3NpdGlvbiwgdDogbnVtYmVyKTogTGlnaHRQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBpbnRlcnBvbGF0ZShhLngsIGIueCwgdCksXG4gICAgICAgICAgICB5OiBpbnRlcnBvbGF0ZShhLnksIGIueSwgdCksXG4gICAgICAgICAgICB6OiBpbnRlcnBvbGF0ZShhLnosIGIueiwgdCksXG4gICAgICAgICAgICBhemltdXRoYWw6IGludGVycG9sYXRlKGEuYXppbXV0aGFsLCBiLmF6aW11dGhhbCwgdCksXG4gICAgICAgICAgICBwb2xhcjogaW50ZXJwb2xhdGUoYS5wb2xhciwgYi5wb2xhciwgdCksXG4gICAgICAgIH07XG4gICAgfVxufVxuXG50eXBlIFByb3BzID0ge3xcbiAgICBcImFuY2hvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiPixcbiAgICBcInBvc2l0aW9uXCI6IExpZ2h0UG9zaXRpb25Qcm9wZXJ0eSxcbiAgICBcImNvbG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PENvbG9yPixcbiAgICBcImludGVuc2l0eVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IHByb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWMubGlnaHQuYW5jaG9yKSxcbiAgICBcInBvc2l0aW9uXCI6IG5ldyBMaWdodFBvc2l0aW9uUHJvcGVydHkoKSxcbiAgICBcImNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWMubGlnaHQuY29sb3IpLFxuICAgIFwiaW50ZW5zaXR5XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWMubGlnaHQuaW50ZW5zaXR5KSxcbn0pO1xuXG5jb25zdCBUUkFOU0lUSU9OX1NVRkZJWCA9ICctdHJhbnNpdGlvbic7XG5cbi8qXG4gKiBSZXByZXNlbnRzIHRoZSBsaWdodCB1c2VkIHRvIGxpZ2h0IGV4dHJ1ZGVkIGZlYXR1cmVzLlxuICovXG5jbGFzcyBMaWdodCBleHRlbmRzIEV2ZW50ZWQge1xuICAgIF90cmFuc2l0aW9uYWJsZTogVHJhbnNpdGlvbmFibGU8UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nOiBUcmFuc2l0aW9uaW5nPFByb3BzPjtcbiAgICBwcm9wZXJ0aWVzOiBQb3NzaWJseUV2YWx1YXRlZDxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsaWdodE9wdGlvbnM/OiBMaWdodFNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGUgPSBuZXcgVHJhbnNpdGlvbmFibGUocHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuc2V0TGlnaHQobGlnaHRPcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZyA9IHRoaXMuX3RyYW5zaXRpb25hYmxlLnVudHJhbnNpdGlvbmVkKCk7XG4gICAgfVxuXG4gICAgZ2V0TGlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uYWJsZS5zZXJpYWxpemUoKTtcbiAgICB9XG5cbiAgICBzZXRMaWdodChsaWdodD86IExpZ2h0U3BlY2lmaWNhdGlvbiwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlTGlnaHQsIGxpZ2h0LCBvcHRpb25zKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGxpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGxpZ2h0W25hbWVdO1xuICAgICAgICAgICAgaWYgKGVuZHNXaXRoKG5hbWUsIFRSQU5TSVRJT05fU1VGRklYKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNldFRyYW5zaXRpb24obmFtZS5zbGljZSgwLCAtVFJBTlNJVElPTl9TVUZGSVgubGVuZ3RoKSwgdmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzOiBUcmFuc2l0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uaW5nID0gdGhpcy5fdHJhbnNpdGlvbmFibGUudHJhbnNpdGlvbmVkKHBhcmFtZXRlcnMsIHRoaXMuX3RyYW5zaXRpb25pbmcpO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uaW5nLmhhc1RyYW5zaXRpb24oKTtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZShwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSB0aGlzLl90cmFuc2l0aW9uaW5nLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlKHZhbGlkYXRlOiBGdW5jdGlvbiwgdmFsdWU6IG1peGVkLCBvcHRpb25zPzoge3ZhbGlkYXRlPzogYm9vbGVhbn0pIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy52YWxpZGF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbWl0VmFsaWRhdGlvbkVycm9ycyh0aGlzLCB2YWxpZGF0ZS5jYWxsKHZhbGlkYXRlU3R5bGUsIGV4dGVuZCh7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yNDA3XG4gICAgICAgICAgICBzdHlsZToge2dseXBoczogdHJ1ZSwgc3ByaXRlOiB0cnVlfSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KSkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGlnaHQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdC5qcyc7XG5pbXBvcnQge2VuZHNXaXRofSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHtQcm9wZXJ0aWVzLCBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWQsIERhdGFDb25zdGFudFByb3BlcnR5fSBmcm9tICcuL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7VHJhbnNpdGlvblBhcmFtZXRlcnN9IGZyb20gJy4vcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSB7VGVycmFpblNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuXG50eXBlIFByb3BzID0ge3xcbiAgICBcInNvdXJjZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxzdHJpbmc+LFxuICAgIFwiZXhhZ2dlcmF0aW9uXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuZXhwb3J0IGNvbnN0IERyYXBlUmVuZGVyTW9kZSA9IHtcbiAgICBkZWZlcnJlZDogMCxcbiAgICBlbGV2YXRlZDogMVxufTtcblxuY29uc3QgcHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJzb3VyY2VcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy50ZXJyYWluLnNvdXJjZSksXG4gICAgXCJleGFnZ2VyYXRpb25cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy50ZXJyYWluLmV4YWdnZXJhdGlvbiksXG59KTtcblxuY29uc3QgVFJBTlNJVElPTl9TVUZGSVggPSAnLXRyYW5zaXRpb24nO1xuXG5jbGFzcyBUZXJyYWluIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgX3RyYW5zaXRpb25hYmxlOiBUcmFuc2l0aW9uYWJsZTxQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmc6IFRyYW5zaXRpb25pbmc8UHJvcHM+O1xuICAgIHByb3BlcnRpZXM6IFBvc3NpYmx5RXZhbHVhdGVkPFByb3BzPjtcbiAgICBkcmFwZVJlbmRlck1vZGU6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHRlcnJhaW5PcHRpb25zOiBUZXJyYWluU3BlY2lmaWNhdGlvbiwgZHJhcGVSZW5kZXJNb2RlOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGUgPSBuZXcgVHJhbnNpdGlvbmFibGUocHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuc2V0KHRlcnJhaW5PcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZyA9IHRoaXMuX3RyYW5zaXRpb25hYmxlLnVudHJhbnNpdGlvbmVkKCk7XG4gICAgICAgIHRoaXMuZHJhcGVSZW5kZXJNb2RlID0gZHJhcGVSZW5kZXJNb2RlO1xuICAgIH1cblxuICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNlcmlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHNldCh0ZXJyYWluOiBUZXJyYWluU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdGVycmFpbikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXJyYWluW25hbWVdO1xuICAgICAgICAgICAgaWYgKGVuZHNXaXRoKG5hbWUsIFRSQU5TSVRJT05fU1VGRklYKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNldFRyYW5zaXRpb24obmFtZS5zbGljZSgwLCAtVFJBTlNJVElPTl9TVUZGSVgubGVuZ3RoKSwgdmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzOiBUcmFuc2l0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uaW5nID0gdGhpcy5fdHJhbnNpdGlvbmFibGUudHJhbnNpdGlvbmVkKHBhcmFtZXRlcnMsIHRoaXMuX3RyYW5zaXRpb25pbmcpO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uaW5nLmhhc1RyYW5zaXRpb24oKTtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZShwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSB0aGlzLl90cmFuc2l0aW9uaW5nLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUZXJyYWluO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7dmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHtzbW9vdGhzdGVwfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHR5cGUgTG5nTGF0IGZyb20gJy4uL2dlby9sbmdfbGF0LmpzJztcbmltcG9ydCB0eXBlIHtVbndyYXBwZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcblxuZXhwb3J0IGNvbnN0IEZPR19QSVRDSF9TVEFSVCA9IDQ1O1xuZXhwb3J0IGNvbnN0IEZPR19QSVRDSF9FTkQgPSA2NTtcbmV4cG9ydCBjb25zdCBGT0dfU1lNQk9MX0NMSVBQSU5HX1RIUkVTSE9MRCA9IDAuOTtcblxuZXhwb3J0IHR5cGUgRm9nU3RhdGUgPSB7XG4gICAgcmFuZ2U6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgaG9yaXpvbkJsZW5kOiBudW1iZXIsXG4gICAgYWxwaGE6IG51bWJlclxufTtcblxuLy8gQXMgZGVmaW5lZCBpbiBfcHJlbHVkZV9mb2cuZnJhZ21lbnQuZ2xzbCNmb2dfb3BhY2l0eVxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvZ09wYWNpdHkoc3RhdGU6IEZvZ1N0YXRlLCBwb3M6IEFycmF5PG51bWJlcj4sIHBpdGNoOiBudW1iZXIsIGZvdjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBmb2dQaXRjaE9wYWNpdHkgPSBzbW9vdGhzdGVwKEZPR19QSVRDSF9TVEFSVCwgRk9HX1BJVENIX0VORCwgcGl0Y2gpO1xuICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IGdldEZvdkFkanVzdGVkRm9nUmFuZ2Uoc3RhdGUsIGZvdik7XG5cbiAgICAvLyBUaGUgb3V0cHV0IG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBtYXRjaCBfcHJlbHVkZV9mb2cuZnJhZ21lbnQuZ2xzbFxuICAgIC8vIEZvciBmdXJ0aGVyIGRldGFpbHMsIHJlZmVyIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgc2hhZGVyIGNvZGVcbiAgICBjb25zdCBkZWNheSA9IDY7XG4gICAgY29uc3QgZGVwdGggPSB2ZWMzLmxlbmd0aChwb3MpO1xuICAgIGNvbnN0IGZvZ1JhbmdlID0gKGRlcHRoIC0gc3RhcnQpIC8gKGVuZCAtIHN0YXJ0KTtcbiAgICBsZXQgZmFsbG9mZiA9IDEuMCAtIE1hdGgubWluKDEsIE1hdGguZXhwKC1kZWNheSAqIGZvZ1JhbmdlKSk7XG5cbiAgICBmYWxsb2ZmICo9IGZhbGxvZmYgKiBmYWxsb2ZmO1xuICAgIGZhbGxvZmYgPSBNYXRoLm1pbigxLjAsIDEuMDA3NDcgKiBmYWxsb2ZmKTtcblxuICAgIHJldHVybiBmYWxsb2ZmICogZm9nUGl0Y2hPcGFjaXR5ICogc3RhdGUuYWxwaGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3ZBZGp1c3RlZEZvZ1JhbmdlKHN0YXRlOiBGb2dTdGF0ZSwgZm92OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIGEgc2hpZnRlZCBmb2cgcmFuZ2Ugc28gdGhhdCB0aGUgYXBwZWFyYW5jZSBpcyB1bmNoYW5nZWRcbiAgICAvLyB3aGVuIHRoZSBmb3YgY2hhbmdlcy4gV2UgZGVmaW5lIHJhbmdlPTAgc3RhcnRpbmcgYXQgdGhlIGNhbWVyYSBwb3NpdGlvbiBnaXZlblxuICAgIC8vIHRoZSBkZWZhdWx0IGZvdi4gV2UgYXZvaWQgc3RhcnRpbmcgdGhlIGZvZyByYW5nZSBhdCB0aGUgY2FtZXJhIGNlbnRlciBzbyB0aGF0XG4gICAgLy8gcmFuZ2VzIGFyZW4ndCBnZW5lcmFsbHkgbmVnYXRpdmUgdW5sZXNzIHRoZSBGT1YgaXMgbW9kaWZpZWQuXG4gICAgY29uc3Qgc2hpZnQgPSAwLjUgLyBNYXRoLnRhbihmb3YgKiAwLjUpO1xuICAgIHJldHVybiBbc3RhdGUucmFuZ2VbMF0gKyBzaGlmdCwgc3RhdGUucmFuZ2VbMV0gKyBzaGlmdF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2dPcGFjaXR5QXRUaWxlQ29vcmQoc3RhdGU6IEZvZ1N0YXRlLCB4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCB0aWxlSWQ6IFVud3JhcHBlZFRpbGVJRCwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBudW1iZXIge1xuICAgIGNvbnN0IG1hdCA9IHRyYW5zZm9ybS5jYWxjdWxhdGVGb2dUaWxlTWF0cml4KHRpbGVJZCk7XG4gICAgY29uc3QgcG9zID0gW3gsIHksIHpdO1xuICAgIHZlYzMudHJhbnNmb3JtTWF0NChwb3MsIHBvcywgbWF0KTtcblxuICAgIHJldHVybiBnZXRGb2dPcGFjaXR5KHN0YXRlLCBwb3MsIHRyYW5zZm9ybS5waXRjaCwgdHJhbnNmb3JtLl9mb3YpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9nT3BhY2l0eUF0TG5nTGF0KHN0YXRlOiBGb2dTdGF0ZSwgbG5nTGF0OiBMbmdMYXQsIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogbnVtYmVyIHtcbiAgICBjb25zdCBtZXRlcnMgPSBNZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdChsbmdMYXQpO1xuICAgIGNvbnN0IGVsZXZhdGlvbiA9IHRyYW5zZm9ybS5lbGV2YXRpb24gPyB0cmFuc2Zvcm0uZWxldmF0aW9uLmdldEF0UG9pbnRPclplcm8obWV0ZXJzKSA6IDA7XG4gICAgY29uc3QgcG9zID0gW21ldGVycy54LCBtZXRlcnMueSwgZWxldmF0aW9uXTtcbiAgICB2ZWMzLnRyYW5zZm9ybU1hdDQocG9zLCBwb3MsIHRyYW5zZm9ybS5tZXJjYXRvckZvZ01hdHJpeCk7XG5cbiAgICByZXR1cm4gZ2V0Rm9nT3BhY2l0eShzdGF0ZSwgcG9zLCB0cmFuc2Zvcm0ucGl0Y2gsIHRyYW5zZm9ybS5fZm92KTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcbmltcG9ydCB7ZW5kc1dpdGgsIGV4dGVuZCwgc21vb3Roc3RlcH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7RXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCB7dmFsaWRhdGVTdHlsZSwgdmFsaWRhdGVGb2csIGVtaXRWYWxpZGF0aW9uRXJyb3JzfSBmcm9tICcuL3ZhbGlkYXRlX3N0eWxlLmpzJztcbmltcG9ydCB7UHJvcGVydGllcywgVHJhbnNpdGlvbmFibGUsIFRyYW5zaXRpb25pbmcsIFBvc3NpYmx5RXZhbHVhdGVkLCBEYXRhQ29uc3RhbnRQcm9wZXJ0eX0gZnJvbSAnLi9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuaW1wb3J0IHtGT0dfUElUQ0hfU1RBUlQsIEZPR19QSVRDSF9FTkQsIGdldEZvZ09wYWNpdHlBdExuZ0xhdCwgZ2V0Rm92QWRqdXN0ZWRGb2dSYW5nZX0gZnJvbSAnLi9mb2dfaGVscGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7Rm9nU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7VHJhbnNpdGlvblBhcmFtZXRlcnN9IGZyb20gJy4vcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUge1N0eWxlU2V0dGVyT3B0aW9uc30gZnJvbSAnLi4vc3R5bGUvc3R5bGUuanMnO1xuaW1wb3J0IHR5cGUge0ZvZ1N0YXRlfSBmcm9tICcuL2ZvZ19oZWxwZXJzLmpzJztcblxudHlwZSBQcm9wcyA9IHt8XG4gICAgXCJyYW5nZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBcImNvbG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PENvbG9yPixcbiAgICBcImhvcml6b24tYmxlbmRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBmb2dQcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcInJhbmdlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWMuZm9nLnJhbmdlKSxcbiAgICBcImNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWMuZm9nLmNvbG9yKSxcbiAgICBcImhvcml6b24tYmxlbmRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy5mb2dbXCJob3Jpem9uLWJsZW5kXCJdKSxcbn0pO1xuXG5jb25zdCBUUkFOU0lUSU9OX1NVRkZJWCA9ICctdHJhbnNpdGlvbic7XG5cbmNsYXNzIEZvZyBleHRlbmRzIEV2ZW50ZWQge1xuICAgIF90cmFuc2l0aW9uYWJsZTogVHJhbnNpdGlvbmFibGU8UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nOiBUcmFuc2l0aW9uaW5nPFByb3BzPjtcbiAgICBwcm9wZXJ0aWVzOiBQb3NzaWJseUV2YWx1YXRlZDxQcm9wcz47XG5cbiAgICAvLyBBbHRlcm5hdGUgcHJvamVjdGlvbnMgZG8gbm90IHlldCBzdXBwb3J0IGZvZy5cbiAgICAvLyBIb2xkIG9uIHRvIHRyYW5zZm9ybSBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBhIHByb2plY3Rpb24gaXMgc2V0LlxuICAgIF90cmFuc2Zvcm06IFRyYW5zZm9ybTtcblxuICAgIGNvbnN0cnVjdG9yKGZvZ09wdGlvbnM/OiBGb2dTcGVjaWZpY2F0aW9uLCB0cmFuc2Zvcm06IFRyYW5zZm9ybSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZSA9IG5ldyBUcmFuc2l0aW9uYWJsZShmb2dQcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy5zZXQoZm9nT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmcgPSB0aGlzLl90cmFuc2l0aW9uYWJsZS51bnRyYW5zaXRpb25lZCgpO1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgfVxuXG4gICAgZ2V0IHN0YXRlKCk6IEZvZ1N0YXRlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhbmdlOiB0aGlzLnByb3BlcnRpZXMuZ2V0KCdyYW5nZScpLFxuICAgICAgICAgICAgaG9yaXpvbkJsZW5kOiB0aGlzLnByb3BlcnRpZXMuZ2V0KCdob3Jpem9uLWJsZW5kJyksXG4gICAgICAgICAgICBhbHBoYTogdGhpcy5wcm9wZXJ0aWVzLmdldCgnY29sb3InKS5hXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGUuc2VyaWFsaXplKCk7XG4gICAgfVxuXG4gICAgc2V0KGZvZz86IEZvZ1NwZWNpZmljYXRpb24sIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZUZvZywgZm9nLCBvcHRpb25zKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGZvZykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmb2dbbmFtZV07XG4gICAgICAgICAgICBpZiAoZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGUuc2V0VHJhbnNpdGlvbihuYW1lLnNsaWNlKDAsIC1UUkFOU0lUSU9OX1NVRkZJWC5sZW5ndGgpLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE9wYWNpdHkocGl0Y2g6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5fdHJhbnNmb3JtLnByb2plY3Rpb24uc3VwcG9ydHNGb2cpIHJldHVybiAwO1xuXG4gICAgICAgIGNvbnN0IGZvZ0NvbG9yID0gKHRoaXMucHJvcGVydGllcyAmJiB0aGlzLnByb3BlcnRpZXMuZ2V0KCdjb2xvcicpKSB8fCAxLjA7XG4gICAgICAgIGNvbnN0IHBpdGNoRmFjdG9yID0gc21vb3Roc3RlcChGT0dfUElUQ0hfU1RBUlQsIEZPR19QSVRDSF9FTkQsIHBpdGNoKTtcbiAgICAgICAgcmV0dXJuIHBpdGNoRmFjdG9yICogZm9nQ29sb3IuYTtcbiAgICB9XG5cbiAgICBnZXRPcGFjaXR5QXRMYXRMbmcobG5nTGF0OiBMbmdMYXQsIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLl90cmFuc2Zvcm0ucHJvamVjdGlvbi5zdXBwb3J0c0ZvZykgcmV0dXJuIDA7XG5cbiAgICAgICAgcmV0dXJuIGdldEZvZ09wYWNpdHlBdExuZ0xhdCh0aGlzLnN0YXRlLCBsbmdMYXQsIHRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgZ2V0Rm92QWRqdXN0ZWRSYW5nZShmb3Y6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICAvLyBXZSBjYW4gcmV0dXJuIGFueSBhcmJpdHJhcnkgcmFuZ2UgYmVjYXVzZSB3ZSBleHBlY3Qgb3BhY2l0eT0wIHRvIGNsZWFuIGl0IHVwXG4gICAgICAgIGlmICghdGhpcy5fdHJhbnNmb3JtLnByb2plY3Rpb24uc3VwcG9ydHNGb2cpIHJldHVybiBbMCwgMV07XG5cbiAgICAgICAgcmV0dXJuIGdldEZvdkFkanVzdGVkRm9nUmFuZ2UodGhpcy5zdGF0ZSwgZm92KTtcbiAgICB9XG5cbiAgICB1cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzOiBUcmFuc2l0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uaW5nID0gdGhpcy5fdHJhbnNpdGlvbmFibGUudHJhbnNpdGlvbmVkKHBhcmFtZXRlcnMsIHRoaXMuX3RyYW5zaXRpb25pbmcpO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uaW5nLmhhc1RyYW5zaXRpb24oKTtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZShwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSB0aGlzLl90cmFuc2l0aW9uaW5nLnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlKHZhbGlkYXRlOiBGdW5jdGlvbiwgdmFsdWU6IG1peGVkLCBvcHRpb25zPzoge3ZhbGlkYXRlPzogYm9vbGVhbn0pIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy52YWxpZGF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbWl0VmFsaWRhdGlvbkVycm9ycyh0aGlzLCB2YWxpZGF0ZS5jYWxsKHZhbGlkYXRlU3R5bGUsIGV4dGVuZCh7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHN0eWxlOiB7Z2x5cGhzOiB0cnVlLCBzcHJpdGU6IHRydWV9LFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pKSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGb2c7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3VuaXF1ZUlkLCBhc3luY0FsbH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCBBY3RvciBmcm9tICcuL2FjdG9yLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUgV29ya2VyUG9vbCBmcm9tICcuL3dvcmtlcl9wb29sLmpzJztcblxuLyoqXG4gKiBSZXNwb25zaWJsZSBmb3Igc2VuZGluZyBtZXNzYWdlcyBmcm9tIGEge0BsaW5rIFNvdXJjZX0gdG8gYW4gYXNzb2NpYXRlZFxuICoge0BsaW5rIFdvcmtlclNvdXJjZX0uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgRGlzcGF0Y2hlciB7XG4gICAgd29ya2VyUG9vbDogV29ya2VyUG9vbDtcbiAgICBhY3RvcnM6IEFycmF5PEFjdG9yPjtcbiAgICBjdXJyZW50QWN0b3I6IG51bWJlcjtcbiAgICBpZDogbnVtYmVyO1xuICAgIHJlYWR5OiBib29sZWFuO1xuXG4gICAgLy8gZXhwb3NlZCB0byBhbGxvdyBzdHViYmluZyBpbiB1bml0IHRlc3RzXG4gICAgc3RhdGljIEFjdG9yOiBDbGFzczxBY3Rvcj47XG5cbiAgICBjb25zdHJ1Y3Rvcih3b3JrZXJQb29sOiBXb3JrZXJQb29sLCBwYXJlbnQ6IGFueSkge1xuICAgICAgICB0aGlzLndvcmtlclBvb2wgPSB3b3JrZXJQb29sO1xuICAgICAgICB0aGlzLmFjdG9ycyA9IFtdO1xuICAgICAgICB0aGlzLmN1cnJlbnRBY3RvciA9IDA7XG4gICAgICAgIHRoaXMuaWQgPSB1bmlxdWVJZCgpO1xuICAgICAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmFjcXVpcmUodGhpcy5pZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29ya2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gd29ya2Vyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGFjdG9yID0gbmV3IERpc3BhdGNoZXIuQWN0b3Iod29ya2VyLCBwYXJlbnQsIHRoaXMuaWQpO1xuICAgICAgICAgICAgYWN0b3IubmFtZSA9IGBXb3JrZXIgJHtpfWA7XG4gICAgICAgICAgICB0aGlzLmFjdG9ycy5wdXNoKGFjdG9yKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQodGhpcy5hY3RvcnMubGVuZ3RoKTtcblxuICAgICAgICAvLyB0cmFjayB3aGV0aGVyIGFsbCB3b3JrZXJzIGFyZSBpbnN0YW50aWF0ZWQgYW5kIHJlYWR5IHRvIHJlY2VpdmUgbWVzc2FnZXM7XG4gICAgICAgIC8vIHVzZWQgZm9yIG9wdGltaXphdGlvbnMgb24gaW5pdGlhbCBtYXAgbG9hZFxuICAgICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnJvYWRjYXN0KCdjaGVja0lmUmVhZHknLCBudWxsLCAoKSA9PiB7IHRoaXMucmVhZHkgPSB0cnVlOyB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3QgYSBtZXNzYWdlIHRvIGFsbCBXb3JrZXJzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYnJvYWRjYXN0KHR5cGU6IHN0cmluZywgZGF0YTogbWl4ZWQsIGNiPzogRnVuY3Rpb24pIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuYWN0b3JzLmxlbmd0aCk7XG4gICAgICAgIGNiID0gY2IgfHwgZnVuY3Rpb24gKCkge307XG4gICAgICAgIGFzeW5jQWxsKHRoaXMuYWN0b3JzLCAoYWN0b3IsIGRvbmUpID0+IHtcbiAgICAgICAgICAgIGFjdG9yLnNlbmQodHlwZSwgZGF0YSwgZG9uZSk7XG4gICAgICAgIH0sIGNiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBY3F1aXJlcyBhbiBhY3RvciB0byBkaXNwYXRjaCBtZXNzYWdlcyB0by4gVGhlIGFjdG9ycyBhcmUgZGlzdHJpYnV0ZWQgaW4gcm91bmQtcm9iaW4gZmFzaGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QWN0b3J9IEFuIGFjdG9yIG9iamVjdCBiYWNrZWQgYnkgYSB3ZWIgd29ya2VyIGZvciBwcm9jZXNzaW5nIG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIGdldEFjdG9yKCk6IEFjdG9yIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuYWN0b3JzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuY3VycmVudEFjdG9yID0gKHRoaXMuY3VycmVudEFjdG9yICsgMSkgJSB0aGlzLmFjdG9ycy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdG9yc1t0aGlzLmN1cnJlbnRBY3Rvcl07XG4gICAgfVxuXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLmFjdG9ycy5mb3JFYWNoKChhY3RvcikgPT4geyBhY3Rvci5yZW1vdmUoKTsgfSk7XG4gICAgICAgIHRoaXMuYWN0b3JzID0gW107XG4gICAgICAgIHRoaXMud29ya2VyUG9vbC5yZWxlYXNlKHRoaXMuaWQpO1xuICAgIH1cbn1cblxuRGlzcGF0Y2hlci5BY3RvciA9IEFjdG9yO1xuXG5leHBvcnQgZGVmYXVsdCBEaXNwYXRjaGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtnZXRCb3VuZHMsIGNsYW1wLCBwb2x5Z29uaXplQm91bmRzLCBidWZmZXJDb252ZXhQb2x5Z29ufSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtwb2x5Z29uSW50ZXJzZWN0c0JveH0gZnJvbSAnLi4vdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQgdHlwZSB7UG9pbnRMaWtlfSBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cy5qcyc7XG5pbXBvcnQge3ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQge1JheX0gZnJvbSAnLi4vdXRpbC9wcmltaXRpdmVzLmpzJztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB7Z2V0VGlsZVBvaW50LCBnZXRUaWxlVmVjM30gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuXG4vKipcbiAqIEEgZGF0YS1jbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBzY3JlZW5zcGFjZSBxdWVyeSBmcm9tIGBNYXAjcXVlcnlSZW5kZXJlZEZlYXR1cmVzYC5cbiAqIEFsbCB0aGUgaW50ZXJuYWwgZ2VvbWV0cmllcyBhbmQgZGF0YSBhcmUgaW50ZW50ZWQgdG8gYmUgaW1tdXRhYmxlIGFuZCByZWFkLW9ubHkuXG4gKiBJdHMgbGlmZXRpbWUgaXMgb25seSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBxdWVyeSBhbmQgZml4ZWQgc3RhdGUgb2YgdGhlIG1hcCB3aGlsZSB0aGUgcXVlcnkgaXMgYmVpbmcgcHJvY2Vzc2VkLlxuICpcbiAqIEBjbGFzcyBRdWVyeUdlb21ldHJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVyeUdlb21ldHJ5IHtcbiAgICBzY3JlZW5Cb3VuZHM6IFBvaW50W107XG4gICAgY2FtZXJhUG9pbnQ6IFBvaW50O1xuICAgIHNjcmVlbkdlb21ldHJ5OiBQb2ludFtdO1xuICAgIHNjcmVlbkdlb21ldHJ5TWVyY2F0b3I6IE1lcmNhdG9yQ29vcmRpbmF0ZVtdO1xuICAgIGNhbWVyYUdlb21ldHJ5OiBQb2ludFtdO1xuXG4gICAgX3NjcmVlblJheWNhc3RDYWNoZTogeyBbXzogbnVtYmVyXTogTWVyY2F0b3JDb29yZGluYXRlW119O1xuICAgIF9jYW1lcmFSYXljYXN0Q2FjaGU6IHsgW186IG51bWJlcl06IE1lcmNhdG9yQ29vcmRpbmF0ZVtdfTtcblxuICAgIGlzQWJvdmVIb3Jpem9uOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Ioc2NyZWVuQm91bmRzOiBQb2ludFtdLCBjYW1lcmFQb2ludDogUG9pbnQsIGFib3ZlSG9yaXpvbjogYm9vbGVhbiwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICAgICAgdGhpcy5zY3JlZW5Cb3VuZHMgPSBzY3JlZW5Cb3VuZHM7XG4gICAgICAgIHRoaXMuY2FtZXJhUG9pbnQgPSBjYW1lcmFQb2ludDtcbiAgICAgICAgdGhpcy5fc2NyZWVuUmF5Y2FzdENhY2hlID0ge307XG4gICAgICAgIHRoaXMuX2NhbWVyYVJheWNhc3RDYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLmlzQWJvdmVIb3Jpem9uID0gYWJvdmVIb3Jpem9uO1xuXG4gICAgICAgIHRoaXMuc2NyZWVuR2VvbWV0cnkgPSB0aGlzLmJ1ZmZlcmVkU2NyZWVuR2VvbWV0cnkoMCk7XG4gICAgICAgIHRoaXMuc2NyZWVuR2VvbWV0cnlNZXJjYXRvciA9IHRoaXMuc2NyZWVuR2VvbWV0cnkubWFwKChwKSA9PiB0cmFuc2Zvcm0ucG9pbnRDb29yZGluYXRlM0QocCkpO1xuICAgICAgICB0aGlzLmNhbWVyYUdlb21ldHJ5ID0gdGhpcy5idWZmZXJlZENhbWVyYUdlb21ldHJ5KDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGhlbHAgY29udHJ1Y3QgYW4gaW5zdGFuY2UgIHdoaWxlIGFjY291bnRpbmcgZm9yIGN1cnJlbnQgbWFwIHN0YXRlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBwYXJhbSB7KFBvaW50TGlrZSB8IFtQb2ludExpa2UsIFBvaW50TGlrZV0pfSBnZW9tZXRyeSBUaGUgcXVlcnkgZ2VvbWV0cnkuXG4gICAgICogQHBhcmFtIHtUcmFuc2Zvcm19IHRyYW5zZm9ybSBUaGUgY3VycmVudCBtYXAgdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm5zIHtRdWVyeUdlb21ldHJ5fSBBbiBpbnN0YW5jZSBvZiB0aGUgUXVlcnlHZW9tZXRyeSBjbGFzcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlRnJvbVNjcmVlblBvaW50cyhnZW9tZXRyeTogUG9pbnRMaWtlIHwgW1BvaW50TGlrZSwgUG9pbnRMaWtlXSwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBRdWVyeUdlb21ldHJ5IHtcbiAgICAgICAgbGV0IHNjcmVlbkdlb21ldHJ5O1xuICAgICAgICBsZXQgYWJvdmVIb3Jpem9uO1xuICAgICAgICBpZiAoZ2VvbWV0cnkgaW5zdGFuY2VvZiBQb2ludCB8fCB0eXBlb2YgZ2VvbWV0cnlbMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjb25zdCBwdCA9IFBvaW50LmNvbnZlcnQoZ2VvbWV0cnkpO1xuICAgICAgICAgICAgc2NyZWVuR2VvbWV0cnkgPSBbUG9pbnQuY29udmVydChnZW9tZXRyeSldO1xuICAgICAgICAgICAgYWJvdmVIb3Jpem9uID0gdHJhbnNmb3JtLmlzUG9pbnRBYm92ZUhvcml6b24ocHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGwgPSBQb2ludC5jb252ZXJ0KGdlb21ldHJ5WzBdKTtcbiAgICAgICAgICAgIGNvbnN0IGJyID0gUG9pbnQuY29udmVydChnZW9tZXRyeVsxXSk7XG4gICAgICAgICAgICBzY3JlZW5HZW9tZXRyeSA9IFt0bCwgYnJdO1xuICAgICAgICAgICAgYWJvdmVIb3Jpem9uID0gcG9seWdvbml6ZUJvdW5kcyh0bCwgYnIpLmV2ZXJ5KChwKSA9PiB0cmFuc2Zvcm0uaXNQb2ludEFib3ZlSG9yaXpvbihwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5R2VvbWV0cnkoc2NyZWVuR2VvbWV0cnksIHRyYW5zZm9ybS5nZXRDYW1lcmFQb2ludCgpLCBhYm92ZUhvcml6b24sIHRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBpbml0aWFsIHF1ZXJ5IGJ5IHRoZSB1c2VyIHdhcyBhIHNpbmdsZSBwb2ludC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgaW5pdGlhbCBxdWVyeSBnZW9tZXRyeSB3YXMgYSBzaW5nbGUgcG9pbnQuXG4gICAgICovXG4gICAgaXNQb2ludFF1ZXJ5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JlZW5Cb3VuZHMubGVuZ3RoID09PSAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIER1ZSB0byBkYXRhLWRyaXZlbiBzdHlsaW5nIGZlYXR1cmVzIGRvIG5vdCB1bmlmb3JtIHNpemUoZWcgYGNpcmNsZS1yYWRpdXNgKSBhbmQgY2FuIGJlIG9mZnNldCBkaWZmZXJudGx5XG4gICAgICogZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbihmb3IgZXhhbXBsZSB3aXRoIGAqLXRyYW5zbGF0ZWApLiBUaGlzIG1lYW5zIHdlIGhhdmUgdG8gZXhwYW5kIG91ciBxdWVyeSByZWdpb24gZm9yXG4gICAgICogZWFjaCB0aWxlIHRvIGFjY291bnQgZm9yIHZhcmlhdGlvbiBpbiB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqIEVhY2ggdGlsZSBjYWxjdWxhdGVzIGEgdGlsZSBsZXZlbCBtYXggcGFkZGluZyB2YWx1ZSAoaW4gc2NyZWVuc3BhY2UgcGl4ZWxzKSB3aGVuIGl0cyBwYXJzZWQsIHRoaXMgZnVuY3Rpb25cbiAgICAgKiBsZXRzIHVzIGNhbGN1bGF0ZSBhIGJ1ZmZlcmVkIHZlcnNpb24gb2YgdGhlIHNjcmVlbnNwYWNlIHF1ZXJ5IGdlb21ldHJ5IGZvciBlYWNoIHRpbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYnVmZmVyIFRoZSB0aWxlIHBhZGRpbmcgaW4gc2NyZWVuc3BhY2UgcGl4ZWxzLlxuICAgICAqIEByZXR1cm5zIHtQb2ludFtdfSBUaGUgYnVmZmVyZWQgcXVlcnkgZ2VvbWV0cnkuXG4gICAgICovXG4gICAgYnVmZmVyZWRTY3JlZW5HZW9tZXRyeShidWZmZXI6IG51bWJlcik6IFBvaW50W10ge1xuICAgICAgICByZXR1cm4gcG9seWdvbml6ZUJvdW5kcyhcbiAgICAgICAgICAgIHRoaXMuc2NyZWVuQm91bmRzWzBdLFxuICAgICAgICAgICAgdGhpcy5zY3JlZW5Cb3VuZHMubGVuZ3RoID09PSAxID8gdGhpcy5zY3JlZW5Cb3VuZHNbMF0gOiB0aGlzLnNjcmVlbkJvdW5kc1sxXSxcbiAgICAgICAgICAgIGJ1ZmZlclxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIG1hcCBpcyBwaXRjaGVkLCBzb21lIG9mIHRoZSAzRCBmZWF0dXJlcyB0aGF0IGludGVyc2VjdCBhIHF1ZXJ5IHdpbGwgbm90IGludGVyc2VjdFxuICAgICAqIHRoZSBxdWVyeSBhdCB0aGUgc3VyZmFjZSBvZiB0aGUgZWFydGguIEluc3RlYWQgdGhlIGZlYXR1cmUgbWF5IGJlIGNsb3NlciBhbmQgb25seSBpbnRlcnNlY3RcbiAgICAgKiB0aGUgcXVlcnkgYmVjYXVzZSBpdCBleHRydWRlcyBpbnRvIHRoZSBhaXIuXG4gICAgICpcbiAgICAgKiBUaGlzIHJldHVybnMgYSBnZW9tZXRyeSB0aGF0IGlzIGEgY29udmV4IHBvbHlnb24gdGhhdCBlbmNvbXBhc3NlcyB0aGUgcXVlcnkgZnJ1c3R1bSBhbmQgdGhlIHBvaW50IHVuZGVybmVhdGggdGhlIGNhbWVyYS5cbiAgICAgKiBTaW1pbGFyIHRvIGBidWZmZXJlZFNjcmVlbkdlb21ldHJ5YCwgYnVmZmVyaW5nIGlzIGFkZGVkIHRvIGFjY291bnQgZm9yIHZhcmlhdGlvbiBpbiBwYWludCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQ2FzZSAxOiBwb2ludCB1bmRlcm5lYXRoIGNhbWVyYSBpcyBleGFjdGx5IGJlaGluZCBxdWVyeSB2b2x1bWVcbiAgICAgKiAgICAgICAgICAgICAgKy0tLS0tLS0tLS0rXG4gICAgICogICAgICAgICAgICAgIHwgICAgICAgICAgfFxuICAgICAqICAgICAgICAgICAgICB8ICAgICAgICAgIHxcbiAgICAgKiAgICAgICAgICAgICAgfCAgICAgICAgICB8XG4gICAgICogICAgICAgICAgICAgICsgICAgICAgICAgK1xuICAgICAqICAgICAgICAgICAgICAgWCAgICAgICAgWFxuICAgICAqICAgICAgICAgICAgICAgIFggICAgICBYXG4gICAgICogICAgICAgICAgICAgICAgIFggICAgWFxuICAgICAqICAgICAgICAgICAgICAgICAgWCAgWFxuICAgICAqICAgICAgICAgICAgICAgICAgIFhYLlxuICAgICAqXG4gICAgICogQ2FzZSAyOiBwb2ludCBpcyBiZWhpbmQgYW5kIHRvIHRoZSByaWdodFxuICAgICAqICAgICAgICAgICAgICArLS0tLS0tLS0tLStcbiAgICAgKiAgICAgICAgICAgICAgfCAgICAgICAgICBYXG4gICAgICogICAgICAgICAgICAgIHwgICAgICAgICAgIFhcbiAgICAgKiAgICAgICAgICAgICAgfCAgICAgICAgICAgWFhcbiAgICAgKiAgICAgICAgICAgICAgKyAgICAgICAgICAgIFhcbiAgICAgKiAgICAgICAgICAgICAgWFhYICAgICAgICAgIFhYXG4gICAgICogICAgICAgICAgICAgICAgIFhYWFggICAgICAgWFxuICAgICAqICAgICAgICAgICAgICAgICAgICBYWFggICAgIFhYXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBYWCAgIFhcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFhYWC5cbiAgICAgKlxuICAgICAqIENhc2UgMzogcG9pbnQgaXMgYmVoaW5kIGFuZCB0byB0aGUgbGVmdFxuICAgICAqICAgICAgICAgICAgICArLS0tLS0tLS0tLStcbiAgICAgKiAgICAgICAgICAgICBYICAgICAgICAgICB8XG4gICAgICogICAgICAgICAgICAgWCAgICAgICAgICAgfFxuICAgICAqICAgICAgICAgICAgWFggICAgICAgICAgIHxcbiAgICAgKiAgICAgICAgICAgIFggICAgICAgICAgICArXG4gICAgICogICAgICAgICAgIFggICAgICAgICAgWFhYWFxuICAgICAqICAgICAgICAgIFhYICAgICAgIFhYWFxuICAgICAqICAgICAgICAgIFggICAgWFhYWFxuICAgICAqICAgICAgICAgWCBYWFhYXG4gICAgICogICAgICAgICBYWFguXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYnVmZmVyIFRoZSB0aWxlIHBhZGRpbmcgaW4gc2NyZWVuc3BhY2UgcGl4ZWxzLlxuICAgICAqIEByZXR1cm5zIHtQb2ludFtdfSBUaGUgYnVmZmVyZWQgcXVlcnkgZ2VvbWV0cnkuXG4gICAgICovXG4gICAgYnVmZmVyZWRDYW1lcmFHZW9tZXRyeShidWZmZXI6IG51bWJlcik6IFBvaW50W10ge1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLnNjcmVlbkJvdW5kc1swXTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5zY3JlZW5Cb3VuZHMubGVuZ3RoID09PSAxID8gdGhpcy5zY3JlZW5Cb3VuZHNbMF0uYWRkKG5ldyBQb2ludCgxLCAxKSkgOiB0aGlzLnNjcmVlbkJvdW5kc1sxXTtcbiAgICAgICAgY29uc3QgY2FtZXJhUG9seWdvbiA9IHBvbHlnb25pemVCb3VuZHMobWluLCBtYXgsIDAsIGZhbHNlKTtcblxuICAgICAgICAvLyBPbmx5IG5lZWQgdG8gYWNjb3VudCBmb3IgcG9pbnQgdW5kZXJuZWF0aCBjYW1lcmEgaWYgaXRzIGJlaGluZCBxdWVyeSB2b2x1bWVcbiAgICAgICAgaWYgKHRoaXMuY2FtZXJhUG9pbnQueSA+IG1heC55KSB7XG4gICAgICAgICAgICAvL2Nhc2UgMTogaW5zZXJ0IHBvaW50IGluIHRoZSBtaWRkbGVcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbWVyYVBvaW50LnggPiBtaW4ueCAmJiB0aGlzLmNhbWVyYVBvaW50LnggPCBtYXgueCkge1xuICAgICAgICAgICAgICAgIGNhbWVyYVBvbHlnb24uc3BsaWNlKDMsIDAsIHRoaXMuY2FtZXJhUG9pbnQpO1xuICAgICAgICAgICAgLy9jYXNlIDI6IHJlcGxhY2UgYnRtIHJpZ2h0IHBvaW50XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2FtZXJhUG9pbnQueCA+PSBtYXgueCkge1xuICAgICAgICAgICAgICAgIGNhbWVyYVBvbHlnb25bMl0gPSB0aGlzLmNhbWVyYVBvaW50O1xuICAgICAgICAgICAgLy9jYXNlIDM6IHJlcGxhY2UgYnRtIGxlZnQgcG9pbnRcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYW1lcmFQb2ludC54IDw9IG1pbi54KSB7XG4gICAgICAgICAgICAgICAgY2FtZXJhUG9seWdvblszXSA9IHRoaXMuY2FtZXJhUG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYnVmZmVyQ29udmV4UG9seWdvbihjYW1lcmFQb2x5Z29uLCBidWZmZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIHRpbGUgaXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHF1ZXJ5IGdlb21ldHJ5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtUaWxlfSB0aWxlIFRoZSB0aWxlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7VHJhbnNmb3JtfSB0cmFuc2Zvcm0gVGhlIGN1cnJlbnQgbWFwIHRyYW5zZm9ybS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVzZTNEIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcXVlcnkgM0QgZmVhdHVyZXMuXG4gICAgICogQHJldHVybnMgez9UaWxlc3BhY2VRdWVyeUdlb21ldHJ5fSBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSB0aWxlIGRvZXMgbm90IGludGVyc2VjdC5cbiAgICAgKi9cbiAgICBjb250YWluc1RpbGUodGlsZTogVGlsZSwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sIHVzZTNEOiBib29sZWFuKTogP1RpbGVzcGFjZVF1ZXJ5R2VvbWV0cnkge1xuICAgICAgICAvLyBUaGUgYnVmZmVyIGFyb3VuZCB0aGUgcXVlcnkgZ2VvbWV0cnkgaXMgYXBwbGllZCBpbiBzY3JlZW4tc3BhY2UuXG4gICAgICAgIC8vIEZsb2F0aW5nIHBvaW50IGVycm9ycyB3aGVuIHByb2plY3RpbmcgaW50byB0aWxlc3BhY2UgY291bGQgbGVhdmUgYSBmZWF0dXJlXG4gICAgICAgIC8vIG91dHNpZGUgdGhlIHF1ZXJ5IHZvbHVtZSBldmVuIGlmIGl0IGxvb2tzIGxpa2UgaXQgb3ZlcmxhcHMgdmlzdWFsbHksIGEgMXB4IGJpYXMgdmFsdWUgb3ZlcmNvbWVzIHRoYXQuXG4gICAgICAgIGNvbnN0IGJpYXMgPSAxO1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gdGlsZS5xdWVyeVBhZGRpbmcgKyBiaWFzO1xuICAgICAgICBjb25zdCB3cmFwID0gdGlsZS50aWxlSUQud3JhcDtcblxuICAgICAgICBjb25zdCBnZW9tZXRyeUZvclRpbGVDaGVjayA9IHVzZTNEID9cbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlcmVkQ2FtZXJhTWVyY2F0b3IocGFkZGluZywgdHJhbnNmb3JtKS5tYXAoKHApID0+IGdldFRpbGVQb2ludCh0aWxlLnRpbGVUcmFuc2Zvcm0sIHAsIHdyYXApKSA6XG4gICAgICAgICAgICB0aGlzLl9idWZmZXJlZFNjcmVlbk1lcmNhdG9yKHBhZGRpbmcsIHRyYW5zZm9ybSkubWFwKChwKSA9PiBnZXRUaWxlUG9pbnQodGlsZS50aWxlVHJhbnNmb3JtLCBwLCB3cmFwKSk7XG4gICAgICAgIGNvbnN0IHRpbGVzcGFjZVZlYzNzID0gdGhpcy5zY3JlZW5HZW9tZXRyeU1lcmNhdG9yLm1hcCgocCkgPT4gZ2V0VGlsZVZlYzModGlsZS50aWxlVHJhbnNmb3JtLCBwLCB3cmFwKSk7XG4gICAgICAgIGNvbnN0IHRpbGVzcGFjZUdlb21ldHJ5ID0gdGlsZXNwYWNlVmVjM3MubWFwKCh2KSA9PiBuZXcgUG9pbnQodlswXSwgdlsxXSkpO1xuXG4gICAgICAgIGNvbnN0IGNhbWVyYU1lcmNhdG9yID0gdHJhbnNmb3JtLmdldEZyZWVDYW1lcmFPcHRpb25zKCkucG9zaXRpb24gfHwgbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZSgwLCAwLCAwKTtcbiAgICAgICAgY29uc3QgdGlsZXNwYWNlQ2FtZXJhUG9zaXRpb24gPSBnZXRUaWxlVmVjMyh0aWxlLnRpbGVUcmFuc2Zvcm0sIGNhbWVyYU1lcmNhdG9yLCB3cmFwKTtcbiAgICAgICAgY29uc3QgdGlsZXNwYWNlUmF5cyA9IHRpbGVzcGFjZVZlYzNzLm1hcCgodGlsZVZlYykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGlyID0gdmVjMy5zdWIodGlsZVZlYywgdGlsZVZlYywgdGlsZXNwYWNlQ2FtZXJhUG9zaXRpb24pO1xuICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUoZGlyLCBkaXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXkodGlsZXNwYWNlQ2FtZXJhUG9zaXRpb24sIGRpcik7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwaXhlbFRvVGlsZVVuaXRzRmFjdG9yID0gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgdHJhbnNmb3JtLnpvb20pO1xuXG4gICAgICAgIGlmIChwb2x5Z29uSW50ZXJzZWN0c0JveChnZW9tZXRyeUZvclRpbGVDaGVjaywgMCwgMCwgRVhURU5ULCBFWFRFTlQpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnk6IHRoaXMsXG4gICAgICAgICAgICAgICAgdGlsZXNwYWNlR2VvbWV0cnksXG4gICAgICAgICAgICAgICAgdGlsZXNwYWNlUmF5cyxcbiAgICAgICAgICAgICAgICBidWZmZXJlZFRpbGVzcGFjZUdlb21ldHJ5OiBnZW9tZXRyeUZvclRpbGVDaGVjayxcbiAgICAgICAgICAgICAgICBidWZmZXJlZFRpbGVzcGFjZUJvdW5kczogY2xhbXBCb3VuZHNUb1RpbGVFeHRlbnRzKGdldEJvdW5kcyhnZW9tZXRyeUZvclRpbGVDaGVjaykpLFxuICAgICAgICAgICAgICAgIHRpbGUsXG4gICAgICAgICAgICAgICAgdGlsZUlEOiB0aWxlLnRpbGVJRCxcbiAgICAgICAgICAgICAgICBwaXhlbFRvVGlsZVVuaXRzRmFjdG9yXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlc2UgbWV0aG9kcyBhZGQgY2FjaGluZyBvbiB0b3Agb2YgdGhlIHRlcnJhaW4gcmF5Y2FzdGluZyBwcm92aWRlZCBieSBgVHJhbnNmb3JtI3BvaW50Q29vcmRpbmF0ZTNkYC5cbiAgICAgKiBUaWxlcyBjb21lIHdpdGggZGlmZmVyZW50IHZhbHVlcyBvZiBwYWRkaW5nLCBob3dldmVyIGl0cyB2ZXJ5IGxpa2VseSB0aGF0IG11bHRpcGxlIHRpbGVzIHNoYXJlIHRoZSBzYW1lIHZhbHVlIG9mIHBhZGRpbmdcbiAgICAgKiBiYXNlZCBvbiB0aGUgc3R5bGUuIEluIHRoYXQgY2FzZSB3ZSB3YW50IHRvIHJldXNlIHRoZSByZXN1bHQgZnJvbSBhIHByZXZpb3VzbHkgY29tcHV0ZWQgdGVycmFpbiByYXljYXN0LlxuICAgICAqL1xuXG4gICAgX2J1ZmZlcmVkU2NyZWVuTWVyY2F0b3IocGFkZGluZzogbnVtYmVyLCB0cmFuc2Zvcm06IFRyYW5zZm9ybSk6IE1lcmNhdG9yQ29vcmRpbmF0ZVtdIHtcbiAgICAgICAgY29uc3Qga2V5ID0gY2FjaGVLZXkocGFkZGluZyk7XG4gICAgICAgIGlmICh0aGlzLl9zY3JlZW5SYXljYXN0Q2FjaGVba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NjcmVlblJheWNhc3RDYWNoZVtrZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcG9seSA9IHRoaXMuYnVmZmVyZWRTY3JlZW5HZW9tZXRyeShwYWRkaW5nKS5tYXAoKHApID0+IHRyYW5zZm9ybS5wb2ludENvb3JkaW5hdGUzRChwKSk7XG4gICAgICAgICAgICB0aGlzLl9zY3JlZW5SYXljYXN0Q2FjaGVba2V5XSA9IHBvbHk7XG4gICAgICAgICAgICByZXR1cm4gcG9seTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9idWZmZXJlZENhbWVyYU1lcmNhdG9yKHBhZGRpbmc6IG51bWJlciwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBNZXJjYXRvckNvb3JkaW5hdGVbXSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHBhZGRpbmcpO1xuICAgICAgICBpZiAodGhpcy5fY2FtZXJhUmF5Y2FzdENhY2hlW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYW1lcmFSYXljYXN0Q2FjaGVba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBvbHkgPSB0aGlzLmJ1ZmZlcmVkQ2FtZXJhR2VvbWV0cnkocGFkZGluZykubWFwKChwKSA9PiB0cmFuc2Zvcm0ucG9pbnRDb29yZGluYXRlM0QocCkpO1xuICAgICAgICAgICAgdGhpcy5fY2FtZXJhUmF5Y2FzdENhY2hlW2tleV0gPSBwb2x5O1xuICAgICAgICAgICAgcmV0dXJuIHBvbHk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vUGFkZGluZyBpcyBpbiBzY3JlZW4gcGl4ZWxzIGFuZCBpcyBvbmx5IHVzZWQgYXMgYSBjb2Fyc2UgY2hlY2ssIHNvIDIgZGVjaW1hbCBwbGFjZXMgb2YgcHJlY2lzaW9uIHNob3VsZCBiZSBnb29kIGVub3VnaCBmb3IgYSBjYWNoZS5cbmZ1bmN0aW9uIGNhY2hlS2V5KHBhZGRpbmc6IG51bWJlcik6IG51bWJlciAge1xuICAgIHJldHVybiAocGFkZGluZyAqIDEwMCkgfCAwO1xufVxuXG5leHBvcnQgdHlwZSBUaWxlc3BhY2VRdWVyeUdlb21ldHJ5ID0ge1xuICAgIHF1ZXJ5R2VvbWV0cnk6IFF1ZXJ5R2VvbWV0cnksXG4gICAgdGlsZXNwYWNlR2VvbWV0cnk6IFBvaW50W10sXG4gICAgdGlsZXNwYWNlUmF5czogUmF5W10sXG4gICAgYnVmZmVyZWRUaWxlc3BhY2VHZW9tZXRyeTogUG9pbnRbXSxcbiAgICBidWZmZXJlZFRpbGVzcGFjZUJvdW5kczogeyBtaW46IFBvaW50LCBtYXg6IFBvaW50fSxcbiAgICB0aWxlOiBUaWxlLFxuICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCxcbiAgICBwaXhlbFRvVGlsZVVuaXRzRmFjdG9yOiBudW1iZXJcbn07XG5cbmZ1bmN0aW9uIGNsYW1wQm91bmRzVG9UaWxlRXh0ZW50cyhib3VuZHM6IHttaW46IFBvaW50LCBtYXg6IFBvaW50fSk6IHttaW46IFBvaW50LCBtYXg6IFBvaW50fSB7XG4gICAgYm91bmRzLm1pbi54ID0gY2xhbXAoYm91bmRzLm1pbi54LCAwLCBFWFRFTlQpO1xuICAgIGJvdW5kcy5taW4ueSA9IGNsYW1wKGJvdW5kcy5taW4ueSwgMCwgRVhURU5UKTtcblxuICAgIGJvdW5kcy5tYXgueCA9IGNsYW1wKGJvdW5kcy5tYXgueCwgMCwgRVhURU5UKTtcbiAgICBib3VuZHMubWF4LnkgPSBjbGFtcChib3VuZHMubWF4LnksIDAsIEVYVEVOVCk7XG4gICAgcmV0dXJuIGJvdW5kcztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7cGljaywgZXh0ZW5kfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuXG5pbXBvcnQge2dldEpTT04sIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5cbmltcG9ydCB0eXBlIHtSZXF1ZXN0TWFuYWdlcn0gZnJvbSAnLi4vdXRpbC9tYXBib3guanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZUpTT059IGZyb20gJy4uL3R5cGVzL3RpbGVqc29uLmpzJztcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob3B0aW9uczogYW55LCByZXF1ZXN0TWFuYWdlcjogUmVxdWVzdE1hbmFnZXIsIGNhbGxiYWNrOiBDYWxsYmFjazxUaWxlSlNPTj4pOiBDYW5jZWxhYmxlIHtcbiAgICBjb25zdCBsb2FkZWQgPSBmdW5jdGlvbihlcnI6ID9FcnJvciwgdGlsZUpTT046ID9PYmplY3QpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH0gZWxzZSBpZiAodGlsZUpTT04pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gcGljayhcbiAgICAgICAgICAgICAgICAvLyBleHBsaWNpdCBzb3VyY2Ugb3B0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBUaWxlSlNPTlxuICAgICAgICAgICAgICAgIGV4dGVuZCh0aWxlSlNPTiwgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgWyd0aWxlcycsICdtaW56b29tJywgJ21heHpvb20nLCAnYXR0cmlidXRpb24nLCAnbWFwYm94X2xvZ28nLCAnYm91bmRzJywgJ3NjaGVtZScsICd0aWxlU2l6ZScsICdlbmNvZGluZyddXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAodGlsZUpTT04udmVjdG9yX2xheWVycykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC52ZWN0b3JMYXllcnMgPSB0aWxlSlNPTi52ZWN0b3JfbGF5ZXJzO1xuICAgICAgICAgICAgICAgIHJlc3VsdC52ZWN0b3JMYXllcklkcyA9IHJlc3VsdC52ZWN0b3JMYXllcnMubWFwKChsYXllcikgPT4geyByZXR1cm4gbGF5ZXIuaWQ7IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQudGlsZXMgPSByZXF1ZXN0TWFuYWdlci5jYW5vbmljYWxpemVUaWxlc2V0KHJlc3VsdCwgb3B0aW9ucy51cmwpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgICAgcmV0dXJuIGdldEpTT04ocmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChyZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTb3VyY2VVUkwob3B0aW9ucy51cmwpLCBSZXNvdXJjZVR5cGUuU291cmNlKSwgbG9hZGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYnJvd3Nlci5mcmFtZSgoKSA9PiBsb2FkZWQobnVsbCwgb3B0aW9ucykpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBMbmdMYXRCb3VuZHMgZnJvbSAnLi4vZ2VvL2xuZ19sYXRfYm91bmRzLmpzJztcbmltcG9ydCB7bWVyY2F0b3JYZnJvbUxuZywgbWVyY2F0b3JZZnJvbUxhdH0gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQuanMnO1xuXG5jbGFzcyBUaWxlQm91bmRzIHtcbiAgICBib3VuZHM6IExuZ0xhdEJvdW5kcztcbiAgICBtaW56b29tOiBudW1iZXI7XG4gICAgbWF4em9vbTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoYm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbWluem9vbTogP251bWJlciwgbWF4em9vbTogP251bWJlcikge1xuICAgICAgICB0aGlzLmJvdW5kcyA9IExuZ0xhdEJvdW5kcy5jb252ZXJ0KHRoaXMudmFsaWRhdGVCb3VuZHMoYm91bmRzKSk7XG4gICAgICAgIHRoaXMubWluem9vbSA9IG1pbnpvb20gfHwgMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gbWF4em9vbSB8fCAyNDtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUJvdW5kcyhib3VuZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYm91bmRzIHByb3BlcnR5IGNvbnRhaW5zIHZhbGlkIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGVzXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShib3VuZHMpIHx8IGJvdW5kcy5sZW5ndGggIT09IDQpIHJldHVybiBbLTE4MCwgLTkwLCAxODAsIDkwXTtcbiAgICAgICAgcmV0dXJuIFtNYXRoLm1heCgtMTgwLCBib3VuZHNbMF0pLCBNYXRoLm1heCgtOTAsIGJvdW5kc1sxXSksIE1hdGgubWluKDE4MCwgYm91bmRzWzJdKSwgTWF0aC5taW4oOTAsIGJvdW5kc1szXSldO1xuICAgIH1cblxuICAgIGNvbnRhaW5zKHRpbGVJRDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgICAgIGNvbnN0IHdvcmxkU2l6ZSA9IE1hdGgucG93KDIsIHRpbGVJRC56KTtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSB7XG4gICAgICAgICAgICBtaW5YOiBNYXRoLmZsb29yKG1lcmNhdG9yWGZyb21MbmcodGhpcy5ib3VuZHMuZ2V0V2VzdCgpKSAqIHdvcmxkU2l6ZSksXG4gICAgICAgICAgICBtaW5ZOiBNYXRoLmZsb29yKG1lcmNhdG9yWWZyb21MYXQodGhpcy5ib3VuZHMuZ2V0Tm9ydGgoKSkgKiB3b3JsZFNpemUpLFxuICAgICAgICAgICAgbWF4WDogTWF0aC5jZWlsKG1lcmNhdG9yWGZyb21MbmcodGhpcy5ib3VuZHMuZ2V0RWFzdCgpKSAqIHdvcmxkU2l6ZSksXG4gICAgICAgICAgICBtYXhZOiBNYXRoLmNlaWwobWVyY2F0b3JZZnJvbUxhdCh0aGlzLmJvdW5kcy5nZXRTb3V0aCgpKSAqIHdvcmxkU2l6ZSlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGl0ID0gdGlsZUlELnggPj0gbGV2ZWwubWluWCAmJiB0aWxlSUQueCA8IGxldmVsLm1heFggJiYgdGlsZUlELnkgPj0gbGV2ZWwubWluWSAmJiB0aWxlSUQueSA8IGxldmVsLm1heFk7XG4gICAgICAgIHJldHVybiBoaXQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUaWxlQm91bmRzO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcblxuaW1wb3J0IHtleHRlbmQsIHBpY2t9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgbG9hZFRpbGVKU09OIGZyb20gJy4vbG9hZF90aWxlanNvbi5qcyc7XG5pbXBvcnQge3Bvc3RUdXJuc3RpbGVFdmVudH0gZnJvbSAnLi4vdXRpbC9tYXBib3guanMnO1xuaW1wb3J0IFRpbGVCb3VuZHMgZnJvbSAnLi90aWxlX2JvdW5kcy5qcyc7XG5pbXBvcnQge1Jlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQge2NhY2hlRW50cnlQb3NzaWJseUFkZGVkfSBmcm9tICcuLi91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZS5qcyc7XG5pbXBvcnQge0RlZHVwZWRSZXF1ZXN0LCBsb2FkVmVjdG9yVGlsZX0gZnJvbSAnLi92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlLmpzJztcblxuaW1wb3J0IHR5cGUge1NvdXJjZX0gZnJvbSAnLi9zb3VyY2UuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwLmpzJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlLmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUuanMnO1xuaW1wb3J0IHR5cGUge1ZlY3RvclNvdXJjZVNwZWNpZmljYXRpb24sIFByb21vdGVJZFNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgQWN0b3IgZnJvbSAnLi4vdXRpbC9hY3Rvci5qcyc7XG5pbXBvcnQgdHlwZSB7TG9hZFZlY3RvclRpbGVSZXN1bHR9IGZyb20gJy4vdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZS5qcyc7XG5cbi8qKlxuICogQSBzb3VyY2UgY29udGFpbmluZyB2ZWN0b3IgdGlsZXMgaW4gW01hcGJveCBWZWN0b3IgVGlsZSBmb3JtYXRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL3ZlY3Rvci10aWxlcy9yZWZlcmVuY2UvKS5cbiAqIFNlZSB0aGUgW1N0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3NvdXJjZXMvI3ZlY3RvcikgZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAndmVjdG9yJyxcbiAqICAgICB1cmw6ICdtYXBib3g6Ly9tYXBib3gubWFwYm94LXN0cmVldHMtdjgnXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAndmVjdG9yJyxcbiAqICAgICB0aWxlczogWydodHRwczovL2QyNXVhcmh4eXd6bDFqLmNsb3VkZnJvbnQubmV0L3YwLjEve3p9L3t4fS97eX0ubXZ0J10sXG4gKiAgICAgbWluem9vbTogNixcbiAqICAgICBtYXh6b29tOiAxNFxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKS5zZXRVcmwoXCJtYXBib3g6Ly9tYXBib3gubWFwYm94LXN0cmVldHMtdjhcIik7XG4gKlxuICogQGV4YW1wbGVcbiAqIG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKS5zZXRUaWxlcyhbJ2h0dHBzOi8vZDI1dWFyaHh5d3psMWouY2xvdWRmcm9udC5uZXQvdjAuMS97en0ve3h9L3t5fS5tdnQnXSk7XG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSB2ZWN0b3IgdGlsZSBzb3VyY2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3ZlY3Rvci1zb3VyY2UvKVxuICogQHNlZSBbRXhhbXBsZTogQWRkIGEgdGhpcmQgcGFydHkgdmVjdG9yIHRpbGUgc291cmNlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90aGlyZC1wYXJ0eS8pXG4gKi9cbmNsYXNzIFZlY3RvclRpbGVTb3VyY2UgZXh0ZW5kcyBFdmVudGVkIGltcGxlbWVudHMgU291cmNlIHtcbiAgICB0eXBlOiAndmVjdG9yJztcbiAgICBpZDogc3RyaW5nO1xuICAgIG1pbnpvb206IG51bWJlcjtcbiAgICBtYXh6b29tOiBudW1iZXI7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgc2NoZW1lOiBzdHJpbmc7XG4gICAgdGlsZVNpemU6IG51bWJlcjtcbiAgICBwcm9tb3RlSWQ6ID9Qcm9tb3RlSWRTcGVjaWZpY2F0aW9uO1xuXG4gICAgX29wdGlvbnM6IFZlY3RvclNvdXJjZVNwZWNpZmljYXRpb247XG4gICAgX2NvbGxlY3RSZXNvdXJjZVRpbWluZzogYm9vbGVhbjtcbiAgICBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xuICAgIG1hcDogTWFwO1xuICAgIGJvdW5kczogP1tudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIHRpbGVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHRpbGVCb3VuZHM6IFRpbGVCb3VuZHM7XG4gICAgcmVwYXJzZU92ZXJzY2FsZWQ6IGJvb2xlYW47XG4gICAgaXNUaWxlQ2xpcHBlZDogYm9vbGVhbjtcbiAgICBfdGlsZUpTT05SZXF1ZXN0OiA/Q2FuY2VsYWJsZTtcbiAgICBfbG9hZGVkOiBib29sZWFuO1xuICAgIF90aWxlV29ya2Vyczoge1tzdHJpbmddOiBBY3Rvcn07XG4gICAgX2RlZHVwZWQ6IERlZHVwZWRSZXF1ZXN0O1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogVmVjdG9yU291cmNlU3BlY2lmaWNhdGlvbiAmIHtjb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW59LCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcblxuICAgICAgICB0aGlzLnR5cGUgPSAndmVjdG9yJztcbiAgICAgICAgdGhpcy5taW56b29tID0gMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMjI7XG4gICAgICAgIHRoaXMuc2NoZW1lID0gJ3h5eic7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XG4gICAgICAgIHRoaXMucmVwYXJzZU92ZXJzY2FsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmlzVGlsZUNsaXBwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcblxuICAgICAgICBleHRlbmQodGhpcywgcGljayhvcHRpb25zLCBbJ3VybCcsICdzY2hlbWUnLCAndGlsZVNpemUnLCAncHJvbW90ZUlkJ10pKTtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IGV4dGVuZCh7dHlwZTogJ3ZlY3Rvcid9LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSBvcHRpb25zLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcblxuICAgICAgICBpZiAodGhpcy50aWxlU2l6ZSAhPT0gNTEyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZlY3RvciB0aWxlIHNvdXJjZXMgbXVzdCBoYXZlIGEgdGlsZVNpemUgb2YgNTEyJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XG5cbiAgICAgICAgdGhpcy5fdGlsZVdvcmtlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fZGVkdXBlZCA9IG5ldyBEZWR1cGVkUmVxdWVzdCgpO1xuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3NvdXJjZSd9KSk7XG4gICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IGxvYWRUaWxlSlNPTih0aGlzLl9vcHRpb25zLCB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIsIChlcnIsIHRpbGVKU09OKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbGVKU09OKSB7XG4gICAgICAgICAgICAgICAgZXh0ZW5kKHRoaXMsIHRpbGVKU09OKTtcbiAgICAgICAgICAgICAgICBpZiAodGlsZUpTT04uYm91bmRzKSB0aGlzLnRpbGVCb3VuZHMgPSBuZXcgVGlsZUJvdW5kcyh0aWxlSlNPTi5ib3VuZHMsIHRoaXMubWluem9vbSwgdGhpcy5tYXh6b29tKTtcbiAgICAgICAgICAgICAgICBwb3N0VHVybnN0aWxlRXZlbnQodGlsZUpTT04udGlsZXMsIHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci5fY3VzdG9tQWNjZXNzVG9rZW4pO1xuXG4gICAgICAgICAgICAgICAgLy8gYGNvbnRlbnRgIGlzIGluY2x1ZGVkIGhlcmUgdG8gcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGBTdHlsZSNfdXBkYXRlU291cmNlc2AgaXMgY2FsbGVkXG4gICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBUaWxlSlNPTiBhcnJpdmVzLiB0aGlzIG1ha2VzIHN1cmUgdGhlIHRpbGVzIG5lZWRlZCBhcmUgbG9hZGVkIG9uY2UgVGlsZUpTT04gYXJyaXZlc1xuICAgICAgICAgICAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvcHVsbC80MzQ3I2Rpc2N1c3Npb25fcjEwNDQxODA4OFxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ30pKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdjb250ZW50J30pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xuICAgIH1cblxuICAgIGhhc1RpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50aWxlQm91bmRzIHx8IHRoaXMudGlsZUJvdW5kcy5jb250YWlucyh0aWxlSUQuY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgc2V0U291cmNlUHJvcGVydHkoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl90aWxlSlNPTlJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKCk7XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5tYXAuc3R5bGUuX2dldFNvdXJjZUNhY2hlcyh0aGlzLmlkKTtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VDYWNoZSBvZiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlLmNsZWFyVGlsZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzb3VyY2UgYHRpbGVzYCBwcm9wZXJ0eSBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdGlsZXMgQW4gYXJyYXkgb2Ygb25lIG9yIG1vcmUgdGlsZSBzb3VyY2UgVVJMcywgYXMgaW4gdGhlIFRpbGVKU09OIHNwZWMuXG4gICAgICogQHJldHVybnMge1ZlY3RvclRpbGVTb3VyY2V9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuYWRkU291cmNlKCd2ZWN0b3Jfc291cmNlX2lkJywge1xuICAgICAqICAgICB0eXBlOiAndmVjdG9yJyxcbiAgICAgKiAgICAgdGlsZXM6IFsnaHR0cHM6Ly9zb21lX2VuZF9wb2ludC5uZXQve3p9L3t4fS97eX0ubXZ0J10sXG4gICAgICogICAgIG1pbnpvb206IDYsXG4gICAgICogICAgIG1heHpvb206IDE0XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjb25zdCB2ZWN0b3JUaWxlU291cmNlID0gbWFwLmdldFNvdXJjZSgndmVjdG9yX3NvdXJjZV9pZCcpO1xuICAgICAqXG4gICAgICogLy8gU2V0IHRoZSBlbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggYSB2ZWN0b3IgdGlsZSBzb3VyY2UuXG4gICAgICogdmVjdG9yVGlsZVNvdXJjZS5zZXRUaWxlcyhbJ2h0dHBzOi8vYW5vdGhlcl9lbmRfcG9pbnQubmV0L3t6fS97eH0ve3l9Lm12dCddKTtcbiAgICAgKi9cbiAgICBzZXRUaWxlcyh0aWxlczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICB0aGlzLnNldFNvdXJjZVByb3BlcnR5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMudGlsZXMgPSB0aWxlcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc291cmNlIGB1cmxgIHByb3BlcnR5IGFuZCByZS1yZW5kZXJzIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIEEgVVJMIHRvIGEgVGlsZUpTT04gcmVzb3VyY2UuIFN1cHBvcnRlZCBwcm90b2NvbHMgYXJlIGBodHRwOmAsIGBodHRwczpgLCBhbmQgYG1hcGJveDovLzxUaWxlc2V0IElEPmAuXG4gICAgICogQHJldHVybnMge1ZlY3RvclRpbGVTb3VyY2V9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuYWRkU291cmNlKCd2ZWN0b3Jfc291cmNlX2lkJywge1xuICAgICAqICAgICB0eXBlOiAndmVjdG9yJyxcbiAgICAgKiAgICAgdXJsOiAnbWFwYm94Oi8vbWFwYm94Lm1hcGJveC1zdHJlZXRzLXY3J1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc3QgdmVjdG9yVGlsZVNvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ3ZlY3Rvcl9zb3VyY2VfaWQnKTtcbiAgICAgKlxuICAgICAqIC8vIFVwZGF0ZSB2ZWN0b3IgdGlsZSBzb3VyY2UgdG8gYSBuZXcgVVJMIGVuZHBvaW50XG4gICAgICogdmVjdG9yVGlsZVNvdXJjZS5zZXRVcmwoXCJtYXBib3g6Ly9tYXBib3gubWFwYm94LXN0cmVldHMtdjhcIik7XG4gICAgICovXG4gICAgc2V0VXJsKHVybDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0U291cmNlUHJvcGVydHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLnVybCA9IHVybDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl90aWxlSlNPTlJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHRoaXMuX29wdGlvbnMpO1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplVGlsZVVSTCh0aWxlLnRpbGVJRC5jYW5vbmljYWwudXJsKHRoaXMudGlsZXMsIHRoaXMuc2NoZW1lKSk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5UaWxlKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgIHRpbGVJRDogdGlsZS50aWxlSUQsXG4gICAgICAgICAgICB0aWxlWm9vbTogdGlsZS50aWxlWm9vbSxcbiAgICAgICAgICAgIHpvb206IHRpbGUudGlsZUlELm92ZXJzY2FsZWRaLFxuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUgKiB0aWxlLnRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIHBpeGVsUmF0aW86IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIHNob3dDb2xsaXNpb25Cb3hlczogdGhpcy5tYXAuc2hvd0NvbGxpc2lvbkJveGVzLFxuICAgICAgICAgICAgcHJvbW90ZUlkOiB0aGlzLnByb21vdGVJZCxcbiAgICAgICAgICAgIGlzU3ltYm9sVGlsZTogdGlsZS5pc1N5bWJvbFRpbGVcbiAgICAgICAgfTtcbiAgICAgICAgcGFyYW1zLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nID0gdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nO1xuXG4gICAgICAgIGlmICghdGlsZS5hY3RvciB8fCB0aWxlLnN0YXRlID09PSAnZXhwaXJlZCcpIHtcbiAgICAgICAgICAgIHRpbGUuYWN0b3IgPSB0aGlzLl90aWxlV29ya2Vyc1t1cmxdID0gdGhpcy5fdGlsZVdvcmtlcnNbdXJsXSB8fCB0aGlzLmRpc3BhdGNoZXIuZ2V0QWN0b3IoKTtcblxuICAgICAgICAgICAgLy8gaWYgd29ya2VycyBhcmUgbm90IHJlYWR5IHRvIHJlY2VpdmUgbWVzc2FnZXMgeWV0LCB1c2UgdGhlIGlkbGUgdGltZSB0byBwcmVlbXB0aXZlbHlcbiAgICAgICAgICAgIC8vIGxvYWQgdGlsZXMgb24gdGhlIG1haW4gdGhyZWFkIGFuZCBwYXNzIHRoZSByZXN1bHQgaW5zdGVhZCBvZiByZXF1ZXN0aW5nIGEgd29ya2VyIHRvIGRvIHNvXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzcGF0Y2hlci5yZWFkeSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbCA9IGxvYWRWZWN0b3JUaWxlLmNhbGwoe2RlZHVwZWQ6IHRoaXMuX2RlZHVwZWR9LCBwYXJhbXMsIChlcnI6ID9FcnJvciwgZGF0YTogP0xvYWRWZWN0b3JUaWxlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgfHwgIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUuY2FsbCh0aGlzLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtlciB3aWxsIHNraXAgdGhlIG5ldHdvcmsgcmVxdWVzdCBpZiB0aGUgZGF0YSBpcyBhbHJlYWR5IHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUNvbnRyb2w6IGRhdGEuY2FjaGVDb250cm9sLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM6IGRhdGEuZXhwaXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdEYXRhOiBkYXRhLnJhd0RhdGEuc2xpY2UoMClcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGlsZS5hY3RvcikgdGlsZS5hY3Rvci5zZW5kKCdsb2FkVGlsZScsIHBhcmFtcywgZG9uZS5iaW5kKHRoaXMpLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGlsZS5yZXF1ZXN0ID0ge2NhbmNlbH07XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGlsZS5yZXF1ZXN0ID0gdGlsZS5hY3Rvci5zZW5kKCdsb2FkVGlsZScsIHBhcmFtcywgZG9uZS5iaW5kKHRoaXMpLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAodGlsZS5zdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgICAvLyBzY2hlZHVsZSB0aWxlIHJlbG9hZGluZyBhZnRlciBpdCBoYXMgYmVlbiBsb2FkZWRcbiAgICAgICAgICAgIHRpbGUucmVsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZS5yZXF1ZXN0ID0gdGlsZS5hY3Rvci5zZW5kKCdyZWxvYWRUaWxlJywgcGFyYW1zLCBkb25lLmJpbmQodGhpcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZG9uZShlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLnJlcXVlc3Q7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0ZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgICAgICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc291cmNlVGltaW5nKVxuICAgICAgICAgICAgICAgIHRpbGUucmVzb3VyY2VUaW1pbmcgPSBkYXRhLnJlc291cmNlVGltaW5nO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMgJiYgZGF0YSkgdGlsZS5zZXRFeHBpcnlEYXRhKGRhdGEpO1xuICAgICAgICAgICAgdGlsZS5sb2FkVmVjdG9yRGF0YShkYXRhLCB0aGlzLm1hcC5wYWludGVyKTtcblxuICAgICAgICAgICAgY2FjaGVFbnRyeVBvc3NpYmx5QWRkZWQodGhpcy5kaXNwYXRjaGVyKTtcblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLnJlbG9hZENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkVGlsZSh0aWxlLCB0aWxlLnJlbG9hZENhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB0aWxlLnJlbG9hZENhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFib3J0VGlsZSh0aWxlOiBUaWxlKSB7XG4gICAgICAgIGlmICh0aWxlLnJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRpbGUucmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLnJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbGUuYWN0b3IpIHtcbiAgICAgICAgICAgIHRpbGUuYWN0b3Iuc2VuZCgnYWJvcnRUaWxlJywge3VpZDogdGlsZS51aWQsIHR5cGU6IHRoaXMudHlwZSwgc291cmNlOiB0aGlzLmlkfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bmxvYWRUaWxlKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKCk7XG4gICAgICAgIGlmICh0aWxlLmFjdG9yKSB7XG4gICAgICAgICAgICB0aWxlLmFjdG9yLnNlbmQoJ3JlbW92ZVRpbGUnLCB7dWlkOiB0aWxlLnVpZCwgdHlwZTogdGhpcy50eXBlLCBzb3VyY2U6IHRoaXMuaWR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhZnRlclVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5fdGlsZVdvcmtlcnMgPSB7fTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZlY3RvclRpbGVTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2V4dGVuZCwgcGlja30gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHtnZXRJbWFnZSwgUmVzb3VyY2VUeXBlfSBmcm9tICcuLi91dGlsL2FqYXguanMnO1xuaW1wb3J0IHtFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCBsb2FkVGlsZUpTT04gZnJvbSAnLi9sb2FkX3RpbGVqc29uLmpzJztcbmltcG9ydCB7cG9zdFR1cm5zdGlsZUV2ZW50fSBmcm9tICcuLi91dGlsL21hcGJveC5qcyc7XG5pbXBvcnQgVGlsZUJvdW5kcyBmcm9tICcuL3RpbGVfYm91bmRzLmpzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL3JlbmRlci90ZXh0dXJlLmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5cbmltcG9ydCB7Y2FjaGVFbnRyeVBvc3NpYmx5QWRkZWR9IGZyb20gJy4uL3V0aWwvdGlsZV9yZXF1ZXN0X2NhY2hlLmpzJztcblxuaW1wb3J0IHR5cGUge1NvdXJjZX0gZnJvbSAnLi9zb3VyY2UuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwLmpzJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlLmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUuanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIFJhc3RlclNvdXJjZVNwZWNpZmljYXRpb24sXG4gICAgUmFzdGVyREVNU291cmNlU3BlY2lmaWNhdGlvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcblxuY2xhc3MgUmFzdGVyVGlsZVNvdXJjZSBleHRlbmRzIEV2ZW50ZWQgaW1wbGVtZW50cyBTb3VyY2Uge1xuICAgIHR5cGU6ICdyYXN0ZXInIHwgJ3Jhc3Rlci1kZW0nO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWluem9vbTogbnVtYmVyO1xuICAgIG1heHpvb206IG51bWJlcjtcbiAgICB1cmw6IHN0cmluZztcbiAgICBzY2hlbWU6IHN0cmluZztcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuXG4gICAgYm91bmRzOiA/W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgdGlsZUJvdW5kczogVGlsZUJvdW5kcztcbiAgICByb3VuZFpvb206IGJvb2xlYW47XG4gICAgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcbiAgICBtYXA6IE1hcDtcbiAgICB0aWxlczogQXJyYXk8c3RyaW5nPjtcblxuICAgIF9sb2FkZWQ6IGJvb2xlYW47XG4gICAgX29wdGlvbnM6IFJhc3RlclNvdXJjZVNwZWNpZmljYXRpb24gfCBSYXN0ZXJERU1Tb3VyY2VTcGVjaWZpY2F0aW9uO1xuICAgIF90aWxlSlNPTlJlcXVlc3Q6ID9DYW5jZWxhYmxlO1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogUmFzdGVyU291cmNlU3BlY2lmaWNhdGlvbiB8IFJhc3RlckRFTVNvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XG5cbiAgICAgICAgdGhpcy50eXBlID0gJ3Jhc3Rlcic7XG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xuICAgICAgICB0aGlzLnJvdW5kWm9vbSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2NoZW1lID0gJ3h5eic7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBleHRlbmQoe3R5cGU6ICdyYXN0ZXInfSwgb3B0aW9ucyk7XG4gICAgICAgIGV4dGVuZCh0aGlzLCBwaWNrKG9wdGlvbnMsIFsndXJsJywgJ3NjaGVtZScsICd0aWxlU2l6ZSddKSk7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc291cmNlJ30pKTtcbiAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbG9hZFRpbGVKU09OKHRoaXMuX29wdGlvbnMsIHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlciwgKGVyciwgdGlsZUpTT04pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGlsZUpTT04pIHtcbiAgICAgICAgICAgICAgICBleHRlbmQodGhpcywgdGlsZUpTT04pO1xuICAgICAgICAgICAgICAgIGlmICh0aWxlSlNPTi5ib3VuZHMpIHRoaXMudGlsZUJvdW5kcyA9IG5ldyBUaWxlQm91bmRzKHRpbGVKU09OLmJvdW5kcywgdGhpcy5taW56b29tLCB0aGlzLm1heHpvb20pO1xuXG4gICAgICAgICAgICAgICAgcG9zdFR1cm5zdGlsZUV2ZW50KHRpbGVKU09OLnRpbGVzKTtcblxuICAgICAgICAgICAgICAgIC8vIGBjb250ZW50YCBpcyBpbmNsdWRlZCBoZXJlIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBgU3R5bGUjX3VwZGF0ZVNvdXJjZXNgIGlzIGNhbGxlZFxuICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgVGlsZUpTT04gYXJyaXZlcy4gdGhpcyBtYWtlcyBzdXJlIHRoZSB0aWxlcyBuZWVkZWQgYXJlIGxvYWRlZCBvbmNlIFRpbGVKU09OIGFycml2ZXNcbiAgICAgICAgICAgICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL3B1bGwvNDM0NyNkaXNjdXNzaW9uX3IxMDQ0MTgwODhcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdtZXRhZGF0YSd9KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnY29udGVudCd9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlZDtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl90aWxlSlNPTlJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHRoaXMuX29wdGlvbnMpO1xuICAgIH1cblxuICAgIGhhc1RpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy50aWxlQm91bmRzIHx8IHRoaXMudGlsZUJvdW5kcy5jb250YWlucyh0aWxlSUQuY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgY29uc3QgdXNlMnggPSBicm93c2VyLmRldmljZVBpeGVsUmF0aW8gPj0gMjtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVRpbGVVUkwodGlsZS50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLCB0aGlzLnNjaGVtZSksIHVzZTJ4LCB0aGlzLnRpbGVTaXplKTtcbiAgICAgICAgdGlsZS5yZXF1ZXN0ID0gZ2V0SW1hZ2UodGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuVGlsZSksIChlcnIsIGltZywgY2FjaGVDb250cm9sLCBleHBpcmVzKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuXG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICd1bmxvYWRlZCc7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnZXJyb3JlZCc7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW1nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwLl9yZWZyZXNoRXhwaXJlZFRpbGVzKSB0aWxlLnNldEV4cGlyeURhdGEoe2NhY2hlQ29udHJvbCwgZXhwaXJlc30pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMubWFwLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gdGhpcy5tYXAucGFpbnRlci5nZXRUaWxlVGV4dHVyZShpbWcud2lkdGgpO1xuICAgICAgICAgICAgICAgIGlmICh0aWxlLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlLnVwZGF0ZShpbWcsIHt1c2VNaXBtYXA6IHRydWV9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCBpbWcsIGdsLlJHQkEsIHt1c2VNaXBtYXA6IHRydWV9KTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmYoZ2wuVEVYVFVSRV8yRCwgY29udGV4dC5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMuVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIGNvbnRleHQuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljTWF4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnbG9hZGVkJztcblxuICAgICAgICAgICAgICAgIGNhY2hlRW50cnlQb3NzaWJseUFkZGVkKHRoaXMuZGlzcGF0Y2hlcik7XG5cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWJvcnRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICBpZiAodGlsZS5yZXF1ZXN0KSB7XG4gICAgICAgICAgICB0aWxlLnJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgdW5sb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgaWYgKHRpbGUudGV4dHVyZSkgdGhpcy5tYXAucGFpbnRlci5zYXZlVGlsZVRleHR1cmUodGlsZS50ZXh0dXJlKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSYXN0ZXJUaWxlU291cmNlO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cuanMnO1xuXG5sZXQgc3VwcG9ydHNPZmZzY3JlZW5DYW52YXM6ID9ib29sZWFuO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHN1cHBvcnRzT2Zmc2NyZWVuQ2FudmFzID09IG51bGwpIHtcbiAgICAgICAgc3VwcG9ydHNPZmZzY3JlZW5DYW52YXMgPSB3aW5kb3cuT2Zmc2NyZWVuQ2FudmFzICYmXG4gICAgICAgICAgICBuZXcgd2luZG93Lk9mZnNjcmVlbkNhbnZhcygxLCAxKS5nZXRDb250ZXh0KCcyZCcpICYmXG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93LmNyZWF0ZUltYWdlQml0bWFwID09PSAnZnVuY3Rpb24nO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBwb3J0c09mZnNjcmVlbkNhbnZhcztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Z2V0SW1hZ2UsIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCB7ZXh0ZW5kLCBwcmV2UG93ZXJPZlR3b30gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7RXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcbmltcG9ydCBvZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQgZnJvbSAnLi4vdXRpbC9vZmZzY3JlZW5fY2FudmFzX3N1cHBvcnRlZC5qcyc7XG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5pbXBvcnQgUmFzdGVyVGlsZVNvdXJjZSBmcm9tICcuL3Jhc3Rlcl90aWxlX3NvdXJjZS5qcyc7XG4vLyBlbnN1cmUgREVNRGF0YSBpcyByZWdpc3RlcmVkIGZvciB3b3JrZXIgdHJhbnNmZXIgb24gbWFpbiB0aHJlYWQ6XG5pbXBvcnQgJy4uL2RhdGEvZGVtX2RhdGEuanMnO1xuXG5pbXBvcnQgdHlwZSB7U291cmNlfSBmcm9tICcuL3NvdXJjZS5qcyc7XG5pbXBvcnQgdHlwZSBEaXNwYXRjaGVyIGZyb20gJy4uL3V0aWwvZGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcbmltcG9ydCB0eXBlIHtSYXN0ZXJERU1Tb3VyY2VTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcblxuY2xhc3MgUmFzdGVyREVNVGlsZVNvdXJjZSBleHRlbmRzIFJhc3RlclRpbGVTb3VyY2UgaW1wbGVtZW50cyBTb3VyY2Uge1xuICAgIGVuY29kaW5nOiBcIm1hcGJveFwiIHwgXCJ0ZXJyYXJpdW1cIjtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFJhc3RlckRFTVNvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICAgICAgc3VwZXIoaWQsIG9wdGlvbnMsIGRpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQpO1xuICAgICAgICB0aGlzLnR5cGUgPSAncmFzdGVyLWRlbSc7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gZXh0ZW5kKHt0eXBlOiAncmFzdGVyLWRlbSd9LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2RpbmcgfHwgXCJtYXBib3hcIjtcbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVRpbGVVUkwodGlsZS50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLCB0aGlzLnNjaGVtZSksIGZhbHNlLCB0aGlzLnRpbGVTaXplKTtcbiAgICAgICAgdGlsZS5yZXF1ZXN0ID0gZ2V0SW1hZ2UodGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuVGlsZSksIGltYWdlTG9hZGVkLmJpbmQodGhpcykpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGltYWdlTG9hZGVkKGVyciwgaW1nLCBjYWNoZUNvbnRyb2wsIGV4cGlyZXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLnJlcXVlc3Q7XG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICd1bmxvYWRlZCc7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnZXJyb3JlZCc7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW1nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwLl9yZWZyZXNoRXhwaXJlZFRpbGVzKSB0aWxlLnNldEV4cGlyeURhdGEoe2NhY2hlQ29udHJvbCwgZXhwaXJlc30pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVyID0gd2luZG93LkltYWdlQml0bWFwICYmIGltZyBpbnN0YW5jZW9mIHdpbmRvdy5JbWFnZUJpdG1hcCAmJiBvZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKTtcbiAgICAgICAgICAgICAgICAvLyBERU1EYXRhIHVzZXMgMXB4IHBhZGRpbmcuIEhhbmRsZSBjYXNlcyB3aXRoIGltYWdlIGJ1ZmZlciBvZiAxIGFuZCAyIHB4cywgdGhlIHJlc3QgYXNzdW1lIGRlZmF1bHQgYnVmZmVyIDBcbiAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciB0byBrZWVwIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB3b3JraW5nIChubyB2YWxpZGF0aW9uIGFnYWluc3QgdGlsZVNpemUpLlxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IChpbWcud2lkdGggLSBwcmV2UG93ZXJPZlR3byhpbWcud2lkdGgpKSAvIDI7XG4gICAgICAgICAgICAgICAgLy8gcGFkZGluZyBpcyB1c2VkIGluIGdldEltYWdlRGF0YS4gQXMgREVNRGF0YSBoYXMgMXB4IHBhZGRpbmcsIGlmIERFTSB0aWxlIGJ1ZmZlciBpcyAycHgsIGRpc2NhcmQgb3V0ZXJtb3N0IHBpeGVscy5cbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gMSAtIGJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJSZWFkeSA9IHBhZGRpbmcgPCAxO1xuICAgICAgICAgICAgICAgIGlmICghYm9yZGVyUmVhZHkgJiYgIXRpbGUubmVpZ2hib3JpbmdUaWxlcykge1xuICAgICAgICAgICAgICAgICAgICB0aWxlLm5laWdoYm9yaW5nVGlsZXMgPSB0aGlzLl9nZXROZWlnaGJvcmluZ1RpbGVzKHRpbGUudGlsZUlEKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmF3SW1hZ2VEYXRhID0gdHJhbnNmZXIgPyBpbWcgOiBicm93c2VyLmdldEltYWdlRGF0YShpbWcsIHBhZGRpbmcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgICAgICAgICAgY29vcmQ6IHRpbGUudGlsZUlELFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgIHJhd0ltYWdlRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IHRoaXMuZW5jb2RpbmcsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlLmFjdG9yIHx8IHRpbGUuc3RhdGUgPT09ICdleHBpcmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmFjdG9yID0gdGhpcy5kaXNwYXRjaGVyLmdldEFjdG9yKCk7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUuYWN0b3Iuc2VuZCgnbG9hZERFTVRpbGUnLCBwYXJhbXMsIGRvbmUuYmluZCh0aGlzKSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBkb25lKGVyciwgZGVtKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGVtKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5kZW0gPSBkZW07XG4gICAgICAgICAgICAgICAgdGlsZS5kZW0ub25EZXNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgICAgIHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aWxlLm5lZWRzREVNVGV4dHVyZVVwbG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2dldE5laWdoYm9yaW5nVGlsZXModGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IHRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IGRpbSA9IE1hdGgucG93KDIsIGNhbm9uaWNhbC56KTtcblxuICAgICAgICBjb25zdCBweCA9IChjYW5vbmljYWwueCAtIDEgKyBkaW0pICUgZGltO1xuICAgICAgICBjb25zdCBweHcgPSBjYW5vbmljYWwueCA9PT0gMCA/IHRpbGVJRC53cmFwIC0gMSA6IHRpbGVJRC53cmFwO1xuICAgICAgICBjb25zdCBueCA9IChjYW5vbmljYWwueCArIDEgKyBkaW0pICUgZGltO1xuICAgICAgICBjb25zdCBueHcgPSBjYW5vbmljYWwueCArIDEgPT09IGRpbSA/IHRpbGVJRC53cmFwICsgMSA6IHRpbGVJRC53cmFwO1xuXG4gICAgICAgIGNvbnN0IG5laWdoYm9yaW5nVGlsZXMgPSB7fTtcbiAgICAgICAgLy8gYWRkIGFkamFjZW50IHRpbGVzXG4gICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCBweHcsIGNhbm9uaWNhbC56LCBweCwgY2Fub25pY2FsLnkpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xuICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgbnh3LCBjYW5vbmljYWwueiwgbngsIGNhbm9uaWNhbC55KS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcblxuICAgICAgICAvLyBBZGQgdXBwZXIgbmVpZ2hib3JpbmdUaWxlc1xuICAgICAgICBpZiAoY2Fub25pY2FsLnkgPiAwKSB7XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgcHh3LCBjYW5vbmljYWwueiwgcHgsIGNhbm9uaWNhbC55IC0gMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgdGlsZUlELndyYXAsIGNhbm9uaWNhbC56LCBjYW5vbmljYWwueCwgY2Fub25pY2FsLnkgLSAxKS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCBueHcsIGNhbm9uaWNhbC56LCBueCwgY2Fub25pY2FsLnkgLSAxKS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBZGQgbG93ZXIgbmVpZ2hib3JpbmdUaWxlc1xuICAgICAgICBpZiAoY2Fub25pY2FsLnkgKyAxIDwgZGltKSB7XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgcHh3LCBjYW5vbmljYWwueiwgcHgsIGNhbm9uaWNhbC55ICsgMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgdGlsZUlELndyYXAsIGNhbm9uaWNhbC56LCBjYW5vbmljYWwueCwgY2Fub25pY2FsLnkgKyAxKS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgICAgIG5laWdoYm9yaW5nVGlsZXNbbmV3IE92ZXJzY2FsZWRUaWxlSUQodGlsZUlELm92ZXJzY2FsZWRaLCBueHcsIGNhbm9uaWNhbC56LCBueCwgY2Fub25pY2FsLnkgKyAxKS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZWlnaGJvcmluZ1RpbGVzO1xuICAgIH1cblxuICAgIHVubG9hZFRpbGUodGlsZTogVGlsZSkge1xuICAgICAgICBpZiAodGlsZS5kZW1UZXh0dXJlKSB0aGlzLm1hcC5wYWludGVyLnNhdmVUaWxlVGV4dHVyZSh0aWxlLmRlbVRleHR1cmUpO1xuICAgICAgICBpZiAodGlsZS5mYm8pIHtcbiAgICAgICAgICAgIHRpbGUuZmJvLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLmZibztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZS5kZW0pIGRlbGV0ZSB0aWxlLmRlbTtcbiAgICAgICAgZGVsZXRlIHRpbGUubmVpZ2hib3JpbmdUaWxlcztcblxuICAgICAgICB0aWxlLnN0YXRlID0gJ3VubG9hZGVkJztcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmFzdGVyREVNVGlsZVNvdXJjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7RXZlbnQsIEVycm9yRXZlbnQsIEV2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5cbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQge1Jlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5cbmltcG9ydCB0eXBlIHtTb3VyY2V9IGZyb20gJy4vc291cmNlLmpzJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAuanMnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUgQWN0b3IgZnJvbSAnLi4vdXRpbC9hY3Rvci5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcbmltcG9ydCB0eXBlIHtHZW9KU09OLCBHZW9KU09ORmVhdHVyZX0gZnJvbSAnQG1hcGJveC9nZW9qc29uLXR5cGVzJztcbmltcG9ydCB0eXBlIHtHZW9KU09OU291cmNlU3BlY2lmaWNhdGlvbiwgUHJvbW90ZUlkU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZS5qcyc7XG5cbi8qKlxuICogQSBzb3VyY2UgY29udGFpbmluZyBHZW9KU09OLlxuICogU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy1nZW9qc29uKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBtYXAuYWRkU291cmNlKCdzb21lIGlkJywge1xuICogICAgIHR5cGU6ICdnZW9qc29uJyxcbiAqICAgICBkYXRhOiAnaHR0cHM6Ly9kMmFkNmI0dXI3eXZwcS5jbG91ZGZyb250Lm5ldC9uYXR1cmFsZWFydGgtMy4zLjAvbmVfMTBtX3BvcnRzLmdlb2pzb24nXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAnZ2VvanNvbicsXG4gKiAgICAgZGF0YToge1xuICogICAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICogICAgICAgICBcImZlYXR1cmVzXCI6IFt7XG4gKiAgICAgICAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXG4gKiAgICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge30sXG4gKiAgICAgICAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICAgICAgICAgIFwiY29vcmRpbmF0ZXNcIjogW1xuICogICAgICAgICAgICAgICAgICAgICAtNzYuNTMwNjMyOTcyNzE3MjksXG4gKiAgICAgICAgICAgICAgICAgICAgIDM5LjE4MTc0MDc3OTk0MTA4XG4gKiAgICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICAgfVxuICogICAgICAgICB9XVxuICogICAgIH1cbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBtYXAuZ2V0U291cmNlKCdzb21lIGlkJykuc2V0RGF0YSh7XG4gKiAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAqICAgICBcImZlYXR1cmVzXCI6IFt7XG4gKiAgICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcIm5hbWVcIjogXCJOdWxsIElzbGFuZFwifSxcbiAqICAgICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gKiAgICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbIDAsIDAgXVxuICogICAgICAgICB9XG4gKiAgICAgfV1cbiAqIH0pO1xuICogQHNlZSBbRXhhbXBsZTogRHJhdyBHZW9KU09OIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLW1hcmtlcnMvKVxuICogQHNlZSBbRXhhbXBsZTogQWRkIGEgR2VvSlNPTiBsaW5lXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dlb2pzb24tbGluZS8pXG4gKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBoZWF0bWFwIGZyb20gcG9pbnRzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2hlYXRtYXAvKVxuICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGFuZCBzdHlsZSBjbHVzdGVyc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jbHVzdGVyLylcbiAqL1xuY2xhc3MgR2VvSlNPTlNvdXJjZSBleHRlbmRzIEV2ZW50ZWQgaW1wbGVtZW50cyBTb3VyY2Uge1xuICAgIHR5cGU6ICdnZW9qc29uJztcbiAgICBpZDogc3RyaW5nO1xuICAgIG1pbnpvb206IG51bWJlcjtcbiAgICBtYXh6b29tOiBudW1iZXI7XG4gICAgdGlsZVNpemU6IG51bWJlcjtcbiAgICBhdHRyaWJ1dGlvbjogc3RyaW5nO1xuICAgIHByb21vdGVJZDogP1Byb21vdGVJZFNwZWNpZmljYXRpb247XG5cbiAgICBpc1RpbGVDbGlwcGVkOiBib29sZWFuO1xuICAgIHJlcGFyc2VPdmVyc2NhbGVkOiBib29sZWFuO1xuICAgIF9kYXRhOiBHZW9KU09OIHwgc3RyaW5nO1xuICAgIF9vcHRpb25zOiBhbnk7XG4gICAgd29ya2VyT3B0aW9uczogYW55O1xuICAgIG1hcDogTWFwO1xuICAgIGFjdG9yOiBBY3RvcjtcbiAgICBfbG9hZGVkOiBib29sZWFuO1xuICAgIF9jb2FsZXNjZTogP2Jvb2xlYW47XG4gICAgX21ldGFkYXRhRmlyZWQ6ID9ib29sZWFuO1xuICAgIF9jb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW47XG4gICAgX3BlbmRpbmdMb2FkOiA/Q2FuY2VsYWJsZTtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogR2VvSlNPTlNvdXJjZVNwZWNpZmljYXRpb24gJiB7d29ya2VyT3B0aW9ucz86IGFueSwgY29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFufSwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcblxuICAgICAgICAvLyBgdHlwZWAgaXMgYSBwcm9wZXJ0eSByYXRoZXIgdGhhbiBhIGNvbnN0YW50IHRvIG1ha2UgaXQgZWFzeSBmb3IgM3JkXG4gICAgICAgIC8vIHBhcnRpZXMgdG8gdXNlIEdlb0pTT05Tb3VyY2UgdG8gYnVpbGQgdGhlaXIgb3duIHNvdXJjZSB0eXBlcy5cbiAgICAgICAgdGhpcy50eXBlID0gJ2dlb2pzb24nO1xuXG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDE4O1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gNTEyO1xuICAgICAgICB0aGlzLmlzVGlsZUNsaXBwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGFyc2VPdmVyc2NhbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5hY3RvciA9IGRpc3BhdGNoZXIuZ2V0QWN0b3IoKTtcbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgICAgIHRoaXMuX2RhdGEgPSAob3B0aW9ucy5kYXRhOiBhbnkpO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSBvcHRpb25zLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcblxuICAgICAgICBpZiAob3B0aW9ucy5tYXh6b29tICE9PSB1bmRlZmluZWQpIHRoaXMubWF4em9vbSA9IG9wdGlvbnMubWF4em9vbTtcbiAgICAgICAgaWYgKG9wdGlvbnMudHlwZSkgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlO1xuICAgICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGlvbikgdGhpcy5hdHRyaWJ1dGlvbiA9IG9wdGlvbnMuYXR0cmlidXRpb247XG4gICAgICAgIHRoaXMucHJvbW90ZUlkID0gb3B0aW9ucy5wcm9tb3RlSWQ7XG5cbiAgICAgICAgY29uc3Qgc2NhbGUgPSBFWFRFTlQgLyB0aGlzLnRpbGVTaXplO1xuXG4gICAgICAgIC8vIHNlbnQgdG8gdGhlIHdvcmtlciwgYWxvbmcgd2l0aCBgdXJsOiAuLi5gIG9yIGBkYXRhOiBsaXRlcmFsIGdlb2pzb25gLFxuICAgICAgICAvLyBzbyB0aGF0IGl0IGNhbiBsb2FkL3BhcnNlL2luZGV4IHRoZSBnZW9qc29uIGRhdGFcbiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYG9wdGlvbnMud29ya2VyT3B0aW9uc2AgaGVscHMgdG8gbWFrZSBpdCBlYXN5IGZvclxuICAgICAgICAvLyB0aGlyZC1wYXJ0eSBzb3VyY2VzIHRvIGhhY2svcmV1c2UgR2VvSlNPTlNvdXJjZS5cbiAgICAgICAgdGhpcy53b3JrZXJPcHRpb25zID0gZXh0ZW5kKHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIGNsdXN0ZXI6IG9wdGlvbnMuY2x1c3RlciB8fCBmYWxzZSxcbiAgICAgICAgICAgIGdlb2pzb25WdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBidWZmZXI6IChvcHRpb25zLmJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5idWZmZXIgOiAxMjgpICogc2NhbGUsXG4gICAgICAgICAgICAgICAgdG9sZXJhbmNlOiAob3B0aW9ucy50b2xlcmFuY2UgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMudG9sZXJhbmNlIDogMC4zNzUpICogc2NhbGUsXG4gICAgICAgICAgICAgICAgZXh0ZW50OiBFWFRFTlQsXG4gICAgICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgICAgICAgIGxpbmVNZXRyaWNzOiBvcHRpb25zLmxpbmVNZXRyaWNzIHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlSWQ6IG9wdGlvbnMuZ2VuZXJhdGVJZCB8fCBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1cGVyY2x1c3Rlck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBtYXhab29tOiBvcHRpb25zLmNsdXN0ZXJNYXhab29tICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsdXN0ZXJNYXhab29tIDogdGhpcy5tYXh6b29tIC0gMSxcbiAgICAgICAgICAgICAgICBtaW5Qb2ludHM6IE1hdGgubWF4KDIsIG9wdGlvbnMuY2x1c3Rlck1pblBvaW50cyB8fCAyKSxcbiAgICAgICAgICAgICAgICBleHRlbnQ6IEVYVEVOVCxcbiAgICAgICAgICAgICAgICByYWRpdXM6IChvcHRpb25zLmNsdXN0ZXJSYWRpdXMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2x1c3RlclJhZGl1cyA6IDUwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIGxvZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVJZDogb3B0aW9ucy5nZW5lcmF0ZUlkIHx8IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2x1c3RlclByb3BlcnRpZXM6IG9wdGlvbnMuY2x1c3RlclByb3BlcnRpZXMsXG4gICAgICAgICAgICBmaWx0ZXI6IG9wdGlvbnMuZmlsdGVyXG4gICAgICAgIH0sIG9wdGlvbnMud29ya2VyT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuc2V0RGF0YSh0aGlzLl9kYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBHZW9KU09OIGRhdGEgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgc3RyaW5nfSBkYXRhIEEgR2VvSlNPTiBkYXRhIG9iamVjdCBvciBhIFVSTCB0byBvbmUuIFRoZSBsYXR0ZXIgaXMgcHJlZmVyYWJsZSBpbiB0aGUgY2FzZSBvZiBsYXJnZSBHZW9KU09OIGZpbGVzLlxuICAgICAqIEByZXR1cm5zIHtHZW9KU09OU291cmNlfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmFkZFNvdXJjZSgnc291cmNlX2lkJywge1xuICAgICAqICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICogICAgIGRhdGE6IHtcbiAgICAgKiAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICogICAgICAgICBmZWF0dXJlczogW11cbiAgICAgKiAgICAgfVxuICAgICAqIH0pO1xuICAgICAqIGNvbnN0IGdlb2pzb25Tb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdzb3VyY2VfaWQnKTtcbiAgICAgKiAvLyBVcGRhdGUgdGhlIGRhdGEgYWZ0ZXIgdGhlIEdlb0pTT04gc291cmNlIHdhcyBjcmVhdGVkXG4gICAgICogZ2VvanNvblNvdXJjZS5zZXREYXRhKHtcbiAgICAgKiAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAgICAgKiAgICAgXCJmZWF0dXJlc1wiOiBbe1xuICAgICAqICAgICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZVwiLFxuICAgICAqICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcIm5hbWVcIjogXCJOdWxsIElzbGFuZFwifSxcbiAgICAgKiAgICAgICAgIFwiZ2VvbWV0cnlcIjoge1xuICAgICAqICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBvaW50XCIsXG4gICAgICogICAgICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbIDAsIDAgXVxuICAgICAqICAgICAgICAgfVxuICAgICAqICAgICB9XVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHNldERhdGEoZGF0YTogR2VvSlNPTiB8IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5fdXBkYXRlV29ya2VyRGF0YSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgY2x1c3RlcmVkIHNvdXJjZXMsIGZldGNoZXMgdGhlIHpvb20gYXQgd2hpY2ggdGhlIGdpdmVuIGNsdXN0ZXIgZXhwYW5kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjbHVzdGVySWQgVGhlIHZhbHVlIG9mIHRoZSBjbHVzdGVyJ3MgYGNsdXN0ZXJfaWRgIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHpvb20gdmFsdWUgaXMgcmV0cmlldmVkIChgKGVycm9yLCB6b29tKSA9PiB7IC4uLiB9YCkuXG4gICAgICogQHJldHVybnMge0dlb0pTT05Tb3VyY2V9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBBc3N1bWluZyB0aGUgbWFwIGhhcyBhIGxheWVyIG5hbWVkICdjbHVzdGVycycgYW5kIGEgc291cmNlICdlYXJ0aHF1YWtlcydcbiAgICAgKiAvLyBUaGUgZm9sbG93aW5nIGNyZWF0ZXMgYSBjYW1lcmEgYW5pbWF0aW9uIG9uIGNsdXN0ZXIgZmVhdHVyZSBjbGlja1xuICAgICAqIG1hcC5vbignY2xpY2snLCAnY2x1c3RlcnMnLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCwge1xuICAgICAqICAgICAgICAgbGF5ZXJzOiBbJ2NsdXN0ZXJzJ11cbiAgICAgKiAgICAgfSk7XG4gICAgICpcbiAgICAgKiAgICAgY29uc3QgY2x1c3RlcklkID0gZmVhdHVyZXNbMF0ucHJvcGVydGllcy5jbHVzdGVyX2lkO1xuICAgICAqXG4gICAgICogICAgIC8vIEVhc2UgdGhlIGNhbWVyYSB0byB0aGUgbmV4dCBjbHVzdGVyIGV4cGFuc2lvblxuICAgICAqICAgICBtYXAuZ2V0U291cmNlKCdlYXJ0aHF1YWtlcycpLmdldENsdXN0ZXJFeHBhbnNpb25ab29tKFxuICAgICAqICAgICAgICAgY2x1c3RlcklkLFxuICAgICAqICAgICAgICAgKGVyciwgem9vbSkgPT4ge1xuICAgICAqICAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICogICAgICAgICAgICAgICAgIG1hcC5lYXNlVG8oe1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgY2VudGVyOiBmZWF0dXJlc1swXS5nZW9tZXRyeS5jb29yZGluYXRlcyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHpvb21cbiAgICAgKiAgICAgICAgICAgICAgICAgfSk7XG4gICAgICogICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgfVxuICAgICAqICAgICApO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldENsdXN0ZXJFeHBhbnNpb25ab29tKGNsdXN0ZXJJZDogbnVtYmVyLCBjYWxsYmFjazogQ2FsbGJhY2s8bnVtYmVyPikge1xuICAgICAgICB0aGlzLmFjdG9yLnNlbmQoJ2dlb2pzb24uZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20nLCB7Y2x1c3RlcklkLCBzb3VyY2U6IHRoaXMuaWR9LCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBjbHVzdGVyZWQgc291cmNlcywgZmV0Y2hlcyB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGNsdXN0ZXIgb24gdGhlIG5leHQgem9vbSBsZXZlbCAoYXMgYW4gYXJyYXkgb2YgR2VvSlNPTiBmZWF0dXJlcykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY2x1c3RlcklkIFRoZSB2YWx1ZSBvZiB0aGUgY2x1c3RlcidzIGBjbHVzdGVyX2lkYCBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmZWF0dXJlcyBhcmUgcmV0cmlldmVkIChgKGVycm9yLCBmZWF0dXJlcykgPT4geyAuLi4gfWApLlxuICAgICAqIEByZXR1cm5zIHtHZW9KU09OU291cmNlfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gUmV0cmlldmUgY2x1c3RlciBjaGlsZHJlbiBvbiBjbGlja1xuICAgICAqIG1hcC5vbignY2xpY2snLCAnY2x1c3RlcnMnLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCwge1xuICAgICAqICAgICAgICAgbGF5ZXJzOiBbJ2NsdXN0ZXJzJ11cbiAgICAgKiAgICAgfSk7XG4gICAgICpcbiAgICAgKiAgICAgY29uc3QgY2x1c3RlcklkID0gZmVhdHVyZXNbMF0ucHJvcGVydGllcy5jbHVzdGVyX2lkO1xuICAgICAqXG4gICAgICogICAgIGNsdXN0ZXJTb3VyY2UuZ2V0Q2x1c3RlckNoaWxkcmVuKGNsdXN0ZXJJZCwgKGVycm9yLCBmZWF0dXJlcykgPT4ge1xuICAgICAqICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAqICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDbHVzdGVyIGNoaWxkcmVuOicsIGZlYXR1cmVzKTtcbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgfSk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKi9cbiAgICBnZXRDbHVzdGVyQ2hpbGRyZW4oY2x1c3RlcklkOiBudW1iZXIsIGNhbGxiYWNrOiBDYWxsYmFjazxBcnJheTxHZW9KU09ORmVhdHVyZT4+KSB7XG4gICAgICAgIHRoaXMuYWN0b3Iuc2VuZCgnZ2VvanNvbi5nZXRDbHVzdGVyQ2hpbGRyZW4nLCB7Y2x1c3RlcklkLCBzb3VyY2U6IHRoaXMuaWR9LCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBjbHVzdGVyZWQgc291cmNlcywgZmV0Y2hlcyB0aGUgb3JpZ2luYWwgcG9pbnRzIHRoYXQgYmVsb25nIHRvIHRoZSBjbHVzdGVyIChhcyBhbiBhcnJheSBvZiBHZW9KU09OIGZlYXR1cmVzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjbHVzdGVySWQgVGhlIHZhbHVlIG9mIHRoZSBjbHVzdGVyJ3MgYGNsdXN0ZXJfaWRgIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byBgMTBgIGlmIGEgZmFsc3kgdmFsdWUgaXMgZ2l2ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCBUaGUgbnVtYmVyIG9mIGZlYXR1cmVzIHRvIHNraXAgKGZvciBleGFtcGxlLCBmb3IgcGFnaW5hdGlvbikuIERlZmF1bHRzIHRvIGAwYCBpZiBhIGZhbHN5IHZhbHVlIGlzIGdpdmVuLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGZlYXR1cmVzIGFyZSByZXRyaWV2ZWQgKGAoZXJyb3IsIGZlYXR1cmVzKSA9PiB7IC4uLiB9YCkuXG4gICAgICogQHJldHVybnMge0dlb0pTT05Tb3VyY2V9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBSZXRyaWV2ZSBjbHVzdGVyIGxlYXZlcyBvbiBjbGlja1xuICAgICAqIG1hcC5vbignY2xpY2snLCAnY2x1c3RlcnMnLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCwge1xuICAgICAqICAgICAgICAgbGF5ZXJzOiBbJ2NsdXN0ZXJzJ11cbiAgICAgKiAgICAgfSk7XG4gICAgICpcbiAgICAgKiAgICAgY29uc3QgY2x1c3RlcklkID0gZmVhdHVyZXNbMF0ucHJvcGVydGllcy5jbHVzdGVyX2lkO1xuICAgICAqICAgICBjb25zdCBwb2ludENvdW50ID0gZmVhdHVyZXNbMF0ucHJvcGVydGllcy5wb2ludF9jb3VudDtcbiAgICAgKiAgICAgY29uc3QgY2x1c3RlclNvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ2NsdXN0ZXJzJyk7XG4gICAgICpcbiAgICAgKiAgICAgY2x1c3RlclNvdXJjZS5nZXRDbHVzdGVyTGVhdmVzKGNsdXN0ZXJJZCwgcG9pbnRDb3VudCwgMCwgKGVycm9yLCBmZWF0dXJlcykgPT4ge1xuICAgICAqICAgICAvLyBQcmludCBjbHVzdGVyIGxlYXZlcyBpbiB0aGUgY29uc29sZVxuICAgICAqICAgICAgICAgY29uc29sZS5sb2coJ0NsdXN0ZXIgbGVhdmVzOicsIGVycm9yLCBmZWF0dXJlcyk7XG4gICAgICogICAgIH0pO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldENsdXN0ZXJMZWF2ZXMoY2x1c3RlcklkOiBudW1iZXIsIGxpbWl0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyLCBjYWxsYmFjazogQ2FsbGJhY2s8QXJyYXk8R2VvSlNPTkZlYXR1cmU+Pikge1xuICAgICAgICB0aGlzLmFjdG9yLnNlbmQoJ2dlb2pzb24uZ2V0Q2x1c3RlckxlYXZlcycsIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIGNsdXN0ZXJJZCxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgb2Zmc2V0XG4gICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZXNwb25zaWJsZSBmb3IgaW52b2tpbmcgV29ya2VyU291cmNlJ3MgZ2VvanNvbi5sb2FkRGF0YSB0YXJnZXQsIHdoaWNoXG4gICAgICogaGFuZGxlcyBsb2FkaW5nIHRoZSBnZW9qc29uIGRhdGEgYW5kIHByZXBhcmluZyB0byBzZXJ2ZSBpdCB1cCBhcyB0aWxlcyxcbiAgICAgKiB1c2luZyBnZW9qc29uLXZ0IG9yIHN1cGVyY2x1c3RlciBhcyBhcHByb3ByaWF0ZS5cbiAgICAgKi9cbiAgICBfdXBkYXRlV29ya2VyRGF0YSgpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUncyBhbiBlYXJsaWVyIGxvYWREYXRhIHRvIGZpbmlzaCwgd2FpdCB1bnRpbCBpdCBmaW5pc2hlcyBhbmQgdGhlbiBkbyBhbm90aGVyIHVwZGF0ZVxuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0xvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvYWxlc2NlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc291cmNlJ30pKTtcblxuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGV4dGVuZCh7fSwgdGhpcy53b3JrZXJPcHRpb25zKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX2RhdGE7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucmVxdWVzdCA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KGJyb3dzZXIucmVzb2x2ZVVSTChkYXRhKSwgUmVzb3VyY2VUeXBlLlNvdXJjZSk7XG4gICAgICAgICAgICBvcHRpb25zLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nID0gdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0YXJnZXQge3RoaXMudHlwZX0ubG9hZERhdGEgcmF0aGVyIHRoYW4gbGl0ZXJhbGx5IGdlb2pzb24ubG9hZERhdGEsXG4gICAgICAgIC8vIHNvIHRoYXQgb3RoZXIgZ2VvanNvbi1saWtlIHNvdXJjZSB0eXBlcyBjYW4gZWFzaWx5IHJldXNlIHRoaXNcbiAgICAgICAgLy8gaW1wbGVtZW50YXRpb25cbiAgICAgICAgdGhpcy5fcGVuZGluZ0xvYWQgPSB0aGlzLmFjdG9yLnNlbmQoYCR7dGhpcy50eXBlfS5sb2FkRGF0YWAsIG9wdGlvbnMsIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdMb2FkID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBhbHRob3VnaCBHZW9KU09OIHNvdXJjZXMgY29udGFpbiBubyBtZXRhZGF0YSwgd2UgZmlyZSB0aGlzIGV2ZW50IGF0IGZpcnN0XG4gICAgICAgICAgICAgICAgLy8gdG8gbGV0IHRoZSBTb3VyY2VDYWNoZSBrbm93IGl0cyBvayB0byBzdGFydCByZXF1ZXN0aW5nIHRpbGVzLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGE6IE9iamVjdCA9IHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiB0aGlzLl9tZXRhZGF0YUZpcmVkID8gJ2NvbnRlbnQnIDogJ21ldGFkYXRhJ307XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyAmJiByZXN1bHQgJiYgcmVzdWx0LnJlc291cmNlVGltaW5nICYmIHJlc3VsdC5yZXNvdXJjZVRpbWluZ1t0aGlzLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnJlc291cmNlVGltaW5nID0gcmVzdWx0LnJlc291cmNlVGltaW5nW3RoaXMuaWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywgZGF0YSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhRmlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fY29hbGVzY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVXb3JrZXJEYXRhKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29hbGVzY2UgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gIXRpbGUuYWN0b3IgPyAnbG9hZFRpbGUnIDogJ3JlbG9hZFRpbGUnO1xuICAgICAgICB0aWxlLmFjdG9yID0gdGhpcy5hY3RvcjtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgIHRpbGVJRDogdGlsZS50aWxlSUQsXG4gICAgICAgICAgICB0aWxlWm9vbTogdGlsZS50aWxlWm9vbSxcbiAgICAgICAgICAgIHpvb206IHRpbGUudGlsZUlELm92ZXJzY2FsZWRaLFxuICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBwaXhlbFJhdGlvOiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IHRoaXMubWFwLnNob3dDb2xsaXNpb25Cb3hlcyxcbiAgICAgICAgICAgIHByb21vdGVJZDogdGhpcy5wcm9tb3RlSWRcbiAgICAgICAgfTtcblxuICAgICAgICB0aWxlLnJlcXVlc3QgPSB0aGlzLmFjdG9yLnNlbmQobWVzc2FnZSwgcGFyYW1zLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuICAgICAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKCk7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGlsZS5sb2FkVmVjdG9yRGF0YShkYXRhLCB0aGlzLm1hcC5wYWludGVyLCBtZXNzYWdlID09PSAncmVsb2FkVGlsZScpO1xuXG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0sIHVuZGVmaW5lZCwgbWVzc2FnZSA9PT0gJ2xvYWRUaWxlJyk7XG4gICAgfVxuXG4gICAgYWJvcnRUaWxlKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUucmVxdWVzdCkge1xuICAgICAgICAgICAgdGlsZS5yZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcbiAgICAgICAgfVxuICAgICAgICB0aWxlLmFib3J0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHVubG9hZFRpbGUodGlsZTogVGlsZSkge1xuICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEoKTtcbiAgICAgICAgdGhpcy5hY3Rvci5zZW5kKCdyZW1vdmVUaWxlJywge3VpZDogdGlsZS51aWQsIHR5cGU6IHRoaXMudHlwZSwgc291cmNlOiB0aGlzLmlkfSk7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nTG9hZCkge1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0xvYWQuY2FuY2VsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHRoaXMuX29wdGlvbnMsIHtcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuX2RhdGFcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR2VvSlNPTlNvdXJjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQuanMnO1xuaW1wb3J0IHtFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCB7Z2V0SW1hZ2UsIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQuanMnO1xuaW1wb3J0IHtSYXN0ZXJCb3VuZHNBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQgYm91bmRzQXR0cmlidXRlcyBmcm9tICcuLi9kYXRhL2JvdW5kc19hdHRyaWJ1dGVzLmpzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudC5qcyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9yZW5kZXIvdGV4dHVyZS5qcyc7XG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQgdGlsZVRyYW5zZm9ybSwge2dldFRpbGVQb2ludH0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHttYXQzLCB2ZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuXG5pbXBvcnQgdHlwZSB7U291cmNlfSBmcm9tICcuL3NvdXJjZS5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FudmFzU291cmNlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi9jYW52YXNfc291cmNlLmpzJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAuanMnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgSW1hZ2VTb3VyY2VTcGVjaWZpY2F0aW9uLFxuICAgIFZpZGVvU291cmNlU3BlY2lmaWNhdGlvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcblxudHlwZSBDb29yZGluYXRlcyA9IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcblxuLy8gcGVyc3BlY3RpdmUgY29ycmVjdGlvbiBmb3IgdGV4dHVyZSBtYXBwaW5nLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzkxNThcbi8vIGFkYXB0ZWQgZnJvbSBodHRwczovL21hdGguc3RhY2tleGNoYW5nZS5jb20vYS8zMzkwMzMvNDg2NTNcblxuZnVuY3Rpb24gYmFzaXNUb1BvaW50cyh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIHtcbiAgICBjb25zdCBtID0gW3gxLCB4MiwgeDMsIHkxLCB5MiwgeTMsIDEsIDEsIDFdO1xuICAgIGNvbnN0IHMgPSBbeDQsIHk0LCAxXTtcbiAgICBjb25zdCBtYSA9IG1hdDMuYWRqb2ludChbXSwgbSk7XG4gICAgY29uc3QgW3N4LCBzeSwgc3pdID0gdmVjMy50cmFuc2Zvcm1NYXQzKHMsIHMsIG1hdDMudHJhbnNwb3NlKG1hLCBtYSkpO1xuICAgIHJldHVybiBtYXQzLm11bHRpcGx5KG0sIFtzeCwgMCwgMCwgMCwgc3ksIDAsIDAsIDAsIHN6XSwgbSk7XG59XG5cbmZ1bmN0aW9uIGdldFBlcnNwZWN0aXZlVHJhbnNmb3JtKHcsIGgsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCkge1xuICAgIGNvbnN0IHMgPSBiYXNpc1RvUG9pbnRzKDAsIDAsIHcsIDAsIDAsIGgsIHcsIGgpO1xuICAgIGNvbnN0IG0gPSBiYXNpc1RvUG9pbnRzKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCk7XG4gICAgbWF0My5tdWx0aXBseShtLCBtYXQzLmFkam9pbnQocywgcyksIG0pO1xuICAgIHJldHVybiBbXG4gICAgICAgIG1bNl0gLyBtWzhdICogdyAvIEVYVEVOVCxcbiAgICAgICAgbVs3XSAvIG1bOF0gKiBoIC8gRVhURU5UXG4gICAgXTtcbn1cblxuLyoqXG4gKiBBIGRhdGEgc291cmNlIGNvbnRhaW5pbmcgYW4gaW1hZ2UuXG4gKiBTZWUgdGhlIFtTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzLWltYWdlKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBhZGQgdG8gbWFwXG4gKiBtYXAuYWRkU291cmNlKCdzb21lIGlkJywge1xuICogICAgIHR5cGU6ICdpbWFnZScsXG4gKiAgICAgdXJsOiAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9pbWFnZXMvZm9vLnBuZycsXG4gKiAgICAgY29vcmRpbmF0ZXM6IFtcbiAqICAgICAgICAgWy03Ni41NCwgMzkuMThdLFxuICogICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXG4gKiAgICAgICAgIFstNzYuNTIsIDM5LjE3XSxcbiAqICAgICAgICAgWy03Ni41NCwgMzkuMTddXG4gKiAgICAgXVxuICogfSk7XG4gKlxuICogLy8gdXBkYXRlIGNvb3JkaW5hdGVzXG4gKiBjb25zdCBteVNvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKTtcbiAqIG15U291cmNlLnNldENvb3JkaW5hdGVzKFtcbiAqICAgICBbLTc2LjU0MzM1NzM3MjI4Mzk0LCAzOS4xODU3OTkwNzIyOTc0OF0sXG4gKiAgICAgWy03Ni41MjgwMzY1OTQzOTA4NywgMzkuMTgzODM2NDg0NzU4N10sXG4gKiAgICAgWy03Ni41Mjk1Mzg2MzE0MzkyLCAzOS4xNzY4MzM5MjUwNzYwNl0sXG4gKiAgICAgWy03Ni41NDUyMDI3MzIwODYxOCwgMzkuMTc4NzYzNDQxMDY2NDJdXG4gKiBdKTtcbiAqXG4gKiAvLyB1cGRhdGUgdXJsIGFuZCBjb29yZGluYXRlcyBzaW11bHRhbmVvdXNseVxuICogbXlTb3VyY2UudXBkYXRlSW1hZ2Uoe1xuICogICAgIHVybDogJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vaW1hZ2VzL2Jhci5wbmcnLFxuICogICAgIGNvb3JkaW5hdGVzOiBbXG4gKiAgICAgICAgIFstNzYuNTQzMzU3MzcyMjgzOTQsIDM5LjE4NTc5OTA3MjI5NzQ4XSxcbiAqICAgICAgICAgWy03Ni41MjgwMzY1OTQzOTA4NywgMzkuMTgzODM2NDg0NzU4N10sXG4gKiAgICAgICAgIFstNzYuNTI5NTM4NjMxNDM5MiwgMzkuMTc2ODMzOTI1MDc2MDZdLFxuICogICAgICAgICBbLTc2LjU0NTIwMjczMjA4NjE4LCAzOS4xNzg3NjM0NDEwNjY0Ml1cbiAqICAgICBdXG4gKiB9KTtcbiAqXG4gKiBtYXAucmVtb3ZlU291cmNlKCdzb21lIGlkJyk7ICAvLyByZW1vdmVcbiAqIEBzZWUgW0V4YW1wbGU6IEFkZCBhbiBpbWFnZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9pbWFnZS1vbi1hLW1hcC8pXG4gKi9cbmNsYXNzIEltYWdlU291cmNlIGV4dGVuZHMgRXZlbnRlZCBpbXBsZW1lbnRzIFNvdXJjZSB7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWluem9vbTogbnVtYmVyO1xuICAgIG1heHpvb206IG51bWJlcjtcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG5cbiAgICBjb29yZGluYXRlczogQ29vcmRpbmF0ZXM7XG4gICAgdGlsZXM6IHtbXzogc3RyaW5nXTogVGlsZX07XG4gICAgb3B0aW9uczogYW55O1xuICAgIGRpc3BhdGNoZXI6IERpc3BhdGNoZXI7XG4gICAgbWFwOiBNYXA7XG4gICAgdGV4dHVyZTogVGV4dHVyZSB8IG51bGw7XG4gICAgaW1hZ2U6IEltYWdlRGF0YTtcbiAgICB0aWxlSUQ6IENhbm9uaWNhbFRpbGVJRDtcbiAgICBfYm91bmRzQXJyYXk6IFJhc3RlckJvdW5kc0FycmF5O1xuICAgIGJvdW5kc0J1ZmZlcjogVmVydGV4QnVmZmVyO1xuICAgIGJvdW5kc1NlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIF9sb2FkZWQ6IGJvb2xlYW47XG4gICAgcGVyc3BlY3RpdmVUcmFuc2Zvcm06IFtudW1iZXIsIG51bWJlcl07XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IEltYWdlU291cmNlU3BlY2lmaWNhdGlvbiB8IFZpZGVvU291cmNlU3BlY2lmaWNhdGlvbiB8IENhbnZhc1NvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVzID0gb3B0aW9ucy5jb29yZGluYXRlcztcblxuICAgICAgICB0aGlzLnR5cGUgPSAnaW1hZ2UnO1xuICAgICAgICB0aGlzLm1pbnpvb20gPSAwO1xuICAgICAgICB0aGlzLm1heHpvb20gPSAyMjtcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IDUxMjtcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XG5cbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG5cbiAgICBsb2FkKG5ld0Nvb3JkaW5hdGVzPzogQ29vcmRpbmF0ZXMsIHN1Y2Nlc3NDYWxsYmFjaz86ICgpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc291cmNlJ30pKTtcblxuICAgICAgICB0aGlzLnVybCA9IHRoaXMub3B0aW9ucy51cmw7XG5cbiAgICAgICAgZ2V0SW1hZ2UodGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodGhpcy51cmwsIFJlc291cmNlVHlwZS5JbWFnZSksIChlcnIsIGltYWdlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlID0gYnJvd3Nlci5nZXRJbWFnZURhdGEoaW1hZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmltYWdlLndpZHRoO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5pbWFnZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0Nvb3JkaW5hdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBuZXdDb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3NDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fZmluaXNoTG9hZGluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgaW1hZ2UgVVJMIGFuZCwgb3B0aW9uYWxseSwgdGhlIGNvb3JkaW5hdGVzLiBUbyBhdm9pZCBoYXZpbmcgdGhlIGltYWdlIGZsYXNoIGFmdGVyIGNoYW5naW5nLFxuICAgICAqIHNldCB0aGUgYHJhc3Rlci1mYWRlLWR1cmF0aW9uYCBwYWludCBwcm9wZXJ0eSBvbiB0aGUgcmFzdGVyIGxheWVyIHRvIDAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudXJsXSBSZXF1aXJlZCBpbWFnZSBVUkwuXG4gICAgICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gW29wdGlvbnMuY29vcmRpbmF0ZXNdIEZvdXIgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzLFxuICAgICAqICAgcmVwcmVzZW50ZWQgYXMgYXJyYXlzIG9mIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgbnVtYmVycywgd2hpY2ggZGVmaW5lIHRoZSBjb3JuZXJzIG9mIHRoZSBpbWFnZS5cbiAgICAgKiAgIFRoZSBjb29yZGluYXRlcyBzdGFydCBhdCB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZSBhbmQgcHJvY2VlZCBpbiBjbG9ja3dpc2Ugb3JkZXIuXG4gICAgICogICBUaGV5IGRvIG5vdCBoYXZlIHRvIHJlcHJlc2VudCBhIHJlY3RhbmdsZS5cbiAgICAgKiBAcmV0dXJucyB7SW1hZ2VTb3VyY2V9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBBZGQgdG8gYW4gaW1hZ2Ugc291cmNlIHRvIHRoZSBtYXAgd2l0aCBzb21lIGluaXRpYWwgVVJMIGFuZCBjb29yZGluYXRlc1xuICAgICAqIG1hcC5hZGRTb3VyY2UoJ2ltYWdlX3NvdXJjZV9pZCcsIHtcbiAgICAgKiAgICAgdHlwZTogJ2ltYWdlJyxcbiAgICAgKiAgICAgdXJsOiAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9pbWFnZXMvZm9vLnBuZycsXG4gICAgICogICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICogICAgICAgICBbLTc2LjU0LCAzOS4xOF0sXG4gICAgICogICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXG4gICAgICogICAgICAgICBbLTc2LjUyLCAzOS4xN10sXG4gICAgICogICAgICAgICBbLTc2LjU0LCAzOS4xN11cbiAgICAgKiAgICAgXVxuICAgICAqIH0pO1xuICAgICAqIC8vIFRoZW4gdXBkYXRlIHRoZSBpbWFnZSBVUkwgYW5kIGNvb3JkaW5hdGVzXG4gICAgICogaW1hZ2VTb3VyY2UudXBkYXRlSW1hZ2Uoe1xuICAgICAqICAgICB1cmw6ICdodHRwczovL3d3dy5tYXBib3guY29tL2ltYWdlcy9iYXIucG5nJyxcbiAgICAgKiAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgKiAgICAgICAgIFstNzYuNTQzMywgMzkuMTg1N10sXG4gICAgICogICAgICAgICBbLTc2LjUyODAsIDM5LjE4MzhdLFxuICAgICAqICAgICAgICAgWy03Ni41Mjk1LCAzOS4xNzY4XSxcbiAgICAgKiAgICAgICAgIFstNzYuNTQ1MiwgMzkuMTc4N11cbiAgICAgKiAgICAgXVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHVwZGF0ZUltYWdlKG9wdGlvbnM6IHt1cmw6IHN0cmluZywgY29vcmRpbmF0ZXM/OiBDb29yZGluYXRlc30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlIHx8ICFvcHRpb25zLnVybCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zLnVybCA9IG9wdGlvbnMudXJsO1xuICAgICAgICB0aGlzLmxvYWQob3B0aW9ucy5jb29yZGluYXRlcywgKCkgPT4geyB0aGlzLnRleHR1cmUgPSBudWxsOyB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX2ZpbmlzaExvYWRpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcCkge1xuICAgICAgICAgICAgdGhpcy5zZXRDb29yZGluYXRlcyh0aGlzLmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ30pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBpbWFnZSdzIGNvb3JkaW5hdGVzIGFuZCByZS1yZW5kZXJzIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5PEFycmF5PG51bWJlcj4+fSBjb29yZGluYXRlcyBGb3VyIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyxcbiAgICAgKiAgIHJlcHJlc2VudGVkIGFzIGFycmF5cyBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIG51bWJlcnMsIHdoaWNoIGRlZmluZSB0aGUgY29ybmVycyBvZiB0aGUgaW1hZ2UuXG4gICAgICogICBUaGUgY29vcmRpbmF0ZXMgc3RhcnQgYXQgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UgYW5kIHByb2NlZWQgaW4gY2xvY2t3aXNlIG9yZGVyLlxuICAgICAqICAgVGhleSBkbyBub3QgaGF2ZSB0byByZXByZXNlbnQgYSByZWN0YW5nbGUuXG4gICAgICogQHJldHVybnMge0ltYWdlU291cmNlfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gQWRkIGFuIGltYWdlIHNvdXJjZSB0byB0aGUgbWFwIHdpdGggc29tZSBpbml0aWFsIGNvb3JkaW5hdGVzXG4gICAgICogbWFwLmFkZFNvdXJjZSgnaW1hZ2Vfc291cmNlX2lkJywge1xuICAgICAqICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAqICAgICB1cmw6ICdodHRwczovL3d3dy5tYXBib3guY29tL2ltYWdlcy9mb28ucG5nJyxcbiAgICAgKiAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgKiAgICAgICAgIFstNzYuNTQsIDM5LjE4XSxcbiAgICAgKiAgICAgICAgIFstNzYuNTIsIDM5LjE4XSxcbiAgICAgKiAgICAgICAgIFstNzYuNTIsIDM5LjE3XSxcbiAgICAgKiAgICAgICAgIFstNzYuNTQsIDM5LjE3XVxuICAgICAqICAgICBdXG4gICAgICogfSk7XG4gICAgICogLy8gVGhlbiB1cGRhdGUgdGhlIGltYWdlIGNvb3JkaW5hdGVzXG4gICAgICogaW1hZ2VTb3VyY2Uuc2V0Q29vcmRpbmF0ZXMoW1xuICAgICAqICAgICBbLTc2LjU0MzMsIDM5LjE4NTddLFxuICAgICAqICAgICBbLTc2LjUyODAsIDM5LjE4MzhdLFxuICAgICAqICAgICBbLTc2LjUyOTUsIDM5LjE3NjhdLFxuICAgICAqICAgICBbLTc2LjU0NTIsIDM5LjE3ODddXG4gICAgICogXSk7XG4gICAgICovXG4gICAgc2V0Q29vcmRpbmF0ZXMoY29vcmRpbmF0ZXM6IENvb3JkaW5hdGVzKSB7XG4gICAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcztcbiAgICAgICAgZGVsZXRlIHRoaXMuX2JvdW5kc0FycmF5O1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB3aGljaCBtZXJjYXRvciB0aWxlIGlzIHN1aXRhYmxlIGZvciByZW5kZXJpbmcgdGhlIHZpZGVvIGluXG4gICAgICAgIC8vIGFuZCBjcmVhdGUgYSBidWZmZXIgd2l0aCB0aGUgY29ybmVyIGNvb3JkaW5hdGVzLiBUaGVzZSBjb29yZGluYXRlc1xuICAgICAgICAvLyBtYXkgYmUgb3V0c2lkZSB0aGUgdGlsZSwgYmVjYXVzZSByYXN0ZXIgdGlsZXMgYXJlbid0IGNsaXBwZWQgd2hlbiByZW5kZXJpbmcuXG5cbiAgICAgICAgLy8gdHJhbnNmb3JtIHRoZSBnZW8gY29vcmRpbmF0ZXMgaW50byAoem9vbSAwKSB0aWxlIHNwYWNlIGNvb3JkaW5hdGVzXG4gICAgICAgIGNvbnN0IGNvcm5lckNvb3JkcyA9IGNvb3JkaW5hdGVzLm1hcChNZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdCk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRpbGUgd2UnbGwgdXNlIHRvIGhvbGQgdGhpcyBpbWFnZSdzXG4gICAgICAgIC8vIHJlbmRlciBkYXRhXG4gICAgICAgIHRoaXMudGlsZUlEID0gZ2V0Q29vcmRpbmF0ZXNDZW50ZXJUaWxlSUQoY29ybmVyQ29vcmRzKTtcblxuICAgICAgICAvLyBDb25zdHJhaW4gbWluL21heCB6b29tIHRvIG91ciB0aWxlJ3Mgem9vbSBsZXZlbCBpbiBvcmRlciB0byBmb3JjZVxuICAgICAgICAvLyBTb3VyY2VDYWNoZSB0byByZXF1ZXN0IHRoaXMgdGlsZSAobm8gbWF0dGVyIHdoYXQgdGhlIG1hcCdzIHpvb21cbiAgICAgICAgLy8gbGV2ZWwpXG4gICAgICAgIHRoaXMubWluem9vbSA9IHRoaXMubWF4em9vbSA9IHRoaXMudGlsZUlELno7XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTonc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdjb250ZW50J30pKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX2NsZWFyKCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fYm91bmRzQXJyYXk7XG4gICAgfVxuXG4gICAgX21ha2VCb3VuZHNBcnJheSgpIHtcbiAgICAgICAgY29uc3QgdGlsZVRyID0gdGlsZVRyYW5zZm9ybSh0aGlzLnRpbGVJRCwgdGhpcy5tYXAudHJhbnNmb3JtLnByb2plY3Rpb24pO1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgY29ybmVyIGNvb3JkaW5hdGVzIGludG8gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2Ygb3VyIHRpbGUuXG4gICAgICAgIGNvbnN0IFt0bCwgdHIsIGJyLCBibF0gPSB0aGlzLmNvb3JkaW5hdGVzLm1hcCgoY29vcmQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3RlZENvb3JkID0gdGlsZVRyLnByb2plY3Rpb24ucHJvamVjdChjb29yZFswXSwgY29vcmRbMV0pO1xuICAgICAgICAgICAgcmV0dXJuIGdldFRpbGVQb2ludCh0aWxlVHIsIHByb2plY3RlZENvb3JkKS5fcm91bmQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wZXJzcGVjdGl2ZVRyYW5zZm9ybSA9IGdldFBlcnNwZWN0aXZlVHJhbnNmb3JtKFxuICAgICAgICAgICAgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIHRsLngsIHRsLnksIHRyLngsIHRyLnksIGJsLngsIGJsLnksIGJyLngsIGJyLnkpO1xuXG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5ID0gbmV3IFJhc3RlckJvdW5kc0FycmF5KCk7XG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHRsLngsIHRsLnksIDAsIDApO1xuICAgICAgICB0aGlzLl9ib3VuZHNBcnJheS5lbXBsYWNlQmFjayh0ci54LCB0ci55LCBFWFRFTlQsIDApO1xuICAgICAgICB0aGlzLl9ib3VuZHNBcnJheS5lbXBsYWNlQmFjayhibC54LCBibC55LCAwLCBFWFRFTlQpO1xuICAgICAgICB0aGlzLl9ib3VuZHNBcnJheS5lbXBsYWNlQmFjayhici54LCBici55LCBFWFRFTlQsIEVYVEVOVCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYm91bmRzQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kc0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5ib3VuZHNCdWZmZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoID09PSAwIHx8ICF0aGlzLmltYWdlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5tYXAucGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9ib3VuZHNBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5fbWFrZUJvdW5kc0FycmF5KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kc0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuX2JvdW5kc0FycmF5LCBib3VuZHNBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kc1NlZ21lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kc1NlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHRoaXMuaW1hZ2UsIGdsLlJHQkEpO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdyBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy50aWxlc1t3XTtcbiAgICAgICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIHNpbmdsZSB0aWxlIC0tIHdob29zZSBjb29yZGluYXRlcyBhcmUgdGhpcy50aWxlSUQgLS0gdGhhdFxuICAgICAgICAvLyBjb3ZlcnMgdGhlIGltYWdlIHdlIHdhbnQgdG8gcmVuZGVyLiAgSWYgdGhhdCdzIHRoZSBvbmUgYmVpbmdcbiAgICAgICAgLy8gcmVxdWVzdGVkLCBzZXQgaXQgdXAgd2l0aCB0aGUgaW1hZ2U7IG90aGVyd2lzZSwgbWFyayB0aGUgdGlsZSBhc1xuICAgICAgICAvLyBgZXJyb3JlZGAgdG8gaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIG5vIGRhdGEgZm9yIGl0LlxuICAgICAgICAvLyBJZiB0aGUgd29ybGQgd3JhcHMsIHdlIG1heSBoYXZlIG11bHRpcGxlIFwid3JhcHBlZFwiIGNvcGllcyBvZiB0aGVcbiAgICAgICAgLy8gc2luZ2xlIHRpbGUuXG4gICAgICAgIGlmICh0aGlzLnRpbGVJRCAmJiB0aGlzLnRpbGVJRC5lcXVhbHModGlsZS50aWxlSUQuY2Fub25pY2FsKSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1tTdHJpbmcodGlsZS50aWxlSUQud3JhcCldID0gdGlsZTtcbiAgICAgICAgICAgIHRpbGUuYnVja2V0cyA9IHt9O1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwsXG4gICAgICAgICAgICBjb29yZGluYXRlczogdGhpcy5jb29yZGluYXRlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGNvb3JkaW5hdGVzLCBnZXQgdGhlaXIgY2VudGVyIGFzIGEgY29vcmRpbmF0ZS5cbiAqXG4gKiBAcmV0dXJucyBjZW50ZXJwb2ludFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvb3JkaW5hdGVzQ2VudGVyVGlsZUlEKGNvb3JkczogQXJyYXk8TWVyY2F0b3JDb29yZGluYXRlPikge1xuICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBjb29yZC54KTtcbiAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIGNvb3JkLnkpO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgY29vcmQueCk7XG4gICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBjb29yZC55KTtcbiAgICB9XG5cbiAgICBjb25zdCBkeCA9IG1heFggLSBtaW5YO1xuICAgIGNvbnN0IGR5ID0gbWF4WSAtIG1pblk7XG4gICAgY29uc3QgZE1heCA9IE1hdGgubWF4KGR4LCBkeSk7XG4gICAgY29uc3Qgem9vbSA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoLU1hdGgubG9nKGRNYXgpIC8gTWF0aC5MTjIpKTtcbiAgICBjb25zdCB0aWxlc0F0Wm9vbSA9IE1hdGgucG93KDIsIHpvb20pO1xuXG4gICAgcmV0dXJuIG5ldyBDYW5vbmljYWxUaWxlSUQoXG4gICAgICAgICAgICB6b29tLFxuICAgICAgICAgICAgTWF0aC5mbG9vcigobWluWCArIG1heFgpIC8gMiAqIHRpbGVzQXRab29tKSxcbiAgICAgICAgICAgIE1hdGguZmxvb3IoKG1pblkgKyBtYXhZKSAvIDIgKiB0aWxlc0F0Wm9vbSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBJbWFnZVNvdXJjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Z2V0VmlkZW8sIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcblxuaW1wb3J0IEltYWdlU291cmNlIGZyb20gJy4vaW1hZ2Vfc291cmNlLmpzJztcbmltcG9ydCBib3VuZHNBdHRyaWJ1dGVzIGZyb20gJy4uL2RhdGEvYm91bmRzX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50LmpzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uL3JlbmRlci90ZXh0dXJlLmpzJztcbmltcG9ydCB7RXJyb3JFdmVudH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcC5qcyc7XG5pbXBvcnQgdHlwZSBEaXNwYXRjaGVyIGZyb20gJy4uL3V0aWwvZGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgdHlwZSB7RXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCB0eXBlIHtWaWRlb1NvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuXG4vKipcbiAqIEEgZGF0YSBzb3VyY2UgY29udGFpbmluZyB2aWRlby5cbiAqIFNlZSB0aGUgW1N0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMtdmlkZW8pIGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIGFkZCB0byBtYXBcbiAqIG1hcC5hZGRTb3VyY2UoJ3NvbWUgaWQnLCB7XG4gKiAgICAgdHlwZTogJ3ZpZGVvJyxcbiAqICAgICB1cmw6IFtcbiAqICAgICAgICAgJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vYmxvZy9hc3NldHMvYmFsdGltb3JlLXNtb2tlLm1wNCcsXG4gKiAgICAgICAgICdodHRwczovL3d3dy5tYXBib3guY29tL2Jsb2cvYXNzZXRzL2JhbHRpbW9yZS1zbW9rZS53ZWJtJ1xuICogICAgIF0sXG4gKiAgICAgY29vcmRpbmF0ZXM6IFtcbiAqICAgICAgICAgWy03Ni41NCwgMzkuMThdLFxuICogICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXG4gKiAgICAgICAgIFstNzYuNTIsIDM5LjE3XSxcbiAqICAgICAgICAgWy03Ni41NCwgMzkuMTddXG4gKiAgICAgXVxuICogfSk7XG4gKlxuICogLy8gdXBkYXRlXG4gKiBjb25zdCBteVNvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKTtcbiAqIG15U291cmNlLnNldENvb3JkaW5hdGVzKFtcbiAqICAgICBbLTc2LjU0MzM1NzM3MjI4Mzk0LCAzOS4xODU3OTkwNzIyOTc0OF0sXG4gKiAgICAgWy03Ni41MjgwMzY1OTQzOTA4NywgMzkuMTgzODM2NDg0NzU4N10sXG4gKiAgICAgWy03Ni41Mjk1Mzg2MzE0MzkyLCAzOS4xNzY4MzM5MjUwNzYwNl0sXG4gKiAgICAgWy03Ni41NDUyMDI3MzIwODYxOCwgMzkuMTc4NzYzNDQxMDY2NDJdXG4gKiBdKTtcbiAqXG4gKiBtYXAucmVtb3ZlU291cmNlKCdzb21lIGlkJyk7ICAvLyByZW1vdmVcbiAqIEBzZWUgW0V4YW1wbGU6IEFkZCBhIHZpZGVvXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3ZpZGVvLW9uLWEtbWFwLylcbiAqL1xuY2xhc3MgVmlkZW9Tb3VyY2UgZXh0ZW5kcyBJbWFnZVNvdXJjZSB7XG4gICAgb3B0aW9uczogVmlkZW9Tb3VyY2VTcGVjaWZpY2F0aW9uO1xuICAgIHVybHM6IEFycmF5PHN0cmluZz47XG4gICAgdmlkZW86IEhUTUxWaWRlb0VsZW1lbnQ7XG4gICAgcm91bmRab29tOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBvcHRpb25zOiBWaWRlb1NvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICAgICAgc3VwZXIoaWQsIG9wdGlvbnMsIGRpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQpO1xuICAgICAgICB0aGlzLnJvdW5kWm9vbSA9IHRydWU7XG4gICAgICAgIHRoaXMudHlwZSA9ICd2aWRlbyc7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgICAgdGhpcy51cmxzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdXJsIG9mIG9wdGlvbnMudXJscykge1xuICAgICAgICAgICAgdGhpcy51cmxzLnB1c2godGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuU291cmNlKS51cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0VmlkZW8odGhpcy51cmxzLCAoZXJyLCB2aWRlbykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlbyA9IHZpZGVvO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW8ubG9vcCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHRoZSB2aWRlbyBmcm9tIHRha2luZyBvdmVyIHRoZSBzY3JlZW4gaW4gaU9TXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlby5zZXRBdHRyaWJ1dGUoJ3BsYXlzaW5saW5lJywgJycpO1xuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgcmVwYWludGluZyB3aGVuIHZpZGVvIHN0YXJ0cyBwbGF5aW5nLiBoYXNUcmFuc2l0aW9uKCkgd2lsbCB0aGVuIHJldHVyblxuICAgICAgICAgICAgICAgIC8vIHRydWUgdG8gdHJpZ2dlciBhZGRpdGlvbmFsIGZyYW1lcyBhcyBsb25nIGFzIHRoZSB2aWRlb3MgY29udGludWVzIHBsYXlpbmcuXG4gICAgICAgICAgICAgICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW8ucGxheSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGF1c2VzIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gQXNzdW1pbmcgYSB2aWRlbyBzb3VyY2UgaWRlbnRpZmllZCBieSB2aWRlb19zb3VyY2VfaWQgd2FzIGFkZGVkIHRvIHRoZSBtYXBcbiAgICAgKiBjb25zdCB2aWRlb1NvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ3ZpZGVvX3NvdXJjZV9pZCcpO1xuICAgICAqXG4gICAgICogLy8gUGF1c2VzIHRoZSB2aWRlb1xuICAgICAqIHZpZGVvU291cmNlLnBhdXNlKCk7XG4gICAgICovXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGF5cyB0aGUgdmlkZW8uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEFzc3VtaW5nIGEgdmlkZW8gc291cmNlIGlkZW50aWZpZWQgYnkgdmlkZW9fc291cmNlX2lkIHdhcyBhZGRlZCB0byB0aGUgbWFwXG4gICAgICogY29uc3QgdmlkZW9Tb3VyY2UgPSBtYXAuZ2V0U291cmNlKCd2aWRlb19zb3VyY2VfaWQnKTtcbiAgICAgKlxuICAgICAqIC8vIFN0YXJ0cyB0aGUgdmlkZW9cbiAgICAgKiB2aWRlb1NvdXJjZS5wbGF5KCk7XG4gICAgICovXG4gICAgcGxheSgpIHtcbiAgICAgICAgaWYgKHRoaXMudmlkZW8pIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8ucGxheSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBwbGF5YmFjayB0byBhIHRpbWVzdGFtcCwgaW4gc2Vjb25kcy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNlZWsoc2Vjb25kczogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgICBjb25zdCBzZWVrYWJsZVJhbmdlID0gdGhpcy52aWRlby5zZWVrYWJsZTtcbiAgICAgICAgICAgIGlmIChzZWNvbmRzIDwgc2Vla2FibGVSYW5nZS5zdGFydCgwKSB8fCBzZWNvbmRzID4gc2Vla2FibGVSYW5nZS5lbmQoMCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlcy4ke3RoaXMuaWR9YCwgbnVsbCwgYFBsYXliYWNrIGZvciB0aGlzIHZpZGVvIGNhbiBiZSBzZXQgb25seSBiZXR3ZWVuIHRoZSAke3NlZWthYmxlUmFuZ2Uuc3RhcnQoMCl9IGFuZCAke3NlZWthYmxlUmFuZ2UuZW5kKDApfS1zZWNvbmQgbWFyay5gKSkpO1xuICAgICAgICAgICAgfSBlbHNlIHRoaXMudmlkZW8uY3VycmVudFRpbWUgPSBzZWNvbmRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgSFRNTCBgdmlkZW9gIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTFZpZGVvRWxlbWVudH0gVGhlIEhUTUwgYHZpZGVvYCBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gQXNzdW1pbmcgYSB2aWRlbyBzb3VyY2UgaWRlbnRpZmllZCBieSB2aWRlb19zb3VyY2VfaWQgd2FzIGFkZGVkIHRvIHRoZSBtYXBcbiAgICAgKiBjb25zdCB2aWRlb1NvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ3ZpZGVvX3NvdXJjZV9pZCcpO1xuICAgICAqXG4gICAgICogdmlkZW9Tb3VyY2UuZ2V0VmlkZW8oKTsgLy8gPHZpZGVvIGNyb3Nzb3JpZ2luPVwiQW5vbnltb3VzXCIgbG9vcD1cIlwiPi4uLjwvdmlkZW8+XG4gICAgICovXG4gICAgZ2V0VmlkZW8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcCkgcmV0dXJuO1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29vcmRpbmF0ZXModGhpcy5jb29yZGluYXRlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2aWRlbydzIGNvb3JkaW5hdGVzIGFuZCByZS1yZW5kZXJzIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIHNldENvb3JkaW5hdGVzXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIFZpZGVvU291cmNlXG4gICAgICogQHJldHVybnMge1ZpZGVvU291cmNlfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gQWRkIGEgdmlkZW8gc291cmNlIHRvIHRoZSBtYXAgdG8gbWFwXG4gICAgICogbWFwLmFkZFNvdXJjZSgndmlkZW9fc291cmNlX2lkJywge1xuICAgICAqICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAqICAgICB1cmw6IFtcbiAgICAgKiAgICAgICAgICdodHRwczovL3d3dy5tYXBib3guY29tL2Jsb2cvYXNzZXRzL2JhbHRpbW9yZS1zbW9rZS5tcDQnLFxuICAgICAqICAgICAgICAgJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vYmxvZy9hc3NldHMvYmFsdGltb3JlLXNtb2tlLndlYm0nXG4gICAgICogICAgIF0sXG4gICAgICogICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICogICAgICAgICBbLTc2LjU0LCAzOS4xOF0sXG4gICAgICogICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXG4gICAgICogICAgICAgICBbLTc2LjUyLCAzOS4xN10sXG4gICAgICogICAgICAgICBbLTc2LjU0LCAzOS4xN11cbiAgICAgKiAgICAgXVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gVGhlbiB1cGRhdGUgdGhlIHZpZGVvIHNvdXJjZSBjb29yZGluYXRlcyBieSBuZXcgY29vcmRpbmF0ZXNcbiAgICAgKiBjb25zdCB2aWRlb1NvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ3ZpZGVvX3NvdXJjZV9pZCcpO1xuICAgICAqIHZpZGVvU291cmNlLnNldENvb3JkaW5hdGVzKFtcbiAgICAgKiAgICAgWy03Ni41NDMzLCAzOS4xODU3XSxcbiAgICAgKiAgICAgWy03Ni41MjgwLCAzOS4xODM4XSxcbiAgICAgKiAgICAgWy03Ni41Mjk1LCAzOS4xNzY4XSxcbiAgICAgKiAgICAgWy03Ni41NDUyLCAzOS4xNzg3XVxuICAgICAqIF0pO1xuICAgICAqL1xuICAgIC8vIHNldENvb3JkaW5hdGVzIGluaGVyaXRlZCBmcm9tIEltYWdlU291cmNlXG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoID09PSAwIHx8IHRoaXMudmlkZW8ucmVhZHlTdGF0ZSA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gbm90IGVub3VnaCBkYXRhIGZvciBjdXJyZW50IHBvc2l0aW9uXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5tYXAucGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHRoaXMudmlkZW8sIGdsLlJHQkEpO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnZpZGVvLnZpZGVvV2lkdGg7XG4gICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMudmlkZW8udmlkZW9IZWlnaHQ7XG5cbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy52aWRlby5wYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMudmlkZW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9ib3VuZHNBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5fbWFrZUJvdW5kc0FycmF5KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kc0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuX2JvdW5kc0FycmF5LCBib3VuZHNBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kc1NlZ21lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmJvdW5kc1NlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB3IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLnRpbGVzW3ddO1xuICAgICAgICAgICAgaWYgKHRpbGUuc3RhdGUgIT09ICdsb2FkZWQnKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICAgICAgICAgIHRpbGUudGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICAgICAgICB1cmxzOiB0aGlzLnVybHMsXG4gICAgICAgICAgICBjb29yZGluYXRlczogdGhpcy5jb29yZGluYXRlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvICYmICF0aGlzLnZpZGVvLnBhdXNlZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZpZGVvU291cmNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEltYWdlU291cmNlIGZyb20gJy4vaW1hZ2Vfc291cmNlLmpzJztcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdy5qcyc7XG5pbXBvcnQgYm91bmRzQXR0cmlidXRlcyBmcm9tICcuLi9kYXRhL2JvdW5kc19hdHRyaWJ1dGVzLmpzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudC5qcyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9yZW5kZXIvdGV4dHVyZS5qcyc7XG5pbXBvcnQge0Vycm9yRXZlbnR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL3N0eWxlLXNwZWMvZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAuanMnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHR5cGUge0V2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5cbmV4cG9ydCB0eXBlIENhbnZhc1NvdXJjZVNwZWNpZmljYXRpb24gPSB7fFxuICAgIFwidHlwZVwiOiBcImNhbnZhc1wiLFxuICAgIFwiY29vcmRpbmF0ZXNcIjogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dLFxuICAgIFwiYW5pbWF0ZVwiPzogYm9vbGVhbixcbiAgICBcImNhbnZhc1wiOiBzdHJpbmcgfCBIVE1MQ2FudmFzRWxlbWVudFxufH07XG5cbi8qKlxuICogT3B0aW9ucyB0byBhZGQgYSBjYW52YXMgc291cmNlIHR5cGUgdG8gdGhlIG1hcC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDYW52YXNTb3VyY2VPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBTb3VyY2UgdHlwZS4gTXVzdCBiZSBgXCJjYW52YXNcImAuXG4gKiBAcHJvcGVydHkge3N0cmluZ3xIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzIENhbnZhcyBzb3VyY2UgZnJvbSB3aGljaCB0byByZWFkIHBpeGVscy4gQ2FuIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSUQgb2YgdGhlIGNhbnZhcyBlbGVtZW50LCBvciB0aGUgYEhUTUxDYW52YXNFbGVtZW50YCBpdHNlbGYuXG4gKiBAcHJvcGVydHkge0FycmF5PEFycmF5PG51bWJlcj4+fSBjb29yZGluYXRlcyBGb3VyIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyBkZW5vdGluZyB3aGVyZSB0byBwbGFjZSB0aGUgY29ybmVycyBvZiB0aGUgY2FudmFzLCBzcGVjaWZpZWQgaW4gYFtsb25naXR1ZGUsIGxhdGl0dWRlXWAgcGFpcnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbmltYXRlPXRydWVdIFdoZXRoZXIgdGhlIGNhbnZhcyBzb3VyY2UgaXMgYW5pbWF0ZWQuIElmIHRoZSBjYW52YXMgaXMgc3RhdGljIChwaXhlbHMgZG8gbm90IG5lZWQgdG8gYmUgcmUtcmVhZCBvbiBldmVyeSBmcmFtZSksIGBhbmltYXRlYCBzaG91bGQgYmUgc2V0IHRvIGBmYWxzZWAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAqL1xuXG4vKipcbiAqIEEgZGF0YSBzb3VyY2UgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYW4gSFRNTCBjYW52YXMuIFNlZSB7QGxpbmsgQ2FudmFzU291cmNlT3B0aW9uc30gZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAnY2FudmFzJyxcbiAqICAgICBjYW52YXM6ICdpZE9mTXlIVE1MQ2FudmFzJyxcbiAqICAgICBhbmltYXRlOiB0cnVlLFxuICogICAgIGNvb3JkaW5hdGVzOiBbXG4gKiAgICAgICAgIFstNzYuNTQsIDM5LjE4XSxcbiAqICAgICAgICAgWy03Ni41MiwgMzkuMThdLFxuICogICAgICAgICBbLTc2LjUyLCAzOS4xN10sXG4gKiAgICAgICAgIFstNzYuNTQsIDM5LjE3XVxuICogICAgIF1cbiAqIH0pO1xuICpcbiAqIC8vIHVwZGF0ZVxuICogY29uc3QgbXlTb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdzb21lIGlkJyk7XG4gKiBteVNvdXJjZS5zZXRDb29yZGluYXRlcyhbXG4gKiAgICAgWy03Ni41NDMzNTczNzIyODM5NCwgMzkuMTg1Nzk5MDcyMjk3NDhdLFxuICogICAgIFstNzYuNTI4MDM2NTk0MzkwODcsIDM5LjE4MzgzNjQ4NDc1ODddLFxuICogICAgIFstNzYuNTI5NTM4NjMxNDM5MiwgMzkuMTc2ODMzOTI1MDc2MDZdLFxuICogICAgIFstNzYuNTQ1MjAyNzMyMDg2MTgsIDM5LjE3ODc2MzQ0MTA2NjQyXVxuICogXSk7XG4gKlxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSBjYW52YXMgc291cmNlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jYW52YXMtc291cmNlLylcbiAqL1xuY2xhc3MgQ2FudmFzU291cmNlIGV4dGVuZHMgSW1hZ2VTb3VyY2Uge1xuICAgIG9wdGlvbnM6IENhbnZhc1NvdXJjZVNwZWNpZmljYXRpb247XG4gICAgYW5pbWF0ZTogYm9vbGVhbjtcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIHBsYXk6ICgpID0+IHZvaWQ7XG4gICAgcGF1c2U6ICgpID0+IHZvaWQ7XG4gICAgX3BsYXlpbmc6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IENhbnZhc1NvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICAgICAgc3VwZXIoaWQsIG9wdGlvbnMsIGRpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgICAgIC8vIFdlIGJ1aWxkIGluIHNvbWUgdmFsaWRhdGlvbiBoZXJlLCBzaW5jZSBjYW52YXMgc291cmNlcyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIHN0eWxlIHNwZWM6XG4gICAgICAgIGlmICghb3B0aW9ucy5jb29yZGluYXRlcykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBWYWxpZGF0aW9uRXJyb3IoYHNvdXJjZXMuJHtpZH1gLCBudWxsLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcImNvb3JkaW5hdGVzXCInKSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuY29vcmRpbmF0ZXMpIHx8IG9wdGlvbnMuY29vcmRpbmF0ZXMubGVuZ3RoICE9PSA0IHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jb29yZGluYXRlcy5zb21lKGMgPT4gIUFycmF5LmlzQXJyYXkoYykgfHwgYy5sZW5ndGggIT09IDIgfHwgYy5zb21lKGwgPT4gdHlwZW9mIGwgIT09ICdudW1iZXInKSkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgVmFsaWRhdGlvbkVycm9yKGBzb3VyY2VzLiR7aWR9YCwgbnVsbCwgJ1wiY29vcmRpbmF0ZXNcIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIGFycmF5IG9mIDQgbG9uZ2l0dWRlL2xhdGl0dWRlIGFycmF5IHBhaXJzJykpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUgJiYgdHlwZW9mIG9wdGlvbnMuYW5pbWF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlcy4ke2lkfWAsIG51bGwsICdvcHRpb25hbCBcImFuaW1hdGVcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZScpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wdGlvbnMuY2FudmFzKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlcy4ke2lkfWAsIG51bGwsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiY2FudmFzXCInKSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLmNhbnZhcyAhPT0gJ3N0cmluZycgJiYgIShvcHRpb25zLmNhbnZhcyBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgVmFsaWRhdGlvbkVycm9yKGBzb3VyY2VzLiR7aWR9YCwgbnVsbCwgJ1wiY2FudmFzXCIgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBJRCBvZiB0aGUgY2FudmFzIGVsZW1lbnQgZnJvbSB3aGljaCB0byByZWFkLCBvciBhbiBIVE1MQ2FudmFzRWxlbWVudCBpbnN0YW5jZScpKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmFuaW1hdGUgPSBvcHRpb25zLmFuaW1hdGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYW5pbWF0ZSA6IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBhbmltYXRpb24uIFRoZSBpbWFnZSB3aWxsIGJlIGNvcGllZCBmcm9tIHRoZSBjYW52YXMgdG8gdGhlIG1hcCBvbiBlYWNoIGZyYW1lLlxuICAgICAqXG4gICAgICogQG1ldGhvZCBwbGF5XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIENhbnZhc1NvdXJjZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgYW5pbWF0aW9uLiBUaGUgbWFwIHdpbGwgZGlzcGxheSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBjYW52YXMgaW1hZ2UuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIHBhdXNlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIENhbnZhc1NvdXJjZVxuICAgICAqL1xuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSAodGhpcy5vcHRpb25zLmNhbnZhcyBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCkgP1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYW52YXMgOlxuICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuY2FudmFzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0O1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNJbnZhbGlkRGltZW5zaW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdDYW52YXMgZGltZW5zaW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8uJykpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5fcGxheWluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm1hcC50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIGBjYW52YXNgIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9IFRoZSBIVE1MIGBjYW52YXNgIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBBc3N1bWluZyB0aGUgZm9sbG93aW5nIGNhbnZhcyBpcyBhZGRlZCB0byB5b3VyIHBhZ2VcbiAgICAgKiAvLyA8Y2FudmFzIGlkPVwiY2FudmFzSURcIiB3aWR0aD1cIjQwMFwiIGhlaWdodD1cIjQwMFwiPjwvY2FudmFzPlxuICAgICAqIG1hcC5hZGRTb3VyY2UoJ2NhbnZhcy1zb3VyY2UnLCB7XG4gICAgICogICAgIHR5cGU6ICdjYW52YXMnLFxuICAgICAqICAgICBjYW52YXM6ICdjYW52YXNJRCcsXG4gICAgICogICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICogICAgICAgICBbOTEuNDQ2MSwgMjEuNTAwNl0sXG4gICAgICogICAgICAgICBbMTAwLjM1NDEsIDIxLjUwMDZdLFxuICAgICAqICAgICAgICAgWzEwMC4zNTQxLCAxMy45NzA2XSxcbiAgICAgKiAgICAgICAgIFs5MS40NDYxLCAxMy45NzA2XVxuICAgICAqICAgICBdXG4gICAgICogfSk7XG4gICAgICogbWFwLmdldFNvdXJjZSgnY2FudmFzLXNvdXJjZScpLmdldENhbnZhcygpOyAvLyA8Y2FudmFzIGlkPVwiY2FudmFzSURcIiB3aWR0aD1cIjQwMFwiIGhlaWdodD1cIjQwMFwiPjwvY2FudmFzPlxuICAgICAqL1xuICAgIGdldENhbnZhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FudmFzO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbmltYXRlKSB0aGlzLnBsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY2FudmFzJ3MgY29vcmRpbmF0ZXMgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBtZXRob2Qgc2V0Q29vcmRpbmF0ZXNcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgQ2FudmFzU291cmNlXG4gICAgICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMsXG4gICAgICogICByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBudW1iZXJzLCB3aGljaCBkZWZpbmUgdGhlIGNvcm5lcnMgb2YgdGhlIGNhbnZhcy5cbiAgICAgKiAgIFRoZSBjb29yZGluYXRlcyBzdGFydCBhdCB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXMgYW5kIHByb2NlZWQgaW4gY2xvY2t3aXNlIG9yZGVyLlxuICAgICAqICAgVGhleSBkbyBub3QgaGF2ZSB0byByZXByZXNlbnQgYSByZWN0YW5nbGUuXG4gICAgICogQHJldHVybnMge0NhbnZhc1NvdXJjZX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKi9cblxuICAgIC8vIHNldENvb3JkaW5hdGVzIGluaGVyaXRlZCBmcm9tIEltYWdlU291cmNlXG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBsZXQgcmVzaXplID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmNhbnZhcy53aWR0aCAhPT0gdGhpcy53aWR0aCkge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuY2FudmFzLndpZHRoO1xuICAgICAgICAgICAgcmVzaXplID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jYW52YXMuaGVpZ2h0ICE9PSB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmNhbnZhcy5oZWlnaHQ7XG4gICAgICAgICAgICByZXNpemUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2hhc0ludmFsaWREaW1lbnNpb25zKCkpIHJldHVybjtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoID09PSAwKSByZXR1cm47IC8vIG5vdCBlbm91Z2ggZGF0YSBmb3IgY3VycmVudCBwb3NpdGlvblxuXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLm1hcC5wYWludGVyLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICBpZiAoIXRoaXMuX2JvdW5kc0FycmF5KSB7XG4gICAgICAgICAgICB0aGlzLl9tYWtlQm91bmRzQXJyYXkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5ib3VuZHNCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5fYm91bmRzQXJyYXksIGJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuYm91bmRzU2VnbWVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgNCwgMik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5jYW52YXMsIGdsLlJHQkEsIHtwcmVtdWx0aXBseTogdHJ1ZX0pO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc2l6ZSB8fCB0aGlzLl9wbGF5aW5nKSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUudXBkYXRlKHRoaXMuY2FudmFzLCB7cHJlbXVsdGlwbHk6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgdyBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy50aWxlc1t3XTtcbiAgICAgICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdjYW52YXMnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IHRoaXMuY29vcmRpbmF0ZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGxheWluZztcbiAgICB9XG5cbiAgICBfaGFzSW52YWxpZERpbWVuc2lvbnMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgeCBvZiBbdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodF0pIHtcbiAgICAgICAgICAgIGlmIChpc05hTih4KSB8fCB4IDw9IDApIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENhbnZhc1NvdXJjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7YmluZEFsbH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHR5cGUge0V2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcC5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5cbi8qKlxuICogVGhlIGBTb3VyY2VgIGludGVyZmFjZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggc291cmNlIHR5cGUsIGluY2x1ZGluZyBcImNvcmVcIiB0eXBlcyBsaWtlIGB2ZWN0b3JgLCBgcmFzdGVyYCxcbiAqIG9yIGB2aWRlb2ApIGFuZCBhbGwgY3VzdG9tLCB0aGlyZC1wYXJ0eSB0eXBlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgaWQgZm9yIHRoZSBzb3VyY2UuIE11c3Qgbm90IGJlIHVzZWQgYnkgYW55IGV4aXN0aW5nIHNvdXJjZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFNvdXJjZSBvcHRpb25zLCBzcGVjaWZpYyB0byB0aGUgc291cmNlIHR5cGUgKGV4Y2VwdCBmb3IgYG9wdGlvbnMudHlwZWAsIHdoaWNoIGlzIGFsd2F5c1xuICogcmVxdWlyZWQpLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudHlwZSBUaGUgc291cmNlIHR5cGUsIG1hdGNoaW5nIHRoZSB2YWx1ZSBvZiBgbmFtZWAgdXNlZCBpbiB7QGxpbmsgU3R5bGUjYWRkU291cmNlVHlwZX0uXG4gKiBAcGFyYW0ge0Rpc3BhdGNoZXJ9IGRpc3BhdGNoZXIgQSB7QGxpbmsgRGlzcGF0Y2hlcn0gaW5zdGFuY2UsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIHdvcmtlcnMuXG4gKlxuICogQGZpcmVzIE1hcC5ldmVudDpkYXRhIEZpcmVzIGBkYXRhYCB3aXRoIGB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ31gXG4gKiB0byBpbmRpY2F0ZSB0aGF0IGFueSBuZWNlc3NhcnkgbWV0YWRhdGEgaGFzIGJlZW4gbG9hZGVkIHNvIHRoYXQgaXQncyBva2F5IHRvIGNhbGwgYGxvYWRUaWxlYDtcbiAqIGZpcmVzIGBkYXRhYCB3aXRoIGB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ2NvbnRlbnQnfWBcbiAqIHRvIGluZGljYXRlIHRoYXQgdGhlIHNvdXJjZSBkYXRhIGhhcyBjaGFuZ2VkLCBzbyB0aGF0IGFueSBjdXJyZW50IGNhY2hlcyBzaG91bGQgYmUgZmx1c2hlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCBUaGUgaWQgZm9yIHRoZSBzb3VyY2UuICBNdXN0IG1hdGNoIHRoZSBpZCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1pbnpvb21cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXh6b29tXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzVGlsZUNsaXBwZWQgYGZhbHNlYCBpZiB0aWxlcyBjYW4gYmUgZHJhd24gb3V0c2lkZSB0aGVpciBib3VuZGFyaWVzLCBgdHJ1ZWAgaWYgdGhleSBjYW5ub3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJlcGFyc2VPdmVyc2NhbGVkIGB0cnVlYCBpZiB0aWxlcyBzaG91bGQgYmUgc2VudCBiYWNrIHRvIHRoZSB3b3JrZXIgZm9yIGVhY2ggb3Zlcnpvb21lZCB6b29tXG4gKiBsZXZlbCwgYGZhbHNlYCBpZiBub3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJvdW5kWm9vbSBgdHJ1ZWAgaWYgem9vbSBsZXZlbHMgYXJlIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBpbiB0aGUgc291cmNlIGRhdGEsIGBmYWxzZWBcbiAqIGlmIHRoZXkgYXJlIGZsb29yLWVkIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlIHtcbiAgICArdHlwZTogc3RyaW5nO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWluem9vbTogbnVtYmVyLFxuICAgIG1heHpvb206IG51bWJlcixcbiAgICB0aWxlU2l6ZTogbnVtYmVyLFxuICAgIGF0dHJpYnV0aW9uPzogc3RyaW5nLFxuXG4gICAgcm91bmRab29tPzogYm9vbGVhbixcbiAgICBpc1RpbGVDbGlwcGVkPzogYm9vbGVhbixcbiAgICBtYXBib3hfbG9nbz86IGJvb2xlYW4sXG4gICAgdGlsZUlEPzogQ2Fub25pY2FsVGlsZUlEO1xuICAgIHJlcGFyc2VPdmVyc2NhbGVkPzogYm9vbGVhbixcbiAgICB2ZWN0b3JMYXllcklkcz86IEFycmF5PHN0cmluZz4sXG5cbiAgICBoYXNUcmFuc2l0aW9uKCk6IGJvb2xlYW47XG4gICAgbG9hZGVkKCk6IGJvb2xlYW47XG5cbiAgICBmaXJlKGV2ZW50OiBFdmVudCk6IG1peGVkO1xuICAgIG9uKHR5cGU6ICosIGxpc3RlbmVyOiAoT2JqZWN0KSA9PiBhbnkpOiBFdmVudGVkO1xuXG4gICAgK29uQWRkPzogKG1hcDogTWFwKSA9PiB2b2lkO1xuICAgICtvblJlbW92ZT86IChtYXA6IE1hcCkgPT4gdm9pZDtcblxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPiwgdGlsZVdvcmtlcnM/OiB7W3N0cmluZ106IEFjdG9yfSk6IHZvaWQ7XG4gICAgK2hhc1RpbGU/OiAodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSA9PiBib29sZWFuO1xuICAgICthYm9ydFRpbGU/OiAodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSA9PiB2b2lkO1xuICAgICt1bmxvYWRUaWxlPzogKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikgPT4gdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIEEgcGxhaW4gKHN0cmluZ2lmaWFibGUpIEpTIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNvdXJjZS5cbiAgICAgKiBDcmVhdGluZyBhIHNvdXJjZSB1c2luZyB0aGUgcmV0dXJuZWQgb2JqZWN0IGFzIHRoZSBgb3B0aW9uc2Agc2hvdWxkIHJlc3VsdCBpbiBhIFNvdXJjZSB0aGF0IGlzXG4gICAgICogZXF1aXZhbGVudCB0byB0aGlzIG9uZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNlcmlhbGl6ZSgpOiBPYmplY3Q7XG5cbiAgICArcHJlcGFyZT86ICgpID0+IHZvaWQ7XG5cbiAgICArYWZ0ZXJVcGRhdGU/OiAoKSA9PiB2b2lkO1xuICAgICtfY2xlYXI/OiAoKSA9PiB2b2lkO1xufVxuXG50eXBlIFNvdXJjZVN0YXRpY3MgPSB7XG4gICAgLypcbiAgICAgKiBBbiBvcHRpb25hbCBVUkwgdG8gYSBzY3JpcHQgd2hpY2gsIHdoZW4gcnVuIGJ5IGEgV29ya2VyLCByZWdpc3RlcnMgYSB7QGxpbmsgV29ya2VyU291cmNlfVxuICAgICAqIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIFNvdXJjZSB0eXBlIGJ5IGNhbGxpbmcgYHNlbGYucmVnaXN0ZXJXb3JrZXJTb3VyY2Uod29ya2VyU291cmNlOiBXb3JrZXJTb3VyY2UpYC5cbiAgICAgKi9cbiAgICB3b3JrZXJTb3VyY2VVUkw/OiBVUkw7XG59O1xuXG5leHBvcnQgdHlwZSBTb3VyY2VDbGFzcyA9IENsYXNzPFNvdXJjZT4gJiBTb3VyY2VTdGF0aWNzO1xuXG5pbXBvcnQgdmVjdG9yIGZyb20gJy4uL3NvdXJjZS92ZWN0b3JfdGlsZV9zb3VyY2UuanMnO1xuaW1wb3J0IHJhc3RlciBmcm9tICcuLi9zb3VyY2UvcmFzdGVyX3RpbGVfc291cmNlLmpzJztcbmltcG9ydCByYXN0ZXJEZW0gZnJvbSAnLi4vc291cmNlL3Jhc3Rlcl9kZW1fdGlsZV9zb3VyY2UuanMnO1xuaW1wb3J0IGdlb2pzb24gZnJvbSAnLi4vc291cmNlL2dlb2pzb25fc291cmNlLmpzJztcbmltcG9ydCB2aWRlbyBmcm9tICcuLi9zb3VyY2UvdmlkZW9fc291cmNlLmpzJztcbmltcG9ydCBpbWFnZSBmcm9tICcuLi9zb3VyY2UvaW1hZ2Vfc291cmNlLmpzJztcbmltcG9ydCBjYW52YXMgZnJvbSAnLi4vc291cmNlL2NhbnZhc19zb3VyY2UuanMnO1xuXG5pbXBvcnQgdHlwZSB7U291cmNlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5cbmNvbnN0IHNvdXJjZVR5cGVzID0ge1xuICAgIHZlY3RvcixcbiAgICByYXN0ZXIsXG4gICAgJ3Jhc3Rlci1kZW0nOiByYXN0ZXJEZW0sXG4gICAgZ2VvanNvbixcbiAgICB2aWRlbyxcbiAgICBpbWFnZSxcbiAgICBjYW52YXNcbn07XG5cbi8qXG4gKiBDcmVhdGVzIGEgdGlsZWQgZGF0YSBzb3VyY2UgaW5zdGFuY2UgZ2l2ZW4gYW4gb3B0aW9ucyBvYmplY3QuXG4gKlxuICogQHBhcmFtIGlkXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIEEgc291cmNlIGRlZmluaXRpb24gb2JqZWN0IGNvbXBsaWFudCB3aXRoXG4gKiBbYG1hcGJveC1nbC1zdHlsZS1zcGVjYF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcykgb3IsIGZvciBhIHRoaXJkLXBhcnR5IHNvdXJjZSB0eXBlLFxuICAqIHdpdGggdGhhdCB0eXBlJ3MgcmVxdWlyZW1lbnRzLlxuICogQHBhcmFtIHtEaXNwYXRjaGVyfSBkaXNwYXRjaGVyXG4gKiBAcmV0dXJucyB7U291cmNlfVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlID0gZnVuY3Rpb24oaWQ6IHN0cmluZywgc3BlY2lmaWNhdGlvbjogU291cmNlU3BlY2lmaWNhdGlvbiwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBzb3VyY2VUeXBlc1tzcGVjaWZpY2F0aW9uLnR5cGVdKGlkLCAoc3BlY2lmaWNhdGlvbjogYW55KSwgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCk7XG5cbiAgICBpZiAoc291cmNlLmlkICE9PSBpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFNvdXJjZSBpZCB0byBiZSAke2lkfSBpbnN0ZWFkIG9mICR7c291cmNlLmlkfWApO1xuICAgIH1cblxuICAgIGJpbmRBbGwoWydsb2FkJywgJ2Fib3J0JywgJ3VubG9hZCcsICdzZXJpYWxpemUnLCAncHJlcGFyZSddLCBzb3VyY2UpO1xuICAgIHJldHVybiBzb3VyY2U7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VHlwZSA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc291cmNlVHlwZXNbbmFtZV07XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0VHlwZSA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIHR5cGU6IENsYXNzPFNvdXJjZT4pIHtcbiAgICBzb3VyY2VUeXBlc1tuYW1lXSA9IHR5cGU7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdG9yIHtcbiAgICBzZW5kKHR5cGU6IHN0cmluZywgZGF0YTogT2JqZWN0LCBjYWxsYmFjazogQ2FsbGJhY2s8YW55Pik6IHZvaWQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIENvbGxpc2lvbkluZGV4IGZyb20gJy4uL3N5bWJvbC9jb2xsaXNpb25faW5kZXguanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUge1JldGFpbmVkUXVlcnlEYXRhfSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50LmpzJztcbmltcG9ydCB0eXBlIHtGaWx0ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtRdWVyeUdlb21ldHJ5fSBmcm9tICcuLi9zdHlsZS9xdWVyeV9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge21hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbi8qXG4gKiBSZXR1cm5zIGEgbWF0cml4IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udmVydCBmcm9tIHRpbGUgY29vcmRpbmF0ZXMgdG8gdmlld3BvcnQgcGl4ZWwgY29vcmRpbmF0ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFBpeGVsUG9zTWF0cml4KHRyYW5zZm9ybSwgdGlsZUlEKSB7XG4gICAgY29uc3QgdCA9IG1hdDQuaWRlbnRpdHkoW10pO1xuICAgIG1hdDQuc2NhbGUodCwgdCwgW3RyYW5zZm9ybS53aWR0aCAqIDAuNSwgLXRyYW5zZm9ybS5oZWlnaHQgKiAwLjUsIDFdKTtcbiAgICBtYXQ0LnRyYW5zbGF0ZSh0LCB0LCBbMSwgLTEsIDBdKTtcbiAgICByZXR1cm4gbWF0NC5tdWx0aXBseSh0LCB0LCB0cmFuc2Zvcm0uY2FsY3VsYXRlUHJvak1hdHJpeCh0aWxlSUQudG9VbndyYXBwZWQoKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlSZW5kZXJlZEZlYXR1cmVzKHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUxheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzOiB7W186IHN0cmluZ106IE9iamVjdH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeTogUXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgZmlsdGVyOiBGaWx0ZXJTcGVjaWZpY2F0aW9uLCBsYXllcnM6IEFycmF5PHN0cmluZz4sIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZTNEUXVlcnk6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsaXplUXVlcnlHZW9tZXRyeTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc3QgdGlsZVJlc3VsdHMgPSBzb3VyY2VDYWNoZS50aWxlc0luKHF1ZXJ5R2VvbWV0cnksIHVzZTNEUXVlcnksIHZpc3VhbGl6ZVF1ZXJ5R2VvbWV0cnkpO1xuICAgIHRpbGVSZXN1bHRzLnNvcnQoc29ydFRpbGVzSW4pO1xuICAgIGNvbnN0IHJlbmRlcmVkRmVhdHVyZUxheWVycyA9IFtdO1xuICAgIGZvciAoY29uc3QgdGlsZVJlc3VsdCBvZiB0aWxlUmVzdWx0cykge1xuICAgICAgICByZW5kZXJlZEZlYXR1cmVMYXllcnMucHVzaCh7XG4gICAgICAgICAgICB3cmFwcGVkVGlsZUlEOiB0aWxlUmVzdWx0LnRpbGUudGlsZUlELndyYXBwZWQoKS5rZXksXG4gICAgICAgICAgICBxdWVyeVJlc3VsdHM6IHRpbGVSZXN1bHQudGlsZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoXG4gICAgICAgICAgICAgICAgc3R5bGVMYXllcnMsXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZExheWVycyxcbiAgICAgICAgICAgICAgICBzb3VyY2VDYWNoZS5fc3RhdGUsXG4gICAgICAgICAgICAgICAgdGlsZVJlc3VsdCxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgIGdldFBpeGVsUG9zTWF0cml4KHNvdXJjZUNhY2hlLnRyYW5zZm9ybSwgdGlsZVJlc3VsdC50aWxlLnRpbGVJRCksXG4gICAgICAgICAgICAgICAgdmlzdWFsaXplUXVlcnlHZW9tZXRyeSlcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gbWVyZ2VSZW5kZXJlZEZlYXR1cmVMYXllcnMocmVuZGVyZWRGZWF0dXJlTGF5ZXJzKTtcblxuICAgIC8vIE1lcmdlIHN0YXRlIGZyb20gU291cmNlQ2FjaGUgaW50byB0aGUgcmVzdWx0c1xuICAgIGZvciAoY29uc3QgbGF5ZXJJRCBpbiByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0W2xheWVySURdLmZvckVhY2goKGZlYXR1cmVXcmFwcGVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZVdyYXBwZXIuZmVhdHVyZTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gc291cmNlQ2FjaGUuZ2V0RmVhdHVyZVN0YXRlKGZlYXR1cmUubGF5ZXJbJ3NvdXJjZS1sYXllciddLCBmZWF0dXJlLmlkKTtcbiAgICAgICAgICAgIGZlYXR1cmUuc291cmNlID0gZmVhdHVyZS5sYXllci5zb3VyY2U7XG4gICAgICAgICAgICBpZiAoZmVhdHVyZS5sYXllclsnc291cmNlLWxheWVyJ10pIHtcbiAgICAgICAgICAgICAgICBmZWF0dXJlLnNvdXJjZUxheWVyID0gZmVhdHVyZS5sYXllclsnc291cmNlLWxheWVyJ107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmZWF0dXJlLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlSZW5kZXJlZFN5bWJvbHMoc3R5bGVMYXllcnM6IHtbXzogc3RyaW5nXTogU3R5bGVMYXllcn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZExheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXllclNvdXJjZUNhY2hlOiAobGF5ZXI6IFN0eWxlTGF5ZXIpID0+IFNvdXJjZUNhY2hlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgZmlsdGVyOiBGaWx0ZXJTcGVjaWZpY2F0aW9uLCBsYXllcnM6IEFycmF5PHN0cmluZz4sIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkluZGV4OiBDb2xsaXNpb25JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFF1ZXJ5RGF0YToge1tfOiBudW1iZXJdOiBSZXRhaW5lZFF1ZXJ5RGF0YX0pIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBjb25zdCByZW5kZXJlZFN5bWJvbHMgPSBjb2xsaXNpb25JbmRleC5xdWVyeVJlbmRlcmVkU3ltYm9scyhxdWVyeUdlb21ldHJ5KTtcbiAgICBjb25zdCBidWNrZXRRdWVyeURhdGEgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGJ1Y2tldEluc3RhbmNlSWQgb2YgT2JqZWN0LmtleXMocmVuZGVyZWRTeW1ib2xzKS5tYXAoTnVtYmVyKSkge1xuICAgICAgICBidWNrZXRRdWVyeURhdGEucHVzaChyZXRhaW5lZFF1ZXJ5RGF0YVtidWNrZXRJbnN0YW5jZUlkXSk7XG4gICAgfVxuICAgIGJ1Y2tldFF1ZXJ5RGF0YS5zb3J0KHNvcnRUaWxlc0luKTtcblxuICAgIGZvciAoY29uc3QgcXVlcnlEYXRhIG9mIGJ1Y2tldFF1ZXJ5RGF0YSkge1xuICAgICAgICBjb25zdCBidWNrZXRTeW1ib2xzID0gcXVlcnlEYXRhLmZlYXR1cmVJbmRleC5sb29rdXBTeW1ib2xGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICByZW5kZXJlZFN5bWJvbHNbcXVlcnlEYXRhLmJ1Y2tldEluc3RhbmNlSWRdLFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRMYXllcnMsXG4gICAgICAgICAgICAgICAgcXVlcnlEYXRhLmJ1Y2tldEluZGV4LFxuICAgICAgICAgICAgICAgIHF1ZXJ5RGF0YS5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgIHBhcmFtcy5maWx0ZXIsXG4gICAgICAgICAgICAgICAgcGFyYW1zLmxheWVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXMuYXZhaWxhYmxlSW1hZ2VzLFxuICAgICAgICAgICAgICAgIHN0eWxlTGF5ZXJzKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxheWVySUQgaW4gYnVja2V0U3ltYm9scykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0RmVhdHVyZXMgPSByZXN1bHRbbGF5ZXJJRF0gPSByZXN1bHRbbGF5ZXJJRF0gfHwgW107XG4gICAgICAgICAgICBjb25zdCBsYXllclN5bWJvbHMgPSBidWNrZXRTeW1ib2xzW2xheWVySURdO1xuICAgICAgICAgICAgbGF5ZXJTeW1ib2xzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBNYXRjaCB0b3BEb3duRmVhdHVyZUNvbXBhcmF0b3IgZnJvbSBGZWF0dXJlSW5kZXgsIGJ1dCB1c2luZ1xuICAgICAgICAgICAgICAgIC8vIG1vc3QgcmVjZW50IHNvcnRpbmcgb2YgZmVhdHVyZXMgZnJvbSBidWNrZXQuc29ydEZlYXR1cmVzXG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZVNvcnRPcmRlciA9IHF1ZXJ5RGF0YS5mZWF0dXJlU29ydE9yZGVyO1xuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlU29ydE9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHF1ZXJ5UmVuZGVyZWRTeW1ib2xzIGRvY3VtZW50YXRpb24gc2F5cyB3ZSdsbCByZXR1cm4gZmVhdHVyZXMgaW5cbiAgICAgICAgICAgICAgICAgICAgLy8gXCJ0b3AtdG8tYm90dG9tXCIgcmVuZGVyaW5nIG9yZGVyIChha2EgbGFzdC10by1maXJzdCkuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFjdHVhbGx5IHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBzeW1ib2wgaW5zdGFuY2VzIHBlciBmZWF0dXJlLCBzb1xuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzb3J0IGVhY2ggZmVhdHVyZSBiYXNlZCBvbiB0aGUgZmlyc3QgbWF0Y2hpbmcgc3ltYm9sIGluc3RhbmNlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRBID0gZmVhdHVyZVNvcnRPcmRlci5pbmRleE9mKGEuZmVhdHVyZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkQiA9IGZlYXR1cmVTb3J0T3JkZXIuaW5kZXhPZihiLmZlYXR1cmVJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydChzb3J0ZWRBID49IDApO1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc29ydGVkQiA+PSAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnRlZEIgLSBzb3J0ZWRBO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1Y2tldCBoYXNuJ3QgYmVlbiByZS1zb3J0ZWQgYmFzZWQgb24gYW5nbGUsIHNvIHVzZSB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBvZiB0aGUgb3JkZXIgdGhlIGZlYXR1cmVzIGFwcGVhcmVkIGluIHRoZSBkYXRhLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi5mZWF0dXJlSW5kZXggLSBhLmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ltYm9sRmVhdHVyZSBvZiBsYXllclN5bWJvbHMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRGZWF0dXJlcy5wdXNoKHN5bWJvbEZlYXR1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWVyZ2Ugc3RhdGUgZnJvbSBTb3VyY2VDYWNoZSBpbnRvIHRoZSByZXN1bHRzXG4gICAgZm9yIChjb25zdCBsYXllck5hbWUgaW4gcmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdFtsYXllck5hbWVdLmZvckVhY2goKGZlYXR1cmVXcmFwcGVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZVdyYXBwZXIuZmVhdHVyZTtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gc3R5bGVMYXllcnNbbGF5ZXJOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gZ2V0TGF5ZXJTb3VyY2VDYWNoZShsYXllcik7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNvdXJjZUNhY2hlLmdldEZlYXR1cmVTdGF0ZShmZWF0dXJlLmxheWVyWydzb3VyY2UtbGF5ZXInXSwgZmVhdHVyZS5pZCk7XG4gICAgICAgICAgICBmZWF0dXJlLnNvdXJjZSA9IGZlYXR1cmUubGF5ZXIuc291cmNlO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUubGF5ZXJbJ3NvdXJjZS1sYXllciddKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5zb3VyY2VMYXllciA9IGZlYXR1cmUubGF5ZXJbJ3NvdXJjZS1sYXllciddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmVhdHVyZS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5U291cmNlRmVhdHVyZXMoc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBwYXJhbXM6IGFueSkge1xuICAgIGNvbnN0IHRpbGVzID0gc291cmNlQ2FjaGUuZ2V0UmVuZGVyYWJsZUlkcygpLm1hcCgoaWQpID0+IHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUNhY2hlLmdldFRpbGVCeUlEKGlkKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgY29uc3QgZGF0YVRpbGVzID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB0aWxlID0gdGlsZXNbaV07XG4gICAgICAgIGNvbnN0IGRhdGFJRCA9IHRpbGUudGlsZUlELmNhbm9uaWNhbC5rZXk7XG4gICAgICAgIGlmICghZGF0YVRpbGVzW2RhdGFJRF0pIHtcbiAgICAgICAgICAgIGRhdGFUaWxlc1tkYXRhSURdID0gdHJ1ZTtcbiAgICAgICAgICAgIHRpbGUucXVlcnlTb3VyY2VGZWF0dXJlcyhyZXN1bHQsIHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzb3J0VGlsZXNJbihhLCBiKSB7XG4gICAgY29uc3QgaWRBID0gYS50aWxlSUQ7XG4gICAgY29uc3QgaWRCID0gYi50aWxlSUQ7XG4gICAgcmV0dXJuIChpZEEub3ZlcnNjYWxlZFogLSBpZEIub3ZlcnNjYWxlZFopIHx8IChpZEEuY2Fub25pY2FsLnkgLSBpZEIuY2Fub25pY2FsLnkpIHx8IChpZEEud3JhcCAtIGlkQi53cmFwKSB8fCAoaWRBLmNhbm9uaWNhbC54IC0gaWRCLmNhbm9uaWNhbC54KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VSZW5kZXJlZEZlYXR1cmVMYXllcnModGlsZXMpIHtcbiAgICAvLyBNZXJnZSByZXN1bHRzIGZyb20gYWxsIHRpbGVzLCBidXQgaWYgdHdvIHRpbGVzIHNoYXJlIHRoZSBzYW1lXG4gICAgLy8gd3JhcHBlZCBJRCwgZG9uJ3QgZHVwbGljYXRlIGZlYXR1cmVzIGJldHdlZW4gdGhlIHR3byB0aWxlc1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IHdyYXBwZWRJRExheWVyTWFwID0ge307XG4gICAgZm9yIChjb25zdCB0aWxlIG9mIHRpbGVzKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UmVzdWx0cyA9IHRpbGUucXVlcnlSZXN1bHRzO1xuICAgICAgICBjb25zdCB3cmFwcGVkSUQgPSB0aWxlLndyYXBwZWRUaWxlSUQ7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRJRExheWVycyA9IHdyYXBwZWRJRExheWVyTWFwW3dyYXBwZWRJRF0gPSB3cmFwcGVkSURMYXllck1hcFt3cmFwcGVkSURdIHx8IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySUQgaW4gcXVlcnlSZXN1bHRzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlRmVhdHVyZXMgPSBxdWVyeVJlc3VsdHNbbGF5ZXJJRF07XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkSURGZWF0dXJlcyA9IHdyYXBwZWRJRExheWVyc1tsYXllcklEXSA9IHdyYXBwZWRJRExheWVyc1tsYXllcklEXSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEZlYXR1cmVzID0gcmVzdWx0W2xheWVySURdID0gcmVzdWx0W2xheWVySURdIHx8IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0aWxlRmVhdHVyZSBvZiB0aWxlRmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXdyYXBwZWRJREZlYXR1cmVzW3RpbGVGZWF0dXJlLmZlYXR1cmVJbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlZElERmVhdHVyZXNbdGlsZUZlYXR1cmUuZmVhdHVyZUluZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdEZlYXR1cmVzLnB1c2godGlsZUZlYXR1cmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi93aW5kb3cuanMnO1xuaW1wb3J0IG1hcGJveGdsIGZyb20gJy4uLy4uL2luZGV4LmpzJztcblxuaW1wb3J0IHR5cGUge1dvcmtlckludGVyZmFjZX0gZnJvbSAnLi4vd2ViX3dvcmtlci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpOiBXb3JrZXJJbnRlcmZhY2Uge1xuICAgIHJldHVybiAobWFwYm94Z2wud29ya2VyQ2xhc3MgIT0gbnVsbCkgPyBuZXcgbWFwYm94Z2wud29ya2VyQ2xhc3MoKSA6IChuZXcgd2luZG93LldvcmtlcihtYXBib3hnbC53b3JrZXJVcmwpOiBhbnkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBXZWJXb3JrZXIgZnJvbSAnLi93ZWJfd29ya2VyLmpzJztcbmltcG9ydCB0eXBlIHtXb3JrZXJJbnRlcmZhY2V9IGZyb20gJy4vd2ViX3dvcmtlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBQUkVMT0FEX1BPT0xfSUQgPSAnbWFwYm94Z2xfcHJlbG9hZGVkX3dvcmtlcl9wb29sJztcblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgd29ya2VyIHBvb2wuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXb3JrZXJQb29sIHtcbiAgICBzdGF0aWMgd29ya2VyQ291bnQ6IG51bWJlcjtcblxuICAgIGFjdGl2ZToge1tfOiBudW1iZXIgfCBzdHJpbmddOiBib29sZWFufTtcbiAgICB3b3JrZXJzOiBBcnJheTxXb3JrZXJJbnRlcmZhY2U+O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0ge307XG4gICAgfVxuXG4gICAgYWNxdWlyZShtYXBJZDogbnVtYmVyIHwgc3RyaW5nKTogQXJyYXk8V29ya2VySW50ZXJmYWNlPiB7XG4gICAgICAgIGlmICghdGhpcy53b3JrZXJzKSB7XG4gICAgICAgICAgICAvLyBMYXppbHkgbG9vayB1cCB0aGUgdmFsdWUgb2YgbWFwYm94Z2wud29ya2VyQ291bnQgc28gdGhhdFxuICAgICAgICAgICAgLy8gY2xpZW50IGNvZGUgaGFzIGhhZCBhIGNoYW5jZSB0byBzZXQgaXQuXG4gICAgICAgICAgICB0aGlzLndvcmtlcnMgPSBbXTtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLndvcmtlcnMubGVuZ3RoIDwgV29ya2VyUG9vbC53b3JrZXJDb3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMud29ya2Vycy5wdXNoKG5ldyBXZWJXb3JrZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGl2ZVttYXBJZF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy53b3JrZXJzLnNsaWNlKCk7XG4gICAgfVxuXG4gICAgcmVsZWFzZShtYXBJZDogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZVttYXBJZF07XG4gICAgICAgIGlmICh0aGlzLm51bUFjdGl2ZSgpID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgICAgICAgICAgIHcudGVybWluYXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMud29ya2VycyA9IChudWxsOiBhbnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNQcmVsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuYWN0aXZlW1BSRUxPQURfUE9PTF9JRF07XG4gICAgfVxuXG4gICAgbnVtQWN0aXZlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmFjdGl2ZSkubGVuZ3RoO1xuICAgIH1cbn1cblxuLy8gZXh0ZW5zaXZlIGJlbmNobWFya2luZyBzaG93ZWQgMiB0byBiZSB0aGUgYmVzdCBkZWZhdWx0IGZvciBib3RoIGRlc2t0b3AgYW5kIG1vYmlsZSBkZXZpY2VzO1xuLy8gd2UgY2FuJ3QgcmVseSBvbiBoYXJkd2FyZUNvbmN1cnJlbmN5IGJlY2F1c2Ugb2Ygd2lsZCBpbmNvbnNpc3RlbmN5IG9mIHJlcG9ydGVkIG51bWJlcnMgYmV0d2VlbiBicm93c2Vyc1xuV29ya2VyUG9vbC53b3JrZXJDb3VudCA9IDI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgV29ya2VyUG9vbCwge1BSRUxPQURfUE9PTF9JRH0gZnJvbSAnLi93b3JrZXJfcG9vbC5qcyc7XG5cbmxldCBnbG9iYWxXb3JrZXJQb29sO1xuXG4vKipcbiAqIENyZWF0ZXMgKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybnMgdGhlIHNpbmdsZSwgZ2xvYmFsIFdvcmtlclBvb2wgaW5zdGFuY2VcbiAqIHRvIGJlIHNoYXJlZCBhY3Jvc3MgZWFjaCBNYXBcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEdsb2JhbFdvcmtlclBvb2wgKCkge1xuICAgIGlmICghZ2xvYmFsV29ya2VyUG9vbCkge1xuICAgICAgICBnbG9iYWxXb3JrZXJQb29sID0gbmV3IFdvcmtlclBvb2woKTtcbiAgICB9XG4gICAgcmV0dXJuIGdsb2JhbFdvcmtlclBvb2w7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmV3YXJtKCkge1xuICAgIGNvbnN0IHdvcmtlclBvb2wgPSBnZXRHbG9iYWxXb3JrZXJQb29sKCk7XG4gICAgd29ya2VyUG9vbC5hY3F1aXJlKFBSRUxPQURfUE9PTF9JRCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclByZXdhcm1lZFJlc291cmNlcygpIHtcbiAgICBjb25zdCBwb29sID0gZ2xvYmFsV29ya2VyUG9vbDtcbiAgICBpZiAocG9vbCkge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHBvb2wgb25seSBpZiBhbGwgbWFwcyB0aGF0IHJlZmVyZW5jZWQgdGhlIHByZWxvYWRlZCBnbG9iYWwgd29ya2VyIHBvb2wgaGF2ZSBiZWVuIHJlbW92ZWQuXG4gICAgICAgIGlmIChwb29sLmlzUHJlbG9hZGVkKCkgJiYgcG9vbC5udW1BY3RpdmUoKSA9PT0gMSkge1xuICAgICAgICAgICAgcG9vbC5yZWxlYXNlKFBSRUxPQURfUE9PTF9JRCk7XG4gICAgICAgICAgICBnbG9iYWxXb3JrZXJQb29sID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGNsZWFyIFdlYldvcmtlcnMgc2luY2UgdGhlcmUgYXJlIGFjdGl2ZSBNYXAgaW5zdGFuY2VzIHRoYXQgc3RpbGwgcmVmZXJlbmNlIGl0LiBUaGUgcHJlLXdhcm1lZCBXZWJXb3JrZXIgcG9vbCBjYW4gb25seSBiZSBjbGVhcmVkIHdoZW4gYWxsIG1hcCBpbnN0YW5jZXMgaGF2ZSBiZWVuIHJlbW92ZWQgd2l0aCBtYXAucmVtb3ZlKCknKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIlxuaW1wb3J0IHJlZlByb3BlcnRpZXMgZnJvbSAnLi91dGlsL3JlZl9wcm9wZXJ0aWVzLmpzJztcblxuZnVuY3Rpb24gZGVyZWYobGF5ZXIsIHBhcmVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIGluIGxheWVyKSB7XG4gICAgICAgIGlmIChrICE9PSAncmVmJykge1xuICAgICAgICAgICAgcmVzdWx0W2tdID0gbGF5ZXJba107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWZQcm9wZXJ0aWVzLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgaWYgKGsgaW4gcGFyZW50KSB7XG4gICAgICAgICAgICByZXN1bHRba10gPSBwYXJlbnRba107XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlcmVmTGF5ZXJzO1xuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGxheWVycywgc29tZSBvZiB3aGljaCBtYXkgY29udGFpbiBgcmVmYCBwcm9wZXJ0aWVzXG4gKiB3aG9zZSB2YWx1ZSBpcyB0aGUgYGlkYCBvZiBhbm90aGVyIHByb3BlcnR5LCByZXR1cm4gYSBuZXcgYXJyYXkgd2hlcmVcbiAqIHN1Y2ggbGF5ZXJzIGhhdmUgYmVlbiBhdWdtZW50ZWQgd2l0aCB0aGUgJ3R5cGUnLCAnc291cmNlJywgZXRjLiBwcm9wZXJ0aWVzXG4gKiBmcm9tIHRoZSBwYXJlbnQgbGF5ZXIsIGFuZCB0aGUgYHJlZmAgcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqXG4gKiBUaGUgaW5wdXQgaXMgbm90IG1vZGlmaWVkLiBUaGUgb3V0cHV0IG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gcG9ydGlvbnNcbiAqIG9mIHRoZSBpbnB1dC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheTxMYXllcj59IGxheWVyc1xuICogQHJldHVybnMge0FycmF5PExheWVyPn1cbiAqL1xuZnVuY3Rpb24gZGVyZWZMYXllcnMobGF5ZXJzKSB7XG4gICAgbGF5ZXJzID0gbGF5ZXJzLnNsaWNlKCk7XG5cbiAgICBjb25zdCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1hcFtsYXllcnNbaV0uaWRdID0gbGF5ZXJzW2ldO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICgncmVmJyBpbiBsYXllcnNbaV0pIHtcbiAgICAgICAgICAgIGxheWVyc1tpXSA9IGRlcmVmKGxheWVyc1tpXSwgbWFwW2xheWVyc1tpXS5yZWZdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXllcnM7XG59XG4iLCJpbXBvcnQgbGF0ZXN0IGZyb20gJy4vcmVmZXJlbmNlL2xhdGVzdC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVtcHR5U3R5bGUoKSB7XG4gICAgY29uc3Qgc3R5bGUgPSB7fTtcblxuICAgIGNvbnN0IHZlcnNpb24gPSBsYXRlc3RbJyR2ZXJzaW9uJ107XG4gICAgZm9yIChjb25zdCBzdHlsZUtleSBpbiBsYXRlc3RbJyRyb290J10pIHtcbiAgICAgICAgY29uc3Qgc3BlYyA9IGxhdGVzdFsnJHJvb3QnXVtzdHlsZUtleV07XG5cbiAgICAgICAgaWYgKHNwZWMucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoc3R5bGVLZXkgPT09ICd2ZXJzaW9uJykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmVyc2lvbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwZWMudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN0eWxlW3N0eWxlS2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0eWxlO1xufVxuIiwiXG5pbXBvcnQgaXNFcXVhbCBmcm9tICcuL3V0aWwvZGVlcF9lcXVhbC5qcyc7XG5cbmNvbnN0IG9wZXJhdGlvbnMgPSB7XG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFN0eWxlJywgYXJnczogW3N0eWxlc2hlZXRdIH1cbiAgICAgKi9cbiAgICBzZXRTdHlsZTogJ3NldFN0eWxlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnYWRkTGF5ZXInLCBhcmdzOiBbbGF5ZXIsICdiZWZvcmVMYXllcklkJ10gfVxuICAgICAqL1xuICAgIGFkZExheWVyOiAnYWRkTGF5ZXInLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdyZW1vdmVMYXllcicsIGFyZ3M6IFsnbGF5ZXJJZCddIH1cbiAgICAgKi9cbiAgICByZW1vdmVMYXllcjogJ3JlbW92ZUxheWVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0UGFpbnRQcm9wZXJ0eScsIGFyZ3M6IFsnbGF5ZXJJZCcsICdwcm9wJywgdmFsdWVdIH1cbiAgICAgKi9cbiAgICBzZXRQYWludFByb3BlcnR5OiAnc2V0UGFpbnRQcm9wZXJ0eScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExheW91dFByb3BlcnR5JywgYXJnczogWydsYXllcklkJywgJ3Byb3AnLCB2YWx1ZV0gfVxuICAgICAqL1xuICAgIHNldExheW91dFByb3BlcnR5OiAnc2V0TGF5b3V0UHJvcGVydHknLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRGaWx0ZXInLCBhcmdzOiBbJ2xheWVySWQnLCBmaWx0ZXJdIH1cbiAgICAgKi9cbiAgICBzZXRGaWx0ZXI6ICdzZXRGaWx0ZXInLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdhZGRTb3VyY2UnLCBhcmdzOiBbJ3NvdXJjZUlkJywgc291cmNlXSB9XG4gICAgICovXG4gICAgYWRkU291cmNlOiAnYWRkU291cmNlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAncmVtb3ZlU291cmNlJywgYXJnczogWydzb3VyY2VJZCddIH1cbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2U6ICdyZW1vdmVTb3VyY2UnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRHZW9KU09OU291cmNlRGF0YScsIGFyZ3M6IFsnc291cmNlSWQnLCBkYXRhXSB9XG4gICAgICovXG4gICAgc2V0R2VvSlNPTlNvdXJjZURhdGE6ICdzZXRHZW9KU09OU291cmNlRGF0YScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExheWVyWm9vbVJhbmdlJywgYXJnczogWydsYXllcklkJywgMCwgMjJdIH1cbiAgICAgKi9cbiAgICBzZXRMYXllclpvb21SYW5nZTogJ3NldExheWVyWm9vbVJhbmdlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0TGF5ZXJQcm9wZXJ0eScsIGFyZ3M6IFsnbGF5ZXJJZCcsICdwcm9wJywgdmFsdWVdIH1cbiAgICAgKi9cbiAgICBzZXRMYXllclByb3BlcnR5OiAnc2V0TGF5ZXJQcm9wZXJ0eScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldENlbnRlcicsIGFyZ3M6IFtbbG9uLCBsYXRdXSB9XG4gICAgICovXG4gICAgc2V0Q2VudGVyOiAnc2V0Q2VudGVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0Wm9vbScsIGFyZ3M6IFt6b29tXSB9XG4gICAgICovXG4gICAgc2V0Wm9vbTogJ3NldFpvb20nLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRCZWFyaW5nJywgYXJnczogW2JlYXJpbmddIH1cbiAgICAgKi9cbiAgICBzZXRCZWFyaW5nOiAnc2V0QmVhcmluZycsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFBpdGNoJywgYXJnczogW3BpdGNoXSB9XG4gICAgICovXG4gICAgc2V0UGl0Y2g6ICdzZXRQaXRjaCcsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFNwcml0ZScsIGFyZ3M6IFsnc3ByaXRlVXJsJ10gfVxuICAgICAqL1xuICAgIHNldFNwcml0ZTogJ3NldFNwcml0ZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldEdseXBocycsIGFyZ3M6IFsnZ2x5cGhzVXJsJ10gfVxuICAgICAqL1xuICAgIHNldEdseXBoczogJ3NldEdseXBocycsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFRyYW5zaXRpb24nLCBhcmdzOiBbdHJhbnNpdGlvbl0gfVxuICAgICAqL1xuICAgIHNldFRyYW5zaXRpb246ICdzZXRUcmFuc2l0aW9uJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0TGlnaHRpbmcnLCBhcmdzOiBbbGlnaHRQcm9wZXJ0aWVzXSB9XG4gICAgICovXG4gICAgc2V0TGlnaHQ6ICdzZXRMaWdodCcsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFRlcnJhaW4nLCBhcmdzOiBbdGVycmFpblByb3BlcnRpZXNdIH1cbiAgICAgKi9cbiAgICBzZXRUZXJyYWluOiAnc2V0VGVycmFpbicsXG5cbiAgICAvKlxuICAgICAqICB7IGNvbW1hbmQ6ICdzZXRGb2cnLCBhcmdzOiBbZm9nUHJvcGVydGllc10gfVxuICAgICAqL1xuICAgIHNldEZvZzogJ3NldEZvZycsXG5cbiAgICAvKlxuICAgICAqICB7IGNvbW1hbmQ6ICdzZXRQcm9qZWN0aW9uJywgYXJnczogW3Byb2plY3Rpb25Qcm9wZXJ0aWVzXSB9XG4gICAgICovXG4gICAgc2V0UHJvamVjdGlvbjogJ3NldFByb2plY3Rpb24nXG59O1xuXG5mdW5jdGlvbiBhZGRTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcykge1xuICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuYWRkU291cmNlLCBhcmdzOiBbc291cmNlSWQsIGFmdGVyW3NvdXJjZUlkXV19KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU291cmNlKHNvdXJjZUlkLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpIHtcbiAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZVNvdXJjZSwgYXJnczogW3NvdXJjZUlkXX0pO1xuICAgIHNvdXJjZXNSZW1vdmVkW3NvdXJjZUlkXSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCkge1xuICAgIHJlbW92ZVNvdXJjZShzb3VyY2VJZCwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcbiAgICBhZGRTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcyk7XG59XG5cbmZ1bmN0aW9uIGNhblVwZGF0ZUdlb0pTT04oYmVmb3JlLCBhZnRlciwgc291cmNlSWQpIHtcbiAgICBsZXQgcHJvcDtcbiAgICBmb3IgKHByb3AgaW4gYmVmb3JlW3NvdXJjZUlkXSkge1xuICAgICAgICBpZiAoIWJlZm9yZVtzb3VyY2VJZF0uaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2RhdGEnICYmICFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF1bcHJvcF0sIGFmdGVyW3NvdXJjZUlkXVtwcm9wXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHByb3AgaW4gYWZ0ZXJbc291cmNlSWRdKSB7XG4gICAgICAgIGlmICghYWZ0ZXJbc291cmNlSWRdLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHByb3AgIT09ICdkYXRhJyAmJiAhaXNFcXVhbChiZWZvcmVbc291cmNlSWRdW3Byb3BdLCBhZnRlcltzb3VyY2VJZF1bcHJvcF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGRpZmZTb3VyY2VzKGJlZm9yZSwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCkge1xuICAgIGJlZm9yZSA9IGJlZm9yZSB8fCB7fTtcbiAgICBhZnRlciA9IGFmdGVyIHx8IHt9O1xuXG4gICAgbGV0IHNvdXJjZUlkO1xuXG4gICAgLy8gbG9vayBmb3Igc291cmNlcyB0byByZW1vdmVcbiAgICBmb3IgKHNvdXJjZUlkIGluIGJlZm9yZSkge1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgcmVtb3ZlU291cmNlKHNvdXJjZUlkLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9vayBmb3Igc291cmNlcyB0byBhZGQvdXBkYXRlXG4gICAgZm9yIChzb3VyY2VJZCBpbiBhZnRlcikge1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkgY29udGludWU7XG4gICAgICAgIGlmICghYmVmb3JlLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgYWRkU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMpO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF0sIGFmdGVyW3NvdXJjZUlkXSkpIHtcbiAgICAgICAgICAgIGlmIChiZWZvcmVbc291cmNlSWRdLnR5cGUgPT09ICdnZW9qc29uJyAmJiBhZnRlcltzb3VyY2VJZF0udHlwZSA9PT0gJ2dlb2pzb24nICYmIGNhblVwZGF0ZUdlb0pTT04oYmVmb3JlLCBhZnRlciwgc291cmNlSWQpKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRHZW9KU09OU291cmNlRGF0YSwgYXJnczogW3NvdXJjZUlkLCBhZnRlcltzb3VyY2VJZF0uZGF0YV19KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gdXBkYXRlIGNvbW1hbmQsIG11c3QgcmVtb3ZlIHRoZW4gYWRkXG4gICAgICAgICAgICAgICAgdXBkYXRlU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGJlZm9yZSwgYWZ0ZXIsIGNvbW1hbmRzLCBsYXllcklkLCBrbGFzcywgY29tbWFuZCkge1xuICAgIGJlZm9yZSA9IGJlZm9yZSB8fCB7fTtcbiAgICBhZnRlciA9IGFmdGVyIHx8IHt9O1xuXG4gICAgbGV0IHByb3A7XG5cbiAgICBmb3IgKHByb3AgaW4gYmVmb3JlKSB7XG4gICAgICAgIGlmICghYmVmb3JlLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZVtwcm9wXSwgYWZ0ZXJbcHJvcF0pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kLCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJbcHJvcF0sIGtsYXNzXX0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAocHJvcCBpbiBhZnRlcikge1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHByb3ApIHx8IGJlZm9yZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVbcHJvcF0sIGFmdGVyW3Byb3BdKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZCwgYXJnczogW2xheWVySWQsIHByb3AsIGFmdGVyW3Byb3BdLCBrbGFzc119KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGx1Y2tJZChsYXllcikge1xuICAgIHJldHVybiBsYXllci5pZDtcbn1cbmZ1bmN0aW9uIGluZGV4QnlJZChncm91cCwgbGF5ZXIpIHtcbiAgICBncm91cFtsYXllci5pZF0gPSBsYXllcjtcbiAgICByZXR1cm4gZ3JvdXA7XG59XG5cbmZ1bmN0aW9uIGRpZmZMYXllcnMoYmVmb3JlLCBhZnRlciwgY29tbWFuZHMpIHtcbiAgICBiZWZvcmUgPSBiZWZvcmUgfHwgW107XG4gICAgYWZ0ZXIgPSBhZnRlciB8fCBbXTtcblxuICAgIC8vIG9yZGVyIG9mIGxheWVycyBieSBpZFxuICAgIGNvbnN0IGJlZm9yZU9yZGVyID0gYmVmb3JlLm1hcChwbHVja0lkKTtcbiAgICBjb25zdCBhZnRlck9yZGVyID0gYWZ0ZXIubWFwKHBsdWNrSWQpO1xuXG4gICAgLy8gaW5kZXggb2YgbGF5ZXIgYnkgaWRcbiAgICBjb25zdCBiZWZvcmVJbmRleCA9IGJlZm9yZS5yZWR1Y2UoaW5kZXhCeUlkLCB7fSk7XG4gICAgY29uc3QgYWZ0ZXJJbmRleCA9IGFmdGVyLnJlZHVjZShpbmRleEJ5SWQsIHt9KTtcblxuICAgIC8vIHRyYWNrIG9yZGVyIG9mIGxheWVycyBhcyBpZiB0aGV5IGhhdmUgYmVlbiBtdXRhdGVkXG4gICAgY29uc3QgdHJhY2tlciA9IGJlZm9yZU9yZGVyLnNsaWNlKCk7XG5cbiAgICAvLyBsYXllcnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgZG8gbm90IG5lZWQgdG8gYmUgZGlmZmVkXG4gICAgY29uc3QgY2xlYW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgbGV0IGksIGQsIGxheWVySWQsIGJlZm9yZUxheWVyLCBhZnRlckxheWVyLCBpbnNlcnRCZWZvcmVMYXllcklkLCBwcm9wO1xuXG4gICAgLy8gcmVtb3ZlIGxheWVyc1xuICAgIGZvciAoaSA9IDAsIGQgPSAwOyBpIDwgYmVmb3JlT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGF5ZXJJZCA9IGJlZm9yZU9yZGVyW2ldO1xuICAgICAgICBpZiAoIWFmdGVySW5kZXguaGFzT3duUHJvcGVydHkobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXX0pO1xuICAgICAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5pbmRleE9mKGxheWVySWQsIGQpLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxpbWl0IHdoZXJlIGluIHRyYWNrZXIgd2UgbmVlZCB0byBsb29rIGZvciBhIG1hdGNoXG4gICAgICAgICAgICBkKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhZGQvcmVvcmRlciBsYXllcnNcbiAgICBmb3IgKGkgPSAwLCBkID0gMDsgaSA8IGFmdGVyT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gd29yayBiYWNrd2FyZHMgYXMgaW5zZXJ0IGlzIGJlZm9yZSBhbiBleGlzdGluZyBsYXllclxuICAgICAgICBsYXllcklkID0gYWZ0ZXJPcmRlclthZnRlck9yZGVyLmxlbmd0aCAtIDEgLSBpXTtcblxuICAgICAgICBpZiAodHJhY2tlclt0cmFja2VyLmxlbmd0aCAtIDEgLSBpXSA9PT0gbGF5ZXJJZCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKGJlZm9yZUluZGV4Lmhhc093blByb3BlcnR5KGxheWVySWQpKSB7XG4gICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxheWVyIGJlZm9yZSB3ZSBpbnNlcnQgYXQgdGhlIGNvcnJlY3QgcG9zaXRpb25cbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXX0pO1xuICAgICAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5sYXN0SW5kZXhPZihsYXllcklkLCB0cmFja2VyLmxlbmd0aCAtIGQpLCAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxpbWl0IHdoZXJlIGluIHRyYWNrZXIgd2UgbmVlZCB0byBsb29rIGZvciBhIG1hdGNoXG4gICAgICAgICAgICBkKys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgbGF5ZXIgYXQgY29ycmVjdCBwb3NpdGlvblxuICAgICAgICBpbnNlcnRCZWZvcmVMYXllcklkID0gdHJhY2tlclt0cmFja2VyLmxlbmd0aCAtIGldO1xuICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLmFkZExheWVyLCBhcmdzOiBbYWZ0ZXJJbmRleFtsYXllcklkXSwgaW5zZXJ0QmVmb3JlTGF5ZXJJZF19KTtcbiAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5sZW5ndGggLSBpLCAwLCBsYXllcklkKTtcbiAgICAgICAgY2xlYW5bbGF5ZXJJZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBsYXllcnNcbiAgICBmb3IgKGkgPSAwOyBpIDwgYWZ0ZXJPcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsYXllcklkID0gYWZ0ZXJPcmRlcltpXTtcbiAgICAgICAgYmVmb3JlTGF5ZXIgPSBiZWZvcmVJbmRleFtsYXllcklkXTtcbiAgICAgICAgYWZ0ZXJMYXllciA9IGFmdGVySW5kZXhbbGF5ZXJJZF07XG5cbiAgICAgICAgLy8gbm8gbmVlZCB0byB1cGRhdGUgaWYgcHJldmlvdXNseSBhZGRlZCAobmV3IG9yIG1vdmVkKVxuICAgICAgICBpZiAoY2xlYW5bbGF5ZXJJZF0gfHwgaXNFcXVhbChiZWZvcmVMYXllciwgYWZ0ZXJMYXllcikpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIElmIHNvdXJjZSwgc291cmNlLWxheWVyLCBvciB0eXBlIGhhdmUgY2hhbmdlcywgdGhlbiByZW1vdmUgdGhlIGxheWVyXG4gICAgICAgIC8vIGFuZCBhZGQgaXQgYmFjayAnZnJvbSBzY3JhdGNoJy5cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZUxheWVyLnNvdXJjZSwgYWZ0ZXJMYXllci5zb3VyY2UpIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyWydzb3VyY2UtbGF5ZXInXSwgYWZ0ZXJMYXllclsnc291cmNlLWxheWVyJ10pIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyLnR5cGUsIGFmdGVyTGF5ZXIudHlwZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXX0pO1xuICAgICAgICAgICAgLy8gd2UgYWRkIHRoZSBsYXllciBiYWNrIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGl0IHdhcyBhbHJlYWR5IGluLCBzb1xuICAgICAgICAgICAgLy8gdGhlcmUncyBubyBuZWVkIHRvIHVwZGF0ZSB0aGUgYHRyYWNrZXJgXG4gICAgICAgICAgICBpbnNlcnRCZWZvcmVMYXllcklkID0gdHJhY2tlclt0cmFja2VyLmxhc3RJbmRleE9mKGxheWVySWQpICsgMV07XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLmFkZExheWVyLCBhcmdzOiBbYWZ0ZXJMYXllciwgaW5zZXJ0QmVmb3JlTGF5ZXJJZF19KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGF5b3V0LCBwYWludCwgZmlsdGVyLCBtaW56b29tLCBtYXh6b29tXG4gICAgICAgIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmVMYXllci5sYXlvdXQsIGFmdGVyTGF5ZXIubGF5b3V0LCBjb21tYW5kcywgbGF5ZXJJZCwgbnVsbCwgb3BlcmF0aW9ucy5zZXRMYXlvdXRQcm9wZXJ0eSk7XG4gICAgICAgIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmVMYXllci5wYWludCwgYWZ0ZXJMYXllci5wYWludCwgY29tbWFuZHMsIGxheWVySWQsIG51bGwsIG9wZXJhdGlvbnMuc2V0UGFpbnRQcm9wZXJ0eSk7XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVMYXllci5maWx0ZXIsIGFmdGVyTGF5ZXIuZmlsdGVyKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRGaWx0ZXIsIGFyZ3M6IFtsYXllcklkLCBhZnRlckxheWVyLmZpbHRlcl19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIubWluem9vbSwgYWZ0ZXJMYXllci5taW56b29tKSB8fCAhaXNFcXVhbChiZWZvcmVMYXllci5tYXh6b29tLCBhZnRlckxheWVyLm1heHpvb20pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyWm9vbVJhbmdlLCBhcmdzOiBbbGF5ZXJJZCwgYWZ0ZXJMYXllci5taW56b29tLCBhZnRlckxheWVyLm1heHpvb21dfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBoYW5kbGUgYWxsIG90aGVyIGxheWVyIHByb3BzLCBpbmNsdWRpbmcgcGFpbnQuKlxuICAgICAgICBmb3IgKHByb3AgaW4gYmVmb3JlTGF5ZXIpIHtcbiAgICAgICAgICAgIGlmICghYmVmb3JlTGF5ZXIuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdsYXlvdXQnIHx8IHByb3AgPT09ICdwYWludCcgfHwgcHJvcCA9PT0gJ2ZpbHRlcicgfHxcbiAgICAgICAgICAgICAgICBwcm9wID09PSAnbWV0YWRhdGEnIHx8IHByb3AgPT09ICdtaW56b29tJyB8fCBwcm9wID09PSAnbWF4em9vbScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AuaW5kZXhPZigncGFpbnQuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0sIGNvbW1hbmRzLCBsYXllcklkLCBwcm9wLnNsaWNlKDYpLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNFcXVhbChiZWZvcmVMYXllcltwcm9wXSwgYWZ0ZXJMYXllcltwcm9wXSkpIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyUHJvcGVydHksIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlckxheWVyW3Byb3BdXX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocHJvcCBpbiBhZnRlckxheWVyKSB7XG4gICAgICAgICAgICBpZiAoIWFmdGVyTGF5ZXIuaGFzT3duUHJvcGVydHkocHJvcCkgfHwgYmVmb3JlTGF5ZXIuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdsYXlvdXQnIHx8IHByb3AgPT09ICdwYWludCcgfHwgcHJvcCA9PT0gJ2ZpbHRlcicgfHxcbiAgICAgICAgICAgICAgICBwcm9wID09PSAnbWV0YWRhdGEnIHx8IHByb3AgPT09ICdtaW56b29tJyB8fCBwcm9wID09PSAnbWF4em9vbScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHByb3AuaW5kZXhPZigncGFpbnQuJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0sIGNvbW1hbmRzLCBsYXllcklkLCBwcm9wLnNsaWNlKDYpLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNFcXVhbChiZWZvcmVMYXllcltwcm9wXSwgYWZ0ZXJMYXllcltwcm9wXSkpIHtcbiAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyUHJvcGVydHksIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlckxheWVyW3Byb3BdXX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIERpZmYgdHdvIHN0eWxlc2hlZXRcbiAqXG4gKiBDcmVhdGVzIHNlbWFudGljbHkgYXdhcmUgZGlmZnMgdGhhdCBjYW4gZWFzaWx5IGJlIGFwcGxpZWQgYXQgcnVudGltZS5cbiAqIE9wZXJhdGlvbnMgcHJvZHVjZWQgYnkgdGhlIGRpZmYgY2xvc2VseSByZXNlbWJsZSB0aGUgbWFwYm94LWdsLWpzIEFQSS4gQW55XG4gKiBlcnJvciBjcmVhdGluZyB0aGUgZGlmZiB3aWxsIGZhbGwgYmFjayB0byB0aGUgJ3NldFN0eWxlJyBvcGVyYXRpb24uXG4gKlxuICogRXhhbXBsZSBkaWZmOlxuICogW1xuICogICAgIHsgY29tbWFuZDogJ3NldENvbnN0YW50JywgYXJnczogWydAd2F0ZXInLCAnIzAwMDBGRiddIH0sXG4gKiAgICAgeyBjb21tYW5kOiAnc2V0UGFpbnRQcm9wZXJ0eScsIGFyZ3M6IFsnYmFja2dyb3VuZCcsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2JsYWNrJ10gfVxuICogXVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IFtiZWZvcmVdIHN0eWxlc2hlZXQgdG8gY29tcGFyZSBmcm9tXG4gKiBAcGFyYW0geyp9IGFmdGVyIHN0eWxlc2hlZXQgdG8gY29tcGFyZSB0b1xuICogQHJldHVybnMgQXJyYXkgbGlzdCBvZiBjaGFuZ2VzXG4gKi9cbmZ1bmN0aW9uIGRpZmZTdHlsZXMoYmVmb3JlLCBhZnRlcikge1xuICAgIGlmICghYmVmb3JlKSByZXR1cm4gW3tjb21tYW5kOiBvcGVyYXRpb25zLnNldFN0eWxlLCBhcmdzOiBbYWZ0ZXJdfV07XG5cbiAgICBsZXQgY29tbWFuZHMgPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2VzIHRvIHRvcC1sZXZlbCBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUudmVyc2lvbiwgYWZ0ZXIudmVyc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBbe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0U3R5bGUsIGFyZ3M6IFthZnRlcl19XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmNlbnRlciwgYWZ0ZXIuY2VudGVyKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRDZW50ZXIsIGFyZ3M6IFthZnRlci5jZW50ZXJdfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS56b29tLCBhZnRlci56b29tKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRab29tLCBhcmdzOiBbYWZ0ZXIuem9vbV19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmJlYXJpbmcsIGFmdGVyLmJlYXJpbmcpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldEJlYXJpbmcsIGFyZ3M6IFthZnRlci5iZWFyaW5nXX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUucGl0Y2gsIGFmdGVyLnBpdGNoKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRQaXRjaCwgYXJnczogW2FmdGVyLnBpdGNoXX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUuc3ByaXRlLCBhZnRlci5zcHJpdGUpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldFNwcml0ZSwgYXJnczogW2FmdGVyLnNwcml0ZV19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmdseXBocywgYWZ0ZXIuZ2x5cGhzKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRHbHlwaHMsIGFyZ3M6IFthZnRlci5nbHlwaHNdfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS50cmFuc2l0aW9uLCBhZnRlci50cmFuc2l0aW9uKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRUcmFuc2l0aW9uLCBhcmdzOiBbYWZ0ZXIudHJhbnNpdGlvbl19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmxpZ2h0LCBhZnRlci5saWdodCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0TGlnaHQsIGFyZ3M6IFthZnRlci5saWdodF19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmZvZywgYWZ0ZXIuZm9nKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRGb2csIGFyZ3M6IFthZnRlci5mb2ddfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5wcm9qZWN0aW9uLCBhZnRlci5wcm9qZWN0aW9uKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRQcm9qZWN0aW9uLCBhcmdzOiBbYWZ0ZXIucHJvamVjdGlvbl19KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2VzIHRvIGBzb3VyY2VzYFxuICAgICAgICAvLyBJZiBhIHNvdXJjZSBpcyB0byBiZSByZW1vdmVkLCB3ZSBhbHNvLS1iZWZvcmUgdGhlIHJlbW92ZVNvdXJjZVxuICAgICAgICAvLyBjb21tYW5kLS1uZWVkIHRvIHJlbW92ZSBhbGwgdGhlIHN0eWxlIGxheWVycyB0aGF0IGRlcGVuZCBvbiBpdC5cbiAgICAgICAgY29uc3Qgc291cmNlc1JlbW92ZWQgPSB7fTtcblxuICAgICAgICAvLyBGaXJzdCBjb2xsZWN0IHRoZSB7YWRkLHJlbW92ZX1Tb3VyY2UgY29tbWFuZHNcbiAgICAgICAgY29uc3QgcmVtb3ZlT3JBZGRTb3VyY2VDb21tYW5kcyA9IFtdO1xuICAgICAgICBkaWZmU291cmNlcyhiZWZvcmUuc291cmNlcywgYWZ0ZXIuc291cmNlcywgcmVtb3ZlT3JBZGRTb3VyY2VDb21tYW5kcywgc291cmNlc1JlbW92ZWQpO1xuXG4gICAgICAgIC8vIFB1c2ggYSByZW1vdmVMYXllciBjb21tYW5kIGZvciBlYWNoIHN0eWxlIGxheWVyIHRoYXQgZGVwZW5kcyBvbiBhXG4gICAgICAgIC8vIHNvdXJjZSB0aGF0J3MgYmVpbmcgcmVtb3ZlZC5cbiAgICAgICAgLy8gQWxzbywgZXhjbHVkZSBhbnkgc3VjaCBsYXllcnMgdGhlbSBmcm9tIHRoZSBpbnB1dCB0byBgZGlmZkxheWVyc2BcbiAgICAgICAgLy8gYmVsb3csIHNvIHRoYXQgZGlmZkxheWVycyBwcm9kdWNlcyB0aGUgYXBwcm9wcmlhdGUgYGFkZExheWVyc2BcbiAgICAgICAgLy8gY29tbWFuZFxuICAgICAgICBjb25zdCBiZWZvcmVMYXllcnMgPSBbXTtcbiAgICAgICAgaWYgKGJlZm9yZS5sYXllcnMpIHtcbiAgICAgICAgICAgIGJlZm9yZS5sYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlc1JlbW92ZWRbbGF5ZXIuc291cmNlXSkge1xuICAgICAgICAgICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXIuaWRdfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlTGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0ZXJyYWluIGlmIHRoZSBzb3VyY2UgZm9yIHRoYXQgdGVycmFpbiBpcyBiZWluZyByZW1vdmVkXG4gICAgICAgIGxldCBiZWZvcmVUZXJyYWluID0gYmVmb3JlLnRlcnJhaW47XG4gICAgICAgIGlmIChiZWZvcmVUZXJyYWluKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlc1JlbW92ZWRbYmVmb3JlVGVycmFpbi5zb3VyY2VdKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRUZXJyYWluLCBhcmdzOiBbdW5kZWZpbmVkXX0pO1xuICAgICAgICAgICAgICAgIGJlZm9yZVRlcnJhaW4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb21tYW5kcyA9IGNvbW1hbmRzLmNvbmNhdChyZW1vdmVPckFkZFNvdXJjZUNvbW1hbmRzKTtcblxuICAgICAgICAvLyBFdmVuIHRob3VnaCB0ZXJyYWluIGlzIGEgdG9wLWxldmVsIHByb3BlcnR5XG4gICAgICAgIC8vIEl0cyBsaWtlIGEgbGF5ZXIgaW4gdGhlIHNlbnNlIHRoYXQgaXQgZGVwZW5kcyBvbiBhIHNvdXJjZSBiZWluZyBwcmVzZW50LlxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlVGVycmFpbiwgYWZ0ZXIudGVycmFpbikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0VGVycmFpbiwgYXJnczogW2FmdGVyLnRlcnJhaW5dfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byBgbGF5ZXJzYFxuICAgICAgICBkaWZmTGF5ZXJzKGJlZm9yZUxheWVycywgYWZ0ZXIubGF5ZXJzLCBjb21tYW5kcyk7XG5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGZhbGwgYmFjayB0byBzZXRTdHlsZVxuICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBjb21wdXRlIHN0eWxlIGRpZmY6JywgZSk7XG4gICAgICAgIGNvbW1hbmRzID0gW3tjb21tYW5kOiBvcGVyYXRpb25zLnNldFN0eWxlLCBhcmdzOiBbYWZ0ZXJdfV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1hbmRzO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaWZmU3R5bGVzO1xuZXhwb3J0IHtvcGVyYXRpb25zfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Y2xhbXB9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmNsYXNzIFBhdGhJbnRlcnBvbGF0b3Ige1xuICAgIHBvaW50czogQXJyYXk8UG9pbnQ+O1xuICAgIGxlbmd0aDogbnVtYmVyO1xuICAgIHBhZGRlZExlbmd0aDogbnVtYmVyO1xuICAgIHBhZGRpbmc6IG51bWJlcjtcbiAgICBfZGlzdGFuY2VzOiBBcnJheTxudW1iZXI+O1xuXG4gICAgY29uc3RydWN0b3IocG9pbnRzXzogP0FycmF5PFBvaW50PiwgcGFkZGluZ186ID9udW1iZXIpIHtcbiAgICAgICAgdGhpcy5yZXNldChwb2ludHNfLCBwYWRkaW5nXyk7XG4gICAgfVxuXG4gICAgcmVzZXQocG9pbnRzXzogP0FycmF5PFBvaW50PiwgcGFkZGluZ186ID9udW1iZXIpIHtcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHNfIHx8IFtdO1xuXG4gICAgICAgIC8vIENvbXB1dGUgY3VtdWxhdGl2ZSBkaXN0YW5jZSBmcm9tIGZpcnN0IHBvaW50IHRvIGV2ZXJ5IG90aGVyIHBvaW50IGluIHRoZSBzZWdtZW50LlxuICAgICAgICAvLyBMYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0b3RhbCBsZW5ndGggb2YgdGhlIHBhdGhcbiAgICAgICAgdGhpcy5fZGlzdGFuY2VzID0gWzAuMF07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fZGlzdGFuY2VzW2ldID0gdGhpcy5fZGlzdGFuY2VzW2kgLSAxXSArIHRoaXMucG9pbnRzW2ldLmRpc3QodGhpcy5wb2ludHNbaSAtIDFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5fZGlzdGFuY2VzW3RoaXMuX2Rpc3RhbmNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdGhpcy5wYWRkaW5nID0gTWF0aC5taW4ocGFkZGluZ18gfHwgMCwgdGhpcy5sZW5ndGggKiAwLjUpO1xuICAgICAgICB0aGlzLnBhZGRlZExlbmd0aCA9IHRoaXMubGVuZ3RoIC0gdGhpcy5wYWRkaW5nICogMi4wO1xuICAgIH1cblxuICAgIGxlcnAodDogbnVtYmVyKTogUG9pbnQge1xuICAgICAgICBhc3NlcnQodGhpcy5wb2ludHMubGVuZ3RoID4gMCk7XG4gICAgICAgIGlmICh0aGlzLnBvaW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvaW50c1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHQgPSBjbGFtcCh0LCAwLCAxKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBjb3JyZWN0IHNlZ21lbnQgW3AwLCBwMV0gd2hlcmUgcDAgPD0geCA8IHAxXG4gICAgICAgIGxldCBjdXJyZW50SW5kZXggPSAxO1xuICAgICAgICBsZXQgZGlzdE9mQ3VycmVudElkeCA9IHRoaXMuX2Rpc3RhbmNlc1tjdXJyZW50SW5kZXhdO1xuICAgICAgICBjb25zdCBkaXN0VG9UYXJnZXQgPSB0ICogdGhpcy5wYWRkZWRMZW5ndGggKyB0aGlzLnBhZGRpbmc7XG5cbiAgICAgICAgd2hpbGUgKGRpc3RPZkN1cnJlbnRJZHggPCBkaXN0VG9UYXJnZXQgJiYgY3VycmVudEluZGV4IDwgdGhpcy5fZGlzdGFuY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGlzdE9mQ3VycmVudElkeCA9IHRoaXMuX2Rpc3RhbmNlc1srK2N1cnJlbnRJbmRleF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZSB0d28gcG9pbnRzIG9mIHRoZSBzZWdtZW50XG4gICAgICAgIGNvbnN0IGlkeE9mUHJldlBvaW50ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgY29uc3QgZGlzdE9mUHJldklkeCA9IHRoaXMuX2Rpc3RhbmNlc1tpZHhPZlByZXZQb2ludF07XG4gICAgICAgIGNvbnN0IHNlZ21lbnRMZW5ndGggPSBkaXN0T2ZDdXJyZW50SWR4IC0gZGlzdE9mUHJldklkeDtcbiAgICAgICAgY29uc3Qgc2VnbWVudFQgPSBzZWdtZW50TGVuZ3RoID4gMCA/IChkaXN0VG9UYXJnZXQgLSBkaXN0T2ZQcmV2SWR4KSAvIHNlZ21lbnRMZW5ndGggOiAwO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50c1tpZHhPZlByZXZQb2ludF0ubXVsdCgxLjAgLSBzZWdtZW50VCkuYWRkKHRoaXMucG9pbnRzW2N1cnJlbnRJbmRleF0ubXVsdChzZWdtZW50VCkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGF0aEludGVycG9sYXRvcjtcbiIsIi8vIEBmbG93XG5cbi8qKlxuICogR3JpZEluZGV4IGlzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRlc3RpbmcgdGhlIGludGVyc2VjdGlvbiBvZlxuICogY2lyY2xlcyBhbmQgcmVjdGFuZ2xlcyBpbiBhIDJkIHBsYW5lLlxuICogSXQgaXMgb3B0aW1pemVkIGZvciByYXBpZCBpbnNlcnRpb24gYW5kIHF1ZXJ5aW5nLlxuICogR3JpZEluZGV4IHNwbGl0cyB0aGUgcGxhbmUgaW50byBhIHNldCBvZiBcImNlbGxzXCIgYW5kIGtlZXBzIHRyYWNrXG4gKiBvZiB3aGljaCBnZW9tZXRyaWVzIGludGVyc2VjdCB3aXRoIGVhY2ggY2VsbC4gQXQgcXVlcnkgdGltZSxcbiAqIGZ1bGwgZ2VvbWV0cnkgY29tcGFyaXNvbnMgYXJlIG9ubHkgZG9uZSBmb3IgaXRlbXMgdGhhdCBzaGFyZVxuICogYXQgbGVhc3Qgb25lIGNlbGwuIEFzIGxvbmcgYXMgdGhlIGdlb21ldHJpZXMgYXJlIHJlbGF0aXZlbHlcbiAqIHVuaWZvcm1seSBkaXN0cmlidXRlZCBhY3Jvc3MgdGhlIHBsYW5lLCB0aGlzIGdyZWF0bHkgcmVkdWNlc1xuICogdGhlIG51bWJlciBvZiBjb21wYXJpc29ucyBuZWNlc3NhcnkuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgR3JpZEluZGV4IHtcbiAgICBjaXJjbGVLZXlzOiBBcnJheTxhbnk+O1xuICAgIGJveEtleXM6IEFycmF5PGFueT47XG4gICAgYm94Q2VsbHM6IEFycmF5PEFycmF5PG51bWJlcj4+O1xuICAgIGNpcmNsZUNlbGxzOiBBcnJheTxBcnJheTxudW1iZXI+PjtcbiAgICBiYm94ZXM6IEFycmF5PG51bWJlcj47XG4gICAgY2lyY2xlczogQXJyYXk8bnVtYmVyPjtcbiAgICB4Q2VsbENvdW50OiBudW1iZXI7XG4gICAgeUNlbGxDb3VudDogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgeFNjYWxlOiBudW1iZXI7XG4gICAgeVNjYWxlOiBudW1iZXI7XG4gICAgYm94VWlkOiBudW1iZXI7XG4gICAgY2lyY2xlVWlkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvciAod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGNlbGxTaXplOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgYm94Q2VsbHMgPSB0aGlzLmJveENlbGxzID0gW107XG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbGxzID0gdGhpcy5jaXJjbGVDZWxscyA9IFtdO1xuXG4gICAgICAgIC8vIE1vcmUgY2VsbHMgLT4gZmV3ZXIgZ2VvbWV0cmllcyB0byBjaGVjayBwZXIgY2VsbCwgYnV0IGl0ZW1zIHRlbmRcbiAgICAgICAgLy8gdG8gYmUgc3BsaXQgYWNyb3NzIG1vcmUgY2VsbHMuXG4gICAgICAgIC8vIFN3ZWV0IHNwb3QgYWxsb3dzIG1vc3Qgc21hbGwgaXRlbXMgdG8gZml0IGluIG9uZSBjZWxsXG4gICAgICAgIHRoaXMueENlbGxDb3VudCA9IE1hdGguY2VpbCh3aWR0aCAvIGNlbGxTaXplKTtcbiAgICAgICAgdGhpcy55Q2VsbENvdW50ID0gTWF0aC5jZWlsKGhlaWdodCAvIGNlbGxTaXplKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMueENlbGxDb3VudCAqIHRoaXMueUNlbGxDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBib3hDZWxscy5wdXNoKFtdKTtcbiAgICAgICAgICAgIGNpcmNsZUNlbGxzLnB1c2goW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2lyY2xlS2V5cyA9IFtdO1xuICAgICAgICB0aGlzLmJveEtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5iYm94ZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jaXJjbGVzID0gW107XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy54U2NhbGUgPSB0aGlzLnhDZWxsQ291bnQgLyB3aWR0aDtcbiAgICAgICAgdGhpcy55U2NhbGUgPSB0aGlzLnlDZWxsQ291bnQgLyBoZWlnaHQ7XG4gICAgICAgIHRoaXMuYm94VWlkID0gMDtcbiAgICAgICAgdGhpcy5jaXJjbGVVaWQgPSAwO1xuICAgIH1cblxuICAgIGtleXNMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJveEtleXMubGVuZ3RoICsgdGhpcy5jaXJjbGVLZXlzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBpbnNlcnQoa2V5OiBhbnksIHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fZm9yRWFjaENlbGwoeDEsIHkxLCB4MiwgeTIsIHRoaXMuX2luc2VydEJveENlbGwsIHRoaXMuYm94VWlkKyspO1xuICAgICAgICB0aGlzLmJveEtleXMucHVzaChrZXkpO1xuICAgICAgICB0aGlzLmJib3hlcy5wdXNoKHgxKTtcbiAgICAgICAgdGhpcy5iYm94ZXMucHVzaCh5MSk7XG4gICAgICAgIHRoaXMuYmJveGVzLnB1c2goeDIpO1xuICAgICAgICB0aGlzLmJib3hlcy5wdXNoKHkyKTtcbiAgICB9XG5cbiAgICBpbnNlcnRDaXJjbGUoa2V5OiBhbnksIHg6IG51bWJlciwgeTogbnVtYmVyLCByYWRpdXM6IG51bWJlcikge1xuICAgICAgICAvLyBJbnNlcnQgY2lyY2xlIGludG8gZ3JpZCBmb3IgYWxsIGNlbGxzIGluIHRoZSBjaXJjdW1zY3JpYmluZyBzcXVhcmVcbiAgICAgICAgLy8gSXQncyBtb3JlIHRoYW4gbmVjZXNzYXJ5IChieSBhIGZhY3RvciBvZiA0L1BJKSwgYnV0IGZhc3QgdG8gaW5zZXJ0XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHggLSByYWRpdXMsIHkgLSByYWRpdXMsIHggKyByYWRpdXMsIHkgKyByYWRpdXMsIHRoaXMuX2luc2VydENpcmNsZUNlbGwsIHRoaXMuY2lyY2xlVWlkKyspO1xuICAgICAgICB0aGlzLmNpcmNsZUtleXMucHVzaChrZXkpO1xuICAgICAgICB0aGlzLmNpcmNsZXMucHVzaCh4KTtcbiAgICAgICAgdGhpcy5jaXJjbGVzLnB1c2goeSk7XG4gICAgICAgIHRoaXMuY2lyY2xlcy5wdXNoKHJhZGl1cyk7XG4gICAgfVxuXG4gICAgX2luc2VydEJveENlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHVpZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuYm94Q2VsbHNbY2VsbEluZGV4XS5wdXNoKHVpZCk7XG4gICAgfVxuXG4gICAgX2luc2VydENpcmNsZUNlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHVpZDogbnVtYmVyKSAge1xuICAgICAgICB0aGlzLmNpcmNsZUNlbGxzW2NlbGxJbmRleF0ucHVzaCh1aWQpO1xuICAgIH1cblxuICAgIF9xdWVyeSh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBoaXRUZXN0OiBib29sZWFuLCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgaWYgKHgyIDwgMCB8fCB4MSA+IHRoaXMud2lkdGggfHwgeTIgPCAwIHx8IHkxID4gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiBoaXRUZXN0ID8gZmFsc2UgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKHgxIDw9IDAgJiYgeTEgPD0gMCAmJiB0aGlzLndpZHRoIDw9IHgyICYmIHRoaXMuaGVpZ2h0IDw9IHkyKSB7XG4gICAgICAgICAgICBpZiAoaGl0VGVzdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgYm94VWlkID0gMDsgYm94VWlkIDwgdGhpcy5ib3hLZXlzLmxlbmd0aDsgYm94VWlkKyspIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogdGhpcy5ib3hLZXlzW2JveFVpZF0sXG4gICAgICAgICAgICAgICAgICAgIHgxOiB0aGlzLmJib3hlc1tib3hVaWQgKiA0XSxcbiAgICAgICAgICAgICAgICAgICAgeTE6IHRoaXMuYmJveGVzW2JveFVpZCAqIDQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgeDI6IHRoaXMuYmJveGVzW2JveFVpZCAqIDQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgeTI6IHRoaXMuYmJveGVzW2JveFVpZCAqIDQgKyAzXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgY2lyY2xlVWlkID0gMDsgY2lyY2xlVWlkIDwgdGhpcy5jaXJjbGVLZXlzLmxlbmd0aDsgY2lyY2xlVWlkKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gdGhpcy5jaXJjbGVzW2NpcmNsZVVpZCAqIDNdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSB0aGlzLmNpcmNsZXNbY2lyY2xlVWlkICogMyArIDFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IHRoaXMuY2lyY2xlc1tjaXJjbGVVaWQgKiAzICsgMl07XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdLFxuICAgICAgICAgICAgICAgICAgICB4MTogeCAtIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgeTE6IHkgLSByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgIHgyOiB4ICsgcmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICB5MjogeSArIHJhZGl1c1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZSA/IHJlc3VsdC5maWx0ZXIocHJlZGljYXRlKSA6IHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5QXJncyA9IHtcbiAgICAgICAgICAgICAgICBoaXRUZXN0LFxuICAgICAgICAgICAgICAgIHNlZW5VaWRzOiB7Ym94OiB7fSwgY2lyY2xlOiB7fX1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9mb3JFYWNoQ2VsbCh4MSwgeTEsIHgyLCB5MiwgdGhpcy5fcXVlcnlDZWxsLCByZXN1bHQsIHF1ZXJ5QXJncywgcHJlZGljYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBoaXRUZXN0ID8gcmVzdWx0Lmxlbmd0aCA+IDAgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcXVlcnlDaXJjbGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIHJhZGl1czogbnVtYmVyLCBoaXRUZXN0OiBib29sZWFuLCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgLy8gSW5zZXJ0IGNpcmNsZSBpbnRvIGdyaWQgZm9yIGFsbCBjZWxscyBpbiB0aGUgY2lyY3Vtc2NyaWJpbmcgc3F1YXJlXG4gICAgICAgIC8vIEl0J3MgbW9yZSB0aGFuIG5lY2Vzc2FyeSAoYnkgYSBmYWN0b3Igb2YgNC9QSSksIGJ1dCBmYXN0IHRvIGluc2VydFxuICAgICAgICBjb25zdCB4MSA9IHggLSByYWRpdXM7XG4gICAgICAgIGNvbnN0IHgyID0geCArIHJhZGl1cztcbiAgICAgICAgY29uc3QgeTEgPSB5IC0gcmFkaXVzO1xuICAgICAgICBjb25zdCB5MiA9IHkgKyByYWRpdXM7XG4gICAgICAgIGlmICh4MiA8IDAgfHwgeDEgPiB0aGlzLndpZHRoIHx8IHkyIDwgMCB8fCB5MSA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGl0VGVzdCA/IGZhbHNlIDogW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCb3ggcXVlcnkgZWFybHkgZXhpdHMgaWYgdGhlIGJvdW5kaW5nIGJveCBpcyBsYXJnZXIgdGhhbiB0aGUgZ3JpZCwgYnV0IHdlIGRvbid0IGRvXG4gICAgICAgIC8vIHRoZSBlcXVpdmFsZW50IGNhbGN1bGF0aW9uIGZvciBjaXJjbGUgcXVlcmllcyBiZWNhdXNlIGVhcmx5IGV4aXQgaXMgbGVzcyBsaWtlbHlcbiAgICAgICAgLy8gYW5kIHRoZSBjYWxjdWxhdGlvbiBpcyBtb3JlIGV4cGVuc2l2ZVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgcXVlcnlBcmdzID0ge1xuICAgICAgICAgICAgaGl0VGVzdCxcbiAgICAgICAgICAgIGNpcmNsZToge3gsIHksIHJhZGl1c30sXG4gICAgICAgICAgICBzZWVuVWlkczoge2JveDoge30sIGNpcmNsZToge319XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9xdWVyeUNlbGxDaXJjbGUsIHJlc3VsdCwgcXVlcnlBcmdzLCBwcmVkaWNhdGUpO1xuICAgICAgICByZXR1cm4gaGl0VGVzdCA/IHJlc3VsdC5sZW5ndGggPiAwIDogcmVzdWx0O1xuICAgIH1cblxuICAgIHF1ZXJ5KHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHByZWRpY2F0ZT86IGFueSk6IEFycmF5PGFueT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuX3F1ZXJ5KHgxLCB5MSwgeDIsIHkyLCBmYWxzZSwgcHJlZGljYXRlKTogYW55KTtcbiAgICB9XG5cbiAgICBoaXRUZXN0KHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHByZWRpY2F0ZT86IGFueSk6IGJvb2xlYW4gIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9xdWVyeSh4MSwgeTEsIHgyLCB5MiwgdHJ1ZSwgcHJlZGljYXRlKTogYW55KTtcbiAgICB9XG5cbiAgICBoaXRUZXN0Q2lyY2xlKHg6IG51bWJlciwgeTogbnVtYmVyLCByYWRpdXM6IG51bWJlciwgcHJlZGljYXRlPzogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5fcXVlcnlDaXJjbGUoeCwgeSwgcmFkaXVzLCB0cnVlLCBwcmVkaWNhdGUpOiBhbnkpO1xuICAgIH1cblxuICAgIF9xdWVyeUNlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHJlc3VsdDogYW55LCBxdWVyeUFyZ3M6IGFueSwgcHJlZGljYXRlPzogYW55KSB7XG4gICAgICAgIGNvbnN0IHNlZW5VaWRzID0gcXVlcnlBcmdzLnNlZW5VaWRzO1xuICAgICAgICBjb25zdCBib3hDZWxsID0gdGhpcy5ib3hDZWxsc1tjZWxsSW5kZXhdO1xuICAgICAgICBpZiAoYm94Q2VsbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgYmJveGVzID0gdGhpcy5iYm94ZXM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJveFVpZCBvZiBib3hDZWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZWVuVWlkcy5ib3hbYm94VWlkXSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkcy5ib3hbYm94VWlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGJveFVpZCAqIDQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoeDEgPD0gYmJveGVzW29mZnNldCArIDJdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHkxIDw9IGJib3hlc1tvZmZzZXQgKyAzXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICh4MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMF0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoeTIgPj0gYmJveGVzW29mZnNldCArIDFdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHRoaXMuYm94S2V5c1tib3hVaWRdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeUFyZ3MuaGl0VGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogdGhpcy5ib3hLZXlzW2JveFVpZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxOiBiYm94ZXNbb2Zmc2V0XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE6IGJib3hlc1tvZmZzZXQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDI6IGJib3hlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI6IGJib3hlc1tvZmZzZXQgKyAzXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbGwgPSB0aGlzLmNpcmNsZUNlbGxzW2NlbGxJbmRleF07XG4gICAgICAgIGlmIChjaXJjbGVDZWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjaXJjbGVzID0gdGhpcy5jaXJjbGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaXJjbGVVaWQgb2YgY2lyY2xlQ2VsbCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBjaXJjbGVVaWQgKiAzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2lyY2xlQW5kUmVjdENvbGxpZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldCArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHgxLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTEsXG4gICAgICAgICAgICAgICAgICAgICAgICB4MixcbiAgICAgICAgICAgICAgICAgICAgICAgIHkyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeUFyZ3MuaGl0VGVzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB4ID0gY2lyY2xlc1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBjaXJjbGVzW29mZnNldCArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IGNpcmNsZXNbb2Zmc2V0ICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTogeCAtIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE6IHkgLSByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyOiB4ICsgcmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MjogeSArIHJhZGl1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3F1ZXJ5Q2VsbENpcmNsZSh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBjZWxsSW5kZXg6IG51bWJlciwgcmVzdWx0OiBhbnksIHF1ZXJ5QXJnczogYW55LCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY2lyY2xlID0gcXVlcnlBcmdzLmNpcmNsZTtcbiAgICAgICAgY29uc3Qgc2VlblVpZHMgPSBxdWVyeUFyZ3Muc2VlblVpZHM7XG4gICAgICAgIGNvbnN0IGJveENlbGwgPSB0aGlzLmJveENlbGxzW2NlbGxJbmRleF07XG4gICAgICAgIGlmIChib3hDZWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBiYm94ZXMgPSB0aGlzLmJib3hlcztcbiAgICAgICAgICAgIGZvciAoY29uc3QgYm94VWlkIG9mIGJveENlbGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlZW5VaWRzLmJveFtib3hVaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5VaWRzLmJveFtib3hVaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gYm94VWlkICogNDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZUFuZFJlY3RDb2xsaWRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLngsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS5yYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBiYm94ZXNbb2Zmc2V0ICsgM10pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoIXByZWRpY2F0ZSB8fCBwcmVkaWNhdGUodGhpcy5ib3hLZXlzW2JveFVpZF0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNpcmNsZUNlbGwgPSB0aGlzLmNpcmNsZUNlbGxzW2NlbGxJbmRleF07XG4gICAgICAgIGlmIChjaXJjbGVDZWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjaXJjbGVzID0gdGhpcy5jaXJjbGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaXJjbGVVaWQgb2YgY2lyY2xlQ2VsbCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHMuY2lyY2xlW2NpcmNsZVVpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBjaXJjbGVVaWQgKiAzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2lyY2xlc0NvbGxpZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldCArIDFdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS54LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLnksXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUucmFkaXVzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFwcmVkaWNhdGUgfHwgcHJlZGljYXRlKHRoaXMuY2lyY2xlS2V5c1tjaXJjbGVVaWRdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZm9yRWFjaENlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgZm46IGFueSwgYXJnMTogYW55LCBhcmcyPzogYW55LCBwcmVkaWNhdGU/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY3gxID0gdGhpcy5fY29udmVydFRvWENlbGxDb29yZCh4MSk7XG4gICAgICAgIGNvbnN0IGN5MSA9IHRoaXMuX2NvbnZlcnRUb1lDZWxsQ29vcmQoeTEpO1xuICAgICAgICBjb25zdCBjeDIgPSB0aGlzLl9jb252ZXJ0VG9YQ2VsbENvb3JkKHgyKTtcbiAgICAgICAgY29uc3QgY3kyID0gdGhpcy5fY29udmVydFRvWUNlbGxDb29yZCh5Mik7XG5cbiAgICAgICAgZm9yIChsZXQgeCA9IGN4MTsgeCA8PSBjeDI7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IGN5MTsgeSA8PSBjeTI7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxJbmRleCA9IHRoaXMueENlbGxDb3VudCAqIHkgKyB4O1xuICAgICAgICAgICAgICAgIGlmIChmbi5jYWxsKHRoaXMsIHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIGFyZzEsIGFyZzIsIHByZWRpY2F0ZSkpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jb252ZXJ0VG9YQ2VsbENvb3JkKHg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy54Q2VsbENvdW50IC0gMSwgTWF0aC5mbG9vcih4ICogdGhpcy54U2NhbGUpKSk7XG4gICAgfVxuXG4gICAgX2NvbnZlcnRUb1lDZWxsQ29vcmQoeTogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnlDZWxsQ291bnQgLSAxLCBNYXRoLmZsb29yKHkgKiB0aGlzLnlTY2FsZSkpKTtcbiAgICB9XG5cbiAgICBfY2lyY2xlc0NvbGxpZGUoeDE6IG51bWJlciwgeTE6IG51bWJlciwgcjE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgcjI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkeCA9IHgyIC0geDE7XG4gICAgICAgIGNvbnN0IGR5ID0geTIgLSB5MTtcbiAgICAgICAgY29uc3QgYm90aFJhZGlpID0gcjEgKyByMjtcbiAgICAgICAgcmV0dXJuIChib3RoUmFkaWkgKiBib3RoUmFkaWkpID4gKGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICB9XG5cbiAgICBfY2lyY2xlQW5kUmVjdENvbGxpZGUoY2lyY2xlWDogbnVtYmVyLCBjaXJjbGVZOiBudW1iZXIsIHJhZGl1czogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGhhbGZSZWN0V2lkdGggPSAoeDIgLSB4MSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0WCA9IE1hdGguYWJzKGNpcmNsZVggLSAoeDEgKyBoYWxmUmVjdFdpZHRoKSk7XG4gICAgICAgIGlmIChkaXN0WCA+IChoYWxmUmVjdFdpZHRoICsgcmFkaXVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFsZlJlY3RIZWlnaHQgPSAoeTIgLSB5MSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0WSA9IE1hdGguYWJzKGNpcmNsZVkgLSAoeTEgKyBoYWxmUmVjdEhlaWdodCkpO1xuICAgICAgICBpZiAoZGlzdFkgPiAoaGFsZlJlY3RIZWlnaHQgKyByYWRpdXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzdFggPD0gaGFsZlJlY3RXaWR0aCB8fCBkaXN0WSA8PSBoYWxmUmVjdEhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkeCA9IGRpc3RYIC0gaGFsZlJlY3RXaWR0aDtcbiAgICAgICAgY29uc3QgZHkgPSBkaXN0WSAtIGhhbGZSZWN0SGVpZ2h0O1xuICAgICAgICByZXR1cm4gKGR4ICogZHggKyBkeSAqIGR5IDw9IChyYWRpdXMgKiByYWRpdXMpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdyaWRJbmRleDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHttYXQyLCBtYXQ0LCB2ZWMzLCB2ZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0ICogYXMgc3ltYm9sU2l6ZSBmcm9tICcuL3N5bWJvbF9zaXplLmpzJztcbmltcG9ydCB7YWRkRHluYW1pY0F0dHJpYnV0ZXN9IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3Rpb259IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcmVuZGVyL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUgU3ltYm9sQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIEdseXBoT2Zmc2V0QXJyYXksXG4gICAgU3ltYm9sTGluZVZlcnRleEFycmF5LFxuICAgIFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheVxufSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB7V3JpdGluZ01vZGV9IGZyb20gJy4uL3N5bWJvbC9zaGFwaW5nLmpzJztcbmltcG9ydCB7Q2Fub25pY2FsVGlsZUlELCBPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQge2NhbGN1bGF0ZUdsb2JlTWF0cml4LCBnbG9iZURlbm9ybWFsaXplRUNFRiwgZ2xvYmVUaWxlQm91bmRzfSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9nbG9iZS5qcyc7XG5leHBvcnQge3VwZGF0ZUxpbmVMYWJlbHMsIGhpZGVHbHlwaHMsIGdldExhYmVsUGxhbmVNYXRyaXgsIGdldEdsQ29vcmRNYXRyaXgsIHByb2plY3QsIGdldFBlcnNwZWN0aXZlUmF0aW8sIHBsYWNlRmlyc3RBbmRMYXN0R2x5cGgsIHBsYWNlR2x5cGhBbG9uZ0xpbmUsIHh5VHJhbnNmb3JtTWF0NH07XG5cbmNvbnN0IEZsaXBTdGF0ZSA9IHtcbiAgICB1bmtub3duOiAwLFxuICAgIGZsaXBSZXF1aXJlZDogMSxcbiAgICBmbGlwTm90UmVxdWlyZWQ6IDJcbn07XG5cbmNvbnN0IG1heFRhbmdlbnQgPSBNYXRoLnRhbig4NSAqIE1hdGguUEkgLyAxODApO1xuXG4vKlxuICogIyBPdmVydmlldyBvZiBjb29yZGluYXRlIHNwYWNlc1xuICpcbiAqICMjIFRpbGUgY29vcmRpbmF0ZSBzcGFjZXNcbiAqIEVhY2ggbGFiZWwgaGFzIGFuIGFuY2hvci4gU29tZSBsYWJlbHMgaGF2ZSBjb3JyZXNwb25kaW5nIGxpbmUgZ2VvbWV0cmllcy5cbiAqIFRoZSBwb2ludHMgZm9yIGJvdGggYW5jaG9ycyBhbmQgbGluZXMgYXJlIHN0b3JlZCBpbiB0aWxlIHVuaXRzLiBFYWNoIHRpbGUgaGFzIGl0J3Mgb3duXG4gKiBjb29yZGluYXRlIHNwYWNlIGdvaW5nIGZyb20gKDAsIDApIGF0IHRoZSB0b3AgbGVmdCB0byAoRVhURU5ULCBFWFRFTlQpIGF0IHRoZSBib3R0b20gcmlnaHQuXG4gKlxuICogIyMgR0wgY29vcmRpbmF0ZSBzcGFjZVxuICogQXQgdGhlIGVuZCBvZiBldmVyeXRoaW5nLCB0aGUgdmVydGV4IHNoYWRlciBuZWVkcyB0byBwcm9kdWNlIGEgcG9zaXRpb24gaW4gR0wgY29vcmRpbmF0ZSBzcGFjZSxcbiAqIHdoaWNoIGlzICgtMSwgMSkgYXQgdGhlIHRvcCBsZWZ0IGFuZCAoMSwgLTEpIGluIHRoZSBib3R0b20gcmlnaHQuXG4gKlxuICogIyMgTWFwIHBpeGVsIGNvb3JkaW5hdGUgc3BhY2VzXG4gKiBFYWNoIHRpbGUgaGFzIGEgcGl4ZWwgY29vcmRpbmF0ZSBzcGFjZS4gSXQncyBqdXN0IHRoZSB0aWxlIHVuaXRzIHNjYWxlZCBzbyB0aGF0IG9uZSB1bml0IGlzXG4gKiB3aGF0ZXZlciBjb3VudHMgYXMgMSBwaXhlbCBhdCB0aGUgY3VycmVudCB6b29tLlxuICogVGhpcyBzcGFjZSBpcyB1c2VkIGZvciBwaXRjaC1hbGlnbm1lbnQ9bWFwLCByb3RhdGlvbi1hbGlnbm1lbnQ9bWFwXG4gKlxuICogIyMgUm90YXRlZCBtYXAgcGl4ZWwgY29vcmRpbmF0ZSBzcGFjZXNcbiAqIExpa2UgdGhlIGFib3ZlLCBidXQgcm90YXRlZCBzbyBheGlzIG9mIHRoZSBzcGFjZSBhcmUgYWxpZ25lZCB3aXRoIHRoZSB2aWV3cG9ydCBpbnN0ZWFkIG9mIHRoZSB0aWxlLlxuICogVGhpcyBzcGFjZSBpcyB1c2VkIGZvciBwaXRjaC1hbGlnbm1lbnQ9bWFwLCByb3RhdGlvbi1hbGlnbm1lbnQ9dmlld3BvcnRcbiAqXG4gKiAjIyBWaWV3cG9ydCBwaXhlbCBjb29yZGluYXRlIHNwYWNlXG4gKiAoMCwgMCkgaXMgYXQgdGhlIHRvcCBsZWZ0IG9mIHRoZSBjYW52YXMgYW5kIChwaXhlbFdpZHRoLCBwaXhlbEhlaWdodCkgaXMgYXQgdGhlIGJvdHRvbSByaWdodCBjb3JuZXJcbiAqIG9mIHRoZSBjYW52YXMuIFRoaXMgc3BhY2UgaXMgdXNlZCBmb3IgcGl0Y2gtYWxpZ25tZW50PXZpZXdwb3J0XG4gKlxuICpcbiAqICMgVmVydGV4IHByb2plY3Rpb25cbiAqIEl0IGdvZXMgcm91Z2hseSBsaWtlIHRoaXM6XG4gKiAxLiBwcm9qZWN0IHRoZSBhbmNob3IgYW5kIGxpbmUgZnJvbSB0aWxlIHVuaXRzIGludG8gdGhlIGNvcnJlY3QgbGFiZWwgY29vcmRpbmF0ZSBzcGFjZVxuICogICAgICAtIG1hcCBwaXhlbCBzcGFjZSAgICAgICAgICAgcGl0Y2gtYWxpZ25tZW50PW1hcCAgICAgICAgIHJvdGF0aW9uLWFsaWdubWVudD1tYXBcbiAqICAgICAgLSByb3RhdGVkIG1hcCBwaXhlbCBzcGFjZSAgIHBpdGNoLWFsaWdubWVudD1tYXAgICAgICAgICByb3RhdGlvbi1hbGlnbm1lbnQ9dmlld3BvcnRcbiAqICAgICAgLSB2aWV3cG9ydCBwaXhlbCBzcGFjZSAgICAgIHBpdGNoLWFsaWdubWVudD12aWV3cG9ydCAgICByb3RhdGlvbi1hbGlnbm1lbnQ9KlxuICogMi4gaWYgdGhlIGxhYmVsIGZvbGxvd3MgYSBsaW5lLCBmaW5kIHRoZSBwb2ludCBhbG9uZyB0aGUgbGluZSB0aGF0IGlzIHRoZSBjb3JyZWN0IGRpc3RhbmNlIGZyb20gdGhlIGFuY2hvci5cbiAqIDMuIGFkZCB0aGUgZ2x5cGgncyBjb3JuZXIgb2Zmc2V0IHRvIHRoZSBwb2ludCBmcm9tIHN0ZXAgM1xuICogNC4gY29udmVydCBmcm9tIHRoZSBsYWJlbCBjb29yZGluYXRlIHNwYWNlIHRvIGdsIGNvb3JkaW5hdGVzXG4gKlxuICogRm9yIGhvcml6b250YWwgbGFiZWxzIHdlIHdhbnQgdG8gZG8gc3RlcCAxIGluIHRoZSBzaGFkZXIgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKG5vIGNwdSB3b3JrKS5cbiAqICAgICAgVGhpcyBpcyB3aGF0IGB1X2xhYmVsX3BsYW5lX21hdHJpeGAgaXMgdXNlZCBmb3IuXG4gKiBGb3IgbGFiZWxzIGFsaWduZWQgd2l0aCBsaW5lcyB3ZSBoYXZlIHRvIHN0ZXBzIDEgYW5kIDIgb24gdGhlIGNwdSBzaW5jZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgbGluZSBnZW9tZXRyeS5cbiAqICAgICAgVGhpcyBpcyB3aGF0IGB1cGRhdGVMaW5lTGFiZWxzKC4uLilgIGRvZXMuXG4gKiAgICAgIFNpbmNlIHRoZSBjb252ZXJzaW9uIGlzIGhhbmRsZWQgb24gdGhlIGNwdSB3ZSBqdXN0IHNldCBgdV9sYWJlbF9wbGFuZV9tYXRyaXhgIHRvIGFuIGlkZW50aXR5IG1hdHJpeC5cbiAqXG4gKiBTdGVwcyAzIGFuZCA0IGFyZSBkb25lIGluIHRoZSBzaGFkZXJzIGZvciBhbGwgbGFiZWxzLlxuICovXG5cbi8qXG4gKiBSZXR1cm5zIGEgbWF0cml4IGZvciBjb252ZXJ0aW5nIGZyb20gdGlsZSB1bml0cyB0byB0aGUgY29ycmVjdCBsYWJlbCBjb29yZGluYXRlIHNwYWNlLlxuICovXG5mdW5jdGlvbiBnZXRMYWJlbFBsYW5lTWF0cml4KHBvc01hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZUlEOiBDYW5vbmljYWxUaWxlSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBGbG9hdDMyQXJyYXkpIHtcbiAgICBsZXQgbSA9IG1hdDQuY3JlYXRlKCk7XG4gICAgaWYgKHBpdGNoV2l0aE1hcCkge1xuICAgICAgICBpZiAodHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJykge1xuICAgICAgICAgICAgLy8gQ2FtZXJhIGlzIG1vdmVkIGNsb3NlciB0b3dhcmRzIHRoZSBncm91bmQgbmVhciBwb2xlcyBhcyBwYXJ0IG9mXG4gICAgICAgICAgICAvLyBjb21wZXNhbnRpbmcgdGhlIHJlcHJvamVjdGlvbi4gVGhpcyBoYXMgdG8gYmUgY29tcGVuc2F0ZWQgZm9yIHRoZVxuICAgICAgICAgICAgLy8gbWFwIGFsaWduZWQgbGFiZWwgc3BhY2UuIFdoaXRob3V0IHRoaXMgbG9naWMgbWFwIGFsaWduZWQgc3ltYm9sc1xuICAgICAgICAgICAgLy8gd291bGQgYXBwZWFyIGxhcmdlciB0aGFuIGludGVuZGVkLlxuICAgICAgICAgICAgY29uc3QgbGFiZWxXb3JsZFNpemUgPSB0cmFuc2Zvcm0ud29ybGRTaXplIC8gdHJhbnNmb3JtLl9wcm9qZWN0aW9uU2NhbGVyO1xuICAgICAgICAgICAgbSA9IGNhbGN1bGF0ZUdsb2JlTWF0cml4KHRyYW5zZm9ybSwgbGFiZWxXb3JsZFNpemUsIFswLCAwXSk7XG5cbiAgICAgICAgICAgIG1hdDQubXVsdGlwbHkobSwgbSwgZ2xvYmVEZW5vcm1hbGl6ZUVDRUYoZ2xvYmVUaWxlQm91bmRzKHRpbGVJRCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBtYXQyLmludmVydChbXSwgcGl4ZWxzVG9UaWxlVW5pdHMpO1xuICAgICAgICAgICAgbVswXSA9IHNbMF07XG4gICAgICAgICAgICBtWzFdID0gc1sxXTtcbiAgICAgICAgICAgIG1bNF0gPSBzWzJdO1xuICAgICAgICAgICAgbVs1XSA9IHNbM107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb3RhdGVXaXRoTWFwKSB7XG4gICAgICAgICAgICBtYXQ0LnJvdGF0ZVoobSwgbSwgdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdDQubXVsdGlwbHkobSwgdHJhbnNmb3JtLmxhYmVsUGxhbmVNYXRyaXgsIHBvc01hdHJpeCk7XG4gICAgfVxuICAgIHJldHVybiBtO1xufVxuXG4vKlxuICogUmV0dXJucyBhIG1hdHJpeCBmb3IgY29udmVydGluZyBmcm9tIHRoZSBjb3JyZWN0IGxhYmVsIGNvb3JkaW5hdGUgc3BhY2UgdG8gZ2wgY29vcmRzLlxuICovXG5mdW5jdGlvbiBnZXRHbENvb3JkTWF0cml4KHBvc01hdHJpeDogbWF0NCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZUlEOiBDYW5vbmljYWxUaWxlSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBGbG9hdDMyQXJyYXkpIHtcbiAgICBpZiAocGl0Y2hXaXRoTWFwKSB7XG4gICAgICAgIGlmICh0cmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICBjb25zdCBtID0gZ2V0TGFiZWxQbGFuZU1hdHJpeChwb3NNYXRyaXgsIHRpbGVJRCwgcGl0Y2hXaXRoTWFwLCByb3RhdGVXaXRoTWFwLCB0cmFuc2Zvcm0sIHBpeGVsc1RvVGlsZVVuaXRzKTtcbiAgICAgICAgICAgIG1hdDQuaW52ZXJ0KG0sIG0pO1xuICAgICAgICAgICAgbWF0NC5tdWx0aXBseShtLCBwb3NNYXRyaXgsIG0pO1xuICAgICAgICAgICAgcmV0dXJuIG07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtID0gbWF0NC5jbG9uZShwb3NNYXRyaXgpO1xuICAgICAgICAgICAgY29uc3QgcyA9IG1hdDQuaWRlbnRpdHkoW10pO1xuICAgICAgICAgICAgc1swXSA9IHBpeGVsc1RvVGlsZVVuaXRzWzBdO1xuICAgICAgICAgICAgc1sxXSA9IHBpeGVsc1RvVGlsZVVuaXRzWzFdO1xuICAgICAgICAgICAgc1s0XSA9IHBpeGVsc1RvVGlsZVVuaXRzWzJdO1xuICAgICAgICAgICAgc1s1XSA9IHBpeGVsc1RvVGlsZVVuaXRzWzNdO1xuICAgICAgICAgICAgbWF0NC5tdWx0aXBseShtLCBtLCBzKTtcbiAgICAgICAgICAgIGlmICghcm90YXRlV2l0aE1hcCkge1xuICAgICAgICAgICAgICAgIG1hdDQucm90YXRlWihtLCBtLCAtdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5nbENvb3JkTWF0cml4O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcHJvamVjdChwb2ludDogUG9pbnQsIG1hdHJpeDogbWF0NCwgZWxldmF0aW9uOiA/bnVtYmVyID0gMCkge1xuICAgIGNvbnN0IHBvcyA9IFtwb2ludC54LCBwb2ludC55LCBlbGV2YXRpb24sIDFdO1xuICAgIGlmIChlbGV2YXRpb24pIHtcbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHBvcywgcG9zLCBtYXRyaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHh5VHJhbnNmb3JtTWF0NChwb3MsIHBvcywgbWF0cml4KTtcbiAgICB9XG4gICAgY29uc3QgdyA9IHBvc1szXTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwb2ludDogbmV3IFBvaW50KHBvc1swXSAvIHcsIHBvc1sxXSAvIHcpLFxuICAgICAgICBzaWduZWREaXN0YW5jZUZyb21DYW1lcmE6IHdcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQZXJzcGVjdGl2ZVJhdGlvKGNhbWVyYVRvQ2VudGVyRGlzdGFuY2U6IG51bWJlciwgc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbigwLjUgKyAwLjUgKiAoY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvIHNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSksIDEuNSk7XG59XG5cbmZ1bmN0aW9uIGlzVmlzaWJsZShhbmNob3JQb3M6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIGNsaXBwaW5nQnVmZmVyOiBbbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgY29uc3QgeCA9IGFuY2hvclBvc1swXSAvIGFuY2hvclBvc1szXTtcbiAgICBjb25zdCB5ID0gYW5jaG9yUG9zWzFdIC8gYW5jaG9yUG9zWzNdO1xuICAgIGNvbnN0IGluUGFkZGVkVmlld3BvcnQgPSAoXG4gICAgICAgIHggPj0gLWNsaXBwaW5nQnVmZmVyWzBdICYmXG4gICAgICAgIHggPD0gY2xpcHBpbmdCdWZmZXJbMF0gJiZcbiAgICAgICAgeSA+PSAtY2xpcHBpbmdCdWZmZXJbMV0gJiZcbiAgICAgICAgeSA8PSBjbGlwcGluZ0J1ZmZlclsxXSk7XG4gICAgcmV0dXJuIGluUGFkZGVkVmlld3BvcnQ7XG59XG5cbi8qXG4gKiAgVXBkYXRlIHRoZSBgZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlcmAgZm9yIHRoZSBidWZmZXIgd2l0aCB0aGUgY29ycmVjdCBnbHlwaCBwb3NpdGlvbnMgZm9yIHRoZSBjdXJyZW50IG1hcCB2aWV3LlxuICogIFRoaXMgaXMgb25seSBydW4gb24gbGFiZWxzIHRoYXQgYXJlIGFsaWduZWQgd2l0aCBsaW5lcy4gSG9yaXpvbnRhbCBsYWJlbHMgYXJlIGhhbmRsZWQgZW50aXJlbHkgaW4gdGhlIHNoYWRlci5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlTGluZUxhYmVscyhidWNrZXQ6IFN5bWJvbEJ1Y2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zTWF0cml4OiBtYXQ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludGVyOiBQYWludGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RleHQ6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdsQ29vcmRNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFVwcmlnaHQ6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVsZXZhdGlvbjogPygocDogUG9pbnQpID0+IEFycmF5PG51bWJlcj4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcblxuICAgIGNvbnN0IHRyID0gcGFpbnRlci50cmFuc2Zvcm07XG4gICAgY29uc3Qgc2l6ZURhdGEgPSBpc1RleHQgPyBidWNrZXQudGV4dFNpemVEYXRhIDogYnVja2V0Lmljb25TaXplRGF0YTtcbiAgICBjb25zdCBwYXJ0aWFsbHlFdmFsdWF0ZWRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHNpemVEYXRhLCBwYWludGVyLnRyYW5zZm9ybS56b29tKTtcblxuICAgIGNvbnN0IGNsaXBwaW5nQnVmZmVyID0gWzI1NiAvIHBhaW50ZXIud2lkdGggKiAyICsgMSwgMjU2IC8gcGFpbnRlci5oZWlnaHQgKiAyICsgMV07XG5cbiAgICBjb25zdCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkgPSBpc1RleHQgP1xuICAgICAgICBidWNrZXQudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkgOlxuICAgICAgICBidWNrZXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QXJyYXk7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmNsZWFyKCk7XG5cbiAgICBjb25zdCBsaW5lVmVydGV4QXJyYXkgPSBidWNrZXQubGluZVZlcnRleEFycmF5O1xuICAgIGNvbnN0IHBsYWNlZFN5bWJvbHMgPSBpc1RleHQgPyBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheSA6IGJ1Y2tldC5pY29uLnBsYWNlZFN5bWJvbEFycmF5O1xuXG4gICAgY29uc3QgYXNwZWN0UmF0aW8gPSBwYWludGVyLnRyYW5zZm9ybS53aWR0aCAvIHBhaW50ZXIudHJhbnNmb3JtLmhlaWdodDtcblxuICAgIGxldCB1c2VWZXJ0aWNhbCA9IGZhbHNlO1xuXG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBwbGFjZWRTeW1ib2xzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbDogYW55ID0gcGxhY2VkU3ltYm9scy5nZXQocyk7XG5cbiAgICAgICAgLy8gTm9ybWFsbHksIHRoZSAnSG9yaXpvbnRhbHxWZXJ0aWNhbCcgd3JpdGluZyBtb2RlIGlzIGZvbGxvd2VkIGJ5IGEgJ1ZlcnRpY2FsJyBjb3VudGVycGFydCwgdGhpc1xuICAgICAgICAvLyBpcyBub3QgdHJ1ZSBmb3IgJ1ZlcnRpY2FsJyBvbmx5IGxpbmUgbGFiZWxzLiBGb3IgdGhpcyBjYXNlLCB3ZSdsbCBoYXZlIHRvIG92ZXJ3cml0ZSB0aGUgJ3VzZVZlcnRpY2FsJ1xuICAgICAgICAvLyBzdGF0dXMgYmVmb3JlIGZ1cnRoZXIgY2hlY2tzLlxuICAgICAgICBpZiAoc3ltYm9sLndyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCAmJiAhdXNlVmVydGljYWwpIHtcbiAgICAgICAgICAgIGlmIChzID09PSAwIHx8IHBsYWNlZFN5bWJvbHMuZ2V0KHMgLSAxKS53cml0aW5nTW9kZSAhPT0gV3JpdGluZ01vZGUuaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgICAgIHVzZVZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbid0IGRvIGNhbGN1bGF0aW9ucyBmb3IgdmVydGljYWwgZ2x5cGhzIHVubGVzcyB0aGUgcHJldmlvdXMgc3ltYm9sIHdhcyBob3Jpem9udGFsXG4gICAgICAgIC8vIGFuZCB3ZSBkZXRlcm1pbmVkIHRoYXQgdmVydGljYWwgZ2x5cGhzIHdlcmUgbmVjZXNzYXJ5LlxuICAgICAgICAvLyBBbHNvIGRvbid0IGRvIGNhbGN1bGF0aW9ucyBmb3Igc3ltYm9scyB0aGF0IGFyZSBjb2xsaWRlZCBhbmQgZnVsbHkgZmFkZWQgb3V0XG4gICAgICAgIGlmIChzeW1ib2wuaGlkZGVuIHx8IHN5bWJvbC53cml0aW5nTW9kZSA9PT0gV3JpdGluZ01vZGUudmVydGljYWwgJiYgIXVzZVZlcnRpY2FsKSB7XG4gICAgICAgICAgICBoaWRlR2x5cGhzKHN5bWJvbC5udW1HbHlwaHMsIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBd2t3YXJkLi4uIGJ1dCB3ZSdyZSBjb3VudGluZyBvbiB0aGUgcGFpcmVkIFwidmVydGljYWxcIiBzeW1ib2wgY29taW5nIGltbWVkaWF0ZWx5IGFmdGVyIGl0cyBob3Jpem9udGFsIGNvdW50ZXJwYXJ0XG4gICAgICAgIHVzZVZlcnRpY2FsID0gZmFsc2U7XG5cbiAgICAgICAgLy8gUHJvamVjdCB0aWxlIGFuY2hvciB0byBnbG9iZSBhbmNob3JcbiAgICAgICAgY29uc3QgdGlsZUFuY2hvclBvaW50ID0gbmV3IFBvaW50KHN5bWJvbC50aWxlQW5jaG9yWCwgc3ltYm9sLnRpbGVBbmNob3JZKTtcbiAgICAgICAgY29uc3QgZWxldmF0aW9uID0gZ2V0RWxldmF0aW9uID8gZ2V0RWxldmF0aW9uKHRpbGVBbmNob3JQb2ludCkgOiBbMCwgMCwgMF07XG4gICAgICAgIGNvbnN0IHByb2plY3RlZEFuY2hvciA9IHRyLnByb2plY3Rpb24ucHJvamVjdFRpbGVQb2ludCh0aWxlQW5jaG9yUG9pbnQueCwgdGlsZUFuY2hvclBvaW50LnksIHRpbGVJRC5jYW5vbmljYWwpO1xuICAgICAgICBjb25zdCBlbGV2YXRlZEFuY2hvciA9IFtwcm9qZWN0ZWRBbmNob3IueCArIGVsZXZhdGlvblswXSwgcHJvamVjdGVkQW5jaG9yLnkgKyBlbGV2YXRpb25bMV0sIHByb2plY3RlZEFuY2hvci56ICsgZWxldmF0aW9uWzJdXTtcbiAgICAgICAgY29uc3QgYW5jaG9yUG9zID0gWy4uLmVsZXZhdGVkQW5jaG9yLCAxLjBdO1xuXG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChhbmNob3JQb3MsIGFuY2hvclBvcywgcG9zTWF0cml4KTtcblxuICAgICAgICAvLyBEb24ndCBib3RoZXIgY2FsY3VsYXRpbmcgdGhlIGNvcnJlY3QgcG9pbnQgZm9yIGludmlzaWJsZSBsYWJlbHMuXG4gICAgICAgIGlmICghaXNWaXNpYmxlKGFuY2hvclBvcywgY2xpcHBpbmdCdWZmZXIpKSB7XG4gICAgICAgICAgICBoaWRlR2x5cGhzKHN5bWJvbC5udW1HbHlwaHMsIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjYW1lcmFUb0FuY2hvckRpc3RhbmNlID0gYW5jaG9yUG9zWzNdO1xuICAgICAgICBjb25zdCBwZXJzcGVjdGl2ZVJhdGlvID0gZ2V0UGVyc3BlY3RpdmVSYXRpbyhwYWludGVyLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLCBjYW1lcmFUb0FuY2hvckRpc3RhbmNlKTtcblxuICAgICAgICBjb25zdCBmb250U2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZShzaXplRGF0YSwgcGFydGlhbGx5RXZhbHVhdGVkU2l6ZSwgc3ltYm9sKTtcbiAgICAgICAgY29uc3QgcGl0Y2hTY2FsZWRGb250U2l6ZSA9IHBpdGNoV2l0aE1hcCA/IGZvbnRTaXplIC8gcGVyc3BlY3RpdmVSYXRpbyA6IGZvbnRTaXplICogcGVyc3BlY3RpdmVSYXRpbztcblxuICAgICAgICBjb25zdCBsYWJlbFBsYW5lQW5jaG9yUG9pbnQgPSBwcm9qZWN0KG5ldyBQb2ludChlbGV2YXRlZEFuY2hvclswXSwgZWxldmF0ZWRBbmNob3JbMV0pLCBsYWJlbFBsYW5lTWF0cml4LCBlbGV2YXRlZEFuY2hvclsyXSk7XG5cbiAgICAgICAgLy8gU2tpcCBsYWJlbHMgYmVoaW5kIHRoZSBjYW1lcmFcbiAgICAgICAgaWYgKGxhYmVsUGxhbmVBbmNob3JQb2ludC5zaWduZWREaXN0YW5jZUZyb21DYW1lcmEgPD0gMC4wKSB7XG4gICAgICAgICAgICBoaWRlR2x5cGhzKHN5bWJvbC5udW1HbHlwaHMsIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcm9qZWN0aW9uQ2FjaGUgPSB7fTtcblxuICAgICAgICBjb25zdCBnZXRFbGV2YXRpb25Gb3JQbGFjZW1lbnQgPSBwaXRjaFdpdGhNYXAgPyBudWxsIDogZ2V0RWxldmF0aW9uOyAvLyBXaGVuIHBpdGNoV2l0aE1hcCwgd2UncmUgcHJvamVjdGluZyB0byBzY2FsZWQgdGlsZSBjb29yZGluYXRlIHNwYWNlOiB0aGVyZSBpcyBubyBuZWVkIHRvIGdldCBlbGV2YXRpb24gYXMgaXQgZG9lc24ndCBhZmZlY3QgcHJvamVjdGlvbi5cbiAgICAgICAgY29uc3QgcGxhY2VVbmZsaXBwZWQ6IGFueSA9IHBsYWNlR2x5cGhzQWxvbmdMaW5lKHN5bWJvbCwgcGl0Y2hTY2FsZWRGb250U2l6ZSwgZmFsc2UgLyp1bmZsaXBwZWQqLywga2VlcFVwcmlnaHQsIHBvc01hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCxcbiAgICAgICAgICAgIGJ1Y2tldC5nbHlwaE9mZnNldEFycmF5LCBsaW5lVmVydGV4QXJyYXksIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZUFuY2hvclBvaW50LnBvaW50LCB0aWxlQW5jaG9yUG9pbnQsIHByb2plY3Rpb25DYWNoZSwgYXNwZWN0UmF0aW8sIGdldEVsZXZhdGlvbkZvclBsYWNlbWVudCwgdHIucHJvamVjdGlvbiwgdGlsZUlEKTtcblxuICAgICAgICB1c2VWZXJ0aWNhbCA9IHBsYWNlVW5mbGlwcGVkLnVzZVZlcnRpY2FsO1xuXG4gICAgICAgIGlmIChnZXRFbGV2YXRpb25Gb3JQbGFjZW1lbnQgJiYgcGxhY2VVbmZsaXBwZWQubmVlZHNGbGlwcGluZykgcHJvamVjdGlvbkNhY2hlID0ge307IC8vIFRydW5jYXRlZCBwb2ludHMgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cbiAgICAgICAgaWYgKHBsYWNlVW5mbGlwcGVkLm5vdEVub3VnaFJvb20gfHwgdXNlVmVydGljYWwgfHxcbiAgICAgICAgICAgIChwbGFjZVVuZmxpcHBlZC5uZWVkc0ZsaXBwaW5nICYmXG4gICAgICAgICAgICAgcGxhY2VHbHlwaHNBbG9uZ0xpbmUoc3ltYm9sLCBwaXRjaFNjYWxlZEZvbnRTaXplLCB0cnVlIC8qZmxpcHBlZCovLCBrZWVwVXByaWdodCwgcG9zTWF0cml4LCBsYWJlbFBsYW5lTWF0cml4LCBnbENvb3JkTWF0cml4LFxuICAgICAgICAgICAgICAgICBidWNrZXQuZ2x5cGhPZmZzZXRBcnJheSwgbGluZVZlcnRleEFycmF5LCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGxhYmVsUGxhbmVBbmNob3JQb2ludC5wb2ludCwgdGlsZUFuY2hvclBvaW50LCBwcm9qZWN0aW9uQ2FjaGUsIGFzcGVjdFJhdGlvLCBnZXRFbGV2YXRpb25Gb3JQbGFjZW1lbnQsIHRyLnByb2plY3Rpb24sIHRpbGVJRCkubm90RW5vdWdoUm9vbSkpIHtcbiAgICAgICAgICAgIGhpZGVHbHlwaHMoc3ltYm9sLm51bUdseXBocywgZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1RleHQpIHtcbiAgICAgICAgYnVja2V0LnRleHQuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYnVja2V0Lmljb24uZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwbGFjZUZpcnN0QW5kTGFzdEdseXBoKGZvbnRTY2FsZTogbnVtYmVyLCBnbHlwaE9mZnNldEFycmF5OiBHbHlwaE9mZnNldEFycmF5LCBsaW5lT2Zmc2V0WDogbnVtYmVyLCBsaW5lT2Zmc2V0WTogbnVtYmVyLCBmbGlwOiBib29sZWFuLCBhbmNob3JQb2ludDogUG9pbnQsIHRpbGVBbmNob3JQb2ludDogUG9pbnQsIHN5bWJvbDogYW55LCBsaW5lVmVydGV4QXJyYXk6IFN5bWJvbExpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeDogbWF0NCwgcHJvamVjdGlvbkNhY2hlOiBhbnksIGdldEVsZXZhdGlvbjogPygocDogUG9pbnQpID0+IEFycmF5PG51bWJlcj4pLCByZXR1cm5QYXRoSW5UaWxlQ29vcmRzOiA/Ym9vbGVhbiwgcHJvamVjdGlvbjogUHJvamVjdGlvbiwgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgY29uc3QgZ2x5cGhFbmRJbmRleCA9IHN5bWJvbC5nbHlwaFN0YXJ0SW5kZXggKyBzeW1ib2wubnVtR2x5cGhzO1xuICAgIGNvbnN0IGxpbmVTdGFydEluZGV4ID0gc3ltYm9sLmxpbmVTdGFydEluZGV4O1xuICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IHN5bWJvbC5saW5lU3RhcnRJbmRleCArIHN5bWJvbC5saW5lTGVuZ3RoO1xuXG4gICAgY29uc3QgZmlyc3RHbHlwaE9mZnNldCA9IGdseXBoT2Zmc2V0QXJyYXkuZ2V0b2Zmc2V0WChzeW1ib2wuZ2x5cGhTdGFydEluZGV4KTtcbiAgICBjb25zdCBsYXN0R2x5cGhPZmZzZXQgPSBnbHlwaE9mZnNldEFycmF5LmdldG9mZnNldFgoZ2x5cGhFbmRJbmRleCAtIDEpO1xuXG4gICAgY29uc3QgZmlyc3RQbGFjZWRHbHlwaCA9IHBsYWNlR2x5cGhBbG9uZ0xpbmUoZm9udFNjYWxlICogZmlyc3RHbHlwaE9mZnNldCwgbGluZU9mZnNldFgsIGxpbmVPZmZzZXRZLCBmbGlwLCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBzeW1ib2wuc2VnbWVudCxcbiAgICAgICAgbGluZVN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCwgbGluZVZlcnRleEFycmF5LCBsYWJlbFBsYW5lTWF0cml4LCBwcm9qZWN0aW9uQ2FjaGUsIGdldEVsZXZhdGlvbiwgcmV0dXJuUGF0aEluVGlsZUNvb3JkcywgdHJ1ZSwgcHJvamVjdGlvbiwgdGlsZUlEKTtcbiAgICBpZiAoIWZpcnN0UGxhY2VkR2x5cGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbGFzdFBsYWNlZEdseXBoID0gcGxhY2VHbHlwaEFsb25nTGluZShmb250U2NhbGUgKiBsYXN0R2x5cGhPZmZzZXQsIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLnNlZ21lbnQsXG4gICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlLCBnZXRFbGV2YXRpb24sIHJldHVyblBhdGhJblRpbGVDb29yZHMsIHRydWUsIHByb2plY3Rpb24sIHRpbGVJRCk7XG4gICAgaWYgKCFsYXN0UGxhY2VkR2x5cGgpXG4gICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHtmaXJzdDogZmlyc3RQbGFjZWRHbHlwaCwgbGFzdDogbGFzdFBsYWNlZEdseXBofTtcbn1cblxuLy8gQ2hlY2sgaW4gdGhlIGdsQ29vcmRpbmF0ZSBzcGFjZSwgdGhlIHJvdWdoIGVzdGltYXRpb24gb2YgYW5nbGUgYmV0d2VlbiB0aGUgdGV4dCBsaW5lIGFuZCB0aGUgWSBheGlzLlxuLy8gSWYgdGhlIGFuZ2xlIGlmIGxlc3Mgb3IgZXF1YWwgdG8gNSBkZWdyZWUsIHRoZW4ga2VlcCB0aGUgdGV4dCBnbHlwaHMgdW5mbGlwcGVkIGV2ZW4gaWYgaXQgaXMgcmVxdWlyZWQuXG5mdW5jdGlvbiBpc0luRmxpcFJldGFpblJhbmdlKGZpcnN0UG9pbnQsIGxhc3RQb2ludCwgYXNwZWN0UmF0aW8pIHtcbiAgICBjb25zdCBkZWx0YVkgPSBsYXN0UG9pbnQueSAtIGZpcnN0UG9pbnQueTtcbiAgICBjb25zdCBkZWx0YVggPSAobGFzdFBvaW50LnggLSBmaXJzdFBvaW50LngpICogYXNwZWN0UmF0aW87XG4gICAgaWYgKGRlbHRhWCA9PT0gMC4wKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBhYnNUYW5nZW50ID0gTWF0aC5hYnMoZGVsdGFZIC8gZGVsdGFYKTtcbiAgICByZXR1cm4gKGFic1RhbmdlbnQgPiBtYXhUYW5nZW50KTtcbn1cblxuZnVuY3Rpb24gcmVxdWlyZXNPcmllbnRhdGlvbkNoYW5nZShzeW1ib2wsIGZpcnN0UG9pbnQsIGxhc3RQb2ludCwgYXNwZWN0UmF0aW8pIHtcbiAgICBpZiAoc3ltYm9sLndyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS5ob3Jpem9udGFsKSB7XG4gICAgICAgIC8vIE9uIHRvcCBvZiBjaG9vc2luZyB3aGV0aGVyIHRvIGZsaXAsIGNob29zZSB3aGV0aGVyIHRvIHJlbmRlciB0aGlzIHZlcnNpb24gb2YgdGhlIGdseXBocyBvciB0aGUgYWx0ZXJuYXRlXG4gICAgICAgIC8vIHZlcnRpY2FsIGdseXBocy4gV2UgY2FuJ3QganVzdCBmaWx0ZXIgb3V0IHZlcnRpY2FsIGdseXBocyBpbiB0aGUgaG9yaXpvbnRhbCByYW5nZSBiZWNhdXNlIHRoZSBob3Jpem9udGFsXG4gICAgICAgIC8vIGFuZCB2ZXJ0aWNhbCB2ZXJzaW9ucyBjYW4gaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgcHJvamVjdGlvbnMgd2hpY2ggY291bGQgbGVhZCB0byBhbmdsZXMgd2hlcmUgYm90aCBvclxuICAgICAgICAvLyBuZWl0aGVyIHNob3dlZC5cbiAgICAgICAgY29uc3QgcmlzZSA9IE1hdGguYWJzKGxhc3RQb2ludC55IC0gZmlyc3RQb2ludC55KTtcbiAgICAgICAgY29uc3QgcnVuID0gTWF0aC5hYnMobGFzdFBvaW50LnggLSBmaXJzdFBvaW50LngpICogYXNwZWN0UmF0aW87XG4gICAgICAgIGlmIChyaXNlID4gcnVuKSB7XG4gICAgICAgICAgICByZXR1cm4ge3VzZVZlcnRpY2FsOiB0cnVlfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDaGVjayBpZiBmbGlwcGluZyBpcyByZXF1aXJlZCBmb3IgXCJ2ZXJ0aWNhbE9ubHlcIiBjYXNlLlxuICAgIGlmIChzeW1ib2wud3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsKSB7XG4gICAgICAgIHJldHVybiAoZmlyc3RQb2ludC55IDwgbGFzdFBvaW50LnkpID8ge25lZWRzRmxpcHBpbmc6IHRydWV9IDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBzeW1ib2wncyBmbGlwU3RhdGUgc3RvcmVzIHRoZSBmbGlwIGRlY2lzaW9uIGZyb20gdGhlIHByZXZpb3VzIGZyYW1lLCBhbmQgdGhhdFxuICAgIC8vIGRlY2lzaW9uIGlzIHJldXNlZCB3aGVuIHRoZSBzeW1ib2wgaXMgaW4gdGhlIHJldGFpbiByYW5nZS5cbiAgICBpZiAoc3ltYm9sLmZsaXBTdGF0ZSAhPT0gRmxpcFN0YXRlLnVua25vd24gJiYgaXNJbkZsaXBSZXRhaW5SYW5nZShmaXJzdFBvaW50LCBsYXN0UG9pbnQsIGFzcGVjdFJhdGlvKSkge1xuICAgICAgICByZXR1cm4gKHN5bWJvbC5mbGlwU3RhdGUgPT09IEZsaXBTdGF0ZS5mbGlwUmVxdWlyZWQpID8ge25lZWRzRmxpcHBpbmc6IHRydWV9IDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBmbGlwcGluZyBpcyByZXF1aXJlZCBmb3IgXCJob3Jpem9udGFsXCIgY2FzZS5cbiAgICByZXR1cm4gKGZpcnN0UG9pbnQueCA+IGxhc3RQb2ludC54KSA/IHtuZWVkc0ZsaXBwaW5nOiB0cnVlfSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHBsYWNlR2x5cGhzQWxvbmdMaW5lKHN5bWJvbCwgZm9udFNpemUsIGZsaXAsIGtlZXBVcHJpZ2h0LCBwb3NNYXRyaXgsIGxhYmVsUGxhbmVNYXRyaXgsIGdsQ29vcmRNYXRyaXgsIGdseXBoT2Zmc2V0QXJyYXksIGxpbmVWZXJ0ZXhBcnJheSwgZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBwcm9qZWN0aW9uQ2FjaGUsIGFzcGVjdFJhdGlvLCBnZXRFbGV2YXRpb24sIHByb2plY3Rpb24sIHRpbGVJRCkge1xuICAgIGNvbnN0IGZvbnRTY2FsZSA9IGZvbnRTaXplIC8gMjQ7XG4gICAgY29uc3QgbGluZU9mZnNldFggPSBzeW1ib2wubGluZU9mZnNldFggKiBmb250U2NhbGU7XG4gICAgY29uc3QgbGluZU9mZnNldFkgPSBzeW1ib2wubGluZU9mZnNldFkgKiBmb250U2NhbGU7XG5cbiAgICBsZXQgcGxhY2VkR2x5cGhzO1xuICAgIGlmIChzeW1ib2wubnVtR2x5cGhzID4gMSkge1xuICAgICAgICBjb25zdCBnbHlwaEVuZEluZGV4ID0gc3ltYm9sLmdseXBoU3RhcnRJbmRleCArIHN5bWJvbC5udW1HbHlwaHM7XG4gICAgICAgIGNvbnN0IGxpbmVTdGFydEluZGV4ID0gc3ltYm9sLmxpbmVTdGFydEluZGV4O1xuICAgICAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBzeW1ib2wubGluZVN0YXJ0SW5kZXggKyBzeW1ib2wubGluZUxlbmd0aDtcblxuICAgICAgICAvLyBQbGFjZSB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGdseXBoIGluIHRoZSBsYWJlbCBmaXJzdCwgc28gd2UgY2FuIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gdGhlIG92ZXJhbGwgb3JpZW50YXRpb24gb2YgdGhlIGxhYmVsIGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBuZWVkcyB0byBiZSBmbGlwcGVkIGluIGtlZXBVcHJpZ2h0IG1vZGVcbiAgICAgICAgY29uc3QgZmlyc3RBbmRMYXN0R2x5cGggPSBwbGFjZUZpcnN0QW5kTGFzdEdseXBoKGZvbnRTY2FsZSwgZ2x5cGhPZmZzZXRBcnJheSwgbGluZU9mZnNldFgsIGxpbmVPZmZzZXRZLCBmbGlwLCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBzeW1ib2wsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlLCBnZXRFbGV2YXRpb24sIGZhbHNlLCBwcm9qZWN0aW9uLCB0aWxlSUQpO1xuICAgICAgICBpZiAoIWZpcnN0QW5kTGFzdEdseXBoKSB7XG4gICAgICAgICAgICByZXR1cm4ge25vdEVub3VnaFJvb206IHRydWV9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpcnN0UG9pbnQgPSBwcm9qZWN0KGZpcnN0QW5kTGFzdEdseXBoLmZpcnN0LnBvaW50LCBnbENvb3JkTWF0cml4KS5wb2ludDtcbiAgICAgICAgY29uc3QgbGFzdFBvaW50ID0gcHJvamVjdChmaXJzdEFuZExhc3RHbHlwaC5sYXN0LnBvaW50LCBnbENvb3JkTWF0cml4KS5wb2ludDtcblxuICAgICAgICBpZiAoa2VlcFVwcmlnaHQgJiYgIWZsaXApIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWVudGF0aW9uQ2hhbmdlID0gcmVxdWlyZXNPcmllbnRhdGlvbkNoYW5nZShzeW1ib2wsIGZpcnN0UG9pbnQsIGxhc3RQb2ludCwgYXNwZWN0UmF0aW8pO1xuICAgICAgICAgICAgc3ltYm9sLmZsaXBTdGF0ZSA9IG9yaWVudGF0aW9uQ2hhbmdlICYmIG9yaWVudGF0aW9uQ2hhbmdlLm5lZWRzRmxpcHBpbmcgPyBGbGlwU3RhdGUuZmxpcFJlcXVpcmVkIDogRmxpcFN0YXRlLmZsaXBOb3RSZXF1aXJlZDtcbiAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmllbnRhdGlvbkNoYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHBsYWNlZEdseXBocyA9IFtmaXJzdEFuZExhc3RHbHlwaC5maXJzdF07XG4gICAgICAgIGZvciAobGV0IGdseXBoSW5kZXggPSBzeW1ib2wuZ2x5cGhTdGFydEluZGV4ICsgMTsgZ2x5cGhJbmRleCA8IGdseXBoRW5kSW5kZXggLSAxOyBnbHlwaEluZGV4KyspIHtcbiAgICAgICAgICAgIC8vIFNpbmNlIGZpcnN0IGFuZCBsYXN0IGdseXBoIGZpdCBvbiB0aGUgbGluZSwgd2UncmUgc3VyZSB0aGF0IHRoZSByZXN0IG9mIHRoZSBnbHlwaHMgY2FuIGJlIHBsYWNlZFxuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICAgICAgcGxhY2VkR2x5cGhzLnB1c2gocGxhY2VHbHlwaEFsb25nTGluZShmb250U2NhbGUgKiBnbHlwaE9mZnNldEFycmF5LmdldG9mZnNldFgoZ2x5cGhJbmRleCksIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLnNlZ21lbnQsXG4gICAgICAgICAgICAgICAgbGluZVN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCwgbGluZVZlcnRleEFycmF5LCBsYWJlbFBsYW5lTWF0cml4LCBwcm9qZWN0aW9uQ2FjaGUsIGdldEVsZXZhdGlvbiwgZmFsc2UsIGZhbHNlLCBwcm9qZWN0aW9uLCB0aWxlSUQpKTtcbiAgICAgICAgfVxuICAgICAgICBwbGFjZWRHbHlwaHMucHVzaChmaXJzdEFuZExhc3RHbHlwaC5sYXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPbmx5IGEgc2luZ2xlIGdseXBoIHRvIHBsYWNlXG4gICAgICAgIC8vIFNvLCBkZXRlcm1pbmUgd2hldGhlciB0byBmbGlwIGJhc2VkIG9uIHByb2plY3RlZCBhbmdsZSBvZiB0aGUgbGluZSBzZWdtZW50IGl0J3Mgb25cbiAgICAgICAgaWYgKGtlZXBVcHJpZ2h0ICYmICFmbGlwKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gcHJvamVjdCh0aWxlQW5jaG9yUG9pbnQsIHBvc01hdHJpeCkucG9pbnQ7XG4gICAgICAgICAgICBjb25zdCB0aWxlVmVydGV4SW5kZXggPSAoc3ltYm9sLmxpbmVTdGFydEluZGV4ICsgc3ltYm9sLnNlZ21lbnQgKyAxKTtcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICAgIGNvbnN0IHRpbGVTZWdtZW50RW5kID0gbmV3IFBvaW50KGxpbmVWZXJ0ZXhBcnJheS5nZXR4KHRpbGVWZXJ0ZXhJbmRleCksIGxpbmVWZXJ0ZXhBcnJheS5nZXR5KHRpbGVWZXJ0ZXhJbmRleCkpO1xuICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkVmVydGV4ID0gcHJvamVjdCh0aWxlU2VnbWVudEVuZCwgcG9zTWF0cml4KTtcbiAgICAgICAgICAgIC8vIFdlIGtub3cgdGhlIGFuY2hvciB3aWxsIGJlIGluIHRoZSB2aWV3cG9ydCwgYnV0IHRoZSBlbmQgb2YgdGhlIGxpbmUgc2VnbWVudCBtYXkgYmVcbiAgICAgICAgICAgIC8vIGJlaGluZCB0aGUgcGxhbmUgb2YgdGhlIGNhbWVyYSwgaW4gd2hpY2ggY2FzZSB3ZSBjYW4gdXNlIGEgcG9pbnQgYXQgYW55IGFyYml0cmFyeSAoY2xvc2VyKVxuICAgICAgICAgICAgLy8gcG9pbnQgb24gdGhlIHNlZ21lbnQuXG4gICAgICAgICAgICBjb25zdCBiID0gKHByb2plY3RlZFZlcnRleC5zaWduZWREaXN0YW5jZUZyb21DYW1lcmEgPiAwKSA/XG4gICAgICAgICAgICAgICAgcHJvamVjdGVkVmVydGV4LnBvaW50IDpcbiAgICAgICAgICAgICAgICBwcm9qZWN0VHJ1bmNhdGVkTGluZVNlZ21lbnQodGlsZUFuY2hvclBvaW50LCB0aWxlU2VnbWVudEVuZCwgYSwgMSwgcG9zTWF0cml4LCB1bmRlZmluZWQsIHByb2plY3Rpb24sIHRpbGVJRC5jYW5vbmljYWwpO1xuXG4gICAgICAgICAgICBjb25zdCBvcmllbnRhdGlvbkNoYW5nZSA9IHJlcXVpcmVzT3JpZW50YXRpb25DaGFuZ2Uoc3ltYm9sLCBhLCBiLCBhc3BlY3RSYXRpbyk7XG4gICAgICAgICAgICBzeW1ib2wuZmxpcFN0YXRlID0gb3JpZW50YXRpb25DaGFuZ2UgJiYgb3JpZW50YXRpb25DaGFuZ2UubmVlZHNGbGlwcGluZyA/IEZsaXBTdGF0ZS5mbGlwUmVxdWlyZWQgOiBGbGlwU3RhdGUuZmxpcE5vdFJlcXVpcmVkO1xuICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWVudGF0aW9uQ2hhbmdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgY29uc3Qgc2luZ2xlR2x5cGggPSBwbGFjZUdseXBoQWxvbmdMaW5lKGZvbnRTY2FsZSAqIGdseXBoT2Zmc2V0QXJyYXkuZ2V0b2Zmc2V0WChzeW1ib2wuZ2x5cGhTdGFydEluZGV4KSwgbGluZU9mZnNldFgsIGxpbmVPZmZzZXRZLCBmbGlwLCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBzeW1ib2wuc2VnbWVudCxcbiAgICAgICAgICAgIHN5bWJvbC5saW5lU3RhcnRJbmRleCwgc3ltYm9sLmxpbmVTdGFydEluZGV4ICsgc3ltYm9sLmxpbmVMZW5ndGgsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlLCBnZXRFbGV2YXRpb24sIGZhbHNlLCBmYWxzZSwgcHJvamVjdGlvbiwgdGlsZUlEKTtcbiAgICAgICAgaWYgKCFzaW5nbGVHbHlwaClcbiAgICAgICAgICAgIHJldHVybiB7bm90RW5vdWdoUm9vbTogdHJ1ZX07XG5cbiAgICAgICAgcGxhY2VkR2x5cGhzID0gW3NpbmdsZUdseXBoXTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGdseXBoOiBhbnkgb2YgcGxhY2VkR2x5cGhzKSB7XG4gICAgICAgIGFkZER5bmFtaWNBdHRyaWJ1dGVzKGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgZ2x5cGgucG9pbnQsIGdseXBoLmFuZ2xlKTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBlbGV2YXRlUG9pbnRBbmRQcm9qZWN0KHA6IFBvaW50LCB0aWxlSUQ6IENhbm9uaWNhbFRpbGVJRCwgcG9zTWF0cml4OiBtYXQ0LCBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uLCBnZXRFbGV2YXRpb246ID8oKHA6IFBvaW50KSA9PiBBcnJheTxudW1iZXI+KSk6IHZlYzMge1xuICAgIGNvbnN0IHBvaW50ID0gcHJvamVjdGlvbi5wcm9qZWN0VGlsZVBvaW50KHAueCwgcC55LCB0aWxlSUQpO1xuICAgIGlmICghZ2V0RWxldmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBwcm9qZWN0KHBvaW50LCBwb3NNYXRyaXgsIHBvaW50LnopO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZXZhdGlvbiA9IGdldEVsZXZhdGlvbihwKTtcbiAgICByZXR1cm4gcHJvamVjdChuZXcgUG9pbnQocG9pbnQueCArIGVsZXZhdGlvblswXSwgcG9pbnQueSArIGVsZXZhdGlvblsxXSksIHBvc01hdHJpeCwgcG9pbnQueiArIGVsZXZhdGlvblsyXSk7XG59XG5cbmZ1bmN0aW9uIHByb2plY3RUcnVuY2F0ZWRMaW5lU2VnbWVudChwcmV2aW91c1RpbGVQb2ludDogUG9pbnQsIGN1cnJlbnRUaWxlUG9pbnQ6IFBvaW50LCBwcmV2aW91c1Byb2plY3RlZFBvaW50OiBQb2ludCwgbWluaW11bUxlbmd0aDogbnVtYmVyLCBwcm9qZWN0aW9uTWF0cml4OiBtYXQ0LCBnZXRFbGV2YXRpb246ID8oKHA6IFBvaW50KSA9PiBBcnJheTxudW1iZXI+KSwgcHJvamVjdGlvbjogUHJvamVjdGlvbiwgdGlsZUlEOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICAvLyBXZSBhcmUgYXNzdW1pbmcgXCJwcmV2aW91c1RpbGVQb2ludFwiIHdvbid0IHByb2plY3QgdG8gYSBwb2ludCB3aXRoaW4gb25lIHVuaXQgb2YgdGhlIGNhbWVyYSBwbGFuZVxuICAgIC8vIElmIGl0IGRpZCwgdGhhdCB3b3VsZCBtZWFuIG91ciBsYWJlbCBleHRlbmRlZCBhbGwgdGhlIHdheSBvdXQgZnJvbSB3aXRoaW4gdGhlIHZpZXdwb3J0IHRvIGEgKHZlcnkgZGlzdGFudClcbiAgICAvLyBwb2ludCBuZWFyIHRoZSBwbGFuZSBvZiB0aGUgY2FtZXJhLiBXZSB3b3VsZG4ndCBiZSBhYmxlIHRvIHJlbmRlciB0aGUgbGFiZWwgYW55d2F5IG9uY2UgaXQgY3Jvc3NlZCB0aGVcbiAgICAvLyBwbGFuZSBvZiB0aGUgY2FtZXJhLlxuICAgIGNvbnN0IHVuaXRWZXJ0ZXggPSBwcmV2aW91c1RpbGVQb2ludC5hZGQocHJldmlvdXNUaWxlUG9pbnQuc3ViKGN1cnJlbnRUaWxlUG9pbnQpLl91bml0KCkpO1xuICAgIGNvbnN0IHByb2plY3RlZFVuaXRWZXJ0ZXggPSBlbGV2YXRlUG9pbnRBbmRQcm9qZWN0KHVuaXRWZXJ0ZXgsIHRpbGVJRCwgcHJvamVjdGlvbk1hdHJpeCwgcHJvamVjdGlvbiwgZ2V0RWxldmF0aW9uKS5wb2ludDtcbiAgICBjb25zdCBwcm9qZWN0ZWRVbml0U2VnbWVudCA9IHByZXZpb3VzUHJvamVjdGVkUG9pbnQuc3ViKHByb2plY3RlZFVuaXRWZXJ0ZXgpO1xuXG4gICAgcmV0dXJuIHByZXZpb3VzUHJvamVjdGVkUG9pbnQuYWRkKHByb2plY3RlZFVuaXRTZWdtZW50Ll9tdWx0KG1pbmltdW1MZW5ndGggLyBwcm9qZWN0ZWRVbml0U2VnbWVudC5tYWcoKSkpO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZShwMSwgcDIsIGEpIHtcbiAgICBjb25zdCBiID0gMSAtIGE7XG4gICAgcmV0dXJuIG5ldyBQb2ludChwMS54ICogYiArIHAyLnggKiBhLCBwMS55ICogYiArIHAyLnkgKiBhKTtcbn1cblxuZnVuY3Rpb24gcGxhY2VHbHlwaEFsb25nTGluZShvZmZzZXRYOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRYOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRZOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsaXA6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvclBvaW50OiBQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZUFuY2hvclBvaW50OiBQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yU2VnbWVudDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3RhcnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lRW5kSW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVZlcnRleEFycmF5OiBTeW1ib2xMaW5lVmVydGV4QXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb25DYWNoZToge1tfOiBudW1iZXJdOiBQb2ludH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVsZXZhdGlvbjogPygocDogUG9pbnQpID0+IEFycmF5PG51bWJlcj4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5QYXRoSW5UaWxlQ29vcmRzOiA/Ym9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kR2x5cGg6ID9ib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2plY3Rpb246IFByb2plY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuXG4gICAgY29uc3QgY29tYmluZWRPZmZzZXRYID0gZmxpcCA/XG4gICAgICAgIG9mZnNldFggLSBsaW5lT2Zmc2V0WCA6XG4gICAgICAgIG9mZnNldFggKyBsaW5lT2Zmc2V0WDtcblxuICAgIGxldCBkaXIgPSBjb21iaW5lZE9mZnNldFggPiAwID8gMSA6IC0xO1xuXG4gICAgbGV0IGFuZ2xlID0gMDtcbiAgICBpZiAoZmxpcCkge1xuICAgICAgICAvLyBUaGUgbGFiZWwgbmVlZHMgdG8gYmUgZmxpcHBlZCB0byBrZWVwIHRleHQgdXByaWdodC5cbiAgICAgICAgLy8gSXRlcmF0ZSBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24uXG4gICAgICAgIGRpciAqPSAtMTtcbiAgICAgICAgYW5nbGUgPSBNYXRoLlBJO1xuICAgIH1cblxuICAgIGlmIChkaXIgPCAwKSBhbmdsZSArPSBNYXRoLlBJO1xuXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IGRpciA+IDAgP1xuICAgICAgICBsaW5lU3RhcnRJbmRleCArIGFuY2hvclNlZ21lbnQgOlxuICAgICAgICBsaW5lU3RhcnRJbmRleCArIGFuY2hvclNlZ21lbnQgKyAxO1xuXG4gICAgbGV0IGN1cnJlbnQgPSBhbmNob3JQb2ludDtcbiAgICBsZXQgcHJldiA9IGFuY2hvclBvaW50O1xuICAgIGxldCBkaXN0YW5jZVRvUHJldiA9IDA7XG4gICAgbGV0IGN1cnJlbnRTZWdtZW50RGlzdGFuY2UgPSAwO1xuICAgIGNvbnN0IGFic09mZnNldFggPSBNYXRoLmFicyhjb21iaW5lZE9mZnNldFgpO1xuICAgIGNvbnN0IHBhdGhWZXJ0aWNlcyA9IFtdO1xuICAgIGNvbnN0IHRpbGVQYXRoID0gW107XG4gICAgbGV0IGN1cnJlbnRWZXJ0ZXggPSB0aWxlQW5jaG9yUG9pbnQ7XG5cbiAgICBjb25zdCBwcmV2aW91c1RpbGVQb2ludCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMaW5lVmVydGV4SW5kZXggPSBjdXJyZW50SW5kZXggLSBkaXI7XG4gICAgICAgIHJldHVybiBkaXN0YW5jZVRvUHJldiA9PT0gMCA/XG4gICAgICAgICAgICB0aWxlQW5jaG9yUG9pbnQgOlxuICAgICAgICAgICAgbmV3IFBvaW50KGxpbmVWZXJ0ZXhBcnJheS5nZXR4KHByZXZpb3VzTGluZVZlcnRleEluZGV4KSwgbGluZVZlcnRleEFycmF5LmdldHkocHJldmlvdXNMaW5lVmVydGV4SW5kZXgpKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0VHJ1bmNhdGVkTGluZVNlZ21lbnQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9qZWN0VHJ1bmNhdGVkTGluZVNlZ21lbnQocHJldmlvdXNUaWxlUG9pbnQoKSwgY3VycmVudFZlcnRleCwgcHJldiwgYWJzT2Zmc2V0WCAtIGRpc3RhbmNlVG9QcmV2ICsgMSwgbGFiZWxQbGFuZU1hdHJpeCwgZ2V0RWxldmF0aW9uLCByZXByb2plY3Rpb24sIHRpbGVJRC5jYW5vbmljYWwpO1xuICAgIH07XG5cbiAgICB3aGlsZSAoZGlzdGFuY2VUb1ByZXYgKyBjdXJyZW50U2VnbWVudERpc3RhbmNlIDw9IGFic09mZnNldFgpIHtcbiAgICAgICAgY3VycmVudEluZGV4ICs9IGRpcjtcblxuICAgICAgICAvLyBvZmZzZXQgZG9lcyBub3QgZml0IG9uIHRoZSBwcm9qZWN0ZWQgbGluZVxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgbGluZVN0YXJ0SW5kZXggfHwgY3VycmVudEluZGV4ID49IGxpbmVFbmRJbmRleClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHByZXYgPSBjdXJyZW50O1xuICAgICAgICBwYXRoVmVydGljZXMucHVzaChjdXJyZW50KTtcbiAgICAgICAgaWYgKHJldHVyblBhdGhJblRpbGVDb29yZHMpIHRpbGVQYXRoLnB1c2goY3VycmVudFZlcnRleCB8fCBwcmV2aW91c1RpbGVQb2ludCgpKTtcblxuICAgICAgICBjdXJyZW50ID0gcHJvamVjdGlvbkNhY2hlW2N1cnJlbnRJbmRleF07XG4gICAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRWZXJ0ZXggPSBuZXcgUG9pbnQobGluZVZlcnRleEFycmF5LmdldHgoY3VycmVudEluZGV4KSwgbGluZVZlcnRleEFycmF5LmdldHkoY3VycmVudEluZGV4KSk7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gZWxldmF0ZVBvaW50QW5kUHJvamVjdChjdXJyZW50VmVydGV4LCB0aWxlSUQuY2Fub25pY2FsLCBsYWJlbFBsYW5lTWF0cml4LCByZXByb2plY3Rpb24sIGdldEVsZXZhdGlvbik7XG4gICAgICAgICAgICBpZiAocHJvamVjdGlvbi5zaWduZWREaXN0YW5jZUZyb21DYW1lcmEgPiAwKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHByb2plY3Rpb25DYWNoZVtjdXJyZW50SW5kZXhdID0gcHJvamVjdGlvbi5wb2ludDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHZlcnRleCBpcyBiZWhpbmQgdGhlIHBsYW5lIG9mIHRoZSBjYW1lcmEsIHNvIHdlIGNhbid0IHByb2plY3QgaXRcbiAgICAgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSdsbCBjcmVhdGUgYSB2ZXJ0ZXggYWxvbmcgdGhlIGxpbmUgdGhhdCdzIGZhciBlbm91Z2ggdG8gaW5jbHVkZSB0aGUgZ2x5cGhcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBjYWNoZSBiZWNhdXNlIHRoZSBuZXcgdmVydGV4IG1pZ2h0IG5vdCBiZSBmYXIgZW5vdWdoIG91dCBmb3IgZnV0dXJlIGdseXBocyBvbiB0aGUgc2FtZSBzZWdtZW50XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGdldFRydW5jYXRlZExpbmVTZWdtZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50VmVydGV4ID0gbnVsbDsgLy8gbnVsbCBzdGFsZSBkYXRhXG4gICAgICAgIH1cblxuICAgICAgICBkaXN0YW5jZVRvUHJldiArPSBjdXJyZW50U2VnbWVudERpc3RhbmNlO1xuICAgICAgICBjdXJyZW50U2VnbWVudERpc3RhbmNlID0gcHJldi5kaXN0KGN1cnJlbnQpO1xuICAgIH1cblxuICAgIGlmIChlbmRHbHlwaCAmJiBnZXRFbGV2YXRpb24pIHtcbiAgICAgICAgLy8gRm9yIHRlcnJhaW4sIGFsd2F5cyB0cnVuY2F0ZSBlbmQgcG9pbnRzIGluIG9yZGVyIHRvIGhhbmRsZSB0ZXJyYWluIGN1cnZhdHVyZS5cbiAgICAgICAgLy8gSWYgcHJldmlvdXNseSB0cnVuY2F0ZWQsIG9uIHNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA8IDAsIGRvbid0IGRvIGl0LlxuICAgICAgICAvLyBDYWNoZSBhcyBlbmQgcG9pbnQuIFRoZSBjYWNoZSBpcyBjbGVhcmVkIGlmIHRoZXJlIGlzIG5lZWQgZm9yIGZsaXBwaW5nIGluIHVwZGF0ZUxpbmVMYWJlbHMuXG4gICAgICAgIGN1cnJlbnRWZXJ0ZXggPSBjdXJyZW50VmVydGV4IHx8IG5ldyBQb2ludChsaW5lVmVydGV4QXJyYXkuZ2V0eChjdXJyZW50SW5kZXgpLCBsaW5lVmVydGV4QXJyYXkuZ2V0eShjdXJyZW50SW5kZXgpKTtcbiAgICAgICAgcHJvamVjdGlvbkNhY2hlW2N1cnJlbnRJbmRleF0gPSBjdXJyZW50ID0gKHByb2plY3Rpb25DYWNoZVtjdXJyZW50SW5kZXhdID09PSB1bmRlZmluZWQpID8gY3VycmVudCA6IGdldFRydW5jYXRlZExpbmVTZWdtZW50KCk7XG4gICAgICAgIGN1cnJlbnRTZWdtZW50RGlzdGFuY2UgPSBwcmV2LmRpc3QoY3VycmVudCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHBvaW50IGlzIG9uIHRoZSBjdXJyZW50IHNlZ21lbnQuIEludGVycG9sYXRlIHRvIGZpbmQgaXQuXG4gICAgY29uc3Qgc2VnbWVudEludGVycG9sYXRpb25UID0gKGFic09mZnNldFggLSBkaXN0YW5jZVRvUHJldikgLyBjdXJyZW50U2VnbWVudERpc3RhbmNlO1xuICAgIGNvbnN0IHByZXZUb0N1cnJlbnQgPSBjdXJyZW50LnN1YihwcmV2KTtcbiAgICBjb25zdCBwID0gcHJldlRvQ3VycmVudC5tdWx0KHNlZ21lbnRJbnRlcnBvbGF0aW9uVCkuX2FkZChwcmV2KTtcblxuICAgIC8vIG9mZnNldCB0aGUgcG9pbnQgZnJvbSB0aGUgbGluZSB0byB0ZXh0LW9mZnNldCBhbmQgaWNvbi1vZmZzZXRcbiAgICBpZiAobGluZU9mZnNldFkpIHAuX2FkZChwcmV2VG9DdXJyZW50Ll91bml0KCkuX3BlcnAoKS5fbXVsdChsaW5lT2Zmc2V0WSAqIGRpcikpO1xuXG4gICAgY29uc3Qgc2VnbWVudEFuZ2xlID0gYW5nbGUgKyBNYXRoLmF0YW4yKGN1cnJlbnQueSAtIHByZXYueSwgY3VycmVudC54IC0gcHJldi54KTtcblxuICAgIHBhdGhWZXJ0aWNlcy5wdXNoKHApO1xuICAgIGlmIChyZXR1cm5QYXRoSW5UaWxlQ29vcmRzKSB7XG4gICAgICAgIGN1cnJlbnRWZXJ0ZXggPSBjdXJyZW50VmVydGV4IHx8IG5ldyBQb2ludChsaW5lVmVydGV4QXJyYXkuZ2V0eChjdXJyZW50SW5kZXgpLCBsaW5lVmVydGV4QXJyYXkuZ2V0eShjdXJyZW50SW5kZXgpKTtcbiAgICAgICAgY29uc3QgcHJldlZlcnRleCA9IHRpbGVQYXRoLmxlbmd0aCA+IDAgPyB0aWxlUGF0aFt0aWxlUGF0aC5sZW5ndGggLSAxXSA6IGN1cnJlbnRWZXJ0ZXg7XG4gICAgICAgIHRpbGVQYXRoLnB1c2goaW50ZXJwb2xhdGUocHJldlZlcnRleCwgY3VycmVudFZlcnRleCwgc2VnbWVudEludGVycG9sYXRpb25UKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9pbnQ6IHAsXG4gICAgICAgIGFuZ2xlOiBzZWdtZW50QW5nbGUsXG4gICAgICAgIHBhdGg6IHBhdGhWZXJ0aWNlcyxcbiAgICAgICAgdGlsZVBhdGhcbiAgICB9O1xufVxuXG5jb25zdCBoaWRkZW5HbHlwaEF0dHJpYnV0ZXMgPSBuZXcgRmxvYXQzMkFycmF5KFstSW5maW5pdHksIC1JbmZpbml0eSwgMCwgLUluZmluaXR5LCAtSW5maW5pdHksIDAsIC1JbmZpbml0eSwgLUluZmluaXR5LCAwLCAtSW5maW5pdHksIC1JbmZpbml0eSwgMF0pO1xuXG4vLyBIaWRlIHRoZW0gYnkgbW92aW5nIHRoZW0gb2Zmc2NyZWVuLiBXZSBzdGlsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoZSBidWZmZXJcbi8vIGJlY2F1c2UgdGhlIGR5bmFtaWMgYnVmZmVyIGlzIHBhaXJlZCB3aXRoIGEgc3RhdGljIGJ1ZmZlciB0aGF0IGRvZXNuJ3QgZ2V0IHVwZGF0ZWQuXG5mdW5jdGlvbiBoaWRlR2x5cGhzKG51bTogbnVtYmVyLCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXk6IFN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZHluYW1pY0xheW91dFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICAgICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LnJlc2l6ZShvZmZzZXQgKyA0KTtcbiAgICAgICAgLy8gU2luY2UgYWxsIGhpZGRlbiBnbHlwaHMgaGF2ZSB0aGUgc2FtZSBhdHRyaWJ1dGVzLCB3ZSBjYW4gYnVpbGQgdXAgdGhlIGFycmF5IGZhc3RlciB3aXRoIGEgc2luZ2xlIGNhbGwgdG8gRmxvYXQzMkFycmF5LnNldFxuICAgICAgICAvLyBmb3IgZWFjaCBzZXQgb2YgZm91ciB2ZXJ0aWNlcywgaW5zdGVhZCBvZiBjYWxsaW5nIGFkZER5bmFtaWNBdHRyaWJ1dGVzIGZvciBlYWNoIHZlcnRleC5cbiAgICAgICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmZsb2F0MzIuc2V0KGhpZGRlbkdseXBoQXR0cmlidXRlcywgb2Zmc2V0ICogMyk7XG4gICAgfVxufVxuXG4vLyBGb3IgbGluZSBsYWJlbCBsYXlvdXQsIHdlJ3JlIG5vdCB1c2luZyB6IG91dHB1dCBhbmQgb3VyIHcgaW5wdXQgaXMgYWx3YXlzIDFcbi8vIFRoaXMgY3VzdG9tIG1hdHJpeCB0cmFuc2Zvcm1hdGlvbiBpZ25vcmVzIHRob3NlIGNvbXBvbmVudHMgdG8gbWFrZSBwcm9qZWN0aW9uIGZhc3RlclxuZnVuY3Rpb24geHlUcmFuc2Zvcm1NYXQ0KG91dDogdmVjNCwgYTogdmVjNCwgbTogbWF0NCkge1xuICAgIGNvbnN0IHggPSBhWzBdLCB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVsxMl07XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bMTNdO1xuICAgIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IGNsaXBMaW5lIGZyb20gJy4vY2xpcF9saW5lLmpzJztcbmltcG9ydCBQYXRoSW50ZXJwb2xhdG9yIGZyb20gJy4vcGF0aF9pbnRlcnBvbGF0b3IuanMnO1xuXG5pbXBvcnQgKiBhcyBpbnRlcnNlY3Rpb25UZXN0cyBmcm9tICcuLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cy5qcyc7XG5pbXBvcnQgR3JpZCBmcm9tICcuL2dyaWRfaW5kZXguanMnO1xuaW1wb3J0IHttYXQ0LCB2ZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IE9ORV9FTSBmcm9tICcuLi9zeW1ib2wvb25lX2VtLmpzJztcbmltcG9ydCB7Rk9HX1NZTUJPTF9DTElQUElOR19USFJFU0hPTEQsIGdldEZvZ09wYWNpdHlBdFRpbGVDb29yZH0gZnJvbSAnLi4vc3R5bGUvZm9nX2hlbHBlcnMuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyBwcm9qZWN0aW9uIGZyb20gJy4uL3N5bWJvbC9wcm9qZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtTaW5nbGVDb2xsaXNpb25Cb3h9IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIEdseXBoT2Zmc2V0QXJyYXksXG4gICAgU3ltYm9sTGluZVZlcnRleEFycmF5XG59IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0ZvZ1N0YXRlfSBmcm9tICcuLi9zdHlsZS9mb2dfaGVscGVycy5qcyc7XG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcblxuLy8gV2hlbiBhIHN5bWJvbCBjcm9zc2VzIHRoZSBlZGdlIHRoYXQgY2F1c2VzIGl0IHRvIGJlIGluY2x1ZGVkIGluXG4vLyBjb2xsaXNpb24gZGV0ZWN0aW9uLCBpdCB3aWxsIGNhdXNlIGNoYW5nZXMgaW4gdGhlIHN5bWJvbHMgYXJvdW5kXG4vLyBpdC4gVGhpcyBjb25zdGFudCBzcGVjaWZpZXMgaG93IG1hbnkgcGl4ZWxzIHRvIHBhZCB0aGUgZWRnZSBvZlxuLy8gdGhlIHZpZXdwb3J0IGZvciBjb2xsaXNpb24gZGV0ZWN0aW9uIHNvIHRoYXQgdGhlIGJ1bGsgb2YgdGhlIGNoYW5nZXNcbi8vIG9jY3VyIG9mZnNjcmVlbi4gTWFraW5nIHRoaXMgY29uc3RhbnQgZ3JlYXRlciBpbmNyZWFzZXMgbGFiZWxcbi8vIHN0YWJpbGl0eSwgYnV0IGl0J3MgZXhwZW5zaXZlLlxuY29uc3Qgdmlld3BvcnRQYWRkaW5nID0gMTAwO1xuXG4vKipcbiAqIEEgY29sbGlzaW9uIGluZGV4IHVzZWQgdG8gcHJldmVudCBzeW1ib2xzIGZyb20gb3ZlcmxhcHBpbmcuIEl0IGtlZXAgdHJhY2tzIG9mXG4gKiB3aGVyZSBwcmV2aW91cyBzeW1ib2xzIGhhdmUgYmVlbiBwbGFjZWQgYW5kIGlzIHVzZWQgdG8gY2hlY2sgaWYgYSBuZXdcbiAqIHN5bWJvbCBvdmVybGFwcyB3aXRoIGFueSBwcmV2aW91c2x5IGFkZGVkIHN5bWJvbHMuXG4gKlxuICogVGhlcmUgYXJlIHR3byBzdGVwcyB0byBpbnNlcnRpb246IGZpcnN0IHBsYWNlQ29sbGlzaW9uQm94L0NpcmNsZXMgY2hlY2tzIGlmXG4gKiB0aGVyZSdzIHJvb20gZm9yIGEgc3ltYm9sLCB0aGVuIGluc2VydENvbGxpc2lvbkJveC9DaXJjbGVzIGFjdHVhbGx5IHB1dHMgdGhlXG4gKiBzeW1ib2wgaW4gdGhlIGluZGV4LiBUaGUgdHdvIHN0ZXAgcHJvY2VzcyBhbGxvd3MgcGFpcmVkIHN5bWJvbHMgdG8gYmUgaW5zZXJ0ZWRcbiAqIHRvZ2V0aGVyIGV2ZW4gaWYgdGhleSBvdmVybGFwLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvbGxpc2lvbkluZGV4IHtcbiAgICBncmlkOiBHcmlkO1xuICAgIGlnbm9yZWRHcmlkOiBHcmlkO1xuICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtO1xuICAgIHBpdGNoZmFjdG9yOiBudW1iZXI7XG4gICAgc2NyZWVuUmlnaHRCb3VuZGFyeTogbnVtYmVyO1xuICAgIHNjcmVlbkJvdHRvbUJvdW5kYXJ5OiBudW1iZXI7XG4gICAgZ3JpZFJpZ2h0Qm91bmRhcnk6IG51bWJlcjtcbiAgICBncmlkQm90dG9tQm91bmRhcnk6IG51bWJlcjtcbiAgICBmb2dTdGF0ZTogP0ZvZ1N0YXRlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICBmb2dTdGF0ZTogP0ZvZ1N0YXRlLFxuICAgICAgICBncmlkOiBHcmlkID0gbmV3IEdyaWQodHJhbnNmb3JtLndpZHRoICsgMiAqIHZpZXdwb3J0UGFkZGluZywgdHJhbnNmb3JtLmhlaWdodCArIDIgKiB2aWV3cG9ydFBhZGRpbmcsIDI1KSxcbiAgICAgICAgaWdub3JlZEdyaWQ6IEdyaWQgPSBuZXcgR3JpZCh0cmFuc2Zvcm0ud2lkdGggKyAyICogdmlld3BvcnRQYWRkaW5nLCB0cmFuc2Zvcm0uaGVpZ2h0ICsgMiAqIHZpZXdwb3J0UGFkZGluZywgMjUpXG4gICAgKSB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuXG4gICAgICAgIHRoaXMuZ3JpZCA9IGdyaWQ7XG4gICAgICAgIHRoaXMuaWdub3JlZEdyaWQgPSBpZ25vcmVkR3JpZDtcbiAgICAgICAgdGhpcy5waXRjaGZhY3RvciA9IE1hdGguY29zKHRyYW5zZm9ybS5fcGl0Y2gpICogdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U7XG5cbiAgICAgICAgdGhpcy5zY3JlZW5SaWdodEJvdW5kYXJ5ID0gdHJhbnNmb3JtLndpZHRoICsgdmlld3BvcnRQYWRkaW5nO1xuICAgICAgICB0aGlzLnNjcmVlbkJvdHRvbUJvdW5kYXJ5ID0gdHJhbnNmb3JtLmhlaWdodCArIHZpZXdwb3J0UGFkZGluZztcbiAgICAgICAgdGhpcy5ncmlkUmlnaHRCb3VuZGFyeSA9IHRyYW5zZm9ybS53aWR0aCArIDIgKiB2aWV3cG9ydFBhZGRpbmc7XG4gICAgICAgIHRoaXMuZ3JpZEJvdHRvbUJvdW5kYXJ5ID0gdHJhbnNmb3JtLmhlaWdodCArIDIgKiB2aWV3cG9ydFBhZGRpbmc7XG4gICAgICAgIHRoaXMuZm9nU3RhdGUgPSBmb2dTdGF0ZTtcbiAgICB9XG5cbiAgICBwbGFjZUNvbGxpc2lvbkJveChzY2FsZTogbnVtYmVyLCBjb2xsaXNpb25Cb3g6IFNpbmdsZUNvbGxpc2lvbkJveCwgc2hpZnQ6IFBvaW50LCBhbGxvd092ZXJsYXA6IGJvb2xlYW4sIHRleHRQaXhlbFJhdGlvOiBudW1iZXIsIHBvc01hdHJpeDogbWF0NCwgY29sbGlzaW9uR3JvdXBQcmVkaWNhdGU/OiBhbnkpOiB7IGJveDogQXJyYXk8bnVtYmVyPiwgb2Zmc2NyZWVuOiBib29sZWFuIH0ge1xuICAgICAgICBhc3NlcnQoIXRoaXMudHJhbnNmb3JtLmVsZXZhdGlvbiB8fCBjb2xsaXNpb25Cb3guZWxldmF0aW9uICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICAgIGxldCBhbmNob3JYID0gY29sbGlzaW9uQm94LnByb2plY3RlZEFuY2hvclg7XG4gICAgICAgIGxldCBhbmNob3JZID0gY29sbGlzaW9uQm94LnByb2plY3RlZEFuY2hvclk7XG4gICAgICAgIGxldCBhbmNob3JaID0gY29sbGlzaW9uQm94LnByb2plY3RlZEFuY2hvclo7XG5cbiAgICAgICAgLy8gQXBwbHkgZWxldmF0aW9uIHZlY3RvciB0byB0aGUgYW5jaG9yIHBvaW50XG4gICAgICAgIGNvbnN0IGVsZXZhdGlvbiA9IGNvbGxpc2lvbkJveC5lbGV2YXRpb247XG4gICAgICAgIGNvbnN0IHRpbGVJRCA9IGNvbGxpc2lvbkJveC50aWxlSUQ7XG4gICAgICAgIGlmIChlbGV2YXRpb24gJiYgdGlsZUlEKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlVHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvblxuICAgICAgICAgICAgICAgIC5jcmVhdGVUaWxlVHJhbnNmb3JtKHRoaXMudHJhbnNmb3JtLCB0aGlzLnRyYW5zZm9ybS53b3JsZFNpemUpO1xuICAgICAgICAgICAgY29uc3QgdXAgPSB0aWxlVHJhbnNmb3JtLnVwVmVjdG9yKHRpbGVJRC5jYW5vbmljYWwsIGNvbGxpc2lvbkJveC50aWxlQW5jaG9yWCwgY29sbGlzaW9uQm94LnRpbGVBbmNob3JZKTtcbiAgICAgICAgICAgIGNvbnN0IHVwU2NhbGUgPSB0aWxlVHJhbnNmb3JtLnVwVmVjdG9yU2NhbGUodGlsZUlELmNhbm9uaWNhbCk7XG5cbiAgICAgICAgICAgIGFuY2hvclggKz0gdXBbMF0gKiBlbGV2YXRpb24gKiB1cFNjYWxlO1xuICAgICAgICAgICAgYW5jaG9yWSArPSB1cFsxXSAqIGVsZXZhdGlvbiAqIHVwU2NhbGU7XG4gICAgICAgICAgICBhbmNob3JaICs9IHVwWzJdICogZWxldmF0aW9uICogdXBTY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb2plY3RlZFBvaW50ID0gdGhpcy5wcm9qZWN0QW5kR2V0UGVyc3BlY3RpdmVSYXRpbyhwb3NNYXRyaXgsIGFuY2hvclgsIGFuY2hvclksIGFuY2hvclosIGNvbGxpc2lvbkJveC50aWxlSUQpO1xuXG4gICAgICAgIGNvbnN0IHRpbGVUb1ZpZXdwb3J0ID0gdGV4dFBpeGVsUmF0aW8gKiBwcm9qZWN0ZWRQb2ludC5wZXJzcGVjdGl2ZVJhdGlvO1xuICAgICAgICBjb25zdCB0bFggPSAoY29sbGlzaW9uQm94LngxICogc2NhbGUgKyBzaGlmdC54IC0gY29sbGlzaW9uQm94LnBhZGRpbmcpICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC54O1xuICAgICAgICBjb25zdCB0bFkgPSAoY29sbGlzaW9uQm94LnkxICogc2NhbGUgKyBzaGlmdC55IC0gY29sbGlzaW9uQm94LnBhZGRpbmcpICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC55O1xuICAgICAgICBjb25zdCBiclggPSAoY29sbGlzaW9uQm94LngyICogc2NhbGUgKyBzaGlmdC54ICsgY29sbGlzaW9uQm94LnBhZGRpbmcpICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC54O1xuICAgICAgICBjb25zdCBiclkgPSAoY29sbGlzaW9uQm94LnkyICogc2NhbGUgKyBzaGlmdC55ICsgY29sbGlzaW9uQm94LnBhZGRpbmcpICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC55O1xuICAgICAgICAvLyBDbGlwIGF0IDEwIHRpbWVzIHRoZSBkaXN0YW5jZSBvZiB0aGUgbWFwIGNlbnRlciBvciwgc2FpZCBvdGhlcndpc2UsIHdoZW4gdGhlIGxhYmVsXG4gICAgICAgIC8vIHdvdWxkIGJlIGRyYXduIGF0IDEwJSB0aGUgc2l6ZSBvZiB0aGUgZmVhdHVyZXMgYXJvdW5kIGl0IHdpdGhvdXQgc2NhbGluZy4gUmVmZXI6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLW5hdGl2ZS93aWtpL1RleHQtUmVuZGVyaW5nI3BlcnNwZWN0aXZlLXNjYWxpbmdcbiAgICAgICAgLy8gMC41NSA9PT0gcHJvamVjdGlvbi5nZXRQZXJzcGVjdGl2ZVJhdGlvKGNhbWVyYV90b19jZW50ZXIsIGNhbWVyYV90b19jZW50ZXIgKiAxMClcbiAgICAgICAgY29uc3QgbWluUGVyc3BlY3RpdmVSYXRpbyA9IDAuNTU7XG4gICAgICAgIGNvbnN0IGlzQ2xpcHBlZCA9IHByb2plY3RlZFBvaW50LnBlcnNwZWN0aXZlUmF0aW8gPD0gbWluUGVyc3BlY3RpdmVSYXRpbyB8fCBwcm9qZWN0ZWRQb2ludC5hYm92ZUhvcml6b247XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5zaWRlR3JpZCh0bFgsIHRsWSwgYnJYLCBiclkpIHx8XG4gICAgICAgICAgICAoIWFsbG93T3ZlcmxhcCAmJiB0aGlzLmdyaWQuaGl0VGVzdCh0bFgsIHRsWSwgYnJYLCBiclksIGNvbGxpc2lvbkdyb3VwUHJlZGljYXRlKSkgfHxcbiAgICAgICAgICAgIGlzQ2xpcHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBib3g6IFtdLFxuICAgICAgICAgICAgICAgIG9mZnNjcmVlbjogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYm94OiBbdGxYLCB0bFksIGJyWCwgYnJZXSxcbiAgICAgICAgICAgIG9mZnNjcmVlbjogdGhpcy5pc09mZnNjcmVlbih0bFgsIHRsWSwgYnJYLCBiclkpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcGxhY2VDb2xsaXNpb25DaXJjbGVzKGFsbG93T3ZlcmxhcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sOiBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVWZXJ0ZXhBcnJheTogU3ltYm9sTGluZVZlcnRleEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaE9mZnNldEFycmF5OiBHbHlwaE9mZnNldEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXg6IG1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsVG9TY3JlZW5NYXRyaXg/OiBtYXQ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uQ2lyY2xlczogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25Hcm91cFByZWRpY2F0ZT86IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlUGl4ZWxEaWFtZXRlcjogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0UGl4ZWxQYWRkaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6IHsgY2lyY2xlczogQXJyYXk8bnVtYmVyPiwgb2Zmc2NyZWVuOiBib29sZWFuLCBjb2xsaXNpb25EZXRlY3RlZDogYm9vbGVhbiB9IHtcbiAgICAgICAgY29uc3QgcGxhY2VkQ29sbGlzaW9uQ2lyY2xlcyA9IFtdO1xuICAgICAgICBjb25zdCBlbGV2YXRpb24gPSB0aGlzLnRyYW5zZm9ybS5lbGV2YXRpb247XG4gICAgICAgIGNvbnN0IHRpbGVUcmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybS5wcm9qZWN0aW9uLmNyZWF0ZVRpbGVUcmFuc2Zvcm0odGhpcy50cmFuc2Zvcm0sIHRoaXMudHJhbnNmb3JtLndvcmxkU2l6ZSk7XG4gICAgICAgIGNvbnN0IGdldEVsZXZhdGlvbiA9IGVsZXZhdGlvbiA/IGVsZXZhdGlvbi5nZXRBdFRpbGVPZmZzZXRGdW5jKHRpbGVJRCwgdGlsZVRyYW5zZm9ybSkgOiAoXyA9PiBbMCwgMCwgMF0pO1xuICAgICAgICBjb25zdCB0aWxlVW5pdEFuY2hvclBvaW50ID0gbmV3IFBvaW50KHN5bWJvbC50aWxlQW5jaG9yWCwgc3ltYm9sLnRpbGVBbmNob3JZKTtcbiAgICAgICAgY29uc3QgcHJvamVjdGVkQW5jaG9yID0gdGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbi5wcm9qZWN0VGlsZVBvaW50KHN5bWJvbC50aWxlQW5jaG9yWCwgc3ltYm9sLnRpbGVBbmNob3JZLCB0aWxlSUQuY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgYW5jaG9yRWxldmF0aW9uID0gZ2V0RWxldmF0aW9uKHRpbGVVbml0QW5jaG9yUG9pbnQpO1xuICAgICAgICBjb25zdCBlbGV2YXRlZEFuY2hvciA9IFtwcm9qZWN0ZWRBbmNob3IueCArIGFuY2hvckVsZXZhdGlvblswXSwgcHJvamVjdGVkQW5jaG9yLnkgKyBhbmNob3JFbGV2YXRpb25bMV0sIHByb2plY3RlZEFuY2hvci56ICsgYW5jaG9yRWxldmF0aW9uWzJdXTtcbiAgICAgICAgY29uc3Qgc2NyZWVuQW5jaG9yUG9pbnQgPSB0aGlzLnByb2plY3RBbmRHZXRQZXJzcGVjdGl2ZVJhdGlvKHBvc01hdHJpeCwgZWxldmF0ZWRBbmNob3JbMF0sIGVsZXZhdGVkQW5jaG9yWzFdLCBlbGV2YXRlZEFuY2hvclsyXSwgdGlsZUlEKTtcbiAgICAgICAgY29uc3Qge3BlcnNwZWN0aXZlUmF0aW99ID0gc2NyZWVuQW5jaG9yUG9pbnQ7XG4gICAgICAgIGNvbnN0IGxhYmVsUGxhbmVGb250U2l6ZSA9IHBpdGNoV2l0aE1hcCA/IGZvbnRTaXplIC8gcGVyc3BlY3RpdmVSYXRpbyA6IGZvbnRTaXplICogcGVyc3BlY3RpdmVSYXRpbztcbiAgICAgICAgY29uc3QgbGFiZWxQbGFuZUZvbnRTY2FsZSA9IGxhYmVsUGxhbmVGb250U2l6ZSAvIE9ORV9FTTtcbiAgICAgICAgY29uc3QgbGFiZWxQbGFuZUFuY2hvclBvaW50ID0gcHJvamVjdGlvbi5wcm9qZWN0KG5ldyBQb2ludChlbGV2YXRlZEFuY2hvclswXSwgZWxldmF0ZWRBbmNob3JbMV0pLCBsYWJlbFBsYW5lTWF0cml4LCBlbGV2YXRlZEFuY2hvclsyXSkucG9pbnQ7XG5cbiAgICAgICAgY29uc3QgcHJvamVjdGlvbkNhY2hlID0ge307XG4gICAgICAgIGNvbnN0IGxpbmVPZmZzZXRYID0gc3ltYm9sLmxpbmVPZmZzZXRYICogbGFiZWxQbGFuZUZvbnRTY2FsZTtcbiAgICAgICAgY29uc3QgbGluZU9mZnNldFkgPSBzeW1ib2wubGluZU9mZnNldFkgKiBsYWJlbFBsYW5lRm9udFNjYWxlO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0QW5kTGFzdEdseXBoID0gc2NyZWVuQW5jaG9yUG9pbnQuc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhID4gMCA/IHByb2plY3Rpb24ucGxhY2VGaXJzdEFuZExhc3RHbHlwaChcbiAgICAgICAgICAgIGxhYmVsUGxhbmVGb250U2NhbGUsXG4gICAgICAgICAgICBnbHlwaE9mZnNldEFycmF5LFxuICAgICAgICAgICAgbGluZU9mZnNldFgsXG4gICAgICAgICAgICBsaW5lT2Zmc2V0WSxcbiAgICAgICAgICAgIC8qZmxpcCovIGZhbHNlLFxuICAgICAgICAgICAgbGFiZWxQbGFuZUFuY2hvclBvaW50LFxuICAgICAgICAgICAgdGlsZVVuaXRBbmNob3JQb2ludCxcbiAgICAgICAgICAgIHN5bWJvbCxcbiAgICAgICAgICAgIGxpbmVWZXJ0ZXhBcnJheSxcbiAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICAgICBwcm9qZWN0aW9uQ2FjaGUsXG4gICAgICAgICAgICBlbGV2YXRpb24gJiYgIXBpdGNoV2l0aE1hcCA/IGdldEVsZXZhdGlvbiA6IG51bGwsIC8vIHBpdGNoV2l0aE1hcDogbm8gbmVlZCB0byBzYW1wbGUgZWxldmF0aW9uIGFzIGl0IGhhcyBubyBlZmZlY3Qgd2hlbiBwcm9qZWN0aW5nIHVzaW5nIHNjYWxlL3JvdGF0ZSB0byB0aWxlIHNwYWNlIGxhYmVsUGxhbmVNYXRyaXguXG4gICAgICAgICAgICBwaXRjaFdpdGhNYXAgJiYgISFlbGV2YXRpb24sXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5wcm9qZWN0aW9uLFxuICAgICAgICAgICAgdGlsZUlEXG4gICAgICAgICkgOiBudWxsO1xuXG4gICAgICAgIGxldCBjb2xsaXNpb25EZXRlY3RlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaW5HcmlkID0gZmFsc2U7XG4gICAgICAgIGxldCBlbnRpcmVseU9mZnNjcmVlbiA9IHRydWU7XG5cbiAgICAgICAgaWYgKGZpcnN0QW5kTGFzdEdseXBoICYmICFzY3JlZW5BbmNob3JQb2ludC5hYm92ZUhvcml6b24pIHtcbiAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IGNpcmNsZVBpeGVsRGlhbWV0ZXIgKiAwLjUgKiBwZXJzcGVjdGl2ZVJhdGlvICsgdGV4dFBpeGVsUGFkZGluZztcbiAgICAgICAgICAgIGNvbnN0IHNjcmVlblBsYW5lTWluID0gbmV3IFBvaW50KC12aWV3cG9ydFBhZGRpbmcsIC12aWV3cG9ydFBhZGRpbmcpO1xuICAgICAgICAgICAgY29uc3Qgc2NyZWVuUGxhbmVNYXggPSBuZXcgUG9pbnQodGhpcy5zY3JlZW5SaWdodEJvdW5kYXJ5LCB0aGlzLnNjcmVlbkJvdHRvbUJvdW5kYXJ5KTtcbiAgICAgICAgICAgIGNvbnN0IGludGVycG9sYXRvciA9IG5ldyBQYXRoSW50ZXJwb2xhdG9yKCk7XG5cbiAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhIHByb2plY3RlZCBwYXRoIGZyb20gcHJvamVjdGVkIGxpbmUgdmVydGljZXMuIEFuY2hvciBwb2ludHMgYXJlIGlnbm9yZWQgYW5kIHJlbW92ZWRcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gZmlyc3RBbmRMYXN0R2x5cGguZmlyc3Q7XG4gICAgICAgICAgICBjb25zdCBsYXN0ID0gZmlyc3RBbmRMYXN0R2x5cGgubGFzdDtcblxuICAgICAgICAgICAgbGV0IHByb2plY3RlZFBhdGggPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBmaXJzdC5wYXRoLmxlbmd0aCAtIDE7IGkgPj0gMTsgaS0tKSB7XG4gICAgICAgICAgICAgICAgcHJvamVjdGVkUGF0aC5wdXNoKGZpcnN0LnBhdGhbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsYXN0LnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0ZWRQYXRoLnB1c2gobGFzdC5wYXRoW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydChwcm9qZWN0ZWRQYXRoLmxlbmd0aCA+PSAyKTtcblxuICAgICAgICAgICAgLy8gVG9sZXJhdGUgYSBzbGlnaHRseSBsb25nZXIgZGlzdGFuY2UgdGhhbiBvbmUgZGlhbWV0ZXIgYmV0d2VlbiB0d28gYWRqYWNlbnQgY2lyY2xlc1xuICAgICAgICAgICAgY29uc3QgY2lyY2xlRGlzdCA9IHJhZGl1cyAqIDIuNTtcblxuICAgICAgICAgICAgLy8gVGhlIHBhdGggbWlnaHQgbmVlZCB0byBiZSBjb252ZXJ0ZWQgaW50byBzY3JlZW4gc3BhY2UgaWYgYSBwaXRjaGVkIG1hcCBpcyB1c2VkIGFzIHRoZSBsYWJlbCBzcGFjZVxuICAgICAgICAgICAgaWYgKGxhYmVsVG9TY3JlZW5NYXRyaXgpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQocGl0Y2hXaXRoTWFwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JlZW5TcGFjZVBhdGggPSBlbGV2YXRpb24gP1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ZWRQYXRoLm1hcCgocCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZXZhdGlvbiA9IGdldEVsZXZhdGlvbihpbmRleCA8IGZpcnN0LnBhdGgubGVuZ3RoIC0gMSA/IGZpcnN0LnRpbGVQYXRoW2ZpcnN0LnBhdGgubGVuZ3RoIC0gMSAtIGluZGV4XSA6IGxhc3QudGlsZVBhdGhbaW5kZXggLSBmaXJzdC5wYXRoLmxlbmd0aCArIDJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9qZWN0aW9uLnByb2plY3QocCwgbGFiZWxUb1NjcmVlbk1hdHJpeCwgZWxldmF0aW9uWzJdKTtcbiAgICAgICAgICAgICAgICAgICAgfSkgOlxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ZWRQYXRoLm1hcChwID0+IHByb2plY3Rpb24ucHJvamVjdChwLCBsYWJlbFRvU2NyZWVuTWF0cml4KSk7XG5cbiAgICAgICAgICAgICAgICAvLyBEbyBub3QgdHJ5IHRvIHBsYWNlIGNvbGxpc2lvbiBjaXJjbGVzIGlmIGV2ZW4gb2YgdGhlIHBvaW50cyBpcyBiZWhpbmQgdGhlIGNhbWVyYS5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcGxhdXNpYmxlIHNjZW5hcmlvIHdpdGggYmlnIGNhbWVyYSBwaXRjaCBhbmdsZXNcbiAgICAgICAgICAgICAgICBpZiAoc2NyZWVuU3BhY2VQYXRoLnNvbWUocG9pbnQgPT4gcG9pbnQuc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhIDw9IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2plY3RlZFBhdGggPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ZWRQYXRoID0gc2NyZWVuU3BhY2VQYXRoLm1hcChwID0+IHAucG9pbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHNlZ21lbnRzID0gW107XG5cbiAgICAgICAgICAgIGlmIChwcm9qZWN0ZWRQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBRdWlja2x5IGNoZWNrIGlmIHRoZSBwYXRoIGlzIGZ1bGx5IGluc2lkZSBvciBvdXRzaWRlIG9mIHRoZSBwYWRkZWQgY29sbGlzaW9uIHJlZ2lvbi5cbiAgICAgICAgICAgICAgICAvLyBGb3Igb3ZlcmxhcHBpbmcgcGF0aHMgd2UnbGwgb25seSBjcmVhdGUgY29sbGlzaW9uIGNpcmNsZXMgZm9yIHRoZSB2aXNpYmxlIHNlZ21lbnRzXG4gICAgICAgICAgICAgICAgY29uc3QgbWluUG9pbnQgPSBwcm9qZWN0ZWRQYXRoWzBdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4UG9pbnQgPSBwcm9qZWN0ZWRQYXRoWzBdLmNsb25lKCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHByb2plY3RlZFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbWluUG9pbnQueCA9IE1hdGgubWluKG1pblBvaW50LngsIHByb2plY3RlZFBhdGhbaV0ueCk7XG4gICAgICAgICAgICAgICAgICAgIG1pblBvaW50LnkgPSBNYXRoLm1pbihtaW5Qb2ludC55LCBwcm9qZWN0ZWRQYXRoW2ldLnkpO1xuICAgICAgICAgICAgICAgICAgICBtYXhQb2ludC54ID0gTWF0aC5tYXgobWF4UG9pbnQueCwgcHJvamVjdGVkUGF0aFtpXS54KTtcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9pbnQueSA9IE1hdGgubWF4KG1heFBvaW50LnksIHByb2plY3RlZFBhdGhbaV0ueSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1pblBvaW50LnggPj0gc2NyZWVuUGxhbmVNaW4ueCAmJiBtYXhQb2ludC54IDw9IHNjcmVlblBsYW5lTWF4LnggJiZcbiAgICAgICAgICAgICAgICAgICAgbWluUG9pbnQueSA+PSBzY3JlZW5QbGFuZU1pbi55ICYmIG1heFBvaW50LnkgPD0gc2NyZWVuUGxhbmVNYXgueSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBRdWFkIGZ1bGx5IHZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgc2VnbWVudHMgPSBbcHJvamVjdGVkUGF0aF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhQb2ludC54IDwgc2NyZWVuUGxhbmVNaW4ueCB8fCBtaW5Qb2ludC54ID4gc2NyZWVuUGxhbmVNYXgueCB8fFxuICAgICAgICAgICAgICAgICAgICBtYXhQb2ludC55IDwgc2NyZWVuUGxhbmVNaW4ueSB8fCBtaW5Qb2ludC55ID4gc2NyZWVuUGxhbmVNYXgueSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3QgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICBzZWdtZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzID0gY2xpcExpbmUoW3Byb2plY3RlZFBhdGhdLCBzY3JlZW5QbGFuZU1pbi54LCBzY3JlZW5QbGFuZU1pbi55LCBzY3JlZW5QbGFuZU1heC54LCBzY3JlZW5QbGFuZU1heC55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnIG9mIHNlZ21lbnRzKSB7XG4gICAgICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGUgcG9zaXRpb25zIGZvciBjb2xsaXNpb24gY2lyY2xlcy4gQWRkIGEgc21hbGwgcGFkZGluZyB0byBib3RoIGVuZHMgb2YgdGhlIHNlZ21lbnRcbiAgICAgICAgICAgICAgICBhc3NlcnQoc2VnLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgICAgIGludGVycG9sYXRvci5yZXNldChzZWcsIHJhZGl1cyAqIDAuMjUpO1xuXG4gICAgICAgICAgICAgICAgbGV0IG51bUNpcmNsZXMgPSAwO1xuXG4gICAgICAgICAgICAgICAgaWYgKGludGVycG9sYXRvci5sZW5ndGggPD0gMC41ICogcmFkaXVzKSB7XG4gICAgICAgICAgICAgICAgICAgIG51bUNpcmNsZXMgPSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG51bUNpcmNsZXMgPSBNYXRoLmNlaWwoaW50ZXJwb2xhdG9yLnBhZGRlZExlbmd0aCAvIGNpcmNsZURpc3QpICsgMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNpcmNsZXM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gaSAvIE1hdGgubWF4KG51bUNpcmNsZXMgLSAxLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2lyY2xlUG9zaXRpb24gPSBpbnRlcnBvbGF0b3IubGVycCh0KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdmlld3BvcnQgcGFkZGluZyB0byB0aGUgcG9zaXRpb24gYW5kIHBlcmZvcm0gaW5pdGlhbCBjb2xsaXNpb24gY2hlY2tcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VudGVyWCA9IGNpcmNsZVBvc2l0aW9uLnggKyB2aWV3cG9ydFBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbnRlclkgPSBjaXJjbGVQb3NpdGlvbi55ICsgdmlld3BvcnRQYWRkaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlZENvbGxpc2lvbkNpcmNsZXMucHVzaChjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMsIDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHgxID0gY2VudGVyWCAtIHJhZGl1cztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeTEgPSBjZW50ZXJZIC0gcmFkaXVzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4MiA9IGNlbnRlclggKyByYWRpdXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHkyID0gY2VudGVyWSArIHJhZGl1cztcblxuICAgICAgICAgICAgICAgICAgICBlbnRpcmVseU9mZnNjcmVlbiA9IGVudGlyZWx5T2Zmc2NyZWVuICYmIHRoaXMuaXNPZmZzY3JlZW4oeDEsIHkxLCB4MiwgeTIpO1xuICAgICAgICAgICAgICAgICAgICBpbkdyaWQgPSBpbkdyaWQgfHwgdGhpcy5pc0luc2lkZUdyaWQoeDEsIHkxLCB4MiwgeTIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghYWxsb3dPdmVybGFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ncmlkLmhpdFRlc3RDaXJjbGUoY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBjb2xsaXNpb25Hcm91cFByZWRpY2F0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBlYXJseSBleGl0IGlmIHdlJ3JlIHNob3dpbmcgdGhlIGRlYnVnIGNpcmNsZXMgYmVjYXVzZSB3ZSBzdGlsbCB3YW50IHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNpcmNsZXMgYXJlIGluIHVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkRldGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dDb2xsaXNpb25DaXJjbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsaXNpb25EZXRlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaXJjbGVzOiAoKCFzaG93Q29sbGlzaW9uQ2lyY2xlcyAmJiBjb2xsaXNpb25EZXRlY3RlZCkgfHwgIWluR3JpZCkgPyBbXSA6IHBsYWNlZENvbGxpc2lvbkNpcmNsZXMsXG4gICAgICAgICAgICBvZmZzY3JlZW46IGVudGlyZWx5T2Zmc2NyZWVuLFxuICAgICAgICAgICAgY29sbGlzaW9uRGV0ZWN0ZWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCZWNhdXNlIHRoZSBnZW9tZXRyaWVzIGluIHRoZSBDb2xsaXNpb25JbmRleCBhcmUgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgc2hhcGUgb2ZcbiAgICAgKiBzeW1ib2xzIG9uIHRoZSBtYXAsIHdlIHVzZSB0aGUgQ29sbGlzaW9uSW5kZXggdG8gbG9vayB1cCB0aGUgc3ltYm9sIHBhcnQgb2ZcbiAgICAgKiBgcXVlcnlSZW5kZXJlZEZlYXR1cmVzYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcXVlcnlSZW5kZXJlZFN5bWJvbHModmlld3BvcnRRdWVyeUdlb21ldHJ5OiBBcnJheTxQb2ludD4pIHtcbiAgICAgICAgaWYgKHZpZXdwb3J0UXVlcnlHZW9tZXRyeS5sZW5ndGggPT09IDAgfHwgKHRoaXMuZ3JpZC5rZXlzTGVuZ3RoKCkgPT09IDAgJiYgdGhpcy5pZ25vcmVkR3JpZC5rZXlzTGVuZ3RoKCkgPT09IDApKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeSA9IFtdO1xuICAgICAgICBsZXQgbWluWCA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgICAgICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygdmlld3BvcnRRdWVyeUdlb21ldHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBncmlkUG9pbnQgPSBuZXcgUG9pbnQocG9pbnQueCArIHZpZXdwb3J0UGFkZGluZywgcG9pbnQueSArIHZpZXdwb3J0UGFkZGluZyk7XG4gICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgZ3JpZFBvaW50LngpO1xuICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIGdyaWRQb2ludC55KTtcbiAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBncmlkUG9pbnQueCk7XG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgZ3JpZFBvaW50LnkpO1xuICAgICAgICAgICAgcXVlcnkucHVzaChncmlkUG9pbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmdyaWQucXVlcnkobWluWCwgbWluWSwgbWF4WCwgbWF4WSlcbiAgICAgICAgICAgIC5jb25jYXQodGhpcy5pZ25vcmVkR3JpZC5xdWVyeShtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZKSk7XG5cbiAgICAgICAgY29uc3Qgc2VlbkZlYXR1cmVzID0ge307XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZUtleSA9IGZlYXR1cmUua2V5O1xuICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IHNlZW4gZmVhdHVyZXMuXG4gICAgICAgICAgICBpZiAoc2VlbkZlYXR1cmVzW2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNlZW5GZWF0dXJlc1tmZWF0dXJlS2V5LmJ1Y2tldEluc3RhbmNlSWRdID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VlbkZlYXR1cmVzW2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF1bZmVhdHVyZUtleS5mZWF0dXJlSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHF1ZXJ5IGludGVyc2VjdHMgd2l0aCB0aGUgZmVhdHVyZSBib3hcbiAgICAgICAgICAgIC8vIFwiQ29sbGlzaW9uIENpcmNsZXNcIiBmb3IgbGluZSBsYWJlbHMgYXJlIHRyZWF0ZWQgYXMgYm94ZXMgaGVyZVxuICAgICAgICAgICAgLy8gU2luY2UgdGhlcmUncyBubyBhY3R1YWwgY29sbGlzaW9uIHRha2luZyBwbGFjZSwgdGhlIGNpcmNsZSB2cy4gc3F1YXJlXG4gICAgICAgICAgICAvLyBkaXN0aW5jdGlvbiBkb2Vzbid0IG1hdHRlciBhcyBtdWNoLCBhbmQgYm94IGdlb21ldHJ5IGlzIGVhc2llclxuICAgICAgICAgICAgLy8gdG8gd29yayB3aXRoLlxuICAgICAgICAgICAgY29uc3QgYmJveCA9IFtcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoZmVhdHVyZS54MSwgZmVhdHVyZS55MSksXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KGZlYXR1cmUueDIsIGZlYXR1cmUueTEpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChmZWF0dXJlLngyLCBmZWF0dXJlLnkyKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoZmVhdHVyZS54MSwgZmVhdHVyZS55MilcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoIWludGVyc2VjdGlvblRlc3RzLnBvbHlnb25JbnRlcnNlY3RzUG9seWdvbihxdWVyeSwgYmJveCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VlbkZlYXR1cmVzW2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF1bZmVhdHVyZUtleS5mZWF0dXJlSW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHRbZmVhdHVyZUtleS5idWNrZXRJbnN0YW5jZUlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdFtmZWF0dXJlS2V5LmJ1Y2tldEluc3RhbmNlSWRdLnB1c2goZmVhdHVyZUtleS5mZWF0dXJlSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpbnNlcnRDb2xsaXNpb25Cb3goY29sbGlzaW9uQm94OiBBcnJheTxudW1iZXI+LCBpZ25vcmVQbGFjZW1lbnQ6IGJvb2xlYW4sIGJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlciwgZmVhdHVyZUluZGV4OiBudW1iZXIsIGNvbGxpc2lvbkdyb3VwSUQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBncmlkID0gaWdub3JlUGxhY2VtZW50ID8gdGhpcy5pZ25vcmVkR3JpZCA6IHRoaXMuZ3JpZDtcblxuICAgICAgICBjb25zdCBrZXkgPSB7YnVja2V0SW5zdGFuY2VJZCwgZmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cElEfTtcbiAgICAgICAgZ3JpZC5pbnNlcnQoa2V5LCBjb2xsaXNpb25Cb3hbMF0sIGNvbGxpc2lvbkJveFsxXSwgY29sbGlzaW9uQm94WzJdLCBjb2xsaXNpb25Cb3hbM10pO1xuICAgIH1cblxuICAgIGluc2VydENvbGxpc2lvbkNpcmNsZXMoY29sbGlzaW9uQ2lyY2xlczogQXJyYXk8bnVtYmVyPiwgaWdub3JlUGxhY2VtZW50OiBib29sZWFuLCBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXIsIGZlYXR1cmVJbmRleDogbnVtYmVyLCBjb2xsaXNpb25Hcm91cElEOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IGlnbm9yZVBsYWNlbWVudCA/IHRoaXMuaWdub3JlZEdyaWQgOiB0aGlzLmdyaWQ7XG5cbiAgICAgICAgY29uc3Qga2V5ID0ge2J1Y2tldEluc3RhbmNlSWQsIGZlYXR1cmVJbmRleCwgY29sbGlzaW9uR3JvdXBJRH07XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY29sbGlzaW9uQ2lyY2xlcy5sZW5ndGg7IGsgKz0gNCkge1xuICAgICAgICAgICAgZ3JpZC5pbnNlcnRDaXJjbGUoa2V5LCBjb2xsaXNpb25DaXJjbGVzW2tdLCBjb2xsaXNpb25DaXJjbGVzW2sgKyAxXSwgY29sbGlzaW9uQ2lyY2xlc1trICsgMl0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvamVjdEFuZEdldFBlcnNwZWN0aXZlUmF0aW8ocG9zTWF0cml4OiBtYXQ0LCB4OiBudW1iZXIsIHk6IG51bWJlciwgZWxldmF0aW9uPzogbnVtYmVyLCB0aWxlSUQ6ID9PdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIGNvbnN0IHAgPSBbeCwgeSwgZWxldmF0aW9uIHx8IDAsIDFdO1xuICAgICAgICBsZXQgYWJvdmVIb3Jpem9uID0gZmFsc2U7XG4gICAgICAgIGlmIChlbGV2YXRpb24gfHwgdGhpcy50cmFuc2Zvcm0ucGl0Y2ggPiAwKSB7XG4gICAgICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocCwgcCwgcG9zTWF0cml4KTtcblxuICAgICAgICAgICAgbGV0IGJlaGluZEZvZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9nU3RhdGUgJiYgdGlsZUlEKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9nT3BhY2l0eSA9IGdldEZvZ09wYWNpdHlBdFRpbGVDb29yZCh0aGlzLmZvZ1N0YXRlLCB4LCB5LCBlbGV2YXRpb24gfHwgMCwgdGlsZUlELnRvVW53cmFwcGVkKCksIHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICBiZWhpbmRGb2cgPSBmb2dPcGFjaXR5ID4gRk9HX1NZTUJPTF9DTElQUElOR19USFJFU0hPTEQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFib3ZlSG9yaXpvbiA9IHBbMl0gPiBwWzNdIHx8IGJlaGluZEZvZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb2plY3Rpb24ueHlUcmFuc2Zvcm1NYXQ0KHAsIHAsIHBvc01hdHJpeCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYSA9IG5ldyBQb2ludChcbiAgICAgICAgICAgICgoKHBbMF0gLyBwWzNdICsgMSkgLyAyKSAqIHRoaXMudHJhbnNmb3JtLndpZHRoKSArIHZpZXdwb3J0UGFkZGluZyxcbiAgICAgICAgICAgICgoKC1wWzFdIC8gcFszXSArIDEpIC8gMikgKiB0aGlzLnRyYW5zZm9ybS5oZWlnaHQpICsgdmlld3BvcnRQYWRkaW5nXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvaW50OiBhLFxuICAgICAgICAgICAgLy8gU2VlIHBlcnNwZWN0aXZlIHJhdGlvIGNvbW1lbnQgaW4gc3ltYm9sX3NkZi52ZXJ0ZXhcbiAgICAgICAgICAgIC8vIFdlJ3JlIGRvaW5nIGNvbGxpc2lvbiBkZXRlY3Rpb24gaW4gdmlld3BvcnQgc3BhY2Ugc28gd2UgbmVlZFxuICAgICAgICAgICAgLy8gdG8gc2NhbGUgZG93biBib3hlcyBpbiB0aGUgZGlzdGFuY2VcbiAgICAgICAgICAgIHBlcnNwZWN0aXZlUmF0aW86IE1hdGgubWluKDAuNSArIDAuNSAqICh0aGlzLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gcFszXSksIDEuNSksXG4gICAgICAgICAgICBzaWduZWREaXN0YW5jZUZyb21DYW1lcmE6IHBbM10sXG4gICAgICAgICAgICBhYm92ZUhvcml6b25cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpc09mZnNjcmVlbih4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB4MiA8IHZpZXdwb3J0UGFkZGluZyB8fCB4MSA+PSB0aGlzLnNjcmVlblJpZ2h0Qm91bmRhcnkgfHwgeTIgPCB2aWV3cG9ydFBhZGRpbmcgfHwgeTEgPiB0aGlzLnNjcmVlbkJvdHRvbUJvdW5kYXJ5O1xuICAgIH1cblxuICAgIGlzSW5zaWRlR3JpZCh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB4MiA+PSAwICYmIHgxIDwgdGhpcy5ncmlkUmlnaHRCb3VuZGFyeSAmJiB5MiA+PSAwICYmIHkxIDwgdGhpcy5ncmlkQm90dG9tQm91bmRhcnk7XG4gICAgfVxuXG4gICAgLypcbiAgICAqIFJldHVybnMgYSBtYXRyaXggZm9yIHRyYW5zZm9ybWluZyBjb2xsaXNpb24gc2hhcGVzIHRvIHZpZXdwb3J0IGNvb3JkaW5hdGUgc3BhY2UuXG4gICAgKiBVc2UgdGhpcyBmdW5jdGlvbiB0byByZW5kZXIgZS5nLiBjb2xsaXNpb24gY2lyY2xlcyBvbiB0aGUgc2NyZWVuLlxuICAgICogICBleGFtcGxlIHRyYW5zZm9ybWF0aW9uOiBjbGlwUG9zID0gZ2xDb29yZE1hdHJpeCAqIHZpZXdwb3J0TWF0cml4ICogY2lyY2xlX3Bvc1xuICAgICovXG4gICAgZ2V0Vmlld3BvcnRNYXRyaXgoKTogbWF0NCB7XG4gICAgICAgIGNvbnN0IG0gPSBtYXQ0LmlkZW50aXR5KFtdKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobSwgbSwgWy12aWV3cG9ydFBhZGRpbmcsIC12aWV3cG9ydFBhZGRpbmcsIDAuMF0pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbGxpc2lvbkluZGV4O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbGxpc2lvbkluZGV4IGZyb20gJy4vY29sbGlzaW9uX2luZGV4LmpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQuanMnO1xuaW1wb3J0IE9ORV9FTSBmcm9tICcuL29uZV9lbS5qcyc7XG5pbXBvcnQgKiBhcyBzeW1ib2xTaXplIGZyb20gJy4vc3ltYm9sX3NpemUuanMnO1xuaW1wb3J0ICogYXMgcHJvamVjdGlvbiBmcm9tICcuL3Byb2plY3Rpb24uanMnO1xuaW1wb3J0IHtnZXRBbmNob3JKdXN0aWZpY2F0aW9uLCBldmFsdWF0ZVZhcmlhYmxlT2Zmc2V0fSBmcm9tICcuL3N5bWJvbF9sYXlvdXQuanMnO1xuaW1wb3J0IHtnZXRBbmNob3JBbGlnbm1lbnQsIFdyaXRpbmdNb2RlfSBmcm9tICcuL3NoYXBpbmcuanMnO1xuaW1wb3J0IHttYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB0eXBlIFN5bWJvbEJ1Y2tldCwge0NvbGxpc2lvbkFycmF5cywgU2luZ2xlQ29sbGlzaW9uQm94fSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIHtDb2xsaXNpb25Cb3hBcnJheSwgQ29sbGlzaW9uVmVydGV4QXJyYXksIFN5bWJvbEluc3RhbmNlfSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIEZlYXR1cmVJbmRleCBmcm9tICcuLi9kYXRhL2ZlYXR1cmVfaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIHtUZXh0QW5jaG9yfSBmcm9tICcuL3N5bWJvbF9sYXlvdXQuanMnO1xuaW1wb3J0IHR5cGUge0ZvZ1N0YXRlfSBmcm9tICcuLi9zdHlsZS9mb2dfaGVscGVycy5qcyc7XG5cbmNsYXNzIE9wYWNpdHlTdGF0ZSB7XG4gICAgb3BhY2l0eTogbnVtYmVyO1xuICAgIHBsYWNlZDogYm9vbGVhbjtcbiAgICBjb25zdHJ1Y3RvcihwcmV2U3RhdGU6ID9PcGFjaXR5U3RhdGUsIGluY3JlbWVudDogbnVtYmVyLCBwbGFjZWQ6IGJvb2xlYW4sIHNraXBGYWRlOiA/Ym9vbGVhbikge1xuICAgICAgICBpZiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLm9wYWNpdHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBwcmV2U3RhdGUub3BhY2l0eSArIChwcmV2U3RhdGUucGxhY2VkID8gaW5jcmVtZW50IDogLWluY3JlbWVudCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eSA9IChza2lwRmFkZSAmJiBwbGFjZWQpID8gMSA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wbGFjZWQgPSBwbGFjZWQ7XG4gICAgfVxuICAgIGlzSGlkZGVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGFjaXR5ID09PSAwICYmICF0aGlzLnBsYWNlZDtcbiAgICB9XG59XG5cbmNsYXNzIEpvaW50T3BhY2l0eVN0YXRlIHtcbiAgICB0ZXh0OiBPcGFjaXR5U3RhdGU7XG4gICAgaWNvbjogT3BhY2l0eVN0YXRlO1xuICAgIGNsaXBwZWQ6IGJvb2xlYW47XG4gICAgY29uc3RydWN0b3IocHJldlN0YXRlOiA/Sm9pbnRPcGFjaXR5U3RhdGUsIGluY3JlbWVudDogbnVtYmVyLCBwbGFjZWRUZXh0OiBib29sZWFuLCBwbGFjZWRJY29uOiBib29sZWFuLCBza2lwRmFkZTogP2Jvb2xlYW4sIGNsaXBwZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnRleHQgPSBuZXcgT3BhY2l0eVN0YXRlKHByZXZTdGF0ZSA/IHByZXZTdGF0ZS50ZXh0IDogbnVsbCwgaW5jcmVtZW50LCBwbGFjZWRUZXh0LCBza2lwRmFkZSk7XG4gICAgICAgIHRoaXMuaWNvbiA9IG5ldyBPcGFjaXR5U3RhdGUocHJldlN0YXRlID8gcHJldlN0YXRlLmljb24gOiBudWxsLCBpbmNyZW1lbnQsIHBsYWNlZEljb24sIHNraXBGYWRlKTtcblxuICAgICAgICB0aGlzLmNsaXBwZWQgPSBjbGlwcGVkO1xuICAgIH1cbiAgICBpc0hpZGRlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dC5pc0hpZGRlbigpICYmIHRoaXMuaWNvbi5pc0hpZGRlbigpO1xuICAgIH1cbn1cblxuY2xhc3MgSm9pbnRQbGFjZW1lbnQge1xuICAgIHRleHQ6IGJvb2xlYW47XG4gICAgaWNvbjogYm9vbGVhbjtcbiAgICAvLyBza2lwRmFkZSA9IG91dHNpZGUgdmlld3BvcnQsIGJ1dCB3aXRoaW4gQ29sbGlzaW9uSW5kZXg6OnZpZXdwb3J0UGFkZGluZyBweCBvZiB0aGUgZWRnZVxuICAgIC8vIEJlY2F1c2UgdGhlc2Ugc3ltYm9scyBhcmVuJ3Qgb25zY3JlZW4geWV0LCB3ZSBjYW4gc2tpcCB0aGUgXCJmYWRlIGluXCIgYW5pbWF0aW9uLFxuICAgIC8vIGFuZCBpZiBhIHN1YnNlcXVlbnQgdmlld3BvcnQgY2hhbmdlIGJyaW5ncyB0aGVtIGludG8gdmlldywgdGhleSdsbCBiZSBmdWxseVxuICAgIC8vIHZpc2libGUgcmlnaHQgYXdheS5cbiAgICBza2lwRmFkZTogYm9vbGVhbjtcblxuICAgIGNsaXBwZWQ6IGJvb2xlYW5cbiAgICBjb25zdHJ1Y3Rvcih0ZXh0OiBib29sZWFuLCBpY29uOiBib29sZWFuLCBza2lwRmFkZTogYm9vbGVhbiwgY2xpcHBlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMuaWNvbiA9IGljb247XG4gICAgICAgIHRoaXMuc2tpcEZhZGUgPSBza2lwRmFkZTtcbiAgICAgICAgdGhpcy5jbGlwcGVkID0gY2xpcHBlZDtcbiAgICB9XG59XG5cbmNsYXNzIENvbGxpc2lvbkNpcmNsZUFycmF5IHtcbiAgICAvLyBTdG9yZXMgY29sbGlzaW9uIGNpcmNsZXMgYW5kIHBsYWNlbWVudCBtYXRyaWNlcyBvZiBhIGJ1Y2tldCBmb3IgZGVidWcgcmVuZGVyaW5nLlxuICAgIGludlByb2pNYXRyaXg6IG1hdDQ7XG4gICAgdmlld3BvcnRNYXRyaXg6IG1hdDQ7XG4gICAgY2lyY2xlczogQXJyYXk8bnVtYmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmludlByb2pNYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0TWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgdGhpcy5jaXJjbGVzID0gW107XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmV0YWluZWRRdWVyeURhdGEge1xuICAgIGJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlcjtcbiAgICBmZWF0dXJlSW5kZXg6IEZlYXR1cmVJbmRleDtcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXI7XG4gICAgYnVja2V0SW5kZXg6IG51bWJlcjtcbiAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQ7XG4gICAgZmVhdHVyZVNvcnRPcmRlcjogP0FycmF5PG51bWJlcj5cbiAgICBjb25zdHJ1Y3RvcihidWNrZXRJbnN0YW5jZUlkOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4OiBGZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIGJ1Y2tldEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIHRoaXMuYnVja2V0SW5zdGFuY2VJZCA9IGJ1Y2tldEluc3RhbmNlSWQ7XG4gICAgICAgIHRoaXMuZmVhdHVyZUluZGV4ID0gZmVhdHVyZUluZGV4O1xuICAgICAgICB0aGlzLnNvdXJjZUxheWVySW5kZXggPSBzb3VyY2VMYXllckluZGV4O1xuICAgICAgICB0aGlzLmJ1Y2tldEluZGV4ID0gYnVja2V0SW5kZXg7XG4gICAgICAgIHRoaXMudGlsZUlEID0gdGlsZUlEO1xuICAgIH1cbn1cblxudHlwZSBDb2xsaXNpb25Hcm91cCA9IHsgSUQ6IG51bWJlciwgcHJlZGljYXRlPzogYW55IH07XG5cbmNsYXNzIENvbGxpc2lvbkdyb3VwcyB7XG4gICAgY29sbGlzaW9uR3JvdXBzOiB7W2dyb3VwTmFtZTogc3RyaW5nXTogQ29sbGlzaW9uR3JvdXB9O1xuICAgIG1heEdyb3VwSUQ6IG51bWJlcjtcbiAgICBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5jcm9zc1NvdXJjZUNvbGxpc2lvbnMgPSBjcm9zc1NvdXJjZUNvbGxpc2lvbnM7XG4gICAgICAgIHRoaXMubWF4R3JvdXBJRCA9IDA7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uR3JvdXBzID0ge307XG4gICAgfVxuXG4gICAgZ2V0KHNvdXJjZUlEOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gVGhlIHByZWRpY2F0ZS9ncm91cElEIG1lY2hhbmlzbSBhbGxvd3MgZm9yIGFyYml0cmFyeSBncm91cGluZyxcbiAgICAgICAgLy8gYnV0IHRoZSBjdXJyZW50IGludGVyZmFjZSBkZWZpbmVzIG9uZSBzb3VyY2UgPT0gb25lIGdyb3VwIHdoZW5cbiAgICAgICAgLy8gY3Jvc3NTb3VyY2VDb2xsaXNpb25zID09IHRydWUuXG4gICAgICAgIGlmICghdGhpcy5jcm9zc1NvdXJjZUNvbGxpc2lvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb2xsaXNpb25Hcm91cHNbc291cmNlSURdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEdyb3VwSUQgPSArK3RoaXMubWF4R3JvdXBJRDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkdyb3Vwc1tzb3VyY2VJRF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIElEOiBuZXh0R3JvdXBJRCxcbiAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlOiAoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5LmNvbGxpc2lvbkdyb3VwSUQgPT09IG5leHRHcm91cElEO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxpc2lvbkdyb3Vwc1tzb3VyY2VJRF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge0lEOiAwLCBwcmVkaWNhdGU6IG51bGx9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVWYXJpYWJsZUxheW91dFNoaWZ0KGFuY2hvcjogVGV4dEFuY2hvciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHRleHRPZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0sIHRleHRTY2FsZTogbnVtYmVyKTogUG9pbnQge1xuICAgIGNvbnN0IHtob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ259ID0gZ2V0QW5jaG9yQWxpZ25tZW50KGFuY2hvcik7XG4gICAgY29uc3Qgc2hpZnRYID0gLShob3Jpem9udGFsQWxpZ24gLSAwLjUpICogd2lkdGg7XG4gICAgY29uc3Qgc2hpZnRZID0gLSh2ZXJ0aWNhbEFsaWduIC0gMC41KSAqIGhlaWdodDtcbiAgICBjb25zdCBvZmZzZXQgPSBldmFsdWF0ZVZhcmlhYmxlT2Zmc2V0KGFuY2hvciwgdGV4dE9mZnNldCk7XG4gICAgcmV0dXJuIG5ldyBQb2ludChcbiAgICAgICAgc2hpZnRYICsgb2Zmc2V0WzBdICogdGV4dFNjYWxlLFxuICAgICAgICBzaGlmdFkgKyBvZmZzZXRbMV0gKiB0ZXh0U2NhbGVcbiAgICApO1xufVxuXG5mdW5jdGlvbiBvZmZzZXRTaGlmdChzaGlmdFg6IG51bWJlciwgc2hpZnRZOiBudW1iZXIsIHJvdGF0ZVdpdGhNYXA6IGJvb2xlYW4sIHBpdGNoV2l0aE1hcDogYm9vbGVhbiwgYW5nbGU6IG51bWJlcik6IFBvaW50IHtcbiAgICBjb25zdCBzaGlmdCA9IG5ldyBQb2ludChzaGlmdFgsIHNoaWZ0WSk7XG4gICAgaWYgKHJvdGF0ZVdpdGhNYXApIHtcbiAgICAgICAgc2hpZnQuX3JvdGF0ZShwaXRjaFdpdGhNYXAgPyBhbmdsZSA6IC1hbmdsZSk7XG4gICAgfVxuICAgIHJldHVybiBzaGlmdDtcbn1cblxuZXhwb3J0IHR5cGUgVmFyaWFibGVPZmZzZXQgPSB7XG4gICAgdGV4dE9mZnNldDogW251bWJlciwgbnVtYmVyXSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIGFuY2hvcjogVGV4dEFuY2hvcixcbiAgICB0ZXh0U2NhbGU6IG51bWJlcixcbiAgICBwcmV2QW5jaG9yPzogVGV4dEFuY2hvclxufTtcblxudHlwZSBUaWxlTGF5ZXJQYXJhbWV0ZXJzID0ge1xuICAgIGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgIGxheW91dDogYW55LFxuICAgIHBvc01hdHJpeDogbWF0NCxcbiAgICB0ZXh0TGFiZWxQbGFuZU1hdHJpeDogbWF0NCxcbiAgICBsYWJlbFRvU2NyZWVuTWF0cml4OiBtYXQ0LFxuICAgIHNjYWxlOiBudW1iZXIsXG4gICAgdGV4dFBpeGVsUmF0aW86IG51bWJlcixcbiAgICBob2xkaW5nRm9yRmFkZTogYm9vbGVhbixcbiAgICBjb2xsaXNpb25Cb3hBcnJheTogP0NvbGxpc2lvbkJveEFycmF5LFxuICAgIHBhcnRpYWxseUV2YWx1YXRlZFRleHRTaXplOiBhbnksXG4gICAgY29sbGlzaW9uR3JvdXA6IGFueVxufTtcblxuZXhwb3J0IHR5cGUgQnVja2V0UGFydCA9IHtcbiAgICBzb3J0S2V5PzogbnVtYmVyIHwgdm9pZCxcbiAgICBzeW1ib2xJbnN0YW5jZVN0YXJ0OiBudW1iZXIsXG4gICAgc3ltYm9sSW5zdGFuY2VFbmQ6IG51bWJlcixcbiAgICBwYXJhbWV0ZXJzOiBUaWxlTGF5ZXJQYXJhbWV0ZXJzXG59O1xuXG5leHBvcnQgdHlwZSBDcm9zc1RpbGVJRCA9IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IGNsYXNzIFBsYWNlbWVudCB7XG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm07XG4gICAgY29sbGlzaW9uSW5kZXg6IENvbGxpc2lvbkluZGV4O1xuICAgIHBsYWNlbWVudHM6IHsgW186IENyb3NzVGlsZUlEXTogSm9pbnRQbGFjZW1lbnQgfTtcbiAgICBvcGFjaXRpZXM6IHsgW186IENyb3NzVGlsZUlEXTogSm9pbnRPcGFjaXR5U3RhdGUgfTtcbiAgICB2YXJpYWJsZU9mZnNldHM6IHtbXzogQ3Jvc3NUaWxlSURdOiBWYXJpYWJsZU9mZnNldCB9O1xuICAgIHBsYWNlZE9yaWVudGF0aW9uczoge1tfOiBDcm9zc1RpbGVJRF06IG51bWJlciB9O1xuICAgIGNvbW1pdFRpbWU6IG51bWJlcjtcbiAgICBwcmV2Wm9vbUFkanVzdG1lbnQ6IG51bWJlcjtcbiAgICBsYXN0UGxhY2VtZW50Q2hhbmdlVGltZTogbnVtYmVyO1xuICAgIHN0YWxlOiBib29sZWFuO1xuICAgIGZhZGVEdXJhdGlvbjogbnVtYmVyO1xuICAgIHJldGFpbmVkUXVlcnlEYXRhOiB7W186IG51bWJlcl06IFJldGFpbmVkUXVlcnlEYXRhfTtcbiAgICBjb2xsaXNpb25Hcm91cHM6IENvbGxpc2lvbkdyb3VwcztcbiAgICBwcmV2UGxhY2VtZW50OiA/UGxhY2VtZW50O1xuICAgIHpvb21BdExhc3RSZWNlbmN5Q2hlY2s6IG51bWJlcjtcbiAgICBjb2xsaXNpb25DaXJjbGVBcnJheXM6IHtbYW55XTogQ29sbGlzaW9uQ2lyY2xlQXJyYXl9O1xuXG4gICAgY29uc3RydWN0b3IodHJhbnNmb3JtOiBUcmFuc2Zvcm0sIGZhZGVEdXJhdGlvbjogbnVtYmVyLCBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IGJvb2xlYW4sIHByZXZQbGFjZW1lbnQ/OiBQbGFjZW1lbnQsIGZvZ1N0YXRlOiA/Rm9nU3RhdGUpIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm0uY2xvbmUoKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleCA9IG5ldyBDb2xsaXNpb25JbmRleCh0aGlzLnRyYW5zZm9ybSwgZm9nU3RhdGUpO1xuICAgICAgICB0aGlzLnBsYWNlbWVudHMgPSB7fTtcbiAgICAgICAgdGhpcy5vcGFjaXRpZXMgPSB7fTtcbiAgICAgICAgdGhpcy52YXJpYWJsZU9mZnNldHMgPSB7fTtcbiAgICAgICAgdGhpcy5zdGFsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbW1pdFRpbWUgPSAwO1xuICAgICAgICB0aGlzLmZhZGVEdXJhdGlvbiA9IGZhZGVEdXJhdGlvbjtcbiAgICAgICAgdGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YSA9IHt9O1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkdyb3VwcyA9IG5ldyBDb2xsaXNpb25Hcm91cHMoY3Jvc3NTb3VyY2VDb2xsaXNpb25zKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25DaXJjbGVBcnJheXMgPSB7fTtcblxuICAgICAgICB0aGlzLnByZXZQbGFjZW1lbnQgPSBwcmV2UGxhY2VtZW50O1xuICAgICAgICBpZiAocHJldlBsYWNlbWVudCkge1xuICAgICAgICAgICAgcHJldlBsYWNlbWVudC5wcmV2UGxhY2VtZW50ID0gdW5kZWZpbmVkOyAvLyBPbmx5IGhvbGQgb24gdG8gb25lIHBsYWNlbWVudCBiYWNrXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBsYWNlZE9yaWVudGF0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIGdldEJ1Y2tldFBhcnRzKHJlc3VsdHM6IEFycmF5PEJ1Y2tldFBhcnQ+LCBzdHlsZUxheWVyOiBTdHlsZUxheWVyLCB0aWxlOiBUaWxlLCBzb3J0QWNyb3NzVGlsZXM6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sQnVja2V0ID0gKCh0aWxlLmdldEJ1Y2tldChzdHlsZUxheWVyKTogYW55KTogU3ltYm9sQnVja2V0KTtcbiAgICAgICAgY29uc3QgYnVja2V0RmVhdHVyZUluZGV4ID0gdGlsZS5sYXRlc3RGZWF0dXJlSW5kZXg7XG5cbiAgICAgICAgaWYgKCFzeW1ib2xCdWNrZXQgfHwgIWJ1Y2tldEZlYXR1cmVJbmRleCB8fCBzdHlsZUxheWVyLmlkICE9PSBzeW1ib2xCdWNrZXQubGF5ZXJJZHNbMF0pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbGF5b3V0ID0gc3ltYm9sQnVja2V0LmxheWVyc1swXS5sYXlvdXQ7XG5cbiAgICAgICAgY29uc3QgY29sbGlzaW9uQm94QXJyYXkgPSB0aWxlLmNvbGxpc2lvbkJveEFycmF5O1xuICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDIsIHRoaXMudHJhbnNmb3JtLnpvb20gLSB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgICAgIGNvbnN0IHRleHRQaXhlbFJhdGlvID0gdGlsZS50aWxlU2l6ZSAvIEVYVEVOVDtcbiAgICAgICAgY29uc3QgdW53cmFwcGVkVGlsZUlEID0gdGlsZS50aWxlSUQudG9VbndyYXBwZWQoKTtcblxuICAgICAgICBjb25zdCBwb3NNYXRyaXggPSB0aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGVQcm9qTWF0cml4KHVud3JhcHBlZFRpbGVJRCk7XG5cbiAgICAgICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gbGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG4gICAgICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJztcblxuICAgICAgICBzdHlsZUxheWVyLmNvbXBpbGVGaWx0ZXIoKTtcblxuICAgICAgICBjb25zdCBkeW5hbWljRmlsdGVyID0gc3R5bGVMYXllci5keW5hbWljRmlsdGVyKCk7XG4gICAgICAgIGNvbnN0IGR5bmFtaWNGaWx0ZXJOZWVkc0ZlYXR1cmUgPSBzdHlsZUxheWVyLmR5bmFtaWNGaWx0ZXJOZWVkc0ZlYXR1cmUoKTtcbiAgICAgICAgY29uc3QgcGl4ZWxzVG9UaWxlcyA9IHRoaXMudHJhbnNmb3JtLmNhbGN1bGF0ZVBpeGVsc1RvVGlsZVVuaXRzTWF0cml4KHRpbGUpO1xuXG4gICAgICAgIGNvbnN0IHRleHRMYWJlbFBsYW5lTWF0cml4ID0gcHJvamVjdGlvbi5nZXRMYWJlbFBsYW5lTWF0cml4KHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICB0aWxlLnRpbGVJRC5jYW5vbmljYWwsXG4gICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwLFxuICAgICAgICAgICAgICAgIHJvdGF0ZVdpdGhNYXAsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlcyk7XG5cbiAgICAgICAgbGV0IGxhYmVsVG9TY3JlZW5NYXRyaXggPSBudWxsO1xuXG4gICAgICAgIGlmIChwaXRjaFdpdGhNYXApIHtcbiAgICAgICAgICAgIGNvbnN0IGdsTWF0cml4ID0gcHJvamVjdGlvbi5nZXRHbENvb3JkTWF0cml4KFxuICAgICAgICAgICAgICAgIHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICB0aWxlLnRpbGVJRC5jYW5vbmljYWwsXG4gICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwLFxuICAgICAgICAgICAgICAgIHJvdGF0ZVdpdGhNYXAsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlcyk7XG5cbiAgICAgICAgICAgIGxhYmVsVG9TY3JlZW5NYXRyaXggPSBtYXQ0Lm11bHRpcGx5KFtdLCB0aGlzLnRyYW5zZm9ybS5sYWJlbFBsYW5lTWF0cml4LCBnbE1hdHJpeCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2xpcHBpbmdEYXRhID0gbnVsbDtcbiAgICAgICAgYXNzZXJ0KCEhdGlsZS5sYXRlc3RGZWF0dXJlSW5kZXgpO1xuICAgICAgICBpZiAoISFkeW5hbWljRmlsdGVyICYmIHRpbGUubGF0ZXN0RmVhdHVyZUluZGV4KSB7XG5cbiAgICAgICAgICAgIGNsaXBwaW5nRGF0YSA9IHtcbiAgICAgICAgICAgICAgICB1bndyYXBwZWRUaWxlSUQsXG4gICAgICAgICAgICAgICAgZHluYW1pY0ZpbHRlcixcbiAgICAgICAgICAgICAgICBkeW5hbWljRmlsdGVyTmVlZHNGZWF0dXJlLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogdGlsZS5sYXRlc3RGZWF0dXJlSW5kZXhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcyBsb25nIGFzIHRoaXMgcGxhY2VtZW50IGxpdmVzLCB3ZSBoYXZlIHRvIGhvbGQgb250byB0aGlzIGJ1Y2tldCdzXG4gICAgICAgIC8vIG1hdGNoaW5nIEZlYXR1cmVJbmRleC9kYXRhIGZvciBxdWVyeWluZyBwdXJwb3Nlc1xuICAgICAgICB0aGlzLnJldGFpbmVkUXVlcnlEYXRhW3N5bWJvbEJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkXSA9IG5ldyBSZXRhaW5lZFF1ZXJ5RGF0YShcbiAgICAgICAgICAgIHN5bWJvbEJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkLFxuICAgICAgICAgICAgYnVja2V0RmVhdHVyZUluZGV4LFxuICAgICAgICAgICAgc3ltYm9sQnVja2V0LnNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xCdWNrZXQuaW5kZXgsXG4gICAgICAgICAgICB0aWxlLnRpbGVJRFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICBidWNrZXQ6IHN5bWJvbEJ1Y2tldCxcbiAgICAgICAgICAgIGxheW91dCxcbiAgICAgICAgICAgIHBvc01hdHJpeCxcbiAgICAgICAgICAgIHRleHRMYWJlbFBsYW5lTWF0cml4LFxuICAgICAgICAgICAgbGFiZWxUb1NjcmVlbk1hdHJpeCxcbiAgICAgICAgICAgIGNsaXBwaW5nRGF0YSxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgdGV4dFBpeGVsUmF0aW8sXG4gICAgICAgICAgICBob2xkaW5nRm9yRmFkZTogdGlsZS5ob2xkaW5nRm9yRmFkZSgpLFxuICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICBwYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZTogc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHN5bWJvbEJ1Y2tldC50ZXh0U2l6ZURhdGEsIHRoaXMudHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAgICAgcGFydGlhbGx5RXZhbHVhdGVkSWNvblNpemU6IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbShzeW1ib2xCdWNrZXQuaWNvblNpemVEYXRhLCB0aGlzLnRyYW5zZm9ybS56b29tKSxcbiAgICAgICAgICAgIGNvbGxpc2lvbkdyb3VwOiB0aGlzLmNvbGxpc2lvbkdyb3Vwcy5nZXQoc3ltYm9sQnVja2V0LnNvdXJjZUlEKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzb3J0QWNyb3NzVGlsZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmFuZ2Ugb2Ygc3ltYm9sQnVja2V0LnNvcnRLZXlSYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7c29ydEtleSwgc3ltYm9sSW5zdGFuY2VTdGFydCwgc3ltYm9sSW5zdGFuY2VFbmR9ID0gcmFuZ2U7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtzb3J0S2V5LCBzeW1ib2xJbnN0YW5jZVN0YXJ0LCBzeW1ib2xJbnN0YW5jZUVuZCwgcGFyYW1ldGVyc30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZVN0YXJ0OiAwLFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlRW5kOiBzeW1ib2xCdWNrZXQuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF0dGVtcHRBbmNob3JQbGFjZW1lbnQoYW5jaG9yOiBUZXh0QW5jaG9yLCB0ZXh0Qm94OiBTaW5nbGVDb2xsaXNpb25Cb3gsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFNjYWxlOiBudW1iZXIsIHJvdGF0ZVdpdGhNYXA6IGJvb2xlYW4sIHBpdGNoV2l0aE1hcDogYm9vbGVhbiwgdGV4dFBpeGVsUmF0aW86IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc01hdHJpeDogbWF0NCwgY29sbGlzaW9uR3JvdXA6IENvbGxpc2lvbkdyb3VwLCB0ZXh0QWxsb3dPdmVybGFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCBzeW1ib2xJbmRleDogbnVtYmVyLCBidWNrZXQ6IFN5bWJvbEJ1Y2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiBudW1iZXIsIGljb25Cb3g6ID9TaW5nbGVDb2xsaXNpb25Cb3gsIHRleHRTaXplOiBhbnksIGljb25TaXplOiBhbnkpOiA/eyBzaGlmdDogUG9pbnQsIHBsYWNlZEdseXBoQm94ZXM6IHsgYm94OiBBcnJheTxudW1iZXI+LCBvZmZzY3JlZW46IGJvb2xlYW4gfSB9ICB7XG5cbiAgICAgICAgY29uc3QgdGV4dE9mZnNldCA9IFtzeW1ib2xJbnN0YW5jZS50ZXh0T2Zmc2V0MCwgc3ltYm9sSW5zdGFuY2UudGV4dE9mZnNldDFdO1xuICAgICAgICBjb25zdCBzaGlmdCA9IGNhbGN1bGF0ZVZhcmlhYmxlTGF5b3V0U2hpZnQoYW5jaG9yLCB3aWR0aCwgaGVpZ2h0LCB0ZXh0T2Zmc2V0LCB0ZXh0U2NhbGUpO1xuXG4gICAgICAgIGNvbnN0IHBsYWNlZEdseXBoQm94ZXMgPSB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KFxuICAgICAgICAgICAgdGV4dFNjYWxlLCB0ZXh0Qm94LCBvZmZzZXRTaGlmdChzaGlmdC54LCBzaGlmdC55LCByb3RhdGVXaXRoTWFwLCBwaXRjaFdpdGhNYXAsIHRoaXMudHJhbnNmb3JtLmFuZ2xlKSxcbiAgICAgICAgICAgIHRleHRBbGxvd092ZXJsYXAsIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgsIGNvbGxpc2lvbkdyb3VwLnByZWRpY2F0ZSk7XG5cbiAgICAgICAgaWYgKGljb25Cb3gpIHtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlZEljb25Cb3hlcyA9IHRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3goXG4gICAgICAgICAgICAgICAgYnVja2V0LmdldFN5bWJvbEluc3RhbmNlSWNvblNpemUoaWNvblNpemUsIHRoaXMudHJhbnNmb3JtLnpvb20sIHN5bWJvbEluZGV4KSxcbiAgICAgICAgICAgICAgICBpY29uQm94LCBvZmZzZXRTaGlmdChzaGlmdC54LCBzaGlmdC55LCByb3RhdGVXaXRoTWFwLCBwaXRjaFdpdGhNYXAsIHRoaXMudHJhbnNmb3JtLmFuZ2xlKSxcbiAgICAgICAgICAgICAgICB0ZXh0QWxsb3dPdmVybGFwLCB0ZXh0UGl4ZWxSYXRpbywgcG9zTWF0cml4LCBjb2xsaXNpb25Hcm91cC5wcmVkaWNhdGUpO1xuICAgICAgICAgICAgaWYgKHBsYWNlZEljb25Cb3hlcy5ib3gubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxhY2VkR2x5cGhCb3hlcy5ib3gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHByZXZBbmNob3I7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGxhYmVsIHdhcyBwbGFjZWQgaW4gdGhlIHByZXZpb3VzIHBsYWNlbWVudCwgcmVjb3JkIHRoZSBhbmNob3IgcG9zaXRpb25cbiAgICAgICAgICAgIC8vIHRvIGFsbG93IHVzIHRvIGFuaW1hdGUgdGhlIHRyYW5zaXRpb25cbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZQbGFjZW1lbnQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSAmJlxuICAgICAgICAgICAgICAgIHRoaXMucHJldlBsYWNlbWVudC5wbGFjZW1lbnRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSAmJlxuICAgICAgICAgICAgICAgIHRoaXMucHJldlBsYWNlbWVudC5wbGFjZW1lbnRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgcHJldkFuY2hvciA9IHRoaXMucHJldlBsYWNlbWVudC52YXJpYWJsZU9mZnNldHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdLmFuY2hvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzc2VydChzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCAhPT0gMCk7XG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSB7XG4gICAgICAgICAgICAgICAgdGV4dE9mZnNldCxcbiAgICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgICAgIHRleHRTY2FsZSxcbiAgICAgICAgICAgICAgICBwcmV2QW5jaG9yXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5tYXJrVXNlZEp1c3RpZmljYXRpb24oYnVja2V0LCBhbmNob3IsIHN5bWJvbEluc3RhbmNlLCBvcmllbnRhdGlvbik7XG5cbiAgICAgICAgICAgIGlmIChidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFya1VzZWRPcmllbnRhdGlvbihidWNrZXQsIG9yaWVudGF0aW9uLCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gb3JpZW50YXRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7c2hpZnQsIHBsYWNlZEdseXBoQm94ZXN9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGxhY2VMYXllckJ1Y2tldFBhcnQoYnVja2V0UGFydDogT2JqZWN0LCBzZWVuQ3Jvc3NUaWxlSURzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBib29sZWFuIH0sIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbiwgdXBkYXRlQ29sbGlzaW9uQm94SWZOZWNlc3Nhcnk6IGJvb2xlYW4pIHtcblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBidWNrZXQsXG4gICAgICAgICAgICBsYXlvdXQsXG4gICAgICAgICAgICBwb3NNYXRyaXgsXG4gICAgICAgICAgICB0ZXh0TGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgICAgIGxhYmVsVG9TY3JlZW5NYXRyaXgsXG4gICAgICAgICAgICBjbGlwcGluZ0RhdGEsXG4gICAgICAgICAgICB0ZXh0UGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIGhvbGRpbmdGb3JGYWRlLFxuICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICBwYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZSxcbiAgICAgICAgICAgIHBhcnRpYWxseUV2YWx1YXRlZEljb25TaXplLFxuICAgICAgICAgICAgY29sbGlzaW9uR3JvdXBcbiAgICAgICAgfSA9IGJ1Y2tldFBhcnQucGFyYW1ldGVycztcblxuICAgICAgICBjb25zdCB0ZXh0T3B0aW9uYWwgPSBsYXlvdXQuZ2V0KCd0ZXh0LW9wdGlvbmFsJyk7XG4gICAgICAgIGNvbnN0IGljb25PcHRpb25hbCA9IGxheW91dC5nZXQoJ2ljb24tb3B0aW9uYWwnKTtcbiAgICAgICAgY29uc3QgdGV4dEFsbG93T3ZlcmxhcCA9IGxheW91dC5nZXQoJ3RleHQtYWxsb3ctb3ZlcmxhcCcpO1xuICAgICAgICBjb25zdCBpY29uQWxsb3dPdmVybGFwID0gbGF5b3V0LmdldCgnaWNvbi1hbGxvdy1vdmVybGFwJyk7XG4gICAgICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJztcbiAgICAgICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gbGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG4gICAgICAgIGNvbnN0IGhhc0ljb25UZXh0Rml0ID0gbGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpICE9PSAnbm9uZSc7XG4gICAgICAgIGNvbnN0IHpPcmRlckJ5Vmlld3BvcnRZID0gbGF5b3V0LmdldCgnc3ltYm9sLXotb3JkZXInKSA9PT0gJ3ZpZXdwb3J0LXknO1xuXG4gICAgICAgIC8vIFRoaXMgbG9naWMgaXMgc2ltaWxhciB0byB0aGUgXCJkZWZhdWx0T3BhY2l0eVN0YXRlXCIgbG9naWMgYmVsb3cgaW4gdXBkYXRlQnVja2V0T3BhY2l0aWVzXG4gICAgICAgIC8vIElmIHdlIGtub3cgYSBzeW1ib2wgaXMgYWx3YXlzIHN1cHBvc2VkIHRvIHNob3csIGZvcmNlIGl0IHRvIGJlIG1hcmtlZCB2aXNpYmxlIGV2ZW4gaWZcbiAgICAgICAgLy8gaXQgd2Fzbid0IHBsYWNlZCBpbnRvIHRoZSBjb2xsaXNpb24gaW5kZXggKGJlY2F1c2Ugc29tZSBvciBhbGwgb2YgaXQgd2FzIG91dHNpZGUgdGhlIHJhbmdlXG4gICAgICAgIC8vIG9mIHRoZSBjb2xsaXNpb24gZ3JpZCkuXG4gICAgICAgIC8vIFRoZXJlIGlzIGEgc3VidGxlIGVkZ2UgY2FzZSBoZXJlIHdlJ3JlIGFjY2VwdGluZzpcbiAgICAgICAgLy8gIFN5bWJvbCBBIGhhcyB0ZXh0LWFsbG93LW92ZXJsYXA6IHRydWUsIGljb24tYWxsb3ctb3ZlcmxhcDogdHJ1ZSwgaWNvbi1vcHRpb25hbDogZmFsc2VcbiAgICAgICAgLy8gIEEncyBpY29uIGlzIG91dHNpZGUgdGhlIGdyaWQsIHNvIGRvZXNuJ3QgZ2V0IHBsYWNlZFxuICAgICAgICAvLyAgQSdzIHRleHQgd291bGQgYmUgaW5zaWRlIGdyaWQsIGJ1dCBkb2Vzbid0IGdldCBwbGFjZWQgYmVjYXVzZSBvZiBpY29uLW9wdGlvbmFsOiBmYWxzZVxuICAgICAgICAvLyAgV2Ugc3RpbGwgc2hvdyBBIGJlY2F1c2Ugb2YgdGhlIGFsbG93LW92ZXJsYXAgc2V0dGluZ3MuXG4gICAgICAgIC8vICBTeW1ib2wgQiBoYXMgYWxsb3ctb3ZlcmxhcDogZmFsc2UsIGFuZCBnZXRzIHBsYWNlZCB3aGVyZSBBJ3MgdGV4dCB3b3VsZCBiZVxuICAgICAgICAvLyAgT24gcGFubmluZyBpbiwgdGhlcmUgaXMgYSBzaG9ydCBwZXJpb2Qgd2hlbiBTeW1ib2wgQiBhbmQgU3ltYm9sIEEgd2lsbCBvdmVybGFwXG4gICAgICAgIC8vICBUaGlzIGlzIHRoZSByZXZlcnNlIG9mIG91ciBub3JtYWwgcG9saWN5IG9mIFwiZmFkZSBpbiBvbiBwYW5cIiwgYnV0IHNob3VsZCBsb29rIGxpa2UgYW55IG90aGVyXG4gICAgICAgIC8vICBjb2xsaXNpb24gYW5kIGhvcGVmdWxseSBub3QgYmUgdG9vIG5vdGljZWFibGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNzE3MlxuICAgICAgICBjb25zdCBhbHdheXNTaG93VGV4dCA9IHRleHRBbGxvd092ZXJsYXAgJiYgKGljb25BbGxvd092ZXJsYXAgfHwgIWJ1Y2tldC5oYXNJY29uRGF0YSgpIHx8IGljb25PcHRpb25hbCk7XG4gICAgICAgIGNvbnN0IGFsd2F5c1Nob3dJY29uID0gaWNvbkFsbG93T3ZlcmxhcCAmJiAodGV4dEFsbG93T3ZlcmxhcCB8fCAhYnVja2V0Lmhhc1RleHREYXRhKCkgfHwgdGV4dE9wdGlvbmFsKTtcblxuICAgICAgICBpZiAoIWJ1Y2tldC5jb2xsaXNpb25BcnJheXMgJiYgY29sbGlzaW9uQm94QXJyYXkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKGNvbGxpc2lvbkJveEFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaG93Q29sbGlzaW9uQm94ZXMgJiYgdXBkYXRlQ29sbGlzaW9uQm94SWZOZWNlc3NhcnkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC51cGRhdGVDb2xsaXNpb25EZWJ1Z0J1ZmZlcnModGhpcy50cmFuc2Zvcm0uem9vbSwgY29sbGlzaW9uQm94QXJyYXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGxhY2VTeW1ib2wgPSAoc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCBzeW1ib2xJbmRleDogbnVtYmVyLCBjb2xsaXNpb25BcnJheXM6IENvbGxpc2lvbkFycmF5cykgPT4ge1xuICAgICAgICAgICAgaWYgKGNsaXBwaW5nRGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIFNldHVwIGdsb2JhbHNcbiAgICAgICAgICAgICAgICBjb25zdCBnbG9iYWxzID0ge1xuICAgICAgICAgICAgICAgICAgICB6b29tOiB0aGlzLnRyYW5zZm9ybS56b29tLFxuICAgICAgICAgICAgICAgICAgICBwaXRjaDogdGhpcy50cmFuc2Zvcm0ucGl0Y2gsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8vIERlc2VyaWFsaXplIGZlYXR1cmUgb25seSBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICBsZXQgZmVhdHVyZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGNsaXBwaW5nRGF0YS5keW5hbWljRmlsdGVyTmVlZHNGZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVJbmRleCA9IGNsaXBwaW5nRGF0YS5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldGFpbmVkUXVlcnlEYXRhID0gdGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YVtidWNrZXQuYnVja2V0SW5zdGFuY2VJZF07XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUgPSBmZWF0dXJlSW5kZXgubG9hZEZlYXR1cmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4OiBzeW1ib2xJbnN0YW5jZS5mZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogcmV0YWluZWRRdWVyeURhdGEuYnVja2V0SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4OiByZXRhaW5lZFF1ZXJ5RGF0YS5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0VmVydGV4QXJyYXlPZmZzZXQ6IDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbFRpbGVJZCA9IHRoaXMucmV0YWluZWRRdWVyeURhdGFbYnVja2V0LmJ1Y2tldEluc3RhbmNlSWRdLnRpbGVJRC5jYW5vbmljYWw7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJGdW5jID0gY2xpcHBpbmdEYXRhLmR5bmFtaWNGaWx0ZXI7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkQ2xpcCA9ICFmaWx0ZXJGdW5jKGdsb2JhbHMsIGZlYXR1cmUsIGNhbm9uaWNhbFRpbGVJZCwgbmV3IFBvaW50KHN5bWJvbEluc3RhbmNlLnRpbGVBbmNob3JYLCBzeW1ib2xJbnN0YW5jZS50aWxlQW5jaG9yWSksIHRoaXMudHJhbnNmb3JtLmNhbGN1bGF0ZURpc3RhbmNlVGlsZURhdGEoY2xpcHBpbmdEYXRhLnVud3JhcHBlZFRpbGVJRCkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENsaXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IG5ldyBKb2ludFBsYWNlbWVudChmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgc2VlbkNyb3NzVGlsZUlEc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VlbkNyb3NzVGlsZUlEc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0pIHJldHVybjtcbiAgICAgICAgICAgIGlmIChob2xkaW5nRm9yRmFkZSkge1xuICAgICAgICAgICAgICAgIC8vIE1hcmsgYWxsIHN5bWJvbHMgZnJvbSB0aGlzIHRpbGUgYXMgXCJub3QgcGxhY2VkXCIsIGJ1dCBkb24ndCBhZGQgdG8gc2VlbkNyb3NzVGlsZUlEcywgYmVjYXVzZSB3ZSBkb24ndFxuICAgICAgICAgICAgICAgIC8vIGtub3cgeWV0IGlmIHdlIGhhdmUgYSBkdXBsaWNhdGUgaW4gYSBwYXJlbnQgdGlsZSB0aGF0IF9zaG91bGRfIGJlIHBsYWNlZC5cbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gbmV3IEpvaW50UGxhY2VtZW50KGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwbGFjZVRleHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwbGFjZUljb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBvZmZzY3JlZW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHNoaWZ0ID0gbnVsbDtcblxuICAgICAgICAgICAgbGV0IHBsYWNlZCA9IHtib3g6IG51bGwsIG9mZnNjcmVlbjogbnVsbH07XG4gICAgICAgICAgICBsZXQgcGxhY2VkVmVydGljYWxUZXh0ID0ge2JveDogbnVsbCwgb2Zmc2NyZWVuOiBudWxsfTtcblxuICAgICAgICAgICAgbGV0IHBsYWNlZEdseXBoQm94ZXMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHBsYWNlZEdseXBoQ2lyY2xlcyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgcGxhY2VkSWNvbkJveGVzID0gbnVsbDtcbiAgICAgICAgICAgIGxldCB0ZXh0RmVhdHVyZUluZGV4ID0gMDtcbiAgICAgICAgICAgIGxldCB2ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGljb25GZWF0dXJlSW5kZXggPSAwO1xuXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLnRleHRGZWF0dXJlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0ZXh0RmVhdHVyZUluZGV4ID0gY29sbGlzaW9uQXJyYXlzLnRleHRGZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN5bWJvbEluc3RhbmNlLnVzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzKSB7XG4gICAgICAgICAgICAgICAgdGV4dEZlYXR1cmVJbmRleCA9IHN5bWJvbEluc3RhbmNlLmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMudmVydGljYWxUZXh0RmVhdHVyZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmVydGljYWxUZXh0RmVhdHVyZUluZGV4ID0gY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdXBkYXRlQm94RGF0YSA9IChib3g6IFNpbmdsZUNvbGxpc2lvbkJveCkgPT4ge1xuICAgICAgICAgICAgICAgIGJveC50aWxlSUQgPSB0aGlzLnJldGFpbmVkUXVlcnlEYXRhW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXS50aWxlSUQ7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRyYW5zZm9ybS5lbGV2YXRpb24gJiYgIWJveC5lbGV2YXRpb24pIHJldHVybjtcbiAgICAgICAgICAgICAgICBib3guZWxldmF0aW9uID0gdGhpcy50cmFuc2Zvcm0uZWxldmF0aW9uID8gdGhpcy50cmFuc2Zvcm0uZWxldmF0aW9uLmdldEF0VGlsZU9mZnNldChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YVtidWNrZXQuYnVja2V0SW5zdGFuY2VJZF0udGlsZUlELFxuICAgICAgICAgICAgICAgICAgICBib3gudGlsZUFuY2hvclgsIGJveC50aWxlQW5jaG9yWSkgOiAwO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgdGV4dEJveCA9IGNvbGxpc2lvbkFycmF5cy50ZXh0Qm94O1xuICAgICAgICAgICAgaWYgKHRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVCb3hEYXRhKHRleHRCb3gpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVByZXZpb3VzT3JpZW50YXRpb25JZk5vdFBsYWNlZCA9IChpc1BsYWNlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXNPcmllbnRhdGlvbiA9IFdyaXRpbmdNb2RlLmhvcml6b250YWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiAhaXNQbGFjZWQgJiYgdGhpcy5wcmV2UGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2UGxhY2VkT3JpZW50YXRpb24gPSB0aGlzLnByZXZQbGFjZW1lbnQucGxhY2VkT3JpZW50YXRpb25zW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2UGxhY2VkT3JpZW50YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSBwcmV2UGxhY2VkT3JpZW50YXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNPcmllbnRhdGlvbiA9IHByZXZQbGFjZWRPcmllbnRhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkT3JpZW50YXRpb24oYnVja2V0LCBwcmV2aW91c09yaWVudGF0aW9uLCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzT3JpZW50YXRpb247XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlVGV4dEZvclBsYWNlbWVudE1vZGVzID0gKHBsYWNlSG9yaXpvbnRhbEZuLCBwbGFjZVZlcnRpY2FsRm4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIHN5bWJvbEluc3RhbmNlLm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA+IDAgJiYgY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwbGFjZW1lbnRNb2RlIG9mIGJ1Y2tldC53cml0aW5nTW9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VtZW50TW9kZSA9PT0gV3JpdGluZ01vZGUudmVydGljYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VkID0gcGxhY2VWZXJ0aWNhbEZuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZFZlcnRpY2FsVGV4dCA9IHBsYWNlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWQgPSBwbGFjZUhvcml6b250YWxGbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VkICYmIHBsYWNlZC5ib3ggJiYgcGxhY2VkLmJveC5sZW5ndGgpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VkID0gcGxhY2VIb3Jpem9udGFsRm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VCb3ggPSAoY29sbGlzaW9uVGV4dEJveCwgb3JpZW50YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRTY2FsZSA9IGJ1Y2tldC5nZXRTeW1ib2xJbnN0YW5jZVRleHRTaXplKHBhcnRpYWxseUV2YWx1YXRlZFRleHRTaXplLCBzeW1ib2xJbnN0YW5jZSwgdGhpcy50cmFuc2Zvcm0uem9vbSwgc3ltYm9sSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VkRmVhdHVyZSA9IHRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3godGV4dFNjYWxlLCBjb2xsaXNpb25UZXh0Qm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludCgwLCAwKSwgdGV4dEFsbG93T3ZlcmxhcCwgdGV4dFBpeGVsUmF0aW8sIHBvc01hdHJpeCwgY29sbGlzaW9uR3JvdXAucHJlZGljYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWRGZWF0dXJlICYmIHBsYWNlZEZlYXR1cmUuYm94ICYmIHBsYWNlZEZlYXR1cmUuYm94Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFya1VzZWRPcmllbnRhdGlvbihidWNrZXQsIG9yaWVudGF0aW9uLCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gb3JpZW50YXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2VkRmVhdHVyZTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZUhvcml6b250YWwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2VCb3godGV4dEJveCwgV3JpdGluZ01vZGUuaG9yaXpvbnRhbCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VWZXJ0aWNhbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsVGV4dEJveCA9IGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbFRleHRCb3g7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgc3ltYm9sSW5zdGFuY2UubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID4gMCAmJiB2ZXJ0aWNhbFRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVCb3hEYXRhKHZlcnRpY2FsVGV4dEJveCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlQm94KHZlcnRpY2FsVGV4dEJveCwgV3JpdGluZ01vZGUudmVydGljYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtib3g6IG51bGwsIG9mZnNjcmVlbjogbnVsbH07XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgcGxhY2VUZXh0Rm9yUGxhY2VtZW50TW9kZXMocGxhY2VIb3Jpem9udGFsLCBwbGFjZVZlcnRpY2FsKTtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJldmlvdXNPcmllbnRhdGlvbklmTm90UGxhY2VkKHBsYWNlZCAmJiBwbGFjZWQuYm94ICYmIHBsYWNlZC5ib3gubGVuZ3RoKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JzID0gbGF5b3V0LmdldCgndGV4dC12YXJpYWJsZS1hbmNob3InKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHN5bWJvbCB3YXMgaW4gdGhlIGxhc3QgcGxhY2VtZW50LCBzaGlmdCB0aGUgcHJldmlvdXNseSB1c2VkXG4gICAgICAgICAgICAgICAgICAgIC8vIGFuY2hvciB0byB0aGUgZnJvbnQgb2YgdGhlIGFuY2hvciBsaXN0LCBvbmx5IGlmIHRoZSBwcmV2aW91cyBhbmNob3JcbiAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3RpbGwgaW4gdGhlIGFuY2hvciBsaXN0XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXZQbGFjZW1lbnQgJiYgdGhpcy5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZPZmZzZXRzID0gdGhpcy5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jaG9ycy5pbmRleE9mKHByZXZPZmZzZXRzLmFuY2hvcikgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9ycyA9IGFuY2hvcnMuZmlsdGVyKGFuY2hvciA9PiBhbmNob3IgIT09IHByZXZPZmZzZXRzLmFuY2hvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9ycy51bnNoaWZ0KHByZXZPZmZzZXRzLmFuY2hvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZUJveEZvclZhcmlhYmxlQW5jaG9ycyA9IChjb2xsaXNpb25UZXh0Qm94LCBjb2xsaXNpb25JY29uQm94LCBvcmllbnRhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFNjYWxlID0gYnVja2V0LmdldFN5bWJvbEluc3RhbmNlVGV4dFNpemUocGFydGlhbGx5RXZhbHVhdGVkVGV4dFNpemUsIHN5bWJvbEluc3RhbmNlLCB0aGlzLnRyYW5zZm9ybS56b29tLCBzeW1ib2xJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IChjb2xsaXNpb25UZXh0Qm94LngyIC0gY29sbGlzaW9uVGV4dEJveC54MSkgKiB0ZXh0U2NhbGUgKyAyLjAgKiBjb2xsaXNpb25UZXh0Qm94LnBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHQgPSAoY29sbGlzaW9uVGV4dEJveC55MiAtIGNvbGxpc2lvblRleHRCb3gueTEpICogdGV4dFNjYWxlICsgMi4wICogY29sbGlzaW9uVGV4dEJveC5wYWRkaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYWJsZUljb25Cb3ggPSBoYXNJY29uVGV4dEZpdCAmJiAhaWNvbkFsbG93T3ZlcmxhcCA/IGNvbGxpc2lvbkljb25Cb3ggOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlSWNvbkJveCkgdXBkYXRlQm94RGF0YSh2YXJpYWJsZUljb25Cb3gpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGxhY2VkQm94OiA/eyBib3g6IEFycmF5PG51bWJlcj4sIG9mZnNjcmVlbjogYm9vbGVhbiB9ICA9IHtib3g6IFtdLCBvZmZzY3JlZW46IGZhbHNlfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudEF0dGVtcHRzID0gdGV4dEFsbG93T3ZlcmxhcCA/IGFuY2hvcnMubGVuZ3RoICogMiA6IGFuY2hvcnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFjZW1lbnRBdHRlbXB0czsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gYW5jaG9yc1tpICUgYW5jaG9ycy5sZW5ndGhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG93T3ZlcmxhcCA9IChpID49IGFuY2hvcnMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmF0dGVtcHRBbmNob3JQbGFjZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvciwgY29sbGlzaW9uVGV4dEJveCwgd2lkdGgsIGhlaWdodCwgdGV4dFNjYWxlLCByb3RhdGVXaXRoTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaFdpdGhNYXAsIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgsIGNvbGxpc2lvbkdyb3VwLCBhbGxvd092ZXJsYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLCBzeW1ib2xJbmRleCwgYnVja2V0LCBvcmllbnRhdGlvbiwgdmFyaWFibGVJY29uQm94LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZSwgcGFydGlhbGx5RXZhbHVhdGVkSWNvblNpemUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWRCb3ggPSByZXN1bHQucGxhY2VkR2x5cGhCb3hlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsYWNlZEJveCAmJiBwbGFjZWRCb3guYm94ICYmIHBsYWNlZEJveC5ib3gubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZVRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSByZXN1bHQuc2hpZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlZEJveDtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZUhvcml6b250YWwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2VCb3hGb3JWYXJpYWJsZUFuY2hvcnModGV4dEJveCwgY29sbGlzaW9uQXJyYXlzLmljb25Cb3gsIFdyaXRpbmdNb2RlLmhvcml6b250YWwpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlVmVydGljYWwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbFRleHRCb3ggPSBjb2xsaXNpb25BcnJheXMudmVydGljYWxUZXh0Qm94O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnRpY2FsVGV4dEJveCkgdXBkYXRlQm94RGF0YSh2ZXJ0aWNhbFRleHRCb3gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FzUGxhY2VkID0gcGxhY2VkICYmIHBsYWNlZC5ib3ggJiYgcGxhY2VkLmJveC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgIXdhc1BsYWNlZCAmJiBzeW1ib2xJbnN0YW5jZS5udW1WZXJ0aWNhbEdseXBoVmVydGljZXMgPiAwICYmIHZlcnRpY2FsVGV4dEJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGFjZUJveEZvclZhcmlhYmxlQW5jaG9ycyh2ZXJ0aWNhbFRleHRCb3gsIGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbEljb25Cb3gsIFdyaXRpbmdNb2RlLnZlcnRpY2FsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Ym94OiBudWxsLCBvZmZzY3JlZW46IG51bGx9O1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlVGV4dEZvclBsYWNlbWVudE1vZGVzKHBsYWNlSG9yaXpvbnRhbCwgcGxhY2VWZXJ0aWNhbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBsYWNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VUZXh0ID0gcGxhY2VkLmJveDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbiA9IHBsYWNlZC5vZmZzY3JlZW47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2T3JpZW50YXRpb24gPSB1cGRhdGVQcmV2aW91c09yaWVudGF0aW9uSWZOb3RQbGFjZWQocGxhY2VkICYmIHBsYWNlZC5ib3gpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGRpZG4ndCBnZXQgcGxhY2VkLCB3ZSBzdGlsbCBuZWVkIHRvIGNvcHkgb3VyIHBvc2l0aW9uIGZyb20gdGhlIGxhc3QgcGxhY2VtZW50IGZvclxuICAgICAgICAgICAgICAgICAgICAvLyBmYWRlIGFuaW1hdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGFjZVRleHQgJiYgdGhpcy5wcmV2UGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2T2Zmc2V0ID0gdGhpcy5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldk9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IHByZXZPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrVXNlZEp1c3RpZmljYXRpb24oYnVja2V0LCBwcmV2T2Zmc2V0LmFuY2hvciwgc3ltYm9sSW5zdGFuY2UsIHByZXZPcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGxhY2VkR2x5cGhCb3hlcyA9IHBsYWNlZDtcbiAgICAgICAgICAgIHBsYWNlVGV4dCA9IHBsYWNlZEdseXBoQm94ZXMgJiYgcGxhY2VkR2x5cGhCb3hlcy5ib3ggJiYgcGxhY2VkR2x5cGhCb3hlcy5ib3gubGVuZ3RoID4gMDtcblxuICAgICAgICAgICAgb2Zmc2NyZWVuID0gcGxhY2VkR2x5cGhCb3hlcyAmJiBwbGFjZWRHbHlwaEJveGVzLm9mZnNjcmVlbjtcblxuICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnVzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VkU3ltYm9sSW5kZXggPSBzeW1ib2xJbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXggPj0gMCA/IHN5bWJvbEluc3RhbmNlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCA6IHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlZFN5bWJvbCA9IGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChwbGFjZWRTeW1ib2xJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9udFNpemUgPSBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvckZlYXR1cmUoYnVja2V0LnRleHRTaXplRGF0YSwgcGFydGlhbGx5RXZhbHVhdGVkVGV4dFNpemUsIHBsYWNlZFN5bWJvbCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0UGl4ZWxQYWRkaW5nID0gbGF5b3V0LmdldCgndGV4dC1wYWRkaW5nJyk7XG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCBjaXJjbGUgY29sbGlzaW9uIGhlaWdodCBpbnRvIHBpeGVsc1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpcmNsZVBpeGVsRGlhbWV0ZXIgPSBzeW1ib2xJbnN0YW5jZS5jb2xsaXNpb25DaXJjbGVEaWFtZXRlciAqIGZvbnRTaXplIC8gT05FX0VNO1xuXG4gICAgICAgICAgICAgICAgcGxhY2VkR2x5cGhDaXJjbGVzID0gdGhpcy5jb2xsaXNpb25JbmRleC5wbGFjZUNvbGxpc2lvbkNpcmNsZXModGV4dEFsbG93T3ZlcmxhcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZFN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5saW5lVmVydGV4QXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuZ2x5cGhPZmZzZXRBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zTWF0cml4LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dExhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbFRvU2NyZWVuTWF0cml4LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbGxpc2lvbkJveGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uR3JvdXAucHJlZGljYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlUGl4ZWxEaWFtZXRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRQaXhlbFBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJldGFpbmVkUXVlcnlEYXRhW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXS50aWxlSUQpO1xuXG4gICAgICAgICAgICAgICAgYXNzZXJ0KCFwbGFjZWRHbHlwaENpcmNsZXMuY2lyY2xlcy5sZW5ndGggfHwgKCFwbGFjZWRHbHlwaENpcmNsZXMuY29sbGlzaW9uRGV0ZWN0ZWQgfHwgc2hvd0NvbGxpc2lvbkJveGVzKSk7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGV4dC1hbGxvdy1vdmVybGFwIGlzIHNldCwgZm9yY2UgXCJwbGFjZWRDaXJjbGVzXCIgdG8gdHJ1ZVxuICAgICAgICAgICAgICAgIC8vIEluIHRoZW9yeSB0aGVyZSBzaG91bGQgYWx3YXlzIGJlIGF0IGxlYXN0IG9uZSBjaXJjbGUgcGxhY2VkXG4gICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLCBidXQgZm9yIG5vdyBxdWlya3MgaW4gdGV4dC1hbmNob3JcbiAgICAgICAgICAgICAgICAvLyBhbmQgdGV4dC1vZmZzZXQgbWF5IHByZXZlbnQgdGhhdCBmcm9tIGJlaW5nIHRydWUuXG4gICAgICAgICAgICAgICAgcGxhY2VUZXh0ID0gdGV4dEFsbG93T3ZlcmxhcCB8fCAocGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXMubGVuZ3RoID4gMCAmJiAhcGxhY2VkR2x5cGhDaXJjbGVzLmNvbGxpc2lvbkRldGVjdGVkKTtcbiAgICAgICAgICAgICAgICBvZmZzY3JlZW4gPSBvZmZzY3JlZW4gJiYgcGxhY2VkR2x5cGhDaXJjbGVzLm9mZnNjcmVlbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy5pY29uRmVhdHVyZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgaWNvbkZlYXR1cmVJbmRleCA9IGNvbGxpc2lvbkFycmF5cy5pY29uRmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLmljb25Cb3gpIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlSWNvbkZlYXR1cmUgPSBpY29uQm94ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQm94RGF0YShpY29uQm94KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hpZnRQb2ludDogUG9pbnQgPSBoYXNJY29uVGV4dEZpdCAmJiBzaGlmdCA/XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRTaGlmdChzaGlmdC54LCBzaGlmdC55LCByb3RhdGVXaXRoTWFwLCBwaXRjaFdpdGhNYXAsIHRoaXMudHJhbnNmb3JtLmFuZ2xlKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGljb25TY2FsZSA9IGJ1Y2tldC5nZXRTeW1ib2xJbnN0YW5jZUljb25TaXplKHBhcnRpYWxseUV2YWx1YXRlZEljb25TaXplLCB0aGlzLnRyYW5zZm9ybS56b29tLCBzeW1ib2xJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KGljb25TY2FsZSwgaWNvbkJveCwgc2hpZnRQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25BbGxvd092ZXJsYXAsIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgsIGNvbGxpc2lvbkdyb3VwLnByZWRpY2F0ZSk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChwbGFjZWRWZXJ0aWNhbFRleHQgJiYgcGxhY2VkVmVydGljYWxUZXh0LmJveCAmJiBwbGFjZWRWZXJ0aWNhbFRleHQuYm94Lmxlbmd0aCAmJiBjb2xsaXNpb25BcnJheXMudmVydGljYWxJY29uQm94KSB7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlZEljb25Cb3hlcyA9IHBsYWNlSWNvbkZlYXR1cmUoY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsSWNvbkJveCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlSWNvbiA9IHBsYWNlZEljb25Cb3hlcy5ib3gubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWRJY29uQm94ZXMgPSBwbGFjZUljb25GZWF0dXJlKGNvbGxpc2lvbkFycmF5cy5pY29uQm94KTtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VJY29uID0gcGxhY2VkSWNvbkJveGVzLmJveC5sZW5ndGggPiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvZmZzY3JlZW4gPSBvZmZzY3JlZW4gJiYgcGxhY2VkSWNvbkJveGVzLm9mZnNjcmVlbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaWNvbldpdGhvdXRUZXh0ID0gdGV4dE9wdGlvbmFsIHx8XG4gICAgICAgICAgICAgICAgKHN5bWJvbEluc3RhbmNlLm51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzID09PSAwICYmIHN5bWJvbEluc3RhbmNlLm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA9PT0gMCk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0V2l0aG91dEljb24gPSBpY29uT3B0aW9uYWwgfHwgc3ltYm9sSW5zdGFuY2UubnVtSWNvblZlcnRpY2VzID09PSAwO1xuXG4gICAgICAgICAgICAvLyBDb21iaW5lIHRoZSBzY2FsZXMgZm9yIGljb25zIGFuZCB0ZXh0LlxuICAgICAgICAgICAgaWYgKCFpY29uV2l0aG91dFRleHQgJiYgIXRleHRXaXRob3V0SWNvbikge1xuICAgICAgICAgICAgICAgIHBsYWNlSWNvbiA9IHBsYWNlVGV4dCA9IHBsYWNlSWNvbiAmJiBwbGFjZVRleHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0ZXh0V2l0aG91dEljb24pIHtcbiAgICAgICAgICAgICAgICBwbGFjZVRleHQgPSBwbGFjZUljb24gJiYgcGxhY2VUZXh0O1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaWNvbldpdGhvdXRUZXh0KSB7XG4gICAgICAgICAgICAgICAgcGxhY2VJY29uID0gcGxhY2VJY29uICYmIHBsYWNlVGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBsYWNlVGV4dCAmJiBwbGFjZWRHbHlwaEJveGVzICYmIHBsYWNlZEdseXBoQm94ZXMuYm94KSB7XG4gICAgICAgICAgICAgICAgaWYgKHBsYWNlZFZlcnRpY2FsVGV4dCAmJiBwbGFjZWRWZXJ0aWNhbFRleHQuYm94ICYmIHZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkJveChwbGFjZWRHbHlwaEJveGVzLmJveCwgbGF5b3V0LmdldCgndGV4dC1pZ25vcmUtcGxhY2VtZW50JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCwgdmVydGljYWxUZXh0RmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cC5JRCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25Cb3gocGxhY2VkR2x5cGhCb3hlcy5ib3gsIGxheW91dC5nZXQoJ3RleHQtaWdub3JlLXBsYWNlbWVudCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmJ1Y2tldEluc3RhbmNlSWQsIHRleHRGZWF0dXJlSW5kZXgsIGNvbGxpc2lvbkdyb3VwLklEKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwbGFjZUljb24gJiYgcGxhY2VkSWNvbkJveGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25Cb3gocGxhY2VkSWNvbkJveGVzLmJveCwgbGF5b3V0LmdldCgnaWNvbi1pZ25vcmUtcGxhY2VtZW50JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCwgaWNvbkZlYXR1cmVJbmRleCwgY29sbGlzaW9uR3JvdXAuSUQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBsYWNlZEdseXBoQ2lyY2xlcykge1xuICAgICAgICAgICAgICAgIGlmIChwbGFjZVRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsaXNpb25JbmRleC5pbnNlcnRDb2xsaXNpb25DaXJjbGVzKHBsYWNlZEdseXBoQ2lyY2xlcy5jaXJjbGVzLCBsYXlvdXQuZ2V0KCd0ZXh0LWlnbm9yZS1wbGFjZW1lbnQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkLCB0ZXh0RmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cC5JRCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHNob3dDb2xsaXNpb25Cb3hlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2lyY2xlQXJyYXkgPSB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5c1tpZF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR3JvdXAgY29sbGlzaW9uIGNpcmNsZXMgdG9nZXRoZXIgYnkgYnVja2V0LiBDaXJjbGVzIGNhbid0IGJlIHB1c2hlZCBmb3J3YXJkIGZvciByZW5kZXJpbmcgeWV0IGFzIHRoZSBzeW1ib2wgcGxhY2VtZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBhIGJ1Y2tldCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb21wbGV0ZSBiZWZvcmUgdGhlIGNvbW1pdC1mdW5jdGlvbiBoYXMgYmVlbiBjYWxsZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNpcmNsZUFycmF5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVBcnJheSA9IHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW2lkXSA9IG5ldyBDb2xsaXNpb25DaXJjbGVBcnJheSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZUFycmF5LmNpcmNsZXMucHVzaChwbGFjZWRHbHlwaENpcmNsZXMuY2lyY2xlc1tpICsgMF0pOyAgICAgICAgICAgICAgLy8geFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlQXJyYXkuY2lyY2xlcy5wdXNoKHBsYWNlZEdseXBoQ2lyY2xlcy5jaXJjbGVzW2kgKyAxXSk7ICAgICAgICAgICAgICAvLyB5XG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVBcnJheS5jaXJjbGVzLnB1c2gocGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXNbaSArIDJdKTsgICAgICAgICAgICAgIC8vIHJhZGl1c1xuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlQXJyYXkuY2lyY2xlcy5wdXNoKHBsYWNlZEdseXBoQ2lyY2xlcy5jb2xsaXNpb25EZXRlY3RlZCA/IDEgOiAwKTsgICAvLyBjb2xsaXNpb25EZXRlY3RlZC1mbGFnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFzc2VydChzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCAhPT0gMCk7XG4gICAgICAgICAgICBhc3NlcnQoYnVja2V0LmJ1Y2tldEluc3RhbmNlSWQgIT09IDApO1xuXG4gICAgICAgICAgICB0aGlzLnBsYWNlbWVudHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gbmV3IEpvaW50UGxhY2VtZW50KHBsYWNlVGV4dCB8fCBhbHdheXNTaG93VGV4dCwgcGxhY2VJY29uIHx8IGFsd2F5c1Nob3dJY29uLCBvZmZzY3JlZW4gfHwgYnVja2V0Lmp1c3RSZWxvYWRlZCk7XG4gICAgICAgICAgICBzZWVuQ3Jvc3NUaWxlSURzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IHRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHpPcmRlckJ5Vmlld3BvcnRZKSB7XG4gICAgICAgICAgICBhc3NlcnQoYnVja2V0UGFydC5zeW1ib2xJbnN0YW5jZVN0YXJ0ID09PSAwKTtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluZGV4ZXMgPSBidWNrZXQuZ2V0U29ydGVkU3ltYm9sSW5kZXhlcyh0aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3ltYm9sSW5kZXhlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluZGV4ID0gc3ltYm9sSW5kZXhlc1tpXTtcbiAgICAgICAgICAgICAgICBwbGFjZVN5bWJvbChidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmdldChzeW1ib2xJbmRleCksIHN5bWJvbEluZGV4LCBidWNrZXQuY29sbGlzaW9uQXJyYXlzW3N5bWJvbEluZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYnVja2V0UGFydC5zeW1ib2xJbnN0YW5jZVN0YXJ0OyBpIDwgYnVja2V0UGFydC5zeW1ib2xJbnN0YW5jZUVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGxhY2VTeW1ib2woYnVja2V0LnN5bWJvbEluc3RhbmNlcy5nZXQoaSksIGksIGJ1Y2tldC5jb2xsaXNpb25BcnJheXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNob3dDb2xsaXNpb25Cb3hlcyAmJiBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCBpbiB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5cykge1xuICAgICAgICAgICAgY29uc3QgY2lyY2xlQXJyYXkgPSB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5c1tidWNrZXQuYnVja2V0SW5zdGFuY2VJZF07XG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHZpZXdwb3J0IGFuZCBpbnZlcnNlIHByb2plY3Rpb24gbWF0cmljZXMgcGVyIGJ1Y2tldFxuICAgICAgICAgICAgbWF0NC5pbnZlcnQoY2lyY2xlQXJyYXkuaW52UHJvak1hdHJpeCwgcG9zTWF0cml4KTtcbiAgICAgICAgICAgIGNpcmNsZUFycmF5LnZpZXdwb3J0TWF0cml4ID0gdGhpcy5jb2xsaXNpb25JbmRleC5nZXRWaWV3cG9ydE1hdHJpeCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVja2V0Lmp1c3RSZWxvYWRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIG1hcmtVc2VkSnVzdGlmaWNhdGlvbihidWNrZXQ6IFN5bWJvbEJ1Y2tldCwgcGxhY2VkQW5jaG9yOiBUZXh0QW5jaG9yLCBzeW1ib2xJbnN0YW5jZTogU3ltYm9sSW5zdGFuY2UsIG9yaWVudGF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QganVzdGlmaWNhdGlvbnMgPSB7XG4gICAgICAgICAgICBcImxlZnRcIjogc3ltYm9sSW5zdGFuY2UubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgIFwiY2VudGVyXCI6IHN5bWJvbEluc3RhbmNlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgIFwicmlnaHRcIjogc3ltYm9sSW5zdGFuY2UucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgYXV0b0luZGV4O1xuICAgICAgICBpZiAob3JpZW50YXRpb24gPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICBhdXRvSW5kZXggPSBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF1dG9JbmRleCA9IGp1c3RpZmljYXRpb25zW2dldEFuY2hvckp1c3RpZmljYXRpb24ocGxhY2VkQW5jaG9yKV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleGVzID0gW1xuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXhcbiAgICAgICAgXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF1dG9JbmRleCA+PSAwICYmIGluZGV4ICE9PSBhdXRvSW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIGp1c3RpZmljYXRpb25zIGFuZCB0aGlzIG9uZSBpc24ndCBpdDogc2hpZnQgb2Zmc2NyZWVuXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChpbmRleCkuY3Jvc3NUaWxlSUQgPSAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBjaG9zZW4ganVzdGlmaWNhdGlvbiBvciB0aGUganVzdGlmaWNhdGlvbiBpcyBoYXJkd2lyZWQ6IHVzZSB0aGlzIG9uZVxuICAgICAgICAgICAgICAgICAgICBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoaW5kZXgpLmNyb3NzVGlsZUlEID0gc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWFya1VzZWRPcmllbnRhdGlvbihidWNrZXQ6IFN5bWJvbEJ1Y2tldCwgb3JpZW50YXRpb246IG51bWJlciwgc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IGhvcml6b250YWwgPSAob3JpZW50YXRpb24gPT09IFdyaXRpbmdNb2RlLmhvcml6b250YWwgfHwgb3JpZW50YXRpb24gPT09IFdyaXRpbmdNb2RlLmhvcml6b250YWxPbmx5KSA/IG9yaWVudGF0aW9uIDogMDtcbiAgICAgICAgY29uc3QgdmVydGljYWwgPSBvcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUudmVydGljYWwgPyBvcmllbnRhdGlvbiA6IDA7XG5cbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbEluZGV4ZXMgPSBbXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhcbiAgICAgICAgXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGhvcml6b250YWxJbmRleGVzKSB7XG4gICAgICAgICAgICBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoaW5kZXgpLnBsYWNlZE9yaWVudGF0aW9uID0gaG9yaXpvbnRhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCkge1xuICAgICAgICAgICAgYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KS5wbGFjZWRPcmllbnRhdGlvbiA9IHZlcnRpY2FsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tbWl0KG5vdzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29tbWl0VGltZSA9IG5vdztcbiAgICAgICAgdGhpcy56b29tQXRMYXN0UmVjZW5jeUNoZWNrID0gdGhpcy50cmFuc2Zvcm0uem9vbTtcblxuICAgICAgICBjb25zdCBwcmV2UGxhY2VtZW50ID0gdGhpcy5wcmV2UGxhY2VtZW50O1xuICAgICAgICBsZXQgcGxhY2VtZW50Q2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMucHJldlpvb21BZGp1c3RtZW50ID0gcHJldlBsYWNlbWVudCA/IHByZXZQbGFjZW1lbnQuem9vbUFkanVzdG1lbnQodGhpcy50cmFuc2Zvcm0uem9vbSkgOiAwO1xuICAgICAgICBjb25zdCBpbmNyZW1lbnQgPSBwcmV2UGxhY2VtZW50ID8gcHJldlBsYWNlbWVudC5zeW1ib2xGYWRlQ2hhbmdlKG5vdykgOiAxO1xuXG4gICAgICAgIGNvbnN0IHByZXZPcGFjaXRpZXMgPSBwcmV2UGxhY2VtZW50ID8gcHJldlBsYWNlbWVudC5vcGFjaXRpZXMgOiB7fTtcbiAgICAgICAgY29uc3QgcHJldk9mZnNldHMgPSBwcmV2UGxhY2VtZW50ID8gcHJldlBsYWNlbWVudC52YXJpYWJsZU9mZnNldHMgOiB7fTtcbiAgICAgICAgY29uc3QgcHJldk9yaWVudGF0aW9ucyA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50LnBsYWNlZE9yaWVudGF0aW9ucyA6IHt9O1xuXG4gICAgICAgIC8vIGFkZCB0aGUgb3BhY2l0aWVzIGZyb20gdGhlIGN1cnJlbnQgcGxhY2VtZW50LCBhbmQgY29weSB0aGVpciBjdXJyZW50IHZhbHVlcyBmcm9tIHRoZSBwcmV2aW91cyBwbGFjZW1lbnRcbiAgICAgICAgZm9yIChjb25zdCBjcm9zc1RpbGVJRCBpbiB0aGlzLnBsYWNlbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGpvaW50UGxhY2VtZW50ID0gdGhpcy5wbGFjZW1lbnRzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZPcGFjaXR5ID0gcHJldk9wYWNpdGllc1tjcm9zc1RpbGVJRF07XG4gICAgICAgICAgICBpZiAocHJldk9wYWNpdHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gPSBuZXcgSm9pbnRPcGFjaXR5U3RhdGUocHJldk9wYWNpdHksIGluY3JlbWVudCwgam9pbnRQbGFjZW1lbnQudGV4dCwgam9pbnRQbGFjZW1lbnQuaWNvbiwgbnVsbCwgam9pbnRQbGFjZW1lbnQuY2xpcHBlZCk7XG4gICAgICAgICAgICAgICAgcGxhY2VtZW50Q2hhbmdlZCA9IHBsYWNlbWVudENoYW5nZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgam9pbnRQbGFjZW1lbnQudGV4dCAhPT0gcHJldk9wYWNpdHkudGV4dC5wbGFjZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgam9pbnRQbGFjZW1lbnQuaWNvbiAhPT0gcHJldk9wYWNpdHkuaWNvbi5wbGFjZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSA9IG5ldyBKb2ludE9wYWNpdHlTdGF0ZShudWxsLCBpbmNyZW1lbnQsIGpvaW50UGxhY2VtZW50LnRleHQsIGpvaW50UGxhY2VtZW50Lmljb24sIGpvaW50UGxhY2VtZW50LnNraXBGYWRlLCBqb2ludFBsYWNlbWVudC5jbGlwcGVkKTtcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRDaGFuZ2VkID0gcGxhY2VtZW50Q2hhbmdlZCB8fCBqb2ludFBsYWNlbWVudC50ZXh0IHx8IGpvaW50UGxhY2VtZW50Lmljb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb3B5IGFuZCB1cGRhdGUgdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIHBsYWNlbWVudCB0aGF0IGFyZW4ndCBpbiB0aGUgY3VycmVudCBwbGFjZW1lbnQgYnV0IGhhdmVuJ3QgZmluaXNoZWQgZmFkaW5nXG4gICAgICAgIGZvciAoY29uc3QgY3Jvc3NUaWxlSUQgaW4gcHJldk9wYWNpdGllcykge1xuICAgICAgICAgICAgY29uc3QgcHJldk9wYWNpdHkgPSBwcmV2T3BhY2l0aWVzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgam9pbnRPcGFjaXR5ID0gbmV3IEpvaW50T3BhY2l0eVN0YXRlKHByZXZPcGFjaXR5LCBpbmNyZW1lbnQsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFqb2ludE9wYWNpdHkuaXNIaWRkZW4oKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gPSBqb2ludE9wYWNpdHk7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudENoYW5nZWQgPSBwbGFjZW1lbnRDaGFuZ2VkIHx8IHByZXZPcGFjaXR5LnRleHQucGxhY2VkIHx8IHByZXZPcGFjaXR5Lmljb24ucGxhY2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGNyb3NzVGlsZUlEIGluIHByZXZPZmZzZXRzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmFyaWFibGVPZmZzZXRzW2Nyb3NzVGlsZUlEXSAmJiB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gJiYgIXRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXS5pc0hpZGRlbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YXJpYWJsZU9mZnNldHNbY3Jvc3NUaWxlSURdID0gcHJldk9mZnNldHNbY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBjcm9zc1RpbGVJRCBpbiBwcmV2T3JpZW50YXRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGxhY2VkT3JpZW50YXRpb25zW2Nyb3NzVGlsZUlEXSAmJiB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gJiYgIXRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXS5pc0hpZGRlbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbY3Jvc3NUaWxlSURdID0gcHJldk9yaWVudGF0aW9uc1tjcm9zc1RpbGVJRF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lIGlzIHRoZSB0aW1lIG9mIHRoZSBsYXN0IGNvbW1pdCgpIHRoYXRcbiAgICAgICAgLy8gcmVzdWx0ZWQgaW4gYSBwbGFjZW1lbnQgY2hhbmdlIC0tIGluIG90aGVyIHdvcmRzLCB0aGUgc3RhcnQgdGltZSBvZlxuICAgICAgICAvLyB0aGUgbGFzdCBzeW1ib2wgZmFkZSBhbmltYXRpb25cbiAgICAgICAgYXNzZXJ0KCFwcmV2UGxhY2VtZW50IHx8IHByZXZQbGFjZW1lbnQubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChwbGFjZW1lbnRDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lID0gbm93O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50Lmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lIDogbm93O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlTGF5ZXJPcGFjaXRpZXMoc3R5bGVMYXllcjogU3R5bGVMYXllciwgdGlsZXM6IEFycmF5PFRpbGU+KSB7XG4gICAgICAgIGNvbnN0IHNlZW5Dcm9zc1RpbGVJRHMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB0aWxlIG9mIHRpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xCdWNrZXQgPSAoKHRpbGUuZ2V0QnVja2V0KHN0eWxlTGF5ZXIpOiBhbnkpOiBTeW1ib2xCdWNrZXQpO1xuICAgICAgICAgICAgaWYgKHN5bWJvbEJ1Y2tldCAmJiB0aWxlLmxhdGVzdEZlYXR1cmVJbmRleCAmJiBzdHlsZUxheWVyLmlkID09PSBzeW1ib2xCdWNrZXQubGF5ZXJJZHNbMF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJ1Y2tldE9wYWNpdGllcyhzeW1ib2xCdWNrZXQsIHNlZW5Dcm9zc1RpbGVJRHMsIHRpbGUuY29sbGlzaW9uQm94QXJyYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlQnVja2V0T3BhY2l0aWVzKGJ1Y2tldDogU3ltYm9sQnVja2V0LCBzZWVuQ3Jvc3NUaWxlSURzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBib29sZWFuIH0sIGNvbGxpc2lvbkJveEFycmF5OiA/Q29sbGlzaW9uQm94QXJyYXkpIHtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNUZXh0RGF0YSgpKSBidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNJY29uRGF0YSgpKSBidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNJY29uQ29sbGlzaW9uQm94RGF0YSgpKSBidWNrZXQuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheS5jbGVhcigpO1xuICAgICAgICBpZiAoYnVja2V0Lmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhKCkpIGJ1Y2tldC50ZXh0Q29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LmNsZWFyKCk7XG5cbiAgICAgICAgY29uc3QgbGF5b3V0ID0gYnVja2V0LmxheWVyc1swXS5sYXlvdXQ7XG4gICAgICAgIGNvbnN0IGhhc0NsaXBwaW5nID0gISFidWNrZXQubGF5ZXJzWzBdLmR5bmFtaWNGaWx0ZXIoKTtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlT3BhY2l0eVN0YXRlID0gbmV3IEpvaW50T3BhY2l0eVN0YXRlKG51bGwsIDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHRleHRBbGxvd092ZXJsYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKTtcbiAgICAgICAgY29uc3QgaWNvbkFsbG93T3ZlcmxhcCA9IGxheW91dC5nZXQoJ2ljb24tYWxsb3ctb3ZlcmxhcCcpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZVBsYWNlbWVudCA9IGxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG4gICAgICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJztcbiAgICAgICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gbGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG4gICAgICAgIGNvbnN0IGhhc0ljb25UZXh0Rml0ID0gbGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpICE9PSAnbm9uZSc7XG4gICAgICAgIC8vIElmIGFsbG93LW92ZXJsYXAgaXMgdHJ1ZSwgd2UgY2FuIHNob3cgc3ltYm9scyBiZWZvcmUgcGxhY2VtZW50IHJ1bnMgb24gdGhlbVxuICAgICAgICAvLyBCdXQgd2UgaGF2ZSB0byB3YWl0IGZvciBwbGFjZW1lbnQgaWYgd2UgcG90ZW50aWFsbHkgZGVwZW5kIG9uIGEgcGFpcmVkIGljb24vdGV4dFxuICAgICAgICAvLyB3aXRoIGFsbG93LW92ZXJsYXA6IGZhbHNlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzcwMzJcbiAgICAgICAgY29uc3QgZGVmYXVsdE9wYWNpdHlTdGF0ZSA9IG5ldyBKb2ludE9wYWNpdHlTdGF0ZShudWxsLCAwLFxuICAgICAgICAgICAgICAgIHRleHRBbGxvd092ZXJsYXAgJiYgKGljb25BbGxvd092ZXJsYXAgfHwgIWJ1Y2tldC5oYXNJY29uRGF0YSgpIHx8IGxheW91dC5nZXQoJ2ljb24tb3B0aW9uYWwnKSksXG4gICAgICAgICAgICAgICAgaWNvbkFsbG93T3ZlcmxhcCAmJiAodGV4dEFsbG93T3ZlcmxhcCB8fCAhYnVja2V0Lmhhc1RleHREYXRhKCkgfHwgbGF5b3V0LmdldCgndGV4dC1vcHRpb25hbCcpKSxcbiAgICAgICAgICAgICAgICB0cnVlKTtcblxuICAgICAgICBpZiAoIWJ1Y2tldC5jb2xsaXNpb25BcnJheXMgJiYgY29sbGlzaW9uQm94QXJyYXkgJiYgKChidWNrZXQuaGFzSWNvbkNvbGxpc2lvbkJveERhdGEoKSB8fCBidWNrZXQuaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSkpKSB7XG4gICAgICAgICAgICBidWNrZXQuZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlcyhjb2xsaXNpb25Cb3hBcnJheSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRPcGFjaXRpZXMgPSAoaWNvbk9yVGV4dCwgbnVtVmVydGljZXM6IG51bWJlciwgb3BhY2l0eTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVZlcnRpY2VzIC8gNDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWNvbk9yVGV4dC5vcGFjaXR5VmVydGV4QXJyYXkuZW1wbGFjZUJhY2sob3BhY2l0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHZpc2libGVJbnN0YW5jZUNvdW50ID0gMDtcblxuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gYnVja2V0LnN5bWJvbEluc3RhbmNlcy5nZXQocyk7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMsXG4gICAgICAgICAgICAgICAgbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzLFxuICAgICAgICAgICAgICAgIGNyb3NzVGlsZUlEXG4gICAgICAgICAgICB9ID0gc3ltYm9sSW5zdGFuY2U7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzRHVwbGljYXRlID0gc2VlbkNyb3NzVGlsZUlEc1tjcm9zc1RpbGVJRF07XG5cbiAgICAgICAgICAgIGxldCBvcGFjaXR5U3RhdGUgPSB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF07XG4gICAgICAgICAgICBpZiAoaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICBvcGFjaXR5U3RhdGUgPSBkdXBsaWNhdGVPcGFjaXR5U3RhdGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFvcGFjaXR5U3RhdGUpIHtcbiAgICAgICAgICAgICAgICBvcGFjaXR5U3RhdGUgPSBkZWZhdWx0T3BhY2l0eVN0YXRlO1xuICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBzdGF0ZSBzbyB0aGF0IGZ1dHVyZSBwbGFjZW1lbnRzIHVzZSBpdCBhcyBhIHN0YXJ0aW5nIHBvaW50XG4gICAgICAgICAgICAgICAgdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdID0gb3BhY2l0eVN0YXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZWVuQ3Jvc3NUaWxlSURzW2Nyb3NzVGlsZUlEXSA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGhhc1RleHQgPSBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyA+IDAgfHwgbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID4gMDtcbiAgICAgICAgICAgIGNvbnN0IGhhc0ljb24gPSBzeW1ib2xJbnN0YW5jZS5udW1JY29uVmVydGljZXMgPiAwO1xuXG4gICAgICAgICAgICBjb25zdCBwbGFjZWRPcmllbnRhdGlvbiA9IHRoaXMucGxhY2VkT3JpZW50YXRpb25zW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxIaWRkZW4gPSBwbGFjZWRPcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUudmVydGljYWw7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbEhpZGRlbiA9IHBsYWNlZE9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS5ob3Jpem9udGFsIHx8IHBsYWNlZE9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS5ob3Jpem9udGFsT25seTtcbiAgICAgICAgICAgIGlmICgoaGFzVGV4dCB8fCBoYXNJY29uKSAmJiAhb3BhY2l0eVN0YXRlLmlzSGlkZGVuKCkpIHZpc2libGVJbnN0YW5jZUNvdW50Kys7XG5cbiAgICAgICAgICAgIGlmIChoYXNUZXh0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2VkT3BhY2l0eSA9IHBhY2tPcGFjaXR5KG9wYWNpdHlTdGF0ZS50ZXh0KTtcbiAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbCB0ZXh0IGZhZGVzIGluL291dCBvbiBjb2xsaXNpb24gdGhlIHNhbWUgd2F5IGFzIGNvcnJlc3BvbmRpbmdcbiAgICAgICAgICAgICAgICAvLyBob3Jpem9udGFsIHRleHQuIFN3aXRjaCBiZXR3ZWVuIHZlcnRpY2FsL2hvcml6b250YWwgc2hvdWxkIGJlIGluc3RhbnRhbmVvdXNcbiAgICAgICAgICAgICAgICBjb25zdCBob3Jpem9udGFsT3BhY2l0eSA9IGhvcml6b250YWxIaWRkZW4gPyBQQUNLRURfSElEREVOX09QQUNJVFkgOiBwYWNrZWRPcGFjaXR5O1xuICAgICAgICAgICAgICAgIGFkZE9wYWNpdGllcyhidWNrZXQudGV4dCwgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMsIGhvcml6b250YWxPcGFjaXR5KTtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbE9wYWNpdHkgPSB2ZXJ0aWNhbEhpZGRlbiA/IFBBQ0tFRF9ISURERU5fT1BBQ0lUWSA6IHBhY2tlZE9wYWNpdHk7XG4gICAgICAgICAgICAgICAgYWRkT3BhY2l0aWVzKGJ1Y2tldC50ZXh0LCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMsIHZlcnRpY2FsT3BhY2l0eSk7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGxhYmVsIGlzIGNvbXBsZXRlbHkgZmFkZWQsIG1hcmsgaXQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgIC8vIGl0cyBwb3NpdGlvbiBhdCByZW5kZXIgdGltZS4gSWYgdGhpcyBsYXllciBoYXMgdmFyaWFibGUgcGxhY2VtZW50LCBzaGlmdCB0aGUgdmFyaW91c1xuICAgICAgICAgICAgICAgIC8vIHN5bWJvbCBpbnN0YW5jZXMgYXBwcm9wcmlhdGVseSBzbyB0aGF0IHN5bWJvbHMgZnJvbSBidWNrZXRzIHRoYXQgaGF2ZSB5ZXQgdG8gYmUgcGxhY2VkXG4gICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sSGlkZGVuID0gb3BhY2l0eVN0YXRlLnRleHQuaXNIaWRkZW4oKTtcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhcbiAgICAgICAgICAgICAgICBdLmZvckVhY2goaW5kZXggPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGluZGV4KS5oaWRkZW4gPSBzeW1ib2xIaWRkZW4gfHwgaG9yaXpvbnRhbEhpZGRlbiA/IDEgOiAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpLmhpZGRlbiA9IHN5bWJvbEhpZGRlbiB8fCB2ZXJ0aWNhbEhpZGRlbiA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZPZmZzZXQgPSB0aGlzLnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgaWYgKHByZXZPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrVXNlZEp1c3RpZmljYXRpb24oYnVja2V0LCBwcmV2T2Zmc2V0LmFuY2hvciwgc3ltYm9sSW5zdGFuY2UsIHBsYWNlZE9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2T3JpZW50YXRpb24gPSB0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF07XG4gICAgICAgICAgICAgICAgaWYgKHByZXZPcmllbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkSnVzdGlmaWNhdGlvbihidWNrZXQsICdsZWZ0Jywgc3ltYm9sSW5zdGFuY2UsIHByZXZPcmllbnRhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFya1VzZWRPcmllbnRhdGlvbihidWNrZXQsIHByZXZPcmllbnRhdGlvbiwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhhc0ljb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWNrZWRPcGFjaXR5ID0gcGFja09wYWNpdHkob3BhY2l0eVN0YXRlLmljb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnBsYWNlZEljb25TeW1ib2xJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxPcGFjaXR5ID0gIWhvcml6b250YWxIaWRkZW4gPyBwYWNrZWRPcGFjaXR5IDogUEFDS0VEX0hJRERFTl9PUEFDSVRZO1xuICAgICAgICAgICAgICAgICAgICBhZGRPcGFjaXRpZXMoYnVja2V0Lmljb24sIHN5bWJvbEluc3RhbmNlLm51bUljb25WZXJ0aWNlcywgaG9yaXpvbnRhbE9wYWNpdHkpO1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQuaWNvbi5wbGFjZWRTeW1ib2xBcnJheS5nZXQoc3ltYm9sSW5zdGFuY2UucGxhY2VkSWNvblN5bWJvbEluZGV4KS5oaWRkZW4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgKG9wYWNpdHlTdGF0ZS5pY29uLmlzSGlkZGVuKCk6IGFueSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxPcGFjaXR5ID0gIXZlcnRpY2FsSGlkZGVuID8gcGFja2VkT3BhY2l0eSA6IFBBQ0tFRF9ISURERU5fT1BBQ0lUWTtcbiAgICAgICAgICAgICAgICAgICAgYWRkT3BhY2l0aWVzKGJ1Y2tldC5pY29uLCBzeW1ib2xJbnN0YW5jZS5udW1WZXJ0aWNhbEljb25WZXJ0aWNlcywgdmVydGljYWxPcGFjaXR5KTtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4KS5oaWRkZW4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgKG9wYWNpdHlTdGF0ZS5pY29uLmlzSGlkZGVuKCk6IGFueSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYnVja2V0Lmhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCkgfHwgYnVja2V0Lmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xsaXNpb25BcnJheXMgPSBidWNrZXQuY29sbGlzaW9uQXJyYXlzW3NdO1xuICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNoaWZ0ID0gbmV3IFBvaW50KDAsIDApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMudGV4dEJveCB8fCBjb2xsaXNpb25BcnJheXMudmVydGljYWxUZXh0Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YXJpYWJsZU9mZnNldCA9IHRoaXMudmFyaWFibGVPZmZzZXRzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIHNob3cgZWl0aGVyIHRoZSBjdXJyZW50bHkgcGxhY2VkIHBvc2l0aW9uIG9yIHRoZSBsYXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWxseSBwbGFjZWQgcG9zaXRpb24gKHNvIHlvdSBjYW4gdmlzdWFsaXplIHdoYXQgY29sbGlzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgbWFkZSB0aGUgc3ltYm9sIGRpc2FwcGVhciwgYW5kIHRoZSBtb3N0IGxpa2VseSBwbGFjZSBmb3IgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bWJvbCB0byBjb21lIGJhY2spXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gY2FsY3VsYXRlVmFyaWFibGVMYXlvdXRTaGlmdCh2YXJpYWJsZU9mZnNldC5hbmNob3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlT2Zmc2V0LndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU9mZnNldC5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlT2Zmc2V0LnRleHRPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlT2Zmc2V0LnRleHRTY2FsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGVXaXRoTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdC5fcm90YXRlKHBpdGNoV2l0aE1hcCA/IHRoaXMudHJhbnNmb3JtLmFuZ2xlIDogLXRoaXMudHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG9mZnNldCAtPiB0aGlzIHN5bWJvbCBoYXNuJ3QgYmVlbiBwbGFjZWQgc2luY2UgY29taW5nIG9uLXNjcmVlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzaW5nbGUgYm94IGlzIHBhcnRpY3VsYXJseSBtZWFuaW5nZnVsIGFuZCBhbGwgb2YgdGhlbSB3b3VsZCBiZSB0b28gbm9pc3lcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBjZW50ZXIgYm94IGp1c3QgdG8gc2hvdyBzb21ldGhpbmcncyB0aGVyZSwgYnV0IG1hcmsgaXQgXCJub3QgdXNlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNDbGlwcGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgPSAhb3BhY2l0eVN0YXRlLmNsaXBwZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMudGV4dEJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbGxpc2lvblZlcnRpY2VzKGJ1Y2tldC50ZXh0Q29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LCBvcGFjaXR5U3RhdGUudGV4dC5wbGFjZWQsICF1c2VkIHx8IGhvcml6b250YWxIaWRkZW4sIHNoaWZ0LngsIHNoaWZ0LnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbFRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb2xsaXNpb25WZXJ0aWNlcyhidWNrZXQudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSwgb3BhY2l0eVN0YXRlLnRleHQucGxhY2VkLCAhdXNlZCB8fCB2ZXJ0aWNhbEhpZGRlbiwgc2hpZnQueCwgc2hpZnQueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbEljb25Vc2VkID0gdXNlZCAmJiBCb29sZWFuKCF2ZXJ0aWNhbEhpZGRlbiAmJiBjb2xsaXNpb25BcnJheXMudmVydGljYWxJY29uQm94KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLmljb25Cb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbGxpc2lvblZlcnRpY2VzKGJ1Y2tldC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LCBvcGFjaXR5U3RhdGUuaWNvbi5wbGFjZWQsIHZlcnRpY2FsSWNvblVzZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSWNvblRleHRGaXQgPyBzaGlmdC54IDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJY29uVGV4dEZpdCA/IHNoaWZ0LnkgOiAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMudmVydGljYWxJY29uQm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb2xsaXNpb25WZXJ0aWNlcyhidWNrZXQuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSwgb3BhY2l0eVN0YXRlLmljb24ucGxhY2VkLCAhdmVydGljYWxJY29uVXNlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJY29uVGV4dEZpdCA/IHNoaWZ0LnggOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ljb25UZXh0Rml0ID8gc2hpZnQueSA6IDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ1Y2tldC5mdWxseUNsaXBwZWQgPSB2aXNpYmxlSW5zdGFuY2VDb3VudCA9PT0gMDtcbiAgICAgICAgYnVja2V0LnNvcnRGZWF0dXJlcyh0aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgIGlmICh0aGlzLnJldGFpbmVkUXVlcnlEYXRhW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXSkge1xuICAgICAgICAgICAgdGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YVtidWNrZXQuYnVja2V0SW5zdGFuY2VJZF0uZmVhdHVyZVNvcnRPcmRlciA9IGJ1Y2tldC5mZWF0dXJlU29ydE9yZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNUZXh0RGF0YSgpICYmIGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShidWNrZXQudGV4dC5vcGFjaXR5VmVydGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWNrZXQuaGFzSWNvbkRhdGEoKSAmJiBidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoYnVja2V0Lmljb24ub3BhY2l0eVZlcnRleEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVja2V0Lmhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCkgJiYgYnVja2V0Lmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBidWNrZXQuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShidWNrZXQuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNUZXh0Q29sbGlzaW9uQm94RGF0YSgpICYmIGJ1Y2tldC50ZXh0Q29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgYnVja2V0LnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoYnVja2V0LnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhBcnJheS5sZW5ndGggPT09IGJ1Y2tldC50ZXh0LmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCAvIDQpO1xuICAgICAgICBhc3NlcnQoYnVja2V0Lmljb24ub3BhY2l0eVZlcnRleEFycmF5Lmxlbmd0aCA9PT0gYnVja2V0Lmljb24ubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoIC8gNCk7XG5cbiAgICAgICAgLy8gUHVzaCBnZW5lcmF0ZWQgY29sbGlzaW9uIGNpcmNsZXMgdG8gdGhlIGJ1Y2tldCBmb3IgZGVidWcgcmVuZGVyaW5nXG4gICAgICAgIGlmIChidWNrZXQuYnVja2V0SW5zdGFuY2VJZCBpbiB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5cykge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbGxpc2lvbkNpcmNsZUFycmF5c1tidWNrZXQuYnVja2V0SW5zdGFuY2VJZF07XG5cbiAgICAgICAgICAgIGJ1Y2tldC5wbGFjZW1lbnRJbnZQcm9qTWF0cml4ID0gaW5zdGFuY2UuaW52UHJvak1hdHJpeDtcbiAgICAgICAgICAgIGJ1Y2tldC5wbGFjZW1lbnRWaWV3cG9ydE1hdHJpeCA9IGluc3RhbmNlLnZpZXdwb3J0TWF0cml4O1xuICAgICAgICAgICAgYnVja2V0LmNvbGxpc2lvbkNpcmNsZUFycmF5ID0gaW5zdGFuY2UuY2lyY2xlcztcblxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN5bWJvbEZhZGVDaGFuZ2Uobm93OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFkZUR1cmF0aW9uID09PSAwID9cbiAgICAgICAgICAgIDEgOlxuICAgICAgICAgICAgKChub3cgLSB0aGlzLmNvbW1pdFRpbWUpIC8gdGhpcy5mYWRlRHVyYXRpb24gKyB0aGlzLnByZXZab29tQWRqdXN0bWVudCk7XG4gICAgfVxuXG4gICAgem9vbUFkanVzdG1lbnQoem9vbTogbnVtYmVyKSB7XG4gICAgICAgIC8vIFdoZW4gem9vbWluZyBvdXQgcXVpY2tseSwgbGFiZWxzIGNhbiBvdmVybGFwIGVhY2ggb3RoZXIuIFRoaXNcbiAgICAgICAgLy8gYWRqdXN0bWVudCBpcyB1c2VkIHRvIHJlZHVjZSB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBwbGFjZW1lbnQgY2FsY3VsYXRpb25zXG4gICAgICAgIC8vIGFuZCB0byByZWR1Y2UgdGhlIGZhZGUgZHVyYXRpb24gd2hlbiB6b29taW5nIG91dCBxdWlja2x5LiBEaXNjb3ZlcmluZyB0aGVcbiAgICAgICAgLy8gY29sbGlzaW9ucyBtb3JlIHF1aWNrbHkgYW5kIGZhZGluZyB0aGVtIG1vcmUgcXVpY2tseSByZWR1Y2VzIHRoZSB1bndhbnRlZCBlZmZlY3QuXG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCAodGhpcy50cmFuc2Zvcm0uem9vbSAtIHpvb20pIC8gMS41KTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9ucyhub3c6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFsZSB8fFxuICAgICAgICAgICAgbm93IC0gdGhpcy5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSA8IHRoaXMuZmFkZUR1cmF0aW9uO1xuICAgIH1cblxuICAgIHN0aWxsUmVjZW50KG5vdzogbnVtYmVyLCB6b29tOiBudW1iZXIpIHtcbiAgICAgICAgLy8gVGhlIGFkanVzdG1lbnQgbWFrZXMgcGxhY2VtZW50IG1vcmUgZnJlcXVlbnQgd2hlbiB6b29taW5nLlxuICAgICAgICAvLyBUaGlzIGNvbmRpdGlvbiBhcHBsaWVzIHRoZSBhZGp1c3RtZW50IG9ubHkgYWZ0ZXIgdGhlIG1hcCBoYXNcbiAgICAgICAgLy8gc3RvcHBlZCB6b29taW5nLiBUaGlzIGF2b2lkcyBhZGRpbmcgZXh0cmEgamFuayB3aGlsZSB6b29taW5nLlxuICAgICAgICBjb25zdCBkdXJhdGlvbkFkanVzdG1lbnQgPSB0aGlzLnpvb21BdExhc3RSZWNlbmN5Q2hlY2sgPT09IHpvb20gP1xuICAgICAgICAgICAgKDEgLSB0aGlzLnpvb21BZGp1c3RtZW50KHpvb20pKSA6XG4gICAgICAgICAgICAxO1xuICAgICAgICB0aGlzLnpvb21BdExhc3RSZWNlbmN5Q2hlY2sgPSB6b29tO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1pdFRpbWUgKyB0aGlzLmZhZGVEdXJhdGlvbiAqIGR1cmF0aW9uQWRqdXN0bWVudCA+IG5vdztcbiAgICB9XG5cbiAgICBzZXRTdGFsZSgpIHtcbiAgICAgICAgdGhpcy5zdGFsZSA9IHRydWU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDb2xsaXNpb25WZXJ0aWNlcyhjb2xsaXNpb25WZXJ0ZXhBcnJheTogQ29sbGlzaW9uVmVydGV4QXJyYXksIHBsYWNlZDogYm9vbGVhbiwgbm90VXNlZDogYm9vbGVhbiB8IG51bWJlciwgc2hpZnRYPzogbnVtYmVyLCBzaGlmdFk/OiBudW1iZXIpIHtcbiAgICBjb2xsaXNpb25WZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwbGFjZWQgPyAxIDogMCwgbm90VXNlZCA/IDEgOiAwLCBzaGlmdFggfHwgMCwgc2hpZnRZIHx8IDApO1xuICAgIGNvbGxpc2lvblZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHBsYWNlZCA/IDEgOiAwLCBub3RVc2VkID8gMSA6IDAsIHNoaWZ0WCB8fCAwLCBzaGlmdFkgfHwgMCk7XG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGxhY2VkID8gMSA6IDAsIG5vdFVzZWQgPyAxIDogMCwgc2hpZnRYIHx8IDAsIHNoaWZ0WSB8fCAwKTtcbiAgICBjb2xsaXNpb25WZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwbGFjZWQgPyAxIDogMCwgbm90VXNlZCA/IDEgOiAwLCBzaGlmdFggfHwgMCwgc2hpZnRZIHx8IDApO1xufVxuXG4vLyBBbGwgZm91ciB2ZXJ0aWNlcyBmb3IgYSBnbHlwaCB3aWxsIGhhdmUgdGhlIHNhbWUgb3BhY2l0eSBzdGF0ZVxuLy8gU28gd2UgcGFjayB0aGUgb3BhY2l0eSBpbnRvIGEgdWludDgsIGFuZCB0aGVuIHJlcGVhdCBpdCBmb3VyIHRpbWVzXG4vLyB0byBtYWtlIGEgc2luZ2xlIHVpbnQzMiB0aGF0IHdlIGNhbiB1cGxvYWQgZm9yIGVhY2ggZ2x5cGggaW4gdGhlXG4vLyBsYWJlbC5cbmNvbnN0IHNoaWZ0MjUgPSBNYXRoLnBvdygyLCAyNSk7XG5jb25zdCBzaGlmdDI0ID0gTWF0aC5wb3coMiwgMjQpO1xuY29uc3Qgc2hpZnQxNyA9IE1hdGgucG93KDIsIDE3KTtcbmNvbnN0IHNoaWZ0MTYgPSBNYXRoLnBvdygyLCAxNik7XG5jb25zdCBzaGlmdDkgPSBNYXRoLnBvdygyLCA5KTtcbmNvbnN0IHNoaWZ0OCA9IE1hdGgucG93KDIsIDgpO1xuY29uc3Qgc2hpZnQxID0gTWF0aC5wb3coMiwgMSk7XG5mdW5jdGlvbiBwYWNrT3BhY2l0eShvcGFjaXR5U3RhdGU6IE9wYWNpdHlTdGF0ZSk6IG51bWJlciB7XG4gICAgaWYgKG9wYWNpdHlTdGF0ZS5vcGFjaXR5ID09PSAwICYmICFvcGFjaXR5U3RhdGUucGxhY2VkKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAob3BhY2l0eVN0YXRlLm9wYWNpdHkgPT09IDEgJiYgb3BhY2l0eVN0YXRlLnBsYWNlZCkge1xuICAgICAgICByZXR1cm4gNDI5NDk2NzI5NTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0Qml0ID0gb3BhY2l0eVN0YXRlLnBsYWNlZCA/IDEgOiAwO1xuICAgIGNvbnN0IG9wYWNpdHlCaXRzID0gTWF0aC5mbG9vcihvcGFjaXR5U3RhdGUub3BhY2l0eSAqIDEyNyk7XG4gICAgcmV0dXJuIG9wYWNpdHlCaXRzICogc2hpZnQyNSArIHRhcmdldEJpdCAqIHNoaWZ0MjQgK1xuICAgICAgICBvcGFjaXR5Qml0cyAqIHNoaWZ0MTcgKyB0YXJnZXRCaXQgKiBzaGlmdDE2ICtcbiAgICAgICAgb3BhY2l0eUJpdHMgKiBzaGlmdDkgKyB0YXJnZXRCaXQgKiBzaGlmdDggK1xuICAgICAgICBvcGFjaXR5Qml0cyAqIHNoaWZ0MSArIHRhcmdldEJpdDtcbn1cblxuY29uc3QgUEFDS0VEX0hJRERFTl9PUEFDSVRZID0gMDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5cbmltcG9ydCB7UGxhY2VtZW50fSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50LmpzJztcbmltcG9ydCB7UGVyZm9ybWFuY2VVdGlsc30gZnJvbSAnLi4vdXRpbC9wZXJmb3JtYW5jZS5qcyc7XG5cbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBTeW1ib2xTdHlsZUxheWVyIGZyb20gJy4vc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUge0J1Y2tldFBhcnR9IGZyb20gJy4uL3N5bWJvbC9wbGFjZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUge0ZvZ1N0YXRlfSBmcm9tICcuL2ZvZ19oZWxwZXJzLmpzJztcblxuY2xhc3MgTGF5ZXJQbGFjZW1lbnQge1xuICAgIF9zb3J0QWNyb3NzVGlsZXM6IGJvb2xlYW47XG4gICAgX2N1cnJlbnRUaWxlSW5kZXg6IG51bWJlcjtcbiAgICBfY3VycmVudFBhcnRJbmRleDogbnVtYmVyO1xuICAgIF9zZWVuQ3Jvc3NUaWxlSURzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBib29sZWFuIH07XG4gICAgX2J1Y2tldFBhcnRzOiBBcnJheTxCdWNrZXRQYXJ0PjtcblxuICAgIGNvbnN0cnVjdG9yKHN0eWxlTGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIpIHtcbiAgICAgICAgdGhpcy5fc29ydEFjcm9zc1RpbGVzID0gc3R5bGVMYXllci5sYXlvdXQuZ2V0KCdzeW1ib2wtei1vcmRlcicpICE9PSAndmlld3BvcnQteScgJiZcbiAgICAgICAgICAgIHN0eWxlTGF5ZXIubGF5b3V0LmdldCgnc3ltYm9sLXNvcnQta2V5JykuY29uc3RhbnRPcigxKSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRUaWxlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9jdXJyZW50UGFydEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fc2VlbkNyb3NzVGlsZUlEcyA9IHt9O1xuICAgICAgICB0aGlzLl9idWNrZXRQYXJ0cyA9IFtdO1xuICAgIH1cblxuICAgIGNvbnRpbnVlUGxhY2VtZW50KHRpbGVzOiBBcnJheTxUaWxlPiwgcGxhY2VtZW50OiBQbGFjZW1lbnQsIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbiwgc3R5bGVMYXllcjogU3R5bGVMYXllciwgc2hvdWxkUGF1c2VQbGFjZW1lbnQ6ICgpID0+IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgYnVja2V0UGFydHMgPSB0aGlzLl9idWNrZXRQYXJ0cztcblxuICAgICAgICB3aGlsZSAodGhpcy5fY3VycmVudFRpbGVJbmRleCA8IHRpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRpbGVzW3RoaXMuX2N1cnJlbnRUaWxlSW5kZXhdO1xuICAgICAgICAgICAgcGxhY2VtZW50LmdldEJ1Y2tldFBhcnRzKGJ1Y2tldFBhcnRzLCBzdHlsZUxheWVyLCB0aWxlLCB0aGlzLl9zb3J0QWNyb3NzVGlsZXMpO1xuXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VGlsZUluZGV4Kys7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUGF1c2VQbGFjZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3NvcnRBY3Jvc3NUaWxlcykge1xuICAgICAgICAgICAgdGhpcy5fc29ydEFjcm9zc1RpbGVzID0gZmFsc2U7XG4gICAgICAgICAgICBidWNrZXRQYXJ0cy5zb3J0KChhLCBiKSA9PiAoKGEuc29ydEtleTogYW55KTogbnVtYmVyKSAtICgoYi5zb3J0S2V5OiBhbnkpOiBudW1iZXIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlICh0aGlzLl9jdXJyZW50UGFydEluZGV4IDwgYnVja2V0UGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBidWNrZXRQYXJ0ID0gYnVja2V0UGFydHNbdGhpcy5fY3VycmVudFBhcnRJbmRleF07XG4gICAgICAgICAgICBwbGFjZW1lbnQucGxhY2VMYXllckJ1Y2tldFBhcnQoYnVja2V0UGFydCwgdGhpcy5fc2VlbkNyb3NzVGlsZUlEcywgc2hvd0NvbGxpc2lvbkJveGVzLCBidWNrZXRQYXJ0LnN5bWJvbEluc3RhbmNlU3RhcnQgPT09IDApO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFBhcnRJbmRleCsrO1xuICAgICAgICAgICAgaWYgKHNob3VsZFBhdXNlUGxhY2VtZW50KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5jbGFzcyBQYXVzZWFibGVQbGFjZW1lbnQge1xuICAgIHBsYWNlbWVudDogUGxhY2VtZW50O1xuICAgIF9kb25lOiBib29sZWFuO1xuICAgIF9jdXJyZW50UGxhY2VtZW50SW5kZXg6IG51bWJlcjtcbiAgICBfZm9yY2VGdWxsUGxhY2VtZW50OiBib29sZWFuO1xuICAgIF9zaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW47XG4gICAgX2luUHJvZ3Jlc3NMYXllcjogP0xheWVyUGxhY2VtZW50O1xuXG4gICAgY29uc3RydWN0b3IodHJhbnNmb3JtOiBUcmFuc2Zvcm0sIG9yZGVyOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICAgICAgIGZvcmNlRnVsbFBsYWNlbWVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgZmFkZUR1cmF0aW9uOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuLFxuICAgICAgICAgICAgICAgIHByZXZQbGFjZW1lbnQ/OiBQbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgZm9nU3RhdGU6ID9Gb2dTdGF0ZSkge1xuXG4gICAgICAgIHRoaXMucGxhY2VtZW50ID0gbmV3IFBsYWNlbWVudCh0cmFuc2Zvcm0sIGZhZGVEdXJhdGlvbiwgY3Jvc3NTb3VyY2VDb2xsaXNpb25zLCBwcmV2UGxhY2VtZW50LCBmb2dTdGF0ZSk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleCA9IG9yZGVyLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuX2ZvcmNlRnVsbFBsYWNlbWVudCA9IGZvcmNlRnVsbFBsYWNlbWVudDtcbiAgICAgICAgdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzID0gc2hvd0NvbGxpc2lvbkJveGVzO1xuICAgICAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNEb25lKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9uZTtcbiAgICB9XG5cbiAgICBjb250aW51ZVBsYWNlbWVudChvcmRlcjogQXJyYXk8c3RyaW5nPiwgbGF5ZXJzOiB7W186IHN0cmluZ106IFN0eWxlTGF5ZXJ9LCBsYXllclRpbGVzOiB7W186IHN0cmluZ106IEFycmF5PFRpbGU+fSkge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBicm93c2VyLm5vdygpO1xuXG4gICAgICAgIGNvbnN0IHNob3VsZFBhdXNlUGxhY2VtZW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxhcHNlZFRpbWUgPSBicm93c2VyLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvcmNlRnVsbFBsYWNlbWVudCA/IGZhbHNlIDogZWxhcHNlZFRpbWUgPiAyO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdoaWxlICh0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IG9yZGVyW3RoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleF07XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudFpvb20gPSB0aGlzLnBsYWNlbWVudC5jb2xsaXNpb25JbmRleC50cmFuc2Zvcm0uem9vbTtcbiAgICAgICAgICAgIGlmIChsYXllci50eXBlID09PSAnc3ltYm9sJyAmJlxuICAgICAgICAgICAgICAgICghbGF5ZXIubWluem9vbSB8fCBsYXllci5taW56b29tIDw9IHBsYWNlbWVudFpvb20pICYmXG4gICAgICAgICAgICAgICAgKCFsYXllci5tYXh6b29tIHx8IGxheWVyLm1heHpvb20gPiBwbGFjZW1lbnRab29tKSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pblByb2dyZXNzTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5Qcm9ncmVzc0xheWVyID0gbmV3IExheWVyUGxhY2VtZW50KCgobGF5ZXI6IGFueSk6IFN5bWJvbFN0eWxlTGF5ZXIpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXVzZVBsYWNlbWVudCA9IHRoaXMuX2luUHJvZ3Jlc3NMYXllci5jb250aW51ZVBsYWNlbWVudChsYXllclRpbGVzW2xheWVyLnNvdXJjZV0sIHRoaXMucGxhY2VtZW50LCB0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMsIGxheWVyLCBzaG91bGRQYXVzZVBsYWNlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocGF1c2VQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VVdGlscy5yZWNvcmRQbGFjZW1lbnRUaW1lKGJyb3dzZXIubm93KCkgLSBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBkaWRuJ3QgZmluaXNoIHBsYWNpbmcgYWxsIGxheWVycyB3aXRoaW4gMm1zLFxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2UgY2FuIGtlZXAgcmVuZGVyaW5nIHdpdGggYSBwYXJ0aWFsIHBsYWNlbWVudFxuICAgICAgICAgICAgICAgICAgICAvLyBXZSdsbCByZXN1bWUgaGVyZSBvbiB0aGUgbmV4dCBmcmFtZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2luUHJvZ3Jlc3NMYXllcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFBsYWNlbWVudEluZGV4LS07XG4gICAgICAgIH1cbiAgICAgICAgUGVyZm9ybWFuY2VVdGlscy5yZWNvcmRQbGFjZW1lbnRUaW1lKGJyb3dzZXIubm93KCkgLSBzdGFydFRpbWUpO1xuICAgICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb21taXQobm93OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5wbGFjZW1lbnQuY29tbWl0KG5vdyk7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYWNlbWVudDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhdXNlYWJsZVBsYWNlbWVudDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQuanMnO1xuXG5pbXBvcnQge1N5bWJvbEluc3RhbmNlQXJyYXl9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3Rpb259IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtTeW1ib2xJbnN0YW5jZX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUgU3ltYm9sQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlLmpzJztcblxuLypcbiAgICBUaGUgQ3Jvc3NUaWxlU3ltYm9sSW5kZXggZ2VuZXJhbGx5IHdvcmtzIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXRcbiAgICBhIGNvbmNlcHR1YWwgXCJ1bmlxdWUgc3ltYm9sXCIgY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIHRleHQgb2ZcbiAgICB0aGUgbGFiZWwgY29tYmluZWQgd2l0aCB0aGUgYW5jaG9yIHBvaW50LiBUaGUgZ29hbCBpcyB0byBhc3NpZ25cbiAgICB0aGVzZSBjb25jZXB0dWFsIFwidW5pcXVlIHN5bWJvbHNcIiBhIHNoYXJlZCBjcm9zc1RpbGVJRCB0aGF0IGNhbiBiZVxuICAgIHVzZWQgYnkgUGxhY2VtZW50IHRvIGtlZXAgZmFkaW5nIG9wYWNpdHkgc3RhdGVzIGNvbnNpc3RlbnQgYW5kIHRvXG4gICAgZGVkdXBsaWNhdGUgbGFiZWxzLlxuXG4gICAgVGhlIENyb3NzVGlsZVN5bWJvbEluZGV4IGluZGV4ZXMgYWxsIHRoZSBjdXJyZW50IHN5bWJvbCBpbnN0YW5jZXMgYW5kXG4gICAgdGhlaXIgY3Jvc3NUaWxlSURzLiBXaGVuIGEgc3ltYm9sIGJ1Y2tldCBnZXRzIGFkZGVkIG9yIHVwZGF0ZWQsIHRoZVxuICAgIGluZGV4IGFzc2lnbnMgYSBjcm9zc1RpbGVJRCB0byBlYWNoIG9mIGl0J3Mgc3ltYm9sIGluc3RhbmNlcyBieSBlaXRoZXJcbiAgICBtYXRjaGluZyBpdCB3aXRoIGFuIGV4aXN0aW5nIGlkIG9yIGFzc2lnbmluZyBhIG5ldyBvbmUuXG4qL1xuXG4vLyBSb3VuZCBhbmNob3IgcG9zaXRpb25zIHRvIHJvdWdobHkgNCBwaXhlbCBncmlkXG5jb25zdCByb3VuZGluZ0ZhY3RvciA9IDUxMiAvIEVYVEVOVCAvIDI7XG5cbmNsYXNzIFRpbGVMYXllckluZGV4IHtcbiAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQ7XG4gICAgaW5kZXhlZFN5bWJvbEluc3RhbmNlczoge1tfOiBudW1iZXJdOiBBcnJheTx7XG4gICAgICAgIGNyb3NzVGlsZUlEOiBudW1iZXIsXG4gICAgICAgIGNvb3JkOiB7XG4gICAgICAgICAgICB4OiBudW1iZXIsXG4gICAgICAgICAgICB5OiBudW1iZXJcbiAgICAgICAgfVxuICAgIH0+fTtcbiAgICBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHN5bWJvbEluc3RhbmNlczogU3ltYm9sSW5zdGFuY2VBcnJheSwgYnVja2V0SW5zdGFuY2VJZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMudGlsZUlEID0gdGlsZUlEO1xuICAgICAgICB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXMgPSB7fTtcbiAgICAgICAgdGhpcy5idWNrZXRJbnN0YW5jZUlkID0gYnVja2V0SW5zdGFuY2VJZDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSBzeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gc3ltYm9sSW5zdGFuY2Uua2V5O1xuICAgICAgICAgICAgaWYgKCF0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXNba2V5XSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1trZXldID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGlzIHRpbGUgbWF5IGhhdmUgbXVsdGlwbGUgc3ltYm9sIGluc3RhbmNlcyB3aXRoIHRoZSBzYW1lIGtleVxuICAgICAgICAgICAgLy8gU3RvcmUgZWFjaCBvbmUgYWxvbmcgd2l0aCBpdHMgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIHRoaXMuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1trZXldLnB1c2goe1xuICAgICAgICAgICAgICAgIGNyb3NzVGlsZUlEOiBzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCxcbiAgICAgICAgICAgICAgICBjb29yZDogdGhpcy5nZXRTY2FsZWRDb29yZGluYXRlcyhzeW1ib2xJbnN0YW5jZSwgdGlsZUlEKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0cyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGlucHV0IHN5bWJvbCBpbnN0YW5jZSBpbnRvIGNvb3JkaW5hdGVzIHRoYXQgYmUgY2FuIGNvbXBhcmVkXG4gICAgLy8gYWdhaW5zdCBvdGhlciBzeW1ib2xzIGluIHRoaXMgaW5kZXguIENvb3JkaW5hdGVzIGFyZTpcbiAgICAvLyAoMSkgd29ybGQtYmFzZWQgKHNvIGFmdGVyIGNvbnZlcnNpb24gdGhlIHNvdXJjZSB0aWxlIGlzIGlycmVsZXZhbnQpXG4gICAgLy8gKDIpIGNvbnZlcnRlZCB0byB0aGUgei1zY2FsZSBvZiB0aGlzIFRpbGVMYXllckluZGV4XG4gICAgLy8gKDMpIGRvd24tc2FtcGxlZCBieSBcInJvdW5kaW5nRmFjdG9yXCIgZnJvbSB0aWxlIGNvb3JkaW5hdGUgcHJlY2lzaW9uIGluIG9yZGVyIHRvIGJlXG4gICAgLy8gICAgIG1vcmUgdG9sZXJhbnQgb2Ygc21hbGwgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aWxlcy5cbiAgICBnZXRTY2FsZWRDb29yZGluYXRlcyhzeW1ib2xJbnN0YW5jZTogU3ltYm9sSW5zdGFuY2UsIGNoaWxkVGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIGNvbnN0IHpEaWZmZXJlbmNlID0gY2hpbGRUaWxlSUQuY2Fub25pY2FsLnogLSB0aGlzLnRpbGVJRC5jYW5vbmljYWwuejtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSByb3VuZGluZ0ZhY3RvciAvIE1hdGgucG93KDIsIHpEaWZmZXJlbmNlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IE1hdGguZmxvb3IoKGNoaWxkVGlsZUlELmNhbm9uaWNhbC54ICogRVhURU5UICsgc3ltYm9sSW5zdGFuY2UudGlsZUFuY2hvclgpICogc2NhbGUpLFxuICAgICAgICAgICAgeTogTWF0aC5mbG9vcigoY2hpbGRUaWxlSUQuY2Fub25pY2FsLnkgKiBFWFRFTlQgKyBzeW1ib2xJbnN0YW5jZS50aWxlQW5jaG9yWSkgKiBzY2FsZSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmaW5kTWF0Y2hlcyhzeW1ib2xJbnN0YW5jZXM6IFN5bWJvbEluc3RhbmNlQXJyYXksIG5ld1RpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgem9vbUNyb3NzVGlsZUlEczoge1tjcm9zc1RpbGVJRDogbnVtYmVyXTogYm9vbGVhbn0pIHtcbiAgICAgICAgY29uc3QgdG9sZXJhbmNlID0gdGhpcy50aWxlSUQuY2Fub25pY2FsLnogPCBuZXdUaWxlSUQuY2Fub25pY2FsLnogPyAxIDogTWF0aC5wb3coMiwgdGhpcy50aWxlSUQuY2Fub25pY2FsLnogLSBuZXdUaWxlSUQuY2Fub25pY2FsLnopO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQpIHtcbiAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGhhcyBhIG1hdGNoLCBza2lwXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ZWRJbnN0YW5jZXMgPSB0aGlzLmluZGV4ZWRTeW1ib2xJbnN0YW5jZXNbc3ltYm9sSW5zdGFuY2Uua2V5XTtcbiAgICAgICAgICAgIGlmICghaW5kZXhlZEluc3RhbmNlcykge1xuICAgICAgICAgICAgICAgIC8vIE5vIHN5bWJvbCB3aXRoIHRoaXMga2V5IGluIHRoaXMgYnVja2V0XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNjYWxlZFN5bWJvbENvb3JkID0gdGhpcy5nZXRTY2FsZWRDb29yZGluYXRlcyhzeW1ib2xJbnN0YW5jZSwgbmV3VGlsZUlEKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB0aGlzVGlsZVN5bWJvbCBvZiBpbmRleGVkSW5zdGFuY2VzKSB7XG4gICAgICAgICAgICAgICAgLy8gUmV0dXJuIGFueSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBrZXlzIHdob3NlIGNvb3JkaW5hdGVzIGFyZSB3aXRoaW4gMVxuICAgICAgICAgICAgICAgIC8vIGdyaWQgdW5pdC4gKHdpdGggYSA0cHggZ3JpZCwgdGhpcyBjb3ZlcnMgYSAxMnB4IGJ5IDEycHggYXJlYSlcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnModGhpc1RpbGVTeW1ib2wuY29vcmQueCAtIHNjYWxlZFN5bWJvbENvb3JkLngpIDw9IHRvbGVyYW5jZSAmJlxuICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyh0aGlzVGlsZVN5bWJvbC5jb29yZC55IC0gc2NhbGVkU3ltYm9sQ29vcmQueSkgPD0gdG9sZXJhbmNlICYmXG4gICAgICAgICAgICAgICAgICAgICF6b29tQ3Jvc3NUaWxlSURzW3RoaXNUaWxlU3ltYm9sLmNyb3NzVGlsZUlEXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBPbmNlIHdlJ3ZlIG1hcmtlZCBvdXJzZWx2ZXMgZHVwbGljYXRlIGFnYWluc3QgdGhpcyBwYXJlbnQgc3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBsZXQgYW55IG90aGVyIHN5bWJvbHMgYXQgdGhlIHNhbWUgem9vbSBsZXZlbCBkdXBsaWNhdGUgYWdhaW5zdFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBwYXJlbnQgKHNlZSBpc3N1ZSAjNTk5MylcbiAgICAgICAgICAgICAgICAgICAgem9vbUNyb3NzVGlsZUlEc1t0aGlzVGlsZVN5bWJvbC5jcm9zc1RpbGVJRF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCA9IHRoaXNUaWxlU3ltYm9sLmNyb3NzVGlsZUlEO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIENyb3NzVGlsZUlEcyB7XG4gICAgbWF4Q3Jvc3NUaWxlSUQ6IG51bWJlcjtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tYXhDcm9zc1RpbGVJRCA9IDA7XG4gICAgfVxuICAgIGdlbmVyYXRlKCkge1xuICAgICAgICByZXR1cm4gKyt0aGlzLm1heENyb3NzVGlsZUlEO1xuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NUaWxlU3ltYm9sTGF5ZXJJbmRleCB7XG4gICAgaW5kZXhlczoge1t6b29tOiBzdHJpbmcgfCBudW1iZXJdOiB7W3RpbGVJZDogc3RyaW5nIHwgbnVtYmVyXTogVGlsZUxheWVySW5kZXh9fTtcbiAgICB1c2VkQ3Jvc3NUaWxlSURzOiB7W3pvb206IHN0cmluZyB8IG51bWJlcl06IHtbY3Jvc3NUaWxlSUQ6IG51bWJlcl06IGJvb2xlYW59fTtcbiAgICBsbmc6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmluZGV4ZXMgPSB7fTtcbiAgICAgICAgdGhpcy51c2VkQ3Jvc3NUaWxlSURzID0ge307XG4gICAgICAgIHRoaXMubG5nID0gMDtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFNvbWV0aW1lcyB3aGVuIGEgdXNlciBwYW5zIGFjcm9zcyB0aGUgYW50aW1lcmlkaWFuIHRoZSBsb25naXR1ZGUgdmFsdWUgZ2V0cyB3cmFwcGVkLlxuICAgICAqIFRvIHByZXZlbnQgbGFiZWxzIGZyb20gZmxhc2hpbmcgb3V0IGFuZCBpbiB3ZSBhZGp1c3QgdGhlIHRpbGVJRCB2YWx1ZXMgaW4gdGhlIGluZGV4ZXNcbiAgICAgKiBzbyB0aGF0IHRoZXkgbWF0Y2ggdGhlIG5ldyB3cmFwcGVkIHZlcnNpb24gb2YgdGhlIG1hcC5cbiAgICAgKi9cbiAgICBoYW5kbGVXcmFwSnVtcChsbmc6IG51bWJlcikge1xuICAgICAgICBjb25zdCB3cmFwRGVsdGEgPSBNYXRoLnJvdW5kKChsbmcgLSB0aGlzLmxuZykgLyAzNjApO1xuICAgICAgICBpZiAod3JhcERlbHRhICE9PSAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHpvb20gaW4gdGhpcy5pbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgem9vbUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNbem9vbV07XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Wm9vbUluZGV4ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gem9vbUluZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0aWxlSUQncyB3cmFwIGFuZCBhZGQgaXQgdG8gYSBuZXcgaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB6b29tSW5kZXhlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBpbmRleC50aWxlSUQgPSBpbmRleC50aWxlSUQudW53cmFwVG8oaW5kZXgudGlsZUlELndyYXAgKyB3cmFwRGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICBuZXdab29tSW5kZXhbaW5kZXgudGlsZUlELmtleV0gPSBpbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleGVzW3pvb21dID0gbmV3Wm9vbUluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG5nID0gbG5nO1xuICAgIH1cblxuICAgIGFkZEJ1Y2tldCh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIGJ1Y2tldDogU3ltYm9sQnVja2V0LCBjcm9zc1RpbGVJRHM6IENyb3NzVGlsZUlEcykge1xuICAgICAgICBpZiAodGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl0gJiZcbiAgICAgICAgICAgIHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdW3RpbGVJRC5rZXldKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl1bdGlsZUlELmtleV0uYnVja2V0SW5zdGFuY2VJZCA9PT1cbiAgICAgICAgICAgICAgICBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UncmUgcmVwbGFjaW5nIHRoaXMgYnVja2V0IHdpdGggYW4gdXBkYXRlZCB2ZXJzaW9uXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBvbGQgYnVja2V0J3MgXCJ1c2VkIGNyb3NzVGlsZUlEc1wiIG5vdyBzbyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gdGhlIG5ldyBidWNrZXQgY2FuIGNsYWltIHRoZW0uXG4gICAgICAgICAgICAgICAgLy8gVGhlIG9sZCBpbmRleCBlbnRyaWVzIHRoZW1zZWx2ZXMgc3RpY2sgYXJvdW5kIHVudGlsXG4gICAgICAgICAgICAgICAgLy8gJ3JlbW92ZVN0YWxlQnVja2V0cycgaXMgY2FsbGVkLlxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHRpbGVJRC5vdmVyc2NhbGVkWixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl1bdGlsZUlELmtleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnVzZWRDcm9zc1RpbGVJRHNbdGlsZUlELm92ZXJzY2FsZWRaXSkge1xuICAgICAgICAgICAgdGhpcy51c2VkQ3Jvc3NUaWxlSURzW3RpbGVJRC5vdmVyc2NhbGVkWl0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6b29tQ3Jvc3NUaWxlSURzID0gdGhpcy51c2VkQ3Jvc3NUaWxlSURzW3RpbGVJRC5vdmVyc2NhbGVkWl07XG5cbiAgICAgICAgZm9yIChjb25zdCB6b29tIGluIHRoaXMuaW5kZXhlcykge1xuICAgICAgICAgICAgY29uc3Qgem9vbUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNbem9vbV07XG4gICAgICAgICAgICBpZiAoTnVtYmVyKHpvb20pID4gdGlsZUlELm92ZXJzY2FsZWRaKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB6b29tSW5kZXhlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEluZGV4ID0gem9vbUluZGV4ZXNbaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleC50aWxlSUQuaXNDaGlsZE9mKHRpbGVJRCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXguZmluZE1hdGNoZXMoYnVja2V0LnN5bWJvbEluc3RhbmNlcywgdGlsZUlELCB6b29tQ3Jvc3NUaWxlSURzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Q29vcmQgPSB0aWxlSUQuc2NhbGVkVG8oTnVtYmVyKHpvb20pKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHpvb21JbmRleGVzW3BhcmVudENvb3JkLmtleV07XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZGV4LmZpbmRNYXRjaGVzKGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMsIHRpbGVJRCwgem9vbUNyb3NzVGlsZUlEcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgaWYgKCFzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCkge1xuICAgICAgICAgICAgICAgIC8vIHN5bWJvbCBkaWQgbm90IG1hdGNoIGFueSBrbm93biBzeW1ib2wsIGFzc2lnbiBhIG5ldyBpZFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEID0gY3Jvc3NUaWxlSURzLmdlbmVyYXRlKCk7XG4gICAgICAgICAgICAgICAgem9vbUNyb3NzVGlsZUlEc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl1bdGlsZUlELmtleV0gPSBuZXcgVGlsZUxheWVySW5kZXgodGlsZUlELCBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLCBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHpvb206IHN0cmluZyB8IG51bWJlciwgcmVtb3ZlZEJ1Y2tldDogVGlsZUxheWVySW5kZXgpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVtb3ZlZEJ1Y2tldC5pbmRleGVkU3ltYm9sSW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN5bWJvbEluc3RhbmNlIG9mIHJlbW92ZWRCdWNrZXQuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1soa2V5OiBhbnkpXSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnVzZWRDcm9zc1RpbGVJRHNbem9vbV1bc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlU3RhbGVCdWNrZXRzKGN1cnJlbnRJRHM6IHsgW3N0cmluZyB8IG51bWJlcl06IGJvb2xlYW4gfSkge1xuICAgICAgICBsZXQgdGlsZXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgeiBpbiB0aGlzLmluZGV4ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHpvb21JbmRleGVzID0gdGhpcy5pbmRleGVzW3pdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0aWxlS2V5IGluIHpvb21JbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50SURzW3pvb21JbmRleGVzW3RpbGVLZXldLmJ1Y2tldEluc3RhbmNlSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHosIHpvb21JbmRleGVzW3RpbGVLZXldKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHpvb21JbmRleGVzW3RpbGVLZXldO1xuICAgICAgICAgICAgICAgICAgICB0aWxlc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGlsZXNDaGFuZ2VkO1xuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NUaWxlU3ltYm9sSW5kZXgge1xuICAgIGxheWVySW5kZXhlczoge1tsYXllcklkOiBzdHJpbmddOiBDcm9zc1RpbGVTeW1ib2xMYXllckluZGV4fTtcbiAgICBjcm9zc1RpbGVJRHM6IENyb3NzVGlsZUlEcztcbiAgICBtYXhCdWNrZXRJbnN0YW5jZUlkOiBudW1iZXI7XG4gICAgYnVja2V0c0luQ3VycmVudFBsYWNlbWVudDoge1tfOiBudW1iZXJdOiBib29sZWFufTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxheWVySW5kZXhlcyA9IHt9O1xuICAgICAgICB0aGlzLmNyb3NzVGlsZUlEcyA9IG5ldyBDcm9zc1RpbGVJRHMoKTtcbiAgICAgICAgdGhpcy5tYXhCdWNrZXRJbnN0YW5jZUlkID0gMDtcbiAgICAgICAgdGhpcy5idWNrZXRzSW5DdXJyZW50UGxhY2VtZW50ID0ge307XG4gICAgfVxuXG4gICAgYWRkTGF5ZXIoc3R5bGVMYXllcjogU3R5bGVMYXllciwgdGlsZXM6IEFycmF5PFRpbGU+LCBsbmc6IG51bWJlciwgcHJvamVjdGlvbjogUHJvamVjdGlvbikge1xuICAgICAgICBsZXQgbGF5ZXJJbmRleCA9IHRoaXMubGF5ZXJJbmRleGVzW3N0eWxlTGF5ZXIuaWRdO1xuICAgICAgICBpZiAobGF5ZXJJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXllckluZGV4ID0gdGhpcy5sYXllckluZGV4ZXNbc3R5bGVMYXllci5pZF0gPSBuZXcgQ3Jvc3NUaWxlU3ltYm9sTGF5ZXJJbmRleCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCdWNrZXRJRHMgPSB7fTtcblxuICAgICAgICBpZiAocHJvamVjdGlvbi5uYW1lICE9PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICBsYXllckluZGV4LmhhbmRsZVdyYXBKdW1wKGxuZyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGUgb2YgdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEJ1Y2tldCA9ICgodGlsZS5nZXRCdWNrZXQoc3R5bGVMYXllcik6IGFueSk6IFN5bWJvbEJ1Y2tldCk7XG4gICAgICAgICAgICBpZiAoIXN5bWJvbEJ1Y2tldCB8fCBzdHlsZUxheWVyLmlkICE9PSBzeW1ib2xCdWNrZXQubGF5ZXJJZHNbMF0pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmICghc3ltYm9sQnVja2V0LmJ1Y2tldEluc3RhbmNlSWQpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZCA9ICsrdGhpcy5tYXhCdWNrZXRJbnN0YW5jZUlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF5ZXJJbmRleC5hZGRCdWNrZXQodGlsZS50aWxlSUQsIHN5bWJvbEJ1Y2tldCwgdGhpcy5jcm9zc1RpbGVJRHMpKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sQnVja2V0c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudEJ1Y2tldElEc1tzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheWVySW5kZXgucmVtb3ZlU3RhbGVCdWNrZXRzKGN1cnJlbnRCdWNrZXRJRHMpKSB7XG4gICAgICAgICAgICBzeW1ib2xCdWNrZXRzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3ltYm9sQnVja2V0c0NoYW5nZWQ7XG4gICAgfVxuXG4gICAgcHJ1bmVVbnVzZWRMYXllcnModXNlZExheWVyczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBjb25zdCB1c2VkTGF5ZXJNYXAgPSB7fTtcbiAgICAgICAgdXNlZExheWVycy5mb3JFYWNoKCh1c2VkTGF5ZXIpID0+IHtcbiAgICAgICAgICAgIHVzZWRMYXllck1hcFt1c2VkTGF5ZXJdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLmxheWVySW5kZXhlcykge1xuICAgICAgICAgICAgaWYgKCF1c2VkTGF5ZXJNYXBbbGF5ZXJJZF0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5sYXllckluZGV4ZXNbbGF5ZXJJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENyb3NzVGlsZVN5bWJvbEluZGV4O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge0V2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgY3JlYXRlU3R5bGVMYXllciBmcm9tICcuL2NyZWF0ZV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgbG9hZFNwcml0ZSBmcm9tICcuL2xvYWRfc3ByaXRlLmpzJztcbmltcG9ydCBJbWFnZU1hbmFnZXIgZnJvbSAnLi4vcmVuZGVyL2ltYWdlX21hbmFnZXIuanMnO1xuaW1wb3J0IEdseXBoTWFuYWdlciwge0xvY2FsR2x5cGhNb2RlfSBmcm9tICcuLi9yZW5kZXIvZ2x5cGhfbWFuYWdlci5qcyc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi9saWdodC5qcyc7XG5pbXBvcnQgVGVycmFpbiwge0RyYXBlUmVuZGVyTW9kZX0gZnJvbSAnLi90ZXJyYWluLmpzJztcbmltcG9ydCBGb2cgZnJvbSAnLi9mb2cuanMnO1xuaW1wb3J0IExpbmVBdGxhcyBmcm9tICcuLi9yZW5kZXIvbGluZV9hdGxhcy5qcyc7XG5pbXBvcnQge3BpY2ssIGNsb25lLCBleHRlbmQsIGRlZXBFcXVhbCwgZmlsdGVyT2JqZWN0fSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtnZXRKU09OLCBnZXRSZWZlcnJlciwgbWFrZVJlcXVlc3QsIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCB7aXNNYXBib3hVUkx9IGZyb20gJy4uL3V0aWwvbWFwYm94LmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHt2YWxpZGF0ZVN0eWxlLCBlbWl0VmFsaWRhdGlvbkVycm9ycyBhcyBfZW1pdFZhbGlkYXRpb25FcnJvcnN9IGZyb20gJy4vdmFsaWRhdGVfc3R5bGUuanMnO1xuaW1wb3J0IHtRdWVyeUdlb21ldHJ5fSBmcm9tICcuLi9zdHlsZS9xdWVyeV9nZW9tZXRyeS5qcyc7XG5pbXBvcnQge1xuICAgIGNyZWF0ZSBhcyBjcmVhdGVTb3VyY2UsXG4gICAgZ2V0VHlwZSBhcyBnZXRTb3VyY2VUeXBlLFxuICAgIHNldFR5cGUgYXMgc2V0U291cmNlVHlwZSxcbiAgICB0eXBlIFNvdXJjZUNsYXNzXG59IGZyb20gJy4uL3NvdXJjZS9zb3VyY2UuanMnO1xuaW1wb3J0IHtxdWVyeVJlbmRlcmVkRmVhdHVyZXMsIHF1ZXJ5UmVuZGVyZWRTeW1ib2xzLCBxdWVyeVNvdXJjZUZlYXR1cmVzfSBmcm9tICcuLi9zb3VyY2UvcXVlcnlfZmVhdHVyZXMuanMnO1xuaW1wb3J0IFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMnO1xuaW1wb3J0IEdlb0pTT05Tb3VyY2UgZnJvbSAnLi4vc291cmNlL2dlb2pzb25fc291cmNlLmpzJztcbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcbmltcG9ydCBnZXRXb3JrZXJQb29sIGZyb20gJy4uL3V0aWwvZ2xvYmFsX3dvcmtlcl9wb29sLmpzJztcbmltcG9ydCBkZXJlZiBmcm9tICcuLi9zdHlsZS1zcGVjL2RlcmVmLmpzJztcbmltcG9ydCBlbXB0eVN0eWxlIGZyb20gJy4uL3N0eWxlLXNwZWMvZW1wdHkuanMnO1xuaW1wb3J0IGRpZmZTdHlsZXMsIHtvcGVyYXRpb25zIGFzIGRpZmZPcGVyYXRpb25zfSBmcm9tICcuLi9zdHlsZS1zcGVjL2RpZmYuanMnO1xuaW1wb3J0IHtcbiAgICByZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlLFxuICAgIGV2ZW50ZWQgYXMgcnRsVGV4dFBsdWdpbkV2ZW50ZWQsXG4gICAgdHJpZ2dlclBsdWdpbkNvbXBsZXRpb25FdmVudFxufSBmcm9tICcuLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luLmpzJztcbmltcG9ydCBQYXVzZWFibGVQbGFjZW1lbnQgZnJvbSAnLi9wYXVzZWFibGVfcGxhY2VtZW50LmpzJztcbmltcG9ydCBab29tSGlzdG9yeSBmcm9tICcuL3pvb21faGlzdG9yeS5qcyc7XG5pbXBvcnQgQ3Jvc3NUaWxlU3ltYm9sSW5kZXggZnJvbSAnLi4vc3ltYm9sL2Nyb3NzX3RpbGVfc3ltYm9sX2luZGV4LmpzJztcbmltcG9ydCB7dmFsaWRhdGVDdXN0b21TdHlsZUxheWVyfSBmcm9tICcuL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllci5qcyc7XG5cbi8vIFdlJ3JlIHNraXBwaW5nIHZhbGlkYXRpb24gZXJyb3JzIHdpdGggdGhlIGBzb3VyY2UuY2FudmFzYCBpZGVudGlmaWVyIGluIG9yZGVyXG4vLyB0byBjb250aW51ZSB0byBhbGxvdyBjYW52YXMgc291cmNlcyB0byBiZSBhZGRlZCBhdCBydW50aW1lL3VwZGF0ZWQgaW5cbi8vIHNtYXJ0IHNldFN0eWxlIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvcHVsbC82NDI0KTpcbmNvbnN0IGVtaXRWYWxpZGF0aW9uRXJyb3JzID0gKGV2ZW50ZWQ6IEV2ZW50ZWQsIGVycm9yczogPyRSZWFkT25seUFycmF5PHttZXNzYWdlOiBzdHJpbmcsIGlkZW50aWZpZXI/OiBzdHJpbmd9PikgPT5cbiAgICBfZW1pdFZhbGlkYXRpb25FcnJvcnMoZXZlbnRlZCwgZXJyb3JzICYmIGVycm9ycy5maWx0ZXIoZXJyb3IgPT4gZXJyb3IuaWRlbnRpZmllciAhPT0gJ3NvdXJjZS5jYW52YXMnKSk7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2V9IGZyb20gJy4vc3R5bGVfaW1hZ2UuanMnO1xuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4vc3R5bGVfZ2x5cGguanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7UGxhY2VtZW50fSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50LmpzJztcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlLmpzJztcbmltcG9ydCB0eXBlIHtSZXF1ZXN0UGFyYW1ldGVycywgUmVzcG9uc2VDYWxsYmFja30gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCB0eXBlIHtHZW9KU09OfSBmcm9tICdAbWFwYm94L2dlb2pzb24tdHlwZXMnO1xuaW1wb3J0IHR5cGUge1xuICAgIExheWVyU3BlY2lmaWNhdGlvbixcbiAgICBGaWx0ZXJTcGVjaWZpY2F0aW9uLFxuICAgIFN0eWxlU3BlY2lmaWNhdGlvbixcbiAgICBMaWdodFNwZWNpZmljYXRpb24sXG4gICAgU291cmNlU3BlY2lmaWNhdGlvbixcbiAgICBUZXJyYWluU3BlY2lmaWNhdGlvbixcbiAgICBGb2dTcGVjaWZpY2F0aW9uLFxuICAgIFByb2plY3Rpb25TcGVjaWZpY2F0aW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0N1c3RvbUxheWVySW50ZXJmYWNlfSBmcm9tICcuL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7VmFsaWRhdG9yfSBmcm9tICcuL3ZhbGlkYXRlX3N0eWxlLmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7UG9pbnRMaWtlfSBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuY29uc3Qgc3VwcG9ydGVkRGlmZk9wZXJhdGlvbnMgPSBwaWNrKGRpZmZPcGVyYXRpb25zLCBbXG4gICAgJ2FkZExheWVyJyxcbiAgICAncmVtb3ZlTGF5ZXInLFxuICAgICdzZXRQYWludFByb3BlcnR5JyxcbiAgICAnc2V0TGF5b3V0UHJvcGVydHknLFxuICAgICdzZXRGaWx0ZXInLFxuICAgICdhZGRTb3VyY2UnLFxuICAgICdyZW1vdmVTb3VyY2UnLFxuICAgICdzZXRMYXllclpvb21SYW5nZScsXG4gICAgJ3NldExpZ2h0JyxcbiAgICAnc2V0VHJhbnNpdGlvbicsXG4gICAgJ3NldEdlb0pTT05Tb3VyY2VEYXRhJyxcbiAgICAnc2V0VGVycmFpbicsXG4gICAgJ3NldEZvZycsXG4gICAgJ3NldFByb2plY3Rpb24nXG4gICAgLy8gJ3NldEdseXBocycsXG4gICAgLy8gJ3NldFNwcml0ZScsXG5dKTtcblxuY29uc3QgaWdub3JlZERpZmZPcGVyYXRpb25zID0gcGljayhkaWZmT3BlcmF0aW9ucywgW1xuICAgICdzZXRDZW50ZXInLFxuICAgICdzZXRab29tJyxcbiAgICAnc2V0QmVhcmluZycsXG4gICAgJ3NldFBpdGNoJ1xuXSk7XG5cbmNvbnN0IGVtcHR5ID0gZW1wdHlTdHlsZSgpO1xuXG5leHBvcnQgdHlwZSBTdHlsZU9wdGlvbnMgPSB7XG4gICAgdmFsaWRhdGU/OiBib29sZWFuLFxuICAgIGxvY2FsRm9udEZhbWlseT86IHN0cmluZyxcbiAgICBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk/OiBzdHJpbmdcbn07XG5cbmV4cG9ydCB0eXBlIFN0eWxlU2V0dGVyT3B0aW9ucyA9IHtcbiAgICB2YWxpZGF0ZT86IGJvb2xlYW5cbn07XG5cbi8vIFN5bWJvbHMgYXJlIGRyYXBlZCBvbmx5IGZvciBzcGVjaWZpYyBjYXNlczogc2VlIGlzTGF5ZXJEcmFwZWRcbmNvbnN0IGRyYXBlZExheWVycyA9IHsnZmlsbCc6IHRydWUsICdsaW5lJzogdHJ1ZSwgJ2JhY2tncm91bmQnOiB0cnVlLCBcImhpbGxzaGFkZVwiOiB0cnVlLCBcInJhc3RlclwiOiB0cnVlfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHlsZSBleHRlbmRzIEV2ZW50ZWQge1xuICAgIG1hcDogTWFwO1xuICAgIHN0eWxlc2hlZXQ6IFN0eWxlU3BlY2lmaWNhdGlvbjtcbiAgICBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xuICAgIGltYWdlTWFuYWdlcjogSW1hZ2VNYW5hZ2VyO1xuICAgIGdseXBoTWFuYWdlcjogR2x5cGhNYW5hZ2VyO1xuICAgIGxpbmVBdGxhczogTGluZUF0bGFzO1xuICAgIGxpZ2h0OiBMaWdodDtcbiAgICB0ZXJyYWluOiA/VGVycmFpbjtcbiAgICBmb2c6ID9Gb2c7XG5cbiAgICBfcmVxdWVzdDogP0NhbmNlbGFibGU7XG4gICAgX3Nwcml0ZVJlcXVlc3Q6ID9DYW5jZWxhYmxlO1xuICAgIF9sYXllcnM6IHtbXzogc3RyaW5nXTogU3R5bGVMYXllcn07XG4gICAgX251bTNETGF5ZXJzOiBudW1iZXI7XG4gICAgX251bVN5bWJvbExheWVyczogbnVtYmVyO1xuICAgIF9udW1DaXJjbGVMYXllcnM6IG51bWJlcjtcbiAgICBfc2VyaWFsaXplZExheWVyczoge1tfOiBzdHJpbmddOiBPYmplY3R9O1xuICAgIF9vcmRlcjogQXJyYXk8c3RyaW5nPjtcbiAgICBfZHJhcGVkRmlyc3RPcmRlcjogQXJyYXk8c3RyaW5nPjtcbiAgICBfc291cmNlQ2FjaGVzOiB7W186IHN0cmluZ106IFNvdXJjZUNhY2hlfTtcbiAgICBfb3RoZXJTb3VyY2VDYWNoZXM6IHtbXzogc3RyaW5nXTogU291cmNlQ2FjaGV9O1xuICAgIF9zeW1ib2xTb3VyY2VDYWNoZXM6IHtbXzogc3RyaW5nXTogU291cmNlQ2FjaGV9O1xuICAgIHpvb21IaXN0b3J5OiBab29tSGlzdG9yeTtcbiAgICBfbG9hZGVkOiBib29sZWFuO1xuICAgIF9ydGxUZXh0UGx1Z2luQ2FsbGJhY2s6IEZ1bmN0aW9uO1xuICAgIF9jaGFuZ2VkOiBib29sZWFuO1xuICAgIF91cGRhdGVkU291cmNlczoge1tfOiBzdHJpbmddOiAnY2xlYXInIHwgJ3JlbG9hZCd9O1xuICAgIF91cGRhdGVkTGF5ZXJzOiB7W186IHN0cmluZ106IHRydWV9O1xuICAgIF9yZW1vdmVkTGF5ZXJzOiB7W186IHN0cmluZ106IFN0eWxlTGF5ZXJ9O1xuICAgIF9jaGFuZ2VkSW1hZ2VzOiB7W186IHN0cmluZ106IHRydWV9O1xuICAgIF91cGRhdGVkUGFpbnRQcm9wczoge1tsYXllcjogc3RyaW5nXTogdHJ1ZX07XG4gICAgX2xheWVyT3JkZXJDaGFuZ2VkOiBib29sZWFuO1xuICAgIF9hdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz47XG4gICAgX21hcmtlcnNOZWVkVXBkYXRlOiBib29sZWFuO1xuXG4gICAgY3Jvc3NUaWxlU3ltYm9sSW5kZXg6IENyb3NzVGlsZVN5bWJvbEluZGV4O1xuICAgIHBhdXNlYWJsZVBsYWNlbWVudDogUGF1c2VhYmxlUGxhY2VtZW50O1xuICAgIHBsYWNlbWVudDogUGxhY2VtZW50O1xuICAgIHo6IG51bWJlcjtcblxuICAgIC8vIGV4cG9zZWQgdG8gYWxsb3cgc3R1YmJpbmcgYnkgdW5pdCB0ZXN0c1xuICAgIHN0YXRpYyBnZXRTb3VyY2VUeXBlOiB0eXBlb2YgZ2V0U291cmNlVHlwZTtcbiAgICBzdGF0aWMgc2V0U291cmNlVHlwZTogdHlwZW9mIHNldFNvdXJjZVR5cGU7XG4gICAgc3RhdGljIHJlZ2lzdGVyRm9yUGx1Z2luU3RhdGVDaGFuZ2U6IHR5cGVvZiByZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlO1xuXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IFN0eWxlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKGdldFdvcmtlclBvb2woKSwgdGhpcyk7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyID0gbmV3IEltYWdlTWFuYWdlcigpO1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5zZXRFdmVudGVkUGFyZW50KHRoaXMpO1xuICAgICAgICB0aGlzLmdseXBoTWFuYWdlciA9IG5ldyBHbHlwaE1hbmFnZXIobWFwLl9yZXF1ZXN0TWFuYWdlcixcbiAgICAgICAgICAgIG9wdGlvbnMubG9jYWxGb250RmFtaWx5ID9cbiAgICAgICAgICAgICAgICBMb2NhbEdseXBoTW9kZS5hbGwgOlxuICAgICAgICAgICAgICAgIChvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSA/IExvY2FsR2x5cGhNb2RlLmlkZW9ncmFwaHMgOiBMb2NhbEdseXBoTW9kZS5ub25lKSxcbiAgICAgICAgICAgIG9wdGlvbnMubG9jYWxGb250RmFtaWx5IHx8IG9wdGlvbnMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5KTtcbiAgICAgICAgdGhpcy5saW5lQXRsYXMgPSBuZXcgTGluZUF0bGFzKDI1NiwgNTEyKTtcbiAgICAgICAgdGhpcy5jcm9zc1RpbGVTeW1ib2xJbmRleCA9IG5ldyBDcm9zc1RpbGVTeW1ib2xJbmRleCgpO1xuXG4gICAgICAgIHRoaXMuX2xheWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9udW0zRExheWVycyA9IDA7XG4gICAgICAgIHRoaXMuX251bVN5bWJvbExheWVycyA9IDA7XG4gICAgICAgIHRoaXMuX251bUNpcmNsZUxheWVycyA9IDA7XG4gICAgICAgIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fc291cmNlQ2FjaGVzID0ge307XG4gICAgICAgIHRoaXMuX290aGVyU291cmNlQ2FjaGVzID0ge307XG4gICAgICAgIHRoaXMuX3N5bWJvbFNvdXJjZUNhY2hlcyA9IHt9O1xuICAgICAgICB0aGlzLnpvb21IaXN0b3J5ID0gbmV3IFpvb21IaXN0b3J5KCk7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hdmFpbGFibGVJbWFnZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fb3JkZXIgID0gW107XG4gICAgICAgIHRoaXMuX2RyYXBlZEZpcnN0T3JkZXIgPSBbXTtcbiAgICAgICAgdGhpcy5fbWFya2Vyc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9yZXNldFVwZGF0ZXMoKTtcblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdzZXRSZWZlcnJlcicsIGdldFJlZmVycmVyKCkpO1xuXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLl9ydGxUZXh0UGx1Z2luQ2FsbGJhY2sgPSBTdHlsZS5yZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luU3RhdHVzOiBldmVudC5wbHVnaW5TdGF0dXMsXG4gICAgICAgICAgICAgICAgcGx1Z2luVVJMOiBldmVudC5wbHVnaW5VUkxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZWxmLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdzeW5jUlRMUGx1Z2luU3RhdGUnLCBzdGF0ZSwgKGVyciwgcmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgICAgIHRyaWdnZXJQbHVnaW5Db21wbGV0aW9uRXZlbnQoZXJyKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxDb21wbGV0ZSA9IHJlc3VsdHMuZXZlcnkoKGVsZW0pID0+IGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gc2VsZi5fc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzZWxmLl9zb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlVHlwZSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlVHlwZSA9PT0gJ3ZlY3RvcicgfHwgc291cmNlQ2FjaGVUeXBlID09PSAnZ2VvanNvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ2FjaGUucmVsb2FkKCk7IC8vIFNob3VsZCBiZSBhIG5vLW9wIGlmIHRoZSBwbHVnaW4gbG9hZHMgYmVmb3JlIGFueSB0aWxlcyBsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vbignZGF0YScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGFUeXBlICE9PSAnc291cmNlJyB8fCBldmVudC5zb3VyY2VEYXRhVHlwZSAhPT0gJ21ldGFkYXRhJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5nZXRTb3VyY2UoZXZlbnQuc291cmNlSWQpO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UgfHwgIXNvdXJjZS52ZWN0b3JMYXllcklkcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySWRdO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5zb3VyY2UgPT09IHNvdXJjZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWRVUkwodXJsOiBzdHJpbmcsIG9wdGlvbnM6IHtcbiAgICAgICAgdmFsaWRhdGU/OiBib29sZWFuLFxuICAgICAgICBhY2Nlc3NUb2tlbj86IHN0cmluZ1xuICAgIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZSA9IHR5cGVvZiBvcHRpb25zLnZhbGlkYXRlID09PSAnYm9vbGVhbicgP1xuICAgICAgICAgICAgb3B0aW9ucy52YWxpZGF0ZSA6ICFpc01hcGJveFVSTCh1cmwpO1xuXG4gICAgICAgIHVybCA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTdHlsZVVSTCh1cmwsIG9wdGlvbnMuYWNjZXNzVG9rZW4pO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuU3R5bGUpO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gZ2V0SlNPTihyZXF1ZXN0LCAoZXJyb3I6ID9FcnJvciwganNvbjogP09iamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyb3IpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWQoanNvbiwgdmFsaWRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkSlNPTihqc29uOiBTdHlsZVNwZWNpZmljYXRpb24sIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc3R5bGUnfSkpO1xuXG4gICAgICAgIHRoaXMuX3JlcXVlc3QgPSBicm93c2VyLmZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fbG9hZChqc29uLCBvcHRpb25zLnZhbGlkYXRlICE9PSBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxvYWRFbXB0eSgpIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KSk7XG4gICAgICAgIHRoaXMuX2xvYWQoZW1wdHksIGZhbHNlKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlTGF5ZXJDb3VudChsYXllcjogU3R5bGVMYXllciwgYWRkOiBib29sZWFuKSB7XG4gICAgICAgIC8vIFR5cGVkIGxheWVyIGJvb2trZWVwaW5nXG4gICAgICAgIGNvbnN0IGNvdW50ID0gYWRkID8gMSA6IC0xO1xuICAgICAgICBpZiAobGF5ZXIuaXMzRCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9udW0zRExheWVycyArPSBjb3VudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgIHRoaXMuX251bUNpcmNsZUxheWVycyArPSBjb3VudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgIHRoaXMuX251bVN5bWJvbExheWVycyArPSBjb3VudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9sb2FkKGpzb246IFN0eWxlU3BlY2lmaWNhdGlvbiwgdmFsaWRhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbGlkYXRlICYmIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlU3R5bGUoanNvbikpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0eWxlc2hlZXQgPSBqc29uO1xuXG4gICAgICAgIHRoaXMudXBkYXRlUHJvamVjdGlvbigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4ganNvbi5zb3VyY2VzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFNvdXJjZShpZCwganNvbi5zb3VyY2VzW2lkXSwge3ZhbGlkYXRlOiBmYWxzZX0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSBmYWxzZTsgLy8gYXZvaWQgdHJpZ2dlcmluZyByZWR1bmRhbnQgc3R5bGUgdXBkYXRlIGFmdGVyIGFkZGluZyBpbml0aWFsIHNvdXJjZXNcbiAgICAgICAgaWYgKGpzb24uc3ByaXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkU3ByaXRlKGpzb24uc3ByaXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLnNldExvYWRlZCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ3Nwcml0ZUxvYWRlZCcsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbHlwaE1hbmFnZXIuc2V0VVJMKGpzb24uZ2x5cGhzKTtcblxuICAgICAgICBjb25zdCBsYXllcnMgPSBkZXJlZih0aGlzLnN0eWxlc2hlZXQubGF5ZXJzKTtcblxuICAgICAgICB0aGlzLl9vcmRlciA9IGxheWVycy5tYXAoKGxheWVyKSA9PiBsYXllci5pZCk7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgICAgICBsYXllciA9IGNyZWF0ZVN0eWxlTGF5ZXIobGF5ZXIpO1xuICAgICAgICAgICAgbGF5ZXIuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7bGF5ZXI6IHtpZDogbGF5ZXIuaWR9fSk7XG4gICAgICAgICAgICB0aGlzLl9sYXllcnNbbGF5ZXIuaWRdID0gbGF5ZXI7XG4gICAgICAgICAgICB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzW2xheWVyLmlkXSA9IGxheWVyLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXJDb3VudChsYXllciwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdzZXRMYXllcnMnLCB0aGlzLl9zZXJpYWxpemVMYXllcnModGhpcy5fb3JkZXIpKTtcblxuICAgICAgICB0aGlzLmxpZ2h0ID0gbmV3IExpZ2h0KHRoaXMuc3R5bGVzaGVldC5saWdodCk7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlc2hlZXQudGVycmFpbiAmJiAhdGhpcy50ZXJyYWluU2V0Rm9yRHJhcGluZ09ubHkoKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlVGVycmFpbih0aGlzLnN0eWxlc2hlZXQudGVycmFpbiwgRHJhcGVSZW5kZXJNb2RlLmVsZXZhdGVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zdHlsZXNoZWV0LmZvZykge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlRm9nKHRoaXMuc3R5bGVzaGVldC5mb2cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZURyYXBlRmlyc3RMYXllcnMoKTtcblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc3R5bGUnfSkpO1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdzdHlsZS5sb2FkJykpO1xuICAgIH1cblxuICAgIHRlcnJhaW5TZXRGb3JEcmFwaW5nT25seSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVycmFpbiAmJiB0aGlzLnRlcnJhaW4uZHJhcGVSZW5kZXJNb2RlID09PSBEcmFwZVJlbmRlck1vZGUuZGVmZXJyZWQ7XG4gICAgfVxuXG4gICAgc2V0UHJvamVjdGlvbihwcm9qZWN0aW9uPzogP1Byb2plY3Rpb25TcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIGlmIChwcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlc2hlZXQucHJvamVjdGlvbiA9IHByb2plY3Rpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZXNoZWV0LnByb2plY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVQcm9qZWN0aW9uKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlUHJvamVjdGlvbigpIHtcbiAgICAgICAgY29uc3QgcHJldlByb2plY3Rpb24gPSB0aGlzLm1hcC50cmFuc2Zvcm0ucHJvamVjdGlvbjtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbkNoYW5nZWQgPSB0aGlzLm1hcC50cmFuc2Zvcm0uc2V0UHJvamVjdGlvbih0aGlzLm1hcC5fcnVudGltZVByb2plY3Rpb24gfHwgKHRoaXMuc3R5bGVzaGVldCA/IHRoaXMuc3R5bGVzaGVldC5wcm9qZWN0aW9uIDogdW5kZWZpbmVkKSk7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSB0aGlzLm1hcC50cmFuc2Zvcm0ucHJvamVjdGlvbjtcblxuICAgICAgICBpZiAodGhpcy5fbG9hZGVkKSB7XG4gICAgICAgICAgICBpZiAocHJvamVjdGlvbi5yZXF1aXJlc0RyYXBpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNUZXJyYWluID0gdGhpcy5nZXRUZXJyYWluKCkgfHwgdGhpcy5zdHlsZXNoZWV0LnRlcnJhaW47XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNUZXJyYWluKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VGVycmFpbkZvckRyYXBpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudGVycmFpblNldEZvckRyYXBpbmdPbmx5KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRlcnJhaW4obnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdzZXRQcm9qZWN0aW9uJywgdGhpcy5tYXAudHJhbnNmb3JtLnByb2plY3Rpb25PcHRpb25zKTtcblxuICAgICAgICBpZiAoIXByb2plY3Rpb25DaGFuZ2VkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHByb2plY3Rpb24uaXNSZXByb2plY3RlZEluVGlsZVNwYWNlIHx8IHByZXZQcm9qZWN0aW9uLmlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZSkge1xuICAgICAgICAgICAgdGhpcy5tYXAucGFpbnRlci5jbGVhckJhY2tncm91bmRUaWxlcygpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VDYWNoZXNbaWRdLmNsZWFyVGlsZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvcmNlU3ltYm9sTGF5ZXJVcGRhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWFwLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgX2xvYWRTcHJpdGUodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fc3ByaXRlUmVxdWVzdCA9IGxvYWRTcHJpdGUodXJsLCB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIsIChlcnIsIGltYWdlcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3ByaXRlUmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbWFnZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGltYWdlcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5hZGRJbWFnZShpZCwgaW1hZ2VzW2lkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5zZXRMb2FkZWQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl9hdmFpbGFibGVJbWFnZXMgPSB0aGlzLmltYWdlTWFuYWdlci5saXN0SW1hZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdzZXRJbWFnZXMnLCB0aGlzLl9hdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnc3ByaXRlTG9hZGVkJywgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc3R5bGUnfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVMYXllcihsYXllcjogU3R5bGVMYXllcikge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmdldFNvdXJjZShsYXllci5zb3VyY2UpO1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBsYXllci5zb3VyY2VMYXllcjtcbiAgICAgICAgaWYgKCFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNvdXJjZS50eXBlID09PSAnZ2VvanNvbicgfHwgKHNvdXJjZS52ZWN0b3JMYXllcklkcyAmJiBzb3VyY2UudmVjdG9yTGF5ZXJJZHMuaW5kZXhPZihzb3VyY2VMYXllcikgPT09IC0xKSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgU291cmNlIGxheWVyIFwiJHtzb3VyY2VMYXllcn1cIiBgICtcbiAgICAgICAgICAgICAgICBgZG9lcyBub3QgZXhpc3Qgb24gc291cmNlIFwiJHtzb3VyY2UuaWR9XCIgYCArXG4gICAgICAgICAgICAgICAgYGFzIHNwZWNpZmllZCBieSBzdHlsZSBsYXllciBcIiR7bGF5ZXIuaWR9XCJgXG4gICAgICAgICAgICApKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91cGRhdGVkU291cmNlcykubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc291cmNlQ2FjaGVzKVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2VDYWNoZXNbaWRdLmxvYWRlZCgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoIXRoaXMuaW1hZ2VNYW5hZ2VyLmlzTG9hZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgX3NlcmlhbGl6ZUxheWVycyhpZHM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxPYmplY3Q+IHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZExheWVycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICAgICAgaWYgKGxheWVyLnR5cGUgIT09ICdjdXN0b20nKSB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZExheWVycy5wdXNoKGxheWVyLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZExheWVycztcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMubGlnaHQgJiYgdGhpcy5saWdodC5oYXNUcmFuc2l0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZm9nICYmIHRoaXMuZm9nLmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3NvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZUNhY2hlc1tpZF0uaGFzVHJhbnNpdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xheWVyc1tpZF0uaGFzVHJhbnNpdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0IG9yZGVyKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICBpZiAodGhpcy5tYXAuX29wdGltaXplRm9yVGVycmFpbiAmJiB0aGlzLnRlcnJhaW4pIHtcbiAgICAgICAgICAgIGFzc2VydCh0aGlzLl9kcmFwZWRGaXJzdE9yZGVyLmxlbmd0aCA9PT0gdGhpcy5fb3JkZXIubGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcmFwZWRGaXJzdE9yZGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRlcjtcbiAgICB9XG5cbiAgICBpc0xheWVyRHJhcGVkKGxheWVyOiBTdHlsZUxheWVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy50ZXJyYWluKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBkcmFwZWRMYXllcnNbbGF5ZXIudHlwZV07XG4gICAgfVxuXG4gICAgX2NoZWNrTG9hZGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdHlsZSBpcyBub3QgZG9uZSBsb2FkaW5nJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBxdWV1ZWQgc3R5bGUgdXBkYXRlcyBpbiBhIGJhdGNoIGFuZCByZWNhbGN1bGF0ZSB6b29tLWRlcGVuZGVudCBwYWludCBwcm9wZXJ0aWVzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdXBkYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5fY2hhbmdlZDtcbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRJZHMgPSBPYmplY3Qua2V5cyh0aGlzLl91cGRhdGVkTGF5ZXJzKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRJZHMgPSBPYmplY3Qua2V5cyh0aGlzLl9yZW1vdmVkTGF5ZXJzKTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZWRJZHMubGVuZ3RoIHx8IHJlbW92ZWRJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlV29ya2VyTGF5ZXJzKHVwZGF0ZWRJZHMsIHJlbW92ZWRJZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl91cGRhdGVkU291cmNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2lkXTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoYWN0aW9uID09PSAncmVsb2FkJyB8fCBhY3Rpb24gPT09ICdjbGVhcicpO1xuICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdyZWxvYWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFNvdXJjZShpZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdjbGVhcicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJTb3VyY2UoaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGlsZXNGb3JDaGFuZ2VkSW1hZ2VzKCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdXBkYXRlZFBhaW50UHJvcHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXllcnNbaWRdLnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxpZ2h0LnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2cudXBkYXRlVHJhbnNpdGlvbnMocGFyYW1ldGVycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0VXBkYXRlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlc1VzZWRCZWZvcmUgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUlkIGluIHRoaXMuX3NvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLl9zb3VyY2VDYWNoZXNbc291cmNlSWRdO1xuICAgICAgICAgICAgc291cmNlc1VzZWRCZWZvcmVbc291cmNlSWRdID0gc291cmNlQ2FjaGUudXNlZDtcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlLnVzZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBvZiB0aGlzLl9vcmRlcikge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJZF07XG5cbiAgICAgICAgICAgIGxheWVyLnJlY2FsY3VsYXRlKHBhcmFtZXRlcnMsIHRoaXMuX2F2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICBpZiAoIWxheWVyLmlzSGlkZGVuKHBhcmFtZXRlcnMuem9vbSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuX2dldExheWVyU291cmNlQ2FjaGUobGF5ZXIpO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZSkgc291cmNlQ2FjaGUudXNlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhaW50ZXIgPSB0aGlzLm1hcC5wYWludGVyO1xuICAgICAgICAgICAgaWYgKHBhaW50ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9ncmFtSWRzID0gbGF5ZXIuZ2V0UHJvZ3JhbUlkcygpO1xuICAgICAgICAgICAgICAgIGlmICghcHJvZ3JhbUlkcykgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGxheWVyLmdldFByb2dyYW1Db25maWd1cmF0aW9uKHBhcmFtZXRlcnMuem9vbSk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb2dyYW1JZCBvZiBwcm9ncmFtSWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhaW50ZXIudXNlUHJvZ3JhbShwcm9ncmFtSWQsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUlkIGluIHNvdXJjZXNVc2VkQmVmb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuX3NvdXJjZUNhY2hlc1tzb3VyY2VJZF07XG4gICAgICAgICAgICBpZiAoc291cmNlc1VzZWRCZWZvcmVbc291cmNlSWRdICE9PSBzb3VyY2VDYWNoZS51c2VkKSB7XG4gICAgICAgICAgICAgICAgc291cmNlQ2FjaGUuZ2V0U291cmNlKCkuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7c291cmNlRGF0YVR5cGU6ICd2aXNpYmlsaXR5JywgZGF0YVR5cGU6J3NvdXJjZScsIHNvdXJjZUlkOiBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5pZH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlnaHQucmVjYWxjdWxhdGUocGFyYW1ldGVycyk7XG4gICAgICAgIGlmICh0aGlzLnRlcnJhaW4pIHtcbiAgICAgICAgICAgIHRoaXMudGVycmFpbi5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mb2cpIHtcbiAgICAgICAgICAgIHRoaXMuZm9nLnJlY2FsY3VsYXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMueiA9IHBhcmFtZXRlcnMuem9vbTtcblxuICAgICAgICBpZiAodGhpcy5fbWFya2Vyc05lZWRVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hcmtlcnNPcGFjaXR5KCk7XG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEFwcGx5IGFueSBxdWV1ZWQgaW1hZ2UgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBfdXBkYXRlVGlsZXNGb3JDaGFuZ2VkSW1hZ2VzKCkge1xuICAgICAgICBjb25zdCBjaGFuZ2VkSW1hZ2VzID0gT2JqZWN0LmtleXModGhpcy5fY2hhbmdlZEltYWdlcyk7XG4gICAgICAgIGlmIChjaGFuZ2VkSW1hZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIHRoaXMuX3NvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZUNhY2hlc1tuYW1lXS5yZWxvYWRUaWxlc0ZvckRlcGVuZGVuY2llcyhbJ2ljb25zJywgJ3BhdHRlcm5zJ10sIGNoYW5nZWRJbWFnZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlZEltYWdlcyA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZVdvcmtlckxheWVycyh1cGRhdGVkSWRzOiBBcnJheTxzdHJpbmc+LCByZW1vdmVkSWRzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ3VwZGF0ZUxheWVycycsIHtcbiAgICAgICAgICAgIGxheWVyczogdGhpcy5fc2VyaWFsaXplTGF5ZXJzKHVwZGF0ZWRJZHMpLFxuICAgICAgICAgICAgcmVtb3ZlZElkc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfcmVzZXRVcGRhdGVzKCkge1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlZExheWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9yZW1vdmVkTGF5ZXJzID0ge307XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlZFNvdXJjZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fdXBkYXRlZFBhaW50UHJvcHMgPSB7fTtcblxuICAgICAgICB0aGlzLl9jaGFuZ2VkSW1hZ2VzID0ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoaXMgc3R5bGUncyBzdGF0ZSB0byBtYXRjaCB0aGUgZ2l2ZW4gc3R5bGUgSlNPTiwgcGVyZm9ybWluZyBvbmx5XG4gICAgICogdGhlIG5lY2Vzc2FyeSBtdXRhdGlvbnMuXG4gICAgICpcbiAgICAgKiBNYXkgdGhyb3cgYW4gRXJyb3IgKCdVbmltcGxlbWVudGVkOiBNRVRIT0QnKSBpZiB0aGUgbWFwYm94LWdsLXN0eWxlLXNwZWNcbiAgICAgKiBkaWZmIGFsZ29yaXRobSBwcm9kdWNlcyBhbiBvcGVyYXRpb24gdGhhdCBpcyBub3Qgc3VwcG9ydGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYW55IGNoYW5nZXMgd2VyZSBtYWRlOyBmYWxzZSBvdGhlcndpc2VcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNldFN0YXRlKG5leHRTdGF0ZTogU3R5bGVTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgaWYgKGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlU3R5bGUobmV4dFN0YXRlKSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBuZXh0U3RhdGUgPSBjbG9uZShuZXh0U3RhdGUpO1xuICAgICAgICBuZXh0U3RhdGUubGF5ZXJzID0gZGVyZWYobmV4dFN0YXRlLmxheWVycyk7XG5cbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IGRpZmZTdHlsZXModGhpcy5zZXJpYWxpemUoKSwgbmV4dFN0YXRlKVxuICAgICAgICAgICAgLmZpbHRlcihvcCA9PiAhKG9wLmNvbW1hbmQgaW4gaWdub3JlZERpZmZPcGVyYXRpb25zKSk7XG5cbiAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bmltcGxlbWVudGVkT3BzID0gY2hhbmdlcy5maWx0ZXIob3AgPT4gIShvcC5jb21tYW5kIGluIHN1cHBvcnRlZERpZmZPcGVyYXRpb25zKSk7XG4gICAgICAgIGlmICh1bmltcGxlbWVudGVkT3BzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5pbXBsZW1lbnRlZDogJHt1bmltcGxlbWVudGVkT3BzLm1hcChvcCA9PiBvcC5jb21tYW5kKS5qb2luKCcsICcpfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoYW5nZXMuZm9yRWFjaCgob3ApID0+IHtcbiAgICAgICAgICAgIGlmIChvcC5jb21tYW5kID09PSAnc2V0VHJhbnNpdGlvbicpIHtcbiAgICAgICAgICAgICAgICAvLyBgdHJhbnNpdGlvbmAgaXMgYWx3YXlzIHJlYWQgZGlyZWN0bHkgb2ZmIG9mXG4gICAgICAgICAgICAgICAgLy8gYHRoaXMuc3R5bGVzaGVldGAsIHdoaWNoIHdlIHVwZGF0ZSBiZWxvd1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICh0aGlzOiBhbnkpW29wLmNvbW1hbmRdLmFwcGx5KHRoaXMsIG9wLmFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN0eWxlc2hlZXQgPSBuZXh0U3RhdGU7XG4gICAgICAgIHRoaXMudXBkYXRlUHJvamVjdGlvbigpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFkZEltYWdlKGlkOiBzdHJpbmcsIGltYWdlOiBTdHlsZUltYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLmdldEltYWdlKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoJ0FuIGltYWdlIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLicpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuYWRkSW1hZ2UoaWQsIGltYWdlKTtcbiAgICAgICAgdGhpcy5fYWZ0ZXJJbWFnZVVwZGF0ZWQoaWQpO1xuICAgIH1cblxuICAgIHVwZGF0ZUltYWdlKGlkOiBzdHJpbmcsIGltYWdlOiBTdHlsZUltYWdlKSB7XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLnVwZGF0ZUltYWdlKGlkLCBpbWFnZSk7XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2UoaWQ6IHN0cmluZyk6ID9TdHlsZUltYWdlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VNYW5hZ2VyLmdldEltYWdlKGlkKTtcbiAgICB9XG5cbiAgICByZW1vdmVJbWFnZShpZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5nZXRJbWFnZShpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdObyBpbWFnZSB3aXRoIHRoaXMgbmFtZSBleGlzdHMuJykpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5yZW1vdmVJbWFnZShpZCk7XG4gICAgICAgIHRoaXMuX2FmdGVySW1hZ2VVcGRhdGVkKGlkKTtcbiAgICB9XG5cbiAgICBfYWZ0ZXJJbWFnZVVwZGF0ZWQoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9hdmFpbGFibGVJbWFnZXMgPSB0aGlzLmltYWdlTWFuYWdlci5saXN0SW1hZ2VzKCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWRJbWFnZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ3NldEltYWdlcycsIHRoaXMuX2F2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KSk7XG4gICAgfVxuXG4gICAgbGlzdEltYWdlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F2YWlsYWJsZUltYWdlcy5zbGljZSgpO1xuICAgIH1cblxuICAgIGFkZFNvdXJjZShpZDogc3RyaW5nLCBzb3VyY2U6IFNvdXJjZVNwZWNpZmljYXRpb24sIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZ2V0U291cmNlKGlkKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIGFscmVhZHkgYSBzb3VyY2Ugd2l0aCB0aGlzIElEJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNvdXJjZS50eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB0eXBlIHByb3BlcnR5IG11c3QgYmUgZGVmaW5lZCwgYnV0IG9ubHkgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHdlcmUgZ2l2ZW46ICR7T2JqZWN0LmtleXMoc291cmNlKS5qb2luKCcsICcpfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1aWx0SW5zID0gWyd2ZWN0b3InLCAncmFzdGVyJywgJ2dlb2pzb24nLCAndmlkZW8nLCAnaW1hZ2UnXTtcbiAgICAgICAgY29uc3Qgc2hvdWxkVmFsaWRhdGUgPSBidWlsdElucy5pbmRleE9mKHNvdXJjZS50eXBlKSA+PSAwO1xuICAgICAgICBpZiAoc2hvdWxkVmFsaWRhdGUgJiYgdGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5zb3VyY2UsIGBzb3VyY2VzLiR7aWR9YCwgc291cmNlLCBudWxsLCBvcHRpb25zKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcCAmJiB0aGlzLm1hcC5fY29sbGVjdFJlc291cmNlVGltaW5nKSAoc291cmNlOiBhbnkpLmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9IHRydWU7XG5cbiAgICAgICAgY29uc3Qgc291cmNlSW5zdGFuY2UgPSBjcmVhdGVTb3VyY2UoaWQsIHNvdXJjZSwgdGhpcy5kaXNwYXRjaGVyLCB0aGlzKTtcblxuICAgICAgICBzb3VyY2VJbnN0YW5jZS5zZXRFdmVudGVkUGFyZW50KHRoaXMsICgpID0+ICh7XG4gICAgICAgICAgICBpc1NvdXJjZUxvYWRlZDogdGhpcy5sb2FkZWQoKSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlSW5zdGFuY2Uuc2VyaWFsaXplKCksXG4gICAgICAgICAgICBzb3VyY2VJZDogaWRcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnN0IGFkZFNvdXJjZUNhY2hlID0gKG9ubHlTeW1ib2xzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZUlkID0gKG9ubHlTeW1ib2xzID8gJ3N5bWJvbDonIDogJ290aGVyOicpICsgaWQ7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuX3NvdXJjZUNhY2hlc1tzb3VyY2VDYWNoZUlkXSA9IG5ldyBTb3VyY2VDYWNoZShzb3VyY2VDYWNoZUlkLCBzb3VyY2VJbnN0YW5jZSwgb25seVN5bWJvbHMpO1xuICAgICAgICAgICAgKG9ubHlTeW1ib2xzID8gdGhpcy5fc3ltYm9sU291cmNlQ2FjaGVzIDogdGhpcy5fb3RoZXJTb3VyY2VDYWNoZXMpW2lkXSA9IHNvdXJjZUNhY2hlO1xuICAgICAgICAgICAgc291cmNlQ2FjaGUuc3R5bGUgPSB0aGlzO1xuXG4gICAgICAgICAgICBzb3VyY2VDYWNoZS5vbkFkZCh0aGlzLm1hcCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgYWRkU291cmNlQ2FjaGUoZmFsc2UpO1xuICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09ICd2ZWN0b3InIHx8IHNvdXJjZS50eXBlID09PSAnZ2VvanNvbicpIHtcbiAgICAgICAgICAgIGFkZFNvdXJjZUNhY2hlKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNvdXJjZUluc3RhbmNlLm9uQWRkKSBzb3VyY2VJbnN0YW5jZS5vbkFkZCh0aGlzLm1hcCk7XG5cbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgc291cmNlIGZyb20gdGhpcyBzdHlsZXNoZWV0LCBnaXZlbiBpdHMgSUQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIG9mIHRoZSBzb3VyY2UgdG8gcmVtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBubyBzb3VyY2UgaXMgZm91bmQgd2l0aCB0aGUgZ2l2ZW4gSUQuXG4gICAgICogQHJldHVybnMge01hcH0gVGhlIHtAbGluayBNYXB9IG9iamVjdC5cbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2UoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKGlkKTtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGF5ZXJzW2xheWVySWRdLnNvdXJjZSA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgU291cmNlIFwiJHtpZH1cIiBjYW5ub3QgYmUgcmVtb3ZlZCB3aGlsZSBsYXllciBcIiR7bGF5ZXJJZH1cIiBpcyB1c2luZyBpdC5gKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRlcnJhaW4gJiYgdGhpcy50ZXJyYWluLmdldCgpLnNvdXJjZSA9PT0gaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBTb3VyY2UgXCIke2lkfVwiIGNhbm5vdCBiZSByZW1vdmVkIHdoaWxlIHRlcnJhaW4gaXMgdXNpbmcgaXQuYCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IHRoaXMuX2dldFNvdXJjZUNhY2hlcyhpZCk7XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlQ2FjaGUgb2Ygc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fc291cmNlQ2FjaGVzW3NvdXJjZUNhY2hlLmlkXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl91cGRhdGVkU291cmNlc1tzb3VyY2VDYWNoZS5pZF07XG4gICAgICAgICAgICBzb3VyY2VDYWNoZS5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJywgZGF0YVR5cGU6J3NvdXJjZScsIHNvdXJjZUlkOiBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5pZH0pKTtcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG4gICAgICAgICAgICBzb3VyY2VDYWNoZS5jbGVhclRpbGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMuX290aGVyU291cmNlQ2FjaGVzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N5bWJvbFNvdXJjZUNhY2hlc1tpZF07XG5cbiAgICAgICAgc291cmNlLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG4gICAgICAgIGlmIChzb3VyY2Uub25SZW1vdmUpIHtcbiAgICAgICAgICAgIHNvdXJjZS5vblJlbW92ZSh0aGlzLm1hcCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBTZXQgdGhlIGRhdGEgb2YgYSBHZW9KU09OIHNvdXJjZSwgZ2l2ZW4gaXRzIElELlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIG9mIHRoZSBzb3VyY2UuXG4gICAgKiBAcGFyYW0ge0dlb0pTT058c3RyaW5nfSBkYXRhIEdlb0pTT04gc291cmNlLlxuICAgICovXG4gICAgc2V0R2VvSlNPTlNvdXJjZURhdGEoaWQ6IHN0cmluZywgZGF0YTogR2VvSlNPTiB8IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGFzc2VydCh0aGlzLmdldFNvdXJjZShpZCkgIT09IHVuZGVmaW5lZCwgJ1RoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgY29uc3QgZ2VvanNvblNvdXJjZTogR2VvSlNPTlNvdXJjZSA9ICh0aGlzLmdldFNvdXJjZShpZCk6IGFueSk7XG4gICAgICAgIGFzc2VydChnZW9qc29uU291cmNlLnR5cGUgPT09ICdnZW9qc29uJyk7XG5cbiAgICAgICAgZ2VvanNvblNvdXJjZS5zZXREYXRhKGRhdGEpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzb3VyY2UgYnkgSUQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIG9mIHRoZSBkZXNpcmVkIHNvdXJjZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKi9cbiAgICBnZXRTb3VyY2UoaWQ6IHN0cmluZyk6IE9iamVjdCB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5fZ2V0U291cmNlQ2FjaGUoaWQpO1xuICAgICAgICByZXR1cm4gc291cmNlQ2FjaGUgJiYgc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgbGF5ZXIgdG8gdGhlIG1hcCBzdHlsZS4gVGhlIGxheWVyIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBsYXllciB3aXRoXG4gICAgICogSUQgYGJlZm9yZWAsIG9yIGFwcGVuZGVkIGlmIGBiZWZvcmVgIGlzIG9taXR0ZWQuXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBDdXN0b21MYXllckludGVyZmFjZX0gbGF5ZXJPYmplY3QgVGhlIHN0eWxlIGxheWVyIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZV0gSUQgb2YgYW4gZXhpc3RpbmcgbGF5ZXIgdG8gaW5zZXJ0IGJlZm9yZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBTdHlsZSBzZXR0ZXIgb3B0aW9ucy5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBUaGUge0BsaW5rIE1hcH0gb2JqZWN0LlxuICAgICAqL1xuICAgIGFkZExheWVyKGxheWVyT2JqZWN0OiBMYXllclNwZWNpZmljYXRpb24gfCBDdXN0b21MYXllckludGVyZmFjZSwgYmVmb3JlPzogc3RyaW5nLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGlkID0gbGF5ZXJPYmplY3QuaWQ7XG5cbiAgICAgICAgaWYgKHRoaXMuZ2V0TGF5ZXIoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBMYXllciB3aXRoIGlkIFwiJHtpZH1cIiBhbHJlYWR5IGV4aXN0cyBvbiB0aGlzIG1hcGApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGF5ZXI7XG4gICAgICAgIGlmIChsYXllck9iamVjdC50eXBlID09PSAnY3VzdG9tJykge1xuXG4gICAgICAgICAgICBpZiAoZW1pdFZhbGlkYXRpb25FcnJvcnModGhpcywgdmFsaWRhdGVDdXN0b21TdHlsZUxheWVyKGxheWVyT2JqZWN0KSkpIHJldHVybjtcblxuICAgICAgICAgICAgbGF5ZXIgPSBjcmVhdGVTdHlsZUxheWVyKGxheWVyT2JqZWN0KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBsYXllck9iamVjdC5zb3VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UoaWQsIGxheWVyT2JqZWN0LnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgbGF5ZXJPYmplY3QgPSBjbG9uZShsYXllck9iamVjdCk7XG4gICAgICAgICAgICAgICAgbGF5ZXJPYmplY3QgPSAoZXh0ZW5kKGxheWVyT2JqZWN0LCB7c291cmNlOiBpZH0pOiBhbnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGlzIGxheWVyIGlzIG5vdCBpbiB0aGUgc3R5bGUubGF5ZXJzIGFycmF5LCBzbyB3ZSBwYXNzIGFuIGltcG9zc2libGUgYXJyYXkgaW5kZXhcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmxheWVyLFxuICAgICAgICAgICAgICAgIGBsYXllcnMuJHtpZH1gLCBsYXllck9iamVjdCwge2FycmF5SW5kZXg6IC0xfSwgb3B0aW9ucykpIHJldHVybjtcblxuICAgICAgICAgICAgbGF5ZXIgPSBjcmVhdGVTdHlsZUxheWVyKGxheWVyT2JqZWN0KTtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlTGF5ZXIobGF5ZXIpO1xuXG4gICAgICAgICAgICBsYXllci5zZXRFdmVudGVkUGFyZW50KHRoaXMsIHtsYXllcjoge2lkfX0pO1xuICAgICAgICAgICAgdGhpcy5fc2VyaWFsaXplZExheWVyc1tsYXllci5pZF0gPSBsYXllci5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyQ291bnQobGF5ZXIsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBiZWZvcmUgPyB0aGlzLl9vcmRlci5pbmRleE9mKGJlZm9yZSkgOiB0aGlzLl9vcmRlci5sZW5ndGg7XG4gICAgICAgIGlmIChiZWZvcmUgJiYgaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBMYXllciB3aXRoIGlkIFwiJHtiZWZvcmV9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBtYXAuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShpbmRleCwgMCwgaWQpO1xuICAgICAgICB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJzW2lkXSA9IGxheWVyO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5fZ2V0TGF5ZXJTb3VyY2VDYWNoZShsYXllcik7XG4gICAgICAgIGlmICh0aGlzLl9yZW1vdmVkTGF5ZXJzW2lkXSAmJiBsYXllci5zb3VyY2UgJiYgc291cmNlQ2FjaGUgJiYgbGF5ZXIudHlwZSAhPT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICAgIC8vIElmLCBpbiB0aGUgY3VycmVudCBiYXRjaCwgd2UgaGF2ZSBhbHJlYWR5IHJlbW92ZWQgdGhpcyBsYXllclxuICAgICAgICAgICAgLy8gYW5kIHdlIGFyZSBub3cgcmUtYWRkaW5nIGl0IHdpdGggYSBkaWZmZXJlbnQgYHR5cGVgLCB0aGVuIHdlXG4gICAgICAgICAgICAvLyBuZWVkIHRvIGNsZWFyIChyYXRoZXIgdGhhbiBqdXN0IHJlbG9hZCkgdGhlIHVuZGVyeWxpbmcgc291cmNlJ3NcbiAgICAgICAgICAgIC8vIHRpbGVzLiAgT3RoZXJ3aXNlLCB0aWxlcyBtYXJrZWQgJ3JlbG9hZGluZycgd2lsbCBoYXZlIGJ1Y2tldHMgL1xuICAgICAgICAgICAgLy8gYnVmZmVycyB0aGF0IGFyZSBzZXQgdXAgZm9yIHRoZSBfcHJldmlvdXNfIHZlcnNpb24gb2YgdGhpc1xuICAgICAgICAgICAgLy8gbGF5ZXIsIGNhdXNpbmcsIGUuZy46XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzYzM1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuX3JlbW92ZWRMYXllcnNbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3JlbW92ZWRMYXllcnNbaWRdO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWQudHlwZSAhPT0gbGF5ZXIudHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gPSAnY2xlYXInO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVkU291cmNlc1tsYXllci5zb3VyY2VdID0gJ3JlbG9hZCc7XG4gICAgICAgICAgICAgICAgc291cmNlQ2FjaGUucGF1c2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG5cbiAgICAgICAgaWYgKGxheWVyLm9uQWRkKSB7XG4gICAgICAgICAgICBsYXllci5vbkFkZCh0aGlzLm1hcCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVEcmFwZUZpcnN0TGF5ZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSBsYXllciB0byBhIGRpZmZlcmVudCB6LXBvc2l0aW9uLiBUaGUgbGF5ZXIgd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIGxheWVyIHdpdGhcbiAgICAgKiBJRCBgYmVmb3JlYCwgb3IgYXBwZW5kZWQgaWYgYGJlZm9yZWAgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgIElEIG9mIHRoZSBsYXllciB0byBtb3ZlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlXSBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgYmVmb3JlLlxuICAgICAqL1xuICAgIG1vdmVMYXllcihpZDogc3RyaW5nLCBiZWZvcmU/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7aWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBtb3ZlZC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlkID09PSBiZWZvcmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb3JkZXIuaW5kZXhPZihpZCk7XG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBiZWZvcmUgPyB0aGlzLl9vcmRlci5pbmRleE9mKGJlZm9yZSkgOiB0aGlzLl9vcmRlci5sZW5ndGg7XG4gICAgICAgIGlmIChiZWZvcmUgJiYgbmV3SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBMYXllciB3aXRoIGlkIFwiJHtiZWZvcmV9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBtYXAuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vcmRlci5zcGxpY2UobmV3SW5kZXgsIDAsIGlkKTtcblxuICAgICAgICB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlRHJhcGVGaXJzdExheWVycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgbGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gaWQgZnJvbSB0aGUgc3R5bGUuXG4gICAgICpcbiAgICAgKiBJZiBubyBzdWNoIGxheWVyIGV4aXN0cywgYW4gYGVycm9yYCBldmVudCBpcyBmaXJlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBJRCBvZiB0aGUgbGF5ZXIgdG8gcmVtb3ZlLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6ZXJyb3JcbiAgICAgKi9cbiAgICByZW1vdmVMYXllcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7aWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSByZW1vdmVkLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsYXllci5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyQ291bnQobGF5ZXIsIGZhbHNlKTtcblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX29yZGVyLmluZGV4T2YoaWQpO1xuICAgICAgICB0aGlzLl9vcmRlci5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgIHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3JlbW92ZWRMYXllcnNbaWRdID0gbGF5ZXI7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5fc2VyaWFsaXplZExheWVyc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl91cGRhdGVkTGF5ZXJzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3VwZGF0ZWRQYWludFByb3BzW2lkXTtcblxuICAgICAgICBpZiAobGF5ZXIub25SZW1vdmUpIHtcbiAgICAgICAgICAgIGxheWVyLm9uUmVtb3ZlKHRoaXMubWFwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZURyYXBlRmlyc3RMYXllcnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHN0eWxlIGxheWVyIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBgaWRgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIG9mIHRoZSBkZXNpcmVkIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHs/T2JqZWN0fSBBIGxheWVyLCBpZiBvbmUgd2l0aCB0aGUgZ2l2ZW4gYGlkYCBleGlzdHMuXG4gICAgICovXG4gICAgZ2V0TGF5ZXIoaWQ6IHN0cmluZyk6IE9iamVjdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXllcnNbaWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIHNwZWNpZmljIGxheWVyIGlzIHByZXNlbnQgd2l0aGluIHRoZSBzdHlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBJRCBvZiB0aGUgZGVzaXJlZCBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBib29sZWFuIHNwZWNpZnlpbmcgaWYgdGhlIGdpdmVuIGxheWVyIGlzIHByZXNlbnQuXG4gICAgICovXG4gICAgaGFzTGF5ZXIoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaWQgaW4gdGhpcy5fbGF5ZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIHNwZWNpZmljIGxheWVyIHR5cGUgaXMgcHJlc2VudCB3aXRoaW4gdGhlIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZSBvZiB0aGUgZGVzaXJlZCBsYXllci5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBib29sZWFuIHNwZWNpZnlpbmcgaWYgdGhlIGdpdmVuIGxheWVyIHR5cGUgaXMgcHJlc2VudC5cbiAgICAgKi9cbiAgICBoYXNMYXllclR5cGUodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySWRdO1xuICAgICAgICAgICAgaWYgKGxheWVyLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0TGF5ZXJab29tUmFuZ2UobGF5ZXJJZDogc3RyaW5nLCBtaW56b29tOiA/bnVtYmVyLCBtYXh6b29tOiA/bnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGhhdmUgem9vbSBleHRlbnQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXllci5taW56b29tID09PSBtaW56b29tICYmIGxheWVyLm1heHpvb20gPT09IG1heHpvb20pIHJldHVybjtcblxuICAgICAgICBpZiAobWluem9vbSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsYXllci5taW56b29tID0gbWluem9vbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4em9vbSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsYXllci5tYXh6b29tID0gbWF4em9vbTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgfVxuXG4gICAgc2V0RmlsdGVyKGxheWVySWQ6IHN0cmluZywgZmlsdGVyOiA/RmlsdGVyU3BlY2lmaWNhdGlvbiwgIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIGZpbHRlcmVkLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVlcEVxdWFsKGxheWVyLmZpbHRlciwgZmlsdGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlciA9PT0gbnVsbCB8fCBmaWx0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF5ZXIuZmlsdGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXIobGF5ZXIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUuZmlsdGVyLCBgbGF5ZXJzLiR7bGF5ZXIuaWR9LmZpbHRlcmAsIGZpbHRlciwge2xheWVyVHlwZTogbGF5ZXIudHlwZX0sIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsYXllci5maWx0ZXIgPSBjbG9uZShmaWx0ZXIpO1xuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGF5ZXIncyBmaWx0ZXIgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBUaGUgbGF5ZXIgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIGxheWVyJ3MgZmlsdGVyLCBpZiBhbnkuXG4gICAgICovXG4gICAgZ2V0RmlsdGVyKGxheWVyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGNsb25lKHRoaXMuZ2V0TGF5ZXIobGF5ZXIpLmZpbHRlcik7XG4gICAgfVxuXG4gICAgc2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksICBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcklkKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGxheWVyICcke2xheWVySWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBzdHlsZWQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWVwRXF1YWwobGF5ZXIuZ2V0TGF5b3V0UHJvcGVydHkobmFtZSksIHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgICAgIGxheWVyLnNldExheW91dFByb3BlcnR5KG5hbWUsIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXIobGF5ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGxheW91dCBwcm9wZXJ0eSdzIHZhbHVlIGZyb20gYSBnaXZlbiBsYXllci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgbGF5ZXIgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbGF5b3V0IHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcHJvcGVydHkgdmFsdWUuXG4gICAgICovXG4gICAgZ2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxheWVyLmdldExheW91dFByb3BlcnR5KG5hbWUpO1xuICAgIH1cblxuICAgIHNldFBhaW50UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHN0eWxlZC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZXBFcXVhbChsYXllci5nZXRQYWludFByb3BlcnR5KG5hbWUpLCB2YWx1ZSkpIHJldHVybjtcblxuICAgICAgICBjb25zdCByZXF1aXJlc1JlbGF5b3V0ID0gbGF5ZXIuc2V0UGFpbnRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChyZXF1aXJlc1JlbGF5b3V0KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlZFBhaW50UHJvcHNbbGF5ZXJJZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIGdldFBhaW50UHJvcGVydHkobGF5ZXI6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExheWVyKGxheWVyKS5nZXRQYWludFByb3BlcnR5KG5hbWUpO1xuICAgIH1cblxuICAgIHNldEZlYXR1cmVTdGF0ZSh0YXJnZXQ6IHsgc291cmNlOiBzdHJpbmc7IHNvdXJjZUxheWVyPzogc3RyaW5nOyBpZDogc3RyaW5nIHwgbnVtYmVyOyB9LCBzdGF0ZTogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gdGFyZ2V0LnNvdXJjZTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB0YXJnZXQuc291cmNlTGF5ZXI7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKHNvdXJjZUlkKTtcblxuICAgICAgICBpZiAoc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBzb3VyY2UgJyR7c291cmNlSWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlLnR5cGU7XG4gICAgICAgIGlmIChzb3VyY2VUeXBlID09PSAnZ2VvanNvbicgJiYgc291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYEdlb0pTT04gc291cmNlcyBjYW5ub3QgaGF2ZSBhIHNvdXJjZUxheWVyIHBhcmFtZXRlci5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VUeXBlID09PSAndmVjdG9yJyAmJiAhc291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBzb3VyY2VMYXllciBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZCBmb3IgdmVjdG9yIHNvdXJjZSB0eXBlcy5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0YXJnZXQuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGZlYXR1cmUgaWQgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQuYCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IHRoaXMuX2dldFNvdXJjZUNhY2hlcyhzb3VyY2VJZCk7XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlQ2FjaGUgb2Ygc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBzb3VyY2VDYWNoZS5zZXRGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXIsIHRhcmdldC5pZCwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlRmVhdHVyZVN0YXRlKHRhcmdldDogeyBzb3VyY2U6IHN0cmluZzsgc291cmNlTGF5ZXI/OiBzdHJpbmc7IGlkPzogc3RyaW5nIHwgbnVtYmVyOyB9LCBrZXk/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcbiAgICAgICAgY29uc3Qgc291cmNlSWQgPSB0YXJnZXQuc291cmNlO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmdldFNvdXJjZShzb3VyY2VJZCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgc291cmNlICcke3NvdXJjZUlkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlLnR5cGU7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyID0gc291cmNlVHlwZSA9PT0gJ3ZlY3RvcicgPyB0YXJnZXQuc291cmNlTGF5ZXIgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmICFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZUxheWVyIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkIGZvciB2ZWN0b3Igc291cmNlIHR5cGVzLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ICYmICh0eXBlb2YgdGFyZ2V0LmlkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdGFyZ2V0LmlkICE9PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYEEgZmVhdHVyZSBpZCBpcyByZXF1aXJlZCB0byByZW1vdmUgaXRzIHNwZWNpZmljIHN0YXRlIHByb3BlcnR5LmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLl9nZXRTb3VyY2VDYWNoZXMoc291cmNlSWQpO1xuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUNhY2hlIG9mIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgc291cmNlQ2FjaGUucmVtb3ZlRmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyLCB0YXJnZXQuaWQsIGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRGZWF0dXJlU3RhdGUodGFyZ2V0OiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ6IHN0cmluZyB8IG51bWJlcjsgfSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IHRhcmdldC5zb3VyY2U7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyID0gdGFyZ2V0LnNvdXJjZUxheWVyO1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmdldFNvdXJjZShzb3VyY2VJZCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgc291cmNlICcke3NvdXJjZUlkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlVHlwZSA9IHNvdXJjZS50eXBlO1xuICAgICAgICBpZiAoc291cmNlVHlwZSA9PT0gJ3ZlY3RvcicgJiYgIXNvdXJjZUxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgc291cmNlTGF5ZXIgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgZm9yIHZlY3RvciBzb3VyY2UgdHlwZXMuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0LmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBmZWF0dXJlIGlkIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkLmApKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLl9nZXRTb3VyY2VDYWNoZXMoc291cmNlSWQpO1xuICAgICAgICByZXR1cm4gc291cmNlQ2FjaGVzWzBdLmdldEZlYXR1cmVTdGF0ZShzb3VyY2VMYXllciwgdGFyZ2V0LmlkKTtcbiAgICB9XG5cbiAgICBnZXRUcmFuc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHtkdXJhdGlvbjogMzAwLCBkZWxheTogMH0sIHRoaXMuc3R5bGVzaGVldCAmJiB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbik7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBjb25zdCBzb3VyY2VzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgY2FjaGVJZCBpbiB0aGlzLl9zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuX3NvdXJjZUNhY2hlc1tjYWNoZUlkXS5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgIGlmICghc291cmNlc1tzb3VyY2UuaWRdKSB7XG4gICAgICAgICAgICAgICAgc291cmNlc1tzb3VyY2UuaWRdID0gc291cmNlLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJPYmplY3Qoe1xuICAgICAgICAgICAgdmVyc2lvbjogdGhpcy5zdHlsZXNoZWV0LnZlcnNpb24sXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnN0eWxlc2hlZXQubmFtZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLnN0eWxlc2hlZXQubWV0YWRhdGEsXG4gICAgICAgICAgICBsaWdodDogdGhpcy5zdHlsZXNoZWV0LmxpZ2h0LFxuICAgICAgICAgICAgdGVycmFpbjogdGhpcy5zdHlsZXNoZWV0LnRlcnJhaW4sXG4gICAgICAgICAgICBmb2c6IHRoaXMuc3R5bGVzaGVldC5mb2csXG4gICAgICAgICAgICBjZW50ZXI6IHRoaXMuc3R5bGVzaGVldC5jZW50ZXIsXG4gICAgICAgICAgICB6b29tOiB0aGlzLnN0eWxlc2hlZXQuem9vbSxcbiAgICAgICAgICAgIGJlYXJpbmc6IHRoaXMuc3R5bGVzaGVldC5iZWFyaW5nLFxuICAgICAgICAgICAgcGl0Y2g6IHRoaXMuc3R5bGVzaGVldC5waXRjaCxcbiAgICAgICAgICAgIHNwcml0ZTogdGhpcy5zdHlsZXNoZWV0LnNwcml0ZSxcbiAgICAgICAgICAgIGdseXBoczogdGhpcy5zdHlsZXNoZWV0LmdseXBocyxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMuc3R5bGVzaGVldC50cmFuc2l0aW9uLFxuICAgICAgICAgICAgcHJvamVjdGlvbjogdGhpcy5zdHlsZXNoZWV0LnByb2plY3Rpb24sXG4gICAgICAgICAgICBzb3VyY2VzLFxuICAgICAgICAgICAgbGF5ZXJzOiB0aGlzLl9zZXJpYWxpemVMYXllcnModGhpcy5fb3JkZXIpXG4gICAgICAgIH0sICh2YWx1ZSkgPT4geyByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZDsgfSk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUxheWVyKGxheWVyOiBTdHlsZUxheWVyKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZWRMYXllcnNbbGF5ZXIuaWRdID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLl9nZXRMYXllclNvdXJjZUNhY2hlKGxheWVyKTtcbiAgICAgICAgaWYgKGxheWVyLnNvdXJjZSAmJiAhdGhpcy5fdXBkYXRlZFNvdXJjZXNbbGF5ZXIuc291cmNlXSAmJlxuICAgICAgICAgICAgLy9Ta2lwIGZvciByYXN0ZXIgbGF5ZXJzIChodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNzg2NSlcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlICYmXG4gICAgICAgICAgICBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS50eXBlICE9PSAncmFzdGVyJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9ICdyZWxvYWQnO1xuICAgICAgICAgICAgc291cmNlQ2FjaGUucGF1c2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgbGF5ZXIuaW52YWxpZGF0ZUNvbXBpbGVkRmlsdGVyKCk7XG5cbiAgICB9XG5cbiAgICBfZmxhdHRlbkFuZFNvcnRSZW5kZXJlZEZlYXR1cmVzKHNvdXJjZVJlc3VsdHM6IEFycmF5PGFueT4pIHtcbiAgICAgICAgLy8gRmVhdHVyZSBvcmRlciBpcyBjb21wbGljYXRlZC5cbiAgICAgICAgLy8gVGhlIG9yZGVyIGJldHdlZW4gZmVhdHVyZXMgaW4gdHdvIDJEIGxheWVycyBpcyBhbHdheXMgZGV0ZXJtaW5lZCBieSBsYXllciBvcmRlci5cbiAgICAgICAgLy8gVGhlIG9yZGVyIGJldHdlZW4gZmVhdHVyZXMgaW4gdHdvIDNEIGxheWVycyBpcyBhbHdheXMgZGV0ZXJtaW5lZCBieSBkZXB0aC5cbiAgICAgICAgLy8gVGhlIG9yZGVyIGJldHdlZW4gYSBmZWF0dXJlIGluIGEgMkQgbGF5ZXIgYW5kIGEgM0QgbGF5ZXIgaXMgdHJpY2t5OlxuICAgICAgICAvLyAgICAgIE1vc3Qgb2Z0ZW4gbGF5ZXIgb3JkZXIgZGV0ZXJtaW5lcyB0aGUgZmVhdHVyZSBvcmRlciBpbiB0aGlzIGNhc2UuIElmXG4gICAgICAgIC8vICAgICAgYSBsaW5lIGxheWVyIGlzIGFib3ZlIGEgZXh0cnVzaW9uIGxheWVyIHRoZSBsaW5lIGZlYXR1cmUgd2lsbCBiZSByZW5kZXJlZFxuICAgICAgICAvLyAgICAgIGFib3ZlIHRoZSBleHRydXNpb24uIElmIHRoZSBsaW5lIGxheWVyIGlzIGJlbG93IHRoZSBleHRydXNpb24gbGF5ZXIsXG4gICAgICAgIC8vICAgICAgaXQgd2lsbCBiZSByZW5kZXJlZCBiZWxvdyBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBUaGVyZSBpcyBhIHdlaXJkIGNhc2UgdGhvdWdoLlxuICAgICAgICAvLyAgICAgIFlvdSBoYXZlIGxheWVycyBpbiB0aGlzIG9yZGVyOiBleHRydXNpb25fbGF5ZXJfYSwgbGluZV9sYXllciwgZXh0cnVzaW9uX2xheWVyX2JcbiAgICAgICAgLy8gICAgICBFYWNoIGxheWVyIGhhcyBhIGZlYXR1cmUgdGhhdCBvdmVybGFwcyB0aGUgb3RoZXIgZmVhdHVyZXMuXG4gICAgICAgIC8vICAgICAgVGhlIGZlYXR1cmUgaW4gZXh0cnVzaW9uX2xheWVyX2EgaXMgY2xvc2VyIHRoYW4gdGhlIGZlYXR1cmUgaW4gZXh0cnVzaW9uX2xheWVyX2Igc28gaXQgaXMgcmVuZGVyZWQgYWJvdmUuXG4gICAgICAgIC8vICAgICAgVGhlIGZlYXR1cmUgaW4gbGluZV9sYXllciBpcyByZW5kZXJlZCBhYm92ZSBleHRydXNpb25fbGF5ZXJfYS5cbiAgICAgICAgLy8gICAgICBUaGlzIG1lYW5zIHRoYXQgdGhhdCB0aGUgbGluZV9sYXllciBmZWF0dXJlIGlzIGFib3ZlIHRoZSBleHRydXNpb25fbGF5ZXJfYiBmZWF0dXJlIGRlc3BpdGVcbiAgICAgICAgLy8gICAgICBpdCBiZWluZyBpbiBhbiBlYXJsaWVyIGxheWVyLlxuXG4gICAgICAgIGNvbnN0IGlzTGF5ZXIzRCA9IGxheWVySWQgPT4gdGhpcy5fbGF5ZXJzW2xheWVySWRdLnR5cGUgPT09ICdmaWxsLWV4dHJ1c2lvbic7XG5cbiAgICAgICAgY29uc3QgbGF5ZXJJbmRleCA9IHt9O1xuICAgICAgICBjb25zdCBmZWF0dXJlczNEID0gW107XG4gICAgICAgIGZvciAobGV0IGwgPSB0aGlzLl9vcmRlci5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHRoaXMuX29yZGVyW2xdO1xuICAgICAgICAgICAgaWYgKGlzTGF5ZXIzRChsYXllcklkKSkge1xuICAgICAgICAgICAgICAgIGxheWVySW5kZXhbbGF5ZXJJZF0gPSBsO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlUmVzdWx0IG9mIHNvdXJjZVJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF5ZXJGZWF0dXJlcyA9IHNvdXJjZVJlc3VsdFtsYXllcklkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxheWVyRmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmVhdHVyZVdyYXBwZXIgb2YgbGF5ZXJGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzM0QucHVzaChmZWF0dXJlV3JhcHBlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmZWF0dXJlczNELnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBiLmludGVyc2VjdGlvblogLSBhLmludGVyc2VjdGlvblo7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gW107XG4gICAgICAgIGZvciAobGV0IGwgPSB0aGlzLl9vcmRlci5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHRoaXMuX29yZGVyW2xdO1xuXG4gICAgICAgICAgICBpZiAoaXNMYXllcjNEKGxheWVySWQpKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGFsbCAzRCBmZWF0dXJlcyB0aGF0IGFyZSBpbiBvciBhYm92ZSB0aGUgY3VycmVudCBsYXllclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBmZWF0dXJlczNELmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcG1vc3QzRCA9IGZlYXR1cmVzM0RbaV0uZmVhdHVyZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxheWVySW5kZXhbdG9wbW9zdDNELmxheWVyLmlkXSA8IGwpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcy5wdXNoKHRvcG1vc3QzRCk7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzM0QucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZVJlc3VsdCBvZiBzb3VyY2VSZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyRmVhdHVyZXMgPSBzb3VyY2VSZXN1bHRbbGF5ZXJJZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXllckZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmVXcmFwcGVyIG9mIGxheWVyRmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcy5wdXNoKGZlYXR1cmVXcmFwcGVyLmZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzO1xuICAgIH1cblxuICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhxdWVyeUdlb21ldHJ5OiBQb2ludExpa2UgfCBbUG9pbnRMaWtlLCBQb2ludExpa2VdLCBwYXJhbXM6IGFueSwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMuZmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmZpbHRlciwgJ3F1ZXJ5UmVuZGVyZWRGZWF0dXJlcy5maWx0ZXInLCBwYXJhbXMuZmlsdGVyLCBudWxsLCBwYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5jbHVkZWRTb3VyY2VzID0ge307XG4gICAgICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLmxheWVycykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5sYXllcnMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcigncGFyYW1ldGVycy5sYXllcnMgbXVzdCBiZSBhbiBBcnJheS4nKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBvZiBwYXJhbXMubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJZF07XG4gICAgICAgICAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGxheWVyIGlzIG5vdCBpbiB0aGUgc3R5bGUubGF5ZXJzIGFycmF5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBsYXllciAnJHtsYXllcklkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgcXVlcmllZCBmb3IgZmVhdHVyZXMuYCkpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmNsdWRlZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VSZXN1bHRzID0gW107XG5cbiAgICAgICAgcGFyYW1zLmF2YWlsYWJsZUltYWdlcyA9IHRoaXMuX2F2YWlsYWJsZUltYWdlcztcblxuICAgICAgICBjb25zdCBoYXMzRExheWVyID0gKHBhcmFtcyAmJiBwYXJhbXMubGF5ZXJzKSA/XG4gICAgICAgICAgICBwYXJhbXMubGF5ZXJzLnNvbWUoKGxheWVySWQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxheWVyICYmIGxheWVyLmlzM0QoKTtcbiAgICAgICAgICAgIH0pIDpcbiAgICAgICAgICAgIHRoaXMuaGFzM0RMYXllcnMoKTtcbiAgICAgICAgY29uc3QgcXVlcnlHZW9tZXRyeVN0cnVjdCA9IFF1ZXJ5R2VvbWV0cnkuY3JlYXRlRnJvbVNjcmVlblBvaW50cyhxdWVyeUdlb21ldHJ5LCB0cmFuc2Zvcm0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VJZCA9IHRoaXMuX3NvdXJjZUNhY2hlc1tpZF0uZ2V0U291cmNlKCkuaWQ7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmxheWVycyAmJiAhaW5jbHVkZWRTb3VyY2VzW3NvdXJjZUlkXSkgY29udGludWU7XG4gICAgICAgICAgICBzb3VyY2VSZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAgICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VDYWNoZXNbaWRdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXllcnMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlcmlhbGl6ZWRMYXllcnMsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnlTdHJ1Y3QsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICBoYXMzRExheWVyLFxuICAgICAgICAgICAgICAgICAgICAhIXRoaXMubWFwLl9zaG93UXVlcnlHZW9tZXRyeSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIElmIGEgcGxhY2VtZW50IGhhcyBydW4sIHF1ZXJ5IGFnYWluc3QgaXRzIENvbGxpc2lvbkluZGV4XG4gICAgICAgICAgICAvLyBmb3Igc3ltYm9sIHJlc3VsdHMsIGFuZCB0cmVhdCBpdCBhcyBhbiBleHRyYSBzb3VyY2UgdG8gbWVyZ2VcbiAgICAgICAgICAgIHNvdXJjZVJlc3VsdHMucHVzaChcbiAgICAgICAgICAgICAgICBxdWVyeVJlbmRlcmVkU3ltYm9scyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXRMYXllclNvdXJjZUNhY2hlLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnlTdHJ1Y3Quc2NyZWVuR2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQuY29sbGlzaW9uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50LnJldGFpbmVkUXVlcnlEYXRhKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9mbGF0dGVuQW5kU29ydFJlbmRlcmVkRmVhdHVyZXMoc291cmNlUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgcXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VJRDogc3RyaW5nLCBwYXJhbXM6ID97c291cmNlTGF5ZXI6ID9zdHJpbmcsIGZpbHRlcjogP0FycmF5PGFueT4sIHZhbGlkYXRlPzogYm9vbGVhbn0pIHtcbiAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMuZmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmZpbHRlciwgJ3F1ZXJ5U291cmNlRmVhdHVyZXMuZmlsdGVyJywgcGFyYW1zLmZpbHRlciwgbnVsbCwgcGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLl9nZXRTb3VyY2VDYWNoZXMoc291cmNlSUQpO1xuICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUNhY2hlIG9mIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KHF1ZXJ5U291cmNlRmVhdHVyZXMoc291cmNlQ2FjaGUsIHBhcmFtcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGFkZFNvdXJjZVR5cGUobmFtZTogc3RyaW5nLCBTb3VyY2VUeXBlOiBTb3VyY2VDbGFzcywgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIGlmIChTdHlsZS5nZXRTb3VyY2VUeXBlKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBBIHNvdXJjZSB0eXBlIGNhbGxlZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0cy5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBTdHlsZS5zZXRTb3VyY2VUeXBlKG5hbWUsIFNvdXJjZVR5cGUpO1xuXG4gICAgICAgIGlmICghU291cmNlVHlwZS53b3JrZXJTb3VyY2VVUkwpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ2xvYWRXb3JrZXJTb3VyY2UnLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdXJsOiBTb3VyY2VUeXBlLndvcmtlclNvdXJjZVVSTFxuICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZ2V0TGlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZ2h0LmdldExpZ2h0KCk7XG4gICAgfVxuXG4gICAgc2V0TGlnaHQobGlnaHRPcHRpb25zOiBMaWdodFNwZWNpZmljYXRpb24sIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGlnaHQgPSB0aGlzLmxpZ2h0LmdldExpZ2h0KCk7XG4gICAgICAgIGxldCBfdXBkYXRlID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGxpZ2h0T3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwobGlnaHRPcHRpb25zW2tleV0sIGxpZ2h0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfdXBkYXRlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgICAgICAgIG5vdzogYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGV4dGVuZCh7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgICAgICBkZWxheTogMFxuICAgICAgICAgICAgfSwgdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24pXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5saWdodC5zZXRMaWdodChsaWdodE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmxpZ2h0LnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIGdldFRlcnJhaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlcnJhaW4gJiYgdGhpcy50ZXJyYWluLmRyYXBlUmVuZGVyTW9kZSA9PT0gRHJhcGVSZW5kZXJNb2RlLmVsZXZhdGVkID8gdGhpcy50ZXJyYWluLmdldCgpIDogbnVsbDtcbiAgICB9XG5cbiAgICBzZXRUZXJyYWluRm9yRHJhcGluZygpIHtcbiAgICAgICAgY29uc3QgbW9ja1RlcnJhaW5PcHRpb25zID0ge3NvdXJjZTogJycsIGV4YWdnZXJhdGlvbjogMH07XG4gICAgICAgIHRoaXMuc2V0VGVycmFpbihtb2NrVGVycmFpbk9wdGlvbnMsIERyYXBlUmVuZGVyTW9kZS5kZWZlcnJlZCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXdhcm5pbmctY29tbWVudHNcbiAgICAvLyBUT0RPOiBnZW5lcmljIGFwcHJvYWNoIGZvciByb290IGxldmVsIHByb3BlcnR5OiBsaWdodCwgdGVycmFpbiwgc2t5Ym94LlxuICAgIC8vIEl0IGlzIG5vdCBkb25lIGhlcmUgdG8gcHJldmVudCByZWJhc2luZyBpc3N1ZXMuXG4gICAgc2V0VGVycmFpbih0ZXJyYWluT3B0aW9uczogP1RlcnJhaW5TcGVjaWZpY2F0aW9uLCBkcmFwZVJlbmRlck1vZGU6IG51bWJlciA9IERyYXBlUmVuZGVyTW9kZS5lbGV2YXRlZCkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIC8vIERpc2FibGluZ1xuICAgICAgICBpZiAoIXRlcnJhaW5PcHRpb25zKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy50ZXJyYWluO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzaGVldC50ZXJyYWluO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnZW5hYmxlVGVycmFpbicsIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvcmNlM0RMYXllclVwZGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5fbWFya2Vyc05lZWRVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRyYXBlUmVuZGVyTW9kZSA9PT0gRHJhcGVSZW5kZXJNb2RlLmVsZXZhdGVkKSB7XG4gICAgICAgICAgICAvLyBJbnB1dCB2YWxpZGF0aW9uIGFuZCBzb3VyY2Ugb2JqZWN0IHVucm9sbGluZ1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXJyYWluT3B0aW9ucy5zb3VyY2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSAndGVycmFpbi1kZW0tc3JjJztcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNvdXJjZShpZCwgKCh0ZXJyYWluT3B0aW9ucy5zb3VyY2UpOiBhbnkpKTtcbiAgICAgICAgICAgICAgICB0ZXJyYWluT3B0aW9ucyA9IGNsb25lKHRlcnJhaW5PcHRpb25zKTtcbiAgICAgICAgICAgICAgICB0ZXJyYWluT3B0aW9ucyA9IChleHRlbmQodGVycmFpbk9wdGlvbnMsIHtzb3VyY2U6IGlkfSk6IGFueSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLnRlcnJhaW4sICd0ZXJyYWluJywgdGVycmFpbk9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5hYmxpbmdcbiAgICAgICAgaWYgKCF0aGlzLnRlcnJhaW4gfHwgKHRoaXMudGVycmFpbiAmJiBkcmFwZVJlbmRlck1vZGUgIT09IHRoaXMudGVycmFpbi5kcmFwZVJlbmRlck1vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVUZXJyYWluKHRlcnJhaW5PcHRpb25zLCBkcmFwZVJlbmRlck1vZGUpO1xuICAgICAgICB9IGVsc2UgeyAvLyBVcGRhdGluZ1xuICAgICAgICAgICAgY29uc3QgdGVycmFpbiA9IHRoaXMudGVycmFpbjtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJTcGVjID0gdGVycmFpbi5nZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRlcnJhaW5PcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwodGVycmFpbk9wdGlvbnNba2V5XSwgY3VyclNwZWNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVycmFpbi5zZXQodGVycmFpbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0eWxlc2hlZXQudGVycmFpbiA9IHRlcnJhaW5PcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm93OiBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogZXh0ZW5kKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24pXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdGVycmFpbi51cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlRHJhcGVGaXJzdExheWVycygpO1xuICAgICAgICB0aGlzLl9tYXJrZXJzTmVlZFVwZGF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUZvZyhmb2dPcHRpb25zOiBGb2dTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGZvZyA9IHRoaXMuZm9nID0gbmV3IEZvZyhmb2dPcHRpb25zLCB0aGlzLm1hcC50cmFuc2Zvcm0pO1xuICAgICAgICB0aGlzLnN0eWxlc2hlZXQuZm9nID0gZm9nT3B0aW9ucztcbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgICAgICAgIG5vdzogYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGV4dGVuZCh7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDBcbiAgICAgICAgICAgIH0sIHRoaXMuc3R5bGVzaGVldC50cmFuc2l0aW9uKVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvZy51cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlTWFya2Vyc09wYWNpdHkoKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcC5fbWFya2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcC5fcmVxdWVzdERvbVRhc2soKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBtYXJrZXIgb2YgdGhpcy5tYXAuX21hcmtlcnMpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIuX2V2YWx1YXRlT3BhY2l0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRGb2coKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvZyA/IHRoaXMuZm9nLmdldCgpIDogbnVsbDtcbiAgICB9XG5cbiAgICBzZXRGb2coZm9nT3B0aW9uczogRm9nU3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGlmICghZm9nT3B0aW9ucykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGZvZ1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZm9nO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzaGVldC5mb2c7XG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJzTmVlZFVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZm9nKSB7XG4gICAgICAgICAgICAvLyBJbml0aWFsaXplIEZvZ1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlRm9nKGZvZ09wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXBkYXRpbmcgZm9nXG4gICAgICAgICAgICBjb25zdCBmb2cgPSB0aGlzLmZvZztcbiAgICAgICAgICAgIGNvbnN0IGN1cnJTcGVjID0gZm9nLmdldCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZm9nT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKGZvZ09wdGlvbnNba2V5XSwgY3VyclNwZWNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9nLnNldChmb2dPcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNoZWV0LmZvZyA9IGZvZ09wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3c6IGJyb3dzZXIubm93KCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBleHRlbmQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBmb2cudXBkYXRlVHJhbnNpdGlvbnMocGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21hcmtlcnNOZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfdXBkYXRlRHJhcGVGaXJzdExheWVycygpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1hcC5fb3B0aW1pemVGb3JUZXJyYWluIHx8ICF0aGlzLnRlcnJhaW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRyYXBlZCA9IHRoaXMuX29yZGVyLmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzTGF5ZXJEcmFwZWQodGhpcy5fbGF5ZXJzW2lkXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG5vbkRyYXBlZCA9IHRoaXMuX29yZGVyLmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5pc0xheWVyRHJhcGVkKHRoaXMuX2xheWVyc1tpZF0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZHJhcGVkRmlyc3RPcmRlciA9IFtdO1xuICAgICAgICB0aGlzLl9kcmFwZWRGaXJzdE9yZGVyLnB1c2goLi4uZHJhcGVkKTtcbiAgICAgICAgdGhpcy5fZHJhcGVkRmlyc3RPcmRlci5wdXNoKC4uLm5vbkRyYXBlZCk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVRlcnJhaW4odGVycmFpbk9wdGlvbnM6IFRlcnJhaW5TcGVjaWZpY2F0aW9uLCBkcmFwZVJlbmRlck1vZGU6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0ZXJyYWluID0gdGhpcy50ZXJyYWluID0gbmV3IFRlcnJhaW4odGVycmFpbk9wdGlvbnMsIGRyYXBlUmVuZGVyTW9kZSk7XG4gICAgICAgIHRoaXMuc3R5bGVzaGVldC50ZXJyYWluID0gdGVycmFpbk9wdGlvbnM7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ2VuYWJsZVRlcnJhaW4nLCB0cnVlKTtcbiAgICAgICAgdGhpcy5fZm9yY2UzRExheWVyVXBkYXRlKCk7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICBub3c6IGJyb3dzZXIubm93KCksXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBleHRlbmQoe1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwXG4gICAgICAgICAgICB9LCB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbilcbiAgICAgICAgfTtcblxuICAgICAgICB0ZXJyYWluLnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIF9mb3JjZTNETGF5ZXJVcGRhdGUoKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySWRdO1xuICAgICAgICAgICAgaWYgKGxheWVyLnR5cGUgPT09ICdmaWxsLWV4dHJ1c2lvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZm9yY2VTeW1ib2xMYXllclVwZGF0ZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJZF07XG4gICAgICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdmFsaWRhdGUodmFsaWRhdGU6IFZhbGlkYXRvciwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIHByb3BzOiBhbnksIG9wdGlvbnM6IHsgdmFsaWRhdGU/OiBib29sZWFuIH0gPSB7fSkge1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnZhbGlkYXRlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbWl0VmFsaWRhdGlvbkVycm9ycyh0aGlzLCB2YWxpZGF0ZS5jYWxsKHZhbGlkYXRlU3R5bGUsIGV4dGVuZCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBzdHlsZTogdGhpcy5zZXJpYWxpemUoKSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0sIHByb3BzKSkpO1xuICAgIH1cblxuICAgIF9yZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0KSB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3Nwcml0ZVJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICB0aGlzLl9zcHJpdGVSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBydGxUZXh0UGx1Z2luRXZlbnRlZC5vZmYoJ3BsdWdpblN0YXRlQ2hhbmdlJywgdGhpcy5fcnRsVGV4dFBsdWdpbkNhbGxiYWNrKTtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXI6IFN0eWxlTGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJZF07XG4gICAgICAgICAgICBsYXllci5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VDYWNoZXNbaWRdLmNsZWFyVGlsZXMoKTtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZUNhY2hlc1tpZF0uc2V0RXZlbnRlZFBhcmVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBfY2xlYXJTb3VyY2UoaWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLl9nZXRTb3VyY2VDYWNoZXMoaWQpO1xuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUNhY2hlIG9mIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgc291cmNlQ2FjaGUuY2xlYXJUaWxlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3JlbG9hZFNvdXJjZShpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IHRoaXMuX2dldFNvdXJjZUNhY2hlcyhpZCk7XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlQ2FjaGUgb2Ygc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBzb3VyY2VDYWNoZS5yZXN1bWUoKTtcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlLnJlbG9hZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZVNvdXJjZXModHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZUNhY2hlc1tpZF0udXBkYXRlKHRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZ2VuZXJhdGVDb2xsaXNpb25Cb3hlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5fc291cmNlQ2FjaGVzW2lkXTtcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlLnJlc3VtZSgpO1xuICAgICAgICAgICAgc291cmNlQ2FjaGUucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlUGxhY2VtZW50KHRyYW5zZm9ybTogVHJhbnNmb3JtLCBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW4sIGZhZGVEdXJhdGlvbjogbnVtYmVyLCBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IGJvb2xlYW4sIGZvcmNlRnVsbFBsYWNlbWVudDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBzeW1ib2xCdWNrZXRzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgcGxhY2VtZW50Q29tbWl0dGVkID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbGF5ZXJUaWxlcyA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBvZiB0aGlzLl9vcmRlcikge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVMYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklEXTtcbiAgICAgICAgICAgIGlmIChzdHlsZUxheWVyLnR5cGUgIT09ICdzeW1ib2wnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgaWYgKCFsYXllclRpbGVzW3N0eWxlTGF5ZXIuc291cmNlXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5fZ2V0TGF5ZXJTb3VyY2VDYWNoZShzdHlsZUxheWVyKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZUNhY2hlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsYXllclRpbGVzW3N0eWxlTGF5ZXIuc291cmNlXSA9IHNvdXJjZUNhY2hlLmdldFJlbmRlcmFibGVJZHModHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoaWQpID0+IHNvdXJjZUNhY2hlLmdldFRpbGVCeUlEKGlkKSlcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IChiLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGEudGlsZUlELm92ZXJzY2FsZWRaKSB8fCAoYS50aWxlSUQuaXNMZXNzVGhhbihiLnRpbGVJRCkgPyAtMSA6IDEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGF5ZXJCdWNrZXRzQ2hhbmdlZCA9IHRoaXMuY3Jvc3NUaWxlU3ltYm9sSW5kZXguYWRkTGF5ZXIoc3R5bGVMYXllciwgbGF5ZXJUaWxlc1tzdHlsZUxheWVyLnNvdXJjZV0sIHRyYW5zZm9ybS5jZW50ZXIubG5nLCB0cmFuc2Zvcm0ucHJvamVjdGlvbik7XG4gICAgICAgICAgICBzeW1ib2xCdWNrZXRzQ2hhbmdlZCA9IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkIHx8IGxheWVyQnVja2V0c0NoYW5nZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcm9zc1RpbGVTeW1ib2xJbmRleC5wcnVuZVVudXNlZExheWVycyh0aGlzLl9vcmRlcik7XG5cbiAgICAgICAgLy8gQW55dGhpbmcgdGhhdCBjaGFuZ2VzIG91ciBcImluIHByb2dyZXNzXCIgbGF5ZXIgYW5kIHRpbGUgaW5kaWNlcyByZXF1aXJlcyB1c1xuICAgICAgICAvLyB0byBzdGFydCBvdmVyLiBXaGVuIHdlIHN0YXJ0IG92ZXIsIHdlIGRvIGEgZnVsbCBwbGFjZW1lbnQgaW5zdGVhZCBvZiBpbmNyZW1lbnRhbFxuICAgICAgICAvLyB0byBwcmV2ZW50IHN0YXJ2YXRpb24uXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gcmVzdGFydCBwbGFjZW1lbnQgdG8ga2VlcCBsYXllciBpbmRpY2VzIGluIHN5bmMuXG4gICAgICAgIC8vIEFsc28gZm9yY2UgZnVsbCBwbGFjZW1lbnQgd2hlbiBmYWRlRHVyYXRpb24gPT09IDAgdG8gZW5zdXJlIHRoYXQgbmV3bHkgbG9hZGVkXG4gICAgICAgIC8vIHRpbGVzIHdpbGwgZnVsbHkgZGlzcGxheSBzeW1ib2xzIGluIHRoZWlyIGZpcnN0IGZyYW1lXG4gICAgICAgIGZvcmNlRnVsbFBsYWNlbWVudCA9IGZvcmNlRnVsbFBsYWNlbWVudCB8fCB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCB8fCBmYWRlRHVyYXRpb24gPT09IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCduZXdvcmRlcicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JjZUZ1bGxQbGFjZW1lbnQgfHwgIXRoaXMucGF1c2VhYmxlUGxhY2VtZW50IHx8ICh0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSAmJiAhdGhpcy5wbGFjZW1lbnQuc3RpbGxSZWNlbnQoYnJvd3Nlci5ub3coKSwgdHJhbnNmb3JtLnpvb20pKSkge1xuICAgICAgICAgICAgY29uc3QgZm9nU3RhdGUgPSB0aGlzLmZvZyAmJiB0cmFuc2Zvcm0ucHJvamVjdGlvbi5zdXBwb3J0c0ZvZyA/IHRoaXMuZm9nLnN0YXRlIDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMucGF1c2VhYmxlUGxhY2VtZW50ID0gbmV3IFBhdXNlYWJsZVBsYWNlbWVudCh0cmFuc2Zvcm0sIHRoaXMuX29yZGVyLCBmb3JjZUZ1bGxQbGFjZW1lbnQsIHNob3dDb2xsaXNpb25Cb3hlcywgZmFkZUR1cmF0aW9uLCBjcm9zc1NvdXJjZUNvbGxpc2lvbnMsIHRoaXMucGxhY2VtZW50LCBmb2dTdGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9sYXllck9yZGVyQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpKSB7XG4gICAgICAgICAgICAvLyB0aGUgbGFzdCBwbGFjZW1lbnQgZmluaXNoZWQgcnVubmluZywgYnV0IHRoZSBuZXh0IG9uZSBoYXNu4oCZdFxuICAgICAgICAgICAgLy8gc3RhcnRlZCB5ZXQgYmVjYXVzZSBvZiB0aGUgYHN0aWxsUmVjZW50YCBjaGVjayBpbW1lZGlhdGVseVxuICAgICAgICAgICAgLy8gYWJvdmUsIHNvIG1hcmsgaXQgc3RhbGUgdG8gZW5zdXJlIHRoYXQgd2UgcmVxdWVzdCBhbm90aGVyXG4gICAgICAgICAgICAvLyByZW5kZXIgZnJhbWVcbiAgICAgICAgICAgIHRoaXMucGxhY2VtZW50LnNldFN0YWxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5jb250aW51ZVBsYWNlbWVudCh0aGlzLl9vcmRlciwgdGhpcy5fbGF5ZXJzLCBsYXllclRpbGVzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSB0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5jb21taXQoYnJvd3Nlci5ub3coKSk7XG4gICAgICAgICAgICAgICAgcGxhY2VtZW50Q29tbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN5bWJvbEJ1Y2tldHNDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHBsYWNlbWVudCBnZXRzIHNwbGl0IG92ZXIgbXVsdGlwbGUgZnJhbWVzIGl0IGlzIHBvc3NpYmxlXG4gICAgICAgICAgICAgICAgLy8gdGhlc2UgYnVja2V0cyB3ZXJlIHByb2Nlc3NlZCBiZWZvcmUgdGhleSB3ZXJlIGNoYW5nZWQgYW5kIHNvIHRoZVxuICAgICAgICAgICAgICAgIC8vIHBsYWNlbWVudCBpcyBhbHJlYWR5IHN0YWxlIHdoaWxlIGl0IGlzIGluIHByb2dyZXNzXG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQucGxhY2VtZW50LnNldFN0YWxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGxhY2VtZW50Q29tbWl0dGVkIHx8IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySUQgb2YgdGhpcy5fb3JkZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZUxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySURdO1xuICAgICAgICAgICAgICAgIGlmIChzdHlsZUxheWVyLnR5cGUgIT09ICdzeW1ib2wnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudC51cGRhdGVMYXllck9wYWNpdGllcyhzdHlsZUxheWVyLCBsYXllclRpbGVzW3N0eWxlTGF5ZXIuc291cmNlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBuZWVkc1JlbmRlciBpcyBmYWxzZSB3aGVuIHdlIGhhdmUganVzdCBmaW5pc2hlZCBhIHBsYWNlbWVudCB0aGF0IGRpZG4ndCBjaGFuZ2UgdGhlIHZpc2liaWxpdHkgb2YgYW55IHN5bWJvbHNcbiAgICAgICAgY29uc3QgbmVlZHNSZXJlbmRlciA9ICF0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5pc0RvbmUoKSB8fCB0aGlzLnBsYWNlbWVudC5oYXNUcmFuc2l0aW9ucyhicm93c2VyLm5vdygpKTtcbiAgICAgICAgcmV0dXJuIG5lZWRzUmVyZW5kZXI7XG4gICAgfVxuXG4gICAgX3JlbGVhc2VTeW1ib2xGYWRlVGlsZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VDYWNoZXNbaWRdLnJlbGVhc2VTeW1ib2xGYWRlVGlsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGxiYWNrcyBmcm9tIHdlYiB3b3JrZXJzXG5cbiAgICBnZXRJbWFnZXMobWFwSWQ6IHN0cmluZywgcGFyYW1zOiB7aWNvbnM6IEFycmF5PHN0cmluZz4sIHNvdXJjZTogc3RyaW5nLCB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHR5cGU6IHN0cmluZ30sIGNhbGxiYWNrOiBDYWxsYmFjazx7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9Pikge1xuXG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLmdldEltYWdlcyhwYXJhbXMuaWNvbnMsIGNhbGxiYWNrKTtcblxuICAgICAgICAvLyBBcHBseSBxdWV1ZWQgaW1hZ2UgY2hhbmdlcyBiZWZvcmUgc2V0dGluZyB0aGUgdGlsZSdzIGRlcGVuZGVuY2llcyBzbyB0aGF0IHRoZSB0aWxlXG4gICAgICAgIC8vIGlzIG5vdCByZWxvYWRlZCB1bmVjZXNzYXJpbHkuIFdpdGhvdXQgdGhpcyBmb3JjZWQgdXBkYXRlIHRoZSByZWxvYWQgY291bGQgaGFwcGVuIGluIGNhc2VzXG4gICAgICAgIC8vIGxpa2UgdGhpcyBvbmU6XG4gICAgICAgIC8vIC0gaWNvbnMgY29udGFpbnMgXCJteS1pbWFnZVwiXG4gICAgICAgIC8vIC0gaW1hZ2VNYW5hZ2VyLmdldEltYWdlcyguLi4pIHRyaWdnZXJzIGBvbnN0eWxlaW1hZ2VtaXNzaW5nYFxuICAgICAgICAvLyAtIHRoZSB1c2VyIGFkZHMgXCJteS1pbWFnZVwiIHdpdGhpbiB0aGUgY2FsbGJhY2tcbiAgICAgICAgLy8gLSBhZGRJbWFnZSBhZGRzIFwibXktaW1hZ2VcIiB0byB0aGlzLl9jaGFuZ2VkSW1hZ2VzXG4gICAgICAgIC8vIC0gdGhlIG5leHQgZnJhbWUgdHJpZ2dlcnMgYSByZWxvYWQgb2YgdGhpcyB0aWxlIGV2ZW4gdGhvdWdoIGl0IGFscmVhZHkgaGFzIHRoZSBsYXRlc3QgdmVyc2lvblxuICAgICAgICB0aGlzLl91cGRhdGVUaWxlc0ZvckNoYW5nZWRJbWFnZXMoKTtcblxuICAgICAgICBjb25zdCBzZXREZXBlbmRlbmNpZXMgPSAoc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VDYWNoZS5zZXREZXBlbmRlbmNpZXMocGFyYW1zLnRpbGVJRC5rZXksIHBhcmFtcy50eXBlLCBwYXJhbXMuaWNvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZXREZXBlbmRlbmNpZXModGhpcy5fb3RoZXJTb3VyY2VDYWNoZXNbcGFyYW1zLnNvdXJjZV0pO1xuICAgICAgICBzZXREZXBlbmRlbmNpZXModGhpcy5fc3ltYm9sU291cmNlQ2FjaGVzW3BhcmFtcy5zb3VyY2VdKTtcbiAgICB9XG5cbiAgICBnZXRHbHlwaHMobWFwSWQ6IHN0cmluZywgcGFyYW1zOiB7c3RhY2tzOiB7W186IHN0cmluZ106IEFycmF5PG51bWJlcj59fSwgY2FsbGJhY2s6IENhbGxiYWNrPHtbXzogc3RyaW5nXToge2dseXBoczoge1tfOiBudW1iZXJdOiA/U3R5bGVHbHlwaH0sIGFzY2VuZGVyPzogbnVtYmVyLCBkZXNjZW5kZXI/OiBudW1iZXJ9fT4pIHtcbiAgICAgICAgdGhpcy5nbHlwaE1hbmFnZXIuZ2V0R2x5cGhzKHBhcmFtcy5zdGFja3MsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBnZXRSZXNvdXJjZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxhbnk+KTogQ2FuY2VsYWJsZSB7XG4gICAgICAgIHJldHVybiBtYWtlUmVxdWVzdChwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBfZ2V0U291cmNlQ2FjaGUoc291cmNlOiBzdHJpbmcpOiBTb3VyY2VDYWNoZSB8IHZvaWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3RoZXJTb3VyY2VDYWNoZXNbc291cmNlXTtcbiAgICB9XG5cbiAgICBfZ2V0TGF5ZXJTb3VyY2VDYWNoZShsYXllcjogU3R5bGVMYXllcik6IFNvdXJjZUNhY2hlIHwgdm9pZCB7XG4gICAgICAgIHJldHVybiBsYXllci50eXBlID09PSAnc3ltYm9sJyA/XG4gICAgICAgICAgICB0aGlzLl9zeW1ib2xTb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXSA6XG4gICAgICAgICAgICB0aGlzLl9vdGhlclNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdO1xuICAgIH1cblxuICAgIF9nZXRTb3VyY2VDYWNoZXMoc291cmNlOiBzdHJpbmcpOiBBcnJheTxTb3VyY2VDYWNoZT4ge1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuX290aGVyU291cmNlQ2FjaGVzW3NvdXJjZV0pIHtcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlcy5wdXNoKHRoaXMuX290aGVyU291cmNlQ2FjaGVzW3NvdXJjZV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zeW1ib2xTb3VyY2VDYWNoZXNbc291cmNlXSkge1xuICAgICAgICAgICAgc291cmNlQ2FjaGVzLnB1c2godGhpcy5fc3ltYm9sU291cmNlQ2FjaGVzW3NvdXJjZV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzb3VyY2VDYWNoZXM7XG4gICAgfVxuXG4gICAgaGFzM0RMYXllcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW0zRExheWVycyA+IDA7XG4gICAgfVxuXG4gICAgaGFzU3ltYm9sTGF5ZXJzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtU3ltYm9sTGF5ZXJzID4gMDtcbiAgICB9XG5cbiAgICBoYXNDaXJjbGVMYXllcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1DaXJjbGVMYXllcnMgPiAwO1xuICAgIH1cblxuICAgIF9jbGVhcldvcmtlckNhY2hlcygpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnY2xlYXJDYWNoZXMnKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9jbGVhcldvcmtlckNhY2hlcygpO1xuICAgICAgICBpZiAodGhpcy50ZXJyYWluU2V0Rm9yRHJhcGluZ09ubHkoKSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMudGVycmFpbjtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0eWxlc2hlZXQudGVycmFpbjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuU3R5bGUuZ2V0U291cmNlVHlwZSA9IGdldFNvdXJjZVR5cGU7XG5TdHlsZS5zZXRTb3VyY2VUeXBlID0gc2V0U291cmNlVHlwZTtcblN0eWxlLnJlZ2lzdGVyRm9yUGx1Z2luU3RhdGVDaGFuZ2UgPSByZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlO1xuXG5leHBvcnQgZGVmYXVsdCBTdHlsZTtcbiIsIlxuLy8gRGlzYWJsZSBGbG93IGFubm90YXRpb25zIGhlcmUgYmVjYXVzZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCBpbXBvcnRpbmcgR0xTTCBmaWxlc1xuLyogZXNsaW50LWRpc2FibGUgZmxvd3R5cGUvcmVxdWlyZS12YWxpZC1maWxlLWFubm90YXRpb24gKi9cblxuaW1wb3J0IHByZWx1ZGVDb21tb24gZnJvbSAnLi9fcHJlbHVkZS5nbHNsJztcbmltcG9ydCBwcmVsdWRlRnJhZyBmcm9tICcuL19wcmVsdWRlLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHByZWx1ZGVWZXJ0IGZyb20gJy4vX3ByZWx1ZGUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGJhY2tncm91bmRGcmFnIGZyb20gJy4vYmFja2dyb3VuZC5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBiYWNrZ3JvdW5kVmVydCBmcm9tICcuL2JhY2tncm91bmQudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGJhY2tncm91bmRQYXR0ZXJuRnJhZyBmcm9tICcuL2JhY2tncm91bmRfcGF0dGVybi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBiYWNrZ3JvdW5kUGF0dGVyblZlcnQgZnJvbSAnLi9iYWNrZ3JvdW5kX3BhdHRlcm4udmVydGV4Lmdsc2wnO1xuaW1wb3J0IGNpcmNsZUZyYWcgZnJvbSAnLi9jaXJjbGUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgY2lyY2xlVmVydCBmcm9tICcuL2NpcmNsZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgY2xpcHBpbmdNYXNrRnJhZyBmcm9tICcuL2NsaXBwaW5nX21hc2suZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgY2xpcHBpbmdNYXNrVmVydCBmcm9tICcuL2NsaXBwaW5nX21hc2sudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGhlYXRtYXBGcmFnIGZyb20gJy4vaGVhdG1hcC5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBoZWF0bWFwVmVydCBmcm9tICcuL2hlYXRtYXAudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGhlYXRtYXBUZXh0dXJlRnJhZyBmcm9tICcuL2hlYXRtYXBfdGV4dHVyZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBoZWF0bWFwVGV4dHVyZVZlcnQgZnJvbSAnLi9oZWF0bWFwX3RleHR1cmUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGNvbGxpc2lvbkJveEZyYWcgZnJvbSAnLi9jb2xsaXNpb25fYm94LmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGNvbGxpc2lvbkJveFZlcnQgZnJvbSAnLi9jb2xsaXNpb25fYm94LnZlcnRleC5nbHNsJztcbmltcG9ydCBjb2xsaXNpb25DaXJjbGVGcmFnIGZyb20gJy4vY29sbGlzaW9uX2NpcmNsZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBjb2xsaXNpb25DaXJjbGVWZXJ0IGZyb20gJy4vY29sbGlzaW9uX2NpcmNsZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZGVidWdGcmFnIGZyb20gJy4vZGVidWcuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZGVidWdWZXJ0IGZyb20gJy4vZGVidWcudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGZpbGxGcmFnIGZyb20gJy4vZmlsbC5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBmaWxsVmVydCBmcm9tICcuL2ZpbGwudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGZpbGxPdXRsaW5lRnJhZyBmcm9tICcuL2ZpbGxfb3V0bGluZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBmaWxsT3V0bGluZVZlcnQgZnJvbSAnLi9maWxsX291dGxpbmUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGZpbGxPdXRsaW5lUGF0dGVybkZyYWcgZnJvbSAnLi9maWxsX291dGxpbmVfcGF0dGVybi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBmaWxsT3V0bGluZVBhdHRlcm5WZXJ0IGZyb20gJy4vZmlsbF9vdXRsaW5lX3BhdHRlcm4udmVydGV4Lmdsc2wnO1xuaW1wb3J0IGZpbGxQYXR0ZXJuRnJhZyBmcm9tICcuL2ZpbGxfcGF0dGVybi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBmaWxsUGF0dGVyblZlcnQgZnJvbSAnLi9maWxsX3BhdHRlcm4udmVydGV4Lmdsc2wnO1xuaW1wb3J0IGZpbGxFeHRydXNpb25GcmFnIGZyb20gJy4vZmlsbF9leHRydXNpb24uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZmlsbEV4dHJ1c2lvblZlcnQgZnJvbSAnLi9maWxsX2V4dHJ1c2lvbi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZmlsbEV4dHJ1c2lvblBhdHRlcm5GcmFnIGZyb20gJy4vZmlsbF9leHRydXNpb25fcGF0dGVybi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uUGF0dGVyblZlcnQgZnJvbSAnLi9maWxsX2V4dHJ1c2lvbl9wYXR0ZXJuLnZlcnRleC5nbHNsJztcbmltcG9ydCBoaWxsc2hhZGVQcmVwYXJlRnJhZyBmcm9tICcuL2hpbGxzaGFkZV9wcmVwYXJlLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGhpbGxzaGFkZVByZXBhcmVWZXJ0IGZyb20gJy4vaGlsbHNoYWRlX3ByZXBhcmUudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGhpbGxzaGFkZUZyYWcgZnJvbSAnLi9oaWxsc2hhZGUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgaGlsbHNoYWRlVmVydCBmcm9tICcuL2hpbGxzaGFkZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgbGluZUZyYWcgZnJvbSAnLi9saW5lLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGxpbmVWZXJ0IGZyb20gJy4vbGluZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgbGluZVBhdHRlcm5GcmFnIGZyb20gJy4vbGluZV9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGxpbmVQYXR0ZXJuVmVydCBmcm9tICcuL2xpbmVfcGF0dGVybi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgcmFzdGVyRnJhZyBmcm9tICcuL3Jhc3Rlci5mcmFnbWVudC5nbHNsJztcbmltcG9ydCByYXN0ZXJWZXJ0IGZyb20gJy4vcmFzdGVyLnZlcnRleC5nbHNsJztcbmltcG9ydCBzeW1ib2xJY29uRnJhZyBmcm9tICcuL3N5bWJvbF9pY29uLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHN5bWJvbEljb25WZXJ0IGZyb20gJy4vc3ltYm9sX2ljb24udmVydGV4Lmdsc2wnO1xuaW1wb3J0IHN5bWJvbFNERkZyYWcgZnJvbSAnLi9zeW1ib2xfc2RmLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHN5bWJvbFNERlZlcnQgZnJvbSAnLi9zeW1ib2xfc2RmLnZlcnRleC5nbHNsJztcbmltcG9ydCBzeW1ib2xUZXh0QW5kSWNvbkZyYWcgZnJvbSAnLi9zeW1ib2xfdGV4dF9hbmRfaWNvbi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBzeW1ib2xUZXh0QW5kSWNvblZlcnQgZnJvbSAnLi9zeW1ib2xfdGV4dF9hbmRfaWNvbi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgc2t5Ym94RnJhZyBmcm9tICcuL3NreWJveC5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBza3lib3hHcmFkaWVudEZyYWcgZnJvbSAnLi9za3lib3hfZ3JhZGllbnQuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgc2t5Ym94VmVydCBmcm9tICcuL3NreWJveC52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgdGVycmFpblJhc3RlckZyYWcgZnJvbSAnLi90ZXJyYWluX3Jhc3Rlci5mcmFnbWVudC5nbHNsJztcbmltcG9ydCB0ZXJyYWluUmFzdGVyVmVydCBmcm9tICcuL3RlcnJhaW5fcmFzdGVyLnZlcnRleC5nbHNsJztcbmltcG9ydCB0ZXJyYWluRGVwdGhGcmFnIGZyb20gJy4vdGVycmFpbl9kZXB0aC5mcmFnbWVudC5nbHNsJztcbmltcG9ydCB0ZXJyYWluRGVwdGhWZXJ0IGZyb20gJy4vdGVycmFpbl9kZXB0aC52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgcHJlbHVkZVRlcnJhaW5WZXJ0IGZyb20gJy4vX3ByZWx1ZGVfdGVycmFpbi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgcHJlbHVkZUZvZ1ZlcnQgZnJvbSAnLi9fcHJlbHVkZV9mb2cudmVydGV4Lmdsc2wnO1xuaW1wb3J0IHByZWx1ZGVGb2dGcmFnIGZyb20gJy4vX3ByZWx1ZGVfZm9nLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHNreWJveENhcHR1cmVGcmFnIGZyb20gJy4vc2t5Ym94X2NhcHR1cmUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgc2t5Ym94Q2FwdHVyZVZlcnQgZnJvbSAnLi9za3lib3hfY2FwdHVyZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZ2xvYmVGcmFnIGZyb20gJy4vZ2xvYmVfcmFzdGVyLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGdsb2JlVmVydCBmcm9tICcuL2dsb2JlX3Jhc3Rlci52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgYXRtb3NwaGVyZUZyYWcgZnJvbSAnLi9nbG9iZV9hdG1vc3BoZXJlLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGF0bW9zcGhlcmVWZXJ0IGZyb20gJy4vZ2xvYmVfYXRtb3NwaGVyZS52ZXJ0ZXguZ2xzbCc7XG5cbmV4cG9ydCBsZXQgcHJlbHVkZVRlcnJhaW4gPSB7fTtcbmV4cG9ydCBsZXQgcHJlbHVkZUZvZyA9IHt9O1xuXG5wcmVsdWRlVGVycmFpbiA9IGNvbXBpbGUoJycsIHByZWx1ZGVUZXJyYWluVmVydCwgdHJ1ZSk7XG5wcmVsdWRlRm9nID0gY29tcGlsZShwcmVsdWRlRm9nRnJhZywgcHJlbHVkZUZvZ1ZlcnQsIHRydWUpO1xuXG5leHBvcnQgY29uc3QgcHJlbHVkZSA9IGNvbXBpbGUocHJlbHVkZUZyYWcsIHByZWx1ZGVWZXJ0KTtcbmV4cG9ydCBjb25zdCBwcmVsdWRlQ29tbW9uU291cmNlID0gcHJlbHVkZUNvbW1vbjtcblxuZXhwb3J0IGNvbnN0IHByZWx1ZGVWZXJ0UHJlY2lzaW9uUXVhbGlmaWVycyA9IGBcbiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2Vsc2VcblxuI2lmICFkZWZpbmVkKGxvd3ApXG4jZGVmaW5lIGxvd3BcbiNlbmRpZlxuXG4jaWYgIWRlZmluZWQobWVkaXVtcClcbiNkZWZpbmUgbWVkaXVtcFxuI2VuZGlmXG5cbiNpZiAhZGVmaW5lZChoaWdocClcbiNkZWZpbmUgaGlnaHBcbiNlbmRpZlxuXG4jZW5kaWZgO1xuZXhwb3J0IGNvbnN0IHByZWx1ZGVGcmFnUHJlY2lzaW9uUXVhbGlmaWVycyA9IGBcbiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZWxzZVxuXG4jaWYgIWRlZmluZWQobG93cClcbiNkZWZpbmUgbG93cFxuI2VuZGlmXG5cbiNpZiAhZGVmaW5lZChtZWRpdW1wKVxuI2RlZmluZSBtZWRpdW1wXG4jZW5kaWZcblxuI2lmICFkZWZpbmVkKGhpZ2hwKVxuI2RlZmluZSBoaWdocFxuI2VuZGlmXG5cbiNlbmRpZmA7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgICBiYWNrZ3JvdW5kOiBjb21waWxlKGJhY2tncm91bmRGcmFnLCBiYWNrZ3JvdW5kVmVydCksXG4gICAgYmFja2dyb3VuZFBhdHRlcm46IGNvbXBpbGUoYmFja2dyb3VuZFBhdHRlcm5GcmFnLCBiYWNrZ3JvdW5kUGF0dGVyblZlcnQpLFxuICAgIGNpcmNsZTogY29tcGlsZShjaXJjbGVGcmFnLCBjaXJjbGVWZXJ0KSxcbiAgICBjbGlwcGluZ01hc2s6IGNvbXBpbGUoY2xpcHBpbmdNYXNrRnJhZywgY2xpcHBpbmdNYXNrVmVydCksXG4gICAgaGVhdG1hcDogY29tcGlsZShoZWF0bWFwRnJhZywgaGVhdG1hcFZlcnQpLFxuICAgIGhlYXRtYXBUZXh0dXJlOiBjb21waWxlKGhlYXRtYXBUZXh0dXJlRnJhZywgaGVhdG1hcFRleHR1cmVWZXJ0KSxcbiAgICBjb2xsaXNpb25Cb3g6IGNvbXBpbGUoY29sbGlzaW9uQm94RnJhZywgY29sbGlzaW9uQm94VmVydCksXG4gICAgY29sbGlzaW9uQ2lyY2xlOiBjb21waWxlKGNvbGxpc2lvbkNpcmNsZUZyYWcsIGNvbGxpc2lvbkNpcmNsZVZlcnQpLFxuICAgIGRlYnVnOiBjb21waWxlKGRlYnVnRnJhZywgZGVidWdWZXJ0KSxcbiAgICBmaWxsOiBjb21waWxlKGZpbGxGcmFnLCBmaWxsVmVydCksXG4gICAgZmlsbE91dGxpbmU6IGNvbXBpbGUoZmlsbE91dGxpbmVGcmFnLCBmaWxsT3V0bGluZVZlcnQpLFxuICAgIGZpbGxPdXRsaW5lUGF0dGVybjogY29tcGlsZShmaWxsT3V0bGluZVBhdHRlcm5GcmFnLCBmaWxsT3V0bGluZVBhdHRlcm5WZXJ0KSxcbiAgICBmaWxsUGF0dGVybjogY29tcGlsZShmaWxsUGF0dGVybkZyYWcsIGZpbGxQYXR0ZXJuVmVydCksXG4gICAgZmlsbEV4dHJ1c2lvbjogY29tcGlsZShmaWxsRXh0cnVzaW9uRnJhZywgZmlsbEV4dHJ1c2lvblZlcnQpLFxuICAgIGZpbGxFeHRydXNpb25QYXR0ZXJuOiBjb21waWxlKGZpbGxFeHRydXNpb25QYXR0ZXJuRnJhZywgZmlsbEV4dHJ1c2lvblBhdHRlcm5WZXJ0KSxcbiAgICBoaWxsc2hhZGVQcmVwYXJlOiBjb21waWxlKGhpbGxzaGFkZVByZXBhcmVGcmFnLCBoaWxsc2hhZGVQcmVwYXJlVmVydCksXG4gICAgaGlsbHNoYWRlOiBjb21waWxlKGhpbGxzaGFkZUZyYWcsIGhpbGxzaGFkZVZlcnQpLFxuICAgIGxpbmU6IGNvbXBpbGUobGluZUZyYWcsIGxpbmVWZXJ0KSxcbiAgICBsaW5lUGF0dGVybjogY29tcGlsZShsaW5lUGF0dGVybkZyYWcsIGxpbmVQYXR0ZXJuVmVydCksXG4gICAgcmFzdGVyOiBjb21waWxlKHJhc3RlckZyYWcsIHJhc3RlclZlcnQpLFxuICAgIHN5bWJvbEljb246IGNvbXBpbGUoc3ltYm9sSWNvbkZyYWcsIHN5bWJvbEljb25WZXJ0KSxcbiAgICBzeW1ib2xTREY6IGNvbXBpbGUoc3ltYm9sU0RGRnJhZywgc3ltYm9sU0RGVmVydCksXG4gICAgc3ltYm9sVGV4dEFuZEljb246IGNvbXBpbGUoc3ltYm9sVGV4dEFuZEljb25GcmFnLCBzeW1ib2xUZXh0QW5kSWNvblZlcnQpLFxuICAgIHRlcnJhaW5SYXN0ZXI6IGNvbXBpbGUodGVycmFpblJhc3RlckZyYWcsIHRlcnJhaW5SYXN0ZXJWZXJ0KSxcbiAgICB0ZXJyYWluRGVwdGg6IGNvbXBpbGUodGVycmFpbkRlcHRoRnJhZywgdGVycmFpbkRlcHRoVmVydCksXG4gICAgc2t5Ym94OiBjb21waWxlKHNreWJveEZyYWcsIHNreWJveFZlcnQpLFxuICAgIHNreWJveEdyYWRpZW50OiBjb21waWxlKHNreWJveEdyYWRpZW50RnJhZywgc2t5Ym94VmVydCksXG4gICAgc2t5Ym94Q2FwdHVyZTogY29tcGlsZShza3lib3hDYXB0dXJlRnJhZywgc2t5Ym94Q2FwdHVyZVZlcnQpLFxuICAgIGdsb2JlUmFzdGVyOiBjb21waWxlKGdsb2JlRnJhZywgZ2xvYmVWZXJ0KSxcbiAgICBnbG9iZUF0bW9zcGhlcmU6IGNvbXBpbGUoYXRtb3NwaGVyZUZyYWcsIGF0bW9zcGhlcmVWZXJ0KVxufTtcblxuLy8gRXhwYW5kICNwcmFnbWFzIHRvICNpZmRlZnMuXG5mdW5jdGlvbiBjb21waWxlKGZyYWdtZW50U291cmNlLCB2ZXJ0ZXhTb3VyY2UsIGlzR2xvYmFsUHJlbHVkZSkge1xuICAgIGNvbnN0IHByYWdtYVJlZ2V4ID0gLyNwcmFnbWEgbWFwYm94OiAoW1xcd10rKSAoW1xcd10rKSAoW1xcd10rKSAoW1xcd10rKS9nO1xuICAgIGNvbnN0IHVuaWZvcm1SZWdleCA9IC91bmlmb3JtIChoaWdocCB8bWVkaXVtcCB8bG93cCApPyhbXFx3XSspIChbXFx3XSspKFtcXHNdKikoW1xcd10qKS9nO1xuICAgIGNvbnN0IGF0dHJpYnV0ZVJlZ2V4ID0gL2F0dHJpYnV0ZSAoaGlnaHAgfG1lZGl1bXAgfGxvd3AgKT8oW1xcd10rKSAoW1xcd10rKS9nO1xuXG4gICAgY29uc3Qgc3RhdGljQXR0cmlidXRlcyA9IHZlcnRleFNvdXJjZS5tYXRjaChhdHRyaWJ1dGVSZWdleCk7XG4gICAgY29uc3QgZnJhZ21lbnRVbmlmb3JtcyA9IGZyYWdtZW50U291cmNlLm1hdGNoKHVuaWZvcm1SZWdleCk7XG4gICAgY29uc3QgdmVydGV4VW5pZm9ybXMgPSB2ZXJ0ZXhTb3VyY2UubWF0Y2godW5pZm9ybVJlZ2V4KTtcbiAgICBjb25zdCBjb21tb25Vbmlmb3JtcyA9IHByZWx1ZGVDb21tb24ubWF0Y2godW5pZm9ybVJlZ2V4KTtcblxuICAgIGxldCBzdGF0aWNVbmlmb3JtcyA9IHZlcnRleFVuaWZvcm1zID8gdmVydGV4VW5pZm9ybXMuY29uY2F0KGZyYWdtZW50VW5pZm9ybXMpIDogZnJhZ21lbnRVbmlmb3JtcztcblxuICAgIGlmICghaXNHbG9iYWxQcmVsdWRlKSB7XG4gICAgICAgIGlmIChwcmVsdWRlVGVycmFpbi5zdGF0aWNVbmlmb3Jtcykge1xuICAgICAgICAgICAgc3RhdGljVW5pZm9ybXMgPSBwcmVsdWRlVGVycmFpbi5zdGF0aWNVbmlmb3Jtcy5jb25jYXQoc3RhdGljVW5pZm9ybXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmVsdWRlRm9nLnN0YXRpY1VuaWZvcm1zKSB7XG4gICAgICAgICAgICBzdGF0aWNVbmlmb3JtcyA9IHByZWx1ZGVGb2cuc3RhdGljVW5pZm9ybXMuY29uY2F0KHN0YXRpY1VuaWZvcm1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGF0aWNVbmlmb3Jtcykge1xuICAgICAgICBzdGF0aWNVbmlmb3JtcyA9IHN0YXRpY1VuaWZvcm1zLmNvbmNhdChjb21tb25Vbmlmb3Jtcyk7XG4gICAgfVxuXG4gICAgY29uc3QgZnJhZ21lbnRQcmFnbWFzID0ge307XG5cbiAgICBmcmFnbWVudFNvdXJjZSA9IGZyYWdtZW50U291cmNlLnJlcGxhY2UocHJhZ21hUmVnZXgsIChtYXRjaCwgb3BlcmF0aW9uLCBwcmVjaXNpb24sIHR5cGUsIG5hbWUpID0+IHtcbiAgICAgICAgZnJhZ21lbnRQcmFnbWFzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ2RlZmluZScpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxudmFyeWluZyAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9O1xuI2Vsc2VcbnVuaWZvcm0gJHtwcmVjaXNpb259ICR7dHlwZX0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICB9IGVsc2UgLyogaWYgKG9wZXJhdGlvbiA9PT0gJ2luaXRpYWxpemUnKSAqLyB7XG4gICAgICAgICAgICByZXR1cm4gYFxuI2lmZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHZlcnRleFNvdXJjZSA9IHZlcnRleFNvdXJjZS5yZXBsYWNlKHByYWdtYVJlZ2V4LCAobWF0Y2gsIG9wZXJhdGlvbiwgcHJlY2lzaW9uLCB0eXBlLCBuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGF0dHJUeXBlID0gdHlwZSA9PT0gJ2Zsb2F0JyA/ICd2ZWMyJyA6ICd2ZWM0JztcbiAgICAgICAgY29uc3QgdW5wYWNrVHlwZSA9IG5hbWUubWF0Y2goL2NvbG9yLykgPyAnY29sb3InIDogYXR0clR5cGU7XG5cbiAgICAgICAgaWYgKGZyYWdtZW50UHJhZ21hc1tuYW1lXSkge1xuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ2RlZmluZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbnVuaWZvcm0gbG93cCBmbG9hdCB1XyR7bmFtZX1fdDtcbmF0dHJpYnV0ZSAke3ByZWNpc2lvbn0gJHthdHRyVHlwZX0gYV8ke25hbWV9O1xudmFyeWluZyAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9O1xuI2Vsc2VcbnVuaWZvcm0gJHtwcmVjaXNpb259ICR7dHlwZX0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChvcGVyYXRpb24gPT09ICdpbml0aWFsaXplJykgKi8ge1xuICAgICAgICAgICAgICAgIGlmICh1bnBhY2tUeXBlID09PSAndmVjNCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdmVjNCBhdHRyaWJ1dGVzIGFyZSBvbmx5IHVzZWQgZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIGFuZCBhcmUgbm90IHBhY2tlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbiAgICAke25hbWV9ID0gYV8ke25hbWV9O1xuI2Vsc2VcbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxuICAgICR7bmFtZX0gPSB1bnBhY2tfbWl4XyR7dW5wYWNrVHlwZX0oYV8ke25hbWV9LCB1XyR7bmFtZX1fdCk7XG4jZWxzZVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJ2RlZmluZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbnVuaWZvcm0gbG93cCBmbG9hdCB1XyR7bmFtZX1fdDtcbmF0dHJpYnV0ZSAke3ByZWNpc2lvbn0gJHthdHRyVHlwZX0gYV8ke25hbWV9O1xuI2Vsc2VcbnVuaWZvcm0gJHtwcmVjaXNpb259ICR7dHlwZX0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChvcGVyYXRpb24gPT09ICdpbml0aWFsaXplJykgKi8ge1xuICAgICAgICAgICAgICAgIGlmICh1bnBhY2tUeXBlID09PSAndmVjNCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdmVjNCBhdHRyaWJ1dGVzIGFyZSBvbmx5IHVzZWQgZm9yIGNyb3NzLWZhZGVkIHByb3BlcnRpZXMsIGFuZCBhcmUgbm90IHBhY2tlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gYV8ke25hbWV9O1xuI2Vsc2VcbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSAvKiAqL3tcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG4gICAgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfSA9IHVucGFja19taXhfJHt1bnBhY2tUeXBlfShhXyR7bmFtZX0sIHVfJHtuYW1lfV90KTtcbiNlbHNlXG4gICAgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfSA9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7ZnJhZ21lbnRTb3VyY2UsIHZlcnRleFNvdXJjZSwgc3RhdGljQXR0cmlidXRlcywgc3RhdGljVW5pZm9ybXN9O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSBQcm9ncmFtIGZyb20gJy4vcHJvZ3JhbS5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcblxuY2xhc3MgVmVydGV4QXJyYXlPYmplY3Qge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgYm91bmRQcm9ncmFtOiA/UHJvZ3JhbTwqPjtcbiAgICBib3VuZExheW91dFZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBib3VuZFBhaW50VmVydGV4QnVmZmVyczogQXJyYXk8VmVydGV4QnVmZmVyPjtcbiAgICBib3VuZEluZGV4QnVmZmVyOiA/SW5kZXhCdWZmZXI7XG4gICAgYm91bmRWZXJ0ZXhPZmZzZXQ6ID9udW1iZXI7XG4gICAgYm91bmREeW5hbWljVmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuICAgIGJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlcjI6ID9WZXJ0ZXhCdWZmZXI7XG4gICAgdmFvOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ib3VuZFByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kTGF5b3V0VmVydGV4QnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZFBhaW50VmVydGV4QnVmZmVycyA9IFtdO1xuICAgICAgICB0aGlzLmJvdW5kSW5kZXhCdWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kVmVydGV4T2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnZhbyA9IG51bGw7XG4gICAgfVxuXG4gICAgYmluZChjb250ZXh0OiBDb250ZXh0LFxuICAgICAgICAgcHJvZ3JhbTogUHJvZ3JhbTwqPixcbiAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyLFxuICAgICAgICAgcGFpbnRWZXJ0ZXhCdWZmZXJzOiBBcnJheTxWZXJ0ZXhCdWZmZXI+LFxuICAgICAgICAgaW5kZXhCdWZmZXI6ID9JbmRleEJ1ZmZlcixcbiAgICAgICAgIHZlcnRleE9mZnNldDogP251bWJlcixcbiAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXIsXG4gICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyMjogP1ZlcnRleEJ1ZmZlcikge1xuXG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG5cbiAgICAgICAgbGV0IHBhaW50QnVmZmVyc0RpZmZlciA9IHRoaXMuYm91bmRQYWludFZlcnRleEJ1ZmZlcnMubGVuZ3RoICE9PSBwYWludFZlcnRleEJ1ZmZlcnMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgIXBhaW50QnVmZmVyc0RpZmZlciAmJiBpIDwgcGFpbnRWZXJ0ZXhCdWZmZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ib3VuZFBhaW50VmVydGV4QnVmZmVyc1tpXSAhPT0gcGFpbnRWZXJ0ZXhCdWZmZXJzW2ldKSB7XG4gICAgICAgICAgICAgICAgcGFpbnRCdWZmZXJzRGlmZmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzRnJlc2hCaW5kUmVxdWlyZWQgPSAoXG4gICAgICAgICAgICAhdGhpcy52YW8gfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmRQcm9ncmFtICE9PSBwcm9ncmFtIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kTGF5b3V0VmVydGV4QnVmZmVyICE9PSBsYXlvdXRWZXJ0ZXhCdWZmZXIgfHxcbiAgICAgICAgICAgIHBhaW50QnVmZmVyc0RpZmZlciB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZEluZGV4QnVmZmVyICE9PSBpbmRleEJ1ZmZlciB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZFZlcnRleE9mZnNldCAhPT0gdmVydGV4T2Zmc2V0IHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlciAhPT0gZHluYW1pY1ZlcnRleEJ1ZmZlciB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIyICE9PSBkeW5hbWljVmVydGV4QnVmZmVyMlxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghY29udGV4dC5leHRWZXJ0ZXhBcnJheU9iamVjdCB8fCBpc0ZyZXNoQmluZFJlcXVpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZyZXNoQmluZChwcm9ncmFtLCBsYXlvdXRWZXJ0ZXhCdWZmZXIsIHBhaW50VmVydGV4QnVmZmVycywgaW5kZXhCdWZmZXIsIHZlcnRleE9mZnNldCwgZHluYW1pY1ZlcnRleEJ1ZmZlciwgZHluYW1pY1ZlcnRleEJ1ZmZlcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dC5iaW5kVmVydGV4QXJyYXlPRVMuc2V0KHRoaXMudmFvKTtcblxuICAgICAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgYnVmZmVyIG1heSBoYXZlIGJlZW4gdXBkYXRlZC4gUmViaW5kIHRvIHVwbG9hZCBkYXRhLlxuICAgICAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW5kZXhCdWZmZXIgJiYgaW5kZXhCdWZmZXIuZHluYW1pY0RyYXcpIHtcbiAgICAgICAgICAgICAgICBpbmRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyMikge1xuICAgICAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyLmJpbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZyZXNoQmluZChwcm9ncmFtOiBQcm9ncmFtPCo+LFxuICAgICAgICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgcGFpbnRWZXJ0ZXhCdWZmZXJzOiBBcnJheTxWZXJ0ZXhCdWZmZXI+LFxuICAgICAgICAgICAgICBpbmRleEJ1ZmZlcjogP0luZGV4QnVmZmVyLFxuICAgICAgICAgICAgICB2ZXJ0ZXhPZmZzZXQ6ID9udW1iZXIsXG4gICAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyOiA/VmVydGV4QnVmZmVyKSB7XG4gICAgICAgIGxldCBudW1QcmV2QXR0cmlidXRlcztcbiAgICAgICAgY29uc3QgbnVtTmV4dEF0dHJpYnV0ZXMgPSBwcm9ncmFtLm51bUF0dHJpYnV0ZXM7XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmIChjb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YW8pIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy52YW8gPSBjb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0LmNyZWF0ZVZlcnRleEFycmF5T0VTKCk7XG4gICAgICAgICAgICBjb250ZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUy5zZXQodGhpcy52YW8pO1xuICAgICAgICAgICAgbnVtUHJldkF0dHJpYnV0ZXMgPSAwO1xuXG4gICAgICAgICAgICAvLyBzdG9yZSB0aGUgYXJndW1lbnRzIHNvIHRoYXQgd2UgY2FuIHZlcmlmeSB0aGVtIHdoZW4gdGhlIHZhbyBpcyBib3VuZCBhZ2FpblxuICAgICAgICAgICAgdGhpcy5ib3VuZFByb2dyYW0gPSBwcm9ncmFtO1xuICAgICAgICAgICAgdGhpcy5ib3VuZExheW91dFZlcnRleEJ1ZmZlciA9IGxheW91dFZlcnRleEJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuYm91bmRQYWludFZlcnRleEJ1ZmZlcnMgPSBwYWludFZlcnRleEJ1ZmZlcnM7XG4gICAgICAgICAgICB0aGlzLmJvdW5kSW5kZXhCdWZmZXIgPSBpbmRleEJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuYm91bmRWZXJ0ZXhPZmZzZXQgPSB2ZXJ0ZXhPZmZzZXQ7XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlciA9IGR5bmFtaWNWZXJ0ZXhCdWZmZXI7XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlcjIgPSBkeW5hbWljVmVydGV4QnVmZmVyMjtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbnVtUHJldkF0dHJpYnV0ZXMgPSBjb250ZXh0LmN1cnJlbnROdW1BdHRyaWJ1dGVzIHx8IDA7XG5cbiAgICAgICAgICAgIC8vIERpc2FibGUgYWxsIGF0dHJpYnV0ZXMgZnJvbSB0aGUgcHJldmlvdXMgcHJvZ3JhbSB0aGF0IGFyZW4ndCB1c2VkIGluXG4gICAgICAgICAgICAvLyB0aGUgbmV3IHByb2dyYW0uIE5vdGU6IGF0dHJpYnV0ZSBpbmRpY2VzIGFyZSAqbm90KiBwcm9ncmFtIHNwZWNpZmljIVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG51bU5leHRBdHRyaWJ1dGVzOyBpIDwgbnVtUHJldkF0dHJpYnV0ZXM7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIFdlYkdMIGJyZWFrcyBpZiB5b3UgZGlzYWJsZSBhdHRyaWJ1dGUgMC5cbiAgICAgICAgICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIwMzA1MjMxXG4gICAgICAgICAgICAgICAgYXNzZXJ0KGkgIT09IDApO1xuICAgICAgICAgICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxheW91dFZlcnRleEJ1ZmZlci5lbmFibGVBdHRyaWJ1dGVzKGdsLCBwcm9ncmFtKTtcbiAgICAgICAgZm9yIChjb25zdCB2ZXJ0ZXhCdWZmZXIgb2YgcGFpbnRWZXJ0ZXhCdWZmZXJzKSB7XG4gICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIuZW5hYmxlQXR0cmlidXRlcyhnbCwgcHJvZ3JhbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHluYW1pY1ZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlci5lbmFibGVBdHRyaWJ1dGVzKGdsLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHluYW1pY1ZlcnRleEJ1ZmZlcjIpIHtcbiAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyLmVuYWJsZUF0dHJpYnV0ZXMoZ2wsIHByb2dyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLmJpbmQoKTtcbiAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICBmb3IgKGNvbnN0IHZlcnRleEJ1ZmZlciBvZiBwYWludFZlcnRleEJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHZlcnRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2wsIHByb2dyYW0sIHZlcnRleE9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHluYW1pY1ZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmRleEJ1ZmZlcikge1xuICAgICAgICAgICAgaW5kZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyMikge1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjIuYmluZCgpO1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjIuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2wsIHByb2dyYW0sIHZlcnRleE9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LmN1cnJlbnROdW1BdHRyaWJ1dGVzID0gbnVtTmV4dEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFvKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3QuZGVsZXRlVmVydGV4QXJyYXlPRVModGhpcy52YW8pO1xuICAgICAgICAgICAgdGhpcy52YW8gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWZXJ0ZXhBcnJheU9iamVjdDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtQ29sb3IsXG4gICAgVW5pZm9ybU1hdHJpeDRmLFxuICAgIFVuaWZvcm00ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi8uLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4uLy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgSGlsbHNoYWRlU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9oaWxsc2hhZGVfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgREVNRGF0YSBmcm9tICcuLi8uLi9kYXRhL2RlbV9kYXRhLmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5cbmV4cG9ydCB0eXBlIEhpbGxzaGFkZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X2xhdHJhbmdlJzogVW5pZm9ybTJmLFxuICAgICd1X2xpZ2h0JzogVW5pZm9ybTJmLFxuICAgICd1X3NoYWRvdyc6IFVuaWZvcm1Db2xvcixcbiAgICAndV9oaWdobGlnaHQnOiBVbmlmb3JtQ29sb3IsXG4gICAgJ3VfYWNjZW50JzogVW5pZm9ybUNvbG9yXG58fTtcblxuZXhwb3J0IHR5cGUgSGlsbHNoYWRlUHJlcGFyZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X2RpbWVuc2lvbic6IFVuaWZvcm0yZixcbiAgICAndV96b29tJzogVW5pZm9ybTFmLFxuICAgICd1X3VucGFjayc6IFVuaWZvcm00ZlxufH07XG5cbmNvbnN0IGhpbGxzaGFkZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEhpbGxzaGFkZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X2xhdHJhbmdlJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9sYXRyYW5nZSksXG4gICAgJ3VfbGlnaHQnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0KSxcbiAgICAndV9zaGFkb3cnOiBuZXcgVW5pZm9ybUNvbG9yKGNvbnRleHQsIGxvY2F0aW9ucy51X3NoYWRvdyksXG4gICAgJ3VfaGlnaGxpZ2h0JzogbmV3IFVuaWZvcm1Db2xvcihjb250ZXh0LCBsb2NhdGlvbnMudV9oaWdobGlnaHQpLFxuICAgICd1X2FjY2VudCc6IG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb25zLnVfYWNjZW50KVxufSk7XG5cbmNvbnN0IGhpbGxzaGFkZVByZXBhcmVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBIaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfZGltZW5zaW9uJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9kaW1lbnNpb24pLFxuICAgICd1X3pvb20nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3pvb20pLFxuICAgICd1X3VucGFjayc6IG5ldyBVbmlmb3JtNGYoY29udGV4dCwgbG9jYXRpb25zLnVfdW5wYWNrKVxufSk7XG5cbmNvbnN0IGhpbGxzaGFkZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICB0aWxlOiBUaWxlLFxuICAgIGxheWVyOiBIaWxsc2hhZGVTdHlsZUxheWVyLFxuICAgIG1hdHJpeDogP0Zsb2F0MzJBcnJheVxuKTogVW5pZm9ybVZhbHVlczxIaWxsc2hhZGVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCBzaGFkb3cgPSBsYXllci5wYWludC5nZXQoXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCIpO1xuICAgIGNvbnN0IGhpZ2hsaWdodCA9IGxheWVyLnBhaW50LmdldChcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIik7XG4gICAgY29uc3QgYWNjZW50ID0gbGF5ZXIucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiKTtcblxuICAgIGxldCBhemltdXRoYWwgPSBsYXllci5wYWludC5nZXQoJ2hpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uJykgKiAoTWF0aC5QSSAvIDE4MCk7XG4gICAgLy8gbW9kaWZ5IGF6aW11dGhhbCBhbmdsZSBieSBtYXAgcm90YXRpb24gaWYgbGlnaHQgaXMgYW5jaG9yZWQgYXQgdGhlIHZpZXdwb3J0XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3InKSA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgICAgICBhemltdXRoYWwgLT0gcGFpbnRlci50cmFuc2Zvcm0uYW5nbGU7XG4gICAgfVxuICAgIGNvbnN0IGFsaWduID0gIXBhaW50ZXIub3B0aW9ucy5tb3Zpbmc7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfbWF0cml4JzogbWF0cml4ID8gbWF0cml4IDogcGFpbnRlci50cmFuc2Zvcm0uY2FsY3VsYXRlUHJvak1hdHJpeCh0aWxlLnRpbGVJRC50b1Vud3JhcHBlZCgpLCBhbGlnbiksXG4gICAgICAgICd1X2ltYWdlJzogMCxcbiAgICAgICAgJ3VfbGF0cmFuZ2UnOiBnZXRUaWxlTGF0UmFuZ2UocGFpbnRlciwgdGlsZS50aWxlSUQpLFxuICAgICAgICAndV9saWdodCc6IFtsYXllci5wYWludC5nZXQoJ2hpbGxzaGFkZS1leGFnZ2VyYXRpb24nKSwgYXppbXV0aGFsXSxcbiAgICAgICAgJ3Vfc2hhZG93Jzogc2hhZG93LFxuICAgICAgICAndV9oaWdobGlnaHQnOiBoaWdobGlnaHQsXG4gICAgICAgICd1X2FjY2VudCc6IGFjY2VudFxuICAgIH07XG59O1xuXG5jb25zdCBoaWxsc2hhZGVVbmlmb3JtUHJlcGFyZVZhbHVlcyA9IChcbiAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIGRlbTogREVNRGF0YVxuKTogVW5pZm9ybVZhbHVlczxIaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXNUeXBlPiA9PiB7XG5cbiAgICBjb25zdCBzdHJpZGUgPSBkZW0uc3RyaWRlO1xuICAgIGNvbnN0IG1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgLy8gRmxpcCByZW5kZXJpbmcgYXQgeSBheGlzLlxuICAgIG1hdDQub3J0aG8obWF0cml4LCAwLCBFWFRFTlQsIC1FWFRFTlQsIDAsIDAsIDEpO1xuICAgIG1hdDQudHJhbnNsYXRlKG1hdHJpeCwgbWF0cml4LCBbMCwgLUVYVEVOVCwgMF0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICAgICAndV9pbWFnZSc6IDEsXG4gICAgICAgICd1X2RpbWVuc2lvbic6IFtzdHJpZGUsIHN0cmlkZV0sXG4gICAgICAgICd1X3pvb20nOiB0aWxlSUQub3ZlcnNjYWxlZFosXG4gICAgICAgICd1X3VucGFjayc6IGRlbS51bnBhY2tWZWN0b3JcbiAgICB9O1xufTtcblxuZnVuY3Rpb24gZ2V0VGlsZUxhdFJhbmdlKHBhaW50ZXI6IFBhaW50ZXIsIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgIC8vIGZvciBzY2FsaW5nIHRoZSBtYWduaXR1ZGUgb2YgYSBwb2ludHMgc2xvcGUgYnkgaXRzIGxhdGl0dWRlXG4gICAgY29uc3QgdGlsZXNBdFpvb20gPSBNYXRoLnBvdygyLCB0aWxlSUQuY2Fub25pY2FsLnopO1xuICAgIGNvbnN0IHkgPSB0aWxlSUQuY2Fub25pY2FsLnk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZSgwLCB5IC8gdGlsZXNBdFpvb20pLnRvTG5nTGF0KCkubGF0LFxuICAgICAgICBuZXcgTWVyY2F0b3JDb29yZGluYXRlKDAsICh5ICsgMSkgLyB0aWxlc0F0Wm9vbSkudG9MbmdMYXQoKS5sYXRdO1xufVxuXG5leHBvcnQge1xuICAgIGhpbGxzaGFkZVVuaWZvcm1zLFxuICAgIGhpbGxzaGFkZVByZXBhcmVVbmlmb3JtcyxcbiAgICBoaWxsc2hhZGVVbmlmb3JtVmFsdWVzLFxuICAgIGhpbGxzaGFkZVVuaWZvcm1QcmVwYXJlVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlLmpzJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IHtcbiAgICBoaWxsc2hhZGVVbmlmb3JtVmFsdWVzLFxuICAgIGhpbGxzaGFkZVVuaWZvcm1QcmVwYXJlVmFsdWVzXG59IGZyb20gJy4vcHJvZ3JhbS9oaWxsc2hhZGVfcHJvZ3JhbS5qcyc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSBIaWxsc2hhZGVTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IERFTURhdGEgZnJvbSAnLi4vZGF0YS9kZW1fZGF0YS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdIaWxsc2hhZGU7XG5cbmZ1bmN0aW9uIGRyYXdIaWxsc2hhZGUocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogSGlsbHNoYWRlU3R5bGVMYXllciwgdGlsZUlEczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAnb2Zmc2NyZWVuJyAmJiBwYWludGVyLnJlbmRlclBhc3MgIT09ICd0cmFuc2x1Y2VudCcpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG5cbiAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG5cbiAgICAvLyBXaGVuIHJlbmRlcmluZyB0byB0ZXh0dXJlLCBjb29yZGluYXRlcyBhcmUgYWxyZWFkeSBzb3J0ZWQ6IHByaW1hcnkgYnlcbiAgICAvLyBwcm94eSBpZCBhbmQgc2Vjb25kYXJ5IHNvcnQgaXMgYnkgWi5cbiAgICBjb25zdCByZW5kZXJpbmdUb1RleHR1cmUgPSBwYWludGVyLnRlcnJhaW4gJiYgcGFpbnRlci50ZXJyYWluLnJlbmRlcmluZ1RvVGV4dHVyZTtcbiAgICBjb25zdCBbc3RlbmNpbE1vZGVzLCBjb29yZHNdID0gcGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnICYmICFyZW5kZXJpbmdUb1RleHR1cmUgP1xuICAgICAgICBwYWludGVyLnN0ZW5jaWxDb25maWdGb3JPdmVybGFwKHRpbGVJRHMpIDogW3t9LCB0aWxlSURzXTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgaWYgKHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlICYmIHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ29mZnNjcmVlbicpIHtcbiAgICAgICAgICAgIHByZXBhcmVIaWxsc2hhZGUocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGRlcHRoTW9kZSwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsIGNvbG9yTW9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVuY2lsTW9kZSA9IHJlbmRlcmluZ1RvVGV4dHVyZSAmJiBwYWludGVyLnRlcnJhaW4gP1xuICAgICAgICAgICAgICAgIHBhaW50ZXIudGVycmFpbi5zdGVuY2lsTW9kZUZvclJUVE92ZXJsYXAoY29vcmQpIDogc3RlbmNpbE1vZGVzW2Nvb3JkLm92ZXJzY2FsZWRaXTtcbiAgICAgICAgICAgIHJlbmRlckhpbGxzaGFkZShwYWludGVyLCBjb29yZCwgdGlsZSwgbGF5ZXIsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgcGFpbnRlci53aWR0aCwgcGFpbnRlci5oZWlnaHRdKTtcblxuICAgIHBhaW50ZXIucmVzZXRTdGVuY2lsQ2xpcHBpbmdNYXNrcygpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJIaWxsc2hhZGUocGFpbnRlciwgY29vcmQsIHRpbGUsIGxheWVyLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCBmYm8gPSB0aWxlLmZibztcbiAgICBpZiAoIWZibykgcmV0dXJuO1xuICAgIHBhaW50ZXIucHJlcGFyZURyYXdUaWxlKGNvb3JkKTtcblxuICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ2hpbGxzaGFkZScpO1xuXG4gICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgZmJvLmNvbG9yQXR0YWNobWVudC5nZXQoKSk7XG5cbiAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gaGlsbHNoYWRlVW5pZm9ybVZhbHVlcyhwYWludGVyLCB0aWxlLCBsYXllciwgcGFpbnRlci50ZXJyYWluID8gY29vcmQucHJvak1hdHJpeCA6IG51bGwpO1xuXG4gICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICBjb25zdCB7dGlsZUJvdW5kc0J1ZmZlciwgdGlsZUJvdW5kc0luZGV4QnVmZmVyLCB0aWxlQm91bmRzU2VnbWVudHN9ID0gcGFpbnRlci5nZXRUaWxlQm91bmRzQnVmZmVycyh0aWxlKTtcblxuICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICB1bmlmb3JtVmFsdWVzLCBsYXllci5pZCwgdGlsZUJvdW5kc0J1ZmZlcixcbiAgICAgICAgdGlsZUJvdW5kc0luZGV4QnVmZmVyLCB0aWxlQm91bmRzU2VnbWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZURFTVRleHR1cmUocGFpbnRlcjogUGFpbnRlciwgdGlsZTogVGlsZSwgZGVtOiBERU1EYXRhKSB7XG4gICAgaWYgKCF0aWxlLm5lZWRzREVNVGV4dHVyZVVwbG9hZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICBjb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldChmYWxzZSk7XG4gICAgY29uc3QgdGV4dHVyZVN0cmlkZSA9IGRlbS5zdHJpZGU7XG4gICAgdGlsZS5kZW1UZXh0dXJlID0gdGlsZS5kZW1UZXh0dXJlIHx8IHBhaW50ZXIuZ2V0VGlsZVRleHR1cmUodGV4dHVyZVN0cmlkZSk7XG4gICAgY29uc3QgcGl4ZWxEYXRhID0gZGVtLmdldFBpeGVscygpO1xuICAgIGlmICh0aWxlLmRlbVRleHR1cmUpIHtcbiAgICAgICAgdGlsZS5kZW1UZXh0dXJlLnVwZGF0ZShwaXhlbERhdGEsIHtwcmVtdWx0aXBseTogZmFsc2V9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aWxlLmRlbVRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCBwaXhlbERhdGEsIGdsLlJHQkEsIHtwcmVtdWx0aXBseTogZmFsc2V9KTtcbiAgICB9XG4gICAgdGlsZS5uZWVkc0RFTVRleHR1cmVVcGxvYWQgPSBmYWxzZTtcbn1cblxuLy8gaGlsbHNoYWRlIHJlbmRlcmluZyBpcyBkb25lIGluIHR3byBzdGVwcy4gdGhlIHByZXBhcmUgc3RlcCBmaXJzdCBjYWxjdWxhdGVzIHRoZSBzbG9wZSBvZiB0aGUgdGVycmFpbiBpbiB0aGUgeCBhbmQgeVxuLy8gZGlyZWN0aW9ucyBmb3IgZWFjaCBwaXhlbCwgYW5kIHNhdmVzIHRob3NlIHZhbHVlcyB0byBhIGZyYW1lYnVmZmVyIHRleHR1cmUgaW4gdGhlIHIgYW5kIGcgY2hhbm5lbHMuXG5mdW5jdGlvbiBwcmVwYXJlSGlsbHNoYWRlKHBhaW50ZXIsIHRpbGUsIGxheWVyLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBpZiAoIXRpbGUuZGVtKSByZXR1cm47XG4gICAgY29uc3QgZGVtOiBERU1EYXRhID0gdGlsZS5kZW07XG5cbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUxKTtcbiAgICBwcmVwYXJlREVNVGV4dHVyZShwYWludGVyLCB0aWxlLCBkZW0pO1xuICAgIGFzc2VydCh0aWxlLmRlbVRleHR1cmUpO1xuICAgIGlmICghdGlsZS5kZW1UZXh0dXJlKSByZXR1cm47IC8vIFNpbGVuY2UgZmxvdy5cbiAgICB0aWxlLmRlbVRleHR1cmUuYmluZChnbC5ORUFSRVNULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICBjb25zdCB0aWxlU2l6ZSA9IGRlbS5kaW07XG5cbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICBsZXQgZmJvID0gdGlsZS5mYm87XG4gICAgaWYgKCFmYm8pIHtcbiAgICAgICAgY29uc3QgcmVuZGVyVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHt3aWR0aDogdGlsZVNpemUsIGhlaWdodDogdGlsZVNpemUsIGRhdGE6IG51bGx9LCBnbC5SR0JBKTtcbiAgICAgICAgcmVuZGVyVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgZmJvID0gdGlsZS5mYm8gPSBjb250ZXh0LmNyZWF0ZUZyYW1lYnVmZmVyKHRpbGVTaXplLCB0aWxlU2l6ZSwgdHJ1ZSk7XG4gICAgICAgIGZiby5jb2xvckF0dGFjaG1lbnQuc2V0KHJlbmRlclRleHR1cmUudGV4dHVyZSk7XG4gICAgfVxuXG4gICAgY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KGZiby5mcmFtZWJ1ZmZlcik7XG4gICAgY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHRpbGVTaXplLCB0aWxlU2l6ZV0pO1xuXG4gICAgY29uc3Qge3RpbGVCb3VuZHNCdWZmZXIsIHRpbGVCb3VuZHNJbmRleEJ1ZmZlciwgdGlsZUJvdW5kc1NlZ21lbnRzfSA9IHBhaW50ZXIuZ2V0TWVyY2F0b3JUaWxlQm91bmRzQnVmZmVycygpO1xuXG4gICAgcGFpbnRlci51c2VQcm9ncmFtKCdoaWxsc2hhZGVQcmVwYXJlJykuZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsXG4gICAgICAgIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICBoaWxsc2hhZGVVbmlmb3JtUHJlcGFyZVZhbHVlcyh0aWxlLnRpbGVJRCwgZGVtKSxcbiAgICAgICAgbGF5ZXIuaWQsIHRpbGVCb3VuZHNCdWZmZXIsXG4gICAgICAgIHRpbGVCb3VuZHNJbmRleEJ1ZmZlciwgdGlsZUJvdW5kc1NlZ21lbnRzKTtcblxuICAgIHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlID0gZmFsc2U7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3JlbmRlci91bmlmb3JtX2JpbmRpbmcuanMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3JlbmRlci91bmlmb3JtX2JpbmRpbmcuanMnO1xuXG5leHBvcnQgdHlwZSBUZXJyYWluUmFzdGVyVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfaW1hZ2UwJzogVW5pZm9ybTFpLFxuICAgICd1X3NraXJ0X2hlaWdodCc6IFVuaWZvcm0xZlxufH07XG5cbmNvbnN0IHRlcnJhaW5SYXN0ZXJVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBUZXJyYWluUmFzdGVyVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2ltYWdlMCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UwKSxcbiAgICAndV9za2lydF9oZWlnaHQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NraXJ0X2hlaWdodClcbn0pO1xuXG5jb25zdCB0ZXJyYWluUmFzdGVyVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBza2lydEhlaWdodDogbnVtYmVyXG4pOiBVbmlmb3JtVmFsdWVzPFRlcnJhaW5SYXN0ZXJVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X2ltYWdlMCc6IDAsXG4gICAgJ3Vfc2tpcnRfaGVpZ2h0Jzogc2tpcnRIZWlnaHRcbn0pO1xuXG5leHBvcnQge3RlcnJhaW5SYXN0ZXJVbmlmb3JtcywgdGVycmFpblJhc3RlclVuaWZvcm1WYWx1ZXN9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtTWF0cml4NGYsXG4gICAgVW5pZm9ybTFmXG59IGZyb20gJy4uL3JlbmRlci91bmlmb3JtX2JpbmRpbmcuanMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3JlbmRlci91bmlmb3JtX2JpbmRpbmcuanMnO1xuXG5leHBvcnQgdHlwZSBHbG9iZVJhc3RlclVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfcHJval9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfZ2xvYmVfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X21lcmNfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3pvb21fdHJhbnNpdGlvbic6IFVuaWZvcm0xZixcbiAgICAndV9tZXJjX2NlbnRlcic6IFVuaWZvcm0yZixcbiAgICAndV9pbWFnZTAnOiBVbmlmb3JtMWlcbnx9O1xuXG5leHBvcnQgdHlwZSBBdG1vc3BoZXJlVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9jZW50ZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfcmFkaXVzJzogVW5pZm9ybTFmLFxuICAgICd1X3NjcmVlbl9zaXplJzogVW5pZm9ybTJmLFxuICAgICd1X3BpeGVsX3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWYsXG4gICAgJ3VfZmFkZW91dF9yYW5nZSc6IFVuaWZvcm0xZixcbiAgICAndV9zdGFydF9jb2xvcic6IFVuaWZvcm0zZixcbiAgICAndV9lbmRfY29sb3InOiBVbmlmb3JtM2Zcbnx9O1xuXG5jb25zdCBnbG9iZVJhc3RlclVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEdsb2JlUmFzdGVyVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfcHJval9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X3Byb2pfbWF0cml4KSxcbiAgICAndV9nbG9iZV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2dsb2JlX21hdHJpeCksXG4gICAgJ3VfbWVyY19tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21lcmNfbWF0cml4KSxcbiAgICAndV96b29tX3RyYW5zaXRpb24nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3pvb21fdHJhbnNpdGlvbiksXG4gICAgJ3VfbWVyY19jZW50ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X21lcmNfY2VudGVyKSxcbiAgICAndV9pbWFnZTAnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlMClcbn0pO1xuXG5jb25zdCBhdG1vc3BoZXJlVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQXRtb3NwaGVyZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2NlbnRlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfY2VudGVyKSxcbiAgICAndV9yYWRpdXMnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3JhZGl1cyksXG4gICAgJ3Vfc2NyZWVuX3NpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjcmVlbl9zaXplKSxcbiAgICAndV9waXhlbF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfcmF0aW8pLFxuICAgICd1X29wYWNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X29wYWNpdHkpLFxuICAgICd1X2ZhZGVvdXRfcmFuZ2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGVvdXRfcmFuZ2UpLFxuICAgICd1X3N0YXJ0X2NvbG9yJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9zdGFydF9jb2xvciksXG4gICAgJ3VfZW5kX2NvbG9yJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9lbmRfY29sb3IpXG59KTtcblxuY29uc3QgZ2xvYmVSYXN0ZXJVbmlmb3JtVmFsdWVzID0gKFxuICAgIHByb2pNYXRyaXg6IEFycmF5PG51bWJlcj4sXG4gICAgZ2xvYmVNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBnbG9iZU1lcmNhdG9yTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgem9vbVRyYW5zaXRpb246IG51bWJlcixcbiAgICBtZXJjQ2VudGVyOiBbbnVtYmVyLCBudW1iZXJdXG4pOiBVbmlmb3JtVmFsdWVzPEdsb2JlUmFzdGVyVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X3Byb2pfbWF0cml4JzogRmxvYXQzMkFycmF5LmZyb20ocHJvak1hdHJpeCksXG4gICAgJ3VfZ2xvYmVfbWF0cml4JzogZ2xvYmVNYXRyaXgsXG4gICAgJ3VfbWVyY19tYXRyaXgnOiBnbG9iZU1lcmNhdG9yTWF0cml4LFxuICAgICd1X3pvb21fdHJhbnNpdGlvbic6IHpvb21UcmFuc2l0aW9uLFxuICAgICd1X21lcmNfY2VudGVyJzogbWVyY0NlbnRlcixcbiAgICAndV9pbWFnZTAnOiAwXG59KTtcblxuY29uc3QgYXRtb3NwaGVyZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgY2VudGVyOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIHJhZGl1czogbnVtYmVyLFxuICAgIHNjcmVlblNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcGl4ZWxSYXRpbzogbnVtYmVyLFxuICAgIG9wYWNpdHk6IG51bWJlcixcbiAgICBmYWRlb3V0UmFuZ2U6IG51bWJlcixcbiAgICBzdGFydENvbG9yOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZW5kQ29sb3I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuKTogVW5pZm9ybVZhbHVlczxBdG1vc3BoZXJlVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X2NlbnRlcic6IGNlbnRlcixcbiAgICAndV9yYWRpdXMnOiByYWRpdXMsXG4gICAgJ3Vfc2NyZWVuX3NpemUnOiBzY3JlZW5TaXplLFxuICAgICd1X3BpeGVsX3JhdGlvJzogcGl4ZWxSYXRpbyxcbiAgICAndV9vcGFjaXR5Jzogb3BhY2l0eSxcbiAgICAndV9mYWRlb3V0X3JhbmdlJzogZmFkZW91dFJhbmdlLFxuICAgICd1X3N0YXJ0X2NvbG9yJzogc3RhcnRDb2xvcixcbiAgICAndV9lbmRfY29sb3InOiBlbmRDb2xvcixcbn0pO1xuXG5leHBvcnQge2dsb2JlUmFzdGVyVW5pZm9ybXMsIGdsb2JlUmFzdGVyVW5pZm9ybVZhbHVlcywgYXRtb3NwaGVyZVVuaWZvcm1zLCBhdG1vc3BoZXJlVW5pZm9ybVZhbHVlc307XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUuanMnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZS5qcyc7XG5pbXBvcnQge3RlcnJhaW5SYXN0ZXJVbmlmb3JtVmFsdWVzfSBmcm9tICcuL3RlcnJhaW5fcmFzdGVyX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtnbG9iZVJhc3RlclVuaWZvcm1WYWx1ZXN9IGZyb20gJy4vZ2xvYmVfcmFzdGVyX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtUZXJyYWlufSBmcm9tICcuL3RlcnJhaW4uanMnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7bWVyY2F0b3JYZnJvbUxuZywgbWVyY2F0b3JZZnJvbUxhdH0gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9yZW5kZXIvcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlLmpzJztcbmltcG9ydCB7T3ZlcnNjYWxlZFRpbGVJRCwgQ2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZS5qcyc7XG5pbXBvcnQge1xuICAgIGNhbGN1bGF0ZUdsb2JlTWF0cml4LFxuICAgIGNhbGN1bGF0ZUdsb2JlTWVyY2F0b3JNYXRyaXgsXG4gICAgZ2xvYmVCdWZmZXJzRm9yVGlsZU1lc2gsXG4gICAgZ2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbixcbiAgICBnbG9iZU1hdHJpeEZvclRpbGUsXG4gICAgZ2xvYmVQb2xlTWF0cml4Rm9yVGlsZVxufSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9nbG9iZS5qcyc7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9leHRlbmQuanMnO1xuXG5leHBvcnQge1xuICAgIGRyYXdUZXJyYWluUmFzdGVyLFxuICAgIGRyYXdUZXJyYWluRGVwdGhcbn07XG5cbnR5cGUgREVNQ2hhaW4gPSB7XG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgcGhhc2U6IG51bWJlcixcbiAgICBkdXJhdGlvbjogbnVtYmVyLCAgIC8vIEludGVycG9sYXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gICAgZnJvbTogVGlsZSxcbiAgICB0bzogVGlsZSxcbiAgICBxdWV1ZWQ6ID9UaWxlXG59O1xuXG5jbGFzcyBWZXJ0ZXhNb3JwaGluZyB7XG4gICAgb3BlcmF0aW9uczoge1tzdHJpbmcgfCBudW1iZXJdOiBERU1DaGFpbiB9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIG5ld01vcnBoaW5nKGtleTogbnVtYmVyLCBmcm9tOiBUaWxlLCB0bzogVGlsZSwgbm93OiBudW1iZXIsIGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgYXNzZXJ0KGZyb20uZGVtVGV4dHVyZSAmJiB0by5kZW1UZXh0dXJlKTtcbiAgICAgICAgYXNzZXJ0KGZyb20udGlsZUlELmtleSAhPT0gdG8udGlsZUlELmtleSk7XG5cbiAgICAgICAgaWYgKGtleSBpbiB0aGlzLm9wZXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wID0gdGhpcy5vcGVyYXRpb25zW2tleV07XG4gICAgICAgICAgICBhc3NlcnQob3AuZnJvbSAmJiBvcC50byk7XG4gICAgICAgICAgICAvLyBRdWV1ZSB0aGUgdGFyZ2V0IHRpbGUgdW5sZXNzIGl0J3MgYmVpbmcgbW9ycGhlZCB0byBhbHJlYWR5XG4gICAgICAgICAgICBpZiAob3AudG8udGlsZUlELmtleSAhPT0gdG8udGlsZUlELmtleSlcbiAgICAgICAgICAgICAgICBvcC5xdWV1ZWQgPSB0bztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uc1trZXldID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogbm93LFxuICAgICAgICAgICAgICAgIHBoYXNlOiAwLjAsXG4gICAgICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgICAgICBxdWV1ZWQ6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRNb3JwaFZhbHVlc0ZvclByb3h5KGtleTogbnVtYmVyKTogP3tmcm9tOiBUaWxlLCB0bzogVGlsZSwgcGhhc2U6IG51bWJlcn0ge1xuICAgICAgICBpZiAoIShrZXkgaW4gdGhpcy5vcGVyYXRpb25zKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG9wID0gdGhpcy5vcGVyYXRpb25zW2tleV07XG4gICAgICAgIGNvbnN0IGZyb20gPSBvcC5mcm9tO1xuICAgICAgICBjb25zdCB0byA9IG9wLnRvO1xuICAgICAgICBhc3NlcnQoZnJvbSAmJiB0byk7XG5cbiAgICAgICAgcmV0dXJuIHtmcm9tLCB0bywgcGhhc2U6IG9wLnBoYXNlfTtcbiAgICB9XG5cbiAgICB1cGRhdGUobm93OiBudW1iZXIpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5vcGVyYXRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBvcCA9IHRoaXMub3BlcmF0aW9uc1trZXldO1xuICAgICAgICAgICAgYXNzZXJ0KG9wLmZyb20gJiYgb3AudG8pO1xuXG4gICAgICAgICAgICBvcC5waGFzZSA9IChub3cgLSBvcC5zdGFydFRpbWUpIC8gb3AuZHVyYXRpb247XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBxdWV1ZWQgb3BlcmF0aW9uIGlmIHRoZSBjdXJyZW50IG9uZSBpcyBmaW5pc2hlZCBvciB0aGUgZGF0YSBoYXMgZXhwaXJlZFxuICAgICAgICAgICAgd2hpbGUgKG9wLnBoYXNlID49IDEuMCB8fCAhdGhpcy5fdmFsaWRPcChvcCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX25leHRPcChvcCwgbm93KSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcGVyYXRpb25zW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9uZXh0T3Aob3A6IERFTUNoYWluLCBub3c6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW9wLnF1ZXVlZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgb3AuZnJvbSA9IG9wLnRvO1xuICAgICAgICBvcC50byA9IG9wLnF1ZXVlZDtcbiAgICAgICAgb3AucXVldWVkID0gbnVsbDtcbiAgICAgICAgb3AucGhhc2UgPSAwLjA7XG4gICAgICAgIG9wLnN0YXJ0VGltZSA9IG5vdztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgX3ZhbGlkT3Aob3A6IERFTUNoYWluKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBvcC5mcm9tLmhhc0RhdGEoKSAmJiBvcC50by5oYXNEYXRhKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkZW1UaWxlQ2hhbmdlZChwcmV2OiA/VGlsZSwgbmV4dDogP1RpbGUpOiBib29sZWFuIHtcbiAgICBpZiAocHJldiA9PSBudWxsIHx8IG5leHQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghcHJldi5oYXNEYXRhKCkgfHwgIW5leHQuaGFzRGF0YSgpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHByZXYuZGVtVGV4dHVyZSA9PSBudWxsIHx8IG5leHQuZGVtVGV4dHVyZSA9PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHByZXYudGlsZUlELmtleSAhPT0gbmV4dC50aWxlSUQua2V5O1xufVxuXG5jb25zdCB2ZXJ0ZXhNb3JwaGluZyA9IG5ldyBWZXJ0ZXhNb3JwaGluZygpO1xuY29uc3QgU0hBREVSX0RFRkFVTFQgPSAwO1xuY29uc3QgU0hBREVSX01PUlBISU5HID0gMTtcbmNvbnN0IFNIQURFUl9URVJSQUlOX1dJUkVGUkFNRSA9IDI7XG5jb25zdCBkZWZhdWx0RHVyYXRpb24gPSAyNTA7XG5cbmNvbnN0IHNoYWRlckRlZmluZXMgPSB7XG4gICAgXCIwXCI6IG51bGwsXG4gICAgXCIxXCI6ICdURVJSQUlOX1ZFUlRFWF9NT1JQSElORycsXG4gICAgXCIyXCI6ICdURVJSQUlOX1dJUkVGUkFNRSdcbn07XG5cbmZ1bmN0aW9uIGRyYXdUZXJyYWluRm9yR2xvYmUocGFpbnRlcjogUGFpbnRlciwgdGVycmFpbjogVGVycmFpbiwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCB0aWxlSURzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPiwgbm93OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGxldCBwcm9ncmFtLCBwcm9ncmFtTW9kZTtcbiAgICBjb25zdCBzaG93V2lyZWZyYW1lID0gcGFpbnRlci5vcHRpb25zLnNob3dUZXJyYWluV2lyZWZyYW1lID8gU0hBREVSX1RFUlJBSU5fV0lSRUZSQU1FIDogU0hBREVSX0RFRkFVTFQ7XG5cbiAgICBjb25zdCBzZXRTaGFkZXJNb2RlID0gKG1vZGUsIGlzV2lyZWZyYW1lKSA9PiB7XG4gICAgICAgIGlmIChwcm9ncmFtTW9kZSA9PT0gbW9kZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgZGVmaW5lcyA9IChbXTogYW55KTtcbiAgICAgICAgaWYgKGlzV2lyZWZyYW1lKSB7XG4gICAgICAgICAgICBkZWZpbmVzLnB1c2goc2hhZGVyRGVmaW5lc1tzaG93V2lyZWZyYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmaW5lcy5wdXNoKHNoYWRlckRlZmluZXNbbW9kZV0pO1xuICAgICAgICBkZWZpbmVzLnB1c2goJ1BST0pFQ1RJT05fR0xPQkVfVklFVycpO1xuICAgICAgICBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdnbG9iZVJhc3RlcicsIG51bGwsIGRlZmluZXMpO1xuICAgICAgICBwcm9ncmFtTW9kZSA9IG1vZGU7XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuICAgIGNvbnN0IGRlcHRoTW9kZSA9IG5ldyBEZXB0aE1vZGUoZ2wuTEVRVUFMLCBEZXB0aE1vZGUuUmVhZFdyaXRlLCBwYWludGVyLmRlcHRoUmFuZ2VGb3IzRCk7XG4gICAgdmVydGV4TW9ycGhpbmcudXBkYXRlKG5vdyk7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCBnbG9iZU1hdHJpeCA9IGNhbGN1bGF0ZUdsb2JlTWF0cml4KHRyLCB0ci53b3JsZFNpemUpO1xuICAgIGNvbnN0IGdsb2JlTWVyY2F0b3JNYXRyaXggPSBjYWxjdWxhdGVHbG9iZU1lcmNhdG9yTWF0cml4KHRyKTtcbiAgICBjb25zdCBtZXJjYXRvckNlbnRlciA9IFttZXJjYXRvclhmcm9tTG5nKHRyLmNlbnRlci5sbmcpLCBtZXJjYXRvcllmcm9tTGF0KHRyLmNlbnRlci5sYXQpXTtcbiAgICBjb25zdCBiYXRjaGVzID0gc2hvd1dpcmVmcmFtZSA/IFtmYWxzZSwgdHJ1ZV0gOiBbZmFsc2VdO1xuICAgIGNvbnN0IHNoYXJlZEJ1ZmZlcnMgPSBwYWludGVyLmdsb2JlU2hhcmVkQnVmZmVycztcblxuICAgIGJhdGNoZXMuZm9yRWFjaChpc1dpcmVmcmFtZSA9PiB7XG4gICAgICAgIC8vIFRoaXMgY29kZSBhc3N1bWVzIHRoZSByZW5kZXJpbmcgaXMgYmF0Y2hlZCBpbnRvIG1lc2ggdGVycmFpbiBhbmQgdGhlbiB3aXJlZnJhbWVcbiAgICAgICAgLy8gdGVycmFpbiAoaWYgYXBwbGljYWJsZSkgc28gdGhhdCB0aGlzIGlzIGVub3VnaCB0byBlbnN1cmUgdGhlIGNvcnJlY3QgcHJvZ3JhbSBpc1xuICAgICAgICAvLyBzZXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbSBvbmUgdG8gdGhlIG90aGVyLlxuICAgICAgICBwcm9ncmFtTW9kZSA9IC0xO1xuXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZSA9IGlzV2lyZWZyYW1lID8gZ2wuTElORVMgOiBnbC5UUklBTkdMRVM7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb29yZCBvZiB0aWxlSURzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgICAgICBjb25zdCB0aWxlcyA9IE1hdGgucG93KDIsIGNvb3JkLmNhbm9uaWNhbC56KTtcbiAgICAgICAgICAgIGNvbnN0IFtncmlkQnVmZmVyLCBwb2xlQnVmZmVyXSA9IGdsb2JlQnVmZmVyc0ZvclRpbGVNZXNoKHBhaW50ZXIsIHRpbGUsIGNvb3JkLCB0aWxlcyk7XG4gICAgICAgICAgICBjb25zdCBzdGVuY2lsTW9kZSA9IFN0ZW5jaWxNb2RlLmRpc2FibGVkO1xuXG4gICAgICAgICAgICBjb25zdCBwcmV2RGVtVGlsZSA9IHRlcnJhaW4ucHJldlRlcnJhaW5UaWxlRm9yVGlsZVtjb29yZC5rZXldO1xuICAgICAgICAgICAgY29uc3QgbmV4dERlbVRpbGUgPSB0ZXJyYWluLnRlcnJhaW5UaWxlRm9yVGlsZVtjb29yZC5rZXldO1xuXG4gICAgICAgICAgICBpZiAoZGVtVGlsZUNoYW5nZWQocHJldkRlbVRpbGUsIG5leHREZW1UaWxlKSkge1xuICAgICAgICAgICAgICAgIHZlcnRleE1vcnBoaW5nLm5ld01vcnBoaW5nKGNvb3JkLmtleSwgcHJldkRlbVRpbGUsIG5leHREZW1UaWxlLCBub3csIGRlZmF1bHREdXJhdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJpbmQgdGhlIG1haW4gZHJhcGVkIHRleHR1cmVcbiAgICAgICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgY29uc3QgbW9ycGggPSB2ZXJ0ZXhNb3JwaGluZy5nZXRNb3JwaFZhbHVlc0ZvclByb3h5KGNvb3JkLmtleSk7XG4gICAgICAgICAgICBjb25zdCBzaGFkZXJNb2RlID0gbW9ycGggPyBTSEFERVJfTU9SUEhJTkcgOiBTSEFERVJfREVGQVVMVDtcbiAgICAgICAgICAgIGNvbnN0IGVsZXZhdGlvbk9wdGlvbnMgPSB7fTtcblxuICAgICAgICAgICAgaWYgKG1vcnBoKSB7XG4gICAgICAgICAgICAgICAgZXh0ZW5kKGVsZXZhdGlvbk9wdGlvbnMsIHttb3JwaGluZzoge3NyY0RlbVRpbGU6IG1vcnBoLmZyb20sIGRzdERlbVRpbGU6IG1vcnBoLnRvLCBwaGFzZTogZWFzZUN1YmljSW5PdXQobW9ycGgucGhhc2UpfX0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwb3NNYXRyaXggPSBnbG9iZU1hdHJpeEZvclRpbGUoY29vcmQuY2Fub25pY2FsLCBnbG9iZU1hdHJpeCk7XG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gZ2xvYmVSYXN0ZXJVbmlmb3JtVmFsdWVzKFxuICAgICAgICAgICAgICAgIHRyLnByb2pNYXRyaXgsIHBvc01hdHJpeCwgZ2xvYmVNZXJjYXRvck1hdHJpeCxcbiAgICAgICAgICAgICAgICBnbG9iZVRvTWVyY2F0b3JUcmFuc2l0aW9uKHRyLnpvb20pLCBtZXJjYXRvckNlbnRlcik7XG5cbiAgICAgICAgICAgIHNldFNoYWRlck1vZGUoc2hhZGVyTW9kZSwgaXNXaXJlZnJhbWUpO1xuXG4gICAgICAgICAgICB0ZXJyYWluLnNldHVwRWxldmF0aW9uRHJhdyh0aWxlLCBwcm9ncmFtLCBlbGV2YXRpb25PcHRpb25zKTtcblxuICAgICAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2J1ZmZlciwgc2VnbWVudHNdID0gaXNXaXJlZnJhbWUgP1xuICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXJzLmdldFdpcmVmYW1lQnVmZmVyKHBhaW50ZXIuY29udGV4dCkgOlxuICAgICAgICAgICAgICAgICAgICBbc2hhcmVkQnVmZmVycy5ncmlkSW5kZXhCdWZmZXIsIHNoYXJlZEJ1ZmZlcnMuZ3JpZFNlZ21lbnRzXTtcblxuICAgICAgICAgICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBwcmltaXRpdmUsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmJhY2tDQ1csXG4gICAgICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIFwiZ2xvYmVfcmFzdGVyXCIsIGdyaWRCdWZmZXIsIGJ1ZmZlciwgc2VnbWVudHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzV2lyZWZyYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlsbCBwb2xlcyBieSBleHRyYXBvbGF0aW5nIGFkamFjZW50IGJvcmRlciB0aWxlc1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvbGVNYXRyaWNlcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgY29vcmQuY2Fub25pY2FsLnkgPT09IDAgPyBnbG9iZVBvbGVNYXRyaXhGb3JUaWxlKGNvb3JkLmNhbm9uaWNhbCwgZmFsc2UsIHRyKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvb3JkLmNhbm9uaWNhbC55ID09PSB0aWxlcyAtIDEgPyBnbG9iZVBvbGVNYXRyaXhGb3JUaWxlKGNvb3JkLmNhbm9uaWNhbCwgdHJ1ZSwgdHIpIDogbnVsbFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBvbGVNYXRyaXggb2YgcG9sZU1hdHJpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcG9sZU1hdHJpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2xlVW5pZm9ybXMgPSBnbG9iZVJhc3RlclVuaWZvcm1WYWx1ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0ci5wcm9qTWF0cml4LCBwb2xlTWF0cml4LCBwb2xlTWF0cml4LCAwLjAsIG1lcmNhdG9yQ2VudGVyKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcmVkQnVmZmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIHByaW1pdGl2ZSwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sZVVuaWZvcm1zLCBcImdsb2JlX3BvbGVfcmFzdGVyXCIsIHBvbGVCdWZmZXIsIHNoYXJlZEJ1ZmZlcnMucG9sZUluZGV4QnVmZmVyLCBzaGFyZWRCdWZmZXJzLnBvbGVTZWdtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZHJhd1RlcnJhaW5SYXN0ZXIocGFpbnRlcjogUGFpbnRlciwgdGVycmFpbjogVGVycmFpbiwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCB0aWxlSURzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPiwgbm93OiBudW1iZXIpIHtcbiAgICBpZiAocGFpbnRlci50cmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKSB7XG4gICAgICAgIGRyYXdUZXJyYWluRm9yR2xvYmUocGFpbnRlciwgdGVycmFpbiwgc291cmNlQ2FjaGUsIHRpbGVJRHMsIG5vdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGxldCBwcm9ncmFtLCBwcm9ncmFtTW9kZTtcbiAgICAgICAgY29uc3Qgc2hvd1dpcmVmcmFtZSA9IHBhaW50ZXIub3B0aW9ucy5zaG93VGVycmFpbldpcmVmcmFtZSA/IFNIQURFUl9URVJSQUlOX1dJUkVGUkFNRSA6IFNIQURFUl9ERUZBVUxUO1xuXG4gICAgICAgIGNvbnN0IHNldFNoYWRlck1vZGUgPSAobW9kZSwgaXNXaXJlZnJhbWUpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9ncmFtTW9kZSA9PT0gbW9kZSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBtb2RlcyA9IFtzaGFkZXJEZWZpbmVzW21vZGVdXTtcbiAgICAgICAgICAgIGlmIChpc1dpcmVmcmFtZSkgbW9kZXMucHVzaChzaGFkZXJEZWZpbmVzW3Nob3dXaXJlZnJhbWVdKTtcbiAgICAgICAgICAgIHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ3RlcnJhaW5SYXN0ZXInLCBudWxsLCBtb2Rlcyk7XG4gICAgICAgICAgICBwcm9ncmFtTW9kZSA9IG1vZGU7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IG5ldyBEZXB0aE1vZGUoZ2wuTEVRVUFMLCBEZXB0aE1vZGUuUmVhZFdyaXRlLCBwYWludGVyLmRlcHRoUmFuZ2VGb3IzRCk7XG4gICAgICAgIHZlcnRleE1vcnBoaW5nLnVwZGF0ZShub3cpO1xuICAgICAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgICAgICBjb25zdCBza2lydCA9IHNraXJ0SGVpZ2h0KHRyLnpvb20pICogdGVycmFpbi5leGFnZ2VyYXRpb24oKTtcblxuICAgICAgICBjb25zdCBiYXRjaGVzID0gc2hvd1dpcmVmcmFtZSA/IFtmYWxzZSwgdHJ1ZV0gOiBbZmFsc2VdO1xuXG4gICAgICAgIGJhdGNoZXMuZm9yRWFjaChpc1dpcmVmcmFtZSA9PiB7XG4gICAgICAgICAgICAvLyBUaGlzIGNvZGUgYXNzdW1lcyB0aGUgcmVuZGVyaW5nIGlzIGJhdGNoZWQgaW50byBtZXNoIHRlcnJhaW4gYW5kIHRoZW4gd2lyZWZyYW1lXG4gICAgICAgICAgICAvLyB0ZXJyYWluIChpZiBhcHBsaWNhYmxlKSBzbyB0aGF0IHRoaXMgaXMgZW5vdWdoIHRvIGVuc3VyZSB0aGUgY29ycmVjdCBwcm9ncmFtIGlzXG4gICAgICAgICAgICAvLyBzZXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbSBvbmUgdG8gdGhlIG90aGVyLlxuICAgICAgICAgICAgcHJvZ3JhbU1vZGUgPSAtMTtcblxuICAgICAgICAgICAgY29uc3QgcHJpbWl0aXZlID0gaXNXaXJlZnJhbWUgPyBnbC5MSU5FUyA6IGdsLlRSSUFOR0xFUztcbiAgICAgICAgICAgIGNvbnN0IFtidWZmZXIsIHNlZ21lbnRzXSA9IGlzV2lyZWZyYW1lID8gdGVycmFpbi5nZXRXaXJlZmFtZUJ1ZmZlcigpIDogW3RlcnJhaW4uZ3JpZEluZGV4QnVmZmVyLCB0ZXJyYWluLmdyaWRTZWdtZW50c107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgY29vcmQgb2YgdGlsZUlEcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGVuY2lsTW9kZSA9IFN0ZW5jaWxNb2RlLmRpc2FibGVkO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldkRlbVRpbGUgPSB0ZXJyYWluLnByZXZUZXJyYWluVGlsZUZvclRpbGVbY29vcmQua2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0RGVtVGlsZSA9IHRlcnJhaW4udGVycmFpblRpbGVGb3JUaWxlW2Nvb3JkLmtleV07XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVtVGlsZUNoYW5nZWQocHJldkRlbVRpbGUsIG5leHREZW1UaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhNb3JwaGluZy5uZXdNb3JwaGluZyhjb29yZC5rZXksIHByZXZEZW1UaWxlLCBuZXh0RGVtVGlsZSwgbm93LCBkZWZhdWx0RHVyYXRpb24pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEJpbmQgdGhlIG1haW4gZHJhcGVkIHRleHR1cmVcbiAgICAgICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UsIGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtb3JwaCA9IHZlcnRleE1vcnBoaW5nLmdldE1vcnBoVmFsdWVzRm9yUHJveHkoY29vcmQua2V5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGFkZXJNb2RlID0gbW9ycGggPyBTSEFERVJfTU9SUEhJTkcgOiBTSEFERVJfREVGQVVMVDtcbiAgICAgICAgICAgICAgICBsZXQgZWxldmF0aW9uT3B0aW9ucztcblxuICAgICAgICAgICAgICAgIGlmIChtb3JwaCkge1xuICAgICAgICAgICAgICAgICAgICBlbGV2YXRpb25PcHRpb25zID0ge21vcnBoaW5nOiB7c3JjRGVtVGlsZTogbW9ycGguZnJvbSwgZHN0RGVtVGlsZTogbW9ycGgudG8sIHBoYXNlOiBlYXNlQ3ViaWNJbk91dChtb3JwaC5waGFzZSl9fTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gdGVycmFpblJhc3RlclVuaWZvcm1WYWx1ZXMoY29vcmQucHJvak1hdHJpeCwgaXNFZGdlVGlsZShjb29yZC5jYW5vbmljYWwsIHRyLnJlbmRlcldvcmxkQ29waWVzKSA/IHNraXJ0IC8gMTAgOiBza2lydCk7XG4gICAgICAgICAgICAgICAgc2V0U2hhZGVyTW9kZShzaGFkZXJNb2RlLCBpc1dpcmVmcmFtZSk7XG5cbiAgICAgICAgICAgICAgICB0ZXJyYWluLnNldHVwRWxldmF0aW9uRHJhdyh0aWxlLCBwcm9ncmFtLCBlbGV2YXRpb25PcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIHBhaW50ZXIucHJlcGFyZURyYXdQcm9ncmFtKGNvbnRleHQsIHByb2dyYW0sIGNvb3JkLnRvVW53cmFwcGVkKCkpO1xuXG4gICAgICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIHByaW1pdGl2ZSwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuYmFja0NDVyxcbiAgICAgICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlcywgXCJ0ZXJyYWluX3Jhc3RlclwiLCB0ZXJyYWluLmdyaWRCdWZmZXIsIGJ1ZmZlciwgc2VnbWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdUZXJyYWluRGVwdGgocGFpbnRlcjogUGFpbnRlciwgdGVycmFpbjogVGVycmFpbiwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCB0aWxlSURzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgIGlmIChwYWludGVyLnRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFzc2VydChwYWludGVyLnJlbmRlclBhc3MgPT09ICdvZmZzY3JlZW4nKTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgY29udGV4dC5jbGVhcih7ZGVwdGg6IDF9KTtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCd0ZXJyYWluRGVwdGgnKTtcbiAgICBjb25zdCBkZXB0aE1vZGUgPSBuZXcgRGVwdGhNb2RlKGdsLkxFU1MsIERlcHRoTW9kZS5SZWFkV3JpdGUsIHBhaW50ZXIuZGVwdGhSYW5nZUZvcjNEKTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgdGlsZUlEcykge1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSB0ZXJyYWluUmFzdGVyVW5pZm9ybVZhbHVlcyhjb29yZC5wcm9qTWF0cml4LCAwKTtcbiAgICAgICAgdGVycmFpbi5zZXR1cEVsZXZhdGlvbkRyYXcodGlsZSwgcHJvZ3JhbSk7XG5cbiAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBTdGVuY2lsTW9kZS5kaXNhYmxlZCwgQ29sb3JNb2RlLnVuYmxlbmRlZCwgQ3VsbEZhY2VNb2RlLmJhY2tDQ1csXG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzLCBcInRlcnJhaW5fZGVwdGhcIiwgdGVycmFpbi5ncmlkQnVmZmVyLCB0ZXJyYWluLmdyaWRJbmRleEJ1ZmZlciwgdGVycmFpbi5ncmlkTm9Ta2lydFNlZ21lbnRzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNraXJ0SGVpZ2h0KHpvb20pIHtcbiAgICAvLyBTa2lydCBoZWlnaHQgY2FsY3VsYXRpb24gaXMgaGV1cmlzdGljOiBwcm92aWRlZCB2YWx1ZSBoaWRlc1xuICAgIC8vIHNlYW1zIGJldHdlZW4gdGlsZXMgYW5kIGl0IGlzIG5vdCB0b28gbGFyZ2U6IDkgYXQgem9vbSAyMiwgfjIwMDAwbSBhdCB6b29tIDAuXG4gICAgcmV0dXJuIDYgKiBNYXRoLnBvdygxLjUsIDIyIC0gem9vbSk7XG59XG5cbmZ1bmN0aW9uIGlzRWRnZVRpbGUoY2lkOiBDYW5vbmljYWxUaWxlSUQsIHJlbmRlcldvcmxkQ29waWVzOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbnVtVGlsZXMgPSAxIDw8IGNpZC56O1xuICAgIHJldHVybiAoIXJlbmRlcldvcmxkQ29waWVzICYmIChjaWQueCA9PT0gMCB8fCBjaWQueCA9PT0gbnVtVGlsZXMgLSAxKSkgfHwgY2lkLnkgPT09IDAgfHwgY2lkLnkgPT09IG51bVRpbGVzIC0gMTtcbn1cblxuZXhwb3J0IHtcbiAgICBWZXJ0ZXhNb3JwaGluZ1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7VW5pZm9ybU1hdHJpeDRmfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5cbmV4cG9ydCB0eXBlIENsaXBwaW5nTWFza1VuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmXG58fTtcblxuY29uc3QgY2xpcHBpbmdNYXNrVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQ2xpcHBpbmdNYXNrVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpXG59KTtcblxuY29uc3QgY2xpcHBpbmdNYXNrVW5pZm9ybVZhbHVlcyA9IChtYXRyaXg6IEZsb2F0MzJBcnJheSk6IFVuaWZvcm1WYWx1ZXM8Q2xpcHBpbmdNYXNrVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeFxufSk7XG5cbmV4cG9ydCB7Y2xpcHBpbmdNYXNrVW5pZm9ybXMsIGNsaXBwaW5nTWFza1VuaWZvcm1WYWx1ZXN9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQge2NsYW1wfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyLmpzJztcbmltcG9ydCBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcblxuZXhwb3J0IHR5cGUgUmFzdGVyRmFkZSA9IHt8XG4gICAgb3BhY2l0eTogbnVtYmVyLFxuICAgIG1peDogbnVtYmVyLFxufH07XG5cbmZ1bmN0aW9uIHJhc3RlckZhZGUodGlsZTogVGlsZSwgcGFyZW50VGlsZTogP1RpbGUsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sIGZhZGVEdXJhdGlvbjogbnVtYmVyKTogUmFzdGVyRmFkZSB7XG4gICAgaWYgKGZhZGVEdXJhdGlvbiA+IDApIHtcbiAgICAgICAgY29uc3Qgbm93ID0gYnJvd3Nlci5ub3coKTtcbiAgICAgICAgY29uc3Qgc2luY2VUaWxlID0gKG5vdyAtIHRpbGUudGltZUFkZGVkKSAvIGZhZGVEdXJhdGlvbjtcbiAgICAgICAgY29uc3Qgc2luY2VQYXJlbnQgPSBwYXJlbnRUaWxlID8gKG5vdyAtIHBhcmVudFRpbGUudGltZUFkZGVkKSAvIGZhZGVEdXJhdGlvbiA6IC0xO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpO1xuICAgICAgICBjb25zdCBpZGVhbFogPSB0cmFuc2Zvcm0uY292ZXJpbmdab29tTGV2ZWwoe1xuICAgICAgICAgICAgdGlsZVNpemU6IHNvdXJjZS50aWxlU2l6ZSxcbiAgICAgICAgICAgIHJvdW5kWm9vbTogc291cmNlLnJvdW5kWm9vbVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBpZiBubyBwYXJlbnQgb3IgcGFyZW50IGlzIG9sZGVyLCBmYWRlIGluOyBpZiBwYXJlbnQgaXMgeW91bmdlciwgZmFkZSBvdXRcbiAgICAgICAgY29uc3QgZmFkZUluID0gIXBhcmVudFRpbGUgfHwgTWF0aC5hYnMocGFyZW50VGlsZS50aWxlSUQub3ZlcnNjYWxlZFogLSBpZGVhbFopID4gTWF0aC5hYnModGlsZS50aWxlSUQub3ZlcnNjYWxlZFogLSBpZGVhbFopO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkT3BhY2l0eSA9IChmYWRlSW4gJiYgdGlsZS5yZWZyZXNoZWRVcG9uRXhwaXJhdGlvbikgPyAxIDogY2xhbXAoZmFkZUluID8gc2luY2VUaWxlIDogMSAtIHNpbmNlUGFyZW50LCAwLCAxKTtcblxuICAgICAgICAvLyB3ZSBkb24ndCBjcm9zc2ZhZGUgdGlsZXMgdGhhdCB3ZXJlIGp1c3QgcmVmcmVzaGVkIHVwb24gZXhwaXJpbmc6XG4gICAgICAgIC8vIG9uY2UgdGhleSdyZSBvbGQgZW5vdWdoIHRvIHBhc3MgdGhlIGNyb3NzZmFkaW5nIHRocmVzaG9sZFxuICAgICAgICAvLyAoZmFkZUR1cmF0aW9uKSwgdW5zZXQgdGhlIGByZWZyZXNoZWRVcG9uRXhwaXJhdGlvbmAgZmxhZyBzbyB3ZSBkb24ndFxuICAgICAgICAvLyBpbmNvcnJlY3RseSBmYWlsIHRvIGNyb3NzZmFkZSB0aGVtIHdoZW4gem9vbWluZ1xuICAgICAgICBpZiAodGlsZS5yZWZyZXNoZWRVcG9uRXhwaXJhdGlvbiAmJiBzaW5jZVRpbGUgPj0gMSkgdGlsZS5yZWZyZXNoZWRVcG9uRXhwaXJhdGlvbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwYXJlbnRUaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICAgICAgbWl4OiAxIC0gY2hpbGRPcGFjaXR5XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiBjaGlsZE9wYWNpdHksXG4gICAgICAgICAgICAgICAgbWl4OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICBtaXg6IDBcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHJhc3RlckZhZGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCBib3VuZHNBdHRyaWJ1dGVzIGZyb20gJy4uL2RhdGEvYm91bmRzX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHtSYXN0ZXJCb3VuZHNBcnJheSwgVHJpYW5nbGVJbmRleEFycmF5LCBMaW5lSW5kZXhBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQuanMnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUuanMnO1xuaW1wb3J0IFByb2dyYW0gZnJvbSAnLi4vcmVuZGVyL3Byb2dyYW0uanMnO1xuaW1wb3J0IHtVbmlmb3JtMWksIFVuaWZvcm0xZiwgVW5pZm9ybTJmLCBVbmlmb3JtM2YsIFVuaWZvcm00ZiwgVW5pZm9ybU1hdHJpeDRmfSBmcm9tICcuLi9yZW5kZXIvdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB7cHJlcGFyZURFTVRleHR1cmV9IGZyb20gJy4uL3JlbmRlci9kcmF3X2hpbGxzaGFkZS5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50LmpzJztcbmltcG9ydCB7Y2xhbXAsIHdhcm5PbmNlfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHt2ZWMzLCBtYXQ0LCB2ZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IGdldFdvcmtlclBvb2wgZnJvbSAnLi4vdXRpbC9nbG9iYWxfd29ya2VyX3Bvb2wuanMnO1xuaW1wb3J0IERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyLmpzJztcbmltcG9ydCBHZW9KU09OU291cmNlIGZyb20gJy4uL3NvdXJjZS9nZW9qc29uX3NvdXJjZS5qcyc7XG5pbXBvcnQgSW1hZ2VTb3VyY2UgZnJvbSAnLi4vc291cmNlL2ltYWdlX3NvdXJjZS5qcyc7XG5pbXBvcnQgUmFzdGVyREVNVGlsZVNvdXJjZSBmcm9tICcuLi9zb3VyY2UvcmFzdGVyX2RlbV90aWxlX3NvdXJjZS5qcyc7XG5pbXBvcnQgUmFzdGVyVGlsZVNvdXJjZSBmcm9tICcuLi9zb3VyY2UvcmFzdGVyX3RpbGVfc291cmNlLmpzJztcbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCB7RGVwdGhTdGVuY2lsQXR0YWNobWVudH0gZnJvbSAnLi4vZ2wvdmFsdWUuanMnO1xuaW1wb3J0IHtkcmF3VGVycmFpblJhc3RlciwgZHJhd1RlcnJhaW5EZXB0aH0gZnJvbSAnLi9kcmF3X3RlcnJhaW5fcmFzdGVyLmpzJztcbmltcG9ydCB0eXBlIFJhc3RlclN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvcmFzdGVyX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB7RWxldmF0aW9ufSBmcm9tICcuL2VsZXZhdGlvbi5qcyc7XG5pbXBvcnQgRnJhbWVidWZmZXIgZnJvbSAnLi4vZ2wvZnJhbWVidWZmZXIuanMnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlLmpzJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZS5qcyc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlLmpzJztcbmltcG9ydCB7Y2xpcHBpbmdNYXNrVW5pZm9ybVZhbHVlc30gZnJvbSAnLi4vcmVuZGVyL3Byb2dyYW0vY2xpcHBpbmdfbWFza19wcm9ncmFtLmpzJztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUsIHttZXJjYXRvclpmcm9tQWx0aXR1ZGV9IGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQgREVNRGF0YSBmcm9tICcuLi9kYXRhL2RlbV9kYXRhLmpzJztcbmltcG9ydCB7RHJhcGVSZW5kZXJNb2RlfSBmcm9tICcuLi9zdHlsZS90ZXJyYWluLmpzJztcbmltcG9ydCByYXN0ZXJGYWRlIGZyb20gJy4uL3JlbmRlci9yYXN0ZXJfZmFkZS5qcyc7XG5pbXBvcnQge2NyZWF0ZSBhcyBjcmVhdGVTb3VyY2V9IGZyb20gJy4uL3NvdXJjZS9zb3VyY2UuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwLmpzJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcmVuZGVyL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGUgZnJvbSAnLi4vc3R5bGUvc3R5bGUuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtTG9jYXRpb25zLCBVbmlmb3JtVmFsdWVzfSBmcm9tICcuLi9yZW5kZXIvdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtERU1FbmNvZGluZ30gZnJvbSAnLi4vZGF0YS9kZW1fZGF0YS5qcyc7XG5cbmNvbnN0IEdSSURfRElNID0gMTI4O1xuXG5jb25zdCBGQk9fUE9PTF9TSVpFID0gNTtcbmNvbnN0IFJFTkRFUl9DQUNIRV9NQVhfU0laRSA9IDUwO1xuXG50eXBlIFJlbmRlckJhdGNoID0ge1xuICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgZW5kOiBudW1iZXI7XG59XG5cbmNsYXNzIE1vY2tTb3VyY2VDYWNoZSBleHRlbmRzIFNvdXJjZUNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCkge1xuICAgICAgICBjb25zdCBzb3VyY2VTcGVjID0ge3R5cGU6ICdyYXN0ZXItZGVtJywgbWF4em9vbTogbWFwLnRyYW5zZm9ybS5tYXhab29tfTtcbiAgICAgICAgY29uc3Qgc291cmNlRGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKGdldFdvcmtlclBvb2woKSwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGNyZWF0ZVNvdXJjZSgnbW9jay1kZW0nLCBzb3VyY2VTcGVjLCBzb3VyY2VEaXNwYXRjaGVyLCBtYXAuc3R5bGUpO1xuXG4gICAgICAgIHN1cGVyKCdtb2NrLWRlbScsIHNvdXJjZSwgZmFsc2UpO1xuXG4gICAgICAgIHNvdXJjZS5zZXRFdmVudGVkUGFyZW50KHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX3NvdXJjZUxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgX2xvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm94eSBzb3VyY2UgY2FjaGUgZ2V0cyBpZGVhbCBzY3JlZW4gdGlsZSBjb3ZlciBjb29yZGluYXRlcy4gQWxsIHRoZSBvdGhlclxuICogc291cmNlIGNhY2hlcydzIGNvb3JkaW5hdGVzIGdldCBtYXBwZWQgdG8gc3VicmVjdHMgb2YgcHJveHkgY29vcmRpbmF0ZXMgKG9yXG4gKiB2aWNlIHZlcnNhLCBzdWJyZWN0cyBvZiBsYXJnZXIgdGlsZXMgZnJvbSBhbGwgc291cmNlIGNhY2hlcyBnZXQgbWFwcGVkIHRvXG4gKiBmdWxsIHByb3h5IHRpbGUpLiBUaGlzIGhhcHBlbnMgb24gZXZlcnkgZHJhdyBjYWxsIGluIFRlcnJhaW4udXBkYXRlVGlsZUJpbmRpbmcuXG4gKiBBcHByb2FjaCBpcyB1c2VkIGhlcmUgZm9yIHRlcnJhaW4gOiBhbGwgdGhlIHZpc2libGUgc291cmNlIHRpbGVzIG9mIGFsbCB0aGVcbiAqIHNvdXJjZSBjYWNoZXMgZ2V0IHJlbmRlcmVkIHRvIHByb3h5IHNvdXJjZSBjYWNoZSB0ZXh0dXJlcyBhbmQgdGhlbiBkcmFwZWQgb3ZlclxuICogdGVycmFpbi4gSXQgaXMgaW4gZnV0dXJlIHJldXNhYmxlIGZvciBoYW5kbGluZyBvdmVyc2NhbGxpbmcgYXMgYnVja2V0cyBjb3VsZCBiZVxuICogY29uc3RydWN0ZWQgb25seSBmb3IgcHJveHkgdGlsZSBjb250ZW50LCBub3QgZm9yIGZ1bGwgb3ZlcnNjYWxsZWQgdmVjdG9yIHRpbGUuXG4gKi9cbmNsYXNzIFByb3h5U291cmNlQ2FjaGUgZXh0ZW5kcyBTb3VyY2VDYWNoZSB7XG4gICAgcmVuZGVyQ2FjaGU6IEFycmF5PEZCTz47XG4gICAgcmVuZGVyQ2FjaGVQb29sOiBBcnJheTxudW1iZXI+O1xuICAgIHByb3h5Q2FjaGVkRkJPOiB7W3N0cmluZyB8IG51bWJlcl06IHtbc3RyaW5nIHwgbnVtYmVyXTogbnVtYmVyfX07XG5cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCkge1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGNyZWF0ZVNvdXJjZSgncHJveHknLCB7XG4gICAgICAgICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICAgICAgICBtYXh6b29tOiBtYXAudHJhbnNmb3JtLm1heFpvb21cbiAgICAgICAgfSwgbmV3IERpc3BhdGNoZXIoZ2V0V29ya2VyUG9vbCgpLCBudWxsKSwgbWFwLnN0eWxlKTtcblxuICAgICAgICBzdXBlcigncHJveHknLCBzb3VyY2UsIGZhbHNlKTtcblxuICAgICAgICBzb3VyY2Uuc2V0RXZlbnRlZFBhcmVudCh0aGlzKTtcblxuICAgICAgICAvLyBUaGlzIHNvdXJjZSBpcyBub3QgdG8gYmUgYWRkZWQgYXMgYSBtYXAgc291cmNlOiB3ZSB1c2UgaXQncyB0aWxlIG1hbmFnZW1lbnQuXG4gICAgICAgIC8vIEZvciB0aGF0LCBpbml0aWFsaXplIGludGVybmFsIHN0cnVjdHVyZXMgdXNlZCBmb3IgdGlsZSBjb3ZlciB1cGRhdGUuXG4gICAgICAgIHRoaXMubWFwID0gKCh0aGlzLmdldFNvdXJjZSgpOiBhbnkpOiBHZW9KU09OU291cmNlKS5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMudXNlZCA9IHRoaXMuX3NvdXJjZUxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVuZGVyQ2FjaGUgPSBbXTtcbiAgICAgICAgdGhpcy5yZW5kZXJDYWNoZVBvb2wgPSBbXTtcbiAgICAgICAgdGhpcy5wcm94eUNhY2hlZEZCTyA9IHt9O1xuICAgIH1cblxuICAgIC8vIE92ZXJyaWRlIGZvciB0cmFuc2llbnQgbmF0dXJlIG9mIGNvdmVyIGhlcmU6IGRvbid0IGNhY2hlIGFuZCByZXRhaW4uXG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgICB1cGRhdGUodHJhbnNmb3JtOiBUcmFuc2Zvcm0sIHRpbGVTaXplPzogbnVtYmVyLCB1cGRhdGVGb3JUZXJyYWluPzogYm9vbGVhbikge1xuICAgICAgICBpZiAodHJhbnNmb3JtLmZyZWV6ZVRpbGVDb3ZlcmFnZSkgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIGNvbnN0IGlkZWFsVGlsZUlEcyA9IHRyYW5zZm9ybS5jb3ZlcmluZ1RpbGVzKHtcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLl9zb3VyY2UudGlsZVNpemUsXG4gICAgICAgICAgICBtaW56b29tOiB0aGlzLl9zb3VyY2UubWluem9vbSxcbiAgICAgICAgICAgIG1heHpvb206IHRoaXMuX3NvdXJjZS5tYXh6b29tLFxuICAgICAgICAgICAgcm91bmRab29tOiB0aGlzLl9zb3VyY2Uucm91bmRab29tLFxuICAgICAgICAgICAgcmVwYXJzZU92ZXJzY2FsZWQ6IHRoaXMuX3NvdXJjZS5yZXBhcnNlT3ZlcnNjYWxlZFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpbmNvbWluZzoge1tzdHJpbmddOiBzdHJpbmd9ID0gaWRlYWxUaWxlSURzLnJlZHVjZSgoYWNjLCB0aWxlSUQpID0+IHtcbiAgICAgICAgICAgIGFjY1t0aWxlSUQua2V5XSA9ICcnO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl90aWxlc1t0aWxlSUQua2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSBuZXcgVGlsZSh0aWxlSUQsIHRoaXMuX3NvdXJjZS50aWxlU2l6ZSAqIHRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKSwgdHJhbnNmb3JtLnRpbGVab29tKTtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGlsZXNbdGlsZUlELmtleV0gPSB0aWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGlmICghKGlkIGluIGluY29taW5nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJlZUZCTyhpZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGlsZXNbaWRdLnVubG9hZFZlY3RvckRhdGEoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnJlZUZCTyhpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZib3MgPSB0aGlzLnByb3h5Q2FjaGVkRkJPW2lkXTtcbiAgICAgICAgaWYgKGZib3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZmJvSWRzID0gKChPYmplY3QudmFsdWVzKGZib3MpOiBhbnkpOiBBcnJheTxudW1iZXI+KTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ2FjaGVQb29sLnB1c2goLi4uZmJvSWRzKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnByb3h5Q2FjaGVkRkJPW2lkXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlYWxsb2NSZW5kZXJDYWNoZSgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJDYWNoZS5mb3JFYWNoKGZibyA9PiBmYm8uZmIuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDYWNoZSA9IFtdO1xuICAgICAgICB0aGlzLnJlbmRlckNhY2hlUG9vbCA9IFtdO1xuICAgICAgICB0aGlzLnByb3h5Q2FjaGVkRkJPID0ge307XG4gICAgfVxufVxuXG4vKipcbiAqIENhbm9uaWNhbCwgd3JhcCBhbmQgb3ZlcnNjYWxlZFogY29udGFpbiBpbmZvcm1hdGlvbiBvZiBvcmlnaW5hbCBzb3VyY2UgY2FjaGUgdGlsZS5cbiAqIFRoaXMgdGlsZSBnZXRzIG9ydGhvLXJlbmRlcmVkIHRvIHByb3h5IHRpbGUgKGRlZmluZWQgYnkgcHJveHlUaWxlS2V5KS5cbiAqIGBwb3NNYXRyaXhgIGhvbGRzIG9ydGhvZ3JhcGhpYywgc2NhbGluZyBhbmQgdHJhbnNsYXRpb24gaW5mb3JtYXRpb24gdGhhdCBpcyB1c2VkXG4gKiBmb3IgcmVuZGVyaW5nIG9yaWdpbmFsIHRpbGUgY29udGVudCB0byBhIHByb3h5IHRpbGUuIFByb3h5IHRpbGUgY292ZXJzIHdob2xlXG4gKiBvciBzdWItcmVjdGFuZ2xlIG9mIHRoZSBvcmlnaW5hbCB0aWxlLlxuICovXG5jbGFzcyBQcm94aWVkVGlsZUlEIGV4dGVuZHMgT3ZlcnNjYWxlZFRpbGVJRCB7XG4gICAgcHJveHlUaWxlS2V5OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHByb3h5VGlsZUtleTogbnVtYmVyLCBwcm9qTWF0cml4OiBGbG9hdDMyQXJyYXkpIHtcbiAgICAgICAgc3VwZXIodGlsZUlELm92ZXJzY2FsZWRaLCB0aWxlSUQud3JhcCwgdGlsZUlELmNhbm9uaWNhbC56LCB0aWxlSUQuY2Fub25pY2FsLngsIHRpbGVJRC5jYW5vbmljYWwueSk7XG4gICAgICAgIHRoaXMucHJveHlUaWxlS2V5ID0gcHJveHlUaWxlS2V5O1xuICAgICAgICB0aGlzLnByb2pNYXRyaXggPSBwcm9qTWF0cml4O1xuICAgIH1cbn1cblxudHlwZSBPdmVybGFwU3RlbmNpbFR5cGUgPSBmYWxzZSB8ICdDbGlwJyB8ICdNYXNrJztcbnR5cGUgRkJPID0ge2ZiOiBGcmFtZWJ1ZmZlciwgdGV4OiBUZXh0dXJlLCBkaXJ0eTogYm9vbGVhbn07XG5cbmV4cG9ydCBjbGFzcyBUZXJyYWluIGV4dGVuZHMgRWxldmF0aW9uIHtcbiAgICB0ZXJyYWluVGlsZUZvclRpbGU6IHtbbnVtYmVyIHwgc3RyaW5nXTogVGlsZX07XG4gICAgcHJldlRlcnJhaW5UaWxlRm9yVGlsZToge1tudW1iZXIgfCBzdHJpbmddOiBUaWxlfTtcbiAgICBwYWludGVyOiBQYWludGVyO1xuICAgIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZTtcbiAgICBncmlkQnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgZ3JpZEluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcbiAgICBncmlkU2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgZ3JpZE5vU2tpcnRTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICB3aXJlZnJhbWVTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICB3aXJlZnJhbWVJbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgcHJveGllZENvb3Jkczoge1tzdHJpbmddOiBBcnJheTxQcm94aWVkVGlsZUlEPn07XG4gICAgcHJveHlDb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+O1xuICAgIHByb3h5VG9Tb3VyY2U6IHtbbnVtYmVyXToge1tzdHJpbmddOiBBcnJheTxQcm94aWVkVGlsZUlEPn19O1xuICAgIHByb3h5U291cmNlQ2FjaGU6IFByb3h5U291cmNlQ2FjaGU7XG4gICAgcmVuZGVyaW5nVG9UZXh0dXJlOiBib29sZWFuO1xuICAgIF9zdHlsZTogU3R5bGU7XG4gICAgX21vY2tTb3VyY2VDYWNoZTogTW9ja1NvdXJjZUNhY2hlO1xuICAgIG9ydGhvTWF0cml4OiBtYXQ0O1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgcmVuZGVyTW9kZTogbnVtYmVyO1xuXG4gICAgX3Zpc2libGVEZW1UaWxlczogQXJyYXk8VGlsZT47XG4gICAgX3NvdXJjZVRpbGVzT3ZlcmxhcDoge1tzdHJpbmddOiBib29sZWFufTtcbiAgICBfb3ZlcmxhcFN0ZW5jaWxNb2RlOiBTdGVuY2lsTW9kZTtcbiAgICBfb3ZlcmxhcFN0ZW5jaWxUeXBlOiBPdmVybGFwU3RlbmNpbFR5cGU7XG4gICAgX3N0ZW5jaWxSZWY6IG51bWJlcjtcblxuICAgIF9leGFnZ2VyYXRpb246IG51bWJlcjtcbiAgICBfZGVwdGhGQk86IEZyYW1lYnVmZmVyO1xuICAgIF9kZXB0aFRleHR1cmU6IFRleHR1cmU7XG4gICAgX3ByZXZpb3VzWm9vbTogbnVtYmVyO1xuICAgIF91cGRhdGVUaW1lc3RhbXA6IG51bWJlcjtcbiAgICBfdXNlVmVydGV4TW9ycGhpbmc6IGJvb2xlYW47XG4gICAgcG9vbDogQXJyYXk8RkJPPjtcbiAgICByZW5kZXJlZFRvVGlsZTogYm9vbGVhbjtcbiAgICBfZHJhcGVkUmVuZGVyQmF0Y2hlczogQXJyYXk8UmVuZGVyQmF0Y2g+O1xuICAgIF9zaGFyZWREZXB0aFN0ZW5jaWw6IFdlYkdMUmVuZGVyYnVmZmVyO1xuXG4gICAgX2ZpbmRDb3ZlcmluZ1RpbGVDYWNoZToge1tzdHJpbmddOiB7W251bWJlcl06ID9udW1iZXJ9fTtcblxuICAgIF90aWxlc0RpcnR5OiB7W3N0cmluZ106IHtbbnVtYmVyXTogYm9vbGVhbn19O1xuICAgIF9pbnZhbGlkYXRlUmVuZGVyQ2FjaGU6IGJvb2xlYW47XG5cbiAgICBfZW1wdHlEZXB0aEJ1ZmZlclRleHR1cmU6ID9UZXh0dXJlO1xuICAgIF9lbXB0eURFTVRleHR1cmU6ID9UZXh0dXJlO1xuICAgIF9pbml0aWFsaXppbmc6ID9ib29sZWFuO1xuICAgIF9lbXB0eURFTVRleHR1cmVEaXJ0eTogP2Jvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihwYWludGVyOiBQYWludGVyLCBzdHlsZTogU3R5bGUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wYWludGVyID0gcGFpbnRlcjtcbiAgICAgICAgdGhpcy50ZXJyYWluVGlsZUZvclRpbGUgPSB7fTtcbiAgICAgICAgdGhpcy5wcmV2VGVycmFpblRpbGVGb3JUaWxlID0ge307XG5cbiAgICAgICAgLy8gVGVycmFpbiByZW5kZXJpbmcgZ3JpZCBpcyAxMjl4MTI5IGNlbGwgZ3JpZCwgbWFkZSBieSAxMzB4MTMwIHBvaW50cy5cbiAgICAgICAgLy8gMTMwIHZlcnRpY2VzIG1hcCB0byAxMjggREVNIGRhdGEgKyAxcHggcGFkZGluZyBvbiBib3RoIHNpZGVzLlxuICAgICAgICAvLyBERU0gdGV4dHVyZSBpcyBwYWRkZWQgKDEsIDEsIDEsIDEpIGFuZCBwYWRkaW5nIHBpeGVscyBhcmUgYmFja2ZpbGxlZFxuICAgICAgICAvLyBieSBuZWlnaGJvcmluZyB0aWxlIGVkZ2VzLiBUaGlzIHdheSB3ZSBhY2hpZXZlIHRpbGUgc3RpdGNoaW5nIGFzXG4gICAgICAgIC8vIGVkZ2UgdmVydGljZXMgZnJvbSBuZWlnaGJvcmluZyB0aWxlcyBldmFsdWF0ZSB0byB0aGUgc2FtZSAzRCBwb2ludC5cbiAgICAgICAgY29uc3QgW3RyaWFuZ2xlR3JpZEFycmF5LCB0cmlhbmdsZUdyaWRJbmRpY2VzLCBza2lydEluZGljZXNPZmZzZXRdID0gY3JlYXRlR3JpZChHUklEX0RJTSArIDEpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgICAgICB0aGlzLmdyaWRCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0cmlhbmdsZUdyaWRBcnJheSwgYm91bmRzQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy5ncmlkSW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRyaWFuZ2xlR3JpZEluZGljZXMpO1xuICAgICAgICB0aGlzLmdyaWRTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCB0cmlhbmdsZUdyaWRBcnJheS5sZW5ndGgsIHRyaWFuZ2xlR3JpZEluZGljZXMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5ncmlkTm9Ta2lydFNlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIHRyaWFuZ2xlR3JpZEFycmF5Lmxlbmd0aCwgc2tpcnRJbmRpY2VzT2Zmc2V0KTtcbiAgICAgICAgdGhpcy5wcm94eUNvb3JkcyA9IFtdO1xuICAgICAgICB0aGlzLnByb3hpZWRDb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5fdmlzaWJsZURlbVRpbGVzID0gW107XG4gICAgICAgIHRoaXMuX2RyYXBlZFJlbmRlckJhdGNoZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fc291cmNlVGlsZXNPdmVybGFwID0ge307XG4gICAgICAgIHRoaXMucHJveHlTb3VyY2VDYWNoZSA9IG5ldyBQcm94eVNvdXJjZUNhY2hlKHN0eWxlLm1hcCk7XG4gICAgICAgIHRoaXMub3J0aG9NYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBtYXQ0Lm9ydGhvKHRoaXMub3J0aG9NYXRyaXgsIDAsIEVYVEVOVCwgMCwgRVhURU5ULCAwLCAxKTtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLl9vdmVybGFwU3RlbmNpbE1vZGUgPSBuZXcgU3RlbmNpbE1vZGUoe2Z1bmM6IGdsLkdFUVVBTCwgbWFzazogMHhGRn0sIDAsIDB4RkYsIGdsLktFRVAsIGdsLktFRVAsIGdsLlJFUExBQ0UpO1xuICAgICAgICB0aGlzLl9wcmV2aW91c1pvb20gPSBwYWludGVyLnRyYW5zZm9ybS56b29tO1xuICAgICAgICB0aGlzLnBvb2wgPSBbXTtcbiAgICAgICAgdGhpcy5fZmluZENvdmVyaW5nVGlsZUNhY2hlID0ge307XG4gICAgICAgIHRoaXMuX3RpbGVzRGlydHkgPSB7fTtcbiAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlO1xuICAgICAgICB0aGlzLl91c2VWZXJ0ZXhNb3JwaGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX2V4YWdnZXJhdGlvbiA9IDE7XG4gICAgICAgIHRoaXMuX21vY2tTb3VyY2VDYWNoZSA9IG5ldyBNb2NrU291cmNlQ2FjaGUoc3R5bGUubWFwKTtcbiAgICB9XG5cbiAgICBzZXQgc3R5bGUoc3R5bGU6IFN0eWxlKSB7XG4gICAgICAgIHN0eWxlLm9uKCdkYXRhJywgdGhpcy5fb25TdHlsZURhdGFFdmVudC5iaW5kKHRoaXMpKTtcbiAgICAgICAgc3R5bGUub24oJ25ld29yZGVyJywgdGhpcy5fY2hlY2tSZW5kZXJDYWNoZUVmZmljaWVuY3kuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuX3N0eWxlID0gc3R5bGU7XG4gICAgICAgIHRoaXMuX2NoZWNrUmVuZGVyQ2FjaGVFZmZpY2llbmN5KCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBWYWxpZGF0ZSB0ZXJyYWluIGFuZCB1cGRhdGUgc291cmNlIGNhY2hlIHVzZWQgZm9yIGVsZXZhdGlvbi5cbiAgICAgKiBFeHBsaWNpdGx5IHBhc3MgdHJhbnNmb3JtIHRvIHVwZGF0ZSBlbGV2YXRpb24gKFRyYW5zZm9ybS51cGRhdGVFbGV2YXRpb24pXG4gICAgICogYmVmb3JlIHVzaW5nIHRyYW5zZm9ybSBmb3Igc291cmNlIGNhY2hlIHVwZGF0ZS5cbiAgICAgKiBjYW1lcmFDaGFuZ2luZyBpcyB0cnVlIHdoZW4gY2FtZXJhIGlzIHpvb21pbmcsIHBhbm5pbmcgb3Igb3JiaXRpbmcuXG4gICAgICovXG4gICAgdXBkYXRlKHN0eWxlOiBTdHlsZSwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sIGNhbWVyYUNoYW5naW5nOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzdHlsZSAmJiBzdHlsZS50ZXJyYWluKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3R5bGUgIT09IHN0eWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IHRlcnJhaW5Qcm9wcyA9IHN0eWxlLnRlcnJhaW4ucHJvcGVydGllcztcbiAgICAgICAgICAgIGNvbnN0IGlzRHJhcGVNb2RlRGVmZXJyZWQgPSBzdHlsZS50ZXJyYWluLmRyYXBlUmVuZGVyTW9kZSA9PT0gRHJhcGVSZW5kZXJNb2RlLmRlZmVycmVkO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZSA9IGlzRHJhcGVNb2RlRGVmZXJyZWQgPyB0aGlzLl9tb2NrU291cmNlQ2FjaGUgOlxuICAgICAgICAgICAgICAgICgoc3R5bGUuX2dldFNvdXJjZUNhY2hlKHRlcnJhaW5Qcm9wcy5nZXQoJ3NvdXJjZScpKTogYW55KTogU291cmNlQ2FjaGUpO1xuICAgICAgICAgICAgdGhpcy5fZXhhZ2dlcmF0aW9uID0gdGVycmFpblByb3BzLmdldCgnZXhhZ2dlcmF0aW9uJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVNvdXJjZUNhY2hlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZUNhY2hlLnVzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fybk9uY2UoYFJhc3RlciBERU0gc291cmNlICcke3RoaXMuc291cmNlQ2FjaGUuaWR9JyBpcyB1c2VkIGJvdGggZm9yIHRlcnJhaW4gYW5kIGFzIGxheWVyIHNvdXJjZS5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGxlYWRzIHRvIGxvd2VyIHJlc29sdXRpb24gb2YgaGlsbHNoYWRlLiBGb3IgZnVsbCBoaWxsc2hhZGUgcmVzb2x1dGlvbiBidXQgaGlnaGVyIG1lbW9yeSBjb25zdW1wdGlvbiwgZGVmaW5lIGFub3RoZXIgcmFzdGVyIERFTSBzb3VyY2UuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIExvd2VyIHRpbGUgem9vbSBpcyBzdWZmaWNpZW50IGZvciB0ZXJyYWluLCBnaXZlbiB0aGUgc2l6ZSBvZiB0ZXJyYWluIGdyaWQuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NhbGVkRGVtVGlsZVNpemUgPSB0aGlzLmdldFNjYWxlZERlbVRpbGVTaXplKCk7XG4gICAgICAgICAgICAgICAgLy8gRGVtIHRpbGUgbmVlZHMgdG8gYmUgcGFyZW50IG9yIGF0IGxlYXN0IG9mIHRoZSBzYW1lIHpvb20gbGV2ZWwgYXMgcHJveHkgdGlsZS5cbiAgICAgICAgICAgICAgICAvLyBUaWxlIGNvdmVyIHJvdW5kWm9vbSBiZWhhdmlvciBpcyBzZXQgdG8gdGhlIHNhbWUgYXMgZm9yIHByb3h5IChmYWxzZSkgaW4gU291cmNlQ2FjaGUudXBkYXRlKCkuXG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZS51cGRhdGUodHJhbnNmb3JtLCBzY2FsZWREZW1UaWxlU2l6ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgLy8gQXMgYSByZXN1bHQgb2YgdXBkYXRlLCB3ZSBnZXQgbmV3IHNldCBvZiB0aWxlczogcmVzZXQgbG9va3VwIGNhY2hlLlxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRUaWxlTG9va3VwQ2FjaGUodGhpcy5zb3VyY2VDYWNoZS5pZCk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuc291cmNlQ2FjaGUudXNlZEZvclRlcnJhaW4pIHtcbiAgICAgICAgICAgICAgICAvLyBJbml0IGNhY2hlIGVudHJ5LlxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRUaWxlTG9va3VwQ2FjaGUodGhpcy5zb3VyY2VDYWNoZS5pZCk7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0b2dnbGluZyB0ZXJyYWluIG9uL29mZiBsb2FkIGF2YWlsYWJsZSB0ZXJyYWluIHRpbGVzIGZyb20gY2FjaGVcbiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgcmVhZGluZyBlbGV2YXRpb24gYXQgY2VudGVyLlxuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGUudXNlZEZvclRlcnJhaW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVNvdXJjZUNhY2hlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdXBkYXRlU291cmNlQ2FjaGUoKTtcbiAgICAgICAgICAgIC8vIENhbWVyYSwgd2hlbiBjaGFuZ2luZywgZ2V0cyBjb25zdHJhaW5lZCBvdmVyIHRlcnJhaW4uIElzc3VlIGNvbnN0cmFpbkNhbWVyYU92ZXJUZXJyYWluID0gdHJ1ZVxuICAgICAgICAgICAgLy8gaGVyZSB0byBjb3ZlciBwb3RlbnRpYWwgdW5kZXIgdGVycmFpbiBzaXR1YXRpb24gb24gZGF0YSBvciBzdHlsZSBjaGFuZ2UuXG4gICAgICAgICAgICB0cmFuc2Zvcm0udXBkYXRlRWxldmF0aW9uKCFjYW1lcmFDaGFuZ2luZyk7XG5cbiAgICAgICAgICAgIC8vIFJlc2V0IHRpbGUgbG9va3VwIGNhY2hlIGFuZCB1cGRhdGUgZHJhcGVkIHRpbGVzIGNvb3JkaW5hdGVzLlxuICAgICAgICAgICAgdGhpcy5yZXNldFRpbGVMb29rdXBDYWNoZSh0aGlzLnByb3h5U291cmNlQ2FjaGUuaWQpO1xuICAgICAgICAgICAgdGhpcy5wcm94eVNvdXJjZUNhY2hlLnVwZGF0ZSh0cmFuc2Zvcm0pO1xuXG4gICAgICAgICAgICB0aGlzLl9lbXB0eURFTVRleHR1cmVEaXJ0eSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldFRpbGVMb29rdXBDYWNoZShzb3VyY2VDYWNoZUlEOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZmluZENvdmVyaW5nVGlsZUNhY2hlW3NvdXJjZUNhY2hlSURdID0ge307XG4gICAgfVxuXG4gICAgZ2V0U2NhbGVkRGVtVGlsZVNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgZGVtU2NhbGUgPSB0aGlzLnNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLnRpbGVTaXplIC8gR1JJRF9ESU07XG4gICAgICAgIGNvbnN0IHByb3h5VGlsZVNpemUgPSB0aGlzLnByb3h5U291cmNlQ2FjaGUuZ2V0U291cmNlKCkudGlsZVNpemU7XG4gICAgICAgIHJldHVybiBkZW1TY2FsZSAqIHByb3h5VGlsZVNpemU7XG4gICAgfVxuXG4gICAgX2NoZWNrUmVuZGVyQ2FjaGVFZmZpY2llbmN5KCkge1xuICAgICAgICBjb25zdCByZW5kZXJDYWNoZUluZm8gPSB0aGlzLnJlbmRlckNhY2hlRWZmaWNpZW5jeSh0aGlzLl9zdHlsZSk7XG4gICAgICAgIGlmICh0aGlzLl9zdHlsZS5tYXAuX29wdGltaXplRm9yVGVycmFpbikge1xuICAgICAgICAgICAgYXNzZXJ0KHJlbmRlckNhY2hlSW5mby5lZmZpY2llbmN5ID09PSAxMDApO1xuICAgICAgICB9IGVsc2UgaWYgKHJlbmRlckNhY2hlSW5mby5lZmZpY2llbmN5ICE9PSAxMDApIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGBUZXJyYWluIHJlbmRlciBjYWNoZSBlZmZpY2llbmN5IGlzIG5vdCBvcHRpbWFsICgke3JlbmRlckNhY2hlSW5mby5lZmZpY2llbmN5fSUpIGFuZCBwZXJmb3JtYW5jZVxuICAgICAgICAgICAgICAgIG1heSBiZSBhZmZlY3RlZCBuZWdhdGl2ZWx5LCBjb25zaWRlciBwbGFjaW5nIGFsbCBiYWNrZ3JvdW5kLCBmaWxsIGFuZCBsaW5lIGxheWVycyBiZWZvcmUgbGF5ZXJcbiAgICAgICAgICAgICAgICB3aXRoIGlkICcke3JlbmRlckNhY2hlSW5mby5maXJzdFVuZHJhcGVkTGF5ZXJ9JyBvciBjcmVhdGUgYSBtYXAgdXNpbmcgb3B0aW1pemVGb3JUZXJyYWluOiB0cnVlIG9wdGlvbi5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vblN0eWxlRGF0YUV2ZW50KGV2ZW50OiBhbnkpIHtcbiAgICAgICAgaWYgKGV2ZW50LmNvb3JkICYmIGV2ZW50LmRhdGFUeXBlID09PSAnc291cmNlJykge1xuICAgICAgICAgICAgdGhpcy5fY2xlYXJSZW5kZXJDYWNoZUZvclRpbGUoZXZlbnQuc291cmNlQ2FjaGVJZCwgZXZlbnQuY29vcmQpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGFUeXBlID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUmVuZGVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGVycmFpblxuICAgIF9kaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc2hhcmVkRGVwdGhTdGVuY2lsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnByb3h5U291cmNlQ2FjaGUuZGVhbGxvY1JlbmRlckNhY2hlKCk7XG4gICAgICAgIGlmICh0aGlzLl9zdHlsZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zdHlsZS5fc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3R5bGUuX3NvdXJjZUNhY2hlc1tpZF0udXNlZEZvclRlcnJhaW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGUoKTtcbiAgICAgICAgaWYgKHRoaXMuX2VtcHR5REVNVGV4dHVyZSkgdGhpcy5fZW1wdHlERU1UZXh0dXJlLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuX2VtcHR5RGVwdGhCdWZmZXJUZXh0dXJlKSB0aGlzLl9lbXB0eURlcHRoQnVmZmVyVGV4dHVyZS5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucG9vbC5mb3JFYWNoKGZibyA9PiBmYm8uZmIuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5wb29sID0gW107XG4gICAgICAgIGlmICh0aGlzLl9kZXB0aEZCTykge1xuICAgICAgICAgICAgdGhpcy5fZGVwdGhGQk8uZGVzdHJveSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2RlcHRoRkJPO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2RlcHRoVGV4dHVyZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEltcGxlbWVudHMgRWxldmF0aW9uOjpfc291cmNlLlxuICAgIF9zb3VyY2UoKTogP1NvdXJjZUNhY2hlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlZCA/IHRoaXMuc291cmNlQ2FjaGUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEltcGxlbWVudHMgRWxldmF0aW9uOjpleGFnZ2VyYXRpb24uXG4gICAgZXhhZ2dlcmF0aW9uKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leGFnZ2VyYXRpb247XG4gICAgfVxuXG4gICAgZ2V0IHZpc2libGVEZW1UaWxlcygpOiBBcnJheTxUaWxlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlRGVtVGlsZXM7XG4gICAgfVxuXG4gICAgZ2V0IGRyYXBlQnVmZmVyU2l6ZSgpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3QgZXh0ZW50ID0gdGhpcy5wcm94eVNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLnRpbGVTaXplICogMjsgLy8gKjIgaXMgdG8gYXZvaWQgdXBzY2FsaW5nIGJpdG1hcCBvbiB6b29tLlxuICAgICAgICByZXR1cm4gW2V4dGVudCwgZXh0ZW50XTtcbiAgICB9XG5cbiAgICBzZXQgdXNlVmVydGV4TW9ycGhpbmcoZW5hYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3VzZVZlcnRleE1vcnBoaW5nID0gZW5hYmxlO1xuICAgIH1cblxuICAgIC8vIEZvciBldmVyeSByZW5kZXJhYmxlIGNvb3JkaW5hdGUgaW4gZXZlcnkgc291cmNlIGNhY2hlLCBhc3NpZ24gb25lIHByb3h5XG4gICAgLy8gdGlsZSAoc2VlIF9zZXR1cFByb3hpZWRDb29yZHNGb3JPcnRobykuIE1hcHBpbmcgb2Ygc291cmNlIHRpbGUgdG8gcHJveHlcbiAgICAvLyB0aWxlIGlzIG1vZGVsZWQgYnkgUHJveGllZFRpbGVJRC4gSW4gZ2VuZXJhbCBjYXNlLCBzb3VyY2UgYW5kIHByb3h5IHRpbGVcbiAgICAvLyBhcmUgb2YgZGlmZmVyZW50IHpvb206IFByb3hpZWRUaWxlSUQucHJvak1hdHJpeCBtb2RlbHMgb3J0aG8sIHNjYWxlIGFuZFxuICAgIC8vIHRyYW5zbGF0ZSBmcm9tIHNvdXJjZSB0byBwcm94eS4gVGhpcyBtYXRyaXggaXMgdXNlZCB3aGVuIHJlbmRlcmluZyBzb3VyY2VcbiAgICAvLyB0aWxlIHRvIHByb3h5IHRpbGUncyB0ZXh0dXJlLlxuICAgIC8vIE9uZSBwcm94eSB0aWxlIGNhbiBoYXZlIG11bHRpcGxlIHNvdXJjZSB0aWxlcywgb3IgcGllY2VzIG9mIHNvdXJjZSB0aWxlcyxcbiAgICAvLyB0aGF0IGdldCByZW5kZXJlZCB0byBpdC5cbiAgICAvLyBGb3IgZWFjaCBwcm94eSB0aWxlIHdlIGFzc2lnbiBvbmUgdGVycmFpbiB0aWxlIChfYXNzaWduVGVycmFpblRpbGVzKS4gVGhlXG4gICAgLy8gdGVycmFpbiB0aWxlIHByb3ZpZGVzIGVsZXZhdGlvbiBkYXRhIHdoZW4gcmVuZGVyaW5nIChkcmFwaW5nKSBwcm94eSB0aWxlXG4gICAgLy8gdGV4dHVyZSBvdmVyIHRlcnJhaW4gZ3JpZC5cbiAgICB1cGRhdGVUaWxlQmluZGluZyhzb3VyY2VzQ29vcmRzOiB7W3N0cmluZ106IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+fSkge1xuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnByZXZUZXJyYWluVGlsZUZvclRpbGUgPSB0aGlzLnRlcnJhaW5UaWxlRm9yVGlsZTtcblxuICAgICAgICBjb25zdCBwc2MgPSB0aGlzLnByb3h5U291cmNlQ2FjaGU7XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5wYWludGVyLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemluZykge1xuICAgICAgICAgICAgLy8gRG9uJ3QgYWN0aXZhdGUgdGVycmFpbiB1bnRpbCBjZW50ZXIgdGlsZSBnZXRzIGxvYWRlZC5cbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemluZyA9IHRyLl9jZW50ZXJBbHRpdHVkZSA9PT0gMCAmJiB0aGlzLmdldEF0UG9pbnRPclplcm8oTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQodHIuY2VudGVyKSwgLTEpID09PSAtMTtcbiAgICAgICAgICAgIHRoaXMuX2VtcHR5REVNVGV4dHVyZURpcnR5ID0gIXRoaXMuX2luaXRpYWxpemluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMucHJveHlDb29yZHMgPSBwc2MuZ2V0SWRzKCkubWFwKChpZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGlsZUlEID0gcHNjLmdldFRpbGVCeUlEKGlkKS50aWxlSUQ7XG4gICAgICAgICAgICB0aWxlSUQucHJvak1hdHJpeCA9IHRyLmNhbGN1bGF0ZVByb2pNYXRyaXgodGlsZUlELnRvVW53cmFwcGVkKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRpbGVJRDtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvcnRCeURpc3RhbmNlVG9DYW1lcmEoY29vcmRzLCB0aGlzLnBhaW50ZXIpO1xuICAgICAgICB0aGlzLl9wcmV2aW91c1pvb20gPSB0ci56b29tO1xuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzUHJveHlUb1NvdXJjZSA9IHRoaXMucHJveHlUb1NvdXJjZSB8fCB7fTtcbiAgICAgICAgdGhpcy5wcm94eVRvU291cmNlID0ge307XG4gICAgICAgIGNvb3Jkcy5mb3JFYWNoKCh0aWxlSUQpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJveHlUb1NvdXJjZVt0aWxlSUQua2V5XSA9IHt9O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRlcnJhaW5UaWxlRm9yVGlsZSA9IHt9O1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLl9zdHlsZS5fc291cmNlQ2FjaGVzO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VDYWNoZS51c2VkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZSAhPT0gdGhpcy5zb3VyY2VDYWNoZSkgdGhpcy5yZXNldFRpbGVMb29rdXBDYWNoZShzb3VyY2VDYWNoZS5pZCk7XG4gICAgICAgICAgICB0aGlzLl9zZXR1cFByb3hpZWRDb29yZHNGb3JPcnRobyhzb3VyY2VDYWNoZSwgc291cmNlc0Nvb3Jkc1tpZF0sIHByZXZpb3VzUHJveHlUb1NvdXJjZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUudXNlZEZvclRlcnJhaW4pIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSBzb3VyY2VzQ29vcmRzW2lkXTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5yZXBhcnNlT3ZlcnNjYWxlZCkge1xuICAgICAgICAgICAgICAgIC8vIERvIHRoaXMgZm9yIGxheWVycyB0aGF0IGFyZSBub3QgcmFzdGVyaXplZCB0byBwcm94eSB0aWxlLlxuICAgICAgICAgICAgICAgIHRoaXMuX2Fzc2lnblRlcnJhaW5UaWxlcyhjb29yZGluYXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCYWNrZ3JvdW5kIGhhcyBubyBzb3VyY2UuIFVzaW5nIHByb3h5IGNvb3JkcyB3aXRoIDEtMSBvcnRobyAodGhpcy5wcm94aWVkQ29vcmRzW3BzYy5pZF0pXG4gICAgICAgIC8vIHdoZW4gcmVuZGVyaW5nIGJhY2tncm91bmQgdG8gcHJveHkgdGlsZXMuXG4gICAgICAgIHRoaXMucHJveGllZENvb3Jkc1twc2MuaWRdID0gY29vcmRzLm1hcCh0aWxlSUQgPT4gbmV3IFByb3hpZWRUaWxlSUQodGlsZUlELCB0aWxlSUQua2V5LCB0aGlzLm9ydGhvTWF0cml4KSk7XG4gICAgICAgIHRoaXMuX2Fzc2lnblRlcnJhaW5UaWxlcyhjb29yZHMpO1xuICAgICAgICB0aGlzLl9wcmVwYXJlREVNVGV4dHVyZXMoKTtcbiAgICAgICAgdGhpcy5fc2V0dXBEcmFwZWRSZW5kZXJCYXRjaGVzKCk7XG4gICAgICAgIHRoaXMuX2luaXRGQk9Qb29sKCk7XG4gICAgICAgIHRoaXMuX3NldHVwUmVuZGVyQ2FjaGUocHJldmlvdXNQcm94eVRvU291cmNlKTtcblxuICAgICAgICB0aGlzLnJlbmRlcmluZ1RvVGV4dHVyZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl91cGRhdGVUaW1lc3RhbXAgPSBicm93c2VyLm5vdygpO1xuXG4gICAgICAgIC8vIEdhdGhlciBhbGwgZGVtIHRpbGVzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIHByb3h5IHRpbGVzXG4gICAgICAgIGNvbnN0IHZpc2libGVLZXlzID0ge307XG4gICAgICAgIHRoaXMuX3Zpc2libGVEZW1UaWxlcyA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy5wcm94eUNvb3Jkcykge1xuICAgICAgICAgICAgY29uc3QgZGVtVGlsZSA9IHRoaXMudGVycmFpblRpbGVGb3JUaWxlW2lkLmtleV07XG4gICAgICAgICAgICBpZiAoIWRlbVRpbGUpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBkZW1UaWxlLnRpbGVJRC5rZXk7XG4gICAgICAgICAgICBpZiAoa2V5IGluIHZpc2libGVLZXlzKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5fdmlzaWJsZURlbVRpbGVzLnB1c2goZGVtVGlsZSk7XG4gICAgICAgICAgICB2aXNpYmxlS2V5c1trZXldID0ga2V5O1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBfYXNzaWduVGVycmFpblRpbGVzKGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemluZykgcmV0dXJuO1xuICAgICAgICBjb29yZHMuZm9yRWFjaCgodGlsZUlEKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy50ZXJyYWluVGlsZUZvclRpbGVbdGlsZUlELmtleV0pIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGRlbVRpbGUgPSB0aGlzLl9maW5kVGlsZUNvdmVyaW5nVGlsZUlEKHRpbGVJRCwgdGhpcy5zb3VyY2VDYWNoZSk7XG4gICAgICAgICAgICBpZiAoZGVtVGlsZSkgdGhpcy50ZXJyYWluVGlsZUZvclRpbGVbdGlsZUlELmtleV0gPSBkZW1UaWxlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfcHJlcGFyZURFTVRleHR1cmVzKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wYWludGVyLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy50ZXJyYWluVGlsZUZvclRpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLnRlcnJhaW5UaWxlRm9yVGlsZVtrZXldO1xuICAgICAgICAgICAgY29uc3QgZGVtID0gdGlsZS5kZW07XG4gICAgICAgICAgICBpZiAoZGVtICYmICghdGlsZS5kZW1UZXh0dXJlIHx8IHRpbGUubmVlZHNERU1UZXh0dXJlVXBsb2FkKSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTEpO1xuICAgICAgICAgICAgICAgIHByZXBhcmVERU1UZXh0dXJlKHRoaXMucGFpbnRlciwgdGlsZSwgZGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9wcmVwYXJlRGVtVGlsZVVuaWZvcm1zKHByb3h5VGlsZTogVGlsZSwgZGVtVGlsZTogP1RpbGUsIHVuaWZvcm1zOiBVbmlmb3JtVmFsdWVzPFRlcnJhaW5Vbmlmb3Jtc1R5cGU+LCB1bmlmb3JtU3VmZml4OiA/c3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZGVtVGlsZSB8fCBkZW1UaWxlLmRlbVRleHR1cmUgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBhc3NlcnQoZGVtVGlsZS5kZW0pO1xuICAgICAgICBjb25zdCBwcm94eUlkID0gcHJveHlUaWxlLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IGRlbUlkID0gZGVtVGlsZS50aWxlSUQuY2Fub25pY2FsO1xuICAgICAgICBjb25zdCBkZW1TY2FsZUJ5ID0gTWF0aC5wb3coMiwgZGVtSWQueiAtIHByb3h5SWQueik7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IHVuaWZvcm1TdWZmaXggfHwgXCJcIjtcbiAgICAgICAgdW5pZm9ybXNbYHVfZGVtX3RsJHtzdWZmaXh9YF0gPSBbcHJveHlJZC54ICogZGVtU2NhbGVCeSAlIDEsIHByb3h5SWQueSAqIGRlbVNjYWxlQnkgJSAxXTtcbiAgICAgICAgdW5pZm9ybXNbYHVfZGVtX3NjYWxlJHtzdWZmaXh9YF0gPSBkZW1TY2FsZUJ5O1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXQgZW1wdHlERU1UZXh0dXJlKCk6IFRleHR1cmUge1xuICAgICAgICByZXR1cm4gIXRoaXMuX2VtcHR5REVNVGV4dHVyZURpcnR5ICYmIHRoaXMuX2VtcHR5REVNVGV4dHVyZSA/XG4gICAgICAgICAgICB0aGlzLl9lbXB0eURFTVRleHR1cmUgOiB0aGlzLl91cGRhdGVFbXB0eURFTVRleHR1cmUoKTtcbiAgICB9XG5cbiAgICBnZXQgZW1wdHlEZXB0aEJ1ZmZlclRleHR1cmUoKTogVGV4dHVyZSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICBpZiAoIXRoaXMuX2VtcHR5RGVwdGhCdWZmZXJUZXh0dXJlKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogMSwgaGVpZ2h0OiAxLFxuICAgICAgICAgICAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KFsyNTUsIDI1NSwgMjU1LCAyNTVdKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2VtcHR5RGVwdGhCdWZmZXJUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgaW1hZ2UsIGdsLlJHQkEsIHtwcmVtdWx0aXBseTogZmFsc2V9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZW1wdHlEZXB0aEJ1ZmZlclRleHR1cmU7XG4gICAgfVxuXG4gICAgX2dldExvYWRlZEFyZWFNaW5pbXVtKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBub256ZXJvID0gMDtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5fdmlzaWJsZURlbVRpbGVzLnJlZHVjZSgoYWNjLCB0aWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRpbGUuZGVtKSByZXR1cm4gYWNjO1xuICAgICAgICAgICAgY29uc3QgbSA9IHRpbGUuZGVtLnRyZWUubWluaW11bXNbMF07XG4gICAgICAgICAgICBhY2MgKz0gbTtcbiAgICAgICAgICAgIGlmIChtID4gMCkgbm9uemVybysrO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIHJldHVybiBub256ZXJvID8gbWluIC8gbm9uemVybyA6IDA7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUVtcHR5REVNVGV4dHVyZSgpOiBUZXh0dXJlIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTIpO1xuXG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMuX2dldExvYWRlZEFyZWFNaW5pbXVtKCk7XG4gICAgICAgIGNvbnN0IGltYWdlID0ge1xuICAgICAgICAgICAgd2lkdGg6IDEsIGhlaWdodDogMSxcbiAgICAgICAgICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KERFTURhdGEucGFjayhtaW4sICgodGhpcy5zb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTogYW55KTogUmFzdGVyREVNVGlsZVNvdXJjZSkuZW5jb2RpbmcpKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX2VtcHR5REVNVGV4dHVyZURpcnR5ID0gZmFsc2U7XG4gICAgICAgIGxldCB0ZXh0dXJlID0gdGhpcy5fZW1wdHlERU1UZXh0dXJlO1xuICAgICAgICBpZiAoIXRleHR1cmUpIHtcbiAgICAgICAgICAgIHRleHR1cmUgPSB0aGlzLl9lbXB0eURFTVRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCBpbWFnZSwgZ2wuUkdCQSwge3ByZW11bHRpcGx5OiBmYWxzZX0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGV4dHVyZS51cGRhdGUoaW1hZ2UsIHtwcmVtdWx0aXBseTogZmFsc2V9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcbiAgICB9XG5cbiAgICAvLyB1c2VEZXB0aEZvck9jY2x1c2lvbjogUHJlLXJlbmRlcmVkIGRlcHRoIHRvIHRleHR1cmUgKHRoaXMuX2RlcHRoVGV4dHVyZSkgaXNcbiAgICAvLyB1c2VkIHRvIGhpZGUgKGFjdHVhbGx5IG1vdmVzIGFsbCBvYmplY3QncyB2ZXJ0aWNlcyBvdXQgb2Ygdmlld3BvcnQpLlxuICAgIC8vIHVzZU1ldGVyVG9EZW06IHVfbWV0ZXJfdG9fZGVtIHVuaWZvcm0gaXMgbm90IHVzZWQgZm9yIGFsbCB0ZXJyYWluIHByb2dyYW1zLFxuICAgIC8vIG9wdGltaXphdGlvbiB0byBhdm9pZCB1bm5lY2Vzc2FyeSBjb21wdXRhdGlvbiBhbmQgdXBsb2FkLlxuICAgIHNldHVwRWxldmF0aW9uRHJhdyh0aWxlOiBUaWxlLCBwcm9ncmFtOiBQcm9ncmFtPCo+LFxuICAgICAgICBvcHRpb25zPzoge1xuICAgICAgICAgICAgdXNlRGVwdGhGb3JPY2NsdXNpb24/OiBib29sZWFuLFxuICAgICAgICAgICAgdXNlTWV0ZXJUb0RlbT86IGJvb2xlYW4sXG4gICAgICAgICAgICBsYWJlbFBsYW5lTWF0cml4SW52PzogP0Zsb2F0MzJBcnJheSxcbiAgICAgICAgICAgIG1vcnBoaW5nPzogeyBzcmNEZW1UaWxlOiBUaWxlLCBkc3REZW1UaWxlOiBUaWxlLCBwaGFzZTogbnVtYmVyIH1cbiAgICAgICAgfSkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wYWludGVyLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgY29uc3QgdW5pZm9ybXMgPSBkZWZhdWx0VGVycmFpblVuaWZvcm1zKCgodGhpcy5zb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTogYW55KTogUmFzdGVyREVNVGlsZVNvdXJjZSkuZW5jb2RpbmcpO1xuICAgICAgICB1bmlmb3Jtc1sndV9kZW1fc2l6ZSddID0gdGhpcy5zb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS50aWxlU2l6ZTtcbiAgICAgICAgdW5pZm9ybXNbJ3VfZXhhZ2dlcmF0aW9uJ10gPSB0aGlzLmV4YWdnZXJhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5wYWludGVyLnRyYW5zZm9ybTtcbiAgICAgICAgY29uc3QgdGlsZVRyYW5zZm9ybSA9IHRyLnByb2plY3Rpb24uY3JlYXRlVGlsZVRyYW5zZm9ybSh0ciwgdHIud29ybGRTaXplKTtcblxuICAgICAgICBjb25zdCBpZCA9IHRpbGUudGlsZUlELmNhbm9uaWNhbDtcbiAgICAgICAgdW5pZm9ybXNbJ3VfdGlsZV90bF91cCddID0gdGlsZVRyYW5zZm9ybS51cFZlY3RvcihpZCwgMCwgMCk7XG4gICAgICAgIHVuaWZvcm1zWyd1X3RpbGVfdHJfdXAnXSA9IHRpbGVUcmFuc2Zvcm0udXBWZWN0b3IoaWQsIEVYVEVOVCwgMCk7XG4gICAgICAgIHVuaWZvcm1zWyd1X3RpbGVfYnJfdXAnXSA9IHRpbGVUcmFuc2Zvcm0udXBWZWN0b3IoaWQsIEVYVEVOVCwgRVhURU5UKTtcbiAgICAgICAgdW5pZm9ybXNbJ3VfdGlsZV9ibF91cCddID0gdGlsZVRyYW5zZm9ybS51cFZlY3RvcihpZCwgMCwgRVhURU5UKTtcbiAgICAgICAgdW5pZm9ybXNbJ3VfdGlsZV91cF9zY2FsZSddID0gdGlsZVRyYW5zZm9ybS51cFZlY3RvclNjYWxlKGlkKTtcblxuICAgICAgICBsZXQgZGVtVGlsZSA9IG51bGw7XG4gICAgICAgIGxldCBwcmV2RGVtVGlsZSA9IG51bGw7XG4gICAgICAgIGxldCBtb3JwaGluZ1BoYXNlID0gMS4wO1xuXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubW9ycGhpbmcgJiYgdGhpcy5fdXNlVmVydGV4TW9ycGhpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyY1RpbGUgPSBvcHRpb25zLm1vcnBoaW5nLnNyY0RlbVRpbGU7XG4gICAgICAgICAgICBjb25zdCBkc3RUaWxlID0gb3B0aW9ucy5tb3JwaGluZy5kc3REZW1UaWxlO1xuICAgICAgICAgICAgbW9ycGhpbmdQaGFzZSA9IG9wdGlvbnMubW9ycGhpbmcucGhhc2U7XG5cbiAgICAgICAgICAgIGlmIChzcmNUaWxlICYmIGRzdFRpbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJlcGFyZURlbVRpbGVVbmlmb3Jtcyh0aWxlLCBzcmNUaWxlLCB1bmlmb3JtcywgXCJfcHJldlwiKSlcbiAgICAgICAgICAgICAgICAgICAgcHJldkRlbVRpbGUgPSBzcmNUaWxlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcmVwYXJlRGVtVGlsZVVuaWZvcm1zKHRpbGUsIGRzdFRpbGUsIHVuaWZvcm1zKSlcbiAgICAgICAgICAgICAgICAgICAgZGVtVGlsZSA9IGRzdFRpbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldkRlbVRpbGUgJiYgZGVtVGlsZSkge1xuICAgICAgICAgICAgLy8gQm90aCBERU0gdGV4dHVyZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGNvcnJlY3RseSBzZXQgaWYgZ2VvbW9ycGhpbmcgaXMgZW5hYmxlZFxuICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMik7XG4gICAgICAgICAgICAoZGVtVGlsZS5kZW1UZXh0dXJlOiBhbnkpLmJpbmQoZ2wuTkVBUkVTVCwgZ2wuQ0xBTVBfVE9fRURHRSwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkU0KTtcbiAgICAgICAgICAgIChwcmV2RGVtVGlsZS5kZW1UZXh0dXJlOiBhbnkpLmJpbmQoZ2wuTkVBUkVTVCwgZ2wuQ0xBTVBfVE9fRURHRSwgZ2wuTkVBUkVTVCk7XG5cbiAgICAgICAgICAgIHVuaWZvcm1zW1widV9kZW1fbGVycFwiXSA9IG1vcnBoaW5nUGhhc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZW1UaWxlID0gdGhpcy50ZXJyYWluVGlsZUZvclRpbGVbdGlsZS50aWxlSUQua2V5XTtcbiAgICAgICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTIpO1xuICAgICAgICAgICAgY29uc3QgZGVtVGV4dHVyZSA9IHRoaXMuX3ByZXBhcmVEZW1UaWxlVW5pZm9ybXModGlsZSwgZGVtVGlsZSwgdW5pZm9ybXMpID9cbiAgICAgICAgICAgICAgICAoZGVtVGlsZS5kZW1UZXh0dXJlOiBhbnkpIDogdGhpcy5lbXB0eURFTVRleHR1cmU7XG4gICAgICAgICAgICBkZW1UZXh0dXJlLmJpbmQoZ2wuTkVBUkVTVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUzKTtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VEZXB0aEZvck9jY2x1c2lvbikge1xuICAgICAgICAgICAgdGhpcy5fZGVwdGhUZXh0dXJlLmJpbmQoZ2wuTkVBUkVTVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICB1bmlmb3Jtc1sndV9kZXB0aF9zaXplX2ludiddID0gWzEgLyB0aGlzLl9kZXB0aEZCTy53aWR0aCwgMSAvIHRoaXMuX2RlcHRoRkJPLmhlaWdodF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtcHR5RGVwdGhCdWZmZXJUZXh0dXJlLmJpbmQoZ2wuTkVBUkVTVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICB1bmlmb3Jtc1sndV9kZXB0aF9zaXplX2ludiddID0gWzEsIDFdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VNZXRlclRvRGVtICYmIGRlbVRpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGVyVG9ERU0gPSAoMSA8PCBkZW1UaWxlLnRpbGVJRC5jYW5vbmljYWwueikgKiBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgdGhpcy5wYWludGVyLnRyYW5zZm9ybS5jZW50ZXIubGF0KSAqIHRoaXMuc291cmNlQ2FjaGUuZ2V0U291cmNlKCkudGlsZVNpemU7XG4gICAgICAgICAgICB1bmlmb3Jtc1sndV9tZXRlcl90b19kZW0nXSA9IG1ldGVyVG9ERU07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5sYWJlbFBsYW5lTWF0cml4SW52KSB7XG4gICAgICAgICAgICB1bmlmb3Jtc1sndV9sYWJlbF9wbGFuZV9tYXRyaXhfaW52J10gPSBvcHRpb25zLmxhYmVsUGxhbmVNYXRyaXhJbnY7XG4gICAgICAgIH1cbiAgICAgICAgcHJvZ3JhbS5zZXRUZXJyYWluVW5pZm9ybVZhbHVlcyhjb250ZXh0LCB1bmlmb3Jtcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyVG9CYWNrQnVmZmVyKGFjY3VtdWxhdGVkRHJhcGVzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgICAgICBjb25zdCBwYWludGVyID0gdGhpcy5wYWludGVyO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wYWludGVyLmNvbnRleHQ7XG5cbiAgICAgICAgaWYgKGFjY3VtdWxhdGVkRHJhcGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KG51bGwpO1xuICAgICAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgcGFpbnRlci53aWR0aCwgcGFpbnRlci5oZWlnaHRdKTtcblxuICAgICAgICB0aGlzLnJlbmRlcmluZ1RvVGV4dHVyZSA9IGZhbHNlO1xuICAgICAgICBkcmF3VGVycmFpblJhc3RlcihwYWludGVyLCB0aGlzLCB0aGlzLnByb3h5U291cmNlQ2FjaGUsIGFjY3VtdWxhdGVkRHJhcGVzLCB0aGlzLl91cGRhdGVUaW1lc3RhbXApO1xuICAgICAgICB0aGlzLnJlbmRlcmluZ1RvVGV4dHVyZSA9IHRydWU7XG5cbiAgICAgICAgYWNjdW11bGF0ZWREcmFwZXMuc3BsaWNlKDAsIGFjY3VtdWxhdGVkRHJhcGVzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gRm9yIGVhY2ggcHJveHkgdGlsZSwgcmVuZGVyIGFsbCBsYXllcnMgdW50aWwgdGhlIG5vbi1kcmFwZWQgbGF5ZXIgKGFuZFxuICAgIC8vIHJlbmRlciB0aGUgdGlsZSB0byB0aGUgc2NyZWVuKSBiZWZvcmUgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IHByb3h5IHRpbGUuXG4gICAgLy8gUmV0dXJucyB0aGUgbGFzdCBkcmF3biBpbmRleCB0aGF0IGlzIHVzZWQgYXMgYSBzdGFydFxuICAgIC8vIGxheWVyIGZvciBpbnRlcmxlYXZlZCBkcmFwZWQgcmVuZGVyaW5nLlxuICAgIC8vIEFwYXJ0IHRvIGxheWVyLWJ5LWxheWVyIHJlbmRlcmluZyB1c2VkIGluIDJELCBoZXJlIHdlIGhhdmUgcHJveHktdGlsZS1ieS1wcm94eS10aWxlXG4gICAgLy8gcmVuZGVyaW5nLlxuICAgIHJlbmRlckJhdGNoKHN0YXJ0TGF5ZXJJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuX2RyYXBlZFJlbmRlckJhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRMYXllckluZGV4ICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVuZGVyaW5nVG9UZXh0dXJlID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcGFpbnRlciA9IHRoaXMucGFpbnRlcjtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBwc2MgPSB0aGlzLnByb3h5U291cmNlQ2FjaGU7XG4gICAgICAgIGNvbnN0IHByb3hpZXMgPSB0aGlzLnByb3hpZWRDb29yZHNbcHNjLmlkXTtcblxuICAgICAgICAvLyBDb25zdW1lIGJhdGNoIG9mIHNlcXVlbnRpYWwgZHJhcGUgbGF5ZXJzIGFuZCBtb3ZlIG5leHRcbiAgICAgICAgY29uc3QgZHJhcGVkTGF5ZXJCYXRjaCA9IHRoaXMuX2RyYXBlZFJlbmRlckJhdGNoZXMuc2hpZnQoKTtcbiAgICAgICAgYXNzZXJ0KGRyYXBlZExheWVyQmF0Y2guc3RhcnQgPT09IHN0YXJ0TGF5ZXJJbmRleCk7XG5cbiAgICAgICAgY29uc3QgYWNjdW11bGF0ZWREcmFwZXMgPSBbXTtcbiAgICAgICAgY29uc3QgbGF5ZXJJZHMgPSBwYWludGVyLnN0eWxlLm9yZGVyO1xuXG4gICAgICAgIGxldCBwb29sSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3h5IG9mIHByb3hpZXMpIHtcbiAgICAgICAgICAgIC8vIGJpbmQgZnJhbWVidWZmZXIgYW5kIGFzc2lnbiB0ZXh0dXJlIHRvIHRoZSB0aWxlICh0ZXh0dXJlIHVzZWQgaW4gZHJhd1RlcnJhaW5SYXN0ZXIpLlxuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHBzYy5nZXRUaWxlQnlJRChwcm94eS5wcm94eVRpbGVLZXkpO1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyQ2FjaGVJbmRleCA9IHBzYy5wcm94eUNhY2hlZEZCT1twcm94eS5rZXldID8gcHNjLnByb3h5Q2FjaGVkRkJPW3Byb3h5LmtleV1bc3RhcnRMYXllckluZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZibyA9IHJlbmRlckNhY2hlSW5kZXggIT09IHVuZGVmaW5lZCA/IHBzYy5yZW5kZXJDYWNoZVtyZW5kZXJDYWNoZUluZGV4XSA6IHRoaXMucG9vbFtwb29sSW5kZXgrK107XG4gICAgICAgICAgICBjb25zdCB1c2VSZW5kZXJDYWNoZSA9IHJlbmRlckNhY2hlSW5kZXggIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gZmJvLnRleDtcblxuICAgICAgICAgICAgaWYgKHVzZVJlbmRlckNhY2hlICYmICFmYm8uZGlydHkpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgY2FjaGVkIHJlbmRlciBmcm9tIHByZXZpb3VzIHBhc3MsIG5vIG5lZWQgdG8gcmVuZGVyIGFnYWluLlxuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkRHJhcGVzLnB1c2godGlsZS50aWxlSUQpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQoZmJvLmZiLmZyYW1lYnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRUb1RpbGUgPSBmYWxzZTsgLy8gcmVzZXQgZmxhZy5cbiAgICAgICAgICAgIGlmIChmYm8uZGlydHkpIHtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBvbiBzdGFydC5cbiAgICAgICAgICAgICAgICBjb250ZXh0LmNsZWFyKHtjb2xvcjogQ29sb3IudHJhbnNwYXJlbnQsIHN0ZW5jaWw6IDB9KTtcbiAgICAgICAgICAgICAgICBmYm8uZGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGN1cnJlbnRTdGVuY2lsU291cmNlOyAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHNldHVwIHN0ZW5jaWwgZm9yIHRoZSBzYW1lIHNvdXJjZSBmb3IgY29uc2VjdXRpdmUgbGF5ZXJzLlxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGRyYXBlZExheWVyQmF0Y2guc3RhcnQ7IGogPD0gZHJhcGVkTGF5ZXJCYXRjaC5lbmQ7ICsraikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyID0gcGFpbnRlci5zdHlsZS5fbGF5ZXJzW2xheWVySWRzW2pdXTtcbiAgICAgICAgICAgICAgICBjb25zdCBoaWRkZW4gPSBsYXllci5pc0hpZGRlbihwYWludGVyLnRyYW5zZm9ybS56b29tKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQodGhpcy5fc3R5bGUuaXNMYXllckRyYXBlZChsYXllcikgfHwgaGlkZGVuKTtcbiAgICAgICAgICAgICAgICBpZiAoaGlkZGVuKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gcGFpbnRlci5zdHlsZS5fZ2V0TGF5ZXJTb3VyY2VDYWNoZShsYXllcik7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJveGllZENvb3JkcyA9IHNvdXJjZUNhY2hlID8gdGhpcy5wcm94eVRvU291cmNlW3Byb3h5LmtleV1bc291cmNlQ2FjaGUuaWRdIDogW3Byb3h5XTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb3hpZWRDb29yZHMpIGNvbnRpbnVlOyAvLyB3aGVuIHRpbGUgaXMgbm90IGxvYWRlZCB5ZXQgZm9yIHRoZSBzb3VyY2UgY2FjaGUuXG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb29yZHMgPSAoKHByb3hpZWRDb29yZHM6IGFueSk6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgZmJvLmZiLndpZHRoLCBmYm8uZmIuaGVpZ2h0XSk7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGVuY2lsU291cmNlICE9PSAoc291cmNlQ2FjaGUgPyBzb3VyY2VDYWNoZS5pZCA6IG51bGwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldHVwU3RlbmNpbChmYm8sIHByb3hpZWRDb29yZHMsIGxheWVyLCBzb3VyY2VDYWNoZSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGVuY2lsU291cmNlID0gc291cmNlQ2FjaGUgPyBzb3VyY2VDYWNoZS5pZCA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhaW50ZXIucmVuZGVyTGF5ZXIocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZFRvVGlsZSkge1xuICAgICAgICAgICAgICAgIGZiby5kaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWREcmFwZXMucHVzaCh0aWxlLnRpbGVJRCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF1c2VSZW5kZXJDYWNoZSkge1xuICAgICAgICAgICAgICAgIC0tcG9vbEluZGV4O1xuICAgICAgICAgICAgICAgIGFzc2VydChwb29sSW5kZXggPj0gMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9vbEluZGV4ID09PSBGQk9fUE9PTF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgcG9vbEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRvQmFja0J1ZmZlcihhY2N1bXVsYXRlZERyYXBlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCBzdGF0ZXMgYW5kIHJlbmRlciBsYXN0IGRyYXBlc1xuICAgICAgICB0aGlzLnJlbmRlclRvQmFja0J1ZmZlcihhY2N1bXVsYXRlZERyYXBlcyk7XG4gICAgICAgIHRoaXMucmVuZGVyaW5nVG9UZXh0dXJlID0gZmFsc2U7XG5cbiAgICAgICAgY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KG51bGwpO1xuICAgICAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgcGFpbnRlci53aWR0aCwgcGFpbnRlci5oZWlnaHRdKTtcblxuICAgICAgICByZXR1cm4gZHJhcGVkTGF5ZXJCYXRjaC5lbmQgKyAxO1xuICAgIH1cblxuICAgIHBvc3RSZW5kZXIoKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjb25zdW1lZCBhbGwgdGhlIGRyYXBlZCB0ZXJyYWluIGJhdGNoZXMgYXQgdGhpcyBwb2ludFxuICAgICAgICBhc3NlcnQodGhpcy5fZHJhcGVkUmVuZGVyQmF0Y2hlcy5sZW5ndGggPT09IDApO1xuICAgIH1cblxuICAgIHJlbmRlckNhY2hlRWZmaWNpZW5jeShzdHlsZTogU3R5bGUpOiBPYmplY3Qge1xuICAgICAgICBjb25zdCBsYXllckNvdW50ID0gc3R5bGUub3JkZXIubGVuZ3RoO1xuXG4gICAgICAgIGlmIChsYXllckNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge2VmZmljaWVuY3k6IDEwMC4wfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1bmNhY2hlYWJsZUxheWVyQ291bnQgPSAwO1xuICAgICAgICBsZXQgZHJhcGVkTGF5ZXJDb3VudCA9IDA7XG4gICAgICAgIGxldCByZWFjaGVkVW5kcmFwZWRMYXllciA9IGZhbHNlO1xuICAgICAgICBsZXQgZmlyc3RVbmRyYXBlZExheWVyO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJDb3VudDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHN0eWxlLl9sYXllcnNbc3R5bGUub3JkZXJbaV1dO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9zdHlsZS5pc0xheWVyRHJhcGVkKGxheWVyKSkge1xuICAgICAgICAgICAgICAgIGlmICghcmVhY2hlZFVuZHJhcGVkTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhY2hlZFVuZHJhcGVkTGF5ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBmaXJzdFVuZHJhcGVkTGF5ZXIgPSBsYXllci5pZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZWFjaGVkVW5kcmFwZWRMYXllcikge1xuICAgICAgICAgICAgICAgICAgICArK3VuY2FjaGVhYmxlTGF5ZXJDb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKytkcmFwZWRMYXllckNvdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRyYXBlZExheWVyQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7ZWZmaWNpZW5jeTogMTAwLjB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtlZmZpY2llbmN5OiAoMS4wIC0gdW5jYWNoZWFibGVMYXllckNvdW50IC8gZHJhcGVkTGF5ZXJDb3VudCkgKiAxMDAuMCwgZmlyc3RVbmRyYXBlZExheWVyfTtcbiAgICB9XG5cbiAgICBnZXRNaW5FbGV2YXRpb25CZWxvd01TTCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgbWluID0gMC4wO1xuICAgICAgICAvLyBUaGUgbWF4aW11bSBERU0gZXJyb3IgaW4gbWV0ZXJzIHRvIGJlIGNvbnNlcnZhdGl2ZSAoU1JUTSkuXG4gICAgICAgIGNvbnN0IG1heERFTUVycm9yID0gMzAuMDtcbiAgICAgICAgdGhpcy5fdmlzaWJsZURlbVRpbGVzLmZpbHRlcih0aWxlID0+IHRpbGUuZGVtKS5mb3JFYWNoKHRpbGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWluTWF4VHJlZSA9ICh0aWxlLmRlbTogYW55KS50cmVlO1xuICAgICAgICAgICAgbWluID0gTWF0aC5taW4obWluLCBtaW5NYXhUcmVlLm1pbmltdW1zWzBdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtaW4gPT09IDAuMCA/IG1pbiA6IChtaW4gLSBtYXhERU1FcnJvcikgKiB0aGlzLl9leGFnZ2VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybXMgcmF5Y2FzdCBhZ2FpbnN0IHZpc2libGUgREVNIHRpbGVzIG9uIHRoZSBzY3JlZW4gYW5kIHJldHVybnMgdGhlIGRpc3RhbmNlIHRyYXZlbGxlZCBhbG9uZyB0aGUgcmF5LlxuICAgIC8vIHggJiB5IGNvbXBvbmVudHMgb2YgdGhlIHBvc2l0aW9uIGFyZSBleHBlY3RlZCB0byBiZSBpbiBub3JtYWxpemVkIG1lcmNhdG9yIGNvb3JkaW5hdGVzIFswLCAxXSBhbmQgeiBpbiBtZXRlcnMuXG4gICAgcmF5Y2FzdChwb3M6IHZlYzMsIGRpcjogdmVjMywgZXhhZ2dlcmF0aW9uOiBudW1iZXIpOiA/bnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLl92aXNpYmxlRGVtVGlsZXMpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBQZXJmb3JtIGluaXRpYWwgcmF5Y2FzdHMgYWdhaW5zdCByb290IG5vZGVzIG9mIHRoZSBhdmFpbGFibGUgZGVtIHRpbGVzXG4gICAgICAgIC8vIGFuZCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBzb3J0IHRoZW0gZnJvbSBjbG9zZXN0IHRvIGZ1cnRoZXN0LlxuICAgICAgICBjb25zdCBwcmVwYXJlZFRpbGVzID0gdGhpcy5fdmlzaWJsZURlbVRpbGVzLmZpbHRlcih0aWxlID0+IHRpbGUuZGVtKS5tYXAodGlsZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHRpbGUudGlsZUlEO1xuICAgICAgICAgICAgY29uc3QgdGlsZXMgPSBNYXRoLnBvdygyLjAsIGlkLm92ZXJzY2FsZWRaKTtcbiAgICAgICAgICAgIGNvbnN0IHt4LCB5fSA9IGlkLmNhbm9uaWNhbDtcblxuICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aWxlIGJvdW5kYXJpZXMgaW4gbWVyY2F0b3IgY29vcmRpbmF0ZXNcbiAgICAgICAgICAgIGNvbnN0IG1pbnggPSB4IC8gdGlsZXM7XG4gICAgICAgICAgICBjb25zdCBtYXh4ID0gKHggKyAxKSAvIHRpbGVzO1xuICAgICAgICAgICAgY29uc3QgbWlueSA9IHkgLyB0aWxlcztcbiAgICAgICAgICAgIGNvbnN0IG1heHkgPSAoeSArIDEpIC8gdGlsZXM7XG4gICAgICAgICAgICBjb25zdCB0cmVlID0gKHRpbGUuZGVtOiBhbnkpLnRyZWU7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbWlueCwgbWlueSwgbWF4eCwgbWF4eSxcbiAgICAgICAgICAgICAgICB0OiB0cmVlLnJheWNhc3RSb290KG1pbngsIG1pbnksIG1heHgsIG1heHksIHBvcywgZGlyLCBleGFnZ2VyYXRpb24pLFxuICAgICAgICAgICAgICAgIHRpbGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByZXBhcmVkVGlsZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXQgPSBhLnQgIT09IG51bGwgPyBhLnQgOiBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgY29uc3QgYnQgPSBiLnQgIT09IG51bGwgPyBiLnQgOiBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgICAgICAgICAgcmV0dXJuIGF0IC0gYnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3Qgb2JqIG9mIHByZXBhcmVkVGlsZXMpIHtcbiAgICAgICAgICAgIGlmIChvYmoudCA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAvLyBQZXJmb3JtIG1vcmUgYWNjdXJhdGUgcmF5Y2FzdCBhZ2FpbnN0IHRoZSBkZW0gdHJlZS4gRmlyc3QgaW50ZXJzZWN0aW9uIGlzIHRoZSBjbG9zZXN0IG9uXG4gICAgICAgICAgICAvLyBhcyBhbGwgdGlsZXMgYXJlIHNvcnRlZCBmcm9tIGNsb3Nlc3QgdG8gZnVydGhlc3RcbiAgICAgICAgICAgIGNvbnN0IHRyZWUgPSAob2JqLnRpbGUuZGVtOiBhbnkpLnRyZWU7XG4gICAgICAgICAgICBjb25zdCB0ID0gdHJlZS5yYXljYXN0KG9iai5taW54LCBvYmoubWlueSwgb2JqLm1heHgsIG9iai5tYXh5LCBwb3MsIGRpciwgZXhhZ2dlcmF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKHQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIF9jcmVhdGVGQk8oKTogRkJPIHtcbiAgICAgICAgY29uc3QgcGFpbnRlciA9IHRoaXMucGFpbnRlcjtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICBjb25zdCBidWZmZXJTaXplID0gdGhpcy5kcmFwZUJ1ZmZlclNpemU7XG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICBjb25zdCB0ZXggPSBuZXcgVGV4dHVyZShjb250ZXh0LCB7d2lkdGg6IGJ1ZmZlclNpemVbMF0sIGhlaWdodDogYnVmZmVyU2l6ZVsxXSwgZGF0YTogbnVsbH0sIGdsLlJHQkEpO1xuICAgICAgICB0ZXguYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICBjb25zdCBmYiA9IGNvbnRleHQuY3JlYXRlRnJhbWVidWZmZXIoYnVmZmVyU2l6ZVswXSwgYnVmZmVyU2l6ZVsxXSwgZmFsc2UpO1xuICAgICAgICBmYi5jb2xvckF0dGFjaG1lbnQuc2V0KHRleC50ZXh0dXJlKTtcbiAgICAgICAgZmIuZGVwdGhBdHRhY2htZW50ID0gbmV3IERlcHRoU3RlbmNpbEF0dGFjaG1lbnQoY29udGV4dCwgZmIuZnJhbWVidWZmZXIpO1xuXG4gICAgICAgIGlmICh0aGlzLl9zaGFyZWREZXB0aFN0ZW5jaWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fc2hhcmVkRGVwdGhTdGVuY2lsID0gY29udGV4dC5jcmVhdGVSZW5kZXJidWZmZXIoY29udGV4dC5nbC5ERVBUSF9TVEVOQ0lMLCBidWZmZXJTaXplWzBdLCBidWZmZXJTaXplWzFdKTtcbiAgICAgICAgICAgIHRoaXMuX3N0ZW5jaWxSZWYgPSAwO1xuICAgICAgICAgICAgZmIuZGVwdGhBdHRhY2htZW50LnNldCh0aGlzLl9zaGFyZWREZXB0aFN0ZW5jaWwpO1xuICAgICAgICAgICAgY29udGV4dC5jbGVhcih7c3RlbmNpbDogMH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmIuZGVwdGhBdHRhY2htZW50LnNldCh0aGlzLl9zaGFyZWREZXB0aFN0ZW5jaWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljICYmICFjb250ZXh0LmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpY0ZvcmNlT2ZmKSB7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJmKGdsLlRFWFRVUkVfMkQsXG4gICAgICAgICAgICAgICAgY29udGV4dC5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMuVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsXG4gICAgICAgICAgICAgICAgY29udGV4dC5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtmYiwgdGV4LCBkaXJ0eTogZmFsc2V9O1xuICAgIH1cblxuICAgIF9pbml0RkJPUG9vbCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9vbC5sZW5ndGggPCBNYXRoLm1pbihGQk9fUE9PTF9TSVpFLCB0aGlzLnByb3h5Q29vcmRzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgIHRoaXMucG9vbC5wdXNoKHRoaXMuX2NyZWF0ZUZCTygpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zaG91bGREaXNhYmxlUmVuZGVyQ2FjaGUoKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIERpc2FibGUgcmVuZGVyIGNhY2hlcyBvbiBkeW5hbWljIGV2ZW50cyBkdWUgdG8gZmFkaW5nIG9yIHRyYW5zaXRpb25pbmcuXG4gICAgICAgIGlmICh0aGlzLl9zdHlsZS5saWdodCAmJiB0aGlzLl9zdHlsZS5saWdodC5oYXNUcmFuc2l0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zdHlsZS5fc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3R5bGUuX3NvdXJjZUNhY2hlc1tpZF0uaGFzVHJhbnNpdGlvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmYWRpbmdPclRyYW5zaXRpb25pbmcgPSBpZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX3N0eWxlLl9sYXllcnNbaWRdO1xuICAgICAgICAgICAgY29uc3QgaXNIaWRkZW4gPSBsYXllci5pc0hpZGRlbih0aGlzLnBhaW50ZXIudHJhbnNmb3JtLnpvb20pO1xuICAgICAgICAgICAgY29uc3QgY3Jvc3NGYWRlID0gbGF5ZXIuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpO1xuICAgICAgICAgICAgY29uc3QgaXNGYWRpbmcgPSAhIWNyb3NzRmFkZSAmJiBjcm9zc0ZhZGUudCAhPT0gMTtcbiAgICAgICAgICAgIGNvbnN0IGlzVHJhbnNpdGlvbmluZyA9IGxheWVyLmhhc1RyYW5zaXRpb24oKTtcbiAgICAgICAgICAgIHJldHVybiBsYXllci50eXBlICE9PSAnY3VzdG9tJyAmJiAhaXNIaWRkZW4gJiYgKGlzRmFkaW5nIHx8IGlzVHJhbnNpdGlvbmluZyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZS5vcmRlci5zb21lKGZhZGluZ09yVHJhbnNpdGlvbmluZyk7XG4gICAgfVxuXG4gICAgX2NsZWFyUmFzdGVyRmFkZUZyb21SZW5kZXJDYWNoZSgpIHtcbiAgICAgICAgbGV0IGhhc1Jhc3RlclNvdXJjZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3N0eWxlLl9zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdHlsZS5fc291cmNlQ2FjaGVzW2lkXS5fc291cmNlIGluc3RhbmNlb2YgUmFzdGVyVGlsZVNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGhhc1Jhc3RlclNvdXJjZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFoYXNSYXN0ZXJTb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGFueSByYXN0ZXIgdGlsZSBpcyBpbiBhIGZhZGluZyBzdGF0ZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3N0eWxlLm9yZGVyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX3N0eWxlLl9sYXllcnNbdGhpcy5fc3R5bGUub3JkZXJbaV1dO1xuICAgICAgICAgICAgY29uc3QgaXNIaWRkZW4gPSBsYXllci5pc0hpZGRlbih0aGlzLnBhaW50ZXIudHJhbnNmb3JtLnpvb20pO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLl9zdHlsZS5fZ2V0TGF5ZXJTb3VyY2VDYWNoZShsYXllcik7XG4gICAgICAgICAgICBpZiAobGF5ZXIudHlwZSAhPT0gJ3Jhc3RlcicgfHwgaXNIaWRkZW4gfHwgIXNvdXJjZUNhY2hlKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJhc3RlckxheWVyID0gKChsYXllcjogYW55KTogUmFzdGVyU3R5bGVMYXllcik7XG4gICAgICAgICAgICBjb25zdCBmYWRlRHVyYXRpb24gPSByYXN0ZXJMYXllci5wYWludC5nZXQoJ3Jhc3Rlci1mYWRlLWR1cmF0aW9uJyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3h5IG9mIHRoaXMucHJveHlDb29yZHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm94aWVkQ29vcmRzID0gdGhpcy5wcm94eVRvU291cmNlW3Byb3h5LmtleV1bc291cmNlQ2FjaGUuaWRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9ICgocHJveGllZENvb3JkczogYW55KTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pO1xuICAgICAgICAgICAgICAgIGlmICghY29vcmRzKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIGNvb3Jkcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHNvdXJjZUNhY2hlLmZpbmRMb2FkZWRQYXJlbnQoY29vcmQsIDApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmYWRlID0gcmFzdGVyRmFkZSh0aWxlLCBwYXJlbnQsIHNvdXJjZUNhY2hlLCB0aGlzLnBhaW50ZXIudHJhbnNmb3JtLCBmYWRlRHVyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0ZhZGluZyA9IGZhZGUub3BhY2l0eSAhPT0gMSB8fCBmYWRlLm1peCAhPT0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmFkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbGVhclJlbmRlckNhY2hlRm9yVGlsZShzb3VyY2VDYWNoZS5pZCwgY29vcmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3NldHVwRHJhcGVkUmVuZGVyQmF0Y2hlcygpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJJZHMgPSB0aGlzLl9zdHlsZS5vcmRlcjtcbiAgICAgICAgY29uc3QgbGF5ZXJDb3VudCA9IGxheWVySWRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGxheWVyQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhdGNoZXMgPSBbXTtcblxuICAgICAgICBsZXQgY3VycmVudExheWVyID0gMDtcbiAgICAgICAgbGV0IGxheWVyID0gdGhpcy5fc3R5bGUuX2xheWVyc1tsYXllcklkc1tjdXJyZW50TGF5ZXJdXTtcbiAgICAgICAgd2hpbGUgKCF0aGlzLl9zdHlsZS5pc0xheWVyRHJhcGVkKGxheWVyKSAmJiBsYXllci5pc0hpZGRlbih0aGlzLnBhaW50ZXIudHJhbnNmb3JtLnpvb20pICYmICsrY3VycmVudExheWVyIDwgbGF5ZXJDb3VudCkge1xuICAgICAgICAgICAgbGF5ZXIgPSB0aGlzLl9zdHlsZS5fbGF5ZXJzW2xheWVySWRzW2N1cnJlbnRMYXllcl1dO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJhdGNoU3RhcnQ7XG4gICAgICAgIGZvciAoOyBjdXJyZW50TGF5ZXIgPCBsYXllckNvdW50OyArK2N1cnJlbnRMYXllcikge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9zdHlsZS5fbGF5ZXJzW2xheWVySWRzW2N1cnJlbnRMYXllcl1dO1xuICAgICAgICAgICAgaWYgKGxheWVyLmlzSGlkZGVuKHRoaXMucGFpbnRlci50cmFuc2Zvcm0uem9vbSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fc3R5bGUuaXNMYXllckRyYXBlZChsYXllcikpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmF0Y2hTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhdGNoZXMucHVzaCh7c3RhcnQ6IGJhdGNoU3RhcnQsIGVuZDogY3VycmVudExheWVyIC0gMX0pO1xuICAgICAgICAgICAgICAgICAgICBiYXRjaFN0YXJ0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChiYXRjaFN0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBiYXRjaFN0YXJ0ID0gY3VycmVudExheWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJhdGNoU3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYmF0Y2hlcy5wdXNoKHtzdGFydDogYmF0Y2hTdGFydCwgZW5kOiBjdXJyZW50TGF5ZXIgLSAxfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc3R5bGUubWFwLl9vcHRpbWl6ZUZvclRlcnJhaW4pIHtcbiAgICAgICAgICAgIC8vIERyYXBlZCBmaXJzdCBhcHByb2FjaCBzaG91bGQgcmVzdWx0IGluIGEgc2luZ2xlIG9yIG5vIGJhdGNoXG4gICAgICAgICAgICBhc3NlcnQoYmF0Y2hlcy5sZW5ndGggPT09IDEgfHwgYmF0Y2hlcy5sZW5ndGggPT09IDApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZHJhcGVkUmVuZGVyQmF0Y2hlcyA9IGJhdGNoZXM7XG4gICAgfVxuXG4gICAgX3NldHVwUmVuZGVyQ2FjaGUocHJldmlvdXNQcm94eVRvU291cmNlOiB7W251bWJlcl06IHtbc3RyaW5nXTogQXJyYXk8UHJveGllZFRpbGVJRD59fSkge1xuICAgICAgICBjb25zdCBwc2MgPSB0aGlzLnByb3h5U291cmNlQ2FjaGU7XG4gICAgICAgIGlmICh0aGlzLl9zaG91bGREaXNhYmxlUmVuZGVyQ2FjaGUoKSB8fCB0aGlzLl9pbnZhbGlkYXRlUmVuZGVyQ2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVSZW5kZXJDYWNoZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHBzYy5yZW5kZXJDYWNoZS5sZW5ndGggPiBwc2MucmVuZGVyQ2FjaGVQb29sLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZWQgPSAoKE9iamVjdC52YWx1ZXMocHNjLnByb3h5Q2FjaGVkRkJPKTogYW55KTogQXJyYXk8e1tzdHJpbmcgfCBudW1iZXJdOiBudW1iZXJ9Pik7XG4gICAgICAgICAgICAgICAgcHNjLnByb3h5Q2FjaGVkRkJPID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZib3MgPSAoKE9iamVjdC52YWx1ZXModXNlZFtpXSk6IGFueSk6IEFycmF5PG51bWJlcj4pO1xuICAgICAgICAgICAgICAgICAgICBwc2MucmVuZGVyQ2FjaGVQb29sLnB1c2goLi4uZmJvcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFzc2VydChwc2MucmVuZGVyQ2FjaGUubGVuZ3RoID09PSBwc2MucmVuZGVyQ2FjaGVQb29sLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jbGVhclJhc3RlckZhZGVGcm9tUmVuZGVyQ2FjaGUoKTtcblxuICAgICAgICBjb25zdCBjb29yZHMgPSB0aGlzLnByb3h5Q29vcmRzO1xuICAgICAgICBjb25zdCBkaXJ0eSA9IHRoaXMuX3RpbGVzRGlydHk7XG4gICAgICAgIGZvciAobGV0IGkgPSBjb29yZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3h5ID0gY29vcmRzW2ldO1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHBzYy5nZXRUaWxlQnlJRChwcm94eS5rZXkpO1xuXG4gICAgICAgICAgICBpZiAocHNjLnByb3h5Q2FjaGVkRkJPW3Byb3h5LmtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFzc2VydCh0aWxlLnRleHR1cmUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBwcmV2aW91c1Byb3h5VG9Tb3VyY2VbcHJveHkua2V5XTtcbiAgICAgICAgICAgICAgICBhc3NlcnQocHJldik7XG4gICAgICAgICAgICAgICAgLy8gUmV1c2UgcHJldmlvdXMgcmVuZGVyIGZyb20gY2FjaGUgaWYgdGhlcmUgd2FzIG5vIGNoYW5nZSBvZlxuICAgICAgICAgICAgICAgIC8vIGNvbnRlbnQgdGhhdCB3YXMgdXNlZCB0byByZW5kZXIgcHJveHkgdGlsZS5cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5wcm94eVRvU291cmNlW3Byb3h5LmtleV07XG4gICAgICAgICAgICAgICAgbGV0IGVxdWFsID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBpbiBjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbGVzID0gY3VycmVudFtzb3VyY2VdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2VGlsZXMgPSBwcmV2W3NvdXJjZV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJldlRpbGVzIHx8IHByZXZUaWxlcy5sZW5ndGggIT09IHRpbGVzLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZXMuc29tZSgodCwgaW5kZXgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQgIT09IHByZXZUaWxlc1tpbmRleF0gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlydHlbc291cmNlXSAmJiBkaXJ0eVtzb3VyY2VdLmhhc093blByb3BlcnR5KHQua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICArK2VxdWFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBkaXJ0eSA9PT0gZmFsc2U6IGRvZXNuJ3QgbmVlZCB0byBiZSByZW5kZXJlZCB0bywganVzdCB1c2UgY2FjaGVkIHJlbmRlci5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHByb3h5RkJPIGluIHBzYy5wcm94eUNhY2hlZEZCT1twcm94eS5rZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHBzYy5yZW5kZXJDYWNoZVtwc2MucHJveHlDYWNoZWRGQk9bcHJveHkua2V5XVtwcm94eUZCT11dLmRpcnR5ID0gZXF1YWwgPCAwIHx8IGVxdWFsICE9PSBPYmplY3QudmFsdWVzKHByZXYpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3J0ZWRSZW5kZXJCYXRjaGVzID0gWy4uLnRoaXMuX2RyYXBlZFJlbmRlckJhdGNoZXNdO1xuICAgICAgICBzb3J0ZWRSZW5kZXJCYXRjaGVzLnNvcnQoKGJhdGNoQSwgYmF0Y2hCKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaEFTaXplID0gYmF0Y2hBLmVuZCAtIGJhdGNoQS5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoQlNpemUgPSBiYXRjaEIuZW5kIC0gYmF0Y2hCLnN0YXJ0O1xuICAgICAgICAgICAgcmV0dXJuIGJhdGNoQlNpemUgLSBiYXRjaEFTaXplO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHNvcnRlZFJlbmRlckJhdGNoZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBzYy5wcm94eUNhY2hlZEZCT1tpZC5rZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFzc2lnbiByZW5kZXJDYWNoZSBGQk8gaWYgdGhlcmUgYXJlIGF2YWlsYWJsZSBGQk9zIGluIHBvb2wuXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gcHNjLnJlbmRlckNhY2hlUG9vbC5wb3AoKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCAmJiBwc2MucmVuZGVyQ2FjaGUubGVuZ3RoIDwgUkVOREVSX0NBQ0hFX01BWF9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcHNjLnJlbmRlckNhY2hlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgcHNjLnJlbmRlckNhY2hlLnB1c2godGhpcy5fY3JlYXRlRkJPKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBwc2MucHJveHlDYWNoZWRGQk9baWQua2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBwc2MucHJveHlDYWNoZWRGQk9baWQua2V5XVtiYXRjaC5zdGFydF0gPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgcHNjLnJlbmRlckNhY2hlW2luZGV4XS5kaXJ0eSA9IHRydWU7IC8vIG5lZWRzIHRvIGJlIHJlbmRlcmVkIHRvLlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90aWxlc0RpcnR5ID0ge307XG4gICAgfVxuXG4gICAgX3NldHVwU3RlbmNpbChmYm86IEZCTywgcHJveGllZENvb3JkczogQXJyYXk8UHJveGllZFRpbGVJRD4sIGxheWVyOiBTdHlsZUxheWVyLCBzb3VyY2VDYWNoZT86IFNvdXJjZUNhY2hlKSB7XG4gICAgICAgIGlmICghc291cmNlQ2FjaGUgfHwgIXRoaXMuX3NvdXJjZVRpbGVzT3ZlcmxhcFtzb3VyY2VDYWNoZS5pZF0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vdmVybGFwU3RlbmNpbFR5cGUpIHRoaXMuX292ZXJsYXBTdGVuY2lsVHlwZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIC8vIElmIG5lZWRlZCwgc2V0dXAgc3RlbmNpbGxpbmcuIERvbid0IGJvdGhlciB0byByZW1vdmUgd2hlbiB0aGVyZSBpcyBub1xuICAgICAgICAvLyBtb3JlIG5lZWQ6IGluIHN1Y2ggY2FzZSwgaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCwgc3RlbmNpbGxpbmcgaXMgZGlzYWJsZWQuXG4gICAgICAgIGlmIChwcm94aWVkQ29vcmRzLmxlbmd0aCA8PSAxKSB7IHRoaXMuX292ZXJsYXBTdGVuY2lsVHlwZSA9IGZhbHNlOyByZXR1cm47IH1cblxuICAgICAgICBjb25zdCBmYiA9IGZiby5mYjtcbiAgICAgICAgbGV0IHN0ZW5jaWxSYW5nZTtcbiAgICAgICAgaWYgKGxheWVyLmlzVGlsZUNsaXBwZWQoKSkge1xuICAgICAgICAgICAgc3RlbmNpbFJhbmdlID0gcHJveGllZENvb3Jkcy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGFwU3RlbmNpbE1vZGUudGVzdCA9IHtmdW5jOiBnbC5FUVVBTCwgbWFzazogMHhGRn07XG4gICAgICAgICAgICB0aGlzLl9vdmVybGFwU3RlbmNpbFR5cGUgPSAnQ2xpcCc7XG4gICAgICAgIH0gZWxzZSBpZiAocHJveGllZENvb3Jkc1swXS5vdmVyc2NhbGVkWiA+IHByb3hpZWRDb29yZHNbcHJveGllZENvb3Jkcy5sZW5ndGggLSAxXS5vdmVyc2NhbGVkWikge1xuICAgICAgICAgICAgc3RlbmNpbFJhbmdlID0gMTtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXBTdGVuY2lsTW9kZS50ZXN0ID0ge2Z1bmM6IGdsLkdSRUFURVIsIG1hc2s6IDB4RkZ9O1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxUeXBlID0gJ01hc2snO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxUeXBlID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N0ZW5jaWxSZWYgKyBzdGVuY2lsUmFuZ2UgPiAyNTUpIHtcbiAgICAgICAgICAgIGNvbnRleHQuY2xlYXIoe3N0ZW5jaWw6IDB9KTtcbiAgICAgICAgICAgIHRoaXMuX3N0ZW5jaWxSZWYgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0ZW5jaWxSZWYgKz0gc3RlbmNpbFJhbmdlO1xuICAgICAgICB0aGlzLl9vdmVybGFwU3RlbmNpbE1vZGUucmVmID0gdGhpcy5fc3RlbmNpbFJlZjtcbiAgICAgICAgaWYgKGxheWVyLmlzVGlsZUNsaXBwZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyVGlsZUNsaXBwaW5nTWFza3MocHJveGllZENvb3JkcywgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxNb2RlLnJlZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGlwT3JNYXNrT3ZlcmxhcFN0ZW5jaWxUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxhcFN0ZW5jaWxUeXBlID09PSAnQ2xpcCcgfHwgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxUeXBlID09PSAnTWFzayc7XG4gICAgfVxuXG4gICAgc3RlbmNpbE1vZGVGb3JSVFRPdmVybGFwKGlkOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIGlmICghdGhpcy5yZW5kZXJpbmdUb1RleHR1cmUgfHwgIXRoaXMuX292ZXJsYXBTdGVuY2lsVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIFN0ZW5jaWxNb2RlLmRpc2FibGVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFsbCBzb3VyY2UgdGlsZXMgY29udHJpYnV0aW5nIHRvIHRoZSBzYW1lIHByb3h5IGFyZSBwcm9jZXNzZWQgaW4gc2VxdWVuY2UsIGluIHpvb20gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgICAgLy8gRm9yIHJhc3RlciAvIGhpbGxzaGFkZSBvdmVybGFwIG1hc2tpbmcsIHJlZiBpcyBiYXNlZCBvbiB6b29tIGRpZi5cbiAgICAgICAgLy8gRm9yIHZlY3RvciBsYXllciBjbGlwcGluZywgZXZlcnkgdGlsZSBnZXRzIGRlZGljYXRlZCBzdGVuY2lsIHJlZi5cbiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXBTdGVuY2lsVHlwZSA9PT0gJ0NsaXAnKSB7XG4gICAgICAgICAgICAvLyBJbiBpbW1lZGlhdGUgMkQgbW9kZSwgd2UgcmVuZGVyIHJlY3RzIHRvIG1hcmsgY2xpcHBpbmcgYXJlYSBhbmQgaGFuZGxlIGJlaGF2aW9yIG9uIHRpbGUgYm9yZGVycy5cbiAgICAgICAgICAgIC8vIEhlcmUsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIG5vdyBmb3IgdGhpczpcbiAgICAgICAgICAgIC8vIDEuIG92ZXJsYXAgaXMgaGFuZGxlZCBieSBwcm94eSByZW5kZXIgdG8gdGV4dHVyZSB0aWxlcyAodGhlcmUgaXMgbm8gb3ZlcmxhcCB0aGVyZSlcbiAgICAgICAgICAgIC8vIDIuIGhlcmUgd2UgaGFuZGxlIG9ubHkgYnJpZWYgem9vbSBvdXQgc2VtaS10cmFuc3BhcmVudCBjb2xvciBpbnRlbnNpdHkgZmxpY2tlcmluZ1xuICAgICAgICAgICAgLy8gICAgYW5kIHRoYXQgaXMgYXZvaWRlZCBmaW5lIGJ5IHN0ZW5jaWxpbmcgcHJpbWl0aXZlcyBhcyBwYXJ0IG9mIGRyYXdpbmcgKGluc3RlYWQgb2YgYWRkaXRpb25hbCB0aWxlIHF1YWQgc3RlcCkuXG4gICAgICAgICAgICB0aGlzLl9vdmVybGFwU3RlbmNpbE1vZGUucmVmID0gdGhpcy5wYWludGVyLl90aWxlQ2xpcHBpbmdNYXNrSURzW2lkLmtleV07XG4gICAgICAgIH0gLy8gZWxzZSB0aGlzLl9vdmVybGFwU3RlbmNpbE1vZGUucmVmIGlzIHNldCB0byBhIHNpbmdsZSB2YWx1ZSB1c2VkIHBlciBwcm94eSB0aWxlLCBpbiBfc2V0dXBTdGVuY2lsLlxuICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxhcFN0ZW5jaWxNb2RlO1xuICAgIH1cblxuICAgIF9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyhwcm94aWVkQ29vcmRzOiBBcnJheTxQcm94aWVkVGlsZUlEPiwgcmVmOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcGFpbnRlciA9IHRoaXMucGFpbnRlcjtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIHBhaW50ZXIuX3RpbGVDbGlwcGluZ01hc2tJRHMgPSB7fTtcbiAgICAgICAgY29udGV4dC5zZXRDb2xvck1vZGUoQ29sb3JNb2RlLmRpc2FibGVkKTtcbiAgICAgICAgY29udGV4dC5zZXREZXB0aE1vZGUoRGVwdGhNb2RlLmRpc2FibGVkKTtcblxuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdjbGlwcGluZ01hc2snKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGVJRCBvZiBwcm94aWVkQ29vcmRzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHBhaW50ZXIuX3RpbGVDbGlwcGluZ01hc2tJRHNbdGlsZUlELmtleV0gPSAtLXJlZjtcbiAgICAgICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIERlcHRoTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICAvLyBUZXN0cyB3aWxsIGFsd2F5cyBwYXNzLCBhbmQgcmVmIHZhbHVlIHdpbGwgYmUgd3JpdHRlbiB0byBzdGVuY2lsIGJ1ZmZlci5cbiAgICAgICAgICAgICAgICBuZXcgU3RlbmNpbE1vZGUoe2Z1bmM6IGdsLkFMV0FZUywgbWFzazogMH0sIGlkLCAweEZGLCBnbC5LRUVQLCBnbC5LRUVQLCBnbC5SRVBMQUNFKSxcbiAgICAgICAgICAgICAgICBDb2xvck1vZGUuZGlzYWJsZWQsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCwgY2xpcHBpbmdNYXNrVW5pZm9ybVZhbHVlcyh0aWxlSUQucHJvak1hdHJpeCksXG4gICAgICAgICAgICAgICAgJyRjbGlwcGluZycsIHBhaW50ZXIudGlsZUV4dGVudEJ1ZmZlcixcbiAgICAgICAgICAgICAgICBwYWludGVyLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyLCBwYWludGVyLnRpbGVFeHRlbnRTZWdtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYXN0cyBhIHJheSBmcm9tIGEgcG9pbnQgb24gc2NyZWVuIGFuZCByZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnQgd2l0aCB0aGUgdGVycmFpbi5cbiAgICAvLyBUaGUgcmV0dXJuZWQgcG9pbnQgY29udGFpbnMgdGhlIG1lcmNhdG9yIGNvb3JkaW5hdGVzIGluIGl0cyBmaXJzdCAzIGNvbXBvbmVudHMsIGFuZCBlbGV2YXRpb25cbiAgICAvLyBpbiBtZXRlciBpbiBpdHMgNHRoIGNvb3JkaW5hdGUuXG4gICAgcG9pbnRDb29yZGluYXRlKHNjcmVlblBvaW50OiBQb2ludCk6ID92ZWM0IHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gdGhpcy5wYWludGVyLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKHNjcmVlblBvaW50LnggPCAwIHx8IHNjcmVlblBvaW50LnggPiB0cmFuc2Zvcm0ud2lkdGggfHxcbiAgICAgICAgICAgIHNjcmVlblBvaW50LnkgPCAwIHx8IHNjcmVlblBvaW50LnkgPiB0cmFuc2Zvcm0uaGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhciA9IFtzY3JlZW5Qb2ludC54LCBzY3JlZW5Qb2ludC55LCAxLCAxXTtcbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KGZhciwgZmFyLCB0cmFuc2Zvcm0ucGl4ZWxNYXRyaXhJbnZlcnNlKTtcbiAgICAgICAgdmVjNC5zY2FsZShmYXIsIGZhciwgMS4wIC8gZmFyWzNdKTtcbiAgICAgICAgLy8geCAmIHkgaW4gcGl4ZWwgY29vcmRpbmF0ZXMsIHogaXMgYWx0aXR1ZGUgaW4gbWV0ZXJzXG4gICAgICAgIGZhclswXSAvPSB0cmFuc2Zvcm0ud29ybGRTaXplO1xuICAgICAgICBmYXJbMV0gLz0gdHJhbnNmb3JtLndvcmxkU2l6ZTtcbiAgICAgICAgY29uc3QgY2FtZXJhID0gdHJhbnNmb3JtLl9jYW1lcmEucG9zaXRpb247XG4gICAgICAgIGNvbnN0IG1lcmNhdG9yWlNjYWxlID0gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIHRyYW5zZm9ybS5jZW50ZXIubGF0KTtcbiAgICAgICAgY29uc3QgcCA9IFtjYW1lcmFbMF0sIGNhbWVyYVsxXSwgY2FtZXJhWzJdIC8gbWVyY2F0b3JaU2NhbGUsIDAuMF07XG4gICAgICAgIGNvbnN0IGRpciA9IHZlYzMuc3VidHJhY3QoW10sIGZhci5zbGljZSgwLCAzKSwgcCk7XG4gICAgICAgIHZlYzMubm9ybWFsaXplKGRpciwgZGlyKTtcblxuICAgICAgICBjb25zdCBleGFnZ2VyYXRpb24gPSB0aGlzLl9leGFnZ2VyYXRpb247XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlQWxvbmdSYXkgPSB0aGlzLnJheWNhc3QocCwgZGlyLCBleGFnZ2VyYXRpb24pO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUFsb25nUmF5ID09PSBudWxsIHx8ICFkaXN0YW5jZUFsb25nUmF5KSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChwLCBwLCBkaXIsIGRpc3RhbmNlQWxvbmdSYXkpO1xuICAgICAgICBwWzNdID0gcFsyXTtcbiAgICAgICAgcFsyXSAqPSBtZXJjYXRvclpTY2FsZTtcbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgZHJhd0RlcHRoKCkge1xuICAgICAgICBjb25zdCBwYWludGVyID0gdGhpcy5wYWludGVyO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBwc2MgPSB0aGlzLnByb3h5U291cmNlQ2FjaGU7XG5cbiAgICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLmNlaWwocGFpbnRlci53aWR0aCksIGhlaWdodCA9IE1hdGguY2VpbChwYWludGVyLmhlaWdodCk7XG4gICAgICAgIGlmICh0aGlzLl9kZXB0aEZCTyAmJiAodGhpcy5fZGVwdGhGQk8ud2lkdGggIT09IHdpZHRoIHx8IHRoaXMuX2RlcHRoRkJPLmhlaWdodCAhPT0gaGVpZ2h0KSkge1xuICAgICAgICAgICAgdGhpcy5fZGVwdGhGQk8uZGVzdHJveSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2RlcHRoRkJPO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2RlcHRoVGV4dHVyZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2RlcHRoRkJPKSB7XG4gICAgICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgICAgICBjb25zdCBmYm8gPSBjb250ZXh0LmNyZWF0ZUZyYW1lYnVmZmVyKHdpZHRoLCBoZWlnaHQsIHRydWUpO1xuICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwge3dpZHRoLCBoZWlnaHQsIGRhdGE6IG51bGx9LCBnbC5SR0JBKTtcbiAgICAgICAgICAgIHRleHR1cmUuYmluZChnbC5ORUFSRVNULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGZiby5jb2xvckF0dGFjaG1lbnQuc2V0KHRleHR1cmUudGV4dHVyZSk7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJidWZmZXIgPSBjb250ZXh0LmNyZWF0ZVJlbmRlcmJ1ZmZlcihjb250ZXh0LmdsLkRFUFRIX0NPTVBPTkVOVDE2LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIGZiby5kZXB0aEF0dGFjaG1lbnQuc2V0KHJlbmRlcmJ1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLl9kZXB0aEZCTyA9IGZibztcbiAgICAgICAgICAgIHRoaXMuX2RlcHRoVGV4dHVyZSA9IHRleHR1cmU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KHRoaXMuX2RlcHRoRkJPLmZyYW1lYnVmZmVyKTtcbiAgICAgICAgY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHdpZHRoLCBoZWlnaHRdKTtcblxuICAgICAgICBkcmF3VGVycmFpbkRlcHRoKHBhaW50ZXIsIHRoaXMsIHBzYywgdGhpcy5wcm94eUNvb3Jkcyk7XG4gICAgfVxuXG4gICAgX3NldHVwUHJveGllZENvb3Jkc0Zvck9ydGhvKHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgc291cmNlQ29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPiwgcHJldmlvdXNQcm94eVRvU291cmNlOiB7W251bWJlcl06IHtbc3RyaW5nXTogQXJyYXk8UHJveGllZFRpbGVJRD59fSkge1xuICAgICAgICBpZiAoc291cmNlQ2FjaGUuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJbWFnZVNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NldHVwUHJveGllZENvb3Jkc0ZvckltYWdlU291cmNlKHNvdXJjZUNhY2hlLCBzb3VyY2VDb29yZHMsIHByZXZpb3VzUHJveHlUb1NvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZmluZENvdmVyaW5nVGlsZUNhY2hlW3NvdXJjZUNhY2hlLmlkXSA9IHRoaXMuX2ZpbmRDb3ZlcmluZ1RpbGVDYWNoZVtzb3VyY2VDYWNoZS5pZF0gfHwge307XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMucHJveGllZENvb3Jkc1tzb3VyY2VDYWNoZS5pZF0gPSBbXTtcbiAgICAgICAgY29uc3QgcHJveHlzID0gdGhpcy5wcm94eUNvb3JkcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm94eXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3h5VGlsZUlEID0gcHJveHlzW2ldO1xuICAgICAgICAgICAgY29uc3QgcHJveGllZCA9IHRoaXMuX2ZpbmRUaWxlQ292ZXJpbmdUaWxlSUQocHJveHlUaWxlSUQsIHNvdXJjZUNhY2hlKTtcbiAgICAgICAgICAgIGlmIChwcm94aWVkKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHByb3hpZWQuaGFzRGF0YSgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuX2NyZWF0ZVByb3hpZWRJZChwcm94eVRpbGVJRCwgcHJveGllZCwgcHJldmlvdXNQcm94eVRvU291cmNlW3Byb3h5VGlsZUlELmtleV0gJiYgcHJldmlvdXNQcm94eVRvU291cmNlW3Byb3h5VGlsZUlELmtleV1bc291cmNlQ2FjaGUuaWRdKTtcbiAgICAgICAgICAgICAgICBjb29yZHMucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm94eVRvU291cmNlW3Byb3h5VGlsZUlELmtleV1bc291cmNlQ2FjaGUuaWRdID0gW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgaGFzT3ZlcmxhcCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZUNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoc291cmNlQ29vcmRzW2ldKTtcbiAgICAgICAgICAgIGlmICghdGlsZSB8fCAhdGlsZS5oYXNEYXRhKCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgcHJveHkgPSB0aGlzLl9maW5kVGlsZUNvdmVyaW5nVGlsZUlEKHRpbGUudGlsZUlELCB0aGlzLnByb3h5U291cmNlQ2FjaGUpO1xuICAgICAgICAgICAgLy8gRG9uJ3QgYWRkIHRoZSB0aWxlIGlmIGFscmVhZHkgYWRkZWQgaW4gbG9vcCBhYm92ZS5cbiAgICAgICAgICAgIGlmIChwcm94eSAmJiBwcm94eS50aWxlSUQuY2Fub25pY2FsLnogIT09IHRpbGUudGlsZUlELmNhbm9uaWNhbC56KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLnByb3h5VG9Tb3VyY2VbcHJveHkudGlsZUlELmtleV1bc291cmNlQ2FjaGUuaWRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5fY3JlYXRlUHJveGllZElkKHByb3h5LnRpbGVJRCwgdGlsZSwgcHJldmlvdXNQcm94eVRvU291cmNlW3Byb3h5LnRpbGVJRC5rZXldICYmIHByZXZpb3VzUHJveHlUb1NvdXJjZVtwcm94eS50aWxlSUQua2V5XVtzb3VyY2VDYWNoZS5pZF0pO1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm94eVRvU291cmNlW3Byb3h5LnRpbGVJRC5rZXldW3NvdXJjZUNhY2hlLmlkXSA9IFtpZF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxhc3QgZWxlbWVudCBpcyBwYXJlbnQgYWRkZWQgaW4gbG9vcCBhYm92ZS4gVGhpcyB3YXkgd2UgZ2V0XG4gICAgICAgICAgICAgICAgICAgIC8vIGEgbGlzdCBpbiBaIGRlc2NlbmRpbmcgb3JkZXIgd2hpY2ggaXMgbmVlZGVkIGZvciBzdGVuY2lsIG1hc2tpbmcuXG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnNwbGljZShhcnJheS5sZW5ndGggLSAxLCAwLCBpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvb3Jkcy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICBoYXNPdmVybGFwID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3VyY2VUaWxlc092ZXJsYXBbc291cmNlQ2FjaGUuaWRdID0gaGFzT3ZlcmxhcDtcbiAgICB9XG5cbiAgICBfc2V0dXBQcm94aWVkQ29vcmRzRm9ySW1hZ2VTb3VyY2Uoc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBzb3VyY2VDb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+LCBwcmV2aW91c1Byb3h5VG9Tb3VyY2U6IHtbbnVtYmVyXToge1tzdHJpbmddOiBBcnJheTxQcm94aWVkVGlsZUlEPn19KSB7XG4gICAgICAgIGlmICghc291cmNlQ2FjaGUuZ2V0U291cmNlKCkubG9hZGVkKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBjb29yZHMgPSB0aGlzLnByb3hpZWRDb29yZHNbc291cmNlQ2FjaGUuaWRdID0gW107XG4gICAgICAgIGNvbnN0IHByb3h5cyA9IHRoaXMucHJveHlDb29yZHM7XG4gICAgICAgIGNvbnN0IGltYWdlU291cmNlOiBJbWFnZVNvdXJjZSA9ICgoc291cmNlQ2FjaGUuZ2V0U291cmNlKCk6IGFueSk6IEltYWdlU291cmNlKTtcblxuICAgICAgICBjb25zdCBhbmNob3IgPSBuZXcgUG9pbnQoaW1hZ2VTb3VyY2UudGlsZUlELngsIGltYWdlU291cmNlLnRpbGVJRC55KS5fZGl2KDEgPDwgaW1hZ2VTb3VyY2UudGlsZUlELnopO1xuICAgICAgICBjb25zdCBhYWJiID0gaW1hZ2VTb3VyY2UuY29vcmRpbmF0ZXMubWFwKE1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KS5yZWR1Y2UoKGFjYywgY29vcmQpID0+IHtcbiAgICAgICAgICAgIGFjYy5taW4ueCA9IE1hdGgubWluKGFjYy5taW4ueCwgY29vcmQueCAtIGFuY2hvci54KTtcbiAgICAgICAgICAgIGFjYy5taW4ueSA9IE1hdGgubWluKGFjYy5taW4ueSwgY29vcmQueSAtIGFuY2hvci55KTtcbiAgICAgICAgICAgIGFjYy5tYXgueCA9IE1hdGgubWF4KGFjYy5tYXgueCwgY29vcmQueCAtIGFuY2hvci54KTtcbiAgICAgICAgICAgIGFjYy5tYXgueSA9IE1hdGgubWF4KGFjYy5tYXgueSwgY29vcmQueSAtIGFuY2hvci55KTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHttaW46IG5ldyBQb2ludChOdW1iZXIuTUFYX1ZBTFVFLCBOdW1iZXIuTUFYX1ZBTFVFKSwgbWF4OiBuZXcgUG9pbnQoLU51bWJlci5NQVhfVkFMVUUsIC1OdW1iZXIuTUFYX1ZBTFVFKX0pO1xuXG4gICAgICAgIC8vIEZhc3QgY29uc2VydmF0aXZlIGNoZWNrIHVzaW5nIGFhYmI6IGNvbnRlbnQgb3V0c2lkZSBwcm94eSB0aWxlIGdldHMgY2xpcHBlZCBvdXQgYnkgb24gcmVuZGVyLCBhbnl3YXkuXG4gICAgICAgIGNvbnN0IHRpbGVPdXRzaWRlSW1hZ2UgPSAodGlsZUlELCBpbWFnZVRpbGVJRCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeCA9IHRpbGVJRC53cmFwICsgdGlsZUlELmNhbm9uaWNhbC54IC8gKDEgPDwgdGlsZUlELmNhbm9uaWNhbC56KTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSB0aWxlSUQuY2Fub25pY2FsLnkgLyAoMSA8PCB0aWxlSUQuY2Fub25pY2FsLnopO1xuICAgICAgICAgICAgY29uc3QgZCA9IEVYVEVOVCAvICgxIDw8IHRpbGVJRC5jYW5vbmljYWwueik7XG5cbiAgICAgICAgICAgIGNvbnN0IGl4ID0gaW1hZ2VUaWxlSUQud3JhcCArIGltYWdlVGlsZUlELmNhbm9uaWNhbC54IC8gKDEgPDwgaW1hZ2VUaWxlSUQuY2Fub25pY2FsLnopO1xuICAgICAgICAgICAgY29uc3QgaXkgPSBpbWFnZVRpbGVJRC5jYW5vbmljYWwueSAvICgxIDw8IGltYWdlVGlsZUlELmNhbm9uaWNhbC56KTtcblxuICAgICAgICAgICAgcmV0dXJuIHggKyBkIDwgaXggKyBhYWJiLm1pbi54IHx8IHggPiBpeCArIGFhYmIubWF4LnggfHwgeSArIGQgPCBpeSArIGFhYmIubWluLnkgfHwgeSA+IGl5ICsgYWFiYi5tYXgueTtcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3h5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcHJveHlUaWxlSUQgPSBwcm94eXNbaV07XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNvdXJjZUNvb3Jkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKHNvdXJjZUNvb3Jkc1tqXSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aWxlIHx8ICF0aWxlLmhhc0RhdGEoKSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAvLyBTZXR1cCBwcm94aWVkIC0+IHByb3h5IG1hcHBpbmcgb25seSBpZiBpbWFnZSBvbiBnaXZlbiB0aWxlIHdyYXAgaW50ZXJzZWN0cyB0aGUgcHJveHkgdGlsZS5cbiAgICAgICAgICAgICAgICBpZiAodGlsZU91dHNpZGVJbWFnZShwcm94eVRpbGVJRCwgdGlsZS50aWxlSUQpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5fY3JlYXRlUHJveGllZElkKHByb3h5VGlsZUlELCB0aWxlLCBwcmV2aW91c1Byb3h5VG9Tb3VyY2VbcHJveHlUaWxlSUQua2V5XSAmJiBwcmV2aW91c1Byb3h5VG9Tb3VyY2VbcHJveHlUaWxlSUQua2V5XVtzb3VyY2VDYWNoZS5pZF0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5ID0gdGhpcy5wcm94eVRvU291cmNlW3Byb3h5VGlsZUlELmtleV1bc291cmNlQ2FjaGUuaWRdO1xuICAgICAgICAgICAgICAgIGlmICghYXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm94eVRvU291cmNlW3Byb3h5VGlsZUlELmtleV1bc291cmNlQ2FjaGUuaWRdID0gW2lkXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29vcmRzLnB1c2goaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcmVjeWNsZSBpcyBwcmV2aW91cyBwYXNzIGNvbnRlbnQgdGhhdCBsaWtlbHkgY29udGFpbnMgcHJveGllZCBJRCBjb21iaW5pbmcgcHJveHkgYW5kIHNvdXJjZSB0aWxlLlxuICAgIF9jcmVhdGVQcm94aWVkSWQocHJveHlUaWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHRpbGU6IFRpbGUsIHJlY3ljbGU6IEFycmF5PFByb3hpZWRUaWxlSUQ+KTogUHJveGllZFRpbGVJRCB7XG4gICAgICAgIGxldCBtYXRyaXggPSB0aGlzLm9ydGhvTWF0cml4O1xuICAgICAgICBpZiAocmVjeWNsZSkge1xuICAgICAgICAgICAgY29uc3QgcmVjeWNsZWQgPSByZWN5Y2xlLmZpbmQocHJveGllZCA9PiAocHJveGllZC5rZXkgPT09IHRpbGUudGlsZUlELmtleSkpO1xuICAgICAgICAgICAgaWYgKHJlY3ljbGVkKSByZXR1cm4gcmVjeWNsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbGUudGlsZUlELmtleSAhPT0gcHJveHlUaWxlSUQua2V5KSB7XG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IHByb3h5VGlsZUlELmNhbm9uaWNhbC56IC0gdGlsZS50aWxlSUQuY2Fub25pY2FsLno7XG4gICAgICAgICAgICBtYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgbGV0IHNpemUsIHhPZmZzZXQsIHlPZmZzZXQ7XG4gICAgICAgICAgICBjb25zdCB3cmFwID0gKHRpbGUudGlsZUlELndyYXAgLSBwcm94eVRpbGVJRC53cmFwKSA8PCBwcm94eVRpbGVJRC5vdmVyc2NhbGVkWjtcbiAgICAgICAgICAgIGlmIChzY2FsZSA+IDApIHtcbiAgICAgICAgICAgICAgICBzaXplID0gRVhURU5UID4+IHNjYWxlO1xuICAgICAgICAgICAgICAgIHhPZmZzZXQgPSBzaXplICogKCh0aWxlLnRpbGVJRC5jYW5vbmljYWwueCA8PCBzY2FsZSkgLSBwcm94eVRpbGVJRC5jYW5vbmljYWwueCArIHdyYXApO1xuICAgICAgICAgICAgICAgIHlPZmZzZXQgPSBzaXplICogKCh0aWxlLnRpbGVJRC5jYW5vbmljYWwueSA8PCBzY2FsZSkgLSBwcm94eVRpbGVJRC5jYW5vbmljYWwueSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNpemUgPSBFWFRFTlQgPDwgLXNjYWxlO1xuICAgICAgICAgICAgICAgIHhPZmZzZXQgPSBFWFRFTlQgKiAodGlsZS50aWxlSUQuY2Fub25pY2FsLnggLSAoKHByb3h5VGlsZUlELmNhbm9uaWNhbC54ICsgd3JhcCkgPDwgLXNjYWxlKSk7XG4gICAgICAgICAgICAgICAgeU9mZnNldCA9IEVYVEVOVCAqICh0aWxlLnRpbGVJRC5jYW5vbmljYWwueSAtIChwcm94eVRpbGVJRC5jYW5vbmljYWwueSA8PCAtc2NhbGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hdDQub3J0aG8obWF0cml4LCAwLCBzaXplLCAwLCBzaXplLCAwLCAxKTtcbiAgICAgICAgICAgIG1hdDQudHJhbnNsYXRlKG1hdHJpeCwgbWF0cml4LCBbeE9mZnNldCwgeU9mZnNldCwgMF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJveGllZFRpbGVJRCh0aWxlLnRpbGVJRCwgcHJveHlUaWxlSUQua2V5LCBtYXRyaXgpO1xuICAgIH1cblxuICAgIC8vIEEgdmFyaWFudCBvZiBTb3VyY2VDYWNoZS5maW5kTG9hZGVkUGFyZW50IHRoYXQgY29uc2lkZXJzIG9ubHkgdmlzaWJsZVxuICAgIC8vIHRpbGVzIChhbmQgZG9lc24ndCBjaGVjayBTb3VyY2VDYWNoZS5fY2FjaGUpLiBBbm90aGVyIGRpZmZlcmVuY2UgaXMgaW5cbiAgICAvLyBjYWNoaW5nIFwibm90IGZvdW5kXCIgcmVzdWx0cyBhbG9uZyB0aGUgbG9va3VwLCB0byBsZWF2ZSB0aGUgbG9va3VwIGVhcmx5LlxuICAgIC8vIE5vdCBmb3VuZCBpcyBjYWNoZWQgYnkgdGhpcy5fZmluZENvdmVyaW5nVGlsZUNhY2hlW2tleV0gPSBudWxsO1xuICAgIF9maW5kVGlsZUNvdmVyaW5nVGlsZUlEKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlKTogP1RpbGUge1xuICAgICAgICBsZXQgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUodGlsZUlEKTtcbiAgICAgICAgaWYgKHRpbGUgJiYgdGlsZS5oYXNEYXRhKCkpIHJldHVybiB0aWxlO1xuXG4gICAgICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMuX2ZpbmRDb3ZlcmluZ1RpbGVDYWNoZVtzb3VyY2VDYWNoZS5pZF07XG4gICAgICAgIGNvbnN0IGtleSA9IGxvb2t1cFt0aWxlSUQua2V5XTtcbiAgICAgICAgdGlsZSA9IGtleSA/IHNvdXJjZUNhY2hlLmdldFRpbGVCeUlEKGtleSkgOiBudWxsO1xuICAgICAgICBpZiAoKHRpbGUgJiYgdGlsZS5oYXNEYXRhKCkpIHx8IGtleSA9PT0gbnVsbCkgcmV0dXJuIHRpbGU7XG5cbiAgICAgICAgYXNzZXJ0KCFrZXkgfHwgdGlsZSk7XG5cbiAgICAgICAgbGV0IHNvdXJjZVRpbGVJRCA9IHRpbGUgPyB0aWxlLnRpbGVJRCA6IHRpbGVJRDtcbiAgICAgICAgbGV0IHogPSBzb3VyY2VUaWxlSUQub3ZlcnNjYWxlZFo7XG4gICAgICAgIGNvbnN0IG1pbnpvb20gPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5taW56b29tO1xuICAgICAgICBjb25zdCBwYXRoID0gW107XG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICBjb25zdCBtYXh6b29tID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCkubWF4em9vbTtcbiAgICAgICAgICAgIGlmICh0aWxlSUQuY2Fub25pY2FsLnogPj0gbWF4em9vbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvd25zY2FsZSA9IHRpbGVJRC5jYW5vbmljYWwueiAtIG1heHpvb207XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLnJlcGFyc2VPdmVyc2NhbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHogPSBNYXRoLm1heCh0aWxlSUQuY2Fub25pY2FsLnogKyAyLCBzb3VyY2VDYWNoZS50cmFuc2Zvcm0udGlsZVpvb20pO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VUaWxlSUQgPSBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB0aWxlSUQud3JhcCwgbWF4em9vbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVJRC5jYW5vbmljYWwueCA+PiBkb3duc2NhbGUsIHRpbGVJRC5jYW5vbmljYWwueSA+PiBkb3duc2NhbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG93bnNjYWxlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHogPSBtYXh6b29tO1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VUaWxlSUQgPSBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB0aWxlSUQud3JhcCwgbWF4em9vbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVJRC5jYW5vbmljYWwueCA+PiBkb3duc2NhbGUsIHRpbGVJRC5jYW5vbmljYWwueSA+PiBkb3duc2NhbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzb3VyY2VUaWxlSUQua2V5ICE9PSB0aWxlSUQua2V5KSB7XG4gICAgICAgICAgICAgICAgcGF0aC5wdXNoKHNvdXJjZVRpbGVJRC5rZXkpO1xuICAgICAgICAgICAgICAgIHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKHNvdXJjZVRpbGVJRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXRoVG9Mb29rdXAgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICBwYXRoLmZvckVhY2goaWQgPT4geyBsb29rdXBbaWRdID0ga2V5OyB9KTtcbiAgICAgICAgICAgIHBhdGgubGVuZ3RoID0gMDtcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKHogPSB6IC0gMTsgeiA+PSBtaW56b29tICYmICEodGlsZSAmJiB0aWxlLmhhc0RhdGEoKSk7IHotLSkge1xuICAgICAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgICAgICBwYXRoVG9Mb29rdXAodGlsZS50aWxlSUQua2V5KTsgLy8gU3RvcmUgbG9va3VwIHRvIHBhcmVudHMgbm90IGxvYWRlZCAoeWV0KS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc291cmNlVGlsZUlELmNhbGN1bGF0ZVNjYWxlZEtleSh6KTtcbiAgICAgICAgICAgIHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlQnlJRChpZCk7XG4gICAgICAgICAgICBpZiAodGlsZSAmJiB0aWxlLmhhc0RhdGEoKSkgYnJlYWs7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBsb29rdXBbaWRdO1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBUaGVyZSdzIG5vIHRpbGUgbG9hZGVkIGFuZCBubyBwb2ludCBzZWFyY2hpbmcgZnVydGhlci5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZUJ5SUQoa2V5KTtcbiAgICAgICAgICAgICAgICBhc3NlcnQodGlsZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXRoLnB1c2goaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF0aFRvTG9va3VwKHRpbGUgPyB0aWxlLnRpbGVJRC5rZXkgOiBudWxsKTtcbiAgICAgICAgcmV0dXJuIHRpbGUgJiYgdGlsZS5oYXNEYXRhKCkgPyB0aWxlIDogbnVsbDtcbiAgICB9XG5cbiAgICBmaW5kREVNVGlsZUZvcih0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpOiA/VGlsZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuYWJsZWQgPyB0aGlzLl9maW5kVGlsZUNvdmVyaW5nVGlsZUlEKHRpbGVJRCwgdGhpcy5zb3VyY2VDYWNoZSkgOiBudWxsO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQm9va2tlZXBpbmcgaWYgc29tZXRoaW5nIGdldHMgcmVuZGVyZWQgdG8gdGhlIHRpbGUuXG4gICAgICovXG4gICAgcHJlcGFyZURyYXdUaWxlKGNvb3JkOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZWRUb1RpbGUgPSB0cnVlO1xuICAgIH1cblxuICAgIF9jbGVhclJlbmRlckNhY2hlRm9yVGlsZShzb3VyY2U6IHN0cmluZywgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICAgICAgbGV0IHNvdXJjZVRpbGVzID0gdGhpcy5fdGlsZXNEaXJ0eVtzb3VyY2VdO1xuICAgICAgICBpZiAoIXNvdXJjZVRpbGVzKSBzb3VyY2VUaWxlcyA9IHRoaXMuX3RpbGVzRGlydHlbc291cmNlXSA9IHt9O1xuICAgICAgICBzb3VyY2VUaWxlc1tjb29yZC5rZXldID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIExhemlseSBpbnN0YW50aWF0ZSB0aGUgd2lyZWZyYW1lIGluZGV4IGJ1ZmZlciBhbmQgc2VnbWVudCB2ZWN0b3Igc28gdGhhdCB3ZSBkb24ndFxuICAgICAqIGFsbG9jYXRlIHRoZSBnZW9tZXRyeSBmb3IgcmVuZGVyaW5nIGEgZGVidWcgd2lyZWZyYW1lIHVudGlsIGl0J3MgbmVlZGVkLlxuICAgICAqL1xuICAgIGdldFdpcmVmYW1lQnVmZmVyKCk6IFtJbmRleEJ1ZmZlciwgU2VnbWVudFZlY3Rvcl0ge1xuICAgICAgICBpZiAoIXRoaXMud2lyZWZyYW1lU2VnbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpcmVmcmFtZUdyaWRJbmRpY2VzID0gY3JlYXRlV2lyZWZyYW1lR3JpZChHUklEX0RJTSArIDEpO1xuICAgICAgICAgICAgdGhpcy53aXJlZnJhbWVJbmRleEJ1ZmZlciA9IHRoaXMucGFpbnRlci5jb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHdpcmVmcmFtZUdyaWRJbmRpY2VzKTtcbiAgICAgICAgICAgIHRoaXMud2lyZWZyYW1lU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgdGhpcy5ncmlkQnVmZmVyLmxlbmd0aCwgd2lyZWZyYW1lR3JpZEluZGljZXMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMud2lyZWZyYW1lSW5kZXhCdWZmZXIsIHRoaXMud2lyZWZyYW1lU2VnbWVudHNdO1xuICAgIH1cblxufVxuXG5mdW5jdGlvbiBzb3J0QnlEaXN0YW5jZVRvQ2FtZXJhKHRpbGVJRHMsIHBhaW50ZXIpIHtcbiAgICBjb25zdCBjYW1lcmFDb29yZGluYXRlID0gcGFpbnRlci50cmFuc2Zvcm0ucG9pbnRDb29yZGluYXRlKHBhaW50ZXIudHJhbnNmb3JtLmdldENhbWVyYVBvaW50KCkpO1xuICAgIGNvbnN0IGNhbWVyYVBvaW50ID0gbmV3IFBvaW50KGNhbWVyYUNvb3JkaW5hdGUueCwgY2FtZXJhQ29vcmRpbmF0ZS55KTtcbiAgICB0aWxlSURzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGIub3ZlcnNjYWxlZFogLSBhLm92ZXJzY2FsZWRaKSByZXR1cm4gYi5vdmVyc2NhbGVkWiAtIGEub3ZlcnNjYWxlZFo7XG4gICAgICAgIGNvbnN0IGFQb2ludCA9IG5ldyBQb2ludChhLmNhbm9uaWNhbC54ICsgKDEgPDwgYS5jYW5vbmljYWwueikgKiBhLndyYXAsIGEuY2Fub25pY2FsLnkpO1xuICAgICAgICBjb25zdCBiUG9pbnQgPSBuZXcgUG9pbnQoYi5jYW5vbmljYWwueCArICgxIDw8IGIuY2Fub25pY2FsLnopICogYi53cmFwLCBiLmNhbm9uaWNhbC55KTtcbiAgICAgICAgY29uc3QgY2FtZXJhU2NhbGVkID0gY2FtZXJhUG9pbnQubXVsdCgxIDw8IGEuY2Fub25pY2FsLnopO1xuICAgICAgICBjYW1lcmFTY2FsZWQueCAtPSAwLjU7XG4gICAgICAgIGNhbWVyYVNjYWxlZC55IC09IDAuNTtcbiAgICAgICAgcmV0dXJuIGNhbWVyYVNjYWxlZC5kaXN0U3FyKGFQb2ludCkgLSBjYW1lcmFTY2FsZWQuZGlzdFNxcihiUG9pbnQpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdW5pZm9ybSBncmlkIG9mIHRyaWFuZ2xlcywgY292ZXJpbmcgRVhURU5UIHggRVhURU5UIHNxdWFyZSwgd2l0aCB0d29cbiAqIGFkanVzdGVudCB0cmFpZ2xlcyBmb3JtaW5nIGEgcXVhZCwgc28gdGhhdCB0aGVyZSBhcmUgfGNvdW50fCBjb2x1bW5zIGFuZCByb3dzXG4gKiBvZiB0aGVzZSBxdWFkcyBpbiBFWFRFTlQgeCBFWFRFTlQgc3F1YXJlLlxuICogZS5nLiBmb3IgY291bnQgb2YgMjpcbiAqICAtLS0tLS0tLS0tLS0tXG4gKiAgfCAgICAvfCAgICAvfFxuICogIHwgIC8gIHwgIC8gIHxcbiAqICB8LyAgICB8LyAgICB8XG4gKiAgLS0tLS0tLS0tLS0tLVxuICogIHwgICAgL3wgICAgL3xcbiAqICB8ICAvICB8ICAvICB8XG4gKiAgfC8gICAgfC8gICAgfFxuICogIC0tLS0tLS0tLS0tLS1cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCBDb3VudCBvZiByb3dzIGFuZCBjb2x1bW5zXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVHcmlkKGNvdW50OiBudW1iZXIpOiBbUmFzdGVyQm91bmRzQXJyYXksIFRyaWFuZ2xlSW5kZXhBcnJheSwgbnVtYmVyXSB7XG4gICAgY29uc3QgYm91bmRzQXJyYXkgPSBuZXcgUmFzdGVyQm91bmRzQXJyYXkoKTtcbiAgICAvLyBBcm91bmQgdGhlIGdyaWQsIGFkZCBvbmUgbW9yZSByb3cvY29sdW1uIHBhZGRpbmcgZm9yIFwic2tpcnRcIi5cbiAgICBjb25zdCBpbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgIGNvbnN0IHNpemUgPSBjb3VudCArIDI7XG4gICAgYm91bmRzQXJyYXkucmVzZXJ2ZShzaXplICogc2l6ZSk7XG4gICAgaW5kZXhBcnJheS5yZXNlcnZlKChzaXplIC0gMSkgKiAoc2l6ZSAtIDEpICogMik7XG4gICAgY29uc3Qgc3RlcCA9IEVYVEVOVCAvIChjb3VudCAtIDEpO1xuICAgIGNvbnN0IGdyaWRCb3VuZCA9IEVYVEVOVCArIHN0ZXAgLyAyO1xuICAgIGNvbnN0IGJvdW5kID0gZ3JpZEJvdW5kICsgc3RlcDtcblxuICAgIC8vIFNraXJ0IG9mZnNldCBvZiAweDVGRkYgaXMgY2hvc2VuIHJhbmRvbWx5IHRvIGVuY29kZSBib29sZWFuIHZhbHVlIChza2lydFxuICAgIC8vIG9uL29mZikgd2l0aCB4IHBvc2l0aW9uIChtYXggdmFsdWUgRVhURU5UID0gNDA5NikgdG8gMTYtYml0IHNpZ25lZCBpbnRlZ2VyLlxuICAgIGNvbnN0IHNraXJ0T2Zmc2V0ID0gMjQ1NzU7IC8vIDB4NUZGRlxuICAgIGZvciAobGV0IHkgPSAtc3RlcDsgeSA8IGJvdW5kOyB5ICs9IHN0ZXApIHtcbiAgICAgICAgZm9yIChsZXQgeCA9IC1zdGVwOyB4IDwgYm91bmQ7IHggKz0gc3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHggPCAwIHx8IHggPiBncmlkQm91bmQgfHwgeSA8IDAgfHwgeSA+IGdyaWRCb3VuZCkgPyBza2lydE9mZnNldCA6IDA7XG4gICAgICAgICAgICBjb25zdCB4aSA9IGNsYW1wKE1hdGgucm91bmQoeCksIDAsIEVYVEVOVCk7XG4gICAgICAgICAgICBjb25zdCB5aSA9IGNsYW1wKE1hdGgucm91bmQoeSksIDAsIEVYVEVOVCk7XG4gICAgICAgICAgICBib3VuZHNBcnJheS5lbXBsYWNlQmFjayh4aSArIG9mZnNldCwgeWksIHhpLCB5aSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3IgY2FzZXMgd2hlbiB0aGVyZSdzIG5vIG5lZWQgdG8gcmVuZGVyIFwic2tpcnRcIiwgdGhlIFwiaW5uZXJcIiBncmlkIGluZGljZXNcbiAgICAvLyBhcmUgZm9sbG93ZWQgYnkgc2tpcnQgaW5kaWNlcy5cbiAgICBjb25zdCBza2lydEluZGljZXNPZmZzZXQgPSAoc2l6ZSAtIDMpICogKHNpemUgLSAzKSAqIDI7XG4gICAgY29uc3QgcXVhZCA9IChpLCBqKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaiAqIHNpemUgKyBpO1xuICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMSwgaW5kZXgsIGluZGV4ICsgc2l6ZSk7XG4gICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyBzaXplLCBpbmRleCArIHNpemUgKyAxLCBpbmRleCArIDEpO1xuICAgIH07XG4gICAgZm9yIChsZXQgaiA9IDE7IGogPCBzaXplIC0gMjsgaisrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2l6ZSAtIDI7IGkrKykge1xuICAgICAgICAgICAgcXVhZChpLCBqKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBQYWRkaW5nIChza2lydCkgaW5kaWNlczpcbiAgICBbMCwgc2l6ZSAtIDJdLmZvckVhY2goaiA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykge1xuICAgICAgICAgICAgcXVhZChpLCBqKTtcbiAgICAgICAgICAgIHF1YWQoaiwgaSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW2JvdW5kc0FycmF5LCBpbmRleEFycmF5LCBza2lydEluZGljZXNPZmZzZXRdO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBncmlkIG9mIGluZGljZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZ3JpZCBjb25zdHJ1Y3RlZCBieSBjcmVhdGVHcmlkXG4gKiBpbiBvcmRlciB0byByZW5kZXIgdGhhdCBncmlkIGFzIGEgd2lyZWZyYW1lIHJhdGhlciB0aGFuIGEgc29saWQgIG1lc2guIEl0IGRvZXNcbiAqIG5vdCBjcmVhdGUgYSBza2lydCBhbmQgc28gb25seSBnb2VzIGZyb20gMSB0byBjb3VudCArIDEsIGUuZy4gZm9yIGNvdW50IG9mIDI6XG4gKiAgLS0tLS0tLS0tLS0tLVxuICogIHwgICAgL3wgICAgL3xcbiAqICB8ICAvICB8ICAvICB8XG4gKiAgfC8gICAgfC8gICAgfFxuICogIC0tLS0tLS0tLS0tLS1cbiAqICB8ICAgIC98ICAgIC98XG4gKiAgfCAgLyAgfCAgLyAgfFxuICogIHwvICAgIHwvICAgIHxcbiAqICAtLS0tLS0tLS0tLS0tXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnQgQ291bnQgb2Ygcm93cyBhbmQgY29sdW1uc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlV2lyZWZyYW1lR3JpZChjb3VudDogbnVtYmVyKTogTGluZUluZGV4QXJyYXkge1xuICAgIGxldCBpLCBqLCBpbmRleDtcbiAgICBjb25zdCBpbmRleEFycmF5ID0gbmV3IExpbmVJbmRleEFycmF5KCk7XG4gICAgY29uc3Qgc2l6ZSA9IGNvdW50ICsgMjtcbiAgICAvLyBEcmF3IHR3byBlZGdlcyBvZiBhIHF1YWQgYW5kIGl0cyBkaWFnb25hbC4gVGhlIHZlcnkgbGFzdCByb3cgYW5kIGNvbHVtbiBoYXZlXG4gICAgLy8gYW4gYWRkaXRpb25hbCBsaW5lIHRvIGNsb3NlIG9mZiB0aGUgZ3JpZC5cbiAgICBmb3IgKGogPSAxOyBqIDwgY291bnQ7IGorKykge1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgaW5kZXggPSBqICogc2l6ZSArIGk7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIDEpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyBzaXplKTtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyAxLCBpbmRleCArIHNpemUpO1xuXG4gICAgICAgICAgICAvLyBQbGFjZSBhbiBleHRyYSBsaW5lIGF0IHRoZSBlbmQgb2YgZWFjaCByb3dcbiAgICAgICAgICAgIGlmIChqID09PSBjb3VudCAtIDEpIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyBzaXplLCBpbmRleCArIHNpemUgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQbGFjZSBhbiBleHRyYSBsaW5lIGF0IHRoZSBlbmQgb2YgZWFjaCBjb2xcbiAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDEsIGluZGV4ICsgMSArIHNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXhBcnJheTtcbn1cblxuZXhwb3J0IHR5cGUgVGVycmFpblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfZGVtJzogVW5pZm9ybTFpLFxuICAgICd1X2RlbV9wcmV2JzogVW5pZm9ybTFpLFxuICAgICd1X2RlbV91bnBhY2snOiBVbmlmb3JtNGYsXG4gICAgJ3VfZGVtX3RsJzogVW5pZm9ybTJmLFxuICAgICd1X2RlbV9zY2FsZSc6IFVuaWZvcm0xZixcbiAgICAndV9kZW1fdGxfcHJldic6IFVuaWZvcm0yZixcbiAgICAndV9kZW1fc2NhbGVfcHJldic6IFVuaWZvcm0xZixcbiAgICAndV9kZW1fc2l6ZSc6IFVuaWZvcm0xZixcbiAgICAndV9kZW1fbGVycCc6IFVuaWZvcm0xZixcbiAgICBcInVfZXhhZ2dlcmF0aW9uXCI6IFVuaWZvcm0xZixcbiAgICAndV9kZXB0aCc6IFVuaWZvcm0xaSxcbiAgICAndV9kZXB0aF9zaXplX2ludic6IFVuaWZvcm0yZixcbiAgICAndV9tZXRlcl90b19kZW0nPzogVW5pZm9ybTFmLFxuICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeF9pbnYnPzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3RpbGVfdGxfdXAnOiBVbmlmb3JtM2YsXG4gICAgJ3VfdGlsZV90cl91cCc6IFVuaWZvcm0zZixcbiAgICAndV90aWxlX2JyX3VwJzogVW5pZm9ybTNmLFxuICAgICd1X3RpbGVfYmxfdXAnOiBVbmlmb3JtM2YsXG4gICAgJ3VfdGlsZV91cF9zY2FsZSc6IFVuaWZvcm0xZlxufH07XG5cbmV4cG9ydCBjb25zdCB0ZXJyYWluVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogVGVycmFpblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2RlbSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfZGVtKSxcbiAgICAndV9kZW1fcHJldic6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfZGVtX3ByZXYpLFxuICAgICd1X2RlbV91bnBhY2snOiBuZXcgVW5pZm9ybTRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RlbV91bnBhY2spLFxuICAgICd1X2RlbV90bCc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfZGVtX3RsKSxcbiAgICAndV9kZW1fc2NhbGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RlbV9zY2FsZSksXG4gICAgJ3VfZGVtX3RsX3ByZXYnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RlbV90bF9wcmV2KSxcbiAgICAndV9kZW1fc2NhbGVfcHJldic6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZGVtX3NjYWxlX3ByZXYpLFxuICAgICd1X2RlbV9zaXplJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9kZW1fc2l6ZSksXG4gICAgJ3VfZGVtX2xlcnAnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RlbV9sZXJwKSxcbiAgICAndV9leGFnZ2VyYXRpb24nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2V4YWdnZXJhdGlvbiksXG4gICAgJ3VfZGVwdGgnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2RlcHRoKSxcbiAgICAndV9kZXB0aF9zaXplX2ludic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfZGVwdGhfc2l6ZV9pbnYpLFxuICAgICd1X21ldGVyX3RvX2RlbSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfbWV0ZXJfdG9fZGVtKSxcbiAgICAndV9sYWJlbF9wbGFuZV9tYXRyaXhfaW52JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9sYWJlbF9wbGFuZV9tYXRyaXhfaW52KSxcbiAgICAndV90aWxlX3RsX3VwJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX3RsX3VwKSxcbiAgICAndV90aWxlX3RyX3VwJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX3RyX3VwKSxcbiAgICAndV90aWxlX2JyX3VwJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX2JyX3VwKSxcbiAgICAndV90aWxlX2JsX3VwJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX2JsX3VwKSxcbiAgICAndV90aWxlX3VwX3NjYWxlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX3VwX3NjYWxlKVxufSk7XG5cbmZ1bmN0aW9uIGRlZmF1bHRUZXJyYWluVW5pZm9ybXMoZW5jb2Rpbmc6IERFTUVuY29kaW5nKTogVW5pZm9ybVZhbHVlczxUZXJyYWluVW5pZm9ybXNUeXBlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfZGVtJzogMixcbiAgICAgICAgJ3VfZGVtX3ByZXYnOiA0LFxuICAgICAgICAndV9kZW1fdW5wYWNrJzogREVNRGF0YS5nZXRVbnBhY2tWZWN0b3IoZW5jb2RpbmcpLFxuICAgICAgICAndV9kZW1fdGwnOiBbMCwgMF0sXG4gICAgICAgICd1X2RlbV90bF9wcmV2JzogWzAsIDBdLFxuICAgICAgICAndV9kZW1fc2NhbGUnOiAwLFxuICAgICAgICAndV9kZW1fc2NhbGVfcHJldic6IDAsXG4gICAgICAgICd1X2RlbV9zaXplJzogMCxcbiAgICAgICAgJ3VfZGVtX2xlcnAnOiAxLjAsXG4gICAgICAgICd1X2RlcHRoJzogMyxcbiAgICAgICAgJ3VfZGVwdGhfc2l6ZV9pbnYnOiBbMCwgMF0sXG4gICAgICAgICd1X2V4YWdnZXJhdGlvbic6IDAsXG4gICAgICAgICd1X3RpbGVfdGxfdXAnOiBbMCwgMCwgMV0sXG4gICAgICAgICd1X3RpbGVfdHJfdXAnOiBbMCwgMCwgMV0sXG4gICAgICAgICd1X3RpbGVfYnJfdXAnOiBbMCwgMCwgMV0sXG4gICAgICAgICd1X3RpbGVfYmxfdXAnOiBbMCwgMCwgMV0sXG4gICAgICAgICd1X3RpbGVfdXBfc2NhbGUnOiAxXG4gICAgfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1Mb2NhdGlvbnMsIFVuaWZvcm1WYWx1ZXN9IGZyb20gJy4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIHtVbndyYXBwZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCBQYWludGVyIGZyb20gJy4vcGFpbnRlci5qcyc7XG5pbXBvcnQgRm9nIGZyb20gJy4uL3N0eWxlL2ZvZy5qcyc7XG5pbXBvcnQge1VuaWZvcm0xZiwgVW5pZm9ybTJmLCBVbmlmb3JtNGYsIFVuaWZvcm1NYXRyaXg0Zn0gZnJvbSAnLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuXG5leHBvcnQgdHlwZSBGb2dVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X2ZvZ19tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfZm9nX3JhbmdlJzogVW5pZm9ybTJmLFxuICAgICd1X2ZvZ19jb2xvcic6IFVuaWZvcm00ZixcbiAgICAndV9mb2dfaG9yaXpvbl9ibGVuZCc6IFVuaWZvcm0xZixcbiAgICAndV9mb2dfdGVtcG9yYWxfb2Zmc2V0JzogVW5pZm9ybTFmLFxuXG58fTtcblxuZXhwb3J0IGNvbnN0IGZvZ1VuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEZvZ1VuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2ZvZ19tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZvZ19tYXRyaXgpLFxuICAgICd1X2ZvZ19yYW5nZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfZm9nX3JhbmdlKSxcbiAgICAndV9mb2dfY29sb3InOiBuZXcgVW5pZm9ybTRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZvZ19jb2xvciksXG4gICAgJ3VfZm9nX2hvcml6b25fYmxlbmQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZvZ19ob3Jpem9uX2JsZW5kKSxcbiAgICAndV9mb2dfdGVtcG9yYWxfb2Zmc2V0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mb2dfdGVtcG9yYWxfb2Zmc2V0KSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZm9nVW5pZm9ybVZhbHVlcyA9IChcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIGZvZzogRm9nLFxuICAgIHRpbGVJRDogP1Vud3JhcHBlZFRpbGVJRCxcbiAgICBmb2dPcGFjaXR5OiBudW1iZXJcbik6IFVuaWZvcm1WYWx1ZXM8Rm9nVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3QgZm9nQ29sb3IgPSBmb2cucHJvcGVydGllcy5nZXQoJ2NvbG9yJyk7XG4gICAgY29uc3QgdGVtcG9yYWxPZmZzZXQgPSAocGFpbnRlci5mcmFtZUNvdW50ZXIgLyAxMDAwLjApICUgMTtcbiAgICBjb25zdCBmb2dDb2xvclVucHJlbXVsdGlwbGllZCA9IFtcbiAgICAgICAgZm9nQ29sb3IuciAvIGZvZ0NvbG9yLmEsXG4gICAgICAgIGZvZ0NvbG9yLmcgLyBmb2dDb2xvci5hLFxuICAgICAgICBmb2dDb2xvci5iIC8gZm9nQ29sb3IuYSxcbiAgICAgICAgZm9nT3BhY2l0eVxuICAgIF07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfZm9nX21hdHJpeCc6IHRpbGVJRCA/IHBhaW50ZXIudHJhbnNmb3JtLmNhbGN1bGF0ZUZvZ1RpbGVNYXRyaXgodGlsZUlEKSA6IHBhaW50ZXIuaWRlbnRpdHlNYXQsXG4gICAgICAgICd1X2ZvZ19yYW5nZSc6IGZvZy5nZXRGb3ZBZGp1c3RlZFJhbmdlKHBhaW50ZXIudHJhbnNmb3JtLl9mb3YpLFxuICAgICAgICAndV9mb2dfY29sb3InOiBmb2dDb2xvclVucHJlbXVsdGlwbGllZCxcbiAgICAgICAgJ3VfZm9nX2hvcml6b25fYmxlbmQnOiBmb2cucHJvcGVydGllcy5nZXQoJ2hvcml6b24tYmxlbmQnKSxcbiAgICAgICAgJ3VfZm9nX3RlbXBvcmFsX29mZnNldCc6IHRlbXBvcmFsT2Zmc2V0XG4gICAgfTtcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIHByZWx1ZGUsXG4gICAgcHJlbHVkZUZyYWdQcmVjaXNpb25RdWFsaWZpZXJzLFxuICAgIHByZWx1ZGVWZXJ0UHJlY2lzaW9uUXVhbGlmaWVycyxcbiAgICBwcmVsdWRlVGVycmFpbixcbiAgICBwcmVsdWRlRm9nLFxuICAgIHByZWx1ZGVDb21tb25Tb3VyY2Vcbn0gZnJvbSAnLi4vc2hhZGVycy9zaGFkZXJzLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBQcm9ncmFtQ29uZmlndXJhdGlvbiBmcm9tICcuLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQgVmVydGV4QXJyYXlPYmplY3QgZnJvbSAnLi92ZXJ0ZXhfYXJyYXlfb2JqZWN0LmpzJztcbmltcG9ydCBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHt0ZXJyYWluVW5pZm9ybXN9IGZyb20gJy4uL3RlcnJhaW4vdGVycmFpbi5qcyc7XG5pbXBvcnQgdHlwZSB7VGVycmFpblVuaWZvcm1zVHlwZX0gZnJvbSAnLi4vdGVycmFpbi90ZXJyYWluLmpzJztcbmltcG9ydCB7Zm9nVW5pZm9ybXN9IGZyb20gJy4vZm9nLmpzJztcbmltcG9ydCB0eXBlIHtGb2dVbmlmb3Jtc1R5cGV9IGZyb20gJy4vZm9nLmpzJztcblxuaW1wb3J0IHR5cGUgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQuanMnO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uL2dsL3ZlcnRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vZ2wvaW5kZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCB0eXBlIFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZS5qcyc7XG5pbXBvcnQgdHlwZSBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZS5qcyc7XG5pbXBvcnQgdHlwZSBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1CaW5kaW5ncywgVW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUge0JpbmRlclVuaWZvcm19IGZyb20gJy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgRHJhd01vZGUgPVxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdMSU5FUyc+XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ1RSSUFOR0xFUyc+XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ0xJTkVfU1RSSVAnPjtcblxuZnVuY3Rpb24gZ2V0VG9rZW5pemVkQXR0cmlidXRlc0FuZFVuaWZvcm1zIChhcnJheTogQXJyYXk8c3RyaW5nPik6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoYXJyYXlbaV0gPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB0b2tlbiA9IGFycmF5W2ldLnNwbGl0KCcgJyk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRva2VuLnBvcCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNsYXNzIFByb2dyYW08VXM6IFVuaWZvcm1CaW5kaW5ncz4ge1xuICAgIHByb2dyYW06IFdlYkdMUHJvZ3JhbTtcbiAgICBhdHRyaWJ1dGVzOiB7W186IHN0cmluZ106IG51bWJlcn07XG4gICAgbnVtQXR0cmlidXRlczogbnVtYmVyO1xuICAgIGZpeGVkVW5pZm9ybXM6IFVzO1xuICAgIGJpbmRlclVuaWZvcm1zOiBBcnJheTxCaW5kZXJVbmlmb3JtPjtcbiAgICBmYWlsZWRUb0NyZWF0ZTogYm9vbGVhbjtcbiAgICB0ZXJyYWluVW5pZm9ybXM6ID9UZXJyYWluVW5pZm9ybXNUeXBlO1xuICAgIGZvZ1VuaWZvcm1zOiA/Rm9nVW5pZm9ybXNUeXBlO1xuXG4gICAgc3RhdGljIGNhY2hlS2V5KG5hbWU6IHN0cmluZywgZGVmaW5lczogc3RyaW5nW10sIHByb2dyYW1Db25maWd1cmF0aW9uOiA/UHJvZ3JhbUNvbmZpZ3VyYXRpb24pOiBzdHJpbmcge1xuICAgICAgICBsZXQga2V5ID0gYCR7bmFtZX0ke3Byb2dyYW1Db25maWd1cmF0aW9uID8gcHJvZ3JhbUNvbmZpZ3VyYXRpb24uY2FjaGVLZXkgOiAnJ31gO1xuICAgICAgICBmb3IgKGNvbnN0IGRlZmluZSBvZiBkZWZpbmVzKSB7XG4gICAgICAgICAgICBrZXkgKz0gYC8ke2RlZmluZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgc291cmNlOiB7ZnJhZ21lbnRTb3VyY2U6IHN0cmluZywgdmVydGV4U291cmNlOiBzdHJpbmcsIHN0YXRpY0F0dHJpYnV0ZXM6IEFycmF5PHN0cmluZz4sIHN0YXRpY1VuaWZvcm1zOiBBcnJheTxzdHJpbmc+fSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uOiA/UHJvZ3JhbUNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICAgICAgZml4ZWRVbmlmb3JtczogKENvbnRleHQsIFVuaWZvcm1Mb2NhdGlvbnMpID0+IFVzLFxuICAgICAgICAgICAgICAgIGZpeGVkRGVmaW5lczogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG5cbiAgICAgICAgY29uc3Qgc3RhdGljQXR0ckluZm8gPSBnZXRUb2tlbml6ZWRBdHRyaWJ1dGVzQW5kVW5pZm9ybXMoc291cmNlLnN0YXRpY0F0dHJpYnV0ZXMpO1xuICAgICAgICBjb25zdCBkeW5hbWljQXR0ckluZm8gPSBjb25maWd1cmF0aW9uID8gY29uZmlndXJhdGlvbi5nZXRCaW5kZXJBdHRyaWJ1dGVzKCkgOiBbXTtcbiAgICAgICAgY29uc3QgYWxsQXR0ckluZm8gPSBzdGF0aWNBdHRySW5mby5jb25jYXQoZHluYW1pY0F0dHJJbmZvKTtcblxuICAgICAgICBjb25zdCBzdGF0aWNVbmlmb3Jtc0luZm8gPSBzb3VyY2Uuc3RhdGljVW5pZm9ybXMgPyBnZXRUb2tlbml6ZWRBdHRyaWJ1dGVzQW5kVW5pZm9ybXMoc291cmNlLnN0YXRpY1VuaWZvcm1zKSA6IFtdO1xuICAgICAgICBjb25zdCBkeW5hbWljVW5pZm9ybXNJbmZvID0gY29uZmlndXJhdGlvbiA/IGNvbmZpZ3VyYXRpb24uZ2V0QmluZGVyVW5pZm9ybXMoKSA6IFtdO1xuICAgICAgICAvLyByZW1vdmUgZHVwbGljYXRlIHVuaWZvcm1zXG4gICAgICAgIGNvbnN0IHVuaWZvcm1MaXN0ID0gc3RhdGljVW5pZm9ybXNJbmZvLmNvbmNhdChkeW5hbWljVW5pZm9ybXNJbmZvKTtcbiAgICAgICAgY29uc3QgYWxsVW5pZm9ybXNJbmZvID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdW5pZm9ybSBvZiB1bmlmb3JtTGlzdCkge1xuICAgICAgICAgICAgaWYgKGFsbFVuaWZvcm1zSW5mby5pbmRleE9mKHVuaWZvcm0pIDwgMCkgYWxsVW5pZm9ybXNJbmZvLnB1c2godW5pZm9ybSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVmaW5lcyA9IGNvbmZpZ3VyYXRpb24gPyBjb25maWd1cmF0aW9uLmRlZmluZXMoKSA6IFtdO1xuICAgICAgICBkZWZpbmVzID0gZGVmaW5lcy5jb25jYXQoZml4ZWREZWZpbmVzLm1hcCgoZGVmaW5lKSA9PiBgI2RlZmluZSAke2RlZmluZX1gKSk7XG5cbiAgICAgICAgY29uc3QgZnJhZ21lbnRTb3VyY2UgPSBkZWZpbmVzLmNvbmNhdChcbiAgICAgICAgICAgIHByZWx1ZGVGcmFnUHJlY2lzaW9uUXVhbGlmaWVycyxcbiAgICAgICAgICAgIHByZWx1ZGVDb21tb25Tb3VyY2UsXG4gICAgICAgICAgICBwcmVsdWRlLmZyYWdtZW50U291cmNlLFxuICAgICAgICAgICAgcHJlbHVkZUZvZy5mcmFnbWVudFNvdXJjZSxcbiAgICAgICAgICAgIHNvdXJjZS5mcmFnbWVudFNvdXJjZSkuam9pbignXFxuJyk7XG4gICAgICAgIGNvbnN0IHZlcnRleFNvdXJjZSA9IGRlZmluZXMuY29uY2F0KFxuICAgICAgICAgICAgcHJlbHVkZVZlcnRQcmVjaXNpb25RdWFsaWZpZXJzLFxuICAgICAgICAgICAgcHJlbHVkZUNvbW1vblNvdXJjZSxcbiAgICAgICAgICAgIHByZWx1ZGUudmVydGV4U291cmNlLFxuICAgICAgICAgICAgcHJlbHVkZUZvZy52ZXJ0ZXhTb3VyY2UsXG4gICAgICAgICAgICBwcmVsdWRlVGVycmFpbi52ZXJ0ZXhTb3VyY2UsXG4gICAgICAgICAgICBzb3VyY2UudmVydGV4U291cmNlKS5qb2luKCdcXG4nKTtcbiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSKTtcbiAgICAgICAgaWYgKGdsLmlzQ29udGV4dExvc3QoKSkge1xuICAgICAgICAgICAgdGhpcy5mYWlsZWRUb0NyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNvdXJjZSk7XG4gICAgICAgIGdsLmNvbXBpbGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpO1xuICAgICAgICBhc3NlcnQoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKGZyYWdtZW50U2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyksIChnbC5nZXRTaGFkZXJJbmZvTG9nKGZyYWdtZW50U2hhZGVyKTogYW55KSk7XG4gICAgICAgIGdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIGZyYWdtZW50U2hhZGVyKTtcblxuICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG4gICAgICAgIGlmIChnbC5pc0NvbnRleHRMb3N0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmFpbGVkVG9DcmVhdGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGdsLnNoYWRlclNvdXJjZSh2ZXJ0ZXhTaGFkZXIsIHZlcnRleFNvdXJjZSk7XG4gICAgICAgIGdsLmNvbXBpbGVTaGFkZXIodmVydGV4U2hhZGVyKTtcbiAgICAgICAgYXNzZXJ0KGdsLmdldFNoYWRlclBhcmFtZXRlcih2ZXJ0ZXhTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSwgKGdsLmdldFNoYWRlckluZm9Mb2codmVydGV4U2hhZGVyKTogYW55KSk7XG4gICAgICAgIGdsLmF0dGFjaFNoYWRlcih0aGlzLnByb2dyYW0sIHZlcnRleFNoYWRlcik7XG5cbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gICAgICAgIGNvbnN0IHVuaWZvcm1Mb2NhdGlvbnMgPSB7fTtcblxuICAgICAgICB0aGlzLm51bUF0dHJpYnV0ZXMgPSBhbGxBdHRySW5mby5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bUF0dHJpYnV0ZXM7IGkrKykge1xuICAgICAgICAgICAgaWYgKGFsbEF0dHJJbmZvW2ldKSB7XG4gICAgICAgICAgICAgICAgZ2wuYmluZEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgaSwgYWxsQXR0ckluZm9baV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlc1thbGxBdHRySW5mb1tpXV0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZ2wubGlua1Byb2dyYW0odGhpcy5wcm9ncmFtKTtcbiAgICAgICAgYXNzZXJ0KGdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5wcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyksIChnbC5nZXRQcm9ncmFtSW5mb0xvZyh0aGlzLnByb2dyYW0pOiBhbnkpKTtcblxuICAgICAgICBnbC5kZWxldGVTaGFkZXIodmVydGV4U2hhZGVyKTtcbiAgICAgICAgZ2wuZGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTtcblxuICAgICAgICBmb3IgKGxldCBpdCA9IDA7IGl0IDwgYWxsVW5pZm9ybXNJbmZvLmxlbmd0aDsgaXQrKykge1xuICAgICAgICAgICAgY29uc3QgdW5pZm9ybSA9IGFsbFVuaWZvcm1zSW5mb1tpdF07XG4gICAgICAgICAgICBpZiAodW5pZm9ybSAmJiAhdW5pZm9ybUxvY2F0aW9uc1t1bmlmb3JtXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1Mb2NhdGlvbiA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbih0aGlzLnByb2dyYW0sIHVuaWZvcm0pO1xuICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pZm9ybUxvY2F0aW9uc1t1bmlmb3JtXSA9IHVuaWZvcm1Mb2NhdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpeGVkVW5pZm9ybXMgPSBmaXhlZFVuaWZvcm1zKGNvbnRleHQsIHVuaWZvcm1Mb2NhdGlvbnMpO1xuICAgICAgICB0aGlzLmJpbmRlclVuaWZvcm1zID0gY29uZmlndXJhdGlvbiA/IGNvbmZpZ3VyYXRpb24uZ2V0VW5pZm9ybXMoY29udGV4dCwgdW5pZm9ybUxvY2F0aW9ucykgOiBbXTtcbiAgICAgICAgaWYgKGZpeGVkRGVmaW5lcy5pbmRleE9mKCdURVJSQUlOJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnRlcnJhaW5Vbmlmb3JtcyA9IHRlcnJhaW5Vbmlmb3Jtcyhjb250ZXh0LCB1bmlmb3JtTG9jYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZml4ZWREZWZpbmVzLmluZGV4T2YoJ0ZPRycpICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5mb2dVbmlmb3JtcyA9IGZvZ1VuaWZvcm1zKGNvbnRleHQsIHVuaWZvcm1Mb2NhdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VGVycmFpblVuaWZvcm1WYWx1ZXMoY29udGV4dDogQ29udGV4dCwgdGVycmFpblVuaWZvcm1WYWx1ZXM6IFVuaWZvcm1WYWx1ZXM8VGVycmFpblVuaWZvcm1zVHlwZT4pIHtcbiAgICAgICAgaWYgKCF0aGlzLnRlcnJhaW5Vbmlmb3JtcykgcmV0dXJuO1xuICAgICAgICBjb25zdCB1bmlmb3JtczogVGVycmFpblVuaWZvcm1zVHlwZSA9IHRoaXMudGVycmFpblVuaWZvcm1zO1xuXG4gICAgICAgIGlmICh0aGlzLmZhaWxlZFRvQ3JlYXRlKSByZXR1cm47XG4gICAgICAgIGNvbnRleHQucHJvZ3JhbS5zZXQodGhpcy5wcm9ncmFtKTtcblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdGVycmFpblVuaWZvcm1WYWx1ZXMpIHtcbiAgICAgICAgICAgIHVuaWZvcm1zW25hbWVdLnNldCh0ZXJyYWluVW5pZm9ybVZhbHVlc1tuYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGb2dVbmlmb3JtVmFsdWVzKGNvbnRleHQ6IENvbnRleHQsIGZvZ1VuaWZvcm1zVmFsdWVzOiBVbmlmb3JtVmFsdWVzPEZvZ1VuaWZvcm1zVHlwZT4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvZ1VuaWZvcm1zKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHVuaWZvcm1zOiBGb2dVbmlmb3Jtc1R5cGUgPSB0aGlzLmZvZ1VuaWZvcm1zO1xuXG4gICAgICAgIGlmICh0aGlzLmZhaWxlZFRvQ3JlYXRlKSByZXR1cm47XG4gICAgICAgIGNvbnRleHQucHJvZ3JhbS5zZXQodGhpcy5wcm9ncmFtKTtcblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZm9nVW5pZm9ybXNWYWx1ZXMpIHtcbiAgICAgICAgICAgIGlmICh1bmlmb3Jtc1tuYW1lXS5sb2NhdGlvbikge1xuICAgICAgICAgICAgICAgIHVuaWZvcm1zW25hbWVdLnNldChmb2dVbmlmb3Jtc1ZhbHVlc1tuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkcmF3KFxuICAgICAgICAgY29udGV4dDogQ29udGV4dCxcbiAgICAgICAgIGRyYXdNb2RlOiBEcmF3TW9kZSxcbiAgICAgICAgIGRlcHRoTW9kZTogJFJlYWRPbmx5PERlcHRoTW9kZT4sXG4gICAgICAgICBzdGVuY2lsTW9kZTogJFJlYWRPbmx5PFN0ZW5jaWxNb2RlPixcbiAgICAgICAgIGNvbG9yTW9kZTogJFJlYWRPbmx5PENvbG9yTW9kZT4sXG4gICAgICAgICBjdWxsRmFjZU1vZGU6ICRSZWFkT25seTxDdWxsRmFjZU1vZGU+LFxuICAgICAgICAgdW5pZm9ybVZhbHVlczogVW5pZm9ybVZhbHVlczxVcz4sXG4gICAgICAgICBsYXllcklEOiBzdHJpbmcsXG4gICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcixcbiAgICAgICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcixcbiAgICAgICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yLFxuICAgICAgICAgY3VycmVudFByb3BlcnRpZXM6IGFueSxcbiAgICAgICAgIHpvb206ID9udW1iZXIsXG4gICAgICAgICBjb25maWd1cmF0aW9uOiA/UHJvZ3JhbUNvbmZpZ3VyYXRpb24sXG4gICAgICAgICBkeW5hbWljTGF5b3V0QnVmZmVyOiA/VmVydGV4QnVmZmVyLFxuICAgICAgICAgZHluYW1pY0xheW91dEJ1ZmZlcjI6ID9WZXJ0ZXhCdWZmZXIpIHtcblxuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKHRoaXMuZmFpbGVkVG9DcmVhdGUpIHJldHVybjtcblxuICAgICAgICBjb250ZXh0LnByb2dyYW0uc2V0KHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIGNvbnRleHQuc2V0RGVwdGhNb2RlKGRlcHRoTW9kZSk7XG4gICAgICAgIGNvbnRleHQuc2V0U3RlbmNpbE1vZGUoc3RlbmNpbE1vZGUpO1xuICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShjb2xvck1vZGUpO1xuICAgICAgICBjb250ZXh0LnNldEN1bGxGYWNlKGN1bGxGYWNlTW9kZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHRoaXMuZml4ZWRVbmlmb3JtcykpIHtcbiAgICAgICAgICAgIHRoaXMuZml4ZWRVbmlmb3Jtc1tuYW1lXS5zZXQodW5pZm9ybVZhbHVlc1tuYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRVbmlmb3Jtcyhjb250ZXh0LCB0aGlzLmJpbmRlclVuaWZvcm1zLCBjdXJyZW50UHJvcGVydGllcywge3pvb206ICh6b29tOiBhbnkpfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltaXRpdmVTaXplID0ge1xuICAgICAgICAgICAgW2dsLkxJTkVTXTogMixcbiAgICAgICAgICAgIFtnbC5UUklBTkdMRVNdOiAzLFxuICAgICAgICAgICAgW2dsLkxJTkVfU1RSSVBdOiAxXG4gICAgICAgIH1bZHJhd01vZGVdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cy5nZXQoKSkge1xuICAgICAgICAgICAgY29uc3QgdmFvcyA9IHNlZ21lbnQudmFvcyB8fCAoc2VnbWVudC52YW9zID0ge30pO1xuICAgICAgICAgICAgY29uc3QgdmFvOiBWZXJ0ZXhBcnJheU9iamVjdCA9IHZhb3NbbGF5ZXJJRF0gfHwgKHZhb3NbbGF5ZXJJRF0gPSBuZXcgVmVydGV4QXJyYXlPYmplY3QoKSk7XG5cbiAgICAgICAgICAgIHZhby5iaW5kKFxuICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA/IGNvbmZpZ3VyYXRpb24uZ2V0UGFpbnRWZXJ0ZXhCdWZmZXJzKCkgOiBbXSxcbiAgICAgICAgICAgICAgICBpbmRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgICBzZWdtZW50LnZlcnRleE9mZnNldCxcbiAgICAgICAgICAgICAgICBkeW5hbWljTGF5b3V0QnVmZmVyLFxuICAgICAgICAgICAgICAgIGR5bmFtaWNMYXlvdXRCdWZmZXIyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBnbC5kcmF3RWxlbWVudHMoXG4gICAgICAgICAgICAgICAgZHJhd01vZGUsXG4gICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKiBwcmltaXRpdmVTaXplLFxuICAgICAgICAgICAgICAgIGdsLlVOU0lHTkVEX1NIT1JULFxuICAgICAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlT2Zmc2V0ICogcHJpbWl0aXZlU2l6ZSAqIDIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQcm9ncmFtO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtM2Zcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCBwaXhlbHNUb1RpbGVVbml0cyBmcm9tICcuLi8uLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMuanMnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIHtDcm9zc0ZhZGVkfSBmcm9tICcuLi8uLi9zdHlsZS9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxudHlwZSBCYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGF0dGVybl90bF9hJzogVW5pZm9ybTJmLFxuICAgICd1X3BhdHRlcm5fYnJfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX3RsX2InOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybl9icl9iJzogVW5pZm9ybTJmLFxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3VfbWl4JzogVW5pZm9ybTFmLFxuICAgICd1X3BhdHRlcm5fc2l6ZV9hJzogVW5pZm9ybTJmLFxuICAgICd1X3BhdHRlcm5fc2l6ZV9iJzogVW5pZm9ybTJmLFxuICAgICd1X3NjYWxlX2EnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfc2NhbGVfYic6IFVuaWZvcm0xZixcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFVuaWZvcm0yZixcbiAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFVuaWZvcm0yZixcbiAgICAndV90aWxlX3VuaXRzX3RvX3BpeGVscyc6IFVuaWZvcm0xZlxufH07XG5cbmV4cG9ydCB0eXBlIFBhdHRlcm5Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgIC8vIHBhdHRlcm4gdW5pZm9ybXM6XG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZSc6IFVuaWZvcm0zZixcbiAgICAndV9mYWRlJzogVW5pZm9ybTFmLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogVW5pZm9ybTJmXG58fTtcblxuZnVuY3Rpb24gcGF0dGVyblVuaWZvcm1WYWx1ZXMoY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzLCBwYWludGVyOiBQYWludGVyLFxuICAgICAgICB0aWxlOiBUaWxlXG4pOiBVbmlmb3JtVmFsdWVzPFBhdHRlcm5Vbmlmb3Jtc1R5cGU+IHtcblxuICAgIGNvbnN0IHRpbGVSYXRpbyA9IDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSk7XG5cbiAgICBjb25zdCBudW1UaWxlcyA9IE1hdGgucG93KDIsIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKTtcbiAgICBjb25zdCB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gPSB0aWxlLnRpbGVTaXplICogTWF0aC5wb3coMiwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20pIC8gbnVtVGlsZXM7XG5cbiAgICBjb25zdCBwaXhlbFggPSB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gKiAodGlsZS50aWxlSUQuY2Fub25pY2FsLnggKyB0aWxlLnRpbGVJRC53cmFwICogbnVtVGlsZXMpO1xuICAgIGNvbnN0IHBpeGVsWSA9IHRpbGVTaXplQXROZWFyZXN0Wm9vbSAqIHRpbGUudGlsZUlELmNhbm9uaWNhbC55O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfaW1hZ2UnOiAwLFxuICAgICAgICAndV90ZXhzaXplJzogdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5zaXplLFxuICAgICAgICAndV9zY2FsZSc6IFt0aWxlUmF0aW8sIGNyb3NzZmFkZS5mcm9tU2NhbGUsIGNyb3NzZmFkZS50b1NjYWxlXSxcbiAgICAgICAgJ3VfZmFkZSc6IGNyb3NzZmFkZS50LFxuICAgICAgICAvLyBzcGxpdCB0aGUgcGl4ZWwgY29vcmQgaW50byB0d28gcGFpcnMgb2YgMTYgYml0IG51bWJlcnMuIFRoZSBnbHNsIHNwZWMgb25seSBndWFyYW50ZWVzIDE2IGJpdHMgb2YgcHJlY2lzaW9uLlxuICAgICAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFtwaXhlbFggPj4gMTYsIHBpeGVsWSA+PiAxNl0sXG4gICAgICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogW3BpeGVsWCAmIDB4RkZGRiwgcGl4ZWxZICYgMHhGRkZGXVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGJnUGF0dGVyblVuaWZvcm1WYWx1ZXMoaW1hZ2U6IENyb3NzRmFkZWQ8UmVzb2x2ZWRJbWFnZT4sIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycywgcGFpbnRlcjogUGFpbnRlcixcbiAgICAgICAgdGlsZToge3RpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgdGlsZVNpemU6IG51bWJlcn1cbik6IFVuaWZvcm1WYWx1ZXM8QmFja2dyb3VuZFBhdHRlcm5Vbmlmb3Jtc1R5cGU+IHtcbiAgICBjb25zdCBpbWFnZVBvc0EgPSBwYWludGVyLmltYWdlTWFuYWdlci5nZXRQYXR0ZXJuKGltYWdlLmZyb20udG9TdHJpbmcoKSk7XG4gICAgY29uc3QgaW1hZ2VQb3NCID0gcGFpbnRlci5pbWFnZU1hbmFnZXIuZ2V0UGF0dGVybihpbWFnZS50by50b1N0cmluZygpKTtcbiAgICBhc3NlcnQoaW1hZ2VQb3NBICYmIGltYWdlUG9zQik7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gcGFpbnRlci5pbWFnZU1hbmFnZXIuZ2V0UGl4ZWxTaXplKCk7XG5cbiAgICBjb25zdCBudW1UaWxlcyA9IE1hdGgucG93KDIsIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKTtcbiAgICBjb25zdCB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gPSB0aWxlLnRpbGVTaXplICogTWF0aC5wb3coMiwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20pIC8gbnVtVGlsZXM7XG5cbiAgICBjb25zdCBwaXhlbFggPSB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gKiAodGlsZS50aWxlSUQuY2Fub25pY2FsLnggKyB0aWxlLnRpbGVJRC53cmFwICogbnVtVGlsZXMpO1xuICAgIGNvbnN0IHBpeGVsWSA9IHRpbGVTaXplQXROZWFyZXN0Wm9vbSAqIHRpbGUudGlsZUlELmNhbm9uaWNhbC55O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfaW1hZ2UnOiAwLFxuICAgICAgICAndV9wYXR0ZXJuX3RsX2EnOiAoaW1hZ2VQb3NBOiBhbnkpLnRsLFxuICAgICAgICAndV9wYXR0ZXJuX2JyX2EnOiAoaW1hZ2VQb3NBOiBhbnkpLmJyLFxuICAgICAgICAndV9wYXR0ZXJuX3RsX2InOiAoaW1hZ2VQb3NCOiBhbnkpLnRsLFxuICAgICAgICAndV9wYXR0ZXJuX2JyX2InOiAoaW1hZ2VQb3NCOiBhbnkpLmJyLFxuICAgICAgICAndV90ZXhzaXplJzogW3dpZHRoLCBoZWlnaHRdLFxuICAgICAgICAndV9taXgnOiBjcm9zc2ZhZGUudCxcbiAgICAgICAgJ3VfcGF0dGVybl9zaXplX2EnOiAoaW1hZ2VQb3NBOiBhbnkpLmRpc3BsYXlTaXplLFxuICAgICAgICAndV9wYXR0ZXJuX3NpemVfYic6IChpbWFnZVBvc0I6IGFueSkuZGlzcGxheVNpemUsXG4gICAgICAgICd1X3NjYWxlX2EnOiBjcm9zc2ZhZGUuZnJvbVNjYWxlLFxuICAgICAgICAndV9zY2FsZV9iJzogY3Jvc3NmYWRlLnRvU2NhbGUsXG4gICAgICAgICd1X3RpbGVfdW5pdHNfdG9fcGl4ZWxzJzogMSAvIHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHBhaW50ZXIudHJhbnNmb3JtLnRpbGVab29tKSxcbiAgICAgICAgLy8gc3BsaXQgdGhlIHBpeGVsIGNvb3JkIGludG8gdHdvIHBhaXJzIG9mIDE2IGJpdCBudW1iZXJzLiBUaGUgZ2xzbCBzcGVjIG9ubHkgZ3VhcmFudGVlcyAxNiBiaXRzIG9mIHByZWNpc2lvbi5cbiAgICAgICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBbcGl4ZWxYID4+IDE2LCBwaXhlbFkgPj4gMTZdLFxuICAgICAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFtwaXhlbFggJiAweEZGRkYsIHBpeGVsWSAmIDB4RkZGRl1cbiAgICB9O1xufVxuZXhwb3J0IHtiZ1BhdHRlcm5Vbmlmb3JtVmFsdWVzLCBwYXR0ZXJuVW5pZm9ybVZhbHVlc307XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3BhdHRlcm5Vbmlmb3JtVmFsdWVzfSBmcm9tICcuL3BhdHRlcm4uanMnO1xuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtM2YsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5cbmltcG9ydCB7bWF0MywgdmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZS5qcyc7XG5cbmV4cG9ydCB0eXBlIEZpbGxFeHRydXNpb25Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9saWdodHBvcyc6IFVuaWZvcm0zZixcbiAgICAndV9saWdodGludGVuc2l0eSc6IFVuaWZvcm0xZixcbiAgICAndV9saWdodGNvbG9yJzogVW5pZm9ybTNmLFxuICAgICd1X3ZlcnRpY2FsX2dyYWRpZW50JzogVW5pZm9ybTFmLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2xpZ2h0cG9zJzogVW5pZm9ybTNmLFxuICAgICd1X2xpZ2h0aW50ZW5zaXR5JzogVW5pZm9ybTFmLFxuICAgICd1X2xpZ2h0Y29sb3InOiBVbmlmb3JtM2YsXG4gICAgJ3VfaGVpZ2h0X2ZhY3Rvcic6IFVuaWZvcm0xZixcbiAgICAndV92ZXJ0aWNhbF9ncmFkaWVudCc6IFVuaWZvcm0xZixcbiAgICAvLyBwYXR0ZXJuIHVuaWZvcm1zOlxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGUnOiBVbmlmb3JtM2YsXG4gICAgJ3VfZmFkZSc6IFVuaWZvcm0xZixcbiAgICAndV9vcGFjaXR5JzogVW5pZm9ybTFmXG58fTtcblxuY29uc3QgZmlsbEV4dHJ1c2lvblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEZpbGxFeHRydXNpb25Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfbGlnaHRwb3MnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0cG9zKSxcbiAgICAndV9saWdodGludGVuc2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfbGlnaHRpbnRlbnNpdHkpLFxuICAgICd1X2xpZ2h0Y29sb3InOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0Y29sb3IpLFxuICAgICd1X3ZlcnRpY2FsX2dyYWRpZW50JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV92ZXJ0aWNhbF9ncmFkaWVudCksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSlcbn0pO1xuXG5jb25zdCBmaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2xpZ2h0cG9zJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodHBvcyksXG4gICAgJ3VfbGlnaHRpbnRlbnNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0aW50ZW5zaXR5KSxcbiAgICAndV9saWdodGNvbG9yJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodGNvbG9yKSxcbiAgICAndV92ZXJ0aWNhbF9ncmFkaWVudCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdmVydGljYWxfZ3JhZGllbnQpLFxuICAgICd1X2hlaWdodF9mYWN0b3InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2hlaWdodF9mYWN0b3IpLFxuICAgIC8vIHBhdHRlcm4gdW5pZm9ybXNcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF91cHBlciksXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsX2Nvb3JkX2xvd2VyKSxcbiAgICAndV9zY2FsZSc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfc2NhbGUpLFxuICAgICd1X2ZhZGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZhZGUpLFxuICAgICd1X29wYWNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X29wYWNpdHkpXG59KTtcblxuY29uc3QgZmlsbEV4dHJ1c2lvblVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBzaG91bGRVc2VWZXJ0aWNhbEdyYWRpZW50OiBib29sZWFuLFxuICAgIG9wYWNpdHk6IG51bWJlclxuKTogVW5pZm9ybVZhbHVlczxGaWxsRXh0cnVzaW9uVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3QgbGlnaHQgPSBwYWludGVyLnN0eWxlLmxpZ2h0O1xuICAgIGNvbnN0IF9scCA9IGxpZ2h0LnByb3BlcnRpZXMuZ2V0KCdwb3NpdGlvbicpO1xuICAgIGNvbnN0IGxpZ2h0UG9zID0gW19scC54LCBfbHAueSwgX2xwLnpdO1xuICAgIGNvbnN0IGxpZ2h0TWF0ID0gbWF0My5jcmVhdGUoKTtcbiAgICBjb25zdCBhbmNob3IgPSBsaWdodC5wcm9wZXJ0aWVzLmdldCgnYW5jaG9yJyk7XG4gICAgaWYgKGFuY2hvciA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgICAgICBtYXQzLmZyb21Sb3RhdGlvbihsaWdodE1hdCwgLXBhaW50ZXIudHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgdmVjMy50cmFuc2Zvcm1NYXQzKGxpZ2h0UG9zLCBsaWdodFBvcywgbGlnaHRNYXQpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpZ2h0Q29sb3IgPSBsaWdodC5wcm9wZXJ0aWVzLmdldCgnY29sb3InKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3VfbGlnaHRwb3MnOiBsaWdodFBvcyxcbiAgICAgICAgJ3VfbGlnaHRpbnRlbnNpdHknOiBsaWdodC5wcm9wZXJ0aWVzLmdldCgnaW50ZW5zaXR5JyksXG4gICAgICAgICd1X2xpZ2h0Y29sb3InOiBbbGlnaHRDb2xvci5yLCBsaWdodENvbG9yLmcsIGxpZ2h0Q29sb3IuYl0sXG4gICAgICAgICd1X3ZlcnRpY2FsX2dyYWRpZW50JzogK3Nob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsXG4gICAgICAgICd1X29wYWNpdHknOiBvcGFjaXR5XG4gICAgfTtcbn07XG5cbmNvbnN0IGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQ6IGJvb2xlYW4sXG4gICAgb3BhY2l0eTogbnVtYmVyLFxuICAgIGNvb3JkOiBPdmVyc2NhbGVkVGlsZUlELFxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycyxcbiAgICB0aWxlOiBUaWxlXG4pOiBVbmlmb3JtVmFsdWVzPEZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgcmV0dXJuIGV4dGVuZChmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyhtYXRyaXgsIHBhaW50ZXIsIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsIG9wYWNpdHkpLFxuICAgICAgICBwYXR0ZXJuVW5pZm9ybVZhbHVlcyhjcm9zc2ZhZGUsIHBhaW50ZXIsIHRpbGUpLFxuICAgICAgICB7XG4gICAgICAgICAgICAndV9oZWlnaHRfZmFjdG9yJzogLU1hdGgucG93KDIsIGNvb3JkLm92ZXJzY2FsZWRaKSAvIHRpbGUudGlsZVNpemUgLyA4XG4gICAgICAgIH0pO1xufTtcblxuZXhwb3J0IHtcbiAgICBmaWxsRXh0cnVzaW9uVW5pZm9ybXMsXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtcyxcbiAgICBmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1WYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3BhdHRlcm5Vbmlmb3JtVmFsdWVzfSBmcm9tICcuL3BhdHRlcm4uanMnO1xuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtM2YsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZS5qcyc7XG5cbmV4cG9ydCB0eXBlIEZpbGxVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZlxufH07XG5cbmV4cG9ydCB0eXBlIEZpbGxPdXRsaW5lVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfd29ybGQnOiBVbmlmb3JtMmZcbnx9O1xuXG5leHBvcnQgdHlwZSBGaWxsUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgIC8vIHBhdHRlcm4gdW5pZm9ybXM6XG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFVuaWZvcm0yZixcbiAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZSc6IFVuaWZvcm0zZixcbiAgICAndV9mYWRlJzogVW5pZm9ybTFmXG58fTtcblxuZXhwb3J0IHR5cGUgRmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfd29ybGQnOiBVbmlmb3JtMmYsXG4gICAgLy8gcGF0dGVybiB1bmlmb3JtczpcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogVW5pZm9ybTJmLFxuICAgICd1X3NjYWxlJzogVW5pZm9ybTNmLFxuICAgICd1X2ZhZGUnOiBVbmlmb3JtMWZcbnx9O1xuXG5jb25zdCBmaWxsVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRmlsbFVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KVxufSk7XG5cbmNvbnN0IGZpbGxQYXR0ZXJuVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRmlsbFBhdHRlcm5Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF9sb3dlciksXG4gICAgJ3Vfc2NhbGUnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlKSxcbiAgICAndV9mYWRlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlKVxuXG59KTtcblxuY29uc3QgZmlsbE91dGxpbmVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsT3V0bGluZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV93b3JsZCc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfd29ybGQpXG59KTtcblxuY29uc3QgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3dvcmxkJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV93b3JsZCksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF9sb3dlciksXG4gICAgJ3Vfc2NhbGUnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlKSxcbiAgICAndV9mYWRlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlKVxufSk7XG5cbmNvbnN0IGZpbGxVbmlmb3JtVmFsdWVzID0gKG1hdHJpeDogRmxvYXQzMkFycmF5KTogVW5pZm9ybVZhbHVlczxGaWxsVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeFxufSk7XG5cbmNvbnN0IGZpbGxQYXR0ZXJuVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycyxcbiAgICB0aWxlOiBUaWxlXG4pOiBVbmlmb3JtVmFsdWVzPEZpbGxQYXR0ZXJuVW5pZm9ybXNUeXBlPiA9PiBleHRlbmQoXG4gICAgZmlsbFVuaWZvcm1WYWx1ZXMobWF0cml4KSxcbiAgICBwYXR0ZXJuVW5pZm9ybVZhbHVlcyhjcm9zc2ZhZGUsIHBhaW50ZXIsIHRpbGUpXG4pO1xuXG5jb25zdCBmaWxsT3V0bGluZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgZHJhd2luZ0J1ZmZlclNpemU6IFtudW1iZXIsIG51bWJlcl1cbik6IFVuaWZvcm1WYWx1ZXM8RmlsbE91dGxpbmVVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X3dvcmxkJzogZHJhd2luZ0J1ZmZlclNpemVcbn0pO1xuXG5jb25zdCBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgZHJhd2luZ0J1ZmZlclNpemU6IFtudW1iZXIsIG51bWJlcl1cbik6IFVuaWZvcm1WYWx1ZXM8RmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlPiA9PiBleHRlbmQoXG4gICAgZmlsbFBhdHRlcm5Vbmlmb3JtVmFsdWVzKG1hdHJpeCwgcGFpbnRlciwgY3Jvc3NmYWRlLCB0aWxlKSxcbiAgICB7XG4gICAgICAgICd1X3dvcmxkJzogZHJhd2luZ0J1ZmZlclNpemVcbiAgICB9XG4pO1xuXG5leHBvcnQge1xuICAgIGZpbGxVbmlmb3JtcyxcbiAgICBmaWxsUGF0dGVyblVuaWZvcm1zLFxuICAgIGZpbGxPdXRsaW5lVW5pZm9ybXMsXG4gICAgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXMsXG4gICAgZmlsbFVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbFBhdHRlcm5Vbmlmb3JtVmFsdWVzLFxuICAgIGZpbGxPdXRsaW5lVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybU1hdHJpeDJmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSBDaXJjbGVTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXIuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyLmpzJztcblxuZXhwb3J0IHR5cGUgQ2lyY2xlVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogVW5pZm9ybTFmLFxuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBVbmlmb3JtTWF0cml4MmYsXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZlxufH07XG5cbmV4cG9ydCB0eXBlIENpcmNsZURlZmluZXNUeXBlID0gJ1BJVENIX1dJVEhfTUFQJyB8ICdTQ0FMRV9XSVRIX01BUCc7XG5cbmNvbnN0IGNpcmNsZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IENpcmNsZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpLFxuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBuZXcgVW5pZm9ybU1hdHJpeDJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2V4dHJ1ZGVfc2NhbGUpLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeClcbn0pO1xuXG5jb25zdCBjaXJjbGVVbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQsXG4gICAgdGlsZTogVGlsZSxcbiAgICBsYXllcjogQ2lyY2xlU3R5bGVMYXllclxuKTogVW5pZm9ybVZhbHVlczxDaXJjbGVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGxldCBleHRydWRlU2NhbGU7XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXBpdGNoLWFsaWdubWVudCcpID09PSAnbWFwJykge1xuICAgICAgICBleHRydWRlU2NhbGUgPSB0cmFuc2Zvcm0uY2FsY3VsYXRlUGl4ZWxzVG9UaWxlVW5pdHNNYXRyaXgodGlsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXh0cnVkZVNjYWxlID0gbmV3IEZsb2F0MzJBcnJheShbXG4gICAgICAgICAgICB0cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzBdLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB0cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzFdXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLFxuICAgICAgICAndV9tYXRyaXgnOiBwYWludGVyLnRyYW5zbGF0ZVBvc01hdHJpeChcbiAgICAgICAgICAgIGNvb3JkLnByb2pNYXRyaXgsXG4gICAgICAgICAgICB0aWxlLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtdHJhbnNsYXRlJyksXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ2NpcmNsZS10cmFuc2xhdGUtYW5jaG9yJykpLFxuICAgICAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBleHRydWRlU2NhbGVcbiAgICB9O1xufTtcblxuY29uc3QgY2lyY2xlRGVmaW5lc1ZhbHVlcyA9IChsYXllcjogQ2lyY2xlU3R5bGVMYXllcik6IENpcmNsZURlZmluZXNUeXBlW10gPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgIGlmIChsYXllci5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCcpIHZhbHVlcy5wdXNoKCdQSVRDSF9XSVRIX01BUCcpO1xuICAgIGlmIChsYXllci5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1zY2FsZScpID09PSAnbWFwJykgdmFsdWVzLnB1c2goJ1NDQUxFX1dJVEhfTUFQJyk7XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxuZXhwb3J0IHtjaXJjbGVVbmlmb3JtcywgY2lyY2xlVW5pZm9ybVZhbHVlcywgY2lyY2xlRGVmaW5lc1ZhbHVlc307XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uLy4uL2RhdGEvZXh0ZW50LmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vLi4vc291cmNlL3RpbGUuanMnO1xuXG5leHBvcnQgdHlwZSBDb2xsaXNpb25Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogVW5pZm9ybTFmLFxuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBVbmlmb3JtMmZcbnx9O1xuXG5leHBvcnQgdHlwZSBDb2xsaXNpb25DaXJjbGVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9pbnZfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfdmlld3BvcnRfc2l6ZSc6IFVuaWZvcm0yZlxufH07XG5cbmNvbnN0IGNvbGxpc2lvblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IENvbGxpc2lvblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAndV9leHRydWRlX3NjYWxlJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9leHRydWRlX3NjYWxlKVxufSk7XG5cbmNvbnN0IGNvbGxpc2lvbkNpcmNsZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IENvbGxpc2lvbkNpcmNsZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9pbnZfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9pbnZfbWF0cml4KSxcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAndV92aWV3cG9ydF9zaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV92aWV3cG9ydF9zaXplKVxufSk7XG5cbmNvbnN0IGNvbGxpc2lvblVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgdGlsZTogVGlsZVxuKTogVW5pZm9ybVZhbHVlczxDb2xsaXNpb25Vbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCBwaXhlbFJhdGlvID0gRVhURU5UIC8gdGlsZS50aWxlU2l6ZTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLFxuICAgICAgICAndV9leHRydWRlX3NjYWxlJzogW3RyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0gLyBwaXhlbFJhdGlvLFxuICAgICAgICAgICAgdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1sxXSAvIHBpeGVsUmF0aW9dXG4gICAgfTtcbn07XG5cbmNvbnN0IGNvbGxpc2lvbkNpcmNsZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgaW52TWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm1cbik6IFVuaWZvcm1WYWx1ZXM8Q29sbGlzaW9uQ2lyY2xlVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICAgICAndV9pbnZfbWF0cml4JzogaW52TWF0cml4LFxuICAgICAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsXG4gICAgICAgICd1X3ZpZXdwb3J0X3NpemUnOiBbdHJhbnNmb3JtLndpZHRoLCB0cmFuc2Zvcm0uaGVpZ2h0XVxuICAgIH07XG59O1xuXG5leHBvcnQge2NvbGxpc2lvblVuaWZvcm1zLCBjb2xsaXNpb25Vbmlmb3JtVmFsdWVzLCBjb2xsaXNpb25DaXJjbGVVbmlmb3JtcywgY29sbGlzaW9uQ2lyY2xlVW5pZm9ybVZhbHVlc307XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm1Db2xvcixcbiAgICBVbmlmb3JtTWF0cml4NGYsXG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0xZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG5leHBvcnQgdHlwZSBEZWJ1Z1VuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfY29sb3InOiBVbmlmb3JtQ29sb3IsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X292ZXJsYXknOiBVbmlmb3JtMWksXG4gICAgJ3Vfb3ZlcmxheV9zY2FsZSc6IFVuaWZvcm0xZlxufH07XG5cbmNvbnN0IGRlYnVnVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRGVidWdVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9jb2xvcic6IG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb25zLnVfY29sb3IpLFxuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9vdmVybGF5JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9vdmVybGF5KSxcbiAgICAndV9vdmVybGF5X3NjYWxlJzogIG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3ZlcmxheV9zY2FsZSksXG59KTtcblxuY29uc3QgZGVidWdVbmlmb3JtVmFsdWVzID0gKG1hdHJpeDogRmxvYXQzMkFycmF5LCBjb2xvcjogQ29sb3IsIHNjYWxlUmF0aW86IG51bWJlciA9IDEpOiBVbmlmb3JtVmFsdWVzPERlYnVnVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAndV9jb2xvcic6IGNvbG9yLFxuICAgICd1X292ZXJsYXknOiAwLFxuICAgICd1X292ZXJsYXlfc2NhbGUnOiBzY2FsZVJhdGlvXG59KTtcblxuZXhwb3J0IHtkZWJ1Z1VuaWZvcm1zLCBkZWJ1Z1VuaWZvcm1WYWx1ZXN9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uLy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cy5qcyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIEhlYXRtYXBTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXIuanMnO1xuXG5leHBvcnQgdHlwZSBIZWF0bWFwVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9leHRydWRlX3NjYWxlJzogVW5pZm9ybTFmLFxuICAgICd1X2ludGVuc2l0eSc6IFVuaWZvcm0xZixcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGZcbnx9O1xuXG5leHBvcnQgdHlwZSBIZWF0bWFwVGV4dHVyZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfY29sb3JfcmFtcCc6IFVuaWZvcm0xaSxcbiAgICAndV9vcGFjaXR5JzogVW5pZm9ybTFmXG58fTtcblxuY29uc3QgaGVhdG1hcFVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEhlYXRtYXBVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9leHRydWRlX3NjYWxlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9leHRydWRlX3NjYWxlKSxcbiAgICAndV9pbnRlbnNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ludGVuc2l0eSksXG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpXG59KTtcblxuY29uc3QgaGVhdG1hcFRleHR1cmVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBIZWF0bWFwVGV4dHVyZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfY29sb3JfcmFtcCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfY29sb3JfcmFtcCksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSlcbn0pO1xuXG5jb25zdCBoZWF0bWFwVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICB0aWxlOiBUaWxlLFxuICAgIHpvb206IG51bWJlcixcbiAgICBpbnRlbnNpdHk6IG51bWJlclxuKTogVW5pZm9ybVZhbHVlczxIZWF0bWFwVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAndV9leHRydWRlX3NjYWxlJzogcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgem9vbSksXG4gICAgJ3VfaW50ZW5zaXR5JzogaW50ZW5zaXR5XG59KTtcblxuY29uc3QgaGVhdG1hcFRleHR1cmVVbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgbGF5ZXI6IEhlYXRtYXBTdHlsZUxheWVyLFxuICAgIHRleHR1cmVVbml0OiBudW1iZXIsXG4gICAgY29sb3JSYW1wVW5pdDogbnVtYmVyXG4pOiBVbmlmb3JtVmFsdWVzPEhlYXRtYXBUZXh0dXJlVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfaW1hZ2UnOiB0ZXh0dXJlVW5pdCxcbiAgICAgICAgJ3VfY29sb3JfcmFtcCc6IGNvbG9yUmFtcFVuaXQsXG4gICAgICAgICd1X29wYWNpdHknOiBsYXllci5wYWludC5nZXQoJ2hlYXRtYXAtb3BhY2l0eScpXG4gICAgfTtcbn07XG5cbmV4cG9ydCB7XG4gICAgaGVhdG1hcFVuaWZvcm1zLFxuICAgIGhlYXRtYXBUZXh0dXJlVW5pZm9ybXMsXG4gICAgaGVhdG1hcFVuaWZvcm1WYWx1ZXMsXG4gICAgaGVhdG1hcFRleHR1cmVVbmlmb3JtVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtM2YsXG4gICAgVW5pZm9ybU1hdHJpeDJmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uLy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cy5qcyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi8uLi91dGlsL2Jyb3dzZXIuanMnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB0eXBlIExpbmVTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuXG5leHBvcnQgdHlwZSBMaW5lVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfcGl4ZWxzX3RvX3RpbGVfdW5pdHMnOiBVbmlmb3JtTWF0cml4MmYsXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X3VuaXRzX3RvX3BpeGVscyc6IFVuaWZvcm0yZixcbiAgICAndV9kYXNoX2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X2dyYWRpZW50X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X2ltYWdlX2hlaWdodCc6IFVuaWZvcm0xZixcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X3NjYWxlJzogVW5pZm9ybTNmLFxuICAgICd1X21peCc6IFVuaWZvcm0xZixcbiAgICAndV9hbHBoYV9kaXNjYXJkX3RocmVzaG9sZCc6IFVuaWZvcm0xZlxufH07XG5cbmV4cG9ydCB0eXBlIExpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9waXhlbHNfdG9fdGlsZV91bml0cyc6IFVuaWZvcm1NYXRyaXgyZixcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogVW5pZm9ybTJmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3NjYWxlJzogVW5pZm9ybTNmLFxuICAgICd1X2ZhZGUnOiBVbmlmb3JtMWYsXG4gICAgJ3VfYWxwaGFfZGlzY2FyZF90aHJlc2hvbGQnOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBMaW5lRGVmaW5lc1R5cGUgPSAnUkVOREVSX0xJTkVfR1JBRElFTlQnIHwgJ1JFTkRFUl9MSU5FX0RBU0gnIHwgJ1JFTkRFUl9MSU5FX0FMUEhBX0RJU0NBUkQnO1xuXG5jb25zdCBsaW5lVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogTGluZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9waXhlbHNfdG9fdGlsZV91bml0cyc6IG5ldyBVbmlmb3JtTWF0cml4MmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxzX3RvX3RpbGVfdW5pdHMpLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAndV91bml0c190b19waXhlbHMnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3VuaXRzX3RvX3BpeGVscyksXG4gICAgJ3VfZGFzaF9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfZGFzaF9pbWFnZSksXG4gICAgJ3VfZ3JhZGllbnRfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2dyYWRpZW50X2ltYWdlKSxcbiAgICAndV9pbWFnZV9oZWlnaHQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlX2hlaWdodCksXG4gICAgJ3VfdGV4c2l6ZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4c2l6ZSksXG4gICAgJ3Vfc2NhbGUnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlKSxcbiAgICAndV9taXgnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X21peCksXG4gICAgJ3VfYWxwaGFfZGlzY2FyZF90aHJlc2hvbGQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2FscGhhX2Rpc2NhcmRfdGhyZXNob2xkKVxufSk7XG5cbmNvbnN0IGxpbmVQYXR0ZXJuVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogTGluZVBhdHRlcm5Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfdGV4c2l6ZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4c2l6ZSksXG4gICAgJ3VfcGl4ZWxzX3RvX3RpbGVfdW5pdHMnOiBuZXcgVW5pZm9ybU1hdHJpeDJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsc190b190aWxlX3VuaXRzKSxcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RldmljZV9waXhlbF9yYXRpbyksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV91bml0c190b19waXhlbHMnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3VuaXRzX3RvX3BpeGVscyksXG4gICAgJ3Vfc2NhbGUnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlKSxcbiAgICAndV9mYWRlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlKSxcbiAgICAndV9hbHBoYV9kaXNjYXJkX3RocmVzaG9sZCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfYWxwaGFfZGlzY2FyZF90aHJlc2hvbGQpXG59KTtcblxuY29uc3QgbGluZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICB0aWxlOiBUaWxlLFxuICAgIGxheWVyOiBMaW5lU3R5bGVMYXllcixcbiAgICBjcm9zc2ZhZGU6IENyb3NzZmFkZVBhcmFtZXRlcnMsXG4gICAgbWF0cml4OiA/RmxvYXQzMkFycmF5LFxuICAgIGltYWdlSGVpZ2h0OiBudW1iZXJcbik6IFVuaWZvcm1WYWx1ZXM8TGluZVVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IHBpeGVsc1RvVGlsZVVuaXRzID0gdHJhbnNmb3JtLmNhbGN1bGF0ZVBpeGVsc1RvVGlsZVVuaXRzTWF0cml4KHRpbGUpO1xuXG4gICAgY29uc3QgdmFsdWVzID0ge1xuICAgICAgICAndV9tYXRyaXgnOiBjYWxjdWxhdGVNYXRyaXgocGFpbnRlciwgdGlsZSwgbGF5ZXIsIG1hdHJpeCksXG4gICAgICAgICd1X3BpeGVsc190b190aWxlX3VuaXRzJzogcGl4ZWxzVG9UaWxlVW5pdHMsXG4gICAgICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogW1xuICAgICAgICAgICAgMSAvIHRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0sXG4gICAgICAgICAgICAxIC8gdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1sxXVxuICAgICAgICBdLFxuICAgICAgICAndV9kYXNoX2ltYWdlJzogMCxcbiAgICAgICAgJ3VfZ3JhZGllbnRfaW1hZ2UnOiAxLFxuICAgICAgICAndV9pbWFnZV9oZWlnaHQnOiBpbWFnZUhlaWdodCxcbiAgICAgICAgJ3VfdGV4c2l6ZSc6IFswLCAwXSxcbiAgICAgICAgJ3Vfc2NhbGUnOiBbMCwgMCwgMF0sXG4gICAgICAgICd1X21peCc6IDAsXG4gICAgICAgICd1X2FscGhhX2Rpc2NhcmRfdGhyZXNob2xkJzogMC4wXG4gICAgfTtcbiAgICBpZiAoaGFzRGFzaChsYXllcikpIHtcbiAgICAgICAgY29uc3QgdGlsZVpvb21SYXRpbyA9IGNhbGN1bGF0ZVRpbGVSYXRpbyh0aWxlLCBwYWludGVyLnRyYW5zZm9ybSk7XG4gICAgICAgIHZhbHVlc1sndV90ZXhzaXplJ10gPSB0aWxlLmxpbmVBdGxhc1RleHR1cmUuc2l6ZTtcbiAgICAgICAgdmFsdWVzWyd1X3NjYWxlJ10gPSBbdGlsZVpvb21SYXRpbywgY3Jvc3NmYWRlLmZyb21TY2FsZSwgY3Jvc3NmYWRlLnRvU2NhbGVdO1xuICAgICAgICB2YWx1ZXNbJ3VfbWl4J10gPSBjcm9zc2ZhZGUudDtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbn07XG5cbmNvbnN0IGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlcyA9IChcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgbGF5ZXI6IExpbmVTdHlsZUxheWVyLFxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycyxcbiAgICBtYXRyaXg6ID9GbG9hdDMyQXJyYXlcbik6IFVuaWZvcm1WYWx1ZXM8TGluZVBhdHRlcm5Vbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCB0aWxlWm9vbVJhdGlvID0gY2FsY3VsYXRlVGlsZVJhdGlvKHRpbGUsIHRyYW5zZm9ybSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfbWF0cml4JzogY2FsY3VsYXRlTWF0cml4KHBhaW50ZXIsIHRpbGUsIGxheWVyLCBtYXRyaXgpLFxuICAgICAgICAndV90ZXhzaXplJzogdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5zaXplLFxuICAgICAgICAvLyBjYW1lcmEgem9vbSByYXRpb1xuICAgICAgICAndV9waXhlbHNfdG9fdGlsZV91bml0cyc6IHRyYW5zZm9ybS5jYWxjdWxhdGVQaXhlbHNUb1RpbGVVbml0c01hdHJpeCh0aWxlKSxcbiAgICAgICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAndV9pbWFnZSc6IDAsXG4gICAgICAgICd1X3NjYWxlJzogW3RpbGVab29tUmF0aW8sIGNyb3NzZmFkZS5mcm9tU2NhbGUsIGNyb3NzZmFkZS50b1NjYWxlXSxcbiAgICAgICAgJ3VfZmFkZSc6IGNyb3NzZmFkZS50LFxuICAgICAgICAndV91bml0c190b19waXhlbHMnOiBbXG4gICAgICAgICAgICAxIC8gdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1swXSxcbiAgICAgICAgICAgIDEgLyB0cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzFdXG4gICAgICAgIF0sXG4gICAgICAgICd1X2FscGhhX2Rpc2NhcmRfdGhyZXNob2xkJzogMC4wXG4gICAgfTtcbn07XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVRpbGVSYXRpbyh0aWxlOiBUaWxlLCB0cmFuc2Zvcm06IFRyYW5zZm9ybSkge1xuICAgIHJldHVybiAxIC8gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgdHJhbnNmb3JtLnRpbGVab29tKTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlTWF0cml4KHBhaW50ZXIsIHRpbGUsIGxheWVyLCBtYXRyaXgpIHtcbiAgICByZXR1cm4gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoXG4gICAgICAgIG1hdHJpeCA/IG1hdHJpeCA6IHRpbGUudGlsZUlELnByb2pNYXRyaXgsXG4gICAgICAgIHRpbGUsXG4gICAgICAgIGxheWVyLnBhaW50LmdldCgnbGluZS10cmFuc2xhdGUnKSxcbiAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLXRyYW5zbGF0ZS1hbmNob3InKVxuICAgICk7XG59XG5cbmNvbnN0IGxpbmVEZWZpbmVzVmFsdWVzID0gKGxheWVyOiBMaW5lU3R5bGVMYXllcik6IExpbmVEZWZpbmVzVHlwZVtdID0+IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICBpZiAoaGFzRGFzaChsYXllcikpIHZhbHVlcy5wdXNoKCdSRU5ERVJfTElORV9EQVNIJyk7XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnbGluZS1ncmFkaWVudCcpKSB2YWx1ZXMucHVzaCgnUkVOREVSX0xJTkVfR1JBRElFTlQnKTtcblxuICAgIGNvbnN0IGhhc1BhdHRlcm4gPSBsYXllci5wYWludC5nZXQoJ2xpbmUtcGF0dGVybicpLmNvbnN0YW50T3IoKDE6IGFueSkpO1xuICAgIGNvbnN0IGhhc09wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtb3BhY2l0eScpLmNvbnN0YW50T3IoMS4wKSAhPT0gMS4wO1xuICAgIGlmICghaGFzUGF0dGVybiAmJiBoYXNPcGFjaXR5KSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKCdSRU5ERVJfTElORV9BTFBIQV9ESVNDQVJEJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG59O1xuXG5mdW5jdGlvbiBoYXNEYXNoKGxheWVyKSB7XG4gICAgY29uc3QgZGFzaFByb3BlcnR5VmFsdWUgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtZGFzaGFycmF5JykudmFsdWU7XG4gICAgcmV0dXJuIGRhc2hQcm9wZXJ0eVZhbHVlLnZhbHVlIHx8IGRhc2hQcm9wZXJ0eVZhbHVlLmtpbmQgIT09IFwiY29uc3RhbnRcIjtcbn1cblxuZXhwb3J0IHtcbiAgICBsaW5lVW5pZm9ybXMsXG4gICAgbGluZVBhdHRlcm5Vbmlmb3JtcyxcbiAgICBsaW5lVW5pZm9ybVZhbHVlcyxcbiAgICBsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMsXG4gICAgbGluZURlZmluZXNWYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgUmFzdGVyU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXIuanMnO1xuXG5leHBvcnQgdHlwZSBSYXN0ZXJVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV90bF9wYXJlbnQnOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGVfcGFyZW50JzogVW5pZm9ybTFmLFxuICAgICd1X2ZhZGVfdCc6IFVuaWZvcm0xZixcbiAgICAndV9vcGFjaXR5JzogVW5pZm9ybTFmLFxuICAgICd1X2ltYWdlMCc6IFVuaWZvcm0xaSxcbiAgICAndV9pbWFnZTEnOiBVbmlmb3JtMWksXG4gICAgJ3VfYnJpZ2h0bmVzc19sb3cnOiBVbmlmb3JtMWYsXG4gICAgJ3VfYnJpZ2h0bmVzc19oaWdoJzogVW5pZm9ybTFmLFxuICAgICd1X3NhdHVyYXRpb25fZmFjdG9yJzogVW5pZm9ybTFmLFxuICAgICd1X2NvbnRyYXN0X2ZhY3Rvcic6IFVuaWZvcm0xZixcbiAgICAndV9zcGluX3dlaWdodHMnOiBVbmlmb3JtM2YsXG4gICAgJ3VfcGVyc3BlY3RpdmVfdHJhbnNmb3JtJzogVW5pZm9ybTJmXG58fTtcblxuY29uc3QgcmFzdGVyVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogUmFzdGVyVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3RsX3BhcmVudCc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGxfcGFyZW50KSxcbiAgICAndV9zY2FsZV9wYXJlbnQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX3BhcmVudCksXG4gICAgJ3VfZmFkZV90JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlX3QpLFxuICAgICd1X29wYWNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X29wYWNpdHkpLFxuICAgICd1X2ltYWdlMCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UwKSxcbiAgICAndV9pbWFnZTEnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlMSksXG4gICAgJ3VfYnJpZ2h0bmVzc19sb3cnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2JyaWdodG5lc3NfbG93KSxcbiAgICAndV9icmlnaHRuZXNzX2hpZ2gnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2JyaWdodG5lc3NfaGlnaCksXG4gICAgJ3Vfc2F0dXJhdGlvbl9mYWN0b3InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NhdHVyYXRpb25fZmFjdG9yKSxcbiAgICAndV9jb250cmFzdF9mYWN0b3InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2NvbnRyYXN0X2ZhY3RvciksXG4gICAgJ3Vfc3Bpbl93ZWlnaHRzJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9zcGluX3dlaWdodHMpLFxuICAgICd1X3BlcnNwZWN0aXZlX3RyYW5zZm9ybSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGVyc3BlY3RpdmVfdHJhbnNmb3JtKVxufSk7XG5cbmNvbnN0IHJhc3RlclVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgcGFyZW50VEw6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcGFyZW50U2NhbGVCeTogbnVtYmVyLFxuICAgIGZhZGU6IHttaXg6IG51bWJlciwgb3BhY2l0eTogbnVtYmVyfSxcbiAgICBsYXllcjogUmFzdGVyU3R5bGVMYXllcixcbiAgICBwZXJzcGVjdGl2ZVRyYW5zZm9ybTogW251bWJlciwgbnVtYmVyXVxuKTogVW5pZm9ybVZhbHVlczxSYXN0ZXJVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X3RsX3BhcmVudCc6IHBhcmVudFRMLFxuICAgICd1X3NjYWxlX3BhcmVudCc6IHBhcmVudFNjYWxlQnksXG4gICAgJ3VfZmFkZV90JzogZmFkZS5taXgsXG4gICAgJ3Vfb3BhY2l0eSc6IGZhZGUub3BhY2l0eSAqIGxheWVyLnBhaW50LmdldCgncmFzdGVyLW9wYWNpdHknKSxcbiAgICAndV9pbWFnZTAnOiAwLFxuICAgICd1X2ltYWdlMSc6IDEsXG4gICAgJ3VfYnJpZ2h0bmVzc19sb3cnOiBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1icmlnaHRuZXNzLW1pbicpLFxuICAgICd1X2JyaWdodG5lc3NfaGlnaCc6IGxheWVyLnBhaW50LmdldCgncmFzdGVyLWJyaWdodG5lc3MtbWF4JyksXG4gICAgJ3Vfc2F0dXJhdGlvbl9mYWN0b3InOiBzYXR1cmF0aW9uRmFjdG9yKGxheWVyLnBhaW50LmdldCgncmFzdGVyLXNhdHVyYXRpb24nKSksXG4gICAgJ3VfY29udHJhc3RfZmFjdG9yJzogY29udHJhc3RGYWN0b3IobGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItY29udHJhc3QnKSksXG4gICAgJ3Vfc3Bpbl93ZWlnaHRzJzogc3BpbldlaWdodHMobGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItaHVlLXJvdGF0ZScpKSxcbiAgICAndV9wZXJzcGVjdGl2ZV90cmFuc2Zvcm0nOiBwZXJzcGVjdGl2ZVRyYW5zZm9ybVxufSk7XG5cbmZ1bmN0aW9uIHNwaW5XZWlnaHRzKGFuZ2xlKSB7XG4gICAgYW5nbGUgKj0gTWF0aC5QSSAvIDE4MDtcbiAgICBjb25zdCBzID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIGNvbnN0IGMgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgKDIgKiBjICsgMSkgLyAzLFxuICAgICAgICAoLU1hdGguc3FydCgzKSAqIHMgLSBjICsgMSkgLyAzLFxuICAgICAgICAoTWF0aC5zcXJ0KDMpICogcyAtIGMgKyAxKSAvIDNcbiAgICBdO1xufVxuXG5mdW5jdGlvbiBjb250cmFzdEZhY3Rvcihjb250cmFzdCkge1xuICAgIHJldHVybiBjb250cmFzdCA+IDAgP1xuICAgICAgICAxIC8gKDEgLSBjb250cmFzdCkgOlxuICAgICAgICAxICsgY29udHJhc3Q7XG59XG5cbmZ1bmN0aW9uIHNhdHVyYXRpb25GYWN0b3Ioc2F0dXJhdGlvbikge1xuICAgIHJldHVybiBzYXR1cmF0aW9uID4gMCA/XG4gICAgICAgIDEgLSAxIC8gKDEuMDAxIC0gc2F0dXJhdGlvbikgOlxuICAgICAgICAtc2F0dXJhdGlvbjtcbn1cblxuZXhwb3J0IHtyYXN0ZXJVbmlmb3JtcywgcmFzdGVyVW5pZm9ybVZhbHVlc307XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyLmpzJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcblxuZXhwb3J0IHR5cGUgU3ltYm9sSWNvblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogVW5pZm9ybTFpLFxuICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6IFVuaWZvcm0xaSxcbiAgICAndV9zaXplX3QnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfc2l6ZSc6IFVuaWZvcm0xZixcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogVW5pZm9ybTFmLFxuICAgICd1X3BpdGNoJzogVW5pZm9ybTFmLFxuICAgICd1X3JvdGF0ZV9zeW1ib2wnOiBVbmlmb3JtMWksXG4gICAgJ3VfYXNwZWN0X3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X2ZhZGVfY2hhbmdlJzogVW5pZm9ybTFmLFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9sYWJlbF9wbGFuZV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfY29vcmRfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2lzX3RleHQnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiBVbmlmb3JtMWksXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV90aWxlX2lkJzogVW5pZm9ybTNmLFxuICAgICd1X3pvb21fdHJhbnNpdGlvbic6IFVuaWZvcm0xZixcbiAgICAndV9pbnZfcm90X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9tZXJjX2NlbnRlcic6IFVuaWZvcm0yZixcbiAgICAndV90ZXh0dXJlJzogVW5pZm9ybTFpXG58fTtcblxuZXhwb3J0IHR5cGUgU3ltYm9sU0RGVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9pc19zaXplX3pvb21fY29uc3RhbnQnOiBVbmlmb3JtMWksXG4gICAgJ3VfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50JzogVW5pZm9ybTFpLFxuICAgICd1X3NpemVfdCc6IFVuaWZvcm0xZixcbiAgICAndV9zaXplJzogVW5pZm9ybTFmLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGl0Y2gnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfcm90YXRlX3N5bWJvbCc6IFVuaWZvcm0xaSxcbiAgICAndV9hc3BlY3RfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfZmFkZV9jaGFuZ2UnOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9jb29yZF9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfaXNfdGV4dCc6IFVuaWZvcm0xaSxcbiAgICAndV9waXRjaF93aXRoX21hcCc6IFVuaWZvcm0xaSxcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X3RleHR1cmUnOiBVbmlmb3JtMWksXG4gICAgJ3VfZ2FtbWFfc2NhbGUnOiBVbmlmb3JtMWYsXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X3RpbGVfaWQnOiBVbmlmb3JtM2YsXG4gICAgJ3Vfem9vbV90cmFuc2l0aW9uJzogVW5pZm9ybTFmLFxuICAgICd1X2ludl9yb3RfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X21lcmNfY2VudGVyJzogVW5pZm9ybTJmLFxuICAgICd1X2lzX2hhbG8nOiBVbmlmb3JtMWlcbnx9O1xuXG5leHBvcnQgdHlwZSBzeW1ib2xUZXh0QW5kSWNvblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogVW5pZm9ybTFpLFxuICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6IFVuaWZvcm0xaSxcbiAgICAndV9zaXplX3QnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfc2l6ZSc6IFVuaWZvcm0xZixcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogVW5pZm9ybTFmLFxuICAgICd1X3BpdGNoJzogVW5pZm9ybTFmLFxuICAgICd1X3JvdGF0ZV9zeW1ib2wnOiBVbmlmb3JtMWksXG4gICAgJ3VfYXNwZWN0X3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X2ZhZGVfY2hhbmdlJzogVW5pZm9ybTFmLFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9sYWJlbF9wbGFuZV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfY29vcmRfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2lzX3RleHQnOiBVbmlmb3JtMWksXG4gICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiBVbmlmb3JtMWksXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV90ZXhzaXplX2ljb24nOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGV4dHVyZSc6IFVuaWZvcm0xaSxcbiAgICAndV90ZXh0dXJlX2ljb24nOiBVbmlmb3JtMWksXG4gICAgJ3VfZ2FtbWFfc2NhbGUnOiBVbmlmb3JtMWYsXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X2lzX2hhbG8nOiBVbmlmb3JtMWlcbnx9O1xuXG5leHBvcnQgdHlwZSBTeW1ib2xEZWZpbmVzVHlwZSA9ICdQSVRDSF9XSVRIX01BUF9URVJSQUlOJztcblxuY29uc3Qgc3ltYm9sSWNvblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IFN5bWJvbEljb25Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9pc19zaXplX3pvb21fY29uc3RhbnQnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX3NpemVfem9vbV9jb25zdGFudCksXG4gICAgJ3VfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQpLFxuICAgICd1X3NpemVfdCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2l6ZV90KSxcbiAgICAndV9zaXplJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zaXplKSxcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlKSxcbiAgICAndV9waXRjaCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl0Y2gpLFxuICAgICd1X3JvdGF0ZV9zeW1ib2wnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3JvdGF0ZV9zeW1ib2wpLFxuICAgICd1X2FzcGVjdF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfYXNwZWN0X3JhdGlvKSxcbiAgICAndV9mYWRlX2NoYW5nZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZmFkZV9jaGFuZ2UpLFxuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9sYWJlbF9wbGFuZV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xhYmVsX3BsYW5lX21hdHJpeCksXG4gICAgJ3VfY29vcmRfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9jb29yZF9tYXRyaXgpLFxuICAgICd1X2lzX3RleHQnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX3RleHQpLFxuICAgICd1X3BpdGNoX3dpdGhfbWFwJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9waXRjaF93aXRoX21hcCksXG4gICAgJ3VfdGV4c2l6ZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4c2l6ZSksXG4gICAgJ3VfdGlsZV9pZCc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfdGlsZV9pZCksXG4gICAgJ3Vfem9vbV90cmFuc2l0aW9uJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV96b29tX3RyYW5zaXRpb24pLFxuICAgICd1X2ludl9yb3RfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9pbnZfcm90X21hdHJpeCksXG4gICAgJ3VfbWVyY19jZW50ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X21lcmNfY2VudGVyKSxcbiAgICAndV90ZXh0dXJlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV90ZXh0dXJlKVxufSk7XG5cbmNvbnN0IHN5bWJvbFNERlVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IFN5bWJvbFNERlVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2lzX3NpemVfem9vbV9jb25zdGFudCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfc2l6ZV96b29tX2NvbnN0YW50KSxcbiAgICAndV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCksXG4gICAgJ3Vfc2l6ZV90JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zaXplX3QpLFxuICAgICd1X3NpemUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NpemUpLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpLFxuICAgICd1X3BpdGNoJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXRjaCksXG4gICAgJ3Vfcm90YXRlX3N5bWJvbCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfcm90YXRlX3N5bWJvbCksXG4gICAgJ3VfYXNwZWN0X3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9hc3BlY3RfcmF0aW8pLFxuICAgICd1X2ZhZGVfY2hhbmdlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlX2NoYW5nZSksXG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbGFiZWxfcGxhbmVfbWF0cml4KSxcbiAgICAndV9jb29yZF9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2Nvb3JkX21hdHJpeCksXG4gICAgJ3VfaXNfdGV4dCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfdGV4dCksXG4gICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpdGNoX3dpdGhfbWFwKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV90ZXh0dXJlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV90ZXh0dXJlKSxcbiAgICAndV9nYW1tYV9zY2FsZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZ2FtbWFfc2NhbGUpLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAndV90aWxlX2lkJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX2lkKSxcbiAgICAndV96b29tX3RyYW5zaXRpb24nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3pvb21fdHJhbnNpdGlvbiksXG4gICAgJ3VfaW52X3JvdF9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ludl9yb3RfbWF0cml4KSxcbiAgICAndV9tZXJjX2NlbnRlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfbWVyY19jZW50ZXIpLFxuICAgICd1X2lzX2hhbG8nOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX2hhbG8pXG59KTtcblxuY29uc3Qgc3ltYm9sVGV4dEFuZEljb25Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBzeW1ib2xUZXh0QW5kSWNvblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2lzX3NpemVfem9vbV9jb25zdGFudCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfc2l6ZV96b29tX2NvbnN0YW50KSxcbiAgICAndV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCksXG4gICAgJ3Vfc2l6ZV90JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zaXplX3QpLFxuICAgICd1X3NpemUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NpemUpLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpLFxuICAgICd1X3BpdGNoJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXRjaCksXG4gICAgJ3Vfcm90YXRlX3N5bWJvbCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfcm90YXRlX3N5bWJvbCksXG4gICAgJ3VfYXNwZWN0X3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9hc3BlY3RfcmF0aW8pLFxuICAgICd1X2ZhZGVfY2hhbmdlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlX2NoYW5nZSksXG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbGFiZWxfcGxhbmVfbWF0cml4KSxcbiAgICAndV9jb29yZF9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2Nvb3JkX21hdHJpeCksXG4gICAgJ3VfaXNfdGV4dCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfdGV4dCksXG4gICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpdGNoX3dpdGhfbWFwKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV90ZXhzaXplX2ljb24nOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemVfaWNvbiksXG4gICAgJ3VfdGV4dHVyZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4dHVyZSksXG4gICAgJ3VfdGV4dHVyZV9pY29uJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV90ZXh0dXJlX2ljb24pLFxuICAgICd1X2dhbW1hX3NjYWxlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9nYW1tYV9zY2FsZSksXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICd1X2lzX2hhbG8nOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX2hhbG8pXG59KTtcblxuY29uc3Qgc3ltYm9sSWNvblVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgZnVuY3Rpb25UeXBlOiBzdHJpbmcsXG4gICAgc2l6ZTogP3t1U2l6ZVQ6IG51bWJlciwgdVNpemU6IG51bWJlcn0sXG4gICAgcm90YXRlSW5TaGFkZXI6IGJvb2xlYW4sXG4gICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgbGFiZWxQbGFuZU1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGdsQ29vcmRNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBpc1RleHQ6IGJvb2xlYW4sXG4gICAgdGV4U2l6ZTogW251bWJlciwgbnVtYmVyXSxcbiAgICB0aWxlSUQ6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICB6b29tVHJhbnNpdGlvbjogbnVtYmVyLFxuICAgIGludlJvdE1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIG1lcmNDZW50ZXI6IFtudW1iZXIsIG51bWJlcl1cbik6IFVuaWZvcm1WYWx1ZXM8U3ltYm9sSWNvblVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogKyhmdW5jdGlvblR5cGUgPT09ICdjb25zdGFudCcgfHwgZnVuY3Rpb25UeXBlID09PSAnc291cmNlJyksXG4gICAgICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6ICsoZnVuY3Rpb25UeXBlID09PSAnY29uc3RhbnQnIHx8IGZ1bmN0aW9uVHlwZSA9PT0gJ2NhbWVyYScpLFxuICAgICAgICAndV9zaXplX3QnOiBzaXplID8gc2l6ZS51U2l6ZVQgOiAwLFxuICAgICAgICAndV9zaXplJzogc2l6ZSA/IHNpemUudVNpemUgOiAwLFxuICAgICAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsXG4gICAgICAgICd1X3BpdGNoJzogdHJhbnNmb3JtLnBpdGNoIC8gMzYwICogMiAqIE1hdGguUEksXG4gICAgICAgICd1X3JvdGF0ZV9zeW1ib2wnOiArcm90YXRlSW5TaGFkZXIsXG4gICAgICAgICd1X2FzcGVjdF9yYXRpbyc6IHRyYW5zZm9ybS53aWR0aCAvIHRyYW5zZm9ybS5oZWlnaHQsXG4gICAgICAgICd1X2ZhZGVfY2hhbmdlJzogcGFpbnRlci5vcHRpb25zLmZhZGVEdXJhdGlvbiA/IHBhaW50ZXIuc3ltYm9sRmFkZUNoYW5nZSA6IDEsXG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3VfbGFiZWxfcGxhbmVfbWF0cml4JzogbGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgJ3VfY29vcmRfbWF0cml4JzogZ2xDb29yZE1hdHJpeCxcbiAgICAgICAgJ3VfaXNfdGV4dCc6ICtpc1RleHQsXG4gICAgICAgICd1X3BpdGNoX3dpdGhfbWFwJzogK3BpdGNoV2l0aE1hcCxcbiAgICAgICAgJ3VfdGV4c2l6ZSc6IHRleFNpemUsXG4gICAgICAgICd1X3RpbGVfaWQnOiB0aWxlSUQsXG4gICAgICAgICd1X3pvb21fdHJhbnNpdGlvbic6IHpvb21UcmFuc2l0aW9uLFxuICAgICAgICAndV9pbnZfcm90X21hdHJpeCc6IGludlJvdE1hdHJpeCxcbiAgICAgICAgJ3VfbWVyY19jZW50ZXInOiBtZXJjQ2VudGVyLFxuICAgICAgICAndV90ZXh0dXJlJzogMFxuICAgIH07XG59O1xuXG5jb25zdCBzeW1ib2xTREZVbmlmb3JtVmFsdWVzID0gKFxuICAgIGZ1bmN0aW9uVHlwZTogc3RyaW5nLFxuICAgIHNpemU6ID97dVNpemVUOiBudW1iZXIsIHVTaXplOiBudW1iZXJ9LFxuICAgIHJvdGF0ZUluU2hhZGVyOiBib29sZWFuLFxuICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGxhYmVsUGxhbmVNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBnbENvb3JkTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgaXNUZXh0OiBib29sZWFuLFxuICAgIHRleFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgaXNIYWxvOiBib29sZWFuLFxuICAgIHRpbGVJRDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIHpvb21UcmFuc2l0aW9uOiBudW1iZXIsXG4gICAgaW52Um90TWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgbWVyY0NlbnRlcjogW251bWJlciwgbnVtYmVyXVxuKTogVW5pZm9ybVZhbHVlczxTeW1ib2xTREZVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB7Y2FtZXJhVG9DZW50ZXJEaXN0YW5jZSwgX3BpdGNofSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuXG4gICAgcmV0dXJuIGV4dGVuZChzeW1ib2xJY29uVW5pZm9ybVZhbHVlcyhmdW5jdGlvblR5cGUsIHNpemUsXG4gICAgICAgIHJvdGF0ZUluU2hhZGVyLCBwaXRjaFdpdGhNYXAsIHBhaW50ZXIsIG1hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgZ2xDb29yZE1hdHJpeCwgaXNUZXh0LCB0ZXhTaXplLCB0aWxlSUQsIHpvb21UcmFuc2l0aW9uLFxuICAgICAgICBpbnZSb3RNYXRyaXgsIG1lcmNDZW50ZXIpLCB7XG4gICAgICAgICd1X2dhbW1hX3NjYWxlJzogcGl0Y2hXaXRoTWFwID8gY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAqIE1hdGguY29zKHBhaW50ZXIudGVycmFpbiA/IDAgOiBfcGl0Y2gpIDogMSxcbiAgICAgICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAndV9pc19oYWxvJzogK2lzSGFsb1xuICAgIH0pO1xufTtcblxuY29uc3Qgc3ltYm9sVGV4dEFuZEljb25Vbmlmb3JtVmFsdWVzID0gKFxuICAgIGZ1bmN0aW9uVHlwZTogc3RyaW5nLFxuICAgIHNpemU6ID97dVNpemVUOiBudW1iZXIsIHVTaXplOiBudW1iZXJ9LFxuICAgIHJvdGF0ZUluU2hhZGVyOiBib29sZWFuLFxuICAgIHBpdGNoV2l0aE1hcDogYm9vbGVhbixcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGxhYmVsUGxhbmVNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBnbENvb3JkTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgdGV4U2l6ZVNERjogW251bWJlciwgbnVtYmVyXSxcbiAgICB0ZXhTaXplSWNvbjogW251bWJlciwgbnVtYmVyXSxcbiAgICB0aWxlSUQ6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICB6b29tVHJhbnNpdGlvbjogbnVtYmVyLFxuICAgIGludlJvdE1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIG1lcmNDZW50ZXI6IFtudW1iZXIsIG51bWJlcl1cbik6IFVuaWZvcm1WYWx1ZXM8U3ltYm9sSWNvblVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIHJldHVybiBleHRlbmQoc3ltYm9sU0RGVW5pZm9ybVZhbHVlcyhmdW5jdGlvblR5cGUsIHNpemUsXG4gICAgICAgIHJvdGF0ZUluU2hhZGVyLCBwaXRjaFdpdGhNYXAsIHBhaW50ZXIsIG1hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgZ2xDb29yZE1hdHJpeCwgdHJ1ZSwgdGV4U2l6ZVNERiwgdHJ1ZSwgdGlsZUlELCB6b29tVHJhbnNpdGlvbixcbiAgICAgICAgaW52Um90TWF0cml4LCBtZXJjQ2VudGVyKSwge1xuICAgICAgICAndV90ZXhzaXplX2ljb24nOiB0ZXhTaXplSWNvbixcbiAgICAgICAgJ3VfdGV4dHVyZV9pY29uJzogMVxuICAgIH0pO1xufTtcblxuZXhwb3J0IHtzeW1ib2xJY29uVW5pZm9ybXMsIHN5bWJvbFNERlVuaWZvcm1zLCBzeW1ib2xJY29uVW5pZm9ybVZhbHVlcywgc3ltYm9sU0RGVW5pZm9ybVZhbHVlcywgc3ltYm9sVGV4dEFuZEljb25Vbmlmb3JtVmFsdWVzLCBzeW1ib2xUZXh0QW5kSWNvblVuaWZvcm1zfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7YmdQYXR0ZXJuVW5pZm9ybVZhbHVlc30gZnJvbSAnLi9wYXR0ZXJuLmpzJztcbmltcG9ydCB7XG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybUNvbG9yLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuaW1wb3J0IHR5cGUge0Nyb3NzRmFkZWR9IGZyb20gJy4uLy4uL3N0eWxlL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuXG5leHBvcnQgdHlwZSBCYWNrZ3JvdW5kVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZixcbiAgICAndV9jb2xvcic6IFVuaWZvcm1Db2xvclxufH07XG5cbmV4cG9ydCB0eXBlIEJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZixcbiAgICAvLyBwYXR0ZXJuIHVuaWZvcm1zOlxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3BhdHRlcm5fdGxfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX2JyX2EnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybl90bF9iJzogVW5pZm9ybTJmLFxuICAgICd1X3BhdHRlcm5fYnJfYic6IFVuaWZvcm0yZixcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X21peCc6IFVuaWZvcm0xZixcbiAgICAndV9wYXR0ZXJuX3NpemVfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX3NpemVfYic6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZV9hJzogVW5pZm9ybTFmLFxuICAgICd1X3NjYWxlX2InOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGlsZV91bml0c190b19waXhlbHMnOiBVbmlmb3JtMWZcbnx9O1xuXG5jb25zdCBiYWNrZ3JvdW5kVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQmFja2dyb3VuZFVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KSxcbiAgICAndV9jb2xvcic6IG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb25zLnVfY29sb3IpXG59KTtcblxuY29uc3QgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBCYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X3BhdHRlcm5fdGxfYSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybl90bF9hKSxcbiAgICAndV9wYXR0ZXJuX2JyX2EnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fYnJfYSksXG4gICAgJ3VfcGF0dGVybl90bF9iJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9wYXR0ZXJuX3RsX2IpLFxuICAgICd1X3BhdHRlcm5fYnJfYic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybl9icl9iKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV9taXgnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X21peCksXG4gICAgJ3VfcGF0dGVybl9zaXplX2EnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fc2l6ZV9hKSxcbiAgICAndV9wYXR0ZXJuX3NpemVfYic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybl9zaXplX2IpLFxuICAgICd1X3NjYWxlX2EnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX2EpLFxuICAgICd1X3NjYWxlX2InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX2IpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF91cHBlciksXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsX2Nvb3JkX2xvd2VyKSxcbiAgICAndV90aWxlX3VuaXRzX3RvX3BpeGVscyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdGlsZV91bml0c190b19waXhlbHMpXG59KTtcblxuY29uc3QgYmFja2dyb3VuZFVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgb3BhY2l0eTogbnVtYmVyLFxuICAgIGNvbG9yOiBDb2xvclxuKTogVW5pZm9ybVZhbHVlczxCYWNrZ3JvdW5kVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAndV9vcGFjaXR5Jzogb3BhY2l0eSxcbiAgICAndV9jb2xvcic6IGNvbG9yXG59KTtcblxuY29uc3QgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIG9wYWNpdHk6IG51bWJlcixcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIGltYWdlOiBDcm9zc0ZhZGVkPFJlc29sdmVkSW1hZ2U+LFxuICAgIHRpbGU6IHt0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHRpbGVTaXplOiBudW1iZXJ9LFxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVyc1xuKTogVW5pZm9ybVZhbHVlczxCYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zVHlwZT4gPT4gZXh0ZW5kKFxuICAgIGJnUGF0dGVyblVuaWZvcm1WYWx1ZXMoaW1hZ2UsIGNyb3NzZmFkZSwgcGFpbnRlciwgdGlsZSksXG4gICAge1xuICAgICAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgICAgICd1X29wYWNpdHknOiBvcGFjaXR5XG4gICAgfVxuKTtcblxuZXhwb3J0IHtcbiAgICBiYWNrZ3JvdW5kVW5pZm9ybXMsXG4gICAgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtcyxcbiAgICBiYWNrZ3JvdW5kVW5pZm9ybVZhbHVlcyxcbiAgICBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1WYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm1NYXRyaXg0ZixcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTNmLFxuICAgIFVuaWZvcm0xZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHt2ZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHtkZWdUb1JhZH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuXG5leHBvcnQgdHlwZSBTa3lib3hVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9zdW5fZGlyZWN0aW9uJzogVW5pZm9ybTNmLFxuICAgICd1X2N1YmVtYXAnOiBVbmlmb3JtMWksXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZixcbiAgICAndV90ZW1wb3JhbF9vZmZzZXQnOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBTa3lib3hHcmFkaWVudGxVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9jb2xvcl9yYW1wJzogVW5pZm9ybTFpLFxuICAgICd1X2NlbnRlcl9kaXJlY3Rpb24nOiBVbmlmb3JtM2YsXG4gICAgJ3VfcmFkaXVzJzogVW5pZm9ybTFmLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWYsXG4gICAgJ3VfdGVtcG9yYWxfb2Zmc2V0JzogVW5pZm9ybTFmLFxufH07XG5cbmNvbnN0IHNreWJveFVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IFNreWJveFVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9zdW5fZGlyZWN0aW9uJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9zdW5fZGlyZWN0aW9uKSxcbiAgICAndV9jdWJlbWFwJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9jdWJlbWFwKSxcbiAgICAndV9vcGFjaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vcGFjaXR5KSxcbiAgICAndV90ZW1wb3JhbF9vZmZzZXQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RlbXBvcmFsX29mZnNldClcblxufSk7XG5cbmNvbnN0IHNreWJveFVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgc3VuRGlyZWN0aW9uOiB2ZWMzLFxuICAgIGN1YmVtYXA6IG51bWJlcixcbiAgICBvcGFjaXR5OiBudW1iZXIsXG4gICAgdGVtcG9yYWxPZmZzZXQ6IG51bWJlclxuKTogVW5pZm9ybVZhbHVlczxTa3lib3hVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X3N1bl9kaXJlY3Rpb24nOiBzdW5EaXJlY3Rpb24sXG4gICAgJ3VfY3ViZW1hcCc6IGN1YmVtYXAsXG4gICAgJ3Vfb3BhY2l0eSc6IG9wYWNpdHksXG4gICAgJ3VfdGVtcG9yYWxfb2Zmc2V0JzogdGVtcG9yYWxPZmZzZXRcbn0pO1xuXG5jb25zdCBza3lib3hHcmFkaWVudFVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IFNreWJveEdyYWRpZW50bFVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9jb2xvcl9yYW1wJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9jb2xvcl9yYW1wKSxcbiAgICAvLyByYWRpYWwgZ3JhZGllbnQgdW5pZm9ybXNcbiAgICAndV9jZW50ZXJfZGlyZWN0aW9uJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9jZW50ZXJfZGlyZWN0aW9uKSxcbiAgICAndV9yYWRpdXMnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3JhZGl1cyksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSksXG4gICAgJ3VfdGVtcG9yYWxfb2Zmc2V0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZW1wb3JhbF9vZmZzZXQpXG59KTtcblxuY29uc3Qgc2t5Ym94R3JhZGllbnRVbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGNlbnRlckRpcmVjdGlvbjogdmVjMyxcbiAgICByYWRpdXM6IG51bWJlciwgLy9kZWdyZWVzXG4gICAgb3BhY2l0eTogbnVtYmVyLFxuICAgIHRlbXBvcmFsT2Zmc2V0OiBudW1iZXJcbik6IFVuaWZvcm1WYWx1ZXM8U2t5Ym94R3JhZGllbnRsVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICAgICAndV9jb2xvcl9yYW1wJzogMCxcbiAgICAgICAgJ3VfY2VudGVyX2RpcmVjdGlvbic6IGNlbnRlckRpcmVjdGlvbixcbiAgICAgICAgJ3VfcmFkaXVzJzogZGVnVG9SYWQocmFkaXVzKSxcbiAgICAgICAgJ3Vfb3BhY2l0eSc6IG9wYWNpdHksXG4gICAgICAgICd1X3RlbXBvcmFsX29mZnNldCc6IHRlbXBvcmFsT2Zmc2V0XG4gICAgfTtcbn07XG5cbmV4cG9ydCB7XG4gICAgc2t5Ym94VW5pZm9ybXMsXG4gICAgc2t5Ym94VW5pZm9ybVZhbHVlcyxcbiAgICBza3lib3hHcmFkaWVudFVuaWZvcm1zLFxuICAgIHNreWJveEdyYWRpZW50VW5pZm9ybVZhbHVlc1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7dmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5cbmltcG9ydCB7XG4gICAgVW5pZm9ybU1hdHJpeDNmLFxuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtM2YsXG4gICAgVW5pZm9ybTRmLFxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIFVuaWZvcm1WYWx1ZXMsXG4gICAgVW5pZm9ybUxvY2F0aW9ucyxcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5cbmV4cG9ydCB0eXBlIFNreWJveENhcHR1cmVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeF8zZic6IFVuaWZvcm1NYXRyaXgzZixcbiAgICAndV9zdW5fZGlyZWN0aW9uJzogVW5pZm9ybTNmLFxuICAgICd1X3N1bl9pbnRlbnNpdHknOiBVbmlmb3JtMWYsXG4gICAgJ3VfY29sb3JfdGludF9yJzogVW5pZm9ybTRmLFxuICAgICd1X2NvbG9yX3RpbnRfbSc6IFVuaWZvcm00ZixcbiAgICAndV9sdW1pbmFuY2UnOiBVbmlmb3JtMWYsXG58fTtcblxuY29uc3Qgc2t5Ym94Q2FwdHVyZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IFNreWJveENhcHR1cmVVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXhfM2YnOiBuZXcgVW5pZm9ybU1hdHJpeDNmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeF8zZiksXG4gICAgJ3Vfc3VuX2RpcmVjdGlvbic6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfc3VuX2RpcmVjdGlvbiksXG4gICAgJ3Vfc3VuX2ludGVuc2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc3VuX2ludGVuc2l0eSksXG4gICAgJ3VfY29sb3JfdGludF9yJzogbmV3IFVuaWZvcm00Zihjb250ZXh0LCBsb2NhdGlvbnMudV9jb2xvcl90aW50X3IpLFxuICAgICd1X2NvbG9yX3RpbnRfbSc6IG5ldyBVbmlmb3JtNGYoY29udGV4dCwgbG9jYXRpb25zLnVfY29sb3JfdGludF9tKSxcbiAgICAndV9sdW1pbmFuY2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2x1bWluYW5jZSksXG59KTtcblxuY29uc3Qgc2t5Ym94Q2FwdHVyZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgc3VuRGlyZWN0aW9uOiB2ZWMzLFxuICAgIHN1bkludGVuc2l0eTogbnVtYmVyLFxuICAgIGF0bW9zcGhlcmVDb2xvcjogQ29sb3IsXG4gICAgYXRtb3NwaGVyZUhhbG9Db2xvcjogQ29sb3Jcbik6IFVuaWZvcm1WYWx1ZXM8U2t5Ym94Q2FwdHVyZVVuaWZvcm1zVHlwZT4gPT4gKHtcbiAgICAndV9tYXRyaXhfM2YnOiBtYXRyaXgsXG4gICAgJ3Vfc3VuX2RpcmVjdGlvbic6IHN1bkRpcmVjdGlvbixcbiAgICAndV9zdW5faW50ZW5zaXR5Jzogc3VuSW50ZW5zaXR5LFxuICAgICd1X2NvbG9yX3RpbnRfcic6IFtcbiAgICAgICAgYXRtb3NwaGVyZUNvbG9yLnIsXG4gICAgICAgIGF0bW9zcGhlcmVDb2xvci5nLFxuICAgICAgICBhdG1vc3BoZXJlQ29sb3IuYixcbiAgICAgICAgYXRtb3NwaGVyZUNvbG9yLmFcbiAgICBdLFxuICAgICd1X2NvbG9yX3RpbnRfbSc6IFtcbiAgICAgICAgYXRtb3NwaGVyZUhhbG9Db2xvci5yLFxuICAgICAgICBhdG1vc3BoZXJlSGFsb0NvbG9yLmcsXG4gICAgICAgIGF0bW9zcGhlcmVIYWxvQ29sb3IuYixcbiAgICAgICAgYXRtb3NwaGVyZUhhbG9Db2xvci5hXG4gICAgXSxcbiAgICAndV9sdW1pbmFuY2UnOiA1ZS01LFxufSk7XG5cbmV4cG9ydCB7XG4gICAgc2t5Ym94Q2FwdHVyZVVuaWZvcm1zLFxuICAgIHNreWJveENhcHR1cmVVbmlmb3JtVmFsdWVzLFxufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtDaXJjbGVEZWZpbmVzVHlwZX0gZnJvbSAnLi9jaXJjbGVfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgdHlwZSB7U3ltYm9sRGVmaW5lc1R5cGV9IGZyb20gJy4vc3ltYm9sX3Byb2dyYW0uanMnO1xuaW1wb3J0IHR5cGUge0xpbmVEZWZpbmVzVHlwZX0gZnJvbSAnLi9saW5lX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtmaWxsRXh0cnVzaW9uVW5pZm9ybXMsIGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXN9IGZyb20gJy4vZmlsbF9leHRydXNpb25fcHJvZ3JhbS5qcyc7XG5pbXBvcnQge2ZpbGxVbmlmb3JtcywgZmlsbFBhdHRlcm5Vbmlmb3JtcywgZmlsbE91dGxpbmVVbmlmb3JtcywgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXN9IGZyb20gJy4vZmlsbF9wcm9ncmFtLmpzJztcbmltcG9ydCB7Y2lyY2xlVW5pZm9ybXN9IGZyb20gJy4vY2lyY2xlX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtjb2xsaXNpb25Vbmlmb3JtcywgY29sbGlzaW9uQ2lyY2xlVW5pZm9ybXN9IGZyb20gJy4vY29sbGlzaW9uX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtkZWJ1Z1VuaWZvcm1zfSBmcm9tICcuL2RlYnVnX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtjbGlwcGluZ01hc2tVbmlmb3Jtc30gZnJvbSAnLi9jbGlwcGluZ19tYXNrX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtoZWF0bWFwVW5pZm9ybXMsIGhlYXRtYXBUZXh0dXJlVW5pZm9ybXN9IGZyb20gJy4vaGVhdG1hcF9wcm9ncmFtLmpzJztcbmltcG9ydCB7aGlsbHNoYWRlVW5pZm9ybXMsIGhpbGxzaGFkZVByZXBhcmVVbmlmb3Jtc30gZnJvbSAnLi9oaWxsc2hhZGVfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge2xpbmVVbmlmb3JtcywgbGluZVBhdHRlcm5Vbmlmb3Jtc30gZnJvbSAnLi9saW5lX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtyYXN0ZXJVbmlmb3Jtc30gZnJvbSAnLi9yYXN0ZXJfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge3N5bWJvbEljb25Vbmlmb3Jtcywgc3ltYm9sU0RGVW5pZm9ybXMsIHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybXN9IGZyb20gJy4vc3ltYm9sX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtiYWNrZ3JvdW5kVW5pZm9ybXMsIGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXN9IGZyb20gJy4vYmFja2dyb3VuZF9wcm9ncmFtLmpzJztcbmltcG9ydCB7dGVycmFpblJhc3RlclVuaWZvcm1zfSBmcm9tICcuLi8uLi90ZXJyYWluL3RlcnJhaW5fcmFzdGVyX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtza3lib3hVbmlmb3Jtcywgc2t5Ym94R3JhZGllbnRVbmlmb3Jtc30gZnJvbSAnLi9za3lib3hfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge3NreWJveENhcHR1cmVVbmlmb3Jtc30gZnJvbSAnLi9za3lib3hfY2FwdHVyZV9wcm9ncmFtLmpzJztcbmltcG9ydCB7Z2xvYmVSYXN0ZXJVbmlmb3JtcywgYXRtb3NwaGVyZVVuaWZvcm1zfSBmcm9tICcuLi8uLi90ZXJyYWluL2dsb2JlX3Jhc3Rlcl9wcm9ncmFtLmpzJztcblxuZXhwb3J0IHR5cGUgRHluYW1pY0RlZmluZXNUeXBlID0gQ2lyY2xlRGVmaW5lc1R5cGUgfCBTeW1ib2xEZWZpbmVzVHlwZSB8IExpbmVEZWZpbmVzVHlwZTtcblxuZXhwb3J0IGNvbnN0IHByb2dyYW1Vbmlmb3JtcyA9IHtcbiAgICBmaWxsRXh0cnVzaW9uOiBmaWxsRXh0cnVzaW9uVW5pZm9ybXMsXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm46IGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXMsXG4gICAgZmlsbDogZmlsbFVuaWZvcm1zLFxuICAgIGZpbGxQYXR0ZXJuOiBmaWxsUGF0dGVyblVuaWZvcm1zLFxuICAgIGZpbGxPdXRsaW5lOiBmaWxsT3V0bGluZVVuaWZvcm1zLFxuICAgIGZpbGxPdXRsaW5lUGF0dGVybjogZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXMsXG4gICAgY2lyY2xlOiBjaXJjbGVVbmlmb3JtcyxcbiAgICBjb2xsaXNpb25Cb3g6IGNvbGxpc2lvblVuaWZvcm1zLFxuICAgIGNvbGxpc2lvbkNpcmNsZTogY29sbGlzaW9uQ2lyY2xlVW5pZm9ybXMsXG4gICAgZGVidWc6IGRlYnVnVW5pZm9ybXMsXG4gICAgY2xpcHBpbmdNYXNrOiBjbGlwcGluZ01hc2tVbmlmb3JtcyxcbiAgICBoZWF0bWFwOiBoZWF0bWFwVW5pZm9ybXMsXG4gICAgaGVhdG1hcFRleHR1cmU6IGhlYXRtYXBUZXh0dXJlVW5pZm9ybXMsXG4gICAgaGlsbHNoYWRlOiBoaWxsc2hhZGVVbmlmb3JtcyxcbiAgICBoaWxsc2hhZGVQcmVwYXJlOiBoaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXMsXG4gICAgbGluZTogbGluZVVuaWZvcm1zLFxuICAgIGxpbmVQYXR0ZXJuOiBsaW5lUGF0dGVyblVuaWZvcm1zLFxuICAgIHJhc3RlcjogcmFzdGVyVW5pZm9ybXMsXG4gICAgc3ltYm9sSWNvbjogc3ltYm9sSWNvblVuaWZvcm1zLFxuICAgIHN5bWJvbFNERjogc3ltYm9sU0RGVW5pZm9ybXMsXG4gICAgc3ltYm9sVGV4dEFuZEljb246IHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybXMsXG4gICAgYmFja2dyb3VuZDogYmFja2dyb3VuZFVuaWZvcm1zLFxuICAgIGJhY2tncm91bmRQYXR0ZXJuOiBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zLFxuICAgIHRlcnJhaW5SYXN0ZXI6IHRlcnJhaW5SYXN0ZXJVbmlmb3JtcyxcbiAgICB0ZXJyYWluRGVwdGg6IHRlcnJhaW5SYXN0ZXJVbmlmb3JtcyxcbiAgICBza3lib3g6IHNreWJveFVuaWZvcm1zLFxuICAgIHNreWJveEdyYWRpZW50OiBza3lib3hHcmFkaWVudFVuaWZvcm1zLFxuICAgIHNreWJveENhcHR1cmU6IHNreWJveENhcHR1cmVVbmlmb3JtcyxcbiAgICBnbG9iZVJhc3RlcjogZ2xvYmVSYXN0ZXJVbmlmb3JtcyxcbiAgICBnbG9iZUF0bW9zcGhlcmU6IGF0bW9zcGhlcmVVbmlmb3Jtcyxcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZS5qcyc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IHtjb2xsaXNpb25Vbmlmb3JtVmFsdWVzLCBjb2xsaXNpb25DaXJjbGVVbmlmb3JtVmFsdWVzfSBmcm9tICcuL3Byb2dyYW0vY29sbGlzaW9uX3Byb2dyYW0uanMnO1xuXG5pbXBvcnQge1F1YWRUcmlhbmdsZUFycmF5LCBDb2xsaXNpb25DaXJjbGVMYXlvdXRBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQge2NvbGxpc2lvbkNpcmNsZUxheW91dH0gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50LmpzJztcbmltcG9ydCB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgSW5kZXhCdWZmZXIgZnJvbSAnLi4vZ2wvaW5kZXhfYnVmZmVyLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0NvbGxpc2lvbkRlYnVnO1xuXG50eXBlIFRpbGVCYXRjaCA9IHtcbiAgICBjaXJjbGVBcnJheTogQXJyYXk8bnVtYmVyPixcbiAgICBjaXJjbGVPZmZzZXQ6IG51bWJlcixcbiAgICB0cmFuc2Zvcm06IG1hdDQsXG4gICAgaW52VHJhbnNmb3JtOiBtYXQ0XG59O1xuXG5sZXQgcXVhZFRyaWFuZ2xlczogP1F1YWRUcmlhbmdsZUFycmF5O1xuXG5mdW5jdGlvbiBkcmF3Q29sbGlzaW9uRGVidWcocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogU3R5bGVMYXllciwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPiwgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdLCB0cmFuc2xhdGVBbmNob3I6ICdtYXAnIHwgJ3ZpZXdwb3J0JywgaXNUZXh0OiBib29sZWFuKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnY29sbGlzaW9uQm94Jyk7XG4gICAgY29uc3QgdGlsZUJhdGNoZXM6IEFycmF5PFRpbGVCYXRjaD4gPSBbXTtcbiAgICBsZXQgY2lyY2xlQ291bnQgPSAwO1xuICAgIGxldCBjaXJjbGVPZmZzZXQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29vcmQgPSBjb29yZHNbaV07XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0OiA/U3ltYm9sQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgcG9zTWF0cml4ID0gY29vcmQucHJvak1hdHJpeDtcbiAgICAgICAgaWYgKHRyYW5zbGF0ZVswXSAhPT0gMCB8fCB0cmFuc2xhdGVbMV0gIT09IDApIHtcbiAgICAgICAgICAgIHBvc01hdHJpeCA9IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KGNvb3JkLnByb2pNYXRyaXgsIHRpbGUsIHRyYW5zbGF0ZSwgdHJhbnNsYXRlQW5jaG9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWZmZXJzID0gaXNUZXh0ID8gYnVja2V0LnRleHRDb2xsaXNpb25Cb3ggOiBidWNrZXQuaWNvbkNvbGxpc2lvbkJveDtcbiAgICAgICAgLy8gR2V0IGNvbGxpc2lvbiBjaXJjbGUgZGF0YSBvZiB0aGlzIGJ1Y2tldFxuICAgICAgICBjb25zdCBjaXJjbGVBcnJheTogQXJyYXk8bnVtYmVyPiA9IGJ1Y2tldC5jb2xsaXNpb25DaXJjbGVBcnJheTtcbiAgICAgICAgaWYgKGNpcmNsZUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8ga25vdyB0aGUgcHJvamVjdGlvbiBtYXRyaXggdGhhdCB3YXMgdXNlZCBmb3IgcHJvamVjdGluZyBjb2xsaXNpb24gY2lyY2xlcyB0byB0aGUgc2NyZWVuLlxuICAgICAgICAgICAgLy8gVGhpcyBtaWdodCB2YXJ5IGJldHdlZW4gYnVja2V0cyBhcyB0aGUgc3ltYm9sIHBsYWNlbWVudCBpcyBhIGNvbnRpbm91cyBwcm9jZXNzLiBUaGlzIG1hdHJpeCBpc1xuICAgICAgICAgICAgLy8gcmVxdWlyZWQgZm9yIHRyYW5zZm9ybWluZyBwb2ludHMgZnJvbSBwcmV2aW91cyBzY3JlZW4gc3BhY2UgdG8gdGhlIGN1cnJlbnQgb25lXG4gICAgICAgICAgICBjb25zdCBpbnZUcmFuc2Zvcm0gPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gcG9zTWF0cml4O1xuXG4gICAgICAgICAgICBtYXQ0Lm11bChpbnZUcmFuc2Zvcm0sIGJ1Y2tldC5wbGFjZW1lbnRJbnZQcm9qTWF0cml4LCBwYWludGVyLnRyYW5zZm9ybS5nbENvb3JkTWF0cml4KTtcbiAgICAgICAgICAgIG1hdDQubXVsKGludlRyYW5zZm9ybSwgaW52VHJhbnNmb3JtLCBidWNrZXQucGxhY2VtZW50Vmlld3BvcnRNYXRyaXgpO1xuXG4gICAgICAgICAgICB0aWxlQmF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjaXJjbGVBcnJheSxcbiAgICAgICAgICAgICAgICBjaXJjbGVPZmZzZXQsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgIGludlRyYW5zZm9ybVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNpcmNsZUNvdW50ICs9IGNpcmNsZUFycmF5Lmxlbmd0aCAvIDQ7ICAvLyA0IHZhbHVlcyBwZXIgY2lyY2xlXG4gICAgICAgICAgICBjaXJjbGVPZmZzZXQgPSBjaXJjbGVDb3VudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWJ1ZmZlcnMpIGNvbnRpbnVlO1xuICAgICAgICBpZiAocGFpbnRlci50ZXJyYWluKSBwYWludGVyLnRlcnJhaW4uc2V0dXBFbGV2YXRpb25EcmF3KHRpbGUsIHByb2dyYW0pO1xuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuTElORVMsXG4gICAgICAgICAgICBEZXB0aE1vZGUuZGlzYWJsZWQsIFN0ZW5jaWxNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksXG4gICAgICAgICAgICBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBjb2xsaXNpb25Vbmlmb3JtVmFsdWVzKFxuICAgICAgICAgICAgICAgIHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICBwYWludGVyLnRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICB0aWxlKSxcbiAgICAgICAgICAgIGxheWVyLmlkLCBidWZmZXJzLmxheW91dFZlcnRleEJ1ZmZlciwgYnVmZmVycy5pbmRleEJ1ZmZlcixcbiAgICAgICAgICAgIGJ1ZmZlcnMuc2VnbWVudHMsIG51bGwsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sIG51bGwsXG4gICAgICAgICAgICBidWZmZXJzLmNvbGxpc2lvblZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgIGJ1ZmZlcnMuY29sbGlzaW9uVmVydGV4QnVmZmVyRXh0KTtcbiAgICB9XG5cbiAgICBpZiAoIWlzVGV4dCB8fCAhdGlsZUJhdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZW5kZXIgY29sbGlzaW9uIGNpcmNsZXNcbiAgICBjb25zdCBjaXJjbGVQcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdjb2xsaXNpb25DaXJjbGUnKTtcblxuICAgIC8vIENvbnN0cnVjdCB2ZXJ0ZXggZGF0YVxuICAgIGNvbnN0IHZlcnRleERhdGEgPSBuZXcgQ29sbGlzaW9uQ2lyY2xlTGF5b3V0QXJyYXkoKTtcbiAgICB2ZXJ0ZXhEYXRhLnJlc2l6ZShjaXJjbGVDb3VudCAqIDQpO1xuICAgIHZlcnRleERhdGEuX3RyaW0oKTtcblxuICAgIGxldCB2ZXJ0ZXhPZmZzZXQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBiYXRjaCBvZiB0aWxlQmF0Y2hlcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoLmNpcmNsZUFycmF5Lmxlbmd0aCAvIDQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY2lyY2xlSWR4ID0gaSAqIDQ7XG4gICAgICAgICAgICBjb25zdCB4ID0gYmF0Y2guY2lyY2xlQXJyYXlbY2lyY2xlSWR4ICsgMF07XG4gICAgICAgICAgICBjb25zdCB5ID0gYmF0Y2guY2lyY2xlQXJyYXlbY2lyY2xlSWR4ICsgMV07XG4gICAgICAgICAgICBjb25zdCByYWRpdXMgPSBiYXRjaC5jaXJjbGVBcnJheVtjaXJjbGVJZHggKyAyXTtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxpc2lvbiA9IGJhdGNoLmNpcmNsZUFycmF5W2NpcmNsZUlkeCArIDNdO1xuXG4gICAgICAgICAgICAvLyA0IGZsb2F0cyBwZXIgdmVydGV4LCA0IHZlcnRpY2VzIHBlciBxdWFkXG4gICAgICAgICAgICB2ZXJ0ZXhEYXRhLmVtcGxhY2UodmVydGV4T2Zmc2V0KyssIHgsIHksIHJhZGl1cywgY29sbGlzaW9uLCAwKTtcbiAgICAgICAgICAgIHZlcnRleERhdGEuZW1wbGFjZSh2ZXJ0ZXhPZmZzZXQrKywgeCwgeSwgcmFkaXVzLCBjb2xsaXNpb24sIDEpO1xuICAgICAgICAgICAgdmVydGV4RGF0YS5lbXBsYWNlKHZlcnRleE9mZnNldCsrLCB4LCB5LCByYWRpdXMsIGNvbGxpc2lvbiwgMik7XG4gICAgICAgICAgICB2ZXJ0ZXhEYXRhLmVtcGxhY2UodmVydGV4T2Zmc2V0KyssIHgsIHksIHJhZGl1cywgY29sbGlzaW9uLCAzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXF1YWRUcmlhbmdsZXMgfHwgcXVhZFRyaWFuZ2xlcy5sZW5ndGggPCBjaXJjbGVDb3VudCAqIDIpIHtcbiAgICAgICAgcXVhZFRyaWFuZ2xlcyA9IGNyZWF0ZVF1YWRUcmlhbmdsZXMoY2lyY2xlQ291bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIocXVhZFRyaWFuZ2xlcywgdHJ1ZSk7XG4gICAgY29uc3QgdmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih2ZXJ0ZXhEYXRhLCBjb2xsaXNpb25DaXJjbGVMYXlvdXQubWVtYmVycywgdHJ1ZSk7XG5cbiAgICAvLyBSZW5kZXIgYmF0Y2hlc1xuICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgdGlsZUJhdGNoZXMpIHtcbiAgICAgICAgY29uc3QgdW5pZm9ybXMgPSBjb2xsaXNpb25DaXJjbGVVbmlmb3JtVmFsdWVzKFxuICAgICAgICAgICAgYmF0Y2gudHJhbnNmb3JtLFxuICAgICAgICAgICAgYmF0Y2guaW52VHJhbnNmb3JtLFxuICAgICAgICAgICAgcGFpbnRlci50cmFuc2Zvcm1cbiAgICAgICAgKTtcblxuICAgICAgICBjaXJjbGVQcm9ncmFtLmRyYXcoXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgZ2wuVFJJQU5HTEVTLFxuICAgICAgICAgICAgRGVwdGhNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgU3RlbmNpbE1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSxcbiAgICAgICAgICAgIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHVuaWZvcm1zLFxuICAgICAgICAgICAgbGF5ZXIuaWQsXG4gICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICBpbmRleEJ1ZmZlcixcbiAgICAgICAgICAgIFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCBiYXRjaC5jaXJjbGVPZmZzZXQgKiAyLCBiYXRjaC5jaXJjbGVBcnJheS5sZW5ndGgsIGJhdGNoLmNpcmNsZUFycmF5Lmxlbmd0aCAvIDIpLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG51bGwpO1xuICAgIH1cblxuICAgIHZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVRdWFkVHJpYW5nbGVzKHF1YWRDb3VudDogbnVtYmVyKTogUXVhZFRyaWFuZ2xlQXJyYXkge1xuICAgIGNvbnN0IHRyaUNvdW50ID0gcXVhZENvdW50ICogMjtcbiAgICBjb25zdCBhcnJheSA9IG5ldyBRdWFkVHJpYW5nbGVBcnJheSgpO1xuXG4gICAgYXJyYXkucmVzaXplKHRyaUNvdW50KTtcbiAgICBhcnJheS5fdHJpbSgpO1xuXG4gICAgLy8gVHdvIHRyaWFuZ2xlcyBhbmQgNCB2ZXJ0aWNlcyBwZXIgcXVhZC5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyaUNvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgaWR4ID0gaSAqIDY7XG5cbiAgICAgICAgYXJyYXkudWludDE2W2lkeCArIDBdID0gaSAqIDQgKyAwO1xuICAgICAgICBhcnJheS51aW50MTZbaWR4ICsgMV0gPSBpICogNCArIDE7XG4gICAgICAgIGFycmF5LnVpbnQxNltpZHggKyAyXSA9IGkgKiA0ICsgMjtcbiAgICAgICAgYXJyYXkudWludDE2W2lkeCArIDNdID0gaSAqIDQgKyAyO1xuICAgICAgICBhcnJheS51aW50MTZbaWR4ICsgNF0gPSBpICogNCArIDM7XG4gICAgICAgIGFycmF5LnVpbnQxNltpZHggKyA1XSA9IGkgKiA0ICsgMDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgZHJhd0NvbGxpc2lvbkRlYnVnIGZyb20gJy4vZHJhd19jb2xsaXNpb25fZGVidWcuanMnO1xuXG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQuanMnO1xuaW1wb3J0ICogYXMgc3ltYm9sUHJvamVjdGlvbiBmcm9tICcuLi9zeW1ib2wvcHJvamVjdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyBzeW1ib2xTaXplIGZyb20gJy4uL3N5bWJvbC9zeW1ib2xfc2l6ZS5qcyc7XG5pbXBvcnQge21hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5jb25zdCBpZGVudGl0eU1hdDQgPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDMyQXJyYXkoMTYpKTtcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IHthZGREeW5hbWljQXR0cmlidXRlc30gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldC5qcyc7XG5pbXBvcnQge2dldEFuY2hvckFsaWdubWVudCwgV3JpdGluZ01vZGV9IGZyb20gJy4uL3N5bWJvbC9zaGFwaW5nLmpzJztcbmltcG9ydCBPTkVfRU0gZnJvbSAnLi4vc3ltYm9sL29uZV9lbS5qcyc7XG5pbXBvcnQge2V2YWx1YXRlVmFyaWFibGVPZmZzZXR9IGZyb20gJy4uL3N5bWJvbC9zeW1ib2xfbGF5b3V0LmpzJztcbmltcG9ydCBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB7XG4gICAgbWVyY2F0b3JYZnJvbUxuZyxcbiAgICBtZXJjYXRvcllmcm9tTGF0XG59IGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCB7Z2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbn0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vZ2xvYmUuanMnO1xuXG5pbXBvcnQge1xuICAgIHN5bWJvbEljb25Vbmlmb3JtVmFsdWVzLFxuICAgIHN5bWJvbFNERlVuaWZvcm1WYWx1ZXMsXG4gICAgc3ltYm9sVGV4dEFuZEljb25Vbmlmb3JtVmFsdWVzXG59IGZyb20gJy4vcHJvZ3JhbS9zeW1ib2xfcHJvZ3JhbS5qcyc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMnO1xuaW1wb3J0IHR5cGUgU3ltYm9sU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgU3ltYm9sQnVja2V0LCB7U3ltYm9sQnVmZmVyc30gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBUZXh0dXJlIGZyb20gJy4uL3JlbmRlci90ZXh0dXJlLmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlc30gZnJvbSAnLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUge1N5bWJvbFNERlVuaWZvcm1zVHlwZX0gZnJvbSAnLi4vcmVuZGVyL3Byb2dyYW0vc3ltYm9sX3Byb2dyYW0uanMnO1xuaW1wb3J0IHR5cGUge0Nyb3NzVGlsZUlELCBWYXJpYWJsZU9mZnNldH0gZnJvbSAnLi4vc3ltYm9sL3BsYWNlbWVudC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdTeW1ib2xzO1xuXG50eXBlIFN5bWJvbFRpbGVSZW5kZXJTdGF0ZSA9IHtcbiAgICBzZWdtZW50czogU2VnbWVudFZlY3RvcixcbiAgICBzb3J0S2V5OiBudW1iZXIsXG4gICAgc3RhdGU6IHtcbiAgICAgICAgcHJvZ3JhbTogYW55LFxuICAgICAgICBidWZmZXJzOiBTeW1ib2xCdWZmZXJzLFxuICAgICAgICB1bmlmb3JtVmFsdWVzOiBhbnksXG4gICAgICAgIGF0bGFzVGV4dHVyZTogVGV4dHVyZSxcbiAgICAgICAgYXRsYXNUZXh0dXJlSWNvbjogVGV4dHVyZSB8IG51bGwsXG4gICAgICAgIGF0bGFzSW50ZXJwb2xhdGlvbjogYW55LFxuICAgICAgICBhdGxhc0ludGVycG9sYXRpb25JY29uOiBhbnksXG4gICAgICAgIGlzU0RGOiBib29sZWFuLFxuICAgICAgICBoYXNIYWxvOiBib29sZWFuLFxuICAgICAgICB0aWxlOiBUaWxlLFxuICAgICAgICBsYWJlbFBsYW5lTWF0cml4SW52OiA/RmxvYXQzMkFycmF5XG4gICAgfVxufTtcblxuZnVuY3Rpb24gZHJhd1N5bWJvbHMocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogU3ltYm9sU3R5bGVMYXllciwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPiwgdmFyaWFibGVPZmZzZXRzOiB7W186IENyb3NzVGlsZUlEXTogVmFyaWFibGVPZmZzZXR9KSB7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuXG4gICAgLy8gRGlzYWJsZSB0aGUgc3RlbmNpbCB0ZXN0IHNvIHRoYXQgbGFiZWxzIGFyZW4ndCBjbGlwcGVkIHRvIHRpbGUgYm91bmRhcmllcy5cbiAgICBjb25zdCBzdGVuY2lsTW9kZSA9IFN0ZW5jaWxNb2RlLmRpc2FibGVkO1xuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuICAgIGNvbnN0IHZhcmlhYmxlUGxhY2VtZW50ID0gbGF5ZXIubGF5b3V0LmdldCgndGV4dC12YXJpYWJsZS1hbmNob3InKTtcblxuICAgIC8vQ29tcHV0ZSB2YXJpYWJsZS1vZmZzZXRzIGJlZm9yZSBwYWludGluZyBzaW5jZSBpY29ucyBhbmQgdGV4dCBkYXRhIHBvc2l0aW9uaW5nXG4gICAgLy9kZXBlbmQgb24gZWFjaCBvdGhlciBpbiB0aGlzIGNhc2UuXG4gICAgaWYgKHZhcmlhYmxlUGxhY2VtZW50KSB7XG4gICAgICAgIHVwZGF0ZVZhcmlhYmxlQW5jaG9ycyhjb29yZHMsIHBhaW50ZXIsIGxheWVyLCBzb3VyY2VDYWNoZSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXBpdGNoLWFsaWdubWVudCcpLFxuICAgICAgICAgICAgdmFyaWFibGVPZmZzZXRzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnaWNvbi1vcGFjaXR5JykuY29uc3RhbnRPcigxKSAhPT0gMCkge1xuICAgICAgICBkcmF3TGF5ZXJTeW1ib2xzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBmYWxzZSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnaWNvbi10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnaWNvbi10cmFuc2xhdGUtYW5jaG9yJyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXJvdGF0aW9uLWFsaWdubWVudCcpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1waXRjaC1hbGlnbm1lbnQnKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ2ljb24ta2VlcC11cHJpZ2h0JyksXG4gICAgICAgICAgICBzdGVuY2lsTW9kZSwgY29sb3JNb2RlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgndGV4dC1vcGFjaXR5JykuY29uc3RhbnRPcigxKSAhPT0gMCkge1xuICAgICAgICBkcmF3TGF5ZXJTeW1ib2xzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCB0cnVlLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCd0ZXh0LXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCd0ZXh0LXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXBpdGNoLWFsaWdubWVudCcpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgndGV4dC1rZWVwLXVwcmlnaHQnKSxcbiAgICAgICAgICAgIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlQ2FjaGUubWFwLnNob3dDb2xsaXNpb25Cb3hlcykge1xuICAgICAgICBkcmF3Q29sbGlzaW9uRGVidWcocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGxheWVyLnBhaW50LmdldCgndGV4dC10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgndGV4dC10cmFuc2xhdGUtYW5jaG9yJyksIHRydWUpO1xuICAgICAgICBkcmF3Q29sbGlzaW9uRGVidWcocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGxheWVyLnBhaW50LmdldCgnaWNvbi10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnaWNvbi10cmFuc2xhdGUtYW5jaG9yJyksIGZhbHNlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVZhcmlhYmxlUmVuZGVyU2hpZnQoYW5jaG9yLCB3aWR0aCwgaGVpZ2h0LCB0ZXh0T2Zmc2V0LCB0ZXh0U2NhbGUsIHJlbmRlclRleHRTaXplKTogUG9pbnQge1xuICAgIGNvbnN0IHtob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ259ID0gZ2V0QW5jaG9yQWxpZ25tZW50KGFuY2hvcik7XG4gICAgY29uc3Qgc2hpZnRYID0gLShob3Jpem9udGFsQWxpZ24gLSAwLjUpICogd2lkdGg7XG4gICAgY29uc3Qgc2hpZnRZID0gLSh2ZXJ0aWNhbEFsaWduIC0gMC41KSAqIGhlaWdodDtcbiAgICBjb25zdCB2YXJpYWJsZU9mZnNldCA9IGV2YWx1YXRlVmFyaWFibGVPZmZzZXQoYW5jaG9yLCB0ZXh0T2Zmc2V0KTtcbiAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAoc2hpZnRYIC8gdGV4dFNjYWxlICsgdmFyaWFibGVPZmZzZXRbMF0pICogcmVuZGVyVGV4dFNpemUsXG4gICAgICAgIChzaGlmdFkgLyB0ZXh0U2NhbGUgKyB2YXJpYWJsZU9mZnNldFsxXSkgKiByZW5kZXJUZXh0U2l6ZVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZhcmlhYmxlQW5jaG9ycyhjb29yZHMsIHBhaW50ZXIsIGxheWVyLCBzb3VyY2VDYWNoZSwgcm90YXRpb25BbGlnbm1lbnQsIHBpdGNoQWxpZ25tZW50LCB2YXJpYWJsZU9mZnNldHMpIHtcbiAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSByb3RhdGlvbkFsaWdubWVudCA9PT0gJ21hcCc7XG4gICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gcGl0Y2hBbGlnbm1lbnQgPT09ICdtYXAnO1xuICAgIGNvbnN0IHRpbGVUcmFuc2Zvcm0gPSB0ci5wcm9qZWN0aW9uLmNyZWF0ZVRpbGVUcmFuc2Zvcm0odHIsIHRyLndvcmxkU2l6ZSk7XG5cbiAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIGNvb3Jkcykge1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldDogU3ltYm9sQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgaWYgKCFidWNrZXQgfHwgYnVja2V0LnByb2plY3Rpb24gIT09IHRyLnByb2plY3Rpb24ubmFtZSB8fCAhYnVja2V0LnRleHQgfHwgIWJ1Y2tldC50ZXh0LnNlZ21lbnRzLmdldCgpLmxlbmd0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaXplRGF0YSA9IGJ1Y2tldC50ZXh0U2l6ZURhdGE7XG4gICAgICAgIGNvbnN0IHNpemUgPSBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvclpvb20oc2l6ZURhdGEsIHRyLnpvb20pO1xuXG4gICAgICAgIGNvbnN0IHBpeGVsc1RvVGlsZVVuaXRzID0gcGFpbnRlci50cmFuc2Zvcm0uY2FsY3VsYXRlUGl4ZWxzVG9UaWxlVW5pdHNNYXRyaXgodGlsZSk7XG4gICAgICAgIGNvbnN0IGxhYmVsUGxhbmVNYXRyaXggPSBzeW1ib2xQcm9qZWN0aW9uLmdldExhYmVsUGxhbmVNYXRyaXgoY29vcmQucHJvak1hdHJpeCwgdGlsZS50aWxlSUQuY2Fub25pY2FsLCBwaXRjaFdpdGhNYXAsIHJvdGF0ZVdpdGhNYXAsIHBhaW50ZXIudHJhbnNmb3JtLCBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVRleHRGaXRJY29uID0gbGF5ZXIubGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpICE9PSAnbm9uZScgJiYgIGJ1Y2tldC5oYXNJY29uRGF0YSgpO1xuXG4gICAgICAgIGlmIChzaXplKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlU2NhbGUgPSBNYXRoLnBvdygyLCB0ci56b29tIC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgICAgICAgICAgdXBkYXRlVmFyaWFibGVBbmNob3JzRm9yQnVja2V0KGJ1Y2tldCwgcm90YXRlV2l0aE1hcCwgcGl0Y2hXaXRoTWFwLCB2YXJpYWJsZU9mZnNldHMsIHN5bWJvbFNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIsIGxhYmVsUGxhbmVNYXRyaXgsIGNvb3JkLCB0aWxlU2NhbGUsIHNpemUsIHVwZGF0ZVRleHRGaXRJY29uLCB0aWxlVHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlVmFyaWFibGVBbmNob3JzRm9yQnVja2V0KGJ1Y2tldCwgcm90YXRlV2l0aE1hcCwgcGl0Y2hXaXRoTWFwLCB2YXJpYWJsZU9mZnNldHMsIHN5bWJvbFNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLCBsYWJlbFBsYW5lTWF0cml4LCBjb29yZCwgdGlsZVNjYWxlLCBzaXplLCB1cGRhdGVUZXh0Rml0SWNvbiwgdGlsZVRyYW5zZm9ybSkge1xuICAgIGNvbnN0IHBsYWNlZFN5bWJvbHMgPSBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheTtcbiAgICBjb25zdCBkeW5hbWljVGV4dExheW91dFZlcnRleEFycmF5ID0gYnVja2V0LnRleHQuZHluYW1pY0xheW91dFZlcnRleEFycmF5O1xuICAgIGNvbnN0IGR5bmFtaWNJY29uTGF5b3V0VmVydGV4QXJyYXkgPSBidWNrZXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QXJyYXk7XG4gICAgY29uc3QgcGxhY2VkVGV4dFNoaWZ0cyA9IHt9O1xuICAgIGNvbnN0IHByb2pNYXRyaXggPSBjb29yZC5wcm9qTWF0cml4O1xuICAgIGNvbnN0IGVsZXZhdGlvbiA9IHRyYW5zZm9ybS5lbGV2YXRpb247XG4gICAgY29uc3QgZ2V0RWxldmF0aW9uID0gZWxldmF0aW9uID8gZWxldmF0aW9uLmdldEF0VGlsZU9mZnNldEZ1bmMoY29vcmQsIHRpbGVUcmFuc2Zvcm0pIDogKF8gPT4gWzAsIDAsIDBdKTtcblxuICAgIGR5bmFtaWNUZXh0TGF5b3V0VmVydGV4QXJyYXkuY2xlYXIoKTtcbiAgICBmb3IgKGxldCBzID0gMDsgcyA8IHBsYWNlZFN5bWJvbHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sOiBhbnkgPSBwbGFjZWRTeW1ib2xzLmdldChzKTtcbiAgICAgICAgY29uc3Qgc2tpcE9yaWVudGF0aW9uID0gYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgIXN5bWJvbC5wbGFjZWRPcmllbnRhdGlvbjtcbiAgICAgICAgY29uc3QgdmFyaWFibGVPZmZzZXQgPSAoIXN5bWJvbC5oaWRkZW4gJiYgc3ltYm9sLmNyb3NzVGlsZUlEICYmICFza2lwT3JpZW50YXRpb24pID8gdmFyaWFibGVPZmZzZXRzW3N5bWJvbC5jcm9zc1RpbGVJRF0gOiBudWxsO1xuXG4gICAgICAgIGlmICghdmFyaWFibGVPZmZzZXQpIHtcbiAgICAgICAgICAgIC8vIFRoZXNlIHN5bWJvbHMgYXJlIGZyb20gYSBqdXN0aWZpY2F0aW9uIHRoYXQgaXMgbm90IGJlaW5nIHVzZWQsIG9yIGEgbGFiZWwgdGhhdCB3YXNuJ3QgcGxhY2VkXG4gICAgICAgICAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoZSBleHRyYSBtYXRoIHRvIGZpZ3VyZSBvdXQgd2hhdCBpbmNyZW1lbnRhbCBzaGlmdCB0byBhcHBseS5cbiAgICAgICAgICAgIHN5bWJvbFByb2plY3Rpb24uaGlkZUdseXBocyhzeW1ib2wubnVtR2x5cGhzLCBkeW5hbWljVGV4dExheW91dFZlcnRleEFycmF5KTtcbiAgICAgICAgfSBlbHNlICB7XG4gICAgICAgICAgICBjb25zdCB0aWxlQW5jaG9yID0gbmV3IFBvaW50KHN5bWJvbC50aWxlQW5jaG9yWCwgc3ltYm9sLnRpbGVBbmNob3JZKTtcbiAgICAgICAgICAgIGNvbnN0IGFuY2hvckVsZXZhdGlvbiA9IGdldEVsZXZhdGlvbih0aWxlQW5jaG9yKTtcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3RlZEFuY2hvciA9IHN5bWJvbFByb2plY3Rpb24ucHJvamVjdCh0aWxlQW5jaG9yLCBwaXRjaFdpdGhNYXAgPyBwcm9qTWF0cml4IDogbGFiZWxQbGFuZU1hdHJpeCwgYW5jaG9yRWxldmF0aW9uWzJdKTtcbiAgICAgICAgICAgIGNvbnN0IHBlcnNwZWN0aXZlUmF0aW8gPSBzeW1ib2xQcm9qZWN0aW9uLmdldFBlcnNwZWN0aXZlUmF0aW8odHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsIHByb2plY3RlZEFuY2hvci5zaWduZWREaXN0YW5jZUZyb21DYW1lcmEpO1xuICAgICAgICAgICAgbGV0IHJlbmRlclRleHRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3JGZWF0dXJlKGJ1Y2tldC50ZXh0U2l6ZURhdGEsIHNpemUsIHN5bWJvbCkgKiBwZXJzcGVjdGl2ZVJhdGlvIC8gT05FX0VNO1xuICAgICAgICAgICAgaWYgKHBpdGNoV2l0aE1hcCkge1xuICAgICAgICAgICAgICAgIC8vIEdvIGZyb20gc2l6ZSBpbiBwaXhlbHMgdG8gZXF1aXZhbGVudCBzaXplIGluIHRpbGUgdW5pdHNcbiAgICAgICAgICAgICAgICByZW5kZXJUZXh0U2l6ZSAqPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gLyB0aWxlU2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0LCBhbmNob3IsIHRleHRPZmZzZXQsIHRleHRTY2FsZX0gPSB2YXJpYWJsZU9mZnNldDtcblxuICAgICAgICAgICAgY29uc3Qgc2hpZnQgPSBjYWxjdWxhdGVWYXJpYWJsZVJlbmRlclNoaWZ0KFxuICAgICAgICAgICAgICAgIGFuY2hvciwgd2lkdGgsIGhlaWdodCwgdGV4dE9mZnNldCwgdGV4dFNjYWxlLCByZW5kZXJUZXh0U2l6ZSk7XG5cbiAgICAgICAgICAgIC8vIFVzdWFsIGNhc2UgaXMgdGhhdCB3ZSB0YWtlIHRoZSBwcm9qZWN0ZWQgYW5jaG9yIGFuZCBhZGQgdGhlIHBpeGVsLWJhc2VkIHNoaWZ0XG4gICAgICAgICAgICAvLyBjYWxjdWxhdGVkIGFib3ZlLiBJbiB0aGUgKHNvbWV3aGF0IHdlaXJkKSBjYXNlIG9mIHBpdGNoLWFsaWduZWQgdGV4dCwgd2UgYWRkIGFuIGVxdWl2YWxlbnRcbiAgICAgICAgICAgIC8vIHRpbGUtdW5pdCBiYXNlZCBzaGlmdCB0byB0aGUgYW5jaG9yIGJlZm9yZSBwcm9qZWN0aW5nIHRvIHRoZSBsYWJlbCBwbGFuZS5cbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ZWRBbmNob3IgPSBwaXRjaFdpdGhNYXAgP1xuICAgICAgICAgICAgICAgIHN5bWJvbFByb2plY3Rpb24ucHJvamVjdCh0aWxlQW5jaG9yLmFkZChzaGlmdCksIGxhYmVsUGxhbmVNYXRyaXgsIGFuY2hvckVsZXZhdGlvblsyXSkucG9pbnQgOlxuICAgICAgICAgICAgICAgIHByb2plY3RlZEFuY2hvci5wb2ludC5hZGQocm90YXRlV2l0aE1hcCA/XG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0LnJvdGF0ZSgtdHJhbnNmb3JtLmFuZ2xlKSA6XG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0KTtcblxuICAgICAgICAgICAgY29uc3QgYW5nbGUgPSAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgc3ltYm9sLnBsYWNlZE9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCkgPyBNYXRoLlBJIC8gMiA6IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBnID0gMDsgZyA8IHN5bWJvbC5udW1HbHlwaHM7IGcrKykge1xuICAgICAgICAgICAgICAgIGFkZER5bmFtaWNBdHRyaWJ1dGVzKGR5bmFtaWNUZXh0TGF5b3V0VmVydGV4QXJyYXksIHNoaWZ0ZWRBbmNob3IsIGFuZ2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vT25seSBvZmZzZXQgaG9yaXpvbnRhbCB0ZXh0IGljb25zXG4gICAgICAgICAgICBpZiAodXBkYXRlVGV4dEZpdEljb24gJiYgc3ltYm9sLmFzc29jaWF0ZWRJY29uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHBsYWNlZFRleHRTaGlmdHNbc3ltYm9sLmFzc29jaWF0ZWRJY29uSW5kZXhdID0ge3NoaWZ0ZWRBbmNob3IsIGFuZ2xlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1cGRhdGVUZXh0Rml0SWNvbikge1xuICAgICAgICBkeW5hbWljSWNvbkxheW91dFZlcnRleEFycmF5LmNsZWFyKCk7XG4gICAgICAgIGNvbnN0IHBsYWNlZEljb25zID0gYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2VkSWNvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlZEljb24gPSBwbGFjZWRJY29ucy5nZXQoaSk7XG4gICAgICAgICAgICBpZiAocGxhY2VkSWNvbi5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLmhpZGVHbHlwaHMocGxhY2VkSWNvbi5udW1HbHlwaHMsIGR5bmFtaWNJY29uTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGlmdCA9IHBsYWNlZFRleHRTaGlmdHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKCFzaGlmdCkge1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLmhpZGVHbHlwaHMocGxhY2VkSWNvbi5udW1HbHlwaHMsIGR5bmFtaWNJY29uTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGcgPSAwOyBnIDwgcGxhY2VkSWNvbi5udW1HbHlwaHM7IGcrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkRHluYW1pY0F0dHJpYnV0ZXMoZHluYW1pY0ljb25MYXlvdXRWZXJ0ZXhBcnJheSwgc2hpZnQuc2hpZnRlZEFuY2hvciwgc2hpZnQuYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ1Y2tldC5pY29uLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShkeW5hbWljSWNvbkxheW91dFZlcnRleEFycmF5KTtcbiAgICB9XG4gICAgYnVja2V0LnRleHQuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGR5bmFtaWNUZXh0TGF5b3V0VmVydGV4QXJyYXkpO1xufVxuXG5mdW5jdGlvbiBnZXRTeW1ib2xQcm9ncmFtTmFtZShpc1NERjogYm9vbGVhbiwgaXNUZXh0OiBib29sZWFuLCBidWNrZXQ6IFN5bWJvbEJ1Y2tldCkge1xuICAgIGlmIChidWNrZXQuaWNvbnNJblRleHQgJiYgaXNUZXh0KSB7XG4gICAgICAgIHJldHVybiAnc3ltYm9sVGV4dEFuZEljb24nO1xuICAgIH0gZWxzZSBpZiAoaXNTREYpIHtcbiAgICAgICAgcmV0dXJuICdzeW1ib2xTREYnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnc3ltYm9sSWNvbic7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3TGF5ZXJTeW1ib2xzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBpc1RleHQsIHRyYW5zbGF0ZSwgdHJhbnNsYXRlQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkFsaWdubWVudCwgcGl0Y2hBbGlnbm1lbnQsIGtlZXBVcHJpZ2h0LCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCB0aWxlVHJhbnNmb3JtID0gdHIucHJvamVjdGlvbi5jcmVhdGVUaWxlVHJhbnNmb3JtKHRyLCB0ci53b3JsZFNpemUpO1xuXG4gICAgY29uc3Qgcm90YXRlV2l0aE1hcCA9IHJvdGF0aW9uQWxpZ25tZW50ID09PSAnbWFwJztcbiAgICBjb25zdCBwaXRjaFdpdGhNYXAgPSBwaXRjaEFsaWdubWVudCA9PT0gJ21hcCc7XG4gICAgY29uc3QgYWxvbmdMaW5lID0gcm90YXRlV2l0aE1hcCAmJiBsYXllci5sYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCc7XG5cbiAgICAvLyBMaW5lIGxhYmVsIHJvdGF0aW9uIGhhcHBlbnMgaW4gYHVwZGF0ZUxpbmVMYWJlbHNgXG4gICAgLy8gUGl0Y2hlZCBwb2ludCBsYWJlbHMgYXJlIGF1dG9tYXRpY2FsbHkgcm90YXRlZCBieSB0aGUgbGFiZWxQbGFuZU1hdHJpeCBwcm9qZWN0aW9uXG4gICAgLy8gVW5waXRjaGVkIHBvaW50IGxhYmVscyBuZWVkIHRvIGhhdmUgdGhlaXIgcm90YXRpb24gYXBwbGllZCBhZnRlciBwcm9qZWN0aW9uXG4gICAgY29uc3Qgcm90YXRlSW5TaGFkZXIgPSByb3RhdGVXaXRoTWFwICYmICFwaXRjaFdpdGhNYXAgJiYgIWFsb25nTGluZTtcblxuICAgIGNvbnN0IGhhc1NvcnRLZXkgPSBsYXllci5sYXlvdXQuZ2V0KCdzeW1ib2wtc29ydC1rZXknKS5jb25zdGFudE9yKDEpICE9PSB1bmRlZmluZWQ7XG4gICAgbGV0IHNvcnRGZWF0dXJlc0J5S2V5ID0gZmFsc2U7XG5cbiAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgY29uc3QgbWVyY0NlbnRlciA9IFtcbiAgICAgICAgbWVyY2F0b3JYZnJvbUxuZyh0ci5jZW50ZXIubG5nKSxcbiAgICAgICAgbWVyY2F0b3JZZnJvbUxhdCh0ci5jZW50ZXIubGF0KVxuICAgIF07XG4gICAgY29uc3QgdmFyaWFibGVQbGFjZW1lbnQgPSBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXZhcmlhYmxlLWFuY2hvcicpO1xuICAgIGNvbnN0IGlzR2xvYmVQcm9qZWN0aW9uID0gdHIucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnO1xuICAgIGNvbnN0IGdsb2JlVG9NZXJjYXRvciA9IGlzR2xvYmVQcm9qZWN0aW9uID9cbiAgICAgICAgZ2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbih0ci56b29tKSA6IDAuMDtcbiAgICBjb25zdCB0aWxlUmVuZGVyU3RhdGU6IEFycmF5PFN5bWJvbFRpbGVSZW5kZXJTdGF0ZT4gPSBbXTtcblxuICAgIGNvbnN0IGRlZmluZXMgPSAoW106IGFueSk7XG4gICAgaWYgKHBhaW50ZXIudGVycmFpbiAmJiBwaXRjaFdpdGhNYXApIHtcbiAgICAgICAgZGVmaW5lcy5wdXNoKCdQSVRDSF9XSVRIX01BUF9URVJSQUlOJyk7XG4gICAgfVxuICAgIGlmIChpc0dsb2JlUHJvamVjdGlvbikge1xuICAgICAgICBkZWZpbmVzLnB1c2goJ1BST0pFQ1RJT05fR0xPQkVfVklFVycpO1xuICAgIH1cbiAgICBpZiAoYWxvbmdMaW5lKSB7XG4gICAgICAgIGRlZmluZXMucHVzaCgnUFJPSkVDVEVEX1BPU19PTl9WSUVXUE9SVCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0OiBTeW1ib2xCdWNrZXQgPSAodGlsZS5nZXRCdWNrZXQobGF5ZXIpOiBhbnkpO1xuICAgICAgICBpZiAoIWJ1Y2tldCB8fCBidWNrZXQucHJvamVjdGlvbiAhPT0gdHIucHJvamVjdGlvbi5uYW1lKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYnVmZmVycyA9IGlzVGV4dCA/IGJ1Y2tldC50ZXh0IDogYnVja2V0Lmljb247XG4gICAgICAgIGlmICghYnVmZmVycyB8fCBidWNrZXQuZnVsbHlDbGlwcGVkIHx8ICFidWZmZXJzLnNlZ21lbnRzLmdldCgpLmxlbmd0aCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVmZmVycy5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcblxuICAgICAgICBjb25zdCBpc1NERiA9IGlzVGV4dCB8fCBidWNrZXQuc2RmSWNvbnM7XG5cbiAgICAgICAgY29uc3Qgc2l6ZURhdGEgPSBpc1RleHQgPyBidWNrZXQudGV4dFNpemVEYXRhIDogYnVja2V0Lmljb25TaXplRGF0YTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBwaXRjaFdpdGhNYXAgfHwgdHIucGl0Y2ggIT09IDA7XG5cbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShnZXRTeW1ib2xQcm9ncmFtTmFtZShpc1NERiwgaXNUZXh0LCBidWNrZXQpLCBwcm9ncmFtQ29uZmlndXJhdGlvbiwgZGVmaW5lcyk7XG4gICAgICAgIGNvbnN0IHNpemUgPSBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvclpvb20oc2l6ZURhdGEsIHRyLnpvb20pO1xuICAgICAgICBjb25zdCBjb29yZElkID0gW2Nvb3JkLmNhbm9uaWNhbC54LCBjb29yZC5jYW5vbmljYWwueSwgMSA8PCBjb29yZC5jYW5vbmljYWwuel07XG5cbiAgICAgICAgbGV0IHRleFNpemU6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICAgIGxldCB0ZXhTaXplSWNvbjogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICAgICAgbGV0IGF0bGFzVGV4dHVyZTtcbiAgICAgICAgbGV0IGF0bGFzSW50ZXJwb2xhdGlvbjtcbiAgICAgICAgbGV0IGF0bGFzVGV4dHVyZUljb24gPSBudWxsO1xuICAgICAgICBsZXQgYXRsYXNJbnRlcnBvbGF0aW9uSWNvbjtcbiAgICAgICAgaWYgKGlzVGV4dCkge1xuICAgICAgICAgICAgYXRsYXNUZXh0dXJlID0gdGlsZS5nbHlwaEF0bGFzVGV4dHVyZTtcbiAgICAgICAgICAgIGF0bGFzSW50ZXJwb2xhdGlvbiA9IGdsLkxJTkVBUjtcbiAgICAgICAgICAgIHRleFNpemUgPSB0aWxlLmdseXBoQXRsYXNUZXh0dXJlLnNpemU7XG4gICAgICAgICAgICBpZiAoYnVja2V0Lmljb25zSW5UZXh0KSB7XG4gICAgICAgICAgICAgICAgdGV4U2l6ZUljb24gPSB0aWxlLmltYWdlQXRsYXNUZXh0dXJlLnNpemU7XG4gICAgICAgICAgICAgICAgYXRsYXNUZXh0dXJlSWNvbiA9IHRpbGUuaW1hZ2VBdGxhc1RleHR1cmU7XG4gICAgICAgICAgICAgICAgY29uc3Qgem9vbURlcGVuZGVudFNpemUgPSBzaXplRGF0YS5raW5kID09PSAnY29tcG9zaXRlJyB8fCBzaXplRGF0YS5raW5kID09PSAnY2FtZXJhJztcbiAgICAgICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb25JY29uID0gdHJhbnNmb3JtZWQgfHwgcGFpbnRlci5vcHRpb25zLnJvdGF0aW5nIHx8IHBhaW50ZXIub3B0aW9ucy56b29taW5nIHx8IHpvb21EZXBlbmRlbnRTaXplID8gZ2wuTElORUFSIDogZ2wuTkVBUkVTVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGljb25TY2FsZWQgPSBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXNpemUnKS5jb25zdGFudE9yKDApICE9PSAxIHx8IGJ1Y2tldC5pY29uc05lZWRMaW5lYXI7XG4gICAgICAgICAgICBhdGxhc1RleHR1cmUgPSB0aWxlLmltYWdlQXRsYXNUZXh0dXJlO1xuICAgICAgICAgICAgYXRsYXNJbnRlcnBvbGF0aW9uID0gaXNTREYgfHwgcGFpbnRlci5vcHRpb25zLnJvdGF0aW5nIHx8IHBhaW50ZXIub3B0aW9ucy56b29taW5nIHx8IGljb25TY2FsZWQgfHwgdHJhbnNmb3JtZWQgP1xuICAgICAgICAgICAgICAgIGdsLkxJTkVBUiA6XG4gICAgICAgICAgICAgICAgZ2wuTkVBUkVTVDtcbiAgICAgICAgICAgIHRleFNpemUgPSB0aWxlLmltYWdlQXRsYXNUZXh0dXJlLnNpemU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzID0gcGFpbnRlci50cmFuc2Zvcm0uY2FsY3VsYXRlUGl4ZWxzVG9UaWxlVW5pdHNNYXRyaXgodGlsZSk7XG4gICAgICAgIGNvbnN0IGxhYmVsUGxhbmVNYXRyaXggPSBzeW1ib2xQcm9qZWN0aW9uLmdldExhYmVsUGxhbmVNYXRyaXgoY29vcmQucHJvak1hdHJpeCwgdGlsZS50aWxlSUQuY2Fub25pY2FsLCBwaXRjaFdpdGhNYXAsIHJvdGF0ZVdpdGhNYXAsIHBhaW50ZXIudHJhbnNmb3JtLCBzKTtcbiAgICAgICAgLy8gbGFiZWxQbGFuZU1hdHJpeEludiBpcyB1c2VkIGZvciBjb252ZXJ0aW5nIHZlcnRleCBwb3MgdG8gdGlsZSBjb29yZGluYXRlcyBuZWVkZWQgZm9yIHNhbXBsaW5nIGVsZXZhdGlvbi5cbiAgICAgICAgY29uc3QgbGFiZWxQbGFuZU1hdHJpeEludiA9IHBhaW50ZXIudGVycmFpbiAmJiBwaXRjaFdpdGhNYXAgJiYgYWxvbmdMaW5lID8gbWF0NC5pbnZlcnQobmV3IEZsb2F0MzJBcnJheSgxNiksIGxhYmVsUGxhbmVNYXRyaXgpIDogaWRlbnRpdHlNYXQ0O1xuICAgICAgICBjb25zdCBnbENvb3JkTWF0cml4ID0gc3ltYm9sUHJvamVjdGlvbi5nZXRHbENvb3JkTWF0cml4KGNvb3JkLnByb2pNYXRyaXgsIHRpbGUudGlsZUlELmNhbm9uaWNhbCwgcGl0Y2hXaXRoTWFwLCByb3RhdGVXaXRoTWFwLCBwYWludGVyLnRyYW5zZm9ybSwgcyk7XG5cbiAgICAgICAgY29uc3QgaGFzVmFyaWFibGVBbmNob3JzID0gdmFyaWFibGVQbGFjZW1lbnQgJiYgYnVja2V0Lmhhc1RleHREYXRhKCk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVRleHRGaXRJY29uID0gbGF5ZXIubGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpICE9PSAnbm9uZScgJiZcbiAgICAgICAgICAgIGhhc1ZhcmlhYmxlQW5jaG9ycyAmJlxuICAgICAgICAgICAgYnVja2V0Lmhhc0ljb25EYXRhKCk7XG5cbiAgICAgICAgaWYgKGFsb25nTGluZSkge1xuICAgICAgICAgICAgY29uc3QgZWxldmF0aW9uID0gdHIuZWxldmF0aW9uO1xuICAgICAgICAgICAgY29uc3QgZ2V0RWxldmF0aW9uID0gZWxldmF0aW9uID8gZWxldmF0aW9uLmdldEF0VGlsZU9mZnNldEZ1bmMoY29vcmQsIHRpbGVUcmFuc2Zvcm0pIDogKF8gPT4gWzAsIDAsIDBdKTtcbiAgICAgICAgICAgIHN5bWJvbFByb2plY3Rpb24udXBkYXRlTGluZUxhYmVscyhidWNrZXQsIGNvb3JkLnByb2pNYXRyaXgsIHBhaW50ZXIsIGlzVGV4dCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCwgcGl0Y2hXaXRoTWFwLCBrZWVwVXByaWdodCwgZ2V0RWxldmF0aW9uLCBjb29yZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRyaXggPSBwYWludGVyLnRyYW5zbGF0ZVBvc01hdHJpeChjb29yZC5wcm9qTWF0cml4LCB0aWxlLCB0cmFuc2xhdGUsIHRyYW5zbGF0ZUFuY2hvciksXG4gICAgICAgICAgICB1TGFiZWxQbGFuZU1hdHJpeCA9IChhbG9uZ0xpbmUgfHwgKGlzVGV4dCAmJiB2YXJpYWJsZVBsYWNlbWVudCkgfHwgdXBkYXRlVGV4dEZpdEljb24pID8gaWRlbnRpdHlNYXQ0IDogbGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgICAgIHVnbENvb3JkTWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoZ2xDb29yZE1hdHJpeCwgdGlsZSwgdHJhbnNsYXRlLCB0cmFuc2xhdGVBbmNob3IsIHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGhhc0hhbG8gPSBpc1NERiAmJiBsYXllci5wYWludC5nZXQoaXNUZXh0ID8gJ3RleHQtaGFsby13aWR0aCcgOiAnaWNvbi1oYWxvLXdpZHRoJykuY29uc3RhbnRPcigxKSAhPT0gMDtcblxuICAgICAgICBsZXQgdW5pZm9ybVZhbHVlcztcbiAgICAgICAgY29uc3QgaW52TWF0cml4ID0gdGlsZVRyYW5zZm9ybS5jcmVhdGVJbnZlcnNpb25NYXRyaXgoY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgaWYgKGlzU0RGKSB7XG4gICAgICAgICAgICBpZiAoIWJ1Y2tldC5pY29uc0luVGV4dCkge1xuICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMgPSBzeW1ib2xTREZVbmlmb3JtVmFsdWVzKHNpemVEYXRhLmtpbmQsXG4gICAgICAgICAgICAgICAgc2l6ZSwgcm90YXRlSW5TaGFkZXIsIHBpdGNoV2l0aE1hcCwgcGFpbnRlciwgbWF0cml4LFxuICAgICAgICAgICAgICAgIHVMYWJlbFBsYW5lTWF0cml4LCB1Z2xDb29yZE1hdHJpeCwgaXNUZXh0LCB0ZXhTaXplLCB0cnVlLFxuICAgICAgICAgICAgICAgIGNvb3JkSWQsIGdsb2JlVG9NZXJjYXRvciwgaW52TWF0cml4LCBtZXJjQ2VudGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlcyA9IHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybVZhbHVlcyhzaXplRGF0YS5raW5kLFxuICAgICAgICAgICAgICAgIHNpemUsIHJvdGF0ZUluU2hhZGVyLCBwaXRjaFdpdGhNYXAsIHBhaW50ZXIsIG1hdHJpeCxcbiAgICAgICAgICAgICAgICB1TGFiZWxQbGFuZU1hdHJpeCwgdWdsQ29vcmRNYXRyaXgsIHRleFNpemUsIHRleFNpemVJY29uLFxuICAgICAgICAgICAgICAgIGNvb3JkSWQsIGdsb2JlVG9NZXJjYXRvciwgaW52TWF0cml4LCBtZXJjQ2VudGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMgPSBzeW1ib2xJY29uVW5pZm9ybVZhbHVlcyhzaXplRGF0YS5raW5kLFxuICAgICAgICAgICAgICAgIHNpemUsIHJvdGF0ZUluU2hhZGVyLCBwaXRjaFdpdGhNYXAsIHBhaW50ZXIsIG1hdHJpeCxcbiAgICAgICAgICAgICAgICB1TGFiZWxQbGFuZU1hdHJpeCwgdWdsQ29vcmRNYXRyaXgsIGlzVGV4dCwgdGV4U2l6ZSxcbiAgICAgICAgICAgICAgICBjb29yZElkLCBnbG9iZVRvTWVyY2F0b3IsIGludk1hdHJpeCwgbWVyY0NlbnRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgICAgICAgIHByb2dyYW0sXG4gICAgICAgICAgICBidWZmZXJzLFxuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcyxcbiAgICAgICAgICAgIGF0bGFzVGV4dHVyZSxcbiAgICAgICAgICAgIGF0bGFzVGV4dHVyZUljb24sXG4gICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb24sXG4gICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb25JY29uLFxuICAgICAgICAgICAgaXNTREYsXG4gICAgICAgICAgICBoYXNIYWxvLFxuICAgICAgICAgICAgdGlsZSxcbiAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXhJbnZcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaGFzU29ydEtleSAmJiBidWNrZXQuY2FuT3ZlcmxhcCkge1xuICAgICAgICAgICAgc29ydEZlYXR1cmVzQnlLZXkgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3Qgb2xkU2VnbWVudHMgPSBidWZmZXJzLnNlZ21lbnRzLmdldCgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG9sZFNlZ21lbnRzKSB7XG4gICAgICAgICAgICAgICAgdGlsZVJlbmRlclN0YXRlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzZWdtZW50czogbmV3IFNlZ21lbnRWZWN0b3IoW3NlZ21lbnRdKSxcbiAgICAgICAgICAgICAgICAgICAgc29ydEtleTogKChzZWdtZW50LnNvcnRLZXk6IGFueSk6IG51bWJlciksXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxlUmVuZGVyU3RhdGUucHVzaCh7XG4gICAgICAgICAgICAgICAgc2VnbWVudHM6IGJ1ZmZlcnMuc2VnbWVudHMsXG4gICAgICAgICAgICAgICAgc29ydEtleTogMCxcbiAgICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc29ydEZlYXR1cmVzQnlLZXkpIHtcbiAgICAgICAgdGlsZVJlbmRlclN0YXRlLnNvcnQoKGEsIGIpID0+IGEuc29ydEtleSAtIGIuc29ydEtleSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzZWdtZW50U3RhdGUgb2YgdGlsZVJlbmRlclN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gc2VnbWVudFN0YXRlLnN0YXRlO1xuICAgICAgICBpZiAocGFpbnRlci50ZXJyYWluKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHVzZURlcHRoRm9yT2NjbHVzaW9uOiAhaXNHbG9iZVByb2plY3Rpb24sXG4gICAgICAgICAgICAgICAgbGFiZWxQbGFuZU1hdHJpeEludjogc3RhdGUubGFiZWxQbGFuZU1hdHJpeEludlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHBhaW50ZXIudGVycmFpbi5zZXR1cEVsZXZhdGlvbkRyYXcoc3RhdGUudGlsZSwgc3RhdGUucHJvZ3JhbSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgIHN0YXRlLmF0bGFzVGV4dHVyZS5iaW5kKHN0YXRlLmF0bGFzSW50ZXJwb2xhdGlvbiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGlmIChzdGF0ZS5hdGxhc1RleHR1cmVJY29uKSB7XG4gICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUxKTtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5hdGxhc1RleHR1cmVJY29uKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuYXRsYXNUZXh0dXJlSWNvbi5iaW5kKHN0YXRlLmF0bGFzSW50ZXJwb2xhdGlvbkljb24sIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlLmlzU0RGKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gKChzdGF0ZS51bmlmb3JtVmFsdWVzOiBhbnkpOiBVbmlmb3JtVmFsdWVzPFN5bWJvbFNERlVuaWZvcm1zVHlwZT4pO1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhhc0hhbG8pIHtcbiAgICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzWyd1X2lzX2hhbG8nXSA9IDE7XG4gICAgICAgICAgICAgICAgZHJhd1N5bWJvbEVsZW1lbnRzKHN0YXRlLmJ1ZmZlcnMsIHNlZ21lbnRTdGF0ZS5zZWdtZW50cywgbGF5ZXIsIHBhaW50ZXIsIHN0YXRlLnByb2dyYW0sIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgdW5pZm9ybVZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzWyd1X2lzX2hhbG8nXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZHJhd1N5bWJvbEVsZW1lbnRzKHN0YXRlLmJ1ZmZlcnMsIHNlZ21lbnRTdGF0ZS5zZWdtZW50cywgbGF5ZXIsIHBhaW50ZXIsIHN0YXRlLnByb2dyYW0sIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgc3RhdGUudW5pZm9ybVZhbHVlcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3U3ltYm9sRWxlbWVudHMoYnVmZmVycywgc2VnbWVudHMsIGxheWVyLCBwYWludGVyLCBwcm9ncmFtLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHVuaWZvcm1WYWx1ZXMpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgdW5pZm9ybVZhbHVlcywgbGF5ZXIuaWQsIGJ1ZmZlcnMubGF5b3V0VmVydGV4QnVmZmVyLFxuICAgICAgICBidWZmZXJzLmluZGV4QnVmZmVyLCBzZWdtZW50cywgbGF5ZXIucGFpbnQsXG4gICAgICAgIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sIGJ1ZmZlcnMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCksXG4gICAgICAgIGJ1ZmZlcnMuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlciwgYnVmZmVycy5vcGFjaXR5VmVydGV4QnVmZmVyKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IFByb2dyYW0gZnJvbSAnLi9wcm9ncmFtLmpzJztcbmltcG9ydCB7Y2lyY2xlVW5pZm9ybVZhbHVlcywgY2lyY2xlRGVmaW5lc1ZhbHVlc30gZnJvbSAnLi9wcm9ncmFtL2NpcmNsZV9wcm9ncmFtLmpzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudC5qcyc7XG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBDaXJjbGVTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBDaXJjbGVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBQcm9ncmFtQ29uZmlndXJhdGlvbiBmcm9tICcuLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXN9IGZyb20gJy4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIHtDaXJjbGVVbmlmb3Jtc1R5cGV9IGZyb20gJy4vcHJvZ3JhbS9jaXJjbGVfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB0eXBlIHtEeW5hbWljRGVmaW5lc1R5cGV9IGZyb20gJy4vcHJvZ3JhbS9wcm9ncmFtX3VuaWZvcm1zLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0NpcmNsZXM7XG5cbnR5cGUgVGlsZVJlbmRlclN0YXRlID0ge1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uOiBQcm9ncmFtQ29uZmlndXJhdGlvbixcbiAgICBwcm9ncmFtOiBQcm9ncmFtPCo+LFxuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyLFxuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcixcbiAgICB1bmlmb3JtVmFsdWVzOiBVbmlmb3JtVmFsdWVzPENpcmNsZVVuaWZvcm1zVHlwZT4sXG4gICAgdGlsZTogVGlsZVxufTtcblxudHlwZSBTZWdtZW50c1RpbGVSZW5kZXJTdGF0ZSA9IHtcbiAgICBzZWdtZW50czogU2VnbWVudFZlY3RvcixcbiAgICBzb3J0S2V5OiBudW1iZXIsXG4gICAgc3RhdGU6IFRpbGVSZW5kZXJTdGF0ZVxufTtcblxuZnVuY3Rpb24gZHJhd0NpcmNsZXMocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogQ2lyY2xlU3R5bGVMYXllciwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgIT09ICd0cmFuc2x1Y2VudCcpIHJldHVybjtcblxuICAgIGNvbnN0IG9wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2NpcmNsZS1vcGFjaXR5Jyk7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBsYXllci5wYWludC5nZXQoJ2NpcmNsZS1zdHJva2Utd2lkdGgnKTtcbiAgICBjb25zdCBzdHJva2VPcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtc3Ryb2tlLW9wYWNpdHknKTtcbiAgICBjb25zdCBzb3J0RmVhdHVyZXNCeUtleSA9IGxheWVyLmxheW91dC5nZXQoJ2NpcmNsZS1zb3J0LWtleScpLmNvbnN0YW50T3IoMSkgIT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChvcGFjaXR5LmNvbnN0YW50T3IoMSkgPT09IDAgJiYgKHN0cm9rZVdpZHRoLmNvbnN0YW50T3IoMSkgPT09IDAgfHwgc3Ryb2tlT3BhY2l0eS5jb25zdGFudE9yKDEpID09PSAwKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgLy8gVHVybiBvZmYgc3RlbmNpbCB0ZXN0aW5nIHRvIGFsbG93IGNpcmNsZXMgdG8gYmUgZHJhd24gYWNyb3NzIGJvdW5kYXJpZXMsXG4gICAgLy8gc28gdGhhdCBsYXJnZSBjaXJjbGVzIGFyZSBub3QgY2xpcHBlZCB0byB0aWxlc1xuICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG5cbiAgICBjb25zdCBzZWdtZW50c1JlbmRlclN0YXRlczogQXJyYXk8U2VnbWVudHNUaWxlUmVuZGVyU3RhdGU+ID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjb29yZCA9IGNvb3Jkc1tpXTtcblxuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldDogP0NpcmNsZUJ1Y2tldDwqPiA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcbiAgICAgICAgY29uc3QgZGVmaW5lc1ZhbHVlcyA9IGNpcmNsZURlZmluZXNWYWx1ZXMobGF5ZXIpO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdjaXJjbGUnLCBwcm9ncmFtQ29uZmlndXJhdGlvbiwgKChkZWZpbmVzVmFsdWVzOiBhbnkpOiBEeW5hbWljRGVmaW5lc1R5cGVbXSkpO1xuICAgICAgICBjb25zdCBsYXlvdXRWZXJ0ZXhCdWZmZXIgPSBidWNrZXQubGF5b3V0VmVydGV4QnVmZmVyO1xuICAgICAgICBjb25zdCBpbmRleEJ1ZmZlciA9IGJ1Y2tldC5pbmRleEJ1ZmZlcjtcbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGNpcmNsZVVuaWZvcm1WYWx1ZXMocGFpbnRlciwgY29vcmQsIHRpbGUsIGxheWVyKTtcblxuICAgICAgICBjb25zdCBzdGF0ZTogVGlsZVJlbmRlclN0YXRlID0ge1xuICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBwcm9ncmFtLFxuICAgICAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLFxuICAgICAgICAgICAgaW5kZXhCdWZmZXIsXG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzLFxuICAgICAgICAgICAgdGlsZVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChzb3J0RmVhdHVyZXNCeUtleSkge1xuICAgICAgICAgICAgY29uc3Qgb2xkU2VnbWVudHMgPSBidWNrZXQuc2VnbWVudHMuZ2V0KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygb2xkU2VnbWVudHMpIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50c1JlbmRlclN0YXRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VnbWVudHM6IG5ldyBTZWdtZW50VmVjdG9yKFtzZWdtZW50XSksXG4gICAgICAgICAgICAgICAgICAgIHNvcnRLZXk6ICgoc2VnbWVudC5zb3J0S2V5OiBhbnkpOiBudW1iZXIpLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VnbWVudHNSZW5kZXJTdGF0ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgc2VnbWVudHM6IGJ1Y2tldC5zZWdtZW50cyxcbiAgICAgICAgICAgICAgICBzb3J0S2V5OiAwLFxuICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgaWYgKHNvcnRGZWF0dXJlc0J5S2V5KSB7XG4gICAgICAgIHNlZ21lbnRzUmVuZGVyU3RhdGVzLnNvcnQoKGEsIGIpID0+IGEuc29ydEtleSAtIGIuc29ydEtleSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNHbG9iZVByb2plY3Rpb24gPSBwYWludGVyLnRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZSc7XG4gICAgY29uc3QgdGVycmFpbk9wdGlvbnMgPSB7dXNlRGVwdGhGb3JPY2NsdXNpb246ICFpc0dsb2JlUHJvamVjdGlvbn07XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnRzU3RhdGUgb2Ygc2VnbWVudHNSZW5kZXJTdGF0ZXMpIHtcbiAgICAgICAgY29uc3Qge3Byb2dyYW1Db25maWd1cmF0aW9uLCBwcm9ncmFtLCBsYXlvdXRWZXJ0ZXhCdWZmZXIsIGluZGV4QnVmZmVyLCB1bmlmb3JtVmFsdWVzLCB0aWxlfSA9IHNlZ21lbnRzU3RhdGUuc3RhdGU7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gc2VnbWVudHNTdGF0ZS5zZWdtZW50cztcblxuICAgICAgICBpZiAocGFpbnRlci50ZXJyYWluKSBwYWludGVyLnRlcnJhaW4uc2V0dXBFbGV2YXRpb25EcmF3KHRpbGUsIHByb2dyYW0sIHRlcnJhaW5PcHRpb25zKTtcblxuICAgICAgICBwYWludGVyLnByZXBhcmVEcmF3UHJvZ3JhbShjb250ZXh0LCBwcm9ncmFtLCB0aWxlLnRpbGVJRC50b1Vud3JhcHBlZCgpKTtcblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLFxuICAgICAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLCBpbmRleEJ1ZmZlciwgc2VnbWVudHMsXG4gICAgICAgICAgICBsYXllci5wYWludCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZS5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZS5qcyc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZS5qcyc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlLmpzJztcbmltcG9ydCB7XG4gICAgaGVhdG1hcFVuaWZvcm1WYWx1ZXMsXG4gICAgaGVhdG1hcFRleHR1cmVVbmlmb3JtVmFsdWVzXG59IGZyb20gJy4vcHJvZ3JhbS9oZWF0bWFwX3Byb2dyYW0uanMnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlLmpzJztcbmltcG9ydCB0eXBlIEhlYXRtYXBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgSGVhdG1hcEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9oZWF0bWFwX2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBkcmF3SGVhdG1hcDtcblxuZnVuY3Rpb24gZHJhd0hlYXRtYXAocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogSGVhdG1hcFN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdoZWF0bWFwLW9wYWNpdHknKSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ29mZnNjcmVlbicpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIC8vIEFsbG93IGtlcm5lbHMgdG8gYmUgZHJhd24gYWNyb3NzIGJvdW5kYXJpZXMsIHNvIHRoYXRcbiAgICAgICAgLy8gbGFyZ2Uga2VybmVscyBhcmUgbm90IGNsaXBwZWQgdG8gdGlsZXNcbiAgICAgICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICAgICAgLy8gVHVybiBvbiBhZGRpdGl2ZSBibGVuZGluZyBmb3Iga2VybmVscywgd2hpY2ggaXMgYSBrZXkgYXNwZWN0IG9mIGtlcm5lbCBkZW5zaXR5IGVzdGltYXRpb24gZm9ybXVsYVxuICAgICAgICBjb25zdCBjb2xvck1vZGUgPSBuZXcgQ29sb3JNb2RlKFtnbC5PTkUsIGdsLk9ORV0sIENvbG9yLnRyYW5zcGFyZW50LCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuXG4gICAgICAgIGJpbmRGcmFtZWJ1ZmZlcihjb250ZXh0LCBwYWludGVyLCBsYXllcik7XG5cbiAgICAgICAgY29udGV4dC5jbGVhcih7Y29sb3I6IENvbG9yLnRyYW5zcGFyZW50fSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRpbGVzIHRoYXQgaGF2ZSB1bmNvdmVyZWQgcGFyZW50cyB0byBhdm9pZCBmbGlja2VyaW5nOyB3ZSBkb24ndCBuZWVkXG4gICAgICAgICAgICAvLyB0byB1c2UgY29tcGxleCB0aWxlIG1hc2tpbmcgaGVyZSBiZWNhdXNlIHRoZSBjaGFuZ2UgYmV0d2VlbiB6b29tIGxldmVscyBpcyBzdWJ0bGUsXG4gICAgICAgICAgICAvLyBzbyBpdCdzIGZpbmUgdG8gc2ltcGx5IHJlbmRlciB0aGUgcGFyZW50IHVudGlsIGFsbCBpdHMgNCBjaGlsZHJlbiBhcmUgbG9hZGVkXG4gICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUuaGFzUmVuZGVyYWJsZVBhcmVudChjb29yZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQ6ID9IZWF0bWFwQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCk7XG4gICAgICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdoZWF0bWFwJywgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICAgICAgY29uc3Qge3pvb219ID0gcGFpbnRlci50cmFuc2Zvcm07XG4gICAgICAgICAgICBpZiAocGFpbnRlci50ZXJyYWluKSBwYWludGVyLnRlcnJhaW4uc2V0dXBFbGV2YXRpb25EcmF3KHRpbGUsIHByb2dyYW0pO1xuXG4gICAgICAgICAgICBwYWludGVyLnByZXBhcmVEcmF3UHJvZ3JhbShjb250ZXh0LCBwcm9ncmFtLCBjb29yZC50b1Vud3JhcHBlZCgpKTtcblxuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgRGVwdGhNb2RlLmRpc2FibGVkLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgaGVhdG1hcFVuaWZvcm1WYWx1ZXMoY29vcmQucHJvak1hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgdGlsZSwgem9vbSwgbGF5ZXIucGFpbnQuZ2V0KCdoZWF0bWFwLWludGVuc2l0eScpKSxcbiAgICAgICAgICAgICAgICBsYXllci5pZCwgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlciwgYnVja2V0LmluZGV4QnVmZmVyLFxuICAgICAgICAgICAgICAgIGJ1Y2tldC5zZWdtZW50cywgbGF5ZXIucGFpbnQsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sXG4gICAgICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHBhaW50ZXIud2lkdGgsIHBhaW50ZXIuaGVpZ2h0XSk7XG5cbiAgICB9IGVsc2UgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ3RyYW5zbHVjZW50Jykge1xuICAgICAgICBwYWludGVyLmNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcbiAgICAgICAgcmVuZGVyVGV4dHVyZVRvTWFwKHBhaW50ZXIsIGxheWVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRGcmFtZWJ1ZmZlcihjb250ZXh0LCBwYWludGVyLCBsYXllcikge1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUxKTtcblxuICAgIC8vIFVzZSBhIDR4IGRvd25zY2FsZWQgc2NyZWVuIHRleHR1cmUgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCBwYWludGVyLndpZHRoIC8gNCwgcGFpbnRlci5oZWlnaHQgLyA0XSk7XG5cbiAgICBsZXQgZmJvID0gbGF5ZXIuaGVhdG1hcEZibztcblxuICAgIGlmICghZmJvKSB7XG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcblxuICAgICAgICBmYm8gPSBsYXllci5oZWF0bWFwRmJvID0gY29udGV4dC5jcmVhdGVGcmFtZWJ1ZmZlcihwYWludGVyLndpZHRoIC8gNCwgcGFpbnRlci5oZWlnaHQgLyA0LCBmYWxzZSk7XG5cbiAgICAgICAgYmluZFRleHR1cmVUb0ZyYW1lYnVmZmVyKGNvbnRleHQsIHBhaW50ZXIsIHRleHR1cmUsIGZibyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBmYm8uY29sb3JBdHRhY2htZW50LmdldCgpKTtcbiAgICAgICAgY29udGV4dC5iaW5kRnJhbWVidWZmZXIuc2V0KGZiby5mcmFtZWJ1ZmZlcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBiaW5kVGV4dHVyZVRvRnJhbWVidWZmZXIoY29udGV4dCwgcGFpbnRlciwgdGV4dHVyZSwgZmJvKSB7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIC8vIFVzZSB0aGUgaGlnaGVyIHByZWNpc2lvbiBoYWxmLWZsb2F0IHRleHR1cmUgd2hlcmUgYXZhaWxhYmxlIChwcm9kdWNpbmcgbXVjaCBzbW9vdGhlciBsb29raW5nIGhlYXRtYXBzKTtcbiAgICAvLyBPdGhlcndpc2UsIGZhbGwgYmFjayB0byBhIGxvdyBwcmVjaXNpb24gdGV4dHVyZVxuICAgIGNvbnN0IGludGVybmFsRm9ybWF0ID0gY29udGV4dC5leHRSZW5kZXJUb1RleHR1cmVIYWxmRmxvYXQgPyBjb250ZXh0LmV4dFRleHR1cmVIYWxmRmxvYXQuSEFMRl9GTE9BVF9PRVMgOiBnbC5VTlNJR05FRF9CWVRFO1xuICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgcGFpbnRlci53aWR0aCAvIDQsIHBhaW50ZXIuaGVpZ2h0IC8gNCwgMCwgZ2wuUkdCQSwgaW50ZXJuYWxGb3JtYXQsIG51bGwpO1xuICAgIGZiby5jb2xvckF0dGFjaG1lbnQuc2V0KHRleHR1cmUpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJUZXh0dXJlVG9NYXAocGFpbnRlciwgbGF5ZXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIC8vIEhlcmUgd2UgYmluZCB0d28gZGlmZmVyZW50IHRleHR1cmVzIGZyb20gd2hpY2ggd2UnbGwgc2FtcGxlIGluIGRyYXdpbmdcbiAgICAvLyBoZWF0bWFwczogdGhlIGtlcm5lbCB0ZXh0dXJlLCBwcmVwYXJlZCBpbiB0aGUgb2Zmc2NyZWVuIHBhc3MsIGFuZCBhXG4gICAgLy8gY29sb3IgcmFtcCB0ZXh0dXJlLlxuICAgIGNvbnN0IGZibyA9IGxheWVyLmhlYXRtYXBGYm87XG4gICAgaWYgKCFmYm8pIHJldHVybjtcbiAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBmYm8uY29sb3JBdHRhY2htZW50LmdldCgpKTtcblxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTEpO1xuICAgIGxldCBjb2xvclJhbXBUZXh0dXJlID0gbGF5ZXIuY29sb3JSYW1wVGV4dHVyZTtcbiAgICBpZiAoIWNvbG9yUmFtcFRleHR1cmUpIHtcbiAgICAgICAgY29sb3JSYW1wVGV4dHVyZSA9IGxheWVyLmNvbG9yUmFtcFRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCBsYXllci5jb2xvclJhbXAsIGdsLlJHQkEpO1xuICAgIH1cbiAgICBjb2xvclJhbXBUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgIHBhaW50ZXIudXNlUHJvZ3JhbSgnaGVhdG1hcFRleHR1cmUnKS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUyxcbiAgICAgICAgRGVwdGhNb2RlLmRpc2FibGVkLCBTdGVuY2lsTW9kZS5kaXNhYmxlZCwgcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCksIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgaGVhdG1hcFRleHR1cmVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIGxheWVyLCAwLCAxKSxcbiAgICAgICAgbGF5ZXIuaWQsIHBhaW50ZXIudmlld3BvcnRCdWZmZXIsIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsXG4gICAgICAgIHBhaW50ZXIudmlld3BvcnRTZWdtZW50cywgbGF5ZXIucGFpbnQsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZS5qcyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUuanMnO1xuaW1wb3J0IHtcbiAgICBsaW5lVW5pZm9ybVZhbHVlcyxcbiAgICBsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMsXG4gICAgbGluZURlZmluZXNWYWx1ZXNcbn0gZnJvbSAnLi9wcm9ncmFtL2xpbmVfcHJvZ3JhbS5qcyc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMnO1xuaW1wb3J0IHR5cGUgTGluZVN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBMaW5lQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7RHluYW1pY0RlZmluZXNUeXBlfSBmcm9tICcuL3Byb2dyYW0vcHJvZ3JhbV91bmlmb3Jtcy5qcyc7XG5pbXBvcnQge2NsYW1wLCBuZXh0UG93ZXJPZlR3b30gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7cmVuZGVyQ29sb3JSYW1wfSBmcm9tICcuLi91dGlsL2NvbG9yX3JhbXAuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRyYXdMaW5lKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IExpbmVTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnbGluZS1vcGFjaXR5Jyk7XG4gICAgY29uc3Qgd2lkdGggPSBsYXllci5wYWludC5nZXQoJ2xpbmUtd2lkdGgnKTtcbiAgICBpZiAob3BhY2l0eS5jb25zdGFudE9yKDEpID09PSAwIHx8IHdpZHRoLmNvbnN0YW50T3IoMSkgPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KTtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcblxuICAgIGNvbnN0IGRhc2hhcnJheVByb3BlcnR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLWRhc2hhcnJheScpO1xuICAgIGNvbnN0IGRhc2hhcnJheSA9IGRhc2hhcnJheVByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuICAgIGNvbnN0IGNhcFByb3BlcnR5ID0gbGF5ZXIubGF5b3V0LmdldCgnbGluZS1jYXAnKTtcbiAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHkgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtcGF0dGVybicpO1xuICAgIGNvbnN0IGltYWdlID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuXG4gICAgY29uc3QgZ3JhZGllbnQgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtZ3JhZGllbnQnKTtcbiAgICBjb25zdCBjcm9zc2ZhZGUgPSBsYXllci5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk7XG5cbiAgICBjb25zdCBwcm9ncmFtSWQgPSBpbWFnZSA/ICdsaW5lUGF0dGVybicgOiAnbGluZSc7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGNvbnN0IGRlZmluZXNWYWx1ZXMgPSBsaW5lRGVmaW5lc1ZhbHVlcyhsYXllcik7XG4gICAgbGV0IHVzZVN0ZW5jaWxNYXNrUmVuZGVyUGFzcyA9IGRlZmluZXNWYWx1ZXMuaW5jbHVkZXMoJ1JFTkRFUl9MSU5FX0FMUEhBX0RJU0NBUkQnKTtcbiAgICBpZiAocGFpbnRlci50ZXJyYWluICYmIHBhaW50ZXIudGVycmFpbi5jbGlwT3JNYXNrT3ZlcmxhcFN0ZW5jaWxUeXBlKCkpIHtcbiAgICAgICAgdXNlU3RlbmNpbE1hc2tSZW5kZXJQYXNzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBpZiAoaW1hZ2UgJiYgIXRpbGUucGF0dGVybnNMb2FkZWQoKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgYnVja2V0OiA/TGluZUJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1RpbGUoY29vcmQpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKHByb2dyYW1JZCwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24sICgoZGVmaW5lc1ZhbHVlczogYW55KTogRHluYW1pY0RlZmluZXNUeXBlW10pKTtcblxuICAgICAgICBjb25zdCBjb25zdGFudFBhdHRlcm4gPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcihudWxsKTtcbiAgICAgICAgaWYgKGNvbnN0YW50UGF0dGVybiAmJiB0aWxlLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0bGFzID0gdGlsZS5pbWFnZUF0bGFzO1xuICAgICAgICAgICAgY29uc3QgcG9zVG8gPSBhdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi50by50b1N0cmluZygpXTtcbiAgICAgICAgICAgIGNvbnN0IHBvc0Zyb20gPSBhdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi5mcm9tLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgaWYgKHBvc1RvICYmIHBvc0Zyb20pIHByb2dyYW1Db25maWd1cmF0aW9uLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbywgcG9zRnJvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25zdGFudERhc2ggPSBkYXNoYXJyYXlQcm9wZXJ0eS5jb25zdGFudE9yKG51bGwpO1xuICAgICAgICBjb25zdCBjb25zdGFudENhcCA9IGNhcFByb3BlcnR5LmNvbnN0YW50T3IoKG51bGw6IGFueSkpO1xuXG4gICAgICAgIGlmICghaW1hZ2UgJiYgY29uc3RhbnREYXNoICYmIGNvbnN0YW50Q2FwICYmIHRpbGUubGluZUF0bGFzKSB7XG4gICAgICAgICAgICBjb25zdCBhdGxhcyA9IHRpbGUubGluZUF0bGFzO1xuICAgICAgICAgICAgY29uc3QgcG9zVG8gPSBhdGxhcy5nZXREYXNoKGNvbnN0YW50RGFzaC50bywgY29uc3RhbnRDYXApO1xuICAgICAgICAgICAgY29uc3QgcG9zRnJvbSA9IGF0bGFzLmdldERhc2goY29uc3RhbnREYXNoLmZyb20sIGNvbnN0YW50Q2FwKTtcbiAgICAgICAgICAgIGlmIChwb3NUbyAmJiBwb3NGcm9tKSBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG8sIHBvc0Zyb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF0cml4ID0gcGFpbnRlci50ZXJyYWluID8gY29vcmQucHJvak1hdHJpeCA6IG51bGw7XG4gICAgICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSBpbWFnZSA/XG4gICAgICAgICAgICBsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGNyb3NzZmFkZSwgbWF0cml4KSA6XG4gICAgICAgICAgICBsaW5lVW5pZm9ybVZhbHVlcyhwYWludGVyLCB0aWxlLCBsYXllciwgY3Jvc3NmYWRlLCBtYXRyaXgsIGJ1Y2tldC5saW5lQ2xpcHNBcnJheS5sZW5ndGgpO1xuXG4gICAgICAgIGlmIChncmFkaWVudCkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJHcmFkaWVudCA9IGJ1Y2tldC5ncmFkaWVudHNbbGF5ZXIuaWRdO1xuICAgICAgICAgICAgbGV0IGdyYWRpZW50VGV4dHVyZSA9IGxheWVyR3JhZGllbnQudGV4dHVyZTtcbiAgICAgICAgICAgIGlmIChsYXllci5ncmFkaWVudFZlcnNpb24gIT09IGxheWVyR3JhZGllbnQudmVyc2lvbikge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlUmVzb2x1dGlvbiA9IDI1NjtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuc3RlcEludGVycG9sYW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU1heFpvb20gPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5tYXh6b29tO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3RlbnRpYWxPdmVyem9vbSA9IGNvb3JkLmNhbm9uaWNhbC56ID09PSBzb3VyY2VNYXhab29tID9cbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY2VpbCgxIDw8IChwYWludGVyLnRyYW5zZm9ybS5tYXhab29tIC0gY29vcmQuY2Fub25pY2FsLnopKSA6IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSBidWNrZXQubWF4TGluZUxlbmd0aCAvIEVYVEVOVDtcbiAgICAgICAgICAgICAgICAgICAgLy8gTG9naWNhbCBwaXhlbCB0aWxlIHNpemUgaXMgNTEycHgsIGFuZCAxMDI0cHggcmlnaHQgYmVmb3JlIGN1cnJlbnQgem9vbSArIDFcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4VGlsZVBpeGVsU2l6ZSA9IDEwMjQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1heGltdW0gcG9zc2libGUgdGV4dHVyZSBjb3ZlcmFnZSBoZXVyaXN0aWMsIGJvdW5kIGJ5IGhhcmR3YXJlIG1heCB0ZXh0dXJlIHNpemVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4VGV4dHVyZUNvdmVyYWdlID0gbGluZUxlbmd0aCAqIG1heFRpbGVQaXhlbFNpemUgKiBwb3RlbnRpYWxPdmVyem9vbTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZVJlc29sdXRpb24gPSBjbGFtcChuZXh0UG93ZXJPZlR3byhtYXhUZXh0dXJlQ292ZXJhZ2UpLCAyNTYsIGNvbnRleHQubWF4VGV4dHVyZVNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXllckdyYWRpZW50LmdyYWRpZW50ID0gcmVuZGVyQ29sb3JSYW1wKHtcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogbGF5ZXIuZ3JhZGllbnRFeHByZXNzaW9uKCksXG4gICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb25LZXk6ICdsaW5lUHJvZ3Jlc3MnLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uOiB0ZXh0dXJlUmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IGxheWVyR3JhZGllbnQuZ3JhZGllbnQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBjbGlwczogYnVja2V0LmxpbmVDbGlwc0FycmF5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGxheWVyR3JhZGllbnQudGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBsYXllckdyYWRpZW50LnRleHR1cmUudXBkYXRlKGxheWVyR3JhZGllbnQuZ3JhZGllbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyR3JhZGllbnQudGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIGxheWVyR3JhZGllbnQuZ3JhZGllbnQsIGdsLlJHQkEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXllckdyYWRpZW50LnZlcnNpb24gPSBsYXllci5ncmFkaWVudFZlcnNpb247XG4gICAgICAgICAgICAgICAgZ3JhZGllbnRUZXh0dXJlID0gbGF5ZXJHcmFkaWVudC50ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMSk7XG4gICAgICAgICAgICBncmFkaWVudFRleHR1cmUuYmluZChsYXllci5zdGVwSW50ZXJwb2xhbnQgPyBnbC5ORUFSRVNUIDogZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGFzaGFycmF5KSB7XG4gICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIHRpbGUubGluZUF0bGFzVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuUkVQRUFUKTtcbiAgICAgICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uLnVwZGF0ZVBhaW50QnVmZmVycyhjcm9zc2ZhZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgICAgICB0aWxlLmltYWdlQXRsYXNUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uLnVwZGF0ZVBhaW50QnVmZmVycyhjcm9zc2ZhZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgY29uc3QgcmVuZGVyTGluZSA9IChzdGVuY2lsTW9kZSkgPT4ge1xuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLFxuICAgICAgICAgICAgICAgIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCwgdW5pZm9ybVZhbHVlcyxcbiAgICAgICAgICAgICAgICBsYXllci5pZCwgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlciwgYnVja2V0LmluZGV4QnVmZmVyLCBidWNrZXQuc2VnbWVudHMsXG4gICAgICAgICAgICAgICAgbGF5ZXIucGFpbnQsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sIHByb2dyYW1Db25maWd1cmF0aW9uLCBidWNrZXQubGF5b3V0VmVydGV4QnVmZmVyMik7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHVzZVN0ZW5jaWxNYXNrUmVuZGVyUGFzcykge1xuICAgICAgICAgICAgY29uc3Qgc3RlbmNpbElkID0gcGFpbnRlci5zdGVuY2lsTW9kZUZvckNsaXBwaW5nKGNvb3JkKS5yZWY7XG4gICAgICAgICAgICAvLyBXaGVuIHRlcnJhaW4gaXMgb24sIGVuc3VyZSB0aGF0IHRoZSBzdGVuY2lsIGJ1ZmZlciBoYXMgMCB2YWx1ZXMuXG4gICAgICAgICAgICAvLyBBcyBzdGVuY2lsIG1heSBiZSBkaXNhYmxlZCB3aGVuIGl0IGlzIG5vdCBpbiBvdmVybGFwcGluZyBzdGVuY2lsXG4gICAgICAgICAgICAvLyBtb2RlLiBSZWZlciB0byBzdGVuY2lsTW9kZUZvclJUVE92ZXJsYXAgbG9naWMuXG4gICAgICAgICAgICBpZiAoc3RlbmNpbElkID09PSAwICYmIHBhaW50ZXIudGVycmFpbikge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY2xlYXIoe3N0ZW5jaWw6IDB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHN0ZW5jaWxGdW5jID0ge2Z1bmM6IGdsLkVRVUFMLCBtYXNrOiAweEZGfTtcblxuICAgICAgICAgICAgLy8gQWxsb3cgbGluZSBnZW9tZXRyeSBmcmFnbWVudCB0byBiZSBkcmF3biBvbmx5IG9uY2U6XG4gICAgICAgICAgICAvLyAtIEludmVydCB0aGUgc3RlbmNpbCBpZGVudGlmaWVyIGxlZnQgYnkgc3RlbmNpbCBjbGlwcGluZywgdGhpc1xuICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGFyZSBub3QgY29uZmxpY3Rpbmcgd2l0aCBuZWlnaGJvcmhpbmcgdGlsZXMuXG4gICAgICAgICAgICAvLyAtIERyYXcgQW50aS1BbGlhc2VkIHBpeGVscyB3aXRoIGEgdGhyZXNob2xkIHNldCB0byAwLjgsIHRoaXNcbiAgICAgICAgICAgIC8vIG1heSBkcmF3IEFudGktQWxpYXNlZCBwaXhlbHMgbW9yZSB0aGFuIG9uY2UsIGJ1dCBkdWUgdG8gdGhlaXJcbiAgICAgICAgICAgIC8vIGxvdyBvcGFjaXR5LCB0aGVzZSBwaXhlbHMgYXJlIHVzdWFsbHkgaW52aXNpYmxlIGFuZCBwb3RlbnRpYWxcbiAgICAgICAgICAgIC8vIG92ZXJsYXBwaW5nIHBpeGVsIGFydGlmYWN0cyBsb2NhbGx5IG1pbmltaXplZC5cbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXNbJ3VfYWxwaGFfZGlzY2FyZF90aHJlc2hvbGQnXSA9IDAuODtcbiAgICAgICAgICAgIHJlbmRlckxpbmUobmV3IFN0ZW5jaWxNb2RlKHN0ZW5jaWxGdW5jLCBzdGVuY2lsSWQsIDB4RkYsIGdsLktFRVAsIGdsLktFRVAsIGdsLklOVkVSVCkpO1xuICAgICAgICAgICAgdW5pZm9ybVZhbHVlc1sndV9hbHBoYV9kaXNjYXJkX3RocmVzaG9sZCddID0gMC4wO1xuICAgICAgICAgICAgcmVuZGVyTGluZShuZXcgU3RlbmNpbE1vZGUoc3RlbmNpbEZ1bmMsIHN0ZW5jaWxJZCwgMHhGRiwgZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuS0VFUCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyTGluZShwYWludGVyLnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcoY29vcmQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoZW4gcmVuZGVyaW5nIHRvIHN0ZW5jaWwsIHJlc2V0IHRoZSBtYXNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0aWxlXG4gICAgLy8gY2xpcHBpbmcgcmV2ZXJ0cyB0aGUgc3RlbmNpbCBtYXNrIHdlIG1heSBoYXZlIGRyYXduIGluIHRoZSBidWZmZXIuXG4gICAgLy8gVGhlIHN0YW1wIGNvdWxkIGJlIHJldmVydGVkIGJ5IGFuIGV4dHJhIGRyYXcgY2FsbCBvZiBsaW5lIGdlb21ldHJ5LFxuICAgIC8vIGJ1dCB0aWxlIGNsaXBwaW5nIGRyYXdpbmcgaXMgdXN1YWxseSBmYXN0ZXIgdG8gZHJhdyB0aGFuIGxpbmVzLlxuICAgIGlmICh1c2VTdGVuY2lsTWFza1JlbmRlclBhc3MpIHtcbiAgICAgICAgcGFpbnRlci5yZXNldFN0ZW5jaWxDbGlwcGluZ01hc2tzKCk7XG4gICAgICAgIGlmIChwYWludGVyLnRlcnJhaW4pIHsgY29udGV4dC5jbGVhcih7c3RlbmNpbDogMH0pOyB9XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUuanMnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZS5qcyc7XG5pbXBvcnQge1xuICAgIGZpbGxVbmlmb3JtVmFsdWVzLFxuICAgIGZpbGxQYXR0ZXJuVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsT3V0bGluZVVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlc1xufSBmcm9tICcuL3Byb2dyYW0vZmlsbF9wcm9ncmFtLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBGaWxsU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIEZpbGxCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvZmlsbF9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0ZpbGw7XG5cbmZ1bmN0aW9uIGRyYXdGaWxsKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IEZpbGxTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtY29sb3InKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLW9wYWNpdHknKTtcblxuICAgIGlmIChvcGFjaXR5LmNvbnN0YW50T3IoMSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuXG4gICAgY29uc3QgcGF0dGVybiA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1wYXR0ZXJuJyk7XG4gICAgY29uc3QgcGFzcyA9IHBhaW50ZXIub3BhcXVlUGFzc0VuYWJsZWRGb3JMYXllcigpICYmXG4gICAgICAgICghcGF0dGVybi5jb25zdGFudE9yKCgxOiBhbnkpKSAmJlxuICAgICAgICBjb2xvci5jb25zdGFudE9yKENvbG9yLnRyYW5zcGFyZW50KS5hID09PSAxICYmXG4gICAgICAgIG9wYWNpdHkuY29uc3RhbnRPcigwKSA9PT0gMSkgPyAnb3BhcXVlJyA6ICd0cmFuc2x1Y2VudCc7XG5cbiAgICAvLyBEcmF3IGZpbGxcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSBwYXNzKSB7XG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoXG4gICAgICAgICAgICAxLCBwYWludGVyLnJlbmRlclBhc3MgPT09ICdvcGFxdWUnID8gRGVwdGhNb2RlLlJlYWRXcml0ZSA6IERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgICAgIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gRHJhdyBzdHJva2VcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnICYmIGxheWVyLnBhaW50LmdldCgnZmlsbC1hbnRpYWxpYXMnKSkge1xuXG4gICAgICAgIC8vIElmIHdlIGRlZmluZWQgYSBkaWZmZXJlbnQgY29sb3IgZm9yIHRoZSBmaWxsIG91dGxpbmUsIHdlIGFyZVxuICAgICAgICAvLyBnb2luZyB0byBpZ25vcmUgdGhlIGJpdHMgaW4gMHgwNyBhbmQganVzdCBjYXJlIGFib3V0IHRoZSBnbG9iYWxcbiAgICAgICAgLy8gY2xpcHBpbmcgbWFzay5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBvbmx5IHdhbnQgdG8gZHJhd0ZpbGwgdGhlIGFudGlhbGlhc2VkIHBhcnRzIHRoYXQgYXJlXG4gICAgICAgIC8vICpvdXRzaWRlKiB0aGUgY3VycmVudCBzaGFwZS4gVGhpcyBpcyBpbXBvcnRhbnQgaW4gY2FzZSB0aGUgZmlsbFxuICAgICAgICAvLyBvciBzdHJva2UgY29sb3IgaXMgdHJhbnNsdWNlbnQuIElmIHdlIHdvdWxkbid0IGNsaXAgdG8gb3V0c2lkZVxuICAgICAgICAvLyB0aGUgY3VycmVudCBzaGFwZSwgc29tZSBwaXhlbHMgZnJvbSB0aGUgb3V0bGluZSBzdHJva2Ugb3ZlcmxhcHBlZFxuICAgICAgICAvLyB0aGUgKG5vbi1hbnRpYWxpYXNlZCkgZmlsbC5cbiAgICAgICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcihcbiAgICAgICAgICAgIGxheWVyLmdldFBhaW50UHJvcGVydHkoJ2ZpbGwtb3V0bGluZS1jb2xvcicpID8gMiA6IDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgICAgIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCB0cnVlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCBpc091dGxpbmUpIHtcbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuY29udGV4dC5nbDtcblxuICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eSA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1wYXR0ZXJuJyk7XG4gICAgY29uc3QgaW1hZ2UgPSBwYXR0ZXJuUHJvcGVydHkgJiYgcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuICAgIGNvbnN0IGNyb3NzZmFkZSA9IGxheWVyLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtcbiAgICBsZXQgZHJhd01vZGUsIHByb2dyYW1OYW1lLCB1bmlmb3JtVmFsdWVzLCBpbmRleEJ1ZmZlciwgc2VnbWVudHM7XG5cbiAgICBpZiAoIWlzT3V0bGluZSkge1xuICAgICAgICBwcm9ncmFtTmFtZSA9IGltYWdlID8gJ2ZpbGxQYXR0ZXJuJyA6ICdmaWxsJztcbiAgICAgICAgZHJhd01vZGUgPSBnbC5UUklBTkdMRVM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbU5hbWUgPSBpbWFnZSAmJiAhbGF5ZXIuZ2V0UGFpbnRQcm9wZXJ0eSgnZmlsbC1vdXRsaW5lLWNvbG9yJykgPyAnZmlsbE91dGxpbmVQYXR0ZXJuJyA6ICdmaWxsT3V0bGluZSc7XG4gICAgICAgIGRyYXdNb2RlID0gZ2wuTElORVM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBpZiAoaW1hZ2UgJiYgIXRpbGUucGF0dGVybnNMb2FkZWQoKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgYnVja2V0OiA/RmlsbEJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1RpbGUoY29vcmQpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKHByb2dyYW1OYW1lLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG5cbiAgICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgICAgICBwYWludGVyLmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICAgICAgdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbi51cGRhdGVQYWludEJ1ZmZlcnMoY3Jvc3NmYWRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnN0YW50UGF0dGVybiA9IHBhdHRlcm5Qcm9wZXJ0eS5jb25zdGFudE9yKG51bGwpO1xuICAgICAgICBpZiAoY29uc3RhbnRQYXR0ZXJuICYmIHRpbGUuaW1hZ2VBdGxhcykge1xuICAgICAgICAgICAgY29uc3QgYXRsYXMgPSB0aWxlLmltYWdlQXRsYXM7XG4gICAgICAgICAgICBjb25zdCBwb3NUbyA9IGF0bGFzLnBhdHRlcm5Qb3NpdGlvbnNbY29uc3RhbnRQYXR0ZXJuLnRvLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgY29uc3QgcG9zRnJvbSA9IGF0bGFzLnBhdHRlcm5Qb3NpdGlvbnNbY29uc3RhbnRQYXR0ZXJuLmZyb20udG9TdHJpbmcoKV07XG4gICAgICAgICAgICBpZiAocG9zVG8gJiYgcG9zRnJvbSkgcHJvZ3JhbUNvbmZpZ3VyYXRpb24uc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHBvc1RvLCBwb3NGcm9tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbGVNYXRyaXggPSBwYWludGVyLnRyYW5zbGF0ZVBvc01hdHJpeChjb29yZC5wcm9qTWF0cml4LCB0aWxlLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLXRyYW5zbGF0ZScpLCBsYXllci5wYWludC5nZXQoJ2ZpbGwtdHJhbnNsYXRlLWFuY2hvcicpKTtcblxuICAgICAgICBpZiAoIWlzT3V0bGluZSkge1xuICAgICAgICAgICAgaW5kZXhCdWZmZXIgPSBidWNrZXQuaW5kZXhCdWZmZXI7XG4gICAgICAgICAgICBzZWdtZW50cyA9IGJ1Y2tldC5zZWdtZW50cztcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMgPSBpbWFnZSA/XG4gICAgICAgICAgICAgICAgZmlsbFBhdHRlcm5Vbmlmb3JtVmFsdWVzKHRpbGVNYXRyaXgsIHBhaW50ZXIsIGNyb3NzZmFkZSwgdGlsZSkgOlxuICAgICAgICAgICAgICAgIGZpbGxVbmlmb3JtVmFsdWVzKHRpbGVNYXRyaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5kZXhCdWZmZXIgPSBidWNrZXQuaW5kZXhCdWZmZXIyO1xuICAgICAgICAgICAgc2VnbWVudHMgPSBidWNrZXQuc2VnbWVudHMyO1xuICAgICAgICAgICAgY29uc3QgZHJhd2luZ0J1ZmZlclNpemUgPSAocGFpbnRlci50ZXJyYWluICYmIHBhaW50ZXIudGVycmFpbi5yZW5kZXJpbmdUb1RleHR1cmUpID8gcGFpbnRlci50ZXJyYWluLmRyYXBlQnVmZmVyU2l6ZSA6IFtnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHRdO1xuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcyA9IChwcm9ncmFtTmFtZSA9PT0gJ2ZpbGxPdXRsaW5lUGF0dGVybicgJiYgaW1hZ2UpID9cbiAgICAgICAgICAgICAgICBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtVmFsdWVzKHRpbGVNYXRyaXgsIHBhaW50ZXIsIGNyb3NzZmFkZSwgdGlsZSwgZHJhd2luZ0J1ZmZlclNpemUpIDpcbiAgICAgICAgICAgICAgICBmaWxsT3V0bGluZVVuaWZvcm1WYWx1ZXModGlsZU1hdHJpeCwgZHJhd2luZ0J1ZmZlclNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0ocGFpbnRlci5jb250ZXh0LCBwcm9ncmFtLCBjb29yZC50b1Vud3JhcHBlZCgpKTtcblxuICAgICAgICBwcm9ncmFtLmRyYXcocGFpbnRlci5jb250ZXh0LCBkcmF3TW9kZSwgZGVwdGhNb2RlLFxuICAgICAgICAgICAgcGFpbnRlci5zdGVuY2lsTW9kZUZvckNsaXBwaW5nKGNvb3JkKSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsIHVuaWZvcm1WYWx1ZXMsXG4gICAgICAgICAgICBsYXllci5pZCwgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlciwgaW5kZXhCdWZmZXIsIHNlZ21lbnRzLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUuanMnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZS5qcyc7XG5pbXBvcnQgQ29sb3JNb2RlIGZyb20gJy4uL2dsL2NvbG9yX21vZGUuanMnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZS5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50LmpzJztcbmltcG9ydCB7XG4gICAgZmlsbEV4dHJ1c2lvblVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtVmFsdWVzLFxufSBmcm9tICcuL3Byb2dyYW0vZmlsbF9leHRydXNpb25fcHJvZ3JhbS5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXc7XG5cbmZ1bmN0aW9uIGRyYXcocGFpbnRlcjogUGFpbnRlciwgc291cmNlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IEZpbGxFeHRydXNpb25TdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tb3BhY2l0eScpO1xuICAgIGlmIChvcGFjaXR5ID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnKSB7XG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IG5ldyBEZXB0aE1vZGUocGFpbnRlci5jb250ZXh0LmdsLkxFUVVBTCwgRGVwdGhNb2RlLlJlYWRXcml0ZSwgcGFpbnRlci5kZXB0aFJhbmdlRm9yM0QpO1xuXG4gICAgICAgIGlmIChvcGFjaXR5ID09PSAxICYmICFsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXBhdHRlcm4nKS5jb25zdGFudE9yKCgxOiBhbnkpKSkge1xuICAgICAgICAgICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG4gICAgICAgICAgICBkcmF3RXh0cnVzaW9uVGlsZXMocGFpbnRlciwgc291cmNlLCBsYXllciwgY29vcmRzLCBkZXB0aE1vZGUsIFN0ZW5jaWxNb2RlLmRpc2FibGVkLCBjb2xvck1vZGUpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEcmF3IHRyYW5zcGFyZW50IGJ1aWxkaW5ncyBpbiB0d28gcGFzc2VzIHNvIHRoYXQgb25seSB0aGUgY2xvc2VzdCBzdXJmYWNlIGlzIGRyYXduLlxuICAgICAgICAgICAgLy8gRmlyc3QgZHJhdyBhbGwgdGhlIGV4dHJ1c2lvbnMgaW50byBvbmx5IHRoZSBkZXB0aCBidWZmZXIuIE5vIGNvbG9ycyBhcmUgZHJhd24uXG4gICAgICAgICAgICBkcmF3RXh0cnVzaW9uVGlsZXMocGFpbnRlciwgc291cmNlLCBsYXllciwgY29vcmRzLCBkZXB0aE1vZGUsXG4gICAgICAgICAgICAgICAgU3RlbmNpbE1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgQ29sb3JNb2RlLmRpc2FibGVkKTtcblxuICAgICAgICAgICAgLy8gVGhlbiBkcmF3IGFsbCB0aGUgZXh0cnVzaW9ucyBhIHNlY29uZCB0eXBlLCBvbmx5IGNvbG9yaW5nIGZyYWdtZW50cyBpZiB0aGV5IGhhdmUgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGRlcHRoIHZhbHVlIGFzIHRoZSBjbG9zZXN0IGZyYWdtZW50IGluIHRoZSBwcmV2aW91cyBwYXNzLiBVc2UgdGhlIHN0ZW5jaWwgYnVmZmVyXG4gICAgICAgICAgICAvLyB0byBwcmV2ZW50IHRoZSBzZWNvbmQgZHJhdyBpbiBjYXNlcyB3aGVyZSB3ZSBoYXZlIGNvaW5jaWRlbnQgcG9seWdvbnMuXG4gICAgICAgICAgICBkcmF3RXh0cnVzaW9uVGlsZXMocGFpbnRlciwgc291cmNlLCBsYXllciwgY29vcmRzLCBkZXB0aE1vZGUsXG4gICAgICAgICAgICAgICAgcGFpbnRlci5zdGVuY2lsTW9kZUZvcjNEKCksXG4gICAgICAgICAgICAgICAgcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCkpO1xuXG4gICAgICAgICAgICBwYWludGVyLnJlc2V0U3RlbmNpbENsaXBwaW5nTWFza3MoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd0V4dHJ1c2lvblRpbGVzKHBhaW50ZXIsIHNvdXJjZSwgbGF5ZXIsIGNvb3JkcywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgcGF0dGVyblByb3BlcnR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuJyk7XG4gICAgY29uc3QgaW1hZ2UgPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcigoMTogYW55KSk7XG4gICAgY29uc3QgY3Jvc3NmYWRlID0gbGF5ZXIuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpO1xuICAgIGNvbnN0IG9wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLW9wYWNpdHknKTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2UuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldDogP0ZpbGxFeHRydXNpb25CdWNrZXQgPSAodGlsZS5nZXRCdWNrZXQobGF5ZXIpOiBhbnkpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCk7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oaW1hZ2UgPyAnZmlsbEV4dHJ1c2lvblBhdHRlcm4nIDogJ2ZpbGxFeHRydXNpb24nLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG5cbiAgICAgICAgaWYgKHBhaW50ZXIudGVycmFpbikge1xuICAgICAgICAgICAgY29uc3QgdGVycmFpbiA9IHBhaW50ZXIudGVycmFpbjtcbiAgICAgICAgICAgIGlmICghYnVja2V0LmVuYWJsZVRlcnJhaW4pIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGVycmFpbi5zZXR1cEVsZXZhdGlvbkRyYXcodGlsZSwgcHJvZ3JhbSwge3VzZU1ldGVyVG9EZW06IHRydWV9KTtcbiAgICAgICAgICAgIGZsYXRSb29mc1VwZGF0ZShjb250ZXh0LCBzb3VyY2UsIGNvb3JkLCBidWNrZXQsIGxheWVyLCB0ZXJyYWluKTtcbiAgICAgICAgICAgIGlmICghYnVja2V0LmNlbnRyb2lkVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckluZGV4OiBudW1iZXIgfCB2b2lkID0gcHJvZ3JhbS5hdHRyaWJ1dGVzWydhX2NlbnRyb2lkX3BvcyddO1xuICAgICAgICAgICAgICAgIGlmIChhdHRySW5kZXggIT09IHVuZGVmaW5lZCkgZ2wudmVydGV4QXR0cmliMmYoYXR0ckluZGV4LCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgcGFpbnRlci5jb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24udXBkYXRlUGFpbnRCdWZmZXJzKGNyb3NzZmFkZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uc3RhbnRQYXR0ZXJuID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IobnVsbCk7XG4gICAgICAgIGlmIChjb25zdGFudFBhdHRlcm4gJiYgdGlsZS5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICBjb25zdCBhdGxhcyA9IHRpbGUuaW1hZ2VBdGxhcztcbiAgICAgICAgICAgIGNvbnN0IHBvc1RvID0gYXRsYXMucGF0dGVyblBvc2l0aW9uc1tjb25zdGFudFBhdHRlcm4udG8udG9TdHJpbmcoKV07XG4gICAgICAgICAgICBjb25zdCBwb3NGcm9tID0gYXRsYXMucGF0dGVyblBvc2l0aW9uc1tjb25zdGFudFBhdHRlcm4uZnJvbS50b1N0cmluZygpXTtcbiAgICAgICAgICAgIGlmIChwb3NUbyAmJiBwb3NGcm9tKSBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG8sIHBvc0Zyb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoXG4gICAgICAgICAgICBjb29yZC5wcm9qTWF0cml4LFxuICAgICAgICAgICAgdGlsZSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tdHJhbnNsYXRlJyksXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3InKSk7XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkVXNlVmVydGljYWxHcmFkaWVudCA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tdmVydGljYWwtZ3JhZGllbnQnKTtcbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGltYWdlID9cbiAgICAgICAgICAgIGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybVZhbHVlcyhtYXRyaXgsIHBhaW50ZXIsIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsIG9wYWNpdHksIGNvb3JkLCBjcm9zc2ZhZGUsIHRpbGUpIDpcbiAgICAgICAgICAgIGZpbGxFeHRydXNpb25Vbmlmb3JtVmFsdWVzKG1hdHJpeCwgcGFpbnRlciwgc2hvdWxkVXNlVmVydGljYWxHcmFkaWVudCwgb3BhY2l0eSk7XG5cbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGNvbnRleHQuZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5iYWNrQ0NXLFxuICAgICAgICAgICAgdW5pZm9ybVZhbHVlcywgbGF5ZXIuaWQsIGJ1Y2tldC5sYXlvdXRWZXJ0ZXhCdWZmZXIsIGJ1Y2tldC5pbmRleEJ1ZmZlcixcbiAgICAgICAgICAgIGJ1Y2tldC5zZWdtZW50cywgbGF5ZXIucGFpbnQsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sXG4gICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbiwgcGFpbnRlci50ZXJyYWluID8gYnVja2V0LmNlbnRyb2lkVmVydGV4QnVmZmVyIDogbnVsbCk7XG4gICAgfVxufVxuXG4vLyBGbGF0IHJvb2ZzIGFycmF5IGlzIHByZXBhcmVkIGluIHRoZSBidWNrZXQsIGV4Y2VwdCBmb3IgYnVpbGRpbmdzIHRoYXQgYXJlIG9uIHRpbGUgYm9yZGVycy5cbi8vIEZvciB0aGVtLCBqb2luIHBpZWNlcywgY2FsY3VsYXRlIGpvaW5lZCBzaXplIGhlcmUsIGFuZCB0aGVuIHVwbG9hZCBkYXRhLlxuZnVuY3Rpb24gZmxhdFJvb2ZzVXBkYXRlKGNvbnRleHQsIHNvdXJjZSwgY29vcmQsIGJ1Y2tldCwgbGF5ZXIsIHRlcnJhaW4pIHtcbiAgICAvLyBGb3IgYWxsIGZvdXIgYm9yZGVyczogMCAtIGxlZnQsIDEsIHJpZ2h0LCAyIC0gdG9wLCAzIC0gYm90dG9tXG4gICAgY29uc3QgbmVpZ2hib3JDb29yZCA9IFtcbiAgICAgICAgY29vcmQgPT4ge1xuICAgICAgICAgICAgbGV0IHggPSBjb29yZC5jYW5vbmljYWwueCAtIDE7XG4gICAgICAgICAgICBsZXQgdyA9IGNvb3JkLndyYXA7XG4gICAgICAgICAgICBpZiAoeCA8IDApIHtcbiAgICAgICAgICAgICAgICB4ID0gKDEgPDwgY29vcmQuY2Fub25pY2FsLnopIC0gMTtcbiAgICAgICAgICAgICAgICB3LS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJzY2FsZWRUaWxlSUQoY29vcmQub3ZlcnNjYWxlZFosIHcsIGNvb3JkLmNhbm9uaWNhbC56LCB4LCBjb29yZC5jYW5vbmljYWwueSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvb3JkID0+IHtcbiAgICAgICAgICAgIGxldCB4ID0gY29vcmQuY2Fub25pY2FsLnggKyAxO1xuICAgICAgICAgICAgbGV0IHcgPSBjb29yZC53cmFwO1xuICAgICAgICAgICAgaWYgKHggPT09IDEgPDwgY29vcmQuY2Fub25pY2FsLnopIHtcbiAgICAgICAgICAgICAgICB4ID0gMDtcbiAgICAgICAgICAgICAgICB3Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJzY2FsZWRUaWxlSUQoY29vcmQub3ZlcnNjYWxlZFosIHcsIGNvb3JkLmNhbm9uaWNhbC56LCB4LCBjb29yZC5jYW5vbmljYWwueSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvb3JkID0+IG5ldyBPdmVyc2NhbGVkVGlsZUlEKGNvb3JkLm92ZXJzY2FsZWRaLCBjb29yZC53cmFwLCBjb29yZC5jYW5vbmljYWwueiwgY29vcmQuY2Fub25pY2FsLngsXG4gICAgICAgICAgICAoY29vcmQuY2Fub25pY2FsLnkgPT09IDAgPyAxIDw8IGNvb3JkLmNhbm9uaWNhbC56IDogY29vcmQuY2Fub25pY2FsLnkpIC0gMSksXG4gICAgICAgIGNvb3JkID0+IG5ldyBPdmVyc2NhbGVkVGlsZUlEKGNvb3JkLm92ZXJzY2FsZWRaLCBjb29yZC53cmFwLCBjb29yZC5jYW5vbmljYWwueiwgY29vcmQuY2Fub25pY2FsLngsXG4gICAgICAgICAgICBjb29yZC5jYW5vbmljYWwueSA9PT0gKDEgPDwgY29vcmQuY2Fub25pY2FsLnopIC0gMSA/IDAgOiBjb29yZC5jYW5vbmljYWwueSArIDEpXG4gICAgXTtcblxuICAgIGNvbnN0IGdldExvYWRlZEJ1Y2tldCA9IChuaWQpID0+IHtcbiAgICAgICAgY29uc3QgbWF4em9vbSA9IHNvdXJjZS5nZXRTb3VyY2UoKS5tYXh6b29tO1xuICAgICAgICBjb25zdCBnZXRCdWNrZXQgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gc291cmNlLmdldFRpbGVCeUlEKGtleSk7XG4gICAgICAgICAgICBpZiAobiAmJiBuLmhhc0RhdGEoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuLmdldEJ1Y2tldChsYXllcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIEluIG92ZXJzY2FsZSByYW5nZSwgd2UgbG9vayBvbmUgdGlsZSB6b29tIGFib3ZlIGFuZCB1bmRlci4gV2UgZG8gdGhpcyB0byBhdm9pZFxuICAgICAgICAvLyBmbGlja2VyaW5nIGFuZCB1c2UgdGhlIGNvbnRlbnQgaW4gWi0xIGFuZCBaKzEgYnVja2V0cyB1bnRpbCBaIGJ1Y2tldCBpcyBsb2FkZWQuXG4gICAgICAgIGxldCBiMCwgYjEsIGIyO1xuICAgICAgICBpZiAobmlkLm92ZXJzY2FsZWRaID09PSBuaWQuY2Fub25pY2FsLnogfHwgbmlkLm92ZXJzY2FsZWRaID49IG1heHpvb20pXG4gICAgICAgICAgICBiMCA9IGdldEJ1Y2tldChuaWQua2V5KTtcbiAgICAgICAgaWYgKG5pZC5vdmVyc2NhbGVkWiA+PSBtYXh6b29tKVxuICAgICAgICAgICAgYjEgPSBnZXRCdWNrZXQobmlkLmNhbGN1bGF0ZVNjYWxlZEtleShuaWQub3ZlcnNjYWxlZFogKyAxKSk7XG4gICAgICAgIGlmIChuaWQub3ZlcnNjYWxlZFogPiBtYXh6b29tKVxuICAgICAgICAgICAgYjIgPSBnZXRCdWNrZXQobmlkLmNhbGN1bGF0ZVNjYWxlZEtleShuaWQub3ZlcnNjYWxlZFogLSAxKSk7XG4gICAgICAgIHJldHVybiBiMCB8fCBiMSB8fCBiMjtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvamVjdGVkVG9Cb3JkZXIgPSBbMCwgMCwgMF07IC8vIFttaW4sIG1heCwgbWF4T2Zmc2V0RnJvbUJvcmRlcl1cbiAgICBjb25zdCB4am9pbiA9IChhLCBiKSA9PiB7XG4gICAgICAgIHByb2plY3RlZFRvQm9yZGVyWzBdID0gTWF0aC5taW4oYS5taW4ueSwgYi5taW4ueSk7XG4gICAgICAgIHByb2plY3RlZFRvQm9yZGVyWzFdID0gTWF0aC5tYXgoYS5tYXgueSwgYi5tYXgueSk7XG4gICAgICAgIHByb2plY3RlZFRvQm9yZGVyWzJdID0gRVhURU5UIC0gYi5taW4ueCA+IGEubWF4LnggPyBiLm1pbi54IC0gRVhURU5UIDogYS5tYXgueDtcbiAgICAgICAgcmV0dXJuIHByb2plY3RlZFRvQm9yZGVyO1xuICAgIH07XG4gICAgY29uc3QgeWpvaW4gPSAoYSwgYikgPT4ge1xuICAgICAgICBwcm9qZWN0ZWRUb0JvcmRlclswXSA9IE1hdGgubWluKGEubWluLngsIGIubWluLngpO1xuICAgICAgICBwcm9qZWN0ZWRUb0JvcmRlclsxXSA9IE1hdGgubWF4KGEubWF4LngsIGIubWF4LngpO1xuICAgICAgICBwcm9qZWN0ZWRUb0JvcmRlclsyXSA9IEVYVEVOVCAtIGIubWluLnkgPiBhLm1heC55ID8gYi5taW4ueSAtIEVYVEVOVCA6IGEubWF4Lnk7XG4gICAgICAgIHJldHVybiBwcm9qZWN0ZWRUb0JvcmRlcjtcbiAgICB9O1xuICAgIGNvbnN0IHByb2plY3RDb21iaW5lZFNwYW5Ub0JvcmRlciA9IFtcbiAgICAgICAgKGEsIGIpID0+IHhqb2luKGEsIGIpLFxuICAgICAgICAoYSwgYikgPT4geGpvaW4oYiwgYSksXG4gICAgICAgIChhLCBiKSA9PiB5am9pbihhLCBiKSxcbiAgICAgICAgKGEsIGIpID0+IHlqb2luKGIsIGEpXG4gICAgXTtcblxuICAgIGNvbnN0IGNlbnRyb2lkID0gbmV3IFBvaW50KDAsIDApO1xuICAgIGNvbnN0IGVycm9yID0gMzsgLy8gQWxsb3cgaW50cnVzaW9uIG9mIGEgYnVpbGRpbmcgdG8gdGhlIGJ1aWxkaW5nIHdpdGggYWRqYWNlbnQgd2FsbC5cblxuICAgIGxldCBkZW1UaWxlLCBuZWlnaGJvckRFTVRpbGUsIG5laWdoYm9yVGlsZUlEO1xuXG4gICAgY29uc3QgZmxhdEJhc2UgPSAobWluLCBtYXgsIGVkZ2UsIHZlcnRpY2FsRWRnZSwgbWF4T2Zmc2V0RnJvbUJvcmRlcikgPT4ge1xuICAgICAgICBjb25zdCBwb2ludHMgPSBbW3ZlcnRpY2FsRWRnZSA/IGVkZ2UgOiBtaW4sIHZlcnRpY2FsRWRnZSA/IG1pbiA6IGVkZ2UsIDBdLCBbdmVydGljYWxFZGdlID8gZWRnZSA6IG1heCwgdmVydGljYWxFZGdlID8gbWF4IDogZWRnZSwgMF1dO1xuXG4gICAgICAgIGNvbnN0IGNvb3JkMyA9IG1heE9mZnNldEZyb21Cb3JkZXIgPCAwID8gRVhURU5UICsgbWF4T2Zmc2V0RnJvbUJvcmRlciA6IG1heE9mZnNldEZyb21Cb3JkZXI7XG4gICAgICAgIGNvbnN0IHRoaXJkUG9pbnQgPSBbdmVydGljYWxFZGdlID8gY29vcmQzIDogKG1pbiArIG1heCkgLyAyLCB2ZXJ0aWNhbEVkZ2UgPyAobWluICsgbWF4KSAvIDIgOiBjb29yZDMsIDBdO1xuICAgICAgICBpZiAoKGVkZ2UgPT09IDAgJiYgbWF4T2Zmc2V0RnJvbUJvcmRlciA8IDApIHx8IChlZGdlICE9PSAwICYmIG1heE9mZnNldEZyb21Cb3JkZXIgPiAwKSkge1xuICAgICAgICAgICAgLy8gVGhpcmQgcG9pbnQgaXMgaW5zaWRlIG5laWdoYm9yIHRpbGUsIG5vdCBpbiB0aGUgfGNvb3JkfCB0aWxlLlxuICAgICAgICAgICAgdGVycmFpbi5nZXRGb3JUaWxlUG9pbnRzKG5laWdoYm9yVGlsZUlELCBbdGhpcmRQb2ludF0sIHRydWUsIG5laWdoYm9yREVNVGlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb2ludHMucHVzaCh0aGlyZFBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICB0ZXJyYWluLmdldEZvclRpbGVQb2ludHMoY29vcmQsIHBvaW50cywgdHJ1ZSwgZGVtVGlsZSk7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChwb2ludHNbMF1bMl0sIHBvaW50c1sxXVsyXSwgdGhpcmRQb2ludFsyXSkgLyB0ZXJyYWluLmV4YWdnZXJhdGlvbigpO1xuICAgIH07XG5cbiAgICAvLyBQcm9jZXNzIGFsbCBmb3VyIGJvcmRlcnM6IGdldCBuZWlnaGJvcmluZyB0aWxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgLy8gU29ydCBieSBib3JkZXIgaW50ZXJzZWN0aW9uIGFyZWEgbWluaW11bXMsIGFzY2VuZGluZy5cbiAgICAgICAgY29uc3QgYSA9IGJ1Y2tldC5ib3JkZXJzW2ldO1xuICAgICAgICBpZiAoYS5sZW5ndGggPT09IDApIHsgYnVja2V0LmJvcmRlckRvbmVbaV0gPSB0cnVlOyB9XG4gICAgICAgIGlmIChidWNrZXQuYm9yZGVyRG9uZVtpXSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG5pZCA9IG5laWdoYm9yVGlsZUlEID0gbmVpZ2hib3JDb29yZFtpXShjb29yZCk7XG4gICAgICAgIGNvbnN0IG5CdWNrZXQ6ID9GaWxsRXh0cnVzaW9uQnVja2V0ID0gZ2V0TG9hZGVkQnVja2V0KG5pZCk7XG4gICAgICAgIGlmICghbkJ1Y2tldCB8fCAhbkJ1Y2tldC5lbmFibGVUZXJyYWluKSBjb250aW51ZTtcblxuICAgICAgICBuZWlnaGJvckRFTVRpbGUgPSB0ZXJyYWluLmZpbmRERU1UaWxlRm9yKG5pZCk7XG4gICAgICAgIGlmICghbmVpZ2hib3JERU1UaWxlIHx8ICFuZWlnaGJvckRFTVRpbGUuZGVtKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFkZW1UaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkZW0gPSB0ZXJyYWluLmZpbmRERU1UaWxlRm9yKGNvb3JkKTtcbiAgICAgICAgICAgIGlmICghKGRlbSAmJiBkZW0uZGVtKSkgcmV0dXJuOyAvLyBkZWZlciB1cGRhdGUgdW50aWwgYW4gZWxldmF0aW9uIHRpbGUgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgZGVtVGlsZSA9IGRlbTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBqID0gKGkgPCAyID8gMSA6IDUpIC0gaTtcbiAgICAgICAgY29uc3QgYiA9IG5CdWNrZXQuYm9yZGVyc1tqXTtcbiAgICAgICAgbGV0IGliID0gMDtcbiAgICAgICAgZm9yIChsZXQgaWEgPSAwOyBpYSA8IGEubGVuZ3RoOyBpYSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0YSA9IGJ1Y2tldC5mZWF0dXJlc09uQm9yZGVyW2FbaWFdXTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRBQm9yZGVyUmFuZ2UgPSBwYXJ0YS5ib3JkZXJzW2ldO1xuICAgICAgICAgICAgLy8gRmluZCBhbGwgbkJ1Y2tldCBwYXJ0cyB0aGF0IHNoYXJlIHRoZSBib3JkZXIgb3ZlcmxhcC5cbiAgICAgICAgICAgIGxldCBwYXJ0YjtcbiAgICAgICAgICAgIHdoaWxlIChpYiA8IGIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gUGFzcyBhbGwgdGhhdCBhcmUgYmVmb3JlIHRoZSBvdmVybGFwLlxuICAgICAgICAgICAgICAgIHBhcnRiID0gbkJ1Y2tldC5mZWF0dXJlc09uQm9yZGVyW2JbaWJdXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0QkJvcmRlclJhbmdlID0gcGFydGIuYm9yZGVyc1tqXTtcbiAgICAgICAgICAgICAgICBpZiAocGFydEJCb3JkZXJSYW5nZVsxXSA+IHBhcnRBQm9yZGVyUmFuZ2VbMF0gKyBlcnJvcikgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKCFuQnVja2V0LmJvcmRlckRvbmVbal0pIG5CdWNrZXQuZW5jb2RlQ2VudHJvaWQodW5kZWZpbmVkLCBwYXJ0YiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGliKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFydGIgJiYgaWIgPCBiLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNhdmVJYiA9IGliO1xuICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29sbGVjdCBhbGwgcGFydHMgb3ZlcmxhcHBpbmcgcGFydGEgb24gdGhlIGVkZ2UsIHRvIG1ha2Ugc3VyZSBpdCBpcyBvbmx5IG9uZS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydEJCb3JkZXJSYW5nZSA9IHBhcnRiLmJvcmRlcnNbal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0QkJvcmRlclJhbmdlWzBdID4gcGFydEFCb3JkZXJSYW5nZVsxXSAtIGVycm9yKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCsraWIgPT09IGIubGVuZ3RoKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgcGFydGIgPSBuQnVja2V0LmZlYXR1cmVzT25Cb3JkZXJbYltpYl1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJ0YiA9IG5CdWNrZXQuZmVhdHVyZXNPbkJvcmRlcltiW3NhdmVJYl1dO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgYW55IG9mIGEgb3IgYiBjcm9zc2VzIG1vcmUgdGhhbiBvbmUgdGlsZSBlZGdlLCBkb24ndCBzdXBwb3J0IGZsYXQgcm9vZi5cbiAgICAgICAgICAgICAgICBpZiAocGFydGEuaW50ZXJzZWN0c0NvdW50KCkgPiAxIHx8IHBhcnRiLmludGVyc2VjdHNDb3VudCgpID4gMSB8fCBjb3VudCAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGliID0gc2F2ZUliOyAvLyByZXdpbmQgdW5wcm9jZXNzZWQgaWIgc28gdGhhdCBpdCBpcyBwcm9jZXNzZWQgYWdhaW4gZm9yIHRoZSBuZXh0IGlhLlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LmVuY29kZUNlbnRyb2lkKHVuZGVmaW5lZCwgcGFydGEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuQnVja2V0LmJvcmRlckRvbmVbal0pIG5CdWNrZXQuZW5jb2RlQ2VudHJvaWQodW5kZWZpbmVkLCBwYXJ0YiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBOb3cgd2UgaGF2ZSAxLTEgbWF0Y2hpbmcgb2YgcGFydHMgaW4gYm90aCB0aWxlcyB0aGF0IHNoYXJlIHRoZSBlZGdlLiBDYWxjdWxhdGUgZmxhdCBiYXNlIGVsZXZhdGlvblxuICAgICAgICAgICAgICAgIC8vIGFzIGF2ZXJhZ2Ugb2YgdGhyZWUgcG9pbnRzOiAyIGFyZSBlZGdlIHBvaW50cyAoY29tYmluZWQgc3BhbiBwcm9qZWN0ZWQgdG8gYm9yZGVyKSBhbmQgb25lIGlzIHBvaW50IG9mXG4gICAgICAgICAgICAgICAgLy8gc3BhbiB0aGF0IGhhcyBtYXhpbXVtIG9mZnNldCB0byBib3JkZXIuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3BhbiA9IHByb2plY3RDb21iaW5lZFNwYW5Ub0JvcmRlcltpXShwYXJ0YSwgcGFydGIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2UgPSAoaSAlIDIpID8gRVhURU5UIC0gMSA6IDA7XG4gICAgICAgICAgICAgICAgY2VudHJvaWQueCA9IGZsYXRCYXNlKHNwYW5bMF0sIE1hdGgubWluKEVYVEVOVCAtIDEsIHNwYW5bMV0pLCBlZGdlLCBpIDwgMiwgc3BhblsyXSk7XG4gICAgICAgICAgICAgICAgY2VudHJvaWQueSA9IDA7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHBhcnRhLnZlcnRleEFycmF5T2Zmc2V0ICE9PSB1bmRlZmluZWQgJiYgcGFydGEudmVydGV4QXJyYXlPZmZzZXQgPCBidWNrZXQubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBidWNrZXQuZW5jb2RlQ2VudHJvaWQoY2VudHJvaWQsIHBhcnRhLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICBhc3NlcnQocGFydGIudmVydGV4QXJyYXlPZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBwYXJ0Yi52ZXJ0ZXhBcnJheU9mZnNldCA8IG5CdWNrZXQubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5CdWNrZXQuYm9yZGVyRG9uZVtqXSkgbkJ1Y2tldC5lbmNvZGVDZW50cm9pZChjZW50cm9pZCwgcGFydGIsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHBhcnRhLmludGVyc2VjdHNDb3VudCgpID4gMSB8fCAocGFydGIgJiYgcGFydGIuaW50ZXJzZWN0c0NvdW50KCkgPiAxKSk7IC8vIGV4cGVjdGVkIGF0IHRoZSBlbmQgb2YgYm9yZGVyLCB3aGVuIGJ1aWxkaW5ncyBjb3ZlciBjb3JuZXIgKHNob3cgYnVpbGRpbmcgdy9vIGZsYXQgcm9vZikuXG4gICAgICAgICAgICAgICAgYnVja2V0LmVuY29kZUNlbnRyb2lkKHVuZGVmaW5lZCwgcGFydGEsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1Y2tldC5ib3JkZXJEb25lW2ldID0gYnVja2V0Lm5lZWRzQ2VudHJvaWRVcGRhdGUgPSB0cnVlO1xuICAgICAgICBpZiAoIW5CdWNrZXQuYm9yZGVyRG9uZVtqXSkge1xuICAgICAgICAgICAgbkJ1Y2tldC5ib3JkZXJEb25lW2pdID0gbkJ1Y2tldC5uZWVkc0NlbnRyb2lkVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChidWNrZXQubmVlZHNDZW50cm9pZFVwZGF0ZSB8fCAoIWJ1Y2tldC5jZW50cm9pZFZlcnRleEJ1ZmZlciAmJiBidWNrZXQuY2VudHJvaWRWZXJ0ZXhBcnJheS5sZW5ndGggIT09IDApKSB7XG4gICAgICAgIGJ1Y2tldC51cGxvYWRDZW50cm9pZChjb250ZXh0KTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgSW1hZ2VTb3VyY2UgZnJvbSAnLi4vc291cmNlL2ltYWdlX3NvdXJjZS5qcyc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZS5qcyc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlLmpzJztcbmltcG9ydCB7cmFzdGVyVW5pZm9ybVZhbHVlc30gZnJvbSAnLi9wcm9ncmFtL3Jhc3Rlcl9wcm9ncmFtLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBSYXN0ZXJTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3Jhc3Rlcl9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHJhc3RlckZhZGUgZnJvbSAnLi9yYXN0ZXJfZmFkZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdSYXN0ZXI7XG5cbmZ1bmN0aW9uIGRyYXdSYXN0ZXIocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogUmFzdGVyU3R5bGVMYXllciwgdGlsZUlEczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4sIHZhcmlhYmxlT2Zmc2V0czogYW55LCBpc0luaXRpYWxMb2FkOiBib29sZWFuKSB7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuICAgIGlmIChsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1vcGFjaXR5JykgPT09IDApIHJldHVybjtcbiAgICBpZiAoIXRpbGVJRHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdyYXN0ZXInKTtcblxuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuXG4gICAgLy8gV2hlbiByZW5kZXJpbmcgdG8gdGV4dHVyZSwgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgc29ydGVkOiBwcmltYXJ5IGJ5XG4gICAgLy8gcHJveHkgaWQgYW5kIHNlY29uZGFyeSBzb3J0IGlzIGJ5IFouXG4gICAgY29uc3QgcmVuZGVyaW5nVG9UZXh0dXJlID0gcGFpbnRlci50ZXJyYWluICYmIHBhaW50ZXIudGVycmFpbi5yZW5kZXJpbmdUb1RleHR1cmU7XG5cbiAgICBjb25zdCBbc3RlbmNpbE1vZGVzLCBjb29yZHNdID0gc291cmNlIGluc3RhbmNlb2YgSW1hZ2VTb3VyY2UgfHwgcmVuZGVyaW5nVG9UZXh0dXJlID8gW3t9LCB0aWxlSURzXSA6XG4gICAgICAgIHBhaW50ZXIuc3RlbmNpbENvbmZpZ0Zvck92ZXJsYXAodGlsZUlEcyk7XG5cbiAgICBjb25zdCBtaW5UaWxlWiA9IGNvb3Jkc1tjb29yZHMubGVuZ3RoIC0gMV0ub3ZlcnNjYWxlZFo7XG5cbiAgICBjb25zdCBhbGlnbiA9ICFwYWludGVyLm9wdGlvbnMubW92aW5nO1xuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIC8vIFNldCB0aGUgbG93ZXIgem9vbSBsZXZlbCB0byBzdWJsYXllciAwLCBhbmQgaGlnaGVyIHpvb20gbGV2ZWxzIHRvIGhpZ2hlciBzdWJsYXllcnNcbiAgICAgICAgLy8gVXNlIGdsLkxFU1MgdG8gcHJldmVudCBkb3VibGUgZHJhd2luZyBpbiBhcmVhcyB3aGVyZSB0aWxlcyBvdmVybGFwLlxuICAgICAgICBjb25zdCBkZXB0aE1vZGUgPSByZW5kZXJpbmdUb1RleHR1cmUgPyBEZXB0aE1vZGUuZGlzYWJsZWQgOiBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKGNvb3JkLm92ZXJzY2FsZWRaIC0gbWluVGlsZVosXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1vcGFjaXR5JykgPT09IDEgPyBEZXB0aE1vZGUuUmVhZFdyaXRlIDogRGVwdGhNb2RlLlJlYWRPbmx5LCBnbC5MRVNTKTtcblxuICAgICAgICBjb25zdCB1bndyYXBwZWRUaWxlSUQgPSBjb29yZC50b1Vud3JhcHBlZCgpO1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGlmIChyZW5kZXJpbmdUb1RleHR1cmUgJiYgISh0aWxlICYmIHRpbGUuaGFzRGF0YSgpKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgcHJvak1hdHJpeCA9IChyZW5kZXJpbmdUb1RleHR1cmUpID8gY29vcmQucHJvak1hdHJpeCA6XG4gICAgICAgICAgICBwYWludGVyLnRyYW5zZm9ybS5jYWxjdWxhdGVQcm9qTWF0cml4KHVud3JhcHBlZFRpbGVJRCwgYWxpZ24pO1xuXG4gICAgICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gcGFpbnRlci50ZXJyYWluICYmIHJlbmRlcmluZ1RvVGV4dHVyZSA/XG4gICAgICAgICAgICBwYWludGVyLnRlcnJhaW4uc3RlbmNpbE1vZGVGb3JSVFRPdmVybGFwKGNvb3JkKSA6XG4gICAgICAgICAgICBzdGVuY2lsTW9kZXNbY29vcmQub3ZlcnNjYWxlZFpdO1xuXG4gICAgICAgIGNvbnN0IHJhc3RlckZhZGVEdXJhdGlvbiA9IGlzSW5pdGlhbExvYWQgPyAwIDogbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItZmFkZS1kdXJhdGlvbicpO1xuICAgICAgICB0aWxlLnJlZ2lzdGVyRmFkZUR1cmF0aW9uKHJhc3RlckZhZGVEdXJhdGlvbik7XG5cbiAgICAgICAgY29uc3QgcGFyZW50VGlsZSA9IHNvdXJjZUNhY2hlLmZpbmRMb2FkZWRQYXJlbnQoY29vcmQsIDApO1xuICAgICAgICBjb25zdCBmYWRlID0gcmFzdGVyRmFkZSh0aWxlLCBwYXJlbnRUaWxlLCBzb3VyY2VDYWNoZSwgcGFpbnRlci50cmFuc2Zvcm0sIHJhc3RlckZhZGVEdXJhdGlvbik7XG4gICAgICAgIGlmIChwYWludGVyLnRlcnJhaW4pIHBhaW50ZXIudGVycmFpbi5wcmVwYXJlRHJhd1RpbGUoY29vcmQpO1xuXG4gICAgICAgIGxldCBwYXJlbnRTY2FsZUJ5LCBwYXJlbnRUTDtcblxuICAgICAgICBjb25zdCB0ZXh0dXJlRmlsdGVyID0gbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItcmVzYW1wbGluZycpID09PSAnbmVhcmVzdCcgPyAgZ2wuTkVBUkVTVCA6IGdsLkxJTkVBUjtcblxuICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQodGV4dHVyZUZpbHRlciwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMSk7XG5cbiAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcbiAgICAgICAgICAgIHBhcmVudFRpbGUudGV4dHVyZS5iaW5kKHRleHR1cmVGaWx0ZXIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgcGFyZW50U2NhbGVCeSA9IE1hdGgucG93KDIsIHBhcmVudFRpbGUudGlsZUlELm92ZXJzY2FsZWRaIC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgICAgICAgICAgcGFyZW50VEwgPSBbdGlsZS50aWxlSUQuY2Fub25pY2FsLnggKiBwYXJlbnRTY2FsZUJ5ICUgMSwgdGlsZS50aWxlSUQuY2Fub25pY2FsLnkgKiBwYXJlbnRTY2FsZUJ5ICUgMV07XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUudGV4dHVyZS5iaW5kKHRleHR1cmVGaWx0ZXIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGVyc3BlY3RpdmVUcmFuc2Zvcm0gPSBzb3VyY2UgaW5zdGFuY2VvZiBJbWFnZVNvdXJjZSA/IHNvdXJjZS5wZXJzcGVjdGl2ZVRyYW5zZm9ybSA6IFswLCAwXTtcbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IHJhc3RlclVuaWZvcm1WYWx1ZXMocHJvak1hdHJpeCwgcGFyZW50VEwgfHwgWzAsIDBdLCBwYXJlbnRTY2FsZUJ5IHx8IDEsIGZhZGUsIGxheWVyLCBwZXJzcGVjdGl2ZVRyYW5zZm9ybSk7XG5cbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgdW53cmFwcGVkVGlsZUlEKTtcblxuICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgSW1hZ2VTb3VyY2UpIHtcbiAgICAgICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBzb3VyY2UuYm91bmRzQnVmZmVyLFxuICAgICAgICAgICAgICAgIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHNvdXJjZS5ib3VuZHNTZWdtZW50cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7dGlsZUJvdW5kc0J1ZmZlciwgdGlsZUJvdW5kc0luZGV4QnVmZmVyLCB0aWxlQm91bmRzU2VnbWVudHN9ID0gcGFpbnRlci5nZXRUaWxlQm91bmRzQnVmZmVycyh0aWxlKTtcblxuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlcywgbGF5ZXIuaWQsIHRpbGVCb3VuZHNCdWZmZXIsXG4gICAgICAgICAgICAgICAgdGlsZUJvdW5kc0luZGV4QnVmZmVyLCB0aWxlQm91bmRzU2VnbWVudHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFpbnRlci5yZXNldFN0ZW5jaWxDbGlwcGluZ01hc2tzKCk7XG59XG5cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IHtcbiAgICBiYWNrZ3JvdW5kVW5pZm9ybVZhbHVlcyxcbiAgICBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1WYWx1ZXNcbn0gZnJvbSAnLi9wcm9ncmFtL2JhY2tncm91bmRfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBCYWNrZ3JvdW5kU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9iYWNrZ3JvdW5kX3N0eWxlX2xheWVyLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0JhY2tncm91bmQ7XG5cbmZ1bmN0aW9uIGRyYXdCYWNrZ3JvdW5kKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IEJhY2tncm91bmRTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBsYXllci5wYWludC5nZXQoJ2JhY2tncm91bmQtY29sb3InKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdiYWNrZ3JvdW5kLW9wYWNpdHknKTtcblxuICAgIGlmIChvcGFjaXR5ID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCB0aWxlU2l6ZSA9IHRyYW5zZm9ybS50aWxlU2l6ZTtcbiAgICBjb25zdCBpbWFnZSA9IGxheWVyLnBhaW50LmdldCgnYmFja2dyb3VuZC1wYXR0ZXJuJyk7XG4gICAgaWYgKHBhaW50ZXIuaXNQYXR0ZXJuTWlzc2luZyhpbWFnZSkpIHJldHVybjtcblxuICAgIGNvbnN0IHBhc3MgPSAoIWltYWdlICYmIGNvbG9yLmEgPT09IDEgJiYgb3BhY2l0eSA9PT0gMSAmJiBwYWludGVyLm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSkgPyAnb3BhcXVlJyA6ICd0cmFuc2x1Y2VudCc7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gcGFzcykgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIHBhc3MgPT09ICdvcGFxdWUnID8gRGVwdGhNb2RlLlJlYWRXcml0ZSA6IERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG5cbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKGltYWdlID8gJ2JhY2tncm91bmRQYXR0ZXJuJyA6ICdiYWNrZ3JvdW5kJyk7XG5cbiAgICBsZXQgdGlsZUlEcyA9IGNvb3JkcztcbiAgICBsZXQgYmFja2dyb3VuZFRpbGVzO1xuICAgIGlmICghdGlsZUlEcykge1xuICAgICAgICBiYWNrZ3JvdW5kVGlsZXMgPSBwYWludGVyLmdldEJhY2tncm91bmRUaWxlcygpO1xuICAgICAgICB0aWxlSURzID0gT2JqZWN0LnZhbHVlcyhiYWNrZ3JvdW5kVGlsZXMpLm1hcCh0aWxlID0+ICh0aWxlOiBhbnkpLnRpbGVJRCk7XG4gICAgfVxuXG4gICAgaWYgKGltYWdlKSB7XG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICBwYWludGVyLmltYWdlTWFuYWdlci5iaW5kKHBhaW50ZXIuY29udGV4dCk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Jvc3NmYWRlID0gbGF5ZXIuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpO1xuICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIHRpbGVJRHMpIHtcbiAgICAgICAgY29uc3QgdW53cmFwcGVkVGlsZUlEID0gdGlsZUlELnRvVW53cmFwcGVkKCk7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IGNvb3JkcyA/IHRpbGVJRC5wcm9qTWF0cml4IDogcGFpbnRlci50cmFuc2Zvcm0uY2FsY3VsYXRlUHJvak1hdHJpeCh1bndyYXBwZWRUaWxlSUQpO1xuICAgICAgICBwYWludGVyLnByZXBhcmVEcmF3VGlsZSh0aWxlSUQpO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZSA/IHNvdXJjZUNhY2hlLmdldFRpbGUodGlsZUlEKSA6XG4gICAgICAgICAgICBiYWNrZ3JvdW5kVGlsZXMgPyBiYWNrZ3JvdW5kVGlsZXNbdGlsZUlELmtleV0gOiBuZXcgVGlsZSh0aWxlSUQsIHRpbGVTaXplLCB0cmFuc2Zvcm0uem9vbSwgcGFpbnRlcik7XG5cbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGltYWdlID9cbiAgICAgICAgICAgIGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybVZhbHVlcyhtYXRyaXgsIG9wYWNpdHksIHBhaW50ZXIsIGltYWdlLCB7dGlsZUlELCB0aWxlU2l6ZX0sIGNyb3NzZmFkZSkgOlxuICAgICAgICAgICAgYmFja2dyb3VuZFVuaWZvcm1WYWx1ZXMobWF0cml4LCBvcGFjaXR5LCBjb2xvcik7XG5cbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgdW53cmFwcGVkVGlsZUlEKTtcblxuICAgICAgICBjb25zdCB7dGlsZUJvdW5kc0J1ZmZlciwgdGlsZUJvdW5kc0luZGV4QnVmZmVyLCB0aWxlQm91bmRzU2VnbWVudHN9ID0gcGFpbnRlci5nZXRUaWxlQm91bmRzQnVmZmVycyh0aWxlKTtcblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCB0aWxlQm91bmRzQnVmZmVyLFxuICAgICAgICAgICAgICAgIHRpbGVCb3VuZHNJbmRleEJ1ZmZlciwgdGlsZUJvdW5kc1NlZ21lbnRzKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUuanMnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZS5qcyc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlLmpzJztcbmltcG9ydCB7ZGVidWdVbmlmb3JtVmFsdWVzfSBmcm9tICcuL3Byb2dyYW0vZGVidWdfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZS5qcyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlLmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdEZWJ1ZztcblxuY29uc3QgdG9wQ29sb3IgPSBuZXcgQ29sb3IoMSwgMCwgMCwgMSk7XG5jb25zdCBidG1Db2xvciA9IG5ldyBDb2xvcigwLCAxLCAwLCAxKTtcbmNvbnN0IGxlZnRDb2xvciA9IG5ldyBDb2xvcigwLCAwLCAxLCAxKTtcbmNvbnN0IHJpZ2h0Q29sb3IgPSBuZXcgQ29sb3IoMSwgMCwgMSwgMSk7XG5jb25zdCBjZW50ZXJDb2xvciA9IG5ldyBDb2xvcigwLCAxLCAxLCAxKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdEZWJ1Z1BhZGRpbmcocGFpbnRlcjogUGFpbnRlcikge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBwYWludGVyLnRyYW5zZm9ybS5wYWRkaW5nO1xuICAgIGNvbnN0IGxpbmVXaWR0aCA9IDM7XG4gICAgLy8gVG9wXG4gICAgZHJhd0hvcml6b250YWxMaW5lKHBhaW50ZXIsIHBhaW50ZXIudHJhbnNmb3JtLmhlaWdodCAtIChwYWRkaW5nLnRvcCB8fCAwKSwgbGluZVdpZHRoLCB0b3BDb2xvcik7XG4gICAgLy8gQm90dG9tXG4gICAgZHJhd0hvcml6b250YWxMaW5lKHBhaW50ZXIsIHBhZGRpbmcuYm90dG9tIHx8IDAsIGxpbmVXaWR0aCwgYnRtQ29sb3IpO1xuICAgIC8vIExlZnRcbiAgICBkcmF3VmVydGljYWxMaW5lKHBhaW50ZXIsIHBhZGRpbmcubGVmdCB8fCAwLCBsaW5lV2lkdGgsIGxlZnRDb2xvcik7XG4gICAgLy8gUmlnaHRcbiAgICBkcmF3VmVydGljYWxMaW5lKHBhaW50ZXIsIHBhaW50ZXIudHJhbnNmb3JtLndpZHRoIC0gKHBhZGRpbmcucmlnaHQgfHwgMCksIGxpbmVXaWR0aCwgcmlnaHRDb2xvcik7XG4gICAgLy8gQ2VudGVyXG4gICAgY29uc3QgY2VudGVyID0gcGFpbnRlci50cmFuc2Zvcm0uY2VudGVyUG9pbnQ7XG4gICAgZHJhd0Nyb3NzaGFpcihwYWludGVyLCBjZW50ZXIueCwgcGFpbnRlci50cmFuc2Zvcm0uaGVpZ2h0IC0gY2VudGVyLnksIGNlbnRlckNvbG9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdEZWJ1Z1F1ZXJ5R2VvbWV0cnkocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZHJhd1RpbGVRdWVyeUdlb21ldHJ5KHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBjb29yZHNbaV0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd0Nyb3NzaGFpcihwYWludGVyOiBQYWludGVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgY29sb3I6IENvbG9yKSB7XG4gICAgY29uc3Qgc2l6ZSA9IDIwO1xuICAgIGNvbnN0IGxpbmVXaWR0aCA9IDI7XG4gICAgLy9WZXJ0aWNhbCBsaW5lXG4gICAgZHJhd0RlYnVnU1NSZWN0KHBhaW50ZXIsIHggLSBsaW5lV2lkdGggLyAyLCB5IC0gc2l6ZSAvIDIsIGxpbmVXaWR0aCwgc2l6ZSwgY29sb3IpO1xuICAgIC8vSG9yaXpvbnRhbCBsaW5lXG4gICAgZHJhd0RlYnVnU1NSZWN0KHBhaW50ZXIsIHggLSBzaXplIC8gMiwgeSAtIGxpbmVXaWR0aCAvIDIsIHNpemUsIGxpbmVXaWR0aCwgY29sb3IpO1xufVxuXG5mdW5jdGlvbiBkcmF3SG9yaXpvbnRhbExpbmUocGFpbnRlcjogUGFpbnRlciwgeTogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlciwgY29sb3I6IENvbG9yKSB7XG4gICAgZHJhd0RlYnVnU1NSZWN0KHBhaW50ZXIsIDAsIHkgICsgbGluZVdpZHRoIC8gMiwgcGFpbnRlci50cmFuc2Zvcm0ud2lkdGgsICBsaW5lV2lkdGgsIGNvbG9yKTtcbn1cblxuZnVuY3Rpb24gZHJhd1ZlcnRpY2FsTGluZShwYWludGVyOiBQYWludGVyLCB4OiBudW1iZXIsIGxpbmVXaWR0aDogbnVtYmVyLCBjb2xvcjogQ29sb3IpIHtcbiAgICBkcmF3RGVidWdTU1JlY3QocGFpbnRlciwgeCAtIGxpbmVXaWR0aCAvIDIsIDAsIGxpbmVXaWR0aCwgIHBhaW50ZXIudHJhbnNmb3JtLmhlaWdodCwgY29sb3IpO1xufVxuXG5mdW5jdGlvbiBkcmF3RGVidWdTU1JlY3QocGFpbnRlcjogUGFpbnRlciwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBjb2xvcjogQ29sb3IpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGdsLmVuYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgIGdsLnNjaXNzb3IoeCAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbywgeSAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbywgd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8sIGhlaWdodCAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgY29udGV4dC5jbGVhcih7Y29sb3J9KTtcbiAgICBnbC5kaXNhYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG59XG5cbmZ1bmN0aW9uIGRyYXdEZWJ1ZyhwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBkcmF3RGVidWdUaWxlKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBjb29yZHNbaV0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd1RpbGVRdWVyeUdlb21ldHJ5KHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBjb29yZDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgY29uc3QgcG9zTWF0cml4ID0gY29vcmQucHJvak1hdHJpeDtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdkZWJ1ZycpO1xuICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlQnlJRChjb29yZC5rZXkpO1xuICAgIGlmIChwYWludGVyLnRlcnJhaW4pIHBhaW50ZXIudGVycmFpbi5zZXR1cEVsZXZhdGlvbkRyYXcodGlsZSwgcHJvZ3JhbSk7XG5cbiAgICBjb25zdCBkZXB0aE1vZGUgPSBEZXB0aE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICBjb25zdCBpZCA9ICckZGVidWcnO1xuXG4gICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgLy8gQmluZCB0aGUgZW1wdHkgdGV4dHVyZSBmb3IgZHJhd2luZyBvdXRsaW5lc1xuICAgIHBhaW50ZXIuZW1wdHlUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgIGlmICh0aWxlLnF1ZXJ5R2VvbWV0cnlEZWJ1Z1ZpeiAmJiB0aWxlLnF1ZXJ5R2VvbWV0cnlEZWJ1Z1Zpei52ZXJ0aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRpbGUucXVlcnlHZW9tZXRyeURlYnVnVml6LmxhenlVcGxvYWQoY29udGV4dCk7XG4gICAgICAgIGNvbnN0IHZlcnRleEJ1ZmZlciA9IHRpbGUucXVlcnlHZW9tZXRyeURlYnVnVml6LnZlcnRleEJ1ZmZlcjtcbiAgICAgICAgY29uc3QgaW5kZXhCdWZmZXIgPSB0aWxlLnF1ZXJ5R2VvbWV0cnlEZWJ1Z1Zpei5pbmRleEJ1ZmZlcjtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSB0aWxlLnF1ZXJ5R2VvbWV0cnlEZWJ1Z1Zpei5zZWdtZW50cztcbiAgICAgICAgaWYgKHZlcnRleEJ1ZmZlciAhPSBudWxsICYmIGluZGV4QnVmZmVyICE9IG51bGwgJiYgc2VnbWVudHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLkxJTkVfU1RSSVAsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIGRlYnVnVW5pZm9ybVZhbHVlcyhwb3NNYXRyaXgsIHRpbGUucXVlcnlHZW9tZXRyeURlYnVnVml6LmNvbG9yKSwgaWQsXG4gICAgICAgICAgICAgICAgdmVydGV4QnVmZmVyLCBpbmRleEJ1ZmZlciwgc2VnbWVudHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRpbGUucXVlcnlCb3VuZHNEZWJ1Z1ZpeiAmJiB0aWxlLnF1ZXJ5Qm91bmRzRGVidWdWaXoudmVydGljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aWxlLnF1ZXJ5Qm91bmRzRGVidWdWaXoubGF6eVVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgY29uc3QgdmVydGV4QnVmZmVyID0gdGlsZS5xdWVyeUJvdW5kc0RlYnVnVml6LnZlcnRleEJ1ZmZlcjtcbiAgICAgICAgY29uc3QgaW5kZXhCdWZmZXIgPSB0aWxlLnF1ZXJ5Qm91bmRzRGVidWdWaXouaW5kZXhCdWZmZXI7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdGlsZS5xdWVyeUJvdW5kc0RlYnVnVml6LnNlZ21lbnRzO1xuICAgICAgICBpZiAodmVydGV4QnVmZmVyICE9IG51bGwgJiYgaW5kZXhCdWZmZXIgIT0gbnVsbCAmJiBzZWdtZW50cyAhPSBudWxsKSB7XG4gICAgICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuTElORV9TVFJJUCwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgZGVidWdVbmlmb3JtVmFsdWVzKHBvc01hdHJpeCwgdGlsZS5xdWVyeUJvdW5kc0RlYnVnVml6LmNvbG9yKSwgaWQsXG4gICAgICAgICAgICAgICAgdmVydGV4QnVmZmVyLCBpbmRleEJ1ZmZlciwgc2VnbWVudHMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3RGVidWdUaWxlKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBjb29yZDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgY29uc3QgcG9zTWF0cml4ID0gY29vcmQucHJvak1hdHJpeDtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdkZWJ1ZycpO1xuICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlQnlJRChjb29yZC5rZXkpO1xuICAgIGlmIChwYWludGVyLnRlcnJhaW4pIHBhaW50ZXIudGVycmFpbi5zZXR1cEVsZXZhdGlvbkRyYXcodGlsZSwgcHJvZ3JhbSk7XG5cbiAgICBjb25zdCBkZXB0aE1vZGUgPSBEZXB0aE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICBjb25zdCBpZCA9ICckZGVidWcnO1xuXG4gICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgLy8gQmluZCB0aGUgZW1wdHkgdGV4dHVyZSBmb3IgZHJhd2luZyBvdXRsaW5lc1xuICAgIHBhaW50ZXIuZW1wdHlUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgIHRpbGUuX21ha2VEZWJ1Z1RpbGVCb3VuZHNCdWZmZXJzKHBhaW50ZXIuY29udGV4dCwgcGFpbnRlci50cmFuc2Zvcm0ucHJvamVjdGlvbik7XG5cbiAgICBjb25zdCBkZWJ1Z0J1ZmZlciA9IHRpbGUuX3RpbGVEZWJ1Z0J1ZmZlciB8fCBwYWludGVyLmRlYnVnQnVmZmVyO1xuICAgIGNvbnN0IGRlYnVnSW5kZXhCdWZmZXIgPSB0aWxlLl90aWxlRGVidWdJbmRleEJ1ZmZlciB8fCBwYWludGVyLmRlYnVnSW5kZXhCdWZmZXI7XG4gICAgY29uc3QgZGVidWdTZWdtZW50cyA9IHRpbGUuX3RpbGVEZWJ1Z1NlZ21lbnRzIHx8IHBhaW50ZXIuZGVidWdTZWdtZW50cztcblxuICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5MSU5FX1NUUklQLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgZGVidWdVbmlmb3JtVmFsdWVzKHBvc01hdHJpeCwgQ29sb3IucmVkKSwgaWQsXG4gICAgICAgIGRlYnVnQnVmZmVyLCBkZWJ1Z0luZGV4QnVmZmVyLCBkZWJ1Z1NlZ21lbnRzKTtcblxuICAgIGNvbnN0IHRpbGVSYXdEYXRhID0gdGlsZS5sYXRlc3RSYXdUaWxlRGF0YTtcbiAgICBjb25zdCB0aWxlQnl0ZUxlbmd0aCA9ICh0aWxlUmF3RGF0YSAmJiB0aWxlUmF3RGF0YS5ieXRlTGVuZ3RoKSB8fCAwO1xuICAgIGNvbnN0IHRpbGVTaXplS2IgPSBNYXRoLmZsb29yKHRpbGVCeXRlTGVuZ3RoIC8gMTAyNCk7XG4gICAgY29uc3QgdGlsZVNpemUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKS50aWxlU2l6ZTtcbiAgICBjb25zdCBzY2FsZVJhdGlvID0gKDUxMiAvIE1hdGgubWluKHRpbGVTaXplLCA1MTIpICogKGNvb3JkLm92ZXJzY2FsZWRaIC8gcGFpbnRlci50cmFuc2Zvcm0uem9vbSkpICogMC41O1xuICAgIGxldCB0aWxlSWRUZXh0ID0gY29vcmQuY2Fub25pY2FsLnRvU3RyaW5nKCk7XG4gICAgaWYgKGNvb3JkLm92ZXJzY2FsZWRaICE9PSBjb29yZC5jYW5vbmljYWwueikge1xuICAgICAgICB0aWxlSWRUZXh0ICs9IGAgPT4gJHtjb29yZC5vdmVyc2NhbGVkWn1gO1xuICAgIH1cbiAgICBjb25zdCB0aWxlTGFiZWwgPSBgJHt0aWxlSWRUZXh0fSAke3RpbGVTaXplS2J9a2JgO1xuICAgIGRyYXdUZXh0VG9PdmVybGF5KHBhaW50ZXIsIHRpbGVMYWJlbCk7XG5cbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBDb2xvck1vZGUuYWxwaGFCbGVuZGVkLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgIGRlYnVnVW5pZm9ybVZhbHVlcyhwb3NNYXRyaXgsIENvbG9yLnRyYW5zcGFyZW50LCBzY2FsZVJhdGlvKSwgaWQsXG4gICAgICAgIHBhaW50ZXIuZGVidWdCdWZmZXIsIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHBhaW50ZXIuZGVidWdTZWdtZW50cyk7XG59XG5cbmZ1bmN0aW9uIGRyYXdUZXh0VG9PdmVybGF5KHBhaW50ZXI6IFBhaW50ZXIsIHRleHQ6IHN0cmluZykge1xuICAgIHBhaW50ZXIuaW5pdERlYnVnT3ZlcmxheUNhbnZhcygpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHBhaW50ZXIuZGVidWdPdmVybGF5Q2FudmFzO1xuICAgIGNvbnN0IGdsID0gcGFpbnRlci5jb250ZXh0LmdsO1xuICAgIGNvbnN0IGN0eDJkID0gcGFpbnRlci5kZWJ1Z092ZXJsYXlDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjdHgyZC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIGN0eDJkLnNoYWRvd0NvbG9yID0gJ3doaXRlJztcbiAgICBjdHgyZC5zaGFkb3dCbHVyID0gMjtcbiAgICBjdHgyZC5saW5lV2lkdGggPSAxLjU7XG4gICAgY3R4MmQuc3Ryb2tlU3R5bGUgPSAnd2hpdGUnO1xuICAgIGN0eDJkLnRleHRCYXNlbGluZSA9ICd0b3AnO1xuICAgIGN0eDJkLmZvbnQgPSBgYm9sZCAkezM2fXB4IE9wZW4gU2Fucywgc2Fucy1zZXJpZmA7XG4gICAgY3R4MmQuZmlsbFRleHQodGV4dCwgNSwgNSk7XG4gICAgY3R4MmQuc3Ryb2tlVGV4dCh0ZXh0LCA1LCA1KTtcblxuICAgIHBhaW50ZXIuZGVidWdPdmVybGF5VGV4dHVyZS51cGRhdGUoY2FudmFzKTtcbiAgICBwYWludGVyLmRlYnVnT3ZlcmxheVRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0N1c3RvbTtcblxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IHt3YXJuT25jZX0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBDdXN0b21TdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllci5qcyc7XG5cbmZ1bmN0aW9uIGRyYXdDdXN0b20ocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogQ3VzdG9tU3R5bGVMYXllcikge1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBpbXBsZW1lbnRhdGlvbiA9IGxheWVyLmltcGxlbWVudGF0aW9uO1xuXG4gICAgaWYgKHBhaW50ZXIudHJhbnNmb3JtLnByb2plY3Rpb24udW5zdXBwb3J0ZWRMYXllcnMgJiYgcGFpbnRlci50cmFuc2Zvcm0ucHJvamVjdGlvbi51bnN1cHBvcnRlZExheWVycy5pbmNsdWRlcyhcImN1c3RvbVwiKSkge1xuICAgICAgICB3YXJuT25jZSgnQ3VzdG9tIGxheWVycyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgd2l0aCBub24tbWVyY2F0b3IgcHJvamVjdGlvbnMuIFVzZSBtZXJjYXRvciB0byBlbmFibGUgY3VzdG9tIGxheWVycy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICdvZmZzY3JlZW4nKSB7XG5cbiAgICAgICAgY29uc3QgcHJlcmVuZGVyID0gaW1wbGVtZW50YXRpb24ucHJlcmVuZGVyO1xuICAgICAgICBpZiAocHJlcmVuZGVyKSB7XG4gICAgICAgICAgICBwYWludGVyLnNldEN1c3RvbUxheWVyRGVmYXVsdHMoKTtcbiAgICAgICAgICAgIGNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcblxuICAgICAgICAgICAgcHJlcmVuZGVyLmNhbGwoaW1wbGVtZW50YXRpb24sIGNvbnRleHQuZ2wsIHBhaW50ZXIudHJhbnNmb3JtLmN1c3RvbUxheWVyTWF0cml4KCkpO1xuXG4gICAgICAgICAgICBjb250ZXh0LnNldERpcnR5KCk7XG4gICAgICAgICAgICBwYWludGVyLnNldEJhc2VTdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ3RyYW5zbHVjZW50Jykge1xuXG4gICAgICAgIHBhaW50ZXIuc2V0Q3VzdG9tTGF5ZXJEZWZhdWx0cygpO1xuXG4gICAgICAgIGNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcbiAgICAgICAgY29udGV4dC5zZXRTdGVuY2lsTW9kZShTdGVuY2lsTW9kZS5kaXNhYmxlZCk7XG5cbiAgICAgICAgY29uc3QgZGVwdGhNb2RlID0gaW1wbGVtZW50YXRpb24ucmVuZGVyaW5nTW9kZSA9PT0gJzNkJyA/XG4gICAgICAgICAgICBuZXcgRGVwdGhNb2RlKHBhaW50ZXIuY29udGV4dC5nbC5MRVFVQUwsIERlcHRoTW9kZS5SZWFkV3JpdGUsIHBhaW50ZXIuZGVwdGhSYW5nZUZvcjNEKSA6XG4gICAgICAgICAgICBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG5cbiAgICAgICAgY29udGV4dC5zZXREZXB0aE1vZGUoZGVwdGhNb2RlKTtcblxuICAgICAgICBpbXBsZW1lbnRhdGlvbi5yZW5kZXIoY29udGV4dC5nbCwgcGFpbnRlci50cmFuc2Zvcm0uY3VzdG9tTGF5ZXJNYXRyaXgoKSk7XG5cbiAgICAgICAgY29udGV4dC5zZXREaXJ0eSgpO1xuICAgICAgICBwYWludGVyLnNldEJhc2VTdGF0ZSgpO1xuICAgICAgICBjb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQobnVsbCk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7Y3JlYXRlTGF5b3V0fSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmV4cG9ydCBjb25zdCBza3lib3hBdHRyaWJ1dGVzID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zXzNmJywgIGNvbXBvbmVudHM6IDMsIHR5cGU6ICdGbG9hdDMyJ31cbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBza3lib3hBdHRyaWJ1dGVzO1xuZXhwb3J0IGNvbnN0IHttZW1iZXJzLCBzaXplLCBhbGlnbm1lbnR9ID0gc2t5Ym94QXR0cmlidXRlcztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7bWVtYmVycyBhcyBza3lib3hBdHRyaWJ1dGVzfSBmcm9tICcuL3NreWJveF9hdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7U2t5Ym94VmVydGV4QXJyYXksIFRyaWFuZ2xlSW5kZXhBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQuanMnO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vZ2wvaW5kZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5cbmZ1bmN0aW9uIGFkZFZlcnRleCh2ZXJ0ZXhBcnJheSwgeCwgeSwgeikge1xuICAgIHZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAvLyBhX3Bvc1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB6XG4gICAgKTtcbn1cblxuY2xhc3MgU2t5Ym94R2VvbWV0cnkge1xuICAgIHZlcnRleEFycmF5OiBTa3lib3hWZXJ0ZXhBcnJheTtcbiAgICB2ZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcbiAgICBpbmRpY2VzOiBUcmlhbmdsZUluZGV4QXJyYXk7XG4gICAgaW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuICAgIHNlZ21lbnQ6IFNlZ21lbnRWZWN0b3I7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIHRoaXMudmVydGV4QXJyYXkgPSBuZXcgU2t5Ym94VmVydGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRpY2VzID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuXG4gICAgICAgIGFkZFZlcnRleCh0aGlzLnZlcnRleEFycmF5LCAtMS4wLCAtMS4wLCAgMS4wKTtcbiAgICAgICAgYWRkVmVydGV4KHRoaXMudmVydGV4QXJyYXksICAxLjAsIC0xLjAsICAxLjApO1xuICAgICAgICBhZGRWZXJ0ZXgodGhpcy52ZXJ0ZXhBcnJheSwgLTEuMCwgIDEuMCwgIDEuMCk7XG4gICAgICAgIGFkZFZlcnRleCh0aGlzLnZlcnRleEFycmF5LCAgMS4wLCAgMS4wLCAgMS4wKTtcbiAgICAgICAgYWRkVmVydGV4KHRoaXMudmVydGV4QXJyYXksIC0xLjAsIC0xLjAsIC0xLjApO1xuICAgICAgICBhZGRWZXJ0ZXgodGhpcy52ZXJ0ZXhBcnJheSwgIDEuMCwgLTEuMCwgLTEuMCk7XG4gICAgICAgIGFkZFZlcnRleCh0aGlzLnZlcnRleEFycmF5LCAtMS4wLCAgMS4wLCAtMS4wKTtcbiAgICAgICAgYWRkVmVydGV4KHRoaXMudmVydGV4QXJyYXksICAxLjAsICAxLjAsIC0xLjApO1xuXG4gICAgICAgIC8vICt4XG4gICAgICAgIHRoaXMuaW5kaWNlcy5lbXBsYWNlQmFjayg1LCAxLCAzKTtcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKDMsIDcsIDUpO1xuICAgICAgICAvLyAteFxuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soNiwgMiwgMCk7XG4gICAgICAgIHRoaXMuaW5kaWNlcy5lbXBsYWNlQmFjaygwLCA0LCA2KTtcbiAgICAgICAgLy8gK3lcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKDIsIDYsIDcpO1xuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soNywgMywgMik7XG4gICAgICAgIC8vIC15XG4gICAgICAgIHRoaXMuaW5kaWNlcy5lbXBsYWNlQmFjayg1LCA0LCAwKTtcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKDAsIDEsIDUpO1xuICAgICAgICAvLyArelxuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soMCwgMiwgMyk7XG4gICAgICAgIHRoaXMuaW5kaWNlcy5lbXBsYWNlQmFjaygzLCAxLCAwKTtcbiAgICAgICAgLy8gLXpcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKDcsIDYsIDQpO1xuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soNCwgNSwgNyk7XG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnZlcnRleEFycmF5LCBza3lib3hBdHRyaWJ1dGVzKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRpY2VzKTtcblxuICAgICAgICB0aGlzLnNlZ21lbnQgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgMzYsIDEyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNreWJveEdlb21ldHJ5O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZS5qcyc7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUuanMnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL3RleHR1cmUuanMnO1xuaW1wb3J0IFByb2dyYW0gZnJvbSAnLi9wcm9ncmFtLmpzJztcbmltcG9ydCB7c21vb3Roc3RlcH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMnO1xuaW1wb3J0IFNreWJveEdlb21ldHJ5IGZyb20gJy4vc2t5Ym94X2dlb21ldHJ5LmpzJztcbmltcG9ydCB7c2t5Ym94VW5pZm9ybVZhbHVlcywgc2t5Ym94R3JhZGllbnRVbmlmb3JtVmFsdWVzfSBmcm9tICcuL3Byb2dyYW0vc2t5Ym94X3Byb2dyYW0uanMnO1xuaW1wb3J0IHtza3lib3hDYXB0dXJlVW5pZm9ybVZhbHVlc30gZnJvbSAnLi9wcm9ncmFtL3NreWJveF9jYXB0dXJlX3Byb2dyYW0uanMnO1xuaW1wb3J0IFNreUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3NreV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlci5qcyc7XG5pbXBvcnQge3ZlYzMsIG1hdDMsIG1hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdTa3k7XG5cbmNvbnN0IFRSQU5TSVRJT05fT1BBQ0lUWV9aT09NX1NUQVJUID0gNztcbmNvbnN0IFRSQU5TSVRJT05fT1BBQ0lUWV9aT09NX0VORCA9IDg7XG5cbmZ1bmN0aW9uIGRyYXdTa3kocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogU2t5TGF5ZXIpIHtcbiAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IGdsb2JlT3JNZXJjYXRvciA9ICh0ci5wcm9qZWN0aW9uLm5hbWUgPT09ICdtZXJjYXRvcicgfHwgdHIucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKTtcbiAgICAvLyBGb3Igbm9uLW1lcmNhdG9yIHByb2plY3Rpb24sIHVzZSBhIGZvcmNlZCBvcGFjaXR5IHRyYW5zaXRpb24uIFRoaXMgdHJhbnNpdGlvbiBpcyBzZXQgdG8gYmVcbiAgICAvLyAxLjAgYWZ0ZXIgdGhlIHNoZWVyIGFkanVzdG1lbnQgdXBwZXIgYm91bmQgd2hpY2ggZW5zdXJlcyB0byBiZSBpbiB0aGUgbWVyY2F0b3IgcHJvamVjdGlvbi5cbiAgICAvLyBOb3RlOiB3ZSBvbmx5IHJlbmRlciBza3kgZm9yIGdsb2JlIHByb2plY3Rpb24gZHVyaW5nIHRoZSB0cmFuc2l0aW9uIHRvIG1lcmNhdG9yLlxuICAgIGNvbnN0IHRyYW5zaXRpb25PcGFjaXR5ID0gZ2xvYmVPck1lcmNhdG9yID8gMS4wIDogc21vb3Roc3RlcChUUkFOU0lUSU9OX09QQUNJVFlfWk9PTV9TVEFSVCwgVFJBTlNJVElPTl9PUEFDSVRZX1pPT01fRU5ELCB0ci56b29tKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdza3ktb3BhY2l0eScpICogdHJhbnNpdGlvbk9wYWNpdHk7XG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgdHlwZSA9IGxheWVyLnBhaW50LmdldCgnc2t5LXR5cGUnKTtcbiAgICBjb25zdCBkZXB0aE1vZGUgPSBuZXcgRGVwdGhNb2RlKGNvbnRleHQuZ2wuTEVRVUFMLCBEZXB0aE1vZGUuUmVhZE9ubHksIFswLCAxXSk7XG4gICAgY29uc3QgdGVtcG9yYWxPZmZzZXQgPSAocGFpbnRlci5mcmFtZUNvdW50ZXIgLyAxMDAwLjApICUgMTtcblxuICAgIGlmICh0eXBlID09PSAnYXRtb3NwaGVyZScpIHtcbiAgICAgICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ29mZnNjcmVlbicpIHtcbiAgICAgICAgICAgIGlmIChsYXllci5uZWVkc1NreWJveENhcHR1cmUocGFpbnRlcikpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlU2t5Ym94KHBhaW50ZXIsIGxheWVyLCAzMiwgMzIpO1xuICAgICAgICAgICAgICAgIGxheWVyLm1hcmtTa3lib3hWYWxpZChwYWludGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICdza3knKSB7XG4gICAgICAgICAgICBkcmF3U2t5Ym94RnJvbUNhcHR1cmUocGFpbnRlciwgbGF5ZXIsIGRlcHRoTW9kZSwgb3BhY2l0eSwgdGVtcG9yYWxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZ3JhZGllbnQnKSB7XG4gICAgICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICdza3knKSB7XG4gICAgICAgICAgICBkcmF3U2t5Ym94R3JhZGllbnQocGFpbnRlciwgbGF5ZXIsIGRlcHRoTW9kZSwgb3BhY2l0eSwgdGVtcG9yYWxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCBgJHt0eXBlfSBpcyB1bnN1cHBvcnRlZCBza3ktdHlwZWApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd1NreWJveEdyYWRpZW50KHBhaW50ZXI6IFBhaW50ZXIsIGxheWVyOiBTa3lMYXllciwgZGVwdGhNb2RlOiBEZXB0aE1vZGUsIG9wYWNpdHk6IG51bWJlciwgdGVtcG9yYWxPZmZzZXQ6IG51bWJlcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ3NreWJveEdyYWRpZW50Jyk7XG5cbiAgICAvLyBMYXppbHkgaW5pdGlhbGl6ZSBnZW9tZXRyeSBhbmQgdGV4dHVyZSBpZiB0aGV5IGhhdmVudCBiZWVuIGNyZWF0ZWQgeWV0LlxuICAgIGlmICghbGF5ZXIuc2t5Ym94R2VvbWV0cnkpIHtcbiAgICAgICAgbGF5ZXIuc2t5Ym94R2VvbWV0cnkgPSBuZXcgU2t5Ym94R2VvbWV0cnkoY29udGV4dCk7XG4gICAgfVxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgIGxldCBjb2xvclJhbXBUZXh0dXJlID0gbGF5ZXIuY29sb3JSYW1wVGV4dHVyZTtcbiAgICBpZiAoIWNvbG9yUmFtcFRleHR1cmUpIHtcbiAgICAgICAgY29sb3JSYW1wVGV4dHVyZSA9IGxheWVyLmNvbG9yUmFtcFRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCBsYXllci5jb2xvclJhbXAsIGdsLlJHQkEpO1xuICAgIH1cbiAgICBjb2xvclJhbXBUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gc2t5Ym94R3JhZGllbnRVbmlmb3JtVmFsdWVzKFxuICAgICAgICB0cmFuc2Zvcm0uc2t5Ym94TWF0cml4LFxuICAgICAgICBsYXllci5nZXRDZW50ZXIocGFpbnRlciwgZmFsc2UpLFxuICAgICAgICBsYXllci5wYWludC5nZXQoJ3NreS1ncmFkaWVudC1yYWRpdXMnKSxcbiAgICAgICAgb3BhY2l0eSxcbiAgICAgICAgdGVtcG9yYWxPZmZzZXRcbiAgICApO1xuXG4gICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSk7XG5cbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIFN0ZW5jaWxNb2RlLmRpc2FibGVkLFxuICAgICAgICBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSwgQ3VsbEZhY2VNb2RlLmJhY2tDVyxcbiAgICAgICAgdW5pZm9ybVZhbHVlcywgJ3NreWJveEdyYWRpZW50JywgbGF5ZXIuc2t5Ym94R2VvbWV0cnkudmVydGV4QnVmZmVyLFxuICAgICAgICBsYXllci5za3lib3hHZW9tZXRyeS5pbmRleEJ1ZmZlciwgbGF5ZXIuc2t5Ym94R2VvbWV0cnkuc2VnbWVudCk7XG59XG5cbmZ1bmN0aW9uIGRyYXdTa3lib3hGcm9tQ2FwdHVyZShwYWludGVyOiBQYWludGVyLCBsYXllcjogU2t5TGF5ZXIsIGRlcHRoTW9kZTogRGVwdGhNb2RlLCBvcGFjaXR5OiBudW1iZXIsIHRlbXBvcmFsT2Zmc2V0OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdza3lib3gnKTtcblxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuXG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV9DVUJFX01BUCwgbGF5ZXIuc2t5Ym94VGV4dHVyZSk7XG5cbiAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gc2t5Ym94VW5pZm9ybVZhbHVlcyh0cmFuc2Zvcm0uc2t5Ym94TWF0cml4LCBsYXllci5nZXRDZW50ZXIocGFpbnRlciwgZmFsc2UpLCAwLCBvcGFjaXR5LCB0ZW1wb3JhbE9mZnNldCk7XG5cbiAgICBwYWludGVyLnByZXBhcmVEcmF3UHJvZ3JhbShjb250ZXh0LCBwcm9ncmFtKTtcblxuICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsXG4gICAgICAgIHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLCBDdWxsRmFjZU1vZGUuYmFja0NXLFxuICAgICAgICB1bmlmb3JtVmFsdWVzLCAnc2t5Ym94JywgbGF5ZXIuc2t5Ym94R2VvbWV0cnkudmVydGV4QnVmZmVyLFxuICAgICAgICBsYXllci5za3lib3hHZW9tZXRyeS5pbmRleEJ1ZmZlciwgbGF5ZXIuc2t5Ym94R2VvbWV0cnkuc2VnbWVudCk7XG59XG5cbmZ1bmN0aW9uIGRyYXdTa3lib3hGYWNlKGNvbnRleHQ6IENvbnRleHQsIGxheWVyOiBTa3lMYXllciwgcHJvZ3JhbTogUHJvZ3JhbTwqPiwgZmFjZVJvdGF0ZTogbWF0NCwgc3VuRGlyZWN0aW9uOiB2ZWMzLCBpOiBudW1iZXIpIHtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICBjb25zdCBhdG1vc3BoZXJlQ29sb3IgPSBsYXllci5wYWludC5nZXQoJ3NreS1hdG1vc3BoZXJlLWNvbG9yJyk7XG4gICAgY29uc3QgYXRtb3NwaGVyZUhhbG9Db2xvciA9IGxheWVyLnBhaW50LmdldCgnc2t5LWF0bW9zcGhlcmUtaGFsby1jb2xvcicpO1xuICAgIGNvbnN0IHN1bkludGVuc2l0eSA9IGxheWVyLnBhaW50LmdldCgnc2t5LWF0bW9zcGhlcmUtc3VuLWludGVuc2l0eScpO1xuXG4gICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IHNreWJveENhcHR1cmVVbmlmb3JtVmFsdWVzKFxuICAgICAgICBtYXQzLmZyb21NYXQ0KFtdLCBmYWNlUm90YXRlKSxcbiAgICAgICAgc3VuRGlyZWN0aW9uLFxuICAgICAgICBzdW5JbnRlbnNpdHksXG4gICAgICAgIGF0bW9zcGhlcmVDb2xvcixcbiAgICAgICAgYXRtb3NwaGVyZUhhbG9Db2xvcik7XG5cbiAgICBjb25zdCBnbEZhY2UgPSBnbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpO1xuICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2xGYWNlLCBsYXllci5za3lib3hUZXh0dXJlLCAwKTtcblxuICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIERlcHRoTW9kZS5kaXNhYmxlZCwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsIENvbG9yTW9kZS51bmJsZW5kZWQsIEN1bGxGYWNlTW9kZS5mcm9udENXLFxuICAgICAgICB1bmlmb3JtVmFsdWVzLCAnc2t5Ym94Q2FwdHVyZScsIGxheWVyLnNreWJveEdlb21ldHJ5LnZlcnRleEJ1ZmZlcixcbiAgICAgICAgbGF5ZXIuc2t5Ym94R2VvbWV0cnkuaW5kZXhCdWZmZXIsIGxheWVyLnNreWJveEdlb21ldHJ5LnNlZ21lbnQpO1xufVxuXG5mdW5jdGlvbiBjYXB0dXJlU2t5Ym94KHBhaW50ZXI6IFBhaW50ZXIsIGxheWVyOiBTa3lMYXllciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBsZXQgZmJvID0gbGF5ZXIuc2t5Ym94RmJvO1xuXG4gICAgLy8gVXNpbmcgYWJzZW5jZSBvZiBmYm8gYXMgYSBzaWduYWwgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24gb2YgYWxsIHJlc291cmNlcywgY2FjaGUgcmVzb3VyY2VzIGluIGxheWVyIG9iamVjdFxuICAgIGlmICghZmJvKSB7XG4gICAgICAgIGZibyA9IGxheWVyLnNreWJveEZibyA9IGNvbnRleHQuY3JlYXRlRnJhbWVidWZmZXIod2lkdGgsIGhlaWdodCwgZmFsc2UpO1xuICAgICAgICBsYXllci5za3lib3hHZW9tZXRyeSA9IG5ldyBTa3lib3hHZW9tZXRyeShjb250ZXh0KTtcbiAgICAgICAgbGF5ZXIuc2t5Ym94VGV4dHVyZSA9IGNvbnRleHQuZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGxheWVyLnNreWJveFRleHR1cmUpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFX0NVQkVfTUFQLCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV9DVUJFX01BUCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgZ2xGYWNlID0gZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaTtcblxuICAgICAgICAgICAgLy8gVGhlIGZvcm1hdCBoZXJlIGNvdWxkIGJlIFJHQiwgYnV0IHJlbmRlciB0ZXN0cyBhcmUgbm90IGhhcHB5IHdpdGggcmVuZGVyaW5nIHRvIHN1Y2ggYSBmb3JtYXRcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2xGYWNlLCAwLCBnbC5SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldChmYm8uZnJhbWVidWZmZXIpO1xuICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCB3aWR0aCwgaGVpZ2h0XSk7XG5cbiAgICBjb25zdCBzdW5EaXJlY3Rpb24gPSBsYXllci5nZXRDZW50ZXIocGFpbnRlciwgdHJ1ZSk7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnc2t5Ym94Q2FwdHVyZScpO1xuICAgIGNvbnN0IGZhY2VSb3RhdGUgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcblxuICAgIC8vICt4O1xuICAgIG1hdDQuaWRlbnRpdHkoZmFjZVJvdGF0ZSk7XG4gICAgbWF0NC5yb3RhdGVZKGZhY2VSb3RhdGUsIGZhY2VSb3RhdGUsIC1NYXRoLlBJICogMC41KTtcbiAgICBkcmF3U2t5Ym94RmFjZShjb250ZXh0LCBsYXllciwgcHJvZ3JhbSwgZmFjZVJvdGF0ZSwgc3VuRGlyZWN0aW9uLCAwKTtcbiAgICAvLyAteFxuICAgIG1hdDQuaWRlbnRpdHkoZmFjZVJvdGF0ZSk7XG4gICAgbWF0NC5yb3RhdGVZKGZhY2VSb3RhdGUsIGZhY2VSb3RhdGUsIE1hdGguUEkgKiAwLjUpO1xuICAgIGRyYXdTa3lib3hGYWNlKGNvbnRleHQsIGxheWVyLCBwcm9ncmFtLCBmYWNlUm90YXRlLCBzdW5EaXJlY3Rpb24sIDEpO1xuICAgIC8vICt5XG4gICAgbWF0NC5pZGVudGl0eShmYWNlUm90YXRlKTtcbiAgICBtYXQ0LnJvdGF0ZVgoZmFjZVJvdGF0ZSwgZmFjZVJvdGF0ZSwgLU1hdGguUEkgKiAwLjUpO1xuICAgIGRyYXdTa3lib3hGYWNlKGNvbnRleHQsIGxheWVyLCBwcm9ncmFtLCBmYWNlUm90YXRlLCBzdW5EaXJlY3Rpb24sIDIpO1xuICAgIC8vIC15XG4gICAgbWF0NC5pZGVudGl0eShmYWNlUm90YXRlKTtcbiAgICBtYXQ0LnJvdGF0ZVgoZmFjZVJvdGF0ZSwgZmFjZVJvdGF0ZSwgTWF0aC5QSSAqIDAuNSk7XG4gICAgZHJhd1NreWJveEZhY2UoY29udGV4dCwgbGF5ZXIsIHByb2dyYW0sIGZhY2VSb3RhdGUsIHN1bkRpcmVjdGlvbiwgMyk7XG4gICAgLy8gK3pcbiAgICBtYXQ0LmlkZW50aXR5KGZhY2VSb3RhdGUpO1xuICAgIGRyYXdTa3lib3hGYWNlKGNvbnRleHQsIGxheWVyLCBwcm9ncmFtLCBmYWNlUm90YXRlLCBzdW5EaXJlY3Rpb24sIDQpO1xuICAgIC8vIC16XG4gICAgbWF0NC5pZGVudGl0eShmYWNlUm90YXRlKTtcbiAgICBtYXQ0LnJvdGF0ZVkoZmFjZVJvdGF0ZSwgZmFjZVJvdGF0ZSwgTWF0aC5QSSk7XG4gICAgZHJhd1NreWJveEZhY2UoY29udGV4dCwgbGF5ZXIsIHByb2dyYW0sIGZhY2VSb3RhdGUsIHN1bkRpcmVjdGlvbiwgNSk7XG5cbiAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgcGFpbnRlci53aWR0aCwgcGFpbnRlci5oZWlnaHRdKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZS5qcyc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlLmpzJztcbmltcG9ydCB7Y2FsY3VsYXRlR2xvYmVNYXRyaXgsIGdsb2JlVG9NZXJjYXRvclRyYW5zaXRpb259IGZyb20gJy4vLi4vZ2VvL3Byb2plY3Rpb24vZ2xvYmUuanMnO1xuaW1wb3J0IHthdG1vc3BoZXJlVW5pZm9ybVZhbHVlc30gZnJvbSAnLi4vdGVycmFpbi9nbG9iZV9yYXN0ZXJfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlci5qcyc7XG5pbXBvcnQge3ZlYzMsIG1hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBkcmF3R2xvYmVBdG1vc3BoZXJlO1xuXG5mdW5jdGlvbiBkcmF3R2xvYmVBdG1vc3BoZXJlKHBhaW50ZXI6IFBhaW50ZXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCBkZXB0aE1vZGUgPSBuZXcgRGVwdGhNb2RlKGdsLkxFUVVBTCwgRGVwdGhNb2RlLlJlYWRPbmx5LCBbMCwgMV0pO1xuICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ2dsb2JlQXRtb3NwaGVyZScpO1xuXG4gICAgLy8gQ29tcHV0ZSBjZW50ZXIgYW5kIGFwcHJveGltYXRlIHJhZGl1cyBvZiB0aGUgZ2xvYmUgb24gc2NyZWVuIGNvb3JkaW5hdGVzXG4gICAgY29uc3Qgdmlld01hdHJpeCA9IHRyYW5zZm9ybS5fY2FtZXJhLmdldFdvcmxkVG9DYW1lcmEodHJhbnNmb3JtLndvcmxkU2l6ZSwgMS4wKTtcbiAgICBjb25zdCB2aWV3VG9Qcm9qID0gdHJhbnNmb3JtLl9jYW1lcmEuZ2V0Q2FtZXJhVG9DbGlwUGVyc3BlY3RpdmUodHJhbnNmb3JtLl9mb3YsIHRyYW5zZm9ybS53aWR0aCAvIHRyYW5zZm9ybS5oZWlnaHQsIHRyYW5zZm9ybS5fbmVhclosIHRyYW5zZm9ybS5fZmFyWik7XG4gICAgY29uc3QgZ2xvYmVUb1ZpZXcgPSBtYXQ0Lm11bChbXSwgdmlld01hdHJpeCwgY2FsY3VsYXRlR2xvYmVNYXRyaXgodHJhbnNmb3JtLCB0cmFuc2Zvcm0ud29ybGRTaXplKSk7XG4gICAgY29uc3Qgdmlld1RvU2NyZWVuID0gbWF0NC5tdWwoW10sIHRyYW5zZm9ybS5sYWJlbFBsYW5lTWF0cml4LCB2aWV3VG9Qcm9qKTtcblxuICAgIGNvbnN0IGNlbnRlck9uVmlld1NwYWNlID0gdmVjMy50cmFuc2Zvcm1NYXQ0KFtdLCBbMCwgMCwgMF0sIGdsb2JlVG9WaWV3KTtcbiAgICBjb25zdCByYWRpdXNPblZpZXdTcGFjZSA9IHZlYzMuYWRkKFtdLCBjZW50ZXJPblZpZXdTcGFjZSwgW3RyYW5zZm9ybS53b3JsZFNpemUgLyBNYXRoLlBJIC8gMi4wLCAwLCAwXSk7XG5cbiAgICBjb25zdCBjZW50ZXJPblNjcmVlbiA9IHZlYzMudHJhbnNmb3JtTWF0NChbXSwgY2VudGVyT25WaWV3U3BhY2UsIHZpZXdUb1NjcmVlbik7XG4gICAgY29uc3QgcmFkaXVzT25TY3JlZW4gPSB2ZWMzLnRyYW5zZm9ybU1hdDQoW10sIHJhZGl1c09uVmlld1NwYWNlLCB2aWV3VG9TY3JlZW4pO1xuXG4gICAgY29uc3QgcGl4ZWxSYWRpdXMgPSB2ZWMzLmxlbmd0aCh2ZWMzLnN1YihbXSwgcmFkaXVzT25TY3JlZW4sIGNlbnRlck9uU2NyZWVuKSk7XG4gICAgY29uc3QgZmFkZU91dFRyYW5zaXRpb24gPSAxLjAgLSBnbG9iZVRvTWVyY2F0b3JUcmFuc2l0aW9uKHRyYW5zZm9ybS56b29tKTtcblxuICAgIGNvbnN0IHVuaWZvcm1zID0gYXRtb3NwaGVyZVVuaWZvcm1WYWx1ZXMoXG4gICAgICAgIGNlbnRlck9uU2NyZWVuLFxuICAgICAgICBwaXhlbFJhZGl1cyxcbiAgICAgICAgW3RyYW5zZm9ybS53aWR0aCwgdHJhbnNmb3JtLmhlaWdodF0sXG4gICAgICAgIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgZmFkZU91dFRyYW5zaXRpb24sICAgICAgICAgIC8vIG9wYWNpdHlcbiAgICAgICAgMi4wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhZGVvdXQgcmFuZ2VcbiAgICAgICAgWzEuMCwgMS4wLCAxLjBdLCAgICAgICAgICAgIC8vIHN0YXJ0IGNvbG9yXG4gICAgICAgIFswLjAxMTgsIDAuNzQ1MSwgMC45ODgyXSk7ICAvLyBlbmQgY29sb3JcblxuICAgIHBhaW50ZXIucHJlcGFyZURyYXdQcm9ncmFtKGNvbnRleHQsIHByb2dyYW0pO1xuXG4gICAgY29uc3Qgc2hhcmVkQnVmZmVycyA9IHBhaW50ZXIuZ2xvYmVTaGFyZWRCdWZmZXJzO1xuICAgIGlmIChzaGFyZWRCdWZmZXJzKSB7XG4gICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBDb2xvck1vZGUuYWxwaGFCbGVuZGVkLCBDdWxsRmFjZU1vZGUuYmFja0NXLCB1bmlmb3JtcywgXCJza3lib3hcIixcbiAgICAgICAgICAgIHNoYXJlZEJ1ZmZlcnMuYXRtb3NwaGVyZVZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgIHNoYXJlZEJ1ZmZlcnMuYXRtb3NwaGVyZUluZGV4QnVmZmVyLFxuICAgICAgICAgICAgc2hhcmVkQnVmZmVycy5hdG1vc3BoZXJlU2VnbWVudHMpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcblxuaW1wb3J0IHttYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQgcGl4ZWxzVG9UaWxlVW5pdHMgZnJvbSAnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzLmpzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudC5qcyc7XG5pbXBvcnQge1Bvc0FycmF5LCBUaWxlQm91bmRzQXJyYXksIFRyaWFuZ2xlSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQge3ZhbHVlc30gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7aXNNYXBBdXRoZW50aWNhdGVkfSBmcm9tICcuLi91dGlsL21hcGJveC5qcyc7XG5pbXBvcnQgcG9zQXR0cmlidXRlcyBmcm9tICcuLi9kYXRhL3Bvc19hdHRyaWJ1dGVzLmpzJztcbmltcG9ydCBib3VuZHNBdHRyaWJ1dGVzIGZyb20gJy4uL2RhdGEvYm91bmRzX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IFByb2dyYW1Db25maWd1cmF0aW9uIGZyb20gJy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzJztcbmltcG9ydCBDcm9zc1RpbGVTeW1ib2xJbmRleCBmcm9tICcuLi9zeW1ib2wvY3Jvc3NfdGlsZV9zeW1ib2xfaW5kZXguanMnO1xuaW1wb3J0IHNoYWRlcnMgZnJvbSAnLi4vc2hhZGVycy9zaGFkZXJzLmpzJztcbmltcG9ydCBQcm9ncmFtIGZyb20gJy4vcHJvZ3JhbS5qcyc7XG5pbXBvcnQge3Byb2dyYW1Vbmlmb3Jtc30gZnJvbSAnLi9wcm9ncmFtL3Byb2dyYW1fdW5pZm9ybXMuanMnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQge2ZvZ1VuaWZvcm1WYWx1ZXN9IGZyb20gJy4uL3JlbmRlci9mb2cuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlLmpzJztcbmltcG9ydCB7Y2xpcHBpbmdNYXNrVW5pZm9ybVZhbHVlc30gZnJvbSAnLi9wcm9ncmFtL2NsaXBwaW5nX21hc2tfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcbmltcG9ydCBzeW1ib2wgZnJvbSAnLi9kcmF3X3N5bWJvbC5qcyc7XG5pbXBvcnQgY2lyY2xlIGZyb20gJy4vZHJhd19jaXJjbGUuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IGhlYXRtYXAgZnJvbSAnLi9kcmF3X2hlYXRtYXAuanMnO1xuaW1wb3J0IGxpbmUgZnJvbSAnLi9kcmF3X2xpbmUuanMnO1xuaW1wb3J0IGZpbGwgZnJvbSAnLi9kcmF3X2ZpbGwuanMnO1xuaW1wb3J0IGZpbGxFeHRydXNpb24gZnJvbSAnLi9kcmF3X2ZpbGxfZXh0cnVzaW9uLmpzJztcbmltcG9ydCBoaWxsc2hhZGUgZnJvbSAnLi9kcmF3X2hpbGxzaGFkZS5qcyc7XG5pbXBvcnQgcmFzdGVyIGZyb20gJy4vZHJhd19yYXN0ZXIuanMnO1xuaW1wb3J0IGJhY2tncm91bmQgZnJvbSAnLi9kcmF3X2JhY2tncm91bmQuanMnO1xuaW1wb3J0IGRlYnVnLCB7ZHJhd0RlYnVnUGFkZGluZywgZHJhd0RlYnVnUXVlcnlHZW9tZXRyeX0gZnJvbSAnLi9kcmF3X2RlYnVnLmpzJztcbmltcG9ydCBjdXN0b20gZnJvbSAnLi9kcmF3X2N1c3RvbS5qcyc7XG5pbXBvcnQgc2t5IGZyb20gJy4vZHJhd19za3kuanMnO1xuaW1wb3J0IGRyYXdHbG9iZUF0bW9zcGhlcmUgZnJvbSAnLi9kcmF3X2dsb2JlX2F0bW9zcGhlcmUuanMnO1xuaW1wb3J0IHtHbG9iZVNoYXJlZEJ1ZmZlcnMsIGdsb2JlVG9NZXJjYXRvclRyYW5zaXRpb259IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL2dsb2JlLmpzJztcbmltcG9ydCB7VGVycmFpbn0gZnJvbSAnLi4vdGVycmFpbi90ZXJyYWluLmpzJztcbmltcG9ydCB7RGVidWd9IGZyb20gJy4uL3V0aWwvZGVidWcuanMnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuXG5jb25zdCBkcmF3ID0ge1xuICAgIHN5bWJvbCxcbiAgICBjaXJjbGUsXG4gICAgaGVhdG1hcCxcbiAgICBsaW5lLFxuICAgIGZpbGwsXG4gICAgJ2ZpbGwtZXh0cnVzaW9uJzogZmlsbEV4dHJ1c2lvbixcbiAgICBoaWxsc2hhZGUsXG4gICAgcmFzdGVyLFxuICAgIGJhY2tncm91bmQsXG4gICAgc2t5LFxuICAgIGRlYnVnLFxuICAgIGN1c3RvbVxufTtcblxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUQsIFVud3JhcHBlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGUgZnJvbSAnLi4vc3R5bGUvc3R5bGUuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NGYWRlZH0gZnJvbSAnLi4vc3R5bGUvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSBMaW5lQXRsYXMgZnJvbSAnLi9saW5lX2F0bGFzLmpzJztcbmltcG9ydCB0eXBlIEltYWdlTWFuYWdlciBmcm9tICcuL2ltYWdlX21hbmFnZXIuanMnO1xuaW1wb3J0IHR5cGUgR2x5cGhNYW5hZ2VyIGZyb20gJy4vZ2x5cGhfbWFuYWdlci5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUge0RlcHRoUmFuZ2VUeXBlLCBEZXB0aE1hc2tUeXBlLCBEZXB0aEZ1bmNUeXBlfSBmcm9tICcuLi9nbC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7RHluYW1pY0RlZmluZXNUeXBlfSBmcm9tICcuL3Byb2dyYW0vcHJvZ3JhbV91bmlmb3Jtcy5qcyc7XG5cbmV4cG9ydCB0eXBlIFJlbmRlclBhc3MgPSAnb2Zmc2NyZWVuJyB8ICdvcGFxdWUnIHwgJ3RyYW5zbHVjZW50JyB8ICdza3knO1xuZXhwb3J0IHR5cGUgQ2FudmFzQ29weUluc3RhbmNlcyA9IHtcbiAgICBjYW52YXNDb3BpZXM6IFdlYkdMVGV4dHVyZVtdLFxuICAgIHRpbWVTdGFtcHM6IG51bWJlcltdXG59XG5cbnR5cGUgUGFpbnRlck9wdGlvbnMgPSB7XG4gICAgc2hvd092ZXJkcmF3SW5zcGVjdG9yOiBib29sZWFuLFxuICAgIHNob3dUaWxlQm91bmRhcmllczogYm9vbGVhbixcbiAgICBzaG93VGVycmFpbldpcmVmcmFtZTogYm9vbGVhbixcbiAgICBzaG93UXVlcnlHZW9tZXRyeTogYm9vbGVhbixcbiAgICBzaG93UGFkZGluZzogYm9vbGVhbixcbiAgICByb3RhdGluZzogYm9vbGVhbixcbiAgICB6b29taW5nOiBib29sZWFuLFxuICAgIG1vdmluZzogYm9vbGVhbixcbiAgICBncHVUaW1pbmc6IGJvb2xlYW4sXG4gICAgZmFkZUR1cmF0aW9uOiBudW1iZXIsXG4gICAgaXNJbml0aWFsTG9hZDogYm9vbGVhbixcbiAgICBzcGVlZEluZGV4VGltaW5nOiBib29sZWFuXG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBwYWludGVyIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0NhbnZhc30gZ2wgYW4gZXhwZXJpbWVudGFsLXdlYmdsIGRyYXdpbmcgY29udGV4dFxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgUGFpbnRlciB7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybTtcbiAgICBfdGlsZVRleHR1cmVzOiB7W186IG51bWJlcl06IEFycmF5PFRleHR1cmU+IH07XG4gICAgbnVtU3VibGF5ZXJzOiBudW1iZXI7XG4gICAgZGVwdGhFcHNpbG9uOiBudW1iZXI7XG4gICAgZW1wdHlQcm9ncmFtQ29uZmlndXJhdGlvbjogUHJvZ3JhbUNvbmZpZ3VyYXRpb247XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICB0aWxlRXh0ZW50QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgdGlsZUV4dGVudFNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIGRlYnVnQnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgZGVidWdJbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgZGVidWdTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICB2aWV3cG9ydEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuICAgIHZpZXdwb3J0U2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgcXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuICAgIG1lcmNhdG9yQm91bmRzQnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgbWVyY2F0b3JCb3VuZHNTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICBfdGlsZUNsaXBwaW5nTWFza0lEczoge1tfOiBudW1iZXJdOiBudW1iZXIgfTtcbiAgICBzdGVuY2lsQ2xlYXJNb2RlOiBTdGVuY2lsTW9kZTtcbiAgICBzdHlsZTogU3R5bGU7XG4gICAgb3B0aW9uczogUGFpbnRlck9wdGlvbnM7XG4gICAgbGluZUF0bGFzOiBMaW5lQXRsYXM7XG4gICAgaW1hZ2VNYW5hZ2VyOiBJbWFnZU1hbmFnZXI7XG4gICAgZ2x5cGhNYW5hZ2VyOiBHbHlwaE1hbmFnZXI7XG4gICAgZGVwdGhSYW5nZUZvcjNEOiBEZXB0aFJhbmdlVHlwZTtcbiAgICBvcGFxdWVQYXNzQ3V0b2ZmOiBudW1iZXI7XG4gICAgZnJhbWVDb3VudGVyOiBudW1iZXI7XG4gICAgcmVuZGVyUGFzczogUmVuZGVyUGFzcztcbiAgICBjdXJyZW50TGF5ZXI6IG51bWJlcjtcbiAgICBjdXJyZW50U3RlbmNpbFNvdXJjZTogP3N0cmluZztcbiAgICBuZXh0U3RlbmNpbElEOiBudW1iZXI7XG4gICAgaWQ6IHN0cmluZztcbiAgICBfc2hvd092ZXJkcmF3SW5zcGVjdG9yOiBib29sZWFuO1xuICAgIGNhY2hlOiB7W186IHN0cmluZ106IFByb2dyYW08Kj4gfTtcbiAgICBjcm9zc1RpbGVTeW1ib2xJbmRleDogQ3Jvc3NUaWxlU3ltYm9sSW5kZXg7XG4gICAgc3ltYm9sRmFkZUNoYW5nZTogbnVtYmVyO1xuICAgIGdwdVRpbWVyczoge1tfOiBzdHJpbmddOiBhbnkgfTtcbiAgICBlbXB0eVRleHR1cmU6IFRleHR1cmU7XG4gICAgaWRlbnRpdHlNYXQ6IG1hdDQ7XG4gICAgZGVidWdPdmVybGF5VGV4dHVyZTogVGV4dHVyZTtcbiAgICBkZWJ1Z092ZXJsYXlDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIF90ZXJyYWluOiA/VGVycmFpbjtcbiAgICBnbG9iZVNoYXJlZEJ1ZmZlcnM6ID9HbG9iZVNoYXJlZEJ1ZmZlcnM7XG4gICAgdGlsZUxvYWRlZDogYm9vbGVhbjtcbiAgICBmcmFtZUNvcGllczogQXJyYXk8V2ViR0xUZXh0dXJlPjtcbiAgICBsb2FkVGltZVN0YW1wczogQXJyYXk8bnVtYmVyPjtcbiAgICBfYmFja2dyb3VuZFRpbGVzOiB7W186IG51bWJlciB8IHN0cmluZ106IFRpbGV9O1xuXG4gICAgY29uc3RydWN0b3IoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IENvbnRleHQoZ2wpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgICAgdGhpcy5fdGlsZVRleHR1cmVzID0ge307XG4gICAgICAgIHRoaXMuZnJhbWVDb3BpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5sb2FkVGltZVN0YW1wcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuc2V0dXAoKTtcblxuICAgICAgICAvLyBXaXRoaW4gZWFjaCBsYXllciB0aGVyZSBhcmUgbXVsdGlwbGUgZGlzdGluY3Qgei1wbGFuZXMgdGhhdCBjYW4gYmUgZHJhd24gdG8uXG4gICAgICAgIC8vIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIFdlYkdMIGRlcHRoIGJ1ZmZlci5cbiAgICAgICAgdGhpcy5udW1TdWJsYXllcnMgPSBTb3VyY2VDYWNoZS5tYXhVbmRlcnpvb21pbmcgKyBTb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZyArIDE7XG4gICAgICAgIHRoaXMuZGVwdGhFcHNpbG9uID0gMSAvIE1hdGgucG93KDIsIDE2KTtcblxuICAgICAgICB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4ID0gbmV3IENyb3NzVGlsZVN5bWJvbEluZGV4KCk7XG5cbiAgICAgICAgdGhpcy5ncHVUaW1lcnMgPSB7fTtcbiAgICAgICAgdGhpcy5mcmFtZUNvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kVGlsZXMgPSB7fTtcbiAgICB9XG5cbiAgICB1cGRhdGVUZXJyYWluKHN0eWxlOiBTdHlsZSwgY2FtZXJhQ2hhbmdpbmc6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgZW5hYmxlZCA9ICEhc3R5bGUgJiYgISFzdHlsZS50ZXJyYWluICYmIHRoaXMudHJhbnNmb3JtLnByb2plY3Rpb24uc3VwcG9ydHNUZXJyYWluO1xuICAgICAgICBpZiAoIWVuYWJsZWQgJiYgKCF0aGlzLl90ZXJyYWluIHx8ICF0aGlzLl90ZXJyYWluLmVuYWJsZWQpKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5fdGVycmFpbikge1xuICAgICAgICAgICAgdGhpcy5fdGVycmFpbiA9IG5ldyBUZXJyYWluKHRoaXMsIHN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXJyYWluOiBUZXJyYWluID0gdGhpcy5fdGVycmFpbjtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0uZWxldmF0aW9uID0gZW5hYmxlZCA/IHRlcnJhaW4gOiBudWxsO1xuICAgICAgICB0ZXJyYWluLnVwZGF0ZShzdHlsZSwgdGhpcy50cmFuc2Zvcm0sIGNhbWVyYUNoYW5naW5nKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlRm9nKHN0eWxlOiBTdHlsZSkge1xuICAgICAgICBjb25zdCBmb2cgPSBzdHlsZS5mb2c7XG4gICAgICAgIGlmICghZm9nIHx8IGZvZy5nZXRPcGFjaXR5KHRoaXMudHJhbnNmb3JtLnBpdGNoKSA8IDEgfHwgZm9nLnByb3BlcnRpZXMuZ2V0KCdob3Jpem9uLWJsZW5kJykgPCAwLjAzKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5mb2dDdWxsRGlzdFNxID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIHN0YXJ0IGN1bGxpbmcgd2hlcmUgdGhlIGZvZyBvcGFjaXR5IGZ1bmN0aW9uIGhpdHNcbiAgICAgICAgLy8gOTglIHdoaWNoIGxlYXZlcyBhIG5vbi1ub3RpY2VhYmxlIGNoYW5nZSB0aHJlc2hvbGQuXG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IGZvZy5nZXRGb3ZBZGp1c3RlZFJhbmdlKHRoaXMudHJhbnNmb3JtLl9mb3YpO1xuXG4gICAgICAgIGlmIChzdGFydCA+IGVuZCkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uZm9nQ3VsbERpc3RTcSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb2dCb3VuZEZyYWN0aW9uID0gMC43ODtcbiAgICAgICAgY29uc3QgZm9nQ3VsbERpc3QgPSBzdGFydCArIChlbmQgLSBzdGFydCkgKiBmb2dCb3VuZEZyYWN0aW9uO1xuXG4gICAgICAgIHRoaXMudHJhbnNmb3JtLmZvZ0N1bGxEaXN0U3EgPSBmb2dDdWxsRGlzdCAqIGZvZ0N1bGxEaXN0O1xuICAgIH1cblxuICAgIGdldCB0ZXJyYWluKCk6ID9UZXJyYWluIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLl90ZXJyYWluRW5hYmxlZCgpICYmIHRoaXMuX3RlcnJhaW4gJiYgdGhpcy5fdGVycmFpbi5lbmFibGVkID8gdGhpcy5fdGVycmFpbiA6IG51bGw7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBVcGRhdGUgdGhlIEdMIHZpZXdwb3J0LCBwcm9qZWN0aW9uIG1hdHJpeCwgYW5kIHRyYW5zZm9ybXMgdG8gY29tcGVuc2F0ZVxuICAgICAqIGZvciBhIG5ldyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlLlxuICAgICAqL1xuICAgIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0ICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB0aGlzLmNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodF0pO1xuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgdGhpcy5zdHlsZS5vcmRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkXS5yZXNpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldHVwKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG4gICAgICAgIGNvbnN0IHRpbGVFeHRlbnRBcnJheSA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICB0aWxlRXh0ZW50QXJyYXkuZW1wbGFjZUJhY2soMCwgMCk7XG4gICAgICAgIHRpbGVFeHRlbnRBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIDApO1xuICAgICAgICB0aWxlRXh0ZW50QXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5UKTtcbiAgICAgICAgdGlsZUV4dGVudEFycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgRVhURU5UKTtcbiAgICAgICAgdGhpcy50aWxlRXh0ZW50QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGlsZUV4dGVudEFycmF5LCBwb3NBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLnRpbGVFeHRlbnRTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcblxuICAgICAgICBjb25zdCBkZWJ1Z0FycmF5ID0gbmV3IFBvc0FycmF5KCk7XG4gICAgICAgIGRlYnVnQXJyYXkuZW1wbGFjZUJhY2soMCwgMCk7XG4gICAgICAgIGRlYnVnQXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCAwKTtcbiAgICAgICAgZGVidWdBcnJheS5lbXBsYWNlQmFjaygwLCBFWFRFTlQpO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgRVhURU5UKTtcbiAgICAgICAgdGhpcy5kZWJ1Z0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKGRlYnVnQXJyYXksIHBvc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMuZGVidWdTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCA1KTtcblxuICAgICAgICBjb25zdCB2aWV3cG9ydEFycmF5ID0gbmV3IFBvc0FycmF5KCk7XG4gICAgICAgIHZpZXdwb3J0QXJyYXkuZW1wbGFjZUJhY2soLTEsIC0xKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygxLCAtMSk7XG4gICAgICAgIHZpZXdwb3J0QXJyYXkuZW1wbGFjZUJhY2soLTEsIDEpO1xuICAgICAgICB2aWV3cG9ydEFycmF5LmVtcGxhY2VCYWNrKDEsIDEpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodmlld3BvcnRBcnJheSwgcG9zQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydFNlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuXG4gICAgICAgIGNvbnN0IHRpbGVCb3VuZHNBcnJheSA9IG5ldyBUaWxlQm91bmRzQXJyYXkoKTtcbiAgICAgICAgdGlsZUJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKDAsIDAsIDAsIDApO1xuICAgICAgICB0aWxlQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCAwLCBFWFRFTlQsIDApO1xuICAgICAgICB0aWxlQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5ULCAwLCBFWFRFTlQpO1xuICAgICAgICB0aWxlQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCBFWFRFTlQsIEVYVEVOVCwgRVhURU5UKTtcbiAgICAgICAgdGhpcy5tZXJjYXRvckJvdW5kc0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRpbGVCb3VuZHNBcnJheSwgYm91bmRzQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy5tZXJjYXRvckJvdW5kc1NlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuXG4gICAgICAgIGNvbnN0IHF1YWRUcmlhbmdsZUluZGljZXMgPSBuZXcgVHJpYW5nbGVJbmRleEFycmF5KCk7XG4gICAgICAgIHF1YWRUcmlhbmdsZUluZGljZXMuZW1wbGFjZUJhY2soMCwgMSwgMik7XG4gICAgICAgIHF1YWRUcmlhbmdsZUluZGljZXMuZW1wbGFjZUJhY2soMiwgMSwgMyk7XG4gICAgICAgIHRoaXMucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHF1YWRUcmlhbmdsZUluZGljZXMpO1xuXG4gICAgICAgIGNvbnN0IHRpbGVMaW5lU3RyaXBJbmRpY2VzID0gbmV3IExpbmVTdHJpcEluZGV4QXJyYXkoKTtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIFswLCAxLCAzLCAyLCAwXSkgdGlsZUxpbmVTdHJpcEluZGljZXMuZW1wbGFjZUJhY2soaSk7XG4gICAgICAgIHRoaXMuZGVidWdJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGlsZUxpbmVTdHJpcEluZGljZXMpO1xuXG4gICAgICAgIHRoaXMuZW1wdHlUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwge1xuICAgICAgICAgICAgd2lkdGg6IDEsXG4gICAgICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgICAgICBkYXRhOiBuZXcgVWludDhBcnJheShbMCwgMCwgMCwgMF0pXG4gICAgICAgIH0sIGNvbnRleHQuZ2wuUkdCQSk7XG5cbiAgICAgICAgdGhpcy5pZGVudGl0eU1hdCA9IG1hdDQuY3JlYXRlKCk7XG5cbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuc3RlbmNpbENsZWFyTW9kZSA9IG5ldyBTdGVuY2lsTW9kZSh7ZnVuYzogZ2wuQUxXQVlTLCBtYXNrOiAwfSwgMHgwLCAweEZGLCBnbC5aRVJPLCBnbC5aRVJPLCBnbC5aRVJPKTtcbiAgICAgICAgdGhpcy5sb2FkVGltZVN0YW1wcy5wdXNoKHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSk7XG4gICAgfVxuXG4gICAgZ2V0TWVyY2F0b3JUaWxlQm91bmRzQnVmZmVycygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpbGVCb3VuZHNCdWZmZXI6IHRoaXMubWVyY2F0b3JCb3VuZHNCdWZmZXIsXG4gICAgICAgICAgICB0aWxlQm91bmRzSW5kZXhCdWZmZXI6IHRoaXMucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsXG4gICAgICAgICAgICB0aWxlQm91bmRzU2VnbWVudHM6IHRoaXMubWVyY2F0b3JCb3VuZHNTZWdtZW50c1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFRpbGVCb3VuZHNCdWZmZXJzKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgdGlsZS5fbWFrZVRpbGVCb3VuZHNCdWZmZXJzKHRoaXMuY29udGV4dCwgdGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbik7XG4gICAgICAgIGlmICh0aWxlLl90aWxlQm91bmRzQnVmZmVyKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlQm91bmRzQnVmZmVyID0gdGlsZS5fdGlsZUJvdW5kc0J1ZmZlcjtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVCb3VuZHNJbmRleEJ1ZmZlciA9IHRpbGUuX3RpbGVCb3VuZHNJbmRleEJ1ZmZlcjtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVCb3VuZHNTZWdtZW50cyA9IHRpbGUuX3RpbGVCb3VuZHNTZWdtZW50cztcbiAgICAgICAgICAgIHJldHVybiB7dGlsZUJvdW5kc0J1ZmZlciwgdGlsZUJvdW5kc0luZGV4QnVmZmVyLCB0aWxlQm91bmRzU2VnbWVudHN9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVyY2F0b3JUaWxlQm91bmRzQnVmZmVycygpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFJlc2V0IHRoZSBkcmF3aW5nIGNhbnZhcyBieSBjbGVhcmluZyB0aGUgc3RlbmNpbCBidWZmZXIgc28gdGhhdCB3ZSBjYW4gZHJhd1xuICAgICAqIG5ldyB0aWxlcyBhdCB0aGUgc2FtZSBsb2NhdGlvbiwgd2hpbGUgcmV0YWluaW5nIHByZXZpb3VzbHkgZHJhd24gcGl4ZWxzLlxuICAgICAqL1xuICAgIGNsZWFyU3RlbmNpbCgpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIHRoaXMubmV4dFN0ZW5jaWxJRCA9IDE7XG4gICAgICAgIHRoaXMuY3VycmVudFN0ZW5jaWxTb3VyY2UgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHMgPSB7fTtcblxuICAgICAgICAvLyBBcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNTQ5MCxcbiAgICAgICAgLy8gcGVuZGluZyBhbiB1cHN0cmVhbSBmaXgsIHdlIGRyYXcgYSBmdWxsc2NyZWVuIHN0ZW5jaWw9MCBjbGlwcGluZyBtYXNrIGhlcmUsXG4gICAgICAgIC8vIGVmZmVjdGl2ZWx5IGNsZWFyaW5nIHRoZSBzdGVuY2lsIGJ1ZmZlcjogb25jZSBhbiB1cHN0cmVhbSBwYXRjaCBsYW5kcywgcmVtb3ZlXG4gICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gaW4gZmF2b3Igb2YgY29udGV4dC5jbGVhcih7IHN0ZW5jaWw6IDB4MCB9KVxuICAgICAgICB0aGlzLnVzZVByb2dyYW0oJ2NsaXBwaW5nTWFzaycpLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLFxuICAgICAgICAgICAgRGVwdGhNb2RlLmRpc2FibGVkLCB0aGlzLnN0ZW5jaWxDbGVhck1vZGUsIENvbG9yTW9kZS5kaXNhYmxlZCwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgY2xpcHBpbmdNYXNrVW5pZm9ybVZhbHVlcyh0aGlzLmlkZW50aXR5TWF0KSxcbiAgICAgICAgICAgICckY2xpcHBpbmcnLCB0aGlzLnZpZXdwb3J0QnVmZmVyLFxuICAgICAgICAgICAgdGhpcy5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgdGhpcy52aWV3cG9ydFNlZ21lbnRzKTtcbiAgICB9XG5cbiAgICByZXNldFN0ZW5jaWxDbGlwcGluZ01hc2tzKCkge1xuICAgICAgICBpZiAoIXRoaXMudGVycmFpbikge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHMgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyhsYXllcjogU3R5bGVMYXllciwgc291cmNlQ2FjaGU/OiBTb3VyY2VDYWNoZSwgdGlsZUlEcz86IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgICAgIGlmICghc291cmNlQ2FjaGUgfHwgdGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9PT0gc291cmNlQ2FjaGUuaWQgfHwgIWxheWVyLmlzVGlsZUNsaXBwZWQoKSB8fCAhdGlsZUlEcyB8fCB0aWxlSURzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHMgJiYgIXRoaXMudGVycmFpbikge1xuICAgICAgICAgICAgbGV0IGRpcnR5U3RlbmNpbENsaXBwaW5nTWFza3MgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIEVxdWl2YWxlbnQgdGlsZSBzZXQgaXMgYWxyZWFkeSByZW5kZXJlZCBpbiBzdGVuY2lsXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIHRpbGVJRHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGlsZUNsaXBwaW5nTWFza0lEc1tjb29yZC5rZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlydHlTdGVuY2lsQ2xpcHBpbmdNYXNrcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGlydHlTdGVuY2lsQ2xpcHBpbmdNYXNrcykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZW5jaWxTb3VyY2UgPSBzb3VyY2VDYWNoZS5pZDtcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKHRoaXMubmV4dFN0ZW5jaWxJRCArIHRpbGVJRHMubGVuZ3RoID4gMjU2KSB7XG4gICAgICAgICAgICAvLyB3ZSdsbCBydW4gb3V0IG9mIGZyZXNoIElEcyBzbyB3ZSBuZWVkIHRvIGNsZWFyIGFuZCBzdGFydCBmcm9tIHNjcmF0Y2hcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LnNldENvbG9yTW9kZShDb2xvck1vZGUuZGlzYWJsZWQpO1xuICAgICAgICBjb250ZXh0LnNldERlcHRoTW9kZShEZXB0aE1vZGUuZGlzYWJsZWQpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzLnVzZVByb2dyYW0oJ2NsaXBwaW5nTWFzaycpO1xuXG4gICAgICAgIHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGVJRCBvZiB0aWxlSURzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZSh0aWxlSUQpO1xuICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLl90aWxlQ2xpcHBpbmdNYXNrSURzW3RpbGVJRC5rZXldID0gdGhpcy5uZXh0U3RlbmNpbElEKys7XG4gICAgICAgICAgICBjb25zdCB7dGlsZUJvdW5kc0J1ZmZlciwgdGlsZUJvdW5kc0luZGV4QnVmZmVyLCB0aWxlQm91bmRzU2VnbWVudHN9ID0gdGhpcy5nZXRUaWxlQm91bmRzQnVmZmVycyh0aWxlKTtcblxuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgRGVwdGhNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIC8vIFRlc3RzIHdpbGwgYWx3YXlzIHBhc3MsIGFuZCByZWYgdmFsdWUgd2lsbCBiZSB3cml0dGVuIHRvIHN0ZW5jaWwgYnVmZmVyLlxuICAgICAgICAgICAgICAgIG5ldyBTdGVuY2lsTW9kZSh7ZnVuYzogZ2wuQUxXQVlTLCBtYXNrOiAwfSwgaWQsIDB4RkYsIGdsLktFRVAsIGdsLktFRVAsIGdsLlJFUExBQ0UpLFxuICAgICAgICAgICAgICAgIENvbG9yTW9kZS5kaXNhYmxlZCwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLCBjbGlwcGluZ01hc2tVbmlmb3JtVmFsdWVzKHRpbGVJRC5wcm9qTWF0cml4KSxcbiAgICAgICAgICAgICAgICAnJGNsaXBwaW5nJywgdGlsZUJvdW5kc0J1ZmZlcixcbiAgICAgICAgICAgICAgICB0aWxlQm91bmRzSW5kZXhCdWZmZXIsIHRpbGVCb3VuZHNTZWdtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGVuY2lsTW9kZUZvcjNEKCk6IFN0ZW5jaWxNb2RlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlbmNpbFNvdXJjZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAodGhpcy5uZXh0U3RlbmNpbElEICsgMSA+IDI1Nikge1xuICAgICAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5uZXh0U3RlbmNpbElEKys7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICByZXR1cm4gbmV3IFN0ZW5jaWxNb2RlKHtmdW5jOiBnbC5OT1RFUVVBTCwgbWFzazogMHhGRn0sIGlkLCAweEZGLCBnbC5LRUVQLCBnbC5LRUVQLCBnbC5SRVBMQUNFKTtcbiAgICB9XG5cbiAgICBzdGVuY2lsTW9kZUZvckNsaXBwaW5nKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6ICRSZWFkT25seTxTdGVuY2lsTW9kZT4gIHtcbiAgICAgICAgaWYgKHRoaXMudGVycmFpbikgcmV0dXJuIHRoaXMudGVycmFpbi5zdGVuY2lsTW9kZUZvclJUVE92ZXJsYXAodGlsZUlEKTtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIHJldHVybiBuZXcgU3RlbmNpbE1vZGUoe2Z1bmM6IGdsLkVRVUFMLCBtYXNrOiAweEZGfSwgdGhpcy5fdGlsZUNsaXBwaW5nTWFza0lEc1t0aWxlSUQua2V5XSwgMHgwMCwgZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuUkVQTEFDRSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBTb3J0IGNvb3JkaW5hdGVzIGJ5IFogYXMgZHJhd2luZyB0aWxlcyBpcyBkb25lIGluIFotZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKiBBbGwgY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBaIHdyaXRlIHRoZSBzYW1lIHN0ZW5jaWwgdmFsdWUuICBDaGlsZHJlblxuICAgICAqIHN0ZW5jaWwgdmFsdWVzIGFyZSBncmVhdGVyIHRoYW4gcGFyZW50J3MuICBUaGlzIGlzIHVzZWQgb25seSBmb3IgcmFzdGVyXG4gICAgICogYW5kIHJhc3Rlci1kZW0gdGlsZXMsIHdoaWNoIGFyZSBhbHJlYWR5IGNsaXBwZWQgdG8gdGlsZSBib3VuZGFyaWVzLCB0b1xuICAgICAqIG1hc2sgYXJlYSBvZiB0aWxlIG92ZXJsYXBwZWQgYnkgY2hpbGRyZW4gdGlsZXMuXG4gICAgICogU3RlbmNpbCByZWYgdmFsdWVzIGNvbnRpbnVlIHJhbmdlIHVzZWQgaW4gX3RpbGVDbGlwcGluZ01hc2tJRHMuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIFtTdGVuY2lsTW9kZSBmb3IgdGlsZSBvdmVyc2NhbGVaIG1hcCwgc29ydGVkQ29vcmRzXS5cbiAgICAgKi9cbiAgICBzdGVuY2lsQ29uZmlnRm9yT3ZlcmxhcCh0aWxlSURzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPik6IFt7W186IG51bWJlcl06ICRSZWFkT25seTxTdGVuY2lsTW9kZT59LCBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPl0ge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdGlsZUlEcy5zb3J0KChhLCBiKSA9PiBiLm92ZXJzY2FsZWRaIC0gYS5vdmVyc2NhbGVkWik7XG4gICAgICAgIGNvbnN0IG1pblRpbGVaID0gY29vcmRzW2Nvb3Jkcy5sZW5ndGggLSAxXS5vdmVyc2NhbGVkWjtcbiAgICAgICAgY29uc3Qgc3RlbmNpbFZhbHVlcyA9IGNvb3Jkc1swXS5vdmVyc2NhbGVkWiAtIG1pblRpbGVaICsgMTtcbiAgICAgICAgaWYgKHN0ZW5jaWxWYWx1ZXMgPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRoaXMubmV4dFN0ZW5jaWxJRCArIHN0ZW5jaWxWYWx1ZXMgPiAyNTYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU3RlbmNpbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgelRvU3RlbmNpbE1vZGUgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlbmNpbFZhbHVlczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgelRvU3RlbmNpbE1vZGVbaSArIG1pblRpbGVaXSA9IG5ldyBTdGVuY2lsTW9kZSh7ZnVuYzogZ2wuR0VRVUFMLCBtYXNrOiAweEZGfSwgaSArIHRoaXMubmV4dFN0ZW5jaWxJRCwgMHhGRiwgZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuUkVQTEFDRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5leHRTdGVuY2lsSUQgKz0gc3RlbmNpbFZhbHVlcztcbiAgICAgICAgICAgIHJldHVybiBbelRvU3RlbmNpbE1vZGUsIGNvb3Jkc107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt7W21pblRpbGVaXTogU3RlbmNpbE1vZGUuZGlzYWJsZWR9LCBjb29yZHNdO1xuICAgIH1cblxuICAgIGNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTogJFJlYWRPbmx5PENvbG9yTW9kZT4ge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3Rvcikge1xuICAgICAgICAgICAgY29uc3QgbnVtT3ZlcmRyYXdTdGVwcyA9IDg7XG4gICAgICAgICAgICBjb25zdCBhID0gMSAvIG51bU92ZXJkcmF3U3RlcHM7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JNb2RlKFtnbC5DT05TVEFOVF9DT0xPUiwgZ2wuT05FXSwgbmV3IENvbG9yKGEsIGEsIGEsIDApLCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVuZGVyUGFzcyA9PT0gJ29wYXF1ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBDb2xvck1vZGUudW5ibGVuZGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIENvbG9yTW9kZS5hbHBoYUJsZW5kZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXB0aE1vZGVGb3JTdWJsYXllcihuOiBudW1iZXIsIG1hc2s6IERlcHRoTWFza1R5cGUsIGZ1bmM6ID9EZXB0aEZ1bmNUeXBlKTogJFJlYWRPbmx5PERlcHRoTW9kZT4ge1xuICAgICAgICBpZiAoIXRoaXMub3BhcXVlUGFzc0VuYWJsZWRGb3JMYXllcigpKSByZXR1cm4gRGVwdGhNb2RlLmRpc2FibGVkO1xuICAgICAgICBjb25zdCBkZXB0aCA9IDEgLSAoKDEgKyB0aGlzLmN1cnJlbnRMYXllcikgKiB0aGlzLm51bVN1YmxheWVycyArIG4pICogdGhpcy5kZXB0aEVwc2lsb247XG4gICAgICAgIHJldHVybiBuZXcgRGVwdGhNb2RlKGZ1bmMgfHwgdGhpcy5jb250ZXh0LmdsLkxFUVVBTCwgbWFzaywgW2RlcHRoLCBkZXB0aF0pO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVGhlIG9wYXF1ZSBwYXNzIGFuZCAzRCBsYXllcnMgYm90aCB1c2UgdGhlIGRlcHRoIGJ1ZmZlci5cbiAgICAgKiBMYXllcnMgZHJhd24gYWJvdmUgM0QgbGF5ZXJzIG5lZWQgdG8gYmUgZHJhd24gdXNpbmcgdGhlXG4gICAgICogcGFpbnRlcidzIGFsZ29yaXRobSBzbyB0aGF0IHRoZXkgYXBwZWFyIGFib3ZlIDNEIGZlYXR1cmVzLlxuICAgICAqIFRoaXMgcmV0dXJucyB0cnVlIGZvciBsYXllcnMgdGhhdCBjYW4gYmUgZHJhd24gdXNpbmcgdGhlXG4gICAgICogb3BhcXVlIHBhc3MuXG4gICAgICovXG4gICAgb3BhcXVlUGFzc0VuYWJsZWRGb3JMYXllcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudExheWVyIDwgdGhpcy5vcGFxdWVQYXNzQ3V0b2ZmO1xuICAgIH1cblxuICAgIHJlbmRlcihzdHlsZTogU3R5bGUsIG9wdGlvbnM6IFBhaW50ZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICB0aGlzLmxpbmVBdGxhcyA9IHN0eWxlLmxpbmVBdGxhcztcbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIgPSBzdHlsZS5pbWFnZU1hbmFnZXI7XG4gICAgICAgIHRoaXMuZ2x5cGhNYW5hZ2VyID0gc3R5bGUuZ2x5cGhNYW5hZ2VyO1xuXG4gICAgICAgIHRoaXMuc3ltYm9sRmFkZUNoYW5nZSA9IHN0eWxlLnBsYWNlbWVudC5zeW1ib2xGYWRlQ2hhbmdlKGJyb3dzZXIubm93KCkpO1xuXG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLmJlZ2luRnJhbWUoKTtcblxuICAgICAgICBjb25zdCBsYXllcklkcyA9IHRoaXMuc3R5bGUub3JkZXI7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IHRoaXMuc3R5bGUuX3NvdXJjZUNhY2hlcztcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlLnVzZWQpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VDYWNoZS5wcmVwYXJlKHRoaXMuY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb29yZHNBc2NlbmRpbmc6IHtbXzogc3RyaW5nXTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD59ID0ge307XG4gICAgICAgIGNvbnN0IGNvb3Jkc0Rlc2NlbmRpbmc6IHtbXzogc3RyaW5nXTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD59ID0ge307XG4gICAgICAgIGNvbnN0IGNvb3Jkc0Rlc2NlbmRpbmdTeW1ib2w6IHtbXzogc3RyaW5nXTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD59ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc291cmNlQ2FjaGVzW2lkXTtcbiAgICAgICAgICAgIGNvb3Jkc0FzY2VuZGluZ1tpZF0gPSBzb3VyY2VDYWNoZS5nZXRWaXNpYmxlQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgICAgIGNvb3Jkc0Rlc2NlbmRpbmdbaWRdID0gY29vcmRzQXNjZW5kaW5nW2lkXS5zbGljZSgpLnJldmVyc2UoKTtcbiAgICAgICAgICAgIGNvb3Jkc0Rlc2NlbmRpbmdTeW1ib2xbaWRdID0gc291cmNlQ2FjaGUuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKHRydWUpLnJldmVyc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BhcXVlUGFzc0N1dG9mZiA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxheWVySWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcklkID0gbGF5ZXJJZHNbaV07XG4gICAgICAgICAgICBpZiAodGhpcy5zdHlsZS5fbGF5ZXJzW2xheWVySWRdLmlzM0QoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BhcXVlUGFzc0N1dG9mZiA9IGk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50ZXJyYWluKSB7XG4gICAgICAgICAgICB0aGlzLnRlcnJhaW4udXBkYXRlVGlsZUJpbmRpbmcoY29vcmRzRGVzY2VuZGluZ1N5bWJvbCk7XG4gICAgICAgICAgICAvLyBBbGwgcmVuZGVyIHRvIHRleHR1cmUgaXMgZG9uZSBpbiB0cmFuc2x1Y2VudCBwYXNzIHRvIHJlbW92ZSBuZWVkXG4gICAgICAgICAgICAvLyBmb3IgZGVwdGggYnVmZmVyIGFsbG9jYXRpb24gcGVyIHRpbGUuXG4gICAgICAgICAgICB0aGlzLm9wYXF1ZVBhc3NDdXRvZmYgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJyAmJiAhdGhpcy5nbG9iZVNoYXJlZEJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuZ2xvYmVTaGFyZWRCdWZmZXJzID0gbmV3IEdsb2JlU2hhcmVkQnVmZmVycyh0aGlzLmNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9sbG93aW5nIGxpbmUgaXMgYmlsbGluZyByZWxhdGVkIGNvZGUuIERvIG5vdCBjaGFuZ2UuIFNlZSBMSUNFTlNFLnR4dFxuICAgICAgICBpZiAoIWlzTWFwQXV0aGVudGljYXRlZCh0aGlzLmNvbnRleHQuZ2wpKSByZXR1cm47XG5cbiAgICAgICAgLy8gT2Zmc2NyZWVuIHBhc3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gV2UgZmlyc3QgZG8gYWxsIHJlbmRlcmluZyB0aGF0IHJlcXVpcmVzIHJlbmRlcmluZyB0byBhIHNlcGFyYXRlXG4gICAgICAgIC8vIGZyYW1lYnVmZmVyLCBhbmQgdGhlbiBzYXZlIHRob3NlIGZvciByZW5kZXJpbmcgYmFjayB0byB0aGUgbWFwXG4gICAgICAgIC8vIGxhdGVyOiBpbiBkb2luZyB0aGlzIHdlIGF2b2lkIGRvaW5nIGV4cGVuc2l2ZSBmcmFtZWJ1ZmZlciByZXN0b3Jlcy5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzID0gJ29mZnNjcmVlbic7XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIGxheWVySWRzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc3R5bGUuX2dldExheWVyU291cmNlQ2FjaGUobGF5ZXIpO1xuICAgICAgICAgICAgaWYgKCFsYXllci5oYXNPZmZzY3JlZW5QYXNzKCkgfHwgbGF5ZXIuaXNIaWRkZW4odGhpcy50cmFuc2Zvcm0uem9vbSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb29yZHMgPSBzb3VyY2VDYWNoZSA/IGNvb3Jkc0Rlc2NlbmRpbmdbc291cmNlQ2FjaGUuaWRdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCEobGF5ZXIudHlwZSA9PT0gJ2N1c3RvbScgfHwgbGF5ZXIuaXNTa3koKSkgJiYgIShjb29yZHMgJiYgY29vcmRzLmxlbmd0aCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICB0aGlzLnJlbmRlckxheWVyKHRoaXMsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVwdGhSYW5nZUZvcjNEID0gWzAsIDEgLSAoKHN0eWxlLm9yZGVyLmxlbmd0aCArIDIpICogdGhpcy5udW1TdWJsYXllcnMgKiB0aGlzLmRlcHRoRXBzaWxvbildO1xuXG4gICAgICAgIC8vIFRlcnJhaW4gZGVwdGggb2Zmc2NyZWVuIHJlbmRlciBwYXNzID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIFdpdGggdGVycmFpbiBvbiwgcmVuZGVycyB0aGUgZGVwdGggYnVmZmVyIGludG8gYSB0ZXh0dXJlLlxuICAgICAgICAvLyBUaGlzIHRleHR1cmUgaXMgdXNlZCBmb3Igb2NjbHVzaW9uIHRlc3RpbmcgKGxhYmVscylcbiAgICAgICAgaWYgKHRoaXMudGVycmFpbiAmJiAodGhpcy5zdHlsZS5oYXNTeW1ib2xMYXllcnMoKSB8fCB0aGlzLnN0eWxlLmhhc0NpcmNsZUxheWVycygpKSkge1xuICAgICAgICAgICAgdGhpcy50ZXJyYWluLmRyYXdEZXB0aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmViaW5kIHRoZSBtYWluIGZyYW1lYnVmZmVyIG5vdyB0aGF0IGFsbCBvZmZzY3JlZW4gbGF5ZXJzIGhhdmUgYmVlbiByZW5kZXJlZDpcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XSk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYnVmZmVycyBpbiBwcmVwYXJhdGlvbiBmb3IgZHJhd2luZyB0byB0aGUgbWFpbiBmcmFtZWJ1ZmZlclxuICAgICAgICAvLyBJZiBmb2cgaXMgZW5hYmxlZCwgdXNlIHRoZSBmb2cgY29sb3IgYXMgZGVmYXVsdCBjbGVhciBjb2xvci5cbiAgICAgICAgbGV0IGNsZWFyQ29sb3IgPSBDb2xvci50cmFuc3BhcmVudDtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUuZm9nICYmIHRoaXMuc3R5bGUuZm9nLmdldE9wYWNpdHkodGhpcy50cmFuc2Zvcm0ucGl0Y2gpKSB7XG4gICAgICAgICAgICBjbGVhckNvbG9yID0gdGhpcy5zdHlsZS5mb2cucHJvcGVydGllcy5nZXQoJ2NvbG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250ZXh0LmNsZWFyKHtjb2xvcjogb3B0aW9ucy5zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPyBDb2xvci5ibGFjayA6IGNsZWFyQ29sb3IsIGRlcHRoOiAxfSk7XG4gICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG5cbiAgICAgICAgdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID0gb3B0aW9ucy5zaG93T3ZlcmRyYXdJbnNwZWN0b3I7XG5cbiAgICAgICAgLy8gT3BhcXVlIHBhc3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gRHJhdyBvcGFxdWUgbGF5ZXJzIHRvcC10by1ib3R0b20gZmlyc3QuXG4gICAgICAgIHRoaXMucmVuZGVyUGFzcyA9ICdvcGFxdWUnO1xuXG4gICAgICAgIGlmICghdGhpcy50ZXJyYWluKSB7XG4gICAgICAgICAgICBmb3IgKHRoaXMuY3VycmVudExheWVyID0gbGF5ZXJJZHMubGVuZ3RoIC0gMTsgdGhpcy5jdXJyZW50TGF5ZXIgPj0gMDsgdGhpcy5jdXJyZW50TGF5ZXItLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5zdHlsZS5fbGF5ZXJzW2xheWVySWRzW3RoaXMuY3VycmVudExheWVyXV07XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzdHlsZS5fZ2V0TGF5ZXJTb3VyY2VDYWNoZShsYXllcik7XG4gICAgICAgICAgICAgICAgaWYgKGxheWVyLmlzU2t5KCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IHNvdXJjZUNhY2hlID8gY29vcmRzRGVzY2VuZGluZ1tzb3VyY2VDYWNoZS5pZF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyhsYXllciwgc291cmNlQ2FjaGUsIGNvb3Jkcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJMYXllcih0aGlzLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3Jkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa3kgcGFzcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gRHJhdyBhbGwgc2t5IGxheWVycyBib3R0b20gdG8gdG9wLlxuICAgICAgICAvLyBUaGV5IGFyZSBkcmF3biBhdCBtYXggZGVwdGgsIHRoZXkgYXJlIGRyYXduIGFmdGVyIG9wYXF1ZSBhbmQgYmVmb3JlXG4gICAgICAgIC8vIHRyYW5zbHVjZW50IHRvIGZhaWwgZGVwdGggdGVzdGluZyBhbmQgbWl4IHdpdGggdHJhbnNsdWNlbnQgb2JqZWN0cy5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzID0gJ3NreSc7XG4gICAgICAgIGNvbnN0IGlzVHJhbnNpdGlvbmluZyA9IGdsb2JlVG9NZXJjYXRvclRyYW5zaXRpb24odGhpcy50cmFuc2Zvcm0uem9vbSkgPiAwLjA7XG4gICAgICAgIGlmICgoaXNUcmFuc2l0aW9uaW5nIHx8IHRoaXMudHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSAhPT0gJ2dsb2JlJykgJiYgdGhpcy50cmFuc2Zvcm0uaXNIb3Jpem9uVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICBmb3IgKHRoaXMuY3VycmVudExheWVyID0gMDsgdGhpcy5jdXJyZW50TGF5ZXIgPCBsYXllcklkcy5sZW5ndGg7IHRoaXMuY3VycmVudExheWVyKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkc1t0aGlzLmN1cnJlbnRMYXllcl1dO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc3R5bGUuX2dldExheWVyU291cmNlQ2FjaGUobGF5ZXIpO1xuICAgICAgICAgICAgICAgIGlmICghbGF5ZXIuaXNTa3koKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29vcmRzID0gc291cmNlQ2FjaGUgPyBjb29yZHNEZXNjZW5kaW5nW3NvdXJjZUNhY2hlLmlkXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyTGF5ZXIodGhpcywgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgICAgIGRyYXdHbG9iZUF0bW9zcGhlcmUodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmFuc2x1Y2VudCBwYXNzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIERyYXcgYWxsIG90aGVyIGxheWVycyBib3R0b20tdG8tdG9wLlxuICAgICAgICB0aGlzLnJlbmRlclBhc3MgPSAndHJhbnNsdWNlbnQnO1xuXG4gICAgICAgIHRoaXMuY3VycmVudExheWVyID0gMDtcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVudExheWVyIDwgbGF5ZXJJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkc1t0aGlzLmN1cnJlbnRMYXllcl1dO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzdHlsZS5fZ2V0TGF5ZXJTb3VyY2VDYWNoZShsYXllcik7XG5cbiAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZHJhdyBpbiB0cmFuc2x1Y2VudCBwYXNzIGZvciBza3kgbGF5ZXJzLCBhZHZhbmNlXG4gICAgICAgICAgICBpZiAobGF5ZXIuaXNTa3koKSkge1xuICAgICAgICAgICAgICAgICsrdGhpcy5jdXJyZW50TGF5ZXI7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdpdGggdGVycmFpbiBvbiBhbmQgZm9yIGRyYXBlZCBsYXllcnMgb25seSwgaXNzdWUgcmVuZGVyaW5nIGFuZCBwcm9ncmVzc1xuICAgICAgICAgICAgLy8gdGhpcy5jdXJyZW50TGF5ZXIgdW50aWwgdGhlIG5leHQgbm9uLWRyYXBlZCBsYXllci5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBpbnRlcmxlYXZlIHRlcnJhaW4gZHJhcGVkIHJlbmRlciB3aXRoIG5vbi1kcmFwZWQgbGF5ZXJzIG9uIHRvcFxuICAgICAgICAgICAgaWYgKHRoaXMudGVycmFpbiAmJiB0aGlzLnN0eWxlLmlzTGF5ZXJEcmFwZWQobGF5ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxheWVyLmlzSGlkZGVuKHRoaXMudHJhbnNmb3JtLnpvb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICsrdGhpcy5jdXJyZW50TGF5ZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB0ZXJyYWluID0gKCgodGhpcy50ZXJyYWluKTogYW55KTogVGVycmFpbik7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldkxheWVyID0gdGhpcy5jdXJyZW50TGF5ZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGF5ZXIgPSB0ZXJyYWluLnJlbmRlckJhdGNoKHRoaXMuY3VycmVudExheWVyKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQodGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5jdXJyZW50ID09PSBudWxsKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQodGhpcy5jdXJyZW50TGF5ZXIgPiBwcmV2TGF5ZXIpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3Igc3ltYm9sIGxheWVycyBpbiB0aGUgdHJhbnNsdWNlbnQgcGFzcywgd2UgYWRkIGV4dHJhIHRpbGVzIHRvIHRoZSByZW5kZXJhYmxlIHNldFxuICAgICAgICAgICAgLy8gZm9yIGNyb3NzLXRpbGUgc3ltYm9sIGZhZGluZy4gU3ltYm9sIGxheWVycyBkb24ndCB1c2UgdGlsZSBjbGlwcGluZywgc28gbm8gbmVlZCB0byByZW5kZXJcbiAgICAgICAgICAgIC8vIHNlcGFyYXRlIGNsaXBwaW5nIG1hc2tzXG4gICAgICAgICAgICBjb25zdCBjb29yZHMgPSBzb3VyY2VDYWNoZSA/XG4gICAgICAgICAgICAgICAgKGxheWVyLnR5cGUgPT09ICdzeW1ib2wnID8gY29vcmRzRGVzY2VuZGluZ1N5bWJvbCA6IGNvb3Jkc0Rlc2NlbmRpbmcpW3NvdXJjZUNhY2hlLmlkXSA6XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyhsYXllciwgc291cmNlQ2FjaGUsIHNvdXJjZUNhY2hlID8gY29vcmRzQXNjZW5kaW5nW3NvdXJjZUNhY2hlLmlkXSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckxheWVyKHRoaXMsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKTtcblxuICAgICAgICAgICAgKyt0aGlzLmN1cnJlbnRMYXllcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRlcnJhaW4pIHtcbiAgICAgICAgICAgIHRoaXMudGVycmFpbi5wb3N0UmVuZGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dUaWxlQm91bmRhcmllcyB8fCB0aGlzLm9wdGlvbnMuc2hvd1F1ZXJ5R2VvbWV0cnkpIHtcbiAgICAgICAgICAgIC8vVXNlIHNvdXJjZSB3aXRoIGhpZ2hlc3QgbWF4em9vbVxuICAgICAgICAgICAgbGV0IHNlbGVjdGVkU291cmNlID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGxheWVycyA9IHZhbHVlcyh0aGlzLnN0eWxlLl9sYXllcnMpO1xuICAgICAgICAgICAgbGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzdHlsZS5fZ2V0TGF5ZXJTb3VyY2VDYWNoZShsYXllcik7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlICYmICFsYXllci5pc0hpZGRlbih0aGlzLnRyYW5zZm9ybS56b29tKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkU291cmNlIHx8IChzZWxlY3RlZFNvdXJjZS5nZXRTb3VyY2UoKS5tYXh6b29tIDwgc291cmNlQ2FjaGUuZ2V0U291cmNlKCkubWF4em9vbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU291cmNlID0gc291cmNlQ2FjaGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1RpbGVCb3VuZGFyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRyYXcuZGVidWcodGhpcywgc2VsZWN0ZWRTb3VyY2UsIHNlbGVjdGVkU291cmNlLmdldFZpc2libGVDb29yZGluYXRlcygpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBEZWJ1Zy5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dRdWVyeUdlb21ldHJ5ICYmIHNlbGVjdGVkU291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkcmF3RGVidWdRdWVyeUdlb21ldHJ5KHRoaXMsIHNlbGVjdGVkU291cmNlLCBzZWxlY3RlZFNvdXJjZS5nZXRWaXNpYmxlQ29vcmRpbmF0ZXMoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1BhZGRpbmcpIHtcbiAgICAgICAgICAgIGRyYXdEZWJ1Z1BhZGRpbmcodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgZGVmYXVsdHMgZm9yIG1vc3QgR0wgdmFsdWVzIHNvIHRoYXQgYW55b25lIHVzaW5nIHRoZSBzdGF0ZSBhZnRlciB0aGUgcmVuZGVyXG4gICAgICAgIC8vIGVuY291bnRlcnMgbW9yZSBleHBlY3RlZCB2YWx1ZXMuXG4gICAgICAgIHRoaXMuY29udGV4dC5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZnJhbWVDb3VudGVyID0gKHRoaXMuZnJhbWVDb3VudGVyICsgMSkgJSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcblxuICAgICAgICBpZiAodGhpcy50aWxlTG9hZGVkICYmIHRoaXMub3B0aW9ucy5zcGVlZEluZGV4VGltaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRUaW1lU3RhbXBzLnB1c2god2luZG93LnBlcmZvcm1hbmNlLm5vdygpKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNhbnZhc0NvcHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckxheWVyKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlPzogU291cmNlQ2FjaGUsIGxheWVyOiBTdHlsZUxheWVyLCBjb29yZHM/OiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgICAgICBpZiAobGF5ZXIuaXNIaWRkZW4odGhpcy50cmFuc2Zvcm0uem9vbSkpIHJldHVybjtcbiAgICAgICAgaWYgKGxheWVyLnR5cGUgIT09ICdiYWNrZ3JvdW5kJyAmJiBsYXllci50eXBlICE9PSAnc2t5JyAmJiBsYXllci50eXBlICE9PSAnY3VzdG9tJyAmJiAhKGNvb3JkcyAmJiBjb29yZHMubGVuZ3RoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlkID0gbGF5ZXIuaWQ7XG5cbiAgICAgICAgdGhpcy5ncHVUaW1pbmdTdGFydChsYXllcik7XG4gICAgICAgIGlmICghcGFpbnRlci50cmFuc2Zvcm0ucHJvamVjdGlvbi51bnN1cHBvcnRlZExheWVycyB8fCAhcGFpbnRlci50cmFuc2Zvcm0ucHJvamVjdGlvbi51bnN1cHBvcnRlZExheWVycy5pbmNsdWRlcyhsYXllci50eXBlKSkge1xuICAgICAgICAgICAgZHJhd1tsYXllci50eXBlXShwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgdGhpcy5zdHlsZS5wbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzLCB0aGlzLm9wdGlvbnMuaXNJbml0aWFsTG9hZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncHVUaW1pbmdFbmQoKTtcbiAgICB9XG5cbiAgICBncHVUaW1pbmdTdGFydChsYXllcjogU3R5bGVMYXllcikge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncHVUaW1pbmcpIHJldHVybjtcbiAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5jb250ZXh0LmV4dFRpbWVyUXVlcnk7XG4gICAgICAgIC8vIFRoaXMgdHJpZXMgdG8gdGltZSB0aGUgZHJhdyBjYWxsIGl0c2VsZiwgYnV0IG5vdGUgdGhhdCB0aGUgY29zdCBmb3IgZHJhd2luZyBhIGxheWVyXG4gICAgICAgIC8vIG1heSBiZSBkb21pbmF0ZWQgYnkgdGhlIGNvc3Qgb2YgdXBsb2FkaW5nIHZlcnRpY2VzIHRvIHRoZSBHUFUuXG4gICAgICAgIC8vIFRvIGluc3RydW1lbnQgdGhhdCwgd2UnZCBuZWVkIHRvIHBhc3MgdGhlIGxheWVyVGltZXJzIG9iamVjdCBkb3duIGludG8gdGhlIGJ1Y2tldFxuICAgICAgICAvLyB1cGxvYWRpbmcgbG9naWMuXG4gICAgICAgIGxldCBsYXllclRpbWVyID0gdGhpcy5ncHVUaW1lcnNbbGF5ZXIuaWRdO1xuICAgICAgICBpZiAoIWxheWVyVGltZXIpIHtcbiAgICAgICAgICAgIGxheWVyVGltZXIgPSB0aGlzLmdwdVRpbWVyc1tsYXllci5pZF0gPSB7XG4gICAgICAgICAgICAgICAgY2FsbHM6IDAsXG4gICAgICAgICAgICAgICAgY3B1VGltZTogMCxcbiAgICAgICAgICAgICAgICBxdWVyeTogZXh0LmNyZWF0ZVF1ZXJ5RVhUKClcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbGF5ZXJUaW1lci5jYWxscysrO1xuICAgICAgICBleHQuYmVnaW5RdWVyeUVYVChleHQuVElNRV9FTEFQU0VEX0VYVCwgbGF5ZXJUaW1lci5xdWVyeSk7XG4gICAgfVxuXG4gICAgZ3B1VGltaW5nRW5kKCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncHVUaW1pbmcpIHJldHVybjtcbiAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5jb250ZXh0LmV4dFRpbWVyUXVlcnk7XG4gICAgICAgIGV4dC5lbmRRdWVyeUVYVChleHQuVElNRV9FTEFQU0VEX0VYVCk7XG4gICAgfVxuXG4gICAgY29sbGVjdEdwdVRpbWVycygpIHtcbiAgICAgICAgY29uc3QgY3VycmVudExheWVyVGltZXJzID0gdGhpcy5ncHVUaW1lcnM7XG4gICAgICAgIHRoaXMuZ3B1VGltZXJzID0ge307XG4gICAgICAgIHJldHVybiBjdXJyZW50TGF5ZXJUaW1lcnM7XG4gICAgfVxuXG4gICAgcXVlcnlHcHVUaW1lcnMoZ3B1VGltZXJzOiB7W186IHN0cmluZ106IGFueX0pIHtcbiAgICAgICAgY29uc3QgbGF5ZXJzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiBncHVUaW1lcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGdwdVRpbWVyID0gZ3B1VGltZXJzW2xheWVySWRdO1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5jb250ZXh0LmV4dFRpbWVyUXVlcnk7XG4gICAgICAgICAgICBjb25zdCBncHVUaW1lID0gZXh0LmdldFF1ZXJ5T2JqZWN0RVhUKGdwdVRpbWVyLnF1ZXJ5LCBleHQuUVVFUllfUkVTVUxUX0VYVCkgLyAoMTAwMCAqIDEwMDApO1xuICAgICAgICAgICAgZXh0LmRlbGV0ZVF1ZXJ5RVhUKGdwdVRpbWVyLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxheWVyc1tsYXllcklkXSA9IGdwdVRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gYSBtYXRyaXggdG8gaW5jb3Jwb3JhdGUgdGhlICotdHJhbnNsYXRlIGFuZCAqLXRyYW5zbGF0ZS1hbmNob3IgcHJvcGVydGllcyBpbnRvIGl0LlxuICAgICAqIEBwYXJhbSBpblZpZXdwb3J0UGl4ZWxVbml0c1VuaXRzIFRydWUgd2hlbiB0aGUgdW5pdHMgYWNjZXB0ZWQgYnkgdGhlIG1hdHJpeCBhcmUgaW4gdmlld3BvcnQgcGl4ZWxzIGluc3RlYWQgb2YgdGlsZSB1bml0cy5cbiAgICAgKiBAcmV0dXJucyB7RmxvYXQzMkFycmF5fSBtYXRyaXhcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRyYW5zbGF0ZVBvc01hdHJpeChtYXRyaXg6IEZsb2F0MzJBcnJheSwgdGlsZTogVGlsZSwgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdLCB0cmFuc2xhdGVBbmNob3I6ICdtYXAnIHwgJ3ZpZXdwb3J0JywgaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cz86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0cmFuc2xhdGVbMF0gJiYgIXRyYW5zbGF0ZVsxXSkgcmV0dXJuIG1hdHJpeDtcblxuICAgICAgICBjb25zdCBhbmdsZSA9IGluVmlld3BvcnRQaXhlbFVuaXRzVW5pdHMgP1xuICAgICAgICAgICAgKHRyYW5zbGF0ZUFuY2hvciA9PT0gJ21hcCcgPyB0aGlzLnRyYW5zZm9ybS5hbmdsZSA6IDApIDpcbiAgICAgICAgICAgICh0cmFuc2xhdGVBbmNob3IgPT09ICd2aWV3cG9ydCcgPyAtdGhpcy50cmFuc2Zvcm0uYW5nbGUgOiAwKTtcblxuICAgICAgICBpZiAoYW5nbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNpbkEgPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgICAgICAgICBjb25zdCBjb3NBID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgICAgICAgdHJhbnNsYXRlID0gW1xuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVswXSAqIGNvc0EgLSB0cmFuc2xhdGVbMV0gKiBzaW5BLFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVswXSAqIHNpbkEgKyB0cmFuc2xhdGVbMV0gKiBjb3NBXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSBbXG4gICAgICAgICAgICBpblZpZXdwb3J0UGl4ZWxVbml0c1VuaXRzID8gdHJhbnNsYXRlWzBdIDogcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgdHJhbnNsYXRlWzBdLCB0aGlzLnRyYW5zZm9ybS56b29tKSxcbiAgICAgICAgICAgIGluVmlld3BvcnRQaXhlbFVuaXRzVW5pdHMgPyB0cmFuc2xhdGVbMV0gOiBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCB0cmFuc2xhdGVbMV0sIHRoaXMudHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAgICAgMFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRNYXRyaXggPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUodHJhbnNsYXRlZE1hdHJpeCwgbWF0cml4LCB0cmFuc2xhdGlvbik7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVkTWF0cml4O1xuICAgIH1cblxuICAgIHNhdmVUaWxlVGV4dHVyZSh0ZXh0dXJlOiBUZXh0dXJlKSB7XG4gICAgICAgIGNvbnN0IHRleHR1cmVzID0gdGhpcy5fdGlsZVRleHR1cmVzW3RleHR1cmUuc2l6ZVswXV07XG4gICAgICAgIGlmICghdGV4dHVyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVUZXh0dXJlc1t0ZXh0dXJlLnNpemVbMF1dID0gW3RleHR1cmVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGV4dHVyZXMucHVzaCh0ZXh0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFRpbGVUZXh0dXJlKHNpemU6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0ZXh0dXJlcyA9IHRoaXMuX3RpbGVUZXh0dXJlc1tzaXplXTtcbiAgICAgICAgcmV0dXJuIHRleHR1cmVzICYmIHRleHR1cmVzLmxlbmd0aCA+IDAgPyB0ZXh0dXJlcy5wb3AoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgYSBwYXR0ZXJuIGltYWdlIGlzIG5lZWRlZCwgYW5kIGlmIGl0IGlzLCB3aGV0aGVyIGl0IGlzIG5vdCBsb2FkZWQuXG4gICAgICpcbiogQHJldHVybnMgdHJ1ZSBpZiBhIG5lZWRlZCBpbWFnZSBpcyBtaXNzaW5nIGFuZCByZW5kZXJpbmcgbmVlZHMgdG8gYmUgc2tpcHBlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGlzUGF0dGVybk1pc3NpbmcoaW1hZ2U6ID9Dcm9zc0ZhZGVkPFJlc29sdmVkSW1hZ2U+KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghaW1hZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFpbWFnZS5mcm9tIHx8ICFpbWFnZS50bykgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGltYWdlUG9zQSA9IHRoaXMuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4oaW1hZ2UuZnJvbS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3QgaW1hZ2VQb3NCID0gdGhpcy5pbWFnZU1hbmFnZXIuZ2V0UGF0dGVybihpbWFnZS50by50b1N0cmluZygpKTtcbiAgICAgICAgcmV0dXJuICFpbWFnZVBvc0EgfHwgIWltYWdlUG9zQjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zICNkZWZpbmVzIHRoYXQgd291bGQgbmVlZCB0byBiZSBpbmplY3RlZCBpbnRvIGV2ZXJ5IFByb2dyYW1cbiAgICAgKiBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiBQYWludGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY3VycmVudEdsb2JhbERlZmluZXMoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCB0ZXJyYWluID0gdGhpcy50ZXJyYWluICYmICF0aGlzLnRlcnJhaW4ucmVuZGVyaW5nVG9UZXh0dXJlOyAvLyBFbmFibGVzIGVsZXZhdGlvbiBzYW1wbGluZyBpbiB2ZXJ0ZXggc2hhZGVyLlxuICAgICAgICBjb25zdCBydHQgPSB0aGlzLnRlcnJhaW4gJiYgdGhpcy50ZXJyYWluLnJlbmRlcmluZ1RvVGV4dHVyZTtcbiAgICAgICAgY29uc3QgZm9nID0gdGhpcy5zdHlsZSAmJiB0aGlzLnN0eWxlLmZvZztcbiAgICAgICAgY29uc3QgZGVmaW5lcyA9IFtdO1xuXG4gICAgICAgIGlmICh0ZXJyYWluKSBkZWZpbmVzLnB1c2goJ1RFUlJBSU4nKTtcbiAgICAgICAgLy8gV2hlbiB0ZXJyYWluIGlzIGFjdGl2ZSwgZm9nIGlzIHJlbmRlcmVkIGFzIHBhcnQgb2YgZHJhcGluZywgbm90IGFzIHBhcnQgb2YgdGlsZVxuICAgICAgICAvLyByZW5kZXJpbmcuIFJlbW92aW5nIHRoZSBmb2cgZmxhZyBkdXJpbmcgdGlsZSByZW5kZXJpbmcgYXZvaWRzIGFkZGl0aW9uYWwgZGVmaW5lcy5cbiAgICAgICAgaWYgKGZvZyAmJiAhcnR0ICYmIGZvZy5nZXRPcGFjaXR5KHRoaXMudHJhbnNmb3JtLnBpdGNoKSAhPT0gMC4wKSB7XG4gICAgICAgICAgICBkZWZpbmVzLnB1c2goJ0ZPRycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydHQpIGRlZmluZXMucHVzaCgnUkVOREVSX1RPX1RFWFRVUkUnKTtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvcikgZGVmaW5lcy5wdXNoKCdPVkVSRFJBV19JTlNQRUNUT1InKTtcbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG4gICAgfVxuXG4gICAgdXNlUHJvZ3JhbShuYW1lOiBzdHJpbmcsIHByb2dyYW1Db25maWd1cmF0aW9uOiA/UHJvZ3JhbUNvbmZpZ3VyYXRpb24sIGZpeGVkRGVmaW5lczogP0R5bmFtaWNEZWZpbmVzVHlwZVtdKTogUHJvZ3JhbTxhbnk+IHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUgfHwge307XG4gICAgICAgIGNvbnN0IGRlZmluZXMgPSAoKChmaXhlZERlZmluZXMgfHwgW10pOiBhbnkpOiBzdHJpbmdbXSk7XG5cbiAgICAgICAgY29uc3QgZ2xvYmFsRGVmaW5lcyA9IHRoaXMuY3VycmVudEdsb2JhbERlZmluZXMoKTtcbiAgICAgICAgY29uc3QgYWxsRGVmaW5lcyA9IGdsb2JhbERlZmluZXMuY29uY2F0KGRlZmluZXMpO1xuICAgICAgICBjb25zdCBrZXkgPSBQcm9ncmFtLmNhY2hlS2V5KG5hbWUsIGFsbERlZmluZXMsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcblxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVtrZXldID0gbmV3IFByb2dyYW0odGhpcy5jb250ZXh0LCBuYW1lLCBzaGFkZXJzW25hbWVdLCBwcm9ncmFtQ29uZmlndXJhdGlvbiwgcHJvZ3JhbVVuaWZvcm1zW25hbWVdLCBhbGxEZWZpbmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogUmVzZXQgc29tZSBHTCBzdGF0ZSB0byBkZWZhdWx0IHZhbHVlcyB0byBhdm9pZCBoYXJkLXRvLWRlYnVnIGJ1Z3NcbiAgICAgKiBpbiBjdXN0b20gbGF5ZXJzLlxuICAgICAqL1xuICAgIHNldEN1c3RvbUxheWVyRGVmYXVsdHMoKSB7XG4gICAgICAgIC8vIFByZXZlbnQgY3VzdG9tIGxheWVycyBmcm9tIHVuaW50ZW50aW9uYWxseSBtb2RpZnkgdGhlIGxhc3QgVkFPIHVzZWQuXG4gICAgICAgIC8vIEFsbCBvdGhlciBzdGF0ZSBpcyBzdGF0ZSBpcyByZXN0b3JlZCBvbiBpdCdzIG93biwgYnV0IGZvciBWQU9zIGl0J3NcbiAgICAgICAgLy8gc2ltcGxlciB0byB1bmJpbmQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHRyYWNrIHRoZSBzdGF0ZSBvZiBWQU9zLlxuICAgICAgICB0aGlzLmNvbnRleHQudW5iaW5kVkFPKCk7XG5cbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGlzIHN0YXRlIGlzIG1lYW5pbmdmdWwgYW5kIG9mdGVuIGV4cGVjdGVkLlxuICAgICAgICAvLyBMZWF2aW5nIHRoaXMgc3RhdGUgZGlydHkgY291bGQgY2F1c2UgYSBsb3Qgb2YgY29uZnVzaW9uIGZvciB1c2Vycy5cbiAgICAgICAgdGhpcy5jb250ZXh0LmN1bGxGYWNlLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZyb250RmFjZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5jdWxsRmFjZVNpZGUuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5waXhlbFN0b3JlVW5wYWNrLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tGbGlwWS5zZXREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBTZXQgR0wgc3RhdGUgdGhhdCBpcyBzaGFyZWQgYnkgYWxsIGxheWVycy5cbiAgICAgKi9cbiAgICBzZXRCYXNlU3RhdGUoKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmNvbnRleHQuY3VsbEZhY2Uuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJsZW5kRXF1YXRpb24uc2V0KGdsLkZVTkNfQUREKTtcbiAgICB9XG5cbiAgICBpbml0RGVidWdPdmVybGF5Q2FudmFzKCkge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICB0aGlzLmRlYnVnT3ZlcmxheUNhbnZhcy53aWR0aCA9IDUxMjtcbiAgICAgICAgICAgIHRoaXMuZGVidWdPdmVybGF5Q2FudmFzLmhlaWdodCA9IDUxMjtcbiAgICAgICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICAgICAgdGhpcy5kZWJ1Z092ZXJsYXlUZXh0dXJlID0gbmV3IFRleHR1cmUodGhpcy5jb250ZXh0LCB0aGlzLmRlYnVnT3ZlcmxheUNhbnZhcywgZ2wuUkdCQSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5fdGVycmFpbikge1xuICAgICAgICAgICAgdGhpcy5fdGVycmFpbi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ2xvYmVTaGFyZWRCdWZmZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmdsb2JlU2hhcmVkQnVmZmVycy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbXB0eVRleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5kZWJ1Z092ZXJsYXlUZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnT3ZlcmxheVRleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJlcGFyZURyYXdUaWxlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgICAgICBpZiAodGhpcy50ZXJyYWluKSB7XG4gICAgICAgICAgICB0aGlzLnRlcnJhaW4ucHJlcGFyZURyYXdUaWxlKHRpbGVJRCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dDogQ29udGV4dCwgcHJvZ3JhbTogUHJvZ3JhbTwqPiwgdGlsZUlEOiA/VW53cmFwcGVkVGlsZUlEKSB7XG5cbiAgICAgICAgLy8gRm9nIGlzIG5vdCBlbmFibGVkIHdoZW4gcmVuZGVyaW5nIHRvIHRleHR1cmUgc28gd2VcbiAgICAgICAgLy8gY2FuIHNhZmVseSBza2lwIHVwbG9hZGluZyB1bmlmb3JtcyBpbiB0aGF0IGNhc2VcbiAgICAgICAgaWYgKHRoaXMudGVycmFpbiAmJiB0aGlzLnRlcnJhaW4ucmVuZGVyaW5nVG9UZXh0dXJlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb2cgPSB0aGlzLnN0eWxlLmZvZztcblxuICAgICAgICBpZiAoZm9nKSB7XG4gICAgICAgICAgICBjb25zdCBmb2dPcGFjaXR5ID0gZm9nLmdldE9wYWNpdHkodGhpcy50cmFuc2Zvcm0ucGl0Y2gpO1xuICAgICAgICAgICAgaWYgKGZvZ09wYWNpdHkgIT09IDAuMCkge1xuICAgICAgICAgICAgICAgIHByb2dyYW0uc2V0Rm9nVW5pZm9ybVZhbHVlcyhjb250ZXh0LCBmb2dVbmlmb3JtVmFsdWVzKHRoaXMsIGZvZywgdGlsZUlELCBmb2dPcGFjaXR5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRUaWxlTG9hZGVkRmxhZyhmbGFnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudGlsZUxvYWRlZCA9IGZsYWc7XG4gICAgfVxuXG4gICAgc2F2ZUNhbnZhc0NvcHkoKSB7XG4gICAgICAgIHRoaXMuZnJhbWVDb3BpZXMucHVzaCh0aGlzLmNhbnZhc0NvcHkoKSk7XG4gICAgICAgIHRoaXMudGlsZUxvYWRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNhbnZhc0NvcHkoKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICBjb25zdCB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTtcbiAgICAgICAgZ2wuY29weVRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgMCwgMCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0LCAwKTtcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XG4gICAgfVxuXG4gICAgZ2V0Q2FudmFzQ29waWVzQW5kVGltZXN0YW1wcygpOiBDYW52YXNDb3B5SW5zdGFuY2VzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhbnZhc0NvcGllczogdGhpcy5mcmFtZUNvcGllcyxcbiAgICAgICAgICAgIHRpbWVTdGFtcHM6IHRoaXMubG9hZFRpbWVTdGFtcHNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhdmVyYWdlRWxldmF0aW9uTmVlZHNFYXNpbmcoKSB7XG4gICAgICAgIGlmICghdGhpcy50cmFuc2Zvcm0uX2VsZXZhdGlvbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGZvZyA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5mb2c7XG4gICAgICAgIGlmICghZm9nKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZm9nT3BhY2l0eSA9IGZvZy5nZXRPcGFjaXR5KHRoaXMudHJhbnNmb3JtLnBpdGNoKTtcbiAgICAgICAgaWYgKGZvZ09wYWNpdHkgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRCYWNrZ3JvdW5kVGlsZXMoKSB7XG4gICAgICAgIGNvbnN0IG9sZFRpbGVzID0gdGhpcy5fYmFja2dyb3VuZFRpbGVzO1xuICAgICAgICBjb25zdCBuZXdUaWxlcyA9IHRoaXMuX2JhY2tncm91bmRUaWxlcyA9IHt9O1xuXG4gICAgICAgIGNvbnN0IHRpbGVTaXplID0gNTEyO1xuICAgICAgICBjb25zdCB0aWxlSURzID0gdGhpcy50cmFuc2Zvcm0uY292ZXJpbmdUaWxlcyh7dGlsZVNpemV9KTtcbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgdGlsZUlEcykge1xuICAgICAgICAgICAgbmV3VGlsZXNbdGlsZUlELmtleV0gPSBvbGRUaWxlc1t0aWxlSUQua2V5XSB8fCBuZXcgVGlsZSh0aWxlSUQsIHRpbGVTaXplLCB0aGlzLnRyYW5zZm9ybS50aWxlWm9vbSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1RpbGVzO1xuICAgIH1cblxuICAgIGNsZWFyQmFja2dyb3VuZFRpbGVzKCkge1xuICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kVGlsZXMgPSB7fTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhaW50ZXI7XG4iLCIvLyBAZmxvdyBzdHJpY3RcblxuLyoqXG4gKiBUaHJvdHRsZSB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gcnVuIGF0IG1vc3QgZXZlcnkgYHBlcmlvZGAgbWlsbGlzZWNvbmRzLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGhyb3R0bGUoZm46ICgpID0+IHZvaWQsIHRpbWU6IG51bWJlcik6ICgpID0+ID9UaW1lb3V0SUQge1xuICAgIGxldCBwZW5kaW5nID0gZmFsc2U7XG4gICAgbGV0IHRpbWVySWQ6ID9UaW1lb3V0SUQgPSBudWxsO1xuXG4gICAgY29uc3QgbGF0ZXIgPSAoKSA9PiB7XG4gICAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KGxhdGVyLCB0aW1lKTtcbiAgICAgICAgICAgIHBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBwZW5kaW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aW1lcklkKSB7XG4gICAgICAgICAgICBsYXRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aW1lcklkO1xuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2JpbmRBbGx9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcbmltcG9ydCB0aHJvdHRsZSBmcm9tICcuLi91dGlsL3Rocm90dGxlLmpzJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4vbWFwLmpzJztcblxuLypcbiAqIEFkZHMgdGhlIG1hcCdzIHBvc2l0aW9uIHRvIGl0cyBwYWdlJ3MgbG9jYXRpb24gaGFzaC5cbiAqIFBhc3NlZCBhcyBhbiBvcHRpb24gdG8gdGhlIG1hcCBvYmplY3QuXG4gKlxuICogQHJldHVybnMge0hhc2h9IGB0aGlzYFxuICovXG5jbGFzcyBIYXNoIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX3VwZGF0ZUhhc2g6ICgpID0+ID9UaW1lb3V0SUQ7XG4gICAgX2hhc2hOYW1lOiA/c3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoaGFzaE5hbWU6ID9zdHJpbmcpIHtcbiAgICAgICAgdGhpcy5faGFzaE5hbWUgPSBoYXNoTmFtZSAmJiBlbmNvZGVVUklDb21wb25lbnQoaGFzaE5hbWUpO1xuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfZ2V0Q3VycmVudEhhc2gnLFxuICAgICAgICAgICAgJ19vbkhhc2hDaGFuZ2UnLFxuICAgICAgICAgICAgJ191cGRhdGVIYXNoJ1xuICAgICAgICBdLCB0aGlzKTtcblxuICAgICAgICAvLyBNb2JpbGUgU2FmYXJpIGRvZXNuJ3QgYWxsb3cgdXBkYXRpbmcgdGhlIGhhc2ggbW9yZSB0aGFuIDEwMCB0aW1lcyBwZXIgMzAgc2Vjb25kcy5cbiAgICAgICAgdGhpcy5fdXBkYXRlSGFzaCA9IHRocm90dGxlKHRoaXMuX3VwZGF0ZUhhc2hVbnRocm90dGxlZC5iaW5kKHRoaXMpLCAzMCAqIDEwMDAgLyAxMDApO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogTWFwIGVsZW1lbnQgdG8gbGlzdGVuIGZvciBjb29yZGluYXRlIGNoYW5nZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXBcbiAgICAgKiBAcmV0dXJucyB7SGFzaH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkVG8obWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuX29uSGFzaENoYW5nZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVIYXNoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZW1vdmVzIGhhc2hcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuX29uSGFzaENoYW5nZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlSGFzaCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVIYXNoKCkpO1xuXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9tYXA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGdldEhhc2hTdHJpbmcobWFwRmVlZGJhY2s/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKSxcbiAgICAgICAgICAgIHpvb20gPSBNYXRoLnJvdW5kKHRoaXMuX21hcC5nZXRab29tKCkgKiAxMDApIC8gMTAwLFxuICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIGVxdWF0aW9uOiA1MTJweCAqIDJeeiAvIDM2MCAvIDEwXmQgPCAwLjVweFxuICAgICAgICAgICAgcHJlY2lzaW9uID0gTWF0aC5jZWlsKCh6b29tICogTWF0aC5MTjIgKyBNYXRoLmxvZyg1MTIgLyAzNjAgLyAwLjUpKSAvIE1hdGguTE4xMCksXG4gICAgICAgICAgICBtID0gTWF0aC5wb3coMTAsIHByZWNpc2lvbiksXG4gICAgICAgICAgICBsbmcgPSBNYXRoLnJvdW5kKGNlbnRlci5sbmcgKiBtKSAvIG0sXG4gICAgICAgICAgICBsYXQgPSBNYXRoLnJvdW5kKGNlbnRlci5sYXQgKiBtKSAvIG0sXG4gICAgICAgICAgICBiZWFyaW5nID0gdGhpcy5fbWFwLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIHBpdGNoID0gdGhpcy5fbWFwLmdldFBpdGNoKCk7XG4gICAgICAgIGxldCBoYXNoID0gJyc7XG4gICAgICAgIGlmIChtYXBGZWVkYmFjaykge1xuICAgICAgICAgICAgLy8gbmV3IG1hcCBmZWVkYmFjayBzaXRlIGhhcyBzb21lIGNvbnN0cmFpbnRzIHRoYXQgZG9uJ3QgYWxsb3dcbiAgICAgICAgICAgIC8vIHVzIHRvIHVzZSB0aGUgc2FtZSBoYXNoIGZvcm1hdCBhcyB3ZSBkbyBmb3IgdGhlIE1hcCBoYXNoIG9wdGlvbi5cbiAgICAgICAgICAgIGhhc2ggKz0gYC8ke2xuZ30vJHtsYXR9LyR7em9vbX1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFzaCArPSBgJHt6b29tfS8ke2xhdH0vJHtsbmd9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiZWFyaW5nIHx8IHBpdGNoKSBoYXNoICs9IChgLyR7TWF0aC5yb3VuZChiZWFyaW5nICogMTApIC8gMTB9YCk7XG4gICAgICAgIGlmIChwaXRjaCkgaGFzaCArPSAoYC8ke01hdGgucm91bmQocGl0Y2gpfWApO1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNoTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaGFzaE5hbWUgPSB0aGlzLl9oYXNoTmFtZTtcbiAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSB3aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKS5zcGxpdCgnJicpLm1hcChwYXJ0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBwYXJ0LnNwbGl0KCc9JylbMF07XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gaGFzaE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7a2V5fT0ke2hhc2h9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgICAgICAgICB9KS5maWx0ZXIoYSA9PiBhKTtcbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGAke2hhc2hOYW1lfT0ke2hhc2h9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYCMke3BhcnRzLmpvaW4oJyYnKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAjJHtoYXNofWA7XG4gICAgfVxuXG4gICAgX2dldEN1cnJlbnRIYXNoKCkge1xuICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgaGFzaCBmcm9tIGxvY2F0aW9uLCBzdHJpcHBlZCBmcm9tIGl0cyBudW1iZXIgc2lnblxuICAgICAgICBjb25zdCBoYXNoID0gd2luZG93LmxvY2F0aW9uLmhhc2gucmVwbGFjZSgnIycsICcnKTtcbiAgICAgICAgaWYgKHRoaXMuX2hhc2hOYW1lKSB7XG4gICAgICAgICAgICAvLyBTcGxpdCB0aGUgcGFyYW1ldGVyLXN0eWxlZCBoYXNoIGludG8gcGFydHMgYW5kIGZpbmQgdGhlIHZhbHVlIHdlIG5lZWRcbiAgICAgICAgICAgIGxldCBrZXl2YWw7XG4gICAgICAgICAgICBoYXNoLnNwbGl0KCcmJykubWFwKFxuICAgICAgICAgICAgICAgIHBhcnQgPT4gcGFydC5zcGxpdCgnPScpXG4gICAgICAgICAgICApLmZvckVhY2gocGFydCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRbMF0gPT09IHRoaXMuX2hhc2hOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXZhbCA9IHBhcnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gKGtleXZhbCA/IGtleXZhbFsxXSB8fCAnJyA6ICcnKS5zcGxpdCgnLycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNoLnNwbGl0KCcvJyk7XG4gICAgfVxuXG4gICAgX29uSGFzaENoYW5nZSgpIHtcbiAgICAgICAgY29uc3QgbG9jID0gdGhpcy5fZ2V0Q3VycmVudEhhc2goKTtcbiAgICAgICAgaWYgKGxvYy5sZW5ndGggPj0gMyAmJiAhbG9jLnNvbWUodiA9PiBpc05hTih2KSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlYXJpbmcgPSB0aGlzLl9tYXAuZHJhZ1JvdGF0ZS5pc0VuYWJsZWQoKSAmJiB0aGlzLl9tYXAudG91Y2hab29tUm90YXRlLmlzRW5hYmxlZCgpID8gKyhsb2NbM10gfHwgMCkgOiB0aGlzLl9tYXAuZ2V0QmVhcmluZygpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLmp1bXBUbyh7XG4gICAgICAgICAgICAgICAgY2VudGVyOiBbK2xvY1syXSwgK2xvY1sxXV0sXG4gICAgICAgICAgICAgICAgem9vbTogK2xvY1swXSxcbiAgICAgICAgICAgICAgICBiZWFyaW5nLFxuICAgICAgICAgICAgICAgIHBpdGNoOiArKGxvY1s0XSB8fCAwKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUhhc2hVbnRocm90dGxlZCgpIHtcbiAgICAgICAgLy8gUmVwbGFjZSBpZiBhbHJlYWR5IHByZXNlbnQsIGVsc2UgYXBwZW5kIHRoZSB1cGRhdGVkIGhhc2ggc3RyaW5nXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgvKCMuKyk/JC8sIHRoaXMuZ2V0SGFzaFN0cmluZygpKTtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHdpbmRvdy5oaXN0b3J5LnN0YXRlLCBudWxsLCBsb2NhdGlvbik7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEhhc2g7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4vbWFwLmpzJztcbmltcG9ydCB7YmV6aWVyLCBjbGFtcCwgZXh0ZW5kfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0RyYWdQYW5PcHRpb25zfSBmcm9tICcuL2hhbmRsZXIvc2hpbS9kcmFnX3Bhbi5qcyc7XG5cbmNvbnN0IGRlZmF1bHRJbmVydGlhT3B0aW9ucyA9IHtcbiAgICBsaW5lYXJpdHk6IDAuMyxcbiAgICBlYXNpbmc6IGJlemllcigwLCAwLCAwLjMsIDEpLFxufTtcblxuY29uc3QgZGVmYXVsdFBhbkluZXJ0aWFPcHRpb25zID0gZXh0ZW5kKHtcbiAgICBkZWNlbGVyYXRpb246IDI1MDAsXG4gICAgbWF4U3BlZWQ6IDE0MDBcbn0sIGRlZmF1bHRJbmVydGlhT3B0aW9ucyk7XG5cbmNvbnN0IGRlZmF1bHRab29tSW5lcnRpYU9wdGlvbnMgPSBleHRlbmQoe1xuICAgIGRlY2VsZXJhdGlvbjogMjAsXG4gICAgbWF4U3BlZWQ6IDE0MDBcbn0sIGRlZmF1bHRJbmVydGlhT3B0aW9ucyk7XG5cbmNvbnN0IGRlZmF1bHRCZWFyaW5nSW5lcnRpYU9wdGlvbnMgPSBleHRlbmQoe1xuICAgIGRlY2VsZXJhdGlvbjogMTAwMCxcbiAgICBtYXhTcGVlZDogMzYwXG59LCBkZWZhdWx0SW5lcnRpYU9wdGlvbnMpO1xuXG5jb25zdCBkZWZhdWx0UGl0Y2hJbmVydGlhT3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgZGVjZWxlcmF0aW9uOiAxMDAwLFxuICAgIG1heFNwZWVkOiA5MFxufSwgZGVmYXVsdEluZXJ0aWFPcHRpb25zKTtcblxuZXhwb3J0IHR5cGUgSW5lcnRpYU9wdGlvbnMgPSB7XG4gICAgbGluZWFyaXR5OiBudW1iZXI7XG4gICAgZWFzaW5nOiAodDogbnVtYmVyKSA9PiBudW1iZXI7XG4gICAgZGVjZWxlcmF0aW9uOiBudW1iZXI7XG4gICAgbWF4U3BlZWQ6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIElucHV0RXZlbnQgPSBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IEtleWJvYXJkRXZlbnQgfCBXaGVlbEV2ZW50O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIYW5kbGVySW5lcnRpYSB7XG4gICAgX21hcDogTWFwO1xuICAgIF9pbmVydGlhQnVmZmVyOiBBcnJheTx7IHRpbWU6IG51bWJlciwgc2V0dGluZ3M6IE9iamVjdCB9PjtcblxuICAgIGNvbnN0cnVjdG9yKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLl9pbmVydGlhQnVmZmVyID0gW107XG4gICAgfVxuXG4gICAgcmVjb3JkKHNldHRpbmdzOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuX2luZXJ0aWFCdWZmZXIucHVzaCh7dGltZTogYnJvd3Nlci5ub3coKSwgc2V0dGluZ3N9KTtcbiAgICB9XG5cbiAgICBfZHJhaW5JbmVydGlhQnVmZmVyKCkge1xuICAgICAgICBjb25zdCBpbmVydGlhID0gdGhpcy5faW5lcnRpYUJ1ZmZlcixcbiAgICAgICAgICAgIG5vdyA9IGJyb3dzZXIubm93KCksXG4gICAgICAgICAgICBjdXRvZmYgPSAxNjA7ICAgLy9tc2VjXG5cbiAgICAgICAgd2hpbGUgKGluZXJ0aWEubGVuZ3RoID4gMCAmJiBub3cgLSBpbmVydGlhWzBdLnRpbWUgPiBjdXRvZmYpXG4gICAgICAgICAgICBpbmVydGlhLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgX29uTW92ZUVuZChwYW5JbmVydGlhT3B0aW9ucz86IERyYWdQYW5PcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpO1xuICAgICAgICBpZiAodGhpcy5faW5lcnRpYUJ1ZmZlci5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWx0YXMgPSB7XG4gICAgICAgICAgICB6b29tOiAwLFxuICAgICAgICAgICAgYmVhcmluZzogMCxcbiAgICAgICAgICAgIHBpdGNoOiAwLFxuICAgICAgICAgICAgcGFuOiBuZXcgUG9pbnQoMCwgMCksXG4gICAgICAgICAgICBwaW5jaEFyb3VuZDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXJvdW5kOiB1bmRlZmluZWRcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGNvbnN0IHtzZXR0aW5nc30gb2YgdGhpcy5faW5lcnRpYUJ1ZmZlcikge1xuICAgICAgICAgICAgZGVsdGFzLnpvb20gKz0gc2V0dGluZ3Muem9vbURlbHRhIHx8IDA7XG4gICAgICAgICAgICBkZWx0YXMuYmVhcmluZyArPSBzZXR0aW5ncy5iZWFyaW5nRGVsdGEgfHwgMDtcbiAgICAgICAgICAgIGRlbHRhcy5waXRjaCArPSBzZXR0aW5ncy5waXRjaERlbHRhIHx8IDA7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MucGFuRGVsdGEpIGRlbHRhcy5wYW4uX2FkZChzZXR0aW5ncy5wYW5EZWx0YSk7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuYXJvdW5kKSBkZWx0YXMuYXJvdW5kID0gc2V0dGluZ3MuYXJvdW5kO1xuICAgICAgICAgICAgaWYgKHNldHRpbmdzLnBpbmNoQXJvdW5kKSBkZWx0YXMucGluY2hBcm91bmQgPSBzZXR0aW5ncy5waW5jaEFyb3VuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RFbnRyeSA9IHRoaXMuX2luZXJ0aWFCdWZmZXJbdGhpcy5faW5lcnRpYUJ1ZmZlci5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSAobGFzdEVudHJ5LnRpbWUgLSB0aGlzLl9pbmVydGlhQnVmZmVyWzBdLnRpbWUpO1xuXG4gICAgICAgIGNvbnN0IGVhc2VPcHRpb25zID0ge307XG5cbiAgICAgICAgaWYgKGRlbHRhcy5wYW4ubWFnKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGN1bGF0ZUVhc2luZyhkZWx0YXMucGFuLm1hZygpLCBkdXJhdGlvbiwgZXh0ZW5kKHt9LCBkZWZhdWx0UGFuSW5lcnRpYU9wdGlvbnMsIHBhbkluZXJ0aWFPcHRpb25zIHx8IHt9KSk7XG4gICAgICAgICAgICBlYXNlT3B0aW9ucy5vZmZzZXQgPSBkZWx0YXMucGFuLm11bHQocmVzdWx0LmFtb3VudCAvIGRlbHRhcy5wYW4ubWFnKCkpO1xuICAgICAgICAgICAgZWFzZU9wdGlvbnMuY2VudGVyID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5jZW50ZXI7XG4gICAgICAgICAgICBleHRlbmREdXJhdGlvbihlYXNlT3B0aW9ucywgcmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWx0YXMuem9vbSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FsY3VsYXRlRWFzaW5nKGRlbHRhcy56b29tLCBkdXJhdGlvbiwgZGVmYXVsdFpvb21JbmVydGlhT3B0aW9ucyk7XG4gICAgICAgICAgICBlYXNlT3B0aW9ucy56b29tID0gdGhpcy5fbWFwLnRyYW5zZm9ybS56b29tICsgcmVzdWx0LmFtb3VudDtcbiAgICAgICAgICAgIGV4dGVuZER1cmF0aW9uKGVhc2VPcHRpb25zLCByZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlbHRhcy5iZWFyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxjdWxhdGVFYXNpbmcoZGVsdGFzLmJlYXJpbmcsIGR1cmF0aW9uLCBkZWZhdWx0QmVhcmluZ0luZXJ0aWFPcHRpb25zKTtcbiAgICAgICAgICAgIGVhc2VPcHRpb25zLmJlYXJpbmcgPSB0aGlzLl9tYXAudHJhbnNmb3JtLmJlYXJpbmcgKyBjbGFtcChyZXN1bHQuYW1vdW50LCAtMTc5LCAxNzkpO1xuICAgICAgICAgICAgZXh0ZW5kRHVyYXRpb24oZWFzZU9wdGlvbnMsIHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVsdGFzLnBpdGNoKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxjdWxhdGVFYXNpbmcoZGVsdGFzLnBpdGNoLCBkdXJhdGlvbiwgZGVmYXVsdFBpdGNoSW5lcnRpYU9wdGlvbnMpO1xuICAgICAgICAgICAgZWFzZU9wdGlvbnMucGl0Y2ggPSB0aGlzLl9tYXAudHJhbnNmb3JtLnBpdGNoICsgcmVzdWx0LmFtb3VudDtcbiAgICAgICAgICAgIGV4dGVuZER1cmF0aW9uKGVhc2VPcHRpb25zLCByZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVhc2VPcHRpb25zLnpvb20gfHwgZWFzZU9wdGlvbnMuYmVhcmluZykge1xuICAgICAgICAgICAgY29uc3QgbGFzdCA9IGRlbHRhcy5waW5jaEFyb3VuZCA9PT0gdW5kZWZpbmVkID8gZGVsdGFzLmFyb3VuZCA6IGRlbHRhcy5waW5jaEFyb3VuZDtcbiAgICAgICAgICAgIGVhc2VPcHRpb25zLmFyb3VuZCA9IGxhc3QgPyB0aGlzLl9tYXAudW5wcm9qZWN0KGxhc3QpIDogdGhpcy5fbWFwLmdldENlbnRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICByZXR1cm4gZXh0ZW5kKGVhc2VPcHRpb25zLCB7XG4gICAgICAgICAgICBub01vdmVTdGFydDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgIH1cbn1cblxuLy8gVW5mb3J0dW5hdGVseSB6b29tLCBiZWFyaW5nLCBldGMgY2FuJ3QgaGF2ZSBkaWZmZXJlbnQgZHVyYXRpb25zIGFuZCBlYXNpbmdzIHNvXG4vLyB3ZSBuZWVkIHRvIGNob29zZSBvbmUuIFdlIHVzZSB0aGUgbG9uZ2VzdCBkdXJhdGlvbiBhbmQgaXQncyBjb3JyZXNwb25kaW5nIGVhc2luZy5cbmZ1bmN0aW9uIGV4dGVuZER1cmF0aW9uKGVhc2VPcHRpb25zLCByZXN1bHQpIHtcbiAgICBpZiAoIWVhc2VPcHRpb25zLmR1cmF0aW9uIHx8IGVhc2VPcHRpb25zLmR1cmF0aW9uIDwgcmVzdWx0LmR1cmF0aW9uKSB7XG4gICAgICAgIGVhc2VPcHRpb25zLmR1cmF0aW9uID0gcmVzdWx0LmR1cmF0aW9uO1xuICAgICAgICBlYXNlT3B0aW9ucy5lYXNpbmcgPSByZXN1bHQuZWFzaW5nO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlRWFzaW5nKGFtb3VudCwgaW5lcnRpYUR1cmF0aW9uOiBudW1iZXIsIGluZXJ0aWFPcHRpb25zKSB7XG4gICAgY29uc3Qge21heFNwZWVkLCBsaW5lYXJpdHksIGRlY2VsZXJhdGlvbn0gPSBpbmVydGlhT3B0aW9ucztcbiAgICBjb25zdCBzcGVlZCA9IGNsYW1wKFxuICAgICAgICBhbW91bnQgKiBsaW5lYXJpdHkgLyAoaW5lcnRpYUR1cmF0aW9uIC8gMTAwMCksXG4gICAgICAgIC1tYXhTcGVlZCxcbiAgICAgICAgbWF4U3BlZWQpO1xuICAgIGNvbnN0IGR1cmF0aW9uID0gTWF0aC5hYnMoc3BlZWQpIC8gKGRlY2VsZXJhdGlvbiAqIGxpbmVhcml0eSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZWFzaW5nOiBpbmVydGlhT3B0aW9ucy5lYXNpbmcsXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbiAqIDEwMDAsXG4gICAgICAgIGFtb3VudDogc3BlZWQgKiAoZHVyYXRpb24gLyAyKVxuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuXG5pbXBvcnQgRE9NIGZyb20gJy4uL3V0aWwvZG9tLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAuanMnO1xuaW1wb3J0IHR5cGUgTG5nTGF0IGZyb20gJy4uL2dlby9sbmdfbGF0LmpzJztcblxuLyoqXG4gKiBgTWFwTW91c2VFdmVudGAgaXMgYSBjbGFzcyB1c2VkIGJ5IG90aGVyIGNsYXNzZXMgdG8gZ2VuZXJhdGVcbiAqIG1vdXNlIGV2ZW50cyBvZiBzcGVjaWZpYyB0eXBlcyBzdWNoIGFzICdjbGljaycgb3IgJ2hvdmVyJy5cbiAqIEZvciBhIGZ1bGwgbGlzdCBvZiBhdmFpbGFibGUgZXZlbnRzLCBzZWUgW2BNYXBgIGV2ZW50c10oL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKS5cbiAqXG4gKiBAZXh0ZW5kcyB7T2JqZWN0fVxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgYSBNYXBNb3VzZUV2ZW50IG9mIHR5cGUgXCJjbGlja1wiXG4gKiBtYXAub24oJ2NsaWNrJywgKGUpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZyhlKTtcbiAqICAgICAvLyB7XG4gKiAgICAgLy8gICAgIGxuZ0xhdDoge1xuICogICAgIC8vICAgICAgICAgbG5nOiA0MC4yMDMsXG4gKiAgICAgLy8gICAgICAgICBsYXQ6IC03NC40NTFcbiAqICAgICAvLyAgICAgfSxcbiAqICAgICAvLyAgICAgb3JpZ2luYWxFdmVudDogey4uLn0sXG4gKiAgICAgLy8gICAgIHBvaW50OiB7XG4gKiAgICAgLy8gICAgICAgICB4OiAyNjYsXG4gKiAgICAgLy8gICAgICAgICB5OiA0NjRcbiAqICAgICAvLyAgICAgfSxcbiAqICAgICAvLyAgICAgIHRhcmdldDogey4uLn0sXG4gKiAgICAgLy8gICAgICB0eXBlOiBcImNsaWNrXCJcbiAqICAgICAvLyB9XG4gKiB9KTtcbiAqIEBzZWUgW1JlZmVyZW5jZTogYE1hcGAgZXZlbnRzIEFQSSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvYXBpL21hcC8jbWFwLWV2ZW50cylcbiAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgcG9wdXAgb24gY2xpY2tdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcbiAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgcG9wdXAgb24gaG92ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24taG92ZXIvKVxuICovXG5leHBvcnQgY2xhc3MgTWFwTW91c2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBvcmlnaW5hdGluZyBldmVudC4gRm9yIGEgZnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBldmVudHMsIHNlZSBbYE1hcGAgZXZlbnRzXSgvbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpLlxuICAgICAqL1xuICAgIHR5cGU6ICdtb3VzZWRvd24nXG4gICAgICAgIHwgJ21vdXNldXAnXG4gICAgICAgIHwgJ3ByZWNsaWNrJ1xuICAgICAgICB8ICdjbGljaydcbiAgICAgICAgfCAnZGJsY2xpY2snXG4gICAgICAgIHwgJ21vdXNlbW92ZSdcbiAgICAgICAgfCAnbW91c2VvdmVyJ1xuICAgICAgICB8ICdtb3VzZWVudGVyJ1xuICAgICAgICB8ICdtb3VzZWxlYXZlJ1xuICAgICAgICB8ICdtb3VzZW91dCdcbiAgICAgICAgfCAnY29udGV4dG1lbnUnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBNYXBgIG9iamVjdCB0aGF0IGZpcmVkIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICB0YXJnZXQ6IE1hcDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBET00gZXZlbnQgd2hpY2ggY2F1c2VkIHRoZSBtYXAgZXZlbnQuXG4gICAgICovXG4gICAgb3JpZ2luYWxFdmVudDogTW91c2VFdmVudDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwaXhlbCBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UgY3Vyc29yLCByZWxhdGl2ZSB0byB0aGUgbWFwIGFuZCBtZWFzdXJlZCBmcm9tIHRoZSB0b3AgbGVmdCBjb3JuZXIuXG4gICAgICovXG4gICAgcG9pbnQ6IFBvaW50O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGdlb2dyYXBoaWMgbG9jYXRpb24gb24gdGhlIG1hcCBvZiB0aGUgbW91c2UgY3Vyc29yLlxuICAgICAqL1xuICAgIGxuZ0xhdDogTG5nTGF0O1xuXG4gICAgLyoqXG4gICAgICogSWYgYSBzaW5nbGUgYGxheWVySWRgKGFzIGEgc2luZ2xlIHN0cmluZykgb3IgbXVsdGlwbGUgYGxheWVySWRzYCAoYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncykgd2VyZSBzcGVjaWZpZWQgd2hlbiBhZGRpbmcgdGhlIGV2ZW50IGxpc3RlbmVyIHdpdGgge0BsaW5rIE1hcCNvbn0sXG4gICAgICogYGZlYXR1cmVzYCB3aWxsIGJlIGFuIGFycmF5IG9mIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKSBbRmVhdHVyZSBvYmplY3RzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzk0NiNzZWN0aW9uLTMuMikuXG4gICAgICogVGhlIGFycmF5IHdpbGwgY29udGFpbiBhbGwgZmVhdHVyZXMgZnJvbSB0aGF0IGxheWVyIHRoYXQgYXJlIHJlbmRlcmVkIGF0IHRoZSBldmVudCdzIHBvaW50LFxuICAgICAqIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJlbmRlcmVkIHdpdGggdGhlIHRvcG1vc3QgZmVhdHVyZSBiZWluZyBhdCB0aGUgc3RhcnQgb2YgdGhlIGFycmF5LlxuICAgICAqIFRoZSBgZmVhdHVyZXNgIGFyZSBpZGVudGljYWwgdG8gdGhvc2UgcmV0dXJuZWQgYnkge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9LlxuICAgICAqXG4gICAgICogSWYgbm8gYGxheWVySWRgIHdhcyBzcGVjaWZpZWQgd2hlbiBhZGRpbmcgdGhlIGV2ZW50IGxpc3RlbmVyLCBgZmVhdHVyZXNgIHdpbGwgYmUgYHVuZGVmaW5lZGAuXG4gICAgICogWW91IGNhbiBnZXQgdGhlIGZlYXR1cmVzIGF0IHRoZSBwb2ludCB3aXRoIGBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKGUucG9pbnQpYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gbG9nZ2luZyBmZWF0dXJlcyBmb3IgYSBzcGVjaWZpYyBsYXllciAod2l0aCBgZS5mZWF0dXJlc2ApXG4gICAgICogbWFwLm9uKCdjbGljaycsICdteUxheWVySWQnLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgVGhlcmUgYXJlICR7ZS5mZWF0dXJlcy5sZW5ndGh9IGZlYXR1cmVzIGF0IHBvaW50ICR7ZS5wb2ludH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gbG9nZ2luZyBmZWF0dXJlcyBmb3IgdHdvIGxheWVycyAod2l0aCBgZS5mZWF0dXJlc2ApXG4gICAgICogbWFwLm9uKCdjbGljaycsIFsnbGF5ZXIxJywgJ2xheWVyMiddLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgVGhlcmUgYXJlICR7ZS5mZWF0dXJlcy5sZW5ndGh9IGZlYXR1cmVzIGF0IHBvaW50ICR7ZS5wb2ludH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gbG9nZ2luZyBhbGwgZmVhdHVyZXMgZm9yIGFsbCBsYXllcnMgKHdpdGhvdXQgYGUuZmVhdHVyZXNgKVxuICAgICAqIG1hcC5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCk7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBUaGVyZSBhcmUgJHtmZWF0dXJlcy5sZW5ndGh9IGZlYXR1cmVzIGF0IHBvaW50ICR7ZS5wb2ludH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBmZWF0dXJlczogQXJyYXk8T2JqZWN0PiB8IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50cyBzdWJzZXF1ZW50IGRlZmF1bHQgcHJvY2Vzc2luZyBvZiB0aGUgZXZlbnQgYnkgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBwcmV2ZW50IHRoZSBmb2xsb3dpbmcgZGVmYXVsdCBtYXAgYmVoYXZpb3JzOlxuICAgICAqXG4gICAgICogICAqIE9uIGBtb3VzZWRvd25gIGV2ZW50cywgdGhlIGJlaGF2aW9yIG9mIHtAbGluayBEcmFnUGFuSGFuZGxlcn0uXG4gICAgICogICAqIE9uIGBtb3VzZWRvd25gIGV2ZW50cywgdGhlIGJlaGF2aW9yIG9mIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0uXG4gICAgICogICAqIE9uIGBtb3VzZWRvd25gIGV2ZW50cywgdGhlIGJlaGF2aW9yIG9mIHtAbGluayBCb3hab29tSGFuZGxlcn0uXG4gICAgICogICAqIE9uIGBkYmxjbGlja2AgZXZlbnRzLCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIERvdWJsZUNsaWNrWm9vbUhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgKiAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYHByZXZlbnREZWZhdWx0YCBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgfVxuXG4gICAgX2RlZmF1bHRQcmV2ZW50ZWQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgbWFwOiBNYXAsIG9yaWdpbmFsRXZlbnQ6IE1vdXNlRXZlbnQsIGRhdGE6IE9iamVjdCA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gRE9NLm1vdXNlUG9zKG1hcC5nZXRDYW52YXNDb250YWluZXIoKSwgb3JpZ2luYWxFdmVudCk7XG4gICAgICAgIGNvbnN0IGxuZ0xhdCA9IG1hcC51bnByb2plY3QocG9pbnQpO1xuICAgICAgICBzdXBlcih0eXBlLCBleHRlbmQoe3BvaW50LCBsbmdMYXQsIG9yaWdpbmFsRXZlbnR9LCBkYXRhKSk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50YXJnZXQgPSBtYXA7XG4gICAgfVxufVxuXG4vKipcbiAqIGBNYXBUb3VjaEV2ZW50YCBpcyBhIGNsYXNzIHVzZWQgYnkgb3RoZXIgY2xhc3NlcyB0byBnZW5lcmF0ZVxuICogbW91c2UgZXZlbnRzIG9mIHNwZWNpZmljIHR5cGVzIHN1Y2ggYXMgJ3RvdWNoc3RhcnQnIG9yICd0b3VjaGVuZCcuXG4gKiBGb3IgYSBmdWxsIGxpc3Qgb2YgYXZhaWxhYmxlIGV2ZW50cywgc2VlIFtgTWFwYCBldmVudHNdKC9tYXBib3gtZ2wtanMvYXBpL21hcC8jbWFwLWV2ZW50cykuXG4gKlxuICogQGV4dGVuZHMge09iamVjdH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiBhIE1hcFRvdWNoRXZlbnQgb2YgdHlwZSBcInRvdWNoXCJcbiAqIG1hcC5vbigndG91Y2hzdGFydCcsIChlKSA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coZSk7XG4gKiAgICAgLy8ge1xuICogICAgIC8vICAgbG5nTGF0OiB7XG4gKiAgICAgLy8gICAgICBsbmc6IDQwLjIwMyxcbiAqICAgICAvLyAgICAgIGxhdDogLTc0LjQ1MVxuICogICAgIC8vICAgfSxcbiAqICAgICAvLyAgIGxuZ0xhdHM6IFtcbiAqICAgICAvLyAgICAgIHtcbiAqICAgICAvLyAgICAgICAgIGxuZzogNDAuMjAzLFxuICogICAgIC8vICAgICAgICAgbGF0OiAtNzQuNDUxXG4gKiAgICAgLy8gICAgICB9XG4gKiAgICAgLy8gICBdLFxuICogICAgIC8vICAgb3JpZ2luYWxFdmVudDogey4uLn0sXG4gKiAgICAgLy8gICBwb2ludDoge1xuICogICAgIC8vICAgICAgeDogMjY2LFxuICogICAgIC8vICAgICAgeTogNDY0XG4gKiAgICAgLy8gICB9LFxuICogICAgIC8vICAgcG9pbnRzOiBbXG4gKiAgICAgLy8gICAgICB7XG4gKiAgICAgLy8gICAgICAgICB4OiAyNjYsXG4gKiAgICAgLy8gICAgICAgICB5OiA0NjRcbiAqICAgICAvLyAgICAgIH1cbiAqICAgICAvLyAgIF1cbiAqICAgICAvLyAgIHByZXZlbnREZWZhdWx0KCksXG4gKiAgICAgLy8gICB0YXJnZXQ6IHsuLi59LFxuICogICAgIC8vICAgdHlwZTogXCJ0b3VjaHN0YXJ0XCJcbiAqICAgICAvLyB9XG4gKiB9KTtcbiAqIEBzZWUgW1JlZmVyZW5jZTogYE1hcGAgZXZlbnRzIEFQSSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvYXBpL21hcC8jbWFwLWV2ZW50cylcbiAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcbiAqL1xuZXhwb3J0IGNsYXNzIE1hcFRvdWNoRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2Ygb3JpZ2luYXRpbmcgZXZlbnQuIEZvciBhIGZ1bGwgbGlzdCBvZiBhdmFpbGFibGUgZXZlbnRzLCBzZWUgW2BNYXBgIGV2ZW50c10oL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKS5cbiAgICAgKi9cbiAgICB0eXBlOiAndG91Y2hzdGFydCdcbiAgICAgICAgfCAndG91Y2hlbmQnXG4gICAgICAgIHwgJ3RvdWNoY2FuY2VsJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBgTWFwYCBvYmplY3QgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgdGFyZ2V0OiBNYXA7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgRE9NIGV2ZW50IHdoaWNoIGNhdXNlZCB0aGUgbWFwIGV2ZW50LlxuICAgICAqL1xuICAgIG9yaWdpbmFsRXZlbnQ6IFRvdWNoRXZlbnQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBvbiB0aGUgbWFwIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHRvdWNoIGV2ZW50IHBvaW50cy5cbiAgICAgKi9cbiAgICBsbmdMYXQ6IExuZ0xhdDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwaXhlbCBjb29yZGluYXRlcyBvZiB0aGUgY2VudGVyIG9mIHRoZSB0b3VjaCBldmVudCBwb2ludHMsIHJlbGF0aXZlIHRvIHRoZSBtYXAgYW5kIG1lYXN1cmVkIGZyb20gdGhlIHRvcCBsZWZ0XG4gICAgICogY29ybmVyLlxuICAgICAqL1xuICAgIHBvaW50OiBQb2ludDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBhcnJheSBvZiBwaXhlbCBjb29yZGluYXRlcyBjb3JyZXNwb25kaW5nIHRvIGFcbiAgICAgKiBbdG91Y2ggZXZlbnQncyBgdG91Y2hlc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ub3VjaEV2ZW50L3RvdWNoZXMpIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHBvaW50czogQXJyYXk8UG9pbnQ+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbnMgb24gdGhlIG1hcCBjb3JyZXNwb25kaW5nIHRvIGFcbiAgICAgKiBbdG91Y2ggZXZlbnQncyBgdG91Y2hlc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ub3VjaEV2ZW50L3RvdWNoZXMpIHByb3BlcnR5LlxuICAgICAqL1xuICAgIGxuZ0xhdHM6IEFycmF5PExuZ0xhdD47XG5cbiAgICAvKipcbiAgICAgKiBJZiBhIGBsYXllcklkYCB3YXMgc3BlY2lmaWVkIHdoZW4gYWRkaW5nIHRoZSBldmVudCBsaXN0ZW5lciB3aXRoIHtAbGluayBNYXAjb259LCBgZmVhdHVyZXNgIHdpbGwgYmUgYW4gYXJyYXkgb2ZcbiAgICAgKiBbR2VvSlNPTl0oaHR0cDovL2dlb2pzb24ub3JnLykgW0ZlYXR1cmUgb2JqZWN0c10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc5NDYjc2VjdGlvbi0zLjIpLlxuICAgICAqIFRoZSBhcnJheSB3aWxsIGNvbnRhaW4gYWxsIGZlYXR1cmVzIGZyb20gdGhhdCBsYXllciB0aGF0IGFyZSByZW5kZXJlZCBhdCB0aGUgZXZlbnQncyBwb2ludC5cbiAgICAgKiBUaGUgYGZlYXR1cmVzYCBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIHJldHVybmVkIGJ5IHtAbGluayBNYXAjcXVlcnlSZW5kZXJlZEZlYXR1cmVzfS5cbiAgICAgKlxuICAgICAqIElmIG5vIGBsYXllcklkYCB3YXMgc3BlY2lmaWVkIHdoZW4gYWRkaW5nIHRoZSBldmVudCBsaXN0ZW5lciwgYGZlYXR1cmVzYCB3aWxsIGJlIGB1bmRlZmluZWRgLlxuICAgICAqIFlvdSBjYW4gZ2V0IHRoZSBmZWF0dXJlcyBhdCB0aGUgcG9pbnQgd2l0aCBgbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50KWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIGxvZ2dpbmcgZmVhdHVyZXMgZm9yIGEgc3BlY2lmaWMgbGF5ZXIgKHdpdGggYGUuZmVhdHVyZXNgKVxuICAgICAqIG1hcC5vbigndG91Y2hzdGFydCcsICdteUxheWVySWQnLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgVGhlcmUgYXJlICR7ZS5mZWF0dXJlcy5sZW5ndGh9IGZlYXR1cmVzIGF0IHBvaW50ICR7ZS5wb2ludH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gbG9nZ2luZyBhbGwgZmVhdHVyZXMgZm9yIGFsbCBsYXllcnMgKHdpdGhvdXQgYGUuZmVhdHVyZXNgKVxuICAgICAqIG1hcC5vbigndG91Y2hzdGFydCcsIChlKSA9PiB7XG4gICAgICogICAgIGNvbnN0IGZlYXR1cmVzID0gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50KTtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYFRoZXJlIGFyZSAke2ZlYXR1cmVzLmxlbmd0aH0gZmVhdHVyZXMgYXQgcG9pbnQgJHtlLnBvaW50fWApO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGZlYXR1cmVzOiBBcnJheTxPYmplY3Q+IHwgdm9pZDtcblxuICAgIC8qKlxuICAgICAqIFByZXZlbnRzIHN1YnNlcXVlbnQgZGVmYXVsdCBwcm9jZXNzaW5nIG9mIHRoZSBldmVudCBieSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHByZXZlbnQgdGhlIGZvbGxvd2luZyBkZWZhdWx0IG1hcCBiZWhhdmlvcnM6XG4gICAgICpcbiAgICAgKiAgICogT24gYHRvdWNoc3RhcnRgIGV2ZW50cywgdGhlIGJlaGF2aW9yIG9mIHtAbGluayBEcmFnUGFuSGFuZGxlcn0uXG4gICAgICogICAqIE9uIGB0b3VjaHN0YXJ0YCBldmVudHMsIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgVG91Y2hab29tUm90YXRlSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5vbigndG91Y2hzdGFydCcsIChlKSA9PiB7XG4gICAgICogICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYHByZXZlbnREZWZhdWx0YCBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQgZGVmYXVsdFByZXZlbnRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgfVxuXG4gICAgX2RlZmF1bHRQcmV2ZW50ZWQ6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgbWFwOiBNYXAsIG9yaWdpbmFsRXZlbnQ6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdG91Y2hlcyA9IHR5cGUgPT09IFwidG91Y2hlbmRcIiA/IG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMgOiBvcmlnaW5hbEV2ZW50LnRvdWNoZXM7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IERPTS50b3VjaFBvcyhtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCksIHRvdWNoZXMpO1xuICAgICAgICBjb25zdCBsbmdMYXRzID0gcG9pbnRzLm1hcCgodCkgPT4gbWFwLnVucHJvamVjdCh0KSk7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRzLnJlZHVjZSgocHJldiwgY3VyciwgaSwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJldi5hZGQoY3Vyci5kaXYoYXJyLmxlbmd0aCkpO1xuICAgICAgICB9LCBuZXcgUG9pbnQoMCwgMCkpO1xuICAgICAgICBjb25zdCBsbmdMYXQgPSBtYXAudW5wcm9qZWN0KHBvaW50KTtcbiAgICAgICAgc3VwZXIodHlwZSwge3BvaW50cywgcG9pbnQsIGxuZ0xhdHMsIGxuZ0xhdCwgb3JpZ2luYWxFdmVudH0pO1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIGBNYXBXaGVlbEV2ZW50YCBpcyBhIGNsYXNzIHVzZWQgYnkgb3RoZXIgY2xhc3NlcyB0byBnZW5lcmF0ZVxuICogbW91c2UgZXZlbnRzIG9mIHNwZWNpZmljIHR5cGVzIHN1Y2ggYXMgJ3doZWVsJy5cbiAqIEZvciBhIGZ1bGwgbGlzdCBvZiBhdmFpbGFibGUgZXZlbnRzLCBzZWUgW2BNYXBgIGV2ZW50c10oL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKS5cbiAqXG4gKiBAZXh0ZW5kcyB7T2JqZWN0fVxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgZXZlbnQgdHJpZ2dlciBmb3IgYSBNYXBXaGVlbEV2ZW50IG9mIHR5cGUgXCJ3aGVlbFwiXG4gKiBtYXAub24oJ3doZWVsJywgKGUpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZygnZXZlbnQgdHlwZTonLCBlLnR5cGUpO1xuICogICAgIC8vIGV2ZW50IHR5cGU6IHdoZWVsXG4gKiB9KTtcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIGEgTWFwV2hlZWxFdmVudCBvZiB0eXBlIFwid2hlZWxcIlxuICogLy8ge1xuICogLy8gICBvcmlnaW5hbEV2ZW50OiBXaGVlbEV2ZW50IHsuLi59LFxuICogLy8gXHQgdGFyZ2V0OiBNYXAgey4uLn0sXG4gKiAvLyBcdCB0eXBlOiBcIndoZWVsXCJcbiAqIC8vIH1cbiAqIEBzZWUgW1JlZmVyZW5jZTogYE1hcGAgZXZlbnRzIEFQSSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvYXBpL21hcC8jbWFwLWV2ZW50cylcbiAqL1xuZXhwb3J0IGNsYXNzIE1hcFdoZWVsRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2Ygb3JpZ2luYXRpbmcgZXZlbnQuIEZvciBhIGZ1bGwgbGlzdCBvZiBhdmFpbGFibGUgZXZlbnRzLCBzZWUgW2BNYXBgIGV2ZW50c10oL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKS5cbiAgICAgKi9cbiAgICB0eXBlOiAnd2hlZWwnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBNYXBgIG9iamVjdCB0aGF0IGZpcmVkIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICB0YXJnZXQ6IE1hcDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBET00gZXZlbnQgd2hpY2ggY2F1c2VkIHRoZSBtYXAgZXZlbnQuXG4gICAgICovXG4gICAgb3JpZ2luYWxFdmVudDogV2hlZWxFdmVudDtcblxuICAgIC8qKlxuICAgICAqIFByZXZlbnRzIHN1YnNlcXVlbnQgZGVmYXVsdCBwcm9jZXNzaW5nIG9mIHRoZSBldmVudCBieSB0aGUgbWFwLlxuICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBwcmV2ZW50IHRoZSB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIFNjcm9sbFpvb21IYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLm9uKCd3aGVlbCcsIChlKSA9PiB7XG4gICAgICogICAgIC8vIFByZXZlbnQgdGhlIGRlZmF1bHQgbWFwIHNjcm9sbCB6b29tIGJlaGF2aW9yLlxuICAgICAqICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiBgcHJldmVudERlZmF1bHRgIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0UHJldmVudGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFByZXZlbnRlZDtcbiAgICB9XG5cbiAgICBfZGVmYXVsdFByZXZlbnRlZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBtYXA6IE1hcCwgb3JpZ2luYWxFdmVudDogV2hlZWxFdmVudCkge1xuICAgICAgICBzdXBlcih0eXBlLCB7b3JpZ2luYWxFdmVudH0pO1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XG4gICAgfVxufVxuXG4vKipcbiAqIGBNYXBCb3hab29tRXZlbnRgIGlzIGEgY2xhc3MgdXNlZCB0byBnZW5lcmF0ZVxuICogdGhlIGV2ZW50cyAnYm94em9vbXN0YXJ0JywgJ2JveHpvb21lbmQnLCBhbmQgJ2JveHpvb21jYW5jZWwnLlxuICogRm9yIGEgZnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBldmVudHMsIHNlZSBbYE1hcGAgZXZlbnRzXSgvbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1hcEJveFpvb21FdmVudFxuICogQHByb3BlcnR5IHtNb3VzZUV2ZW50fSBvcmlnaW5hbEV2ZW50IFRoZSBET00gZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGJveHpvb20gZXZlbnQuIENhbiBiZSBhIGBNb3VzZUV2ZW50YCBvciBgS2V5Ym9hcmRFdmVudGAuXG4gKiBAcHJvcGVydHkgeygnYm94em9vbXN0YXJ0JyB8ICdib3h6b29tZW5kJyB8ICdib3h6b29tY2FuY2VsJyl9IHR5cGUgVGhlIHR5cGUgb2Ygb3JpZ2luYXRpbmcgZXZlbnQuIEZvciBhIGZ1bGwgbGlzdCBvZiBhdmFpbGFibGUgZXZlbnRzLCBzZWUgW2BNYXBgIGV2ZW50c10oL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKS5cbiAqIEBwcm9wZXJ0eSB7TWFwfSB0YXJnZXQgVGhlIGBNYXBgIGluc3RhbmNlIHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHRyaWdnZXIgb2YgYSBCb3hab29tRXZlbnQgb2YgdHlwZSBcImJveHpvb21zdGFydFwiXG4gKiBtYXAub24oJ2JveHpvb21zdGFydCcsIChlKSA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coJ2V2ZW50IHR5cGU6JywgZS50eXBlKTtcbiAqICAgICAvLyBldmVudCB0eXBlOiBib3h6b29tc3RhcnRcbiAqIH0pO1xuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgYSBCb3hab29tRXZlbnQgb2YgdHlwZSBcImJveHpvb21zdGFydFwiXG4gKiAvLyB7XG4gKiAvLyAgIG9yaWdpbmFsRXZlbnQ6IHsuLi59LFxuICogLy8gICB0eXBlOiBcImJveHpvb21zdGFydFwiLFxuICogLy8gICB0YXJnZXQ6IHsuLi59XG4gKiAvLyB9XG4gKiBAc2VlIFtSZWZlcmVuY2U6IGBNYXBgIGV2ZW50cyBBUEkgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpXG4gKiBAc2VlIFtFeGFtcGxlOiBIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91c2luZy1ib3gtcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcbiAqL1xuZXhwb3J0IHR5cGUgTWFwQm94Wm9vbUV2ZW50ID0ge1xuICAgIHR5cGU6ICdib3h6b29tc3RhcnQnXG4gICAgICAgIHwgJ2JveHpvb21lbmQnXG4gICAgICAgIHwgJ2JveHpvb21jYW5jZWwnLFxuICAgIHRhcmdldDogTWFwLFxuICAgIG9yaWdpbmFsRXZlbnQ6IE1vdXNlRXZlbnRcbn07XG5cbi8qKlxuICogYE1hcERhdGFFdmVudGAgaXMgYSBjbGFzcyB1c2VkIHRvIGdlbmVyYXRlXG4gKiBldmVudHMgcmVsYXRlZCB0byBsb2FkaW5nIGRhdGEsIHN0eWxlcywgYW5kIHNvdXJjZXMuXG4gKiBGb3IgYSBmdWxsIGxpc3Qgb2YgYXZhaWxhYmxlIGV2ZW50cywgc2VlIFtgTWFwYCBldmVudHNdKC9tYXBib3gtZ2wtanMvYXBpL21hcC8jbWFwLWV2ZW50cykuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFwRGF0YUV2ZW50XG4gKiBAcHJvcGVydHkgeygnZGF0YScgfCAnZGF0YWxvYWRpbmcnIHwgJ3N0eWxlZGF0YScgfCAnc3R5bGVkYXRhbG9hZGluZycgfCAnc291cmNlZGF0YSd8ICdzb3VyY2VkYXRhbG9hZGluZycpfSB0eXBlIFRoZSB0eXBlIG9mIG9yaWdpbmF0aW5nIGV2ZW50LiBGb3IgYSBmdWxsIGxpc3Qgb2YgYXZhaWxhYmxlIGV2ZW50cywgc2VlIFtgTWFwYCBldmVudHNdKC9tYXBib3gtZ2wtanMvYXBpL21hcC8jbWFwLWV2ZW50cykuXG4gKiBAcHJvcGVydHkgeygnc291cmNlJyB8ICdzdHlsZScpfSBkYXRhVHlwZSBUaGUgdHlwZSBvZiBkYXRhIHRoYXQgaGFzIGNoYW5nZWQuIE9uZSBvZiBgJ3NvdXJjZSdgIG9yIGAnc3R5bGUnYCwgd2hlcmUgYCdzb3VyY2UnYCByZWZlcnMgdG8gdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGFueSBzb3VyY2UsIGFuZCBgJ3N0eWxlJ2AgcmVmZXJzIHRvIHRoZSBlbnRpcmUgW3N0eWxlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L3N0eWxlLykgdXNlZCBieSB0aGUgbWFwLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbaXNTb3VyY2VMb2FkZWRdIFRydWUgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAgYW5kIHRoZSBzb3VyY2UgaGFzIG5vIG91dHN0YW5kaW5nIG5ldHdvcmsgcmVxdWVzdHMuXG4gKiBAcHJvcGVydHkge09iamVjdH0gW3NvdXJjZV0gVGhlIFtzdHlsZSBzcGVjIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzb3VyY2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3NvdXJjZXMvKSBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc291cmNlSWRdIFRoZSBgaWRgIG9mIHRoZSBbYHNvdXJjZWBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3NvdXJjZXMvKSB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQsIGlmIHRoZSBldmVudCBoYXMgYSBgZGF0YVR5cGVgIG9mIGBzb3VyY2VgLiBTYW1lIGFzIHRoZSBgaWRgIG9mIHRoZSBvYmplY3QgaW4gdGhlIGBzb3VyY2VgIHByb3BlcnR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzb3VyY2VEYXRhVHlwZV0gSW5jbHVkZWQgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAgYW5kIHRoZSBldmVudCBzaWduYWxzXG4gKiB0aGF0IGludGVybmFsIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgb3IgY2hhbmdlZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgbWV0YWRhdGFgLCBgY29udGVudGAgYW5kIGB2aXNpYmlsaXR5YC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbdGlsZV0gVGhlIHRpbGUgYmVpbmcgbG9hZGVkIG9yIGNoYW5nZWQsIGlmIHRoZSBldmVudCBoYXMgYSBgZGF0YVR5cGVgIG9mIGBzb3VyY2VgIGFuZFxuICogdGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gbG9hZGluZyBvZiBhIHRpbGUuXG4gKiBAcHJvcGVydHkge0Nvb3JkaW5hdGV9IFtjb29yZF0gVGhlIGNvb3JkaW5hdGUgb2YgdGhlIHRpbGUgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAgYW5kXG4gKiB0aGUgZXZlbnQgaXMgcmVsYXRlZCB0byBsb2FkaW5nIG9mIGEgdGlsZS5cbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIGEgTWFwRGF0YUV2ZW50IG9mIHR5cGUgXCJzb3VyY2VkYXRhXCJcbiAqIG1hcC5vbignc291cmNlZGF0YScsIChlKSA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coZSk7XG4gKiAgICAgLy8ge1xuICogICAgIC8vICAgZGF0YVR5cGU6IFwic291cmNlXCIsXG4gKiAgICAgLy8gICBpc1NvdXJjZUxvYWRlZDogZmFsc2UsXG4gKiAgICAgLy8gICBzb3VyY2U6IHtcbiAqICAgICAvLyAgICAgdHlwZTogXCJ2ZWN0b3JcIixcbiAqICAgICAvLyAgICAgdXJsOiBcIm1hcGJveDovL21hcGJveC5tYXBib3gtc3RyZWV0cy12OCxtYXBib3gubWFwYm94LXRlcnJhaW4tdjJcIlxuICogICAgIC8vICAgfSxcbiAqICAgICAvLyAgIHNvdXJjZURhdGFUeXBlOiBcInZpc2liaWxpdHlcIixcbiAqICAgICAvLyAgIHNvdXJjZUlkOiBcImNvbXBvc2l0ZVwiLFxuICogICAgIC8vICAgc3R5bGU6IHsuLi59LFxuICogICAgIC8vICAgdGFyZ2V0OiB7Li4ufSxcbiAqICAgICAvLyAgIHR5cGU6IFwic291cmNlZGF0YVwiXG4gKiAgICAgLy8gfVxuICogfSk7XG4gKiBAc2VlIFtSZWZlcmVuY2U6IGBNYXBgIGV2ZW50cyBBUEkgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpXG4gKiBAc2VlIFtFeGFtcGxlOiBDaGFuZ2UgYSBtYXAncyBzdHlsZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2V0c3R5bGUvKVxuICogQHNlZSBbRXhhbXBsZTogQWRkIGEgR2VvSlNPTiBsaW5lXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLWxpbmUvKVxuICovXG5leHBvcnQgdHlwZSBNYXBEYXRhRXZlbnQgPSB7XG4gICAgdHlwZTogJ2RhdGEnXG4gICAgICAgIHwgJ2RhdGFsb2FkaW5nJ1xuICAgICAgICB8ICdzdHlsZWRhdGEnXG4gICAgICAgIHwgJ3N0eWxlZGF0YWxvYWRpbmcnXG4gICAgICAgIHwgJ3NvdXJjZWRhdGEnXG4gICAgICAgIHwgJ3NvdXJjZWRhdGFsb2FkaW5nJyxcbiAgICBkYXRhVHlwZTogJ3NvdXJjZSdcbiAgICAgICAgfCAnc3R5bGUnXG59O1xuXG5leHBvcnQgdHlwZSBNYXBDb250ZXh0RXZlbnQgPSB7XG4gICAgdHlwZTogJ3dlYmdsY29udGV4dGxvc3QnIHwgJ3dlYmdsY29udGV4dHJlc3RvcmVkJyxcbiAgICBvcmlnaW5hbEV2ZW50OiBXZWJHTENvbnRleHRFdmVudFxufVxuXG5leHBvcnQgdHlwZSBNYXBFdmVudCA9XG4gICAgLyoqIEBzZWN0aW9uIHtJbnRlcmFjdGlvbn1cbiAgICAgKiBAZXZlbnRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwICovXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIHByZXNzZWQgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBldmVudCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkYCBwYXJhbWV0ZXIuXG4gICAgICogSWYgYGxheWVySWRgIGlzIGluY2x1ZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgaW4ge0BsaW5rIE1hcCNvbn0sIHRoZSBldmVudCBsaXN0ZW5lciB3aWxsIGZpcmUgb25seSB3aGVuIHRoZVxuICAgICAqIHRoZSBjdXJzb3IgaXMgcHJlc3NlZCB3aGlsZSBpbnNpZGUgYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHNwZWNpZmVkIGxheWVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlZG93blxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAqIG1hcC5vbignbW91c2Vkb3duJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBtb3VzZWRvd24gZXZlbnQgaGFzIG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGxheWVyXG4gICAgICogbWFwLm9uKCdtb3VzZWRvd24nLCAncG9pLWxhYmVsJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBtb3VzZWRvd24gZXZlbnQgaGFzIG9jY3VycmVkIG9uIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBwb2ktbGFiZWwgbGF5ZXIuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogSGlnaGxpZ2h0IGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqL1xuICAgIHwgJ21vdXNlZG93bidcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgcmVsZWFzZWQgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBldmVudCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkYCBwYXJhbWV0ZXIuXG4gICAgICogSWYgYGxheWVySWRgIGlzIGluY2x1ZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgaW4ge0BsaW5rIE1hcCNvbn0sIHRoZSBldmVudCBsaXN0ZW5lciB3aWxsIGZpcmUgb25seSB3aGVuIHRoZVxuICAgICAqIHRoZSBjdXJzb3IgaXMgcmVsZWFzZWQgd2hpbGUgaW5zaWRlIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZlZCBsYXllci5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3VzZXVwXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBNb3VzZUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICogbWFwLm9uKCdtb3VzZXVwJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBtb3VzZXVwIGV2ZW50IGhhcyBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBsYXllclxuICAgICAqIG1hcC5vbignbW91c2V1cCcsICdwb2ktbGFiZWwnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIG1vdXNldXAgZXZlbnQgaGFzIG9jY3VycmVkIG9uIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBwb2ktbGFiZWwgbGF5ZXIuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogSGlnaGxpZ2h0IGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqL1xuICAgIHwgJ21vdXNldXAnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIG1vdmVkIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqIEFzIHlvdSBtb3ZlIHRoZSBjdXJzb3IgYWNyb3NzIGEgd2ViIHBhZ2UgY29udGFpbmluZyBhIG1hcCxcbiAgICAgKiB0aGUgZXZlbnQgd2lsbCBmaXJlIGVhY2ggdGltZSBpdCBlbnRlcnMgdGhlIG1hcCBvciBhbnkgY2hpbGQgZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBldmVudCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkYCBwYXJhbWV0ZXIuXG4gICAgICogSWYgYGxheWVySWRgIGlzIGluY2x1ZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgaW4ge0BsaW5rIE1hcCNvbn0sIHRoZSBldmVudCBsaXN0ZW5lciB3aWxsIGZpcmUgb25seSB3aGVuIHRoZVxuICAgICAqIHRoZSBjdXJzb3IgaXMgbW92ZWQgaW5zaWRlIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZlZCBsYXllci5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3VzZW92ZXJcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBtYXAub24oJ21vdXNlb3ZlcicsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgbW91c2VvdmVyIGV2ZW50IGhhcyBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBsYXllclxuICAgICAqIG1hcC5vbignbW91c2VvdmVyJywgJ3BvaS1sYWJlbCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgbW91c2VvdmVyIGV2ZW50IGhhcyBvY2N1cnJlZCBvbiBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgcG9pLWxhYmVsIGxheWVyLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IEdldCBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tb3VzZS1wb3NpdGlvbi8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogSGlnaGxpZ2h0IGZlYXR1cmVzIHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2hvdmVyLXN0eWxlcy8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwIG9uIGhvdmVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWhvdmVyLylcbiAgICAgKi9cbiAgICB8ICdtb3VzZW92ZXInXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIG1vdmVkIHdoaWxlIHRoZSBjdXJzb3IgaXMgaW5zaWRlIHRoZSBtYXAuXG4gICAgICogQXMgeW91IG1vdmUgdGhlIGN1cnNvciBhY3Jvc3MgdGhlIG1hcCwgdGhlIGV2ZW50IHdpbGwgZmlyZSBldmVyeSB0aW1lIHRoZSBjdXJzb3IgY2hhbmdlcyBwb3NpdGlvbiB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGV2ZW50IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW9uYWwgYGxheWVySWRgIHBhcmFtZXRlci5cbiAgICAgKiBJZiBgbGF5ZXJJZGAgaXMgaW5jbHVkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBpbiB7QGxpbmsgTWFwI29ufSwgdGhlIGV2ZW50IGxpc3RlbmVyIHdpbGwgZmlyZSBvbmx5IHdoZW4gdGhlXG4gICAgICogdGhlIGN1cnNvciBpcyBpbnNpZGUgYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHNwZWNpZmllZCBsYXllci5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3VzZW1vdmVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBtYXAub24oJ21vdXNlbW92ZScsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgbW91c2Vtb3ZlIGV2ZW50IGhhcyBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBsYXllclxuICAgICAqIG1hcC5vbignbW91c2Vtb3ZlJywgJ3BvaS1sYWJlbCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgbW91c2Vtb3ZlIGV2ZW50IGhhcyBvY2N1cnJlZCBvbiBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgcG9pLWxhYmVsIGxheWVyLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IEdldCBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tb3VzZS1wb3NpdGlvbi8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogSGlnaGxpZ2h0IGZlYXR1cmVzIHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2hvdmVyLXN0eWxlcy8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwIG9uIG92ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24taG92ZXIvKVxuICAgICAqL1xuICAgIHwgJ21vdXNlbW92ZSdcblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgY2xpY2sgZXZlbnQgb2NjdXJzIGFuZCBpcyBmaXJlZCBiZWZvcmUgdGhlIGNsaWNrIGV2ZW50LlxuICAgICAqIFByaW1hcmlseSBpbXBsZW1lbnRlZCB0byBlbnN1cmUgY2xvc2VPbkNsaWNrIGZvciBwb3AtdXBzIGlzIGZpcmVkIGJlZm9yZSBhbnkgb3RoZXIgbGlzdGVuZXJzLlxuICAgICAqXG4gICAgICogQGV2ZW50IHByZWNsaWNrXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBNb3VzZUV2ZW50fVxuICAgICAqL1xuICAgICB8ICdwcmVjbGljaydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgcHJlc3NlZCBhbmQgcmVsZWFzZWQgYXQgdGhlIHNhbWUgcG9pbnQgb24gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGV2ZW50IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW9uYWwgYGxheWVySWRgIHBhcmFtZXRlci5cbiAgICAgKiBJZiBgbGF5ZXJJZGAgaXMgaW5jbHVkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBpbiB7QGxpbmsgTWFwI29ufSwgdGhlIGV2ZW50IGxpc3RlbmVyIHdpbGwgZmlyZSBvbmx5IHdoZW4gdGhlXG4gICAgICogcG9pbnQgdGhhdCBpcyBwcmVzc2VkIGFuZCByZWxlYXNlZCBjb250YWlucyBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmZWQgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgY2xpY2tcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBtYXAub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYEEgY2xpY2sgZXZlbnQgaGFzIG9jY3VycmVkIGF0ICR7ZS5sbmdMYXR9YCk7XG4gICAgICogfSk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgbGF5ZXJcbiAgICAgKiBtYXAub24oJ2NsaWNrJywgJ3BvaS1sYWJlbCcsIChlKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBBIGNsaWNrIGV2ZW50IGhhcyBvY2N1cnJlZCBvbiBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgcG9pLWxhYmVsIGxheWVyIGF0ICR7ZS5sbmdMYXR9YCk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogTWVhc3VyZSBkaXN0YW5jZXNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbWVhc3VyZS8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQ2VudGVyIHRoZSBtYXAgb24gYSBjbGlja2VkIHN5bWJvbF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jZW50ZXItb24tc3ltYm9sLylcbiAgICAgKi9cbiAgICB8ICdjbGljaydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgcHJlc3NlZCBhbmQgcmVsZWFzZWQgdHdpY2UgYXQgdGhlIHNhbWUgcG9pbnQgb25cbiAgICAgKiB0aGUgbWFwIGluIHJhcGlkIHN1Y2Nlc3Npb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBldmVudCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkYCBwYXJhbWV0ZXIuXG4gICAgICogSWYgYGxheWVySWRgIGlzIGluY2x1ZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgaW4ge0BsaW5rIE1hcCNvbn0sIHRoZSBldmVudCBsaXN0ZW5lciB3aWxsIGZpcmUgb25seVxuICAgICAqIHdoZW4gdGhlIHBvaW50IHRoYXQgaXMgY2xpY2tlZCB0d2ljZSBjb250YWlucyBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmZWQgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZGJsY2xpY2tcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBtYXAub24oJ2RibGNsaWNrJywgKGUpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYEEgZGJsY2xpY2sgZXZlbnQgaGFzIG9jY3VycmVkIGF0ICR7ZS5sbmdMYXR9YCk7XG4gICAgICogfSk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgbGF5ZXJcbiAgICAgKiBtYXAub24oJ2RibGNsaWNrJywgJ3BvaS1sYWJlbCcsIChlKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBBIGRibGNsaWNrIGV2ZW50IGhhcyBvY2N1cnJlZCBvbiBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgcG9pLWxhYmVsIGxheWVyIGF0ICR7ZS5sbmdMYXR9YCk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnZGJsY2xpY2snXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGVudGVycyBhIHZpc2libGUgcG9ydGlvbiBvZiBhIHNwZWNpZmllZCBsYXllciBmcm9tXG4gICAgICogb3V0c2lkZSB0aGF0IGxheWVyIG9yIG91dHNpZGUgdGhlIG1hcCBjYW52YXMuXG4gICAgICpcbiAgICAgKiAqKkltcG9ydGFudDoqKiBUaGlzIGV2ZW50IGNhbiBvbmx5IGJlIGxpc3RlbmVkIGZvciB3aGVuIHtAbGluayBNYXAjb259IGluY2x1ZGVzIHRocmVlIGFyZ3VtZW50cyxcbiAgICAgKiB3aGVyZSB0aGUgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgZGVzaXJlZCBsYXllci5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3VzZWVudGVyXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBNb3VzZUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICogbWFwLm9uKCdtb3VzZWVudGVyJywgJ3dhdGVyJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBtb3VzZWVudGVyIGV2ZW50IG9jY3VycmVkIG9uIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSB3YXRlciBsYXllci4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDZW50ZXIgdGhlIG1hcCBvbiBhIGNsaWNrZWQgc3ltYm9sXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jZW50ZXItb24tc3ltYm9sLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGEgcG9wdXAgb24gY2xpY2tdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcbiAgICAgKi9cbiAgICB8ICdtb3VzZWVudGVyJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBsZWF2ZXMgYSB2aXNpYmxlIHBvcnRpb24gb2YgYSBzcGVjaWZpZWQgbGF5ZXIgb3IgbW92ZXNcbiAgICAgKiBmcm9tIHRoZSBzcGVjaWZpZWQgbGF5ZXIgdG8gb3V0c2lkZSB0aGUgbWFwIGNhbnZhcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUbyBkZXRlY3Qgd2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBjYW52YXMsIGluZGVwZW5kZW50IG9mIGxheWVyLCB1c2Uge0BsaW5rIE1hcC5ldmVudDptb3VzZW91dH0gaW5zdGVhZC5cbiAgICAgKlxuICAgICAqICoqSW1wb3J0YW50OioqIFRoaXMgZXZlbnQgY2FuIG9ubHkgYmUgbGlzdGVuZWQgZm9yIHdoZW4ge0BsaW5rIE1hcCNvbn0gaW5jbHVkZXMgdGhyZWUgYXJndW1lbnRzLFxuICAgICAqIHdoZXJlIHRoZSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIGxheWVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlbGVhdmVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gdGhlIHBvaW50aW5nIGRldmljZSBsZWF2ZXNcbiAgICAgKiAvLyBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxheWVyLlxuICAgICAqIG1hcC5vbignbW91c2VsZWF2ZScsICd3YXRlcicsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgbW91c2VsZWF2ZSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBIaWdobGlnaHQgZmVhdHVyZXMgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaG92ZXItc3R5bGVzLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGEgcG9wdXAgb24gY2xpY2tdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcbiAgICAgKi9cbiAgICB8ICdtb3VzZWxlYXZlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50IGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBsZWF2ZXMgdGhlIG1hcCdzIGNhbnZhcy5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3VzZW91dFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiB0aGUgcG9pbnRpbmcgZGV2aWNlIGxlYXZlc1xuICAgICAqIC8vIHRoZSBtYXAncyBjYW52YXMuXG4gICAgICogbWFwLm9uKCdtb3VzZW91dCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgbW91c2VvdXQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnbW91c2VvdXQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSByaWdodCBidXR0b24gb2YgdGhlIG1vdXNlIGlzIGNsaWNrZWQgb3IgdGhlIGNvbnRleHQgbWVudSBrZXkgaXMgcHJlc3NlZCB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCBjb250ZXh0bWVudVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiB0aGUgcmlnaHQgbW91c2UgYnV0dG9uIGlzXG4gICAgICogLy8gcHJlc3NlZCB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKiBtYXAub24oJ2NvbnRleHRtZW51JywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBjb250ZXh0bWVudSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdjb250ZXh0bWVudSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBbYHdoZWVsYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL3doZWVsKSBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgd2hlZWxcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcFdoZWVsRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gYSB3aGVlbCBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICogbWFwLm9uKCd3aGVlbCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0Egd2hlZWwgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnd2hlZWwnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgW2B0b3VjaHN0YXJ0YF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL3RvdWNoc3RhcnQpIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCB0b3VjaHN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBUb3VjaEV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIGEgYHRvdWNoc3RhcnRgIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKiBtYXAub24oJ3RvdWNoc3RhcnQnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHRvdWNoc3RhcnQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqL1xuICAgIHwgJ3RvdWNoc3RhcnQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgW2B0b3VjaGVuZGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy90b3VjaGVuZCkgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IHRvdWNoZW5kXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBUb3VjaEV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwLlxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzIHdoZW4gYSBgdG91Y2hzdGFydGAgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqIG1hcC5vbigndG91Y2hzdGFydCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgdG91Y2hzdGFydCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgfCAndG91Y2hlbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgW2B0b3VjaG1vdmVgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvdG91Y2htb3ZlKSBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgdG91Y2htb3ZlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBUb3VjaEV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwLlxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzIHdoZW4gYSB0b3VjaG1vdmUgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqIG1hcC5vbigndG91Y2htb3ZlJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSB0b3VjaG1vdmUgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqL1xuICAgIHwgJ3RvdWNobW92ZSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBbYHRvdWNoY2FuY2VsYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL3RvdWNoY2FuY2VsKSBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgdG91Y2hjYW5jZWxcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcFRvdWNoRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXAuXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXMgd2hlbiBhIGB0b3VjaGNhbmNlbGAgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqIG1hcC5vbigndG91Y2hjYW5jZWwnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHRvdWNoY2FuY2VsIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3RvdWNoY2FuY2VsJ1xuXG4gICAgLyoqIEBzZWN0aW9uIHtNb3ZlbWVudH1cbiAgICAgKiBAZXZlbnRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwICovXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBqdXN0IGJlZm9yZSB0aGUgbWFwIGJlZ2lucyBhIHRyYW5zaXRpb24gZnJvbSBvbmUgdmlldyB0byBhbm90aGVyLCBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2p1bXBUb30uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW92ZXN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtEcmFnRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXAuXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXMganVzdCBiZWZvcmUgdGhlIG1hcCBiZWdpbnMgYSB0cmFuc2l0aW9uIGZyb20gb25lIHZpZXcgdG8gYW5vdGhlci5cbiAgICAgKiBtYXAub24oJ21vdmVzdGFydCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgbW92ZXN0YXJ0YCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdtb3Zlc3RhcnQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCByZXBlYXRlZGx5IGR1cmluZyBhbiBhbmltYXRlZCB0cmFuc2l0aW9uIGZyb20gb25lIHZpZXcgdG8gYW5vdGhlciwgYXMgdGhlIHJlc3VsdCBvZiBlaXRoZXIgdXNlciBpbnRlcmFjdGlvbiBvciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE1hcCNmbHlUb30uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW92ZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXAuXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXMgcmVwZWF0ZWRseSBkdXJpbmcgYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKiBtYXAub24oJ21vdmUnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIG1vdmUgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBIVE1MIGNsdXN0ZXJzIHdpdGggY3VzdG9tIHByb3BlcnRpZXNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NsdXN0ZXItaHRtbC8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRmlsdGVyIGZlYXR1cmVzIHdpdGhpbiBtYXAgdmlld10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLWZlYXR1cmVzLXdpdGhpbi1tYXAtdmlldy8pXG4gICAgICovXG4gICAgfCAnbW92ZSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGp1c3QgYWZ0ZXIgdGhlIG1hcCBjb21wbGV0ZXMgYSB0cmFuc2l0aW9uIGZyb20gb25lXG4gICAgICogdmlldyB0byBhbm90aGVyLCBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2p1bXBUb30uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW92ZWVuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7RHJhZ0V2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBqdXN0IGFmdGVyIHRoZSBtYXAgY29tcGxldGVzIGEgdHJhbnNpdGlvbi5cbiAgICAgKiBtYXAub24oJ21vdmVlbmQnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIG1vdmVlbmQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogUGxheSBtYXAgbG9jYXRpb25zIGFzIGEgc2xpZGVzaG93XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BsYXliYWNrLWxvY2F0aW9ucy8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRmlsdGVyIGZlYXR1cmVzIHdpdGhpbiBtYXAgdmlld10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItZmVhdHVyZXMtd2l0aGluLW1hcC12aWV3LylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IEhUTUwgY2x1c3RlcnMgd2l0aCBjdXN0b20gcHJvcGVydGllc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2x1c3Rlci1odG1sLylcbiAgICAgKi9cbiAgICB8ICdtb3ZlZW5kJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBzdGFydHMuIFNlZSB7QGxpbmsgRHJhZ1BhbkhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IGRyYWdzdGFydFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7RHJhZ0V2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIGEgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIHN0YXJ0cy5cbiAgICAgKiBtYXAub24oJ2RyYWdzdGFydCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgZHJhZ3N0YXJ0IGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ2RyYWdzdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHJlcGVhdGVkbHkgZHVyaW5nIGEgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uLiBTZWUge0BsaW5rIERyYWdQYW5IYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBkcmFnXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gcmVwZWF0ZWRseSBkdXJpbmcgYSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24uXG4gICAgICogbWFwLm9uKCdkcmFnJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBkcmFnIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ2RyYWcnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGVuZHMuIFNlZSB7QGxpbmsgRHJhZ1BhbkhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IGRyYWdlbmRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge0RyYWdFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiBhIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBlbmRzLlxuICAgICAqIG1hcC5vbignZHJhZ2VuZCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgZHJhZ2VuZCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgbWFya2VyXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtbWFya2VyLylcbiAgICAgKi9cbiAgICB8ICdkcmFnZW5kJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQganVzdCBiZWZvcmUgdGhlIG1hcCBiZWdpbnMgYSB0cmFuc2l0aW9uIGZyb20gb25lIHpvb20gbGV2ZWwgdG8gYW5vdGhlcixcbiAgICAgKiBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCB6b29tc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBqdXN0IGJlZm9yZSBhIHpvb20gdHJhbnNpdGlvbiBzdGFydHMuXG4gICAgICogbWFwLm9uKCd6b29tc3RhcnQnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHpvb21zdGFydCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICd6b29tc3RhcnQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCByZXBlYXRlZGx5IGR1cmluZyBhbiBhbmltYXRlZCB0cmFuc2l0aW9uIGZyb20gb25lIHpvb20gbGV2ZWwgdG8gYW5vdGhlcixcbiAgICAgKiBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCB6b29tXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gcmVwZWF0ZWRseSBkdXJpbmcgYSB6b29tIHRyYW5zaXRpb24uXG4gICAgICogbWFwLm9uKCd6b29tJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSB6b29tIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IFVwZGF0ZSBhIGNob3JvcGxldGggbGF5ZXIgYnkgem9vbSBsZXZlbF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91cGRhdGluZy1jaG9yb3BsZXRoLylcbiAgICAgKi9cbiAgICB8ICd6b29tJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQganVzdCBhZnRlciB0aGUgbWFwIGNvbXBsZXRlcyBhIHRyYW5zaXRpb24gZnJvbSBvbmUgem9vbSBsZXZlbCB0byBhbm90aGVyXG4gICAgICogYXMgdGhlIHJlc3VsdCBvZiBlaXRoZXIgdXNlciBpbnRlcmFjdGlvbiBvciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE1hcCNmbHlUb30uXG4gICAgICogVGhlIHpvb20gdHJhbnNpdGlvbiB3aWxsIHVzdWFsbHkgZW5kIGJlZm9yZSByZW5kZXJpbmcgaXMgZmluaXNoZWQsIHNvIGlmIHlvdVxuICAgICAqIG5lZWQgdG8gd2FpdCBmb3IgcmVuZGVyaW5nIHRvIGZpbmlzaCwgdXNlIHRoZSB7QGxpbmsgTWFwLmV2ZW50OmlkbGV9IGV2ZW50IGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgem9vbWVuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYWZ0ZXIgYSB6b29tIHRyYW5zaXRpb24gZmluaXNoZXMuXG4gICAgICogbWFwLm9uKCd6b29tZW5kJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSB6b29tZW5kIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3pvb21lbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIHN0YXJ0cy4gU2VlIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcm90YXRlc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBqdXN0IGJlZm9yZSBhIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBzdGFydHMuXG4gICAgICogbWFwLm9uKCdyb3RhdGVzdGFydCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0Egcm90YXRlc3RhcnQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAncm90YXRlc3RhcnQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCByZXBlYXRlZGx5IGR1cmluZyBhIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbi4gU2VlIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcm90YXRlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gcmVwZWF0ZWRseSBkdXJpbmcgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLlxuICAgICAqIG1hcC5vbigncm90YXRlJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSByb3RhdGUgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAncm90YXRlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBlbmRzLiBTZWUge0BsaW5rIERyYWdSb3RhdGVIYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCByb3RhdGVlbmRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBqdXN0IGFmdGVyIGEgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGVuZHMuXG4gICAgICogbWFwLm9uKCdyb3RhdGVlbmQnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHJvdGF0ZWVuZCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdyb3RhdGVlbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuZXZlciB0aGUgbWFwJ3MgcGl0Y2ggKHRpbHQpIGJlZ2lucyBhIGNoYW5nZSBhc1xuICAgICAqIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99IC5cbiAgICAgKlxuICAgICAqIEBldmVudCBwaXRjaHN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBEYXRhRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYmVmb3JlIGEgcGl0Y2ggKHRpbHQpIHRyYW5zaXRpb24gc3RhcnRzLlxuICAgICAqIG1hcC5vbigncGl0Y2hzdGFydCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgcGl0Y2hzdGFydCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdwaXRjaHN0YXJ0J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgcmVwZWF0ZWRseSBkdXJpbmcgdGhlIG1hcCdzIHBpdGNoICh0aWx0KSBhbmltYXRpb24gYmV0d2VlblxuICAgICAqIG9uZSBzdGF0ZSBhbmQgYW5vdGhlciBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uXG4gICAgICogb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99LlxuICAgICAqXG4gICAgICogQGV2ZW50IHBpdGNoXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBEYXRhRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHJlcGVhdGVkbHkgZHVyaW5nIGEgcGl0Y2ggKHRpbHQpIHRyYW5zaXRpb24uXG4gICAgICogbWFwLm9uKCdwaXRjaCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgcGl0Y2ggZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAncGl0Y2gnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgbWFwJ3MgcGl0Y2ggKHRpbHQpIGZpbmlzaGVzIGNoYW5naW5nIGFzXG4gICAgICogdGhlIHJlc3VsdCBvZiBlaXRoZXIgdXNlciBpbnRlcmFjdGlvbiBvciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE1hcCNmbHlUb30uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcGl0Y2hlbmRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcERhdGFFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8ganVzdCBhZnRlciBhIHBpdGNoICh0aWx0KSB0cmFuc2l0aW9uIGVuZHMuXG4gICAgICogbWFwLm9uKCdwaXRjaGVuZCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgcGl0Y2hlbmQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAncGl0Y2hlbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIHN0YXJ0cy4gU2VlIHtAbGluayBCb3hab29tSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgYm94em9vbXN0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBCb3hab29tRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYmVmb3JlIGEgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIHN0YXJ0cy5cbiAgICAgKiBtYXAub24oJ2JveHpvb21zdGFydCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgYm94em9vbXN0YXJ0IGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ2JveHpvb21zdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gZW5kcy4gIFNlZSB7QGxpbmsgQm94Wm9vbUhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IGJveHpvb21lbmRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAdHlwZSB7TWFwQm94Wm9vbUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBqdXN0IGFmdGVyIGEgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGVuZHMuXG4gICAgICogbWFwLm9uKCdib3h6b29tZW5kJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBib3h6b29tZW5kIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ2JveHpvb21lbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgYSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24sIG9yIHdoZW4gdGhlIGJvdW5kaW5nIGJveCBkb2VzIG5vdCBtZWV0IHRoZSBtaW5pbXVtIHNpemUgdGhyZXNob2xkLlxuICAgICAqIFNlZSB7QGxpbmsgQm94Wm9vbUhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IGJveHpvb21jYW5jZWxcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcEJveFpvb21FdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gdGhlIHVzZXIgY2FuY2VscyBhIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKiBtYXAub24oJ2JveHpvb21jYW5jZWwnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIGJveHpvb21jYW5jZWwgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnYm94em9vbWNhbmNlbCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYXAgaGFzIGJlZW4gcmVzaXplZC5cbiAgICAgKlxuICAgICAqIEBldmVudCByZXNpemVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYXAgaGFzIGJlZW4gcmVzaXplZC5cbiAgICAgKiBtYXAub24oJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgcmVzaXplIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3Jlc2l6ZSdcblxuICAgIC8qKiBAc2VjdGlvbiB7TGlmZWN5Y2xlfVxuICAgICAqIEBldmVudFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXAgKi9cblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIGFsbCBuZWNlc3NhcnkgcmVzb3VyY2VzIGhhdmUgYmVlbiBkb3dubG9hZGVkXG4gICAgICogYW5kIHRoZSBmaXJzdCB2aXN1YWxseSBjb21wbGV0ZSByZW5kZXJpbmcgb2YgdGhlIG1hcCBoYXMgb2NjdXJyZWQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbG9hZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIHRoZSBtYXAgaGFzIGZpbmlzaGVkIGxvYWRpbmcuXG4gICAgICogbWFwLm9uKCdsb2FkJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBsb2FkIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IERyYXcgR2VvSlNPTiBwb2ludHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2VvanNvbi1tYXJrZXJzLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBZGQgbGl2ZSByZWFsdGltZSBkYXRhXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2xpdmUtZ2VvanNvbi8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQW5pbWF0ZSBhIHBvaW50XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FuaW1hdGUtcG9pbnQtYWxvbmctbGluZS8pXG4gICAgICovXG4gICAgfCAnbG9hZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW5ldmVyIHRoZSBtYXAgaXMgZHJhd24gdG8gdGhlIHNjcmVlbiwgYXMgdGhlIHJlc3VsdCBvZjpcbiAgICAgKlxuICAgICAqIC0gYSBjaGFuZ2UgdG8gdGhlIG1hcCdzIHBvc2l0aW9uLCB6b29tLCBwaXRjaCwgb3IgYmVhcmluZ1xuICAgICAqIC0gYSBjaGFuZ2UgdG8gdGhlIG1hcCdzIHN0eWxlXG4gICAgICogLSBhIGNoYW5nZSB0byBhIEdlb0pTT04gc291cmNlXG4gICAgICogLSB0aGUgbG9hZGluZyBvZiBhIHZlY3RvciB0aWxlLCBHZW9KU09OIGZpbGUsIGdseXBoLCBvciBzcHJpdGUuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcmVuZGVyXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuZXZlciB0aGUgbWFwIGlzIGRyYXduIHRvIHRoZSBzY3JlZW4uXG4gICAgICogbWFwLm9uKCdyZW5kZXInLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHJlbmRlciBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdyZW5kZXInXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBhZnRlciB0aGUgbGFzdCBmcmFtZSByZW5kZXJlZCBiZWZvcmUgdGhlIG1hcCBlbnRlcnMgYW5cbiAgICAgKiBcImlkbGVcIiBzdGF0ZTpcbiAgICAgKlxuICAgICAqIC0gTm8gY2FtZXJhIHRyYW5zaXRpb25zIGFyZSBpbiBwcm9ncmVzc1xuICAgICAqIC0gQWxsIGN1cnJlbnRseSByZXF1ZXN0ZWQgdGlsZXMgaGF2ZSBsb2FkZWRcbiAgICAgKiAtIEFsbCBmYWRlL3RyYW5zaXRpb24gYW5pbWF0aW9ucyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgKlxuICAgICAqIEBldmVudCBpZGxlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBqdXN0IGJlZm9yZSB0aGUgbWFwIGVudGVycyBhbiBcImlkbGVcIiBzdGF0ZS5cbiAgICAgKiBtYXAub24oJ2lkbGUnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIGlkbGUgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnaWRsZSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYXAgaGFzIGJlZW4gcmVtb3ZlZCB3aXRoIHtAbGluayBNYXAuZXZlbnQ6cmVtb3ZlfS5cbiAgICAgKlxuICAgICAqIEBldmVudCByZW1vdmVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYWZ0ZXIgdGhlIG1hcCBpcyByZW1vdmVkLlxuICAgICAqIG1hcC5vbigncmVtb3ZlJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSByZW1vdmUgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAncmVtb3ZlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMuIFRoaXMgaXMgTWFwYm94IEdMIEpTJ3MgcHJpbWFyeSBlcnJvciByZXBvcnRpbmdcbiAgICAgKiBtZWNoYW5pc20uIFdlIHVzZSBhbiBldmVudCBpbnN0ZWFkIG9mIGB0aHJvd2AgdG8gYmV0dGVyIGFjY29tbW9kYXRlXG4gICAgICogYXN5bmNyb25vdXMgb3BlcmF0aW9ucy4gSWYgbm8gbGlzdGVuZXJzIGFyZSBib3VuZCB0byB0aGUgYGVycm9yYCBldmVudCwgdGhlXG4gICAgICogZXJyb3Igd2lsbCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlLlxuICAgICAqXG4gICAgICogQGV2ZW50IGVycm9yXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZXNzYWdlIEVycm9yIG1lc3NhZ2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICAgICAqIG1hcC5vbignZXJyb3InLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIGVycm9yIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ2Vycm9yJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgV2ViR0wgY29udGV4dCBpcyBsb3N0LlxuICAgICAqXG4gICAgICogQGV2ZW50IHdlYmdsY29udGV4dGxvc3RcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gdGhlIFdlYkdMIGNvbnRleHQgaXMgbG9zdC5cbiAgICAgKiBtYXAub24oJ3dlYmdsY29udGV4dGxvc3QnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHdlYmdsY29udGV4dGxvc3QgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnd2ViZ2xjb250ZXh0bG9zdCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIFdlYkdMIGNvbnRleHQgaXMgcmVzdG9yZWQuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgd2ViZ2xjb250ZXh0cmVzdG9yZWRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gdGhlIFdlYkdMIGNvbnRleHQgaXMgcmVzdG9yZWQuXG4gICAgICogbWFwLm9uKCd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0Egd2ViZ2xjb250ZXh0cmVzdG9yZWQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnXG5cbiAgICAvKiogQHNlY3Rpb24ge0RhdGEgbG9hZGluZ31cbiAgICAgKiBAZXZlbnRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwICovXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGFueSBtYXAgZGF0YSBsb2FkcyBvciBjaGFuZ2VzLiBTZWUge0BsaW5rIE1hcERhdGFFdmVudH1cbiAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBldmVudCBkYXRhXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBEYXRhRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gbWFwIGRhdGEgbG9hZHMgb3IgY2hhbmdlcy5cbiAgICAgKiBtYXAub24oJ2RhdGEnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIGRhdGEgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBIVE1MIGNsdXN0ZXJzIHdpdGggY3VzdG9tIHByb3BlcnRpZXNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NsdXN0ZXItaHRtbC8pXG4gICAgICovXG4gICAgfCAnZGF0YSdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIG1hcCdzIHN0eWxlIGxvYWRzIG9yIGNoYW5nZXMuIFNlZVxuICAgICAqIHtAbGluayBNYXBEYXRhRXZlbnR9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IHN0eWxlZGF0YVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwRGF0YUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIHRoZSBtYXAncyBzdHlsZSBsb2FkcyBvciBjaGFuZ2VzLlxuICAgICAqIG1hcC5vbignc3R5bGVkYXRhJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBzdHlsZWRhdGEgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnc3R5bGVkYXRhJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBvbmUgb2YgdGhlIG1hcCdzIHNvdXJjZXMgbG9hZHMgb3IgY2hhbmdlcywgaW5jbHVkaW5nIGlmIGEgdGlsZSBiZWxvbmdpbmdcbiAgICAgKiB0byBhIHNvdXJjZSBsb2FkcyBvciBjaGFuZ2VzLiBTZWUge0BsaW5rIE1hcERhdGFFdmVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgc291cmNlZGF0YVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwRGF0YUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIG9uZSBvZiB0aGUgbWFwJ3Mgc291cmNlcyBsb2FkcyBvciBjaGFuZ2VzLlxuICAgICAqIG1hcC5vbignc291cmNlZGF0YScsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0Egc291cmNlZGF0YSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdzb3VyY2VkYXRhJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhbnkgbWFwIGRhdGEgKHN0eWxlLCBzb3VyY2UsIHRpbGUsIGV0YykgYmVnaW5zIGxvYWRpbmcgb3JcbiAgICAgKiBjaGFuZ2luZyBhc3luY2hyb25vdXNseS4gQWxsIGBkYXRhbG9hZGluZ2AgZXZlbnRzIGFyZSBmb2xsb3dlZCBieSBhIGBkYXRhYFxuICAgICAqIG9yIGBlcnJvcmAgZXZlbnQuIFNlZSB7QGxpbmsgTWFwRGF0YUV2ZW50fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBldmVudCBkYXRhbG9hZGluZ1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwRGF0YUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIGFueSBtYXAgZGF0YSBiZWdpbnMgbG9hZGluZ1xuICAgICAqIC8vIG9yIGNoYW5naW5nIGFzeW5jaHJvbm91c2x5LlxuICAgICAqIG1hcC5vbignZGF0YWxvYWRpbmcnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIGRhdGFsb2FkaW5nIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ2RhdGFsb2FkaW5nJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgbWFwJ3Mgc3R5bGUgYmVnaW5zIGxvYWRpbmcgb3IgY2hhbmdpbmcgYXN5bmNocm9ub3VzbHkuXG4gICAgICogQWxsIGBzdHlsZWRhdGFsb2FkaW5nYCBldmVudHMgYXJlIGZvbGxvd2VkIGJ5IGEgYHN0eWxlZGF0YWBcbiAgICAgKiBvciBgZXJyb3JgIGV2ZW50LiBTZWUge0BsaW5rIE1hcERhdGFFdmVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgc3R5bGVkYXRhbG9hZGluZ1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwRGF0YUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIHRoZSBtYXAncyBzdHlsZSBiZWdpbnMgbG9hZGluZyBvclxuICAgICAqIC8vIGNoYW5naW5nIGFzeW5jaHJvbm91c2x5LlxuICAgICAqIG1hcC5vbignc3R5bGVkYXRhbG9hZGluZycsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0Egc3R5bGVkYXRhbG9hZGluZyBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdzdHlsZWRhdGFsb2FkaW5nJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBvbmUgb2YgdGhlIG1hcCdzIHNvdXJjZXMgYmVnaW5zIGxvYWRpbmcgb3IgY2hhbmdpbmcgYXN5bmNocm9ub3VzbHkuXG4gICAgICogQWxsIGBzb3VyY2VkYXRhbG9hZGluZ2AgZXZlbnRzIGFyZSBmb2xsb3dlZCBieSBhIGBzb3VyY2VkYXRhYCBvciBgZXJyb3JgIGV2ZW50LlxuICAgICAqIFNlZSB7QGxpbmsgTWFwRGF0YUV2ZW50fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBldmVudCBzb3VyY2VkYXRhbG9hZGluZ1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwRGF0YUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIHRoZSBtYXAncyBzb3VyY2VzIGJlZ2luIGxvYWRpbmcgb3JcbiAgICAgKiAvLyBjaGFuZ2luZyBhc3luY2hyb25vdXNseS5cbiAgICAgKiBtYXAub24oJ3NvdXJjZWRhdGFsb2FkaW5nJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBzb3VyY2VkYXRhbG9hZGluZyBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdzb3VyY2VkYXRhbG9hZGluZydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW4gaWNvbiBvciBwYXR0ZXJuIG5lZWRlZCBieSB0aGUgc3R5bGUgaXMgbWlzc2luZy4gVGhlIG1pc3NpbmcgaW1hZ2UgY2FuXG4gICAgICogYmUgYWRkZWQgd2l0aCB7QGxpbmsgTWFwI2FkZEltYWdlfSB3aXRoaW4gdGhpcyBldmVudCBsaXN0ZW5lciBjYWxsYmFjayB0byBwcmV2ZW50IHRoZSBpbWFnZSBmcm9tXG4gICAgICogYmVpbmcgc2tpcHBlZC4gVGhpcyBldmVudCBjYW4gYmUgdXNlZCB0byBkeW5hbWljYWxseSBnZW5lcmF0ZSBpY29ucyBhbmQgcGF0dGVybnMuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgc3R5bGVpbWFnZW1pc3NpbmdcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgbWlzc2luZyBpbWFnZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiBhbiBpY29uIG9yIHBhdHRlcm4gaXMgbWlzc2luZy5cbiAgICAgKiBtYXAub24oJ3N0eWxlaW1hZ2VtaXNzaW5nJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBzdHlsZWltYWdlbWlzc2luZyBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBHZW5lcmF0ZSBhbmQgYWRkIGEgbWlzc2luZyBpY29uIHRvIHRoZSBtYXBdKGh0dHBzOi8vbWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGQtaW1hZ2UtbWlzc2luZy1nZW5lcmF0ZWQvKVxuICAgICAqL1xuICAgIHwgJ3N0eWxlaW1hZ2VtaXNzaW5nJ1xuXG4gICAgLyoqXG4gICAgICogQGV2ZW50IHN0eWxlLmxvYWRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB8ICdzdHlsZS5sb2FkJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgYWZ0ZXIgc3BlZWQgaW5kZXggY2FsY3VsYXRpb24gaXMgY29tcGxldGVkIGlmIGBzcGVlZEluZGV4VGltaW5nYCBvcHRpb24gaGFzIGJlZW4gc2V0IHRvIGB0cnVlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV2ZW50IHNwZWVkaW5kZXhjb21wbGV0ZWRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogbWFwLnNwZWVkSW5kZXhUaW1pbmcgPSB0cnVlO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gYWZ0ZXIgc3BlZWQgaW5kZXggY2FsY3VsYXRpb24gaXMgY29tcGxldGVkLlxuICAgICAqIG1hcC5vbignc3BlZWRpbmRleGNvbXBsZXRlZCcsIGZ1bmN0aW9uKCkge1xuICAgICAqICAgY29uc29sZS5sb2coYHNwZWVkIGluZGV4IGlzICR7bWFwLnNwZWVkSW5kZXhOdW1iZXJ9YCk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnc3BlZWRpbmRleGNvbXBsZXRlZCdcbjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtNYXBNb3VzZUV2ZW50LCBNYXBUb3VjaEV2ZW50LCBNYXBXaGVlbEV2ZW50fSBmcm9tICcuLi9ldmVudHMuanMnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBNYXBFdmVudEhhbmRsZXIge1xuXG4gICAgX21vdXNlZG93blBvczogUG9pbnQ7XG4gICAgX2NsaWNrVG9sZXJhbmNlOiBudW1iZXI7XG4gICAgX21hcDogTWFwO1xuXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IHsgY2xpY2tUb2xlcmFuY2U6IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSBvcHRpb25zLmNsaWNrVG9sZXJhbmNlO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fbW91c2Vkb3duUG9zO1xuICAgIH1cblxuICAgIHdoZWVsKGU6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgLy8gSWYgbWFwRXZlbnQucHJldmVudERlZmF1bHQoKSBpcyBjYWxsZWQgYnkgdGhlIHVzZXIsIHByZXZlbnQgaGFuZGxlcnMgc3VjaCBhczpcbiAgICAgICAgLy8gLSBTY3JvbGxab29tXG4gICAgICAgIHJldHVybiB0aGlzLl9maXJlUHJldmVudGFibGUobmV3IE1hcFdoZWVsRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICB9XG5cbiAgICBtb3VzZWRvd24oZTogTW91c2VFdmVudCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgICAgIHRoaXMuX21vdXNlZG93blBvcyA9IHBvaW50O1xuICAgICAgICAvLyBJZiBtYXBFdmVudC5wcmV2ZW50RGVmYXVsdCgpIGlzIGNhbGxlZCBieSB0aGUgdXNlciwgcHJldmVudCBoYW5kbGVycyBzdWNoIGFzOlxuICAgICAgICAvLyAtIE1vdXNlUGFuXG4gICAgICAgIC8vIC0gTW91c2VSb3RhdGVcbiAgICAgICAgLy8gLSBNb3VzZVBpdGNoXG4gICAgICAgIC8vIC0gRGJsY2xpY2tIYW5kbGVyXG4gICAgICAgIHJldHVybiB0aGlzLl9maXJlUHJldmVudGFibGUobmV3IE1hcE1vdXNlRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICB9XG5cbiAgICBtb3VzZXVwKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICB9XG5cbiAgICBwcmVjbGljayhlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHN5bnRoID0gZXh0ZW5kKHt9LCBlKTtcbiAgICAgICAgc3ludGgudHlwZSA9ICdwcmVjbGljayc7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBNYXBNb3VzZUV2ZW50KHN5bnRoLnR5cGUsIHRoaXMuX21hcCwgc3ludGgpKTtcbiAgICB9XG5cbiAgICBjbGljayhlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vdXNlZG93blBvcyAmJiB0aGlzLl9tb3VzZWRvd25Qb3MuZGlzdChwb2ludCkgPj0gdGhpcy5fY2xpY2tUb2xlcmFuY2UpIHJldHVybjtcbiAgICAgICAgdGhpcy5wcmVjbGljayhlKTtcbiAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICB9XG5cbiAgICBkYmxjbGljayhlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIC8vIElmIG1hcEV2ZW50LnByZXZlbnREZWZhdWx0KCkgaXMgY2FsbGVkIGJ5IHRoZSB1c2VyLCBwcmV2ZW50IGhhbmRsZXJzIHN1Y2ggYXM6XG4gICAgICAgIC8vIC0gRGJsQ2xpY2tab29tXG4gICAgICAgIHJldHVybiB0aGlzLl9maXJlUHJldmVudGFibGUobmV3IE1hcE1vdXNlRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICB9XG5cbiAgICBtb3VzZW92ZXIoZTogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIG1vdXNlb3V0KGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICB9XG5cbiAgICB0b3VjaHN0YXJ0KGU6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgLy8gSWYgbWFwRXZlbnQucHJldmVudERlZmF1bHQoKSBpcyBjYWxsZWQgYnkgdGhlIHVzZXIsIHByZXZlbnQgaGFuZGxlcnMgc3VjaCBhczpcbiAgICAgICAgLy8gLSBUb3VjaFBhblxuICAgICAgICAvLyAtIFRvdWNoWm9vbVxuICAgICAgICAvLyAtIFRvdWNoUm90YXRlXG4gICAgICAgIC8vIC0gVG91Y2hQaXRjaFxuICAgICAgICAvLyAtIFRhcFpvb21cbiAgICAgICAgLy8gLSBTd2lwZVpvb21cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVQcmV2ZW50YWJsZShuZXcgTWFwVG91Y2hFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIHRvdWNobW92ZShlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBNYXBUb3VjaEV2ZW50KGUudHlwZSwgdGhpcy5fbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgdG91Y2hlbmQoZTogVG91Y2hFdmVudCkge1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwVG91Y2hFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIHRvdWNoY2FuY2VsKGU6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IE1hcFRvdWNoRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICB9XG5cbiAgICBfZmlyZVByZXZlbnRhYmxlKG1hcEV2ZW50OiBNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudCB8IE1hcFdoZWVsRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fbWFwLmZpcmUobWFwRXZlbnQpO1xuICAgICAgICBpZiAobWFwRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgLy8gcmV0dXJuaW5nIGFuIG9iamVjdCBtYXJrcyB0aGUgaGFuZGxlciBhcyBhY3RpdmUgYW5kIHJlc2V0cyBvdGhlciBoYW5kbGVyc1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbmFibGUoKSB7fVxuICAgIGRpc2FibGUoKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgQmxvY2thYmxlTWFwRXZlbnRIYW5kbGVyIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2RlbGF5Q29udGV4dE1lbnU6IGJvb2xlYW47XG4gICAgX2NvbnRleHRNZW51RXZlbnQ6IE1vdXNlRXZlbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2RlbGF5Q29udGV4dE1lbnUgPSBmYWxzZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2NvbnRleHRNZW51RXZlbnQ7XG4gICAgfVxuXG4gICAgbW91c2Vtb3ZlKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgLy8gbW91c2Vtb3ZlIG1hcCBldmVudHMgc2hvdWxkIG5vdCBiZSBmaXJlZCB3aGVuIGludGVyYWN0aW9uIGhhbmRsZXJzIChwYW4sIHJvdGF0ZSwgZXRjKSBhcmUgYWN0aXZlXG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBNYXBNb3VzZUV2ZW50KGUudHlwZSwgdGhpcy5fbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgbW91c2Vkb3duKCkge1xuICAgICAgICB0aGlzLl9kZWxheUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBtb3VzZXVwKCkge1xuICAgICAgICB0aGlzLl9kZWxheUNvbnRleHRNZW51ID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9jb250ZXh0TWVudUV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudCgnY29udGV4dG1lbnUnLCB0aGlzLl9tYXAsIHRoaXMuX2NvbnRleHRNZW51RXZlbnQpKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jb250ZXh0TWVudUV2ZW50O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnRleHRtZW51KGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlbGF5Q29udGV4dE1lbnUpIHtcbiAgICAgICAgICAgIC8vIE1hYzogY29udGV4dG1lbnUgZmlyZWQgb24gbW91c2Vkb3duOyB3ZSBzYXZlIGl0IHVudGlsIG1vdXNldXAgZm9yIGNvbnNpc3RlbmN5J3Mgc2FrZVxuICAgICAgICAgICAgdGhpcy5fY29udGV4dE1lbnVFdmVudCA9IGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBXaW5kb3dzOiBjb250ZXh0bWVudSBmaXJlZCBvbiBtb3VzZXVwLCBzbyBmaXJlIGV2ZW50IG5vd1xuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHByZXZlbnQgYnJvd3NlciBjb250ZXh0IG1lbnUgd2hlbiBuZWNlc3NhcnlcbiAgICAgICAgaWYgKHRoaXMuX21hcC5saXN0ZW5zKCdjb250ZXh0bWVudScpKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVuYWJsZSgpIHt9XG4gICAgZGlzYWJsZSgpIHt9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tLmpzJztcblxuaW1wb3J0IHtFdmVudH0gZnJvbSAnLi4vLi4vdXRpbC9ldmVudGVkLmpzJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcC5qcyc7XG5cbi8qKlxuICogVGhlIGBCb3hab29tSGFuZGxlcmAgYWxsb3dzIHRoZSB1c2VyIHRvIHpvb20gdGhlIG1hcCB0byBmaXQgd2l0aGluIGEgYm91bmRpbmcgYm94LlxuICogVGhlIGJvdW5kaW5nIGJveCBpcyBkZWZpbmVkIGJ5IGNsaWNraW5nIGFuZCBob2xkaW5nIGBzaGlmdGAgd2hpbGUgZHJhZ2dpbmcgdGhlIGN1cnNvci5cbiAqXG4gKiBAc2VlIFtFeGFtcGxlOiBUb2dnbGUgaW50ZXJhY3Rpb25zXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90b2dnbGUtaW50ZXJhY3Rpb24taGFuZGxlcnMvKVxuICogQHNlZSBbRXhhbXBsZTogSGlnaGxpZ2h0IGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gKi9cbmNsYXNzIEJveFpvb21IYW5kbGVyIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfZW5hYmxlZDogYm9vbGVhbjtcbiAgICBfYWN0aXZlOiBib29sZWFuO1xuICAgIF9zdGFydFBvczogUG9pbnQ7XG4gICAgX2xhc3RQb3M6IFBvaW50O1xuICAgIF9ib3g6IEhUTUxFbGVtZW50O1xuICAgIF9jbGlja1RvbGVyYW5jZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCwgb3B0aW9uczoge1xuICAgICAgICBjbGlja1RvbGVyYW5jZTogbnVtYmVyXG4gICAgfSkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBtYXAuZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gb3B0aW9ucy5jbGlja1RvbGVyYW5jZSB8fCAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNCb3hab29tRW5hYmxlZCA9IG1hcC5ib3hab29tLmlzRW5hYmxlZCgpO1xuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUgKGN1cnJlbnRseSBiZWluZyB1c2VkKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGlzQm94Wm9vbUFjdGl2ZSA9IG1hcC5ib3hab29tLmlzQWN0aXZlKCk7XG4gICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2FjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5ib3hab29tLmVuYWJsZSgpO1xuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmJveFpvb20uZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgbW91c2Vkb3duKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgaWYgKCEoZS5zaGlmdEtleSAmJiBlLmJ1dHRvbiA9PT0gMCkpIHJldHVybjtcblxuICAgICAgICBET00uZGlzYWJsZURyYWcoKTtcbiAgICAgICAgdGhpcy5fc3RhcnRQb3MgPSB0aGlzLl9sYXN0UG9zID0gcG9pbnQ7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgbW91c2Vtb3ZlV2luZG93KGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBvcyA9IHBvaW50O1xuXG4gICAgICAgIGlmICh0aGlzLl9sYXN0UG9zLmVxdWFscyhwb3MpIHx8ICghdGhpcy5fYm94ICYmIHBvcy5kaXN0KHRoaXMuX3N0YXJ0UG9zKSA8IHRoaXMuX2NsaWNrVG9sZXJhbmNlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcDAgPSB0aGlzLl9zdGFydFBvcztcbiAgICAgICAgdGhpcy5fbGFzdFBvcyA9IHBvcztcblxuICAgICAgICBpZiAoIXRoaXMuX2JveCkge1xuICAgICAgICAgICAgdGhpcy5fYm94ID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWJveHpvb20nLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNyb3NzaGFpcicpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdib3h6b29tc3RhcnQnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbihwMC54LCBwb3MueCksXG4gICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgocDAueCwgcG9zLngpLFxuICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKHAwLnksIHBvcy55KSxcbiAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChwMC55LCBwb3MueSk7XG5cbiAgICAgICAgdGhpcy5fbWFwLl9yZXF1ZXN0RG9tVGFzaygoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYm94KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYm94LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHttaW5YfXB4LCR7bWluWX1weClgO1xuICAgICAgICAgICAgICAgIHRoaXMuX2JveC5zdHlsZS53aWR0aCA9IGAke21heFggLSBtaW5YfXB4YDtcbiAgICAgICAgICAgICAgICB0aGlzLl9ib3guc3R5bGUuaGVpZ2h0ID0gYCR7bWF4WSAtIG1pbll9cHhgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBtb3VzZXVwV2luZG93KGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHAwID0gdGhpcy5fc3RhcnRQb3MsXG4gICAgICAgICAgICBwMSA9IHBvaW50O1xuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcblxuICAgICAgICBET00uc3VwcHJlc3NDbGljaygpO1xuXG4gICAgICAgIGlmIChwMC54ID09PSBwMS54ICYmIHAwLnkgPT09IHAxLnkpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnYm94em9vbWNhbmNlbCcsIGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IEV2ZW50KCdib3h6b29tZW5kJywge29yaWdpbmFsRXZlbnQ6IGV9KSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNhbWVyYUFuaW1hdGlvbjogbWFwID0+IG1hcC5maXRTY3JlZW5Db29yZGluYXRlcyhwMCwgcDEsIHRoaXMuX21hcC5nZXRCZWFyaW5nKCksIHtsaW5lYXI6IGZhbHNlfSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBrZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUpIHJldHVybjtcblxuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdib3h6b29tY2FuY2VsJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBibHVyKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jcm9zc2hhaXInKTtcblxuICAgICAgICBpZiAodGhpcy5fYm94KSB7XG4gICAgICAgICAgICB0aGlzLl9ib3gucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLl9ib3ggPSAobnVsbDogYW55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5lbmFibGVEcmFnKCk7XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXJ0UG9zO1xuICAgICAgICBkZWxldGUgdGhpcy5fbGFzdFBvcztcbiAgICB9XG5cbiAgICBfZmlyZUV2ZW50KHR5cGU6IHN0cmluZywgZTogKikge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmZpcmUobmV3IEV2ZW50KHR5cGUsIHtvcmlnaW5hbEV2ZW50OiBlfSkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQm94Wm9vbUhhbmRsZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmRleFRvdWNoZXModG91Y2hlczogQXJyYXk8VG91Y2g+LCBwb2ludHM6IEFycmF5PFBvaW50Pikge1xuICAgIGFzc2VydCh0b3VjaGVzLmxlbmd0aCA9PT0gcG9pbnRzLmxlbmd0aCk7XG4gICAgY29uc3Qgb2JqID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9ialt0b3VjaGVzW2ldLmlkZW50aWZpZXJdID0gcG9pbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtpbmRleFRvdWNoZXN9IGZyb20gJy4vaGFuZGxlcl91dGlsLmpzJztcblxuZnVuY3Rpb24gZ2V0Q2VudHJvaWQocG9pbnRzOiBBcnJheTxQb2ludD4pIHtcbiAgICBjb25zdCBzdW0gPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgZm9yIChjb25zdCBwb2ludCBvZiBwb2ludHMpIHtcbiAgICAgICAgc3VtLl9hZGQocG9pbnQpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtLmRpdihwb2ludHMubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGNvbnN0IE1BWF9UQVBfSU5URVJWQUwgPSA1MDA7XG5jb25zdCBNQVhfVE9VQ0hfVElNRSA9IDUwMDtcbmNvbnN0IE1BWF9ESVNUID0gMzA7XG5cbmV4cG9ydCBjbGFzcyBTaW5nbGVUYXBSZWNvZ25pemVyIHtcblxuICAgIG51bVRvdWNoZXM6IG51bWJlcjtcbiAgICBjZW50cm9pZDogUG9pbnQ7XG4gICAgc3RhcnRUaW1lOiBudW1iZXI7XG4gICAgYWJvcnRlZDogYm9vbGVhbjtcbiAgICB0b3VjaGVzOiB7IFtudW1iZXIgfCBzdHJpbmddOiBQb2ludCB9O1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogeyBudW1Ub3VjaGVzOiBudW1iZXIgfSkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHRoaXMubnVtVG91Y2hlcyA9IG9wdGlvbnMubnVtVG91Y2hlcztcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2VudHJvaWQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnN0YXJ0VGltZTtcbiAgICAgICAgZGVsZXRlIHRoaXMudG91Y2hlcztcbiAgICAgICAgdGhpcy5hYm9ydGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdG91Y2hzdGFydChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG5cbiAgICAgICAgaWYgKHRoaXMuY2VudHJvaWQgfHwgbWFwVG91Y2hlcy5sZW5ndGggPiB0aGlzLm51bVRvdWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWJvcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhcnRUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lID0gZS50aW1lU3RhbXA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFwVG91Y2hlcy5sZW5ndGggPT09IHRoaXMubnVtVG91Y2hlcykge1xuICAgICAgICAgICAgdGhpcy5jZW50cm9pZCA9IGdldENlbnRyb2lkKHBvaW50cyk7XG4gICAgICAgICAgICB0aGlzLnRvdWNoZXMgPSBpbmRleFRvdWNoZXMobWFwVG91Y2hlcywgcG9pbnRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvdWNobW92ZShlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGlmICh0aGlzLmFib3J0ZWQgfHwgIXRoaXMuY2VudHJvaWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBuZXdUb3VjaGVzID0gaW5kZXhUb3VjaGVzKG1hcFRvdWNoZXMsIHBvaW50cyk7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy50b3VjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2UG9zID0gdGhpcy50b3VjaGVzW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IG5ld1RvdWNoZXNbaWRdO1xuICAgICAgICAgICAgaWYgKCFwb3MgfHwgcG9zLmRpc3QocHJldlBvcykgPiBNQVhfRElTVCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b3VjaGVuZChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGlmICghdGhpcy5jZW50cm9pZCB8fCBlLnRpbWVTdGFtcCAtIHRoaXMuc3RhcnRUaW1lID4gTUFYX1RPVUNIX1RJTUUpIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFwVG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRyb2lkID0gIXRoaXMuYWJvcnRlZCAmJiB0aGlzLmNlbnRyb2lkO1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgaWYgKGNlbnRyb2lkKSByZXR1cm4gY2VudHJvaWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIFRhcFJlY29nbml6ZXIge1xuXG4gICAgc2luZ2xlVGFwOiBTaW5nbGVUYXBSZWNvZ25pemVyO1xuICAgIG51bVRhcHM6IG51bWJlcjtcbiAgICBsYXN0VGltZTogbnVtYmVyO1xuICAgIGxhc3RUYXA6IFBvaW50O1xuICAgIGNvdW50OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IG51bVRhcHM6IG51bWJlciwgbnVtVG91Y2hlczogbnVtYmVyIH0pIHtcbiAgICAgICAgdGhpcy5zaW5nbGVUYXAgPSBuZXcgU2luZ2xlVGFwUmVjb2duaXplcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5udW1UYXBzID0gb3B0aW9ucy5udW1UYXBzO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMubGFzdFRpbWUgPSBJbmZpbml0eTtcbiAgICAgICAgZGVsZXRlIHRoaXMubGFzdFRhcDtcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc2luZ2xlVGFwLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgdG91Y2hzdGFydChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIHRoaXMuc2luZ2xlVGFwLnRvdWNoc3RhcnQoZSwgcG9pbnRzLCBtYXBUb3VjaGVzKTtcbiAgICB9XG5cbiAgICB0b3VjaG1vdmUoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICB0aGlzLnNpbmdsZVRhcC50b3VjaG1vdmUoZSwgcG9pbnRzLCBtYXBUb3VjaGVzKTtcbiAgICB9XG5cbiAgICB0b3VjaGVuZChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGNvbnN0IHRhcCA9IHRoaXMuc2luZ2xlVGFwLnRvdWNoZW5kKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgIGlmICh0YXApIHtcbiAgICAgICAgICAgIGNvbnN0IHNvb25Fbm91Z2ggPSBlLnRpbWVTdGFtcCAtIHRoaXMubGFzdFRpbWUgPCBNQVhfVEFQX0lOVEVSVkFMO1xuICAgICAgICAgICAgY29uc3QgY2xvc2VFbm91Z2ggPSAhdGhpcy5sYXN0VGFwIHx8IHRoaXMubGFzdFRhcC5kaXN0KHRhcCkgPCBNQVhfRElTVDtcblxuICAgICAgICAgICAgaWYgKCFzb29uRW5vdWdoIHx8ICFjbG9zZUVub3VnaCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xuICAgICAgICAgICAgdGhpcy5sYXN0VGltZSA9IGUudGltZVN0YW1wO1xuICAgICAgICAgICAgdGhpcy5sYXN0VGFwID0gdGFwO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jb3VudCA9PT0gdGhpcy5udW1UYXBzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1RhcFJlY29nbml6ZXJ9IGZyb20gJy4vdGFwX3JlY29nbml6ZXIuanMnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFwWm9vbUhhbmRsZXIge1xuXG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfem9vbUluOiBUYXBSZWNvZ25pemVyO1xuICAgIF96b29tT3V0OiBUYXBSZWNvZ25pemVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3pvb21JbiA9IG5ldyBUYXBSZWNvZ25pemVyKHtcbiAgICAgICAgICAgIG51bVRvdWNoZXM6IDEsXG4gICAgICAgICAgICBudW1UYXBzOiAyXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3pvb21PdXQgPSBuZXcgVGFwUmVjb2duaXplcih7XG4gICAgICAgICAgICBudW1Ub3VjaGVzOiAyLFxuICAgICAgICAgICAgbnVtVGFwczogMVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl96b29tSW4ucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fem9vbU91dC5yZXNldCgpO1xuICAgIH1cblxuICAgIHRvdWNoc3RhcnQoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICB0aGlzLl96b29tSW4udG91Y2hzdGFydChlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgICAgICB0aGlzLl96b29tT3V0LnRvdWNoc3RhcnQoZSwgcG9pbnRzLCBtYXBUb3VjaGVzKTtcbiAgICB9XG5cbiAgICB0b3VjaG1vdmUoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICB0aGlzLl96b29tSW4udG91Y2htb3ZlKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgIHRoaXMuX3pvb21PdXQudG91Y2htb3ZlKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgfVxuXG4gICAgdG91Y2hlbmQoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICBjb25zdCB6b29tSW5Qb2ludCA9IHRoaXMuX3pvb21Jbi50b3VjaGVuZChlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgICAgICBjb25zdCB6b29tT3V0UG9pbnQgPSB0aGlzLl96b29tT3V0LnRvdWNoZW5kKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG5cbiAgICAgICAgaWYgKHpvb21JblBvaW50KSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlc2V0KCksIDApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjYW1lcmFBbmltYXRpb246IChtYXA6IE1hcCkgPT4gbWFwLmVhc2VUbyh7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICAgICAgICAgICAgICAgIHpvb206IG1hcC5nZXRab29tKCkgKyAxLFxuICAgICAgICAgICAgICAgICAgICBhcm91bmQ6IG1hcC51bnByb2plY3Qoem9vbUluUG9pbnQpXG4gICAgICAgICAgICAgICAgfSwge29yaWdpbmFsRXZlbnQ6IGV9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmICh6b29tT3V0UG9pbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVzZXQoKSwgMCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNhbWVyYUFuaW1hdGlvbjogKG1hcDogTWFwKSA9PiBtYXAuZWFzZVRvKHtcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgICAgICAgICAgem9vbTogbWFwLmdldFpvb20oKSAtIDEsXG4gICAgICAgICAgICAgICAgICAgIGFyb3VuZDogbWFwLnVucHJvamVjdCh6b29tT3V0UG9pbnQpXG4gICAgICAgICAgICAgICAgfSwge29yaWdpbmFsRXZlbnQ6IGV9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvdWNoY2FuY2VsKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20uanMnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmNvbnN0IExFRlRfQlVUVE9OID0gMDtcbmNvbnN0IFJJR0hUX0JVVFRPTiA9IDI7XG5cbi8vIHRoZSB2YWx1ZXMgZm9yIGVhY2ggYnV0dG9uIGluIE1vdXNlRXZlbnQuYnV0dG9uc1xuY29uc3QgQlVUVE9OU19GTEFHUyA9IHtcbiAgICBbTEVGVF9CVVRUT05dOiAxLFxuICAgIFtSSUdIVF9CVVRUT05dOiAyXG59O1xuXG5mdW5jdGlvbiBidXR0b25TdGlsbFByZXNzZWQoZTogTW91c2VFdmVudCwgYnV0dG9uOiBudW1iZXIpIHtcbiAgICBjb25zdCBmbGFnID0gQlVUVE9OU19GTEFHU1tidXR0b25dO1xuICAgIHJldHVybiBlLmJ1dHRvbnMgPT09IHVuZGVmaW5lZCB8fCAoZS5idXR0b25zICYgZmxhZykgIT09IGZsYWc7XG59XG5cbmNsYXNzIE1vdXNlSGFuZGxlciB7XG5cbiAgICBfZW5hYmxlZDogYm9vbGVhbjtcbiAgICBfYWN0aXZlOiBib29sZWFuO1xuICAgIF9sYXN0UG9pbnQ6IFBvaW50O1xuICAgIF9ldmVudEJ1dHRvbjogbnVtYmVyO1xuICAgIF9tb3ZlZDogYm9vbGVhbjtcbiAgICBfY2xpY2tUb2xlcmFuY2U6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgY2xpY2tUb2xlcmFuY2U6IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSBvcHRpb25zLmNsaWNrVG9sZXJhbmNlIHx8IDE7XG4gICAgfVxuXG4gICAgYmx1cigpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xhc3RQb2ludDtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50QnV0dG9uO1xuICAgIH1cblxuICAgIF9jb3JyZWN0QnV0dG9uKGU6IE1vdXNlRXZlbnQsIGJ1dHRvbjogbnVtYmVyKSB7ICAvL2VzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBpbXBsZW1lbnRlZCBieSBjaGlsZFxuICAgIH1cblxuICAgIF9tb3ZlKGxhc3RQb2ludDogUG9pbnQsIHBvaW50OiBQb2ludCkgeyAgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgIHJldHVybiB7fTsgLy8gaW1wbGVtZW50ZWQgYnkgY2hpbGRcbiAgICB9XG5cbiAgICBtb3VzZWRvd24oZTogTW91c2VFdmVudCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9sYXN0UG9pbnQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBldmVudEJ1dHRvbiA9IERPTS5tb3VzZUJ1dHRvbihlKTtcbiAgICAgICAgaWYgKCF0aGlzLl9jb3JyZWN0QnV0dG9uKGUsIGV2ZW50QnV0dG9uKSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX2xhc3RQb2ludCA9IHBvaW50O1xuICAgICAgICB0aGlzLl9ldmVudEJ1dHRvbiA9IGV2ZW50QnV0dG9uO1xuICAgIH1cblxuICAgIG1vdXNlbW92ZVdpbmRvdyhlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgY29uc3QgbGFzdFBvaW50ID0gdGhpcy5fbGFzdFBvaW50O1xuICAgICAgICBpZiAoIWxhc3RQb2ludCkgcmV0dXJuO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKGJ1dHRvblN0aWxsUHJlc3NlZChlLCB0aGlzLl9ldmVudEJ1dHRvbikpIHtcbiAgICAgICAgICAgIC8vIFNvbWUgYnJvd3NlcnMgZG9uJ3QgZmlyZSBhIGBtb3VzZXVwYCB3aGVuIHRoZSBtb3VzZXVwIG9jY3VycyBvdXRzaWRlXG4gICAgICAgICAgICAvLyB0aGUgd2luZG93IG9yIGlmcmFtZTpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy80NjIyXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSWYgdGhlIGJ1dHRvbiBpcyBubyBsb25nZXIgcHJlc3NlZCBkdXJpbmcgdGhpcyBgbW91c2Vtb3ZlYCBpdCBtYXkgaGF2ZVxuICAgICAgICAgICAgLy8gYmVlbiByZWxlYXNlZCBvdXRzaWRlIG9mIHRoZSB3aW5kb3cgb3IgaWZyYW1lLlxuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9tb3ZlZCAmJiBwb2ludC5kaXN0KGxhc3RQb2ludCkgPCB0aGlzLl9jbGlja1RvbGVyYW5jZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9tb3ZlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2xhc3RQb2ludCA9IHBvaW50O1xuXG4gICAgICAgIC8vIGltcGxlbWVudGVkIGJ5IGNoaWxkIGNsYXNzXG4gICAgICAgIHJldHVybiB0aGlzLl9tb3ZlKGxhc3RQb2ludCwgcG9pbnQpO1xuICAgIH1cblxuICAgIG1vdXNldXBXaW5kb3coZTogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhc3RQb2ludCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBldmVudEJ1dHRvbiA9IERPTS5tb3VzZUJ1dHRvbihlKTtcbiAgICAgICAgaWYgKGV2ZW50QnV0dG9uICE9PSB0aGlzLl9ldmVudEJ1dHRvbikgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5fbW92ZWQpIERPTS5zdXBwcmVzc0NsaWNrKCk7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTW91c2VQYW5IYW5kbGVyIGV4dGVuZHMgTW91c2VIYW5kbGVyIHtcblxuICAgIG1vdXNlZG93bihlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgc3VwZXIubW91c2Vkb3duKGUsIHBvaW50KTtcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RQb2ludCkgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgX2NvcnJlY3RCdXR0b24oZTogTW91c2VFdmVudCwgYnV0dG9uOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGJ1dHRvbiA9PT0gTEVGVF9CVVRUT04gJiYgIWUuY3RybEtleTtcbiAgICB9XG5cbiAgICBfbW92ZShsYXN0UG9pbnQ6IFBvaW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFyb3VuZDogcG9pbnQsXG4gICAgICAgICAgICBwYW5EZWx0YTogcG9pbnQuc3ViKGxhc3RQb2ludClcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb3VzZVJvdGF0ZUhhbmRsZXIgZXh0ZW5kcyBNb3VzZUhhbmRsZXIge1xuICAgIF9jb3JyZWN0QnV0dG9uKGU6IE1vdXNlRXZlbnQsIGJ1dHRvbjogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiAoYnV0dG9uID09PSBMRUZUX0JVVFRPTiAmJiBlLmN0cmxLZXkpIHx8IChidXR0b24gPT09IFJJR0hUX0JVVFRPTik7XG4gICAgfVxuXG4gICAgX21vdmUobGFzdFBvaW50OiBQb2ludCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgICAgIGNvbnN0IGRlZ3JlZXNQZXJQaXhlbE1vdmVkID0gMC44O1xuICAgICAgICBjb25zdCBiZWFyaW5nRGVsdGEgPSAocG9pbnQueCAtIGxhc3RQb2ludC54KSAqIGRlZ3JlZXNQZXJQaXhlbE1vdmVkO1xuICAgICAgICBpZiAoYmVhcmluZ0RlbHRhKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHtiZWFyaW5nRGVsdGF9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29udGV4dG1lbnUoZTogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBwcmV2ZW50IGJyb3dzZXIgY29udGV4dCBtZW51IHdoZW4gbmVjZXNzYXJ5OyB3ZSBkb24ndCBhbGxvdyBpdCB3aXRoIHJvdGF0aW9uXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgY2FuJ3QgZGlzY2VybiByb3RhdGlvbiBnZXN0dXJlIHN0YXJ0IGZyb20gY29udGV4dG1lbnUgb24gTWFjXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb3VzZVBpdGNoSGFuZGxlciBleHRlbmRzIE1vdXNlSGFuZGxlciB7XG4gICAgX2NvcnJlY3RCdXR0b24oZTogTW91c2VFdmVudCwgYnV0dG9uOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIChidXR0b24gPT09IExFRlRfQlVUVE9OICYmIGUuY3RybEtleSkgfHwgKGJ1dHRvbiA9PT0gUklHSFRfQlVUVE9OKTtcbiAgICB9XG5cbiAgICBfbW92ZShsYXN0UG9pbnQ6IFBvaW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgY29uc3QgZGVncmVlc1BlclBpeGVsTW92ZWQgPSAtMC41O1xuICAgICAgICBjb25zdCBwaXRjaERlbHRhID0gKHBvaW50LnkgLSBsYXN0UG9pbnQueSkgKiBkZWdyZWVzUGVyUGl4ZWxNb3ZlZDtcbiAgICAgICAgaWYgKHBpdGNoRGVsdGEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4ge3BpdGNoRGVsdGF9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29udGV4dG1lbnUoZTogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBwcmV2ZW50IGJyb3dzZXIgY29udGV4dCBtZW51IHdoZW4gbmVjZXNzYXJ5OyB3ZSBkb24ndCBhbGxvdyBpdCB3aXRoIHJvdGF0aW9uXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgY2FuJ3QgZGlzY2VybiByb3RhdGlvbiBnZXN0dXJlIHN0YXJ0IGZyb20gY29udGV4dG1lbnUgb24gTWFjXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwLmpzJztcbmltcG9ydCB7aW5kZXhUb3VjaGVzfSBmcm9tICcuL2hhbmRsZXJfdXRpbC5qcyc7XG5pbXBvcnQge2JpbmRBbGx9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG91Y2hQYW5IYW5kbGVyIHtcblxuICAgIF9tYXA6IE1hcDtcbiAgICBfZWw6IEhUTUxFbGVtZW50O1xuICAgIF9lbmFibGVkOiBib29sZWFuO1xuICAgIF9hY3RpdmU6IGJvb2xlYW47XG4gICAgX3RvdWNoZXM6IHsgW3N0cmluZyB8IG51bWJlcl06IFBvaW50IH07XG4gICAgX21pblRvdWNoZXM6IG51bWJlcjtcbiAgICBfY2xpY2tUb2xlcmFuY2U6IG51bWJlcjtcbiAgICBfc3VtOiBQb2ludDtcbiAgICBfYWxlcnRDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9hbGVydFRpbWVyOiBUaW1lb3V0SUQ7XG5cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCwgb3B0aW9uczogeyBjbGlja1RvbGVyYW5jZTogbnVtYmVyIH0pIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fbWluVG91Y2hlcyA9IDE7XG4gICAgICAgIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gb3B0aW9ucy5jbGlja1RvbGVyYW5jZSB8fCAxO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIGJpbmRBbGwoWydfYWRkVG91Y2hQYW5CbG9ja2VyJywgJ19zaG93VG91Y2hQYW5CbG9ja2VyQWxlcnQnXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl90b3VjaGVzID0ge307XG4gICAgICAgIHRoaXMuX3N1bSA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICB9XG5cbiAgICB0b3VjaHN0YXJ0KGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZVRyYW5zZm9ybShlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgIH1cblxuICAgIHRvdWNobW92ZShlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGlmICghdGhpcy5fYWN0aXZlIHx8IG1hcFRvdWNoZXMubGVuZ3RoIDwgdGhpcy5fbWluVG91Y2hlcykgcmV0dXJuO1xuXG4gICAgICAgIC8vIGlmIGNvb3BlcmF0aXZlIGdlc3R1cmUgaGFuZGxpbmcgaXMgc2V0IHRvIHRydWUsIHJlcXVpcmUgdHdvIGZpbmdlcnMgdG8gdG91Y2ggcGFuXG4gICAgICAgIGlmICh0aGlzLl9tYXAuX2Nvb3BlcmF0aXZlR2VzdHVyZXMgJiYgIXRoaXMuX21hcC5pc01vdmluZygpKSB7XG4gICAgICAgICAgICBpZiAobWFwVG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG93VG91Y2hQYW5CbG9ja2VyQWxlcnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2FsZXJ0Q29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgaGlkZSBhbGVydCBpZiBpdCBpcyB2aXNpYmxlIHdoZW4gdHdvIGZpbmdlcnMgYXJlIHVzZWQgdG8gcGFuLlxuICAgICAgICAgICAgICAgIHRoaXMuX2FsZXJ0Q29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fYWxlcnRUaW1lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZVRyYW5zZm9ybShlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgIH1cblxuICAgIHRvdWNoZW5kKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgdGhpcy5fY2FsY3VsYXRlVHJhbnNmb3JtKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSAmJiBtYXBUb3VjaGVzLmxlbmd0aCA8IHRoaXMuX21pblRvdWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvdWNoY2FuY2VsKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgX2NhbGN1bGF0ZVRyYW5zZm9ybShlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGlmIChtYXBUb3VjaGVzLmxlbmd0aCA+IDApIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgdG91Y2hlcyA9IGluZGV4VG91Y2hlcyhtYXBUb3VjaGVzLCBwb2ludHMpO1xuXG4gICAgICAgIGNvbnN0IHRvdWNoUG9pbnRTdW0gPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICAgIGNvbnN0IHRvdWNoRGVsdGFTdW0gPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICAgIGxldCB0b3VjaERlbHRhQ291bnQgPSAwO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBpbiB0b3VjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludCA9IHRvdWNoZXNbaWRlbnRpZmllcl07XG4gICAgICAgICAgICBjb25zdCBwcmV2UG9pbnQgPSB0aGlzLl90b3VjaGVzW2lkZW50aWZpZXJdO1xuICAgICAgICAgICAgaWYgKHByZXZQb2ludCkge1xuICAgICAgICAgICAgICAgIHRvdWNoUG9pbnRTdW0uX2FkZChwb2ludCk7XG4gICAgICAgICAgICAgICAgdG91Y2hEZWx0YVN1bS5fYWRkKHBvaW50LnN1YihwcmV2UG9pbnQpKTtcbiAgICAgICAgICAgICAgICB0b3VjaERlbHRhQ291bnQrKztcbiAgICAgICAgICAgICAgICB0b3VjaGVzW2lkZW50aWZpZXJdID0gcG9pbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90b3VjaGVzID0gdG91Y2hlcztcblxuICAgICAgICBpZiAodG91Y2hEZWx0YUNvdW50IDwgdGhpcy5fbWluVG91Y2hlcyB8fCAhdG91Y2hEZWx0YVN1bS5tYWcoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBhbkRlbHRhID0gdG91Y2hEZWx0YVN1bS5kaXYodG91Y2hEZWx0YUNvdW50KTtcbiAgICAgICAgdGhpcy5fc3VtLl9hZGQocGFuRGVsdGEpO1xuICAgICAgICBpZiAodGhpcy5fc3VtLm1hZygpIDwgdGhpcy5fY2xpY2tUb2xlcmFuY2UpIHJldHVybjtcblxuICAgICAgICBjb25zdCBhcm91bmQgPSB0b3VjaFBvaW50U3VtLmRpdih0b3VjaERlbHRhQ291bnQpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcm91bmQsXG4gICAgICAgICAgICBwYW5EZWx0YVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLl9tYXAuX2Nvb3BlcmF0aXZlR2VzdHVyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRvdWNoUGFuQmxvY2tlcigpO1xuICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdG91Y2gtYWN0aW9uIGNzcyBwcm9wZXJ0eSB0byBlbmFibGUgc2Nyb2xsaW5nIHBhZ2Ugb3ZlciBtYXBcbiAgICAgICAgICAgIHRoaXMuX2VsLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLXRvdWNoLXBhbi1ibG9ja2VyLW92ZXJyaWRlJywgJ21hcGJveGdsLXNjcm9sbGFibGUtcGFnZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fbWFwLl9jb29wZXJhdGl2ZUdlc3R1cmVzKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fYWxlcnRUaW1lcik7XG4gICAgICAgICAgICB0aGlzLl9hbGVydENvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuX2VsLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXRvdWNoLXBhbi1ibG9ja2VyLW92ZXJyaWRlJywgJ21hcGJveGdsLXNjcm9sbGFibGUtcGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH1cblxuICAgIF9hZGRUb3VjaFBhbkJsb2NrZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXAgJiYgIXRoaXMuX2FsZXJ0Q29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGVydENvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC10b3VjaC1wYW4tYmxvY2tlcicsIHRoaXMuX21hcC5fY29udGFpbmVyKTtcblxuICAgICAgICAgICAgdGhpcy5fYWxlcnRDb250YWluZXIudGV4dENvbnRlbnQgPSB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKCdUb3VjaFBhbkJsb2NrZXIuTWVzc2FnZScpO1xuXG4gICAgICAgICAgICAvLyBkeW5hbWljYWxseSBzZXQgdGhlIGZvbnQgc2l6ZSBvZiB0aGUgdG91Y2ggcGFuIGJsb2NrZXIgYWxlcnQgbWVzc2FnZVxuICAgICAgICAgICAgdGhpcy5fYWxlcnRDb250YWluZXIuc3R5bGUuZm9udFNpemUgPSBgJHtNYXRoLm1heCgxMCwgTWF0aC5taW4oMjQsIE1hdGguZmxvb3IodGhpcy5fZWwuY2xpZW50V2lkdGggKiAwLjA1KSkpfXB4YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zaG93VG91Y2hQYW5CbG9ja2VyQWxlcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hbGVydENvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJykgdGhpcy5fYWxlcnRDb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcblxuICAgICAgICB0aGlzLl9hbGVydENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC10b3VjaC1wYW4tYmxvY2tlci1zaG93Jyk7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2FsZXJ0VGltZXIpO1xuXG4gICAgICAgIHRoaXMuX2FsZXJ0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2FsZXJ0Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXRvdWNoLXBhbi1ibG9ja2VyLXNob3cnKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICB9XG5cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20uanMnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcC5qcyc7XG5cbmNsYXNzIFR3b1RvdWNoSGFuZGxlciB7XG5cbiAgICBfZW5hYmxlZDogYm9vbGVhbjtcbiAgICBfYWN0aXZlOiBib29sZWFuO1xuICAgIF9maXJzdFR3b1RvdWNoZXM6IFtudW1iZXIsIG51bWJlcl07XG4gICAgX3ZlY3RvcjogUG9pbnQ7XG4gICAgX3N0YXJ0VmVjdG9yOiBQb2ludDtcbiAgICBfYXJvdW5kQ2VudGVyOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9maXJzdFR3b1RvdWNoZXM7XG4gICAgfVxuXG4gICAgX3N0YXJ0KHBvaW50czogW1BvaW50LCBQb2ludF0pIHt9IC8vZXNsaW50LWRpc2FibGUtbGluZVxuICAgIF9tb3ZlKHBvaW50czogW1BvaW50LCBQb2ludF0sIHBpbmNoQXJvdW5kOiBQb2ludCwgZTogVG91Y2hFdmVudCkgeyByZXR1cm4ge307IH0gLy9lc2xpbnQtZGlzYWJsZS1saW5lXG5cbiAgICB0b3VjaHN0YXJ0KGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhlLnRhcmdldCwgZS50YXJnZXRUb3VjaGVzLmxlbmd0aCA/IGUudGFyZ2V0VG91Y2hlc1swXS50YXJnZXQgOiBudWxsKTtcbiAgICAgICAgLy9sb2coJ3RvdWNoc3RhcnQnLCBwb2ludHMsIGUudGFyZ2V0LmlubmVySFRNTCwgZS50YXJnZXRUb3VjaGVzLmxlbmd0aCA/IGUudGFyZ2V0VG91Y2hlc1swXS50YXJnZXQuaW5uZXJIVE1MOiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAodGhpcy5fZmlyc3RUd29Ub3VjaGVzIHx8IG1hcFRvdWNoZXMubGVuZ3RoIDwgMikgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX2ZpcnN0VHdvVG91Y2hlcyA9IFtcbiAgICAgICAgICAgIG1hcFRvdWNoZXNbMF0uaWRlbnRpZmllcixcbiAgICAgICAgICAgIG1hcFRvdWNoZXNbMV0uaWRlbnRpZmllclxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIGltcGxlbWVudGVkIGJ5IGNoaWxkIGNsYXNzZXNcbiAgICAgICAgdGhpcy5fc3RhcnQoW3BvaW50c1swXSwgcG9pbnRzWzFdXSk7XG4gICAgfVxuXG4gICAgdG91Y2htb3ZlKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9maXJzdFR3b1RvdWNoZXMpIHJldHVybjtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgW2lkQSwgaWRCXSA9IHRoaXMuX2ZpcnN0VHdvVG91Y2hlcztcbiAgICAgICAgY29uc3QgYSA9IGdldFRvdWNoQnlJZChtYXBUb3VjaGVzLCBwb2ludHMsIGlkQSk7XG4gICAgICAgIGNvbnN0IGIgPSBnZXRUb3VjaEJ5SWQobWFwVG91Y2hlcywgcG9pbnRzLCBpZEIpO1xuICAgICAgICBpZiAoIWEgfHwgIWIpIHJldHVybjtcbiAgICAgICAgY29uc3QgcGluY2hBcm91bmQgPSB0aGlzLl9hcm91bmRDZW50ZXIgPyBudWxsIDogYS5hZGQoYikuZGl2KDIpO1xuXG4gICAgICAgIC8vIGltcGxlbWVudGVkIGJ5IGNoaWxkIGNsYXNzZXNcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdmUoW2EsIGJdLCBwaW5jaEFyb3VuZCwgZSk7XG5cbiAgICB9XG5cbiAgICB0b3VjaGVuZChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGlmICghdGhpcy5fZmlyc3RUd29Ub3VjaGVzKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgW2lkQSwgaWRCXSA9IHRoaXMuX2ZpcnN0VHdvVG91Y2hlcztcbiAgICAgICAgY29uc3QgYSA9IGdldFRvdWNoQnlJZChtYXBUb3VjaGVzLCBwb2ludHMsIGlkQSk7XG4gICAgICAgIGNvbnN0IGIgPSBnZXRUb3VjaEJ5SWQobWFwVG91Y2hlcywgcG9pbnRzLCBpZEIpO1xuICAgICAgICBpZiAoYSAmJiBiKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSkgRE9NLnN1cHByZXNzQ2xpY2soKTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgdG91Y2hjYW5jZWwoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBlbmFibGUob3B0aW9uczogP3thcm91bmQ/OiAnY2VudGVyJ30pIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2Fyb3VuZENlbnRlciA9ICEhb3B0aW9ucyAmJiBvcHRpb25zLmFyb3VuZCA9PT0gJ2NlbnRlcic7XG4gICAgfVxuXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFRvdWNoQnlJZChtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4sIHBvaW50czogQXJyYXk8UG9pbnQ+LCBpZGVudGlmaWVyOiBudW1iZXIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG1hcFRvdWNoZXNbaV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgcmV0dXJuIHBvaW50c1tpXTtcbiAgICB9XG59XG5cbi8qIFpPT00gKi9cblxuY29uc3QgWk9PTV9USFJFU0hPTEQgPSAwLjE7XG5cbmZ1bmN0aW9uIGdldFpvb21EZWx0YShkaXN0YW5jZSwgbGFzdERpc3RhbmNlKSB7XG4gICAgcmV0dXJuIE1hdGgubG9nKGRpc3RhbmNlIC8gbGFzdERpc3RhbmNlKSAvIE1hdGguTE4yO1xufVxuXG5leHBvcnQgY2xhc3MgVG91Y2hab29tSGFuZGxlciBleHRlbmRzIFR3b1RvdWNoSGFuZGxlciB7XG5cbiAgICBfZGlzdGFuY2U6IG51bWJlcjtcbiAgICBfc3RhcnREaXN0YW5jZTogbnVtYmVyO1xuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHN1cGVyLnJlc2V0KCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9kaXN0YW5jZTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXJ0RGlzdGFuY2U7XG4gICAgfVxuXG4gICAgX3N0YXJ0KHBvaW50czogW1BvaW50LCBQb2ludF0pIHtcbiAgICAgICAgdGhpcy5fc3RhcnREaXN0YW5jZSA9IHRoaXMuX2Rpc3RhbmNlID0gcG9pbnRzWzBdLmRpc3QocG9pbnRzWzFdKTtcbiAgICB9XG5cbiAgICBfbW92ZShwb2ludHM6IFtQb2ludCwgUG9pbnRdLCBwaW5jaEFyb3VuZDogUG9pbnQpIHtcbiAgICAgICAgY29uc3QgbGFzdERpc3RhbmNlID0gdGhpcy5fZGlzdGFuY2U7XG4gICAgICAgIHRoaXMuX2Rpc3RhbmNlID0gcG9pbnRzWzBdLmRpc3QocG9pbnRzWzFdKTtcbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUgJiYgTWF0aC5hYnMoZ2V0Wm9vbURlbHRhKHRoaXMuX2Rpc3RhbmNlLCB0aGlzLl9zdGFydERpc3RhbmNlKSkgPCBaT09NX1RIUkVTSE9MRCkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgem9vbURlbHRhOiBnZXRab29tRGVsdGEodGhpcy5fZGlzdGFuY2UsIGxhc3REaXN0YW5jZSksXG4gICAgICAgICAgICBwaW5jaEFyb3VuZFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuLyogUk9UQVRFICovXG5cbmNvbnN0IFJPVEFUSU9OX1RIUkVTSE9MRCA9IDI1OyAvLyBwaXhlbHMgYWxvbmcgY2lyY3VtZmVyZW5jZSBvZiB0b3VjaCBjaXJjbGVcblxuZnVuY3Rpb24gZ2V0QmVhcmluZ0RlbHRhKGEsIGIpIHtcbiAgICByZXR1cm4gYS5hbmdsZVdpdGgoYikgKiAxODAgLyBNYXRoLlBJO1xufVxuXG5leHBvcnQgY2xhc3MgVG91Y2hSb3RhdGVIYW5kbGVyIGV4dGVuZHMgVHdvVG91Y2hIYW5kbGVyIHtcbiAgICBfbWluRGlhbWV0ZXI6IG51bWJlcjtcblxuICAgIHJlc2V0KCkge1xuICAgICAgICBzdXBlci5yZXNldCgpO1xuICAgICAgICBkZWxldGUgdGhpcy5fbWluRGlhbWV0ZXI7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdGFydFZlY3RvcjtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3ZlY3RvcjtcbiAgICB9XG5cbiAgICBfc3RhcnQocG9pbnRzOiBbUG9pbnQsIFBvaW50XSkge1xuICAgICAgICB0aGlzLl9zdGFydFZlY3RvciA9IHRoaXMuX3ZlY3RvciA9IHBvaW50c1swXS5zdWIocG9pbnRzWzFdKTtcbiAgICAgICAgdGhpcy5fbWluRGlhbWV0ZXIgPSBwb2ludHNbMF0uZGlzdChwb2ludHNbMV0pO1xuICAgIH1cblxuICAgIF9tb3ZlKHBvaW50czogW1BvaW50LCBQb2ludF0sIHBpbmNoQXJvdW5kOiBQb2ludCkge1xuICAgICAgICBjb25zdCBsYXN0VmVjdG9yID0gdGhpcy5fdmVjdG9yO1xuICAgICAgICB0aGlzLl92ZWN0b3IgPSBwb2ludHNbMF0uc3ViKHBvaW50c1sxXSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUgJiYgdGhpcy5faXNCZWxvd1RocmVzaG9sZCh0aGlzLl92ZWN0b3IpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlYXJpbmdEZWx0YTogZ2V0QmVhcmluZ0RlbHRhKHRoaXMuX3ZlY3RvciwgbGFzdFZlY3RvciksXG4gICAgICAgICAgICBwaW5jaEFyb3VuZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9pc0JlbG93VGhyZXNob2xkKHZlY3RvcjogUG9pbnQpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIHRocmVzaG9sZCBiZWZvcmUgYSByb3RhdGlvbiBhY3R1YWxseSBoYXBwZW5zIGlzIGNvbmZpZ3VyZWQgaW5cbiAgICAgICAgICogcGl4ZWxzIGFsb25ndGggY2lyY3VtZmVyZW5jZSBvZiB0aGUgY2lyY2xlIGZvcm1lZCBieSB0aGUgdHdvIGZpbmdlcnMuXG4gICAgICAgICAqIFRoaXMgbWFrZXMgdGhlIHRocmVzaG9sZCBpbiBkZWdyZWVzIGxhcmdlciB3aGVuIHRoZSBmaW5nZXJzIGFyZSBjbG9zZVxuICAgICAgICAgKiB0b2dldGhlciBhbmQgc21hbGxlciB3aGVuIHRoZSBmaW5nZXJzIGFyZSBmYXIgYXBhcnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFVzZSB0aGUgc21hbGxlc3QgZGlhbWV0ZXIgZnJvbSB0aGUgd2hvbGUgZ2VzdHVyZSB0byByZWR1Y2Ugc2Vuc2l0aXZpdHlcbiAgICAgICAgICogd2hlbiBwaW5jaGluZyBpbiBhbmQgb3V0LlxuICAgICAgICAgKi9cblxuICAgICAgICB0aGlzLl9taW5EaWFtZXRlciA9IE1hdGgubWluKHRoaXMuX21pbkRpYW1ldGVyLCB2ZWN0b3IubWFnKCkpO1xuICAgICAgICBjb25zdCBjaXJjdW1mZXJlbmNlID0gTWF0aC5QSSAqIHRoaXMuX21pbkRpYW1ldGVyO1xuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSBST1RBVElPTl9USFJFU0hPTEQgLyBjaXJjdW1mZXJlbmNlICogMzYwO1xuXG4gICAgICAgIGNvbnN0IGJlYXJpbmdEZWx0YVNpbmNlU3RhcnQgPSBnZXRCZWFyaW5nRGVsdGEodmVjdG9yLCB0aGlzLl9zdGFydFZlY3Rvcik7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyhiZWFyaW5nRGVsdGFTaW5jZVN0YXJ0KSA8IHRocmVzaG9sZDtcbiAgICB9XG59XG5cbi8qIFBJVENIICovXG5cbmZ1bmN0aW9uIGlzVmVydGljYWwodmVjdG9yKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHZlY3Rvci55KSA+IE1hdGguYWJzKHZlY3Rvci54KTtcbn1cblxuY29uc3QgQUxMT1dFRF9TSU5HTEVfVE9VQ0hfVElNRSA9IDEwMDtcblxuLyoqXG4gKiBUaGUgYFRvdWNoUGl0Y2hIYW5kbGVyYCBhbGxvd3MgdGhlIHVzZXIgdG8gcGl0Y2ggdGhlIG1hcCBieSBkcmFnZ2luZyB1cCBhbmQgZG93biB3aXRoIHR3byBmaW5nZXJzLlxuICpcbiAqIEBzZWUgW0V4YW1wbGU6IFNldCBwaXRjaCBhbmQgYmVhcmluZ10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2V0LXBlcnNwZWN0aXZlLylcbiovXG5leHBvcnQgY2xhc3MgVG91Y2hQaXRjaEhhbmRsZXIgZXh0ZW5kcyBUd29Ub3VjaEhhbmRsZXIge1xuXG4gICAgX3ZhbGlkOiBib29sZWFuIHwgdm9pZDtcbiAgICBfZmlyc3RNb3ZlOiBudW1iZXI7XG4gICAgX2xhc3RQb2ludHM6IFtQb2ludCwgUG9pbnRdO1xuICAgIF9tYXA6IE1hcDtcblxuICAgIGNvbnN0cnVjdG9yKG1hcDogTWFwKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgc3VwZXIucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fdmFsaWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9maXJzdE1vdmU7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9sYXN0UG9pbnRzO1xuICAgIH1cblxuICAgIF9zdGFydChwb2ludHM6IFtQb2ludCwgUG9pbnRdKSB7XG4gICAgICAgIHRoaXMuX2xhc3RQb2ludHMgPSBwb2ludHM7XG4gICAgICAgIGlmIChpc1ZlcnRpY2FsKHBvaW50c1swXS5zdWIocG9pbnRzWzFdKSkpIHtcbiAgICAgICAgICAgIC8vIGZpbmdlcnMgYXJlIG1vcmUgaG9yaXpvbnRhbCB0aGFuIHZlcnRpY2FsXG4gICAgICAgICAgICB0aGlzLl92YWxpZCA9IGZhbHNlO1xuXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIF9tb3ZlKHBvaW50czogW1BvaW50LCBQb2ludF0sIGNlbnRlcjogUG9pbnQsIGU6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdmVjdG9yQSA9IHBvaW50c1swXS5zdWIodGhpcy5fbGFzdFBvaW50c1swXSk7XG4gICAgICAgIGNvbnN0IHZlY3RvckIgPSBwb2ludHNbMV0uc3ViKHRoaXMuX2xhc3RQb2ludHNbMV0pO1xuXG4gICAgICAgIGlmICh0aGlzLl9tYXAuX2Nvb3BlcmF0aXZlR2VzdHVyZXMgJiYgZS50b3VjaGVzLmxlbmd0aCA8IDMpIHJldHVybjtcblxuICAgICAgICB0aGlzLl92YWxpZCA9IHRoaXMuZ2VzdHVyZUJlZ2luc1ZlcnRpY2FsbHkodmVjdG9yQSwgdmVjdG9yQiwgZS50aW1lU3RhbXApO1xuXG4gICAgICAgIGlmICghdGhpcy5fdmFsaWQpIHJldHVybjtcblxuICAgICAgICB0aGlzLl9sYXN0UG9pbnRzID0gcG9pbnRzO1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICBjb25zdCB5RGVsdGFBdmVyYWdlID0gKHZlY3RvckEueSArIHZlY3RvckIueSkgLyAyO1xuICAgICAgICBjb25zdCBkZWdyZWVzUGVyUGl4ZWxNb3ZlZCA9IC0wLjU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwaXRjaERlbHRhOiB5RGVsdGFBdmVyYWdlICogZGVncmVlc1BlclBpeGVsTW92ZWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXN0dXJlQmVnaW5zVmVydGljYWxseSh2ZWN0b3JBOiBQb2ludCwgdmVjdG9yQjogUG9pbnQsIHRpbWVTdGFtcDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl92YWxpZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fdmFsaWQ7XG5cbiAgICAgICAgY29uc3QgdGhyZXNob2xkID0gMjtcbiAgICAgICAgY29uc3QgbW92ZWRBID0gdmVjdG9yQS5tYWcoKSA+PSB0aHJlc2hvbGQ7XG4gICAgICAgIGNvbnN0IG1vdmVkQiA9IHZlY3RvckIubWFnKCkgPj0gdGhyZXNob2xkO1xuXG4gICAgICAgIC8vIG5laXRoZXIgZmluZ2VyIGhhcyBtb3ZlZCBhIG1lYW5pbmdmdWwgYW1vdW50LCB3YWl0XG4gICAgICAgIGlmICghbW92ZWRBICYmICFtb3ZlZEIpIHJldHVybjtcblxuICAgICAgICAvLyBPbmUgZmluZ2VyIGhhcyBtb3ZlZCBhbmQgdGhlIG90aGVyIGhhcyBub3QuXG4gICAgICAgIC8vIElmIGVub3VnaCB0aW1lIGhhcyBwYXNzZWQsIGRlY2lkZSBpdCBpcyBub3QgYSBwaXRjaC5cbiAgICAgICAgaWYgKCFtb3ZlZEEgfHwgIW1vdmVkQikge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpcnN0TW92ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyc3RNb3ZlID0gdGltZVN0YW1wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGltZVN0YW1wIC0gdGhpcy5fZmlyc3RNb3ZlIDwgQUxMT1dFRF9TSU5HTEVfVE9VQ0hfVElNRSkge1xuICAgICAgICAgICAgICAgIC8vIHN0aWxsIHdhaXRpbmcgZm9yIGEgbW92ZW1lbnQgZnJvbSB0aGUgc2Vjb25kIGZpbmdlclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzU2FtZURpcmVjdGlvbiA9IHZlY3RvckEueSA+IDAgPT09IHZlY3RvckIueSA+IDA7XG4gICAgICAgIHJldHVybiBpc1ZlcnRpY2FsKHZlY3RvckEpICYmIGlzVmVydGljYWwodmVjdG9yQikgJiYgaXNTYW1lRGlyZWN0aW9uO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAuanMnO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBwYW5TdGVwOiAxMDAsXG4gICAgYmVhcmluZ1N0ZXA6IDE1LFxuICAgIHBpdGNoU3RlcDogMTBcbn07XG5cbi8qKlxuICogVGhlIGBLZXlib2FyZEhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tLCByb3RhdGUsIGFuZCBwYW4gdGhlIG1hcCB1c2luZ1xuICogdGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHM6XG4gKlxuICogLSBgPWAgLyBgK2A6IEluY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDEuXG4gKiAtIGBTaGlmdC09YCAvIGBTaGlmdC0rYDogSW5jcmVhc2UgdGhlIHpvb20gbGV2ZWwgYnkgMi5cbiAqIC0gYC1gOiBEZWNyZWFzZSB0aGUgem9vbSBsZXZlbCBieSAxLlxuICogLSBgU2hpZnQtLWA6IERlY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDIuXG4gKiAtIEFycm93IGtleXM6IFBhbiBieSAxMDAgcGl4ZWxzLlxuICogLSBgU2hpZnQr4oeiYDogSW5jcmVhc2UgdGhlIHJvdGF0aW9uIGJ5IDE1IGRlZ3JlZXMuXG4gKiAtIGBTaGlmdCvih6BgOiBEZWNyZWFzZSB0aGUgcm90YXRpb24gYnkgMTUgZGVncmVlcy5cbiAqIC0gYFNoaWZ0K+KHoWA6IEluY3JlYXNlIHRoZSBwaXRjaCBieSAxMCBkZWdyZWVzLlxuICogLSBgU2hpZnQr4oejYDogRGVjcmVhc2UgdGhlIHBpdGNoIGJ5IDEwIGRlZ3JlZXMuXG4gKlxuICogQHNlZSBbRXhhbXBsZTogVG9nZ2xlIGludGVyYWN0aW9uc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdG9nZ2xlLWludGVyYWN0aW9uLWhhbmRsZXJzLylcbiAqIEBzZWUgW0V4YW1wbGU6IE5hdmlnYXRlIHRoZSBtYXAgd2l0aCBnYW1lLWxpa2UgY29udHJvbHNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dhbWUtY29udHJvbHMvKVxuICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBtYXAgbmF2aWdhdGlvbiBjb250cm9sc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbmF2aWdhdGlvbi8pXG4gKi9cbmNsYXNzIEtleWJvYXJkSGFuZGxlciB7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfcGFuU3RlcDogbnVtYmVyO1xuICAgIF9iZWFyaW5nU3RlcDogbnVtYmVyO1xuICAgIF9waXRjaFN0ZXA6IG51bWJlcjtcbiAgICBfcm90YXRpb25EaXNhYmxlZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBjb25zdCBzdGVwT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgICAgICB0aGlzLl9wYW5TdGVwID0gc3RlcE9wdGlvbnMucGFuU3RlcDtcbiAgICAgICAgdGhpcy5fYmVhcmluZ1N0ZXAgPSBzdGVwT3B0aW9ucy5iZWFyaW5nU3RlcDtcbiAgICAgICAgdGhpcy5fcGl0Y2hTdGVwID0gc3RlcE9wdGlvbnMucGl0Y2hTdGVwO1xuICAgICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYmx1cigpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBrZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKGUuYWx0S2V5IHx8IGUuY3RybEtleSB8fCBlLm1ldGFLZXkpIHJldHVybjtcblxuICAgICAgICBsZXQgem9vbURpciA9IDA7XG4gICAgICAgIGxldCBiZWFyaW5nRGlyID0gMDtcbiAgICAgICAgbGV0IHBpdGNoRGlyID0gMDtcbiAgICAgICAgbGV0IHhEaXIgPSAwO1xuICAgICAgICBsZXQgeURpciA9IDA7XG5cbiAgICAgICAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSA2MTpcbiAgICAgICAgY2FzZSAxMDc6XG4gICAgICAgIGNhc2UgMTcxOlxuICAgICAgICBjYXNlIDE4NzpcbiAgICAgICAgICAgIHpvb21EaXIgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxODk6XG4gICAgICAgIGNhc2UgMTA5OlxuICAgICAgICBjYXNlIDE3MzpcbiAgICAgICAgICAgIHpvb21EaXIgPSAtMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIGJlYXJpbmdEaXIgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHhEaXIgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIGJlYXJpbmdEaXIgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgeERpciA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBwaXRjaERpciA9IDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB5RGlyID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBwaXRjaERpciA9IC0xO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgeURpciA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGJlYXJpbmdEaXIgPSAwO1xuICAgICAgICAgICAgcGl0Y2hEaXIgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNhbWVyYUFuaW1hdGlvbjogKG1hcDogTWFwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgem9vbSA9IG1hcC5nZXRab29tKCk7XG4gICAgICAgICAgICAgICAgbWFwLmVhc2VUbyh7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICAgICAgICAgICAgICAgIGVhc2VJZDogJ2tleWJvYXJkSGFuZGxlcicsXG4gICAgICAgICAgICAgICAgICAgIGVhc2luZzogZWFzZU91dCxcblxuICAgICAgICAgICAgICAgICAgICB6b29tOiB6b29tRGlyID8gTWF0aC5yb3VuZCh6b29tKSArIHpvb21EaXIgKiAoZS5zaGlmdEtleSA/IDIgOiAxKSA6IHpvb20sXG4gICAgICAgICAgICAgICAgICAgIGJlYXJpbmc6IG1hcC5nZXRCZWFyaW5nKCkgKyBiZWFyaW5nRGlyICogdGhpcy5fYmVhcmluZ1N0ZXAsXG4gICAgICAgICAgICAgICAgICAgIHBpdGNoOiBtYXAuZ2V0UGl0Y2goKSArIHBpdGNoRGlyICogdGhpcy5fcGl0Y2hTdGVwLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IFsteERpciAqIHRoaXMuX3BhblN0ZXAsIC15RGlyICogdGhpcy5fcGFuU3RlcF0sXG4gICAgICAgICAgICAgICAgICAgIGNlbnRlcjogbWFwLmdldENlbnRlcigpXG4gICAgICAgICAgICAgICAgfSwge29yaWdpbmFsRXZlbnQ6IGV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImtleWJvYXJkIHJvdGF0ZSBhbmQgem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAua2V5Ym9hcmQuZW5hYmxlKCk7XG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJrZXlib2FyZCByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmtleWJvYXJkLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwia2V5Ym9hcmQgcm90YXRlIGFuZCB6b29tXCJcbiAgICAgKiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJrZXlib2FyZCByb3RhdGUgYW5kIHpvb21cIlxuICAgICAqIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc0tleWJvYXJkRW5hYmxlZCA9IG1hcC5rZXlib2FyZC5pc0VuYWJsZWQoKTtcbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaGFuZGxlciBpcyBlbmFibGVkIGFuZCBoYXMgZGV0ZWN0ZWQgdGhlIHN0YXJ0IG9mIGFcbiAgICAgKiB6b29tL3JvdGF0ZSBnZXN0dXJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaGFuZGxlciBpcyBlbmFibGVkIGFuZCBoYXMgZGV0ZWN0ZWQgdGhlXG4gICAgICogc3RhcnQgb2YgYSB6b29tL3JvdGF0ZSBnZXN0dXJlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNLZXlib2FyZEFjdGl2ZSA9IG1hcC5rZXlib2FyZC5pc0FjdGl2ZSgpO1xuICAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImtleWJvYXJkIHBhbi9yb3RhdGVcIiBpbnRlcmFjdGlvbiwgbGVhdmluZyB0aGVcbiAgICAgKiBcImtleWJvYXJkIHpvb21cIiBpbnRlcmFjdGlvbiBlbmFibGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAua2V5Ym9hcmQuZGlzYWJsZVJvdGF0aW9uKCk7XG4gICAgICovXG4gICAgZGlzYWJsZVJvdGF0aW9uKCkge1xuICAgICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImtleWJvYXJkIHBhbi9yb3RhdGVcIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmtleWJvYXJkLmVuYWJsZSgpO1xuICAgICAqIG1hcC5rZXlib2FyZC5lbmFibGVSb3RhdGlvbigpO1xuICAgICAqL1xuICAgIGVuYWJsZVJvdGF0aW9uKCkge1xuICAgICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBlYXNlT3V0KHQ6IG51bWJlcikge1xuICAgIHJldHVybiB0ICogKDIgLSB0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgS2V5Ym9hcmRIYW5kbGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbS5qcyc7XG5cbmltcG9ydCB7ZWFzZSBhcyBfZWFzZSwgYmluZEFsbCwgYmV6aWVyfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cuanMnO1xuaW1wb3J0IHtudW1iZXIgYXMgaW50ZXJwb2xhdGV9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAuanMnO1xuaW1wb3J0IHR5cGUgSGFuZGxlck1hbmFnZXIgZnJvbSAnLi4vaGFuZGxlcl9tYW5hZ2VyLmpzJztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuXG4vLyBkZWx0YVkgdmFsdWUgZm9yIG1vdXNlIHNjcm9sbCB3aGVlbCBpZGVudGlmaWNhdGlvblxuY29uc3Qgd2hlZWxab29tRGVsdGEgPSA0LjAwMDI0NDE0MDYyNTtcblxuLy8gVGhlc2UgbWFnaWMgbnVtYmVycyBjb250cm9sIHRoZSByYXRlIG9mIHpvb20uIFRyYWNrcGFkIGV2ZW50cyBmaXJlIGF0IGEgZ3JlYXRlclxuLy8gZnJlcXVlbmN5IHRoYW4gbW91c2Ugc2Nyb2xsIHdoZWVsLCBzbyByZWR1Y2UgdGhlIHpvb20gcmF0ZSBwZXIgd2hlZWwgdGlja1xuY29uc3QgZGVmYXVsdFpvb21SYXRlID0gMSAvIDEwMDtcbmNvbnN0IHdoZWVsWm9vbVJhdGUgPSAxIC8gNDUwO1xuXG4vLyB1cHBlciBib3VuZCBvbiBob3cgbXVjaCB3ZSBzY2FsZSB0aGUgbWFwIGluIGFueSBzaW5nbGUgcmVuZGVyIGZyYW1lOyB0aGlzXG4vLyBpcyB1c2VkIHRvIGxpbWl0IHpvb20gcmF0ZSBpbiB0aGUgY2FzZSBvZiB2ZXJ5IGZhc3Qgc2Nyb2xsaW5nXG5jb25zdCBtYXhTY2FsZVBlckZyYW1lID0gMjtcblxuLyoqXG4gKiBUaGUgYFNjcm9sbFpvb21IYW5kbGVyYCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSB0aGUgbWFwIGJ5IHNjcm9sbGluZy5cbiAqXG4gKiBAc2VlIFtFeGFtcGxlOiBUb2dnbGUgaW50ZXJhY3Rpb25zXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90b2dnbGUtaW50ZXJhY3Rpb24taGFuZGxlcnMvKVxuICogQHNlZSBbRXhhbXBsZTogRGlzYWJsZSBzY3JvbGwgem9vbV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZGlzYWJsZS1zY3JvbGwtem9vbS8pXG4gKi9cbmNsYXNzIFNjcm9sbFpvb21IYW5kbGVyIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfZW5hYmxlZDogYm9vbGVhbjtcbiAgICBfYWN0aXZlOiBib29sZWFuO1xuICAgIF96b29taW5nOiBib29sZWFuO1xuICAgIF9hcm91bmRDZW50ZXI6IGJvb2xlYW47XG4gICAgX2Fyb3VuZFBvaW50OiBQb2ludDtcbiAgICBfYXJvdW5kQ29vcmQ6IE1lcmNhdG9yQ29vcmRpbmF0ZTtcbiAgICBfdHlwZTogJ3doZWVsJyB8ICd0cmFja3BhZCcgfCBudWxsO1xuICAgIF9sYXN0VmFsdWU6IG51bWJlcjtcbiAgICBfdGltZW91dDogP1RpbWVvdXRJRDsgLy8gdXNlZCBmb3IgZGVsYXllZC1oYW5kbGluZyBvZiBhIHNpbmdsZSB3aGVlbCBtb3ZlbWVudFxuICAgIF9maW5pc2hUaW1lb3V0OiA/VGltZW91dElEOyAvLyB1c2VkIHRvIGRlbGF5IGZpbmFsICd7bW92ZSx6b29tfWVuZCcgZXZlbnRzXG5cbiAgICBfbGFzdFdoZWVsRXZlbnQ6IGFueTtcbiAgICBfbGFzdFdoZWVsRXZlbnRUaW1lOiBudW1iZXI7XG5cbiAgICBfc3RhcnRab29tOiA/bnVtYmVyO1xuICAgIF90YXJnZXRab29tOiA/bnVtYmVyO1xuICAgIF9kZWx0YTogbnVtYmVyO1xuICAgIF9lYXNpbmc6ID8oKG51bWJlcikgPT4gbnVtYmVyKTtcbiAgICBfcHJldkVhc2U6ID97c3RhcnQ6IG51bWJlciwgZHVyYXRpb246IG51bWJlciwgZWFzaW5nOiAoXzogbnVtYmVyKSA9PiBudW1iZXJ9O1xuXG4gICAgX2ZyYW1lSWQ6ID9ib29sZWFuO1xuICAgIF9oYW5kbGVyOiBIYW5kbGVyTWFuYWdlcjtcblxuICAgIF9kZWZhdWx0Wm9vbVJhdGU6IG51bWJlcjtcbiAgICBfd2hlZWxab29tUmF0ZTogbnVtYmVyO1xuXG4gICAgX2FsZXJ0Q29udGFpbmVyOiBIVE1MRWxlbWVudDsgLy8gdXNlZCB0byBkaXNwbGF5IHRoZSBzY3JvbGwgem9vbSBibG9ja2VyIGFsZXJ0XG4gICAgX2FsZXJ0VGltZXI6IFRpbWVvdXRJRDtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIGhhbmRsZXI6IEhhbmRsZXJNYW5hZ2VyKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyO1xuXG4gICAgICAgIHRoaXMuX2RlbHRhID0gMDtcblxuICAgICAgICB0aGlzLl9kZWZhdWx0Wm9vbVJhdGUgPSBkZWZhdWx0Wm9vbVJhdGU7XG4gICAgICAgIHRoaXMuX3doZWVsWm9vbVJhdGUgPSB3aGVlbFpvb21SYXRlO1xuXG4gICAgICAgIGJpbmRBbGwoWydfb25UaW1lb3V0JywgJ19hZGRTY3JvbGxab29tQmxvY2tlcicsICdfc2hvd0Jsb2NrZXJBbGVydCcsICdfaXNGdWxsc2NyZWVuJ10sIHRoaXMpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgem9vbSByYXRlIG9mIGEgdHJhY2twYWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3pvb21SYXRlPTEvMTAwXSBUaGUgcmF0ZSB1c2VkIHRvIHNjYWxlIHRyYWNrcGFkIG1vdmVtZW50IHRvIGEgem9vbSB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFNwZWVkIHVwIHRyYWNrcGFkIHpvb21cbiAgICAgKiBtYXAuc2Nyb2xsWm9vbS5zZXRab29tUmF0ZSgxIC8gMjUpO1xuICAgICAqL1xuICAgIHNldFpvb21SYXRlKHpvb21SYXRlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFpvb21SYXRlID0gem9vbVJhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBTZXRzIHRoZSB6b29tIHJhdGUgb2YgYSBtb3VzZSB3aGVlbC5cbiAgICAgKlxuICAgICogQHBhcmFtIHtudW1iZXJ9IFt3aGVlbFpvb21SYXRlPTEvNDUwXSBUaGUgcmF0ZSB1c2VkIHRvIHNjYWxlIG1vdXNlIHdoZWVsIG1vdmVtZW50IHRvIGEgem9vbSB2YWx1ZS5cbiAgICAqIEBleGFtcGxlXG4gICAgKiAvLyBTbG93IGRvd24gem9vbSBvZiBtb3VzZSB3aGVlbFxuICAgICogbWFwLnNjcm9sbFpvb20uc2V0V2hlZWxab29tUmF0ZSgxIC8gNjAwKTtcbiAgICAqL1xuICAgIHNldFdoZWVsWm9vbVJhdGUod2hlZWxab29tUmF0ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3doZWVsWm9vbVJhdGUgPSB3aGVlbFpvb21SYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcInNjcm9sbCB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGlzU2Nyb2xsWm9vbUVuYWJsZWQgPSBtYXAuc2Nyb2xsWm9vbS5pc0VuYWJsZWQoKTtcbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgLypcbiAgICAqIEFjdGl2ZSBzdGF0ZSBpcyB0dXJuZWQgb24gYW5kIG9mZiB3aXRoIGV2ZXJ5IHNjcm9sbCB3aGVlbCBldmVudCBhbmQgaXMgc2V0IGJhY2sgdG8gZmFsc2UgYmVmb3JlIHRoZSBtYXBcbiAgICAqIHJlbmRlciBpcyBjYWxsZWQsIHNvIF9hY3RpdmUgaXMgbm90IGEgZ29vZCBjYW5kaWRhdGUgZm9yIGRldGVybWluaW5nIGlmIGEgc2Nyb2xsIHpvb20gYW5pbWF0aW9uIGlzIGluXG4gICAgKiBwcm9ncmVzcy5cbiAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9hY3RpdmUgfHwgdGhpcy5fZmluaXNoVGltZW91dCAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlzWm9vbWluZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fem9vbWluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcInNjcm9sbCB0byB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hcm91bmRdIElmIFwiY2VudGVyXCIgaXMgcGFzc2VkLCBtYXAgd2lsbCB6b29tIGFyb3VuZCBjZW50ZXIgb2YgbWFwLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2Nyb2xsWm9vbS5lbmFibGUoKTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zY3JvbGxab29tLmVuYWJsZSh7YXJvdW5kOiAnY2VudGVyJ30pO1xuICAgICAqL1xuICAgIGVuYWJsZShvcHRpb25zOiA/e2Fyb3VuZD86ICdjZW50ZXInfSkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYXJvdW5kQ2VudGVyID0gISFvcHRpb25zICYmIG9wdGlvbnMuYXJvdW5kID09PSAnY2VudGVyJztcbiAgICAgICAgaWYgKHRoaXMuX21hcC5fY29vcGVyYXRpdmVHZXN0dXJlcykgdGhpcy5fYWRkU2Nyb2xsWm9vbUJsb2NrZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2Nyb2xsWm9vbS5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX21hcC5fY29vcGVyYXRpdmVHZXN0dXJlcykge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2FsZXJ0VGltZXIpO1xuICAgICAgICAgICAgdGhpcy5fYWxlcnRDb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3aGVlbChlOiBXaGVlbEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLl9tYXAuX2Nvb3BlcmF0aXZlR2VzdHVyZXMpIHtcbiAgICAgICAgICAgIGlmICghZS5jdHJsS2V5ICYmICFlLm1ldGFLZXkgJiYgIXRoaXMuaXNab29taW5nKCkgJiYgIXRoaXMuX2lzRnVsbHNjcmVlbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Jsb2NrZXJBbGVydCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYWxlcnRDb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSBoaWRlIGFsZXJ0IGlmIGl0IGlzIHZpc2libGUgd2hlbiBjdHJsIG9yIOKMmCBpcyBwcmVzc2VkIHdoaWxlIHNjcm9sbCB6b29taW5nLlxuICAgICAgICAgICAgICAgIHRoaXMuX2FsZXJ0Q29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fYWxlcnRUaW1lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgYGFueWAgY2FzdCB3aGVuIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy80ODc5IGlzIGZpeGVkLlxuICAgICAgICBsZXQgdmFsdWUgPSBlLmRlbHRhTW9kZSA9PT0gKHdpbmRvdy5XaGVlbEV2ZW50OiBhbnkpLkRPTV9ERUxUQV9MSU5FID8gZS5kZWx0YVkgKiA0MCA6IGUuZGVsdGFZO1xuICAgICAgICBjb25zdCBub3cgPSBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgdGltZURlbHRhID0gbm93IC0gKHRoaXMuX2xhc3RXaGVlbEV2ZW50VGltZSB8fCAwKTtcblxuICAgICAgICB0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWUgPSBub3c7XG5cbiAgICAgICAgaWYgKHZhbHVlICE9PSAwICYmICh2YWx1ZSAlIHdoZWVsWm9vbURlbHRhKSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVGhpcyBvbmUgaXMgZGVmaW5pdGVseSBhIG1vdXNlIHdoZWVsIGV2ZW50LlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9ICd3aGVlbCc7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gMCAmJiBNYXRoLmFicyh2YWx1ZSkgPCA0KSB7XG4gICAgICAgICAgICAvLyBUaGlzIG9uZSBpcyBkZWZpbml0ZWx5IGEgdHJhY2twYWQgZXZlbnQgYmVjYXVzZSBpdCBpcyBzbyBzbWFsbC5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSAndHJhY2twYWQnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodGltZURlbHRhID4gNDAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGxpa2VseSBhIG5ldyBzY3JvbGwgYWN0aW9uLlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9sYXN0VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgLy8gU3RhcnQgYSB0aW1lb3V0IGluIGNhc2UgdGhpcyB3YXMgYSBzaW5ndWxhciBldmVudCwgYW5kIGRlbGF5IGl0IGJ5IHVwIHRvIDQwbXMuXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLl9vblRpbWVvdXQsIDQwLCBlKTtcblxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl90eXBlKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVwZWF0aW5nIGV2ZW50LCBidXQgd2UgZG9uJ3Qga25vdyB0aGUgdHlwZSBvZiBldmVudCBqdXN0IHlldC5cbiAgICAgICAgICAgIC8vIElmIHRoZSBkZWx0YSBwZXIgdGltZSBpcyBzbWFsbCwgd2UgYXNzdW1lIGl0J3MgYSBmYXN0IHRyYWNrcGFkOyBvdGhlcndpc2Ugd2Ugc3dpdGNoIGludG8gd2hlZWwgbW9kZS5cbiAgICAgICAgICAgIHRoaXMuX3R5cGUgPSAoTWF0aC5hYnModGltZURlbHRhICogdmFsdWUpIDwgMjAwKSA/ICd0cmFja3BhZCcgOiAnd2hlZWwnO1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgb3VyIGRlbGF5ZWQgZXZlbnQgaXNuJ3QgZmlyZWQgYWdhaW4sIGJlY2F1c2Ugd2UgYWNjdW11bGF0ZVxuICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzIGV2ZW50ICh3aGljaCB3YXMgbGVzcyB0aGFuIDQwbXMgYWdvKSBpbnRvIHRoaXMgZXZlbnQuXG4gICAgICAgICAgICBpZiAodGhpcy5fdGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSB0aGlzLl9sYXN0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTbG93IGRvd24gem9vbSBpZiBzaGlmdCBrZXkgaXMgaGVsZCBmb3IgbW9yZSBwcmVjaXNlIHpvb21pbmdcbiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgdmFsdWUpIHZhbHVlID0gdmFsdWUgLyA0O1xuXG4gICAgICAgIC8vIE9ubHkgZmlyZSB0aGUgY2FsbGJhY2sgaWYgd2UgYWN0dWFsbHkga25vdyB3aGF0IHR5cGUgb2Ygc2Nyb2xsaW5nIGRldmljZSB0aGUgdXNlciB1c2VzLlxuICAgICAgICBpZiAodGhpcy5fdHlwZSkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFdoZWVsRXZlbnQgPSBlO1xuICAgICAgICAgICAgdGhpcy5fZGVsdGEgLT0gdmFsdWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIF9vblRpbWVvdXQoaW5pdGlhbEV2ZW50OiBXaGVlbEV2ZW50KSB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSAnd2hlZWwnO1xuICAgICAgICB0aGlzLl9kZWx0YSAtPSB0aGlzLl9sYXN0VmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5fYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGFydChpbml0aWFsRXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3N0YXJ0KGU6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kZWx0YSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5pc1pvb21pbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5fem9vbWluZyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fZmluaXNoVGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2ZpbmlzaFRpbWVvdXQpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2ZpbmlzaFRpbWVvdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuICAgICAgICB0aGlzLl9hcm91bmRQb2ludCA9IHRoaXMuX2Fyb3VuZENlbnRlciA/IHRoaXMuX21hcC50cmFuc2Zvcm0uY2VudGVyUG9pbnQgOiBwb3M7XG4gICAgICAgIHRoaXMuX2Fyb3VuZENvb3JkID0gdGhpcy5fbWFwLnRyYW5zZm9ybS5wb2ludENvb3JkaW5hdGUzRCh0aGlzLl9hcm91bmRQb2ludCk7XG4gICAgICAgIHRoaXMuX3RhcmdldFpvb20gPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZXIuX3RyaWdnZXJSZW5kZXJGcmFtZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyRnJhbWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZnJhbWVJZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9mcmFtZUlkID0gbnVsbDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5fbWFwLnRyYW5zZm9ybTtcblxuICAgICAgICBjb25zdCBzdGFydGluZ1pvb20gPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKHRyLl90ZXJyYWluRW5hYmxlZCgpICYmIHRoaXMuX2Fyb3VuZENvb3JkKSA/IHRyLmNvbXB1dGVab29tUmVsYXRpdmVUbyh0aGlzLl9hcm91bmRDb29yZCkgOiB0ci56b29tO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGlmIHdlJ3ZlIGhhZCBzY3JvbGwgZXZlbnRzIHNpbmNlIHRoZSBsYXN0IHJlbmRlciBmcmFtZSwgY29uc3VtZSB0aGVcbiAgICAgICAgLy8gYWNjdW11bGF0ZWQgZGVsdGEsIGFuZCB1cGRhdGUgdGhlIHRhcmdldCB6b29tIGxldmVsIGFjY29yZGluZ2x5XG4gICAgICAgIGlmICh0aGlzLl9kZWx0YSAhPT0gMCkge1xuICAgICAgICAgICAgLy8gRm9yIHRyYWNrcGFkIGV2ZW50cyBhbmQgc2luZ2xlIG1vdXNlIHdoZWVsIHRpY2tzLCB1c2UgdGhlIGRlZmF1bHQgem9vbSByYXRlXG4gICAgICAgICAgICBjb25zdCB6b29tUmF0ZSA9ICh0aGlzLl90eXBlID09PSAnd2hlZWwnICYmIE1hdGguYWJzKHRoaXMuX2RlbHRhKSA+IHdoZWVsWm9vbURlbHRhKSA/IHRoaXMuX3doZWVsWm9vbVJhdGUgOiB0aGlzLl9kZWZhdWx0Wm9vbVJhdGU7XG4gICAgICAgICAgICAvLyBTY2FsZSBieSBzaWdtb2lkIG9mIHNjcm9sbCB3aGVlbCBkZWx0YS5cbiAgICAgICAgICAgIGxldCBzY2FsZSA9IG1heFNjYWxlUGVyRnJhbWUgLyAoMSArIE1hdGguZXhwKC1NYXRoLmFicyh0aGlzLl9kZWx0YSAqIHpvb21SYXRlKSkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVsdGEgPCAwICYmIHNjYWxlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgc2NhbGUgPSAxIC8gc2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Wm9vbSA9IHN0YXJ0aW5nWm9vbSgpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRTY2FsZSA9IE1hdGgucG93KDIuMCwgc3RhcnRab29tKTtcblxuICAgICAgICAgICAgY29uc3QgZnJvbVNjYWxlID0gdHlwZW9mIHRoaXMuX3RhcmdldFpvb20gPT09ICdudW1iZXInID8gdHIuem9vbVNjYWxlKHRoaXMuX3RhcmdldFpvb20pIDogc3RhcnRTY2FsZTtcbiAgICAgICAgICAgIHRoaXMuX3RhcmdldFpvb20gPSBNYXRoLm1pbih0ci5tYXhab29tLCBNYXRoLm1heCh0ci5taW5ab29tLCB0ci5zY2FsZVpvb20oZnJvbVNjYWxlICogc2NhbGUpKSk7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBtb3VzZSB3aGVlbCwgcmVmcmVzaCB0aGUgc3RhcnRpbmcgem9vbSBhbmQgZWFzaW5nXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiB3ZSdyZSB1c2luZyB0byBzbW9vdGggb3V0IHRoZSB6b29taW5nIGJldHdlZW4gd2hlZWxcbiAgICAgICAgICAgIC8vIGV2ZW50c1xuICAgICAgICAgICAgaWYgKHRoaXMuX3R5cGUgPT09ICd3aGVlbCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFpvb20gPSBzdGFydGluZ1pvb20oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lYXNpbmcgPSB0aGlzLl9zbW9vdGhPdXRFYXNpbmcoMjAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZGVsdGEgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldFpvb20gPSB0eXBlb2YgdGhpcy5fdGFyZ2V0Wm9vbSA9PT0gJ251bWJlcicgP1xuICAgICAgICAgICAgdGhpcy5fdGFyZ2V0Wm9vbSA6IHN0YXJ0aW5nWm9vbSgpO1xuICAgICAgICBjb25zdCBzdGFydFpvb20gPSB0aGlzLl9zdGFydFpvb207XG4gICAgICAgIGNvbnN0IGVhc2luZyA9IHRoaXMuX2Vhc2luZztcblxuICAgICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHpvb207XG4gICAgICAgIGlmICh0aGlzLl90eXBlID09PSAnd2hlZWwnICYmIHN0YXJ0Wm9vbSAmJiBlYXNpbmcpIHtcbiAgICAgICAgICAgIGFzc2VydChlYXNpbmcgJiYgdHlwZW9mIHN0YXJ0Wm9vbSA9PT0gJ251bWJlcicpO1xuXG4gICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5taW4oKGJyb3dzZXIubm93KCkgLSB0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWUpIC8gMjAwLCAxKTtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBlYXNpbmcodCk7XG4gICAgICAgICAgICB6b29tID0gaW50ZXJwb2xhdGUoc3RhcnRab29tLCB0YXJnZXRab29tLCBrKTtcbiAgICAgICAgICAgIGlmICh0IDwgMSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHpvb20gPSB0YXJnZXRab29tO1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZmluaXNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3pvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVyLl90cmlnZ2VyUmVuZGVyRnJhbWUoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdGFyZ2V0Wm9vbTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fZmluaXNoVGltZW91dDtcbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9JbmVydGlhOiB0cnVlLFxuICAgICAgICAgICAgbmVlZHNSZW5kZXJGcmFtZTogIWZpbmlzaGVkLFxuICAgICAgICAgICAgem9vbURlbHRhOiB6b29tIC0gc3RhcnRpbmdab29tKCksXG4gICAgICAgICAgICBhcm91bmQ6IHRoaXMuX2Fyb3VuZFBvaW50LFxuICAgICAgICAgICAgYXJvdW5kQ29vcmQ6IHRoaXMuX2Fyb3VuZENvb3JkLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogdGhpcy5fbGFzdFdoZWVsRXZlbnRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfc21vb3RoT3V0RWFzaW5nKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGVhc2luZyA9IF9lYXNlO1xuXG4gICAgICAgIGlmICh0aGlzLl9wcmV2RWFzZSkge1xuICAgICAgICAgICAgY29uc3QgZWFzZSA9IHRoaXMuX3ByZXZFYXNlLFxuICAgICAgICAgICAgICAgIHQgPSAoYnJvd3Nlci5ub3coKSAtIGVhc2Uuc3RhcnQpIC8gZWFzZS5kdXJhdGlvbixcbiAgICAgICAgICAgICAgICBzcGVlZCA9IGVhc2UuZWFzaW5nKHQgKyAwLjAxKSAtIGVhc2UuZWFzaW5nKHQpLFxuXG4gICAgICAgICAgICAgICAgLy8gUXVpY2sgaGFjayB0byBtYWtlIG5ldyBiZXppZXIgdGhhdCBpcyBjb250aW51b3VzIHdpdGggbGFzdFxuICAgICAgICAgICAgICAgIHggPSAwLjI3IC8gTWF0aC5zcXJ0KHNwZWVkICogc3BlZWQgKyAwLjAwMDEpICogMC4wMSxcbiAgICAgICAgICAgICAgICB5ID0gTWF0aC5zcXJ0KDAuMjcgKiAwLjI3IC0geCAqIHgpO1xuXG4gICAgICAgICAgICBlYXNpbmcgPSBiZXppZXIoeCwgeSwgMC4yNSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wcmV2RWFzZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBlYXNpbmdcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZWFzaW5nO1xuICAgIH1cblxuICAgIGJsdXIoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX2FkZFNjcm9sbFpvb21CbG9ja2VyKCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwICYmICF0aGlzLl9hbGVydENvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fYWxlcnRDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtc2Nyb2xsLXpvb20tYmxvY2tlcicsIHRoaXMuX21hcC5fY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKC8oTWFjfGlQYWQpL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbGVydENvbnRhaW5lci50ZXh0Q29udGVudCA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoJ1Njcm9sbFpvb21CbG9ja2VyLkNtZE1lc3NhZ2UnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWxlcnRDb250YWluZXIudGV4dENvbnRlbnQgPSB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKCdTY3JvbGxab29tQmxvY2tlci5DdHJsTWVzc2FnZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkeW5hbWljYWxseSBzZXQgdGhlIGZvbnQgc2l6ZSBvZiB0aGUgc2Nyb2xsIHpvb20gYmxvY2tlciBhbGVydCBtZXNzYWdlXG4gICAgICAgICAgICB0aGlzLl9hbGVydENvbnRhaW5lci5zdHlsZS5mb250U2l6ZSA9IGAke01hdGgubWF4KDEwLCBNYXRoLm1pbigyNCwgTWF0aC5mbG9vcih0aGlzLl9lbC5jbGllbnRXaWR0aCAqIDAuMDUpKSl9cHhgO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2lzRnVsbHNjcmVlbigpIHtcbiAgICAgICAgcmV0dXJuICEhd2luZG93LmRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50O1xuICAgIH1cblxuICAgIF9zaG93QmxvY2tlckFsZXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5fYWxlcnRDb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHRoaXMuX2FsZXJ0Q29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuX2FsZXJ0Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLXNjcm9sbC16b29tLWJsb2NrZXItc2hvdycpO1xuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9hbGVydFRpbWVyKTtcblxuICAgICAgICB0aGlzLl9hbGVydFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9hbGVydENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1zY3JvbGwtem9vbS1ibG9ja2VyLXNob3cnKTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2Nyb2xsWm9vbUhhbmRsZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSBDbGlja1pvb21IYW5kbGVyIGZyb20gJy4uL2NsaWNrX3pvb20uanMnO1xuaW1wb3J0IHR5cGUgVGFwWm9vbUhhbmRsZXIgZnJvbSAnLi8uLi90YXBfem9vbS5qcyc7XG5cbi8qKlxuICogVGhlIGBEb3VibGVDbGlja1pvb21IYW5kbGVyYCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSB0aGUgbWFwIGF0IGEgcG9pbnQgYnlcbiAqIGRvdWJsZSBjbGlja2luZyBvciBkb3VibGUgdGFwcGluZy5cbiAqXG4gKiBAc2VlIFtFeGFtcGxlOiBUb2dnbGUgaW50ZXJhY3Rpb25zXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90b2dnbGUtaW50ZXJhY3Rpb24taGFuZGxlcnMvKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3VibGVDbGlja1pvb21IYW5kbGVyIHtcblxuICAgIF9jbGlja1pvb206IENsaWNrWm9vbUhhbmRsZXI7XG4gICAgX3RhcFpvb206IFRhcFpvb21IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNsaWNrWm9vbTogQ2xpY2tab29tSGFuZGxlciwgVGFwWm9vbTogVGFwWm9vbUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fY2xpY2tab29tID0gY2xpY2tab29tO1xuICAgICAgICB0aGlzLl90YXBab29tID0gVGFwWm9vbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kb3VibGVDbGlja1pvb20uZW5hYmxlKCk7XG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLl9jbGlja1pvb20uZW5hYmxlKCk7XG4gICAgICAgIHRoaXMuX3RhcFpvb20uZW5hYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRvdWJsZUNsaWNrWm9vbS5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fY2xpY2tab29tLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5fdGFwWm9vbS5kaXNhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc0RvdWJsZUNsaWNrWm9vbUVuYWJsZWQgPSBtYXAuZG91YmxlQ2xpY2tab29tLmlzRW5hYmxlZCgpO1xuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWNrWm9vbS5pc0VuYWJsZWQoKSAmJiB0aGlzLl90YXBab29tLmlzRW5hYmxlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZSAoY3VycmVudGx5IGJlaW5nIHVzZWQpLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNEb3VibGVDbGlja1pvb21BY3RpdmUgPSBtYXAuZG91YmxlQ2xpY2tab29tLmlzQWN0aXZlKCk7XG4gICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGlja1pvb20uaXNBY3RpdmUoKSB8fCB0aGlzLl90YXBab29tLmlzQWN0aXZlKCk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpY2tab29tSGFuZGxlciB7XG5cbiAgICBfZW5hYmxlZDogYm9vbGVhbjtcbiAgICBfYWN0aXZlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYmx1cigpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGRibGNsaWNrKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW1lcmFBbmltYXRpb246IChtYXA6IE1hcCkgPT4ge1xuICAgICAgICAgICAgICAgIG1hcC5lYXNlVG8oe1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgICAgICAgICB6b29tOiBtYXAuZ2V0Wm9vbSgpICsgKGUuc2hpZnRLZXkgPyAtMSA6IDEpLFxuICAgICAgICAgICAgICAgICAgICBhcm91bmQ6IG1hcC51bnByb2plY3QocG9pbnQpXG4gICAgICAgICAgICAgICAgfSwge29yaWdpbmFsRXZlbnQ6IGV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtUYXBSZWNvZ25pemVyLCBNQVhfVEFQX0lOVEVSVkFMfSBmcm9tICcuL3RhcF9yZWNvZ25pemVyLmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYXBEcmFnWm9vbUhhbmRsZXIge1xuXG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfc3dpcGVQb2ludDogUG9pbnQ7XG4gICAgX3N3aXBlVG91Y2g6IG51bWJlcjtcbiAgICBfdGFwVGltZTogbnVtYmVyO1xuICAgIF90YXA6IFRhcFJlY29nbml6ZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcblxuICAgICAgICB0aGlzLl90YXAgPSBuZXcgVGFwUmVjb2duaXplcih7XG4gICAgICAgICAgICBudW1Ub3VjaGVzOiAxLFxuICAgICAgICAgICAgbnVtVGFwczogMVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICBkZWxldGUgdGhpcy5fc3dpcGVQb2ludDtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N3aXBlVG91Y2g7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90YXBUaW1lO1xuICAgICAgICB0aGlzLl90YXAucmVzZXQoKTtcbiAgICB9XG5cbiAgICB0b3VjaHN0YXJ0KGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3N3aXBlUG9pbnQpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fdGFwVGltZSAmJiBlLnRpbWVTdGFtcCAtIHRoaXMuX3RhcFRpbWUgPiBNQVhfVEFQX0lOVEVSVkFMKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3RhcFRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhcC50b3VjaHN0YXJ0KGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAobWFwVG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9zd2lwZVBvaW50ID0gcG9pbnRzWzBdO1xuICAgICAgICAgICAgdGhpcy5fc3dpcGVUb3VjaCA9IG1hcFRvdWNoZXNbMF0uaWRlbnRpZmllcjtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgdG91Y2htb3ZlKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLl90YXBUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLl90YXAudG91Y2htb3ZlKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3dpcGVQb2ludCkge1xuICAgICAgICAgICAgaWYgKG1hcFRvdWNoZXNbMF0uaWRlbnRpZmllciAhPT0gdGhpcy5fc3dpcGVUb3VjaCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV3U3dpcGVQb2ludCA9IHBvaW50c1swXTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3QgPSBuZXdTd2lwZVBvaW50LnkgLSB0aGlzLl9zd2lwZVBvaW50Lnk7XG4gICAgICAgICAgICB0aGlzLl9zd2lwZVBvaW50ID0gbmV3U3dpcGVQb2ludDtcblxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB6b29tRGVsdGE6IGRpc3QgLyAxMjhcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b3VjaGVuZChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGlmICghdGhpcy5fdGFwVGltZSkge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSB0aGlzLl90YXAudG91Y2hlbmQoZSwgcG9pbnRzLCBtYXBUb3VjaGVzKTtcbiAgICAgICAgICAgIGlmIChwb2ludCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhcFRpbWUgPSBlLnRpbWVTdGFtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zd2lwZVBvaW50KSB7XG4gICAgICAgICAgICBpZiAobWFwVG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b3VjaGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7TW91c2VQYW5IYW5kbGVyfSBmcm9tICcuLi9tb3VzZS5qcyc7XG5pbXBvcnQgdHlwZSBUb3VjaFBhbkhhbmRsZXIgZnJvbSAnLi8uLi90b3VjaF9wYW4uanMnO1xuXG5leHBvcnQgdHlwZSBEcmFnUGFuT3B0aW9ucyA9IHtcbiAgICBsaW5lYXJpdHk/OiBudW1iZXI7XG4gICAgZWFzaW5nPzogKHQ6IG51bWJlcikgPT4gbnVtYmVyO1xuICAgIGRlY2VsZXJhdGlvbj86IG51bWJlcjtcbiAgICBtYXhTcGVlZD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogVGhlIGBEcmFnUGFuSGFuZGxlcmAgYWxsb3dzIHRoZSB1c2VyIHRvIHBhbiB0aGUgbWFwIGJ5IGNsaWNraW5nIGFuZCBkcmFnZ2luZ1xuICogdGhlIGN1cnNvci5cbiAqXG4gKiBAc2VlIFtFeGFtcGxlOiBUb2dnbGUgaW50ZXJhY3Rpb25zXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90b2dnbGUtaW50ZXJhY3Rpb24taGFuZGxlcnMvKVxuICogQHNlZSBbRXhhbXBsZTogSGlnaGxpZ2h0IGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyYWdQYW5IYW5kbGVyIHtcblxuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX21vdXNlUGFuOiBNb3VzZVBhbkhhbmRsZXI7XG4gICAgX3RvdWNoUGFuOiBUb3VjaFBhbkhhbmRsZXI7XG4gICAgX2luZXJ0aWFPcHRpb25zOiBEcmFnUGFuT3B0aW9uc1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGVsOiBIVE1MRWxlbWVudCwgbW91c2VQYW46IE1vdXNlUGFuSGFuZGxlciwgdG91Y2hQYW46IFRvdWNoUGFuSGFuZGxlcikge1xuICAgICAgICB0aGlzLl9lbCA9IGVsO1xuICAgICAgICB0aGlzLl9tb3VzZVBhbiA9IG1vdXNlUGFuO1xuICAgICAgICB0aGlzLl90b3VjaFBhbiA9IHRvdWNoUGFuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBhbmQgYWNjZXB0cyBvcHRpb25zIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZSBwYW5uaW5nIGluZXJ0aWEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5saW5lYXJpdHk9MF0gRmFjdG9yIHVzZWQgdG8gc2NhbGUgdGhlIGRyYWcgdmVsb2NpdHkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZWFzaW5nXSBPcHRpb25hbCBlYXNpbmcgZnVuY3Rpb24gYXBwbGllZCB0byB7QGxpbmsgTWFwI3BhblRvfSB3aGVuIGFwcGx5aW5nIHRoZSBkcmFnLiBEZWZhdWx0cyB0byBiZXppZXIgZnVuY3Rpb24gdXNpbmcgW0BtYXBib3gvdW5pdGJlemllcl0oaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC91bml0YmV6aWVyKS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4U3BlZWQ9MTQwMF0gVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIGRyYWcgdmVsb2NpdHkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmRlY2VsZXJhdGlvbj0yNTAwXSBUaGUgcmF0ZSBhdCB3aGljaCB0aGUgc3BlZWQgcmVkdWNlcyBhZnRlciB0aGUgcGFuIGVuZHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kcmFnUGFuLmVuYWJsZSgpO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRyYWdQYW4uZW5hYmxlKHtcbiAgICAgKiAgICAgbGluZWFyaXR5OiAwLjMsXG4gICAgICogICAgIGVhc2luZzogdCA9PiB0LFxuICAgICAqICAgICBtYXhTcGVlZDogMTQwMCxcbiAgICAgKiAgICAgZGVjZWxlcmF0aW9uOiAyNTAwXG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogSGlnaGxpZ2h0IGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gICAgICovXG4gICAgZW5hYmxlKG9wdGlvbnM/OiBEcmFnUGFuT3B0aW9ucykge1xuICAgICAgICB0aGlzLl9pbmVydGlhT3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHRoaXMuX21vdXNlUGFuLmVuYWJsZSgpO1xuICAgICAgICB0aGlzLl90b3VjaFBhbi5lbmFibGUoKTtcbiAgICAgICAgdGhpcy5fZWwuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdG91Y2gtZHJhZy1wYW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZHJhZ1Bhbi5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fbW91c2VQYW4uZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLl90b3VjaFBhbi5kaXNhYmxlKCk7XG4gICAgICAgIHRoaXMuX2VsLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXRvdWNoLWRyYWctcGFuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc0RyYWdQYW5FbmFibGVkID0gbWFwLmRyYWdQYW4uaXNFbmFibGVkKCk7XG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW91c2VQYW4uaXNFbmFibGVkKCkgJiYgdGhpcy5fdG91Y2hQYW4uaXNFbmFibGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlIChjdXJyZW50bHkgYmVpbmcgdXNlZCkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc0RyYWdQYW5BY3RpdmUgPSBtYXAuZHJhZ1Bhbi5pc0FjdGl2ZSgpO1xuICAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW91c2VQYW4uaXNBY3RpdmUoKSB8fCB0aGlzLl90b3VjaFBhbi5pc0FjdGl2ZSgpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtNb3VzZVJvdGF0ZUhhbmRsZXIsIE1vdXNlUGl0Y2hIYW5kbGVyfSBmcm9tICcuLi9tb3VzZS5qcyc7XG5cbi8qKlxuICogVGhlIGBEcmFnUm90YXRlSGFuZGxlcmAgYWxsb3dzIHRoZSB1c2VyIHRvIHJvdGF0ZSB0aGUgbWFwIGJ5IGNsaWNraW5nIGFuZFxuICogZHJhZ2dpbmcgdGhlIGN1cnNvciB3aGlsZSBob2xkaW5nIHRoZSByaWdodCBtb3VzZSBidXR0b24gb3IgYGN0cmxgIGtleS5cbiAqXG4gKiBAc2VlIFtFeGFtcGxlOiBUb2dnbGUgaW50ZXJhY3Rpb25zXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90b2dnbGUtaW50ZXJhY3Rpb24taGFuZGxlcnMvKVxuICogQHNlZSBbRXhhbXBsZTogRGlzYWJsZSBtYXAgcm90YXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2Rpc2FibGUtcm90YXRpb24vKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcmFnUm90YXRlSGFuZGxlciB7XG5cbiAgICBfbW91c2VSb3RhdGU6IE1vdXNlUm90YXRlSGFuZGxlcjtcbiAgICBfbW91c2VQaXRjaDogTW91c2VQaXRjaEhhbmRsZXI7XG4gICAgX3BpdGNoV2l0aFJvdGF0ZTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmVhcmluZ1NuYXBdIFRoZSB0aHJlc2hvbGQsIG1lYXN1cmVkIGluIGRlZ3JlZXMsIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHRoZSBtYXAnc1xuICAgICAqICAgYmVhcmluZyB3aWxsIHNuYXAgdG8gbm9ydGguXG4gICAgICogQHBhcmFtIHtib29sfSBbb3B0aW9ucy5waXRjaFdpdGhSb3RhdGU9dHJ1ZV0gQ29udHJvbCB0aGUgbWFwIHBpdGNoIGluIGFkZGl0aW9uIHRvIHRoZSBiZWFyaW5nXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7cGl0Y2hXaXRoUm90YXRlOiBib29sZWFufSwgbW91c2VSb3RhdGU6IE1vdXNlUm90YXRlSGFuZGxlciwgbW91c2VQaXRjaDogTW91c2VQaXRjaEhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fcGl0Y2hXaXRoUm90YXRlID0gb3B0aW9ucy5waXRjaFdpdGhSb3RhdGU7XG4gICAgICAgIHRoaXMuX21vdXNlUm90YXRlID0gbW91c2VSb3RhdGU7XG4gICAgICAgIHRoaXMuX21vdXNlUGl0Y2ggPSBtb3VzZVBpdGNoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRyYWdSb3RhdGUuZW5hYmxlKCk7XG4gICAgICovXG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLl9tb3VzZVJvdGF0ZS5lbmFibGUoKTtcbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSkgdGhpcy5fbW91c2VQaXRjaC5lbmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZHJhZ1JvdGF0ZS5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fbW91c2VSb3RhdGUuZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLl9tb3VzZVBpdGNoLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc0RyYWdSb3RhdGVFbmFibGVkID0gbWFwLmRyYWdSb3RhdGUuaXNFbmFibGVkKCk7XG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW91c2VSb3RhdGUuaXNFbmFibGVkKCkgJiYgKCF0aGlzLl9waXRjaFdpdGhSb3RhdGUgfHwgdGhpcy5fbW91c2VQaXRjaC5pc0VuYWJsZWQoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlIChjdXJyZW50bHkgYmVpbmcgdXNlZCkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc0RyYWdSb3RhdGVBY3RpdmUgPSBtYXAuZHJhZ1JvdGF0ZS5pc0FjdGl2ZSgpO1xuICAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbW91c2VSb3RhdGUuaXNBY3RpdmUoKSB8fCB0aGlzLl9tb3VzZVBpdGNoLmlzQWN0aXZlKCk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge1RvdWNoWm9vbUhhbmRsZXIsIFRvdWNoUm90YXRlSGFuZGxlcn0gZnJvbSAnLi4vdG91Y2hfem9vbV9yb3RhdGUuanMnO1xuaW1wb3J0IHR5cGUgVGFwRHJhZ1pvb21IYW5kbGVyIGZyb20gJy4uL3RhcF9kcmFnX3pvb20uanMnO1xuXG4vKipcbiAqIFRoZSBgVG91Y2hab29tUm90YXRlSGFuZGxlcmAgYWxsb3dzIHRoZSB1c2VyIHRvIHpvb20gYW5kIHJvdGF0ZSB0aGUgbWFwIGJ5XG4gKiBwaW5jaGluZyBvbiBhIHRvdWNoc2NyZWVuLlxuICpcbiAqIFRoZXkgY2FuIHpvb20gd2l0aCBvbmUgZmluZ2VyIGJ5IGRvdWJsZSB0YXBwaW5nIGFuZCBkcmFnZ2luZy4gT24gdGhlIHNlY29uZCB0YXAsXG4gKiBob2xkIHRoZSBmaW5nZXIgZG93biBhbmQgZHJhZyB1cCBvciBkb3duIHRvIHpvb20gaW4gb3Igb3V0LlxuICpcbiAqIEBzZWUgW0V4YW1wbGU6IFRvZ2dsZSBpbnRlcmFjdGlvbnNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RvZ2dsZS1pbnRlcmFjdGlvbi1oYW5kbGVycy8pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXIge1xuXG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfdG91Y2hab29tOiBUb3VjaFpvb21IYW5kbGVyO1xuICAgIF90b3VjaFJvdGF0ZTogVG91Y2hSb3RhdGVIYW5kbGVyO1xuICAgIF90YXBEcmFnWm9vbTogVGFwRHJhZ1pvb21IYW5kbGVyO1xuICAgIF9yb3RhdGlvbkRpc2FibGVkOiBib29sZWFuO1xuICAgIF9lbmFibGVkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGVsOiBIVE1MRWxlbWVudCwgdG91Y2hab29tOiBUb3VjaFpvb21IYW5kbGVyLCB0b3VjaFJvdGF0ZTogVG91Y2hSb3RhdGVIYW5kbGVyLCB0YXBEcmFnWm9vbTogVGFwRHJhZ1pvb21IYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuX2VsID0gZWw7XG4gICAgICAgIHRoaXMuX3RvdWNoWm9vbSA9IHRvdWNoWm9vbTtcbiAgICAgICAgdGhpcy5fdG91Y2hSb3RhdGUgPSB0b3VjaFJvdGF0ZTtcbiAgICAgICAgdGhpcy5fdGFwRHJhZ1pvb20gPSB0YXBEcmFnWm9vbTtcbiAgICAgICAgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcInBpbmNoIHRvIHJvdGF0ZSBhbmQgem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXJvdW5kXSBJZiBcImNlbnRlclwiIGlzIHBhc3NlZCwgbWFwIHdpbGwgem9vbSBhcm91bmQgdGhlIGNlbnRlci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnRvdWNoWm9vbVJvdGF0ZS5lbmFibGUoKTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKHthcm91bmQ6ICdjZW50ZXInfSk7XG4gICAgICovXG4gICAgZW5hYmxlKG9wdGlvbnM6ID97YXJvdW5kPzogJ2NlbnRlcid9KSB7XG4gICAgICAgIHRoaXMuX3RvdWNoWm9vbS5lbmFibGUob3B0aW9ucyk7XG4gICAgICAgIGlmICghdGhpcy5fcm90YXRpb25EaXNhYmxlZCkgdGhpcy5fdG91Y2hSb3RhdGUuZW5hYmxlKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl90YXBEcmFnWm9vbS5lbmFibGUoKTtcbiAgICAgICAgdGhpcy5fZWwuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdG91Y2gtem9vbS1yb3RhdGUnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnRvdWNoWm9vbVJvdGF0ZS5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fdG91Y2hab29tLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5fdG91Y2hSb3RhdGUuZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLl90YXBEcmFnWm9vbS5kaXNhYmxlKCk7XG4gICAgICAgIHRoaXMuX2VsLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXRvdWNoLXpvb20tcm90YXRlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcInBpbmNoIHRvIHJvdGF0ZSBhbmQgem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcInBpbmNoIHRvIHJvdGF0ZSBhbmQgem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc1RvdWNoWm9vbVJvdGF0ZUVuYWJsZWQgPSBtYXAudG91Y2hab29tUm90YXRlLmlzRW5hYmxlZCgpO1xuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdWNoWm9vbS5pc0VuYWJsZWQoKSAmJlxuICAgICAgICAgICAgKHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgfHwgdGhpcy5fdG91Y2hSb3RhdGUuaXNFbmFibGVkKCkpICYmXG4gICAgICAgICAgICB0aGlzLl90YXBEcmFnWm9vbS5pc0VuYWJsZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGhhbmRsZXIgaXMgZW5hYmxlZCBhbmQgaGFzIGRldGVjdGVkIHRoZSBzdGFydCBvZiBhIHpvb20vcm90YXRlIGdlc3R1cmUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGVuYWJsZWQgYW5kIGEgem9vbS9yb3RhdGUgZ2VzdHVyZSB3YXMgZGV0ZWN0ZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc1RvdWNoWm9vbVJvdGF0ZUFjdGl2ZSA9IG1hcC50b3VjaFpvb21Sb3RhdGUuaXNBY3RpdmUoKTtcbiAgICAgKi9cbiAgICBpc0FjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdWNoWm9vbS5pc0FjdGl2ZSgpIHx8IHRoaXMuX3RvdWNoUm90YXRlLmlzQWN0aXZlKCkgfHwgdGhpcy5fdGFwRHJhZ1pvb20uaXNBY3RpdmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiwgbGVhdmluZyB0aGUgXCJwaW5jaCB0byB6b29tXCJcbiAgICAgKiBpbnRlcmFjdGlvbiBlbmFibGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAudG91Y2hab29tUm90YXRlLmRpc2FibGVSb3RhdGlvbigpO1xuICAgICAqL1xuICAgIGRpc2FibGVSb3RhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3RvdWNoUm90YXRlLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcInBpbmNoIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAudG91Y2hab29tUm90YXRlLmVuYWJsZSgpO1xuICAgICAqIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlUm90YXRpb24oKTtcbiAgICAgKi9cbiAgICBlbmFibGVSb3RhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fdG91Y2hab29tLmlzRW5hYmxlZCgpKSB0aGlzLl90b3VjaFJvdGF0ZS5lbmFibGUoKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IERPTSBmcm9tICcuLi91dGlsL2RvbS5qcyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAuanMnO1xuaW1wb3J0IEhhbmRsZXJJbmVydGlhIGZyb20gJy4vaGFuZGxlcl9pbmVydGlhLmpzJztcbmltcG9ydCB7TWFwRXZlbnRIYW5kbGVyLCBCbG9ja2FibGVNYXBFdmVudEhhbmRsZXJ9IGZyb20gJy4vaGFuZGxlci9tYXBfZXZlbnQuanMnO1xuaW1wb3J0IEJveFpvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9ib3hfem9vbS5qcyc7XG5pbXBvcnQgVGFwWm9vbUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3RhcF96b29tLmpzJztcbmltcG9ydCB7TW91c2VQYW5IYW5kbGVyLCBNb3VzZVJvdGF0ZUhhbmRsZXIsIE1vdXNlUGl0Y2hIYW5kbGVyfSBmcm9tICcuL2hhbmRsZXIvbW91c2UuanMnO1xuaW1wb3J0IFRvdWNoUGFuSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvdG91Y2hfcGFuLmpzJztcbmltcG9ydCB7VG91Y2hab29tSGFuZGxlciwgVG91Y2hSb3RhdGVIYW5kbGVyLCBUb3VjaFBpdGNoSGFuZGxlcn0gZnJvbSAnLi9oYW5kbGVyL3RvdWNoX3pvb21fcm90YXRlLmpzJztcbmltcG9ydCBLZXlib2FyZEhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL2tleWJvYXJkLmpzJztcbmltcG9ydCBTY3JvbGxab29tSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvc2Nyb2xsX3pvb20uanMnO1xuaW1wb3J0IERvdWJsZUNsaWNrWm9vbUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3NoaW0vZGJsY2xpY2tfem9vbS5qcyc7XG5pbXBvcnQgQ2xpY2tab29tSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvY2xpY2tfem9vbS5qcyc7XG5pbXBvcnQgVGFwRHJhZ1pvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci90YXBfZHJhZ196b29tLmpzJztcbmltcG9ydCBEcmFnUGFuSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvc2hpbS9kcmFnX3Bhbi5qcyc7XG5pbXBvcnQgRHJhZ1JvdGF0ZUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3NoaW0vZHJhZ19yb3RhdGUuanMnO1xuaW1wb3J0IFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3NoaW0vdG91Y2hfem9vbV9yb3RhdGUuanMnO1xuaW1wb3J0IHtiaW5kQWxsLCBleHRlbmR9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7dmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuXG5leHBvcnQgdHlwZSBJbnB1dEV2ZW50ID0gTW91c2VFdmVudCB8IFRvdWNoRXZlbnQgfCBLZXlib2FyZEV2ZW50IHwgV2hlZWxFdmVudDtcblxuY29uc3QgaXNNb3ZpbmcgPSBwID0+IHAuem9vbSB8fCBwLmRyYWcgfHwgcC5waXRjaCB8fCBwLnJvdGF0ZTtcblxuY2xhc3MgUmVuZGVyRnJhbWVFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICB0eXBlOiAncmVuZGVyRnJhbWUnO1xuICAgIHRpbWVTdGFtcDogbnVtYmVyO1xufVxuXG5jbGFzcyBUcmFja2luZ0VsbGlwc29pZCB7XG4gICAgY29uc3RhbnRzOiBBcnJheTxudW1iZXI+O1xuICAgIHJhZGl1czogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIGEsIGIsIGMgaW4gdGhlIGVxdWF0aW9uIHjCsi9hwrIgKyB5wrIvYsKyICsgesKyL2PCsiA9IDFcbiAgICAgICAgdGhpcy5jb25zdGFudHMgPSBbMSwgMSwgMC4wMV07XG4gICAgICAgIHRoaXMucmFkaXVzID0gMDtcbiAgICB9XG5cbiAgICBzZXR1cChjZW50ZXI6IHZlYzMsIHBvaW50T25TdXJmYWNlOiB2ZWMzKSB7XG4gICAgICAgIGNvbnN0IGNlbnRlclRvU3VyZmFjZSA9IHZlYzMuc3ViKFtdLCBwb2ludE9uU3VyZmFjZSwgY2VudGVyKTtcbiAgICAgICAgaWYgKGNlbnRlclRvU3VyZmFjZVsyXSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMucmFkaXVzID0gdmVjMy5sZW5ndGgodmVjMy5kaXYoW10sIGNlbnRlclRvU3VyZmFjZSwgdGhpcy5jb25zdGFudHMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSBwb2ludCBvbiBzdXJmYWNlIGlzIGFib3ZlIHRoZSBjZW50ZXIuIFRoaXMgY2FuIGhhcHBlbiBmb3IgZXhhbXBsZSB3aGVuIHRoZSBjYW1lcmEgaXNcbiAgICAgICAgICAgIC8vIGJlbG93IHRoZSBjbGlja2VkIHBvaW50IChsaWtlIGEgbW91bnRhaW4pIFVzZSBzbGlnaHRseSBzaG9ydGVyIHJhZGl1cyBmb3IgbGVzcyBhZ2dyZXNzaXZlIG1vdmVtZW50XG4gICAgICAgICAgICB0aGlzLnJhZGl1cyA9IHZlYzMubGVuZ3RoKFtjZW50ZXJUb1N1cmZhY2VbMF0sIGNlbnRlclRvU3VyZmFjZVsxXSwgMF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FzdCBhIHJheSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc29pZCBhbmQgdGhlIGludGVyc2VjdGlvbiBwb2ludC5cbiAgICBwcm9qZWN0UmF5KGRpcjogdmVjMyk6IHZlYzMge1xuICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbnRlcnNlY3Rpb24gdGVzdCBhZ2FpbnN0IGEgdW5pdCBzcGhlcmVcbiAgICAgICAgdmVjMy5kaXYoZGlyLCBkaXIsIHRoaXMuY29uc3RhbnRzKTtcbiAgICAgICAgdmVjMy5ub3JtYWxpemUoZGlyLCBkaXIpO1xuICAgICAgICB2ZWMzLm11bChkaXIsIGRpciwgdGhpcy5jb25zdGFudHMpO1xuXG4gICAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IHZlYzMuc2NhbGUoW10sIGRpciwgdGhpcy5yYWRpdXMpO1xuXG4gICAgICAgIGlmIChpbnRlcnNlY3Rpb25bMl0gPiAwKSB7XG4gICAgICAgICAgICAvLyBUaGUgaW50ZXJzZWN0aW9uIHBvaW50IGlzIGFib3ZlIGhvcml6b24gc28gc3BlY2lhbCBoYW5kbGluZyBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBkaXJlY3Rpb24gb2YgdGhlIG1vdmVtZW50IHdvdWxkIGJlIGludmVydGVkIGR1ZSB0byB0aGUgZWxsaXBzb2lkIHNoYXBlXG4gICAgICAgICAgICBjb25zdCBoID0gdmVjMy5zY2FsZShbXSwgWzAsIDAsIDFdLCB2ZWMzLmRvdChpbnRlcnNlY3Rpb24sIFswLCAwLCAxXSkpO1xuICAgICAgICAgICAgY29uc3QgciA9IHZlYzMuc2NhbGUoW10sIHZlYzMubm9ybWFsaXplKFtdLCBbaW50ZXJzZWN0aW9uWzBdLCBpbnRlcnNlY3Rpb25bMV0sIDBdKSwgdGhpcy5yYWRpdXMpO1xuICAgICAgICAgICAgY29uc3QgcCA9IHZlYzMuYWRkKFtdLCBpbnRlcnNlY3Rpb24sIHZlYzMuc2NhbGUoW10sIHZlYzMuc3ViKFtdLCB2ZWMzLmFkZChbXSwgciwgaCksIGludGVyc2VjdGlvbiksIDIpKTtcblxuICAgICAgICAgICAgaW50ZXJzZWN0aW9uWzBdID0gcFswXTtcbiAgICAgICAgICAgIGludGVyc2VjdGlvblsxXSA9IHBbMV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9uO1xuICAgIH1cbn1cblxuLy8gSGFuZGxlcnMgaW50ZXJwcmV0IGRvbSBldmVudHMgYW5kIHJldHVybiBjYW1lcmEgY2hhbmdlcyB0aGF0IHNob3VsZCBiZVxuLy8gYXBwbGllZCB0byB0aGUgbWFwIChgSGFuZGxlclJlc3VsdGBzKS4gVGhlIGNhbWVyYSBjaGFuZ2VzIGFyZSBhbGwgZGVsdGFzLlxuLy8gVGhlIGhhbmRsZXIgaXRzZWxmIHNob3VsZCBoYXZlIG5vIGtub3dsZWRnZSBvZiB0aGUgbWFwJ3MgY3VycmVudCBzdGF0ZS5cbi8vIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIG1lcmdlIG11bHRpcGxlIHJlc3VsdHMgYW5kIGtlZXBzIGhhbmRsZXJzIHNpbXBsZXIuXG4vLyBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYSBtb3VzZWRvd24gYW5kIG1vdXNlbW92ZSwgdGhlIG1vdXNlUGFuIGhhbmRsZXJcbi8vIHdvdWxkIHJldHVybiBhIGBwYW5EZWx0YWAgb24gdGhlIG1vdXNlbW92ZS5cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlciB7XG4gICAgZW5hYmxlKCk6IHZvaWQ7XG4gICAgZGlzYWJsZSgpOiB2b2lkO1xuICAgIGlzRW5hYmxlZCgpOiBib29sZWFuO1xuICAgIGlzQWN0aXZlKCk6IGJvb2xlYW47XG5cbiAgICAvLyBgcmVzZXRgIGNhbiBiZSBjYWxsZWQgYnkgdGhlIG1hbmFnZXIgYXQgYW55IHRpbWUgYW5kIG11c3QgcmVzZXQgZXZlcnl0aGluZyB0byBpdCdzIG9yaWdpbmFsIHN0YXRlXG4gICAgcmVzZXQoKTogdm9pZDtcblxuICAgIC8vIEhhbmRsZXJzIGNhbiBvcHRpb25hbGx5IGltcGxlbWVudCB0aGVzZSBtZXRob2RzLlxuICAgIC8vIFRoZXkgYXJlIGNhbGxlZCB3aXRoIGRvbSBldmVudHMgd2hlbmV2ZXIgdGhvc2UgZG9tIGV2ZW5zIGFyZSByZWNlaXZlZC5cbiAgICArdG91Y2hzdGFydD86IChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSA9PiBIYW5kbGVyUmVzdWx0IHwgdm9pZDtcbiAgICArdG91Y2htb3ZlPzogKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pID0+IEhhbmRsZXJSZXN1bHQgfCB2b2lkO1xuICAgICt0b3VjaGVuZD86IChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSA9PiBIYW5kbGVyUmVzdWx0IHwgdm9pZDtcbiAgICArdG91Y2hjYW5jZWw/OiAoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikgPT4gSGFuZGxlclJlc3VsdCB8IHZvaWQ7XG4gICAgK21vdXNlZG93bj86IChlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpID0+IEhhbmRsZXJSZXN1bHQgfCB2b2lkO1xuICAgICttb3VzZW1vdmU/OiAoZTogTW91c2VFdmVudCwgcG9pbnQ6IFBvaW50KSA9PiBIYW5kbGVyUmVzdWx0IHwgdm9pZDtcbiAgICArbW91c2V1cD86IChlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpID0+IEhhbmRsZXJSZXN1bHQgfCB2b2lkO1xuICAgICtkYmxjbGljaz86IChlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpID0+IEhhbmRsZXJSZXN1bHQgfCB2b2lkO1xuICAgICt3aGVlbD86IChlOiBXaGVlbEV2ZW50LCBwb2ludDogUG9pbnQpID0+IEhhbmRsZXJSZXN1bHQgfCB2b2lkO1xuICAgICtrZXlkb3duPzogKGU6IEtleWJvYXJkRXZlbnQpID0+IEhhbmRsZXJSZXN1bHQgfCB2b2lkO1xuICAgICtrZXl1cD86IChlOiBLZXlib2FyZEV2ZW50KSA9PiBIYW5kbGVyUmVzdWx0IHwgdm9pZDtcblxuICAgIC8vIGByZW5kZXJGcmFtZWAgaXMgdGhlIG9ubHkgbm9uLWRvbSBldmVudC4gSXQgaXMgY2FsbGVkIGR1cmluZyByZW5kZXJcbiAgICAvLyBmcmFtZXMgYW5kIGNhbiBiZSB1c2VkIHRvIHNtb290aCBjYW1lcmEgY2hhbmdlcyAoc2VlIHNjcm9sbCBoYW5kbGVyKS5cbiAgICArcmVuZGVyRnJhbWU/OiAoKSA9PiBIYW5kbGVyUmVzdWx0IHwgdm9pZDtcbn1cblxuLy8gQWxsIGhhbmRsZXIgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgd2l0aCBldmVudHMgY2FuIG9wdGlvbmFsbHkgcmV0dXJuIGEgYEhhbmRsZXJSZXN1bHRgLlxuZXhwb3J0IHR5cGUgSGFuZGxlclJlc3VsdCA9IHt8XG4gICAgcGFuRGVsdGE/OiBQb2ludCxcbiAgICB6b29tRGVsdGE/OiBudW1iZXIsXG4gICAgYmVhcmluZ0RlbHRhPzogbnVtYmVyLFxuICAgIHBpdGNoRGVsdGE/OiBudW1iZXIsXG4gICAgLy8gdGhlIHBvaW50IHRvIG5vdCBtb3ZlIHdoZW4gY2hhbmdpbmcgdGhlIGNhbWVyYVxuICAgIGFyb3VuZD86IFBvaW50IHwgbnVsbCxcbiAgICAvLyBzYW1lIGFzIGFib3ZlLCBleGNlcHQgZm9yIHBpbmNoIGFjdGlvbnMsIHdoaWNoIGFyZSBnaXZlbiBoaWdoZXIgcHJpb3JpdHlcbiAgICBwaW5jaEFyb3VuZD86IFBvaW50IHwgbnVsbCxcbiAgICAvLyB0aGUgcG9pbnQgdG8gbm90IG1vdmUgd2hlbiBjaGFuZ2luZyB0aGUgY2FtZXJhIGluIG1lcmNhdG9yIGNvb3JkaW5hdGVzXG4gICAgYXJvdW5kQ29vcmQ/OiBNZXJjYXRvckNvb3JkaW5hdGUgfCBudWxsLFxuICAgIC8vIEEgbWV0aG9kIHRoYXQgY2FuIGZpcmUgYSBvbmUtb2ZmIGVhc2luZyBieSBkaXJlY3RseSBjaGFuZ2luZyB0aGUgbWFwJ3MgY2FtZXJhLlxuICAgIGNhbWVyYUFuaW1hdGlvbj86IChtYXA6IE1hcCkgPT4gYW55O1xuXG4gICAgLy8gVGhlIGxhc3QgdGhyZWUgcHJvcGVydGllcyBhcmUgbmVlZGVkIGJ5IG9ubHkgb25lIGhhbmRsZXI6IHNjcm9sbHpvb20uXG4gICAgLy8gVGhlIERPTSBldmVudCB0byBiZSB1c2VkIGFzIHRoZSBgb3JpZ2luYWxFdmVudGAgb24gYW55IGNhbWVyYSBjaGFuZ2UgZXZlbnRzLlxuICAgIG9yaWdpbmFsRXZlbnQ/OiBhbnksXG4gICAgLy8gTWFrZXMgdGhlIG1hbmFnZXIgdHJpZ2dlciBhIGZyYW1lLCBhbGxvd2luZyB0aGUgaGFuZGxlciB0byByZXR1cm4gbXVsdGlwbGUgcmVzdWx0cyBvdmVyIHRpbWUgKHNlZSBzY3JvbGx6b29tKS5cbiAgICBuZWVkc1JlbmRlckZyYW1lPzogYm9vbGVhbixcbiAgICAvLyBUaGUgY2FtZXJhIGNoYW5nZXMgd29uJ3QgZ2V0IHJlY29yZGVkIGZvciBpbmVydGlhbCB6b29taW5nLlxuICAgIG5vSW5lcnRpYT86IGJvb2xlYW5cbnx9O1xuXG5mdW5jdGlvbiBoYXNDaGFuZ2UocmVzdWx0OiBIYW5kbGVyUmVzdWx0KSB7XG4gICAgcmV0dXJuIChyZXN1bHQucGFuRGVsdGEgJiYgcmVzdWx0LnBhbkRlbHRhLm1hZygpKSB8fCByZXN1bHQuem9vbURlbHRhIHx8IHJlc3VsdC5iZWFyaW5nRGVsdGEgfHwgcmVzdWx0LnBpdGNoRGVsdGE7XG59XG5cbmNsYXNzIEhhbmRsZXJNYW5hZ2VyIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfaGFuZGxlcnM6IEFycmF5PHsgaGFuZGxlck5hbWU6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlciwgYWxsb3dlZDogYW55IH0+O1xuICAgIF9ldmVudHNJblByb2dyZXNzOiBPYmplY3Q7XG4gICAgX2ZyYW1lSWQ6IG51bWJlcjtcbiAgICBfaW5lcnRpYTogSGFuZGxlckluZXJ0aWE7XG4gICAgX2JlYXJpbmdTbmFwOiBudW1iZXI7XG4gICAgX2hhbmRsZXJzQnlJZDogeyBbc3RyaW5nXTogSGFuZGxlciB9O1xuICAgIF91cGRhdGluZ0NhbWVyYTogYm9vbGVhbjtcbiAgICBfY2hhbmdlczogQXJyYXk8W0hhbmRsZXJSZXN1bHQsIE9iamVjdCwgYW55XT47XG4gICAgX3ByZXZpb3VzQWN0aXZlSGFuZGxlcnM6IHsgW3N0cmluZ106IEhhbmRsZXIgfTtcbiAgICBfbGlzdGVuZXJzOiBBcnJheTxbSFRNTEVsZW1lbnQsIHN0cmluZywgdm9pZCB8IEV2ZW50TGlzdGVuZXJPcHRpb25zT3JVc2VDYXB0dXJlXT47XG4gICAgX3RyYWNraW5nRWxsaXBzb2lkOiBUcmFja2luZ0VsbGlwc29pZDtcbiAgICBfZHJhZ09yaWdpbjogP3ZlYzM7XG5cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCwgb3B0aW9uczogeyBpbnRlcmFjdGl2ZTogYm9vbGVhbiwgcGl0Y2hXaXRoUm90YXRlOiBib29sZWFuLCBjbGlja1RvbGVyYW5jZTogbnVtYmVyLCBiZWFyaW5nU25hcDogbnVtYmVyfSkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2VsID0gdGhpcy5fbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9oYW5kbGVycyA9IFtdO1xuICAgICAgICB0aGlzLl9oYW5kbGVyc0J5SWQgPSB7fTtcbiAgICAgICAgdGhpcy5fY2hhbmdlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuX2luZXJ0aWEgPSBuZXcgSGFuZGxlckluZXJ0aWEobWFwKTtcbiAgICAgICAgdGhpcy5fYmVhcmluZ1NuYXAgPSBvcHRpb25zLmJlYXJpbmdTbmFwO1xuICAgICAgICB0aGlzLl9wcmV2aW91c0FjdGl2ZUhhbmRsZXJzID0ge307XG4gICAgICAgIHRoaXMuX3RyYWNraW5nRWxsaXBzb2lkID0gbmV3IFRyYWNraW5nRWxsaXBzb2lkKCk7XG4gICAgICAgIHRoaXMuX2RyYWdPcmlnaW4gPSBudWxsO1xuXG4gICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgbWFwIGlzIGN1cnJlbnRseSBtb3ZpbmcsIHRvIGNvbXB1dGUgc3RhcnQvbW92ZS9lbmQgZXZlbnRzXG4gICAgICAgIHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3MgPSB7fTtcblxuICAgICAgICB0aGlzLl9hZGREZWZhdWx0SGFuZGxlcnMob3B0aW9ucyk7XG5cbiAgICAgICAgYmluZEFsbChbJ2hhbmRsZUV2ZW50JywgJ2hhbmRsZVdpbmRvd0V2ZW50J10sIHRoaXMpO1xuXG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy5fZWw7XG5cbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW1xuICAgICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBgcGFzc2l2ZTogdHJ1ZWAgc28gdGhhdCBhIGRvdWJsZSB0YXAgZmlyZXMgdHdvXG4gICAgICAgICAgICAvLyBwYWlycyBvZiB0b3VjaHN0YXJ0L2VuZCBldmVudHMgaW4gaU9TIFNhZmFyaSAxMy4gSWYgdGhpcyBpcyBzZXQgdG9cbiAgICAgICAgICAgIC8vIGBwYXNzaXZlOiBmYWxzZWAgdGhlbiB0aGUgc2Vjb25kIHBhaXIgb2YgZXZlbnRzIGlzIG9ubHkgZmlyZWQgaWZcbiAgICAgICAgICAgIC8vIHByZXZlbnREZWZhdWx0KCkgaXMgY2FsbGVkIG9uIHRoZSBmaXJzdCB0b3VjaHN0YXJ0LiBDYWxsaW5nIHByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIC8vIHVuZGVzaXJhYmx5IHByZXZlbnRzIGNsaWNrIGV2ZW50cy5cbiAgICAgICAgICAgIFtlbCwgJ3RvdWNoc3RhcnQnLCB7cGFzc2l2ZTogdHJ1ZX1dLFxuICAgICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBgcGFzc2l2ZTogZmFsc2VgIHNvIHRoYXQgc2Nyb2xscyBhbmQgcGluY2hlcyBjYW4gYmVcbiAgICAgICAgICAgIC8vIHByZXZlbnRlZCBpbiBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgYHRvdWNoLWFjdGlvbnM6IG5vbmVgLCBmb3IgZXhhbXBsZSBpT1MgU2FmYXJpIDEyLlxuICAgICAgICAgICAgW2VsLCAndG91Y2htb3ZlJywge3Bhc3NpdmU6IGZhbHNlfV0sXG4gICAgICAgICAgICBbZWwsICd0b3VjaGVuZCcsIHVuZGVmaW5lZF0sXG4gICAgICAgICAgICBbZWwsICd0b3VjaGNhbmNlbCcsIHVuZGVmaW5lZF0sXG5cbiAgICAgICAgICAgIFtlbCwgJ21vdXNlZG93bicsIHVuZGVmaW5lZF0sXG4gICAgICAgICAgICBbZWwsICdtb3VzZW1vdmUnLCB1bmRlZmluZWRdLFxuICAgICAgICAgICAgW2VsLCAnbW91c2V1cCcsIHVuZGVmaW5lZF0sXG5cbiAgICAgICAgICAgIC8vIEJpbmQgd2luZG93LWxldmVsIGV2ZW50IGxpc3RlbmVycyBmb3IgbW92ZSBhbmQgdXAvZW5kIGV2ZW50cy4gSW4gdGhlIGFic2VuY2Ugb2ZcbiAgICAgICAgICAgIC8vIHRoZSBwb2ludGVyIGNhcHR1cmUgQVBJLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBuZWNlc3NhcnkgcGxhdGZvcm1zLFxuICAgICAgICAgICAgLy8gd2luZG93LWxldmVsIGV2ZW50IGxpc3RlbmVycyBnaXZlIHVzIHRoZSBiZXN0IHNob3QgYXQgY2FwdHVyaW5nIGV2ZW50cyB0aGF0XG4gICAgICAgICAgICAvLyBmYWxsIG91dHNpZGUgdGhlIG1hcCBjYW52YXMgZWxlbWVudC4gVXNlIGB7Y2FwdHVyZTogdHJ1ZX1gIGZvciB0aGUgbW92ZSBldmVudFxuICAgICAgICAgICAgLy8gdG8gcHJldmVudCBtYXAgbW92ZSBldmVudHMgZnJvbSBiZWluZyBmaXJlZCBkdXJpbmcgYSBkcmFnLlxuICAgICAgICAgICAgW3dpbmRvdy5kb2N1bWVudCwgJ21vdXNlbW92ZScsIHtjYXB0dXJlOiB0cnVlfV0sXG4gICAgICAgICAgICBbd2luZG93LmRvY3VtZW50LCAnbW91c2V1cCcsIHVuZGVmaW5lZF0sXG5cbiAgICAgICAgICAgIFtlbCwgJ21vdXNlb3ZlcicsIHVuZGVmaW5lZF0sXG4gICAgICAgICAgICBbZWwsICdtb3VzZW91dCcsIHVuZGVmaW5lZF0sXG4gICAgICAgICAgICBbZWwsICdkYmxjbGljaycsIHVuZGVmaW5lZF0sXG4gICAgICAgICAgICBbZWwsICdjbGljaycsIHVuZGVmaW5lZF0sXG5cbiAgICAgICAgICAgIFtlbCwgJ2tleWRvd24nLCB7Y2FwdHVyZTogZmFsc2V9XSxcbiAgICAgICAgICAgIFtlbCwgJ2tleXVwJywgdW5kZWZpbmVkXSxcblxuICAgICAgICAgICAgW2VsLCAnd2hlZWwnLCB7cGFzc2l2ZTogZmFsc2V9XSxcbiAgICAgICAgICAgIFtlbCwgJ2NvbnRleHRtZW51JywgdW5kZWZpbmVkXSxcblxuICAgICAgICAgICAgW3dpbmRvdywgJ2JsdXInLCB1bmRlZmluZWRdXG4gICAgICAgIF07XG5cbiAgICAgICAgZm9yIChjb25zdCBbdGFyZ2V0LCB0eXBlLCBsaXN0ZW5lck9wdGlvbnNdIG9mIHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB0YXJnZXQgPT09IHdpbmRvdy5kb2N1bWVudCA/IHRoaXMuaGFuZGxlV2luZG93RXZlbnQgOiB0aGlzLmhhbmRsZUV2ZW50O1xuICAgICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoKHR5cGU6IGFueSksIChsaXN0ZW5lcjogYW55KSwgbGlzdGVuZXJPcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3RhcmdldCwgdHlwZSwgbGlzdGVuZXJPcHRpb25zXSBvZiB0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGFyZ2V0ID09PSB3aW5kb3cuZG9jdW1lbnQgPyB0aGlzLmhhbmRsZVdpbmRvd0V2ZW50IDogdGhpcy5oYW5kbGVFdmVudDtcbiAgICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCh0eXBlOiBhbnkpLCAobGlzdGVuZXI6IGFueSksIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYWRkRGVmYXVsdEhhbmRsZXJzKG9wdGlvbnM6IHsgaW50ZXJhY3RpdmU6IGJvb2xlYW4sIHBpdGNoV2l0aFJvdGF0ZTogYm9vbGVhbiwgY2xpY2tUb2xlcmFuY2U6IG51bWJlciB9KSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgY29uc3QgZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX2FkZCgnbWFwRXZlbnQnLCBuZXcgTWFwRXZlbnRIYW5kbGVyKG1hcCwgb3B0aW9ucykpO1xuXG4gICAgICAgIGNvbnN0IGJveFpvb20gPSBtYXAuYm94Wm9vbSA9IG5ldyBCb3hab29tSGFuZGxlcihtYXAsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9hZGQoJ2JveFpvb20nLCBib3hab29tKTtcblxuICAgICAgICBjb25zdCB0YXBab29tID0gbmV3IFRhcFpvb21IYW5kbGVyKCk7XG4gICAgICAgIGNvbnN0IGNsaWNrWm9vbSA9IG5ldyBDbGlja1pvb21IYW5kbGVyKCk7XG4gICAgICAgIG1hcC5kb3VibGVDbGlja1pvb20gPSBuZXcgRG91YmxlQ2xpY2tab29tSGFuZGxlcihjbGlja1pvb20sIHRhcFpvb20pO1xuICAgICAgICB0aGlzLl9hZGQoJ3RhcFpvb20nLCB0YXBab29tKTtcbiAgICAgICAgdGhpcy5fYWRkKCdjbGlja1pvb20nLCBjbGlja1pvb20pO1xuXG4gICAgICAgIGNvbnN0IHRhcERyYWdab29tID0gbmV3IFRhcERyYWdab29tSGFuZGxlcigpO1xuICAgICAgICB0aGlzLl9hZGQoJ3RhcERyYWdab29tJywgdGFwRHJhZ1pvb20pO1xuXG4gICAgICAgIGNvbnN0IHRvdWNoUGl0Y2ggPSBtYXAudG91Y2hQaXRjaCA9IG5ldyBUb3VjaFBpdGNoSGFuZGxlcihtYXApO1xuICAgICAgICB0aGlzLl9hZGQoJ3RvdWNoUGl0Y2gnLCB0b3VjaFBpdGNoKTtcblxuICAgICAgICBjb25zdCBtb3VzZVJvdGF0ZSA9IG5ldyBNb3VzZVJvdGF0ZUhhbmRsZXIob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IG1vdXNlUGl0Y2ggPSBuZXcgTW91c2VQaXRjaEhhbmRsZXIob3B0aW9ucyk7XG4gICAgICAgIG1hcC5kcmFnUm90YXRlID0gbmV3IERyYWdSb3RhdGVIYW5kbGVyKG9wdGlvbnMsIG1vdXNlUm90YXRlLCBtb3VzZVBpdGNoKTtcbiAgICAgICAgdGhpcy5fYWRkKCdtb3VzZVJvdGF0ZScsIG1vdXNlUm90YXRlLCBbJ21vdXNlUGl0Y2gnXSk7XG4gICAgICAgIHRoaXMuX2FkZCgnbW91c2VQaXRjaCcsIG1vdXNlUGl0Y2gsIFsnbW91c2VSb3RhdGUnXSk7XG5cbiAgICAgICAgY29uc3QgbW91c2VQYW4gPSBuZXcgTW91c2VQYW5IYW5kbGVyKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB0b3VjaFBhbiA9IG5ldyBUb3VjaFBhbkhhbmRsZXIobWFwLCBvcHRpb25zKTtcbiAgICAgICAgbWFwLmRyYWdQYW4gPSBuZXcgRHJhZ1BhbkhhbmRsZXIoZWwsIG1vdXNlUGFuLCB0b3VjaFBhbik7XG4gICAgICAgIHRoaXMuX2FkZCgnbW91c2VQYW4nLCBtb3VzZVBhbik7XG4gICAgICAgIHRoaXMuX2FkZCgndG91Y2hQYW4nLCB0b3VjaFBhbiwgWyd0b3VjaFpvb20nLCAndG91Y2hSb3RhdGUnXSk7XG5cbiAgICAgICAgY29uc3QgdG91Y2hSb3RhdGUgPSBuZXcgVG91Y2hSb3RhdGVIYW5kbGVyKCk7XG4gICAgICAgIGNvbnN0IHRvdWNoWm9vbSA9IG5ldyBUb3VjaFpvb21IYW5kbGVyKCk7XG4gICAgICAgIG1hcC50b3VjaFpvb21Sb3RhdGUgPSBuZXcgVG91Y2hab29tUm90YXRlSGFuZGxlcihlbCwgdG91Y2hab29tLCB0b3VjaFJvdGF0ZSwgdGFwRHJhZ1pvb20pO1xuICAgICAgICB0aGlzLl9hZGQoJ3RvdWNoUm90YXRlJywgdG91Y2hSb3RhdGUsIFsndG91Y2hQYW4nLCAndG91Y2hab29tJ10pO1xuICAgICAgICB0aGlzLl9hZGQoJ3RvdWNoWm9vbScsIHRvdWNoWm9vbSwgWyd0b3VjaFBhbicsICd0b3VjaFJvdGF0ZSddKTtcblxuICAgICAgICB0aGlzLl9hZGQoJ2Jsb2NrYWJsZU1hcEV2ZW50JywgbmV3IEJsb2NrYWJsZU1hcEV2ZW50SGFuZGxlcihtYXApKTtcblxuICAgICAgICBjb25zdCBzY3JvbGxab29tID0gbWFwLnNjcm9sbFpvb20gPSBuZXcgU2Nyb2xsWm9vbUhhbmRsZXIobWFwLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fYWRkKCdzY3JvbGxab29tJywgc2Nyb2xsWm9vbSwgWydtb3VzZVBhbiddKTtcblxuICAgICAgICBjb25zdCBrZXlib2FyZCA9IG1hcC5rZXlib2FyZCA9IG5ldyBLZXlib2FyZEhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy5fYWRkKCdrZXlib2FyZCcsIGtleWJvYXJkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgWydib3hab29tJywgJ2RvdWJsZUNsaWNrWm9vbScsICd0YXBEcmFnWm9vbScsICd0b3VjaFBpdGNoJywgJ2RyYWdSb3RhdGUnLCAnZHJhZ1BhbicsICd0b3VjaFpvb21Sb3RhdGUnLCAnc2Nyb2xsWm9vbScsICdrZXlib2FyZCddKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbnRlcmFjdGl2ZSAmJiAob3B0aW9uczogYW55KVtuYW1lXSkge1xuICAgICAgICAgICAgICAgIChtYXA6IGFueSlbbmFtZV0uZW5hYmxlKChvcHRpb25zOiBhbnkpW25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9hZGQoaGFuZGxlck5hbWU6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlciwgYWxsb3dlZD86IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5faGFuZGxlcnMucHVzaCh7aGFuZGxlck5hbWUsIGhhbmRsZXIsIGFsbG93ZWR9KTtcbiAgICAgICAgdGhpcy5faGFuZGxlcnNCeUlkW2hhbmRsZXJOYW1lXSA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc3RvcChhbGxvd0VuZEFuaW1hdGlvbjogYm9vbGVhbikge1xuICAgICAgICAvLyBkbyBub3RoaW5nIGlmIHRoaXMgbWV0aG9kIHdhcyB0cmlnZ2VyZWQgYnkgYSBnZXN0dXJlIHVwZGF0ZVxuICAgICAgICBpZiAodGhpcy5fdXBkYXRpbmdDYW1lcmEpIHJldHVybjtcblxuICAgICAgICBmb3IgKGNvbnN0IHtoYW5kbGVyfSBvZiB0aGlzLl9oYW5kbGVycykge1xuICAgICAgICAgICAgaGFuZGxlci5yZXNldCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2luZXJ0aWEuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50cyh7fSwge30sIGFsbG93RW5kQW5pbWF0aW9uKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlcyA9IFtdO1xuICAgIH1cblxuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHtoYW5kbGVyfSBvZiB0aGlzLl9oYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKGhhbmRsZXIuaXNBY3RpdmUoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzWm9vbWluZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcy56b29tIHx8IHRoaXMuX21hcC5zY3JvbGxab29tLmlzWm9vbWluZygpO1xuICAgIH1cblxuICAgIGlzUm90YXRpbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2V2ZW50c0luUHJvZ3Jlc3Mucm90YXRlO1xuICAgIH1cblxuICAgIGlzTW92aW5nKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihpc01vdmluZyh0aGlzLl9ldmVudHNJblByb2dyZXNzKSkgfHwgdGhpcy5pc1pvb21pbmcoKTtcbiAgICB9XG5cbiAgICBfYmxvY2tlZEJ5QWN0aXZlKGFjdGl2ZUhhbmRsZXJzOiB7IFtzdHJpbmddOiBIYW5kbGVyIH0sIGFsbG93ZWQ6IEFycmF5PHN0cmluZz4sIG15TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBhY3RpdmVIYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKG5hbWUgPT09IG15TmFtZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWFsbG93ZWQgfHwgYWxsb3dlZC5pbmRleE9mKG5hbWUpIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBoYW5kbGVXaW5kb3dFdmVudChlOiBJbnB1dEV2ZW50KSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRXZlbnQoZSwgYCR7ZS50eXBlfVdpbmRvd2ApO1xuICAgIH1cblxuICAgIF9nZXRNYXBUb3VjaGVzKHRvdWNoZXM6IFRvdWNoTGlzdCkge1xuICAgICAgICBjb25zdCBtYXBUb3VjaGVzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0b3VjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSAoKHQudGFyZ2V0OiBhbnkpOiBOb2RlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9lbC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgbWFwVG91Y2hlcy5wdXNoKHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKG1hcFRvdWNoZXM6IGFueSk6IFRvdWNoTGlzdCk7XG4gICAgfVxuXG4gICAgaGFuZGxlRXZlbnQoZTogSW5wdXRFdmVudCB8IFJlbmRlckZyYW1lRXZlbnQsIGV2ZW50TmFtZT86IHN0cmluZykge1xuXG4gICAgICAgIHRoaXMuX3VwZGF0aW5nQ2FtZXJhID0gdHJ1ZTtcbiAgICAgICAgYXNzZXJ0KGUudGltZVN0YW1wICE9PSB1bmRlZmluZWQpO1xuXG4gICAgICAgIGNvbnN0IGlzUmVuZGVyRnJhbWUgPSBlLnR5cGUgPT09ICdyZW5kZXJGcmFtZSc7XG4gICAgICAgIGNvbnN0IGlucHV0RXZlbnQgPSBpc1JlbmRlckZyYW1lID8gdW5kZWZpbmVkIDogKChlOiBhbnkpOiBJbnB1dEV2ZW50KTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBXZSBkb24ndCBjYWxsIGUucHJldmVudERlZmF1bHQoKSBmb3IgYW55IGV2ZW50cyBieSBkZWZhdWx0LlxuICAgICAgICAgKiBIYW5kbGVycyBhcmUgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgaXQgd2hlcmUgbmVjZXNzYXJ5LlxuICAgICAgICAgKi9cblxuICAgICAgICBjb25zdCBtZXJnZWRIYW5kbGVyUmVzdWx0OiBIYW5kbGVyUmVzdWx0ID0ge25lZWRzUmVuZGVyRnJhbWU6IGZhbHNlfTtcbiAgICAgICAgY29uc3QgZXZlbnRzSW5Qcm9ncmVzcyA9IHt9O1xuICAgICAgICBjb25zdCBhY3RpdmVIYW5kbGVycyA9IHt9O1xuXG4gICAgICAgIGNvbnN0IG1hcFRvdWNoZXMgPSBlLnRvdWNoZXMgPyB0aGlzLl9nZXRNYXBUb3VjaGVzKCgoZTogYW55KTogVG91Y2hFdmVudCkudG91Y2hlcykgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IG1hcFRvdWNoZXMgPyBET00udG91Y2hQb3ModGhpcy5fZWwsIG1hcFRvdWNoZXMpIDpcbiAgICAgICAgICAgIGlzUmVuZGVyRnJhbWUgPyB1bmRlZmluZWQgOiAvLyByZW5kZXJGcmFtZSBldmVudCBkb2Vzbid0IGhhdmUgYW55IHBvaW50c1xuICAgICAgICAgICAgRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCAoKGU6IGFueSk6IE1vdXNlRXZlbnQpKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHtoYW5kbGVyTmFtZSwgaGFuZGxlciwgYWxsb3dlZH0gb2YgdGhpcy5faGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGlmICghaGFuZGxlci5pc0VuYWJsZWQoKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGxldCBkYXRhOiBIYW5kbGVyUmVzdWx0IHwgdm9pZDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9ibG9ja2VkQnlBY3RpdmUoYWN0aXZlSGFuZGxlcnMsIGFsbG93ZWQsIGhhbmRsZXJOYW1lKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIucmVzZXQoKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoKGhhbmRsZXI6IGFueSlbZXZlbnROYW1lIHx8IGUudHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IChoYW5kbGVyOiBhbnkpW2V2ZW50TmFtZSB8fCBlLnR5cGVdKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VIYW5kbGVyUmVzdWx0KG1lcmdlZEhhbmRsZXJSZXN1bHQsIGV2ZW50c0luUHJvZ3Jlc3MsIGRhdGEsIGhhbmRsZXJOYW1lLCBpbnB1dEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5uZWVkc1JlbmRlckZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyUmVuZGVyRnJhbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEgfHwgaGFuZGxlci5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlSGFuZGxlcnNbaGFuZGxlck5hbWVdID0gaGFuZGxlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlYWN0aXZhdGVkSGFuZGxlcnMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIHRoaXMuX3ByZXZpb3VzQWN0aXZlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGlmICghYWN0aXZlSGFuZGxlcnNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBkZWFjdGl2YXRlZEhhbmRsZXJzW25hbWVdID0gaW5wdXRFdmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wcmV2aW91c0FjdGl2ZUhhbmRsZXJzID0gYWN0aXZlSGFuZGxlcnM7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRlYWN0aXZhdGVkSGFuZGxlcnMpLmxlbmd0aCB8fCBoYXNDaGFuZ2UobWVyZ2VkSGFuZGxlclJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZXMucHVzaChbbWVyZ2VkSGFuZGxlclJlc3VsdCwgZXZlbnRzSW5Qcm9ncmVzcywgZGVhY3RpdmF0ZWRIYW5kbGVyc10pO1xuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlclJlbmRlckZyYW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWN0aXZlSGFuZGxlcnMpLmxlbmd0aCB8fCBoYXNDaGFuZ2UobWVyZ2VkSGFuZGxlclJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5fc3RvcCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0aW5nQ2FtZXJhID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qge2NhbWVyYUFuaW1hdGlvbn0gPSBtZXJnZWRIYW5kbGVyUmVzdWx0O1xuICAgICAgICBpZiAoY2FtZXJhQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9pbmVydGlhLmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnRzKHt9LCB7fSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VzID0gW107XG4gICAgICAgICAgICBjYW1lcmFBbmltYXRpb24odGhpcy5fbWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1lcmdlSGFuZGxlclJlc3VsdChtZXJnZWRIYW5kbGVyUmVzdWx0OiBIYW5kbGVyUmVzdWx0LCBldmVudHNJblByb2dyZXNzOiBPYmplY3QsIGhhbmRsZXJSZXN1bHQ6IEhhbmRsZXJSZXN1bHQsIG5hbWU6IHN0cmluZywgZT86IElucHV0RXZlbnQpIHtcbiAgICAgICAgaWYgKCFoYW5kbGVyUmVzdWx0KSByZXR1cm47XG5cbiAgICAgICAgZXh0ZW5kKG1lcmdlZEhhbmRsZXJSZXN1bHQsIGhhbmRsZXJSZXN1bHQpO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IHtoYW5kbGVyTmFtZTogbmFtZSwgb3JpZ2luYWxFdmVudDogaGFuZGxlclJlc3VsdC5vcmlnaW5hbEV2ZW50IHx8IGV9O1xuXG4gICAgICAgIC8vIHRyYWNrIHdoaWNoIGhhbmRsZXIgY2hhbmdlZCB3aGljaCBjYW1lcmEgcHJvcGVydHlcbiAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQuem9vbURlbHRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV2ZW50c0luUHJvZ3Jlc3Muem9vbSA9IGV2ZW50RGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlclJlc3VsdC5wYW5EZWx0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBldmVudHNJblByb2dyZXNzLmRyYWcgPSBldmVudERhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQucGl0Y2hEZWx0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBldmVudHNJblByb2dyZXNzLnBpdGNoID0gZXZlbnREYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyUmVzdWx0LmJlYXJpbmdEZWx0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBldmVudHNJblByb2dyZXNzLnJvdGF0ZSA9IGV2ZW50RGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9hcHBseUNoYW5nZXMoKSB7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0ge307XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkRXZlbnRzSW5Qcm9ncmVzcyA9IHt9O1xuICAgICAgICBjb25zdCBjb21iaW5lZERlYWN0aXZhdGVkSGFuZGxlcnMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtjaGFuZ2UsIGV2ZW50c0luUHJvZ3Jlc3MsIGRlYWN0aXZhdGVkSGFuZGxlcnNdIG9mIHRoaXMuX2NoYW5nZXMpIHtcblxuICAgICAgICAgICAgaWYgKGNoYW5nZS5wYW5EZWx0YSkgY29tYmluZWQucGFuRGVsdGEgPSAoY29tYmluZWQucGFuRGVsdGEgfHwgbmV3IFBvaW50KDAsIDApKS5fYWRkKGNoYW5nZS5wYW5EZWx0YSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlLnpvb21EZWx0YSkgY29tYmluZWQuem9vbURlbHRhID0gKGNvbWJpbmVkLnpvb21EZWx0YSB8fCAwKSArIGNoYW5nZS56b29tRGVsdGE7XG4gICAgICAgICAgICBpZiAoY2hhbmdlLmJlYXJpbmdEZWx0YSkgY29tYmluZWQuYmVhcmluZ0RlbHRhID0gKGNvbWJpbmVkLmJlYXJpbmdEZWx0YSB8fCAwKSArIGNoYW5nZS5iZWFyaW5nRGVsdGE7XG4gICAgICAgICAgICBpZiAoY2hhbmdlLnBpdGNoRGVsdGEpIGNvbWJpbmVkLnBpdGNoRGVsdGEgPSAoY29tYmluZWQucGl0Y2hEZWx0YSB8fCAwKSArIGNoYW5nZS5waXRjaERlbHRhO1xuICAgICAgICAgICAgaWYgKGNoYW5nZS5hcm91bmQgIT09IHVuZGVmaW5lZCkgY29tYmluZWQuYXJvdW5kID0gY2hhbmdlLmFyb3VuZDtcbiAgICAgICAgICAgIGlmIChjaGFuZ2UuYXJvdW5kQ29vcmQgIT09IHVuZGVmaW5lZCkgY29tYmluZWQuYXJvdW5kQ29vcmQgPSBjaGFuZ2UuYXJvdW5kQ29vcmQ7XG4gICAgICAgICAgICBpZiAoY2hhbmdlLnBpbmNoQXJvdW5kICE9PSB1bmRlZmluZWQpIGNvbWJpbmVkLnBpbmNoQXJvdW5kID0gY2hhbmdlLnBpbmNoQXJvdW5kO1xuICAgICAgICAgICAgaWYgKGNoYW5nZS5ub0luZXJ0aWEpIGNvbWJpbmVkLm5vSW5lcnRpYSA9IGNoYW5nZS5ub0luZXJ0aWE7XG5cbiAgICAgICAgICAgIGV4dGVuZChjb21iaW5lZEV2ZW50c0luUHJvZ3Jlc3MsIGV2ZW50c0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgZXh0ZW5kKGNvbWJpbmVkRGVhY3RpdmF0ZWRIYW5kbGVycywgZGVhY3RpdmF0ZWRIYW5kbGVycyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVNYXBUcmFuc2Zvcm0oY29tYmluZWQsIGNvbWJpbmVkRXZlbnRzSW5Qcm9ncmVzcywgY29tYmluZWREZWFjdGl2YXRlZEhhbmRsZXJzKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlcyA9IFtdO1xuICAgIH1cblxuICAgIF91cGRhdGVNYXBUcmFuc2Zvcm0oY29tYmluZWRSZXN1bHQ6IGFueSwgY29tYmluZWRFdmVudHNJblByb2dyZXNzOiBPYmplY3QsIGRlYWN0aXZhdGVkSGFuZGxlcnM6IE9iamVjdCkge1xuXG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgY29uc3QgdHIgPSBtYXAudHJhbnNmb3JtO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50U3RhcnRlZCA9ICh0eXBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IGNvbWJpbmVkRXZlbnRzSW5Qcm9ncmVzc1t0eXBlXTtcbiAgICAgICAgICAgIHJldHVybiBuZXdFdmVudCAmJiAhdGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1t0eXBlXTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBldmVudEVuZGVkID0gKHR5cGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1t0eXBlXTtcbiAgICAgICAgICAgIHJldHVybiBldmVudCAmJiAhdGhpcy5faGFuZGxlcnNCeUlkW2V2ZW50LmhhbmRsZXJOYW1lXS5pc0FjdGl2ZSgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRvVmVjMyA9IChwOiBNZXJjYXRvckNvb3JkaW5hdGUpOiB2ZWMzID0+IFtwLngsIHAueSwgcC56XTtcblxuICAgICAgICBpZiAoZXZlbnRFbmRlZChcImRyYWdcIikgJiYgIWhhc0NoYW5nZShjb21iaW5lZFJlc3VsdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZVpvb20gPSB0ci56b29tO1xuICAgICAgICAgICAgdHIuY2FtZXJhRWxldmF0aW9uUmVmZXJlbmNlID0gXCJzZWFcIjtcbiAgICAgICAgICAgIHRyLnJlY2VudGVyT25UZXJyYWluKCk7XG4gICAgICAgICAgICB0ci5jYW1lcmFFbGV2YXRpb25SZWZlcmVuY2UgPSBcImdyb3VuZFwiO1xuICAgICAgICAgICAgLy8gTWFwIHpvb20gbWlnaHQgY2hhbmdlIGR1cmluZyB0aGUgcGFuIG9wZXJhdGlvbiBkdWUgdG8gdGVycmFpbiBlbGV2YXRpb24uXG4gICAgICAgICAgICBpZiAocHJlWm9vbSAhPT0gdHIuem9vbSkgdGhpcy5fbWFwLl91cGRhdGUodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhhc0NoYW5nZShjb21iaW5lZFJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maXJlRXZlbnRzKGNvbWJpbmVkRXZlbnRzSW5Qcm9ncmVzcywgZGVhY3RpdmF0ZWRIYW5kbGVycywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHtwYW5EZWx0YSwgem9vbURlbHRhLCBiZWFyaW5nRGVsdGEsIHBpdGNoRGVsdGEsIGFyb3VuZCwgYXJvdW5kQ29vcmQsIHBpbmNoQXJvdW5kfSA9IGNvbWJpbmVkUmVzdWx0O1xuXG4gICAgICAgIGlmIChwaW5jaEFyb3VuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhcm91bmQgPSBwaW5jaEFyb3VuZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudFN0YXJ0ZWQoXCJkcmFnXCIpICYmIGFyb3VuZCkge1xuICAgICAgICAgICAgdGhpcy5fZHJhZ09yaWdpbiA9IHRvVmVjMyh0ci5wb2ludENvb3JkaW5hdGUzRChhcm91bmQpKTtcbiAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgdHJhY2tpbmcgZWxsaXBzb2lkIGV2ZXJ5IHRpbWUgdXNlciBjaGFuZ2VzIHRoZSBkcmFnIG9yaWdpbi5cbiAgICAgICAgICAgIC8vIERpcmVjdGlvbiBvZiB0aGUgcmF5IHdpbGwgZGVmaW5lIHNpemUgb2YgdGhlIHNoYXBlIGFuZCBoZW5jZSBkZWZpbmluZyB0aGUgYXZhaWxhYmxlIHJhbmdlIG9mIG1vdmVtZW50XG4gICAgICAgICAgICB0aGlzLl90cmFja2luZ0VsbGlwc29pZC5zZXR1cCh0ci5fY2FtZXJhLnBvc2l0aW9uLCB0aGlzLl9kcmFnT3JpZ2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbCBtb3ZlbWVudCBvZiB0aGUgY2FtZXJhIGlzIGRvbmUgcmVsYXRpdmUgdG8gdGhlIHNlYSBsZXZlbFxuICAgICAgICB0ci5jYW1lcmFFbGV2YXRpb25SZWZlcmVuY2UgPSBcInNlYVwiO1xuXG4gICAgICAgIC8vIHN0b3AgYW55IG9uZ29pbmcgY2FtZXJhIGFuaW1hdGlvbnMgKGVhc2VUbywgZmx5VG8pXG4gICAgICAgIG1hcC5fc3RvcCh0cnVlKTtcblxuICAgICAgICBhcm91bmQgPSBhcm91bmQgfHwgbWFwLnRyYW5zZm9ybS5jZW50ZXJQb2ludDtcbiAgICAgICAgaWYgKGJlYXJpbmdEZWx0YSkgdHIuYmVhcmluZyArPSBiZWFyaW5nRGVsdGE7XG4gICAgICAgIGlmIChwaXRjaERlbHRhKSB0ci5waXRjaCArPSBwaXRjaERlbHRhO1xuICAgICAgICB0ci5fdXBkYXRlQ2FtZXJhU3RhdGUoKTtcblxuICAgICAgICAvLyBDb21wdXRlIE1lcmNhdG9yIDNEIGNhbWVyYSBvZmZzZXQgYmFzZWQgb24gc2NyZWVuc3BhY2UgcGFuRGVsdGFcbiAgICAgICAgY29uc3QgcGFuVmVjID0gWzAsIDAsIDBdO1xuICAgICAgICBpZiAocGFuRGVsdGEpIHtcbiAgICAgICAgICAgIGFzc2VydCh0aGlzLl9kcmFnT3JpZ2luLCAnX2RyYWdPcmlnaW4gc2hvdWxkIGhhdmUgYmVlbiBzZXR1cCB3aXRoIGEgcHJldmlvdXMgZHJhZ3N0YXJ0Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSB0ci5wb2ludENvb3JkaW5hdGUoYXJvdW5kKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdHIucG9pbnRDb29yZGluYXRlKGFyb3VuZC5zdWIocGFuRGVsdGEpKTtcblxuICAgICAgICAgICAgaWYgKHN0YXJ0UG9pbnQgJiYgZW5kUG9pbnQpIHtcbiAgICAgICAgICAgICAgICBwYW5WZWNbMF0gPSBlbmRQb2ludC54IC0gc3RhcnRQb2ludC54O1xuICAgICAgICAgICAgICAgIHBhblZlY1sxXSA9IGVuZFBvaW50LnkgLSBzdGFydFBvaW50Lnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcmlnaW5hbFpvb20gPSB0ci56b29tO1xuICAgICAgICAvLyBDb21wdXRlIE1lcmNhdG9yIDNEIGNhbWVyYSBvZmZzZXQgYmFzZWQgb24gc2NyZWVuc3BhY2UgcmVxdWVzdGVkIFpvb21EZWx0YVxuICAgICAgICBjb25zdCB6b29tVmVjID0gWzAsIDAsIDBdO1xuICAgICAgICBpZiAoem9vbURlbHRhKSB7XG4gICAgICAgICAgICAvLyBab29tIHZhbHVlIGhhcyB0byBiZSBjb21wdXRlZCByZWxhdGl2ZSB0byBhIHNlY29uZGFyeSBtYXAgcGxhbmUgdGhhdCBpcyBjcmVhdGVkIGZyb20gdGhlIHRlcnJhaW4gcG9zaXRpb24gYmVsb3cgdGhlIGN1cnNvci5cbiAgICAgICAgICAgIC8vIFRoaXMgd2F5IHRoZSB6b29tIGludGVycG9sYXRpb24gY2FuIGJlIGtlcHQgbGluZWFyIGFuZCBpbmRlcGVuZGVudCBvZiB0aGUgKHBvc3NpYmxlKSB0ZXJyYWluIGVsZXZhdGlvblxuICAgICAgICAgICAgY29uc3QgcGlja2VkUG9zaXRpb246IHZlYzMgPSBhcm91bmRDb29yZCA/IHRvVmVjMyhhcm91bmRDb29yZCkgOiB0b1ZlYzModHIucG9pbnRDb29yZGluYXRlM0QoYXJvdW5kKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFyb3VuZFJheSA9IHtkaXI6IHZlYzMubm9ybWFsaXplKFtdLCB2ZWMzLnN1YihbXSwgcGlja2VkUG9zaXRpb24sIHRyLl9jYW1lcmEucG9zaXRpb24pKX07XG4gICAgICAgICAgICBpZiAoYXJvdW5kUmF5LmRpclsyXSA8IDApIHtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGlzIHJlcXVpcmVkIGlmIHRoZSByYXkgY3JlYXRlZCBmcm9tIHRoZSBjdXJzb3IgaXMgaGVhZGluZyB1cC5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIHNjZW5hcmlvIGlzIHBvc3NpYmxlIGlmIHVzZXIgaXMgdHJ5aW5nIHRvIHpvb20gdG93YXJkcyBhIGZlYXR1cmUgbGlrZSBhIGhpbGwgb3IgYSBtb3VudGFpbi5cbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHpvb21EZWx0YSB0byBhIG1vdmVtZW50IHZlY3RvciBhcyBpZiB0aGUgY2FtZXJhIHdvdWxkIGJlIG9yYml0aW5nIGFyb3VuZCB0aGUgcGlja2VkIHBvaW50XG4gICAgICAgICAgICAgICAgY29uc3QgbW92ZW1lbnQgPSB0ci56b29tRGVsdGFUb01vdmVtZW50KHBpY2tlZFBvc2l0aW9uLCB6b29tRGVsdGEpO1xuICAgICAgICAgICAgICAgIHZlYzMuc2NhbGUoem9vbVZlYywgYXJvdW5kUmF5LmRpciwgbW92ZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTXV0YXRlIGNhbWVyYSBzdGF0ZSB2aWEgQ2FtZXJhQVBJXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdmVjMy5hZGQocGFuVmVjLCBwYW5WZWMsIHpvb21WZWMpO1xuICAgICAgICB0ci5fdHJhbnNsYXRlQ2FtZXJhQ29uc3RyYWluZWQodHJhbnNsYXRpb24pO1xuXG4gICAgICAgIGlmICh6b29tRGVsdGEgJiYgTWF0aC5hYnModHIuem9vbSAtIG9yaWdpbmFsWm9vbSkgPiAwLjAwMDEpIHtcbiAgICAgICAgICAgIHRyLnJlY2VudGVyT25UZXJyYWluKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0ci5jYW1lcmFFbGV2YXRpb25SZWZlcmVuY2UgPSBcImdyb3VuZFwiO1xuXG4gICAgICAgIHRoaXMuX21hcC5fdXBkYXRlKCk7XG4gICAgICAgIGlmICghY29tYmluZWRSZXN1bHQubm9JbmVydGlhKSB0aGlzLl9pbmVydGlhLnJlY29yZChjb21iaW5lZFJlc3VsdCk7XG4gICAgICAgIHRoaXMuX2ZpcmVFdmVudHMoY29tYmluZWRFdmVudHNJblByb2dyZXNzLCBkZWFjdGl2YXRlZEhhbmRsZXJzLCB0cnVlKTtcblxuICAgIH1cblxuICAgIF9maXJlRXZlbnRzKG5ld0V2ZW50c0luUHJvZ3Jlc3M6IHsgW3N0cmluZ106IE9iamVjdCB9LCBkZWFjdGl2YXRlZEhhbmRsZXJzOiBPYmplY3QsIGFsbG93RW5kQW5pbWF0aW9uOiBib29sZWFuKSB7XG5cbiAgICAgICAgY29uc3Qgd2FzTW92aW5nID0gaXNNb3ZpbmcodGhpcy5fZXZlbnRzSW5Qcm9ncmVzcyk7XG4gICAgICAgIGNvbnN0IG5vd01vdmluZyA9IGlzTW92aW5nKG5ld0V2ZW50c0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0RXZlbnRzID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gbmV3RXZlbnRzSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgY29uc3Qge29yaWdpbmFsRXZlbnR9ID0gbmV3RXZlbnRzSW5Qcm9ncmVzc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9ldmVudHNJblByb2dyZXNzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgICAgICAgICBzdGFydEV2ZW50c1tgJHtldmVudE5hbWV9c3RhcnRgXSA9IG9yaWdpbmFsRXZlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9ldmVudHNJblByb2dyZXNzW2V2ZW50TmFtZV0gPSBuZXdFdmVudHNJblByb2dyZXNzW2V2ZW50TmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJlIHN0YXJ0IGV2ZW50cyBvbmx5IGFmdGVyIHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3MgaGFzIGJlZW4gdXBkYXRlZFxuICAgICAgICBpZiAoIXdhc01vdmluZyAmJiBub3dNb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnbW92ZXN0YXJ0Jywgbm93TW92aW5nLm9yaWdpbmFsRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIHN0YXJ0RXZlbnRzKSB7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQobmFtZSwgc3RhcnRFdmVudHNbbmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vd01vdmluZykge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3ZlJywgbm93TW92aW5nLm9yaWdpbmFsRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gbmV3RXZlbnRzSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgY29uc3Qge29yaWdpbmFsRXZlbnR9ID0gbmV3RXZlbnRzSW5Qcm9ncmVzc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KGV2ZW50TmFtZSwgb3JpZ2luYWxFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbmRFdmVudHMgPSB7fTtcblxuICAgICAgICBsZXQgb3JpZ2luYWxFbmRFdmVudDtcbiAgICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgY29uc3Qge2hhbmRsZXJOYW1lLCBvcmlnaW5hbEV2ZW50fSA9IHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3NbZXZlbnROYW1lXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5faGFuZGxlcnNCeUlkW2hhbmRsZXJOYW1lXS5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3NbZXZlbnROYW1lXTtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZEV2ZW50ID0gZGVhY3RpdmF0ZWRIYW5kbGVyc1toYW5kbGVyTmFtZV0gfHwgb3JpZ2luYWxFdmVudDtcbiAgICAgICAgICAgICAgICBlbmRFdmVudHNbYCR7ZXZlbnROYW1lfWVuZGBdID0gb3JpZ2luYWxFbmRFdmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBlbmRFdmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudChuYW1lLCBlbmRFdmVudHNbbmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RpbGxNb3ZpbmcgPSBpc01vdmluZyh0aGlzLl9ldmVudHNJblByb2dyZXNzKTtcbiAgICAgICAgaWYgKGFsbG93RW5kQW5pbWF0aW9uICYmICh3YXNNb3ZpbmcgfHwgbm93TW92aW5nKSAmJiAhc3RpbGxNb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nQ2FtZXJhID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGluZXJ0aWFsRWFzZSA9IHRoaXMuX2luZXJ0aWEuX29uTW92ZUVuZCh0aGlzLl9tYXAuZHJhZ1Bhbi5faW5lcnRpYU9wdGlvbnMpO1xuXG4gICAgICAgICAgICBjb25zdCBzaG91bGRTbmFwVG9Ob3J0aCA9IGJlYXJpbmcgPT4gYmVhcmluZyAhPT0gMCAmJiAtdGhpcy5fYmVhcmluZ1NuYXAgPCBiZWFyaW5nICYmIGJlYXJpbmcgPCB0aGlzLl9iZWFyaW5nU25hcDtcblxuICAgICAgICAgICAgaWYgKGluZXJ0aWFsRWFzZSkge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTbmFwVG9Ob3J0aChpbmVydGlhbEVhc2UuYmVhcmluZyB8fCB0aGlzLl9tYXAuZ2V0QmVhcmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICBpbmVydGlhbEVhc2UuYmVhcmluZyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5lYXNlVG8oaW5lcnRpYWxFYXNlLCB7b3JpZ2luYWxFdmVudDogb3JpZ2luYWxFbmRFdmVudH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoJ21vdmVlbmQnLCB7b3JpZ2luYWxFdmVudDogb3JpZ2luYWxFbmRFdmVudH0pKTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU25hcFRvTm9ydGgodGhpcy5fbWFwLmdldEJlYXJpbmcoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLnJlc2V0Tm9ydGgoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl91cGRhdGluZ0NhbWVyYSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBfZmlyZUV2ZW50KHR5cGU6IHN0cmluZywgZTogKikge1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQodHlwZSwgZSA/IHtvcmlnaW5hbEV2ZW50OiBlfSA6IHt9KSk7XG4gICAgfVxuXG4gICAgX3JlcXVlc3RGcmFtZSgpIHtcbiAgICAgICAgdGhpcy5fbWFwLnRyaWdnZXJSZXBhaW50KCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuX3JlbmRlclRhc2tRdWV1ZS5hZGQodGltZVN0YW1wID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9mcmFtZUlkO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVFdmVudChuZXcgUmVuZGVyRnJhbWVFdmVudCgncmVuZGVyRnJhbWUnLCB7dGltZVN0YW1wfSkpO1xuICAgICAgICAgICAgdGhpcy5fYXBwbHlDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF90cmlnZ2VyUmVuZGVyRnJhbWUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFtZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSB0aGlzLl9yZXF1ZXN0RnJhbWUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSGFuZGxlck1hbmFnZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIGJpbmRBbGwsXG4gICAgZXh0ZW5kLFxuICAgIHdhcm5PbmNlLFxuICAgIGNsYW1wLFxuICAgIHdyYXAsXG4gICAgZWFzZSBhcyBkZWZhdWx0RWFzaW5nLFxuICAgIHBpY2ssXG4gICAgZGVnVG9SYWRcbn0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlfSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyLmpzJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQuanMnO1xuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuLi9nZW8vbG5nX2xhdF9ib3VuZHMuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7RGVidWd9IGZyb20gJy4uL3V0aWwvZGVidWcuanMnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge21lcmNhdG9yWmZyb21BbHRpdHVkZX0gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHt2ZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHR5cGUge0ZyZWVDYW1lcmFPcHRpb25zfSBmcm9tICcuL2ZyZWVfY2FtZXJhLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtMbmdMYXRMaWtlfSBmcm9tICcuLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgdHlwZSB7TG5nTGF0Qm91bmRzTGlrZX0gZnJvbSAnLi4vZ2VvL2xuZ19sYXRfYm91bmRzLmpzJztcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uL3V0aWwvdGFza19xdWV1ZS5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtBYWJiLCBGcnVzdHVtfSBmcm9tICcuLi91dGlsL3ByaW1pdGl2ZXMuanMnO1xuaW1wb3J0IHR5cGUge1BhZGRpbmdPcHRpb25zfSBmcm9tICcuLi9nZW8vZWRnZV9pbnNldHMuanMnO1xuXG4vKipcbiAqIE9wdGlvbnMgY29tbW9uIHRvIHtAbGluayBNYXAjanVtcFRvfSwge0BsaW5rIE1hcCNlYXNlVG99LCBhbmQge0BsaW5rIE1hcCNmbHlUb30sIGNvbnRyb2xsaW5nIHRoZSBkZXNpcmVkIGxvY2F0aW9uLFxuICogem9vbSwgYmVhcmluZywgYW5kIHBpdGNoIG9mIHRoZSBjYW1lcmEuIEFsbCBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbCwgYW5kIHdoZW4gYSBwcm9wZXJ0eSBpcyBvbWl0dGVkLCB0aGUgY3VycmVudFxuICogY2FtZXJhIHZhbHVlIGZvciB0aGF0IHByb3BlcnR5IHdpbGwgcmVtYWluIHVuY2hhbmdlZC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDYW1lcmFPcHRpb25zXG4gKiBAcHJvcGVydHkge0xuZ0xhdExpa2V9IGNlbnRlciBUaGUgZGVzaXJlZCBjZW50ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gem9vbSBUaGUgZGVzaXJlZCB6b29tIGxldmVsLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJlYXJpbmcgVGhlIGRlc2lyZWQgYmVhcmluZyBpbiBkZWdyZWVzLiBUaGUgYmVhcmluZyBpcyB0aGUgY29tcGFzcyBkaXJlY3Rpb24gdGhhdFxuICogaXMgXCJ1cFwiLiBGb3IgZXhhbXBsZSwgYGJlYXJpbmc6IDkwYCBvcmllbnRzIHRoZSBtYXAgc28gdGhhdCBlYXN0IGlzIHVwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHBpdGNoIFRoZSBkZXNpcmVkIHBpdGNoIGluIGRlZ3JlZXMuIFRoZSBwaXRjaCBpcyB0aGUgYW5nbGUgdG93YXJkcyB0aGUgaG9yaXpvblxuICogbWVhc3VyZWQgaW4gZGVncmVlcyB3aXRoIGEgcmFuZ2UgYmV0d2VlbiAwIGFuZCA2MCBkZWdyZWVzLiBGb3IgZXhhbXBsZSwgcGl0Y2g6IDAgcHJvdmlkZXMgdGhlIGFwcGVhcmFuY2VcbiAqIG9mIGxvb2tpbmcgc3RyYWlnaHQgZG93biBhdCB0aGUgbWFwLCB3aGlsZSBwaXRjaDogNjAgdGlsdHMgdGhlIHVzZXIncyBwZXJzcGVjdGl2ZSB0b3dhcmRzIHRoZSBob3Jpem9uLlxuICogSW5jcmVhc2luZyB0aGUgcGl0Y2ggdmFsdWUgaXMgb2Z0ZW4gdXNlZCB0byBkaXNwbGF5IDNEIG9iamVjdHMuXG4gKiBAcHJvcGVydHkge0xuZ0xhdExpa2V9IGFyb3VuZCBJZiBgem9vbWAgaXMgc3BlY2lmaWVkLCBgYXJvdW5kYCBkZXRlcm1pbmVzIHRoZSBwb2ludCBhcm91bmQgd2hpY2ggdGhlIHpvb20gaXMgY2VudGVyZWQuXG4gKiBAcHJvcGVydHkge1BhZGRpbmdPcHRpb25zfSBwYWRkaW5nIERpbWVuc2lvbnMgaW4gcGl4ZWxzIGFwcGxpZWQgb24gZWFjaCBzaWRlIG9mIHRoZSB2aWV3cG9ydCBmb3Igc2hpZnRpbmcgdGhlIHZhbmlzaGluZyBwb2ludC5cbiAqIEBleGFtcGxlXG4gKiAvLyBzZXQgdGhlIG1hcCdzIGluaXRpYWwgcGVyc3BlY3RpdmUgd2l0aCBDYW1lcmFPcHRpb25zXG4gKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHtcbiAqICAgICBjb250YWluZXI6ICdtYXAnLFxuICogICAgIHN0eWxlOiAnbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zdHJlZXRzLXYxMScsXG4gKiAgICAgY2VudGVyOiBbLTczLjU4MDQsIDQ1LjUzNDgzXSxcbiAqICAgICBwaXRjaDogNjAsXG4gKiAgICAgYmVhcmluZzogLTYwLFxuICogICAgIHpvb206IDEwXG4gKiB9KTtcbiAqIEBzZWUgW0V4YW1wbGU6IFNldCBwaXRjaCBhbmQgYmVhcmluZ10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2V0LXBlcnNwZWN0aXZlLylcbiAqIEBzZWUgW0V4YW1wbGU6IEp1bXAgdG8gYSBzZXJpZXMgb2YgbG9jYXRpb25zXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9qdW1wLXRvLylcbiAqIEBzZWUgW0V4YW1wbGU6IEZseSB0byBhIGxvY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mbHl0by8pXG4gKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGJ1aWxkaW5ncyBpbiAzRF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvM2QtYnVpbGRpbmdzLylcbiAqL1xuZXhwb3J0IHR5cGUgQ2FtZXJhT3B0aW9ucyA9IHtcbiAgICBjZW50ZXI/OiBMbmdMYXRMaWtlLFxuICAgIHpvb20/OiBudW1iZXIsXG4gICAgYmVhcmluZz86IG51bWJlcixcbiAgICBwaXRjaD86IG51bWJlcixcbiAgICBhcm91bmQ/OiBMbmdMYXRMaWtlLFxuICAgIHBhZGRpbmc/OiBQYWRkaW5nT3B0aW9uc1xufTtcblxuLyoqXG4gKiBPcHRpb25zIGNvbW1vbiB0byBtYXAgbW92ZW1lbnQgbWV0aG9kcyB0aGF0IGludm9sdmUgYW5pbWF0aW9uLCBzdWNoIGFzIHtAbGluayBNYXAjcGFuQnl9IGFuZFxuICoge0BsaW5rIE1hcCNlYXNlVG99LCBjb250cm9sbGluZyB0aGUgZHVyYXRpb24gYW5kIGVhc2luZyBmdW5jdGlvbiBvZiB0aGUgYW5pbWF0aW9uLiBBbGwgcHJvcGVydGllc1xuICogYXJlIG9wdGlvbmFsLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFuaW1hdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGVhc2luZyBBIGZ1bmN0aW9uIHRha2luZyBhIHRpbWUgaW4gdGhlIHJhbmdlIDAuLjEgYW5kIHJldHVybmluZyBhIG51bWJlciB3aGVyZSAwIGlzXG4gKiAgIHRoZSBpbml0aWFsIHN0YXRlIGFuZCAxIGlzIHRoZSBmaW5hbCBzdGF0ZS5cbiAqIEBwcm9wZXJ0eSB7UG9pbnRMaWtlfSBvZmZzZXQgVGhlIHRhcmdldCBjZW50ZXIncyBvZmZzZXQgcmVsYXRpdmUgdG8gcmVhbCBtYXAgY29udGFpbmVyIGNlbnRlciBhdCB0aGUgZW5kIG9mIGFuaW1hdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYW5pbWF0ZSBJZiBgZmFsc2VgLCBubyBhbmltYXRpb24gd2lsbCBvY2N1ci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZXNzZW50aWFsIElmIGB0cnVlYCwgdGhlbiB0aGUgYW5pbWF0aW9uIGlzIGNvbnNpZGVyZWQgZXNzZW50aWFsIGFuZCB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieVxuICogICBbYHByZWZlcnMtcmVkdWNlZC1tb3Rpb25gXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQG1lZGlhL3ByZWZlcnMtcmVkdWNlZC1tb3Rpb24pLlxuICogQHNlZSBbRXhhbXBsZTogU2xvd2x5IGZseSB0byBhIGxvY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mbHl0by1vcHRpb25zLylcbiAqIEBzZWUgW0V4YW1wbGU6IEN1c3RvbWl6ZSBjYW1lcmEgYW5pbWF0aW9uc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2FtZXJhLWFuaW1hdGlvbi8pXG4gKiBAc2VlIFtFeGFtcGxlOiBOYXZpZ2F0ZSB0aGUgbWFwIHdpdGggZ2FtZS1saWtlIGNvbnRyb2xzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nYW1lLWNvbnRyb2xzLylcbiovXG5leHBvcnQgdHlwZSBBbmltYXRpb25PcHRpb25zID0ge1xuICAgIGR1cmF0aW9uPzogbnVtYmVyLFxuICAgIGVhc2luZz86IChfOiBudW1iZXIpID0+IG51bWJlcixcbiAgICBvZmZzZXQ/OiBQb2ludExpa2UsXG4gICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgZXNzZW50aWFsPzogYm9vbGVhblxufTtcblxuZXhwb3J0IHR5cGUgRWxldmF0aW9uQm94UmF5Y2FzdCA9IHtcbiAgICBtaW5MbmdMYXQ6IExuZ0xhdCxcbiAgICBtYXhMbmdMYXQ6IExuZ0xhdCxcbiAgICBtaW5BbHRpdHVkZTogbnVtYmVyLFxuICAgIG1heEFsdGl0dWRlOiBudW1iZXJcbn07XG5cbmNvbnN0IGZyZWVDYW1lcmFOb3RTdXBwb3J0ZWRXYXJuaW5nID0gJ21hcC5zZXRGcmVlQ2FtZXJhT3B0aW9ucyguLi4pIGFuZCBtYXAuZ2V0RnJlZUNhbWVyYU9wdGlvbnMoKSBhcmUgbm90IHlldCBzdXBwb3J0ZWQgZm9yIG5vbi1tZXJjYXRvciBwcm9qZWN0aW9ucy4nO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNldHRpbmcgcGFkZGluZyBvbiBjYWxscyB0byBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE1hcCNmaXRCb3VuZHN9LCB7QGxpbmsgTWFwI2ZpdFNjcmVlbkNvb3JkaW5hdGVzfSwgYW5kIHtAbGluayBNYXAjc2V0UGFkZGluZ30uIEFkanVzdCB0aGVzZSBvcHRpb25zIHRvIHNldCB0aGUgYW1vdW50IG9mIHBhZGRpbmcgaW4gcGl4ZWxzIGFkZGVkIHRvIHRoZSBlZGdlcyBvZiB0aGUgY2FudmFzLiBTZXQgYSB1bmlmb3JtIHBhZGRpbmcgb24gYWxsIGVkZ2VzIG9yIGluZGl2aWR1YWwgdmFsdWVzIGZvciBlYWNoIGVkZ2UuIEFsbCBwcm9wZXJ0aWVzIG9mIHRoaXMgb2JqZWN0IG11c3QgYmVcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQYWRkaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRvcCBQYWRkaW5nIGluIHBpeGVscyBmcm9tIHRoZSB0b3Agb2YgdGhlIG1hcCBjYW52YXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gYm90dG9tIFBhZGRpbmcgaW4gcGl4ZWxzIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgbWFwIGNhbnZhcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZWZ0IFBhZGRpbmcgaW4gcGl4ZWxzIGZyb20gdGhlIGxlZnQgb2YgdGhlIG1hcCBjYW52YXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gcmlnaHQgUGFkZGluZyBpbiBwaXhlbHMgZnJvbSB0aGUgcmlnaHQgb2YgdGhlIG1hcCBjYW52YXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGJib3ggPSBbWy03OSwgNDNdLCBbLTczLCA0NV1dO1xuICogbWFwLmZpdEJvdW5kcyhiYm94LCB7XG4gKiAgICAgcGFkZGluZzoge3RvcDogMTAsIGJvdHRvbToyNSwgbGVmdDogMTUsIHJpZ2h0OiA1fVxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGJib3ggPSBbWy03OSwgNDNdLCBbLTczLCA0NV1dO1xuICogbWFwLmZpdEJvdW5kcyhiYm94LCB7XG4gKiAgICAgcGFkZGluZzogMjBcbiAqIH0pO1xuICogQHNlZSBbRXhhbXBsZTogRml0IHRvIHRoZSBib3VuZHMgb2YgYSBMaW5lU3RyaW5nXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS96b29tdG8tbGluZXN0cmluZy8pXG4gKiBAc2VlIFtFeGFtcGxlOiBGaXQgYSBtYXAgdG8gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpdGJvdW5kcy8pXG4gKi9cblxuY2xhc3MgQ2FtZXJhIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm07XG4gICAgX21vdmluZzogYm9vbGVhbjtcbiAgICBfem9vbWluZzogYm9vbGVhbjtcbiAgICBfcm90YXRpbmc6IGJvb2xlYW47XG4gICAgX3BpdGNoaW5nOiBib29sZWFuO1xuICAgIF9wYWRkaW5nOiBib29sZWFuO1xuXG4gICAgX2JlYXJpbmdTbmFwOiBudW1iZXI7XG4gICAgX2Vhc2VTdGFydDogbnVtYmVyO1xuICAgIF9lYXNlT3B0aW9uczoge2R1cmF0aW9uOiBudW1iZXIsIGVhc2luZzogKF86IG51bWJlcikgPT4gbnVtYmVyfTtcbiAgICBfZWFzZUlkOiBzdHJpbmcgfCB2b2lkO1xuXG4gICAgX29uRWFzZUZyYW1lOiAoXzogbnVtYmVyKSA9PiBUcmFuc2Zvcm0gfCB2b2lkO1xuICAgIF9vbkVhc2VFbmQ6IChlYXNlSWQ/OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgX2Vhc2VGcmFtZUlkOiA/VGFza0lEO1xuXG4gICAgK19yZXF1ZXN0UmVuZGVyRnJhbWU6ICgoKSA9PiB2b2lkKSA9PiBUYXNrSUQ7XG4gICAgK19jYW5jZWxSZW5kZXJGcmFtZTogKF86IFRhc2tJRCkgPT4gdm9pZDtcblxuICAgICtfcHJlbG9hZFRpbGVzOiAodHJhbnNmb3JtOiBUcmFuc2Zvcm0gfCBBcnJheTxUcmFuc2Zvcm0+LCBjYWxsYmFjaz86IENhbGxiYWNrPGFueT4pID0+IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKHRyYW5zZm9ybTogVHJhbnNmb3JtLCBvcHRpb25zOiB7YmVhcmluZ1NuYXA6IG51bWJlcn0pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbW92aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3pvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIHRoaXMuX2JlYXJpbmdTbmFwID0gb3B0aW9ucy5iZWFyaW5nU25hcDtcblxuICAgICAgICBiaW5kQWxsKFsnX3JlbmRlckZyYW1lQ2FsbGJhY2snXSwgdGhpcyk7XG5cbiAgICAgICAgLy9hZGRBc3NlcnRpb25zKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7Q2FtZXJhfVxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwICovXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgY2VudGVycG9pbnQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBtYXAncyBnZW9ncmFwaGljYWwgY2VudGVycG9pbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBSZXR1cm4gYSBMbmdMYXQgb2JqZWN0IHN1Y2ggYXMge2xuZzogMCwgbGF0OiAwfS5cbiAgICAgKiBjb25zdCBjZW50ZXIgPSBtYXAuZ2V0Q2VudGVyKCk7XG4gICAgICogLy8gQWNjZXNzIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgdmFsdWVzIGRpcmVjdGx5LlxuICAgICAqIGNvbnN0IHtsbmcsIGxhdH0gPSBtYXAuZ2V0Q2VudGVyKCk7XG4gICAgICogQHNlZSBbVHV0b3JpYWw6IFVzZSBNYXBib3ggR0wgSlMgaW4gYSBSZWFjdCBhcHBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvdHV0b3JpYWxzL3VzZS1tYXBib3gtZ2wtanMtd2l0aC1yZWFjdC8jc3RvcmUtdGhlLW5ldy1jb29yZGluYXRlcylcbiAgICAgKi9cbiAgICBnZXRDZW50ZXIoKTogTG5nTGF0IHsgcmV0dXJuIG5ldyBMbmdMYXQodGhpcy50cmFuc2Zvcm0uY2VudGVyLmxuZywgdGhpcy50cmFuc2Zvcm0uY2VudGVyLmxhdCk7IH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCdzIGdlb2dyYXBoaWNhbCBjZW50ZXJwb2ludC4gRXF1aXZhbGVudCB0byBganVtcFRvKHtjZW50ZXI6IGNlbnRlcn0pYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBjZW50ZXIgVGhlIGNlbnRlcnBvaW50IHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRDZW50ZXIoWy03NCwgMzhdKTtcbiAgICAgKi9cbiAgICBzZXRDZW50ZXIoY2VudGVyOiBMbmdMYXRMaWtlLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanVtcFRvKHtjZW50ZXJ9LCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhbnMgdGhlIG1hcCBieSB0aGUgc3BlY2lmaWVkIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IG9mZnNldCBUaGUgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMgYnkgd2hpY2ggdG8gcGFuIHRoZSBtYXAuXG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zIHwgbnVsbH0gb3B0aW9ucyBBbiBvcHRpb25zIG9iamVjdCBkZXNjcmliaW5nIHRoZSBkZXN0aW5hdGlvbiBhbmQgYW5pbWF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLiBXZSBkbyBub3QgcmVjb21tZW5kIHVzaW5nIGBvcHRpb25zLm9mZnNldGAgc2luY2UgdGhpcyB2YWx1ZSB3aWxsIG92ZXJyaWRlIHRoZSB2YWx1ZSBvZiB0aGUgYG9mZnNldGAgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2AgUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5wYW5CeShbLTc0LCAzOF0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gcGFuQnkgd2l0aCBhbiBhbmltYXRpb24gb2YgNSBzZWNvbmRzLlxuICAgICAqIG1hcC5wYW5CeShbLTc0LCAzOF0sIHtkdXJhdGlvbjogNTAwMH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IE5hdmlnYXRlIHRoZSBtYXAgd2l0aCBnYW1lLWxpa2UgY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2FtZS1jb250cm9scy8pXG4gICAgICovXG4gICAgcGFuQnkob2Zmc2V0OiBQb2ludExpa2UsIG9wdGlvbnM/OiBBbmltYXRpb25PcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgb2Zmc2V0ID0gUG9pbnQuY29udmVydChvZmZzZXQpLm11bHQoLTEpO1xuICAgICAgICByZXR1cm4gdGhpcy5wYW5Ubyh0aGlzLnRyYW5zZm9ybS5jZW50ZXIsIGV4dGVuZCh7b2Zmc2V0fSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFucyB0aGUgbWFwIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IGxuZ2xhdCBUaGUgbG9jYXRpb24gdG8gcGFuIHRoZSBtYXAgdG8uXG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zIHwgbnVsbH0gb3B0aW9ucyBPcHRpb25zIGRlc2NyaWJpbmcgdGhlIGRlc3RpbmF0aW9uIGFuZCBhbmltYXRpb24gb2YgdGhlIHRyYW5zaXRpb24uXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBudWxsfSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAucGFuVG8oWy03NCwgMzhdKTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFNwZWNpZnkgdGhhdCB0aGUgcGFuVG8gYW5pbWF0aW9uIHNob3VsZCBsYXN0IDUwMDAgbWlsbGlzZWNvbmRzLlxuICAgICAqIG1hcC5wYW5UbyhbLTc0LCAzOF0sIHtkdXJhdGlvbjogNTAwMH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IFVwZGF0ZSBhIGZlYXR1cmUgaW4gcmVhbHRpbWVdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2xpdmUtdXBkYXRlLWZlYXR1cmUvKVxuICAgICAqL1xuICAgIHBhblRvKGxuZ2xhdDogTG5nTGF0TGlrZSwgb3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lYXNlVG8oZXh0ZW5kKHtcbiAgICAgICAgICAgIGNlbnRlcjogbG5nbGF0XG4gICAgICAgIH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGN1cnJlbnQgem9vbSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIG1hcCdzIGN1cnJlbnQgem9vbSBsZXZlbC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5nZXRab29tKCk7XG4gICAgICovXG4gICAgZ2V0Wm9vbSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0uem9vbTsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwJ3Mgem9vbSBsZXZlbC4gRXF1aXZhbGVudCB0byBganVtcFRvKHt6b29tOiB6b29tfSlgLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gem9vbSBUaGUgem9vbSBsZXZlbCB0byBzZXQgKDAtMjApLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21zdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZWVuZFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBab29tIHRvIHRoZSB6b29tIGxldmVsIDUgd2l0aG91dCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uXG4gICAgICogbWFwLnNldFpvb20oNSk7XG4gICAgICovXG4gICAgc2V0Wm9vbSh6b29tOiBudW1iZXIsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICB0aGlzLmp1bXBUbyh7em9vbX0sIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFpvb21zIHRoZSBtYXAgdG8gdGhlIHNwZWNpZmllZCB6b29tIGxldmVsLCB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB6b29tIFRoZSB6b29tIGxldmVsIHRvIHRyYW5zaXRpb24gdG8uXG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zIHwgbnVsbH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21lbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gWm9vbSB0byB0aGUgem9vbSBsZXZlbCA1IHdpdGhvdXQgYW4gYW5pbWF0ZWQgdHJhbnNpdGlvblxuICAgICAqIG1hcC56b29tVG8oNSk7XG4gICAgICogLy8gWm9vbSB0byB0aGUgem9vbSBsZXZlbCA4IHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvblxuICAgICAqIG1hcC56b29tVG8oOCwge1xuICAgICAqICAgICBkdXJhdGlvbjogMjAwMCxcbiAgICAgKiAgICAgb2Zmc2V0OiBbMTAwLCA1MF1cbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB6b29tVG8oem9vbTogbnVtYmVyLCBvcHRpb25zOiA/IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lYXNlVG8oZXh0ZW5kKHtcbiAgICAgICAgICAgIHpvb21cbiAgICAgICAgfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5jcmVhc2VzIHRoZSBtYXAncyB6b29tIGxldmVsIGJ5IDEuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9ucyB8IG51bGx9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBudWxsfSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHpvb20gdGhlIG1hcCBpbiBvbmUgbGV2ZWwgd2l0aCBhIGN1c3RvbSBhbmltYXRpb24gZHVyYXRpb25cbiAgICAgKiBtYXAuem9vbUluKHtkdXJhdGlvbjogMTAwMH0pO1xuICAgICAqL1xuICAgIHpvb21JbihvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpICsgMSwgb3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVjcmVhc2VzIHRoZSBtYXAncyB6b29tIGxldmVsIGJ5IDEuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9ucyB8IG51bGx9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBudWxsfSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHpvb20gdGhlIG1hcCBvdXQgb25lIGxldmVsIHdpdGggYSBjdXN0b20gYW5pbWF0aW9uIG9mZnNldFxuICAgICAqIG1hcC56b29tT3V0KHtvZmZzZXQ6IFs4MCwgNjBdfSk7XG4gICAgICovXG4gICAgem9vbU91dChvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpIC0gMSwgb3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgY3VycmVudCBiZWFyaW5nLiBUaGUgYmVhcmluZyBpcyB0aGUgY29tcGFzcyBkaXJlY3Rpb24gdGhhdCBpcyBcInVwXCI7IGZvciBleGFtcGxlLCBhIGJlYXJpbmdcbiAgICAgKiBvZiA5MMKwIG9yaWVudHMgdGhlIG1hcCBzbyB0aGF0IGVhc3QgaXMgdXAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBtYXAncyBjdXJyZW50IGJlYXJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBiZWFyaW5nID0gbWFwLmdldEJlYXJpbmcoKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBOYXZpZ2F0ZSB0aGUgbWFwIHdpdGggZ2FtZS1saWtlIGNvbnRyb2xzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dhbWUtY29udHJvbHMvKVxuICAgICAqL1xuICAgIGdldEJlYXJpbmcoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmJlYXJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwJ3MgYmVhcmluZyAocm90YXRpb24pLiBUaGUgYmVhcmluZyBpcyB0aGUgY29tcGFzcyBkaXJlY3Rpb24gdGhhdCBpcyBcInVwXCI7IGZvciBleGFtcGxlLCBhIGJlYXJpbmdcbiAgICAgKiBvZiA5MMKwIG9yaWVudHMgdGhlIG1hcCBzbyB0aGF0IGVhc3QgaXMgdXAuXG4gICAgICpcbiAgICAgKiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe2JlYXJpbmc6IGJlYXJpbmd9KWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiZWFyaW5nIFRoZSBkZXNpcmVkIGJlYXJpbmcuXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBudWxsfSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBSb3RhdGUgdGhlIG1hcCB0byA5MCBkZWdyZWVzLlxuICAgICAqIG1hcC5zZXRCZWFyaW5nKDkwKTtcbiAgICAgKi9cbiAgICBzZXRCZWFyaW5nKGJlYXJpbmc6IG51bWJlciwgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHtiZWFyaW5nfSwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwYWRkaW5nIGFwcGxpZWQgYXJvdW5kIHRoZSBtYXAgdmlld3BvcnQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtQYWRkaW5nT3B0aW9uc30gVGhlIGN1cnJlbnQgcGFkZGluZyBhcm91bmQgdGhlIG1hcCB2aWV3cG9ydC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHBhZGRpbmcgPSBtYXAuZ2V0UGFkZGluZygpO1xuICAgICAqL1xuICAgIGdldFBhZGRpbmcoKTogUGFkZGluZ09wdGlvbnMgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucGFkZGluZzsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcGFkZGluZyBpbiBwaXhlbHMgYXJvdW5kIHRoZSB2aWV3cG9ydC5cbiAgICAgKlxuICAgICAqIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7cGFkZGluZzogcGFkZGluZ30pYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtQYWRkaW5nT3B0aW9uc30gcGFkZGluZyBUaGUgZGVzaXJlZCBwYWRkaW5nLiBGb3JtYXQ6IHtsZWZ0OiBudW1iZXIsIHJpZ2h0OiBudW1iZXIsIHRvcDogbnVtYmVyLCBib3R0b206IG51bWJlcn0uXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBudWxsfSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBTZXRzIGEgbGVmdCBwYWRkaW5nIG9mIDMwMHB4LCBhbmQgYSB0b3AgcGFkZGluZyBvZiA1MHB4XG4gICAgICogbWFwLnNldFBhZGRpbmcoe2xlZnQ6IDMwMCwgdG9wOiA1MH0pO1xuICAgICAqL1xuICAgIHNldFBhZGRpbmcocGFkZGluZzogUGFkZGluZ09wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICB0aGlzLmp1bXBUbyh7cGFkZGluZ30sIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZXMgdGhlIG1hcCB0byB0aGUgc3BlY2lmaWVkIGJlYXJpbmcsIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi4gVGhlIGJlYXJpbmcgaXMgdGhlIGNvbXBhc3MgZGlyZWN0aW9uXG4gICAgICogdGhhdCBpcyBcXFwidXBcXFwiOyBmb3IgZXhhbXBsZSwgYSBiZWFyaW5nIG9mIDkwwrAgb3JpZW50cyB0aGUgbWFwIHNvIHRoYXQgZWFzdCBpcyB1cC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgVGhlIGRlc2lyZWQgYmVhcmluZy5cbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnMgfCBudWxsfSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnJvdGF0ZVRvKDMwKTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHJvdGF0ZVRvIHdpdGggYW4gYW5pbWF0aW9uIG9mIDIgc2Vjb25kcy5cbiAgICAgKiBtYXAucm90YXRlVG8oMzAsIHtkdXJhdGlvbjogMjAwMH0pO1xuICAgICAqL1xuICAgIHJvdGF0ZVRvKGJlYXJpbmc6IG51bWJlciwgb3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lYXNlVG8oZXh0ZW5kKHtcbiAgICAgICAgICAgIGJlYXJpbmdcbiAgICAgICAgfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm90YXRlcyB0aGUgbWFwIHNvIHRoYXQgbm9ydGggaXMgdXAgKDDCsCBiZWFyaW5nKSwgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnMgfCBudWxsfSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gcmVzZXROb3J0aCB3aXRoIGFuIGFuaW1hdGlvbiBvZiAyIHNlY29uZHMuXG4gICAgICogbWFwLnJlc2V0Tm9ydGgoe2R1cmF0aW9uOiAyMDAwfSk7XG4gICAgICovXG4gICAgcmVzZXROb3J0aChvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMucm90YXRlVG8oMCwgZXh0ZW5kKHtkdXJhdGlvbjogMTAwMH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGVzIGFuZCBwaXRjaGVzIHRoZSBtYXAgc28gdGhhdCBub3J0aCBpcyB1cCAoMMKwIGJlYXJpbmcpIGFuZCBwaXRjaCBpcyAwwrAsIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zIHwgbnVsbH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHJlc2V0Tm9ydGhQaXRjaCB3aXRoIGFuIGFuaW1hdGlvbiBvZiAyIHNlY29uZHMuXG4gICAgICogbWFwLnJlc2V0Tm9ydGhQaXRjaCh7ZHVyYXRpb246IDIwMDB9KTtcbiAgICAgKi9cbiAgICByZXNldE5vcnRoUGl0Y2gob3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICB0aGlzLmVhc2VUbyhleHRlbmQoe1xuICAgICAgICAgICAgYmVhcmluZzogMCxcbiAgICAgICAgICAgIHBpdGNoOiAwLFxuICAgICAgICAgICAgZHVyYXRpb246IDEwMDBcbiAgICAgICAgfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNuYXBzIHRoZSBtYXAgc28gdGhhdCBub3J0aCBpcyB1cCAoMMKwIGJlYXJpbmcpLCBpZiB0aGUgY3VycmVudCBiZWFyaW5nIGlzXG4gICAgICogY2xvc2UgZW5vdWdoIHRvIGl0ICh3aXRoaW4gdGhlIGBiZWFyaW5nU25hcGAgdGhyZXNob2xkKS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zIHwgbnVsbH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHNuYXBUb05vcnRoIHdpdGggYW4gYW5pbWF0aW9uIG9mIDIgc2Vjb25kcy5cbiAgICAgKiBtYXAuc25hcFRvTm9ydGgoe2R1cmF0aW9uOiAyMDAwfSk7XG4gICAgICovXG4gICAgc25hcFRvTm9ydGgob3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5nZXRCZWFyaW5nKCkpIDwgdGhpcy5fYmVhcmluZ1NuYXApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2V0Tm9ydGgob3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjdXJyZW50IFtwaXRjaF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEvKSAodGlsdCkuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBtYXAncyBjdXJyZW50IHBpdGNoLCBtZWFzdXJlZCBpbiBkZWdyZWVzIGF3YXkgZnJvbSB0aGUgcGxhbmUgb2YgdGhlIHNjcmVlbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHBpdGNoID0gbWFwLmdldFBpdGNoKCk7XG4gICAgICovXG4gICAgZ2V0UGl0Y2goKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBpdGNoOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAncyBbcGl0Y2hdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3NhcnkvY2FtZXJhLykgKHRpbHQpLiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe3BpdGNoOiBwaXRjaH0pYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBpdGNoIFRoZSBwaXRjaCB0byBzZXQsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuICgwLTYwKS5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6cGl0Y2hzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHNldFBpdGNoIHdpdGggYW4gYW5pbWF0aW9uIG9mIDIgc2Vjb25kcy5cbiAgICAgKiBtYXAuc2V0UGl0Y2goODAsIHtkdXJhdGlvbjogMjAwMH0pO1xuICAgICAqL1xuICAgIHNldFBpdGNoKHBpdGNoOiBudW1iZXIsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICB0aGlzLmp1bXBUbyh7cGl0Y2h9LCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIENhbWVyYU9wdGlvbnN9IG9iamVjdCBmb3IgdGhlIGhpZ2hlc3Qgem9vbSBsZXZlbFxuICAgICAqIHVwIHRvIGFuZCBpbmNsdWRpbmcgYE1hcCNnZXRNYXhab29tKClgIHRoYXQgZml0cyB0aGUgYm91bmRzXG4gICAgICogaW4gdGhlIHZpZXdwb3J0IGF0IHRoZSBzcGVjaWZpZWQgYmVhcmluZy5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtMbmdMYXRCb3VuZHNMaWtlfSBib3VuZHMgQ2FsY3VsYXRlIHRoZSBjZW50ZXIgZm9yIHRoZXNlIGJvdW5kcyBpbiB0aGUgdmlld3BvcnQgYW5kIHVzZVxuICAgICAqICAgICAgdGhlIGhpZ2hlc3Qgem9vbSBsZXZlbCB1cCB0byBhbmQgaW5jbHVkaW5nIGBNYXAjZ2V0TWF4Wm9vbSgpYCB0aGF0IGZpdHNcbiAgICAgKiAgICAgIGluIHRoZSB2aWV3cG9ydC4gTG5nTGF0Qm91bmRzIHJlcHJlc2VudCBhIGJveCB0aGF0IGlzIGFsd2F5cyBheGlzLWFsaWduZWQgd2l0aCBiZWFyaW5nIDAuXG4gICAgICogQHBhcmFtIHtDYW1lcmFPcHRpb25zIHwgbnVsbH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlciB8IFBhZGRpbmdPcHRpb25zfSBbb3B0aW9ucy5wYWRkaW5nXSBUaGUgYW1vdW50IG9mIHBhZGRpbmcgaW4gcGl4ZWxzIHRvIGFkZCB0byB0aGUgZ2l2ZW4gYm91bmRzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5iZWFyaW5nPTBdIERlc2lyZWQgbWFwIGJlYXJpbmcgYXQgZW5kIG9mIGFuaW1hdGlvbiwgaW4gZGVncmVlcy5cbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gW29wdGlvbnMub2Zmc2V0PVswLCAwXV0gVGhlIGNlbnRlciBvZiB0aGUgZ2l2ZW4gYm91bmRzIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBjZW50ZXIsIG1lYXN1cmVkIGluIHBpeGVscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4Wm9vbV0gVGhlIG1heGltdW0gem9vbSBsZXZlbCB0byBhbGxvdyB3aGVuIHRoZSBjYW1lcmEgd291bGQgdHJhbnNpdGlvbiB0byB0aGUgc3BlY2lmaWVkIGJvdW5kcy5cbiAgICAgKiBAcmV0dXJucyB7Q2FtZXJhT3B0aW9ucyB8IHZvaWR9IElmIG1hcCBpcyBhYmxlIHRvIGZpdCB0byBwcm92aWRlZCBib3VuZHMsIHJldHVybnMgYENhbWVyYU9wdGlvbnNgIHdpdGhcbiAgICAgKiAgICAgIGBjZW50ZXJgLCBgem9vbWAsIGFuZCBgYmVhcmluZ2AuIElmIG1hcCBpcyB1bmFibGUgdG8gZml0LCBtZXRob2Qgd2lsbCB3YXJuIGFuZCByZXR1cm4gdW5kZWZpbmVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgYmJveCA9IFtbLTc5LCA0M10sIFstNzMsIDQ1XV07XG4gICAgICogY29uc3QgbmV3Q2FtZXJhVHJhbnNmb3JtID0gbWFwLmNhbWVyYUZvckJvdW5kcyhiYm94LCB7XG4gICAgICogICAgIHBhZGRpbmc6IHt0b3A6IDEwLCBib3R0b206MjUsIGxlZnQ6IDE1LCByaWdodDogNX1cbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBjYW1lcmFGb3JCb3VuZHMoYm91bmRzOiBMbmdMYXRCb3VuZHNMaWtlLCBvcHRpb25zPzogQ2FtZXJhT3B0aW9ucyk6IHZvaWQgfCBDYW1lcmFPcHRpb25zICYgQW5pbWF0aW9uT3B0aW9ucyB7XG4gICAgICAgIGJvdW5kcyA9IExuZ0xhdEJvdW5kcy5jb252ZXJ0KGJvdW5kcyk7XG4gICAgICAgIGNvbnN0IGJlYXJpbmcgPSBvcHRpb25zICYmIG9wdGlvbnMuYmVhcmluZyB8fCAwO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FtZXJhRm9yQm94QW5kQmVhcmluZyhib3VuZHMuZ2V0Tm9ydGhXZXN0KCksIGJvdW5kcy5nZXRTb3V0aEVhc3QoKSwgYmVhcmluZywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgX2V4dGVuZENhbWVyYU9wdGlvbnMob3B0aW9ucz86IENhbWVyYU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFBhZGRpbmcgPSB7XG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIGxlZnQ6IDBcbiAgICAgICAgfTtcbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgICAgICAgICBwYWRkaW5nOiBkZWZhdWx0UGFkZGluZyxcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucGFkZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBvcHRpb25zLnBhZGRpbmc7XG4gICAgICAgICAgICBvcHRpb25zLnBhZGRpbmcgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiBwLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogcCxcbiAgICAgICAgICAgICAgICByaWdodDogcCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMucGFkZGluZyA9IGV4dGVuZChkZWZhdWx0UGFkZGluZywgb3B0aW9ucy5wYWRkaW5nKTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBjZW50ZXIgb2YgdGhlc2UgdHdvIHBvaW50cyBpbiB0aGUgdmlld3BvcnQgYW5kIHVzZVxuICAgICAqIHRoZSBoaWdoZXN0IHpvb20gbGV2ZWwgdXAgdG8gYW5kIGluY2x1ZGluZyBgTWFwI2dldE1heFpvb20oKWAgdGhhdCBmaXRzXG4gICAgICogdGhlIHBvaW50cyBpbiB0aGUgdmlld3BvcnQgYXQgdGhlIHNwZWNpZmllZCBiZWFyaW5nLlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBwMCBGaXJzdCBwb2ludFxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gcDEgU2Vjb25kIHBvaW50XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgRGVzaXJlZCBtYXAgYmVhcmluZyBhdCBlbmQgb2YgYW5pbWF0aW9uLCBpbiBkZWdyZWVzXG4gICAgICogQHBhcmFtIHtDYW1lcmFPcHRpb25zIHwgbnVsbH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUGFkZGluZ09wdGlvbnN9IFtvcHRpb25zLnBhZGRpbmddIFRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgdG8gYWRkIHRvIHRoZSBnaXZlbiBib3VuZHMuXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IFtvcHRpb25zLm9mZnNldD1bMCwgMF1dIFRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIGJvdW5kcyByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgY2VudGVyLCBtZWFzdXJlZCBpbiBwaXhlbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFpvb21dIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgdG8gYWxsb3cgd2hlbiB0aGUgY2FtZXJhIHdvdWxkIHRyYW5zaXRpb24gdG8gdGhlIHNwZWNpZmllZCBib3VuZHMuXG4gICAgICogQHJldHVybnMge0NhbWVyYU9wdGlvbnMgfCB2b2lkfSBJZiBtYXAgaXMgYWJsZSB0byBmaXQgdG8gcHJvdmlkZWQgYm91bmRzLCByZXR1cm5zIGBDYW1lcmFPcHRpb25zYCB3aXRoXG4gICAgICogICAgICBgY2VudGVyYCwgYHpvb21gLCBhbmQgYGJlYXJpbmdgLiBJZiBtYXAgaXMgdW5hYmxlIHRvIGZpdCwgbWV0aG9kIHdpbGwgd2FybiBhbmQgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIHAwID0gWy03OSwgNDNdO1xuICAgICAqIHZhciBwMSA9IFstNzMsIDQ1XTtcbiAgICAgKiB2YXIgYmVhcmluZyA9IDkwO1xuICAgICAqIHZhciBuZXdDYW1lcmFUcmFuc2Zvcm0gPSBtYXAuX2NhbWVyYUZvckJveEFuZEJlYXJpbmcocDAsIHAxLCBiZWFyaW5nLCB7XG4gICAgICogICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XG4gICAgICogfSk7XG4gICAgICovXG4gICAgX2NhbWVyYUZvckJveEFuZEJlYXJpbmcocDA6IExuZ0xhdExpa2UsIHAxOiBMbmdMYXRMaWtlLCBiZWFyaW5nOiBudW1iZXIsIG9wdGlvbnM/OiBDYW1lcmFPcHRpb25zKTogdm9pZCB8IENhbWVyYU9wdGlvbnMgJiBBbmltYXRpb25PcHRpb25zIHtcbiAgICAgICAgY29uc3QgZU9wdGlvbnMgPSB0aGlzLl9leHRlbmRDYW1lcmFPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB0ciA9IHRoaXMudHJhbnNmb3JtO1xuICAgICAgICBjb25zdCBlZGdlUGFkZGluZyA9IHRyLnBhZGRpbmc7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0byBjYWxjdWxhdGUgdGhlIHVwcGVyIHJpZ2h0IGFuZCBsb3dlciBsZWZ0IG9mIHRoZSBib3ggZGVmaW5lZCBieSBwMCBhbmQgcDFcbiAgICAgICAgLy8gaW4gYSBjb29yZGluYXRlIHN5c3RlbSByb3RhdGUgdG8gbWF0Y2ggdGhlIGRlc3RpbmF0aW9uIGJlYXJpbmcuXG4gICAgICAgIGNvbnN0IHAwd29ybGQgPSB0ci5wcm9qZWN0KExuZ0xhdC5jb252ZXJ0KHAwKSk7XG4gICAgICAgIGNvbnN0IHAxd29ybGQgPSB0ci5wcm9qZWN0KExuZ0xhdC5jb252ZXJ0KHAxKSk7XG4gICAgICAgIGNvbnN0IHAwcm90YXRlZCA9IHAwd29ybGQucm90YXRlKC1kZWdUb1JhZChiZWFyaW5nKSk7XG4gICAgICAgIGNvbnN0IHAxcm90YXRlZCA9IHAxd29ybGQucm90YXRlKC1kZWdUb1JhZChiZWFyaW5nKSk7XG5cbiAgICAgICAgY29uc3QgdXBwZXJSaWdodCA9IG5ldyBQb2ludChNYXRoLm1heChwMHJvdGF0ZWQueCwgcDFyb3RhdGVkLngpLCBNYXRoLm1heChwMHJvdGF0ZWQueSwgcDFyb3RhdGVkLnkpKTtcbiAgICAgICAgY29uc3QgbG93ZXJMZWZ0ID0gbmV3IFBvaW50KE1hdGgubWluKHAwcm90YXRlZC54LCBwMXJvdGF0ZWQueCksIE1hdGgubWluKHAwcm90YXRlZC55LCBwMXJvdGF0ZWQueSkpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB6b29tOiBjb25zaWRlciB0aGUgb3JpZ2luYWwgYmJveCBhbmQgcGFkZGluZy5cbiAgICAgICAgY29uc3Qgc2l6ZSA9IHVwcGVyUmlnaHQuc3ViKGxvd2VyTGVmdCk7XG4gICAgICAgIGNvbnN0IHNjYWxlWCA9ICh0ci53aWR0aCAtIChlZGdlUGFkZGluZy5sZWZ0ICsgZWRnZVBhZGRpbmcucmlnaHQgKyBlT3B0aW9ucy5wYWRkaW5nLmxlZnQgKyBlT3B0aW9ucy5wYWRkaW5nLnJpZ2h0KSkgLyBzaXplLng7XG4gICAgICAgIGNvbnN0IHNjYWxlWSA9ICh0ci5oZWlnaHQgLSAoZWRnZVBhZGRpbmcudG9wICsgZWRnZVBhZGRpbmcuYm90dG9tICsgZU9wdGlvbnMucGFkZGluZy50b3AgKyBlT3B0aW9ucy5wYWRkaW5nLmJvdHRvbSkpIC8gc2l6ZS55O1xuXG4gICAgICAgIGlmIChzY2FsZVkgPCAwIHx8IHNjYWxlWCA8IDApIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKFxuICAgICAgICAgICAgICAgICdNYXAgY2Fubm90IGZpdCB3aXRoaW4gY2FudmFzIHdpdGggdGhlIGdpdmVuIGJvdW5kcywgcGFkZGluZywgYW5kL29yIG9mZnNldC4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvb20gPSBNYXRoLm1pbih0ci5zY2FsZVpvb20odHIuc2NhbGUgKiBNYXRoLm1pbihzY2FsZVgsIHNjYWxlWSkpLCBlT3B0aW9ucy5tYXhab29tKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgY2VudGVyOiBhcHBseSB0aGUgem9vbSwgdGhlIGNvbmZpZ3VyZWQgb2Zmc2V0LCBhcyB3ZWxsIGFzIG9mZnNldCB0aGF0IGV4aXN0cyBhcyBhIHJlc3VsdCBvZiBwYWRkaW5nLlxuICAgICAgICBjb25zdCBvZmZzZXQgPSAodHlwZW9mIGVPcHRpb25zLm9mZnNldC54ID09PSAnbnVtYmVyJykgPyBuZXcgUG9pbnQoZU9wdGlvbnMub2Zmc2V0LngsIGVPcHRpb25zLm9mZnNldC55KSA6IFBvaW50LmNvbnZlcnQoZU9wdGlvbnMub2Zmc2V0KTtcbiAgICAgICAgY29uc3QgcGFkZGluZ09mZnNldFggPSAoZU9wdGlvbnMucGFkZGluZy5sZWZ0IC0gZU9wdGlvbnMucGFkZGluZy5yaWdodCkgLyAyO1xuICAgICAgICBjb25zdCBwYWRkaW5nT2Zmc2V0WSA9IChlT3B0aW9ucy5wYWRkaW5nLnRvcCAtIGVPcHRpb25zLnBhZGRpbmcuYm90dG9tKSAvIDI7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdPZmZzZXQgPSBuZXcgUG9pbnQocGFkZGluZ09mZnNldFgsIHBhZGRpbmdPZmZzZXRZKTtcbiAgICAgICAgY29uc3Qgcm90YXRlZFBhZGRpbmdPZmZzZXQgPSBwYWRkaW5nT2Zmc2V0LnJvdGF0ZShiZWFyaW5nICogTWF0aC5QSSAvIDE4MCk7XG4gICAgICAgIGNvbnN0IG9mZnNldEF0SW5pdGlhbFpvb20gPSBvZmZzZXQuYWRkKHJvdGF0ZWRQYWRkaW5nT2Zmc2V0KTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0QXRGaW5hbFpvb20gPSBvZmZzZXRBdEluaXRpYWxab29tLm11bHQodHIuc2NhbGUgLyB0ci56b29tU2NhbGUoem9vbSkpO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlciA9ICB0ci51bnByb2plY3QocDB3b3JsZC5hZGQocDF3b3JsZCkuZGl2KDIpLnN1YihvZmZzZXRBdEZpbmFsWm9vbSkpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjZW50ZXIsXG4gICAgICAgICAgICB6b29tLFxuICAgICAgICAgICAgYmVhcmluZ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBiZXN0IGNhbWVyYSBmaXQgZm9yIHR3byBnaXZlbiB2aWV3cG9ydCBwb2ludCBjb29yZGluYXRlcy5cbiAgICAgKiBUaGUgbWV0aG9kIHdpbGwgaXRlcmF0aXZlbHkgcmF5IG1hcmNoIHRvd2FyZHMgdGhlIHRhcmdldCBhbmQgc3RvcHNcbiAgICAgKiB3aGVuIGFueSBvZiB0aGUgZ2l2ZW4gaW5wdXQgcG9pbnRzIGNvbGxpZGVzIHdpdGggdGhlIHZpZXcgZnJ1c3R1bS5cbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gcDAgRmlyc3QgcG9pbnRcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IHAxIFNlY29uZCBwb2ludFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5BbHRpdHVkZSBPcHRpb25hbCBtaW4gYWx0aXR1ZGUgaW4gbWV0ZXJzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heEFsdGl0dWRlIE9wdGlvbmFsIG1heCBhbHRpdHVkZSBpbiBtZXRlcnNcbiAgICAgKiBAcGFyYW0ge0NhbWVyYU9wdGlvbnMgfCBudWxsfSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBQYWRkaW5nT3B0aW9uc30gW29wdGlvbnMucGFkZGluZ10gVGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIHBpeGVscyB0byBhZGQgdG8gdGhlIGdpdmVuIGJvdW5kcy5cbiAgICAgKiBAcmV0dXJucyB7Q2FtZXJhT3B0aW9ucyB8IHZvaWR9IElmIG1hcCBpcyBhYmxlIHRvIGZpdCB0byBwcm92aWRlZCBib3VuZHMsIHJldHVybnMgYENhbWVyYU9wdGlvbnNgIHdpdGhcbiAgICAgKiAgICAgIGBjZW50ZXJgLCBgem9vbWAsIGBiZWFyaW5nYCBhbmQgYHBpdGNoYC4gSWYgbWFwIGlzIHVuYWJsZSB0byBmaXQsIG1ldGhvZCB3aWxsIHdhcm4gYW5kIHJldHVybiB1bmRlZmluZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2FtZXJhRm9yQm94KHAwOiBMbmdMYXRMaWtlLCBwMTogTG5nTGF0TGlrZSwgbWluQWx0aXR1ZGU/OiBudW1iZXIsIG1heEFsdGl0dWRlPzogbnVtYmVyLCBvcHRpb25zPzogQ2FtZXJhT3B0aW9ucyk6IHZvaWQgfCBDYW1lcmFPcHRpb25zICYgQW5pbWF0aW9uT3B0aW9ucyB7XG4gICAgICAgIGNvbnN0IGVPcHRpb25zID0gdGhpcy5fZXh0ZW5kQ2FtZXJhT3B0aW9ucyhvcHRpb25zKTtcblxuICAgICAgICBtaW5BbHRpdHVkZSA9IG1pbkFsdGl0dWRlIHx8IDA7XG4gICAgICAgIG1heEFsdGl0dWRlID0gbWF4QWx0aXR1ZGUgfHwgMDtcblxuICAgICAgICBwMCA9IExuZ0xhdC5jb252ZXJ0KHAwKTtcbiAgICAgICAgcDEgPSBMbmdMYXQuY29udmVydChwMSk7XG5cbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybS5jbG9uZSgpO1xuICAgICAgICB0ci5wYWRkaW5nID0gZU9wdGlvbnMucGFkZGluZztcblxuICAgICAgICBjb25zdCBjYW1lcmEgPSB0aGlzLmdldEZyZWVDYW1lcmFPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IGZvY3VzID0gbmV3IExuZ0xhdCgocDAubG5nICsgcDEubG5nKSAqIDAuNSwgKHAwLmxhdCArIHAxLmxhdCkgKiAwLjUpO1xuICAgICAgICBjb25zdCBmb2N1c0FsdGl0dWRlID0gKG1pbkFsdGl0dWRlICsgbWF4QWx0aXR1ZGUpICogMC41O1xuXG4gICAgICAgIGlmICh0ci5fY2FtZXJhLnBvc2l0aW9uWzJdIDwgbWVyY2F0b3JaZnJvbUFsdGl0dWRlKGZvY3VzQWx0aXR1ZGUsIGZvY3VzLmxhdCkpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKCdNYXAgY2Fubm90IGZpdCB3aXRoaW4gY2FudmFzIHdpdGggdGhlIGdpdmVuIGJvdW5kcywgcGFkZGluZywgYW5kL29yIG9mZnNldC4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbWVyYS5sb29rQXRQb2ludChmb2N1cyk7XG5cbiAgICAgICAgdHIuc2V0RnJlZUNhbWVyYU9wdGlvbnMoY2FtZXJhKTtcblxuICAgICAgICBjb25zdCBjb29yZDAgPSBNZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdChwMCk7XG4gICAgICAgIGNvbnN0IGNvb3JkMSA9IE1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KHAxKTtcblxuICAgICAgICBjb25zdCB0b1ZlYzMgPSAocDogTWVyY2F0b3JDb29yZGluYXRlKTogdmVjMyA9PiBbcC54LCBwLnksIHAuel07XG5cbiAgICAgICAgY29uc3QgY2VudGVySW50ZXJzZWN0aW9uUG9pbnQgPSB0ci5wb2ludFJheUludGVyc2VjdGlvbih0ci5jZW50ZXJQb2ludCwgZm9jdXNBbHRpdHVkZSk7XG4gICAgICAgIGNvbnN0IGNlbnRlckludGVyc2VjdGlvbkNvb3JkID0gdG9WZWMzKHRyLnJheUludGVyc2VjdGlvbkNvb3JkaW5hdGUoY2VudGVySW50ZXJzZWN0aW9uUG9pbnQpKTtcbiAgICAgICAgY29uc3QgY2VudGVyTWVyY2F0b3JSYXkgPSB0ci5zY3JlZW5Qb2ludFRvTWVyY2F0b3JSYXkodHIuY2VudGVyUG9pbnQpO1xuICAgICAgICBjb25zdCB6SW5NZXRlcnMgPSB0ci5wcm9qZWN0aW9uLm5hbWUgIT09ICdnbG9iZSc7XG5cbiAgICAgICAgY29uc3QgbWF4TWFyY2hpbmdTdGVwcyA9IDEwO1xuXG4gICAgICAgIGxldCBzdGVwcyA9IDA7XG4gICAgICAgIGxldCBoYWxmRGlzdGFuY2VUb0dyb3VuZDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY29uc3QgeiA9IE1hdGguZmxvb3IodHIuem9vbSk7XG4gICAgICAgICAgICBjb25zdCB6MiA9IDEgPDwgejtcblxuICAgICAgICAgICAgY29uc3QgbWluWCA9IE1hdGgubWluKHoyICogY29vcmQwLngsIHoyICogY29vcmQxLngpO1xuICAgICAgICAgICAgY29uc3QgbWluWSA9IE1hdGgubWluKHoyICogY29vcmQwLnksIHoyICogY29vcmQxLnkpO1xuICAgICAgICAgICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHoyICogY29vcmQwLngsIHoyICogY29vcmQxLngpO1xuICAgICAgICAgICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHoyICogY29vcmQwLnksIHoyICogY29vcmQxLnkpO1xuXG4gICAgICAgICAgICBjb25zdCBhYWJiID0gbmV3IEFhYmIoW21pblgsIG1pblksIG1pbkFsdGl0dWRlXSwgW21heFgsIG1heFksIG1heEFsdGl0dWRlXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZydXN0dW0gPSBGcnVzdHVtLmZyb21JbnZQcm9qZWN0aW9uTWF0cml4KHRyLmludlByb2pNYXRyaXgsIHRyLndvcmxkU2l6ZSwgeiwgekluTWV0ZXJzKTtcblxuICAgICAgICAgICAgLy8gU3RvcCBtYXJjaGluZyB3aGVuIGZydXN0dW0gaW50ZXJzZWN0aW9uXG4gICAgICAgICAgICAvLyByZXBvcnRzIGFueSBhYWJiIHBvaW50IG5vdCBmdWxseSBpbnNpZGVcbiAgICAgICAgICAgIGlmIChhYWJiLmludGVyc2VjdHMoZnJ1c3R1bSkgIT09IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBXZW50IHRvbyBmYXIsIHN0ZXAgb25lIGl0ZXJhdGlvbiBiYWNrXG4gICAgICAgICAgICAgICAgaWYgKGhhbGZEaXN0YW5jZVRvR3JvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyLl9jYW1lcmEucG9zaXRpb24gPSB2ZWMzLnNjYWxlQW5kQWRkKFtdLCB0ci5fY2FtZXJhLnBvc2l0aW9uLCBjZW50ZXJNZXJjYXRvclJheS5kaXIsIC1oYWxmRGlzdGFuY2VUb0dyb3VuZCk7XG4gICAgICAgICAgICAgICAgICAgIHRyLl91cGRhdGVTdGF0ZUZyb21DYW1lcmEoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNhbWVyYVBvc2l0aW9uVG9Hcm91bmQgPSB2ZWMzLnN1YihbXSwgdHIuX2NhbWVyYS5wb3NpdGlvbiwgY2VudGVySW50ZXJzZWN0aW9uQ29vcmQpO1xuICAgICAgICAgICAgaGFsZkRpc3RhbmNlVG9Hcm91bmQgPSAwLjUgKiB2ZWMzLmxlbmd0aChjYW1lcmFQb3NpdGlvblRvR3JvdW5kKTtcblxuICAgICAgICAgICAgLy8gTWFyY2ggdGhlIGNhbWVyYSBwb3NpdGlvbiBmb3J3YXJkIGJ5IGhhbGYgdGhlIGRpc3RhbmNlIHRvIHRoZSBncm91bmRcbiAgICAgICAgICAgIHRyLl9jYW1lcmEucG9zaXRpb24gPSB2ZWMzLnNjYWxlQW5kQWRkKFtdLCB0ci5fY2FtZXJhLnBvc2l0aW9uLCBjZW50ZXJNZXJjYXRvclJheS5kaXIsIGhhbGZEaXN0YW5jZVRvR3JvdW5kKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdHIuX3VwZGF0ZVN0YXRlRnJvbUNhbWVyYSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKCdNYXAgY2Fubm90IGZpdCB3aXRoaW4gY2FudmFzIHdpdGggdGhlIGdpdmVuIGJvdW5kcywgcGFkZGluZywgYW5kL29yIG9mZnNldC4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKCsrc3RlcHMgPCBtYXhNYXJjaGluZ1N0ZXBzKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2VudGVyOiB0ci5jZW50ZXIsXG4gICAgICAgICAgICB6b29tOiB0ci56b29tLFxuICAgICAgICAgICAgYmVhcmluZzogdHIuYmVhcmluZyxcbiAgICAgICAgICAgIHBpdGNoOiB0ci5waXRjaFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhbnMgYW5kIHpvb21zIHRoZSBtYXAgdG8gY29udGFpbiBpdHMgdmlzaWJsZSBhcmVhIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGdlb2dyYXBoaWNhbCBib3VuZHMuXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gcmVzZXQgdGhlIG1hcCdzIGJlYXJpbmcgdG8gMCBpZiBiZWFyaW5nIGlzIG5vbnplcm8uXG4gICAgICogSWYgYSBwYWRkaW5nIGlzIHNldCBvbiB0aGUgbWFwLCB0aGUgYm91bmRzIGFyZSBmaXQgdG8gdGhlIGluc2V0LlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IGJvdW5kcyBDZW50ZXIgdGhlc2UgYm91bmRzIGluIHRoZSB2aWV3cG9ydCBhbmQgdXNlIHRoZSBoaWdoZXN0XG4gICAgICogICAgICB6b29tIGxldmVsIHVwIHRvIGFuZCBpbmNsdWRpbmcgYE1hcCNnZXRNYXhab29tKClgIHRoYXQgZml0cyB0aGVtIGluIHRoZSB2aWV3cG9ydC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgc3VwcG9ydHMgYWxsIHByb3BlcnRpZXMgZnJvbSB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30gYW5kIHtAbGluayBDYW1lcmFPcHRpb25zfSBpbiBhZGRpdGlvbiB0byB0aGUgZmllbGRzIGJlbG93LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUGFkZGluZ09wdGlvbnN9IFtvcHRpb25zLnBhZGRpbmddIFRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgdG8gYWRkIHRvIHRoZSBnaXZlbiBib3VuZHMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5saW5lYXI9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCB0cmFuc2l0aW9ucyB1c2luZ1xuICAgICAqICAgICB7QGxpbmsgTWFwI2Vhc2VUb30uIElmIGBmYWxzZWAsIHRoZSBtYXAgdHJhbnNpdGlvbnMgdXNpbmcge0BsaW5rIE1hcCNmbHlUb30uIFNlZVxuICAgICAqICAgICB0aG9zZSBmdW5jdGlvbnMgYW5kIHtAbGluayBBbmltYXRpb25PcHRpb25zfSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9ucyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZWFzaW5nXSBBbiBlYXNpbmcgZnVuY3Rpb24gZm9yIHRoZSBhbmltYXRlZCB0cmFuc2l0aW9uLiBTZWUge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9LlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBbb3B0aW9ucy5vZmZzZXQ9WzAsIDBdXSBUaGUgY2VudGVyIG9mIHRoZSBnaXZlbiBib3VuZHMgcmVsYXRpdmUgdG8gdGhlIG1hcCdzIGNlbnRlciwgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tXSBUaGUgbWF4aW11bSB6b29tIGxldmVsIHRvIGFsbG93IHdoZW4gdGhlIG1hcCB2aWV3IHRyYW5zaXRpb25zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cblx0ICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBiYm94ID0gW1stNzksIDQzXSwgWy03MywgNDVdXTtcbiAgICAgKiBtYXAuZml0Qm91bmRzKGJib3gsIHtcbiAgICAgKiAgICAgcGFkZGluZzoge3RvcDogMTAsIGJvdHRvbToyNSwgbGVmdDogMTUsIHJpZ2h0OiA1fVxuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IEZpdCBhIG1hcCB0byBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maXRib3VuZHMvKVxuICAgICAqL1xuICAgIGZpdEJvdW5kcyhib3VuZHM6IExuZ0xhdEJvdW5kc0xpa2UsIG9wdGlvbnM/OiBBbmltYXRpb25PcHRpb25zICYgQ2FtZXJhT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maXRJbnRlcm5hbChcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhRm9yQm91bmRzKGJvdW5kcywgb3B0aW9ucyksXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICBfcmF5Y2FzdEVsZXZhdGlvbkJveChwb2ludDA6IFBvaW50LCBwb2ludDE6IFBvaW50KTogP0VsZXZhdGlvbkJveFJheWNhc3Qge1xuICAgICAgICBjb25zdCBlbGV2YXRpb24gPSB0aGlzLnRyYW5zZm9ybS5lbGV2YXRpb247XG5cbiAgICAgICAgaWYgKCFlbGV2YXRpb24pIHJldHVybjtcblxuICAgICAgICBjb25zdCBwb2ludDIgPSBuZXcgUG9pbnQocG9pbnQwLngsIHBvaW50MS55KTtcbiAgICAgICAgY29uc3QgcG9pbnQzID0gbmV3IFBvaW50KHBvaW50MS54LCBwb2ludDAueSk7XG5cbiAgICAgICAgY29uc3QgcjAgPSBlbGV2YXRpb24ucG9pbnRDb29yZGluYXRlKHBvaW50MCk7XG4gICAgICAgIGlmICghcjApIHJldHVybjtcbiAgICAgICAgY29uc3QgcjEgPSBlbGV2YXRpb24ucG9pbnRDb29yZGluYXRlKHBvaW50MSk7XG4gICAgICAgIGlmICghcjEpIHJldHVybjtcbiAgICAgICAgY29uc3QgcjIgPSBlbGV2YXRpb24ucG9pbnRDb29yZGluYXRlKHBvaW50Mik7XG4gICAgICAgIGlmICghcjIpIHJldHVybjtcbiAgICAgICAgY29uc3QgcjMgPSBlbGV2YXRpb24ucG9pbnRDb29yZGluYXRlKHBvaW50Myk7XG4gICAgICAgIGlmICghcjMpIHJldHVybjtcblxuICAgICAgICBjb25zdCBtMCA9IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUocjBbMF0sIHIwWzFdKS50b0xuZ0xhdCgpO1xuICAgICAgICBjb25zdCBtMSA9IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUocjFbMF0sIHIxWzFdKS50b0xuZ0xhdCgpO1xuICAgICAgICBjb25zdCBtMiA9IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUocjJbMF0sIHIyWzFdKS50b0xuZ0xhdCgpO1xuICAgICAgICBjb25zdCBtMyA9IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUocjNbMF0sIHIzWzFdKS50b0xuZ0xhdCgpO1xuXG4gICAgICAgIGNvbnN0IG1pbkxuZyA9IE1hdGgubWluKG0wLmxuZywgTWF0aC5taW4obTEubG5nLCBNYXRoLm1pbihtMi5sbmcsIG0zLmxuZykpKTtcbiAgICAgICAgY29uc3QgbWluTGF0ID0gTWF0aC5taW4obTAubGF0LCBNYXRoLm1pbihtMS5sYXQsIE1hdGgubWluKG0yLmxhdCwgbTMubGF0KSkpO1xuXG4gICAgICAgIGNvbnN0IG1heExuZyA9IE1hdGgubWF4KG0wLmxuZywgTWF0aC5tYXgobTEubG5nLCBNYXRoLm1heChtMi5sbmcsIG0zLmxuZykpKTtcbiAgICAgICAgY29uc3QgbWF4TGF0ID0gTWF0aC5tYXgobTAubGF0LCBNYXRoLm1heChtMS5sYXQsIE1hdGgubWF4KG0yLmxhdCwgbTMubGF0KSkpO1xuXG4gICAgICAgIGNvbnN0IG1pbkFsdGl0dWRlID0gTWF0aC5taW4ocjBbM10sIE1hdGgubWluKHIxWzNdLCBNYXRoLm1pbihyMlszXSwgcjNbM10pKSk7XG4gICAgICAgIGNvbnN0IG1heEFsdGl0dWRlID0gTWF0aC5tYXgocjBbM10sIE1hdGgubWF4KHIxWzNdLCBNYXRoLm1heChyMlszXSwgcjNbM10pKSk7XG5cbiAgICAgICAgY29uc3QgbWluTG5nTGF0ID0gbmV3IExuZ0xhdChtaW5MbmcsIG1pbkxhdCk7XG4gICAgICAgIGNvbnN0IG1heExuZ0xhdCA9IG5ldyBMbmdMYXQobWF4TG5nLCBtYXhMYXQpO1xuXG4gICAgICAgIHJldHVybiB7bWluTG5nTGF0LCBtYXhMbmdMYXQsIG1pbkFsdGl0dWRlLCBtYXhBbHRpdHVkZX07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFucywgcm90YXRlcyBhbmQgem9vbXMgdGhlIG1hcCB0byB0byBmaXQgdGhlIGJveCBtYWRlIGJ5IHBvaW50cyBwMCBhbmQgcDFcbiAgICAgKiBvbmNlIHRoZSBtYXAgaXMgcm90YXRlZCB0byB0aGUgc3BlY2lmaWVkIGJlYXJpbmcuIFRvIHpvb20gd2l0aG91dCByb3RhdGluZyxcbiAgICAgKiBwYXNzIGluIHRoZSBjdXJyZW50IG1hcCBiZWFyaW5nLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gcDAgRmlyc3QgcG9pbnQgb24gc2NyZWVuLCBpbiBwaXhlbCBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gcDEgU2Vjb25kIHBvaW50IG9uIHNjcmVlbiwgaW4gcGl4ZWwgY29vcmRpbmF0ZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgRGVzaXJlZCBtYXAgYmVhcmluZyBhdCBlbmQgb2YgYW5pbWF0aW9uLCBpbiBkZWdyZWVzLiBUaGlzIHZhbHVlIGlzIGlnbm9yZWQgaWYgdGhlIG1hcCBoYXMgbm9uLXplcm8gcGl0Y2guXG4gICAgICogQHBhcmFtIHtDYW1lcmFPcHRpb25zIHwgbnVsbH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlciB8IFBhZGRpbmdPcHRpb25zfSBbb3B0aW9ucy5wYWRkaW5nXSBUaGUgYW1vdW50IG9mIHBhZGRpbmcgaW4gcGl4ZWxzIHRvIGFkZCB0byB0aGUgZ2l2ZW4gYm91bmRzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGluZWFyPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZSBtYXAgdHJhbnNpdGlvbnMgdXNpbmdcbiAgICAgKiAgICAge0BsaW5rIE1hcCNlYXNlVG99LiBJZiBgZmFsc2VgLCB0aGUgbWFwIHRyYW5zaXRpb25zIHVzaW5nIHtAbGluayBNYXAjZmx5VG99LiBTZWVcbiAgICAgKiAgICAgdGhvc2UgZnVuY3Rpb25zIGFuZCB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30gZm9yIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmVhc2luZ10gQW4gZWFzaW5nIGZ1bmN0aW9uIGZvciB0aGUgYW5pbWF0ZWQgdHJhbnNpdGlvbi4gU2VlIHtAbGluayBBbmltYXRpb25PcHRpb25zfS5cbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gW29wdGlvbnMub2Zmc2V0PVswLCAwXV0gVGhlIGNlbnRlciBvZiB0aGUgZ2l2ZW4gYm91bmRzIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBjZW50ZXIsIG1lYXN1cmVkIGluIHBpeGVscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4Wm9vbV0gVGhlIG1heGltdW0gem9vbSBsZXZlbCB0byBhbGxvdyB3aGVuIHRoZSBtYXAgdmlldyB0cmFuc2l0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cblx0ICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBwMCA9IFsyMjAsIDQwMF07XG4gICAgICogY29uc3QgcDEgPSBbNTAwLCA5MDBdO1xuICAgICAqIG1hcC5maXRTY3JlZW5Db29yZGluYXRlcyhwMCwgcDEsIG1hcC5nZXRCZWFyaW5nKCksIHtcbiAgICAgKiAgICAgcGFkZGluZzoge3RvcDogMTAsIGJvdHRvbToyNSwgbGVmdDogMTUsIHJpZ2h0OiA1fVxuICAgICAqIH0pO1xuICAgICAqIEBzZWUgVXNlZCBieSB7QGxpbmsgQm94Wm9vbUhhbmRsZXJ9XG4gICAgICovXG4gICAgZml0U2NyZWVuQ29vcmRpbmF0ZXMocDA6IFBvaW50TGlrZSwgcDE6IFBvaW50TGlrZSwgYmVhcmluZzogbnVtYmVyLCBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucyAmIENhbWVyYU9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICBsZXQgbG5nTGF0MCwgbG5nTGF0MSwgbWluQWx0aXR1ZGUsIG1heEFsdGl0dWRlO1xuICAgICAgICBjb25zdCBwb2ludDAgPSBQb2ludC5jb252ZXJ0KHAwKTtcbiAgICAgICAgY29uc3QgcG9pbnQxID0gUG9pbnQuY29udmVydChwMSk7XG5cbiAgICAgICAgY29uc3QgcmF5Y2FzdCA9IHRoaXMuX3JheWNhc3RFbGV2YXRpb25Cb3gocG9pbnQwLCBwb2ludDEpO1xuXG4gICAgICAgIGlmICghcmF5Y2FzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtLmFueUNvcm5lck9mZkVkZ2UocG9pbnQwLCBwb2ludDEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxuZ0xhdDAgPSB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKHBvaW50MCk7XG4gICAgICAgICAgICBsbmdMYXQxID0gdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihwb2ludDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG5nTGF0MCA9IHJheWNhc3QubWluTG5nTGF0O1xuICAgICAgICAgICAgbG5nTGF0MSA9IHJheWNhc3QubWF4TG5nTGF0O1xuICAgICAgICAgICAgbWluQWx0aXR1ZGUgPSByYXljYXN0Lm1pbkFsdGl0dWRlO1xuICAgICAgICAgICAgbWF4QWx0aXR1ZGUgPSByYXljYXN0Lm1heEFsdGl0dWRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtLnBpdGNoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZml0SW50ZXJuYWwoXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FtZXJhRm9yQm94QW5kQmVhcmluZyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihQb2ludC5jb252ZXJ0KHAwKSksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24oUG9pbnQuY29udmVydChwMSkpLFxuICAgICAgICAgICAgICAgICAgICBiZWFyaW5nLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZml0SW50ZXJuYWwoXG4gICAgICAgICAgICB0aGlzLl9jYW1lcmFGb3JCb3goXG4gICAgICAgICAgICAgICAgbG5nTGF0MCxcbiAgICAgICAgICAgICAgICBsbmdMYXQxLFxuICAgICAgICAgICAgICAgIG1pbkFsdGl0dWRlLFxuICAgICAgICAgICAgICAgIG1heEFsdGl0dWRlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMpLFxuICAgICAgICAgICAgb3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICBfZml0SW50ZXJuYWwoY2FsY3VsYXRlZE9wdGlvbnM/OiBDYW1lcmFPcHRpb25zICYgQW5pbWF0aW9uT3B0aW9ucywgb3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMgJiBDYW1lcmFPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgLy8gY2FtZXJhRm9yQm91bmRzIHdhcm5zICsgcmV0dXJucyB1bmRlZmluZWQgaWYgdW5hYmxlIHRvIGZpdDpcbiAgICAgICAgaWYgKCFjYWxjdWxhdGVkT3B0aW9ucykgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZChjYWxjdWxhdGVkT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgcmVtb3ZlIHRoZSBwYWRkaW5nIGZpZWxkIGJlY2F1c2UsIGNhbGN1bGF0ZWRPcHRpb25zIGFscmVhZHkgYWNjb3VudHMgZm9yIHBhZGRpbmcgYnkgc2V0dGluZyB6b29tIGFuZCBjZW50ZXIgYWNjb3JkaW5nbHkuXG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLnBhZGRpbmc7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubGluZWFyID9cbiAgICAgICAgICAgIHRoaXMuZWFzZVRvKG9wdGlvbnMsIGV2ZW50RGF0YSkgOlxuICAgICAgICAgICAgdGhpcy5mbHlUbyhvcHRpb25zLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW55IGNvbWJpbmF0aW9uIG9mIGNlbnRlciwgem9vbSwgYmVhcmluZywgYW5kIHBpdGNoLCB3aXRob3V0XG4gICAgICogYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi4gVGhlIG1hcCB3aWxsIHJldGFpbiBpdHMgY3VycmVudCB2YWx1ZXMgZm9yIGFueVxuICAgICAqIGRldGFpbHMgbm90IHNwZWNpZmllZCBpbiBgb3B0aW9uc2AuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7Q2FtZXJhT3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnJvdGF0ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6cGl0Y2hcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21lbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIGp1bXAgdG8gY29vcmRpbmF0ZXMgYXQgY3VycmVudCB6b29tXG4gICAgICogbWFwLmp1bXBUbyh7Y2VudGVyOiBbMCwgMF19KTtcbiAgICAgKiAvLyBqdW1wIHdpdGggem9vbSwgcGl0Y2gsIGFuZCBiZWFyaW5nIG9wdGlvbnNcbiAgICAgKiBtYXAuanVtcFRvKHtcbiAgICAgKiAgICAgY2VudGVyOiBbMCwgMF0sXG4gICAgICogICAgIHpvb206IDgsXG4gICAgICogICAgIHBpdGNoOiA0NSxcbiAgICAgKiAgICAgYmVhcmluZzogOTBcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBKdW1wIHRvIGEgc2VyaWVzIG9mIGxvY2F0aW9uc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvanVtcC10by8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogVXBkYXRlIGEgZmVhdHVyZSBpbiByZWFsdGltZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbGl2ZS11cGRhdGUtZmVhdHVyZS8pXG4gICAgICovXG4gICAganVtcFRvKG9wdGlvbnM6IENhbWVyYU9wdGlvbnMgJiB7cHJlbG9hZE9ubHk/OiBib29sZWFufSwgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIGNvbnN0IHRyID0gb3B0aW9ucy5wcmVsb2FkT25seSA/IHRoaXMudHJhbnNmb3JtLmNsb25lKCkgOiB0aGlzLnRyYW5zZm9ybTtcbiAgICAgICAgbGV0IHpvb21DaGFuZ2VkID0gZmFsc2UsXG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IGZhbHNlLFxuICAgICAgICAgICAgcGl0Y2hDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCd6b29tJyBpbiBvcHRpb25zICYmIHRyLnpvb20gIT09ICtvcHRpb25zLnpvb20pIHtcbiAgICAgICAgICAgIHpvb21DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyLnpvb20gPSArb3B0aW9ucy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuY2VudGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRyLmNlbnRlciA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuY2VudGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnYmVhcmluZycgaW4gb3B0aW9ucyAmJiB0ci5iZWFyaW5nICE9PSArb3B0aW9ucy5iZWFyaW5nKSB7XG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0ci5iZWFyaW5nID0gK29wdGlvbnMuYmVhcmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgncGl0Y2gnIGluIG9wdGlvbnMgJiYgdHIucGl0Y2ggIT09ICtvcHRpb25zLnBpdGNoKSB7XG4gICAgICAgICAgICBwaXRjaENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHIucGl0Y2ggPSArb3B0aW9ucy5waXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBhZGRpbmcgIT0gbnVsbCAmJiAhdHIuaXNQYWRkaW5nRXF1YWwob3B0aW9ucy5wYWRkaW5nKSkge1xuICAgICAgICAgICAgdHIucGFkZGluZyA9IG9wdGlvbnMucGFkZGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnByZWxvYWRPbmx5KSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVsb2FkVGlsZXModHIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3Zlc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdtb3ZlJywgZXZlbnREYXRhKSk7XG5cbiAgICAgICAgaWYgKHpvb21DaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd6b29tc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgnem9vbScsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCd6b29tZW5kJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmVhcmluZ0NoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZXN0YXJ0JywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZScsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdyb3RhdGVlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwaXRjaENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3BpdGNoc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2gnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2hlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3ZlZW5kJywgZXZlbnREYXRhKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBwb3NpdGlvbiBhbmQgb3JpZW50YXRpb24gb2YgdGhlIGNhbWVyYSBlbnRpdHkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBwcm9qZWN0aW9ucyBvdGhlciB0aGFuIG1lcmNhdG9yLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyB7RnJlZUNhbWVyYU9wdGlvbnN9IFRoZSBjYW1lcmEgc3RhdGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBjYW1lcmEgPSBtYXAuZ2V0RnJlZUNhbWVyYU9wdGlvbnMoKTtcbiAgICAgKlxuICAgICAqIGNvbnN0IHBvc2l0aW9uID0gWzEzOC43MjY0OSwgMzUuMzM5NzRdO1xuICAgICAqIGNvbnN0IGFsdGl0dWRlID0gMzAwMDtcbiAgICAgKlxuICAgICAqIGNhbWVyYS5wb3NpdGlvbiA9IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KHBvc2l0aW9uLCBhbHRpdHVkZSk7XG4gICAgICogY2FtZXJhLmxvb2tBdFBvaW50KFsxMzguNzMwMzYsIDM1LjM2MTk3XSk7XG4gICAgICpcbiAgICAgKiBtYXAuc2V0RnJlZUNhbWVyYU9wdGlvbnMoY2FtZXJhKTtcbiAgICAgKi9cbiAgICBnZXRGcmVlQ2FtZXJhT3B0aW9ucygpOiBGcmVlQ2FtZXJhT3B0aW9ucyB7XG4gICAgICAgIGlmICghdGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbi5zdXBwb3J0c0ZyZWVDYW1lcmEpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGZyZWVDYW1lcmFOb3RTdXBwb3J0ZWRXYXJuaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0uZ2V0RnJlZUNhbWVyYU9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgRnJlZUNhbWVyYU9wdGlvbnNgIHByb3ZpZGVzIG1vcmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBjYW1lcmEgZW50aXR5LlxuICAgICAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB0aGUgc3RhdGUgc2V0IHVzaW5nIHRoaXMgQVBJIG11c3QgYmUgcmVwcmVzZW50YWJsZSB3aXRoXG4gICAgICogYENhbWVyYU9wdGlvbnNgIGFzIHdlbGwuIFBhcmFtZXRlcnMgYXJlIGNsYW1wZWQgaW50byBhIHZhbGlkIHJhbmdlIG9yIGRpc2NhcmRlZCBhcyBpbnZhbGlkXG4gICAgICogaWYgdGhlIGNvbnZlcnNpb24gdG8gdGhlIHBpdGNoIGFuZCBiZWFyaW5nIHByZXNlbnRhdGlvbiBpcyBhbWJpZ3VvdXMuIEZvciBleGFtcGxlIG9yaWVudGF0aW9uXG4gICAgICogY2FuIGJlIGludmFsaWQgaWYgaXQgbGVhZHMgdG8gdGhlIGNhbWVyYSBiZWluZyB1cHNpZGUgZG93biwgdGhlIHF1YXRlcm5pb24gaGFzIHplcm8gbGVuZ3RoLFxuICAgICAqIG9yIHRoZSBwaXRjaCBpcyBvdmVyIHRoZSBtYXhpbXVtIHBpdGNoIGxpbWl0LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBmb3IgcHJvamVjdGlvbnMgb3RoZXIgdGhhbiBtZXJjYXRvci5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtGcmVlQ2FtZXJhT3B0aW9uc30gb3B0aW9ucyBgRnJlZUNhbWVyYU9wdGlvbnNgIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnJvdGF0ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6cGl0Y2hcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21lbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhbWVyYSA9IG1hcC5nZXRGcmVlQ2FtZXJhT3B0aW9ucygpO1xuICAgICAqXG4gICAgICogY29uc3QgcG9zaXRpb24gPSBbMTM4LjcyNjQ5LCAzNS4zMzk3NF07XG4gICAgICogY29uc3QgYWx0aXR1ZGUgPSAzMDAwO1xuICAgICAqXG4gICAgICogY2FtZXJhLnBvc2l0aW9uID0gbWFwYm94Z2wuTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQocG9zaXRpb24sIGFsdGl0dWRlKTtcbiAgICAgKiBjYW1lcmEubG9va0F0UG9pbnQoWzEzOC43MzAzNiwgMzUuMzYxOTddKTtcbiAgICAgKlxuICAgICAqIG1hcC5zZXRGcmVlQ2FtZXJhT3B0aW9ucyhjYW1lcmEpO1xuICAgICAqL1xuICAgIHNldEZyZWVDYW1lcmFPcHRpb25zKG9wdGlvbnM6IEZyZWVDYW1lcmFPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybTtcblxuICAgICAgICBpZiAoIXRyLnByb2plY3Rpb24uc3VwcG9ydHNGcmVlQ2FtZXJhKSB7XG4gICAgICAgICAgICB3YXJuT25jZShmcmVlQ2FtZXJhTm90U3VwcG9ydGVkV2FybmluZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0b3AoKTtcblxuICAgICAgICBjb25zdCBwcmV2Wm9vbSA9IHRyLnpvb207XG4gICAgICAgIGNvbnN0IHByZXZQaXRjaCA9IHRyLnBpdGNoO1xuICAgICAgICBjb25zdCBwcmV2QmVhcmluZyA9IHRyLmJlYXJpbmc7XG5cbiAgICAgICAgdHIuc2V0RnJlZUNhbWVyYU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3Qgem9vbUNoYW5nZWQgPSBwcmV2Wm9vbSAhPT0gdHIuem9vbTtcbiAgICAgICAgY29uc3QgcGl0Y2hDaGFuZ2VkID0gcHJldlBpdGNoICE9PSB0ci5waXRjaDtcbiAgICAgICAgY29uc3QgYmVhcmluZ0NoYW5nZWQgPSBwcmV2QmVhcmluZyAhPT0gdHIuYmVhcmluZztcblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3Zlc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdtb3ZlJywgZXZlbnREYXRhKSk7XG5cbiAgICAgICAgaWYgKHpvb21DaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd6b29tc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgnem9vbScsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCd6b29tZW5kJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmVhcmluZ0NoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZXN0YXJ0JywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZScsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdyb3RhdGVlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwaXRjaENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3BpdGNoc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2gnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2hlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmVlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbnkgY29tYmluYXRpb24gb2YgYGNlbnRlcmAsIGB6b29tYCwgYGJlYXJpbmdgLCBgcGl0Y2hgLCBhbmQgYHBhZGRpbmdgIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvblxuICAgICAqIGJldHdlZW4gb2xkIGFuZCBuZXcgdmFsdWVzLiBUaGUgbWFwIHdpbGwgcmV0YWluIGl0cyBjdXJyZW50IHZhbHVlcyBmb3IgYW55XG4gICAgICogZGV0YWlscyBub3Qgc3BlY2lmaWVkIGluIGBvcHRpb25zYC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoZSB0cmFuc2l0aW9uIHdpbGwgaGFwcGVuIGluc3RhbnRseSBpZiB0aGUgdXNlciBoYXMgZW5hYmxlZFxuICAgICAqIHRoZSBgcmVkdWNlZCBtb3Rpb25gIGFjY2Vzc2liaWxpdHkgZmVhdHVyZSBlbmFibGVkIGluIHRoZWlyIG9wZXJhdGluZyBzeXN0ZW0sXG4gICAgICogdW5sZXNzIGBvcHRpb25zYCBpbmNsdWRlcyBgZXNzZW50aWFsOiB0cnVlYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtDYW1lcmFPcHRpb25zICYgQW5pbWF0aW9uT3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIGRlc2NyaWJpbmcgdGhlIGRlc3RpbmF0aW9uIGFuZCBhbmltYXRpb24gb2YgdGhlIHRyYW5zaXRpb24uXG4gICAgICogICAgICAgICAgICBBY2NlcHRzIHtAbGluayBDYW1lcmFPcHRpb25zfSBhbmQge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21zdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6cGl0Y2hzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6cm90YXRlXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDpwaXRjaFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZWVuZFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbWVuZFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6cGl0Y2hlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2AgUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEVhc2Ugd2l0aCBkZWZhdWx0IG9wdGlvbnMgdG8gbnVsbCBpc2xhbmQgZm9yIDUgc2Vjb25kcy5cbiAgICAgKiBtYXAuZWFzZVRvKHtjZW50ZXI6IFswLCAwXSwgem9vbTogOSwgZHVyYXRpb246IDUwMDB9KTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFVzaW5nIGVhc2VUbyBvcHRpb25zLlxuICAgICAqIG1hcC5lYXNlVG8oe1xuICAgICAqICAgICBjZW50ZXI6IFswLCAwXSxcbiAgICAgKiAgICAgem9vbTogOSxcbiAgICAgKiAgICAgc3BlZWQ6IDAuMixcbiAgICAgKiAgICAgY3VydmU6IDEsXG4gICAgICogICAgIGR1cmF0aW9uOiA1MDAwLFxuICAgICAqICAgICBlYXNpbmcodCkge1xuICAgICAqICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBOYXZpZ2F0ZSB0aGUgbWFwIHdpdGggZ2FtZS1saWtlIGNvbnRyb2xzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dhbWUtY29udHJvbHMvKVxuICAgICAqL1xuICAgIGVhc2VUbyhvcHRpb25zOiBDYW1lcmFPcHRpb25zICYgQW5pbWF0aW9uT3B0aW9ucyAmIHtlYXNlSWQ/OiBzdHJpbmcsIHByZWxvYWRPbmx5PzogYm9vbGVhbn0sIGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICB0aGlzLl9zdG9wKGZhbHNlLCBvcHRpb25zLmVhc2VJZCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgICAgICAgICBvZmZzZXQ6IFswLCAwXSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICBlYXNpbmc6IGRlZmF1bHRFYXNpbmdcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UgfHwgKCFvcHRpb25zLmVzc2VudGlhbCAmJiBicm93c2VyLnByZWZlcnNSZWR1Y2VkTW90aW9uKSkgb3B0aW9ucy5kdXJhdGlvbiA9IDA7XG5cbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIHN0YXJ0Wm9vbSA9IHRoaXMuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgc3RhcnRCZWFyaW5nID0gdGhpcy5nZXRCZWFyaW5nKCksXG4gICAgICAgICAgICBzdGFydFBpdGNoID0gdGhpcy5nZXRQaXRjaCgpLFxuICAgICAgICAgICAgc3RhcnRQYWRkaW5nID0gdGhpcy5nZXRQYWRkaW5nKCksXG5cbiAgICAgICAgICAgIHpvb20gPSAnem9vbScgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnpvb20gOiBzdGFydFpvb20sXG4gICAgICAgICAgICBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZyxcbiAgICAgICAgICAgIHBpdGNoID0gJ3BpdGNoJyBpbiBvcHRpb25zID8gK29wdGlvbnMucGl0Y2ggOiBzdGFydFBpdGNoLFxuICAgICAgICAgICAgcGFkZGluZyA9ICdwYWRkaW5nJyBpbiBvcHRpb25zID8gb3B0aW9ucy5wYWRkaW5nIDogdHIucGFkZGluZztcblxuICAgICAgICBjb25zdCBvZmZzZXRBc1BvaW50ID0gUG9pbnQuY29udmVydChvcHRpb25zLm9mZnNldCk7XG4gICAgICAgIGxldCBwb2ludEF0T2Zmc2V0ID0gdHIuY2VudGVyUG9pbnQuYWRkKG9mZnNldEFzUG9pbnQpO1xuICAgICAgICBjb25zdCBsb2NhdGlvbkF0T2Zmc2V0ID0gdHIucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnID9cbiAgICAgICAgICAgIHRyLnBvaW50Q29vcmRpbmF0ZShwb2ludEF0T2Zmc2V0KS50b0xuZ0xhdCgpIDpcbiAgICAgICAgICAgIHRyLnBvaW50TG9jYXRpb24ocG9pbnRBdE9mZnNldCk7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuY2VudGVyIHx8IGxvY2F0aW9uQXRPZmZzZXQpO1xuICAgICAgICB0aGlzLl9ub3JtYWxpemVDZW50ZXIoY2VudGVyKTtcblxuICAgICAgICBjb25zdCBmcm9tID0gdHIucHJvamVjdChsb2NhdGlvbkF0T2Zmc2V0KTtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB0ci5wcm9qZWN0KGNlbnRlcikuc3ViKGZyb20pO1xuICAgICAgICBjb25zdCBmaW5hbFNjYWxlID0gdHIuem9vbVNjYWxlKHpvb20gLSBzdGFydFpvb20pO1xuXG4gICAgICAgIGxldCBhcm91bmQsIGFyb3VuZFBvaW50O1xuXG4gICAgICAgIGlmIChvcHRpb25zLmFyb3VuZCkge1xuICAgICAgICAgICAgYXJvdW5kID0gTG5nTGF0LmNvbnZlcnQob3B0aW9ucy5hcm91bmQpO1xuICAgICAgICAgICAgYXJvdW5kUG9pbnQgPSB0ci5sb2NhdGlvblBvaW50KGFyb3VuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB6b29tQ2hhbmdlZCA9IHRoaXMuX3pvb21pbmcgfHwgKHpvb20gIT09IHN0YXJ0Wm9vbSk7XG4gICAgICAgIGNvbnN0IGJlYXJpbmdDaGFuZ2VkID0gdGhpcy5fcm90YXRpbmcgfHwgKHN0YXJ0QmVhcmluZyAhPT0gYmVhcmluZyk7XG4gICAgICAgIGNvbnN0IHBpdGNoQ2hhbmdlZCA9IHRoaXMuX3BpdGNoaW5nIHx8IChwaXRjaCAhPT0gc3RhcnRQaXRjaCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdDaGFuZ2VkID0gIXRyLmlzUGFkZGluZ0VxdWFsKHBhZGRpbmcpO1xuXG4gICAgICAgIGNvbnN0IGZyYW1lID0gKHRyKSA9PiAoaykgPT4ge1xuICAgICAgICAgICAgaWYgKHpvb21DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdHIuem9vbSA9IGludGVycG9sYXRlKHN0YXJ0Wm9vbSwgem9vbSwgayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmVhcmluZ0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0ci5iZWFyaW5nID0gaW50ZXJwb2xhdGUoc3RhcnRCZWFyaW5nLCBiZWFyaW5nLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwaXRjaENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0ci5waXRjaCA9IGludGVycG9sYXRlKHN0YXJ0UGl0Y2gsIHBpdGNoLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWRkaW5nQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHRyLmludGVycG9sYXRlUGFkZGluZyhzdGFydFBhZGRpbmcsIHBhZGRpbmcsIGspO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gcGFkZGluZyBpcyBiZWluZyBhcHBsaWVkLCBUcmFuc2Zvcm0jY2VudGVyUG9pbnQgaXMgY2hhbmdpbmcgY29udGludW91c2x5LFxuICAgICAgICAgICAgICAgIC8vIHRodXMgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSBvZmZzZXRQb2ludCBldmVyeSBmcmEsZVxuICAgICAgICAgICAgICAgIHBvaW50QXRPZmZzZXQgPSB0ci5jZW50ZXJQb2ludC5hZGQob2Zmc2V0QXNQb2ludCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhcm91bmQpIHtcbiAgICAgICAgICAgICAgICB0ci5zZXRMb2NhdGlvbkF0UG9pbnQoYXJvdW5kLCBhcm91bmRQb2ludCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdHIuem9vbVNjYWxlKHRyLnpvb20gLSBzdGFydFpvb20pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSB6b29tID4gc3RhcnRab29tID9cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oMiwgZmluYWxTY2FsZSkgOlxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgwLjUsIGZpbmFsU2NhbGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwZWVkdXAgPSBNYXRoLnBvdyhiYXNlLCAxIC0gayk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gdHIudW5wcm9qZWN0KGZyb20uYWRkKGRlbHRhLm11bHQoayAqIHNwZWVkdXApKS5tdWx0KHNjYWxlKSk7XG4gICAgICAgICAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRyLnJlbmRlcldvcmxkQ29waWVzID8gbmV3Q2VudGVyLndyYXAoKSA6IG5ld0NlbnRlciwgcG9pbnRBdE9mZnNldCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5wcmVsb2FkT25seSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpcmVNb3ZlRXZlbnRzKGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cjtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob3B0aW9ucy5wcmVsb2FkT25seSkge1xuICAgICAgICAgICAgY29uc3QgcHJlZGljdGVkVHJhbnNmb3JtcyA9IHRoaXMuX2VtdWxhdGUoZnJhbWUsIG9wdGlvbnMuZHVyYXRpb24sIHRyKTtcbiAgICAgICAgICAgIHRoaXMuX3ByZWxvYWRUaWxlcyhwcmVkaWN0ZWRUcmFuc2Zvcm1zKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudGx5ID0ge1xuICAgICAgICAgICAgbW92aW5nOiB0aGlzLl9tb3ZpbmcsXG4gICAgICAgICAgICB6b29taW5nOiB0aGlzLl96b29taW5nLFxuICAgICAgICAgICAgcm90YXRpbmc6IHRoaXMuX3JvdGF0aW5nLFxuICAgICAgICAgICAgcGl0Y2hpbmc6IHRoaXMuX3BpdGNoaW5nXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fem9vbWluZyA9IHpvb21DaGFuZ2VkO1xuICAgICAgICB0aGlzLl9yb3RhdGluZyA9IGJlYXJpbmdDaGFuZ2VkO1xuICAgICAgICB0aGlzLl9waXRjaGluZyA9IHBpdGNoQ2hhbmdlZDtcbiAgICAgICAgdGhpcy5fcGFkZGluZyA9IHBhZGRpbmdDaGFuZ2VkO1xuXG4gICAgICAgIHRoaXMuX2Vhc2VJZCA9IG9wdGlvbnMuZWFzZUlkO1xuICAgICAgICB0aGlzLl9wcmVwYXJlRWFzZShldmVudERhdGEsIG9wdGlvbnMubm9Nb3ZlU3RhcnQsIGN1cnJlbnRseSk7XG5cbiAgICAgICAgdGhpcy5fZWFzZShmcmFtZSh0ciksIChpbnRlcnJ1cHRpbmdFYXNlSWQ/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRyLnJlY2VudGVyT25UZXJyYWluKCk7XG4gICAgICAgICAgICB0aGlzLl9hZnRlckVhc2UoZXZlbnREYXRhLCBpbnRlcnJ1cHRpbmdFYXNlSWQpO1xuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfcHJlcGFyZUVhc2UoZXZlbnREYXRhPzogT2JqZWN0LCBub01vdmVTdGFydDogYm9vbGVhbiwgY3VycmVudGx5OiBPYmplY3QgPSB7fSkge1xuICAgICAgICB0aGlzLl9tb3ZpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybS5jYW1lcmFFbGV2YXRpb25SZWZlcmVuY2UgPSBcInNlYVwiO1xuXG4gICAgICAgIGlmICghbm9Nb3ZlU3RhcnQgJiYgIWN1cnJlbnRseS5tb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmVzdGFydCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl96b29taW5nICYmICFjdXJyZW50bHkuem9vbWluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnem9vbXN0YXJ0JywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW5nICYmICFjdXJyZW50bHkucm90YXRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZXN0YXJ0JywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoaW5nICYmICFjdXJyZW50bHkucGl0Y2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3BpdGNoc3RhcnQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9maXJlTW92ZUV2ZW50cyhldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbW92ZScsIGV2ZW50RGF0YSkpO1xuICAgICAgICBpZiAodGhpcy5fem9vbWluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnem9vbScsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9yb3RhdGluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncm90YXRlJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdwaXRjaCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2FmdGVyRWFzZShldmVudERhdGE/OiBPYmplY3QsIGVhc2VJZD86IHN0cmluZykge1xuICAgICAgICAvLyBpZiB0aGlzIGVhc2luZyBpcyBiZWluZyBzdG9wcGVkIHRvIHN0YXJ0IGFub3RoZXIgZWFzaW5nIHdpdGhcbiAgICAgICAgLy8gdGhlIHNhbWUgaWQgdGhlbiBkb24ndCBmaXJlIGFueSBldmVudHMgdG8gYXZvaWQgZXh0cmEgc3RhcnQvc3RvcCBldmVudHNcbiAgICAgICAgaWYgKHRoaXMuX2Vhc2VJZCAmJiBlYXNlSWQgJiYgdGhpcy5fZWFzZUlkID09PSBlYXNlSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5fZWFzZUlkO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybS5jYW1lcmFFbGV2YXRpb25SZWZlcmVuY2UgPSBcImdyb3VuZFwiO1xuXG4gICAgICAgIGNvbnN0IHdhc1pvb21pbmcgPSB0aGlzLl96b29taW5nO1xuICAgICAgICBjb25zdCB3YXNSb3RhdGluZyA9IHRoaXMuX3JvdGF0aW5nO1xuICAgICAgICBjb25zdCB3YXNQaXRjaGluZyA9IHRoaXMuX3BpdGNoaW5nO1xuICAgICAgICB0aGlzLl9tb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fem9vbWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9yb3RhdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9waXRjaGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wYWRkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHdhc1pvb21pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3pvb21lbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2FzUm90YXRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZWVuZCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3YXNQaXRjaGluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncGl0Y2hlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3ZlZW5kJywgZXZlbnREYXRhKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbnkgY29tYmluYXRpb24gb2YgY2VudGVyLCB6b29tLCBiZWFyaW5nLCBhbmQgcGl0Y2gsIGFuaW1hdGluZyB0aGUgdHJhbnNpdGlvbiBhbG9uZyBhIGN1cnZlIHRoYXRcbiAgICAgKiBldm9rZXMgZmxpZ2h0LiBUaGUgYW5pbWF0aW9uIHNlYW1sZXNzbHkgaW5jb3Jwb3JhdGVzIHpvb21pbmcgYW5kIHBhbm5pbmcgdG8gaGVscFxuICAgICAqIHRoZSB1c2VyIG1haW50YWluIHRoZWlyIGJlYXJpbmdzIGV2ZW4gYWZ0ZXIgdHJhdmVyc2luZyBhIGdyZWF0IGRpc3RhbmNlLlxuICAgICAqXG4gICAgICogSWYgYSB1c2VyIGhhcyB0aGUgYHJlZHVjZWQgbW90aW9uYCBhY2Nlc3NpYmlsaXR5IGZlYXR1cmUgZW5hYmxlZCBpbiB0aGVpclxuICAgICAqIG9wZXJhdGluZyBzeXN0ZW0sIHRoZSBhbmltYXRpb24gd2lsbCBiZSBza2lwcGVkIGFuZCB0aGlzIHdpbGwgYmVoYXZlXG4gICAgICogZXF1aXZhbGVudGx5IHRvIGBqdW1wVG9gLCB1bmxlc3MgJ29wdGlvbnMnIGluY2x1ZGVzIGBlc3NlbnRpYWw6IHRydWVgLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zIGRlc2NyaWJpbmcgdGhlIGRlc3RpbmF0aW9uIGFuZCBhbmltYXRpb24gb2YgdGhlIHRyYW5zaXRpb24uXG4gICAgICogICAgIEFjY2VwdHMge0BsaW5rIENhbWVyYU9wdGlvbnN9LCB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30sXG4gICAgICogICAgIGFuZCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY3VydmU9MS40Ml0gVGhlIHpvb21pbmcgXCJjdXJ2ZVwiIHRoYXQgd2lsbCBvY2N1ciBhbG9uZyB0aGVcbiAgICAgKiAgICAgZmxpZ2h0IHBhdGguIEEgaGlnaCB2YWx1ZSBtYXhpbWl6ZXMgem9vbWluZyBmb3IgYW4gZXhhZ2dlcmF0ZWQgYW5pbWF0aW9uLCB3aGlsZSBhIGxvd1xuICAgICAqICAgICB2YWx1ZSBtaW5pbWl6ZXMgem9vbWluZyBmb3IgYW4gZWZmZWN0IGNsb3NlciB0byB7QGxpbmsgTWFwI2Vhc2VUb30uIDEuNDIgaXMgdGhlIGF2ZXJhZ2VcbiAgICAgKiAgICAgdmFsdWUgc2VsZWN0ZWQgYnkgcGFydGljaXBhbnRzIGluIHRoZSB1c2VyIHN0dWR5IGRpc2N1c3NlZCBpblxuICAgICAqICAgICBbdmFuIFdpamsgKDIwMDMpXShodHRwczovL3d3dy53aW4udHVlLm5sL352YW53aWprL3pvb21wYW4ucGRmKS4gQSB2YWx1ZSBvZlxuICAgICAqICAgICBgTWF0aC5wb3coNiwgMC4yNSlgIHdvdWxkIGJlIGVxdWl2YWxlbnQgdG8gdGhlIHJvb3QgbWVhbiBzcXVhcmVkIGF2ZXJhZ2UgdmVsb2NpdHkuIEFcbiAgICAgKiAgICAgdmFsdWUgb2YgMSB3b3VsZCBwcm9kdWNlIGEgY2lyY3VsYXIgbW90aW9uLiBJZiBgb3B0aW9ucy5taW5ab29tYCBpcyBzcGVjaWZpZWQsIHRoaXMgb3B0aW9uIHdpbGwgYmUgaWdub3JlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluWm9vbV0gVGhlIHplcm8tYmFzZWQgem9vbSBsZXZlbCBhdCB0aGUgcGVhayBvZiB0aGUgZmxpZ2h0IHBhdGguIElmXG4gICAgICogICAgIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwgYG9wdGlvbnMuY3VydmVgIHdpbGwgYmUgaWdub3JlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc3BlZWQ9MS4yXSBUaGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgYW5pbWF0aW9uIGRlZmluZWQgaW4gcmVsYXRpb24gdG9cbiAgICAgKiAgICAgYG9wdGlvbnMuY3VydmVgLiBBIHNwZWVkIG9mIDEuMiBtZWFucyB0aGF0IHRoZSBtYXAgYXBwZWFycyB0byBtb3ZlIGFsb25nIHRoZSBmbGlnaHQgcGF0aFxuICAgICAqICAgICBieSAxLjIgdGltZXMgYG9wdGlvbnMuY3VydmVgIHNjcmVlbmZ1bHMgZXZlcnkgc2Vjb25kLiBBIF9zY3JlZW5mdWxfIGlzIHRoZSBtYXAncyB2aXNpYmxlIHNwYW4uXG4gICAgICogICAgIEl0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBmaXhlZCBwaHlzaWNhbCBkaXN0YW5jZSwgYnV0IHZhcmllcyBieSB6b29tIGxldmVsLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zY3JlZW5TcGVlZF0gVGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGFuaW1hdGlvbiBtZWFzdXJlZCBpbiBzY3JlZW5mdWxzXG4gICAgICogICAgIHBlciBzZWNvbmQsIGFzc3VtaW5nIGEgbGluZWFyIHRpbWluZyBjdXJ2ZS4gSWYgYG9wdGlvbnMuc3BlZWRgIGlzIHNwZWNpZmllZCwgdGhpcyBvcHRpb24gaXMgaWdub3JlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4RHVyYXRpb25dIFRoZSBhbmltYXRpb24ncyBtYXhpbXVtIGR1cmF0aW9uLCBtZWFzdXJlZCBpbiBtaWxsaXNlY29uZHMuXG4gICAgICogICAgIElmIGR1cmF0aW9uIGV4Y2VlZHMgbWF4aW11bSBkdXJhdGlvbiwgaXQgcmVzZXRzIHRvIDAuXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBudWxsfSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDpwaXRjaHN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDpyb3RhdGVcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tZW5kXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDpwaXRjaGVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBmbHkgd2l0aCBkZWZhdWx0IG9wdGlvbnMgdG8gbnVsbCBpc2xhbmRcbiAgICAgKiBtYXAuZmx5VG8oe2NlbnRlcjogWzAsIDBdLCB6b29tOiA5fSk7XG4gICAgICogLy8gdXNpbmcgZmx5VG8gb3B0aW9uc1xuICAgICAqIG1hcC5mbHlUbyh7XG4gICAgICogICAgIGNlbnRlcjogWzAsIDBdLFxuICAgICAqICAgICB6b29tOiA5LFxuICAgICAqICAgICBzcGVlZDogMC4yLFxuICAgICAqICAgICBjdXJ2ZTogMSxcbiAgICAgKiAgICAgZWFzaW5nKHQpIHtcbiAgICAgKiAgICAgICAgIHJldHVybiB0O1xuICAgICAqICAgICB9XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogRmx5IHRvIGEgbG9jYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmx5dG8vKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IFNsb3dseSBmbHkgdG8gYSBsb2NhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mbHl0by1vcHRpb25zLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBGbHkgdG8gYSBsb2NhdGlvbiBiYXNlZCBvbiBzY3JvbGwgcG9zaXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2Nyb2xsLWZseS10by8pXG4gICAgICovXG4gICAgZmx5VG8ob3B0aW9uczogQ2FtZXJhT3B0aW9ucyAmIEFuaW1hdGlvbk9wdGlvbnMgJiB7cHJlbG9hZE9ubHk/OiBib29sZWFufSwgZXZlbnREYXRhPzogT2JqZWN0KSB7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBqdW1wVG8gaWYgdXNlciBoYXMgc2V0IHByZWZlcnMtcmVkdWNlZC1tb3Rpb25cbiAgICAgICAgaWYgKCFvcHRpb25zLmVzc2VudGlhbCAmJiBicm93c2VyLnByZWZlcnNSZWR1Y2VkTW90aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBjb2VyY2VkT3B0aW9ucyA9IHBpY2sob3B0aW9ucywgWydjZW50ZXInLCAnem9vbScsICdiZWFyaW5nJywgJ3BpdGNoJywgJ2Fyb3VuZCddKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmp1bXBUbyhjb2VyY2VkT3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgYW4g4oCcb3B0aW1hbCBwYXRo4oCdIGFuaW1hdGlvbiwgYXMgZGV0YWlsZWQgaW46XG4gICAgICAgIC8vXG4gICAgICAgIC8vIFZhbiBXaWprLCBKYXJrZSBKLjsgTnVpaiwgV2ltIEEuIEEuIOKAnFNtb290aCBhbmQgZWZmaWNpZW50IHpvb21pbmcgYW5kIHBhbm5pbmcu4oCdIElORk9WSVNcbiAgICAgICAgLy8gICDigJkwMy4gcHAuIDE14oCTMjIuIDxodHRwczovL3d3dy53aW4udHVlLm5sL352YW53aWprL3pvb21wYW4ucGRmI3BhZ2U9NT4uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdoZXJlIGFwcGxpY2FibGUsIGxvY2FsIHZhcmlhYmxlIGRvY3VtZW50YXRpb24gYmVnaW5zIHdpdGggdGhlIGFzc29jaWF0ZWQgdmFyaWFibGUgb3JcbiAgICAgICAgLy8gZnVuY3Rpb24gaW4gdmFuIFdpamsgKDIwMDMpLlxuXG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIG9wdGlvbnMgPSBleHRlbmQoe1xuICAgICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXG4gICAgICAgICAgICBzcGVlZDogMS4yLFxuICAgICAgICAgICAgY3VydmU6IDEuNDIsXG4gICAgICAgICAgICBlYXNpbmc6IGRlZmF1bHRFYXNpbmdcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIHN0YXJ0Wm9vbSA9IHRoaXMuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgc3RhcnRCZWFyaW5nID0gdGhpcy5nZXRCZWFyaW5nKCksXG4gICAgICAgICAgICBzdGFydFBpdGNoID0gdGhpcy5nZXRQaXRjaCgpLFxuICAgICAgICAgICAgc3RhcnRQYWRkaW5nID0gdGhpcy5nZXRQYWRkaW5nKCk7XG5cbiAgICAgICAgY29uc3Qgem9vbSA9ICd6b29tJyBpbiBvcHRpb25zID8gY2xhbXAoK29wdGlvbnMuem9vbSwgdHIubWluWm9vbSwgdHIubWF4Wm9vbSkgOiBzdGFydFpvb207XG4gICAgICAgIGNvbnN0IGJlYXJpbmcgPSAnYmVhcmluZycgaW4gb3B0aW9ucyA/IHRoaXMuX25vcm1hbGl6ZUJlYXJpbmcob3B0aW9ucy5iZWFyaW5nLCBzdGFydEJlYXJpbmcpIDogc3RhcnRCZWFyaW5nO1xuICAgICAgICBjb25zdCBwaXRjaCA9ICdwaXRjaCcgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnBpdGNoIDogc3RhcnRQaXRjaDtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9ICdwYWRkaW5nJyBpbiBvcHRpb25zID8gb3B0aW9ucy5wYWRkaW5nIDogdHIucGFkZGluZztcblxuICAgICAgICBjb25zdCBzY2FsZSA9IHRyLnpvb21TY2FsZSh6b29tIC0gc3RhcnRab29tKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0QXNQb2ludCA9IFBvaW50LmNvbnZlcnQob3B0aW9ucy5vZmZzZXQpO1xuICAgICAgICBsZXQgcG9pbnRBdE9mZnNldCA9IHRyLmNlbnRlclBvaW50LmFkZChvZmZzZXRBc1BvaW50KTtcbiAgICAgICAgY29uc3QgbG9jYXRpb25BdE9mZnNldCA9IHRyLnBvaW50TG9jYXRpb24ocG9pbnRBdE9mZnNldCk7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuY2VudGVyIHx8IGxvY2F0aW9uQXRPZmZzZXQpO1xuICAgICAgICB0aGlzLl9ub3JtYWxpemVDZW50ZXIoY2VudGVyKTtcblxuICAgICAgICBjb25zdCBmcm9tID0gdHIucHJvamVjdChsb2NhdGlvbkF0T2Zmc2V0KTtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB0ci5wcm9qZWN0KGNlbnRlcikuc3ViKGZyb20pO1xuXG4gICAgICAgIGxldCByaG8gPSBvcHRpb25zLmN1cnZlO1xuXG4gICAgICAgIC8vIHfigoA6IEluaXRpYWwgdmlzaWJsZSBzcGFuLCBtZWFzdXJlZCBpbiBwaXhlbHMgYXQgdGhlIGluaXRpYWwgc2NhbGUuXG4gICAgICAgIGNvbnN0IHcwID0gTWF0aC5tYXgodHIud2lkdGgsIHRyLmhlaWdodCksXG4gICAgICAgICAgICAvLyB34oKBOiBGaW5hbCB2aXNpYmxlIHNwYW4sIG1lYXN1cmVkIGluIHBpeGVscyB3aXRoIHJlc3BlY3QgdG8gdGhlIGluaXRpYWwgc2NhbGUuXG4gICAgICAgICAgICB3MSA9IHcwIC8gc2NhbGUsXG4gICAgICAgICAgICAvLyBMZW5ndGggb2YgdGhlIGZsaWdodCBwYXRoIGFzIHByb2plY3RlZCBvbnRvIHRoZSBncm91bmQgcGxhbmUsIG1lYXN1cmVkIGluIHBpeGVscyBmcm9tXG4gICAgICAgICAgICAvLyB0aGUgd29ybGQgaW1hZ2Ugb3JpZ2luIGF0IHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICAgICAgdTEgPSBkZWx0YS5tYWcoKTtcblxuICAgICAgICBpZiAoJ21pblpvb20nIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblpvb20gPSBjbGFtcChNYXRoLm1pbihvcHRpb25zLm1pblpvb20sIHN0YXJ0Wm9vbSwgem9vbSksIHRyLm1pblpvb20sIHRyLm1heFpvb20pO1xuICAgICAgICAgICAgLy8gdzxzdWI+bTwvc3ViPjogTWF4aW11bSB2aXNpYmxlIHNwYW4sIG1lYXN1cmVkIGluIHBpeGVscyB3aXRoIHJlc3BlY3QgdG8gdGhlIGluaXRpYWxcbiAgICAgICAgICAgIC8vIHNjYWxlLlxuICAgICAgICAgICAgY29uc3Qgd01heCA9IHcwIC8gdHIuem9vbVNjYWxlKG1pblpvb20gLSBzdGFydFpvb20pO1xuICAgICAgICAgICAgcmhvID0gTWF0aC5zcXJ0KHdNYXggLyB1MSAqIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gz4HCslxuICAgICAgICBjb25zdCByaG8yID0gcmhvICogcmhvO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBy4bWiOiBSZXR1cm5zIHRoZSB6b29tLW91dCBmYWN0b3IgYXQgb25lIGVuZCBvZiB0aGUgYW5pbWF0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gaSAwIGZvciB0aGUgYXNjZW50IG9yIDEgZm9yIHRoZSBkZXNjZW50LlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gcihpKSB7XG4gICAgICAgICAgICBjb25zdCBiID0gKHcxICogdzEgLSB3MCAqIHcwICsgKGkgPyAtMSA6IDEpICogcmhvMiAqIHJobzIgKiB1MSAqIHUxKSAvICgyICogKGkgPyB3MSA6IHcwKSAqIHJobzIgKiB1MSk7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5sb2coTWF0aC5zcXJ0KGIgKiBiICsgMSkgLSBiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHNpbmgobikgeyByZXR1cm4gKE1hdGguZXhwKG4pIC0gTWF0aC5leHAoLW4pKSAvIDI7IH1cbiAgICAgICAgZnVuY3Rpb24gY29zaChuKSB7IHJldHVybiAoTWF0aC5leHAobikgKyBNYXRoLmV4cCgtbikpIC8gMjsgfVxuICAgICAgICBmdW5jdGlvbiB0YW5oKG4pIHsgcmV0dXJuIHNpbmgobikgLyBjb3NoKG4pOyB9XG5cbiAgICAgICAgLy8gcuKCgDogWm9vbS1vdXQgZmFjdG9yIGR1cmluZyBhc2NlbnQuXG4gICAgICAgIGNvbnN0IHIwID0gcigwKTtcblxuICAgICAgICAvLyB3KHMpOiBSZXR1cm5zIHRoZSB2aXNpYmxlIHNwYW4gb24gdGhlIGdyb3VuZCwgbWVhc3VyZWQgaW4gcGl4ZWxzIHdpdGggcmVzcGVjdCB0byB0aGVcbiAgICAgICAgLy8gaW5pdGlhbCBzY2FsZS4gQXNzdW1lcyBhbiBhbmd1bGFyIGZpZWxkIG9mIHZpZXcgb2YgMiBhcmN0YW4gwr0g4omIIDUzwrAuXG4gICAgICAgIGxldCB3OiAoXzogbnVtYmVyKSA9PiBudW1iZXIgPSBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIChjb3NoKHIwKSAvIGNvc2gocjAgKyByaG8gKiBzKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gdShzKTogUmV0dXJucyB0aGUgZGlzdGFuY2UgYWxvbmcgdGhlIGZsaWdodCBwYXRoIGFzIHByb2plY3RlZCBvbnRvIHRoZSBncm91bmQgcGxhbmUsXG4gICAgICAgIC8vIG1lYXN1cmVkIGluIHBpeGVscyBmcm9tIHRoZSB3b3JsZCBpbWFnZSBvcmlnaW4gYXQgdGhlIGluaXRpYWwgc2NhbGUuXG4gICAgICAgIGxldCB1OiAoXzogbnVtYmVyKSA9PiBudW1iZXIgPSBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIHcwICogKChjb3NoKHIwKSAqIHRhbmgocjAgKyByaG8gKiBzKSAtIHNpbmgocjApKSAvIHJobzIpIC8gdTE7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUzogVG90YWwgbGVuZ3RoIG9mIHRoZSBmbGlnaHQgcGF0aCwgbWVhc3VyZWQgaW4gz4Etc2NyZWVuZnVscy5cbiAgICAgICAgbGV0IFMgPSAocigxKSAtIHIwKSAvIHJobztcblxuICAgICAgICAvLyBXaGVuIHXigoAgPSB14oKBLCB0aGUgb3B0aW1hbCBwYXRoIGRvZXNu4oCZdCByZXF1aXJlIGJvdGggYXNjZW50IGFuZCBkZXNjZW50LlxuICAgICAgICBpZiAoTWF0aC5hYnModTEpIDwgMC4wMDAwMDEgfHwgIWlzRmluaXRlKFMpKSB7XG4gICAgICAgICAgICAvLyBQZXJmb3JtIGEgbW9yZSBvciBsZXNzIGluc3RhbnRhbmVvdXMgdHJhbnNpdGlvbiBpZiB0aGUgcGF0aCBpcyB0b28gc2hvcnQuXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnModzAgLSB3MSkgPCAwLjAwMDAwMSkgcmV0dXJuIHRoaXMuZWFzZVRvKG9wdGlvbnMsIGV2ZW50RGF0YSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGsgPSB3MSA8IHcwID8gLTEgOiAxO1xuICAgICAgICAgICAgUyA9IE1hdGguYWJzKE1hdGgubG9nKHcxIC8gdzApKSAvIHJobztcblxuICAgICAgICAgICAgdSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiAgICAgICAgICAgIHcgPSBmdW5jdGlvbihzKSB7IHJldHVybiBNYXRoLmV4cChrICogcmhvICogcyk7IH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ2R1cmF0aW9uJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zLmR1cmF0aW9uID0gK29wdGlvbnMuZHVyYXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBWID0gJ3NjcmVlblNwZWVkJyBpbiBvcHRpb25zID8gK29wdGlvbnMuc2NyZWVuU3BlZWQgLyByaG8gOiArb3B0aW9ucy5zcGVlZDtcbiAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb24gPSAxMDAwICogUyAvIFY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5tYXhEdXJhdGlvbiAmJiBvcHRpb25zLmR1cmF0aW9uID4gb3B0aW9ucy5tYXhEdXJhdGlvbikge1xuICAgICAgICAgICAgb3B0aW9ucy5kdXJhdGlvbiA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB6b29tQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJlYXJpbmdDaGFuZ2VkID0gKHN0YXJ0QmVhcmluZyAhPT0gYmVhcmluZyk7XG4gICAgICAgIGNvbnN0IHBpdGNoQ2hhbmdlZCA9IChwaXRjaCAhPT0gc3RhcnRQaXRjaCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdDaGFuZ2VkID0gIXRyLmlzUGFkZGluZ0VxdWFsKHBhZGRpbmcpO1xuXG4gICAgICAgIGNvbnN0IGZyYW1lID0gKHRyKSA9PiAoaykgPT4ge1xuICAgICAgICAgICAgLy8gczogVGhlIGRpc3RhbmNlIHRyYXZlbGVkIGFsb25nIHRoZSBmbGlnaHQgcGF0aCwgbWVhc3VyZWQgaW4gz4Etc2NyZWVuZnVscy5cbiAgICAgICAgICAgIGNvbnN0IHMgPSBrICogUztcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gMSAvIHcocyk7XG4gICAgICAgICAgICB0ci56b29tID0gayA9PT0gMSA/IHpvb20gOiBzdGFydFpvb20gKyB0ci5zY2FsZVpvb20oc2NhbGUpO1xuXG4gICAgICAgICAgICBpZiAoYmVhcmluZ0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0ci5iZWFyaW5nID0gaW50ZXJwb2xhdGUoc3RhcnRCZWFyaW5nLCBiZWFyaW5nLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwaXRjaENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0ci5waXRjaCA9IGludGVycG9sYXRlKHN0YXJ0UGl0Y2gsIHBpdGNoLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWRkaW5nQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHRyLmludGVycG9sYXRlUGFkZGluZyhzdGFydFBhZGRpbmcsIHBhZGRpbmcsIGspO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gcGFkZGluZyBpcyBiZWluZyBhcHBsaWVkLCBUcmFuc2Zvcm0jY2VudGVyUG9pbnQgaXMgY2hhbmdpbmcgY29udGludW91c2x5LFxuICAgICAgICAgICAgICAgIC8vIHRodXMgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSBvZmZzZXRQb2ludCBldmVyeSBmcmFtZVxuICAgICAgICAgICAgICAgIHBvaW50QXRPZmZzZXQgPSB0ci5jZW50ZXJQb2ludC5hZGQob2Zmc2V0QXNQb2ludCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0NlbnRlciA9IGsgPT09IDEgPyBjZW50ZXIgOiB0ci51bnByb2plY3QoZnJvbS5hZGQoZGVsdGEubXVsdCh1KHMpKSkubXVsdChzY2FsZSkpO1xuICAgICAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRyLnJlbmRlcldvcmxkQ29waWVzID8gbmV3Q2VudGVyLndyYXAoKSA6IG5ld0NlbnRlciwgcG9pbnRBdE9mZnNldCk7XG4gICAgICAgICAgICB0ci5fdXBkYXRlQ2VudGVyRWxldmF0aW9uKCk7XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5wcmVsb2FkT25seSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpcmVNb3ZlRXZlbnRzKGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cjtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob3B0aW9ucy5wcmVsb2FkT25seSkge1xuICAgICAgICAgICAgY29uc3QgcHJlZGljdGVkVHJhbnNmb3JtcyA9IHRoaXMuX2VtdWxhdGUoZnJhbWUsIG9wdGlvbnMuZHVyYXRpb24sIHRyKTtcbiAgICAgICAgICAgIHRoaXMuX3ByZWxvYWRUaWxlcyhwcmVkaWN0ZWRUcmFuc2Zvcm1zKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fem9vbWluZyA9IHpvb21DaGFuZ2VkO1xuICAgICAgICB0aGlzLl9yb3RhdGluZyA9IGJlYXJpbmdDaGFuZ2VkO1xuICAgICAgICB0aGlzLl9waXRjaGluZyA9IHBpdGNoQ2hhbmdlZDtcbiAgICAgICAgdGhpcy5fcGFkZGluZyA9IHBhZGRpbmdDaGFuZ2VkO1xuXG4gICAgICAgIHRoaXMuX3ByZXBhcmVFYXNlKGV2ZW50RGF0YSwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9lYXNlKGZyYW1lKHRyKSwgKCkgPT4gdGhpcy5fYWZ0ZXJFYXNlKGV2ZW50RGF0YSksIG9wdGlvbnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlzRWFzaW5nKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lYXNlRnJhbWVJZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wcyBhbnkgYW5pbWF0ZWQgdHJhbnNpdGlvbiB1bmRlcndheS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zdG9wKCk7XG4gICAgICovXG4gICAgc3RvcCgpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0b3AoKTtcbiAgICB9XG5cbiAgICBfc3RvcChhbGxvd0dlc3R1cmVzPzogYm9vbGVhbiwgZWFzZUlkPzogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIGlmICh0aGlzLl9lYXNlRnJhbWVJZCkge1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsUmVuZGVyRnJhbWUodGhpcy5fZWFzZUZyYW1lSWQpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2Vhc2VGcmFtZUlkO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX29uRWFzZUZyYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX29uRWFzZUVuZCkge1xuICAgICAgICAgICAgLy8gVGhlIF9vbkVhc2VFbmQgZnVuY3Rpb24gbWlnaHQgZW1pdCBldmVudHMgd2hpY2ggdHJpZ2dlciBuZXdcbiAgICAgICAgICAgIC8vIGFuaW1hdGlvbiwgd2hpY2ggc2V0cyBhIG5ldyBfb25FYXNlRW5kLiBFbnN1cmUgd2UgZG9uJ3QgZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCB1bmludGVudGlvbmFsbHkuXG4gICAgICAgICAgICBjb25zdCBvbkVhc2VFbmQgPSB0aGlzLl9vbkVhc2VFbmQ7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fb25FYXNlRW5kO1xuICAgICAgICAgICAgb25FYXNlRW5kLmNhbGwodGhpcywgZWFzZUlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFsbG93R2VzdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gKHRoaXM6IGFueSkuaGFuZGxlcnM7XG4gICAgICAgICAgICBpZiAoaGFuZGxlcnMpIGhhbmRsZXJzLnN0b3AoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9lYXNlKGZyYW1lOiAoXzogbnVtYmVyKSA9PiBUcmFuc2Zvcm0gfCB2b2lkLFxuICAgICAgICAgIGZpbmlzaDogKCkgPT4gdm9pZCxcbiAgICAgICAgICBvcHRpb25zOiB7YW5pbWF0ZTogYm9vbGVhbiwgZHVyYXRpb246IG51bWJlciwgZWFzaW5nOiAoXzogbnVtYmVyKSA9PiBudW1iZXJ9KSB7XG4gICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUgPT09IGZhbHNlIHx8IG9wdGlvbnMuZHVyYXRpb24gPT09IDApIHtcbiAgICAgICAgICAgIGZyYW1lKDEpO1xuICAgICAgICAgICAgZmluaXNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9lYXNlU3RhcnQgPSBicm93c2VyLm5vdygpO1xuICAgICAgICAgICAgdGhpcy5fZWFzZU9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5fb25FYXNlRnJhbWUgPSBmcmFtZTtcbiAgICAgICAgICAgIHRoaXMuX29uRWFzZUVuZCA9IGZpbmlzaDtcbiAgICAgICAgICAgIHRoaXMuX2Vhc2VGcmFtZUlkID0gdGhpcy5fcmVxdWVzdFJlbmRlckZyYW1lKHRoaXMuX3JlbmRlckZyYW1lQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbGJhY2sgZm9yIG1hcC5fcmVxdWVzdFJlbmRlckZyYW1lXG4gICAgX3JlbmRlckZyYW1lQ2FsbGJhY2soKSB7XG4gICAgICAgIGNvbnN0IHQgPSBNYXRoLm1pbigoYnJvd3Nlci5ub3coKSAtIHRoaXMuX2Vhc2VTdGFydCkgLyB0aGlzLl9lYXNlT3B0aW9ucy5kdXJhdGlvbiwgMSk7XG4gICAgICAgIHRoaXMuX29uRWFzZUZyYW1lKHRoaXMuX2Vhc2VPcHRpb25zLmVhc2luZyh0KSk7XG4gICAgICAgIGlmICh0IDwgMSkge1xuICAgICAgICAgICAgdGhpcy5fZWFzZUZyYW1lSWQgPSB0aGlzLl9yZXF1ZXN0UmVuZGVyRnJhbWUodGhpcy5fcmVuZGVyRnJhbWVDYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnZlcnQgYmVhcmluZyBzbyB0aGF0IGl0J3MgbnVtZXJpY2FsbHkgY2xvc2UgdG8gdGhlIGN1cnJlbnQgb25lIHNvIHRoYXQgaXQgaW50ZXJwb2xhdGVzIHByb3Blcmx5XG4gICAgX25vcm1hbGl6ZUJlYXJpbmcoYmVhcmluZzogbnVtYmVyLCBjdXJyZW50QmVhcmluZzogbnVtYmVyKSB7XG4gICAgICAgIGJlYXJpbmcgPSB3cmFwKGJlYXJpbmcsIC0xODAsIDE4MCk7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhiZWFyaW5nIC0gY3VycmVudEJlYXJpbmcpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoYmVhcmluZyAtIDM2MCAtIGN1cnJlbnRCZWFyaW5nKSA8IGRpZmYpIGJlYXJpbmcgLT0gMzYwO1xuICAgICAgICBpZiAoTWF0aC5hYnMoYmVhcmluZyArIDM2MCAtIGN1cnJlbnRCZWFyaW5nKSA8IGRpZmYpIGJlYXJpbmcgKz0gMzYwO1xuICAgICAgICByZXR1cm4gYmVhcmluZztcbiAgICB9XG5cbiAgICAvLyBJZiBhIHBhdGggY3Jvc3NpbmcgdGhlIGFudGltZXJpZGlhbiB3b3VsZCBiZSBzaG9ydGVyLCBleHRlbmQgdGhlIGZpbmFsIGNvb3JkaW5hdGUgc28gdGhhdFxuICAgIC8vIGludGVycG9sYXRpbmcgYmV0d2VlbiB0aGUgdHdvIGVuZHBvaW50cyB3aWxsIGNyb3NzIGl0LlxuICAgIF9ub3JtYWxpemVDZW50ZXIoY2VudGVyOiBMbmdMYXQpIHtcbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKCF0ci5yZW5kZXJXb3JsZENvcGllcyB8fCB0ci5tYXhCb3VuZHMpIHJldHVybjtcblxuICAgICAgICBjb25zdCBkZWx0YSA9IGNlbnRlci5sbmcgLSB0ci5jZW50ZXIubG5nO1xuICAgICAgICBjZW50ZXIubG5nICs9XG4gICAgICAgICAgICBkZWx0YSA+IDE4MCA/IC0zNjAgOlxuICAgICAgICAgICAgZGVsdGEgPCAtMTgwID8gMzYwIDogMDtcbiAgICB9XG5cbiAgICAvLyBlbXVsYXRlcyBmcmFtZSBmdW5jdGlvbiBmb3Igc29tZSB0cmFuc2Zvcm1cbiAgICBfZW11bGF0ZShmcmFtZTogRnVuY3Rpb24sIGR1cmF0aW9uOiBudW1iZXIsIGluaXRpYWxUcmFuc2Zvcm06IFRyYW5zZm9ybSkge1xuICAgICAgICBjb25zdCBmcmFtZVJhdGUgPSAxNTtcbiAgICAgICAgY29uc3QgbnVtRnJhbWVzID0gTWF0aC5jZWlsKGR1cmF0aW9uICogZnJhbWVSYXRlIC8gMTAwMCk7XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtcyA9IFtdO1xuICAgICAgICBjb25zdCBlbXVsYXRlRnJhbWUgPSBmcmFtZShpbml0aWFsVHJhbnNmb3JtLmNsb25lKCkpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBudW1GcmFtZXM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gZW11bGF0ZUZyYW1lKGkgLyBudW1GcmFtZXMpO1xuICAgICAgICAgICAgdHJhbnNmb3Jtcy5wdXNoKHRyYW5zZm9ybS5jbG9uZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm1zO1xuICAgIH1cbn1cblxuLy8gSW4gZGVidWcgYnVpbGRzLCBjaGVjayB0aGF0IGNhbWVyYSBjaGFuZ2UgZXZlbnRzIGFyZSBmaXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci5cbi8vIC0gX19fc3RhcnQgZXZlbnRzIG5lZWRzIHRvIGJlIGZpcmVkIGJlZm9yZSBfX18gYW5kIF9fX2VuZCBldmVudHNcbi8vIC0gYW5vdGhlciBfX19zdGFydCBldmVudCBjYW4ndCBiZSBmaXJlZCBiZWZvcmUgYSBfX19lbmQgZXZlbnQgaGFzIGJlZW4gZmlyZWQgZm9yIHRoZSBwcmV2aW91cyBvbmVcbmZ1bmN0aW9uIGFkZEFzc2VydGlvbnMoY2FtZXJhOiBDYW1lcmEpIHsgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgRGVidWcucnVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5Qcm9ncmVzcyA9IHt9O1xuXG4gICAgICAgIFsnZHJhZycsICd6b29tJywgJ3JvdGF0ZScsICdwaXRjaCcsICdtb3ZlJ10uZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgICAgIGluUHJvZ3Jlc3NbbmFtZV0gPSBmYWxzZTtcblxuICAgICAgICAgICAgY2FtZXJhLm9uKGAke25hbWV9c3RhcnRgLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KCFpblByb2dyZXNzW25hbWVdLCBgXCIke25hbWV9c3RhcnRcIiBmaXJlZCB0d2ljZSB3aXRob3V0IGEgXCIke25hbWV9ZW5kXCJgKTtcbiAgICAgICAgICAgICAgICBpblByb2dyZXNzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaW5Qcm9ncmVzcy5tb3ZlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjYW1lcmEub24obmFtZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGFzc2VydChpblByb2dyZXNzW25hbWVdKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaW5Qcm9ncmVzcy5tb3ZlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjYW1lcmEub24oYCR7bmFtZX1lbmRgLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGluUHJvZ3Jlc3MubW92ZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGluUHJvZ3Jlc3NbbmFtZV0pO1xuICAgICAgICAgICAgICAgIGluUHJvZ3Jlc3NbbmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDYW5hcnkgdXNlZCB0byB0ZXN0IHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBpcyBzdHJpcHBlZCBpbiBwcm9kIGJ1aWxkXG4gICAgICAgIGNhbmFyeSA9ICdjYW5hcnkgZGVidWcgcnVuJzsgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgfSk7XG59XG5cbmxldCBjYW5hcnk7IC8vZXNsaW50LWRpc2FibGUtbGluZVxuXG5leHBvcnQgZGVmYXVsdCBDYW1lcmE7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tLmpzJztcbmltcG9ydCB7YmluZEFsbH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCBjb25maWcgZnJvbSAnLi4vLi4vdXRpbC9jb25maWcuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwLmpzJztcblxudHlwZSBPcHRpb25zID0ge1xuICAgIGNvbXBhY3Q/OiBib29sZWFuLFxuICAgIGN1c3RvbUF0dHJpYnV0aW9uPzogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPlxufTtcblxuLyoqXG4gKiBBbiBgQXR0cmlidXRpb25Db250cm9sYCBjb250cm9sIHByZXNlbnRzIHRoZSBtYXAncyBbYXR0cmlidXRpb24gaW5mb3JtYXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvaG93LW1hcGJveC13b3Jrcy9hdHRyaWJ1dGlvbi8pLlxuICogQWRkIHRoaXMgY29udHJvbCB0byBhIG1hcCB1c2luZyB7QGxpbmsgTWFwI2FkZENvbnRyb2x9LlxuICpcbiAqIEBpbXBsZW1lbnRzIHtJQ29udHJvbH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY29tcGFjdF0gSWYgYHRydWVgLCBmb3JjZSBhIGNvbXBhY3QgYXR0cmlidXRpb24gdGhhdCBzaG93cyB0aGUgZnVsbCBhdHRyaWJ1dGlvbiBvbiBtb3VzZSBob3Zlci4gSWYgYGZhbHNlYCwgZm9yY2UgdGhlIGZ1bGwgYXR0cmlidXRpb24gY29udHJvbC4gVGhlIGRlZmF1bHQgaXMgYSByZXNwb25zaXZlIGF0dHJpYnV0aW9uIHRoYXQgY29sbGFwc2VzIHdoZW4gdGhlIG1hcCBpcyBsZXNzIHRoYW4gNjQwIHBpeGVscyB3aWRlLiAqKkF0dHJpYnV0aW9uIHNob3VsZCBub3QgYmUgY29sbGFwc2VkIGlmIGl0IGNhbiBjb21mb3J0YWJseSBmaXQgb24gdGhlIG1hcC4gYGNvbXBhY3RgIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gbW9kaWZ5IGRlZmF1bHQgYXR0cmlidXRpb24gd2hlbiBtYXAgc2l6ZSBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIGZpdCBbZGVmYXVsdCBhdHRyaWJ1dGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9ob3ctbWFwYm94LXdvcmtzL2F0dHJpYnV0aW9uLykgYW5kIHdoZW4gdGhlIGF1dG9tYXRpYyBjb21wYWN0IHJlc2l6aW5nIGZvciBkZWZhdWx0IHNldHRpbmdzIGFyZSBub3Qgc3VmZmljaWVudCoqLlxuICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmc+fSBbb3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbl0gU3RyaW5nIG9yIHN0cmluZ3MgdG8gc2hvdyBpbiBhZGRpdGlvbiB0byBhbnkgb3RoZXIgYXR0cmlidXRpb25zLiBZb3UgY2FuIGFsc28gc2V0IGEgY3VzdG9tIGF0dHJpYnV0aW9uIHdoZW4gaW5pdGlhbGl6aW5nIHlvdXIgbWFwIHdpdGgge0BsaW5rIGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtcGFyYW1ldGVycyB0aGUgY3VzdG9tQXR0cmlidXRpb24gb3B0aW9ufS5cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHthdHRyaWJ1dGlvbkNvbnRyb2w6IGZhbHNlfSlcbiAqICAgICAuYWRkQ29udHJvbChuZXcgbWFwYm94Z2wuQXR0cmlidXRpb25Db250cm9sKHtcbiAqICAgICAgICAgY3VzdG9tQXR0cmlidXRpb246ICdNYXAgZGVzaWduIGJ5IG1lJ1xuICogICAgIH0pKTtcbiAqL1xuY2xhc3MgQXR0cmlidXRpb25Db250cm9sIHtcbiAgICBvcHRpb25zOiBPcHRpb25zO1xuICAgIF9tYXA6IE1hcDtcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfaW5uZXJDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9jb21wYWN0QnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBfZWRpdExpbms6ID9IVE1MQW5jaG9yRWxlbWVudDtcbiAgICBfYXR0cmliSFRNTDogc3RyaW5nO1xuICAgIHN0eWxlSWQ6IHN0cmluZztcbiAgICBzdHlsZU93bmVyOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfdG9nZ2xlQXR0cmlidXRpb24nLFxuICAgICAgICAgICAgJ191cGRhdGVFZGl0TGluaycsXG4gICAgICAgICAgICAnX3VwZGF0ZURhdGEnLFxuICAgICAgICAgICAgJ191cGRhdGVDb21wYWN0J1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiAnYm90dG9tLXJpZ2h0JztcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICBjb25zdCBjb21wYWN0ID0gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5jb21wYWN0O1xuXG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwgbWFwYm94Z2wtY3RybC1hdHRyaWInKTtcbiAgICAgICAgdGhpcy5fY29tcGFjdEJ1dHRvbiA9IERPTS5jcmVhdGUoJ2J1dHRvbicsICdtYXBib3hnbC1jdHJsLWF0dHJpYi1idXR0b24nLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICBET00uY3JlYXRlKCdzcGFuJywgYG1hcGJveGdsLWN0cmwtaWNvbmAsIHRoaXMuX2NvbXBhY3RCdXR0b24pLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCB0cnVlKTtcbiAgICAgICAgdGhpcy5fY29tcGFjdEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIHRoaXMuX2NvbXBhY3RCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl90b2dnbGVBdHRyaWJ1dGlvbik7XG4gICAgICAgIHRoaXMuX3NldEVsZW1lbnRUaXRsZSh0aGlzLl9jb21wYWN0QnV0dG9uLCAnVG9nZ2xlQXR0cmlidXRpb24nKTtcbiAgICAgICAgdGhpcy5faW5uZXJDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybC1hdHRyaWItaW5uZXInLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICB0aGlzLl9pbm5lckNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnbGlzdCcpO1xuXG4gICAgICAgIGlmIChjb21wYWN0KSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY29tcGFjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQXR0cmlidXRpb25zKCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUVkaXRMaW5rKCk7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdzdHlsZWRhdGEnLCB0aGlzLl91cGRhdGVEYXRhKTtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdzb3VyY2VkYXRhJywgdGhpcy5fdXBkYXRlRGF0YSk7XG4gICAgICAgIHRoaXMuX21hcC5vbignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZUVkaXRMaW5rKTtcblxuICAgICAgICBpZiAoY29tcGFjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ3Jlc2l6ZScsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29tcGFjdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZSgpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3N0eWxlZGF0YScsIHRoaXMuX3VwZGF0ZURhdGEpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdzb3VyY2VkYXRhJywgdGhpcy5fdXBkYXRlRGF0YSk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVFZGl0TGluayk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3Jlc2l6ZScsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpO1xuXG4gICAgICAgIHRoaXMuX21hcCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgICAgIHRoaXMuX2F0dHJpYkhUTUwgPSAodW5kZWZpbmVkOiBhbnkpO1xuICAgIH1cblxuICAgIF9zZXRFbGVtZW50VGl0bGUoZWxlbWVudDogSFRNTEVsZW1lbnQsIHRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5fbWFwLl9nZXRVSVN0cmluZyhgQXR0cmlidXRpb25Db250cm9sLiR7dGl0bGV9YCk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgc3RyKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RpdGxlJyk7XG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkKSBlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBzdHIpO1xuICAgIH1cblxuICAgIF90b2dnbGVBdHRyaWJ1dGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ21hcGJveGdsLWNvbXBhY3Qtc2hvdycpKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY29tcGFjdC1zaG93Jyk7XG4gICAgICAgICAgICB0aGlzLl9jb21wYWN0QnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNvbXBhY3Qtc2hvdycpO1xuICAgICAgICAgICAgdGhpcy5fY29tcGFjdEJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZUVkaXRMaW5rKCkge1xuICAgICAgICBsZXQgZWRpdExpbmsgPSB0aGlzLl9lZGl0TGluaztcbiAgICAgICAgaWYgKCFlZGl0TGluaykge1xuICAgICAgICAgICAgZWRpdExpbmsgPSB0aGlzLl9lZGl0TGluayA9ICh0aGlzLl9jb250YWluZXIucXVlcnlTZWxlY3RvcignLm1hcGJveC1pbXByb3ZlLW1hcCcpOiBhbnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gW1xuICAgICAgICAgICAge2tleTogJ293bmVyJywgdmFsdWU6IHRoaXMuc3R5bGVPd25lcn0sXG4gICAgICAgICAgICB7a2V5OiAnaWQnLCB2YWx1ZTogdGhpcy5zdHlsZUlkfSxcbiAgICAgICAgICAgIHtrZXk6ICdhY2Nlc3NfdG9rZW4nLCB2YWx1ZTogdGhpcy5fbWFwLl9yZXF1ZXN0TWFuYWdlci5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgY29uZmlnLkFDQ0VTU19UT0tFTn1cbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoZWRpdExpbmspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtU3RyaW5nID0gcGFyYW1zLnJlZHVjZSgoYWNjLCBuZXh0LCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5leHQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjICs9IGAke25leHQua2V5fT0ke25leHQudmFsdWV9JHtpIDwgcGFyYW1zLmxlbmd0aCAtIDEgPyAnJicgOiAnJ31gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwgYD9gKTtcbiAgICAgICAgICAgIGVkaXRMaW5rLmhyZWYgPSBgJHtjb25maWcuRkVFREJBQ0tfVVJMfS8ke3BhcmFtU3RyaW5nfSR7dGhpcy5fbWFwLl9oYXNoID8gdGhpcy5fbWFwLl9oYXNoLmdldEhhc2hTdHJpbmcodHJ1ZSkgOiAnJ31gO1xuICAgICAgICAgICAgZWRpdExpbmsucmVsID0gJ25vb3BlbmVyIG5vZm9sbG93JztcbiAgICAgICAgICAgIHRoaXMuX3NldEVsZW1lbnRUaXRsZShlZGl0TGluaywgJ01hcEZlZWRiYWNrJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlRGF0YShlOiBhbnkpIHtcbiAgICAgICAgaWYgKGUgJiYgKGUuc291cmNlRGF0YVR5cGUgPT09ICdtZXRhZGF0YScgfHwgZS5zb3VyY2VEYXRhVHlwZSA9PT0gJ3Zpc2liaWxpdHknIHx8IGUuZGF0YVR5cGUgPT09ICdzdHlsZScpKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVBdHRyaWJ1dGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVkaXRMaW5rKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlQXR0cmlidXRpb25zKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21hcC5zdHlsZSkgcmV0dXJuO1xuICAgICAgICBsZXQgYXR0cmlidXRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuX21hcC5zdHlsZS5zdHlsZXNoZWV0KSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZXNoZWV0OiBhbnkgPSB0aGlzLl9tYXAuc3R5bGUuc3R5bGVzaGVldDtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVPd25lciA9IHN0eWxlc2hlZXQub3duZXI7XG4gICAgICAgICAgICB0aGlzLnN0eWxlSWQgPSBzdHlsZXNoZWV0LmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5fbWFwLnN0eWxlLl9zb3VyY2VDYWNoZXM7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHNvdXJjZUNhY2hlc1tpZF07XG4gICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUudXNlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuYXR0cmlidXRpb24gJiYgYXR0cmlidXRpb25zLmluZGV4T2Yoc291cmNlLmF0dHJpYnV0aW9uKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRpb25zLnB1c2goc291cmNlLmF0dHJpYnV0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgYW55IGVudHJpZXMgdGhhdCBhcmUgc3Vic3RyaW5ncyBvZiBhbm90aGVyIGVudHJ5LlxuICAgICAgICAvLyBmaXJzdCBzb3J0IGJ5IGxlbmd0aCBzbyB0aGF0IHN1YnN0cmluZ3MgY29tZSBmaXJzdFxuICAgICAgICBhdHRyaWJ1dGlvbnMuc29ydCgoYSwgYikgPT4gYS5sZW5ndGggLSBiLmxlbmd0aCk7XG4gICAgICAgIGF0dHJpYnV0aW9ucyA9IGF0dHJpYnV0aW9ucy5maWx0ZXIoKGF0dHJpYiwgaSkgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgYXR0cmlidXRpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0aW9uc1tqXS5pbmRleE9mKGF0dHJpYikgPj0gMCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuY3VzdG9tQXR0cmlidXRpb24pKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRpb25zID0gWy4uLnRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbiwgLi4uYXR0cmlidXRpb25zXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRpb25zLnVuc2hpZnQodGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGF0dHJpYnV0aW9uIHN0cmluZyBpcyBkaWZmZXJlbnQgdG8gbWluaW1pemUgRE9NIGNoYW5nZXNcbiAgICAgICAgY29uc3QgYXR0cmliSFRNTCA9IGF0dHJpYnV0aW9ucy5qb2luKCcgfCAnKTtcbiAgICAgICAgaWYgKGF0dHJpYkhUTUwgPT09IHRoaXMuX2F0dHJpYkhUTUwpIHJldHVybjtcblxuICAgICAgICB0aGlzLl9hdHRyaWJIVE1MID0gYXR0cmliSFRNTDtcblxuICAgICAgICBpZiAoYXR0cmlidXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5faW5uZXJDb250YWluZXIuaW5uZXJIVE1MID0gYXR0cmliSFRNTDtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1hdHRyaWItZW1wdHknKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1hdHRyaWItZW1wdHknKTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgb2xkIERPTSBub2RlIGZyb20gX2VkaXRMaW5rXG4gICAgICAgIHRoaXMuX2VkaXRMaW5rID0gbnVsbDtcbiAgICB9XG5cbiAgICBfdXBkYXRlQ29tcGFjdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcC5nZXRDYW52YXNDb250YWluZXIoKS5vZmZzZXRXaWR0aCA8PSA2NDApIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jb21wYWN0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY29tcGFjdCcsICdtYXBib3hnbC1jb21wYWN0LXNob3cnKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBBdHRyaWJ1dGlvbkNvbnRyb2w7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tLmpzJztcblxuaW1wb3J0IHtiaW5kQWxsfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwLmpzJztcblxuLyoqXG4gKiBBIGBMb2dvQ29udHJvbGAgaXMgYSBjb250cm9sIHRoYXQgYWRkcyB0aGUgTWFwYm94IHdhdGVybWFya1xuICogdG8gdGhlIG1hcCBhcyByZXF1aXJlZCBieSB0aGUgW3Rlcm1zIG9mIHNlcnZpY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vdG9zLykgZm9yIE1hcGJveFxuICogdmVjdG9yIHRpbGVzIGFuZCBjb3JlIHN0eWxlcy5cbiAqIEFkZCB0aGlzIGNvbnRyb2wgdG8gYSBtYXAgdXNpbmcge0BsaW5rIE1hcCNhZGRDb250cm9sfS5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcHJpdmF0ZVxuKiovXG5cbmNsYXNzIExvZ29Db250cm9sIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgYmluZEFsbChbJ191cGRhdGVMb2dvJ10sIHRoaXMpO1xuICAgICAgICBiaW5kQWxsKFsnX3VwZGF0ZUNvbXBhY3QnXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybCcpO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBET00uY3JlYXRlKCdhJywgJ21hcGJveGdsLWN0cmwtbG9nbycpO1xuICAgICAgICBhbmNob3IudGFyZ2V0ID0gXCJfYmxhbmtcIjtcbiAgICAgICAgYW5jaG9yLnJlbCA9IFwibm9vcGVuZXIgbm9mb2xsb3dcIjtcbiAgICAgICAgYW5jaG9yLmhyZWYgPSBcImh0dHBzOi8vd3d3Lm1hcGJveC5jb20vXCI7XG4gICAgICAgIGFuY2hvci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoJ0xvZ29Db250cm9sLlRpdGxlJykpO1xuICAgICAgICBhbmNob3Iuc2V0QXR0cmlidXRlKFwicmVsXCIsIFwibm9vcGVuZXIgbm9mb2xsb3dcIik7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChhbmNob3IpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICB0aGlzLl9tYXAub24oJ3NvdXJjZWRhdGEnLCB0aGlzLl91cGRhdGVMb2dvKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlTG9nbygpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbigncmVzaXplJywgdGhpcy5fdXBkYXRlQ29tcGFjdCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbXBhY3QoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICB0aGlzLl9jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3NvdXJjZWRhdGEnLCB0aGlzLl91cGRhdGVMb2dvKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZigncmVzaXplJywgdGhpcy5fdXBkYXRlQ29tcGFjdCk7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFBvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gJ2JvdHRvbS1sZWZ0JztcbiAgICB9XG5cbiAgICBfdXBkYXRlTG9nbyhlOiBhbnkpIHtcbiAgICAgICAgaWYgKCFlIHx8IGUuc291cmNlRGF0YVR5cGUgPT09ICdtZXRhZGF0YScpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gdGhpcy5fbG9nb1JlcXVpcmVkKCkgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xvZ29SZXF1aXJlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXAuc3R5bGUpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLl9tYXAuc3R5bGUuX3NvdXJjZUNhY2hlcztcbiAgICAgICAgaWYgKE9iamVjdC5lbnRyaWVzKHNvdXJjZUNhY2hlcykubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUNhY2hlc1tpZF0uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KCdtYXBib3hfbG9nbycpICYmICFzb3VyY2UubWFwYm94X2xvZ28pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfdXBkYXRlQ29tcGFjdCgpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyQ2hpbGRyZW4gPSB0aGlzLl9jb250YWluZXIuY2hpbGRyZW47XG4gICAgICAgIGlmIChjb250YWluZXJDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGNvbnRhaW5lckNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgaWYgKHRoaXMuX21hcC5nZXRDYW52YXNDb250YWluZXIoKS5vZmZzZXRXaWR0aCA8IDI1MCkge1xuICAgICAgICAgICAgICAgIGFuY2hvci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jb21wYWN0Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jb21wYWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9nb0NvbnRyb2w7XG4iLCIvLyBAZmxvdyBzdHJpY3RcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuZXhwb3J0IHR5cGUgVGFza0lEID0gbnVtYmVyOyAvLyBjYW4ndCBtYXJrIG9wYXF1ZSBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb3d0eXBlL2Zsb3ctcmVtb3ZlLXR5cGVzL3B1bGwvNjFcbnR5cGUgVGFzayA9IHtcbiAgICBjYWxsYmFjazogKHRpbWVTdGFtcDogbnVtYmVyKSA9PiB2b2lkO1xuICAgIGlkOiBUYXNrSUQ7XG4gICAgY2FuY2VsbGVkOiBib29sZWFuO1xufTtcblxuY2xhc3MgVGFza1F1ZXVlIHtcbiAgICBfcXVldWU6IEFycmF5PFRhc2s+O1xuICAgIF9pZDogVGFza0lEO1xuICAgIF9jbGVhcmVkOiBib29sZWFuO1xuICAgIF9jdXJyZW50bHlSdW5uaW5nOiBBcnJheTxUYXNrPiB8IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoKSAge1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLl9pZCA9IDA7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY3VycmVudGx5UnVubmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkZChjYWxsYmFjazogKHRpbWVTdGFtcDogbnVtYmVyKSA9PiB2b2lkKTogVGFza0lEIHtcbiAgICAgICAgY29uc3QgaWQgPSArK3RoaXMuX2lkO1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgICAgICBxdWV1ZS5wdXNoKHtjYWxsYmFjaywgaWQsIGNhbmNlbGxlZDogZmFsc2V9KTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIHJlbW92ZShpZDogVGFza0lEKSB7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmcgPSB0aGlzLl9jdXJyZW50bHlSdW5uaW5nO1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHJ1bm5pbmcgPyB0aGlzLl9xdWV1ZS5jb25jYXQocnVubmluZykgOiB0aGlzLl9xdWV1ZTtcbiAgICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAodGFzay5pZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICB0YXNrLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcnVuKHRpbWVTdGFtcDogbnVtYmVyID0gMCkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuX2N1cnJlbnRseVJ1bm5pbmcpO1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMuX2N1cnJlbnRseVJ1bm5pbmcgPSB0aGlzLl9xdWV1ZTtcblxuICAgICAgICAvLyBUYXNrcyBxdWV1ZWQgYnkgY2FsbGJhY2tzIGluIHRoZSBjdXJyZW50IHF1ZXVlIHNob3VsZCBiZSBleGVjdXRlZFxuICAgICAgICAvLyBvbiB0aGUgbmV4dCBydW4sIG5vdCB0aGUgY3VycmVudCBydW4uXG4gICAgICAgIHRoaXMuX3F1ZXVlID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAodGFzay5jYW5jZWxsZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGFzay5jYWxsYmFjayh0aW1lU3RhbXApO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NsZWFyZWQpIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xlYXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jdXJyZW50bHlSdW5uaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50bHlSdW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGVhcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGFza1F1ZXVlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9nZW8vbG5nX2xhdC5qcyc7XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuXG4vKipcbiAqIEdpdmVuIGEgTG5nTGF0LCBwcmlvciBwcm9qZWN0ZWQgcG9zaXRpb24sIGFuZCBhIHRyYW5zZm9ybSwgcmV0dXJuIGEgbmV3IExuZ0xhdCBzaGlmdGVkXG4gKiBuIMOXIDM2MMKwIGVhc3Qgb3Igd2VzdCBmb3Igc29tZSBuIOKJpSAwIHN1Y2ggdGhhdDpcbiAqXG4gKiAqIHRoZSBwcm9qZWN0ZWQgbG9jYXRpb24gb2YgdGhlIHJlc3VsdCBpcyBvbiBzY3JlZW4sIGlmIHBvc3NpYmxlLCBhbmQgc2Vjb25kYXJpbHk6XG4gKiAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHByb2plY3RlZCBsb2NhdGlvbiBvZiB0aGUgcmVzdWx0IGFuZCB0aGUgcHJpb3IgcG9zaXRpb25cbiAqICAgaXMgbWluaW1pemVkLlxuICpcbiAqIFRoZSBvYmplY3QgaXMgdG8gcHJlc2VydmUgcGVyY2VpdmVkIG9iamVjdCBjb25zdGFuY3kgZm9yIFBvcHVwcyBhbmQgTWFya2VycyBhcyBtdWNoIGFzXG4gKiBwb3NzaWJsZTsgdGhleSBzaG91bGQgYXZvaWQgc2hpZnRpbmcgbGFyZ2UgZGlzdGFuY2VzIGFjcm9zcyB0aGUgc2NyZWVuLCBldmVuIHdoZW4gdGhlXG4gKiBtYXAgY2VudGVyIGNoYW5nZXMgYnkgwrEzNjDCsCBkdWUgdG8gYXV0b21hdGljIHdyYXBwaW5nLCBhbmQgd2hlbiBhYm91dCB0byBnbyBvZmYgc2NyZWVuLFxuICogc2hvdWxkIHdyYXAganVzdCBlbm91Z2ggdG8gYXZvaWQgZG9pbmcgc28uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obG5nTGF0OiBMbmdMYXQsIHByaW9yUG9zOiA/UG9pbnQsIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogTG5nTGF0IHtcbiAgICBsbmdMYXQgPSBuZXcgTG5nTGF0KGxuZ0xhdC5sbmcsIGxuZ0xhdC5sYXQpO1xuXG4gICAgLy8gRmlyc3QsIHRyeSBzaGlmdGluZyBvbmUgd29ybGQgaW4gZWl0aGVyIGRpcmVjdGlvbiwgYW5kIHNlZSBpZiBlaXRoZXIgaXMgY2xvc2VyIHRvIHRoZVxuICAgIC8vIHByaW9yIHBvc2l0aW9uLiBEb24ndCBzaGlmdCBhd2F5IGlmIGl0IG5ldyBwb3NpdGlvbiBpcyBmdXJ0aGVyIGZyb20gY2VudGVyLlxuICAgIC8vIFRoaXMgcHJlc2VydmVzIG9iamVjdCBjb25zdGFuY3kgd2hlbiB0aGUgbWFwIGNlbnRlciBpcyBhdXRvLXdyYXBwZWQgZHVyaW5nIGFuaW1hdGlvbnMsXG4gICAgLy8gYnV0IGRvbid0IGFsbG93IGl0IHRvIHJ1biBhd2F5IG9uIGhvcml6b24gKHBvaW50cyB0b3dhcmRzIGhvcml6b24gZ2V0IGNsb3NlciBhbmQgY2xvc2VyKS5cbiAgICBpZiAocHJpb3JQb3MpIHtcbiAgICAgICAgY29uc3QgbGVmdCAgPSBuZXcgTG5nTGF0KGxuZ0xhdC5sbmcgLSAzNjAsIGxuZ0xhdC5sYXQpO1xuICAgICAgICBjb25zdCByaWdodCA9IG5ldyBMbmdMYXQobG5nTGF0LmxuZyArIDM2MCwgbG5nTGF0LmxhdCk7XG4gICAgICAgIC8vIFVubGVzcyBvZmZzY3JlZW4sIGtlZXAgdGhlIG1hcmtlciB3aXRoaW4gc2FtZSB3cmFwIGRpc3RhbmNlIHRvIGNlbnRlci4gVGhpcyBpcyB0byBwcmV2ZW50XG4gICAgICAgIC8vIHJ1bm5pbmcgaXQgdG8gaW5maW5pdHkgYGxuZ2AgbmVhciBob3Jpem9uIHdoZW4gYmVhcmluZyBpcyB+OTDCsC5cbiAgICAgICAgY29uc3Qgd2l0aGluV3JhcCA9ICBNYXRoLmNlaWwoTWF0aC5hYnMobG5nTGF0LmxuZyAtIHRyYW5zZm9ybS5jZW50ZXIubG5nKSAvIDM2MCkgKiAzNjA7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdHJhbnNmb3JtLmxvY2F0aW9uUG9pbnQobG5nTGF0KS5kaXN0U3FyKHByaW9yUG9zKTtcbiAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gcHJpb3JQb3MueCA8IDAgfHwgcHJpb3JQb3MueSA8IDAgfHwgcHJpb3JQb3MueCA+IHRyYW5zZm9ybS53aWR0aCB8fCBwcmlvclBvcy55ID4gdHJhbnNmb3JtLmhlaWdodDtcbiAgICAgICAgaWYgKHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KGxlZnQpLmRpc3RTcXIocHJpb3JQb3MpIDwgZGVsdGEgJiYgKG9mZnNjcmVlbiB8fCBNYXRoLmFicyhsZWZ0LmxuZyAtIHRyYW5zZm9ybS5jZW50ZXIubG5nKSA8IHdpdGhpbldyYXApKSB7XG4gICAgICAgICAgICBsbmdMYXQgPSBsZWZ0O1xuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KHJpZ2h0KS5kaXN0U3FyKHByaW9yUG9zKSA8IGRlbHRhICYmIChvZmZzY3JlZW4gfHwgTWF0aC5hYnMocmlnaHQubG5nIC0gdHJhbnNmb3JtLmNlbnRlci5sbmcpIDwgd2l0aGluV3JhcCkpIHtcbiAgICAgICAgICAgIGxuZ0xhdCA9IHJpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2Vjb25kLCB3cmFwIHRvd2FyZCB0aGUgY2VudGVyIHVudGlsIHRoZSBuZXcgcG9zaXRpb24gaXMgb24gc2NyZWVuLCBvciB3ZSBjYW4ndCBnZXRcbiAgICAvLyBhbnkgY2xvc2VyLlxuICAgIHdoaWxlIChNYXRoLmFicyhsbmdMYXQubG5nIC0gdHJhbnNmb3JtLmNlbnRlci5sbmcpID4gMTgwKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KGxuZ0xhdCk7XG4gICAgICAgIGlmIChwb3MueCA+PSAwICYmIHBvcy55ID49IDAgJiYgcG9zLnggPD0gdHJhbnNmb3JtLndpZHRoICYmIHBvcy55IDw9IHRyYW5zZm9ybS5oZWlnaHQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsbmdMYXQubG5nID4gdHJhbnNmb3JtLmNlbnRlci5sbmcpIHtcbiAgICAgICAgICAgIGxuZ0xhdC5sbmcgLT0gMzYwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG5nTGF0LmxuZyArPSAzNjA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbG5nTGF0O1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IHR5cGUgQW5jaG9yID1cbiAgICB8ICdjZW50ZXInXG4gICAgfCAndG9wJ1xuICAgIHwgJ2JvdHRvbSdcbiAgICB8ICdsZWZ0J1xuICAgIHwgJ3JpZ2h0J1xuICAgIHwgJ3RvcC1sZWZ0J1xuICAgIHwgJ3RvcC1yaWdodCdcbiAgICB8ICdib3R0b20tbGVmdCdcbiAgICB8ICdib3R0b20tcmlnaHQnO1xuXG5leHBvcnQgY29uc3QgYW5jaG9yVHJhbnNsYXRlOiB7W186IEFuY2hvcl06IHN0cmluZ30gPSB7XG4gICAgJ2NlbnRlcic6ICd0cmFuc2xhdGUoLTUwJSwtNTAlKScsXG4gICAgJ3RvcCc6ICd0cmFuc2xhdGUoLTUwJSwwKScsXG4gICAgJ3RvcC1sZWZ0JzogJ3RyYW5zbGF0ZSgwLDApJyxcbiAgICAndG9wLXJpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwwKScsXG4gICAgJ2JvdHRvbSc6ICd0cmFuc2xhdGUoLTUwJSwtMTAwJSknLFxuICAgICdib3R0b20tbGVmdCc6ICd0cmFuc2xhdGUoMCwtMTAwJSknLFxuICAgICdib3R0b20tcmlnaHQnOiAndHJhbnNsYXRlKC0xMDAlLC0xMDAlKScsXG4gICAgJ2xlZnQnOiAndHJhbnNsYXRlKDAsLTUwJSknLFxuICAgICdyaWdodCc6ICd0cmFuc2xhdGUoLTEwMCUsLTUwJSknXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi91dGlsL2RvbS5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHNtYXJ0V3JhcCBmcm9tICcuLi91dGlsL3NtYXJ0X3dyYXAuanMnO1xuaW1wb3J0IHtiaW5kQWxsLCBleHRlbmR9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge3R5cGUgQW5jaG9yLCBhbmNob3JUcmFuc2xhdGV9IGZyb20gJy4vYW5jaG9yLmpzJztcbmltcG9ydCB7RXZlbnQsIEV2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAuanMnO1xuaW1wb3J0IHR5cGUgUG9wdXAgZnJvbSAnLi9wb3B1cC5qcyc7XG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSBcIi4uL2dlby9sbmdfbGF0LmpzXCI7XG5pbXBvcnQgdHlwZSB7TWFwTW91c2VFdmVudCwgTWFwVG91Y2hFdmVudH0gZnJvbSAnLi9ldmVudHMuanMnO1xuaW1wb3J0IHR5cGUge1BvaW50TGlrZX0gZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnQsXG4gICAgb2Zmc2V0PzogUG9pbnRMaWtlLFxuICAgIGFuY2hvcj86IEFuY2hvcixcbiAgICBjb2xvcj86IHN0cmluZyxcbiAgICBzY2FsZT86IG51bWJlcixcbiAgICBkcmFnZ2FibGU/OiBib29sZWFuLFxuICAgIGNsaWNrVG9sZXJhbmNlPzogbnVtYmVyLFxuICAgIHJvdGF0aW9uPzogbnVtYmVyLFxuICAgIHJvdGF0aW9uQWxpZ25tZW50Pzogc3RyaW5nLFxuICAgIHBpdGNoQWxpZ25tZW50Pzogc3RyaW5nXG59O1xuXG5leHBvcnQgY29uc3QgVEVSUkFJTl9PQ0NMVURFRF9PUEFDSVRZID0gMC4yO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXJrZXIgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtvcHRpb25zLmVsZW1lbnRdIERPTSBlbGVtZW50IHRvIHVzZSBhcyBhIG1hcmtlci4gVGhlIGRlZmF1bHQgaXMgYSBsaWdodCBibHVlLCBkcm9wbGV0LXNoYXBlZCBTVkcgbWFya2VyLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmFuY2hvcj0nY2VudGVyJ10gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgcGFydCBvZiB0aGUgTWFya2VyIHRoYXQgc2hvdWxkIGJlIHBvc2l0aW9uZWQgY2xvc2VzdCB0byB0aGUgY29vcmRpbmF0ZSBzZXQgdmlhIHtAbGluayBNYXJrZXIjc2V0TG5nTGF0fS5cbiAqICAgT3B0aW9ucyBhcmUgYCdjZW50ZXInYCwgYCd0b3AnYCwgYCdib3R0b20nYCwgYCdsZWZ0J2AsIGAncmlnaHQnYCwgYCd0b3AtbGVmdCdgLCBgJ3RvcC1yaWdodCdgLCBgJ2JvdHRvbS1sZWZ0J2AsIGFuZCBgJ2JvdHRvbS1yaWdodCdgLlxuICogQHBhcmFtIHtQb2ludExpa2V9IFtvcHRpb25zLm9mZnNldF0gVGhlIG9mZnNldCBpbiBwaXhlbHMgYXMgYSB7QGxpbmsgUG9pbnRMaWtlfSBvYmplY3QgdG8gYXBwbHkgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQncyBjZW50ZXIuIE5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb2xvcj0nIzNGQjFDRSddIFRoZSBjb2xvciB0byB1c2UgZm9yIHRoZSBkZWZhdWx0IG1hcmtlciBpZiBgb3B0aW9ucy5lbGVtZW50YCBpcyBub3QgcHJvdmlkZWQuIFRoZSBkZWZhdWx0IGlzIGxpZ2h0IGJsdWUuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2NhbGU9MV0gVGhlIHNjYWxlIHRvIHVzZSBmb3IgdGhlIGRlZmF1bHQgbWFya2VyIGlmIGBvcHRpb25zLmVsZW1lbnRgIGlzIG5vdCBwcm92aWRlZC4gVGhlIGRlZmF1bHQgc2NhbGUgY29ycmVzcG9uZHMgdG8gYSBoZWlnaHQgb2YgYDQxcHhgIGFuZCBhIHdpZHRoIG9mIGAyN3B4YC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZHJhZ2dhYmxlPWZhbHNlXSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBhIG1hcmtlciBpcyBhYmxlIHRvIGJlIGRyYWdnZWQgdG8gYSBuZXcgcG9zaXRpb24gb24gdGhlIG1hcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jbGlja1RvbGVyYW5jZT0wXSBUaGUgbWF4IG51bWJlciBvZiBwaXhlbHMgYSB1c2VyIGNhbiBzaGlmdCB0aGUgbW91c2UgcG9pbnRlciBkdXJpbmcgYSBjbGljayBvbiB0aGUgbWFya2VyIGZvciBpdCB0byBiZSBjb25zaWRlcmVkIGEgdmFsaWQgY2xpY2sgKGFzIG9wcG9zZWQgdG8gYSBtYXJrZXIgZHJhZykuIFRoZSBkZWZhdWx0IGlzIHRvIGluaGVyaXQgbWFwJ3MgYGNsaWNrVG9sZXJhbmNlYC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5yb3RhdGlvbj0wXSBUaGUgcm90YXRpb24gYW5nbGUgb2YgdGhlIG1hcmtlciBpbiBkZWdyZWVzLCByZWxhdGl2ZSB0byBpdHMgcmVzcGVjdGl2ZSBgcm90YXRpb25BbGlnbm1lbnRgIHNldHRpbmcuIEEgcG9zaXRpdmUgdmFsdWUgd2lsbCByb3RhdGUgdGhlIG1hcmtlciBjbG9ja3dpc2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucGl0Y2hBbGlnbm1lbnQ9J2F1dG8nXSBgbWFwYCBhbGlnbnMgdGhlIGBNYXJrZXJgIHRvIHRoZSBwbGFuZSBvZiB0aGUgbWFwLiBgdmlld3BvcnRgIGFsaWducyB0aGUgYE1hcmtlcmAgdG8gdGhlIHBsYW5lIG9mIHRoZSB2aWV3cG9ydC4gYGF1dG9gIGF1dG9tYXRpY2FsbHkgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgYHJvdGF0aW9uQWxpZ25tZW50YC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5yb3RhdGlvbkFsaWdubWVudD0nYXV0byddIGBtYXBgIGFsaWducyB0aGUgYE1hcmtlcmAncyByb3RhdGlvbiByZWxhdGl2ZSB0byB0aGUgbWFwLCBtYWludGFpbmluZyBhIGJlYXJpbmcgYXMgdGhlIG1hcCByb3RhdGVzLiBgdmlld3BvcnRgIGFsaWducyB0aGUgYE1hcmtlcmAncyByb3RhdGlvbiByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQsIGFnbm9zdGljIHRvIG1hcCByb3RhdGlvbnMuIGBhdXRvYCBpcyBlcXVpdmFsZW50IHRvIGB2aWV3cG9ydGAuXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IG1hcmtlci5cbiAqIGNvbnN0IG1hcmtlciA9IG5ldyBtYXBib3hnbC5NYXJrZXIoKVxuICogICAgIC5zZXRMbmdMYXQoWzMwLjUsIDUwLjVdKVxuICogICAgIC5hZGRUbyhtYXApO1xuICogQGV4YW1wbGVcbiAqIC8vIFNldCBtYXJrZXIgb3B0aW9ucy5cbiAqIGNvbnN0IG1hcmtlciA9IG5ldyBtYXBib3hnbC5NYXJrZXIoe1xuICogICAgIGNvbG9yOiBcIiNGRkZGRkZcIixcbiAqICAgICBkcmFnZ2FibGU6IHRydWVcbiAqIH0pLnNldExuZ0xhdChbMzAuNSwgNTAuNV0pXG4gKiAgICAgLmFkZFRvKG1hcCk7XG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgY3VzdG9tIGljb25zIHdpdGggTWFya2Vyc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jdXN0b20tbWFya2VyLWljb25zLylcbiAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIGRyYWdnYWJsZSBNYXJrZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLW1hcmtlci8pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcmtlciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfYW5jaG9yOiBBbmNob3I7XG4gICAgX29mZnNldDogUG9pbnQ7XG4gICAgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIF9wb3B1cDogP1BvcHVwO1xuICAgIF9sbmdMYXQ6IExuZ0xhdDtcbiAgICBfcG9zOiA/UG9pbnQ7XG4gICAgX2NvbG9yOiBzdHJpbmc7XG4gICAgX3NjYWxlOiBudW1iZXI7XG4gICAgX2RlZmF1bHRNYXJrZXI6IGJvb2xlYW47XG4gICAgX2RyYWdnYWJsZTogYm9vbGVhbjtcbiAgICBfY2xpY2tUb2xlcmFuY2U6IG51bWJlcjtcbiAgICBfaXNEcmFnZ2luZzogYm9vbGVhbjtcbiAgICBfc3RhdGU6ICdpbmFjdGl2ZScgfCAncGVuZGluZycgfCAnYWN0aXZlJzsgLy8gdXNlZCBmb3IgaGFuZGxpbmcgZHJhZyBldmVudHNcbiAgICBfcG9zaXRpb25EZWx0YTogP1BvaW50O1xuICAgIF9wb2ludGVyZG93blBvczogP1BvaW50O1xuICAgIF9yb3RhdGlvbjogbnVtYmVyO1xuICAgIF9waXRjaEFsaWdubWVudDogc3RyaW5nO1xuICAgIF9yb3RhdGlvbkFsaWdubWVudDogc3RyaW5nO1xuICAgIF9vcmlnaW5hbFRhYkluZGV4OiA/c3RyaW5nOyAvLyBvcmlnaW5hbCB0YWJpbmRleCBvZiBfZWxlbWVudFxuICAgIF9mYWRlVGltZXI6ID9UaW1lb3V0SUQ7XG4gICAgX3VwZGF0ZUZyYW1lSWQ6IG51bWJlcjtcbiAgICBfdXBkYXRlTW92aW5nOiAoKSA9PiB2b2lkO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9wdGlvbnMsIGxlZ2FjeU9wdGlvbnM/OiBPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IC0tIHRoZSBjb25zdHJ1Y3RvciB1c2VkIHRvIGFjY2VwdCB0aGUgZWxlbWVudCBhcyBhXG4gICAgICAgIC8vIHJlcXVpcmVkIGZpcnN0IGFyZ3VtZW50LCBiZWZvcmUgaXQgd2FzIG1hZGUgb3B0aW9uYWwuXG4gICAgICAgIGlmIChvcHRpb25zIGluc3RhbmNlb2Ygd2luZG93LkhUTUxFbGVtZW50IHx8IGxlZ2FjeU9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBleHRlbmQoe2VsZW1lbnQ6IG9wdGlvbnN9LCBsZWdhY3lPcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ191cGRhdGUnLFxuICAgICAgICAgICAgJ19vbk1vdmUnLFxuICAgICAgICAgICAgJ19vblVwJyxcbiAgICAgICAgICAgICdfYWRkRHJhZ0hhbmRsZXInLFxuICAgICAgICAgICAgJ19vbk1hcENsaWNrJyxcbiAgICAgICAgICAgICdfb25LZXlQcmVzcycsXG4gICAgICAgICAgICAnX2NsZWFyRmFkZVRpbWVyJ1xuICAgICAgICBdLCB0aGlzKTtcblxuICAgICAgICB0aGlzLl9hbmNob3IgPSBvcHRpb25zICYmIG9wdGlvbnMuYW5jaG9yIHx8ICdjZW50ZXInO1xuICAgICAgICB0aGlzLl9jb2xvciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb2xvciB8fCAnIzNGQjFDRSc7XG4gICAgICAgIHRoaXMuX3NjYWxlID0gb3B0aW9ucyAmJiBvcHRpb25zLnNjYWxlIHx8IDE7XG4gICAgICAgIHRoaXMuX2RyYWdnYWJsZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5kcmFnZ2FibGUgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gb3B0aW9ucyAmJiBvcHRpb25zLmNsaWNrVG9sZXJhbmNlIHx8IDA7XG4gICAgICAgIHRoaXMuX2lzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSAnaW5hY3RpdmUnO1xuICAgICAgICB0aGlzLl9yb3RhdGlvbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5yb3RhdGlvbiB8fCAwO1xuICAgICAgICB0aGlzLl9yb3RhdGlvbkFsaWdubWVudCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5yb3RhdGlvbkFsaWdubWVudCB8fCAnYXV0byc7XG4gICAgICAgIHRoaXMuX3BpdGNoQWxpZ25tZW50ID0gb3B0aW9ucyAmJiBvcHRpb25zLnBpdGNoQWxpZ25tZW50ICYmIG9wdGlvbnMucGl0Y2hBbGlnbm1lbnQgIT09ICdhdXRvJyA/ICBvcHRpb25zLnBpdGNoQWxpZ25tZW50IDogdGhpcy5fcm90YXRpb25BbGlnbm1lbnQ7XG4gICAgICAgIHRoaXMuX3VwZGF0ZU1vdmluZyA9ICgpID0+IHRoaXMuX3VwZGF0ZSh0cnVlKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMuZWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZGVmYXVsdE1hcmtlciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50ID0gRE9NLmNyZWF0ZSgnZGl2Jyk7XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBkZWZhdWx0IG1hcCBtYXJrZXIgU1ZHXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0SGVpZ2h0ID0gNDE7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0V2lkdGggPSAyNztcblxuICAgICAgICAgICAgY29uc3Qgc3ZnID0gRE9NLmNyZWF0ZVNWRygnc3ZnJywge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBgJHtkZWZhdWx0SGVpZ2h0ICogdGhpcy5fc2NhbGV9cHhgLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBgJHtkZWZhdWx0V2lkdGggKiB0aGlzLl9zY2FsZX1weGAsXG4gICAgICAgICAgICAgICAgdmlld0JveDogYDAgMCAke2RlZmF1bHRXaWR0aH0gJHtkZWZhdWx0SGVpZ2h0fWBcbiAgICAgICAgICAgIH0sIHRoaXMuX2VsZW1lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBncmFkaWVudCA9IERPTS5jcmVhdGVTVkcoJ3JhZGlhbEdyYWRpZW50Jywge2lkOiAnc2hhZG93R3JhZGllbnQnfSwgRE9NLmNyZWF0ZVNWRygnZGVmcycsIHt9LCBzdmcpKTtcbiAgICAgICAgICAgIERPTS5jcmVhdGVTVkcoJ3N0b3AnLCB7b2Zmc2V0OiAnMTAlJywgJ3N0b3Atb3BhY2l0eSc6IDAuNH0sIGdyYWRpZW50KTtcbiAgICAgICAgICAgIERPTS5jcmVhdGVTVkcoJ3N0b3AnLCB7b2Zmc2V0OiAnMTAwJScsICdzdG9wLW9wYWNpdHknOiAwLjA1fSwgZ3JhZGllbnQpO1xuICAgICAgICAgICAgRE9NLmNyZWF0ZVNWRygnZWxsaXBzZScsIHtjeDogMTMuNSwgY3k6IDM0LjgsIHJ4OiAxMC41LCByeTogNS4yNSwgZmlsbDogJ3VybCgjc2hhZG93R3JhZGllbnQpJ30sIHN2Zyk7IC8vIHNoYWRvd1xuXG4gICAgICAgICAgICBET00uY3JlYXRlU1ZHKCdwYXRoJywgeyAvLyBtYXJrZXIgc2hhcGVcbiAgICAgICAgICAgICAgICBmaWxsOiB0aGlzLl9jb2xvcixcbiAgICAgICAgICAgICAgICBkOiAnTTI3LDEzLjVDMjcsMTkuMDcgMjAuMjUsMjcgMTQuNzUsMzQuNUMxNC4wMiwzNS41IDEyLjk4LDM1LjUgMTIuMjUsMzQuNUM2Ljc1LDI3IDAsMTkuMjIgMCwxMy41QzAsNi4wNCA2LjA0LDAgMTMuNSwwQzIwLjk2LDAgMjcsNi4wNCAyNywxMy41WidcbiAgICAgICAgICAgIH0sIHN2Zyk7XG4gICAgICAgICAgICBET00uY3JlYXRlU1ZHKCdwYXRoJywgeyAvLyBib3JkZXJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjI1LFxuICAgICAgICAgICAgICAgIGQ6ICdNMTMuNSwwQzYuMDQsMCAwLDYuMDQgMCwxMy41QzAsMTkuMjIgNi43NSwyNyAxMi4yNSwzNC41QzEzLDM1LjUyIDE0LjAyLDM1LjUgMTQuNzUsMzQuNUMyMC4yNSwyNyAyNywxOS4wNyAyNywxMy41QzI3LDYuMDQgMjAuOTYsMCAxMy41LDBaTTEzLjUsMUMyMC40MiwxIDI2LDYuNTggMjYsMTMuNUMyNiwxNS45IDI0LjUsMTkuMTggMjIuMjIsMjIuNzRDMTkuOTUsMjYuMyAxNi43MSwzMC4xNCAxMy45NCwzMy45MUMxMy43NCwzNC4xOCAxMy42MSwzNC4zMiAxMy41LDM0LjQ0QzEzLjM5LDM0LjMyIDEzLjI2LDM0LjE4IDEzLjA2LDMzLjkxQzEwLjI4LDMwLjEzIDcuNDEsMjYuMzEgNS4wMiwyMi43N0MyLjYyLDE5LjIzIDEsMTUuOTUgMSwxMy41QzEsNi41OCA2LjU4LDEgMTMuNSwxWidcbiAgICAgICAgICAgIH0sIHN2Zyk7XG5cbiAgICAgICAgICAgIERPTS5jcmVhdGVTVkcoJ2NpcmNsZScsIHtmaWxsOiAnd2hpdGUnLCBjeDogMTMuNSwgY3k6IDEzLjUsIHI6IDUuNX0sIHN2Zyk7IC8vIGNpcmNsZVxuXG4gICAgICAgICAgICAvLyBpZiBubyBlbGVtZW50IGFuZCBubyBvZmZzZXQgb3B0aW9uIGdpdmVuIGFwcGx5IGFuIG9mZnNldCBmb3IgdGhlIGRlZmF1bHQgbWFya2VyXG4gICAgICAgICAgICAvLyB0aGUgLTE0IGFzIHRoZSB5IHZhbHVlIG9mIHRoZSBkZWZhdWx0IG1hcmtlciBvZmZzZXQgd2FzIGRldGVybWluZWQgYXMgZm9sbG93c1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIHRoZSBtYXJrZXIgdGlwIGlzIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHNoYWRvdyBlbGxpcHNlIGZyb20gdGhlIGRlZmF1bHQgc3ZnXG4gICAgICAgICAgICAvLyB0aGUgeSB2YWx1ZSBvZiB0aGUgY2VudGVyIG9mIHRoZSBzaGFkb3cgZWxsaXBzZSByZWxhdGl2ZSB0byB0aGUgc3ZnIHRvcCBsZWZ0IGlzIDM0LjhcbiAgICAgICAgICAgIC8vIG9mZnNldCB0byB0aGUgc3ZnIGNlbnRlciBcImhlaWdodCAoNDEgLyAyKVwiIGdpdmVzIDM0LjggLSAoNDEgLyAyKSBhbmQgcm91bmRlZCBmb3IgYW4gaW50ZWdlciBwaXhlbCBvZmZzZXQgZ2l2ZXMgMTRcbiAgICAgICAgICAgIC8vIG5lZ2F0aXZlIGlzIHVzZWQgdG8gbW92ZSB0aGUgbWFya2VyIHVwIGZyb20gdGhlIGNlbnRlciBzbyB0aGUgdGlwIGlzIGF0IHRoZSBNYXJrZXIgbG5nTGF0XG4gICAgICAgICAgICB0aGlzLl9vZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMgJiYgb3B0aW9ucy5vZmZzZXQgfHwgWzAsIC0xNF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IFBvaW50LmNvbnZlcnQob3B0aW9ucyAmJiBvcHRpb25zLm9mZnNldCB8fCBbMCwgMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50Lmhhc0F0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpKSB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdNYXAgbWFya2VyJyk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtbWFya2VyJyk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgKGU6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gcHJldmVudCBmb2N1c2luZyBvbiBjbGlja1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGFuY2hvclRyYW5zbGF0ZSkge1xuICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShgbWFwYm94Z2wtbWFya2VyLWFuY2hvci0ke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjbGFzc0xpc3QuYWRkKGBtYXBib3hnbC1tYXJrZXItYW5jaG9yLSR7dGhpcy5fYW5jaG9yfWApO1xuXG4gICAgICAgIHRoaXMuX3BvcHVwID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyB0aGUgYE1hcmtlcmAgdG8gYSBgTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXBib3ggR0wgSlMgbWFwIHRvIGFkZCB0aGUgbWFya2VyIHRvLlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBtYXJrZXIgPSBuZXcgbWFwYm94Z2wuTWFya2VyKClcbiAgICAgKiAgICAgLnNldExuZ0xhdChbMzAuNSwgNTAuNV0pXG4gICAgICogICAgIC5hZGRUbyhtYXApOyAvLyBhZGQgdGhlIG1hcmtlciB0byB0aGUgbWFwXG4gICAgICovXG4gICAgYWRkVG8obWFwOiBNYXApIHtcbiAgICAgICAgaWYgKG1hcCA9PT0gdGhpcy5fbWFwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIG1hcC5nZXRDYW52YXNDb250YWluZXIoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgbWFwLm9uKCdtb3ZlJywgdGhpcy5fdXBkYXRlTW92aW5nKTtcbiAgICAgICAgbWFwLm9uKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgbWFwLm9uKCdyZW1vdmUnLCB0aGlzLl9jbGVhckZhZGVUaW1lcik7XG4gICAgICAgIG1hcC5fYWRkTWFya2VyKHRoaXMpO1xuICAgICAgICB0aGlzLnNldERyYWdnYWJsZSh0aGlzLl9kcmFnZ2FibGUpO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgICAgICAvLyBJZiB3ZSBhdHRhY2hlZCB0aGUgYGNsaWNrYCBsaXN0ZW5lciB0byB0aGUgbWFya2VyIGVsZW1lbnQsIHRoZSBwb3B1cFxuICAgICAgICAvLyB3b3VsZCBjbG9zZSBvbmNlIHRoZSBldmVudCBwcm9wb2dhdGVkIHRvIGBtYXBgIGR1ZSB0byB0aGVcbiAgICAgICAgLy8gYFBvcHVwI19vbkNsaWNrQ2xvc2VgIGxpc3RlbmVyLlxuICAgICAgICB0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fb25NYXBDbGljayk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbWFya2VyIGZyb20gYSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IG1hcmtlciA9IG5ldyBtYXBib3hnbC5NYXJrZXIoKS5hZGRUbyhtYXApO1xuICAgICAqIG1hcmtlci5yZW1vdmUoKTtcbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqL1xuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignY2xpY2snLCB0aGlzLl9vbk1hcENsaWNrKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmUnLCB0aGlzLl91cGRhdGVNb3ZpbmcpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3VzZWRvd24nLCB0aGlzLl9hZGREcmFnSGFuZGxlcik7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCd0b3VjaHN0YXJ0JywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW91c2V1cCcsIHRoaXMuX29uVXApO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigndG91Y2hlbmQnLCB0aGlzLl9vblVwKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZigncmVtb3ZlJywgdGhpcy5fY2xlYXJGYWRlVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLl9yZW1vdmVNYXJrZXIodGhpcyk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbWFwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsZWFyRmFkZVRpbWVyKCk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCkgdGhpcy5fcG9wdXAucmVtb3ZlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWFya2VyJ3MgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uLlxuICAgICAqXG4gICAgICogVGhlIGxvbmdpdHVkZSBvZiB0aGUgcmVzdWx0IG1heSBkaWZmZXIgYnkgYSBtdWx0aXBsZSBvZiAzNjAgZGVncmVlcyBmcm9tIHRoZSBsb25naXR1ZGUgcHJldmlvdXNseVxuICAgICAqIHNldCBieSBgc2V0TG5nTGF0YCBiZWNhdXNlIGBNYXJrZXJgIHdyYXBzIHRoZSBhbmNob3IgbG9uZ2l0dWRlIGFjcm9zcyBjb3BpZXMgb2YgdGhlIHdvcmxkIHRvIGtlZXBcbiAgICAgKiB0aGUgbWFya2VyIG9uIHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IEEge0BsaW5rIExuZ0xhdH0gZGVzY3JpYmluZyB0aGUgbWFya2VyJ3MgbG9jYXRpb24uXG4gICAgKiBAZXhhbXBsZVxuICAgICogLy8gU3RvcmUgdGhlIG1hcmtlcidzIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgY29vcmRpbmF0ZXMgaW4gYSB2YXJpYWJsZVxuICAgICogY29uc3QgbG5nTGF0ID0gbWFya2VyLmdldExuZ0xhdCgpO1xuICAgICogLy8gUHJpbnQgdGhlIG1hcmtlcidzIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgdmFsdWVzIGluIHRoZSBjb25zb2xlXG4gICAgKiBjb25zb2xlLmxvZyhgTG9uZ2l0dWRlOiAke2xuZ0xhdC5sbmd9LCBMYXRpdHVkZTogJHtsbmdMYXQubGF0fWApO1xuICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgZHJhZ2dhYmxlIE1hcmtlcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLW1hcmtlci8pXG4gICAgKi9cbiAgICBnZXRMbmdMYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sbmdMYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBTZXQgdGhlIG1hcmtlcidzIGdlb2dyYXBoaWNhbCBwb3NpdGlvbiBhbmQgbW92ZSBpdC5cbiAgICAgKlxuICAgICogQHBhcmFtIHtMbmdMYXR9IGxuZ2xhdCBBIHtAbGluayBMbmdMYXR9IGRlc2NyaWJpbmcgd2hlcmUgdGhlIG1hcmtlciBzaG91bGQgYmUgbG9jYXRlZC5cbiAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgKiBAZXhhbXBsZVxuICAgICogLy8gQ3JlYXRlIGEgbmV3IG1hcmtlciwgc2V0IHRoZSBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLCBhbmQgYWRkIGl0IHRvIHRoZSBtYXAuXG4gICAgKiBuZXcgbWFwYm94Z2wuTWFya2VyKClcbiAgICAqICAgICAuc2V0TG5nTGF0KFstNjUuMDE3LCAtMTYuNDU3XSlcbiAgICAqICAgICAuYWRkVG8obWFwKTtcbiAgICAqIEBzZWUgW0V4YW1wbGU6IEFkZCBjdXN0b20gaWNvbnMgd2l0aCBNYXJrZXJzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jdXN0b20tbWFya2VyLWljb25zLylcbiAgICAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIGRyYWdnYWJsZSBNYXJrZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1tYXJrZXIvKVxuICAgICogQHNlZSBbRXhhbXBsZTogQWRkIGEgbWFya2VyIHVzaW5nIGEgcGxhY2UgbmFtZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbWFya2VyLWZyb20tZ2VvY29kZS8pXG4gICAgKi9cbiAgICBzZXRMbmdMYXQobG5nbGF0OiBMbmdMYXRMaWtlKSB7XG4gICAgICAgIHRoaXMuX2xuZ0xhdCA9IExuZ0xhdC5jb252ZXJ0KGxuZ2xhdCk7XG4gICAgICAgIHRoaXMuX3BvcyA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCkgdGhpcy5fcG9wdXAuc2V0TG5nTGF0KHRoaXMuX2xuZ0xhdCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYE1hcmtlcmAncyBIVE1MIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IFJldHVybnMgdGhlIG1hcmtlciBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgZWxlbWVudCA9IG1hcmtlci5nZXRFbGVtZW50KCk7XG4gICAgICovXG4gICAgZ2V0RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmluZHMgYSB7QGxpbmsgUG9wdXB9IHRvIHRoZSB7QGxpbmsgTWFya2VyfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9wdXAgfCBudWxsfSBwb3B1cCBBbiBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIFBvcHVwfSBjbGFzcy4gSWYgdW5kZWZpbmVkIG9yIG51bGwsIGFueSBwb3B1cFxuICAgICAqIHNldCBvbiB0aGlzIHtAbGluayBNYXJrZXJ9IGluc3RhbmNlIGlzIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBtYXJrZXIgPSBuZXcgbWFwYm94Z2wuTWFya2VyKClcbiAgICAgKiAgICAgLnNldExuZ0xhdChbMCwgMF0pXG4gICAgICogICAgIC5zZXRQb3B1cChuZXcgbWFwYm94Z2wuUG9wdXAoKS5zZXRIVE1MKFwiPGgxPkhlbGxvIFdvcmxkITwvaDE+XCIpKSAvLyBhZGQgcG9wdXBcbiAgICAgKiAgICAgLmFkZFRvKG1hcCk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogQXR0YWNoIGEgcG9wdXAgdG8gYSBtYXJrZXIgaW5zdGFuY2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NldC1wb3B1cC8pXG4gICAgICovXG4gICAgc2V0UG9wdXAocG9wdXA6ID9Qb3B1cCkge1xuICAgICAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCB0aGlzLl9vbktleVByZXNzKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9vcmlnaW5hbFRhYkluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9wdXApIHtcbiAgICAgICAgICAgIGlmICghKCdvZmZzZXQnIGluIHBvcHVwLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya2VySGVpZ2h0ID0gNDEgLSAoNS44IC8gMik7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya2VyUmFkaXVzID0gMTMuNTtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lYXJPZmZzZXQgPSBNYXRoLnNxcnQoTWF0aC5wb3cobWFya2VyUmFkaXVzLCAyKSAvIDIpO1xuICAgICAgICAgICAgICAgIHBvcHVwLm9wdGlvbnMub2Zmc2V0ID0gdGhpcy5fZGVmYXVsdE1hcmtlciA/IHtcbiAgICAgICAgICAgICAgICAgICAgJ3RvcCc6IFswLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgJ3RvcC1sZWZ0JzogWzAsIDBdLFxuICAgICAgICAgICAgICAgICAgICAndG9wLXJpZ2h0JzogWzAsIDBdLFxuICAgICAgICAgICAgICAgICAgICAnYm90dG9tJzogWzAsIC1tYXJrZXJIZWlnaHRdLFxuICAgICAgICAgICAgICAgICAgICAnYm90dG9tLWxlZnQnOiBbbGluZWFyT2Zmc2V0LCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzICsgbGluZWFyT2Zmc2V0KSAqIC0xXSxcbiAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCc6IFstbGluZWFyT2Zmc2V0LCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzICsgbGluZWFyT2Zmc2V0KSAqIC0xXSxcbiAgICAgICAgICAgICAgICAgICAgJ2xlZnQnOiBbbWFya2VyUmFkaXVzLCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzKSAqIC0xXSxcbiAgICAgICAgICAgICAgICAgICAgJ3JpZ2h0JzogWy1tYXJrZXJSYWRpdXMsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMpICogLTFdXG4gICAgICAgICAgICAgICAgfSA6IHRoaXMuX29mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BvcHVwID0gcG9wdXA7XG4gICAgICAgICAgICBpZiAodGhpcy5fbG5nTGF0KSB0aGlzLl9wb3B1cC5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KTtcblxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYnV0dG9uJyk7XG4gICAgICAgICAgICB0aGlzLl9vcmlnaW5hbFRhYkluZGV4ID0gdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX29yaWdpbmFsVGFiSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIHRoaXMuX29uS2V5UHJlc3MpO1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9vbktleVByZXNzKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgY29uc3QgY29kZSA9IGUuY29kZTtcbiAgICAgICAgY29uc3QgbGVnYWN5Q29kZSA9IGUuY2hhckNvZGUgfHwgZS5rZXlDb2RlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChjb2RlID09PSAnU3BhY2UnKSB8fCAoY29kZSA9PT0gJ0VudGVyJykgfHxcbiAgICAgICAgICAgIChsZWdhY3lDb2RlID09PSAzMikgfHwgKGxlZ2FjeUNvZGUgPT09IDEzKSAvLyBzcGFjZSBvciBlbnRlclxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUG9wdXAoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbk1hcENsaWNrKGU6IE1hcE1vdXNlRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGUub3JpZ2luYWxFdmVudC50YXJnZXQ7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCAmJiAodGFyZ2V0RWxlbWVudCA9PT0gZWxlbWVudCB8fCBlbGVtZW50LmNvbnRhaW5zKCh0YXJnZXRFbGVtZW50OiBhbnkpKSkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUG9wdXAoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBQb3B1cH0gaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byB0aGUge0BsaW5rIE1hcmtlcn0uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IFJldHVybnMgdGhlIHBvcHVwLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbWFya2VyID0gbmV3IG1hcGJveGdsLk1hcmtlcigpXG4gICAgICogICAgIC5zZXRMbmdMYXQoWzAsIDBdKVxuICAgICAqICAgICAuc2V0UG9wdXAobmV3IG1hcGJveGdsLlBvcHVwKCkuc2V0SFRNTChcIjxoMT5IZWxsbyBXb3JsZCE8L2gxPlwiKSlcbiAgICAgKiAgICAgLmFkZFRvKG1hcCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhtYXJrZXIuZ2V0UG9wdXAoKSk7IC8vIHJldHVybiB0aGUgcG9wdXAgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBnZXRQb3B1cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcHVwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIG9yIGNsb3NlcyB0aGUge0BsaW5rIFBvcHVwfSBpbnN0YW5jZSB0aGF0IGlzIGJvdW5kIHRvIHRoZSB7QGxpbmsgTWFya2VyfSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB7QGxpbmsgUG9wdXB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMge01hcmtlcn0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IG1hcmtlciA9IG5ldyBtYXBib3hnbC5NYXJrZXIoKVxuICAgICAqICAgICAuc2V0TG5nTGF0KFswLCAwXSlcbiAgICAgKiAgICAgLnNldFBvcHVwKG5ldyBtYXBib3hnbC5Qb3B1cCgpLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIikpXG4gICAgICogICAgIC5hZGRUbyhtYXApO1xuICAgICAqXG4gICAgICogbWFya2VyLnRvZ2dsZVBvcHVwKCk7IC8vIHRvZ2dsZSBwb3B1cCBvcGVuIG9yIGNsb3NlZFxuICAgICAqL1xuICAgIHRvZ2dsZVBvcHVwKCkge1xuICAgICAgICBjb25zdCBwb3B1cCA9IHRoaXMuX3BvcHVwO1xuICAgICAgICBpZiAoIXBvcHVwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIGlmIChwb3B1cC5pc09wZW4oKSkge1xuICAgICAgICAgICAgcG9wdXAucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9wdXAuYWRkVG8odGhpcy5fbWFwKTtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfZXZhbHVhdGVPcGFjaXR5KCkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuX3BvcyA/IHRoaXMuX3Bvcy5zdWIodGhpcy5fdHJhbnNmb3JtZWRPZmZzZXQoKSkgOiBudWxsO1xuXG4gICAgICAgIGlmICghdGhpcy5fd2l0aGluU2NyZWVuQm91bmRzKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5fY2xlYXJGYWRlVGltZXIoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcExvY2F0aW9uID0gdGhpcy5fbWFwLnVucHJvamVjdChwb3NpdGlvbik7XG5cbiAgICAgICAgbGV0IHRlcnJhaW5PY2NsdWRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fbWFwLnRyYW5zZm9ybS5fdGVycmFpbkVuYWJsZWQoKSAmJiB0aGlzLl9tYXAuZ2V0VGVycmFpbigpKSB7XG4gICAgICAgICAgICBjb25zdCBjYW1lcmEgPSB0aGlzLl9tYXAuZ2V0RnJlZUNhbWVyYU9wdGlvbnMoKTtcbiAgICAgICAgICAgIGlmIChjYW1lcmEucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFQb3MgPSBjYW1lcmEucG9zaXRpb24udG9MbmdMYXQoKTtcbiAgICAgICAgICAgICAgICAvLyB0aGUgZGlzdGFuY2UgdG8gdGhlIG1hcmtlciBsYXQvbG5nICsgbWFya2VyIG9mZnNldCBsb2NhdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldERpc3RhbmNlID0gY2FtZXJhUG9zLmRpc3RhbmNlVG8obWFwTG9jYXRpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gY2FtZXJhUG9zLmRpc3RhbmNlVG8odGhpcy5fbG5nTGF0KTtcbiAgICAgICAgICAgICAgICB0ZXJyYWluT2NjbHVkZWQgPSBvZmZzZXREaXN0YW5jZSA8IGRpc3RhbmNlICogMC45O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9nT3BhY2l0eSA9IHRoaXMuX21hcC5fcXVlcnlGb2dPcGFjaXR5KG1hcExvY2F0aW9uKTtcbiAgICAgICAgY29uc3Qgb3BhY2l0eSA9ICgxLjAgLSBmb2dPcGFjaXR5KSAqICh0ZXJyYWluT2NjbHVkZWQgPyBURVJSQUlOX09DQ0xVREVEX09QQUNJVFkgOiAxLjApO1xuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm9wYWNpdHkgPSBgJHtvcGFjaXR5fWA7XG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCkgdGhpcy5fcG9wdXAuX3NldE9wYWNpdHkoYCR7b3BhY2l0eX1gKTtcblxuICAgICAgICB0aGlzLl9mYWRlVGltZXIgPSBudWxsO1xuICAgIH1cblxuICAgIF9jbGVhckZhZGVUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZhZGVUaW1lcikge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2ZhZGVUaW1lcik7XG4gICAgICAgICAgICB0aGlzLl9mYWRlVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3dpdGhpblNjcmVlbkJvdW5kcyhwb3NpdGlvbjogP1BvaW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5fbWFwLnRyYW5zZm9ybTtcbiAgICAgICAgcmV0dXJuICEhcG9zaXRpb24gJiZcbiAgICAgICAgICAgIHBvc2l0aW9uLnggPj0gMCAmJiBwb3NpdGlvbi54IDwgdHIud2lkdGggJiZcbiAgICAgICAgICAgIHBvc2l0aW9uLnkgPj0gMCAmJiBwb3NpdGlvbi55IDwgdHIuaGVpZ2h0O1xuICAgIH1cblxuICAgIF91cGRhdGVET00oKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuX3BvcyB8fCBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICAgIGNvbnN0IHBpdGNoID0gdGhpcy5fY2FsY3VsYXRlUGl0Y2goKTtcbiAgICAgICAgY29uc3Qgcm90YXRpb24gID0gdGhpcy5fY2FsY3VsYXRlUm90YXRpb24oKTtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgJHthbmNob3JUcmFuc2xhdGVbdGhpcy5fYW5jaG9yXX0gdHJhbnNsYXRlKCR7cG9zLnh9cHgsICR7cG9zLnl9cHgpIHJvdGF0ZVgoJHtwaXRjaH1kZWcpIHJvdGF0ZVooJHtyb3RhdGlvbn1kZWcpYDtcbiAgICB9XG5cbiAgICBfY2FsY3VsYXRlUGl0Y2goKSB7XG4gICAgICAgIGlmICh0aGlzLl9waXRjaEFsaWdubWVudCA9PT0gXCJ2aWV3cG9ydFwiIHx8IHRoaXMuX3BpdGNoQWxpZ25tZW50ID09PSBcImF1dG9cIikge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gaWYgKHRoaXMuX3BpdGNoQWxpZ25tZW50ID09PSBcIm1hcFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmdldFBpdGNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgX2NhbGN1bGF0ZVJvdGF0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fcm90YXRpb25BbGlnbm1lbnQgPT09IFwidmlld3BvcnRcIiB8fCB0aGlzLl9yb3RhdGlvbkFsaWdubWVudCA9PT0gXCJhdXRvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb3RhdGlvbjtcbiAgICAgICAgfSBpZiAodGhpcy5fcm90YXRpb25BbGlnbm1lbnQgPT09IFwibWFwXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb3RhdGlvbiAtIHRoaXMuX21hcC5nZXRCZWFyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgX3VwZGF0ZShkZWxheVNuYXA/OiBib29sZWFuKSB7XG4gICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl91cGRhdGVGcmFtZUlkKTtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXApIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fbWFwLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllcykge1xuICAgICAgICAgICAgdGhpcy5fbG5nTGF0ID0gc21hcnRXcmFwKHRoaXMuX2xuZ0xhdCwgdGhpcy5fcG9zLCB0aGlzLl9tYXAudHJhbnNmb3JtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BvcyA9IHRoaXMuX21hcC5wcm9qZWN0KHRoaXMuX2xuZ0xhdCkuX2FkZCh0aGlzLl90cmFuc2Zvcm1lZE9mZnNldCgpKTtcblxuICAgICAgICAvLyBiZWNhdXNlIHJvdW5kaW5nIHRoZSBjb29yZGluYXRlcyBhdCBldmVyeSBgbW92ZWAgZXZlbnQgY2F1c2VzIHN0dXR0ZXJlZCB6b29taW5nXG4gICAgICAgIC8vIHdlIG9ubHkgcm91bmQgdGhlbSB3aGVuIF91cGRhdGUgaXMgY2FsbGVkIHdpdGggYG1vdmVlbmRgIG9yIHdoZW4gaXRzIGNhbGxlZCB3aXRoXG4gICAgICAgIC8vIG5vIGFyZ3VtZW50cyAod2hlbiB0aGUgTWFya2VyIGlzIGluaXRpYWxpemVkIG9yIE1hcmtlciNzZXRMbmdMYXQgaXMgaW52b2tlZCkuXG4gICAgICAgIGlmIChkZWxheVNuYXAgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUZyYW1lSWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCAmJiB0aGlzLl9wb3MgJiYgdGhpcy5fYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcyA9IHRoaXMuX3Bvcy5yb3VuZCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVET00oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcyA9IHRoaXMuX3Bvcy5yb3VuZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbWFwLl9yZXF1ZXN0RG9tVGFzaygoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX21hcCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCAmJiB0aGlzLl9wb3MgJiYgdGhpcy5fYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlRE9NKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgodGhpcy5fbWFwLmdldFRlcnJhaW4oKSB8fCB0aGlzLl9tYXAuZ2V0Rm9nKCkpICYmICF0aGlzLl9mYWRlVGltZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mYWRlVGltZXIgPSBzZXRUaW1lb3V0KHRoaXMuX2V2YWx1YXRlT3BhY2l0eS5iaW5kKHRoaXMpLCA2MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgaW5pdGlhbGx5IGFkZGVkIHRvIGZpeCB0aGUgYmVoYXZpb3Igb2YgZGVmYXVsdCBzeW1ib2xzIG9ubHksIGluIG9yZGVyXG4gICAgICogdG8gcHJldmVudCBhbnkgcmVncmVzc2lvbiBmb3IgY3VzdG9tIHN5bWJvbHMgaW4gY2xpZW50IGNvZGUuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdHJhbnNmb3JtZWRPZmZzZXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZGVmYXVsdE1hcmtlcikgcmV0dXJuIHRoaXMuX29mZnNldDtcbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLl9tYXAudHJhbnNmb3JtO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9vZmZzZXQubXVsdCh0aGlzLl9zY2FsZSk7XG4gICAgICAgIGlmICh0aGlzLl9yb3RhdGlvbkFsaWdubWVudCA9PT0gXCJtYXBcIikgb2Zmc2V0Ll9yb3RhdGUodHIuYW5nbGUpO1xuICAgICAgICBpZiAodGhpcy5fcGl0Y2hBbGlnbm1lbnQgPT09IFwibWFwXCIpIG9mZnNldC55ICo9IE1hdGguY29zKHRyLl9waXRjaCk7XG4gICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXJrZXIncyBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IFRoZSBtYXJrZXIncyBzY3JlZW4gY29vcmRpbmF0ZXMgaW4gcGl4ZWxzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgb2Zmc2V0ID0gbWFya2VyLmdldE9mZnNldCgpO1xuICAgICAqL1xuICAgIGdldE9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29mZnNldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBvZmZzZXQgb2YgdGhlIG1hcmtlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBvZmZzZXQgVGhlIG9mZnNldCBpbiBwaXhlbHMgYXMgYSB7QGxpbmsgUG9pbnRMaWtlfSBvYmplY3QgdG8gYXBwbHkgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQncyBjZW50ZXIuIE5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cC5cbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFya2VyLnNldE9mZnNldChbMCwgMV0pO1xuICAgICAqL1xuICAgIHNldE9mZnNldChvZmZzZXQ6IFBvaW50TGlrZSkge1xuICAgICAgICB0aGlzLl9vZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9mZnNldCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfb25Nb3ZlKGU6IE1hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5faXNEcmFnZ2luZykge1xuICAgICAgICAgICAgY29uc3QgY2xpY2tUb2xlcmFuY2UgPSB0aGlzLl9jbGlja1RvbGVyYW5jZSB8fCB0aGlzLl9tYXAuX2NsaWNrVG9sZXJhbmNlO1xuICAgICAgICAgICAgdGhpcy5faXNEcmFnZ2luZyA9IGUucG9pbnQuZGlzdCh0aGlzLl9wb2ludGVyZG93blBvcykgPj0gY2xpY2tUb2xlcmFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fcG9zID0gZS5wb2ludC5zdWIodGhpcy5fcG9zaXRpb25EZWx0YSk7XG4gICAgICAgIHRoaXMuX2xuZ0xhdCA9IHRoaXMuX21hcC51bnByb2plY3QodGhpcy5fcG9zKTtcbiAgICAgICAgdGhpcy5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KTtcbiAgICAgICAgLy8gc3VwcHJlc3MgY2xpY2sgZXZlbnQgc28gdGhhdCBwb3B1cHMgZG9uJ3QgdG9nZ2xlIG9uIGRyYWdcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSBkcmFnc3RhcnQgb25seSBmaXJlcyBvbiB0aGUgZmlyc3QgbW92ZSBldmVudCBhZnRlciBtb3VzZWRvd24uXG4gICAgICAgIC8vIHRoaXMgY2FuJ3QgYmUgb24gbW91c2Vkb3duIGJlY2F1c2UgdGhhdCBldmVudCBkb2Vzbid0IG5lY2Vzc2FyaWx5XG4gICAgICAgIC8vIGltcGx5IHRoYXQgYSBkcmFnIGlzIGFib3V0IHRvIGhhcHBlbi5cbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2FjdGl2ZSc7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRmlyZWQgd2hlbiBkcmFnZ2luZyBzdGFydHMuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQGV2ZW50IGRyYWdzdGFydFxuICAgICAgICAgICAgICogQG1lbWJlcm9mIE1hcmtlclxuICAgICAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtNYXJrZXJ9IG1hcmtlciBUaGUgb2JqZWN0IHRoYXQgaXMgYmVpbmcgZHJhZ2dlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZHJhZ3N0YXJ0JykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoaWxlIGRyYWdnaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgZHJhZ1xuICAgICAgICAgKiBAbWVtYmVyb2YgTWFya2VyXG4gICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge01hcmtlcn0gbWFya2VyIFRoZSBvYmplY3QgdGhhdCBpcyBiZWluZyBkcmFnZ2VkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZHJhZycpKTtcbiAgICB9XG5cbiAgICBfb25VcCgpIHtcbiAgICAgICAgLy8gcmV2ZXJ0IHRvIG5vcm1hbCBwb2ludGVyIGV2ZW50IGhhbmRsaW5nXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgdGhpcy5fcG9zaXRpb25EZWx0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3BvaW50ZXJkb3duUG9zID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuXG4gICAgICAgIC8vIG9ubHkgZmlyZSBkcmFnZW5kIGlmIGl0IHdhcyBwcmVjZWRlZCBieSBhdCBsZWFzdCBvbmUgZHJhZyBldmVudFxuICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT09ICdhY3RpdmUnKSB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICogRmlyZWQgd2hlbiB0aGUgbWFya2VyIGlzIGZpbmlzaGVkIGJlaW5nIGRyYWdnZWQuXG4gICAgICAgICAgICAqXG4gICAgICAgICAgICAqIEBldmVudCBkcmFnZW5kXG4gICAgICAgICAgICAqIEBtZW1iZXJvZiBNYXJrZXJcbiAgICAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAgICAqIEBwcm9wZXJ0eSB7TWFya2VyfSBtYXJrZXIgVGhlIG9iamVjdCB0aGF0IHdhcyBkcmFnZ2VkLlxuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RyYWdlbmQnKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdGF0ZSA9ICdpbmFjdGl2ZSc7XG4gICAgfVxuXG4gICAgX2FkZERyYWdIYW5kbGVyKGU6IE1hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9lbGVtZW50LmNvbnRhaW5zKChlLm9yaWdpbmFsRXZlbnQudGFyZ2V0OiBhbnkpKSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgcGl4ZWwgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY2xpY2sgcG9pbnRcbiAgICAgICAgICAgIC8vIGFuZCB0aGUgbWFya2VyIHBvc2l0aW9uLCB3aXRoIHRoZSBvZmZzZXQgYWNjb3VudGVkIGZvci4gVGhlbiB3ZVxuICAgICAgICAgICAgLy8gY2FuIHN1YnRyYWN0IHRoaXMgZGlzdGFuY2UgZnJvbSB0aGUgbW91c2Vtb3ZlIGV2ZW50J3MgcG9zaXRpb25cbiAgICAgICAgICAgIC8vIHRvIGNhbGN1bGF0ZSB0aGUgbmV3IG1hcmtlciBwb3NpdGlvbi5cbiAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZSBtYXJrZXIgJ2p1bXBzJyB0byB0aGUgY2xpY2sgcG9zaXRpb25cbiAgICAgICAgICAgIC8vIGNyZWF0aW5nIGEgamFycmluZyBVWCBlZmZlY3QuXG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbkRlbHRhID0gZS5wb2ludC5zdWIodGhpcy5fcG9zKS5hZGQodGhpcy5fdHJhbnNmb3JtZWRPZmZzZXQoKSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJkb3duUG9zID0gZS5wb2ludDtcblxuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAncGVuZGluZyc7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub25jZSgnbW91c2V1cCcsIHRoaXMuX29uVXApO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uY2UoJ3RvdWNoZW5kJywgdGhpcy5fb25VcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgZHJhZ2dhYmxlYCBwcm9wZXJ0eSBhbmQgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbWFya2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbc2hvdWxkQmVEcmFnZ2FibGU9ZmFsc2VdIFR1cm5zIGRyYWcgZnVuY3Rpb25hbGl0eSBvbi9vZmYuXG4gICAgICogQHJldHVybnMge01hcmtlcn0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcmtlci5zZXREcmFnZ2FibGUodHJ1ZSk7XG4gICAgICovXG4gICAgc2V0RHJhZ2dhYmxlKHNob3VsZEJlRHJhZ2dhYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2RyYWdnYWJsZSA9ICEhc2hvdWxkQmVEcmFnZ2FibGU7IC8vIGNvbnZlcnQgcG9zc2libGUgdW5kZWZpbmVkIHZhbHVlIHRvIGZhbHNlXG5cbiAgICAgICAgLy8gaGFuZGxlIGNhc2Ugd2hlcmUgbWFwIG1heSBub3QgZXhpc3QgeWV0XG4gICAgICAgIC8vIGZvciBleGFtcGxlLCB3aGVuIHNldERyYWdnYWJsZSBpcyBjYWxsZWQgYmVmb3JlIGFkZFRvXG4gICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRCZURyYWdnYWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2Vkb3duJywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vbigndG91Y2hzdGFydCcsIHRoaXMuX2FkZERyYWdIYW5kbGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW91c2Vkb3duJywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3RvdWNoc3RhcnQnLCB0aGlzLl9hZGREcmFnSGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1hcmtlciBjYW4gYmUgZHJhZ2dlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBtYXJrZXIgaXMgZHJhZ2dhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNNYXJrZXJEcmFnZ2FibGUgPSBtYXJrZXIuaXNEcmFnZ2FibGUoKTtcbiAgICAgKi9cbiAgICBpc0RyYWdnYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdnYWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgcm90YXRpb25gIHByb3BlcnR5IG9mIHRoZSBtYXJrZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JvdGF0aW9uPTBdIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgbWFya2VyIChjbG9ja3dpc2UsIGluIGRlZ3JlZXMpLCByZWxhdGl2ZSB0byBpdHMgcmVzcGVjdGl2ZSB7QGxpbmsgTWFya2VyI3NldFJvdGF0aW9uQWxpZ25tZW50fSBzZXR0aW5nLlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXJrZXIuc2V0Um90YXRpb24oNDUpO1xuICAgICAqL1xuICAgIHNldFJvdGF0aW9uKHJvdGF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fcm90YXRpb24gPSByb3RhdGlvbiB8fCAwO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCByb3RhdGlvbiBhbmdsZSBvZiB0aGUgbWFya2VyIChpbiBkZWdyZWVzKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBjdXJyZW50IHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSBtYXJrZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCByb3RhdGlvbiA9IG1hcmtlci5nZXRSb3RhdGlvbigpO1xuICAgICAqL1xuICAgIGdldFJvdGF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHJvdGF0aW9uQWxpZ25tZW50YCBwcm9wZXJ0eSBvZiB0aGUgbWFya2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFthbGlnbm1lbnQ9J2F1dG8nXSBTZXRzIHRoZSBgcm90YXRpb25BbGlnbm1lbnRgIHByb3BlcnR5IG9mIHRoZSBtYXJrZXIuXG4gICAgICogQHJldHVybnMge01hcmtlcn0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcmtlci5zZXRSb3RhdGlvbkFsaWdubWVudCgndmlld3BvcnQnKTtcbiAgICAgKi9cbiAgICBzZXRSb3RhdGlvbkFsaWdubWVudChhbGlnbm1lbnQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9yb3RhdGlvbkFsaWdubWVudCA9IGFsaWdubWVudCB8fCAnYXV0byc7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGByb3RhdGlvbkFsaWdubWVudGAgcHJvcGVydHkgb2YgdGhlIG1hcmtlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjdXJyZW50IHJvdGF0aW9uYWwgYWxpZ25tZW50IG9mIHRoZSBtYXJrZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBhbGlnbm1lbnQgPSBtYXJrZXIuZ2V0Um90YXRpb25BbGlnbm1lbnQoKTtcbiAgICAgKi9cbiAgICBnZXRSb3RhdGlvbkFsaWdubWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBwaXRjaEFsaWdubWVudGAgcHJvcGVydHkgb2YgdGhlIG1hcmtlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpZ25tZW50XSBTZXRzIHRoZSBgcGl0Y2hBbGlnbm1lbnRgIHByb3BlcnR5IG9mIHRoZSBtYXJrZXIuIElmIGFsaWdubWVudCBpcyAnYXV0bycsIGl0IHdpbGwgYXV0b21hdGljYWxseSBtYXRjaCBgcm90YXRpb25BbGlnbm1lbnRgLlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXJrZXIuc2V0UGl0Y2hBbGlnbm1lbnQoJ21hcCcpO1xuICAgICAqL1xuICAgIHNldFBpdGNoQWxpZ25tZW50KGFsaWdubWVudDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3BpdGNoQWxpZ25tZW50ID0gYWxpZ25tZW50ICYmIGFsaWdubWVudCAhPT0gJ2F1dG8nID8gYWxpZ25tZW50IDogdGhpcy5fcm90YXRpb25BbGlnbm1lbnQ7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGBwaXRjaEFsaWdubWVudGAgcHJvcGVydHkgb2YgdGhlIG1hcmtlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjdXJyZW50IHBpdGNoIGFsaWdubWVudCBvZiB0aGUgbWFya2VyIGluIGRlZ3JlZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBhbGlnbm1lbnQgPSBtYXJrZXIuZ2V0UGl0Y2hBbGlnbm1lbnQoKTtcbiAgICAgKi9cbiAgICBnZXRQaXRjaEFsaWdubWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BpdGNoQWxpZ25tZW50O1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7ZWFzZUN1YmljSW5PdXR9IGZyb20gJy4vdXRpbC5qcyc7XG5cbi8qKlxuICogQW4gb2JqZWN0IGZvciBtYWludGFpbmluZyBqdXN0IGVub3VnaCBzdGF0ZSB0byBlYXNlIGEgdmFyaWFibGUuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgRWFzZWRWYXJpYWJsZSB7XG4gICAgX3N0YXJ0OiBudW1iZXI7XG4gICAgX2VuZDogbnVtYmVyO1xuICAgIF9zdGFydFRpbWU6IG51bWJlcjtcbiAgICBfZW5kVGltZTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oaW5pdGlhbFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmFsdWF0ZSB0aGUgY3VycmVudCB2YWx1ZSwgZ2l2ZW4gYSB0aW1lc3RhbXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGltZVN0YW1wIHtudW1iZXJ9IFRpbWUgYXQgd2hpY2ggdG8gZXZhbHVhdGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBFdmFsdWF0ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZ2V0VmFsdWUodGltZVN0YW1wOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAodGltZVN0YW1wIDw9IHRoaXMuX3N0YXJ0VGltZSkgcmV0dXJuIHRoaXMuX3N0YXJ0O1xuICAgICAgICBpZiAodGltZVN0YW1wID49IHRoaXMuX2VuZFRpbWUpIHJldHVybiB0aGlzLl9lbmQ7XG5cbiAgICAgICAgY29uc3QgdCA9IGVhc2VDdWJpY0luT3V0KCh0aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpIC8gKHRoaXMuX2VuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0ICogKDEgLSB0KSArIHRoaXMuX2VuZCAqIHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYW4gZWFzZSBpcyBpbiBwcm9ncmVzcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aW1lU3RhbXAge251bWJlcn0gQ3VycmVudCB0aW1lIHN0YW1wLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGVhc2UgaXMgaW4gcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgaXNFYXNpbmcodGltZVN0YW1wOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRpbWVTdGFtcCA+PSB0aGlzLl9zdGFydFRpbWUgJiYgdGltZVN0YW1wIDw9IHRoaXMuX2VuZFRpbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB2YWx1ZSB3aXRob3V0IGVhc2luZyBhbmQgY2FuY2VsIGFueSBpbiBwcm9ncmVzcyBlYXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHtudW1iZXJ9IE5ldyB2YWx1ZS5cbiAgICAgKi9cbiAgICBqdW1wVG8odmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSAtSW5maW5pdHk7XG4gICAgICAgIHRoaXMuX2VuZFRpbWUgPSAtSW5maW5pdHk7XG5cbiAgICAgICAgdGhpcy5fc3RhcnQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fZW5kID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIGFueSBpbi1wcm9ncmVzcyBlYXNlIGFuZCBiZWdpbiBhIG5ldyBlYXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHtudW1iZXJ9IE5ldyB2YWx1ZSB0byB3aGljaCB0byBlYXNlLlxuICAgICAqIEBwYXJhbSB0aW1lU3RhbXAge251bWJlcn0gQ3VycmVudCB0aW1lIHN0YW1wLlxuICAgICAqIEBwYXJhbSBkdXJhdGlvbiB7bnVtYmVyfSBFYXNlIGR1cmF0aW9uLCBpbiBzYW1lIHVuaXRzIGFzIHRpbWVTdGFtcC5cbiAgICAgKi9cbiAgICBlYXNlVG8odmFsdWU6IG51bWJlciwgdGltZVN0YW1wOiBudW1iZXIsIGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fc3RhcnQgPSB0aGlzLmdldFZhbHVlKHRpbWVTdGFtcCk7XG4gICAgICAgIHRoaXMuX2VuZCA9IHZhbHVlO1xuXG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IHRpbWVTdGFtcDtcbiAgICAgICAgdGhpcy5fZW5kVGltZSA9IHRpbWVTdGFtcCArIGR1cmF0aW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWFzZWRWYXJpYWJsZTtcbiIsIi8vIEBmbG93XG5cbmNvbnN0IGRlZmF1bHRMb2NhbGUgPSB7XG4gICAgJ0F0dHJpYnV0aW9uQ29udHJvbC5Ub2dnbGVBdHRyaWJ1dGlvbic6ICdUb2dnbGUgYXR0cmlidXRpb24nLFxuICAgICdBdHRyaWJ1dGlvbkNvbnRyb2wuTWFwRmVlZGJhY2snOiAnTWFwIGZlZWRiYWNrJyxcbiAgICAnRnVsbHNjcmVlbkNvbnRyb2wuRW50ZXInOiAnRW50ZXIgZnVsbHNjcmVlbicsXG4gICAgJ0Z1bGxzY3JlZW5Db250cm9sLkV4aXQnOiAnRXhpdCBmdWxsc2NyZWVuJyxcbiAgICAnR2VvbG9jYXRlQ29udHJvbC5GaW5kTXlMb2NhdGlvbic6ICdGaW5kIG15IGxvY2F0aW9uJyxcbiAgICAnR2VvbG9jYXRlQ29udHJvbC5Mb2NhdGlvbk5vdEF2YWlsYWJsZSc6ICdMb2NhdGlvbiBub3QgYXZhaWxhYmxlJyxcbiAgICAnTG9nb0NvbnRyb2wuVGl0bGUnOiAnTWFwYm94IGxvZ28nLFxuICAgICdOYXZpZ2F0aW9uQ29udHJvbC5SZXNldEJlYXJpbmcnOiAnUmVzZXQgYmVhcmluZyB0byBub3J0aCcsXG4gICAgJ05hdmlnYXRpb25Db250cm9sLlpvb21Jbic6ICdab29tIGluJyxcbiAgICAnTmF2aWdhdGlvbkNvbnRyb2wuWm9vbU91dCc6ICdab29tIG91dCcsXG4gICAgJ1NjYWxlQ29udHJvbC5GZWV0JzogJ2Z0JyxcbiAgICAnU2NhbGVDb250cm9sLk1ldGVycyc6ICdtJyxcbiAgICAnU2NhbGVDb250cm9sLktpbG9tZXRlcnMnOiAna20nLFxuICAgICdTY2FsZUNvbnRyb2wuTWlsZXMnOiAnbWknLFxuICAgICdTY2FsZUNvbnRyb2wuTmF1dGljYWxNaWxlcyc6ICdubScsXG4gICAgJ1Njcm9sbFpvb21CbG9ja2VyLkN0cmxNZXNzYWdlJzogJ1VzZSBjdHJsICsgc2Nyb2xsIHRvIHpvb20gdGhlIG1hcCcsXG4gICAgJ1Njcm9sbFpvb21CbG9ja2VyLkNtZE1lc3NhZ2UnOiAnVXNlIOKMmCArIHNjcm9sbCB0byB6b29tIHRoZSBtYXAnLFxuICAgICdUb3VjaFBhbkJsb2NrZXIuTWVzc2FnZSc6ICdVc2UgdHdvIGZpbmdlcnMgdG8gbW92ZSB0aGUgbWFwJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdExvY2FsZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7dmVyc2lvbn0gZnJvbSAnLi4vLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCB7YXN5bmNBbGwsIGV4dGVuZCwgYmluZEFsbCwgd2Fybk9uY2UsIHVuaXF1ZUlkfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cuanMnO1xuY29uc3Qge0hUTUxJbWFnZUVsZW1lbnQsIEhUTUxFbGVtZW50LCBJbWFnZUJpdG1hcH0gPSB3aW5kb3c7XG5pbXBvcnQgRE9NIGZyb20gJy4uL3V0aWwvZG9tLmpzJztcbmltcG9ydCB7Z2V0SW1hZ2UsIGdldEpTT04sIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCB7UmVxdWVzdE1hbmFnZXIsIGdldE1hcFNlc3Npb25BUEksIHBvc3RNYXBMb2FkRXZlbnQsIEFVVEhfRVJSX01TRywgc3RvcmVBdXRoU3RhdGUsIHJlbW92ZUF1dGhTdGF0ZX0gZnJvbSAnLi4vdXRpbC9tYXBib3guanMnO1xuaW1wb3J0IFN0eWxlIGZyb20gJy4uL3N0eWxlL3N0eWxlLmpzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IFBhaW50ZXIgZnJvbSAnLi4vcmVuZGVyL3BhaW50ZXIuanMnO1xuaW1wb3J0IFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCBIYXNoIGZyb20gJy4vaGFzaC5qcyc7XG5pbXBvcnQgSGFuZGxlck1hbmFnZXIgZnJvbSAnLi9oYW5kbGVyX21hbmFnZXIuanMnO1xuaW1wb3J0IENhbWVyYSBmcm9tICcuL2NhbWVyYS5qcyc7XG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2dlby9sbmdfbGF0LmpzJztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuLi9nZW8vbG5nX2xhdF9ib3VuZHMuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IEF0dHJpYnV0aW9uQ29udHJvbCBmcm9tICcuL2NvbnRyb2wvYXR0cmlidXRpb25fY29udHJvbC5qcyc7XG5pbXBvcnQgTG9nb0NvbnRyb2wgZnJvbSAnLi9jb250cm9sL2xvZ29fY29udHJvbC5qcyc7XG5pbXBvcnQge3N1cHBvcnRlZH0gZnJvbSAnQG1hcGJveC9tYXBib3gtZ2wtc3VwcG9ydGVkJztcbmltcG9ydCB7UkdCQUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlLmpzJztcbmltcG9ydCB7RXZlbnQsIEVycm9yRXZlbnR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQge01hcE1vdXNlRXZlbnR9IGZyb20gJy4vZXZlbnRzLmpzJztcbmltcG9ydCBUYXNrUXVldWUgZnJvbSAnLi4vdXRpbC90YXNrX3F1ZXVlLmpzJztcbmltcG9ydCB3ZWJwU3VwcG9ydGVkIGZyb20gJy4uL3V0aWwvd2VicF9zdXBwb3J0ZWQuanMnO1xuaW1wb3J0IHtQZXJmb3JtYW5jZU1hcmtlcnMsIFBlcmZvcm1hbmNlVXRpbHN9IGZyb20gJy4uL3V0aWwvcGVyZm9ybWFuY2UuanMnO1xuaW1wb3J0IE1hcmtlciBmcm9tICcuLi91aS9tYXJrZXIuanMnO1xuaW1wb3J0IEVhc2VkVmFyaWFibGUgZnJvbSAnLi4vdXRpbC9lYXNlZF92YXJpYWJsZS5qcyc7XG5pbXBvcnQgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQge0dMT0JFX1pPT01fVEhSRVNIT0xEX01BWH0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vZ2xvYmUuanMnO1xuXG5pbXBvcnQge3NldENhY2hlTGltaXRzfSBmcm9tICcuLi91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge1JlcXVlc3RUcmFuc2Zvcm1GdW5jdGlvbn0gZnJvbSAnLi4vdXRpbC9tYXBib3guanMnO1xuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0LmpzJztcbmltcG9ydCB0eXBlIHtMbmdMYXRCb3VuZHNMaWtlfSBmcm9tICcuLi9nZW8vbG5nX2xhdF9ib3VuZHMuanMnO1xuaW1wb3J0IHR5cGUge1N0eWxlT3B0aW9ucywgU3R5bGVTZXR0ZXJPcHRpb25zfSBmcm9tICcuLi9zdHlsZS9zdHlsZS5qcyc7XG5pbXBvcnQgdHlwZSB7TWFwRXZlbnQsIE1hcERhdGFFdmVudH0gZnJvbSAnLi9ldmVudHMuanMnO1xuaW1wb3J0IHR5cGUge0N1c3RvbUxheWVySW50ZXJmYWNlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9jdXN0b21fc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2VJbnRlcmZhY2UsIFN0eWxlSW1hZ2VNZXRhZGF0YX0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfaW1hZ2UuanMnO1xuaW1wb3J0IFRlcnJhaW4gZnJvbSAnLi4vc3R5bGUvdGVycmFpbi5qcyc7XG5pbXBvcnQgRm9nIGZyb20gJy4uL3N0eWxlL2ZvZy5qcyc7XG5cbmltcG9ydCB0eXBlIFNjcm9sbFpvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9zY3JvbGxfem9vbS5qcyc7XG5pbXBvcnQgdHlwZSBCb3hab29tSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvYm94X3pvb20uanMnO1xuaW1wb3J0IHR5cGUge1RvdWNoUGl0Y2hIYW5kbGVyfSBmcm9tICcuL2hhbmRsZXIvdG91Y2hfem9vbV9yb3RhdGUuanMnO1xuaW1wb3J0IHR5cGUgRHJhZ1JvdGF0ZUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3NoaW0vZHJhZ19yb3RhdGUuanMnO1xuaW1wb3J0IHR5cGUgRHJhZ1BhbkhhbmRsZXIsIHtEcmFnUGFuT3B0aW9uc30gZnJvbSAnLi9oYW5kbGVyL3NoaW0vZHJhZ19wYW4uanMnO1xuaW1wb3J0IHR5cGUgS2V5Ym9hcmRIYW5kbGVyIGZyb20gJy4vaGFuZGxlci9rZXlib2FyZC5qcyc7XG5pbXBvcnQgdHlwZSBEb3VibGVDbGlja1pvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9zaGltL2RibGNsaWNrX3pvb20uanMnO1xuaW1wb3J0IHR5cGUgVG91Y2hab29tUm90YXRlSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvc2hpbS90b3VjaF96b29tX3JvdGF0ZS5qcyc7XG5pbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuL2RlZmF1bHRfbG9jYWxlLmpzJztcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uL3V0aWwvdGFza19xdWV1ZS5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgTGF5ZXJTcGVjaWZpY2F0aW9uLFxuICAgIEZpbHRlclNwZWNpZmljYXRpb24sXG4gICAgU3R5bGVTcGVjaWZpY2F0aW9uLFxuICAgIExpZ2h0U3BlY2lmaWNhdGlvbixcbiAgICBUZXJyYWluU3BlY2lmaWNhdGlvbixcbiAgICBGb2dTcGVjaWZpY2F0aW9uLFxuICAgIFNvdXJjZVNwZWNpZmljYXRpb24sXG4gICAgUHJvamVjdGlvblNwZWNpZmljYXRpb25cbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RWxldmF0aW9uUXVlcnlPcHRpb25zfSBmcm9tICcuLi90ZXJyYWluL2VsZXZhdGlvbi5qcyc7XG5cbnR5cGUgQ29udHJvbFBvc2l0aW9uID0gJ3RvcC1sZWZ0JyB8ICd0b3AtcmlnaHQnIHwgJ2JvdHRvbS1sZWZ0JyB8ICdib3R0b20tcmlnaHQnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbnR5cGUgSUNvbnRyb2wgPSB7XG4gICAgb25BZGQobWFwOiBNYXApOiBIVE1MRWxlbWVudDtcbiAgICBvblJlbW92ZShtYXA6IE1hcCk6IHZvaWQ7XG5cbiAgICArZ2V0RGVmYXVsdFBvc2l0aW9uPzogKCkgPT4gQ29udHJvbFBvc2l0aW9uO1xufVxuLyogZXNsaW50LWVuYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuXG5leHBvcnQgY29uc3QgQVZFUkFHRV9FTEVWQVRJT05fU0FNUExJTkdfSU5URVJWQUwgPSA1MDA7IC8vIG1zXG5leHBvcnQgY29uc3QgQVZFUkFHRV9FTEVWQVRJT05fRUFTRV9USU1FID0gMzAwOyAvLyBtc1xuZXhwb3J0IGNvbnN0IEFWRVJBR0VfRUxFVkFUSU9OX0VBU0VfVEhSRVNIT0xEID0gMTsgLy8gbWV0ZXJzXG5leHBvcnQgY29uc3QgQVZFUkFHRV9FTEVWQVRJT05fQ0hBTkdFX1RIUkVTSE9MRCA9IDFlLTQ7IC8vIG1ldGVyc1xuXG50eXBlIE1hcE9wdGlvbnMgPSB7XG4gICAgaGFzaD86IGJvb2xlYW4gfCBzdHJpbmcsXG4gICAgaW50ZXJhY3RpdmU/OiBib29sZWFuLFxuICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBzdHJpbmcsXG4gICAgYmVhcmluZ1NuYXA/OiBudW1iZXIsXG4gICAgYXR0cmlidXRpb25Db250cm9sPzogYm9vbGVhbixcbiAgICBjdXN0b21BdHRyaWJ1dGlvbj86IHN0cmluZyB8IEFycmF5PHN0cmluZz4sXG4gICAgbG9nb1Bvc2l0aW9uPzogQ29udHJvbFBvc2l0aW9uLFxuICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ/OiBib29sZWFuLFxuICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcj86IGJvb2xlYW4sXG4gICAgYW50aWFsaWFzPzogYm9vbGVhbixcbiAgICByZWZyZXNoRXhwaXJlZFRpbGVzPzogYm9vbGVhbixcbiAgICBtYXhCb3VuZHM/OiBMbmdMYXRCb3VuZHNMaWtlLFxuICAgIHNjcm9sbFpvb20/OiBib29sZWFuLFxuICAgIG1pblpvb20/OiA/bnVtYmVyLFxuICAgIG1heFpvb20/OiA/bnVtYmVyLFxuICAgIG1pblBpdGNoPzogP251bWJlcixcbiAgICBtYXhQaXRjaD86ID9udW1iZXIsXG4gICAgYm94Wm9vbT86IGJvb2xlYW4sXG4gICAgZHJhZ1JvdGF0ZT86IGJvb2xlYW4sXG4gICAgZHJhZ1Bhbj86IERyYWdQYW5PcHRpb25zLFxuICAgIGtleWJvYXJkPzogYm9vbGVhbixcbiAgICBkb3VibGVDbGlja1pvb20/OiBib29sZWFuLFxuICAgIHRvdWNoWm9vbVJvdGF0ZT86IGJvb2xlYW4sXG4gICAgdG91Y2hQaXRjaD86IGJvb2xlYW4sXG4gICAgY29vcGVyYXRpdmVHZXN0dXJlcz86IGJvb2xlYW4sXG4gICAgdHJhY2tSZXNpemU/OiBib29sZWFuLFxuICAgIGNlbnRlcj86IExuZ0xhdExpa2UsXG4gICAgem9vbT86IG51bWJlcixcbiAgICBiZWFyaW5nPzogbnVtYmVyLFxuICAgIHBpdGNoPzogbnVtYmVyLFxuICAgIG9wdGltaXplRm9yVGVycmFpbj86IGJvb2xlYW4sXG4gICAgcmVuZGVyV29ybGRDb3BpZXM/OiBib29sZWFuLFxuICAgIG1heFRpbGVDYWNoZVNpemU/OiBudW1iZXIsXG4gICAgdHJhbnNmb3JtUmVxdWVzdD86IFJlcXVlc3RUcmFuc2Zvcm1GdW5jdGlvbixcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nLFxuICAgIHRlc3RNb2RlOiA/Ym9vbGVhbixcbiAgICBsb2NhbGU/OiBPYmplY3QsXG4gICAgcHJvamVjdGlvbj86IFByb2plY3Rpb25TcGVjaWZpY2F0aW9uIHwgc3RyaW5nXG59O1xuXG5jb25zdCBkZWZhdWx0TWluWm9vbSA9IC0yO1xuY29uc3QgZGVmYXVsdE1heFpvb20gPSAyMjtcblxuLy8gdGhlIGRlZmF1bHQgdmFsdWVzLCBidXQgYWxzbyB0aGUgdmFsaWQgcmFuZ2VcbmNvbnN0IGRlZmF1bHRNaW5QaXRjaCA9IDA7XG5jb25zdCBkZWZhdWx0TWF4UGl0Y2ggPSA4NTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgY2VudGVyOiBbMCwgMF0sXG4gICAgem9vbTogMCxcbiAgICBiZWFyaW5nOiAwLFxuICAgIHBpdGNoOiAwLFxuXG4gICAgbWluWm9vbTogZGVmYXVsdE1pblpvb20sXG4gICAgbWF4Wm9vbTogZGVmYXVsdE1heFpvb20sXG5cbiAgICBtaW5QaXRjaDogZGVmYXVsdE1pblBpdGNoLFxuICAgIG1heFBpdGNoOiBkZWZhdWx0TWF4UGl0Y2gsXG5cbiAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICBzY3JvbGxab29tOiB0cnVlLFxuICAgIGJveFpvb206IHRydWUsXG4gICAgZHJhZ1JvdGF0ZTogdHJ1ZSxcbiAgICBkcmFnUGFuOiB0cnVlLFxuICAgIGtleWJvYXJkOiB0cnVlLFxuICAgIGRvdWJsZUNsaWNrWm9vbTogdHJ1ZSxcbiAgICB0b3VjaFpvb21Sb3RhdGU6IHRydWUsXG4gICAgdG91Y2hQaXRjaDogdHJ1ZSxcbiAgICBjb29wZXJhdGl2ZUdlc3R1cmVzOiBmYWxzZSxcblxuICAgIGJlYXJpbmdTbmFwOiA3LFxuICAgIGNsaWNrVG9sZXJhbmNlOiAzLFxuICAgIHBpdGNoV2l0aFJvdGF0ZTogdHJ1ZSxcblxuICAgIGhhc2g6IGZhbHNlLFxuICAgIGF0dHJpYnV0aW9uQ29udHJvbDogdHJ1ZSxcblxuICAgIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IGZhbHNlLFxuICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogZmFsc2UsXG4gICAgdHJhY2tSZXNpemU6IHRydWUsXG4gICAgb3B0aW1pemVGb3JUZXJyYWluOiB0cnVlLFxuICAgIHJlbmRlcldvcmxkQ29waWVzOiB0cnVlLFxuICAgIHJlZnJlc2hFeHBpcmVkVGlsZXM6IHRydWUsXG4gICAgbWF4VGlsZUNhY2hlU2l6ZTogbnVsbCxcbiAgICBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6ICdzYW5zLXNlcmlmJyxcbiAgICBsb2NhbEZvbnRGYW1pbHk6IG51bGwsXG4gICAgdHJhbnNmb3JtUmVxdWVzdDogbnVsbCxcbiAgICBhY2Nlc3NUb2tlbjogbnVsbCxcbiAgICBmYWRlRHVyYXRpb246IDMwMCxcbiAgICBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IHRydWVcbn07XG5cbi8qKlxuICogVGhlIGBNYXBgIG9iamVjdCByZXByZXNlbnRzIHRoZSBtYXAgb24geW91ciBwYWdlLiBJdCBleHBvc2VzIG1ldGhvZHNcbiAqIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlIHlvdSB0byBwcm9ncmFtbWF0aWNhbGx5IGNoYW5nZSB0aGUgbWFwLFxuICogYW5kIGZpcmVzIGV2ZW50cyBhcyB1c2VycyBpbnRlcmFjdCB3aXRoIGl0LlxuICpcbiAqIFlvdSBjcmVhdGUgYSBgTWFwYCBieSBzcGVjaWZ5aW5nIGEgYGNvbnRhaW5lcmAgYW5kIG90aGVyIG9wdGlvbnMuXG4gKiBUaGVuIE1hcGJveCBHTCBKUyBpbml0aWFsaXplcyB0aGUgbWFwIG9uIHRoZSBwYWdlIGFuZCByZXR1cm5zIHlvdXIgYE1hcGBcbiAqIG9iamVjdC5cbiAqXG4gKiBAZXh0ZW5kcyBFdmVudGVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IG9wdGlvbnMuY29udGFpbmVyIFRoZSBIVE1MIGVsZW1lbnQgaW4gd2hpY2ggTWFwYm94IEdMIEpTIHdpbGwgcmVuZGVyIHRoZSBtYXAsIG9yIHRoZSBlbGVtZW50J3Mgc3RyaW5nIGBpZGAuIFRoZSBzcGVjaWZpZWQgZWxlbWVudCBtdXN0IGhhdmUgbm8gY2hpbGRyZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluWm9vbT0wXSBUaGUgbWluaW11bSB6b29tIGxldmVsIG9mIHRoZSBtYXAgKDAtMjQpLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFpvb209MjJdIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgb2YgdGhlIG1hcCAoMC0yNCkuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluUGl0Y2g9MF0gVGhlIG1pbmltdW0gcGl0Y2ggb2YgdGhlIG1hcCAoMC04NSkuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4UGl0Y2g9ODVdIFRoZSBtYXhpbXVtIHBpdGNoIG9mIHRoZSBtYXAgKDAtODUpLlxuICogQHBhcmFtIHtPYmplY3QgfCBzdHJpbmd9IG9wdGlvbnMuc3R5bGUgVGhlIG1hcCdzIE1hcGJveCBzdHlsZS4gVGhpcyBtdXN0IGJlIGFuIGEgSlNPTiBvYmplY3QgY29uZm9ybWluZyB0b1xuICogdGhlIHNjaGVtYSBkZXNjcmliZWQgaW4gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyksIG9yIGEgVVJMXG4gKiB0byBzdWNoIEpTT04uIENhbiBhY2NlcHQgYSBudWxsIHZhbHVlIHRvIGFsbG93IGFkZGluZyBhIHN0eWxlIG1hbnVhbGx5LlxuICpcbiAqIFRvIGxvYWQgYSBzdHlsZSBmcm9tIHRoZSBNYXBib3ggQVBJLCB5b3UgY2FuIHVzZSBhIFVSTCBvZiB0aGUgZm9ybSBgbWFwYm94Oi8vc3R5bGVzLzpvd25lci86c3R5bGVgLFxuICogd2hlcmUgYDpvd25lcmAgaXMgeW91ciBNYXBib3ggYWNjb3VudCBuYW1lIGFuZCBgOnN0eWxlYCBpcyB0aGUgc3R5bGUgSUQuIFlvdSBjYW4gYWxzbyB1c2UgYVxuICogW01hcGJveC1vd25lZCBzdHlsZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vYXBpL21hcHMvc3R5bGVzLyNtYXBib3gtc3R5bGVzKTpcbiAqXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zdHJlZXRzLXYxMWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L291dGRvb3JzLXYxMWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2xpZ2h0LXYxMGBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2RhcmstdjEwYFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvc2F0ZWxsaXRlLXY5YFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvc2F0ZWxsaXRlLXN0cmVldHMtdjExYFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvbmF2aWdhdGlvbi1kYXktdjFgXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9uYXZpZ2F0aW9uLW5pZ2h0LXYxYC5cbiAqXG4gKiBUaWxlc2V0cyBob3N0ZWQgd2l0aCBNYXBib3ggY2FuIGJlIHN0eWxlLW9wdGltaXplZCBpZiB5b3UgYXBwZW5kIGA/b3B0aW1pemU9dHJ1ZWAgdG8gdGhlIGVuZCBvZiB5b3VyIHN0eWxlIFVSTCwgbGlrZSBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zdHJlZXRzLXYxMT9vcHRpbWl6ZT10cnVlYC5cbiAqIExlYXJuIG1vcmUgYWJvdXQgc3R5bGUtb3B0aW1pemVkIHZlY3RvciB0aWxlcyBpbiBvdXIgW0FQSSBkb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL2FwaS1kb2N1bWVudGF0aW9uL21hcHMvI3JldHJpZXZlLXRpbGVzKS5cbiAqXG4gKiBAcGFyYW0geyhib29sZWFufHN0cmluZyl9IFtvcHRpb25zLmhhc2g9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCdzIFtwb3NpdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEpICh6b29tLCBjZW50ZXIgbGF0aXR1ZGUsIGNlbnRlciBsb25naXR1ZGUsIGJlYXJpbmcsIGFuZCBwaXRjaCkgd2lsbCBiZSBzeW5jZWQgd2l0aCB0aGUgaGFzaCBmcmFnbWVudCBvZiB0aGUgcGFnZSdzIFVSTC5cbiAqICAgRm9yIGV4YW1wbGUsIGBodHRwOi8vcGF0aC90by9teS9wYWdlLmh0bWwjMi41OS8zOS4yNi81My4wNy8tMjQuMS82MGAuXG4gKiAgIEFuIGFkZGl0aW9uYWwgc3RyaW5nIG1heSBvcHRpb25hbGx5IGJlIHByb3ZpZGVkIHRvIGluZGljYXRlIGEgcGFyYW1ldGVyLXN0eWxlZCBoYXNoLFxuICogICBmb3IgZXhhbXBsZSBodHRwOi8vcGF0aC90by9teS9wYWdlLmh0bWwjbWFwPTIuNTkvMzkuMjYvNTMuMDcvLTI0LjEvNjAmZm9vPWJhciwgd2hlcmUgYGZvb2BcbiAqICAgaXMgYSBjdXN0b20gcGFyYW1ldGVyIGFuZCBgYmFyYCBpcyBhbiBhcmJpdHJhcnkgaGFzaCBkaXN0aW5jdCBmcm9tIHRoZSBtYXAgaGFzaC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaW50ZXJhY3RpdmU9dHJ1ZV0gSWYgYGZhbHNlYCwgbm8gbW91c2UsIHRvdWNoLCBvciBrZXlib2FyZCBsaXN0ZW5lcnMgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgbWFwLCBzbyBpdCB3aWxsIG5vdCByZXNwb25kIHRvIGludGVyYWN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJlYXJpbmdTbmFwPTddIFRoZSB0aHJlc2hvbGQsIG1lYXN1cmVkIGluIGRlZ3JlZXMsIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHRoZSBtYXAnc1xuICogICBiZWFyaW5nIHdpbGwgc25hcCB0byBub3J0aC4gRm9yIGV4YW1wbGUsIHdpdGggYSBgYmVhcmluZ1NuYXBgIG9mIDcsIGlmIHRoZSB1c2VyIHJvdGF0ZXNcbiAqICAgdGhlIG1hcCB3aXRoaW4gNyBkZWdyZWVzIG9mIG5vcnRoLCB0aGUgbWFwIHdpbGwgYXV0b21hdGljYWxseSBzbmFwIHRvIGV4YWN0IG5vcnRoLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5waXRjaFdpdGhSb3RhdGU9dHJ1ZV0gSWYgYGZhbHNlYCwgdGhlIG1hcCdzIHBpdGNoICh0aWx0KSBjb250cm9sIHdpdGggXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIHdpbGwgYmUgZGlzYWJsZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY2xpY2tUb2xlcmFuY2U9M10gVGhlIG1heCBudW1iZXIgb2YgcGl4ZWxzIGEgdXNlciBjYW4gc2hpZnQgdGhlIG1vdXNlIHBvaW50ZXIgZHVyaW5nIGEgY2xpY2sgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBjbGljayAoYXMgb3Bwb3NlZCB0byBhIG1vdXNlIGRyYWcpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2w9dHJ1ZV0gSWYgYHRydWVgLCBhbiB7QGxpbmsgQXR0cmlidXRpb25Db250cm9sfSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtYXAuXG4gKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZz59IFtvcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uPW51bGxdIFN0cmluZyBvciBzdHJpbmdzIHRvIHNob3cgaW4gYW4ge0BsaW5rIEF0dHJpYnV0aW9uQ29udHJvbH0uIE9ubHkgYXBwbGljYWJsZSBpZiBgb3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2xgIGlzIGB0cnVlYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2dvUG9zaXRpb249J2JvdHRvbS1sZWZ0J10gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgTWFwYm94IHdvcmRtYXJrIG9uIHRoZSBtYXAuIFZhbGlkIG9wdGlvbnMgYXJlIGB0b3AtbGVmdGAsYHRvcC1yaWdodGAsIGBib3R0b20tbGVmdGAsIGBib3R0b20tcmlnaHRgLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBJZiBgdHJ1ZWAsIG1hcCBjcmVhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIHBlcmZvcm1hbmNlIG9mIE1hcGJveCBHTCBKUyB3b3VsZCBiZSBkcmFtYXRpY2FsbHkgd29yc2UgdGhhbiBleHBlY3RlZCAoYSBzb2Z0d2FyZSByZW5kZXJlciB3b3VsZCBiZSB1c2VkKS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZSBtYXAncyBjYW52YXMgY2FuIGJlIGV4cG9ydGVkIHRvIGEgUE5HIHVzaW5nIGBtYXAuZ2V0Q2FudmFzKCkudG9EYXRhVVJMKClgLiBUaGlzIGlzIGBmYWxzZWAgYnkgZGVmYXVsdCBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYW50aWFsaWFzPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZSBnbCBjb250ZXh0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIFtNU0FBIGFudGlhbGlhc2luZ10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTXVsdGlzYW1wbGVfYW50aS1hbGlhc2luZyksIHdoaWNoIGNhbiBiZSB1c2VmdWwgZm9yIGFudGlhbGlhc2luZyBjdXN0b20gbGF5ZXJzLiBUaGlzIGlzIGBmYWxzZWAgYnkgZGVmYXVsdCBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVmcmVzaEV4cGlyZWRUaWxlcz10cnVlXSBJZiBgZmFsc2VgLCB0aGUgbWFwIHdvbid0IGF0dGVtcHQgdG8gcmUtcmVxdWVzdCB0aWxlcyBvbmNlIHRoZXkgZXhwaXJlIHBlciB0aGVpciBIVFRQIGBjYWNoZUNvbnRyb2xgL2BleHBpcmVzYCBoZWFkZXJzLlxuICogQHBhcmFtIHtMbmdMYXRCb3VuZHNMaWtlfSBbb3B0aW9ucy5tYXhCb3VuZHM9bnVsbF0gSWYgc2V0LCB0aGUgbWFwIHdpbGwgYmUgY29uc3RyYWluZWQgdG8gdGhlIGdpdmVuIGJvdW5kcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3R9IFtvcHRpb25zLnNjcm9sbFpvb209dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuIEFuIGBPYmplY3RgIHZhbHVlIGlzIHBhc3NlZCBhcyBvcHRpb25zIHRvIHtAbGluayBTY3JvbGxab29tSGFuZGxlciNlbmFibGV9LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5ib3hab29tPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkIChzZWUge0BsaW5rIEJveFpvb21IYW5kbGVyfSkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRyYWdSb3RhdGU9dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQgKHNlZSB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9KS5cbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IE9iamVjdH0gW29wdGlvbnMuZHJhZ1Bhbj10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC4gQW4gYE9iamVjdGAgdmFsdWUgaXMgcGFzc2VkIGFzIG9wdGlvbnMgdG8ge0BsaW5rIERyYWdQYW5IYW5kbGVyI2VuYWJsZX0uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmtleWJvYXJkPXRydWVdIElmIGB0cnVlYCwga2V5Ym9hcmQgc2hvcnRjdXRzIGFyZSBlbmFibGVkIChzZWUge0BsaW5rIEtleWJvYXJkSGFuZGxlcn0pLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kb3VibGVDbGlja1pvb209dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQgKHNlZSB7QGxpbmsgRG91YmxlQ2xpY2tab29tSGFuZGxlcn0pLlxuICogQHBhcmFtIHtib29sZWFuIHwgT2JqZWN0fSBbb3B0aW9ucy50b3VjaFpvb21Sb3RhdGU9dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLiBBbiBgT2JqZWN0YCB2YWx1ZSBpcyBwYXNzZWQgYXMgb3B0aW9ucyB0byB7QGxpbmsgVG91Y2hab29tUm90YXRlSGFuZGxlciNlbmFibGV9LlxuICogQHBhcmFtIHtib29sZWFuIHwgT2JqZWN0fSBbb3B0aW9ucy50b3VjaFBpdGNoPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiZHJhZyB0byBwaXRjaFwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuIEFuIGBPYmplY3RgIHZhbHVlIGlzIHBhc3NlZCBhcyBvcHRpb25zIHRvIHtAbGluayBUb3VjaFBpdGNoSGFuZGxlcn0uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNvb3BlcmF0aXZlR2VzdHVyZXNdIElmIGB0cnVlYCwgc2Nyb2xsIHpvb20gd2lsbCByZXF1aXJlIHByZXNzaW5nIHRoZSBjdHJsIG9yIOKMmCBrZXkgd2hpbGUgc2Nyb2xsaW5nIHRvIHpvb20gbWFwLCBhbmQgdG91Y2ggcGFuIHdpbGwgcmVxdWlyZSB1c2luZyB0d28gZmluZ2VycyB3aGlsZSBwYW5uaW5nIHRvIG1vdmUgdGhlIG1hcC4gVG91Y2ggcGl0Y2ggd2lsbCByZXF1aXJlIHRocmVlIGZpbmdlcnMgdG8gYWN0aXZhdGUgaWYgZW5hYmxlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhY2tSZXNpemU9dHJ1ZV0gSWYgYHRydWVgLCB0aGUgbWFwIHdpbGwgYXV0b21hdGljYWxseSByZXNpemUgd2hlbiB0aGUgYnJvd3NlciB3aW5kb3cgcmVzaXplcy5cbiAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gW29wdGlvbnMuY2VudGVyPVswLCAwXV0gVGhlIGluaXRpYWwgZ2VvZ3JhcGhpY2FsIFtjZW50ZXJwb2ludF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEjY2VudGVyKSBvZiB0aGUgbWFwLiBJZiBgY2VudGVyYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYFswLCAwXWAgTm90ZTogTWFwYm94IEdMIHVzZXMgbG9uZ2l0dWRlLCBsYXRpdHVkZSBjb29yZGluYXRlIG9yZGVyIChhcyBvcHBvc2VkIHRvIGxhdGl0dWRlLCBsb25naXR1ZGUpIHRvIG1hdGNoIEdlb0pTT04uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuem9vbT0wXSBUaGUgaW5pdGlhbCBbem9vbV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEjem9vbSkgbGV2ZWwgb2YgdGhlIG1hcC4gSWYgYHpvb21gIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMsIE1hcGJveCBHTCBKUyB3aWxsIGxvb2sgZm9yIGl0IGluIHRoZSBtYXAncyBzdHlsZSBvYmplY3QuIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlLCBlaXRoZXIsIGl0IHdpbGwgZGVmYXVsdCB0byBgMGAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmVhcmluZz0wXSBUaGUgaW5pdGlhbCBbYmVhcmluZ10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEjYmVhcmluZykgKHJvdGF0aW9uKSBvZiB0aGUgbWFwLCBtZWFzdXJlZCBpbiBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gbm9ydGguIElmIGBiZWFyaW5nYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYDBgLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnBpdGNoPTBdIFRoZSBpbml0aWFsIFtwaXRjaF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEjcGl0Y2gpICh0aWx0KSBvZiB0aGUgbWFwLCBtZWFzdXJlZCBpbiBkZWdyZWVzIGF3YXkgZnJvbSB0aGUgcGxhbmUgb2YgdGhlIHNjcmVlbiAoMC04NSkuIElmIGBwaXRjaGAgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3Igb3B0aW9ucywgTWFwYm94IEdMIEpTIHdpbGwgbG9vayBmb3IgaXQgaW4gdGhlIG1hcCdzIHN0eWxlIG9iamVjdC4gSWYgaXQgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgc3R5bGUsIGVpdGhlciwgaXQgd2lsbCBkZWZhdWx0IHRvIGAwYC5cbiAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzTGlrZX0gW29wdGlvbnMuYm91bmRzPW51bGxdIFRoZSBpbml0aWFsIGJvdW5kcyBvZiB0aGUgbWFwLiBJZiBgYm91bmRzYCBpcyBzcGVjaWZpZWQsIGl0IG92ZXJyaWRlcyBgY2VudGVyYCBhbmQgYHpvb21gIGNvbnN0cnVjdG9yIG9wdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZml0Qm91bmRzT3B0aW9uc10gQSB7QGxpbmsgTWFwI2ZpdEJvdW5kc30gb3B0aW9ucyBvYmplY3QgdG8gdXNlIF9vbmx5XyB3aGVuIGZpdHRpbmcgdGhlIGluaXRpYWwgYGJvdW5kc2AgcHJvdmlkZWQgYWJvdmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm9wdGltaXplRm9yVGVycmFpbj10cnVlXSBXaXRoIHRlcnJhaW4gb24sIGlmIGB0cnVlYCwgdGhlIG1hcCB3aWxsIHJlbmRlciBmb3IgcGVyZm9ybWFuY2UgcHJpb3JpdHksIHdoaWNoIG1heSBsZWFkIHRvIGxheWVyIHJlb3JkZXJpbmcgYWxsb3dpbmcgdG8gbWF4aW1pemUgcGVyZm9ybWFuY2UgKGxheWVycyB0aGF0IGFyZSBkcmFwZWQgb3ZlciB0ZXJyYWluIHdpbGwgYmUgZHJhd24gZmlyc3QsIGluY2x1ZGluZyBmaWxsLCBsaW5lLCBiYWNrZ3JvdW5kLCBoaWxsc2hhZGUgYW5kIHJhc3RlcikuIE90aGVyd2lzZSwgaWYgc2V0IHRvIGBmYWxzZWAsIHRoZSBtYXAgd2lsbCBhbHdheXMgYmUgZHJhd24gZm9yIGxheWVyIG9yZGVyIHByaW9yaXR5LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZW5kZXJXb3JsZENvcGllcz10cnVlXSBJZiBgdHJ1ZWAsIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgd29ybGQgd2lsbCBiZSByZW5kZXJlZCBzaWRlIGJ5IHNpZGUgYmV5b25kIC0xODAgYW5kIDE4MCBkZWdyZWVzIGxvbmdpdHVkZS4gSWYgc2V0IHRvIGBmYWxzZWA6XG4gKiAtIFdoZW4gdGhlIG1hcCBpcyB6b29tZWQgb3V0IGZhciBlbm91Z2ggdGhhdCBhIHNpbmdsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd29ybGQgZG9lcyBub3QgZmlsbCB0aGUgbWFwJ3MgZW50aXJlXG4gKiBjb250YWluZXIsIHRoZXJlIHdpbGwgYmUgYmxhbmsgc3BhY2UgYmV5b25kIDE4MCBhbmQgLTE4MCBkZWdyZWVzIGxvbmdpdHVkZS5cbiAqIC0gRmVhdHVyZXMgdGhhdCBjcm9zcyAxODAgYW5kIC0xODAgZGVncmVlcyBsb25naXR1ZGUgd2lsbCBiZSBjdXQgaW4gdHdvICh3aXRoIG9uZSBwb3J0aW9uIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZVxuICogbWFwIGFuZCB0aGUgb3RoZXIgb24gdGhlIGxlZnQgZWRnZSBvZiB0aGUgbWFwKSBhdCBldmVyeSB6b29tIGxldmVsLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFRpbGVDYWNoZVNpemU9bnVsbF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbGVzIHN0b3JlZCBpbiB0aGUgdGlsZSBjYWNoZSBmb3IgYSBnaXZlbiBzb3VyY2UuIElmIG9taXR0ZWQsIHRoZSBjYWNoZSB3aWxsIGJlIGR5bmFtaWNhbGx5IHNpemVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseT0nc2Fucy1zZXJpZiddIERlZmluZXMgYSBDU1MgZm9udC1mYW1pbHkgZm9yIGxvY2FsbHkgb3ZlcnJpZGluZyBnZW5lcmF0aW9uIG9mIGdseXBocyBpbiB0aGUgJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnLCAnSGlyYWdhbmEnLCAnS2F0YWthbmEnLCAnSGFuZ3VsIFN5bGxhYmxlcycgYW5kICdDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nIHJhbmdlcy5cbiAqICAgSW4gdGhlc2UgcmFuZ2VzLCBmb250IHNldHRpbmdzIGZyb20gdGhlIG1hcCdzIHN0eWxlIHdpbGwgYmUgaWdub3JlZCwgZXhjZXB0IGZvciBmb250LXdlaWdodCBrZXl3b3JkcyAobGlnaHQvcmVndWxhci9tZWRpdW0vYm9sZCkuXG4gKiAgIFNldCB0byBgZmFsc2VgLCB0byBlbmFibGUgZm9udCBzZXR0aW5ncyBmcm9tIHRoZSBtYXAncyBzdHlsZSBmb3IgdGhlc2UgZ2x5cGggcmFuZ2VzLiBOb3RlIHRoYXQgW01hcGJveCBTdHVkaW9dKGh0dHBzOi8vc3R1ZGlvLm1hcGJveC5jb20vKSBzZXRzIHRoaXMgdmFsdWUgdG8gYGZhbHNlYCBieSBkZWZhdWx0LlxuICogICBUaGUgcHVycG9zZSBvZiB0aGlzIG9wdGlvbiBpcyB0byBhdm9pZCBiYW5kd2lkdGgtaW50ZW5zaXZlIGdseXBoIHNlcnZlciByZXF1ZXN0cy4gRm9yIGFuIGV4YW1wbGUgb2YgdGhpcyBvcHRpb24gaW4gdXNlLCBzZWUgW1VzZSBsb2NhbGx5IGdlbmVyYXRlZCBpZGVvZ3JhcGhzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2xvY2FsLWlkZW9ncmFwaHMpLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsRm9udEZhbWlseT1mYWxzZV0gRGVmaW5lcyBhIENTU1xuICogICBmb250LWZhbWlseSBmb3IgbG9jYWxseSBvdmVycmlkaW5nIGdlbmVyYXRpb24gb2YgYWxsIGdseXBocy4gRm9udCBzZXR0aW5ncyBmcm9tIHRoZSBtYXAncyBzdHlsZSB3aWxsIGJlIGlnbm9yZWQsIGV4Y2VwdCBmb3IgZm9udC13ZWlnaHQga2V5d29yZHMgKGxpZ2h0L3JlZ3VsYXIvbWVkaXVtL2JvbGQpLlxuICogICBJZiBzZXQsIHRoaXMgb3B0aW9uIG92ZXJyaWRlcyB0aGUgc2V0dGluZyBpbiBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkuXG4gKiBAcGFyYW0ge1JlcXVlc3RUcmFuc2Zvcm1GdW5jdGlvbn0gW29wdGlvbnMudHJhbnNmb3JtUmVxdWVzdD1udWxsXSBBIGNhbGxiYWNrIHJ1biBiZWZvcmUgdGhlIE1hcCBtYWtlcyBhIHJlcXVlc3QgZm9yIGFuIGV4dGVybmFsIFVSTC4gVGhlIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgdXJsLCBzZXQgaGVhZGVycywgb3Igc2V0IHRoZSBjcmVkZW50aWFscyBwcm9wZXJ0eSBmb3IgY3Jvc3Mtb3JpZ2luIHJlcXVlc3RzLlxuICogICBFeHBlY3RlZCB0byByZXR1cm4gYSB7QGxpbmsgUmVxdWVzdFBhcmFtZXRlcnN9IG9iamVjdCB3aXRoIGEgYHVybGAgcHJvcGVydHkgYW5kIG9wdGlvbmFsbHkgYGhlYWRlcnNgIGFuZCBgY3JlZGVudGlhbHNgIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNvbGxlY3RSZXNvdXJjZVRpbWluZz1mYWxzZV0gSWYgYHRydWVgLCBSZXNvdXJjZSBUaW1pbmcgQVBJIGluZm9ybWF0aW9uIHdpbGwgYmUgY29sbGVjdGVkIGZvciByZXF1ZXN0cyBtYWRlIGJ5IEdlb0pTT04gYW5kIFZlY3RvciBUaWxlIHdlYiB3b3JrZXJzICh0aGlzIGluZm9ybWF0aW9uIGlzIG5vcm1hbGx5IGluYWNjZXNzaWJsZSBmcm9tIHRoZSBtYWluIEphdmFzY3JpcHQgdGhyZWFkKS4gSW5mb3JtYXRpb24gd2lsbCBiZSByZXR1cm5lZCBpbiBhIGByZXNvdXJjZVRpbWluZ2AgcHJvcGVydHkgb2YgcmVsZXZhbnQgYGRhdGFgIGV2ZW50cy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5mYWRlRHVyYXRpb249MzAwXSBDb250cm9scyB0aGUgZHVyYXRpb24gb2YgdGhlIGZhZGUtaW4vZmFkZS1vdXQgYW5pbWF0aW9uIGZvciBsYWJlbCBjb2xsaXNpb25zLCBpbiBtaWxsaXNlY29uZHMuIFRoaXMgc2V0dGluZyBhZmZlY3RzIGFsbCBzeW1ib2wgbGF5ZXJzLiBUaGlzIHNldHRpbmcgZG9lcyBub3QgYWZmZWN0IHRoZSBkdXJhdGlvbiBvZiBydW50aW1lIHN0eWxpbmcgdHJhbnNpdGlvbnMgb3IgcmFzdGVyIHRpbGUgY3Jvc3MtZmFkaW5nLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jcm9zc1NvdXJjZUNvbGxpc2lvbnM9dHJ1ZV0gSWYgYHRydWVgLCBzeW1ib2xzIGZyb20gbXVsdGlwbGUgc291cmNlcyBjYW4gY29sbGlkZSB3aXRoIGVhY2ggb3RoZXIgZHVyaW5nIGNvbGxpc2lvbiBkZXRlY3Rpb24uIElmIGBmYWxzZWAsIGNvbGxpc2lvbiBkZXRlY3Rpb24gaXMgcnVuIHNlcGFyYXRlbHkgZm9yIHRoZSBzeW1ib2xzIGluIGVhY2ggc291cmNlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmFjY2Vzc1Rva2VuPW51bGxdIElmIHNwZWNpZmllZCwgbWFwIHdpbGwgdXNlIHRoaXMgW3Rva2VuXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L2FjY2Vzcy10b2tlbi8pIGluc3RlYWQgb2YgdGhlIG9uZSBkZWZpbmVkIGluIGBtYXBib3hnbC5hY2Nlc3NUb2tlbmAuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMubG9jYWxlPW51bGxdIEEgcGF0Y2ggdG8gYXBwbHkgdG8gdGhlIGRlZmF1bHQgbG9jYWxpemF0aW9uIHRhYmxlIGZvciBVSSBzdHJpbmdzIHN1Y2ggYXMgY29udHJvbCB0b29sdGlwcy4gVGhlIGBsb2NhbGVgIG9iamVjdCBtYXBzIG5hbWVzcGFjZWQgVUkgc3RyaW5nIElEcyB0byB0cmFuc2xhdGVkIHN0cmluZ3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZTtcbiAqICBzZWUgYHNyYy91aS9kZWZhdWx0X2xvY2FsZS5qc2AgZm9yIGFuIGV4YW1wbGUgd2l0aCBhbGwgc3VwcG9ydGVkIHN0cmluZyBJRHMuIFRoZSBvYmplY3QgbWF5IHNwZWNpZnkgYWxsIFVJIHN0cmluZ3MgKHRoZXJlYnkgYWRkaW5nIHN1cHBvcnQgZm9yIGEgbmV3IHRyYW5zbGF0aW9uKSBvciBvbmx5IGEgc3Vic2V0IG9mIHN0cmluZ3MgKHRoZXJlYnkgcGF0Y2hpbmcgdGhlIGRlZmF1bHQgdHJhbnNsYXRpb24gdGFibGUpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50ZXN0TW9kZT1mYWxzZV0gU2lsZW5jZXMgZXJyb3JzIGFuZCB3YXJuaW5ncyBnZW5lcmF0ZWQgZHVlIHRvIGFuIGludmFsaWQgYWNjZXNzVG9rZW4sIHVzZWZ1bCB3aGVuIHVzaW5nIHRoZSBsaWJyYXJ5IHRvIHdyaXRlIHVuaXQgdGVzdHMuXG4gKiBAcGFyYW0ge1Byb2plY3Rpb25TcGVjaWZpY2F0aW9ufSBbb3B0aW9ucy5wcm9qZWN0aW9uPSdtZXJjYXRvciddIFRoZSBbcHJvamVjdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9wcm9qZWN0aW9uLykgdGhlIG1hcCBzaG91bGQgYmUgcmVuZGVyZWQgaW4uXG4gKiBTdXBwb3J0ZWQgcHJvamVjdGlvbnMgYXJlOlxuICogICogW0FsYmVyc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWxiZXJzX3Byb2plY3Rpb24pIGVxdWFsLWFyZWEgY29uaWMgcHJvamVjdGlvbiBhcyBgYWxiZXJzYFxuICogICogW0VxdWFsIEVhcnRoXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FcXVhbF9FYXJ0aF9wcm9qZWN0aW9uKSBlcXVhbC1hcmVhIHBzZXVkb2N5bGluZHJpY2FsIHByb2plY3Rpb24gYXMgYGVxdWFsRWFydGhgXG4gKiAgKiBbRXF1aXJlY3Rhbmd1bGFyXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FcXVpcmVjdGFuZ3VsYXJfcHJvamVjdGlvbikgKFBsYXRlIENhcnLDqWUvV0dTODQpIGFzIGBlcXVpcmVjdGFuZ3VsYXJgXG4gKiAgKiBbTGFtYmVydCBDb25mb3JtYWwgQ29uaWNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhbWJlcnRfY29uZm9ybWFsX2NvbmljX3Byb2plY3Rpb24pIGFzIGBsYW1iZXJ0Q29uZm9ybWFsQ29uaWNgXG4gKiAgKiBbTWVyY2F0b3JdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01lcmNhdG9yX3Byb2plY3Rpb24pIGN5bGluZHJpY2FsIG1hcCBwcm9qZWN0aW9uIGFzIGBtZXJjYXRvcmBcbiAqICAqIFtOYXR1cmFsIEVhcnRoXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OYXR1cmFsX0VhcnRoX3Byb2plY3Rpb24pIHBzZXVkb2N5bGluZHJpY2FsIG1hcCBwcm9qZWN0aW9uIGFzIGBuYXR1cmFsRWFydGhgXG4gKiAgKiBbV2lua2VsIFRyaXBlbF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2lua2VsX3RyaXBlbF9wcm9qZWN0aW9uKSBhemltdXRoYWwgbWFwIHByb2plY3Rpb24gYXMgYHdpbmtlbFRyaXBlbGBcbiAqICBDb25pYyBwcm9qZWN0aW9ucyBzdWNoIGFzIEFsYmVycyBhbmQgTGFtYmVydCBoYXZlIGNvbmZpZ3VyYWJsZSBgY2VudGVyYCBhbmQgYHBhcmFsbGVsc2AgcHJvcGVydGllcyB0aGF0IGFsbG93IGRldmVsb3BlcnMgdG8gZGVmaW5lIHRoZSByZWdpb24gaW4gd2hpY2ggdGhlIHByb2plY3Rpb24gaGFzIG1pbmltYWwgZGlzdG9ydGlvbjsgc2VlIHRoZSBleGFtcGxlIGZvciBob3cgdG8gY29uZmlndXJlIHRoZXNlIHByb3BlcnRpZXMuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7XG4gKiAgICAgY29udGFpbmVyOiAnbWFwJywgLy8gY29udGFpbmVyIElEXG4gKiAgICAgY2VudGVyOiBbLTEyMi40MjA2NzksIDM3Ljc3MjUzN10sIC8vIHN0YXJ0aW5nIHBvc2l0aW9uIFtsbmcsIGxhdF1cbiAqICAgICB6b29tOiAxMywgLy8gc3RhcnRpbmcgem9vbVxuICogICAgIHN0eWxlOiAnbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zdHJlZXRzLXYxMScsIC8vIHN0eWxlIFVSTCBvciBzdHlsZSBvYmplY3RcbiAqICAgICBoYXNoOiB0cnVlLCAvLyBzeW5jIGBjZW50ZXJgLCBgem9vbWAsIGBwaXRjaGAsIGFuZCBgYmVhcmluZ2Agd2l0aCBVUkxcbiAqICAgICAvLyBVc2UgYHRyYW5zZm9ybVJlcXVlc3RgIHRvIG1vZGlmeSByZXF1ZXN0cyB0aGF0IGJlZ2luIHdpdGggYGh0dHA6Ly9teUhvc3RgLlxuICogICAgIHRyYW5zZm9ybVJlcXVlc3Q6ICh1cmwsIHJlc291cmNlVHlwZSkgPT4ge1xuICogICAgICAgICBpZiAocmVzb3VyY2VUeXBlID09PSAnU291cmNlJyAmJiB1cmwuc3RhcnRzV2l0aCgnaHR0cDovL215SG9zdCcpKSB7XG4gKiAgICAgICAgICAgICByZXR1cm4ge1xuICogICAgICAgICAgICAgICAgIHVybDogdXJsLnJlcGxhY2UoJ2h0dHAnLCAnaHR0cHMnKSxcbiAqICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7J215LWN1c3RvbS1oZWFkZXInOiB0cnVlfSxcbiAqICAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnICAvLyBJbmNsdWRlIGNvb2tpZXMgZm9yIGNyb3NzLW9yaWdpbiByZXF1ZXN0c1xuICogICAgICAgICAgICAgfTtcbiAqICAgICAgICAgfVxuICogICAgIH1cbiAqIH0pO1xuICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIG1hcCBvbiBhIHdlYnBhZ2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NpbXBsZS1tYXAvKVxuICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIG1hcCB3aXRoIGEgY3VzdG9tIHN0eWxlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jdXN0b20tc3R5bGUtaWQvKVxuICogQHNlZSBbRXhhbXBsZTogQ2hlY2sgaWYgTWFwYm94IEdMIEpTIGlzIHN1cHBvcnRlZF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2hlY2stZm9yLXN1cHBvcnQvKVxuICovXG5jbGFzcyBNYXAgZXh0ZW5kcyBDYW1lcmEge1xuICAgIHN0eWxlOiBTdHlsZTtcbiAgICBwYWludGVyOiBQYWludGVyO1xuICAgIGhhbmRsZXJzOiBIYW5kbGVyTWFuYWdlcjtcblxuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9taXNzaW5nQ1NTQ2FuYXJ5OiBIVE1MRWxlbWVudDtcbiAgICBfY2FudmFzQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfY29udHJvbENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2NvbnRyb2xQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSFRNTEVsZW1lbnR9O1xuICAgIF9pbnRlcmFjdGl2ZTogP2Jvb2xlYW47XG4gICAgX3Nob3dUaWxlQm91bmRhcmllczogP2Jvb2xlYW47XG4gICAgX3Nob3dUZXJyYWluV2lyZWZyYW1lOiA/Ym9vbGVhbjtcbiAgICBfc2hvd1F1ZXJ5R2VvbWV0cnk6ID9ib29sZWFuO1xuICAgIF9zaG93Q29sbGlzaW9uQm94ZXM6ID9ib29sZWFuO1xuICAgIF9zaG93UGFkZGluZzogP2Jvb2xlYW47XG4gICAgX3Nob3dPdmVyZHJhd0luc3BlY3RvcjogYm9vbGVhbjtcbiAgICBfcmVwYWludDogP2Jvb2xlYW47XG4gICAgX3ZlcnRpY2VzOiA/Ym9vbGVhbjtcbiAgICBfY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICBfbWluVGlsZUNhY2hlU2l6ZTogbnVtYmVyO1xuICAgIF9tYXhUaWxlQ2FjaGVTaXplOiBudW1iZXI7XG4gICAgX2ZyYW1lOiA/Q2FuY2VsYWJsZTtcbiAgICBfcmVuZGVyTmV4dEZyYW1lOiA/Ym9vbGVhbjtcbiAgICBfc3R5bGVEaXJ0eTogP2Jvb2xlYW47XG4gICAgX3NvdXJjZXNEaXJ0eTogP2Jvb2xlYW47XG4gICAgX3BsYWNlbWVudERpcnR5OiA/Ym9vbGVhbjtcbiAgICBfbG9hZGVkOiBib29sZWFuO1xuICAgIC8vIGFjY291bnRzIGZvciBwbGFjZW1lbnQgZmluaXNoaW5nIGFzIHdlbGxcbiAgICBfZnVsbHlMb2FkZWQ6IGJvb2xlYW47XG4gICAgX3RyYWNrUmVzaXplOiBib29sZWFuO1xuICAgIF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IGJvb2xlYW47XG4gICAgX2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IGJvb2xlYW47XG4gICAgX2FudGlhbGlhczogYm9vbGVhbjtcbiAgICBfcmVmcmVzaEV4cGlyZWRUaWxlczogYm9vbGVhbjtcbiAgICBfaGFzaDogSGFzaDtcbiAgICBfZGVsZWdhdGVkTGlzdGVuZXJzOiBhbnk7XG4gICAgX2lzSW5pdGlhbExvYWQ6IGJvb2xlYW47XG4gICAgX3Nob3VsZENoZWNrQWNjZXNzOiBib29sZWFuO1xuICAgIF9mYWRlRHVyYXRpb246IG51bWJlcjtcbiAgICBfY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuO1xuICAgIF9jcm9zc0ZhZGluZ0ZhY3RvcjogbnVtYmVyO1xuICAgIF9jb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW47XG4gICAgX29wdGltaXplRm9yVGVycmFpbjogYm9vbGVhbjtcbiAgICBfdHJhbnNpdGlvbkZyb21HbG9iZTogYm9vbGVhbjtcbiAgICBfcmVuZGVyVGFza1F1ZXVlOiBUYXNrUXVldWU7XG4gICAgX2RvbVJlbmRlclRhc2tRdWV1ZTogVGFza1F1ZXVlO1xuICAgIF9jb250cm9sczogQXJyYXk8SUNvbnRyb2w+O1xuICAgIF9tYXJrZXJzOiBBcnJheTxNYXJrZXI+O1xuICAgIF9sb2dvQ29udHJvbDogSUNvbnRyb2w7XG4gICAgX21hcElkOiBudW1iZXI7XG4gICAgX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseTogc3RyaW5nO1xuICAgIF9sb2NhbEZvbnRGYW1pbHk6IHN0cmluZztcbiAgICBfcmVxdWVzdE1hbmFnZXI6IFJlcXVlc3RNYW5hZ2VyO1xuICAgIF9sb2NhbGU6IE9iamVjdDtcbiAgICBfcmVtb3ZlZDogYm9vbGVhbjtcbiAgICBfc3BlZWRJbmRleFRpbWluZzogYm9vbGVhbjtcbiAgICBfY2xpY2tUb2xlcmFuY2U6IG51bWJlcjtcbiAgICBfY29vcGVyYXRpdmVHZXN0dXJlczogYm9vbGVhbjtcbiAgICBfc2lsZW5jZUF1dGhFcnJvcnM6IGJvb2xlYW47XG4gICAgX2F2ZXJhZ2VFbGV2YXRpb25MYXN0U2FtcGxlZEF0OiBudW1iZXI7XG4gICAgX2F2ZXJhZ2VFbGV2YXRpb246IEVhc2VkVmFyaWFibGU7XG4gICAgX3J1bnRpbWVQcm9qZWN0aW9uOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbiB8IHZvaWQgfCBudWxsO1xuICAgIF9jb250YWluZXJXaWR0aDogbnVtYmVyO1xuICAgIF9jb250YWluZXJIZWlnaHQ6IG51bWJlclxuXG4gICAgLyoqIEBzZWN0aW9uIHtJbnRlcmFjdGlvbiBoYW5kbGVyc30gKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgU2Nyb2xsWm9vbUhhbmRsZXJ9LCB3aGljaCBpbXBsZW1lbnRzIHpvb21pbmcgaW4gYW5kIG91dCB3aXRoIGEgc2Nyb2xsIHdoZWVsIG9yIHRyYWNrcGFkLlxuICAgICAqIEZpbmQgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcyB1c2luZyBgc2Nyb2xsWm9vbWAgaW4gdGhlIHtAbGluayBTY3JvbGxab29tSGFuZGxlcn0gc2VjdGlvbi5cbiAgICAgKi9cbiAgICBzY3JvbGxab29tOiBTY3JvbGxab29tSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgQm94Wm9vbUhhbmRsZXJ9LCB3aGljaCBpbXBsZW1lbnRzIHpvb21pbmcgdXNpbmcgYSBkcmFnIGdlc3R1cmUgd2l0aCB0aGUgU2hpZnQga2V5IHByZXNzZWQuXG4gICAgICogRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGBib3hab29tYCBpbiB0aGUge0BsaW5rIEJveFpvb21IYW5kbGVyfSBzZWN0aW9uLlxuICAgICAqL1xuICAgIGJveFpvb206IEJveFpvb21IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0sIHdoaWNoIGltcGxlbWVudHMgcm90YXRpbmcgdGhlIG1hcCB3aGlsZSBkcmFnZ2luZyB3aXRoIHRoZSByaWdodFxuICAgICAqIG1vdXNlIGJ1dHRvbiBvciB3aXRoIHRoZSBDb250cm9sIGtleSBwcmVzc2VkLiBGaW5kIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMgdXNpbmcgYGRyYWdSb3RhdGVgXG4gICAgICogaW4gdGhlIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0gc2VjdGlvbi5cbiAgICAgKi9cbiAgICBkcmFnUm90YXRlOiBEcmFnUm90YXRlSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgRHJhZ1BhbkhhbmRsZXJ9LCB3aGljaCBpbXBsZW1lbnRzIGRyYWdnaW5nIHRoZSBtYXAgd2l0aCBhIG1vdXNlIG9yIHRvdWNoIGdlc3R1cmUuXG4gICAgICogRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGBkcmFnUGFuYCBpbiB0aGUge0BsaW5rIERyYWdQYW5IYW5kbGVyfSBzZWN0aW9uLlxuICAgICAqL1xuICAgIGRyYWdQYW46IERyYWdQYW5IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBLZXlib2FyZEhhbmRsZXJ9LCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSwgcm90YXRlLCBhbmQgcGFuIHRoZSBtYXAgdXNpbmcga2V5Ym9hcmRcbiAgICAgKiBzaG9ydGN1dHMuIEZpbmQgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcyB1c2luZyBga2V5Ym9hcmRgIGluIHRoZSB7QGxpbmsgS2V5Ym9hcmRIYW5kbGVyfSBzZWN0aW9uLlxuICAgICAqL1xuICAgIGtleWJvYXJkOiBLZXlib2FyZEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWFwJ3Mge0BsaW5rIERvdWJsZUNsaWNrWm9vbUhhbmRsZXJ9LCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSBieSBkb3VibGUgY2xpY2tpbmcuXG4gICAgICogRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGBkb3VibGVDbGlja1pvb21gIGluIHRoZSB7QGxpbmsgRG91YmxlQ2xpY2tab29tSGFuZGxlcn0gc2VjdGlvbi5cbiAgICAgKi9cbiAgICBkb3VibGVDbGlja1pvb206IERvdWJsZUNsaWNrWm9vbUhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWFwJ3Mge0BsaW5rIFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXJ9LCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSBvciByb3RhdGUgdGhlIG1hcCB3aXRoIHRvdWNoIGdlc3R1cmVzLlxuICAgICAqIEZpbmQgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcyB1c2luZyBgdG91Y2hab29tUm90YXRlYCBpbiB0aGUge0BsaW5rIFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXJ9IHNlY3Rpb24uXG4gICAgICovXG4gICAgdG91Y2hab29tUm90YXRlOiBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBUb3VjaFBpdGNoSGFuZGxlcn0sIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBwaXRjaCB0aGUgbWFwIHdpdGggdG91Y2ggZ2VzdHVyZXMuXG4gICAgICogRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGB0b3VjaFBpdGNoYCBpbiB0aGUge0BsaW5rIFRvdWNoUGl0Y2hIYW5kbGVyfSBzZWN0aW9uLlxuICAgICAqL1xuICAgIHRvdWNoUGl0Y2g6IFRvdWNoUGl0Y2hIYW5kbGVyO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogTWFwT3B0aW9ucykge1xuICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLm1hcmsoUGVyZm9ybWFuY2VNYXJrZXJzLmNyZWF0ZSk7XG5cbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLm1pblpvb20gIT0gbnVsbCAmJiBvcHRpb25zLm1heFpvb20gIT0gbnVsbCAmJiBvcHRpb25zLm1pblpvb20gPiBvcHRpb25zLm1heFpvb20pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbWF4Wm9vbSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5ab29tYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5taW5QaXRjaCAhPSBudWxsICYmIG9wdGlvbnMubWF4UGl0Y2ggIT0gbnVsbCAmJiBvcHRpb25zLm1pblBpdGNoID4gb3B0aW9ucy5tYXhQaXRjaCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtYXhQaXRjaCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5QaXRjaGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWluUGl0Y2ggIT0gbnVsbCAmJiBvcHRpb25zLm1pblBpdGNoIDwgZGVmYXVsdE1pblBpdGNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pblBpdGNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7ZGVmYXVsdE1pblBpdGNofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4UGl0Y2ggIT0gbnVsbCAmJiBvcHRpb25zLm1heFBpdGNoID4gZGVmYXVsdE1heFBpdGNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1heFBpdGNoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7ZGVmYXVsdE1heFBpdGNofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShvcHRpb25zLm1pblpvb20sIG9wdGlvbnMubWF4Wm9vbSwgb3B0aW9ucy5taW5QaXRjaCwgb3B0aW9ucy5tYXhQaXRjaCwgb3B0aW9ucy5yZW5kZXJXb3JsZENvcGllcyk7XG4gICAgICAgIHN1cGVyKHRyYW5zZm9ybSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5faW50ZXJhY3RpdmUgPSBvcHRpb25zLmludGVyYWN0aXZlO1xuICAgICAgICB0aGlzLl9taW5UaWxlQ2FjaGVTaXplID0gb3B0aW9ucy5taW5UaWxlQ2FjaGVTaXplO1xuICAgICAgICB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID0gb3B0aW9ucy5tYXhUaWxlQ2FjaGVTaXplO1xuICAgICAgICB0aGlzLl9mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0ID0gb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0O1xuICAgICAgICB0aGlzLl9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgPSBvcHRpb25zLnByZXNlcnZlRHJhd2luZ0J1ZmZlcjtcbiAgICAgICAgdGhpcy5fYW50aWFsaWFzID0gb3B0aW9ucy5hbnRpYWxpYXM7XG4gICAgICAgIHRoaXMuX3RyYWNrUmVzaXplID0gb3B0aW9ucy50cmFja1Jlc2l6ZTtcbiAgICAgICAgdGhpcy5fYmVhcmluZ1NuYXAgPSBvcHRpb25zLmJlYXJpbmdTbmFwO1xuICAgICAgICB0aGlzLl9yZWZyZXNoRXhwaXJlZFRpbGVzID0gb3B0aW9ucy5yZWZyZXNoRXhwaXJlZFRpbGVzO1xuICAgICAgICB0aGlzLl9mYWRlRHVyYXRpb24gPSBvcHRpb25zLmZhZGVEdXJhdGlvbjtcbiAgICAgICAgdGhpcy5faXNJbml0aWFsTG9hZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2Nyb3NzU291cmNlQ29sbGlzaW9ucyA9IG9wdGlvbnMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zO1xuICAgICAgICB0aGlzLl9jcm9zc0ZhZGluZ0ZhY3RvciA9IDE7XG4gICAgICAgIHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyA9IG9wdGlvbnMuY29sbGVjdFJlc291cmNlVGltaW5nO1xuICAgICAgICB0aGlzLl9vcHRpbWl6ZUZvclRlcnJhaW4gPSBvcHRpb25zLm9wdGltaXplRm9yVGVycmFpbjtcbiAgICAgICAgdGhpcy5fcmVuZGVyVGFza1F1ZXVlID0gbmV3IFRhc2tRdWV1ZSgpO1xuICAgICAgICB0aGlzLl9kb21SZW5kZXJUYXNrUXVldWUgPSBuZXcgVGFza1F1ZXVlKCk7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xzID0gW107XG4gICAgICAgIHRoaXMuX21hcmtlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5fbWFwSWQgPSB1bmlxdWVJZCgpO1xuICAgICAgICB0aGlzLl9sb2NhbGUgPSBleHRlbmQoe30sIGRlZmF1bHRMb2NhbGUsIG9wdGlvbnMubG9jYWxlKTtcbiAgICAgICAgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSBvcHRpb25zLmNsaWNrVG9sZXJhbmNlO1xuICAgICAgICB0aGlzLl9jb29wZXJhdGl2ZUdlc3R1cmVzID0gb3B0aW9ucy5jb29wZXJhdGl2ZUdlc3R1cmVzO1xuICAgICAgICB0aGlzLl9jb250YWluZXJXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckhlaWdodCA9IDA7XG5cbiAgICAgICAgdGhpcy5fYXZlcmFnZUVsZXZhdGlvbkxhc3RTYW1wbGVkQXQgPSAtSW5maW5pdHk7XG4gICAgICAgIHRoaXMuX2F2ZXJhZ2VFbGV2YXRpb24gPSBuZXcgRWFzZWRWYXJpYWJsZSgwKTtcblxuICAgICAgICB0aGlzLl9yZXF1ZXN0TWFuYWdlciA9IG5ldyBSZXF1ZXN0TWFuYWdlcihvcHRpb25zLnRyYW5zZm9ybVJlcXVlc3QsIG9wdGlvbnMuYWNjZXNzVG9rZW4sIG9wdGlvbnMudGVzdE1vZGUpO1xuICAgICAgICB0aGlzLl9zaWxlbmNlQXV0aEVycm9ycyA9ICEhb3B0aW9ucy50ZXN0TW9kZTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29udGFpbmVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9wdGlvbnMuY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnRhaW5lciAnJHtvcHRpb25zLmNvbnRhaW5lcn0nIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmNvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0eXBlOiAnY29udGFpbmVyJyBtdXN0IGJlIGEgU3RyaW5nIG9yIEhUTUxFbGVtZW50LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGBUaGUgbWFwIGNvbnRhaW5lciBlbGVtZW50IHNob3VsZCBiZSBlbXB0eSwgb3RoZXJ3aXNlIHRoZSBtYXAncyBpbnRlcmFjdGl2aXR5IHdpbGwgYmUgbmVnYXRpdmVseSBpbXBhY3RlZC4gSWYgeW91IHdhbnQgdG8gZGlzcGxheSBhIG1lc3NhZ2Ugd2hlbiBXZWJHTCBpcyBub3Qgc3VwcG9ydGVkLCB1c2UgdGhlIE1hcGJveCBHTCBTdXBwb3J0ZWQgcGx1Z2luIGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5tYXhCb3VuZHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TWF4Qm91bmRzKG9wdGlvbnMubWF4Qm91bmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbldpbmRvd09ubGluZScsXG4gICAgICAgICAgICAnX29uV2luZG93UmVzaXplJyxcbiAgICAgICAgICAgICdfb25NYXBTY3JvbGwnLFxuICAgICAgICAgICAgJ19jb250ZXh0TG9zdCcsXG4gICAgICAgICAgICAnX2NvbnRleHRSZXN0b3JlZCdcbiAgICAgICAgXSwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5fc2V0dXBDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fc2V0dXBQYWludGVyKCk7XG4gICAgICAgIGlmICh0aGlzLnBhaW50ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub24oJ21vdmUnLCAoKSA9PiB0aGlzLl91cGRhdGUoZmFsc2UpKTtcbiAgICAgICAgdGhpcy5vbignbW92ZWVuZCcsICgpID0+IHRoaXMuX3VwZGF0ZShmYWxzZSkpO1xuICAgICAgICB0aGlzLm9uKCd6b29tJywgKCkgPT4gdGhpcy5fdXBkYXRlKHRydWUpKTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvbmxpbmUnLCB0aGlzLl9vbldpbmRvd09ubGluZSwgZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uV2luZG93UmVzaXplLCBmYWxzZSk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IG5ldyBIYW5kbGVyTWFuYWdlcih0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9sb2NhbEZvbnRGYW1pbHkgPSBvcHRpb25zLmxvY2FsRm9udEZhbWlseTtcbiAgICAgICAgdGhpcy5fbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ID0gb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUob3B0aW9ucy5zdHlsZSwge2xvY2FsRm9udEZhbWlseTogdGhpcy5fbG9jYWxGb250RmFtaWx5LCBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6IHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucHJvamVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZXRQcm9qZWN0aW9uKG9wdGlvbnMucHJvamVjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYXNoTmFtZSA9ICh0eXBlb2Ygb3B0aW9ucy5oYXNoID09PSAnc3RyaW5nJyAmJiBvcHRpb25zLmhhc2gpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5faGFzaCA9IG9wdGlvbnMuaGFzaCAmJiAobmV3IEhhc2goaGFzaE5hbWUpKS5hZGRUbyh0aGlzKTtcbiAgICAgICAgLy8gZG9uJ3Qgc2V0IHBvc2l0aW9uIGZyb20gb3B0aW9ucyBpZiBzZXQgdGhyb3VnaCBoYXNoXG4gICAgICAgIGlmICghdGhpcy5faGFzaCB8fCAhdGhpcy5faGFzaC5fb25IYXNoQ2hhbmdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuanVtcFRvKHtcbiAgICAgICAgICAgICAgICBjZW50ZXI6IG9wdGlvbnMuY2VudGVyLFxuICAgICAgICAgICAgICAgIHpvb206IG9wdGlvbnMuem9vbSxcbiAgICAgICAgICAgICAgICBiZWFyaW5nOiBvcHRpb25zLmJlYXJpbmcsXG4gICAgICAgICAgICAgICAgcGl0Y2g6IG9wdGlvbnMucGl0Y2hcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5ib3VuZHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZml0Qm91bmRzKG9wdGlvbnMuYm91bmRzLCBleHRlbmQoe30sIG9wdGlvbnMuZml0Qm91bmRzT3B0aW9ucywge2R1cmF0aW9uOiAwfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2wpXG4gICAgICAgICAgICB0aGlzLmFkZENvbnRyb2wobmV3IEF0dHJpYnV0aW9uQ29udHJvbCh7Y3VzdG9tQXR0cmlidXRpb246IG9wdGlvbnMuY3VzdG9tQXR0cmlidXRpb259KSk7XG5cbiAgICAgICAgdGhpcy5fbG9nb0NvbnRyb2wgPSBuZXcgTG9nb0NvbnRyb2woKTtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sKHRoaXMuX2xvZ29Db250cm9sLCBvcHRpb25zLmxvZ29Qb3NpdGlvbik7XG5cbiAgICAgICAgdGhpcy5vbignc3R5bGUubG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybS51bm1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5qdW1wVG8oKHRoaXMuc3R5bGUuc3R5bGVzaGVldDogYW55KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uKCdkYXRhJywgKGV2ZW50OiBNYXBEYXRhRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZShldmVudC5kYXRhVHlwZSA9PT0gJ3N0eWxlJyk7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KGAke2V2ZW50LmRhdGFUeXBlfWRhdGFgLCBldmVudCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbignZGF0YWxvYWRpbmcnLCAoZXZlbnQ6IE1hcERhdGFFdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudChgJHtldmVudC5kYXRhVHlwZX1kYXRhbG9hZGluZ2AsIGV2ZW50KSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qXG4gICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlciBmb3IgdGhpcyBtYXAgaW5zdGFuY2Ugd2hpY2ggaXMgdXNlZCBmb3IgdGhlIE1hcExvYWRFdmVudFxuICAgICogdG8gbWFrZSBzdXJlIHdlIG9ubHkgZmlyZSBvbmUgZXZlbnQgcGVyIGluc3RhbnRpYXRlZCBtYXAgb2JqZWN0LlxuICAgICogQHByaXZhdGVcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgKi9cbiAgICBfZ2V0TWFwSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXBJZDtcbiAgICB9XG5cbiAgICAvKiogQHNlY3Rpb24ge0NvbnRyb2xzfSAqL1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbiB7QGxpbmsgSUNvbnRyb2x9IHRvIHRoZSBtYXAsIGNhbGxpbmcgYGNvbnRyb2wub25BZGQodGhpcylgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtJQ29udHJvbH0gY29udHJvbCBUaGUge0BsaW5rIElDb250cm9sfSB0byBhZGQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwb3NpdGlvbl0gUG9zaXRpb24gb24gdGhlIG1hcCB0byB3aGljaCB0aGUgY29udHJvbCB3aWxsIGJlIGFkZGVkLlxuICAgICAqIFZhbGlkIHZhbHVlcyBhcmUgYCd0b3AtbGVmdCdgLCBgJ3RvcC1yaWdodCdgLCBgJ2JvdHRvbS1sZWZ0J2AsIGFuZCBgJ2JvdHRvbS1yaWdodCdgLiBEZWZhdWx0cyB0byBgJ3RvcC1yaWdodCdgLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBBZGQgem9vbSBhbmQgcm90YXRpb24gY29udHJvbHMgdG8gdGhlIG1hcC5cbiAgICAgKiBtYXAuYWRkQ29udHJvbChuZXcgbWFwYm94Z2wuTmF2aWdhdGlvbkNvbnRyb2woKSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBtYXAgbmF2aWdhdGlvbiBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9uYXZpZ2F0aW9uLylcbiAgICAgKi9cbiAgICBhZGRDb250cm9sKGNvbnRyb2w6IElDb250cm9sLCBwb3NpdGlvbj86IENvbnRyb2xQb3NpdGlvbikge1xuICAgICAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wuZ2V0RGVmYXVsdFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb250cm9sLmdldERlZmF1bHRQb3NpdGlvbigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICd0b3AtcmlnaHQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghY29udHJvbCB8fCAhY29udHJvbC5vbkFkZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnQgdG8gbWFwLmFkZENvbnRyb2woKS4gQXJndW1lbnQgbXVzdCBiZSBhIGNvbnRyb2wgd2l0aCBvbkFkZCBhbmQgb25SZW1vdmUgbWV0aG9kcy4nKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRyb2xFbGVtZW50ID0gY29udHJvbC5vbkFkZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fY29udHJvbHMucHVzaChjb250cm9sKTtcblxuICAgICAgICBjb25zdCBwb3NpdGlvbkNvbnRhaW5lciA9IHRoaXMuX2NvbnRyb2xQb3NpdGlvbnNbcG9zaXRpb25dO1xuICAgICAgICBpZiAocG9zaXRpb24uaW5kZXhPZignYm90dG9tJykgIT09IC0xKSB7XG4gICAgICAgICAgICBwb3NpdGlvbkNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY29udHJvbEVsZW1lbnQsIHBvc2l0aW9uQ29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zaXRpb25Db250YWluZXIuYXBwZW5kQ2hpbGQoY29udHJvbEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGNvbnRyb2wgZnJvbSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtJQ29udHJvbH0gY29udHJvbCBUaGUge0BsaW5rIElDb250cm9sfSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIERlZmluZSBhIG5ldyBuYXZpZ2F0aW9uIGNvbnRyb2wuXG4gICAgICogY29uc3QgbmF2aWdhdGlvbiA9IG5ldyBtYXBib3hnbC5OYXZpZ2F0aW9uQ29udHJvbCgpO1xuICAgICAqIC8vIEFkZCB6b29tIGFuZCByb3RhdGlvbiBjb250cm9scyB0byB0aGUgbWFwLlxuICAgICAqIG1hcC5hZGRDb250cm9sKG5hdmlnYXRpb24pO1xuICAgICAqIC8vIFJlbW92ZSB6b29tIGFuZCByb3RhdGlvbiBjb250cm9scyBmcm9tIHRoZSBtYXAuXG4gICAgICogbWFwLnJlbW92ZUNvbnRyb2wobmF2aWdhdGlvbik7XG4gICAgICovXG4gICAgcmVtb3ZlQ29udHJvbChjb250cm9sOiBJQ29udHJvbCkge1xuICAgICAgICBpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wub25SZW1vdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHRvIG1hcC5yZW1vdmVDb250cm9sKCkuIEFyZ3VtZW50IG11c3QgYmUgYSBjb250cm9sIHdpdGggb25BZGQgYW5kIG9uUmVtb3ZlIG1ldGhvZHMuJykpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaSA9IHRoaXMuX2NvbnRyb2xzLmluZGV4T2YoY29udHJvbCk7XG4gICAgICAgIGlmIChjaSA+IC0xKSB0aGlzLl9jb250cm9scy5zcGxpY2UoY2ksIDEpO1xuICAgICAgICBjb250cm9sLm9uUmVtb3ZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjb250cm9sIGlzIG9uIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0lDb250cm9sfSBjb250cm9sIFRoZSB7QGxpbmsgSUNvbnRyb2x9IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG1hcCBjb250YWlucyBjb250cm9sLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gRGVmaW5lIGEgbmV3IG5hdmlnYXRpb24gY29udHJvbC5cbiAgICAgKiBjb25zdCBuYXZpZ2F0aW9uID0gbmV3IG1hcGJveGdsLk5hdmlnYXRpb25Db250cm9sKCk7XG4gICAgICogLy8gQWRkIHpvb20gYW5kIHJvdGF0aW9uIGNvbnRyb2xzIHRvIHRoZSBtYXAuXG4gICAgICogbWFwLmFkZENvbnRyb2wobmF2aWdhdGlvbik7XG4gICAgICogLy8gQ2hlY2sgdGhhdCB0aGUgbmF2aWdhdGlvbiBjb250cm9sIGV4aXN0cyBvbiB0aGUgbWFwLlxuICAgICAqIGNvbnN0IGFkZGVkID0gbWFwLmhhc0NvbnRyb2wobmF2aWdhdGlvbik7XG4gICAgICogLy8gYWRkZWQgPT09IHRydWVcbiAgICAgKi9cbiAgICBoYXNDb250cm9sKGNvbnRyb2w6IElDb250cm9sKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250cm9scy5pbmRleE9mKGNvbnRyb2wpID4gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgY29udGFpbmluZyBIVE1MIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IFRoZSBtYXAncyBjb250YWluZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBjb250YWluZXIgPSBtYXAuZ2V0Q29udGFpbmVyKCk7XG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIEhUTUwgZWxlbWVudCBjb250YWluaW5nIHRoZSBtYXAncyBgPGNhbnZhcz5gIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBhZGQgbm9uLUdMIG92ZXJsYXlzIHRvIHRoZSBtYXAsIHlvdSBzaG91bGQgYXBwZW5kIHRoZW0gdG8gdGhpcyBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBpcyB0aGUgZWxlbWVudCB0byB3aGljaCBldmVudCBiaW5kaW5ncyBmb3IgbWFwIGludGVyYWN0aXZpdHkgKHN1Y2ggYXMgcGFubmluZyBhbmQgem9vbWluZykgYXJlXG4gICAgICogYXR0YWNoZWQuIEl0IHdpbGwgcmVjZWl2ZSBidWJibGVkIGV2ZW50cyBmcm9tIGNoaWxkIGVsZW1lbnRzIHN1Y2ggYXMgdGhlIGA8Y2FudmFzPmAsIGJ1dCBub3QgZnJvbVxuICAgICAqIG1hcCBjb250cm9scy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIGNvbnRhaW5lciBvZiB0aGUgbWFwJ3MgYDxjYW52YXM+YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhbnZhc0NvbnRhaW5lciA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICAgICAqL1xuICAgIGdldENhbnZhc0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhc0NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBgPGNhbnZhcz5gIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9IFRoZSBtYXAncyBgPGNhbnZhcz5gIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBjYW52YXMgPSBtYXAuZ2V0Q2FudmFzKCk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogTWVhc3VyZSBkaXN0YW5jZXNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbWVhc3VyZS8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwIG9uIGhvdmVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWhvdmVyLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDZW50ZXIgdGhlIG1hcCBvbiBhIGNsaWNrZWQgc3ltYm9sXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NlbnRlci1vbi1zeW1ib2wvKVxuICAgICAqL1xuICAgIGdldENhbnZhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhcztcbiAgICB9XG5cbiAgICAvKiogQHNlY3Rpb24ge01hcCBjb25zdHJhaW50c30gKi9cblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIG1hcCBhY2NvcmRpbmcgdG8gdGhlIGRpbWVuc2lvbnMgb2YgaXRzXG4gICAgICogYGNvbnRhaW5lcmAgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIENoZWNrcyBpZiB0aGUgbWFwIGNvbnRhaW5lciBzaXplIGNoYW5nZWQgYW5kIHVwZGF0ZXMgdGhlIG1hcCBpZiBpdCBoYXMgY2hhbmdlZC5cbiAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgbWFwJ3MgYGNvbnRhaW5lcmAgaXMgcmVzaXplZCBwcm9ncmFtbWF0aWNhbGx5XG4gICAgICogb3Igd2hlbiB0aGUgbWFwIGlzIHNob3duIGFmdGVyIGJlaW5nIGluaXRpYWxseSBoaWRkZW4gd2l0aCBDU1MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgcGFzc2VkIHRvIGBtb3Zlc3RhcnRgLCBgbW92ZWAsIGByZXNpemVgLCBhbmQgYG1vdmVlbmRgXG4gICAgICogICBldmVudHMgdGhhdCBnZXQgdHJpZ2dlcmVkIGFzIGEgcmVzdWx0IG9mIHJlc2l6ZS4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBkaWZmZXJlbnRpYXRpbmcgdGhlXG4gICAgICogICBzb3VyY2Ugb2YgYW4gZXZlbnQgKGZvciBleGFtcGxlLCB1c2VyLWluaXRpYXRlZCBvciBwcm9ncmFtbWF0aWNhbGx5LXRyaWdnZXJlZCBldmVudHMpLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBSZXNpemUgdGhlIG1hcCB3aGVuIHRoZSBtYXAgY29udGFpbmVyIGlzIHNob3duXG4gICAgICogLy8gYWZ0ZXIgYmVpbmcgaW5pdGlhbGx5IGhpZGRlbiB3aXRoIENTUy5cbiAgICAgKiBjb25zdCBtYXBEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFwJyk7XG4gICAgICogaWYgKG1hcERpdi5zdHlsZS52aXNpYmlsaXR5ID09PSB0cnVlKSBtYXAucmVzaXplKCk7XG4gICAgICovXG4gICAgcmVzaXplKGV2ZW50RGF0YT86IE9iamVjdCkge1xuICAgICAgICB0aGlzLl91cGRhdGVDb250YWluZXJEaW1lbnNpb25zKCk7XG5cbiAgICAgICAgLy8gZG8gbm90aGluZyBpZiBjb250YWluZXIgcmVtYWluZWQgdGhlIHNhbWUgc2l6ZVxuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyV2lkdGggPT09IHRoaXMudHJhbnNmb3JtLndpZHRoICYmIHRoaXMuX2NvbnRhaW5lckhlaWdodCA9PT0gdGhpcy50cmFuc2Zvcm0uaGVpZ2h0KSByZXR1cm4gdGhpcztcblxuICAgICAgICB0aGlzLl9yZXNpemVDYW52YXModGhpcy5fY29udGFpbmVyV2lkdGgsIHRoaXMuX2NvbnRhaW5lckhlaWdodCk7XG5cbiAgICAgICAgdGhpcy50cmFuc2Zvcm0ucmVzaXplKHRoaXMuX2NvbnRhaW5lcldpZHRoLCB0aGlzLl9jb250YWluZXJIZWlnaHQpO1xuICAgICAgICB0aGlzLnBhaW50ZXIucmVzaXplKE1hdGguY2VpbCh0aGlzLl9jb250YWluZXJXaWR0aCksIE1hdGguY2VpbCh0aGlzLl9jb250YWluZXJIZWlnaHQpKTtcblxuICAgICAgICBjb25zdCBmaXJlTW92aW5nID0gIXRoaXMuX21vdmluZztcbiAgICAgICAgaWYgKGZpcmVNb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmVzdGFydCcsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdtb3ZlJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdyZXNpemUnLCBldmVudERhdGEpKTtcblxuICAgICAgICBpZiAoZmlyZU1vdmluZykgdGhpcy5maXJlKG5ldyBFdmVudCgnbW92ZWVuZCcsIGV2ZW50RGF0YSkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGdlb2dyYXBoaWNhbCBib3VuZHMuIFdoZW4gdGhlIGJlYXJpbmcgb3IgcGl0Y2ggaXMgbm9uLXplcm8sIHRoZSB2aXNpYmxlIHJlZ2lvbiBpcyBub3RcbiAgICAgKiBhbiBheGlzLWFsaWduZWQgcmVjdGFuZ2xlLCBhbmQgdGhlIHJlc3VsdCBpcyB0aGUgc21hbGxlc3QgYm91bmRzIHRoYXQgZW5jb21wYXNzZXMgdGhlIHZpc2libGUgcmVnaW9uLlxuICAgICAqIElmIGEgcGFkZGluZyBpcyBzZXQgb24gdGhlIG1hcCwgdGhlIGJvdW5kcyByZXR1cm5lZCBhcmUgZm9yIHRoZSBpbnNldC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IFRoZSBnZW9ncmFwaGljYWwgYm91bmRzIG9mIHRoZSBtYXAgYXMge0BsaW5rIExuZ0xhdEJvdW5kc30uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBib3VuZHMgPSBtYXAuZ2V0Qm91bmRzKCk7XG4gICAgICovXG4gICAgZ2V0Qm91bmRzKCk6IExuZ0xhdEJvdW5kcyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5nZXRCb3VuZHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGdlb2dyYXBoaWNhbCBib3VuZHMgdGhlIG1hcCBpcyBjb25zdHJhaW5lZCB0bywgb3IgYG51bGxgIGlmIG5vbmUgc2V0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge01hcH0gVGhlIG1hcCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IG1heEJvdW5kcyA9IG1hcC5nZXRNYXhCb3VuZHMoKTtcbiAgICAgKi9cbiAgICBnZXRNYXhCb3VuZHMoKTogTG5nTGF0Qm91bmRzIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5nZXRNYXhCb3VuZHMoKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzLlxuICAgICAqXG4gICAgICogUGFuIGFuZCB6b29tIG9wZXJhdGlvbnMgYXJlIGNvbnN0cmFpbmVkIHdpdGhpbiB0aGVzZSBib3VuZHMuXG4gICAgICogSWYgYSBwYW4gb3Igem9vbSBpcyBwZXJmb3JtZWQgdGhhdCB3b3VsZFxuICAgICAqIGRpc3BsYXkgcmVnaW9ucyBvdXRzaWRlIHRoZXNlIGJvdW5kcywgdGhlIG1hcCB3aWxsXG4gICAgICogaW5zdGVhZCBkaXNwbGF5IGEgcG9zaXRpb24gYW5kIHpvb20gbGV2ZWxcbiAgICAgKiBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgb3BlcmF0aW9uJ3MgcmVxdWVzdCB3aGlsZSBzdGlsbFxuICAgICAqIHJlbWFpbmluZyB3aXRoaW4gdGhlIGJvdW5kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IGJvdW5kcyBUaGUgbWF4aW11bSBib3VuZHMgdG8gc2V0LiBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBtYXAncyBtYXhpbXVtIGJvdW5kcy5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gRGVmaW5lIGJvdW5kcyB0aGF0IGNvbmZvcm0gdG8gdGhlIGBMbmdMYXRCb3VuZHNMaWtlYCBvYmplY3QuXG4gICAgICogY29uc3QgYm91bmRzID0gW1xuICAgICAqICAgICBbLTc0LjA0NzI4LCA0MC42ODM5Ml0sIC8vIFt3ZXN0LCBzb3V0aF1cbiAgICAgKiAgICAgWy03My45MTA1OCwgNDAuODc3NjRdICAvLyBbZWFzdCwgbm9ydGhdXG4gICAgICogXTtcbiAgICAgKiAvLyBTZXQgdGhlIG1hcCdzIG1heCBib3VuZHMuXG4gICAgICogbWFwLnNldE1heEJvdW5kcyhib3VuZHMpO1xuICAgICAqL1xuICAgIHNldE1heEJvdW5kcyhib3VuZHM6IExuZ0xhdEJvdW5kc0xpa2UpIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0uc2V0TWF4Qm91bmRzKExuZ0xhdEJvdW5kcy5jb252ZXJ0KGJvdW5kcykpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIG1hcCdzIG1pbmltdW0gem9vbSBsZXZlbC5cbiAgICAgKiBJZiB0aGUgbWFwJ3MgY3VycmVudCB6b29tIGxldmVsIGlzIGxvd2VyIHRoYW4gdGhlIG5ldyBtaW5pbXVtLFxuICAgICAqIHRoZSBtYXAgd2lsbCB6b29tIHRvIHRoZSBuZXcgbWluaW11bS5cbiAgICAgKlxuICAgICAqIEl0IGlzIG5vdCBhbHdheXMgcG9zc2libGUgdG8gem9vbSBvdXQgYW5kIHJlYWNoIHRoZSBzZXQgYG1pblpvb21gLlxuICAgICAqIE90aGVyIGZhY3RvcnMgc3VjaCBhcyBtYXAgaGVpZ2h0IG1heSByZXN0cmljdCB6b29taW5nLiBGb3IgZXhhbXBsZSxcbiAgICAgKiBpZiB0aGUgbWFwIGlzIDUxMnB4IHRhbGwgaXQgd2lsbCBub3QgYmUgcG9zc2libGUgdG8gem9vbSBiZWxvdyB6b29tIDBcbiAgICAgKiBubyBtYXR0ZXIgd2hhdCB0aGUgYG1pblpvb21gIGlzIHNldCB0by5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gbWluWm9vbSBUaGUgbWluaW11bSB6b29tIGxldmVsIHRvIHNldCAoLTIgLSAyNCkuXG4gICAgICogICBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBjdXJyZW50IG1pbmltdW0gem9vbSBhbmQgaXQgd2lsbCBiZSByZXNldCB0byAtMi5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldE1pblpvb20oMTIuMjUpO1xuICAgICAqL1xuICAgIHNldE1pblpvb20obWluWm9vbT86ID9udW1iZXIpIHtcblxuICAgICAgICBtaW5ab29tID0gbWluWm9vbSA9PT0gbnVsbCB8fCBtaW5ab29tID09PSB1bmRlZmluZWQgPyBkZWZhdWx0TWluWm9vbSA6IG1pblpvb207XG5cbiAgICAgICAgaWYgKG1pblpvb20gPj0gZGVmYXVsdE1pblpvb20gJiYgbWluWm9vbSA8PSB0aGlzLnRyYW5zZm9ybS5tYXhab29tKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5taW5ab29tID0gbWluWm9vbTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRab29tKCkgPCBtaW5ab29tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRab29tKG1pblpvb20pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd6b29tc3RhcnQnKSlcbiAgICAgICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCd6b29tJykpXG4gICAgICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgnem9vbWVuZCcpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgbWluWm9vbSBtdXN0IGJlIGJldHdlZW4gJHtkZWZhdWx0TWluWm9vbX0gYW5kIHRoZSBjdXJyZW50IG1heFpvb20sIGluY2x1c2l2ZWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIG1pbmltdW0gYWxsb3dhYmxlIHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGBtaW5ab29tYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IG1pblpvb20gPSBtYXAuZ2V0TWluWm9vbSgpO1xuICAgICAqL1xuICAgIGdldE1pblpvb20oKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5taW5ab29tOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWFwJ3MgbWF4aW11bSB6b29tIGxldmVsLlxuICAgICAqIElmIHRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwgaXMgaGlnaGVyIHRoYW4gdGhlIG5ldyBtYXhpbXVtLFxuICAgICAqIHRoZSBtYXAgd2lsbCB6b29tIHRvIHRoZSBuZXcgbWF4aW11bS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gbWF4Wm9vbSBUaGUgbWF4aW11bSB6b29tIGxldmVsIHRvIHNldC5cbiAgICAgKiAgIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgbWF4aW11bSB6b29tIChzZXRzIGl0IHRvIDIyKS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldE1heFpvb20oMTguNzUpO1xuICAgICAqL1xuICAgIHNldE1heFpvb20obWF4Wm9vbT86ID9udW1iZXIpIHtcblxuICAgICAgICBtYXhab29tID0gbWF4Wm9vbSA9PT0gbnVsbCB8fCBtYXhab29tID09PSB1bmRlZmluZWQgPyBkZWZhdWx0TWF4Wm9vbSA6IG1heFpvb207XG5cbiAgICAgICAgaWYgKG1heFpvb20gPj0gdGhpcy50cmFuc2Zvcm0ubWluWm9vbSkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbSA9IG1heFpvb207XG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Wm9vbSgpID4gbWF4Wm9vbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Wm9vbShtYXhab29tKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnem9vbXN0YXJ0JykpXG4gICAgICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgnem9vbScpKVxuICAgICAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3pvb21lbmQnKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoYG1heFpvb20gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbWluWm9vbWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIG1heGltdW0gYWxsb3dhYmxlIHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGBtYXhab29tYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IG1heFpvb20gPSBtYXAuZ2V0TWF4Wm9vbSgpO1xuICAgICAqL1xuICAgIGdldE1heFpvb20oKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5tYXhab29tOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWFwJ3MgbWluaW11bSBwaXRjaC5cbiAgICAgKiBJZiB0aGUgbWFwJ3MgY3VycmVudCBwaXRjaCBpcyBsb3dlciB0aGFuIHRoZSBuZXcgbWluaW11bSxcbiAgICAgKiB0aGUgbWFwIHdpbGwgcGl0Y2ggdG8gdGhlIG5ldyBtaW5pbXVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBtaW5QaXRjaCBUaGUgbWluaW11bSBwaXRjaCB0byBzZXQgKDAtODUpLiBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBjdXJyZW50IG1pbmltdW0gcGl0Y2ggYW5kIHJlc2V0cyBpdCB0byAwLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0TWluUGl0Y2goNSk7XG4gICAgICovXG4gICAgc2V0TWluUGl0Y2gobWluUGl0Y2g/OiA/bnVtYmVyKSB7XG5cbiAgICAgICAgbWluUGl0Y2ggPSBtaW5QaXRjaCA9PT0gbnVsbCB8fCBtaW5QaXRjaCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdE1pblBpdGNoIDogbWluUGl0Y2g7XG5cbiAgICAgICAgaWYgKG1pblBpdGNoIDwgZGVmYXVsdE1pblBpdGNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pblBpdGNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7ZGVmYXVsdE1pblBpdGNofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pblBpdGNoID49IGRlZmF1bHRNaW5QaXRjaCAmJiBtaW5QaXRjaCA8PSB0aGlzLnRyYW5zZm9ybS5tYXhQaXRjaCkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ubWluUGl0Y2ggPSBtaW5QaXRjaDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRQaXRjaCgpIDwgbWluUGl0Y2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBpdGNoKG1pblBpdGNoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncGl0Y2hzdGFydCcpKVxuICAgICAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3BpdGNoJykpXG4gICAgICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2hlbmQnKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoYG1pblBpdGNoIG11c3QgYmUgYmV0d2VlbiAke2RlZmF1bHRNaW5QaXRjaH0gYW5kIHRoZSBjdXJyZW50IG1heFBpdGNoLCBpbmNsdXNpdmVgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBtaW5pbXVtIGFsbG93YWJsZSBwaXRjaC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYG1pblBpdGNoYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IG1pblBpdGNoID0gbWFwLmdldE1pblBpdGNoKCk7XG4gICAgICovXG4gICAgZ2V0TWluUGl0Y2goKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5taW5QaXRjaDsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIG1hcCdzIG1heGltdW0gcGl0Y2guXG4gICAgICogSWYgdGhlIG1hcCdzIGN1cnJlbnQgcGl0Y2ggaXMgaGlnaGVyIHRoYW4gdGhlIG5ldyBtYXhpbXVtLFxuICAgICAqIHRoZSBtYXAgd2lsbCBwaXRjaCB0byB0aGUgbmV3IG1heGltdW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IG1heFBpdGNoIFRoZSBtYXhpbXVtIHBpdGNoIHRvIHNldC5cbiAgICAgKiAgIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgbWF4aW11bSBwaXRjaCAoc2V0cyBpdCB0byA4NSkuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRNYXhQaXRjaCg3MCk7XG4gICAgICovXG4gICAgc2V0TWF4UGl0Y2gobWF4UGl0Y2g/OiA/bnVtYmVyKSB7XG5cbiAgICAgICAgbWF4UGl0Y2ggPSBtYXhQaXRjaCA9PT0gbnVsbCB8fCBtYXhQaXRjaCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdE1heFBpdGNoIDogbWF4UGl0Y2g7XG5cbiAgICAgICAgaWYgKG1heFBpdGNoID4gZGVmYXVsdE1heFBpdGNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1heFBpdGNoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7ZGVmYXVsdE1heFBpdGNofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1heFBpdGNoID49IHRoaXMudHJhbnNmb3JtLm1pblBpdGNoKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5tYXhQaXRjaCA9IG1heFBpdGNoO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmdldFBpdGNoKCkgPiBtYXhQaXRjaCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGl0Y2gobWF4UGl0Y2gpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdwaXRjaHN0YXJ0JykpXG4gICAgICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2gnKSlcbiAgICAgICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdwaXRjaGVuZCcpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgbWF4UGl0Y2ggbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbWluUGl0Y2hgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBtYXhpbXVtIGFsbG93YWJsZSBwaXRjaC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYG1heFBpdGNoYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IG1heFBpdGNoID0gbWFwLmdldE1heFBpdGNoKCk7XG4gICAgICovXG4gICAgZ2V0TWF4UGl0Y2goKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5tYXhQaXRjaDsgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGUgb2YgYHJlbmRlcldvcmxkQ29waWVzYC4gSWYgYHRydWVgLCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHdvcmxkIHdpbGwgYmUgcmVuZGVyZWQgc2lkZSBieSBzaWRlIGJleW9uZCAtMTgwIGFuZCAxODAgZGVncmVlcyBsb25naXR1ZGUuIElmIHNldCB0byBgZmFsc2VgOlxuICAgICAqIC0gV2hlbiB0aGUgbWFwIGlzIHpvb21lZCBvdXQgZmFyIGVub3VnaCB0aGF0IGEgc2luZ2xlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3b3JsZCBkb2VzIG5vdCBmaWxsIHRoZSBtYXAncyBlbnRpcmVcbiAgICAgKiBjb250YWluZXIsIHRoZXJlIHdpbGwgYmUgYmxhbmsgc3BhY2UgYmV5b25kIDE4MCBhbmQgLTE4MCBkZWdyZWVzIGxvbmdpdHVkZS5cbiAgICAgKiAtIEZlYXR1cmVzIHRoYXQgY3Jvc3MgMTgwIGFuZCAtMTgwIGRlZ3JlZXMgbG9uZ2l0dWRlIHdpbGwgYmUgY3V0IGluIHR3byAod2l0aCBvbmUgcG9ydGlvbiBvbiB0aGUgcmlnaHQgZWRnZSBvZiB0aGVcbiAgICAgKiBtYXAgYW5kIHRoZSBvdGhlciBvbiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBtYXApIGF0IGV2ZXJ5IHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgcmVuZGVyV29ybGRDb3BpZXNgIGJvb2xlYW4uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCB3b3JsZENvcGllc1JlbmRlcmVkID0gbWFwLmdldFJlbmRlcldvcmxkQ29waWVzKCk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogUmVuZGVyIHdvcmxkIGNvcGllc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcmVuZGVyLXdvcmxkLWNvcGllcy8pXG4gICAgICovXG4gICAgZ2V0UmVuZGVyV29ybGRDb3BpZXMoKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllczsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhdGUgb2YgYHJlbmRlcldvcmxkQ29waWVzYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVuZGVyV29ybGRDb3BpZXMgSWYgYHRydWVgLCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHdvcmxkIHdpbGwgYmUgcmVuZGVyZWQgc2lkZSBieSBzaWRlIGJleW9uZCAtMTgwIGFuZCAxODAgZGVncmVlcyBsb25naXR1ZGUuIElmIHNldCB0byBgZmFsc2VgOlxuICAgICAqIC0gV2hlbiB0aGUgbWFwIGlzIHpvb21lZCBvdXQgZmFyIGVub3VnaCB0aGF0IGEgc2luZ2xlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3b3JsZCBkb2VzIG5vdCBmaWxsIHRoZSBtYXAncyBlbnRpcmVcbiAgICAgKiBjb250YWluZXIsIHRoZXJlIHdpbGwgYmUgYmxhbmsgc3BhY2UgYmV5b25kIDE4MCBhbmQgLTE4MCBkZWdyZWVzIGxvbmdpdHVkZS5cbiAgICAgKiAtIEZlYXR1cmVzIHRoYXQgY3Jvc3MgMTgwIGFuZCAtMTgwIGRlZ3JlZXMgbG9uZ2l0dWRlIHdpbGwgYmUgY3V0IGluIHR3byAod2l0aCBvbmUgcG9ydGlvbiBvbiB0aGUgcmlnaHQgZWRnZSBvZiB0aGVcbiAgICAgKiBtYXAgYW5kIHRoZSBvdGhlciBvbiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBtYXApIGF0IGV2ZXJ5IHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBgdW5kZWZpbmVkYCBpcyB0cmVhdGVkIGFzIGB0cnVlYCwgYG51bGxgIGlzIHRyZWF0ZWQgYXMgYGZhbHNlYC5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldFJlbmRlcldvcmxkQ29waWVzKHRydWUpO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IFJlbmRlciB3b3JsZCBjb3BpZXNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3JlbmRlci13b3JsZC1jb3BpZXMvKVxuICAgICAqL1xuICAgIHNldFJlbmRlcldvcmxkQ29waWVzKHJlbmRlcldvcmxkQ29waWVzPzogP2Jvb2xlYW4pIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0ucmVuZGVyV29ybGRDb3BpZXMgPSByZW5kZXJXb3JsZENvcGllcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7UG9pbnQgY29udmVyc2lvbn0gKi9cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBbcHJvamVjdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvcHJvamVjdGlvbi8pIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIGN1cnJlbnQgbWFwIHByb2plY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvamVjdGlvblNwZWNpZmljYXRpb259IFRoZSBbcHJvamVjdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvcHJvamVjdGlvbi8pIGRlZmluaW5nIHRoZSBjdXJyZW50IG1hcCBwcm9qZWN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgcHJvamVjdGlvbiA9IG1hcC5nZXRQcm9qZWN0aW9uKCk7XG4gICAgICovXG4gICAgZ2V0UHJvamVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmdldFByb2plY3Rpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAncyBwcm9qZWN0aW9uLiBJZiBjYWxsZWQgd2l0aCBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoZSBtYXAgd2lsbCByZXNldCB0byBNZXJjYXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvamVjdGlvblNwZWNpZmljYXRpb24gfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBwcm9qZWN0aW9uIFRoZSBwcm9qZWN0aW9uIHRoYXQgdGhlIG1hcCBzaG91bGQgYmUgcmVuZGVyZWQgaW4uXG4gICAgICogVGhpcyBjYW4gYmUgYSBbcHJvamVjdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvcHJvamVjdGlvbi8pIG9iamVjdCBvciBhIHN0cmluZyBvZiB0aGUgcHJvamVjdGlvbidzIG5hbWUuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRQcm9qZWN0aW9uKCdhbGJlcnMnKTtcbiAgICAgKiBtYXAuc2V0UHJvamVjdGlvbih7XG4gICAgICogICAgIG5hbWU6ICdhbGJlcnMnLFxuICAgICAqICAgICBjZW50ZXI6IFszNSwgNTVdLFxuICAgICAqICAgICBwYXJhbGxlbHM6IFsyMCwgNjBdXG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHdlYiBtYXAgdXNpbmcgYW4gYWx0ZXJuYXRlIHByb2plY3Rpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21hcC1wcm9qZWN0aW9uLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBVc2UgZGlmZmVyZW50IG1hcCBwcm9qZWN0aW9ucyBmb3Igd2ViIG1hcHNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3Byb2plY3Rpb25zLylcbiAgICAgKi9cbiAgICBzZXRQcm9qZWN0aW9uKHByb2plY3Rpb24/OiA/UHJvamVjdGlvblNwZWNpZmljYXRpb24gfCBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbGF6eUluaXRFbXB0eVN0eWxlKCk7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvamVjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHByb2plY3Rpb24gPSAoKHtuYW1lOiBwcm9qZWN0aW9ufTogYW55KTogUHJvamVjdGlvblNwZWNpZmljYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3J1bnRpbWVQcm9qZWN0aW9uID0gcHJvamVjdGlvbjtcbiAgICAgICAgdGhpcy5zdHlsZS51cGRhdGVQcm9qZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25Gcm9tR2xvYmUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBQb2ludH0gcmVwcmVzZW50aW5nIHBpeGVsIGNvb3JkaW5hdGVzLCByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgYGNvbnRhaW5lcmAsXG4gICAgICogdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBzcGVjaWZpZWQgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uLlxuICAgICAqXG4gICAgICogV2hlbiB0aGUgbWFwIGlzIHBpdGNoZWQgYW5kIGBsbmdsYXRgIGlzIGNvbXBsZXRlbHkgYmVoaW5kIHRoZSBjYW1lcmEsIHRoZXJlIGFyZSBubyBwaXhlbFxuICAgICAqIGNvb3JkaW5hdGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBsb2NhdGlvbi4gSW4gdGhhdCBjYXNlLFxuICAgICAqIHRoZSBgeGAgYW5kIGB5YCBjb21wb25lbnRzIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgUG9pbnR9IGFyZSBzZXQgdG8gTnVtYmVyLk1BWF9WQUxVRS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbG5nbGF0IFRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gdG8gcHJvamVjdC5cbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IFRoZSB7QGxpbmsgUG9pbnR9IGNvcnJlc3BvbmRpbmcgdG8gYGxuZ2xhdGAsIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBgY29udGFpbmVyYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNvb3JkaW5hdGUgPSBbLTEyMi40MjA2NzksIDM3Ljc3MjUzN107XG4gICAgICogY29uc3QgcG9pbnQgPSBtYXAucHJvamVjdChjb29yZGluYXRlKTtcbiAgICAgKi9cbiAgICBwcm9qZWN0KGxuZ2xhdDogTG5nTGF0TGlrZSkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubG9jYXRpb25Qb2ludDNEKExuZ0xhdC5jb252ZXJ0KGxuZ2xhdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSB7QGxpbmsgTG5nTGF0fSByZXByZXNlbnRpbmcgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzIHRoYXQgY29ycmVzcG9uZFxuICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgcGl4ZWwgY29vcmRpbmF0ZXMuIElmIGhvcml6b24gaXMgdmlzaWJsZSwgYW5kIHNwZWNpZmllZCBwaXhlbCBpc1xuICAgICAqIGFib3ZlIGhvcml6b24sIHJldHVybnMgYSB7QGxpbmsgTG5nTGF0fSBjb3JyZXNwb25kaW5nIHRvIHBvaW50IG9uIGhvcml6b24sIG5lYXJlc3RcbiAgICAgKiB0byB0aGUgcG9pbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gcG9pbnQgVGhlIHBpeGVsIGNvb3JkaW5hdGVzIHRvIHVucHJvamVjdC5cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUge0BsaW5rIExuZ0xhdH0gY29ycmVzcG9uZGluZyB0byBgcG9pbnRgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICogICAgIC8vIFdoZW4gdGhlIG1hcCBpcyBjbGlja2VkLCBnZXQgdGhlIGdlb2dyYXBoaWMgY29vcmRpbmF0ZS5cbiAgICAgKiAgICAgY29uc3QgY29vcmRpbmF0ZSA9IG1hcC51bnByb2plY3QoZS5wb2ludCk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgdW5wcm9qZWN0KHBvaW50OiBQb2ludExpa2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24zRChQb2ludC5jb252ZXJ0KHBvaW50KSk7XG4gICAgfVxuXG4gICAgLyoqIEBzZWN0aW9uIHtNb3ZlbWVudCBzdGF0ZX0gKi9cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGlzIHBhbm5pbmcsIHpvb21pbmcsIHJvdGF0aW5nLCBvciBwaXRjaGluZyBkdWUgdG8gYSBjYW1lcmEgYW5pbWF0aW9uIG9yIHVzZXIgZ2VzdHVyZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBtYXAgaXMgbW92aW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNNb3ZpbmcgPSBtYXAuaXNNb3ZpbmcoKTtcbiAgICAgKi9cbiAgICBpc01vdmluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdmluZyB8fCB0aGlzLmhhbmRsZXJzICYmIHRoaXMuaGFuZGxlcnMuaXNNb3ZpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1hcCBpcyB6b29taW5nIGR1ZSB0byBhIGNhbWVyYSBhbmltYXRpb24gb3IgdXNlciBnZXN0dXJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG1hcCBpcyB6b29taW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNab29taW5nID0gbWFwLmlzWm9vbWluZygpO1xuICAgICAqL1xuICAgIGlzWm9vbWluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3pvb21pbmcgfHwgdGhpcy5oYW5kbGVycyAmJiB0aGlzLmhhbmRsZXJzLmlzWm9vbWluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGlzIHJvdGF0aW5nIGR1ZSB0byBhIGNhbWVyYSBhbmltYXRpb24gb3IgdXNlciBnZXN0dXJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG1hcCBpcyByb3RhdGluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5pc1JvdGF0aW5nKCk7XG4gICAgICovXG4gICAgaXNSb3RhdGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvdGF0aW5nIHx8IHRoaXMuaGFuZGxlcnMgJiYgdGhpcy5oYW5kbGVycy5pc1JvdGF0aW5nKCk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZURlbGVnYXRlZExpc3RlbmVyKHR5cGU6IE1hcEV2ZW50LCBsYXllcnM6IEFycmF5PGFueT4sIGxpc3RlbmVyOiBhbnkpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdtb3VzZWVudGVyJyB8fCB0eXBlID09PSAnbW91c2VvdmVyJykge1xuICAgICAgICAgICAgbGV0IG1vdXNlaW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IG1vdXNlbW92ZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRMYXllcnMgPSBsYXllcnMuZmlsdGVyKGxheWVySWQgPT4gdGhpcy5nZXRMYXllcihsYXllcklkKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBmaWx0ZXJlZExheWVycy5sZW5ndGggPyB0aGlzLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50LCB7bGF5ZXJzOiBmaWx0ZXJlZExheWVyc30pIDogW107XG4gICAgICAgICAgICAgICAgaWYgKCFmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1vdXNlaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgbmV3IE1hcE1vdXNlRXZlbnQodHlwZSwgdGhpcywgZS5vcmlnaW5hbEV2ZW50LCB7ZmVhdHVyZXN9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IG1vdXNlb3V0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1vdXNlaW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiB7bGF5ZXJzOiBuZXcgU2V0KGxheWVycyksIGxpc3RlbmVyLCBkZWxlZ2F0ZXM6IHttb3VzZW1vdmUsIG1vdXNlb3V0fX07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ21vdXNlbGVhdmUnIHx8IHR5cGUgPT09ICdtb3VzZW91dCcpIHtcbiAgICAgICAgICAgIGxldCBtb3VzZWluID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBtb3VzZW1vdmUgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkTGF5ZXJzID0gbGF5ZXJzLmZpbHRlcihsYXllcklkID0+IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gZmlsdGVyZWRMYXllcnMubGVuZ3RoID8gdGhpcy5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCwge2xheWVyczogZmlsdGVyZWRMYXllcnN9KSA6IFtdO1xuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb3VzZWluKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdXNlaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBuZXcgTWFwTW91c2VFdmVudCh0eXBlLCB0aGlzLCBlLm9yaWdpbmFsRXZlbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgbW91c2VvdXQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb3VzZWluKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdXNlaW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBuZXcgTWFwTW91c2VFdmVudCh0eXBlLCB0aGlzLCBlLm9yaWdpbmFsRXZlbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4ge2xheWVyczogbmV3IFNldChsYXllcnMpLCBsaXN0ZW5lciwgZGVsZWdhdGVzOiB7bW91c2Vtb3ZlLCBtb3VzZW91dH19O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVsZWdhdGUgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkTGF5ZXJzID0gbGF5ZXJzLmZpbHRlcihsYXllcklkID0+IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gZmlsdGVyZWRMYXllcnMubGVuZ3RoID8gdGhpcy5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCwge2xheWVyczogZmlsdGVyZWRMYXllcnN9KSA6IFtdO1xuICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSB3ZSBuZWVkIHRvIG11dGF0ZSB0aGUgb3JpZ2luYWwgZXZlbnQsIHNvIHRoYXQgcHJldmVudERlZmF1bHQgd29ya3MgYXMgZXhwZWN0ZWQuXG4gICAgICAgICAgICAgICAgICAgIGUuZmVhdHVyZXMgPSBmZWF0dXJlcztcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUuZmVhdHVyZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtsYXllcnM6IG5ldyBTZXQobGF5ZXJzKSwgbGlzdGVuZXIsIGRlbGVnYXRlczoge1t0eXBlXTogZGVsZWdhdGV9fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7V29ya2luZyB3aXRoIGV2ZW50c30gKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgZXZlbnRzIG9mIGEgc3BlY2lmaWVkIHR5cGUsXG4gICAgICogb3B0aW9uYWxseSBsaW1pdGVkIHRvIGZlYXR1cmVzIGluIGEgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvci4gRXZlbnRzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW9uYWwgYGxheWVySWRgIHBhcmFtZXRlciBhcmUgdHJpZ2dlcmVkXG4gICAgICogd2hlbiB0aGUgY3Vyc29yIGVudGVycyBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxheWVyIGZyb20gb3V0c2lkZSB0aGF0IGxheWVyIG9yIG91dHNpZGUgdGhlIG1hcCBjYW52YXMuXG4gICAgICpcbiAgICAgKiB8IEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbXBhdGlibGUgd2l0aCBgbGF5ZXJJZGAgfFxuICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gICAgICogfCBbYG1vdXNlZG93bmBdKCNtYXAuZXZlbnQ6bW91c2Vkb3duKSAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgbW91c2V1cGBdKCNtYXAuZXZlbnQ6bW91c2V1cCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Btb3VzZW92ZXJgXSgjbWFwLmV2ZW50Om1vdXNlb3ZlcikgICAgICAgICAgICAgICAgICAgICAgIHwgeWVzICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYG1vdXNlb3V0YF0oI21hcC5ldmVudDptb3VzZW91dCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgbW91c2Vtb3ZlYF0oI21hcC5ldmVudDptb3VzZW1vdmUpICAgICAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Btb3VzZWVudGVyYF0oI21hcC5ldmVudDptb3VzZWVudGVyKSAgICAgICAgICAgICAgICAgICAgIHwgeWVzIChyZXF1aXJlZCkgICAgICAgICAgICB8XG4gICAgICogfCBbYG1vdXNlbGVhdmVgXSgjbWFwLmV2ZW50Om1vdXNlbGVhdmUpICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgKHJlcXVpcmVkKSAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgcHJlY2xpY2tgXSgjbWFwLmV2ZW50OnByZWNsaWNrKSAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2BjbGlja2BdKCNtYXAuZXZlbnQ6Y2xpY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeWVzICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYGRibGNsaWNrYF0oI21hcC5ldmVudDpkYmxjbGljaykgICAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgY29udGV4dG1lbnVgXSgjbWFwLmV2ZW50OmNvbnRleHRtZW51KSAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2B0b3VjaHN0YXJ0YF0oI21hcC5ldmVudDp0b3VjaHN0YXJ0KSAgICAgICAgICAgICAgICAgICAgIHwgeWVzICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHRvdWNoZW5kYF0oI21hcC5ldmVudDp0b3VjaGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgdG91Y2hjYW5jZWxgXSgjbWFwLmV2ZW50OnRvdWNoY2FuY2VsKSAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2B3aGVlbGBdKCNtYXAuZXZlbnQ6d2hlZWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHJlc2l6ZWBdKCNtYXAuZXZlbnQ6cmVzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgcmVtb3ZlYF0oI21hcC5ldmVudDpyZW1vdmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2B0b3VjaG1vdmVgXSgjbWFwLmV2ZW50OnRvdWNobW92ZSkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYG1vdmVzdGFydGBdKCNtYXAuZXZlbnQ6bW92ZXN0YXJ0KSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgbW92ZWBdKCNtYXAuZXZlbnQ6bW92ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Btb3ZlZW5kYF0oI21hcC5ldmVudDptb3ZlZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYGRyYWdzdGFydGBdKCNtYXAuZXZlbnQ6ZHJhZ3N0YXJ0KSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgZHJhZ2BdKCNtYXAuZXZlbnQ6ZHJhZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2BkcmFnZW5kYF0oI21hcC5ldmVudDpkcmFnZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHpvb21zdGFydGBdKCNtYXAuZXZlbnQ6em9vbXN0YXJ0KSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgem9vbWBdKCNtYXAuZXZlbnQ6em9vbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2B6b29tZW5kYF0oI21hcC5ldmVudDp6b29tZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHJvdGF0ZXN0YXJ0YF0oI21hcC5ldmVudDpyb3RhdGVzdGFydCkgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgcm90YXRlYF0oI21hcC5ldmVudDpyb3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Byb3RhdGVlbmRgXSgjbWFwLmV2ZW50OnJvdGF0ZWVuZCkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHBpdGNoc3RhcnRgXSgjbWFwLmV2ZW50OnBpdGNoc3RhcnQpICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgcGl0Y2hgXSgjbWFwLmV2ZW50OnBpdGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2BwaXRjaGVuZGBdKCNtYXAuZXZlbnQ6cGl0Y2hlbmQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYGJveHpvb21zdGFydGBdKCNtYXAuZXZlbnQ6Ym94em9vbXN0YXJ0KSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgYm94em9vbWVuZGBdKCNtYXAuZXZlbnQ6Ym94em9vbWVuZCkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Bib3h6b29tY2FuY2VsYF0oI21hcC5ldmVudDpib3h6b29tY2FuY2VsKSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHdlYmdsY29udGV4dGxvc3RgXSgjbWFwLmV2ZW50OndlYmdsY29udGV4dGxvc3QpICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgd2ViZ2xjb250ZXh0cmVzdG9yZWRgXSgjbWFwLmV2ZW50OndlYmdsY29udGV4dHJlc3RvcmVkKSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Bsb2FkYF0oI21hcC5ldmVudDpsb2FkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHJlbmRlcmBdKCNtYXAuZXZlbnQ6cmVuZGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgaWRsZWBdKCNtYXAuZXZlbnQ6aWRsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2BlcnJvcmBdKCNtYXAuZXZlbnQ6ZXJyb3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYGRhdGFgXSgjbWFwLmV2ZW50OmRhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgc3R5bGVkYXRhYF0oI21hcC5ldmVudDpzdHlsZWRhdGEpICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Bzb3VyY2VkYXRhYF0oI21hcC5ldmVudDpzb3VyY2VkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYGRhdGFsb2FkaW5nYF0oI21hcC5ldmVudDpkYXRhbG9hZGluZykgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgc3R5bGVkYXRhbG9hZGluZ2BdKCNtYXAuZXZlbnQ6c3R5bGVkYXRhbG9hZGluZykgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Bzb3VyY2VkYXRhbG9hZGluZ2BdKCNtYXAuZXZlbnQ6c291cmNlZGF0YWxvYWRpbmcpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHN0eWxlaW1hZ2VtaXNzaW5nYF0oI21hcC5ldmVudDpzdHlsZWltYWdlbWlzc2luZykgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nPn0gbGF5ZXJJZHMgKG9wdGlvbmFsKSBUaGUgSUQocykgb2YgYSBzdHlsZSBsYXllcihzKS4gSWYgeW91IHByb3ZpZGUgYSBgbGF5ZXJJZGAsXG4gICAgICogdGhlIGxpc3RlbmVyIHdpbGwgYmUgdHJpZ2dlcmVkIG9ubHkgaWYgaXRzIGxvY2F0aW9uIGlzIHdpdGhpbiBhIHZpc2libGUgZmVhdHVyZSBpbiB0aGVzZSBsYXllcnMsXG4gICAgICogYW5kIHRoZSBldmVudCB3aWxsIGhhdmUgYSBgZmVhdHVyZXNgIHByb3BlcnR5IGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgdGhlIG1hdGNoaW5nIGZlYXR1cmVzLlxuICAgICAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSBgbGF5ZXJJZHNgLCB0aGUgbGlzdGVuZXIgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgYSBjb3JyZXNwb25kaW5nIGV2ZW50XG4gICAgICogaGFwcGVuaW5nIGFueXdoZXJlIG9uIHRoZSBtYXAsIGFuZCB0aGUgZXZlbnQgd2lsbCBub3QgaGF2ZSBhIGBmZWF0dXJlc2AgcHJvcGVydHkuXG4gICAgICogTm90ZSB0aGF0IG1hbnkgZXZlbnQgdHlwZXMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkc2AgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgZmlyZVxuICAgICAqIC8vIHdoZW4gdGhlIG1hcCBoYXMgZmluaXNoZWQgbG9hZGluZy5cbiAgICAgKiBtYXAub24oJ2xvYWQnLCAoKSA9PiB7XG4gICAgICogICAgIC8vIEFkZCBhIG5ldyBsYXllci5cbiAgICAgKiAgICAgbWFwLmFkZExheWVyKHtcbiAgICAgKiAgICAgICAgIGlkOiAncG9pbnRzLW9mLWludGVyZXN0JyxcbiAgICAgKiAgICAgICAgIHNvdXJjZToge1xuICAgICAqICAgICAgICAgICAgIHR5cGU6ICd2ZWN0b3InLFxuICAgICAqICAgICAgICAgICAgIHVybDogJ21hcGJveDovL21hcGJveC5tYXBib3gtc3RyZWV0cy12OCdcbiAgICAgKiAgICAgICAgIH0sXG4gICAgICogICAgICAgICAnc291cmNlLWxheWVyJzogJ3BvaV9sYWJlbCcsXG4gICAgICogICAgICAgICB0eXBlOiAnY2lyY2xlJyxcbiAgICAgKiAgICAgICAgIHBhaW50OiB7XG4gICAgICogICAgICAgICAgICAgLy8gTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24gcGFpbnQgcHJvcGVydGllc1xuICAgICAqICAgICAgICAgfSxcbiAgICAgKiAgICAgICAgIGxheW91dDoge1xuICAgICAqICAgICAgICAgICAgIC8vIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uIGxheW91dCBwcm9wZXJ0aWVzXG4gICAgICogICAgICAgICB9XG4gICAgICogICAgIH0pO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBmaXJlXG4gICAgICogLy8gd2hlbiBhIGZlYXR1cmUgb24gdGhlIGNvdW50cmllcyBsYXllciBvZiB0aGUgbWFwIGlzIGNsaWNrZWQuXG4gICAgICogbWFwLm9uKCdjbGljaycsICdjb3VudHJpZXMnLCAoZSkgPT4ge1xuICAgICAqICAgICBuZXcgbWFwYm94Z2wuUG9wdXAoKVxuICAgICAqICAgICAgICAgLnNldExuZ0xhdChlLmxuZ0xhdClcbiAgICAgKiAgICAgICAgIC5zZXRIVE1MKGBDb3VudHJ5IG5hbWU6ICR7ZS5mZWF0dXJlc1swXS5wcm9wZXJ0aWVzLm5hbWV9YClcbiAgICAgKiAgICAgICAgIC5hZGRUbyhtYXApO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBmaXJlXG4gICAgICogLy8gd2hlbiBhIGZlYXR1cmUgb24gdGhlIGNvdW50cmllcyBvciBiYWNrZ3JvdW5kIGxheWVycyBvZiB0aGUgbWFwIGlzIGNsaWNrZWQuXG4gICAgICogbWFwLm9uKCdjbGljaycsIFsnY291bnRyaWVzJywgJ2JhY2tncm91bmQnXSwgKGUpID0+IHtcbiAgICAgKiAgICAgbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgICAgICAgIC5zZXRMbmdMYXQoZS5sbmdMYXQpXG4gICAgICogICAgICAgICAuc2V0SFRNTChgQ291bnRyeSBuYW1lOiAke2UuZmVhdHVyZXNbMF0ucHJvcGVydGllcy5uYW1lfWApXG4gICAgICogICAgICAgICAuYWRkVG8obWFwKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBZGQgM0QgdGVycmFpbiB0byBhIG1hcF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLXRlcnJhaW4vKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IENlbnRlciB0aGUgbWFwIG9uIGEgY2xpY2tlZCBzeW1ib2xdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NlbnRlci1vbi1zeW1ib2wvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIGRyYWdnYWJsZSBtYXJrZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgaG92ZXIgZWZmZWN0XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9ob3Zlci1zdHlsZXMvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgcG9wdXAgb24gY2xpY2tdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcbiAgICAgKi9cbiAgICBvbih0eXBlOiBNYXBFdmVudCwgbGF5ZXJJZHM6IGFueSwgbGlzdGVuZXI6IGFueSkge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uKHR5cGUsIGxheWVySWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShsYXllcklkcykpIHtcbiAgICAgICAgICAgIGxheWVySWRzID0gW2xheWVySWRzXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWxlZ2F0ZWRMaXN0ZW5lciA9IHRoaXMuX2NyZWF0ZURlbGVnYXRlZExpc3RlbmVyKHR5cGUsIGxheWVySWRzLCBsaXN0ZW5lcik7XG5cbiAgICAgICAgdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzID0gdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzIHx8IHt9O1xuICAgICAgICB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV0gfHwgW107XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0eXBlXS5wdXNoKGRlbGVnYXRlZExpc3RlbmVyKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlcykge1xuICAgICAgICAgICAgdGhpcy5vbigoZXZlbnQ6IGFueSksIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlc1tldmVudF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIHRvIGEgc3BlY2lmaWVkIGV2ZW50IHR5cGUsXG4gICAgICogb3B0aW9uYWxseSBsaW1pdGVkIHRvIGV2ZW50cyBvY2N1cnJpbmcgb24gZmVhdHVyZXMgaW4gYSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBsaXN0ZW4gZm9yOyBvbmUgb2YgYCdtb3VzZWRvd24nYCwgYCdtb3VzZXVwJ2AsIGAncHJlY2xpY2snYCwgYCdjbGljaydgLCBgJ2RibGNsaWNrJ2AsXG4gICAgICogYCdtb3VzZW1vdmUnYCwgYCdtb3VzZWVudGVyJ2AsIGAnbW91c2VsZWF2ZSdgLCBgJ21vdXNlb3ZlcidgLCBgJ21vdXNlb3V0J2AsIGAnY29udGV4dG1lbnUnYCwgYCd0b3VjaHN0YXJ0J2AsXG4gICAgICogYCd0b3VjaGVuZCdgLCBvciBgJ3RvdWNoY2FuY2VsJ2AuIGBtb3VzZWVudGVyYCBhbmQgYG1vdXNlb3ZlcmAgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY3Vyc29yIGVudGVyc1xuICAgICAqIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbGF5ZXIgZnJvbSBvdXRzaWRlIHRoYXQgbGF5ZXIgb3Igb3V0c2lkZSB0aGUgbWFwIGNhbnZhcy4gYG1vdXNlbGVhdmVgXG4gICAgICogYW5kIGBtb3VzZW91dGAgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY3Vyc29yIGxlYXZlcyBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxheWVyLCBvciBsZWF2ZXNcbiAgICAgKiB0aGUgbWFwIGNhbnZhcy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZz59IGxheWVySWRzIChvcHRpb25hbCkgVGhlIElEKHMpIG9mIGEgc3R5bGUgbGF5ZXIocykuIElmIHlvdSBwcm92aWRlIGBsYXllcklkc2AsXG4gICAgICogdGhlIGxpc3RlbmVyIHdpbGwgYmUgdHJpZ2dlcmVkIG9ubHkgaWYgaXRzIGxvY2F0aW9uIGlzIHdpdGhpbiBhIHZpc2libGUgZmVhdHVyZSBpbiB0aGVzZSBsYXllcnMsXG4gICAgICogYW5kIHRoZSBldmVudCB3aWxsIGhhdmUgYSBgZmVhdHVyZXNgIHByb3BlcnR5IGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgdGhlIG1hdGNoaW5nIGZlYXR1cmVzLlxuICAgICAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSBgbGF5ZXJJZHNgLCB0aGUgbGlzdGVuZXIgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgYSBjb3JyZXNwb25kaW5nIGV2ZW50XG4gICAgICogaGFwcGVuaW5nIGFueXdoZXJlIG9uIHRoZSBtYXAsIGFuZCB0aGUgZXZlbnQgd2lsbCBub3QgaGF2ZSBhIGBmZWF0dXJlc2AgcHJvcGVydHkuXG4gICAgICogTm90ZSB0aGF0IG1hbnkgZXZlbnQgdHlwZXMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkc2AgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIExvZyB0aGUgY29vcmRpbmF0ZXMgb2YgYSB1c2VyJ3MgZmlyc3QgbWFwIHRvdWNoLlxuICAgICAqIG1hcC5vbmNlKCd0b3VjaHN0YXJ0JywgKGUpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYFRoZSBmaXJzdCBtYXAgdG91Y2ggd2FzIGF0OiAke2UubG5nbGF0fWApO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gTG9nIHRoZSBjb29yZGluYXRlcyBvZiBhIHVzZXIncyBmaXJzdCBtYXAgdG91Y2hcbiAgICAgKiAvLyBvbiBhIHNwZWNpZmljIGxheWVyLlxuICAgICAqIG1hcC5vbmNlKCd0b3VjaHN0YXJ0JywgJ215LXBvaW50LWxheWVyJywgKGUpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYFRoZSBmaXJzdCBtYXAgdG91Y2ggb24gdGhlIHBvaW50IGxheWVyIHdhcyBhdDogJHtlLmxuZ2xhdH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIExvZyB0aGUgY29vcmRpbmF0ZXMgb2YgYSB1c2VyJ3MgZmlyc3QgbWFwIHRvdWNoXG4gICAgICogLy8gb24gc3BlY2lmaWMgbGF5ZXJzLlxuICAgICAqIG1hcC5vbmNlKCd0b3VjaHN0YXJ0JywgWydteS1wb2ludC1sYXllcicsICdteS1wb2ludC1sYXllci0yJ10sIChlKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBUaGUgZmlyc3QgbWFwIHRvdWNoIG9uIHRoZSBwb2ludCBsYXllciB3YXMgYXQ6ICR7ZS5sbmdsYXR9YCk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEFuaW1hdGUgdGhlIGNhbWVyYSBhcm91bmQgYSBwb2ludCB3aXRoIDNEIHRlcnJhaW5dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZyZWUtY2FtZXJhLXBvaW50LylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBQbGF5IG1hcCBsb2NhdGlvbnMgYXMgYSBzbGlkZXNob3ddKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BsYXliYWNrLWxvY2F0aW9ucy8pXG4gICAgICovXG4gICAgb25jZSh0eXBlOiBNYXBFdmVudCwgbGF5ZXJJZHM6IGFueSwgbGlzdGVuZXI6IGFueSkge1xuXG4gICAgICAgIGlmIChsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIub25jZSh0eXBlLCBsYXllcklkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGF5ZXJJZHMpKSB7XG4gICAgICAgICAgICBsYXllcklkcyA9IFtsYXllcklkc107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsZWdhdGVkTGlzdGVuZXIgPSB0aGlzLl9jcmVhdGVEZWxlZ2F0ZWRMaXN0ZW5lcih0eXBlLCBsYXllcklkcywgbGlzdGVuZXIpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXZlbnQgaW4gZGVsZWdhdGVkTGlzdGVuZXIuZGVsZWdhdGVzKSB7XG4gICAgICAgICAgICB0aGlzLm9uY2UoKGV2ZW50OiBhbnkpLCBkZWxlZ2F0ZWRMaXN0ZW5lci5kZWxlZ2F0ZXNbZXZlbnRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgcHJldmlvdXNseSBhZGRlZCB3aXRoIHtAbGluayBNYXAjb259LFxuICAgICAqIG9wdGlvbmFsbHkgbGltaXRlZCB0byBsYXllci1zcGVjaWZpYyBldmVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSBwcmV2aW91c2x5IHVzZWQgdG8gaW5zdGFsbCB0aGUgbGlzdGVuZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBBcnJheTxzdHJpbmc+fSBsYXllcklkcyAob3B0aW9uYWwpIFRoZSBsYXllciBJRChzKSBwcmV2aW91c2x5IHVzZWQgdG8gaW5zdGFsbCB0aGUgbGlzdGVuZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHByZXZpb3VzbHkgaW5zdGFsbGVkIGFzIGEgbGlzdGVuZXIuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIHByaW50IGNvb3JkaW5hdGVzIHdoaWxlIGEgbW91c2UgaXMgbW92aW5nLlxuICAgICAqIGZ1bmN0aW9uIG9uTW92ZShlKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBUaGUgbW91c2UgaXMgbW92aW5nOiAke2UubG5nTGF0fWApO1xuICAgICAqIH1cbiAgICAgKiAvLyBDcmVhdGUgYSBmdW5jdGlvbiB0byB1bmJpbmQgdGhlIGBtb3VzZW1vdmVgIGV2ZW50LlxuICAgICAqIGZ1bmN0aW9uIG9uVXAoZSkge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgVGhlIGZpbmFsIGNvb3JkaW5hdGVzIGFyZTogJHtlLmxuZ0xhdH1gKTtcbiAgICAgKiAgICAgbWFwLm9mZignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcbiAgICAgKiB9XG4gICAgICogLy8gV2hlbiBhIGNsaWNrIG9jY3VycywgYmluZCBib3RoIGZ1bmN0aW9ucyB0byBtb3VzZSBldmVudHMuXG4gICAgICogbWFwLm9uKCdtb3VzZWRvd24nLCAoZSkgPT4ge1xuICAgICAqICAgICBtYXAub24oJ21vdXNlbW92ZScsIG9uTW92ZSk7XG4gICAgICogICAgIG1hcC5vbmNlKCdtb3VzZXVwJywgb25VcCk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqL1xuICAgIG9mZih0eXBlOiBNYXBFdmVudCwgbGF5ZXJJZHM6IGFueSwgbGlzdGVuZXI6IGFueSkge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9mZih0eXBlLCBsYXllcklkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsYXllcklkcyA9IG5ldyBTZXQoQXJyYXkuaXNBcnJheShsYXllcklkcykgPyBsYXllcklkcyA6IFtsYXllcklkc10pO1xuICAgICAgICBjb25zdCBhcmVMYXllckFycmF5c0VxdWFsID0gKGhhc2gxLCBoYXNoMikgPT4ge1xuICAgICAgICAgICAgaWYgKGhhc2gxLnNpemUgIT09IGhhc2gyLnNpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGF0LWxlYXN0IDEgYXJyIGhhcyBkdXBsaWNhdGUgdmFsdWUocylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY29tcGFyaW5nIHZhbHVlc1xuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBoYXNoMSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzaDIuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVtb3ZlRGVsZWdhdGVkTGlzdGVuZXJzID0gKGxpc3RlbmVyczogQXJyYXk8YW55PikgPT4ge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZWRMaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoZGVsZWdhdGVkTGlzdGVuZXIubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmIGFyZUxheWVyQXJyYXlzRXF1YWwoZGVsZWdhdGVkTGlzdGVuZXIubGF5ZXJzLCBsYXllcklkcykpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBldmVudCBpbiBkZWxlZ2F0ZWRMaXN0ZW5lci5kZWxlZ2F0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2ZmKChldmVudDogYW55KSwgZGVsZWdhdGVkTGlzdGVuZXIuZGVsZWdhdGVzW2V2ZW50XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRlbGVnYXRlZExpc3RlbmVycyA9IHRoaXMuX2RlbGVnYXRlZExpc3RlbmVycyA/IHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0eXBlXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRlbGVnYXRlZExpc3RlbmVycykge1xuICAgICAgICAgICAgcmVtb3ZlRGVsZWdhdGVkTGlzdGVuZXJzKGRlbGVnYXRlZExpc3RlbmVycyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKiogQHNlY3Rpb24ge1F1ZXJ5aW5nIGZlYXR1cmVzfSAqL1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBbR2VvSlNPTl0oaHR0cDovL2dlb2pzb24ub3JnLylcbiAgICAgKiBbRmVhdHVyZSBvYmplY3RzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzk0NiNzZWN0aW9uLTMuMilcbiAgICAgKiByZXByZXNlbnRpbmcgdmlzaWJsZSBmZWF0dXJlcyB0aGF0IHNhdGlzZnkgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZXxBcnJheTxQb2ludExpa2U+fSBbZ2VvbWV0cnldIC0gVGhlIGdlb21ldHJ5IG9mIHRoZSBxdWVyeSByZWdpb24gaW4gcGl4ZWxzOlxuICAgICAqIGVpdGhlciBhIHNpbmdsZSBwb2ludCBvciBib3R0b20gbGVmdCBhbmQgdG9wIHJpZ2h0IHBvaW50cyBkZXNjcmliaW5nIGEgYm91bmRpbmcgYm94LCB3aGVyZSB0aGUgb3JpZ2luIGlzIGF0IHRoZSB0b3AgbGVmdC5cbiAgICAgKiBPbWl0dGluZyB0aGlzIHBhcmFtZXRlciAoYnkgY2FsbGluZyB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30gd2l0aCB6ZXJvIGFyZ3VtZW50cyxcbiAgICAgKiBvciB3aXRoIG9ubHkgYW4gYG9wdGlvbnNgIGFyZ3VtZW50KSBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmcgYSBib3VuZGluZyBib3ggZW5jb21wYXNzaW5nIHRoZSBlbnRpcmVcbiAgICAgKiBtYXAgdmlld3BvcnQuXG4gICAgICogT25seSB2YWx1ZXMgd2l0aGluIHRoZSBleGlzdGluZyB2aWV3cG9ydCBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbb3B0aW9ucy5sYXllcnNdIEFuIGFycmF5IG9mIFtzdHlsZSBsYXllciBJRHNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNsYXllci1pZCkgZm9yIHRoZSBxdWVyeSB0byBpbnNwZWN0LlxuICAgICAqICAgT25seSBmZWF0dXJlcyB3aXRoaW4gdGhlc2UgbGF5ZXJzIHdpbGwgYmUgcmV0dXJuZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCwgYWxsIGxheWVycyB3aWxsIGJlIGNoZWNrZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMuZmlsdGVyXSBBIFtmaWx0ZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL2xheWVycy8jZmlsdGVyKVxuICAgICAqICAgdG8gbGltaXQgcXVlcnkgcmVzdWx0cy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnZhbGlkYXRlPXRydWVdIFdoZXRoZXIgdG8gY2hlY2sgaWYgdGhlIFtvcHRpb25zLmZpbHRlcl0gY29uZm9ybXMgdG8gdGhlIE1hcGJveCBHTCBTdHlsZSBTcGVjaWZpY2F0aW9uLiBEaXNhYmxpbmcgdmFsaWRhdGlvbiBpcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGhhdmUgcHJldmlvdXNseSB2YWxpZGF0ZWQgdGhlIHZhbHVlcyB5b3Ugd2lsbCBiZSBwYXNzaW5nIHRvIHRoaXMgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8T2JqZWN0Pn0gQW4gYXJyYXkgb2YgW0dlb0pTT05dKGh0dHA6Ly9nZW9qc29uLm9yZy8pXG4gICAgICogW2ZlYXR1cmUgb2JqZWN0c10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc5NDYjc2VjdGlvbi0zLjIpLlxuICAgICAqXG4gICAgICogVGhlIGBwcm9wZXJ0aWVzYCB2YWx1ZSBvZiBlYWNoIHJldHVybmVkIGZlYXR1cmUgb2JqZWN0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIGl0cyBzb3VyY2UgZmVhdHVyZS4gRm9yIEdlb0pTT04gc291cmNlcywgb25seVxuICAgICAqIHN0cmluZyBhbmQgbnVtZXJpYyBwcm9wZXJ0eSB2YWx1ZXMgYXJlIHN1cHBvcnRlZC4gYG51bGxgLCBgQXJyYXlgLCBhbmQgYE9iamVjdGAgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAqXG4gICAgICogRWFjaCBmZWF0dXJlIGluY2x1ZGVzIHRvcC1sZXZlbCBgbGF5ZXJgLCBgc291cmNlYCwgYW5kIGBzb3VyY2VMYXllcmAgcHJvcGVydGllcy4gVGhlIGBsYXllcmAgcHJvcGVydHkgaXMgYW4gb2JqZWN0XG4gICAgICogcmVwcmVzZW50aW5nIHRoZSBzdHlsZSBsYXllciB0byAgd2hpY2ggdGhlIGZlYXR1cmUgYmVsb25ncy4gTGF5b3V0IGFuZCBwYWludCBwcm9wZXJ0aWVzIGluIHRoaXMgb2JqZWN0IGNvbnRhaW4gdmFsdWVzXG4gICAgICogd2hpY2ggYXJlIGZ1bGx5IGV2YWx1YXRlZCBmb3IgdGhlIGdpdmVuIHpvb20gbGV2ZWwgYW5kIGZlYXR1cmUuXG4gICAgICpcbiAgICAgKiBPbmx5IGZlYXR1cmVzIHRoYXQgYXJlIGN1cnJlbnRseSByZW5kZXJlZCBhcmUgaW5jbHVkZWQuIFNvbWUgZmVhdHVyZXMgd2lsbCAqKm5vdCoqIGJlIGluY2x1ZGVkLCBsaWtlOlxuICAgICAqXG4gICAgICogLSBGZWF0dXJlcyBmcm9tIGxheWVycyB3aG9zZSBgdmlzaWJpbGl0eWAgcHJvcGVydHkgaXMgYFwibm9uZVwiYC5cbiAgICAgKiAtIEZlYXR1cmVzIGZyb20gbGF5ZXJzIHdob3NlIHpvb20gcmFuZ2UgZXhjbHVkZXMgdGhlIGN1cnJlbnQgem9vbSBsZXZlbC5cbiAgICAgKiAtIFN5bWJvbCBmZWF0dXJlcyB0aGF0IGhhdmUgYmVlbiBoaWRkZW4gZHVlIHRvIHRleHQgb3IgaWNvbiBjb2xsaXNpb24uXG4gICAgICpcbiAgICAgKiBGZWF0dXJlcyBmcm9tIGFsbCBvdGhlciBsYXllcnMgYXJlIGluY2x1ZGVkLCBpbmNsdWRpbmcgZmVhdHVyZXMgdGhhdCBtYXkgaGF2ZSBubyB2aXNpYmxlXG4gICAgICogY29udHJpYnV0aW9uIHRvIHRoZSByZW5kZXJlZCByZXN1bHQ7IGZvciBleGFtcGxlLCBiZWNhdXNlIHRoZSBsYXllcidzIG9wYWNpdHkgb3IgY29sb3IgYWxwaGEgY29tcG9uZW50IGlzIHNldCB0b1xuICAgICAqIDAuXG4gICAgICpcbiAgICAgKiBUaGUgdG9wbW9zdCByZW5kZXJlZCBmZWF0dXJlIGFwcGVhcnMgZmlyc3QgaW4gdGhlIHJldHVybmVkIGFycmF5LCBhbmQgc3Vic2VxdWVudCBmZWF0dXJlcyBhcmUgc29ydGVkIGJ5XG4gICAgICogZGVzY2VuZGluZyB6LW9yZGVyLiBGZWF0dXJlcyB0aGF0IGFyZSByZW5kZXJlZCBtdWx0aXBsZSB0aW1lcyAoZHVlIHRvIHdyYXBwaW5nIGFjcm9zcyB0aGUgYW50aW1lcmlkaWFuIGF0IGxvd1xuICAgICAqIHpvb20gbGV2ZWxzKSBhcmUgcmV0dXJuZWQgb25seSBvbmNlICh0aG91Z2ggc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNhdmVhdCkuXG4gICAgICpcbiAgICAgKiBCZWNhdXNlIGZlYXR1cmVzIGNvbWUgZnJvbSB0aWxlZCB2ZWN0b3IgZGF0YSBvciBHZW9KU09OIGRhdGEgdGhhdCBpcyBjb252ZXJ0ZWQgdG8gdGlsZXMgaW50ZXJuYWxseSwgZmVhdHVyZVxuICAgICAqIGdlb21ldHJpZXMgbWF5IGJlIHNwbGl0IG9yIGR1cGxpY2F0ZWQgYWNyb3NzIHRpbGUgYm91bmRhcmllcyBhbmQsIGFzIGEgcmVzdWx0LCBmZWF0dXJlcyBtYXkgYXBwZWFyIG11bHRpcGxlXG4gICAgICogdGltZXMgaW4gcXVlcnkgcmVzdWx0cy4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhlcmUgaXMgYSBoaWdod2F5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIGEgcXVlcnkuXG4gICAgICogVGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5IHdpbGwgYmUgdGhvc2UgcGFydHMgb2YgdGhlIGhpZ2h3YXkgdGhhdCBsaWUgd2l0aGluIHRoZSBtYXAgdGlsZXMgY292ZXJpbmcgdGhlIGJvdW5kaW5nXG4gICAgICogcmVjdGFuZ2xlLCBldmVuIGlmIHRoZSBoaWdod2F5IGV4dGVuZHMgaW50byBvdGhlciB0aWxlcywgYW5kIHRoZSBwb3J0aW9uIG9mIHRoZSBoaWdod2F5IHdpdGhpbiBlYWNoIG1hcCB0aWxlXG4gICAgICogd2lsbCBiZSByZXR1cm5lZCBhcyBhIHNlcGFyYXRlIGZlYXR1cmUuIFNpbWlsYXJseSwgYSBwb2ludCBmZWF0dXJlIG5lYXIgYSB0aWxlIGJvdW5kYXJ5IG1heSBhcHBlYXIgaW4gbXVsdGlwbGVcbiAgICAgKiB0aWxlcyBkdWUgdG8gdGlsZSBidWZmZXJpbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEZpbmQgYWxsIGZlYXR1cmVzIGF0IGEgcG9pbnRcbiAgICAgKiBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoXG4gICAgICogICBbMjAsIDM1XSxcbiAgICAgKiAgIHtsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddfVxuICAgICAqICk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEZpbmQgYWxsIGZlYXR1cmVzIHdpdGhpbiBhIHN0YXRpYyBib3VuZGluZyBib3hcbiAgICAgKiBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoXG4gICAgICogICBbWzEwLCAyMF0sIFszMCwgNTBdXSxcbiAgICAgKiAgIHtsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddfVxuICAgICAqICk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEZpbmQgYWxsIGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveCBhcm91bmQgYSBwb2ludFxuICAgICAqIGNvbnN0IHdpZHRoID0gMTA7XG4gICAgICogY29uc3QgaGVpZ2h0ID0gMjA7XG4gICAgICogY29uc3QgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKFtcbiAgICAgKiAgICAgW3BvaW50LnggLSB3aWR0aCAvIDIsIHBvaW50LnkgLSBoZWlnaHQgLyAyXSxcbiAgICAgKiAgICAgW3BvaW50LnggKyB3aWR0aCAvIDIsIHBvaW50LnkgKyBoZWlnaHQgLyAyXVxuICAgICAqIF0sIHtsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddfSk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFF1ZXJ5IGFsbCByZW5kZXJlZCBmZWF0dXJlcyBmcm9tIGEgc2luZ2xlIGxheWVyXG4gICAgICogY29uc3QgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKHtsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogR2V0IGZlYXR1cmVzIHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3F1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogSGlnaGxpZ2h0IGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91c2luZy1ib3gtcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBGaWx0ZXIgZmVhdHVyZXMgd2l0aGluIG1hcCB2aWV3XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpbHRlci1mZWF0dXJlcy13aXRoaW4tbWFwLXZpZXcvKVxuICAgICAqL1xuICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhnZW9tZXRyeT86IFBvaW50TGlrZSB8IFtQb2ludExpa2UsIFBvaW50TGlrZV0sIG9wdGlvbnM/OiBPYmplY3QpIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBjYW4gYmUgb21pdHRlZCBlbnRpcmVseSwgbWFraW5nIHRoaXMgZWZmZWN0aXZlbHkgYW4gb3ZlcmxvYWRlZCBtZXRob2RcbiAgICAgICAgLy8gd2l0aCB0d28gc2lnbmF0dXJlczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhnZW9tZXRyeTogUG9pbnRMaWtlIHwgW1BvaW50TGlrZSwgUG9pbnRMaWtlXSwgb3B0aW9ucz86IE9iamVjdClcbiAgICAgICAgLy8gICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhvcHRpb25zPzogT2JqZWN0KVxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGVyZSBubyB3YXkgdG8gZXhwcmVzcyB0aGF0IGluIGEgd2F5IHRoYXQncyBjb21wYXRpYmxlIHdpdGggYm90aCBmbG93IGFuZCBkb2N1bWVudGF0aW9uLmpzLlxuICAgICAgICAvLyBSZWxhdGVkOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTU1NlxuXG4gICAgICAgIGlmICghdGhpcy5zdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCAmJiBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkICYmICEoZ2VvbWV0cnkgaW5zdGFuY2VvZiBQb2ludCkgJiYgIUFycmF5LmlzQXJyYXkoZ2VvbWV0cnkpKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gKGdlb21ldHJ5OiBPYmplY3QpO1xuICAgICAgICAgICAgZ2VvbWV0cnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgZ2VvbWV0cnkgPSBnZW9tZXRyeSB8fCBbWzAsIDBdLCBbdGhpcy50cmFuc2Zvcm0ud2lkdGgsIHRoaXMudHJhbnNmb3JtLmhlaWdodF1dO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhnZW9tZXRyeSwgb3B0aW9ucywgdGhpcy50cmFuc2Zvcm0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgW0dlb0pTT05dKGh0dHA6Ly9nZW9qc29uLm9yZy8pXG4gICAgICogW0ZlYXR1cmUgb2JqZWN0c10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc5NDYjc2VjdGlvbi0zLjIpXG4gICAgICogcmVwcmVzZW50aW5nIGZlYXR1cmVzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHZlY3RvciB0aWxlIG9yIEdlb0pTT04gc291cmNlIHRoYXQgc2F0aXNmeSB0aGUgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VJZCBUaGUgSUQgb2YgdGhlIHZlY3RvciB0aWxlIG9yIEdlb0pTT04gc291cmNlIHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc10gT3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbWV0ZXJzLnNvdXJjZUxheWVyXSBUaGUgbmFtZSBvZiB0aGUgW3NvdXJjZSBsYXllcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9zb3VyY2UtbGF5ZXIvKVxuICAgICAqICAgdG8gcXVlcnkuICpGb3IgdmVjdG9yIHRpbGUgc291cmNlcywgdGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuKiBGb3IgR2VvSlNPTiBzb3VyY2VzLCBpdCBpcyBpZ25vcmVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJhbWV0ZXJzLmZpbHRlcl0gQSBbZmlsdGVyXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9sYXllcnMvI2ZpbHRlcilcbiAgICAgKiAgIHRvIGxpbWl0IHF1ZXJ5IHJlc3VsdHMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1ldGVycy52YWxpZGF0ZT10cnVlXSBXaGV0aGVyIHRvIGNoZWNrIGlmIHRoZSBbcGFyYW1ldGVycy5maWx0ZXJdIGNvbmZvcm1zIHRvIHRoZSBNYXBib3ggR0wgU3R5bGUgU3BlY2lmaWNhdGlvbi4gRGlzYWJsaW5nIHZhbGlkYXRpb24gaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBoYXZlIHByZXZpb3VzbHkgdmFsaWRhdGVkIHRoZSB2YWx1ZXMgeW91IHdpbGwgYmUgcGFzc2luZyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5PE9iamVjdD59IEFuIGFycmF5IG9mIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKVxuICAgICAqIFtGZWF0dXJlIG9iamVjdHNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3OTQ2I3NlY3Rpb24tMy4yKS5cbiAgICAgKlxuICAgICAqIEluIGNvbnRyYXN0IHRvIHtAbGluayBNYXAjcXVlcnlSZW5kZXJlZEZlYXR1cmVzfSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFsbCBmZWF0dXJlcyBtYXRjaGluZyB0aGUgcXVlcnkgcGFyYW1ldGVycyxcbiAgICAgKiB3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSByZW5kZXJlZCBieSB0aGUgY3VycmVudCBzdHlsZSAoaW4gb3RoZXIgd29yZHMsIGFyZSB2aXNpYmxlKS4gVGhlIGRvbWFpbiBvZiB0aGUgcXVlcnkgaW5jbHVkZXMgYWxsIGN1cnJlbnRseS1sb2FkZWRcbiAgICAgKiB2ZWN0b3IgdGlsZXMgYW5kIEdlb0pTT04gc291cmNlIHRpbGVzOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRpbGVzIG91dHNpZGUgdGhlIGN1cnJlbnRseVxuICAgICAqIHZpc2libGUgdmlld3BvcnQuXG4gICAgICpcbiAgICAgKiBCZWNhdXNlIGZlYXR1cmVzIGNvbWUgZnJvbSB0aWxlZCB2ZWN0b3IgZGF0YSBvciBHZW9KU09OIGRhdGEgdGhhdCBpcyBjb252ZXJ0ZWQgdG8gdGlsZXMgaW50ZXJuYWxseSwgZmVhdHVyZVxuICAgICAqIGdlb21ldHJpZXMgbWF5IGJlIHNwbGl0IG9yIGR1cGxpY2F0ZWQgYWNyb3NzIHRpbGUgYm91bmRhcmllcyBhbmQsIGFzIGEgcmVzdWx0LCBmZWF0dXJlcyBtYXkgYXBwZWFyIG11bHRpcGxlXG4gICAgICogdGltZXMgaW4gcXVlcnkgcmVzdWx0cy4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhlcmUgaXMgYSBoaWdod2F5IHJ1bm5pbmcgdGhyb3VnaCB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIGEgcXVlcnkuXG4gICAgICogVGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5IHdpbGwgYmUgdGhvc2UgcGFydHMgb2YgdGhlIGhpZ2h3YXkgdGhhdCBsaWUgd2l0aGluIHRoZSBtYXAgdGlsZXMgY292ZXJpbmcgdGhlIGJvdW5kaW5nXG4gICAgICogcmVjdGFuZ2xlLCBldmVuIGlmIHRoZSBoaWdod2F5IGV4dGVuZHMgaW50byBvdGhlciB0aWxlcywgYW5kIHRoZSBwb3J0aW9uIG9mIHRoZSBoaWdod2F5IHdpdGhpbiBlYWNoIG1hcCB0aWxlXG4gICAgICogd2lsbCBiZSByZXR1cm5lZCBhcyBhIHNlcGFyYXRlIGZlYXR1cmUuIFNpbWlsYXJseSwgYSBwb2ludCBmZWF0dXJlIG5lYXIgYSB0aWxlIGJvdW5kYXJ5IG1heSBhcHBlYXIgaW4gbXVsdGlwbGVcbiAgICAgKiB0aWxlcyBkdWUgdG8gdGlsZSBidWZmZXJpbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEZpbmQgYWxsIGZlYXR1cmVzIGluIG9uZSBzb3VyY2UgbGF5ZXIgaW4gYSB2ZWN0b3Igc291cmNlXG4gICAgICogY29uc3QgZmVhdHVyZXMgPSBtYXAucXVlcnlTb3VyY2VGZWF0dXJlcygneW91ci1zb3VyY2UtaWQnLCB7XG4gICAgICogICAgIHNvdXJjZUxheWVyOiAneW91ci1zb3VyY2UtbGF5ZXInXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBIaWdobGlnaHQgZmVhdHVyZXMgY29udGFpbmluZyBzaW1pbGFyIGRhdGFdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcXVlcnktc2ltaWxhci1mZWF0dXJlcy8pXG4gICAgICovXG4gICAgcXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VJZDogc3RyaW5nLCBwYXJhbWV0ZXJzOiA/e3NvdXJjZUxheWVyOiA/c3RyaW5nLCBmaWx0ZXI6ID9BcnJheTxhbnk+LCB2YWxpZGF0ZT86IGJvb2xlYW59KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnF1ZXJ5U291cmNlRmVhdHVyZXMoc291cmNlSWQsIHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIGN1cnJlbnRseSBsb2FkZWQgZGF0YSBmb3IgZWxldmF0aW9uIGF0IGEgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uLiBUaGUgZWxldmF0aW9uIGlzIHJldHVybmVkIGluIGBtZXRlcnNgIHJlbGF0aXZlIHRvIG1lYW4gc2VhLWxldmVsLlxuICAgICAqIFJldHVybnMgYG51bGxgIGlmIGB0ZXJyYWluYCBpcyBkaXNhYmxlZCBvciBpZiB0ZXJyYWluIGRhdGEgZm9yIHRoZSBsb2NhdGlvbiBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0LlxuICAgICAqXG4gICAgICogSW4gb3JkZXIgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIHRlcnJhaW4gZGF0YSBpcyBsb2FkZWQgZW5zdXJlIHRoYXQgdGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiBpcyB2aXNpYmxlIGFuZCB3YWl0IGZvciB0aGUgYGlkbGVgIGV2ZW50IHRvIG9jY3VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBsbmdsYXQgVGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiBhdCB3aGljaCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0VsZXZhdGlvblF1ZXJ5T3B0aW9uc30gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZXhhZ2dlcmF0ZWQ9dHJ1ZV0gV2hlbiBgdHJ1ZWAgcmV0dXJucyB0aGUgdGVycmFpbiBlbGV2YXRpb24gd2l0aCB0aGUgdmFsdWUgb2YgYGV4YWdnZXJhdGlvbmAgZnJvbSB0aGUgc3R5bGUgYWxyZWFkeSBhcHBsaWVkLlxuICAgICAqIFdoZW4gYGZhbHNlYCwgcmV0dXJucyB0aGUgcmF3IHZhbHVlIG9mIHRoZSB1bmRlcmx5aW5nIGRhdGEgd2l0aG91dCBzdHlsaW5nIGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IFRoZSBlbGV2YXRpb24gaW4gbWV0ZXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgY29vcmRpbmF0ZSA9IFstMTIyLjQyMDY3OSwgMzcuNzcyNTM3XTtcbiAgICAgKiBjb25zdCBlbGV2YXRpb24gPSBtYXAucXVlcnlUZXJyYWluRWxldmF0aW9uKGNvb3JkaW5hdGUpO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IFF1ZXJ5IHRlcnJhaW4gZWxldmF0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9xdWVyeS10ZXJyYWluLWVsZXZhdGlvbi8pXG4gICAgICovXG4gICAgcXVlcnlUZXJyYWluRWxldmF0aW9uKGxuZ2xhdDogTG5nTGF0TGlrZSwgb3B0aW9uczogRWxldmF0aW9uUXVlcnlPcHRpb25zKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGVsZXZhdGlvbiA9IHRoaXMudHJhbnNmb3JtLmVsZXZhdGlvbjtcbiAgICAgICAgaWYgKGVsZXZhdGlvbikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwge2V4YWdnZXJhdGVkOiB0cnVlfSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gZWxldmF0aW9uLmdldEF0UG9pbnQoTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQobG5nbGF0KSwgbnVsbCwgb3B0aW9ucy5leGFnZ2VyYXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqIEBzZWN0aW9uIHtXb3JraW5nIHdpdGggc3R5bGVzfSAqL1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgbWFwJ3MgTWFwYm94IHN0eWxlIG9iamVjdCB3aXRoIGEgbmV3IHZhbHVlLlxuICAgICAqXG4gICAgICogSWYgYSBzdHlsZSBpcyBhbHJlYWR5IHNldCB3aGVuIHRoaXMgaXMgdXNlZCBhbmQgdGhlIGBkaWZmYCBvcHRpb24gaXMgc2V0IHRvIGB0cnVlYCwgdGhlIG1hcCByZW5kZXJlciB3aWxsIGF0dGVtcHQgdG8gY29tcGFyZSB0aGUgZ2l2ZW4gc3R5bGVcbiAgICAgKiBhZ2FpbnN0IHRoZSBtYXAncyBjdXJyZW50IHN0YXRlIGFuZCBwZXJmb3JtIG9ubHkgdGhlIGNoYW5nZXMgbmVjZXNzYXJ5IHRvIG1ha2UgdGhlIG1hcCBzdHlsZSBtYXRjaCB0aGUgZGVzaXJlZCBzdGF0ZS4gQ2hhbmdlcyBpbiBzcHJpdGVzXG4gICAgICogKGltYWdlcyB1c2VkIGZvciBpY29ucyBhbmQgcGF0dGVybnMpIGFuZCBnbHlwaHMgKGZvbnRzIGZvciBsYWJlbCB0ZXh0KSAqKmNhbm5vdCoqIGJlIGRpZmZlZC4gSWYgdGhlIHNwcml0ZXMgb3IgZm9udHMgdXNlZCBpbiB0aGUgY3VycmVudFxuICAgICAqIHN0eWxlIGFuZCB0aGUgZ2l2ZW4gc3R5bGUgYXJlIGRpZmZlcmVudCBpbiBhbnkgd2F5LCB0aGUgbWFwIHJlbmRlcmVyIHdpbGwgZm9yY2UgYSBmdWxsIHVwZGF0ZSwgcmVtb3ZpbmcgdGhlIGN1cnJlbnQgc3R5bGUgYW5kIGJ1aWxkaW5nXG4gICAgICogdGhlIGdpdmVuIG9uZSBmcm9tIHNjcmF0Y2guXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IHN0cmluZ3wgbnVsbH0gc3R5bGUgQSBKU09OIG9iamVjdCBjb25mb3JtaW5nIHRvIHRoZSBzY2hlbWEgZGVzY3JpYmVkIGluIHRoZVxuICAgICAqICAgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL21hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKSwgb3IgYSBVUkwgdG8gc3VjaCBKU09OLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kaWZmPXRydWVdIElmIGZhbHNlLCBmb3JjZSBhICdmdWxsJyB1cGRhdGUsIHJlbW92aW5nIHRoZSBjdXJyZW50IHN0eWxlXG4gICAgICogICBhbmQgYnVpbGRpbmcgdGhlIGdpdmVuIG9uZSBpbnN0ZWFkIG9mIGF0dGVtcHRpbmcgYSBkaWZmLWJhc2VkIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5PSdzYW5zLXNlcmlmJ10gRGVmaW5lcyBhIENTU1xuICAgICAqICAgZm9udC1mYW1pbHkgZm9yIGxvY2FsbHkgb3ZlcnJpZGluZyBnZW5lcmF0aW9uIG9mIGdseXBocyBpbiB0aGUgJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnLCAnSGlyYWdhbmEnLCAnS2F0YWthbmEnIGFuZCAnSGFuZ3VsIFN5bGxhYmxlcycgcmFuZ2VzLlxuICAgICAqICAgSW4gdGhlc2UgcmFuZ2VzLCBmb250IHNldHRpbmdzIGZyb20gdGhlIG1hcCdzIHN0eWxlIHdpbGwgYmUgaWdub3JlZCwgZXhjZXB0IGZvciBmb250LXdlaWdodCBrZXl3b3JkcyAobGlnaHQvcmVndWxhci9tZWRpdW0vYm9sZCkuXG4gICAgICogICBTZXQgdG8gYGZhbHNlYCwgdG8gZW5hYmxlIGZvbnQgc2V0dGluZ3MgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUgZm9yIHRoZXNlIGdseXBoIHJhbmdlcy5cbiAgICAgKiAgIEZvcmNlcyBhIGZ1bGwgdXBkYXRlLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRTdHlsZShcIm1hcGJveDovL3N0eWxlcy9tYXBib3gvc3RyZWV0cy12MTFcIik7XG4gICAgICpcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDaGFuZ2UgYSBtYXAncyBzdHlsZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9zZXRzdHlsZS8pXG4gICAgICovXG4gICAgc2V0U3R5bGUoc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiB8IHN0cmluZyB8IG51bGwsIG9wdGlvbnM/OiB7ZGlmZj86IGJvb2xlYW59ICYgU3R5bGVPcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBleHRlbmQoe30sIHtsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6IHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseSwgbG9jYWxGb250RmFtaWx5OiB0aGlzLl9sb2NhbEZvbnRGYW1pbHl9LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoKG9wdGlvbnMuZGlmZiAhPT0gZmFsc2UgJiZcbiAgICAgICAgICAgIG9wdGlvbnMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ID09PSB0aGlzLl9sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgJiZcbiAgICAgICAgICAgIG9wdGlvbnMubG9jYWxGb250RmFtaWx5ID09PSB0aGlzLl9sb2NhbEZvbnRGYW1pbHkpICYmIHRoaXMuc3R5bGUgJiYgc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2RpZmZTdHlsZShzdHlsZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseSA9IG9wdGlvbnMubG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5O1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxGb250RmFtaWx5ID0gb3B0aW9ucy5sb2NhbEZvbnRGYW1pbHk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlU3R5bGUoc3R5bGUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2dldFVJU3RyaW5nKGtleTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IHRoaXMuX2xvY2FsZVtrZXldO1xuICAgICAgICBpZiAoc3RyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBVSSBzdHJpbmcgJyR7a2V5fSdgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgX3VwZGF0ZVN0eWxlKHN0eWxlOiBTdHlsZVNwZWNpZmljYXRpb24gfCBzdHJpbmcgfCBudWxsLCAgb3B0aW9ucz86IHtkaWZmPzogYm9vbGVhbn0gJiBTdHlsZU9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX3JlbW92ZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUgPSBuZXcgU3R5bGUodGhpcywgb3B0aW9ucyB8fCB7fSk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLnNldEV2ZW50ZWRQYXJlbnQodGhpcywge3N0eWxlOiB0aGlzLnN0eWxlfSk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5sb2FkVVJMKHN0eWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5sb2FkSlNPTihzdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlVGVycmFpbigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfbGF6eUluaXRFbXB0eVN0eWxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUgPSBuZXcgU3R5bGUodGhpcywge30pO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5zZXRFdmVudGVkUGFyZW50KHRoaXMsIHtzdHlsZTogdGhpcy5zdHlsZX0pO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5sb2FkRW1wdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9kaWZmU3R5bGUoc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiB8IHN0cmluZywgIG9wdGlvbnM/OiB7ZGlmZj86IGJvb2xlYW59ICYgU3R5bGVPcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTdHlsZVVSTChzdHlsZSk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5TdHlsZSk7XG4gICAgICAgICAgICBnZXRKU09OKHJlcXVlc3QsIChlcnJvcjogP0Vycm9yLCBqc29uOiA/T2JqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnJvcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVEaWZmKGpzb24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdHlsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURpZmYoc3R5bGUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZURpZmYoc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiwgIG9wdGlvbnM/OiB7ZGlmZj86IGJvb2xlYW59ICYgU3R5bGVPcHRpb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHlsZS5zZXRTdGF0ZShzdHlsZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKFxuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gcGVyZm9ybSBzdHlsZSBkaWZmOiAke2UubWVzc2FnZSB8fCBlLmVycm9yIHx8IGV9LiAgUmVidWlsZGluZyB0aGUgc3R5bGUgZnJvbSBzY3JhdGNoLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTdHlsZShzdHlsZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBNYXBib3ggW3N0eWxlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L3N0eWxlLykgb2JqZWN0LCBhIEpTT04gb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBtYXAncyBzdHlsZSBKU09OIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLm9uKCdsb2FkJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zdCBzdHlsZUpzb24gPSBtYXAuZ2V0U3R5bGUoKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqL1xuICAgIGdldFN0eWxlKCkge1xuICAgICAgICBpZiAodGhpcy5zdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCdzIHN0eWxlIGlzIGZ1bGx5IGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzdHlsZSBpcyBmdWxseSBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHN0eWxlTG9hZFN0YXR1cyA9IG1hcC5pc1N0eWxlTG9hZGVkKCk7XG4gICAgICovXG4gICAgaXNTdHlsZUxvYWRlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0eWxlKSByZXR1cm4gd2Fybk9uY2UoJ1RoZXJlIGlzIG5vIHN0eWxlIGFkZGVkIHRvIHRoZSBtYXAuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmxvYWRlZCgpO1xuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7U291cmNlc30gKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBzb3VyY2UgdG8gdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIGFkZC4gTXVzdCBub3QgY29uZmxpY3Qgd2l0aCBleGlzdGluZyBzb3VyY2VzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QsIGNvbmZvcm1pbmcgdG8gdGhlXG4gICAgICogTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24ncyBbc291cmNlIGRlZmluaXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMpIG9yXG4gICAgICoge0BsaW5rIENhbnZhc1NvdXJjZU9wdGlvbnN9LlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuYWRkU291cmNlKCdteS1kYXRhJywge1xuICAgICAqICAgICB0eXBlOiAndmVjdG9yJyxcbiAgICAgKiAgICAgdXJsOiAnbWFwYm94Oi8vbXl1c2VybmFtZS50aWxlc2V0aWQnXG4gICAgICogfSk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuYWRkU291cmNlKCdteS1kYXRhJywge1xuICAgICAqICAgICBcInR5cGVcIjogXCJnZW9qc29uXCIsXG4gICAgICogICAgIFwiZGF0YVwiOiB7XG4gICAgICogICAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXG4gICAgICogICAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAgICAgKiAgICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICAgICAqICAgICAgICAgICAgIFwiY29vcmRpbmF0ZXNcIjogWy03Ny4wMzIzLCAzOC45MTMxXVxuICAgICAqICAgICAgICAgfSxcbiAgICAgKiAgICAgICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICogICAgICAgICAgICAgXCJ0aXRsZVwiOiBcIk1hcGJveCBEQ1wiLFxuICAgICAqICAgICAgICAgICAgIFwibWFya2VyLXN5bWJvbFwiOiBcIm1vbnVtZW50XCJcbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgfVxuICAgICAqIH0pO1xuICAgICAqIEBzZWUgRXhhbXBsZTogVmVjdG9yIHNvdXJjZTogW1Nob3cgYW5kIGhpZGUgbGF5ZXJzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90b2dnbGUtbGF5ZXJzLylcbiAgICAgKiBAc2VlIEV4YW1wbGU6IEdlb0pTT04gc291cmNlOiBbQWRkIGxpdmUgcmVhbHRpbWUgZGF0YV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbGl2ZS1nZW9qc29uLylcbiAgICAgKiBAc2VlIEV4YW1wbGU6IFJhc3RlciBERU0gc291cmNlOiBbQWRkIGhpbGxzaGFkaW5nXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9oaWxsc2hhZGUvKVxuICAgICAqL1xuICAgIGFkZFNvdXJjZShpZDogc3RyaW5nLCBzb3VyY2U6IFNvdXJjZVNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5fbGF6eUluaXRFbXB0eVN0eWxlKCk7XG4gICAgICAgIHRoaXMuc3R5bGUuYWRkU291cmNlKGlkLCBzb3VyY2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc291cmNlIGlzIGxvYWRlZC4gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHNvdXJjZSB3aXRoXG4gICAgICogdGhlIGdpdmVuIElEIGluIHRoZSBtYXAncyBzdHlsZSBoYXMgbm8gb3V0c3RhbmRpbmcgbmV0d29yayByZXF1ZXN0cywgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBzb3VyY2UgdG8gYmUgY2hlY2tlZC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc291cmNlIGlzIGxvYWRlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHNvdXJjZUxvYWRlZCA9IG1hcC5pc1NvdXJjZUxvYWRlZCgnYmF0aHltZXRyeS1kYXRhJyk7XG4gICAgICovXG4gICAgaXNTb3VyY2VMb2FkZWQoaWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUuX2dldFNvdXJjZUNhY2hlcyhpZCk7XG4gICAgICAgIGlmIChzb3VyY2VDYWNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGVyZSBpcyBubyBzb3VyY2Ugd2l0aCBJRCAnJHtpZH0nYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzb3VyY2VDYWNoZXMuZXZlcnkoc2MgPT4gc2MubG9hZGVkKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbGwgdGlsZXMgaW4gdGhlIHZpZXdwb3J0IGZyb20gYWxsIHNvdXJjZXMgb25cbiAgICAgKiB0aGUgc3R5bGUgYXJlIGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFsbCB0aWxlcyBhcmUgbG9hZGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgdGlsZXNMb2FkZWQgPSBtYXAuYXJlVGlsZXNMb2FkZWQoKTtcbiAgICAgKi9cblxuICAgIGFyZVRpbGVzTG9hZGVkKCkge1xuICAgICAgICBjb25zdCBzb3VyY2VzID0gdGhpcy5zdHlsZSAmJiB0aGlzLnN0eWxlLl9zb3VyY2VDYWNoZXM7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gc291cmNlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlc1tpZF07XG4gICAgICAgICAgICBjb25zdCB0aWxlcyA9IHNvdXJjZS5fdGlsZXM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHQgaW4gdGlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGlsZXNbdF07XG4gICAgICAgICAgICAgICAgaWYgKCEodGlsZS5zdGF0ZSA9PT0gJ2xvYWRlZCcgfHwgdGlsZS5zdGF0ZSA9PT0gJ2Vycm9yZWQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBbY3VzdG9tIHNvdXJjZSB0eXBlXSgjQ3VzdG9tIFNvdXJjZXMpLCBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciB1c2Ugd2l0aFxuICAgICAqIHtAbGluayBNYXAjYWRkU291cmNlfS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgdHlwZTsgc291cmNlIGRlZmluaXRpb24gb2JqZWN0cyB1c2UgdGhpcyBuYW1lIGluIHRoZSBge3R5cGU6IC4uLn1gIGZpZWxkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFNvdXJjZVR5cGUgQSB7QGxpbmsgU291cmNlfSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgd2hlbiB0aGUgc291cmNlIHR5cGUgaXMgcmVhZHkgb3Igd2l0aCBhbiBlcnJvciBhcmd1bWVudCBpZiB0aGVyZSBpcyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBhZGRTb3VyY2VUeXBlKG5hbWU6IHN0cmluZywgU291cmNlVHlwZTogYW55LCBjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fbGF6eUluaXRFbXB0eVN0eWxlKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmFkZFNvdXJjZVR5cGUobmFtZSwgU291cmNlVHlwZSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBzb3VyY2UgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBzb3VyY2UgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAucmVtb3ZlU291cmNlKCdiYXRoeW1ldHJ5LWRhdGEnKTtcbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2UoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZVNvdXJjZShpZCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVRlcnJhaW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIElEIGluIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIG9mdGVuIHVzZWQgdG8gdXBkYXRlIGEgc291cmNlIHVzaW5nIHRoZSBpbnN0YW5jZSBtZW1iZXJzIGZvciB0aGUgcmVsZXZhbnRcbiAgICAgKiBzb3VyY2UgdHlwZSBhcyBkZWZpbmVkIGluIFtTb3VyY2VzXSgjc291cmNlcykuXG4gICAgICogRm9yIGV4YW1wbGUsIHNldHRpbmcgdGhlIGBkYXRhYCBmb3IgYSBHZW9KU09OIHNvdXJjZSBvciB1cGRhdGluZyB0aGUgYHVybGAgYW5kIGBjb29yZGluYXRlc2BcbiAgICAgKiBvZiBhbiBpbWFnZSBzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBzb3VyY2UgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHs/T2JqZWN0fSBUaGUgc3R5bGUgc291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBJRCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgSURcbiAgICAgKiBjb3JyZXNwb25kcyB0byBubyBleGlzdGluZyBzb3VyY2VzLlxuICAgICAqIFRoZSBzaGFwZSBvZiB0aGUgb2JqZWN0IHZhcmllcyBieSBzb3VyY2UgdHlwZS5cbiAgICAgKiBBIGxpc3Qgb2Ygb3B0aW9ucyBmb3IgZWFjaCBzb3VyY2UgdHlwZSBpcyBhdmFpbGFibGUgb24gdGhlIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uJ3NcbiAgICAgKiBbU291cmNlc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvc291cmNlcy8pIHBhZ2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb3VyY2VPYmplY3QgPSBtYXAuZ2V0U291cmNlKCdwb2ludHMnKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQW5pbWF0ZSBhIHBvaW50XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hbmltYXRlLXBvaW50LWFsb25nLWxpbmUvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEFkZCBsaXZlIHJlYWx0aW1lIGRhdGFdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2xpdmUtZ2VvanNvbi8pXG4gICAgICovXG4gICAgZ2V0U291cmNlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0U291cmNlKGlkKTtcbiAgICB9XG5cbiAgICAvKiogQHNlY3Rpb24ge0ltYWdlc30gKi9cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnNcbiAgICAvKipcbiAgICAgKiBBZGQgYW4gaW1hZ2UgdG8gdGhlIHN0eWxlLiBUaGlzIGltYWdlIGNhbiBiZSBkaXNwbGF5ZWQgb24gdGhlIG1hcCBsaWtlIGFueSBvdGhlciBpY29uIGluIHRoZSBzdHlsZSdzXG4gICAgICogW3Nwcml0ZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvc3ByaXRlLykgdXNpbmcgdGhlIGltYWdlJ3MgSUQgd2l0aFxuICAgICAqIFtgaWNvbi1pbWFnZWBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNsYXlvdXQtc3ltYm9sLWljb24taW1hZ2UpLFxuICAgICAqIFtgYmFja2dyb3VuZC1wYXR0ZXJuYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI3BhaW50LWJhY2tncm91bmQtYmFja2dyb3VuZC1wYXR0ZXJuKSxcbiAgICAgKiBbYGZpbGwtcGF0dGVybmBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNwYWludC1maWxsLWZpbGwtcGF0dGVybiksXG4gICAgICogb3IgW2BsaW5lLXBhdHRlcm5gXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jcGFpbnQtbGluZS1saW5lLXBhdHRlcm4pLlxuICAgICAqIEEge0BsaW5rIE1hcC5ldmVudDplcnJvcn0gZXZlbnQgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIGluIHRoZSBzcHJpdGUgdG8gYWRkIHRoaXMgaW1hZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBpbWFnZS5cbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnQgfCBJbWFnZUJpdG1hcCB8IEltYWdlRGF0YSB8IHt3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZGF0YTogKFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSl9IHwgU3R5bGVJbWFnZUludGVyZmFjZX0gaW1hZ2UgVGhlIGltYWdlIGFzIGFuIGBIVE1MSW1hZ2VFbGVtZW50YCwgYEltYWdlRGF0YWAsIGBJbWFnZUJpdG1hcGAgb3Igb2JqZWN0IHdpdGggYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgZGF0YWBcbiAgICAgKiBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5waXhlbFJhdGlvIFRoZSByYXRpbyBvZiBwaXhlbHMgaW4gdGhlIGltYWdlIHRvIHBoeXNpY2FsIHBpeGVscyBvbiB0aGUgc2NyZWVuLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5zZGYgV2hldGhlciB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGFuIFNERiBpbWFnZS5cbiAgICAgKiBAcGFyYW0ge1tudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdfSBvcHRpb25zLmNvbnRlbnQgYFt4MSwgeTEsIHgyLCB5Ml1gICBJZiBgaWNvbi10ZXh0LWZpdGAgaXMgdXNlZCBpbiBhIGxheWVyIHdpdGggdGhpcyBpbWFnZSwgdGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgcGFydCBvZiB0aGUgaW1hZ2UgdGhhdCBjYW4gYmUgY292ZXJlZCBieSB0aGUgY29udGVudCBpbiBgdGV4dC1maWVsZGAuXG4gICAgICogQHBhcmFtIHtBcnJheTxbbnVtYmVyLCBudW1iZXJdPn0gb3B0aW9ucy5zdHJldGNoWCBgW1t4MSwgeDJdLCAuLi5dYCBJZiBgaWNvbi10ZXh0LWZpdGAgaXMgdXNlZCBpbiBhIGxheWVyIHdpdGggdGhpcyBpbWFnZSwgdGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgcGFydChzKSBvZiB0aGUgaW1hZ2UgdGhhdCBjYW4gYmUgc3RyZXRjaGVkIGhvcml6b250YWxseS5cbiAgICAgKiBAcGFyYW0ge0FycmF5PFtudW1iZXIsIG51bWJlcl0+fSBvcHRpb25zLnN0cmV0Y2hZIGBbW3kxLCB5Ml0sIC4uLl1gIElmIGBpY29uLXRleHQtZml0YCBpcyB1c2VkIGluIGEgbGF5ZXIgd2l0aCB0aGlzIGltYWdlLCB0aGlzIG9wdGlvbiBkZWZpbmVzIHRoZSBwYXJ0KHMpIG9mIHRoZSBpbWFnZSB0aGF0IGNhbiBiZSBzdHJldGNoZWQgdmVydGljYWxseS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSWYgdGhlIHN0eWxlJ3Mgc3ByaXRlIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBhbiBpbWFnZSB3aXRoIElEICdjYXQnLFxuICAgICAqIC8vIGFkZCB0aGUgaW1hZ2UgJ2NhdC1pY29uLnBuZycgdG8gdGhlIHN0eWxlJ3Mgc3ByaXRlIHdpdGggdGhlIElEICdjYXQnLlxuICAgICAqIG1hcC5sb2FkSW1hZ2UoJ2h0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvNi82MC9DYXRfc2lsaG91ZXR0ZS5zdmcvNDAwcHgtQ2F0X3NpbGhvdWV0dGUuc3ZnLnBuZycsIChlcnJvciwgaW1hZ2UpID0+IHtcbiAgICAgKiAgICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcbiAgICAgKiAgICAgaWYgKCFtYXAuaGFzSW1hZ2UoJ2NhdCcpKSBtYXAuYWRkSW1hZ2UoJ2NhdCcsIGltYWdlKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIEFkZCBhIHN0cmV0Y2hhYmxlIGltYWdlIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgaWNvbi10ZXh0LWZpdGBcbiAgICAgKiAvLyBJbiB0aGlzIGV4YW1wbGUsIHRoZSBpbWFnZSBpcyA2MDBweCB3aWRlIGJ5IDQwMHB4IGhpZ2guXG4gICAgICogbWFwLmxvYWRJbWFnZSgnaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy84Lzg5L0JsYWNrX2FuZF9XaGl0ZV9Cb3hlZF8lMjhib3JkZXJlZCUyOS5wbmcnLCAoZXJyb3IsIGltYWdlKSA9PiB7XG4gICAgICogICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG4gICAgICogICAgIGlmICghbWFwLmhhc0ltYWdlKCdib3JkZXItaW1hZ2UnKSkge1xuICAgICAqICAgICAgICAgbWFwLmFkZEltYWdlKCdib3JkZXItaW1hZ2UnLCBpbWFnZSwge1xuICAgICAqICAgICAgICAgICAgIGNvbnRlbnQ6IFsxNiwgMTYsIDMwMCwgMzg0XSwgLy8gcGxhY2UgdGV4dCBvdmVyIGxlZnQgaGFsZiBvZiBpbWFnZSwgYXZvaWRpbmcgdGhlIDE2cHggYm9yZGVyXG4gICAgICogICAgICAgICAgICAgc3RyZXRjaFg6IFtbMTYsIDU4NF1dLCAvLyBzdHJldGNoIGV2ZXJ5dGhpbmcgaG9yaXpvbnRhbGx5IGV4Y2VwdCB0aGUgMTZweCBib3JkZXJcbiAgICAgKiAgICAgICAgICAgICBzdHJldGNoWTogW1sxNiwgMzg0XV0sIC8vIHN0cmV0Y2ggZXZlcnl0aGluZyB2ZXJ0aWNhbGx5IGV4Y2VwdCB0aGUgMTZweCBib3JkZXJcbiAgICAgKiAgICAgICAgIH0pO1xuICAgICAqICAgICB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKlxuICAgICAqIEBzZWUgRXhhbXBsZTogVXNlIGBIVE1MSW1hZ2VFbGVtZW50YDogW0FkZCBhbiBpY29uIHRvIHRoZSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWltYWdlLylcbiAgICAgKiBAc2VlIEV4YW1wbGU6IFVzZSBgSW1hZ2VEYXRhYDogW0FkZCBhIGdlbmVyYXRlZCBpY29uIHRvIHRoZSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWltYWdlLWdlbmVyYXRlZC8pXG4gICAgICovXG4gICAgYWRkSW1hZ2UoaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICBpbWFnZTogSFRNTEltYWdlRWxlbWVudCB8IEltYWdlQml0bWFwIHwgSW1hZ2VEYXRhIHwge3dpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXl9IHwgU3R5bGVJbWFnZUludGVyZmFjZSxcbiAgICAgICAgICAgICB7cGl4ZWxSYXRpbyA9IDEsIHNkZiA9IGZhbHNlLCBzdHJldGNoWCwgc3RyZXRjaFksIGNvbnRlbnR9OiAkU2hhcGU8U3R5bGVJbWFnZU1ldGFkYXRhPiA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gMDtcblxuICAgICAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IChJbWFnZUJpdG1hcCAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwKSkge1xuICAgICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIGRhdGF9ID0gYnJvd3Nlci5nZXRJbWFnZURhdGEoaW1hZ2UpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5hZGRJbWFnZShpZCwge2RhdGE6IG5ldyBSR0JBSW1hZ2Uoe3dpZHRoLCBoZWlnaHR9LCBkYXRhKSwgcGl4ZWxSYXRpbywgc3RyZXRjaFgsIHN0cmV0Y2hZLCBjb250ZW50LCBzZGYsIHZlcnNpb259KTtcbiAgICAgICAgfSBlbHNlIGlmIChpbWFnZS53aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGltYWdlLmhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMgdG8gbWFwLmFkZEltYWdlKCkuIFRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCBgSW1hZ2VCaXRtYXBgLCAnICtcbiAgICAgICAgICAgICAgICAnb3Igb2JqZWN0IHdpdGggYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgZGF0YWAgcHJvcGVydGllcyB3aXRoIHRoZSBzYW1lIGZvcm1hdCBhcyBgSW1hZ2VEYXRhYCcpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodCwgZGF0YX0gPSBpbWFnZTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJJbWFnZSA9ICgoaW1hZ2U6IGFueSk6IFN0eWxlSW1hZ2VJbnRlcmZhY2UpO1xuXG4gICAgICAgICAgICB0aGlzLnN0eWxlLmFkZEltYWdlKGlkLCB7XG4gICAgICAgICAgICAgICAgZGF0YTogbmV3IFJHQkFJbWFnZSh7d2lkdGgsIGhlaWdodH0sIG5ldyBVaW50OEFycmF5KGRhdGEpKSxcbiAgICAgICAgICAgICAgICBwaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgIHN0cmV0Y2hYLFxuICAgICAgICAgICAgICAgIHN0cmV0Y2hZLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgc2RmLFxuICAgICAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICAgICAgdXNlckltYWdlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHVzZXJJbWFnZS5vbkFkZCkge1xuICAgICAgICAgICAgICAgIHVzZXJJbWFnZS5vbkFkZCh0aGlzLCBpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIGV4aXN0aW5nIGltYWdlIGluIGEgc3R5bGUuIFRoaXMgaW1hZ2UgY2FuIGJlIGRpc3BsYXllZCBvbiB0aGUgbWFwIGxpa2UgYW55IG90aGVyIGljb24gaW4gdGhlIHN0eWxlJ3NcbiAgICAgKiBbc3ByaXRlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L3Nwcml0ZS8pIHVzaW5nIHRoZSBpbWFnZSdzIElEIHdpdGhcbiAgICAgKiBbYGljb24taW1hZ2VgXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jbGF5b3V0LXN5bWJvbC1pY29uLWltYWdlKSxcbiAgICAgKiBbYGJhY2tncm91bmQtcGF0dGVybmBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNwYWludC1iYWNrZ3JvdW5kLWJhY2tncm91bmQtcGF0dGVybiksXG4gICAgICogW2BmaWxsLXBhdHRlcm5gXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jcGFpbnQtZmlsbC1maWxsLXBhdHRlcm4pLFxuICAgICAqIG9yIFtgbGluZS1wYXR0ZXJuYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI3BhaW50LWxpbmUtbGluZS1wYXR0ZXJuKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIGltYWdlLlxuICAgICAqIEBwYXJhbSB7SFRNTEltYWdlRWxlbWVudCB8IEltYWdlQml0bWFwIHwgSW1hZ2VEYXRhIHwge3dpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBkYXRhOiAoVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5KX0gfCBTdHlsZUltYWdlSW50ZXJmYWNlfSBpbWFnZSBUaGUgaW1hZ2UgYXMgYW4gYEhUTUxJbWFnZUVsZW1lbnRgLCBgSW1hZ2VEYXRhYCwgYEltYWdlQml0bWFwYCBvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYFxuICAgICAqIHByb3BlcnRpZXMgd2l0aCB0aGUgc2FtZSBmb3JtYXQgYXMgYEltYWdlRGF0YWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIElmIGFuIGltYWdlIHdpdGggdGhlIElEICdjYXQnIGFscmVhZHkgZXhpc3RzIGluIHRoZSBzdHlsZSdzIHNwcml0ZSxcbiAgICAgKiAvLyByZXBsYWNlIHRoYXQgaW1hZ2Ugd2l0aCBhIG5ldyBpbWFnZSwgJ290aGVyLWNhdC1pY29uLnBuZycuXG4gICAgICogaWYgKG1hcC5oYXNJbWFnZSgnY2F0JykpIG1hcC51cGRhdGVJbWFnZSgnY2F0JywgJy4vb3RoZXItY2F0LWljb24ucG5nJyk7XG4gICAgICovXG4gICAgdXBkYXRlSW1hZ2UoaWQ6IHN0cmluZyxcbiAgICAgICAgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgfCBJbWFnZUJpdG1hcCB8IEltYWdlRGF0YSB8IHt3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZGF0YTogVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5fSB8IFN0eWxlSW1hZ2VJbnRlcmZhY2UpIHtcblxuICAgICAgICBjb25zdCBleGlzdGluZ0ltYWdlID0gdGhpcy5zdHlsZS5nZXRJbWFnZShpZCk7XG4gICAgICAgIGlmICghZXhpc3RpbmdJbWFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJ1RoZSBtYXAgaGFzIG5vIGltYWdlIHdpdGggdGhhdCBpZC4gSWYgeW91IGFyZSBhZGRpbmcgYSBuZXcgaW1hZ2UgdXNlIGBtYXAuYWRkSW1hZ2UoLi4uKWAgaW5zdGVhZC4nKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IChpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHwgKEltYWdlQml0bWFwICYmIGltYWdlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApKSA/IGJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGltYWdlKSA6IGltYWdlO1xuICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodCwgZGF0YX0gPSBpbWFnZURhdGE7XG5cbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQgfHwgaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyB0byBtYXAudXBkYXRlSW1hZ2UoKS4gVGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGFuIGBIVE1MSW1hZ2VFbGVtZW50YCwgYEltYWdlRGF0YWAsIGBJbWFnZUJpdG1hcGAsICcgK1xuICAgICAgICAgICAgICAgICdvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgJykpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3aWR0aCAhPT0gZXhpc3RpbmdJbWFnZS5kYXRhLndpZHRoIHx8IGhlaWdodCAhPT0gZXhpc3RpbmdJbWFnZS5kYXRhLmhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJ1RoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSB1cGRhdGVkIGltYWdlIG11c3QgYmUgdGhhdCBzYW1lIGFzIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBpbWFnZScpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3B5ID0gIShpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHwgKEltYWdlQml0bWFwICYmIGltYWdlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApKTtcbiAgICAgICAgZXhpc3RpbmdJbWFnZS5kYXRhLnJlcGxhY2UoZGF0YSwgY29weSk7XG5cbiAgICAgICAgdGhpcy5zdHlsZS51cGRhdGVJbWFnZShpZCwgZXhpc3RpbmdJbWFnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgd2hldGhlciBvciBub3QgYW4gaW1hZ2Ugd2l0aCBhIHNwZWNpZmljIElEIGV4aXN0cyBpbiB0aGUgc3R5bGUuIFRoaXMgY2hlY2tzIGJvdGggaW1hZ2VzXG4gICAgICogaW4gdGhlIHN0eWxlJ3Mgb3JpZ2luYWwgW3Nwcml0ZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9zcHJpdGUvKSBhbmQgYW55IGltYWdlc1xuICAgICAqIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGF0IHJ1bnRpbWUgdXNpbmcge0BsaW5rIE1hcCNhZGRJbWFnZX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBpbWFnZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbWFnZSBleGlzdHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBDaGVjayBpZiBhbiBpbWFnZSB3aXRoIHRoZSBJRCAnY2F0JyBleGlzdHMgaW5cbiAgICAgKiAvLyB0aGUgc3R5bGUncyBzcHJpdGUuXG4gICAgICogY29uc3QgY2F0SWNvbkV4aXN0cyA9IG1hcC5oYXNJbWFnZSgnY2F0Jyk7XG4gICAgICovXG4gICAgaGFzSW1hZ2UoaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIGltYWdlIGlkJykpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhIXRoaXMuc3R5bGUuZ2V0SW1hZ2UoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhbiBpbWFnZSBmcm9tIGEgc3R5bGUuIFRoaXMgY2FuIGJlIGFuIGltYWdlIGZyb20gdGhlIHN0eWxlJ3Mgb3JpZ2luYWxcbiAgICAgKiBbc3ByaXRlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L3Nwcml0ZS8pIG9yIGFueSBpbWFnZXNcbiAgICAgKiB0aGF0IGhhdmUgYmVlbiBhZGRlZCBhdCBydW50aW1lIHVzaW5nIHtAbGluayBNYXAjYWRkSW1hZ2V9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgaW1hZ2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIElmIGFuIGltYWdlIHdpdGggdGhlIElEICdjYXQnIGV4aXN0cyBpblxuICAgICAqIC8vIHRoZSBzdHlsZSdzIHNwcml0ZSwgcmVtb3ZlIGl0LlxuICAgICAqIGlmIChtYXAuaGFzSW1hZ2UoJ2NhdCcpKSBtYXAucmVtb3ZlSW1hZ2UoJ2NhdCcpO1xuICAgICAqL1xuICAgIHJlbW92ZUltYWdlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVJbWFnZShpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhbiBpbWFnZSBmcm9tIGFuIGV4dGVybmFsIFVSTCB0byBiZSB1c2VkIHdpdGgge0BsaW5rIE1hcCNhZGRJbWFnZX0uIEV4dGVybmFsXG4gICAgICogZG9tYWlucyBtdXN0IHN1cHBvcnQgW0NPUlNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQWNjZXNzX2NvbnRyb2xfQ09SUykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgb2YgdGhlIGltYWdlIGZpbGUuIEltYWdlIGZpbGUgbXVzdCBiZSBpbiBwbmcsIHdlYnAsIG9yIGpwZyBmb3JtYXQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgRXhwZWN0aW5nIGBjYWxsYmFjayhlcnJvciwgZGF0YSlgLiBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgaGFzIGxvYWRlZCBvciB3aXRoIGFuIGVycm9yIGFyZ3VtZW50IGlmIHRoZXJlIGlzIGFuIGVycm9yLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBMb2FkIGFuIGltYWdlIGZyb20gYW4gZXh0ZXJuYWwgVVJMLlxuICAgICAqIG1hcC5sb2FkSW1hZ2UoJ2h0dHA6Ly9wbGFjZWtpdHRlbi5jb20vNTAvNTAnLCAoZXJyb3IsIGltYWdlKSA9PiB7XG4gICAgICogICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG4gICAgICogICAgIC8vIEFkZCB0aGUgbG9hZGVkIGltYWdlIHRvIHRoZSBzdHlsZSdzIHNwcml0ZSB3aXRoIHRoZSBJRCAna2l0dGVuJy5cbiAgICAgKiAgICAgbWFwLmFkZEltYWdlKCdraXR0ZW4nLCBpbWFnZSk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBZGQgYW4gaWNvbiB0byB0aGUgbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS8pXG4gICAgICovXG4gICAgbG9hZEltYWdlKHVybDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgZ2V0SW1hZ2UodGhpcy5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5JbWFnZSksIChlcnIsIGltZykgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBpbWcgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50ID8gYnJvd3Nlci5nZXRJbWFnZURhdGEoaW1nKSA6IGltZyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyBhbiBBcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIElEcyBvZiBhbGwgaW1hZ2VzIGN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIG1hcC5cbiAgICAqIFRoaXMgaW5jbHVkZXMgYm90aCBpbWFnZXMgZnJvbSB0aGUgc3R5bGUncyBvcmlnaW5hbCBbc3ByaXRlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L3Nwcml0ZS8pXG4gICAgKiBhbmQgYW55IGltYWdlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCBhdCBydW50aW1lIHVzaW5nIHtAbGluayBNYXAjYWRkSW1hZ2V9LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBBcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCBzcHJpdGVzL2ltYWdlcyBjdXJyZW50bHkgYXZhaWxhYmxlIGluIHRoZSBtYXAuXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICAqIGNvbnN0IGFsbEltYWdlcyA9IG1hcC5saXN0SW1hZ2VzKCk7XG4gICAgKlxuICAgICovXG4gICAgbGlzdEltYWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUubGlzdEltYWdlcygpO1xuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7TGF5ZXJzfSAqL1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIFtNYXBib3ggc3R5bGUgbGF5ZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNsYXllcnMpXG4gICAgICogdG8gdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQSBsYXllciBkZWZpbmVzIGhvdyBkYXRhIGZyb20gYSBzcGVjaWZpZWQgc291cmNlIHdpbGwgYmUgc3R5bGVkLiBSZWFkIG1vcmUgYWJvdXQgbGF5ZXIgdHlwZXNcbiAgICAgKiBhbmQgYXZhaWxhYmxlIHBhaW50IGFuZCBsYXlvdXQgcHJvcGVydGllcyBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jbGF5ZXJzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgQ3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGxheWVyIFRoZSBsYXllciB0byBhZGQsIGNvbmZvcm1pbmcgdG8gZWl0aGVyIHRoZSBNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbidzIFtsYXllciBkZWZpbml0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jbGF5ZXJzKSBvciwgbGVzcyBjb21tb25seSwgdGhlIHtAbGluayBDdXN0b21MYXllckludGVyZmFjZX0gc3BlY2lmaWNhdGlvbi5cbiAgICAgKiBUaGUgTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24ncyBsYXllciBkZWZpbml0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciBtb3N0IGxheWVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllci5pZCBBIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgeW91IGRlZmluZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXIudHlwZSBUaGUgdHlwZSBvZiBsYXllciAoZm9yIGV4YW1wbGUgYGZpbGxgIG9yIGBzeW1ib2xgKS5cbiAgICAgKiBBIGxpc3Qgb2YgbGF5ZXIgdHlwZXMgaXMgYXZhaWxhYmxlIGluIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL2xheWVycy8jdHlwZSkuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIGBjdXN0b21gLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHtAbGluayBDdXN0b21MYXllckludGVyZmFjZX0uXG4gICAgICogQHBhcmFtIHtzdHJpbmcgfCBPYmplY3R9IFtsYXllci5zb3VyY2VdIFRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlIGxheWVyLlxuICAgICAqIFJlZmVyZW5jZSBhIHNvdXJjZSB0aGF0IGhhcyBfYWxyZWFkeSBiZWVuIGRlZmluZWRfIHVzaW5nIHRoZSBzb3VyY2UncyB1bmlxdWUgaWQuXG4gICAgICogUmVmZXJlbmNlIGEgX25ldyBzb3VyY2VfIHVzaW5nIGEgc291cmNlIG9iamVjdCAoYXMgZGVmaW5lZCBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9zb3VyY2VzLykpIGRpcmVjdGx5LlxuICAgICAqIFRoaXMgaXMgKipyZXF1aXJlZCoqIGZvciBhbGwgYGxheWVyLnR5cGVgIG9wdGlvbnMgX2V4Y2VwdF8gZm9yIGBjdXN0b21gIGFuZCBgYmFja2dyb3VuZGAuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtsYXllci5zb3VyY2VMYXllcl0gKG9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgW3NvdXJjZSBsYXllcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9zb3VyY2UtbGF5ZXIvKSB3aXRoaW4gdGhlIHNwZWNpZmllZCBgbGF5ZXIuc291cmNlYCB0byB1c2UgZm9yIHRoaXMgc3R5bGUgbGF5ZXIuXG4gICAgICogVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIHZlY3RvciB0aWxlIHNvdXJjZXMgYW5kIGlzICoqcmVxdWlyZWQqKiB3aGVuIGBsYXllci5zb3VyY2VgIGlzIG9mIHRoZSB0eXBlIGB2ZWN0b3JgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtsYXllci5maWx0ZXJdIChvcHRpb25hbCkgQW4gZXhwcmVzc2lvbiBzcGVjaWZ5aW5nIGNvbmRpdGlvbnMgb24gc291cmNlIGZlYXR1cmVzLlxuICAgICAqIE9ubHkgZmVhdHVyZXMgdGhhdCBtYXRjaCB0aGUgZmlsdGVyIGFyZSBkaXNwbGF5ZWQuXG4gICAgICogVGhlIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uIGluY2x1ZGVzIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGxpbWl0YXRpb25zIG9mIHRoZSBbYGZpbHRlcmBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL2xheWVycy8jZmlsdGVyKSBwYXJhbWV0ZXJcbiAgICAgKiBhbmQgYSBjb21wbGV0ZSBsaXN0IG9mIGF2YWlsYWJsZSBbZXhwcmVzc2lvbnNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL2V4cHJlc3Npb25zLykuXG4gICAgICogSWYgbm8gZmlsdGVyIGlzIHByb3ZpZGVkLCBhbGwgZmVhdHVyZXMgaW4gdGhlIHNvdXJjZSAob3Igc291cmNlIGxheWVyIGZvciB2ZWN0b3IgdGlsZXNldHMpIHdpbGwgYmUgZGlzcGxheWVkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbbGF5ZXIucGFpbnRdIChvcHRpb25hbCkgUGFpbnQgcHJvcGVydGllcyBmb3IgdGhlIGxheWVyLlxuICAgICAqIEF2YWlsYWJsZSBwYWludCBwcm9wZXJ0aWVzIHZhcnkgYnkgYGxheWVyLnR5cGVgLlxuICAgICAqIEEgZnVsbCBsaXN0IG9mIHBhaW50IHByb3BlcnRpZXMgZm9yIGVhY2ggbGF5ZXIgdHlwZSBpcyBhdmFpbGFibGUgaW4gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvbGF5ZXJzLykuXG4gICAgICogSWYgbm8gcGFpbnQgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkLCBkZWZhdWx0IHZhbHVlcyB3aWxsIGJlIHVzZWQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtsYXllci5sYXlvdXRdIChvcHRpb25hbCkgTGF5b3V0IHByb3BlcnRpZXMgZm9yIHRoZSBsYXllci5cbiAgICAgKiBBdmFpbGFibGUgbGF5b3V0IHByb3BlcnRpZXMgdmFyeSBieSBgbGF5ZXIudHlwZWAuXG4gICAgICogQSBmdWxsIGxpc3Qgb2YgbGF5b3V0IHByb3BlcnRpZXMgZm9yIGVhY2ggbGF5ZXIgdHlwZSBpcyBhdmFpbGFibGUgaW4gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvbGF5ZXJzLykuXG4gICAgICogSWYgbm8gbGF5b3V0IHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCwgZGVmYXVsdCB2YWx1ZXMgd2lsbCBiZSB1c2VkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGF5ZXIubWF4em9vbV0gKG9wdGlvbmFsKSBUaGUgbWF4aW11bSB6b29tIGxldmVsIGZvciB0aGUgbGF5ZXIuXG4gICAgICogQXQgem9vbSBsZXZlbHMgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHRoZSBtYXh6b29tLCB0aGUgbGF5ZXIgd2lsbCBiZSBoaWRkZW4uXG4gICAgICogVGhlIHZhbHVlIGNhbiBiZSBhbnkgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCBgMjRgIChpbmNsdXNpdmUpLlxuICAgICAqIElmIG5vIG1heHpvb20gaXMgcHJvdmlkZWQsIHRoZSBsYXllciB3aWxsIGJlIHZpc2libGUgYXQgYWxsIHpvb20gbGV2ZWxzIGZvciB3aGljaCB0aGVyZSBhcmUgdGlsZXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGF5ZXIubWluem9vbV0gKG9wdGlvbmFsKSBUaGUgbWluaW11bSB6b29tIGxldmVsIGZvciB0aGUgbGF5ZXIuXG4gICAgICogQXQgem9vbSBsZXZlbHMgbGVzcyB0aGFuIHRoZSBtaW56b29tLCB0aGUgbGF5ZXIgd2lsbCBiZSBoaWRkZW4uXG4gICAgICogVGhlIHZhbHVlIGNhbiBiZSBhbnkgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCBgMjRgIChpbmNsdXNpdmUpLlxuICAgICAqIElmIG5vIG1pbnpvb20gaXMgcHJvdmlkZWQsIHRoZSBsYXllciB3aWxsIGJlIHZpc2libGUgYXQgYWxsIHpvb20gbGV2ZWxzIGZvciB3aGljaCB0aGVyZSBhcmUgdGlsZXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbbGF5ZXIubWV0YWRhdGFdIChvcHRpb25hbCkgQXJiaXRyYXJ5IHByb3BlcnRpZXMgdXNlZnVsIHRvIHRyYWNrIHdpdGggdGhlIGxheWVyLCBidXQgZG8gbm90IGluZmx1ZW5jZSByZW5kZXJpbmcuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtsYXllci5yZW5kZXJpbmdNb2RlXSBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgbGF5ZXJzIHdpdGggdGhlIHR5cGUgYGN1c3RvbWAuXG4gICAgICogU2VlIHtAbGluayBDdXN0b21MYXllckludGVyZmFjZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtiZWZvcmVJZF0gVGhlIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCB0aGUgbmV3IGxheWVyIGJlZm9yZSxcbiAgICAgKiByZXN1bHRpbmcgaW4gdGhlIG5ldyBsYXllciBhcHBlYXJpbmcgdmlzdWFsbHkgYmVuZWF0aCB0aGUgZXhpc3RpbmcgbGF5ZXIuXG4gICAgICogSWYgdGhpcyBhcmd1bWVudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbGF5ZXIgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBsYXllcnMgYXJyYXlcbiAgICAgKiBhbmQgYXBwZWFyIHZpc3VhbGx5IGFib3ZlIGFsbCBvdGhlciBsYXllcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBBZGQgYSBjaXJjbGUgbGF5ZXIgd2l0aCBhIHZlY3RvciBzb3VyY2VcbiAgICAgKiBtYXAuYWRkTGF5ZXIoe1xuICAgICAqICAgICBpZDogJ3BvaW50cy1vZi1pbnRlcmVzdCcsXG4gICAgICogICAgIHNvdXJjZToge1xuICAgICAqICAgICAgICAgdHlwZTogJ3ZlY3RvcicsXG4gICAgICogICAgICAgICB1cmw6ICdtYXBib3g6Ly9tYXBib3gubWFwYm94LXN0cmVldHMtdjgnXG4gICAgICogICAgIH0sXG4gICAgICogICAgICdzb3VyY2UtbGF5ZXInOiAncG9pX2xhYmVsJyxcbiAgICAgKiAgICAgdHlwZTogJ2NpcmNsZScsXG4gICAgICogICAgIHBhaW50OiB7XG4gICAgICogICAgIC8vIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uIHBhaW50IHByb3BlcnRpZXNcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgbGF5b3V0OiB7XG4gICAgICogICAgIC8vIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uIGxheW91dCBwcm9wZXJ0aWVzXG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gRGVmaW5lIGEgc291cmNlIGJlZm9yZSB1c2luZyBpdCB0byBjcmVhdGUgYSBuZXcgbGF5ZXJcbiAgICAgKiBtYXAuYWRkU291cmNlKCdzdGF0ZS1kYXRhJywge1xuICAgICAqICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICogICAgIGRhdGE6ICdwYXRoL3RvL2RhdGEuZ2VvanNvbidcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIG1hcC5hZGRMYXllcih7XG4gICAgICogICAgIGlkOiAnc3RhdGVzJyxcbiAgICAgKiAgICAgLy8gUmVmZXJlbmNlcyB0aGUgR2VvSlNPTiBzb3VyY2UgZGVmaW5lZCBhYm92ZVxuICAgICAqICAgICAvLyBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIGBzb3VyY2UtbGF5ZXJgXG4gICAgICogICAgIHNvdXJjZTogJ3N0YXRlLWRhdGEnLFxuICAgICAqICAgICB0eXBlOiAnc3ltYm9sJyxcbiAgICAgKiAgICAgbGF5b3V0OiB7XG4gICAgICogICAgICAgICAvLyBTZXQgdGhlIGxhYmVsIGNvbnRlbnQgdG8gdGhlXG4gICAgICogICAgICAgICAvLyBmZWF0dXJlJ3MgYG5hbWVgIHByb3BlcnR5XG4gICAgICogICAgICAgICAndGV4dC1maWVsZCc6IFsnZ2V0JywgJ25hbWUnXVxuICAgICAqICAgICB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEFkZCBhIG5ldyBzeW1ib2wgbGF5ZXIgYmVmb3JlIGFuIGV4aXN0aW5nIGxheWVyXG4gICAgICogbWFwLmFkZExheWVyKHtcbiAgICAgKiAgICAgaWQ6ICdzdGF0ZXMnLFxuICAgICAqICAgICAvLyBSZWZlcmVuY2VzIGEgc291cmNlIHRoYXQncyBhbHJlYWR5IGJlZW4gZGVmaW5lZFxuICAgICAqICAgICBzb3VyY2U6ICdzdGF0ZS1kYXRhJyxcbiAgICAgKiAgICAgdHlwZTogJ3N5bWJvbCcsXG4gICAgICogICAgIGxheW91dDoge1xuICAgICAqICAgICAgICAgLy8gU2V0IHRoZSBsYWJlbCBjb250ZW50IHRvIHRoZVxuICAgICAqICAgICAgICAgLy8gZmVhdHVyZSdzIGBuYW1lYCBwcm9wZXJ0eVxuICAgICAqICAgICAgICAgJ3RleHQtZmllbGQnOiBbJ2dldCcsICduYW1lJ11cbiAgICAgKiAgICAgfVxuICAgICAqIC8vIEFkZCB0aGUgbGF5ZXIgYmVmb3JlIHRoZSBleGlzdGluZyBgY2l0aWVzYCBsYXllclxuICAgICAqIH0sICdjaXRpZXMnKTtcbiAgICAgKlxuICAgICAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhbmQgc3R5bGUgY2x1c3RlcnNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NsdXN0ZXIvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEFkZCBhIHZlY3RvciB0aWxlIHNvdXJjZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdmVjdG9yLXNvdXJjZS8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQWRkIGEgV01TIHNvdXJjZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvd21zLylcbiAgICAgKi9cbiAgICBhZGRMYXllcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uIHwgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UsIGJlZm9yZUlkPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpO1xuICAgICAgICB0aGlzLnN0eWxlLmFkZExheWVyKGxheWVyLCBiZWZvcmVJZCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSBsYXllciB0byBhIGRpZmZlcmVudCB6LXBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gbW92ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZUlkXSBUaGUgSUQgb2YgYW4gZXhpc3RpbmcgbGF5ZXIgdG8gaW5zZXJ0IHRoZSBuZXcgbGF5ZXIgYmVmb3JlLiBXaGVuIHZpZXdpbmcgdGhlIG1hcCwgdGhlIGBpZGAgbGF5ZXIgd2lsbCBhcHBlYXIgYmVuZWF0aCB0aGUgYGJlZm9yZUlkYCBsYXllci4gSWYgYGJlZm9yZUlkYCBpcyBvbWl0dGVkLCB0aGUgbGF5ZXIgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBsYXllcnMgYXJyYXkgYW5kIGFwcGVhciBhYm92ZSBhbGwgb3RoZXIgbGF5ZXJzIG9uIHRoZSBtYXAuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gTW92ZSBhIGxheWVyIHdpdGggSUQgJ3BvbHlnb24nIGJlZm9yZSB0aGUgbGF5ZXIgd2l0aCBJRCAnY291bnRyeS1sYWJlbCcuIFRoZSBgcG9seWdvbmAgbGF5ZXIgd2lsbCBhcHBlYXIgYmVuZWF0aCB0aGUgYGNvdW50cnktbGFiZWxgIGxheWVyIG9uIHRoZSBtYXAuXG4gICAgICogbWFwLm1vdmVMYXllcigncG9seWdvbicsICdjb3VudHJ5LWxhYmVsJyk7XG4gICAgICovXG4gICAgbW92ZUxheWVyKGlkOiBzdHJpbmcsIGJlZm9yZUlkPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3R5bGUubW92ZUxheWVyKGlkLCBiZWZvcmVJZCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBJZiBubyBzdWNoIGxheWVyIGV4aXN0cywgYW4gYGVycm9yYCBldmVudCBpcyBmaXJlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBJRCBvZiB0aGUgbGF5ZXIgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDplcnJvclxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJZiBhIGxheWVyIHdpdGggSUQgJ3N0YXRlLWRhdGEnIGV4aXN0cywgcmVtb3ZlIGl0LlxuICAgICAqIGlmIChtYXAuZ2V0TGF5ZXIoJ3N0YXRlLWRhdGEnKSkgbWFwLnJlbW92ZUxheWVyKCdzdGF0ZS1kYXRhJyk7XG4gICAgICovXG4gICAgcmVtb3ZlTGF5ZXIoaWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZUxheWVyKGlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsYXllciB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgaW4gdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHs/T2JqZWN0fSBUaGUgbGF5ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIElELCBvciBgdW5kZWZpbmVkYFxuICAgICAqICAgaWYgdGhlIElEIGNvcnJlc3BvbmRzIHRvIG5vIGV4aXN0aW5nIGxheWVycy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgc3RhdGVEYXRhTGF5ZXIgPSBtYXAuZ2V0TGF5ZXIoJ3N0YXRlLWRhdGEnKTtcbiAgICAgKlxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEZpbHRlciBzeW1ib2xzIGJ5IHRvZ2dsaW5nIGEgbGlzdF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItbWFya2Vycy8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRmlsdGVyIHN5bWJvbHMgYnkgdGV4dCBpbnB1dF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItbWFya2Vycy1ieS1pbnB1dC8pXG4gICAgICovXG4gICAgZ2V0TGF5ZXIoaWQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXllcihpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgem9vbSBleHRlbnQgZm9yIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuIFRoZSB6b29tIGV4dGVudCBpbmNsdWRlcyB0aGVcbiAgICAgKiBbbWluaW11bSB6b29tIGxldmVsXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jbGF5ZXItbWluem9vbSlcbiAgICAgKiBhbmQgW21heGltdW0gem9vbSBsZXZlbF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI2xheWVyLW1heHpvb20pKVxuICAgICAqIGF0IHdoaWNoIHRoZSBsYXllciB3aWxsIGJlIHJlbmRlcmVkLlxuICAgICAqXG4gICAgICogTm90ZTogRm9yIHN0eWxlIGxheWVycyB1c2luZyB2ZWN0b3Igc291cmNlcywgc3R5bGUgbGF5ZXJzIGNhbm5vdCBiZSByZW5kZXJlZCBhdCB6b29tIGxldmVscyBsb3dlciB0aGFuIHRoZVxuICAgICAqIG1pbmltdW0gem9vbSBsZXZlbCBvZiB0aGUgX3NvdXJjZSBsYXllcl8gYmVjYXVzZSB0aGUgZGF0YSBkb2VzIG5vdCBleGlzdCBhdCB0aG9zZSB6b29tIGxldmVscy4gSWYgdGhlIG1pbmltdW1cbiAgICAgKiB6b29tIGxldmVsIG9mIHRoZSBzb3VyY2UgbGF5ZXIgaXMgaGlnaGVyIHRoYW4gdGhlIG1pbmltdW0gem9vbSBsZXZlbCBkZWZpbmVkIGluIHRoZSBzdHlsZSBsYXllciwgdGhlIHN0eWxlXG4gICAgICogbGF5ZXIgd2lsbCBub3QgYmUgcmVuZGVyZWQgYXQgYWxsIHpvb20gbGV2ZWxzIGluIHRoZSB6b29tIHJhbmdlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byB3aGljaCB0aGUgem9vbSBleHRlbnQgd2lsbCBiZSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW56b29tIFRoZSBtaW5pbXVtIHpvb20gdG8gc2V0ICgwLTI0KS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4em9vbSBUaGUgbWF4aW11bSB6b29tIHRvIHNldCAoMC0yNCkuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldExheWVyWm9vbVJhbmdlKCdteS1sYXllcicsIDIsIDUpO1xuICAgICAqXG4gICAgICovXG4gICAgc2V0TGF5ZXJab29tUmFuZ2UobGF5ZXJJZDogc3RyaW5nLCBtaW56b29tOiBudW1iZXIsIG1heHpvb206IG51bWJlcikge1xuICAgICAgICB0aGlzLnN0eWxlLnNldExheWVyWm9vbVJhbmdlKGxheWVySWQsIG1pbnpvb20sIG1heHpvb20pO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZpbHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEZpbHRlcnMgY29udHJvbCB3aGljaCBmZWF0dXJlcyBhIHN0eWxlIGxheWVyIHJlbmRlcnMgZnJvbSBpdHMgc291cmNlLlxuICAgICAqIEFueSBmZWF0dXJlIGZvciB3aGljaCB0aGUgZmlsdGVyIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGB0cnVlYCB3aWxsIGJlXG4gICAgICogcmVuZGVyZWQgb24gdGhlIG1hcC4gVGhvc2UgdGhhdCBhcmUgZmFsc2Ugd2lsbCBiZSBoaWRkZW4uXG4gICAgICpcbiAgICAgKiBVc2UgYHNldEZpbHRlcmAgdG8gc2hvdyBhIHN1YnNldCBvZiB5b3VyIHNvdXJjZSBkYXRhLlxuICAgICAqXG4gICAgICogVG8gY2xlYXIgdGhlIGZpbHRlciwgcGFzcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHdoaWNoIHRoZSBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXkgfCBudWxsIHwgdW5kZWZpbmVkfSBmaWx0ZXIgVGhlIGZpbHRlciwgY29uZm9ybWluZyB0byB0aGUgTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24nc1xuICAgICAqICAgW2ZpbHRlciBkZWZpbml0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9sYXllcnMvI2ZpbHRlcikuICBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIGFueSBleGlzdGluZyBmaWx0ZXIgZnJvbSB0aGUgbGF5ZXIuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnZhbGlkYXRlPXRydWVdIFdoZXRoZXIgdG8gY2hlY2sgaWYgdGhlIGZpbHRlciBjb25mb3JtcyB0byB0aGUgTWFwYm94IEdMIFN0eWxlIFNwZWNpZmljYXRpb24uIERpc2FibGluZyB2YWxpZGF0aW9uIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgaGF2ZSBwcmV2aW91c2x5IHZhbGlkYXRlZCB0aGUgdmFsdWVzIHlvdSB3aWxsIGJlIHBhc3NpbmcgdG8gdGhpcyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBkaXNwbGF5IG9ubHkgZmVhdHVyZXMgd2l0aCB0aGUgJ25hbWUnIHByb3BlcnR5ICdVU0EnXG4gICAgICogbWFwLnNldEZpbHRlcignbXktbGF5ZXInLCBbJz09JywgWydnZXQnLCAnbmFtZSddLCAnVVNBJ10pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gZGlzcGxheSBvbmx5IGZlYXR1cmVzIHdpdGggZml2ZSBvciBtb3JlICdhdmFpbGFibGUtc3BvdHMnXG4gICAgICogbWFwLnNldEZpbHRlcignYmlrZS1kb2NrcycsIFsnPj0nLCBbJ2dldCcsICdhdmFpbGFibGUtc3BvdHMnXSwgNV0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gcmVtb3ZlIHRoZSBmaWx0ZXIgZm9yIHRoZSAnYmlrZS1kb2Nrcycgc3R5bGUgbGF5ZXJcbiAgICAgKiBtYXAuc2V0RmlsdGVyKCdiaWtlLWRvY2tzJywgbnVsbCk7XG4gICAgICpcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBGaWx0ZXIgZmVhdHVyZXMgd2l0aGluIG1hcCB2aWV3XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpbHRlci1mZWF0dXJlcy13aXRoaW4tbWFwLXZpZXcvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEhpZ2hsaWdodCBmZWF0dXJlcyBjb250YWluaW5nIHNpbWlsYXIgZGF0YV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9xdWVyeS1zaW1pbGFyLWZlYXR1cmVzLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSB0aW1lbGluZSBhbmltYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdGltZWxpbmUtYW5pbWF0aW9uLylcbiAgICAgKiBAc2VlIFtUdXRvcmlhbDogU2hvdyBjaGFuZ2VzIG92ZXIgdGltZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC90dXRvcmlhbHMvc2hvdy1jaGFuZ2VzLW92ZXItdGltZS8pXG4gICAgICovXG4gICAgc2V0RmlsdGVyKGxheWVySWQ6IHN0cmluZywgZmlsdGVyOiA/RmlsdGVyU3BlY2lmaWNhdGlvbiwgIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0RmlsdGVyKGxheWVySWQsIGZpbHRlciwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyIGFwcGxpZWQgdG8gdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiB0aGUgc3R5bGUgbGF5ZXIgd2hvc2UgZmlsdGVyIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBsYXllcidzIGZpbHRlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGZpbHRlciA9IG1hcC5nZXRGaWx0ZXIoJ215TGF5ZXInKTtcbiAgICAgKi9cbiAgICBnZXRGaWx0ZXIobGF5ZXJJZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldEZpbHRlcihsYXllcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHBhaW50IHByb3BlcnR5IGluIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHNldCB0aGUgcGFpbnQgcHJvcGVydHkgaW4uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBhaW50IHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcGFpbnQgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqICAgTXVzdCBiZSBvZiBhIHR5cGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm9wZXJ0eSwgYXMgZGVmaW5lZCBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLykuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnZhbGlkYXRlPXRydWVdIFdoZXRoZXIgdG8gY2hlY2sgaWYgYHZhbHVlYCBjb25mb3JtcyB0byB0aGUgTWFwYm94IEdMIFN0eWxlIFNwZWNpZmljYXRpb24uIERpc2FibGluZyB2YWxpZGF0aW9uIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgaGF2ZSBwcmV2aW91c2x5IHZhbGlkYXRlZCB0aGUgdmFsdWVzIHlvdSB3aWxsIGJlIHBhc3NpbmcgdG8gdGhpcyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldFBhaW50UHJvcGVydHkoJ215LWxheWVyJywgJ2ZpbGwtY29sb3InLCAnI2ZhYWZlZScpO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IENoYW5nZSBhIGxheWVyJ3MgY29sb3Igd2l0aCBidXR0b25zXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NvbG9yLXN3aXRjaGVyLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBZGp1c3QgYSBsYXllcidzIG9wYWNpdHldKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRqdXN0LWxheWVyLW9wYWNpdHkvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqL1xuICAgIHNldFBhaW50UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0UGFpbnRQcm9wZXJ0eShsYXllcklkLCBuYW1lLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBwYWludCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBnZXQgdGhlIHBhaW50IHByb3BlcnR5IGZyb20uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgYSBwYWludCBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhaW50IHByb3BlcnR5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgcGFpbnRQcm9wZXJ0eSA9IG1hcC5nZXRQYWludFByb3BlcnR5KCdteVN5bWJvbExheWVyJywgJ2ljb24tY29sb3InKTtcbiAgICAgKi9cbiAgICBnZXRQYWludFByb3BlcnR5KGxheWVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldFBhaW50UHJvcGVydHkobGF5ZXJJZCwgbmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBsYXlvdXQgcHJvcGVydHkgaW4gdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gc2V0IHRoZSBsYXlvdXQgcHJvcGVydHkgaW4uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eS4gTXVzdCBiZSBvZiBhIHR5cGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm9wZXJ0eSwgYXMgZGVmaW5lZCBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLykuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnZhbGlkYXRlPXRydWVdIFdoZXRoZXIgdG8gY2hlY2sgaWYgYHZhbHVlYCBjb25mb3JtcyB0byB0aGUgTWFwYm94IEdMIFN0eWxlIFNwZWNpZmljYXRpb24uIERpc2FibGluZyB2YWxpZGF0aW9uIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgaGF2ZSBwcmV2aW91c2x5IHZhbGlkYXRlZCB0aGUgdmFsdWVzIHlvdSB3aWxsIGJlIHBhc3NpbmcgdG8gdGhpcyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldExheW91dFByb3BlcnR5KCdteS1sYXllcicsICd2aXNpYmlsaXR5JywgJ25vbmUnKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBTaG93IGFuZCBoaWRlIGxheWVyc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdG9nZ2xlLWxheWVycy8pXG4gICAgICovXG4gICAgc2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZCwgbmFtZSwgdmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgbGF5b3V0IHByb3BlcnR5IGluIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIGdldCB0aGUgbGF5b3V0IHByb3BlcnR5IGZyb20uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGxheW91dCBwcm9wZXJ0eS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxheW91dFByb3BlcnR5ID0gbWFwLmdldExheW91dFByb3BlcnR5KCdteVN5bWJvbExheWVyJywgJ2ljb24tYW5jaG9yJyk7XG4gICAgICovXG4gICAgZ2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZCwgbmFtZSk7XG4gICAgfVxuXG4gICAgLyoqIEBzZWN0aW9uIHtTdHlsZSBwcm9wZXJ0aWVzfSAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYW55IGNvbWJpbmF0aW9uIG9mIGxpZ2h0IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsaWdodCBMaWdodCBwcm9wZXJ0aWVzIHRvIHNldC4gTXVzdCBjb25mb3JtIHRvIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI2xpZ2h0KS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudmFsaWRhdGU9dHJ1ZV0gV2hldGhlciB0byBjaGVjayBpZiB0aGUgZmlsdGVyIGNvbmZvcm1zIHRvIHRoZSBNYXBib3ggR0wgU3R5bGUgU3BlY2lmaWNhdGlvbi4gRGlzYWJsaW5nIHZhbGlkYXRpb24gaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBoYXZlIHByZXZpb3VzbHkgdmFsaWRhdGVkIHRoZSB2YWx1ZXMgeW91IHdpbGwgYmUgcGFzc2luZyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsYXllclZpc2liaWxpdHkgPSBtYXAuZ2V0TGF5b3V0UHJvcGVydHkoJ215LWxheWVyJywgJ3Zpc2liaWxpdHknKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBTaG93IGFuZCBoaWRlIGxheWVyc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdG9nZ2xlLWxheWVycy8pXG4gICAgICovXG4gICAgc2V0TGlnaHQobGlnaHQ6IExpZ2h0U3BlY2lmaWNhdGlvbiwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fbGF6eUluaXRFbXB0eVN0eWxlKCk7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGlnaHQobGlnaHQsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBsaWdodCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMaWdodCBwcm9wZXJ0aWVzIG9mIHRoZSBzdHlsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxpZ2h0ID0gbWFwLmdldExpZ2h0KCk7XG4gICAgICovXG4gICAgZ2V0TGlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldExpZ2h0KCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJuc1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRlcnJhaW4gcHJvcGVydHkgb2YgdGhlIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRlcnJhaW4gVGVycmFpbiBwcm9wZXJ0aWVzIHRvIHNldC4gTXVzdCBjb25mb3JtIHRvIHRoZSBbVGVycmFpbiBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy90ZXJyYWluLykuXG4gICAgICogSWYgYG51bGxgIG9yIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCBmdW5jdGlvbiByZW1vdmVzIHRlcnJhaW4uXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5hZGRTb3VyY2UoJ21hcGJveC1kZW0nLCB7XG4gICAgICogICAgICd0eXBlJzogJ3Jhc3Rlci1kZW0nLFxuICAgICAqICAgICAndXJsJzogJ21hcGJveDovL21hcGJveC5tYXBib3gtdGVycmFpbi1kZW0tdjEnLFxuICAgICAqICAgICAndGlsZVNpemUnOiA1MTIsXG4gICAgICogICAgICdtYXh6b29tJzogMTRcbiAgICAgKiB9KTtcbiAgICAgKiAvLyBhZGQgdGhlIERFTSBzb3VyY2UgYXMgYSB0ZXJyYWluIGxheWVyIHdpdGggZXhhZ2dlcmF0ZWQgaGVpZ2h0XG4gICAgICogbWFwLnNldFRlcnJhaW4oeydzb3VyY2UnOiAnbWFwYm94LWRlbScsICdleGFnZ2VyYXRpb24nOiAxLjV9KTtcbiAgICAgKi9cbiAgICBzZXRUZXJyYWluKHRlcnJhaW46IFRlcnJhaW5TcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpO1xuICAgICAgICBpZiAoIXRlcnJhaW4gJiYgdGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbi5yZXF1aXJlc0RyYXBpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuc2V0VGVycmFpbkZvckRyYXBpbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuc2V0VGVycmFpbih0ZXJyYWluKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hdmVyYWdlRWxldmF0aW9uTGFzdFNhbXBsZWRBdCA9IC1JbmZpbml0eTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlUHJvamVjdGlvbigpIHtcbiAgICAgICAgY29uc3QgcHJvaiA9IHRoaXMudHJhbnNmb3JtLnByb2plY3Rpb247XG4gICAgICAgIGNvbnN0IHpvb20gPSB0aGlzLnRyYW5zZm9ybS56b29tO1xuXG4gICAgICAgIGlmIChwcm9qLm5hbWUgPT09ICdnbG9iZScgJiYgem9vbSA+PSBHTE9CRV9aT09NX1RIUkVTSE9MRF9NQVggJiYgIXRoaXMuX3RyYW5zaXRpb25Gcm9tR2xvYmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UHJvamVjdGlvbih7bmFtZTogJ21lcmNhdG9yJ30pO1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkZyb21HbG9iZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZXJyYWluIHNwZWNpZmljYXRpb24gb3IgYG51bGxgIGlmIHRlcnJhaW4gaXNuJ3Qgc2V0IG9uIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0IHwgbnVsbH0gVGVycmFpbiBzcGVjaWZpY2F0aW9uIHByb3BlcnRpZXMgb2YgdGhlIHN0eWxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgdGVycmFpbiA9IG1hcC5nZXRUZXJyYWluKCk7XG4gICAgICovXG4gICAgZ2V0VGVycmFpbigpOiBUZXJyYWluIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlID8gdGhpcy5zdHlsZS5nZXRUZXJyYWluKCkgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZvZyBwcm9wZXJ0eSBvZiB0aGUgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZm9nIFRoZSBmb2cgcHJvcGVydGllcyB0byBzZXQuIE11c3QgY29uZm9ybSB0byB0aGUgW0ZvZyBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9mb2cvKS5cbiAgICAgKiBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoaXMgZnVuY3Rpb24gY2FsbCByZW1vdmVzIHRoZSBmb2cgZnJvbSB0aGUgbWFwLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0Rm9nKHtcbiAgICAgKiAgICAgXCJyYW5nZVwiOiBbMS4wLCAxMi4wXSxcbiAgICAgKiAgICAgXCJjb2xvclwiOiAnd2hpdGUnLFxuICAgICAqICAgICBcImhvcml6b24tYmxlbmRcIjogMC4xXG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogQWRkIGZvZyB0byBhIG1hcF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWZvZy8pXG4gICAgICovXG4gICAgc2V0Rm9nKGZvZzogRm9nU3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLl9sYXp5SW5pdEVtcHR5U3R5bGUoKTtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRGb2coZm9nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmb2cgc3BlY2lmaWNhdGlvbiBvciBgbnVsbGAgaWYgZm9nIGlzIG5vdCBzZXQgb24gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IEZvZyBzcGVjaWZpY2F0aW9uIHByb3BlcnRpZXMgb2YgdGhlIHN0eWxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgZm9nID0gbWFwLmdldEZvZygpO1xuICAgICAqL1xuICAgIGdldEZvZygpOiBGb2cgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUgPyB0aGlzLnN0eWxlLmdldEZvZygpIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmb2cgb3BhY2l0eSBmb3IgYSBnaXZlbiBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEFuIG9wYWNpdHkgb2YgMCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIGZvZyBjb250cmlidXRpb24gZm9yIHRoZSBnaXZlbiBsb2NhdGlvblxuICAgICAqIHdoaWxlIGEgZm9nIG9wYWNpdHkgb2YgMS4wIG1lYW5zIHRoZSBsb2NhdGlvbiBpcyBmdWxseSBvYnNjdXJlZCBieSB0aGUgZm9nIGVmZmVjdC5cbiAgICAgKlxuICAgICAqIElmIHRoZXJlIGlzIG5vIGZvZyBzZXQgb24gdGhlIG1hcCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBsbmdsYXQgVGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiB0byBldmFsdWF0ZSB0aGUgZm9nIG9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxIHJlcHJlc2VudGluZyB0aGUgZm9nIG9wYWNpdHksIHdoZXJlIDEgbWVhbnMgZnVsbHkgd2l0aGluLCBhbmQgMCBtZWFucyBub3QgYWZmZWN0ZWQgYnkgdGhlIGZvZyBlZmZlY3QuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcXVlcnlGb2dPcGFjaXR5KGxuZ2xhdDogTG5nTGF0TGlrZSk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5zdHlsZSB8fCAhdGhpcy5zdHlsZS5mb2cpIHJldHVybiAwLjA7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmZvZy5nZXRPcGFjaXR5QXRMYXRMbmcoTG5nTGF0LmNvbnZlcnQobG5nbGF0KSwgdGhpcy50cmFuc2Zvcm0pO1xuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7RmVhdHVyZSBzdGF0ZX0gKi9cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBzdGF0ZWAgb2YgYSBmZWF0dXJlLlxuICAgICAqIEEgZmVhdHVyZSdzIGBzdGF0ZWAgaXMgYSBzZXQgb2YgdXNlci1kZWZpbmVkIGtleS12YWx1ZSBwYWlycyB0aGF0IGFyZSBhc3NpZ25lZCB0byBhIGZlYXR1cmUgYXQgcnVudGltZS5cbiAgICAgKiBXaGVuIHVzaW5nIHRoaXMgbWV0aG9kLCB0aGUgYHN0YXRlYCBvYmplY3QgaXMgbWVyZ2VkIHdpdGggYW55IGV4aXN0aW5nIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgZmVhdHVyZSdzIHN0YXRlLlxuICAgICAqIEZlYXR1cmVzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGBpZGAgYXR0cmlidXRlLCB3aGljaCBjYW4gYmUgYW55IG51bWJlciBvciBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSB1c2VkIHdpdGggc291cmNlcyB0aGF0IGhhdmUgYSBgaWRgIGF0dHJpYnV0ZS4gVGhlIGBpZGAgYXR0cmlidXRlIGNhbiBiZSBkZWZpbmVkIGluIHRocmVlIHdheXM6XG4gICAgICogLSBGb3IgdmVjdG9yIG9yIEdlb0pTT04gc291cmNlcywgaW5jbHVkaW5nIGFuIGBpZGAgYXR0cmlidXRlIGluIHRoZSBvcmlnaW5hbCBkYXRhIGZpbGUuXG4gICAgICogLSBGb3IgdmVjdG9yIG9yIEdlb0pTT04gc291cmNlcywgdXNpbmcgdGhlIFtgcHJvbW90ZUlkYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvc291cmNlcy8jdmVjdG9yLXByb21vdGVJZCkgb3B0aW9uIGF0IHRoZSB0aW1lIHRoZSBzb3VyY2UgaXMgZGVmaW5lZC5cbiAgICAgKiAtIEZvciBHZW9KU09OIHNvdXJjZXMsIHVzaW5nIHRoZSBbYGdlbmVyYXRlSWRgXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9zb3VyY2VzLyNnZW9qc29uLWdlbmVyYXRlSWQpIG9wdGlvbiB0byBhdXRvLWFzc2lnbiBhbiBgaWRgIGJhc2VkIG9uIHRoZSBmZWF0dXJlJ3MgaW5kZXggaW4gdGhlIHNvdXJjZSBkYXRhLiBJZiB5b3UgY2hhbmdlIGZlYXR1cmUgZGF0YSB1c2luZyBgbWFwLmdldFNvdXJjZSgnc29tZSBpZCcpLnNldERhdGEoLi4uKWAsIHlvdSBtYXkgbmVlZCB0byByZS1hcHBseSBzdGF0ZSB0YWtpbmcgaW50byBhY2NvdW50IHVwZGF0ZWQgYGlkYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBfTm90ZTogWW91IGNhbiB1c2UgdGhlIFtgZmVhdHVyZS1zdGF0ZWAgZXhwcmVzc2lvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvZXhwcmVzc2lvbnMvI2ZlYXR1cmUtc3RhdGUpIHRvIGFjY2VzcyB0aGUgdmFsdWVzIGluIGEgZmVhdHVyZSdzIHN0YXRlIG9iamVjdCBmb3IgdGhlIHB1cnBvc2VzIG9mIHN0eWxpbmdfLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGZlYXR1cmUgRmVhdHVyZSBpZGVudGlmaWVyLiBGZWF0dXJlIG9iamVjdHMgcmV0dXJuZWQgZnJvbVxuICAgICAqIHtAbGluayBNYXAjcXVlcnlSZW5kZXJlZEZlYXR1cmVzfSBvciBldmVudCBoYW5kbGVycyBjYW4gYmUgdXNlZCBhcyBmZWF0dXJlIGlkZW50aWZpZXJzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBmZWF0dXJlLmlkIFVuaXF1ZSBpZCBvZiB0aGUgZmVhdHVyZS4gQ2FuIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIGJ1dCBzdXBwb3J0cyBzdHJpbmcgdmFsdWVzIG9ubHkgd2hlbiB0aGUgW2Bwcm9tb3RlSWRgXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9zb3VyY2VzLyN2ZWN0b3ItcHJvbW90ZUlkKSBvcHRpb24gaGFzIGJlZW4gYXBwbGllZCB0byB0aGUgc291cmNlIG9yIHRoZSBzdHJpbmcgY2FuIGJlIGNhc3QgdG8gYW4gaW50ZWdlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmVhdHVyZS5zb3VyY2UgVGhlIGlkIG9mIHRoZSB2ZWN0b3Igb3IgR2VvSlNPTiBzb3VyY2UgZm9yIHRoZSBmZWF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZmVhdHVyZS5zb3VyY2VMYXllcl0gKG9wdGlvbmFsKSAqRm9yIHZlY3RvciB0aWxlIHNvdXJjZXMsIGBzb3VyY2VMYXllcmAgaXMgcmVxdWlyZWQqLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBBIHNldCBvZiBrZXktdmFsdWUgcGFpcnMuIFRoZSB2YWx1ZXMgc2hvdWxkIGJlIHZhbGlkIEpTT04gdHlwZXMuXG4gICAgICogQHJldHVybnMge01hcH0gVGhlIG1hcCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBXaGVuIHRoZSBtb3VzZSBtb3ZlcyBvdmVyIHRoZSBgbXktbGF5ZXJgIGxheWVyLCB1cGRhdGVcbiAgICAgKiAvLyB0aGUgZmVhdHVyZSBzdGF0ZSBmb3IgdGhlIGZlYXR1cmUgdW5kZXIgdGhlIG1vdXNlXG4gICAgICogbWFwLm9uKCdtb3VzZW1vdmUnLCAnbXktbGF5ZXInLCAoZSkgPT4ge1xuICAgICAqICAgICBpZiAoZS5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICogICAgICAgICBtYXAuc2V0RmVhdHVyZVN0YXRlKHtcbiAgICAgKiAgICAgICAgICAgICBzb3VyY2U6ICdteS1zb3VyY2UnLFxuICAgICAqICAgICAgICAgICAgIHNvdXJjZUxheWVyOiAnbXktc291cmNlLWxheWVyJyxcbiAgICAgKiAgICAgICAgICAgICBpZDogZS5mZWF0dXJlc1swXS5pZCxcbiAgICAgKiAgICAgICAgIH0sIHtcbiAgICAgKiAgICAgICAgICAgICBob3ZlcjogdHJ1ZVxuICAgICAqICAgICAgICAgfSk7XG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIGhvdmVyIGVmZmVjdF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaG92ZXItc3R5bGVzLylcbiAgICAgKiBAc2VlIFtUdXRvcmlhbDogQ3JlYXRlIGludGVyYWN0aXZlIGhvdmVyIGVmZmVjdHMgd2l0aCBNYXBib3ggR0wgSlNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvdHV0b3JpYWxzL2NyZWF0ZS1pbnRlcmFjdGl2ZS1ob3Zlci1lZmZlY3RzLXdpdGgtbWFwYm94LWdsLWpzLylcbiAgICAgKi9cbiAgICBzZXRGZWF0dXJlU3RhdGUoZmVhdHVyZTogeyBzb3VyY2U6IHN0cmluZzsgc291cmNlTGF5ZXI/OiBzdHJpbmc7IGlkOiBzdHJpbmcgfCBudW1iZXI7IH0sIHN0YXRlOiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRGZWF0dXJlU3RhdGUoZmVhdHVyZSwgc3RhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJuc1xuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGBzdGF0ZWAgb2YgYSBmZWF0dXJlLCBzZXR0aW5nIGl0IGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgICogSWYgb25seSBhIGBmZWF0dXJlLnNvdXJjZWAgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIHJlbW92ZSB0aGUgc3RhdGUgZm9yIGFsbCBmZWF0dXJlcyBmcm9tIHRoYXQgc291cmNlLlxuICAgICAqIElmIGBmZWF0dXJlLmlkYCBpcyBhbHNvIHNwZWNpZmllZCwgaXQgd2lsbCByZW1vdmUgYWxsIGtleXMgZm9yIHRoYXQgZmVhdHVyZSdzIHN0YXRlLlxuICAgICAqIElmIGBrZXlgIGlzIGFsc28gc3BlY2lmaWVkLCBpdCByZW1vdmVzIG9ubHkgdGhhdCBrZXkgZnJvbSB0aGF0IGZlYXR1cmUncyBzdGF0ZS5cbiAgICAgKiBGZWF0dXJlcyBhcmUgaWRlbnRpZmllZCBieSB0aGVpciBgZmVhdHVyZS5pZGAgYXR0cmlidXRlLCB3aGljaCBjYW4gYmUgYW55IG51bWJlciBvciBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZmVhdHVyZSBJZGVudGlmaWVyIG9mIHdoZXJlIHRvIHJlbW92ZSBzdGF0ZS4gSXQgY2FuIGJlIGEgc291cmNlLCBhIGZlYXR1cmUsIG9yIGEgc3BlY2lmaWMga2V5IG9mIGZlYXR1cmUuXG4gICAgICogRmVhdHVyZSBvYmplY3RzIHJldHVybmVkIGZyb20ge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9IG9yIGV2ZW50IGhhbmRsZXJzIGNhbiBiZSB1c2VkIGFzIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IGZlYXR1cmUuaWQgVW5pcXVlIGlkIG9mIHRoZSBmZWF0dXJlLiBDYW4gYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgYnV0IHN1cHBvcnRzIHN0cmluZyB2YWx1ZXMgb25seSB3aGVuIHRoZSBbYHByb21vdGVJZGBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3NvdXJjZXMvI3ZlY3Rvci1wcm9tb3RlSWQpIG9wdGlvbiBoYXMgYmVlbiBhcHBsaWVkIHRvIHRoZSBzb3VyY2Ugb3IgdGhlIHN0cmluZyBjYW4gYmUgY2FzdCB0byBhbiBpbnRlZ2VyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmZWF0dXJlLnNvdXJjZSBUaGUgaWQgb2YgdGhlIHZlY3RvciBvciBHZW9KU09OIHNvdXJjZSBmb3IgdGhlIGZlYXR1cmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtmZWF0dXJlLnNvdXJjZUxheWVyXSAob3B0aW9uYWwpIEZvciB2ZWN0b3IgdGlsZSBzb3VyY2VzLCBgc291cmNlTGF5ZXJgIGlzIHJlcXVpcmVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgKG9wdGlvbmFsKSBUaGUga2V5IGluIHRoZSBmZWF0dXJlIHN0YXRlIHRvIHJlc2V0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBSZXNldCB0aGUgZW50aXJlIHN0YXRlIG9iamVjdCBmb3IgYWxsIGZlYXR1cmVzXG4gICAgICogLy8gaW4gdGhlIGBteS1zb3VyY2VgIHNvdXJjZVxuICAgICAqIG1hcC5yZW1vdmVGZWF0dXJlU3RhdGUoe1xuICAgICAqICAgICBzb3VyY2U6ICdteS1zb3VyY2UnXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFdoZW4gdGhlIG1vdXNlIGxlYXZlcyB0aGUgYG15LWxheWVyYCBsYXllcixcbiAgICAgKiAvLyByZXNldCB0aGUgZW50aXJlIHN0YXRlIG9iamVjdCBmb3IgdGhlXG4gICAgICogLy8gZmVhdHVyZSB1bmRlciB0aGUgbW91c2VcbiAgICAgKiBtYXAub24oJ21vdXNlbGVhdmUnLCAnbXktbGF5ZXInLCAoZSkgPT4ge1xuICAgICAqICAgICBtYXAucmVtb3ZlRmVhdHVyZVN0YXRlKHtcbiAgICAgKiAgICAgICAgIHNvdXJjZTogJ215LXNvdXJjZScsXG4gICAgICogICAgICAgICBzb3VyY2VMYXllcjogJ215LXNvdXJjZS1sYXllcicsXG4gICAgICogICAgICAgICBpZDogZS5mZWF0dXJlc1swXS5pZFxuICAgICAqICAgICB9KTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gV2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBgbXktbGF5ZXJgIGxheWVyLFxuICAgICAqIC8vIHJlc2V0IG9ubHkgdGhlIGBob3ZlcmAga2V5LXZhbHVlIHBhaXIgaW4gdGhlXG4gICAgICogLy8gc3RhdGUgZm9yIHRoZSBmZWF0dXJlIHVuZGVyIHRoZSBtb3VzZVxuICAgICAqIG1hcC5vbignbW91c2VsZWF2ZScsICdteS1sYXllcicsIChlKSA9PiB7XG4gICAgICogICAgIG1hcC5yZW1vdmVGZWF0dXJlU3RhdGUoe1xuICAgICAqICAgICAgICAgc291cmNlOiAnbXktc291cmNlJyxcbiAgICAgKiAgICAgICAgIHNvdXJjZUxheWVyOiAnbXktc291cmNlLWxheWVyJyxcbiAgICAgKiAgICAgICAgIGlkOiBlLmZlYXR1cmVzWzBdLmlkXG4gICAgICogICAgIH0sICdob3ZlcicpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgKi9cbiAgICByZW1vdmVGZWF0dXJlU3RhdGUoZmVhdHVyZTogeyBzb3VyY2U6IHN0cmluZzsgc291cmNlTGF5ZXI/OiBzdHJpbmc7IGlkPzogc3RyaW5nIHwgbnVtYmVyOyB9LCBrZXk/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVGZWF0dXJlU3RhdGUoZmVhdHVyZSwga2V5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGBzdGF0ZWAgb2YgYSBmZWF0dXJlLlxuICAgICAqIEEgZmVhdHVyZSdzIGBzdGF0ZWAgaXMgYSBzZXQgb2YgdXNlci1kZWZpbmVkIGtleS12YWx1ZSBwYWlycyB0aGF0IGFyZSBhc3NpZ25lZCB0byBhIGZlYXR1cmUgYXQgcnVudGltZS5cbiAgICAgKiBGZWF0dXJlcyBhcmUgaWRlbnRpZmllZCBieSB0aGVpciBgaWRgIGF0dHJpYnV0ZSwgd2hpY2ggY2FuIGJlIGFueSBudW1iZXIgb3Igc3RyaW5nLlxuICAgICAqXG4gICAgICogX05vdGU6IFRvIGFjY2VzcyB0aGUgdmFsdWVzIGluIGEgZmVhdHVyZSdzIHN0YXRlIG9iamVjdCBmb3IgdGhlIHB1cnBvc2VzIG9mIHN0eWxpbmcgdGhlIGZlYXR1cmUsIHVzZSB0aGUgW2BmZWF0dXJlLXN0YXRlYCBleHByZXNzaW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9leHByZXNzaW9ucy8jZmVhdHVyZS1zdGF0ZSlfLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGZlYXR1cmUgRmVhdHVyZSBpZGVudGlmaWVyLiBGZWF0dXJlIG9iamVjdHMgcmV0dXJuZWQgZnJvbVxuICAgICAqIHtAbGluayBNYXAjcXVlcnlSZW5kZXJlZEZlYXR1cmVzfSBvciBldmVudCBoYW5kbGVycyBjYW4gYmUgdXNlZCBhcyBmZWF0dXJlIGlkZW50aWZpZXJzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBmZWF0dXJlLmlkIFVuaXF1ZSBpZCBvZiB0aGUgZmVhdHVyZS4gQ2FuIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIGJ1dCBzdXBwb3J0cyBzdHJpbmcgdmFsdWVzIG9ubHkgd2hlbiB0aGUgW2Bwcm9tb3RlSWRgXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9zb3VyY2VzLyN2ZWN0b3ItcHJvbW90ZUlkKSBvcHRpb24gaGFzIGJlZW4gYXBwbGllZCB0byB0aGUgc291cmNlIG9yIHRoZSBzdHJpbmcgY2FuIGJlIGNhc3QgdG8gYW4gaW50ZWdlci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmVhdHVyZS5zb3VyY2UgVGhlIGlkIG9mIHRoZSB2ZWN0b3Igb3IgR2VvSlNPTiBzb3VyY2UgZm9yIHRoZSBmZWF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZmVhdHVyZS5zb3VyY2VMYXllcl0gKG9wdGlvbmFsKSAqRm9yIHZlY3RvciB0aWxlIHNvdXJjZXMsIGBzb3VyY2VMYXllcmAgaXMgcmVxdWlyZWQqLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH0gVGhlIHN0YXRlIG9mIHRoZSBmZWF0dXJlOiBhIHNldCBvZiBrZXktdmFsdWUgcGFpcnMgdGhhdCB3YXMgYXNzaWduZWQgdG8gdGhlIGZlYXR1cmUgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gV2hlbiB0aGUgbW91c2UgbW92ZXMgb3ZlciB0aGUgYG15LWxheWVyYCBsYXllcixcbiAgICAgKiAvLyBnZXQgdGhlIGZlYXR1cmUgc3RhdGUgZm9yIHRoZSBmZWF0dXJlIHVuZGVyIHRoZSBtb3VzZVxuICAgICAqIG1hcC5vbignbW91c2Vtb3ZlJywgJ215LWxheWVyJywgKGUpID0+IHtcbiAgICAgKiAgICAgaWYgKGUuZmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAqICAgICAgICAgbWFwLmdldEZlYXR1cmVTdGF0ZSh7XG4gICAgICogICAgICAgICAgICAgc291cmNlOiAnbXktc291cmNlJyxcbiAgICAgKiAgICAgICAgICAgICBzb3VyY2VMYXllcjogJ215LXNvdXJjZS1sYXllcicsXG4gICAgICogICAgICAgICAgICAgaWQ6IGUuZmVhdHVyZXNbMF0uaWRcbiAgICAgKiAgICAgICAgIH0pO1xuICAgICAqICAgICB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKi9cbiAgICBnZXRGZWF0dXJlU3RhdGUoZmVhdHVyZTogeyBzb3VyY2U6IHN0cmluZzsgc291cmNlTGF5ZXI/OiBzdHJpbmc7IGlkOiBzdHJpbmcgfCBudW1iZXI7IH0pOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRGZWF0dXJlU3RhdGUoZmVhdHVyZSk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUNvbnRhaW5lckRpbWVuc2lvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggfHwgNDAwO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLl9jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IHx8IDMwMDtcblxuICAgICAgICBsZXQgdHJhbnNmb3JtVmFsdWVzO1xuICAgICAgICBsZXQgZWwgPSB0aGlzLl9jb250YWluZXI7XG4gICAgICAgIHdoaWxlIChlbCAmJiAhdHJhbnNmb3JtVmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1NYXRyaXggPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkudHJhbnNmb3JtO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybU1hdHJpeCAmJiB0cmFuc2Zvcm1NYXRyaXggIT09ICdub25lJykgdHJhbnNmb3JtVmFsdWVzID0gdHJhbnNmb3JtTWF0cml4Lm1hdGNoKC9tYXRyaXguKlxcKCguKylcXCkvKVsxXS5zcGxpdCgnLCAnKTtcbiAgICAgICAgICAgIGVsID0gZWwucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmFuc2Zvcm1WYWx1ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lcldpZHRoID0gdHJhbnNmb3JtVmFsdWVzWzBdICYmIHRyYW5zZm9ybVZhbHVlc1swXSAhPT0gJzAnID8gTWF0aC5hYnMod2lkdGggLyB0cmFuc2Zvcm1WYWx1ZXNbMF0pIDogd2lkdGg7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXJIZWlnaHQgPSB0cmFuc2Zvcm1WYWx1ZXNbM10gJiYgdHJhbnNmb3JtVmFsdWVzWzNdICE9PSAnMCcgPyBNYXRoLmFicyhoZWlnaHQgLyB0cmFuc2Zvcm1WYWx1ZXNbM10pIDogaGVpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyV2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lckhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9kZXRlY3RNaXNzaW5nQ1NTKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb21wdXRlZENvbG9yID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fbWlzc2luZ0NTU0NhbmFyeSkuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO1xuICAgICAgICBpZiAoY29tcHV0ZWRDb2xvciAhPT0gJ3JnYigyNTAsIDEyOCwgMTE0KScpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKCdUaGlzIHBhZ2UgYXBwZWFycyB0byBiZSBtaXNzaW5nIENTUyBkZWNsYXJhdGlvbnMgZm9yICcgK1xuICAgICAgICAgICAgICAgICdNYXBib3ggR0wgSlMsIHdoaWNoIG1heSBjYXVzZSB0aGUgbWFwIHRvIGRpc3BsYXkgaW5jb3JyZWN0bHkuICcgK1xuICAgICAgICAgICAgICAgICdQbGVhc2UgZW5zdXJlIHlvdXIgcGFnZSBpbmNsdWRlcyBtYXBib3gtZ2wuY3NzLCBhcyBkZXNjcmliZWQgJyArXG4gICAgICAgICAgICAgICAgJ2luIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS8uJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc2V0dXBDb250YWluZXIoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcjtcbiAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLW1hcCcpO1xuXG4gICAgICAgIGNvbnN0IG1pc3NpbmdDU1NDYW5hcnkgPSB0aGlzLl9taXNzaW5nQ1NTQ2FuYXJ5ID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWNhbmFyeScsIGNvbnRhaW5lcik7XG4gICAgICAgIG1pc3NpbmdDU1NDYW5hcnkuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLl9kZXRlY3RNaXNzaW5nQ1NTKCk7XG5cbiAgICAgICAgY29uc3QgY2FudmFzQ29udGFpbmVyID0gdGhpcy5fY2FudmFzQ29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWNhbnZhcy1jb250YWluZXInLCBjb250YWluZXIpO1xuICAgICAgICBpZiAodGhpcy5faW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIGNhbnZhc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1pbnRlcmFjdGl2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FudmFzID0gRE9NLmNyZWF0ZSgnY2FudmFzJywgJ21hcGJveGdsLWNhbnZhcycsIGNhbnZhc0NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgdGhpcy5fY29udGV4dExvc3QsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgdGhpcy5fY29udGV4dFJlc3RvcmVkLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgdGhpcy5fY2FudmFzLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdNYXAnKTtcbiAgICAgICAgdGhpcy5fY2FudmFzLnNldEF0dHJpYnV0ZSgncm9sZScsICdyZWdpb24nKTtcblxuICAgICAgICB0aGlzLl91cGRhdGVDb250YWluZXJEaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuX3Jlc2l6ZUNhbnZhcyh0aGlzLl9jb250YWluZXJXaWR0aCwgdGhpcy5fY29udGFpbmVySGVpZ2h0KTtcblxuICAgICAgICBjb25zdCBjb250cm9sQ29udGFpbmVyID0gdGhpcy5fY29udHJvbENvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jb250cm9sLWNvbnRhaW5lcicsIGNvbnRhaW5lcik7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMuX2NvbnRyb2xQb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgWyd0b3AtbGVmdCcsICd0b3AtcmlnaHQnLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLXJpZ2h0J10uZm9yRWFjaCgocG9zaXRpb25OYW1lKSA9PiB7XG4gICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25OYW1lXSA9IERPTS5jcmVhdGUoJ2RpdicsIGBtYXBib3hnbC1jdHJsLSR7cG9zaXRpb25OYW1lfWAsIGNvbnRyb2xDb250YWluZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fb25NYXBTY3JvbGwsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBfcmVzaXplQ2FudmFzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHBpeGVsUmF0aW8gPSBicm93c2VyLmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgICAgICAvLyBSZXF1ZXN0IHRoZSByZXF1aXJlZCBjYW52YXMgc2l6ZSAocm91bmRlZCB1cCkgdGFraW5nIHRoZSBwaXhlbHJhdGlvIGludG8gYWNjb3VudC5cbiAgICAgICAgdGhpcy5fY2FudmFzLndpZHRoID0gcGl4ZWxSYXRpbyAqIE1hdGguY2VpbCh3aWR0aCk7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSBwaXhlbFJhdGlvICogTWF0aC5jZWlsKGhlaWdodCk7XG5cbiAgICAgICAgLy8gTWFpbnRhaW4gdGhlIHNhbWUgY2FudmFzIHNpemUsIHBvdGVudGlhbGx5IGRvd25zY2FsaW5nIGl0IGZvciBIaURQSSBkaXNwbGF5c1xuICAgICAgICB0aGlzLl9jYW52YXMuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgIH1cblxuICAgIF9hZGRNYXJrZXIobWFya2VyOiBNYXJrZXIpIHtcbiAgICAgICAgdGhpcy5fbWFya2Vycy5wdXNoKG1hcmtlcik7XG4gICAgfVxuXG4gICAgX3JlbW92ZU1hcmtlcihtYXJrZXI6IE1hcmtlcikge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX21hcmtlcnMuaW5kZXhPZihtYXJrZXIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc2V0dXBQYWludGVyKCkge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZXh0ZW5kKHt9LCBzdXBwb3J0ZWQud2ViR0xDb250ZXh0QXR0cmlidXRlcywge1xuICAgICAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogdGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCxcbiAgICAgICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyLFxuICAgICAgICAgICAgYW50aWFsaWFzOiB0aGlzLl9hbnRpYWxpYXMgfHwgZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLl9jYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBhdHRyaWJ1dGVzKSB8fFxuICAgICAgICAgICAgdGhpcy5fY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpO1xuXG4gICAgICAgIGlmICghZ2wpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIFdlYkdMJykpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0b3JlQXV0aFN0YXRlKGdsLCB0cnVlKTtcblxuICAgICAgICB0aGlzLnBhaW50ZXIgPSBuZXcgUGFpbnRlcihnbCwgdGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICB0aGlzLm9uKCdkYXRhJywgKGV2ZW50OiBNYXBEYXRhRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhVHlwZSA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50ZXIuc2V0VGlsZUxvYWRlZEZsYWcodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdlYnBTdXBwb3J0ZWQudGVzdFN1cHBvcnQoZ2wpO1xuICAgIH1cblxuICAgIF9jb250ZXh0TG9zdChldmVudDogKikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5fZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3dlYmdsY29udGV4dGxvc3QnLCB7b3JpZ2luYWxFdmVudDogZXZlbnR9KSk7XG4gICAgfVxuXG4gICAgX2NvbnRleHRSZXN0b3JlZChldmVudDogKikge1xuICAgICAgICB0aGlzLl9zZXR1cFBhaW50ZXIoKTtcbiAgICAgICAgdGhpcy5yZXNpemUoKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3dlYmdsY29udGV4dHJlc3RvcmVkJywge29yaWdpbmFsRXZlbnQ6IGV2ZW50fSkpO1xuICAgIH1cblxuICAgIF9vbk1hcFNjcm9sbChldmVudDogKikge1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLl9jb250YWluZXIpIHJldHVybjtcblxuICAgICAgICAvLyBSZXZlcnQgYW55IHNjcm9sbCB3aGljaCB3b3VsZCBtb3ZlIHRoZSBjYW52YXMgb3V0c2lkZSBvZiB0aGUgdmlld1xuICAgICAgICB0aGlzLl9jb250YWluZXIuc2Nyb2xsVG9wID0gMDtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnNjcm9sbExlZnQgPSAwO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEBzZWN0aW9uIHtMaWZlY3ljbGV9ICovXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCBpcyBmdWxseSBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGBmYWxzZWAgaWYgdGhlIHN0eWxlIGlzIG5vdCB5ZXQgZnVsbHkgbG9hZGVkLFxuICAgICAqIG9yIGlmIHRoZXJlIGhhcyBiZWVuIGEgY2hhbmdlIHRvIHRoZSBzb3VyY2VzIG9yIHN0eWxlIHRoYXRcbiAgICAgKiBoYXMgbm90IHlldCBmdWxseSBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIGlzIGZ1bGx5IGxvYWRlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGlzTG9hZGVkID0gbWFwLmxvYWRlZCgpO1xuICAgICAqL1xuICAgIGxvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9zdHlsZURpcnR5ICYmICF0aGlzLl9zb3VyY2VzRGlydHkgJiYgISF0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUubG9hZGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoaXMgbWFwJ3Mgc3R5bGUgYW5kIHNvdXJjZXMsIGFuZCByZS1yZW5kZXIgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXBkYXRlU3R5bGUgbWFyayB0aGUgbWFwJ3Mgc3R5bGUgZm9yIHJlcHJvY2Vzc2luZyBhc1xuICAgICAqIHdlbGwgYXMgaXRzIHNvdXJjZXNcbiAgICAgKiBAcmV0dXJucyB7TWFwfSB0aGlzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdXBkYXRlKHVwZGF0ZVN0eWxlPzogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIHRoaXMuX3N0eWxlRGlydHkgPSB0aGlzLl9zdHlsZURpcnR5IHx8IHVwZGF0ZVN0eWxlO1xuICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyaWdnZXJSZXBhaW50KCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCB0aGF0IHRoZSBnaXZlbiBjYWxsYmFjayBiZSBleGVjdXRlZCBkdXJpbmcgdGhlIG5leHQgcmVuZGVyXG4gICAgICogZnJhbWUuICBTY2hlZHVsZSBhIHJlbmRlciBmcmFtZSBpZiBvbmUgaXMgbm90IGFscmVhZHkgc2NoZWR1bGVkLlxuICAgICAqIEByZXR1cm5zIEFuIGlkIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBjYWxsYmFja1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3JlcXVlc3RSZW5kZXJGcmFtZShjYWxsYmFjazogKCkgPT4gdm9pZCk6IFRhc2tJRCB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVGFza1F1ZXVlLmFkZChjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgX2NhbmNlbFJlbmRlckZyYW1lKGlkOiBUYXNrSUQpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyVGFza1F1ZXVlLnJlbW92ZShpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVxdWVzdCB0aGF0IHRoZSBnaXZlbiBjYWxsYmFjayBiZSBleGVjdXRlZCBkdXJpbmcgdGhlIG5leHQgcmVuZGVyIGZyYW1lIGlmIHRoZSBtYXAgaXMgbm90XG4gICAgICogaWRsZS4gT3RoZXJ3aXNlIGl0IGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LCB0byBhdm9pZCB0cmlnZ2VyaW5nIGEgbmV3IHJlbmRlci5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9yZXF1ZXN0RG9tVGFzayhjYWxsYmFjazogKCkgPT4gdm9pZCkge1xuICAgICAgICAvLyBUaGlzIGNvbmRpdGlvbiBtZWFucyB0aGF0IHRoZSBtYXAgaXMgaWRsZTogdGhlIGNhbGxiYWNrIG5lZWRzIHRvIGJlIGNhbGxlZCByaWdodCBub3cgYXNcbiAgICAgICAgLy8gdGhlcmUgd29uJ3QgYmUgYSB0cmlnZ2VyZWQgcmVuZGVyIHRvIHJ1biB0aGUgcXVldWUuXG4gICAgICAgIGlmICghdGhpcy5sb2FkZWQoKSB8fCAodGhpcy5sb2FkZWQoKSAmJiAhdGhpcy5pc01vdmluZygpKSkge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2RvbVJlbmRlclRhc2tRdWV1ZS5hZGQoY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCB3aGVuIGEgKHJlLSlyZW5kZXIgb2YgdGhlIG1hcCBpcyByZXF1aXJlZDpcbiAgICAgKiAtIFRoZSBzdHlsZSBoYXMgY2hhbmdlZCAoYHNldFBhaW50UHJvcGVydHkoKWAsIGV0Yy4pXG4gICAgICogLSBTb3VyY2UgZGF0YSBoYXMgY2hhbmdlZCAoZm9yIGV4YW1wbGUsIHRpbGVzIGhhdmUgZmluaXNoZWQgbG9hZGluZylcbiAgICAgKiAtIFRoZSBtYXAgaGFzIGlzIG1vdmluZyAob3IganVzdCBmaW5pc2hlZCBtb3ZpbmcpXG4gICAgICogLSBBIHRyYW5zaXRpb24gaXMgaW4gcHJvZ3Jlc3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWludFN0YXJ0VGltZVN0YW1wICBUaGUgdGltZSB3aGVuIHRoZSBhbmltYXRpb24gZnJhbWUgYmVnYW4gZXhlY3V0aW5nLlxuICAgICAqXG4gICAgICogQHJldHVybnMge01hcH0gdGhpc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3JlbmRlcihwYWludFN0YXJ0VGltZVN0YW1wOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGdwdVRpbWVyO1xuICAgICAgICBjb25zdCBleHRUaW1lclF1ZXJ5ID0gdGhpcy5wYWludGVyLmNvbnRleHQuZXh0VGltZXJRdWVyeTtcbiAgICAgICAgY29uc3QgZnJhbWVTdGFydFRpbWUgPSBicm93c2VyLm5vdygpO1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5zKCdncHUtdGltaW5nLWZyYW1lJykpIHtcbiAgICAgICAgICAgIGdwdVRpbWVyID0gZXh0VGltZXJRdWVyeS5jcmVhdGVRdWVyeUVYVCgpO1xuICAgICAgICAgICAgZXh0VGltZXJRdWVyeS5iZWdpblF1ZXJ5RVhUKGV4dFRpbWVyUXVlcnkuVElNRV9FTEFQU0VEX0VYVCwgZ3B1VGltZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IFBlcmZvcm1hbmNlVXRpbHMuYmVnaW5NZWFzdXJlKCdyZW5kZXInKTtcblxuICAgICAgICBsZXQgYXZlcmFnZUVsZXZhdGlvbkNoYW5nZWQgPSB0aGlzLl91cGRhdGVBdmVyYWdlRWxldmF0aW9uKGZyYW1lU3RhcnRUaW1lKTtcblxuICAgICAgICAvLyBBIGN1c3RvbSBsYXllciBtYXkgaGF2ZSB1c2VkIHRoZSBjb250ZXh0IGFzeW5jaHJvbm91c2x5LiBNYXJrIHRoZSBzdGF0ZSBhcyBkaXJ0eS5cbiAgICAgICAgdGhpcy5wYWludGVyLmNvbnRleHQuc2V0RGlydHkoKTtcbiAgICAgICAgdGhpcy5wYWludGVyLnNldEJhc2VTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5ydW4ocGFpbnRTdGFydFRpbWVTdGFtcCk7XG4gICAgICAgIHRoaXMuX2RvbVJlbmRlclRhc2tRdWV1ZS5ydW4ocGFpbnRTdGFydFRpbWVTdGFtcCk7XG4gICAgICAgIC8vIEEgdGFzayBxdWV1ZSBjYWxsYmFjayBtYXkgaGF2ZSBmaXJlZCBhIHVzZXIgZXZlbnQgd2hpY2ggbWF5IGhhdmUgcmVtb3ZlZCB0aGUgbWFwXG4gICAgICAgIGlmICh0aGlzLl9yZW1vdmVkKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlUHJvamVjdGlvbigpO1xuXG4gICAgICAgIGxldCBjcm9zc0ZhZGluZyA9IGZhbHNlO1xuICAgICAgICBjb25zdCBmYWRlRHVyYXRpb24gPSB0aGlzLl9pc0luaXRpYWxMb2FkID8gMCA6IHRoaXMuX2ZhZGVEdXJhdGlvbjtcblxuICAgICAgICAvLyBJZiB0aGUgc3R5bGUgaGFzIGNoYW5nZWQsIHRoZSBtYXAgaXMgYmVpbmcgem9vbWVkLCBvciBhIHRyYW5zaXRpb24gb3IgZmFkZSBpcyBpbiBwcm9ncmVzczpcbiAgICAgICAgLy8gIC0gQXBwbHkgc3R5bGUgY2hhbmdlcyAoaW4gYSBiYXRjaClcbiAgICAgICAgLy8gIC0gUmVjYWxjdWxhdGUgcGFpbnQgcHJvcGVydGllcy5cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgdGhpcy5fc3R5bGVEaXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5fc3R5bGVEaXJ0eSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCB6b29tID0gdGhpcy50cmFuc2Zvcm0uem9vbTtcbiAgICAgICAgICAgIGNvbnN0IHBpdGNoID0gdGhpcy50cmFuc2Zvcm0ucGl0Y2g7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBicm93c2VyLm5vdygpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS56b29tSGlzdG9yeS51cGRhdGUoem9vbSwgbm93KTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh6b29tLCB7XG4gICAgICAgICAgICAgICAgbm93LFxuICAgICAgICAgICAgICAgIGZhZGVEdXJhdGlvbixcbiAgICAgICAgICAgICAgICBwaXRjaCxcbiAgICAgICAgICAgICAgICB6b29tSGlzdG9yeTogdGhpcy5zdHlsZS56b29tSGlzdG9yeSxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnN0eWxlLmdldFRyYW5zaXRpb24oKVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZhY3RvciA9IHBhcmFtZXRlcnMuY3Jvc3NGYWRpbmdGYWN0b3IoKTtcbiAgICAgICAgICAgIGlmIChmYWN0b3IgIT09IDEgfHwgZmFjdG9yICE9PSB0aGlzLl9jcm9zc0ZhZGluZ0ZhY3Rvcikge1xuICAgICAgICAgICAgICAgIGNyb3NzRmFkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jcm9zc0ZhZGluZ0ZhY3RvciA9IGZhY3RvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zdHlsZS51cGRhdGUocGFyYW1ldGVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb2dJc1RyYW5zaXRpb25pbmcgPSB0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUuZm9nICYmIHRoaXMuc3R5bGUuZm9nLmhhc1RyYW5zaXRpb24oKTtcblxuICAgICAgICBpZiAoZm9nSXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLl9tYXJrZXJzTmVlZFVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHkgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgd2UgYXJlIGluIF9yZW5kZXIgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBpbi1wcm9ncmVzcyBwYWludFxuICAgICAgICAvLyB0cmFuc2l0aW9uLCB1cGRhdGUgc291cmNlIGNhY2hlcyB0byBjaGVjayBmb3IgYW5kIGxvYWQgYW55IHRpbGVzIHdlXG4gICAgICAgIC8vIG5lZWQgZm9yIHRoZSBjdXJyZW50IHRyYW5zZm9ybVxuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiB0aGlzLl9zb3VyY2VzRGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5wYWludGVyLl91cGRhdGVGb2codGhpcy5zdHlsZSk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVUZXJyYWluKCk7IC8vIFRlcnJhaW4gREVNIHNvdXJjZSB1cGRhdGVzIGhlcmUgYW5kIHNraXBzIHVwZGF0ZSBpbiBzdHlsZS5fdXBkYXRlU291cmNlcy5cbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX3VwZGF0ZVNvdXJjZXModGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICAgICAgLy8gVXBkYXRlIHBvc2l0aW9ucyBvZiBtYXJrZXJzIG9uIGVuYWJsaW5nL2Rpc2FibGluZyB0ZXJyYWluXG4gICAgICAgICAgICB0aGlzLl9mb3JjZU1hcmtlclVwZGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGxhY2VtZW50RGlydHkgPSB0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUuX3VwZGF0ZVBsYWNlbWVudCh0aGlzLnBhaW50ZXIudHJhbnNmb3JtLCB0aGlzLnNob3dDb2xsaXNpb25Cb3hlcywgZmFkZUR1cmF0aW9uLCB0aGlzLl9jcm9zc1NvdXJjZUNvbGxpc2lvbnMpO1xuXG4gICAgICAgIC8vIEFjdHVhbGx5IGRyYXdcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMucGFpbnRlci5yZW5kZXIodGhpcy5zdHlsZSwge1xuICAgICAgICAgICAgICAgIHNob3dUaWxlQm91bmRhcmllczogdGhpcy5zaG93VGlsZUJvdW5kYXJpZXMsXG4gICAgICAgICAgICAgICAgc2hvd1RlcnJhaW5XaXJlZnJhbWU6IHRoaXMuc2hvd1RlcnJhaW5XaXJlZnJhbWUsXG4gICAgICAgICAgICAgICAgc2hvd092ZXJkcmF3SW5zcGVjdG9yOiB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IsXG4gICAgICAgICAgICAgICAgc2hvd1F1ZXJ5R2VvbWV0cnk6ICEhdGhpcy5fc2hvd1F1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgcm90YXRpbmc6IHRoaXMuaXNSb3RhdGluZygpLFxuICAgICAgICAgICAgICAgIHpvb21pbmc6IHRoaXMuaXNab29taW5nKCksXG4gICAgICAgICAgICAgICAgbW92aW5nOiB0aGlzLmlzTW92aW5nKCksXG4gICAgICAgICAgICAgICAgZmFkZUR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIGlzSW5pdGlhbExvYWQ6IHRoaXMuX2lzSW5pdGlhbExvYWQsXG4gICAgICAgICAgICAgICAgc2hvd1BhZGRpbmc6IHRoaXMuc2hvd1BhZGRpbmcsXG4gICAgICAgICAgICAgICAgZ3B1VGltaW5nOiAhIXRoaXMubGlzdGVucygnZ3B1LXRpbWluZy1sYXllcicpLFxuICAgICAgICAgICAgICAgIHNwZWVkSW5kZXhUaW1pbmc6IHRoaXMuc3BlZWRJbmRleFRpbWluZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncmVuZGVyJykpO1xuXG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCgpICYmICF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLm1hcmsoUGVyZm9ybWFuY2VNYXJrZXJzLmxvYWQpO1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbG9hZCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICh0aGlzLnN0eWxlLmhhc1RyYW5zaXRpb25zKCkgfHwgY3Jvc3NGYWRpbmcpKSB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICF0aGlzLl9wbGFjZW1lbnREaXJ0eSkge1xuICAgICAgICAgICAgLy8gU2luY2Ugbm8gZmFkZSBvcGVyYXRpb25zIGFyZSBpbiBwcm9ncmVzcywgd2UgY2FuIHJlbGVhc2VcbiAgICAgICAgICAgIC8vIGFsbCB0aWxlcyBoZWxkIGZvciBmYWRpbmcuIElmIHdlIGRpZG4ndCBkbyB0aGlzLCB0aGUgdGlsZXNcbiAgICAgICAgICAgIC8vIHdvdWxkIGp1c3Qgc2l0IGluIHRoZSBTb3VyY2VDYWNoZXMgdW50aWwgdGhlIG5leHQgcmVuZGVyXG4gICAgICAgICAgICB0aGlzLnN0eWxlLl9yZWxlYXNlU3ltYm9sRmFkZVRpbGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5saXN0ZW5zKCdncHUtdGltaW5nLWZyYW1lJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckNQVVRpbWUgPSBicm93c2VyLm5vdygpIC0gZnJhbWVTdGFydFRpbWU7XG4gICAgICAgICAgICBleHRUaW1lclF1ZXJ5LmVuZFF1ZXJ5RVhUKGV4dFRpbWVyUXVlcnkuVElNRV9FTEFQU0VEX0VYVCwgZ3B1VGltZXIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyR1BVVGltZSA9IGV4dFRpbWVyUXVlcnkuZ2V0UXVlcnlPYmplY3RFWFQoZ3B1VGltZXIsIGV4dFRpbWVyUXVlcnkuUVVFUllfUkVTVUxUX0VYVCkgLyAoMTAwMCAqIDEwMDApO1xuICAgICAgICAgICAgICAgIGV4dFRpbWVyUXVlcnkuZGVsZXRlUXVlcnlFWFQoZ3B1VGltZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2dwdS10aW1pbmctZnJhbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgIGNwdVRpbWU6IHJlbmRlckNQVVRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGdwdVRpbWU6IHJlbmRlckdQVVRpbWVcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9LCA1MCk7IC8vIFdhaXQgNTBtcyB0byBnaXZlIHRpbWUgZm9yIGFsbCBHUFUgY2FsbHMgdG8gZmluaXNoIGJlZm9yZSBxdWVyeWluZ1xuICAgICAgICB9XG5cbiAgICAgICAgUGVyZm9ybWFuY2VVdGlscy5lbmRNZWFzdXJlKG0pO1xuXG4gICAgICAgIGlmICh0aGlzLmxpc3RlbnMoJ2dwdS10aW1pbmctbGF5ZXInKSkge1xuICAgICAgICAgICAgLy8gUmVzZXR0aW5nIHRoZSBQYWludGVyJ3MgcGVyLWxheWVyIHRpbWluZyBxdWVyaWVzIGhlcmUgYWxsb3dzIHVzIHRvIGlzb2xhdGVcbiAgICAgICAgICAgIC8vIHRoZSBxdWVyaWVzIHRvIGluZGl2aWR1YWwgZnJhbWVzLlxuICAgICAgICAgICAgY29uc3QgZnJhbWVMYXllclF1ZXJpZXMgPSB0aGlzLnBhaW50ZXIuY29sbGVjdEdwdVRpbWVycygpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlZExheWVyVGltZXMgPSB0aGlzLnBhaW50ZXIucXVlcnlHcHVUaW1lcnMoZnJhbWVMYXllclF1ZXJpZXMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZ3B1LXRpbWluZy1sYXllcicsIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJUaW1lczogcmVuZGVyZWRMYXllclRpbWVzXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSwgNTApOyAvLyBXYWl0IDUwbXMgdG8gZ2l2ZSB0aW1lIGZvciBhbGwgR1BVIGNhbGxzIHRvIGZpbmlzaCBiZWZvcmUgcXVlcnlpbmdcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNjaGVkdWxlIGFub3RoZXIgcmVuZGVyIGZyYW1lIGlmIGl0J3MgbmVlZGVkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBFdmVuIHRob3VnaCBgX3N0eWxlRGlydHlgIGFuZCBgX3NvdXJjZXNEaXJ0eWAgYXJlIHJlc2V0IGluIHRoaXNcbiAgICAgICAgLy8gbWV0aG9kLCBzeW5jaHJvbm91cyBldmVudHMgZmlyZWQgZHVyaW5nIFN0eWxlI3VwZGF0ZSBvclxuICAgICAgICAvLyBTdHlsZSNfdXBkYXRlU291cmNlcyBjb3VsZCBoYXZlIGNhdXNlZCB0aGVtIHRvIGJlIHNldCBhZ2Fpbi5cbiAgICAgICAgY29uc3Qgc29tZXRoaW5nRGlydHkgPSB0aGlzLl9zb3VyY2VzRGlydHkgfHwgdGhpcy5fc3R5bGVEaXJ0eSB8fCB0aGlzLl9wbGFjZW1lbnREaXJ0eSB8fCBhdmVyYWdlRWxldmF0aW9uQ2hhbmdlZDtcbiAgICAgICAgaWYgKHNvbWV0aGluZ0RpcnR5IHx8IHRoaXMuX3JlcGFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlcGFpbnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHdpbGxJZGxlID0gIXRoaXMuaXNNb3ZpbmcoKSAmJiB0aGlzLmxvYWRlZCgpO1xuICAgICAgICAgICAgaWYgKHdpbGxJZGxlKSB7XG4gICAgICAgICAgICAgICAgLy8gQmVmb3JlIGlkbGluZywgd2UgcGVyZm9ybSBvbmUgbGFzdCBzYW1wbGUgc28gdGhhdCBpZiB0aGUgYXZlcmFnZSBlbGV2YXRpb25cbiAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBleGFjdGx5IG1hdGNoIHRoZSB0ZXJyYWluLCB3ZSBza2lwIGlkbGUgYW5kIGVhc2UgaXQgdG8gaXRzIGZpbmFsIHN0YXRlLlxuICAgICAgICAgICAgICAgIGF2ZXJhZ2VFbGV2YXRpb25DaGFuZ2VkID0gdGhpcy5fdXBkYXRlQXZlcmFnZUVsZXZhdGlvbihmcmFtZVN0YXJ0VGltZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhdmVyYWdlRWxldmF0aW9uQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlcGFpbnQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlckZyYW1lKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAod2lsbElkbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnaWRsZScpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsTG9hZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgb3B0aW9ucyB0byBzZWUgaWYgbmVlZCB0byBjYWxjdWxhdGUgdGhlIHNwZWVkIGluZGV4XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNwZWVkSW5kZXhUaW1pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwZWVkSW5kZXhOdW1iZXIgPSB0aGlzLl9jYWxjdWxhdGVTcGVlZEluZGV4KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdzcGVlZGluZGV4Y29tcGxldGVkJywge3NwZWVkSW5kZXg6IHNwZWVkSW5kZXhOdW1iZXJ9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWVkSW5kZXhUaW1pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9sb2FkZWQgJiYgIXRoaXMuX2Z1bGx5TG9hZGVkICYmICFzb21ldGhpbmdEaXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHlMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGxpbmUgaXMgYmlsbGluZyByZWxhdGVkIGNvZGUuIERvIG5vdCBjaGFuZ2UuIFNlZSBMSUNFTlNFLnR4dFxuICAgICAgICAgICAgdGhpcy5fYXV0aGVudGljYXRlKCk7XG4gICAgICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLm1hcmsoUGVyZm9ybWFuY2VNYXJrZXJzLmZ1bGxMb2FkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9mb3JjZU1hcmtlclVwZGF0ZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBtYXJrZXIgb2YgdGhpcy5fbWFya2Vycykge1xuICAgICAgICAgICAgbWFya2VyLl91cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXZlcmFnZSB2aXNpYmxlIGVsZXZhdGlvbiBieSBzYW1wbGluZyB0ZXJyYWluXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBlbGV2YXRpb24gaGFzIGNoYW5nZWQgZnJvbSB0aGUgbGFzdCBzYW1wbGluZ1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VwZGF0ZUF2ZXJhZ2VFbGV2YXRpb24odGltZVN0YW1wOiBudW1iZXIsIGlnbm9yZVRpbWVvdXQ6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhcHBseVVwZGF0ZSA9IHZhbHVlID0+IHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLmF2ZXJhZ2VFbGV2YXRpb24gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIXRoaXMucGFpbnRlci5hdmVyYWdlRWxldmF0aW9uTmVlZHNFYXNpbmcoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtLmF2ZXJhZ2VFbGV2YXRpb24gIT09IDApIHJldHVybiBhcHBseVVwZGF0ZSgwKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVvdXRFbGFwc2VkID0gaWdub3JlVGltZW91dCB8fCB0aW1lU3RhbXAgLSB0aGlzLl9hdmVyYWdlRWxldmF0aW9uTGFzdFNhbXBsZWRBdCA+IEFWRVJBR0VfRUxFVkFUSU9OX1NBTVBMSU5HX0lOVEVSVkFMO1xuXG4gICAgICAgIGlmICh0aW1lb3V0RWxhcHNlZCAmJiAhdGhpcy5fYXZlcmFnZUVsZXZhdGlvbi5pc0Vhc2luZyh0aW1lU3RhbXApKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50RWxldmF0aW9uID0gdGhpcy50cmFuc2Zvcm0uYXZlcmFnZUVsZXZhdGlvbjtcbiAgICAgICAgICAgIGxldCBuZXdFbGV2YXRpb24gPSB0aGlzLnRyYW5zZm9ybS5zYW1wbGVBdmVyYWdlRWxldmF0aW9uKCk7XG5cbiAgICAgICAgICAgIC8vIE5ldyBlbGV2YXRpb24gaXMgTmFOIGlmIG5vIHRlcnJhaW4gdGlsZXMgd2VyZSBhdmFpbGFibGVcbiAgICAgICAgICAgIGlmIChpc05hTihuZXdFbGV2YXRpb24pKSB7XG4gICAgICAgICAgICAgICAgbmV3RWxldmF0aW9uID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWN0aXZhdGUgdGhlIHRpbWVvdXQgaWYgbm8gZGF0YSB3YXMgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgdGhpcy5fYXZlcmFnZUVsZXZhdGlvbkxhc3RTYW1wbGVkQXQgPSB0aW1lU3RhbXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbGV2YXRpb25DaGFuZ2UgPSBNYXRoLmFicyhjdXJyZW50RWxldmF0aW9uIC0gbmV3RWxldmF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGVsZXZhdGlvbkNoYW5nZSA+IEFWRVJBR0VfRUxFVkFUSU9OX0VBU0VfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbExvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXZlcmFnZUVsZXZhdGlvbi5qdW1wVG8obmV3RWxldmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcGx5VXBkYXRlKG5ld0VsZXZhdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXZlcmFnZUVsZXZhdGlvbi5lYXNlVG8obmV3RWxldmF0aW9uLCB0aW1lU3RhbXAsIEFWRVJBR0VfRUxFVkFUSU9OX0VBU0VfVElNRSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGV2YXRpb25DaGFuZ2UgPiBBVkVSQUdFX0VMRVZBVElPTl9DSEFOR0VfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXZlcmFnZUVsZXZhdGlvbi5qdW1wVG8obmV3RWxldmF0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHlVcGRhdGUobmV3RWxldmF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9hdmVyYWdlRWxldmF0aW9uLmlzRWFzaW5nKHRpbWVTdGFtcCkpIHtcbiAgICAgICAgICAgIHJldHVybiBhcHBseVVwZGF0ZSh0aGlzLl9hdmVyYWdlRWxldmF0aW9uLmdldFZhbHVlKHRpbWVTdGFtcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKioqKiBTVEFSVCBXQVJOSU5HIC0gUkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhFXG4gICAgKiBGT0xMT1dJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKlxuICAgICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWQgdG8gYWNjZXNzIE1hcGJveCdzIEFQSXMuIFJlbW92YWwgb3IgbW9kaWZpY2F0aW9uXG4gICAgKiBvZiB0aGlzIGNvZGUgY2FuIHJlc3VsdCBpbiBoaWdoZXIgZmVlcyBhbmQvb3JcbiAgICAqIHRlcm1pbmF0aW9uIG9mIHlvdXIgYWNjb3VudCB3aXRoIE1hcGJveC5cbiAgICAqXG4gICAgKiBVbmRlciB0aGUgTWFwYm94IFRlcm1zIG9mIFNlcnZpY2UsIHlvdSBtYXkgbm90IHVzZSB0aGlzIGNvZGUgdG8gYWNjZXNzIE1hcGJveFxuICAgICogTWFwcGluZyBBUElzIG90aGVyIHRoYW4gdGhyb3VnaCBNYXBib3ggU0RLcy5cbiAgICAqXG4gICAgKiBUaGUgTWFwcGluZyBBUElzIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2FwaS9tYXBzLyNtYXBzXG4gICAgKiBhbmQgdGhlIE1hcGJveCBUZXJtcyBvZiBTZXJ2aWNlIGFyZSBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubWFwYm94LmNvbS90b3MvXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgX2F1dGhlbnRpY2F0ZSgpIHtcbiAgICAgICAgZ2V0TWFwU2Vzc2lvbkFQSSh0aGlzLl9nZXRNYXBJZCgpLCB0aGlzLl9yZXF1ZXN0TWFuYWdlci5fc2t1VG9rZW4sIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLl9jdXN0b21BY2Nlc3NUb2tlbiwgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIC8vIHRocm93aW5nIGFuIGVycm9yIGhlcmUgd2lsbCBjYXVzZSB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFnYWluIHVubmVjZXNzYXJpbHlcbiAgICAgICAgICAgICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09IEFVVEhfRVJSX01TRyB8fCBlcnIuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2wgPSB0aGlzLnBhaW50ZXIuY29udGV4dC5nbDtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVBdXRoU3RhdGUoZ2wsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xvZ29Db250cm9sIGluc3RhbmNlb2YgTG9nb0NvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ29Db250cm9sLl91cGRhdGVMb2dvKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGdsKSBnbC5jbGVhcihnbC5ERVBUSF9CVUZGRVJfQklUIHwgZ2wuQ09MT1JfQlVGRkVSX0JJVCB8IGdsLlNURU5DSUxfQlVGRkVSX0JJVCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zaWxlbmNlQXV0aEVycm9ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcignQSB2YWxpZCBNYXBib3ggYWNjZXNzIHRva2VuIGlzIHJlcXVpcmVkIHRvIHVzZSBNYXBib3ggR0wgSlMuIFRvIGNyZWF0ZSBhbiBhY2NvdW50IG9yIGEgbmV3IGFjY2VzcyB0b2tlbiwgdmlzaXQgaHR0cHM6Ly9hY2NvdW50Lm1hcGJveC5jb20vJykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBvc3RNYXBMb2FkRXZlbnQodGhpcy5fZ2V0TWFwSWQoKSwgdGhpcy5fcmVxdWVzdE1hbmFnZXIuX3NrdVRva2VuLCB0aGlzLl9yZXF1ZXN0TWFuYWdlci5fY3VzdG9tQWNjZXNzVG9rZW4sICgpID0+IHt9KTtcbiAgICB9XG5cbiAgICAvKioqKiogRU5EIFdBUk5JTkcgLSBSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSEVcbiAgICBQUkVDRURJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKi9cblxuICAgIF91cGRhdGVUZXJyYWluKCkge1xuICAgICAgICAvLyBSZWNhbGN1bGF0ZSBpZiBlbmFibGVkL2Rpc2FibGVkIGFuZCBjYWxjdWxhdGUgZWxldmF0aW9uIGNvdmVyLiBBcyBjYW1lcmEgaXMgdXNpbmcgZWxldmF0aW9uIHRpbGVzIGJlZm9yZVxuICAgICAgICAvLyByZW5kZXIgKGFuZCBkZWZlcnJlZCB1cGRhdGUgYWZ0ZXIgem9vbSByZWNhbGN1bGF0aW9uKSwgdGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgd2hlbiByZW1vdmluZyB0ZXJyYWluIHNvdXJjZS5cbiAgICAgICAgdGhpcy5wYWludGVyLnVwZGF0ZVRlcnJhaW4odGhpcy5zdHlsZSwgdGhpcy5pc01vdmluZygpIHx8IHRoaXMuaXNSb3RhdGluZygpIHx8IHRoaXMuaXNab29taW5nKCkpO1xuICAgIH1cblxuICAgIF9jYWxjdWxhdGVTcGVlZEluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGZpbmFsRnJhbWUgPSB0aGlzLnBhaW50ZXIuY2FudmFzQ29weSgpO1xuICAgICAgICBjb25zdCBjYW52YXNDb3B5SW5zdGFuY2VzID0gdGhpcy5wYWludGVyLmdldENhbnZhc0NvcGllc0FuZFRpbWVzdGFtcHMoKTtcbiAgICAgICAgY2FudmFzQ29weUluc3RhbmNlcy50aW1lU3RhbXBzLnB1c2gocGVyZm9ybWFuY2Uubm93KCkpO1xuXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5wYWludGVyLmNvbnRleHQuZ2w7XG4gICAgICAgIGNvbnN0IGZyYW1lYnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlcik7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVhZCh0ZXh0dXJlKSB7XG4gICAgICAgICAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUsIDApO1xuICAgICAgICAgICAgY29uc3QgcGl4ZWxzID0gbmV3IFVpbnQ4QXJyYXkoZ2wuZHJhd2luZ0J1ZmZlcldpZHRoICogZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCAqIDQpO1xuICAgICAgICAgICAgZ2wucmVhZFBpeGVscygwLCAwLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHQsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHBpeGVscyk7XG4gICAgICAgICAgICByZXR1cm4gcGl4ZWxzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhc1BpeGVsQ29tcGFyaXNvbihyZWFkKGZpbmFsRnJhbWUpLCBjYW52YXNDb3B5SW5zdGFuY2VzLmNhbnZhc0NvcGllcy5tYXAocmVhZCksIGNhbnZhc0NvcHlJbnN0YW5jZXMudGltZVN0YW1wcyk7XG4gICAgfVxuXG4gICAgX2NhbnZhc1BpeGVsQ29tcGFyaXNvbihmaW5hbEZyYW1lOiBVaW50OEFycmF5LCBhbGxGcmFtZXM6IFVpbnQ4QXJyYXlbXSwgdGltZVN0YW1wczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgICAgICBsZXQgZmluYWxTY29yZSA9IHRpbWVTdGFtcHNbMV0gLSB0aW1lU3RhbXBzWzBdO1xuICAgICAgICBjb25zdCBudW1QaXhlbHMgPSBmaW5hbEZyYW1lLmxlbmd0aCAvIDQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxGcmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZyYW1lID0gYWxsRnJhbWVzW2ldO1xuICAgICAgICAgICAgbGV0IGNudCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGZyYW1lLmxlbmd0aDsgaiArPSA0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lW2pdID09PSBmaW5hbEZyYW1lW2pdICYmXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lW2ogKyAxXSA9PT0gZmluYWxGcmFtZVtqICsgMV0gJiZcbiAgICAgICAgICAgICAgICAgICAgZnJhbWVbaiArIDJdID09PSBmaW5hbEZyYW1lW2ogKyAyXSAmJlxuICAgICAgICAgICAgICAgICAgICBmcmFtZVtqICsgM10gPT09IGZpbmFsRnJhbWVbaiArIDNdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNudCA9IGNudCArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jYWxjdWxhdGUgdGhlICUgdmlzdWFsIGNvbXBsZXRlbmVzc1xuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSB0aW1lU3RhbXBzW2kgKyAyXSAtIHRpbWVTdGFtcHNbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgdmlzdWFsQ29tcGxldG5lc3MgPSBjbnQgLyBudW1QaXhlbHM7XG4gICAgICAgICAgICBmaW5hbFNjb3JlICs9ICBpbnRlcnZhbCAqICgxIC0gdmlzdWFsQ29tcGxldG5lc3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbFNjb3JlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFuIHVwIGFuZCByZWxlYXNlIGFsbCBpbnRlcm5hbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFwLlxuICAgICAqXG4gICAgICogVGhpcyBpbmNsdWRlcyBET00gZWxlbWVudHMsIGV2ZW50IGJpbmRpbmdzLCB3ZWIgd29ya2VycywgYW5kIFdlYkdMIHJlc291cmNlcy5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIG1ldGhvZCB3aGVuIHlvdSBhcmUgZG9uZSB1c2luZyB0aGUgbWFwIGFuZCB3aXNoIHRvIGVuc3VyZSB0aGF0IGl0IG5vXG4gICAgICogbG9uZ2VyIGNvbnN1bWVzIGJyb3dzZXIgcmVzb3VyY2VzLiBBZnRlcndhcmRzLCB5b3UgbXVzdCBub3QgY2FsbCBhbnkgb3RoZXJcbiAgICAgKiBtZXRob2RzIG9uIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5yZW1vdmUoKTtcbiAgICAgKi9cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNoKSB0aGlzLl9oYXNoLnJlbW92ZSgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLl9jb250cm9scykgY29udHJvbC5vblJlbW92ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5fY29udHJvbHMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5fZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5jbGVhcigpO1xuICAgICAgICB0aGlzLl9kb21SZW5kZXJUYXNrUXVldWUuY2xlYXIoKTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFpbnRlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMuZGVzdHJveSgpO1xuICAgICAgICBkZWxldGUgdGhpcy5oYW5kbGVycztcbiAgICAgICAgdGhpcy5zZXRTdHlsZShudWxsKTtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fb25XaW5kb3dSZXNpemUsIGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdvcmllbnRhdGlvbmNoYW5nZScsIHRoaXMuX29uV2luZG93UmVzaXplLCBmYWxzZSk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2Via2l0ZnVsbHNjcmVlbmNoYW5nZScsIHRoaXMuX29uV2luZG93UmVzaXplLCBmYWxzZSk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb25saW5lJywgdGhpcy5fb25XaW5kb3dPbmxpbmUsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHRoaXMucGFpbnRlci5jb250ZXh0LmdsLmdldEV4dGVuc2lvbignV0VCR0xfbG9zZV9jb250ZXh0Jyk7XG4gICAgICAgIGlmIChleHRlbnNpb24pIGV4dGVuc2lvbi5sb3NlQ29udGV4dCgpO1xuICAgICAgICByZW1vdmVOb2RlKHRoaXMuX2NhbnZhc0NvbnRhaW5lcik7XG4gICAgICAgIHJlbW92ZU5vZGUodGhpcy5fY29udHJvbENvbnRhaW5lcik7XG4gICAgICAgIHJlbW92ZU5vZGUodGhpcy5fbWlzc2luZ0NTU0NhbmFyeSk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1tYXAnKTtcblxuICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLmNsZWFyTWV0cmljcygpO1xuICAgICAgICByZW1vdmVBdXRoU3RhdGUodGhpcy5wYWludGVyLmNvbnRleHQuZ2wpO1xuICAgICAgICB0aGlzLl9yZW1vdmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncmVtb3ZlJykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWdnZXIgdGhlIHJlbmRlcmluZyBvZiBhIHNpbmdsZSBmcmFtZS4gVXNlIHRoaXMgbWV0aG9kIHdpdGggY3VzdG9tIGxheWVycyB0b1xuICAgICAqIHJlcGFpbnQgdGhlIG1hcCB3aGVuIHRoZSBsYXllcidzIHByb3BlcnRpZXMgb3IgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhlXG4gICAgICogbGF5ZXIncyBzb3VyY2UgY2hhbmdlLiBDYWxsaW5nIHRoaXMgbXVsdGlwbGUgdGltZXMgYmVmb3JlIHRoZVxuICAgICAqIG5leHQgZnJhbWUgaXMgcmVuZGVyZWQgd2lsbCBzdGlsbCByZXN1bHQgaW4gb25seSBhIHNpbmdsZSBmcmFtZSBiZWluZyByZW5kZXJlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnRyaWdnZXJSZXBhaW50KCk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogQWRkIGEgM0QgbW9kZWxdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC0zZC1tb2RlbC8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQWRkIGFuIGFuaW1hdGVkIGljb24gdG8gdGhlIG1hcF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWltYWdlLWFuaW1hdGVkLylcbiAgICAgKi9cbiAgICB0cmlnZ2VyUmVwYWludCgpIHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckZyYW1lKHRydWUpO1xuICAgIH1cblxuICAgIF90cmlnZ2VyRnJhbWUocmVuZGVyOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlck5leHRGcmFtZSA9IHRoaXMuX3JlbmRlck5leHRGcmFtZSB8fCByZW5kZXI7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICF0aGlzLl9mcmFtZSkge1xuICAgICAgICAgICAgdGhpcy5fZnJhbWUgPSBicm93c2VyLmZyYW1lKChwYWludFN0YXJ0VGltZVN0YW1wOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1JlbmRlckZyYW1lID0gISF0aGlzLl9yZW5kZXJOZXh0RnJhbWU7XG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VVdGlscy5mcmFtZShwYWludFN0YXJ0VGltZVN0YW1wLCBpc1JlbmRlckZyYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyTmV4dEZyYW1lID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZW5kZXJGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXIocGFpbnRTdGFydFRpbWVTdGFtcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVsb2FkcyBhbGwgdGlsZXMgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCBmb3Igb25lIG9yIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9uc1xuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGB0aGlzYCB8IFByb21pc2UuXG4gICAgICovXG4gICAgX3ByZWxvYWRUaWxlcyh0cmFuc2Zvcm06IFRyYW5zZm9ybSB8IEFycmF5PFRyYW5zZm9ybT4pIHtcbiAgICAgICAgY29uc3Qgc291cmNlczogQXJyYXk8U291cmNlQ2FjaGU+ID0gdGhpcy5zdHlsZSAmJiAoT2JqZWN0LnZhbHVlcyh0aGlzLnN0eWxlLl9zb3VyY2VDYWNoZXMpOiBhbnkpIHx8IFtdO1xuICAgICAgICBhc3luY0FsbChzb3VyY2VzLCAoc291cmNlLCBkb25lKSA9PiBzb3VyY2UuX3ByZWxvYWRUaWxlcyh0cmFuc2Zvcm0sIGRvbmUpLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJSZXBhaW50KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9vbldpbmRvd09ubGluZSgpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgX29uV2luZG93UmVzaXplKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5fdHJhY2tSZXNpemUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplKHtvcmlnaW5hbEV2ZW50OiBldmVudH0pLl91cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7RGVidWcgZmVhdHVyZXN9ICovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCB3aWxsIHJlbmRlciBhbiBvdXRsaW5lXG4gICAgICogYXJvdW5kIGVhY2ggdGlsZSBhbmQgdGhlIHRpbGUgSUQuIFRoZXNlIHRpbGUgYm91bmRhcmllcyBhcmUgdXNlZnVsIGZvclxuICAgICAqIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIFRoZSB1bmNvbXByZXNzZWQgZmlsZSBzaXplIG9mIHRoZSBmaXJzdCB2ZWN0b3Igc291cmNlIGlzIGRyYXduIGluIHRoZSB0b3AgbGVmdFxuICAgICAqIGNvcm5lciBvZiBlYWNoIHRpbGUsIG5leHQgdG8gdGhlIHRpbGUgSUQuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93VGlsZUJvdW5kYXJpZXNcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2hvd1RpbGVCb3VuZGFyaWVzID0gdHJ1ZTtcbiAgICAgKi9cbiAgICBnZXQgc2hvd1RpbGVCb3VuZGFyaWVzKCk6IGJvb2xlYW4geyByZXR1cm4gISF0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXM7IH1cbiAgICBzZXQgc2hvd1RpbGVCb3VuZGFyaWVzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXMgPT09IHZhbHVlKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3Nob3dUaWxlQm91bmRhcmllcyA9IHZhbHVlO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCB3aWxsIHJlbmRlciBhIHdpcmVmcmFtZVxuICAgICAqIG9uIHRvcCBvZiB0aGUgZGlzcGxheWVkIHRlcnJhaW4uIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogVGhlIHdpcmVmcmFtZSBpcyBhbHdheXMgcmVkIGFuZCBpcyBkcmF3biBvbmx5IHdoZW4gdGVycmFpbiBpcyBhY3RpdmUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93VGVycmFpbldpcmVmcmFtZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zaG93VGVycmFpbldpcmVmcmFtZSA9IHRydWU7XG4gICAgICovXG4gICAgZ2V0IHNob3dUZXJyYWluV2lyZWZyYW1lKCk6IGJvb2xlYW4geyByZXR1cm4gISF0aGlzLl9zaG93VGVycmFpbldpcmVmcmFtZTsgfVxuICAgIHNldCBzaG93VGVycmFpbldpcmVmcmFtZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fc2hvd1RlcnJhaW5XaXJlZnJhbWUgPT09IHZhbHVlKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3Nob3dUZXJyYWluV2lyZWZyYW1lID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3BlZWRpbmRleCBtZXRyaWMgY2FsY3VsYXRpb24gaXMgb24gb3Igb2ZmXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNwZWVkSW5kZXhUaW1pbmdcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc3BlZWRJbmRleFRpbWluZyA9IHRydWU7XG4gICAgICovXG4gICAgZ2V0IHNwZWVkSW5kZXhUaW1pbmcoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3NwZWVkSW5kZXhUaW1pbmc7IH1cbiAgICBzZXQgc3BlZWRJbmRleFRpbWluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fc3BlZWRJbmRleFRpbWluZyA9PT0gdmFsdWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5fc3BlZWRJbmRleFRpbWluZyA9IHZhbHVlO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCB3aWxsIHZpc3VhbGl6ZVxuICAgICAqIHRoZSBwYWRkaW5nIG9mZnNldHMuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93UGFkZGluZ1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKi9cbiAgICBnZXQgc2hvd1BhZGRpbmcoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3Nob3dQYWRkaW5nOyB9XG4gICAgc2V0IHNob3dQYWRkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93UGFkZGluZyA9PT0gdmFsdWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5fc2hvd1BhZGRpbmcgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgd2lsbCByZW5kZXIgYm94ZXNcbiAgICAgKiBhcm91bmQgYWxsIHN5bWJvbHMgaW4gdGhlIGRhdGEgc291cmNlLCByZXZlYWxpbmcgd2hpY2ggc3ltYm9sc1xuICAgICAqIHdlcmUgcmVuZGVyZWQgb3Igd2hpY2ggd2VyZSBoaWRkZW4gZHVlIHRvIGNvbGxpc2lvbnMuXG4gICAgICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEBuYW1lIHNob3dDb2xsaXNpb25Cb3hlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKi9cbiAgICBnZXQgc2hvd0NvbGxpc2lvbkJveGVzKCk6IGJvb2xlYW4geyByZXR1cm4gISF0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXM7IH1cbiAgICBzZXQgc2hvd0NvbGxpc2lvbkJveGVzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMgPT09IHZhbHVlKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcyA9IHZhbHVlO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgdHVybiBjb2xsaXNpb24gYm94ZXMgb24gd2UgaGF2ZSB0byBnZW5lcmF0ZSB0aGVtIGZvciBleGlzdGluZyB0aWxlc1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSB0dXJuIHRoZW0gb2ZmLCB0aGVyZSdzIG5vIGNvc3QgdG8gbGVhdmluZyBleGlzdGluZyBib3hlcyBpbiBwbGFjZVxuICAgICAgICAgICAgdGhpcy5zdHlsZS5fZ2VuZXJhdGVDb2xsaXNpb25Cb3hlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjYWxsIGFuIHVwZGF0ZSB0byByZW1vdmUgY29sbGlzaW9uIGJveGVzXG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgc2hvdWxkIGNvbG9yLWNvZGVcbiAgICAgKiBlYWNoIGZyYWdtZW50IHRvIHNob3cgaG93IG1hbnkgdGltZXMgaXQgaGFzIGJlZW4gc2hhZGVkLlxuICAgICAqIFdoaXRlIGZyYWdtZW50cyBoYXZlIGJlZW4gc2hhZGVkIDggb3IgbW9yZSB0aW1lcy5cbiAgICAgKiBCbGFjayBmcmFnbWVudHMgaGF2ZSBiZWVuIHNoYWRlZCAwIHRpbWVzLlxuICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93T3ZlcmRyYXdcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICovXG4gICAgZ2V0IHNob3dPdmVyZHJhd0luc3BlY3RvcigpOiBib29sZWFuIHsgcmV0dXJuICEhdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yOyB9XG4gICAgc2V0IHNob3dPdmVyZHJhd0luc3BlY3Rvcih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgd2lsbFxuICAgICAqIGNvbnRpbnVvdXNseSByZXBhaW50LiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBmb3IgYW5hbHl6aW5nIHBlcmZvcm1hbmNlLlxuICAgICAqXG4gICAgICogQG5hbWUgcmVwYWludFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKi9cbiAgICBnZXQgcmVwYWludCgpOiBib29sZWFuIHsgcmV0dXJuICEhdGhpcy5fcmVwYWludDsgfVxuICAgIHNldCByZXBhaW50KHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXBhaW50ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVwYWludCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHNob3cgdmVydGljZXNcbiAgICBnZXQgdmVydGljZXMoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3ZlcnRpY2VzOyB9XG4gICAgc2V0IHZlcnRpY2VzKHZhbHVlOiBib29sZWFuKSB7IHRoaXMuX3ZlcnRpY2VzID0gdmFsdWU7IHRoaXMuX3VwZGF0ZSgpOyB9XG5cbiAgICAvLyBmb3IgY2FjaGUgYnJvd3NlciB0ZXN0c1xuICAgIF9zZXRDYWNoZUxpbWl0cyhsaW1pdDogbnVtYmVyLCBjaGVja1RocmVzaG9sZDogbnVtYmVyKSB7XG4gICAgICAgIHNldENhY2hlTGltaXRzKGxpbWl0LCBjaGVja1RocmVzaG9sZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgTWFwYm94IEdMIEpTIGluIHVzZSBhcyBzcGVjaWZpZWQgaW4gcGFja2FnZS5qc29uLCBDSEFOR0VMT0cubWQsIGFuZCB0aGUgR2l0SHViIHJlbGVhc2UuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2ZXJzaW9uXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEB2YXIge3N0cmluZ30gdmVyc2lvblxuICAgICAqL1xuXG4gICAgZ2V0IHZlcnNpb24oKTogc3RyaW5nIHsgcmV0dXJuIHZlcnNpb247IH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFwO1xuXG5mdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBpbnRlcmFjdGl2ZSBjb250cm9scyBhZGRlZCB0byB0aGUgbWFwLiBUaGlzIGlzIGFcbiAqIHNwZWNpZmljYXRpb24gZm9yIGltcGxlbWVudGVycyB0byBtb2RlbDogaXQgaXMgbm90XG4gKiBhbiBleHBvcnRlZCBtZXRob2Qgb3IgY2xhc3MuXG4gKlxuICogQ29udHJvbHMgbXVzdCBpbXBsZW1lbnQgYG9uQWRkYCBhbmQgYG9uUmVtb3ZlYCwgYW5kIG11c3Qgb3duIGFuXG4gKiBlbGVtZW50LCB3aGljaCBpcyBvZnRlbiBhIGBkaXZgIGVsZW1lbnQuIFRvIHVzZSBNYXBib3ggR0wgSlMnc1xuICogZGVmYXVsdCBjb250cm9sIHN0eWxpbmcsIGFkZCB0aGUgYG1hcGJveGdsLWN0cmxgIGNsYXNzIHRvIHlvdXIgY29udHJvbCdzXG4gKiBub2RlLlxuICpcbiAqIEBpbnRlcmZhY2UgSUNvbnRyb2xcbiAqIEBleGFtcGxlXG4gKiAvLyBDb250cm9sIGltcGxlbWVudGVkIGFzIEVTNiBjbGFzc1xuICogY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2wge1xuICogICAgIG9uQWRkKG1hcCkge1xuICogICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gKiAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIudGV4dENvbnRlbnQgPSAnSGVsbG8sIHdvcmxkJztcbiAqICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAqICAgICB9XG4gKlxuICogICAgIG9uUmVtb3ZlKCkge1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpO1xuICogICAgICAgICB0aGlzLl9tYXAgPSB1bmRlZmluZWQ7XG4gKiAgICAgfVxuICogfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb250cm9sIGltcGxlbWVudGVkIGFzIEVTNSBwcm90b3R5cGljYWwgY2xhc3NcbiAqIGZ1bmN0aW9uIEhlbGxvV29ybGRDb250cm9sKCkgeyB9XG4gKlxuICogSGVsbG9Xb3JsZENvbnRyb2wucHJvdG90eXBlLm9uQWRkID0gZnVuY3Rpb24obWFwKSB7XG4gKiAgICAgdGhpcy5fbWFwID0gbWFwO1xuICogICAgIHRoaXMuX2NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICogICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc05hbWUgPSAnbWFwYm94Z2wtY3RybCc7XG4gKiAgICAgdGhpcy5fY29udGFpbmVyLnRleHRDb250ZW50ID0gJ0hlbGxvLCB3b3JsZCc7XG4gKiAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAqIH07XG4gKlxuICogSGVsbG9Xb3JsZENvbnRyb2wucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICogICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gKiAgICAgdGhpcy5fbWFwID0gdW5kZWZpbmVkO1xuICogfTtcbiAqL1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgY29udHJvbCBvbiB0aGUgbWFwIGFuZCBnaXZlIGl0IGEgY2hhbmNlIHRvIHJlZ2lzdGVyIGV2ZW50IGxpc3RlbmVyc1xuICogYW5kIHJlc291cmNlcy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHtAbGluayBNYXAjYWRkQ29udHJvbH1cbiAqIGludGVybmFsbHkuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgSUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgb25BZGRcbiAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcCB0aGlzIGNvbnRyb2wgd2lsbCBiZSBhZGRlZCB0by5cbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIGNvbnRyb2wncyBjb250YWluZXIgZWxlbWVudC4gVGhpcyBzaG91bGRcbiAqIGJlIGNyZWF0ZWQgYnkgdGhlIGNvbnRyb2wgYW5kIHJldHVybmVkIGJ5IG9uQWRkIHdpdGhvdXQgYmVpbmcgYXR0YWNoZWRcbiAqIHRvIHRoZSBET006IHRoZSBtYXAgd2lsbCBpbnNlcnQgdGhlIGNvbnRyb2wncyBlbGVtZW50IGludG8gdGhlIERPTVxuICogYXMgbmVjZXNzYXJ5LlxuICovXG5cbi8qKlxuICogVW5yZWdpc3RlciBhIGNvbnRyb2wgb24gdGhlIG1hcCBhbmQgZ2l2ZSBpdCBhIGNoYW5jZSB0byBkZXRhY2ggZXZlbnQgbGlzdGVuZXJzXG4gKiBhbmQgcmVzb3VyY2VzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkge0BsaW5rIE1hcCNyZW1vdmVDb250cm9sfVxuICogaW50ZXJuYWxseS5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBJQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvblJlbW92ZVxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY29udHJvbCB3aWxsIGJlIHJlbW92ZWQgZnJvbS5cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9IFRoZXJlIGlzIG5vIHJlcXVpcmVkIHJldHVybiB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuXG4gKi9cblxuLyoqXG4gKiBPcHRpb25hbGx5IHByb3ZpZGUgYSBkZWZhdWx0IHBvc2l0aW9uIGZvciB0aGlzIGNvbnRyb2wuIElmIHRoaXMgbWV0aG9kXG4gKiBpcyBpbXBsZW1lbnRlZCBhbmQge0BsaW5rIE1hcCNhZGRDb250cm9sfSBpcyBjYWxsZWQgd2l0aG91dCB0aGUgYHBvc2l0aW9uYFxuICogcGFyYW1ldGVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0RGVmYXVsdFBvc2l0aW9uIHdpbGwgYmUgdXNlZCBhcyB0aGVcbiAqIGNvbnRyb2wncyBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBJQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBnZXREZWZhdWx0UG9zaXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgY29udHJvbCBwb3NpdGlvbiwgb25lIG9mIHRoZSB2YWx1ZXMgdmFsaWQgaW4gYWRkQ29udHJvbC5cbiAqL1xuXG4vKipcbiAqIEEgW2BQb2ludGAgZ2VvbWV0cnldKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvcG9pbnQtZ2VvbWV0cnkpIG9iamVjdCwgd2hpY2ggaGFzXG4gKiBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzIHJlcHJlc2VudGluZyBzY3JlZW4gY29vcmRpbmF0ZXMgaW4gcGl4ZWxzLlxuICpcbiAqIEB0eXBlZGVmIHtQb2ludH0gUG9pbnRcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBwb2ludCA9IG5ldyBtYXBib3hnbC5Qb2ludCgtNzcsIDM4KTtcbiAqL1xuXG4vKipcbiAqIEEge0BsaW5rIFBvaW50fSBvciBhbiBhcnJheSBvZiB0d28gbnVtYmVycyByZXByZXNlbnRpbmcgYHhgIGFuZCBgeWAgc2NyZWVuIGNvb3JkaW5hdGVzIGluIHBpeGVscy5cbiAqXG4gKiBAdHlwZWRlZiB7KFBvaW50IHwgQXJyYXk8bnVtYmVyPil9IFBvaW50TGlrZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHAxID0gbmV3IG1hcGJveGdsLlBvaW50KC03NywgMzgpOyAvLyBhIFBvaW50TGlrZSB3aGljaCBpcyBhIFBvaW50XG4gKiBjb25zdCBwMiA9IFstNzcsIDM4XTsgLy8gYSBQb2ludExpa2Ugd2hpY2ggaXMgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnNcbiAqL1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERPTSBmcm9tICcuLi8uLi91dGlsL2RvbS5qcyc7XG5pbXBvcnQge2V4dGVuZCwgYmluZEFsbH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7TW91c2VSb3RhdGVIYW5kbGVyLCBNb3VzZVBpdGNoSGFuZGxlcn0gZnJvbSAnLi4vaGFuZGxlci9tb3VzZS5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uLy4uL3V0aWwvd2luZG93LmpzJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcC5qcyc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBzaG93Q29tcGFzcz86IGJvb2xlYW4sXG4gICAgc2hvd1pvb20/OiBib29sZWFuLFxuICAgIHZpc3VhbGl6ZVBpdGNoPzogYm9vbGVhblxufTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgc2hvd0NvbXBhc3M6IHRydWUsXG4gICAgc2hvd1pvb206IHRydWUsXG4gICAgdmlzdWFsaXplUGl0Y2g6IGZhbHNlXG59O1xuXG4vKipcbiAqIEEgYE5hdmlnYXRpb25Db250cm9sYCBjb250cm9sIGNvbnRhaW5zIHpvb20gYnV0dG9ucyBhbmQgYSBjb21wYXNzLlxuICogQWRkIHRoaXMgY29udHJvbCB0byBhIG1hcCB1c2luZyB7QGxpbmsgTWFwI2FkZENvbnRyb2x9LlxuICpcbiAqIEBpbXBsZW1lbnRzIHtJQ29udHJvbH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2hvd0NvbXBhc3M9dHJ1ZV0gSWYgYHRydWVgIHRoZSBjb21wYXNzIGJ1dHRvbiBpcyBpbmNsdWRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2hvd1pvb209dHJ1ZV0gSWYgYHRydWVgIHRoZSB6b29tLWluIGFuZCB6b29tLW91dCBidXR0b25zIGFyZSBpbmNsdWRlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudmlzdWFsaXplUGl0Y2g9ZmFsc2VdIElmIGB0cnVlYCB0aGUgcGl0Y2ggaXMgdmlzdWFsaXplZCBieSByb3RhdGluZyBYLWF4aXMgb2YgY29tcGFzcy5cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBuYXYgPSBuZXcgbWFwYm94Z2wuTmF2aWdhdGlvbkNvbnRyb2woKTtcbiAqIG1hcC5hZGRDb250cm9sKG5hdiwgJ3RvcC1sZWZ0Jyk7XG4gKiBAZXhhbXBsZVxuICogY29uc3QgbmF2ID0gbmV3IG1hcGJveGdsLk5hdmlnYXRpb25Db250cm9sKHtcbiAqICAgICB2aXN1YWxpemVQaXRjaDogdHJ1ZVxuICogfSk7XG4gKiBtYXAuYWRkQ29udHJvbChuYXYsICdib3R0b20tcmlnaHQnKTtcbiAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgbWFwIG5hdmlnYXRpb24gY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbmF2aWdhdGlvbi8pXG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSB0aGlyZCBwYXJ0eSB2ZWN0b3IgdGlsZSBzb3VyY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdGhpcmQtcGFydHkvKVxuICovXG5jbGFzcyBOYXZpZ2F0aW9uQ29udHJvbCB7XG4gICAgX21hcDogTWFwO1xuICAgIG9wdGlvbnM6IE9wdGlvbnM7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX3pvb21JbkJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgX3pvb21PdXRCdXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xuICAgIF9jb21wYXNzOiBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBfY29tcGFzc0ljb246IEhUTUxFbGVtZW50O1xuICAgIF9oYW5kbGVyOiBNb3VzZVJvdGF0ZVdyYXBwZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtZ3JvdXAnKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgKGUpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93Wm9vbSkge1xuICAgICAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAgICAgJ19zZXRCdXR0b25UaXRsZScsXG4gICAgICAgICAgICAgICAgJ191cGRhdGVab29tQnV0dG9ucydcbiAgICAgICAgICAgIF0sIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fem9vbUluQnV0dG9uID0gdGhpcy5fY3JlYXRlQnV0dG9uKCdtYXBib3hnbC1jdHJsLXpvb20taW4nLCAoZSkgPT4gdGhpcy5fbWFwLnpvb21Jbih7fSwge29yaWdpbmFsRXZlbnQ6IGV9KSk7XG4gICAgICAgICAgICBET00uY3JlYXRlKCdzcGFuJywgYG1hcGJveGdsLWN0cmwtaWNvbmAsIHRoaXMuX3pvb21JbkJ1dHRvbikuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fem9vbU91dEJ1dHRvbiA9IHRoaXMuX2NyZWF0ZUJ1dHRvbignbWFwYm94Z2wtY3RybC16b29tLW91dCcsIChlKSA9PiB0aGlzLl9tYXAuem9vbU91dCh7fSwge29yaWdpbmFsRXZlbnQ6IGV9KSk7XG4gICAgICAgICAgICBET00uY3JlYXRlKCdzcGFuJywgYG1hcGJveGdsLWN0cmwtaWNvbmAsIHRoaXMuX3pvb21PdXRCdXR0b24pLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dDb21wYXNzKSB7XG4gICAgICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICAgICAnX3JvdGF0ZUNvbXBhc3NBcnJvdydcbiAgICAgICAgICAgIF0sIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fY29tcGFzcyA9IHRoaXMuX2NyZWF0ZUJ1dHRvbignbWFwYm94Z2wtY3RybC1jb21wYXNzJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnZpc3VhbGl6ZVBpdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5yZXNldE5vcnRoUGl0Y2goe30sIHtvcmlnaW5hbEV2ZW50OiBlfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLnJlc2V0Tm9ydGgoe30sIHtvcmlnaW5hbEV2ZW50OiBlfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9jb21wYXNzSWNvbiA9IERPTS5jcmVhdGUoJ3NwYW4nLCAnbWFwYm94Z2wtY3RybC1pY29uJywgdGhpcy5fY29tcGFzcyk7XG4gICAgICAgICAgICB0aGlzLl9jb21wYXNzSWNvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlWm9vbUJ1dHRvbnMoKSB7XG4gICAgICAgIGNvbnN0IHpvb20gPSB0aGlzLl9tYXAuZ2V0Wm9vbSgpO1xuICAgICAgICBjb25zdCBpc01heCA9IHpvb20gPT09IHRoaXMuX21hcC5nZXRNYXhab29tKCk7XG4gICAgICAgIGNvbnN0IGlzTWluID0gem9vbSA9PT0gdGhpcy5fbWFwLmdldE1pblpvb20oKTtcbiAgICAgICAgdGhpcy5fem9vbUluQnV0dG9uLmRpc2FibGVkID0gaXNNYXg7XG4gICAgICAgIHRoaXMuX3pvb21PdXRCdXR0b24uZGlzYWJsZWQgPSBpc01pbjtcbiAgICAgICAgdGhpcy5fem9vbUluQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsIGlzTWF4LnRvU3RyaW5nKCkpO1xuICAgICAgICB0aGlzLl96b29tT3V0QnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsIGlzTWluLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIF9yb3RhdGVDb21wYXNzQXJyb3coKSB7XG4gICAgICAgIGNvbnN0IHJvdGF0ZSA9IHRoaXMub3B0aW9ucy52aXN1YWxpemVQaXRjaCA/XG4gICAgICAgICAgICBgc2NhbGUoJHsxIC8gTWF0aC5wb3coTWF0aC5jb3ModGhpcy5fbWFwLnRyYW5zZm9ybS5waXRjaCAqIChNYXRoLlBJIC8gMTgwKSksIDAuNSl9KSByb3RhdGVYKCR7dGhpcy5fbWFwLnRyYW5zZm9ybS5waXRjaH1kZWcpIHJvdGF0ZVooJHt0aGlzLl9tYXAudHJhbnNmb3JtLmFuZ2xlICogKDE4MCAvIE1hdGguUEkpfWRlZylgIDpcbiAgICAgICAgICAgIGByb3RhdGUoJHt0aGlzLl9tYXAudHJhbnNmb3JtLmFuZ2xlICogKDE4MCAvIE1hdGguUEkpfWRlZylgO1xuXG4gICAgICAgIHRoaXMuX21hcC5fcmVxdWVzdERvbVRhc2soKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXBhc3NJY29uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tcGFzc0ljb24uc3R5bGUudHJhbnNmb3JtID0gcm90YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1pvb20pIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEJ1dHRvblRpdGxlKHRoaXMuX3pvb21JbkJ1dHRvbiwgJ1pvb21JbicpO1xuICAgICAgICAgICAgdGhpcy5fc2V0QnV0dG9uVGl0bGUodGhpcy5fem9vbU91dEJ1dHRvbiwgJ1pvb21PdXQnKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignem9vbScsIHRoaXMuX3VwZGF0ZVpvb21CdXR0b25zKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVpvb21CdXR0b25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93Q29tcGFzcykge1xuICAgICAgICAgICAgdGhpcy5fc2V0QnV0dG9uVGl0bGUodGhpcy5fY29tcGFzcywgJ1Jlc2V0QmVhcmluZycpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy52aXN1YWxpemVQaXRjaCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5vbigncGl0Y2gnLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdyb3RhdGUnLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpO1xuICAgICAgICAgICAgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KCk7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVyID0gbmV3IE1vdXNlUm90YXRlV3JhcHBlcih0aGlzLl9tYXAsIHRoaXMuX2NvbXBhc3MsIHRoaXMub3B0aW9ucy52aXN1YWxpemVQaXRjaCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dab29tKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCd6b29tJywgdGhpcy5fdXBkYXRlWm9vbUJ1dHRvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0NvbXBhc3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdwaXRjaCcsIHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdyb3RhdGUnLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlci5vZmYoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9oYW5kbGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuX21hcDtcbiAgICB9XG5cbiAgICBfY3JlYXRlQnV0dG9uKGNsYXNzTmFtZTogc3RyaW5nLCBmbjogKCkgPT4gbWl4ZWQpIHtcbiAgICAgICAgY29uc3QgYSA9IERPTS5jcmVhdGUoJ2J1dHRvbicsIGNsYXNzTmFtZSwgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgYS50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIGEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmbik7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIF9zZXRCdXR0b25UaXRsZShidXR0b246IEhUTUxCdXR0b25FbGVtZW50LCB0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoYE5hdmlnYXRpb25Db250cm9sLiR7dGl0bGV9YCk7XG4gICAgICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBzdHIpO1xuICAgICAgICBpZiAoYnV0dG9uLmZpcnN0RWxlbWVudENoaWxkKSBidXR0b24uZmlyc3RFbGVtZW50Q2hpbGQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHN0cik7XG4gICAgfVxufVxuXG5jbGFzcyBNb3VzZVJvdGF0ZVdyYXBwZXIge1xuXG4gICAgbWFwOiBNYXA7XG4gICAgX2NsaWNrVG9sZXJhbmNlOiBudW1iZXI7XG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgbW91c2VSb3RhdGU6IE1vdXNlUm90YXRlSGFuZGxlcjtcbiAgICBtb3VzZVBpdGNoOiBNb3VzZVBpdGNoSGFuZGxlcjtcbiAgICBfc3RhcnRQb3M6IFBvaW50O1xuICAgIF9sYXN0UG9zOiBQb2ludDtcblxuICAgIGNvbnN0cnVjdG9yKG1hcDogTWFwLCBlbGVtZW50OiBIVE1MRWxlbWVudCwgcGl0Y2g/OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSAxMDtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5tb3VzZVJvdGF0ZSA9IG5ldyBNb3VzZVJvdGF0ZUhhbmRsZXIoe2NsaWNrVG9sZXJhbmNlOiBtYXAuZHJhZ1JvdGF0ZS5fbW91c2VSb3RhdGUuX2NsaWNrVG9sZXJhbmNlfSk7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICBpZiAocGl0Y2gpIHRoaXMubW91c2VQaXRjaCA9IG5ldyBNb3VzZVBpdGNoSGFuZGxlcih7Y2xpY2tUb2xlcmFuY2U6IG1hcC5kcmFnUm90YXRlLl9tb3VzZVBpdGNoLl9jbGlja1RvbGVyYW5jZX0pO1xuXG4gICAgICAgIGJpbmRBbGwoWydtb3VzZWRvd24nLCAnbW91c2Vtb3ZlJywgJ21vdXNldXAnLCAndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnLCAncmVzZXQnXSwgdGhpcyk7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5tb3VzZWRvd24pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLnRvdWNoc3RhcnQsIHtwYXNzaXZlOiBmYWxzZX0pO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMudG91Y2htb3ZlKTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMudG91Y2hlbmQpO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5yZXNldCk7XG4gICAgfVxuXG4gICAgZG93bihlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgdGhpcy5tb3VzZVJvdGF0ZS5tb3VzZWRvd24oZSwgcG9pbnQpO1xuICAgICAgICBpZiAodGhpcy5tb3VzZVBpdGNoKSB0aGlzLm1vdXNlUGl0Y2gubW91c2Vkb3duKGUsIHBvaW50KTtcbiAgICAgICAgRE9NLmRpc2FibGVEcmFnKCk7XG4gICAgfVxuXG4gICAgbW92ZShlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5tYXA7XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLm1vdXNlUm90YXRlLm1vdXNlbW92ZVdpbmRvdyhlLCBwb2ludCk7XG4gICAgICAgIGlmIChyICYmIHIuYmVhcmluZ0RlbHRhKSBtYXAuc2V0QmVhcmluZyhtYXAuZ2V0QmVhcmluZygpICsgci5iZWFyaW5nRGVsdGEpO1xuICAgICAgICBpZiAodGhpcy5tb3VzZVBpdGNoKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcy5tb3VzZVBpdGNoLm1vdXNlbW92ZVdpbmRvdyhlLCBwb2ludCk7XG4gICAgICAgICAgICBpZiAocCAmJiBwLnBpdGNoRGVsdGEpIG1hcC5zZXRQaXRjaChtYXAuZ2V0UGl0Y2goKSArIHAucGl0Y2hEZWx0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvZmYoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5tb3VzZWRvd24pO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLnRvdWNoc3RhcnQsIHtwYXNzaXZlOiBmYWxzZX0pO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMudG91Y2htb3ZlKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMudG91Y2hlbmQpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5yZXNldCk7XG4gICAgICAgIHRoaXMub2ZmVGVtcCgpO1xuICAgIH1cblxuICAgIG9mZlRlbXAoKSB7XG4gICAgICAgIERPTS5lbmFibGVEcmFnKCk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlbW92ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5tb3VzZXVwKTtcbiAgICB9XG5cbiAgICBtb3VzZWRvd24oZTogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLmRvd24oZXh0ZW5kKHt9LCBlLCB7Y3RybEtleTogdHJ1ZSwgcHJldmVudERlZmF1bHQ6ICgpID0+IGUucHJldmVudERlZmF1bHQoKX0pLCBET00ubW91c2VQb3ModGhpcy5lbGVtZW50LCBlKSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm1vdXNlbW92ZSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5tb3VzZXVwKTtcbiAgICB9XG5cbiAgICBtb3VzZW1vdmUoZTogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLm1vdmUoZSwgRE9NLm1vdXNlUG9zKHRoaXMuZWxlbWVudCwgZSkpO1xuICAgIH1cblxuICAgIG1vdXNldXAoZTogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLm1vdXNlUm90YXRlLm1vdXNldXBXaW5kb3coZSk7XG4gICAgICAgIGlmICh0aGlzLm1vdXNlUGl0Y2gpIHRoaXMubW91c2VQaXRjaC5tb3VzZXVwV2luZG93KGUpO1xuICAgICAgICB0aGlzLm9mZlRlbXAoKTtcbiAgICB9XG5cbiAgICB0b3VjaHN0YXJ0KGU6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKGUudGFyZ2V0VG91Y2hlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gdGhpcy5fbGFzdFBvcyA9IERPTS50b3VjaFBvcyh0aGlzLmVsZW1lbnQsIGUudGFyZ2V0VG91Y2hlcylbMF07XG4gICAgICAgICAgICB0aGlzLmRvd24oKCh7dHlwZTogJ21vdXNlZG93bicsIGJ1dHRvbjogMCwgY3RybEtleTogdHJ1ZSwgcHJldmVudERlZmF1bHQ6ICgpID0+IGUucHJldmVudERlZmF1bHQoKX06IGFueSk6IE1vdXNlRXZlbnQpLCB0aGlzLl9zdGFydFBvcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b3VjaG1vdmUoZTogVG91Y2hFdmVudCkge1xuICAgICAgICBpZiAoZS50YXJnZXRUb3VjaGVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFBvcyA9IERPTS50b3VjaFBvcyh0aGlzLmVsZW1lbnQsIGUudGFyZ2V0VG91Y2hlcylbMF07XG4gICAgICAgICAgICB0aGlzLm1vdmUoKCh7cHJldmVudERlZmF1bHQ6ICgpID0+IGUucHJldmVudERlZmF1bHQoKX06IGFueSk6IE1vdXNlRXZlbnQpLCB0aGlzLl9sYXN0UG9zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvdWNoZW5kKGU6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKGUudGFyZ2V0VG91Y2hlcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9zICYmXG4gICAgICAgICAgICB0aGlzLl9sYXN0UG9zICYmXG4gICAgICAgICAgICB0aGlzLl9zdGFydFBvcy5kaXN0KHRoaXMuX2xhc3RQb3MpIDwgdGhpcy5fY2xpY2tUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGljaygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5tb3VzZVJvdGF0ZS5yZXNldCgpO1xuICAgICAgICBpZiAodGhpcy5tb3VzZVBpdGNoKSB0aGlzLm1vdXNlUGl0Y2gucmVzZXQoKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXJ0UG9zO1xuICAgICAgICBkZWxldGUgdGhpcy5fbGFzdFBvcztcbiAgICAgICAgdGhpcy5vZmZUZW1wKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBOYXZpZ2F0aW9uQ29udHJvbDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7RXZlbnQsIEV2ZW50ZWR9IGZyb20gJy4uLy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cuanMnO1xuaW1wb3J0IHtleHRlbmQsIGJpbmRBbGwsIHdhcm5PbmNlfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IE1hcmtlciBmcm9tICcuLi9tYXJrZXIuanMnO1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi8uLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSAnLi4vLi4vdXRpbC90aHJvdHRsZS5qcyc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAuanMnO1xuaW1wb3J0IHR5cGUge0FuaW1hdGlvbk9wdGlvbnMsIENhbWVyYU9wdGlvbnN9IGZyb20gJy4uL2NhbWVyYS5qcyc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBwb3NpdGlvbk9wdGlvbnM/OiBQb3NpdGlvbk9wdGlvbnMsXG4gICAgZml0Qm91bmRzT3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMgJiBDYW1lcmFPcHRpb25zLFxuICAgIHRyYWNrVXNlckxvY2F0aW9uPzogYm9vbGVhbixcbiAgICBzaG93QWNjdXJhY3lDaXJjbGU/OiBib29sZWFuLFxuICAgIHNob3dVc2VyTG9jYXRpb24/OiBib29sZWFuLFxuICAgIHNob3dVc2VySGVhZGluZz86IGJvb2xlYW5cbn07XG5cbnR5cGUgRGV2aWNlT3JpZW50YXRpb25FdmVudCA9IHtcbiAgICBhYnNvbHV0ZTogYm9vbGVhbixcbiAgICBhbHBoYTogbnVtYmVyLFxuICAgIGJldGE6IG51bWJlcixcbiAgICBnYW1tYTogbnVtYmVyLFxuICAgIHJlcXVlc3RQZXJtaXNzaW9uOiBQcm9taXNlPFN0cmluZz4sXG4gICAgd2Via2l0Q29tcGFzc0hlYWRpbmc/OiBudW1iZXIsXG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IGZhbHNlLFxuICAgICAgICBtYXhpbXVtQWdlOiAwLFxuICAgICAgICB0aW1lb3V0OiA2MDAwIC8qIDYgc2VjICovXG4gICAgfSxcbiAgICBmaXRCb3VuZHNPcHRpb25zOiB7XG4gICAgICAgIG1heFpvb206IDE1XG4gICAgfSxcbiAgICB0cmFja1VzZXJMb2NhdGlvbjogZmFsc2UsXG4gICAgc2hvd0FjY3VyYWN5Q2lyY2xlOiB0cnVlLFxuICAgIHNob3dVc2VyTG9jYXRpb246IHRydWUsXG4gICAgc2hvd1VzZXJIZWFkaW5nOiBmYWxzZVxufTtcblxubGV0IHN1cHBvcnRzR2VvbG9jYXRpb247XG5cbmZ1bmN0aW9uIGNoZWNrR2VvbG9jYXRpb25TdXBwb3J0KGNhbGxiYWNrKSB7XG4gICAgaWYgKHN1cHBvcnRzR2VvbG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYWxsYmFjayhzdXBwb3J0c0dlb2xvY2F0aW9uKTtcblxuICAgIH0gZWxzZSBpZiAod2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIG5hdmlnYXRvci5wZXJtaXNzaW9ucyBoYXMgaW5jb21wbGV0ZSBicm93c2VyIHN1cHBvcnRcbiAgICAgICAgLy8gaHR0cDovL2Nhbml1c2UuY29tLyNmZWF0PXBlcm1pc3Npb25zLWFwaVxuICAgICAgICAvLyBUZXN0IGZvciB0aGUgY2FzZSB3aGVyZSBhIGJyb3dzZXIgZGlzYWJsZXMgR2VvbG9jYXRpb24gYmVjYXVzZSBvZiBhblxuICAgICAgICAvLyBpbnNlY3VyZSBvcmlnaW5cbiAgICAgICAgd2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7bmFtZTogJ2dlb2xvY2F0aW9uJ30pLnRoZW4oKHApID0+IHtcbiAgICAgICAgICAgIHN1cHBvcnRzR2VvbG9jYXRpb24gPSBwLnN0YXRlICE9PSAnZGVuaWVkJztcbiAgICAgICAgICAgIGNhbGxiYWNrKHN1cHBvcnRzR2VvbG9jYXRpb24pO1xuICAgICAgICB9KTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHN1cHBvcnRzR2VvbG9jYXRpb24gPSAhIXdpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb247XG4gICAgICAgIGNhbGxiYWNrKHN1cHBvcnRzR2VvbG9jYXRpb24pO1xuICAgIH1cbn1cblxubGV0IG51bWJlck9mV2F0Y2hlcyA9IDA7XG5sZXQgbm9UaW1lb3V0ID0gZmFsc2U7XG5cbi8qKlxuICogQSBgR2VvbG9jYXRlQ29udHJvbGAgY29udHJvbCBwcm92aWRlcyBhIGJ1dHRvbiB0aGF0IHVzZXMgdGhlIGJyb3dzZXIncyBnZW9sb2NhdGlvblxuICogQVBJIHRvIGxvY2F0ZSB0aGUgdXNlciBvbiB0aGUgbWFwLlxuICogQWRkIHRoaXMgY29udHJvbCB0byBhIG1hcCB1c2luZyB7QGxpbmsgTWFwI2FkZENvbnRyb2x9LlxuICpcbiAqIE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBnZW9sb2NhdGlvbixcbiAqIGFuZCBzb21lIHVzZXJzIG1heSBkaXNhYmxlIHRoZSBmZWF0dXJlLiBHZW9sb2NhdGlvbiBzdXBwb3J0IGZvciBtb2Rlcm5cbiAqIGJyb3dzZXJzIGluY2x1ZGluZyBDaHJvbWUgcmVxdWlyZXMgc2l0ZXMgdG8gYmUgc2VydmVkIG92ZXIgSFRUUFMuIElmXG4gKiBnZW9sb2NhdGlvbiBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUsIHRoZSBHZW9sb2NhdGVDb250cm9sIHdpbGwgc2hvd1xuICogYXMgZGlzYWJsZWQuXG4gKlxuICogVGhlIFt6b29tIGxldmVsXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L3pvb20tbGV2ZWwvKSBhcHBsaWVkIGRlcGVuZHMgb24gdGhlIGFjY3VyYWN5IG9mIHRoZSBnZW9sb2NhdGlvbiBwcm92aWRlZCBieSB0aGUgZGV2aWNlLlxuICpcbiAqIFRoZSBHZW9sb2NhdGVDb250cm9sIGhhcyB0d28gbW9kZXMuIElmIGB0cmFja1VzZXJMb2NhdGlvbmAgaXMgYGZhbHNlYCAoZGVmYXVsdCkgdGhlIGNvbnRyb2wgYWN0cyBhcyBhIGJ1dHRvbiwgd2hpY2ggd2hlbiBwcmVzc2VkIHdpbGwgc2V0IHRoZSBtYXAncyBjYW1lcmEgdG8gdGFyZ2V0IHRoZSB1c2VyIGxvY2F0aW9uLiBJZiB0aGUgdXNlciBtb3ZlcywgdGhlIG1hcCB3b24ndCB1cGRhdGUuIFRoaXMgaXMgbW9zdCBzdWl0ZWQgZm9yIHRoZSBkZXNrdG9wLiBJZiBgdHJhY2tVc2VyTG9jYXRpb25gIGlzIGB0cnVlYCB0aGUgY29udHJvbCBhY3RzIGFzIGEgdG9nZ2xlIGJ1dHRvbiB0aGF0IHdoZW4gYWN0aXZlIHRoZSB1c2VyJ3MgbG9jYXRpb24gaXMgYWN0aXZlbHkgbW9uaXRvcmVkIGZvciBjaGFuZ2VzLiBJbiB0aGlzIG1vZGUgdGhlIEdlb2xvY2F0ZUNvbnRyb2wgaGFzIHRocmVlIGludGVyYWN0aW9uIHN0YXRlczpcbiAqICogYWN0aXZlIC0gVGhlIG1hcCdzIGNhbWVyYSBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgYXMgdGhlIHVzZXIncyBsb2NhdGlvbiBjaGFuZ2VzLCBrZWVwaW5nIHRoZSBsb2NhdGlvbiBkb3QgaW4gdGhlIGNlbnRlci4gVGhpcyBpcyB0aGUgaW5pdGlhbCBzdGF0ZSwgYW5kIHRoZSBzdGF0ZSB1cG9uIGNsaWNraW5nIHRoZSBgR2VvbG9jYXRlQ29udHJvbGAgYnV0dG9uLlxuICogKiBwYXNzaXZlIC0gVGhlIHVzZXIncyBsb2NhdGlvbiBkb3QgYXV0b21hdGljYWxseSB1cGRhdGVzLCBidXQgdGhlIG1hcCdzIGNhbWVyYSBkb2VzIG5vdC4gT2NjdXJzIHVwb24gdGhlIHVzZXIgaW5pdGlhdGluZyBhIG1hcCBtb3ZlbWVudC5cbiAqICogZGlzYWJsZWQgLSBPY2N1cnMgaWYgZ2VvbG9jYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgZGlzYWJsZWQsIG9yIGRlbmllZC5cbiAqXG4gKiBUaGVzZSBpbnRlcmFjdGlvbiBzdGF0ZXMgY2FuJ3QgYmUgY29udHJvbGxlZCBwcm9ncmFtbWF0aWNhbGx5LiBJbnN0ZWFkLCB0aGV5IGFyZSBzZXQgYmFzZWQgb24gdXNlciBpbnRlcmFjdGlvbnMuXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnBvc2l0aW9uT3B0aW9ucz17ZW5hYmxlSGlnaEFjY3VyYWN5OiBmYWxzZSwgdGltZW91dDogNjAwMH1dIEEgR2VvbG9jYXRpb24gQVBJIFtQb3NpdGlvbk9wdGlvbnNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb3NpdGlvbk9wdGlvbnMpIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5maXRCb3VuZHNPcHRpb25zPXttYXhab29tOiAxNX1dIEEge0BsaW5rIE1hcCNmaXRCb3VuZHN9IG9wdGlvbnMgb2JqZWN0IHRvIHVzZSB3aGVuIHRoZSBtYXAgaXMgcGFubmVkIGFuZCB6b29tZWQgdG8gdGhlIHVzZXIncyBsb2NhdGlvbi4gVGhlIGRlZmF1bHQgaXMgdG8gdXNlIGEgYG1heFpvb21gIG9mIDE1IHRvIGxpbWl0IGhvdyBmYXIgdGhlIG1hcCB3aWxsIHpvb20gaW4gZm9yIHZlcnkgYWNjdXJhdGUgbG9jYXRpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uPWZhbHNlXSBJZiBgdHJ1ZWAgdGhlIEdlb2xvY2F0ZUNvbnRyb2wgYmVjb21lcyBhIHRvZ2dsZSBidXR0b24gYW5kIHdoZW4gYWN0aXZlIHRoZSBtYXAgd2lsbCByZWNlaXZlIHVwZGF0ZXMgdG8gdGhlIHVzZXIncyBsb2NhdGlvbiBhcyBpdCBjaGFuZ2VzLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnNob3dBY2N1cmFjeUNpcmNsZT10cnVlXSBCeSBkZWZhdWx0LCBpZiBgc2hvd1VzZXJMb2NhdGlvbmAgaXMgYHRydWVgLCBhIHRyYW5zcGFyZW50IGNpcmNsZSB3aWxsIGJlIGRyYXduIGFyb3VuZCB0aGUgdXNlciBsb2NhdGlvbiBpbmRpY2F0aW5nIHRoZSBhY2N1cmFjeSAoOTUlIGNvbmZpZGVuY2UgbGV2ZWwpIG9mIHRoZSB1c2VyJ3MgbG9jYXRpb24uIFNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUuIEFsd2F5cyBkaXNhYmxlZCB3aGVuIGBzaG93VXNlckxvY2F0aW9uYCBpcyBgZmFsc2VgLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnNob3dVc2VyTG9jYXRpb249dHJ1ZV0gQnkgZGVmYXVsdCBhIGRvdCB3aWxsIGJlIHNob3duIG9uIHRoZSBtYXAgYXQgdGhlIHVzZXIncyBsb2NhdGlvbi4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5zaG93VXNlckhlYWRpbmc9ZmFsc2VdIElmIGB0cnVlYCBhbiBhcnJvdyB3aWxsIGJlIGRyYXduIG5leHQgdG8gdGhlIHVzZXIgbG9jYXRpb24gZG90IGluZGljYXRpbmcgdGhlIGRldmljZSdzIGhlYWRpbmcuIFRoaXMgb25seSBoYXMgYWZmZWN0IHdoZW4gYHRyYWNrVXNlckxvY2F0aW9uYCBpcyBgdHJ1ZWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAqICAgICBwb3NpdGlvbk9wdGlvbnM6IHtcbiAqICAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiB0cnVlXG4gKiAgICAgfSxcbiAqICAgICB0cmFja1VzZXJMb2NhdGlvbjogdHJ1ZSxcbiAqICAgICBzaG93VXNlckhlYWRpbmc6IHRydWVcbiAqIH0pKTtcbiAqIEBzZWUgW0V4YW1wbGU6IExvY2F0ZSB0aGUgdXNlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9sb2NhdGUtdXNlci8pXG4gKi9cbmNsYXNzIEdlb2xvY2F0ZUNvbnRyb2wgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgb3B0aW9uczogT3B0aW9ucztcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfZG90RWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgX2NpcmNsZUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIF9nZW9sb2NhdGVCdXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xuICAgIF9nZW9sb2NhdGlvbldhdGNoSUQ6IG51bWJlcjtcbiAgICBfdGltZW91dElkOiA/VGltZW91dElEO1xuICAgIF93YXRjaFN0YXRlOiAnT0ZGJyB8ICdBQ1RJVkVfTE9DSycgfCAnV0FJVElOR19BQ1RJVkUnIHwgJ0FDVElWRV9FUlJPUicgfCAnQkFDS0dST1VORCcgfCAnQkFDS0dST1VORF9FUlJPUic7XG4gICAgX2xhc3RLbm93blBvc2l0aW9uOiBhbnk7XG4gICAgX3VzZXJMb2NhdGlvbkRvdE1hcmtlcjogTWFya2VyO1xuICAgIF9hY2N1cmFjeUNpcmNsZU1hcmtlcjogTWFya2VyO1xuICAgIF9hY2N1cmFjeTogbnVtYmVyO1xuICAgIF9zZXR1cDogYm9vbGVhbjsgLy8gc2V0IHRvIHRydWUgb25jZSB0aGUgY29udHJvbCBoYXMgYmVlbiBzZXR1cFxuICAgIF9oZWFkaW5nOiA/bnVtYmVyO1xuICAgIF91cGRhdGVNYXJrZXJSb3RhdGlvblRocm90dGxlZDogRnVuY3Rpb247XG4gICAgX29uRGV2aWNlT3JpZW50YXRpb25MaXN0ZW5lcjogRnVuY3Rpb247XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vblN1Y2Nlc3MnLFxuICAgICAgICAgICAgJ19vbkVycm9yJyxcbiAgICAgICAgICAgICdfb25ab29tJyxcbiAgICAgICAgICAgICdfZmluaXNoJyxcbiAgICAgICAgICAgICdfc2V0dXBVSScsXG4gICAgICAgICAgICAnX3VwZGF0ZUNhbWVyYScsXG4gICAgICAgICAgICAnX3VwZGF0ZU1hcmtlcicsXG4gICAgICAgICAgICAnX3VwZGF0ZU1hcmtlclJvdGF0aW9uJ1xuICAgICAgICBdLCB0aGlzKTtcblxuICAgICAgICAvLyBieSByZWZlcmVuY2luZyB0aGUgZnVuY3Rpb24gd2l0aCAuYmluZCgpLCB3ZSBjYW4gY29ycmVjdGx5IHJlbW92ZSBmcm9tIHdpbmRvdydzIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICB0aGlzLl9vbkRldmljZU9yaWVudGF0aW9uTGlzdGVuZXIgPSB0aGlzLl9vbkRldmljZU9yaWVudGF0aW9uLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZU1hcmtlclJvdGF0aW9uVGhyb3R0bGVkID0gdGhyb3R0bGUodGhpcy5fdXBkYXRlTWFya2VyUm90YXRpb24sIDIwKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsIGBtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtZ3JvdXBgKTtcbiAgICAgICAgY2hlY2tHZW9sb2NhdGlvblN1cHBvcnQodGhpcy5fc2V0dXBVSSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIC8vIGNsZWFyIHRoZSBnZW9sb2NhdGlvbiB3YXRjaCBpZiBleGlzdHNcbiAgICAgICAgaWYgKHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciB0aGUgbWFya2VycyBmcm9tIHRoZSBtYXBcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0FjY3VyYWN5Q2lyY2xlICYmIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY2N1cmFjeUNpcmNsZU1hcmtlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignem9vbScsIHRoaXMuX29uWm9vbSk7XG4gICAgICAgIHRoaXMuX21hcCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgICAgIG51bWJlck9mV2F0Y2hlcyA9IDA7XG4gICAgICAgIG5vVGltZW91dCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBHZW9sb2NhdGlvbiBBUEkgUG9zaXRpb24gaXMgb3V0c2lkZSB0aGUgbWFwJ3MgbWF4Ym91bmRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb24gdGhlIEdlb2xvY2F0aW9uIEFQSSBQb3NpdGlvblxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBwb3NpdGlvbiBpcyBvdXRzaWRlIHRoZSBtYXAncyBtYXhib3VuZHMsIG90aGVyd2lzZSByZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaXNPdXRPZk1hcE1heEJvdW5kcyhwb3NpdGlvbjogUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgYm91bmRzID0gdGhpcy5fbWFwLmdldE1heEJvdW5kcygpO1xuICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IHBvc2l0aW9uLmNvb3JkcztcblxuICAgICAgICByZXR1cm4gYm91bmRzICYmIChcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLmxvbmdpdHVkZSA8IGJvdW5kcy5nZXRXZXN0KCkgfHxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLmxvbmdpdHVkZSA+IGJvdW5kcy5nZXRFYXN0KCkgfHxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLmxhdGl0dWRlIDwgYm91bmRzLmdldFNvdXRoKCkgfHxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzLmxhdGl0dWRlID4gYm91bmRzLmdldE5vcnRoKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBfc2V0RXJyb3JTdGF0ZSgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLl93YXRjaFN0YXRlKSB7XG4gICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQUNUSVZFX0VSUk9SJztcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3InKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdBQ1RJVkVfTE9DSyc6XG4gICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0FDVElWRV9FUlJPUic7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgLy8gdHVybiBtYXJrZXIgZ3JleVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkQnOlxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdCQUNLR1JPVU5EX0VSUk9SJztcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvcicpO1xuICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgIC8vIHR1cm4gbWFya2VyIGdyZXlcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdBQ1RJVkVfRVJST1InOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGBVbmV4cGVjdGVkIHdhdGNoU3RhdGUgJHt0aGlzLl93YXRjaFN0YXRlfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgR2VvbG9jYXRpb24gQVBJIHJldHVybnMgYSBuZXcgbG9jYXRpb24sIHVwZGF0ZSB0aGUgR2VvbG9jYXRlQ29udHJvbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uIHRoZSBHZW9sb2NhdGlvbiBBUEkgUG9zaXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9vblN1Y2Nlc3MocG9zaXRpb246IFBvc2l0aW9uKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAvLyBjb250cm9sIGhhcyBzaW5jZSBiZWVuIHJlbW92ZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pc091dE9mTWFwTWF4Qm91bmRzKHBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5fc2V0RXJyb3JTdGF0ZSgpO1xuXG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdvdXRvZm1heGJvdW5kcycsIHBvc2l0aW9uKSk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVNYXJrZXIoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICAvLyBrZWVwIGEgcmVjb3JkIG9mIHRoZSBwb3NpdGlvbiBzbyB0aGF0IGlmIHRoZSBzdGF0ZSBpcyBCQUNLR1JPVU5EIGFuZCB0aGUgdXNlclxuICAgICAgICAgICAgLy8gY2xpY2tzIHRoZSBidXR0b24sIHdlIGNhbiBtb3ZlIHRvIEFDVElWRV9MT0NLIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyBmb3JcbiAgICAgICAgICAgIC8vIHdhdGNoUG9zaXRpb24gdG8gdHJpZ2dlciBfb25TdWNjZXNzXG4gICAgICAgICAgICB0aGlzLl9sYXN0S25vd25Qb3NpdGlvbiA9IHBvc2l0aW9uO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9FUlJPUic6XG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdBQ1RJVkVfTE9DSyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EX0VSUk9SJzpcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0JBQ0tHUk9VTkQnO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UsIGBVbmV4cGVjdGVkIHdhdGNoU3RhdGUgJHt0aGlzLl93YXRjaFN0YXRlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgc2hvd1VzZXJMb2NhdGlvbiBhbmQgdGhlIHdhdGNoIHN0YXRlIGlzbid0IG9mZiB0aGVuIHVwZGF0ZSB0aGUgbWFya2VyIGxvY2F0aW9uXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLl93YXRjaFN0YXRlICE9PSAnT0ZGJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWFya2VyKHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGluIG5vcm1hbCBtb2RlIChub3Qgd2F0Y2ggbW9kZSksIG9yIGlmIGluIHdhdGNoIG1vZGUgYW5kIHRoZSBzdGF0ZSBpcyBhY3RpdmUgd2F0Y2hcbiAgICAgICAgLy8gdGhlbiB1cGRhdGUgdGhlIGNhbWVyYVxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbiB8fCB0aGlzLl93YXRjaFN0YXRlID09PSAnQUNUSVZFX0xPQ0snKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDYW1lcmEocG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kb3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXVzZXItbG9jYXRpb24tZG90LXN0YWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdnZW9sb2NhdGUnLCBwb3NpdGlvbikpO1xuICAgICAgICB0aGlzLl9maW5pc2goKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGNhbWVyYSBsb2NhdGlvbiB0byBjZW50ZXIgb24gdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uIHRoZSBHZW9sb2NhdGlvbiBBUEkgUG9zaXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91cGRhdGVDYW1lcmEocG9zaXRpb246IFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IG5ldyBMbmdMYXQocG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSwgcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlKTtcbiAgICAgICAgY29uc3QgcmFkaXVzID0gcG9zaXRpb24uY29vcmRzLmFjY3VyYWN5O1xuICAgICAgICBjb25zdCBiZWFyaW5nID0gdGhpcy5fbWFwLmdldEJlYXJpbmcoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGV4dGVuZCh7YmVhcmluZ30sIHRoaXMub3B0aW9ucy5maXRCb3VuZHNPcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9tYXAuZml0Qm91bmRzKGNlbnRlci50b0JvdW5kcyhyYWRpdXMpLCBvcHRpb25zLCB7XG4gICAgICAgICAgICBnZW9sb2NhdGVTb3VyY2U6IHRydWUgLy8gdGFnIHRoaXMgY2FtZXJhIGNoYW5nZSBzbyBpdCB3b24ndCBjYXVzZSB0aGUgY29udHJvbCB0byBjaGFuZ2UgdG8gYmFja2dyb3VuZCBzdGF0ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHVzZXIgbG9jYXRpb24gZG90IE1hcmtlciB0byB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gW3Bvc2l0aW9uXSB0aGUgR2VvbG9jYXRpb24gQVBJIFBvc2l0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdXBkYXRlTWFya2VyKHBvc2l0aW9uOiA/UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBuZXcgTG5nTGF0KHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSk7XG4gICAgICAgICAgICB0aGlzLl9hY2N1cmFjeUNpcmNsZU1hcmtlci5zZXRMbmdMYXQoY2VudGVyKS5hZGRUbyh0aGlzLl9tYXApO1xuICAgICAgICAgICAgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyLnNldExuZ0xhdChjZW50ZXIpLmFkZFRvKHRoaXMuX21hcCk7XG4gICAgICAgICAgICB0aGlzLl9hY2N1cmFjeSA9IHBvc2l0aW9uLmNvb3Jkcy5hY2N1cmFjeTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLm9wdGlvbnMuc2hvd0FjY3VyYWN5Q2lyY2xlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2lyY2xlUmFkaXVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLl9hY2N1cmFjeUNpcmNsZU1hcmtlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVDaXJjbGVSYWRpdXMoKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLl9jaXJjbGVFbGVtZW50KTtcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuX21hcC5fY29udGFpbmVySGVpZ2h0IC8gMjtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuX21hcC51bnByb2plY3QoWzAsIHldKTtcbiAgICAgICAgY29uc3QgYiA9IHRoaXMuX21hcC51bnByb2plY3QoWzEwMCwgeV0pO1xuICAgICAgICBjb25zdCBtZXRlcnNQZXJQaXhlbCA9IGEuZGlzdGFuY2VUbyhiKSAvIDEwMDtcbiAgICAgICAgY29uc3QgY2lyY2xlRGlhbWV0ZXIgPSBNYXRoLmNlaWwoMi4wICogdGhpcy5fYWNjdXJhY3kgLyBtZXRlcnNQZXJQaXhlbCk7XG4gICAgICAgIHRoaXMuX2NpcmNsZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtjaXJjbGVEaWFtZXRlcn1weGA7XG4gICAgICAgIHRoaXMuX2NpcmNsZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7Y2lyY2xlRGlhbWV0ZXJ9cHhgO1xuICAgIH1cblxuICAgIF9vblpvb20oKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbiAmJiB0aGlzLm9wdGlvbnMuc2hvd0FjY3VyYWN5Q2lyY2xlKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDaXJjbGVSYWRpdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgdXNlciBsb2NhdGlvbiBkb3QgTWFya2VyIHJvdGF0aW9uIHRvIHRoZSBjdXJyZW50IGhlYWRpbmdcbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VwZGF0ZU1hcmtlclJvdGF0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyICYmIHR5cGVvZiB0aGlzLl9oZWFkaW5nID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyLnNldFJvdGF0aW9uKHRoaXMuX2hlYWRpbmcpO1xuICAgICAgICAgICAgdGhpcy5fZG90RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC11c2VyLWxvY2F0aW9uLXNob3ctaGVhZGluZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZG90RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC11c2VyLWxvY2F0aW9uLXNob3ctaGVhZGluZycpO1xuICAgICAgICAgICAgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyLnNldFJvdGF0aW9uKDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uRXJyb3IoZXJyb3I6IFBvc2l0aW9uRXJyb3IpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIC8vIGNvbnRyb2wgaGFzIHNpbmNlIGJlZW4gcmVtb3ZlZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmFja1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBQRVJNSVNTSU9OX0RFTklFRFxuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnT0ZGJztcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvcicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKCdHZW9sb2NhdGVDb250cm9sLkxvY2F0aW9uTm90QXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHRpdGxlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmZpcnN0RWxlbWVudENoaWxkKSB0aGlzLl9nZW9sb2NhdGVCdXR0b24uZmlyc3RFbGVtZW50Q2hpbGQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRpdGxlKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbGVhcldhdGNoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5jb2RlID09PSAzICYmIG5vVGltZW91dCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVwcmVzZW50cyBhIGZvcmNlZCBlcnJvciBzdGF0ZVxuICAgICAgICAgICAgICAgIC8vIHRoaXMgd2FzIHRyaWdnZXJlZCB0byBmb3JjZSBpbW1lZGlhdGUgZ2VvbG9jYXRpb24gd2hlbiBhIHdhdGNoIGlzIGFscmVhZHkgcHJlc2VudFxuICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvODIxNFxuICAgICAgICAgICAgICAgIC8vIGFuZCBodHRwczovL3czYy5naXRodWIuaW8vZ2VvbG9jYXRpb24tYXBpLyNleGFtcGxlLTUtZm9yY2luZy10aGUtdXNlci1hZ2VudC10by1yZXR1cm4tYS1mcmVzaC1jYWNoZWQtcG9zaXRpb25cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldEVycm9yU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl93YXRjaFN0YXRlICE9PSAnT0ZGJyAmJiB0aGlzLm9wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fZG90RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC11c2VyLWxvY2F0aW9uLWRvdC1zdGFsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZXJyb3InLCBlcnJvcikpO1xuXG4gICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgIH1cblxuICAgIF9maW5pc2goKSB7XG4gICAgICAgIGlmICh0aGlzLl90aW1lb3V0SWQpIHsgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7IH1cbiAgICAgICAgdGhpcy5fdGltZW91dElkID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIF9zZXR1cFVJKHN1cHBvcnRlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCAoZTogTW91c2VFdmVudCkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uID0gRE9NLmNyZWF0ZSgnYnV0dG9uJywgYG1hcGJveGdsLWN0cmwtZ2VvbG9jYXRlYCwgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgRE9NLmNyZWF0ZSgnc3BhbicsIGBtYXBib3hnbC1jdHJsLWljb25gLCB0aGlzLl9nZW9sb2NhdGVCdXR0b24pLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCB0cnVlKTtcblxuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24udHlwZSA9ICdidXR0b24nO1xuXG4gICAgICAgIGlmIChzdXBwb3J0ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB3YXJuT25jZSgnR2VvbG9jYXRpb24gc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlIHNvIHRoZSBHZW9sb2NhdGVDb250cm9sIHdpbGwgYmUgZGlzYWJsZWQuJyk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoJ0dlb2xvY2F0ZUNvbnRyb2wuTG9jYXRpb25Ob3RBdmFpbGFibGUnKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGl0bGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZCkgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmZpcnN0RWxlbWVudENoaWxkLnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aXRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoJ0dlb2xvY2F0ZUNvbnRyb2wuRmluZE15TG9jYXRpb24nKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmZpcnN0RWxlbWVudENoaWxkKSB0aGlzLl9nZW9sb2NhdGVCdXR0b24uZmlyc3RFbGVtZW50Q2hpbGQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdPRkYnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiBzaG93VXNlckxvY2F0aW9uIGlzIGVuYWJsZWQsIGtlZXAgdGhlIEdlb2xvY2F0ZSBidXR0b24gZGlzYWJsZWQgdW50aWwgdGhlIGRldmljZSBsb2NhdGlvbiBtYXJrZXIgaXMgc2V0dXAgb24gdGhlIG1hcFxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2RvdEVsZW1lbnQgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtdXNlci1sb2NhdGlvbicpO1xuICAgICAgICAgICAgdGhpcy5fZG90RWxlbWVudC5hcHBlbmRDaGlsZChET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1kb3QnKSk7XG4gICAgICAgICAgICB0aGlzLl9kb3RFbGVtZW50LmFwcGVuZENoaWxkKERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC11c2VyLWxvY2F0aW9uLWhlYWRpbmcnKSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlciA9IG5ldyBNYXJrZXIoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuX2RvdEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgcm90YXRpb25BbGlnbm1lbnQ6ICdtYXAnLFxuICAgICAgICAgICAgICAgIHBpdGNoQWxpZ25tZW50OiAnbWFwJ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuX2NpcmNsZUVsZW1lbnQgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1hY2N1cmFjeS1jaXJjbGUnKTtcbiAgICAgICAgICAgIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyID0gbmV3IE1hcmtlcih7ZWxlbWVudDogdGhpcy5fY2lyY2xlRWxlbWVudCwgcGl0Y2hBbGlnbm1lbnQ6ICdtYXAnfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHRoaXMuX3dhdGNoU3RhdGUgPSAnT0ZGJztcblxuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCd6b29tJywgdGhpcy5fb25ab29tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5fc2V0dXAgPSB0cnVlO1xuXG4gICAgICAgIC8vIHdoZW4gdGhlIGNhbWVyYSBpcyBjaGFuZ2VkIChhbmQgaXQncyBub3QgYXMgYSByZXN1bHQgb2YgdGhlIEdlb2xvY2F0aW9uIENvbnRyb2wpIGNoYW5nZVxuICAgICAgICAvLyB0aGUgd2F0Y2ggbW9kZSB0byBiYWNrZ3JvdW5kIHdhdGNoLCBzbyB0aGF0IHRoZSBtYXJrZXIgaXMgdXBkYXRlZCBidXQgbm90IHRoZSBjYW1lcmEuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW92ZXN0YXJ0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbVJlc2l6ZSA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQgJiYgZXZlbnQub3JpZ2luYWxFdmVudC50eXBlID09PSAncmVzaXplJztcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50Lmdlb2xvY2F0ZVNvdXJjZSAmJiB0aGlzLl93YXRjaFN0YXRlID09PSAnQUNUSVZFX0xPQ0snICYmICFmcm9tUmVzaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQkFDS0dST1VORCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd0cmFja3VzZXJsb2NhdGlvbmVuZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogUHJvZ3JhbW1hdGljYWxseSByZXF1ZXN0IGFuZCBtb3ZlIHRoZSBtYXAgdG8gdGhlIHVzZXIncyBsb2NhdGlvbi5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgIGlmIGNhbGxlZCBiZWZvcmUgY29udHJvbCB3YXMgYWRkZWQgdG8gYSBtYXAsIG90aGVyd2lzZSByZXR1cm5zIGB0cnVlYC5cbiAgICAqIENhbGxlZCBvbiBhIGRldmljZW9yaWVudGF0aW9uIGV2ZW50LlxuICAgICpcbiAgICAqIEBwYXJhbSBkZXZpY2VPcmllbnRhdGlvbkV2ZW50IHtEZXZpY2VPcmllbnRhdGlvbkV2ZW50fVxuICAgICogQHByaXZhdGVcbiAgICAqIEBleGFtcGxlXG4gICAgKiAvLyBJbml0aWFsaXplIHRoZSBHZW9sb2NhdGVDb250cm9sLlxuICAgICogdmFyIGdlb2xvY2F0ZSA9IG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAgICAqICBwb3NpdGlvbk9wdGlvbnM6IHtcbiAgICAqICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogdHJ1ZVxuICAgICogIH0sXG4gICAgKiAgdHJhY2tVc2VyTG9jYXRpb246IHRydWVcbiAgICAqIH0pO1xuICAgICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gICAgKiBtYXAuYWRkQ29udHJvbChnZW9sb2NhdGUpO1xuICAgICogbWFwLm9uKCdsb2FkJywgZnVuY3Rpb24oKSB7XG4gICAgKiAgIGdlb2xvY2F0ZS50cmlnZ2VyKCk7XG4gICAgKiB9KTtcbiAgICAqL1xuICAgIF9vbkRldmljZU9yaWVudGF0aW9uKGRldmljZU9yaWVudGF0aW9uRXZlbnQ6IERldmljZU9yaWVudGF0aW9uRXZlbnQpIHtcbiAgICAgICAgLy8gYWJzb2x1dGUgaXMgdHJ1ZSBpZiB0aGUgb3JpZW50YXRpb24gZGF0YSBpcyBwcm92aWRlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBFYXJ0aCdzIGNvb3JkaW5hdGUgZnJhbWUgYW5kIHRoZSBkZXZpY2UncyBjb29yZGluYXRlIGZyYW1lLCBvciBmYWxzZSBpZiB0aGUgb3JpZW50YXRpb24gZGF0YSBpcyBiZWluZyBwcm92aWRlZCBpbiByZWZlcmVuY2UgdG8gc29tZSBhcmJpdHJhcnksIGRldmljZS1kZXRlcm1pbmVkIGNvb3JkaW5hdGUgZnJhbWUuXG4gICAgICAgIGlmICh0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIpIHtcbiAgICAgICAgICAgIGlmIChkZXZpY2VPcmllbnRhdGlvbkV2ZW50LndlYmtpdENvbXBhc3NIZWFkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gU2FmYXJpXG4gICAgICAgICAgICAgICAgdGhpcy5faGVhZGluZyA9IGRldmljZU9yaWVudGF0aW9uRXZlbnQud2Via2l0Q29tcGFzc0hlYWRpbmc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZU9yaWVudGF0aW9uRXZlbnQuYWJzb2x1dGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAvLyBub24tU2FmYXJpIGFscGhhIGluY3JlYXNlcyBjb3VudGVyIGNsb2Nrd2lzZSBhcm91bmQgdGhlIHogYXhpc1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWRpbmcgPSBkZXZpY2VPcmllbnRhdGlvbkV2ZW50LmFscGhhICogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVNYXJrZXJSb3RhdGlvblRocm90dGxlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlciBhIGdlb2xvY2F0aW9uIGV2ZW50LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBnZW9sb2NhdGUgY29udHJvbC5cbiAgICAgKiBjb25zdCBnZW9sb2NhdGUgPSBuZXcgbWFwYm94Z2wuR2VvbG9jYXRlQ29udHJvbCh7XG4gICAgICogICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICAgICAqICAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiB0cnVlXG4gICAgICogICAgIH0sXG4gICAgICogICAgIHRyYWNrVXNlckxvY2F0aW9uOiB0cnVlXG4gICAgICogfSk7XG4gICAgICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gICAgICogbWFwLmFkZENvbnRyb2woZ2VvbG9jYXRlKTtcbiAgICAgKiBtYXAub24oJ2xvYWQnLCAoKSA9PiB7XG4gICAgICogICAgIGdlb2xvY2F0ZS50cmlnZ2VyKCk7XG4gICAgICogfSk7XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYCBpZiBjYWxsZWQgYmVmb3JlIGNvbnRyb2wgd2FzIGFkZGVkIHRvIGEgbWFwLCBvdGhlcndpc2UgcmV0dXJucyBgdHJ1ZWAuXG4gICAgICovXG4gICAgdHJpZ2dlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR1cCkge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ0dlb2xvY2F0ZSBjb250cm9sIHRyaWdnZXJlZCBiZWZvcmUgYWRkZWQgdG8gYSBtYXAnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgd2F0Y2hTdGF0ZSBhbmQgZG8gYW55IG91dGdvaW5nIHN0YXRlIGNsZWFudXBcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fd2F0Y2hTdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSAnT0ZGJzpcbiAgICAgICAgICAgICAgICAvLyB0dXJuIG9uIHRoZSBHZW9sb2NhdGVDb250cm9sXG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdXQUlUSU5HX0FDVElWRSc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd0cmFja3VzZXJsb2NhdGlvbnN0YXJ0JykpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnV0FJVElOR19BQ1RJVkUnOlxuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0xPQ0snOlxuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0VSUk9SJzpcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkRfRVJST1InOlxuICAgICAgICAgICAgICAgIC8vIHR1cm4gb2ZmIHRoZSBHZW9sb2NhdGVDb250cm9sXG4gICAgICAgICAgICAgICAgbnVtYmVyT2ZXYXRjaGVzLS07XG4gICAgICAgICAgICAgICAgbm9UaW1lb3V0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdPRkYnO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3InKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd0cmFja3VzZXJsb2NhdGlvbmVuZCcpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkQnOlxuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQUNUSVZFX0xPQ0snO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgLy8gc2V0IGNhbWVyYSB0byBsYXN0IGtub3duIGxvY2F0aW9uXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xhc3RLbm93blBvc2l0aW9uKSB0aGlzLl91cGRhdGVDYW1lcmEodGhpcy5fbGFzdEtub3duUG9zaXRpb24pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgndHJhY2t1c2VybG9jYXRpb25zdGFydCcpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBgVW5leHBlY3RlZCB3YXRjaFN0YXRlICR7dGhpcy5fd2F0Y2hTdGF0ZX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW5jb21pbmcgc3RhdGUgc2V0dXBcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fd2F0Y2hTdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSAnV0FJVElOR19BQ1RJVkUnOlxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0xPQ0snOlxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9FUlJPUic6XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORF9FUlJPUic6XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvcicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnT0ZGJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBgVW5leHBlY3RlZCB3YXRjaFN0YXRlICR7dGhpcy5fd2F0Y2hTdGF0ZX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbWFuYWdlIGdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24gLyBnZW9sb2NhdGlvbi5jbGVhcldhdGNoXG4gICAgICAgICAgICBpZiAodGhpcy5fd2F0Y2hTdGF0ZSA9PT0gJ09GRicgJiYgdGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBjbGVhciB3YXRjaFBvc2l0aW9uIGFzIHdlJ3ZlIGNoYW5nZWQgdG8gYW4gT0ZGIHN0YXRlXG4gICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJXYXRjaCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGVuYWJsZSB3YXRjaFBvc2l0aW9uIHNpbmNlIHdhdGNoU3RhdGUgaXMgbm90IE9GRiBhbmQgdGhlcmUgaXMgbm8gd2F0Y2hQb3NpdGlvbiBhbHJlYWR5IHJ1bm5pbmdcblxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgICAgIG51bWJlck9mV2F0Y2hlcysrO1xuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbk9wdGlvbnM7XG4gICAgICAgICAgICAgICAgaWYgKG51bWJlck9mV2F0Y2hlcyA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25PcHRpb25zID0ge21heGltdW1BZ2U6NjAwMDAwLCB0aW1lb3V0OjB9O1xuICAgICAgICAgICAgICAgICAgICBub1RpbWVvdXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbk9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIG5vVGltZW91dCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCA9IHdpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25TdWNjZXNzLCB0aGlzLl9vbkVycm9yLCBwb3NpdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckhlYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRGV2aWNlT3JpZW50YXRpb25MaXN0ZW5lcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICAgIHRoaXMuX29uU3VjY2VzcywgdGhpcy5fb25FcnJvciwgdGhpcy5vcHRpb25zLnBvc2l0aW9uT3B0aW9ucyk7XG5cbiAgICAgICAgICAgIC8vIFRoaXMgdGltZW91dCBlbnN1cmVzIHRoYXQgd2Ugc3RpbGwgY2FsbCBmaW5pc2goKSBldmVuIGlmXG4gICAgICAgICAgICAvLyB0aGUgdXNlciBkZWNsaW5lcyB0byBzaGFyZSB0aGVpciBsb2NhdGlvbiBpbiBGaXJlZm94XG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0SWQgPSBzZXRUaW1lb3V0KHRoaXMuX2ZpbmlzaCwgMTAwMDAgLyogMTBzZWMgKi8pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgX2FkZERldmljZU9yaWVudGF0aW9uTGlzdGVuZXIoKSB7XG4gICAgICAgIGNvbnN0IGFkZExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCdvbmRldmljZW9yaWVudGF0aW9uYWJzb2x1dGUnIGluIHdpbmRvdykge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VvcmllbnRhdGlvbmFic29sdXRlJywgdGhpcy5fb25EZXZpY2VPcmllbnRhdGlvbkxpc3RlbmVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZW9yaWVudGF0aW9uJywgdGhpcy5fb25EZXZpY2VPcmllbnRhdGlvbkxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5EZXZpY2VNb3Rpb25FdmVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHdpbmRvdy5EZXZpY2VNb3Rpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8kRmxvd0ZpeE1lW2luY29tcGF0aWJsZS10eXBlXVxuICAgICAgICAgICAgRGV2aWNlT3JpZW50YXRpb25FdmVudC5yZXF1ZXN0UGVybWlzc2lvbigpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgPT09ICdncmFudGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jbGVhcldhdGNoKCkge1xuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKTtcblxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZGV2aWNlb3JpZW50YXRpb24nLCB0aGlzLl9vbkRldmljZU9yaWVudGF0aW9uTGlzdGVuZXIpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZGV2aWNlb3JpZW50YXRpb25hYnNvbHV0ZScsIHRoaXMuX29uRGV2aWNlT3JpZW50YXRpb25MaXN0ZW5lcik7XG5cbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEID0gKHVuZGVmaW5lZDogYW55KTtcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgJ2ZhbHNlJyk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVNYXJrZXIobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlb2xvY2F0ZUNvbnRyb2w7XG5cbi8qIEdlb2xvY2F0ZUNvbnRyb2wgV2F0Y2ggU3RhdGVzXG4gKiBUaGlzIGlzIHRoZSBwcml2YXRlIHN0YXRlIG9mIHRoZSBjb250cm9sLlxuICpcbiAqIE9GRlxuICogICAgb2ZmL2luYWN0aXZlXG4gKiBXQUlUSU5HX0FDVElWRVxuICogICAgR2VvbG9jYXRlQ29udHJvbCB3YXMgY2xpY2tlZCBidXQgc3RpbGwgd2FpdGluZyBmb3IgR2VvbG9jYXRpb24gQVBJIHJlc3BvbnNlIHdpdGggdXNlciBsb2NhdGlvblxuICogQUNUSVZFX0xPQ0tcbiAqICAgIFNob3dpbmcgdGhlIHVzZXIgbG9jYXRpb24gYXMgYSBkb3QgQU5EIHRyYWNraW5nIHRoZSBjYW1lcmEgdG8gYmUgZml4ZWQgdG8gdGhlaXIgbG9jYXRpb24uIElmIHRoZWlyIGxvY2F0aW9uIGNoYW5nZXMgdGhlIG1hcCBtb3ZlcyB0byBmb2xsb3cuXG4gKiBBQ1RJVkVfRVJST1JcbiAqICAgIFRoZXJlIHdhcyBlbiBlcnJvciBmcm9tIHRoZSBHZW9sb2NhdGlvbiBBUEkgd2hpbGUgdHJ5aW5nIHRvIHNob3cgYW5kIHRyYWNrIHRoZSB1c2VyIGxvY2F0aW9uLlxuICogQkFDS0dST1VORFxuICogICAgU2hvd2luZyB0aGUgdXNlciBsb2NhdGlvbiBhcyBhIGRvdCBidXQgdGhlIGNhbWVyYSBkb2Vzbid0IGZvbGxvdyB0aGVpciBsb2NhdGlvbiBhcyBpdCBjaGFuZ2VzLlxuICogQkFDS0dST1VORF9FUlJPUlxuICogICAgVGhlcmUgd2FzIGFuIGVycm9yIGZyb20gdGhlIEdlb2xvY2F0aW9uIEFQSSB3aGlsZSB0cnlpbmcgdG8gc2hvdyAoYnV0IG5vdCB0cmFjaykgdGhlIHVzZXIgbG9jYXRpb24uXG4gKi9cblxuLyoqXG4gKiBGaXJlZCBvbiBlYWNoIEdlb2xvY2F0aW9uIEFQSSBwb3NpdGlvbiB1cGRhdGUgdGhhdCByZXR1cm5lZCBhcyBzdWNjZXNzLlxuICpcbiAqIEBldmVudCBnZW9sb2NhdGVcbiAqIEBtZW1iZXJvZiBHZW9sb2NhdGVDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IGRhdGEgVGhlIHJldHVybmVkIFtQb3NpdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Bvc2l0aW9uKSBvYmplY3QgZnJvbSB0aGUgY2FsbGJhY2sgaW4gW0dlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2VvbG9jYXRpb24vZ2V0Q3VycmVudFBvc2l0aW9uKSBvciBbR2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbigpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2VvbG9jYXRpb24vd2F0Y2hQb3NpdGlvbikuXG4gKiBAZXhhbXBsZVxuICogLy8gSW5pdGlhbGl6ZSB0aGUgR2VvbG9jYXRlQ29udHJvbC5cbiAqIGNvbnN0IGdlb2xvY2F0ZSA9IG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAqICAgICBwb3NpdGlvbk9wdGlvbnM6IHtcbiAqICAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiB0cnVlXG4gKiAgICAgfSxcbiAqICAgICB0cmFja1VzZXJMb2NhdGlvbjogdHJ1ZVxuICogfSk7XG4gKiAvLyBBZGQgdGhlIGNvbnRyb2wgdG8gdGhlIG1hcC5cbiAqIG1hcC5hZGRDb250cm9sKGdlb2xvY2F0ZSk7XG4gKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICogLy8gd2hlbiBhIGdlb2xvY2F0ZSBldmVudCBvY2N1cnMuXG4gKiBnZW9sb2NhdGUub24oJ2dlb2xvY2F0ZScsICgpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZygnQSBnZW9sb2NhdGUgZXZlbnQgaGFzIG9jY3VycmVkLicpO1xuICogfSk7XG4gKlxuICovXG5cbi8qKlxuICogRmlyZWQgb24gZWFjaCBHZW9sb2NhdGlvbiBBUEkgcG9zaXRpb24gdXBkYXRlIHRoYXQgcmV0dXJuZWQgYXMgYW4gZXJyb3IuXG4gKlxuICogQGV2ZW50IGVycm9yXG4gKiBAbWVtYmVyb2YgR2VvbG9jYXRlQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9uRXJyb3J9IGRhdGEgVGhlIHJldHVybmVkIFtQb3NpdGlvbkVycm9yXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUG9zaXRpb25FcnJvcikgb2JqZWN0IGZyb20gdGhlIGNhbGxiYWNrIGluIFtHZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0dlb2xvY2F0aW9uL2dldEN1cnJlbnRQb3NpdGlvbikgb3IgW0dlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0dlb2xvY2F0aW9uL3dhdGNoUG9zaXRpb24pLlxuICogQGV4YW1wbGVcbiAqIC8vIEluaXRpYWxpemUgdGhlIEdlb2xvY2F0ZUNvbnRyb2wuXG4gKiBjb25zdCBnZW9sb2NhdGUgPSBuZXcgbWFwYm94Z2wuR2VvbG9jYXRlQ29udHJvbCh7XG4gKiAgICAgcG9zaXRpb25PcHRpb25zOiB7XG4gKiAgICAgICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogdHJ1ZVxuICogICAgIH0sXG4gKiAgICAgdHJhY2tVc2VyTG9jYXRpb246IHRydWVcbiAqIH0pO1xuICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gKiBtYXAuYWRkQ29udHJvbChnZW9sb2NhdGUpO1xuICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAqIC8vIHdoZW4gYW4gZXJyb3IgZXZlbnQgb2NjdXJzLlxuICogZ2VvbG9jYXRlLm9uKCdlcnJvcicsICgpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZygnQW4gZXJyb3IgZXZlbnQgaGFzIG9jY3VycmVkLicpO1xuICogfSk7XG4gKlxuICovXG5cbi8qKlxuICogRmlyZWQgb24gZWFjaCBHZW9sb2NhdGlvbiBBUEkgcG9zaXRpb24gdXBkYXRlIHRoYXQgcmV0dXJuZWQgYXMgc3VjY2VzcyBidXQgdXNlciBwb3NpdGlvbiBpcyBvdXQgb2YgbWFwIGBtYXhCb3VuZHNgLlxuICpcbiAqIEBldmVudCBvdXRvZm1heGJvdW5kc1xuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gZGF0YSBUaGUgcmV0dXJuZWQgW1Bvc2l0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUG9zaXRpb24pIG9iamVjdCBmcm9tIHRoZSBjYWxsYmFjayBpbiBbR2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi9nZXRDdXJyZW50UG9zaXRpb24pIG9yIFtHZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi93YXRjaFBvc2l0aW9uKS5cbiAqIEBleGFtcGxlXG4gKiAvLyBJbml0aWFsaXplIHRoZSBHZW9sb2NhdGVDb250cm9sLlxuICogY29uc3QgZ2VvbG9jYXRlID0gbmV3IG1hcGJveGdsLkdlb2xvY2F0ZUNvbnRyb2woe1xuICogICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICogICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAqICAgICB9LFxuICogICAgIHRyYWNrVXNlckxvY2F0aW9uOiB0cnVlXG4gKiB9KTtcbiAqIC8vIEFkZCB0aGUgY29udHJvbCB0byB0aGUgbWFwLlxuICogbWFwLmFkZENvbnRyb2woZ2VvbG9jYXRlKTtcbiAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gKiAvLyB3aGVuIGFuIG91dG9mbWF4Ym91bmRzIGV2ZW50IG9jY3Vycy5cbiAqIGdlb2xvY2F0ZS5vbignb3V0b2ZtYXhib3VuZHMnLCAoKSA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coJ0FuIG91dG9mbWF4Ym91bmRzIGV2ZW50IGhhcyBvY2N1cnJlZC4nKTtcbiAqIH0pO1xuICpcbiAqL1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIEdlb2xvY2F0ZUNvbnRyb2wgY2hhbmdlcyB0byB0aGUgYWN0aXZlIGxvY2sgc3RhdGUsIHdoaWNoIGhhcHBlbnMgZWl0aGVyIHVwb24gZmlyc3Qgb2J0YWluaW5nIGEgc3VjY2Vzc2Z1bCBHZW9sb2NhdGlvbiBBUEkgcG9zaXRpb24gZm9yIHRoZSB1c2VyIChhIGdlb2xvY2F0ZSBldmVudCB3aWxsIGZvbGxvdyksIG9yIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBnZW9sb2NhdGUgYnV0dG9uIHdoZW4gaW4gdGhlIGJhY2tncm91bmQgc3RhdGUsIHdoaWNoIHVzZXMgdGhlIGxhc3Qga25vd24gcG9zaXRpb24gdG8gcmVjZW50ZXIgdGhlIG1hcCBhbmQgZW50ZXIgYWN0aXZlIGxvY2sgc3RhdGUgKG5vIGdlb2xvY2F0ZSBldmVudCB3aWxsIGZvbGxvdyB1bmxlc3MgdGhlIHVzZXJzJ3MgbG9jYXRpb24gY2hhbmdlcykuXG4gKlxuICogQGV2ZW50IHRyYWNrdXNlcmxvY2F0aW9uc3RhcnRcbiAqIEBtZW1iZXJvZiBHZW9sb2NhdGVDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBJbml0aWFsaXplIHRoZSBHZW9sb2NhdGVDb250cm9sLlxuICogY29uc3QgZ2VvbG9jYXRlID0gbmV3IG1hcGJveGdsLkdlb2xvY2F0ZUNvbnRyb2woe1xuICogICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICogICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAqICAgICB9LFxuICogICAgIHRyYWNrVXNlckxvY2F0aW9uOiB0cnVlXG4gKiB9KTtcbiAqIC8vIEFkZCB0aGUgY29udHJvbCB0byB0aGUgbWFwLlxuICogbWFwLmFkZENvbnRyb2woZ2VvbG9jYXRlKTtcbiAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gKiAvLyB3aGVuIGEgdHJhY2t1c2VybG9jYXRpb25zdGFydCBldmVudCBvY2N1cnMuXG4gKiBnZW9sb2NhdGUub24oJ3RyYWNrdXNlcmxvY2F0aW9uc3RhcnQnLCAoKSA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coJ0EgdHJhY2t1c2VybG9jYXRpb25zdGFydCBldmVudCBoYXMgb2NjdXJyZWQuJyk7XG4gKiB9KTtcbiAqXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBHZW9sb2NhdGVDb250cm9sIGNoYW5nZXMgdG8gdGhlIGJhY2tncm91bmQgc3RhdGUsIHdoaWNoIGhhcHBlbnMgd2hlbiBhIHVzZXIgY2hhbmdlcyB0aGUgY2FtZXJhIGR1cmluZyBhbiBhY3RpdmUgcG9zaXRpb24gbG9jay4gVGhpcyBvbmx5IGFwcGxpZXMgd2hlbiB0cmFja1VzZXJMb2NhdGlvbiBpcyB0cnVlLiBJbiB0aGUgYmFja2dyb3VuZCBzdGF0ZSwgdGhlIGRvdCBvbiB0aGUgbWFwIHdpbGwgdXBkYXRlIHdpdGggbG9jYXRpb24gdXBkYXRlcyBidXQgdGhlIGNhbWVyYSB3aWxsIG5vdC5cbiAqXG4gKiBAZXZlbnQgdHJhY2t1c2VybG9jYXRpb25lbmRcbiAqIEBtZW1iZXJvZiBHZW9sb2NhdGVDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBJbml0aWFsaXplIHRoZSBHZW9sb2NhdGVDb250cm9sLlxuICogY29uc3QgZ2VvbG9jYXRlID0gbmV3IG1hcGJveGdsLkdlb2xvY2F0ZUNvbnRyb2woe1xuICogICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICogICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAqICAgICB9LFxuICogICAgIHRyYWNrVXNlckxvY2F0aW9uOiB0cnVlXG4gKiB9KTtcbiAqIC8vIEFkZCB0aGUgY29udHJvbCB0byB0aGUgbWFwLlxuICogbWFwLmFkZENvbnRyb2woZ2VvbG9jYXRlKTtcbiAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gKiAvLyB3aGVuIGEgdHJhY2t1c2VybG9jYXRpb25lbmQgZXZlbnQgb2NjdXJzLlxuICogZ2VvbG9jYXRlLm9uKCd0cmFja3VzZXJsb2NhdGlvbmVuZCcsICgpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZygnQSB0cmFja3VzZXJsb2NhdGlvbmVuZCBldmVudCBoYXMgb2NjdXJyZWQuJyk7XG4gKiB9KTtcbiAqXG4gKi9cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20uanMnO1xuaW1wb3J0IHtleHRlbmQsIGJpbmRBbGx9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAuanMnO1xuXG50eXBlIFVuaXQgPSAnaW1wZXJpYWwnIHwgJ21ldHJpYycgfCAnbmF1dGljYWwnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gICAgbWF4V2lkdGg/OiBudW1iZXIsXG4gICAgdW5pdD86IFVuaXQ7XG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgICBtYXhXaWR0aDogMTAwLFxuICAgIHVuaXQ6ICdtZXRyaWMnXG59O1xuXG4vKipcbiAqIEEgYFNjYWxlQ29udHJvbGAgY29udHJvbCBkaXNwbGF5cyB0aGUgcmF0aW8gb2YgYSBkaXN0YW5jZSBvbiB0aGUgbWFwIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRpc3RhbmNlIG9uIHRoZSBncm91bmQuXG4gKiBBZGQgdGhpcyBjb250cm9sIHRvIGEgbWFwIHVzaW5nIHtAbGluayBNYXAjYWRkQ29udHJvbH0uXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdpZHRoPScxMDAnXSBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHNjYWxlIGNvbnRyb2wgaW4gcGl4ZWxzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnVuaXQ9J21ldHJpYyddIFVuaXQgb2YgdGhlIGRpc3RhbmNlIChgJ2ltcGVyaWFsJ2AsIGAnbWV0cmljJ2Agb3IgYCduYXV0aWNhbCdgKS5cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzY2FsZSA9IG5ldyBtYXBib3hnbC5TY2FsZUNvbnRyb2woe1xuICogICAgIG1heFdpZHRoOiA4MCxcbiAqICAgICB1bml0OiAnaW1wZXJpYWwnXG4gKiB9KTtcbiAqIG1hcC5hZGRDb250cm9sKHNjYWxlKTtcbiAqXG4gKiBzY2FsZS5zZXRVbml0KCdtZXRyaWMnKTtcbiAqL1xuY2xhc3MgU2NhbGVDb250cm9sIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgb3B0aW9uczogT3B0aW9ucztcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnc2V0VW5pdCdcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFBvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gJ2JvdHRvbS1sZWZ0JztcbiAgICB9XG5cbiAgICBfb25Nb3ZlKCkge1xuICAgICAgICB1cGRhdGVTY2FsZSh0aGlzLl9tYXAsIHRoaXMuX2NvbnRhaW5lciwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtc2NhbGUnLCBtYXAuZ2V0Q29udGFpbmVyKCkpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbignbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgIHRoaXMuX29uTW92ZSgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgIHRoaXMuX21hcCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzY2FsZSdzIHVuaXQgb2YgdGhlIGRpc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsnaW1wZXJpYWwnIHwgJ21ldHJpYycgfCAnbmF1dGljYWwnfSB1bml0IFVuaXQgb2YgdGhlIGRpc3RhbmNlIChgJ2ltcGVyaWFsJ2AsIGAnbWV0cmljJ2Agb3IgYCduYXV0aWNhbCdgKS5cbiAgICAgKi9cbiAgICBzZXRVbml0KHVuaXQ6IFVuaXQpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnVuaXQgPSB1bml0O1xuICAgICAgICB1cGRhdGVTY2FsZSh0aGlzLl9tYXAsIHRoaXMuX2NvbnRhaW5lciwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNjYWxlQ29udHJvbDtcblxuZnVuY3Rpb24gdXBkYXRlU2NhbGUobWFwLCBjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgICAvLyBBIGhvcml6b250YWwgc2NhbGUgaXMgaW1hZ2luZWQgdG8gYmUgcHJlc2VudCBhdCBjZW50ZXIgb2YgdGhlIG1hcFxuICAgIC8vIGNvbnRhaW5lciB3aXRoIG1heGltdW0gbGVuZ3RoIChEZWZhdWx0KSBhcyAxMDBweC5cbiAgICAvLyBVc2luZyBzcGhlcmljYWwgbGF3IG9mIGNvc2luZXMgYXBwcm94aW1hdGlvbiwgdGhlIHJlYWwgZGlzdGFuY2UgaXNcbiAgICAvLyBmb3VuZCBiZXR3ZWVuIHRoZSB0d28gY29vcmRpbmF0ZXMuXG4gICAgY29uc3QgbWF4V2lkdGggPSBvcHRpb25zICYmIG9wdGlvbnMubWF4V2lkdGggfHwgMTAwO1xuXG4gICAgY29uc3QgeSA9IG1hcC5fY29udGFpbmVySGVpZ2h0IC8gMjtcbiAgICBjb25zdCBsZWZ0ID0gbWFwLnVucHJvamVjdChbMCwgeV0pO1xuICAgIGNvbnN0IHJpZ2h0ID0gbWFwLnVucHJvamVjdChbbWF4V2lkdGgsIHldKTtcbiAgICBjb25zdCBtYXhNZXRlcnMgPSBsZWZ0LmRpc3RhbmNlVG8ocmlnaHQpO1xuICAgIC8vIFRoZSByZWFsIGRpc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gMTAwcHggc2NhbGUgbGVuZ3RoIGlzIHJvdW5kZWQgb2ZmIHRvXG4gICAgLy8gbmVhciBwcmV0dHkgbnVtYmVyIGFuZCB0aGUgc2NhbGUgbGVuZ3RoIGZvciB0aGUgc2FtZSBpcyBmb3VuZCBvdXQuXG4gICAgLy8gRGVmYXVsdCB1bml0IG9mIHRoZSBzY2FsZSBpcyBiYXNlZCBvbiBVc2VyJ3MgbG9jYWxlLlxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudW5pdCA9PT0gJ2ltcGVyaWFsJykge1xuICAgICAgICBjb25zdCBtYXhGZWV0ID0gMy4yODA4ICogbWF4TWV0ZXJzO1xuICAgICAgICBpZiAobWF4RmVldCA+IDUyODApIHtcbiAgICAgICAgICAgIGNvbnN0IG1heE1pbGVzID0gbWF4RmVldCAvIDUyODA7XG4gICAgICAgICAgICBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhNaWxlcywgbWFwLl9nZXRVSVN0cmluZygnU2NhbGVDb250cm9sLk1pbGVzJyksIG1hcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhGZWV0LCBtYXAuX2dldFVJU3RyaW5nKCdTY2FsZUNvbnRyb2wuRmVldCcpLCBtYXApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChvcHRpb25zICYmIG9wdGlvbnMudW5pdCA9PT0gJ25hdXRpY2FsJykge1xuICAgICAgICBjb25zdCBtYXhOYXV0aWNhbHMgPSBtYXhNZXRlcnMgLyAxODUyO1xuICAgICAgICBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhOYXV0aWNhbHMsIG1hcC5fZ2V0VUlTdHJpbmcoJ1NjYWxlQ29udHJvbC5OYXV0aWNhbE1pbGVzJyksIG1hcCk7XG4gICAgfSBlbHNlIGlmIChtYXhNZXRlcnMgPj0gMTAwMCkge1xuICAgICAgICBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhNZXRlcnMgLyAxMDAwLCBtYXAuX2dldFVJU3RyaW5nKCdTY2FsZUNvbnRyb2wuS2lsb21ldGVycycpLCBtYXApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heE1ldGVycywgbWFwLl9nZXRVSVN0cmluZygnU2NhbGVDb250cm9sLk1ldGVycycpLCBtYXApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2V0U2NhbGUoY29udGFpbmVyLCBtYXhXaWR0aCwgbWF4RGlzdGFuY2UsIHVuaXQsIG1hcCkge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gZ2V0Um91bmROdW0obWF4RGlzdGFuY2UpO1xuICAgIGNvbnN0IHJhdGlvID0gZGlzdGFuY2UgLyBtYXhEaXN0YW5jZTtcbiAgICBtYXAuX3JlcXVlc3REb21UYXNrKCgpID0+IHtcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7bWF4V2lkdGggKiByYXRpb31weGA7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgJHtkaXN0YW5jZX0mbmJzcDske3VuaXR9YDtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjaW1hbFJvdW5kTnVtKGQpIHtcbiAgICBjb25zdCBtdWx0aXBsaWVyID0gTWF0aC5wb3coMTAsIE1hdGguY2VpbCgtTWF0aC5sb2coZCkgLyBNYXRoLkxOMTApKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbXVsdGlwbGllcikgLyBtdWx0aXBsaWVyO1xufVxuXG5mdW5jdGlvbiBnZXRSb3VuZE51bShudW0pIHtcbiAgICBjb25zdCBwb3cxMCA9IE1hdGgucG93KDEwLCAoYCR7TWF0aC5mbG9vcihudW0pfWApLmxlbmd0aCAtIDEpO1xuICAgIGxldCBkID0gbnVtIC8gcG93MTA7XG5cbiAgICBkID0gZCA+PSAxMCA/IDEwIDpcbiAgICAgICAgZCA+PSA1ID8gNSA6XG4gICAgICAgIGQgPj0gMyA/IDMgOlxuICAgICAgICBkID49IDIgPyAyIDpcbiAgICAgICAgZCA+PSAxID8gMSA6IGdldERlY2ltYWxSb3VuZE51bShkKTtcblxuICAgIHJldHVybiBwb3cxMCAqIGQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tLmpzJztcblxuaW1wb3J0IHtiaW5kQWxsLCB3YXJuT25jZX0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwLmpzJztcblxudHlwZSBPcHRpb25zID0ge1xuICAgIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50XG59O1xuXG4vKipcbiAqIEEgYEZ1bGxzY3JlZW5Db250cm9sYCBjb250cm9sIGNvbnRhaW5zIGEgYnV0dG9uIGZvciB0b2dnbGluZyB0aGUgbWFwIGluIGFuZCBvdXQgb2YgZnVsbHNjcmVlbiBtb2RlLiBTZWUgdGhlIGByZXF1ZXN0RnVsbFNjcmVlbmAgW2NvbXBhdGliaWxpdHkgdGFibGVdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3JlcXVlc3RGdWxsU2NyZWVuI2Jyb3dzZXJfY29tcGF0aWJpbGl0eSkgZm9yIHN1cHBvcnRlZCBicm93c2Vycy5cbiAqIEFkZCB0aGlzIGNvbnRyb2wgdG8gYSBtYXAgdXNpbmcge0BsaW5rIE1hcCNhZGRDb250cm9sfS5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbb3B0aW9ucy5jb250YWluZXJdIGBjb250YWluZXJgIGlzIHRoZSBbY29tcGF0aWJsZSBET00gZWxlbWVudF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvcmVxdWVzdEZ1bGxTY3JlZW4jQ29tcGF0aWJsZV9lbGVtZW50cykgd2hpY2ggc2hvdWxkIGJlIG1hZGUgZnVsbCBzY3JlZW4uIEJ5IGRlZmF1bHQsIHRoZSBtYXAgY29udGFpbmVyIGVsZW1lbnQgd2lsbCBiZSBtYWRlIGZ1bGwgc2NyZWVuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBtYXAuYWRkQ29udHJvbChuZXcgbWFwYm94Z2wuRnVsbHNjcmVlbkNvbnRyb2woe2NvbnRhaW5lcjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpfSkpO1xuICogQHNlZSBbRXhhbXBsZTogVmlldyBhIGZ1bGxzY3JlZW4gbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2Z1bGxzY3JlZW4vKVxuICovXG5cbmNsYXNzIEZ1bGxzY3JlZW5Db250cm9sIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2NvbnRyb2xDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9mdWxsc2NyZWVuOiBib29sZWFuO1xuICAgIF9mdWxsc2NyZWVuY2hhbmdlOiBzdHJpbmc7XG4gICAgX2Z1bGxzY3JlZW5CdXR0b246IEhUTUxFbGVtZW50O1xuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogT3B0aW9ucykge1xuICAgICAgICB0aGlzLl9mdWxsc2NyZWVuID0gZmFsc2U7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250YWluZXIgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoJ0Z1bGwgc2NyZWVuIGNvbnRyb2wgXFwnY29udGFpbmVyXFwnIG11c3QgYmUgYSBET00gZWxlbWVudC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25DbGlja0Z1bGxzY3JlZW4nLFxuICAgICAgICAgICAgJ19jaGFuZ2VJY29uJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICAgICAgaWYgKCdvbmZ1bGxzY3JlZW5jaGFuZ2UnIGluIHdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9ICdmdWxsc2NyZWVuY2hhbmdlJztcbiAgICAgICAgfSBlbHNlIGlmICgnb253ZWJraXRmdWxsc2NyZWVuY2hhbmdlJyBpbiB3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UgPSAnd2Via2l0ZnVsbHNjcmVlbmNoYW5nZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyKSB0aGlzLl9jb250YWluZXIgPSB0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCBgbWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwYCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGVja0Z1bGxzY3JlZW5TdXBwb3J0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwVUkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHdhcm5PbmNlKCdUaGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGZ1bGxzY3JlZW4gbW9kZS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udHJvbENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5fY29udHJvbENvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5fbWFwID0gKG51bGw6IGFueSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UsIHRoaXMuX2NoYW5nZUljb24pO1xuICAgIH1cblxuICAgIF9jaGVja0Z1bGxzY3JlZW5TdXBwb3J0KCkge1xuICAgICAgICByZXR1cm4gISEoXG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuZnVsbHNjcmVlbkVuYWJsZWQgfHxcbiAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkud2Via2l0RnVsbHNjcmVlbkVuYWJsZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBfc2V0dXBVSSgpIHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbiA9IERPTS5jcmVhdGUoJ2J1dHRvbicsIChgbWFwYm94Z2wtY3RybC1mdWxsc2NyZWVuYCksIHRoaXMuX2NvbnRyb2xDb250YWluZXIpO1xuICAgICAgICBET00uY3JlYXRlKCdzcGFuJywgYG1hcGJveGdsLWN0cmwtaWNvbmAsIGJ1dHRvbikuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuICAgICAgICBidXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICB0aGlzLl91cGRhdGVUaXRsZSgpO1xuICAgICAgICB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGlja0Z1bGxzY3JlZW4pO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl9mdWxsc2NyZWVuY2hhbmdlLCB0aGlzLl9jaGFuZ2VJY29uKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlVGl0bGUoKSB7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gdGhpcy5fZ2V0VGl0bGUoKTtcbiAgICAgICAgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIHRpdGxlKTtcbiAgICAgICAgaWYgKHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uZmlyc3RFbGVtZW50Q2hpbGQpIHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uZmlyc3RFbGVtZW50Q2hpbGQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRpdGxlKTtcbiAgICB9XG5cbiAgICBfZ2V0VGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKHRoaXMuX2lzRnVsbHNjcmVlbigpID8gJ0Z1bGxzY3JlZW5Db250cm9sLkV4aXQnIDogJ0Z1bGxzY3JlZW5Db250cm9sLkVudGVyJyk7XG4gICAgfVxuXG4gICAgX2lzRnVsbHNjcmVlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bGxzY3JlZW47XG4gICAgfVxuXG4gICAgX2NoYW5nZUljb24oKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxzY3JlZW5FbGVtZW50ID1cbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS53ZWJraXRGdWxsc2NyZWVuRWxlbWVudDtcblxuICAgICAgICBpZiAoKGZ1bGxzY3JlZW5FbGVtZW50ID09PSB0aGlzLl9jb250YWluZXIpICE9PSB0aGlzLl9mdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICB0aGlzLl9mdWxsc2NyZWVuID0gIXRoaXMuX2Z1bGxzY3JlZW47XG4gICAgICAgICAgICB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoYG1hcGJveGdsLWN0cmwtc2hyaW5rYCk7XG4gICAgICAgICAgICB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoYG1hcGJveGdsLWN0cmwtZnVsbHNjcmVlbmApO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGl0bGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkNsaWNrRnVsbHNjcmVlbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzRnVsbHNjcmVlbigpKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LmRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgKHdpbmRvdy5kb2N1bWVudDogYW55KS5leGl0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuZG9jdW1lbnQud2Via2l0Q2FuY2VsRnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkud2Via2l0Q2FuY2VsRnVsbFNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NvbnRhaW5lci5yZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuX2NvbnRhaW5lcjogYW55KS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgKHRoaXMuX2NvbnRhaW5lcjogYW55KS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGdWxsc2NyZWVuQ29udHJvbDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7ZXh0ZW5kLCBiaW5kQWxsfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCB7TWFwTW91c2VFdmVudH0gZnJvbSAnLi4vdWkvZXZlbnRzLmpzJztcbmltcG9ydCBET00gZnJvbSAnLi4vdXRpbC9kb20uanMnO1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcbmltcG9ydCBzbWFydFdyYXAgZnJvbSAnLi4vdXRpbC9zbWFydF93cmFwLmpzJztcbmltcG9ydCB7dHlwZSBBbmNob3IsIGFuY2hvclRyYW5zbGF0ZX0gZnJvbSAnLi9hbmNob3IuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAuanMnO1xuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0LmpzJztcbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICBjbG9zZU9uQ2xpY2s6IHRydWUsXG4gICAgZm9jdXNBZnRlck9wZW46IHRydWUsXG4gICAgY2xhc3NOYW1lOiAnJyxcbiAgICBtYXhXaWR0aDogXCIyNDBweFwiXG59O1xuXG5leHBvcnQgdHlwZSBPZmZzZXQgPSBudW1iZXIgfCBQb2ludExpa2UgfCB7W186IEFuY2hvcl06IFBvaW50TGlrZX07XG5cbmV4cG9ydCB0eXBlIFBvcHVwT3B0aW9ucyA9IHtcbiAgICBjbG9zZUJ1dHRvbj86IGJvb2xlYW4sXG4gICAgY2xvc2VPbkNsaWNrPzogYm9vbGVhbixcbiAgICBjbG9zZU9uTW92ZT86IGJvb2xlYW4sXG4gICAgZm9jdXNBZnRlck9wZW4/OiBib29sZWFuLFxuICAgIGFuY2hvcj86IEFuY2hvcixcbiAgICBvZmZzZXQ/OiBPZmZzZXQsXG4gICAgY2xhc3NOYW1lPzogc3RyaW5nLFxuICAgIG1heFdpZHRoPzogc3RyaW5nXG59O1xuXG5jb25zdCBmb2N1c1F1ZXJ5U2VsZWN0b3IgPSBbXG4gICAgXCJhW2hyZWZdXCIsXG4gICAgXCJbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9Jy0xJ10pXCIsXG4gICAgXCJbY29udGVudGVkaXRhYmxlXTpub3QoW2NvbnRlbnRlZGl0YWJsZT0nZmFsc2UnXSlcIixcbiAgICBcImJ1dHRvbjpub3QoW2Rpc2FibGVkXSlcIixcbiAgICBcImlucHV0Om5vdChbZGlzYWJsZWRdKVwiLFxuICAgIFwic2VsZWN0Om5vdChbZGlzYWJsZWRdKVwiLFxuICAgIFwidGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pXCIsXG5dLmpvaW4oXCIsIFwiKTtcblxuLyoqXG4gKiBBIHBvcHVwIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNsb3NlQnV0dG9uPXRydWVdIElmIGB0cnVlYCwgYSBjbG9zZSBidXR0b24gd2lsbCBhcHBlYXIgaW4gdGhlXG4gKiAgIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIHBvcHVwLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jbG9zZU9uQ2xpY2s9dHJ1ZV0gSWYgYHRydWVgLCB0aGUgcG9wdXAgd2lsbCBjbG9zZSB3aGVuIHRoZVxuICogICBtYXAgaXMgY2xpY2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2xvc2VPbk1vdmU9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIHBvcHVwIHdpbGwgY2xvc2Ugd2hlbiB0aGVcbiAqICAgbWFwIG1vdmVzLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mb2N1c0FmdGVyT3Blbj10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBwb3B1cCB3aWxsIHRyeSB0byBmb2N1cyB0aGVcbiAqICAgZmlyc3QgZm9jdXNhYmxlIGVsZW1lbnQgaW5zaWRlIHRoZSBwb3B1cC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hbmNob3JdIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgcGFydCBvZiB0aGUgcG9wdXAgdGhhdCBzaG91bGRcbiAqICAgYmUgcG9zaXRpb25lZCBjbG9zZXN0IHRvIHRoZSBjb29yZGluYXRlLCBzZXQgdmlhIHtAbGluayBQb3B1cCNzZXRMbmdMYXR9LlxuICogICBPcHRpb25zIGFyZSBgJ2NlbnRlcidgLCBgJ3RvcCdgLCBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgYCdyaWdodCdgLCBgJ3RvcC1sZWZ0J2AsXG4gKiAgIGAndG9wLXJpZ2h0J2AsIGAnYm90dG9tLWxlZnQnYCwgYW5kIGAnYm90dG9tLXJpZ2h0J2AuIElmIHVuc2V0LCB0aGUgYW5jaG9yIHdpbGwgYmVcbiAqICAgZHluYW1pY2FsbHkgc2V0IHRvIGVuc3VyZSB0aGUgcG9wdXAgZmFsbHMgd2l0aGluIHRoZSBtYXAgY29udGFpbmVyIHdpdGggYSBwcmVmZXJlbmNlXG4gKiAgIGZvciBgJ2JvdHRvbSdgLlxuICogQHBhcmFtIHtudW1iZXIgfCBQb2ludExpa2UgfCBPYmplY3R9IFtvcHRpb25zLm9mZnNldF0gLVxuICogIEEgcGl4ZWwgb2Zmc2V0IGFwcGxpZWQgdG8gdGhlIHBvcHVwJ3MgbG9jYXRpb24gc3BlY2lmaWVkIGFzOlxuICogICAtIGEgc2luZ2xlIG51bWJlciBzcGVjaWZ5aW5nIGEgZGlzdGFuY2UgZnJvbSB0aGUgcG9wdXAncyBsb2NhdGlvblxuICogICAtIGEge0BsaW5rIFBvaW50TGlrZX0gc3BlY2lmeWluZyBhIGNvbnN0YW50IG9mZnNldFxuICogICAtIGFuIG9iamVjdCBvZiB7QGxpbmsgUG9pbnR9cyBzcGVjaWZpbmcgYW4gb2Zmc2V0IGZvciBlYWNoIGFuY2hvciBwb3NpdGlvbi5cbiAqXG4gKiAgTmVnYXRpdmUgb2Zmc2V0cyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jbGFzc05hbWVdIFNwYWNlLXNlcGFyYXRlZCBDU1MgY2xhc3MgbmFtZXMgdG8gYWRkIHRvIHBvcHVwIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5tYXhXaWR0aD0nMjQwcHgnXSAtXG4gKiAgQSBzdHJpbmcgdGhhdCBzZXRzIHRoZSBDU1MgcHJvcGVydHkgb2YgdGhlIHBvcHVwJ3MgbWF4aW11bSB3aWR0aCAoZm9yIGV4YW1wbGUsIGAnMzAwcHgnYCkuXG4gKiAgVG8gZW5zdXJlIHRoZSBwb3B1cCByZXNpemVzIHRvIGZpdCBpdHMgY29udGVudCwgc2V0IHRoaXMgcHJvcGVydHkgdG8gYCdub25lJ2AuXG4gKiAgU2VlIHRoZSBNRE4gZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGxpc3Qgb2YgW2F2YWlsYWJsZSB2YWx1ZXNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9tYXgtd2lkdGgpLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG1hcmtlckhlaWdodCA9IDUwO1xuICogY29uc3QgbWFya2VyUmFkaXVzID0gMTA7XG4gKiBjb25zdCBsaW5lYXJPZmZzZXQgPSAyNTtcbiAqIGNvbnN0IHBvcHVwT2Zmc2V0cyA9IHtcbiAqICAgICAndG9wJzogWzAsIDBdLFxuICogICAgICd0b3AtbGVmdCc6IFswLCAwXSxcbiAqICAgICAndG9wLXJpZ2h0JzogWzAsIDBdLFxuICogICAgICdib3R0b20nOiBbMCwgLW1hcmtlckhlaWdodF0sXG4gKiAgICAgJ2JvdHRvbS1sZWZ0JzogW2xpbmVhck9mZnNldCwgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cyArIGxpbmVhck9mZnNldCkgKiAtMV0sXG4gKiAgICAgJ2JvdHRvbS1yaWdodCc6IFstbGluZWFyT2Zmc2V0LCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzICsgbGluZWFyT2Zmc2V0KSAqIC0xXSxcbiAqICAgICAnbGVmdCc6IFttYXJrZXJSYWRpdXMsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMpICogLTFdLFxuICogICAgICdyaWdodCc6IFstbWFya2VyUmFkaXVzLCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzKSAqIC0xXVxuICogfTtcbiAqIGNvbnN0IHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKHtvZmZzZXQ6IHBvcHVwT2Zmc2V0cywgY2xhc3NOYW1lOiAnbXktY2xhc3MnfSlcbiAqICAgICAuc2V0TG5nTGF0KGUubG5nTGF0KVxuICogICAgIC5zZXRIVE1MKFwiPGgxPkhlbGxvIFdvcmxkITwvaDE+XCIpXG4gKiAgICAgLnNldE1heFdpZHRoKFwiMzAwcHhcIilcbiAqICAgICAuYWRkVG8obWFwKTtcbiAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgYSBwb3B1cF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC8pXG4gKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGEgcG9wdXAgb24gaG92ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24taG92ZXIvKVxuICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwIG9uIGNsaWNrXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcbiAqIEBzZWUgW0V4YW1wbGU6IEF0dGFjaCBhIHBvcHVwIHRvIGEgbWFya2VyIGluc3RhbmNlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NldC1wb3B1cC8pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvcHVwIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgX21hcDogTWFwO1xuICAgIG9wdGlvbnM6IFBvcHVwT3B0aW9ucztcbiAgICBfY29udGVudDogSFRNTEVsZW1lbnQ7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2Nsb3NlQnV0dG9uOiBIVE1MRWxlbWVudDtcbiAgICBfdGlwOiBIVE1MRWxlbWVudDtcbiAgICBfbG5nTGF0OiBMbmdMYXQ7XG4gICAgX3RyYWNrUG9pbnRlcjogYm9vbGVhbjtcbiAgICBfcG9zOiA/UG9pbnQ7XG4gICAgX2FuY2hvcjogQW5jaG9yO1xuICAgIF9jbGFzc0xpc3Q6IFNldDxzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUG9wdXBPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKGRlZmF1bHRPcHRpb25zKSwgb3B0aW9ucyk7XG4gICAgICAgIGJpbmRBbGwoWydfdXBkYXRlJywgJ19vbkNsb3NlJywgJ3JlbW92ZScsICdfb25Nb3VzZU1vdmUnLCAnX29uTW91c2VVcCcsICdfb25EcmFnJ10sIHRoaXMpO1xuICAgICAgICB0aGlzLl9jbGFzc0xpc3QgPSBuZXcgU2V0KG9wdGlvbnMgJiYgb3B0aW9ucy5jbGFzc05hbWUgP1xuICAgICAgICAgICAgb3B0aW9ucy5jbGFzc05hbWUudHJpbSgpLnNwbGl0KC9cXHMrLykgOiBbXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgcG9wdXAgdG8gYSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXBib3ggR0wgSlMgbWFwIHRvIGFkZCB0aGUgcG9wdXAgdG8uXG4gICAgICogQHJldHVybnMge1BvcHVwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgICAgLnNldExuZ0xhdChbMCwgMF0pXG4gICAgICogICAgIC5zZXRIVE1MKFwiPGgxPk51bGwgSXNsYW5kPC9oMT5cIilcbiAgICAgKiAgICAgLmFkZFRvKG1hcCk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwIG9uIGhvdmVyXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwIG9uIGNsaWNrXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1jbGljay8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogU2hvdyBwb2x5Z29uIGluZm9ybWF0aW9uIG9uIGNsaWNrXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb2x5Z29uLXBvcHVwLW9uLWNsaWNrLylcbiAgICAgKi9cbiAgICBhZGRUbyhtYXA6IE1hcCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB0aGlzLnJlbW92ZSgpO1xuXG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbigncHJlY2xpY2snLCB0aGlzLl9vbkNsb3NlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VPbk1vdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW92ZScsIHRoaXMuX29uQ2xvc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdyZW1vdmUnLCB0aGlzLnJlbW92ZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICB0aGlzLl9mb2N1c0ZpcnN0RWxlbWVudCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl90cmFja1BvaW50ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5fY2FudmFzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLXRyYWNrLXBvaW50ZXInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW92ZScsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmlyZWQgd2hlbiB0aGUgcG9wdXAgaXMgb3BlbmVkIG1hbnVhbGx5IG9yIHByb2dyYW1hdGljYWxseS5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV2ZW50IG9wZW5cbiAgICAgICAgICogQG1lbWJlcm9mIFBvcHVwXG4gICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge1BvcHVwfSBwb3B1cCBPYmplY3QgdGhhdCB3YXMgb3BlbmVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKiAvLyBDcmVhdGUgYSBwb3B1cFxuICAgICAgICAgKiBjb25zdCBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpO1xuICAgICAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCB3aWxsIGZpcmVcbiAgICAgICAgICogLy8gYW55IHRpbWUgdGhlIHBvcHVwIGlzIG9wZW5lZFxuICAgICAgICAgKiBwb3B1cC5vbignb3BlbicsICgpID0+IHtcbiAgICAgICAgICogICAgIGNvbnNvbGUubG9nKCdwb3B1cCB3YXMgb3BlbmVkJyk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnb3BlbicpKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBwb3B1cCBpcyBvcGVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcG9wdXAgaXMgb3BlbiwgYGZhbHNlYCBpZiBpdCBpcyBjbG9zZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc1BvcHVwT3BlbiA9IHBvcHVwLmlzT3BlbigpO1xuICAgICAqL1xuICAgIGlzT3BlbigpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fbWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIHBvcHVwIGZyb20gdGhlIG1hcCBpdCBoYXMgYmVlbiBhZGRlZCB0by5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKS5hZGRUbyhtYXApO1xuICAgICAqIHBvcHVwLnJlbW92ZSgpO1xuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKi9cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9jb250ZW50LnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NvbnRhaW5lcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZScsIHRoaXMuX29uQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignY2xpY2snLCB0aGlzLl9vbkNsb3NlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ3JlbW92ZScsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdXNldXAnLCB0aGlzLl9vbk1vdXNlVXApO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignZHJhZycsIHRoaXMuX29uRHJhZyk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIHBvcHVwIGlzIGNsb3NlZCBtYW51YWxseSBvciBwcm9ncmFtYXRpY2FsbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBjbG9zZVxuICAgICAgICAgKiBAbWVtYmVyb2YgUG9wdXBcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7UG9wdXB9IHBvcHVwIE9iamVjdCB0aGF0IHdhcyBjbG9zZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIC8vIENyZWF0ZSBhIHBvcHVwXG4gICAgICAgICAqIGNvbnN0IHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKCk7XG4gICAgICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgZmlyZVxuICAgICAgICAgKiAvLyBhbnkgdGltZSB0aGUgcG9wdXAgaXMgY2xvc2VkXG4gICAgICAgICAqIHBvcHVwLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICogICAgIGNvbnNvbGUubG9nKCdwb3B1cCB3YXMgY2xvc2VkJyk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnY2xvc2UnKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9mIHRoZSBwb3B1cCdzIGFuY2hvci5cbiAgICAgKlxuICAgICAqIFRoZSBsb25naXR1ZGUgb2YgdGhlIHJlc3VsdCBtYXkgZGlmZmVyIGJ5IGEgbXVsdGlwbGUgb2YgMzYwIGRlZ3JlZXMgZnJvbSB0aGUgbG9uZ2l0dWRlIHByZXZpb3VzbHlcbiAgICAgKiBzZXQgYnkgYHNldExuZ0xhdGAgYmVjYXVzZSBgUG9wdXBgIHdyYXBzIHRoZSBhbmNob3IgbG9uZ2l0dWRlIGFjcm9zcyBjb3BpZXMgb2YgdGhlIHdvcmxkIHRvIGtlZXBcbiAgICAgKiB0aGUgcG9wdXAgb24gc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiBvZiB0aGUgcG9wdXAncyBhbmNob3IuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbmdMYXQgPSBwb3B1cC5nZXRMbmdMYXQoKTtcbiAgICAgKi9cbiAgICBnZXRMbmdMYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sbmdMYXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9mIHRoZSBwb3B1cCdzIGFuY2hvciwgYW5kIG1vdmVzIHRoZSBwb3B1cCB0byBpdC4gUmVwbGFjZXMgdHJhY2tQb2ludGVyKCkgYmVoYXZpb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IGxuZ2xhdCBUaGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIHRvIHNldCBhcyB0aGUgcG9wdXAncyBhbmNob3IuXG4gICAgICogQHJldHVybnMge1BvcHVwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcG9wdXAuc2V0TG5nTGF0KFstMTIyLjQxOTQsIDM3Ljc3NDldKTtcbiAgICAgKi9cbiAgICBzZXRMbmdMYXQobG5nbGF0OiBMbmdMYXRMaWtlKSB7XG4gICAgICAgIHRoaXMuX2xuZ0xhdCA9IExuZ0xhdC5jb252ZXJ0KGxuZ2xhdCk7XG4gICAgICAgIHRoaXMuX3BvcyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fdHJhY2tQb2ludGVyID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdtb3ZlJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5fY2FudmFzQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXRyYWNrLXBvaW50ZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyYWNrcyB0aGUgcG9wdXAgYW5jaG9yIHRvIHRoZSBjdXJzb3IgcG9zaXRpb24gb24gc2NyZWVucyB3aXRoIGEgcG9pbnRlciBkZXZpY2UgKGl0IHdpbGwgYmUgaGlkZGVuIG9uIHRvdWNoc2NyZWVucykuIFJlcGxhY2VzIHRoZSBgc2V0TG5nTGF0YCBiZWhhdmlvci5cbiAgICAgKiBGb3IgbW9zdCB1c2UgY2FzZXMsIHNldCBgY2xvc2VPbkNsaWNrYCBhbmQgYGNsb3NlQnV0dG9uYCB0byBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCh7Y2xvc2VPbkNsaWNrOiBmYWxzZSwgY2xvc2VCdXR0b246IGZhbHNlfSlcbiAgICAgKiAgICAgLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIilcbiAgICAgKiAgICAgLnRyYWNrUG9pbnRlcigpXG4gICAgICogICAgIC5hZGRUbyhtYXApO1xuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKi9cbiAgICB0cmFja1BvaW50ZXIoKSB7XG4gICAgICAgIHRoaXMuX3RyYWNrUG9pbnRlciA9IHRydWU7XG4gICAgICAgIHRoaXMuX3BvcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZU1vdmUpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdkcmFnJywgdGhpcy5fb25EcmFnKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5fY2FudmFzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLXRyYWNrLXBvaW50ZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYFBvcHVwYCdzIEhUTUwgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gQ2hhbmdlIHRoZSBgUG9wdXBgIGVsZW1lbnQncyBmb250IHNpemVcbiAgICAgKiBjb25zdCBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpXG4gICAgICogICAgIC5zZXRMbmdMYXQoWy05NiwgMzcuOF0pXG4gICAgICogICAgIC5zZXRIVE1MKFwiPHA+SGVsbG8gV29ybGQhPC9wPlwiKVxuICAgICAqICAgICAuYWRkVG8obWFwKTtcbiAgICAgKiBjb25zdCBwb3B1cEVsZW0gPSBwb3B1cC5nZXRFbGVtZW50KCk7XG4gICAgICogcG9wdXBFbGVtLnN0eWxlLmZvbnRTaXplID0gXCIyNXB4XCI7XG4gICAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBSZXR1cm5zIGNvbnRhaW5lciBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcG9wdXAncyBjb250ZW50IHRvIGEgc3RyaW5nIG9mIHRleHQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBbVGV4dF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RleHQpIG5vZGUgaW4gdGhlIERPTSxcbiAgICAgKiBzbyBpdCBjYW5ub3QgaW5zZXJ0IHJhdyBIVE1MLiBVc2UgdGhpcyBtZXRob2QgZm9yIHNlY3VyaXR5IGFnYWluc3QgWFNTXG4gICAgICogaWYgdGhlIHBvcHVwIGNvbnRlbnQgaXMgdXNlci1wcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRleHR1YWwgY29udGVudCBmb3IgdGhlIHBvcHVwLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgICAgLnNldExuZ0xhdChlLmxuZ0xhdClcbiAgICAgKiAgICAgLnNldFRleHQoJ0hlbGxvLCB3b3JsZCEnKVxuICAgICAqICAgICAuYWRkVG8obWFwKTtcbiAgICAgKi9cbiAgICBzZXRUZXh0KHRleHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRET01Db250ZW50KHdpbmRvdy5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcG9wdXAncyBjb250ZW50IHRvIHRoZSBIVE1MIHByb3ZpZGVkIGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSBIVE1MIGZpbHRlcmluZyBvciBzYW5pdGl6YXRpb24sIGFuZCBtdXN0IGJlXG4gICAgICogdXNlZCBvbmx5IHdpdGggdHJ1c3RlZCBjb250ZW50LiBDb25zaWRlciB7QGxpbmsgUG9wdXAjc2V0VGV4dH0gaWZcbiAgICAgKiB0aGUgY29udGVudCBpcyBhbiB1bnRydXN0ZWQgdGV4dCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCBBIHN0cmluZyByZXByZXNlbnRpbmcgSFRNTCBjb250ZW50IGZvciB0aGUgcG9wdXAuXG4gICAgICogQHJldHVybnMge1BvcHVwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKVxuICAgICAqICAgICAuc2V0TG5nTGF0KGUubG5nTGF0KVxuICAgICAqICAgICAuc2V0SFRNTChcIjxoMT5IZWxsbyBXb3JsZCE8L2gxPlwiKVxuICAgICAqICAgICAuYWRkVG8obWFwKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGEgcG9wdXBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGEgcG9wdXAgb24gaG92ZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWhvdmVyLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGEgcG9wdXAgb24gY2xpY2tdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBdHRhY2ggYSBwb3B1cCB0byBhIG1hcmtlciBpbnN0YW5jZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2V0LXBvcHVwLylcbiAgICAgKi9cbiAgICBzZXRIVE1MKGh0bWw6IHN0cmluZykge1xuICAgICAgICBjb25zdCBmcmFnID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgY29uc3QgdGVtcCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7XG4gICAgICAgIGxldCBjaGlsZDtcbiAgICAgICAgdGVtcC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgY2hpbGQgPSB0ZW1wLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoIWNoaWxkKSBicmVhaztcbiAgICAgICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RE9NQ29udGVudChmcmFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwb3B1cCdzIG1heGltdW0gd2lkdGguXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbWF4aW11bSB3aWR0aCBvZiB0aGUgcG9wdXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBtYXhXaWR0aCA9IHBvcHVwLmdldE1heFdpZHRoKCk7XG4gICAgICovXG4gICAgZ2V0TWF4V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXIgJiYgdGhpcy5fY29udGFpbmVyLnN0eWxlLm1heFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBvcHVwJ3MgbWF4aW11bSB3aWR0aC4gVGhpcyBpcyBzZXR0aW5nIHRoZSBDU1MgcHJvcGVydHkgYG1heC13aWR0aGAuXG4gICAgICogQXZhaWxhYmxlIHZhbHVlcyBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL21heC13aWR0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXhXaWR0aCBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIGZvciB0aGUgbWF4aW11bSB3aWR0aC5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBwb3B1cC5zZXRNYXhXaWR0aCgnNTAnKTtcbiAgICAgKi9cbiAgICBzZXRNYXhXaWR0aChtYXhXaWR0aDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5tYXhXaWR0aCA9IG1heFdpZHRoO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcG9wdXAncyBjb250ZW50IHRvIHRoZSBlbGVtZW50IHByb3ZpZGVkIGFzIGEgRE9NIG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGh0bWxOb2RlIEEgRE9NIG5vZGUgdG8gYmUgdXNlZCBhcyBjb250ZW50IGZvciB0aGUgcG9wdXAuXG4gICAgICogQHJldHVybnMge1BvcHVwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gY3JlYXRlIGFuIGVsZW1lbnQgd2l0aCB0aGUgcG9wdXAgY29udGVudFxuICAgICAqIGNvbnN0IGRpdiA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgKiBkaXYuaW5uZXJIVE1MID0gJ0hlbGxvLCB3b3JsZCEnO1xuICAgICAqIGNvbnN0IHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgICAgLnNldExuZ0xhdChlLmxuZ0xhdClcbiAgICAgKiAgICAgLnNldERPTUNvbnRlbnQoZGl2KVxuICAgICAqICAgICAuYWRkVG8obWFwKTtcbiAgICAgKi9cbiAgICBzZXRET01Db250ZW50KGh0bWxOb2RlOiBOb2RlKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICAgICAgICAvLyBDbGVhciBvdXQgY2hpbGRyZW4gZmlyc3QuXG4gICAgICAgICAgICB3aGlsZSAodGhpcy5fY29udGVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29udGVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRlbnQucmVtb3ZlQ2hpbGQodGhpcy5fY29udGVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb250ZW50ID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwLWNvbnRlbnQnLCB0aGlzLl9jb250YWluZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGNsb3NlIGJ1dHRvbiBzaG91bGQgYmUgdGhlIGxhc3QgdGFiYmFibGUgZWxlbWVudCBpbnNpZGUgdGhlIHBvcHVwIGZvciBhIGdvb2Qga2V5Ym9hcmQgVVguXG4gICAgICAgIHRoaXMuX2NvbnRlbnQuYXBwZW5kQ2hpbGQoaHRtbE5vZGUpO1xuICAgICAgICB0aGlzLl9jcmVhdGVDbG9zZUJ1dHRvbigpO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgdGhpcy5fZm9jdXNGaXJzdEVsZW1lbnQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIENTUyBjbGFzcyB0byB0aGUgcG9wdXAgY29udGFpbmVyIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIE5vbi1lbXB0eSBzdHJpbmcgd2l0aCBDU1MgY2xhc3MgbmFtZSB0byBhZGQgdG8gcG9wdXAgY29udGFpbmVyLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKTtcbiAgICAgKiBwb3B1cC5hZGRDbGFzc05hbWUoJ3NvbWUtY2xhc3MnKTtcbiAgICAgKi9cbiAgICBhZGRDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDbGFzc0xpc3QoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgQ1NTIGNsYXNzIGZyb20gdGhlIHBvcHVwIGNvbnRhaW5lciBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBOb24tZW1wdHkgc3RyaW5nIHdpdGggQ1NTIGNsYXNzIG5hbWUgdG8gcmVtb3ZlIGZyb20gcG9wdXAgY29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BvcHVwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoe2NsYXNzTmFtZTogJ3NvbWUgY2xhc3Nlcyd9KTtcbiAgICAgKiBwb3B1cC5yZW1vdmVDbGFzc05hbWUoJ3NvbWUnKTtcbiAgICAgKi9cbiAgICByZW1vdmVDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY2xhc3NMaXN0LmRlbGV0ZShjbGFzc05hbWUpO1xuICAgICAgICBpZiAodGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDbGFzc0xpc3QoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUG9pbnRMaWtlIHwgT2JqZWN0fSBvZmZzZXQgU2V0cyB0aGUgcG9wdXAncyBvZmZzZXQuIFRoZSBgT2JqZWN0YCBpcyBvZiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZVxuICAgICAqIHtcbiAgICAgKiAgICAnY2VudGVyJzogP1BvaW50TGlrZSxcbiAgICAgKiAgICAndG9wJzogP1BvaW50TGlrZSxcbiAgICAgKiAgICAnYm90dG9tJzogP1BvaW50TGlrZSxcbiAgICAgKiAgICAnbGVmdCc6ID9Qb2ludExpa2UsXG4gICAgICogICAgJ3JpZ2h0JzogP1BvaW50TGlrZSxcbiAgICAgKiAgICAndG9wLWxlZnQnOiA/UG9pbnRMaWtlLFxuICAgICAqICAgICd0b3AtcmlnaHQnOiA/UG9pbnRMaWtlLFxuICAgICAqICAgICdib3R0b20tbGVmdCc6ID9Qb2ludExpa2UsXG4gICAgICogICAgJ2JvdHRvbS1yaWdodCc6ID9Qb2ludExpa2VcbiAgICAgKiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBwb3B1cC5zZXRPZmZzZXQoMTApO1xuICAgICAqL1xuICAgIHNldE9mZnNldCAob2Zmc2V0PzogT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgb3IgcmVtb3ZlIHRoZSBnaXZlbiBDU1MgY2xhc3Mgb24gdGhlIHBvcHVwIGNvbnRhaW5lciwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvbnRhaW5lciBjdXJyZW50bHkgaGFzIHRoYXQgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIE5vbi1lbXB0eSBzdHJpbmcgd2l0aCBDU1MgY2xhc3MgbmFtZSB0byBhZGQvcmVtb3ZlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IElmIHRoZSBjbGFzcyB3YXMgcmVtb3ZlZCByZXR1cm4gYGZhbHNlYC4gSWYgdGhlIGNsYXNzIHdhcyBhZGRlZCwgdGhlbiByZXR1cm4gYHRydWVgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpO1xuICAgICAqIHBvcHVwLnRvZ2dsZUNsYXNzTmFtZSgnaGlnaGxpZ2h0ZWQnKTtcbiAgICAgKi9cbiAgICB0b2dnbGVDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGZpbmFsU3RhdGU6IGJvb2xlYW47XG4gICAgICAgIGlmICh0aGlzLl9jbGFzc0xpc3QuZGVsZXRlKGNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgIGZpbmFsU3RhdGUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIGZpbmFsU3RhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbFN0YXRlO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbG9zZUJ1dHRvbigpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZUJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24gPSBET00uY3JlYXRlKCdidXR0b24nLCAnbWFwYm94Z2wtcG9wdXAtY2xvc2UtYnV0dG9uJywgdGhpcy5fY29udGVudCk7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQ2xvc2UgcG9wdXAnKTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24uaW5uZXJIVE1MID0gJyYjMjE1Oyc7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xvc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uTW91c2VVcChldmVudDogTWFwTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLl91cGRhdGUoZXZlbnQucG9pbnQpO1xuICAgIH1cblxuICAgIF9vbk1vdXNlTW92ZShldmVudDogTWFwTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLl91cGRhdGUoZXZlbnQucG9pbnQpO1xuICAgIH1cblxuICAgIF9vbkRyYWcoZXZlbnQ6IE1hcE1vdXNlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKGV2ZW50LnBvaW50KTtcbiAgICB9XG5cbiAgICBfZ2V0QW5jaG9yKG9mZnNldDogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYW5jaG9yKSB7IHJldHVybiB0aGlzLm9wdGlvbnMuYW5jaG9yOyB9XG5cbiAgICAgICAgY29uc3QgcG9zOiBhbnkgPSB0aGlzLl9wb3M7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fY29udGFpbmVyLm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLl9jb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBsZXQgYW5jaG9yQ29tcG9uZW50cztcblxuICAgICAgICBpZiAocG9zLnkgKyBvZmZzZXQuYm90dG9tLnkgPCBoZWlnaHQpIHtcbiAgICAgICAgICAgIGFuY2hvckNvbXBvbmVudHMgPSBbJ3RvcCddO1xuICAgICAgICB9IGVsc2UgaWYgKHBvcy55ID4gdGhpcy5fbWFwLnRyYW5zZm9ybS5oZWlnaHQgLSBoZWlnaHQpIHtcbiAgICAgICAgICAgIGFuY2hvckNvbXBvbmVudHMgPSBbJ2JvdHRvbSddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yQ29tcG9uZW50cyA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvcy54IDwgd2lkdGggLyAyKSB7XG4gICAgICAgICAgICBhbmNob3JDb21wb25lbnRzLnB1c2goJ2xlZnQnKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb3MueCA+IHRoaXMuX21hcC50cmFuc2Zvcm0ud2lkdGggLSB3aWR0aCAvIDIpIHtcbiAgICAgICAgICAgIGFuY2hvckNvbXBvbmVudHMucHVzaCgncmlnaHQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhbmNob3JDb21wb25lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuICdib3R0b20nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoKGFuY2hvckNvbXBvbmVudHMuam9pbignLScpOiBhbnkpOiBBbmNob3IpO1xuXG4gICAgfVxuXG4gICAgX3VwZGF0ZUNsYXNzTGlzdCgpIHtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFsuLi50aGlzLl9jbGFzc0xpc3RdO1xuICAgICAgICBjbGFzc2VzLnB1c2goJ21hcGJveGdsLXBvcHVwJyk7XG4gICAgICAgIGlmICh0aGlzLl9hbmNob3IpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaChgbWFwYm94Z2wtcG9wdXAtYW5jaG9yLSR7dGhpcy5fYW5jaG9yfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90cmFja1BvaW50ZXIpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnbWFwYm94Z2wtcG9wdXAtdHJhY2stcG9pbnRlcicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc05hbWUgPSBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlKGN1cnNvcjogP1BvaW50TGlrZSkge1xuICAgICAgICBjb25zdCBoYXNQb3NpdGlvbiA9IHRoaXMuX2xuZ0xhdCB8fCB0aGlzLl90cmFja1BvaW50ZXI7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9tYXAgfHwgIWhhc1Bvc2l0aW9uIHx8ICF0aGlzLl9jb250ZW50KSB7IHJldHVybjsgfVxuXG4gICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtcG9wdXAnLCB0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCkpO1xuICAgICAgICAgICAgdGhpcy5fdGlwICAgICAgID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwLXRpcCcsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1heFdpZHRoICYmIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5tYXhXaWR0aCAhPT0gdGhpcy5vcHRpb25zLm1heFdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUubWF4V2lkdGggPSB0aGlzLm9wdGlvbnMubWF4V2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWFwLnRyYW5zZm9ybS5yZW5kZXJXb3JsZENvcGllcyAmJiAhdGhpcy5fdHJhY2tQb2ludGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9sbmdMYXQgPSBzbWFydFdyYXAodGhpcy5fbG5nTGF0LCB0aGlzLl9wb3MsIHRoaXMuX21hcC50cmFuc2Zvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl90cmFja1BvaW50ZXIgfHwgY3Vyc29yKSB7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSB0aGlzLl9wb3MgPSB0aGlzLl90cmFja1BvaW50ZXIgJiYgY3Vyc29yID8gY3Vyc29yIDogdGhpcy5fbWFwLnByb2plY3QodGhpcy5fbG5nTGF0KTtcblxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gbm9ybWFsaXplT2Zmc2V0KHRoaXMub3B0aW9ucy5vZmZzZXQpO1xuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gdGhpcy5fYW5jaG9yID0gdGhpcy5fZ2V0QW5jaG9yKG9mZnNldCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldGVkUG9zID0gcG9zLmFkZChvZmZzZXRbYW5jaG9yXSkucm91bmQoKTtcbiAgICAgICAgICAgIHRoaXMuX21hcC5fcmVxdWVzdERvbVRhc2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb250YWluZXIgJiYgYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSBgJHthbmNob3JUcmFuc2xhdGVbYW5jaG9yXX0gdHJhbnNsYXRlKCR7b2Zmc2V0ZWRQb3MueH1weCwke29mZnNldGVkUG9zLnl9cHgpYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTGlzdCgpO1xuICAgIH1cblxuICAgIF9mb2N1c0ZpcnN0RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZm9jdXNBZnRlck9wZW4gfHwgIXRoaXMuX2NvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0Rm9jdXNhYmxlID0gdGhpcy5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoZm9jdXNRdWVyeVNlbGVjdG9yKTtcblxuICAgICAgICBpZiAoZmlyc3RGb2N1c2FibGUpIGZpcnN0Rm9jdXNhYmxlLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgX29uQ2xvc2UoKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgX3NldE9wYWNpdHkob3BhY2l0eTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50KSB0aGlzLl9jb250ZW50LnN0eWxlLm9wYWNpdHkgPSBvcGFjaXR5O1xuICAgICAgICBpZiAodGhpcy5fdGlwKSAgdGhpcy5fdGlwLnN0eWxlLm9wYWNpdHkgPSBvcGFjaXR5O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KG9mZnNldDogP09mZnNldCkge1xuICAgIGlmICghb2Zmc2V0KSBvZmZzZXQgPSAobmV3IFBvaW50KDAsIDApKTtcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBpbnB1dCBzcGVjaWZpZXMgYSByYWRpdXMgZnJvbSB3aGljaCB0byBjYWxjdWxhdGUgb2Zmc2V0cyBhdCBhbGwgcG9zaXRpb25zXG4gICAgICAgIGNvbnN0IGNvcm5lck9mZnNldCA9IE1hdGgucm91bmQoTWF0aC5zcXJ0KDAuNSAqIE1hdGgucG93KG9mZnNldCwgMikpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdjZW50ZXInOiBuZXcgUG9pbnQoMCwgMCksXG4gICAgICAgICAgICAndG9wJzogbmV3IFBvaW50KDAsIG9mZnNldCksXG4gICAgICAgICAgICAndG9wLWxlZnQnOiBuZXcgUG9pbnQoY29ybmVyT2Zmc2V0LCBjb3JuZXJPZmZzZXQpLFxuICAgICAgICAgICAgJ3RvcC1yaWdodCc6IG5ldyBQb2ludCgtY29ybmVyT2Zmc2V0LCBjb3JuZXJPZmZzZXQpLFxuICAgICAgICAgICAgJ2JvdHRvbSc6IG5ldyBQb2ludCgwLCAtb2Zmc2V0KSxcbiAgICAgICAgICAgICdib3R0b20tbGVmdCc6IG5ldyBQb2ludChjb3JuZXJPZmZzZXQsIC1jb3JuZXJPZmZzZXQpLFxuICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCc6IG5ldyBQb2ludCgtY29ybmVyT2Zmc2V0LCAtY29ybmVyT2Zmc2V0KSxcbiAgICAgICAgICAgICdsZWZ0JzogbmV3IFBvaW50KG9mZnNldCwgMCksXG4gICAgICAgICAgICAncmlnaHQnOiBuZXcgUG9pbnQoLW9mZnNldCwgMClcbiAgICAgICAgfTtcblxuICAgIH0gZWxzZSBpZiAob2Zmc2V0IGluc3RhbmNlb2YgUG9pbnQgfHwgQXJyYXkuaXNBcnJheShvZmZzZXQpKSB7XG4gICAgICAgIC8vIGlucHV0IHNwZWNpZmllcyBhIHNpbmdsZSBvZmZzZXQgdG8gYmUgYXBwbGllZCB0byBhbGwgcG9zaXRpb25zXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZE9mZnNldCA9IFBvaW50LmNvbnZlcnQob2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdjZW50ZXInOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAndG9wJzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ3RvcC1sZWZ0JzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ3RvcC1yaWdodCc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdib3R0b20nOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAnYm90dG9tLWxlZnQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ2xlZnQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAncmlnaHQnOiBjb252ZXJ0ZWRPZmZzZXRcbiAgICAgICAgfTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlucHV0IHNwZWNpZmllcyBhbiBvZmZzZXQgcGVyIHBvc2l0aW9uXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnY2VudGVyJzogUG9pbnQuY29udmVydChvZmZzZXRbJ2NlbnRlciddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAndG9wJzogUG9pbnQuY29udmVydChvZmZzZXRbJ3RvcCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAndG9wLWxlZnQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsndG9wLWxlZnQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ3RvcC1yaWdodCc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wyd0b3AtcmlnaHQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2JvdHRvbSc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wydib3R0b20nXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ2JvdHRvbS1sZWZ0J10gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICdib3R0b20tcmlnaHQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsnYm90dG9tLXJpZ2h0J10gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICdsZWZ0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ2xlZnQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ3JpZ2h0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ3JpZ2h0J10gfHwgWzAsIDBdKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cuanMnO1xuXG5pbXBvcnQgRGlzcGF0Y2hlciBmcm9tICcuL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IGdldFdvcmtlclBvb2wgZnJvbSAnLi9nbG9iYWxfd29ya2VyX3Bvb2wuanMnO1xuaW1wb3J0IHtQZXJmb3JtYW5jZVV0aWxzfSBmcm9tICcuL3BlcmZvcm1hbmNlLmpzJztcblxuY29uc3QgcGVyZm9ybWFuY2UgPSB3aW5kb3cucGVyZm9ybWFuY2U7XG5cbi8vIHNlcGFyYXRlIGZyb20gUGVyZm9ybWFuY2VVdGlscyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG5cbmV4cG9ydCBjb25zdCBXb3JrZXJQZXJmb3JtYW5jZVV0aWxzID0ge1xuXG4gICAgZ2V0UGVyZm9ybWFuY2VNZXRyaWNzQXN5bmMoY2FsbGJhY2s6IChlcnJvcjogP0Vycm9yLCByZXN1bHQ6ID9PYmplY3QpID0+IHZvaWQpIHtcbiAgICAgICAgY29uc3QgbWV0cmljcyA9IFBlcmZvcm1hbmNlVXRpbHMuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRGlzcGF0Y2hlcihnZXRXb3JrZXJQb29sKCksIHRoaXMpO1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVRpbWUgPSBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKCdjcmVhdGUnLCAnbWFyaycpWzBdLnN0YXJ0VGltZTtcblxuICAgICAgICBkaXNwYXRjaGVyLmJyb2FkY2FzdCgnZ2V0V29ya2VyUGVyZm9ybWFuY2VNZXRyaWNzJywge30sIChlcnIsIHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgIGRpc3BhdGNoZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VtcyA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtZWFzdXJlIG9mIHJlc3VsdC5tZWFzdXJlcykge1xuICAgICAgICAgICAgICAgICAgICBzdW1zW21lYXN1cmUubmFtZV0gPSAoc3Vtc1ttZWFzdXJlLm5hbWVdIHx8IDApICsgbWVhc3VyZS5kdXJhdGlvbjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdW1zLndvcmtlckluaXRpYWxpemF0aW9uID0gcmVzdWx0LnRpbWVPcmlnaW4gLSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luIC0gY3JlYXRlVGltZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIHN1bXMpIHtcbiAgICAgICAgICAgICAgICBtZXRyaWNzW25hbWVdID0gc3Vtc1tuYW1lXSAvIHJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtZXRyaWNzLndvcmtlcklkbGUgPSBtZXRyaWNzLmxvYWRUaW1lIC0gbWV0cmljcy53b3JrZXJJbml0aWFsaXphdGlvbiAtIG1ldHJpY3Mud29ya2VyRXZhbHVhdGVTY3JpcHQgLSBtZXRyaWNzLndvcmtlclRhc2s7XG4gICAgICAgICAgICBtZXRyaWNzLndvcmtlcklkbGVQZXJjZW50ID0gbWV0cmljcy53b3JrZXJJZGxlIC8gbWV0cmljcy5sb2FkVGltZTtcblxuICAgICAgICAgICAgbWV0cmljcy5wYXJzZVRpbGUgPSBtZXRyaWNzLnBhcnNlVGlsZTEgKyBtZXRyaWNzLnBhcnNlVGlsZTI7XG5cbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh1bmRlZmluZWQsIG1ldHJpY3MpO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtzdXBwb3J0ZWR9IGZyb20gJ0BtYXBib3gvbWFwYm94LWdsLXN1cHBvcnRlZCc7XG5cbmltcG9ydCB7dmVyc2lvbn0gZnJvbSAnLi4vcGFja2FnZS5qc29uJztcbmltcG9ydCBNYXAgZnJvbSAnLi91aS9tYXAuanMnO1xuaW1wb3J0IE5hdmlnYXRpb25Db250cm9sIGZyb20gJy4vdWkvY29udHJvbC9uYXZpZ2F0aW9uX2NvbnRyb2wuanMnO1xuaW1wb3J0IEdlb2xvY2F0ZUNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL2dlb2xvY2F0ZV9jb250cm9sLmpzJztcbmltcG9ydCBBdHRyaWJ1dGlvbkNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL2F0dHJpYnV0aW9uX2NvbnRyb2wuanMnO1xuaW1wb3J0IFNjYWxlQ29udHJvbCBmcm9tICcuL3VpL2NvbnRyb2wvc2NhbGVfY29udHJvbC5qcyc7XG5pbXBvcnQgRnVsbHNjcmVlbkNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL2Z1bGxzY3JlZW5fY29udHJvbC5qcyc7XG5pbXBvcnQgUG9wdXAgZnJvbSAnLi91aS9wb3B1cC5qcyc7XG5pbXBvcnQgTWFya2VyIGZyb20gJy4vdWkvbWFya2VyLmpzJztcbmltcG9ydCBTdHlsZSBmcm9tICcuL3N0eWxlL3N0eWxlLmpzJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgTG5nTGF0Qm91bmRzIGZyb20gJy4vZ2VvL2xuZ19sYXRfYm91bmRzLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQge0V2ZW50ZWR9IGZyb20gJy4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCBjb25maWcgZnJvbSAnLi91dGlsL2NvbmZpZy5qcyc7XG5pbXBvcnQge0RlYnVnfSBmcm9tICcuL3V0aWwvZGVidWcuanMnO1xuaW1wb3J0IHtpc1NhZmFyaX0gZnJvbSAnLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtzZXRSVExUZXh0UGx1Z2luLCBnZXRSVExUZXh0UGx1Z2luU3RhdHVzfSBmcm9tICcuL3NvdXJjZS9ydGxfdGV4dF9wbHVnaW4uanMnO1xuaW1wb3J0IFdvcmtlclBvb2wgZnJvbSAnLi91dGlsL3dvcmtlcl9wb29sLmpzJztcbmltcG9ydCB7cHJld2FybSwgY2xlYXJQcmV3YXJtZWRSZXNvdXJjZXN9IGZyb20gJy4vdXRpbC9nbG9iYWxfd29ya2VyX3Bvb2wuanMnO1xuaW1wb3J0IHtjbGVhclRpbGVDYWNoZX0gZnJvbSAnLi91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZS5qcyc7XG5pbXBvcnQge1dvcmtlclBlcmZvcm1hbmNlVXRpbHN9IGZyb20gJy4vdXRpbC93b3JrZXJfcGVyZm9ybWFuY2VfdXRpbHMuanMnO1xuaW1wb3J0IHtQZXJmb3JtYW5jZVV0aWxzfSBmcm9tICcuL3V0aWwvcGVyZm9ybWFuY2UuanMnO1xuaW1wb3J0IHtGcmVlQ2FtZXJhT3B0aW9uc30gZnJvbSAnLi91aS9mcmVlX2NhbWVyYS5qcyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuL3V0aWwvYnJvd3Nlci5qcyc7XG5cbmNvbnN0IGV4cG9ydGVkID0ge1xuICAgIHZlcnNpb24sXG4gICAgc3VwcG9ydGVkLFxuICAgIHNldFJUTFRleHRQbHVnaW4sXG4gICAgZ2V0UlRMVGV4dFBsdWdpblN0YXR1cyxcbiAgICBNYXAsXG4gICAgTmF2aWdhdGlvbkNvbnRyb2wsXG4gICAgR2VvbG9jYXRlQ29udHJvbCxcbiAgICBBdHRyaWJ1dGlvbkNvbnRyb2wsXG4gICAgU2NhbGVDb250cm9sLFxuICAgIEZ1bGxzY3JlZW5Db250cm9sLFxuICAgIFBvcHVwLFxuICAgIE1hcmtlcixcbiAgICBTdHlsZSxcbiAgICBMbmdMYXQsXG4gICAgTG5nTGF0Qm91bmRzLFxuICAgIFBvaW50LFxuICAgIE1lcmNhdG9yQ29vcmRpbmF0ZSxcbiAgICBGcmVlQ2FtZXJhT3B0aW9ucyxcbiAgICBFdmVudGVkLFxuICAgIGNvbmZpZyxcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyByZXNvdXJjZXMgbGlrZSBXZWJXb3JrZXJzIHRoYXQgY2FuIGJlIHNoYXJlZCBhY3Jvc3MgbWFwcyB0byBsb3dlciBsb2FkXG4gICAgICogdGltZXMgaW4gc29tZSBzaXR1YXRpb25zLiBgbWFwYm94Z2wud29ya2VyVXJsYCBhbmQgYG1hcGJveGdsLndvcmtlckNvdW50YCwgaWYgYmVpbmdcbiAgICAgKiB1c2VkLCBtdXN0IGJlIHNldCBiZWZvcmUgYHByZXdhcm0oKWAgaXMgY2FsbGVkIHRvIGhhdmUgYW4gZWZmZWN0LlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGxpZmVjeWNsZSBvZiB0aGVzZSByZXNvdXJjZXMgaXMgbWFuYWdlZCBhdXRvbWF0aWNhbGx5LCBhbmQgdGhleSBhcmVcbiAgICAgKiBsYXppbHkgaW5pdGlhbGl6ZWQgd2hlbiBhIGBNYXBgIGlzIGZpcnN0IGNyZWF0ZWQuIEludm9raW5nIGBwcmV3YXJtKClgIGNyZWF0ZXMgdGhlc2VcbiAgICAgKiByZXNvdXJjZXMgYWhlYWQgb2YgdGltZSBhbmQgZW5zdXJlcyB0aGV5IGFyZSBub3QgY2xlYXJlZCB3aGVuIHRoZSBsYXN0IGBNYXBgXG4gICAgICogaXMgcmVtb3ZlZCBmcm9tIHRoZSBwYWdlLiBUaGlzIGFsbG93cyB0aGVtIHRvIGJlIHJlLXVzZWQgYnkgbmV3IGBNYXBgIGluc3RhbmNlcyB0aGF0XG4gICAgICogYXJlIGNyZWF0ZWQgbGF0ZXIuIFRoZXkgY2FuIGJlIG1hbnVhbGx5IGNsZWFyZWQgYnkgY2FsbGluZ1xuICAgICAqIGBtYXBib3hnbC5jbGVhclByZXdhcm1lZFJlc291cmNlcygpYC4gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3VyIHdlYiBwYWdlXG4gICAgICogcmVtYWlucyBhY3RpdmUgYnV0IHN0b3BzIHVzaW5nIG1hcHMgYWx0b2dldGhlci4gYHByZXdhcm0oKWAgaXMgaWRlbXBvdGVudFxuICAgICAqIGFuZCBoYXMgZ3VhcmRzIGFnYWluc3QgYmVpbmcgZXhlY3V0ZWQgbXVsdGlwbGUgdGltZXMsIGFuZCBhbnkgcmVzb3VyY2VzXG4gICAgICogYWxsb2NhdGVkIGJ5IGBwcmV3YXJtKClgIGFyZSBjcmVhdGVkIHN5bmNocm9ub3VzbHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgd2hlbiB1c2luZyBNYXBib3ggR0wgSlMgbWFwcyBpbiBhIHNpbmdsZSBwYWdlIGFwcCxcbiAgICAgKiBpbiB3aGljaCBhIHVzZXIgbmF2aWdhdGVzIGJldHdlZW4gdmFyaW91cyB2aWV3cywgcmVzdWx0aW5nIGluXG4gICAgICogY29uc3RhbnQgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIG9mIGBNYXBgIGluc3RhbmNlcy5cbiAgICAgKlxuICAgICAqIEBmdW5jdGlvbiBwcmV3YXJtXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXBib3hnbC5wcmV3YXJtKCk7XG4gICAgICovXG4gICAgcHJld2FybSxcbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdXAgcmVzb3VyY2VzIHRoYXQgaGF2ZSBwcmV2aW91c2x5IGJlZW4gY3JlYXRlZCBieSBgbWFwYm94Z2wucHJld2FybSgpYC5cbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyB0eXBpY2FsbHkgbm90IG5lY2Vzc2FyeS4gWW91IHNob3VsZCBvbmx5IGNhbGwgdGhpcyBmdW5jdGlvblxuICAgICAqIGlmIHlvdSBleHBlY3QgdGhlIHVzZXIgb2YgeW91ciBhcHAgdG8gbm90IHJldHVybiB0byBhIE1hcCB2aWV3IGF0IGFueSBwb2ludFxuICAgICAqIGluIHlvdXIgYXBwbGljYXRpb24uXG4gICAgICpcbiAgICAgKiBAZnVuY3Rpb24gY2xlYXJQcmV3YXJtZWRSZXNvdXJjZXNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcGJveGdsLmNsZWFyUHJld2FybWVkUmVzb3VyY2VzKCk7XG4gICAgICovXG4gICAgY2xlYXJQcmV3YXJtZWRSZXNvdXJjZXMsXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBtYXAncyBbYWNjZXNzIHRva2VuXShodHRwczovL3d3dy5tYXBib3guY29tL2hlbHAvZGVmaW5lLWFjY2Vzcy10b2tlbi8pLlxuICAgICAqXG4gICAgICogQHZhciB7c3RyaW5nfSBhY2Nlc3NUb2tlblxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjdXJyZW50bHkgc2V0IGFjY2VzcyB0b2tlbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcGJveGdsLmFjY2Vzc1Rva2VuID0gbXlBY2Nlc3NUb2tlbjtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGEgbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NpbXBsZS1tYXAvKVxuICAgICAqL1xuICAgIGdldCBhY2Nlc3NUb2tlbigpOiA/c3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5BQ0NFU1NfVE9LRU47XG4gICAgfSxcblxuICAgIHNldCBhY2Nlc3NUb2tlbih0b2tlbjogc3RyaW5nKSB7XG4gICAgICAgIGNvbmZpZy5BQ0NFU1NfVE9LRU4gPSB0b2tlbjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyB0aGUgbWFwJ3MgZGVmYXVsdCBBUEkgVVJMIGZvciByZXF1ZXN0aW5nIHRpbGVzLCBzdHlsZXMsIHNwcml0ZXMsIGFuZCBnbHlwaHMuXG4gICAgICpcbiAgICAgKiBAdmFyIHtzdHJpbmd9IGJhc2VBcGlVcmxcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY3VycmVudCBiYXNlIEFQSSBVUkwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXBib3hnbC5iYXNlQXBpVXJsID0gJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20nO1xuICAgICAqL1xuICAgIGdldCBiYXNlQXBpVXJsKCk6ID9zdHJpbmcge1xuICAgICAgICByZXR1cm4gY29uZmlnLkFQSV9VUkw7XG4gICAgfSxcblxuICAgIHNldCBiYXNlQXBpVXJsKHVybDogc3RyaW5nKSB7XG4gICAgICAgIGNvbmZpZy5BUElfVVJMID0gdXJsO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBudW1iZXIgb2Ygd2ViIHdvcmtlcnMgaW5zdGFudGlhdGVkIG9uIGEgcGFnZSB3aXRoIE1hcGJveCBHTCBKUyBtYXBzLlxuICAgICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNldCB0byAyLlxuICAgICAqIE1ha2Ugc3VyZSB0byBzZXQgdGhpcyBwcm9wZXJ0eSBiZWZvcmUgY3JlYXRpbmcgYW55IG1hcCBpbnN0YW5jZXMgZm9yIGl0IHRvIGhhdmUgZWZmZWN0LlxuICAgICAqXG4gICAgICogQHZhciB7c3RyaW5nfSB3b3JrZXJDb3VudFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IE51bWJlciBvZiB3b3JrZXJzIGN1cnJlbnRseSBjb25maWd1cmVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwYm94Z2wud29ya2VyQ291bnQgPSA0O1xuICAgICAqL1xuICAgIGdldCB3b3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gV29ya2VyUG9vbC53b3JrZXJDb3VudDtcbiAgICB9LFxuXG4gICAgc2V0IHdvcmtlckNvdW50KGNvdW50OiBudW1iZXIpIHtcbiAgICAgICAgV29ya2VyUG9vbC53b3JrZXJDb3VudCA9IGNvdW50O1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbWFnZXMgKHJhc3RlciB0aWxlcywgc3ByaXRlcywgaWNvbnMpIHRvIGxvYWQgaW4gcGFyYWxsZWwuXG4gICAgICogMTYgYnkgZGVmYXVsdC4gVGhlcmUgaXMgbm8gbWF4aW11bSB2YWx1ZSwgYnV0IHRoZSBudW1iZXIgb2YgaW1hZ2VzIGFmZmVjdHMgcGVyZm9ybWFuY2UgaW4gcmFzdGVyLWhlYXZ5IG1hcHMuXG4gICAgICpcbiAgICAgKiBAdmFyIHtzdHJpbmd9IG1heFBhcmFsbGVsSW1hZ2VSZXF1ZXN0c1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IE51bWJlciBvZiBwYXJhbGxlbCByZXF1ZXN0cyBjdXJyZW50bHkgY29uZmlndXJlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcGJveGdsLm1heFBhcmFsbGVsSW1hZ2VSZXF1ZXN0cyA9IDEwO1xuICAgICAqL1xuICAgIGdldCBtYXhQYXJhbGxlbEltYWdlUmVxdWVzdHMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFM7XG4gICAgfSxcblxuICAgIHNldCBtYXhQYXJhbGxlbEltYWdlUmVxdWVzdHMobnVtUmVxdWVzdHM6IG51bWJlcikge1xuICAgICAgICBjb25maWcuTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTID0gbnVtUmVxdWVzdHM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENsZWFycyBicm93c2VyIHN0b3JhZ2UgdXNlZCBieSB0aGlzIGxpYnJhcnkuIFVzaW5nIHRoaXMgbWV0aG9kIGZsdXNoZXMgdGhlIE1hcGJveCB0aWxlXG4gICAgICogY2FjaGUgdGhhdCBpcyBtYW5hZ2VkIGJ5IHRoaXMgbGlicmFyeS4gVGlsZXMgbWF5IHN0aWxsIGJlIGNhY2hlZCBieSB0aGUgYnJvd3NlclxuICAgICAqIGluIHNvbWUgY2FzZXMuXG4gICAgICpcbiAgICAgKiBUaGlzIEFQSSBpcyBzdXBwb3J0ZWQgb24gYnJvd3NlcnMgd2hlcmUgdGhlIFtgQ2FjaGVgIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NhY2hlKVxuICAgICAqIGlzIHN1cHBvcnRlZCBhbmQgZW5hYmxlZC4gVGhpcyBpbmNsdWRlcyBhbGwgbWFqb3IgYnJvd3NlcnMgd2hlbiBwYWdlcyBhcmUgc2VydmVkIG92ZXJcbiAgICAgKiBgaHR0cHM6Ly9gLCBleGNlcHQgSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgTW9iaWxlLlxuICAgICAqXG4gICAgICogV2hlbiBjYWxsZWQgaW4gdW5zdXBwb3J0ZWQgYnJvd3NlcnMgb3IgZW52aXJvbm1lbnRzIChwcml2YXRlIG9yIGluY29nbml0byBtb2RlKSwgdGhlXG4gICAgICogY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbiBlcnJvciBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIEBmdW5jdGlvbiBjbGVhclN0b3JhZ2VcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgd2l0aCBhbiBlcnJvciBhcmd1bWVudCBpZiB0aGVyZSBpcyBhbiBlcnJvci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcGJveGdsLmNsZWFyU3RvcmFnZSgpO1xuICAgICAqL1xuICAgIGNsZWFyU3RvcmFnZShjYWxsYmFjaz86IChlcnI6ID9FcnJvcikgPT4gdm9pZCkge1xuICAgICAgICBjbGVhclRpbGVDYWNoZShjYWxsYmFjayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGxvYWRpbmcgbWFwYm94LWdsJ3MgV2ViV29ya2VyIGJ1bmRsZSBmcm9tIGEgc2VsZi1ob3N0ZWQgVVJMLlxuICAgICAqIFRoaXMgbmVlZHMgdG8gYmUgc2V0IG9ubHkgb25jZSwgYW5kIGJlZm9yZSBhbnkgY2FsbCB0byBgbmV3IG1hcGJveGdsLk1hcCguLilgIHRha2VzIHBsYWNlLlxuICAgICAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdXIgc2l0ZSBuZWVkcyB0byBvcGVyYXRlIGluIGEgc3RyaWN0IENTUCAoQ29udGVudCBTZWN1cml0eSBQb2xpY3kpIGVudmlyb25tZW50XG4gICAgICogd2hlcmVpbiB5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIGxvYWQgSmF2YVNjcmlwdCBjb2RlIGZyb20gYSBbYEJsb2JgIFVSTF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTC9jcmVhdGVPYmplY3RVUkwpLCB3aGljaCBpcyBkZWZhdWx0IGJlaGF2aW9yLlxuICAgICAqXG4gICAgICogU2VlIG91ciBkb2N1bWVudGF0aW9uIG9uIFtDU1AgRGlyZWN0aXZlc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS8jY3NwLWRpcmVjdGl2ZXMpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAdmFyIHtzdHJpbmd9IHdvcmtlclVybFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IEEgVVJMIGhvc3RpbmcgYSBKYXZhU2NyaXB0IGJ1bmRsZSBmb3IgbWFwYm94LWdsJ3MgV2ViV29ya2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogPHNjcmlwdCBzcmM9J2h0dHBzOi8vYXBpLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3YyLjMuMS9tYXBib3gtZ2wtY3NwLmpzJz48L3NjcmlwdD5cbiAgICAgKiA8c2NyaXB0PlxuICAgICAqIG1hcGJveGdsLndvcmtlclVybCA9IFwiaHR0cHM6Ly9hcGkubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvdjIuMy4xL21hcGJveC1nbC1jc3Atd29ya2VyLmpzXCI7XG4gICAgICogLi4uXG4gICAgICogPC9zY3JpcHQ+XG4gICAgICovXG4gICAgd29ya2VyVXJsOiAnJyxcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZXh0ZXJuYWwgbW9kdWxlIGJ1bmRsZXJzIHN1Y2ggYXMgV2VicGFjayBvciBSb2xsdXAgdG8gcGFja2FnZVxuICAgICAqIG1hcGJveC1nbCdzIFdlYldvcmtlciBpbnRvIGEgc2VwYXJhdGUgY2xhc3MgYW5kIGludGVncmF0ZSBpdCB3aXRoIHRoZSBsaWJyYXJ5LlxuICAgICAqXG4gICAgICogVGFrZXMgcHJlY2VkZW5jZSBvdmVyIGBtYXBib3hnbC53b3JrZXJVcmxgLlxuICAgICAqXG4gICAgICogQHZhciB7T2JqZWN0fSB3b3JrZXJDbGFzc1xuICAgICAqIEByZXR1cm5zIHtPYmplY3QgfCBudWxsfSBBIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgYFdvcmtlcmAgaW50ZXJmYWNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogaW1wb3J0IG1hcGJveGdsIGZyb20gJ21hcGJveC1nbC9kaXN0L21hcGJveC1nbC1jc3AuanMnO1xuICAgICAqIGltcG9ydCBNYXBib3hHTFdvcmtlciBmcm9tICdtYXBib3gtZ2wvZGlzdC9tYXBib3gtZ2wtY3NwLXdvcmtlci5qcyc7XG4gICAgICpcbiAgICAgKiBtYXBib3hnbC53b3JrZXJDbGFzcyA9IE1hcGJveEdMV29ya2VyO1xuICAgICAqL1xuICAgIHdvcmtlckNsYXNzOiBudWxsLFxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdGltZSB1c2VkIGJ5IE1hcGJveCBHTCBKUyBpbnRlcm5hbGx5IGZvciBhbGwgYW5pbWF0aW9ucy4gVXNlZnVsIGZvciBnZW5lcmF0aW5nIHZpZGVvcyBmcm9tIE1hcGJveCBHTCBKUy5cbiAgICAgKlxuICAgICAqIEB2YXIge251bWJlcn0gdGltZVxuICAgICAqL1xuICAgIHNldE5vdzogYnJvd3Nlci5zZXROb3csXG5cbiAgICAvKipcbiAgICAgKiBSZXN0b3JlcyB0aGUgaW50ZXJuYWwgYW5pbWF0aW9uIHRpbWluZyB0byBmb2xsb3cgcmVndWxhciBjb21wdXRlciB0aW1lIChgcGVyZm9ybWFuY2Uubm93KClgKS5cbiAgICAgKi9cbiAgICByZXN0b3JlTm93OiBicm93c2VyLnJlc3RvcmVOb3dcbn07XG5cbi8vVGhpcyBnZXRzIGF1dG9tYXRpY2FsbHkgc3RyaXBwZWQgb3V0IGluIHByb2R1Y3Rpb24gYnVpbGRzLlxuRGVidWcuZXh0ZW5kKGV4cG9ydGVkLCB7aXNTYWZhcmksIGdldFBlcmZvcm1hbmNlTWV0cmljczogUGVyZm9ybWFuY2VVdGlscy5nZXRQZXJmb3JtYW5jZU1ldHJpY3MsIGdldFBlcmZvcm1hbmNlTWV0cmljc0FzeW5jOiBXb3JrZXJQZXJmb3JtYW5jZVV0aWxzLmdldFBlcmZvcm1hbmNlTWV0cmljc0FzeW5jfSk7XG5cbi8qKlxuICogR2V0cyB0aGUgdmVyc2lvbiBvZiBNYXBib3ggR0wgSlMgaW4gdXNlIGFzIHNwZWNpZmllZCBpbiBgcGFja2FnZS5qc29uYCxcbiAqIGBDSEFOR0VMT0cubWRgLCBhbmQgdGhlIEdpdEh1YiByZWxlYXNlLlxuICpcbiAqIEB2YXIge3N0cmluZ30gdmVyc2lvblxuICogQGV4YW1wbGVcbiAqIGNvbnNvbGUubG9nKGBNYXBib3ggR0wgSlMgdiR7bWFwYm94Z2wudmVyc2lvbn1gKTtcbiAqL1xuXG4vKipcbiAqIFRlc3Qgd2hldGhlciB0aGUgYnJvd3NlciBbc3VwcG9ydHMgTWFwYm94IEdMIEpTXShodHRwczovL3d3dy5tYXBib3guY29tL2hlbHAvbWFwYm94LWJyb3dzZXItc3VwcG9ydC8jbWFwYm94LWdsLWpzKS5cbiAqXG4gKiBAZnVuY3Rpb24gc3VwcG9ydGVkXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ9ZmFsc2VdIElmIGB0cnVlYCxcbiAqICAgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGBmYWxzZWAgaWYgdGhlIHBlcmZvcm1hbmNlIG9mIE1hcGJveCBHTCBKUyB3b3VsZFxuICogICBiZSBkcmFtYXRpY2FsbHkgd29yc2UgdGhhbiBleHBlY3RlZCAoZm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgV2ViR0wgcmVuZGVyZXJcbiAqICAgd291bGQgYmUgdXNlZCkuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGV4YW1wbGVcbiAqIC8vIFNob3cgYW4gYWxlcnQgaWYgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBNYXBib3ggR0xcbiAqIGlmICghbWFwYm94Z2wuc3VwcG9ydGVkKCkpIHtcbiAqICAgICBhbGVydCgnWW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgTWFwYm94IEdMJyk7XG4gKiB9XG4gKiBAc2VlIFtFeGFtcGxlOiBDaGVjayBmb3IgYnJvd3NlciBzdXBwb3J0XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NoZWNrLWZvci1zdXBwb3J0LylcbiAqL1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCdzIFtSVEwgdGV4dCBwbHVnaW5dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3BsdWdpbnMvI21hcGJveC1nbC1ydGwtdGV4dCkuXG4gKiBOZWNlc3NhcnkgZm9yIHN1cHBvcnRpbmcgdGhlIEFyYWJpYyBhbmQgSGVicmV3IGxhbmd1YWdlcywgd2hpY2ggYXJlIHdyaXR0ZW4gcmlnaHQtdG8tbGVmdC4gTWFwYm94IFN0dWRpbyBsb2FkcyB0aGlzIHBsdWdpbiBieSBkZWZhdWx0LlxuICpcbiAqIEBmdW5jdGlvbiBzZXRSVExUZXh0UGx1Z2luXG4gKiBAcGFyYW0ge3N0cmluZ30gcGx1Z2luVVJMIFVSTCBwb2ludGluZyB0byB0aGUgTWFwYm94IFJUTCB0ZXh0IHBsdWdpbiBzb3VyY2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgd2l0aCBhbiBlcnJvciBhcmd1bWVudCBpZiB0aGVyZSBpcyBhbiBlcnJvciwgb3Igbm8gYXJndW1lbnRzIGlmIHRoZSBwbHVnaW4gbG9hZHMgc3VjY2Vzc2Z1bGx5LlxuICogQHBhcmFtIHtib29sZWFufSBsYXp5IElmIHNldCB0byBgdHJ1ZWAsIE1hcGJveEdMIHdpbGwgZGVmZXIgbG9hZGluZyB0aGUgcGx1Z2luIHVudGlsIHJpZ2h0LXRvLWxlZnQgdGV4dCBpcyBlbmNvdW50ZXJlZCwgYW5kXG4gKiAgICByaWdodC10by1sZWZ0IHRleHQgd2lsbCBiZSByZW5kZXJlZCBvbmx5IGFmdGVyIHRoZSBwbHVnaW4gZmluaXNoZXMgbG9hZGluZy5cbiAqIEBleGFtcGxlXG4gKiBtYXBib3hnbC5zZXRSVExUZXh0UGx1Z2luKCdodHRwczovL2FwaS5tYXBib3guY29tL21hcGJveC1nbC1qcy9wbHVnaW5zL21hcGJveC1nbC1ydGwtdGV4dC92MC4yLjAvbWFwYm94LWdsLXJ0bC10ZXh0LmpzJyk7XG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgc3VwcG9ydCBmb3IgcmlnaHQtdG8tbGVmdCBzY3JpcHRzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21hcGJveC1nbC1ydGwtdGV4dC8pXG4gKi9cblxuLyoqXG4gICogR2V0cyB0aGUgbWFwJ3MgW1JUTCB0ZXh0IHBsdWdpbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvcGx1Z2lucy8jbWFwYm94LWdsLXJ0bC10ZXh0KSBzdGF0dXMuXG4gICogVGhlIHN0YXR1cyBjYW4gYmUgYHVuYXZhaWxhYmxlYCAobm90IHJlcXVlc3RlZCBvciByZW1vdmVkKSwgYGxvYWRpbmdgLCBgbG9hZGVkYCwgb3IgYGVycm9yYC5cbiAgKiBJZiB0aGUgc3RhdHVzIGlzIGBsb2FkZWRgIGFuZCB0aGUgcGx1Z2luIGlzIHJlcXVlc3RlZCBhZ2FpbiwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICpcbiAgKiBAZnVuY3Rpb24gZ2V0UlRMVGV4dFBsdWdpblN0YXR1c1xuICAqIEBleGFtcGxlXG4gICogY29uc3QgcGx1Z2luU3RhdHVzID0gbWFwYm94Z2wuZ2V0UlRMVGV4dFBsdWdpblN0YXR1cygpO1xuICAqL1xuXG5leHBvcnQgZGVmYXVsdCBleHBvcnRlZDtcblxuLy8gY2FuYXJ5IGFzc2VydDogdXNlZCB0byBjb25maXJtIHRoYXQgYXNzZXJ0cyBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHByb2R1Y3Rpb24gYnVpbGRcbmFzc2VydCh0cnVlLCAnY2FuYXJ5IGFzc2VydCcpO1xuIiwiLy9cbi8vIE91ciBjdXN0b20gaW50cm8gcHJvdmlkZXMgYSBzcGVjaWFsaXplZCBcImRlZmluZSgpXCIgZnVuY3Rpb24sIGNhbGxlZCBieSB0aGVcbi8vIEFNRCBtb2R1bGVzIGJlbG93LCB0aGF0IHNldHMgdXAgdGhlIHdvcmtlciBibG9iIFVSTCBhbmQgdGhlbiBleGVjdXRlcyB0aGVcbi8vIG1haW4gbW9kdWxlLCBzdG9yaW5nIGl0cyBleHBvcnRlZCB2YWx1ZSBhcyAnbWFwYm94Z2wnXG5cbi8vIFRoZSB0aHJlZSBcImNodW5rc1wiIGltcG9ydGVkIGhlcmUgYXJlIHByb2R1Y2VkIGJ5IGEgZmlyc3QgUm9sbHVwIHBhc3MsXG4vLyB3aGljaCBvdXRwdXRzIHRoZW0gYXMgQU1EIG1vZHVsZXMuXG5cbi8vIFNoYXJlZCBkZXBlbmRlbmNpZXMsIGkuZS46XG4vKlxuZGVmaW5lKFsnZXhwb3J0cyddLCBmdW5jdGlvbiAoZXhwb3J0cykge1xuICAgIC8vIENvZGUgZm9yIGFsbCBjb21tb24gZGVwZW5kZW5jaWVzXG4gICAgLy8gRWFjaCBtb2R1bGUncyBleHBvcnRzIGFyZSBhdHRhY2hlZCBhdHRhY2hlZCB0byAnZXhwb3J0cycgKHdpdGhcbiAgICAvLyBuYW1lcyByZXdyaXR0ZW4gdG8gYXZvaWQgY29sbGlzaW9ucywgZXRjLilcbn0pXG4qL1xuaW1wb3J0ICcuL2J1aWxkL21hcGJveGdsL3NoYXJlZCc7XG5cbi8vIFdvcmtlciBhbmQgaXRzIHVuaXF1ZSBkZXBlbmRlbmNpZXMsIGkuZS46XG4vKlxuZGVmaW5lKFsnLi9zaGFyZWQuanMnXSwgZnVuY3Rpb24gKF9fc2hhcmVkX19qcykge1xuICAgIC8vICBDb2RlIGZvciB3b3JrZXIgc2NyaXB0IGFuZCBpdHMgdW5pcXVlIGRlcGVuZGVuY2llcy5cbiAgICAvLyAgRXhwZWN0cyB0aGUgb3V0cHV0IG9mICdzaGFyZWQnIG1vZHVsZSB0byBiZSBwYXNzZWQgaW4gYXMgYW4gYXJndW1lbnQsXG4gICAgLy8gIHNpbmNlIGFsbCByZWZlcmVuY2VzIHRvIGNvbW1vbiBkZXBzIGxvb2sgbGlrZSwgZS5nLixcbiAgICAvLyAgX19zaGFyZWRfX2pzLnNoYXBlVGV4dCgpLlxufSk7XG4qL1xuLy8gV2hlbiB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIG91ciBjdXN0b20gZGVmaW5lKCkgYWJvdmUsXG4vLyBpdCBnZXRzIHN0cmluZ2lmaWVkLCB0b2dldGhlciB3aXRoIHRoZSBzaGFyZWQgd3JhcHBlciAodXNpbmdcbi8vIEZ1bmN0aW9uLnRvU3RyaW5nKCkpLCBhbmQgdGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgY29kZSBpcyBtYWRlIGludG8gYVxuLy8gQmxvYiBVUkwgdGhhdCBnZXRzIHVzZWQgYnkgdGhlIG1haW4gbW9kdWxlIHRvIGNyZWF0ZSB0aGUgd2ViIHdvcmtlcnMuXG5pbXBvcnQgJy4vYnVpbGQvbWFwYm94Z2wvd29ya2VyJztcblxuLy8gTWFpbiBtb2R1bGUgYW5kIGl0cyB1bmlxdWUgZGVwZW5kZW5jaWVzXG4vKlxuZGVmaW5lKFsnLi9zaGFyZWQuanMnXSwgZnVuY3Rpb24gKF9fc2hhcmVkX19qcykge1xuICAgIC8vICBDb2RlIGZvciBtYWluIEdMIEpTIG1vZHVsZSBhbmQgaXRzIHVuaXF1ZSBkZXBlbmRlbmNpZXMuXG4gICAgLy8gIEV4cGVjdHMgdGhlIG91dHB1dCBvZiAnc2hhcmVkJyBtb2R1bGUgdG8gYmUgcGFzc2VkIGluIGFzIGFuIGFyZ3VtZW50LFxuICAgIC8vICBzaW5jZSBhbGwgcmVmZXJlbmNlcyB0byBjb21tb24gZGVwcyBsb29rIGxpa2UsIGUuZy4sXG4gICAgLy8gIF9fc2hhcmVkX19qcy5zaGFwZVRleHQoKS5cbiAgICAvL1xuICAgIC8vICBSZXR1cm5zIHRoZSBhY3R1YWwgbWFwYm94Z2wgKGkuZS4gc3JjL2luZGV4LmpzKVxufSk7XG4qL1xuaW1wb3J0ICcuL2J1aWxkL21hcGJveGdsL2luZGV4JztcblxuZXhwb3J0IGRlZmF1bHQgbWFwYm94Z2w7XG4iXSwibmFtZXMiOlsicmVxdWlyZSQkMCIsInJlcXVpcmUkJDEiLCJnbE1hdHJpeC5BUlJBWV9UWVBFIiwiZXF1YWxzIiwiZ2xNYXRyaXguRVBTSUxPTiIsImNyZWF0ZSIsImNsb25lIiwiY29weSIsImlkZW50aXR5IiwiZnJvbVZhbHVlcyIsInNldCIsImludmVydCIsImRldGVybWluYW50IiwibXVsdGlwbHkiLCJyb3RhdGUiLCJzY2FsZSIsImZyb21Sb3RhdGlvbiIsImZyb21TY2FsaW5nIiwic3RyIiwiZnJvYiIsImFkZCIsInN1YnRyYWN0IiwibXVsdGlwbHlTY2FsYXIiLCJtdWx0aXBseVNjYWxhckFuZEFkZCIsImV4YWN0RXF1YWxzIiwibXVsIiwic3ViIiwidHJhbnNwb3NlIiwiYWRqb2ludCIsInRyYW5zbGF0ZSIsImZyb21UcmFuc2xhdGlvbiIsImZyb21RdWF0IiwiZ2xNYXRyaXguUkFORE9NIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwiZGl2aWRlIiwiY2VpbCIsImZsb29yIiwibWluIiwibWF4Iiwicm91bmQiLCJzY2FsZUFuZEFkZCIsImRpc3RhbmNlIiwic3F1YXJlZERpc3RhbmNlIiwibGVuZ3RoIiwic3F1YXJlZExlbmd0aCIsIm5lZ2F0ZSIsImludmVyc2UiLCJub3JtYWxpemUiLCJkb3QiLCJjcm9zcyIsImxlcnAiLCJyYW5kb20iLCJ0cmFuc2Zvcm1NYXQ0IiwidHJhbnNmb3JtUXVhdCIsInplcm8iLCJkaXYiLCJkaXN0Iiwic3FyRGlzdCIsImxlbiIsInNxckxlbiIsImZvckVhY2giLCJ2ZWM0LmNsb25lIiwidmVjNC5mcm9tVmFsdWVzIiwidmVjNC5jb3B5IiwidmVjNC5zZXQiLCJ2ZWM0LmFkZCIsInZlYzQuc2NhbGUiLCJ2ZWM0LmRvdCIsInZlYzQubGVycCIsInZlYzQubGVuZ3RoIiwidmVjNC5zcXVhcmVkTGVuZ3RoIiwidmVjNC5ub3JtYWxpemUiLCJ2ZWM0LmV4YWN0RXF1YWxzIiwidmVjNC5lcXVhbHMiLCJ2ZWMzLmNyZWF0ZSIsInZlYzMuZnJvbVZhbHVlcyIsInZlYzMuZG90IiwidmVjMy5jcm9zcyIsInZlYzMubGVuIiwidmVjMy5ub3JtYWxpemUiLCJtYXQzLmNyZWF0ZSIsImZyb21Sb3RhdGlvblRyYW5zbGF0aW9uIiwiZnJvbU1hdDQiLCJxdWF0LmNyZWF0ZSIsIm1hdDQuZ2V0Um90YXRpb24iLCJtYXQ0LmdldFRyYW5zbGF0aW9uIiwicXVhdC5jb3B5IiwiZ2V0VHJhbnNsYXRpb24iLCJxdWF0LnJvdGF0ZVgiLCJxdWF0LnJvdGF0ZVkiLCJxdWF0LnJvdGF0ZVoiLCJxdWF0LmRvdCIsImNvbmp1Z2F0ZSIsInF1YXQubGVuZ3RoIiwicXVhdC5zcXVhcmVkTGVuZ3RoIiwidHJhbnNmb3JtTWF0MyIsImFuZ2xlIiwiUG9pbnQiLCJhc3NlcnQiLCJiZXppZXIiLCJVbml0QmV6aWVyIiwid2luZG93IiwiZXhwb3J0ZWQiLCJ3ZWJwU3VwcG9ydGVkIiwic2RrVmVyc2lvbiIsInBhcnNlQ1NTQ29sb3IiLCJ0b1N0cmluZyIsInR5cGVzIiwidmFsdWVUb1N0cmluZyIsImFycmF5IiwiaW50ZXJwb2xhdGVOdW1iZXIiLCJ0eXBlVG9TdHJpbmciLCJleHRlbmQiLCJkZWZpbml0aW9ucyIsImlzQ29uc3RhbnQuaXNTdGF0ZUNvbnN0YW50IiwiaXNGZWF0dXJlQ29uc3RhbnQiLCJpc0NvbnN0YW50LmlzRmVhdHVyZUNvbnN0YW50IiwiaXNDb25zdGFudC5pc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQiLCJ2YWxpZGF0ZVNwZWMiLCJsYXRlc3QiLCJsYXRlc3RTdHlsZVNwZWMiLCJ2YWxpZGF0ZVNvdXJjZSIsInZhbGlkYXRlTGlnaHQiLCJ2YWxpZGF0ZVRlcnJhaW4iLCJ2YWxpZGF0ZUZvZyIsInZhbGlkYXRlRmlsdGVyIiwidmFsaWRhdGVQYWludFByb3BlcnR5IiwidmFsaWRhdGVMYXlvdXRQcm9wZXJ0eSIsIkdyaWQiLCJpc0NoYXIiLCJicm93c2VyIiwicnRsVGV4dFBsdWdpbiIsIm11cm11cjMiLCJtdXJtdXIyIiwiUGF0dGVybkxheW91dEFycmF5IiwiRGFzaExheW91dEFycmF5Iiwic3R5bGVTcGVjIiwiZmVhdHVyZUZpbHRlciIsIm1lcmNhdG9yWGZyb21MbmciLCJtZXJjYXRvcllmcm9tTGF0IiwiRVhURU5UIiwiQ2lyY2xlTGF5b3V0QXJyYXkiLCJUcmlhbmdsZUluZGV4QXJyYXkiLCJsYXlvdXRBdHRyaWJ1dGVzIiwibGF5b3V0IiwidmVjMy5zcXVhcmVkTGVuZ3RoIiwidmVjMy5lcXVhbHMiLCJ2ZWM0LnRyYW5zZm9ybU1hdDQiLCJ2ZWM0Lm11bCIsInZlYzMuc3ViIiwidmVjMy5zY2FsZSIsInZlYzMuYWRkIiwidmVjMy5jbG9uZSIsInBhaW50IiwicHJvcGVydGllcyIsIm1lbWJlcnMiLCJzaXplIiwiYWxpZ25tZW50Iiwic3dhcCIsIkZpbGxMYXlvdXRBcnJheSIsIkxpbmVJbmRleEFycmF5IiwiZWFyY3V0IiwiY2xhc3NpZnlSaW5ncyIsInNpZ25lZEFyZWEiLCJWZWN0b3JUaWxlRmVhdHVyZSIsIlZlY3RvclRpbGVMYXllciIsInJlcXVpcmUkJDIiLCJtdnQiLCJFQVJDVVRfTUFYX1JJTkdTIiwiaW50ZXJwb2xhdGUiLCJGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXkiLCJ2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzIiwiTGluZUxheW91dEFycmF5IiwiTGluZUV4dExheW91dEFycmF5IiwibGF5b3V0QXR0cmlidXRlc0V4dCIsIlByb3RvYnVmIiwiYWxpZ24iLCJyZXNhbXBsZSIsImJvcmRlciIsImRlZmF1bHRDb21wYXJlIiwiUXVldWUiLCJhZGRWZXJ0ZXgiLCJTeW1ib2xMYXlvdXRBcnJheSIsIlN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSIsIlN5bWJvbE9wYWNpdHlBcnJheSIsIkNvbGxpc2lvblZlcnRleEFycmF5IiwiQ29sbGlzaW9uVmVydGV4RXh0QXJyYXkiLCJtYXQ0LmlkZW50aXR5IiwiZ2xvYmFsUlRMVGV4dFBsdWdpbiIsInRyYW5zZm9ybVRleHQiLCJDb2xsaXNpb25Cb3hMYXlvdXRBcnJheSIsInN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbSIsInN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZSIsInF1YXQuaWRlbnRpdHkiLCJ2ZWMzLnRyYW5zZm9ybVF1YXQiLCJjaXJjbGUiLCJoZWF0bWFwIiwiaGlsbHNoYWRlIiwiZmlsbCIsImZpbGxFeHRydXNpb24iLCJsaW5lIiwic3ltYm9sIiwiYmFja2dyb3VuZCIsInJhc3RlciIsInNreSIsIkltYWdlRGF0YSIsIkltYWdlQml0bWFwIiwibWF0Mi5zY2FsZSIsIkFMV0FZUyIsImRlc2VyaWFsaXplIiwidmVjMy5zY2FsZUFuZEFkZCIsInZ0IiwiR2VvSlNPTkZlYXR1cmUiLCJQb3NBcnJheSIsIkxpbmVTdHJpcEluZGV4QXJyYXkiLCJUaWxlQm91bmRzQXJyYXkiLCJkZXNlcmlhbGl6ZUJ1Y2tldCIsIm1hdDQubXVsdGlwbHkiLCJtYXQ0LnJvdGF0ZVkiLCJtYXQ0LnJvdGF0ZVgiLCJtYXQ0LnNjYWxlIiwidmVjMy50cmFuc2Zvcm1NYXQ0IiwidmVjMy5sZW5ndGgiLCJtYXQ0LnRyYW5zbGF0ZSIsInZlYzMubmVnYXRlIiwiZ2xvYmVMYXlvdXRBdHRyaWJ1dGVzIiwibWF0NC5jb3B5IiwibWF0NC5tdWwiLCJHbG9iZVZlcnRleEFycmF5IiwidmVjMy5taW4iLCJ2ZWMzLm1heCIsInZlYzIuZXhhY3RFcXVhbHMiLCJtYXhQaGkiLCJtYXQ0LmZyb21RdWF0IiwibWF0NC5pbnZlcnQiLCJtYXQ0LmZyb21TY2FsaW5nIiwicXVhdC5jb25qdWdhdGUiLCJtYXQ0LnBlcnNwZWN0aXZlIiwibWF0Mi5pbnZlcnQiLCJtYXQ0LnJvdGF0ZVoiLCJtYXQyLmNyZWF0ZSIsIm1hdDIucm90YXRlIiwicXVhdC5leGFjdEVxdWFscyIsInZlYzMuZXhhY3RFcXVhbHMiLCJxdWF0Lm5vcm1hbGl6ZSIsIm1hdDQuY3JlYXRlIiwidmVjMy5tdWx0aXBseSIsInJlZlByb3BlcnRpZXMiLCJjcmVhdGVTdHlsZUxheWVyIiwidmFsdWVzIiwiREVNRGF0YSIsIlJHQkFJbWFnZSIsIkdlb0pTT05XcmFwcGVyIiwiRmVhdHVyZVdyYXBwZXIiLCJQYmYiLCJzb3J0IiwicmV3aW5kIiwidHJhbnNmb3JtIiwidnRwYmYiLCJWZWN0b3JUaWxlV29ya2VyU291cmNlIiwiY3JlYXRlRXhwcmVzc2lvbiIsImdldFBlcmZvcm1hbmNlTWVhc3VyZW1lbnQiLCJnZXRKU09OIiwiUGVyZm9ybWFuY2VVdGlscyIsIkFjdG9yIiwiZ2V0UHJvamVjdGlvbiIsIkV2ZW50IiwiZW5mb3JjZUNhY2hlU2l6ZUxpbWl0IiwiUmVzb3VyY2VUeXBlIiwiZ2V0SW1hZ2UiLCJFdmVudGVkIiwiRXJyb3JFdmVudCIsIndhcm5PbmNlIiwiSW1hZ2VQb3NpdGlvbiIsIlRleHR1cmUiLCJwb3RwYWNrIiwiZGVnVG9SYWQiLCJQcm9wZXJ0aWVzIiwiRGF0YUNvbnN0YW50UHJvcGVydHkiLCJUcmFuc2l0aW9uYWJsZSIsImVuZHNXaXRoIiwiZW1pdFZhbGlkYXRpb25FcnJvcnMiLCJ2YWxpZGF0ZVN0eWxlIiwiVFJBTlNJVElPTl9TVUZGSVgiLCJzbW9vdGhzdGVwIiwiTWVyY2F0b3JDb29yZGluYXRlIiwidW5pcXVlSWQiLCJhc3luY0FsbCIsInBvbHlnb25pemVCb3VuZHMiLCJidWZmZXJDb252ZXhQb2x5Z29uIiwiZ2V0VGlsZVBvaW50IiwiZ2V0VGlsZVZlYzMiLCJSYXkiLCJwaXhlbHNUb1RpbGVVbml0cyIsInBvbHlnb25JbnRlcnNlY3RzQm94IiwiZ2V0Qm91bmRzIiwiY2xhbXAiLCJwaWNrIiwiTG5nTGF0Qm91bmRzIiwiRGVkdXBlZFJlcXVlc3QiLCJwb3N0VHVybnN0aWxlRXZlbnQiLCJsb2FkVmVjdG9yVGlsZSIsImNhY2hlRW50cnlQb3NzaWJseUFkZGVkIiwicHJldlBvd2VyT2ZUd28iLCJPdmVyc2NhbGVkVGlsZUlEIiwibWF0My5hZGpvaW50IiwidmVjMy50cmFuc2Zvcm1NYXQzIiwibWF0My50cmFuc3Bvc2UiLCJtYXQzLm11bHRpcGx5IiwidGlsZVRyYW5zZm9ybSIsIlJhc3RlckJvdW5kc0FycmF5IiwiYm91bmRzQXR0cmlidXRlcyIsIlNlZ21lbnRWZWN0b3IiLCJDYW5vbmljYWxUaWxlSUQiLCJnZXRWaWRlbyIsIlZhbGlkYXRpb25FcnJvciIsInZlY3RvciIsInJhc3RlckRlbSIsImdlb2pzb24iLCJ2aWRlbyIsImltYWdlIiwiY2FudmFzIiwiYmluZEFsbCIsIm1hcGJveGdsIiwiaXNFcXVhbCIsImNhbGN1bGF0ZUdsb2JlTWF0cml4IiwiZ2xvYmVEZW5vcm1hbGl6ZUVDRUYiLCJnbG9iZVRpbGVCb3VuZHMiLCJtYXQ0LmNsb25lIiwiV3JpdGluZ01vZGUiLCJhZGREeW5hbWljQXR0cmlidXRlcyIsIk9ORV9FTSIsInByb2plY3Rpb24ucHJvamVjdCIsInByb2plY3Rpb24ucGxhY2VGaXJzdEFuZExhc3RHbHlwaCIsImNsaXBMaW5lIiwiaW50ZXJzZWN0aW9uVGVzdHMucG9seWdvbkludGVyc2VjdHNQb2x5Z29uIiwicHJvamVjdGlvbi54eVRyYW5zZm9ybU1hdDQiLCJnZXRBbmNob3JBbGlnbm1lbnQiLCJldmFsdWF0ZVZhcmlhYmxlT2Zmc2V0IiwicHJvamVjdGlvbi5nZXRMYWJlbFBsYW5lTWF0cml4IiwicHJvamVjdGlvbi5nZXRHbENvb3JkTWF0cml4IiwiZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbiIsIl9lbWl0VmFsaWRhdGlvbkVycm9ycyIsImRpZmZPcGVyYXRpb25zIiwiZ2V0V29ya2VyUG9vbCIsIkdseXBoTWFuYWdlciIsIkxvY2FsR2x5cGhNb2RlIiwiTGluZUF0bGFzIiwiWm9vbUhpc3RvcnkiLCJnZXRSZWZlcnJlciIsInRyaWdnZXJQbHVnaW5Db21wbGV0aW9uRXZlbnQiLCJpc01hcGJveFVSTCIsImRlcmVmIiwiY3JlYXRlU291cmNlIiwiU291cmNlQ2FjaGUiLCJ2YWxpZGF0ZUN1c3RvbVN0eWxlTGF5ZXIiLCJkZWVwRXF1YWwiLCJmaWx0ZXJPYmplY3QiLCJydGxUZXh0UGx1Z2luRXZlbnRlZCIsIm1ha2VSZXF1ZXN0IiwiZ2V0U291cmNlVHlwZSIsInNldFNvdXJjZVR5cGUiLCJyZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlIiwiVW5pZm9ybU1hdHJpeDRmIiwiVW5pZm9ybTFpIiwiVW5pZm9ybTJmIiwiVW5pZm9ybUNvbG9yIiwiVW5pZm9ybTFmIiwiVW5pZm9ybTRmIiwibWF0NC5vcnRobyIsIkRlcHRoTW9kZSIsIlN0ZW5jaWxNb2RlIiwiQ3VsbEZhY2VNb2RlIiwiVW5pZm9ybTNmIiwiY2FsY3VsYXRlR2xvYmVNZXJjYXRvck1hdHJpeCIsImdsb2JlQnVmZmVyc0ZvclRpbGVNZXNoIiwiZWFzZUN1YmljSW5PdXQiLCJnbG9iZU1hdHJpeEZvclRpbGUiLCJnbG9iZVRvTWVyY2F0b3JUcmFuc2l0aW9uIiwiZ2xvYmVQb2xlTWF0cml4Rm9yVGlsZSIsIkNvbG9yTW9kZSIsIlRpbGUiLCJUZXJyYWluIiwiRWxldmF0aW9uIiwibWVyY2F0b3JaZnJvbUFsdGl0dWRlIiwiQ29sb3IiLCJEZXB0aFN0ZW5jaWxBdHRhY2htZW50IiwidmVjMy5zdWJ0cmFjdCIsIm1hdDMuZnJvbVJvdGF0aW9uIiwiVW5pZm9ybU1hdHJpeDJmIiwiVW5pZm9ybU1hdHJpeDNmIiwiQ29sbGlzaW9uQ2lyY2xlTGF5b3V0QXJyYXkiLCJjb2xsaXNpb25DaXJjbGVMYXlvdXQiLCJRdWFkVHJpYW5nbGVBcnJheSIsInN5bWJvbFByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeCIsInN5bWJvbFNpemUiLCJzeW1ib2xQcm9qZWN0aW9uLmhpZGVHbHlwaHMiLCJzeW1ib2xQcm9qZWN0aW9uLnByb2plY3QiLCJzeW1ib2xQcm9qZWN0aW9uLmdldFBlcnNwZWN0aXZlUmF0aW8iLCJzeW1ib2xQcm9qZWN0aW9uLmdldEdsQ29vcmRNYXRyaXgiLCJzeW1ib2xQcm9qZWN0aW9uLnVwZGF0ZUxpbmVMYWJlbHMiLCJuZXh0UG93ZXJPZlR3byIsInJlbmRlckNvbG9yUmFtcCIsImNyZWF0ZUxheW91dCIsIlNreWJveFZlcnRleEFycmF5Iiwic2t5Ym94QXR0cmlidXRlcyIsIm1hdDMuZnJvbU1hdDQiLCJkcmF3IiwiZGVidWciLCJjdXN0b20iLCJDb250ZXh0IiwicG9zQXR0cmlidXRlcyIsIkdsb2JlU2hhcmVkQnVmZmVycyIsImlzTWFwQXV0aGVudGljYXRlZCIsIkRlYnVnIiwiX2Vhc2UiLCJ2ZWMzLmRpdiIsInZlYzMubXVsIiwiTG5nTGF0IiwiQWFiYiIsIkZydXN0dW0iLCJkZWZhdWx0RWFzaW5nIiwid3JhcCIsImNvbmZpZyIsImRlZmF1bHRPcHRpb25zIiwiUGVyZm9ybWFuY2VNYXJrZXJzIiwiVHJhbnNmb3JtIiwiUmVxdWVzdE1hbmFnZXIiLCJHTE9CRV9aT09NX1RIUkVTSE9MRF9NQVgiLCJzdG9yZUF1dGhTdGF0ZSIsIkV2YWx1YXRpb25QYXJhbWV0ZXJzIiwiZ2V0TWFwU2Vzc2lvbkFQSSIsIkFVVEhfRVJSX01TRyIsInBvc3RNYXBMb2FkRXZlbnQiLCJyZW1vdmVBdXRoU3RhdGUiLCJzZXRDYWNoZUxpbWl0cyIsInZlcnNpb24iLCJwZXJmb3JtYW5jZSIsInNldFJUTFRleHRQbHVnaW4iLCJnZXRSVExUZXh0UGx1Z2luU3RhdHVzIiwiRnJlZUNhbWVyYU9wdGlvbnMiLCJjbGVhclRpbGVDYWNoZSIsImlzU2FmYXJpIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQSxZQUFZLENBQUM7QUFDYjtBQUNBLElBQUkscUJBQXFCLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDO0FBQ3pELElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDO0FBQ3JELElBQUksZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQztBQUM3RDtBQUNBLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRTtBQUN2QixDQUFDLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO0FBQ3hDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0FBQy9FLEVBQUU7QUFDRjtBQUNBLENBQUMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxlQUFlLEdBQUc7QUFDM0IsQ0FBQyxJQUFJ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QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25FLEdBQUc7QUFDSCxDQUFDLENBQUM7QUFDRjtBQUNBLE1BQU0sQ0FBQyxlQUFlLEdBQUcsU0FBUyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7QUFDN0UsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDM0MsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQy9FLEdBQUc7QUFDSCxDQUFDLENBQUM7QUFDRjtBQUNBLFNBQVMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUNyRDtBQUNBLEVBQUUsSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFO0FBQzNCLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUNyRCxJQUFJLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQzNELElBQUksT0FBTyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEs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QUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLEVBQUUsS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7QUFDdkIsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUMsR0FBRztBQUNILEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN2RELGNBQWMsR0FBRyxVQUFVLENBQUM7QUFDNUI7QUFDQSxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDeEM7QUFDQSxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN4QixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzFDLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3RDO0FBQ0EsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDeEIsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUMxQyxJQUFJLElBQUksQ0FBQyxFQUFF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Q0E7QUFDQSxJQUFJLEdBQUcsTUFBTSxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxHQUFHLE1BQU0sU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxLQUFLLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFVBQVUsTUFBTSxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUU7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksS0FBSyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssSUFBSSxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxFQUFFLFdBQVc7QUFDcEIsUUFBUSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxFQUFFLFNBQVMsS0FBSyxFQUFFO0FBQzVCLFFBQVEsT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLGVBQWUsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN0QixRQUFRLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN6QixRQUFRLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0IsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFFBQVEsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxFQUFFLFdBQVc7QUFDdEIsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFO0FBQ3pCLFFBQVEsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDM0IsUUFBUSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLO0FBQ3pCLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ25DLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRTtBQUMxQixRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUM3QyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM5QyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdkIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdEIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDOUIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRTtBQUM3QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztB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RSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUMvQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlBLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDO0FBQ0E7QUFDQSxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtBQUNqQixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLEdBQUcsTUFBTTtBQUNULElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDOUI7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDcEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQztBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxXQUFXLENBQUMsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7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QUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDeEUsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBQ3hCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNuQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFFBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUMsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxVixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDdkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJLEdBQUcsR0FBRyxRQUFROztBQzlhekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJSCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ksT0FBSyxDQUFDLENBQUMsRUFBRTtBQUN6QixFQUFFLElBQUksR0FBRyxHQUFHLElBQUlKLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ssTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxZQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDL0MsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJUCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTUSxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMs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QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztB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QUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsYUFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3JHLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGdCQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLHNCQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUcsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTckIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUMsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwZ0IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJcUIsS0FBRyxHQUFHWixVQUFRLENBQUM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUlhLEtB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LENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ssTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxZQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDeEUsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJUCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTUSxLQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3RFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRixVQUFRLENBQUMsR0FBRyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNtQixXQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQ2pCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixHQUFHLE1BQU07QUFDVCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTaEIsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDOUM7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDekMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDekMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDekMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2lCLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTaEIsYUFBVyxDQUFDLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLE9BQU8sR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN4RyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2dCLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ25DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNmLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNwQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTZSxpQkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNkLGNBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDdkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsYUFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUN2QyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEY7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtBQUMvQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxLQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3ZCLEVBQUUsT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDOUksQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLENBQUMsRUFBRTtBQUN4QixFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxnQkFBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxzQkFBb0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDdkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsYUFBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9KLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3JCLFFBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlDLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbndCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSXFCLEtBQUcsR0FBR1osVUFBUSxDQUFDO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJYSxLQUFHLEdBQUdMLFVBQVE7O0FDeHdCekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNoQixRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJSCxVQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNJLE9BQUssQ0FBQyxDQUFDLEVBQUU7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJSixVQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNFLFlBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDM0csRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJUCxVQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNRLEtBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3pHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRixVQUFRLENBQUMsR0FBRyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNtQixXQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQ2pCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEdBQUcsTUFBTTtBQUNULElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTaEIsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEM7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xGO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3RELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNpQixTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0csRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzFHLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTaEIsYUFBVyxDQUFDLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQztBQUNBLEVBQUUsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUMvRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEQsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0RCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNnQixXQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDekIsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUN6QixFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3pCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEQsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELEdBQUcsTUFBTTtBQUNULElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEQsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2QsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNELFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDMUMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNkLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDekIsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUN6QixFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUNwQixFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDcEIsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3BCO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBR1YsT0FBZ0IsRUFBRTtBQUM5QixJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ1gsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ1gsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ1gsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDWixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZDtBQUNBLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0MsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDOUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDOUM7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUNqQjtBQUNBLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEI7QUFDQSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRTtBQUNqQjtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQjtBQUNBLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO0FBQ2pCO0FBQ0EsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM5QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakI7QUFDQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLEdBQUc7QUFDSDtBQUNBO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMwQixpQkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTYixhQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0QsY0FBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0FBQzdDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDZDtBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUdaLE9BQWdCLEVBQUU7QUFDOUIsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUNYLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUNYLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUNYLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1o7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDeEMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QjtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3hDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEI7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN4QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuRDtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLElBQUksV0FBVyxHQUFHLElBQUlGLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxTQUFTLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN4RDtBQUNBLEVBQUUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO0FBQ3JCLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQzdFLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQzdFLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQzdFLEdBQUcsTUFBTTtBQUNULElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakUsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNqRSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2pFLEdBQUc7QUFDSDtBQUNBLEVBQUUsdUJBQXVCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMvQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN6QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3RDLEVBQUUsSUFBSSxPQUFPLEdBQUcsSUFBSUEsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDM0IsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaO0FBQ0EsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7QUFDakIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsR0FBRyxNQUFNLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFO0FBQ3pDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN0QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsR0FBRyxNQUFNLElBQUksSUFBSSxHQUFHLElBQUksRUFBRTtBQUMxQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN0QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLEdBQUcsTUFBTTtBQUNULElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLDRCQUE0QixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMzRDtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGtDQUFrQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEU7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNsQyxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM1QixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbEMsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM1QixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ25DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUM1RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDNUQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzdELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzZCLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUNsRSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDOUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzlCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJ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QUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0FBQzlCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtBQUM3QyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDO0FBQzlDLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHM0IsT0FBZ0IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBR0EsT0FBZ0IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBR0EsT0FBZ0IsRUFBRTtBQUNqSixJQUFJLE9BQU9JLFVBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixHQUFHO0FBQ0g7QUFDQSxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDO0FBQ3RCLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxPQUFPLENBQUM7QUFDdEIsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUN0QixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ25DLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNaLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNaLEVBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUMzQixFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDM0IsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQzNCLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvQjtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNaLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNYLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNYLEdBQUcsTUFBTTtBQUNULElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsR0FBRztBQUNIO0FBQ0EsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN6QixFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDekIsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQy9CO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ1gsR0FBRyxNQUFNO0FBQ1QsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO0FBQy9DLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25CLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkIsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN4QztBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO0FBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFO0FBQzlCLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUU7QUFDOUIsTUFBTSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQy9CLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3BDO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1UsS0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdFAsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLENBQUMsRUFBRTtBQUN4QixFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGdCQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Msc0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2xDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xTLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3JCLFFBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQyxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFH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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ssTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTVSxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTUixVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUM5QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO0FBQ2Y7QUFDQSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN0QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzFCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDaEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM1QyxFQUFFLElBQUksWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLE9BQU8sR0FBRyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0MsRUFBRSxJQUFJLE9BQU8sR0FBRyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQyxFQUFFLElBQUksT0FBTyxHQUFHLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxJQUFJLE9BQU8sR0FBRyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQzdFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDN0UsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUM3RSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNB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QUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDMUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3hDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNaLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckI7QUFDQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUN4QyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYjtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckQ7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDeEMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2I7QUFDQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQjtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFN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LE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU08sWUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN2QyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlQLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ssTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3JDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1UsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNSLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3VCLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzFCLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTMkIsYUFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUM5QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxpQkFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFFBQU0sQ0FBQyxDQUFDLEVBQUU7QUFDMUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxlQUFhLENBQUMsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLEtBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzFCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxRQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUNuQyxFQUFFLEtBQUssR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDckIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDYjtBQUNBLEVBQUUsR0FBRztBQUNMLElBQUksRUFBRSxHQUFHckIsTUFBZSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLEVBQUUsR0FBR0EsTUFBZSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDM0IsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDcEI7QUFDQSxFQUFFLEdBQUc7QUFDTCxJQUFJLEVBQUUsR0FBR0EsTUFBZSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLEVBQUUsR0FBR0EsTUFBZSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDM0IsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUU7QUFDcEI7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ25DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNzQixlQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsZUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQjtBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyQztBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDcEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNwRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ3BELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLEdBQUcsRUFBRTtBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3RDLEtBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3hFLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU00sYUFBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTckIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQyxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FB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RSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQzdDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRTtBQUMxQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUI7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHSixPQUFnQixFQUFFO0FBQzVCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLEdBQUcsTUFBTTtBQUNUO0FBQ0EsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksVUFBVSxHQUFHOEMsS0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QixFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3JDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU29CLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLEdB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Q3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNuQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM1QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNDLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzNCLEVBQUUsSUFBSSxD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QUNBO0FBQ08sU0FBU2lELFFBQU0sQ0FBQyxHQUFHLEVBQUU7QUFDNUI7QUFDQTtBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUdyQixNQUFlLEVBQUUsQ0FBQztBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHQSxNQUFlLEVBQUUsQ0FBQztBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHQSxNQUFlLEVBQUUsQ0FBQztBQUM3QixFQUFFLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNqRCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTckIsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENB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QUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN4RSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLElBQUksS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFDeEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDbkQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDbkQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdB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QUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU08sWUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDM0QsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJUCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsNkJBQTZCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSUEsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYixFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHO0FBQ25CLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHO0FBQ25CLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDcEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2lGLHlCQUF1QixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25ELEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDckIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDckIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDckIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTckQsaUJBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ3hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFD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LEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxLQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDekQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUksT0FBTyxHQUFHOEUsTUFBUyxDQUFDO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJLE9BQU8sR0FBR0EsTUFBUyxDQUFDO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxnQkFBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDdkMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzVELFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ25ELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3BELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ksU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xELEVBQUV5RCxTQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1QixFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3hELFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNsRCxFQUFFeUQsU0FBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUIsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVN4RCxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEQsRUFBRXlELFNBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzlDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9DLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNaLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQ3BEO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUd4RixPQUFnQixFQUFFO0FBQ3hDLElBQUksT0FBT0csTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RCxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTYSxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1AsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pHLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUlZLEtBQUcsR0FBR1osVUFBUSxDQUFDO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUltQyxLQUFHLEdBQUcyQyxLQUFRLENBQUM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVN6QyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUlGLEtBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVN2QyxRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksS0FBSyxHQUFHbUMsZUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDekIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDeEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN6QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDekIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUN4QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNnRCxXQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUlqRCxRQUFNLEdBQUdrRCxRQUFXLENBQUM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUluQyxLQUFHLEdBQUdmLFFBQU0sQ0FBQztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSUMsZUFBYSxHQUFHa0QsZUFBa0IsQ0FBQztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSW5DLFFBQU0sR0FBR2YsZUFBYSxDQUFDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsSUFBSSxTQUFTLEdBQUdILGVBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQztBQUNBLEVBQUUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO0FBQ3JCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckMsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQzlCLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUM5QixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDOUIsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQzlCLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksSUFBSSxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN4RCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sSUFBSSxTQUFTLENBQUM7QUFDN0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sSUFBSSxTQUFTLENBQUM7QUFDN0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sSUFBSSxTQUFTLENBQUM7QUFDN0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sSUFBSSxTQUFTLENBQUM7QUFDN0MsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM1QixLQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3ZCLEVBQUUsT0FBTyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pJLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU00sYUFBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5SSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNyQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUMsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5cUI7O0FDajBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsUUFBTSxHQUFHO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSUgsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QztBQUNBLEVBQUUsSUFBSUEsVUFBbUIsSUFBSSxZQUFZLEVBQUU7QUFDM0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNJLE9BQUssQ0FBQyxDQUFDLEVBQUU7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJSixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU08sWUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJUCxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNLLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTVSxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNSLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTdUIsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMxQixPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENB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QztBQUNuQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDaEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsUUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUU7QUFDbkMsRUFBRSxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUcsQ0FBQztBQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHckIsTUFBZSxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDNUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN6QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTaUUsZUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTM0MsZUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTeEMsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUN2QztBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQjtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsRUFBRSxH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RyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RCxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyRCxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25ELEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakQsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5RCxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRSxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvRCxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvRCxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RCxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwRCxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RCxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvRCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVELEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pELEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RSxFQUFFLGlCQUFpQixFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVELEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdELEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pELEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xELEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hELEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xELEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNELEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pELEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hELEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BELEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVELEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25ELEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pELEVBQUUs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LEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFHLFVBQVU7QUFDdkMsSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDN0IsQ0FBQztBQUNEO0FBQ0EsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFHLFVBQVU7QUFDdkMsSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ2pHLENBQUM7QUFDRDtBQUNBLFNBQVMsWUFBWSxDQUFDLEtBQUssUUFBUSxLQUFLLFFBQVE7QUFDaEQsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDM0MsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDM0MsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDM0MsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDM0MsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLGtCQUFrQixDQUFDLENBQUMsRUFBRSxTQUFTLG1CQUFtQjtBQUMzRCxJQUFJLE1BQU0sQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLElBQUksTUFBTSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckMsSUFBSSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakQsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsV0FBVyxHQUFHLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3hGLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQy9CLElBQUksTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixJQUFJLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsSUFBSSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLElBQUksTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixJQUFJLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNqQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0SCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRTtBQUMxQyxJQUFJLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztBQUN2QixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdEQsUUFBUSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMvRCxZQUFZLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ3RFLFlBQVksSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDO0FBQzVFLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLG1CQUFtQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7QUFDOUMsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM5QyxRQUFRLElBQUksa0JBQWtCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ2hFLEtBQUs7QUFDTCxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFDRDtBQUNBLFNBQVMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDdEIsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMzQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFVBQVUsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNuQztBQUNBLElBQUksTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixJQUFJLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsSUFBSSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUksTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixJQUFJLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsSUFBSSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDckMsSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN0QyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDdEUsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN2QztBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdB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QUFNO0FBQ2hDLFlBQVksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDbEMsS0FBSyxNQUFNO0FBQ1g7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRO0FBQ3JDLFlBQVksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRO0FBQ2xDLFlBQVksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDbEMsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDMUMsU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUMzQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3hDLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDeEMsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUMzQyxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBQzNDO0FBQ0EsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNsRSxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFF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Q0FBQztBQUNoRCxLQUFLO0FBQ0wsSUFBSSxPQUFPLEVBQUU7QUFDYixRQUFRLFVBQVU7QUFDbEIsUUFBUSxDQUFDLFVBQVUsQ0FBQztBQUNwQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUk7QUFDM0QsS0FBSztBQUNMLElBQUksSUFBSSxFQUFFO0FBQ1YsUUFBUSxVQUFVO0FBQ2xCLFFBQVEsQ0FBQyxVQUFVLENBQUM7QUFDcEIsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxLQUFLO0FBQ0wsSUFBSSxNQUFNLEVBQUU7QUFDWixRQUFRLFVBQVU7QUFDbEIsUUFBUSxDQUFDLFVBQVUsQ0FBQztBQUNwQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUc7QUFDMUQsS0FBSztBQUNMLElBQUksS0FBSyxFQUFFO0FBQ1gsUUFBUSxVQUFVO0FBQ2xCLFFBQVEsQ0FBQyxVQUFVLENBQUM7QUFDcEIsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxLQUFLO0FBQ0wsSUFBSSxLQUFLLEVBQUU7QUFDWCxRQUFRLFVBQVU7QUFDbEIsUUFBUSxDQUFDLFVBQVUsQ0FBQztBQUNwQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLEtBQUs7QUFDTCxJQUFJLEtBQUssRUFBRTtBQUNYLFFBQVEsVUFBVTtBQUNsQixRQUFRLENBQUMsVUFBVSxDQUFDO0FBQ3BCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0MsS0FBSztBQUNMLElBQUksTUFBTSxFQUFFO0FBQ1osUUFBUSxVQUFVO0FBQ2xCLFFBQVEsQ0FBQyxVQUFVLENBQUM7QUFDcEIsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoRCxLQUFLO0FBQ0wsSUFBSSxNQUFNLEVBQUU7QUFDWixRQUFRLFVBQVU7QUFDbEIsUUFBUSxDQUFDLFVBQVUsQ0FBQztBQUNwQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELEtBQUs7QUFDTCxJQUFJLE1BQU0sRUFBRTtBQUNaLFFBQVEsVUFBVTtBQUNsQixRQUFRLENBQUMsVUFBVSxDQUFDO0FBQ3BCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEQsS0FBSztBQUNMLElBQUksS0FBSyxFQUFFO0FBQ1gsUUFBUSxVQUFVO0FBQ2xCLFFBQVEsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUMzQixRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLEtBQUs7QUFDTCxJQUFJLEtBQUssRUFBRTtBQUNYLFFBQVEsVUFBVTtBQUNsQixRQUFRLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDM0IsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RSxLQUFLO0FBQ0wsSUFBSSxLQUFLLEVBQUU7QUFDWCxRQUFRLFVBQVU7QUFDbEIsUUFBUSxDQUFDLFVBQVUsQ0FBQztBQUNwQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLEtBQUs7QUFDTCxJQUFJLE9BQU8sRUFBRTtBQUNiLFFBQVEsVUFBVTtBQUNsQixRQUFRLENBQUMsVUFBVSxDQUFDO0FBQ3BCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSztBQUN0QixZQUFZLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEM7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRCxTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUksT0FBTyxFQUFFO0FBQ2IsUUFBUSxVQUFVO0FBQ2xCLFFBQVEsQ0FBQyxVQUFVLENBQUM7QUFDcEIsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqRCxLQUFLO0FBQ0wsSUFBSSxNQUFNLEVBQUU7QUFDWixRQUFRLFVBQVU7QUFDbEIsUUFBUSxDQUFDLFVBQVUsQ0FBQztBQUNwQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELEtBQUs7QUFDTCxJQUFJLFdBQVcsRUFBRTtBQUNqQixRQUFRLFdBQVc7QUFDbkIsUUFBUSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUM7QUFDL0IsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sS0FBSztBQUM1RSxLQUFLO0FBQ0wsSUFBSSxjQUFjLEVBQUU7QUFDcEIsUUFBUSxXQUFXO0FBQ25CLFFBQVEsQ0FBQyxTQUFTLENBQUM7QUFDbkIsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxLQUFLO0FBQ2pELEtBQUs7QUFDTCxJQUFJLGdCQUFnQixFQUFFO0FBQ3RCLFFBQVEsV0FBVztBQUNuQixRQUFRLENBQUMsVUFBVSxDQUFDO0FBQ3BCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sS0FBSztBQUMzRCxLQUFLO0FBQ0wsSUFBSSxVQUFVLEVBQUU7QUFDaEIsUUFBUSxXQUFXO0FBQ25CLFFBQVEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDO0FBQy9CLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUs7QUFDekIsWUFBWSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUM7QUFDdkQsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUM7QUFDckMsWUFBWSxPQUFPLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEQsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLGFBQWEsRUFBRTtBQUNuQixRQUFRLFdBQVc7QUFDbkIsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUNuQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUs7QUFDdEIsWUFBWSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDL0IsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUM7QUFDckMsWUFBWSxPQUFPLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEQsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLFVBQVUsRUFBRTtBQUNoQixRQUFRLFdBQVc7QUFDbkIsUUFBUSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUM7QUFDL0IsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSztBQUN6QixZQUFZLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsQ0FBQztBQUN2RCxZQUFZLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQztBQUNyQyxZQUFZLE9BQU8sT0FBTyxDQUFDLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsRCxTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUksYUFBYSxFQUFFO0FBQ25CLFFBQVEsV0FBVztBQUNuQixRQUFRLENBQUMsU0FBUyxDQUFDO0FBQ25CLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSztBQUN0QixZQUFZLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUMvQixZQUFZLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQztBQUNyQyxZQUFZLE9BQU8sT0FBTyxDQUFDLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsRCxTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUksV0FBVyxFQUFFO0FBQ2pCLFFBQVEsV0FBVztBQUNuQixRQUFRLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQztBQUMvQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLO0FBQ3pCLFlBQVksTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDO0FBQ3ZELFlBQVksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDO0FBQ3JDLFlBQVksT0FBTyxPQUFPLENBQUMsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25ELFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxjQUFjLEVBQUU7QUFDcEIsUUFBUSxXQUFXO0FBQ25CLFFBQVEsQ0FBQyxTQUFTLENBQUM7QUFDbkIsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLO0FBQ3RCLFlBQVksTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQy9CLFlBQVksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDO0FBQ3JDLFlBQVksT0FBTyxPQUFPLENBQUMsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25ELFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxXQUFXLEVBQUU7QUFDakIsUUFBUSxXQUFXO0FBQ25CLFFBQVEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDO0FBQy9CLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUs7QUFDekIsWUFBWSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUM7QUFDdkQsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUM7QUFDckMsWUFBWSxPQUFPLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkQsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLGNBQWMsRUFBRTtBQUNwQixRQUFRLFdBQVc7QUFDbkIsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUNuQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUs7QUFDdEIsWUFBWSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDL0IsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUM7QUFDckMsWUFBWSxPQUFPLE9BQU8sQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkQsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLFlBQVksRUFBRTtBQUNsQixRQUFRLFdBQVc7QUFDbkIsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUNuQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEVBQUU7QUFDeEQsS0FBSztBQUNMLElBQUksZUFBZSxFQUFFO0FBQ3JCLFFBQVEsV0FBVztBQUNuQixRQUFRLEVBQUU7QUFDVixRQUFRLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLFNBQVMsQ0FBQztBQUM5RCxLQUFLO0FBQ0wsSUFBSSxnQkFBZ0IsRUFBRTtBQUN0QixRQUFRLFdBQVc7QUFDbkIsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMzQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQ3JFLEtBQUs7QUFDTCxJQUFJLGNBQWMsRUFBRTtBQUNwQixRQUFRLFdBQVc7QUFDbkIsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMxQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQzNELEtBQUs7QUFDTCxJQUFJLGlCQUFpQixFQUFFO0FBQ3ZCLFFBQVEsV0FBVztBQUNuQixRQUFRLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN0QztBQUNBLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3RGLEtBQUs7QUFDTCxJQUFJLGlCQUFpQixFQUFFO0FBQ3ZCLFFBQVEsV0FBVztBQUNuQixRQUFRLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN0QztBQUNBLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3JILEtBQUs7QUFDTCxJQUFJLEtBQUssRUFBRTtBQUNYLFFBQVEsSUFBSSxFQUFFLFdBQVc7QUFDekIsUUFBUSxTQUFTLEVBQUU7QUFDbkIsWUFBWTtBQUNaLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDMUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7QUFDbkUsYUFBYTtBQUNiLFlBQVk7QUFDWixnQkFBZ0IsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNwQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxLQUFLO0FBQy9CLG9CQUFvQixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtBQUM1Qyx3QkFBd0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO0FBQzlDLDRCQUE0QixPQUFPLEtBQUssQ0FBQztBQUN6QyxxQkFBcUI7QUFDckIsb0JBQW9CLE9BQU8sSUFBSSxDQUFDO0FBQ2hDLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLEtBQUssRUFBRTtBQUNYLFFBQVEsSUFBSSxFQUFFLFdBQVc7QUFDekIsUUFBUSxTQUFTLEVBQUU7QUFDbkIsWUFBWTtBQUNaLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDMUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7QUFDbkUsYUFBYTtBQUNiLFlBQVk7QUFDWixnQkFBZ0IsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNwQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxLQUFLO0FBQy9CLG9CQUFvQixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtBQUM1Qyx3QkFBd0IsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUM3Qyw0QkFBNEIsT0FBTyxJQUFJLENBQUM7QUFDeEMscUJBQXFCO0FBQ3JCLG9CQUFvQixPQUFPLEtBQUssQ0FBQztBQUNqQyxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSxHQUFHLEVBQUU7QUFDVCxRQUFRLFdBQVc7QUFDbkIsUUFBUSxDQUFDLFdBQVcsQ0FBQztBQUNyQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUN0QyxLQUFLO0FBQ0wsSUFBSSxxQkFBcUIsRUFBRTtBQUMzQixRQUFRLFdBQVc7QUFDbkIsUUFBUSxDQUFDLFVBQVUsQ0FBQztBQUNwQjtBQUNBLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSztBQUN0QixZQUFZLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0FBQ25GLFlBQVksSUFBSSxpQkFBaUIsRUFBRTtBQUNuQyxnQkFBZ0IsT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsYUFBYTtBQUNiLFlBQVksT0FBTyxJQUFJLENBQUM7QUFDeEIsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLFFBQVEsRUFBRTtBQUNkLFFBQVEsVUFBVTtBQUNsQixRQUFRLENBQUMsVUFBVSxDQUFDO0FBQ3BCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRTtBQUNuRCxLQUFLO0FBQ0wsSUFBSSxVQUFVLEVBQUU7QUFDaEIsUUFBUSxVQUFVO0FBQ2xCLFFBQVEsQ0FBQyxVQUFVLENBQUM7QUFDcEIsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFO0FBQ25ELEtBQUs7QUFDTCxJQUFJLFFBQVEsRUFBRTtBQUNkLFFBQVEsVUFBVTtBQUNsQixRQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDMUIsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUlILFVBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ2pGLEtBQUs7QUFDTCxJQUFJLGlCQUFpQixFQUFFO0FBQ3ZCLFFBQVEsVUFBVTtBQUNsQixRQUFRLENBQUMsWUFBWSxDQUFDO0FBQ3RCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGNBQWMsRUFBRTtBQUNwRSxLQUFLO0FBQ0wsQ0FBQyxDQUFDOztBQ2prQkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLE9BQU8sS0FBSyxtQkFBbUI7QUFDdEQsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBQ0Q7QUFDTyxTQUFTLEtBQUssT0FBTyxLQUFLLG1CQUFtQjtBQUNwRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BDOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsMEJBQTBCLENBQUMsSUFBSSx1Q0FBdUM7QUFDdEYsSUFBSSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxhQUFhLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLHlCQUF5QixDQUFDO0FBQzFHLENBQUM7QUFDRDtBQUNPLFNBQVMsc0JBQXNCLENBQUMsSUFBSSx1Q0FBdUM7QUFDbEYsSUFBSSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBQ0Q7QUFDTyxTQUFTLHFCQUFxQixDQUFDLElBQUksdUNBQXVDO0FBQ2pGLElBQUksT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztBQUM3RDs7QUNkQTtBQUNBO0FBQ2UsU0FBUyxPQUFPLENBQUMsR0FBRyxpQkFBaUI7QUFDcEQsSUFBSSxJQUFJLEdBQUcsWUFBWSxNQUFNLEVBQUU7QUFDL0IsUUFBUSxPQUFPLFFBQVEsQ0FBQztBQUN4QixLQUFLLE1BQU0sSUFBSSxHQUFHLFlBQVksTUFBTSxFQUFFO0FBQ3RDLFFBQVEsT0FBTyxRQUFRLENBQUM7QUFDeEIsS0FBSyxNQUFNLElBQUksR0FBRyxZQUFZLE9BQU8sRUFBRTtBQUN2QyxRQUFRLE9BQU8sU0FBUyxDQUFDO0FBQ3pCLEtBQUssTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDbkMsUUFBUSxPQUFPLE9BQU8sQ0FBQztBQUN2QixLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO0FBQzdCLFFBQVEsT0FBTyxNQUFNLENBQUM7QUFDdEIsS0FBSyxNQUFNO0FBQ1gsUUFBUSxPQUFPLE9BQU8sR0FBRyxDQUFDO0FBQzFCLEtBQUs7QUFDTDs7QUNKTyxTQUFTLFVBQVUsQ0FBQyxLQUFLLEVBQUU7QUFDbEMsSUFBSSxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBQ0Q7QUFDQSxTQUFTLGdCQUFnQixDQUFDLENBQUMsRUFBRTtBQUM3QixJQUFJLE9BQU8sQ0FBQyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ08sU0FBUyxjQUFjLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRTtBQUN6RCxJQUFJLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQ2xELElBQUksTUFBTSx1QkFBdUIsR0FBRyxVQUFVLENBQUMsS0FBSyxJQUFJLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUM7QUFDbkcsSUFBSSxNQUFNLGdCQUFnQixHQUFHLHVCQUF1QixJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDO0FBQzFGLElBQUksTUFBTSxhQUFhLEdBQUcsdUJBQXVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztBQUN2RSxJQUFJLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLENBQUMsWUFBWSxDQUFDLEdBQUcsYUFBYSxHQUFHLFVBQVUsQ0FBQyxDQUFDO0FBQ3ZHO0FBQ0EsSUFBSSxJQUFJLE9BQU8sRUFBRTtBQUNqQixRQUFRLFVBQVUsR0FBR0ksUUFBTSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM1QztBQUNBLFFBQVEsSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFO0FBQzlCLFlBQVksVUFBVSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSztBQUM5RCxnQkFBZ0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkQsYUFBYSxDQUFDLENBQUM7QUFDZixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRTtBQUNoQyxZQUFZLFVBQVUsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakUsU0FBUyxNQUFNO0FBQ2YsWUFBWSxVQUFVLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25FLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsVUFBVSxLQUFLLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUU7QUFDekcsUUFBUSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMscUJBQXFCLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksUUFBUSxDQUFDO0FBQ2pCLElBQUksSUFBSSxXQUFXLENBQUM7QUFDcEIsSUFBSSxJQUFJLGtCQUFrQixDQUFDO0FBQzNCLElBQUksSUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFO0FBQ2hDLFFBQVEsUUFBUSxHQUFHLDJCQUEyQixDQUFDO0FBQy9DLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUU7QUFDcEMsUUFBUSxRQUFRLEdBQUcsd0JBQXdCLENBQUM7QUFDNUMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLGFBQWEsRUFBRTtBQUN2QyxRQUFRLFFBQVEsR0FBRywyQkFBMkIsQ0FBQztBQUMvQztBQUNBO0FBQ0EsUUFBUSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQyxRQUFRLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRTtBQUM3QyxZQUFZLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRLGtCQUFrQixHQUFHLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRDtBQUNBLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxVQUFVLEVBQUU7QUFDcEMsUUFBUSxRQUFRLEdBQUcsd0JBQXdCLENBQUM7QUFDNUMsS0FBSyxNQUFNO0FBQ1gsUUFBUSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0QsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLHVCQUF1QixFQUFFO0FBQ2pDLFFBQVEsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDcEMsUUFBUSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDN0IsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDMUQsWUFBWSxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdDLFlBQVksTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN0QyxZQUFZLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQ3RELGdCQUFnQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRztBQUN6QyxvQkFBb0IsSUFBSTtBQUN4QixvQkFBb0IsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJO0FBQ3pDLG9CQUFvQixRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7QUFDakQsb0JBQW9CLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztBQUMvQyxvQkFBb0IsS0FBSyxFQUFFLEVBQUU7QUFDN0IsaUJBQWlCLENBQUM7QUFDbEIsZ0JBQWdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsYUFBYTtBQUNiLFlBQVksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ3hDLFFBQVEsS0FBSyxNQUFNLENBQUMsSUFBSSxTQUFTLEVBQUU7QUFDbkMsWUFBWSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNySCxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDbkQsUUFBUSxPQUFPO0FBQ2YsWUFBWSxJQUFJLEVBQUUsV0FBVztBQUM3QixZQUFZLGlCQUFpQjtBQUM3QixZQUFZLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDO0FBQ25HLFlBQVksU0FBUyxFQUFFLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFELFlBQVksUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFO0FBQ3pDLGdCQUFnQixPQUFPLDJCQUEyQixDQUFDO0FBQ25ELG9CQUFvQixLQUFLLEVBQUUsb0JBQW9CO0FBQy9DLG9CQUFvQixJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7QUFDekMsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDbEUsYUFBYTtBQUNiLFNBQVMsQ0FBQztBQUNWLEtBQUssTUFBTSxJQUFJLGFBQWEsRUFBRTtBQUM5QixRQUFRLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxLQUFLLGFBQWE7QUFDeEQsWUFBWSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEtBQUssU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BHLFFBQVEsT0FBTztBQUNmLFlBQVksSUFBSSxFQUFFLFFBQVE7QUFDMUIsWUFBWSxpQkFBaUI7QUFDN0IsWUFBWSxtQkFBbUIsRUFBRSxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQztBQUNuRyxZQUFZLFNBQVMsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELFlBQVksUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxRQUFRLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixDQUFDO0FBQzNHLFNBQVMsQ0FBQztBQUNWLEtBQUssTUFBTTtBQUNYLFFBQVEsT0FBTztBQUNmLFlBQVksSUFBSSxFQUFFLFFBQVE7QUFDMUIsWUFBWSxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRTtBQUNqQyxnQkFBZ0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ2xILGdCQUFnQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDekMsb0JBQW9CLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlFLGlCQUFpQjtBQUNqQixnQkFBZ0IsT0FBTyxRQUFRLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDbEcsYUFBYTtBQUNiLFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMzQixJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsQyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsQyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUU7QUFDNUYsSUFBSSxNQUFNLFNBQVMsR0FBRyxPQUFPLEtBQUssS0FBSyxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUNoRixJQUFJLE9BQU8sUUFBUSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBQ0Q7QUFDQSxTQUFTLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0FBQ25FO0FBQ0EsSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxRQUFRLEVBQUUsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0YsSUFBSSxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUN0QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsSUFBSSxJQUFJLEtBQUssSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RSxJQUFJLElBQUksS0FBSyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0U7QUFDQSxJQUFJLE1BQU0sS0FBSyxHQUFHLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVGO0FBQ0EsSUFBSSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUNEO0FBQ0EsU0FBUywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRTtBQUN0RSxJQUFJLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEtBQUssU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ3JFO0FBQ0E7QUFDQSxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLFFBQVEsRUFBRSxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMvRixJQUFJLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ3RDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvQyxJQUFJLElBQUksS0FBSyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLElBQUksSUFBSSxLQUFLLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRTtBQUNBLElBQUksTUFBTSxLQUFLLEdBQUcseUJBQXlCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUYsSUFBSSxNQUFNLENBQUMsR0FBRyxtQkFBbUI7QUFDakMsUUFBUSxLQUFLLEVBQUUsSUFBSTtBQUNuQixRQUFRLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLFFBQVEsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QztBQUNBLElBQUksTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRCxJQUFJLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELElBQUksSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQztBQUNwRTtBQUNBLElBQUksSUFBSSxVQUFVLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEtBQUssS0FBSyxFQUFFO0FBQ2xFLFFBQVEsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM5RCxRQUFRLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZILEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxPQUFPLFdBQVcsQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFO0FBQ3BELFFBQVEsT0FBTztBQUNmLFlBQVksUUFBUSxDQUFDLEdBQUcsSUFBSSxFQUFFO0FBQzlCLGdCQUFnQixNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkYsZ0JBQWdCLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuRjtBQUNBLGdCQUFnQixJQUFJLGNBQWMsS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtBQUNsRixvQkFBb0IsT0FBTyxTQUFTLENBQUM7QUFDckMsaUJBQWlCO0FBQ2pCLGdCQUFnQixPQUFPLE1BQU0sQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLGFBQWE7QUFDYixTQUFTLENBQUM7QUFDVixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUNEO0FBQ0EsU0FBUyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRTtBQUNuRSxJQUFJLElBQUksWUFBWSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7QUFDdkMsUUFBUSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuQyxLQUFLLE1BQU0sSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtBQUNsRCxRQUFRLEtBQUssR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELEtBQUssTUFBTSxJQUFJLFlBQVksQ0FBQyxJQUFJLEtBQUssZUFBZSxFQUFFO0FBQ3RELFFBQVEsS0FBSyxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDM0QsS0FBSyxNQUFNLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLFlBQVksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDdEgsUUFBUSxLQUFLLEdBQUcsU0FBUyxDQUFDO0FBQzFCLEtBQUs7QUFDTCxJQUFJLE9BQU8sUUFBUSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxt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Q0FBQyxNQUFNLENBQUM7QUFDOUIsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDM0QsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtBQUMzRyxRQUFRLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVB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VSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtBQUMvSSxRQUFRLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxPQUFPLENBQUMsQ0FBQztBQUNqQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsdUJBQXVCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDdkQsUUFBUSxDQUFDLHlCQUF5QixFQUFFLHVCQUF1QixDQUFDLENBQUM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLHNCQUFzQixTQUFTLFdBQVcsQ0FBQztBQUNqRDtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRztBQUNwQixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDeEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVTtBQUNoSCxRQUFRLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDOUIsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVO0FBQ3ZILFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLE9BQU8sQ0FBQyxDQUFDO0FBQ2pCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUN0RCxRQUFRLENBQUMsd0JBQXdCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sNEJBQTRCLFNBQVMsV0FBVyxDQUFDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxhQUFhLEdBQUc7QUFDcEIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN0RCxRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDeEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVO0FBQ3ROLFFBQVEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUM5QixRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFFBQVEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyRyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVO0FBQzdOLFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMs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QUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN0RixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVO0FBQ3RMLFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFRLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJ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LFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdEQsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMxRCxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3hELFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDeEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVU7QUFDdlIsUUFBUSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzlCLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0IsUUFBUSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDOUgsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVO0FBQzlSLFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFRLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsUUFBUSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLFFBQVEsT0FBTyxDQUFDLENBQUM7QUFDakIsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLDZDQUE2QyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzdFLFFBQVEsQ0FBQywrQ0FBK0MsRUFBRSw2Q0FBNkMsQ0FBQyxDQUFDO0FBQ3pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sa0NBQWtDLFNBQVMsV0FBVyxDQUFDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYSxHQUFHO0FBQ3BCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdEQsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN0RCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzFELFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDeEQsUUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN4RCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVTtBQUM1WSxRQUFRLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDOUIsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzSyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVU7QUFDblosUUFBUSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUs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SSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQzVFLElBQUksSUFBSSxXQUFXLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUMxRSxJQUFJLElBQUksaUJBQWlCLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoRixJQUFJLElBQUksaUJBQWlCLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUN0RixJQUFJLElBQUksTUFBTSxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDckUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0FBQzNFLElBQUksSUFBSSxXQUFXLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUMzRSxJQUFJLElBQUksV0FBVyxDQUFDLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDakYsSUFBSSxJQUFJLG1CQUFtQixHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDbEYsSUFBSSxJQUFJLFNBQVMsR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ3hFLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUM5RSxDQUFDO0FBQ0Q7QUFDQSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxNQUFNLGlCQUFpQixTQUFTLDZDQUE2QyxDQUFDO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEdBQUcsQ0FBQyxLQUFLLDhCQUE4QjtBQUMzQyxRQUFRQSxRQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDcEMsUUFBUSxPQUFPLElBQUksa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ25ELEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxRQUFRLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUNqRDtBQUNBLE1BQU0sb0JBQW9CLFNBQVMsTUFBTSxDQUFDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLGdCQUFnQixHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDOUUsSUFBSSxJQUFJLGdCQUFnQixHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDOUUsSUFBSSxJQUFJLGdCQUFnQixHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDOUUsSUFBSSxJQUFJLFdBQVcsR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzNFLElBQUksSUFBSSxXQUFXLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMzRSxJQUFJLElBQUksNkJBQTZCLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMzRixJQUFJLElBQUksOEJBQThCLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM1RixJQUFJLElBQUksNEJBQTRCLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUMzRixJQUFJLElBQUksNkJBQTZCLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcs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RSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsS0FBSyxVQUFVLENBQUM7QUFDckYsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLEtBQUssVUFBVSxDQUFDO0FBQ3JGO0FBQ0EsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ1gsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUN0QyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLEtBQUssVUFBVSxDQUFDO0FBQ3BGLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoRixFQUFFO0FBQ0Y7QUFDQSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDUjtBQUNBLENBQUMsUUFBUSxTQUFTO0FBQ2xCLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7QUFDcEQsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUMzQztBQUNBLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDbkYsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ25GLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNYLEVBQUU7QUFDRjtBQUNBLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFDbEI7QUFDQSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ2pCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksVUFBVSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDbEcsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNqQixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLFVBQVUsSUFBSSxNQUFNLEtBQUssRUFBRSxDQUFDLEtBQUssVUFBVSxDQUFDO0FBQ3BHLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDakI7QUFDQSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQSxHQUFHLFFBQWEsS0FBSyxXQUFXLEVBQUU7QUFDbEMsRUFBRSxpQkFBaUIsa0JBQWlCO0FBQ3BDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3REQSxTQUFTLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDdEMsRUFBRTtBQUNGLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNO0FBQ2xCLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDVCxJQUFJLENBQUMsQ0FBQztBQUNOO0FBQ0EsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDakIsR0FBRyxDQUFDO0FBQ0osS0FBSyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtBQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7QUFDeEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQ3pDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksVUFBVSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JGLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksVUFBVSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JGO0FBQ0EsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0RjtBQUNBLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNYLElBQUksRUFBRSxDQUFDLENBQUM7QUFDUixHQUFHO0FBQ0g7QUFDQSxFQUFFLFFBQVEsQ0FBQztBQUNYLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNwRCxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7QUFDbkQsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUMxQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0YsR0FBRztBQUNIO0FB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QUMsRUFBRSxFQUFFO0FBQ3hCLFlBQVksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRCxZQUFZLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEQ7QUFDQSxTQUFTLE1BQU07QUFDZixZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsV0FBVztBQUN4QixRQUFRLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNoRyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxZQUFZLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksWUFBWSxXQUFXLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksV0FBVyxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxPQUFPLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxPQUFPLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU8sR0FBRztBQUNkLFFBQVEsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ3hELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksUUFBUSxHQUFHO0FBQ2YsUUFBUSxPQUFPLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUUsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxHQUFHO0FBQ2QsUUFBUSxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsTUFBTSxjQUFjO0FBQ2pDLFFBQVEsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xEO0FBQ0EsUUFBUSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDNUUsUUFBUSxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDM0UsUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO0FBQ3pDLFlBQVksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUMzRSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sZ0JBQWdCLElBQUksaUJBQWlCLENBQUM7QUFDckQsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxPQUFPLENBQUMsS0FBSyxrQ0FBa0M7QUFDMUQsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssWUFBWSxZQUFZLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDbEUsUUFBUSxPQUFPLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZDLEtBQUs7QUFDTDs7QUMvU0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxNQUFNLENBQUM7QUFDYjtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxHQUFHLFVBQVUsR0FBRyxVQUFVO0FBQzFDLFFBQVEsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3RDLFlBQVksTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLHdCQUF3QixFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkUsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUN4QixRQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDeEIsUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUU7QUFDN0MsWUFBWSxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7QUFDekYsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxHQUFHO0FBQ1gsUUFBUSxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxPQUFPLEdBQUc7QUFDZCxRQUFRLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLEdBQUc7QUFDZixRQUFRLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxVQUFVLENBQUMsTUFBTSxVQUFVO0FBQy9CLFFBQVEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDbEMsUUFBUSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNwQyxRQUFRLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3RDLFFBQVEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzlIO0FBQ0EsUUFBUSxNQUFNLFNBQVMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLFFBQVEsT0FBTyxTQUFTLENBQUM7QUFDekIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsTUFBTSxZQUFZLENBQUMsRUFBRTtBQUNsQyxRQUFRLE1BQU0sbUNBQW1DLEdBQUcsUUFBUSxDQUFDO0FBQzdELFFBQVEsTUFBTSxXQUFXLEdBQUcsR0FBRyxHQUFHLE1BQU0sR0FBRyxtQ0FBbUM7QUFDOUUsWUFBWSxXQUFXLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FB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R0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQztBQUNBLFFBQVEsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDOUMsUUFBUSxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN0RCxRQUFRLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4RCxRQUFRLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEM7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRTtBQUNyQjtBQUNBLFlBQVksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUMsWUFBWSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNuQyxZQUFZLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLFlBQVksTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbkMsWUFBWSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDaEQsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDbkMsWUFBWSxHQUFHLENBQUMsQ0FB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QkFBZ0I7QUFDbEMsUUFBUSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JELFFBQVEsTUFBTSxJQUFJLEdBQUdDLE9BQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsUUFBUSxNQUFNLElBQUksR0FBR0EsT0FBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxRQUFRLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFO0FBQ3hELFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUUsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxRSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFFBQVEsT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEMsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLENBQUMsS0FBSyx5QkFBeUI7QUFDNUMsUUFBUSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMs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QUksQ0FBQztBQUNyQjtBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDekM7QUFDQTtBQUNBLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxRQUFRLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLFFBQVEsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0UsUUFBUSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlFO0FBQ0E7QUFDQSxJQUFJLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQ3hELFFBQVEsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDekQ7QUFDQSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLO0FBQ3JCLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDdEI7QUFDQTtBQUNBLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO0FBQ2pELFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUk7QUFDNUMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDdkQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUNwQjtBQUNBLFFBQVEsSUFBSSxDQUFDLEtB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S0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQzdELFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsSUFBSSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0UsWUFBWSxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDNUUsYUFBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRCxZQUFZQSxRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN2QixJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTQSxRQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUN4QixJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEMsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0EsSUFBSSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQztBQUM1QztBQUNBLElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3ZELElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3ZELElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3ZELElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3ZEO0FBQ0EsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzVCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUNEO0FBQ0EsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ25CLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNqQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLElBQUksR0FBRztBQUNQLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDOUUsZ0JBQWdCLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDekQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNuQixLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUN0QjtBQUNBLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDdEMsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzFELFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM1QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDYixRQUFRLE1BQU0sR0FBRyxLQUFLO0FBQ3RCLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDNUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdCLElBQUksR0FBRztBQUNQLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDaEUsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxZQUFZLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUM3QixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ25CLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3RCO0FBQ0EsSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsU0FBUyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM1QixJQUFJLElBQUksRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFFBQVEsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJO0FBQ25CLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEI7QUFDQSxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNmO0FBQ0EsSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNqQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2pCO0FBQ0EsSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNqQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2pCO0FBQ0EsSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUNqQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ2pCO0FBQ0EsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUNkLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFO0FBQ25DLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5QjtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtBQUNmLFFBQVEsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbkIsUUFBUSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNuQjtBQUNBLEtBQUssTUFBTTtBQUNYLFFBQVEsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzNCLFFBQVEsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDdEIsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDM0IsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN0QixLQUFLO0FBQ0wsSUFBSSxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLENBQUMsRUFBRTtBQUN2QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDekIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3pCO0FBQ0EsSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN6QyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3pDLENBQUM7QUFDRDtBQUNBLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3ZCO0FBQ0EsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDckI7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDbEI7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDdEIsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN0QjtBQUNBO0FBQ0EsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUN6QixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsTUFBTSxDQUFDLFNBQVMsR0FBRyxVQUFVLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRTtBQUNoRSxJQUFJLElBQUksUUFBUSxHQUFHLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDO0FBQ3JELElBQUksSUFBSSxRQUFRLEdBQUcsUUFBUSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUNqRTtBQUNBLElBQUksSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRSxJQUFJLElBQUksUUFBUSxFQUFFO0FBQ2xCLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRSxZQUFZLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDN0MsWUFBWSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzNFLFlBQVksV0FBVyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkUsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDOUMsUUFBUSxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdkMsUUFBUSxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN2QyxRQUFRLGFBQWEsSUFBSSxJQUFJLENBQUMsR0FBRztBQUNqQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sV0FBVyxLQUFLLENBQUMsSUFBSSxhQUFhLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFDdkQsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxHQUFHLFdBQVcsSUFBSSxXQUFXLENBQUMsQ0FBQztBQUM5RCxDQUFDLENBQUM7QUFDRjtBQUNBLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUMzQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNoQixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRTtBQUMxRCxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsS0FBSztBQUNMLElBQUksT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBQ0Q7QUFDQTtBQUNBLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxJQUFJLEVBQUU7QUFDakMsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUMvQixRQUFRLE1BQU0sR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDO0FBQzNELFFBQVEsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUN0QjtBQUNBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNqRCxZQUFZ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QUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDckIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUN0QixJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBQ3hCO0FBQ0EsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDekM7QUFDQSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFDeEMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDcEMsSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDckQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDdEQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDeEQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELFNBQVMsSUFBSSxHQUFHLEtBQUssQ0FBQyxF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RSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsWUFBWSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFlBQVksTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQztBQUNBLFlBQVksTUFBTSxPQUFPLEdBQUdBLEtBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDeEMsWUFBWSxNQUFNLE9BQU8sR0FBR0EsS0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN4QyxZQUFZLE1BQU0sT0FBTyxHQUFHQSxLQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLFlBQVksTUFBTSxPQUFPLEdBQUdBLEtBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDeEMsWUFBWSxNQUFNLE9BQU8sR0FBR0EsS0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN4QyxZQUFZLE1BQU0sS0FBSyxHQUFHLE9BQU8sR0FBRyxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUNoRTtBQUNBLFlBQVksTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sR0FBRyxPQUFPLElBQUksS0FBSyxDQUFDO0FBQ3RFLFlBQVksTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sR0FBRyxPQUFPLElBQUksS0FBSyxDQUFDO0FBQ3RFLFlBQVksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEM7QUFDQTtBQUNBLFlBQVksTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekQ7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R0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDMUMsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDMUM7QUFDQSxZQUFZLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkQsWUFBWSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELFlBQVksTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuRCxZQUFZLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkQ7QUFDQSxZQUFZLE1BQU0sS0FBSyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUM7QUFDdEMsWUFBWSxNQUFNLEtBQUssR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBQ3RDLFlBQVksTUFBTSxLQUFLLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztBQUN0QyxZQUFZLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6RDtBQUNBLFlBQVksTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQztBQUNwQyxZQUFZLE1BQU0sSUFBSSxHQUFH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QUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixDQUFDLENBQUM7QUFDRjtBQUNlLFNBQVMsc0JBQXNCLENBQUMsS0FBSyxVQUFVLG1CQUFtQixXQUFXO0FBQzVGLElBQUksSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3BCO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzQyxRQUFRLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUM3RCxRQUFRLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUM3RDtBQUNBLFFBQVEsTUFB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QUFPLEdBQUcsQ0FBQztBQUNuQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFVBQVUsRUFBRSxTQUFTLFFBQVEsRUFBRTtBQUNuQyxRQUFRLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHO0FBQzFCLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNuQjtBQUNBLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQy9FLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQy9FLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQy9FLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQy9FLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNyRDtBQUNBLFFBQVEsT0FBTyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hELEtBQUs7QUFDTDtBQUNBLElBQUksWUFBWSxFQUFFLFdBQVc7QUFDN0IsUUFBUSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLEVBQUUsV0FBVztBQUM1QixRQUFRLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNwQyxRQUFRLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDeEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLEVBQUUsV0FBVztBQUM1QixRQUFRLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLEtBQUs7QUFDTDtBQUNBLElBQUksVUFBVSxFQUFFLFdBQVc7QUFDM0IsUUFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUMvQyxRQUFRLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDM0IsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN2QjtBQUNBLFFBQVEsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLHVCQUF1QixJQUFJLGVBQWUsRUFBRTtBQUNyRTtBQUNBLFlBQVksT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzRCxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxFQUFFLFdBQVc7QUFDMUIsUUFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUc7QUFDOUMsWUFBWSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN0RCxRQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3ZCLFFBQVEsT0FBTyxNQUFNLENBQUM7QUFDdEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0JBQWdCLEVBQUUsU0FBUyxHQUFHLEVBQUUsUUFBUSxFQUFFO0FBQzlDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUNoRixRQUFRLElBQUksR0FBRyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ3hCLFFBQVEsT0FBTyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUNuRSxRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQ25CLEtBQUs7QUFDTCxJQUFJLGlCQUFpQixFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ3JDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLFFBQVEsSUFBSSxHQUFHLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7QUFDeEIsUUFBUSxPQUFPLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDNUQsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNuQixLQUFLO0FBQ0wsSUFBSSxpQkFBaUIsRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUNyQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUN6RSxRQUFRLElBQUksR0FBRyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ3hCLFFBQVEsT0FBTyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzVELFFBQVEsT0FBTyxHQUFHLENBQUM7QUFDbkIsS0FBSztBQUNMLElBQUksZUFBZSxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ25DLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZFLFFBQVEsSUFBSSxHQUFHLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7QUFDeEIsUUFBUSxPQUFPLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDMUQsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNuQixLQUFLO0FBQ0wsSUFBSSxnQkFBZ0IsRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUNwQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUN4RSxRQUFRLElBQUksR0FBRyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ3hCLFFBQVEsT0FBTyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQzNELFFBQVEsT0FBTyxHQUFHLENBQUM7QUFDbkIsS0FBSztBQUNMLElBQUksaUJBQWlCLEVBQUUsU0FBUyxHQUFHLEVBQUU7QUFDckMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDekUsUUFBUSxJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztBQUN4QixRQUFRLE9BQU8sSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUM1RCxRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQ25CLEtBQUs7QUFDTCxJQUFJLGtCQUFrQixFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ3RDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLFFBQVEsSUFBSSxHQUFHLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7QUFDeEIsUUFBUSxPQUFPLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7QUFDN0QsUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNuQixLQUFLO0FBQ0wsSUFBSSxpQkFBaUIsRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUNyQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUN6RSxRQUFRLElBQUksR0FBRyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ3hCLFFBQVEsT0FBTyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzVELFFBQVEsT0FBTyxHQUFHLENBQUM7QUFDbkIsS0FBSztBQUNMLElBQUksa0JBQWtCLEVBQUUsU0FBUyxHQUFHLEVBQUU7QUFDdEMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7QUFDMUUsUUFBUSxJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEMsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztBQUN4QixRQUFRLE9BQU8sSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztBQUM3RCxRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQ25CLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ3hCLFFBQVEsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QixRQUFRLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFO0FBQ3ZFLGFBQWEsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQzdFLGFBQWEsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNyRCxhQUFhLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDckQsYUFBYSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzVELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsRUFBRSxTQUFTLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDbEMsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUM1QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUMzQixRQUFRLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ3ZDO0FBQ0EsUUFBUSxPQUFPLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDO0FBQ3BEO0FBQ0EsUUFBUSxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ3BDLFlBQVksSUFBSSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0MsWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5QixZQUFZLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzNCLFlBQVksSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDakMsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksTUFBTSxFQUFFLFdBQVc7QUFDdkIsUUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDL0IsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNyQixRQUFRLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNqRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFlBQVksRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUNoQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBUSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVDLFFBQVEsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxhQUFhLEVBQUUsU0FBUyxHQUFHLEVBQUU7QUFDakMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFFBQVEsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QyxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3RCLEtBQUs7QUFDTDtBQUNBLElBQUksWUFBWSxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixRQUFRLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakQsUUFBUSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdFLFFBQVEsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxhQUFhLEVBQUUsU0FBUyxHQUFHLEVBQUU7QUFDakMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFFBQVEsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqRCxRQUFRLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0UsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN0QixLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUMvQixRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDeEI7QUFDQSxRQUFRLElBQUksR0FBRyxHQUFHLFNBQVMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO0FBQ3hDLFlBQVksY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QyxZQUFZLE9BQU87QUFDbkIsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsT0FBTztBQUN4RyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxLQUFLLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLE9BQU87QUFDeEcsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxPQUFPO0FBQ3hHLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQ3BELEtBQUs7QUFDTDtBQUNBLElBQUksWUFBWSxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNELEtBQUs7QUFDTDtBQUNBLElBQUksWUFBWSxFQUFFLFNBQVMsR0FBRyxFQUFFO0FBQ2hDLFFBQVEsSUFBSSxDQUFDLFdB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RUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZELElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDdkQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUN2RCxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZELElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQztBQUNwQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGtCQUFrQixDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDdkMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQ2pDO0FBQ0EsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPO0FBQ3RGLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMs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Q0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtBQUMxRyxTQUFTLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7QUFDMUcsU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQzFHLFNBQVMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxRyxTQUFTLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7QUFDMUcsU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzFHO0FBQ0E7QUFDQTtBQUNBLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDOUIsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3JCLFNBQVMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0IsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM1QixTQUFTLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDbkMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25CLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUNoQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFDRDtBQUNBLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDN0IsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3JCLFNBQVMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0IsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM1QixTQUFTLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUks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LFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUU7QUFDQSxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEcsWUFBWSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEcsWUFBWSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BHLFlBQVksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMs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LENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNsRyxhQUFhO0FBQ2I7QUFDQSxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7QUFDeEMsZ0JBQWdCLFNBQVM7QUFDekIsYUFBYSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7QUFDbEMsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJQSxhQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDbEcsYUFBYSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7QUFDbEMsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJQSxhQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDbEcsYUFBYTtBQUNiO0FBQ0EsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFF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SyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsUUFBUSxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEcsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RixDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN0RCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUNoQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDeEI7QUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ25ELFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDLFFBQVEsTUFBTSxF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RyxDQUFDLFFBQVEsQ0FBQztBQUM3RSxJQUFJLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQy9DLFFBQVEsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekMsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDOUIsSUFBSSxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQy9CLElBQUksTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDN0MsSUFBSSxJQUFJLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCO0FBQ0E7QUFDQSxJQUFJLE1BQU0sU0FBUyxHQUFHLElBQUlDLFNBQUssQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDaEQ7QUFDQSxJQUFJLElBQUksUUFBUSxLQUFLLENBQUMsRUFBRSxPQUFPLElBQUluRixhQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3JEO0FBQ0E7QUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRTtBQUNoRCxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLFFBQVEsRUFBRTtBQUNwRCxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksSUFBSSxRQUFRLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2pELElBQUksSUFBSSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztBQUNyQztBQUNBLElBQUksT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFO0FBQzdCO0FBQ0EsUUFBUSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDckM7QUFDQTtBQUNBLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ2hELFlBQVksUUFBUSxHQUFHLElBQUksQ0FBQztBQUM1QixZQUFZLElBQUksS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMvRyxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksU0FBUyxFQUFFLFNBQVM7QUFDekQ7QUFDQTtBQUNBLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQzlFLFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQzlFLFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQzlFLFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQzlFLFFBQVEsU0FBUyxJQUFJLENBQUMsQ0FBQztBQUN2QixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksS0FBSyxFQUFFO0FBQ2YsUUFBUSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxRQUFRLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzFCLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDekIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFO0FBQ2hDLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJQSxhQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNqRCxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDNUMsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLGtCQUFrQixDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUU7QUFDeEMsSUFBSSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDdkIsSUFBSSxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUM7QUFDN0I7QUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzdDLFFBQVEsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDO0FBQ0EsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtBQUMxRSxZQUFZLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixZQUFZLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QjtBQUNBLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUM7QUFDeEY7QUFDQSxZQUFZLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0UsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsZUFBZSxDQUFDLE9BQU8sRUFBRTtBQUNsQyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNqQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtBQUN4RSxRQUFRLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixRQUFRLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixRQUFRLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QixRQUFRLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEtBQUs7QUFDTCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNwRDs7QUNoSUE7QUFrQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO0FBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0I7QUFDTyxTQUFTLHNCQUFzQixDQUFDLE1BQU0sY0FBYyxNQUFNLG9CQUFvQjtBQUNyRjtBQUNBLElBQUksU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNLGNBQWMsWUFBWSxVQUFVO0FBQ3hFLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQztBQUMvQztBQUNBLFFBQVEsTUFBTSxVQUFVLEdBQUcsWUFBWSxHQUFHLEtBQUssQ0FBQztBQUNoRCxRQUFRLFFBQVEsTUFBTTtBQUN0QixRQUFRLEtBQUssV0FBVyxDQUFDO0FBQ3pCLFFBQVEsS0FBSyxVQUFVO0FBQ3ZCLFlBQVksQ0FBQyxHQUFHLFVBQVUsR0FBRyxjQUFjLENBQUM7QUFDNUMsWUFBWSxNQUFNO0FBQ2xCLFFBQVEsS0FBSyxjQUFjLENBQUM7QUFDNUIsUUFBUSxLQUFLLGFBQWE7QUFDMUIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDO0FBQzdDLFlBQVksTUFBTTtBQUNsQixRQUFRLEtBQUssUUFBUTtBQUNyQixZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxjQUFjLENBQUM7QUFDL0MsWUFBWSxNQUFNO0FBQ2xCLFFBQVEsS0FBSyxLQUFLO0FBQ2xCLFlBQVksQ0FBQyxHQUFHLFlBQVksR0FBRyxjQUFjLENBQUM7QUFDOUMsWUFBWSxNQUFNO0FBQ2xCLFNBQVM7QUFDVDtBQUNBLFFBQVEsUUFBUSxNQUFNO0FBQ3RCLFFBQVEsS0FBSyxXQUFXLENBQUM7QUFDekIsUUFBUSxLQUFLLGNBQWM7QUFDM0IsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7QUFDNUIsWUFBWSxNQUFNO0FBQ2xCLFFBQVEsS0FBSyxVQUFVLENBQUM7QUFDeEIsUUFBUSxLQUFLLGFBQWE7QUFDMUIsWUFBWSxDQUFDLEdBQUcsVUFBVSxDQUFDO0FBQzNCLFlBQVksTUFBTTtBQUNsQixRQUFRLEtBQUssTUFBTTtBQUNuQixZQUFZLENBQUMsR0FBRyxZQUFZLENBQUM7QUFDN0IsWUFBWSxNQUFNO0FBQ2xCLFFBQVEsS0FBSyxPQUFPO0FBQ3BCLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO0FBQzlCLFlBQVksTUFBTTtBQUNsQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLGNBQWMsQ0FBQyxNQUFNLGNBQWMsT0FBTyxVQUFVLE9BQU8sVUFBVTtBQUNsRixRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCO0FBQ0EsUUFBUSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwQyxRQUFRLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BDO0FBQ0EsUUFBUSxRQUFRLE1BQU07QUFDdEIsUUFBUSxLQUFLLFdBQVcsQ0FBQztBQUN6QixRQUFRLEtBQUssVUFBVSxDQUFDO0FBQ3hCLFFBQVEsS0FBSyxLQUFLO0FBQ2xCLFlBQVksQ0FBQyxHQUFHLE9BQU8sR0FBRyxjQUFjLENBQUM7QUFDekMsWUFBWSxNQUFNO0FBQ2xCLFFBQVEsS0FBSyxjQUFjLENBQUM7QUFDNUIsUUFBUSxLQUFLLGFBQWEsQ0FBQztBQUMzQixRQUFRLEtBQUssUUFBUTtBQUNyQixZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUM7QUFDMUMsWUFBWSxNQUFNO0FBQ2xCLFNBQVM7QUFDVDtBQUNBLFFBQVEsUUFBUSxNQUFNO0FBQ3RCLFFBQVEsS0FBSyxXQUFXLENBQUM7QUFDekIsUUFBUSxLQUFLLGNBQWMsQ0FBQztBQUM1QixRQUFRLEtBQUssT0FBTztBQUNwQixZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztBQUN6QixZQUFZLE1BQU07QUFDbEIsUUFBUSxLQUFLLFVBQVUsQ0FBQztBQUN4QixRQUFRLEtBQUssYUFBYSxDQUFDO0FBQzNCLFFBQVEsS0FBSyxNQUFNO0FBQ25CLFlBQVksQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUN4QixZQUFZLE1BQU07QUFDbEIsU0FBUztBQUNUO0FBQ0EsUUFBUSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxtQkFBbUIsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEksQ0FBQztBQUNEO0FBQ08sU0FBUyxtQkFBbUIsQ0FBQyxNQUFNO0FBQzFDLDZCQUE2QixRQUFRO0FBQ3JDLDZCQUE2QixjQUFjO0FBQzNDLDZCQUE2QixRQUFRO0FBQ3JDLDZCQUE2QixjQUFjO0FBQzNDLDZCQUE2QixrQkFBa0I7QUFDL0MsNkJBQTZCLGVBQWU7QUFDNUMsNkJBQTZCLFNBQVM7QUFDdEMsNkJBQTZCLFFBQVE7QUFDckMsNkJBQTZCLFVBQVUsY0FBYztBQUNyRCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUMxQjtBQUNBLElBQUksTUFBTSxRQUFRLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7QUFDOUMsSUFBSSxNQUFNLENBQUMsY0FBYyxHQUFHMkMsUUFBTSxHQUFHLFFBQVEsQ0FBQztBQUM5QyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQzVCLElBQUksTUFBTSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7QUFDbkM7QUFDQSxJQUFJLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQzNDLElBQUksTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztBQUNoRjtBQUNBLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3JCO0FBQ0EsSUFBSSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtBQUNsRCxRQUFRLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztBQUN2RCxRQUFRLEtBQUssQ0FBQyxrQkFBa0IsR0FBRztBQUNuQyxZQUFZLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDO0FBQy9HLFlBQVksdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLENBQUM7QUFDL0csU0FBUyxDQUFDO0FBQ1YsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtBQUNsRCxRQUFRLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztBQUN2RCxRQUFRLEtBQUssQ0FBQyxrQkFBa0IsR0FBRztBQUNuQyxZQUFZLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDO0FBQy9HLFlBQVksdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLENBQUM7QUFDL0csU0FBUyxDQUFDO0FBQ1YsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLENBQUMsY0FBYyxHQUFHLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksb0JBQW9CLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3BJLElBQUksS0FBSyxDQUFDLGNBQWMsR0FBRyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNwSSxJQUFJLEtBQUssQ0FBQyxXQUFXLEdBQUcsdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2SDtBQUNBLElBQUksTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEtBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEtBQUssT0FBTyxDQUFDO0FBQ3hILElBQUksTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM3QztBQUNBLElBQUksS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO0FBQzNDLFFBQVEsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0YsUUFBUSxNQUFNLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRixRQUFRLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDckYsUUFBUSxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3JGO0FBQ0EsUUFBUSxNQUFNLHNCQUFzQixHQUFHO0FBQ3ZDLFlBQVksVUFBVSxFQUFFLEVBQUU7QUFDMUIsWUFBWSxRQUFRLEVBQUUsU0FBUztBQUMvQixTQUFTLENBQUM7QUFDVixRQUFRLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7QUFDbEMsUUFBUSxJQUFJLFVBQVUscUJBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xELFFBQVEsSUFBSSxJQUFJLEVBQUU7QUFDbEIsWUFBWSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEQsWUFBWSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3hHLFlBQVksTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN4RyxZQUFZLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUMsZUFBZSxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN4RjtBQUNBLFlBQVksTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRixZQUFZLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzFFO0FBQ0EsWUFBWSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7QUFDckMsZ0JBQWdCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2RztBQUNBO0FBQ0EsZ0JBQWdCLElBQUksWUFBWSxFQUFFO0FBQ2xDO0FBQ0E7QUFDQSxvQkFBb0IsVUFBVSxHQUFHLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksR0FBRyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0FBQ2xILGlCQUFpQixNQUFNO0FBQ3ZCLG9CQUFvQixVQUFVLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ3hILGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQSxZQUFZLElBQUksV0FBVyxHQUFHLGFBQWE7QUFDM0MsZ0JBQWdCLFFBQVE7QUFDeEIsZ0JBQWdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDNUU7QUFDQSxZQUFZLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUNuRSxZQUFZLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxLQUFLLE9BQU8sQ0FBQztBQUNqRSxZQUFZLE1BQU0sUUFBUSxHQUFHLGVBQWUsS0FBSyxPQUFPO0FBQ3hELGdCQUFnQixNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTTtBQUN0RixnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2xCO0FBQ0EsWUFBWSxNQUFNLDBCQUEwQixHQUFHLENBQUMsV0FBVyxLQUFLO0FBQ2hFLGdCQUFnQixJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsSUFBSSx5QkFBeUIsQ0FBQyxlQUFlLENBQUMsRUFBRTtBQUNqRztBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isc0JBQXNCLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVTtBQUMzSixnRUFBZ0UsV0FBVyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixDQUFDLENBQUM7QUFDaE0saUJBQWlCO0FBQ2pCLGFBQWEsQ0FBQztBQUNkO0FBQ0E7QUFDQSxZQUFZLElBQUksQ0FBQyxhQUFhLElBQUksa0JBQWtCLEVBQUU7QUFDdEQsZ0JBQWdCLE1BQU0sY0FBYyxHQUFHLFdBQVcsS0FBSyxNQUFNO0FBQzdELG9CQUFvQixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFFLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2xDO0FBQ0EsZ0JBQWdCLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztBQUN2QyxnQkFBZ0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDaEUsb0JBQW9CLE1BQU0sYUFBYSxnQkFBZ0IsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pFLG9CQUFvQixJQUFJLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxTQUFTO0FBQ25GLG9CQUFvQixJQUFJLFVBQVUsRUFBRTtBQUNwQztBQUNBO0FBQ0Esd0JBQXdCLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEgscUJBQXFCLE1BQU07QUFDM0I7QUFDQTtBQUNBLHdCQUF3QixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVE7QUFDM0ksa0RBQWtELGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3ZMLHdCQUF3QixJQUFJLE9BQU8sRUFBRTtBQUNyQyw0QkFBNEIsc0JBQXNCLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUN2Riw0QkFBNEIsVUFBVSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztBQUM5RSx5QkFBeUI7QUFDekIscUJBQXFCO0FBQ3JCLGlCQUFpQjtBQUNqQjtBQUNBLGdCQUFnQiwwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuRCxhQUFhLE1BQU07QUFDbkIsZ0JBQWdCLElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRTtBQUM1QyxvQkFBb0IsV0FBVyxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3JFLGlCQUFpQjtBQUNqQjtBQUNBLGdCQUFnQixJQUFJLGdCQUFnQixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFO0FBQ3ZKLG9CQUFvQixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCO0FBQ3hLLDRDQUE0QyxVQUFVLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBQ2hKLG9CQUFvQixJQUFJLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQzFGLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsZ0JBQWdCLDBCQUEwQixDQUFDLGVBQWUsS0FBSyxPQUFPLEdBQUcsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDO0FBQy9GLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksVUFBVSxDQUFDO0FBQ3ZCLFFBQVEsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBQzlCLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQy9DLFlBQVksTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEQsWUFBWSxJQUFJLEtBQUssRUFBRTtBQUN2QixnQkFBZ0IsVUFBVSxHQUFHLFNBQVM7QUFDdEMsb0JBQW9CLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztBQUNyRCxvQkFBb0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUM7QUFDOUUsb0JBQW9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUNoRixnQkFBZ0IsU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFDdEMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7QUFDbkQsb0JBQW9CLE1BQU0sQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztBQUNoRCxpQkFBaUIsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLEdBQUcsRUFBRTtBQUMxRCxvQkFBb0IsUUFBUSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7QUFDcEcsaUJBQWlCO0FBQ2pCLGdCQUFnQixJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLFVBQVUsRUFBRTtBQUM1RCxvQkFBb0IsTUFBTSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDbEQsaUJBQWlCLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDMUUsb0JBQW9CLE1BQU0sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBQ2xELGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLFVBQVUsR0FBRywyQkFBMkIsQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxzQkFBc0IsQ0FBQyxRQUFRLENBQUM7QUFDN0gsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtBQUNqQyxZQUFZLE1BQU0sQ0FBQyxXQUFXLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQzdFLFNBQVM7QUFDVCxRQUFRLElBQUksVUFBVSxJQUFJLFVBQVUsRUFBRTtBQUN0QyxZQUFZLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzVMLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksa0JBQWtCLEVBQUU7QUFDNUIsUUFBUSxNQUFNLENBQUMsNkJBQTZCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ2pGLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNPLFNBQVMsc0JBQXNCLENBQUMsTUFBTSw0QkFBNEI7QUFDekUsSUFBSSxRQUFRLE1BQU07QUFDbEIsSUFBSSxLQUFLLE9BQU8sQ0FBQztBQUNqQixJQUFJLEtBQUssV0FBVyxDQUFDO0FBQ3JCLElBQUksS0FBSyxjQUFjO0FBQ3ZCLFFBQVEsT0FBTyxPQUFPLENBQUM7QUFDdkIsSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUNoQixJQUFJLEtBQUssVUFBVSxDQUFDO0FBQ3BCLElBQUksS0FBSyxhQUFhO0FBQ3RCLFFBQVEsT0FBTyxNQUFNLENBQUM7QUFDdEIsS0FBSztBQUNMLElBQUksT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFVBQVUsQ0FBQyxNQUFNO0FBQzFCLG9CQUFvQixPQUFPO0FBQzNCLG9CQUFvQixzQkFBc0I7QUFDMUMsb0JBQW9CLFVBQVU7QUFDOUIsb0JBQW9CLFFBQVE7QUFDNUIsb0JBQW9CLEtBQUs7QUFDekIsb0JBQW9CLGNBQWM7QUFDbEMsb0JBQW9CLGNBQWM7QUFDbEMsb0JBQW9CLFVBQVU7QUFDOUIsb0JBQW9CLFNBQVM7QUFDN0Isb0JBQW9CLGVBQWU7QUFDbkMsb0JBQW9CLFNBQVM7QUFDN0Isb0JBQW9CLFVBQVUsY0FBYztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN6RSxJQUFJLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtBQUNuQyxRQUFRLFdBQVcsR0FBRyxjQUFjLENBQUM7QUFDckMsS0FBSztBQUNMLElBQUksTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDM0MsSUFBSSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2xGLElBQUksTUFBTSxjQUFjLEdBQUcsMkJBQTJCLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLElBQUksc0JBQXNCLENBQUMsUUFBUSxDQUFDO0FBQzdILElBQUksTUFBTSxTQUFTLEdBQUcsTUFBTTtBQUM1QixRQUFRLFNBQVMsR0FBRyxjQUFjLEdBQUcsU0FBUztBQUM5QyxRQUFRLGVBQWUsR0FBRyxNQUFNLENBQUMsY0FBYyxHQUFHLFdBQVcsR0FBRyxTQUFTO0FBQ3pFLFFBQVEsWUFBWSxHQUFHLE1BQU0sQ0FBQyxjQUFjLEdBQUcsY0FBYztBQUM3RCxRQUFRLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztBQUNoRixRQUFRLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxjQUFjO0FBQ3hFLFFBQVEsV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsTUFBTSxDQUFDLGNBQWM7QUFDeEUsUUFBUSxZQUFZLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUM3RCxRQUFRLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLEtBQUssS0FBSyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsS0FBSyxPQUFPO0FBQ3JILFFBQVEsYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLE9BQU87QUFDckgsUUFBUSxlQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztBQUN4RCxRQUFRLGtCQUFrQixHQUFHLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUNuRDtBQUNBLElBQUksTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNwRCxJQUFJLElBQUksb0JBQW9CLENBQUM7QUFDN0I7QUFDQTtBQUNBLElBQUksSUFBSSxVQUFVLElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRTtBQUM5QyxRQUFRLElBQUksTUFBTSxDQUFDLHNCQUFzQixJQUFJLHNCQUFzQixDQUFDLFFBQVEsRUFBRTtBQUM5RSxZQUFZLG9CQUFvQixHQUFHLGFBQWEsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsUUFBUSxFQUFFLFdBQVc7QUFDekcsZ0JBQWdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDNUUsU0FBUztBQUNULFFBQVEsSUFBSSxjQUFjLEVBQUU7QUFDNUIsWUFBWSxVQUFVLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUUsV0FBVztBQUM5RSx1Q0FBdUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLGlCQUFpQixHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEtBQUs7QUFDN0QsUUFBUSxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLElBQUlBLFFBQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJQSxRQUFNLEVBQUU7QUFDdEY7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CLFNBQVM7QUFDVDtBQUNBLFFBQVEsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN2RixRQUFRLE1BQU0sZUFBZSxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNsRTtBQUNBLFFBQVEsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzdJLFlBQVksTUFBTSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtBQUM3RSxZQUFZLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxVQUFVO0FBQ2hFLFlBQVksWUFBWSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsVUFBVTtBQUNoRSxZQUFZLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRSxLQUFLLENBQUM7QUFDTjtBQUNBLElBQUksSUFBSSxlQUFlLEtBQUssTUFBTSxFQUFFO0FBQ3BDLFFBQVEsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFQSxRQUFNLEVBQUVBLFFBQU0sQ0FBQyxFQUFFO0FBQzdFLFlBQVksTUFBTSxPQUFPLEdBQUcsVUFBVTtBQUN0QyxnQkFBZ0IsSUFBSTtBQUNwQixnQkFBZ0IsaUJBQWlCO0FBQ2pDLGdCQUFnQixZQUFZO0FBQzVCLGdCQUFnQixzQkFBc0IsQ0FBQyxRQUFRLElBQUksY0FBYztBQUNqRSxnQkFBZ0IsVUFBVTtBQUMxQixnQkFBZ0IsU0FBUztBQUN6QixnQkFBZ0IsZUFBZTtBQUMvQixnQkFBZ0IsTUFBTSxDQUFDLFdBQVc7QUFDbEMsZ0JBQWdCQSxRQUFNO0FBQ3RCLGFBQWEsQ0FBQztBQUNkLFlBQVksS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7QUFDMUMsZ0JBQWdCLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQztBQUNsRCxnQkFBZ0IsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxFQUFFO0FBQzNHLG9CQUFvQixpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9ELGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUssTUFBTSxJQUFJLGVBQWUsS0FBSyxhQUFhLEVBQUU7QUFDbEQ7QUFDQTtBQUNBLFFBQVEsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO0FBQzdDLFlBQVksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNqQyxnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsZUFBZTtBQUM5QyxvQkFBb0IsSUFBSTtBQUN4QixvQkFBb0IsWUFBWTtBQUNoQyxvQkFBb0Isc0JBQXNCLENBQUMsUUFBUSxJQUFJLGNBQWM7QUFDckUsb0JBQW9CLFVBQVU7QUFDOUIsb0JBQW9CLFNBQVM7QUFDN0Isb0JBQW9CLGVBQWUsQ0FBQyxDQUFDO0FBQ3JDLGdCQUFnQixJQUFJLE1BQU0sRUFBRTtBQUM1QixvQkFBb0IsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMvRCxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUMzQyxRQUFRLEtBQUssTUFBTSxPQUFPLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDbEU7QUFDQSxZQUFZLE1BQU0sR0FBRyxHQUFHLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvRCxZQUFZLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNoRyxTQUFTO0FBQ1QsS0FBSyxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUU7QUFDOUM7QUFDQSxRQUFRLEtBQUssTUFBTSxJQUFJLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtBQUM3QyxZQUFZLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNsRyxTQUFTO0FBQ1QsS0FBSyxNQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7QUFDekMsUUFBUSxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7QUFDL0MsWUFBWSxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtBQUN4QyxnQkFBZ0IsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRyxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUNoQyxNQUFNLGVBQWUsR0FBRyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUUvRDtBQUNBLFNBQVMsZUFBZSxDQUFDLE1BQU07QUFDL0IseUJBQXlCLE1BQU07QUFDL0IseUJBQXlCLFVBQVU7QUFDbkMseUJBQXlCLFVBQVU7QUFDbkMseUJBQXlCLFFBQVE7QUFDakMseUJBQXlCLEtBQUs7QUFDOUIseUJBQXlCLGFBQWE7QUFDdEMseUJBQXlCLE9BQU87QUFDaEMseUJBQXlCLFVBQVU7QUFDbkMseUJBQXlCLFNBQVM7QUFDbEMseUJBQXlCLFdBQVc7QUFDcEMseUJBQXlCLGNBQWM7QUFDdkMseUJBQXlCLHVCQUF1QjtBQUNoRCx5QkFBeUIsZUFBZTtBQUN4Qyx5QkFBeUIsS0FBSztBQUM5Qix5QkFBeUIsZUFBZTtBQUN4Qyx5QkFBeUIsU0FBUyxtQkFBbUI7QUFDckQsSUFBSSxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxVQUFVO0FBQ25FLDRCQUE0QixLQUFLLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDcEc7QUFDQSxJQUFJLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7QUFDekMsSUFBSSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDNUI7QUFDQSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7QUFDcEMsUUFBUSxZQUFZLEdBQUc7QUFDdkIsWUFBWSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUM7QUFDN0YsU0FBUyxDQUFDO0FBQ1YsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLEVBQUU7QUFDL0MsWUFBWSxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsOEJBQThCLEVBQUUsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0FBQzVILFNBQVM7QUFDVCxLQUFLLE1BQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtBQUM5QyxRQUFRLFlBQVksR0FBRztBQUN2QixZQUFZLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUM7QUFDM0YsWUFBWSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDO0FBQzNGLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLEVBQUU7QUFDcEYsWUFBWSxRQUFRLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsOEJBQThCLEVBQUUsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO0FBQzVILFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sQ0FBQyxVQUFVO0FBQ3JCLFFBQVEsTUFBTSxDQUFDLElBQUk7QUFDbkIsUUFBUSxVQUFVO0FBQ2xCLFFBQVEsWUFBWTtBQUNwQixRQUFRLFVBQVU7QUFDbEIsUUFBUSxhQUFhO0FBQ3JCLFFBQVEsT0FBTztBQUNmLFFBQVEsV0FBVztBQUNuQixRQUFRLE1BQU07QUFDZCxRQUFRLFVBQVU7QUFDbEIsUUFBUSxTQUFTLENBQUMsY0FBYztBQUNoQyxRQUFRLFNBQVMsQ0FBQyxVQUFVO0FBQzVCLFFBQVEsZUFBZTtBQUN2QixRQUFRLGVBQWU7QUFDdkIsUUFBUSxTQUFTLENBQUMsQ0FBQztBQUNuQjtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssTUFBTSxhQUFhLElBQUksY0FBYyxFQUFFO0FBQ2hELFFBQVEsdUJBQXVCLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzFGLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLDJCQUEyQixDQUFDLGlCQUFpQiwrQ0FBK0M7QUFDckc7QUFDQTtBQUNBLElBQUksS0FBSyxNQUFNLGFBQWEsU0FBUyxpQkFBaUIsRUFBRTtBQUN4RCxRQUFRLE9BQU8saUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDaEQsS0FBSztBQUNMLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ08sU0FBUywyQkFBMkIsQ0FBQyxpQkFBaUI7QUFDN0QscUNBQXFDLGVBQWU7QUFDcEQscUNBQXFDLFVBQVU7QUFDL0MscUNBQXFDLFlBQVk7QUFDakQscUNBQXFDLGdCQUFnQjtBQUNyRCxxQ0FBcUMsV0FBVztBQUNoRCxxQ0FBcUMsTUFBTTtBQUMzQyxxQ0FBcUMsT0FBTztBQUM1QyxxQ0FBcUMsTUFBTTtBQUMzQyxxQ0FBcUMsVUFBVSw2QkFBNkI7QUFDNUUsSUFBSSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0FBQ3hCLElBQUksSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUMzQixJQUFJLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDekIsSUFBSSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0FBQzFCO0FBQ0EsSUFBSSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztBQUNyRCxJQUFJLElBQUksZ0JBQWdCLEVBQUU7QUFDMUIsUUFBUSxFQUFFLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBUSxFQUFFLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBUSxFQUFFLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEMsUUFBUSxFQUFFLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEMsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLE1BQU0sRUFBRTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSTNDLGFBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDckMsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJQSxhQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSUEsYUFBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyQyxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUlBLGFBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDckM7QUFDQSxRQUFRLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQyxRQUFRLElBQUksWUFBWSxHQUFHLElBQUlBLGFBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0M7QUFDQSxRQUFRLElBQUksVUFBVSxFQUFFO0FBQ3hCLFlBQVksWUFBWSxHQUFHLElBQUlBLGFBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsU0FBUztBQUNUO0FBQ0EsUUFBUSxFQUFFLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN0RCxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RELFFBQVEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDdEQsUUFBUSxFQUFFLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlDLEtBQUs7QUFDTDtBQUNBLElBQUksaUJBQWlCLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsQ0FB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QUFNLGdCQUFnQixTQUFTLFVBQVUsQ0FBQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLEtBQUssc0JBQXNCO0FBQzNDLFFBQVEsS0FBSyxDQUFDLEtBQUssRUFBRUMsWUFBVSxDQUFDLENBQUM7QUFDakMsS0FBSztBQUNMO0FBQ0EsSUFBSSxhQUFhLEdBQUc7QUFDcEIsUUFBUSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUIsS0FBSztBQUNMOztBQ3RCQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QyxFQUFFLENBQUMsRUFBRTtBQUM5QjtBQUNBLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQztBQUNBLElBQUksSUFBSSxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDaEQsUUFBUSxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RDtBQUNBLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25FLFFBQVEsTUFBTSxJQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUNoRSxRQUFRLE1BQU0sSUFBSSxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNqRTtBQUNBLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM1Qjs7QUM3RUE7QUFLQTtBQUNPLE1BQU0sZUFBZSxDQUFDO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVTtBQUNqRCxRQUFRN0csUUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2xDLFFBQVFBLFFBQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdDLFFBQVFBLFFBQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdDLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQixRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLFFBQVEsSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9DLEtBQUs7QUFDTDtBQUNBLElBQUksTUFBTSxDQUFDLEVBQUUsbUJBQW1CO0FBQ2hDLFFBQVEsT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyRSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksR0FBRyxDQUFDLElBQUksaUJBQWlCLE1BQU0sV0FBVztBQUM5QyxRQUFRLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pELFFBQVEsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0Q7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDcEQsYUFBYSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pGLGFBQWEsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLGFBQWEsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLGFBQWEsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25HLGFBQWEsT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUM7QUFDMUMsYUFBYSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0MsS0FBSztBQUNMO0FBQ0EsSUFBSSxRQUFRLEdBQUc7QUFDZixRQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9DLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxNQUFNLGVBQWUsQ0FBQztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLElBQUksVUFBVSxTQUFTLG1CQUFtQjtBQUMxRCxRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDbkMsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFGLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxNQUFNLGdCQUFnQixDQUFDO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLFdBQVcsVUFBVSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVU7QUFDcEYsUUFBUUEsUUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELFFBQVEsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLFdBQVcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNuSCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sQ0FBQyxFQUFFLG9CQUFvQjtBQUNqQyxRQUFRLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxFQUFFLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDbkgsS0FBSztBQUNMO0FBQ0EsSUFBSSxRQUFRLENBQUMsT0FBTyxVQUFVO0FBQzlCLFFBQVFBLFFBQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzVDLFFBQVEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3ZELFFBQVEsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7QUFDeEMsWUFBWSxPQUFPLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsSCxTQUFTLE1BQU07QUFDZixZQUFZLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxDQUFDO0FBQ3ZJLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLFVBQVUsUUFBUSxZQUFZLElBQUksVUFBVTtBQUMxRSxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxPQUFPLElBQUksUUFBUSxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUN0RSxRQUFRLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFO0FBQ3hDLFlBQVksT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0SCxTQUFTLE1BQU07QUFDZixZQUFZLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUMzRCxZQUFZLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUM7QUFDM0ksU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxDQUFDLE1BQU0sb0JBQW9CO0FBQ3hDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDdkM7QUFDQSxZQUFZLE9BQU8sS0FBSyxDQUFDO0FBQ3pCLFNBQVM7QUFDVCxRQUFRLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ2xFO0FBQ0EsUUFBUSxPQUFPLE1BQU0sQ0FBQyxXQUFXLEtBQUssQ0FBQztBQUN2QyxZQUFZLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVc7QUFDakQsZ0JBQWdCLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLFdBQVcsQ0FBQztBQUN4RSxnQkFBZ0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQztBQUMxRSxLQUFLO0FBQ0w7QUFDQSxJQUFJLFFBQVEsQ0FBQyxhQUFhLFVBQVU7QUFDcEMsUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksYUFBYSxFQUFFO0FBQy9DO0FBQ0EsWUFBWSxPQUFPLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqSSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QyxRQUFRLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QyxRQUFRLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QyxRQUFRLE9BQU87QUFDZixZQUFZLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkQsWUFBWSxJQUFJLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzRCxZQUFZLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNELFlBQVksSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9ELFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTDtBQUNBLElBQUksVUFBVSxDQUFDLEdBQUcsb0JBQW9CO0FBQ3RDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDOUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLEtBQUssQ0FBQztBQUMvQztBQUNBLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDNUQsUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM3RDtBQUNBLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQztBQUM1RCxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDN0Q7QUFDQSxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDNUQsUUFBUSxPQUFPLEtBQUssQ0FBQztBQUNyQixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sR0FBRztBQUNkLFFBQVEsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0csS0FBSztBQUNMO0FBQ0EsSUFBSSxRQUFRLENBQUMsSUFBSSxVQUFVO0FBQzNCLFFBQVEsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEgsS0FBSztBQUNMO0FBQ0EsSUFBSSxlQUFlLEdBQUc7QUFDdEIsUUFBUSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRSxLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsR0FBRztBQUNsQixRQUFRLE9BQU8sSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDOUQsS0FBSztBQUNMO0FBQ0EsSUFBSSxRQUFRLEdBQUc7QUFDZixRQUFRLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0UsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLFNBQVMsWUFBWSxDQUFDLElBQUksVUFBVSxXQUFXLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGtCQUFrQjtBQUNsRztBQUNBLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekM7QUFDQTtBQUNBLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRTtBQUN4QixRQUFRLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0MsUUFBUSxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN6RCxJQUFJQSxRQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDdkQ7QUFDQSxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsSUFBSSxJQUFJLE9BQU8sR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDO0FBQzNCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoQyxRQUFRLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVCLFFBQVEsT0FBTyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0QsS0FBSztBQUNMLElBQUksT0FBTyxPQUFPLENBQUM7QUFDbkIsQ0FBQztBQUNEO0FBQ0EsUUFBUSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzdDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7O0FDbE10RTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLFdBQVcsQ0FBQztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLE9BQU8sV0FBVyxLQUFLLDZEQUE2RCxXQUFXLFlBQVk7QUFDM0gsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMvQixRQUFRLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDOUIsUUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUN4QyxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ2pDO0FBQ0EsUUFBUSxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuRCxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN2SDtBQUNBLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDL0IsWUFBWSxPQUFPLEtBQUssQ0FBQyxXQUFXLENBQUM7QUFDckMsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxHQUFHO0FBQ1gsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDeEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxVQUFVLENBQUMsS0FBSyxlQUFlO0FBQ25DLFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDbkMsUUFBUUEsUUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNqQztBQUNBO0FBQ0EsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3BCLFFBQVEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN4RSxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sR0FBRztBQUNkLFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDbkMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7QUFDekIsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QyxZQUFZLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUMvQixTQUFTO0FBQ1QsS0FBSztBQUNMOztBQ3BEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGFBQWEsR0FBRztBQUN0QixJQUFJLElBQUksSUFBSSxNQUFNO0FBQ2xCLElBQUksS0FBSyxHQUFHLGVBQWU7QUFDM0IsSUFBSSxLQUFLLEdBQUcsT0FBTztBQUNuQixJQUFJLE1BQU0sRUFBRSxnQkFBZ0I7QUFDNUIsSUFBSSxLQUFLLEdBQUcsS0FBSztBQUNqQixJQUFJLE1BQU0sRUFBRSxjQUFjO0FBQzFCLElBQUksT0FBTyxFQUFFLE9BQU87QUFDcEIsQ0FBQyxDQUFDO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxZQUFZLENBQUM7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLE9BQU8sV0FBVyxLQUFLLGVBQWUsVUFBVSxxQ0FBcUMsV0FBVyxZQUFZO0FBQzVILFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ25DLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDckMsUUFBUSxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7QUFDOUMsUUFBUSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztBQUN2QztBQUNBLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDL0IsUUFBUSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQzlCLFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDeEMsUUFBUSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNsRCxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDL0c7QUFDQSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQy9CLFlBQVksT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDO0FBQ3JDLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksR0FBRztBQUNYLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZELEtBQUs7QUFDTDtBQUNBLElBQUksVUFBVSxDQUFDLEtBQUssZUFBZTtBQUNuQyxRQUFRQSxRQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0MsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNwQixRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ2hFLEtBQUs7QUFDTDtBQUNBLElBQUksZ0JBQWdCLENBQUMsRUFBRSx5QkFBeUIsT0FBTyxjQUFjO0FBQ3JFLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3pELFlBQVksTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QyxZQUFZLE1BQU0sV0FBVyxrQkFBa0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0UsWUFBWSxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7QUFDM0MsZ0JBQWdCLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN4RCxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksdUJBQXVCLENBQUMsRUFBRSx5QkFBeUIsT0FBTyxjQUFjLFlBQVksV0FBVztBQUNuRyxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6RCxZQUFZLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUMsWUFBWSxNQUFNLFdBQVcsa0JBQWtCLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9FO0FBQ0EsWUFBWSxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7QUFDM0MsZ0JBQWdCLEVBQUUsQ0FBQyxtQkFBbUI7QUFDdEMsb0JBQW9CLFdBQVc7QUFDL0Isb0JBQW9CLE1BQU0sQ0FBQyxVQUFVO0FBQ3JDLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pELG9CQUFvQixLQUFLO0FBQ3pCLG9CQUFvQixJQUFJLENBQUMsUUFBUTtBQUNqQyxvQkFBb0IsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN6RSxpQkFBaUIsQ0FBQztBQUNsQixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksT0FBTyxHQUFHO0FBQ2QsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUNuQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUN6QixZQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDLFlBQVksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQy9CLFNBQVM7QUFDVCxLQUFLO0FBQ0w7O0FDcEhBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sU0FBUyx3QkFBd0I7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLE9BQU8sV0FBVztBQUNsQyxRQUFRLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUM3QixRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3pDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsS0FBSztBQUNMO0FBQ0EsSUFBSSxHQUFHLE1BQU07QUFDYixRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUM1QixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLO0FBQ2xCO0FBQ0EsS0FBSztBQUNMO0FBQ0EsSUFBSSxVQUFVLE1BQU07QUFDcEIsUUFBUSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDNUIsS0FBSztBQUNMLElBQUksVUFBVSxHQUFHO0FBQ2pCLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0IsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0sVUFBVSxTQUFTLFNBQVMsUUFBUTtBQUNqRCxJQUFJLFVBQVUsVUFBVTtBQUN4QixRQUFRLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQztBQUNqQyxLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTO0FBQ2xCLFFBQVEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMvQixRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQzVGLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9DLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxVQUFVLFNBQVMsU0FBUyxTQUFTO0FBQ2xELElBQUksVUFBVSxXQUFXO0FBQ3pCLFFBQVEsT0FBTyxDQUFDLENBQUM7QUFDakIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVTtBQUNuQixRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87QUFDdEQsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0sWUFBWSxTQUFTLFNBQVMsU0FBUztBQUNwRCxJQUFJLFVBQVUsV0FBVztBQUN6QixRQUFRLE9BQU8sQ0FBQyxDQUFDO0FBQ2pCLEtBQUs7QUFDTCxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVU7QUFDbkIsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ3RELFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxNQUFNLFNBQVMsU0FBUyxTQUFTLGdCQUFnQjtBQUN4RCxJQUFJLFVBQVUsa0JBQWtCO0FBQ2hDLFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hDLEtBQUs7QUFDTCxJQUFJLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQjtBQUMxQixRQUFRLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDL0IsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87QUFDcEcsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0sU0FBUyxTQUFTLFNBQVMsZ0JBQWdCO0FBQ3hELElBQUksVUFBVSxrQkFBa0I7QUFDaEMsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyx1QkFBdUI7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ3RELFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxNQUFNLFdBQVcsU0FBUyxTQUFTLFNBQVM7QUFDbkQsSUFBSSxVQUFVLFdBQVc7QUFDekIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0I7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ3RELFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxNQUFNLFdBQVcsU0FBUyxTQUFTLGtCQUFrQjtBQUM1RCxJQUFJLFVBQVUsb0JBQW9CO0FBQ2xDLFFBQVEsT0FBTztBQUNmLFlBQVksSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTTtBQUNoQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFlBQVksSUFBSSxFQUFFLElBQUk7QUFDdEIsU0FBUyxDQUFDO0FBQ1YsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMseUJBQXlCO0FBQ2xDLFFBQVEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMvQixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87QUFDN0Y7QUFDQTtBQUNBLFFBQVFBLFFBQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzNDLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuRCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0sU0FBUyxTQUFTLFNBQVMsZ0JBQWdCO0FBQ3hELElBQUksVUFBVSxrQkFBa0I7QUFDaEMsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzNCLFFBQVEsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0MsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsaUJBQWlCO0FBQzFCLFFBQVEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMvQixRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87QUFDbkYsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxXQUFXLFNBQVMsU0FBUyxVQUFVO0FBQ3BELElBQUksVUFBVSxZQUFZO0FBQzFCLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVztBQUNwQixRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87QUFDdEQsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzNCLFFBQVEsSUFBSSxDQUFDLEVBQUU7QUFDZixZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3ZDLFNBQVMsTUFBTTtBQUNmLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDeEMsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxVQUFVLFNBQVMsU0FBUyxpQkFBaUI7QUFDMUQsSUFBSSxVQUFVLG1CQUFtQjtBQUNqQyxRQUFRLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsa0JBQWtCO0FBQzNCLFFBQVEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMvQixRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ2xFLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxTQUFTLFNBQVMsU0FBUyxVQUFVO0FBQ2xELElBQUksVUFBVSxZQUFZO0FBQzFCLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVztBQUNwQixRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87QUFDdEQsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzNCLFFBQVEsSUFBSSxDQUFDLEVBQUU7QUFDZixZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3JDLFNBQVMsTUFBTTtBQUNmLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdEMsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxTQUFTLFNBQVMsU0FBUyxnQkFBZ0I7QUFDeEQsSUFBSSxVQUFVLGtCQUFrQjtBQUNoQyxRQUFRLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7QUFDNUIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsaUJBQWlCO0FBQzFCLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTztBQUN0RCxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxLQUFLLFNBQVMsU0FBUyxVQUFVO0FBQzlDLElBQUksVUFBVSxZQUFZO0FBQzFCLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVztBQUNwQixRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87QUFDdEQsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzNCLFFBQVEsSUFBSSxDQUFDLEVBQUU7QUFDZixZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLFNBQVMsTUFBTTtBQUNmLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakMsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxTQUFTLFNBQVMsU0FBUyxnQkFBZ0I7QUFDeEQsSUFBSSxVQUFVLGtCQUFrQjtBQUNoQyxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDM0IsUUFBUSxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsaUJBQWlCO0FBQzFCLFFBQVEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMvQixRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ2xFLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxVQUFVLFNBQVMsU0FBUyxRQUFRO0FBQ2pELElBQUksVUFBVSxVQUFVO0FBQ3hCLFFBQVEsT0FBTyxLQUFLLENBQUMsV0FBVyxDQUFDO0FBQ2pDLEtBQUs7QUFDTCxJQUFJLEdBQUcsQ0FBQyxDQUFDLFNBQVM7QUFDbEIsUUFBUSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQy9CLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87QUFDNUYsUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxNQUFNLGFBQWEsU0FBUyxTQUFTLG9CQUFvQjtBQUNoRSxJQUFJLFVBQVUsc0JBQXNCO0FBQ3BDLFFBQVEsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQztBQUNoQyxLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxxQkFBcUI7QUFDOUIsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ3RELFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxNQUFNLFFBQVEsU0FBUyxTQUFTLFVBQVU7QUFDakQsSUFBSSxVQUFVLFlBQVk7QUFDMUIsUUFBUSxPQUFPLEtBQUssQ0FBQztBQUNyQixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXO0FBQ3BCLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTztBQUN0RCxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDM0IsUUFBUSxJQUFJLENBQUMsRUFBRTtBQUNmLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDcEMsU0FBUyxNQUFNO0FBQ2YsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyQyxTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxNQUFNLFlBQVksU0FBUyxTQUFTLG1CQUFtQjtBQUM5RCxJQUFJLFVBQVUscUJBQXFCO0FBQ25DLFFBQVEsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztBQUM1QixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxvQkFBb0I7QUFDN0IsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ3RELFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxNQUFNLFNBQVMsU0FBUyxTQUFTLGdCQUFnQjtBQUN4RCxJQUFJLFVBQVUsa0JBQWtCO0FBQ2hDLFFBQVEsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztBQUMzQixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxpQkFBaUI7QUFDMUIsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ3RELFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxNQUFNLE9BQU8sU0FBUyxTQUFTLGdCQUFnQjtBQUN0RCxJQUFJLFVBQVUsaUJBQWlCO0FBQy9CLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsaUJBQWlCO0FBQzFCLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTztBQUN0RCxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxpQkFBaUIsU0FBUyxTQUFTLGtCQUFrQjtBQUNsRSxJQUFJLFVBQVUsb0JBQW9CO0FBQ2xDLFFBQVEsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQztBQUNoQyxLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxtQkFBbUI7QUFDNUIsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ3RELFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxNQUFNLFFBQVEsU0FBUyxTQUFTLGVBQWU7QUFDdEQsSUFBSSxVQUFVLGlCQUFpQjtBQUMvQixRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDM0IsUUFBUSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDckUsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsZ0JBQWdCO0FBQ3pCLFFBQVEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUMvQixRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTztBQUNwRyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pELFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxlQUFlLFNBQVMsU0FBUyxvQkFBb0I7QUFDbEUsSUFBSSxVQUFVLHFCQUFxQjtBQUNuQyxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTCxJQUFJLEdBQUcsQ0FBQyxDQUFDLHFCQUFxQjtBQUM5QixRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87QUFDdEQsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzNCLFFBQVEsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzlDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxnQkFBZ0IsU0FBUyxTQUFTLHFCQUFxQjtBQUNwRSxJQUFJLFVBQVUsc0JBQXNCO0FBQ3BDLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsc0JBQXNCO0FBQy9CLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTztBQUN0RCxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDM0IsUUFBUSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoRCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0sV0FBVyxTQUFTLFNBQVMsZ0JBQWdCO0FBQzFELElBQUksVUFBVSxpQkFBaUI7QUFDL0IsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxpQkFBaUI7QUFDMUIsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ3RELFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUMzQixRQUFRLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QyxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0sZ0JBQWdCLFNBQVMsU0FBUyxlQUFlO0FBQzlELElBQUksVUFBVSxnQkFBZ0I7QUFDOUIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0I7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ3RELFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUMzQixRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0saUJBQWlCLFNBQVMsU0FBUyxlQUFlO0FBQy9ELElBQUksVUFBVSxnQkFBZ0I7QUFDOUIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxnQkFBZ0I7QUFDekI7QUFDQSxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDM0IsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0sa0JBQWtCLFNBQVMsU0FBUyxNQUFNO0FBQ3ZEO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxPQUFPLFdBQVc7QUFDbEMsUUFBUSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkIsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztBQUNoRCxLQUFLO0FBQ0wsSUFBSSxVQUFVLFFBQVE7QUFDdEIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPO0FBQ2hCLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU87QUFDbkUsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxnQkFBZ0IsU0FBUyxTQUFTLFNBQVM7QUFDeEQsSUFBSSxVQUFVLFdBQVc7QUFDekIsUUFBUSxPQUFPLENBQUMsQ0FBQztBQUNqQixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVO0FBQ25CLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTztBQUN0RCxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDM0IsUUFBUSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQyxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0sZ0NBQWdDLFNBQVMsU0FBUyxVQUFVO0FBQ3pFLElBQUksVUFBVSxZQUFZO0FBQzFCLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsaUJBQWlCO0FBQzFCLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTztBQUN0RCxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDM0IsUUFBUSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyw4QkFBOEIsR0FBRyxDQUFDLE9BQU8sQ0FBQztBQUNwRSxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0scUJBQXFCLFNBQVMsU0FBUyxVQUFVO0FBQzlELElBQUksVUFBVSxZQUFZO0FBQzFCLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMLElBQUksR0FBRyxDQUFDLENBQUMsaUJBQWlCO0FBQzFCLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTztBQUN0RCxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDM0IsUUFBUSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLE9BQU8sQ0FBQztBQUN6RCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLE1BQU0scUJBQXFCLFlBQVksU0FBUyxLQUFLO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLE9BQU8sV0FBVyxNQUFNLG9CQUFvQjtBQUM1RCxRQUFRLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2QixRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQy9CLFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDN0IsS0FBSztBQUNMLElBQUksVUFBVSxHQUFHO0FBQ2pCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0sZUFBZSxTQUFTLHFCQUFxQixlQUFlO0FBQ3pFLElBQUksUUFBUSxHQUFHO0FBQ2YsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUMxQixLQUFLO0FBQ0wsSUFBSSxHQUFHLENBQUMsQ0FBQyx1QkFBdUI7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0FBQ3RELFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN0RDtBQUNBO0FBQ0EsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQzNCLFFBQVEsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNGLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxlQUFlLFNBQVMscUJBQXFCLG9CQUFvQjtBQUM5RSxJQUFJLFVBQVUsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO0FBQzdELElBQUksR0FBRyxDQUFDLENBQUMsNEJBQTRCO0FBQ3JDLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTztBQUN0RCxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEQ7QUFDQTtBQUNBLFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUMzQixRQUFRLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFGLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ08sTUFBTSxzQkFBc0IsU0FBUyxlQUFlLENBQUM7QUFDNUQsSUFBSSxVQUFVLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRTtBQUNyRTs7QUNoaEJBO0FBS0E7QUFDQSxNQUFNLFdBQVcsQ0FBQztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLE9BQU8sV0FBVyxLQUFLLFVBQVUsTUFBTSxVQUFVLFFBQVEsV0FBVztBQUNwRixRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQy9CLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDM0IsUUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM3QixRQUFRLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDOUIsUUFBUSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0FBQzlEO0FBQ0EsUUFBUSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNqRSxRQUFRLElBQUksUUFBUSxFQUFFO0FBQ3RCLFlBQVksSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckUsU0FBUztBQUNULFFBQVFBLFFBQU0sQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3RGLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxHQUFHO0FBQ2QsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUNuQztBQUNBLFFBQVEsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuRCxRQUFRLElBQUksT0FBTyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0M7QUFDQSxRQUFRLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtBQUNsQyxZQUFZLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDNUQsWUFBWSxJQUFJLFlBQVksRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbEUsU0FBUztBQUNUO0FBQ0EsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQy9DLEtBQUs7QUFDTDs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3RCO0FBQ0EsTUFBTSxTQUFTLENBQUM7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLFNBQVMsaUJBQWlCLFNBQVMsaUJBQWlCLFVBQVUsa0JBQWtCO0FBQ2hHLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7QUFDOUIsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztBQUM5QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO0FBQ2hDLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsU0FBUyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDM0IsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDM0I7QUFDQSxTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztBQzFCdEU7QUFDQTtBQUNBO0FBQ0EsTUFBTThHLFFBQU0sR0FBRyxNQUFNLENBQUM7QUFDdEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBQ3BCO0FBQ0EsTUFBTSxXQUFXLENBQUM7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxJQUFJLGVBQWUsR0FBRyxVQUFVLElBQUksVUFBVSxJQUFJO0FBQ2xFLFFBQVEsU0FBUyxxQkFBcUIsSUFBSSxxQkFBcUI7QUFDL0QsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3ZCLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0FBQ25DLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekIsS0FBSztBQUNMO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxXQUFXLENBQUMsUUFBUSxHQUFHLElBQUksV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFFQSxRQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7O0FDM0J2RjtBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUNwQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUM7QUFDbkIsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUM7QUFDbkM7QUFDQSxNQUFNLFNBQVMsQ0FBQztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLGFBQWEsaUJBQWlCLFVBQVUsU0FBUyxJQUFJLGlCQUFpQjtBQUN0RixRQUFRLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQzNDLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDckMsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6QixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoQztBQUNBLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN2RyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDcEcsU0FBUyxDQUFDLFlBQVksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzs7QUMvQi9HO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBQ3BCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQztBQUNyQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUM7QUFDbkIsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBQ2xCO0FBQ0EsTUFBTSxZQUFZLENBQUM7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxNQUFNLFdBQVcsSUFBSSxvQkFBb0IsU0FBUyxpQkFBaUI7QUFDbkYsUUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM3QixRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDbkMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzRCxZQUFZLENBQUMsT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDekQsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6RCxZQUFZLENBQUMsUUFBUSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDOztBQy9CMUQ7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxPQUFPLENBQUM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxFQUFFLHlCQUF5QjtBQUMzQyxRQUFRLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3JCLFFBQVEsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDcEY7QUFDQSxRQUFRLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsUUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9DLFFBQVEsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuRCxRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0MsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRCxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakQsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRCxRQUFRLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0MsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLFFBQVEsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsUUFBUSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQyxRQUFRLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckQsUUFBUSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNDLFFBQVEsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuRCxRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0MsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pDLFFBQVEsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pELFFBQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzQyxRQUFRLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekQsUUFBUSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzRCxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakQsUUFBUSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzRCxRQUFRLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdELFFBQVEsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVGLFFBQVEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0QsUUFBUSxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMzRixRQUFRLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JFO0FBQ0EsUUFBUSxJQUFJLENBQUMsMkJBQTJCO0FBQ3hDLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQyxnQ0FBZ0MsQ0FBQztBQUM3RCxZQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUMsb0NBQW9DLENBQUM7QUFDakUsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLHVDQUF1QyxDQUFDO0FBQ3BFLFNBQVMsQ0FBQztBQUNWLFFBQVEsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEVBQUU7QUFDOUMsWUFBWSxJQUFJLENBQUMsOEJBQThCLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUNuSSxTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsbUNBQW1DLEdBQUcsS0FBSyxDQUFDO0FBQ3pEO0FBQ0EsUUFBUSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQzdFLFFBQVEsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7QUFDdEMsWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFDN0QsWUFBWSxJQUFJLENBQUMsMkJBQTJCLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBQzlGLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFDekUsUUFBUSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDbkUsS0FBSztBQUNMO0FBQ0EsSUFBSSxVQUFVLEdBQUc7QUFDakIsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDekI7QUFDQSxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDckMsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3JDLFFBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUN2QyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDcEMsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUN0QyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDdEMsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUN0QyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDckMsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNyQyxRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDeEMsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ25DLFFBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUN2QyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDcEMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUN4QyxRQUFRLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDMUMsUUFBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDM0MsUUFBUSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDM0QsUUFBUSxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDaEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxRQUFRLEdBQUc7QUFDZixRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNyQyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNyQyxRQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN2QyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN0QyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN0QyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN0QyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNyQyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxH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QUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzlDLElBQUksTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzlDLElBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFDeEQ7QUFDQSxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLO0FBQzdCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEI7QUFDQSxJQUFJLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDN0IsSUFBSSxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzlCLElBQUksTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUM5QixJQUFJLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDOUIsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLE1BQU0sQ0FBQztBQUN2RTtBQUNBLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHO0FBQzFCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEI7QUFDQTtBQUNBLElBQUksTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQzVDLElBQUksTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQzVDLElBQUksTUFB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QyxFQUFFO0FBQ2pDLFlBQVksTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDOUQ7QUFDQSxZQUFZLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNsQztBQUNBLGdCQUFnQixZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNoSDtBQUNBLGdCQUFnQixNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ3pDLGdCQUFnQixNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25ELGdCQUFnQixNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25ELGdCQUFnQixNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25ELGdCQUFnQixNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25EO0FBQ0E7QUFDQSxnQkFBZ0IsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUNwRixnQkFBZ0IsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUNwRixnQkFBZ0IsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQztBQUNwRixnQkFBZ0IsTUFBTSxF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QUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxVQUFVLEdBQUcsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ2hFLFlBQVksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDbkQsWUFBWSxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsVUFBVSxDQUFDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLFlBQVksWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNyRDtBQUNBLFlBQVksTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsWUFBWSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxZQUFZLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLFlBQVksTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUU7QUFDQSxZQUFZLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLFlBQVksTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFD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VixRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUNsQyxRQUFRLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDL0MsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdEQsUUFBUSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxRQUFRLENBQUM7QUFDN0MsUUFBUSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztBQUN2QztBQUNBLFFBQVEsSUFBSSxXQUFXLEVBQUUsT0FBTztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0QztBQUNBLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JFO0FBQ0EsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RTtBQUNBLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JFO0FBQ0EsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekUsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEYsUUFBUSxJQUFJLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FB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SSxDQUFDLEdBQUc7QUFDaEMsWUFBWSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUc7QUFDM0MsWUFBWSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHO0FBQ2hDLFlBQVksSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDNUM7QUFDQSxRQUFRLFFBQVEsRUFBRTtBQUNsQixRQUFRLEtBQUssQ0FBQyxDQUFDO0FBQ2YsWUFBWSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUM1QixZQUFZLE1BQU07QUFDbEIsUUFBUSxLQUFLLENBQUM7QUFDZCxZQUFZLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLFlBQVksTUFBTTtBQUNsQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLFFBQVEsRUFBRTtBQUNsQixRQUFRLEtBQUssQ0FBQyxDQUFDO0FBQ2YsWUFBWSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUM1QixZQUFZLE1BQU07QUFDbEIsUUFBUSxLQUFLLENBQUM7QUFDZCxZQUFZLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLFlBQVksTUFBTTtBQUNsQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDbEMsUUFBUSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ2xDLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQyxZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDOUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFB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RyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDckQsWUFBWSxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUMsWUFBWSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUU7QUFDMUUsZ0JBQWdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUQsZ0JBQWdCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDN0MsZ0JBQWdCLFVBQVUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0MsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtBQUM5QyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU87QUFDMUQsWUFBWSxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0FBQzlDLFlBQVksSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztBQUM5QyxZQUFZLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDN0UsWUFBWSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQy9FLFlBQVksTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0QsWUFBWSxN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VyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztBQUNqSDtBQUNBLFFBQVEsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUMvQjtBQUNBLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbEQsWUFBWSxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckM7QUFDQSxZQUFZLE1BQU0sSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3BFLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbEQsZ0JBQWdCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFD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LENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsS0FBSyxDQUFDO0FBQ047QUFDQSxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRCxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRDtBQUNBLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUU7QUFDN0IsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUM7QUFDQSxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMs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R0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUMsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQztBQUNBLFFBQVEsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0QsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsR0FBRyxVQUFVLEdBQUcsVUFBVTtBQUN0QyxRQUFRLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0FBQ25DO0FBQ0EsUUFBUSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxRQUFRLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQztBQUNBLFFBQVEsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUMxQyxRQUFRLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRCxRQUFRLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQyxRQUFRLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEQsUUFBUSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVB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LEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUNoRCxRQUFRLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0csUUFBUSxNQUFNLENBQUMsR0FBRyxLQUFLLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMzRTtBQUNBLFFBQVEsT0FBTztBQUNmLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUc7QUFDeEMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUc7QUFDMUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztBQUNoQixTQUFTLENBQUM7QUFDVixLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVO0FBQ3BDO0FBQ0EsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3BDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUN4QyxRQUFRLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztBQUN0QixRQUFRLElBQUksTUFBTSxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDbkMsUUFBUSxJQUFJLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM5QztBQUNBLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtBQUNyRCxZQUFZLEVBQUUsR0FBRyxLQUFLLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsTUFBTSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDOUUsWUFBWSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDN0UsWUFBWSxLQUFLLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUM3QixZQUFZLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEUsWUFBWSxNQUFNLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNuQyxZQUFZLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM5QyxZQUFZLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLEVBQUUsTUFBTTtBQUMvQyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFD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LEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QixZQUFZLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDckMsWUFBWSxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksUUFBUSxHQUFHLElBQUksSUFBSSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsR0FBRyxJQUFJLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ3RILGlCQUFpQixRQUFRLEdBQUcsSUFBSSxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxRQUFRLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6SCxZQUFZLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0RCxTQUFTLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3ZEO0FBQ0EsUUFBUSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6QixRQUFRLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xJO0FBQ0EsUUFBUSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZELFFBQVEsTUFBTSxHQUFHLEdBQUcsUUFB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TSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0Q7QUFDQSxJQUFJLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsSUFBSSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3REO0FBQ0EsSUFBSSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsSUFBSSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsSUFBSSxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlDO0FBQ0E7QUFDQSxJQUFJLE1BQU0sR0FBRyxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUNsRCxJQUFJLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNoQyxJQUFJLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxHQUFHLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BELElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7QUFDcEIsSUFBSSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDaEMsSUFBSSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUksTUFBTSxNQUFNLEdBQUdsTyxRQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNuRDtBQUNBLElBQUksTUFBTSxHQUFHLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BELElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7QUFDcEIsSUFBSSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDaEMsSUFBSSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUksTUFBTSxNQUFNLEdBQUdBLFFBQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ25EO0FBQ0EsSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMs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LGtCQUFrQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzFFLFFBQVEsSUFBSSxDQUFDLFlBQVksR0FBR3BCLFVBQWEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ2pDLFFBQVEsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN2QyxRQUFRLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDM0UsWUFBWSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUM1RSxZQUFZLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsTUFBTSxHQUFHLFFBQVEsR0FBRyxNQUFNO0FBQzFFLFlBQVksRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxNQUFNLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUMzRSxRQUFRLE1BQU0sUUFBUSxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdDLFFBQVFNLFdBQWMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUs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QyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDM0MsUUFBUSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckMsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDL0IsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMxQixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0FBQ3RFLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RSxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzNFLFFBQVEsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNqQixLQUFLO0FBQ0wsSUFBSSxJQUFJLElBQUksR0FB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Q0FBQyxDQUFDLENBQUM7QUFDMUQsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFDRDtBQUNBLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO0FBQ2xEO0FBQ0EsSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJLEVBQUU7QUFDekIsUUFBUSxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFO0FBQ2hDLFlBQVksTUFBTSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdkMsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNuQyxZQUFZLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEMsWUFBWSxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hELFlBQVksTUFBTSxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZGLFlBQVksTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzRSxZQUFZ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QU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2pEO0FBQ0EsUUFBUSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQVEsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEM7QUFDQSxRQUFRLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVEO0FBQ0EsUUFBUSxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hDO0FBQ0EsUUFBUSxJQUFJLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDcEQsWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdCLFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUIsWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLFNBQVM7QUFDVCxRQUFRLElBQUksSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNwRCxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QixZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMs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SSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzVDO0FBQ0EsUUFBUSxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0FBQzlELFFBQVEsSUFBSSxHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2QztBQUNBLFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDN0I7QUFDQTtBQUNBLFFBQVEsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDaEQsWUFBWSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTO0FBQzlDLFlBQVksUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RCxTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDM0Y7QUFDQSxRQUFRLElBQUksR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pELFlBQVksTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEM7QUFDQTtBQUNBLFlBQVksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xELFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDckY7QUFDQSxZQUFZLElBQUksR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDcEcsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQy9DO0FBQ0EsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQzVCLFFBQVEsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQy9ELFFBQVEsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELFFBQVEsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3ZGLFFBQVEsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVEO0FBQ0EsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFO0FBQ3RDLFlBQVksTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQzFCLFlBQVksTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUN6QixTQUFTLE1BQU0sSUFBSSxNQUFNLEdBQUcsTUFBTSxFQUFFO0FBQ3BDLFlBQVksTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3JGLFlBQVksTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEYsWUFBWSxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDakQsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2RCxRQUFRLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDdkYsUUFBUSxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDNUIsUUFBUSxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRTtBQUM5QixZQUFZLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEMsWUFBWSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbEYsU0FBUztBQUNULFFBQVEsT0FBTyxRQUFRLENBQUM7QUFDeEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFO0FBQzNCLFFBQVEsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN0RCxRQUFRLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUQsUUFBUSxNQUFNLFFBQVEsR0FBRyxtQ0FBbUMsQ0FBQztBQUM3RDtBQUNBLFFBQVEsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM3QyxRQUFRLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM5QztBQUNBLFFBQVEsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM5QyxRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvQztBQUNBLFFBQVEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUYsUUFBUSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4RCxRQUFRLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUM1QixRQUFRLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFO0FBQzlCLFlBQVksTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2QyxZQUFZLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7QUFDMUMsZ0JBQWdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN0RixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDN0Q7QUFDQSxRQUFRLE9BQU8sUUFBUSxDQUFDO0FBQ3hCLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQ3hDLFFBQVEsS0FBSyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7QUFDNUIsUUFBUSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQztBQUM3QjtBQUNBLFFBQVEsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEU7QUFDQSxRQUFRLE9BQU8sTUFBTSxDQUFDO0FBQ3RCLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3JCLFFBQVEsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsQyxRQUFRLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUM5QyxRQUFRLE1BQU0sQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDbEMsUUFBUSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2pDLFFBQVEsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDeEM7QUFDQSxRQUFRLE1BQU0sSUFBSSxHQUFHO0FBQ3JCLFlBQVksUUFBUSxFQUFFLEVBQUU7QUFDeEIsU0FBUyxDQUFDO0FBQ1Y7QUFDQSxRQUFRLElBQUksQ0FBQyxnQkFBZ0I7QUFDN0IsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQztBQUNuRSxZQUFZLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekM7QUFDQSxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNyQixZQUFZLElBQUksQ0FBQyxnQkFBZ0I7QUFDakMsZ0JBQWdCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUM7QUFDdEQsZ0JBQWdCLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUMsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtBQUMxQixZQUFZLElBQUksQ0FBQyxnQkFBZ0I7QUFDakMsZ0JBQWdCLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQztBQUNsRCxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlDLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2xELEtBQUs7QUFDTDtBQUNBLElBQUksdUJBQXVCLENBQUMsU0FBUyxFQUFFO0FBQ3ZDLFFBQVEsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0QsUUFBUSxPQUFPLGFBQWEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtBQUN0RCxZQUFZLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekQsWUFBWSxhQUFhLEVBQUUsQ0FBQztBQUM1QixZQUFZLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsTUFBTTtBQUM3QyxZQUFZLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztBQUMxRCxTQUFTO0FBQ1QsUUFBUSxPQUFPLGFBQWEsQ0FBQztBQUM3QixLQUFLO0FBQ0w7QUFDQSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO0FBQzdELFFBQVEsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyRDtBQUNBLFFBQVEsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUU7QUFDdEMsWUFBWSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO0FBQzNDO0FBQ0EsWUFBWSxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO0FBQ3hDLGdCQUFnQixJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLE1BQU0sRUFBRTtBQUMzRDtBQUNBLG9CQUFvQixPQUFPLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQztBQUNqRCxpQkFBaUIsTUFBTTtBQUN2QjtBQUNBLG9CQUFvQixPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25HO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWEsTUFBTSxJQUFJLE9BQU8sR0FBRyxNQUFNLEVBQUU7QUFDekM7QUFDQSxnQkFBZ0IsT0FBTyxFQUFFLENBQUM7QUFDMUIsYUFBYSxNQUFNO0FBQ25CO0FBQ0EsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsYUFBYTtBQUNiLFlBQVksSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxNQUFNO0FBQy9DLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxPQUFPLENBQUM7QUFDdkIsS0FBSztBQUNMO0FBQ0EsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRTtBQUNsRCxRQUFRLEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFO0FBQzdCLFlBQVksTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFlBQVksTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUMxQztBQUNBLFlBQVksSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUM3QixZQUFZLElBQUksU0FBUyxFQUFFO0FBQzNCLGdCQUFnQixJQUFJLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixhQUFhLE1BQU07QUFDbkIsZ0JBQWdCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9DLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUNwQyxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELGdCQUFnQixFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckQsYUFBYTtBQUNiO0FBQ0EsWUFBWSxNQUFNLENBQUMsR0FBRztBQUN0QixnQkFBZ0IsSUFBSSxFQUFFLENBQUM7QUFDdkIsZ0JBQWdCLFFBQVEsRUFBRSxDQUFDO0FBQzNCLG9CQUFvQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkUsb0JBQW9CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuRSxpQkFBaUIsQ0FBQztBQUNsQixnQkFBZ0IsSUFBSTtBQUNwQixhQUFhLENBQUM7QUFDZDtBQUNBO0FBQ0EsWUFBWSxJQUFJLEVBQUUsQ0FBQztBQUNuQixZQUFZLElBQUksU0FBUyxFQUFFO0FBQzNCLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMxQixhQUFhLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTtBQUNoRDtBQUNBLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUM3QixhQUFhLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDaEQ7QUFDQSxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUM3QyxhQUFhO0FBQ2I7QUFDQSxZQUFZLElBQUksRUFBRSxLQUFLLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM1QztBQUNBLFlBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEMsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksVUFBVSxDQUFDLENBQUMsRUFBRTtBQUNsQixRQUFRLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEYsS0FBSztBQUNMO0FBQ0EsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRTtBQUMzQixRQUFRLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUM1QixRQUFRLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ2pFLFFBQVEsTUFBTSxDQUFDLEdBQUcsTUFBTSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3hEO0FBQ0E7QUFDQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2hELFlBQVksTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDO0FBQ0EsWUFBWSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLFNBQVM7QUFDekMsWUFBWSxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMxQjtBQUNBO0FBQ0EsWUFBWSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxZQUFZLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pEO0FBQ0EsWUFBWSxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztBQUNyRCxZQUFZLElBQUksU0FBUyxHQUFHLGVBQWUsQ0FBQztBQUM1QztBQUNBO0FBQ0EsWUFBWSxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRTtBQUNsRCxnQkFBZ0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNsRDtBQUNBLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLFNBQVMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztBQUNqRSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFlBQVksSUFBSSxTQUFTLEdBQUcsZUFBZSxJQUFJLFNBQVMsSUFBSSxTQUFTLEVBQUU7QUFDdkUsZ0JBQWdCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO0FBQy9DLGdCQUFnQixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztBQUMvQztBQUNBLGdCQUFnQixJQUFJLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxlQUFlLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNsRztBQUNBO0FBQ0EsZ0JBQWdCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDdEU7QUFDQSxnQkFBZ0IsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUU7QUFDdEQsb0JBQW9CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdEQ7QUFDQSxvQkFBb0IsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxTQUFTO0FBQ2pELG9CQUFvQixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNsQztBQUNBLG9CQUFvQixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztBQUN4RCxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO0FBQzNDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDM0M7QUFDQSxvQkFBb0IsQ0FBQyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDcEM7QUFDQSxvQkFBb0IsSUFBSSxNQUFNLEVBQUU7QUFDaEMsd0JBQXdCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2Rix3QkFBd0IsTUFBTSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRSxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCO0FBQ0EsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLGdCQUFnQixRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLEVBQUUsR0FBRyxTQUFTLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7QUFDL0c7QUFDQSxhQUFhLE1BQU07QUFDbkIsZ0JBQWdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakM7QUFDQSxnQkFBZ0IsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO0FBQ25DLG9CQUFvQixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRTtBQUMxRCx3QkFBd0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxRCx3QkFBd0IsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxTQUFTO0FBQ3JELHdCQUF3QixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN0Qyx3QkFBd0IsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sUUFBUSxDQUFDO0FBQ3hCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxZQUFZLENBQUMsU0FBUyxFQUFFO0FBQzVCLFFBQVEsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7QUFDckQsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLGNBQWMsQ0FBQyxTQUFTLEVBQUU7QUFDOUIsUUFBUSxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNyRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQ3ZCLFFBQVEsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFO0FBQzdCLFlBQVksT0FBTyxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztBQUMzRSxTQUFTO0FBQ1QsUUFBUSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDN0QsUUFBUSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNsRCxRQUFRLE9BQU8sS0FBSyxJQUFJLE1BQU0sS0FBSyxRQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDMUUsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLFNBQVMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUU7QUFDeEQsSUFBSSxPQUFPO0FBQ1gsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNwQixRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsSUFBSSxFQUFFLFFBQVE7QUFDdEIsUUFBUSxFQUFFO0FBQ1YsUUFBUSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsU0FBUztBQUNqQixRQUFRLFVBQVU7QUFDbEIsS0FBSyxDQUFDO0FBQ04sQ0FBQztBQUNEO0FBQ0EsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO0FBQ25DLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztBQUMxQyxJQUFJLE9BQU87QUFDWCxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsUUFBUSxJQUFJLEVBQUUsUUFBUTtBQUN0QixRQUFRLEtBQUssRUFBRSxFQUFFO0FBQ2pCLFFBQVEsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUNwQixLQUFLLENBQUM7QUFDTixDQUFDO0FBQ0Q7QUFDQSxTQUFTLGNBQWMsQ0FBQyxPQUFPLEVBQUU7QUFDakMsSUFBSSxPQUFPO0FBQ1gsUUFBUSxJQUFJLEVBQUUsU0FBUztBQUN2QixRQUFRLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtBQUN0QixRQUFRLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxPQUFPLENBQUM7QUFDakQsUUFBUSxRQUFRLEVBQUU7QUFDbEIsWUFBWSxJQUFJLEVBQUUsT0FBTztBQUN6QixZQUFZLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRCxTQUFTO0FBQ1QsS0FBSyxDQUFDO0FBQ04sQ0FBQztBQUNEO0FBQ0EsU0FBUyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUU7QUFDdkMsSUFBSSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ3BDLElBQUksTUFBTSxNQUFNO0FBQ2hCLFFBQVEsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pELFFBQVEsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNyRSxJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0FBQ2xELFFBQVEsT0FBTyxFQUFFLElBQUk7QUFDckIsUUFBUSxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUU7QUFDOUIsUUFBUSxXQUFXLEVBQUUsS0FBSztBQUMxQixRQUFRLHVCQUF1QixFQUFFLE1BQU07QUFDdkMsS0FBSyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNuQixJQUFJLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDM0IsQ0FBQztBQUNELFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNuQixJQUFJLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUMsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2RSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBQ2pCLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQzNCLENBQUM7QUFDRCxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDakIsSUFBSSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQy9DLElBQUksT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FB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QUMsSUFBSSxDQUFDLENBQUM7QUFDOUIsSUFBSSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztBQUN2QixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7QUFDeEQsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzQyxRQUFRLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUN0QixRQUFRLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRCxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkIsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUNyQixJQUFJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3JCLElBQUksSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMxQyxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNwRSxJQUFJLE9BQU8sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFD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QUMsQ0FBQztBQUM1QixJQUFJLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzlGLFFBQVEsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDdEIsUUFBUSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUU7QUFDeEIsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDbkIsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDM0IsSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDN0IsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDekIsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUMzRCxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFDLFFBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ25FLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDaEMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDNUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsSUFBSSxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNqQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqQyxJ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V0FBVyxFQUFFLENBQUM7QUFDM0IsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDMUQ7QUFDQSxRQUFRLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEMsUUFBUSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEM7QUFDQSxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDL0MsUUFBUSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQy9DLFFBQVEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMvQyxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDL0MsS0FBSztBQUNMLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO0FBQ3ZEO0FBQ0EsSUFBSSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUTtBQUMvQixRQUFRLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSTtBQUMzQixRQUFRLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDeEI7QUFDQSxJQUFJLElBQUks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SSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDekIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLFNBQVMsRUFBRUMsUUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6QztBQUNBLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBQ0Q7QUFDQSxTQUFTQSxRQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtBQUNqQyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNqQixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzVFLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRSxLQUFLO0FBQ0wsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQ2hDLFFBQVEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDNUQsWUFBWSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsWUFBWSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMs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QU0sR0FBRyxPQUFPLENBQUMsTUFBTTtBQUN0RCxZQUFZLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRTtBQUN6QixZQUFZLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRTtBQUN6QixZQUFZLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRTtBQUN2QixZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBQ3hDO0FBQ0EsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2pDO0FBQ0EsUUFBUSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckYsUUFBUSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckYsUUFBUSxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ3hCO0FBQ0EsUUFBUSxJQUFJLElBQUksRUFBRTtBQUNsQixZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRixZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRixZQUFZLElBQUksR0FBRyxJQUFJLENBQUM7QUFDeEIsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLEtBQUssRUFBRTtBQUNuQixZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRixZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRixZQUFZLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDekIsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuRDtBQUNBLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEQsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENB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RSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RixZQUFZQSxtQkFBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0YsWUFBWUEsbUJBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RixZQUFZQSxtQkFBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0YsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUMxQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFVBQVUsR0FBRztBQUNqQixRQUFRLElBQUksQ0FBQywy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QUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsbUJBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNuRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsbUJBQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUMvQyxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsbUJBQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNyRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsbUJBQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNqRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsbUJBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNuRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsbUJBQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNuRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsbUJBQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtBQUMzRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsbUJBQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNqRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsbUJBQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUM3QyxZQUFZLFFBQVEs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LENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRSxZQUFZLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEUsWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLFlBQVksT0FBTyxHQUFHLENBQUM7QUFDdkIsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUk1TCx1QkFBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJQSx1QkFBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkg7QUFDQTtBQUNBLFFBQVEsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxXQUFXLEtBQUs7QUFDMUQsWUFBWSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMs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V0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQztBQUNBLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUM7QUFDQSxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQztBQUNBLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFD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S0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUN2QyxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTSxhQUFhLFNBQVMwSixlQUFLLENBQUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksY0FBYyxHQUFHO0FBQ3JCLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUN0QyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFB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QUFRLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRWUsZ0JBQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZGLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssQ0FBQyxNQUFNLGNBQWMsT0FBTyxxQkFBcUIsU0FBUyxXQUFXO0FBQzlFLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDQSxnQkFBTSxDQUFDO0FBQ2xDLFlBQVksTUFBTSxFQUFFLE1BQU07QUFDMUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2hDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU8sV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE9BQU8sQ0FBQyxJQUFJLFVBQVUsU0FBUyxXQUFXO0FBQzlDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxDQUFDLElBQUksVUFBVSxP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RSxDQUFDO0FBQ25FLFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSUEsNEJBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ25FLFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSUEsNEJBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ25FO0FBQ0EsUUFBUSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BGLFFBQVEsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRjtBQUNBLFFBQVEsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRixRQUFRLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxD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QUFDO0FBQ25EO0FBQ0EsUUFBUSxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ2hDO0FBQ0E7QUFDQSxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO0FBQ2hEO0FBQ0EsWUFBWSxFQUFFLEdBQUcsRUFBRSxHQUFHLEtBQUs7QUFDM0I7QUFDQTtBQUNBLFlBQVksRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUM3QjtBQUNBLFFBQVEsSUFBSSxTQUFTLElBQUksT0FBTyxFQUFFO0FBQ2xDLFlBQVksTUFBTSxPQUFPLEdBQUcxSCxlQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0RztBQUNBO0FBQ0EsWUFBWSxNQUFNLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUM7QUFDaEUsWUFBWSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNDLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUSxNQUFNLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDdEIsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNuSCxZQUFZLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEQsU0FBUztBQUNUO0FBQ0EsUUFBUSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDckUsUUFBUSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDckUsUUFBUSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN0RDtBQUNBO0FBQ0EsUUFBUSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFJLENBQUMsMEJBQTBCLFVBQVUsQ0FBQyxFQUFFO0FBQ3BELFlBQVksUUFBUSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDbkQsU0FBUyxDQUFDO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFJLENBQUMsMEJBQTBCLFVBQVUsQ0FBQyxFQUFFO0FBQ3BELFlBQVksT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcs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O0FBQ3ZCLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNyRCxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDdEQsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ25ELFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUM3RCxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDOUQsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pELFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsRCxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckQsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3JELFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUMxRCxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFDLFlBQVksT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzdCLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztBQUMvQixRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDL0IsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUM5QyxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksU0FBUyxHQUFHO0FBQ2hCLFFBQVEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQzVCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsQ0FBQyxNQUFNLGNBQWM7QUFDbEMsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHaVUsZ0JBQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUMsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6QixRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0QsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFVBQVUsR0FBRztBQUNqQixRQUFRLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUM3QixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksUUFBUSxDQUFDLEtBQUssVUFBVTtBQUM1QixRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUN6QixZQUFZLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDakMsWUFBWSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUMvQixZQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2xELFlBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzVFO0FBQ0EsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO0FBQ3pDLGdCQUFnQixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxRCxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLEtBQUssRUFBRTtBQUNuQixZQUFZLElBQUksRUFBRSxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO0FBQzlDLGdCQUFnQixNQUFNLFlBQVksR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BELGdCQUFnQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDMUMsZ0JBQWdCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUUsZ0JBQWdCLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUc7QUFDN0Qsb0JBQW9CLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDakMsb0JBQW9CLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEMsb0JBQW9CLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkMsb0JBQW9CLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQztBQUNoRCxvQkFBb0IsYUFBYSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDcEcsb0JBQW9CLGNBQWMsRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdEcsb0JBQW9CLE1BQU0sRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLFlBQVksR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDOUUsb0JBQW9CLE9BQU8sRUFBRSxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsWUFBWSxHQUFHLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNoRixpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ2pDLGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLFlBQVksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsRTtBQUNBLFlBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3pELFlBQVksSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzVFLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtBQUN6QyxnQkFBZ0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVELGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN6RSxZQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNqRSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksV0FBVyxDQUFDLENBQUMsaUJBQWlCO0FBQ2xDLFFBQVEsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM1QixRQUFRLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUNuRDtBQUNBLFFBQVE7QUFDUixZQUFZLENBQUMsSUFBSSxLQUFLLE9BQU8sTUFBTSxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQ3BELGFBQWEsVUFBVSxLQUFLLEVBQUUsQ0FBQyxLQUFLLFVBQVUsS0FBSyxFQUFFLENBQUM7QUFDdEQsVUFBVTtBQUNWLFlBQVksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQy9CLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsQ0FBQyxDQUFDLGlCQUFpQjtBQUNsQyxRQUFRLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO0FBQ3JELFFBQVEsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUN0QztBQUNBLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLGFBQWEsS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxhQUFhLE9BQU8sQ0FBQyxFQUFFO0FBQ2xHLFlBQVksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQy9CLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsR0FBRztBQUNmLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzNCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxHQUFHO0FBQ2xCLFFBQVEsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDcEIsWUFBWSxPQUFPLElBQUksQ0FBQztBQUN4QixTQUFTLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUU7QUFDbkMsWUFBWSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDM0IsWUFBWSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakUsU0FBUyxNQUFNO0FBQ2YsWUFBWSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxZQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNoRSxTQUFTO0FBQ1QsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLGdCQUFnQixHQUFHO0FBQ3ZCLFFBQVEsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNyRjtBQUNBLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsRUFBRTtBQUNqRCxZQUFZLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztBQUNuQyxZQUFZLE9BQU87QUFDbkIsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRDtBQUNBLFFBQVEsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO0FBQzdFLFlBQVksTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0FBQzVELFlBQVksSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO0FBQ2pDLGdCQUFnQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzdEO0FBQ0EsZ0JBQWdCLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDekUsZ0JBQWdCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BFLGdCQUFnQixlQUFlLEdBQUcsY0FBYyxHQUFHLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDbEUsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNuRSxRQUFRLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxHQUFHLFVBQVUsS0FBSyxlQUFlLEdBQUcsd0JBQXdCLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDaEcsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDbkQsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRDtBQUNBLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDL0IsS0FBSztBQUNMO0FBQ0EsSUFBSSxlQUFlLEdBQUc7QUFDdEIsUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDN0IsWUFBWSxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzFDLFlBQVksSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDbkMsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksbUJBQW1CLENBQUMsUUFBUSxtQkFBbUI7QUFDbkQsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUN2QyxRQUFRLE9BQU8sQ0FBQyxDQUFDLFFBQVE7QUFDekIsWUFBWSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLO0FBQ3BELFlBQVksUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO0FBQ3RELEtBQUs7QUFDTDtBQUNBLElBQUksVUFBVSxHQUFHO0FBQ2pCLFFBQVEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJalUsdUJBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakQsUUFBUSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7QUFDN0MsUUFBUSxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztBQUNwRCxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUosS0FBSztBQUNMO0FBQ0EsSUFBSSxlQUFlLEdBQUc7QUFDdEIsUUFBUSxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssVUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssTUFBTSxFQUFFO0FBQ3BGLFlBQVksT0FBTyxDQUFDLENBQUM7QUFDckIsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxLQUFLLEVBQUU7QUFDOUMsWUFBWSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDeEMsU0FBUztBQUNULFFBQVEsT0FBTyxDQUFDLENBQUM7QUFDakIsS0FBSztBQUNMO0FBQ0EsSUFBSSxrQkFBa0IsR0FBRztBQUN6QixRQUFRLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssTUFBTSxFQUFFO0FBQzFGLFlBQVksT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQ2xDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxLQUFLLEVBQUU7QUFDakQsWUFBWSxPQUFPLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMzRCxTQUFTO0FBQ1QsUUFBUSxPQUFPLENBQUMsQ0FBQztBQUNqQixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sQ0FBQyxTQUFTLFlBQVk7QUFDakMsUUFBUUksZ0JBQU0sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDekQsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPO0FBQy9CO0FBQ0EsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFO0FBQ25ELFlBQVksSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDbkYsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztBQUNwRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFO0FBQ2hDLFlBQVksSUFBSSxDQUFDLGNBQWMsR0FBR0EsZ0JBQU0sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNO0FBQ3JFLGdCQUFnQixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ2hFLG9CQUFvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDbEQsb0JBQW9CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUN0QyxpQkFBaUI7QUFDakIsYUFBYSxDQUFDLENBQUM7QUFDZixTQUFTLE1BQU07QUFDZixZQUFZLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUMxQyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU07QUFDeEMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPO0FBQ25DO0FBQ0EsWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzVELGdCQUFnQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDbEMsYUFBYTtBQUNiO0FBQ0EsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtBQUNwRixnQkFBZ0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNuRixhQUFhO0FBQ2IsU0FBUyxDQUFDLENBQUM7QUFDWCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxrQkFBa0IsR0FBRztBQUN6QixRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN0RCxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQ3ZDLFFBQVEsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RELFFBQVEsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hFLFFBQVEsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVFLFFBQVEsT0FBTyxNQUFNLENBQUM7QUFDdEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsR0FBRztBQUNoQixRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUM1QixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLENBQUMsTUFBTSxhQUFhO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBR0osdUJBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0MsUUFBUSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDdkIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sQ0FBQyxDQUFDLGlDQUFpQztBQUM5QyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQy9CLFlBQVksTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztBQUNyRixZQUFZLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLGNBQWMsQ0FBQztBQUNwRixTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPO0FBQ3RDO0FBQ0EsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNyRCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RELFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckM7QUFDQSxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFDdkMsWUFBWSxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJeUssZUFBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDOUMsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUlBLGVBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxHQUFHO0FBQ1o7QUFDQSxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFDbkQsUUFBUSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNqRDtBQUNBO0FBQ0EsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJQSxlQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1QyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO0FBQ2pDLEtBQUs7QUFDTDtBQUNBLElBQUksZUFBZSxDQUFDLENBQUMsaUNBQWlDO0FBQ3RELFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sT0FBTyxFQUFFO0FBQ25FLFlBQVksQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztBQUN4RjtBQUNBLFlBQVksSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQzNDO0FBQ0EsWUFBWSxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUNwQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEQsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BELFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsRCxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkQsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksQ0FBQyxpQkFBaUIsV0FBVztBQUM3QyxRQUFRLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO0FBQzlDO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQ3ZCLFlBQVksSUFBSSxpQkFBaUIsRUFBRTtBQUNuQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNoRSxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNqRSxhQUFhLE1BQU07QUFDbkIsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDakUsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDbEUsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsR0FBRztBQUNsQixRQUFRLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUMvQixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLENBQUMsUUFBUSxVQUFVO0FBQ2xDLFFBQVEsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3ZCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsR0FBRztBQUNsQixRQUFRLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUM5QixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLFVBQVU7QUFDNUMsUUFBUSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxJQUFJLE1BQU0sQ0FBQztBQUN0RCxRQUFRLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN2QixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxvQkFBb0IsR0FBRztBQUMzQixRQUFRLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0FBQ3ZDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGlCQUFpQixDQUFDLFNBQVMsVUFBVTtBQUN6QyxRQUFRLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxJQUFJLFNBQVMsS0FBSyxNQUFNLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztBQUN2RyxRQUFRLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN2QixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxpQkFBaUIsR0FBRztBQUN4QixRQUFRLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztBQUNwQyxLQUFLO0FBQ0w7O0FDcnZCQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sYUFBYSxDQUFDO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxZQUFZLFVBQVU7QUFDdEMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2xDLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLENBQUMsU0FBUyxrQkFBa0I7QUFDeEMsUUFBUSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUM3RCxRQUFRLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3pEO0FBQ0EsUUFBUSxNQUFNLENBQUMsR0FBRzhHLHdCQUFjLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ3BHLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNyRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksUUFBUSxDQUFDLFNBQVMsbUJBQW1CO0FBQ3pDLFFBQVEsT0FBTyxTQUFTLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUMxRSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxNQUFNLENBQUMsS0FBSyxVQUFVO0FBQzFCLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLFFBQVEsQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUM7QUFDbEM7QUFDQSxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0FBQzVCLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7QUFDMUIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sQ0FBQyxLQUFLLFVBQVUsU0FBUyxVQUFVLFFBQVEsVUFBVTtBQUMvRCxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMvQyxRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQzFCO0FBQ0EsUUFBUSxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxHQUFHLFFBQVEsQ0FBQztBQUM3QyxLQUFLO0FBQ0w7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxHQUFHLFNBQVMsTUFBTSxDQUFDO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxPQUFPLGNBQWM7QUFDckMsUUFBUWpLLDBCQUFnQixDQUFDLElBQUksQ0FBQ2tL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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFFBQVEsQ0FBQyxLQUFLLDZDQUE2QyxRQUFRLFdBQVc7QUFDbEYsUUFBUSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM3QyxRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsQyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLENBQUMsRUFBRSxVQUFVLFFBQVEsV0FBVztBQUM3QyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFD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 +})); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwYm94LWdsLWRldi5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWwvYnJvd3Nlci93aW5kb3cuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC91bml0YmV6aWVyL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvcG9pbnQtZ2VvbWV0cnkvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIi4uL25vZGVfbW9kdWxlcy9hc3NlcnQvbm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvYXNzZXJ0L25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9ub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2Fzc2VydC9hc3NlcnQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2RlZXBfZXF1YWwuanMiLCIuLi9zcmMvdXRpbC91dGlsLmpzIiwiLi4vc3JjL3V0aWwvcGVyZm9ybWFuY2UuanMiLCIuLi9zcmMvdXRpbC9icm93c2VyLmpzIiwiLi4vc3JjL3V0aWwvY29uZmlnLmpzIiwiLi4vc3JjL3V0aWwvd2VicF9zdXBwb3J0ZWQuanMiLCIuLi9zcmMvdXRpbC9za3VfdG9rZW4uanMiLCIuLi9zcmMvdXRpbC9tYXBib3guanMiLCIuLi9zcmMvdXRpbC90aWxlX3JlcXVlc3RfY2FjaGUuanMiLCIuLi9zcmMvdXRpbC9hamF4LmpzIiwiLi4vc3JjL3V0aWwvZXZlbnRlZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2V4dGVuZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3BhcnNpbmdfZXJyb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3Njb3BlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9jc3Njb2xvcnBhcnNlci9jc3Njb2xvcnBhcnNlci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2NvbGxhdG9yLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi92YWx1ZXMuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2xpdGVyYWwuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL3J1bnRpbWVfZXJyb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2Fzc2VydGlvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvZm9ybWF0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbWFnZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29lcmNpb24uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2V2YWx1YXRpb25fY29udGV4dC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vY29tcG91bmRfZXhwcmVzc2lvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29sbGF0b3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL3dpdGhpbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaXNfY29uc3RhbnQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL3Zhci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vcGFyc2luZ19jb250ZXh0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9zdG9wcy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvc3RlcC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL2NvbG9yX3NwYWNlcy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW50ZXJwb2xhdGUuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2NvYWxlc2NlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9sZXQuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2F0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvaW5kZXhfb2YuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL21hdGNoLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9jYXNlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9zbGljZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvY29tcGFyaXNvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbnVtYmVyX2Zvcm1hdC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGVuZ3RoLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbmRleC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3V0aWwvcmVzdWx0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdXRpbC9nZXRfdHlwZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2Z1bmN0aW9uL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9vYmplY3QuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9hcnJheS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX251bWJlci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Z1bmN0aW9uLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZXhwcmVzc2lvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Jvb2xlYW4uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9jb2xvci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2VudW0uanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlci9pbmRleC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZpbHRlci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3Byb3BlcnR5LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHkuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHkuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy92YWxpZGF0ZS92YWxpZGF0ZV9sYXllci5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3N0cmluZy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX3NvdXJjZS5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2xpZ2h0LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfdGVycmFpbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZvZy5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2Zvcm1hdHRlZC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlX2ltYWdlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfcHJvamVjdGlvbi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlL3ZhbGlkYXRlLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvdmFsaWRhdGUvdmFsaWRhdGVfZ2x5cGhzX3VybC5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL3ZhbGlkYXRlX3N0eWxlLm1pbi5qcyIsIi4uL3NyYy9zdHlsZS92YWxpZGF0ZV9zdHlsZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9ncmlkLWluZGV4L2dyaWQtaW5kZXguanMiLCIuLi9zcmMvdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzIiwiLi4vc3JjL3N0eWxlL3pvb21faGlzdG9yeS5qcyIsIi4uL3NyYy91dGlsL2lzX2NoYXJfaW5fdW5pY29kZV9ibG9jay5qcyIsIi4uL3NyYy91dGlsL3NjcmlwdF9kZXRlY3Rpb24uanMiLCIuLi9zcmMvc291cmNlL3J0bF90ZXh0X3BsdWdpbi5qcyIsIi4uL3NyYy9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMiLCIuLi9zcmMvc3R5bGUvcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zaGFkZXJzL2VuY29kZV9hdHRyaWJ1dGUuanMiLCIuLi9zcmMvdXRpbC9zdHJ1Y3RfYXJyYXkuanMiLCIuLi9zcmMvZGF0YS9hcnJheV90eXBlcy5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9wYXR0ZXJuX2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvZGFzaF9hdHRyaWJ1dGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL211cm11cmhhc2gtanMvbXVybXVyaGFzaDNfZ2MuanMiLCIuLi9ub2RlX21vZHVsZXMvbXVybXVyaGFzaC1qcy9tdXJtdXJoYXNoMl9nYy5qcyIsIi4uL25vZGVfbW9kdWxlcy9tdXJtdXJoYXNoLWpzL2luZGV4LmpzIiwiLi4vc3JjL2RhdGEvZmVhdHVyZV9wb3NpdGlvbl9tYXAuanMiLCIuLi9zcmMvcmVuZGVyL3VuaWZvcm1fYmluZGluZy5qcyIsIi4uL3NyYy9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9jaXJjbGVfYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9kYXRhL3NlZ21lbnQuanMiLCIuLi9zcmMvZGF0YS9pbmRleF9hcnJheV90eXBlLmpzIiwiLi4vc3JjL2RhdGEvZXh0ZW50LmpzIiwiLi4vc3JjL2dlby9sbmdfbGF0X2JvdW5kcy5qcyIsIi4uL3NyYy9nZW8vbG5nX2xhdC5qcyIsIi4uL3NyYy9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyIsIi4uL3NyYy9nZW8vcHJvamVjdGlvbi9yZXNhbXBsZS5qcyIsIi4uL3NyYy9kYXRhL2xvYWRfZ2VvbWV0cnkuanMiLCIuLi9zcmMvZGF0YS9ldmFsdWF0aW9uX2ZlYXR1cmUuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldC5qcyIsIi4uL3NyYy91dGlsL2ludGVyc2VjdGlvbl90ZXN0cy5qcyIsIi4uL3NyYy9zdHlsZS9xdWVyeV91dGlscy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9jaXJjbGVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL2NvbW1vbi5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL21hdDIuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQyZC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL21hdDMuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9tYXQ0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vdmVjMy5qcyIsIi4uL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvZXNtL3ZlYzQuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS9xdWF0LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9lc20vcXVhdDIuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L2VzbS92ZWMyLmpzIiwiLi4vc3JjL3V0aWwvcHJpbWl0aXZlcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9jaXJjbGVfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvaGVhdG1hcF9idWNrZXQuanMiLCIuLi9zcmMvdXRpbC9pbWFnZS5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvdXRpbC9jb2xvcl9yYW1wLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGlsbHNoYWRlX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvaGlsbHNoYWRlX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfYXR0cmlidXRlcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIi4uL25vZGVfbW9kdWxlcy9xdWlja3NlbGVjdC9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2NsYXNzaWZ5X3JpbmdzLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3BhdHRlcm5fYnVja2V0X2ZlYXR1cmVzLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0LmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2F0dHJpYnV0ZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWxheWVyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGUuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC92ZWN0b3ItdGlsZS9pbmRleC5qcyIsIi4uL3NyYy91dGlsL3BvbHlnb25fY2xpcHBpbmcuanMiLCIuLi9zcmMvZGF0YS9idWNrZXQvZmlsbF9leHRydXNpb25fYnVja2V0LmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC93aG9vdHMtanMvaW5kZXgubWpzIiwiLi4vc3JjL3NvdXJjZS90aWxlX2lkLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2xpbmVfYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9kYXRhL2J1Y2tldC9saW5lX2F0dHJpYnV0ZXNfZXh0LmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0LmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3N5bWJvbF9hdHRyaWJ1dGVzLmpzIiwiLi4vc3JjL3N5bWJvbC9vbmVfZW0uanMiLCIuLi9zcmMvc3ltYm9sL3N5bWJvbF9zaXplLmpzIiwiLi4vc3JjL3N5bWJvbC90cmFuc2Zvcm1fdGV4dC5qcyIsIi4uL3NyYy9zeW1ib2wvbWVyZ2VsaW5lcy5qcyIsIi4uL3NyYy91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvcGJmL2luZGV4LmpzIiwiLi4vc3JjL3N0eWxlL3BhcnNlX2dseXBoX3BiZi5qcyIsIi4uL25vZGVfbW9kdWxlcy9wb3RwYWNrL2luZGV4Lm1qcyIsIi4uL3NyYy9yZW5kZXIvaW1hZ2VfYXRsYXMuanMiLCIuLi9zcmMvc3ltYm9sL3NoYXBpbmcuanMiLCIuLi9zcmMvc3ltYm9sL2FuY2hvci5qcyIsIi4uL3NyYy9zeW1ib2wvY2hlY2tfbWF4X2FuZ2xlLmpzIiwiLi4vc3JjL3N5bWJvbC9nZXRfYW5jaG9ycy5qcyIsIi4uL3NyYy9zeW1ib2wvY2xpcF9saW5lLmpzIiwiLi4vc3JjL3N0eWxlL2xvYWRfZ2x5cGhfcmFuZ2UuanMiLCIuLi9ub2RlX21vZHVsZXMvQG1hcGJveC90aW55LXNkZi9pbmRleC5qcyIsIi4uL3NyYy9yZW5kZXIvZ2x5cGhfbWFuYWdlci5qcyIsIi4uL3NyYy9zeW1ib2wvcXVhZHMuanMiLCIuLi9ub2RlX21vZHVsZXMvdGlueXF1ZXVlL2luZGV4LmpzIiwiLi4vc3JjL3V0aWwvZmluZF9wb2xlX29mX2luYWNjZXNzaWJpbGl0eS5qcyIsIi4uL3NyYy9zeW1ib2wvc3ltYm9sX2xheW91dC5qcyIsIi4uL3NyYy90ZXJyYWluL2dsb2JlX2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvZGF0YS9wb3NfYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9nZW8vcHJvamVjdGlvbi9nbG9iZV91dGlsLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2Zhcl96LmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL3Byb2plY3Rpb24uanMiLCIuLi9zcmMvZ2VvL3Byb2plY3Rpb24vYWxiZXJzLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2VxdWFsX2VhcnRoLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2VxdWlyZWN0YW5ndWxhci5qcyIsIi4uL3NyYy9nZW8vcHJvamVjdGlvbi9sYW1iZXJ0LmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL21lcmNhdG9yLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL25hdHVyYWxfZWFydGguanMiLCIuLi9zcmMvZ2VvL3Byb2plY3Rpb24vd2lua2VsX3RyaXBlbC5qcyIsIi4uL3NyYy9nZW8vcHJvamVjdGlvbi9jeWxpbmRyaWNhbF9lcXVhbF9hcmVhLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2dsb2JlLmpzIiwiLi4vc3JjL2dlby9wcm9qZWN0aW9uL2luZGV4LmpzIiwiLi4vc3JjL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMiLCIuLi9zcmMvdXRpbC9yZXNvbHZlX3Rva2Vucy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9mb3JtYXRfc2VjdGlvbl9vdmVycmlkZS5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvYmFja2dyb3VuZF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2JhY2tncm91bmRfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvcmFzdGVyX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMiLCIuLi9zcmMvc3R5bGUvc3R5bGVfbGF5ZXIvcmFzdGVyX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllci5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9za3lfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9sYXllci9za3lfc3R5bGVfbGF5ZXIuanMiLCIuLi9zcmMvc3R5bGUvY3JlYXRlX3N0eWxlX2xheWVyLmpzIiwiLi4vc3JjL3JlbmRlci90ZXh0dXJlLmpzIiwiLi4vc3JjL3JlbmRlci9saW5lX2F0bGFzLmpzIiwiLi4vc3JjL3V0aWwvdGhyb3R0bGVkX2ludm9rZXIuanMiLCIuLi9zcmMvdXRpbC9zY2hlZHVsZXIuanMiLCIuLi9zcmMvdXRpbC9hY3Rvci5qcyIsIi4uL3NyYy91dGlsL2RpY3Rpb25hcnlfY29kZXIuanMiLCIuLi9zcmMvdXRpbC92ZWN0b3J0aWxlX3RvX2dlb2pzb24uanMiLCIuLi9zcmMvZGF0YS9idWNrZXQuanMiLCIuLi9zcmMvdXRpbC9kZWJ1Zy5qcyIsIi4uL3NyYy9kYXRhL2RlYnVnX3Zpei5qcyIsIi4uL3NyYy9zb3VyY2UvdGlsZV9tZXNoLmpzIiwiLi4vc3JjL2RhdGEvYm91bmRzX2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvc291cmNlL3RpbGUuanMiLCIuLi9zcmMvc291cmNlL3NvdXJjZV9zdGF0ZS5qcyIsIi4uL3NyYy9kYXRhL2RlbV90cmVlLmpzIiwiLi4vc3JjL2RhdGEvZGVtX2RhdGEuanMiLCIuLi9zcmMvc291cmNlL3RpbGVfY2FjaGUuanMiLCIuLi9zcmMvZ2wvaW5kZXhfYnVmZmVyLmpzIiwiLi4vc3JjL2dsL3ZlcnRleF9idWZmZXIuanMiLCIuLi9zcmMvZ2wvdmFsdWUuanMiLCIuLi9zcmMvZ2wvZnJhbWVidWZmZXIuanMiLCIuLi9zcmMvZ2wvZGVwdGhfbW9kZS5qcyIsIi4uL3NyYy9nbC9zdGVuY2lsX21vZGUuanMiLCIuLi9zcmMvZ2wvY29sb3JfbW9kZS5qcyIsIi4uL3NyYy9nbC9jdWxsX2ZhY2VfbW9kZS5qcyIsIi4uL3NyYy9nbC9jb250ZXh0LmpzIiwiLi4vc3JjL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMiLCIuLi9zcmMvdGVycmFpbi9lbGV2YXRpb24uanMiLCIuLi9zcmMvZGF0YS9mZWF0dXJlX2luZGV4LmpzIiwiLi4vc3JjL3JlbmRlci9nbHlwaF9hdGxhcy5qcyIsIi4uL3NyYy9zb3VyY2Uvd29ya2VyX3RpbGUuanMiLCIuLi9zcmMvc291cmNlL3ZlY3Rvcl90aWxlX3dvcmtlcl9zb3VyY2UuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy91dGlsL3JlZl9wcm9wZXJ0aWVzLmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZ3JvdXBfYnlfbGF5b3V0LmpzIiwiLi4vc3JjL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4LmpzIiwiLi4vc3JjL3NvdXJjZS9yYXN0ZXJfZGVtX3RpbGVfd29ya2VyX3NvdXJjZS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AbWFwYm94L2dlb2pzb24tcmV3aW5kL2luZGV4LmpzIiwiLi4vc3JjL3NvdXJjZS9nZW9qc29uX3dyYXBwZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvdnQtcGJmL2xpYi9nZW9qc29uX3dyYXBwZXIuanMiLCIuLi9ub2RlX21vZHVsZXMvdnQtcGJmL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvc29ydC5qcyIsIi4uL25vZGVfbW9kdWxlcy9rZGJ1c2gvc3JjL3JhbmdlLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvd2l0aGluLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvaW5kZXguanMiLCIuLi9ub2RlX21vZHVsZXMvc3VwZXJjbHVzdGVyL2luZGV4LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3NpbXBsaWZ5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2ZlYXR1cmUuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIi4uL25vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9jbGlwLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvdHJhbnNmb3JtLmpzIiwiLi4vbm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3RpbGUuanMiLCIuLi9ub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvaW5kZXguanMiLCIuLi9zcmMvc291cmNlL2dlb2pzb25fd29ya2VyX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2Uvd29ya2VyLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BtYXBib3gvbWFwYm94LWdsLXN1cHBvcnRlZC9pbmRleC5qcyIsIi4uL3NyYy91dGlsL2RvbS5qcyIsIi4uL3NyYy9zdHlsZS9sb2FkX3Nwcml0ZS5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZV9pbWFnZS5qcyIsIi4uL3NyYy9yZW5kZXIvaW1hZ2VfbWFuYWdlci5qcyIsIi4uL3NyYy9zdHlsZS9saWdodC5qcyIsIi4uL3NyYy9zdHlsZS90ZXJyYWluLmpzIiwiLi4vc3JjL3N0eWxlL2ZvZ19oZWxwZXJzLmpzIiwiLi4vc3JjL3N0eWxlL2ZvZy5qcyIsIi4uL3NyYy91dGlsL2Rpc3BhdGNoZXIuanMiLCIuLi9zcmMvc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzLmpzIiwiLi4vc3JjL3N0eWxlL3F1ZXJ5X2dlb21ldHJ5LmpzIiwiLi4vc3JjL3NvdXJjZS9sb2FkX3RpbGVqc29uLmpzIiwiLi4vc3JjL3NvdXJjZS90aWxlX2JvdW5kcy5qcyIsIi4uL3NyYy9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9yYXN0ZXJfdGlsZV9zb3VyY2UuanMiLCIuLi9zcmMvdXRpbC9vZmZzY3JlZW5fY2FudmFzX3N1cHBvcnRlZC5qcyIsIi4uL3NyYy9zb3VyY2UvcmFzdGVyX2RlbV90aWxlX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2UvZ2VvanNvbl9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL2ltYWdlX3NvdXJjZS5qcyIsIi4uL3NyYy9zb3VyY2UvdmlkZW9fc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9jYW52YXNfc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9jdXN0b21fc291cmNlLmpzIiwiLi4vc3JjL3NvdXJjZS9zb3VyY2UuanMiLCIuLi9zcmMvc291cmNlL3F1ZXJ5X2ZlYXR1cmVzLmpzIiwiLi4vc3JjL3V0aWwvYnJvd3Nlci93ZWJfd29ya2VyLmpzIiwiLi4vc3JjL3V0aWwvd29ya2VyX3Bvb2wuanMiLCIuLi9zcmMvdXRpbC9nbG9iYWxfd29ya2VyX3Bvb2wuanMiLCIuLi9zcmMvc3R5bGUtc3BlYy9kZXJlZi5qcyIsIi4uL3NyYy9zdHlsZS1zcGVjL2VtcHR5LmpzIiwiLi4vc3JjL3N0eWxlLXNwZWMvZGlmZi5qcyIsIi4uL3NyYy9zeW1ib2wvcGF0aF9pbnRlcnBvbGF0b3IuanMiLCIuLi9zcmMvc3ltYm9sL2dyaWRfaW5kZXguanMiLCIuLi9zcmMvc3ltYm9sL3Byb2plY3Rpb24uanMiLCIuLi9zcmMvc3ltYm9sL2NvbGxpc2lvbl9pbmRleC5qcyIsIi4uL3NyYy9nZW8vcHJvamVjdGlvbi9wcm9qZWN0aW9uX3V0aWwuanMiLCIuLi9zcmMvc3ltYm9sL3BsYWNlbWVudC5qcyIsIi4uL3NyYy9zdHlsZS9wYXVzZWFibGVfcGxhY2VtZW50LmpzIiwiLi4vc3JjL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleC5qcyIsIi4uL3NyYy9zdHlsZS9zdHlsZS5qcyIsIi4uL3NyYy9zaGFkZXJzL3NoYWRlcnMuanMiLCIuLi9zcmMvcmVuZGVyL3ZlcnRleF9hcnJheV9vYmplY3QuanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vaGlsbHNoYWRlX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfaGlsbHNoYWRlLmpzIiwiLi4vc3JjL3RlcnJhaW4vdGVycmFpbl9yYXN0ZXJfcHJvZ3JhbS5qcyIsIi4uL3NyYy90ZXJyYWluL2dsb2JlX3Jhc3Rlcl9wcm9ncmFtLmpzIiwiLi4vc3JjL3RlcnJhaW4vZHJhd190ZXJyYWluX3Jhc3Rlci5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9jbGlwcGluZ19tYXNrX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Jhc3Rlcl9mYWRlLmpzIiwiLi4vc3JjL3RlcnJhaW4vdGVycmFpbi5qcyIsIi4uL3NyYy9yZW5kZXIvZm9nLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3BhdHRlcm4uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vZmlsbF9leHRydXNpb25fcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9maWxsX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vY2lyY2xlX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vY29sbGlzaW9uX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vZGVidWdfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9oZWF0bWFwX3Byb2dyYW0uanMiLCIuLi9zcmMvcmVuZGVyL3Byb2dyYW0vbGluZV9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3Jhc3Rlcl9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3N5bWJvbF9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL2JhY2tncm91bmRfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9za3lib3hfcHJvZ3JhbS5qcyIsIi4uL3NyYy9yZW5kZXIvcHJvZ3JhbS9za3lib3hfY2FwdHVyZV9wcm9ncmFtLmpzIiwiLi4vc3JjL3JlbmRlci9wcm9ncmFtL3Byb2dyYW1fdW5pZm9ybXMuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfY29sbGlzaW9uX2RlYnVnLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X3N5bWJvbC5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19jaXJjbGUuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfaGVhdG1hcC5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19saW5lLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2ZpbGwuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfZmlsbF9leHRydXNpb24uanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfcmFzdGVyLmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X2JhY2tncm91bmQuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfZGVidWcuanMiLCIuLi9zcmMvcmVuZGVyL2RyYXdfY3VzdG9tLmpzIiwiLi4vc3JjL3JlbmRlci9za3lib3hfYXR0cmlidXRlcy5qcyIsIi4uL3NyYy9yZW5kZXIvc2t5Ym94X2dlb21ldHJ5LmpzIiwiLi4vc3JjL3JlbmRlci9kcmF3X3NreS5qcyIsIi4uL3NyYy9yZW5kZXIvZHJhd19hdG1vc3BoZXJlLmpzIiwiLi4vc3JjL3JlbmRlci9hdG1vc3BoZXJlX2F0dHJpYnV0ZXMuanMiLCIuLi9zcmMvcmVuZGVyL2F0bW9zcGhlcmVfYnVmZmVyLmpzIiwiLi4vc3JjL3JlbmRlci9wYWludGVyLmpzIiwiLi4vc3JjL2dlby9lZGdlX2luc2V0cy5qcyIsIi4uL3NyYy91aS9mcmVlX2NhbWVyYS5qcyIsIi4uL3NyYy9nZW8vcHJvamVjdGlvbi9hZGp1c3RtZW50cy5qcyIsIi4uL3NyYy9nZW8vdHJhbnNmb3JtLmpzIiwiLi4vc3JjL3V0aWwvdGhyb3R0bGUuanMiLCIuLi9zcmMvdWkvaGFzaC5qcyIsIi4uL3NyYy91aS9oYW5kbGVyX2luZXJ0aWEuanMiLCIuLi9zcmMvdWkvZXZlbnRzLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvbWFwX2V2ZW50LmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvYm94X3pvb20uanMiLCIuLi9zcmMvdWkvaGFuZGxlci9oYW5kbGVyX3V0aWwuanMiLCIuLi9zcmMvdWkvaGFuZGxlci90YXBfcmVjb2duaXplci5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL3RhcF96b29tLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvbW91c2UuanMiLCIuLi9zcmMvdWkvaGFuZGxlci90b3VjaF9wYW4uanMiLCIuLi9zcmMvdWkvaGFuZGxlci90b3VjaF96b29tX3JvdGF0ZS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL2tleWJvYXJkLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvc2Nyb2xsX3pvb20uanMiLCIuLi9zcmMvdWkvaGFuZGxlci9zaGltL2RibGNsaWNrX3pvb20uanMiLCIuLi9zcmMvdWkvaGFuZGxlci9jbGlja196b29tLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvdGFwX2RyYWdfem9vbS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyL3NoaW0vZHJhZ19wYW4uanMiLCIuLi9zcmMvdWkvaGFuZGxlci9zaGltL2RyYWdfcm90YXRlLmpzIiwiLi4vc3JjL3VpL2hhbmRsZXIvc2hpbS90b3VjaF96b29tX3JvdGF0ZS5qcyIsIi4uL3NyYy91aS9oYW5kbGVyX21hbmFnZXIuanMiLCIuLi9zcmMvdWkvY2FtZXJhLmpzIiwiLi4vc3JjL3VpL2NvbnRyb2wvYXR0cmlidXRpb25fY29udHJvbC5qcyIsIi4uL3NyYy91aS9jb250cm9sL2xvZ29fY29udHJvbC5qcyIsIi4uL3NyYy91dGlsL3Rhc2tfcXVldWUuanMiLCIuLi9zcmMvdXRpbC9zbWFydF93cmFwLmpzIiwiLi4vc3JjL3VpL2FuY2hvci5qcyIsIi4uL3NyYy91aS9tYXJrZXIuanMiLCIuLi9zcmMvdXRpbC9lYXNlZF92YXJpYWJsZS5qcyIsIi4uL3NyYy91aS9kZWZhdWx0X2xvY2FsZS5qcyIsIi4uL3NyYy91aS9tYXAuanMiLCIuLi9zcmMvdWkvY29udHJvbC9uYXZpZ2F0aW9uX2NvbnRyb2wuanMiLCIuLi9zcmMvdWkvY29udHJvbC9nZW9sb2NhdGVfY29udHJvbC5qcyIsIi4uL3NyYy91aS9jb250cm9sL3NjYWxlX2NvbnRyb2wuanMiLCIuLi9zcmMvdWkvY29udHJvbC9mdWxsc2NyZWVuX2NvbnRyb2wuanMiLCIuLi9zcmMvdWkvcG9wdXAuanMiLCIuLi9zcmMvdXRpbC93b3JrZXJfcGVyZm9ybWFuY2VfdXRpbHMuanMiLCIuLi9zcmMvaW5kZXguanMiLCIuLi9yb2xsdXAvbWFwYm94Z2wuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcbi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuaW1wb3J0IHR5cGUge1dpbmRvd30gZnJvbSAnLi4vLi4vdHlwZXMvd2luZG93LmpzJztcblxuLy8gc2hpbSB3aW5kb3cgZm9yIHRoZSBjYXNlIG9mIHJlcXVpcmluZyB0aGUgYnJvd3NlciBidW5kbGUgaW4gTm9kZVxuZXhwb3J0IGRlZmF1bHQgKCh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDogKHt9OiBhbnkpKTogV2luZG93KTtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gKiBhcmUgbWV0OlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUlxuICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1JcbiAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLFxuICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLFxuICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZXG4gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqXG4gKiBQb3J0ZWQgZnJvbSBXZWJraXRcbiAqIGh0dHA6Ly9zdm4ud2Via2l0Lm9yZy9yZXBvc2l0b3J5L3dlYmtpdC90cnVuay9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Vbml0QmV6aWVyLmhcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaXRCZXppZXI7XG5cbmZ1bmN0aW9uIFVuaXRCZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KSB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cywgaW1wbGljaXQgZmlyc3QgYW5kIGxhc3QgY29udHJvbCBwb2ludHMgYXJlICgwLDApIGFuZCAoMSwxKS5cbiAgICB0aGlzLmN4ID0gMy4wICogcDF4O1xuICAgIHRoaXMuYnggPSAzLjAgKiAocDJ4IC0gcDF4KSAtIHRoaXMuY3g7XG4gICAgdGhpcy5heCA9IDEuMCAtIHRoaXMuY3ggLSB0aGlzLmJ4O1xuXG4gICAgdGhpcy5jeSA9IDMuMCAqIHAxeTtcbiAgICB0aGlzLmJ5ID0gMy4wICogKHAyeSAtIHAxeSkgLSB0aGlzLmN5O1xuICAgIHRoaXMuYXkgPSAxLjAgLSB0aGlzLmN5IC0gdGhpcy5ieTtcblxuICAgIHRoaXMucDF4ID0gcDF4O1xuICAgIHRoaXMucDF5ID0gcDJ5O1xuICAgIHRoaXMucDJ4ID0gcDJ4O1xuICAgIHRoaXMucDJ5ID0gcDJ5O1xufVxuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVggPSBmdW5jdGlvbih0KSB7XG4gICAgLy8gYGF4IHReMyArIGJ4IHReMiArIGN4IHQnIGV4cGFuZGVkIHVzaW5nIEhvcm5lcidzIHJ1bGUuXG4gICAgcmV0dXJuICgodGhpcy5heCAqIHQgKyB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVkgPSBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuICgodGhpcy5heSAqIHQgKyB0aGlzLmJ5KSAqIHQgKyB0aGlzLmN5KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYID0gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiAoMy4wICogdGhpcy5heCAqIHQgKyAyLjAgKiB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4O1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc29sdmVDdXJ2ZVggPSBmdW5jdGlvbih4LCBlcHNpbG9uKSB7XG4gICAgaWYgKHR5cGVvZiBlcHNpbG9uID09PSAndW5kZWZpbmVkJykgZXBzaWxvbiA9IDFlLTY7XG5cbiAgICB2YXIgdDAsIHQxLCB0MiwgeDIsIGk7XG5cbiAgICAvLyBGaXJzdCB0cnkgYSBmZXcgaXRlcmF0aW9ucyBvZiBOZXd0b24ncyBtZXRob2QgLS0gbm9ybWFsbHkgdmVyeSBmYXN0LlxuICAgIGZvciAodDIgPSB4LCBpID0gMDsgaSA8IDg7IGkrKykge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpIC0geDtcbiAgICAgICAgaWYgKE1hdGguYWJzKHgyKSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICB2YXIgZDIgPSB0aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoZDIpIDwgMWUtNikgYnJlYWs7XG5cbiAgICAgICAgdDIgPSB0MiAtIHgyIC8gZDI7XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBiaXNlY3Rpb24gbWV0aG9kIGZvciByZWxpYWJpbGl0eS5cbiAgICB0MCA9IDAuMDtcbiAgICB0MSA9IDEuMDtcbiAgICB0MiA9IHg7XG5cbiAgICBpZiAodDIgPCB0MCkgcmV0dXJuIHQwO1xuICAgIGlmICh0MiA+IHQxKSByZXR1cm4gdDE7XG5cbiAgICB3aGlsZSAodDAgPCB0MSkge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoeDIgLSB4KSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICBpZiAoeCA+IHgyKSB7XG4gICAgICAgICAgICB0MCA9IHQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdDEgPSB0MjtcbiAgICAgICAgfVxuXG4gICAgICAgIHQyID0gKHQxIC0gdDApICogMC41ICsgdDA7XG4gICAgfVxuXG4gICAgLy8gRmFpbHVyZS5cbiAgICByZXR1cm4gdDI7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uKHgsIGVwc2lsb24pIHtcbiAgICByZXR1cm4gdGhpcy5zYW1wbGVDdXJ2ZVkodGhpcy5zb2x2ZUN1cnZlWCh4LCBlcHNpbG9uKSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvaW50O1xuXG4vKipcbiAqIEEgc3RhbmRhbG9uZSBwb2ludCBnZW9tZXRyeSB3aXRoIHVzZWZ1bCBhY2Nlc3NvciwgY29tcGFyaXNvbiwgYW5kXG4gKiBtb2RpZmljYXRpb24gbWV0aG9kcy5cbiAqXG4gKiBAY2xhc3MgUG9pbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IHRoZSB4LWNvb3JkaW5hdGUuIHRoaXMgY291bGQgYmUgbG9uZ2l0dWRlIG9yIHNjcmVlblxuICogcGl4ZWxzLCBvciBhbnkgb3RoZXIgc29ydCBvZiB1bml0LlxuICogQHBhcmFtIHtOdW1iZXJ9IHkgdGhlIHktY29vcmRpbmF0ZS4gdGhpcyBjb3VsZCBiZSBsYXRpdHVkZSBvciBzY3JlZW5cbiAqIHBpeGVscywgb3IgYW55IG90aGVyIHNvcnQgb2YgdW5pdC5cbiAqIEBleGFtcGxlXG4gKiB2YXIgcG9pbnQgPSBuZXcgUG9pbnQoLTc3LCAzOCk7XG4gKi9cbmZ1bmN0aW9uIFBvaW50KHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG59XG5cblBvaW50LnByb3RvdHlwZSA9IHtcblxuICAgIC8qKlxuICAgICAqIENsb25lIHRoaXMgcG9pbnQsIHJldHVybmluZyBhIG5ldyBwb2ludCB0aGF0IGNhbiBiZSBtb2RpZmllZFxuICAgICAqIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvbGQgb25lLlxuICAgICAqIEByZXR1cm4ge1BvaW50fSB0aGUgY2xvbmVcbiAgICAgKi9cbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpOyB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyB0byBhbm90aGVyIHBvaW50LFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIGFkZDogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fYWRkKHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogU3VidHJhY3QgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIHRvIGZyb20gcG9pbnQsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgc3ViOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIocCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgYnkgcG9pbnQsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0aGUgb3RoZXIgcG9pbnRcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgbXVsdEJ5UG9pbnQ6ICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdEJ5UG9pbnQocCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBEaXZpZGUgdGhpcyBwb2ludCdzIHggJiB5IGNvb3JkaW5hdGVzIGJ5IHBvaW50LFxuICAgICAqIHlpZWxkaW5nIGEgbmV3IHBvaW50LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIGRpdkJ5UG9pbnQ6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2RpdkJ5UG9pbnQocCk7IH0sXG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0aGlzIHBvaW50J3MgeCAmIHkgY29vcmRpbmF0ZXMgYnkgYSBmYWN0b3IsXG4gICAgICogeWllbGRpbmcgYSBuZXcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtQb2ludH0gayBmYWN0b3JcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgbXVsdDogICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9tdWx0KGspOyB9LFxuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHRoaXMgcG9pbnQncyB4ICYgeSBjb29yZGluYXRlcyBieSBhIGZhY3RvcixcbiAgICAgKiB5aWVsZGluZyBhIG5ldyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBrIGZhY3RvclxuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICBkaXY6ICAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2RpdihrKTsgfSxcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSB0aGlzIHBvaW50IGFyb3VuZCB0aGUgMCwgMCBvcmlnaW4gYnkgYW4gYW5nbGUgYSxcbiAgICAgKiBnaXZlbiBpbiByYWRpYW5zXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGEgYW5nbGUgdG8gcm90YXRlIGFyb3VuZCwgaW4gcmFkaWFuc1xuICAgICAqIEByZXR1cm4ge1BvaW50fSBvdXRwdXQgcG9pbnRcbiAgICAgKi9cbiAgICByb3RhdGU6ICBmdW5jdGlvbihhKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZShhKTsgfSxcblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZSB0aGlzIHBvaW50IGFyb3VuZCBwIHBvaW50IGJ5IGFuIGFuZ2xlIGEsXG4gICAgICogZ2l2ZW4gaW4gcmFkaWFuc1xuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBhIGFuZ2xlIHRvIHJvdGF0ZSBhcm91bmQsIGluIHJhZGlhbnNcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIFBvaW50IHRvIHJvdGF0ZSBhcm91bmRcbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gb3V0cHV0IHBvaW50XG4gICAgICovXG4gICAgcm90YXRlQXJvdW5kOiAgZnVuY3Rpb24oYSxwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdGF0ZUFyb3VuZChhLHApOyB9LFxuXG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhpcyBwb2ludCBieSBhIDR4MSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhcbiAgICAgKiBAcGFyYW0ge0FycmF5PE51bWJlcj59IG0gdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgICogQHJldHVybiB7UG9pbnR9IG91dHB1dCBwb2ludFxuICAgICAqL1xuICAgIG1hdE11bHQ6IGZ1bmN0aW9uKG0pIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbWF0TXVsdChtKTsgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGlzIHBvaW50IGJ1dCBhcyBhIHVuaXQgdmVjdG9yIGZyb20gMCwgMCwgbWVhbmluZ1xuICAgICAqIHRoYXQgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHJlc3VsdGluZyBwb2ludCB0byB0aGUgMCwgMFxuICAgICAqIGNvb3JkaW5hdGUgd2lsbCBiZSBlcXVhbCB0byAxIGFuZCB0aGUgYW5nbGUgZnJvbSB0aGUgcmVzdWx0aW5nXG4gICAgICogcG9pbnQgdG8gdGhlIDAsIDAgY29vcmRpbmF0ZSB3aWxsIGJlIHRoZSBzYW1lIGFzIGJlZm9yZS5cbiAgICAgKiBAcmV0dXJuIHtQb2ludH0gdW5pdCB2ZWN0b3IgcG9pbnRcbiAgICAgKi9cbiAgICB1bml0OiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fdW5pdCgpOyB9LFxuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSBhIHBlcnBlbmRpY3VsYXIgcG9pbnQsIHdoZXJlIHRoZSBuZXcgeSBjb29yZGluYXRlXG4gICAgICogaXMgdGhlIG9sZCB4IGNvb3JkaW5hdGUgYW5kIHRoZSBuZXcgeCBjb29yZGluYXRlIGlzIHRoZSBvbGQgeVxuICAgICAqIGNvb3JkaW5hdGUgbXVsdGlwbGllZCBieSAtMVxuICAgICAqIEByZXR1cm4ge1BvaW50fSBwZXJwZW5kaWN1bGFyIHBvaW50XG4gICAgICovXG4gICAgcGVycDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3BlcnAoKTsgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHZlcnNpb24gb2YgdGhpcyBwb2ludCB3aXRoIHRoZSB4ICYgeSBjb29yZGluYXRlc1xuICAgICAqIHJvdW5kZWQgdG8gaW50ZWdlcnMuXG4gICAgICogQHJldHVybiB7UG9pbnR9IHJvdW5kZWQgcG9pbnRcbiAgICAgKi9cbiAgICByb3VuZDogICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm91bmQoKTsgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbWFnaXR1ZGUgb2YgdGhpcyBwb2ludDogdGhpcyBpcyB0aGUgRXVjbGlkZWFuXG4gICAgICogZGlzdGFuY2UgZnJvbSB0aGUgMCwgMCBjb29yZGluYXRlIHRvIHRoaXMgcG9pbnQncyB4IGFuZCB5XG4gICAgICogY29vcmRpbmF0ZXMuXG4gICAgICogQHJldHVybiB7TnVtYmVyfSBtYWduaXR1ZGVcbiAgICAgKi9cbiAgICBtYWc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEp1ZGdlIHdoZXRoZXIgdGhpcyBwb2ludCBpcyBlcXVhbCB0byBhbm90aGVyIHBvaW50LCByZXR1cm5pbmdcbiAgICAgKiB0cnVlIG9yIGZhbHNlLlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IG90aGVyIHRoZSBvdGhlciBwb2ludFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHBvaW50cyBhcmUgZXF1YWxcbiAgICAgKi9cbiAgICBlcXVhbHM6IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnggPT09IG90aGVyLnggJiZcbiAgICAgICAgICAgICAgIHRoaXMueSA9PT0gb3RoZXIueTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoaXMgcG9pbnQgdG8gYW5vdGhlciBwb2ludFxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7TnVtYmVyfSBkaXN0YW5jZVxuICAgICAqL1xuICAgIGRpc3Q6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RTcXIocCkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBwb2ludCB0byBhbm90aGVyIHBvaW50LFxuICAgICAqIHdpdGhvdXQgdGhlIHNxdWFyZSByb290IHN0ZXAuIFVzZWZ1bCBpZiB5b3UncmUgY29tcGFyaW5nXG4gICAgICogcmVsYXRpdmUgZGlzdGFuY2VzLlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7TnVtYmVyfSBkaXN0YW5jZVxuICAgICAqL1xuICAgIGRpc3RTcXI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdmFyIGR4ID0gcC54IC0gdGhpcy54LFxuICAgICAgICAgICAgZHkgPSBwLnkgLSB0aGlzLnk7XG4gICAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBhbmdsZSBmcm9tIHRoZSAwLCAwIGNvb3JkaW5hdGUgdG8gdGhpcyBwb2ludCwgaW4gcmFkaWFuc1xuICAgICAqIGNvb3JkaW5hdGVzLlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAgICAgKi9cbiAgICBhbmdsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSwgdGhpcy54KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBhbmdsZSBmcm9tIHRoaXMgcG9pbnQgdG8gYW5vdGhlciBwb2ludCwgaW4gcmFkaWFuc1xuICAgICAqIEBwYXJhbSB7UG9pbnR9IGIgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICAgICAqL1xuICAgIGFuZ2xlVG86IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55IC0gYi55LCB0aGlzLnggLSBiLngpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFuZ2xlIGJldHdlZW4gdGhpcyBwb2ludCBhbmQgYW5vdGhlciBwb2ludCwgaW4gcmFkaWFuc1xuICAgICAqIEBwYXJhbSB7UG9pbnR9IGIgdGhlIG90aGVyIHBvaW50XG4gICAgICogQHJldHVybiB7TnVtYmVyfSBhbmdsZVxuICAgICAqL1xuICAgIGFuZ2xlV2l0aDogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmdsZVdpdGhTZXAoYi54LCBiLnkpO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEZpbmQgdGhlIGFuZ2xlIG9mIHRoZSB0d28gdmVjdG9ycywgc29sdmluZyB0aGUgZm9ybXVsYSBmb3JcbiAgICAgKiB0aGUgY3Jvc3MgcHJvZHVjdCBhIHggYiA9IHxhfHxifHNpbijOuCkgZm9yIM64LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4IHRoZSB4LWNvb3JkaW5hdGVcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geSB0aGUgeS1jb29yZGluYXRlXG4gICAgICogQHJldHVybiB7TnVtYmVyfSB0aGUgYW5nbGUgaW4gcmFkaWFuc1xuICAgICAqL1xuICAgIGFuZ2xlV2l0aFNlcDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMihcbiAgICAgICAgICAgIHRoaXMueCAqIHkgLSB0aGlzLnkgKiB4LFxuICAgICAgICAgICAgdGhpcy54ICogeCArIHRoaXMueSAqIHkpO1xuICAgIH0sXG5cbiAgICBfbWF0TXVsdDogZnVuY3Rpb24obSkge1xuICAgICAgICB2YXIgeCA9IG1bMF0gKiB0aGlzLnggKyBtWzFdICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IG1bMl0gKiB0aGlzLnggKyBtWzNdICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2FkZDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggKz0gcC54O1xuICAgICAgICB0aGlzLnkgKz0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3N1YjogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggLT0gcC54O1xuICAgICAgICB0aGlzLnkgLT0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX211bHQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54ICo9IGs7XG4gICAgICAgIHRoaXMueSAqPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2RpdjogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggLz0gaztcbiAgICAgICAgdGhpcy55IC89IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfbXVsdEJ5UG9pbnQ6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdGhpcy54ICo9IHAueDtcbiAgICAgICAgdGhpcy55ICo9IHAueTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9kaXZCeVBvaW50OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAvPSBwLng7XG4gICAgICAgIHRoaXMueSAvPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfdW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX2Rpdih0aGlzLm1hZygpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9wZXJwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XG4gICAgICAgIHRoaXMueSA9IHRoaXMueDtcbiAgICAgICAgdGhpcy54ID0gLXk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm90YXRlOiBmdW5jdGlvbihhbmdsZSkge1xuICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgeCA9IGNvcyAqIHRoaXMueCAtIHNpbiAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBzaW4gKiB0aGlzLnggKyBjb3MgKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm90YXRlQXJvdW5kOiBmdW5jdGlvbihhbmdsZSwgcCkge1xuICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgeCA9IHAueCArIGNvcyAqICh0aGlzLnggLSBwLngpIC0gc2luICogKHRoaXMueSAtIHAueSksXG4gICAgICAgICAgICB5ID0gcC55ICsgc2luICogKHRoaXMueCAtIHAueCkgKyBjb3MgKiAodGhpcy55IC0gcC55KTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3VuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KTtcbiAgICAgICAgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59O1xuXG4vKipcbiAqIENvbnN0cnVjdCBhIHBvaW50IGZyb20gYW4gYXJyYXkgaWYgbmVjZXNzYXJ5LCBvdGhlcndpc2UgaWYgdGhlIGlucHV0XG4gKiBpcyBhbHJlYWR5IGEgUG9pbnQsIG9yIGFuIHVua25vd24gdHlwZSwgcmV0dXJuIGl0IHVuY2hhbmdlZFxuICogQHBhcmFtIHtBcnJheTxOdW1iZXI+fFBvaW50fCp9IGEgYW55IGtpbmQgb2YgaW5wdXQgdmFsdWVcbiAqIEByZXR1cm4ge1BvaW50fSBjb25zdHJ1Y3RlZCBwb2ludCwgb3IgcGFzc2VkLXRocm91Z2ggdmFsdWUuXG4gKiBAZXhhbXBsZVxuICogLy8gdGhpc1xuICogdmFyIHBvaW50ID0gUG9pbnQuY29udmVydChbMCwgMV0pO1xuICogLy8gaXMgZXF1aXZhbGVudCB0b1xuICogdmFyIHBvaW50ID0gbmV3IFBvaW50KDAsIDEpO1xuICovXG5Qb2ludC5jb252ZXJ0ID0gZnVuY3Rpb24gKGEpIHtcbiAgICBpZiAoYSBpbnN0YW5jZW9mIFBvaW50KSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KGFbMF0sIGFbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbn07XG4iLCIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb2JqZWN0QXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBjb21wYXJlIGFuZCBpc0J1ZmZlciB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2Jsb2IvNjgwZTllNWU0ODhmMjJhYWMyNzU5OWE1N2RjODQ0YTYzMTU5MjhkZC9pbmRleC5qc1xuLy8gb3JpZ2luYWwgbm90aWNlOlxuXG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciB4ID0gYS5sZW5ndGg7XG4gIHZhciB5ID0gYi5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV07XG4gICAgICB5ID0gYltpXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoeSA8IHgpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGlzQnVmZmVyKGIpIHtcbiAgaWYgKGdsb2JhbC5CdWZmZXIgJiYgdHlwZW9mIGdsb2JhbC5CdWZmZXIuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihiKTtcbiAgfVxuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKTtcbn1cblxuLy8gYmFzZWQgb24gbm9kZSBhc3NlcnQsIG9yaWdpbmFsIG5vdGljZTpcbi8vIE5COiBUaGUgVVJMIHRvIHRoZSBDb21tb25KUyBzcGVjIGlzIGtlcHQganVzdCBmb3IgdHJhZGl0aW9uLlxuLy8gICAgIG5vZGUtYXNzZXJ0IGhhcyBldm9sdmVkIGEgbG90IHNpbmNlIHRoZW4sIGJvdGggaW4gQVBJIGFuZCBiZWhhdmlvci5cblxuLy8gaHR0cDovL3dpa2kuY29tbW9uanMub3JnL3dpa2kvVW5pdF9UZXN0aW5nLzEuMFxuLy9cbi8vIFRISVMgSVMgTk9UIFRFU1RFRCBOT1IgTElLRUxZIFRPIFdPUksgT1VUU0lERSBWOCFcbi8vXG4vLyBPcmlnaW5hbGx5IGZyb20gbmFyd2hhbC5qcyAoaHR0cDovL25hcndoYWxqcy5vcmcpXG4vLyBDb3B5cmlnaHQgKGMpIDIwMDkgVGhvbWFzIFJvYmluc29uIDwyODBub3J0aC5jb20+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgJ1NvZnR3YXJlJyksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTlxuLy8gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbC8nKTtcbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHBTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBmdW5jdGlvbnNIYXZlTmFtZXMgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZm9vKCkge30ubmFtZSA9PT0gJ2Zvbyc7XG59KCkpO1xuZnVuY3Rpb24gcFRvU3RyaW5nIChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xufVxuZnVuY3Rpb24gaXNWaWV3KGFycmJ1Zikge1xuICBpZiAoaXNCdWZmZXIoYXJyYnVmKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIGdsb2JhbC5BcnJheUJ1ZmZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoYXJyYnVmKTtcbiAgfVxuICBpZiAoIWFycmJ1Zikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYXJyYnVmIGluc3RhbmNlb2YgRGF0YVZpZXcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYXJyYnVmLmJ1ZmZlciAmJiBhcnJidWYuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4vLyAxLiBUaGUgYXNzZXJ0IG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgdGhhdCB0aHJvd1xuLy8gQXNzZXJ0aW9uRXJyb3IncyB3aGVuIHBhcnRpY3VsYXIgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4gVGhlXG4vLyBhc3NlcnQgbW9kdWxlIG11c3QgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIGludGVyZmFjZS5cblxudmFyIGFzc2VydCA9IG1vZHVsZS5leHBvcnRzID0gb2s7XG5cbi8vIDIuIFRoZSBBc3NlcnRpb25FcnJvciBpcyBkZWZpbmVkIGluIGFzc2VydC5cbi8vIG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IoeyBtZXNzYWdlOiBtZXNzYWdlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogYWN0dWFsLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBleHBlY3RlZCB9KVxuXG52YXIgcmVnZXggPSAvXFxzKmZ1bmN0aW9uXFxzKyhbXlxcKFxcc10qKVxccyovO1xuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9mdW5jdGlvbi5wcm90b3R5cGUubmFtZS9ibG9iL2FkZWVlZWM4YmZjYzYwNjhiMTg3ZDdkOWZiM2Q1YmIxZDNhMzA4OTkvaW1wbGVtZW50YXRpb24uanNcbmZ1bmN0aW9uIGdldE5hbWUoZnVuYykge1xuICBpZiAoIXV0aWwuaXNGdW5jdGlvbihmdW5jKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzKSB7XG4gICAgcmV0dXJuIGZ1bmMubmFtZTtcbiAgfVxuICB2YXIgc3RyID0gZnVuYy50b1N0cmluZygpO1xuICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2gocmVnZXgpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG59XG5hc3NlcnQuQXNzZXJ0aW9uRXJyb3IgPSBmdW5jdGlvbiBBc3NlcnRpb25FcnJvcihvcHRpb25zKSB7XG4gIHRoaXMubmFtZSA9ICdBc3NlcnRpb25FcnJvcic7XG4gIHRoaXMuYWN0dWFsID0gb3B0aW9ucy5hY3R1YWw7XG4gIHRoaXMuZXhwZWN0ZWQgPSBvcHRpb25zLmV4cGVjdGVkO1xuICB0aGlzLm9wZXJhdG9yID0gb3B0aW9ucy5vcGVyYXRvcjtcbiAgaWYgKG9wdGlvbnMubWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBnZXRNZXNzYWdlKHRoaXMpO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0YWNrU3RhcnRGdW5jdGlvbiA9IG9wdGlvbnMuc3RhY2tTdGFydEZ1bmN0aW9uIHx8IGZhaWw7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm9uIHY4IGJyb3dzZXJzIHNvIHdlIGNhbiBoYXZlIGEgc3RhY2t0cmFjZVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICB2YXIgb3V0ID0gZXJyLnN0YWNrO1xuXG4gICAgICAvLyB0cnkgdG8gc3RyaXAgdXNlbGVzcyBmcmFtZXNcbiAgICAgIHZhciBmbl9uYW1lID0gZ2V0TmFtZShzdGFja1N0YXJ0RnVuY3Rpb24pO1xuICAgICAgdmFyIGlkeCA9IG91dC5pbmRleE9mKCdcXG4nICsgZm5fbmFtZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgLy8gb25jZSB3ZSBoYXZlIGxvY2F0ZWQgdGhlIGZ1bmN0aW9uIGZyYW1lXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RyaXAgb3V0IGV2ZXJ5dGhpbmcgYmVmb3JlIGl0IChhbmQgaXRzIGxpbmUpXG4gICAgICAgIHZhciBuZXh0X2xpbmUgPSBvdXQuaW5kZXhPZignXFxuJywgaWR4ICsgMSk7XG4gICAgICAgIG91dCA9IG91dC5zdWJzdHJpbmcobmV4dF9saW5lICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhY2sgPSBvdXQ7XG4gICAgfVxuICB9XG59O1xuXG4vLyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IgaW5zdGFuY2VvZiBFcnJvclxudXRpbC5pbmhlcml0cyhhc3NlcnQuQXNzZXJ0aW9uRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gdHJ1bmNhdGUocywgbikge1xuICBpZiAodHlwZW9mIHMgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoIDwgbiA/IHMgOiBzLnNsaWNlKDAsIG4pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzO1xuICB9XG59XG5mdW5jdGlvbiBpbnNwZWN0KHNvbWV0aGluZykge1xuICBpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzIHx8ICF1dGlsLmlzRnVuY3Rpb24oc29tZXRoaW5nKSkge1xuICAgIHJldHVybiB1dGlsLmluc3BlY3Qoc29tZXRoaW5nKTtcbiAgfVxuICB2YXIgcmF3bmFtZSA9IGdldE5hbWUoc29tZXRoaW5nKTtcbiAgdmFyIG5hbWUgPSByYXduYW1lID8gJzogJyArIHJhd25hbWUgOiAnJztcbiAgcmV0dXJuICdbRnVuY3Rpb24nICsgIG5hbWUgKyAnXSc7XG59XG5mdW5jdGlvbiBnZXRNZXNzYWdlKHNlbGYpIHtcbiAgcmV0dXJuIHRydW5jYXRlKGluc3BlY3Qoc2VsZi5hY3R1YWwpLCAxMjgpICsgJyAnICtcbiAgICAgICAgIHNlbGYub3BlcmF0b3IgKyAnICcgK1xuICAgICAgICAgdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmV4cGVjdGVkKSwgMTI4KTtcbn1cblxuLy8gQXQgcHJlc2VudCBvbmx5IHRoZSB0aHJlZSBrZXlzIG1lbnRpb25lZCBhYm92ZSBhcmUgdXNlZCBhbmRcbi8vIHVuZGVyc3Rvb2QgYnkgdGhlIHNwZWMuIEltcGxlbWVudGF0aW9ucyBvciBzdWIgbW9kdWxlcyBjYW4gcGFzc1xuLy8gb3RoZXIga2V5cyB0byB0aGUgQXNzZXJ0aW9uRXJyb3IncyBjb25zdHJ1Y3RvciAtIHRoZXkgd2lsbCBiZVxuLy8gaWdub3JlZC5cblxuLy8gMy4gQWxsIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG11c3QgdGhyb3cgYW4gQXNzZXJ0aW9uRXJyb3Jcbi8vIHdoZW4gYSBjb3JyZXNwb25kaW5nIGNvbmRpdGlvbiBpcyBub3QgbWV0LCB3aXRoIGEgbWVzc2FnZSB0aGF0XG4vLyBtYXkgYmUgdW5kZWZpbmVkIGlmIG5vdCBwcm92aWRlZC4gIEFsbCBhc3NlcnRpb24gbWV0aG9kcyBwcm92aWRlXG4vLyBib3RoIHRoZSBhY3R1YWwgYW5kIGV4cGVjdGVkIHZhbHVlcyB0byB0aGUgYXNzZXJ0aW9uIGVycm9yIGZvclxuLy8gZGlzcGxheSBwdXJwb3Nlcy5cblxuZnVuY3Rpb24gZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvciwgc3RhY2tTdGFydEZ1bmN0aW9uKSB7XG4gIHRocm93IG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3Ioe1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgYWN0dWFsOiBhY3R1YWwsXG4gICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuICAgIG9wZXJhdG9yOiBvcGVyYXRvcixcbiAgICBzdGFja1N0YXJ0RnVuY3Rpb246IHN0YWNrU3RhcnRGdW5jdGlvblxuICB9KTtcbn1cblxuLy8gRVhURU5TSU9OISBhbGxvd3MgZm9yIHdlbGwgYmVoYXZlZCBlcnJvcnMgZGVmaW5lZCBlbHNld2hlcmUuXG5hc3NlcnQuZmFpbCA9IGZhaWw7XG5cbi8vIDQuIFB1cmUgYXNzZXJ0aW9uIHRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyB0cnV0aHksIGFzIGRldGVybWluZWRcbi8vIGJ5ICEhZ3VhcmQuXG4vLyBhc3NlcnQub2soZ3VhcmQsIG1lc3NhZ2Vfb3B0KTtcbi8vIFRoaXMgc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8gYXNzZXJ0LmVxdWFsKHRydWUsICEhZ3VhcmQsXG4vLyBtZXNzYWdlX29wdCk7LiBUbyB0ZXN0IHN0cmljdGx5IGZvciB0aGUgdmFsdWUgdHJ1ZSwgdXNlXG4vLyBhc3NlcnQuc3RyaWN0RXF1YWwodHJ1ZSwgZ3VhcmQsIG1lc3NhZ2Vfb3B0KTsuXG5cbmZ1bmN0aW9uIG9rKHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIGZhaWwodmFsdWUsIHRydWUsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5vayk7XG59XG5hc3NlcnQub2sgPSBvaztcblxuLy8gNS4gVGhlIGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzaGFsbG93LCBjb2VyY2l2ZSBlcXVhbGl0eSB3aXRoXG4vLyA9PS5cbi8vIGFzc2VydC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5lcXVhbCA9IGZ1bmN0aW9uIGVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPSBleHBlY3RlZCkgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT0nLCBhc3NlcnQuZXF1YWwpO1xufTtcblxuLy8gNi4gVGhlIG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbFxuLy8gd2l0aCAhPSBhc3NlcnQubm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RXF1YWwgPSBmdW5jdGlvbiBub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICchPScsIGFzc2VydC5ub3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDcuIFRoZSBlcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgYSBkZWVwIGVxdWFsaXR5IHJlbGF0aW9uLlxuLy8gYXNzZXJ0LmRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5kZWVwRXF1YWwgPSBmdW5jdGlvbiBkZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoIV9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnZGVlcEVxdWFsJywgYXNzZXJ0LmRlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5kZWVwU3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBkZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoIV9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwU3RyaWN0RXF1YWwnLCBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKSB7XG4gIC8vIDcuMS4gQWxsIGlkZW50aWNhbCB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGFzIGRldGVybWluZWQgYnkgPT09LlxuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgJiYgaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUoYWN0dWFsLCBleHBlY3RlZCkgPT09IDA7XG5cbiAgLy8gNy4yLiBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBEYXRlIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBEYXRlIG9iamVjdCB0aGF0IHJlZmVycyB0byB0aGUgc2FtZSB0aW1lLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNEYXRlKGFjdHVhbCkgJiYgdXRpbC5pc0RhdGUoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5nZXRUaW1lKCkgPT09IGV4cGVjdGVkLmdldFRpbWUoKTtcblxuICAvLyA3LjMgSWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBSZWdFeHAgb2JqZWN0IHdpdGggdGhlIHNhbWUgc291cmNlIGFuZFxuICAvLyBwcm9wZXJ0aWVzIChgZ2xvYmFsYCwgYG11bHRpbGluZWAsIGBsYXN0SW5kZXhgLCBgaWdub3JlQ2FzZWApLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNSZWdFeHAoYWN0dWFsKSAmJiB1dGlsLmlzUmVnRXhwKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuc291cmNlID09PSBleHBlY3RlZC5zb3VyY2UgJiZcbiAgICAgICAgICAgYWN0dWFsLmdsb2JhbCA9PT0gZXhwZWN0ZWQuZ2xvYmFsICYmXG4gICAgICAgICAgIGFjdHVhbC5tdWx0aWxpbmUgPT09IGV4cGVjdGVkLm11bHRpbGluZSAmJlxuICAgICAgICAgICBhY3R1YWwubGFzdEluZGV4ID09PSBleHBlY3RlZC5sYXN0SW5kZXggJiZcbiAgICAgICAgICAgYWN0dWFsLmlnbm9yZUNhc2UgPT09IGV4cGVjdGVkLmlnbm9yZUNhc2U7XG5cbiAgLy8gNy40LiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKChhY3R1YWwgPT09IG51bGwgfHwgdHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcpICYmXG4gICAgICAgICAgICAgKGV4cGVjdGVkID09PSBudWxsIHx8IHR5cGVvZiBleHBlY3RlZCAhPT0gJ29iamVjdCcpKSB7XG4gICAgcmV0dXJuIHN0cmljdCA/IGFjdHVhbCA9PT0gZXhwZWN0ZWQgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG5cbiAgLy8gSWYgYm90aCB2YWx1ZXMgYXJlIGluc3RhbmNlcyBvZiB0eXBlZCBhcnJheXMsIHdyYXAgdGhlaXIgdW5kZXJseWluZ1xuICAvLyBBcnJheUJ1ZmZlcnMgaW4gYSBCdWZmZXIgZWFjaCB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZVxuICAvLyBUaGlzIG9wdGltaXphdGlvbiByZXF1aXJlcyB0aGUgYXJyYXlzIHRvIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjaGVja2VkIGJ5XG4gIC8vIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgKGFrYSBwVG9TdHJpbmcpLiBOZXZlciBwZXJmb3JtIGJpbmFyeVxuICAvLyBjb21wYXJpc29ucyBmb3IgRmxvYXQqQXJyYXlzLCB0aG91Z2gsIHNpbmNlIGUuZy4gKzAgPT09IC0wIGJ1dCB0aGVpclxuICAvLyBiaXQgcGF0dGVybnMgYXJlIG5vdCBpZGVudGljYWwuXG4gIH0gZWxzZSBpZiAoaXNWaWV3KGFjdHVhbCkgJiYgaXNWaWV3KGV4cGVjdGVkKSAmJlxuICAgICAgICAgICAgIHBUb1N0cmluZyhhY3R1YWwpID09PSBwVG9TdHJpbmcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgIShhY3R1YWwgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHxcbiAgICAgICAgICAgICAgIGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkpIHtcbiAgICByZXR1cm4gY29tcGFyZShuZXcgVWludDhBcnJheShhY3R1YWwuYnVmZmVyKSxcbiAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShleHBlY3RlZC5idWZmZXIpKSA9PT0gMDtcblxuICAvLyA3LjUgRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAvLyBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgLy8gd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAvLyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gIC8vIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gIC8vIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgIT09IGlzQnVmZmVyKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBtZW1vcyA9IG1lbW9zIHx8IHthY3R1YWw6IFtdLCBleHBlY3RlZDogW119O1xuXG4gICAgdmFyIGFjdHVhbEluZGV4ID0gbWVtb3MuYWN0dWFsLmluZGV4T2YoYWN0dWFsKTtcbiAgICBpZiAoYWN0dWFsSW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAoYWN0dWFsSW5kZXggPT09IG1lbW9zLmV4cGVjdGVkLmluZGV4T2YoZXhwZWN0ZWQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1lbW9zLmFjdHVhbC5wdXNoKGFjdHVhbCk7XG4gICAgbWVtb3MuZXhwZWN0ZWQucHVzaChleHBlY3RlZCk7XG5cbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgc3RyaWN0LCBtZW1vcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBcmd1bWVudHMob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgc3RyaWN0LCBhY3R1YWxWaXNpdGVkT2JqZWN0cykge1xuICBpZiAoYSA9PT0gbnVsbCB8fCBhID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBpZiBvbmUgaXMgYSBwcmltaXRpdmUsIHRoZSBvdGhlciBtdXN0IGJlIHNhbWVcbiAgaWYgKHV0aWwuaXNQcmltaXRpdmUoYSkgfHwgdXRpbC5pc1ByaW1pdGl2ZShiKSlcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgaWYgKHN0cmljdCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkgIT09IE9iamVjdC5nZXRQcm90b3R5cGVPZihiKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIHZhciBhSXNBcmdzID0gaXNBcmd1bWVudHMoYSk7XG4gIHZhciBiSXNBcmdzID0gaXNBcmd1bWVudHMoYik7XG4gIGlmICgoYUlzQXJncyAmJiAhYklzQXJncykgfHwgKCFhSXNBcmdzICYmIGJJc0FyZ3MpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKGFJc0FyZ3MpIHtcbiAgICBhID0gcFNsaWNlLmNhbGwoYSk7XG4gICAgYiA9IHBTbGljZS5jYWxsKGIpO1xuICAgIHJldHVybiBfZGVlcEVxdWFsKGEsIGIsIHN0cmljdCk7XG4gIH1cbiAgdmFyIGthID0gb2JqZWN0S2V5cyhhKTtcbiAgdmFyIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgdmFyIGtleSwgaTtcbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPT0ga2IubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy90aGUgc2FtZSBzZXQgb2Yga2V5cyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSxcbiAga2Euc29ydCgpO1xuICBrYi5zb3J0KCk7XG4gIC8vfn5+Y2hlYXAga2V5IHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoa2FbaV0gIT09IGtiW2ldKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5IGNvcnJlc3BvbmRpbmcga2V5LCBhbmRcbiAgLy9+fn5wb3NzaWJseSBleHBlbnNpdmUgZGVlcCB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAga2V5ID0ga2FbaV07XG4gICAgaWYgKCFfZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gOC4gVGhlIG5vbi1lcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgZm9yIGFueSBkZWVwIGluZXF1YWxpdHkuXG4vLyBhc3NlcnQubm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IGZ1bmN0aW9uIG5vdERlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIGZhbHNlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBFcXVhbCcsIGFzc2VydC5ub3REZWVwRXF1YWwpO1xuICB9XG59O1xuXG5hc3NlcnQubm90RGVlcFN0cmljdEVxdWFsID0gbm90RGVlcFN0cmljdEVxdWFsO1xuZnVuY3Rpb24gbm90RGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwU3RyaWN0RXF1YWwnLCBub3REZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59XG5cblxuLy8gOS4gVGhlIHN0cmljdCBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc3RyaWN0IGVxdWFsaXR5LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbi8vIGFzc2VydC5zdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5zdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIHN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PT0nLCBhc3NlcnQuc3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG4vLyAxMC4gVGhlIHN0cmljdCBub24tZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIGZvciBzdHJpY3QgaW5lcXVhbGl0eSwgYXNcbi8vIGRldGVybWluZWQgYnkgIT09LiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdFN0cmljdEVxdWFsID0gZnVuY3Rpb24gbm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9PScsIGFzc2VydC5ub3RTdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgaWYgKCFhY3R1YWwgfHwgIWV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChleHBlY3RlZCkgPT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQudGVzdChhY3R1YWwpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElnbm9yZS4gIFRoZSBpbnN0YW5jZW9mIGNoZWNrIGRvZXNuJ3Qgd29yayBmb3IgYXJyb3cgZnVuY3Rpb25zLlxuICB9XG5cbiAgaWYgKEVycm9yLmlzUHJvdG90eXBlT2YoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGV4cGVjdGVkLmNhbGwoe30sIGFjdHVhbCkgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIF90cnlCbG9jayhibG9jaykge1xuICB2YXIgZXJyb3I7XG4gIHRyeSB7XG4gICAgYmxvY2soKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yID0gZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbmZ1bmN0aW9uIF90aHJvd3Moc2hvdWxkVGhyb3csIGJsb2NrLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICB2YXIgYWN0dWFsO1xuXG4gIGlmICh0eXBlb2YgYmxvY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJsb2NrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJykge1xuICAgIG1lc3NhZ2UgPSBleHBlY3RlZDtcbiAgICBleHBlY3RlZCA9IG51bGw7XG4gIH1cblxuICBhY3R1YWwgPSBfdHJ5QmxvY2soYmxvY2spO1xuXG4gIG1lc3NhZ2UgPSAoZXhwZWN0ZWQgJiYgZXhwZWN0ZWQubmFtZSA/ICcgKCcgKyBleHBlY3RlZC5uYW1lICsgJykuJyA6ICcuJykgK1xuICAgICAgICAgICAgKG1lc3NhZ2UgPyAnICcgKyBtZXNzYWdlIDogJy4nKTtcblxuICBpZiAoc2hvdWxkVGhyb3cgJiYgIWFjdHVhbCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ01pc3NpbmcgZXhwZWN0ZWQgZXhjZXB0aW9uJyArIG1lc3NhZ2UpO1xuICB9XG5cbiAgdmFyIHVzZXJQcm92aWRlZE1lc3NhZ2UgPSB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZyc7XG4gIHZhciBpc1Vud2FudGVkRXhjZXB0aW9uID0gIXNob3VsZFRocm93ICYmIHV0aWwuaXNFcnJvcihhY3R1YWwpO1xuICB2YXIgaXNVbmV4cGVjdGVkRXhjZXB0aW9uID0gIXNob3VsZFRocm93ICYmIGFjdHVhbCAmJiAhZXhwZWN0ZWQ7XG5cbiAgaWYgKChpc1Vud2FudGVkRXhjZXB0aW9uICYmXG4gICAgICB1c2VyUHJvdmlkZWRNZXNzYWdlICYmXG4gICAgICBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSkgfHxcbiAgICAgIGlzVW5leHBlY3RlZEV4Y2VwdGlvbikge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ0dvdCB1bndhbnRlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICBpZiAoKHNob3VsZFRocm93ICYmIGFjdHVhbCAmJiBleHBlY3RlZCAmJlxuICAgICAgIWV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fCAoIXNob3VsZFRocm93ICYmIGFjdHVhbCkpIHtcbiAgICB0aHJvdyBhY3R1YWw7XG4gIH1cbn1cblxuLy8gMTEuIEV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yOlxuLy8gYXNzZXJ0LnRocm93cyhibG9jaywgRXJyb3Jfb3B0LCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC50aHJvd3MgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyh0cnVlLCBibG9jaywgZXJyb3IsIG1lc3NhZ2UpO1xufTtcblxuLy8gRVhURU5TSU9OISBUaGlzIGlzIGFubm95aW5nIHRvIHdyaXRlIG91dHNpZGUgdGhpcyBtb2R1bGUuXG5hc3NlcnQuZG9lc05vdFRocm93ID0gZnVuY3Rpb24oYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3MoZmFsc2UsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG5hc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uKGVycikgeyBpZiAoZXJyKSB0aHJvdyBlcnI7IH07XG5cbi8vIEV4cG9zZSBhIHN0cmljdCBvbmx5IHZhcmlhbnQgb2YgYXNzZXJ0XG5mdW5jdGlvbiBzdHJpY3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09Jywgc3RyaWN0KTtcbn1cbmFzc2VydC5zdHJpY3QgPSBvYmplY3RBc3NpZ24oc3RyaWN0LCBhc3NlcnQsIHtcbiAgZXF1YWw6IGFzc2VydC5zdHJpY3RFcXVhbCxcbiAgZGVlcEVxdWFsOiBhc3NlcnQuZGVlcFN0cmljdEVxdWFsLFxuICBub3RFcXVhbDogYXNzZXJ0Lm5vdFN0cmljdEVxdWFsLFxuICBub3REZWVwRXF1YWw6IGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWxcbn0pO1xuYXNzZXJ0LnN0cmljdC5zdHJpY3QgPSBhc3NlcnQuc3RyaWN0O1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChoYXNPd24uY2FsbChvYmosIGtleSkpIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufTtcbiIsIi8vIEBmbG93XG5cbi8qKlxuICogRGVlcGx5IGNvbXBhcmVzIHR3byBvYmplY3QgbGl0ZXJhbHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVlcEVxdWFsKGE6ID9taXhlZCwgYjogP21peGVkKTogYm9vbGVhbiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGIpIHx8IGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgYSAhPT0gbnVsbCAmJiBiICE9PSBudWxsKSB7XG4gICAgICAgIGlmICghKHR5cGVvZiBiID09PSAnb2JqZWN0JykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgICAgICBpZiAoa2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhKSB7XG4gICAgICAgICAgICBpZiAoIWRlZXBFcXVhbChhW2tleV0sIGJba2V5XSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPT09IGI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGRlZXBFcXVhbDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBVbml0QmV6aWVyIGZyb20gJ0BtYXBib3gvdW5pdGJlemllcic7XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcbmltcG9ydCB0eXBlIHtNYXQ0LCBWZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xuXG5jb25zdCBERUdfVE9fUkFEID0gTWF0aC5QSSAvIDE4MDtcbmNvbnN0IFJBRF9UT19ERUcgPSAxODAgLyBNYXRoLlBJO1xuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFuZ2xlIGluIGRlZ3JlZXMgdG8gcmFkaWFuc1xuICogY29weSBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZSBkZXN0aW5hdGlvbi5cbiAqIFRoZSBsYXN0IHNvdXJjZSBvYmplY3QgZ2l2ZW4gb3ZlcnJpZGVzIHByb3BlcnRpZXMgZnJvbSBwcmV2aW91c1xuICogc291cmNlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGEgYW5nbGUgdG8gY29udmVydFxuICogQHJldHVybnMgdGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWdUb1JhZChhOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBhICogREVHX1RPX1JBRDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhbmdsZSBpbiByYWRpYW5zIHRvIGRlZ3JlZXNcbiAqIGNvcHkgYWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlIG9iamVjdHMgaW50byB0aGUgZGVzdGluYXRpb24uXG4gKiBUaGUgbGFzdCBzb3VyY2Ugb2JqZWN0IGdpdmVuIG92ZXJyaWRlcyBwcm9wZXJ0aWVzIGZyb20gcHJldmlvdXNcbiAqIHNvdXJjZSBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSBhIGFuZ2xlIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIHRoZSBhbmdsZSBpbiBkZWdyZWVzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmFkVG9EZWcoYTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gYSAqIFJBRF9UT19ERUc7XG59XG5cbmNvbnN0IFRJTEVfQ09STkVSUyA9IFtbMCwgMF0sIFsxLCAwXSwgWzEsIDFdLCBbMCwgMV1dO1xuXG4vKipcbiAqIEdpdmVuIGEgcGFydGljdWxhciBiZWFyaW5nLCByZXR1cm5zIHRoZSBjb3JuZXIgb2YgdGhlIHRpbGUgdGhhdHMgZmFydGhlc3RcbiAqIGFsb25nIHRoZSBiZWFyaW5nLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBiZWFyaW5nIGFuZ2xlIGluIGRlZ3JlZXMgKC0xODAsIDE4MF1cbiAqIEByZXR1cm5zIHtRdWFkQ29ybmVyfVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZ1cnRoZXN0VGlsZUNvcm5lcihiZWFyaW5nOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICBjb25zdCBhbGlnbmVkQmVhcmluZyA9ICgoYmVhcmluZyArIDQ1KSArIDM2MCkgJSAzNjA7XG4gICAgY29uc3QgY29ybmVySWR4ID0gTWF0aC5yb3VuZChhbGlnbmVkQmVhcmluZyAvIDkwKSAlIDQ7XG4gICAgcmV0dXJuIFRJTEVfQ09STkVSU1tjb3JuZXJJZHhdO1xufVxuXG4vKipcbiAqIEBtb2R1bGUgdXRpbFxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIEdpdmVuIGEgdmFsdWUgYHRgIHRoYXQgdmFyaWVzIGJldHdlZW4gMCBhbmQgMSwgcmV0dXJuXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIHRoYXQgZWFzZXMgYmV0d2VlbiAwIGFuZCAxIGluIGEgcGxlYXNpbmdcbiAqIGN1YmljIGluLW91dCBmYXNoaW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlYXNlQ3ViaWNJbk91dCh0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0IDw9IDApIHJldHVybiAwO1xuICAgIGlmICh0ID49IDEpIHJldHVybiAxO1xuICAgIGNvbnN0IHQyID0gdCAqIHQsXG4gICAgICAgIHQzID0gdDIgKiB0O1xuICAgIHJldHVybiA0ICogKHQgPCAwLjUgPyB0MyA6IDMgKiAodCAtIHQyKSArIHQzIC0gMC43NSk7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgYW4gQUFCQiBmb3IgYSBzZXQgb2YgcG9pbnRzLlxuICpcbiAqIEBwYXJhbSB7UG9pbnRbXX0gcG9pbnRzXG4gKiBAcmV0dXJucyB7eyBtaW46IFBvaW50LCBtYXg6IFBvaW50fX1cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCb3VuZHMocG9pbnRzOiBQb2ludFtdKTogeyBtaW46IFBvaW50LCBtYXg6IFBvaW50fSB7XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgIGZvciAoY29uc3QgcCBvZiBwb2ludHMpIHtcbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHAueCk7XG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBwLnkpO1xuICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgcC54KTtcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHAueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWluOiBuZXcgUG9pbnQobWluWCwgbWluWSksXG4gICAgICAgIG1heDogbmV3IFBvaW50KG1heFgsIG1heFkpLFxuICAgIH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc3F1YXJlIG9mIHRoZSAyRCBkaXN0YW5jZSBiZXR3ZWVuIGFuIEFBQkIgZGVmaW5lZCBieSBtaW4gYW5kIG1heCBhbmQgYSBwb2ludC5cbiAqIElmIHBvaW50IGlzIG51bGwgb3IgdW5kZWZpbmVkLCB0aGUgQUFCQiBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4gKDAsMCkgaXMgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHtQb2ludH0gbWluIFRoZSBtaW5pbXVtIGV4dGVudCBvZiB0aGUgQUFCQi5cbiAqIEBwYXJhbSB7UG9pbnR9IG1heCBUaGUgbWF4aW11bSBleHRlbnQgb2YgdGhlIEFBQkIuXG4gKiBAcGFyYW0ge1BvaW50fSBbcG9pbnRdIFRoZSBwb2ludCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSBmcm9tLCBtYXkgYmUgdW5kZWZpbmVkLlxuICogQHJldHVybnMge251bWJlcn0gVGhlIHNxdWFyZSBkaXN0YW5jZSBmcm9tIHRoZSBBQUJCLCAwLjAgaWYgdGhlIEFBQkIgY29udGFpbnMgdGhlIHBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QUFCQlBvaW50U3F1YXJlRGlzdChtaW46IFBvaW50LCBtYXg6IFBvaW50LCBwb2ludDogP1BvaW50KTogbnVtYmVyIHtcbiAgICBsZXQgc3FEaXN0ID0gMC4wO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICAgICAgY29uc3QgdiA9IHBvaW50ID8gcG9pbnRbaV0gOiAwLjA7XG4gICAgICAgIGFzc2VydChtaW5baV0gPCBtYXhbaV0sICdJbnZhbGlkIGFhYmIgbWluIGFuZCBtYXggaW5wdXRzLCBtaW5baV0gbXVzdCBiZSA8IG1heFtpXS4nKTtcbiAgICAgICAgaWYgKG1pbltpXSA+IHYpIHNxRGlzdCArPSAobWluW2ldIC0gdikgKiAobWluW2ldIC0gdik7XG4gICAgICAgIGlmIChtYXhbaV0gPCB2KSBzcURpc3QgKz0gKHYgLSBtYXhbaV0pICogKHYgLSBtYXhbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBzcURpc3Q7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBBQUJCIGludG8gYSBwb2x5Z29uIHdpdGggY2xvY2t3aXNlIHdpbmRpbmcgb3JkZXIuXG4gKlxuICogQHBhcmFtIHtQb2ludH0gbWluIFRoZSB0b3AgbGVmdCBwb2ludC5cbiAqIEBwYXJhbSB7UG9pbnR9IG1heCBUaGUgYm90dG9tIHJpZ2h0IHBvaW50LlxuICogQHBhcmFtIHtudW1iZXJ9IFtidWZmZXI9MF0gVGhlIGJ1ZmZlciB3aWR0aC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Nsb3NlPXRydWVdIFdoZXRoZXIgdG8gY2xvc2UgdGhlIHBvbHlnb24gb3Igbm90LlxuICogQHJldHVybnMge1BvaW50W119IFRoZSBwb2x5Z29uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9seWdvbml6ZUJvdW5kcyhtaW46IFBvaW50LCBtYXg6IFBvaW50LCBidWZmZXI6IG51bWJlciA9IDAsIGNsb3NlOiBib29sZWFuID0gdHJ1ZSk6IFBvaW50W10ge1xuICAgIGNvbnN0IG9mZnNldCA9IG5ldyBQb2ludChidWZmZXIsIGJ1ZmZlcik7XG4gICAgY29uc3QgbWluQnVmID0gbWluLnN1YihvZmZzZXQpO1xuICAgIGNvbnN0IG1heEJ1ZiA9IG1heC5hZGQob2Zmc2V0KTtcbiAgICBjb25zdCBwb2x5Z29uID0gW21pbkJ1ZiwgbmV3IFBvaW50KG1heEJ1Zi54LCBtaW5CdWYueSksIG1heEJ1ZiwgbmV3IFBvaW50KG1pbkJ1Zi54LCBtYXhCdWYueSldO1xuXG4gICAgaWYgKGNsb3NlKSB7XG4gICAgICAgIHBvbHlnb24ucHVzaChtaW5CdWYuY2xvbmUoKSk7XG4gICAgfVxuICAgIHJldHVybiBwb2x5Z29uO1xufVxuXG4vKipcbiAqIFRha2VzIGEgY29udmV4IHJpbmcgYW5kIGV4cGFuZHMgaXQgb3V0d2FyZCBieSBhcHBseWluZyBhIGJ1ZmZlciBhcm91bmQgaXQuXG4gKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgcmluZyBpcyBpbiBjbG9ja3dpc2Ugd2luZGluZyBvcmRlci5cbiAqXG4gKiBAcGFyYW0ge1BvaW50W119IHJpbmcgVGhlIGlucHV0IHJpbmcuXG4gKiBAcGFyYW0ge251bWJlcn0gYnVmZmVyIFRoZSBidWZmZXIgd2lkdGguXG4gKiBAcmV0dXJucyB7UG9pbnRbXX0gVGhlIGV4cGFuZGVkIHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJDb252ZXhQb2x5Z29uKHJpbmc6IFBvaW50W10sIGJ1ZmZlcjogbnVtYmVyKTogUG9pbnRbXSB7XG4gICAgYXNzZXJ0KHJpbmcubGVuZ3RoID4gMiwgJ2J1ZmZlckNvbnZleFBvbHlnb24gcmVxdWlyZXMgdGhlIHJpbmcgdG8gaGF2ZSBhdGxlYXN0IDMgcG9pbnRzJyk7XG4gICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgZm9yIChsZXQgY3VycklkeCA9IDA7IGN1cnJJZHggPCByaW5nLmxlbmd0aDsgY3VycklkeCsrKSB7XG4gICAgICAgIGNvbnN0IHByZXZJZHggPSB3cmFwKGN1cnJJZHggLSAxLCAtMSwgcmluZy5sZW5ndGggLSAxKTtcbiAgICAgICAgY29uc3QgbmV4dElkeCA9IHdyYXAoY3VycklkeCArIDEsIC0xLCByaW5nLmxlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCBwcmV2ID0gcmluZ1twcmV2SWR4XTtcbiAgICAgICAgY29uc3QgY3VyciA9IHJpbmdbY3VycklkeF07XG4gICAgICAgIGNvbnN0IG5leHQgPSByaW5nW25leHRJZHhdO1xuICAgICAgICBjb25zdCBwMSA9IHByZXYuc3ViKGN1cnIpLnVuaXQoKTtcbiAgICAgICAgY29uc3QgcDIgPSBuZXh0LnN1YihjdXJyKS51bml0KCk7XG4gICAgICAgIGNvbnN0IGludGVyaW9yQW5nbGUgPSBwMi5hbmdsZVdpdGhTZXAocDEueCwgcDEueSk7XG4gICAgICAgIC8vIENhbGN1YXRlIGEgdmVjdG9yIHRoYXQgcG9pbnRzIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGFuZ2xlIGJpc2VjdG9yIGJldHdlZW4gdHdvIHNpZGVzLlxuICAgICAgICAvLyBTY2FsZSBpdCBiYXNlZCBvbiBhIHJpZ2h0IGFuZ2xlZCB0cmlhbmdsZSBjb25zdHJ1Y3RlZCBhdCB0aGF0IGNvcm5lci5cbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcDEuYWRkKHAyKS51bml0KCkubXVsdCgtMSAqIGJ1ZmZlciAvIE1hdGguc2luKGludGVyaW9yQW5nbGUgLyAyKSk7XG4gICAgICAgIG91dHB1dC5wdXNoKGN1cnIuYWRkKG9mZnNldCkpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuXG50eXBlIEVhc2VGdW5jdGlvbiA9ICh0OiBudW1iZXIpID0+IG51bWJlcjtcblxuLyoqXG4gKiBHaXZlbiBnaXZlbiAoeCwgeSksICh4MSwgeTEpIGNvbnRyb2wgcG9pbnRzIGZvciBhIGJlemllciBjdXJ2ZSxcbiAqIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgaW50ZXJwb2xhdGVzIGFsb25nIHRoYXQgY3VydmUuXG4gKlxuICogQHBhcmFtIHAxeCBjb250cm9sIHBvaW50IDEgeCBjb29yZGluYXRlXG4gKiBAcGFyYW0gcDF5IGNvbnRyb2wgcG9pbnQgMSB5IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSBwMnggY29udHJvbCBwb2ludCAyIHggY29vcmRpbmF0ZVxuICogQHBhcmFtIHAyeSBjb250cm9sIHBvaW50IDIgeSBjb29yZGluYXRlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmV6aWVyKHAxeDogbnVtYmVyLCBwMXk6IG51bWJlciwgcDJ4OiBudW1iZXIsIHAyeTogbnVtYmVyKTogRWFzZUZ1bmN0aW9uIHtcbiAgICBjb25zdCBiZXppZXIgPSBuZXcgVW5pdEJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGJlemllci5zb2x2ZSh0KTtcbiAgICB9O1xufVxuXG4vKipcbiAqIEEgZGVmYXVsdCBiZXppZXItY3VydmUgcG93ZXJlZCBlYXNpbmcgZnVuY3Rpb24gd2l0aFxuICogY29udHJvbCBwb2ludHMgKDAuMjUsIDAuMSkgYW5kICgwLjI1LCAxKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBlYXNlOiBFYXNlRnVuY3Rpb24gPSBiZXppZXIoMC4yNSwgMC4xLCAwLjI1LCAxKTtcblxuLyoqXG4gKiBjb25zdHJhaW4gbiB0byB0aGUgZ2l2ZW4gcmFuZ2UgdmlhIG1pbiArIG1heFxuICpcbiAqIEBwYXJhbSBuIHZhbHVlXG4gKiBAcGFyYW0gbWluIHRoZSBtaW5pbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkXG4gKiBAcGFyYW0gbWF4IHRoZSBtYXhpbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB0aGUgY2xhbXBlZCB2YWx1ZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYW1wKG46IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIG4pKTtcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEdMU0wgc21vb3Roc3RlcC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZTAgVGhlIGxvd2VyIGVkZ2Ugb2YgdGhlIHNpZ21vaWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBlMSBUaGUgdXBwZXIgZWRnZSBvZiB0aGUgc2lnbW9pZFxuICogQHBhcmFtIHtudW1iZXJ9IHggdGhlIHZhbHVlIHRvIGJlIGludGVycG9sYXRlZFxuICogQHJldHVybnMge251bWJlcn0gaW4gdGhlIHJhbmdlIFswLCAxXVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNtb290aHN0ZXAoZTA6IG51bWJlciwgZTE6IG51bWJlciwgeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICB4ID0gY2xhbXAoKHggLSBlMCkgLyAoZTEgLSBlMCksIDAsIDEpO1xuICAgIHJldHVybiB4ICogeCAqICgzIC0gMiAqIHgpO1xufVxuXG4vKipcbiAqIGNvbnN0cmFpbiBuIHRvIHRoZSBnaXZlbiByYW5nZSwgZXhjbHVkaW5nIHRoZSBtaW5pbXVtLCB2aWEgbW9kdWxhciBhcml0aG1ldGljXG4gKlxuICogQHBhcmFtIG4gdmFsdWVcbiAqIEBwYXJhbSBtaW4gdGhlIG1pbmltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWQsIGV4Y2x1c2l2ZVxuICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSB2YWx1ZSB0byBiZSByZXR1cm5lZCwgaW5jbHVzaXZlXG4gKiBAcmV0dXJucyBjb25zdHJhaW5lZCBudW1iZXJcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwKG46IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBkID0gbWF4IC0gbWluO1xuICAgIGNvbnN0IHcgPSAoKG4gLSBtaW4pICUgZCArIGQpICUgZCArIG1pbjtcbiAgICByZXR1cm4gKHcgPT09IG1pbikgPyBtYXggOiB3O1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHNob3J0ZXN0IGFuZ2xlIGluIHJhbmdlIFstMTgwLCAxODApIGJldHdlZW4gdHdvIGFuZ2xlcy5cbiAqXG4gKiBAcGFyYW0geyp9IGEgRmlyc3QgYW5nbGUgaW4gZGVncmVlc1xuICogQHBhcmFtIHsqfSBiIFNlY29uZCBhbmdsZSBpbiBkZWdyZWVzXG4gKiBAcmV0dXJucyBTaG9ydGVzdCBhbmdsZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3J0ZXN0QW5nbGUoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGRpZmYgPSAoYiAtIGEgKyAxODApICUgMzYwIC0gMTgwO1xuICAgIHJldHVybiBkaWZmIDwgLTE4MCA/IGRpZmYgKyAzNjAgOiBkaWZmO1xufVxuXG4vKlxuICogQ2FsbCBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgYXJndW1lbnRzLFxuICogY2FsbGluZyBgY2FsbGJhY2tgIHdpdGggdGhlIGNvbXBsZXRlZCByZXN1bHRzIG9mIGFsbCBjYWxscy5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgaW5wdXQgdG8gZWFjaCBjYWxsIG9mIHRoZSBhc3luYyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmbiBhbiBhc3luYyBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSAoZGF0YSwgY2FsbGJhY2spXG4gKiBAcGFyYW0gY2FsbGJhY2sgYSBjYWxsYmFjayBydW4gYWZ0ZXIgYWxsIGFzeW5jIHdvcmsgaXMgZG9uZS5cbiAqIGNhbGxlZCB3aXRoIGFuIGFycmF5LCBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIGVhY2ggYXN5bmMgY2FsbC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3luY0FsbDxJdGVtLCBSZXN1bHQ+KFxuICAgIGFycmF5OiBBcnJheTxJdGVtPixcbiAgICBmbjogKGl0ZW06IEl0ZW0sIGZuQ2FsbGJhY2s6IENhbGxiYWNrPFJlc3VsdD4pID0+IHZvaWQsXG4gICAgY2FsbGJhY2s6IENhbGxiYWNrPEFycmF5PFJlc3VsdD4+XG4pOiB2b2lkIHtcbiAgICBpZiAoIWFycmF5Lmxlbmd0aCkgeyByZXR1cm4gY2FsbGJhY2sobnVsbCwgW10pOyB9XG4gICAgbGV0IHJlbWFpbmluZyA9IGFycmF5Lmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5KGFycmF5Lmxlbmd0aCk7XG4gICAgbGV0IGVycm9yID0gbnVsbDtcbiAgICBhcnJheS5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XG4gICAgICAgIGZuKGl0ZW0sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICByZXN1bHRzW2ldID0gKChyZXN1bHQ6IGFueSk6IFJlc3VsdCk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yMTIzXG4gICAgICAgICAgICBpZiAoLS1yZW1haW5pbmcgPT09IDApIGNhbGxiYWNrKGVycm9yLCByZXN1bHRzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qXG4gKiBQb2x5ZmlsbCBmb3IgT2JqZWN0LnZhbHVlcy4gTm90IGZ1bGx5IHNwZWMgY29tcGxpYW50LCBidXQgd2UgZG9uJ3RcbiAqIG5lZWQgaXQgdG8gYmUuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlczxUPihvYmo6IHtba2V5OiBzdHJpbmddOiBUfSk6IEFycmF5PFQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG9ialtrXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qXG4gKiBDb21wdXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGtleXMgaW4gb25lIG9iamVjdCBhbmQgdGhlIGtleXNcbiAqIGluIGFub3RoZXIgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIGtleXMgZGlmZmVyZW5jZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGtleXNEaWZmZXJlbmNlPFMsIFQ+KG9iajoge1trZXk6IHN0cmluZ106IFN9LCBvdGhlcjoge1trZXk6IHN0cmluZ106IFR9KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IFtdO1xuICAgIGZvciAoY29uc3QgaSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCEoaSBpbiBvdGhlcikpIHtcbiAgICAgICAgICAgIGRpZmZlcmVuY2UucHVzaChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlmZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIGRlc3RpbmF0aW9uIG9iamVjdCBhbmQgb3B0aW9uYWxseSBtYW55IHNvdXJjZSBvYmplY3RzLFxuICogY29weSBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZSBkZXN0aW5hdGlvbi5cbiAqIFRoZSBsYXN0IHNvdXJjZSBvYmplY3QgZ2l2ZW4gb3ZlcnJpZGVzIHByb3BlcnRpZXMgZnJvbSBwcmV2aW91c1xuICogc291cmNlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGRlc3QgZGVzdGluYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gc291cmNlcyBzb3VyY2VzIGZyb20gd2hpY2ggcHJvcGVydGllcyBhcmUgcHVsbGVkXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKGRlc3Q6IE9iamVjdCwgLi4uc291cmNlczogQXJyYXk8P09iamVjdD4pOiBPYmplY3Qge1xuICAgIGZvciAoY29uc3Qgc3JjIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrIGluIHNyYykge1xuICAgICAgICAgICAgZGVzdFtrXSA9IHNyY1trXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhbiBvYmplY3QgYW5kIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYXMgc3RyaW5ncywgcmV0dXJuIHZlcnNpb25cbiAqIG9mIHRoYXQgb2JqZWN0IHdpdGggb25seSB0aG9zZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSBzcmMgdGhlIG9iamVjdFxuICogQHBhcmFtIHByb3BlcnRpZXMgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgY2hvc2VuXG4gKiB0byBhcHBlYXIgb24gdGhlIHJlc3VsdGluZyBvYmplY3QuXG4gKiBAcmV0dXJucyBvYmplY3Qgd2l0aCBsaW1pdGVkIHByb3BlcnRpZXMuXG4gKiBAZXhhbXBsZVxuICogdmFyIGZvbyA9IHsgbmFtZTogJ0NoYXJsaWUnLCBhZ2U6IDEwIH07XG4gKiB2YXIganVzdE5hbWUgPSBwaWNrKGZvbywgWyduYW1lJ10pO1xuICogLy8ganVzdE5hbWUgPSB7IG5hbWU6ICdDaGFybGllJyB9XG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGljayhzcmM6IE9iamVjdCwgcHJvcGVydGllczogQXJyYXk8c3RyaW5nPik6IE9iamVjdCB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGsgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICBpZiAoayBpbiBzcmMpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IHNyY1trXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5sZXQgaWQgPSAxO1xuXG4vKipcbiAqIFJldHVybiBhIHVuaXF1ZSBudW1lcmljIGlkLCBzdGFydGluZyBhdCAxIGFuZCBpbmNyZW1lbnRpbmcgd2l0aFxuICogZWFjaCBjYWxsLlxuICpcbiAqIEByZXR1cm5zIHVuaXF1ZSBudW1lcmljIGlkLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGlkKys7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgcmFuZG9tIFVVSUQgKHY0KS4gVGFrZW4gZnJvbTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vamVkLzk4Mjg4M1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV1aWQoKTogc3RyaW5nIHtcbiAgICBmdW5jdGlvbiBiKGEpIHtcbiAgICAgICAgcmV0dXJuIGEgPyAoYSBeIE1hdGgucmFuZG9tKCkgKiAoMTYgPj4gYSAvIDQpKS50b1N0cmluZygxNikgOlxuICAgICAgICAvLyRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIHRoZSBpbXBsaWVkIGFycmF5IGxpdGVyYWwgY29udmVyc2lvbiBoZXJlXG4gICAgICAgICAgICAoWzFlN10gKyAtWzFlM10gKyAtNGUzICsgLThlMyArIC0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLCBiKTtcbiAgICB9XG4gICAgcmV0dXJuIGIoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBhIGdpdmVuIHZhbHVlIGlzIGEgcG93ZXIgb2YgdHdvXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQb3dlck9mVHdvKHZhbHVlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKSAlIDEgPT09IDA7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBuZXh0IHBvd2VyIG9mIHR3bywgb3IgdGhlIGlucHV0IHZhbHVlIGlmIGFscmVhZHkgYSBwb3dlciBvZiB0d29cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXh0UG93ZXJPZlR3byh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodmFsdWUgPD0gMSkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIE1hdGgucG93KDIsIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMikpO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcHJldmlvdXMgcG93ZXIgb2YgdHdvLCBvciB0aGUgaW5wdXQgdmFsdWUgaWYgYWxyZWFkeSBhIHBvd2VyIG9mIHR3b1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXZQb3dlck9mVHdvKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh2YWx1ZSA8PSAxKSByZXR1cm4gMTtcbiAgICByZXR1cm4gTWF0aC5wb3coMiwgTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMikpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgc3RyaW5nIHRvIG1hdGNoIFVVSUQodjQpIG9mIHRoZVxuICogZm9ybTogeHh4eHh4eHgteHh4eC00eHh4LVs4OWFiXXh4eC14eHh4eHh4eHh4eHhcbiAqIEBwYXJhbSBzdHIgc3RyaW5nIHRvIHZhbGlkYXRlLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVXVpZChzdHI6ID9zdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RyID8gL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bNF1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kL2kudGVzdChzdHIpIDogZmFsc2U7XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgbWVtYmVyIGZ1bmN0aW9uIG5hbWVzIGFzIHN0cmluZ3MsIHJlcGxhY2UgYWxsIG9mIHRoZW1cbiAqIHdpdGggYm91bmQgdmVyc2lvbnMgdGhhdCB3aWxsIGFsd2F5cyByZWZlciB0byBgY29udGV4dGAgYXMgYHRoaXNgLiBUaGlzXG4gKiBpcyB1c2VmdWwgZm9yIGNsYXNzZXMgd2hlcmUgb3RoZXJ3aXNlIGV2ZW50IGJpbmRpbmdzIHdvdWxkIHJlYXNzaWduXG4gKiBgdGhpc2AgdG8gdGhlIGV2ZW50ZWQgb2JqZWN0IG9yIHNvbWUgb3RoZXIgdmFsdWU6IHRoaXMgbGV0cyB5b3UgZW5zdXJlXG4gKiB0aGUgYHRoaXNgIHZhbHVlIGFsd2F5cy5cbiAqXG4gKiBAcGFyYW0gZm5zIGxpc3Qgb2YgbWVtYmVyIGZ1bmN0aW9uIG5hbWVzXG4gKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB2YWx1ZVxuICogQGV4YW1wbGVcbiAqIGZ1bmN0aW9uIE15Q2xhc3MoKSB7XG4gKiAgIGJpbmRBbGwoWydvbnRpbWVyJ10sIHRoaXMpO1xuICogICB0aGlzLm5hbWUgPSAnVG9tJztcbiAqIH1cbiAqIE15Q2xhc3MucHJvdG90eXBlLm9udGltZXIgPSBmdW5jdGlvbigpIHtcbiAqICAgYWxlcnQodGhpcy5uYW1lKTtcbiAqIH07XG4gKiB2YXIgbXlDbGFzcyA9IG5ldyBNeUNsYXNzKCk7XG4gKiBzZXRUaW1lb3V0KG15Q2xhc3Mub250aW1lciwgMTAwKTtcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kQWxsKGZuczogQXJyYXk8c3RyaW5nPiwgY29udGV4dDogT2JqZWN0KTogdm9pZCB7XG4gICAgZm5zLmZvckVhY2goKGZuKSA9PiB7XG4gICAgICAgIGlmICghY29udGV4dFtmbl0pIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnRleHRbZm5dID0gY29udGV4dFtmbl0uYmluZChjb250ZXh0KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSBzdHJpbmcgZW5kcyB3aXRoIGEgcGFydGljdWxhciBzdWJzdHJpbmdcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nOiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN0cmluZy5pbmRleE9mKHN1ZmZpeCwgc3RyaW5nLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpICE9PSAtMTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gb2JqZWN0IGJ5IG1hcHBpbmcgYWxsIHRoZSB2YWx1ZXMgb2YgYW4gZXhpc3Rpbmcgb2JqZWN0IHdoaWxlXG4gKiBwcmVzZXJ2aW5nIHRoZWlyIGtleXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcE9iamVjdChpbnB1dDogT2JqZWN0LCBpdGVyYXRvcjogRnVuY3Rpb24sIGNvbnRleHQ/OiBPYmplY3QpOiBPYmplY3Qge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGlucHV0KSB7XG4gICAgICAgIG91dHB1dFtrZXldID0gaXRlcmF0b3IuY2FsbChjb250ZXh0IHx8IHRoaXMsIGlucHV0W2tleV0sIGtleSwgaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBvYmplY3QgYnkgZmlsdGVyaW5nIG91dCB2YWx1ZXMgb2YgYW4gZXhpc3Rpbmcgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJPYmplY3QoaW5wdXQ6IE9iamVjdCwgaXRlcmF0b3I6IEZ1bmN0aW9uLCBjb250ZXh0PzogT2JqZWN0KTogT2JqZWN0IHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnB1dCkge1xuICAgICAgICBpZiAoaXRlcmF0b3IuY2FsbChjb250ZXh0IHx8IHRoaXMsIGlucHV0W2tleV0sIGtleSwgaW5wdXQpKSB7XG4gICAgICAgICAgICBvdXRwdXRba2V5XSA9IGlucHV0W2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuaW1wb3J0IGRlZXBFcXVhbCBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvZGVlcF9lcXVhbC5qcyc7XG5leHBvcnQge2RlZXBFcXVhbH07XG5cbi8qKlxuICogRGVlcGx5IGNsb25lcyB0d28gb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvbmU8VD4oaW5wdXQ6IFQpOiBUIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuICgoaW5wdXQubWFwKGNsb25lKTogYW55KTogVCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoKG1hcE9iamVjdChpbnB1dCwgY2xvbmUpOiBhbnkpOiBUKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxufVxuXG4vKipcbiAqIE1hcHMgYSB2YWx1ZSBmcm9tIGEgcmFuZ2UgYmV0d2VlbiBbbWluLCBtYXhdIHRvIHRoZSByYW5nZSBbb3V0TWluLCBvdXRNYXhdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFZhbHVlKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgb3V0TWluOiBudW1iZXIsIG91dE1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY2xhbXAoKHZhbHVlIC0gbWluKSAvIChtYXggLSBtaW4pICogKG91dE1heCAtIG91dE1pbikgKyBvdXRNaW4sIG91dE1pbiwgb3V0TWF4KTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0d28gYXJyYXlzIGhhdmUgYXQgbGVhc3Qgb25lIGNvbW1vbiBlbGVtZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheXNJbnRlcnNlY3Q8VD4oYTogQXJyYXk8VD4sIGI6IEFycmF5PFQ+KTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgbCA9IDA7IGwgPCBhLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGlmIChiLmluZGV4T2YoYVtsXSkgPj0gMCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBQcmludCBhIHdhcm5pbmcgbWVzc2FnZSB0byB0aGUgY29uc29sZSBhbmQgZW5zdXJlIGR1cGxpY2F0ZSB3YXJuaW5nIG1lc3NhZ2VzXG4gKiBhcmUgbm90IHByaW50ZWQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgd2Fybk9uY2VIaXN0b3J5OiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5PbmNlKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghd2Fybk9uY2VIaXN0b3J5W21lc3NhZ2VdKSB7XG4gICAgICAgIC8vIGNvbnNvbGUgaXNuJ3QgZGVmaW5lZCBpbiBzb21lIFdlYldvcmtlcnMsIHNlZSAjMjU1OFxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIpIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgd2Fybk9uY2VIaXN0b3J5W21lc3NhZ2VdID0gdHJ1ZTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5kaWNhdGVzIGlmIHRoZSBwcm92aWRlZCBQb2ludHMgYXJlIGluIGEgY291bnRlciBjbG9ja3dpc2UgKHRydWUpIG9yIGNsb2Nrd2lzZSAoZmFsc2UpIG9yZGVyXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHRydWUgZm9yIGEgY291bnRlciBjbG9ja3dpc2Ugc2V0IG9mIHBvaW50c1xuICovXG4vLyBodHRwOi8vYnJ5Y2Vib2UuY29tLzIwMDYvMTAvMjMvbGluZS1zZWdtZW50LWludGVyc2VjdGlvbi1hbGdvcml0aG0vXG5leHBvcnQgZnVuY3Rpb24gaXNDb3VudGVyQ2xvY2t3aXNlKGE6IFBvaW50LCBiOiBQb2ludCwgYzogUG9pbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKGMueSAtIGEueSkgKiAoYi54IC0gYS54KSA+IChiLnkgLSBhLnkpICogKGMueCAtIGEueCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2lnbmVkIGFyZWEgZm9yIHRoZSBwb2x5Z29uIHJpbmcuICBQb3N0aXZlIGFyZWFzIGFyZSBleHRlcmlvciByaW5ncyBhbmRcbiAqIGhhdmUgYSBjbG9ja3dpc2Ugd2luZGluZy4gIE5lZ2F0aXZlIGFyZWFzIGFyZSBpbnRlcmlvciByaW5ncyBhbmQgaGF2ZSBhIGNvdW50ZXIgY2xvY2t3aXNlXG4gKiBvcmRlcmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHJpbmcgRXh0ZXJpb3Igb3IgaW50ZXJpb3IgcmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlU2lnbmVkQXJlYShyaW5nOiBBcnJheTxQb2ludD4pOiBudW1iZXIge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDEsIHAxLCBwMjsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICBwMSA9IHJpbmdbaV07XG4gICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgc3VtICs9IChwMi54IC0gcDEueCkgKiAocDEueSArIHAyLnkpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG4vKiBnbG9iYWwgc2VsZiwgV29ya2VyR2xvYmFsU2NvcGUgKi9cbi8qKlxuICogIFJldHVybnMgdHJ1ZSBpZiBydW4gaW4gdGhlIHdlYi13b3JrZXIgY29udGV4dC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dvcmtlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlO1xufVxuXG4vKipcbiAqIFBhcnNlcyBkYXRhIGZyb20gJ0NhY2hlLUNvbnRyb2wnIGhlYWRlcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBjYWNoZUNvbnRyb2wgVmFsdWUgb2YgJ0NhY2hlLUNvbnRyb2wnIGhlYWRlclxuICogQHJldHVybiBvYmplY3QgY29udGFpbmluZyBwYXJzZWQgaGVhZGVyIGluZm8uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2FjaGVDb250cm9sKGNhY2hlQ29udHJvbDogc3RyaW5nKTogT2JqZWN0IHtcbiAgICAvLyBUYWtlbiBmcm9tIFtXcmVja10oaHR0cHM6Ly9naXRodWIuY29tL2hhcGlqcy93cmVjaylcbiAgICBjb25zdCByZSA9IC8oPzpefCg/OlxccypcXCxcXHMqKSkoW15cXHgwMC1cXHgyMFxcKFxcKTw+QFxcLDtcXDpcXFxcXCJcXC9cXFtcXF1cXD9cXD1cXHtcXH1cXHg3Rl0rKSg/OlxcPSg/OihbXlxceDAwLVxceDIwXFwoXFwpPD5AXFwsO1xcOlxcXFxcIlxcL1xcW1xcXVxcP1xcPVxce1xcfVxceDdGXSspfCg/OlxcXCIoKD86W15cIlxcXFxdfFxcXFwuKSopXFxcIikpKT8vZztcblxuICAgIGNvbnN0IGhlYWRlciA9IHt9O1xuICAgIGNhY2hlQ29udHJvbC5yZXBsYWNlKHJlLCAoJDAsICQxLCAkMiwgJDMpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAkMiB8fCAkMztcbiAgICAgICAgaGVhZGVyWyQxXSA9IHZhbHVlID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHRydWU7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcblxuICAgIGlmIChoZWFkZXJbJ21heC1hZ2UnXSkge1xuICAgICAgICBjb25zdCBtYXhBZ2UgPSBwYXJzZUludChoZWFkZXJbJ21heC1hZ2UnXSwgMTApO1xuICAgICAgICBpZiAoaXNOYU4obWF4QWdlKSkgZGVsZXRlIGhlYWRlclsnbWF4LWFnZSddO1xuICAgICAgICBlbHNlIGhlYWRlclsnbWF4LWFnZSddID0gbWF4QWdlO1xuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXI7XG59XG5cbmxldCBfaXNTYWZhcmkgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0U2FmYXJpQ2hlY2tGb3JUZXN0KCkge1xuICAgIF9pc1NhZmFyaSA9IG51bGw7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gcnVuIGluIFdlYktpdCBkZXJpdmVkIGJyb3dzZXJzLlxuICogVGhpcyBpcyB1c2VkIGFzIGEgd29ya2Fyb3VuZCBmb3IgYSBtZW1vcnkgbGVhayBpbiBTYWZhcmkgY2F1c2VkIGJ5IHVzaW5nIFRyYW5zZmVyYWJsZSBvYmplY3RzIHRvXG4gKiB0cmFuc2ZlciBkYXRhIGJldHdlZW4gV2ViV29ya2VycyBhbmQgdGhlIG1haW4gdGhyZWFkLlxuICogaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzg3NzFcbiAqXG4gKiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UgdGhlIHVuZGVybHlpbmcgU2FmYXJpIGlzc3VlIGlzIGZpeGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gc2NvcGUge1dpbmRvd09yV29ya2VyR2xvYmFsU2NvcGV9IFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBib3RoIG9uIHRoZSBtYWluIHRocmVhZCBhbmQgV2ViV29ya2VyIGNvbnRleHQsXG4gKiAgICAgIGxldCB0aGUgY2FsbGluZyBzY29wZSBwYXNzIGluIHRoZSBnbG9iYWwgc2NvcGUgb2JqZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmFyaShzY29wZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKF9pc1NhZmFyaSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHVzZXJBZ2VudCA9IHNjb3BlLm5hdmlnYXRvciA/IHNjb3BlLm5hdmlnYXRvci51c2VyQWdlbnQgOiBudWxsO1xuICAgICAgICBfaXNTYWZhcmkgPSAhIXNjb3BlLnNhZmFyaSB8fFxuICAgICAgICAhISh1c2VyQWdlbnQgJiYgKC9cXGIoaVBhZHxpUGhvbmV8aVBvZClcXGIvLnRlc3QodXNlckFnZW50KSB8fCAoISF1c2VyQWdlbnQubWF0Y2goJ1NhZmFyaScpICYmICF1c2VyQWdlbnQubWF0Y2goJ0Nocm9tZScpKSkpO1xuICAgIH1cbiAgICByZXR1cm4gX2lzU2FmYXJpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTYWZhcmlXaXRoQW50aWFsaWFzaW5nQnVnKHNjb3BlOiBhbnkpOiA/Ym9vbGVhbiB7XG4gICAgY29uc3QgdXNlckFnZW50ID0gc2NvcGUubmF2aWdhdG9yID8gc2NvcGUubmF2aWdhdG9yLnVzZXJBZ2VudCA6IG51bGw7XG4gICAgaWYgKCFpc1NhZmFyaShzY29wZSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyAxNS40IGlzIGtub3duIHRvIGJlIGJ1Z2d5LlxuICAgIC8vIDE1LjUgbWF5IG9yIG1heSBub3QgaW5jbHVkZSB0aGUgZml4LiBNYXJrIGl0IGFzIGJ1Z2d5IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUuXG4gICAgcmV0dXJuIHVzZXJBZ2VudCAmJiAodXNlckFnZW50Lm1hdGNoKCdWZXJzaW9uLzE1LjQnKSB8fCB1c2VyQWdlbnQubWF0Y2goJ1ZlcnNpb24vMTUuNScpIHx8IHVzZXJBZ2VudC5tYXRjaCgvQ1BVIChPU3xpUGhvbmUgT1MpICgxNV80fDE1XzUpIGxpa2UgTWFjIE9TIFgvKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9yYWdlQXZhaWxhYmxlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSB3aW5kb3dbdHlwZV07XG4gICAgICAgIHN0b3JhZ2Uuc2V0SXRlbSgnX21hcGJveF90ZXN0XycsIDEpO1xuICAgICAgICBzdG9yYWdlLnJlbW92ZUl0ZW0oJ19tYXBib3hfdGVzdF8nKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvd0Jhc2U2NC9CYXNlNjRfZW5jb2RpbmdfYW5kX2RlY29kaW5nI1RoZV9Vbmljb2RlX1Byb2JsZW1cbi8vVW5pY29kZSBjb21wbGlhbnQgYmFzZTY0IGVuY29kZXIgZm9yIHN0cmluZ3NcbmV4cG9ydCBmdW5jdGlvbiBiNjRFbmNvZGVVbmljb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gd2luZG93LmJ0b2EoXG4gICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoLyUoWzAtOUEtRl17Mn0pL2csXG4gICAgICAgICAgICAobWF0Y2gsIHAxKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoTnVtYmVyKCcweCcgKyBwMSkpOyAvL2VzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICk7XG59XG5cbi8vIFVuaWNvZGUgY29tcGxpYW50IGRlY29kZXIgZm9yIGJhc2U2NC1lbmNvZGVkIHN0cmluZ3NcbmV4cG9ydCBmdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5hdG9iKHN0cikuc3BsaXQoJycpLm1hcCgoYykgPT4ge1xuICAgICAgICByZXR1cm4gJyUnICsgKCcwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMik7IC8vZXNsaW50LWRpc2FibGUtbGluZVxuICAgIH0pLmpvaW4oJycpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtbihtYXRyaXg6IE1hdDQsIGNvbDogbnVtYmVyKTogVmVjNCB7XG4gICAgcmV0dXJuIFttYXRyaXhbY29sICogNF0sIG1hdHJpeFtjb2wgKiA0ICsgMV0sIG1hdHJpeFtjb2wgKiA0ICsgMl0sIG1hdHJpeFtjb2wgKiA0ICsgM11dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29sdW1uKG1hdHJpeDogTWF0NCwgY29sOiBudW1iZXIsIHZhbHVlczogVmVjNCkge1xuICAgIG1hdHJpeFtjb2wgKiA0ICsgMF0gPSB2YWx1ZXNbMF07XG4gICAgbWF0cml4W2NvbCAqIDQgKyAxXSA9IHZhbHVlc1sxXTtcbiAgICBtYXRyaXhbY29sICogNCArIDJdID0gdmFsdWVzWzJdO1xuICAgIG1hdHJpeFtjb2wgKiA0ICsgM10gPSB2YWx1ZXNbM107XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcbmNvbnN0IHBlcmZvcm1hbmNlID0gd2luZG93LnBlcmZvcm1hbmNlO1xuXG5wZXJmb3JtYW5jZS5tYXJrKCdsaWJyYXJ5LWV2YWx1YXRlJyk7XG5cbmltcG9ydCB7aXNXb3JrZXJ9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7UmVxdWVzdFBhcmFtZXRlcnN9IGZyb20gJy4uL3V0aWwvYWpheC5qcyc7XG5cbmV4cG9ydCB0eXBlIFBlcmZvcm1hbmNlTWV0cmljcyA9IHtcbiAgICBsb2FkVGltZTogbnVtYmVyLFxuICAgIGZ1bGxMb2FkVGltZTogbnVtYmVyLFxuICAgIHBlcmNlbnREcm9wcGVkRnJhbWVzOiBudW1iZXIsXG4gICAgcGFyc2VUaWxlOiBudW1iZXIsXG4gICAgcGFyc2VUaWxlMTogbnVtYmVyLFxuICAgIHBhcnNlVGlsZTI6IG51bWJlcixcbiAgICB3b3JrZXJUYXNrOiBudW1iZXIsXG4gICAgd29ya2VySW5pdGlhbGl6YXRpb246IG51bWJlcixcbiAgICB3b3JrZXJFdmFsdWF0ZVNjcmlwdDogbnVtYmVyLFxuICAgIHdvcmtlcklkbGU6IG51bWJlcixcbiAgICB3b3JrZXJJZGxlUGVyY2VudDogbnVtYmVyLFxuICAgIHBsYWNlbWVudFRpbWU6IG51bWJlcixcbiAgICB0aW1lbGluZXM6IEFycmF5PE9iamVjdD5cbn07XG5cbmV4cG9ydCB0eXBlIFBlcmZvcm1hbmNlTWFyayA9IHttYXJrOiBzdHJpbmcsIG5hbWU6IHN0cmluZ307XG5cbmV4cG9ydCBjb25zdCBQZXJmb3JtYW5jZU1hcmtlcnMgPSB7XG4gICAgY3JlYXRlOiAnY3JlYXRlJyxcbiAgICBsb2FkOiAnbG9hZCcsXG4gICAgZnVsbExvYWQ6ICdmdWxsTG9hZCdcbn07XG5cbmxldCBmdWxsTG9hZEZpbmlzaGVkID0gZmFsc2U7XG5sZXQgcGxhY2VtZW50VGltZSA9IDA7XG5cbmV4cG9ydCBjb25zdCBQZXJmb3JtYW5jZVV0aWxzID0ge1xuICAgIG1hcmsobWFya2VyOiAkS2V5czx0eXBlb2YgUGVyZm9ybWFuY2VNYXJrZXJzPikge1xuICAgICAgICBwZXJmb3JtYW5jZS5tYXJrKG1hcmtlcik7XG5cbiAgICAgICAgaWYgKG1hcmtlciA9PT0gUGVyZm9ybWFuY2VNYXJrZXJzLmZ1bGxMb2FkKSB7XG4gICAgICAgICAgICBmdWxsTG9hZEZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVhc3VyZShuYW1lOiBzdHJpbmcsIGJlZ2luPzogc3RyaW5nLCBlbmQ/OiBzdHJpbmcpIHtcbiAgICAgICAgcGVyZm9ybWFuY2UubWVhc3VyZShuYW1lLCBiZWdpbiwgZW5kKTtcbiAgICB9LFxuICAgIGJlZ2luTWVhc3VyZShuYW1lOiBzdHJpbmcpOiBQZXJmb3JtYW5jZU1hcmsge1xuICAgICAgICBjb25zdCBtYXJrID0gbmFtZTtcbiAgICAgICAgcGVyZm9ybWFuY2UubWFyayhtYXJrKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1hcmssXG4gICAgICAgICAgICBuYW1lXG4gICAgICAgIH07XG4gICAgfSxcbiAgICBlbmRNZWFzdXJlKG06IFBlcmZvcm1hbmNlTWFyaykge1xuICAgICAgICBwZXJmb3JtYW5jZS5tZWFzdXJlKG0ubmFtZSwgbS5tYXJrKTtcbiAgICB9LFxuICAgIHJlY29yZFBsYWNlbWVudFRpbWUodGltZTogbnVtYmVyKSB7XG4gICAgICAgIC8vIElnbm9yZSBwbGFjZW1lbnRUaW1lcyBkdXJpbmcgbG9hZGluZ1xuICAgICAgICBpZiAoIWZ1bGxMb2FkRmluaXNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBsYWNlbWVudFRpbWUgKz0gdGltZTtcbiAgICB9LFxuICAgIGZyYW1lKHRpbWVzdGFtcDogbnVtYmVyLCBpc1JlbmRlckZyYW1lOiBib29sZWFuKSB7XG4gICAgICAgIHBlcmZvcm1hbmNlLm1hcmsoJ2ZyYW1lJywge1xuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICAgICAgICAgIGlzUmVuZGVyRnJhbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbGVhck1ldHJpY3MoKSB7XG4gICAgICAgIHBsYWNlbWVudFRpbWUgPSAwO1xuICAgICAgICBmdWxsTG9hZEZpbmlzaGVkID0gZmFsc2U7XG5cbiAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcygnbG9hZFRpbWUnKTtcbiAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcygnZnVsbExvYWRUaW1lJyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtYXJrZXIgaW4gUGVyZm9ybWFuY2VNYXJrZXJzKSB7XG4gICAgICAgICAgICBwZXJmb3JtYW5jZS5jbGVhck1hcmtzKFBlcmZvcm1hbmNlTWFya2Vyc1ttYXJrZXJdKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRQZXJmb3JtYW5jZU1ldHJpY3MoKTogUGVyZm9ybWFuY2VNZXRyaWNzIHtcbiAgICAgICAgY29uc3QgbWV0cmljcyA9IHt9O1xuXG4gICAgICAgIHBlcmZvcm1hbmNlLm1lYXN1cmUoJ2xvYWRUaW1lJywgUGVyZm9ybWFuY2VNYXJrZXJzLmNyZWF0ZSwgUGVyZm9ybWFuY2VNYXJrZXJzLmxvYWQpO1xuICAgICAgICBwZXJmb3JtYW5jZS5tZWFzdXJlKCdmdWxsTG9hZFRpbWUnLCBQZXJmb3JtYW5jZU1hcmtlcnMuY3JlYXRlLCBQZXJmb3JtYW5jZU1hcmtlcnMuZnVsbExvYWQpO1xuXG4gICAgICAgIGNvbnN0IG1lYXN1cmVzID0gcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSgnbWVhc3VyZScpO1xuICAgICAgICBmb3IgKGNvbnN0IG1lYXN1cmUgb2YgbWVhc3VyZXMpIHtcbiAgICAgICAgICAgIG1ldHJpY3NbbWVhc3VyZS5uYW1lXSA9IChtZXRyaWNzW21lYXN1cmUubmFtZV0gfHwgMCkgKyBtZWFzdXJlLmR1cmF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgbWV0cmljcy5wbGFjZW1lbnRUaW1lID0gcGxhY2VtZW50VGltZTtcblxuICAgICAgICByZXR1cm4gbWV0cmljcztcbiAgICB9LFxuXG4gICAgZ2V0V29ya2VyUGVyZm9ybWFuY2VNZXRyaWNzKCk6IHsgdGltZU9yaWdpbjogc3RyaW5nLCBlbnRyaWVzOiBBcnJheTxPYmplY3Q+LCBzY29wZTogc3RyaW5nIH0ge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gcGVyZm9ybWFuY2UuZ2V0RW50cmllcygpLm1hcChlbnRyeSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBlbnRyeS50b0pTT04oKTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5kZXRhaWwpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IGVudHJ5LmRldGFpbFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY29wZTogaXNXb3JrZXIoKSA/ICdXb3JrZXInIDogJ1dpbmRvdycsXG4gICAgICAgICAgICB0aW1lT3JpZ2luOiBwZXJmb3JtYW5jZS50aW1lT3JpZ2luLFxuICAgICAgICAgICAgZW50cmllc1xuICAgICAgICB9O1xuICAgIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQZXJmb3JtYW5jZU1lYXN1cmVtZW50KHJlcXVlc3Q6ID9SZXF1ZXN0UGFyYW1ldGVycyk6IEFycmF5PFBlcmZvcm1hbmNlRW50cnk+IHtcbiAgICBjb25zdCB1cmwgPSByZXF1ZXN0ID8gcmVxdWVzdC51cmwudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZSh1cmwpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwZXJmb3JtYW5jZTtcbiIsIi8vIEBmbG93IHN0cmljdFxuXG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93LmpzJztcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlLmpzJztcblxubGV0IGxpbmtFbDtcblxubGV0IHJlZHVjZWRNb3Rpb25RdWVyeTogTWVkaWFRdWVyeUxpc3Q7XG5cbmxldCBzdHViVGltZTtcblxubGV0IGNhbnZhcztcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBleHBvcnRlZCA9IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGVpdGhlciBwZXJmb3JtYW5jZS5ub3coKSBvciBhIHZhbHVlIHNldCBieSBzZXROb3cuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGltZSB2YWx1ZSBpbiBtaWxsaXNlY29uZHMuXG4gICAgICovXG4gICAgbm93KCk6IG51bWJlciB7XG4gICAgICAgIGlmIChzdHViVGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3R1YlRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtcbiAgICB9LFxuICAgIHNldE5vdyh0aW1lOiBudW1iZXIpIHtcbiAgICAgICAgc3R1YlRpbWUgPSB0aW1lO1xuICAgIH0sXG5cbiAgICByZXN0b3JlTm93KCkge1xuICAgICAgICBzdHViVGltZSA9IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgZnJhbWUoZm46IChwYWludFN0YXJ0VGltZXN0YW1wOiBudW1iZXIpID0+IHZvaWQpOiBDYW5jZWxhYmxlIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZuKTtcbiAgICAgICAgcmV0dXJuIHtjYW5jZWw6ICgpID0+IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShmcmFtZSl9O1xuICAgIH0sXG5cbiAgICBnZXRJbWFnZURhdGEoaW1nOiBDYW52YXNJbWFnZVNvdXJjZSwgcGFkZGluZz86IG51bWJlciA9IDApOiBJbWFnZURhdGEge1xuICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBpbWc7XG5cbiAgICAgICAgaWYgKCFjYW52YXMpIHtcbiAgICAgICAgICAgIGNhbnZhcyA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBjcmVhdGUgY2FudmFzIDJkIGNvbnRleHQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3aWR0aCA+IGNhbnZhcy53aWR0aCB8fCBoZWlnaHQgPiBjYW52YXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LmNsZWFyUmVjdCgtcGFkZGluZywgLXBhZGRpbmcsIHdpZHRoICsgMiAqIHBhZGRpbmcsIGhlaWdodCArIDIgKiBwYWRkaW5nKTtcbiAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0SW1hZ2VEYXRhKC1wYWRkaW5nLCAtcGFkZGluZywgd2lkdGggKyAyICogcGFkZGluZywgaGVpZ2h0ICsgMiAqIHBhZGRpbmcpO1xuICAgIH0sXG5cbiAgICByZXNvbHZlVVJMKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghbGlua0VsKSBsaW5rRWwgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBsaW5rRWwuaHJlZiA9IHBhdGg7XG4gICAgICAgIHJldHVybiBsaW5rRWwuaHJlZjtcbiAgICB9LFxuXG4gICAgZ2V0IGRldmljZVBpeGVsUmF0aW8oKTogbnVtYmVyIHsgcmV0dXJuIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOyB9LFxuICAgIGdldCBwcmVmZXJzUmVkdWNlZE1vdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF3aW5kb3cubWF0Y2hNZWRpYSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBMYXppbHkgaW5pdGlhbGl6ZSBtZWRpYSBxdWVyeS5cbiAgICAgICAgaWYgKHJlZHVjZWRNb3Rpb25RdWVyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZWR1Y2VkTW90aW9uUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVkdWNlZE1vdGlvblF1ZXJ5Lm1hdGNoZXM7XG4gICAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV4cG9ydGVkO1xuIiwiLy8gQGZsb3cgc3RyaWN0XG5cbnR5cGUgQ29uZmlnID0ge3xcbiAgQVBJX1VSTDogc3RyaW5nLFxuICBBUElfVVJMX1JFR0VYOiBSZWdFeHAsXG4gIEVWRU5UU19VUkw6ID9zdHJpbmcsXG4gIFNFU1NJT05fUEFUSDogc3RyaW5nLFxuICBGRUVEQkFDS19VUkw6IHN0cmluZyxcbiAgUkVRVUlSRV9BQ0NFU1NfVE9LRU46IGJvb2xlYW4sXG4gIFRJTEVfVVJMX1ZFUlNJT046IHN0cmluZyxcbiAgUkFTVEVSX1VSTF9QUkVGSVg6IHN0cmluZyxcbiAgQUNDRVNTX1RPS0VOOiA/c3RyaW5nLFxuICBNQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFM6IG51bWJlclxufH07XG5cbmxldCBtYXBib3hIVFRQVVJMUmVnZXg7XG5cbmNvbnN0IGNvbmZpZzogQ29uZmlnID0ge1xuICAgIEFQSV9VUkw6ICdodHRwczovL2FwaS5tYXBib3guY29tJyxcbiAgICBnZXQgQVBJX1VSTF9SRUdFWCAoKSB7XG4gICAgICAgIGlmIChtYXBib3hIVFRQVVJMUmVnZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcHJvZE1hcGJveEhUVFBVUkxSZWdleCA9IC9eKChodHRwcz86KT9cXC9cXC8pPyhbXlxcL10rXFwuKT9tYXBib3hcXC5jKG58b20pKFxcL3xcXD98JCkvaTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbWFwYm94SFRUUFVSTFJlZ2V4ID0gKHByb2Nlc3MuZW52LkFQSV9VUkxfUkVHRVggIT0gbnVsbCkgPyBuZXcgUmVnRXhwKHByb2Nlc3MuZW52LkFQSV9VUkxfUkVHRVgpIDogcHJvZE1hcGJveEhUVFBVUkxSZWdleDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBtYXBib3hIVFRQVVJMUmVnZXggPSBwcm9kTWFwYm94SFRUUFVSTFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcGJveEhUVFBVUkxSZWdleDtcbiAgICB9LFxuICAgIGdldCBFVkVOVFNfVVJMKCkge1xuICAgICAgICBpZiAoIXRoaXMuQVBJX1VSTCkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICBpZiAodGhpcy5BUElfVVJMLmluZGV4T2YoJ2h0dHBzOi8vYXBpLm1hcGJveC5jbicpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2h0dHBzOi8vZXZlbnRzLm1hcGJveC5jbi9ldmVudHMvdjInO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuQVBJX1VSTC5pbmRleE9mKCdodHRwczovL2FwaS5tYXBib3guY29tJykgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnaHR0cHM6Ly9ldmVudHMubWFwYm94LmNvbS9ldmVudHMvdjInO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFNFU1NJT05fUEFUSDogJy9tYXAtc2Vzc2lvbnMvdjEnLFxuICAgIEZFRURCQUNLX1VSTDogJ2h0dHBzOi8vYXBwcy5tYXBib3guY29tL2ZlZWRiYWNrJyxcbiAgICBUSUxFX1VSTF9WRVJTSU9OOiAndjQnLFxuICAgIFJBU1RFUl9VUkxfUFJFRklYOiAncmFzdGVyL3YxJyxcbiAgICBSRVFVSVJFX0FDQ0VTU19UT0tFTjogdHJ1ZSxcbiAgICBBQ0NFU1NfVE9LRU46IG51bGwsXG4gICAgTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTOiAxNlxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29uZmlnO1xuIiwiLy8gQGZsb3cgc3RyaWN0XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cuanMnO1xuXG5jb25zdCBleHBvcnRlZCA9IHtcbiAgICBzdXBwb3J0ZWQ6IGZhbHNlLFxuICAgIHRlc3RTdXBwb3J0XG59O1xuXG5leHBvcnQgZGVmYXVsdCBleHBvcnRlZDtcblxubGV0IGdsRm9yVGVzdGluZztcbmxldCB3ZWJwQ2hlY2tDb21wbGV0ZSA9IGZhbHNlO1xubGV0IHdlYnBJbWdUZXN0O1xubGV0IHdlYnBJbWdUZXN0T25sb2FkQ29tcGxldGUgPSBmYWxzZTtcblxuaWYgKHdpbmRvdy5kb2N1bWVudCkge1xuICAgIHdlYnBJbWdUZXN0ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgIHdlYnBJbWdUZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZ2xGb3JUZXN0aW5nKSB0ZXN0V2VicFRleHR1cmVVcGxvYWQoZ2xGb3JUZXN0aW5nKTtcbiAgICAgICAgZ2xGb3JUZXN0aW5nID0gbnVsbDtcbiAgICAgICAgd2VicEltZ1Rlc3RPbmxvYWRDb21wbGV0ZSA9IHRydWU7XG4gICAgfTtcbiAgICB3ZWJwSW1nVGVzdC5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdlYnBDaGVja0NvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgZ2xGb3JUZXN0aW5nID0gbnVsbDtcbiAgICB9O1xuICAgIHdlYnBJbWdUZXN0LnNyYyA9ICdkYXRhOmltYWdlL3dlYnA7YmFzZTY0LFVrbEdSaDRBQUFCWFJVSlFWbEE0VEJFQUFBQXZBUUFBQUFmUS8vNzN2LytCaU9oL0FBQT0nO1xufVxuXG5mdW5jdGlvbiB0ZXN0U3VwcG9ydChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgaWYgKHdlYnBDaGVja0NvbXBsZXRlIHx8ICF3ZWJwSW1nVGVzdCkgcmV0dXJuO1xuXG4gICAgLy8gSFRNTEltYWdlRWxlbWVudC5jb21wbGV0ZSBpcyBzZXQgd2hlbiBhbiBpbWFnZSBpcyBkb25lIGxvYWRpbmcgaXQncyBzb3VyY2VcbiAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3Igbm90LlxuICAgIC8vIEl0J3MgcG9zc2libGUgZm9yIGFuIGVycm9yIHRvIHNldCBIVE1MSW1hZ2VFbGVtZW50LmNvbXBsZXRlIHRvIHRydWUgd2hpY2ggd291bGQgdHJpZ2dlclxuICAgIC8vIHRlc3RXZWJwVGV4dHVyZVVwbG9hZCBhbmQgbWlzdGFrZW5seSBzZXQgZXhwb3J0ZWQuc3VwcG9ydGVkIHRvIHRydWUgaW4gYnJvd3NlcnMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB3ZWJwXG4gICAgLy8gVG8gYXZvaWQgdGhpcywgd2Ugc2V0IGEgZmxhZyBpbiB0aGUgaW1hZ2UncyBvbmxvYWQgaGFuZGxlciBhbmQgb25seSBjYWxsIHRlc3RXZWJwVGV4dHVyZVVwbG9hZFxuICAgIC8vIGFmdGVyIGEgc3VjY2Vzc2Z1bCBpbWFnZSBsb2FkIGV2ZW50LlxuICAgIGlmICh3ZWJwSW1nVGVzdE9ubG9hZENvbXBsZXRlKSB7XG4gICAgICAgIHRlc3RXZWJwVGV4dHVyZVVwbG9hZChnbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2xGb3JUZXN0aW5nID0gZ2w7XG5cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRlc3RXZWJwVGV4dHVyZVVwbG9hZChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gICAgLy8gRWRnZSAxOCBzdXBwb3J0cyBXZWJQIGJ1dCBub3QgdXBsb2FkaW5nIGEgV2ViUCBpbWFnZSB0byBhIGdsIHRleHR1cmVcbiAgICAvLyBUZXN0IHN1cHBvcnQgZm9yIHRoaXMgYmVmb3JlIGFsbG93aW5nIFdlYlAgaW1hZ2VzLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy83NjcxXG4gICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0ZXh0dXJlKTtcblxuICAgIHRyeSB7XG4gICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgd2VicEltZ1Rlc3QpO1xuXG4gICAgICAgIC8vIFRoZSBlcnJvciBkb2VzIG5vdCBnZXQgdHJpZ2dlcmVkIGluIEVkZ2UgaWYgdGhlIGNvbnRleHQgaXMgbG9zdFxuICAgICAgICBpZiAoZ2wuaXNDb250ZXh0TG9zdCgpKSByZXR1cm47XG5cbiAgICAgICAgZXhwb3J0ZWQuc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIENhdGNoIFwiVW5zcGVjaWZpZWQgRXJyb3IuXCIgaW4gRWRnZSAxOC5cbiAgICB9XG5cbiAgICBnbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpO1xuXG4gICAgd2VicENoZWNrQ29tcGxldGUgPSB0cnVlO1xufVxuIiwiLy8gQGZsb3dcblxuLyoqKioqIFNUQVJUIFdBUk5JTkcgUkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhFXG4qIEZPTExPV0lORyBDT0RFIFZJT0xBVEVTIFRIRSBNQVBCT1ggVEVSTVMgT0YgU0VSVklDRSAgKioqKioqXG4qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB1c2VkIHRvIGFjY2VzcyBNYXBib3gncyBBUElzLiBSZW1vdmFsIG9yIG1vZGlmaWNhdGlvblxuKiBvZiB0aGlzIGNvZGUgY2FuIHJlc3VsdCBpbiBoaWdoZXIgZmVlcyBhbmQvb3JcbiogdGVybWluYXRpb24gb2YgeW91ciBhY2NvdW50IHdpdGggTWFwYm94LlxuKlxuKiBVbmRlciB0aGUgTWFwYm94IFRlcm1zIG9mIFNlcnZpY2UsIHlvdSBtYXkgbm90IHVzZSB0aGlzIGNvZGUgdG8gYWNjZXNzIE1hcGJveFxuKiBNYXBwaW5nIEFQSXMgb3RoZXIgdGhhbiB0aHJvdWdoIE1hcGJveCBTREtzLlxuKlxuKiBUaGUgTWFwcGluZyBBUElzIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2FwaS9tYXBzLyNtYXBzXG4qIGFuZCB0aGUgTWFwYm94IFRlcm1zIG9mIFNlcnZpY2UgYXJlIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5tYXBib3guY29tL3Rvcy9cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxudHlwZSBTa3VUb2tlbk9iamVjdCA9IHt8XG4gICAgdG9rZW46IHN0cmluZyxcbiAgICB0b2tlbkV4cGlyZXNBdDogbnVtYmVyXG58fTtcblxuY29uc3QgU0tVX0lEID0gJzAxJztcblxuZnVuY3Rpb24gY3JlYXRlU2t1VG9rZW4oKTogU2t1VG9rZW5PYmplY3Qge1xuICAgIC8vIFNLVV9JRCBhbmQgVE9LRU5fVkVSU0lPTiBhcmUgc3BlY2lmaWVkIGJ5IGFuIGludGVybmFsIHNjaGVtYSBhbmQgc2hvdWxkIG5vdCBjaGFuZ2VcbiAgICBjb25zdCBUT0tFTl9WRVJTSU9OID0gJzEnO1xuICAgIGNvbnN0IGJhc2U2MmNoYXJzID0gJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJztcbiAgICAvLyBzZXNzaW9uUmFuZG9taXplciBpcyBhIHJhbmRvbWl6ZWQgMTAtZGlnaXQgYmFzZS02MiBudW1iZXJcbiAgICBsZXQgc2Vzc2lvblJhbmRvbWl6ZXIgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgc2Vzc2lvblJhbmRvbWl6ZXIgKz0gYmFzZTYyY2hhcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNjIpXTtcbiAgICB9XG4gICAgY29uc3QgZXhwaXJhdGlvbiA9IDEyICogNjAgKiA2MCAqIDEwMDA7IC8vIDEyIGhvdXJzXG4gICAgY29uc3QgdG9rZW4gPSBbVE9LRU5fVkVSU0lPTiwgU0tVX0lELCBzZXNzaW9uUmFuZG9taXplcl0uam9pbignJyk7XG4gICAgY29uc3QgdG9rZW5FeHBpcmVzQXQgPSBEYXRlLm5vdygpICsgZXhwaXJhdGlvbjtcblxuICAgIHJldHVybiB7dG9rZW4sIHRva2VuRXhwaXJlc0F0fTtcbn1cblxuZXhwb3J0IHtjcmVhdGVTa3VUb2tlbiwgU0tVX0lEfTtcblxuLyoqKioqIEVORCBXQVJOSU5HIC0gUkVNT1ZBTCBPUiBNT0RJRklDQVRJT04gT0YgVEhFXG5QUkVDRURJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKi9cbiIsIi8vIEBmbG93XG5cbi8qKioqKiBTVEFSVCBXQVJOSU5HIFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRIRVxuKiBGT0xMT1dJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKlxuKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCB0byBhY2Nlc3MgTWFwYm94J3MgQVBJcy4gUmVtb3ZhbCBvciBtb2RpZmljYXRpb25cbiogb2YgdGhpcyBjb2RlIGNhbiByZXN1bHQgaW4gaGlnaGVyIGZlZXMgYW5kL29yXG4qIHRlcm1pbmF0aW9uIG9mIHlvdXIgYWNjb3VudCB3aXRoIE1hcGJveC5cbipcbiogVW5kZXIgdGhlIE1hcGJveCBUZXJtcyBvZiBTZXJ2aWNlLCB5b3UgbWF5IG5vdCB1c2UgdGhpcyBjb2RlIHRvIGFjY2VzcyBNYXBib3hcbiogTWFwcGluZyBBUElzIG90aGVyIHRoYW4gdGhyb3VnaCBNYXBib3ggU0RLcy5cbipcbiogVGhlIE1hcHBpbmcgQVBJcyBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL2RvY3MubWFwYm94LmNvbS9hcGkvbWFwcy8jbWFwc1xuKiBhbmQgdGhlIE1hcGJveCBUZXJtcyBvZiBTZXJ2aWNlIGFyZSBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubWFwYm94LmNvbS90b3MvXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdy5qcyc7XG5pbXBvcnQgd2VicFN1cHBvcnRlZCBmcm9tICcuL3dlYnBfc3VwcG9ydGVkLmpzJztcbmltcG9ydCB7Y3JlYXRlU2t1VG9rZW4sIFNLVV9JRH0gZnJvbSAnLi9za3VfdG9rZW4uanMnO1xuaW1wb3J0IHt2ZXJzaW9uIGFzIHNka1ZlcnNpb259IGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQge3V1aWQsIHZhbGlkYXRlVXVpZCwgc3RvcmFnZUF2YWlsYWJsZSwgYjY0RGVjb2RlVW5pY29kZSwgYjY0RW5jb2RlVW5pY29kZSwgd2Fybk9uY2UsIGV4dGVuZH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB7cG9zdERhdGEsIFJlc291cmNlVHlwZSwgZ2V0RGF0YX0gZnJvbSAnLi9hamF4LmpzJztcblxuaW1wb3J0IHR5cGUge1JlcXVlc3RQYXJhbWV0ZXJzfSBmcm9tICcuL2FqYXguanMnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVKU09OfSBmcm9tICcuLi90eXBlcy90aWxlanNvbi5qcyc7XG5cbnR5cGUgUmVzb3VyY2VUeXBlRW51bSA9ICRLZXlzPHR5cGVvZiBSZXNvdXJjZVR5cGU+O1xuZXhwb3J0IHR5cGUgUmVxdWVzdFRyYW5zZm9ybUZ1bmN0aW9uID0gKHVybDogc3RyaW5nLCByZXNvdXJjZVR5cGU/OiBSZXNvdXJjZVR5cGVFbnVtKSA9PiBSZXF1ZXN0UGFyYW1ldGVycztcblxudHlwZSBVcmxPYmplY3QgPSB7fFxuICAgIHByb3RvY29sOiBzdHJpbmcsXG4gICAgYXV0aG9yaXR5OiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHBhcmFtczogQXJyYXk8c3RyaW5nPlxufH07XG5cbnR5cGUgRXZlbnRDYWxsYmFjayA9IChlcnI6ID9FcnJvcikgPT4gdm9pZDtcblxuZXhwb3J0IGNvbnN0IEFVVEhfRVJSX01TRzogc3RyaW5nID0gJ05PX0FDQ0VTU19UT0tFTic7XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0TWFuYWdlciB7XG4gICAgX3NrdVRva2VuOiBzdHJpbmc7XG4gICAgX3NrdVRva2VuRXhwaXJlc0F0OiBudW1iZXI7XG4gICAgX3RyYW5zZm9ybVJlcXVlc3RGbjogP1JlcXVlc3RUcmFuc2Zvcm1GdW5jdGlvbjtcbiAgICBfY3VzdG9tQWNjZXNzVG9rZW46ID9zdHJpbmc7XG4gICAgX3NpbGVuY2VBdXRoRXJyb3JzOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IodHJhbnNmb3JtUmVxdWVzdEZuPzogUmVxdWVzdFRyYW5zZm9ybUZ1bmN0aW9uLCBjdXN0b21BY2Nlc3NUb2tlbj86IHN0cmluZywgc2lsZW5jZUF1dGhFcnJvcnM6ID9ib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybVJlcXVlc3RGbiA9IHRyYW5zZm9ybVJlcXVlc3RGbjtcbiAgICAgICAgdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gPSBjdXN0b21BY2Nlc3NUb2tlbjtcbiAgICAgICAgdGhpcy5fc2lsZW5jZUF1dGhFcnJvcnMgPSAhIXNpbGVuY2VBdXRoRXJyb3JzO1xuICAgICAgICB0aGlzLl9jcmVhdGVTa3VUb2tlbigpO1xuICAgIH1cblxuICAgIF9jcmVhdGVTa3VUb2tlbigpIHtcbiAgICAgICAgY29uc3Qgc2t1VG9rZW4gPSBjcmVhdGVTa3VUb2tlbigpO1xuICAgICAgICB0aGlzLl9za3VUb2tlbiA9IHNrdVRva2VuLnRva2VuO1xuICAgICAgICB0aGlzLl9za3VUb2tlbkV4cGlyZXNBdCA9IHNrdVRva2VuLnRva2VuRXhwaXJlc0F0O1xuICAgIH1cblxuICAgIF9pc1NrdVRva2VuRXhwaXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIERhdGUubm93KCkgPiB0aGlzLl9za3VUb2tlbkV4cGlyZXNBdDtcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1SZXF1ZXN0KHVybDogc3RyaW5nLCB0eXBlOiBSZXNvdXJjZVR5cGVFbnVtKTogUmVxdWVzdFBhcmFtZXRlcnMge1xuICAgICAgICBpZiAodGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNmb3JtUmVxdWVzdEZuKHVybCwgdHlwZSkgfHwge3VybH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge3VybH07XG4gICAgfVxuXG4gICAgbm9ybWFsaXplU3R5bGVVUkwodXJsOiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSByZXR1cm4gdXJsO1xuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvc3R5bGVzL3YxJHt1cmxPYmplY3QucGF0aH1gO1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUFQSVVSTCh1cmxPYmplY3QsIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IGFjY2Vzc1Rva2VuKTtcbiAgICB9XG5cbiAgICBub3JtYWxpemVHbHlwaHNVUkwodXJsOiBzdHJpbmcsIGFjY2Vzc1Rva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSByZXR1cm4gdXJsO1xuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgICAgICB1cmxPYmplY3QucGF0aCA9IGAvZm9udHMvdjEke3VybE9iamVjdC5wYXRofWA7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWtlQVBJVVJMKHVybE9iamVjdCwgdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgYWNjZXNzVG9rZW4pO1xuICAgIH1cblxuICAgIG5vcm1hbGl6ZVNvdXJjZVVSTCh1cmw6IHN0cmluZywgYWNjZXNzVG9rZW4/OiA/c3RyaW5nLCBsYW5ndWFnZT86ID9zdHJpbmcsIHdvcmxkdmlldz86ID9zdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWlzTWFwYm94VVJMKHVybCkpIHJldHVybiB1cmw7XG4gICAgICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlVXJsKHVybCk7XG4gICAgICAgIHVybE9iamVjdC5wYXRoID0gYC92NC8ke3VybE9iamVjdC5hdXRob3JpdHl9Lmpzb25gO1xuICAgICAgICAvLyBUaWxlSlNPTiByZXF1ZXN0cyBuZWVkIGEgc2VjdXJlIGZsYWcgYXBwZW5kZWQgdG8gdGhlaXIgVVJMcyBzb1xuICAgICAgICAvLyB0aGF0IHRoZSBzZXJ2ZXIga25vd3MgdG8gc2VuZCBTU0wtaWZpZWQgcmVzb3VyY2UgcmVmZXJlbmNlcy5cbiAgICAgICAgdXJsT2JqZWN0LnBhcmFtcy5wdXNoKCdzZWN1cmUnKTtcbiAgICAgICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICAgICAgICB1cmxPYmplY3QucGFyYW1zLnB1c2goYGxhbmd1YWdlPSR7bGFuZ3VhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdvcmxkdmlldykge1xuICAgICAgICAgICAgdXJsT2JqZWN0LnBhcmFtcy5wdXNoKGB3b3JsZHZpZXc9JHt3b3JsZHZpZXd9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUFQSVVSTCh1cmxPYmplY3QsIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IGFjY2Vzc1Rva2VuKTtcbiAgICB9XG5cbiAgICBub3JtYWxpemVTcHJpdGVVUkwodXJsOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZywgYWNjZXNzVG9rZW4/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgICAgICBpZiAoIWlzTWFwYm94VVJMKHVybCkpIHtcbiAgICAgICAgICAgIHVybE9iamVjdC5wYXRoICs9IGAke2Zvcm1hdH0ke2V4dGVuc2lvbn1gO1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFVybCh1cmxPYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHVybE9iamVjdC5wYXRoID0gYC9zdHlsZXMvdjEke3VybE9iamVjdC5wYXRofS9zcHJpdGUke2Zvcm1hdH0ke2V4dGVuc2lvbn1gO1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUFQSVVSTCh1cmxPYmplY3QsIHRoaXMuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IGFjY2Vzc1Rva2VuKTtcbiAgICB9XG5cbiAgICBub3JtYWxpemVUaWxlVVJMKHRpbGVVUkw6IHN0cmluZywgdXNlMng/OiBib29sZWFuLCByYXN0ZXJUaWxlU2l6ZT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NrdVRva2VuRXhwaXJlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVTa3VUb2tlbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbGVVUkwgJiYgIWlzTWFwYm94VVJMKHRpbGVVUkwpKSByZXR1cm4gdGlsZVVSTDtcblxuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh0aWxlVVJMKTtcbiAgICAgICAgY29uc3QgaW1hZ2VFeHRlbnNpb25SZSA9IC8oXFwuKHBuZ3xqcGcpXFxkKikoPz0kKS87XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHdlYnBTdXBwb3J0ZWQuc3VwcG9ydGVkID8gJy53ZWJwJyA6ICckMSc7XG5cbiAgICAgICAgLy8gVGhlIHY0IG1hcGJveCB0aWxlIEFQSSBzdXBwb3J0cyA1MTJ4NTEyIGltYWdlIHRpbGVzIGJ1dCB0aGV5IG11c3QgYmUgcmVxdWVzdGVkIGFzICdAMngnIHRpbGVzLlxuICAgICAgICBjb25zdCB1c2UyeEFzNTEyID0gcmFzdGVyVGlsZVNpemUgJiYgdXJsT2JqZWN0LmF1dGhvcml0eSAhPT0gJ3Jhc3RlcicgJiYgcmFzdGVyVGlsZVNpemUgPT09IDUxMjtcblxuICAgICAgICBjb25zdCBzdWZmaXggPSB1c2UyeCB8fCB1c2UyeEFzNTEyID8gJ0AyeCcgOiAnJztcbiAgICAgICAgdXJsT2JqZWN0LnBhdGggPSB1cmxPYmplY3QucGF0aC5yZXBsYWNlKGltYWdlRXh0ZW5zaW9uUmUsIGAke3N1ZmZpeH0ke2V4dGVuc2lvbn1gKTtcblxuICAgICAgICBpZiAodXJsT2JqZWN0LmF1dGhvcml0eSA9PT0gJ3Jhc3RlcicpIHtcbiAgICAgICAgICAgIHVybE9iamVjdC5wYXRoID0gYC8ke2NvbmZpZy5SQVNURVJfVVJMX1BSRUZJWH0ke3VybE9iamVjdC5wYXRofWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlVVJMQVBJUHJlZml4UmUgPSAvXi4rXFwvdjRcXC8vO1xuICAgICAgICAgICAgdXJsT2JqZWN0LnBhdGggPSB1cmxPYmplY3QucGF0aC5yZXBsYWNlKHRpbGVVUkxBUElQcmVmaXhSZSwgJy8nKTtcbiAgICAgICAgICAgIHVybE9iamVjdC5wYXRoID0gYC8ke2NvbmZpZy5USUxFX1VSTF9WRVJTSU9OfSR7dXJsT2JqZWN0LnBhdGh9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdGhpcy5fY3VzdG9tQWNjZXNzVG9rZW4gfHwgZ2V0QWNjZXNzVG9rZW4odXJsT2JqZWN0LnBhcmFtcykgfHwgY29uZmlnLkFDQ0VTU19UT0tFTjtcbiAgICAgICAgaWYgKGNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTiAmJiBhY2Nlc3NUb2tlbiAmJiB0aGlzLl9za3VUb2tlbikge1xuICAgICAgICAgICAgdXJsT2JqZWN0LnBhcmFtcy5wdXNoKGBza3U9JHt0aGlzLl9za3VUb2tlbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9tYWtlQVBJVVJMKHVybE9iamVjdCwgYWNjZXNzVG9rZW4pO1xuICAgIH1cblxuICAgIGNhbm9uaWNhbGl6ZVRpbGVVUkwodXJsOiBzdHJpbmcsIHJlbW92ZUFjY2Vzc1Rva2VuOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAgICAgLy8gbWF0Y2hlcyBhbnkgZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIGJ5IGEgZG90IGFuZCBvbmUgb3IgbW9yZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVyc1xuICAgICAgICBjb25zdCBleHRlbnNpb25SZSA9IC9cXC5bXFx3XSskLztcblxuICAgICAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgdmFsaWQgTWFwYm94IHRpbGUgVVJMLlxuICAgICAgICAvLyBIYXMgdG8gYmVnaW4gd2l0aCAvdjQvIG9yIC9yYXN0ZXIvdjEsIHdpdGggYSB2YWxpZCBmaWxlbmFtZSArIGV4dGVuc2lvblxuICAgICAgICBpZiAoIXVybE9iamVjdC5wYXRoLm1hdGNoKC9eKFxcL3Y0XFwvfFxcL3Jhc3RlclxcL3YxXFwvKS8pIHx8ICF1cmxPYmplY3QucGF0aC5tYXRjaChleHRlbnNpb25SZSkpIHtcbiAgICAgICAgICAgIC8vIE5vdCBhIHByb3BlciBNYXBib3ggdGlsZSBVUkwuXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlYXNzZW1ibGUgdGhlIGNhbm9uaWNhbCBVUkwgZnJvbSB0aGUgcGFydHMgd2UndmUgcGFyc2VkIGJlZm9yZS5cbiAgICAgICAgbGV0IHJlc3VsdCA9IFwibWFwYm94Oi8vXCI7XG4gICAgICAgIGlmICh1cmxPYmplY3QucGF0aC5tYXRjaCgvXlxcL3Jhc3RlclxcL3YxXFwvLykpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSB0aWxlIHVybCBoYXMgL3Jhc3Rlci92MS8sIG1ha2UgdGhlIGZpbmFsIFVSTCBtYXBib3g6Ly9yYXN0ZXIvLi4uLlxuICAgICAgICAgICAgY29uc3QgcmFzdGVyUHJlZml4ID0gYC8ke2NvbmZpZy5SQVNURVJfVVJMX1BSRUZJWH0vYDtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgcmFzdGVyLyR7dXJsT2JqZWN0LnBhdGgucmVwbGFjZShyYXN0ZXJQcmVmaXgsICcnKX1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdGlsZXNQcmVmaXggPSBgLyR7Y29uZmlnLlRJTEVfVVJMX1ZFUlNJT059L2A7XG4gICAgICAgICAgICByZXN1bHQgKz0gYHRpbGVzLyR7dXJsT2JqZWN0LnBhdGgucmVwbGFjZSh0aWxlc1ByZWZpeCwgJycpfWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBlbmQgdGhlIHF1ZXJ5IHN0cmluZywgbWludXMgdGhlIGFjY2VzcyB0b2tlbiBwYXJhbWV0ZXIuXG4gICAgICAgIGxldCBwYXJhbXMgPSB1cmxPYmplY3QucGFyYW1zO1xuICAgICAgICBpZiAocmVtb3ZlQWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5maWx0ZXIocCA9PiAhcC5tYXRjaCgvXmFjY2Vzc190b2tlbj0vKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGgpIHJlc3VsdCArPSBgPyR7cGFyYW1zLmpvaW4oJyYnKX1gO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNhbm9uaWNhbGl6ZVRpbGVzZXQodGlsZUpTT046IFRpbGVKU09OLCBzb3VyY2VVUkw/OiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVtb3ZlQWNjZXNzVG9rZW4gPSBzb3VyY2VVUkwgPyBpc01hcGJveFVSTChzb3VyY2VVUkwpIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHVybCBvZiB0aWxlSlNPTi50aWxlcyB8fCBbXSkge1xuICAgICAgICAgICAgaWYgKGlzTWFwYm94SFRUUFVSTCh1cmwpKSB7XG4gICAgICAgICAgICAgICAgY2Fub25pY2FsLnB1c2godGhpcy5jYW5vbmljYWxpemVUaWxlVVJMKHVybCwgcmVtb3ZlQWNjZXNzVG9rZW4pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2Fub25pY2FsLnB1c2godXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2Fub25pY2FsO1xuICAgIH1cblxuICAgIF9tYWtlQVBJVVJMKHVybE9iamVjdDogVXJsT2JqZWN0LCBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgbnVsbCB8IHZvaWQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBoZWxwID0gJ1NlZSBodHRwczovL3d3dy5tYXBib3guY29tL2FwaS1kb2N1bWVudGF0aW9uLyNhY2Nlc3MtdG9rZW5zLWFuZC10b2tlbi1zY29wZXMnO1xuICAgICAgICBjb25zdCBhcGlVcmxPYmplY3QgPSBwYXJzZVVybChjb25maWcuQVBJX1VSTCk7XG4gICAgICAgIHVybE9iamVjdC5wcm90b2NvbCA9IGFwaVVybE9iamVjdC5wcm90b2NvbDtcbiAgICAgICAgdXJsT2JqZWN0LmF1dGhvcml0eSA9IGFwaVVybE9iamVjdC5hdXRob3JpdHk7XG5cbiAgICAgICAgaWYgKHVybE9iamVjdC5wcm90b2NvbCA9PT0gJ2h0dHAnKSB7XG4gICAgICAgICAgICBjb25zdCBpID0gdXJsT2JqZWN0LnBhcmFtcy5pbmRleE9mKCdzZWN1cmUnKTtcbiAgICAgICAgICAgIGlmIChpID49IDApIHVybE9iamVjdC5wYXJhbXMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFwaVVybE9iamVjdC5wYXRoICE9PSAnLycpIHtcbiAgICAgICAgICAgIHVybE9iamVjdC5wYXRoID0gYCR7YXBpVXJsT2JqZWN0LnBhdGh9JHt1cmxPYmplY3QucGF0aH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb25maWcuUkVRVUlSRV9BQ0NFU1NfVE9LRU4pIHJldHVybiBmb3JtYXRVcmwodXJsT2JqZWN0KTtcblxuICAgICAgICBhY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuIHx8IGNvbmZpZy5BQ0NFU1NfVE9LRU47XG4gICAgICAgIGlmICghdGhpcy5fc2lsZW5jZUF1dGhFcnJvcnMpIHtcbiAgICAgICAgICAgIGlmICghYWNjZXNzVG9rZW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbiBBUEkgYWNjZXNzIHRva2VuIGlzIHJlcXVpcmVkIHRvIHVzZSBNYXBib3ggR0wuICR7aGVscH1gKTtcbiAgICAgICAgICAgIGlmIChhY2Nlc3NUb2tlblswXSA9PT0gJ3MnKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVXNlIGEgcHVibGljIGFjY2VzcyB0b2tlbiAocGsuKikgd2l0aCBNYXBib3ggR0wsIG5vdCBhIHNlY3JldCBhY2Nlc3MgdG9rZW4gKHNrLiopLiAke2hlbHB9YCk7XG4gICAgICAgIH1cblxuICAgICAgICB1cmxPYmplY3QucGFyYW1zID0gdXJsT2JqZWN0LnBhcmFtcy5maWx0ZXIoKGQpID0+IGQuaW5kZXhPZignYWNjZXNzX3Rva2VuJykgPT09IC0xKTtcbiAgICAgICAgdXJsT2JqZWN0LnBhcmFtcy5wdXNoKGBhY2Nlc3NfdG9rZW49JHthY2Nlc3NUb2tlbiB8fCAnJ31gKTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFVybCh1cmxPYmplY3QpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFwYm94VVJMKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHVybC5pbmRleE9mKCdtYXBib3g6JykgPT09IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hcGJveEhUVFBVUkwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29uZmlnLkFQSV9VUkxfUkVHRVgudGVzdCh1cmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzQ2FjaGVEZWZlYXRpbmdTa3UodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXJsLmluZGV4T2YoJ3NrdT0nKSA+IDAgJiYgaXNNYXBib3hIVFRQVVJMKHVybCk7XG59XG5cbmZ1bmN0aW9uIGdldEFjY2Vzc1Rva2VuKHBhcmFtczogQXJyYXk8c3RyaW5nPik6IHN0cmluZyB8IG51bGwge1xuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gcGFyYW0ubWF0Y2goL15hY2Nlc3NfdG9rZW49KC4qKSQvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IHVybFJlID0gL14oXFx3Kyk6XFwvXFwvKFteLz9dKikoXFwvW14/XSspP1xcPz8oLispPy87XG5cbmZ1bmN0aW9uIHBhcnNlVXJsKHVybDogc3RyaW5nKTogVXJsT2JqZWN0IHtcbiAgICBjb25zdCBwYXJ0cyA9IHVybC5tYXRjaCh1cmxSZSk7XG4gICAgaWYgKCFwYXJ0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBVUkwgb2JqZWN0Jyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHByb3RvY29sOiBwYXJ0c1sxXSxcbiAgICAgICAgYXV0aG9yaXR5OiBwYXJ0c1syXSxcbiAgICAgICAgcGF0aDogcGFydHNbM10gfHwgJy8nLFxuICAgICAgICBwYXJhbXM6IHBhcnRzWzRdID8gcGFydHNbNF0uc3BsaXQoJyYnKSA6IFtdXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VXJsKG9iajogVXJsT2JqZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJhbXMgPSBvYmoucGFyYW1zLmxlbmd0aCA/IGA/JHtvYmoucGFyYW1zLmpvaW4oJyYnKX1gIDogJyc7XG4gICAgcmV0dXJuIGAke29iai5wcm90b2NvbH06Ly8ke29iai5hdXRob3JpdHl9JHtvYmoucGF0aH0ke3BhcmFtc31gO1xufVxuXG5jb25zdCB0ZWxlbUV2ZW50S2V5ID0gJ21hcGJveC5ldmVudERhdGEnO1xuXG5mdW5jdGlvbiBwYXJzZUFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuOiA/c3RyaW5nKSB7XG4gICAgaWYgKCFhY2Nlc3NUb2tlbikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0cyA9IGFjY2Vzc1Rva2VuLnNwbGl0KCcuJyk7XG4gICAgaWYgKCFwYXJ0cyB8fCBwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGI2NERlY29kZVVuaWNvZGUocGFydHNbMV0pKTtcbiAgICAgICAgcmV0dXJuIGpzb25EYXRhO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG50eXBlIFRlbGVtZXRyeUV2ZW50VHlwZSA9ICdhcHBVc2VyVHVybnN0aWxlJyB8ICdtYXAubG9hZCcgfCAnbWFwLmF1dGgnO1xuXG5jbGFzcyBUZWxlbWV0cnlFdmVudCB7XG4gICAgZXZlbnREYXRhOiBhbnk7XG4gICAgYW5vbklkOiA/c3RyaW5nO1xuICAgIHF1ZXVlOiBBcnJheTxhbnk+O1xuICAgIHR5cGU6IFRlbGVtZXRyeUV2ZW50VHlwZTtcbiAgICBwZW5kaW5nUmVxdWVzdDogP0NhbmNlbGFibGU7XG4gICAgX2N1c3RvbUFjY2Vzc1Rva2VuOiA/c3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVGVsZW1ldHJ5RXZlbnRUeXBlKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYW5vbklkID0gbnVsbDtcbiAgICAgICAgdGhpcy5ldmVudERhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRTdG9yYWdlS2V5KGRvbWFpbjogP3N0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRva2VuRGF0YSA9IHBhcnNlQWNjZXNzVG9rZW4oY29uZmlnLkFDQ0VTU19UT0tFTik7XG4gICAgICAgIGxldCB1ID0gJyc7XG4gICAgICAgIGlmICh0b2tlbkRhdGEgJiYgdG9rZW5EYXRhWyd1J10pIHtcbiAgICAgICAgICAgIHUgPSBiNjRFbmNvZGVVbmljb2RlKHRva2VuRGF0YVsndSddKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHUgPSBjb25maWcuQUNDRVNTX1RPS0VOIHx8ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkb21haW4gP1xuICAgICAgICAgICAgYCR7dGVsZW1FdmVudEtleX0uJHtkb21haW59OiR7dX1gIDpcbiAgICAgICAgICAgIGAke3RlbGVtRXZlbnRLZXl9OiR7dX1gO1xuICAgIH1cblxuICAgIGZldGNoRXZlbnREYXRhKCkge1xuICAgICAgICBjb25zdCBpc0xvY2FsU3RvcmFnZUF2YWlsYWJsZSA9IHN0b3JhZ2VBdmFpbGFibGUoJ2xvY2FsU3RvcmFnZScpO1xuICAgICAgICBjb25zdCBzdG9yYWdlS2V5ID0gdGhpcy5nZXRTdG9yYWdlS2V5KCk7XG4gICAgICAgIGNvbnN0IHV1aWRLZXkgPSB0aGlzLmdldFN0b3JhZ2VLZXkoJ3V1aWQnKTtcblxuICAgICAgICBpZiAoaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUpIHtcbiAgICAgICAgICAgIC8vUmV0cmlldmUgY2FjaGVkIGRhdGFcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50RGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh1dWlkS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAodXVpZCkgdGhpcy5hbm9uSWQgPSB1dWlkO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKCdVbmFibGUgdG8gcmVhZCBmcm9tIExvY2FsU3RvcmFnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2F2ZUV2ZW50RGF0YSgpIHtcbiAgICAgICAgY29uc3QgaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUgPSBzdG9yYWdlQXZhaWxhYmxlKCdsb2NhbFN0b3JhZ2UnKTtcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleSA9ICB0aGlzLmdldFN0b3JhZ2VLZXkoKTtcbiAgICAgICAgY29uc3QgdXVpZEtleSA9IHRoaXMuZ2V0U3RvcmFnZUtleSgndXVpZCcpO1xuICAgICAgICBpZiAoaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHV1aWRLZXksIHRoaXMuYW5vbklkKTtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5ldmVudERhdGEpLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShzdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeSh0aGlzLmV2ZW50RGF0YSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZSgnVW5hYmxlIHRvIHdyaXRlIHRvIExvY2FsU3RvcmFnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBwcm9jZXNzUmVxdWVzdHMoXzogP3N0cmluZykge31cblxuICAgIC8qXG4gICAgKiBJZiBhbnkgZXZlbnQgZGF0YSBzaG91bGQgYmUgcGVyc2lzdGVkIGFmdGVyIHRoZSBQT1NUIHJlcXVlc3QsIHRoZSBjYWxsYmFjayBzaG91bGQgbW9kaWZ5IGV2ZW50RGF0YWBcbiAgICAqIHRvIHRoZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgc2F2ZWQuIEZvciB0aGlzIHJlYXNvbiwgdGhlIGNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIHByaW9yIHRvIHRoZSBjYWxsXG4gICAgKiB0byBUZWxlbWV0cnlFdmVudCNzYXZlRGF0YVxuICAgICovXG4gICAgcG9zdEV2ZW50KHRpbWVzdGFtcDogbnVtYmVyLCBhZGRpdGlvbmFsUGF5bG9hZDoge1tfOiBzdHJpbmddOiBhbnl9LCBjYWxsYmFjazogRXZlbnRDYWxsYmFjaywgY3VzdG9tQWNjZXNzVG9rZW4/OiA/c3RyaW5nKSB7XG4gICAgICAgIGlmICghY29uZmlnLkVWRU5UU19VUkwpIHJldHVybjtcbiAgICAgICAgY29uc3QgZXZlbnRzVXJsT2JqZWN0OiBVcmxPYmplY3QgPSBwYXJzZVVybChjb25maWcuRVZFTlRTX1VSTCk7XG4gICAgICAgIGV2ZW50c1VybE9iamVjdC5wYXJhbXMucHVzaChgYWNjZXNzX3Rva2VuPSR7Y3VzdG9tQWNjZXNzVG9rZW4gfHwgY29uZmlnLkFDQ0VTU19UT0tFTiB8fCAnJ31gKTtcblxuICAgICAgICBjb25zdCBwYXlsb2FkOiBPYmplY3QgPSB7XG4gICAgICAgICAgICBldmVudDogdGhpcy50eXBlLFxuICAgICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUodGltZXN0YW1wKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgc2RrSWRlbnRpZmllcjogJ21hcGJveC1nbC1qcycsXG4gICAgICAgICAgICBzZGtWZXJzaW9uLFxuICAgICAgICAgICAgc2t1SWQ6IFNLVV9JRCxcbiAgICAgICAgICAgIHVzZXJJZDogdGhpcy5hbm9uSWRcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmaW5hbFBheWxvYWQgPSBhZGRpdGlvbmFsUGF5bG9hZCA/IGV4dGVuZChwYXlsb2FkLCBhZGRpdGlvbmFsUGF5bG9hZCkgOiBwYXlsb2FkO1xuICAgICAgICBjb25zdCByZXF1ZXN0OiBSZXF1ZXN0UGFyYW1ldGVycyA9IHtcbiAgICAgICAgICAgIHVybDogZm9ybWF0VXJsKGV2ZW50c1VybE9iamVjdCksXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluJyAvL1NraXAgdGhlIHByZS1mbGlnaHQgT1BUSU9OUyByZXF1ZXN0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoW2ZpbmFsUGF5bG9hZF0pXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IHBvc3REYXRhKHJlcXVlc3QsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgICB0aGlzLnNhdmVFdmVudERhdGEoKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RzKGN1c3RvbUFjY2Vzc1Rva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcXVldWVSZXF1ZXN0KGV2ZW50OiBudW1iZXIgfCB7aWQ6IG51bWJlciwgdGltZXN0YW1wOiBudW1iZXJ9LCBjdXN0b21BY2Nlc3NUb2tlbj86ID9zdHJpbmcpIHtcbiAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKGV2ZW50KTtcbiAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdHMoY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hcExvYWRFdmVudCBleHRlbmRzIFRlbGVtZXRyeUV2ZW50IHtcbiAgICArc3VjY2Vzczoge1tfOiBudW1iZXJdOiBib29sZWFufTtcbiAgICBza3VUb2tlbjogc3RyaW5nO1xuICAgIGVycm9yQ2I6IEV2ZW50Q2FsbGJhY2s7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ21hcC5sb2FkJyk7XG4gICAgICAgIHRoaXMuc3VjY2VzcyA9IHt9O1xuICAgICAgICB0aGlzLnNrdVRva2VuID0gJyc7XG4gICAgfVxuXG4gICAgcG9zdE1hcExvYWRFdmVudChtYXBJZDogbnVtYmVyLCBza3VUb2tlbjogc3RyaW5nLCBjdXN0b21BY2Nlc3NUb2tlbjogP3N0cmluZywgY2FsbGJhY2s6IEV2ZW50Q2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5za3VUb2tlbiA9IHNrdVRva2VuO1xuICAgICAgICB0aGlzLmVycm9yQ2IgPSBjYWxsYmFjaztcblxuICAgICAgICBpZiAoY29uZmlnLkVWRU5UU19VUkwpIHtcbiAgICAgICAgICAgIGlmIChjdXN0b21BY2Nlc3NUb2tlbiB8fCBjb25maWcuQUNDRVNTX1RPS0VOKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZVJlcXVlc3Qoe2lkOiBtYXBJZCwgdGltZXN0YW1wOiBEYXRlLm5vdygpfSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yQ2IobmV3IEVycm9yKEFVVEhfRVJSX01TRykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc1JlcXVlc3RzKGN1c3RvbUFjY2Vzc1Rva2VuPzogP3N0cmluZykge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdCB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB7aWQsIHRpbWVzdGFtcH0gPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgLy8gT25seSBvbmUgbG9hZCBldmVudCBzaG91bGQgZmlyZSBwZXIgbWFwXG4gICAgICAgIGlmIChpZCAmJiB0aGlzLnN1Y2Nlc3NbaWRdKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCF0aGlzLmFub25JZCkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaEV2ZW50RGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWxpZGF0ZVV1aWQodGhpcy5hbm9uSWQpKSB7XG4gICAgICAgICAgICB0aGlzLmFub25JZCA9IHV1aWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdEV2ZW50KHRpbWVzdGFtcCwge3NrdVRva2VuOiB0aGlzLnNrdVRva2VufSwgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JDYihlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaWQpIHRoaXMuc3VjY2Vzc1tpZF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sIGN1c3RvbUFjY2Vzc1Rva2VuKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXBTZXNzaW9uQVBJIGV4dGVuZHMgVGVsZW1ldHJ5RXZlbnQge1xuICAgICtzdWNjZXNzOiB7W186IG51bWJlcl06IGJvb2xlYW59O1xuICAgIHNrdVRva2VuOiBzdHJpbmc7XG4gICAgZXJyb3JDYjogRXZlbnRDYWxsYmFjaztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignbWFwLmF1dGgnKTtcbiAgICAgICAgdGhpcy5zdWNjZXNzID0ge307XG4gICAgICAgIHRoaXMuc2t1VG9rZW4gPSAnJztcbiAgICB9XG5cbiAgICBnZXRTZXNzaW9uKHRpbWVzdGFtcDogbnVtYmVyLCB0b2tlbjogc3RyaW5nLCBjYWxsYmFjazogRXZlbnRDYWxsYmFjaywgY3VzdG9tQWNjZXNzVG9rZW4/OiA/c3RyaW5nKSB7XG4gICAgICAgIGlmICghY29uZmlnLkFQSV9VUkwgfHwgIWNvbmZpZy5TRVNTSU9OX1BBVEgpIHJldHVybjtcbiAgICAgICAgY29uc3QgYXV0aFVybE9iamVjdDogVXJsT2JqZWN0ID0gcGFyc2VVcmwoY29uZmlnLkFQSV9VUkwgKyBjb25maWcuU0VTU0lPTl9QQVRIKTtcbiAgICAgICAgYXV0aFVybE9iamVjdC5wYXJhbXMucHVzaChgc2t1PSR7dG9rZW4gfHwgJyd9YCk7XG4gICAgICAgIGF1dGhVcmxPYmplY3QucGFyYW1zLnB1c2goYGFjY2Vzc190b2tlbj0ke2N1c3RvbUFjY2Vzc1Rva2VuIHx8IGNvbmZpZy5BQ0NFU1NfVE9LRU4gfHwgJyd9YCk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdDogUmVxdWVzdFBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICB1cmw6IGZvcm1hdFVybChhdXRoVXJsT2JqZWN0KSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nLCAvL1NraXAgdGhlIHByZS1mbGlnaHQgT1BUSU9OUyByZXF1ZXN0XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IGdldERhdGEocmVxdWVzdCwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUV2ZW50RGF0YSgpO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVxdWVzdHMoY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRTZXNzaW9uQVBJKG1hcElkOiBudW1iZXIsIHNrdVRva2VuOiBzdHJpbmcsIGN1c3RvbUFjY2Vzc1Rva2VuOiA/c3RyaW5nLCBjYWxsYmFjazogRXZlbnRDYWxsYmFjaykge1xuICAgICAgICB0aGlzLnNrdVRva2VuID0gc2t1VG9rZW47XG4gICAgICAgIHRoaXMuZXJyb3JDYiA9IGNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChjb25maWcuU0VTU0lPTl9QQVRIICYmIGNvbmZpZy5BUElfVVJMKSB7XG4gICAgICAgICAgICBpZiAoY3VzdG9tQWNjZXNzVG9rZW4gfHwgY29uZmlnLkFDQ0VTU19UT0tFTikge1xuICAgICAgICAgICAgICAgIHRoaXMucXVldWVSZXF1ZXN0KHtpZDogbWFwSWQsIHRpbWVzdGFtcDogRGF0ZS5ub3coKX0sIGN1c3RvbUFjY2Vzc1Rva2VuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvckNiKG5ldyBFcnJvcihBVVRIX0VSUl9NU0cpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb2Nlc3NSZXF1ZXN0cyhjdXN0b21BY2Nlc3NUb2tlbj86ID9zdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlcXVlc3QgfHwgdGhpcy5xdWV1ZS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgY29uc3Qge2lkLCB0aW1lc3RhbXB9ID0gdGhpcy5xdWV1ZS5zaGlmdCgpO1xuXG4gICAgICAgIC8vIE9ubHkgb25lIGxvYWQgZXZlbnQgc2hvdWxkIGZpcmUgcGVyIG1hcFxuICAgICAgICBpZiAoaWQgJiYgdGhpcy5zdWNjZXNzW2lkXSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZ2V0U2Vzc2lvbih0aW1lc3RhbXAsIHRoaXMuc2t1VG9rZW4sIChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yQ2IoZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGlkKSB0aGlzLnN1Y2Nlc3NbaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFR1cm5zdGlsZUV2ZW50IGV4dGVuZHMgVGVsZW1ldHJ5RXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGN1c3RvbUFjY2Vzc1Rva2VuPzogP3N0cmluZykge1xuICAgICAgICBzdXBlcignYXBwVXNlclR1cm5zdGlsZScpO1xuICAgICAgICB0aGlzLl9jdXN0b21BY2Nlc3NUb2tlbiA9IGN1c3RvbUFjY2Vzc1Rva2VuO1xuICAgIH1cblxuICAgIHBvc3RUdXJuc3RpbGVFdmVudCh0aWxlVXJsczogQXJyYXk8c3RyaW5nPiwgY3VzdG9tQWNjZXNzVG9rZW4/OiA/c3RyaW5nKSB7XG4gICAgICAgIC8vRW5hYmxlZCBvbmx5IHdoZW4gTWFwYm94IEFjY2VzcyBUb2tlbiBpcyBzZXQgYW5kIGEgc291cmNlIHVzZXNcbiAgICAgICAgLy8gbWFwYm94IHRpbGVzLlxuICAgICAgICBpZiAoY29uZmlnLkVWRU5UU19VUkwgJiZcbiAgICAgICAgICAgIGNvbmZpZy5BQ0NFU1NfVE9LRU4gJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGlsZVVybHMpICYmXG4gICAgICAgICAgICB0aWxlVXJscy5zb21lKHVybCA9PiBpc01hcGJveFVSTCh1cmwpIHx8IGlzTWFwYm94SFRUUFVSTCh1cmwpKSkge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZVJlcXVlc3QoRGF0ZS5ub3coKSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc1JlcXVlc3RzKGN1c3RvbUFjY2Vzc1Rva2VuPzogP3N0cmluZykge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdCB8fCB0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmFub25JZCB8fCAhdGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MgfHwgIXRoaXMuZXZlbnREYXRhLnRva2VuVSkge1xuICAgICAgICAgICAgLy9SZXRyaWV2ZSBjYWNoZWQgZGF0YVxuICAgICAgICAgICAgdGhpcy5mZXRjaEV2ZW50RGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9rZW5EYXRhID0gcGFyc2VBY2Nlc3NUb2tlbihjb25maWcuQUNDRVNTX1RPS0VOKTtcbiAgICAgICAgY29uc3QgdG9rZW5VID0gdG9rZW5EYXRhID8gdG9rZW5EYXRhWyd1J10gOiBjb25maWcuQUNDRVNTX1RPS0VOO1xuICAgICAgICAvL1Jlc2V0IGV2ZW50IGRhdGEgY2FjaGUgaWYgdGhlIGFjY2VzcyB0b2tlbiBvd25lciBjaGFuZ2VkLlxuICAgICAgICBsZXQgZHVlRm9yRXZlbnQgPSB0b2tlblUgIT09IHRoaXMuZXZlbnREYXRhLnRva2VuVTtcblxuICAgICAgICBpZiAoIXZhbGlkYXRlVXVpZCh0aGlzLmFub25JZCkpIHtcbiAgICAgICAgICAgIHRoaXMuYW5vbklkID0gdXVpZCgpO1xuICAgICAgICAgICAgZHVlRm9yRXZlbnQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV4dFVwZGF0ZSA9IHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICAgICAgLy8gUmVjb3JkIHR1cm5zdGlsZSBldmVudCBvbmNlIHBlciBjYWxlbmRhciBkYXkuXG4gICAgICAgIGlmICh0aGlzLmV2ZW50RGF0YS5sYXN0U3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgbGFzdFVwZGF0ZSA9IG5ldyBEYXRlKHRoaXMuZXZlbnREYXRhLmxhc3RTdWNjZXNzKTtcbiAgICAgICAgICAgIGNvbnN0IG5leHREYXRlID0gbmV3IERhdGUobmV4dFVwZGF0ZSk7XG4gICAgICAgICAgICBjb25zdCBkYXlzRWxhcHNlZCA9IChuZXh0VXBkYXRlIC0gdGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MpIC8gKDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgICAgICAgICAgZHVlRm9yRXZlbnQgPSBkdWVGb3JFdmVudCB8fCBkYXlzRWxhcHNlZCA+PSAxIHx8IGRheXNFbGFwc2VkIDwgLTEgfHwgbGFzdFVwZGF0ZS5nZXREYXRlKCkgIT09IG5leHREYXRlLmdldERhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGR1ZUZvckV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZHVlRm9yRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JlcXVlc3RzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBvc3RFdmVudChuZXh0VXBkYXRlLCB7XCJlbmFibGVkLnRlbGVtZXRyeVwiOiBmYWxzZX0sIChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudERhdGEubGFzdFN1Y2Nlc3MgPSBuZXh0VXBkYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnREYXRhLnRva2VuVSA9IHRva2VuVTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgY3VzdG9tQWNjZXNzVG9rZW4pO1xuICAgIH1cbn1cblxuY29uc3QgdHVybnN0aWxlRXZlbnRfID0gbmV3IFR1cm5zdGlsZUV2ZW50KCk7XG5leHBvcnQgY29uc3QgcG9zdFR1cm5zdGlsZUV2ZW50OiAodGlsZVVybHM6IEFycmF5PHN0cmluZz4sIGN1c3RvbUFjY2Vzc1Rva2VuPzogP3N0cmluZykgPT4gdm9pZCA9IHR1cm5zdGlsZUV2ZW50Xy5wb3N0VHVybnN0aWxlRXZlbnQuYmluZCh0dXJuc3RpbGVFdmVudF8pO1xuXG5jb25zdCBtYXBMb2FkRXZlbnRfID0gbmV3IE1hcExvYWRFdmVudCgpO1xuZXhwb3J0IGNvbnN0IHBvc3RNYXBMb2FkRXZlbnQ6IChudW1iZXIsIHN0cmluZywgP3N0cmluZywgRXZlbnRDYWxsYmFjaykgPT4gdm9pZCA9IG1hcExvYWRFdmVudF8ucG9zdE1hcExvYWRFdmVudC5iaW5kKG1hcExvYWRFdmVudF8pO1xuXG5jb25zdCBtYXBTZXNzaW9uQVBJXyA9IG5ldyBNYXBTZXNzaW9uQVBJKCk7XG5leHBvcnQgY29uc3QgZ2V0TWFwU2Vzc2lvbkFQSTogKG51bWJlciwgc3RyaW5nLCA/c3RyaW5nLCBFdmVudENhbGxiYWNrKSA9PiB2b2lkID0gbWFwU2Vzc2lvbkFQSV8uZ2V0U2Vzc2lvbkFQSS5iaW5kKG1hcFNlc3Npb25BUElfKTtcblxuY29uc3QgYXV0aGVudGljYXRlZE1hcHMgPSBuZXcgU2V0KCk7XG5leHBvcnQgZnVuY3Rpb24gc3RvcmVBdXRoU3RhdGUoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgc3RhdGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgYXV0aGVudGljYXRlZE1hcHMuYWRkKGdsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhdXRoZW50aWNhdGVkTWFwcy5kZWxldGUoZ2wpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFwQXV0aGVudGljYXRlZChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGF1dGhlbnRpY2F0ZWRNYXBzLmhhcyhnbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBdXRoU3RhdGUoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xuICAgIGF1dGhlbnRpY2F0ZWRNYXBzLmRlbGV0ZShnbCk7XG59XG5cbi8qKioqKiBFTkQgV0FSTklORyAtIFJFTU9WQUwgT1IgTU9ESUZJQ0FUSU9OIE9GIFRIRVxuUFJFQ0VESU5HIENPREUgVklPTEFURVMgVEhFIE1BUEJPWCBURVJNUyBPRiBTRVJWSUNFICAqKioqKiovXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3dhcm5PbmNlLCBwYXJzZUNhY2hlQ29udHJvbH0gZnJvbSAnLi91dGlsLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi93aW5kb3cuanMnO1xuXG5pbXBvcnQgdHlwZSBEaXNwYXRjaGVyIGZyb20gJy4vZGlzcGF0Y2hlci5qcyc7XG5cbmNvbnN0IENBQ0hFX05BTUUgPSAnbWFwYm94LXRpbGVzJztcbmxldCBjYWNoZUxpbWl0ID0gNTAwOyAvLyA1ME1CIC8gKDEwMEtCL3RpbGUpIH49IDUwMCB0aWxlc1xubGV0IGNhY2hlQ2hlY2tUaHJlc2hvbGQgPSA1MDtcblxuY29uc3QgTUlOX1RJTUVfVU5USUxfRVhQSVJZID0gMTAwMCAqIDYwICogNzsgLy8gNyBtaW51dGVzLiBTa2lwIGNhY2hpbmcgdGlsZXMgd2l0aCBhIHNob3J0IGVub3VnaCBtYXggYWdlLlxuXG5leHBvcnQgdHlwZSBSZXNwb25zZU9wdGlvbnMgPSB7XG4gICAgc3RhdHVzOiBudW1iZXIsXG4gICAgc3RhdHVzVGV4dDogc3RyaW5nLFxuICAgIGhlYWRlcnM6IEhlYWRlcnNcbn07XG5cbi8vIFdlJ3JlIHVzaW5nIGEgZ2xvYmFsIHNoYXJlZCBjYWNoZSBvYmplY3QuIE5vcm1hbGx5LCByZXF1ZXN0aW5nIGFkLWhvYyBDYWNoZSBvYmplY3RzIGlzIGZpbmUsIGJ1dFxuLy8gU2FmYXJpIGhhcyBhIG1lbW9yeSBsZWFrIGluIHdoaWNoIGl0IGZhaWxzIHRvIHJlbGVhc2UgbWVtb3J5IHdoZW4gcmVxdWVzdGluZyBrZXlzKCkgZnJvbSBhIENhY2hlXG4vLyBvYmplY3QuIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjAzOTkxIGZvciBtb3JlIGluZm9ybWF0aW9uLlxubGV0IHNoYXJlZENhY2hlcyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDYWNoZU5hbWUodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGdldFF1ZXJ5UGFyYW1ldGVycyh1cmwpO1xuICAgIGxldCBsYW5ndWFnZTtcbiAgICBsZXQgd29ybGR2aWV3O1xuXG4gICAgaWYgKHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBwYXJhbS5zcGxpdCgnPScpO1xuICAgICAgICAgICAgaWYgKGVudHJ5WzBdID09PSAnbGFuZ3VhZ2UnKSB7XG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSBlbnRyeVsxXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnlbMF0gPT09ICd3b3JsZHZpZXcnKSB7XG4gICAgICAgICAgICAgICAgd29ybGR2aWV3ID0gZW50cnlbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCBjYWNoZU5hbWUgPSBDQUNIRV9OQU1FO1xuICAgIGlmIChsYW5ndWFnZSkgY2FjaGVOYW1lICs9IGAtJHtsYW5ndWFnZX1gO1xuICAgIGlmICh3b3JsZHZpZXcpIGNhY2hlTmFtZSArPSBgLSR7d29ybGR2aWV3fWA7XG4gICAgcmV0dXJuIGNhY2hlTmFtZTtcbn1cblxuZnVuY3Rpb24gY2FjaGVPcGVuKGNhY2hlTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHdpbmRvdy5jYWNoZXMgJiYgIXNoYXJlZENhY2hlc1tjYWNoZU5hbWVdKSB7XG4gICAgICAgIHNoYXJlZENhY2hlc1tjYWNoZU5hbWVdID0gd2luZG93LmNhY2hlcy5vcGVuKGNhY2hlTmFtZSk7XG4gICAgfVxufVxuXG4vLyBXZSdyZSBuZXZlciBjbG9zaW5nIHRoZSBjYWNoZSwgYnV0IG91ciB1bml0IHRlc3RzIHJlbHkgb24gY2hhbmdpbmcgb3V0IHRoZSBnbG9iYWwgd2luZG93LmNhY2hlc1xuLy8gb2JqZWN0LCBzbyB3ZSBoYXZlIGEgZnVuY3Rpb24gc3BlY2lmaWNhbGx5IGZvciB1bml0IHRlc3RzIHRoYXQgYWxsb3dzIHJlc2V0dGluZyB0aGUgc2hhcmVkIGNhY2hlLlxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlQ2xvc2UoKSB7XG4gICAgc2hhcmVkQ2FjaGVzID0ge307XG59XG5cbmxldCByZXNwb25zZUNvbnN0cnVjdG9yU3VwcG9ydHNSZWFkYWJsZVN0cmVhbTtcbmZ1bmN0aW9uIHByZXBhcmVCb2R5KHJlc3BvbnNlOiBSZXNwb25zZSwgY2FsbGJhY2spIHtcbiAgICBpZiAocmVzcG9uc2VDb25zdHJ1Y3RvclN1cHBvcnRzUmVhZGFibGVTdHJlYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmV3IFJlc3BvbnNlKG5ldyBSZWFkYWJsZVN0cmVhbSgpKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgICAgICAgICAgcmVzcG9uc2VDb25zdHJ1Y3RvclN1cHBvcnRzUmVhZGFibGVTdHJlYW0gPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBFZGdlXG4gICAgICAgICAgICByZXNwb25zZUNvbnN0cnVjdG9yU3VwcG9ydHNSZWFkYWJsZVN0cmVhbSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlc3BvbnNlQ29uc3RydWN0b3JTdXBwb3J0c1JlYWRhYmxlU3RyZWFtKSB7XG4gICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlLmJvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlLmJsb2IoKS50aGVuKGNhbGxiYWNrKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZVB1dChyZXF1ZXN0OiBSZXF1ZXN0LCByZXNwb25zZTogUmVzcG9uc2UsIHJlcXVlc3RUaW1lOiBudW1iZXIpIHtcbiAgICBjb25zdCBjYWNoZU5hbWUgPSBnZXRDYWNoZU5hbWUocmVxdWVzdC51cmwpO1xuICAgIGNhY2hlT3BlbihjYWNoZU5hbWUpO1xuICAgIGlmICghc2hhcmVkQ2FjaGVzW2NhY2hlTmFtZV0pIHJldHVybjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IFJlc3BvbnNlT3B0aW9ucyA9IHtcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgIGhlYWRlcnM6IG5ldyB3aW5kb3cuSGVhZGVycygpXG4gICAgfTtcbiAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHYsIGspID0+IG9wdGlvbnMuaGVhZGVycy5zZXQoaywgdikpO1xuXG4gICAgY29uc3QgY2FjaGVDb250cm9sID0gcGFyc2VDYWNoZUNvbnRyb2wocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NhY2hlLUNvbnRyb2wnKSB8fCAnJyk7XG4gICAgaWYgKGNhY2hlQ29udHJvbFsnbm8tc3RvcmUnXSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjYWNoZUNvbnRyb2xbJ21heC1hZ2UnXSkge1xuICAgICAgICBvcHRpb25zLmhlYWRlcnMuc2V0KCdFeHBpcmVzJywgbmV3IERhdGUocmVxdWVzdFRpbWUgKyBjYWNoZUNvbnRyb2xbJ21heC1hZ2UnXSAqIDEwMDApLnRvVVRDU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cGlyZXMgPSBvcHRpb25zLmhlYWRlcnMuZ2V0KCdFeHBpcmVzJyk7XG4gICAgaWYgKCFleHBpcmVzKSByZXR1cm47XG4gICAgY29uc3QgdGltZVVudGlsRXhwaXJ5ID0gbmV3IERhdGUoZXhwaXJlcykuZ2V0VGltZSgpIC0gcmVxdWVzdFRpbWU7XG4gICAgaWYgKHRpbWVVbnRpbEV4cGlyeSA8IE1JTl9USU1FX1VOVElMX0VYUElSWSkgcmV0dXJuO1xuXG4gICAgcHJlcGFyZUJvZHkocmVzcG9uc2UsIGJvZHkgPT4ge1xuICAgICAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IG5ldyB3aW5kb3cuUmVzcG9uc2UoYm9keSwgb3B0aW9ucyk7XG5cbiAgICAgICAgY2FjaGVPcGVuKGNhY2hlTmFtZSk7XG4gICAgICAgIGlmICghc2hhcmVkQ2FjaGVzW2NhY2hlTmFtZV0pIHJldHVybjtcbiAgICAgICAgc2hhcmVkQ2FjaGVzW2NhY2hlTmFtZV1cbiAgICAgICAgICAgIC50aGVuKGNhY2hlID0+IGNhY2hlLnB1dChzdHJpcFF1ZXJ5UGFyYW1ldGVycyhyZXF1ZXN0LnVybCksIGNsb25lZFJlc3BvbnNlKSlcbiAgICAgICAgICAgIC5jYXRjaChlID0+IHdhcm5PbmNlKGUubWVzc2FnZSkpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRRdWVyeVBhcmFtZXRlcnModXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXJhbVN0YXJ0ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICByZXR1cm4gcGFyYW1TdGFydCA+IDAgPyB1cmwuc2xpY2UocGFyYW1TdGFydCArIDEpLnNwbGl0KCcmJykgOiBbXTtcbn1cblxuZnVuY3Rpb24gc3RyaXBRdWVyeVBhcmFtZXRlcnModXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzdGFydCA9IHVybC5pbmRleE9mKCc/Jyk7XG5cbiAgICBpZiAoc3RhcnQgPCAwKSByZXR1cm4gdXJsO1xuXG4gICAgY29uc3QgcGFyYW1zID0gZ2V0UXVlcnlQYXJhbWV0ZXJzKHVybCk7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBwYXJhbXMuZmlsdGVyKHBhcmFtID0+IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBwYXJhbS5zcGxpdCgnPScpO1xuICAgICAgICByZXR1cm4gZW50cnlbMF0gPT09ICdsYW5ndWFnZScgfHwgZW50cnlbMF0gPT09ICd3b3JsZHZpZXcnO1xuICAgIH0pO1xuXG4gICAgaWYgKGZpbHRlcmVkUGFyYW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gYCR7dXJsLnNsaWNlKDAsIHN0YXJ0KX0/JHtmaWx0ZXJlZFBhcmFtcy5qb2luKCcmJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsLnNsaWNlKDAsIHN0YXJ0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlR2V0KHJlcXVlc3Q6IFJlcXVlc3QsIGNhbGxiYWNrOiAoZXJyb3I6ID9hbnksIHJlc3BvbnNlOiA/UmVzcG9uc2UsIGZyZXNoOiA/Ym9vbGVhbikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IGNhY2hlTmFtZSA9IGdldENhY2hlTmFtZShyZXF1ZXN0LnVybCk7XG4gICAgY2FjaGVPcGVuKGNhY2hlTmFtZSk7XG4gICAgaWYgKCFzaGFyZWRDYWNoZXNbY2FjaGVOYW1lXSkgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgY29uc3Qgc3RyaXBwZWRVUkwgPSBzdHJpcFF1ZXJ5UGFyYW1ldGVycyhyZXF1ZXN0LnVybCk7XG5cbiAgICBzaGFyZWRDYWNoZXNbY2FjaGVOYW1lXVxuICAgICAgICAudGhlbihjYWNoZSA9PiB7XG4gICAgICAgICAgICAvLyBtYW51YWxseSBzdHJpcCBVUkwgaW5zdGVhZCBvZiBgaWdub3JlU2VhcmNoOiB0cnVlYCBiZWNhdXNlIG9mIGEga25vd25cbiAgICAgICAgICAgIC8vIHBlcmZvcm1hbmNlIGlzc3VlIGluIENocm9tZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvODQzMVxuICAgICAgICAgICAgY2FjaGUubWF0Y2goc3RyaXBwZWRVUkwpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcmVzaCA9IGlzRnJlc2gocmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlaW5zZXJ0IGludG8gY2FjaGUgc28gdGhhdCBvcmRlciBvZiBrZXlzIGluIHRoZSBjYWNoZSBpcyB0aGUgb3JkZXIgb2YgYWNjZXNzLlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGxpbmUgbWFrZXMgdGhlIGNhY2hlIGEgTFJVIGluc3RlYWQgb2YgYSBGSUZPIGNhY2hlLlxuICAgICAgICAgICAgICAgICAgICBjYWNoZS5kZWxldGUoc3RyaXBwZWRVUkwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJlc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnB1dChzdHJpcHBlZFVSTCwgcmVzcG9uc2UuY2xvbmUoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNwb25zZSwgZnJlc2gpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGNhbGxiYWNrKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGNhbGxiYWNrKTtcblxufVxuXG5mdW5jdGlvbiBpc0ZyZXNoKHJlc3BvbnNlKSB7XG4gICAgaWYgKCFyZXNwb25zZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGV4cGlyZXMgPSBuZXcgRGF0ZShyZXNwb25zZS5oZWFkZXJzLmdldCgnRXhwaXJlcycpIHx8IDApO1xuICAgIGNvbnN0IGNhY2hlQ29udHJvbCA9IHBhcnNlQ2FjaGVDb250cm9sKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDYWNoZS1Db250cm9sJykgfHwgJycpO1xuICAgIHJldHVybiBleHBpcmVzID4gRGF0ZS5ub3coKSAmJiAhY2FjaGVDb250cm9sWyduby1jYWNoZSddO1xufVxuXG4vLyBgSW5maW5pdHlgIHRyaWdnZXJzIGEgY2FjaGUgY2hlY2sgYWZ0ZXIgdGhlIGZpcnN0IHRpbGUgaXMgbG9hZGVkXG4vLyBzbyB0aGF0IGEgY2hlY2sgaXMgcnVuIGF0IGxlYXN0IG9uY2Ugb24gZWFjaCBwYWdlIGxvYWQuXG5sZXQgZ2xvYmFsRW50cnlDb3VudGVyID0gSW5maW5pdHk7XG5cbi8vIFRoZSBjYWNoZSBjaGVjayBnZXRzIHJ1biBvbiBhIHdvcmtlci4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0XG4vLyBwcm9maWxpbmcgc29tZXRpbWVzIHNob3dzIHRoaXMgYXMgdGFraW5nIHVwIHNpZ25pZmljYW50IHRpbWUgb24gdGhlXG4vLyB0aHJlYWQgaXQgZ2V0cyBjYWxsZWQgZnJvbS4gQW5kIHNvbWV0aW1lcyBpdCBkb2Vzbid0LiBJdCAqbWF5KiBiZVxuLy8gZmluZSB0byBydW4gdGhpcyBvbiB0aGUgbWFpbiB0aHJlYWQgYnV0IG91dCBvZiBjYXV0aW9uIHRoaXMgaXMgYmVpbmdcbi8vIGRpc3BhdGNoZWQgb24gYSB3b3JrZXIuIFRoaXMgY2FuIGJlIGludmVzdGlnYXRlZCBmdXJ0aGVyIGluIHRoZSBmdXR1cmUuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVFbnRyeVBvc3NpYmx5QWRkZWQoZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcikge1xuICAgIGdsb2JhbEVudHJ5Q291bnRlcisrO1xuICAgIGlmIChnbG9iYWxFbnRyeUNvdW50ZXIgPiBjYWNoZUNoZWNrVGhyZXNob2xkKSB7XG4gICAgICAgIGRpc3BhdGNoZXIuZ2V0QWN0b3IoKS5zZW5kKCdlbmZvcmNlQ2FjaGVTaXplTGltaXQnLCBjYWNoZUxpbWl0KTtcbiAgICAgICAgZ2xvYmFsRW50cnlDb3VudGVyID0gMDtcbiAgICB9XG59XG5cbi8vIHJ1bnMgb24gd29ya2VyLCBzZWUgYWJvdmUgY29tbWVudFxuZXhwb3J0IGZ1bmN0aW9uIGVuZm9yY2VDYWNoZVNpemVMaW1pdChsaW1pdDogbnVtYmVyKSB7XG4gICAgZm9yIChjb25zdCBzaGFyZWRDYWNoZSBpbiBzaGFyZWRDYWNoZXMpIHtcbiAgICAgICAgY2FjaGVPcGVuKHNoYXJlZENhY2hlKTtcblxuICAgICAgICBzaGFyZWRDYWNoZXNbc2hhcmVkQ2FjaGVdLnRoZW4oY2FjaGUgPT4ge1xuICAgICAgICAgICAgY2FjaGUua2V5cygpLnRoZW4oa2V5cyA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIGxpbWl0OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY2FjaGUuZGVsZXRlKGtleXNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclRpbGVDYWNoZShjYWxsYmFjaz86IChlcnI6ID9FcnJvcikgPT4gdm9pZCkge1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgZm9yIChjb25zdCBjYWNoZSBpbiBzaGFyZWRDYWNoZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh3aW5kb3cuY2FjaGVzLmRlbGV0ZShjYWNoZSkpO1xuICAgICAgICBkZWxldGUgc2hhcmVkQ2FjaGVzW2NhY2hlXTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLmNhdGNoKGNhbGxiYWNrKS50aGVuKCgpID0+IGNhbGxiYWNrKCkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENhY2hlTGltaXRzKGxpbWl0OiBudW1iZXIsIGNoZWNrVGhyZXNob2xkOiBudW1iZXIpIHtcbiAgICBjYWNoZUxpbWl0ID0gbGltaXQ7XG4gICAgY2FjaGVDaGVja1RocmVzaG9sZCA9IGNoZWNrVGhyZXNob2xkO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdy5qcyc7XG5pbXBvcnQge2V4dGVuZCwgd2Fybk9uY2UsIGlzV29ya2VyfSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IHtpc01hcGJveEhUVFBVUkwsIGhhc0NhY2hlRGVmZWF0aW5nU2t1fSBmcm9tICcuL21hcGJveC5qcyc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7Y2FjaGVHZXQsIGNhY2hlUHV0fSBmcm9tICcuL3RpbGVfcmVxdWVzdF9jYWNoZS5qcyc7XG5pbXBvcnQgd2VicFN1cHBvcnRlZCBmcm9tICcuL3dlYnBfc3VwcG9ydGVkLmpzJztcblxuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZS5qcyc7XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgYSByZXNvdXJjZS5cbiAqIEBwcml2YXRlXG4gKiBAcmVhZG9ubHlcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFJlc291cmNlVHlwZSA9IHtcbiAgICBVbmtub3duOiAnVW5rbm93bicsXG4gICAgU3R5bGU6ICdTdHlsZScsXG4gICAgU291cmNlOiAnU291cmNlJyxcbiAgICBUaWxlOiAnVGlsZScsXG4gICAgR2x5cGhzOiAnR2x5cGhzJyxcbiAgICBTcHJpdGVJbWFnZTogJ1Nwcml0ZUltYWdlJyxcbiAgICBTcHJpdGVKU09OOiAnU3ByaXRlSlNPTicsXG4gICAgSW1hZ2U6ICdJbWFnZSdcbn07XG5leHBvcnQge1Jlc291cmNlVHlwZX07XG5cbmlmICh0eXBlb2YgT2JqZWN0LmZyZWV6ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgT2JqZWN0LmZyZWV6ZShSZXNvdXJjZVR5cGUpO1xufVxuXG4vKipcbiAqIEEgYFJlcXVlc3RQYXJhbWV0ZXJzYCBvYmplY3QgdG8gYmUgcmV0dXJuZWQgZnJvbSBNYXAub3B0aW9ucy50cmFuc2Zvcm1SZXF1ZXN0IGNhbGxiYWNrcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFJlcXVlc3RQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcmVxdWVzdGVkLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGhlYWRlcnMgVGhlIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZSByZXF1ZXN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1ldGhvZCBSZXF1ZXN0IG1ldGhvZCBgJ0dFVCcgfCAnUE9TVCcgfCAnUFVUJ2AuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYm9keSBSZXF1ZXN0IGJvZHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBSZXNwb25zZSBib2R5IHR5cGUgdG8gYmUgcmV0dXJuZWQgYCdzdHJpbmcnIHwgJ2pzb24nIHwgJ2FycmF5QnVmZmVyJ2AuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3JlZGVudGlhbHMgYCdzYW1lLW9yaWdpbid8J2luY2x1ZGUnYCBVc2UgJ2luY2x1ZGUnIHRvIHNlbmQgY29va2llcyB3aXRoIGNyb3NzLW9yaWdpbiByZXF1ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY29sbGVjdFJlc291cmNlVGltaW5nIElmIHRydWUsIFJlc291cmNlIFRpbWluZyBBUEkgaW5mb3JtYXRpb24gd2lsbCBiZSBjb2xsZWN0ZWQgZm9yIHRoZXNlIHRyYW5zZm9ybWVkIHJlcXVlc3RzIGFuZCByZXR1cm5lZCBpbiBhIHJlc291cmNlVGltaW5nIHByb3BlcnR5IG9mIHJlbGV2YW50IGRhdGEgZXZlbnRzLlxuICogQGV4YW1wbGVcbiAqIC8vIHVzZSB0cmFuc2Zvcm1SZXF1ZXN0IHRvIG1vZGlmeSByZXF1ZXN0cyB0aGF0IGJlZ2luIHdpdGggYGh0dHA6Ly9teUhvc3RgXG4gKiBjb25zdCBtYXAgPSBuZXcgTWFwKHtcbiAqICAgICBjb250YWluZXI6ICdtYXAnLFxuICogICAgIHN0eWxlOiAnbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zdHJlZXRzLXYxMScsXG4gKiAgICAgdHJhbnNmb3JtUmVxdWVzdDogKHVybCwgcmVzb3VyY2VUeXBlKSA9PiB7XG4gKiAgICAgICAgIGlmIChyZXNvdXJjZVR5cGUgPT09ICdTb3VyY2UnICYmIHVybC5pbmRleE9mKCdodHRwOi8vbXlIb3N0JykgPiAtMSkge1xuICogICAgICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICAgICAgICB1cmw6IHVybC5yZXBsYWNlKCdodHRwJywgJ2h0dHBzJyksXG4gKiAgICAgICAgICAgICAgICAgaGVhZGVyczogeydteS1jdXN0b20taGVhZGVyJzogdHJ1ZX0sXG4gKiAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyAgLy8gSW5jbHVkZSBjb29raWVzIGZvciBjcm9zcy1vcmlnaW4gcmVxdWVzdHNcbiAqICAgICAgICAgICAgIH07XG4gKiAgICAgICAgIH1cbiAqICAgICB9XG4gKiB9KTtcbiAqXG4gKi9cbmV4cG9ydCB0eXBlIFJlcXVlc3RQYXJhbWV0ZXJzID0ge1xuICAgIHVybDogc3RyaW5nLFxuICAgIGhlYWRlcnM/OiBPYmplY3QsXG4gICAgbWV0aG9kPzogJ0dFVCcgfCAnUE9TVCcgfCAnUFVUJyxcbiAgICBib2R5Pzogc3RyaW5nLFxuICAgIHR5cGU/OiAnc3RyaW5nJyB8ICdqc29uJyB8ICdhcnJheUJ1ZmZlcicsXG4gICAgY3JlZGVudGlhbHM/OiAnc2FtZS1vcmlnaW4nIHwgJ2luY2x1ZGUnLFxuICAgIGNvbGxlY3RSZXNvdXJjZVRpbWluZz86IGJvb2xlYW5cbn07XG5cbmV4cG9ydCB0eXBlIFJlc3BvbnNlQ2FsbGJhY2s8VD4gPSAoZXJyb3I6ID9FcnJvciwgZGF0YTogP1QsIGNhY2hlQ29udHJvbDogP3N0cmluZywgZXhwaXJlczogP3N0cmluZykgPT4gdm9pZDtcblxuZXhwb3J0IGNsYXNzIEFKQVhFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICB1cmw6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyLCB1cmw6IHN0cmluZykge1xuICAgICAgICBpZiAoc3RhdHVzID09PSA0MDEgJiYgaXNNYXBib3hIVFRQVVJMKHVybCkpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgKz0gJzogeW91IG1heSBoYXZlIHByb3ZpZGVkIGFuIGludmFsaWQgTWFwYm94IGFjY2VzcyB0b2tlbi4gU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vYXBpLWRvY3VtZW50YXRpb24vI2FjY2Vzcy10b2tlbnMtYW5kLXRva2VuLXNjb3Blcyc7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9ICgke3RoaXMuc3RhdHVzfSk6ICR7dGhpcy51cmx9YDtcbiAgICB9XG59XG5cbi8vIEVuc3VyZSB0aGF0IHdlJ3JlIHNlbmRpbmcgdGhlIGNvcnJlY3QgcmVmZXJyZXIgZnJvbSBibG9iIFVSTCB3b3JrZXIgYnVuZGxlcy5cbi8vIEZvciBmaWxlcyBsb2FkZWQgZnJvbSB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0sIGBsb2NhdGlvbi5vcmlnaW5gIHdpbGwgYmUgc2V0XG4vLyB0byB0aGUgc3RyaW5nKCEpIFwibnVsbFwiIChGaXJlZm94KSwgb3IgXCJmaWxlOi8vXCIgKENocm9tZSwgU2FmYXJpLCBFZGdlLCBJRSksXG4vLyBhbmQgd2Ugd2lsbCBzZXQgYW4gZW1wdHkgcmVmZXJyZXIuIE90aGVyd2lzZSwgd2UncmUgdXNpbmcgdGhlIGRvY3VtZW50J3MgVVJMLlxuLyogZ2xvYmFsIHNlbGYgKi9cbmV4cG9ydCBjb25zdCBnZXRSZWZlcnJlcjogKCgpID0+IHN0cmluZykgPSBpc1dvcmtlcigpID9cbiAgICAoKSA9PiBzZWxmLndvcmtlciAmJiBzZWxmLndvcmtlci5yZWZlcnJlciA6XG4gICAgKCkgPT4gKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2Jsb2I6JyA/IHdpbmRvdy5wYXJlbnQgOiB3aW5kb3cpLmxvY2F0aW9uLmhyZWY7XG5cbi8vIERldGVybWluZXMgd2hldGhlciBhIFVSTCBpcyBhIGZpbGU6Ly8gVVJMLiBUaGlzIGlzIG9idmlvdXNseSB0aGUgY2FzZSBpZiBpdCBiZWdpbnNcbi8vIHdpdGggZmlsZTovLy4gUmVsYXRpdmUgVVJMcyBhcmUgYWxzbyBmaWxlOi8vIFVSTHMgaWZmIHRoZSBvcmlnaW5hbCBkb2N1bWVudCB3YXMgbG9hZGVkXG4vLyB2aWEgYSBmaWxlOi8vIFVSTC5cbmNvbnN0IGlzRmlsZVVSTCA9IHVybCA9PiAvXmZpbGU6Ly50ZXN0KHVybCkgfHwgKC9eZmlsZTovLnRlc3QoZ2V0UmVmZXJyZXIoKSkgJiYgIS9eXFx3KzovLnRlc3QodXJsKSk7XG5cbmZ1bmN0aW9uIG1ha2VGZXRjaFJlcXVlc3QocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxhbnk+KTogQ2FuY2VsYWJsZSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyB3aW5kb3cuQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyB3aW5kb3cuUmVxdWVzdChyZXF1ZXN0UGFyYW1ldGVycy51cmwsIHtcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0UGFyYW1ldGVycy5tZXRob2QgfHwgJ0dFVCcsXG4gICAgICAgIGJvZHk6IHJlcXVlc3RQYXJhbWV0ZXJzLmJvZHksXG4gICAgICAgIGNyZWRlbnRpYWxzOiByZXF1ZXN0UGFyYW1ldGVycy5jcmVkZW50aWFscyxcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdFBhcmFtZXRlcnMuaGVhZGVycyxcbiAgICAgICAgcmVmZXJyZXI6IGdldFJlZmVycmVyKCksXG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWxcbiAgICB9KTtcbiAgICBsZXQgY29tcGxldGUgPSBmYWxzZTtcbiAgICBsZXQgYWJvcnRlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FjaGVJZ25vcmluZ1NlYXJjaCA9IGhhc0NhY2hlRGVmZWF0aW5nU2t1KHJlcXVlc3QudXJsKTtcblxuICAgIGlmIChyZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnanNvbicpIHtcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldCgnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZU9yRmV0Y2ggPSAoZXJyLCBjYWNoZWRSZXNwb25zZSwgcmVzcG9uc2VJc0ZyZXNoKSA9PiB7XG4gICAgICAgIGlmIChhYm9ydGVkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgLy8gRG8gZmV0Y2ggaW4gY2FzZSBvZiBjYWNoZSBlcnJvci5cbiAgICAgICAgICAgIC8vIEhUVFAgcGFnZXMgaW4gRWRnZSB0cmlnZ2VyIGEgc2VjdXJpdHkgZXJyb3IgdGhhdCBjYW4gYmUgaWdub3JlZC5cbiAgICAgICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gJ1NlY3VyaXR5RXJyb3InKSB7XG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZWRSZXNwb25zZSAmJiByZXNwb25zZUlzRnJlc2gpIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5pc2hSZXF1ZXN0KGNhY2hlZFJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZWRSZXNwb25zZSkge1xuICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZG8gcmV2YWxpZGF0aW9uIHdpdGggJ0lmLU5vbmUtTWF0Y2gnIGJlY2F1c2UgdGhlbiB0aGVcbiAgICAgICAgICAgIC8vIHJlcXVlc3QgZG9lc24ndCBoYXZlIHNpbXBsZSBjb3JzIGhlYWRlcnMuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXF1ZXN0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgd2luZG93LmZldGNoKHJlcXVlc3QpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVhYmxlUmVzcG9uc2UgPSBjYWNoZUlnbm9yaW5nU2VhcmNoID8gcmVzcG9uc2UuY2xvbmUoKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmlzaFJlcXVlc3QocmVzcG9uc2UsIGNhY2hlYWJsZVJlc3BvbnNlLCByZXF1ZXN0VGltZSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBBSkFYRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCwgcmVzcG9uc2Uuc3RhdHVzLCByZXF1ZXN0UGFyYW1ldGVycy51cmwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IDIwKSB7XG4gICAgICAgICAgICAgICAgLy8gc2lsZW5jZSBleHBlY3RlZCBBYm9ydEVycm9yXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGZpbmlzaFJlcXVlc3QgPSAocmVzcG9uc2UsIGNhY2hlYWJsZVJlc3BvbnNlLCByZXF1ZXN0VGltZSkgPT4ge1xuICAgICAgICAoXG4gICAgICAgICAgICByZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnYXJyYXlCdWZmZXInID8gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSA6XG4gICAgICAgICAgICByZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnanNvbicgPyByZXNwb25zZS5qc29uKCkgOlxuICAgICAgICAgICAgcmVzcG9uc2UudGV4dCgpXG4gICAgICAgICkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChjYWNoZWFibGVSZXNwb25zZSAmJiByZXF1ZXN0VGltZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBuZWVkcyB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjYWNoZSBhZnRlciBpdCBoYXMgY29tcGxldGVseSBsb2FkZWQuXG4gICAgICAgICAgICAgICAgLy8gVW50aWwgaXQgaXMgZnVsbHkgbG9hZGVkIHRoZXJlIGlzIGEgY2hhbmNlIGl0IHdpbGwgYmUgYWJvcnRlZC4gQWJvcnRpbmcgd2hpbGVcbiAgICAgICAgICAgICAgICAvLyByZWFkaW5nIHRoZSBib2R5IGNhbiBjYXVzZSB0aGUgY2FjaGUgaW5zZXJ0aW9uIHRvIGVycm9yLiBXZSBjb3VsZCBjYXRjaCB0aGlzIGVycm9yXG4gICAgICAgICAgICAgICAgLy8gaW4gbW9zdCBicm93c2VycyBidXQgaW4gRmlyZWZveCBpdCBzZWVtcyB0byBzb21ldGltZXMgY3Jhc2ggdGhlIHRhYi4gQWRkaW5nXG4gICAgICAgICAgICAgICAgLy8gaXQgdG8gdGhlIGNhY2hlIGhlcmUgYXZvaWRzIHRoYXQgZXJyb3IuXG4gICAgICAgICAgICAgICAgY2FjaGVQdXQocmVxdWVzdCwgY2FjaGVhYmxlUmVzcG9uc2UsIHJlcXVlc3RUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCwgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NhY2hlLUNvbnRyb2wnKSwgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0V4cGlyZXMnKSk7XG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBpZiAoIWFib3J0ZWQpIGNhbGxiYWNrKG5ldyBFcnJvcihlcnIubWVzc2FnZSkpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgaWYgKGNhY2hlSWdub3JpbmdTZWFyY2gpIHtcbiAgICAgICAgY2FjaGVHZXQocmVxdWVzdCwgdmFsaWRhdGVPckZldGNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YWxpZGF0ZU9yRmV0Y2gobnVsbCwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIGlmICghY29tcGxldGUpIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9fTtcbn1cblxuZnVuY3Rpb24gbWFrZVhNTEh0dHBSZXF1ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8YW55Pik6IENhbmNlbGFibGUge1xuICAgIGNvbnN0IHhocjogWE1MSHR0cFJlcXVlc3QgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICB4aHIub3BlbihyZXF1ZXN0UGFyYW1ldGVycy5tZXRob2QgfHwgJ0dFVCcsIHJlcXVlc3RQYXJhbWV0ZXJzLnVybCwgdHJ1ZSk7XG4gICAgaWYgKHJlcXVlc3RQYXJhbWV0ZXJzLnR5cGUgPT09ICdhcnJheUJ1ZmZlcicpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7XG4gICAgfVxuICAgIGZvciAoY29uc3QgayBpbiByZXF1ZXN0UGFyYW1ldGVycy5oZWFkZXJzKSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGssIHJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnNba10pO1xuICAgIH1cbiAgICBpZiAocmVxdWVzdFBhcmFtZXRlcnMudHlwZSA9PT0gJ2pzb24nKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAndGV4dCc7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgIH1cbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdFBhcmFtZXRlcnMuY3JlZGVudGlhbHMgPT09ICdpbmNsdWRlJztcbiAgICB4aHIub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKHhoci5zdGF0dXNUZXh0KSk7XG4gICAgfTtcbiAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBpZiAoKCh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwKSB8fCB4aHIuc3RhdHVzID09PSAwKSAmJiB4aHIucmVzcG9uc2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBkYXRhOiBtaXhlZCA9IHhoci5yZXNwb25zZTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0UGFyYW1ldGVycy50eXBlID09PSAnanNvbicpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSdyZSBtYW51YWxseSBwYXJzaW5nIEpTT04gaGVyZSB0byBnZXQgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGRhdGEsIHhoci5nZXRSZXNwb25zZUhlYWRlcignQ2FjaGUtQ29udHJvbCcpLCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0V4cGlyZXMnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgQUpBWEVycm9yKHhoci5zdGF0dXNUZXh0LCB4aHIuc3RhdHVzLCByZXF1ZXN0UGFyYW1ldGVycy51cmwpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgeGhyLnNlbmQocmVxdWVzdFBhcmFtZXRlcnMuYm9keSk7XG4gICAgcmV0dXJuIHtjYW5jZWw6ICgpID0+IHhoci5hYm9ydCgpfTtcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VSZXF1ZXN0ID0gZnVuY3Rpb24ocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxhbnk+KTogQ2FuY2VsYWJsZSB7XG4gICAgLy8gV2UncmUgdHJ5aW5nIHRvIHVzZSB0aGUgRmV0Y2ggQVBJIGlmIHBvc3NpYmxlLiBIb3dldmVyLCBpbiBzb21lIHNpdHVhdGlvbnMgd2UgY2FuJ3QgdXNlIGl0OlxuICAgIC8vIC0gU2FmYXJpIGV4cG9zZXMgd2luZG93LkFib3J0Q29udHJvbGxlciwgYnV0IGl0IGRvZXNuJ3Qgd29yayBhY3R1YWxseSBhYm9ydCBhbnkgcmVxdWVzdHMgaW5cbiAgICAvLyAgIG9sZGVyIHZlcnNpb25zIChzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3NDk4MCNjMikuIEluIHRoaXMgY2FzZSxcbiAgICAvLyAgIHdlIGRpc3BhdGNoIHRoZSByZXF1ZXN0IHRvIHRoZSBtYWluIHRocmVhZCBzbyB0aGF0IHdlIGNhbiBnZXQgYW4gYWNjdXJhdGUgcmVmZXJyZXIgaGVhZGVyLlxuICAgIC8vIC0gUmVxdWVzdHMgZm9yIHJlc291cmNlcyB3aXRoIHRoZSBmaWxlOi8vIFVSSSBzY2hlbWUgZG9uJ3Qgd29yayB3aXRoIHRoZSBGZXRjaCBBUEkgZWl0aGVyLiBJblxuICAgIC8vICAgdGhpcyBjYXNlIHdlIHVuY29uZGl0aW9uYWxseSB1c2UgWEhSIG9uIHRoZSBjdXJyZW50IHRocmVhZCBzaW5jZSByZWZlcnJlcnMgZG9uJ3QgbWF0dGVyLlxuICAgIGlmICghaXNGaWxlVVJMKHJlcXVlc3RQYXJhbWV0ZXJzLnVybCkpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5mZXRjaCAmJiB3aW5kb3cuUmVxdWVzdCAmJiB3aW5kb3cuQWJvcnRDb250cm9sbGVyICYmIHdpbmRvdy5SZXF1ZXN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgnc2lnbmFsJykpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlRmV0Y2hSZXF1ZXN0KHJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzV29ya2VyKCkgJiYgc2VsZi53b3JrZXIgJiYgc2VsZi53b3JrZXIuYWN0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXVlT25NYWluVGhyZWFkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLndvcmtlci5hY3Rvci5zZW5kKCdnZXRSZXNvdXJjZScsIHJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjaywgdW5kZWZpbmVkLCBxdWV1ZU9uTWFpblRocmVhZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1ha2VYTUxIdHRwUmVxdWVzdChyZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEpTT04gPSBmdW5jdGlvbihyZXF1ZXN0UGFyYW1ldGVyczogUmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPE9iamVjdD4pOiBDYW5jZWxhYmxlIHtcbiAgICByZXR1cm4gbWFrZVJlcXVlc3QoZXh0ZW5kKHJlcXVlc3RQYXJhbWV0ZXJzLCB7dHlwZTogJ2pzb24nfSksIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8QXJyYXlCdWZmZXI+KTogQ2FuY2VsYWJsZSB7XG4gICAgcmV0dXJuIG1ha2VSZXF1ZXN0KGV4dGVuZChyZXF1ZXN0UGFyYW1ldGVycywge3R5cGU6ICdhcnJheUJ1ZmZlcid9KSwgY2FsbGJhY2spO1xufTtcblxuZXhwb3J0IGNvbnN0IHBvc3REYXRhID0gZnVuY3Rpb24ocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxzdHJpbmc+KTogQ2FuY2VsYWJsZSB7XG4gICAgcmV0dXJuIG1ha2VSZXF1ZXN0KGV4dGVuZChyZXF1ZXN0UGFyYW1ldGVycywge21ldGhvZDogJ1BPU1QnfSksIGNhbGxiYWNrKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhID0gZnVuY3Rpb24ocmVxdWVzdFBhcmFtZXRlcnM6IFJlcXVlc3RQYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxzdHJpbmc+KTogQ2FuY2VsYWJsZSB7XG4gICAgcmV0dXJuIG1ha2VSZXF1ZXN0KGV4dGVuZChyZXF1ZXN0UGFyYW1ldGVycywge21ldGhvZDogJ0dFVCd9KSwgY2FsbGJhY2spO1xufTtcblxuZnVuY3Rpb24gc2FtZU9yaWdpbih1cmwpIHtcbiAgICBjb25zdCBhOiBIVE1MQW5jaG9yRWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIHJldHVybiBhLnByb3RvY29sID09PSB3aW5kb3cuZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wgJiYgYS5ob3N0ID09PSB3aW5kb3cuZG9jdW1lbnQubG9jYXRpb24uaG9zdDtcbn1cblxuY29uc3QgdHJhbnNwYXJlbnRQbmdVcmwgPSAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FZQUFBQWZGY1NKQUFBQUMwbEVRVlFZVjJOZ0FBSUFBQVVBQWFyVnlGRUFBQUFBU1VWT1JLNUNZSUk9JztcblxuZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0ltYWdlKGRhdGE6IEFycmF5QnVmZmVyLCBjYWxsYmFjazogQ2FsbGJhY2s8SFRNTEltYWdlRWxlbWVudD4pIHtcbiAgICBjb25zdCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQgPSBuZXcgd2luZG93LkltYWdlKCk7XG4gICAgY29uc3QgVVJMID0gd2luZG93LlVSTDtcbiAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBpbWcpO1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGltZy5zcmMpO1xuICAgICAgICAvLyBwcmV2ZW50IGltYWdlIGRhdGFVUkkgbWVtb3J5IGxlYWsgaW4gU2FmYXJpO1xuICAgICAgICAvLyBidXQgZG9uJ3QgZnJlZSB0aGUgaW1hZ2UgaW1tZWRpYXRlbHkgYmVjYXVzZSBpdCBtaWdodCBiZSB1cGxvYWRlZCBpbiB0aGUgbmV4dCBmcmFtZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMTAyMjZcbiAgICAgICAgaW1nLm9ubG9hZCA9IG51bGw7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4geyBpbWcuc3JjID0gdHJhbnNwYXJlbnRQbmdVcmw7IH0pO1xuICAgIH07XG4gICAgaW1nLm9uZXJyb3IgPSAoKSA9PiBjYWxsYmFjayhuZXcgRXJyb3IoJ0NvdWxkIG5vdCBsb2FkIGltYWdlLiBQbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSBhIHN1cHBvcnRlZCBpbWFnZSB0eXBlIHN1Y2ggYXMgUE5HIG9yIEpQRUcuIE5vdGUgdGhhdCBTVkdzIGFyZSBub3Qgc3VwcG9ydGVkLicpKTtcbiAgICBjb25zdCBibG9iOiBCbG9iID0gbmV3IHdpbmRvdy5CbG9iKFtuZXcgVWludDhBcnJheShkYXRhKV0sIHt0eXBlOiAnaW1hZ2UvcG5nJ30pO1xuICAgIGltZy5zcmMgPSBkYXRhLmJ5dGVMZW5ndGggPyBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpIDogdHJhbnNwYXJlbnRQbmdVcmw7XG59XG5cbmZ1bmN0aW9uIGFycmF5QnVmZmVyVG9JbWFnZUJpdG1hcChkYXRhOiBBcnJheUJ1ZmZlciwgY2FsbGJhY2s6IENhbGxiYWNrPEltYWdlQml0bWFwPikge1xuICAgIGNvbnN0IGJsb2I6IEJsb2IgPSBuZXcgd2luZG93LkJsb2IoW25ldyBVaW50OEFycmF5KGRhdGEpXSwge3R5cGU6ICdpbWFnZS9wbmcnfSk7XG4gICAgd2luZG93LmNyZWF0ZUltYWdlQml0bWFwKGJsb2IpLnRoZW4oKGltZ0JpdG1hcCkgPT4ge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBpbWdCaXRtYXApO1xuICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihgQ291bGQgbm90IGxvYWQgaW1hZ2UgYmVjYXVzZSBvZiAke2UubWVzc2FnZX0uIFBsZWFzZSBtYWtlIHN1cmUgdG8gdXNlIGEgc3VwcG9ydGVkIGltYWdlIHR5cGUgc3VjaCBhcyBQTkcgb3IgSlBFRy4gTm90ZSB0aGF0IFNWR3MgYXJlIG5vdCBzdXBwb3J0ZWQuYCkpO1xuICAgIH0pO1xufVxuXG5sZXQgaW1hZ2VRdWV1ZSwgbnVtSW1hZ2VSZXF1ZXN0cztcbmV4cG9ydCBjb25zdCByZXNldEltYWdlUmVxdWVzdFF1ZXVlID0gKCkgPT4ge1xuICAgIGltYWdlUXVldWUgPSBbXTtcbiAgICBudW1JbWFnZVJlcXVlc3RzID0gMDtcbn07XG5yZXNldEltYWdlUmVxdWVzdFF1ZXVlKCk7XG5cbmV4cG9ydCBjb25zdCBnZXRJbWFnZSA9IGZ1bmN0aW9uKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2s6IFJlc3BvbnNlQ2FsbGJhY2s8SFRNTEltYWdlRWxlbWVudCB8IEltYWdlQml0bWFwPik6IENhbmNlbGFibGUge1xuICAgIGlmICh3ZWJwU3VwcG9ydGVkLnN1cHBvcnRlZCkge1xuICAgICAgICBpZiAoIXJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0UGFyYW1ldGVycy5oZWFkZXJzLmFjY2VwdCA9ICdpbWFnZS93ZWJwLCovKic7XG4gICAgfVxuXG4gICAgLy8gbGltaXQgY29uY3VycmVudCBpbWFnZSBsb2FkcyB0byBoZWxwIHdpdGggcmFzdGVyIHNvdXJjZXMgcGVyZm9ybWFuY2Ugb24gYmlnIHNjcmVlbnNcbiAgICBpZiAobnVtSW1hZ2VSZXF1ZXN0cyA+PSBjb25maWcuTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZCA9IHtcbiAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICBjYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsKCkgeyB0aGlzLmNhbmNlbGxlZCA9IHRydWU7IH1cbiAgICAgICAgfTtcbiAgICAgICAgaW1hZ2VRdWV1ZS5wdXNoKHF1ZXVlZCk7XG4gICAgICAgIHJldHVybiBxdWV1ZWQ7XG4gICAgfVxuICAgIG51bUltYWdlUmVxdWVzdHMrKztcblxuICAgIGxldCBhZHZhbmNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFkdmFuY2VJbWFnZVJlcXVlc3RRdWV1ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGFkdmFuY2VkKSByZXR1cm47XG4gICAgICAgIGFkdmFuY2VkID0gdHJ1ZTtcbiAgICAgICAgbnVtSW1hZ2VSZXF1ZXN0cy0tO1xuICAgICAgICBhc3NlcnQobnVtSW1hZ2VSZXF1ZXN0cyA+PSAwKTtcbiAgICAgICAgd2hpbGUgKGltYWdlUXVldWUubGVuZ3RoICYmIG51bUltYWdlUmVxdWVzdHMgPCBjb25maWcuTUFYX1BBUkFMTEVMX0lNQUdFX1JFUVVFU1RTKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbWFnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgICAgICBjb25zdCB7cmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrLCBjYW5jZWxsZWR9ID0gcmVxdWVzdDtcbiAgICAgICAgICAgIGlmICghY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5jYW5jZWwgPSBnZXRJbWFnZShyZXF1ZXN0UGFyYW1ldGVycywgY2FsbGJhY2spLmNhbmNlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyByZXF1ZXN0IHRoZSBpbWFnZSB3aXRoIFhIUiB0byB3b3JrIGFyb3VuZCBjYWNoaW5nIGlzc3Vlc1xuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMTQ3MFxuICAgIGNvbnN0IHJlcXVlc3QgPSBnZXRBcnJheUJ1ZmZlcihyZXF1ZXN0UGFyYW1ldGVycywgKGVycjogP0Vycm9yLCBkYXRhOiA/QXJyYXlCdWZmZXIsIGNhY2hlQ29udHJvbDogP3N0cmluZywgZXhwaXJlczogP3N0cmluZykgPT4ge1xuXG4gICAgICAgIGFkdmFuY2VJbWFnZVJlcXVlc3RRdWV1ZSgpO1xuXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5jcmVhdGVJbWFnZUJpdG1hcCkge1xuICAgICAgICAgICAgICAgIGFycmF5QnVmZmVyVG9JbWFnZUJpdG1hcChkYXRhLCAoZXJyLCBpbWdCaXRtYXApID0+IGNhbGxiYWNrKGVyciwgaW1nQml0bWFwLCBjYWNoZUNvbnRyb2wsIGV4cGlyZXMpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJyYXlCdWZmZXJUb0ltYWdlKGRhdGEsIChlcnIsIGltZykgPT4gY2FsbGJhY2soZXJyLCBpbWcsIGNhY2hlQ29udHJvbCwgZXhwaXJlcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICBhZHZhbmNlSW1hZ2VSZXF1ZXN0UXVldWUoKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VmlkZW8gPSBmdW5jdGlvbih1cmxzOiBBcnJheTxzdHJpbmc+LCBjYWxsYmFjazogQ2FsbGJhY2s8SFRNTFZpZGVvRWxlbWVudD4pOiBDYW5jZWxhYmxlIHtcbiAgICBjb25zdCB2aWRlbzogSFRNTFZpZGVvRWxlbWVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLm11dGVkID0gdHJ1ZTtcbiAgICB2aWRlby5vbmxvYWRzdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCB2aWRlbyk7XG4gICAgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgczogSFRNTFNvdXJjZUVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc291cmNlJyk7XG4gICAgICAgIGlmICghc2FtZU9yaWdpbih1cmxzW2ldKSkge1xuICAgICAgICAgICAgdmlkZW8uY3Jvc3NPcmlnaW4gPSAnQW5vbnltb3VzJztcbiAgICAgICAgfVxuICAgICAgICBzLnNyYyA9IHVybHNbaV07XG4gICAgICAgIHZpZGVvLmFwcGVuZENoaWxkKHMpO1xuICAgIH1cbiAgICByZXR1cm4ge2NhbmNlbDogKCkgPT4ge319O1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuL3V0aWwuanMnO1xuXG50eXBlIExpc3RlbmVyID0gKE9iamVjdCkgPT4gYW55O1xudHlwZSBMaXN0ZW5lcnMgPSB7W186IHN0cmluZ106IEFycmF5PExpc3RlbmVyPiB9O1xuXG5mdW5jdGlvbiBfYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgbGlzdGVuZXJMaXN0OiBMaXN0ZW5lcnMpIHtcbiAgICBjb25zdCBsaXN0ZW5lckV4aXN0cyA9IGxpc3RlbmVyTGlzdFt0eXBlXSAmJiBsaXN0ZW5lckxpc3RbdHlwZV0uaW5kZXhPZihsaXN0ZW5lcikgIT09IC0xO1xuICAgIGlmICghbGlzdGVuZXJFeGlzdHMpIHtcbiAgICAgICAgbGlzdGVuZXJMaXN0W3R5cGVdID0gbGlzdGVuZXJMaXN0W3R5cGVdIHx8IFtdO1xuICAgICAgICBsaXN0ZW5lckxpc3RbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0ZW5lciwgbGlzdGVuZXJMaXN0OiBMaXN0ZW5lcnMpIHtcbiAgICBpZiAobGlzdGVuZXJMaXN0ICYmIGxpc3RlbmVyTGlzdFt0eXBlXSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVyTGlzdFt0eXBlXS5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGlzdGVuZXJMaXN0W3R5cGVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudCB7XG4gICAgK3R5cGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZywgZGF0YTogT2JqZWN0ID0ge30pIHtcbiAgICAgICAgZXh0ZW5kKHRoaXMsIGRhdGEpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIEVycm9yTGlrZSB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBlcnJvcjogRXJyb3JMaWtlO1xuXG4gICAgY29uc3RydWN0b3IoZXJyb3I6IEVycm9yTGlrZSwgZGF0YTogT2JqZWN0ID0ge30pIHtcbiAgICAgICAgc3VwZXIoJ2Vycm9yJywgZXh0ZW5kKHtlcnJvcn0sIGRhdGEpKTtcbiAgICB9XG59XG5cbi8qKlxuICogYEV2ZW50ZWRgIG1peGVzIG1ldGhvZHMgaW50byBvdGhlciBjbGFzc2VzIGZvciBldmVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogVW5sZXNzIHlvdSBhcmUgZGV2ZWxvcGluZyBhIHBsdWdpbiB5b3Ugd2lsbCBtb3N0IGxpa2VseSB1c2UgdGhlc2UgbWV0aG9kcyB0aHJvdWdoIGNsYXNzZXMgbGlrZSBgTWFwYCBvciBgUG9wdXBgLlxuICpcbiAqIEZvciBsaXN0cyBvZiBldmVudHMgeW91IGNhbiBsaXN0ZW4gZm9yLCBzZWUgQVBJIGRvY3VtZW50YXRpb24gZm9yIHNwZWNpZmljIGNsYXNzZXM6IFtgTWFwYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpLCBbYE1hcmtlcmBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKSwgW2BQb3B1cGBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKSwgYW5kIFtgR2VvbG9jYXRpb25Db250cm9sYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpLlxuICpcbiAqIEBtaXhpbiBFdmVudGVkXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudGVkIHtcbiAgICBfbGlzdGVuZXJzOiBMaXN0ZW5lcnM7XG4gICAgX29uZVRpbWVMaXN0ZW5lcnM6IExpc3RlbmVycztcbiAgICBfZXZlbnRlZFBhcmVudDogP0V2ZW50ZWQ7XG4gICAgX2V2ZW50ZWRQYXJlbnREYXRhOiA/KE9iamVjdCB8ICgpID0+IE9iamVjdCk7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gYSBzcGVjaWZpZWQgZXZlbnQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIGFkZCBhIGxpc3RlbiBmb3IuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC5cbiAgICAgKiAgIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIGBmaXJlYCxcbiAgICAgKiAgIGV4dGVuZGVkIHdpdGggYHRhcmdldGAgYW5kIGB0eXBlYCBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICovXG4gICAgb24odHlwZTogKiwgbGlzdGVuZXI6IExpc3RlbmVyKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycyB8fCB7fTtcbiAgICAgICAgX2FkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRoaXMuX2xpc3RlbmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKi9cbiAgICBvZmYodHlwZTogKiwgbGlzdGVuZXI6IExpc3RlbmVyKTogdGhpcyB7XG4gICAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB0aGlzLl9saXN0ZW5lcnMpO1xuICAgICAgICBfcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fb25lVGltZUxpc3RlbmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIHRvIGEgc3BlY2lmaWVkIGV2ZW50IHR5cGUuXG4gICAgICpcbiAgICAgKiBUaGUgbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgZmlyc3QgdGltZSB0aGUgZXZlbnQgZmlyZXMgYWZ0ZXIgdGhlIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBsaXN0ZW4gZm9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIChPcHRpb25hbCkgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBmaXJlZCBvbmNlLlxuICAgICAqICAgSWYgbm90IHByb3ZpZGVkLCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQgb25jZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGB0aGlzYCB8IFByb21pc2UuXG4gICAgICovXG4gICAgb25jZSh0eXBlOiAqLCBsaXN0ZW5lcj86IExpc3RlbmVyKTogdGhpcyB8IFByb21pc2U8RXZlbnQ+IHtcbiAgICAgICAgaWYgKCFsaXN0ZW5lcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gdGhpcy5vbmNlKHR5cGUsIHJlc29sdmUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnMgPSB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzIHx8IHt9O1xuICAgICAgICBfYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdGhpcy5fb25lVGltZUxpc3RlbmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZmlyZShldmVudDogRXZlbnQsIHByb3BlcnRpZXM/OiBPYmplY3QpOiB0aGlzIHtcbiAgICAgICAgLy8gQ29tcGF0aWJpbGl0eSB3aXRoICh0eXBlOiBzdHJpbmcsIHByb3BlcnRpZXM6IE9iamVjdCkgc2lnbmF0dXJlIGZyb20gcHJldmlvdXMgdmVyc2lvbnMuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNjUyMixcbiAgICAgICAgLy8gICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWRyYXcvaXNzdWVzLzc2NlxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXZlbnQgPSBuZXcgRXZlbnQoZXZlbnQsIHByb3BlcnRpZXMgfHwge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHlwZSA9IGV2ZW50LnR5cGU7XG5cbiAgICAgICAgaWYgKHRoaXMubGlzdGVucyh0eXBlKSkge1xuICAgICAgICAgICAgKGV2ZW50OiBhbnkpLnRhcmdldCA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBhZGRpbmcgb3IgcmVtb3ZpbmcgbGlzdGVuZXJzIGluc2lkZSBvdGhlciBsaXN0ZW5lcnMgd29uJ3QgY2F1c2UgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzICYmIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSA/IHRoaXMuX2xpc3RlbmVyc1t0eXBlXS5zbGljZSgpIDogW107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG9uZVRpbWVMaXN0ZW5lcnMgPSB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzICYmIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbdHlwZV0gPyB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzW3R5cGVdLnNsaWNlKCkgOiBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2Ygb25lVGltZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB0aGlzLl9vbmVUaW1lTGlzdGVuZXJzKTtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fZXZlbnRlZFBhcmVudDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBleHRlbmQoXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5fZXZlbnRlZFBhcmVudERhdGEgPT09ICdmdW5jdGlvbicgPyB0aGlzLl9ldmVudGVkUGFyZW50RGF0YSgpIDogdGhpcy5fZXZlbnRlZFBhcmVudERhdGFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBhcmVudC5maXJlKGV2ZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAvLyBUbyBlbnN1cmUgdGhhdCBubyBlcnJvciBldmVudHMgYXJlIGRyb3BwZWQsIHByaW50IHRoZW0gdG8gdGhlXG4gICAgICAgIC8vIGNvbnNvbGUgaWYgdGhleSBoYXZlIG5vIGxpc3RlbmVycy5cbiAgICAgICAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIEVycm9yRXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdGFuY2Ugb2YgRXZlbnRlZCBvciBhbnkgZm9yd2FyZGVkIGluc3RhbmNlcyBvZiBFdmVudGVkIGhhdmUgYSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSByZWdpc3RlcmVkIGxpc3RlbmVyIGZvciBzcGVjaWZpZWQgZXZlbnQgdHlwZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsaXN0ZW5zKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISEoXG4gICAgICAgICAgICAodGhpcy5fbGlzdGVuZXJzICYmIHRoaXMuX2xpc3RlbmVyc1t0eXBlXSAmJiB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICh0aGlzLl9vbmVUaW1lTGlzdGVuZXJzICYmIHRoaXMuX29uZVRpbWVMaXN0ZW5lcnNbdHlwZV0gJiYgdGhpcy5fb25lVGltZUxpc3RlbmVyc1t0eXBlXS5sZW5ndGggPiAwKSB8fFxuICAgICAgICAgICAgKHRoaXMuX2V2ZW50ZWRQYXJlbnQgJiYgdGhpcy5fZXZlbnRlZFBhcmVudC5saXN0ZW5zKHR5cGUpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1YmJsZSBhbGwgZXZlbnRzIGZpcmVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgRXZlbnRlZCB0byB0aGlzIHBhcmVudCBpbnN0YW5jZSBvZiBFdmVudGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXRFdmVudGVkUGFyZW50KHBhcmVudDogP0V2ZW50ZWQsIGRhdGE/OiBPYmplY3QgfCAoKSA9PiBPYmplY3QpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fZXZlbnRlZFBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5fZXZlbnRlZFBhcmVudERhdGEgPSBkYXRhO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBzcGVjIGZyb20gJy4vdjguanNvbic7XG5cbmV4cG9ydCB0eXBlIFN0eWxlUmVmZXJlbmNlID0gdHlwZW9mIHNwZWM7XG5cbmV4cG9ydCBkZWZhdWx0IHNwZWM7XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAob3V0cHV0OiBhbnksIC4uLmlucHV0czogQXJyYXk8YW55Pik6IGFueSB7XG4gICAgZm9yIChjb25zdCBpbnB1dCBvZiBpbnB1dHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrIGluIGlucHV0KSB7XG4gICAgICAgICAgICBvdXRwdXRba10gPSBpbnB1dFtrXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIiwiLy8gQGZsb3dcblxuLy8gVHVybiBqc29ubGludC1saW5lcy1wcmltaXRpdmVzIG9iamVjdHMgaW50byBwcmltaXRpdmUgb2JqZWN0c1xuZXhwb3J0IGZ1bmN0aW9uIHVuYnVuZGxlKHZhbHVlOiBtaXhlZCk6IG1peGVkIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZU9mKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBVbmJ1bmRsZSh2YWx1ZTogbWl4ZWQpOiBtaXhlZCB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZGVlcFVuYnVuZGxlKTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmICEodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSkge1xuICAgICAgICBjb25zdCB1bmJ1bmRsZWRWYWx1ZTogeyBba2V5OiBzdHJpbmddOiBtaXhlZCB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICAgICAgICB1bmJ1bmRsZWRWYWx1ZVtrZXldID0gZGVlcFVuYnVuZGxlKHZhbHVlW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmJ1bmRsZWRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5idW5kbGUodmFsdWUpO1xufVxuIiwiLy8gQGZsb3dcblxuY2xhc3MgUGFyc2luZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGtleTogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihrZXk6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNpbmdFcnJvcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuL2V4cHJlc3Npb24uanMnO1xuXG4vKipcbiAqIFRyYWNrcyBgbGV0YCBiaW5kaW5ncyBkdXJpbmcgZXhwcmVzc2lvbiBwYXJzaW5nLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU2NvcGUge1xuICAgIHBhcmVudDogP1Njb3BlO1xuICAgIGJpbmRpbmdzOiB7W186IHN0cmluZ106IEV4cHJlc3Npb259O1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudD86IFNjb3BlLCBiaW5kaW5nczogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+ID0gW10pIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuYmluZGluZ3MgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgZXhwcmVzc2lvbl0gb2YgYmluZGluZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NbbmFtZV0gPSBleHByZXNzaW9uO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uY2F0KGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4pOiBTY29wZSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NvcGUodGhpcywgYmluZGluZ3MpO1xuICAgIH1cblxuICAgIGdldChuYW1lOiBzdHJpbmcpOiBFeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKHRoaXMuYmluZGluZ3NbbmFtZV0pIHsgcmV0dXJuIHRoaXMuYmluZGluZ3NbbmFtZV07IH1cbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7IHJldHVybiB0aGlzLnBhcmVudC5nZXQobmFtZSk7IH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWV9IG5vdCBmb3VuZCBpbiBzY29wZS5gKTtcbiAgICB9XG5cbiAgICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmJpbmRpbmdzW25hbWVdKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQuaGFzKG5hbWUpIDogZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTY29wZTtcbiIsIi8vIEBmbG93XG5cbmV4cG9ydCB0eXBlIE51bGxUeXBlVCA9IHsga2luZDogJ251bGwnIH07XG5leHBvcnQgdHlwZSBOdW1iZXJUeXBlVCA9IHsga2luZDogJ251bWJlcicgfTtcbmV4cG9ydCB0eXBlIFN0cmluZ1R5cGVUID0geyBraW5kOiAnc3RyaW5nJyB9O1xuZXhwb3J0IHR5cGUgQm9vbGVhblR5cGVUID0geyBraW5kOiAnYm9vbGVhbicgfTtcbmV4cG9ydCB0eXBlIENvbG9yVHlwZVQgPSB7IGtpbmQ6ICdjb2xvcicgfTtcbmV4cG9ydCB0eXBlIE9iamVjdFR5cGVUID0geyBraW5kOiAnb2JqZWN0JyB9O1xuZXhwb3J0IHR5cGUgVmFsdWVUeXBlVCA9IHsga2luZDogJ3ZhbHVlJyB9O1xuZXhwb3J0IHR5cGUgRXJyb3JUeXBlVCA9IHsga2luZDogJ2Vycm9yJyB9O1xuZXhwb3J0IHR5cGUgQ29sbGF0b3JUeXBlVCA9IHsga2luZDogJ2NvbGxhdG9yJyB9O1xuZXhwb3J0IHR5cGUgRm9ybWF0dGVkVHlwZVQgPSB7IGtpbmQ6ICdmb3JtYXR0ZWQnIH07XG5leHBvcnQgdHlwZSBSZXNvbHZlZEltYWdlVHlwZVQgPSB7IGtpbmQ6ICdyZXNvbHZlZEltYWdlJyB9O1xuXG5leHBvcnQgdHlwZSBFdmFsdWF0aW9uS2luZCA9ICdjb25zdGFudCcgfCAnc291cmNlJyB8ICdjYW1lcmEnIHwgJ2NvbXBvc2l0ZSc7XG5cbmV4cG9ydCB0eXBlIFR5cGUgPVxuICAgIE51bGxUeXBlVCB8XG4gICAgTnVtYmVyVHlwZVQgfFxuICAgIFN0cmluZ1R5cGVUIHxcbiAgICBCb29sZWFuVHlwZVQgfFxuICAgIENvbG9yVHlwZVQgfFxuICAgIE9iamVjdFR5cGVUIHxcbiAgICBWYWx1ZVR5cGVUIHxcbiAgICBBcnJheVR5cGUgfCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgRXJyb3JUeXBlVCB8XG4gICAgQ29sbGF0b3JUeXBlVCB8XG4gICAgRm9ybWF0dGVkVHlwZVQgfFxuICAgIFJlc29sdmVkSW1hZ2VUeXBlVFxuXG5leHBvcnQgdHlwZSBBcnJheVR5cGUgPSB7XG4gICAga2luZDogJ2FycmF5JyxcbiAgICBpdGVtVHlwZTogVHlwZSxcbiAgICBOOiA/bnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIE5hdGl2ZVR5cGUgPSAnbnVtYmVyJyB8ICdzdHJpbmcnIHwgJ2Jvb2xlYW4nIHwgJ251bGwnIHwgJ2FycmF5JyB8ICdvYmplY3QnXG5cbmV4cG9ydCBjb25zdCBOdWxsVHlwZSA9IHtraW5kOiAnbnVsbCd9O1xuZXhwb3J0IGNvbnN0IE51bWJlclR5cGUgPSB7a2luZDogJ251bWJlcid9O1xuZXhwb3J0IGNvbnN0IFN0cmluZ1R5cGUgPSB7a2luZDogJ3N0cmluZyd9O1xuZXhwb3J0IGNvbnN0IEJvb2xlYW5UeXBlID0ge2tpbmQ6ICdib29sZWFuJ307XG5leHBvcnQgY29uc3QgQ29sb3JUeXBlID0ge2tpbmQ6ICdjb2xvcid9O1xuZXhwb3J0IGNvbnN0IE9iamVjdFR5cGUgPSB7a2luZDogJ29iamVjdCd9O1xuZXhwb3J0IGNvbnN0IFZhbHVlVHlwZSA9IHtraW5kOiAndmFsdWUnfTtcbmV4cG9ydCBjb25zdCBFcnJvclR5cGUgPSB7a2luZDogJ2Vycm9yJ307XG5leHBvcnQgY29uc3QgQ29sbGF0b3JUeXBlID0ge2tpbmQ6ICdjb2xsYXRvcid9O1xuZXhwb3J0IGNvbnN0IEZvcm1hdHRlZFR5cGUgPSB7a2luZDogJ2Zvcm1hdHRlZCd9O1xuZXhwb3J0IGNvbnN0IFJlc29sdmVkSW1hZ2VUeXBlID0ge2tpbmQ6ICdyZXNvbHZlZEltYWdlJ307XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheShpdGVtVHlwZTogVHlwZSwgTjogP251bWJlcik6IEFycmF5VHlwZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAga2luZDogJ2FycmF5JyxcbiAgICAgICAgaXRlbVR5cGUsXG4gICAgICAgIE5cbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TdHJpbmcodHlwZTogVHlwZSk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHRvU3RyaW5nKHR5cGUuaXRlbVR5cGUpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHR5cGUuTiA9PT0gJ251bWJlcicgP1xuICAgICAgICAgICAgYGFycmF5PCR7aXRlbVR5cGV9LCAke3R5cGUuTn0+YCA6XG4gICAgICAgICAgICB0eXBlLml0ZW1UeXBlLmtpbmQgPT09ICd2YWx1ZScgPyAnYXJyYXknIDogYGFycmF5PCR7aXRlbVR5cGV9PmA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGUua2luZDtcbiAgICB9XG59XG5cbmNvbnN0IHZhbHVlTWVtYmVyVHlwZXMgPSBbXG4gICAgTnVsbFR5cGUsXG4gICAgTnVtYmVyVHlwZSxcbiAgICBTdHJpbmdUeXBlLFxuICAgIEJvb2xlYW5UeXBlLFxuICAgIENvbG9yVHlwZSxcbiAgICBGb3JtYXR0ZWRUeXBlLFxuICAgIE9iamVjdFR5cGUsXG4gICAgYXJyYXkoVmFsdWVUeXBlKSxcbiAgICBSZXNvbHZlZEltYWdlVHlwZVxuXTtcblxuLyoqXG4gKiBSZXR1cm5zIG51bGwgaWYgYHRgIGlzIGEgc3VidHlwZSBvZiBgZXhwZWN0ZWRgOyBvdGhlcndpc2UgcmV0dXJucyBhblxuICogZXJyb3IgbWVzc2FnZS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1N1YnR5cGUoZXhwZWN0ZWQ6IFR5cGUsIHQ6IFR5cGUpOiA/c3RyaW5nIHtcbiAgICBpZiAodC5raW5kID09PSAnZXJyb3InKSB7XG4gICAgICAgIC8vIEVycm9yIGlzIGEgc3VidHlwZSBvZiBldmVyeSB0eXBlXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gJ2FycmF5Jykge1xuICAgICAgICBpZiAodC5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAoKHQuTiA9PT0gMCAmJiB0Lml0ZW1UeXBlLmtpbmQgPT09ICd2YWx1ZScpIHx8ICFjaGVja1N1YnR5cGUoZXhwZWN0ZWQuaXRlbVR5cGUsIHQuaXRlbVR5cGUpKSAmJlxuICAgICAgICAgICAgKHR5cGVvZiBleHBlY3RlZC5OICE9PSAnbnVtYmVyJyB8fCBleHBlY3RlZC5OID09PSB0Lk4pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gdC5raW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWQua2luZCA9PT0gJ3ZhbHVlJykge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlclR5cGUgb2YgdmFsdWVNZW1iZXJUeXBlcykge1xuICAgICAgICAgICAgaWYgKCFjaGVja1N1YnR5cGUobWVtYmVyVHlwZSwgdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBgRXhwZWN0ZWQgJHt0b1N0cmluZyhleHBlY3RlZCl9IGJ1dCBmb3VuZCAke3RvU3RyaW5nKHQpfSBpbnN0ZWFkLmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVHlwZShwcm92aWRlZDogVHlwZSwgYWxsb3dlZFR5cGVzOiBBcnJheTxUeXBlPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhbGxvd2VkVHlwZXMuc29tZSh0ID0+IHQua2luZCA9PT0gcHJvdmlkZWQua2luZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTmF0aXZlVHlwZShwcm92aWRlZDogYW55LCBhbGxvd2VkVHlwZXM6IEFycmF5PE5hdGl2ZVR5cGU+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGFsbG93ZWRUeXBlcy5zb21lKHQgPT4ge1xuICAgICAgICBpZiAodCA9PT0gJ251bGwnKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZWQgPT09IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodCA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocHJvdmlkZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZWQgJiYgIUFycmF5LmlzQXJyYXkocHJvdmlkZWQpICYmIHR5cGVvZiBwcm92aWRlZCA9PT0gJ29iamVjdCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdCA9PT0gdHlwZW9mIHByb3ZpZGVkO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCIvLyAoYykgRGVhbiBNY05hbWVlIDxkZWFuQGdtYWlsLmNvbT4sIDIwMTIuXG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RlYW5tL2Nzcy1jb2xvci1wYXJzZXItanNcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuLy8gRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuLy8gSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yL1xudmFyIGtDU1NDb2xvclRhYmxlID0ge1xuICBcInRyYW5zcGFyZW50XCI6IFswLDAsMCwwXSwgXCJhbGljZWJsdWVcIjogWzI0MCwyNDgsMjU1LDFdLFxuICBcImFudGlxdWV3aGl0ZVwiOiBbMjUwLDIzNSwyMTUsMV0sIFwiYXF1YVwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImFxdWFtYXJpbmVcIjogWzEyNywyNTUsMjEyLDFdLCBcImF6dXJlXCI6IFsyNDAsMjU1LDI1NSwxXSxcbiAgXCJiZWlnZVwiOiBbMjQ1LDI0NSwyMjAsMV0sIFwiYmlzcXVlXCI6IFsyNTUsMjI4LDE5NiwxXSxcbiAgXCJibGFja1wiOiBbMCwwLDAsMV0sIFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwyMzUsMjA1LDFdLFxuICBcImJsdWVcIjogWzAsMCwyNTUsMV0sIFwiYmx1ZXZpb2xldFwiOiBbMTM4LDQzLDIyNiwxXSxcbiAgXCJicm93blwiOiBbMTY1LDQyLDQyLDFdLCBcImJ1cmx5d29vZFwiOiBbMjIyLDE4NCwxMzUsMV0sXG4gIFwiY2FkZXRibHVlXCI6IFs5NSwxNTgsMTYwLDFdLCBcImNoYXJ0cmV1c2VcIjogWzEyNywyNTUsMCwxXSxcbiAgXCJjaG9jb2xhdGVcIjogWzIxMCwxMDUsMzAsMV0sIFwiY29yYWxcIjogWzI1NSwxMjcsODAsMV0sXG4gIFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwxNDksMjM3LDFdLCBcImNvcm5zaWxrXCI6IFsyNTUsMjQ4LDIyMCwxXSxcbiAgXCJjcmltc29uXCI6IFsyMjAsMjAsNjAsMV0sIFwiY3lhblwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImRhcmtibHVlXCI6IFswLDAsMTM5LDFdLCBcImRhcmtjeWFuXCI6IFswLDEzOSwxMzksMV0sXG4gIFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LDEzNCwxMSwxXSwgXCJkYXJrZ3JheVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2dyZWVuXCI6IFswLDEwMCwwLDFdLCBcImRhcmtncmV5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJra2hha2lcIjogWzE4OSwxODMsMTA3LDFdLCBcImRhcmttYWdlbnRhXCI6IFsxMzksMCwxMzksMV0sXG4gIFwiZGFya29saXZlZ3JlZW5cIjogWzg1LDEwNyw0NywxXSwgXCJkYXJrb3JhbmdlXCI6IFsyNTUsMTQwLDAsMV0sXG4gIFwiZGFya29yY2hpZFwiOiBbMTUzLDUwLDIwNCwxXSwgXCJkYXJrcmVkXCI6IFsxMzksMCwwLDFdLFxuICBcImRhcmtzYWxtb25cIjogWzIzMywxNTAsMTIyLDFdLCBcImRhcmtzZWFncmVlblwiOiBbMTQzLDE4OCwxNDMsMV0sXG4gIFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsNjEsMTM5LDFdLCBcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LDc5LDc5LDFdLFxuICBcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LDc5LDc5LDFdLCBcImRhcmt0dXJxdW9pc2VcIjogWzAsMjA2LDIwOSwxXSxcbiAgXCJkYXJrdmlvbGV0XCI6IFsxNDgsMCwyMTEsMV0sIFwiZGVlcHBpbmtcIjogWzI1NSwyMCwxNDcsMV0sXG4gIFwiZGVlcHNreWJsdWVcIjogWzAsMTkxLDI1NSwxXSwgXCJkaW1ncmF5XCI6IFsxMDUsMTA1LDEwNSwxXSxcbiAgXCJkaW1ncmV5XCI6IFsxMDUsMTA1LDEwNSwxXSwgXCJkb2RnZXJibHVlXCI6IFszMCwxNDQsMjU1LDFdLFxuICBcImZpcmVicmlja1wiOiBbMTc4LDM0LDM0LDFdLCBcImZsb3JhbHdoaXRlXCI6IFsyNTUsMjUwLDI0MCwxXSxcbiAgXCJmb3Jlc3RncmVlblwiOiBbMzQsMTM5LDM0LDFdLCBcImZ1Y2hzaWFcIjogWzI1NSwwLDI1NSwxXSxcbiAgXCJnYWluc2Jvcm9cIjogWzIyMCwyMjAsMjIwLDFdLCBcImdob3N0d2hpdGVcIjogWzI0OCwyNDgsMjU1LDFdLFxuICBcImdvbGRcIjogWzI1NSwyMTUsMCwxXSwgXCJnb2xkZW5yb2RcIjogWzIxOCwxNjUsMzIsMV0sXG4gIFwiZ3JheVwiOiBbMTI4LDEyOCwxMjgsMV0sIFwiZ3JlZW5cIjogWzAsMTI4LDAsMV0sXG4gIFwiZ3JlZW55ZWxsb3dcIjogWzE3MywyNTUsNDcsMV0sIFwiZ3JleVwiOiBbMTI4LDEyOCwxMjgsMV0sXG4gIFwiaG9uZXlkZXdcIjogWzI0MCwyNTUsMjQwLDFdLCBcImhvdHBpbmtcIjogWzI1NSwxMDUsMTgwLDFdLFxuICBcImluZGlhbnJlZFwiOiBbMjA1LDkyLDkyLDFdLCBcImluZGlnb1wiOiBbNzUsMCwxMzAsMV0sXG4gIFwiaXZvcnlcIjogWzI1NSwyNTUsMjQwLDFdLCBcImtoYWtpXCI6IFsyNDAsMjMwLDE0MCwxXSxcbiAgXCJsYXZlbmRlclwiOiBbMjMwLDIzMCwyNTAsMV0sIFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LDI0MCwyNDUsMV0sXG4gIFwibGF3bmdyZWVuXCI6IFsxMjQsMjUyLDAsMV0sIFwibGVtb25jaGlmZm9uXCI6IFsyNTUsMjUwLDIwNSwxXSxcbiAgXCJsaWdodGJsdWVcIjogWzE3MywyMTYsMjMwLDFdLCBcImxpZ2h0Y29yYWxcIjogWzI0MCwxMjgsMTI4LDFdLFxuICBcImxpZ2h0Y3lhblwiOiBbMjI0LDI1NSwyNTUsMV0sIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwyNTAsMjEwLDFdLFxuICBcImxpZ2h0Z3JheVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRncmVlblwiOiBbMTQ0LDIzOCwxNDQsMV0sXG4gIFwibGlnaHRncmV5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodHBpbmtcIjogWzI1NSwxODIsMTkzLDFdLFxuICBcImxpZ2h0c2FsbW9uXCI6IFsyNTUsMTYwLDEyMiwxXSwgXCJsaWdodHNlYWdyZWVuXCI6IFszMiwxNzgsMTcwLDFdLFxuICBcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LDIwNiwyNTAsMV0sIFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwxMzYsMTUzLDFdLFxuICBcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksMTM2LDE1MywxXSwgXCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LDE5NiwyMjIsMV0sXG4gIFwibGlnaHR5ZWxsb3dcIjogWzI1NSwyNTUsMjI0LDFdLCBcImxpbWVcIjogWzAsMjU1LDAsMV0sXG4gIFwibGltZWdyZWVuXCI6IFs1MCwyMDUsNTAsMV0sIFwibGluZW5cIjogWzI1MCwyNDAsMjMwLDFdLFxuICBcIm1hZ2VudGFcIjogWzI1NSwwLDI1NSwxXSwgXCJtYXJvb25cIjogWzEyOCwwLDAsMV0sXG4gIFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLDIwNSwxNzAsMV0sIFwibWVkaXVtYmx1ZVwiOiBbMCwwLDIwNSwxXSxcbiAgXCJtZWRpdW1vcmNoaWRcIjogWzE4Niw4NSwyMTEsMV0sIFwibWVkaXVtcHVycGxlXCI6IFsxNDcsMTEyLDIxOSwxXSxcbiAgXCJtZWRpdW1zZWFncmVlblwiOiBbNjAsMTc5LDExMywxXSwgXCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywxMDQsMjM4LDFdLFxuICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLDI1MCwxNTQsMV0sIFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwyMDksMjA0LDFdLFxuICBcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LDIxLDEzMywxXSwgXCJtaWRuaWdodGJsdWVcIjogWzI1LDI1LDExMiwxXSxcbiAgXCJtaW50Y3JlYW1cIjogWzI0NSwyNTUsMjUwLDFdLCBcIm1pc3R5cm9zZVwiOiBbMjU1LDIyOCwyMjUsMV0sXG4gIFwibW9jY2FzaW5cIjogWzI1NSwyMjgsMTgxLDFdLCBcIm5hdmFqb3doaXRlXCI6IFsyNTUsMjIyLDE3MywxXSxcbiAgXCJuYXZ5XCI6IFswLDAsMTI4LDFdLCBcIm9sZGxhY2VcIjogWzI1MywyNDUsMjMwLDFdLFxuICBcIm9saXZlXCI6IFsxMjgsMTI4LDAsMV0sIFwib2xpdmVkcmFiXCI6IFsxMDcsMTQyLDM1LDFdLFxuICBcIm9yYW5nZVwiOiBbMjU1LDE2NSwwLDFdLCBcIm9yYW5nZXJlZFwiOiBbMjU1LDY5LDAsMV0sXG4gIFwib3JjaGlkXCI6IFsyMTgsMTEyLDIxNCwxXSwgXCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsMjMyLDE3MCwxXSxcbiAgXCJwYWxlZ3JlZW5cIjogWzE1MiwyNTEsMTUyLDFdLCBcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwyMzgsMjM4LDFdLFxuICBcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwxMTIsMTQ3LDFdLCBcInBhcGF5YXdoaXBcIjogWzI1NSwyMzksMjEzLDFdLFxuICBcInBlYWNocHVmZlwiOiBbMjU1LDIxOCwxODUsMV0sIFwicGVydVwiOiBbMjA1LDEzMyw2MywxXSxcbiAgXCJwaW5rXCI6IFsyNTUsMTkyLDIwMywxXSwgXCJwbHVtXCI6IFsyMjEsMTYwLDIyMSwxXSxcbiAgXCJwb3dkZXJibHVlXCI6IFsxNzYsMjI0LDIzMCwxXSwgXCJwdXJwbGVcIjogWzEyOCwwLDEyOCwxXSxcbiAgXCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsNTEsMTUzLDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3BhcnNlQ1NTQ29sb3J9IGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuLyoqXG4gKiBBbiBSR0JBIGNvbG9yIHZhbHVlLiBDcmVhdGUgaW5zdGFuY2VzIGZyb20gY29sb3Igc3RyaW5ncyB1c2luZyB0aGUgc3RhdGljXG4gKiBtZXRob2QgYENvbG9yLnBhcnNlYC4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgUkdCIGNoYW5uZWwgdmFsdWVzIGluIHRoZSByYW5nZVxuICogYFswLCAxXWAsIHByZW11bHRpcGxpZWQgYnkgQS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gciBUaGUgcmVkIGNoYW5uZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gZyBUaGUgZ3JlZW4gY2hhbm5lbC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiIFRoZSBibHVlIGNoYW5uZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gYSBUaGUgYWxwaGEgY2hhbm5lbC5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvbG9yIHtcbiAgICByOiBudW1iZXI7XG4gICAgZzogbnVtYmVyO1xuICAgIGI6IG51bWJlcjtcbiAgICBhOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIgPSAxKSB7XG4gICAgICAgIHRoaXMuciA9IHI7XG4gICAgICAgIHRoaXMuZyA9IGc7XG4gICAgICAgIHRoaXMuYiA9IGI7XG4gICAgICAgIHRoaXMuYSA9IGE7XG4gICAgfVxuXG4gICAgc3RhdGljIGJsYWNrOiBDb2xvcjtcbiAgICBzdGF0aWMgd2hpdGU6IENvbG9yO1xuICAgIHN0YXRpYyB0cmFuc3BhcmVudDogQ29sb3I7XG4gICAgc3RhdGljIHJlZDogQ29sb3I7XG4gICAgc3RhdGljIGJsdWU6IENvbG9yO1xuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHZhbGlkIENTUyBjb2xvciBzdHJpbmdzIGFuZCByZXR1cm5zIGEgYENvbG9yYCBpbnN0YW5jZS5cbiAgICAgKiBAcmV0dXJucyBBIGBDb2xvcmAgaW5zdGFuY2UsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBpbnB1dCBpcyBub3QgYSB2YWxpZCBjb2xvciBzdHJpbmcuXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKGlucHV0Pzogc3RyaW5nIHwgQ29sb3IgfCBudWxsKTogQ29sb3IgfCB2b2lkIHtcbiAgICAgICAgaWYgKCFpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJnYmEgPSBwYXJzZUNTU0NvbG9yKGlucHV0KTtcbiAgICAgICAgaWYgKCFyZ2JhKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihcbiAgICAgICAgICAgIHJnYmFbMF0gLyAyNTUgKiByZ2JhWzNdLFxuICAgICAgICAgICAgcmdiYVsxXSAvIDI1NSAqIHJnYmFbM10sXG4gICAgICAgICAgICByZ2JhWzJdIC8gMjU1ICogcmdiYVszXSxcbiAgICAgICAgICAgIHJnYmFbM11cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIFJHQkEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29sb3IgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBSR0JBIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwdXJwbGUgPSBuZXcgQ29sb3IucGFyc2UoJ3B1cnBsZScpO1xuICAgICAqIHB1cnBsZS50b1N0cmluZzsgLy8gPSBcInJnYmEoMTI4LDAsMTI4LDEpXCJcbiAgICAgKiB2YXIgdHJhbnNsdWNlbnRHcmVlbiA9IG5ldyBDb2xvci5wYXJzZSgncmdiYSgyNiwgMjA3LCAyNiwgLjczKScpO1xuICAgICAqIHRyYW5zbHVjZW50R3JlZW4udG9TdHJpbmcoKTsgLy8gPSBcInJnYmEoMjYsMjA3LDI2LDAuNzMpXCJcbiAgICAgKi9cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBbciwgZywgYiwgYV0gPSB0aGlzLnRvQXJyYXkoKTtcbiAgICAgICAgcmV0dXJuIGByZ2JhKCR7TWF0aC5yb3VuZChyKX0sJHtNYXRoLnJvdW5kKGcpfSwke01hdGgucm91bmQoYil9LCR7YX0pYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIFJHQkEgYXJyYXkgb2YgdmFsdWVzIHJlcHJlc2VudGluZyB0aGUgY29sb3IsIHVucHJlbXVsdGlwbGllZCBieSBBLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgUkdCQSBjb2xvciB2YWx1ZXMgaW4gdGhlIHJhbmdlIFswLCAyNTVdLlxuICAgICAqL1xuICAgIHRvQXJyYXkoKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICBjb25zdCB7ciwgZywgYiwgYX0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gYSA9PT0gMCA/IFswLCAwLCAwLCAwXSA6IFtcbiAgICAgICAgICAgIHIgKiAyNTUgLyBhLFxuICAgICAgICAgICAgZyAqIDI1NSAvIGEsXG4gICAgICAgICAgICBiICogMjU1IC8gYSxcbiAgICAgICAgICAgIGFcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgUkdCQSBhcnJheSBvZiBmbG9hdCB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBjb2xvciwgdW5wcmVtdWx0aXBsaWVkIGJ5IEEuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBSR0JBIGNvbG9yIHZhbHVlcyBpbiB0aGUgcmFuZ2UgWzAsIDFdLlxuICAgICAqL1xuICAgIHRvQXJyYXkwMSgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHtyLCBnLCBiLCBhfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBhID09PSAwID8gWzAsIDAsIDAsIDBdIDogW1xuICAgICAgICAgICAgciAvIGEsXG4gICAgICAgICAgICBnIC8gYSxcbiAgICAgICAgICAgIGIgLyBhLFxuICAgICAgICAgICAgYVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gUkdCQSBhcnJheSBvZiB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBjb2xvciwgcHJlbXVsdGlwbGllZCBieSBBLlxuICAgICAqXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgUkdCQSBjb2xvciB2YWx1ZXMgaW4gdGhlIHJhbmdlIFswLCAxXS5cbiAgICAgKi9cbiAgICB0b0FycmF5MDFQcmVtdWx0aXBsaWVkQWxwaGEoKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICBjb25zdCB7ciwgZywgYiwgYX0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgcixcbiAgICAgICAgICAgIGcsXG4gICAgICAgICAgICBiLFxuICAgICAgICAgICAgYVxuICAgICAgICBdO1xuICAgIH1cbn1cblxuQ29sb3IuYmxhY2sgPSBuZXcgQ29sb3IoMCwgMCwgMCwgMSk7XG5Db2xvci53aGl0ZSA9IG5ldyBDb2xvcigxLCAxLCAxLCAxKTtcbkNvbG9yLnRyYW5zcGFyZW50ID0gbmV3IENvbG9yKDAsIDAsIDAsIDApO1xuQ29sb3IucmVkID0gbmV3IENvbG9yKDEsIDAsIDAsIDEpO1xuQ29sb3IuYmx1ZSA9IG5ldyBDb2xvcigwLCAwLCAxLCAxKTtcblxuZXhwb3J0IGRlZmF1bHQgQ29sb3I7XG4iLCIvLyBAZmxvd1xuXG4vLyBGbG93IHR5cGUgZGVjbGFyYXRpb25zIGZvciBJbnRsIGNyaWJiZWQgZnJvbVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzEyNzBcblxuZGVjbGFyZSB2YXIgSW50bDoge1xuICAgIENvbGxhdG9yOiBDbGFzczxJbnRsJENvbGxhdG9yPlxufTtcblxuZGVjbGFyZSBjbGFzcyBJbnRsJENvbGxhdG9yIHtcbiAgICBjb25zdHJ1Y3RvciAoXG4gICAgICAgIGxvY2FsZXM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgb3B0aW9ucz86IENvbGxhdG9yT3B0aW9uc1xuICAgICk6IEludGwkQ29sbGF0b3I7XG5cbiAgICBzdGF0aWMgKFxuICAgICAgICBsb2NhbGVzPzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIG9wdGlvbnM/OiBDb2xsYXRvck9wdGlvbnNcbiAgICApOiBJbnRsJENvbGxhdG9yO1xuXG4gICAgY29tcGFyZSAoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXI7XG5cbiAgICByZXNvbHZlZE9wdGlvbnMoKTogYW55O1xufVxuXG50eXBlIENvbGxhdG9yT3B0aW9ucyA9IHtcbiAgICBsb2NhbGVNYXRjaGVyPzogJ2xvb2t1cCcgfCAnYmVzdCBmaXQnLFxuICAgIHVzYWdlPzogJ3NvcnQnIHwgJ3NlYXJjaCcsXG4gICAgc2Vuc2l0aXZpdHk/OiAnYmFzZScgfCAnYWNjZW50JyB8ICdjYXNlJyB8ICd2YXJpYW50JyxcbiAgICBpZ25vcmVQdW5jdHVhdGlvbj86IGJvb2xlYW4sXG4gICAgbnVtZXJpYz86IGJvb2xlYW4sXG4gICAgY2FzZUZpcnN0PzogJ3VwcGVyJyB8ICdsb3dlcicgfCAnZmFsc2UnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbGxhdG9yIHtcbiAgICBsb2NhbGU6IHN0cmluZyB8IG51bGw7XG4gICAgc2Vuc2l0aXZpdHk6ICdiYXNlJyB8ICdhY2NlbnQnIHwgJ2Nhc2UnIHwgJ3ZhcmlhbnQnO1xuICAgIGNvbGxhdG9yOiBJbnRsJENvbGxhdG9yO1xuXG4gICAgY29uc3RydWN0b3IoY2FzZVNlbnNpdGl2ZTogYm9vbGVhbiwgZGlhY3JpdGljU2Vuc2l0aXZlOiBib29sZWFuLCBsb2NhbGU6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgaWYgKGNhc2VTZW5zaXRpdmUpXG4gICAgICAgICAgICB0aGlzLnNlbnNpdGl2aXR5ID0gZGlhY3JpdGljU2Vuc2l0aXZlID8gJ3ZhcmlhbnQnIDogJ2Nhc2UnO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnNlbnNpdGl2aXR5ID0gZGlhY3JpdGljU2Vuc2l0aXZlID8gJ2FjY2VudCcgOiAnYmFzZSc7XG5cbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY29sbGF0b3IgPSBuZXcgSW50bC5Db2xsYXRvcih0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlIDogW10sXG4gICAgICAgICAgICB7c2Vuc2l0aXZpdHk6IHRoaXMuc2Vuc2l0aXZpdHksIHVzYWdlOiAnc2VhcmNoJ30pO1xuICAgIH1cblxuICAgIGNvbXBhcmUobGhzOiBzdHJpbmcsIHJoczogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sbGF0b3IuY29tcGFyZShsaHMsIHJocyk7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gV2UgY3JlYXRlIGEgQ29sbGF0b3Igd2l0aG91dCBcInVzYWdlOiBzZWFyY2hcIiBiZWNhdXNlIHdlIGRvbid0IHdhbnRcbiAgICAgICAgLy8gdGhlIHNlYXJjaCBvcHRpb25zIGVuY29kZWQgaW4gb3VyIHJlc3VsdCAoZS5nLiBcImVuLXUtY28tc2VhcmNoXCIpXG4gICAgICAgIHJldHVybiBuZXcgSW50bC5Db2xsYXRvcih0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlIDogW10pXG4gICAgICAgICAgICAucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi91dGlsL2NvbG9yLmpzJztcbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuXG5leHBvcnQgY2xhc3MgRm9ybWF0dGVkU2VjdGlvbiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGltYWdlOiBSZXNvbHZlZEltYWdlIHwgbnVsbDtcbiAgICBzY2FsZTogbnVtYmVyIHwgbnVsbDtcbiAgICBmb250U3RhY2s6IHN0cmluZyB8IG51bGw7XG4gICAgdGV4dENvbG9yOiBDb2xvciB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcih0ZXh0OiBzdHJpbmcsIGltYWdlOiBSZXNvbHZlZEltYWdlIHwgbnVsbCwgc2NhbGU6IG51bWJlciB8IG51bGwsIGZvbnRTdGFjazogc3RyaW5nIHwgbnVsbCwgdGV4dENvbG9yOiBDb2xvciB8IG51bGwpIHtcbiAgICAgICAgLy8gY29tYmluZSBjaGFyYWN0ZXJzIHNvIHRoYXQgZGlhY3JpdGljIG1hcmtzIGFyZSBub3Qgc2VwYXJhdGUgY29kZSBwb2ludHNcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dC5ub3JtYWxpemUgPyB0ZXh0Lm5vcm1hbGl6ZSgpIDogdGV4dDtcbiAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuICAgICAgICB0aGlzLnNjYWxlID0gc2NhbGU7XG4gICAgICAgIHRoaXMuZm9udFN0YWNrID0gZm9udFN0YWNrO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRleHRDb2xvcjtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1hdHRlZCB7XG4gICAgc2VjdGlvbnM6IEFycmF5PEZvcm1hdHRlZFNlY3Rpb24+O1xuXG4gICAgY29uc3RydWN0b3Ioc2VjdGlvbnM6IEFycmF5PEZvcm1hdHRlZFNlY3Rpb24+KSB7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9ucztcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVN0cmluZyh1bmZvcm1hdHRlZDogc3RyaW5nKTogRm9ybWF0dGVkIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0ZWQoW25ldyBGb3JtYXR0ZWRTZWN0aW9uKHVuZm9ybWF0dGVkLCBudWxsLCBudWxsLCBudWxsLCBudWxsKV0pO1xuICAgIH1cblxuICAgIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhdGhpcy5zZWN0aW9ucy5zb21lKHNlY3Rpb24gPT4gc2VjdGlvbi50ZXh0Lmxlbmd0aCAhPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY3Rpb24uaW1hZ2UgJiYgc2VjdGlvbi5pbWFnZS5uYW1lLmxlbmd0aCAhPT0gMCkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmYWN0b3J5KHRleHQ6IEZvcm1hdHRlZCB8IHN0cmluZyk6IEZvcm1hdHRlZCB7XG4gICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBGb3JtYXR0ZWQuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLnNlY3Rpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5tYXAoc2VjdGlvbiA9PiBzZWN0aW9uLnRleHQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkOiBBcnJheTxtaXhlZD4gPSBbXCJmb3JtYXRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnNlY3Rpb25zKSB7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5pbWFnZSkge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChbXCJpbWFnZVwiLCBzZWN0aW9uLmltYWdlLm5hbWVdKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChzZWN0aW9uLnRleHQpO1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBtaXhlZCB9ID0ge307XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5mb250U3RhY2spIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zW1widGV4dC1mb250XCJdID0gW1wibGl0ZXJhbFwiLCBzZWN0aW9uLmZvbnRTdGFjay5zcGxpdCgnLCcpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnNjYWxlKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1tcImZvbnQtc2NhbGVcIl0gPSBzZWN0aW9uLnNjYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlY3Rpb24udGV4dENvbG9yKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1tcInRleHQtY29sb3JcIl0gPSAoW1wicmdiYVwiXTogQXJyYXk8bWl4ZWQ+KS5jb25jYXQoc2VjdGlvbi50ZXh0Q29sb3IudG9BcnJheSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlZEltYWdlT3B0aW9ucyA9IHtcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgYXZhaWxhYmxlOiBib29sZWFuXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNvbHZlZEltYWdlIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgYXZhaWxhYmxlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUmVzb2x2ZWRJbWFnZU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICAgICAgICB0aGlzLmF2YWlsYWJsZSA9IG9wdGlvbnMuYXZhaWxhYmxlO1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21TdHJpbmcobmFtZTogc3RyaW5nKTogUmVzb2x2ZWRJbWFnZSB8IG51bGwge1xuICAgICAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsOyAvLyB0cmVhdCBlbXB0eSB2YWx1ZXMgYXMgbm8gaW1hZ2VcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZEltYWdlKHtuYW1lLCBhdmFpbGFibGU6IGZhbHNlfSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gW1wiaW1hZ2VcIiwgdGhpcy5uYW1lXTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCBDb2xvciBmcm9tICcuLi91dGlsL2NvbG9yLmpzJztcbmltcG9ydCBDb2xsYXRvciBmcm9tICcuL3R5cGVzL2NvbGxhdG9yLmpzJztcbmltcG9ydCBGb3JtYXR0ZWQgZnJvbSAnLi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuaW1wb3J0IFJlc29sdmVkSW1hZ2UgZnJvbSAnLi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5pbXBvcnQge051bGxUeXBlLCBOdW1iZXJUeXBlLCBTdHJpbmdUeXBlLCBCb29sZWFuVHlwZSwgQ29sb3JUeXBlLCBPYmplY3RUeXBlLCBWYWx1ZVR5cGUsIENvbGxhdG9yVHlwZSwgRm9ybWF0dGVkVHlwZSwgUmVzb2x2ZWRJbWFnZVR5cGUsIGFycmF5fSBmcm9tICcuL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVSR0JBKHI6IG1peGVkLCBnOiBtaXhlZCwgYjogbWl4ZWQsIGE/OiBtaXhlZCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghKFxuICAgICAgICB0eXBlb2YgciA9PT0gJ251bWJlcicgJiYgciA+PSAwICYmIHIgPD0gMjU1ICYmXG4gICAgICAgIHR5cGVvZiBnID09PSAnbnVtYmVyJyAmJiBnID49IDAgJiYgZyA8PSAyNTUgJiZcbiAgICAgICAgdHlwZW9mIGIgPT09ICdudW1iZXInICYmIGIgPj0gMCAmJiBiIDw9IDI1NVxuICAgICkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgYSA9PT0gJ251bWJlcicgPyBbciwgZywgYiwgYV0gOiBbciwgZywgYl07XG4gICAgICAgIHJldHVybiBgSW52YWxpZCByZ2JhIHZhbHVlIFske3ZhbHVlLmpvaW4oJywgJyl9XTogJ3InLCAnZycsIGFuZCAnYicgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1NS5gO1xuICAgIH1cblxuICAgIGlmICghKFxuICAgICAgICB0eXBlb2YgYSA9PT0gJ3VuZGVmaW5lZCcgfHwgKHR5cGVvZiBhID09PSAnbnVtYmVyJyAmJiBhID49IDAgJiYgYSA8PSAxKVxuICAgICkpIHtcbiAgICAgICAgcmV0dXJuIGBJbnZhbGlkIHJnYmEgdmFsdWUgWyR7W3IsIGcsIGIsIGFdLmpvaW4oJywgJyl9XTogJ2EnIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxLmA7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCB0eXBlIFZhbHVlID0gbnVsbCB8IHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXIgfCBDb2xvciB8IENvbGxhdG9yIHwgRm9ybWF0dGVkIHwgUmVzb2x2ZWRJbWFnZSB8ICRSZWFkT25seUFycmF5PFZhbHVlPiB8IHsgK1tzdHJpbmddOiBWYWx1ZSB9XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbHVlKG1peGVkOiBtaXhlZCk6IGJvb2xlYW4ge1xuICAgIGlmIChtaXhlZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWl4ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaXhlZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChtaXhlZCBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWl4ZWQgaW5zdGFuY2VvZiBDb2xsYXRvcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1peGVkIGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWl4ZWQgaW5zdGFuY2VvZiBSZXNvbHZlZEltYWdlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtaXhlZCkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1peGVkKSB7XG4gICAgICAgICAgICBpZiAoIWlzVmFsdWUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWl4ZWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1peGVkKSB7XG4gICAgICAgICAgICBpZiAoIWlzVmFsdWUobWl4ZWRba2V5XSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVPZih2YWx1ZTogVmFsdWUpOiBUeXBlIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIE51bGxUeXBlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gU3RyaW5nVHlwZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuVHlwZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlclR5cGU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbG9yKSB7XG4gICAgICAgIHJldHVybiBDb2xvclR5cGU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxhdG9yKSB7XG4gICAgICAgIHJldHVybiBDb2xsYXRvclR5cGU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZvcm1hdHRlZCkge1xuICAgICAgICByZXR1cm4gRm9ybWF0dGVkVHlwZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVzb2x2ZWRJbWFnZSkge1xuICAgICAgICByZXR1cm4gUmVzb2x2ZWRJbWFnZVR5cGU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgIGxldCBpdGVtVHlwZTogVHlwZSB8IHR5cGVvZiB1bmRlZmluZWQ7XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCB0ID0gdHlwZU9mKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKCFpdGVtVHlwZSkge1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlID0gdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgPT09IHQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSBWYWx1ZVR5cGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJyYXkoaXRlbVR5cGUgfHwgVmFsdWVUeXBlLCBsZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdFR5cGU7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWU6IFZhbHVlKTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbG9yIHx8IHZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkIHx8IHZhbHVlIGluc3RhbmNlb2YgUmVzb2x2ZWRJbWFnZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IHtDb2xvciwgQ29sbGF0b3J9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHtpc1ZhbHVlLCB0eXBlT2YsIENvbG9yfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuLi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1ZhbHVlfSAgZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9uLCBTZXJpYWxpemVkRXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuXG5jbGFzcyBMaXRlcmFsIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICB2YWx1ZTogVmFsdWU7XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCB2YWx1ZTogVmFsdWUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogdm9pZCB8IExpdGVyYWwge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgJ2xpdGVyYWwnIGV4cHJlc3Npb24gcmVxdWlyZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcblxuICAgICAgICBpZiAoIWlzVmFsdWUoYXJnc1sxXSkpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgaW52YWxpZCB2YWx1ZWApO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGFyZ3NbMV06IGFueSk7XG4gICAgICAgIGxldCB0eXBlID0gdHlwZU9mKHZhbHVlKTtcblxuICAgICAgICAvLyBzcGVjaWFsIGNhc2U6IGluZmVyIHRoZSBpdGVtIHR5cGUgaWYgcG9zc2libGUgZm9yIHplcm8tbGVuZ3RoIGFycmF5c1xuICAgICAgICBjb25zdCBleHBlY3RlZCA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgIHR5cGUuTiA9PT0gMCAmJlxuICAgICAgICAgICAgZXhwZWN0ZWQgJiZcbiAgICAgICAgICAgIGV4cGVjdGVkLmtpbmQgPT09ICdhcnJheScgJiZcbiAgICAgICAgICAgICh0eXBlb2YgZXhwZWN0ZWQuTiAhPT0gJ251bWJlcicgfHwgZXhwZWN0ZWQuTiA9PT0gMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0eXBlID0gZXhwZWN0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IExpdGVyYWwodHlwZSwgdmFsdWUpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKCk6IFZhbHVlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKCkge31cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemVkRXhwcmVzc2lvbiB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUua2luZCA9PT0gJ2FycmF5JyB8fCB0aGlzLnR5cGUua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBbXCJsaXRlcmFsXCIsIHRoaXMudmFsdWVdO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBDb2xvcikge1xuICAgICAgICAgICAgLy8gQ29uc3RhbnQtZm9sZGluZyBjYW4gZ2VuZXJhdGUgTGl0ZXJhbCBleHByZXNzaW9ucyB0aGF0IHlvdVxuICAgICAgICAgICAgLy8gY291bGRuJ3QgYWN0dWFsbHkgZ2VuZXJhdGUgd2l0aCBhIFwibGl0ZXJhbFwiIGV4cHJlc3Npb24sXG4gICAgICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGltcGxlbWVudCBhbiBlcXVpdmFsZW50IHNlcmlhbGl6YXRpb24gaGVyZVxuICAgICAgICAgICAgcmV0dXJuIFtcInJnYmFcIl0uY29uY2F0KHRoaXMudmFsdWUudG9BcnJheSgpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkKSB7XG4gICAgICAgICAgICAvLyBTYW1lIGFzIENvbG9yXG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5zZXJpYWxpemUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydCh0aGlzLnZhbHVlID09PSBudWxsIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMudmFsdWUgPT09ICdib29sZWFuJyk7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMudmFsdWU6IGFueSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpdGVyYWw7XG4iLCIvLyBAZmxvd1xuXG5jbGFzcyBSdW50aW1lRXJyb3Ige1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0V4cHJlc3Npb25FdmFsdWF0aW9uRXJyb3InO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIHRvSlNPTigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUnVudGltZUVycm9yO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge1xuICAgIE9iamVjdFR5cGUsXG4gICAgVmFsdWVUeXBlLFxuICAgIFN0cmluZ1R5cGUsXG4gICAgTnVtYmVyVHlwZSxcbiAgICBCb29sZWFuVHlwZSxcbiAgICBjaGVja1N1YnR5cGUsXG4gICAgdG9TdHJpbmcsXG4gICAgYXJyYXlcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jb25zdCB0eXBlcyA9IHtcbiAgICBzdHJpbmc6IFN0cmluZ1R5cGUsXG4gICAgbnVtYmVyOiBOdW1iZXJUeXBlLFxuICAgIGJvb2xlYW46IEJvb2xlYW5UeXBlLFxuICAgIG9iamVjdDogT2JqZWN0VHlwZVxufTtcblxuY2xhc3MgQXNzZXJ0aW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBhcmdzOiBBcnJheTxFeHByZXNzaW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+KSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGxldCBpID0gMTtcbiAgICAgICAgbGV0IHR5cGU7XG5cbiAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gKGFyZ3NbMF06IGFueSk7XG4gICAgICAgIGlmIChuYW1lID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICBsZXQgaXRlbVR5cGU7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGFyZ3NbMV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyB8fCAhKHR5cGUgaW4gdHlwZXMpIHx8IHR5cGUgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignVGhlIGl0ZW0gdHlwZSBhcmd1bWVudCBvZiBcImFycmF5XCIgbXVzdCBiZSBvbmUgb2Ygc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4nLCAxKTtcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSA9IHR5cGVzW3R5cGVdO1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUgPSBWYWx1ZVR5cGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBOO1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgICAgIGlmIChhcmdzWzJdICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgYXJnc1syXSAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMl0gPCAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzJdICE9PSBNYXRoLmZsb29yKGFyZ3NbMl0pKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignVGhlIGxlbmd0aCBhcmd1bWVudCB0byBcImFycmF5XCIgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgbGl0ZXJhbCcsIDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBOID0gYXJnc1syXTtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHR5cGUgPSBhcnJheShpdGVtVHlwZSwgTik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQodHlwZXNbbmFtZV0sIG5hbWUpO1xuICAgICAgICAgICAgdHlwZSA9IHR5cGVzW25hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gW107XG4gICAgICAgIGZvciAoOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHR5cGUsIHBhcnNlZCk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCk6IGFueSB8IG51bGwge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmFyZ3NbaV0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gY2hlY2tTdWJ0eXBlKHRoaXMudHlwZSwgdHlwZU9mKHZhbHVlKSk7XG4gICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSB0aGlzLmFyZ3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9mIHR5cGUgJHt0b1N0cmluZyh0aGlzLnR5cGUpfSwgYnV0IGZvdW5kICR7dG9TdHJpbmcodHlwZU9mKHZhbHVlKSl9IGluc3RlYWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQoZmFsc2UpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzLmV2ZXJ5KGFyZyA9PiBhcmcub3V0cHV0RGVmaW5lZCgpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU2VyaWFsaXplZEV4cHJlc3Npb24ge1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW3R5cGUua2luZF07XG4gICAgICAgIGlmICh0eXBlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gdHlwZS5pdGVtVHlwZTtcbiAgICAgICAgICAgIGlmIChpdGVtVHlwZS5raW5kID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIGl0ZW1UeXBlLmtpbmQgPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICAgICAgaXRlbVR5cGUua2luZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKGl0ZW1UeXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IE4gPSB0eXBlLk47XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBOID09PSAnbnVtYmVyJyB8fCB0aGlzLmFyZ3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goTik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkLmNvbmNhdCh0aGlzLmFyZ3MubWFwKGFyZyA9PiBhcmcuc2VyaWFsaXplKCkpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFzc2VydGlvbjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7TnVtYmVyVHlwZSwgVmFsdWVUeXBlLCBGb3JtYXR0ZWRUeXBlLCBhcnJheSwgU3RyaW5nVHlwZSwgQ29sb3JUeXBlLCBSZXNvbHZlZEltYWdlVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IEZvcm1hdHRlZCwge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5pbXBvcnQge3RvU3RyaW5nLCB0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9uLCBTZXJpYWxpemVkRXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbnR5cGUgRm9ybWF0dGVkU2VjdGlvbkV4cHJlc3Npb24gPSB7XG4gICAgLy8gQ29udGVudCBvZiBhIHNlY3Rpb24gbWF5IGJlIEltYWdlIGV4cHJlc3Npb24gb3Igb3RoZXJcbiAgICAvLyB0eXBlIG9mIGV4cHJlc3Npb24gdGhhdCBpcyBjb2VyY2FibGUgdG8gJ3N0cmluZycuXG4gICAgY29udGVudDogRXhwcmVzc2lvbixcbiAgICBzY2FsZTogRXhwcmVzc2lvbiB8IG51bGw7XG4gICAgZm9udDogRXhwcmVzc2lvbiB8IG51bGw7XG4gICAgdGV4dENvbG9yOiBFeHByZXNzaW9uIHwgbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybWF0RXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgc2VjdGlvbnM6IEFycmF5PEZvcm1hdHRlZFNlY3Rpb25FeHByZXNzaW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHNlY3Rpb25zOiBBcnJheTxGb3JtYXR0ZWRTZWN0aW9uRXhwcmVzc2lvbj4pIHtcbiAgICAgICAgdGhpcy50eXBlID0gRm9ybWF0dGVkVHlwZTtcbiAgICAgICAgdGhpcy5zZWN0aW9ucyA9IHNlY3Rpb25zO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RBcmcgPSBhcmdzWzFdO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlyc3RBcmcpICYmIHR5cGVvZiBmaXJzdEFyZyA9PT0gJ29iamVjdCcpICB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBpbWFnZSBvciB0ZXh0IHNlY3Rpb24uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWN0aW9uczogQXJyYXk8Rm9ybWF0dGVkU2VjdGlvbkV4cHJlc3Npb24+ID0gW107XG4gICAgICAgIGxldCBuZXh0VG9rZW5NYXlCZU9iamVjdCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBhcmdzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgYXJnID0gKGFyZ3NbaV06IGFueSk7XG5cbiAgICAgICAgICAgIGlmIChuZXh0VG9rZW5NYXlCZU9iamVjdCAmJiB0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgICAgICAgICAgICBuZXh0VG9rZW5NYXlCZU9iamVjdCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgbGV0IHNjYWxlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoYXJnWydmb250LXNjYWxlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBjb250ZXh0LnBhcnNlKGFyZ1snZm9udC1zY2FsZSddLCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzY2FsZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGZvbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChhcmdbJ3RleHQtZm9udCddKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnQgPSBjb250ZXh0LnBhcnNlKGFyZ1sndGV4dC1mb250J10sIDEsIGFycmF5KFN0cmluZ1R5cGUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb250KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdGV4dENvbG9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoYXJnWyd0ZXh0LWNvbG9yJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dENvbG9yID0gY29udGV4dC5wYXJzZShhcmdbJ3RleHQtY29sb3InXSwgMSwgQ29sb3JUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0Q29sb3IpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFeHByZXNzaW9uID0gc2VjdGlvbnNbc2VjdGlvbnMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGFzdEV4cHJlc3Npb24uc2NhbGUgPSBzY2FsZTtcbiAgICAgICAgICAgICAgICBsYXN0RXhwcmVzc2lvbi5mb250ID0gZm9udDtcbiAgICAgICAgICAgICAgICBsYXN0RXhwcmVzc2lvbi50ZXh0Q29sb3IgPSB0ZXh0Q29sb3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIDEsIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGtpbmQgPSBjb250ZW50LnR5cGUua2luZDtcbiAgICAgICAgICAgICAgICBpZiAoa2luZCAhPT0gJ3N0cmluZycgJiYga2luZCAhPT0gJ3ZhbHVlJyAmJiBraW5kICE9PSAnbnVsbCcgJiYga2luZCAhPT0gJ3Jlc29sdmVkSW1hZ2UnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRm9ybWF0dGVkIHRleHQgdHlwZSBtdXN0IGJlICdzdHJpbmcnLCAndmFsdWUnLCAnaW1hZ2UnIG9yICdudWxsJy5gKTtcblxuICAgICAgICAgICAgICAgIG5leHRUb2tlbk1heUJlT2JqZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtjb250ZW50LCBzY2FsZTogbnVsbCwgZm9udDogbnVsbCwgdGV4dENvbG9yOiBudWxsfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZvcm1hdEV4cHJlc3Npb24oc2VjdGlvbnMpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpOiBGb3JtYXR0ZWQge1xuICAgICAgICBjb25zdCBldmFsdWF0ZVNlY3Rpb24gPSBzZWN0aW9uID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRlZENvbnRlbnQgPSBzZWN0aW9uLmNvbnRlbnQuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIGlmICh0eXBlT2YoZXZhbHVhdGVkQ29udGVudCkgPT09IFJlc29sdmVkSW1hZ2VUeXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0ZWRTZWN0aW9uKCcnLCBldmFsdWF0ZWRDb250ZW50LCBudWxsLCBudWxsLCBudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0ZWRTZWN0aW9uKFxuICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhldmFsdWF0ZWRDb250ZW50KSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zY2FsZSA/IHNlY3Rpb24uc2NhbGUuZXZhbHVhdGUoY3R4KSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uZm9udCA/IHNlY3Rpb24uZm9udC5ldmFsdWF0ZShjdHgpLmpvaW4oJywnKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24udGV4dENvbG9yID8gc2VjdGlvbi50ZXh0Q29sb3IuZXZhbHVhdGUoY3R4KSA6IG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0ZWQodGhpcy5zZWN0aW9ucy5tYXAoZXZhbHVhdGVTZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5zZWN0aW9ucykge1xuICAgICAgICAgICAgZm4oc2VjdGlvbi5jb250ZW50KTtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnNjYWxlKSB7XG4gICAgICAgICAgICAgICAgZm4oc2VjdGlvbi5zY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5mb250KSB7XG4gICAgICAgICAgICAgICAgZm4oc2VjdGlvbi5mb250KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWN0aW9uLnRleHRDb2xvcikge1xuICAgICAgICAgICAgICAgIGZuKHNlY3Rpb24udGV4dENvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIFRlY2huaWNhbGx5IHRoZSBjb21iaW5hdG9yaWMgc2V0IG9mIGFsbCBjaGlsZHJlblxuICAgICAgICAvLyBVc3VhbGx5LCB0aGlzLnRleHQgd2lsbCBiZSB1bmRlZmluZWQgYW55d2F5XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU2VyaWFsaXplZEV4cHJlc3Npb24ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wiZm9ybWF0XCJdO1xuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5zZWN0aW9ucykge1xuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHNlY3Rpb24uY29udGVudC5zZXJpYWxpemUoKSk7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge307XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5zY2FsZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNbJ2ZvbnQtc2NhbGUnXSA9IHNlY3Rpb24uc2NhbGUuc2VyaWFsaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5mb250KSB7XG4gICAgICAgICAgICAgICAgb3B0aW9uc1sndGV4dC1mb250J10gPSBzZWN0aW9uLmZvbnQuc2VyaWFsaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi50ZXh0Q29sb3IpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zWyd0ZXh0LWNvbG9yJ10gPSBzZWN0aW9uLnRleHRDb2xvci5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1Jlc29sdmVkSW1hZ2VUeXBlLCBTdHJpbmdUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9uLCBTZXJpYWxpemVkRXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBSZXNvbHZlZEltYWdlVHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gYXJndW1lbnRzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgU3RyaW5nVHlwZSk7XG4gICAgICAgIGlmICghbmFtZSkgcmV0dXJuIGNvbnRleHQuZXJyb3IoYE5vIGltYWdlIG5hbWUgcHJvdmlkZWQuYCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUV4cHJlc3Npb24obmFtZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCk6IG51bGwgfCBSZXNvbHZlZEltYWdlIHtcbiAgICAgICAgY29uc3QgZXZhbHVhdGVkSW1hZ2VOYW1lID0gdGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKGV2YWx1YXRlZEltYWdlTmFtZSk7XG4gICAgICAgIGlmICh2YWx1ZSAmJiBjdHguYXZhaWxhYmxlSW1hZ2VzKSB2YWx1ZS5hdmFpbGFibGUgPSBjdHguYXZhaWxhYmxlSW1hZ2VzLmluZGV4T2YoZXZhbHVhdGVkSW1hZ2VOYW1lKSA+IC0xO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIFRoZSBvdXRwdXQgb2YgaW1hZ2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgaW1hZ2VzIGluIHRoZSBldmFsdWF0aW9uIGNvbnRleHRcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemVkRXhwcmVzc2lvbiB7XG4gICAgICAgIHJldHVybiBbXCJpbWFnZVwiLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7Qm9vbGVhblR5cGUsIENvbG9yVHlwZSwgTnVtYmVyVHlwZSwgU3RyaW5nVHlwZSwgVmFsdWVUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQge0NvbG9yLCB0b1N0cmluZyBhcyB2YWx1ZVRvU3RyaW5nLCB2YWxpZGF0ZVJHQkF9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuLi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuaW1wb3J0IEZvcm1hdEV4cHJlc3Npb24gZnJvbSAnLi4vZGVmaW5pdGlvbnMvZm9ybWF0LmpzJztcbmltcG9ydCBJbWFnZUV4cHJlc3Npb24gZnJvbSAnLi4vZGVmaW5pdGlvbnMvaW1hZ2UuanMnO1xuaW1wb3J0IFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jb25zdCB0eXBlcyA9IHtcbiAgICAndG8tYm9vbGVhbic6IEJvb2xlYW5UeXBlLFxuICAgICd0by1jb2xvcic6IENvbG9yVHlwZSxcbiAgICAndG8tbnVtYmVyJzogTnVtYmVyVHlwZSxcbiAgICAndG8tc3RyaW5nJzogU3RyaW5nVHlwZVxufTtcblxuLyoqXG4gKiBTcGVjaWFsIGZvcm0gZm9yIGVycm9yLWNvYWxlc2NpbmcgY29lcmNpb24gZXhwcmVzc2lvbnMgXCJ0by1udW1iZXJcIixcbiAqIFwidG8tY29sb3JcIi4gIFNpbmNlIHRoZXNlIGNvZXJjaW9ucyBjYW4gZmFpbCBhdCBydW50aW1lLCB0aGV5IGFjY2VwdCBtdWx0aXBsZVxuICogYXJndW1lbnRzLCBvbmx5IGV2YWx1YXRpbmcgb25lIGF0IGEgdGltZSB1bnRpbCBvbmUgc3VjY2VlZHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29lcmNpb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgYXJnczogQXJyYXk8RXhwcmVzc2lvbj4pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuYCk7XG5cbiAgICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gKGFyZ3NbMF06IGFueSk7XG4gICAgICAgIGFzc2VydCh0eXBlc1tuYW1lXSwgbmFtZSk7XG5cbiAgICAgICAgaWYgKChuYW1lID09PSAndG8tYm9vbGVhbicgfHwgbmFtZSA9PT0gJ3RvLXN0cmluZycpICYmIGFyZ3MubGVuZ3RoICE9PSAyKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIG9uZSBhcmd1bWVudC5gKTtcblxuICAgICAgICBjb25zdCB0eXBlID0gdHlwZXNbbmFtZV07XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIFZhbHVlVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHBhcnNlZC5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29lcmNpb24odHlwZSwgcGFyc2VkKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KTogbnVsbCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBDb2xvciB8IEZvcm1hdHRlZCB8IFJlc29sdmVkSW1hZ2Uge1xuICAgICAgICBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5hcmdzWzBdLmV2YWx1YXRlKGN0eCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZS5raW5kID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICBsZXQgaW5wdXQ7XG4gICAgICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgICAgIGVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb2xvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjdHgucGFyc2VDb2xvcihpbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjKSByZXR1cm4gYztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5sZW5ndGggPCAzIHx8IGlucHV0Lmxlbmd0aCA+IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gYEludmFsaWQgcmJnYSB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KGlucHV0KX06IGV4cGVjdGVkIGFuIGFycmF5IGNvbnRhaW5pbmcgZWl0aGVyIHRocmVlIG9yIGZvdXIgbnVtZXJpYyB2YWx1ZXMuYDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gdmFsaWRhdGVSR0JBKGlucHV0WzBdLCBpbnB1dFsxXSwgaW5wdXRbMl0sIGlucHV0WzNdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yKChpbnB1dFswXTogYW55KSAvIDI1NSwgKGlucHV0WzFdOiBhbnkpIC8gMjU1LCAoaW5wdXRbMl06IGFueSkgLyAyNTUsIChpbnB1dFszXTogYW55KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGVycm9yIHx8IGBDb3VsZCBub3QgcGFyc2UgY29sb3IgZnJvbSB2YWx1ZSAnJHt0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gaW5wdXQgOiBTdHJpbmcoSlNPTi5zdHJpbmdpZnkoaW5wdXQpKX0nYCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKG51bSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBudW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBDb3VsZCBub3QgY29udmVydCAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0gdG8gbnVtYmVyLmApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZS5raW5kID09PSAnZm9ybWF0dGVkJykge1xuICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gZXhwbGljaXQgJ3RvLWZvcm1hdHRlZCcgYnV0IHRoaXMgY29lcmNpb24gY2FuIGJlIGltcGxpY2l0bHlcbiAgICAgICAgICAgIC8vIGNyZWF0ZWQgYnkgcHJvcGVydGllcyB0aGF0IGV4cGVjdCB0aGUgJ2Zvcm1hdHRlZCcgdHlwZS5cbiAgICAgICAgICAgIHJldHVybiBGb3JtYXR0ZWQuZnJvbVN0cmluZyh2YWx1ZVRvU3RyaW5nKHRoaXMuYXJnc1swXS5ldmFsdWF0ZShjdHgpKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdyZXNvbHZlZEltYWdlJykge1xuICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkSW1hZ2UuZnJvbVN0cmluZyh2YWx1ZVRvU3RyaW5nKHRoaXMuYXJnc1swXS5ldmFsdWF0ZShjdHgpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVUb1N0cmluZyh0aGlzLmFyZ3NbMF0uZXZhbHVhdGUoY3R4KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzLmV2ZXJ5KGFyZyA9PiBhcmcub3V0cHV0RGVmaW5lZCgpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU2VyaWFsaXplZEV4cHJlc3Npb24ge1xuICAgICAgICBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1hdEV4cHJlc3Npb24oW3tjb250ZW50OiB0aGlzLmFyZ3NbMF0sIHNjYWxlOiBudWxsLCBmb250OiBudWxsLCB0ZXh0Q29sb3I6IG51bGx9XSkuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50eXBlLmtpbmQgPT09ICdyZXNvbHZlZEltYWdlJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbWFnZUV4cHJlc3Npb24odGhpcy5hcmdzWzBdKS5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbYHRvLSR7dGhpcy50eXBlLmtpbmR9YF07XG4gICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29lcmNpb247XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0NvbG9yfSBmcm9tICcuL3ZhbHVlcy5qcyc7XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCB0eXBlIHtHbG9iYWxQcm9wZXJ0aWVzLCBGZWF0dXJlLCBGZWF0dXJlU3RhdGV9IGZyb20gJy4vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVEaXN0YW5jZURhdGF9IGZyb20gJy4uL2ZlYXR1cmVfZmlsdGVyL2luZGV4LmpzJztcblxuY29uc3QgZ2VvbWV0cnlUeXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcblxuY2xhc3MgRXZhbHVhdGlvbkNvbnRleHQge1xuICAgIGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXM7XG4gICAgZmVhdHVyZTogP0ZlYXR1cmU7XG4gICAgZmVhdHVyZVN0YXRlOiA/RmVhdHVyZVN0YXRlO1xuICAgIGZvcm1hdHRlZFNlY3Rpb246ID9Gb3JtYXR0ZWRTZWN0aW9uO1xuICAgIGF2YWlsYWJsZUltYWdlczogP0FycmF5PHN0cmluZz47XG4gICAgY2Fub25pY2FsOiBudWxsIHwgQ2Fub25pY2FsVGlsZUlEO1xuICAgIGZlYXR1cmVUaWxlQ29vcmQ6ID9Qb2ludDtcbiAgICBmZWF0dXJlRGlzdGFuY2VEYXRhOiA/RmVhdHVyZURpc3RhbmNlRGF0YTtcblxuICAgIF9wYXJzZUNvbG9yQ2FjaGU6IHtbXzogc3RyaW5nXTogP0NvbG9yfTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmdsb2JhbHMgPSAobnVsbDogYW55KTtcbiAgICAgICAgdGhpcy5mZWF0dXJlID0gbnVsbDtcbiAgICAgICAgdGhpcy5mZWF0dXJlU3RhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLmZvcm1hdHRlZFNlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLl9wYXJzZUNvbG9yQ2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVJbWFnZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNhbm9uaWNhbCA9IG51bGw7XG4gICAgICAgIHRoaXMuZmVhdHVyZVRpbGVDb29yZCA9IG51bGw7XG4gICAgICAgIHRoaXMuZmVhdHVyZURpc3RhbmNlRGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgJiYgJ2lkJyBpbiB0aGlzLmZlYXR1cmUgJiYgdGhpcy5mZWF0dXJlLmlkID8gdGhpcy5mZWF0dXJlLmlkIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZW9tZXRyeVR5cGUoKTogbnVsbCB8IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmUgPyB0eXBlb2YgdGhpcy5mZWF0dXJlLnR5cGUgPT09ICdudW1iZXInID8gZ2VvbWV0cnlUeXBlc1t0aGlzLmZlYXR1cmUudHlwZV0gOiB0aGlzLmZlYXR1cmUudHlwZSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2VvbWV0cnkoKTogP0FycmF5PEFycmF5PFBvaW50Pj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlICYmICdnZW9tZXRyeScgaW4gdGhpcy5mZWF0dXJlID8gdGhpcy5mZWF0dXJlLmdlb21ldHJ5IDogbnVsbDtcbiAgICB9XG5cbiAgICBjYW5vbmljYWxJRCgpOiBudWxsIHwgQ2Fub25pY2FsVGlsZUlEIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fub25pY2FsO1xuICAgIH1cblxuICAgIHByb3BlcnRpZXMoKToge1tzdHJpbmddOiBhbnl9IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZlYXR1cmUgJiYgdGhpcy5mZWF0dXJlLnByb3BlcnRpZXMpIHx8IHt9O1xuICAgIH1cblxuICAgIGRpc3RhbmNlRnJvbUNlbnRlcigpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5mZWF0dXJlVGlsZUNvb3JkICYmIHRoaXMuZmVhdHVyZURpc3RhbmNlRGF0YSkge1xuXG4gICAgICAgICAgICBjb25zdCBjID0gdGhpcy5mZWF0dXJlRGlzdGFuY2VEYXRhLmNlbnRlcjtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5mZWF0dXJlRGlzdGFuY2VEYXRhLnNjYWxlO1xuICAgICAgICAgICAgY29uc3Qge3gsIHl9ID0gdGhpcy5mZWF0dXJlVGlsZUNvb3JkO1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIHZlY3RvciBgZGAgKGxlZnQgaGFuZGVkKVxuICAgICAgICAgICAgY29uc3QgZFggPSB4ICogc2NhbGUgLSBjWzBdO1xuICAgICAgICAgICAgY29uc3QgZFkgPSB5ICogc2NhbGUgLSBjWzFdO1xuXG4gICAgICAgICAgICAvLyBUaGUgYmVhcmluZyB2ZWN0b3IgYGJgIChsZWZ0IGhhbmRlZClcbiAgICAgICAgICAgIGNvbnN0IGJYID0gdGhpcy5mZWF0dXJlRGlzdGFuY2VEYXRhLmJlYXJpbmdbMF07XG4gICAgICAgICAgICBjb25zdCBiWSA9IHRoaXMuZmVhdHVyZURpc3RhbmNlRGF0YS5iZWFyaW5nWzFdO1xuXG4gICAgICAgICAgICAvLyBEaXN0YW5jZSBpcyBjYWxjdWxhdGVkIGFzIGBkb3QoZCwgdilgXG4gICAgICAgICAgICBjb25zdCBkaXN0ID0gKGJYICogZFggKyBiWSAqIGRZKTtcbiAgICAgICAgICAgIHJldHVybiBkaXN0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcGFyc2VDb2xvcihpbnB1dDogc3RyaW5nKTogP0NvbG9yIHtcbiAgICAgICAgbGV0IGNhY2hlZCA9IHRoaXMuX3BhcnNlQ29sb3JDYWNoZVtpbnB1dF07XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgICBjYWNoZWQgPSB0aGlzLl9wYXJzZUNvbG9yQ2FjaGVbaW5wdXRdID0gQ29sb3IucGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmFsdWF0aW9uQ29udGV4dDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7dG9TdHJpbmd9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5pbXBvcnQgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb24sIEV4cHJlc3Npb25SZWdpc3RyeX0gZnJvbSAnLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtWYWx1ZX0gZnJvbSAnLi92YWx1ZXMuanMnO1xuXG5leHBvcnQgdHlwZSBWYXJhcmdzID0ge3wgdHlwZTogVHlwZSB8fTtcbnR5cGUgU2lnbmF0dXJlID0gQXJyYXk8VHlwZT4gfCBWYXJhcmdzO1xudHlwZSBFdmFsdWF0ZSA9IChFdmFsdWF0aW9uQ29udGV4dCwgQXJyYXk8RXhwcmVzc2lvbj4pID0+IFZhbHVlO1xudHlwZSBEZWZpbml0aW9uID0gW1R5cGUsIFNpZ25hdHVyZSwgRXZhbHVhdGVdIHxcbiAgICB7fHR5cGU6IFR5cGUsIG92ZXJsb2FkczogQXJyYXk8W1NpZ25hdHVyZSwgRXZhbHVhdGVdPnx9O1xuXG5jbGFzcyBDb21wb3VuZEV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdHlwZTogVHlwZTtcbiAgICBfZXZhbHVhdGU6IEV2YWx1YXRlO1xuICAgIGFyZ3M6IEFycmF5PEV4cHJlc3Npb24+O1xuXG4gICAgc3RhdGljIGRlZmluaXRpb25zOiB7W186IHN0cmluZ106IERlZmluaXRpb24gfTtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdHlwZTogVHlwZSwgZXZhbHVhdGU6IEV2YWx1YXRlLCBhcmdzOiBBcnJheTxFeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLl9ldmFsdWF0ZSA9IGV2YWx1YXRlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpOiBWYWx1ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmFsdWF0ZShjdHgsIHRoaXMuYXJncyk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLmFyZ3MuZm9yRWFjaChmbik7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxtaXhlZD4ge1xuICAgICAgICByZXR1cm4gW3RoaXMubmFtZV0uY29uY2F0KHRoaXMuYXJncy5tYXAoYXJnID0+IGFyZy5zZXJpYWxpemUoKSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBjb25zdCBvcDogc3RyaW5nID0gKGFyZ3NbMF06IGFueSk7XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBDb21wb3VuZEV4cHJlc3Npb24uZGVmaW5pdGlvbnNbb3BdO1xuICAgICAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBVbmtub3duIGV4cHJlc3Npb24gXCIke29wfVwiLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLmAsIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm93IGNoZWNrIGFyZ3VtZW50IHR5cGVzIGFnYWluc3QgZWFjaCBzaWduYXR1cmVcbiAgICAgICAgY29uc3QgdHlwZSA9IEFycmF5LmlzQXJyYXkoZGVmaW5pdGlvbikgP1xuICAgICAgICAgICAgZGVmaW5pdGlvblswXSA6IGRlZmluaXRpb24udHlwZTtcblxuICAgICAgICBjb25zdCBhdmFpbGFibGVPdmVybG9hZHMgPSBBcnJheS5pc0FycmF5KGRlZmluaXRpb24pID9cbiAgICAgICAgICAgIFtbZGVmaW5pdGlvblsxXSwgZGVmaW5pdGlvblsyXV1dIDpcbiAgICAgICAgICAgIGRlZmluaXRpb24ub3ZlcmxvYWRzO1xuXG4gICAgICAgIGNvbnN0IG92ZXJsb2FkcyA9IGF2YWlsYWJsZU92ZXJsb2Fkcy5maWx0ZXIoKFtzaWduYXR1cmVdKSA9PiAoXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShzaWduYXR1cmUpIHx8IC8vIHZhcmFnc1xuICAgICAgICAgICAgc2lnbmF0dXJlLmxlbmd0aCA9PT0gYXJncy5sZW5ndGggLSAxIC8vIGNvcnJlY3QgcGFyYW0gY291bnRcbiAgICAgICAgKSk7XG5cbiAgICAgICAgbGV0IHNpZ25hdHVyZUNvbnRleHQ6IFBhcnNpbmdDb250ZXh0ID0gKG51bGw6IGFueSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbcGFyYW1zLCBldmFsdWF0ZV0gb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICAgICAgICAvLyBVc2UgYSBmcmVzaCBjb250ZXh0IGZvciBlYWNoIGF0dGVtcHRlZCBzaWduYXR1cmUgc28gdGhhdCwgaWZcbiAgICAgICAgICAgIC8vIHdlIGV2ZW50dWFsbHkgc3VjY2VlZCwgd2UgaGF2ZW4ndCBwb2xsdXRlZCBgY29udGV4dC5lcnJvcnNgLlxuICAgICAgICAgICAgc2lnbmF0dXJlQ29udGV4dCA9IG5ldyBQYXJzaW5nQ29udGV4dChjb250ZXh0LnJlZ2lzdHJ5LCBjb250ZXh0LnBhdGgsIG51bGwsIGNvbnRleHQuc2NvcGUpO1xuXG4gICAgICAgICAgICAvLyBGaXJzdCBwYXJzZSBhbGwgdGhlIGFyZ3MsIHBvdGVudGlhbGx5IGNvZXJjaW5nIHRvIHRoZVxuICAgICAgICAgICAgLy8gdHlwZXMgZXhwZWN0ZWQgYnkgdGhpcyBvdmVybG9hZC5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3M6IEFycmF5PEV4cHJlc3Npb24+ID0gW107XG4gICAgICAgICAgICBsZXQgYXJnUGFyc2VGYWlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRUeXBlID0gQXJyYXkuaXNBcnJheShwYXJhbXMpID9cbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2kgLSAxXSA6XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy50eXBlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gc2lnbmF0dXJlQ29udGV4dC5wYXJzZShhcmcsIDEgKyBwYXJzZWRBcmdzLmxlbmd0aCwgZXhwZWN0ZWRUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgICAgICAgICAgICAgICBhcmdQYXJzZUZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJzZWRBcmdzLnB1c2gocGFyc2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcmdQYXJzZUZhaWxlZCkge1xuICAgICAgICAgICAgICAgIC8vIENvdWxkbid0IGNvZXJjZSBhcmdzIG9mIHRoaXMgb3ZlcmxvYWQgdG8gZXhwZWN0ZWQgdHlwZSwgbW92ZVxuICAgICAgICAgICAgICAgIC8vIG9uIHRvIG5leHQgb25lLlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IHBhcnNlZEFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZUNvbnRleHQuZXJyb3IoYEV4cGVjdGVkICR7cGFyYW1zLmxlbmd0aH0gYXJndW1lbnRzLCBidXQgZm91bmQgJHtwYXJzZWRBcmdzLmxlbmd0aH0gaW5zdGVhZC5gKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZEFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IEFycmF5LmlzQXJyYXkocGFyYW1zKSA/IHBhcmFtc1tpXSA6IHBhcmFtcy50eXBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IHBhcnNlZEFyZ3NbaV07XG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlQ29udGV4dC5jb25jYXQoaSArIDEpLmNoZWNrU3VidHlwZShleHBlY3RlZCwgYXJnLnR5cGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2lnbmF0dXJlQ29udGV4dC5lcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3VuZEV4cHJlc3Npb24ob3AsIHR5cGUsIGV2YWx1YXRlLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2VydCghc2lnbmF0dXJlQ29udGV4dCB8fCBzaWduYXR1cmVDb250ZXh0LmVycm9ycy5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaCguLi5zaWduYXR1cmVDb250ZXh0LmVycm9ycyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IG92ZXJsb2Fkcy5sZW5ndGggPyBvdmVybG9hZHMgOiBhdmFpbGFibGVPdmVybG9hZHM7XG4gICAgICAgICAgICBjb25zdCBzaWduYXR1cmVzID0gZXhwZWN0ZWRcbiAgICAgICAgICAgICAgICAubWFwKChbcGFyYW1zXSkgPT4gc3RyaW5naWZ5U2lnbmF0dXJlKHBhcmFtcykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJyB8ICcpO1xuXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxUeXBlcyA9IFtdO1xuICAgICAgICAgICAgLy8gRm9yIGVycm9yIG1lc3NhZ2UsIHJlLXBhcnNlIGFyZ3VtZW50cyB3aXRob3V0IHRyeWluZyB0b1xuICAgICAgICAgICAgLy8gYXBwbHkgYW55IGNvZXJjaW9uc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gY29udGV4dC5wYXJzZShhcmdzW2ldLCAxICsgYWN0dWFsVHlwZXMubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgYWN0dWFsVHlwZXMucHVzaCh0b1N0cmluZyhwYXJzZWQudHlwZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXJndW1lbnRzIG9mIHR5cGUgJHtzaWduYXR1cmVzfSwgYnV0IGZvdW5kICgke2FjdHVhbFR5cGVzLmpvaW4oJywgJyl9KSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlZ2lzdGVyKFxuICAgICAgICByZWdpc3RyeTogRXhwcmVzc2lvblJlZ2lzdHJ5LFxuICAgICAgICBkZWZpbml0aW9uczoge1tfOiBzdHJpbmddOiBEZWZpbml0aW9uIH1cbiAgICApIHtcbiAgICAgICAgYXNzZXJ0KCFDb21wb3VuZEV4cHJlc3Npb24uZGVmaW5pdGlvbnMpO1xuICAgICAgICBDb21wb3VuZEV4cHJlc3Npb24uZGVmaW5pdGlvbnMgPSBkZWZpbml0aW9ucztcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGRlZmluaXRpb25zKSB7XG4gICAgICAgICAgICByZWdpc3RyeVtuYW1lXSA9IENvbXBvdW5kRXhwcmVzc2lvbjtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5U2lnbmF0dXJlKHNpZ25hdHVyZTogU2lnbmF0dXJlKTogc3RyaW5nIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzaWduYXR1cmUpKSB7XG4gICAgICAgIHJldHVybiBgKCR7c2lnbmF0dXJlLm1hcCh0b1N0cmluZykuam9pbignLCAnKX0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYCgke3RvU3RyaW5nKHNpZ25hdHVyZS50eXBlKX0uLi4pYDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbXBvdW5kRXhwcmVzc2lvbjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7U3RyaW5nVHlwZSwgQm9vbGVhblR5cGUsIENvbGxhdG9yVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IENvbGxhdG9yIGZyb20gJy4uL3R5cGVzL2NvbGxhdG9yLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb24sIFNlcmlhbGl6ZWRFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29sbGF0b3JFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBjYXNlU2Vuc2l0aXZlOiBFeHByZXNzaW9uO1xuICAgIGRpYWNyaXRpY1NlbnNpdGl2ZTogRXhwcmVzc2lvbjtcbiAgICBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoY2FzZVNlbnNpdGl2ZTogRXhwcmVzc2lvbiwgZGlhY3JpdGljU2Vuc2l0aXZlOiBFeHByZXNzaW9uLCBsb2NhbGU6IEV4cHJlc3Npb24gfCBudWxsKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IENvbGxhdG9yVHlwZTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZSA9IGNhc2VTZW5zaXRpdmU7XG4gICAgICAgIHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlID0gZGlhY3JpdGljU2Vuc2l0aXZlO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0V4cHJlc3Npb24ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgb25lIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoYXJnc1sxXTogYW55KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgQ29sbGF0b3Igb3B0aW9ucyBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdC5gKTtcblxuICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gY29udGV4dC5wYXJzZShcbiAgICAgICAgICAgIG9wdGlvbnNbJ2Nhc2Utc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snY2FzZS1zZW5zaXRpdmUnXSwgMSwgQm9vbGVhblR5cGUpO1xuICAgICAgICBpZiAoIWNhc2VTZW5zaXRpdmUpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGRpYWNyaXRpY1NlbnNpdGl2ZSA9IGNvbnRleHQucGFyc2UoXG4gICAgICAgICAgICBvcHRpb25zWydkaWFjcml0aWMtc2Vuc2l0aXZlJ10gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogb3B0aW9uc1snZGlhY3JpdGljLXNlbnNpdGl2ZSddLCAxLCBCb29sZWFuVHlwZSk7XG4gICAgICAgIGlmICghZGlhY3JpdGljU2Vuc2l0aXZlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgbG9jYWxlID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ2xvY2FsZSddKSB7XG4gICAgICAgICAgICBsb2NhbGUgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ2xvY2FsZSddLCAxLCBTdHJpbmdUeXBlKTtcbiAgICAgICAgICAgIGlmICghbG9jYWxlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQ29sbGF0b3JFeHByZXNzaW9uKGNhc2VTZW5zaXRpdmUsIGRpYWNyaXRpY1NlbnNpdGl2ZSwgbG9jYWxlKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KTogQ29sbGF0b3Ige1xuICAgICAgICByZXR1cm4gbmV3IENvbGxhdG9yKHRoaXMuY2FzZVNlbnNpdGl2ZS5ldmFsdWF0ZShjdHgpLCB0aGlzLmRpYWNyaXRpY1NlbnNpdGl2ZS5ldmFsdWF0ZShjdHgpLCB0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlLmV2YWx1YXRlKGN0eCkgOiBudWxsKTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuY2FzZVNlbnNpdGl2ZSk7XG4gICAgICAgIGZuKHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlKTtcbiAgICAgICAgaWYgKHRoaXMubG9jYWxlKSB7XG4gICAgICAgICAgICBmbih0aGlzLmxvY2FsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBUZWNobmljYWxseSB0aGUgc2V0IG9mIHBvc3NpYmxlIG91dHB1dHMgaXMgdGhlIGNvbWJpbmF0b3JpYyBzZXQgb2YgQ29sbGF0b3JzIHByb2R1Y2VkXG4gICAgICAgIC8vIGJ5IGFsbCBwb3NzaWJsZSBvdXRwdXRzIG9mIGxvY2FsZS9jYXNlU2Vuc2l0aXZlL2RpYWNyaXRpY1NlbnNpdGl2ZVxuICAgICAgICAvLyBCdXQgZm9yIHRoZSBwcmltYXJ5IHVzZSBvZiBDb2xsYXRvcnMgaW4gY29tcGFyaXNvbiBvcGVyYXRvcnMsIHdlIGlnbm9yZSB0aGUgQ29sbGF0b3Inc1xuICAgICAgICAvLyBwb3NzaWJsZSBvdXRwdXRzIGFueXdheSwgc28gd2UgY2FuIGdldCBhd2F5IHdpdGggbGVhdmluZyB0aGlzIGZhbHNlIGZvciBub3cuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU2VyaWFsaXplZEV4cHJlc3Npb24ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge307XG4gICAgICAgIG9wdGlvbnNbJ2Nhc2Utc2Vuc2l0aXZlJ10gPSB0aGlzLmNhc2VTZW5zaXRpdmUuc2VyaWFsaXplKCk7XG4gICAgICAgIG9wdGlvbnNbJ2RpYWNyaXRpYy1zZW5zaXRpdmUnXSA9IHRoaXMuZGlhY3JpdGljU2Vuc2l0aXZlLnNlcmlhbGl6ZSgpO1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbJ2xvY2FsZSddID0gdGhpcy5sb2NhbGUuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcImNvbGxhdG9yXCIsIG9wdGlvbnNdO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7aXNWYWx1ZX0gZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQge0Jvb2xlYW5UeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTiwgR2VvSlNPTlBvbHlnb24sIEdlb0pTT05NdWx0aVBvbHlnb259IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5cbnR5cGUgR2VvSlNPTlBvbHlnb25zID18IEdlb0pTT05Qb2x5Z29uIHwgR2VvSlNPTk11bHRpUG9seWdvbjtcblxuLy8gbWluWCwgbWluWSwgbWF4WCwgbWF4WVxudHlwZSBCQm94ID0gW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5jb25zdCBFWFRFTlQgPSA4MTkyO1xuXG5mdW5jdGlvbiB1cGRhdGVCQm94KGJib3g6IEJCb3gsIGNvb3JkOiBQb2ludCkge1xuICAgIGJib3hbMF0gPSBNYXRoLm1pbihiYm94WzBdLCBjb29yZFswXSk7XG4gICAgYmJveFsxXSA9IE1hdGgubWluKGJib3hbMV0sIGNvb3JkWzFdKTtcbiAgICBiYm94WzJdID0gTWF0aC5tYXgoYmJveFsyXSwgY29vcmRbMF0pO1xuICAgIGJib3hbM10gPSBNYXRoLm1heChiYm94WzNdLCBjb29yZFsxXSk7XG59XG5cbmZ1bmN0aW9uIG1lcmNhdG9yWGZyb21MbmcobG5nOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKDE4MCArIGxuZykgLyAzNjA7XG59XG5cbmZ1bmN0aW9uIG1lcmNhdG9yWWZyb21MYXQobGF0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gKDE4MCAtICgxODAgLyBNYXRoLlBJICogTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSSAvIDQgKyBsYXQgKiBNYXRoLlBJIC8gMzYwKSkpKSAvIDM2MDtcbn1cblxuZnVuY3Rpb24gYm94V2l0aGluQm94KGJib3gxOiBCQm94LCBiYm94MjogQkJveCkge1xuICAgIGlmIChiYm94MVswXSA8PSBiYm94MlswXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVsyXSA+PSBiYm94MlsyXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVsxXSA8PSBiYm94MlsxXSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChiYm94MVszXSA+PSBiYm94MlszXSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZXRUaWxlQ29vcmRpbmF0ZXMocCwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICBjb25zdCB4ID0gbWVyY2F0b3JYZnJvbUxuZyhwWzBdKTtcbiAgICBjb25zdCB5ID0gbWVyY2F0b3JZZnJvbUxhdChwWzFdKTtcbiAgICBjb25zdCB0aWxlc0F0Wm9vbSA9IE1hdGgucG93KDIsIGNhbm9uaWNhbC56KTtcbiAgICByZXR1cm4gW01hdGgucm91bmQoeCAqIHRpbGVzQXRab29tICogRVhURU5UKSwgTWF0aC5yb3VuZCh5ICogdGlsZXNBdFpvb20gKiBFWFRFTlQpXTtcbn1cblxuZnVuY3Rpb24gb25Cb3VuZGFyeShwLCBwMSwgcDIpIHtcbiAgICBjb25zdCB4MSA9IHBbMF0gLSBwMVswXTtcbiAgICBjb25zdCB5MSA9IHBbMV0gLSBwMVsxXTtcbiAgICBjb25zdCB4MiA9IHBbMF0gLSBwMlswXTtcbiAgICBjb25zdCB5MiA9IHBbMV0gLSBwMlsxXTtcbiAgICByZXR1cm4gKHgxICogeTIgLSB4MiAqIHkxID09PSAwKSAmJiAoeDEgKiB4MiA8PSAwKSAmJiAoeTEgKiB5MiA8PSAwKTtcbn1cblxuZnVuY3Rpb24gcmF5SW50ZXJzZWN0KHAsIHAxLCBwMikge1xuICAgIHJldHVybiAoKHAxWzFdID4gcFsxXSkgIT09IChwMlsxXSA+IHBbMV0pKSAmJiAocFswXSA8IChwMlswXSAtIHAxWzBdKSAqIChwWzFdIC0gcDFbMV0pIC8gKHAyWzFdIC0gcDFbMV0pICsgcDFbMF0pO1xufVxuXG4vLyByYXkgY2FzdGluZyBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBpZiBwb2ludCBpcyBpbiBwb2x5Z29uXG5mdW5jdGlvbiBwb2ludFdpdGhpblBvbHlnb24ocG9pbnQsIHJpbmdzKSB7XG4gICAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCByaW5nID0gcmluZ3NbaV07XG4gICAgICAgIGZvciAobGV0IGogPSAwLCBsZW4yID0gcmluZy5sZW5ndGg7IGogPCBsZW4yIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBpZiAob25Cb3VuZGFyeShwb2ludCwgcmluZ1tqXSwgcmluZ1tqICsgMV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAocmF5SW50ZXJzZWN0KHBvaW50LCByaW5nW2pdLCByaW5nW2ogKyAxXSkpIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluc2lkZTtcbn1cblxuZnVuY3Rpb24gcG9pbnRXaXRoaW5Qb2x5Z29ucyhwb2ludCwgcG9seWdvbnMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwb2ludFdpdGhpblBvbHlnb24ocG9pbnQsIHBvbHlnb25zW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGVycCh2MSwgdjIpIHtcbiAgICByZXR1cm4gKHYxWzBdICogdjJbMV0gLSB2MVsxXSAqIHYyWzBdKTtcbn1cblxuLy8gY2hlY2sgaWYgcDEgYW5kIHAyIGFyZSBpbiBkaWZmZXJlbnQgc2lkZXMgb2YgbGluZSBzZWdtZW50IHExLT5xMlxuZnVuY3Rpb24gIHR3b1NpZGVkKHAxLCBwMiwgcTEsIHEyKSB7XG4gICAgLy8gcTEtPnAxICh4MSwgeTEpLCBxMS0+cDIgKHgyLCB5MiksIHExLT5xMiAoeDMsIHkzKVxuICAgIGNvbnN0IHgxID0gcDFbMF0gLSBxMVswXTtcbiAgICBjb25zdCB5MSA9IHAxWzFdIC0gcTFbMV07XG4gICAgY29uc3QgeDIgPSBwMlswXSAtIHExWzBdO1xuICAgIGNvbnN0IHkyID0gcDJbMV0gLSBxMVsxXTtcbiAgICBjb25zdCB4MyA9IHEyWzBdIC0gcTFbMF07XG4gICAgY29uc3QgeTMgPSBxMlsxXSAtIHExWzFdO1xuICAgIGNvbnN0IGRldDEgPSAoeDEgKiB5MyAtIHgzICogeTEpO1xuICAgIGNvbnN0IGRldDIgPSAgKHgyICogeTMgLSB4MyAqIHkyKTtcbiAgICBpZiAoKGRldDEgPiAwICYmIGRldDIgPCAwKSB8fCAoZGV0MSA8IDAgJiYgZGV0MiA+IDApKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBhLCBiIGFyZSBlbmQgcG9pbnRzIGZvciBsaW5lIHNlZ21lbnQxLCBjIGFuZCBkIGFyZSBlbmQgcG9pbnRzIGZvciBsaW5lIHNlZ21lbnQyXG5mdW5jdGlvbiBsaW5lSW50ZXJzZWN0TGluZShhLCBiLCBjLCBkKSB7XG4gICAgLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGFyZSBwYXJhbGxlbCBvciBub3RcbiAgICAvLyBwcmVjb25kaXRpb24gaXMgZW5kIHBvaW50IGEsIGIgaXMgaW5zaWRlIHBvbHlnb24sIGlmIGxpbmUgYS0+YiBpc1xuICAgIC8vIHBhcmFsbGVsIHRvIHBvbHlnb24gZWRnZSBjLT5kLCB0aGVuIGEtPmIgd29uJ3QgaW50ZXJzZWN0IHdpdGggYy0+ZFxuICAgIGNvbnN0IHZlY3RvclAgPSBbYlswXSAtIGFbMF0sIGJbMV0gLSBhWzFdXTtcbiAgICBjb25zdCB2ZWN0b3JRID0gW2RbMF0gLSBjWzBdLCBkWzFdIC0gY1sxXV07XG4gICAgaWYgKHBlcnAodmVjdG9yUSwgdmVjdG9yUCkgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIC8vIElmIGxpbmVzIGFyZSBpbnRlcnNlY3Rpbmcgd2l0aCBlYWNoIG90aGVyLCB0aGUgcmVsYXRpdmUgbG9jYXRpb24gc2hvdWxkIGJlOlxuICAgIC8vIGEgYW5kIGIgbGllIGluIGRpZmZlcmVudCBzaWRlcyBvZiBzZWdtZW50IGMtPmRcbiAgICAvLyBjIGFuZCBkIGxpZSBpbiBkaWZmZXJlbnQgc2lkZXMgb2Ygc2VnbWVudCBhLT5iXG4gICAgaWYgKHR3b1NpZGVkKGEsIGIsIGMsIGQpICYmIHR3b1NpZGVkKGMsIGQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpbmVJbnRlcnNlY3RQb2x5Z29uKHAxLCBwMiwgcG9seWdvbikge1xuICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBldmVyeSBlZGdlIG9mIHRoZSByaW5nXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmluZy5sZW5ndGggLSAxOyArK2opIHtcbiAgICAgICAgICAgIGlmIChsaW5lSW50ZXJzZWN0TGluZShwMSwgcDIsIHJpbmdbal0sIHJpbmdbaiArIDFdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZVN0cmluZ1dpdGhpblBvbHlnb24obGluZSwgcG9seWdvbikge1xuICAgIC8vIEZpcnN0LCBjaGVjayBpZiBnZW9tZXRyeSBwb2ludHMgb2YgbGluZSBzZWdtZW50cyBhcmUgYWxsIGluc2lkZSBwb2x5Z29uXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICghcG9pbnRXaXRoaW5Qb2x5Z29uKGxpbmVbaV0sIHBvbHlnb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZWNvbmQsIGNoZWNrIGlmIHRoZXJlIGlzIGxpbmUgc2VnbWVudCBpbnRlcnNlY3RpbmcgcG9seWdvbiBlZGdlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgICBpZiAobGluZUludGVyc2VjdFBvbHlnb24obGluZVtpXSwgbGluZVtpICsgMV0sIHBvbHlnb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29ucyhsaW5lLCBwb2x5Z29ucykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29uKGxpbmUsIHBvbHlnb25zW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0VGlsZVBvbHlnb24oY29vcmRpbmF0ZXMsIGJib3g6IEJCb3gsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgY29uc3QgcG9seWdvbiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvb3JkaW5hdGVzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBjb29yZCA9IGdldFRpbGVDb29yZGluYXRlcyhjb29yZGluYXRlc1tpXVtqXSwgY2Fub25pY2FsKTtcbiAgICAgICAgICAgIHVwZGF0ZUJCb3goYmJveCwgY29vcmQpO1xuICAgICAgICAgICAgcmluZy5wdXNoKGNvb3JkKTtcbiAgICAgICAgfVxuICAgICAgICBwb2x5Z29uLnB1c2gocmluZyk7XG4gICAgfVxuICAgIHJldHVybiBwb2x5Z29uO1xufVxuXG5mdW5jdGlvbiBnZXRUaWxlUG9seWdvbnMoY29vcmRpbmF0ZXMsIGJib3gsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgY29uc3QgcG9seWdvbnMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBvbHlnb24gPSBnZXRUaWxlUG9seWdvbihjb29yZGluYXRlc1tpXSwgYmJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvbHlnb25zO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVQb2ludChwLCBiYm94LCBwb2x5QkJveCwgd29ybGRTaXplKSB7XG4gICAgaWYgKHBbMF0gPCBwb2x5QkJveFswXSB8fCBwWzBdID4gcG9seUJCb3hbMl0pIHtcbiAgICAgICAgY29uc3QgaGFsZldvcmxkU2l6ZSA9IHdvcmxkU2l6ZSAqIDAuNTtcbiAgICAgICAgbGV0IHNoaWZ0ID0gKHBbMF0gLSBwb2x5QkJveFswXSA+IGhhbGZXb3JsZFNpemUpID8gLXdvcmxkU2l6ZSA6IChwb2x5QkJveFswXSAtIHBbMF0gPiBoYWxmV29ybGRTaXplKSA/IHdvcmxkU2l6ZSA6IDA7XG4gICAgICAgIGlmIChzaGlmdCA9PT0gMCkge1xuICAgICAgICAgICAgc2hpZnQgPSAocFswXSAtIHBvbHlCQm94WzJdID4gaGFsZldvcmxkU2l6ZSkgPyAtd29ybGRTaXplIDogKHBvbHlCQm94WzJdIC0gcFswXSA+IGhhbGZXb3JsZFNpemUpID8gd29ybGRTaXplIDogMDtcbiAgICAgICAgfVxuICAgICAgICBwWzBdICs9IHNoaWZ0O1xuICAgIH1cbiAgICB1cGRhdGVCQm94KGJib3gsIHApO1xufVxuXG5mdW5jdGlvbiByZXNldEJCb3goYmJveCkge1xuICAgIGJib3hbMF0gPSBiYm94WzFdID0gSW5maW5pdHk7XG4gICAgYmJveFsyXSA9IGJib3hbM10gPSAtSW5maW5pdHk7XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVQb2ludHMoZ2VvbWV0cnksIHBvaW50QkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgY29uc3Qgd29ybGRTaXplID0gTWF0aC5wb3coMiwgY2Fub25pY2FsLnopICogRVhURU5UO1xuICAgIGNvbnN0IHNoaWZ0cyA9IFtjYW5vbmljYWwueCAqIEVYVEVOVCwgY2Fub25pY2FsLnkgKiBFWFRFTlRdO1xuICAgIGNvbnN0IHRpbGVQb2ludHMgPSBbXTtcbiAgICBpZiAoIWdlb21ldHJ5KSByZXR1cm4gdGlsZVBvaW50cztcbiAgICBmb3IgKGNvbnN0IHBvaW50cyBvZiBnZW9tZXRyeSkge1xuICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHBvaW50cykge1xuICAgICAgICAgICAgY29uc3QgcCA9IFtwb2ludC54ICsgc2hpZnRzWzBdLCBwb2ludC55ICsgc2hpZnRzWzFdXTtcbiAgICAgICAgICAgIHVwZGF0ZVBvaW50KHAsIHBvaW50QkJveCwgcG9seUJCb3gsIHdvcmxkU2l6ZSk7XG4gICAgICAgICAgICB0aWxlUG9pbnRzLnB1c2gocCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRpbGVQb2ludHM7XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVMaW5lcyhnZW9tZXRyeSwgbGluZUJCb3gsIHBvbHlCQm94LCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCkge1xuICAgIGNvbnN0IHdvcmxkU2l6ZSA9IE1hdGgucG93KDIsIGNhbm9uaWNhbC56KSAqIEVYVEVOVDtcbiAgICBjb25zdCBzaGlmdHMgPSBbY2Fub25pY2FsLnggKiBFWFRFTlQsIGNhbm9uaWNhbC55ICogRVhURU5UXTtcbiAgICBjb25zdCB0aWxlTGluZXMgPSBbXTtcbiAgICBpZiAoIWdlb21ldHJ5KSByZXR1cm4gdGlsZUxpbmVzO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBnZW9tZXRyeSkge1xuICAgICAgICBjb25zdCB0aWxlTGluZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIGxpbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBbcG9pbnQueCArIHNoaWZ0c1swXSwgcG9pbnQueSArIHNoaWZ0c1sxXV07XG4gICAgICAgICAgICB1cGRhdGVCQm94KGxpbmVCQm94LCBwKTtcbiAgICAgICAgICAgIHRpbGVMaW5lLnB1c2gocCk7XG4gICAgICAgIH1cbiAgICAgICAgdGlsZUxpbmVzLnB1c2godGlsZUxpbmUpO1xuICAgIH1cbiAgICBpZiAobGluZUJCb3hbMl0gLSBsaW5lQkJveFswXSA8PSB3b3JsZFNpemUgLyAyKSB7XG4gICAgICAgIHJlc2V0QkJveChsaW5lQkJveCk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiB0aWxlTGluZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBsaW5lKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlUG9pbnQocCwgbGluZUJCb3gsIHBvbHlCQm94LCB3b3JsZFNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aWxlTGluZXM7XG59XG5cbmZ1bmN0aW9uIHBvaW50c1dpdGhpblBvbHlnb25zKGN0eDogRXZhbHVhdGlvbkNvbnRleHQsIHBvbHlnb25HZW9tZXRyeTogR2VvSlNPTlBvbHlnb25zKSB7XG4gICAgY29uc3QgcG9pbnRCQm94ID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuICAgIGNvbnN0IHBvbHlCQm94ID0gW0luZmluaXR5LCBJbmZpbml0eSwgLUluZmluaXR5LCAtSW5maW5pdHldO1xuXG4gICAgY29uc3QgY2Fub25pY2FsID0gY3R4LmNhbm9uaWNhbElEKCk7XG4gICAgaWYgKCFjYW5vbmljYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwb2x5Z29uR2VvbWV0cnkudHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnN0IHRpbGVQb2x5Z29uID0gZ2V0VGlsZVBvbHlnb24ocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZVBvaW50cyA9IGdldFRpbGVQb2ludHMoY3R4Lmdlb21ldHJ5KCksIHBvaW50QkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KHBvaW50QkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aWxlUG9pbnRzKSB7XG4gICAgICAgICAgICBpZiAoIXBvaW50V2l0aGluUG9seWdvbihwb2ludCwgdGlsZVBvbHlnb24pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbHlnb25HZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBjb25zdCB0aWxlUG9seWdvbnMgPSBnZXRUaWxlUG9seWdvbnMocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZVBvaW50cyA9IGdldFRpbGVQb2ludHMoY3R4Lmdlb21ldHJ5KCksIHBvaW50QkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KHBvaW50QkJveCwgcG9seUJCb3gpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aWxlUG9pbnRzKSB7XG4gICAgICAgICAgICBpZiAoIXBvaW50V2l0aGluUG9seWdvbnMocG9pbnQsIHRpbGVQb2x5Z29ucykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBsaW5lc1dpdGhpblBvbHlnb25zKGN0eDogRXZhbHVhdGlvbkNvbnRleHQsIHBvbHlnb25HZW9tZXRyeTogR2VvSlNPTlBvbHlnb25zKSB7XG4gICAgY29uc3QgbGluZUJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG4gICAgY29uc3QgcG9seUJCb3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG5cbiAgICBjb25zdCBjYW5vbmljYWwgPSBjdHguY2Fub25pY2FsSUQoKTtcbiAgICBpZiAoIWNhbm9uaWNhbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHBvbHlnb25HZW9tZXRyeS50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgY29uc3QgdGlsZVBvbHlnb24gPSBnZXRUaWxlUG9seWdvbihwb2x5Z29uR2VvbWV0cnkuY29vcmRpbmF0ZXMsIHBvbHlCQm94LCBjYW5vbmljYWwpO1xuICAgICAgICBjb25zdCB0aWxlTGluZXMgPSBnZXRUaWxlTGluZXMoY3R4Lmdlb21ldHJ5KCksIGxpbmVCQm94LCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgaWYgKCFib3hXaXRoaW5Cb3gobGluZUJCb3gsIHBvbHlCQm94KSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiB0aWxlTGluZXMpIHtcbiAgICAgICAgICAgIGlmICghbGluZVN0cmluZ1dpdGhpblBvbHlnb24obGluZSwgdGlsZVBvbHlnb24pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbHlnb25HZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBjb25zdCB0aWxlUG9seWdvbnMgPSBnZXRUaWxlUG9seWdvbnMocG9seWdvbkdlb21ldHJ5LmNvb3JkaW5hdGVzLCBwb2x5QkJveCwgY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdGlsZUxpbmVzID0gZ2V0VGlsZUxpbmVzKGN0eC5nZW9tZXRyeSgpLCBsaW5lQkJveCwgcG9seUJCb3gsIGNhbm9uaWNhbCk7XG4gICAgICAgIGlmICghYm94V2l0aGluQm94KGxpbmVCQm94LCBwb2x5QkJveCkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGlsZUxpbmVzKSB7XG4gICAgICAgICAgICBpZiAoIWxpbmVTdHJpbmdXaXRoaW5Qb2x5Z29ucyhsaW5lLCB0aWxlUG9seWdvbnMpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmNsYXNzIFdpdGhpbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgZ2VvanNvbjogR2VvSlNPTlxuICAgIGdlb21ldHJpZXM6IEdlb0pTT05Qb2x5Z29ucztcblxuICAgIGNvbnN0cnVjdG9yKGdlb2pzb246IEdlb0pTT04sIGdlb21ldHJpZXM6IEdlb0pTT05Qb2x5Z29ucykge1xuICAgICAgICB0aGlzLnR5cGUgPSBCb29sZWFuVHlwZTtcbiAgICAgICAgdGhpcy5nZW9qc29uID0gZ2VvanNvbjtcbiAgICAgICAgdGhpcy5nZW9tZXRyaWVzID0gZ2VvbWV0cmllcztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9XaXRoaW4ge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgJ3dpdGhpbicgZXhwcmVzc2lvbiByZXF1aXJlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuICAgICAgICBpZiAoaXNWYWx1ZShhcmdzWzFdKSkge1xuICAgICAgICAgICAgY29uc3QgZ2VvanNvbiA9IChhcmdzWzFdOiBPYmplY3QpO1xuICAgICAgICAgICAgaWYgKGdlb2pzb24udHlwZSA9PT0gJ0ZlYXR1cmVDb2xsZWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gZ2VvanNvbi5mZWF0dXJlc1tpXS5nZW9tZXRyeS50eXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ1BvbHlnb24nIHx8IHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpdGhpbihnZW9qc29uLCBnZW9qc29uLmZlYXR1cmVzW2ldLmdlb21ldHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2VvanNvbi50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gZ2VvanNvbi5nZW9tZXRyeS50eXBlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaXRoaW4oZ2VvanNvbiwgZ2VvanNvbi5nZW9tZXRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChnZW9qc29uLnR5cGUgID09PSAnUG9seWdvbicgfHwgZ2VvanNvbi50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2l0aGluKGdlb2pzb24sIGdlb2pzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGAnd2l0aGluJyBleHByZXNzaW9uIHJlcXVpcmVzIHZhbGlkIGdlb2pzb24gb2JqZWN0IHRoYXQgY29udGFpbnMgcG9seWdvbiBnZW9tZXRyeSB0eXBlLmApO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGN0eC5nZW9tZXRyeSgpICE9IG51bGwgJiYgY3R4LmNhbm9uaWNhbElEKCkgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5nZW9tZXRyeVR5cGUoKSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb2ludHNXaXRoaW5Qb2x5Z29ucyhjdHgsIHRoaXMuZ2VvbWV0cmllcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN0eC5nZW9tZXRyeVR5cGUoKSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVzV2l0aGluUG9seWdvbnMoY3R4LCB0aGlzLmdlb21ldHJpZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoKSB7fVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IFNlcmlhbGl6ZWRFeHByZXNzaW9uIHtcbiAgICAgICAgcmV0dXJuIFtcIndpdGhpblwiLCB0aGlzLmdlb2pzb25dO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBXaXRoaW47XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQ29tcG91bmRFeHByZXNzaW9uIGZyb20gJy4vY29tcG91bmRfZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgV2l0aGluIGZyb20gJy4vZGVmaW5pdGlvbnMvd2l0aGluLmpzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9ufSBmcm9tICcuL2V4cHJlc3Npb24uanMnO1xuXG5mdW5jdGlvbiBpc0ZlYXR1cmVDb25zdGFudChlOiBFeHByZXNzaW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGUubmFtZSA9PT0gJ2dldCcgJiYgZS5hcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKGUubmFtZSA9PT0gJ2ZlYXR1cmUtc3RhdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZS5uYW1lID09PSAnaGFzJyAmJiBlLmFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBlLm5hbWUgPT09ICdwcm9wZXJ0aWVzJyB8fFxuICAgICAgICAgICAgZS5uYW1lID09PSAnZ2VvbWV0cnktdHlwZScgfHxcbiAgICAgICAgICAgIGUubmFtZSA9PT0gJ2lkJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICgvXmZpbHRlci0vLnRlc3QoZS5uYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGUgaW5zdGFuY2VvZiBXaXRoaW4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuICAgIGUuZWFjaENoaWxkKGFyZyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgIWlzRmVhdHVyZUNvbnN0YW50KGFyZykpIHsgcmVzdWx0ID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc1N0YXRlQ29uc3RhbnQoZTogRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uKSB7XG4gICAgICAgIGlmIChlLm5hbWUgPT09ICdmZWF0dXJlLXN0YXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuICAgIGUuZWFjaENoaWxkKGFyZyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQgJiYgIWlzU3RhdGVDb25zdGFudChhcmcpKSB7IHJlc3VsdCA9IGZhbHNlOyB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGU6IEV4cHJlc3Npb24sIHByb3BlcnRpZXM6IEFycmF5PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIENvbXBvdW5kRXhwcmVzc2lvbiAmJiBwcm9wZXJ0aWVzLmluZGV4T2YoZS5uYW1lKSA+PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGxldCByZXN1bHQgPSB0cnVlO1xuICAgIGUuZWFjaENoaWxkKChhcmcpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAhaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGFyZywgcHJvcGVydGllcykpIHsgcmVzdWx0ID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQge2lzRmVhdHVyZUNvbnN0YW50LCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzU3RhdGVDb25zdGFudH07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0ICBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuXG5jbGFzcyBWYXIgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBib3VuZEV4cHJlc3Npb246IEV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGJvdW5kRXhwcmVzc2lvbjogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBib3VuZEV4cHJlc3Npb24udHlwZTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5ib3VuZEV4cHJlc3Npb24gPSBib3VuZEV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiB2b2lkIHwgVmFyIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9PSAyIHx8IHR5cGVvZiBhcmdzWzFdICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGAndmFyJyBleHByZXNzaW9uIHJlcXVpcmVzIGV4YWN0bHkgb25lIHN0cmluZyBsaXRlcmFsIGFyZ3VtZW50LmApO1xuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBhcmdzWzFdO1xuICAgICAgICBpZiAoIWNvbnRleHQuc2NvcGUuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgVW5rbm93biB2YXJpYWJsZSBcIiR7bmFtZX1cIi4gTWFrZSBzdXJlIFwiJHtuYW1lfVwiIGhhcyBiZWVuIGJvdW5kIGluIGFuIGVuY2xvc2luZyBcImxldFwiIGV4cHJlc3Npb24gYmVmb3JlIHVzaW5nIGl0LmAsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBWYXIobmFtZSwgY29udGV4dC5zY29wZS5nZXQobmFtZSkpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3VuZEV4cHJlc3Npb24uZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoKSB7fVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIFtcInZhclwiLCB0aGlzLm5hbWVdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmFyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFNjb3BlIGZyb20gJy4vc2NvcGUuanMnO1xuaW1wb3J0IHtjaGVja1N1YnR5cGV9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IFBhcnNpbmdFcnJvciBmcm9tICcuL3BhcnNpbmdfZXJyb3IuanMnO1xuaW1wb3J0IExpdGVyYWwgZnJvbSAnLi9kZWZpbml0aW9ucy9saXRlcmFsLmpzJztcbmltcG9ydCBBc3NlcnRpb24gZnJvbSAnLi9kZWZpbml0aW9ucy9hc3NlcnRpb24uanMnO1xuaW1wb3J0IENvZXJjaW9uIGZyb20gJy4vZGVmaW5pdGlvbnMvY29lcmNpb24uanMnO1xuaW1wb3J0IEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi9jb21wb3VuZF9leHByZXNzaW9uLmpzJztcbmltcG9ydCBDb2xsYXRvckV4cHJlc3Npb24gZnJvbSAnLi9kZWZpbml0aW9ucy9jb2xsYXRvci5qcyc7XG5pbXBvcnQgV2l0aGluIGZyb20gJy4vZGVmaW5pdGlvbnMvd2l0aGluLmpzJztcbmltcG9ydCB7aXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50LCBpc0ZlYXR1cmVDb25zdGFudH0gZnJvbSAnLi9pc19jb25zdGFudC5qcyc7XG5pbXBvcnQgVmFyIGZyb20gJy4vZGVmaW5pdGlvbnMvdmFyLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb24sIEV4cHJlc3Npb25SZWdpc3RyeX0gZnJvbSAnLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBTdGF0ZSBhc3NvY2lhdGVkIHBhcnNpbmcgYXQgYSBnaXZlbiBwb2ludCBpbiBhbiBleHByZXNzaW9uIHRyZWUuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQYXJzaW5nQ29udGV4dCB7XG4gICAgcmVnaXN0cnk6IEV4cHJlc3Npb25SZWdpc3RyeTtcbiAgICBwYXRoOiBBcnJheTxudW1iZXI+O1xuICAgIGtleTogc3RyaW5nO1xuICAgIHNjb3BlOiBTY29wZTtcbiAgICBlcnJvcnM6IEFycmF5PFBhcnNpbmdFcnJvcj47XG5cbiAgICAvLyBUaGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGlzIGV4cHJlc3Npb24uIFByb3ZpZGVkIG9ubHkgdG8gYWxsb3cgRXhwcmVzc2lvblxuICAgIC8vIGltcGxlbWVudGF0aW9ucyB0byBpbmZlciBhcmd1bWVudCB0eXBlczogRXhwcmVzc2lvbiNwYXJzZSgpIG5lZWQgbm90XG4gICAgLy8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHBhcnNlZCBleHByZXNzaW9uIG1hdGNoZXNcbiAgICAvLyBgZXhwZWN0ZWRUeXBlYC5cbiAgICBleHBlY3RlZFR5cGU6ID9UeXBlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHJlZ2lzdHJ5OiBFeHByZXNzaW9uUmVnaXN0cnksXG4gICAgICAgIHBhdGg6IEFycmF5PG51bWJlcj4gPSBbXSxcbiAgICAgICAgZXhwZWN0ZWRUeXBlOiA/VHlwZSxcbiAgICAgICAgc2NvcGU6IFNjb3BlID0gbmV3IFNjb3BlKCksXG4gICAgICAgIGVycm9yczogQXJyYXk8UGFyc2luZ0Vycm9yPiA9IFtdXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5rZXkgPSBwYXRoLm1hcChwYXJ0ID0+IGBbJHtwYXJ0fV1gKS5qb2luKCcnKTtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgdGhpcy5leHBlY3RlZFR5cGUgPSBleHBlY3RlZFR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGV4cHIgdGhlIEpTT04gZXhwcmVzc2lvbiB0byBwYXJzZVxuICAgICAqIEBwYXJhbSBpbmRleCB0aGUgb3B0aW9uYWwgYXJndW1lbnQgaW5kZXggaWYgdGhpcyBleHByZXNzaW9uIGlzIGFuIGFyZ3VtZW50IG9mIGEgcGFyZW50IGV4cHJlc3Npb24gdGhhdCdzIGJlaW5nIHBhcnNlZFxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIG9wdGlvbnMub21pdFR5cGVBbm5vdGF0aW9ucyBzZXQgdHJ1ZSB0byBvbWl0IGluZmVycmVkIHR5cGUgYW5ub3RhdGlvbnMuICBDYWxsZXIgYmV3YXJlOiB3aXRoIHRoaXMgb3B0aW9uIHNldCwgdGhlIHBhcnNlZCBleHByZXNzaW9uJ3MgdHlwZSB3aWxsIE5PVCBzYXRpc2Z5IGBleHBlY3RlZFR5cGVgIGlmIGl0IHdvdWxkIG5vcm1hbGx5IGJlIHdyYXBwZWQgaW4gYW4gaW5mZXJyZWQgYW5ub3RhdGlvbi5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHBhcnNlKFxuICAgICAgICBleHByOiBtaXhlZCxcbiAgICAgICAgaW5kZXg/OiBudW1iZXIsXG4gICAgICAgIGV4cGVjdGVkVHlwZT86ID9UeXBlLFxuICAgICAgICBiaW5kaW5ncz86IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPixcbiAgICAgICAgb3B0aW9uczoge3R5cGVBbm5vdGF0aW9uPzogJ2Fzc2VydCcgfCAnY29lcmNlJyB8ICdvbWl0J30gPSB7fVxuICAgICk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25jYXQoaW5kZXgsIGV4cGVjdGVkVHlwZSwgYmluZGluZ3MpLl9wYXJzZShleHByLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2UoZXhwciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgX3BhcnNlKGV4cHI6IG1peGVkLCBvcHRpb25zOiB7dHlwZUFubm90YXRpb24/OiAnYXNzZXJ0JyB8ICdjb2VyY2UnIHwgJ29taXQnfSk6ID9FeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKGV4cHIgPT09IG51bGwgfHwgdHlwZW9mIGV4cHIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBleHByID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIGV4cHIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBleHByID0gWydsaXRlcmFsJywgZXhwcl07XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhbm5vdGF0ZShwYXJzZWQsIHR5cGUsIHR5cGVBbm5vdGF0aW9uOiAnYXNzZXJ0JyB8ICdjb2VyY2UnIHwgJ29taXQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZUFubm90YXRpb24gPT09ICdhc3NlcnQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odHlwZSwgW3BhcnNlZF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlQW5ub3RhdGlvbiA9PT0gJ2NvZXJjZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvZXJjaW9uKHR5cGUsIFtwYXJzZWRdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4cHIpKSB7XG4gICAgICAgICAgICBpZiAoZXhwci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgRXhwZWN0ZWQgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCBvbmUgZWxlbWVudC4gSWYgeW91IHdhbnRlZCBhIGxpdGVyYWwgYXJyYXksIHVzZSBbXCJsaXRlcmFsXCIsIFtdXS5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgb3AgPSBleHByWzBdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGBFeHByZXNzaW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgYnV0IGZvdW5kICR7dHlwZW9mIG9wfSBpbnN0ZWFkLiBJZiB5b3Ugd2FudGVkIGEgbGl0ZXJhbCBhcnJheSwgdXNlIFtcImxpdGVyYWxcIiwgWy4uLl1dLmAsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBFeHByID0gdGhpcy5yZWdpc3RyeVtvcF07XG4gICAgICAgICAgICBpZiAoRXhwcikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZWQgPSBFeHByLnBhcnNlKGV4cHIsIHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cGVjdGVkVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMuZXhwZWN0ZWRUeXBlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWwgPSBwYXJzZWQudHlwZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHdlIGV4cGVjdCBhIG51bWJlciwgc3RyaW5nLCBib29sZWFuLCBvciBhcnJheSBidXQgaGF2ZSBhIHZhbHVlLCB3cmFwIGl0IGluIGFuIGFzc2VydGlvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB3ZSBleHBlY3QgYSBjb2xvciBvciBmb3JtYXR0ZWQgc3RyaW5nLCBidXQgaGF2ZSBhIHN0cmluZyBvciB2YWx1ZSwgd3JhcCBpdCBpbiBhIGNvZXJjaW9uLlxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHdlIGRvIHN0YXRpYyB0eXBlLWNoZWNraW5nLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBiZWhhdmlvcnMgYXJlIG92ZXJyaWRhYmxlIGZvcjpcbiAgICAgICAgICAgICAgICAgICAgLy8gICAqIFRoZSBcImNvYWxlc2NlXCIgb3BlcmF0b3IsIHdoaWNoIG5lZWRzIHRvIG9taXQgdHlwZSBhbm5vdGF0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgLy8gICAqIFN0cmluZy12YWx1ZWQgcHJvcGVydGllcyAoZS5nLiBgdGV4dC1maWVsZGApLCB3aGVyZSBjb2VyY2lvbiBpcyBtb3JlIGNvbnZlbmllbnQgdGhhbiBhc3NlcnRpb24uXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZXhwZWN0ZWQua2luZCA9PT0gJ3N0cmluZycgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ251bWJlcicgfHwgZXhwZWN0ZWQua2luZCA9PT0gJ2Jvb2xlYW4nIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdvYmplY3QnIHx8IGV4cGVjdGVkLmtpbmQgPT09ICdhcnJheScpICYmIGFjdHVhbC5raW5kID09PSAndmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhbm5vdGF0ZShwYXJzZWQsIGV4cGVjdGVkLCBvcHRpb25zLnR5cGVBbm5vdGF0aW9uIHx8ICdhc3NlcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZXhwZWN0ZWQua2luZCA9PT0gJ2NvbG9yJyB8fCBleHBlY3RlZC5raW5kID09PSAnZm9ybWF0dGVkJyB8fCBleHBlY3RlZC5raW5kID09PSAncmVzb2x2ZWRJbWFnZScpICYmIChhY3R1YWwua2luZCA9PT0gJ3ZhbHVlJyB8fCBhY3R1YWwua2luZCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBhbm5vdGF0ZShwYXJzZWQsIGV4cGVjdGVkLCBvcHRpb25zLnR5cGVBbm5vdGF0aW9uIHx8ICdjb2VyY2UnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrU3VidHlwZShleHBlY3RlZCwgYWN0dWFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBhbiBleHByZXNzaW9uJ3MgYXJndW1lbnRzIGFyZSBhbGwgbGl0ZXJhbHMsIHdlIGNhbiBldmFsdWF0ZVxuICAgICAgICAgICAgICAgIC8vIGl0IGltbWVkaWF0ZWx5IGFuZCByZXBsYWNlIGl0IHdpdGggYSBsaXRlcmFsIHZhbHVlIGluIHRoZVxuICAgICAgICAgICAgICAgIC8vIHBhcnNlZC9jb21waWxlZCByZXN1bHQuIEV4cHJlc3Npb25zIHRoYXQgZXhwZWN0IGFuIGltYWdlIHNob3VsZFxuICAgICAgICAgICAgICAgIC8vIG5vdCBiZSByZXNvbHZlZCBoZXJlIHNvIHdlIGNhbiBsYXRlciBnZXQgdGhlIGF2YWlsYWJsZSBpbWFnZXMuXG4gICAgICAgICAgICAgICAgaWYgKCEocGFyc2VkIGluc3RhbmNlb2YgTGl0ZXJhbCkgJiYgKHBhcnNlZC50eXBlLmtpbmQgIT09ICdyZXNvbHZlZEltYWdlJykgJiYgaXNDb25zdGFudChwYXJzZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVjID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBuZXcgTGl0ZXJhbChwYXJzZWQudHlwZSwgcGFyc2VkLmV2YWx1YXRlKGVjKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IoYFVua25vd24gZXhwcmVzc2lvbiBcIiR7b3B9XCIuIElmIHlvdSB3YW50ZWQgYSBsaXRlcmFsIGFycmF5LCB1c2UgW1wibGl0ZXJhbFwiLCBbLi4uXV0uYCwgMCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgJ3VuZGVmaW5lZCcgdmFsdWUgaW52YWxpZC4gVXNlIG51bGwgaW5zdGVhZC5gKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKGBCYXJlIG9iamVjdHMgaW52YWxpZC4gVXNlIFtcImxpdGVyYWxcIiwgey4uLn1dIGluc3RlYWQuYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvcihgRXhwZWN0ZWQgYW4gYXJyYXksIGJ1dCBmb3VuZCAke3R5cGVvZiBleHByfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBjb250ZXh0IHN1aXRhYmxlIGZvciBwYXJzaW5nIHRoZSBzdWJleHByZXNzaW9uIGF0XG4gICAgICogaW5kZXggYGluZGV4YCwgb3B0aW9uYWxseSBhcHBlbmRpbmcgdG8gJ2xldCcgYmluZGluZyBtYXAuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgYGVycm9yc2AgcHJvcGVydHksIGludGVuZGVkIGZvciBjb2xsZWN0aW5nIGVycm9ycyB3aGlsZVxuICAgICAqIHBhcnNpbmcsIGlzIGNvcGllZCBieSByZWZlcmVuY2UgcmF0aGVyIHRoYW4gY2xvbmVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uY2F0KGluZGV4OiBudW1iZXIsIGV4cGVjdGVkVHlwZT86ID9UeXBlLCBiaW5kaW5ncz86IEFycmF5PFtzdHJpbmcsIEV4cHJlc3Npb25dPik6IFBhcnNpbmdDb250ZXh0IHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicgPyB0aGlzLnBhdGguY29uY2F0KGluZGV4KSA6IHRoaXMucGF0aDtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBiaW5kaW5ncyA/IHRoaXMuc2NvcGUuY29uY2F0KGJpbmRpbmdzKSA6IHRoaXMuc2NvcGU7XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2luZ0NvbnRleHQoXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdHJ5LFxuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIGV4cGVjdGVkVHlwZSB8fCBudWxsLFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICB0aGlzLmVycm9yc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1c2ggYSBwYXJzaW5nIChvciB0eXBlIGNoZWNraW5nKSBlcnJvciBpbnRvIHRoZSBgdGhpcy5lcnJvcnNgXG4gICAgICogQHBhcmFtIGVycm9yIFRoZSBtZXNzYWdlXG4gICAgICogQHBhcmFtIGtleXMgT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBzb3VyY2Ugb2YgdGhlIGVycm9yIGF0IGEgY2hpbGRcbiAgICAgKiBvZiB0aGUgY3VycmVudCBleHByZXNzaW9uIGF0IGB0aGlzLmtleWAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBlcnJvcihlcnJvcjogc3RyaW5nLCAuLi5rZXlzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGAke3RoaXMua2V5fSR7a2V5cy5tYXAoayA9PiBgWyR7a31dYCkuam9pbignJyl9YDtcbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgUGFyc2luZ0Vycm9yKGtleSwgZXJyb3IpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIG51bGwgaWYgYHRgIGlzIGEgc3VidHlwZSBvZiBgZXhwZWN0ZWRgOyBvdGhlcndpc2UgcmV0dXJucyBhblxuICAgICAqIGVycm9yIG1lc3NhZ2UgYW5kIGFsc28gcHVzaGVzIGl0IHRvIGB0aGlzLmVycm9yc2AuXG4gICAgICovXG4gICAgY2hlY2tTdWJ0eXBlKGV4cGVjdGVkOiBUeXBlLCB0OiBUeXBlKTogP3N0cmluZyB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gY2hlY2tTdWJ0eXBlKGV4cGVjdGVkLCB0KTtcbiAgICAgICAgaWYgKGVycm9yKSB0aGlzLmVycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFyc2luZ0NvbnRleHQ7XG5cbmZ1bmN0aW9uIGlzQ29uc3RhbnQoZXhwcmVzc2lvbjogRXhwcmVzc2lvbikge1xuICAgIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgVmFyKSB7XG4gICAgICAgIHJldHVybiBpc0NvbnN0YW50KGV4cHJlc3Npb24uYm91bmRFeHByZXNzaW9uKTtcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24gJiYgZXhwcmVzc2lvbi5uYW1lID09PSAnZXJyb3InKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb2xsYXRvckV4cHJlc3Npb24pIHtcbiAgICAgICAgLy8gQWx0aG91Z2ggdGhlIHJlc3VsdHMgb2YgYSBDb2xsYXRvciBleHByZXNzaW9uIHdpdGggZml4ZWQgYXJndW1lbnRzXG4gICAgICAgIC8vIGdlbmVyYWxseSBzaG91bGRuJ3QgY2hhbmdlIGJldHdlZW4gZXhlY3V0aW9ucywgd2UgY2FuJ3Qgc2VyaWFsaXplIHRoZW1cbiAgICAgICAgLy8gYXMgY29uc3RhbnQgZXhwcmVzc2lvbnMgYmVjYXVzZSByZXN1bHRzIGNoYW5nZSBiYXNlZCBvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFdpdGhpbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaXNUeXBlQW5ub3RhdGlvbiA9IGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb2VyY2lvbiB8fFxuICAgICAgICBleHByZXNzaW9uIGluc3RhbmNlb2YgQXNzZXJ0aW9uO1xuXG4gICAgbGV0IGNoaWxkcmVuQ29uc3RhbnQgPSB0cnVlO1xuICAgIGV4cHJlc3Npb24uZWFjaENoaWxkKGNoaWxkID0+IHtcbiAgICAgICAgLy8gV2UgY2FuIF9hbG1vc3RfIGFzc3VtZSB0aGF0IGlmIGBleHByZXNzaW9uc2AgY2hpbGRyZW4gYXJlIGNvbnN0YW50LFxuICAgICAgICAvLyB0aGV5IHdvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGV2YWx1YXRlZCB0byBMaXRlcmFsIHZhbHVlcyB3aGVuIHRoZXlcbiAgICAgICAgLy8gd2VyZSBwYXJzZWQuICBUeXBlIGFubm90YXRpb25zIGFyZSB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIHRoZXkgbWlnaHRcbiAgICAgICAgLy8gaGF2ZSBiZWVuIGluZmVycmVkIGFuZCBhZGRlZCBhZnRlciBhIGNoaWxkIHdhcyBwYXJzZWQuXG5cbiAgICAgICAgLy8gU28gd2UgcmVjdXJzZSBpbnRvIGlzQ29uc3RhbnQoKSBmb3IgdGhlIGNoaWxkcmVuIG9mIHR5cGUgYW5ub3RhdGlvbnMsXG4gICAgICAgIC8vIGJ1dCBvdGhlcndpc2Ugc2ltcGx5IGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgTGl0ZXJhbHMuXG4gICAgICAgIGlmIChpc1R5cGVBbm5vdGF0aW9uKSB7XG4gICAgICAgICAgICBjaGlsZHJlbkNvbnN0YW50ID0gY2hpbGRyZW5Db25zdGFudCAmJiBpc0NvbnN0YW50KGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkcmVuQ29uc3RhbnQgPSBjaGlsZHJlbkNvbnN0YW50ICYmIGNoaWxkIGluc3RhbmNlb2YgTGl0ZXJhbDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghY2hpbGRyZW5Db25zdGFudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRmVhdHVyZUNvbnN0YW50KGV4cHJlc3Npb24pICYmXG4gICAgICAgIGlzR2xvYmFsUHJvcGVydHlDb25zdGFudChleHByZXNzaW9uLCBbJ3pvb20nLCAnaGVhdG1hcC1kZW5zaXR5JywgJ2xpbmUtcHJvZ3Jlc3MnLCAnc2t5LXJhZGlhbC1wcm9ncmVzcycsICdhY2N1bXVsYXRlZCcsICdpcy1zdXBwb3J0ZWQtc2NyaXB0JywgJ3BpdGNoJywgJ2Rpc3RhbmNlLWZyb20tY2VudGVyJ10pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuL3J1bnRpbWVfZXJyb3IuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi9leHByZXNzaW9uLmpzJztcblxuZXhwb3J0IHR5cGUgU3RvcHMgPSBBcnJheTxbbnVtYmVyLCBFeHByZXNzaW9uXT47XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc3RvcCA8PSBpbnB1dCwgb3IgMCBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG8oc3RvcHM6IEFycmF5PG51bWJlcj4sIGlucHV0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGxhc3RJbmRleCA9IHN0b3BzLmxlbmd0aCAtIDE7XG4gICAgbGV0IGxvd2VySW5kZXggPSAwO1xuICAgIGxldCB1cHBlckluZGV4ID0gbGFzdEluZGV4O1xuICAgIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICAgIGxldCBjdXJyZW50VmFsdWUsIG5leHRWYWx1ZTtcblxuICAgIHdoaWxlIChsb3dlckluZGV4IDw9IHVwcGVySW5kZXgpIHtcbiAgICAgICAgY3VycmVudEluZGV4ID0gTWF0aC5mbG9vcigobG93ZXJJbmRleCArIHVwcGVySW5kZXgpIC8gMik7XG4gICAgICAgIGN1cnJlbnRWYWx1ZSA9IHN0b3BzW2N1cnJlbnRJbmRleF07XG4gICAgICAgIG5leHRWYWx1ZSA9IHN0b3BzW2N1cnJlbnRJbmRleCArIDFdO1xuXG4gICAgICAgIGlmIChjdXJyZW50VmFsdWUgPD0gaW5wdXQpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IGxhc3RJbmRleCB8fCBpbnB1dCA8IG5leHRWYWx1ZSkgeyAvLyBTZWFyY2ggY29tcGxldGVcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEluZGV4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsb3dlckluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmFsdWUgPiBpbnB1dCkge1xuICAgICAgICAgICAgdXBwZXJJbmRleCA9IGN1cnJlbnRJbmRleCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKCdJbnB1dCBpcyBub3QgYSBudW1iZXIuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7TnVtYmVyVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQge2ZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG99IGZyb20gJy4uL3N0b3BzLmpzJztcblxuaW1wb3J0IHR5cGUge1N0b3BzfSBmcm9tICcuLi9zdG9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jbGFzcyBTdGVwIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcblxuICAgIGlucHV0OiBFeHByZXNzaW9uO1xuICAgIGxhYmVsczogQXJyYXk8bnVtYmVyPjtcbiAgICBvdXRwdXRzOiBBcnJheTxFeHByZXNzaW9uPjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGlucHV0OiBFeHByZXNzaW9uLCBzdG9wczogU3RvcHMpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgIHRoaXMubGFiZWxzID0gW107XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtsYWJlbCwgZXhwcmVzc2lvbl0gb2Ygc3RvcHMpIHtcbiAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2goZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9TdGVwIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIC0gMSA8IDQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCA0IGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChhcmdzLmxlbmd0aCAtIDEpICUgMiAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgaWYgKCFpbnB1dCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgc3RvcHM6IFN0b3BzID0gW107XG5cbiAgICAgICAgbGV0IG91dHB1dFR5cGU6IFR5cGUgPSAobnVsbDogYW55KTtcbiAgICAgICAgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBpID09PSAxID8gLUluZmluaXR5IDogYXJnc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXJnc1tpICsgMV07XG5cbiAgICAgICAgICAgIGNvbnN0IGxhYmVsS2V5ID0gaTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlS2V5ID0gaSArIDE7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGFiZWwgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJzdGVwXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBkZWZpbmVkIHVzaW5nIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZXMgKG5vdCBjb21wdXRlZCBleHByZXNzaW9ucykgZm9yIHRoZSBpbnB1dCB2YWx1ZXMuJywgbGFiZWxLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3RvcHMubGVuZ3RoICYmIHN0b3BzW3N0b3BzLmxlbmd0aCAtIDFdWzBdID49IGxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoJ0lucHV0L291dHB1dCBwYWlycyBmb3IgXCJzdGVwXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBhcnJhbmdlZCB3aXRoIGlucHV0IHZhbHVlcyBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIuJywgbGFiZWxLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBjb250ZXh0LnBhcnNlKHZhbHVlLCB2YWx1ZUtleSwgb3V0cHV0VHlwZSk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCBwYXJzZWQudHlwZTtcbiAgICAgICAgICAgIHN0b3BzLnB1c2goW2xhYmVsLCBwYXJzZWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU3RlcChvdXRwdXRUeXBlLCBpbnB1dCwgc3RvcHMpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpOiBhbnkge1xuICAgICAgICBjb25zdCBsYWJlbHMgPSB0aGlzLmxhYmVscztcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHRoaXMub3V0cHV0cztcblxuICAgICAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbMF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKCh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk6IG51bWJlcik7XG4gICAgICAgIGlmICh2YWx1ZSA8PSBsYWJlbHNbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9wQ291bnQgPSBsYWJlbHMubGVuZ3RoO1xuICAgICAgICBpZiAodmFsdWUgPj0gbGFiZWxzW3N0b3BDb3VudCAtIDFdKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1tzdG9wQ291bnQgLSAxXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKGxhYmVscywgdmFsdWUpO1xuICAgICAgICByZXR1cm4gb3V0cHV0c1tpbmRleF0uZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZuKHRoaXMuaW5wdXQpO1xuICAgICAgICBmb3IgKGNvbnN0IGV4cHJlc3Npb24gb2YgdGhpcy5vdXRwdXRzKSB7XG4gICAgICAgICAgICBmbihleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm91dHB1dHMuZXZlcnkob3V0ID0+IG91dC5vdXRwdXREZWZpbmVkKCkpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemVkRXhwcmVzc2lvbiB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJzdGVwXCIsIHRoaXMuaW5wdXQuc2VyaWFsaXplKCldO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5sYWJlbHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMub3V0cHV0c1tpXS5zZXJpYWxpemUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTdGVwO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4vY29sb3IuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyKGE6IG51bWJlciwgYjogbnVtYmVyLCB0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiAoYSAqICgxIC0gdCkpICsgKGIgKiB0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yKGZyb206IENvbG9yLCB0bzogQ29sb3IsIHQ6IG51bWJlcik6IENvbG9yIHtcbiAgICByZXR1cm4gbmV3IENvbG9yKFxuICAgICAgICBudW1iZXIoZnJvbS5yLCB0by5yLCB0KSxcbiAgICAgICAgbnVtYmVyKGZyb20uZywgdG8uZywgdCksXG4gICAgICAgIG51bWJlcihmcm9tLmIsIHRvLmIsIHQpLFxuICAgICAgICBudW1iZXIoZnJvbS5hLCB0by5hLCB0KVxuICAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheShmcm9tOiBBcnJheTxudW1iZXI+LCB0bzogQXJyYXk8bnVtYmVyPiwgdDogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb20ubWFwKChkLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBudW1iZXIoZCwgdG9baV0sIHQpO1xuICAgIH0pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4vY29sb3IuanMnO1xuXG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZU51bWJlcn0gZnJvbSAnLi9pbnRlcnBvbGF0ZS5qcyc7XG5cbnR5cGUgTEFCQ29sb3IgPSB7XG4gICAgbDogbnVtYmVyLFxuICAgIGE6IG51bWJlcixcbiAgICBiOiBudW1iZXIsXG4gICAgYWxwaGE6IG51bWJlclxufTtcblxudHlwZSBIQ0xDb2xvciA9IHtcbiAgICBoOiBudW1iZXIsXG4gICAgYzogbnVtYmVyLFxuICAgIGw6IG51bWJlcixcbiAgICBhbHBoYTogbnVtYmVyXG59O1xuXG4vLyBDb25zdGFudHNcbmNvbnN0IFhuID0gMC45NTA0NzAsIC8vIEQ2NSBzdGFuZGFyZCByZWZlcmVudFxuICAgIFluID0gMSxcbiAgICBabiA9IDEuMDg4ODMwLFxuICAgIHQwID0gNCAvIDI5LFxuICAgIHQxID0gNiAvIDI5LFxuICAgIHQyID0gMyAqIHQxICogdDEsXG4gICAgdDMgPSB0MSAqIHQxICogdDEsXG4gICAgZGVnMnJhZCA9IE1hdGguUEkgLyAxODAsXG4gICAgcmFkMmRlZyA9IDE4MCAvIE1hdGguUEk7XG5cbi8vIFV0aWxpdGllc1xuZnVuY3Rpb24geHl6MmxhYih0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdCA+IHQzID8gTWF0aC5wb3codCwgMSAvIDMpIDogdCAvIHQyICsgdDA7XG59XG5cbmZ1bmN0aW9uIGxhYjJ4eXoodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHQgPiB0MSA/IHQgKiB0ICogdCA6IHQyICogKHQgLSB0MCk7XG59XG5cbmZ1bmN0aW9uIHh5ejJyZ2IoeDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIDI1NSAqICh4IDw9IDAuMDAzMTMwOCA/IDEyLjkyICogeCA6IDEuMDU1ICogTWF0aC5wb3coeCwgMSAvIDIuNCkgLSAwLjA1NSk7XG59XG5cbmZ1bmN0aW9uIHJnYjJ4eXooeDogbnVtYmVyKSB7XG4gICAgeCAvPSAyNTU7XG4gICAgcmV0dXJuIHggPD0gMC4wNDA0NSA/IHggLyAxMi45MiA6IE1hdGgucG93KCh4ICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG59XG5cbi8vIExBQlxuZnVuY3Rpb24gcmdiVG9MYWIocmdiQ29sb3I6IENvbG9yKTogTEFCQ29sb3Ige1xuICAgIGNvbnN0IGIgPSByZ2IyeHl6KHJnYkNvbG9yLnIpLFxuICAgICAgICBhID0gcmdiMnh5eihyZ2JDb2xvci5nKSxcbiAgICAgICAgbCA9IHJnYjJ4eXoocmdiQ29sb3IuYiksXG4gICAgICAgIHggPSB4eXoybGFiKCgwLjQxMjQ1NjQgKiBiICsgMC4zNTc1NzYxICogYSArIDAuMTgwNDM3NSAqIGwpIC8gWG4pLFxuICAgICAgICB5ID0geHl6MmxhYigoMC4yMTI2NzI5ICogYiArIDAuNzE1MTUyMiAqIGEgKyAwLjA3MjE3NTAgKiBsKSAvIFluKSxcbiAgICAgICAgeiA9IHh5ejJsYWIoKDAuMDE5MzMzOSAqIGIgKyAwLjExOTE5MjAgKiBhICsgMC45NTAzMDQxICogbCkgLyBabik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsOiAxMTYgKiB5IC0gMTYsXG4gICAgICAgIGE6IDUwMCAqICh4IC0geSksXG4gICAgICAgIGI6IDIwMCAqICh5IC0geiksXG4gICAgICAgIGFscGhhOiByZ2JDb2xvci5hXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbGFiVG9SZ2IobGFiQ29sb3I6IExBQkNvbG9yKTogQ29sb3Ige1xuICAgIGxldCB5ID0gKGxhYkNvbG9yLmwgKyAxNikgLyAxMTYsXG4gICAgICAgIHggPSBpc05hTihsYWJDb2xvci5hKSA/IHkgOiB5ICsgbGFiQ29sb3IuYSAvIDUwMCxcbiAgICAgICAgeiA9IGlzTmFOKGxhYkNvbG9yLmIpID8geSA6IHkgLSBsYWJDb2xvci5iIC8gMjAwO1xuICAgIHkgPSBZbiAqIGxhYjJ4eXooeSk7XG4gICAgeCA9IFhuICogbGFiMnh5eih4KTtcbiAgICB6ID0gWm4gKiBsYWIyeHl6KHopO1xuICAgIHJldHVybiBuZXcgQ29sb3IoXG4gICAgICAgIHh5ejJyZ2IoMy4yNDA0NTQyICogeCAtIDEuNTM3MTM4NSAqIHkgLSAwLjQ5ODUzMTQgKiB6KSwgLy8gRDY1IC0+IHNSR0JcbiAgICAgICAgeHl6MnJnYigtMC45NjkyNjYwICogeCArIDEuODc2MDEwOCAqIHkgKyAwLjA0MTU1NjAgKiB6KSxcbiAgICAgICAgeHl6MnJnYigwLjA1NTY0MzQgKiB4IC0gMC4yMDQwMjU5ICogeSArIDEuMDU3MjI1MiAqIHopLFxuICAgICAgICBsYWJDb2xvci5hbHBoYVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlTGFiKGZyb206IExBQkNvbG9yLCB0bzogTEFCQ29sb3IsIHQ6IG51bWJlcik6IExBQkNvbG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmwsIHRvLmwsIHQpLFxuICAgICAgICBhOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmEsIHRvLmEsIHQpLFxuICAgICAgICBiOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmIsIHRvLmIsIHQpLFxuICAgICAgICBhbHBoYTogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5hbHBoYSwgdG8uYWxwaGEsIHQpXG4gICAgfTtcbn1cblxuLy8gSENMXG5mdW5jdGlvbiByZ2JUb0hjbChyZ2JDb2xvcjogQ29sb3IpOiBIQ0xDb2xvciB7XG4gICAgY29uc3Qge2wsIGEsIGJ9ID0gcmdiVG9MYWIocmdiQ29sb3IpO1xuICAgIGNvbnN0IGggPSBNYXRoLmF0YW4yKGIsIGEpICogcmFkMmRlZztcbiAgICByZXR1cm4ge1xuICAgICAgICBoOiBoIDwgMCA/IGggKyAzNjAgOiBoLFxuICAgICAgICBjOiBNYXRoLnNxcnQoYSAqIGEgKyBiICogYiksXG4gICAgICAgIGwsXG4gICAgICAgIGFscGhhOiByZ2JDb2xvci5hXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaGNsVG9SZ2IoaGNsQ29sb3I6IEhDTENvbG9yKTogQ29sb3Ige1xuICAgIGNvbnN0IGggPSBoY2xDb2xvci5oICogZGVnMnJhZCxcbiAgICAgICAgYyA9IGhjbENvbG9yLmMsXG4gICAgICAgIGwgPSBoY2xDb2xvci5sO1xuICAgIHJldHVybiBsYWJUb1JnYih7XG4gICAgICAgIGwsXG4gICAgICAgIGE6IE1hdGguY29zKGgpICogYyxcbiAgICAgICAgYjogTWF0aC5zaW4oaCkgKiBjLFxuICAgICAgICBhbHBoYTogaGNsQ29sb3IuYWxwaGFcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVIdWUoYTogbnVtYmVyLCBiOiBudW1iZXIsIHQ6IG51bWJlcikge1xuICAgIGNvbnN0IGQgPSBiIC0gYTtcbiAgICByZXR1cm4gYSArIHQgKiAoZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlSGNsKGZyb206IEhDTENvbG9yLCB0bzogSENMQ29sb3IsIHQ6IG51bWJlcik6IEhDTENvbG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBoOiBpbnRlcnBvbGF0ZUh1ZShmcm9tLmgsIHRvLmgsIHQpLFxuICAgICAgICBjOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmMsIHRvLmMsIHQpLFxuICAgICAgICBsOiBpbnRlcnBvbGF0ZU51bWJlcihmcm9tLmwsIHRvLmwsIHQpLFxuICAgICAgICBhbHBoYTogaW50ZXJwb2xhdGVOdW1iZXIoZnJvbS5hbHBoYSwgdG8uYWxwaGEsIHQpXG4gICAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGxhYiA9IHtcbiAgICBmb3J3YXJkOiByZ2JUb0xhYixcbiAgICByZXZlcnNlOiBsYWJUb1JnYixcbiAgICBpbnRlcnBvbGF0ZTogaW50ZXJwb2xhdGVMYWJcbn07XG5cbmV4cG9ydCBjb25zdCBoY2wgPSB7XG4gICAgZm9yd2FyZDogcmdiVG9IY2wsXG4gICAgcmV2ZXJzZTogaGNsVG9SZ2IsXG4gICAgaW50ZXJwb2xhdGU6IGludGVycG9sYXRlSGNsXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFVuaXRCZXppZXIgZnJvbSAnQG1hcGJveC91bml0YmV6aWVyJztcblxuaW1wb3J0ICogYXMgaW50ZXJwb2xhdGUgZnJvbSAnLi4vLi4vdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQge3RvU3RyaW5nLCBOdW1iZXJUeXBlLCBDb2xvclR5cGV9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7ZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUb30gZnJvbSAnLi4vc3RvcHMuanMnO1xuaW1wb3J0IHtoY2wsIGxhYn0gZnJvbSAnLi4vLi4vdXRpbC9jb2xvcl9zcGFjZXMuanMnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uLy4uL3V0aWwvY29sb3IuanMnO1xuXG5pbXBvcnQgdHlwZSB7U3RvcHN9IGZyb20gJy4uL3N0b3BzLmpzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9uLCBTZXJpYWxpemVkRXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIEludGVycG9sYXRpb25UeXBlID1cbiAgICB7IG5hbWU6ICdsaW5lYXInIH0gfFxuICAgIHsgbmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogbnVtYmVyIH0gfFxuICAgIHsgbmFtZTogJ2N1YmljLWJlemllcicsIGNvbnRyb2xQb2ludHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIH07XG5cbmNsYXNzIEludGVycG9sYXRlIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcblxuICAgIG9wZXJhdG9yOiAnaW50ZXJwb2xhdGUnIHwgJ2ludGVycG9sYXRlLWhjbCcgfCAnaW50ZXJwb2xhdGUtbGFiJztcbiAgICBpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uVHlwZTtcbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcbiAgICBsYWJlbHM6IEFycmF5PG51bWJlcj47XG4gICAgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBvcGVyYXRvcjogJ2ludGVycG9sYXRlJyB8ICdpbnRlcnBvbGF0ZS1oY2wnIHwgJ2ludGVycG9sYXRlLWxhYicsIGludGVycG9sYXRpb246IEludGVycG9sYXRpb25UeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgc3RvcHM6IFN0b3BzKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuXG4gICAgICAgIHRoaXMubGFiZWxzID0gW107XG4gICAgICAgIHRoaXMub3V0cHV0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtsYWJlbCwgZXhwcmVzc2lvbl0gb2Ygc3RvcHMpIHtcbiAgICAgICAgICAgIHRoaXMubGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2goZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJwb2xhdGlvbkZhY3RvcihpbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0aW9uVHlwZSwgaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCB0ID0gMDtcbiAgICAgICAgaWYgKGludGVycG9sYXRpb24ubmFtZSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICAgICAgdCA9IGV4cG9uZW50aWFsSW50ZXJwb2xhdGlvbihpbnB1dCwgaW50ZXJwb2xhdGlvbi5iYXNlLCBsb3dlciwgdXBwZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRpb24ubmFtZSA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgICAgIHQgPSBleHBvbmVudGlhbEludGVycG9sYXRpb24oaW5wdXQsIDEsIGxvd2VyLCB1cHBlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGlvbi5uYW1lID09PSAnY3ViaWMtYmV6aWVyJykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGludGVycG9sYXRpb24uY29udHJvbFBvaW50cztcbiAgICAgICAgICAgIGNvbnN0IHViID0gbmV3IFVuaXRCZXppZXIoY1swXSwgY1sxXSwgY1syXSwgY1szXSk7XG4gICAgICAgICAgICB0ID0gdWIuc29sdmUoZXhwb25lbnRpYWxJbnRlcnBvbGF0aW9uKGlucHV0LCAxLCBsb3dlciwgdXBwZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9JbnRlcnBvbGF0ZSB7XG4gICAgICAgIGxldCBbb3BlcmF0b3IsIGludGVycG9sYXRpb24sIGlucHV0LCAuLi5yZXN0XSA9IGFyZ3M7XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGludGVycG9sYXRpb24pIHx8IGludGVycG9sYXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gaW50ZXJwb2xhdGlvbiB0eXBlIGV4cHJlc3Npb24uYCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW50ZXJwb2xhdGlvblswXSA9PT0gJ2xpbmVhcicpIHtcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSB7bmFtZTogJ2xpbmVhcid9O1xuICAgICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRpb25bMF0gPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBpbnRlcnBvbGF0aW9uWzFdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlICE9PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwb25lbnRpYWwgaW50ZXJwb2xhdGlvbiByZXF1aXJlcyBhIG51bWVyaWMgYmFzZS5gLCAxLCAxKTtcbiAgICAgICAgICAgIGludGVycG9sYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2V4cG9uZW50aWFsJyxcbiAgICAgICAgICAgICAgICBiYXNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRpb25bMF0gPT09ICdjdWJpYy1iZXppZXInKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sUG9pbnRzID0gaW50ZXJwb2xhdGlvbi5zbGljZSgxKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjb250cm9sUG9pbnRzLmxlbmd0aCAhPT0gNCB8fFxuICAgICAgICAgICAgICAgIGNvbnRyb2xQb2ludHMuc29tZSh0ID0+IHR5cGVvZiB0ICE9PSAnbnVtYmVyJyB8fCB0IDwgMCB8fCB0ID4gMSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdDdWJpYyBiZXppZXIgaW50ZXJwb2xhdGlvbiByZXF1aXJlcyBmb3VyIG51bWVyaWMgYXJndW1lbnRzIHdpdGggdmFsdWVzIGJldHdlZW4gMCBhbmQgMS4nLCAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnY3ViaWMtYmV6aWVyJyxcbiAgICAgICAgICAgICAgICBjb250cm9sUG9pbnRzOiAoY29udHJvbFBvaW50czogYW55KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBVbmtub3duIGludGVycG9sYXRpb24gdHlwZSAke1N0cmluZyhpbnRlcnBvbGF0aW9uWzBdKX1gLCAxLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAtIDEgPCA0KSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCBvbmx5ICR7YXJncy5sZW5ndGggLSAxfS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoYXJncy5sZW5ndGggLSAxKSAlIDIgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dCA9IGNvbnRleHQucGFyc2UoaW5wdXQsIDIsIE51bWJlclR5cGUpO1xuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBzdG9wczogU3RvcHMgPSBbXTtcblxuICAgICAgICBsZXQgb3V0cHV0VHlwZTogVHlwZSA9IChudWxsOiBhbnkpO1xuICAgICAgICBpZiAob3BlcmF0b3IgPT09ICdpbnRlcnBvbGF0ZS1oY2wnIHx8IG9wZXJhdG9yID09PSAnaW50ZXJwb2xhdGUtbGFiJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IENvbG9yVHlwZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LmV4cGVjdGVkVHlwZSAmJiBjb250ZXh0LmV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gY29udGV4dC5leHBlY3RlZFR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3QubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gcmVzdFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzdFtpICsgMV07XG5cbiAgICAgICAgICAgIGNvbnN0IGxhYmVsS2V5ID0gaSArIDM7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUtleSA9IGkgKyA0O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGxhYmVsICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKCdJbnB1dC9vdXRwdXQgcGFpcnMgZm9yIFwiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9ucyBtdXN0IGJlIGRlZmluZWQgdXNpbmcgbGl0ZXJhbCBudW1lcmljIHZhbHVlcyAobm90IGNvbXB1dGVkIGV4cHJlc3Npb25zKSBmb3IgdGhlIGlucHV0IHZhbHVlcy4nLCBsYWJlbEtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdG9wcy5sZW5ndGggJiYgc3RvcHNbc3RvcHMubGVuZ3RoIC0gMV1bMF0gPj0gbGFiZWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcignSW5wdXQvb3V0cHV0IHBhaXJzIGZvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbnMgbXVzdCBiZSBhcnJhbmdlZCB3aXRoIGlucHV0IHZhbHVlcyBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIuJywgbGFiZWxLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBjb250ZXh0LnBhcnNlKHZhbHVlLCB2YWx1ZUtleSwgb3V0cHV0VHlwZSk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCBwYXJzZWQudHlwZTtcbiAgICAgICAgICAgIHN0b3BzLnB1c2goW2xhYmVsLCBwYXJzZWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvdXRwdXRUeXBlLmtpbmQgIT09ICdudW1iZXInICYmXG4gICAgICAgICAgICBvdXRwdXRUeXBlLmtpbmQgIT09ICdjb2xvcicgJiZcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgb3V0cHV0VHlwZS5raW5kID09PSAnYXJyYXknICYmXG4gICAgICAgICAgICAgICAgb3V0cHV0VHlwZS5pdGVtVHlwZS5raW5kID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBvdXRwdXRUeXBlLk4gPT09ICdudW1iZXInXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYFR5cGUgJHt0b1N0cmluZyhvdXRwdXRUeXBlKX0gaXMgbm90IGludGVycG9sYXRhYmxlLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnBvbGF0ZShvdXRwdXRUeXBlLCAob3BlcmF0b3I6IGFueSksIGludGVycG9sYXRpb24sIGlucHV0LCBzdG9wcyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCk6IENvbG9yIHtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gdGhpcy5sYWJlbHM7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLm91dHB1dHM7XG5cbiAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXRzWzBdLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICgodGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpOiBhbnkpOiBudW1iZXIpO1xuICAgICAgICBpZiAodmFsdWUgPD0gbGFiZWxzWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0c1swXS5ldmFsdWF0ZShjdHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcENvdW50ID0gbGFiZWxzLmxlbmd0aDtcbiAgICAgICAgaWYgKHZhbHVlID49IGxhYmVsc1tzdG9wQ291bnQgLSAxXSkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dHNbc3RvcENvdW50IC0gMV0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZmluZFN0b3BMZXNzVGhhbk9yRXF1YWxUbyhsYWJlbHMsIHZhbHVlKTtcbiAgICAgICAgY29uc3QgbG93ZXIgPSBsYWJlbHNbaW5kZXhdO1xuICAgICAgICBjb25zdCB1cHBlciA9IGxhYmVsc1tpbmRleCArIDFdO1xuICAgICAgICBjb25zdCB0ID0gSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvcih0aGlzLmludGVycG9sYXRpb24sIHZhbHVlLCBsb3dlciwgdXBwZXIpO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dExvd2VyID0gb3V0cHV0c1tpbmRleF0uZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0VXBwZXIgPSBvdXRwdXRzW2luZGV4ICsgMV0uZXZhbHVhdGUoY3R4KTtcblxuICAgICAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJ2ludGVycG9sYXRlJykge1xuICAgICAgICAgICAgcmV0dXJuIChpbnRlcnBvbGF0ZVt0aGlzLnR5cGUua2luZC50b0xvd2VyQ2FzZSgpXTogYW55KShvdXRwdXRMb3dlciwgb3V0cHV0VXBwZXIsIHQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uYW1lc3BhY2VcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wZXJhdG9yID09PSAnaW50ZXJwb2xhdGUtaGNsJykge1xuICAgICAgICAgICAgcmV0dXJuIGhjbC5yZXZlcnNlKGhjbC5pbnRlcnBvbGF0ZShoY2wuZm9yd2FyZChvdXRwdXRMb3dlciksIGhjbC5mb3J3YXJkKG91dHB1dFVwcGVyKSwgdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGxhYi5yZXZlcnNlKGxhYi5pbnRlcnBvbGF0ZShsYWIuZm9yd2FyZChvdXRwdXRMb3dlciksIGxhYi5mb3J3YXJkKG91dHB1dFVwcGVyKSwgdCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICAgICAgZm9yIChjb25zdCBleHByZXNzaW9uIG9mIHRoaXMub3V0cHV0cykge1xuICAgICAgICAgICAgZm4oZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRzLmV2ZXJ5KG91dCA9PiBvdXQub3V0cHV0RGVmaW5lZCgpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU2VyaWFsaXplZEV4cHJlc3Npb24ge1xuICAgICAgICBsZXQgaW50ZXJwb2xhdGlvbjtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJwb2xhdGlvbi5uYW1lID09PSAnbGluZWFyJykge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbiA9IFtcImxpbmVhclwiXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmludGVycG9sYXRpb24ubmFtZSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICAgICAgaWYgICh0aGlzLmludGVycG9sYXRpb24uYmFzZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGludGVycG9sYXRpb24gPSBbXCJsaW5lYXJcIl07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGludGVycG9sYXRpb24gPSBbXCJleHBvbmVudGlhbFwiLCB0aGlzLmludGVycG9sYXRpb24uYmFzZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0aW9uID0gW1wiY3ViaWMtYmV6aWVyXCIgXS5jb25jYXQodGhpcy5pbnRlcnBvbGF0aW9uLmNvbnRyb2xQb2ludHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFt0aGlzLm9wZXJhdG9yLCBpbnRlcnBvbGF0aW9uLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5sYWJlbHNbaV0sXG4gICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRzW2ldLnNlcmlhbGl6ZSgpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmF0aW8gdGhhdCBjYW4gYmUgdXNlZCB0byBpbnRlcnBvbGF0ZSBiZXR3ZWVuIGV4cG9uZW50aWFsIGZ1bmN0aW9uXG4gKiBzdG9wcy5cbiAqIEhvdyBpdCB3b3JrczogVHdvIGNvbnNlY3V0aXZlIHN0b3AgdmFsdWVzIGRlZmluZSBhIChzY2FsZWQgYW5kIHNoaWZ0ZWQpIGV4cG9uZW50aWFsIGZ1bmN0aW9uIGBmKHgpID0gYSAqIGJhc2VeeCArIGJgLCB3aGVyZSBgYmFzZWAgaXMgdGhlIHVzZXItc3BlY2lmaWVkIGJhc2UsXG4gKiBhbmQgYGFgIGFuZCBgYmAgYXJlIGNvbnN0YW50cyBhZmZvcmRpbmcgc3VmZmljaWVudCBkZWdyZWVzIG9mIGZyZWVkb20gdG8gZml0XG4gKiB0aGUgZnVuY3Rpb24gdG8gdGhlIGdpdmVuIHN0b3BzLlxuICpcbiAqIEhlcmUncyBhIGJpdCBvZiBhbGdlYnJhIHRoYXQgbGV0cyB1cyBjb21wdXRlIGBmKHgpYCBkaXJlY3RseSBmcm9tIHRoZSBzdG9wXG4gKiB2YWx1ZXMgd2l0aG91dCBleHBsaWNpdGx5IHNvbHZpbmcgZm9yIGBhYCBhbmQgYGJgOlxuICpcbiAqIEZpcnN0IHN0b3AgdmFsdWU6IGBmKHgwKSA9IHkwID0gYSAqIGJhc2VeeDAgKyBiYFxuICogU2Vjb25kIHN0b3AgdmFsdWU6IGBmKHgxKSA9IHkxID0gYSAqIGJhc2VeeDEgKyBiYFxuICogPT4gYHkxIC0geTAgPSBhKGJhc2VeeDEgLSBiYXNlXngwKWBcbiAqID0+IGBhID0gKHkxIC0geTApLyhiYXNlXngxIC0gYmFzZV54MClgXG4gKlxuICogRGVzaXJlZCB2YWx1ZTogYGYoeCkgPSB5ID0gYSAqIGJhc2VeeCArIGJgXG4gKiA9PiBgZih4KSA9IHkwICsgYSAqIChiYXNlXnggLSBiYXNlXngwKWBcbiAqXG4gKiBGcm9tIHRoZSBhYm92ZSwgd2UgY2FuIHJlcGxhY2UgdGhlIGBhYCBpbiBgYSAqIChiYXNlXnggLSBiYXNlXngwKWAgYW5kIGRvIGFcbiAqIGxpdHRsZSBhbGdlYnJhOlxuICogYGBgXG4gKiBhICogKGJhc2VeeCAtIGJhc2VeeDApID0gKHkxIC0geTApLyhiYXNlXngxIC0gYmFzZV54MCkgKiAoYmFzZV54IC0gYmFzZV54MClcbiAqICAgICAgICAgICAgICAgICAgICAgPSAoeTEgLSB5MCkgKiAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSAtIGJhc2VeeDApXG4gKiBgYGBcbiAqXG4gKiBJZiB3ZSBsZXQgYChiYXNlXnggLSBiYXNlXngwKSAvIChiYXNlXngxIGJhc2VeeDApYCwgdGhlbiB3ZSBoYXZlXG4gKiBgZih4KSA9IHkwICsgKHkxIC0geTApICogcmF0aW9gLiAgSW4gb3RoZXIgd29yZHMsIGByYXRpb2AgbWF5IGJlIHRyZWF0ZWQgYXNcbiAqIGFuIGludGVycG9sYXRpb24gZmFjdG9yIGJldHdlZW4gdGhlIHR3byBzdG9wcycgb3V0cHV0IHZhbHVlcy5cbiAqXG4gKiAoTm90ZTogYSBzbGlnaHRseSBkaWZmZXJlbnQgZm9ybSBmb3IgYHJhdGlvYCxcbiAqIGAoYmFzZV4oeC14MCkgLSAxKSAvIChiYXNlXih4MS14MCkgLSAxKSBgLCBpcyBlcXVpdmFsZW50LCBidXQgcmVxdWlyZXMgZmV3ZXJcbiAqIGV4cGVuc2l2ZSBgTWF0aC5wb3coKWAgb3BlcmF0aW9ucy4pXG4gKlxuICogQHByaXZhdGVcbiovXG5mdW5jdGlvbiBleHBvbmVudGlhbEludGVycG9sYXRpb24oaW5wdXQsIGJhc2UsIGxvd2VyVmFsdWUsIHVwcGVyVmFsdWUpIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gdXBwZXJWYWx1ZSAtIGxvd2VyVmFsdWU7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBpbnB1dCAtIGxvd2VyVmFsdWU7XG5cbiAgICBpZiAoZGlmZmVyZW5jZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzIC8gZGlmZmVyZW5jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKE1hdGgucG93KGJhc2UsIHByb2dyZXNzKSAtIDEpIC8gKE1hdGgucG93KGJhc2UsIGRpZmZlcmVuY2UpIC0gMSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcnBvbGF0ZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHtjaGVja1N1YnR5cGUsIFZhbHVlVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jbGFzcyBDb2FsZXNjZSBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgYXJnczogQXJyYXk8RXhwcmVzc2lvbj47XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBhcmdzOiBBcnJheTxFeHByZXNzaW9uPikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0NvYWxlc2NlIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoXCJFeHBlY3RlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiBUeXBlID0gKG51bGw6IGFueSk7XG4gICAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICBpZiAoZXhwZWN0ZWRUeXBlICYmIGV4cGVjdGVkVHlwZS5raW5kICE9PSAndmFsdWUnKSB7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzLnNsaWNlKDEpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBjb250ZXh0LnBhcnNlKGFyZywgMSArIHBhcnNlZEFyZ3MubGVuZ3RoLCBvdXRwdXRUeXBlLCB1bmRlZmluZWQsIHt0eXBlQW5ub3RhdGlvbjogJ29taXQnfSk7XG4gICAgICAgICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBvdXRwdXRUeXBlID0gb3V0cHV0VHlwZSB8fCBwYXJzZWQudHlwZTtcbiAgICAgICAgICAgIHBhcnNlZEFyZ3MucHVzaChwYXJzZWQpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChvdXRwdXRUeXBlKTtcblxuICAgICAgICAvLyBBYm92ZSwgd2UgcGFyc2UgYXJndW1lbnRzIHdpdGhvdXQgaW5mZXJyZWQgdHlwZSBhbm5vdGF0aW9uIHNvIHRoYXRcbiAgICAgICAgLy8gdGhleSBkb24ndCBwcm9kdWNlIGEgcnVudGltZSBlcnJvciBmb3IgYG51bGxgIGlucHV0LCB3aGljaCB3b3VsZFxuICAgICAgICAvLyBwcmVlbXB0IHRoZSBkZXNpcmVkIG51bGwtY29hbGVzY2luZyBiZWhhdmlvci5cbiAgICAgICAgLy8gVGh1cywgaWYgYW55IG9mIG91ciBhcmd1bWVudHMgd291bGQgaGF2ZSBuZWVkZWQgYW4gYW5ub3RhdGlvbiwgd2VcbiAgICAgICAgLy8gbmVlZCB0byB3cmFwIHRoZSBlbmNsb3NpbmcgY29hbGVzY2UgZXhwcmVzc2lvbiB3aXRoIGl0IGluc3RlYWQuXG4gICAgICAgIGNvbnN0IG5lZWRzQW5ub3RhdGlvbiA9IGV4cGVjdGVkVHlwZSAmJlxuICAgICAgICAgICAgcGFyc2VkQXJncy5zb21lKGFyZyA9PiBjaGVja1N1YnR5cGUoZXhwZWN0ZWRUeXBlLCBhcmcudHlwZSkpO1xuXG4gICAgICAgIHJldHVybiBuZWVkc0Fubm90YXRpb24gP1xuICAgICAgICAgICAgbmV3IENvYWxlc2NlKFZhbHVlVHlwZSwgcGFyc2VkQXJncykgOlxuICAgICAgICAgICAgbmV3IENvYWxlc2NlKChvdXRwdXRUeXBlOiBhbnkpLCBwYXJzZWRBcmdzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KTogYW55IHwgbnVsbCB7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBsZXQgYXJnQ291bnQgPSAwO1xuICAgICAgICBsZXQgZmlyc3RJbWFnZTtcbiAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICBhcmdDb3VudCsrO1xuICAgICAgICAgICAgcmVzdWx0ID0gYXJnLmV2YWx1YXRlKGN0eCk7XG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGZpcnN0IHJlcXVlc3RlZCBpbWFnZSBpbiBhIGNvYWxlc2NlIHN0YXRlbWVudFxuICAgICAgICAgICAgLy8gaWYgY29hbGVzY2UgY2FuJ3QgZmluZCBhIHZhbGlkIGltYWdlLCB3ZSByZXR1cm4gdGhlIGZpcnN0IGltYWdlIHNvIHN0eWxlaW1hZ2VtaXNzaW5nIGNhbiBmaXJlXG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCBpbnN0YW5jZW9mIFJlc29sdmVkSW1hZ2UgJiYgIXJlc3VsdC5hdmFpbGFibGUpIHtcbiAgICAgICAgICAgICAgICAvLyBzZXQgdG8gZmlyc3QgaW1hZ2VcbiAgICAgICAgICAgICAgICBpZiAoIWZpcnN0SW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RJbWFnZSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSByZWFjaCB0aGUgZW5kLCByZXR1cm4gdGhlIGZpcnN0IGltYWdlXG4gICAgICAgICAgICAgICAgaWYgKGFyZ0NvdW50ID09PSB0aGlzLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdEltYWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMuYXJncy5mb3JFYWNoKGZuKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcmdzLmV2ZXJ5KGFyZyA9PiBhcmcub3V0cHV0RGVmaW5lZCgpKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU2VyaWFsaXplZEV4cHJlc3Npb24ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wiY29hbGVzY2VcIl07XG4gICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29hbGVzY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb24sIFNlcmlhbGl6ZWRFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCAgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcblxuY2xhc3MgTGV0IGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBiaW5kaW5nczogQXJyYXk8W3N0cmluZywgRXhwcmVzc2lvbl0+O1xuICAgIHJlc3VsdDogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4sIHJlc3VsdDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSByZXN1bHQudHlwZTtcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IFtdLmNvbmNhdChiaW5kaW5ncyk7XG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQuZXZhbHVhdGUoY3R4KTtcbiAgICB9XG5cbiAgICBlYWNoQ2hpbGQoZm46IChfOiBFeHByZXNzaW9uKSA9PiB2b2lkKSB7XG4gICAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiB0aGlzLmJpbmRpbmdzKSB7XG4gICAgICAgICAgICBmbihiaW5kaW5nWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBmbih0aGlzLnJlc3VsdCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/TGV0IHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIGNvbnN0IGJpbmRpbmdzOiBBcnJheTxbc3RyaW5nLCBFeHByZXNzaW9uXT4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IGFyZ3NbaV07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgc3RyaW5nLCBidXQgZm91bmQgJHt0eXBlb2YgbmFtZX0gaW5zdGVhZC5gLCBpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKC9bXmEtekEtWjAtOV9dLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYFZhcmlhYmxlIG5hbWVzIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yICdfJy5gLCBpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaSArIDFdLCBpICsgMSk7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgYmluZGluZ3MucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UoYXJnc1thcmdzLmxlbmd0aCAtIDFdLCBhcmdzLmxlbmd0aCAtIDEsIGNvbnRleHQuZXhwZWN0ZWRUeXBlLCBiaW5kaW5ncyk7XG4gICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gbmV3IExldChiaW5kaW5ncywgcmVzdWx0KTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHQub3V0cHV0RGVmaW5lZCgpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemVkRXhwcmVzc2lvbiB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJsZXRcIl07XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIGV4cHJdIG9mIHRoaXMuYmluZGluZ3MpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChuYW1lLCBleHByLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5yZXN1bHQuc2VyaWFsaXplKCkpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExldDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7YXJyYXksIFZhbHVlVHlwZSwgTnVtYmVyVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZSwgQXJyYXlUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VmFsdWV9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmNsYXNzIEF0IGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBpbmRleDogRXhwcmVzc2lvbjtcbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGU6IFR5cGUsIGluZGV4OiBFeHByZXNzaW9uLCBpbnB1dDogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9BdCB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCAyIGFyZ3VtZW50cywgYnV0IGZvdW5kICR7YXJncy5sZW5ndGggLSAxfSBpbnN0ZWFkLmApO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBOdW1iZXJUeXBlKTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMl0sIDIsIGFycmF5KGNvbnRleHQuZXhwZWN0ZWRUeXBlIHx8IFZhbHVlVHlwZSkpO1xuXG4gICAgICAgIGlmICghaW5kZXggfHwgIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB0OiBBcnJheVR5cGUgPSAoaW5wdXQudHlwZTogYW55KTtcbiAgICAgICAgcmV0dXJuIG5ldyBBdCh0Lml0ZW1UeXBlLCBpbmRleCwgaW5wdXQpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpOiBWYWx1ZSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKCh0aGlzLmluZGV4LmV2YWx1YXRlKGN0eCk6IGFueSk6IG51bWJlcik7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gKCh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk6IEFycmF5PFZhbHVlPik7XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kczogJHtpbmRleH0gPCAwLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4ID49IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQXJyYXkgaW5kZXggb3V0IG9mIGJvdW5kczogJHtpbmRleH0gPiAke2FycmF5Lmxlbmd0aCAtIDF9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4ICE9PSBNYXRoLmZsb29yKGluZGV4KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgQXJyYXkgaW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyLCBidXQgZm91bmQgJHtpbmRleH0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnJheVtpbmRleF07XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmluZGV4KTtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemVkRXhwcmVzc2lvbiB7XG4gICAgICAgIHJldHVybiBbXCJhdFwiLCB0aGlzLmluZGV4LnNlcmlhbGl6ZSgpLCB0aGlzLmlucHV0LnNlcmlhbGl6ZSgpXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEF0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtCb29sZWFuVHlwZSwgU3RyaW5nVHlwZSwgVmFsdWVUeXBlLCBOdWxsVHlwZSwgdG9TdHJpbmcsIE51bWJlclR5cGUsIGlzVmFsaWRUeXBlLCBpc1ZhbGlkTmF0aXZlVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jbGFzcyBJbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbmVlZGxlOiBFeHByZXNzaW9uO1xuICAgIGhheXN0YWNrOiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IobmVlZGxlOiBFeHByZXNzaW9uLCBoYXlzdGFjazogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBCb29sZWFuVHlwZTtcbiAgICAgICAgdGhpcy5uZWVkbGUgPSBuZWVkbGU7XG4gICAgICAgIHRoaXMuaGF5c3RhY2sgPSBoYXlzdGFjaztcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9JbiB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIDIgYXJndW1lbnRzLCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZWVkbGUgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG5cbiAgICAgICAgY29uc3QgaGF5c3RhY2sgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMl0sIDIsIFZhbHVlVHlwZSk7XG5cbiAgICAgICAgaWYgKCFuZWVkbGUgfHwgIWhheXN0YWNrKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIWlzVmFsaWRUeXBlKG5lZWRsZS50eXBlLCBbQm9vbGVhblR5cGUsIFN0cmluZ1R5cGUsIE51bWJlclR5cGUsIE51bGxUeXBlLCBWYWx1ZVR5cGVdKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYm9vbGVhbiwgc3RyaW5nLCBudW1iZXIgb3IgbnVsbCwgYnV0IGZvdW5kICR7dG9TdHJpbmcobmVlZGxlLnR5cGUpfSBpbnN0ZWFkYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEluKG5lZWRsZSwgaGF5c3RhY2spO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbmVlZGxlID0gKHRoaXMubmVlZGxlLmV2YWx1YXRlKGN0eCk6IGFueSk7XG4gICAgICAgIGNvbnN0IGhheXN0YWNrID0gKHRoaXMuaGF5c3RhY2suZXZhbHVhdGUoY3R4KTogYW55KTtcblxuICAgICAgICBpZiAoaGF5c3RhY2sgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICghaXNWYWxpZE5hdGl2ZVR5cGUobmVlZGxlLCBbJ2Jvb2xlYW4nLCAnc3RyaW5nJywgJ251bWJlcicsICdudWxsJ10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyIG9yIG51bGwsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZihuZWVkbGUpKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNWYWxpZE5hdGl2ZVR5cGUoaGF5c3RhY2ssIFsnc3RyaW5nJywgJ2FycmF5J10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBzZWNvbmQgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZihoYXlzdGFjaykpfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluZGV4T2YobmVlZGxlKSA+PSAwO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5uZWVkbGUpO1xuICAgICAgICBmbih0aGlzLmhheXN0YWNrKTtcbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU2VyaWFsaXplZEV4cHJlc3Npb24ge1xuICAgICAgICByZXR1cm4gW1wiaW5cIiwgdGhpcy5uZWVkbGUuc2VyaWFsaXplKCksIHRoaXMuaGF5c3RhY2suc2VyaWFsaXplKCldO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW47XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0Jvb2xlYW5UeXBlLCBTdHJpbmdUeXBlLCBWYWx1ZVR5cGUsIE51bGxUeXBlLCB0b1N0cmluZywgTnVtYmVyVHlwZSwgaXNWYWxpZFR5cGUsIGlzVmFsaWROYXRpdmVUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9uLCBTZXJpYWxpemVkRXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYXJzaW5nQ29udGV4dCBmcm9tICcuLi9wYXJzaW5nX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmNsYXNzIEluZGV4T2YgaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIG5lZWRsZTogRXhwcmVzc2lvbjtcbiAgICBoYXlzdGFjazogRXhwcmVzc2lvbjtcbiAgICBmcm9tSW5kZXg6ID9FeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IobmVlZGxlOiBFeHByZXNzaW9uLCBoYXlzdGFjazogRXhwcmVzc2lvbiwgZnJvbUluZGV4PzogRXhwcmVzc2lvbikge1xuICAgICAgICB0aGlzLnR5cGUgPSBOdW1iZXJUeXBlO1xuICAgICAgICB0aGlzLm5lZWRsZSA9IG5lZWRsZTtcbiAgICAgICAgdGhpcy5oYXlzdGFjayA9IGhheXN0YWNrO1xuICAgICAgICB0aGlzLmZyb21JbmRleCA9IGZyb21JbmRleDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9JbmRleE9mIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDIgfHwgIGFyZ3MubGVuZ3RoID49IDUpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCAzIG9yIDQgYXJndW1lbnRzLCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZWVkbGUgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEsIFZhbHVlVHlwZSk7XG5cbiAgICAgICAgY29uc3QgaGF5c3RhY2sgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMl0sIDIsIFZhbHVlVHlwZSk7XG5cbiAgICAgICAgaWYgKCFuZWVkbGUgfHwgIWhheXN0YWNrKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFpc1ZhbGlkVHlwZShuZWVkbGUudHlwZSwgW0Jvb2xlYW5UeXBlLCBTdHJpbmdUeXBlLCBOdW1iZXJUeXBlLCBOdWxsVHlwZSwgVmFsdWVUeXBlXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBmaXJzdCBhcmd1bWVudCB0byBiZSBvZiB0eXBlIGJvb2xlYW4sIHN0cmluZywgbnVtYmVyIG9yIG51bGwsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKG5lZWRsZS50eXBlKX0gaW5zdGVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tSW5kZXggPSBjb250ZXh0LnBhcnNlKGFyZ3NbM10sIDMsIE51bWJlclR5cGUpO1xuICAgICAgICAgICAgaWYgKCFmcm9tSW5kZXgpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleE9mKG5lZWRsZSwgaGF5c3RhY2ssIGZyb21JbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4T2YobmVlZGxlLCBoYXlzdGFjayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KTogYW55IHtcbiAgICAgICAgY29uc3QgbmVlZGxlID0gKHRoaXMubmVlZGxlLmV2YWx1YXRlKGN0eCk6IGFueSk7XG4gICAgICAgIGNvbnN0IGhheXN0YWNrID0gKHRoaXMuaGF5c3RhY2suZXZhbHVhdGUoY3R4KTogYW55KTtcblxuICAgICAgICBpZiAoIWlzVmFsaWROYXRpdmVUeXBlKG5lZWRsZSwgWydib29sZWFuJywgJ3N0cmluZycsICdudW1iZXInLCAnbnVsbCddKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBib29sZWFuLCBzdHJpbmcsIG51bWJlciBvciBudWxsLCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YobmVlZGxlKSl9IGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWROYXRpdmVUeXBlKGhheXN0YWNrLCBbJ3N0cmluZycsICdhcnJheSddKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YoaGF5c3RhY2spKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZyb21JbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gKHRoaXMuZnJvbUluZGV4LmV2YWx1YXRlKGN0eCk6IG51bWJlcik7XG4gICAgICAgICAgICByZXR1cm4gaGF5c3RhY2suaW5kZXhPZihuZWVkbGUsIGZyb21JbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGF5c3RhY2suaW5kZXhPZihuZWVkbGUpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5uZWVkbGUpO1xuICAgICAgICBmbih0aGlzLmhheXN0YWNrKTtcbiAgICAgICAgaWYgKHRoaXMuZnJvbUluZGV4KSB7XG4gICAgICAgICAgICBmbih0aGlzLmZyb21JbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IFNlcmlhbGl6ZWRFeHByZXNzaW9uIHtcbiAgICAgICAgaWYgKHRoaXMuZnJvbUluZGV4ICE9IG51bGwgJiYgdGhpcy5mcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gdGhpcy5mcm9tSW5kZXguc2VyaWFsaXplKCk7XG4gICAgICAgICAgICByZXR1cm4gW1wiaW5kZXgtb2ZcIiwgdGhpcy5uZWVkbGUuc2VyaWFsaXplKCksIHRoaXMuaGF5c3RhY2suc2VyaWFsaXplKCksIGZyb21JbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcImluZGV4LW9mXCIsIHRoaXMubmVlZGxlLnNlcmlhbGl6ZSgpLCB0aGlzLmhheXN0YWNrLnNlcmlhbGl6ZSgpXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEluZGV4T2Y7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuaW1wb3J0IHtWYWx1ZVR5cGUsIHR5cGUgVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5cbi8vIE1hcCBpbnB1dCBsYWJlbCB2YWx1ZXMgdG8gb3V0cHV0IGV4cHJlc3Npb24gaW5kZXhcbnR5cGUgQ2FzZXMgPSB7W251bWJlciB8IHN0cmluZ106IG51bWJlcn07XG5cbmNsYXNzIE1hdGNoIGltcGxlbWVudHMgRXhwcmVzc2lvbiB7XG4gICAgdHlwZTogVHlwZTtcbiAgICBpbnB1dFR5cGU6IFR5cGU7XG5cbiAgICBpbnB1dDogRXhwcmVzc2lvbjtcbiAgICBjYXNlczogQ2FzZXM7XG4gICAgb3V0cHV0czogQXJyYXk8RXhwcmVzc2lvbj47XG4gICAgb3RoZXJ3aXNlOiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXRUeXBlOiBUeXBlLCBvdXRwdXRUeXBlOiBUeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgY2FzZXM6IENhc2VzLCBvdXRwdXRzOiBBcnJheTxFeHByZXNzaW9uPiwgb3RoZXJ3aXNlOiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMuaW5wdXRUeXBlID0gaW5wdXRUeXBlO1xuICAgICAgICB0aGlzLnR5cGUgPSBvdXRwdXRUeXBlO1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuY2FzZXMgPSBjYXNlcztcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gb3V0cHV0cztcbiAgICAgICAgdGhpcy5vdGhlcndpc2UgPSBvdGhlcndpc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/TWF0Y2gge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCA1KVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLCBidXQgZm91bmQgb25seSAke2FyZ3MubGVuZ3RoIC0gMX0uYCk7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAlIDIgIT09IDEpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dC5lcnJvcihgRXhwZWN0ZWQgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuXG4gICAgICAgIGxldCBpbnB1dFR5cGU7XG4gICAgICAgIGxldCBvdXRwdXRUeXBlO1xuICAgICAgICBpZiAoY29udGV4dC5leHBlY3RlZFR5cGUgJiYgY29udGV4dC5leHBlY3RlZFR5cGUua2luZCAhPT0gJ3ZhbHVlJykge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IGNvbnRleHQuZXhwZWN0ZWRUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhc2VzID0ge307XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgbGV0IGxhYmVscyA9IGFyZ3NbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ3NbaSArIDFdO1xuXG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGFiZWxzKSkge1xuICAgICAgICAgICAgICAgIGxhYmVscyA9IFtsYWJlbHNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsYWJlbENvbnRleHQgPSBjb250ZXh0LmNvbmNhdChpKTtcbiAgICAgICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcignRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGJyYW5jaCBsYWJlbC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiBsYWJlbHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxhYmVsICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgbGFiZWwgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoYEJyYW5jaCBsYWJlbHMgbXVzdCBiZSBudW1iZXJzIG9yIHN0cmluZ3MuYCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGFiZWwgPT09ICdudW1iZXInICYmIE1hdGguYWJzKGxhYmVsKSA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbENvbnRleHQuZXJyb3IoYEJyYW5jaCBsYWJlbHMgbXVzdCBiZSBpbnRlZ2VycyBubyBsYXJnZXIgdGhhbiAke051bWJlci5NQVhfU0FGRV9JTlRFR0VSfS5gKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxhYmVsID09PSAnbnVtYmVyJyAmJiBNYXRoLmZsb29yKGxhYmVsKSAhPT0gbGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGV4dC5lcnJvcihgTnVtZXJpYyBicmFuY2ggbGFiZWxzIG11c3QgYmUgaW50ZWdlciB2YWx1ZXMuYCk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpbnB1dFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRUeXBlID0gdHlwZU9mKGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsQ29udGV4dC5jaGVja1N1YnR5cGUoaW5wdXRUeXBlLCB0eXBlT2YobGFiZWwpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhc2VzW1N0cmluZyhsYWJlbCldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxDb250ZXh0LmVycm9yKCdCcmFuY2ggbGFiZWxzIG11c3QgYmUgdW5pcXVlLicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNhc2VzW1N0cmluZyhsYWJlbCldID0gb3V0cHV0cy5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UodmFsdWUsIGksIG91dHB1dFR5cGUpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IG91dHB1dFR5cGUgfHwgcmVzdWx0LnR5cGU7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBvdGhlcndpc2UgPSBjb250ZXh0LnBhcnNlKGFyZ3NbYXJncy5sZW5ndGggLSAxXSwgYXJncy5sZW5ndGggLSAxLCBvdXRwdXRUeXBlKTtcbiAgICAgICAgaWYgKCFvdGhlcndpc2UpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGFzc2VydChpbnB1dFR5cGUgJiYgb3V0cHV0VHlwZSk7XG5cbiAgICAgICAgaWYgKGlucHV0LnR5cGUua2luZCAhPT0gJ3ZhbHVlJyAmJiBjb250ZXh0LmNvbmNhdCgxKS5jaGVja1N1YnR5cGUoKGlucHV0VHlwZTogYW55KSwgaW5wdXQudHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNYXRjaCgoaW5wdXRUeXBlOiBhbnkpLCAob3V0cHV0VHlwZTogYW55KSwgaW5wdXQsIGNhc2VzLCBvdXRwdXRzLCBvdGhlcndpc2UpO1xuICAgIH1cblxuICAgIGV2YWx1YXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQpOiBhbnkge1xuICAgICAgICBjb25zdCBpbnB1dCA9ICh0aGlzLmlucHV0LmV2YWx1YXRlKGN0eCk6IGFueSk7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9ICh0eXBlT2YoaW5wdXQpID09PSB0aGlzLmlucHV0VHlwZSAmJiB0aGlzLm91dHB1dHNbdGhpcy5jYXNlc1tpbnB1dF1dKSB8fCB0aGlzLm90aGVyd2lzZTtcbiAgICAgICAgcmV0dXJuIG91dHB1dC5ldmFsdWF0ZShjdHgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgICAgIHRoaXMub3V0cHV0cy5mb3JFYWNoKGZuKTtcbiAgICAgICAgZm4odGhpcy5vdGhlcndpc2UpO1xuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm91dHB1dHMuZXZlcnkob3V0ID0+IG91dC5vdXRwdXREZWZpbmVkKCkpICYmIHRoaXMub3RoZXJ3aXNlLm91dHB1dERlZmluZWQoKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU2VyaWFsaXplZEV4cHJlc3Npb24ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gW1wibWF0Y2hcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKV07XG5cbiAgICAgICAgLy8gU29ydCBzbyBzZXJpYWxpemF0aW9uIGhhcyBhbiBhcmJpdHJhcnkgZGVmaW5lZCBvcmRlciwgZXZlbiB0aG91Z2hcbiAgICAgICAgLy8gYnJhbmNoIG9yZGVyIGRvZXNuJ3QgYWZmZWN0IGV2YWx1YXRpb25cbiAgICAgICAgY29uc3Qgc29ydGVkTGFiZWxzID0gT2JqZWN0LmtleXModGhpcy5jYXNlcykuc29ydCgpO1xuXG4gICAgICAgIC8vIEdyb3VwIGJyYW5jaGVzIGJ5IHVuaXF1ZSBtYXRjaCBleHByZXNzaW9uIHRvIHN1cHBvcnQgY29uZGVuc2VkXG4gICAgICAgIC8vIHNlcmlhbGl6YXRpb25zIG9mIHRoZSBmb3JtIFtjYXNlMSwgY2FzZTIsIC4uLl0gLT4gbWF0Y2hFeHByZXNzaW9uXG4gICAgICAgIGNvbnN0IGdyb3VwZWRCeU91dHB1dDogQXJyYXk8W251bWJlciwgQXJyYXk8bnVtYmVyIHwgc3RyaW5nPl0+ID0gW107XG4gICAgICAgIGNvbnN0IG91dHB1dExvb2t1cDoge1tpbmRleDogbnVtYmVyXTogbnVtYmVyfSA9IHt9OyAvLyBsb29rdXAgaW5kZXggaW50byBncm91cGVkQnlPdXRwdXQgZm9yIGEgZ2l2ZW4gb3V0cHV0IGV4cHJlc3Npb25cbiAgICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiBzb3J0ZWRMYWJlbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gb3V0cHV0TG9va3VwW3RoaXMuY2FzZXNbbGFiZWxdXTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBzZWVpbmcgdGhpcyBvdXRwdXQsIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBncm91cGVkIGxpc3RcbiAgICAgICAgICAgICAgICBvdXRwdXRMb29rdXBbdGhpcy5jYXNlc1tsYWJlbF1dID0gZ3JvdXBlZEJ5T3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBncm91cGVkQnlPdXRwdXQucHVzaChbdGhpcy5jYXNlc1tsYWJlbF0sIFtsYWJlbF1dKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UndmUgc2VlbiB0aGlzIGV4cHJlc3Npb24gYmVmb3JlLCBhZGQgdGhlIGxhYmVsIHRvIHRoYXQgb3V0cHV0J3MgZ3JvdXBcbiAgICAgICAgICAgICAgICBncm91cGVkQnlPdXRwdXRbb3V0cHV0SW5kZXhdWzFdLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29lcmNlTGFiZWwgPSAobGFiZWwpID0+IHRoaXMuaW5wdXRUeXBlLmtpbmQgPT09ICdudW1iZXInID8gTnVtYmVyKGxhYmVsKSA6IGxhYmVsO1xuXG4gICAgICAgIGZvciAoY29uc3QgW291dHB1dEluZGV4LCBsYWJlbHNdIG9mIGdyb3VwZWRCeU91dHB1dCkge1xuICAgICAgICAgICAgaWYgKGxhYmVscy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGEgc2luZ2xlIGxhYmVsIG1hdGNoZXMgdGhpcyBvdXRwdXQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChjb2VyY2VMYWJlbChsYWJlbHNbMF0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQXJyYXkgb2YgbGl0ZXJhbCBsYWJlbHMgcG9pbnRpbmcgdG8gdGhpcyBvdXRwdXQgZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChsYWJlbHMubWFwKGNvZXJjZUxhYmVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJpYWxpemVkLnB1c2godGhpcy5vdXRwdXRzW291dHB1dEluZGV4XS5zZXJpYWxpemUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VyaWFsaXplZC5wdXNoKHRoaXMub3RoZXJ3aXNlLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYXRjaDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHtCb29sZWFuVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG50eXBlIEJyYW5jaGVzID0gQXJyYXk8W0V4cHJlc3Npb24sIEV4cHJlc3Npb25dPjtcblxuY2xhc3MgQ2FzZSBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG5cbiAgICBicmFuY2hlczogQnJhbmNoZXM7XG4gICAgb3RoZXJ3aXNlOiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZSwgYnJhbmNoZXM6IEJyYW5jaGVzLCBvdGhlcndpc2U6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5icmFuY2hlcyA9IGJyYW5jaGVzO1xuICAgICAgICB0aGlzLm90aGVyd2lzZSA9IG90aGVyd2lzZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoYXJnczogJFJlYWRPbmx5QXJyYXk8bWl4ZWQ+LCBjb250ZXh0OiBQYXJzaW5nQ29udGV4dCk6ID9DYXNlIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgNClcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cywgYnV0IGZvdW5kIG9ubHkgJHthcmdzLmxlbmd0aCAtIDF9LmApO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFuIG9kZCBudW1iZXIgb2YgYXJndW1lbnRzLmApO1xuXG4gICAgICAgIGxldCBvdXRwdXRUeXBlOiA/VHlwZTtcbiAgICAgICAgaWYgKGNvbnRleHQuZXhwZWN0ZWRUeXBlICYmIGNvbnRleHQuZXhwZWN0ZWRUeXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBjb250ZXh0LmV4cGVjdGVkVHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJyYW5jaGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3QgPSBjb250ZXh0LnBhcnNlKGFyZ3NbaV0sIGksIEJvb2xlYW5UeXBlKTtcbiAgICAgICAgICAgIGlmICghdGVzdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQucGFyc2UoYXJnc1tpICsgMV0sIGkgKyAxLCBvdXRwdXRUeXBlKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgYnJhbmNoZXMucHVzaChbdGVzdCwgcmVzdWx0XSk7XG5cbiAgICAgICAgICAgIG91dHB1dFR5cGUgPSBvdXRwdXRUeXBlIHx8IHJlc3VsdC50eXBlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3RoZXJ3aXNlID0gY29udGV4dC5wYXJzZShhcmdzW2FyZ3MubGVuZ3RoIC0gMV0sIGFyZ3MubGVuZ3RoIC0gMSwgb3V0cHV0VHlwZSk7XG4gICAgICAgIGlmICghb3RoZXJ3aXNlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBhc3NlcnQob3V0cHV0VHlwZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZSgob3V0cHV0VHlwZTogYW55KSwgYnJhbmNoZXMsIG90aGVyd2lzZSk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCk6IGFueSB7XG4gICAgICAgIGZvciAoY29uc3QgW3Rlc3QsIGV4cHJlc3Npb25dIG9mIHRoaXMuYnJhbmNoZXMpIHtcbiAgICAgICAgICAgIGlmICh0ZXN0LmV2YWx1YXRlKGN0eCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm90aGVyd2lzZS5ldmFsdWF0ZShjdHgpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdGVzdCwgZXhwcmVzc2lvbl0gb2YgdGhpcy5icmFuY2hlcykge1xuICAgICAgICAgICAgZm4odGVzdCk7XG4gICAgICAgICAgICBmbihleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICBmbih0aGlzLm90aGVyd2lzZSk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoZXMuZXZlcnkoKFtfLCBvdXRdKSA9PiBvdXQub3V0cHV0RGVmaW5lZCgpKSAmJiB0aGlzLm90aGVyd2lzZS5vdXRwdXREZWZpbmVkKCk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IFNlcmlhbGl6ZWRFeHByZXNzaW9uIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtcImNhc2VcIl07XG4gICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FzZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7VmFsdWVUeXBlLCBOdW1iZXJUeXBlLCBTdHJpbmdUeXBlLCBhcnJheSwgdG9TdHJpbmcsIGlzVmFsaWRUeXBlLCBpc1ZhbGlkTmF0aXZlVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IFJ1bnRpbWVFcnJvciBmcm9tICcuLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCB7dHlwZU9mfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jbGFzcyBTbGljZSBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgaW5wdXQ6IEV4cHJlc3Npb247XG4gICAgYmVnaW5JbmRleDogRXhwcmVzc2lvbjtcbiAgICBlbmRJbmRleDogP0V4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCBpbnB1dDogRXhwcmVzc2lvbiwgYmVnaW5JbmRleDogRXhwcmVzc2lvbiwgZW5kSW5kZXg/OiBFeHByZXNzaW9uKSB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5iZWdpbkluZGV4ID0gYmVnaW5JbmRleDtcbiAgICAgICAgdGhpcy5lbmRJbmRleCA9IGVuZEluZGV4O1xuXG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/U2xpY2Uge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPD0gMiB8fCAgYXJncy5sZW5ndGggPj0gNSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIDMgb3IgNCBhcmd1bWVudHMsIGJ1dCBmb3VuZCAke2FyZ3MubGVuZ3RoIC0gMX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlucHV0ID0gY29udGV4dC5wYXJzZShhcmdzWzFdLCAxLCBWYWx1ZVR5cGUpO1xuICAgICAgICBjb25zdCBiZWdpbkluZGV4ID0gY29udGV4dC5wYXJzZShhcmdzWzJdLCAyLCBOdW1iZXJUeXBlKTtcblxuICAgICAgICBpZiAoIWlucHV0IHx8ICFiZWdpbkluZGV4KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIWlzVmFsaWRUeXBlKGlucHV0LnR5cGUsIFthcnJheShWYWx1ZVR5cGUpLCBTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGZpcnN0IGFyZ3VtZW50IHRvIGJlIG9mIHR5cGUgYXJyYXkgb3Igc3RyaW5nLCBidXQgZm91bmQgJHt0b1N0cmluZyhpbnB1dC50eXBlKX0gaW5zdGVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IGNvbnRleHQucGFyc2UoYXJnc1szXSwgMywgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICBpZiAoIWVuZEluZGV4KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2xpY2UoaW5wdXQudHlwZSwgaW5wdXQsIGJlZ2luSW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2xpY2UoaW5wdXQudHlwZSwgaW5wdXQsIGJlZ2luSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCk6IGFueSB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gKHRoaXMuaW5wdXQuZXZhbHVhdGUoY3R4KTogYW55KTtcbiAgICAgICAgY29uc3QgYmVnaW5JbmRleCA9ICh0aGlzLmJlZ2luSW5kZXguZXZhbHVhdGUoY3R4KTogbnVtYmVyKTtcblxuICAgICAgICBpZiAoIWlzVmFsaWROYXRpdmVUeXBlKGlucHV0LCBbJ3N0cmluZycsICdhcnJheSddKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihgRXhwZWN0ZWQgZmlyc3QgYXJndW1lbnQgdG8gYmUgb2YgdHlwZSBhcnJheSBvciBzdHJpbmcsIGJ1dCBmb3VuZCAke3RvU3RyaW5nKHR5cGVPZihpbnB1dCkpfSBpbnN0ZWFkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gKHRoaXMuZW5kSW5kZXguZXZhbHVhdGUoY3R4KTogbnVtYmVyKTtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dC5zbGljZShiZWdpbkluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5wdXQuc2xpY2UoYmVnaW5JbmRleCk7XG4gICAgfVxuXG4gICAgZWFjaENoaWxkKGZuOiAoXzogRXhwcmVzc2lvbikgPT4gdm9pZCkge1xuICAgICAgICBmbih0aGlzLmlucHV0KTtcbiAgICAgICAgZm4odGhpcy5iZWdpbkluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuZW5kSW5kZXgpIHtcbiAgICAgICAgICAgIGZuKHRoaXMuZW5kSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemVkRXhwcmVzc2lvbiB7XG4gICAgICAgIGlmICh0aGlzLmVuZEluZGV4ICE9IG51bGwgJiYgdGhpcy5lbmRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHRoaXMuZW5kSW5kZXguc2VyaWFsaXplKCk7XG4gICAgICAgICAgICByZXR1cm4gW1wic2xpY2VcIiwgdGhpcy5pbnB1dC5zZXJpYWxpemUoKSwgdGhpcy5iZWdpbkluZGV4LnNlcmlhbGl6ZSgpLCBlbmRJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcInNsaWNlXCIsIHRoaXMuaW5wdXQuc2VyaWFsaXplKCksIHRoaXMuYmVnaW5JbmRleC5zZXJpYWxpemUoKV07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTbGljZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7dG9TdHJpbmcsIFZhbHVlVHlwZSwgQm9vbGVhblR5cGUsIENvbGxhdG9yVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IEFzc2VydGlvbiBmcm9tICcuL2Fzc2VydGlvbi5qcyc7XG5pbXBvcnQge3R5cGVPZn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvci5qcyc7XG5cbmltcG9ydCB0eXBlIHtFeHByZXNzaW9uLCBTZXJpYWxpemVkRXhwcmVzc2lvbiwgRXhwcmVzc2lvblJlZ2lzdHJhdGlvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uQ29udGV4dCBmcm9tICcuLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtUeXBlfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbnR5cGUgQ29tcGFyaXNvbk9wZXJhdG9yID0gJz09JyB8ICchPScgfCAnPCcgfCAnPicgfCAnPD0nIHwgJz49JyA7XG5cbmZ1bmN0aW9uIGlzQ29tcGFyYWJsZVR5cGUob3A6IENvbXBhcmlzb25PcGVyYXRvciwgdHlwZTogVHlwZSkge1xuICAgIGlmIChvcCA9PT0gJz09JyB8fCBvcCA9PT0gJyE9Jykge1xuICAgICAgICAvLyBlcXVhbGl0eSBvcGVyYXRvclxuICAgICAgICByZXR1cm4gdHlwZS5raW5kID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ251bGwnIHx8XG4gICAgICAgICAgICB0eXBlLmtpbmQgPT09ICd2YWx1ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3JkZXJpbmcgb3BlcmF0b3JcbiAgICAgICAgcmV0dXJuIHR5cGUua2luZCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHR5cGUua2luZCA9PT0gJ3ZhbHVlJztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVxKGN0eDogRXZhbHVhdGlvbkNvbnRleHQsIGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7IHJldHVybiBhID09PSBiOyB9XG5mdW5jdGlvbiBuZXEoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCwgYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIGEgIT09IGI7IH1cbmZ1bmN0aW9uIGx0KGN0eDogRXZhbHVhdGlvbkNvbnRleHQsIGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7IHJldHVybiBhIDwgYjsgfVxuZnVuY3Rpb24gZ3QoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCwgYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIGEgPiBiOyB9XG5mdW5jdGlvbiBsdGVxKGN0eDogRXZhbHVhdGlvbkNvbnRleHQsIGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7IHJldHVybiBhIDw9IGI7IH1cbmZ1bmN0aW9uIGd0ZXEoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCwgYTogYW55LCBiOiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIGEgPj0gYjsgfVxuXG5mdW5jdGlvbiBlcUNvbGxhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCwgYTogYW55LCBiOiBhbnksIGM6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gYy5jb21wYXJlKGEsIGIpID09PSAwOyB9XG5mdW5jdGlvbiBuZXFDb2xsYXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQsIGE6IGFueSwgYjogYW55LCBjOiBhbnkpOiBib29sZWFuIHsgcmV0dXJuICFlcUNvbGxhdGUoY3R4LCBhLCBiLCBjKTsgfVxuZnVuY3Rpb24gbHRDb2xsYXRlKGN0eDogRXZhbHVhdGlvbkNvbnRleHQsIGE6IGFueSwgYjogYW55LCBjOiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIGMuY29tcGFyZShhLCBiKSA8IDA7IH1cbmZ1bmN0aW9uIGd0Q29sbGF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0LCBhOiBhbnksIGI6IGFueSwgYzogYW55KTogYm9vbGVhbiB7IHJldHVybiBjLmNvbXBhcmUoYSwgYikgPiAwOyB9XG5mdW5jdGlvbiBsdGVxQ29sbGF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0LCBhOiBhbnksIGI6IGFueSwgYzogYW55KTogYm9vbGVhbiB7IHJldHVybiBjLmNvbXBhcmUoYSwgYikgPD0gMDsgfVxuZnVuY3Rpb24gZ3RlcUNvbGxhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCwgYTogYW55LCBiOiBhbnksIGM6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gYy5jb21wYXJlKGEsIGIpID49IDA7IH1cblxuLyoqXG4gKiBTcGVjaWFsIGZvcm0gZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBpbXBsZW1lbnRpbmcgdGhlIHNpZ25hdHVyZXM6XG4gKiAtIChULCBULCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqIC0gKFQsIHZhbHVlLCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqIC0gKHZhbHVlLCBULCA/Q29sbGF0b3IpID0+IGJvb2xlYW5cbiAqXG4gKiBGb3IgaW5lcXVhbGl0aWVzLCBUIG11c3QgYmUgZWl0aGVyIHZhbHVlLCBzdHJpbmcsIG9yIG51bWJlci4gRm9yID09LyE9LCBpdFxuICogY2FuIGFsc28gYmUgYm9vbGVhbiBvciBudWxsLlxuICpcbiAqIEVxdWFsaXR5IHNlbWFudGljcyBhcmUgZXF1aXZhbGVudCB0byBKYXZhc2NyaXB0J3Mgc3RyaWN0IGVxdWFsaXR5ICg9PT0vIT09KVxuICogLS0gaS5lLiwgd2hlbiB0aGUgYXJndW1lbnRzJyB0eXBlcyBkb24ndCBtYXRjaCwgPT0gZXZhbHVhdGVzIHRvIGZhbHNlLCAhPSB0b1xuICogdHJ1ZS5cbiAqXG4gKiBXaGVuIHR5cGVzIGRvbid0IG1hdGNoIGluIGFuIG9yZGVyaW5nIGNvbXBhcmlzb24sIGEgcnVudGltZSBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZUNvbXBhcmlzb24ob3A6IENvbXBhcmlzb25PcGVyYXRvciwgY29tcGFyZUJhc2ljOiAoRXZhbHVhdGlvbkNvbnRleHQsIGFueSwgYW55KSA9PiBib29sZWFuLCBjb21wYXJlV2l0aENvbGxhdG9yOiAoRXZhbHVhdGlvbkNvbnRleHQsIGFueSwgYW55LCBhbnkpID0+IGJvb2xlYW4pOiBFeHByZXNzaW9uUmVnaXN0cmF0aW9uIHtcbiAgICBjb25zdCBpc09yZGVyQ29tcGFyaXNvbiA9IG9wICE9PSAnPT0nICYmIG9wICE9PSAnIT0nO1xuXG4gICAgcmV0dXJuIGNsYXNzIENvbXBhcmlzb24gaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICAgICAgdHlwZTogVHlwZTtcbiAgICAgICAgbGhzOiBFeHByZXNzaW9uO1xuICAgICAgICByaHM6IEV4cHJlc3Npb247XG4gICAgICAgIGNvbGxhdG9yOiA/RXhwcmVzc2lvbjtcbiAgICAgICAgaGFzVW50eXBlZEFyZ3VtZW50OiBib29sZWFuO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGxoczogRXhwcmVzc2lvbiwgcmhzOiBFeHByZXNzaW9uLCBjb2xsYXRvcjogP0V4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMudHlwZSA9IEJvb2xlYW5UeXBlO1xuICAgICAgICAgICAgdGhpcy5saHMgPSBsaHM7XG4gICAgICAgICAgICB0aGlzLnJocyA9IHJocztcbiAgICAgICAgICAgIHRoaXMuY29sbGF0b3IgPSBjb2xsYXRvcjtcbiAgICAgICAgICAgIHRoaXMuaGFzVW50eXBlZEFyZ3VtZW50ID0gbGhzLnR5cGUua2luZCA9PT0gJ3ZhbHVlJyB8fCByaHMudHlwZS5raW5kID09PSAndmFsdWUnO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT09IDMgJiYgYXJncy5sZW5ndGggIT09IDQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIHR3byBvciB0aHJlZSBhcmd1bWVudHMuYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9wOiBDb21wYXJpc29uT3BlcmF0b3IgPSAoYXJnc1swXTogYW55KTtcblxuICAgICAgICAgICAgbGV0IGxocyA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgVmFsdWVUeXBlKTtcbiAgICAgICAgICAgIGlmICghbGhzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGlmICghaXNDb21wYXJhYmxlVHlwZShvcCwgbGhzLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29uY2F0KDEpLmVycm9yKGBcIiR7b3B9XCIgY29tcGFyaXNvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHR5cGUgJyR7dG9TdHJpbmcobGhzLnR5cGUpfScuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmhzID0gY29udGV4dC5wYXJzZShhcmdzWzJdLCAyLCBWYWx1ZVR5cGUpO1xuICAgICAgICAgICAgaWYgKCFyaHMpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgaWYgKCFpc0NvbXBhcmFibGVUeXBlKG9wLCByaHMudHlwZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jb25jYXQoMikuZXJyb3IoYFwiJHtvcH1cIiBjb21wYXJpc29ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdHlwZSAnJHt0b1N0cmluZyhyaHMudHlwZSl9Jy5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGxocy50eXBlLmtpbmQgIT09IHJocy50eXBlLmtpbmQgJiZcbiAgICAgICAgICAgICAgICBsaHMudHlwZS5raW5kICE9PSAndmFsdWUnICYmXG4gICAgICAgICAgICAgICAgcmhzLnR5cGUua2luZCAhPT0gJ3ZhbHVlJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYENhbm5vdCBjb21wYXJlIHR5cGVzICcke3RvU3RyaW5nKGxocy50eXBlKX0nIGFuZCAnJHt0b1N0cmluZyhyaHMudHlwZSl9Jy5gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT3JkZXJDb21wYXJpc29uKSB7XG4gICAgICAgICAgICAgICAgLy8gdHlwaW5nIHJ1bGVzIHNwZWNpZmljIHRvIGxlc3MvZ3JlYXRlciB0aGFuIG9wZXJhdG9yc1xuICAgICAgICAgICAgICAgIGlmIChsaHMudHlwZS5raW5kID09PSAndmFsdWUnICYmIHJocy50eXBlLmtpbmQgIT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gKHZhbHVlLCBUKVxuICAgICAgICAgICAgICAgICAgICBsaHMgPSBuZXcgQXNzZXJ0aW9uKHJocy50eXBlLCBbbGhzXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaHMudHlwZS5raW5kICE9PSAndmFsdWUnICYmIHJocy50eXBlLmtpbmQgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gKFQsIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICByaHMgPSBuZXcgQXNzZXJ0aW9uKGxocy50eXBlLCBbcmhzXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY29sbGF0b3IgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBsaHMudHlwZS5raW5kICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICByaHMudHlwZS5raW5kICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICBsaHMudHlwZS5raW5kICE9PSAndmFsdWUnICYmXG4gICAgICAgICAgICAgICAgICAgIHJocy50eXBlLmtpbmQgIT09ICd2YWx1ZSdcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYENhbm5vdCB1c2UgY29sbGF0b3IgdG8gY29tcGFyZSBub24tc3RyaW5nIHR5cGVzLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2xsYXRvciA9IGNvbnRleHQucGFyc2UoYXJnc1szXSwgMywgQ29sbGF0b3JUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbGxhdG9yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYXJpc29uKGxocywgcmhzLCBjb2xsYXRvcik7XG4gICAgICAgIH1cblxuICAgICAgICBldmFsdWF0ZShjdHg6IEV2YWx1YXRpb25Db250ZXh0KTogYm9vbGVhbiB7XG4gICAgICAgICAgICBjb25zdCBsaHMgPSB0aGlzLmxocy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgY29uc3QgcmhzID0gdGhpcy5yaHMuZXZhbHVhdGUoY3R4KTtcblxuICAgICAgICAgICAgaWYgKGlzT3JkZXJDb21wYXJpc29uICYmIHRoaXMuaGFzVW50eXBlZEFyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbHQgPSB0eXBlT2YobGhzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBydCA9IHR5cGVPZihyaHMpO1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdHlwZSBpcyBzdHJpbmcgb3IgbnVtYmVyLCBhbmQgZXF1YWxcbiAgICAgICAgICAgICAgICBpZiAobHQua2luZCAhPT0gcnQua2luZCB8fCAhKGx0LmtpbmQgPT09ICdzdHJpbmcnIHx8IGx0LmtpbmQgPT09ICdudW1iZXInKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCBhcmd1bWVudHMgZm9yIFwiJHtvcH1cIiB0byBiZSAoc3RyaW5nLCBzdHJpbmcpIG9yIChudW1iZXIsIG51bWJlciksIGJ1dCBmb3VuZCAoJHtsdC5raW5kfSwgJHtydC5raW5kfSkgaW5zdGVhZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbGxhdG9yICYmICFpc09yZGVyQ29tcGFyaXNvbiAmJiB0aGlzLmhhc1VudHlwZWRBcmd1bWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGx0ID0gdHlwZU9mKGxocyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcnQgPSB0eXBlT2YocmhzKTtcbiAgICAgICAgICAgICAgICBpZiAobHQua2luZCAhPT0gJ3N0cmluZycgfHwgcnQua2luZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVCYXNpYyhjdHgsIGxocywgcmhzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbGxhdG9yID9cbiAgICAgICAgICAgICAgICBjb21wYXJlV2l0aENvbGxhdG9yKGN0eCwgbGhzLCByaHMsIHRoaXMuY29sbGF0b3IuZXZhbHVhdGUoY3R4KSkgOlxuICAgICAgICAgICAgICAgIGNvbXBhcmVCYXNpYyhjdHgsIGxocywgcmhzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubGhzKTtcbiAgICAgICAgICAgIGZuKHRoaXMucmhzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbGxhdG9yKSB7XG4gICAgICAgICAgICAgICAgZm4odGhpcy5jb2xsYXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXREZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBzZXJpYWxpemUoKTogU2VyaWFsaXplZEV4cHJlc3Npb24ge1xuICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IFtvcF07XG4gICAgICAgICAgICB0aGlzLmVhY2hDaGlsZChjaGlsZCA9PiB7IHNlcmlhbGl6ZWQucHVzaChjaGlsZC5zZXJpYWxpemUoKSk7IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgY29uc3QgRXF1YWxzOiAkQ2FsbDx0eXBlb2YgbWFrZUNvbXBhcmlzb24sICc9PScsIHR5cGVvZiBlcSwgdHlwZW9mIGVxQ29sbGF0ZT4gPSBtYWtlQ29tcGFyaXNvbignPT0nLCBlcSwgZXFDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBOb3RFcXVhbHM6ICRDYWxsPHR5cGVvZiBtYWtlQ29tcGFyaXNvbiwgJyE9JywgdHlwZW9mIG5lcSwgdHlwZW9mIG5lcUNvbGxhdGU+ID0gbWFrZUNvbXBhcmlzb24oJyE9JywgbmVxLCBuZXFDb2xsYXRlKTtcbmV4cG9ydCBjb25zdCBMZXNzVGhhbjogJENhbGw8dHlwZW9mIG1ha2VDb21wYXJpc29uLCAnPCcsIHR5cGVvZiBsdCwgdHlwZW9mIGx0Q29sbGF0ZT4gPSBtYWtlQ29tcGFyaXNvbignPCcsIGx0LCBsdENvbGxhdGUpO1xuZXhwb3J0IGNvbnN0IEdyZWF0ZXJUaGFuOiAkQ2FsbDx0eXBlb2YgbWFrZUNvbXBhcmlzb24sICc+JywgdHlwZW9mIGd0LCB0eXBlb2YgZ3RDb2xsYXRlPiA9IG1ha2VDb21wYXJpc29uKCc+JywgZ3QsIGd0Q29sbGF0ZSk7XG5leHBvcnQgY29uc3QgTGVzc1RoYW5PckVxdWFsOiAkQ2FsbDx0eXBlb2YgbWFrZUNvbXBhcmlzb24sICc8PScsIHR5cGVvZiBsdGVxLCB0eXBlb2YgbHRlcUNvbGxhdGU+ID0gbWFrZUNvbXBhcmlzb24oJzw9JywgbHRlcSwgbHRlcUNvbGxhdGUpO1xuZXhwb3J0IGNvbnN0IEdyZWF0ZXJUaGFuT3JFcXVhbDogJENhbGw8dHlwZW9mIG1ha2VDb21wYXJpc29uLCAnPj0nLCB0eXBlb2YgZ3RlcSwgdHlwZW9mIGd0ZXFDb2xsYXRlPiA9IG1ha2VDb21wYXJpc29uKCc+PScsIGd0ZXEsIGd0ZXFDb2xsYXRlKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7U3RyaW5nVHlwZSwgTnVtYmVyVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi4vZXZhbHVhdGlvbl9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIFBhcnNpbmdDb250ZXh0IGZyb20gJy4uL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5kZWNsYXJlIHZhciBJbnRsOiB7XG4gICAgTnVtYmVyRm9ybWF0OiBDbGFzczxJbnRsJE51bWJlckZvcm1hdD5cbn07XG5cbmRlY2xhcmUgY2xhc3MgSW50bCROdW1iZXJGb3JtYXQge1xuICAgIGNvbnN0cnVjdG9yIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogTnVtYmVyRm9ybWF0T3B0aW9uc1xuICAgICk6IEludGwkTnVtYmVyRm9ybWF0O1xuXG4gICAgc3RhdGljIChcbiAgICAgICAgbG9jYWxlcz86IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zPzogTnVtYmVyRm9ybWF0T3B0aW9uc1xuICAgICk6IEludGwkTnVtYmVyRm9ybWF0O1xuXG4gICAgZm9ybWF0KGE6IG51bWJlcik6IHN0cmluZztcblxuICAgIHJlc29sdmVkT3B0aW9ucygpOiBhbnk7XG59XG5cbnR5cGUgTnVtYmVyRm9ybWF0T3B0aW9ucyA9IHtcbiAgICBzdHlsZT86ICdkZWNpbWFsJyB8ICdjdXJyZW5jeScgfCAncGVyY2VudCc7XG4gICAgY3VycmVuY3k/OiBudWxsIHwgc3RyaW5nO1xuICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0cz86IG51bGwgfCBzdHJpbmc7XG4gICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzPzogbnVsbCB8IHN0cmluZztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE51bWJlckZvcm1hdCBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgbnVtYmVyOiBFeHByZXNzaW9uO1xuICAgIGxvY2FsZTogRXhwcmVzc2lvbiB8IG51bGw7ICAgLy8gQkNQIDQ3IGxhbmd1YWdlIHRhZ1xuICAgIGN1cnJlbmN5OiBFeHByZXNzaW9uIHwgbnVsbDsgLy8gSVNPIDQyMTcgY3VycmVuY3kgY29kZSwgcmVxdWlyZWQgaWYgc3R5bGU9Y3VycmVuY3lcbiAgICBtaW5GcmFjdGlvbkRpZ2l0czogRXhwcmVzc2lvbiB8IG51bGw7IC8vIERlZmF1bHQgMFxuICAgIG1heEZyYWN0aW9uRGlnaXRzOiBFeHByZXNzaW9uIHwgbnVsbDsgLy8gRGVmYXVsdCAzXG5cbiAgICBjb25zdHJ1Y3RvcihudW1iZXI6IEV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgbG9jYWxlOiBFeHByZXNzaW9uIHwgbnVsbCxcbiAgICAgICAgICAgICAgICBjdXJyZW5jeTogRXhwcmVzc2lvbiB8IG51bGwsXG4gICAgICAgICAgICAgICAgbWluRnJhY3Rpb25EaWdpdHM6IEV4cHJlc3Npb24gfCBudWxsLFxuICAgICAgICAgICAgICAgIG1heEZyYWN0aW9uRGlnaXRzOiBFeHByZXNzaW9uIHwgbnVsbCkge1xuICAgICAgICB0aGlzLnR5cGUgPSBTdHJpbmdUeXBlO1xuICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7XG4gICAgICAgIHRoaXMuY3VycmVuY3kgPSBjdXJyZW5jeTtcbiAgICAgICAgdGhpcy5taW5GcmFjdGlvbkRpZ2l0cyA9IG1pbkZyYWN0aW9uRGlnaXRzO1xuICAgICAgICB0aGlzLm1heEZyYWN0aW9uRGlnaXRzID0gbWF4RnJhY3Rpb25EaWdpdHM7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlKGFyZ3M6ICRSZWFkT25seUFycmF5PG1peGVkPiwgY29udGV4dDogUGFyc2luZ0NvbnRleHQpOiA/RXhwcmVzc2lvbiB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCB0d28gYXJndW1lbnRzLmApO1xuXG4gICAgICAgIGNvbnN0IG51bWJlciA9IGNvbnRleHQucGFyc2UoYXJnc1sxXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgIGlmICghbnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gKGFyZ3NbMl06IGFueSk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KG9wdGlvbnMpKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYE51bWJlckZvcm1hdCBvcHRpb25zIGFyZ3VtZW50IG11c3QgYmUgYW4gb2JqZWN0LmApO1xuXG4gICAgICAgIGxldCBsb2NhbGUgPSBudWxsO1xuICAgICAgICBpZiAob3B0aW9uc1snbG9jYWxlJ10pIHtcbiAgICAgICAgICAgIGxvY2FsZSA9IGNvbnRleHQucGFyc2Uob3B0aW9uc1snbG9jYWxlJ10sIDEsIFN0cmluZ1R5cGUpO1xuICAgICAgICAgICAgaWYgKCFsb2NhbGUpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1cnJlbmN5ID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ2N1cnJlbmN5J10pIHtcbiAgICAgICAgICAgIGN1cnJlbmN5ID0gY29udGV4dC5wYXJzZShvcHRpb25zWydjdXJyZW5jeSddLCAxLCBTdHJpbmdUeXBlKTtcbiAgICAgICAgICAgIGlmICghY3VycmVuY3kpIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1pbkZyYWN0aW9uRGlnaXRzID0gbnVsbDtcbiAgICAgICAgaWYgKG9wdGlvbnNbJ21pbi1mcmFjdGlvbi1kaWdpdHMnXSkge1xuICAgICAgICAgICAgbWluRnJhY3Rpb25EaWdpdHMgPSBjb250ZXh0LnBhcnNlKG9wdGlvbnNbJ21pbi1mcmFjdGlvbi1kaWdpdHMnXSwgMSwgTnVtYmVyVHlwZSk7XG4gICAgICAgICAgICBpZiAoIW1pbkZyYWN0aW9uRGlnaXRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhGcmFjdGlvbkRpZ2l0cyA9IG51bGw7XG4gICAgICAgIGlmIChvcHRpb25zWydtYXgtZnJhY3Rpb24tZGlnaXRzJ10pIHtcbiAgICAgICAgICAgIG1heEZyYWN0aW9uRGlnaXRzID0gY29udGV4dC5wYXJzZShvcHRpb25zWydtYXgtZnJhY3Rpb24tZGlnaXRzJ10sIDEsIE51bWJlclR5cGUpO1xuICAgICAgICAgICAgaWYgKCFtYXhGcmFjdGlvbkRpZ2l0cykgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE51bWJlckZvcm1hdChudW1iZXIsIGxvY2FsZSwgY3VycmVuY3ksIG1pbkZyYWN0aW9uRGlnaXRzLCBtYXhGcmFjdGlvbkRpZ2l0cyk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5sb2NhbGUgPyB0aGlzLmxvY2FsZS5ldmFsdWF0ZShjdHgpIDogW10sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuY3VycmVuY3kgPyBcImN1cnJlbmN5XCIgOiBcImRlY2ltYWxcIixcbiAgICAgICAgICAgICAgICBjdXJyZW5jeTogdGhpcy5jdXJyZW5jeSA/IHRoaXMuY3VycmVuY3kuZXZhbHVhdGUoY3R4KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IHRoaXMubWluRnJhY3Rpb25EaWdpdHMgPyB0aGlzLm1pbkZyYWN0aW9uRGlnaXRzLmV2YWx1YXRlKGN0eCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiB0aGlzLm1heEZyYWN0aW9uRGlnaXRzID8gdGhpcy5tYXhGcmFjdGlvbkRpZ2l0cy5ldmFsdWF0ZShjdHgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkuZm9ybWF0KHRoaXMubnVtYmVyLmV2YWx1YXRlKGN0eCkpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5udW1iZXIpO1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubG9jYWxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW5jeSkge1xuICAgICAgICAgICAgZm4odGhpcy5jdXJyZW5jeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluRnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgICAgIGZuKHRoaXMubWluRnJhY3Rpb25EaWdpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1heEZyYWN0aW9uRGlnaXRzKSB7XG4gICAgICAgICAgICBmbih0aGlzLm1heEZyYWN0aW9uRGlnaXRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU2VyaWFsaXplZEV4cHJlc3Npb24ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge307XG4gICAgICAgIGlmICh0aGlzLmxvY2FsZSkge1xuICAgICAgICAgICAgb3B0aW9uc1snbG9jYWxlJ10gPSB0aGlzLmxvY2FsZS5zZXJpYWxpemUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJyZW5jeSkge1xuICAgICAgICAgICAgb3B0aW9uc1snY3VycmVuY3knXSA9IHRoaXMuY3VycmVuY3kuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWluRnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbJ21pbi1mcmFjdGlvbi1kaWdpdHMnXSA9IHRoaXMubWluRnJhY3Rpb25EaWdpdHMuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWF4RnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgICAgIG9wdGlvbnNbJ21heC1mcmFjdGlvbi1kaWdpdHMnXSA9IHRoaXMubWF4RnJhY3Rpb25EaWdpdHMuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcIm51bWJlci1mb3JtYXRcIiwgdGhpcy5udW1iZXIuc2VyaWFsaXplKCksIG9wdGlvbnNdO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7TnVtYmVyVHlwZSwgdG9TdHJpbmd9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uL3ZhbHVlcy5qcyc7XG5pbXBvcnQgUnVudGltZUVycm9yIGZyb20gJy4uL3J1bnRpbWVfZXJyb3IuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbiwgU2VyaWFsaXplZEV4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUgUGFyc2luZ0NvbnRleHQgZnJvbSAnLi4vcGFyc2luZ19jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL2V2YWx1YXRpb25fY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG5jbGFzcyBMZW5ndGggaW1wbGVtZW50cyBFeHByZXNzaW9uIHtcbiAgICB0eXBlOiBUeXBlO1xuICAgIGlucHV0OiBFeHByZXNzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IEV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy50eXBlID0gTnVtYmVyVHlwZTtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZShhcmdzOiAkUmVhZE9ubHlBcnJheTxtaXhlZD4sIGNvbnRleHQ6IFBhcnNpbmdDb250ZXh0KTogP0xlbmd0aCB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmVycm9yKGBFeHBlY3RlZCAxIGFyZ3VtZW50LCBidXQgZm91bmQgJHthcmdzLmxlbmd0aCAtIDF9IGluc3RlYWQuYCk7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBjb250ZXh0LnBhcnNlKGFyZ3NbMV0sIDEpO1xuICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoaW5wdXQudHlwZS5raW5kICE9PSAnYXJyYXknICYmIGlucHV0LnR5cGUua2luZCAhPT0gJ3N0cmluZycgJiYgaW5wdXQudHlwZS5raW5kICE9PSAndmFsdWUnKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZXJyb3IoYEV4cGVjdGVkIGFyZ3VtZW50IG9mIHR5cGUgc3RyaW5nIG9yIGFycmF5LCBidXQgZm91bmQgJHt0b1N0cmluZyhpbnB1dC50eXBlKX0gaW5zdGVhZC5gKTtcblxuICAgICAgICByZXR1cm4gbmV3IExlbmd0aChpbnB1dCk7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCk6IGFueSB8IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dC5ldmFsdWF0ZShjdHgpO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoYEV4cGVjdGVkIHZhbHVlIHRvIGJlIG9mIHR5cGUgc3RyaW5nIG9yIGFycmF5LCBidXQgZm91bmQgJHt0b1N0cmluZyh0eXBlT2YoaW5wdXQpKX0gaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgZm4odGhpcy5pbnB1dCk7XG4gICAgfVxuXG4gICAgb3V0cHV0RGVmaW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemVkRXhwcmVzc2lvbiB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBbXCJsZW5ndGhcIl07XG4gICAgICAgIHRoaXMuZWFjaENoaWxkKGNoaWxkID0+IHsgc2VyaWFsaXplZC5wdXNoKGNoaWxkLnNlcmlhbGl6ZSgpKTsgfSk7XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGVuZ3RoO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICB0eXBlIFR5cGUsXG4gICAgTnVtYmVyVHlwZSxcbiAgICBTdHJpbmdUeXBlLFxuICAgIEJvb2xlYW5UeXBlLFxuICAgIENvbG9yVHlwZSxcbiAgICBPYmplY3RUeXBlLFxuICAgIFZhbHVlVHlwZSxcbiAgICBFcnJvclR5cGUsXG4gICAgQ29sbGF0b3JUeXBlLFxuICAgIGFycmF5LFxuICAgIHRvU3RyaW5nIGFzIHR5cGVUb1N0cmluZ1xufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmltcG9ydCB7dHlwZU9mLCBDb2xvciwgdmFsaWRhdGVSR0JBLCB0b1N0cmluZyBhcyB2YWx1ZVRvU3RyaW5nfSBmcm9tICcuLi92YWx1ZXMuanMnO1xuaW1wb3J0IENvbXBvdW5kRXhwcmVzc2lvbiBmcm9tICcuLi9jb21wb3VuZF9leHByZXNzaW9uLmpzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi4vcnVudGltZV9lcnJvci5qcyc7XG5pbXBvcnQgTGV0IGZyb20gJy4vbGV0LmpzJztcbmltcG9ydCBWYXIgZnJvbSAnLi92YXIuanMnO1xuaW1wb3J0IExpdGVyYWwgZnJvbSAnLi9saXRlcmFsLmpzJztcbmltcG9ydCBBc3NlcnRpb24gZnJvbSAnLi9hc3NlcnRpb24uanMnO1xuaW1wb3J0IENvZXJjaW9uIGZyb20gJy4vY29lcmNpb24uanMnO1xuaW1wb3J0IEF0IGZyb20gJy4vYXQuanMnO1xuaW1wb3J0IEluIGZyb20gJy4vaW4uanMnO1xuaW1wb3J0IEluZGV4T2YgZnJvbSAnLi9pbmRleF9vZi5qcyc7XG5pbXBvcnQgTWF0Y2ggZnJvbSAnLi9tYXRjaC5qcyc7XG5pbXBvcnQgQ2FzZSBmcm9tICcuL2Nhc2UuanMnO1xuaW1wb3J0IFNsaWNlIGZyb20gJy4vc2xpY2UuanMnO1xuaW1wb3J0IFN0ZXAgZnJvbSAnLi9zdGVwLmpzJztcbmltcG9ydCBJbnRlcnBvbGF0ZSBmcm9tICcuL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCBDb2FsZXNjZSBmcm9tICcuL2NvYWxlc2NlLmpzJztcbmltcG9ydCB7XG4gICAgRXF1YWxzLFxuICAgIE5vdEVxdWFscyxcbiAgICBMZXNzVGhhbixcbiAgICBHcmVhdGVyVGhhbixcbiAgICBMZXNzVGhhbk9yRXF1YWwsXG4gICAgR3JlYXRlclRoYW5PckVxdWFsXG59IGZyb20gJy4vY29tcGFyaXNvbi5qcyc7XG5pbXBvcnQgQ29sbGF0b3JFeHByZXNzaW9uIGZyb20gJy4vY29sbGF0b3IuanMnO1xuaW1wb3J0IE51bWJlckZvcm1hdCBmcm9tICcuL251bWJlcl9mb3JtYXQuanMnO1xuaW1wb3J0IEZvcm1hdEV4cHJlc3Npb24gZnJvbSAnLi9mb3JtYXQuanMnO1xuaW1wb3J0IEltYWdlRXhwcmVzc2lvbiBmcm9tICcuL2ltYWdlLmpzJztcbmltcG9ydCBMZW5ndGggZnJvbSAnLi9sZW5ndGguanMnO1xuaW1wb3J0IFdpdGhpbiBmcm9tICcuL3dpdGhpbi5qcyc7XG5cbmltcG9ydCB0eXBlIHtWYXJhcmdzfSBmcm9tICcuLi9jb21wb3VuZF9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHtFeHByZXNzaW9uUmVnaXN0cnl9IGZyb20gJy4uL2V4cHJlc3Npb24uanMnO1xuXG5jb25zdCBleHByZXNzaW9uczogRXhwcmVzc2lvblJlZ2lzdHJ5ID0ge1xuICAgIC8vIHNwZWNpYWwgZm9ybXNcbiAgICAnPT0nOiBFcXVhbHMsXG4gICAgJyE9JzogTm90RXF1YWxzLFxuICAgICc+JzogR3JlYXRlclRoYW4sXG4gICAgJzwnOiBMZXNzVGhhbixcbiAgICAnPj0nOiBHcmVhdGVyVGhhbk9yRXF1YWwsXG4gICAgJzw9JzogTGVzc1RoYW5PckVxdWFsLFxuICAgICdhcnJheSc6IEFzc2VydGlvbixcbiAgICAnYXQnOiBBdCxcbiAgICAnYm9vbGVhbic6IEFzc2VydGlvbixcbiAgICAnY2FzZSc6IENhc2UsXG4gICAgJ2NvYWxlc2NlJzogQ29hbGVzY2UsXG4gICAgJ2NvbGxhdG9yJzogQ29sbGF0b3JFeHByZXNzaW9uLFxuICAgICdmb3JtYXQnOiBGb3JtYXRFeHByZXNzaW9uLFxuICAgICdpbWFnZSc6IEltYWdlRXhwcmVzc2lvbixcbiAgICAnaW4nOiBJbixcbiAgICAnaW5kZXgtb2YnOiBJbmRleE9mLFxuICAgICdpbnRlcnBvbGF0ZSc6IEludGVycG9sYXRlLFxuICAgICdpbnRlcnBvbGF0ZS1oY2wnOiBJbnRlcnBvbGF0ZSxcbiAgICAnaW50ZXJwb2xhdGUtbGFiJzogSW50ZXJwb2xhdGUsXG4gICAgJ2xlbmd0aCc6IExlbmd0aCxcbiAgICAnbGV0JzogTGV0LFxuICAgICdsaXRlcmFsJzogTGl0ZXJhbCxcbiAgICAnbWF0Y2gnOiBNYXRjaCxcbiAgICAnbnVtYmVyJzogQXNzZXJ0aW9uLFxuICAgICdudW1iZXItZm9ybWF0JzogTnVtYmVyRm9ybWF0LFxuICAgICdvYmplY3QnOiBBc3NlcnRpb24sXG4gICAgJ3NsaWNlJzogU2xpY2UsXG4gICAgJ3N0ZXAnOiBTdGVwLFxuICAgICdzdHJpbmcnOiBBc3NlcnRpb24sXG4gICAgJ3RvLWJvb2xlYW4nOiBDb2VyY2lvbixcbiAgICAndG8tY29sb3InOiBDb2VyY2lvbixcbiAgICAndG8tbnVtYmVyJzogQ29lcmNpb24sXG4gICAgJ3RvLXN0cmluZyc6IENvZXJjaW9uLFxuICAgICd2YXInOiBWYXIsXG4gICAgJ3dpdGhpbic6IFdpdGhpblxufTtcblxuZnVuY3Rpb24gcmdiYShjdHgsIFtyLCBnLCBiLCBhXSkge1xuICAgIHIgPSByLmV2YWx1YXRlKGN0eCk7XG4gICAgZyA9IGcuZXZhbHVhdGUoY3R4KTtcbiAgICBiID0gYi5ldmFsdWF0ZShjdHgpO1xuICAgIGNvbnN0IGFscGhhID0gYSA/IGEuZXZhbHVhdGUoY3R4KSA6IDE7XG4gICAgY29uc3QgZXJyb3IgPSB2YWxpZGF0ZVJHQkEociwgZywgYiwgYWxwaGEpO1xuICAgIGlmIChlcnJvcikgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihlcnJvcik7XG4gICAgcmV0dXJuIG5ldyBDb2xvcihyIC8gMjU1ICogYWxwaGEsIGcgLyAyNTUgKiBhbHBoYSwgYiAvIDI1NSAqIGFscGhhLCBhbHBoYSk7XG59XG5cbmZ1bmN0aW9uIGhhcyhrZXksIG9iaikge1xuICAgIHJldHVybiBrZXkgaW4gb2JqO1xufVxuXG5mdW5jdGlvbiBnZXQoa2V5LCBvYmopIHtcbiAgICBjb25zdCB2ID0gb2JqW2tleV07XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiB2O1xufVxuXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2godiwgYSwgaSwgaikge1xuICAgIHdoaWxlIChpIDw9IGopIHtcbiAgICAgICAgY29uc3QgbSA9IChpICsgaikgPj4gMTtcbiAgICAgICAgaWYgKGFbbV0gPT09IHYpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGFbbV0gPiB2KVxuICAgICAgICAgICAgaiA9IG0gLSAxO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBpID0gbSArIDE7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gdmFyYXJncyh0eXBlOiBUeXBlKTogVmFyYXJncyB7XG4gICAgcmV0dXJuIHt0eXBlfTtcbn1cblxuQ29tcG91bmRFeHByZXNzaW9uLnJlZ2lzdGVyKGV4cHJlc3Npb25zLCB7XG4gICAgJ2Vycm9yJzogW1xuICAgICAgICBFcnJvclR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7IHRocm93IG5ldyBSdW50aW1lRXJyb3Iodi5ldmFsdWF0ZShjdHgpKTsgfVxuICAgIF0sXG4gICAgJ3R5cGVvZic6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4gdHlwZVRvU3RyaW5nKHR5cGVPZih2LmV2YWx1YXRlKGN0eCkpKVxuICAgIF0sXG4gICAgJ3RvLXJnYmEnOiBbXG4gICAgICAgIGFycmF5KE51bWJlclR5cGUsIDQpLFxuICAgICAgICBbQ29sb3JUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdi5ldmFsdWF0ZShjdHgpLnRvQXJyYXkoKTtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ3JnYic6IFtcbiAgICAgICAgQ29sb3JUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIHJnYmFcbiAgICBdLFxuICAgICdyZ2JhJzogW1xuICAgICAgICBDb2xvclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlLCBOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgcmdiYVxuICAgIF0sXG4gICAgJ2hhcyc6IHtcbiAgICAgICAgdHlwZTogQm9vbGVhblR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5XSkgPT4gaGFzKGtleS5ldmFsdWF0ZShjdHgpLCBjdHgucHJvcGVydGllcygpKVxuICAgICAgICAgICAgXSwgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlLCBPYmplY3RUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5LCBvYmpdKSA9PiBoYXMoa2V5LmV2YWx1YXRlKGN0eCksIG9iai5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgXVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnZ2V0Jzoge1xuICAgICAgICB0eXBlOiBWYWx1ZVR5cGUsXG4gICAgICAgIG92ZXJsb2FkczogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5XSkgPT4gZ2V0KGtleS5ldmFsdWF0ZShjdHgpLCBjdHgucHJvcGVydGllcygpKVxuICAgICAgICAgICAgXSwgW1xuICAgICAgICAgICAgICAgIFtTdHJpbmdUeXBlLCBPYmplY3RUeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBba2V5LCBvYmpdKSA9PiBnZXQoa2V5LmV2YWx1YXRlKGN0eCksIG9iai5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgXVxuICAgICAgICBdXG4gICAgfSxcbiAgICAnZmVhdHVyZS1zdGF0ZSc6IFtcbiAgICAgICAgVmFsdWVUeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZV0sXG4gICAgICAgIChjdHgsIFtrZXldKSA9PiBnZXQoa2V5LmV2YWx1YXRlKGN0eCksIGN0eC5mZWF0dXJlU3RhdGUgfHwge30pXG4gICAgXSxcbiAgICAncHJvcGVydGllcyc6IFtcbiAgICAgICAgT2JqZWN0VHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5wcm9wZXJ0aWVzKClcbiAgICBdLFxuICAgICdnZW9tZXRyeS10eXBlJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdlb21ldHJ5VHlwZSgpXG4gICAgXSxcbiAgICAnaWQnOiBbXG4gICAgICAgIFZhbHVlVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5pZCgpXG4gICAgXSxcbiAgICAnem9vbSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLnpvb21cbiAgICBdLFxuICAgICdwaXRjaCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLnBpdGNoIHx8IDBcbiAgICBdLFxuICAgICdkaXN0YW5jZS1mcm9tLWNlbnRlcic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5kaXN0YW5jZUZyb21DZW50ZXIoKVxuICAgIF0sXG4gICAgJ2hlYXRtYXAtZGVuc2l0eSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgIChjdHgpID0+IGN0eC5nbG9iYWxzLmhlYXRtYXBEZW5zaXR5IHx8IDBcbiAgICBdLFxuICAgICdsaW5lLXByb2dyZXNzJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMubGluZVByb2dyZXNzIHx8IDBcbiAgICBdLFxuICAgICdza3ktcmFkaWFsLXByb2dyZXNzJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gY3R4Lmdsb2JhbHMuc2t5UmFkaWFsUHJvZ3Jlc3MgfHwgMFxuICAgIF0sXG4gICAgJ2FjY3VtdWxhdGVkJzogW1xuICAgICAgICBWYWx1ZVR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoY3R4KSA9PiBjdHguZ2xvYmFscy5hY2N1bXVsYXRlZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN0eC5nbG9iYWxzLmFjY3VtdWxhdGVkXG4gICAgXSxcbiAgICAnKyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFyZy5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJyonOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIHZhcmFyZ3MoTnVtYmVyVHlwZSksXG4gICAgICAgIChjdHgsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSAxO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCAqPSBhcmcuZXZhbHVhdGUoY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICctJzoge1xuICAgICAgICB0eXBlOiBOdW1iZXJUeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2EsIGJdKSA9PiBhLmV2YWx1YXRlKGN0eCkgLSBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sIFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgICAgICAgICAgKGN0eCwgW2FdKSA9PiAtYS5ldmFsdWF0ZShjdHgpXG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICcvJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZSwgTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFthLCBiXSkgPT4gYS5ldmFsdWF0ZShjdHgpIC8gYi5ldmFsdWF0ZShjdHgpXG4gICAgXSxcbiAgICAnJSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGUsIE51bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAlIGIuZXZhbHVhdGUoY3R4KVxuICAgIF0sXG4gICAgJ2xuMic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguTE4yXG4gICAgXSxcbiAgICAncGknOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtdLFxuICAgICAgICAoKSA9PiBNYXRoLlBJXG4gICAgXSxcbiAgICAnZSc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW10sXG4gICAgICAgICgpID0+IE1hdGguRVxuICAgIF0sXG4gICAgJ14nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlLCBOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW2IsIGVdKSA9PiBNYXRoLnBvdyhiLmV2YWx1YXRlKGN0eCksIGUuZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdzcXJ0JzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFt4XSkgPT4gTWF0aC5zcXJ0KHguZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdsb2cxMCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nKG4uZXZhbHVhdGUoY3R4KSkgLyBNYXRoLkxOMTBcbiAgICBdLFxuICAgICdsbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGgubG9nKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdsb2cyJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5sb2cobi5ldmFsdWF0ZShjdHgpKSAvIE1hdGguTE4yXG4gICAgXSxcbiAgICAnc2luJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5zaW4obi5ldmFsdWF0ZShjdHgpKVxuICAgIF0sXG4gICAgJ2Nvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguY29zKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICd0YW4nOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLnRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXNpbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXNpbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYWNvcyc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYWNvcyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnYXRhbic6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgW051bWJlclR5cGVdLFxuICAgICAgICAoY3R4LCBbbl0pID0+IE1hdGguYXRhbihuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAnbWluJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICB2YXJhcmdzKE51bWJlclR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBNYXRoLm1pbiguLi5hcmdzLm1hcChhcmcgPT4gYXJnLmV2YWx1YXRlKGN0eCkpKVxuICAgIF0sXG4gICAgJ21heCc6IFtcbiAgICAgICAgTnVtYmVyVHlwZSxcbiAgICAgICAgdmFyYXJncyhOdW1iZXJUeXBlKSxcbiAgICAgICAgKGN0eCwgYXJncykgPT4gTWF0aC5tYXgoLi4uYXJncy5tYXAoYXJnID0+IGFyZy5ldmFsdWF0ZShjdHgpKSlcbiAgICBdLFxuICAgICdhYnMnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmFicyhuLmV2YWx1YXRlKGN0eCkpXG4gICAgXSxcbiAgICAncm91bmQnOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2ID0gbi5ldmFsdWF0ZShjdHgpO1xuICAgICAgICAgICAgLy8gSmF2YXNjcmlwdCdzIE1hdGgucm91bmQoKSByb3VuZHMgdG93YXJkcyArSW5maW5pdHkgZm9yIGhhbGZ3YXlcbiAgICAgICAgICAgIC8vIHZhbHVlcywgZXZlbiB3aGVuIHRoZXkncmUgbmVnYXRpdmUuIEl0J3MgbW9yZSBjb21tb24gdG8gcm91bmRcbiAgICAgICAgICAgIC8vIGF3YXkgZnJvbSAwIChlLmcuLCB0aGlzIGlzIHdoYXQgcHl0aG9uIGFuZCBDKysgZG8pXG4gICAgICAgICAgICByZXR1cm4gdiA8IDAgPyAtTWF0aC5yb3VuZCgtdikgOiBNYXRoLnJvdW5kKHYpO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmxvb3InOiBbXG4gICAgICAgIE51bWJlclR5cGUsXG4gICAgICAgIFtOdW1iZXJUeXBlXSxcbiAgICAgICAgKGN0eCwgW25dKSA9PiBNYXRoLmZsb29yKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdjZWlsJzogW1xuICAgICAgICBOdW1iZXJUeXBlLFxuICAgICAgICBbTnVtYmVyVHlwZV0sXG4gICAgICAgIChjdHgsIFtuXSkgPT4gTWF0aC5jZWlsKG4uZXZhbHVhdGUoY3R4KSlcbiAgICBdLFxuICAgICdmaWx0ZXItPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSA9PT0gKHY6IGFueSkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPT0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguaWQoKSA9PT0gKHY6IGFueSkudmFsdWVcbiAgICBdLFxuICAgICdmaWx0ZXItdHlwZS09PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiBjdHguZ2VvbWV0cnlUeXBlKCkgPT09ICh2OiBhbnkpLnZhbHVlXG4gICAgXSxcbiAgICAnZmlsdGVyLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLTwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPCBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LnByb3BlcnRpZXMoKVsoazogYW55KS52YWx1ZV07XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPiBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLTw9JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGUsIFZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhIDw9IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaWQtPD0nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbVmFsdWVUeXBlXSxcbiAgICAgICAgKGN0eCwgW3ZdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gY3R4LmlkKCk7XG4gICAgICAgICAgICBjb25zdCBiID0gKHY6IGFueSkudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGEgPT09IHR5cGVvZiBiICYmIGEgPD0gYjtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ2ZpbHRlci0+PSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBWYWx1ZVR5cGVdLFxuICAgICAgICAoY3R4LCBbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSAodjogYW55KS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PT0gdHlwZW9mIGIgJiYgYSA+PSBiO1xuICAgICAgICB9XG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLT49JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFt2XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYSA9IGN0eC5pZCgpO1xuICAgICAgICAgICAgY29uc3QgYiA9ICh2OiBhbnkpLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhID09PSB0eXBlb2YgYiAmJiBhID49IGI7XG4gICAgICAgIH1cbiAgICBdLFxuICAgICdmaWx0ZXItaGFzJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1ZhbHVlVHlwZV0sXG4gICAgICAgIChjdHgsIFtrXSkgPT4gKGs6IGFueSkudmFsdWUgaW4gY3R4LnByb3BlcnRpZXMoKVxuICAgIF0sXG4gICAgJ2ZpbHRlci1oYXMtaWQnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbXSxcbiAgICAgICAgKGN0eCkgPT4gKGN0eC5pZCgpICE9PSBudWxsICYmIGN0eC5pZCgpICE9PSB1bmRlZmluZWQpXG4gICAgXSxcbiAgICAnZmlsdGVyLXR5cGUtaW4nOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbYXJyYXkoU3RyaW5nVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4Lmdlb21ldHJ5VHlwZSgpKSA+PSAwXG4gICAgXSxcbiAgICAnZmlsdGVyLWlkLWluJzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW2FycmF5KFZhbHVlVHlwZSldLFxuICAgICAgICAoY3R4LCBbdl0pID0+ICh2OiBhbnkpLnZhbHVlLmluZGV4T2YoY3R4LmlkKCkpID49IDBcbiAgICBdLFxuICAgICdmaWx0ZXItaW4tc21hbGwnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbU3RyaW5nVHlwZSwgYXJyYXkoVmFsdWVUeXBlKV0sXG4gICAgICAgIC8vIGFzc3VtZXMgdiBpcyBhbiBhcnJheSBsaXRlcmFsXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gKHY6IGFueSkudmFsdWUuaW5kZXhPZihjdHgucHJvcGVydGllcygpWyhrOiBhbnkpLnZhbHVlXSkgPj0gMFxuICAgIF0sXG4gICAgJ2ZpbHRlci1pbi1sYXJnZSc6IFtcbiAgICAgICAgQm9vbGVhblR5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlLCBhcnJheShWYWx1ZVR5cGUpXSxcbiAgICAgICAgLy8gYXNzdW1lcyB2IGlzIGEgYXJyYXkgbGl0ZXJhbCB3aXRoIHZhbHVlcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGFuZCBvZiBhIHNpbmdsZSB0eXBlXG4gICAgICAgIChjdHgsIFtrLCB2XSkgPT4gYmluYXJ5U2VhcmNoKGN0eC5wcm9wZXJ0aWVzKClbKGs6IGFueSkudmFsdWVdLCAodjogYW55KS52YWx1ZSwgMCwgKHY6IGFueSkudmFsdWUubGVuZ3RoIC0gMSlcbiAgICBdLFxuICAgICdhbGwnOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSAmJiBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFyZy5ldmFsdWF0ZShjdHgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIF1cbiAgICB9LFxuICAgICdhbnknOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW5UeXBlLFxuICAgICAgICBvdmVybG9hZHM6IFtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbQm9vbGVhblR5cGUsIEJvb2xlYW5UeXBlXSxcbiAgICAgICAgICAgICAgICAoY3R4LCBbYSwgYl0pID0+IGEuZXZhbHVhdGUoY3R4KSB8fCBiLmV2YWx1YXRlKGN0eClcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgdmFyYXJncyhCb29sZWFuVHlwZSksXG4gICAgICAgICAgICAgICAgKGN0eCwgYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmV2YWx1YXRlKGN0eCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIH0sXG4gICAgJyEnOiBbXG4gICAgICAgIEJvb2xlYW5UeXBlLFxuICAgICAgICBbQm9vbGVhblR5cGVdLFxuICAgICAgICAoY3R4LCBbYl0pID0+ICFiLmV2YWx1YXRlKGN0eClcbiAgICBdLFxuICAgICdpcy1zdXBwb3J0ZWQtc2NyaXB0JzogW1xuICAgICAgICBCb29sZWFuVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAvLyBBdCBwYXJzZSB0aW1lIHRoaXMgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUsIHNvIHdlIG5lZWQgdG8gZXhjbHVkZSB0aGlzIGV4cHJlc3Npb24gd2l0aCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnRcbiAgICAgICAgKGN0eCwgW3NdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc1N1cHBvcnRlZFNjcmlwdCA9IGN0eC5nbG9iYWxzICYmIGN0eC5nbG9iYWxzLmlzU3VwcG9ydGVkU2NyaXB0O1xuICAgICAgICAgICAgaWYgKGlzU3VwcG9ydGVkU2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkU2NyaXB0KHMuZXZhbHVhdGUoY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIF0sXG4gICAgJ3VwY2FzZSc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgW1N0cmluZ1R5cGVdLFxuICAgICAgICAoY3R4LCBbc10pID0+IHMuZXZhbHVhdGUoY3R4KS50b1VwcGVyQ2FzZSgpXG4gICAgXSxcbiAgICAnZG93bmNhc2UnOiBbXG4gICAgICAgIFN0cmluZ1R5cGUsXG4gICAgICAgIFtTdHJpbmdUeXBlXSxcbiAgICAgICAgKGN0eCwgW3NdKSA9PiBzLmV2YWx1YXRlKGN0eCkudG9Mb3dlckNhc2UoKVxuICAgIF0sXG4gICAgJ2NvbmNhdCc6IFtcbiAgICAgICAgU3RyaW5nVHlwZSxcbiAgICAgICAgdmFyYXJncyhWYWx1ZVR5cGUpLFxuICAgICAgICAoY3R4LCBhcmdzKSA9PiBhcmdzLm1hcChhcmcgPT4gdmFsdWVUb1N0cmluZyhhcmcuZXZhbHVhdGUoY3R4KSkpLmpvaW4oJycpXG4gICAgXSxcbiAgICAncmVzb2x2ZWQtbG9jYWxlJzogW1xuICAgICAgICBTdHJpbmdUeXBlLFxuICAgICAgICBbQ29sbGF0b3JUeXBlXSxcbiAgICAgICAgKGN0eCwgW2NvbGxhdG9yXSkgPT4gY29sbGF0b3IuZXZhbHVhdGUoY3R4KS5yZXNvbHZlZExvY2FsZSgpXG4gICAgXVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGV4cHJlc3Npb25zO1xuIiwiLy8gQGZsb3dcblxuLyoqXG4gKiBBIHR5cGUgdXNlZCBmb3IgcmV0dXJuaW5nIGFuZCBwcm9wYWdhdGluZyBlcnJvcnMuIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB1bmlvblxuICogcmVwcmVzZW50cyBzdWNjZXNzIGFuZCBjb250YWlucyBhIHZhbHVlLCBhbmQgdGhlIHNlY29uZCByZXByZXNlbnRzIGFuIGVycm9yIGFuZFxuICogY29udGFpbnMgYW4gZXJyb3IgdmFsdWUuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgdHlwZSBSZXN1bHQ8VCwgRT4gPVxuICAgIHwge3wgcmVzdWx0OiAnc3VjY2VzcycsIHZhbHVlOiBUIHx9XG4gICAgfCB7fCByZXN1bHQ6ICdlcnJvcicsIHZhbHVlOiBFIHx9O1xuXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VzczxULCBFPih2YWx1ZTogVCk6IFJlc3VsdDxULCBFPiB7XG4gICAgcmV0dXJuIHtyZXN1bHQ6ICdzdWNjZXNzJywgdmFsdWV9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXJyb3I8VCwgRT4odmFsdWU6IEUpOiBSZXN1bHQ8VCwgRT4ge1xuICAgIHJldHVybiB7cmVzdWx0OiAnZXJyb3InLCB2YWx1ZX07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3BlY1sncHJvcGVydHktdHlwZSddID09PSAnZGF0YS1kcml2ZW4nIHx8IHNwZWNbJ3Byb3BlcnR5LXR5cGUnXSA9PT0gJ2Nyb3NzLWZhZGVkLWRhdGEtZHJpdmVuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzcGVjLmV4cHJlc3Npb24gJiYgc3BlYy5leHByZXNzaW9uLnBhcmFtZXRlcnMuaW5kZXhPZignem9vbScpID4gLTE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0ludGVycG9sYXRpb24oc3BlYzogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFzcGVjLmV4cHJlc3Npb24gJiYgc3BlYy5leHByZXNzaW9uLmludGVycG9sYXRlZDtcbn1cbiIsIi8vIEBmbG93XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFR5cGUodmFsOiBtaXhlZCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikge1xuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWw7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgKiBhcyBjb2xvclNwYWNlcyBmcm9tICcuLi91dGlsL2NvbG9yX3NwYWNlcy5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0ICogYXMgaW50ZXJwb2xhdGUgZnJvbSAnLi4vdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQgSW50ZXJwb2xhdGUgZnJvbSAnLi4vZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCBSZXNvbHZlZEltYWdlIGZyb20gJy4uL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuaW1wb3J0IHtzdXBwb3J0c0ludGVycG9sYXRpb259IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge2ZpbmRTdG9wTGVzc1RoYW5PckVxdWFsVG99IGZyb20gJy4uL2V4cHJlc3Npb24vc3RvcHMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaWRlbnRpdHlGdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMpIHtcbiAgICBjb25zdCBpc0NvbG9yID0gcHJvcGVydHlTcGVjLnR5cGUgPT09ICdjb2xvcic7XG4gICAgY29uc3Qgem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgPSBwYXJhbWV0ZXJzLnN0b3BzICYmIHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdID09PSAnb2JqZWN0JztcbiAgICBjb25zdCBmZWF0dXJlRGVwZW5kZW50ID0gem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgfHwgcGFyYW1ldGVycy5wcm9wZXJ0eSAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHpvb21EZXBlbmRlbnQgPSB6b29tQW5kRmVhdHVyZURlcGVuZGVudCB8fCAhZmVhdHVyZURlcGVuZGVudDtcbiAgICBjb25zdCB0eXBlID0gcGFyYW1ldGVycy50eXBlIHx8IChzdXBwb3J0c0ludGVycG9sYXRpb24ocHJvcGVydHlTcGVjKSA/ICdleHBvbmVudGlhbCcgOiAnaW50ZXJ2YWwnKTtcblxuICAgIGlmIChpc0NvbG9yKSB7XG4gICAgICAgIHBhcmFtZXRlcnMgPSBleHRlbmQoe30sIHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzLnN0b3BzKSB7XG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnN0b3BzID0gcGFyYW1ldGVycy5zdG9wcy5tYXAoKHN0b3ApID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3N0b3BbMF0sIENvbG9yLnBhcnNlKHN0b3BbMV0pXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuZGVmYXVsdCkge1xuICAgICAgICAgICAgcGFyYW1ldGVycy5kZWZhdWx0ID0gQ29sb3IucGFyc2UocGFyYW1ldGVycy5kZWZhdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuZGVmYXVsdCA9IENvbG9yLnBhcnNlKHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbWV0ZXJzLmNvbG9yU3BhY2UgJiYgcGFyYW1ldGVycy5jb2xvclNwYWNlICE9PSAncmdiJyAmJiAhY29sb3JTcGFjZXNbcGFyYW1ldGVycy5jb2xvclNwYWNlXSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uYW1lc3BhY2VcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNvbG9yIHNwYWNlOiAke3BhcmFtZXRlcnMuY29sb3JTcGFjZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgaW5uZXJGdW47XG4gICAgbGV0IGhhc2hlZFN0b3BzO1xuICAgIGxldCBjYXRlZ29yaWNhbEtleVR5cGU7XG4gICAgaWYgKHR5cGUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgaW5uZXJGdW4gPSBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb247XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50ZXJ2YWwnKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgICBpbm5lckZ1biA9IGV2YWx1YXRlQ2F0ZWdvcmljYWxGdW5jdGlvbjtcblxuICAgICAgICAvLyBGb3IgY2F0ZWdvcmljYWwgZnVuY3Rpb25zLCBnZW5lcmF0ZSBhbiBPYmplY3QgYXMgYSBoYXNobWFwIG9mIHRoZSBzdG9wcyBmb3IgZmFzdCBzZWFyY2hpbmdcbiAgICAgICAgaGFzaGVkU3RvcHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGNvbnN0IHN0b3Agb2YgcGFyYW1ldGVycy5zdG9wcykge1xuICAgICAgICAgICAgaGFzaGVkU3RvcHNbc3RvcFswXV0gPSBzdG9wWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5mZXIga2V5IHR5cGUgYmFzZWQgb24gZmlyc3Qgc3RvcCBrZXktLSB1c2VkIHRvIGVuY2ZvcmNlIHN0cmljdCB0eXBlIGNoZWNraW5nIGxhdGVyXG4gICAgICAgIGNhdGVnb3JpY2FsS2V5VHlwZSA9IHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaWRlbnRpdHknKSB7XG4gICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJZGVudGl0eUZ1bmN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmdW5jdGlvbiB0eXBlIFwiJHt0eXBlfVwiYCk7XG4gICAgfVxuXG4gICAgaWYgKHpvb21BbmRGZWF0dXJlRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVGdW5jdGlvbnMgPSB7fTtcbiAgICAgICAgY29uc3Qgem9vbVN0b3BzID0gW107XG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgcGFyYW1ldGVycy5zdG9wcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RvcCA9IHBhcmFtZXRlcnMuc3RvcHNbc107XG4gICAgICAgICAgICBjb25zdCB6b29tID0gc3RvcFswXS56b29tO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtZXRlcnMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHBhcmFtZXRlcnMucHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHBhcmFtZXRlcnMuZGVmYXVsdCxcbiAgICAgICAgICAgICAgICAgICAgc3RvcHM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB6b29tU3RvcHMucHVzaCh6b29tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbem9vbV0uc3RvcHMucHVzaChbc3RvcFswXS52YWx1ZSwgc3RvcFsxXV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZUZ1bmN0aW9uU3RvcHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB6IG9mIHpvb21TdG9wcykge1xuICAgICAgICAgICAgZmVhdHVyZUZ1bmN0aW9uU3RvcHMucHVzaChbZmVhdHVyZUZ1bmN0aW9uc1t6XS56b29tLCBjcmVhdGVGdW5jdGlvbihmZWF0dXJlRnVuY3Rpb25zW3pdLCBwcm9wZXJ0eVNwZWMpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uVHlwZSA9IHtuYW1lOiAnbGluZWFyJ307XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29tcG9zaXRlJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBmZWF0dXJlRnVuY3Rpb25TdG9wcy5tYXAocyA9PiBzWzBdKSxcbiAgICAgICAgICAgIGV2YWx1YXRlKHt6b29tfSwgcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICBzdG9wczogZmVhdHVyZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICAgICAgICAgIGJhc2U6IHBhcmFtZXRlcnMuYmFzZVxuICAgICAgICAgICAgICAgIH0sIHByb3BlcnR5U3BlYywgem9vbSkuZXZhbHVhdGUoem9vbSwgcHJvcGVydGllcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmICh6b29tRGVwZW5kZW50KSB7XG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb25UeXBlID0gdHlwZSA9PT0gJ2V4cG9uZW50aWFsJyA/XG4gICAgICAgICAgICB7bmFtZTogJ2V4cG9uZW50aWFsJywgYmFzZTogcGFyYW1ldGVycy5iYXNlICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmJhc2UgOiAxfSA6IG51bGw7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY2FtZXJhJyxcbiAgICAgICAgICAgIGludGVycG9sYXRpb25UeXBlLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkZhY3RvcjogSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3Rvci5iaW5kKHVuZGVmaW5lZCwgaW50ZXJwb2xhdGlvblR5cGUpLFxuICAgICAgICAgICAgem9vbVN0b3BzOiBwYXJhbWV0ZXJzLnN0b3BzLm1hcChzID0+IHNbMF0pLFxuICAgICAgICAgICAgZXZhbHVhdGU6ICh7em9vbX0pID0+IGlubmVyRnVuKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgem9vbSwgaGFzaGVkU3RvcHMsIGNhdGVnb3JpY2FsS2V5VHlwZSlcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZDogJ3NvdXJjZScsXG4gICAgICAgICAgICBldmFsdWF0ZShfLCBmZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmZWF0dXJlICYmIGZlYXR1cmUucHJvcGVydGllcyA/IGZlYXR1cmUucHJvcGVydGllc1twYXJhbWV0ZXJzLnByb3BlcnR5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29hbGVzY2UocGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbm5lckZ1bihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIHZhbHVlLCBoYXNoZWRTdG9wcywgY2F0ZWdvcmljYWxLZXlUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvYWxlc2NlKGEsIGIsIGMpIHtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYTtcbiAgICBpZiAoYiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYjtcbiAgICBpZiAoYyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVDYXRlZ29yaWNhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQsIGhhc2hlZFN0b3BzLCBrZXlUeXBlKSB7XG4gICAgY29uc3QgZXZhbHVhdGVkID0gdHlwZW9mIGlucHV0ID09PSBrZXlUeXBlID8gaGFzaGVkU3RvcHNbaW5wdXRdIDogdW5kZWZpbmVkOyAvLyBFbmZvcmNlIHN0cmljdCB0eXBpbmcgb24gaW5wdXRcbiAgICByZXR1cm4gY29hbGVzY2UoZXZhbHVhdGVkLCBwYXJhbWV0ZXJzLmRlZmF1bHQsIHByb3BlcnR5U3BlYy5kZWZhdWx0KTtcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIHByb3BlcnR5U3BlYywgaW5wdXQpIHtcbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xufVxuXG5mdW5jdGlvbiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24ocGFyYW1ldGVycywgcHJvcGVydHlTcGVjLCBpbnB1dCkge1xuICAgIGNvbnN0IGJhc2UgPSBwYXJhbWV0ZXJzLmJhc2UgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYmFzZSA6IDE7XG5cbiAgICAvLyBFZGdlIGNhc2VzXG4gICAgaWYgKGdldFR5cGUoaW5wdXQpICE9PSAnbnVtYmVyJykgcmV0dXJuIGNvYWxlc2NlKHBhcmFtZXRlcnMuZGVmYXVsdCwgcHJvcGVydHlTcGVjLmRlZmF1bHQpO1xuICAgIGNvbnN0IG4gPSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDtcbiAgICBpZiAobiA9PT0gMSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbMF1bMV07XG4gICAgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbMF1bMF0pIHJldHVybiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzFdO1xuICAgIGlmIChpbnB1dCA+PSBwYXJhbWV0ZXJzLnN0b3BzW24gLSAxXVswXSkgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbbiAtIDFdWzFdO1xuXG4gICAgY29uc3QgaW5kZXggPSBmaW5kU3RvcExlc3NUaGFuT3JFcXVhbFRvKHBhcmFtZXRlcnMuc3RvcHMubWFwKChzdG9wKSA9PiBzdG9wWzBdKSwgaW5wdXQpO1xuICAgIGNvbnN0IHQgPSBpbnRlcnBvbGF0aW9uRmFjdG9yKFxuICAgICAgICBpbnB1dCwgYmFzZSxcbiAgICAgICAgcGFyYW1ldGVycy5zdG9wc1tpbmRleF1bMF0sXG4gICAgICAgIHBhcmFtZXRlcnMuc3RvcHNbaW5kZXggKyAxXVswXSk7XG5cbiAgICBjb25zdCBvdXRwdXRMb3dlciA9IHBhcmFtZXRlcnMuc3RvcHNbaW5kZXhdWzFdO1xuICAgIGNvbnN0IG91dHB1dFVwcGVyID0gcGFyYW1ldGVycy5zdG9wc1tpbmRleCArIDFdWzFdO1xuICAgIGxldCBpbnRlcnAgPSBpbnRlcnBvbGF0ZVtwcm9wZXJ0eVNwZWMudHlwZV0gfHwgaWRlbnRpdHlGdW5jdGlvbjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbmFtZXNwYWNlXG5cbiAgICBpZiAocGFyYW1ldGVycy5jb2xvclNwYWNlICYmIHBhcmFtZXRlcnMuY29sb3JTcGFjZSAhPT0gJ3JnYicpIHtcbiAgICAgICAgY29uc3QgY29sb3JzcGFjZSA9IGNvbG9yU3BhY2VzW3BhcmFtZXRlcnMuY29sb3JTcGFjZV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25hbWVzcGFjZVxuICAgICAgICBpbnRlcnAgPSAoYSwgYikgPT4gY29sb3JzcGFjZS5yZXZlcnNlKGNvbG9yc3BhY2UuaW50ZXJwb2xhdGUoY29sb3JzcGFjZS5mb3J3YXJkKGEpLCBjb2xvcnNwYWNlLmZvcndhcmQoYiksIHQpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG91dHB1dExvd2VyLmV2YWx1YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBldmFsdWF0ZSguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZhbHVhdGVkTG93ZXIgPSBvdXRwdXRMb3dlci5ldmFsdWF0ZS5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRlZFVwcGVyID0gb3V0cHV0VXBwZXIuZXZhbHVhdGUuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGZpbGwtb3V0bGluZS1jb2xvciwgd2hpY2ggaGFzIG5vIHNwZWMgZGVmYXVsdC5cbiAgICAgICAgICAgICAgICBpZiAoZXZhbHVhdGVkTG93ZXIgPT09IHVuZGVmaW5lZCB8fCBldmFsdWF0ZWRVcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcnAoZXZhbHVhdGVkTG93ZXIsIGV2YWx1YXRlZFVwcGVyLCB0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJwKG91dHB1dExvd2VyLCBvdXRwdXRVcHBlciwgdCk7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlSWRlbnRpdHlGdW5jdGlvbihwYXJhbWV0ZXJzLCBwcm9wZXJ0eVNwZWMsIGlucHV0KSB7XG4gICAgaWYgKHByb3BlcnR5U3BlYy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgIGlucHV0ID0gQ29sb3IucGFyc2UoaW5wdXQpO1xuICAgIH0gZWxzZSBpZiAocHJvcGVydHlTcGVjLnR5cGUgPT09ICdmb3JtYXR0ZWQnKSB7XG4gICAgICAgIGlucHV0ID0gRm9ybWF0dGVkLmZyb21TdHJpbmcoaW5wdXQudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIGlmIChwcm9wZXJ0eVNwZWMudHlwZSA9PT0gJ3Jlc29sdmVkSW1hZ2UnKSB7XG4gICAgICAgIGlucHV0ID0gUmVzb2x2ZWRJbWFnZS5mcm9tU3RyaW5nKGlucHV0LnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSBpZiAoZ2V0VHlwZShpbnB1dCkgIT09IHByb3BlcnR5U3BlYy50eXBlICYmIChwcm9wZXJ0eVNwZWMudHlwZSAhPT0gJ2VudW0nIHx8ICFwcm9wZXJ0eVNwZWMudmFsdWVzW2lucHV0XSkpIHtcbiAgICAgICAgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBjb2FsZXNjZShpbnB1dCwgcGFyYW1ldGVycy5kZWZhdWx0LCBwcm9wZXJ0eVNwZWMuZGVmYXVsdCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJhdGlvIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiBleHBvbmVudGlhbCBmdW5jdGlvblxuICogc3RvcHMuXG4gKlxuICogSG93IGl0IHdvcmtzOlxuICogVHdvIGNvbnNlY3V0aXZlIHN0b3AgdmFsdWVzIGRlZmluZSBhIChzY2FsZWQgYW5kIHNoaWZ0ZWQpIGV4cG9uZW50aWFsXG4gKiBmdW5jdGlvbiBgZih4KSA9IGEgKiBiYXNlXnggKyBiYCwgd2hlcmUgYGJhc2VgIGlzIHRoZSB1c2VyLXNwZWNpZmllZCBiYXNlLFxuICogYW5kIGBhYCBhbmQgYGJgIGFyZSBjb25zdGFudHMgYWZmb3JkaW5nIHN1ZmZpY2llbnQgZGVncmVlcyBvZiBmcmVlZG9tIHRvIGZpdFxuICogdGhlIGZ1bmN0aW9uIHRvIHRoZSBnaXZlbiBzdG9wcy5cbiAqXG4gKiBIZXJlJ3MgYSBiaXQgb2YgYWxnZWJyYSB0aGF0IGxldHMgdXMgY29tcHV0ZSBgZih4KWAgZGlyZWN0bHkgZnJvbSB0aGUgc3RvcFxuICogdmFsdWVzIHdpdGhvdXQgZXhwbGljaXRseSBzb2x2aW5nIGZvciBgYWAgYW5kIGBiYDpcbiAqXG4gKiBGaXJzdCBzdG9wIHZhbHVlOiBgZih4MCkgPSB5MCA9IGEgKiBiYXNlXngwICsgYmBcbiAqIFNlY29uZCBzdG9wIHZhbHVlOiBgZih4MSkgPSB5MSA9IGEgKiBiYXNlXngxICsgYmBcbiAqID0+IGB5MSAtIHkwID0gYShiYXNlXngxIC0gYmFzZV54MClgXG4gKiA9PiBgYSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApYFxuICpcbiAqIERlc2lyZWQgdmFsdWU6IGBmKHgpID0geSA9IGEgKiBiYXNlXnggKyBiYFxuICogPT4gYGYoeCkgPSB5MCArIGEgKiAoYmFzZV54IC0gYmFzZV54MClgXG4gKlxuICogRnJvbSB0aGUgYWJvdmUsIHdlIGNhbiByZXBsYWNlIHRoZSBgYWAgaW4gYGEgKiAoYmFzZV54IC0gYmFzZV54MClgIGFuZCBkbyBhXG4gKiBsaXR0bGUgYWxnZWJyYTpcbiAqIGBgYFxuICogYSAqIChiYXNlXnggLSBiYXNlXngwKSA9ICh5MSAtIHkwKS8oYmFzZV54MSAtIGJhc2VeeDApICogKGJhc2VeeCAtIGJhc2VeeDApXG4gKiAgICAgICAgICAgICAgICAgICAgID0gKHkxIC0geTApICogKGJhc2VeeCAtIGJhc2VeeDApIC8gKGJhc2VeeDEgLSBiYXNlXngwKVxuICogYGBgXG4gKlxuICogSWYgd2UgbGV0IGAoYmFzZV54IC0gYmFzZV54MCkgLyAoYmFzZV54MSBiYXNlXngwKWAsIHRoZW4gd2UgaGF2ZVxuICogYGYoeCkgPSB5MCArICh5MSAtIHkwKSAqIHJhdGlvYC4gIEluIG90aGVyIHdvcmRzLCBgcmF0aW9gIG1heSBiZSB0cmVhdGVkIGFzXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZhY3RvciBiZXR3ZWVuIHRoZSB0d28gc3RvcHMnIG91dHB1dCB2YWx1ZXMuXG4gKlxuICogKE5vdGU6IGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm0gZm9yIGByYXRpb2AsXG4gKiBgKGJhc2VeKHgteDApIC0gMSkgLyAoYmFzZV4oeDEteDApIC0gMSkgYCwgaXMgZXF1aXZhbGVudCwgYnV0IHJlcXVpcmVzIGZld2VyXG4gKiBleHBlbnNpdmUgYE1hdGgucG93KClgIG9wZXJhdGlvbnMuKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGludGVycG9sYXRpb25GYWN0b3IoaW5wdXQsIGJhc2UsIGxvd2VyVmFsdWUsIHVwcGVyVmFsdWUpIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gdXBwZXJWYWx1ZSAtIGxvd2VyVmFsdWU7XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSBpbnB1dCAtIGxvd2VyVmFsdWU7XG5cbiAgICBpZiAoZGlmZmVyZW5jZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGJhc2UgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHByb2dyZXNzIC8gZGlmZmVyZW5jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKE1hdGgucG93KGJhc2UsIHByb2dyZXNzKSAtIDEpIC8gKE1hdGgucG93KGJhc2UsIGRpZmZlcmVuY2UpIC0gMSk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcbmltcG9ydCBQYXJzaW5nRXJyb3IgZnJvbSAnLi9wYXJzaW5nX2Vycm9yLmpzJztcbmltcG9ydCBQYXJzaW5nQ29udGV4dCBmcm9tICcuL3BhcnNpbmdfY29udGV4dC5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvbkNvbnRleHQgZnJvbSAnLi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IENvbXBvdW5kRXhwcmVzc2lvbiBmcm9tICcuL2NvbXBvdW5kX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IFN0ZXAgZnJvbSAnLi9kZWZpbml0aW9ucy9zdGVwLmpzJztcbmltcG9ydCBJbnRlcnBvbGF0ZSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCBDb2FsZXNjZSBmcm9tICcuL2RlZmluaXRpb25zL2NvYWxlc2NlLmpzJztcbmltcG9ydCBMZXQgZnJvbSAnLi9kZWZpbml0aW9ucy9sZXQuanMnO1xuaW1wb3J0IGRlZmluaXRpb25zIGZyb20gJy4vZGVmaW5pdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgaXNDb25zdGFudCBmcm9tICcuL2lzX2NvbnN0YW50LmpzJztcbmltcG9ydCBSdW50aW1lRXJyb3IgZnJvbSAnLi9ydW50aW1lX2Vycm9yLmpzJztcbmltcG9ydCB7c3VjY2VzcywgZXJyb3J9IGZyb20gJy4uL3V0aWwvcmVzdWx0LmpzJztcbmltcG9ydCB7c3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24sIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sIHN1cHBvcnRzSW50ZXJwb2xhdGlvbn0gZnJvbSAnLi4vdXRpbC9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUge1R5cGUsIEV2YWx1YXRpb25LaW5kfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtWYWx1ZX0gZnJvbSAnLi92YWx1ZXMuanMnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMuanMnO1xuaW1wb3J0IHR5cGUge1Jlc3VsdH0gZnJvbSAnLi4vdXRpbC9yZXN1bHQuanMnO1xuaW1wb3J0IHR5cGUge0ludGVycG9sYXRpb25UeXBlfSBmcm9tICcuL2RlZmluaXRpb25zL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCB0eXBlIHtQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVEaXN0YW5jZURhdGF9IGZyb20gJy4uL2ZlYXR1cmVfZmlsdGVyL2luZGV4LmpzJztcblxuZXhwb3J0IHR5cGUgRmVhdHVyZSA9IHtcbiAgICArdHlwZTogMSB8IDIgfCAzIHwgJ1Vua25vd24nIHwgJ1BvaW50JyB8ICdNdWx0aVBvaW50JyB8ICdMaW5lU3RyaW5nJyB8ICdNdWx0aUxpbmVTdHJpbmcnIHwgJ1BvbHlnb24nIHwgJ011bHRpUG9seWdvbicsXG4gICAgK2lkPzogbnVtYmVyIHwgbnVsbCxcbiAgICArcHJvcGVydGllczoge1tfOiBzdHJpbmddOiBhbnl9LFxuICAgICtwYXR0ZXJucz86IHtbXzogc3RyaW5nXToge1wibWluXCI6IHN0cmluZywgXCJtaWRcIjogc3RyaW5nLCBcIm1heFwiOiBzdHJpbmd9fSxcbiAgICArZ2VvbWV0cnk/OiBBcnJheTxBcnJheTxQb2ludD4+XG59O1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlU3RhdGUgPSB7W186IHN0cmluZ106IGFueX07XG5cbmV4cG9ydCB0eXBlIEdsb2JhbFByb3BlcnRpZXMgPSAkUmVhZE9ubHk8e1xuICAgIHpvb206IG51bWJlcixcbiAgICBwaXRjaD86IG51bWJlcixcbiAgICBoZWF0bWFwRGVuc2l0eT86IG51bWJlcixcbiAgICBsaW5lUHJvZ3Jlc3M/OiBudW1iZXIsXG4gICAgc2t5UmFkaWFsUHJvZ3Jlc3M/OiBudW1iZXIsXG4gICAgaXNTdXBwb3J0ZWRTY3JpcHQ/OiAoXzogc3RyaW5nKSA9PiBib29sZWFuLFxuICAgIGFjY3VtdWxhdGVkPzogVmFsdWVcbn0+O1xuXG5leHBvcnQgY2xhc3MgU3R5bGVFeHByZXNzaW9uIHtcbiAgICBleHByZXNzaW9uOiBFeHByZXNzaW9uO1xuXG4gICAgX2V2YWx1YXRvcjogRXZhbHVhdGlvbkNvbnRleHQ7XG4gICAgX2RlZmF1bHRWYWx1ZTogVmFsdWU7XG4gICAgX3dhcm5pbmdIaXN0b3J5OiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn07XG4gICAgX2VudW1WYWx1ZXM6ID97W186IHN0cmluZ106IGFueX07XG5cbiAgICBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBFeHByZXNzaW9uLCBwcm9wZXJ0eVNwZWM6ID9TdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgICAgICB0aGlzLl93YXJuaW5nSGlzdG9yeSA9IHt9O1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQoKTtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gcHJvcGVydHlTcGVjID8gZ2V0RGVmYXVsdFZhbHVlKHByb3BlcnR5U3BlYykgOiBudWxsO1xuICAgICAgICB0aGlzLl9lbnVtVmFsdWVzID0gcHJvcGVydHlTcGVjICYmIHByb3BlcnR5U3BlYy50eXBlID09PSAnZW51bScgPyBwcm9wZXJ0eVNwZWMudmFsdWVzIDogbnVsbDtcbiAgICB9XG5cbiAgICBldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPiwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24sIGZlYXR1cmVUaWxlQ29vcmQ/OiBQb2ludCwgZmVhdHVyZURpc3RhbmNlRGF0YT86IEZlYXR1cmVEaXN0YW5jZURhdGEpOiBhbnkge1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZ2xvYmFscyA9IGdsb2JhbHM7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlID0gZmVhdHVyZTtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVTdGF0ZSA9IGZlYXR1cmVTdGF0ZTtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmNhbm9uaWNhbCA9IGNhbm9uaWNhbCB8fCBudWxsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuYXZhaWxhYmxlSW1hZ2VzID0gYXZhaWxhYmxlSW1hZ2VzIHx8IG51bGw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mb3JtYXR0ZWRTZWN0aW9uID0gZm9ybWF0dGVkU2VjdGlvbjtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVUaWxlQ29vcmQgPSBmZWF0dXJlVGlsZUNvb3JkIHx8IG51bGw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlRGlzdGFuY2VEYXRhID0gZmVhdHVyZURpc3RhbmNlRGF0YSB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb24uZXZhbHVhdGUodGhpcy5fZXZhbHVhdG9yKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZShnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4sIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uLCBmZWF0dXJlVGlsZUNvb3JkPzogUG9pbnQsIGZlYXR1cmVEaXN0YW5jZURhdGE/OiBGZWF0dXJlRGlzdGFuY2VEYXRhKTogYW55IHtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmdsb2JhbHMgPSBnbG9iYWxzO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZSA9IGZlYXR1cmUgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZlYXR1cmVTdGF0ZSA9IGZlYXR1cmVTdGF0ZSB8fCBudWxsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuY2Fub25pY2FsID0gY2Fub25pY2FsIHx8IG51bGw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5hdmFpbGFibGVJbWFnZXMgPSBhdmFpbGFibGVJbWFnZXMgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5fZXZhbHVhdG9yLmZvcm1hdHRlZFNlY3Rpb24gPSBmb3JtYXR0ZWRTZWN0aW9uIHx8IG51bGw7XG4gICAgICAgIHRoaXMuX2V2YWx1YXRvci5mZWF0dXJlVGlsZUNvb3JkID0gZmVhdHVyZVRpbGVDb29yZCB8fCBudWxsO1xuICAgICAgICB0aGlzLl9ldmFsdWF0b3IuZmVhdHVyZURpc3RhbmNlRGF0YSA9IGZlYXR1cmVEaXN0YW5jZURhdGEgfHwgbnVsbDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHRoaXMuX2V2YWx1YXRvcik7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICAgICAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkIHx8ICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiB2YWwgIT09IHZhbCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2VudW1WYWx1ZXMgJiYgISh2YWwgaW4gdGhpcy5fZW51bVZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKGBFeHBlY3RlZCB2YWx1ZSB0byBiZSBvbmUgb2YgJHtPYmplY3Qua2V5cyh0aGlzLl9lbnVtVmFsdWVzKS5tYXAodiA9PiBKU09OLnN0cmluZ2lmeSh2KSkuam9pbignLCAnKX0sIGJ1dCBmb3VuZCAke0pTT04uc3RyaW5naWZ5KHZhbCl9IGluc3RlYWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3dhcm5pbmdIaXN0b3J5W2UubWVzc2FnZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93YXJuaW5nSGlzdG9yeVtlLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cHJlc3Npb24oZXhwcmVzc2lvbjogbWl4ZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShleHByZXNzaW9uKSAmJiBleHByZXNzaW9uLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgdHlwZW9mIGV4cHJlc3Npb25bMF0gPT09ICdzdHJpbmcnICYmIGV4cHJlc3Npb25bMF0gaW4gZGVmaW5pdGlvbnM7XG59XG5cbi8qKlxuICogUGFyc2UgYW5kIHR5cGVjaGVjayB0aGUgZ2l2ZW4gc3R5bGUgc3BlYyBKU09OIGV4cHJlc3Npb24uICBJZlxuICogb3B0aW9ucy5kZWZhdWx0VmFsdWUgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIHJlc3VsdGluZyBTdHlsZUV4cHJlc3Npb24nc1xuICogYGV2YWx1YXRlKClgIG1ldGhvZCB3aWxsIGhhbmRsZSBlcnJvcnMgYnkgbG9nZ2luZyBhIHdhcm5pbmcgKG9uY2UgcGVyXG4gKiBtZXNzYWdlKSBhbmQgcmV0dXJuaW5nIHRoZSBkZWZhdWx0IHZhbHVlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIHRocm93XG4gKiBldmFsdWF0aW9uIGVycm9ycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhwcmVzc2lvbihleHByZXNzaW9uOiBtaXhlZCwgcHJvcGVydHlTcGVjOiA/U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pOiBSZXN1bHQ8U3R5bGVFeHByZXNzaW9uLCBBcnJheTxQYXJzaW5nRXJyb3I+PiB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IFBhcnNpbmdDb250ZXh0KGRlZmluaXRpb25zLCBbXSwgcHJvcGVydHlTcGVjID8gZ2V0RXhwZWN0ZWRUeXBlKHByb3BlcnR5U3BlYykgOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gRm9yIHN0cmluZy12YWx1ZWQgcHJvcGVydGllcywgY29lcmNlIHRvIHN0cmluZyBhdCB0aGUgdG9wIGxldmVsIHJhdGhlciB0aGFuIGFzc2VydGluZy5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZXIucGFyc2UoZXhwcmVzc2lvbiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCxcbiAgICAgICAgcHJvcGVydHlTcGVjICYmIHByb3BlcnR5U3BlYy50eXBlID09PSAnc3RyaW5nJyA/IHt0eXBlQW5ub3RhdGlvbjogJ2NvZXJjZSd9IDogdW5kZWZpbmVkKTtcblxuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICAgIGFzc2VydChwYXJzZXIuZXJyb3JzLmxlbmd0aCA+IDApO1xuICAgICAgICByZXR1cm4gZXJyb3IocGFyc2VyLmVycm9ycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Y2Nlc3MobmV3IFN0eWxlRXhwcmVzc2lvbihwYXJzZWQsIHByb3BlcnR5U3BlYykpO1xufVxuXG5leHBvcnQgY2xhc3MgWm9vbUNvbnN0YW50RXhwcmVzc2lvbjxLaW5kOiBFdmFsdWF0aW9uS2luZD4ge1xuICAgIGtpbmQ6IEtpbmQ7XG4gICAgaXNTdGF0ZURlcGVuZGVudDogYm9vbGVhbjtcbiAgICBfc3R5bGVFeHByZXNzaW9uOiBTdHlsZUV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3RvcihraW5kOiBLaW5kLCBleHByZXNzaW9uOiBTdHlsZUV4cHJlc3Npb24pIHtcbiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgdGhpcy5fc3R5bGVFeHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5pc1N0YXRlRGVwZW5kZW50ID0ga2luZCAhPT0gKCdjb25zdGFudCc6IEV2YWx1YXRpb25LaW5kKSAmJiAhaXNDb25zdGFudC5pc1N0YXRlQ29uc3RhbnQoZXhwcmVzc2lvbi5leHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPiwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcywgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbik6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGUoZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcywgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgWm9vbURlcGVuZGVudEV4cHJlc3Npb248S2luZDogRXZhbHVhdGlvbktpbmQ+IHtcbiAgICBraW5kOiBLaW5kO1xuICAgIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPjtcbiAgICBpc1N0YXRlRGVwZW5kZW50OiBib29sZWFuO1xuXG4gICAgX3N0eWxlRXhwcmVzc2lvbjogU3R5bGVFeHByZXNzaW9uO1xuICAgIGludGVycG9sYXRpb25UeXBlOiA/SW50ZXJwb2xhdGlvblR5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihraW5kOiBLaW5kLCBleHByZXNzaW9uOiBTdHlsZUV4cHJlc3Npb24sIHpvb21TdG9wczogQXJyYXk8bnVtYmVyPiwgaW50ZXJwb2xhdGlvblR5cGU/OiBJbnRlcnBvbGF0aW9uVHlwZSkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgICAgICB0aGlzLnpvb21TdG9wcyA9IHpvb21TdG9wcztcbiAgICAgICAgdGhpcy5fc3R5bGVFeHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5pc1N0YXRlRGVwZW5kZW50ID0ga2luZCAhPT0gKCdjYW1lcmEnOiBFdmFsdWF0aW9uS2luZCkgJiYgIWlzQ29uc3RhbnQuaXNTdGF0ZUNvbnN0YW50KGV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gICAgICAgIHRoaXMuaW50ZXJwb2xhdGlvblR5cGUgPSBpbnRlcnBvbGF0aW9uVHlwZTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZVdpdGhvdXRFcnJvckhhbmRsaW5nKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPiwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3R5bGVFeHByZXNzaW9uLmV2YWx1YXRlV2l0aG91dEVycm9ySGFuZGxpbmcoZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcywgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbik6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHlsZUV4cHJlc3Npb24uZXZhbHVhdGUoZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcywgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGlvbkZhY3RvcihpbnB1dDogbnVtYmVyLCBsb3dlcjogbnVtYmVyLCB1cHBlcjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJwb2xhdGlvblR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0aW9uRmFjdG9yKHRoaXMuaW50ZXJwb2xhdGlvblR5cGUsIGlucHV0LCBsb3dlciwgdXBwZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIENvbnN0YW50RXhwcmVzc2lvbiA9IHtcbiAgICBraW5kOiAnY29uc3RhbnQnLFxuICAgICtldmFsdWF0ZTogKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPikgPT4gYW55LFxufVxuXG5leHBvcnQgdHlwZSBTb3VyY2VFeHByZXNzaW9uID0ge1xuICAgIGtpbmQ6ICdzb3VyY2UnLFxuICAgIGlzU3RhdGVEZXBlbmRlbnQ6IGJvb2xlYW4sXG4gICAgK2V2YWx1YXRlOiAoZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZT86IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZT86IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+LCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikgPT4gYW55LFxufTtcblxuZXhwb3J0IHR5cGUgQ2FtZXJhRXhwcmVzc2lvbiA9IHtcbiAgICBraW5kOiAnY2FtZXJhJyxcbiAgICArZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSwgZmVhdHVyZVN0YXRlPzogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pID0+IGFueSxcbiAgICAraW50ZXJwb2xhdGlvbkZhY3RvcjogKGlucHV0OiBudW1iZXIsIGxvd2VyOiBudW1iZXIsIHVwcGVyOiBudW1iZXIpID0+IG51bWJlcixcbiAgICB6b29tU3RvcHM6IEFycmF5PG51bWJlcj4sXG4gICAgaW50ZXJwb2xhdGlvblR5cGU6ID9JbnRlcnBvbGF0aW9uVHlwZVxufTtcblxuZXhwb3J0IHR5cGUgQ29tcG9zaXRlRXhwcmVzc2lvbiA9IHtcbiAgICBraW5kOiAnY29tcG9zaXRlJyxcbiAgICBpc1N0YXRlRGVwZW5kZW50OiBib29sZWFuLFxuICAgICtldmFsdWF0ZTogKGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU/OiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU/OiBGZWF0dXJlU3RhdGUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPiwgZm9ybWF0dGVkU2VjdGlvbj86IEZvcm1hdHRlZFNlY3Rpb24pID0+IGFueSxcbiAgICAraW50ZXJwb2xhdGlvbkZhY3RvcjogKGlucHV0OiBudW1iZXIsIGxvd2VyOiBudW1iZXIsIHVwcGVyOiBudW1iZXIpID0+IG51bWJlcixcbiAgICB6b29tU3RvcHM6IEFycmF5PG51bWJlcj4sXG4gICAgaW50ZXJwb2xhdGlvblR5cGU6ID9JbnRlcnBvbGF0aW9uVHlwZVxufTtcblxuZXhwb3J0IHR5cGUgU3R5bGVQcm9wZXJ0eUV4cHJlc3Npb24gPVxuICAgIHwgQ29uc3RhbnRFeHByZXNzaW9uXG4gICAgfCBTb3VyY2VFeHByZXNzaW9uXG4gICAgfCBDYW1lcmFFeHByZXNzaW9uXG4gICAgfCBDb21wb3NpdGVFeHByZXNzaW9uO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlFeHByZXNzaW9uKGV4cHJlc3Npb246IG1peGVkLCBwcm9wZXJ0eVNwZWM6IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKTogUmVzdWx0PFN0eWxlUHJvcGVydHlFeHByZXNzaW9uLCBBcnJheTxQYXJzaW5nRXJyb3I+PiB7XG4gICAgZXhwcmVzc2lvbiA9IGNyZWF0ZUV4cHJlc3Npb24oZXhwcmVzc2lvbiwgcHJvcGVydHlTcGVjKTtcbiAgICBpZiAoZXhwcmVzc2lvbi5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gZXhwcmVzc2lvbi52YWx1ZS5leHByZXNzaW9uO1xuXG4gICAgY29uc3QgaXNGZWF0dXJlQ29uc3RhbnQgPSBpc0NvbnN0YW50LmlzRmVhdHVyZUNvbnN0YW50KHBhcnNlZCk7XG4gICAgaWYgKCFpc0ZlYXR1cmVDb25zdGFudCAmJiAhc3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb24ocHJvcGVydHlTcGVjKSkge1xuICAgICAgICByZXR1cm4gZXJyb3IoW25ldyBQYXJzaW5nRXJyb3IoJycsICdkYXRhIGV4cHJlc3Npb25zIG5vdCBzdXBwb3J0ZWQnKV0pO1xuICAgIH1cblxuICAgIGNvbnN0IGlzWm9vbUNvbnN0YW50ID0gaXNDb25zdGFudC5pc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQocGFyc2VkLCBbJ3pvb20nLCAncGl0Y2gnLCAnZGlzdGFuY2UtZnJvbS1jZW50ZXInXSk7XG4gICAgaWYgKCFpc1pvb21Db25zdGFudCAmJiAhc3VwcG9ydHNab29tRXhwcmVzc2lvbihwcm9wZXJ0eVNwZWMpKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ3pvb20gZXhwcmVzc2lvbnMgbm90IHN1cHBvcnRlZCcpXSk7XG4gICAgfVxuXG4gICAgY29uc3Qgem9vbUN1cnZlID0gZmluZFpvb21DdXJ2ZShwYXJzZWQpO1xuICAgIGlmICghem9vbUN1cnZlICYmICFpc1pvb21Db25zdGFudCkge1xuICAgICAgICByZXR1cm4gZXJyb3IoW25ldyBQYXJzaW5nRXJyb3IoJycsICdcInpvb21cIiBleHByZXNzaW9uIG1heSBvbmx5IGJlIHVzZWQgYXMgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIGV4cHJlc3Npb24uJyldKTtcbiAgICB9IGVsc2UgaWYgKHpvb21DdXJ2ZSBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3IoW3pvb21DdXJ2ZV0pO1xuICAgIH0gZWxzZSBpZiAoem9vbUN1cnZlIGluc3RhbmNlb2YgSW50ZXJwb2xhdGUgJiYgIXN1cHBvcnRzSW50ZXJwb2xhdGlvbihwcm9wZXJ0eVNwZWMpKSB7XG4gICAgICAgIHJldHVybiBlcnJvcihbbmV3IFBhcnNpbmdFcnJvcignJywgJ1wiaW50ZXJwb2xhdGVcIiBleHByZXNzaW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgcHJvcGVydHknKV0pO1xuICAgIH1cblxuICAgIGlmICghem9vbUN1cnZlKSB7XG4gICAgICAgIHJldHVybiBzdWNjZXNzKGlzRmVhdHVyZUNvbnN0YW50ID9cbiAgICAgICAgICAgIChuZXcgWm9vbUNvbnN0YW50RXhwcmVzc2lvbignY29uc3RhbnQnLCBleHByZXNzaW9uLnZhbHVlKTogQ29uc3RhbnRFeHByZXNzaW9uKSA6XG4gICAgICAgICAgICAobmV3IFpvb21Db25zdGFudEV4cHJlc3Npb24oJ3NvdXJjZScsIGV4cHJlc3Npb24udmFsdWUpOiBTb3VyY2VFeHByZXNzaW9uKSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW50ZXJwb2xhdGlvblR5cGUgPSB6b29tQ3VydmUgaW5zdGFuY2VvZiBJbnRlcnBvbGF0ZSA/IHpvb21DdXJ2ZS5pbnRlcnBvbGF0aW9uIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHN1Y2Nlc3MoaXNGZWF0dXJlQ29uc3RhbnQgP1xuICAgICAgICAobmV3IFpvb21EZXBlbmRlbnRFeHByZXNzaW9uKCdjYW1lcmEnLCBleHByZXNzaW9uLnZhbHVlLCB6b29tQ3VydmUubGFiZWxzLCBpbnRlcnBvbGF0aW9uVHlwZSk6IENhbWVyYUV4cHJlc3Npb24pIDpcbiAgICAgICAgKG5ldyBab29tRGVwZW5kZW50RXhwcmVzc2lvbignY29tcG9zaXRlJywgZXhwcmVzc2lvbi52YWx1ZSwgem9vbUN1cnZlLmxhYmVscywgaW50ZXJwb2xhdGlvblR5cGUpOiBDb21wb3NpdGVFeHByZXNzaW9uKSk7XG59XG5cbmltcG9ydCB7aXNGdW5jdGlvbiwgY3JlYXRlRnVuY3Rpb259IGZyb20gJy4uL2Z1bmN0aW9uL2luZGV4LmpzJztcbmltcG9ydCB7Q29sb3J9IGZyb20gJy4vdmFsdWVzLmpzJztcblxuLy8gc2VyaWFsaXphdGlvbiB3cmFwcGVyIGZvciBvbGQtc3R5bGUgc3RvcCBmdW5jdGlvbnMgbm9ybWFsaXplZCB0byB0aGVcbi8vIGV4cHJlc3Npb24gaW50ZXJmYWNlXG5leHBvcnQgY2xhc3MgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uPFQ+IHtcbiAgICBfcGFyYW1ldGVyczogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD47XG4gICAgX3NwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uO1xuXG4gICAga2luZDogRXZhbHVhdGlvbktpbmQ7XG4gICAgZXZhbHVhdGU6IChnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlPzogRmVhdHVyZSkgPT4gYW55O1xuICAgIGludGVycG9sYXRpb25GYWN0b3I6ID8oaW5wdXQ6IG51bWJlciwgbG93ZXI6IG51bWJlciwgdXBwZXI6IG51bWJlcikgPT4gbnVtYmVyO1xuICAgIHpvb21TdG9wczogP0FycmF5PG51bWJlcj47XG5cbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPiwgc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIHRoaXMuX3NwZWNpZmljYXRpb24gPSBzcGVjaWZpY2F0aW9uO1xuICAgICAgICBleHRlbmQodGhpcywgY3JlYXRlRnVuY3Rpb24odGhpcy5fcGFyYW1ldGVycywgdGhpcy5fc3BlY2lmaWNhdGlvbikpO1xuICAgIH1cblxuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZShzZXJpYWxpemVkOiB7X3BhcmFtZXRlcnM6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+LCBfc3BlY2lmaWNhdGlvbjogU3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259KTogU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHlsZVByb3BlcnR5RnVuY3Rpb24oc2VyaWFsaXplZC5fcGFyYW1ldGVycywgc2VyaWFsaXplZC5fc3BlY2lmaWNhdGlvbik7XG4gICAgfVxuXG4gICAgc3RhdGljIHNlcmlhbGl6ZShpbnB1dDogU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uPFQ+KToge19wYXJhbWV0ZXJzOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPiwgX3NwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBfcGFyYW1ldGVyczogaW5wdXQuX3BhcmFtZXRlcnMsXG4gICAgICAgICAgICBfc3BlY2lmaWNhdGlvbjogaW5wdXQuX3NwZWNpZmljYXRpb25cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0eUV4cHJlc3Npb248VD4odmFsdWU6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+LCBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFN0eWxlUHJvcGVydHlFeHByZXNzaW9uIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgU3R5bGVQcm9wZXJ0eUZ1bmN0aW9uKHZhbHVlLCBzcGVjaWZpY2F0aW9uKTogYW55KTtcblxuICAgIH0gZWxzZSBpZiAoaXNFeHByZXNzaW9uKHZhbHVlKSkge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gY3JlYXRlUHJvcGVydHlFeHByZXNzaW9uKHZhbHVlLCBzcGVjaWZpY2F0aW9uKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24ucmVzdWx0ID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGluIHZhbGlkYXRpb25cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihleHByZXNzaW9uLnZhbHVlLm1hcChlcnIgPT4gYCR7ZXJyLmtleX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbignLCAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udmFsdWU7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgY29uc3RhbnQ6IGFueSA9IHZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBzcGVjaWZpY2F0aW9uLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGNvbnN0YW50ID0gQ29sb3IucGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnY29uc3RhbnQnLFxuICAgICAgICAgICAgZXZhbHVhdGU6ICgpID0+IGNvbnN0YW50XG4gICAgICAgIH07XG4gICAgfVxufVxuXG4vLyBab29tLWRlcGVuZGVudCBleHByZXNzaW9ucyBtYXkgb25seSB1c2UgW1wiem9vbVwiXSBhcyB0aGUgaW5wdXQgdG8gYSB0b3AtbGV2ZWwgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiXG4vLyBleHByZXNzaW9uIChjb2xsZWN0aXZlbHkgcmVmZXJyZWQgdG8gYXMgYSBcImN1cnZlXCIpLiBUaGUgY3VydmUgbWF5IGJlIHdyYXBwZWQgaW4gb25lIG9yIG1vcmUgXCJsZXRcIiBvclxuLy8gXCJjb2FsZXNjZVwiIGV4cHJlc3Npb25zLlxuZnVuY3Rpb24gZmluZFpvb21DdXJ2ZShleHByZXNzaW9uOiBFeHByZXNzaW9uKTogU3RlcCB8IEludGVycG9sYXRlIHwgUGFyc2luZ0Vycm9yIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBMZXQpIHtcbiAgICAgICAgcmVzdWx0ID0gZmluZFpvb21DdXJ2ZShleHByZXNzaW9uLnJlc3VsdCk7XG5cbiAgICB9IGVsc2UgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDb2FsZXNjZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGFyZyBvZiBleHByZXNzaW9uLmFyZ3MpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRab29tQ3VydmUoYXJnKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICgoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0ZXAgfHwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEludGVycG9sYXRlKSAmJlxuICAgICAgICBleHByZXNzaW9uLmlucHV0IGluc3RhbmNlb2YgQ29tcG91bmRFeHByZXNzaW9uICYmXG4gICAgICAgIGV4cHJlc3Npb24uaW5wdXQubmFtZSA9PT0gJ3pvb20nKSB7XG5cbiAgICAgICAgcmVzdWx0ID0gZXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUGFyc2luZ0Vycm9yKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZXhwcmVzc2lvbi5lYWNoQ2hpbGQoKGNoaWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gZmluZFpvb21DdXJ2ZShjaGlsZCk7XG4gICAgICAgIGlmIChjaGlsZFJlc3VsdCBpbnN0YW5jZW9mIFBhcnNpbmdFcnJvcikge1xuICAgICAgICAgICAgcmVzdWx0ID0gY2hpbGRSZXN1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdCAmJiBjaGlsZFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnNpbmdFcnJvcignJywgJ1wiem9vbVwiIGV4cHJlc3Npb24gbWF5IG9ubHkgYmUgdXNlZCBhcyBpbnB1dCB0byBhIHRvcC1sZXZlbCBcInN0ZXBcIiBvciBcImludGVycG9sYXRlXCIgZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgJiYgY2hpbGRSZXN1bHQgJiYgcmVzdWx0ICE9PSBjaGlsZFJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFBhcnNpbmdFcnJvcignJywgJ09ubHkgb25lIHpvb20tYmFzZWQgXCJzdGVwXCIgb3IgXCJpbnRlcnBvbGF0ZVwiIHN1YmV4cHJlc3Npb24gbWF5IGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4nKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuaW1wb3J0IHtDb2xvclR5cGUsIFN0cmluZ1R5cGUsIE51bWJlclR5cGUsIEJvb2xlYW5UeXBlLCBWYWx1ZVR5cGUsIEZvcm1hdHRlZFR5cGUsIFJlc29sdmVkSW1hZ2VUeXBlLCBhcnJheX0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmZ1bmN0aW9uIGdldEV4cGVjdGVkVHlwZShzcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFR5cGUge1xuICAgIGNvbnN0IHR5cGVzID0ge1xuICAgICAgICBjb2xvcjogQ29sb3JUeXBlLFxuICAgICAgICBzdHJpbmc6IFN0cmluZ1R5cGUsXG4gICAgICAgIG51bWJlcjogTnVtYmVyVHlwZSxcbiAgICAgICAgZW51bTogU3RyaW5nVHlwZSxcbiAgICAgICAgYm9vbGVhbjogQm9vbGVhblR5cGUsXG4gICAgICAgIGZvcm1hdHRlZDogRm9ybWF0dGVkVHlwZSxcbiAgICAgICAgcmVzb2x2ZWRJbWFnZTogUmVzb2x2ZWRJbWFnZVR5cGVcbiAgICB9O1xuXG4gICAgaWYgKHNwZWMudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gYXJyYXkodHlwZXNbc3BlYy52YWx1ZV0gfHwgVmFsdWVUeXBlLCBzcGVjLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVzW3NwZWMudHlwZV07XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRWYWx1ZShzcGVjOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbik6IFZhbHVlIHtcbiAgICBpZiAoc3BlYy50eXBlID09PSAnY29sb3InICYmIChpc0Z1bmN0aW9uKHNwZWMuZGVmYXVsdCkgfHwgQXJyYXkuaXNBcnJheShzcGVjLmRlZmF1bHQpKSkge1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGhlYXRtYXAtY29sb3I6IGl0IHVzZXMgdGhlICdkZWZhdWx0OicgdG8gZGVmaW5lIGFcbiAgICAgICAgLy8gZGVmYXVsdCBjb2xvciByYW1wLCBidXQgY3JlYXRlRXhwcmVzc2lvbiBleHBlY3RzIGEgc2ltcGxlIHZhbHVlIHRvIGZhbGxcbiAgICAgICAgLy8gYmFjayB0byBpbiBjYXNlIG9mIHJ1bnRpbWUgZXJyb3JzXG4gICAgICAgIHJldHVybiBuZXcgQ29sb3IoMCwgMCwgMCwgMCk7XG4gICAgfSBlbHNlIGlmIChzcGVjLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgcmV0dXJuIENvbG9yLnBhcnNlKHNwZWMuZGVmYXVsdCkgfHwgbnVsbDtcbiAgICB9IGVsc2UgaWYgKHNwZWMuZGVmYXVsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzcGVjLmRlZmF1bHQ7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuLy8gTm90ZTogRG8gbm90IGluaGVyaXQgZnJvbSBFcnJvci4gSXQgYnJlYWtzIHdoZW4gdHJhbnNwaWxpbmcgdG8gRVM1LlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWYWxpZGF0aW9uRXJyb3Ige1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBpZGVudGlmaWVyOiA/c3RyaW5nO1xuICAgIGxpbmU6ID9udW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihrZXk6ID9zdHJpbmcsIHZhbHVlOiA/eyBfX2xpbmVfXzogbnVtYmVyIH0sIG1lc3NhZ2U6IHN0cmluZywgaWRlbnRpZmllcjogP3N0cmluZykge1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSAoa2V5ID8gYCR7a2V5fTogYCA6ICcnKSArIG1lc3NhZ2U7XG4gICAgICAgIGlmIChpZGVudGlmaWVyKSB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLl9fbGluZV9fKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmUgPSB2YWx1ZS5fX2xpbmVfXztcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCB2YWxpZGF0ZVNwZWMgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtWYWxpZGF0aW9uT3B0aW9uc30gZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbnR5cGUgT3B0aW9ucyA9IFZhbGlkYXRpb25PcHRpb25zICYge1xuICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzPzogRnVuY3Rpb247XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdChvcHRpb25zOiBPcHRpb25zKTogQXJyYXk8VmFsaWRhdGlvbkVycm9yPiB7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3Qgb2JqZWN0ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBlbGVtZW50U3BlY3MgPSBvcHRpb25zLnZhbHVlU3BlYyB8fCB7fTtcbiAgICBjb25zdCBlbGVtZW50VmFsaWRhdG9ycyA9IG9wdGlvbnMub2JqZWN0RWxlbWVudFZhbGlkYXRvcnMgfHwge307XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGNvbnN0IHR5cGUgPSBnZXRUeXBlKG9iamVjdCk7XG4gICAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIG9iamVjdCwgYG9iamVjdCBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9iamVjdEtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFNwZWNLZXkgPSBvYmplY3RLZXkuc3BsaXQoJy4nKVswXTsgLy8gdHJlYXQgJ3BhaW50LionIGFzICdwYWludCdcbiAgICAgICAgY29uc3QgZWxlbWVudFNwZWMgPSBlbGVtZW50U3BlY3NbZWxlbWVudFNwZWNLZXldIHx8IGVsZW1lbnRTcGVjc1snKiddO1xuXG4gICAgICAgIGxldCB2YWxpZGF0ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChlbGVtZW50VmFsaWRhdG9yc1tlbGVtZW50U3BlY0tleV0pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IGVsZW1lbnRWYWxpZGF0b3JzW2VsZW1lbnRTcGVjS2V5XTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50U3BlY3NbZWxlbWVudFNwZWNLZXldKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSB2YWxpZGF0ZVNwZWM7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFZhbGlkYXRvcnNbJyonXSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50ID0gZWxlbWVudFZhbGlkYXRvcnNbJyonXTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50U3BlY3NbJyonXSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50ID0gdmFsaWRhdGVTcGVjO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF2YWxpZGF0ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBvYmplY3Rbb2JqZWN0S2V5XSwgYHVua25vd24gcHJvcGVydHkgXCIke29iamVjdEtleX1cImApKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUVsZW1lbnQoe1xuICAgICAgICAgICAga2V5OiAoa2V5ID8gYCR7a2V5fS5gIDoga2V5KSArIG9iamVjdEtleSxcbiAgICAgICAgICAgIHZhbHVlOiBvYmplY3Rbb2JqZWN0S2V5XSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogZWxlbWVudFNwZWMsXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIG9iamVjdCxcbiAgICAgICAgICAgIG9iamVjdEtleVxuICAgICAgICAvLyAkRmxvd0ZpeE1lW2V4dHJhLWFyZ11cbiAgICAgICAgfSwgb2JqZWN0KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50U3BlY0tleSBpbiBlbGVtZW50U3BlY3MpIHtcbiAgICAgICAgLy8gRG9uJ3QgY2hlY2sgYHJlcXVpcmVkYCB3aGVuIHRoZXJlJ3MgYSBjdXN0b20gdmFsaWRhdG9yIGZvciB0aGF0IHByb3BlcnR5LlxuICAgICAgICBpZiAoZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50U3BlY3NbZWxlbWVudFNwZWNLZXldLnJlcXVpcmVkICYmIGVsZW1lbnRTcGVjc1tlbGVtZW50U3BlY0tleV1bJ2RlZmF1bHQnXSA9PT0gdW5kZWZpbmVkICYmIG9iamVjdFtlbGVtZW50U3BlY0tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIG9iamVjdCwgYG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCIke2VsZW1lbnRTcGVjS2V5fVwiYCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcblxuaW1wb3J0IHR5cGUge1ZhbGlkYXRpb25PcHRpb25zfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxudHlwZSBPcHRpb25zID0gVmFsaWRhdGlvbk9wdGlvbnMgJiB7XG4gICAgYXJyYXlFbGVtZW50VmFsaWRhdG9yOiBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQXJyYXkob3B0aW9uczogT3B0aW9ucyk6IEFycmF5PFZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGNvbnN0IGFycmF5ID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBhcnJheVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdmFsaWRhdGVBcnJheUVsZW1lbnQgPSBvcHRpb25zLmFycmF5RWxlbWVudFZhbGlkYXRvciB8fCB2YWxpZGF0ZTtcblxuICAgIGlmIChnZXRUeXBlKGFycmF5KSAhPT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBhcnJheSwgYGFycmF5IGV4cGVjdGVkLCAke2dldFR5cGUoYXJyYXkpfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXlTcGVjLmxlbmd0aCAmJiBhcnJheS5sZW5ndGggIT09IGFycmF5U3BlYy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksIGBhcnJheSBsZW5ndGggJHthcnJheVNwZWMubGVuZ3RofSBleHBlY3RlZCwgbGVuZ3RoICR7YXJyYXkubGVuZ3RofSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXlTcGVjWydtaW4tbGVuZ3RoJ10gJiYgYXJyYXkubGVuZ3RoIDwgYXJyYXlTcGVjWydtaW4tbGVuZ3RoJ10pIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksIGBhcnJheSBsZW5ndGggYXQgbGVhc3QgJHthcnJheVNwZWNbJ21pbi1sZW5ndGgnXX0gZXhwZWN0ZWQsIGxlbmd0aCAke2FycmF5Lmxlbmd0aH0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgbGV0IGFycmF5RWxlbWVudFNwZWMgPSB7XG4gICAgICAgIFwidHlwZVwiOiBhcnJheVNwZWMudmFsdWUsXG4gICAgICAgIFwidmFsdWVzXCI6IGFycmF5U3BlYy52YWx1ZXMsXG4gICAgICAgIFwibWluaW11bVwiOiBhcnJheVNwZWMubWluaW11bSxcbiAgICAgICAgXCJtYXhpbXVtXCI6IGFycmF5U3BlYy5tYXhpbXVtLFxuICAgICAgICBmdW5jdGlvbjogdW5kZWZpbmVkXG4gICAgfTtcblxuICAgIGlmIChzdHlsZVNwZWMuJHZlcnNpb24gPCA3KSB7XG4gICAgICAgIGFycmF5RWxlbWVudFNwZWMuZnVuY3Rpb24gPSBhcnJheVNwZWMuZnVuY3Rpb247XG4gICAgfVxuXG4gICAgaWYgKGdldFR5cGUoYXJyYXlTcGVjLnZhbHVlKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYXJyYXlFbGVtZW50U3BlYyA9IGFycmF5U3BlYy52YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgZXJyb3JzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlQXJyYXlFbGVtZW50KHtcbiAgICAgICAgICAgIGFycmF5LFxuICAgICAgICAgICAgYXJyYXlJbmRleDogaSxcbiAgICAgICAgICAgIHZhbHVlOiBhcnJheVtpXSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogYXJyYXlFbGVtZW50U3BlYyxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjLFxuICAgICAgICAgICAga2V5OiBgJHtrZXl9WyR7aX1dYFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmltcG9ydCB0eXBlIHtWYWxpZGF0aW9uT3B0aW9uc30gZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbnR5cGUgT3B0aW9ucyA9IFZhbGlkYXRpb25PcHRpb25zICYge1xuICAgIGFycmF5SW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVOdW1iZXIob3B0aW9uczogT3B0aW9ucyk6IEFycmF5PFZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICBsZXQgdHlwZSA9IGdldFR5cGUodmFsdWUpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdHlwZSA9ICdOYU4nO1xuICAgIH1cblxuICAgIGlmICh0eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYG51bWJlciBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAoJ21pbmltdW0nIGluIHZhbHVlU3BlYykge1xuICAgICAgICBsZXQgc3BlY01pbiA9IHZhbHVlU3BlYy5taW5pbXVtO1xuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZVNwZWMubWluaW11bSkgPT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSBvcHRpb25zLmFycmF5SW5kZXg7XG4gICAgICAgICAgICBzcGVjTWluID0gdmFsdWVTcGVjLm1pbmltdW1baV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlIDwgc3BlY01pbikge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGAke3ZhbHVlfSBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gdmFsdWUgJHtzcGVjTWlufWApXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICgnbWF4aW11bScgaW4gdmFsdWVTcGVjKSB7XG4gICAgICAgIGxldCBzcGVjTWF4ID0gdmFsdWVTcGVjLm1heGltdW07XG4gICAgICAgIGlmIChnZXRUeXBlKHZhbHVlU3BlYy5tYXhpbXVtKSA9PT0gJ2FycmF5Jykge1xuICAgICAgICAgICAgY29uc3QgaSA9IG9wdGlvbnMuYXJyYXlJbmRleDtcbiAgICAgICAgICAgIHNwZWNNYXggPSB2YWx1ZVNwZWMubWF4aW11bVtpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUgPiBzcGVjTWF4KSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYCR7dmFsdWV9IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSAke3NwZWNNYXh9YCldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IHZhbGlkYXRlT2JqZWN0IGZyb20gJy4vdmFsaWRhdGVfb2JqZWN0LmpzJztcbmltcG9ydCB2YWxpZGF0ZUFycmF5IGZyb20gJy4vdmFsaWRhdGVfYXJyYXkuanMnO1xuaW1wb3J0IHZhbGlkYXRlTnVtYmVyIGZyb20gJy4vdmFsaWRhdGVfbnVtYmVyLmpzJztcbmltcG9ydCB7aXNFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQge1xuICAgIHN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uLFxuICAgIHN1cHBvcnRzWm9vbUV4cHJlc3Npb24sXG4gICAgc3VwcG9ydHNJbnRlcnBvbGF0aW9uXG59IGZyb20gJy4uL3V0aWwvcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtWYWxpZGF0aW9uT3B0aW9uc30gZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb24ob3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IGZ1bmN0aW9uVmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgY29uc3QgZnVuY3Rpb25UeXBlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZS50eXBlKTtcbiAgICBsZXQgc3RvcEtleVR5cGU7XG4gICAgbGV0IHN0b3BEb21haW5WYWx1ZXM6IHtbc3RyaW5nIHwgbnVtYmVyXTogYm9vbGVhbn0gPSB7fTtcbiAgICBsZXQgcHJldmlvdXNTdG9wRG9tYWluVmFsdWU7XG4gICAgbGV0IHByZXZpb3VzU3RvcERvbWFpblpvb207XG5cbiAgICBjb25zdCBpc1pvb21GdW5jdGlvbiA9IGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJyAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNQcm9wZXJ0eUZ1bmN0aW9uID0gIWlzWm9vbUZ1bmN0aW9uO1xuICAgIGNvbnN0IGlzWm9vbUFuZFByb3BlcnR5RnVuY3Rpb24gPVxuICAgICAgICBnZXRUeXBlKG9wdGlvbnMudmFsdWUuc3RvcHMpID09PSAnYXJyYXknICYmXG4gICAgICAgIGdldFR5cGUob3B0aW9ucy52YWx1ZS5zdG9wc1swXSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgZ2V0VHlwZShvcHRpb25zLnZhbHVlLnN0b3BzWzBdWzBdKSA9PT0gJ29iamVjdCc7XG5cbiAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgICAgICB2YWx1ZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLmZ1bmN0aW9uLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgIHN0b3BzOiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcHMsXG4gICAgICAgICAgICBkZWZhdWx0OiB2YWxpZGF0ZUZ1bmN0aW9uRGVmYXVsdFxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnaWRlbnRpdHknICYmIGlzWm9vbUZ1bmN0aW9uKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwicHJvcGVydHlcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlICE9PSAnaWRlbnRpdHknICYmICFvcHRpb25zLnZhbHVlLnN0b3BzKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic3RvcHNcIicpKTtcbiAgICB9XG5cbiAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnZXhwb25lbnRpYWwnICYmIG9wdGlvbnMudmFsdWVTcGVjLmV4cHJlc3Npb24gJiYgIXN1cHBvcnRzSW50ZXJwb2xhdGlvbihvcHRpb25zLnZhbHVlU3BlYykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ2V4cG9uZW50aWFsIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0eWxlU3BlYy4kdmVyc2lvbiA+PSA4KSB7XG4gICAgICAgIGlmIChpc1Byb3BlcnR5RnVuY3Rpb24gJiYgIXN1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3Byb3BlcnR5IGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzWm9vbUZ1bmN0aW9uICYmICFzdXBwb3J0c1pvb21FeHByZXNzaW9uKG9wdGlvbnMudmFsdWVTcGVjKSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3pvb20gZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZ1bmN0aW9uVHlwZSA9PT0gJ2NhdGVnb3JpY2FsJyB8fCBpc1pvb21BbmRQcm9wZXJ0eUZ1bmN0aW9uKSAmJiBvcHRpb25zLnZhbHVlLnByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ1wicHJvcGVydHlcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvblN0b3BzKG9wdGlvbnM6IFZhbGlkYXRpb25PcHRpb25zKSB7XG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdpZGVudGl0eScpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ2lkZW50aXR5IGZ1bmN0aW9uIG1heSBub3QgaGF2ZSBhIFwic3RvcHNcIiBwcm9wZXJ0eScpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuXG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVBcnJheSh7XG4gICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IG9wdGlvbnMudmFsdWVTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgYXJyYXlFbGVtZW50VmFsaWRhdG9yOiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWUpID09PSAnYXJyYXknICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgdmFsdWUsICdhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN0b3AnKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25TdG9wKG9wdGlvbnM6IFZhbGlkYXRpb25PcHRpb25zKSB7XG4gICAgICAgIGxldCBlcnJvcnMgPSBbXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgICAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcblxuICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZSkgIT09ICdhcnJheScpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYXJyYXkgZXhwZWN0ZWQsICR7Z2V0VHlwZSh2YWx1ZSl9IGZvdW5kYCldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBhcnJheSBsZW5ndGggMiBleHBlY3RlZCwgbGVuZ3RoICR7dmFsdWUubGVuZ3RofSBmb3VuZGApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1pvb21BbmRQcm9wZXJ0eUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZ2V0VHlwZSh2YWx1ZVswXSkgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBvYmplY3QgZXhwZWN0ZWQsICR7Z2V0VHlwZSh2YWx1ZVswXSl9IGZvdW5kYCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlWzBdLnpvb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnb2JqZWN0IHN0b3Aga2V5IG11c3QgaGF2ZSB6b29tJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlWzBdLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ29iamVjdCBzdG9wIGtleSBtdXN0IGhhdmUgdmFsdWUnKV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRTdG9wRG9tYWluWm9vbSA9IHVuYnVuZGxlKHZhbHVlWzBdLnpvb20pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXh0U3RvcERvbWFpblpvb20gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWVbMF0uem9vbSwgJ3N0b3Agem9vbSB2YWx1ZXMgbXVzdCBiZSBudW1iZXJzJyldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNTdG9wRG9tYWluWm9vbSAmJiBwcmV2aW91c1N0b3BEb21haW5ab29tID4gbmV4dFN0b3BEb21haW5ab29tKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWVbMF0uem9vbSwgJ3N0b3Agem9vbSB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5leHRTdG9wRG9tYWluWm9vbSAhPT0gcHJldmlvdXNTdG9wRG9tYWluWm9vbSkge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU3RvcERvbWFpblpvb20gPSBuZXh0U3RvcERvbWFpblpvb207XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgc3RvcERvbWFpblZhbHVlcyA9IHt9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9WzBdYCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVbMF0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiB7em9vbToge319LFxuICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHt6b29tOiB2YWxpZGF0ZU51bWJlciwgdmFsdWU6IHZhbGlkYXRlU3RvcERvbWFpblZhbHVlfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZSh7XG4gICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9WzBdYCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVbMF0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiB7fSxcbiAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgICAgICB9LCB2YWx1ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRXhwcmVzc2lvbihkZWVwVW5idW5kbGUodmFsdWVbMV0pKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoYCR7a2V5fVsxXWAsIHZhbHVlWzFdLCAnZXhwcmVzc2lvbnMgYXJlIG5vdCBhbGxvd2VkIGluIGZ1bmN0aW9uIHN0b3BzLicpXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICBrZXk6IGAke2tleX1bMV1gLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzFdLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBmdW5jdGlvblZhbHVlU3BlYyxcbiAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVTdG9wRG9tYWluVmFsdWUob3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnMsIHN0b3ApIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldFR5cGUob3B0aW9ucy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZSk7XG5cbiAgICAgICAgY29uc3QgcmVwb3J0VmFsdWUgPSBvcHRpb25zLnZhbHVlICE9PSBudWxsID8gb3B0aW9ucy52YWx1ZSA6IHN0b3A7XG5cbiAgICAgICAgaWYgKCFzdG9wS2V5VHlwZSkge1xuICAgICAgICAgICAgc3RvcEtleVR5cGUgPSB0eXBlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHN0b3BLZXlUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCBgJHt0eXBlfSBzdG9wIGRvbWFpbiB0eXBlIG11c3QgbWF0Y2ggcHJldmlvdXMgc3RvcCBkb21haW4gdHlwZSAke3N0b3BLZXlUeXBlfWApXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlICE9PSAnbnVtYmVyJyAmJiB0eXBlICE9PSAnc3RyaW5nJyAmJiB0eXBlICE9PSAnYm9vbGVhbicgJiYgdHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCAnc3RvcCBkb21haW4gdmFsdWUgbXVzdCBiZSBhIG51bWJlciwgc3RyaW5nLCBvciBib29sZWFuJyldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgIT09ICdudW1iZXInICYmIGZ1bmN0aW9uVHlwZSAhPT0gJ2NhdGVnb3JpY2FsJykge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgbnVtYmVyIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYDtcbiAgICAgICAgICAgIGlmIChzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbihmdW5jdGlvblZhbHVlU3BlYykgJiYgZnVuY3Rpb25UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICdcXG5JZiB5b3UgaW50ZW5kZWQgdG8gdXNlIGEgY2F0ZWdvcmljYWwgZnVuY3Rpb24sIHNwZWNpZnkgYFwidHlwZVwiOiBcImNhdGVnb3JpY2FsXCJgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIHJlcG9ydFZhbHVlLCBtZXNzYWdlKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnY2F0ZWdvcmljYWwnICYmIHR5cGUgPT09ICdudW1iZXInICYmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8ICFpc0Zpbml0ZSh2YWx1ZSkgfHwgTWF0aC5mbG9vcih2YWx1ZSkgIT09IHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCByZXBvcnRWYWx1ZSwgYGludGVnZXIgZXhwZWN0ZWQsIGZvdW5kICR7U3RyaW5nKHZhbHVlKX1gKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnVuY3Rpb25UeXBlICE9PSAnY2F0ZWdvcmljYWwnICYmIHR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHByZXZpb3VzU3RvcERvbWFpblZhbHVlID09PSAnbnVtYmVyJyAmJiBwcmV2aW91c1N0b3BEb21haW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBhcHBlYXIgaW4gYXNjZW5kaW5nIG9yZGVyJyldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdW5jdGlvblR5cGUgPT09ICdjYXRlZ29yaWNhbCcgJiYgKHZhbHVlOiBhbnkpIGluIHN0b3BEb21haW5WYWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgcmVwb3J0VmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUnKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdG9wRG9tYWluVmFsdWVzWyh2YWx1ZTogYW55KV0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25EZWZhdWx0KG9wdGlvbnM6IFZhbGlkYXRpb25PcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh7XG4gICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMudmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGZ1bmN0aW9uVmFsdWVTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbiwgY3JlYXRlUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB7ZGVlcFVuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcbmltcG9ydCB7aXNTdGF0ZUNvbnN0YW50LCBpc0dsb2JhbFByb3BlcnR5Q29uc3RhbnQsIGlzRmVhdHVyZUNvbnN0YW50fSBmcm9tICcuLi9leHByZXNzaW9uL2lzX2NvbnN0YW50LmpzJztcbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi4vZXhwcmVzc2lvbi9jb21wb3VuZF9leHByZXNzaW9uLmpzJztcblxuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlRXhwcmVzc2lvbihvcHRpb25zOiBhbnkpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gKG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQgPT09ICdwcm9wZXJ0eScgPyBjcmVhdGVQcm9wZXJ0eUV4cHJlc3Npb24gOiBjcmVhdGVFeHByZXNzaW9uKShkZWVwVW5idW5kbGUob3B0aW9ucy52YWx1ZSksIG9wdGlvbnMudmFsdWVTcGVjKTtcbiAgICBpZiAoZXhwcmVzc2lvbi5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udmFsdWUubWFwKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0aW9uRXJyb3IoYCR7b3B0aW9ucy5rZXl9JHtlcnJvci5rZXl9YCwgb3B0aW9ucy52YWx1ZSwgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb25PYmogPSAoZXhwcmVzc2lvbi52YWx1ZTogYW55KS5leHByZXNzaW9uIHx8IChleHByZXNzaW9uLnZhbHVlOiBhbnkpLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbjtcblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAncHJvcGVydHknICYmIChvcHRpb25zLnByb3BlcnR5S2V5ID09PSAndGV4dC1mb250JykgJiZcbiAgICAgICAgIWV4cHJlc3Npb25PYmoub3V0cHV0RGVmaW5lZCgpKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgYEludmFsaWQgZGF0YSBleHByZXNzaW9uIGZvciBcIiR7b3B0aW9ucy5wcm9wZXJ0eUtleX1cIi4gT3V0cHV0IHZhbHVlcyBtdXN0IGJlIGNvbnRhaW5lZCBhcyBsaXRlcmFscyB3aXRoaW4gdGhlIGV4cHJlc3Npb24uYCldO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAncHJvcGVydHknICYmIG9wdGlvbnMucHJvcGVydHlUeXBlID09PSAnbGF5b3V0JyAmJlxuICAgICAgICAoIWlzU3RhdGVDb25zdGFudChleHByZXNzaW9uT2JqKSkpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnXCJmZWF0dXJlLXN0YXRlXCIgZGF0YSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGxheW91dCBwcm9wZXJ0aWVzLicpXTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5leHByZXNzaW9uQ29udGV4dCA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgcmV0dXJuIGRpc2FsbG93ZWRGaWx0ZXJQYXJhbWV0ZXJzKGV4cHJlc3Npb25PYmosIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ICYmIG9wdGlvbnMuZXhwcmVzc2lvbkNvbnRleHQuaW5kZXhPZignY2x1c3RlcicpID09PSAwKSB7XG4gICAgICAgIGlmICghaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50KGV4cHJlc3Npb25PYmosIFsnem9vbScsICdmZWF0dXJlLXN0YXRlJ10pKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdcInpvb21cIiBhbmQgXCJmZWF0dXJlLXN0YXRlXCIgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBjbHVzdGVyIHByb3BlcnRpZXMuJyldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmV4cHJlc3Npb25Db250ZXh0ID09PSAnY2x1c3Rlci1pbml0aWFsJyAmJiAhaXNGZWF0dXJlQ29uc3RhbnQoZXhwcmVzc2lvbk9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ0ZlYXR1cmUgZGF0YSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIGluaXRpYWwgZXhwcmVzc2lvbiBwYXJ0IG9mIGNsdXN0ZXIgcHJvcGVydGllcy4nKV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNhbGxvd2VkRmlsdGVyUGFyYW1ldGVycyhlOiBFeHByZXNzaW9uLCBvcHRpb25zOiBhbnkpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBkaXNhbGxvd2VkUGFyYW1ldGVycyA9IG5ldyBTZXQoW1xuICAgICAgICAnem9vbScsXG4gICAgICAgICdmZWF0dXJlLXN0YXRlJyxcbiAgICAgICAgJ3BpdGNoJyxcbiAgICAgICAgJ2Rpc3RhbmNlLWZyb20tY2VudGVyJ1xuICAgIF0pO1xuXG4gICAgaWYgKG9wdGlvbnMudmFsdWVTcGVjICYmIG9wdGlvbnMudmFsdWVTcGVjLmV4cHJlc3Npb24pIHtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBvcHRpb25zLnZhbHVlU3BlYy5leHByZXNzaW9uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGRpc2FsbG93ZWRQYXJhbWV0ZXJzLmRlbGV0ZShwYXJhbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlzYWxsb3dlZFBhcmFtZXRlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXG4gICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wb3VuZEV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGRpc2FsbG93ZWRQYXJhbWV0ZXJzLmhhcyhlLm5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsIGBbXCIke2UubmFtZX1cIl0gZXhwcmVzc2lvbiBpcyBub3Qgc3VwcG9ydGVkIGluIGEgZmlsdGVyIGZvciBhICR7b3B0aW9ucy5vYmplY3QudHlwZX0gbGF5ZXIgd2l0aCBpZDogJHtvcHRpb25zLm9iamVjdC5pZH1gKV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZS5lYWNoQ2hpbGQoKGFyZykgPT4ge1xuICAgICAgICBlcnJvcnMucHVzaCguLi5kaXNhbGxvd2VkRmlsdGVyUGFyYW1ldGVycyhhcmcsIG9wdGlvbnMpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmltcG9ydCB0eXBlIHtWYWxpZGF0aW9uT3B0aW9uc30gZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlQm9vbGVhbihvcHRpb25zOiBWYWxpZGF0aW9uT3B0aW9ucyk6IEFycmF5PFZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYm9vbGVhbiBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICByZXR1cm4gW107XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQge3BhcnNlQ1NTQ29sb3J9IGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuaW1wb3J0IHR5cGUge1ZhbGlkYXRpb25PcHRpb25zfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVDb2xvcihvcHRpb25zOiBWYWxpZGF0aW9uT3B0aW9ucyk6IEFycmF5PFZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApXTtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VDU1NDb2xvcih2YWx1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBjb2xvciBleHBlY3RlZCwgXCIke3ZhbHVlfVwiIGZvdW5kYCldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQge3VuYnVuZGxlfSBmcm9tICcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzJztcblxuaW1wb3J0IHR5cGUge1ZhbGlkYXRpb25PcHRpb25zfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVFbnVtKG9wdGlvbnM6IFZhbGlkYXRpb25PcHRpb25zKTogQXJyYXk8VmFsaWRhdGlvbkVycm9yPiB7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjO1xuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVTcGVjLnZhbHVlcykpIHsgLy8gPD12N1xuICAgICAgICBpZiAodmFsdWVTcGVjLnZhbHVlcy5pbmRleE9mKHVuYnVuZGxlKHZhbHVlKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBleHBlY3RlZCBvbmUgb2YgWyR7dmFsdWVTcGVjLnZhbHVlcy5qb2luKCcsICcpfV0sICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSBmb3VuZGApKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7IC8vID49djhcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlU3BlYy52YWx1ZXMpLmluZGV4T2YodW5idW5kbGUodmFsdWUpKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGV4cGVjdGVkIG9uZSBvZiBbJHtPYmplY3Qua2V5cyh2YWx1ZVNwZWMudmFsdWVzKS5qb2luKCcsICcpfV0sICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfSBmb3VuZGApKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtjcmVhdGVFeHByZXNzaW9ufSBmcm9tICcuLi9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB7aXNGZWF0dXJlQ29uc3RhbnR9IGZyb20gJy4uL2V4cHJlc3Npb24vaXNfY29uc3RhbnQuanMnO1xuaW1wb3J0IHtkZWVwVW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuaW1wb3J0IGxhdGVzdCBmcm9tICcuLi9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcbmltcG9ydCB0eXBlIHtHbG9iYWxQcm9wZXJ0aWVzLCBGZWF0dXJlfSBmcm9tICcuLi9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlRGlzdGFuY2VEYXRhID0ge2JlYXJpbmc6IFtudW1iZXIsIG51bWJlcl0sIGNlbnRlcjogW251bWJlciwgbnVtYmVyXSwgc2NhbGU6IG51bWJlcn07XG5leHBvcnQgdHlwZSBGaWx0ZXJFeHByZXNzaW9uID0gKGdsb2JhbFByb3BlcnRpZXM6IEdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmU6IEZlYXR1cmUsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgZmVhdHVyZVRpbGVDb29yZD86IFBvaW50LCBmZWF0dXJlRGlzdGFuY2VEYXRhPzogRmVhdHVyZURpc3RhbmNlRGF0YSkgPT4gYm9vbGVhbjtcbmV4cG9ydCB0eXBlIEZlYXR1cmVGaWx0ZXIgPSB7ZmlsdGVyOiBGaWx0ZXJFeHByZXNzaW9uLCBkeW5hbWljRmlsdGVyPzogRmlsdGVyRXhwcmVzc2lvbiwgbmVlZEdlb21ldHJ5OiBib29sZWFuLCBuZWVkRmVhdHVyZTogYm9vbGVhbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUZpbHRlcjtcbmV4cG9ydCB7aXNFeHByZXNzaW9uRmlsdGVyLCBpc0R5bmFtaWNGaWx0ZXIsIGV4dHJhY3RTdGF0aWNGaWx0ZXJ9O1xuXG5mdW5jdGlvbiBpc0V4cHJlc3Npb25GaWx0ZXIoZmlsdGVyOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoZmlsdGVyID09PSB0cnVlIHx8IGZpbHRlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGZpbHRlcikgfHwgZmlsdGVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN3aXRjaCAoZmlsdGVyWzBdKSB7XG4gICAgY2FzZSAnaGFzJzpcbiAgICAgICAgcmV0dXJuIGZpbHRlci5sZW5ndGggPj0gMiAmJiBmaWx0ZXJbMV0gIT09ICckaWQnICYmIGZpbHRlclsxXSAhPT0gJyR0eXBlJztcblxuICAgIGNhc2UgJ2luJzpcbiAgICAgICAgcmV0dXJuIGZpbHRlci5sZW5ndGggPj0gMyAmJiAodHlwZW9mIGZpbHRlclsxXSAhPT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheShmaWx0ZXJbMl0pKTtcblxuICAgIGNhc2UgJyFpbic6XG4gICAgY2FzZSAnIWhhcyc6XG4gICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNhc2UgJz09JzpcbiAgICBjYXNlICchPSc6XG4gICAgY2FzZSAnPic6XG4gICAgY2FzZSAnPj0nOlxuICAgIGNhc2UgJzwnOlxuICAgIGNhc2UgJzw9JzpcbiAgICAgICAgcmV0dXJuIGZpbHRlci5sZW5ndGggIT09IDMgfHwgKEFycmF5LmlzQXJyYXkoZmlsdGVyWzFdKSB8fCBBcnJheS5pc0FycmF5KGZpbHRlclsyXSkpO1xuXG4gICAgY2FzZSAnYW55JzpcbiAgICBjYXNlICdhbGwnOlxuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgZmlsdGVyLnNsaWNlKDEpKSB7XG4gICAgICAgICAgICBpZiAoIWlzRXhwcmVzc2lvbkZpbHRlcihmKSAmJiB0eXBlb2YgZiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGEgZmlsdGVyIGV4cHJlc3NlZCBhcyBuZXN0ZWQgYXJyYXlzLCByZXR1cm4gYSBuZXcgZnVuY3Rpb25cbiAqIHRoYXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlICh3aXRoIGEgLnByb3BlcnRpZXMgb3IgLnRhZ3MgcHJvcGVydHkpXG4gKiBwYXNzZXMgaXRzIHRlc3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlciBtYXBib3ggZ2wgZmlsdGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJUeXBlIHRoZSB0eXBlIG9mIHRoZSBsYXllciB0aGlzIGZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdG8uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGZpbHRlci1ldmFsdWF0aW5nIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlcihmaWx0ZXI6IGFueSwgbGF5ZXJUeXBlPzogc3RyaW5nID0gJ2ZpbGwnKTogRmVhdHVyZUZpbHRlciB7XG4gICAgaWYgKGZpbHRlciA9PT0gbnVsbCB8fCBmaWx0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge2ZpbHRlcjogKCkgPT4gdHJ1ZSwgbmVlZEdlb21ldHJ5OiBmYWxzZSwgbmVlZEZlYXR1cmU6IGZhbHNlfTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRXhwcmVzc2lvbkZpbHRlcihmaWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IGNvbnZlcnRGaWx0ZXIoZmlsdGVyKTtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyRXhwID0gKChmaWx0ZXI6IGFueSk6IHN0cmluZ1tdIHwgc3RyaW5nIHwgYm9vbGVhbik7XG5cbiAgICBsZXQgc3RhdGljRmlsdGVyID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgICBzdGF0aWNGaWx0ZXIgPSBleHRyYWN0U3RhdGljRmlsdGVyKGZpbHRlckV4cCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG5gRmFpbGVkIHRvIGV4dHJhY3Qgc3RhdGljIGZpbHRlci4gRmlsdGVyIHdpbGwgY29udGludWUgd29ya2luZywgYnV0IGF0IGhpZ2hlciBtZW1vcnkgdXNhZ2UgYW5kIHNsb3dlciBmcmFtZXJhdGUuXG5UaGlzIGlzIG1vc3QgbGlrZWx5IGEgYnVnLCBwbGVhc2UgcmVwb3J0IHRoaXMgdmlhIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy9uZXc/YXNzaWduZWVzPSZsYWJlbHM9JnRlbXBsYXRlPUJ1Z19yZXBvcnQubWRcbmFuZCBwYXN0ZSB0aGUgY29udGVudHMgb2YgdGhpcyBtZXNzYWdlIGluIHRoZSByZXBvcnQuXG5UaGFuayB5b3UhXG5GaWx0ZXIgRXhwcmVzc2lvbjpcbiR7SlNPTi5zdHJpbmdpZnkoZmlsdGVyRXhwLCBudWxsLCAyKX1cbiAgICAgICAgYCk7XG4gICAgfVxuXG4gICAgLy8gQ29tcGlsZSB0aGUgc3RhdGljIGNvbXBvbmVudCBvZiB0aGUgZmlsdGVyXG4gICAgY29uc3QgZmlsdGVyU3BlYyA9IGxhdGVzdFtgZmlsdGVyXyR7bGF5ZXJUeXBlfWBdO1xuICAgIGNvbnN0IGNvbXBpbGVkU3RhdGljRmlsdGVyID0gY3JlYXRlRXhwcmVzc2lvbihzdGF0aWNGaWx0ZXIsIGZpbHRlclNwZWMpO1xuXG4gICAgbGV0IGZpbHRlckZ1bmMgPSBudWxsO1xuICAgIGlmIChjb21waWxlZFN0YXRpY0ZpbHRlci5yZXN1bHQgPT09ICdlcnJvcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBpbGVkU3RhdGljRmlsdGVyLnZhbHVlLm1hcChlcnIgPT4gYCR7ZXJyLmtleX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbignLCAnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZmlsdGVyRnVuYyA9IChnbG9iYWxQcm9wZXJ0aWVzOiBHbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlOiBGZWF0dXJlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQpID0+IGNvbXBpbGVkU3RhdGljRmlsdGVyLnZhbHVlLmV2YWx1YXRlKGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzdGF0aWMgY29tcG9uZW50IGlzIG5vdCBlcXVhbCB0byB0aGUgZW50aXJlIGZpbHRlciB0aGVuIHdlIGhhdmUgYSBkeW5hbWljIGNvbXBvbmVudFxuICAgIC8vIENvbXBpbGUgdGhlIGR5bmFtaWMgY29tcG9uZW50IHNlcGFyYXRlbHlcbiAgICBsZXQgZHluYW1pY0ZpbHRlckZ1bmMgPSBudWxsO1xuICAgIGxldCBuZWVkRmVhdHVyZSA9IG51bGw7XG4gICAgaWYgKHN0YXRpY0ZpbHRlciAhPT0gZmlsdGVyRXhwKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkRHluYW1pY0ZpbHRlciA9IGNyZWF0ZUV4cHJlc3Npb24oZmlsdGVyRXhwLCBmaWx0ZXJTcGVjKTtcblxuICAgICAgICBpZiAoY29tcGlsZWREeW5hbWljRmlsdGVyLnJlc3VsdCA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBpbGVkRHluYW1pY0ZpbHRlci52YWx1ZS5tYXAoZXJyID0+IGAke2Vyci5rZXl9OiAke2Vyci5tZXNzYWdlfWApLmpvaW4oJywgJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHluYW1pY0ZpbHRlckZ1bmMgPSAoZ2xvYmFsUHJvcGVydGllczogR2xvYmFsUHJvcGVydGllcywgZmVhdHVyZTogRmVhdHVyZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBmZWF0dXJlVGlsZUNvb3JkPzogUG9pbnQsIGZlYXR1cmVEaXN0YW5jZURhdGE/OiBGZWF0dXJlRGlzdGFuY2VEYXRhKSA9PiBjb21waWxlZER5bmFtaWNGaWx0ZXIudmFsdWUuZXZhbHVhdGUoZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZSwge30sIGNhbm9uaWNhbCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGZlYXR1cmVUaWxlQ29vcmQsIGZlYXR1cmVEaXN0YW5jZURhdGEpO1xuICAgICAgICAgICAgbmVlZEZlYXR1cmUgPSAhaXNGZWF0dXJlQ29uc3RhbnQoY29tcGlsZWREeW5hbWljRmlsdGVyLnZhbHVlLmV4cHJlc3Npb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZmlsdGVyRnVuYyA9ICgoZmlsdGVyRnVuYzogYW55KTogRmlsdGVyRXhwcmVzc2lvbik7XG4gICAgY29uc3QgbmVlZEdlb21ldHJ5ID0gZ2VvbWV0cnlOZWVkZWQoc3RhdGljRmlsdGVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGZpbHRlcjogZmlsdGVyRnVuYyxcbiAgICAgICAgZHluYW1pY0ZpbHRlcjogZHluYW1pY0ZpbHRlckZ1bmMgPyBkeW5hbWljRmlsdGVyRnVuYyA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmVlZEdlb21ldHJ5LFxuICAgICAgICBuZWVkRmVhdHVyZTogISFuZWVkRmVhdHVyZVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RTdGF0aWNGaWx0ZXIoZmlsdGVyOiBhbnkpOiBhbnkge1xuICAgIGlmICghaXNEeW5hbWljRmlsdGVyKGZpbHRlcikpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9XG5cbiAgICAvLyBTaGFsbG93IGNvcHkgc28gd2UgY2FuIHJlcGxhY2UgZXhwcmVzc2lvbnMgaW4tcGxhY2VcbiAgICBsZXQgcmVzdWx0ID0gZGVlcFVuYnVuZGxlKGZpbHRlcik7XG5cbiAgICAvLyAxLiBVbmlvbiBicmFuY2hlc1xuICAgIHVuaW9uRHluYW1pY0JyYW5jaGVzKHJlc3VsdCk7XG5cbiAgICAvLyAyLiBDb2xsYXBzZSBkeW5hbWljIGNvbmRpdGlvbnMgdG8gIGB0cnVlYFxuICAgIHJlc3VsdCA9IGNvbGxhcHNlRHluYW1pY0Jvb2xlYW5FeHByZXNzaW9ucyhyZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29sbGFwc2VEeW5hbWljQm9vbGVhbkV4cHJlc3Npb25zKGV4cHJlc3Npb246IGFueSk6IGFueSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24pKSB7XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbGxhcHNlZCA9IGNvbGxhcHNlZEV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgaWYgKGNvbGxhcHNlZCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gY29sbGFwc2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb2xsYXBzZWQubWFwKChzdWJFeHByZXNzaW9uKSA9PiBjb2xsYXBzZUR5bmFtaWNCb29sZWFuRXhwcmVzc2lvbnMoc3ViRXhwcmVzc2lvbikpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXMgdGhlIGV4cHJlc3Npb24gYW5kIHJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgYnJhbmNoaW5nIG9uIGFcbiAqIGBkeW5hbWljYCBjb25kaXRpb25hbCAoc3VjaCBhcyBgWydwaXRjaCddYCBvciBgWydkaXN0YW5jZS1mcm9tLWNlbnRlciddYClcbiAqIGludG8gYW4gYGFueWAgZXhwcmVzc2lvbi5cbiAqIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCBwb3NzaWJsZSBvdXRjb21lcyBvZiBhIGBkeW5hbWljYCBicmFuY2ggYXJlIGNvbnNpZGVyZWRcbiAqIHdoZW4gZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiB1cGZyb250IGR1cmluZyBmaWx0ZXJpbmcuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBmaWx0ZXIgdGhlIGZpbHRlciBleHByZXNzaW9uIG11dGF0ZWQgaW4tcGxhY2UuXG4gKi9cbmZ1bmN0aW9uIHVuaW9uRHluYW1pY0JyYW5jaGVzKGZpbHRlcjogYW55KSB7XG4gICAgbGV0IGlzQnJhbmNoaW5nRHluYW1pY2FsbHkgPSBmYWxzZTtcbiAgICBjb25zdCBicmFuY2hlcyA9IFtdO1xuXG4gICAgaWYgKGZpbHRlclswXSA9PT0gJ2Nhc2UnKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlsdGVyLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgaXNCcmFuY2hpbmdEeW5hbWljYWxseSA9IGlzQnJhbmNoaW5nRHluYW1pY2FsbHkgfHwgaXNEeW5hbWljRmlsdGVyKGZpbHRlcltpXSk7XG4gICAgICAgICAgICBicmFuY2hlcy5wdXNoKGZpbHRlcltpICsgMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJhbmNoZXMucHVzaChmaWx0ZXJbZmlsdGVyLmxlbmd0aCAtIDFdKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlclswXSA9PT0gJ21hdGNoJykge1xuICAgICAgICBpc0JyYW5jaGluZ0R5bmFtaWNhbGx5ID0gaXNCcmFuY2hpbmdEeW5hbWljYWxseSB8fCBpc0R5bmFtaWNGaWx0ZXIoZmlsdGVyWzFdKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IGZpbHRlci5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICAgICAgICAgIGJyYW5jaGVzLnB1c2goZmlsdGVyW2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJhbmNoZXMucHVzaChmaWx0ZXJbZmlsdGVyLmxlbmd0aCAtIDFdKTtcbiAgICB9IGVsc2UgaWYgKGZpbHRlclswXSA9PT0gJ3N0ZXAnKSB7XG4gICAgICAgIGlzQnJhbmNoaW5nRHluYW1pY2FsbHkgPSBpc0JyYW5jaGluZ0R5bmFtaWNhbGx5IHx8IGlzRHluYW1pY0ZpbHRlcihmaWx0ZXJbMV0pO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlsdGVyLmxlbmd0aCAtIDE7IGkgKz0gMikge1xuICAgICAgICAgICAgYnJhbmNoZXMucHVzaChmaWx0ZXJbaSArIDFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0JyYW5jaGluZ0R5bmFtaWNhbGx5KSB7XG4gICAgICAgIGZpbHRlci5sZW5ndGggPSAwO1xuICAgICAgICBmaWx0ZXIucHVzaCgnYW55JywgLi4uYnJhbmNoZXMpO1xuICAgIH1cblxuICAgIC8vIHRyYXZlcnNlIGFuZCByZWN1cnNlIGludG8gY2hpbGRyZW5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGZpbHRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICB1bmlvbkR5bmFtaWNCcmFuY2hlcyhmaWx0ZXJbaV0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNEeW5hbWljRmlsdGVyKGZpbHRlcjogYW55KTogYm9vbGVhbiB7XG4gICAgLy8gQmFzZSBDYXNlc1xuICAgIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGlzUm9vdEV4cHJlc3Npb25EeW5hbWljKGZpbHRlclswXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBmaWx0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBmaWx0ZXJbaV07XG4gICAgICAgIGlmIChpc0R5bmFtaWNGaWx0ZXIoY2hpbGQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNSb290RXhwcmVzc2lvbkR5bmFtaWMoZXhwcmVzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24gPT09ICdwaXRjaCcgfHxcbiAgICAgICAgZXhwcmVzc2lvbiA9PT0gJ2Rpc3RhbmNlLWZyb20tY2VudGVyJztcbn1cblxuY29uc3QgZHluYW1pY0NvbmRpdGlvbkV4cHJlc3Npb25zID0gbmV3IFNldChbXG4gICAgJ2luJyxcbiAgICAnPT0nLFxuICAgICchPScsXG4gICAgJz4nLFxuICAgICc+PScsXG4gICAgJzwnLFxuICAgICc8PScsXG4gICAgJ3RvLWJvb2xlYW4nXG5dKTtcblxuZnVuY3Rpb24gY29sbGFwc2VkRXhwcmVzc2lvbihleHByZXNzaW9uOiBhbnkpOiBhbnkge1xuICAgIGlmIChkeW5hbWljQ29uZGl0aW9uRXhwcmVzc2lvbnMuaGFzKGV4cHJlc3Npb25bMF0pKSB7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBleHByZXNzaW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbSA9IGV4cHJlc3Npb25baV07XG4gICAgICAgICAgICBpZiAoaXNEeW5hbWljRmlsdGVyKHBhcmFtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHByZXNzaW9uO1xufVxuXG4vLyBDb21wYXJpc29uIGZ1bmN0aW9uIHRvIHNvcnQgbnVtYmVycyBhbmQgc3RyaW5nc1xuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuXG5mdW5jdGlvbiBnZW9tZXRyeU5lZWRlZChmaWx0ZXIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChmaWx0ZXJbMF0gPT09ICd3aXRoaW4nKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgZmlsdGVyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBpZiAoZ2VvbWV0cnlOZWVkZWQoZmlsdGVyW2luZGV4XSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGaWx0ZXIoZmlsdGVyOiA/QXJyYXk8YW55Pik6IG1peGVkIHtcbiAgICBpZiAoIWZpbHRlcikgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgb3AgPSBmaWx0ZXJbMF07XG4gICAgaWYgKGZpbHRlci5sZW5ndGggPD0gMSkgcmV0dXJuIChvcCAhPT0gJ2FueScpO1xuICAgIGNvbnN0IGNvbnZlcnRlZCA9XG4gICAgICAgIG9wID09PSAnPT0nID8gY29udmVydENvbXBhcmlzb25PcChmaWx0ZXJbMV0sIGZpbHRlclsyXSwgJz09JykgOlxuICAgICAgICBvcCA9PT0gJyE9JyA/IGNvbnZlcnROZWdhdGlvbihjb252ZXJ0Q29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCAnPT0nKSkgOlxuICAgICAgICBvcCA9PT0gJzwnIHx8XG4gICAgICAgIG9wID09PSAnPicgfHxcbiAgICAgICAgb3AgPT09ICc8PScgfHxcbiAgICAgICAgb3AgPT09ICc+PScgPyBjb252ZXJ0Q29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCBvcCkgOlxuICAgICAgICBvcCA9PT0gJ2FueScgPyBjb252ZXJ0RGlzanVuY3Rpb25PcChmaWx0ZXIuc2xpY2UoMSkpIDpcbiAgICAgICAgb3AgPT09ICdhbGwnID8gWydhbGwnXS5jb25jYXQoZmlsdGVyLnNsaWNlKDEpLm1hcChjb252ZXJ0RmlsdGVyKSkgOlxuICAgICAgICBvcCA9PT0gJ25vbmUnID8gWydhbGwnXS5jb25jYXQoZmlsdGVyLnNsaWNlKDEpLm1hcChjb252ZXJ0RmlsdGVyKS5tYXAoY29udmVydE5lZ2F0aW9uKSkgOlxuICAgICAgICBvcCA9PT0gJ2luJyA/IGNvbnZlcnRJbk9wKGZpbHRlclsxXSwgZmlsdGVyLnNsaWNlKDIpKSA6XG4gICAgICAgIG9wID09PSAnIWluJyA/IGNvbnZlcnROZWdhdGlvbihjb252ZXJ0SW5PcChmaWx0ZXJbMV0sIGZpbHRlci5zbGljZSgyKSkpIDpcbiAgICAgICAgb3AgPT09ICdoYXMnID8gY29udmVydEhhc09wKGZpbHRlclsxXSkgOlxuICAgICAgICBvcCA9PT0gJyFoYXMnID8gY29udmVydE5lZ2F0aW9uKGNvbnZlcnRIYXNPcChmaWx0ZXJbMV0pKSA6XG4gICAgICAgIG9wID09PSAnd2l0aGluJyA/IGZpbHRlciA6XG4gICAgICAgIHRydWU7XG4gICAgcmV0dXJuIGNvbnZlcnRlZDtcbn1cblxuZnVuY3Rpb24gY29udmVydENvbXBhcmlzb25PcChwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcDogc3RyaW5nKSB7XG4gICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgIGNhc2UgJyR0eXBlJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLXR5cGUtJHtvcH1gLCB2YWx1ZV07XG4gICAgY2FzZSAnJGlkJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWlkLSR7b3B9YCwgdmFsdWVdO1xuICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci0ke29wfWAsIHByb3BlcnR5LCB2YWx1ZV07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0RGlzanVuY3Rpb25PcChmaWx0ZXJzOiBBcnJheTxBcnJheTxhbnk+Pikge1xuICAgIHJldHVybiBbJ2FueSddLmNvbmNhdChmaWx0ZXJzLm1hcChjb252ZXJ0RmlsdGVyKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRJbk9wKHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlczogQXJyYXk8YW55Pikge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICckdHlwZSc6XG4gICAgICAgIHJldHVybiBbYGZpbHRlci10eXBlLWluYCwgWydsaXRlcmFsJywgdmFsdWVzXV07XG4gICAgY2FzZSAnJGlkJzpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWlkLWluYCwgWydsaXRlcmFsJywgdmFsdWVzXV07XG4gICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAyMDAgJiYgIXZhbHVlcy5zb21lKHYgPT4gdHlwZW9mIHYgIT09IHR5cGVvZiB2YWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gWydmaWx0ZXItaW4tbGFyZ2UnLCBwcm9wZXJ0eSwgWydsaXRlcmFsJywgdmFsdWVzLnNvcnQoY29tcGFyZSldXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbJ2ZpbHRlci1pbi1zbWFsbCcsIHByb3BlcnR5LCBbJ2xpdGVyYWwnLCB2YWx1ZXNdXTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY29udmVydEhhc09wKHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgY2FzZSAnJHR5cGUnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICckaWQnOlxuICAgICAgICByZXR1cm4gW2BmaWx0ZXItaGFzLWlkYF07XG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtgZmlsdGVyLWhhc2AsIHByb3BlcnR5XTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnROZWdhdGlvbihmaWx0ZXI6IG1peGVkKSB7XG4gICAgcmV0dXJuIFsnIScsIGZpbHRlcl07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHZhbGlkYXRlRXhwcmVzc2lvbiBmcm9tICcuL3ZhbGlkYXRlX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHZhbGlkYXRlRW51bSBmcm9tICcuL3ZhbGlkYXRlX2VudW0uanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQge3VuYnVuZGxlLCBkZWVwVW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuaW1wb3J0IGV4dGVuZCBmcm9tICcuLi91dGlsL2V4dGVuZC5qcyc7XG5pbXBvcnQge2lzRXhwcmVzc2lvbkZpbHRlcn0gZnJvbSAnLi4vZmVhdHVyZV9maWx0ZXIvaW5kZXguanMnO1xuXG5pbXBvcnQgdHlwZSB7VmFsaWRhdGlvbk9wdGlvbnN9IGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG50eXBlIE9wdGlvbnMgPSBWYWxpZGF0aW9uT3B0aW9ucyAmIHtcbiAgICBsYXllclR5cGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVGaWx0ZXIob3B0aW9uczogT3B0aW9ucyk6IEFycmF5PFZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGlmIChpc0V4cHJlc3Npb25GaWx0ZXIoZGVlcFVuYnVuZGxlKG9wdGlvbnMudmFsdWUpKSkge1xuICAgICAgICAvLyBXZSBkZWZhdWx0IHRvIGEgbGF5ZXJUeXBlIG9mIGBmaWxsYCBiZWNhdXNlIHRoYXQgcG9pbnRzIHRvIGEgbm9uLWR5bmFtaWMgZmlsdGVyIGRlZmluaXRpb24gd2l0aGluIHRoZSBzdHlsZS1zcGVjLlxuICAgICAgICBjb25zdCBsYXllclR5cGUgPSBvcHRpb25zLmxheWVyVHlwZSB8fCAnZmlsbCc7XG5cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlRXhwcmVzc2lvbihleHRlbmQoe30sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiAnZmlsdGVyJyxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNbYGZpbHRlcl8ke2xheWVyVHlwZX1gXVxuICAgICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlTm9uRXhwcmVzc2lvbkZpbHRlcihvcHRpb25zKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTm9uRXhwcmVzc2lvbkZpbHRlcihvcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuXG4gICAgaWYgKGdldFR5cGUodmFsdWUpICE9PSAnYXJyYXknKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgYXJyYXkgZXhwZWN0ZWQsICR7Z2V0VHlwZSh2YWx1ZSl9IGZvdW5kYCldO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIGxldCB0eXBlO1xuXG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdmaWx0ZXIgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IDEgZWxlbWVudCcpXTtcbiAgICB9XG5cbiAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlRW51bSh7XG4gICAgICAgIGtleTogYCR7a2V5fVswXWAsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVswXSxcbiAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuZmlsdGVyX29wZXJhdG9yLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgIH0pKTtcblxuICAgIHN3aXRjaCAodW5idW5kbGUodmFsdWVbMF0pKSB7XG4gICAgY2FzZSAnPCc6XG4gICAgY2FzZSAnPD0nOlxuICAgIGNhc2UgJz4nOlxuICAgIGNhc2UgJz49JzpcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+PSAyICYmIHVuYnVuZGxlKHZhbHVlWzFdKSA9PT0gJyR0eXBlJykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgXCIkdHlwZVwiIGNhbm5vdCBiZSB1c2Ugd2l0aCBvcGVyYXRvciBcIiR7dmFsdWVbMF19XCJgKSk7XG4gICAgICAgIH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgJz09JzpcbiAgICBjYXNlICchPSc6XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgYGZpbHRlciBhcnJheSBmb3Igb3BlcmF0b3IgXCIke3ZhbHVlWzBdfVwiIG11c3QgaGF2ZSAzIGVsZW1lbnRzYCkpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlICdpbic6XG4gICAgY2FzZSAnIWluJzpcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICB0eXBlID0gZ2V0VHlwZSh2YWx1ZVsxXSk7XG4gICAgICAgICAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bMV1gLCB2YWx1ZVsxXSwgYHN0cmluZyBleHBlY3RlZCwgJHt0eXBlfSBmb3VuZGApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0eXBlID0gZ2V0VHlwZSh2YWx1ZVtpXSk7XG4gICAgICAgICAgICBpZiAodW5idW5kbGUodmFsdWVbMV0pID09PSAnJHR5cGUnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUVudW0oe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGAke2tleX1bJHtpfV1gLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVbaV0sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmdlb21ldHJ5X3R5cGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSAnc3RyaW5nJyAmJiB0eXBlICE9PSAnbnVtYmVyJyAmJiB0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGAke2tleX1bJHtpfV1gLCB2YWx1ZVtpXSwgYHN0cmluZywgbnVtYmVyLCBvciBib29sZWFuIGV4cGVjdGVkLCAke3R5cGV9IGZvdW5kYCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYW55JzpcbiAgICBjYXNlICdhbGwnOlxuICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlTm9uRXhwcmVzc2lvbkZpbHRlcih7XG4gICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9WyR7aX1dYCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVbaV0sXG4gICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaGFzJzpcbiAgICBjYXNlICchaGFzJzpcbiAgICAgICAgdHlwZSA9IGdldFR5cGUodmFsdWVbMV0pO1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBmaWx0ZXIgYXJyYXkgZm9yIFwiJHt2YWx1ZVswXX1cIiBvcGVyYXRvciBtdXN0IGhhdmUgMiBlbGVtZW50c2ApKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgJHtrZXl9WzFdYCwgdmFsdWVbMV0sIGBzdHJpbmcgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSAnd2l0aGluJzpcbiAgICAgICAgdHlwZSA9IGdldFR5cGUodmFsdWVbMV0pO1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBmaWx0ZXIgYXJyYXkgZm9yIFwiJHt2YWx1ZVswXX1cIiBvcGVyYXRvciBtdXN0IGhhdmUgMiBlbGVtZW50c2ApKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihgJHtrZXl9WzFdYCwgdmFsdWVbMV0sIGBvYmplY3QgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQge2lzRnVuY3Rpb259IGZyb20gJy4uL2Z1bmN0aW9uL2luZGV4LmpzJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQge3N1cHBvcnRzUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi91dGlsL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7VmFsaWRhdGlvbk9wdGlvbnN9IGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVZhbGlkYXRpb25PcHRpb25zID0gVmFsaWRhdGlvbk9wdGlvbnMgJiB7XG4gICAgb2JqZWN0S2V5OiBzdHJpbmc7XG4gICAgbGF5ZXJUeXBlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkob3B0aW9uczogUHJvcGVydHlWYWxpZGF0aW9uT3B0aW9ucywgcHJvcGVydHlUeXBlOiBzdHJpbmcpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IHByb3BlcnR5S2V5ID0gb3B0aW9ucy5vYmplY3RLZXk7XG4gICAgY29uc3QgbGF5ZXJTcGVjID0gc3R5bGVTcGVjW2Ake3Byb3BlcnR5VHlwZX1fJHtvcHRpb25zLmxheWVyVHlwZX1gXTtcblxuICAgIGlmICghbGF5ZXJTcGVjKSByZXR1cm4gW107XG5cbiAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBwcm9wZXJ0eUtleS5tYXRjaCgvXiguKiktdHJhbnNpdGlvbiQvKTtcbiAgICBpZiAocHJvcGVydHlUeXBlID09PSAncGFpbnQnICYmIHRyYW5zaXRpb25NYXRjaCAmJiBsYXllclNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXSAmJiBsYXllclNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXS50cmFuc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnRyYW5zaXRpb24sXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYyB8fCBsYXllclNwZWNbcHJvcGVydHlLZXldO1xuICAgIGlmICghdmFsdWVTcGVjKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCBgdW5rbm93biBwcm9wZXJ0eSBcIiR7cHJvcGVydHlLZXl9XCJgKV07XG4gICAgfVxuXG4gICAgbGV0IHRva2VuTWF0Y2g7XG4gICAgaWYgKGdldFR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJiBzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbih2YWx1ZVNwZWMpICYmICF2YWx1ZVNwZWMudG9rZW5zICYmICh0b2tlbk1hdGNoID0gL157KFtefV0rKX0kLy5leGVjKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgICAga2V5LCB2YWx1ZSxcbiAgICAgICAgICAgIGBcIiR7cHJvcGVydHlLZXl9XCIgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcnBvbGF0aW9uIHN5bnRheFxcbmAgK1xuICAgICAgICAgICAgICAgIGBVc2UgYW4gaWRlbnRpdHkgcHJvcGVydHkgZnVuY3Rpb24gaW5zdGVhZDogXFxgeyBcInR5cGVcIjogXCJpZGVudGl0eVwiLCBcInByb3BlcnR5XCI6ICR7SlNPTi5zdHJpbmdpZnkodG9rZW5NYXRjaFsxXSl9IH1cXGAuYCldO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuXG4gICAgaWYgKG9wdGlvbnMubGF5ZXJUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICBpZiAocHJvcGVydHlLZXkgPT09ICd0ZXh0LWZpZWxkJyAmJiBzdHlsZSAmJiAhc3R5bGUuZ2x5cGhzKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICd1c2Ugb2YgXCJ0ZXh0LWZpZWxkXCIgcmVxdWlyZXMgYSBzdHlsZSBcImdseXBoc1wiIHByb3BlcnR5JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleSA9PT0gJ3RleHQtZm9udCcgJiYgaXNGdW5jdGlvbihkZWVwVW5idW5kbGUodmFsdWUpKSAmJiB1bmJ1bmRsZSh2YWx1ZS50eXBlKSA9PT0gJ2lkZW50aXR5Jykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnXCJ0ZXh0LWZvbnRcIiBkb2VzIG5vdCBzdXBwb3J0IGlkZW50aXR5IGZ1bmN0aW9ucycpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlU3BlYyxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgZXhwcmVzc2lvbkNvbnRleHQ6ICdwcm9wZXJ0eScsXG4gICAgICAgIHByb3BlcnR5VHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICB9KSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdmFsaWRhdGVQcm9wZXJ0eSBmcm9tICcuL3ZhbGlkYXRlX3Byb3BlcnR5LmpzJztcblxuaW1wb3J0IHR5cGUgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHR5cGUge1Byb3BlcnR5VmFsaWRhdGlvbk9wdGlvbnN9IGZyb20gJy4vdmFsaWRhdGVfcHJvcGVydHkuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVBhaW50UHJvcGVydHkob3B0aW9uczogUHJvcGVydHlWYWxpZGF0aW9uT3B0aW9ucyk6IEFycmF5PFZhbGlkYXRpb25FcnJvcj4ge1xuICAgIHJldHVybiB2YWxpZGF0ZVByb3BlcnR5KG9wdGlvbnMsICdwYWludCcpO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHZhbGlkYXRlUHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZV9wcm9wZXJ0eS5qcyc7XG5cbmltcG9ydCB0eXBlIFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCB0eXBlIHtQcm9wZXJ0eVZhbGlkYXRpb25PcHRpb25zfSBmcm9tICcuL3ZhbGlkYXRlX3Byb3BlcnR5LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eShvcHRpb25zOiBQcm9wZXJ0eVZhbGlkYXRpb25PcHRpb25zKTogQXJyYXk8VmFsaWRhdGlvbkVycm9yPiB7XG4gICAgcmV0dXJuIHZhbGlkYXRlUHJvcGVydHkob3B0aW9ucywgJ2xheW91dCcpO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCB7dW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuaW1wb3J0IHZhbGlkYXRlT2JqZWN0IGZyb20gJy4vdmFsaWRhdGVfb2JqZWN0LmpzJztcbmltcG9ydCB2YWxpZGF0ZUZpbHRlciBmcm9tICcuL3ZhbGlkYXRlX2ZpbHRlci5qcyc7XG5pbXBvcnQgdmFsaWRhdGVQYWludFByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGVfcGFpbnRfcHJvcGVydHkuanMnO1xuaW1wb3J0IHZhbGlkYXRlTGF5b3V0UHJvcGVydHkgZnJvbSAnLi92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHkuanMnO1xuaW1wb3J0IHZhbGlkYXRlU3BlYyBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmltcG9ydCBleHRlbmQgZnJvbSAnLi4vdXRpbC9leHRlbmQuanMnO1xuXG5pbXBvcnQgdHlwZSB7VmFsaWRhdGlvbk9wdGlvbnN9IGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG50eXBlIE9wdGlvbnMgPSBWYWxpZGF0aW9uT3B0aW9ucyAmIHtcbiAgICB2YWx1ZTogTGF5ZXJTcGVjaWZpY2F0aW9uO1xuICAgIGFycmF5SW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcihvcHRpb25zOiBPcHRpb25zKTogQXJyYXk8VmFsaWRhdGlvbkVycm9yPiB7XG4gICAgbGV0IGVycm9ycyA9IFtdO1xuXG4gICAgY29uc3QgbGF5ZXIgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IGtleSA9IG9wdGlvbnMua2V5O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcblxuICAgIGlmICghbGF5ZXIudHlwZSAmJiAhbGF5ZXIucmVmKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgJ2VpdGhlciBcInR5cGVcIiBvciBcInJlZlwiIGlzIHJlcXVpcmVkJykpO1xuICAgIH1cbiAgICBsZXQgdHlwZSA9IHVuYnVuZGxlKGxheWVyLnR5cGUpO1xuICAgIGNvbnN0IHJlZiA9IHVuYnVuZGxlKGxheWVyLnJlZik7XG5cbiAgICBpZiAobGF5ZXIuaWQpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHVuYnVuZGxlKGxheWVyLmlkKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmFycmF5SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJMYXllciA9IHN0eWxlLmxheWVyc1tpXTtcbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZShvdGhlckxheWVyLmlkKSA9PT0gbGF5ZXJJZCkge1xuICAgICAgICAgICAgICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXSAtIGlkLl9fbGluZV9fIGlzIGFkZGVkIGR5bmFtaWNhbGx5IGR1cmluZyB0aGUgcmVhZFN0eWxlIHN0ZXBcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuaWQsIGBkdXBsaWNhdGUgbGF5ZXIgaWQgXCIke2xheWVyLmlkfVwiLCBwcmV2aW91c2x5IHVzZWQgYXQgbGluZSAke290aGVyTGF5ZXIuaWQuX19saW5lX199YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdyZWYnIGluIGxheWVyKSB7XG4gICAgICAgIFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ2ZpbHRlcicsICdsYXlvdXQnXS5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAgICAgICBpZiAocCBpbiBsYXllcikge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllcltwXSwgYFwiJHtwfVwiIGlzIHByb2hpYml0ZWQgZm9yIHJlZiBsYXllcnNgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBwYXJlbnQ7XG5cbiAgICAgICAgc3R5bGUubGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XG4gICAgICAgICAgICBpZiAodW5idW5kbGUobGF5ZXIuaWQpID09PSByZWYpIHBhcmVudCA9IGxheWVyO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWYgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5yZWYsIGByZWYgbGF5ZXIgXCIke3JlZn1cIiBub3QgZm91bmRgKSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyZW50LnJlZikge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLnJlZiwgJ3JlZiBjYW5ub3QgcmVmZXJlbmNlIGFub3RoZXIgcmVmIGxheWVyJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHlwZSA9IHVuYnVuZGxlKHBhcmVudC50eXBlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISh0eXBlID09PSAnYmFja2dyb3VuZCcgfHwgdHlwZSA9PT0gJ3NreScpKSB7XG4gICAgICAgIGlmICghbGF5ZXIuc291cmNlKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwic291cmNlXCInKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzdHlsZS5zb3VyY2VzICYmIHN0eWxlLnNvdXJjZXNbbGF5ZXIuc291cmNlXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBzb3VyY2UgJiYgdW5idW5kbGUoc291cmNlLnR5cGUpO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCBgc291cmNlIFwiJHtsYXllci5zb3VyY2V9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VUeXBlID09PSAndmVjdG9yJyAmJiB0eXBlID09PSAncmFzdGVyJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5zb3VyY2UsIGBsYXllciBcIiR7bGF5ZXIuaWR9XCIgcmVxdWlyZXMgYSByYXN0ZXIgc291cmNlYCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VUeXBlID09PSAncmFzdGVyJyAmJiB0eXBlICE9PSAncmFzdGVyJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5zb3VyY2UsIGBsYXllciBcIiR7bGF5ZXIuaWR9XCIgcmVxdWlyZXMgYSB2ZWN0b3Igc291cmNlYCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VUeXBlID09PSAndmVjdG9yJyAmJiAhbGF5ZXJbJ3NvdXJjZS1sYXllciddKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLCBgbGF5ZXIgXCIke2xheWVyLmlkfVwiIG11c3Qgc3BlY2lmeSBhIFwic291cmNlLWxheWVyXCJgKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgPT09ICdyYXN0ZXItZGVtJyAmJiB0eXBlICE9PSAnaGlsbHNoYWRlJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5zb3VyY2UsICdyYXN0ZXItZGVtIHNvdXJjZSBjYW4gb25seSBiZSB1c2VkIHdpdGggbGF5ZXIgdHlwZSBcXCdoaWxsc2hhZGVcXCcuJykpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbGluZScgJiYgbGF5ZXIucGFpbnQgJiYgKGxheWVyLnBhaW50WydsaW5lLWdyYWRpZW50J10gfHwgbGF5ZXIucGFpbnRbJ2xpbmUtdHJpbS1vZmZzZXQnXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZVR5cGUgIT09ICdnZW9qc29uJyB8fCAhc291cmNlLmxpbmVNZXRyaWNzKSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgYGxheWVyIFwiJHtsYXllci5pZH1cIiBzcGVjaWZpZXMgYSBsaW5lLWdyYWRpZW50LCB3aGljaCByZXF1aXJlcyBhIEdlb0pTT04gc291cmNlIHdpdGggXFxgbGluZU1ldHJpY3NcXGAgZW5hYmxlZC5gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogbGF5ZXIsXG4gICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmxheWVyLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgICcqJygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBlbmZvcmNlIHRoZSBzcGVjJ3MgYFwicmVxdWlyZXNcIjogdHJ1ZWAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCByZWZzO1xuICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCByZXF1aXJlbWVudCBpcyB2YWxpZGF0ZWQgYWJvdmUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNTc3Mi5cbiAgICAgICAgICAgIHR5cGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3BlYyh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogYCR7a2V5fS50eXBlYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGxheWVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLmxheWVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBvYmplY3RLZXk6ICd0eXBlJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpbHRlcihvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlRmlsdGVyKGV4dGVuZCh7bGF5ZXJUeXBlOiB0eXBlfSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxheW91dChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHt9LFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICcqJyhvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlTGF5b3V0UHJvcGVydHkoZXh0ZW5kKHtsYXllclR5cGU6IHR5cGV9LCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYWludChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHt9LFxuICAgICAgICAgICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYyxcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICcqJyhvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlUGFpbnRQcm9wZXJ0eShleHRlbmQoe2xheWVyVHlwZTogdHlwZX0sIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBnZXRUeXBlIGZyb20gJy4uL3V0aWwvZ2V0X3R5cGUuanMnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcblxuaW1wb3J0IHR5cGUge1ZhbGlkYXRpb25PcHRpb25zfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcob3B0aW9uczogJFNoYXBlPFZhbGlkYXRpb25PcHRpb25zPik6IEFycmF5PFZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsIGBzdHJpbmcgZXhwZWN0ZWQsICR7dHlwZX0gZm91bmRgKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcbmltcG9ydCB7dW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuaW1wb3J0IHZhbGlkYXRlT2JqZWN0IGZyb20gJy4vdmFsaWRhdGVfb2JqZWN0LmpzJztcbmltcG9ydCB2YWxpZGF0ZUVudW0gZnJvbSAnLi92YWxpZGF0ZV9lbnVtLmpzJztcbmltcG9ydCB2YWxpZGF0ZUV4cHJlc3Npb24gZnJvbSAnLi92YWxpZGF0ZV9leHByZXNzaW9uLmpzJztcbmltcG9ydCB2YWxpZGF0ZVN0cmluZyBmcm9tICcuL3ZhbGlkYXRlX3N0cmluZy5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcblxuaW1wb3J0IHR5cGUge1ZhbGlkYXRpb25PcHRpb25zfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuY29uc3Qgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnMgPSB7XG4gICAgcHJvbW90ZUlkOiB2YWxpZGF0ZVByb21vdGVJZFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVTb3VyY2Uob3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnMpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3Qgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgaWYgKCF2YWx1ZS50eXBlKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnXCJ0eXBlXCIgaXMgcmVxdWlyZWQnKV07XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZSA9IHVuYnVuZGxlKHZhbHVlLnR5cGUpO1xuICAgIGxldCBlcnJvcnM7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd2ZWN0b3InOlxuICAgIGNhc2UgJ3Jhc3Rlcic6XG4gICAgY2FzZSAncmFzdGVyLWRlbSc6XG4gICAgICAgIGVycm9ycyA9IHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWNbYHNvdXJjZV8ke3R5cGUucmVwbGFjZSgnLScsICdfJyl9YF0sXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgY2FzZSAnZ2VvanNvbic6XG4gICAgICAgIGVycm9ycyA9IHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX2dlb2pzb24sXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodmFsdWUuY2x1c3Rlcikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHZhbHVlLmNsdXN0ZXJQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW29wZXJhdG9yLCBtYXBFeHByXSA9IHZhbHVlLmNsdXN0ZXJQcm9wZXJ0aWVzW3Byb3BdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZHVjZUV4cHIgPSB0eXBlb2Ygb3BlcmF0b3IgPT09ICdzdHJpbmcnID8gW29wZXJhdG9yLCBbJ2FjY3VtdWxhdGVkJ10sIFsnZ2V0JywgcHJvcF1dIDogb3BlcmF0b3I7XG5cbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZUV4cHJlc3Npb24oe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGAke2tleX0uJHtwcm9wfS5tYXBgLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWFwRXhwcixcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbkNvbnRleHQ6ICdjbHVzdGVyLW1hcCdcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVFeHByZXNzaW9uKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBgJHtrZXl9LiR7cHJvcH0ucmVkdWNlYCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlZHVjZUV4cHIsXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25Db250ZXh0OiAnY2x1c3Rlci1yZWR1Y2UnXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnNvdXJjZV92aWRlbyxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuXG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5zb3VyY2VfaW1hZ2UsXG4gICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KTtcblxuICAgIGNhc2UgJ2NhbnZhcyc6XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIG51bGwsIGBQbGVhc2UgdXNlIHJ1bnRpbWUgQVBJcyB0byBhZGQgY2FudmFzIHNvdXJjZXMsIHJhdGhlciB0aGFuIGluY2x1ZGluZyB0aGVtIGluIHN0eWxlc2hlZXRzLmAsICdzb3VyY2UuY2FudmFzJyldO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlRW51bSh7XG4gICAgICAgICAgICBrZXk6IGAke2tleX0udHlwZWAsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUudHlwZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzoge3ZhbHVlczogWyd2ZWN0b3InLCAncmFzdGVyJywgJ3Jhc3Rlci1kZW0nLCAnZ2VvanNvbicsICd2aWRlbycsICdpbWFnZSddfSxcbiAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9tb3RlSWQoe2tleSwgdmFsdWV9KSB7XG4gICAgaWYgKGdldFR5cGUodmFsdWUpID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVTdHJpbmcoe2tleSwgdmFsdWV9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHZhbHVlKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZyh7a2V5OiBgJHtrZXl9LiR7cHJvcH1gLCB2YWx1ZTogdmFsdWVbcHJvcF19KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IGdldFR5cGUgZnJvbSAnLi4vdXRpbC9nZXRfdHlwZS5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtWYWxpZGF0aW9uT3B0aW9uc30gZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTGlnaHQob3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnMpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBsaWdodCA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3QgbGlnaHRTcGVjID0gc3R5bGVTcGVjLmxpZ2h0O1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcblxuICAgIGxldCBlcnJvcnMgPSBbXTtcblxuICAgIGNvbnN0IHJvb3RUeXBlID0gZ2V0VHlwZShsaWdodCk7XG4gICAgaWYgKGxpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9IGVsc2UgaWYgKHJvb3RUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKCdsaWdodCcsIGxpZ2h0LCBgb2JqZWN0IGV4cGVjdGVkLCAke3Jvb3RUeXBlfSBmb3VuZGApXSk7XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gbGlnaHQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbk1hdGNoID0ga2V5Lm1hdGNoKC9eKC4qKS10cmFuc2l0aW9uJC8pO1xuXG4gICAgICAgIGlmICh0cmFuc2l0aW9uTWF0Y2ggJiYgbGlnaHRTcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0gJiYgbGlnaHRTcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0udHJhbnNpdGlvbikge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBsaWdodFtrZXldLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnRyYW5zaXRpb24sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGlnaHRTcGVjW2tleV0pIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbGlnaHRba2V5XSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IGxpZ2h0U3BlY1trZXldLFxuICAgICAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdChbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxpZ2h0W2tleV0sIGB1bmtub3duIHByb3BlcnR5IFwiJHtrZXl9XCJgKV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCB7dW5idW5kbGV9IGZyb20gJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQuanMnO1xuXG5pbXBvcnQgdHlwZSB7VmFsaWRhdGlvbk9wdGlvbnN9IGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZVRlcnJhaW4ob3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnMpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCB0ZXJyYWluID0gb3B0aW9ucy52YWx1ZTtcbiAgICBjb25zdCBrZXkgPSBvcHRpb25zLmtleTtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3QgdGVycmFpblNwZWMgPSBzdHlsZVNwZWMudGVycmFpbjtcbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBjb25zdCByb290VHlwZSA9IGdldFR5cGUodGVycmFpbik7XG4gICAgaWYgKHRlcnJhaW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ3RlcnJhaW4nLCB0ZXJyYWluLCBgb2JqZWN0IGV4cGVjdGVkLCAke3Jvb3RUeXBlfSBmb3VuZGApXSk7XG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGVycmFpbikge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uTWF0Y2ggPSBrZXkubWF0Y2goL14oLiopLXRyYW5zaXRpb24kLyk7XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiB0ZXJyYWluU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dICYmIHRlcnJhaW5TcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0udHJhbnNpdGlvbikge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0ZXJyYWluW2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZXJyYWluU3BlY1trZXldKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRlcnJhaW5ba2V5XSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHRlcnJhaW5TcGVjW2tleV0sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdGVycmFpbltrZXldLCBgdW5rbm93biBwcm9wZXJ0eSBcIiR7a2V5fVwiYCldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGVycmFpbi5zb3VyY2UpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHRlcnJhaW4sIGB0ZXJyYWluIGlzIG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJzb3VyY2VcImApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBzdHlsZS5zb3VyY2VzICYmIHN0eWxlLnNvdXJjZXNbdGVycmFpbi5zb3VyY2VdO1xuICAgICAgICBjb25zdCBzb3VyY2VUeXBlID0gc291cmNlICYmIHVuYnVuZGxlKHNvdXJjZS50eXBlKTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB0ZXJyYWluLnNvdXJjZSwgYHNvdXJjZSBcIiR7dGVycmFpbi5zb3VyY2V9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZVR5cGUgIT09ICdyYXN0ZXItZGVtJykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHRlcnJhaW4uc291cmNlLCBgdGVycmFpbiBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgc291cmNlIG9mIHR5cGUgJHtTdHJpbmcoc291cmNlVHlwZSl9LCBpdCBvbmx5IGJlIHVzZWQgd2l0aCBhIFwicmFzdGVyLWRlbVwiIHNvdXJjZSB0eXBlYCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcblxuaW1wb3J0IHR5cGUge1ZhbGlkYXRpb25PcHRpb25zfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVGb2cob3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnMpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCBmb2cgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICBjb25zdCBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICBjb25zdCBmb2dTcGVjID0gc3R5bGVTcGVjLmZvZztcbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBjb25zdCByb290VHlwZSA9IGdldFR5cGUoZm9nKTtcbiAgICBpZiAoZm9nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9IGVsc2UgaWYgKHJvb3RUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKCdmb2cnLCBmb2csIGBvYmplY3QgZXhwZWN0ZWQsICR7cm9vdFR5cGV9IGZvdW5kYCldKTtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmb2cpIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbk1hdGNoID0ga2V5Lm1hdGNoKC9eKC4qKS10cmFuc2l0aW9uJC8pO1xuXG4gICAgICAgIGlmICh0cmFuc2l0aW9uTWF0Y2ggJiYgZm9nU3BlY1t0cmFuc2l0aW9uTWF0Y2hbMV1dICYmIGZvZ1NwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZvZ1trZXldLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnRyYW5zaXRpb24sXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9nU3BlY1trZXldKSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlKHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZvZ1trZXldLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogZm9nU3BlY1trZXldLFxuICAgICAgICAgICAgICAgIHN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdChbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGZvZ1trZXldLCBgdW5rbm93biBwcm9wZXJ0eSBcIiR7a2V5fVwiYCldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdmFsaWRhdGVTdHJpbmcgZnJvbSAnLi92YWxpZGF0ZV9zdHJpbmcuanMnO1xuXG5pbXBvcnQgdHlwZSB7VmFsaWRhdGlvbk9wdGlvbnN9IGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IHR5cGUgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdHRlZChvcHRpb25zOiBWYWxpZGF0aW9uT3B0aW9ucyk6IEFycmF5PFZhbGlkYXRpb25FcnJvcj4ge1xuICAgIGlmICh2YWxpZGF0ZVN0cmluZyhvcHRpb25zKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0ZUV4cHJlc3Npb24ob3B0aW9ucyk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdmFsaWRhdGVTdHJpbmcgZnJvbSAnLi92YWxpZGF0ZV9zdHJpbmcuanMnO1xuXG5pbXBvcnQgdHlwZSB7VmFsaWRhdGlvbk9wdGlvbnN9IGZyb20gJy4vdmFsaWRhdGUuanMnO1xuaW1wb3J0IHR5cGUgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB2YWxpZGF0ZUltYWdlKG9wdGlvbnM6IFZhbGlkYXRpb25PcHRpb25zKTogQXJyYXk8VmFsaWRhdGlvbkVycm9yPiB7XG4gICAgaWYgKHZhbGlkYXRlU3RyaW5nKG9wdGlvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlRXhwcmVzc2lvbihvcHRpb25zKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBWYWxpZGF0aW9uRXJyb3IgZnJvbSAnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5pbXBvcnQgZ2V0VHlwZSBmcm9tICcuLi91dGlsL2dldF90eXBlLmpzJztcbmltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuaW1wb3J0IHR5cGUge1ZhbGlkYXRpb25PcHRpb25zfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVQcm9qZWN0aW9uKG9wdGlvbnM6IFZhbGlkYXRpb25PcHRpb25zKTogQXJyYXk8VmFsaWRhdGlvbkVycm9yPiB7XG4gICAgY29uc3QgcHJvamVjdGlvbiA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgY29uc3QgcHJvamVjdGlvblNwZWMgPSBzdHlsZVNwZWMucHJvamVjdGlvbjtcbiAgICBjb25zdCBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG5cbiAgICBsZXQgZXJyb3JzID0gW107XG5cbiAgICBjb25zdCByb290VHlwZSA9IGdldFR5cGUocHJvamVjdGlvbik7XG5cbiAgICBpZiAocm9vdFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb2plY3Rpb24pIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvamVjdGlvbltrZXldLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogcHJvamVjdGlvblNwZWNba2V5XSxcbiAgICAgICAgICAgICAgICBzdHlsZSxcbiAgICAgICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAocm9vdFR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3IoJ3Byb2plY3Rpb24nLCBwcm9qZWN0aW9uLCBgb2JqZWN0IG9yIHN0cmluZyBleHBlY3RlZCwgJHtyb290VHlwZX0gZm91bmRgKV0pO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3V0aWwvZXh0ZW5kLmpzJztcbmltcG9ydCB7dW5idW5kbGUsIGRlZXBVbmJ1bmRsZX0gZnJvbSAnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludC5qcyc7XG5pbXBvcnQge2lzRXhwcmVzc2lvbn0gZnJvbSAnLi4vZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQge2lzRnVuY3Rpb259IGZyb20gJy4uL2Z1bmN0aW9uL2luZGV4LmpzJztcblxuaW1wb3J0IHZhbGlkYXRlRnVuY3Rpb24gZnJvbSAnLi92YWxpZGF0ZV9mdW5jdGlvbi5qcyc7XG5pbXBvcnQgdmFsaWRhdGVFeHByZXNzaW9uIGZyb20gJy4vdmFsaWRhdGVfZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgdmFsaWRhdGVPYmplY3QgZnJvbSAnLi92YWxpZGF0ZV9vYmplY3QuanMnO1xuaW1wb3J0IHZhbGlkYXRlQXJyYXkgZnJvbSAnLi92YWxpZGF0ZV9hcnJheS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVCb29sZWFuIGZyb20gJy4vdmFsaWRhdGVfYm9vbGVhbi5qcyc7XG5pbXBvcnQgdmFsaWRhdGVOdW1iZXIgZnJvbSAnLi92YWxpZGF0ZV9udW1iZXIuanMnO1xuaW1wb3J0IHZhbGlkYXRlQ29sb3IgZnJvbSAnLi92YWxpZGF0ZV9jb2xvci5qcyc7XG5pbXBvcnQgdmFsaWRhdGVFbnVtIGZyb20gJy4vdmFsaWRhdGVfZW51bS5qcyc7XG5pbXBvcnQgdmFsaWRhdGVGaWx0ZXIgZnJvbSAnLi92YWxpZGF0ZV9maWx0ZXIuanMnO1xuaW1wb3J0IHZhbGlkYXRlTGF5ZXIgZnJvbSAnLi92YWxpZGF0ZV9sYXllci5qcyc7XG5pbXBvcnQgdmFsaWRhdGVTb3VyY2UgZnJvbSAnLi92YWxpZGF0ZV9zb3VyY2UuanMnO1xuaW1wb3J0IHZhbGlkYXRlTGlnaHQgZnJvbSAnLi92YWxpZGF0ZV9saWdodC5qcyc7XG5pbXBvcnQgdmFsaWRhdGVUZXJyYWluIGZyb20gJy4vdmFsaWRhdGVfdGVycmFpbi5qcyc7XG5pbXBvcnQgdmFsaWRhdGVGb2cgZnJvbSAnLi92YWxpZGF0ZV9mb2cuanMnO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nLmpzJztcbmltcG9ydCB2YWxpZGF0ZUZvcm1hdHRlZCBmcm9tICcuL3ZhbGlkYXRlX2Zvcm1hdHRlZC5qcyc7XG5pbXBvcnQgdmFsaWRhdGVJbWFnZSBmcm9tICcuL3ZhbGlkYXRlX2ltYWdlLmpzJztcbmltcG9ydCB2YWxpZGF0ZVByb2plY3Rpb24gZnJvbSAnLi92YWxpZGF0ZV9wcm9qZWN0aW9uLmpzJztcblxuaW1wb3J0IHR5cGUge1N0eWxlUmVmZXJlbmNlfSBmcm9tICcuLi9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcbmltcG9ydCB0eXBlIHtTdHlsZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzJztcblxuY29uc3QgVkFMSURBVE9SUyA9IHtcbiAgICAnKicoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuICAgICdhcnJheSc6IHZhbGlkYXRlQXJyYXksXG4gICAgJ2Jvb2xlYW4nOiB2YWxpZGF0ZUJvb2xlYW4sXG4gICAgJ251bWJlcic6IHZhbGlkYXRlTnVtYmVyLFxuICAgICdjb2xvcic6IHZhbGlkYXRlQ29sb3IsXG4gICAgJ2VudW0nOiB2YWxpZGF0ZUVudW0sXG4gICAgJ2ZpbHRlcic6IHZhbGlkYXRlRmlsdGVyLFxuICAgICdmdW5jdGlvbic6IHZhbGlkYXRlRnVuY3Rpb24sXG4gICAgJ2xheWVyJzogdmFsaWRhdGVMYXllcixcbiAgICAnb2JqZWN0JzogdmFsaWRhdGVPYmplY3QsXG4gICAgJ3NvdXJjZSc6IHZhbGlkYXRlU291cmNlLFxuICAgICdsaWdodCc6IHZhbGlkYXRlTGlnaHQsXG4gICAgJ3RlcnJhaW4nOiB2YWxpZGF0ZVRlcnJhaW4sXG4gICAgJ2ZvZyc6IHZhbGlkYXRlRm9nLFxuICAgICdzdHJpbmcnOiB2YWxpZGF0ZVN0cmluZyxcbiAgICAnZm9ybWF0dGVkJzogdmFsaWRhdGVGb3JtYXR0ZWQsXG4gICAgJ3Jlc29sdmVkSW1hZ2UnOiB2YWxpZGF0ZUltYWdlLFxuICAgICdwcm9qZWN0aW9uJzogdmFsaWRhdGVQcm9qZWN0aW9uXG59O1xuXG4vLyBNYWluIHJlY3Vyc2l2ZSB2YWxpZGF0aW9uIGZ1bmN0aW9uLiBUcmFja3M6XG4vL1xuLy8gLSBrZXk6IHN0cmluZyByZXByZXNlbnRpbmcgbG9jYXRpb24gb2YgdmFsaWRhdGlvbiBpbiBzdHlsZSB0cmVlLiBVc2VkIG9ubHlcbi8vICAgZm9yIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3IgcmVwb3J0aW5nLlxuLy8gLSB2YWx1ZTogY3VycmVudCB2YWx1ZSBmcm9tIHN0eWxlIGJlaW5nIGV2YWx1YXRlZC4gTWF5IGJlIGFueXRoaW5nIGZyb20gYVxuLy8gICBoaWdoIGxldmVsIG9iamVjdCB0aGF0IG5lZWRzIHRvIGJlIGRlc2NlbmRlZCBpbnRvIGRlZXBlciBvciBhIHNpbXBsZVxuLy8gICBzY2FsYXIgdmFsdWUuXG4vLyAtIHZhbHVlU3BlYzogY3VycmVudCBzcGVjIGJlaW5nIGV2YWx1YXRlZC4gVHJhY2tzIHZhbHVlLlxuLy8gLSBzdHlsZVNwZWM6IGN1cnJlbnQgZnVsbCBzcGVjIGJlaW5nIGV2YWx1YXRlZC5cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25PcHRpb25zID0ge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBPYmplY3Q7XG4gICAgdmFsdWVTcGVjOiBPYmplY3Q7XG4gICAgc3R5bGU6ICRTaGFwZTxTdHlsZVNwZWNpZmljYXRpb24+O1xuICAgIHN0eWxlU3BlYzogU3R5bGVSZWZlcmVuY2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlKG9wdGlvbnM6IFZhbGlkYXRpb25PcHRpb25zKTogQXJyYXk8VmFsaWRhdGlvbkVycm9yPiB7XG4gICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIGNvbnN0IHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjO1xuICAgIGNvbnN0IHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuXG4gICAgaWYgKHZhbHVlU3BlYy5leHByZXNzaW9uICYmIGlzRnVuY3Rpb24odW5idW5kbGUodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVGdW5jdGlvbihvcHRpb25zKTtcblxuICAgIH0gZWxzZSBpZiAodmFsdWVTcGVjLmV4cHJlc3Npb24gJiYgaXNFeHByZXNzaW9uKGRlZXBVbmJ1bmRsZSh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUV4cHJlc3Npb24ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2UgaWYgKHZhbHVlU3BlYy50eXBlICYmIFZBTElEQVRPUlNbdmFsdWVTcGVjLnR5cGVdKSB7XG4gICAgICAgIHJldHVybiBWQUxJREFUT1JTW3ZhbHVlU3BlYy50eXBlXShvcHRpb25zKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdmFsaWRhdGVPYmplY3QoZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHZhbHVlU3BlYy50eXBlID8gc3R5bGVTcGVjW3ZhbHVlU3BlYy50eXBlXSA6IHZhbHVlU3BlY1xuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuaW1wb3J0IHZhbGlkYXRlU3RyaW5nIGZyb20gJy4vdmFsaWRhdGVfc3RyaW5nLmpzJztcblxuaW1wb3J0IHR5cGUge1ZhbGlkYXRpb25PcHRpb25zfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ob3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnMpOiBBcnJheTxWYWxpZGF0aW9uRXJyb3I+IHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgY29uc3Qga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZVN0cmluZyhvcHRpb25zKTtcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkgcmV0dXJuIGVycm9ycztcblxuICAgIGlmICh2YWx1ZS5pbmRleE9mKCd7Zm9udHN0YWNrfScpID09PSAtMSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdcImdseXBoc1wiIHVybCBtdXN0IGluY2x1ZGUgYSBcIntmb250c3RhY2t9XCIgdG9rZW4nKSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoJ3tyYW5nZX0nKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnXCJnbHlwaHNcIiB1cmwgbXVzdCBpbmNsdWRlIGEgXCJ7cmFuZ2V9XCIgdG9rZW4nKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgdmFsaWRhdGUgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZS5qcyc7XG5pbXBvcnQgbGF0ZXN0U3R5bGVTcGVjIGZyb20gJy4vcmVmZXJlbmNlL2xhdGVzdC5qcyc7XG5pbXBvcnQgdmFsaWRhdGVHbHlwaHNVUkwgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9nbHlwaHNfdXJsLmpzJztcblxuaW1wb3J0IF92YWxpZGF0ZVNvdXJjZSBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX3NvdXJjZS5qcyc7XG5pbXBvcnQgX3ZhbGlkYXRlTGlnaHQgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9saWdodC5qcyc7XG5pbXBvcnQgX3ZhbGlkYXRlVGVycmFpbiBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX3RlcnJhaW4uanMnO1xuaW1wb3J0IF92YWxpZGF0ZUZvZyBmcm9tICcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZvZy5qcyc7XG5pbXBvcnQgX3ZhbGlkYXRlTGF5ZXIgZnJvbSAnLi92YWxpZGF0ZS92YWxpZGF0ZV9sYXllci5qcyc7XG5pbXBvcnQgX3ZhbGlkYXRlRmlsdGVyIGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfZmlsdGVyLmpzJztcbmltcG9ydCBfdmFsaWRhdGVQYWludFByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHkuanMnO1xuaW1wb3J0IF92YWxpZGF0ZUxheW91dFByb3BlcnR5IGZyb20gJy4vdmFsaWRhdGUvdmFsaWRhdGVfbGF5b3V0X3Byb3BlcnR5LmpzJztcblxuaW1wb3J0IHR5cGUge1N0eWxlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25FcnJvciA9IHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgaWRlbnRpZmllcj86ID9zdHJpbmc7XG4gICAgbGluZT86ID9udW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgVmFsaWRhdGlvbkVycm9ycyA9ICRSZWFkT25seUFycmF5PFZhbGlkYXRpb25FcnJvcj47XG5leHBvcnQgdHlwZSBWYWxpZGF0b3IgPSAoT2JqZWN0KSA9PiBWYWxpZGF0aW9uRXJyb3JzO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgTWFwYm94IEdMIHN0eWxlIGFnYWluc3QgdGhlIHN0eWxlIHNwZWNpZmljYXRpb24uIFRoaXMgZW50cnlwb2ludCxcbiAqIGBtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluYCwgaXMgZGVzaWduZWQgdG8gcHJvZHVjZSBhc1xuICogc21hbGwgYSBicm93c2VyaWZ5IGJ1bmRsZSBhcyBwb3NzaWJsZSBieSBvbWl0dGluZyB1bm5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5XG4gKiBhbmQgbGVnYWN5IHN0eWxlIHNwZWNpZmljYXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gc3R5bGUgVGhlIHN0eWxlIHRvIGJlIHZhbGlkYXRlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbc3R5bGVTcGVjXSBUaGUgc3R5bGUgc3BlY2lmaWNhdGlvbiB0byB2YWxpZGF0ZSBhZ2FpbnN0LlxuICogICAgIElmIG9taXR0ZWQsIHRoZSBsYXRlc3Qgc3R5bGUgc3BlYyBpcyB1c2VkLlxuICogQHJldHVybnMge0FycmF5PFZhbGlkYXRpb25FcnJvcj59XG4gKiBAZXhhbXBsZVxuICogICB2YXIgdmFsaWRhdGUgPSByZXF1aXJlKCdtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluJyk7XG4gKiAgIHZhciBlcnJvcnMgPSB2YWxpZGF0ZShzdHlsZSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVN0eWxlKHN0eWxlOiBTdHlsZVNwZWNpZmljYXRpb24sIHN0eWxlU3BlYzogT2JqZWN0ID0gbGF0ZXN0U3R5bGVTcGVjKTogVmFsaWRhdGlvbkVycm9ycyB7XG5cbiAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZSh7XG4gICAgICAgIGtleTogJycsXG4gICAgICAgIHZhbHVlOiBzdHlsZSxcbiAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuJHJvb3QsXG4gICAgICAgIHN0eWxlU3BlYyxcbiAgICAgICAgc3R5bGUsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICBnbHlwaHM6IHZhbGlkYXRlR2x5cGhzVVJMLFxuICAgICAgICAgICAgJyonOiAoKSA9PiBbXVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNvcnRFcnJvcnMoZXJyb3JzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlU291cmNlOiBWYWxpZGF0b3IgPSBvcHRzID0+IHNvcnRFcnJvcnMoX3ZhbGlkYXRlU291cmNlKG9wdHMpKTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxpZ2h0OiBWYWxpZGF0b3IgPSBvcHRzID0+IHNvcnRFcnJvcnMoX3ZhbGlkYXRlTGlnaHQob3B0cykpO1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVGVycmFpbjogVmFsaWRhdG9yID0gb3B0cyA9PiBzb3J0RXJyb3JzKF92YWxpZGF0ZVRlcnJhaW4ob3B0cykpO1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRm9nOiBWYWxpZGF0b3IgPSBvcHRzID0+IHNvcnRFcnJvcnMoX3ZhbGlkYXRlRm9nKG9wdHMpKTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxheWVyOiBWYWxpZGF0b3IgPSBvcHRzID0+IHNvcnRFcnJvcnMoX3ZhbGlkYXRlTGF5ZXIob3B0cykpO1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRmlsdGVyOiBWYWxpZGF0b3IgPSBvcHRzID0+IHNvcnRFcnJvcnMoX3ZhbGlkYXRlRmlsdGVyKG9wdHMpKTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVBhaW50UHJvcGVydHk6IFZhbGlkYXRvciA9IG9wdHMgPT4gc29ydEVycm9ycyhfdmFsaWRhdGVQYWludFByb3BlcnR5KG9wdHMpKTtcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUxheW91dFByb3BlcnR5OiBWYWxpZGF0b3IgPSBvcHRzID0+IHNvcnRFcnJvcnMoX3ZhbGlkYXRlTGF5b3V0UHJvcGVydHkob3B0cykpO1xuXG5mdW5jdGlvbiBzb3J0RXJyb3JzKGVycm9ycykge1xuICAgIHJldHVybiBlcnJvcnMuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiBhLmxpbmUgJiYgYi5saW5lID8gYS5saW5lIC0gYi5saW5lIDogMCk7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtFcnJvckV2ZW50fSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSB7RXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCB0eXBlIHtWYWxpZGF0aW9uRXJyb3JzIGFzIF9WYWxpZGF0aW9uRXJyb3JzfSBmcm9tICcuLi9zdHlsZS1zcGVjL3ZhbGlkYXRlX3N0eWxlLm1pbi5qcyc7XG5cbmV4cG9ydCB0eXBlIHtWYWxpZGF0b3IsIFZhbGlkYXRpb25FcnJvcnN9IGZyb20gJy4uL3N0eWxlLXNwZWMvdmFsaWRhdGVfc3R5bGUubWluLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVtaXRWYWxpZGF0aW9uRXJyb3JzKGVtaXR0ZXI6IEV2ZW50ZWQsIGVycm9yczogP19WYWxpZGF0aW9uRXJyb3JzKTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0Vycm9ycyA9IGZhbHNlO1xuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIGVycm9ycykge1xuICAgICAgICAgICAgZW1pdHRlci5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihlcnJvci5tZXNzYWdlKSkpO1xuICAgICAgICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzRXJyb3JzO1xufVxuXG5leHBvcnQge1xuICAgIHZhbGlkYXRlU3R5bGUsXG4gICAgdmFsaWRhdGVTb3VyY2UsXG4gICAgdmFsaWRhdGVMaWdodCxcbiAgICB2YWxpZGF0ZVRlcnJhaW4sXG4gICAgdmFsaWRhdGVGb2csXG4gICAgdmFsaWRhdGVMYXllcixcbiAgICB2YWxpZGF0ZUZpbHRlcixcbiAgICB2YWxpZGF0ZVBhaW50UHJvcGVydHksXG4gICAgdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eVxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3ZhbGlkYXRlX3N0eWxlLm1pbi5qcyc7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gR3JpZEluZGV4O1xuXG52YXIgTlVNX1BBUkFNUyA9IDM7XG5cbmZ1bmN0aW9uIEdyaWRJbmRleChleHRlbnQsIG4sIHBhZGRpbmcpIHtcbiAgICB2YXIgY2VsbHMgPSB0aGlzLmNlbGxzID0gW107XG5cbiAgICBpZiAoZXh0ZW50IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IGV4dGVudDtcbiAgICAgICAgdmFyIGFycmF5ID0gbmV3IEludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIGV4dGVudCA9IGFycmF5WzBdO1xuICAgICAgICBuID0gYXJyYXlbMV07XG4gICAgICAgIHBhZGRpbmcgPSBhcnJheVsyXTtcblxuICAgICAgICB0aGlzLmQgPSBuICsgMiAqIHBhZGRpbmc7XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5kICogdGhpcy5kOyBrKyspIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGFycmF5W05VTV9QQVJBTVMgKyBrXTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBhcnJheVtOVU1fUEFSQU1TICsgayArIDFdO1xuICAgICAgICAgICAgY2VsbHMucHVzaChzdGFydCA9PT0gZW5kID9cbiAgICAgICAgICAgICAgICAgICAgbnVsbCA6XG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnN1YmFycmF5KHN0YXJ0LCBlbmQpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIga2V5c09mZnNldCA9IGFycmF5W05VTV9QQVJBTVMgKyBjZWxscy5sZW5ndGhdO1xuICAgICAgICB2YXIgYmJveGVzT2Zmc2V0ID0gYXJyYXlbTlVNX1BBUkFNUyArIGNlbGxzLmxlbmd0aCArIDFdO1xuICAgICAgICB0aGlzLmtleXMgPSBhcnJheS5zdWJhcnJheShrZXlzT2Zmc2V0LCBiYm94ZXNPZmZzZXQpO1xuICAgICAgICB0aGlzLmJib3hlcyA9IGFycmF5LnN1YmFycmF5KGJib3hlc09mZnNldCk7XG5cbiAgICAgICAgdGhpcy5pbnNlcnQgPSB0aGlzLl9pbnNlcnRSZWFkb25seTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZCA9IG4gKyAyICogcGFkZGluZztcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmQgKiB0aGlzLmQ7IGkrKykge1xuICAgICAgICAgICAgY2VsbHMucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5rZXlzID0gW107XG4gICAgICAgIHRoaXMuYmJveGVzID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5uID0gbjtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudDtcbiAgICB0aGlzLnBhZGRpbmcgPSBwYWRkaW5nO1xuICAgIHRoaXMuc2NhbGUgPSBuIC8gZXh0ZW50O1xuICAgIHRoaXMudWlkID0gMDtcblxuICAgIHZhciBwID0gKHBhZGRpbmcgLyBuKSAqIGV4dGVudDtcbiAgICB0aGlzLm1pbiA9IC1wO1xuICAgIHRoaXMubWF4ID0gZXh0ZW50ICsgcDtcbn1cblxuXG5HcmlkSW5kZXgucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uKGtleSwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgICB0aGlzLl9mb3JFYWNoQ2VsbCh4MSwgeTEsIHgyLCB5MiwgdGhpcy5faW5zZXJ0Q2VsbCwgdGhpcy51aWQrKyk7XG4gICAgdGhpcy5rZXlzLnB1c2goa2V5KTtcbiAgICB0aGlzLmJib3hlcy5wdXNoKHgxKTtcbiAgICB0aGlzLmJib3hlcy5wdXNoKHkxKTtcbiAgICB0aGlzLmJib3hlcy5wdXNoKHgyKTtcbiAgICB0aGlzLmJib3hlcy5wdXNoKHkyKTtcbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX2luc2VydFJlYWRvbmx5ID0gZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgJ0Nhbm5vdCBpbnNlcnQgaW50byBhIEdyaWRJbmRleCBjcmVhdGVkIGZyb20gYW4gQXJyYXlCdWZmZXIuJztcbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX2luc2VydENlbGwgPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgY2VsbEluZGV4LCB1aWQpIHtcbiAgICB0aGlzLmNlbGxzW2NlbGxJbmRleF0ucHVzaCh1aWQpO1xufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5xdWVyeSA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBpbnRlcnNlY3Rpb25UZXN0KSB7XG4gICAgdmFyIG1pbiA9IHRoaXMubWluO1xuICAgIHZhciBtYXggPSB0aGlzLm1heDtcbiAgICBpZiAoeDEgPD0gbWluICYmIHkxIDw9IG1pbiAmJiBtYXggPD0geDIgJiYgbWF4IDw9IHkyICYmICFpbnRlcnNlY3Rpb25UZXN0KSB7XG4gICAgICAgIC8vIFdlIHVzZSBgQXJyYXkjc2xpY2VgIGJlY2F1c2UgYHRoaXMua2V5c2AgbWF5IGJlIGEgYEludDMyQXJyYXlgIGFuZFxuICAgICAgICAvLyBzb21lIGJyb3dzZXJzIChTYWZhcmkgYW5kIElFKSBkbyBub3Qgc3VwcG9ydCBgVHlwZWRBcnJheSNzbGljZWBcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvVHlwZWRBcnJheS9zbGljZSNCcm93c2VyX2NvbXBhdGliaWxpdHlcbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMua2V5cyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHZhciBzZWVuVWlkcyA9IHt9O1xuICAgICAgICB0aGlzLl9mb3JFYWNoQ2VsbCh4MSwgeTEsIHgyLCB5MiwgdGhpcy5fcXVlcnlDZWxsLCByZXN1bHQsIHNlZW5VaWRzLCBpbnRlcnNlY3Rpb25UZXN0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLl9xdWVyeUNlbGwgPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgY2VsbEluZGV4LCByZXN1bHQsIHNlZW5VaWRzLCBpbnRlcnNlY3Rpb25UZXN0KSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxzW2NlbGxJbmRleF07XG4gICAgaWYgKGNlbGwgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGtleXMgPSB0aGlzLmtleXM7XG4gICAgICAgIHZhciBiYm94ZXMgPSB0aGlzLmJib3hlcztcbiAgICAgICAgZm9yICh2YXIgdSA9IDA7IHUgPCBjZWxsLmxlbmd0aDsgdSsrKSB7XG4gICAgICAgICAgICB2YXIgdWlkID0gY2VsbFt1XTtcbiAgICAgICAgICAgIGlmIChzZWVuVWlkc1t1aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdWlkICogNDtcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uVGVzdCA/XG4gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdGlvblRlc3QoYmJveGVzW29mZnNldCArIDBdLCBiYm94ZXNbb2Zmc2V0ICsgMV0sIGJib3hlc1tvZmZzZXQgKyAyXSwgYmJveGVzW29mZnNldCArIDNdKSA6XG4gICAgICAgICAgICAgICAgICAgICgoeDEgPD0gYmJveGVzW29mZnNldCArIDJdKSAmJlxuICAgICAgICAgICAgICAgICAgICAoeTEgPD0gYmJveGVzW29mZnNldCArIDNdKSAmJlxuICAgICAgICAgICAgICAgICAgICAoeDIgPj0gYmJveGVzW29mZnNldCArIDBdKSAmJlxuICAgICAgICAgICAgICAgICAgICAoeTIgPj0gYmJveGVzW29mZnNldCArIDFdKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHNbdWlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGtleXNbdWlkXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHNbdWlkXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX2ZvckVhY2hDZWxsID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIGZuLCBhcmcxLCBhcmcyLCBpbnRlcnNlY3Rpb25UZXN0KSB7XG4gICAgdmFyIGN4MSA9IHRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZCh4MSk7XG4gICAgdmFyIGN5MSA9IHRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZCh5MSk7XG4gICAgdmFyIGN4MiA9IHRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZCh4Mik7XG4gICAgdmFyIGN5MiA9IHRoaXMuX2NvbnZlcnRUb0NlbGxDb29yZCh5Mik7XG4gICAgZm9yICh2YXIgeCA9IGN4MTsgeCA8PSBjeDI7IHgrKykge1xuICAgICAgICBmb3IgKHZhciB5ID0gY3kxOyB5IDw9IGN5MjsgeSsrKSB7XG4gICAgICAgICAgICB2YXIgY2VsbEluZGV4ID0gdGhpcy5kICogeSArIHg7XG4gICAgICAgICAgICBpZiAoaW50ZXJzZWN0aW9uVGVzdCAmJiAhaW50ZXJzZWN0aW9uVGVzdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnZlcnRGcm9tQ2VsbENvb3JkKHgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udmVydEZyb21DZWxsQ29vcmQoeSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZCh4ICsgMSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb252ZXJ0RnJvbUNlbGxDb29yZCh5ICsgMSkpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChmbi5jYWxsKHRoaXMsIHgxLCB5MSwgeDIsIHkyLCBjZWxsSW5kZXgsIGFyZzEsIGFyZzIsIGludGVyc2VjdGlvblRlc3QpKSByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLl9jb252ZXJ0RnJvbUNlbGxDb29yZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLnBhZGRpbmcpIC8gdGhpcy5zY2FsZTtcbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX2NvbnZlcnRUb0NlbGxDb29yZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5kIC0gMSwgTWF0aC5mbG9vcih4ICogdGhpcy5zY2FsZSkgKyB0aGlzLnBhZGRpbmcpKTtcbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUudG9BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmFycmF5QnVmZmVyKSByZXR1cm4gdGhpcy5hcnJheUJ1ZmZlcjtcblxuICAgIHZhciBjZWxscyA9IHRoaXMuY2VsbHM7XG5cbiAgICB2YXIgbWV0YWRhdGFMZW5ndGggPSBOVU1fUEFSQU1TICsgdGhpcy5jZWxscy5sZW5ndGggKyAxICsgMTtcbiAgICB2YXIgdG90YWxDZWxsTGVuZ3RoID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdG90YWxDZWxsTGVuZ3RoICs9IHRoaXMuY2VsbHNbaV0ubGVuZ3RoO1xuICAgIH1cblxuICAgIHZhciBhcnJheSA9IG5ldyBJbnQzMkFycmF5KG1ldGFkYXRhTGVuZ3RoICsgdG90YWxDZWxsTGVuZ3RoICsgdGhpcy5rZXlzLmxlbmd0aCArIHRoaXMuYmJveGVzLmxlbmd0aCk7XG4gICAgYXJyYXlbMF0gPSB0aGlzLmV4dGVudDtcbiAgICBhcnJheVsxXSA9IHRoaXMubjtcbiAgICBhcnJheVsyXSA9IHRoaXMucGFkZGluZztcblxuICAgIHZhciBvZmZzZXQgPSBtZXRhZGF0YUxlbmd0aDtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGNlbGxzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBjZWxsID0gY2VsbHNba107XG4gICAgICAgIGFycmF5W05VTV9QQVJBTVMgKyBrXSA9IG9mZnNldDtcbiAgICAgICAgYXJyYXkuc2V0KGNlbGwsIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSBjZWxsLmxlbmd0aDtcbiAgICB9XG5cbiAgICBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoXSA9IG9mZnNldDtcbiAgICBhcnJheS5zZXQodGhpcy5rZXlzLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSB0aGlzLmtleXMubGVuZ3RoO1xuXG4gICAgYXJyYXlbTlVNX1BBUkFNUyArIGNlbGxzLmxlbmd0aCArIDFdID0gb2Zmc2V0O1xuICAgIGFycmF5LnNldCh0aGlzLmJib3hlcywgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gdGhpcy5iYm94ZXMubGVuZ3RoO1xuXG4gICAgcmV0dXJuIGFycmF5LmJ1ZmZlcjtcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCBHcmlkIGZyb20gJ2dyaWQtaW5kZXgnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQge1N0eWxlUHJvcGVydHlGdW5jdGlvbiwgU3R5bGVFeHByZXNzaW9uLCBab29tRGVwZW5kZW50RXhwcmVzc2lvbiwgWm9vbUNvbnN0YW50RXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCBDb21wb3VuZEV4cHJlc3Npb24gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2NvbXBvdW5kX2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IGV4cHJlc3Npb25zIGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbmRleC5qcyc7XG5pbXBvcnQgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdy5qcyc7XG5pbXBvcnQge0FKQVhFcnJvcn0gZnJvbSAnLi9hamF4LmpzJztcblxuaW1wb3J0IHR5cGUge1RyYW5zZmVyYWJsZX0gZnJvbSAnLi4vdHlwZXMvdHJhbnNmZXJhYmxlLmpzJztcblxudHlwZSBTZXJpYWxpemVkT2JqZWN0ID0ge1tfOiBzdHJpbmddOiBTZXJpYWxpemVkIH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWQgPVxuICAgIHwgbnVsbFxuICAgIHwgdm9pZFxuICAgIHwgYm9vbGVhblxuICAgIHwgbnVtYmVyXG4gICAgfCBzdHJpbmdcbiAgICB8IEJvb2xlYW5cbiAgICB8IE51bWJlclxuICAgIHwgU3RyaW5nXG4gICAgfCBEYXRlXG4gICAgfCBSZWdFeHBcbiAgICB8IEFycmF5QnVmZmVyXG4gICAgfCAkQXJyYXlCdWZmZXJWaWV3XG4gICAgfCBJbWFnZURhdGFcbiAgICB8IEFycmF5PFNlcmlhbGl6ZWQ+XG4gICAgfCBTZXJpYWxpemVkT2JqZWN0O1xuXG50eXBlIFJlZ2lzdHJ5ID0ge1xuICAgIFtfOiBzdHJpbmddOiB7XG4gICAgICAgIGtsYXNzOiBDbGFzczxhbnk+LFxuICAgICAgICBvbWl0OiAkUmVhZE9ubHlBcnJheTxzdHJpbmc+XG4gICAgfVxufTtcblxudHlwZSBSZWdpc3Rlck9wdGlvbnM8VD4gPSB7XG4gICAgb21pdD86ICRSZWFkT25seUFycmF5PCRLZXlzPFQ+PlxufVxuXG5jb25zdCByZWdpc3RyeTogUmVnaXN0cnkgPSB7fTtcblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgZ2l2ZW4gY2xhc3MgYXMgc2VyaWFsaXphYmxlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gb3B0aW9ucy5vbWl0IExpc3Qgb2YgcHJvcGVydGllcyB0byBvbWl0IGZyb20gc2VyaWFsaXphdGlvbiAoZS5nLiwgY2FjaGVkL2NvbXB1dGVkIHByb3BlcnRpZXMpXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyPFQ6IGFueT4oa2xhc3M6IENsYXNzPFQ+LCBuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFJlZ2lzdGVyT3B0aW9uczxUPiA9IHt9KSB7XG4gICAgYXNzZXJ0KG5hbWUsICdDYW5cXCd0IHJlZ2lzdGVyIGEgY2xhc3Mgd2l0aG91dCBhIG5hbWUuJyk7XG4gICAgYXNzZXJ0KCFyZWdpc3RyeVtuYW1lXSwgYCR7bmFtZX0gaXMgYWxyZWFkeSByZWdpc3RlcmVkLmApO1xuICAgIChPYmplY3QuZGVmaW5lUHJvcGVydHk6IGFueSkoa2xhc3MsICdfY2xhc3NSZWdpc3RyeUtleScsIHtcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHdyaXRlYWJsZTogZmFsc2VcbiAgICB9KTtcbiAgICByZWdpc3RyeVtuYW1lXSA9IHtcbiAgICAgICAga2xhc3MsXG4gICAgICAgIG9taXQ6IG9wdGlvbnMub21pdCB8fCBbXVxuICAgIH07XG59XG5cbnJlZ2lzdGVyKE9iamVjdCwgJ09iamVjdCcpO1xuXG50eXBlIFNlcmlhbGl6ZWRHcmlkID0geyBidWZmZXI6IEFycmF5QnVmZmVyIH07XG5cbihHcmlkOiBhbnkpLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uIHNlcmlhbGl6ZShncmlkOiBHcmlkLCB0cmFuc2ZlcmFibGVzPzogQXJyYXk8VHJhbnNmZXJhYmxlPik6IFNlcmlhbGl6ZWRHcmlkIHtcbiAgICBjb25zdCBidWZmZXIgPSBncmlkLnRvQXJyYXlCdWZmZXIoKTtcbiAgICBpZiAodHJhbnNmZXJhYmxlcykge1xuICAgICAgICB0cmFuc2ZlcmFibGVzLnB1c2goYnVmZmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHtidWZmZXJ9O1xufTtcblxuKEdyaWQ6IGFueSkuZGVzZXJpYWxpemUgPSBmdW5jdGlvbiBkZXNlcmlhbGl6ZShzZXJpYWxpemVkOiBTZXJpYWxpemVkR3JpZCk6IEdyaWQge1xuICAgIHJldHVybiBuZXcgR3JpZChzZXJpYWxpemVkLmJ1ZmZlcik7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoR3JpZCwgJ25hbWUnLCB7dmFsdWU6ICdHcmlkJ30pO1xuXG5yZWdpc3RlcihHcmlkLCAnR3JpZCcpO1xuXG5yZWdpc3RlcihDb2xvciwgJ0NvbG9yJyk7XG5yZWdpc3RlcihFcnJvciwgJ0Vycm9yJyk7XG5yZWdpc3RlcihBSkFYRXJyb3IsICdBSkFYRXJyb3InKTtcbnJlZ2lzdGVyKFJlc29sdmVkSW1hZ2UsICdSZXNvbHZlZEltYWdlJyk7XG5yZWdpc3RlcihTdHlsZVByb3BlcnR5RnVuY3Rpb24sICdTdHlsZVByb3BlcnR5RnVuY3Rpb24nKTtcbnJlZ2lzdGVyKFN0eWxlRXhwcmVzc2lvbiwgJ1N0eWxlRXhwcmVzc2lvbicsIHtvbWl0OiBbJ19ldmFsdWF0b3InXX0pO1xuXG5yZWdpc3Rlcihab29tRGVwZW5kZW50RXhwcmVzc2lvbiwgJ1pvb21EZXBlbmRlbnRFeHByZXNzaW9uJyk7XG5yZWdpc3Rlcihab29tQ29uc3RhbnRFeHByZXNzaW9uLCAnWm9vbUNvbnN0YW50RXhwcmVzc2lvbicpO1xucmVnaXN0ZXIoQ29tcG91bmRFeHByZXNzaW9uLCAnQ29tcG91bmRFeHByZXNzaW9uJywge29taXQ6IFsnX2V2YWx1YXRlJ119KTtcbmZvciAoY29uc3QgbmFtZSBpbiBleHByZXNzaW9ucykge1xuICAgIGlmICghcmVnaXN0cnlbKGV4cHJlc3Npb25zW25hbWVdOiBhbnkpLl9jbGFzc1JlZ2lzdHJ5S2V5XSkgcmVnaXN0ZXIoZXhwcmVzc2lvbnNbbmFtZV0sIGBFeHByZXNzaW9uJHtuYW1lfWApO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbCAmJiB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICh2YWwgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCAodmFsLmNvbnN0cnVjdG9yICYmIHZhbC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXJyYXlCdWZmZXInKSk7XG59XG5cbmZ1bmN0aW9uIGlzSW1hZ2VCaXRtYXAodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93LkltYWdlQml0bWFwICYmXG4gICAgICAgIHZhbCBpbnN0YW5jZW9mIHdpbmRvdy5JbWFnZUJpdG1hcDtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemUgdGhlIGdpdmVuIG9iamVjdCBmb3IgdHJhbnNmZXIgdG8gb3IgZnJvbSBhIHdlYiB3b3JrZXIuXG4gKlxuICogRm9yIG5vbi1idWlsdGluIHR5cGVzLCByZWN1cnNpdmVseSBzZXJpYWxpemUgZWFjaCBwcm9wZXJ0eSAocG9zc2libHlcbiAqIG9taXR0aW5nIGNlcnRhaW4gcHJvcGVydGllcyAtIHNlZSByZWdpc3RlcigpKSwgYW5kIHBhY2thZ2UgdGhlIHJlc3VsdCBhbG9uZ1xuICogd2l0aCB0aGUgY29uc3RydWN0b3IncyBgbmFtZWAgc28gdGhhdCB0aGUgYXBwcm9wcmlhdGUgY29uc3RydWN0b3IgY2FuIGJlXG4gKiBsb29rZWQgdXAgaW4gYGRlc2VyaWFsaXplKClgLlxuICpcbiAqIElmIGEgYHRyYW5zZmVyYWJsZXNgIGFycmF5IGlzIHByb3ZpZGVkLCBhZGQgYW55IHRyYW5zZmVyYWJsZSBvYmplY3RzIChpLmUuLFxuICogYW55IEFycmF5QnVmZmVycyBvciBBcnJheUJ1ZmZlciB2aWV3cykgdG8gdGhlIGxpc3QuIChJZiBhIGNvcHkgaXMgbmVlZGVkLFxuICogdGhpcyBzaG91bGQgaGFwcGVuIGluIHRoZSBjbGllbnQgY29kZSwgYmVmb3JlIHVzaW5nIHNlcmlhbGl6ZSgpLilcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplKGlucHV0OiBtaXhlZCwgdHJhbnNmZXJhYmxlczogP0FycmF5PFRyYW5zZmVyYWJsZT4pOiBTZXJpYWxpemVkIHtcbiAgICBpZiAoaW5wdXQgPT09IG51bGwgfHxcbiAgICAgICAgaW5wdXQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdib29sZWFuJyB8fFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8XG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBCb29sZWFuIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgTnVtYmVyIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgU3RyaW5nIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXlCdWZmZXIoaW5wdXQpIHx8IGlzSW1hZ2VCaXRtYXAoaW5wdXQpKSB7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzLnB1c2goKChpbnB1dDogYW55KTogQXJyYXlCdWZmZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGlucHV0OiBhbnkpO1xuICAgIH1cblxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoaW5wdXQpKSB7XG4gICAgICAgIGNvbnN0IHZpZXc6ICRBcnJheUJ1ZmZlclZpZXcgPSAoaW5wdXQ6IGFueSk7XG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzLnB1c2godmlldy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aWV3O1xuICAgIH1cblxuICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIHdpbmRvdy5JbWFnZURhdGEpIHtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChpbnB1dC5kYXRhLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkOiBBcnJheTxTZXJpYWxpemVkPiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXQpIHtcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQucHVzaChzZXJpYWxpemUoaXRlbSwgdHJhbnNmZXJhYmxlcykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGtsYXNzID0gKGlucHV0LmNvbnN0cnVjdG9yOiBhbnkpO1xuICAgICAgICBjb25zdCBuYW1lID0ga2xhc3MuX2NsYXNzUmVnaXN0cnlLZXk7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBzZXJpYWxpemUgb2JqZWN0IG9mIHVucmVnaXN0ZXJlZCBjbGFzcyAke25hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHJlZ2lzdHJ5W25hbWVdKTtcblxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzOiBTZXJpYWxpemVkT2JqZWN0ID0ga2xhc3Muc2VyaWFsaXplID9cbiAgICAgICAgICAgIC8vIChUZW1wb3Jhcnkgd29ya2Fyb3VuZCkgYWxsb3cgYSBjbGFzcyB0byBwcm92aWRlIHN0YXRpY1xuICAgICAgICAgICAgLy8gYHNlcmlhbGl6ZSgpYCBhbmQgYGRlc2VyaWFsaXplKClgIG1ldGhvZHMgdG8gYnlwYXNzIHRoZSBnZW5lcmljXG4gICAgICAgICAgICAvLyBhcHByb2FjaC5cbiAgICAgICAgICAgIC8vIFRoaXMgdGVtcG9yYXJ5IHdvcmthcm91bmQgbGV0cyB1cyB1c2UgdGhlIGdlbmVyaWMgc2VyaWFsaXphdGlvblxuICAgICAgICAgICAgLy8gYXBwcm9hY2ggZm9yIG9iamVjdHMgd2hvc2UgbWVtYmVycyBpbmNsdWRlIGluc3RhbmNlcyBvZiBkeW5hbWljXG4gICAgICAgICAgICAvLyBTdHJ1Y3RBcnJheSB0eXBlcy4gT25jZSB3ZSByZWZhY3RvciBTdHJ1Y3RBcnJheSB0byBiZSBzdGF0aWMsXG4gICAgICAgICAgICAvLyB3ZSBjYW4gcmVtb3ZlIHRoaXMgY29tcGxleGl0eS5cbiAgICAgICAgICAgIChrbGFzcy5zZXJpYWxpemUoaW5wdXQsIHRyYW5zZmVyYWJsZXMpOiBTZXJpYWxpemVkT2JqZWN0KSA6IHt9O1xuXG4gICAgICAgIGlmICgha2xhc3Muc2VyaWFsaXplKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnB1dCkge1xuICAgICAgICAgICAgICAgIC8vIGFueSBjYXN0IGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvNTM5M1xuICAgICAgICAgICAgICAgIGlmICghKGlucHV0OiBhbnkpLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyeVtuYW1lXS5vbWl0LmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IChpbnB1dDogYW55KVtrZXldO1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXNba2V5XSA9IHNlcmlhbGl6ZShwcm9wZXJ0eSwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMubWVzc2FnZSA9IGlucHV0Lm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgc3RhdGljYWxseSBzZXJpYWxpemVkIG9iamVjdCBzdXJ2aXZlcyB0cmFuc2ZlciBvZiAkbmFtZSBwcm9wZXJ0eVxuICAgICAgICAgICAgYXNzZXJ0KCF0cmFuc2ZlcmFibGVzIHx8IHByb3BlcnRpZXMgIT09IHRyYW5zZmVyYWJsZXNbdHJhbnNmZXJhYmxlcy5sZW5ndGggLSAxXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydGllcy4kbmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCckbmFtZSBwcm9wZXJ0eSBpcyByZXNlcnZlZCBmb3Igd29ya2VyIHNlcmlhbGl6YXRpb24gbG9naWMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgIT09ICdPYmplY3QnKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLiRuYW1lID0gbmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3Qgc2VyaWFsaXplIG9iamVjdCBvZiB0eXBlICR7dHlwZW9mIGlucHV0fWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUoaW5wdXQ6IFNlcmlhbGl6ZWQpOiBtaXhlZCB7XG4gICAgaWYgKGlucHV0ID09PSBudWxsIHx8XG4gICAgICAgIGlucHV0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbiB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIE51bWJlciB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZyB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBSZWdFeHAgfHxcbiAgICAgICAgaXNBcnJheUJ1ZmZlcihpbnB1dCkgfHxcbiAgICAgICAgaXNJbWFnZUJpdG1hcChpbnB1dCkgfHxcbiAgICAgICAgQXJyYXlCdWZmZXIuaXNWaWV3KGlucHV0KSB8fFxuICAgICAgICBpbnB1dCBpbnN0YW5jZW9mIHdpbmRvdy5JbWFnZURhdGEpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICByZXR1cm4gaW5wdXQubWFwKGRlc2VyaWFsaXplKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBuYW1lID0gKGlucHV0OiBhbnkpLiRuYW1lIHx8ICdPYmplY3QnO1xuXG4gICAgICAgIGNvbnN0IHtrbGFzc30gPSByZWdpc3RyeVtuYW1lXTtcbiAgICAgICAgaWYgKCFrbGFzcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBkZXNlcmlhbGl6ZSB1bnJlZ2lzdGVyZWQgY2xhc3MgJHtuYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtsYXNzLmRlc2VyaWFsaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gKGtsYXNzLmRlc2VyaWFsaXplOiB0eXBlb2YgZGVzZXJpYWxpemUpKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUoa2xhc3MucHJvdG90eXBlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICckbmFtZScpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoaW5wdXQ6IFNlcmlhbGl6ZWRPYmplY3QpW2tleV07XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IGRlc2VyaWFsaXplKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBkZXNlcmlhbGl6ZSBvYmplY3Qgb2YgdHlwZSAke3R5cGVvZiBpbnB1dH1gKTtcbn1cbiIsIi8vIEBmbG93XG5cbmNsYXNzIFpvb21IaXN0b3J5IHtcbiAgICBsYXN0Wm9vbTogbnVtYmVyO1xuICAgIGxhc3RGbG9vclpvb206IG51bWJlcjtcbiAgICBsYXN0SW50ZWdlclpvb206IG51bWJlcjtcbiAgICBsYXN0SW50ZWdlclpvb21UaW1lOiBudW1iZXI7XG4gICAgZmlyc3Q6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5maXJzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlKHo6IG51bWJlciwgbm93OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZmxvb3JaID0gTWF0aC5mbG9vcih6KTtcblxuICAgICAgICBpZiAodGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICB0aGlzLmxhc3RJbnRlZ2VyWm9vbVRpbWUgPSAwO1xuICAgICAgICAgICAgdGhpcy5sYXN0Wm9vbSA9IHo7XG4gICAgICAgICAgICB0aGlzLmxhc3RGbG9vclpvb20gPSBmbG9vclo7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPiBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaICsgMTtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tVGltZSA9IG5vdztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhc3RGbG9vclpvb20gPCBmbG9vclopIHtcbiAgICAgICAgICAgIHRoaXMubGFzdEludGVnZXJab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgdGhpcy5sYXN0SW50ZWdlclpvb21UaW1lID0gbm93O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHogIT09IHRoaXMubGFzdFpvb20pIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFpvb20gPSB6O1xuICAgICAgICAgICAgdGhpcy5sYXN0Rmxvb3Jab29tID0gZmxvb3JaO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBab29tSGlzdG9yeTtcbiIsIi8vIEBmbG93XG5cbi8vIFRoZSBmb2xsb3dpbmcgdGFibGUgY29tZXMgZnJvbSA8aHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvMTIuMC4wL3VjZC9CbG9ja3MudHh0Pi5cbi8vIEtlZXAgaXQgc3luY2hyb25pemVkIHdpdGggPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL0Jsb2Nrcy50eHQ+LlxuXG50eXBlIFVuaWNvZGVCbG9ja0xvb2t1cCA9IHtba2V5OiBzdHJpbmddOiAoY2hhcjogbnVtYmVyKSA9PiBib29sZWFufTtcblxuY29uc3QgdW5pY29kZUJsb2NrTG9va3VwOiBVbmljb2RlQmxvY2tMb29rdXAgPSB7XG4gICAgLy8gJ0Jhc2ljIExhdGluJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMDAwICYmIGNoYXIgPD0gMHgwMDdGLFxuICAgICdMYXRpbi0xIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDAwODAgJiYgY2hhciA8PSAweDAwRkYsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDAxMDAgJiYgY2hhciA8PSAweDAxN0YsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUInOiAoY2hhcikgPT4gY2hhciA+PSAweDAxODAgJiYgY2hhciA8PSAweDAyNEYsXG4gICAgLy8gJ0lQQSBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMjUwICYmIGNoYXIgPD0gMHgwMkFGLFxuICAgIC8vICdTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDAyQjAgJiYgY2hhciA8PSAweDAyRkYsXG4gICAgLy8gJ0NvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDMwMCAmJiBjaGFyIDw9IDB4MDM2RixcbiAgICAvLyAnR3JlZWsgYW5kIENvcHRpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDM3MCAmJiBjaGFyIDw9IDB4MDNGRixcbiAgICAvLyAnQ3lyaWxsaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDA0MDAgJiYgY2hhciA8PSAweDA0RkYsXG4gICAgLy8gJ0N5cmlsbGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDA1MDAgJiYgY2hhciA8PSAweDA1MkYsXG4gICAgLy8gJ0FybWVuaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNTMwICYmIGNoYXIgPD0gMHgwNThGLFxuICAgIC8vJ0hlYnJldyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDU5MCAmJiBjaGFyIDw9IDB4MDVGRixcbiAgICAnQXJhYmljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNjAwICYmIGNoYXIgPD0gMHgwNkZGLFxuICAgIC8vJ1N5cmlhYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDcwMCAmJiBjaGFyIDw9IDB4MDc0RixcbiAgICAnQXJhYmljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDA3NTAgJiYgY2hhciA8PSAweDA3N0YsXG4gICAgLy8gJ1RoYWFuYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDc4MCAmJiBjaGFyIDw9IDB4MDdCRixcbiAgICAvLyAnTktvJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwN0MwICYmIGNoYXIgPD0gMHgwN0ZGLFxuICAgIC8vICdTYW1hcml0YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDA4MDAgJiYgY2hhciA8PSAweDA4M0YsXG4gICAgLy8gJ01hbmRhaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDA4NDAgJiYgY2hhciA8PSAweDA4NUYsXG4gICAgLy8gJ1N5cmlhYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgwODYwICYmIGNoYXIgPD0gMHgwODZGLFxuICAgICdBcmFiaWMgRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDhBMCAmJiBjaGFyIDw9IDB4MDhGRixcbiAgICAvLyAnRGV2YW5hZ2FyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDkwMCAmJiBjaGFyIDw9IDB4MDk3RixcbiAgICAvLyAnQmVuZ2FsaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDk4MCAmJiBjaGFyIDw9IDB4MDlGRixcbiAgICAvLyAnR3VybXVraGknOiAoY2hhcikgPT4gY2hhciA+PSAweDBBMDAgJiYgY2hhciA8PSAweDBBN0YsXG4gICAgLy8gJ0d1amFyYXRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwQTgwICYmIGNoYXIgPD0gMHgwQUZGLFxuICAgIC8vICdPcml5YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEIwMCAmJiBjaGFyIDw9IDB4MEI3RixcbiAgICAvLyAnVGFtaWwnOiAoY2hhcikgPT4gY2hhciA+PSAweDBCODAgJiYgY2hhciA8PSAweDBCRkYsXG4gICAgLy8gJ1RlbHVndSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEMwMCAmJiBjaGFyIDw9IDB4MEM3RixcbiAgICAvLyAnS2FubmFkYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEM4MCAmJiBjaGFyIDw9IDB4MENGRixcbiAgICAvLyAnTWFsYXlhbGFtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRDAwICYmIGNoYXIgPD0gMHgwRDdGLFxuICAgIC8vICdTaW5oYWxhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRDgwICYmIGNoYXIgPD0gMHgwREZGLFxuICAgIC8vICdUaGFpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRTAwICYmIGNoYXIgPD0gMHgwRTdGLFxuICAgIC8vICdMYW8nOiAoY2hhcikgPT4gY2hhciA+PSAweDBFODAgJiYgY2hhciA8PSAweDBFRkYsXG4gICAgLy8gJ1RpYmV0YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDBGMDAgJiYgY2hhciA8PSAweDBGRkYsXG4gICAgLy8gJ015YW5tYXInOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMDAgJiYgY2hhciA8PSAweDEwOUYsXG4gICAgLy8gJ0dlb3JnaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEEwICYmIGNoYXIgPD0gMHgxMEZGLFxuICAgICdIYW5ndWwgSmFtbyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEwMCAmJiBjaGFyIDw9IDB4MTFGRixcbiAgICAvLyAnRXRoaW9waWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEyMDAgJiYgY2hhciA8PSAweDEzN0YsXG4gICAgLy8gJ0V0aGlvcGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDEzODAgJiYgY2hhciA8PSAweDEzOUYsXG4gICAgLy8gJ0NoZXJva2VlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxM0EwICYmIGNoYXIgPD0gMHgxM0ZGLFxuICAgICdVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNDAwICYmIGNoYXIgPD0gMHgxNjdGLFxuICAgIC8vICdPZ2hhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTY4MCAmJiBjaGFyIDw9IDB4MTY5RixcbiAgICAvLyAnUnVuaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE2QTAgJiYgY2hhciA8PSAweDE2RkYsXG4gICAgLy8gJ1RhZ2Fsb2cnOiAoY2hhcikgPT4gY2hhciA+PSAweDE3MDAgJiYgY2hhciA8PSAweDE3MUYsXG4gICAgLy8gJ0hhbnVub28nOiAoY2hhcikgPT4gY2hhciA+PSAweDE3MjAgJiYgY2hhciA8PSAweDE3M0YsXG4gICAgLy8gJ0J1aGlkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzQwICYmIGNoYXIgPD0gMHgxNzVGLFxuICAgIC8vICdUYWdiYW53YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTc2MCAmJiBjaGFyIDw9IDB4MTc3RixcbiAgICAnS2htZXInOiAoY2hhcikgPT4gY2hhciA+PSAweDE3ODAgJiYgY2hhciA8PSAweDE3RkYsXG4gICAgLy8gJ01vbmdvbGlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTgwMCAmJiBjaGFyIDw9IDB4MThBRixcbiAgICAnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MThCMCAmJiBjaGFyIDw9IDB4MThGRixcbiAgICAvLyAnTGltYnUnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5MDAgJiYgY2hhciA8PSAweDE5NEYsXG4gICAgLy8gJ1RhaSBMZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTk1MCAmJiBjaGFyIDw9IDB4MTk3RixcbiAgICAvLyAnTmV3IFRhaSBMdWUnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5ODAgJiYgY2hhciA8PSAweDE5REYsXG4gICAgLy8gJ0tobWVyIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5RTAgJiYgY2hhciA8PSAweDE5RkYsXG4gICAgLy8gJ0J1Z2luZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQTAwICYmIGNoYXIgPD0gMHgxQTFGLFxuICAgIC8vICdUYWkgVGhhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUEyMCAmJiBjaGFyIDw9IDB4MUFBRixcbiAgICAvLyAnQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIEV4dGVuZGVkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQUIwICYmIGNoYXIgPD0gMHgxQUZGLFxuICAgIC8vICdCYWxpbmVzZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUIwMCAmJiBjaGFyIDw9IDB4MUI3RixcbiAgICAvLyAnU3VuZGFuZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQjgwICYmIGNoYXIgPD0gMHgxQkJGLFxuICAgIC8vICdCYXRhayc6IChjaGFyKSA9PiBjaGFyID49IDB4MUJDMCAmJiBjaGFyIDw9IDB4MUJGRixcbiAgICAvLyAnTGVwY2hhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQzAwICYmIGNoYXIgPD0gMHgxQzRGLFxuICAgIC8vICdPbCBDaGlraSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUM1MCAmJiBjaGFyIDw9IDB4MUM3RixcbiAgICAvLyAnQ3lyaWxsaWMgRXh0ZW5kZWQtQyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUM4MCAmJiBjaGFyIDw9IDB4MUM4RixcbiAgICAvLyAnR2VvcmdpYW4gRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFDOTAgJiYgY2hhciA8PSAweDFDQkYsXG4gICAgLy8gJ1N1bmRhbmVzZSBTdXBwbGVtZW50JzogKGNoYXIpID0+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+IGNoYXIgPj0gMHgxMEM4MCAmJiBjaGFyIDw9IDB4MTBDRkYsXG4gICAgLy8gJ0hhbmlmaSBSb2hpbmd5YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBEMDAgJiYgY2hhciA8PSAweDEwRDNGLFxuICAgIC8vICdSdW1pIE51bWVyYWwgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBFNjAgJiYgY2hhciA8PSAweDEwRTdGLFxuICAgIC8vICdPbGQgU29nZGlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTBGMDAgJiYgY2hhciA8PSAweDEwRjJGLFxuICAgIC8vICdTb2dkaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEYzMCAmJiBjaGFyIDw9IDB4MTBGNkYsXG4gICAgLy8gJ0VseW1haWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwRkUwICYmIGNoYXIgPD0gMHgxMEZGRixcbiAgICAvLyAnQnJhaG1pJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTAwMCAmJiBjaGFyIDw9IDB4MTEwN0YsXG4gICAgLy8gJ0thaXRoaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEwODAgJiYgY2hhciA8PSAweDExMENGLFxuICAgIC8vICdTb3JhIFNvbXBlbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMEQwICYmIGNoYXIgPD0gMHgxMTBGRixcbiAgICAvLyAnQ2hha21hJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTEwMCAmJiBjaGFyIDw9IDB4MTExNEYsXG4gICAgLy8gJ01haGFqYW5pJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTE1MCAmJiBjaGFyIDw9IDB4MTExN0YsXG4gICAgLy8gJ1NoYXJhZGEnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMTgwICYmIGNoYXIgPD0gMHgxMTFERixcbiAgICAvLyAnU2luaGFsYSBBcmNoYWljIE51bWJlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMUUwICYmIGNoYXIgPD0gMHgxMTFGRixcbiAgICAvLyAnS2hvamtpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTIwMCAmJiBjaGFyIDw9IDB4MTEyNEYsXG4gICAgLy8gJ011bHRhbmknOiAoY2hhcikgPT4gY2hhciA+PSAweDExMjgwICYmIGNoYXIgPD0gMHgxMTJBRixcbiAgICAvLyAnS2h1ZGF3YWRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTJCMCAmJiBjaGFyIDw9IDB4MTEyRkYsXG4gICAgLy8gJ0dyYW50aGEnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMzAwICYmIGNoYXIgPD0gMHgxMTM3RixcbiAgICAvLyAnTmV3YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE0MDAgJiYgY2hhciA8PSAweDExNDdGLFxuICAgIC8vICdUaXJodXRhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTQ4MCAmJiBjaGFyIDw9IDB4MTE0REYsXG4gICAgLy8gJ1NpZGRoYW0nOiAoY2hhcikgPT4gY2hhciA+PSAweDExNTgwICYmIGNoYXIgPD0gMHgxMTVGRixcbiAgICAvLyAnTW9kaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2MDAgJiYgY2hhciA8PSAweDExNjVGLFxuICAgIC8vICdNb25nb2xpYW4gU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2NjAgJiYgY2hhciA8PSAweDExNjdGLFxuICAgIC8vICdUYWtyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2ODAgJiYgY2hhciA8PSAweDExNkNGLFxuICAgIC8vICdBaG9tJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTcwMCAmJiBjaGFyIDw9IDB4MTE3M0YsXG4gICAgLy8gJ0RvZ3JhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTgwMCAmJiBjaGFyIDw9IDB4MTE4NEYsXG4gICAgLy8gJ1dhcmFuZyBDaXRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMThBMCAmJiBjaGFyIDw9IDB4MTE4RkYsXG4gICAgLy8gJ05hbmRpbmFnYXJpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTlBMCAmJiBjaGFyIDw9IDB4MTE5RkYsXG4gICAgLy8gJ1phbmFiYXphciBTcXVhcmUnOiAoY2hhcikgPT4gY2hhciA+PSAweDExQTAwICYmIGNoYXIgPD0gMHgxMUE0RixcbiAgICAvLyAnU295b21ibyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTFBNTAgJiYgY2hhciA8PSAweDExQUFGLFxuICAgIC8vICdQYXUgQ2luIEhhdSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTFBQzAgJiYgY2hhciA8PSAweDExQUZGLFxuICAgIC8vICdCaGFpa3N1a2knOiAoY2hhcikgPT4gY2hhciA+PSAweDExQzAwICYmIGNoYXIgPD0gMHgxMUM2RixcbiAgICAvLyAnTWFyY2hlbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTFDNzAgJiYgY2hhciA8PSAweDExQ0JGLFxuICAgIC8vICdNYXNhcmFtIEdvbmRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUQwMCAmJiBjaGFyIDw9IDB4MTFENUYsXG4gICAgLy8gJ0d1bmphbGEgR29uZGknOiAoY2hhcikgPT4gY2hhciA+PSAweDExRDYwICYmIGNoYXIgPD0gMHgxMURBRixcbiAgICAvLyAnTWFrYXNhcic6IChjaGFyKSA9PiBjaGFyID49IDB4MTFFRTAgJiYgY2hhciA8PSAweDExRUZGLFxuICAgIC8vICdUYW1pbCBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUZDMCAmJiBjaGFyIDw9IDB4MTFGRkYsXG4gICAgLy8gJ0N1bmVpZm9ybSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTIwMDAgJiYgY2hhciA8PSAweDEyM0ZGLFxuICAgIC8vICdDdW5laWZvcm0gTnVtYmVycyBhbmQgUHVuY3R1YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDEyNDAwICYmIGNoYXIgPD0gMHgxMjQ3RixcbiAgICAvLyAnRWFybHkgRHluYXN0aWMgQ3VuZWlmb3JtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMjQ4MCAmJiBjaGFyIDw9IDB4MTI1NEYsXG4gICAgLy8gJ0VneXB0aWFuIEhpZXJvZ2x5cGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMzAwMCAmJiBjaGFyIDw9IDB4MTM0MkYsXG4gICAgLy8gJ0VneXB0aWFuIEhpZXJvZ2x5cGggRm9ybWF0IENvbnRyb2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMzQzMCAmJiBjaGFyIDw9IDB4MTM0M0YsXG4gICAgLy8gJ0FuYXRvbGlhbiBIaWVyb2dseXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTQ0MDAgJiYgY2hhciA8PSAweDE0NjdGLFxuICAgIC8vICdCYW11bSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNjgwMCAmJiBjaGFyIDw9IDB4MTZBM0YsXG4gICAgLy8gJ01ybyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTZBNDAgJiYgY2hhciA8PSAweDE2QTZGLFxuICAgIC8vICdCYXNzYSBWYWgnOiAoY2hhcikgPT4gY2hhciA+PSAweDE2QUQwICYmIGNoYXIgPD0gMHgxNkFGRixcbiAgICAvLyAnUGFoYXdoIEhtb25nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkIwMCAmJiBjaGFyIDw9IDB4MTZCOEYsXG4gICAgLy8gJ01lZGVmYWlkcmluJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkU0MCAmJiBjaGFyIDw9IDB4MTZFOUYsXG4gICAgLy8gJ01pYW8nOiAoY2hhcikgPT4gY2hhciA+PSAweDE2RjAwICYmIGNoYXIgPD0gMHgxNkY5RixcbiAgICAvLyAnSWRlb2dyYXBoaWMgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDE2RkUwICYmIGNoYXIgPD0gMHgxNkZGRixcbiAgICAvLyAnVGFuZ3V0JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzAwMCAmJiBjaGFyIDw9IDB4MTg3RkYsXG4gICAgLy8gJ1Rhbmd1dCBDb21wb25lbnRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxODgwMCAmJiBjaGFyIDw9IDB4MThBRkYsXG4gICAgLy8gJ0thbmEgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUIwMDAgJiYgY2hhciA8PSAweDFCMEZGLFxuICAgIC8vICdLYW5hIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDFCMTAwICYmIGNoYXIgPD0gMHgxQjEyRixcbiAgICAvLyAnU21hbGwgS2FuYSBFeHRlbnNpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDFCMTMwICYmIGNoYXIgPD0gMHgxQjE2RixcbiAgICAvLyAnTnVzaHUnOiAoY2hhcikgPT4gY2hhciA+PSAweDFCMTcwICYmIGNoYXIgPD0gMHgxQjJGRixcbiAgICAvLyAnRHVwbG95YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDFCQzAwICYmIGNoYXIgPD0gMHgxQkM5RixcbiAgICAvLyAnU2hvcnRoYW5kIEZvcm1hdCBDb250cm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUJDQTAgJiYgY2hhciA8PSAweDFCQ0FGLFxuICAgIC8vICdCeXphbnRpbmUgTXVzaWNhbCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDAwMCAmJiBjaGFyIDw9IDB4MUQwRkYsXG4gICAgLy8gJ011c2ljYWwgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQxMDAgJiYgY2hhciA8PSAweDFEMUZGLFxuICAgIC8vICdBbmNpZW50IEdyZWVrIE11c2ljYWwgTm90YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMjAwICYmIGNoYXIgPD0gMHgxRDI0RixcbiAgICAvLyAnTWF5YW4gTnVtZXJhbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMkUwICYmIGNoYXIgPD0gMHgxRDJGRixcbiAgICAvLyAnVGFpIFh1YW4gSmluZyBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDMwMCAmJiBjaGFyIDw9IDB4MUQzNUYsXG4gICAgLy8gJ0NvdW50aW5nIFJvZCBOdW1lcmFscyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQzNjAgJiYgY2hhciA8PSAweDFEMzdGLFxuICAgIC8vICdNYXRoZW1hdGljYWwgQWxwaGFudW1lcmljIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFENDAwICYmIGNoYXIgPD0gMHgxRDdGRixcbiAgICAvLyAnU3V0dG9uIFNpZ25Xcml0aW5nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDgwMCAmJiBjaGFyIDw9IDB4MURBQUYsXG4gICAgLy8gJ0dsYWdvbGl0aWMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUUwMDAgJiYgY2hhciA8PSAweDFFMDJGLFxuICAgIC8vICdOeWlha2VuZyBQdWFjaHVlIEhtb25nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTEwMCAmJiBjaGFyIDw9IDB4MUUxNEYsXG4gICAgLy8gJ1dhbmNobyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUUyQzAgJiYgY2hhciA8PSAweDFFMkZGLFxuICAgIC8vICdNZW5kZSBLaWtha3VpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTgwMCAmJiBjaGFyIDw9IDB4MUU4REYsXG4gICAgLy8gJ0FkbGFtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTkwMCAmJiBjaGFyIDw9IDB4MUU5NUYsXG4gICAgLy8gJ0luZGljIFNpeWFxIE51bWJlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFFQzcwICYmIGNoYXIgPD0gMHgxRUNCRixcbiAgICAvLyAnT3R0b21hbiBTaXlhcSBOdW1iZXJzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRUQwMCAmJiBjaGFyIDw9IDB4MUVENEYsXG4gICAgLy8gJ0FyYWJpYyBNYXRoZW1hdGljYWwgQWxwaGFiZXRpYyBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRUUwMCAmJiBjaGFyIDw9IDB4MUVFRkYsXG4gICAgLy8gJ01haGpvbmcgVGlsZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMDAwICYmIGNoYXIgPD0gMHgxRjAyRixcbiAgICAvLyAnRG9taW5vIFRpbGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjAzMCAmJiBjaGFyIDw9IDB4MUYwOUYsXG4gICAgLy8gJ1BsYXlpbmcgQ2FyZHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMEEwICYmIGNoYXIgPD0gMHgxRjBGRixcbiAgICAvLyAnRW5jbG9zZWQgQWxwaGFudW1lcmljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMTAwICYmIGNoYXIgPD0gMHgxRjFGRixcbiAgICAvLyAnRW5jbG9zZWQgSWRlb2dyYXBoaWMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYyMDAgJiYgY2hhciA8PSAweDFGMkZGLFxuICAgIC8vICdNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjMwMCAmJiBjaGFyIDw9IDB4MUY1RkYsXG4gICAgLy8gJ0Vtb3RpY29ucyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY2MDAgJiYgY2hhciA8PSAweDFGNjRGLFxuICAgIC8vICdPcm5hbWVudGFsIERpbmdiYXRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjY1MCAmJiBjaGFyIDw9IDB4MUY2N0YsXG4gICAgLy8gJ1RyYW5zcG9ydCBhbmQgTWFwIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGNjgwICYmIGNoYXIgPD0gMHgxRjZGRixcbiAgICAvLyAnQWxjaGVtaWNhbCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjcwMCAmJiBjaGFyIDw9IDB4MUY3N0YsXG4gICAgLy8gJ0dlb21ldHJpYyBTaGFwZXMgRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGNzgwICYmIGNoYXIgPD0gMHgxRjdGRixcbiAgICAvLyAnU3VwcGxlbWVudGFsIEFycm93cy1DJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjgwMCAmJiBjaGFyIDw9IDB4MUY4RkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhbCBTeW1ib2xzIGFuZCBQaWN0b2dyYXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY5MDAgJiYgY2hhciA8PSAweDFGOUZGLFxuICAgIC8vICdDaGVzcyBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRkEwMCAmJiBjaGFyIDw9IDB4MUZBNkYsXG4gICAgLy8gJ1N5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGQTcwICYmIGNoYXIgPD0gMHgxRkFGRixcbiAgICAvLyAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQic6IChjaGFyKSA9PiBjaGFyID49IDB4MjAwMDAgJiYgY2hhciA8PSAweDJBNkRGLFxuICAgIC8vICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBDJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQTcwMCAmJiBjaGFyIDw9IDB4MkI3M0YsXG4gICAgLy8gJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEQnOiAoY2hhcikgPT4gY2hhciA+PSAweDJCNzQwICYmIGNoYXIgPD0gMHgyQjgxRixcbiAgICAvLyAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gRSc6IChjaGFyKSA9PiBjaGFyID49IDB4MkI4MjAgJiYgY2hhciA8PSAweDJDRUFGLFxuICAgIC8vICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBGJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQ0VCMCAmJiBjaGFyIDw9IDB4MkVCRUYsXG4gICAgLy8gJ0NKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MkY4MDAgJiYgY2hhciA8PSAweDJGQTFGLFxuICAgIC8vICdUYWdzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhFMDAwMCAmJiBjaGFyIDw9IDB4RTAwN0YsXG4gICAgLy8gJ1ZhcmlhdGlvbiBTZWxlY3RvcnMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4RTAxMDAgJiYgY2hhciA8PSAweEUwMUVGLFxuICAgIC8vICdTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4RjAwMDAgJiYgY2hhciA8PSAweEZGRkZGLFxuICAgIC8vICdTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQic6IChjaGFyKSA9PiBjaGFyID49IDB4MTAwMDAwICYmIGNoYXIgPD0gMHgxMEZGRkYsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB1bmljb2RlQmxvY2tMb29rdXA7XG4iLCIvLyBAZmxvd1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG5cbmltcG9ydCBpc0NoYXIgZnJvbSAnLi9pc19jaGFyX2luX3VuaWNvZGVfYmxvY2suanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyhjaGFyczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGNoYXJzKSB7XG4gICAgICAgIGlmICghY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcoY2hhci5jaGFyQ29kZUF0KDApKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUoY2hhcnM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgY2hhciBvZiBjaGFycykge1xuICAgICAgICBpZiAoY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXIuY2hhckNvZGVBdCgwKSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGxvd3NMZXR0ZXJTcGFjaW5nKGNoYXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgICAgaWYgKCFjaGFyQWxsb3dzTGV0dGVyU3BhY2luZyhjaGFyLmNoYXJDb2RlQXQoMCkpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhckFsbG93c0xldHRlclNwYWNpbmcoY2hhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljJ10oY2hhcikpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaXNDaGFyWydBcmFiaWMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljIEV4dGVuZGVkLUEnXShjaGFyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpc0NoYXJbJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSddKGNoYXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJ10oY2hhcikpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcoY2hhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gUmV0dXJuIGVhcmx5IGZvciBjaGFyYWN0ZXJzIG91dHNpZGUgYWxsIGlkZW9ncmFwaGljIHJhbmdlcy5cbiAgICBpZiAoY2hhciA8IDB4MkU4MCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8gRXh0ZW5kZWQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgUmFkaWNhbHMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3Ryb2tlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGlyYWdhbmEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5neGkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydWZXJ0aWNhbCBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBTeWxsYWJsZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgbG9naWMgY29tZXMgZnJvbVxuLy8gPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzEyLjAuMC91Y2QvVmVydGljYWxPcmllbnRhdGlvbi50eHQ+LlxuLy8gS2VlcCBpdCBzeW5jaHJvbml6ZWQgd2l0aFxuLy8gPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL1ZlcnRpY2FsT3JpZW50YXRpb24udHh0Pi5cbi8vIFRoZSBkYXRhIGZpbGUgZGVub3RlcyB3aXRoIOKAnFXigJ0gb3Ig4oCcVHXigJ0gYW55IGNvZGVwb2ludCB0aGF0IG1heSBiZSBkcmF3blxuLy8gdXByaWdodCBpbiB2ZXJ0aWNhbCB0ZXh0IGJ1dCBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIHVwcmlnaHQgYW5kXG4vLyDigJxuZXV0cmFs4oCdIGNoYXJhY3RlcnMuXG5cbi8vIEJsb2NrcyBpbiB0aGUgVW5pY29kZSBzdXBwbGVtZW50YXJ5IHBsYW5lcyBhcmUgZXhjbHVkZWQgZnJvbSB0aGlzIG1vZHVsZSBkdWVcbi8vIHRvIDxodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC9pc3N1ZXMvMjk+LlxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlcG9pbnQgaWRlbnRpZmllcyBhIGNoYXJhY3RlciB3aXRoXG4gKiB1cHJpZ2h0IG9yaWVudGF0aW9uLlxuICpcbiAqIEEgY2hhcmFjdGVyIGhhcyB1cHJpZ2h0IG9yaWVudGF0aW9uIGlmIGl0IGlzIGRyYXduIHVwcmlnaHQgKHVucm90YXRlZClcbiAqIHdoZXRoZXIgdGhlIGxpbmUgaXMgb3JpZW50ZWQgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHksIGV2ZW4gaWYgYm90aFxuICogYWRqYWNlbnQgY2hhcmFjdGVycyBjYW4gYmUgcm90YXRlZC4gRm9yIGV4YW1wbGUsIGEgQ2hpbmVzZSBjaGFyYWN0ZXIgaXNcbiAqIGFsd2F5cyBkcmF3biB1cHJpZ2h0LiBBbiB1cHJpZ2h0bHkgb3JpZW50ZWQgY2hhcmFjdGVyIGNhdXNlcyBhbiBhZGphY2VudFxuICog4oCcbmV1dHJhbOKAnSBjaGFyYWN0ZXIgdG8gYmUgZHJhd24gdXByaWdodCBhcyB3ZWxsLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjaGFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoY2hhciA9PT0gMHgwMkVBIC8qIG1vZGlmaWVyIGxldHRlciB5aW4gZGVwYXJ0aW5nIHRvbmUgbWFyayAqLyB8fFxuICAgICAgICBjaGFyID09PSAweDAyRUIgLyogbW9kaWZpZXIgbGV0dGVyIHlhbmcgZGVwYXJ0aW5nIHRvbmUgbWFyayAqLykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gZWFybHkgZm9yIGNoYXJhY3RlcnMgb3V0c2lkZSBhbGwgcmFuZ2VzIHdob3NlIGNoYXJhY3RlcnMgcmVtYWluXG4gICAgLy8gdXByaWdodCBpbiB2ZXJ0aWNhbCB3cml0aW5nIG1vZGUuXG4gICAgaWYgKGNoYXIgPCAweDExMDApIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChpc0NoYXJbJ0JvcG9tb2ZvIEV4dGVuZGVkJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0JvcG9tb2ZvJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHhGRTQ5IC8qIGRhc2hlZCBvdmVybGluZSAqLyAmJiBjaGFyIDw9IDB4RkU0RikgLyogd2F2eSBsb3cgbGluZSAqLykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHknXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFN0cm9rZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHgzMDA4IC8qIGxlZnQgYW5nbGUgYnJhY2tldCAqLyAmJiBjaGFyIDw9IDB4MzAxMSkgLyogcmlnaHQgYmxhY2sgbGVudGljdWxhciBicmFja2V0ICovKSAmJlxuICAgICAgICAgICAgISgoY2hhciA+PSAweDMwMTQgLyogbGVmdCB0b3J0b2lzZSBzaGVsbCBicmFja2V0ICovICYmIGNoYXIgPD0gMHgzMDFGKSAvKiBsb3cgZG91YmxlIHByaW1lIHF1b3RhdGlvbiBtYXJrICovKSAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHgzMDMwIC8qIHdhdnkgZGFzaCAqLykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIYW5ndWwgSmFtbyBFeHRlbmRlZC1BJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbmd1bCBKYW1vIEV4dGVuZGVkLUInXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIEphbW8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIFN5bGxhYmxlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIaXJhZ2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0thbmJ1biddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5neGkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyICE9PSAweDMwRkMgLyoga2F0YWthbmEtaGlyYWdhbmEgcHJvbG9uZ2VkIHNvdW5kIG1hcmsgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0hhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKGNoYXIgIT09IDB4RkYwOCAvKiBmdWxsd2lkdGggbGVmdCBwYXJlbnRoZXNpcyAqLyAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjA5IC8qIGZ1bGx3aWR0aCByaWdodCBwYXJlbnRoZXNpcyAqLyAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjBEIC8qIGZ1bGx3aWR0aCBoeXBoZW4tbWludXMgKi8gJiZcbiAgICAgICAgICAgICEoKGNoYXIgPj0gMHhGRjFBIC8qIGZ1bGx3aWR0aCBjb2xvbiAqLyAmJiBjaGFyIDw9IDB4RkYxRSkgLyogZnVsbHdpZHRoIGdyZWF0ZXItdGhhbiBzaWduICovKSAmJlxuICAgICAgICAgICAgY2hhciAhPT0gMHhGRjNCIC8qIGZ1bGx3aWR0aCBsZWZ0IHNxdWFyZSBicmFja2V0ICovICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGM0QgLyogZnVsbHdpZHRoIHJpZ2h0IHNxdWFyZSBicmFja2V0ICovICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGM0YgLyogZnVsbHdpZHRoIGxvdyBsaW5lICovICYmXG4gICAgICAgICAgICAhKGNoYXIgPj0gMHhGRjVCIC8qIGZ1bGx3aWR0aCBsZWZ0IGN1cmx5IGJyYWNrZXQgKi8gJiYgY2hhciA8PSAweEZGREYpICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGRTMgLyogZnVsbHdpZHRoIG1hY3JvbiAqLyAmJlxuICAgICAgICAgICAgIShjaGFyID49IDB4RkZFOCAvKiBoYWxmd2lkdGggZm9ybXMgbGlnaHQgdmVydGljYWwgKi8gJiYgY2hhciA8PSAweEZGRUYpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydTbWFsbCBGb3JtIFZhcmlhbnRzJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoKGNoYXIgPj0gMHhGRTU4IC8qIHNtYWxsIGVtIGRhc2ggKi8gJiYgY2hhciA8PSAweEZFNUUpIC8qIHNtYWxsIHJpZ2h0IHRvcnRvaXNlIHNoZWxsIGJyYWNrZXQgKi8pICYmXG4gICAgICAgICAgICAhKChjaGFyID49IDB4RkU2MyAvKiBzbWFsbCBoeXBoZW4tbWludXMgKi8gJiYgY2hhciA8PSAweEZFNjYpIC8qIHNtYWxsIGVxdWFscyBzaWduICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzIEV4dGVuZGVkJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1ZlcnRpY2FsIEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1lpamluZyBIZXhhZ3JhbSBTeW1ib2xzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1lpIFN5bGxhYmxlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFVuaWNvZGUgY29kZXBvaW50IGlkZW50aWZpZXMgYSBjaGFyYWN0ZXIgd2l0aFxuICogbmV1dHJhbCBvcmllbnRhdGlvbi5cbiAqXG4gKiBBIGNoYXJhY3RlciBoYXMgbmV1dHJhbCBvcmllbnRhdGlvbiBpZiBpdCBtYXkgYmUgZHJhd24gcm90YXRlZCBvciB1bnJvdGF0ZWRcbiAqIHdoZW4gdGhlIGxpbmUgaXMgb3JpZW50ZWQgdmVydGljYWxseSwgZGVwZW5kaW5nIG9uIHRoZSBvcmllbnRhdGlvbiBvZiB0aGVcbiAqIGFkamFjZW50IGNoYXJhY3RlcnMuIEZvciBleGFtcGxlLCBhbG9uZyBhIHZlcnRpY2xseSBvcmllbnRlZCBsaW5lLCB0aGUgdnVsZ2FyXG4gKiBmcmFjdGlvbiDCvSBpcyBkcmF3biB1cHJpZ2h0IGFtb25nIENoaW5lc2UgY2hhcmFjdGVycyBidXQgcm90YXRlZCBhbW9uZyBMYXRpblxuICogbGV0dGVycy4gQSBuZXV0cmFsbHkgb3JpZW50ZWQgY2hhcmFjdGVyIGRvZXMgbm90IGluZmx1ZW5jZSB3aGV0aGVyIGFuXG4gKiBhZGphY2VudCBjaGFyYWN0ZXIgaXMgZHJhd24gdXByaWdodCBvciByb3RhdGVkLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXJIYXNOZXV0cmFsVmVydGljYWxPcmllbnRhdGlvbihjaGFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDaGFyWydMYXRpbi0xIFN1cHBsZW1lbnQnXShjaGFyKSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gMHgwMEE3IC8qIHNlY3Rpb24gc2lnbiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEE5IC8qIGNvcHlyaWdodCBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQUUgLyogcmVnaXN0ZXJlZCBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQjEgLyogcGx1cy1taW51cyBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQkMgLyogdnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQkQgLyogdnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQkUgLyogdnVsZ2FyIGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwRDcgLyogbXVsdGlwbGljYXRpb24gc2lnbiAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgwMEY3IC8qIGRpdmlzaW9uIHNpZ24gKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0dlbmVyYWwgUHVuY3R1YXRpb24nXShjaGFyKSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gMHgyMDE2IC8qIGRvdWJsZSB2ZXJ0aWNhbCBsaW5lICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMjAgLyogZGFnZ2VyICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMjEgLyogZG91YmxlIGRhZ2dlciAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDMwIC8qIHBlciBtaWxsZSBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMzEgLyogcGVyIHRlbiB0aG91c2FuZCBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwM0IgLyogcmVmZXJlbmNlIG1hcmsgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAzQyAvKiBkb3VibGUgZXhjbGFtYXRpb24gbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDQyIC8qIGFzdGVyaXNtICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNDcgLyogZG91YmxlIHF1ZXN0aW9uIG1hcmsgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjA0OCAvKiBxdWVzdGlvbiBleGNsYW1hdGlvbiBtYXJrICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNDkgLyogZXhjbGFtYXRpb24gcXVlc3Rpb24gbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDUxIC8qIHR3byBhc3Rlcmlza3MgYWxpZ25lZCB2ZXJ0aWNhbGx5ICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydMZXR0ZXJsaWtlIFN5bWJvbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnTnVtYmVyIEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ01pc2NlbGxhbmVvdXMgVGVjaG5pY2FsJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKChjaGFyID49IDB4MjMwMCAvKiBkaWFtZXRlciBzaWduICovICYmIGNoYXIgPD0gMHgyMzA3IC8qIHdhdnkgbGluZSAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjMwQyAvKiBib3R0b20gcmlnaHQgY3JvcCAqLyAmJiBjaGFyIDw9IDB4MjMxRiAvKiBib3R0b20gcmlnaHQgY29ybmVyICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyMzI0IC8qIHVwIGFycm93aGVhZCBiZXR3ZWVuIHR3byBob3Jpem9udGFsIGJhcnMgKi8gJiYgY2hhciA8PSAweDIzMjggLyoga2V5Ym9hcmQgKi8pIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIzMkIgLyogZXJhc2UgdG8gdGhlIGxlZnQgKi8gfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjM3RCAvKiBzaG91bGRlcmVkIG9wZW4gYm94ICovICYmIGNoYXIgPD0gMHgyMzlBIC8qIGNsZWFyIHNjcmVlbiBzeW1ib2wgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzQkUgLyogZGVudGlzdHJ5IHN5bWJvbCBsaWdodCB2ZXJ0aWNhbCBhbmQgdG9wIHJpZ2h0ICovICYmIGNoYXIgPD0gMHgyM0NEIC8qIHNxdWFyZSBmb290ICovKSB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyM0NGIC8qIGVqZWN0IHN5bWJvbCAqLyB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyM0QxIC8qIG1ldHJpY2FsIGJyZXZlICovICYmIGNoYXIgPD0gMHgyM0RCIC8qIGZ1c2UgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzRTIgLyogd2hpdGUgdHJhcGV6aXVtICovICYmIGNoYXIgPD0gMHgyM0ZGKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnQ29udHJvbCBQaWN0dXJlcyddKGNoYXIpICYmIGNoYXIgIT09IDB4MjQyMyAvKiBvcGVuIGJveCAqLykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnT3B0aWNhbCBDaGFyYWN0ZXIgUmVjb2duaXRpb24nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnRW5jbG9zZWQgQWxwaGFudW1lcmljcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydHZW9tZXRyaWMgU2hhcGVzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ01pc2NlbGxhbmVvdXMgU3ltYm9scyddKGNoYXIpKSB7XG4gICAgICAgIGlmICghKChjaGFyID49IDB4MjYxQSAvKiBibGFjayBsZWZ0IHBvaW50aW5nIGluZGV4ICovICYmIGNoYXIgPD0gMHgyNjFGKSAvKiB3aGl0ZSBkb3duIHBvaW50aW5nIGluZGV4ICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnTWlzY2VsbGFuZW91cyBTeW1ib2xzIGFuZCBBcnJvd3MnXShjaGFyKSkge1xuICAgICAgICBpZiAoKGNoYXIgPj0gMHgyQjEyIC8qIHNxdWFyZSB3aXRoIHRvcCBoYWxmIGJsYWNrICovICYmIGNoYXIgPD0gMHgyQjJGIC8qIHdoaXRlIHZlcnRpY2FsIGVsbGlwc2UgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDJCNTAgLyogd2hpdGUgbWVkaXVtIHN0YXIgKi8gJiYgY2hhciA8PSAweDJCNTkgLyogaGVhdnkgY2lyY2xlZCBzYWx0aXJlICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyQkI4IC8qIHVwd2FyZHMgd2hpdGUgYXJyb3cgZnJvbSBiYXIgd2l0aCBob3Jpem9udGFsIGJhciAqLyAmJiBjaGFyIDw9IDB4MkJFQikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydQcml2YXRlIFVzZSBBcmVhJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1NtYWxsIEZvcm0gVmFyaWFudHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICBpZiAoY2hhciA9PT0gMHgyMjFFIC8qIGluZmluaXR5ICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4MjIzNCAvKiB0aGVyZWZvcmUgKi8gfHxcbiAgICAgICAgY2hhciA9PT0gMHgyMjM1IC8qIGJlY2F1c2UgKi8gfHxcbiAgICAgICAgKGNoYXIgPj0gMHgyNzAwIC8qIGJsYWNrIHNhZmV0eSBzY2lzc29ycyAqLyAmJiBjaGFyIDw9IDB4Mjc2NyAvKiByb3RhdGVkIGZsb3JhbCBoZWFydCBidWxsZXQgKi8pIHx8XG4gICAgICAgIChjaGFyID49IDB4Mjc3NiAvKiBkaW5nYmF0IG5lZ2F0aXZlIGNpcmNsZWQgZGlnaXQgb25lICovICYmIGNoYXIgPD0gMHgyNzkzIC8qIGRpbmdiYXQgbmVnYXRpdmUgY2lyY2xlZCBzYW5zLXNlcmlmIG51bWJlciB0ZW4gKi8pIHx8XG4gICAgICAgIGNoYXIgPT09IDB4RkZGQyAvKiBvYmplY3QgcmVwbGFjZW1lbnQgY2hhcmFjdGVyICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4RkZGRCAvKiByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKi8pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlcG9pbnQgaWRlbnRpZmllcyBhIGNoYXJhY3RlciB3aXRoXG4gKiByb3RhdGVkIG9yaWVudGF0aW9uLlxuICpcbiAqIEEgY2hhcmFjdGVyIGhhcyByb3RhdGVkIG9yaWVudGF0aW9uIGlmIGl0IGlzIGRyYXduIHJvdGF0ZWQgd2hlbiB0aGUgbGluZSBpc1xuICogb3JpZW50ZWQgdmVydGljYWxseSwgZXZlbiBpZiBib3RoIGFkamFjZW50IGNoYXJhY3RlcnMgYXJlIHVwcmlnaHQuIEZvclxuICogZXhhbXBsZSwgYSBMYXRpbiBsZXR0ZXIgaXMgZHJhd24gcm90YXRlZCBhbG9uZyBhIHZlcnRpY2FsIGxpbmUuIEEgcm90YXRlZFxuICogY2hhcmFjdGVyIGNhdXNlcyBhbiBhZGphY2VudCDigJxuZXV0cmFs4oCdIGNoYXJhY3RlciB0byBiZSBkcmF3biByb3RhdGVkIGFzIHdlbGwuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhckhhc1JvdGF0ZWRWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhKGNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjaGFyKSB8fFxuICAgICAgICAgICAgIGNoYXJIYXNOZXV0cmFsVmVydGljYWxPcmllbnRhdGlvbihjaGFyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFySW5Db21wbGV4U2hhcGluZ1NjcmlwdChjaGFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNDaGFyWydBcmFiaWMnXShjaGFyKSB8fFxuICAgICAgICAgICBpc0NoYXJbJ0FyYWJpYyBTdXBwbGVtZW50J10oY2hhcikgfHxcbiAgICAgICAgICAgaXNDaGFyWydBcmFiaWMgRXh0ZW5kZWQtQSddKGNoYXIpIHx8XG4gICAgICAgICAgIGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BJ10oY2hhcikgfHxcbiAgICAgICAgICAgaXNDaGFyWydBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUInXShjaGFyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYXJJblJUTFNjcmlwdChjaGFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBNYWluIGJsb2NrcyBmb3IgSGVicmV3LCBBcmFiaWMsIFRoYWFuYSBhbmQgb3RoZXIgUlRMIHNjcmlwdHNcbiAgICByZXR1cm4gKGNoYXIgPj0gMHgwNTkwICYmIGNoYXIgPD0gMHgwOEZGKSB8fFxuICAgICAgICBpc0NoYXJbJ0FyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSddKGNoYXIpIHx8XG4gICAgICAgIGlzQ2hhclsnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CJ10oY2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFySW5TdXBwb3J0ZWRTY3JpcHQoY2hhcjogbnVtYmVyLCBjYW5SZW5kZXJSVEw6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAvLyBUaGlzIGlzIGEgcm91Z2ggaGV1cmlzdGljOiB3aGV0aGVyIHdlIFwiY2FuIHJlbmRlclwiIGEgc2NyaXB0XG4gICAgLy8gYWN0dWFsbHkgZGVwZW5kcyBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgZm9udCBiZWluZyB1c2VkXG4gICAgLy8gYW5kIHdoZXRoZXIgZGlmZmVyZW5jZXMgZnJvbSB0aGUgaWRlYWwgcmVuZGVyaW5nIGFyZSBjb25zaWRlcmVkXG4gICAgLy8gc2VtYW50aWNhbGx5IHNpZ25pZmljYW50LlxuXG4gICAgLy8gRXZlbiBpbiBMYXRpbiBzY3JpcHQsIHdlIFwiY2FuJ3QgcmVuZGVyXCIgY29tYmluYXRpb25zIHN1Y2ggYXMgdGhlIGZpXG4gICAgLy8gbGlnYXR1cmUsIGJ1dCB3ZSBkb24ndCBjb25zaWRlciB0aGF0IHNlbWFudGljYWxseSBzaWduaWZpY2FudC5cbiAgICBpZiAoIWNhblJlbmRlclJUTCAmJiBjaGFySW5SVExTY3JpcHQoY2hhcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoKGNoYXIgPj0gMHgwOTAwICYmIGNoYXIgPD0gMHgwREZGKSB8fFxuICAgICAgICAvLyBNYWluIGJsb2NrcyBmb3IgSW5kaWMgc2NyaXB0cyBhbmQgU2luaGFsYVxuICAgICAgICAoY2hhciA+PSAweDBGMDAgJiYgY2hhciA8PSAweDEwOUYpIHx8XG4gICAgICAgIC8vIE1haW4gYmxvY2tzIGZvciBUaWJldGFuIGFuZCBNeWFubWFyXG4gICAgICAgIGlzQ2hhclsnS2htZXInXShjaGFyKSkge1xuICAgICAgICAvLyBUaGVzZSBibG9ja3MgY292ZXIgY29tbW9uIHNjcmlwdHMgdGhhdCByZXF1aXJlXG4gICAgICAgIC8vIGNvbXBsZXggdGV4dCBzaGFwaW5nLCBiYXNlZCBvbiB1bmljb2RlIHNjcmlwdCBtZXRhZGF0YTpcbiAgICAgICAgLy8gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcy9jbGRyL3RydW5rL2NvbW1vbi9wcm9wZXJ0aWVzL3NjcmlwdE1ldGFkYXRhLnR4dFxuICAgICAgICAvLyB3aGVyZSBcIldlYiBSYW5rIDw9IDMyXCIgXCJTaGFwaW5nIFJlcXVpcmVkID0gWUVTXCJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0NvbnRhaW5zUlRMVGV4dChjaGFyczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGNoYXJzKSB7XG4gICAgICAgIGlmIChjaGFySW5SVExTY3JpcHQoY2hhci5jaGFyQ29kZUF0KDApKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdJblN1cHBvcnRlZFNjcmlwdChjaGFyczogc3RyaW5nLCBjYW5SZW5kZXJSVEw6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgY2hhcnMpIHtcbiAgICAgICAgaWYgKCFjaGFySW5TdXBwb3J0ZWRTY3JpcHQoY2hhci5jaGFyQ29kZUF0KDApLCBjYW5SZW5kZXJSVEwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0V2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHtnZXRBcnJheUJ1ZmZlcn0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge2lzV29ya2VyfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5cbmNvbnN0IHN0YXR1cyA9IHtcbiAgICB1bmF2YWlsYWJsZTogJ3VuYXZhaWxhYmxlJywgLy8gTm90IGxvYWRlZFxuICAgIGRlZmVycmVkOiAnZGVmZXJyZWQnLCAvLyBUaGUgcGx1Z2luIFVSTCBoYXMgYmVlbiBzcGVjaWZpZWQsIGJ1dCBsb2FkaW5nIGhhcyBiZWVuIGRlZmVycmVkXG4gICAgbG9hZGluZzogJ2xvYWRpbmcnLCAvLyByZXF1ZXN0IGluLWZsaWdodFxuICAgIGxvYWRlZDogJ2xvYWRlZCcsXG4gICAgZXJyb3I6ICdlcnJvcidcbn07XG5cbmV4cG9ydCB0eXBlIFBsdWdpblN0YXRlID0ge1xuICAgIHBsdWdpblN0YXR1czogJFZhbHVlczx0eXBlb2Ygc3RhdHVzPjtcbiAgICBwbHVnaW5VUkw6ID9zdHJpbmdcbn07XG5cbnR5cGUgUGx1Z2luU3RhdGVTeW5jQ2FsbGJhY2sgPSAoc3RhdGU6IFBsdWdpblN0YXRlKSA9PiB2b2lkO1xubGV0IF9jb21wbGV0aW9uQ2FsbGJhY2sgPSBudWxsO1xuXG4vL1ZhcmlhYmxlcyBkZWZpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGx1Z2luXG5sZXQgcGx1Z2luU3RhdHVzID0gc3RhdHVzLnVuYXZhaWxhYmxlO1xubGV0IHBsdWdpblVSTCA9IG51bGw7XG5cbmV4cG9ydCBjb25zdCB0cmlnZ2VyUGx1Z2luQ29tcGxldGlvbkV2ZW50ID0gZnVuY3Rpb24oZXJyb3I6ID9FcnJvcikge1xuICAgIC8vIE5ldHdvcmtFcnJvcidzIGFyZSBub3QgY29ycmVjdGx5IHJlZmxlY3RlZCBieSB0aGUgcGx1Z2luIHN0YXR1cyB3aGljaCBwcmV2ZW50cyByZWxvYWRpbmcgcGx1Z2luXG4gICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycgJiYgZXJyb3IuaW5kZXhPZignTmV0d29ya0Vycm9yJykgPiAtMSkge1xuICAgICAgICBwbHVnaW5TdGF0dXMgPSBzdGF0dXMuZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKF9jb21wbGV0aW9uQ2FsbGJhY2spIHtcbiAgICAgICAgX2NvbXBsZXRpb25DYWxsYmFjayhlcnJvcik7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gc2VuZFBsdWdpblN0YXRlVG9Xb3JrZXIoKSB7XG4gICAgZXZlbnRlZC5maXJlKG5ldyBFdmVudCgncGx1Z2luU3RhdGVDaGFuZ2UnLCB7cGx1Z2luU3RhdHVzLCBwbHVnaW5VUkx9KSk7XG59XG5cbmV4cG9ydCBjb25zdCBldmVudGVkOiBFdmVudGVkID0gbmV3IEV2ZW50ZWQoKTtcblxuZXhwb3J0IGNvbnN0IGdldFJUTFRleHRQbHVnaW5TdGF0dXMgPSBmdW5jdGlvbiAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGx1Z2luU3RhdHVzO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyRm9yUGx1Z2luU3RhdGVDaGFuZ2UgPSBmdW5jdGlvbihjYWxsYmFjazogUGx1Z2luU3RhdGVTeW5jQ2FsbGJhY2spOiBQbHVnaW5TdGF0ZVN5bmNDYWxsYmFjayB7XG4gICAgLy8gRG8gYW4gaW5pdGlhbCBzeW5jIG9mIHRoZSBzdGF0ZVxuICAgIGNhbGxiYWNrKHtwbHVnaW5TdGF0dXMsIHBsdWdpblVSTH0pO1xuICAgIC8vIExpc3RlbiBmb3IgYWxsIGZ1dHVyZSBzdGF0ZSBjaGFuZ2VzXG4gICAgZXZlbnRlZC5vbigncGx1Z2luU3RhdGVDaGFuZ2UnLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIGNhbGxiYWNrO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyUlRMVGV4dFBsdWdpbiA9IGZ1bmN0aW9uKCkge1xuICAgIHBsdWdpblN0YXR1cyA9IHN0YXR1cy51bmF2YWlsYWJsZTtcbiAgICBwbHVnaW5VUkwgPSBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldFJUTFRleHRQbHVnaW4gPSBmdW5jdGlvbih1cmw6IHN0cmluZywgY2FsbGJhY2s6ID9DYWxsYmFjazx7ZXJyOiA/RXJyb3J9PiwgZGVmZXJyZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmIChwbHVnaW5TdGF0dXMgPT09IHN0YXR1cy5kZWZlcnJlZCB8fCBwbHVnaW5TdGF0dXMgPT09IHN0YXR1cy5sb2FkaW5nIHx8IHBsdWdpblN0YXR1cyA9PT0gc3RhdHVzLmxvYWRlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFJUTFRleHRQbHVnaW4gY2Fubm90IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4nKTtcbiAgICB9XG4gICAgcGx1Z2luVVJMID0gYnJvd3Nlci5yZXNvbHZlVVJMKHVybCk7XG4gICAgcGx1Z2luU3RhdHVzID0gc3RhdHVzLmRlZmVycmVkO1xuICAgIF9jb21wbGV0aW9uQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICBzZW5kUGx1Z2luU3RhdGVUb1dvcmtlcigpO1xuXG4gICAgLy9TdGFydCBkb3dubG9hZGluZyB0aGUgcGx1Z2luIGltbWVkaWF0ZWx5IGlmIG5vdCBpbnRlbmRpbmcgdG8gbGF6eS1sb2FkXG4gICAgaWYgKCFkZWZlcnJlZCkge1xuICAgICAgICBkb3dubG9hZFJUTFRleHRQbHVnaW4oKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgZG93bmxvYWRSVExUZXh0UGx1Z2luID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHBsdWdpblN0YXR1cyAhPT0gc3RhdHVzLmRlZmVycmVkIHx8ICFwbHVnaW5VUkwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdydGwtdGV4dC1wbHVnaW4gY2Fubm90IGJlIGRvd25sb2FkZWQgdW5sZXNzIGEgcGx1Z2luVVJMIGlzIHNwZWNpZmllZCcpO1xuICAgIH1cbiAgICBwbHVnaW5TdGF0dXMgPSBzdGF0dXMubG9hZGluZztcbiAgICBzZW5kUGx1Z2luU3RhdGVUb1dvcmtlcigpO1xuICAgIGlmIChwbHVnaW5VUkwpIHtcbiAgICAgICAgZ2V0QXJyYXlCdWZmZXIoe3VybDogcGx1Z2luVVJMfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyUGx1Z2luQ29tcGxldGlvbkV2ZW50KGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luU3RhdHVzID0gc3RhdHVzLmxvYWRlZDtcbiAgICAgICAgICAgICAgICBzZW5kUGx1Z2luU3RhdGVUb1dvcmtlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgcGx1Z2luOiB7XG4gICAgYXBwbHlBcmFiaWNTaGFwaW5nOiA/RnVuY3Rpb24sXG4gICAgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0OiA/KHN0cmluZywgQXJyYXk8bnVtYmVyPikgPT4gQXJyYXk8c3RyaW5nPixcbiAgICBwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQ6ID8oc3RyaW5nLCBBcnJheTxudW1iZXI+LCBBcnJheTxudW1iZXI+KSA9PiBBcnJheTxbc3RyaW5nLCBBcnJheTxudW1iZXI+XT4sXG4gICAgaXNMb2FkZWQ6ICgpID0+IGJvb2xlYW4sXG4gICAgaXNMb2FkaW5nOiAoKSA9PiBib29sZWFuLFxuICAgIHNldFN0YXRlOiAoc3RhdGU6IFBsdWdpblN0YXRlKSA9PiB2b2lkLFxuICAgIGlzUGFyc2VkOiAoKSA9PiBib29sZWFuLFxuICAgIGdldFBsdWdpblVSTDogKCkgPT4gP3N0cmluZ1xufSA9IHtcbiAgICBhcHBseUFyYWJpY1NoYXBpbmc6IG51bGwsXG4gICAgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0OiBudWxsLFxuICAgIHByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dDogbnVsbCxcbiAgICBpc0xvYWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpblN0YXR1cyA9PT0gc3RhdHVzLmxvYWRlZCB8fCAvLyBNYWluIFRocmVhZDogbG9hZGVkIGlmIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIHJldHVybmVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICAgICAgcGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZyAhPSBudWxsOyAvLyBXZWItd29ya2VyOiBsb2FkZWQgaWYgdGhlIHBsdWdpbiBmdW5jdGlvbnMgaGF2ZSBiZWVuIGNvbXBpbGVkXG4gICAgfSxcbiAgICBpc0xvYWRpbmcoKSB7IC8vIE1haW4gVGhyZWFkIE9ubHk6IHF1ZXJ5IHRoZSBsb2FkaW5nIHN0YXR1cywgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgaW4gdGhlIHdvcmtlciBjb250ZXh0LlxuICAgICAgICByZXR1cm4gcGx1Z2luU3RhdHVzID09PSBzdGF0dXMubG9hZGluZztcbiAgICB9LFxuICAgIHNldFN0YXRlKHN0YXRlOiBQbHVnaW5TdGF0ZSkgeyAvLyBXb3JrZXIgdGhyZWFkIG9ubHk6IHRoaXMgdGVsbHMgdGhlIHdvcmtlciB0aHJlYWRzIHRoYXQgdGhlIHBsdWdpbiBpcyBhdmFpbGFibGUgb24gdGhlIE1haW4gdGhyZWFkXG4gICAgICAgIGFzc2VydChpc1dvcmtlcigpLCAnQ2Fubm90IHNldCB0aGUgc3RhdGUgb2YgdGhlIHJ0bC10ZXh0LXBsdWdpbiB3aGVuIG5vdCBpbiB0aGUgd2ViLXdvcmtlciBjb250ZXh0Jyk7XG5cbiAgICAgICAgcGx1Z2luU3RhdHVzID0gc3RhdGUucGx1Z2luU3RhdHVzO1xuICAgICAgICBwbHVnaW5VUkwgPSBzdGF0ZS5wbHVnaW5VUkw7XG4gICAgfSxcbiAgICBpc1BhcnNlZCgpOiBib29sZWFuIHtcbiAgICAgICAgYXNzZXJ0KGlzV29ya2VyKCksICdydGwtdGV4dC1wbHVnaW4gaXMgb25seSBwYXJzZWQgb24gdGhlIHdvcmtlci10aHJlYWRzJyk7XG5cbiAgICAgICAgcmV0dXJuIHBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcgIT0gbnVsbCAmJlxuICAgICAgICAgICAgcGx1Z2luLnByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCAhPSBudWxsICYmXG4gICAgICAgICAgICBwbHVnaW4ucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0ICE9IG51bGw7XG4gICAgfSxcbiAgICBnZXRQbHVnaW5VUkwoKTogP3N0cmluZyB7XG4gICAgICAgIGFzc2VydChpc1dvcmtlcigpLCAncnRsLXRleHQtcGx1Z2luIHVybCBjYW4gb25seSBiZSBxdWVyaWVkIGZyb20gdGhlIHdvcmtlciB0aHJlYWRzJyk7XG4gICAgICAgIHJldHVybiBwbHVnaW5VUkw7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGxhenlMb2FkUlRMVGV4dFBsdWdpbiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICghcGx1Z2luLmlzTG9hZGluZygpICYmXG4gICAgICAgICFwbHVnaW4uaXNMb2FkZWQoKSAmJlxuICAgICAgICBnZXRSVExUZXh0UGx1Z2luU3RhdHVzKCkgPT09ICdkZWZlcnJlZCdcbiAgICApIHtcbiAgICAgICAgZG93bmxvYWRSVExUZXh0UGx1Z2luKCk7XG4gICAgfVxufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBab29tSGlzdG9yeSBmcm9tICcuL3pvb21faGlzdG9yeS5qcyc7XG5pbXBvcnQge2lzU3RyaW5nSW5TdXBwb3J0ZWRTY3JpcHR9IGZyb20gJy4uL3V0aWwvc2NyaXB0X2RldGVjdGlvbi5qcyc7XG5pbXBvcnQge3BsdWdpbiBhcyBydGxUZXh0UGx1Z2lufSBmcm9tICcuLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luLmpzJztcblxuaW1wb3J0IHR5cGUge1RyYW5zaXRpb25TcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgQ3Jvc3NmYWRlUGFyYW1ldGVycyA9IHtcbiAgICBmcm9tU2NhbGU6IG51bWJlcixcbiAgICB0b1NjYWxlOiBudW1iZXIsXG4gICAgdDogbnVtYmVyXG59O1xuXG5jbGFzcyBFdmFsdWF0aW9uUGFyYW1ldGVycyB7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIHBpdGNoOiBudW1iZXI7XG4gICAgbm93OiBudW1iZXI7XG4gICAgZmFkZUR1cmF0aW9uOiBudW1iZXI7XG4gICAgem9vbUhpc3Rvcnk6IFpvb21IaXN0b3J5O1xuICAgIHRyYW5zaXRpb246IFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uO1xuXG4gICAgLy8gXCJvcHRpb25zXCIgbWF5IGFsc28gYmUgYW5vdGhlciBFdmFsdWF0aW9uUGFyYW1ldGVycyB0byBjb3B5LCBzZWUgQ3Jvc3NGYWRlZFByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGVcbiAgICBjb25zdHJ1Y3Rvcih6b29tOiBudW1iZXIsIG9wdGlvbnM/OiAqKSB7XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG5cbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMubm93ID0gb3B0aW9ucy5ub3c7XG4gICAgICAgICAgICB0aGlzLmZhZGVEdXJhdGlvbiA9IG9wdGlvbnMuZmFkZUR1cmF0aW9uO1xuICAgICAgICAgICAgdGhpcy56b29tSGlzdG9yeSA9IG9wdGlvbnMuem9vbUhpc3Rvcnk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb24gPSBvcHRpb25zLnRyYW5zaXRpb247XG4gICAgICAgICAgICB0aGlzLnBpdGNoID0gb3B0aW9ucy5waXRjaDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm93ID0gMDtcbiAgICAgICAgICAgIHRoaXMuZmFkZUR1cmF0aW9uID0gMDtcbiAgICAgICAgICAgIHRoaXMuem9vbUhpc3RvcnkgPSBuZXcgWm9vbUhpc3RvcnkoKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IHt9O1xuICAgICAgICAgICAgdGhpcy5waXRjaCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1N1cHBvcnRlZFNjcmlwdChzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gaXNTdHJpbmdJblN1cHBvcnRlZFNjcmlwdChzdHIsIHJ0bFRleHRQbHVnaW4uaXNMb2FkZWQoKSk7XG4gICAgfVxuXG4gICAgY3Jvc3NGYWRpbmdGYWN0b3IoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuZmFkZUR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbigodGhpcy5ub3cgLSB0aGlzLnpvb21IaXN0b3J5Lmxhc3RJbnRlZ2VyWm9vbVRpbWUpIC8gdGhpcy5mYWRlRHVyYXRpb24sIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzIHtcbiAgICAgICAgY29uc3QgeiA9IHRoaXMuem9vbTtcbiAgICAgICAgY29uc3QgZnJhY3Rpb24gPSB6IC0gTWF0aC5mbG9vcih6KTtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuY3Jvc3NGYWRpbmdGYWN0b3IoKTtcblxuICAgICAgICByZXR1cm4geiA+IHRoaXMuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tID9cbiAgICAgICAgICAgIHtmcm9tU2NhbGU6IDIsIHRvU2NhbGU6IDEsIHQ6IGZyYWN0aW9uICsgKDEgLSBmcmFjdGlvbikgKiB0fSA6XG4gICAgICAgICAgICB7ZnJvbVNjYWxlOiAwLjUsIHRvU2NhbGU6IDEsIHQ6IDEgLSAoMSAtIHQpICogZnJhY3Rpb259O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZhbHVhdGlvblBhcmFtZXRlcnM7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge2Nsb25lLCBleHRlbmQsIGVhc2VDdWJpY0luT3V0fSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0ICogYXMgaW50ZXJwb2xhdGUgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCB7bm9ybWFsaXplUHJvcGVydHlFeHByZXNzaW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcblxuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge1N0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3N0eWxlLXNwZWMuanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uLFxuICAgIFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgRmVhdHVyZSxcbiAgICBGZWF0dXJlU3RhdGUsXG4gICAgU3R5bGVQcm9wZXJ0eUV4cHJlc3Npb24sXG4gICAgU291cmNlRXhwcmVzc2lvbixcbiAgICBDb21wb3NpdGVFeHByZXNzaW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5cbnR5cGUgVGltZVBvaW50ID0gbnVtYmVyO1xuXG5leHBvcnQgdHlwZSBDcm9zc0ZhZGVkPFQ+ID0ge1xuICAgIHRvOiBULFxuICAgIGZyb206IFQsXG4gICAgb3RoZXI/OiBUXG59O1xuXG4vKipcbiAqIEltcGxlbWVudHMgYSBudW1iZXIgb2YgY2xhc3NlcyB0aGF0IGRlZmluZSBzdGF0ZSBhbmQgYmVoYXZpb3IgZm9yIHBhaW50IGFuZCBsYXlvdXQgcHJvcGVydGllcywgbW9zdFxuICogaW1wb3J0YW50bHkgdGhlaXIgcmVzcGVjdGl2ZSBldmFsdWF0aW9uIGNoYWluczpcbiAqXG4gKiAgICAgICBUcmFuc2l0aW9uYWJsZSBwYWludCBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIOKGkiBUcmFuc2l0aW9uaW5nIHBhaW50IHByb3BlcnR5IHZhbHVlXG4gKiAgICAg4oaSIFBvc3NpYmx5IGV2YWx1YXRlZCBwYWludCBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIOKGkiBGdWxseSBldmFsdWF0ZWQgcGFpbnQgcHJvcGVydHkgdmFsdWVcbiAqXG4gKiAgICAgICBMYXlvdXQgcHJvcGVydHkgdmFsdWVcbiAqICAgICDihpIgUG9zc2libHkgZXZhbHVhdGVkIGxheW91dCBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIOKGkiBGdWxseSBldmFsdWF0ZWQgbGF5b3V0IHByb3BlcnR5IHZhbHVlXG4gKlxuICogQG1vZHVsZVxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqICBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGBQcm9wZXJ0eWAgaW50ZXJmYWNlOlxuICpcbiAqICAqIEhvbGQgbWV0YWRhdGEgYWJvdXQgYSBwcm9wZXJ0eSB0aGF0J3MgaW5kZXBlbmRlbnQgb2YgYW55IHNwZWNpZmljIHZhbHVlOiBzdHVmZiBsaWtlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSxcbiAqICAgIHRoZSBkZWZhdWx0IHZhbHVlLCBldGMuIFRoaXMgY29tZXMgZnJvbSB0aGUgc3R5bGUgc3BlY2lmaWNhdGlvbiBKU09OLlxuICogICogRGVmaW5lIGJlaGF2aW9yIHRoYXQgbmVlZHMgdG8gYmUgcG9seW1vcnBoaWMgYWNyb3NzIGRpZmZlcmVudCBwcm9wZXJ0aWVzOiBcInBvc3NpYmx5IGV2YWx1YXRpbmdcIlxuICogICAgYW4gaW5wdXQgdmFsdWUgKHNlZSBiZWxvdyksIGFuZCBpbnRlcnBvbGF0aW5nIGJldHdlZW4gdHdvIHBvc3NpYmx5LWV2YWx1dGVkIHZhbHVlcy5cbiAqXG4gKiAgVGhlIHR5cGUgYFRgIGlzIHRoZSBmdWxseS1ldmFsdWF0ZWQgdmFsdWUgdHlwZSAoZS5nLiBgbnVtYmVyYCwgYHN0cmluZ2AsIGBDb2xvcmApLlxuICogIFRoZSB0eXBlIGBSYCBpcyB0aGUgaW50ZXJtZWRpYXRlIFwicG9zc2libHkgZXZhbHVhdGVkXCIgdmFsdWUgdHlwZS4gU2VlIGJlbG93LlxuICpcbiAqICBUaGVyZSBhcmUgdHdvIG1haW4gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBpbnRlcmZhY2UgLS0gb25lIGZvciBwcm9wZXJ0aWVzIHRoYXQgYWxsb3cgZGF0YS1kcml2ZW4gdmFsdWVzLFxuICogIGFuZCBvbmUgZm9yIHByb3BlcnRpZXMgdGhhdCBkb24ndC4gVGhlcmUgYXJlIGEgZmV3IFwic3BlY2lhbCBjYXNlXCIgaW1wbGVtZW50YXRpb25zIGFzIHdlbGw6IG9uZSBmb3IgcHJvcGVydGllc1xuICogIHdoaWNoIGNyb3NzLWZhZGUgYmV0d2VlbiB0d28gdmFsdWVzIHJhdGhlciB0aGFuIGludGVycG9sYXRpbmcsIG9uZSBmb3IgYGhlYXRtYXAtY29sb3JgIGFuZCBgbGluZS1ncmFkaWVudGAsXG4gKiAgYW5kIG9uZSBmb3IgYGxpZ2h0LXBvc2l0aW9uYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnR5PFQsIFI+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcbiAgICBwb3NzaWJseUV2YWx1YXRlKHZhbHVlOiBQcm9wZXJ0eVZhbHVlPFQsIFI+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogUjtcbiAgICBpbnRlcnBvbGF0ZShhOiBSLCBiOiBSLCB0OiBudW1iZXIpOiBSO1xufVxuXG4vKipcbiAqICBgUHJvcGVydHlWYWx1ZWAgcmVwcmVzZW50cyB0aGUgdmFsdWUgcGFydCBvZiBhIHByb3BlcnR5IGtleS12YWx1ZSB1bml0LiBJdCdzIHVzZWQgdG8gcmVwcmVzZW50IGJvdGhcbiAqICBwYWludCBhbmQgbGF5b3V0IHByb3BlcnR5IHZhbHVlcywgYW5kIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhlaXIgcHJvcGVydHkgc3VwcG9ydHMgZGF0YS1kcml2ZW5cbiAqICBleHByZXNzaW9ucy5cbiAqXG4gKiAgYFByb3BlcnR5VmFsdWVgIHN0b3JlcyB0aGUgcmF3IGlucHV0IHZhbHVlIGFzIHNlZW4gaW4gYSBzdHlsZSBvciBhIHJ1bnRpbWUgc3R5bGluZyBBUEkgY2FsbCwgaS5lLiBvbmUgb2YgdGhlXG4gKiAgZm9sbG93aW5nOlxuICpcbiAqICAgICogQSBjb25zdGFudCB2YWx1ZSBvZiB0aGUgdHlwZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHByb3BlcnR5XG4gKiAgICAqIEEgZnVuY3Rpb24gd2hpY2ggcHJvZHVjZXMgYSB2YWx1ZSBvZiB0aGF0IHR5cGUgKGJ1dCBmdW5jdGlvbnMgYXJlIHF1YXNpLWRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgZXhwcmVzc2lvbnMpXG4gKiAgICAqIEFuIGV4cHJlc3Npb24gd2hpY2ggcHJvZHVjZXMgYSB2YWx1ZSBvZiB0aGF0IHR5cGVcbiAqICAgICogXCJ1bmRlZmluZWRcIi9cIm5vdCBwcmVzZW50XCIsIGluIHdoaWNoIGNhc2UgdGhlIHByb3BlcnR5IGlzIGFzc3VtZWQgdG8gdGFrZSBvbiBpdHMgZGVmYXVsdCB2YWx1ZS5cbiAqXG4gKiAgSW4gYWRkaXRpb24gdG8gc3RvcmluZyB0aGUgb3JpZ2luYWwgaW5wdXQgdmFsdWUsIGBQcm9wZXJ0eVZhbHVlYCBhbHNvIHN0b3JlcyBhIG5vcm1hbGl6ZWQgcmVwcmVzZW50YXRpb24sXG4gKiAgZWZmZWN0aXZlbHkgdHJlYXRpbmcgZnVuY3Rpb25zIGFzIGlmIHRoZXkgYXJlIGV4cHJlc3Npb25zLCBhbmQgY29uc3RhbnQgb3IgZGVmYXVsdCB2YWx1ZXMgYXMgaWYgdGhleSBhcmVcbiAqICAoY29uc3RhbnQpIGV4cHJlc3Npb25zLlxuICpcbiAqICBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgUHJvcGVydHlWYWx1ZTxULCBSPiB7XG4gICAgcHJvcGVydHk6IFByb3BlcnR5PFQsIFI+O1xuICAgIHZhbHVlOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPiB8IHZvaWQ7XG4gICAgZXhwcmVzc2lvbjogU3R5bGVQcm9wZXJ0eUV4cHJlc3Npb247XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj4sIHZhbHVlOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPiB8IHZvaWQpIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IG5vcm1hbGl6ZVByb3BlcnR5RXhwcmVzc2lvbih2YWx1ZSA9PT0gdW5kZWZpbmVkID8gcHJvcGVydHkuc3BlY2lmaWNhdGlvbi5kZWZhdWx0IDogdmFsdWUsIHByb3BlcnR5LnNwZWNpZmljYXRpb24pO1xuICAgIH1cblxuICAgIGlzRGF0YURyaXZlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbi5raW5kID09PSAnc291cmNlJyB8fCB0aGlzLmV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbXBvc2l0ZSc7XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogUiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGUodGhpcywgcGFyYW1ldGVycywgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLSBUcmFuc2l0aW9uYWJsZSAtLS0tLS0tXG5cbmV4cG9ydCB0eXBlIFRyYW5zaXRpb25QYXJhbWV0ZXJzID0ge1xuICAgIG5vdzogVGltZVBvaW50LFxuICAgIHRyYW5zaXRpb246IFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uXG59O1xuXG4vKipcbiAqIFBhaW50IHByb3BlcnRpZXMgYXJlIF90cmFuc2l0aW9uYWJsZV86IHRoZXkgY2FuIGNoYW5nZSBpbiBhIGZsdWlkIG1hbm5lciwgaW50ZXJwb2xhdGluZyBvciBjcm9zcy1mYWRpbmcgYmV0d2VlblxuICogb2xkIGFuZCBuZXcgdmFsdWUuIFRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiwgYW5kIHRoZSBkZWxheSBiZWZvcmUgaXQgYmVnaW5zLCBpcyBjb25maWd1cmFibGUuXG4gKlxuICogYFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZWAgaXMgYSBjb21wb3NpdGlvbmFsIGNsYXNzIHRoYXQgc3RvcmVzIGJvdGggdGhlIHByb3BlcnR5IHZhbHVlIGFuZCB0aGF0IHRyYW5zaXRpb25cbiAqIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQSBgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlYCBjYW4gY2FsY3VsYXRlIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIGV2YWx1YXRpb24gY2hhaW4gZm9yIHBhaW50IHByb3BlcnR5IHZhbHVlczpcbiAqIGBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlPFQsIFI+IHtcbiAgICBwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj47XG4gICAgdmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj47XG4gICAgdHJhbnNpdGlvbjogVHJhbnNpdGlvblNwZWNpZmljYXRpb24gfCB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydHk6IFByb3BlcnR5PFQsIFI+KSB7XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBQcm9wZXJ0eVZhbHVlKHByb3BlcnR5LCB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHRyYW5zaXRpb25lZChwYXJhbWV0ZXJzOiBUcmFuc2l0aW9uUGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgcHJpb3I6IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlPFQsIFI+KTogVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj4ge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlKHRoaXMucHJvcGVydHksIHRoaXMudmFsdWUsIHByaW9yLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgICBleHRlbmQoe30sIHBhcmFtZXRlcnMudHJhbnNpdGlvbiwgdGhpcy50cmFuc2l0aW9uKSwgcGFyYW1ldGVycy5ub3cpO1xuICAgIH1cblxuICAgIHVudHJhbnNpdGlvbmVkKCk6IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlPFQsIFI+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZSh0aGlzLnByb3BlcnR5LCB0aGlzLnZhbHVlLCBudWxsLCB7fSwgMCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICB9XG59XG5cbi8qKlxuICogQSBoZWxwZXIgdHlwZTogZ2l2ZW4gYW4gb2JqZWN0IHR5cGUgYFByb3BlcnRpZXNgIHdob3NlIHZhbHVlcyBhcmUgZWFjaCBvZiB0eXBlIGBQcm9wZXJ0eTxULCBSPmAsIGl0IGNhbGN1bGF0ZXNcbiAqIGFuIG9iamVjdCB0eXBlIHdpdGggdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzIG9mIHR5cGUgYFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZTxULCBSPmAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudHlwZSBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzPFByb3BzOiBPYmplY3Q+XG4gICAgPSAkRXhhY3Q8JE9iak1hcDxQcm9wcywgPFQsIFI+KHA6IFByb3BlcnR5PFQsIFI+KSA9PiBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWU8VCwgUj4+PlxuXG4vKipcbiAqIGBUcmFuc2l0aW9uYWJsZWAgc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZWApIHBhaXJzIGZvciBwYWludCBwcm9wZXJ0aWVzIG9mIGFcbiAqIGdpdmVuIGxheWVyIHR5cGUuIEl0IGNhbiBjYWxjdWxhdGUgdGhlIGBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZWBzIGZvciBhbGwgb2YgdGhlbSBhdCBvbmNlLCBwcm9kdWNpbmcgYVxuICogYFRyYW5zaXRpb25pbmdgIGluc3RhbmNlIGZvciB0aGUgc2FtZSBzZXQgb2YgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvbmFibGU8UHJvcHM6IE9iamVjdD4ge1xuICAgIF9wcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPjtcbiAgICBfdmFsdWVzOiBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzPFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+KSB7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSAoT2JqZWN0LmNyZWF0ZShwcm9wZXJ0aWVzLmRlZmF1bHRUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWVzKTogYW55KTtcbiAgICB9XG5cbiAgICBnZXRWYWx1ZTxTOiBzdHJpbmcsIFQ+KG5hbWU6IFMpOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPiB8IHZvaWQge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy5fdmFsdWVzW25hbWVdLnZhbHVlLnZhbHVlKTtcbiAgICB9XG5cbiAgICBzZXRWYWx1ZTxTOiBzdHJpbmcsIFQ+KG5hbWU6IFMsIHZhbHVlOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPiB8IHZvaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl92YWx1ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tuYW1lXSA9IG5ldyBUcmFuc2l0aW9uYWJsZVByb3BlcnR5VmFsdWUodGhpcy5fdmFsdWVzW25hbWVdLnByb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gbm90IF9yZW1vdmVfIGFuIG93biBwcm9wZXJ0eSBpbiB0aGUgY2FzZSB3aGVyZSBhIHZhbHVlIGlzIGJlaW5nIHJlc2V0XG4gICAgICAgIC8vIHRvIHRoZSBkZWZhdWx0OiB0aGUgdHJhbnNpdGlvbiBtaWdodCBzdGlsbCBiZSBub24tZGVmYXVsdC5cbiAgICAgICAgdGhpcy5fdmFsdWVzW25hbWVdLnZhbHVlID0gbmV3IFByb3BlcnR5VmFsdWUodGhpcy5fdmFsdWVzW25hbWVdLnByb3BlcnR5LCB2YWx1ZSA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGNsb25lKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgZ2V0VHJhbnNpdGlvbjxTOiBzdHJpbmc+KG5hbWU6IFMpOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbiB8IHZvaWQge1xuICAgICAgICByZXR1cm4gY2xvbmUodGhpcy5fdmFsdWVzW25hbWVdLnRyYW5zaXRpb24pO1xuICAgIH1cblxuICAgIHNldFRyYW5zaXRpb248Uzogc3RyaW5nPihuYW1lOiBTLCB2YWx1ZTogVHJhbnNpdGlvblNwZWNpZmljYXRpb24gfCB2b2lkKSB7XG4gICAgICAgIGlmICghdGhpcy5fdmFsdWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLl92YWx1ZXNbbmFtZV0gPSBuZXcgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlKHRoaXMuX3ZhbHVlc1tuYW1lXS5wcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmFsdWVzW25hbWVdLnRyYW5zaXRpb24gPSBjbG9uZSh2YWx1ZSkgfHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbnM8UHJvcHM+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBPYmplY3QgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSB0aGlzLmdldFRyYW5zaXRpb24ocHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKHRyYW5zaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtgJHtwcm9wZXJ0eX0tdHJhbnNpdGlvbmBdID0gdHJhbnNpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRyYW5zaXRpb25lZChwYXJhbWV0ZXJzOiBUcmFuc2l0aW9uUGFyYW1ldGVycywgcHJpb3I6IFRyYW5zaXRpb25pbmc8UHJvcHM+KTogVHJhbnNpdGlvbmluZzxQcm9wcz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVHJhbnNpdGlvbmluZyh0aGlzLl9wcm9wZXJ0aWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5fdmFsdWVzW3Byb3BlcnR5XSA9IHRoaXMuX3ZhbHVlc1twcm9wZXJ0eV0udHJhbnNpdGlvbmVkKHBhcmFtZXRlcnMsIHByaW9yLl92YWx1ZXNbcHJvcGVydHldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHVudHJhbnNpdGlvbmVkKCk6IFRyYW5zaXRpb25pbmc8UHJvcHM+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFRyYW5zaXRpb25pbmcodGhpcy5fcHJvcGVydGllcyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyh0aGlzLl92YWx1ZXMpKSB7XG4gICAgICAgICAgICByZXN1bHQuX3ZhbHVlc1twcm9wZXJ0eV0gPSB0aGlzLl92YWx1ZXNbcHJvcGVydHldLnVudHJhbnNpdGlvbmVkKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0gVHJhbnNpdGlvbmluZyAtLS0tLS0tXG5cbi8qKlxuICogYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlYCBpbXBsZW1lbnRzIHRoZSBmaXJzdCBvZiB0d28gaW50ZXJtZWRpYXRlIHN0ZXBzIGluIHRoZSBldmFsdWF0aW9uIGNoYWluIG9mIGEgcGFpbnRcbiAqIHByb3BlcnR5IHZhbHVlLiBJbiB0aGlzIHN0ZXAsIHRyYW5zaXRpb25zIGJldHdlZW4gb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBoYW5kbGVkOiBhcyBsb25nIGFzIHRoZSB0cmFuc2l0aW9uIGlzIGluXG4gKiBwcm9ncmVzcywgYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlYCBtYWludGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHByaW9yIHZhbHVlLCBhbmQgaW50ZXJwb2xhdGVzIGJldHdlZW4gaXQgYW5kXG4gKiB0aGUgbmV3IHZhbHVlIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUgYW5kIHRoZSBjb25maWd1cmVkIHRyYW5zaXRpb24gZHVyYXRpb24gYW5kIGRlbGF5LiBUaGUgcHJvZHVjdCBpcyB0aGUgbmV4dFxuICogc3RlcCBpbiB0aGUgZXZhbHVhdGlvbiBjaGFpbjogdGhlIFwicG9zc2libHkgZXZhbHVhdGVkXCIgcmVzdWx0IHR5cGUgYFJgLiBTZWUgYmVsb3cgZm9yIG1vcmUgb24gdGhpcyBjb25jZXB0LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlPFQsIFI+IHtcbiAgICBwcm9wZXJ0eTogUHJvcGVydHk8VCwgUj47XG4gICAgdmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj47XG4gICAgcHJpb3I6ID9UcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPjtcbiAgICBiZWdpbjogVGltZVBvaW50O1xuICAgIGVuZDogVGltZVBvaW50O1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydHk6IFByb3BlcnR5PFQsIFI+LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBQcm9wZXJ0eVZhbHVlPFQsIFI+LFxuICAgICAgICAgICAgICAgIHByaW9yOiA/VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWU8VCwgUj4sXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogVHJhbnNpdGlvblNwZWNpZmljYXRpb24sXG4gICAgICAgICAgICAgICAgbm93OiBUaW1lUG9pbnQpIHtcbiAgICAgICAgY29uc3QgZGVsYXkgPSB0cmFuc2l0aW9uLmRlbGF5IHx8IDA7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gdHJhbnNpdGlvbi5kdXJhdGlvbiB8fCAwO1xuICAgICAgICBub3cgPSBub3cgfHwgMDtcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuYmVnaW4gPSBub3cgKyBkZWxheTtcbiAgICAgICAgdGhpcy5lbmQgPSB0aGlzLmJlZ2luICsgZHVyYXRpb247XG4gICAgICAgIGlmIChwcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLnRyYW5zaXRpb24gJiYgKHRyYW5zaXRpb24uZGVsYXkgfHwgdHJhbnNpdGlvbi5kdXJhdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMucHJpb3IgPSBwcmlvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4pOiBSIHtcbiAgICAgICAgY29uc3Qgbm93ID0gcGFyYW1ldGVycy5ub3cgfHwgMDtcbiAgICAgICAgY29uc3QgZmluYWxWYWx1ZSA9IHRoaXMudmFsdWUucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIGNvbnN0IHByaW9yID0gdGhpcy5wcmlvcjtcbiAgICAgICAgaWYgKCFwcmlvcikge1xuICAgICAgICAgICAgLy8gTm8gcHJpb3IgdmFsdWUuXG4gICAgICAgICAgICByZXR1cm4gZmluYWxWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChub3cgPiB0aGlzLmVuZCkge1xuICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiBmcm9tIHByaW9yIHZhbHVlIGlzIG5vdyBjb21wbGV0ZS5cbiAgICAgICAgICAgIHRoaXMucHJpb3IgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZS5pc0RhdGFEcml2ZW4oKSkge1xuICAgICAgICAgICAgLy8gVHJhbnNpdGlvbnMgdG8gZGF0YS1kcml2ZW4gcHJvcGVydGllcyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgICAgICAgIC8vIFdlIHNuYXAgaW1tZWRpYXRlbHkgdG8gdGhlIGRhdGEtZHJpdmVuIHZhbHVlIHNvIHRoYXQsIHdoZW4gd2UgcGVyZm9ybSBsYXlvdXQsXG4gICAgICAgICAgICAvLyB3ZSBzZWUgdGhlIGRhdGEtZHJpdmVuIGZ1bmN0aW9uIGFuZCBjYW4gdXNlIGl0IHRvIHBvcHVsYXRlIHZlcnRleCBidWZmZXJzLlxuICAgICAgICAgICAgdGhpcy5wcmlvciA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gZmluYWxWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChub3cgPCB0aGlzLmJlZ2luKSB7XG4gICAgICAgICAgICAvLyBUcmFuc2l0aW9uIGhhc24ndCBzdGFydGVkIHlldC5cbiAgICAgICAgICAgIHJldHVybiBwcmlvci5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEludGVycG9sYXRlIGJldHdlZW4gcmVjdXJzaXZlbHktY2FsY3VsYXRlZCBwcmlvciB2YWx1ZSBhbmQgZmluYWwuXG4gICAgICAgICAgICBjb25zdCB0ID0gKG5vdyAtIHRoaXMuYmVnaW4pIC8gKHRoaXMuZW5kIC0gdGhpcy5iZWdpbik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eS5pbnRlcnBvbGF0ZShwcmlvci5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzKSwgZmluYWxWYWx1ZSwgZWFzZUN1YmljSW5PdXQodCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEEgaGVscGVyIHR5cGU6IGdpdmVuIGFuIG9iamVjdCB0eXBlIGBQcm9wZXJ0aWVzYCB3aG9zZSB2YWx1ZXMgYXJlIGVhY2ggb2YgdHlwZSBgUHJvcGVydHk8VCwgUj5gLCBpdCBjYWxjdWxhdGVzXG4gKiBhbiBvYmplY3QgdHlwZSB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBvZiB0eXBlIGBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZTxULCBSPmAuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudHlwZSBUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXM8UHJvcHM6IE9iamVjdD5cbiAgICA9ICRFeGFjdDwkT2JqTWFwPFByb3BzLCA8VCwgUj4ocDogUHJvcGVydHk8VCwgUj4pID0+IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlPFQsIFI+Pj5cblxuLyoqXG4gKiBgVHJhbnNpdGlvbmluZ2Agc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlYCkgcGFpcnMgZm9yIHBhaW50IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS4gSXQgY2FuIGNhbGN1bGF0ZSB0aGUgcG9zc2libHktZXZhbHVhdGVkIHZhbHVlcyBmb3IgYWxsIG9mIHRoZW0gYXQgb25jZSwgcHJvZHVjaW5nIGFcbiAqIGBQb3NzaWJseUV2YWx1YXRlZGAgaW5zdGFuY2UgZm9yIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2l0aW9uaW5nPFByb3BzOiBPYmplY3Q+IHtcbiAgICBfcHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz47XG4gICAgX3ZhbHVlczogVHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzPFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKHByb3BlcnRpZXM6IFByb3BlcnRpZXM8UHJvcHM+KSB7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLl92YWx1ZXMgPSAoT2JqZWN0LmNyZWF0ZShwcm9wZXJ0aWVzLmRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXMpOiBhbnkpO1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPik6IFBvc3NpYmx5RXZhbHVhdGVkPFByb3BzPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBQb3NzaWJseUV2YWx1YXRlZCh0aGlzLl9wcm9wZXJ0aWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5fdmFsdWVzW3Byb3BlcnR5XSA9IHRoaXMuX3ZhbHVlc1twcm9wZXJ0eV0ucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWx1ZXNbcHJvcGVydHldLnByaW9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLSBMYXlvdXQgLS0tLS0tLVxuXG4vKipcbiAqIEEgaGVscGVyIHR5cGU6IGdpdmVuIGFuIG9iamVjdCB0eXBlIGBQcm9wZXJ0aWVzYCB3aG9zZSB2YWx1ZXMgYXJlIGVhY2ggb2YgdHlwZSBgUHJvcGVydHk8VCwgUj5gLCBpdCBjYWxjdWxhdGVzXG4gKiBhbiBvYmplY3QgdHlwZSB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBvZiB0eXBlIGBQcm9wZXJ0eVZhbHVlPFQsIFI+YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG50eXBlIFByb3BlcnR5VmFsdWVzPFByb3BzOiBPYmplY3Q+XG4gICAgPSAkRXhhY3Q8JE9iak1hcDxQcm9wcywgPFQsIFI+KHA6IFByb3BlcnR5PFQsIFI+KSA9PiBQcm9wZXJ0eVZhbHVlPFQsIFI+Pj5cblxuLyoqXG4gKiBBIGhlbHBlciB0eXBlOiBnaXZlbiBhbiBvYmplY3QgdHlwZSBgUHJvcGVydGllc2Agd2hvc2UgdmFsdWVzIGFyZSBlYWNoIG9mIHR5cGUgYFByb3BlcnR5PFQsIFI+YCwgaXQgY2FsY3VsYXRlc1xuICogYW4gb2JqZWN0IHR5cGUgd2l0aCB0aGUgc2FtZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdHlwZSBgUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248VD5gLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnR5cGUgUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb25zPFByb3BzOiBPYmplY3Q+XG4gICAgPSAkRXhhY3Q8JE9iak1hcDxQcm9wcywgPFQsIFI+KHA6IFByb3BlcnR5PFQsIFI+KSA9PiBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxUPj4+XG5cbi8qKlxuICogQmVjYXVzZSBsYXlvdXQgcHJvcGVydGllcyBhcmUgbm90IHRyYW5zaXRpb25hYmxlLCB0aGV5IGhhdmUgYSBzaW1wbGVyIHJlcHJlc2VudGF0aW9uIGFuZCBldmFsdWF0aW9uIGNoYWluIHRoYW5cbiAqIHBhaW50IHByb3BlcnRpZXM6IGBQcm9wZXJ0eVZhbHVlYHMgYXJlIHBvc3NpYmx5IGV2YWx1YXRlZCwgcHJvZHVjaW5nIHBvc3NpYmx5IGV2YWx1YXRlZCB2YWx1ZXMsIHdoaWNoIGFyZSB0aGVuXG4gKiBmdWxseSBldmFsdWF0ZWQuXG4gKlxuICogYExheW91dGAgc3RvcmVzIGEgbWFwIG9mIGFsbCAocHJvcGVydHkgbmFtZSwgYFByb3BlcnR5VmFsdWVgKSBwYWlycyBmb3IgbGF5b3V0IHByb3BlcnRpZXMgb2YgYVxuICogZ2l2ZW4gbGF5ZXIgdHlwZS4gSXQgY2FuIGNhbGN1bGF0ZSB0aGUgcG9zc2libHktZXZhbHVhdGVkIHZhbHVlcyBmb3IgYWxsIG9mIHRoZW0gYXQgb25jZSwgcHJvZHVjaW5nIGFcbiAqIGBQb3NzaWJseUV2YWx1YXRlZGAgaW5zdGFuY2UgZm9yIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXlvdXQ8UHJvcHM6IE9iamVjdD4ge1xuICAgIF9wcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPjtcbiAgICBfdmFsdWVzOiBQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0UHJvcGVydHlWYWx1ZXMpOiBhbnkpO1xuICAgIH1cblxuICAgIGdldFZhbHVlPFM6IHN0cmluZywgVD4obmFtZTogUyk6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uPFQ+IHwgdm9pZCB7XG4gICAgICAgIHJldHVybiBjbG9uZSh0aGlzLl92YWx1ZXNbbmFtZV0udmFsdWUpO1xuICAgIH1cblxuICAgIHNldFZhbHVlPFM6IHN0cmluZz4obmFtZTogUywgdmFsdWU6ICopIHtcbiAgICAgICAgdGhpcy5fdmFsdWVzW25hbWVdID0gbmV3IFByb3BlcnR5VmFsdWUodGhpcy5fdmFsdWVzW25hbWVdLnByb3BlcnR5LCB2YWx1ZSA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGNsb25lKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IFByb3BlcnR5VmFsdWVTcGVjaWZpY2F0aW9uczxQcm9wcz4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IE9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZShwcm9wZXJ0eSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgYXZhaWxhYmxlSW1hZ2VzPzogQXJyYXk8c3RyaW5nPik6IFBvc3NpYmx5RXZhbHVhdGVkPFByb3BzPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBQb3NzaWJseUV2YWx1YXRlZCh0aGlzLl9wcm9wZXJ0aWVzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3ZhbHVlcykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5fdmFsdWVzW3Byb3BlcnR5XSA9IHRoaXMuX3ZhbHVlc1twcm9wZXJ0eV0ucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0gUG9zc2libHlFdmFsdWF0ZWQgLS0tLS0tLVxuXG4vKipcbiAqIFwiUG9zc2libHkgZXZhbHVhdGVkIHZhbHVlXCIgaXMgYW4gaW50ZXJtZWRpYXRlIHN0YWdlIGluIHRoZSBldmFsdWF0aW9uIGNoYWluIGZvciBib3RoIHBhaW50IGFuZCBsYXlvdXQgcHJvcGVydHlcbiAqIHZhbHVlcy4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBzdGFnZSBpcyB0byBvcHRpbWl6ZSBhd2F5IHVubmVjZXNzYXJ5IHJlY2FsY3VsYXRpb25zIGZvciBkYXRhLWRyaXZlbiBwcm9wZXJ0aWVzLiBDb2RlXG4gKiB3aGljaCB1c2VzIGRhdGEtZHJpdmVuIHByb3BlcnR5IHZhbHVlcyBtdXN0IGFzc3VtZSB0aGF0IHRoZSB2YWx1ZSBpcyBkZXBlbmRlbnQgb24gZmVhdHVyZSBkYXRhLCBhbmQgcmVxdWVzdCB0aGF0IGl0XG4gKiBiZSBldmFsdWF0ZWQgZm9yIGVhY2ggZmVhdHVyZS4gQnV0IHdoZW4gdGhhdCBwcm9wZXJ0eSB2YWx1ZSBpcyBpbiBmYWN0IGEgY29uc3RhbnQgb3IgY2FtZXJhIGZ1bmN0aW9uLCB0aGUgY2FsY3VsYXRpb25cbiAqIHdpbGwgbm90IGFjdHVhbGx5IGRlcGVuZCBvbiB0aGUgZmVhdHVyZSwgYW5kIHdlIGNhbiBiZW5lZml0IGZyb20gcmV0dXJuaW5nIHRoZSBwcmlvciByZXN1bHQgb2YgaGF2aW5nIGRvbmUgdGhlXG4gKiBldmFsdWF0aW9uIG9uY2UsIGFoZWFkIG9mIHRpbWUsIGluIGFuIGludGVybWVkaWF0ZSBzdGVwIHdob3NlIGlucHV0cyBhcmUganVzdCB0aGUgdmFsdWUgYW5kIFwiZ2xvYmFsXCIgcGFyYW1ldGVyc1xuICogc3VjaCBhcyBjdXJyZW50IHpvb20gbGV2ZWwuXG4gKlxuICogYFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVgIHJlcHJlc2VudHMgdGhlIHRocmVlIHBvc3NpYmxlIG91dGNvbWVzIG9mIHRoaXMgc3RlcDogaWYgdGhlIGlucHV0IHZhbHVlIHdhcyBhIGNvbnN0YW50IG9yXG4gKiBjYW1lcmEgZXhwcmVzc2lvbiwgdGhlbiB0aGUgXCJwb3NzaWJseSBldmFsdWF0ZWRcIiByZXN1bHQgaXMgYSBjb25zdGFudCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgaW5wdXQgdmFsdWUgd2FzIGVpdGhlclxuICogYSBzb3VyY2Ugb3IgY29tcG9zaXRlIGV4cHJlc3Npb24sIGFuZCB3ZSBtdXN0IGRlZmVyIGZpbmFsIGV2YWx1YXRpb24gdW50aWwgc3VwcGxpZWQgYSBmZWF0dXJlLiBXZSBzZXBhcmF0ZVxuICogdGhlIHNvdXJjZSBhbmQgY29tcG9zaXRlIGNhc2VzIGJlY2F1c2UgdGhleSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSB3aGVuIGdlbmVyYXRpbmcgR0wgYXR0cmlidXRlcywgYnVmZmVycywgYW5kXG4gKiB1bmlmb3Jtcy5cbiAqXG4gKiBOb3RlIHRoYXQgYFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVgIChhbmQgYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZWAsIGJlbG93KSBhcmUgX25vdF8gdXNlZCBmb3IgcHJvcGVydGllcyB0aGF0XG4gKiBkbyBub3QgYWxsb3cgZGF0YS1kcml2ZW4gdmFsdWVzLiBGb3Igc3VjaCBwcm9wZXJ0aWVzLCB3ZSBrbm93IHRoYXQgdGhlIFwicG9zc2libHkgZXZhbHVhdGVkXCIgcmVzdWx0IGlzIGFsd2F5cyBhIGNvbnN0YW50XG4gKiBzY2FsYXIgdmFsdWUuIFNlZSBiZWxvdy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG50eXBlIFBvc3NpYmx5RXZhbHVhdGVkVmFsdWU8VD4gPVxuICAgIHwge2tpbmQ6ICdjb25zdGFudCcsIHZhbHVlOiBUfVxuICAgIHwgU291cmNlRXhwcmVzc2lvblxuICAgIHwgQ29tcG9zaXRlRXhwcmVzc2lvbjtcblxuLyoqXG4gKiBgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlYCBpcyB1c2VkIGZvciBkYXRhLWRyaXZlbiBwYWludCBhbmQgbGF5b3V0IHByb3BlcnR5IHZhbHVlcy4gSXQgaG9sZHMgYVxuICogYFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVgIGFuZCB0aGUgYEdsb2JhbFByb3BlcnRpZXNgIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIGl0LiBZb3UncmUgbm90IGFsbG93ZWQgdG8gc3VwcGx5XG4gKiBhIGRpZmZlcmVudCBzZXQgb2YgYEdsb2JhbFByb3BlcnRpZXNgIHdoZW4gcGVyZm9ybWluZyB0aGUgZmluYWwgZXZhbHVhdGlvbiBiZWNhdXNlIHRoZXkgd291bGQgYmUgaWdub3JlZCBpbiB0aGVcbiAqIGNhc2Ugd2hlcmUgdGhlIGlucHV0IHZhbHVlIHdhcyBhIGNvbnN0YW50IG9yIGNhbWVyYSBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+IHtcbiAgICBwcm9wZXJ0eTogRGF0YURyaXZlblByb3BlcnR5PFQ+O1xuICAgIHZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFZhbHVlPFQ+O1xuICAgIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzO1xuXG4gICAgY29uc3RydWN0b3IocHJvcGVydHk6IERhdGFEcml2ZW5Qcm9wZXJ0eTxUPiwgdmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkVmFsdWU8VD4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgIH1cblxuICAgIGlzQ29uc3RhbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLmtpbmQgPT09ICdjb25zdGFudCc7XG4gICAgfVxuXG4gICAgY29uc3RhbnRPcih2YWx1ZTogVCk6IFQge1xuICAgICAgICBpZiAodGhpcy52YWx1ZS5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2YWx1YXRlKGZlYXR1cmU6IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHkuZXZhbHVhdGUodGhpcy52YWx1ZSwgdGhpcy5wYXJhbWV0ZXJzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBoZWxwZXIgdHlwZTogZ2l2ZW4gYW4gb2JqZWN0IHR5cGUgYFByb3BlcnRpZXNgIHdob3NlIHZhbHVlcyBhcmUgZWFjaCBvZiB0eXBlIGBQcm9wZXJ0eTxULCBSPmAsIGl0IGNhbGN1bGF0ZXNcbiAqIGFuIG9iamVjdCB0eXBlIHdpdGggdGhlIHNhbWUga2V5cywgYW5kIHZhbHVlcyBvZiB0eXBlIGBSYC5cbiAqXG4gKiBGb3IgcHJvcGVydGllcyB0aGF0IGRvbid0IGFsbG93IGRhdGEtZHJpdmVuIHZhbHVlcywgYFJgIGlzIGEgc2NhbGFyIHR5cGUgc3VjaCBhcyBgbnVtYmVyYCwgYHN0cmluZ2AsIG9yIGBDb2xvcmAuXG4gKiBGb3IgZGF0YS1kcml2ZW4gcHJvcGVydGllcywgaXQgaXMgYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZWAuIENyaXRpY2FsbHksIHRoZSB0eXBlIGRlZmluaXRpb25zIGFyZSBzZXQgdXBcbiAqIGluIGEgd2F5IHRoYXQgYWxsb3dzIGZsb3cgdG8ga25vdyB3aGljaCBvZiB0aGVzZSB0d28gY2FzZXMgYXBwbGllcyBmb3IgYW55IGdpdmVuIHByb3BlcnR5IG5hbWUsIGFuZCBpZiB5b3UgYXR0ZW1wdFxuICogdG8gdXNlIGEgYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZWAgYXMgaWYgaXQgd2FzIGEgc2NhbGFyLCBvciB2aWNlIHZlcnNhLCB5b3Ugd2lsbCBnZXQgYSB0eXBlIGVycm9yLiAoSG93ZXZlcixcbiAqIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGNhc2UgaW4gd2hpY2ggZmxvdyBmYWlscyB0byBwcm9kdWNlIGEgdHlwZSBlcnJvciB0aGF0IHlvdSBzaG91bGQgYmUgYXdhcmUgb2Y6IGluIGEgY29udGV4dCBzdWNoXG4gKiBhcyBgbGF5ZXIucGFpbnQuZ2V0KCdmb28tb3BhY2l0eScpID09PSAwYCwgaWYgYGZvby1vcGFjaXR5YCBpcyBkYXRhLWRyaXZlbiwgdGhhbiB0aGUgbGVmdC1oYW5kIHNpZGUgaXMgb2YgdHlwZVxuICogYFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+YCwgYnV0IGZsb3cgd2lsbCBub3QgY29tcGxhaW4gYWJvdXQgY29tcGFyaW5nIHRoaXMgdG8gYSBudW1iZXIgdXNpbmcgYD09PWAuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzIzNTkuKVxuICpcbiAqIFRoZXJlJ3MgYWxzbyBhIHRoaXJkLCBzcGVjaWFsIGNhc2UgcG9zc2libGl0eSBmb3IgYFJgOiBmb3IgY3Jvc3MtZmFkZWQgcHJvcGVydGllcywgaXQncyBgP0Nyb3NzRmFkZWQ8VD5gLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnR5cGUgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlczxQcm9wczogT2JqZWN0PlxuICAgID0gJEV4YWN0PCRPYmpNYXA8UHJvcHMsIDxULCBSPihwOiBQcm9wZXJ0eTxULCBSPikgPT4gUj4+XG5cbi8qKlxuICogYFBvc3NpYmx5RXZhbHVhdGVkYCBzdG9yZXMgYSBtYXAgb2YgYWxsIChwcm9wZXJ0eSBuYW1lLCBgUmApIHBhaXJzIGZvciBwYWludCBvciBsYXlvdXQgcHJvcGVydGllcyBvZiBhXG4gKiBnaXZlbiBsYXllciB0eXBlLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFBvc3NpYmx5RXZhbHVhdGVkPFByb3BzOiBPYmplY3Q+IHtcbiAgICBfcHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz47XG4gICAgX3ZhbHVlczogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPikge1xuICAgICAgICB0aGlzLl9wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5fdmFsdWVzID0gKE9iamVjdC5jcmVhdGUocHJvcGVydGllcy5kZWZhdWx0UG9zc2libHlFdmFsdWF0ZWRWYWx1ZXMpOiBhbnkpO1xuICAgIH1cblxuICAgIGdldDxTOiBzdHJpbmc+KG5hbWU6IFMpOiAkRWxlbWVudFR5cGU8UG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlczxQcm9wcz4sIFM+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlc1tuYW1lXTtcbiAgICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYFByb3BlcnR5YCBmb3IgcHJvcGVydGllcyB0aGF0IGRvIG5vdCBwZXJtaXQgZGF0YS1kcml2ZW4gKHNvdXJjZSBvciBjb21wb3NpdGUpIGV4cHJlc3Npb25zLlxuICogVGhpcyByZXN0cmljdGlvbiBhbGxvd3MgdXMgdG8gZGVjbGFyZSBzdGF0aWNhbGx5IHRoYXQgdGhlIHJlc3VsdCBvZiBwb3NzaWJseSBldmFsdWF0aW5nIHRoaXMga2luZCBvZiBwcm9wZXJ0eVxuICogaXMgaW4gZmFjdCBhbHdheXMgdGhlIHNjYWxhciB0eXBlIGBUYCwgYW5kIGNhbiBiZSB1c2VkIHdpdGhvdXQgZnVydGhlciBldmFsdWF0aW5nIHRoZSB2YWx1ZSBvbiBhIHBlci1mZWF0dXJlIGJhc2lzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxUPiBpbXBsZW1lbnRzIFByb3BlcnR5PFQsIFQ+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBUPiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiBUIHtcbiAgICAgICAgYXNzZXJ0KCF2YWx1ZS5pc0RhdGFEcml2ZW4oKSk7XG4gICAgICAgIHJldHVybiB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIGludGVycG9sYXRlKGE6IFQsIGI6IFQsIHQ6IG51bWJlcik6IFQge1xuICAgICAgICBjb25zdCBpbnRlcnA6ID8oYTogVCwgYjogVCwgdDogbnVtYmVyKSA9PiBUID0gKGludGVycG9sYXRlOiBhbnkpW3RoaXMuc3BlY2lmaWNhdGlvbi50eXBlXTtcbiAgICAgICAgaWYgKGludGVycCkge1xuICAgICAgICAgICAgcmV0dXJuIGludGVycChhLCBiLCB0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIHByb3BlcnRpZXMgdGhhdCBwZXJtaXQgZGF0YS1kcml2ZW4gKHNvdXJjZSBvciBjb21wb3NpdGUpIGV4cHJlc3Npb25zLlxuICogVGhlIHJlc3VsdCBvZiBwb3NzaWJseSBldmFsdWF0aW5nIHRoaXMga2luZCBvZiBwcm9wZXJ0eSBpcyBgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+YDsgb2J0YWluaW5nXG4gKiBhIHNjYWxhciB2YWx1ZSBgVGAgcmVxdWlyZXMgZnVydGhlciBldmFsdWF0aW9uIG9uIGEgcGVyLWZlYXR1cmUgYmFzaXMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFEcml2ZW5Qcm9wZXJ0eTxUPiBpbXBsZW1lbnRzIFByb3BlcnR5PFQsIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPj4ge1xuICAgIHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uO1xuICAgIG92ZXJyaWRlczogP09iamVjdDtcblxuICAgIGNvbnN0cnVjdG9yKHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uLCBvdmVycmlkZXM/OiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5zcGVjaWZpY2F0aW9uID0gc3BlY2lmaWNhdGlvbjtcbiAgICAgICAgdGhpcy5vdmVycmlkZXMgPSBvdmVycmlkZXM7XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4+LCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycywgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+IHtcbiAgICAgICAgaWYgKHZhbHVlLmV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50JyB8fCB2YWx1ZS5leHByZXNzaW9uLmtpbmQgPT09ICdjYW1lcmEnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSh0aGlzLCB7a2luZDogJ2NvbnN0YW50JywgdmFsdWU6IHZhbHVlLmV4cHJlc3Npb24uZXZhbHVhdGUocGFyYW1ldGVycywgKG51bGw6IGFueSksIHt9LCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyl9LCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHZhbHVlLmV4cHJlc3Npb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGUoYTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPFQ+LFxuICAgICAgICAgICAgICAgIGI6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPixcbiAgICAgICAgICAgICAgICB0OiBudW1iZXIpOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD4ge1xuICAgICAgICAvLyBJZiBlaXRoZXIgcG9zc2libHktZXZhbHVhdGVkIHZhbHVlIGlzIG5vbi1jb25zdGFudCwgZ2l2ZSB1cDogd2UgYXJlbid0IGFibGUgdG8gaW50ZXJwb2xhdGUgZGF0YS1kcml2ZW4gdmFsdWVzLlxuICAgICAgICBpZiAoYS52YWx1ZS5raW5kICE9PSAnY29uc3RhbnQnIHx8IGIudmFsdWUua2luZCAhPT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgaGFjayBzb2xlbHkgZm9yIGZpbGwtb3V0bGluZS1jb2xvci4gVGhlIHVuZGVmaW5lZCB2YWx1ZSBpcyBzdWJzZXF1ZW50bHkgaGFuZGxlZCBpblxuICAgICAgICAvLyBGaWxsU3R5bGVMYXllciNyZWNhbGN1bGF0ZSwgd2hpY2ggc2V0cyBmaWxsLW91dGxpbmUtY29sb3IgdG8gdGhlIGZpbGwtY29sb3IgdmFsdWUgaWYgdGhlIGZvcm1lclxuICAgICAgICAvLyBpcyBhIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZSBjb250YWluaW5nIGEgY29uc3RhbnQgdW5kZWZpbmVkIHZhbHVlLiBJbiBhZGRpdGlvbiB0byB0aGVcbiAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGhlcmUsIHRoZSBvdGhlciBzb3VyY2Ugb2YgYSBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUgY29udGFpbmluZyBhIGNvbnN0YW50XG4gICAgICAgIC8vIHVuZGVmaW5lZCB2YWx1ZSBpcyB0aGUgXCJkZWZhdWx0IHZhbHVlXCIgZm9yIGZpbGwtb3V0bGluZS1jb2xvciBoZWxkIGluXG4gICAgICAgIC8vIGBQcm9wZXJ0aWVzI2RlZmF1bHRQb3NzaWJseUV2YWx1YXRlZFZhbHVlc2AsIHdoaWNoIHNlcnZlcyBhcyB0aGUgcHJvdG90eXBlIG9mXG4gICAgICAgIC8vIGBQb3NzaWJseUV2YWx1YXRlZCNfdmFsdWVzYC5cbiAgICAgICAgaWYgKGEudmFsdWUudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBiLnZhbHVlLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogKHVuZGVmaW5lZDogYW55KX0sIGEucGFyYW1ldGVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnRlcnA6ID8oYTogVCwgYjogVCwgdDogbnVtYmVyKSA9PiBUID0gKGludGVycG9sYXRlOiBhbnkpW3RoaXMuc3BlY2lmaWNhdGlvbi50eXBlXTtcbiAgICAgICAgaWYgKGludGVycCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUodGhpcywge2tpbmQ6ICdjb25zdGFudCcsIHZhbHVlOiBpbnRlcnAoYS52YWx1ZS52YWx1ZSwgYi52YWx1ZS52YWx1ZSwgdCl9LCBhLnBhcmFtZXRlcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZSh2YWx1ZTogUG9zc2libHlFdmFsdWF0ZWRWYWx1ZTxUPiwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGZlYXR1cmU6IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiBUIHtcbiAgICAgICAgaWYgKHZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5ldmFsdWF0ZShwYXJhbWV0ZXJzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBgUHJvcGVydHlgIGZvciAgZGF0YSBkcml2ZW4gYGxpbmUtcGF0dGVybmAgd2hpY2ggYXJlIHRyYW5zaXRpb25lZCBieSBjcm9zcy1mYWRpbmdcbiAqIHJhdGhlciB0aGFuIGludGVycG9sYXRpb24uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5leHBvcnQgY2xhc3MgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eTxUPiBleHRlbmRzIERhdGFEcml2ZW5Qcm9wZXJ0eTw/Q3Jvc3NGYWRlZDxUPj4ge1xuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTw/Q3Jvc3NGYWRlZDxUPiwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPD9Dcm9zc0ZhZGVkPFQ+Pj4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8P0Nyb3NzRmFkZWQ8VD4+IHtcbiAgICAgICAgaWYgKHZhbHVlLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogdW5kZWZpbmVkfSwgcGFyYW1ldGVycyk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZXhwcmVzc2lvbi5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICBjb25zdCBldmFsdWF0ZWRWYWx1ZSA9IHZhbHVlLmV4cHJlc3Npb24uZXZhbHVhdGUocGFyYW1ldGVycywgKG51bGw6IGFueSksIHt9LCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICBjb25zdCBpc0ltYWdlRXhwcmVzc2lvbiA9IHZhbHVlLnByb3BlcnR5LnNwZWNpZmljYXRpb24udHlwZSA9PT0gJ3Jlc29sdmVkSW1hZ2UnO1xuICAgICAgICAgICAgY29uc3QgY29uc3RhbnRWYWx1ZSA9IGlzSW1hZ2VFeHByZXNzaW9uICYmIHR5cGVvZiBldmFsdWF0ZWRWYWx1ZSAhPT0gJ3N0cmluZycgPyBldmFsdWF0ZWRWYWx1ZS5uYW1lIDogZXZhbHVhdGVkVmFsdWU7XG4gICAgICAgICAgICBjb25zdCBjb25zdGFudCA9IHRoaXMuX2NhbGN1bGF0ZShjb25zdGFudFZhbHVlLCBjb25zdGFudFZhbHVlLCBjb25zdGFudFZhbHVlLCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlKHRoaXMsIHtraW5kOiAnY29uc3RhbnQnLCB2YWx1ZTogY29uc3RhbnR9LCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5leHByZXNzaW9uLmtpbmQgPT09ICdjYW1lcmEnKSB7XG4gICAgICAgICAgICBjb25zdCBjYW1lcmFWYWwgPSB0aGlzLl9jYWxjdWxhdGUoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmV4cHJlc3Npb24uZXZhbHVhdGUoe3pvb206IHBhcmFtZXRlcnMuem9vbSAtIDEuMH0pLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiBwYXJhbWV0ZXJzLnpvb219KSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogcGFyYW1ldGVycy56b29tICsgMS4wfSksXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUodGhpcywge2tpbmQ6ICdjb25zdGFudCcsIHZhbHVlOiBjYW1lcmFWYWx9LCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNvdXJjZSBvciBjb21wb3NpdGUgZXhwcmVzc2lvblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUodGhpcywgdmFsdWUuZXhwcmVzc2lvbiwgcGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmFsdWF0ZSh2YWx1ZTogUG9zc2libHlFdmFsdWF0ZWRWYWx1ZTw/Q3Jvc3NGYWRlZDxUPj4sIGdsb2JhbHM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBhdmFpbGFibGVJbWFnZXM/OiBBcnJheTxzdHJpbmc+KTogP0Nyb3NzRmFkZWQ8VD4ge1xuICAgICAgICBpZiAodmFsdWUua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0YW50ID0gdmFsdWUuZXZhbHVhdGUoZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FsY3VsYXRlKGNvbnN0YW50LCBjb25zdGFudCwgY29uc3RhbnQsIGdsb2JhbHMpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FsY3VsYXRlKFxuICAgICAgICAgICAgICAgIHZhbHVlLmV2YWx1YXRlKHt6b29tOiBNYXRoLmZsb29yKGdsb2JhbHMuem9vbSkgLSAxLjB9LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpLFxuICAgICAgICAgICAgICAgIHZhbHVlLmV2YWx1YXRlKHt6b29tOiBNYXRoLmZsb29yKGdsb2JhbHMuem9vbSl9LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpLFxuICAgICAgICAgICAgICAgIHZhbHVlLmV2YWx1YXRlKHt6b29tOiBNYXRoLmZsb29yKGdsb2JhbHMuem9vbSkgKyAxLjB9LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpLFxuICAgICAgICAgICAgICAgIGdsb2JhbHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NhbGN1bGF0ZShtaW46IFQsIG1pZDogVCwgbWF4OiBULCBwYXJhbWV0ZXJzOiBFdmFsdWF0aW9uUGFyYW1ldGVycyk6IENyb3NzRmFkZWQ8VD4ge1xuICAgICAgICBjb25zdCB6ID0gcGFyYW1ldGVycy56b29tO1xuICAgICAgICAvLyB1Z2x5IGhhY2sgYWxlcnQ6IHdoZW4gZXZhbHVhdGluZyBub24tY29uc3RhbnQgZGFzaGVzIG9uIHRoZSB3b3JrZXIgc2lkZSxcbiAgICAgICAgLy8gd2UgbmVlZCBhbGwgdGhyZWUgdmFsdWVzIHRvIHBhY2sgaW50byB0aGUgYXRsYXM7IHRoZSBpZiBjb25kaXRpb24gaXMgYWx3YXlzIGZhbHNlIHRoZXJlO1xuICAgICAgICAvLyB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgcmVtb3ZpbmcgY3Jvc3MtZmFkaW5nXG4gICAgICAgIHJldHVybiB6ID4gcGFyYW1ldGVycy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20gP1xuICAgICAgICAgICAge2Zyb206IG1pbiwgdG86IG1pZCwgb3RoZXI6IG1heH0gOlxuICAgICAgICAgICAge2Zyb206IG1heCwgdG86IG1pZCwgb3RoZXI6IG1pbn07XG4gICAgfVxuXG4gICAgaW50ZXJwb2xhdGUoYTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPD9Dcm9zc0ZhZGVkPFQ+Pik6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTw/Q3Jvc3NGYWRlZDxUPj4ge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGBQcm9wZXJ0eWAgZm9yIGAqLXBhdHRlcm5gIGFuZCBgbGluZS1kYXNoYXJyYXlgLCB3aGljaCBhcmUgdHJhbnNpdGlvbmVkIGJ5IGNyb3NzLWZhZGluZ1xuICogcmF0aGVyIHRoYW4gaW50ZXJwb2xhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGYWRlZFByb3BlcnR5PFQ+IGltcGxlbWVudHMgUHJvcGVydHk8VCwgP0Nyb3NzRmFkZWQ8VD4+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxULCA/Q3Jvc3NGYWRlZDxUPj4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiA/Q3Jvc3NGYWRlZDxUPiB7XG4gICAgICAgIGlmICh2YWx1ZS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmV4cHJlc3Npb24ua2luZCA9PT0gJ2NvbnN0YW50Jykge1xuICAgICAgICAgICAgY29uc3QgY29uc3RhbnQgPSB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMsIChudWxsOiBhbnkpLCB7fSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShjb25zdGFudCwgY29uc3RhbnQsIGNvbnN0YW50LCBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydCghdmFsdWUuaXNEYXRhRHJpdmVuKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZShcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSAtIDEuMCksIHBhcmFtZXRlcnMpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSksIHBhcmFtZXRlcnMpKSxcbiAgICAgICAgICAgICAgICB2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSArIDEuMCksIHBhcmFtZXRlcnMpKSxcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jYWxjdWxhdGUobWluOiBULCBtaWQ6IFQsIG1heDogVCwgcGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpOiA/Q3Jvc3NGYWRlZDxUPiB7XG4gICAgICAgIGNvbnN0IHogPSBwYXJhbWV0ZXJzLnpvb207XG4gICAgICAgIHJldHVybiB6ID4gcGFyYW1ldGVycy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb20gPyB7ZnJvbTogbWluLCB0bzogbWlkfSA6IHtmcm9tOiBtYXgsIHRvOiBtaWR9O1xuICAgIH1cblxuICAgIGludGVycG9sYXRlKGE6ID9Dcm9zc0ZhZGVkPFQ+KTogP0Nyb3NzRmFkZWQ8VD4ge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYFByb3BlcnR5YCBmb3IgYGhlYXRtYXAtY29sb3JgIGFuZCBgbGluZS1ncmFkaWVudGAuIEludGVycG9sYXRpb24gaXMgYSBuby1vcCwgYW5kXG4gKiBldmFsdWF0aW9uIHJldHVybnMgYSBib29sZWFuIHZhbHVlIGluIG9yZGVyIHRvIGluZGljYXRlIGl0cyBwcmVzZW5jZSwgYnV0IHRoZSByZWFsXG4gKiBldmFsdWF0aW9uIGhhcHBlbnMgaW4gU3R5bGVMYXllciBjbGFzc2VzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuZXhwb3J0IGNsYXNzIENvbG9yUmFtcFByb3BlcnR5IGltcGxlbWVudHMgUHJvcGVydHk8Q29sb3IsIGJvb2xlYW4+IHtcbiAgICBzcGVjaWZpY2F0aW9uOiBTdHlsZVByb3BlcnR5U3BlY2lmaWNhdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHNwZWNpZmljYXRpb247XG4gICAgfVxuXG4gICAgcG9zc2libHlFdmFsdWF0ZSh2YWx1ZTogUHJvcGVydHlWYWx1ZTxDb2xvciwgYm9vbGVhbj4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlcz86IEFycmF5PHN0cmluZz4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdmFsdWUuZXhwcmVzc2lvbi5ldmFsdWF0ZShwYXJhbWV0ZXJzLCAobnVsbDogYW55KSwge30sIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZSgpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XG59XG5cbi8qKlxuICogYFByb3BlcnRpZXNgIGhvbGRzIG9iamVjdHMgY29udGFpbmluZyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGxheW91dCBvciBwYWludCBwcm9wZXJ0eSBzZXQgb2YgYSBnaXZlblxuICogbGF5ZXIgdHlwZS4gVGhlc2Ugb2JqZWN0cyBhcmUgaW1tdXRhYmxlLCBhbmQgdGhleSBhcmUgdXNlZCBhcyB0aGUgcHJvdG90eXBlcyBmb3IgdGhlIGBfdmFsdWVzYCBtZW1iZXJzIG9mXG4gKiBgVHJhbnNpdGlvbmFibGVgLCBgVHJhbnNpdGlvbmluZ2AsIGBMYXlvdXRgLCBhbmQgYFBvc3NpYmx5RXZhbHVhdGVkYC4gVGhpcyBhbGxvd3MgdGhlc2UgY2xhc3NlcyB0byBhdm9pZFxuICogZG9pbmcgd29yayBpbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYSBwcm9wZXJ0eSBoYXMgbm8gZXhwbGljaXQgdmFsdWUgc2V0IGFuZCBzaG91bGQgYmUgY29uc2lkZXJlZCB0byB0YWtlXG4gKiBvbiB0aGUgZGVmYXVsdCB2YWx1ZTogdXNpbmcgYGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmtleXModGhpcy5fdmFsdWVzKSlgLCB0aGV5IGNhbiBpdGVyYXRlIG92ZXJcbiAqIG9ubHkgdGhlIF9vd25fIHByb3BlcnRpZXMgb2YgYF92YWx1ZXNgLCBza2lwcGluZyByZXBlYXRlZCBjYWxjdWxhdGlvbiBvZiB0cmFuc2l0aW9ucyBhbmQgcG9zc2libGUvZmluYWxcbiAqIGV2YWx1YXRpb25zIGZvciBkZWZhdWx0cywgdGhlIHJlc3VsdCBvZiB3aGljaCB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgUHJvcGVydGllczxQcm9wczogT2JqZWN0PiB7XG4gICAgcHJvcGVydGllczogUHJvcHM7XG4gICAgZGVmYXVsdFByb3BlcnR5VmFsdWVzOiBQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG4gICAgZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM6IFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXM8UHJvcHM+O1xuICAgIGRlZmF1bHRUcmFuc2l0aW9uaW5nUHJvcGVydHlWYWx1ZXM6IFRyYW5zaXRpb25pbmdQcm9wZXJ0eVZhbHVlczxQcm9wcz47XG4gICAgZGVmYXVsdFBvc3NpYmx5RXZhbHVhdGVkVmFsdWVzOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWVzPFByb3BzPjtcbiAgICBvdmVycmlkYWJsZVByb3BlcnRpZXM6IEFycmF5PHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wcykge1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLmRlZmF1bHRQcm9wZXJ0eVZhbHVlcyA9ICh7fTogYW55KTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlcyA9ICh7fTogYW55KTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzID0gKHt9OiBhbnkpO1xuICAgICAgICB0aGlzLmRlZmF1bHRQb3NzaWJseUV2YWx1YXRlZFZhbHVlcyA9ICh7fTogYW55KTtcbiAgICAgICAgdGhpcy5vdmVycmlkYWJsZVByb3BlcnRpZXMgPSAoW106IGFueSk7XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdFBhcmFtZXRlcnMgPSBuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoMCwge30pO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBwcm9wZXJ0aWVzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChwcm9wLnNwZWNpZmljYXRpb24ub3ZlcnJpZGFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJyaWRhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQcm9wZXJ0eVZhbHVlID0gdGhpcy5kZWZhdWx0UHJvcGVydHlWYWx1ZXNbcHJvcGVydHldID1cbiAgICAgICAgICAgICAgICBuZXcgUHJvcGVydHlWYWx1ZShwcm9wLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZSA9IHRoaXMuZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZXNbcHJvcGVydHldID1cbiAgICAgICAgICAgICAgICBuZXcgVHJhbnNpdGlvbmFibGVQcm9wZXJ0eVZhbHVlKHByb3ApO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0VHJhbnNpdGlvbmluZ1Byb3BlcnR5VmFsdWVzW3Byb3BlcnR5XSA9XG4gICAgICAgICAgICAgICAgZGVmYXVsdFRyYW5zaXRpb25hYmxlUHJvcGVydHlWYWx1ZS51bnRyYW5zaXRpb25lZCgpO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0UG9zc2libHlFdmFsdWF0ZWRWYWx1ZXNbcHJvcGVydHldID1cbiAgICAgICAgICAgICAgICBkZWZhdWx0UHJvcGVydHlWYWx1ZS5wb3NzaWJseUV2YWx1YXRlKGRlZmF1bHRQYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxucmVnaXN0ZXIoRGF0YURyaXZlblByb3BlcnR5LCAnRGF0YURyaXZlblByb3BlcnR5Jyk7XG5yZWdpc3RlcihEYXRhQ29uc3RhbnRQcm9wZXJ0eSwgJ0RhdGFDb25zdGFudFByb3BlcnR5Jyk7XG5yZWdpc3RlcihDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5LCAnQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eScpO1xucmVnaXN0ZXIoQ3Jvc3NGYWRlZFByb3BlcnR5LCAnQ3Jvc3NGYWRlZFByb3BlcnR5Jyk7XG5yZWdpc3RlcihDb2xvclJhbXBQcm9wZXJ0eSwgJ0NvbG9yUmFtcFByb3BlcnR5Jyk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2NsYW1wfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuXG4vKipcbiAqIFBhY2tzIHR3byBudW1iZXJzLCBpbnRlcnByZXRlZCBhcyA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VycywgaW50byBhIHNpbmdsZVxuICogZmxvYXQuICBVbnBhY2sgdGhlbSBpbiB0aGUgc2hhZGVyIHVzaW5nIHRoZSBgdW5wYWNrX2Zsb2F0KClgIGZ1bmN0aW9uLFxuICogZGVmaW5lZCBpbiBfcHJlbHVkZS52ZXJ0ZXguZ2xzbFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWNrVWludDhUb0Zsb2F0KGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBjb2VyY2UgYSBhbmQgYiB0byA4LWJpdCBpbnRzXG4gICAgYSA9IGNsYW1wKE1hdGguZmxvb3IoYSksIDAsIDI1NSk7XG4gICAgYiA9IGNsYW1wKE1hdGguZmxvb3IoYiksIDAsIDI1NSk7XG4gICAgcmV0dXJuIDI1NiAqIGEgKyBiO1xufVxuIiwiLy8gQGZsb3dcblxuLy8gTm90ZTogYWxsIFwic2l6ZXNcIiBhcmUgbWVhc3VyZWQgaW4gYnl0ZXNcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7VHJhbnNmZXJhYmxlfSBmcm9tICcuLi90eXBlcy90cmFuc2ZlcmFibGUuanMnO1xuXG5jb25zdCB2aWV3VHlwZXMgPSB7XG4gICAgJ0ludDgnOiBJbnQ4QXJyYXksXG4gICAgJ1VpbnQ4JzogVWludDhBcnJheSxcbiAgICAnSW50MTYnOiBJbnQxNkFycmF5LFxuICAgICdVaW50MTYnOiBVaW50MTZBcnJheSxcbiAgICAnSW50MzInOiBJbnQzMkFycmF5LFxuICAgICdVaW50MzInOiBVaW50MzJBcnJheSxcbiAgICAnRmxvYXQzMic6IEZsb2F0MzJBcnJheVxufTtcblxuZXhwb3J0IHR5cGUgVmlld1R5cGUgPSAkS2V5czx0eXBlb2Ygdmlld1R5cGVzPjtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3Qge1xuICAgIF9wb3MxOiBudW1iZXI7XG4gICAgX3BvczI6IG51bWJlcjtcbiAgICBfcG9zNDogbnVtYmVyO1xuICAgIF9wb3M4OiBudW1iZXI7XG4gICAgK19zdHJ1Y3RBcnJheTogU3RydWN0QXJyYXk7XG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlIHByb3RvdHlwZSBvZiBzdWIgY2xhc3Nlcy5cbiAgICBzaXplOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1N0cnVjdEFycmF5fSBzdHJ1Y3RBcnJheSBUaGUgU3RydWN0QXJyYXkgdGhlIHN0cnVjdCBpcyBzdG9yZWQgaW5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBzdHJ1Y3QgaW4gdGhlIFN0cnVjdEFycmF5LlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc3RydWN0QXJyYXk6IFN0cnVjdEFycmF5LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgICh0aGlzOiBhbnkpLl9zdHJ1Y3RBcnJheSA9IHN0cnVjdEFycmF5O1xuICAgICAgICB0aGlzLl9wb3MxID0gaW5kZXggKiB0aGlzLnNpemU7XG4gICAgICAgIHRoaXMuX3BvczIgPSB0aGlzLl9wb3MxIC8gMjtcbiAgICAgICAgdGhpcy5fcG9zNCA9IHRoaXMuX3BvczEgLyA0O1xuICAgICAgICB0aGlzLl9wb3M4ID0gdGhpcy5fcG9zMSAvIDg7XG4gICAgfVxufVxuXG5jb25zdCBERUZBVUxUX0NBUEFDSVRZID0gMTI4O1xuY29uc3QgUkVTSVpFX01VTFRJUExJRVIgPSA1O1xuXG5leHBvcnQgdHlwZSBTdHJ1Y3RBcnJheU1lbWJlciA9IHtcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdHlwZTogVmlld1R5cGUsXG4gICAgY29tcG9uZW50czogbnVtYmVyLFxuICAgIG9mZnNldDogbnVtYmVyXG59O1xuXG5leHBvcnQgdHlwZSBTdHJ1Y3RBcnJheUxheW91dCA9IHtcbiAgICBtZW1iZXJzOiBBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj4sXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGFsaWdubWVudDogP251bWJlclxufVxuXG5leHBvcnQgdHlwZSBTZXJpYWxpemVkU3RydWN0QXJyYXkgPSB7XG4gICAgbGVuZ3RoOiBudW1iZXIsXG4gICAgYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyXG59O1xuXG4vKipcbiAqIGBTdHJ1Y3RBcnJheWAgcHJvdmlkZXMgYW4gYWJzdHJhY3Rpb24gb3ZlciBgQXJyYXlCdWZmZXJgIGFuZCBgVHlwZWRBcnJheWBcbiAqIG1ha2luZyBpdCBiZWhhdmUgbGlrZSBhbiBhcnJheSBvZiB0eXBlZCBzdHJ1Y3RzLlxuICpcbiAqIENvbmNlcHR1YWxseSwgYSBTdHJ1Y3RBcnJheSBpcyBjb21wcmlzZWQgb2YgZWxlbWVudHMsIGkuZS4sIGluc3RhbmNlcyBvZiBpdHNcbiAqIGFzc29jaWF0ZWQgc3RydWN0IHR5cGUuIEVhY2ggcGFydGljdWxhciBzdHJ1Y3QgdHlwZSwgdG9nZXRoZXIgd2l0aCBhblxuICogYWxpZ25tZW50IHNpemUsIGRldGVybWluZXMgdGhlIG1lbW9yeSBsYXlvdXQgb2YgYSBTdHJ1Y3RBcnJheSB3aG9zZSBlbGVtZW50c1xuICogYXJlIG9mIHRoYXQgdHlwZS4gIFRodXMsIGZvciBlYWNoIHN1Y2ggbGF5b3V0IHRoYXQgd2UgbmVlZCwgd2UgaGF2ZVxuICogYSBjb3Jyc2Vwb25kaW5nIFN0cnVjdEFycmF5TGF5b3V0IGNsYXNzLCBpbmhlcml0aW5nIGZyb20gU3RydWN0QXJyYXkgYW5kXG4gKiBpbXBsZW1lbnRpbmcgYGVtcGxhY2VCYWNrKClgIGFuZCBgX3JlZnJlc2hWaWV3cygpYC5cbiAqXG4gKiBJbiBzb21lIGNhc2VzLCB3aGVyZSB3ZSBuZWVkIHRvIGFjY2VzcyBwYXJ0aWN1bGFyIGVsZW1lbnRzIG9mIGEgU3RydWN0QXJyYXksXG4gKiB3ZSBpbXBsZW1lbnQgYSBtb3JlIHNwZWNpZmljIHN1YmNsYXNzIHRoYXQgaW5oZXJpdHMgZnJvbSBvbmUgb2YgdGhlXG4gKiBTdHJ1Y3RBcnJheUxheW91dHMgYW5kIGFkZHMgYSBgZ2V0KGkpOiBUYCBhY2Nlc3NvciB0aGF0IHJldHVybnMgYSBzdHJ1Y3R1cmVkXG4gKiBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgcHJveGllcyBpbnRvIHRoZSB1bmRlcmx5aW5nIG1lbW9yeSBzcGFjZSBmb3IgdGhlXG4gKiBpLXRoIGVsZW1lbnQuICBUaGlzIGFmZm9yZHMgdGhlIGNvbnZpZW5jZSBvZiB3b3JraW5nIHdpdGggKHNlZW1pbmdseSkgcGxhaW5cbiAqIEphdmFzY3JpcHQgb2JqZWN0cyB3aXRob3V0IHRoZSBvdmVyaGVhZCBvZiBzZXJpYWxpemluZy9kZXNlcmlhbGl6aW5nIHRoZW1cbiAqIGludG8gQXJyYXlCdWZmZXJzIGZvciBlZmZpY2llbnQgd2ViIHdvcmtlciB0cmFuc2Zlci5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheSB7XG4gICAgY2FwYWNpdHk6IG51bWJlcjtcbiAgICBsZW5ndGg6IG51bWJlcjtcbiAgICBpc1RyYW5zZmVycmVkOiBib29sZWFuO1xuICAgIGFycmF5QnVmZmVyOiBBcnJheUJ1ZmZlcjtcbiAgICB1aW50ODogVWludDhBcnJheTtcblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBvbiB0aGUgcHJvdG90eXBlLlxuICAgIG1lbWJlcnM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcbiAgICBieXRlc1BlckVsZW1lbnQ6IG51bWJlcjtcbiAgICArZW1wbGFjZUJhY2s6IEZ1bmN0aW9uO1xuICAgICtlbXBsYWNlOiBGdW5jdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmlzVHJhbnNmZXJyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYXBhY2l0eSA9IC0xO1xuICAgICAgICB0aGlzLnJlc2l6ZSgwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgYSBTdHJ1Y3RBcnJheSBpbnN0YW5jZS4gIFNlcmlhbGl6ZXMgYm90aCB0aGUgcmF3IGRhdGEgYW5kIHRoZVxuICAgICAqIG1ldGFkYXRhIG5lZWRlZCB0byByZWNvbnN0cnVjdCB0aGUgU3RydWN0QXJyYXkgYmFzZSBjbGFzcyBkdXJpbmdcbiAgICAgKiBkZXNlcmlhbGl6YXRpb24uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgc2VyaWFsaXplKGFycmF5OiBTdHJ1Y3RBcnJheSwgdHJhbnNmZXJhYmxlcz86IEFycmF5PFRyYW5zZmVyYWJsZT4pOiBTZXJpYWxpemVkU3RydWN0QXJyYXkge1xuICAgICAgICBhc3NlcnQoIWFycmF5LmlzVHJhbnNmZXJyZWQpO1xuXG4gICAgICAgIGFycmF5Ll90cmltKCk7XG5cbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIGFycmF5LmlzVHJhbnNmZXJyZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcy5wdXNoKGFycmF5LmFycmF5QnVmZmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZW5ndGg6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgIGFycmF5QnVmZmVyOiBhcnJheS5hcnJheUJ1ZmZlcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVzZXJpYWxpemUoaW5wdXQ6IFNlcmlhbGl6ZWRTdHJ1Y3RBcnJheSk6IFN0cnVjdEFycmF5IHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSBub3QtYW4tb2JqZWN0IC0gbmV3ZXIgRmxvdyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhpcyBwYXR0ZXJuLCBzaWxlbmNlIGZvciBub3dcbiAgICAgICAgY29uc3Qgc3RydWN0QXJyYXkgPSBPYmplY3QuY3JlYXRlKHRoaXMucHJvdG90eXBlKTtcbiAgICAgICAgc3RydWN0QXJyYXkuYXJyYXlCdWZmZXIgPSBpbnB1dC5hcnJheUJ1ZmZlcjtcbiAgICAgICAgc3RydWN0QXJyYXkubGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuICAgICAgICBzdHJ1Y3RBcnJheS5jYXBhY2l0eSA9IGlucHV0LmFycmF5QnVmZmVyLmJ5dGVMZW5ndGggLyBzdHJ1Y3RBcnJheS5ieXRlc1BlckVsZW1lbnQ7XG4gICAgICAgIHN0cnVjdEFycmF5Ll9yZWZyZXNoVmlld3MoKTtcbiAgICAgICAgcmV0dXJuICgoc3RydWN0QXJyYXk6IGFueSk6IFN0cnVjdEFycmF5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhlIGFycmF5IHRvIGRpc2NhcmQgdW51c2VkIGNhcGFjaXR5LlxuICAgICAqL1xuICAgIF90cmltKCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggIT09IHRoaXMuY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FwYWNpdHkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSB0aGlzLmFycmF5QnVmZmVyLnNsaWNlKDAsIHRoaXMubGVuZ3RoICogdGhpcy5ieXRlc1BlckVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFZpZXdzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHRvIDAgd2l0aG91dCBkZS1hbGxvY2F0aW5nIGNhcGNhY2l0eS5cbiAgICAgKi9cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2l6ZSB0aGUgYXJyYXkuXG4gICAgICogSWYgYG5gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBsZW5ndGggdGhlbiBhZGRpdGlvbmFsIGVsZW1lbnRzIHdpdGggdW5kZWZpbmVkIHZhbHVlcyBhcmUgYWRkZWQuXG4gICAgICogSWYgYG5gIGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBsZW5ndGggdGhlbiB0aGUgYXJyYXkgd2lsbCBiZSByZWR1Y2VkIHRvIHRoZSBmaXJzdCBgbmAgZWxlbWVudHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG5ldyBzaXplIG9mIHRoZSBhcnJheS5cbiAgICAgKi9cbiAgICByZXNpemUobjogbnVtYmVyKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcbiAgICAgICAgdGhpcy5yZXNlcnZlKG4pO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IG47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGUgYSBwbGFubmVkIGluY3JlYXNlIGluIHNpemUsIHNvIHRoYXQgYW55IG5lY2Vzc2FyeSBhbGxvY2F0aW9uIG1heVxuICAgICAqIGJlIGRvbmUgb25jZSwgYWhlYWQgb2YgdGltZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgYXJyYXkuXG4gICAgICovXG4gICAgcmVzZXJ2ZShuOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKG4gPiB0aGlzLmNhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aGlzLmNhcGFjaXR5ID0gTWF0aC5tYXgobiwgTWF0aC5mbG9vcih0aGlzLmNhcGFjaXR5ICogUkVTSVpFX01VTFRJUExJRVIpLCBERUZBVUxUX0NBUEFDSVRZKTtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy5jYXBhY2l0eSAqIHRoaXMuYnl0ZXNQZXJFbGVtZW50KTtcblxuICAgICAgICAgICAgY29uc3Qgb2xkVWludDhBcnJheSA9IHRoaXMudWludDg7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoVmlld3MoKTtcbiAgICAgICAgICAgIGlmIChvbGRVaW50OEFycmF5KSB0aGlzLnVpbnQ4LnNldChvbGRVaW50OEFycmF5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBUeXBlZEFycmF5IHZpZXdzIGZvciB0aGUgY3VycmVudCBBcnJheUJ1ZmZlci5cbiAgICAgKi9cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ19yZWZyZXNoVmlld3MoKSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggY29uY3JldGUgU3RydWN0QXJyYXkgbGF5b3V0Jyk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICB0aGlzLmludDggPSB0aGlzLnVpbnQ4ID0gdGhpcy5pbnQxNiA9IHRoaXMudWludDE2ID0gdGhpcy5pbnQzMiA9IHRoaXMudWludDMyID0gdGhpcy5mbG9hdDMyID0gbnVsbDtcbiAgICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IChudWxsOiBhbnkpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgbWVtYmVyIGZpZWxkcywgY3JlYXRlIGEgZnVsbCBTdHJ1Y3RBcnJheUxheW91dCwgaW5cbiAqIHBhcnRpY3VsYXIgY2FsY3VsYXRpbmcgdGhlIGNvcnJlY3QgYnl0ZSBvZmZzZXQgZm9yIGVhY2ggZmllbGQuICBUaGlzIGRhdGFcbiAqIGlzIHVzZWQgYXQgYnVpbGQgdGltZSB0byBnZW5lcmF0ZSBTdHJ1Y3RBcnJheUxheW91dF8qI2VtcGxhY2VCYWNrKCkgYW5kXG4gKiBvdGhlciBhY2Nlc3NvcnMsIGFuZCBhdCBydW50aW1lIGZvciBiaW5kaW5nIHZlcnRleCBidWZmZXIgYXR0cmlidXRlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVMYXlvdXQoXG4gICAgbWVtYmVyczogQXJyYXk8eyBuYW1lOiBzdHJpbmcsIHR5cGU6IFZpZXdUeXBlLCArY29tcG9uZW50cz86IG51bWJlciwgfT4sXG4gICAgYWxpZ25tZW50OiBudW1iZXIgPSAxXG4pOiBTdHJ1Y3RBcnJheUxheW91dCB7XG5cbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBsZXQgbWF4U2l6ZSA9IDA7XG4gICAgY29uc3QgbGF5b3V0TWVtYmVycyA9IG1lbWJlcnMubWFwKChtZW1iZXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KG1lbWJlci5uYW1lLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHR5cGVTaXplID0gc2l6ZU9mKG1lbWJlci50eXBlKTtcbiAgICAgICAgY29uc3QgbWVtYmVyT2Zmc2V0ID0gb2Zmc2V0ID0gYWxpZ24ob2Zmc2V0LCBNYXRoLm1heChhbGlnbm1lbnQsIHR5cGVTaXplKSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBtZW1iZXIuY29tcG9uZW50cyB8fCAxO1xuXG4gICAgICAgIG1heFNpemUgPSBNYXRoLm1heChtYXhTaXplLCB0eXBlU2l6ZSk7XG4gICAgICAgIG9mZnNldCArPSB0eXBlU2l6ZSAqIGNvbXBvbmVudHM7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IG1lbWJlci5uYW1lLFxuICAgICAgICAgICAgdHlwZTogbWVtYmVyLnR5cGUsXG4gICAgICAgICAgICBjb21wb25lbnRzLFxuICAgICAgICAgICAgb2Zmc2V0OiBtZW1iZXJPZmZzZXQsXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaXplID0gYWxpZ24ob2Zmc2V0LCBNYXRoLm1heChtYXhTaXplLCBhbGlnbm1lbnQpKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIG1lbWJlcnM6IGxheW91dE1lbWJlcnMsXG4gICAgICAgIHNpemUsXG4gICAgICAgIGFsaWdubWVudFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHNpemVPZih0eXBlOiBWaWV3VHlwZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHZpZXdUeXBlc1t0eXBlXS5CWVRFU19QRVJfRUxFTUVOVDtcbn1cblxuZnVuY3Rpb24gYWxpZ24ob2Zmc2V0OiBudW1iZXIsIHNpemU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguY2VpbChvZmZzZXQgLyBzaXplKSAqIHNpemU7XG59XG5cbmV4cG9ydCB7U3RydWN0QXJyYXksIFN0cnVjdCwgdmlld1R5cGVzLCBjcmVhdGVMYXlvdXR9O1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHJ1Y3QtYXJyYXlzLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7U3RydWN0LCBTdHJ1Y3RBcnJheX0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0Mmk0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyaTQucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQ7XG5yZWdpc3RlcihTdHJ1Y3RBcnJheUxheW91dDJpNCwgJ1N0cnVjdEFycmF5TGF5b3V0Mmk0Jyk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbM11cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDNpNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDM7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQzaTYucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDY7XG5yZWdpc3RlcihTdHJ1Y3RBcnJheUxheW91dDNpNiwgJ1N0cnVjdEFycmF5TGF5b3V0M2k2Jyk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbNF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDRpOCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2Myk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiA0O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDRpOC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gODtcbnJlZ2lzdGVyKFN0cnVjdEFycmF5TGF5b3V0NGk4LCAnU3RydWN0QXJyYXlMYXlvdXQ0aTgnKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlsyXVxuICogWzRdOiBVaW50OFs0XVxuICogWzhdOiBGbG9hdDMyWzFdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQyaTR1YjFmMTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDY7XG4gICAgICAgIGNvbnN0IG8xID0gaSAqIDEyO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAzO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyA0XSA9IHYyO1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgNV0gPSB2MztcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDZdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyA3XSA9IHY1O1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAyXSA9IHY2O1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0Mmk0dWIxZjEyLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxMjtcbnJlZ2lzdGVyKFN0cnVjdEFycmF5TGF5b3V0Mmk0dWIxZjEyLCAnU3RydWN0QXJyYXlMYXlvdXQyaTR1YjFmMTInKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBGbG9hdDMyWzRdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ0ZjE2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbzQgPSBpICogNDtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgM10gPSB2MztcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDRmMTYucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDE2O1xucmVnaXN0ZXIoU3RydWN0QXJyYXlMYXlvdXQ0ZjE2LCAnU3RydWN0QXJyYXlMYXlvdXQ0ZjE2Jyk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDE2WzEwXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MTB1aTIwIGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIsIHY4OiBudW1iZXIsIHY5OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIsIHY4OiBudW1iZXIsIHY5OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAxMDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA2XSA9IHY2O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDddID0gdjc7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgOF0gPSB2ODtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA5XSA9IHY5O1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0MTB1aTIwLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAyMDtcbnJlZ2lzdGVyKFN0cnVjdEFycmF5TGF5b3V0MTB1aTIwLCAnU3RydWN0QXJyYXlMYXlvdXQxMHVpMjAnKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBVaW50MTZbOF1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDh1aTE2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIsIHY2OiBudW1iZXIsIHY3OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogODtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA2XSA9IHY2O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDddID0gdjc7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ4dWkxNi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMTY7XG5yZWdpc3RlcihTdHJ1Y3RBcnJheUxheW91dDh1aTE2LCAnU3RydWN0QXJyYXlMYXlvdXQ4dWkxNicpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEludDE2WzZdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ2aTEyIGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogNjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxXSA9IHYxO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDNdID0gdjM7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA0XSA9IHY0O1xuICAgICAgICB0aGlzLmludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDZpMTIucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDEyO1xucmVnaXN0ZXIoU3RydWN0QXJyYXlMYXlvdXQ2aTEyLCAnU3RydWN0QXJyYXlMYXlvdXQ2aTEyJyk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbNF1cbiAqIFs4XTogVWludDE2WzRdXG4gKiBbMTZdOiBJbnQxNls0XVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0NGk0dWk0aTI0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIsIHYxMTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlciwgdjc6IG51bWJlciwgdjg6IG51bWJlciwgdjk6IG51bWJlciwgdjEwOiBudW1iZXIsIHYxMTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMTI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAzXSA9IHYzO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNV0gPSB2NTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyA2XSA9IHY2O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDddID0gdjc7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA4XSA9IHY4O1xuICAgICAgICB0aGlzLmludDE2W28yICsgOV0gPSB2OTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDEwXSA9IHYxMDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDExXSA9IHYxMTtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDRpNHVpNGkyNC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gMjQ7XG5yZWdpc3RlcihTdHJ1Y3RBcnJheUxheW91dDRpNHVpNGkyNCwgJ1N0cnVjdEFycmF5TGF5b3V0NGk0dWk0aTI0Jyk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogSW50MTZbM11cbiAqIFs4XTogRmxvYXQzMlszXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0M2kzZjIwIGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5pbnQxNiA9IG5ldyBJbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIsIHY1OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDEwO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiA1O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAyXSA9IHYzO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAzXSA9IHY0O1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyA0XSA9IHY1O1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0M2kzZjIwLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAyMDtcbnJlZ2lzdGVyKFN0cnVjdEFycmF5TGF5b3V0M2kzZjIwLCAnU3RydWN0QXJyYXlMYXlvdXQzaTNmMjAnKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBVaW50MzJbMV1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDF1bDQgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgdWludDMyOiBVaW50MzJBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDE7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDF1bDQucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQ7XG5yZWdpc3RlcihTdHJ1Y3RBcnJheUxheW91dDF1bDQsICdTdHJ1Y3RBcnJheUxheW91dDF1bDQnKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNls1XVxuICogWzEyXTogRmxvYXQzMls0XVxuICogWzI4XTogSW50MTZbMV1cbiAqIFszMl06IFVpbnQzMlsxXVxuICogWzM2XTogVWludDE2WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQ1aTRmMWkxdWwydWk0MCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG4gICAgdWludDMyOiBVaW50MzJBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDMyID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIsIHYxMjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjksIHYxMCwgdjExLCB2MTIpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIsIHYxMjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMjA7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDEwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmludDE2W28yICsgM10gPSB2MztcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDNdID0gdjU7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDRdID0gdjY7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDVdID0gdjc7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDZdID0gdjg7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxNF0gPSB2OTtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyA4XSA9IHYxMDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxOF0gPSB2MTE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTldID0gdjEyO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0NWk0ZjFpMXVsMnVpNDAucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQwO1xucmVnaXN0ZXIoU3RydWN0QXJyYXlMYXlvdXQ1aTRmMWkxdWwydWk0MCwgJ1N0cnVjdEFycmF5TGF5b3V0NWk0ZjFpMXVsMnVpNDAnKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlszXVxuICogWzhdOiBJbnQxNlsyXVxuICogWzEyXTogSW50MTZbMl1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDNpMmkyaTE2IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGludDE2OiBJbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDg7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA0XSA9IHYzO1xuICAgICAgICB0aGlzLmludDE2W28yICsgNV0gPSB2NDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDZdID0gdjU7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA3XSA9IHY2O1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0M2kyaTJpMTYucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDE2O1xucmVnaXN0ZXIoU3RydWN0QXJyYXlMYXlvdXQzaTJpMmkxNiwgJ1N0cnVjdEFycmF5TGF5b3V0M2kyaTJpMTYnKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBGbG9hdDMyWzJdXG4gKiBbOF06IEZsb2F0MzJbMV1cbiAqIFsxMl06IEludDE2WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQyZjFmMmkxNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG4gICAgaW50MTY6IEludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaW50MTYgPSBuZXcgSW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2MiwgdjMsIHY0KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDQ7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDg7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA2XSA9IHYzO1xuICAgICAgICB0aGlzLmludDE2W28yICsgN10gPSB2NDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDJmMWYyaTE2LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxNjtcbnJlZ2lzdGVyKFN0cnVjdEFycmF5TGF5b3V0MmYxZjJpMTYsICdTdHJ1Y3RBcnJheUxheW91dDJmMWYyaTE2Jyk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDhbMl1cbiAqIFs0XTogRmxvYXQzMlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MnViMmYxMiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG8xID0gaSAqIDEyO1xuICAgICAgICBjb25zdCBvNCA9IGkgKiAzO1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50OFtvMSArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDJdID0gdjM7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQydWIyZjEyLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxMjtcbnJlZ2lzdGVyKFN0cnVjdEFycmF5TGF5b3V0MnViMmYxMiwgJ1N0cnVjdEFycmF5TGF5b3V0MnViMmYxMicpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbM11cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDNmMTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDM7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDJdID0gdjI7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQzZjEyLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxMjtcbnJlZ2lzdGVyKFN0cnVjdEFycmF5TGF5b3V0M2YxMiwgJ1N0cnVjdEFycmF5TGF5b3V0M2YxMicpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IFVpbnQxNlszXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0M3VpNiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQxNiA9IG5ldyBVaW50MTZBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxLCB2Mik7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAzO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0M3VpNi5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNjtcbnJlZ2lzdGVyKFN0cnVjdEFycmF5TGF5b3V0M3VpNiwgJ1N0cnVjdEFycmF5TGF5b3V0M3VpNicpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEludDE2WzNdXG4gKiBbOF06IEZsb2F0MzJbMl1cbiAqIFsxNl06IFVpbnQxNlsyXVxuICogWzIwXTogVWludDMyWzNdXG4gKiBbMzJdOiBVaW50MTZbM11cbiAqIFs0MF06IEZsb2F0MzJbMl1cbiAqIFs0OF06IFVpbnQ4WzNdXG4gKiBbNTJdOiBVaW50MzJbMV1cbiAqIFs1Nl06IEludDE2WzFdXG4gKiBbNThdOiBVaW50OFsxXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0M2kyZjJ1aTN1bDN1aTJmM3ViMXVsMWkxdWI2MCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcbiAgICB1aW50MzI6IFVpbnQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIsIHYxMjogbnVtYmVyLCB2MTM6IG51bWJlciwgdjE0OiBudW1iZXIsIHYxNTogbnVtYmVyLCB2MTY6IG51bWJlciwgdjE3OiBudW1iZXIsIHYxODogbnVtYmVyLCB2MTk6IG51bWJlciwgdjIwOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjApO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIsIHYxMjogbnVtYmVyLCB2MTM6IG51bWJlciwgdjE0OiBudW1iZXIsIHYxNTogbnVtYmVyLCB2MTY6IG51bWJlciwgdjE3OiBudW1iZXIsIHYxODogbnVtYmVyLCB2MTk6IG51bWJlciwgdjIwOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAzMDtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMTU7XG4gICAgICAgIGNvbnN0IG8xID0gaSAqIDYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAyXSA9IHYyO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAyXSA9IHYzO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAzXSA9IHY0O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDhdID0gdjU7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgOV0gPSB2NjtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyA1XSA9IHY3O1xuICAgICAgICB0aGlzLnVpbnQzMltvNCArIDZdID0gdjg7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgN10gPSB2OTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxNl0gPSB2MTA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTddID0gdjExO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDE4XSA9IHYxMjtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMTBdID0gdjEzO1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxMV0gPSB2MTQ7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyA0OF0gPSB2MTU7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyA0OV0gPSB2MTY7XG4gICAgICAgIHRoaXMudWludDhbbzEgKyA1MF0gPSB2MTc7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMTNdID0gdjE4O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMjhdID0gdjE5O1xuICAgICAgICB0aGlzLnVpbnQ4W28xICsgNThdID0gdjIwO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG59XG5cblN0cnVjdEFycmF5TGF5b3V0M2kyZjJ1aTN1bDN1aTJmM3ViMXVsMWkxdWI2MC5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNjA7XG5yZWdpc3RlcihTdHJ1Y3RBcnJheUxheW91dDNpMmYydWkzdWwzdWkyZjN1YjF1bDFpMXViNjAsICdTdHJ1Y3RBcnJheUxheW91dDNpMmYydWkzdWwzdWkyZjN1YjF1bDFpMXViNjAnKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU3RydWN0QXJyYXkgbGF5b3V0OlxuICogWzBdOiBJbnQxNlszXVxuICogWzhdOiBGbG9hdDMyWzJdXG4gKiBbMTZdOiBJbnQxNls2XVxuICogWzI4XTogVWludDE2WzE1XVxuICogWzYwXTogVWludDMyWzFdXG4gKiBbNjRdOiBGbG9hdDMyWzNdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQzaTJmNmkxNXVpMXVsM2Y3NiBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBpbnQxNjogSW50MTZBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG4gICAgdWludDE2OiBVaW50MTZBcnJheTtcbiAgICB1aW50MzI6IFVpbnQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmludDE2ID0gbmV3IEludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIsIHYxMjogbnVtYmVyLCB2MTM6IG51bWJlciwgdjE0OiBudW1iZXIsIHYxNTogbnVtYmVyLCB2MTY6IG51bWJlciwgdjE3OiBudW1iZXIsIHYxODogbnVtYmVyLCB2MTk6IG51bWJlciwgdjIwOiBudW1iZXIsIHYyMTogbnVtYmVyLCB2MjI6IG51bWJlciwgdjIzOiBudW1iZXIsIHYyNDogbnVtYmVyLCB2MjU6IG51bWJlciwgdjI2OiBudW1iZXIsIHYyNzogbnVtYmVyLCB2Mjg6IG51bWJlciwgdjI5OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjkpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyLCB2NTogbnVtYmVyLCB2NjogbnVtYmVyLCB2NzogbnVtYmVyLCB2ODogbnVtYmVyLCB2OTogbnVtYmVyLCB2MTA6IG51bWJlciwgdjExOiBudW1iZXIsIHYxMjogbnVtYmVyLCB2MTM6IG51bWJlciwgdjE0OiBudW1iZXIsIHYxNTogbnVtYmVyLCB2MTY6IG51bWJlciwgdjE3OiBudW1iZXIsIHYxODogbnVtYmVyLCB2MTk6IG51bWJlciwgdjIwOiBudW1iZXIsIHYyMTogbnVtYmVyLCB2MjI6IG51bWJlciwgdjIzOiBudW1iZXIsIHYyNDogbnVtYmVyLCB2MjU6IG51bWJlciwgdjI2OiBudW1iZXIsIHYyNzogbnVtYmVyLCB2Mjg6IG51bWJlciwgdjI5OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAzODtcbiAgICAgICAgY29uc3QgbzQgPSBpICogMTk7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLmludDE2W28yICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDJdID0gdjM7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDNdID0gdjQ7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyA4XSA9IHY1O1xuICAgICAgICB0aGlzLmludDE2W28yICsgOV0gPSB2NjtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDEwXSA9IHY3O1xuICAgICAgICB0aGlzLmludDE2W28yICsgMTFdID0gdjg7XG4gICAgICAgIHRoaXMuaW50MTZbbzIgKyAxMl0gPSB2OTtcbiAgICAgICAgdGhpcy5pbnQxNltvMiArIDEzXSA9IHYxMDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxNF0gPSB2MTE7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMTVdID0gdjEyO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDE2XSA9IHYxMztcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAxN10gPSB2MTQ7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMThdID0gdjE1O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDE5XSA9IHYxNjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyMF0gPSB2MTc7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMjFdID0gdjE4O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDIyXSA9IHYxOTtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyM10gPSB2MjA7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMjRdID0gdjIxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDI1XSA9IHYyMjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyNl0gPSB2MjM7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgMjddID0gdjI0O1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDI4XSA9IHYyNTtcbiAgICAgICAgdGhpcy51aW50MzJbbzQgKyAxNV0gPSB2MjY7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDE2XSA9IHYyNztcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMTddID0gdjI4O1xuICAgICAgICB0aGlzLmZsb2F0MzJbbzQgKyAxOF0gPSB2Mjk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQzaTJmNmkxNXVpMXVsM2Y3Ni5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gNzY7XG5yZWdpc3RlcihTdHJ1Y3RBcnJheUxheW91dDNpMmY2aTE1dWkxdWwzZjc2LCAnU3RydWN0QXJyYXlMYXlvdXQzaTJmNmkxNXVpMXVsM2Y3NicpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbMV1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDFmNCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDE7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQxZjQucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDQ7XG5yZWdpc3RlcihTdHJ1Y3RBcnJheUxheW91dDFmNCwgJ1N0cnVjdEFycmF5TGF5b3V0MWY0Jyk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogRmxvYXQzMls3XVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0N2YyOCBleHRlbmRzIFN0cnVjdEFycmF5IHtcbiAgICB1aW50ODogVWludDhBcnJheTtcbiAgICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZmxvYXQzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlciwgdjQ6IG51bWJlciwgdjU6IG51bWJlciwgdjY6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDc7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjE7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDJdID0gdjI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDNdID0gdjM7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDRdID0gdjQ7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDVdID0gdjU7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDZdID0gdjY7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQ3ZjI4LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAyODtcbnJlZ2lzdGVyKFN0cnVjdEFycmF5TGF5b3V0N2YyOCwgJ1N0cnVjdEFycmF5TGF5b3V0N2YyOCcpO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTdHJ1Y3RBcnJheSBsYXlvdXQ6XG4gKiBbMF06IEZsb2F0MzJbNV1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3RBcnJheUxheW91dDVmMjAgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLmZsb2F0MzIgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIsIHYyOiBudW1iZXIsIHYzOiBudW1iZXIsIHY0OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEsIHYyLCB2MywgdjQpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCB2MzogbnVtYmVyLCB2NDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbzQgPSBpICogNTtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMV0gPSB2MTtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgMl0gPSB2MjtcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgM10gPSB2MztcbiAgICAgICAgdGhpcy5mbG9hdDMyW280ICsgNF0gPSB2NDtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDVmMjAucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDIwO1xucmVnaXN0ZXIoU3RydWN0QXJyYXlMYXlvdXQ1ZjIwLCAnU3RydWN0QXJyYXlMYXlvdXQ1ZjIwJyk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDMyWzFdXG4gKiBbNF06IFVpbnQxNlszXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MXVsM3VpMTIgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7XG4gICAgdWludDg6IFVpbnQ4QXJyYXk7XG4gICAgdWludDMyOiBVaW50MzJBcnJheTtcbiAgICB1aW50MTY6IFVpbnQxNkFycmF5O1xuXG4gICAgX3JlZnJlc2hWaWV3cygpIHtcbiAgICAgICAgdGhpcy51aW50OCA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB0aGlzLnVpbnQzMiA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy51aW50MTYgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgfVxuXG4gICAgZW1wbGFjZUJhY2sodjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yZXNpemUoaSArIDEpO1xuICAgICAgICByZXR1cm4gdGhpcy5lbXBsYWNlKGksIHYwLCB2MSwgdjIsIHYzKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlciwgdjI6IG51bWJlciwgdjM6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDM7XG4gICAgICAgIGNvbnN0IG8yID0gaSAqIDY7XG4gICAgICAgIHRoaXMudWludDMyW280ICsgMF0gPSB2MDtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAyXSA9IHYxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDNdID0gdjI7XG4gICAgICAgIHRoaXMudWludDE2W28yICsgNF0gPSB2MztcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxufVxuXG5TdHJ1Y3RBcnJheUxheW91dDF1bDN1aTEyLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAxMjtcbnJlZ2lzdGVyKFN0cnVjdEFycmF5TGF5b3V0MXVsM3VpMTIsICdTdHJ1Y3RBcnJheUxheW91dDF1bDN1aTEyJyk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDE2WzJdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQydWk0IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIsIHYxOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCwgdjEpO1xuICAgIH1cblxuICAgIGVtcGxhY2UoaTogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbzIgPSBpICogMjtcbiAgICAgICAgdGhpcy51aW50MTZbbzIgKyAwXSA9IHYwO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDFdID0gdjE7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQydWk0LnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSA0O1xucmVnaXN0ZXIoU3RydWN0QXJyYXlMYXlvdXQydWk0LCAnU3RydWN0QXJyYXlMYXlvdXQydWk0Jyk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogVWludDE2WzFdXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3RydWN0QXJyYXlMYXlvdXQxdWkyIGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIHVpbnQxNjogVWludDE2QXJyYXk7XG5cbiAgICBfcmVmcmVzaFZpZXdzKCkge1xuICAgICAgICB0aGlzLnVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIHRoaXMudWludDE2ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVtcGxhY2VCYWNrKHYwOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBpID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHRoaXMucmVzaXplKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1wbGFjZShpLCB2MCk7XG4gICAgfVxuXG4gICAgZW1wbGFjZShpOiBudW1iZXIsIHYwOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBvMiA9IGkgKiAxO1xuICAgICAgICB0aGlzLnVpbnQxNltvMiArIDBdID0gdjA7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQxdWkyLnByb3RvdHlwZS5ieXRlc1BlckVsZW1lbnQgPSAyO1xucmVnaXN0ZXIoU3RydWN0QXJyYXlMYXlvdXQxdWkyLCAnU3RydWN0QXJyYXlMYXlvdXQxdWkyJyk7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFN0cnVjdEFycmF5IGxheW91dDpcbiAqIFswXTogRmxvYXQzMlsyXVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5TGF5b3V0MmY4IGV4dGVuZHMgU3RydWN0QXJyYXkge1xuICAgIHVpbnQ4OiBVaW50OEFycmF5O1xuICAgIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcblxuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIHRoaXMudWludDggPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICAgICAgdGhpcy5mbG9hdDMyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmFycmF5QnVmZmVyKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlQmFjayh2MDogbnVtYmVyLCB2MTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMubGVuZ3RoO1xuICAgICAgICB0aGlzLnJlc2l6ZShpICsgMSk7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcGxhY2UoaSwgdjAsIHYxKTtcbiAgICB9XG5cbiAgICBlbXBsYWNlKGk6IG51bWJlciwgdjA6IG51bWJlciwgdjE6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG80ID0gaSAqIDI7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDBdID0gdjA7XG4gICAgICAgIHRoaXMuZmxvYXQzMltvNCArIDFdID0gdjE7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbn1cblxuU3RydWN0QXJyYXlMYXlvdXQyZjgucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudCA9IDg7XG5yZWdpc3RlcihTdHJ1Y3RBcnJheUxheW91dDJmOCwgJ1N0cnVjdEFycmF5TGF5b3V0MmY4Jyk7XG5cbmNsYXNzIEZpbGxFeHRydXNpb25FeHRTdHJ1Y3QgZXh0ZW5kcyBTdHJ1Y3Qge1xuICAgIF9zdHJ1Y3RBcnJheTogRmlsbEV4dHJ1c2lvbkV4dEFycmF5O1xuICAgIGdldCBhX3Bvc18zMCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdOyB9XG4gICAgZ2V0IGFfcG9zXzMxKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMV07IH1cbiAgICBnZXQgYV9wb3NfMzIoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyXTsgfVxuICAgIGdldCBhX3Bvc19ub3JtYWxfMzAoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAzXTsgfVxuICAgIGdldCBhX3Bvc19ub3JtYWxfMzEoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA0XTsgfVxuICAgIGdldCBhX3Bvc19ub3JtYWxfMzIoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyA1XTsgfVxufVxuXG5GaWxsRXh0cnVzaW9uRXh0U3RydWN0LnByb3RvdHlwZS5zaXplID0gMTI7XG5cbmV4cG9ydCB0eXBlIEZpbGxFeHRydXNpb25FeHQgPSBGaWxsRXh0cnVzaW9uRXh0U3RydWN0O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxsRXh0cnVzaW9uRXh0QXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDZpMTIge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgRmlsbEV4dHJ1c2lvbkV4dFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQoaW5kZXg6IG51bWJlcik6IEZpbGxFeHRydXNpb25FeHRTdHJ1Y3Qge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgRmlsbEV4dHJ1c2lvbkV4dFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcihGaWxsRXh0cnVzaW9uRXh0QXJyYXksICdGaWxsRXh0cnVzaW9uRXh0QXJyYXknKTtcblxuY2xhc3MgQ29sbGlzaW9uQm94U3RydWN0IGV4dGVuZHMgU3RydWN0IHtcbiAgICBfc3RydWN0QXJyYXk6IENvbGxpc2lvbkJveEFycmF5O1xuICAgIGdldCBwcm9qZWN0ZWRBbmNob3JYKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF07IH1cbiAgICBnZXQgcHJvamVjdGVkQW5jaG9yWSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdOyB9XG4gICAgZ2V0IHByb2plY3RlZEFuY2hvclooKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyXTsgfVxuICAgIGdldCB0aWxlQW5jaG9yWCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDNdOyB9XG4gICAgZ2V0IHRpbGVBbmNob3JZKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgNF07IH1cbiAgICBnZXQgeDEoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDNdOyB9XG4gICAgZ2V0IHkxKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyA0XTsgfVxuICAgIGdldCB4MigpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgNV07IH1cbiAgICBnZXQgeTIoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDZdOyB9XG4gICAgZ2V0IHBhZGRpbmcoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxNF07IH1cbiAgICBnZXQgZmVhdHVyZUluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDhdOyB9XG4gICAgZ2V0IHNvdXJjZUxheWVySW5kZXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMThdOyB9XG4gICAgZ2V0IGJ1Y2tldEluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE5XTsgfVxufVxuXG5Db2xsaXNpb25Cb3hTdHJ1Y3QucHJvdG90eXBlLnNpemUgPSA0MDtcblxuZXhwb3J0IHR5cGUgQ29sbGlzaW9uQm94ID0gQ29sbGlzaW9uQm94U3RydWN0O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsaXNpb25Cb3hBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0NWk0ZjFpMXVsMnVpNDAge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgQ29sbGlzaW9uQm94U3RydWN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldChpbmRleDogbnVtYmVyKTogQ29sbGlzaW9uQm94U3RydWN0IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IENvbGxpc2lvbkJveFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcihDb2xsaXNpb25Cb3hBcnJheSwgJ0NvbGxpc2lvbkJveEFycmF5Jyk7XG5cbmNsYXNzIFBsYWNlZFN5bWJvbFN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgX3N0cnVjdEFycmF5OiBQbGFjZWRTeW1ib2xBcnJheTtcbiAgICBnZXQgcHJvamVjdGVkQW5jaG9yWCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDBdOyB9XG4gICAgZ2V0IHByb2plY3RlZEFuY2hvclkoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXTsgfVxuICAgIGdldCBwcm9qZWN0ZWRBbmNob3JaKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMl07IH1cbiAgICBnZXQgdGlsZUFuY2hvclgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDJdOyB9XG4gICAgZ2V0IHRpbGVBbmNob3JZKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAzXTsgfVxuICAgIGdldCBnbHlwaFN0YXJ0SW5kZXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgOF07IH1cbiAgICBnZXQgbnVtR2x5cGhzKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDldOyB9XG4gICAgZ2V0IHZlcnRleFN0YXJ0SW5kZXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgNV07IH1cbiAgICBnZXQgbGluZVN0YXJ0SW5kZXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgNl07IH1cbiAgICBnZXQgbGluZUxlbmd0aCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyA3XTsgfVxuICAgIGdldCBzZWdtZW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE2XTsgfVxuICAgIGdldCBsb3dlclNpemUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTddOyB9XG4gICAgZ2V0IHVwcGVyU2l6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxOF07IH1cbiAgICBnZXQgbGluZU9mZnNldFgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDEwXTsgfVxuICAgIGdldCBsaW5lT2Zmc2V0WSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgMTFdOyB9XG4gICAgZ2V0IHdyaXRpbmdNb2RlKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgNDhdOyB9XG4gICAgZ2V0IHBsYWNlZE9yaWVudGF0aW9uKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgNDldOyB9XG4gICAgc2V0IHBsYWNlZE9yaWVudGF0aW9uKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgNDldID0geDsgfVxuICAgIGdldCBoaWRkZW4oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyA1MF07IH1cbiAgICBzZXQgaGlkZGVuKHg6IG51bWJlcikgeyB0aGlzLl9zdHJ1Y3RBcnJheS51aW50OFt0aGlzLl9wb3MxICsgNTBdID0geDsgfVxuICAgIGdldCBjcm9zc1RpbGVJRCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAxM107IH1cbiAgICBzZXQgY3Jvc3NUaWxlSUQoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQzMlt0aGlzLl9wb3M0ICsgMTNdID0geDsgfVxuICAgIGdldCBhc3NvY2lhdGVkSWNvbkluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMjhdOyB9XG4gICAgZ2V0IGZsaXBTdGF0ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDhbdGhpcy5fcG9zMSArIDU4XTsgfVxuICAgIHNldCBmbGlwU3RhdGUoeDogbnVtYmVyKSB7IHRoaXMuX3N0cnVjdEFycmF5LnVpbnQ4W3RoaXMuX3BvczEgKyA1OF0gPSB4OyB9XG59XG5cblBsYWNlZFN5bWJvbFN0cnVjdC5wcm90b3R5cGUuc2l6ZSA9IDYwO1xuXG5leHBvcnQgdHlwZSBQbGFjZWRTeW1ib2wgPSBQbGFjZWRTeW1ib2xTdHJ1Y3Q7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFBsYWNlZFN5bWJvbEFycmF5IGV4dGVuZHMgU3RydWN0QXJyYXlMYXlvdXQzaTJmMnVpM3VsM3VpMmYzdWIxdWwxaTF1YjYwIHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIFBsYWNlZFN5bWJvbFN0cnVjdCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gaW4gdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQoaW5kZXg6IG51bWJlcik6IFBsYWNlZFN5bWJvbFN0cnVjdCB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQbGFjZWRTeW1ib2xTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoUGxhY2VkU3ltYm9sQXJyYXksICdQbGFjZWRTeW1ib2xBcnJheScpO1xuXG5jbGFzcyBTeW1ib2xJbnN0YW5jZVN0cnVjdCBleHRlbmRzIFN0cnVjdCB7XG4gICAgX3N0cnVjdEFycmF5OiBTeW1ib2xJbnN0YW5jZUFycmF5O1xuICAgIGdldCBwcm9qZWN0ZWRBbmNob3JYKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF07IH1cbiAgICBnZXQgcHJvamVjdGVkQW5jaG9yWSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDFdOyB9XG4gICAgZ2V0IHByb2plY3RlZEFuY2hvclooKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAyXTsgfVxuICAgIGdldCB0aWxlQW5jaG9yWCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgMl07IH1cbiAgICBnZXQgdGlsZUFuY2hvclkoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDNdOyB9XG4gICAgZ2V0IHJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgOF07IH1cbiAgICBnZXQgY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgOV07IH1cbiAgICBnZXQgbGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDEwXTsgfVxuICAgIGdldCB2ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDExXTsgfVxuICAgIGdldCBwbGFjZWRJY29uU3ltYm9sSW5kZXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxMl07IH1cbiAgICBnZXQgdmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxM107IH1cbiAgICBnZXQga2V5KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE0XTsgfVxuICAgIGdldCB0ZXh0Qm94U3RhcnRJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxNV07IH1cbiAgICBnZXQgdGV4dEJveEVuZEluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE2XTsgfVxuICAgIGdldCB2ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDE3XTsgfVxuICAgIGdldCB2ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAxOF07IH1cbiAgICBnZXQgaWNvbkJveFN0YXJ0SW5kZXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMTldOyB9XG4gICAgZ2V0IGljb25Cb3hFbmRJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyMF07IH1cbiAgICBnZXQgdmVydGljYWxJY29uQm94U3RhcnRJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyMV07IH1cbiAgICBnZXQgdmVydGljYWxJY29uQm94RW5kSW5kZXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMjJdOyB9XG4gICAgZ2V0IGZlYXR1cmVJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyM107IH1cbiAgICBnZXQgbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMjRdOyB9XG4gICAgZ2V0IG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyNV07IH1cbiAgICBnZXQgbnVtSWNvblZlcnRpY2VzKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDI2XTsgfVxuICAgIGdldCBudW1WZXJ0aWNhbEljb25WZXJ0aWNlcygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDE2W3RoaXMuX3BvczIgKyAyN107IH1cbiAgICBnZXQgdXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMjhdOyB9XG4gICAgZ2V0IGNyb3NzVGlsZUlEKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MzJbdGhpcy5fcG9zNCArIDE1XTsgfVxuICAgIHNldCBjcm9zc1RpbGVJRCh4OiBudW1iZXIpIHsgdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAxNV0gPSB4OyB9XG4gICAgZ2V0IHRleHRPZmZzZXQwKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5mbG9hdDMyW3RoaXMuX3BvczQgKyAxNl07IH1cbiAgICBnZXQgdGV4dE9mZnNldDEoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmZsb2F0MzJbdGhpcy5fcG9zNCArIDE3XTsgfVxuICAgIGdldCBjb2xsaXNpb25DaXJjbGVEaWFtZXRlcigpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuZmxvYXQzMlt0aGlzLl9wb3M0ICsgMThdOyB9XG59XG5cblN5bWJvbEluc3RhbmNlU3RydWN0LnByb3RvdHlwZS5zaXplID0gNzY7XG5cbmV4cG9ydCB0eXBlIFN5bWJvbEluc3RhbmNlID0gU3ltYm9sSW5zdGFuY2VTdHJ1Y3Q7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFN5bWJvbEluc3RhbmNlQXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDNpMmY2aTE1dWkxdWwzZjc2IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIFN5bWJvbEluc3RhbmNlU3RydWN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldChpbmRleDogbnVtYmVyKTogU3ltYm9sSW5zdGFuY2VTdHJ1Y3Qge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgU3ltYm9sSW5zdGFuY2VTdHJ1Y3QodGhpcywgaW5kZXgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoU3ltYm9sSW5zdGFuY2VBcnJheSwgJ1N5bWJvbEluc3RhbmNlQXJyYXknKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgR2x5cGhPZmZzZXRBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0MWY0IHtcbiAgICBnZXRvZmZzZXRYKGluZGV4OiBudW1iZXIpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5mbG9hdDMyW2luZGV4ICogMSArIDBdOyB9XG59XG5cbnJlZ2lzdGVyKEdseXBoT2Zmc2V0QXJyYXksICdHbHlwaE9mZnNldEFycmF5Jyk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIFN5bWJvbExpbmVWZXJ0ZXhBcnJheSBleHRlbmRzIFN0cnVjdEFycmF5TGF5b3V0M2k2IHtcbiAgICBnZXR4KGluZGV4OiBudW1iZXIpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5pbnQxNltpbmRleCAqIDMgKyAwXTsgfVxuICAgIGdldHkoaW5kZXg6IG51bWJlcik6IG51bWJlciB7IHJldHVybiB0aGlzLmludDE2W2luZGV4ICogMyArIDFdOyB9XG4gICAgZ2V0dGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IoaW5kZXg6IG51bWJlcik6IG51bWJlciB7IHJldHVybiB0aGlzLmludDE2W2luZGV4ICogMyArIDJdOyB9XG59XG5cbnJlZ2lzdGVyKFN5bWJvbExpbmVWZXJ0ZXhBcnJheSwgJ1N5bWJvbExpbmVWZXJ0ZXhBcnJheScpO1xuXG5jbGFzcyBGZWF0dXJlSW5kZXhTdHJ1Y3QgZXh0ZW5kcyBTdHJ1Y3Qge1xuICAgIF9zdHJ1Y3RBcnJheTogRmVhdHVyZUluZGV4QXJyYXk7XG4gICAgZ2V0IGZlYXR1cmVJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkudWludDMyW3RoaXMuX3BvczQgKyAwXTsgfVxuICAgIGdldCBzb3VyY2VMYXllckluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDJdOyB9XG4gICAgZ2V0IGJ1Y2tldEluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDNdOyB9XG4gICAgZ2V0IGxheW91dFZlcnRleEFycmF5T2Zmc2V0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDRdOyB9XG59XG5cbkZlYXR1cmVJbmRleFN0cnVjdC5wcm90b3R5cGUuc2l6ZSA9IDEyO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlSW5kZXggPSBGZWF0dXJlSW5kZXhTdHJ1Y3Q7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIEZlYXR1cmVJbmRleEFycmF5IGV4dGVuZHMgU3RydWN0QXJyYXlMYXlvdXQxdWwzdWkxMiB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBGZWF0dXJlSW5kZXhTdHJ1Y3QgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KGluZGV4OiBudW1iZXIpOiBGZWF0dXJlSW5kZXhTdHJ1Y3Qge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgRmVhdHVyZUluZGV4U3RydWN0KHRoaXMsIGluZGV4KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKEZlYXR1cmVJbmRleEFycmF5LCAnRmVhdHVyZUluZGV4QXJyYXknKTtcblxuY2xhc3MgRmlsbEV4dHJ1c2lvbkNlbnRyb2lkU3RydWN0IGV4dGVuZHMgU3RydWN0IHtcbiAgICBfc3RydWN0QXJyYXk6IEZpbGxFeHRydXNpb25DZW50cm9pZEFycmF5O1xuICAgIGdldCBhX2NlbnRyb2lkX3BvczAoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LnVpbnQxNlt0aGlzLl9wb3MyICsgMF07IH1cbiAgICBnZXQgYV9jZW50cm9pZF9wb3MxKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS51aW50MTZbdGhpcy5fcG9zMiArIDFdOyB9XG59XG5cbkZpbGxFeHRydXNpb25DZW50cm9pZFN0cnVjdC5wcm90b3R5cGUuc2l6ZSA9IDQ7XG5cbmV4cG9ydCB0eXBlIEZpbGxFeHRydXNpb25DZW50cm9pZCA9IEZpbGxFeHRydXNpb25DZW50cm9pZFN0cnVjdDtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY2xhc3MgRmlsbEV4dHJ1c2lvbkNlbnRyb2lkQXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDJ1aTQge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgRmlsbEV4dHJ1c2lvbkNlbnRyb2lkU3RydWN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldChpbmRleDogbnVtYmVyKTogRmlsbEV4dHJ1c2lvbkNlbnRyb2lkU3RydWN0IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuICAgICAgICByZXR1cm4gbmV3IEZpbGxFeHRydXNpb25DZW50cm9pZFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcihGaWxsRXh0cnVzaW9uQ2VudHJvaWRBcnJheSwgJ0ZpbGxFeHRydXNpb25DZW50cm9pZEFycmF5Jyk7XG5cbmNsYXNzIENpcmNsZUdsb2JlRXh0U3RydWN0IGV4dGVuZHMgU3RydWN0IHtcbiAgICBfc3RydWN0QXJyYXk6IENpcmNsZUdsb2JlRXh0QXJyYXk7XG4gICAgZ2V0IGFfcG9zXzMwKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdHJ1Y3RBcnJheS5pbnQxNlt0aGlzLl9wb3MyICsgMF07IH1cbiAgICBnZXQgYV9wb3NfMzEoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3N0cnVjdEFycmF5LmludDE2W3RoaXMuX3BvczIgKyAxXTsgfVxuICAgIGdldCBhX3Bvc18zMigpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDJdOyB9XG4gICAgZ2V0IGFfcG9zX25vcm1hbF8zMCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDNdOyB9XG4gICAgZ2V0IGFfcG9zX25vcm1hbF8zMSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDRdOyB9XG4gICAgZ2V0IGFfcG9zX25vcm1hbF8zMigpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3RydWN0QXJyYXkuaW50MTZbdGhpcy5fcG9zMiArIDVdOyB9XG59XG5cbkNpcmNsZUdsb2JlRXh0U3RydWN0LnByb3RvdHlwZS5zaXplID0gMTI7XG5cbmV4cG9ydCB0eXBlIENpcmNsZUdsb2JlRXh0ID0gQ2lyY2xlR2xvYmVFeHRTdHJ1Y3Q7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNsYXNzIENpcmNsZUdsb2JlRXh0QXJyYXkgZXh0ZW5kcyBTdHJ1Y3RBcnJheUxheW91dDZpMTIge1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgQ2lyY2xlR2xvYmVFeHRTdHJ1Y3QgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIGluIHRoZSBhcnJheS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KGluZGV4OiBudW1iZXIpOiBDaXJjbGVHbG9iZUV4dFN0cnVjdCB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVHbG9iZUV4dFN0cnVjdCh0aGlzLCBpbmRleCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcihDaXJjbGVHbG9iZUV4dEFycmF5LCAnQ2lyY2xlR2xvYmVFeHRBcnJheScpO1xuXG5leHBvcnQge1xuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2k2LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0dWIxZjEyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGYxNixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDEwdWkyMCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDh1aTE2LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NmkxMixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDRpNHVpNGkyNCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDNpM2YyMCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDF1bDQsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ1aTRmMWkxdWwydWk0MCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDNpMmkyaTE2LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MmYxZjJpMTYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQydWIyZjEyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2YxMixcbiAgICBTdHJ1Y3RBcnJheUxheW91dDN1aTYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzaTJmMnVpM3VsM3VpMmYzdWIxdWwxaTF1YjYwLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0M2kyZjZpMTV1aTF1bDNmNzYsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxZjQsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ3ZjI4LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NWYyMCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDF1bDN1aTEyLFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MnVpNCxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDF1aTIsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyZjgsXG4gICAgU3RydWN0QXJyYXlMYXlvdXQyaTQgYXMgUG9zQXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzaTYgYXMgUG9zR2xvYmVFeHRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDRpOCBhcyBSYXN0ZXJCb3VuZHNBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNCBhcyBDaXJjbGVMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNCBhcyBGaWxsTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ0aTggYXMgRmlsbEV4dHJ1c2lvbkxheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0Mmk0IGFzIEhlYXRtYXBMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJpNHViMWYxMiBhcyBMaW5lTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ0ZjE2IGFzIExpbmVFeHRMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDEwdWkyMCBhcyBQYXR0ZXJuTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ4dWkxNiBhcyBEYXNoTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQ0aTR1aTRpMjQgYXMgU3ltYm9sTGF5b3V0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzaTNmMjAgYXMgU3ltYm9sR2xvYmVFeHRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDRmMTYgYXMgU3ltYm9sRHluYW1pY0xheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MXVsNCBhcyBTeW1ib2xPcGFjaXR5QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzaTJpMmkxNiBhcyBDb2xsaXNpb25Cb3hMYXlvdXRBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJmMWYyaTE2IGFzIENvbGxpc2lvbkNpcmNsZUxheW91dEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0MnViMmYxMiBhcyBDb2xsaXNpb25WZXJ0ZXhBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDNmMTIgYXMgQ29sbGlzaW9uVmVydGV4RXh0QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzdWk2IGFzIFF1YWRUcmlhbmdsZUFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0N2YyOCBhcyBHbG9iZVZlcnRleEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NWYyMCBhcyBBdG1vc3BoZXJlVmVydGV4QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzdWk2IGFzIFRyaWFuZ2xlSW5kZXhBcnJheSxcbiAgICBTdHJ1Y3RBcnJheUxheW91dDJ1aTQgYXMgTGluZUluZGV4QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQxdWkyIGFzIExpbmVTdHJpcEluZGV4QXJyYXksXG4gICAgU3RydWN0QXJyYXlMYXlvdXQzZjEyIGFzIFNreWJveFZlcnRleEFycmF5LFxuICAgIFN0cnVjdEFycmF5TGF5b3V0NGk4IGFzIFRpbGVCb3VuZHNBcnJheVxufTtcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5pbXBvcnQgdHlwZSB7U3RydWN0QXJyYXlMYXlvdXR9IGZyb20gJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcblxuY29uc3QgcGF0dGVybkF0dHJpYnV0ZXM6IFN0cnVjdEFycmF5TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICAvLyBbdGwueCwgdGwueSwgYnIueCwgYnIueV1cbiAgICB7bmFtZTogJ2FfcGF0dGVybl90bycsIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50MTYnfSxcbiAgICB7bmFtZTogJ2FfcGF0dGVybl9mcm9tJywgY29tcG9uZW50czogNCwgdHlwZTogJ1VpbnQxNid9LFxuICAgIHtuYW1lOiAnYV9waXhlbF9yYXRpb190bycsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MTYnfSxcbiAgICB7bmFtZTogJ2FfcGl4ZWxfcmF0aW9fZnJvbScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MTYnfSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBwYXR0ZXJuQXR0cmlidXRlcztcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5pbXBvcnQgdHlwZSB7U3RydWN0QXJyYXlMYXlvdXR9IGZyb20gJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcblxuY29uc3QgZGFzaEF0dHJpYnV0ZXM6IFN0cnVjdEFycmF5TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfZGFzaF90bycsIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50MTYnfSwgLy8gW3gsIHksIHdpZHRoLCB1bnVzZWRdXG4gICAge25hbWU6ICdhX2Rhc2hfZnJvbScsIGNvbXBvbmVudHM6IDQsIHR5cGU6ICdVaW50MTYnfVxuXSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRhc2hBdHRyaWJ1dGVzO1xuIiwiLyoqXG4gKiBKUyBJbXBsZW1lbnRhdGlvbiBvZiBNdXJtdXJIYXNoMyAocjEzNikgKGFzIG9mIE1heSAyMCwgMjAxMSlcbiAqIFxuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmdhcnkuY291cnRAZ21haWwuY29tXCI+R2FyeSBDb3VydDwvYT5cbiAqIEBzZWUgaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L211cm11cmhhc2gtanNcbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzphYXBwbGVieUBnbWFpbC5jb21cIj5BdXN0aW4gQXBwbGVieTwvYT5cbiAqIEBzZWUgaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vc2l0ZS9tdXJtdXJoYXNoL1xuICogXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IEFTQ0lJIG9ubHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWVkIFBvc2l0aXZlIGludGVnZXIgb25seVxuICogQHJldHVybiB7bnVtYmVyfSAzMi1iaXQgcG9zaXRpdmUgaW50ZWdlciBoYXNoIFxuICovXG5cbmZ1bmN0aW9uIG11cm11cmhhc2gzXzMyX2djKGtleSwgc2VlZCkge1xuXHR2YXIgcmVtYWluZGVyLCBieXRlcywgaDEsIGgxYiwgYzEsIGMxYiwgYzIsIGMyYiwgazEsIGk7XG5cdFxuXHRyZW1haW5kZXIgPSBrZXkubGVuZ3RoICYgMzsgLy8ga2V5Lmxlbmd0aCAlIDRcblx0Ynl0ZXMgPSBrZXkubGVuZ3RoIC0gcmVtYWluZGVyO1xuXHRoMSA9IHNlZWQ7XG5cdGMxID0gMHhjYzllMmQ1MTtcblx0YzIgPSAweDFiODczNTkzO1xuXHRpID0gMDtcblx0XG5cdHdoaWxlIChpIDwgYnl0ZXMpIHtcblx0ICBcdGsxID0gXG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoaSkgJiAweGZmKSkgfFxuXHQgIFx0ICAoKGtleS5jaGFyQ29kZUF0KCsraSkgJiAweGZmKSA8PCA4KSB8XG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDE2KSB8XG5cdCAgXHQgICgoa2V5LmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDI0KTtcblx0XHQrK2k7XG5cdFx0XG5cdFx0azEgPSAoKCgoazEgJiAweGZmZmYpICogYzEpICsgKCgoKGsxID4+PiAxNikgKiBjMSkgJiAweGZmZmYpIDw8IDE2KSkpICYgMHhmZmZmZmZmZjtcblx0XHRrMSA9IChrMSA8PCAxNSkgfCAoazEgPj4+IDE3KTtcblx0XHRrMSA9ICgoKChrMSAmIDB4ZmZmZikgKiBjMikgKyAoKCgoazEgPj4+IDE2KSAqIGMyKSAmIDB4ZmZmZikgPDwgMTYpKSkgJiAweGZmZmZmZmZmO1xuXG5cdFx0aDEgXj0gazE7XG4gICAgICAgIGgxID0gKGgxIDw8IDEzKSB8IChoMSA+Pj4gMTkpO1xuXHRcdGgxYiA9ICgoKChoMSAmIDB4ZmZmZikgKiA1KSArICgoKChoMSA+Pj4gMTYpICogNSkgJiAweGZmZmYpIDw8IDE2KSkpICYgMHhmZmZmZmZmZjtcblx0XHRoMSA9ICgoKGgxYiAmIDB4ZmZmZikgKyAweDZiNjQpICsgKCgoKGgxYiA+Pj4gMTYpICsgMHhlNjU0KSAmIDB4ZmZmZikgPDwgMTYpKTtcblx0fVxuXHRcblx0azEgPSAwO1xuXHRcblx0c3dpdGNoIChyZW1haW5kZXIpIHtcblx0XHRjYXNlIDM6IGsxIF49IChrZXkuY2hhckNvZGVBdChpICsgMikgJiAweGZmKSA8PCAxNjtcblx0XHRjYXNlIDI6IGsxIF49IChrZXkuY2hhckNvZGVBdChpICsgMSkgJiAweGZmKSA8PCA4O1xuXHRcdGNhc2UgMTogazEgXj0gKGtleS5jaGFyQ29kZUF0KGkpICYgMHhmZik7XG5cdFx0XG5cdFx0azEgPSAoKChrMSAmIDB4ZmZmZikgKiBjMSkgKyAoKCgoazEgPj4+IDE2KSAqIGMxKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdFx0azEgPSAoazEgPDwgMTUpIHwgKGsxID4+PiAxNyk7XG5cdFx0azEgPSAoKChrMSAmIDB4ZmZmZikgKiBjMikgKyAoKCgoazEgPj4+IDE2KSAqIGMyKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdFx0aDEgXj0gazE7XG5cdH1cblx0XG5cdGgxIF49IGtleS5sZW5ndGg7XG5cblx0aDEgXj0gaDEgPj4+IDE2O1xuXHRoMSA9ICgoKGgxICYgMHhmZmZmKSAqIDB4ODVlYmNhNmIpICsgKCgoKGgxID4+PiAxNikgKiAweDg1ZWJjYTZiKSAmIDB4ZmZmZikgPDwgMTYpKSAmIDB4ZmZmZmZmZmY7XG5cdGgxIF49IGgxID4+PiAxMztcblx0aDEgPSAoKCgoaDEgJiAweGZmZmYpICogMHhjMmIyYWUzNSkgKyAoKCgoaDEgPj4+IDE2KSAqIDB4YzJiMmFlMzUpICYgMHhmZmZmKSA8PCAxNikpKSAmIDB4ZmZmZmZmZmY7XG5cdGgxIF49IGgxID4+PiAxNjtcblxuXHRyZXR1cm4gaDEgPj4+IDA7XG59XG5cbmlmKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBtdXJtdXJoYXNoM18zMl9nY1xufSIsIi8qKlxuICogSlMgSW1wbGVtZW50YXRpb24gb2YgTXVybXVySGFzaDJcbiAqIFxuICogQGF1dGhvciA8YSBocmVmPVwibWFpbHRvOmdhcnkuY291cnRAZ21haWwuY29tXCI+R2FyeSBDb3VydDwvYT5cbiAqIEBzZWUgaHR0cDovL2dpdGh1Yi5jb20vZ2FyeWNvdXJ0L211cm11cmhhc2gtanNcbiAqIEBhdXRob3IgPGEgaHJlZj1cIm1haWx0bzphYXBwbGVieUBnbWFpbC5jb21cIj5BdXN0aW4gQXBwbGVieTwvYT5cbiAqIEBzZWUgaHR0cDovL3NpdGVzLmdvb2dsZS5jb20vc2l0ZS9tdXJtdXJoYXNoL1xuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIEFTQ0lJIG9ubHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBzZWVkIFBvc2l0aXZlIGludGVnZXIgb25seVxuICogQHJldHVybiB7bnVtYmVyfSAzMi1iaXQgcG9zaXRpdmUgaW50ZWdlciBoYXNoXG4gKi9cblxuZnVuY3Rpb24gbXVybXVyaGFzaDJfMzJfZ2Moc3RyLCBzZWVkKSB7XG4gIHZhclxuICAgIGwgPSBzdHIubGVuZ3RoLFxuICAgIGggPSBzZWVkIF4gbCxcbiAgICBpID0gMCxcbiAgICBrO1xuICBcbiAgd2hpbGUgKGwgPj0gNCkge1xuICBcdGsgPSBcbiAgXHQgICgoc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKSkgfFxuICBcdCAgKChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgOCkgfFxuICBcdCAgKChzdHIuY2hhckNvZGVBdCgrK2kpICYgMHhmZikgPDwgMTYpIHxcbiAgXHQgICgoc3RyLmNoYXJDb2RlQXQoKytpKSAmIDB4ZmYpIDw8IDI0KTtcbiAgICBcbiAgICBrID0gKCgoayAmIDB4ZmZmZikgKiAweDViZDFlOTk1KSArICgoKChrID4+PiAxNikgKiAweDViZDFlOTk1KSAmIDB4ZmZmZikgPDwgMTYpKTtcbiAgICBrIF49IGsgPj4+IDI0O1xuICAgIGsgPSAoKChrICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGsgPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuXG5cdGggPSAoKChoICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGggPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpIF4gaztcblxuICAgIGwgLT0gNDtcbiAgICArK2k7XG4gIH1cbiAgXG4gIHN3aXRjaCAobCkge1xuICBjYXNlIDM6IGggXj0gKHN0ci5jaGFyQ29kZUF0KGkgKyAyKSAmIDB4ZmYpIDw8IDE2O1xuICBjYXNlIDI6IGggXj0gKHN0ci5jaGFyQ29kZUF0KGkgKyAxKSAmIDB4ZmYpIDw8IDg7XG4gIGNhc2UgMTogaCBePSAoc3RyLmNoYXJDb2RlQXQoaSkgJiAweGZmKTtcbiAgICAgICAgICBoID0gKCgoaCAmIDB4ZmZmZikgKiAweDViZDFlOTk1KSArICgoKChoID4+PiAxNikgKiAweDViZDFlOTk1KSAmIDB4ZmZmZikgPDwgMTYpKTtcbiAgfVxuXG4gIGggXj0gaCA+Pj4gMTM7XG4gIGggPSAoKChoICYgMHhmZmZmKSAqIDB4NWJkMWU5OTUpICsgKCgoKGggPj4+IDE2KSAqIDB4NWJkMWU5OTUpICYgMHhmZmZmKSA8PCAxNikpO1xuICBoIF49IGggPj4+IDE1O1xuXG4gIHJldHVybiBoID4+PiAwO1xufVxuXG5pZih0eXBlb2YgbW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBtdXJtdXJoYXNoMl8zMl9nY1xufVxuIiwidmFyIG11cm11cjMgPSByZXF1aXJlKFwiLi9tdXJtdXJoYXNoM19nYy5qc1wiKVxudmFyIG11cm11cjIgPSByZXF1aXJlKFwiLi9tdXJtdXJoYXNoMl9nYy5qc1wiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IG11cm11cjNcbm1vZHVsZS5leHBvcnRzLm11cm11cjMgPSBtdXJtdXIzXG5tb2R1bGUuZXhwb3J0cy5tdXJtdXIyID0gbXVybXVyMlxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IG11cm11cjMgZnJvbSAnbXVybXVyaGFzaC1qcyc7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG50eXBlIFNlcmlhbGl6ZWRGZWF0dXJlUG9zaXRpb25NYXAgPSB7XG4gICAgaWRzOiBGbG9hdDY0QXJyYXk7XG4gICAgcG9zaXRpb25zOiBVaW50MzJBcnJheTtcbn07XG5cbnR5cGUgRmVhdHVyZVBvc2l0aW9uID0ge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbn07XG5cbi8vIEEgdHJhbnNmZXJhYmxlIGRhdGEgc3RydWN0dXJlIHRoYXQgbWFwcyBmZWF0dXJlIGlkcyB0byB0aGVpciBpbmRpY2VzIGFuZCBidWZmZXIgb2Zmc2V0c1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmVhdHVyZVBvc2l0aW9uTWFwIHtcbiAgICBpZHM6IEFycmF5PG51bWJlcj47XG4gICAgcG9zaXRpb25zOiBBcnJheTxudW1iZXI+O1xuICAgIGluZGV4ZWQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pZHMgPSBbXTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5pbmRleGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYWRkKGlkOiBtaXhlZCwgaW5kZXg6IG51bWJlciwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5pZHMucHVzaChnZXROdW1lcmljSWQoaWQpKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMucHVzaChpbmRleCwgc3RhcnQsIGVuZCk7XG4gICAgfVxuXG4gICAgZ2V0UG9zaXRpb25zKGlkOiBtaXhlZCk6IEFycmF5PEZlYXR1cmVQb3NpdGlvbj4ge1xuICAgICAgICBhc3NlcnQodGhpcy5pbmRleGVkKTtcblxuICAgICAgICBjb25zdCBpbnRJZCA9IGdldE51bWVyaWNJZChpZCk7XG5cbiAgICAgICAgLy8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgaWQgaW4gdGhpcy5pZHM7XG4gICAgICAgIC8vIHJlbGllcyBvbiBpZHMvcG9zaXRpb25zIGJlaW5nIHNvcnRlZCBieSBpZCwgd2hpY2ggaGFwcGVucyBpbiBzZXJpYWxpemF0aW9uXG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGogPSB0aGlzLmlkcy5sZW5ndGggLSAxO1xuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIGNvbnN0IG0gPSAoaSArIGopID4+IDE7XG4gICAgICAgICAgICBpZiAodGhpcy5pZHNbbV0gPj0gaW50SWQpIHtcbiAgICAgICAgICAgICAgICBqID0gbTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaSA9IG0gKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5pZHNbaV0gPT09IGludElkKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucG9zaXRpb25zWzMgKiBpXTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5wb3NpdGlvbnNbMyAqIGkgKyAxXTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMucG9zaXRpb25zWzMgKiBpICsgMl07XG4gICAgICAgICAgICBwb3NpdGlvbnMucHVzaCh7aW5kZXgsIHN0YXJ0LCBlbmR9KTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9zaXRpb25zO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXJpYWxpemUobWFwOiBGZWF0dXJlUG9zaXRpb25NYXAsIHRyYW5zZmVyYWJsZXM6IEFycmF5PEFycmF5QnVmZmVyPik6IFNlcmlhbGl6ZWRGZWF0dXJlUG9zaXRpb25NYXAge1xuICAgICAgICBjb25zdCBpZHMgPSBuZXcgRmxvYXQ2NEFycmF5KG1hcC5pZHMpO1xuICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBuZXcgVWludDMyQXJyYXkobWFwLnBvc2l0aW9ucyk7XG5cbiAgICAgICAgc29ydChpZHMsIHBvc2l0aW9ucywgMCwgaWRzLmxlbmd0aCAtIDEpO1xuXG4gICAgICAgIGlmICh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzLnB1c2goaWRzLmJ1ZmZlciwgcG9zaXRpb25zLmJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2lkcywgcG9zaXRpb25zfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVzZXJpYWxpemUob2JqOiBTZXJpYWxpemVkRmVhdHVyZVBvc2l0aW9uTWFwKTogRmVhdHVyZVBvc2l0aW9uTWFwIHtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IEZlYXR1cmVQb3NpdGlvbk1hcCgpO1xuICAgICAgICAvLyBhZnRlciB0cmFuc2ZlcnJpbmcsIHdlIG9ubHkgdXNlIHRoZXNlIGFycmF5cyBzdGF0aWNhbGx5IChubyBwdXNoZXMpLFxuICAgICAgICAvLyBzbyBUeXBlZEFycmF5IHZzIEFycmF5IGRpc3RpbmN0aW9uIHRoYXQgZmxvdyBwb2ludHMgb3V0IGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgIG1hcC5pZHMgPSAob2JqLmlkczogYW55KTtcbiAgICAgICAgbWFwLnBvc2l0aW9ucyA9IChvYmoucG9zaXRpb25zOiBhbnkpO1xuICAgICAgICBtYXAuaW5kZXhlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXROdW1lcmljSWQodmFsdWU6IG1peGVkKSB7XG4gICAgY29uc3QgbnVtVmFsdWUgPSArdmFsdWU7XG4gICAgaWYgKCFpc05hTihudW1WYWx1ZSkgJiYgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIgPD0gbnVtVmFsdWUgJiYgbnVtVmFsdWUgPD0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIG51bVZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gbXVybXVyMyhTdHJpbmcodmFsdWUpKTtcbn1cblxuLy8gY3VzdG9tIHF1aWNrc29ydCB0aGF0IHNvcnRzIGlkcywgaW5kaWNlcyBhbmQgb2Zmc2V0cyB0b2dldGhlciAoYnkgaWRzKVxuLy8gdXNlcyBIb2FyZSBwYXJ0aXRpb25pbmcgJiBtYW51YWwgdGFpbCBjYWxsIG9wdGltaXphdGlvbiB0byBhdm9pZCB3b3JzdCBjYXNlIHNjZW5hcmlvc1xuZnVuY3Rpb24gc29ydChpZHMsIHBvc2l0aW9ucywgbGVmdCwgcmlnaHQpIHtcbiAgICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHBpdm90ID0gaWRzWyhsZWZ0ICsgcmlnaHQpID4+IDFdO1xuICAgICAgICBsZXQgaSA9IGxlZnQgLSAxO1xuICAgICAgICBsZXQgaiA9IHJpZ2h0ICsgMTtcblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgZG8gaSsrOyB3aGlsZSAoaWRzW2ldIDwgcGl2b3QpO1xuICAgICAgICAgICAgZG8gai0tOyB3aGlsZSAoaWRzW2pdID4gcGl2b3QpO1xuICAgICAgICAgICAgaWYgKGkgPj0gaikgYnJlYWs7XG4gICAgICAgICAgICBzd2FwKGlkcywgaSwgaik7XG4gICAgICAgICAgICBzd2FwKHBvc2l0aW9ucywgMyAqIGksIDMgKiBqKTtcbiAgICAgICAgICAgIHN3YXAocG9zaXRpb25zLCAzICogaSArIDEsIDMgKiBqICsgMSk7XG4gICAgICAgICAgICBzd2FwKHBvc2l0aW9ucywgMyAqIGkgKyAyLCAzICogaiArIDIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGogLSBsZWZ0IDwgcmlnaHQgLSBqKSB7XG4gICAgICAgICAgICBzb3J0KGlkcywgcG9zaXRpb25zLCBsZWZ0LCBqKTtcbiAgICAgICAgICAgIGxlZnQgPSBqICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvcnQoaWRzLCBwb3NpdGlvbnMsIGogKyAxLCByaWdodCk7XG4gICAgICAgICAgICByaWdodCA9IGo7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN3YXAoYXJyLCBpLCBqKSB7XG4gICAgY29uc3QgdG1wID0gYXJyW2ldO1xuICAgIGFycltpXSA9IGFycltqXTtcbiAgICBhcnJbal0gPSB0bXA7XG59XG5cbnJlZ2lzdGVyKEZlYXR1cmVQb3NpdGlvbk1hcCwgJ0ZlYXR1cmVQb3NpdGlvbk1hcCcpO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5cbmV4cG9ydCB0eXBlIFVuaWZvcm1WYWx1ZXM8VXM6IE9iamVjdD5cbiAgICA9ICRFeGFjdDwkT2JqTWFwPFVzLCA8Vj4odTogVW5pZm9ybTxWPikgPT4gVj4+O1xuZXhwb3J0IHR5cGUgVW5pZm9ybUxvY2F0aW9ucyA9IHtbXzogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb259O1xuXG5jbGFzcyBVbmlmb3JtPFQ+IHtcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0O1xuICAgIGxvY2F0aW9uOiA/V2ViR0xVbmlmb3JtTG9jYXRpb247XG4gICAgY3VycmVudDogVDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICB0aGlzLmdsID0gY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgIH1cblxuICAgICtzZXQ6ICh2OiBUKSA9PiB2b2lkO1xufVxuXG5jbGFzcyBVbmlmb3JtMWkgZXh0ZW5kcyBVbmlmb3JtPG51bWJlcj4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IDA7XG4gICAgfVxuXG4gICAgc2V0KHY6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSB2KSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWkodGhpcy5sb2NhdGlvbiwgdik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVuaWZvcm0xZiBleHRlbmRzIFVuaWZvcm08bnVtYmVyPiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gMDtcbiAgICB9XG5cbiAgICBzZXQodjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQgIT09IHYpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xZih0aGlzLmxvY2F0aW9uLCB2KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVW5pZm9ybTJmIGV4dGVuZHMgVW5pZm9ybTxbbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gWzAsIDBdO1xuICAgIH1cblxuICAgIHNldCh2OiBbbnVtYmVyLCBudW1iZXJdKTogdm9pZCB7XG4gICAgICAgIGlmICh2WzBdICE9PSB0aGlzLmN1cnJlbnRbMF0gfHwgdlsxXSAhPT0gdGhpcy5jdXJyZW50WzFdKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMmYodGhpcy5sb2NhdGlvbiwgdlswXSwgdlsxXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVuaWZvcm0zZiBleHRlbmRzIFVuaWZvcm08W251bWJlciwgbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGNvbnRleHQsIGxvY2F0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gWzAsIDAsIDBdO1xuICAgIH1cblxuICAgIHNldCh2OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZbMF0gIT09IHRoaXMuY3VycmVudFswXSB8fCB2WzFdICE9PSB0aGlzLmN1cnJlbnRbMV0gfHwgdlsyXSAhPT0gdGhpcy5jdXJyZW50WzJdKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtM2YodGhpcy5sb2NhdGlvbiwgdlswXSwgdlsxXSwgdlsyXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVuaWZvcm00ZiBleHRlbmRzIFVuaWZvcm08W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBbMCwgMCwgMCwgMF07XG4gICAgfVxuXG4gICAgc2V0KHY6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdKTogdm9pZCB7XG4gICAgICAgIGlmICh2WzBdICE9PSB0aGlzLmN1cnJlbnRbMF0gfHwgdlsxXSAhPT0gdGhpcy5jdXJyZW50WzFdIHx8XG4gICAgICAgICAgICB2WzJdICE9PSB0aGlzLmN1cnJlbnRbMl0gfHwgdlszXSAhPT0gdGhpcy5jdXJyZW50WzNdKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtNGYodGhpcy5sb2NhdGlvbiwgdlswXSwgdlsxXSwgdlsyXSwgdlszXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFVuaWZvcm1Db2xvciBleHRlbmRzIFVuaWZvcm08Q29sb3I+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBDb2xvci50cmFuc3BhcmVudDtcbiAgICB9XG5cbiAgICBzZXQodjogQ29sb3IpOiB2b2lkIHtcbiAgICAgICAgaWYgKHYuciAhPT0gdGhpcy5jdXJyZW50LnIgfHwgdi5nICE9PSB0aGlzLmN1cnJlbnQuZyB8fFxuICAgICAgICAgICAgdi5iICE9PSB0aGlzLmN1cnJlbnQuYiB8fCB2LmEgIT09IHRoaXMuY3VycmVudC5hKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtNGYodGhpcy5sb2NhdGlvbiwgdi5yLCB2LmcsIHYuYiwgdi5hKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgZW1wdHlNYXQ0ID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG5jbGFzcyBVbmlmb3JtTWF0cml4NGYgZXh0ZW5kcyBVbmlmb3JtPEZsb2F0MzJBcnJheT4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IGVtcHR5TWF0NDtcbiAgICB9XG5cbiAgICBzZXQodjogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgICAgIC8vIFRoZSB2YXN0IG1ham9yaXR5IG9mIG1hdHJpeCBjb21wYXJpc29ucyB0aGF0IHdpbGwgdHJpcCB0aGlzIHNldFxuICAgICAgICAvLyBoYXBwZW4gYXQgaT0xMiBvciBpPTAsIHNvIHdlIGNoZWNrIHRob3NlIGZpcnN0IHRvIGF2b2lkIGxvdHMgb2ZcbiAgICAgICAgLy8gdW5uZWNlc3NhcnkgaXRlcmF0aW9uOlxuICAgICAgICBpZiAodlsxMl0gIT09IHRoaXMuY3VycmVudFsxMl0gfHwgdlswXSAhPT0gdGhpcy5jdXJyZW50WzBdKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4NGZ2KHRoaXMubG9jYXRpb24sIGZhbHNlLCB2KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgICAgIGlmICh2W2ldICE9PSB0aGlzLmN1cnJlbnRbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdih0aGlzLmxvY2F0aW9uLCBmYWxzZSwgdik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IGVtcHR5TWF0MyA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG5jbGFzcyBVbmlmb3JtTWF0cml4M2YgZXh0ZW5kcyBVbmlmb3JtPEZsb2F0MzJBcnJheT4ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICBzdXBlcihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IGVtcHR5TWF0MztcbiAgICB9XG5cbiAgICBzZXQodjogRmxvYXQzMkFycmF5KTogdm9pZCB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgOTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodltpXSAhPT0gdGhpcy5jdXJyZW50W2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5sb2NhdGlvbiwgZmFsc2UsIHYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBlbXB0eU1hdDIgPSBuZXcgRmxvYXQzMkFycmF5KDQpO1xuY2xhc3MgVW5pZm9ybU1hdHJpeDJmIGV4dGVuZHMgVW5pZm9ybTxGbG9hdDMyQXJyYXk+IHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24pIHtcbiAgICAgICAgc3VwZXIoY29udGV4dCwgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSBlbXB0eU1hdDI7XG4gICAgfVxuXG4gICAgc2V0KHY6IEZsb2F0MzJBcnJheSk6IHZvaWQge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZbaV0gIT09IHRoaXMuY3VycmVudFtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtTWF0cml4MmZ2KHRoaXMubG9jYXRpb24sIGZhbHNlLCB2KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHtcbiAgICBVbmlmb3JtLFxuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtNGYsXG4gICAgVW5pZm9ybUNvbG9yLFxuICAgIFVuaWZvcm1NYXRyaXgyZixcbiAgICBVbmlmb3JtTWF0cml4M2YsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59O1xuXG5leHBvcnQgdHlwZSBVbmlmb3JtQmluZGluZ3MgPSB7W186IHN0cmluZ106IFVuaWZvcm08YW55Pn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3BhY2tVaW50OFRvRmxvYXR9IGZyb20gJy4uL3NoYWRlcnMvZW5jb2RlX2F0dHJpYnV0ZS5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcbmltcG9ydCB7c3VwcG9ydHNQcm9wZXJ0eUV4cHJlc3Npb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5pbXBvcnQge1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZX0gZnJvbSAnLi4vc3R5bGUvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge1N0cnVjdEFycmF5TGF5b3V0MWY0LCBTdHJ1Y3RBcnJheUxheW91dDJmOCwgU3RydWN0QXJyYXlMYXlvdXQ0ZjE2LCBQYXR0ZXJuTGF5b3V0QXJyYXksIERhc2hMYXlvdXRBcnJheX0gZnJvbSAnLi9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQge2NsYW1wfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHBhdHRlcm5BdHRyaWJ1dGVzIGZyb20gJy4vYnVja2V0L3BhdHRlcm5fYXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgZGFzaEF0dHJpYnV0ZXMgZnJvbSAnLi9idWNrZXQvZGFzaF9hdHRyaWJ1dGVzLmpzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IEZlYXR1cmVQb3NpdGlvbk1hcCBmcm9tICcuL2ZlYXR1cmVfcG9zaXRpb25fbWFwLmpzJztcbmltcG9ydCB7XG4gICAgVW5pZm9ybSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybUNvbG9yLFxuICAgIFVuaWZvcm00ZixcbiAgICB0eXBlIFVuaWZvcm1Mb2NhdGlvbnNcbn0gZnJvbSAnLi4vcmVuZGVyL3VuaWZvcm1fYmluZGluZy5qcyc7XG5cbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VHlwZWRTdHlsZUxheWVyfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci90eXBlZF9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NmYWRlUGFyYW1ldGVyc30gZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCB0eXBlIHtTdHJ1Y3RBcnJheSwgU3RydWN0QXJyYXlNZW1iZXJ9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHtTcHJpdGVQb3NpdGlvbiwgU3ByaXRlUG9zaXRpb25zfSBmcm9tICcuLi91dGlsL2ltYWdlLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgICBGZWF0dXJlLFxuICAgIEZlYXR1cmVTdGF0ZSxcbiAgICBHbG9iYWxQcm9wZXJ0aWVzLFxuICAgIFNvdXJjZUV4cHJlc3Npb24sXG4gICAgQ29tcG9zaXRlRXhwcmVzc2lvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge1Bvc3NpYmx5RXZhbHVhdGVkfSBmcm9tICcuLi9zdHlsZS9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX3N0YXRlLmpzJztcbmltcG9ydCB0eXBlIHtGb3JtYXR0ZWRTZWN0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuZXhwb3J0IHR5cGUgQmluZGVyVW5pZm9ybSA9IHtcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICBiaW5kaW5nOiBVbmlmb3JtPGFueT5cbn07XG5cbmZ1bmN0aW9uIHBhY2tDb2xvcihjb2xvcjogQ29sb3IpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBwYWNrVWludDhUb0Zsb2F0KDI1NSAqIGNvbG9yLnIsIDI1NSAqIGNvbG9yLmcpLFxuICAgICAgICBwYWNrVWludDhUb0Zsb2F0KDI1NSAqIGNvbG9yLmIsIDI1NSAqIGNvbG9yLmEpXG4gICAgXTtcbn1cblxuLyoqXG4gKiAgYEJpbmRlcmAgaXMgdGhlIGludGVyZmFjZSBkZWZpbml0aW9uIGZvciB0aGUgc3RyYXRlZ2llcyBmb3IgY29uc3RydWN0aW5nLFxuICogIHVwbG9hZGluZywgYW5kIGJpbmRpbmcgcGFpbnQgcHJvcGVydHkgZGF0YSBhcyBHTFNMIGF0dHJpYnV0ZXMuIE1vc3Qgc3R5bGUtXG4gKiAgc3BlYyBwcm9wZXJ0aWVzIGhhdmUgYSAxOjEgcmVsYXRpb25zaGlwIHRvIHNoYWRlciBhdHRyaWJ1dGUvdW5pZm9ybXMsIGJ1dFxuICogIHNvbWUgcmVxdWlyZSBtdWx0aXBsZSB2YWx1ZXMgcGVyIGZlYXR1cmUgdG8gYmUgcGFzc2VkIHRvIHRoZSBHUFUsIGFuZCBpblxuICogIHRob3NlIGNhc2VzIHdlIGJpbmQgbXVsdGlwbGUgYXR0cmlidXRlcy91bmlmb3Jtcy5cbiAqXG4gKiAgSXQgaGFzIHRocmVlIGltcGxlbWVudGF0aW9ucywgb25lIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBzdHJhdGVnaWVzIHdlIHVzZTpcbiAqXG4gKiAgKiBGb3IgX2NvbnN0YW50XyBwcm9wZXJ0aWVzIC0tIHRob3NlIHdob3NlIHZhbHVlIGlzIGEgY29uc3RhbnQsIG9yIHRoZSBjb25zdGFudFxuICogICAgcmVzdWx0IG9mIGV2YWx1YXRpbmcgYSBjYW1lcmEgZXhwcmVzc2lvbiBhdCBhIHBhcnRpY3VsYXIgY2FtZXJhIHBvc2l0aW9uIC0tIHdlXG4gKiAgICBkb24ndCBuZWVkIGEgdmVydGV4IGF0dHJpYnV0ZSBidWZmZXIsIGFuZCBpbnN0ZWFkIHVzZSBhIHVuaWZvcm0uXG4gKiAgKiBGb3IgZGF0YSBleHByZXNzaW9ucywgd2UgdXNlIGEgdmVydGV4IGJ1ZmZlciB3aXRoIGEgc2luZ2xlIGF0dHJpYnV0ZSB2YWx1ZSxcbiAqICAgIHRoZSBldmFsdWF0ZWQgcmVzdWx0IG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBmZWF0dXJlLlxuICogICogRm9yIGNvbXBvc2l0ZSBleHByZXNzaW9ucywgd2UgdXNlIGEgdmVydGV4IGJ1ZmZlciB3aXRoIHR3byBhdHRyaWJ1dGVzOiBtaW4gYW5kXG4gKiAgICBtYXggdmFsdWVzIGNvdmVyaW5nIHRoZSByYW5nZSBvZiB6b29tcyBhdCB3aGljaCB3ZSBleHBlY3QgdGhlIHRpbGUgdG8gYmVcbiAqICAgIGRpc3BsYXllZC4gVGhlc2UgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIGJ5IGV2YWx1YXRpbmcgdGhlIGNvbXBvc2l0ZSBleHByZXNzaW9uIGZvclxuICogICAgdGhlIGdpdmVuIGZlYXR1cmUgYXQgc3RyYXRlZ2ljYWxseSBjaG9zZW4gem9vbSBsZXZlbHMuIEluIGFkZGl0aW9uIHRvIHRoaXNcbiAqICAgIGF0dHJpYnV0ZSBkYXRhLCB3ZSBhbHNvIHVzZSBhIHVuaWZvcm0gdmFsdWUgd2hpY2ggdGhlIHNoYWRlciB1c2VzIHRvIGludGVycG9sYXRlXG4gKiAgICBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCB2YWx1ZSBhdCB0aGUgZmluYWwgZGlzcGxheWVkIHpvb20gbGV2ZWwuIFRoZSB1c2Ugb2YgYVxuICogICAgdW5pZm9ybSBhbGxvd3MgdXMgdG8gY2hlYXBseSB1cGRhdGUgdGhlIHZhbHVlIG9uIGV2ZXJ5IGZyYW1lLlxuICpcbiAqICBOb3RlIHRoYXQgdGhlIHNoYWRlciBzb3VyY2UgdmFyaWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlJ3JlIHVzaW5nIGEgdW5pZm9ybSBvclxuICogIGF0dHJpYnV0ZS4gV2UgZHluYW1pY2FsbHkgY29tcGlsZSBzaGFkZXJzIGF0IHJ1bnRpbWUgdG8gYWNjb21tb2RhdGUgdGhpcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmludGVyZmFjZSBBdHRyaWJ1dGVCaW5kZXIge1xuICAgIHBvcHVsYXRlUGFpbnRBcnJheShsZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgaW1hZ2VQb3NpdGlvbnM6IFNwcml0ZVBvc2l0aW9ucywgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKTogdm9pZDtcbiAgICB1cGRhdGVQYWludEFycmF5KHN0YXJ0OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyLCBmZWF0dXJlOiBGZWF0dXJlLCBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBpbWFnZVBvc2l0aW9uczogU3ByaXRlUG9zaXRpb25zKTogdm9pZDtcbiAgICB1cGxvYWQoQ29udGV4dCk6IHZvaWQ7XG4gICAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgVW5pZm9ybUJpbmRlciB7XG4gICAgdW5pZm9ybU5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHNldFVuaWZvcm0odW5pZm9ybTogVW5pZm9ybTwqPiwgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgY3VycmVudFZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8Kj4sIHVuaWZvcm1OYW1lOiBzdHJpbmcpOiB2b2lkO1xuICAgIGdldEJpbmRpbmcoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uLCBuYW1lOiBzdHJpbmcpOiAkU2hhcGU8VW5pZm9ybTwqPj47XG59XG5cbmNsYXNzIENvbnN0YW50QmluZGVyIGltcGxlbWVudHMgVW5pZm9ybUJpbmRlciB7XG4gICAgdmFsdWU6IG1peGVkO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICB1bmlmb3JtTmFtZXM6IEFycmF5PHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogbWl4ZWQsIG5hbWVzOiBBcnJheTxzdHJpbmc+LCB0eXBlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVuaWZvcm1OYW1lcyA9IG5hbWVzLm1hcChuYW1lID0+IGB1XyR7bmFtZX1gKTtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG5cbiAgICBzZXRVbmlmb3JtKHVuaWZvcm06IFVuaWZvcm08Kj4sIGdsb2JhbHM6IEdsb2JhbFByb3BlcnRpZXMsIGN1cnJlbnRWYWx1ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG1peGVkPik6IHZvaWQge1xuICAgICAgICB1bmlmb3JtLnNldChjdXJyZW50VmFsdWUuY29uc3RhbnRPcih0aGlzLnZhbHVlKSk7XG4gICAgfVxuXG4gICAgZ2V0QmluZGluZyhjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb24sIF86IHN0cmluZyk6ICRTaGFwZTxVbmlmb3JtPGFueT4+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUgPT09ICdjb2xvcicpID9cbiAgICAgICAgICAgIG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb24pIDpcbiAgICAgICAgICAgIG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb24pO1xuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyIGltcGxlbWVudHMgVW5pZm9ybUJpbmRlciB7XG4gICAgdW5pZm9ybU5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHBhdHRlcm5Gcm9tOiA/QXJyYXk8bnVtYmVyPjtcbiAgICBwYXR0ZXJuVG86ID9BcnJheTxudW1iZXI+O1xuICAgIHBpeGVsUmF0aW9Gcm9tOiBudW1iZXI7XG4gICAgcGl4ZWxSYXRpb1RvOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogbWl4ZWQsIG5hbWVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMudW5pZm9ybU5hbWVzID0gbmFtZXMubWFwKG5hbWUgPT4gYHVfJHtuYW1lfWApO1xuICAgICAgICB0aGlzLnBhdHRlcm5Gcm9tID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYXR0ZXJuVG8gPSBudWxsO1xuICAgICAgICB0aGlzLnBpeGVsUmF0aW9Gcm9tID0gMTtcbiAgICAgICAgdGhpcy5waXhlbFJhdGlvVG8gPSAxO1xuICAgIH1cblxuICAgIHNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbzogU3ByaXRlUG9zaXRpb24sIHBvc0Zyb206IFNwcml0ZVBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpb0Zyb20gPSBwb3NGcm9tLnBpeGVsUmF0aW8gfHwgMTtcbiAgICAgICAgdGhpcy5waXhlbFJhdGlvVG8gPSBwb3NUby5waXhlbFJhdGlvIHx8IDE7XG4gICAgICAgIHRoaXMucGF0dGVybkZyb20gPSBwb3NGcm9tLnRsLmNvbmNhdChwb3NGcm9tLmJyKTtcbiAgICAgICAgdGhpcy5wYXR0ZXJuVG8gPSBwb3NUby50bC5jb25jYXQocG9zVG8uYnIpO1xuICAgIH1cblxuICAgIHNldFVuaWZvcm0odW5pZm9ybTogVW5pZm9ybTwqPiwgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcywgY3VycmVudFZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bWl4ZWQ+LCB1bmlmb3JtTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9XG4gICAgICAgICAgICB1bmlmb3JtTmFtZSA9PT0gJ3VfcGF0dGVybl90bycgfHwgdW5pZm9ybU5hbWUgPT09ICd1X2Rhc2hfdG8nID8gdGhpcy5wYXR0ZXJuVG8gOlxuICAgICAgICAgICAgdW5pZm9ybU5hbWUgPT09ICd1X3BhdHRlcm5fZnJvbScgfHwgdW5pZm9ybU5hbWUgPT09ICd1X2Rhc2hfZnJvbScgPyB0aGlzLnBhdHRlcm5Gcm9tIDpcbiAgICAgICAgICAgIHVuaWZvcm1OYW1lID09PSAndV9waXhlbF9yYXRpb190bycgPyB0aGlzLnBpeGVsUmF0aW9UbyA6XG4gICAgICAgICAgICB1bmlmb3JtTmFtZSA9PT0gJ3VfcGl4ZWxfcmF0aW9fZnJvbScgPyB0aGlzLnBpeGVsUmF0aW9Gcm9tIDogbnVsbDtcbiAgICAgICAgaWYgKHBvcykgdW5pZm9ybS5zZXQocG9zKTtcbiAgICB9XG5cbiAgICBnZXRCaW5kaW5nKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiwgbmFtZTogc3RyaW5nKTogJFNoYXBlPFVuaWZvcm08YW55Pj4ge1xuICAgICAgICByZXR1cm4gbmFtZSA9PT0gJ3VfcGF0dGVybl9mcm9tJyB8fCBuYW1lID09PSAndV9wYXR0ZXJuX3RvJyB8fCBuYW1lID09PSAndV9kYXNoX2Zyb20nIHx8IG5hbWUgPT09ICd1X2Rhc2hfdG8nID9cbiAgICAgICAgICAgIG5ldyBVbmlmb3JtNGYoY29udGV4dCwgbG9jYXRpb24pIDpcbiAgICAgICAgICAgIG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb24pO1xuICAgIH1cbn1cblxuY2xhc3MgU291cmNlRXhwcmVzc2lvbkJpbmRlciBpbXBsZW1lbnRzIEF0dHJpYnV0ZUJpbmRlciB7XG4gICAgZXhwcmVzc2lvbjogU291cmNlRXhwcmVzc2lvbjtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgbWF4VmFsdWU6IG51bWJlcjtcblxuICAgIHBhaW50VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5O1xuICAgIHBhaW50VmVydGV4QXR0cmlidXRlczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuICAgIHBhaW50VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogU291cmNlRXhwcmVzc2lvbiwgbmFtZXM6IEFycmF5PHN0cmluZz4sIHR5cGU6IHN0cmluZywgUGFpbnRWZXJ0ZXhBcnJheTogQ2xhc3M8U3RydWN0QXJyYXk+KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMubWF4VmFsdWUgPSAwO1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGBhXyR7bmFtZX1gLFxuICAgICAgICAgICAgdHlwZTogJ0Zsb2F0MzInLFxuICAgICAgICAgICAgY29tcG9uZW50czogdHlwZSA9PT0gJ2NvbG9yJyA/IDIgOiAxLFxuICAgICAgICAgICAgb2Zmc2V0OiAwXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5wYWludFZlcnRleEFycmF5ID0gbmV3IFBhaW50VmVydGV4QXJyYXkoKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkobmV3TGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGltYWdlUG9zaXRpb25zOiBTcHJpdGVQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgY2Fub25pY2FsPzogQ2Fub25pY2FsVGlsZUlELCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgICAgIGFzc2VydChBcnJheS5pc0FycmF5KGF2YWlsYWJsZUltYWdlcykpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoMCksIGZlYXR1cmUsIHt9LCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcywgZm9ybWF0dGVkU2VjdGlvbik7XG4gICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5yZXNpemUobmV3TGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fc2V0UGFpbnRWYWx1ZShzdGFydCwgbmV3TGVuZ3RoLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFpbnRBcnJheShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZSh7em9vbTogMH0sIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgdW5kZWZpbmVkLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICB0aGlzLl9zZXRQYWludFZhbHVlKHN0YXJ0LCBlbmQsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBfc2V0UGFpbnRWYWx1ZShzdGFydCwgZW5kLCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xvciA9IHBhY2tDb2xvcih2YWx1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5lbXBsYWNlKGksIGNvbG9yWzBdLCBjb2xvclsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5lbXBsYWNlKGksIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBNYXRoLm1heCh0aGlzLm1heFZhbHVlLCBNYXRoLmFicyh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSAmJiB0aGlzLnBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhaW50VmVydGV4QnVmZmVyICYmIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMucGFpbnRWZXJ0ZXhBcnJheSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnBhaW50VmVydGV4QXJyYXksIHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzLCB0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5wYWludFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIENvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXIgaW1wbGVtZW50cyBBdHRyaWJ1dGVCaW5kZXIsIFVuaWZvcm1CaW5kZXIge1xuICAgIGV4cHJlc3Npb246IENvbXBvc2l0ZUV4cHJlc3Npb247XG4gICAgdW5pZm9ybU5hbWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHR5cGU6IHN0cmluZztcbiAgICB1c2VJbnRlZ2VyWm9vbTogYm9vbGVhbjtcbiAgICB6b29tOiBudW1iZXI7XG4gICAgbWF4VmFsdWU6IG51bWJlcjtcblxuICAgIHBhaW50VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5O1xuICAgIHBhaW50VmVydGV4QXR0cmlidXRlczogQXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+O1xuICAgIHBhaW50VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuXG4gICAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogQ29tcG9zaXRlRXhwcmVzc2lvbiwgbmFtZXM6IEFycmF5PHN0cmluZz4sIHR5cGU6IHN0cmluZywgdXNlSW50ZWdlclpvb206IGJvb2xlYW4sIHpvb206IG51bWJlciwgUGFpbnRWZXJ0ZXhBcnJheTogQ2xhc3M8U3RydWN0QXJyYXk+KSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMudW5pZm9ybU5hbWVzID0gbmFtZXMubWFwKG5hbWUgPT4gYHVfJHtuYW1lfV90YCk7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudXNlSW50ZWdlclpvb20gPSB1c2VJbnRlZ2VyWm9vbTtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IDA7XG4gICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzID0gbmFtZXMubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICAgICAgbmFtZTogYGFfJHtuYW1lfWAsXG4gICAgICAgICAgICB0eXBlOiAnRmxvYXQzMicsXG4gICAgICAgICAgICBjb21wb25lbnRzOiB0eXBlID09PSAnY29sb3InID8gNCA6IDIsXG4gICAgICAgICAgICBvZmZzZXQ6IDBcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkgPSBuZXcgUGFpbnRWZXJ0ZXhBcnJheSgpO1xuICAgIH1cblxuICAgIHBvcHVsYXRlUGFpbnRBcnJheShuZXdMZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgaW1hZ2VQb3NpdGlvbnM6IFNwcml0ZVBvc2l0aW9ucywgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKSwgZmVhdHVyZSwge30sIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aGlzLnpvb20gKyAxKSwgZmVhdHVyZSwge30sIGNhbm9uaWNhbCwgYXZhaWxhYmxlSW1hZ2VzLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBhaW50VmVydGV4QXJyYXkubGVuZ3RoO1xuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkucmVzaXplKG5ld0xlbmd0aCk7XG4gICAgICAgIHRoaXMuX3NldFBhaW50VmFsdWUoc3RhcnQsIG5ld0xlbmd0aCwgbWluLCBtYXgpO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhaW50QXJyYXkoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiB0aGlzLnpvb219LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIHVuZGVmaW5lZCwgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5leHByZXNzaW9uLmV2YWx1YXRlKHt6b29tOiB0aGlzLnpvb20gKyAxfSwgZmVhdHVyZSwgZmVhdHVyZVN0YXRlLCB1bmRlZmluZWQsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIHRoaXMuX3NldFBhaW50VmFsdWUoc3RhcnQsIGVuZCwgbWluLCBtYXgpO1xuICAgIH1cblxuICAgIF9zZXRQYWludFZhbHVlKHN0YXJ0LCBlbmQsIG1pbiwgbWF4KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbkNvbG9yID0gcGFja0NvbG9yKG1pbik7XG4gICAgICAgICAgICBjb25zdCBtYXhDb2xvciA9IHBhY2tDb2xvcihtYXgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QXJyYXkuZW1wbGFjZShpLCBtaW5Db2xvclswXSwgbWluQ29sb3JbMV0sIG1heENvbG9yWzBdLCBtYXhDb2xvclsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhBcnJheS5lbXBsYWNlKGksIG1pbiwgbWF4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBNYXRoLm1heCh0aGlzLm1heFZhbHVlLCBNYXRoLmFicyhtaW4pLCBNYXRoLmFicyhtYXgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLnBhaW50VmVydGV4QXJyYXkgJiYgdGhpcy5wYWludFZlcnRleEFycmF5LmFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYWludFZlcnRleEJ1ZmZlciAmJiB0aGlzLnBhaW50VmVydGV4QnVmZmVyLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLnBhaW50VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5wYWludFZlcnRleEFycmF5LCB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcywgdGhpcy5leHByZXNzaW9uLmlzU3RhdGVEZXBlbmRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMucGFpbnRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VW5pZm9ybSh1bmlmb3JtOiBVbmlmb3JtPCo+LCBnbG9iYWxzOiBHbG9iYWxQcm9wZXJ0aWVzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRab29tID0gdGhpcy51c2VJbnRlZ2VyWm9vbSA/IE1hdGguZmxvb3IoZ2xvYmFscy56b29tKSA6IGdsb2JhbHMuem9vbTtcbiAgICAgICAgY29uc3QgZmFjdG9yID0gY2xhbXAodGhpcy5leHByZXNzaW9uLmludGVycG9sYXRpb25GYWN0b3IoY3VycmVudFpvb20sIHRoaXMuem9vbSwgdGhpcy56b29tICsgMSksIDAsIDEpO1xuICAgICAgICB1bmlmb3JtLnNldChmYWN0b3IpO1xuICAgIH1cblxuICAgIGdldEJpbmRpbmcoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uLCBfOiBzdHJpbmcpOiBVbmlmb3JtMWYge1xuICAgICAgICByZXR1cm4gbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbik7XG4gICAgfVxufVxuXG5jbGFzcyBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyIGltcGxlbWVudHMgQXR0cmlidXRlQmluZGVyIHtcbiAgICBleHByZXNzaW9uOiBDb21wb3NpdGVFeHByZXNzaW9uO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICB1c2VJbnRlZ2VyWm9vbTogYm9vbGVhbjtcbiAgICB6b29tOiBudW1iZXI7XG4gICAgbGF5ZXJJZDogc3RyaW5nO1xuXG4gICAgem9vbUluUGFpbnRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXk7XG4gICAgem9vbU91dFBhaW50VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5O1xuICAgIHpvb21JblBhaW50VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuICAgIHpvb21PdXRQYWludFZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBwYWludFZlcnRleEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IENvbXBvc2l0ZUV4cHJlc3Npb24sIG5hbWVzOiBBcnJheTxzdHJpbmc+LCB0eXBlOiBzdHJpbmcsIHVzZUludGVnZXJab29tOiBib29sZWFuLCB6b29tOiBudW1iZXIsIFBhaW50VmVydGV4QXJyYXk6IENsYXNzPFN0cnVjdEFycmF5PiwgbGF5ZXJJZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMudXNlSW50ZWdlclpvb20gPSB1c2VJbnRlZ2VyWm9vbTtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICAgICAgdGhpcy5sYXllcklkID0gbGF5ZXJJZDtcblxuICAgICAgICB0aGlzLnBhaW50VmVydGV4QXR0cmlidXRlcyA9ICh0eXBlID09PSAnYXJyYXknID8gZGFzaEF0dHJpYnV0ZXMgOiBwYXR0ZXJuQXR0cmlidXRlcykubWVtYmVycztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgYXNzZXJ0KGBhXyR7bmFtZXNbaV19YCA9PT0gdGhpcy5wYWludFZlcnRleEF0dHJpYnV0ZXNbaV0ubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkgPSBuZXcgUGFpbnRWZXJ0ZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5ID0gbmV3IFBhaW50VmVydGV4QXJyYXkoKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkobGVuZ3RoOiBudW1iZXIsIGZlYXR1cmU6IEZlYXR1cmUsIGltYWdlUG9zaXRpb25zOiBTcHJpdGVQb3NpdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkubGVuZ3RoO1xuICAgICAgICB0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXkucmVzaXplKGxlbmd0aCk7XG4gICAgICAgIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkucmVzaXplKGxlbmd0aCk7XG4gICAgICAgIHRoaXMuX3NldFBhaW50VmFsdWVzKHN0YXJ0LCBsZW5ndGgsIGZlYXR1cmUucGF0dGVybnMgJiYgZmVhdHVyZS5wYXR0ZXJuc1t0aGlzLmxheWVySWRdLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFpbnRBcnJheShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgaW1hZ2VQb3NpdGlvbnM6IFNwcml0ZVBvc2l0aW9ucykge1xuICAgICAgICB0aGlzLl9zZXRQYWludFZhbHVlcyhzdGFydCwgZW5kLCBmZWF0dXJlLnBhdHRlcm5zICYmIGZlYXR1cmUucGF0dGVybnNbdGhpcy5sYXllcklkXSwgaW1hZ2VQb3NpdGlvbnMpO1xuICAgIH1cblxuICAgIF9zZXRQYWludFZhbHVlcyhzdGFydCwgZW5kLCBwYXR0ZXJucywgcG9zaXRpb25zKSB7XG4gICAgICAgIGlmICghcG9zaXRpb25zIHx8ICFwYXR0ZXJucykgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHttaW4sIG1pZCwgbWF4fSA9IHBhdHRlcm5zO1xuICAgICAgICBjb25zdCBpbWFnZU1pbiA9IHBvc2l0aW9uc1ttaW5dO1xuICAgICAgICBjb25zdCBpbWFnZU1pZCA9IHBvc2l0aW9uc1ttaWRdO1xuICAgICAgICBjb25zdCBpbWFnZU1heCA9IHBvc2l0aW9uc1ttYXhdO1xuICAgICAgICBpZiAoIWltYWdlTWluIHx8ICFpbWFnZU1pZCB8fCAhaW1hZ2VNYXgpIHJldHVybjtcblxuICAgICAgICAvLyBXZSBwb3B1bGF0ZSB0d28gcGFpbnQgYXJyYXlzIGJlY2F1c2UsIGZvciBjcm9zcy1mYWRlZCBwcm9wZXJ0aWVzLCB3ZSBkb24ndCBrbm93IHdoaWNoIGRpcmVjdGlvblxuICAgICAgICAvLyB3ZSdyZSBjcm9zcy1mYWRpbmcgdG8gYXQgbGF5b3V0IHRpbWUuIEluIG9yZGVyIHRvIGtlZXAgdmVydGV4IGF0dHJpYnV0ZXMgdG8gYSBtaW5pbXVtIGFuZCBub3QgcGFzc1xuICAgICAgICAvLyB1bm5lY2Vzc2FyeSB2ZXJ0ZXggZGF0YSB0byB0aGUgc2hhZGVycywgd2UgZGV0ZXJtaW5lIHdoaWNoIHRvIHVwbG9hZCBhdCBkcmF3IHRpbWUuXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRQYWludFZhbHVlKHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheSwgaSwgaW1hZ2VNaWQsIGltYWdlTWluKTtcbiAgICAgICAgICAgIHRoaXMuX3NldFBhaW50VmFsdWUodGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhBcnJheSwgaSwgaW1hZ2VNaWQsIGltYWdlTWF4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zZXRQYWludFZhbHVlKGFycmF5LCBpLCBwb3NBLCBwb3NCKSB7XG4gICAgICAgIGFycmF5LmVtcGxhY2UoaSxcbiAgICAgICAgICAgIHBvc0EudGxbMF0sIHBvc0EudGxbMV0sIHBvc0EuYnJbMF0sIHBvc0EuYnJbMV0sXG4gICAgICAgICAgICBwb3NCLnRsWzBdLCBwb3NCLnRsWzFdLCBwb3NCLmJyWzBdLCBwb3NCLmJyWzFdLFxuICAgICAgICAgICAgcG9zQS5waXhlbFJhdGlvLCBwb3NCLnBpeGVsUmF0aW9cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAodGhpcy56b29tSW5QYWludFZlcnRleEFycmF5ICYmIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhBcnJheS5hcnJheUJ1ZmZlciAmJiB0aGlzLnpvb21PdXRQYWludFZlcnRleEFycmF5ICYmIHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXkuYXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnpvb21JblBhaW50VmVydGV4QXJyYXksIHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzLCB0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCk7XG4gICAgICAgICAgICB0aGlzLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuem9vbU91dFBhaW50VmVydGV4QXJyYXksIHRoaXMucGFpbnRWZXJ0ZXhBdHRyaWJ1dGVzLCB0aGlzLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy56b29tT3V0UGFpbnRWZXJ0ZXhCdWZmZXIpIHRoaXMuem9vbU91dFBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhCdWZmZXIpIHRoaXMuem9vbUluUGFpbnRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm9ncmFtQ29uZmlndXJhdGlvbiBjb250YWlucyB0aGUgbG9naWMgZm9yIGJpbmRpbmcgc3R5bGUgbGF5ZXIgcHJvcGVydGllcyBhbmQgdGlsZVxuICogbGF5ZXIgZmVhdHVyZSBkYXRhIGludG8gR0wgcHJvZ3JhbSB1bmlmb3JtcyBhbmQgdmVydGV4IGF0dHJpYnV0ZXMuXG4gKlxuICogTm9uLWRhdGEtZHJpdmVuIHByb3BlcnR5IHZhbHVlcyBhcmUgYm91bmQgdG8gc2hhZGVyIHVuaWZvcm1zLiBEYXRhLWRyaXZlbiBwcm9wZXJ0eVxuICogdmFsdWVzIGFyZSBib3VuZCB0byB2ZXJ0ZXggYXR0cmlidXRlcy4gSW4gb3JkZXIgdG8gc3VwcG9ydCBhIHVuaWZvcm0gR0xTTCBzeW50YXggb3ZlclxuICogYm90aCwgW01hcGJveCBHTCBTaGFkZXJzXShodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1zaGFkZXJzKSBkZWZpbmVzIGEgYCNwcmFnbWFgXG4gKiBhYnN0cmFjdGlvbiwgd2hpY2ggUHJvZ3JhbUNvbmZpZ3VyYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGltcGxlbWVudGluZy4gQXQgcnVudGltZSxcbiAqIGl0IGV4YW1pbmVzIHRoZSBhdHRyaWJ1dGVzIG9mIGEgcGFydGljdWxhciBsYXllciwgY29tYmluZXMgdGhpcyB3aXRoIGZpeGVkIGtub3dsZWRnZVxuICogYWJvdXQgaG93IGxheWVycyBvZiB0aGUgcGFydGljdWxhciB0eXBlIGFyZSBpbXBsZW1lbnRlZCwgYW5kIGRldGVybWluZXMgd2hpY2ggdW5pZm9ybXNcbiAqIGFuZCB2ZXJ0ZXggYXR0cmlidXRlcyB3aWxsIGJlIHJlcXVpcmVkLiBJdCBjYW4gdGhlbiBzdWJzdGl0dXRlIHRoZSBhcHByb3ByaWF0ZSB0ZXh0XG4gKiBpbnRvIHRoZSBzaGFkZXIgc291cmNlIGNvZGUsIGNyZWF0ZSBhbmQgbGluayBhIHByb2dyYW0sIGFuZCBiaW5kIHRoZSB1bmlmb3JtcyBhbmRcbiAqIHZlcnRleCBhdHRyaWJ1dGVzIGluIHByZXBhcmF0aW9uIGZvciBkcmF3aW5nLlxuICpcbiAqIFdoZW4gYSB2ZWN0b3IgdGlsZSBpcyBwYXJzZWQsIHRoaXMgc2FtZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIHVzZWQgdG9cbiAqIHBvcHVsYXRlIHRoZSBhdHRyaWJ1dGUgYnVmZmVycyBuZWVkZWQgZm9yIGRhdGEtZHJpdmVuIHN0eWxpbmcgdXNpbmcgdGhlIHpvb21cbiAqIGxldmVsIGFuZCBmZWF0dXJlIHByb3BlcnR5IGRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZ3JhbUNvbmZpZ3VyYXRpb24ge1xuICAgIGJpbmRlcnM6IHtbXzogc3RyaW5nXTogKEF0dHJpYnV0ZUJpbmRlciB8IFVuaWZvcm1CaW5kZXIpIH07XG4gICAgY2FjaGVLZXk6IHN0cmluZztcblxuICAgIF9idWZmZXJzOiBBcnJheTxWZXJ0ZXhCdWZmZXI+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IFR5cGVkU3R5bGVMYXllciwgem9vbTogbnVtYmVyLCBmaWx0ZXJQcm9wZXJ0aWVzOiAoXzogc3RyaW5nKSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZSkge1xuICAgICAgICB0aGlzLmJpbmRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fYnVmZmVycyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGtleXMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGxheWVyLnBhaW50Ll92YWx1ZXMpIHtcbiAgICAgICAgICAgIGlmICghZmlsdGVyUHJvcGVydGllcyhwcm9wZXJ0eSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBsYXllci5wYWludC5nZXQocHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUpIHx8ICFzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbih2YWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBwYWludEF0dHJpYnV0ZU5hbWVzKHByb3BlcnR5LCBsYXllci50eXBlKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB2YWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLnR5cGU7XG4gICAgICAgICAgICBjb25zdCB1c2VJbnRlZ2VyWm9vbSA9IHZhbHVlLnByb3BlcnR5LnVzZUludGVnZXJab29tO1xuICAgICAgICAgICAgY29uc3QgcHJvcFR5cGUgPSB2YWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uWydwcm9wZXJ0eS10eXBlJ107XG4gICAgICAgICAgICBjb25zdCBpc0Nyb3NzRmFkZWQgPSBwcm9wVHlwZSA9PT0gJ2Nyb3NzLWZhZGVkJyB8fCBwcm9wVHlwZSA9PT0gJ2Nyb3NzLWZhZGVkLWRhdGEtZHJpdmVuJztcblxuICAgICAgICAgICAgY29uc3Qgc291cmNlRXhjZXB0aW9uID0gU3RyaW5nKHByb3BlcnR5KSA9PT0gJ2xpbmUtZGFzaGFycmF5JyAmJiAobGF5ZXIubGF5b3V0OiBhbnkpLmdldCgnbGluZS1jYXAnKS52YWx1ZS5raW5kICE9PSAnY29uc3RhbnQnO1xuXG4gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09PSAnY29uc3RhbnQnICYmICFzb3VyY2VFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRlcnNbcHJvcGVydHldID0gaXNDcm9zc0ZhZGVkID9cbiAgICAgICAgICAgICAgICAgICAgbmV3IENyb3NzRmFkZWRDb25zdGFudEJpbmRlcihleHByZXNzaW9uLnZhbHVlLCBuYW1lcykgOlxuICAgICAgICAgICAgICAgICAgICBuZXcgQ29uc3RhbnRCaW5kZXIoZXhwcmVzc2lvbi52YWx1ZSwgbmFtZXMsIHR5cGUpO1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChgL3VfJHtwcm9wZXJ0eX1gKTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChleHByZXNzaW9uLmtpbmQgPT09ICdzb3VyY2UnIHx8IHNvdXJjZUV4Y2VwdGlvbiB8fCBpc0Nyb3NzRmFkZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBTdHJ1Y3RBcnJheUxheW91dCA9IGxheW91dFR5cGUocHJvcGVydHksIHR5cGUsICdzb3VyY2UnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRlcnNbcHJvcGVydHldID0gaXNDcm9zc0ZhZGVkID9cbiAgICAgICAgICAgICAgICAgICAgbmV3IENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIoZXhwcmVzc2lvbiwgbmFtZXMsIHR5cGUsIHVzZUludGVnZXJab29tLCB6b29tLCBTdHJ1Y3RBcnJheUxheW91dCwgbGF5ZXIuaWQpIDpcbiAgICAgICAgICAgICAgICAgICAgbmV3IFNvdXJjZUV4cHJlc3Npb25CaW5kZXIoZXhwcmVzc2lvbiwgbmFtZXMsIHR5cGUsIFN0cnVjdEFycmF5TGF5b3V0KTtcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goYC9hXyR7cHJvcGVydHl9YCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgU3RydWN0QXJyYXlMYXlvdXQgPSBsYXlvdXRUeXBlKHByb3BlcnR5LCB0eXBlLCAnY29tcG9zaXRlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kZXJzW3Byb3BlcnR5XSA9IG5ldyBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyKGV4cHJlc3Npb24sIG5hbWVzLCB0eXBlLCB1c2VJbnRlZ2VyWm9vbSwgem9vbSwgU3RydWN0QXJyYXlMYXlvdXQpO1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChgL3pfJHtwcm9wZXJ0eX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FjaGVLZXkgPSBrZXlzLnNvcnQoKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBnZXRNYXhWYWx1ZShwcm9wZXJ0eTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgcmV0dXJuIGJpbmRlciBpbnN0YW5jZW9mIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlciA/IGJpbmRlci5tYXhWYWx1ZSA6IDA7XG4gICAgfVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5cyhuZXdMZW5ndGg6IG51bWJlciwgZmVhdHVyZTogRmVhdHVyZSwgaW1hZ2VQb3NpdGlvbnM6IFNwcml0ZVBvc2l0aW9ucywgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBjYW5vbmljYWw/OiBDYW5vbmljYWxUaWxlSUQsIGZvcm1hdHRlZFNlY3Rpb24/OiBGb3JtYXR0ZWRTZWN0aW9uKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKGJpbmRlciBpbnN0YW5jZW9mIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyKVxuICAgICAgICAgICAgICAgIChiaW5kZXI6IEF0dHJpYnV0ZUJpbmRlcikucG9wdWxhdGVQYWludEFycmF5KG5ld0xlbmd0aCwgZmVhdHVyZSwgaW1hZ2VQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlcywgY2Fub25pY2FsLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG86IFNwcml0ZVBvc2l0aW9uLCBwb3NGcm9tOiBTcHJpdGVQb3NpdGlvbikge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXIpXG4gICAgICAgICAgICAgICAgYmluZGVyLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbywgcG9zRnJvbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVQYWludEFycmF5cyhmZWF0dXJlU3RhdGVzOiBGZWF0dXJlU3RhdGVzLCBmZWF0dXJlTWFwOiBGZWF0dXJlUG9zaXRpb25NYXAsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgbGF5ZXI6IFR5cGVkU3R5bGVMYXllciwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBpbWFnZVBvc2l0aW9uczogU3ByaXRlUG9zaXRpb25zKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBkaXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGZlYXR1cmVTdGF0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IGZlYXR1cmVNYXAuZ2V0UG9zaXRpb25zKGlkKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwb3Mgb2YgcG9zaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IHZ0TGF5ZXIuZmVhdHVyZShwb3MuaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChiaW5kZXIgaW5zdGFuY2VvZiBTb3VyY2VFeHByZXNzaW9uQmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyKSAmJiAoYmluZGVyOiBhbnkpLmV4cHJlc3Npb24uaXNTdGF0ZURlcGVuZGVudCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9BSE06IFJlbW92ZSBhZnRlciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNjI1NVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBsYXllci5wYWludC5nZXQocHJvcGVydHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgKGJpbmRlcjogYW55KS5leHByZXNzaW9uID0gdmFsdWUudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAoYmluZGVyOiBBdHRyaWJ1dGVCaW5kZXIpLnVwZGF0ZVBhaW50QXJyYXkocG9zLnN0YXJ0LCBwb3MuZW5kLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGVzW2lkXSwgYXZhaWxhYmxlSW1hZ2VzLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgIH1cblxuICAgIGRlZmluZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChiaW5kZXIgaW5zdGFuY2VvZiBDb25zdGFudEJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29uc3RhbnRCaW5kZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCguLi5iaW5kZXIudW5pZm9ybU5hbWVzLm1hcChuYW1lID0+IGAjZGVmaW5lIEhBU19VTklGT1JNXyR7bmFtZX1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBnZXRCaW5kZXJBdHRyaWJ1dGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoYmluZGVyIGluc3RhbmNlb2YgU291cmNlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmRlci5wYWludFZlcnRleEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYmluZGVyLnBhaW50VmVydGV4QXR0cmlidXRlc1tpXS5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBnZXRCaW5kZXJVbmlmb3JtcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgdW5pZm9ybXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoYmluZGVyIGluc3RhbmNlb2YgQ29uc3RhbnRCaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHVuaWZvcm1OYW1lIG9mIGJpbmRlci51bmlmb3JtTmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXMucHVzaCh1bmlmb3JtTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmlmb3JtcztcbiAgICB9XG5cbiAgICBnZXRQYWludFZlcnRleEJ1ZmZlcnMoKTogQXJyYXk8VmVydGV4QnVmZmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXJzO1xuICAgIH1cblxuICAgIGdldFVuaWZvcm1zKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEFycmF5PEJpbmRlclVuaWZvcm0+IHtcbiAgICAgICAgY29uc3QgdW5pZm9ybXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoYmluZGVyIGluc3RhbmNlb2YgQ29uc3RhbnRCaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ3Jvc3NGYWRlZENvbnN0YW50QmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgYmluZGVyLnVuaWZvcm1OYW1lcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb25zW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gYmluZGVyLmdldEJpbmRpbmcoY29udGV4dCwgbG9jYXRpb25zW25hbWVdLCBuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zLnB1c2goe25hbWUsIHByb3BlcnR5LCBiaW5kaW5nfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuaWZvcm1zO1xuICAgIH1cblxuICAgIHNldFVuaWZvcm1zPFByb3BlcnRpZXM6IE9iamVjdD4oY29udGV4dDogQ29udGV4dCwgYmluZGVyVW5pZm9ybXM6IEFycmF5PEJpbmRlclVuaWZvcm0+LCBwcm9wZXJ0aWVzOiBQb3NzaWJseUV2YWx1YXRlZDxQcm9wZXJ0aWVzPiwgZ2xvYmFsczogR2xvYmFsUHJvcGVydGllcykge1xuICAgICAgICAvLyBVbmlmb3JtIHN0YXRlIGJpbmRpbmdzIGFyZSBvd25lZCBieSB0aGUgUHJvZ3JhbSwgYnV0IHdlIHNldCB0aGVtXG4gICAgICAgIC8vIGZyb20gd2l0aGluIHRoZSBQcm9ncmFtQ29uZmlndXJhdGlvbidzIGJpbmRlciBtZW1iZXJzLlxuICAgICAgICBmb3IgKGNvbnN0IHtuYW1lLCBwcm9wZXJ0eSwgYmluZGluZ30gb2YgYmluZGVyVW5pZm9ybXMpIHtcbiAgICAgICAgICAgICh0aGlzLmJpbmRlcnNbcHJvcGVydHldOiBhbnkpLnNldFVuaWZvcm0oYmluZGluZywgZ2xvYmFscywgcHJvcGVydGllcy5nZXQocHJvcGVydHkpLCBuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVBhaW50QnVmZmVycyhjcm9zc2ZhZGU/OiBDcm9zc2ZhZGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlcnMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHRoaXMuYmluZGVycykge1xuICAgICAgICAgICAgY29uc3QgYmluZGVyID0gdGhpcy5iaW5kZXJzW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChjcm9zc2ZhZGUgJiYgYmluZGVyIGluc3RhbmNlb2YgQ3Jvc3NGYWRlZENvbXBvc2l0ZUJpbmRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5WZXJ0ZXhCdWZmZXIgPSBjcm9zc2ZhZGUuZnJvbVNjYWxlID09PSAyID8gYmluZGVyLnpvb21JblBhaW50VmVydGV4QnVmZmVyIDogYmluZGVyLnpvb21PdXRQYWludFZlcnRleEJ1ZmZlcjtcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVyblZlcnRleEJ1ZmZlcikgdGhpcy5fYnVmZmVycy5wdXNoKHBhdHRlcm5WZXJ0ZXhCdWZmZXIpO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKChiaW5kZXIgaW5zdGFuY2VvZiBTb3VyY2VFeHByZXNzaW9uQmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENvbXBvc2l0ZUV4cHJlc3Npb25CaW5kZXIpICYmIGJpbmRlci5wYWludFZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2J1ZmZlcnMucHVzaChiaW5kZXIucGFpbnRWZXJ0ZXhCdWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLmJpbmRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRlciA9IHRoaXMuYmluZGVyc1twcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoYmluZGVyIGluc3RhbmNlb2YgU291cmNlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyIHx8IGJpbmRlciBpbnN0YW5jZW9mIENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIpXG4gICAgICAgICAgICAgICAgYmluZGVyLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVBhaW50QnVmZmVycygpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5iaW5kZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBiaW5kZXIgPSB0aGlzLmJpbmRlcnNbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKGJpbmRlciBpbnN0YW5jZW9mIFNvdXJjZUV4cHJlc3Npb25CaW5kZXIgfHwgYmluZGVyIGluc3RhbmNlb2YgQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlciB8fCBiaW5kZXIgaW5zdGFuY2VvZiBDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyKVxuICAgICAgICAgICAgICAgIGJpbmRlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9ncmFtQ29uZmlndXJhdGlvblNldDxMYXllcjogVHlwZWRTdHlsZUxheWVyPiB7XG4gICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb25zOiB7W186IHN0cmluZ106IFByb2dyYW1Db25maWd1cmF0aW9ufTtcbiAgICBuZWVkc1VwbG9hZDogYm9vbGVhbjtcbiAgICBfZmVhdHVyZU1hcDogRmVhdHVyZVBvc2l0aW9uTWFwO1xuICAgIF9idWZmZXJPZmZzZXQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyczogJFJlYWRPbmx5QXJyYXk8TGF5ZXI+LCB6b29tOiBudW1iZXIsIGZpbHRlclByb3BlcnRpZXM6IChfOiBzdHJpbmcpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlKSB7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0ge307XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllci5pZF0gPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb24obGF5ZXIsIHpvb20sIGZpbHRlclByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZmVhdHVyZU1hcCA9IG5ldyBGZWF0dXJlUG9zaXRpb25NYXAoKTtcbiAgICAgICAgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXlzKGxlbmd0aDogbnVtYmVyLCBmZWF0dXJlOiBGZWF0dXJlLCBpbmRleDogbnVtYmVyLCBpbWFnZVBvc2l0aW9uczogU3ByaXRlUG9zaXRpb25zLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCBmb3JtYXR0ZWRTZWN0aW9uPzogRm9ybWF0dGVkU2VjdGlvbikge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNba2V5XS5wb3B1bGF0ZVBhaW50QXJyYXlzKGxlbmd0aCwgZmVhdHVyZSwgaW1hZ2VQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlcywgY2Fub25pY2FsLCBmb3JtYXR0ZWRTZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmZWF0dXJlLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZlYXR1cmVNYXAuYWRkKGZlYXR1cmUuaWQsIGluZGV4LCB0aGlzLl9idWZmZXJPZmZzZXQsIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gbGVuZ3RoO1xuXG4gICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhaW50QXJyYXlzKGZlYXR1cmVTdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgbGF5ZXJzOiAkUmVhZE9ubHlBcnJheTxUeXBlZFN0eWxlTGF5ZXI+LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGltYWdlUG9zaXRpb25zOiBTcHJpdGVQb3NpdGlvbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9uc1tsYXllci5pZF0udXBkYXRlUGFpbnRBcnJheXMoZmVhdHVyZVN0YXRlcywgdGhpcy5fZmVhdHVyZU1hcCwgdnRMYXllciwgbGF5ZXIsIGF2YWlsYWJsZUltYWdlcywgaW1hZ2VQb3NpdGlvbnMpIHx8IHRoaXMubmVlZHNVcGxvYWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQobGF5ZXJJZDogc3RyaW5nKTogUHJvZ3JhbUNvbmZpZ3VyYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXJJZF07XG4gICAgfVxuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5lZWRzVXBsb2FkKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnNbbGF5ZXJJZF0udXBsb2FkKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zW2xheWVySWRdLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgYXR0cmlidXRlTmFtZUV4Y2VwdGlvbnMgPSB7XG4gICAgJ3RleHQtb3BhY2l0eSc6IFsnb3BhY2l0eSddLFxuICAgICdpY29uLW9wYWNpdHknOiBbJ29wYWNpdHknXSxcbiAgICAndGV4dC1jb2xvcic6IFsnZmlsbF9jb2xvciddLFxuICAgICdpY29uLWNvbG9yJzogWydmaWxsX2NvbG9yJ10sXG4gICAgJ3RleHQtaGFsby1jb2xvcic6IFsnaGFsb19jb2xvciddLFxuICAgICdpY29uLWhhbG8tY29sb3InOiBbJ2hhbG9fY29sb3InXSxcbiAgICAndGV4dC1oYWxvLWJsdXInOiBbJ2hhbG9fYmx1ciddLFxuICAgICdpY29uLWhhbG8tYmx1cic6IFsnaGFsb19ibHVyJ10sXG4gICAgJ3RleHQtaGFsby13aWR0aCc6IFsnaGFsb193aWR0aCddLFxuICAgICdpY29uLWhhbG8td2lkdGgnOiBbJ2hhbG9fd2lkdGgnXSxcbiAgICAnbGluZS1nYXAtd2lkdGgnOiBbJ2dhcHdpZHRoJ10sXG4gICAgJ2xpbmUtcGF0dGVybic6IFsncGF0dGVybl90bycsICdwYXR0ZXJuX2Zyb20nLCAncGl4ZWxfcmF0aW9fdG8nLCAncGl4ZWxfcmF0aW9fZnJvbSddLFxuICAgICdmaWxsLXBhdHRlcm4nOiBbJ3BhdHRlcm5fdG8nLCAncGF0dGVybl9mcm9tJywgJ3BpeGVsX3JhdGlvX3RvJywgJ3BpeGVsX3JhdGlvX2Zyb20nXSxcbiAgICAnZmlsbC1leHRydXNpb24tcGF0dGVybic6IFsncGF0dGVybl90bycsICdwYXR0ZXJuX2Zyb20nLCAncGl4ZWxfcmF0aW9fdG8nLCAncGl4ZWxfcmF0aW9fZnJvbSddLFxuICAgICdsaW5lLWRhc2hhcnJheSc6IFsnZGFzaF90bycsICdkYXNoX2Zyb20nXVxufTtcblxuZnVuY3Rpb24gcGFpbnRBdHRyaWJ1dGVOYW1lcyhwcm9wZXJ0eSwgdHlwZSkge1xuICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lRXhjZXB0aW9uc1twcm9wZXJ0eV0gfHwgW3Byb3BlcnR5LnJlcGxhY2UoYCR7dHlwZX0tYCwgJycpLnJlcGxhY2UoLy0vZywgJ18nKV07XG59XG5cbmNvbnN0IHByb3BlcnR5RXhjZXB0aW9ucyA9IHtcbiAgICAnbGluZS1wYXR0ZXJuJzoge1xuICAgICAgICAnc291cmNlJzogUGF0dGVybkxheW91dEFycmF5LFxuICAgICAgICAnY29tcG9zaXRlJzogUGF0dGVybkxheW91dEFycmF5XG4gICAgfSxcbiAgICAnZmlsbC1wYXR0ZXJuJzoge1xuICAgICAgICAnc291cmNlJzogUGF0dGVybkxheW91dEFycmF5LFxuICAgICAgICAnY29tcG9zaXRlJzogUGF0dGVybkxheW91dEFycmF5XG4gICAgfSxcbiAgICAnZmlsbC1leHRydXNpb24tcGF0dGVybic6e1xuICAgICAgICAnc291cmNlJzogUGF0dGVybkxheW91dEFycmF5LFxuICAgICAgICAnY29tcG9zaXRlJzogUGF0dGVybkxheW91dEFycmF5XG4gICAgfSxcbiAgICAnbGluZS1kYXNoYXJyYXknOiB7IC8vIHRlbXBvcmFyeSBsYXlvdXRcbiAgICAgICAgJ3NvdXJjZSc6IERhc2hMYXlvdXRBcnJheSxcbiAgICAgICAgJ2NvbXBvc2l0ZSc6IERhc2hMYXlvdXRBcnJheVxuICAgIH1cbn07XG5cbmNvbnN0IGRlZmF1bHRMYXlvdXRzID0ge1xuICAgICdjb2xvcic6IHtcbiAgICAgICAgJ3NvdXJjZSc6IFN0cnVjdEFycmF5TGF5b3V0MmY4LFxuICAgICAgICAnY29tcG9zaXRlJzogU3RydWN0QXJyYXlMYXlvdXQ0ZjE2XG4gICAgfSxcbiAgICAnbnVtYmVyJzoge1xuICAgICAgICAnc291cmNlJzogU3RydWN0QXJyYXlMYXlvdXQxZjQsXG4gICAgICAgICdjb21wb3NpdGUnOiBTdHJ1Y3RBcnJheUxheW91dDJmOFxuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGxheW91dFR5cGUocHJvcGVydHksIHR5cGUsIGJpbmRlclR5cGUpIHtcbiAgICBjb25zdCBsYXlvdXRFeGNlcHRpb24gPSBwcm9wZXJ0eUV4Y2VwdGlvbnNbcHJvcGVydHldO1xuICAgIHJldHVybiAobGF5b3V0RXhjZXB0aW9uICYmIGxheW91dEV4Y2VwdGlvbltiaW5kZXJUeXBlXSkgfHwgZGVmYXVsdExheW91dHNbdHlwZV1bYmluZGVyVHlwZV07XG59XG5cbnJlZ2lzdGVyKENvbnN0YW50QmluZGVyLCAnQ29uc3RhbnRCaW5kZXInKTtcbnJlZ2lzdGVyKENyb3NzRmFkZWRDb25zdGFudEJpbmRlciwgJ0Nyb3NzRmFkZWRDb25zdGFudEJpbmRlcicpO1xucmVnaXN0ZXIoU291cmNlRXhwcmVzc2lvbkJpbmRlciwgJ1NvdXJjZUV4cHJlc3Npb25CaW5kZXInKTtcbnJlZ2lzdGVyKENyb3NzRmFkZWRDb21wb3NpdGVCaW5kZXIsICdDcm9zc0ZhZGVkQ29tcG9zaXRlQmluZGVyJyk7XG5yZWdpc3RlcihDb21wb3NpdGVFeHByZXNzaW9uQmluZGVyLCAnQ29tcG9zaXRlRXhwcmVzc2lvbkJpbmRlcicpO1xucmVnaXN0ZXIoUHJvZ3JhbUNvbmZpZ3VyYXRpb24sICdQcm9ncmFtQ29uZmlndXJhdGlvbicsIHtvbWl0OiBbJ19idWZmZXJzJ119KTtcbnJlZ2lzdGVyKFByb2dyYW1Db25maWd1cmF0aW9uU2V0LCAnUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQnKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7ZW5kc1dpdGgsIGZpbHRlck9iamVjdH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuaW1wb3J0IHtcbiAgICB2YWxpZGF0ZVN0eWxlLFxuICAgIHZhbGlkYXRlTGF5b3V0UHJvcGVydHksXG4gICAgdmFsaWRhdGVQYWludFByb3BlcnR5LFxuICAgIGVtaXRWYWxpZGF0aW9uRXJyb3JzXG59IGZyb20gJy4vdmFsaWRhdGVfc3R5bGUuanMnO1xuaW1wb3J0IHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHtMYXlvdXQsIFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQcm9wZXJ0aWVzLCBQb3NzaWJseUV2YWx1YXRlZCwgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSBmcm9tICcuL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHtzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IFByb2dyYW1Db25maWd1cmF0aW9uIGZyb20gJy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzJztcbmltcG9ydCBmZWF0dXJlRmlsdGVyIGZyb20gJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXIvaW5kZXguanMnO1xuXG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge0J1Y2tldH0gZnJvbSAnLi4vZGF0YS9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZUZpbHRlciwgRmlsdGVyRXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9mZWF0dXJlX2ZpbHRlci9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7VHJhbnNpdGlvblBhcmFtZXRlcnMsIFByb3BlcnR5VmFsdWV9IGZyb20gJy4vcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycywge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgICBMYXllclNwZWNpZmljYXRpb24sXG4gICAgRmlsdGVyU3BlY2lmaWNhdGlvbixcbiAgICBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbixcbiAgICBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtDdXN0b21MYXllckludGVyZmFjZX0gZnJvbSAnLi9zdHlsZV9sYXllci9jdXN0b21fc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcC5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVTZXR0ZXJPcHRpb25zfSBmcm9tICcuL3N0eWxlLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlc3BhY2VRdWVyeUdlb21ldHJ5fSBmcm9tICcuL3F1ZXJ5X2dlb21ldHJ5LmpzJztcbmltcG9ydCB0eXBlIHtERU1TYW1wbGVyfSBmcm9tICcuLi90ZXJyYWluL2VsZXZhdGlvbi5qcyc7XG5cbmNvbnN0IFRSQU5TSVRJT05fU1VGRklYID0gJy10cmFuc2l0aW9uJztcblxuY2xhc3MgU3R5bGVMYXllciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWV0YWRhdGE6IG1peGVkO1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZztcbiAgICBzb3VyY2VMYXllcjogP3N0cmluZztcbiAgICBtaW56b29tOiA/bnVtYmVyO1xuICAgIG1heHpvb206ID9udW1iZXI7XG4gICAgZmlsdGVyOiBGaWx0ZXJTcGVjaWZpY2F0aW9uIHwgdm9pZDtcbiAgICB2aXNpYmlsaXR5OiAndmlzaWJsZScgfCAnbm9uZScgfCB2b2lkO1xuICAgIF9jcm9zc2ZhZGVQYXJhbWV0ZXJzOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzO1xuXG4gICAgX3VuZXZhbHVhdGVkTGF5b3V0OiBMYXlvdXQ8YW55PjtcbiAgICArbGF5b3V0OiBtaXhlZDtcblxuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxhbnk+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8YW55PjtcbiAgICArcGFpbnQ6IG1peGVkO1xuXG4gICAgX2ZlYXR1cmVGaWx0ZXI6IEZlYXR1cmVGaWx0ZXI7XG4gICAgX2ZpbHRlckNvbXBpbGVkOiBib29sZWFuO1xuXG4gICAgK3F1ZXJ5UmFkaXVzOiAoYnVja2V0OiBCdWNrZXQpID0+IG51bWJlcjtcbiAgICArcXVlcnlJbnRlcnNlY3RzRmVhdHVyZTogKHF1ZXJ5R2VvbWV0cnk6IFRpbGVzcGFjZVF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGV2YXRpb25IZWxwZXI6ID9ERU1TYW1wbGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0VmVydGV4QXJyYXlPZmZzZXQ6IG51bWJlcikgPT4gYm9vbGVhbiB8IG51bWJlcjtcblxuICAgICtvbkFkZDogPyhtYXA6IE1hcCkgPT4gdm9pZDtcbiAgICArb25SZW1vdmU6ID8obWFwOiBNYXApID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uIHwgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UsIHByb3BlcnRpZXM6ICRSZWFkT25seTx7bGF5b3V0PzogUHJvcGVydGllczwqPiwgcGFpbnQ/OiBQcm9wZXJ0aWVzPCo+fT4pIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLmlkID0gbGF5ZXIuaWQ7XG4gICAgICAgIHRoaXMudHlwZSA9IGxheWVyLnR5cGU7XG4gICAgICAgIHRoaXMuX2ZlYXR1cmVGaWx0ZXIgPSB7ZmlsdGVyOiAoKSA9PiB0cnVlLCBuZWVkR2VvbWV0cnk6IGZhbHNlLCBuZWVkRmVhdHVyZTogZmFsc2V9O1xuICAgICAgICB0aGlzLl9maWx0ZXJDb21waWxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChsYXllci50eXBlID09PSAnY3VzdG9tJykgcmV0dXJuO1xuXG4gICAgICAgIGxheWVyID0gKChsYXllcjogYW55KTogTGF5ZXJTcGVjaWZpY2F0aW9uKTtcblxuICAgICAgICB0aGlzLm1ldGFkYXRhID0gbGF5ZXIubWV0YWRhdGE7XG4gICAgICAgIHRoaXMubWluem9vbSA9IGxheWVyLm1pbnpvb207XG4gICAgICAgIHRoaXMubWF4em9vbSA9IGxheWVyLm1heHpvb207XG5cbiAgICAgICAgaWYgKGxheWVyLnR5cGUgIT09ICdiYWNrZ3JvdW5kJyAmJiBsYXllci50eXBlICE9PSAnc2t5Jykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBsYXllci5zb3VyY2U7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUxheWVyID0gbGF5ZXJbJ3NvdXJjZS1sYXllciddO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXIgPSBsYXllci5maWx0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydGllcy5sYXlvdXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0ID0gbmV3IExheW91dChwcm9wZXJ0aWVzLmxheW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydGllcy5wYWludCkge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludCA9IG5ldyBUcmFuc2l0aW9uYWJsZShwcm9wZXJ0aWVzLnBhaW50KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBsYXllci5wYWludCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFpbnRQcm9wZXJ0eShwcm9wZXJ0eSwgbGF5ZXIucGFpbnRbcHJvcGVydHldLCB7dmFsaWRhdGU6IGZhbHNlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGxheWVyLmxheW91dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0TGF5b3V0UHJvcGVydHkocHJvcGVydHksIGxheWVyLmxheW91dFtwcm9wZXJ0eV0sIHt2YWxpZGF0ZTogZmFsc2V9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50ID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC51bnRyYW5zaXRpb25lZCgpO1xuICAgICAgICAgICAgLy8kRmxvd0ZpeE1lXG4gICAgICAgICAgICB0aGlzLnBhaW50ID0gbmV3IFBvc3NpYmx5RXZhbHVhdGVkKHByb3BlcnRpZXMucGFpbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nyb3NzZmFkZVBhcmFtZXRlcnM7XG4gICAgfVxuXG4gICAgZ2V0TGF5b3V0UHJvcGVydHkobmFtZTogc3RyaW5nKTogUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248bWl4ZWQ+IHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICd2aXNpYmlsaXR5Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJpbGl0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl91bmV2YWx1YXRlZExheW91dC5nZXRWYWx1ZShuYW1lKTtcbiAgICB9XG5cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBgbGF5ZXJzLiR7dGhpcy5pZH0ubGF5b3V0LiR7bmFtZX1gO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlTGF5b3V0UHJvcGVydHksIGtleSwgbmFtZSwgdmFsdWUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5hbWUgPT09ICd2aXNpYmlsaXR5Jykge1xuICAgICAgICAgICAgdGhpcy52aXNpYmlsaXR5ID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91bmV2YWx1YXRlZExheW91dC5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgZ2V0UGFpbnRQcm9wZXJ0eShuYW1lOiBzdHJpbmcpOiB2b2lkIHwgVHJhbnNpdGlvblNwZWNpZmljYXRpb24gfCBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxtaXhlZD4ge1xuICAgICAgICBpZiAoZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5nZXRUcmFuc2l0aW9uKG5hbWUuc2xpY2UoMCwgLVRSQU5TSVRJT05fU1VGRklYLmxlbmd0aCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuZ2V0VmFsdWUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRQYWludFByb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IG1peGVkLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYGxheWVycy4ke3RoaXMuaWR9LnBhaW50LiR7bmFtZX1gO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlUGFpbnRQcm9wZXJ0eSwga2V5LCBuYW1lLCB2YWx1ZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNldFRyYW5zaXRpb24obmFtZS5zbGljZSgwLCAtVFJBTlNJVElPTl9TVUZGSVgubGVuZ3RoKSwgKHZhbHVlOiBhbnkpIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2l0aW9uYWJsZSA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tuYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ3Jvc3NGYWRlZFByb3BlcnR5ID0gdHJhbnNpdGlvbmFibGUucHJvcGVydHkuc3BlY2lmaWNhdGlvbltcInByb3BlcnR5LXR5cGVcIl0gPT09ICdjcm9zcy1mYWRlZC1kYXRhLWRyaXZlbic7XG4gICAgICAgICAgICBjb25zdCB3YXNEYXRhRHJpdmVuID0gdHJhbnNpdGlvbmFibGUudmFsdWUuaXNEYXRhRHJpdmVuKCk7XG4gICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRyYW5zaXRpb25hYmxlLnZhbHVlO1xuXG4gICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50LnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKG5hbWUpO1xuXG4gICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1tuYW1lXS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGlzRGF0YURyaXZlbiA9IG5ld1ZhbHVlLmlzRGF0YURyaXZlbigpO1xuXG4gICAgICAgICAgICAvLyBpZiBhIGNyb3NzLWZhZGVkIHZhbHVlIGlzIGNoYW5nZWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBuZXcgaWNvbnMgZ2V0IGFkZGVkIHRvIGVhY2ggdGlsZSdzIGljb25BdGxhc1xuICAgICAgICAgICAgLy8gc28gYSBjYWxsIHRvIF91cGRhdGVMYXllciBpcyBuZWNlc3NhcnksIGFuZCB3ZSByZXR1cm4gdHJ1ZSBmcm9tIHRoaXMgZnVuY3Rpb24gc28gaXQgZ2V0cyBjYWxsZWQgaW5cbiAgICAgICAgICAgIC8vIFN0eWxlI3NldFBhaW50UHJvcGVydHlcbiAgICAgICAgICAgIHJldHVybiBpc0RhdGFEcml2ZW4gfHwgd2FzRGF0YURyaXZlbiB8fCBpc0Nyb3NzRmFkZWRQcm9wZXJ0eSB8fCB0aGlzLl9oYW5kbGVPdmVycmlkYWJsZVBhaW50UHJvcGVydHlVcGRhdGUobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9oYW5kbGVTcGVjaWFsUGFpbnRQcm9wZXJ0eVVwZGF0ZShfOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gTm8tb3A7IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtSWRzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIC8vIE5vLW9wOyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZXJpdmVkIGNsYXNzZXMuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1Db25maWd1cmF0aW9uKF86IG51bWJlcik6IFByb2dyYW1Db25maWd1cmF0aW9uIHwgbnVsbCB7XG4gICAgICAgIC8vIE5vLW9wOyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZXJpdmVkIGNsYXNzZXMuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIF9oYW5kbGVPdmVycmlkYWJsZVBhaW50UHJvcGVydHlVcGRhdGU8VCwgUj4obmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPiwgbmV3VmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj4pOiBib29sZWFuIHtcbiAgICAgICAgLy8gTm8tb3A7IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlcml2ZWQgY2xhc3Nlcy5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzSGlkZGVuKHpvb206IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5taW56b29tICYmIHpvb20gPCB0aGlzLm1pbnpvb20pIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy5tYXh6b29tICYmIHpvb20gPj0gdGhpcy5tYXh6b29tKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJpbGl0eSA9PT0gJ25vbmUnO1xuICAgIH1cblxuICAgIHVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQudHJhbnNpdGlvbmVkKHBhcmFtZXRlcnMsIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludCk7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25pbmdQYWludC5oYXNUcmFuc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcmVjYWxjdWxhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBpZiAocGFyYW1ldGVycy5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLl9jcm9zc2ZhZGVQYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQpIHtcbiAgICAgICAgICAgICh0aGlzOiBhbnkpLmxheW91dCA9IHRoaXMuX3VuZXZhbHVhdGVkTGF5b3V0LnBvc3NpYmx5RXZhbHVhdGUocGFyYW1ldGVycywgdW5kZWZpbmVkLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgKHRoaXM6IGFueSkucGFpbnQgPSB0aGlzLl90cmFuc2l0aW9uaW5nUGFpbnQucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzLCB1bmRlZmluZWQsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCk6IExheWVyU3BlY2lmaWNhdGlvbiB7XG4gICAgICAgIGNvbnN0IG91dHB1dDogYW55ID0ge1xuICAgICAgICAgICAgJ2lkJzogdGhpcy5pZCxcbiAgICAgICAgICAgICd0eXBlJzogdGhpcy50eXBlLFxuICAgICAgICAgICAgJ3NvdXJjZSc6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgJ3NvdXJjZS1sYXllcic6IHRoaXMuc291cmNlTGF5ZXIsXG4gICAgICAgICAgICAnbWV0YWRhdGEnOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgJ21pbnpvb20nOiB0aGlzLm1pbnpvb20sXG4gICAgICAgICAgICAnbWF4em9vbSc6IHRoaXMubWF4em9vbSxcbiAgICAgICAgICAgICdmaWx0ZXInOiB0aGlzLmZpbHRlcixcbiAgICAgICAgICAgICdsYXlvdXQnOiB0aGlzLl91bmV2YWx1YXRlZExheW91dCAmJiB0aGlzLl91bmV2YWx1YXRlZExheW91dC5zZXJpYWxpemUoKSxcbiAgICAgICAgICAgICdwYWludCc6IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQgJiYgdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5zZXJpYWxpemUoKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLnZpc2liaWxpdHkpIHtcbiAgICAgICAgICAgIG91dHB1dC5sYXlvdXQgPSBvdXRwdXQubGF5b3V0IHx8IHt9O1xuICAgICAgICAgICAgb3V0cHV0LmxheW91dC52aXNpYmlsaXR5ID0gdGhpcy52aXNpYmlsaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlck9iamVjdChvdXRwdXQsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICEoa2V5ID09PSAnbGF5b3V0JyAmJiAhT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCkgJiZcbiAgICAgICAgICAgICAgICAhKGtleSA9PT0gJ3BhaW50JyAmJiAhT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZSh2YWxpZGF0ZTogRnVuY3Rpb24sIGtleTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBtaXhlZCwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy52YWxpZGF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW1pdFZhbGlkYXRpb25FcnJvcnModGhpcywgdmFsaWRhdGUuY2FsbCh2YWxpZGF0ZVN0eWxlLCB7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBsYXllclR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIG9iamVjdEtleTogbmFtZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgc3R5bGVTcGVjLFxuICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI0MDdcbiAgICAgICAgICAgIHN0eWxlOiB7Z2x5cGhzOiB0cnVlLCBzcHJpdGU6IHRydWV9XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBpczNEKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNTa3koKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1RpbGVDbGlwcGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFzT2Zmc2NyZWVuUGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJlc2l6ZSgpIHtcbiAgICAgICAgLy8gbm9vcFxuICAgIH1cblxuICAgIGlzU3RhdGVEZXBlbmRlbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gKHRoaXM6IGFueSkucGFpbnQuX3ZhbHVlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAodGhpczogYW55KS5wYWludC5nZXQocHJvcGVydHkpO1xuICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUpIHx8ICFzdXBwb3J0c1Byb3BlcnR5RXhwcmVzc2lvbih2YWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoKHZhbHVlLnZhbHVlLmtpbmQgPT09ICdzb3VyY2UnIHx8IHZhbHVlLnZhbHVlLmtpbmQgPT09ICdjb21wb3NpdGUnKSAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLnZhbHVlLmlzU3RhdGVEZXBlbmRlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29tcGlsZUZpbHRlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9maWx0ZXJDb21waWxlZCkge1xuICAgICAgICAgICAgdGhpcy5fZmVhdHVyZUZpbHRlciA9IGZlYXR1cmVGaWx0ZXIodGhpcy5maWx0ZXIpO1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyQ29tcGlsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW52YWxpZGF0ZUNvbXBpbGVkRmlsdGVyKCkge1xuICAgICAgICB0aGlzLl9maWx0ZXJDb21waWxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGR5bmFtaWNGaWx0ZXIoKTogP0ZpbHRlckV4cHJlc3Npb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmVhdHVyZUZpbHRlci5keW5hbWljRmlsdGVyO1xuICAgIH1cblxuICAgIGR5bmFtaWNGaWx0ZXJOZWVkc0ZlYXR1cmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mZWF0dXJlRmlsdGVyLm5lZWRGZWF0dXJlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3R5bGVMYXllcjtcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5pbXBvcnQgdHlwZSB7U3RydWN0QXJyYXlMYXlvdXR9IGZyb20gJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcblxuZXhwb3J0IGNvbnN0IGNpcmNsZUF0dHJpYnV0ZXM6IFN0cnVjdEFycmF5TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zJywgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J31cbl0sIDQpO1xuXG5leHBvcnQgY29uc3QgY2lyY2xlR2xvYmVBdHRyaWJ1dGVzRXh0OiBTdHJ1Y3RBcnJheUxheW91dCA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3Bvc18zJywgY29tcG9uZW50czogMywgdHlwZTogJ0ludDE2J30sXG4gICAge25hbWU6ICdhX3Bvc19ub3JtYWxfMycsIGNvbXBvbmVudHM6IDMsIHR5cGU6ICdJbnQxNid9XG5dKTtcblxuZXhwb3J0IGNvbnN0IHttZW1iZXJzLCBzaXplLCBhbGlnbm1lbnR9ID0gY2lyY2xlQXR0cmlidXRlcztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7d2Fybk9uY2V9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5cbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5cbmltcG9ydCB0eXBlIFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4uL3JlbmRlci92ZXJ0ZXhfYXJyYXlfb2JqZWN0LmpzJztcbmltcG9ydCB0eXBlIHtTdHJ1Y3RBcnJheX0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5leHBvcnQgdHlwZSBTZWdtZW50ID0ge1xuICAgIHNvcnRLZXk6IG51bWJlciB8IHZvaWQsXG4gICAgdmVydGV4T2Zmc2V0OiBudW1iZXIsXG4gICAgcHJpbWl0aXZlT2Zmc2V0OiBudW1iZXIsXG4gICAgdmVydGV4TGVuZ3RoOiBudW1iZXIsXG4gICAgcHJpbWl0aXZlTGVuZ3RoOiBudW1iZXIsXG4gICAgdmFvczoge1tfOiBzdHJpbmddOiBWZXJ0ZXhBcnJheU9iamVjdH1cbn1cblxuY2xhc3MgU2VnbWVudFZlY3RvciB7XG4gICAgc3RhdGljIE1BWF9WRVJURVhfQVJSQVlfTEVOR1RIOiBudW1iZXI7XG4gICAgc2VnbWVudHM6IEFycmF5PFNlZ21lbnQ+O1xuXG4gICAgY29uc3RydWN0b3Ioc2VnbWVudHM/OiBBcnJheTxTZWdtZW50PiA9IFtdKSB7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBzZWdtZW50cztcbiAgICB9XG5cbiAgICBwcmVwYXJlU2VnbWVudChudW1WZXJ0aWNlczogbnVtYmVyLCBsYXlvdXRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXksIGluZGV4QXJyYXk6IFN0cnVjdEFycmF5LCBzb3J0S2V5PzogbnVtYmVyKTogU2VnbWVudCB7XG4gICAgICAgIGxldCBzZWdtZW50OiBTZWdtZW50ID0gdGhpcy5zZWdtZW50c1t0aGlzLnNlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAobnVtVmVydGljZXMgPiBTZWdtZW50VmVjdG9yLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIKSB3YXJuT25jZShgTWF4IHZlcnRpY2VzIHBlciBzZWdtZW50IGlzICR7U2VnbWVudFZlY3Rvci5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSH06IGJ1Y2tldCByZXF1ZXN0ZWQgJHtudW1WZXJ0aWNlc31gKTtcbiAgICAgICAgaWYgKCFzZWdtZW50IHx8IHNlZ21lbnQudmVydGV4TGVuZ3RoICsgbnVtVmVydGljZXMgPiBTZWdtZW50VmVjdG9yLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIIHx8IHNlZ21lbnQuc29ydEtleSAhPT0gc29ydEtleSkge1xuICAgICAgICAgICAgc2VnbWVudCA9ICh7XG4gICAgICAgICAgICAgICAgdmVydGV4T2Zmc2V0OiBsYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgcHJpbWl0aXZlT2Zmc2V0OiBpbmRleEFycmF5Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhMZW5ndGg6IDAsXG4gICAgICAgICAgICAgICAgcHJpbWl0aXZlTGVuZ3RoOiAwXG4gICAgICAgICAgICB9OiBhbnkpO1xuICAgICAgICAgICAgaWYgKHNvcnRLZXkgIT09IHVuZGVmaW5lZCkgc2VnbWVudC5zb3J0S2V5ID0gc29ydEtleTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudHMucHVzaChzZWdtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VnbWVudDtcbiAgICB9XG5cbiAgICBnZXQoKTogQXJyYXk8U2VnbWVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWdtZW50cztcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgdGhpcy5zZWdtZW50cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrIGluIHNlZ21lbnQudmFvcykge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQudmFvc1trXS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgc2ltcGxlU2VnbWVudCh2ZXJ0ZXhPZmZzZXQ6IG51bWJlciwgcHJpbWl0aXZlT2Zmc2V0OiBudW1iZXIsIHZlcnRleExlbmd0aDogbnVtYmVyLCBwcmltaXRpdmVMZW5ndGg6IG51bWJlcik6IFNlZ21lbnRWZWN0b3Ige1xuICAgICAgICByZXR1cm4gbmV3IFNlZ21lbnRWZWN0b3IoW3tcbiAgICAgICAgICAgIHZlcnRleE9mZnNldCxcbiAgICAgICAgICAgIHByaW1pdGl2ZU9mZnNldCxcbiAgICAgICAgICAgIHZlcnRleExlbmd0aCxcbiAgICAgICAgICAgIHByaW1pdGl2ZUxlbmd0aCxcbiAgICAgICAgICAgIHZhb3M6IHt9LFxuICAgICAgICAgICAgc29ydEtleTogMFxuICAgICAgICB9XSk7XG4gICAgfVxufVxuXG4vKlxuICogVGhlIG1heGltdW0gc2l6ZSBvZiBhIHZlcnRleCBhcnJheS4gVGhpcyBsaW1pdCBpcyBpbXBvc2VkIGJ5IFdlYkdMJ3MgMTYgYml0XG4gKiBhZGRyZXNzaW5nIG9mIHZlcnRleCBidWZmZXJzLlxuICogQHByaXZhdGVcbiAqIEByZWFkb25seVxuICovXG5TZWdtZW50VmVjdG9yLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIID0gTWF0aC5wb3coMiwgMTYpIC0gMTtcblxucmVnaXN0ZXIoU2VnbWVudFZlY3RvciwgJ1NlZ21lbnRWZWN0b3InKTtcbmV4cG9ydCBkZWZhdWx0IFNlZ21lbnRWZWN0b3I7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIExpbmVJbmRleEFycmF5LFxuICAgIFRyaWFuZ2xlSW5kZXhBcnJheSxcbiAgICBMaW5lU3RyaXBJbmRleEFycmF5XG59IGZyb20gJy4vYXJyYXlfdHlwZXMuanMnO1xuXG4vKipcbiAqIEFuIGluZGV4IGFycmF5IHN0b3JlcyBVaW50MTYgaW5kaWNlcyBvZiB2ZXJ0ZXhlcyBpbiBhIGNvcnJlc3BvbmRpbmcgdmVydGV4IGFycmF5LiBXZSB1c2VcbiAqIHRocmVlIGtpbmRzIG9mIGluZGV4IGFycmF5czogYXJyYXlzIHN0b3JpbmcgZ3JvdXBzIG9mIHRocmVlIGluZGljZXMsIGZvcm1pbmcgdHJpYW5nbGVzO1xuICogYXJyYXlzIHN0b3JpbmcgcGFpcnMgb2YgaW5kaWNlcywgZm9ybWluZyBsaW5lIHNlZ21lbnRzOyBhbmQgYXJyYXlzIHN0b3Jpbmcgc2luZ2xlIGluZGljZXMsXG4gKiBmb3JtaW5nIGEgbGluZSBzdHJpcC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCB7TGluZUluZGV4QXJyYXksIFRyaWFuZ2xlSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheX07XG4iLCIvLyBAZmxvd1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgY29vcmRpbmF0ZSBpbiB0aGUgaW50ZXJuYWwgdGlsZSBjb29yZGluYXRlIHN5c3RlbS4gQ29vcmRpbmF0ZXMgb2ZcbiAqIGFsbCBzb3VyY2UgZmVhdHVyZXMgbm9ybWFsaXplZCB0byB0aGlzIGV4dGVudCB1cG9uIGxvYWQuXG4gKlxuICogVGhlIHZhbHVlIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAqIFZlcnRleCBidWZmZXIgc3RvcmUgcG9zaXRpb25zIGFzIHNpZ25lZCAxNiBiaXQgaW50ZWdlcnMuXG4gKiAqIE9uZSBiaXQgaXMgbG9zdCBmb3Igc2lnbmVkbmVzcyB0byBzdXBwb3J0IHRpbGUgYnVmZmVycy5cbiAqICogT25lIGJpdCBpcyBsb3N0IGJlY2F1c2UgdGhlIGxpbmUgdmVydGV4IGJ1ZmZlciB1c2VkIHRvIHBhY2sgMSBiaXQgb2Ygb3RoZXIgZGF0YSBpbnRvIHRoZSBpbnQuXG4gKiAqIE9uZSBiaXQgaXMgbG9zdCB0byBzdXBwb3J0IGZlYXR1cmVzIGV4dGVuZGluZyBwYXN0IHRoZSBleHRlbnQgb24gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHRpbGUuXG4gKiAqIFRoaXMgbGVhdmVzIHVzIHdpdGggMl4xMyA9IDgxOTJcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJlYWRvbmx5XG4gKi9cbmV4cG9ydCBkZWZhdWx0IDgxOTI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgTG5nTGF0IGZyb20gJy4vbG5nX2xhdC5qcyc7XG5cbmltcG9ydCB0eXBlIHtMbmdMYXRMaWtlfSBmcm9tICcuL2xuZ19sYXQuanMnO1xuXG4vKipcbiAqIEEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0IHJlcHJlc2VudHMgYSBnZW9ncmFwaGljYWwgYm91bmRpbmcgYm94LFxuICogZGVmaW5lZCBieSBpdHMgc291dGh3ZXN0IGFuZCBub3J0aGVhc3QgcG9pbnRzIGluIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUuXG4gKlxuICogSWYgbm8gYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IsIGEgYG51bGxgIGJvdW5kaW5nIGJveCBpcyBjcmVhdGVkLlxuICpcbiAqIE5vdGUgdGhhdCBhbnkgTWFwYm94IEdMIG1ldGhvZCB0aGF0IGFjY2VwdHMgYSBgTG5nTGF0Qm91bmRzYCBvYmplY3QgYXMgYW4gYXJndW1lbnQgb3Igb3B0aW9uXG4gKiBjYW4gYWxzbyBhY2NlcHQgYW4gYEFycmF5YCBvZiB0d28ge0BsaW5rIExuZ0xhdExpa2V9IGNvbnN0cnVjdHMgYW5kIHdpbGwgcGVyZm9ybSBhbiBpbXBsaWNpdCBjb252ZXJzaW9uLlxuICogVGhpcyBmbGV4aWJsZSB0eXBlIGlzIGRvY3VtZW50ZWQgYXMge0BsaW5rIExuZ0xhdEJvdW5kc0xpa2V9LlxuICpcbiAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gW3N3XSBUaGUgc291dGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHtMbmdMYXRMaWtlfSBbbmVdIFRoZSBub3J0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgc3cgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45ODc2LCA0MC43NjYxKTtcbiAqIGNvbnN0IG5lID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTM5NywgNDAuODAwMik7XG4gKiBjb25zdCBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKHN3LCBuZSk7XG4gKi9cbmNsYXNzIExuZ0xhdEJvdW5kcyB7XG4gICAgX25lOiBMbmdMYXQ7XG4gICAgX3N3OiBMbmdMYXQ7XG5cbiAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGlzIHRvbyBmbGV4aWJsZSB0byB0eXBlLiBJdCBzaG91bGQgbm90IGJlIHNvIGZsZXhpYmxlLlxuICAgIGNvbnN0cnVjdG9yKHN3OiBhbnksIG5lOiBhbnkpIHtcbiAgICAgICAgaWYgKCFzdykge1xuICAgICAgICAgICAgLy8gbm9vcFxuICAgICAgICB9IGVsc2UgaWYgKG5lKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNvdXRoV2VzdChzdykuc2V0Tm9ydGhFYXN0KG5lKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U291dGhXZXN0KFtzd1swXSwgc3dbMV1dKS5zZXROb3J0aEVhc3QoW3N3WzJdLCBzd1szXV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTb3V0aFdlc3Qoc3dbMF0pLnNldE5vcnRoRWFzdChzd1sxXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG5vcnRoZWFzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbmUgQSB7QGxpbmsgTG5nTGF0TGlrZX0gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vcnRoZWFzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgc3cgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45ODc2LCA0MC43NjYxKTtcbiAgICAgKiBjb25zdCBuZSA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjkzOTcsIDQwLjgwMDIpO1xuICAgICAqIGNvbnN0IGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoc3csIG5lKTtcbiAgICAgKiBsbGIuc2V0Tm9ydGhFYXN0KFstNzMuOTM5NywgNDIuODAwMl0pO1xuICAgICAqL1xuICAgIHNldE5vcnRoRWFzdChuZTogTG5nTGF0TGlrZSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9uZSA9IG5lIGluc3RhbmNlb2YgTG5nTGF0ID8gbmV3IExuZ0xhdChuZS5sbmcsIG5lLmxhdCkgOiBMbmdMYXQuY29udmVydChuZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgc291dGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBzdyBBIHtAbGluayBMbmdMYXRMaWtlfSBvYmplY3QgZGVzY3JpYmluZyB0aGUgc291dGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzdyA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpO1xuICAgICAqIGNvbnN0IG5lID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTM5NywgNDAuODAwMik7XG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhzdywgbmUpO1xuICAgICAqIGxsYi5zZXRTb3V0aFdlc3QoWy03My45ODc2LCA0MC4yNjYxXSk7XG4gICAgICovXG4gICAgc2V0U291dGhXZXN0KHN3OiBMbmdMYXRMaWtlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3N3ID0gc3cgaW5zdGFuY2VvZiBMbmdMYXQgPyBuZXcgTG5nTGF0KHN3LmxuZywgc3cubGF0KSA6IExuZ0xhdC5jb252ZXJ0KHN3KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0ZW5kIHRoZSBib3VuZHMgdG8gaW5jbHVkZSBhIGdpdmVuIExuZ0xhdExpa2Ugb3IgTG5nTGF0Qm91bmRzTGlrZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZXxMbmdMYXRCb3VuZHNMaWtlfSBvYmogT2JqZWN0IHRvIGV4dGVuZCB0by5cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgc3cgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45ODc2LCA0MC43NjYxKTtcbiAgICAgKiBjb25zdCBuZSA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjkzOTcsIDQwLjgwMDIpO1xuICAgICAqIGNvbnN0IGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoc3csIG5lKTtcbiAgICAgKiBsbGIuZXh0ZW5kKFstNzIuOTg3NiwgNDIuMjY2MV0pO1xuICAgICAqL1xuICAgIGV4dGVuZChvYmo6IExuZ0xhdExpa2UgfCBMbmdMYXRCb3VuZHNMaWtlKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IHN3ID0gdGhpcy5fc3csXG4gICAgICAgICAgICBuZSA9IHRoaXMuX25lO1xuICAgICAgICBsZXQgc3cyLCBuZTI7XG5cbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIExuZ0xhdCkge1xuICAgICAgICAgICAgc3cyID0gb2JqO1xuICAgICAgICAgICAgbmUyID0gb2JqO1xuXG4gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTG5nTGF0Qm91bmRzKSB7XG4gICAgICAgICAgICBzdzIgPSBvYmouX3N3O1xuICAgICAgICAgICAgbmUyID0gb2JqLl9uZTtcblxuICAgICAgICAgICAgaWYgKCFzdzIgfHwgIW5lMikgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gNCB8fCBvYmouZXZlcnkoQXJyYXkuaXNBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG5nTGF0Qm91bmRzT2JqID0gKChvYmo6IGFueSk6IExuZ0xhdEJvdW5kc0xpa2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlbmQoTG5nTGF0Qm91bmRzLmNvbnZlcnQobG5nTGF0Qm91bmRzT2JqKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG5nTGF0T2JqID0gKChvYmo6IGFueSk6IExuZ0xhdExpa2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlbmQoTG5nTGF0LmNvbnZlcnQobG5nTGF0T2JqKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXN3ICYmICFuZSkge1xuICAgICAgICAgICAgdGhpcy5fc3cgPSBuZXcgTG5nTGF0KHN3Mi5sbmcsIHN3Mi5sYXQpO1xuICAgICAgICAgICAgdGhpcy5fbmUgPSBuZXcgTG5nTGF0KG5lMi5sbmcsIG5lMi5sYXQpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdy5sbmcgPSBNYXRoLm1pbihzdzIubG5nLCBzdy5sbmcpO1xuICAgICAgICAgICAgc3cubGF0ID0gTWF0aC5taW4oc3cyLmxhdCwgc3cubGF0KTtcbiAgICAgICAgICAgIG5lLmxuZyA9IE1hdGgubWF4KG5lMi5sbmcsIG5lLmxuZyk7XG4gICAgICAgICAgICBuZS5sYXQgPSBNYXRoLm1heChuZTIubGF0LCBuZS5sYXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGUgZXF1aWRpc3RhbnQgZnJvbSB0aGUgYm91bmRpbmcgYm94J3MgY29ybmVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBib3VuZGluZyBib3gncyBjZW50ZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi5nZXRDZW50ZXIoKTsgLy8gPSBMbmdMYXQge2xuZzogLTczLjk2MzY1LCBsYXQ6IDQwLjc4MzE1fVxuICAgICAqL1xuICAgIGdldENlbnRlcigpOiBMbmdMYXQge1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdCgodGhpcy5fc3cubG5nICsgdGhpcy5fbmUubG5nKSAvIDIsICh0aGlzLl9zdy5sYXQgKyB0aGlzLl9uZS5sYXQpIC8gMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc291dGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIHNvdXRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLmdldFNvdXRoV2VzdCgpOyAvLyBMbmdMYXQge2xuZzogLTczLjk4NzYsIGxhdDogNDAuNzY2MX1cbiAgICAgKi9cbiAgICBnZXRTb3V0aFdlc3QoKTogTG5nTGF0IHsgcmV0dXJuIHRoaXMuX3N3OyB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBub3J0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAgICAgKiBsbGIuZ2V0Tm9ydGhFYXN0KCk7IC8vIExuZ0xhdCB7bG5nOiAtNzMuOTM5NywgbGF0OiA0MC44MDAyfVxuICAgICAqL1xuICAgIGdldE5vcnRoRWFzdCgpOiBMbmdMYXQgeyByZXR1cm4gdGhpcy5fbmU7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG5vcnRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBub3J0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi5nZXROb3J0aFdlc3QoKTsgLy8gTG5nTGF0IHtsbmc6IC03My45ODc2LCBsYXQ6IDQwLjgwMDJ9XG4gICAgICovXG4gICAgZ2V0Tm9ydGhXZXN0KCk6IExuZ0xhdCB7IHJldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0V2VzdCgpLCB0aGlzLmdldE5vcnRoKCkpOyB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3V0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgc291dGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAgICAgKiBsbGIuZ2V0U291dGhFYXN0KCk7IC8vIExuZ0xhdCB7bG5nOiAtNzMuOTM5NywgbGF0OiA0MC43NjYxfVxuICAgICAqL1xuICAgIGdldFNvdXRoRWFzdCgpOiBMbmdMYXQgeyByZXR1cm4gbmV3IExuZ0xhdCh0aGlzLmdldEVhc3QoKSwgdGhpcy5nZXRTb3V0aCgpKTsgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgd2VzdCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgd2VzdCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi5nZXRXZXN0KCk7IC8vIC03My45ODc2XG4gICAgICovXG4gICAgZ2V0V2VzdCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc3cubG5nOyB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3V0aCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgc291dGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAgICAgKiBsbGIuZ2V0U291dGgoKTsgLy8gNDAuNzY2MVxuICAgICAqL1xuICAgIGdldFNvdXRoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdy5sYXQ7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGVhc3QgZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIGVhc3QgZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAgICAgKiBsbGIuZ2V0RWFzdCgpOyAvLyAtNzMuOTM5N1xuICAgICAqL1xuICAgIGdldEVhc3QoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX25lLmxuZzsgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbm9ydGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIG5vcnRoIGVkZ2Ugb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLmdldE5vcnRoKCk7IC8vIDQwLjgwMDJcbiAgICAgKi9cbiAgICBnZXROb3J0aCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbmUubGF0OyB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IFRoZSBib3VuZGluZyBib3ggcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXksIGNvbnNpc3Rpbmcgb2YgdGhlXG4gICAgICogICBzb3V0aHdlc3QgYW5kIG5vcnRoZWFzdCBjb29yZGluYXRlcyBvZiB0aGUgYm91bmRpbmcgcmVwcmVzZW50ZWQgYXMgYXJyYXlzIG9mIG51bWJlcnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi50b0FycmF5KCk7IC8vID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dXG4gICAgICovXG4gICAgdG9BcnJheSgpOiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0ge1xuICAgICAgICByZXR1cm4gW3RoaXMuX3N3LnRvQXJyYXkoKSwgdGhpcy5fbmUudG9BcnJheSgpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBib3VuZGluZyBib3ggcmVwcmVzZW50cyBhcyBhIHN0cmluZyBvZiB0aGUgZm9ybWF0XG4gICAgICogICBgJ0xuZ0xhdEJvdW5kcyhMbmdMYXQobG5nLCBsYXQpLCBMbmdMYXQobG5nLCBsYXQpKSdgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAgICAgKiBsbGIudG9TdHJpbmcoKTsgLy8gPSBcIkxuZ0xhdEJvdW5kcyhMbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpLCBMbmdMYXQoLTczLjkzOTcsIDQwLjgwMDIpKVwiXG4gICAgICovXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGBMbmdMYXRCb3VuZHMoJHt0aGlzLl9zdy50b1N0cmluZygpfSwgJHt0aGlzLl9uZS50b1N0cmluZygpfSlgO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBib3VuZGluZyBib3ggaXMgYW4gZW1wdHkvYG51bGxgLXR5cGUgYm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgYm91bmRzIGhhdmUgYmVlbiBkZWZpbmVkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKCk7XG4gICAgICogbGxiLmlzRW1wdHkoKTsgLy8gdHJ1ZVxuICAgICAqIGxsYi5zZXROb3J0aEVhc3QoWy03My45ODc2LCA0MC43NjYxXSk7XG4gICAgICogbGxiLnNldFNvdXRoV2VzdChbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAgICAgKiBsbGIuaXNFbXB0eSgpOyAvLyBmYWxzZVxuICAgICAqL1xuICAgIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhKHRoaXMuX3N3ICYmIHRoaXMuX25lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIENoZWNrIGlmIHRoZSBwb2ludCBpcyB3aXRoaW4gdGhlIGJvdW5kaW5nIGJveC5cbiAgICAqXG4gICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IGxuZ2xhdCBHZW9ncmFwaGljIHBvaW50IHRvIGNoZWNrIGFnYWluc3QuXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcG9pbnQgaXMgd2l0aGluIHRoZSBib3VuZGluZyBib3guXG4gICAgKiBAZXhhbXBsZVxuICAgICogY29uc3QgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhcbiAgICAqICAgbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTg3NiwgNDAuNzY2MSksXG4gICAgKiAgIG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjkzOTcsIDQwLjgwMDIpXG4gICAgKiApO1xuICAgICpcbiAgICAqIGNvbnN0IGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTU2NywgNDAuNzc4OSk7XG4gICAgKlxuICAgICogY29uc29sZS5sb2cobGxiLmNvbnRhaW5zKGxsKSk7IC8vID0gdHJ1ZVxuICAgICovXG4gICAgY29udGFpbnMobG5nbGF0OiBMbmdMYXRMaWtlKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHtsbmcsIGxhdH0gPSBMbmdMYXQuY29udmVydChsbmdsYXQpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRhaW5zTGF0aXR1ZGUgPSB0aGlzLl9zdy5sYXQgPD0gbGF0ICYmIGxhdCA8PSB0aGlzLl9uZS5sYXQ7XG4gICAgICAgIGxldCBjb250YWluc0xvbmdpdHVkZSA9IHRoaXMuX3N3LmxuZyA8PSBsbmcgJiYgbG5nIDw9IHRoaXMuX25lLmxuZztcbiAgICAgICAgaWYgKHRoaXMuX3N3LmxuZyA+IHRoaXMuX25lLmxuZykgeyAvLyB3cmFwcGVkIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICBjb250YWluc0xvbmdpdHVkZSA9IHRoaXMuX3N3LmxuZyA+PSBsbmcgJiYgbG5nID49IHRoaXMuX25lLmxuZztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb250YWluc0xhdGl0dWRlICYmIGNvbnRhaW5zTG9uZ2l0dWRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFuIGFycmF5IHRvIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0LlxuICAgICAqXG4gICAgICogSWYgYSBgTG5nTGF0Qm91bmRzYCBvYmplY3QgaXMgcGFzc2VkIGluLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpdCB1bmNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBJbnRlcm5hbGx5LCB0aGUgZnVuY3Rpb24gY2FsbHMgYExuZ0xhdCNjb252ZXJ0YCB0byBjb252ZXJ0IGFycmF5cyB0byBgTG5nTGF0YCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IGlucHV0IEFuIGFycmF5IG9mIHR3byBjb29yZGluYXRlcyB0byBjb252ZXJ0LCBvciBhIGBMbmdMYXRCb3VuZHNgIG9iamVjdCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kc30gQSBuZXcgYExuZ0xhdEJvdW5kc2Agb2JqZWN0LCBpZiBhIGNvbnZlcnNpb24gb2NjdXJyZWQsIG9yIHRoZSBvcmlnaW5hbCBgTG5nTGF0Qm91bmRzYCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBhcnIgPSBbWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXV07XG4gICAgICogY29uc3QgbGxiID0gbWFwYm94Z2wuTG5nTGF0Qm91bmRzLmNvbnZlcnQoYXJyKTtcbiAgICAgKiBjb25zb2xlLmxvZyhsbGIpOyAgIC8vID0gTG5nTGF0Qm91bmRzIHtfc3c6IExuZ0xhdCB7bG5nOiAtNzMuOTg3NiwgbGF0OiA0MC43NjYxfSwgX25lOiBMbmdMYXQge2xuZzogLTczLjkzOTcsIGxhdDogNDAuODAwMn19XG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnQoaW5wdXQ6IExuZ0xhdEJvdW5kc0xpa2UpOiBMbmdMYXRCb3VuZHMge1xuICAgICAgICBpZiAoIWlucHV0IHx8IGlucHV0IGluc3RhbmNlb2YgTG5nTGF0Qm91bmRzKSByZXR1cm4gaW5wdXQ7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0Qm91bmRzKGlucHV0KTtcbiAgICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgTG5nTGF0Qm91bmRzfSBvYmplY3QsIGFuIGFycmF5IG9mIHtAbGluayBMbmdMYXRMaWtlfSBvYmplY3RzIGluIFtzdywgbmVdIG9yZGVyLFxuICogb3IgYW4gYXJyYXkgb2YgbnVtYmVycyBpbiBbd2VzdCwgc291dGgsIGVhc3QsIG5vcnRoXSBvcmRlci5cbiAqXG4gKiBAdHlwZWRlZiB7TG5nTGF0Qm91bmRzIHwgW0xuZ0xhdExpa2UsIExuZ0xhdExpa2VdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl19IExuZ0xhdEJvdW5kc0xpa2VcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB2MSA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoXG4gKiAgIG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpLFxuICogICBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45Mzk3LCA0MC44MDAyKVxuICogKTtcbiAqIGNvbnN0IHYyID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAqIGNvbnN0IHYzID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dO1xuICovXG5leHBvcnQgdHlwZSBMbmdMYXRCb3VuZHNMaWtlID0gTG5nTGF0Qm91bmRzIHwgW0xuZ0xhdExpa2UsIExuZ0xhdExpa2VdIHwgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbmV4cG9ydCBkZWZhdWx0IExuZ0xhdEJvdW5kcztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7d3JhcH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCBMbmdMYXRCb3VuZHMgZnJvbSAnLi9sbmdfbGF0X2JvdW5kcy5qcyc7XG5cbi8qXG4qIEFwcHJveGltYXRlIHJhZGl1cyBvZiB0aGUgZWFydGggaW4gbWV0ZXJzLlxuKiBVc2VzIHRoZSBXR1MtODQgYXBwcm94aW1hdGlvbi4gVGhlIHJhZGl1cyBhdCB0aGUgZXF1YXRvciBpcyB+NjM3ODEzNyBhbmQgYXQgdGhlIHBvbGVzIGlzIH42MzU2NzUyLiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Xb3JsZF9HZW9kZXRpY19TeXN0ZW0jV0dTODRcbiogNjM3MTAwOC44IGlzIG9uZSBwdWJsaXNoZWQgXCJhdmVyYWdlIHJhZGl1c1wiIHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FYXJ0aF9yYWRpdXMjTWVhbl9yYWRpdXMsIG9yIGZ0cDovL2F0aGVuYS5mc3YuY3Z1dC5jei9aRkcvZ3JzODAtTW9yaXR6LnBkZiBwLjRcbiovXG5leHBvcnQgY29uc3QgZWFydGhSYWRpdXMgPSA2MzcxMDA4Ljg7XG5cbi8qKlxuICogQSBgTG5nTGF0YCBvYmplY3QgcmVwcmVzZW50cyBhIGdpdmVuIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgY29vcmRpbmF0ZSwgbWVhc3VyZWQgaW4gZGVncmVlcy5cbiAqIFRoZXNlIGNvb3JkaW5hdGVzIHVzZSBsb25naXR1ZGUsIGxhdGl0dWRlIGNvb3JkaW5hdGUgb3JkZXIgKGFzIG9wcG9zZWQgdG8gbGF0aXR1ZGUsIGxvbmdpdHVkZSlcbiAqIHRvIG1hdGNoIHRoZSBbR2VvSlNPTiBzcGVjaWZpY2F0aW9uXShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzc5NDYjc2VjdGlvbi00KSxcbiAqIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIE9HQzpDUlM4NCBjb29yZGluYXRlIHJlZmVyZW5jZSBzeXN0ZW0uXG4gKlxuICogTm90ZSB0aGF0IGFueSBNYXBib3ggR0wgbWV0aG9kIHRoYXQgYWNjZXB0cyBhIGBMbmdMYXRgIG9iamVjdCBhcyBhbiBhcmd1bWVudCBvciBvcHRpb25cbiAqIGNhbiBhbHNvIGFjY2VwdCBhbiBgQXJyYXlgIG9mIHR3byBudW1iZXJzIGFuZCB3aWxsIHBlcmZvcm0gYW4gaW1wbGljaXQgY29udmVyc2lvbi5cbiAqIFRoaXMgZmxleGlibGUgdHlwZSBpcyBkb2N1bWVudGVkIGFzIHtAbGluayBMbmdMYXRMaWtlfS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbG5nIExvbmdpdHVkZSwgbWVhc3VyZWQgaW4gZGVncmVlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsYXQgTGF0aXR1ZGUsIG1lYXN1cmVkIGluIGRlZ3JlZXMuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC0xMjMuOTc0OSwgNDAuNzczNik7XG4gKiBjb25zb2xlLmxvZyhsbC5sbmcpOyAvLyA9IC0xMjMuOTc0OVxuICogQHNlZSBbRXhhbXBsZTogR2V0IGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21vdXNlLXBvc2l0aW9uLylcbiAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgYSBwb3B1cF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC8pXG4gKiBAc2VlIFtFeGFtcGxlOiBIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgdGltZWxpbmUgYW5pbWF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RpbWVsaW5lLWFuaW1hdGlvbi8pXG4gKi9cbmNsYXNzIExuZ0xhdCB7XG4gICAgbG5nOiBudW1iZXI7XG4gICAgbGF0OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGlzTmFOKGxuZykgfHwgaXNOYU4obGF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIExuZ0xhdCBvYmplY3Q6ICgke2xuZ30sICR7bGF0fSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxuZyA9ICtsbmc7XG4gICAgICAgIHRoaXMubGF0ID0gK2xhdDtcbiAgICAgICAgaWYgKHRoaXMubGF0ID4gOTAgfHwgdGhpcy5sYXQgPCAtOTApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBMbmdMYXQgbGF0aXR1ZGUgdmFsdWU6IG11c3QgYmUgYmV0d2VlbiAtOTAgYW5kIDkwJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IGBMbmdMYXRgIG9iamVjdCB3aG9zZSBsb25naXR1ZGUgaXMgd3JhcHBlZCB0byB0aGUgcmFuZ2UgKC0xODAsIDE4MCkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgd3JhcHBlZCBgTG5nTGF0YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoMjg2LjAyNTEsIDQwLjc3MzYpO1xuICAgICAqIGNvbnN0IHdyYXBwZWQgPSBsbC53cmFwKCk7XG4gICAgICogY29uc29sZS5sb2cod3JhcHBlZC5sbmcpOyAvLyA9IC03My45NzQ5XG4gICAgICovXG4gICAgd3JhcCgpOiBMbmdMYXQge1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdCh3cmFwKHRoaXMubG5nLCAtMTgwLCAxODApLCB0aGlzLmxhdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29vcmRpbmF0ZXMgcmVwcmVzZW50ZWQgYXMgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8bnVtYmVyPn0gVGhlIGNvb3JkaW5hdGVzIHJlcHJlc2V0ZWQgYXMgYW4gYXJyYXkgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTc0OSwgNDAuNzczNik7XG4gICAgICogbGwudG9BcnJheSgpOyAvLyA9IFstNzMuOTc0OSwgNDAuNzczNl1cbiAgICAgKi9cbiAgICB0b0FycmF5KCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICByZXR1cm4gW3RoaXMubG5nLCB0aGlzLmxhdF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY29vcmRpbmF0ZXMgcmVwcmVzZW50IGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvb3JkaW5hdGVzIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXQgYCdMbmdMYXQobG5nLCBsYXQpJ2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk3NDksIDQwLjc3MzYpO1xuICAgICAqIGxsLnRvU3RyaW5nKCk7IC8vID0gXCJMbmdMYXQoLTczLjk3NDksIDQwLjc3MzYpXCJcbiAgICAgKi9cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYExuZ0xhdCgke3RoaXMubG5nfSwgJHt0aGlzLmxhdH0pYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhcHByb3hpbWF0ZSBkaXN0YW5jZSBiZXR3ZWVuIGEgcGFpciBvZiBjb29yZGluYXRlcyBpbiBtZXRlcnMuXG4gICAgICogVXNlcyB0aGUgSGF2ZXJzaW5lIEZvcm11bGEgKGZyb20gUi5XLiBTaW5ub3R0LCBcIlZpcnR1ZXMgb2YgdGhlIEhhdmVyc2luZVwiLCBTa3kgYW5kIFRlbGVzY29wZSwgdm9sLiA2OCwgbm8uIDIsIDE5ODQsIHAuIDE1OSkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nTGF0IENvb3JkaW5hdGVzIHRvIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IERpc3RhbmNlIGluIG1ldGVycyBiZXR3ZWVuIHRoZSB0d28gY29vcmRpbmF0ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBuZXdZb3JrID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzQuMDA2MCwgNDAuNzEyOCk7XG4gICAgICogY29uc3QgbG9zQW5nZWxlcyA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTExOC4yNDM3LCAzNC4wNTIyKTtcbiAgICAgKiBuZXdZb3JrLmRpc3RhbmNlVG8obG9zQW5nZWxlcyk7IC8vID0gMzkzNTc1MS42OTA4OTM5ODcsIFwidHJ1ZSBkaXN0YW5jZVwiIHVzaW5nIGEgbm9uLXNwaGVyaWNhbCBhcHByb3hpbWF0aW9uIGlzIH4zOTY2a21cbiAgICAgKi9cbiAgICBkaXN0YW5jZVRvKGxuZ0xhdDogTG5nTGF0KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcmFkID0gTWF0aC5QSSAvIDE4MDtcbiAgICAgICAgY29uc3QgbGF0MSA9IHRoaXMubGF0ICogcmFkO1xuICAgICAgICBjb25zdCBsYXQyID0gbG5nTGF0LmxhdCAqIHJhZDtcbiAgICAgICAgY29uc3QgYSA9IE1hdGguc2luKGxhdDEpICogTWF0aC5zaW4obGF0MikgKyBNYXRoLmNvcyhsYXQxKSAqIE1hdGguY29zKGxhdDIpICogTWF0aC5jb3MoKGxuZ0xhdC5sbmcgLSB0aGlzLmxuZykgKiByYWQpO1xuXG4gICAgICAgIGNvbnN0IG1heE1ldGVycyA9IGVhcnRoUmFkaXVzICogTWF0aC5hY29zKE1hdGgubWluKGEsIDEpKTtcbiAgICAgICAgcmV0dXJuIG1heE1ldGVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYExuZ0xhdEJvdW5kc2AgZnJvbSB0aGUgY29vcmRpbmF0ZXMgZXh0ZW5kZWQgYnkgYSBnaXZlbiBgcmFkaXVzYC4gVGhlIHJldHVybmVkIGBMbmdMYXRCb3VuZHNgIGNvbXBsZXRlbHkgY29udGFpbnMgdGhlIGByYWRpdXNgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpdXM9MF0gRGlzdGFuY2UgaW4gbWV0ZXJzIGZyb20gdGhlIGNvb3JkaW5hdGVzIHRvIGV4dGVuZCB0aGUgYm91bmRzLlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IEEgbmV3IGBMbmdMYXRCb3VuZHNgIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvb3JkaW5hdGVzIGV4dGVuZGVkIGJ5IHRoZSBgcmFkaXVzYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTc0OSwgNDAuNzczNik7XG4gICAgICogbGwudG9Cb3VuZHMoMTAwKS50b0FycmF5KCk7IC8vID0gW1stNzMuOTc1MDE4NjIxNDEzMjgsIDQwLjc3MzUxMDE2ODQ3MjI5XSwgWy03My45NzQ3ODEzNzg1ODY3MywgNDAuNzczNjg5ODMxNTI3NzFdXVxuICAgICAqL1xuICAgIHRvQm91bmRzKHJhZGl1cz86IG51bWJlciA9IDApOiBMbmdMYXRCb3VuZHMge1xuICAgICAgICBjb25zdCBlYXJ0aENpcmN1bWZlcmVuY2VJbk1ldGVyc0F0RXF1YXRvciA9IDQwMDc1MDE3O1xuICAgICAgICBjb25zdCBsYXRBY2N1cmFjeSA9IDM2MCAqIHJhZGl1cyAvIGVhcnRoQ2lyY3VtZmVyZW5jZUluTWV0ZXJzQXRFcXVhdG9yLFxuICAgICAgICAgICAgbG5nQWNjdXJhY3kgPSBsYXRBY2N1cmFjeSAvIE1hdGguY29zKChNYXRoLlBJIC8gMTgwKSAqIHRoaXMubGF0KTtcblxuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdEJvdW5kcyhuZXcgTG5nTGF0KHRoaXMubG5nIC0gbG5nQWNjdXJhY3ksIHRoaXMubGF0IC0gbGF0QWNjdXJhY3kpLFxuICAgICAgICAgICAgbmV3IExuZ0xhdCh0aGlzLmxuZyArIGxuZ0FjY3VyYWN5LCB0aGlzLmxhdCArIGxhdEFjY3VyYWN5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnMgb3IgYW4gb2JqZWN0IHdpdGggYGxuZ2AgYW5kIGBsYXRgIG9yIGBsb25gIGFuZCBgbGF0YCBwcm9wZXJ0aWVzXG4gICAgICogdG8gYSBgTG5nTGF0YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBJZiBhIGBMbmdMYXRgIG9iamVjdCBpcyBwYXNzZWQgaW4sIHRoZSBmdW5jdGlvbiByZXR1cm5zIGl0IHVuY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gaW5wdXQgQW4gYXJyYXkgb2YgdHdvIG51bWJlcnMgb3Igb2JqZWN0IHRvIGNvbnZlcnQsIG9yIGEgYExuZ0xhdGAgb2JqZWN0IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBBIG5ldyBgTG5nTGF0YCBvYmplY3QsIGlmIGEgY29udmVyc2lvbiBvY2N1cnJlZCwgb3IgdGhlIG9yaWdpbmFsIGBMbmdMYXRgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGFyciA9IFstNzMuOTc0OSwgNDAuNzczNl07XG4gICAgICogY29uc3QgbGwgPSBtYXBib3hnbC5MbmdMYXQuY29udmVydChhcnIpO1xuICAgICAqIGNvbnNvbGUubG9nKGxsKTsgICAvLyA9IExuZ0xhdCB7bG5nOiAtNzMuOTc0OSwgbGF0OiA0MC43NzM2fVxuICAgICAqL1xuICAgIHN0YXRpYyBjb252ZXJ0KGlucHV0OiBMbmdMYXRMaWtlKTogTG5nTGF0IHtcbiAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgTG5nTGF0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpICYmIChpbnB1dC5sZW5ndGggPT09IDIgfHwgaW5wdXQubGVuZ3RoID09PSAzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQoTnVtYmVyKGlucHV0WzBdKSwgTnVtYmVyKGlucHV0WzFdKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSAmJiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChcbiAgICAgICAgICAgICAgICAvLyBmbG93IGNhbid0IHJlZmluZSB0aGlzIHRvIGhhdmUgb25lIG9mIGxuZyBvciBsYXQsIHNvIHdlIGhhdmUgdG8gY2FzdCB0byBhbnlcbiAgICAgICAgICAgICAgICBOdW1iZXIoJ2xuZycgaW4gaW5wdXQgPyAoaW5wdXQ6IGFueSkubG5nIDogKGlucHV0OiBhbnkpLmxvbiksXG4gICAgICAgICAgICAgICAgTnVtYmVyKGlucHV0LmxhdClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYExuZ0xhdExpa2VgIGFyZ3VtZW50IG11c3QgYmUgc3BlY2lmaWVkIGFzIGEgTG5nTGF0IGluc3RhbmNlLCBhbiBvYmplY3Qge2xuZzogPGxuZz4sIGxhdDogPGxhdD59LCBhbiBvYmplY3Qge2xvbjogPGxuZz4sIGxhdDogPGxhdD59LCBvciBhbiBhcnJheSBvZiBbPGxuZz4sIDxsYXQ+XVwiKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgTG5nTGF0fSBvYmplY3QsIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIHJlcHJlc2VudGluZyBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLFxuICogb3IgYW4gb2JqZWN0IHdpdGggYGxuZ2AgYW5kIGBsYXRgIG9yIGBsb25gIGFuZCBgbGF0YCBwcm9wZXJ0aWVzLlxuICpcbiAqIEB0eXBlZGVmIHtMbmdMYXQgfCB7bG5nOiBudW1iZXIsIGxhdDogbnVtYmVyfSB8IHtsb246IG51bWJlciwgbGF0OiBudW1iZXJ9IHwgW251bWJlciwgbnVtYmVyXX0gTG5nTGF0TGlrZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHYxID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtMTIyLjQyMDY3OSwgMzcuNzcyNTM3KTtcbiAqIGNvbnN0IHYyID0gWy0xMjIuNDIwNjc5LCAzNy43NzI1MzddO1xuICogY29uc3QgdjMgPSB7bG9uOiAtMTIyLjQyMDY3OSwgbGF0OiAzNy43NzI1Mzd9O1xuICovXG5leHBvcnQgdHlwZSBMbmdMYXRMaWtlID0gTG5nTGF0IHwge2xuZzogbnVtYmVyLCBsYXQ6IG51bWJlcn0gfCB7bG9uOiBudW1iZXIsIGxhdDogbnVtYmVyfSB8IFtudW1iZXIsIG51bWJlcl07XG5cbmV4cG9ydCBkZWZhdWx0IExuZ0xhdDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBMbmdMYXQsIHtlYXJ0aFJhZGl1c30gZnJvbSAnLi4vZ2VvL2xuZ19sYXQuanMnO1xuaW1wb3J0IHR5cGUge0xuZ0xhdExpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0LmpzJztcblxuLypcbiAqIFRoZSBhdmVyYWdlIGNpcmN1bWZlcmVuY2Ugb2YgdGhlIHdvcmxkIGluIG1ldGVycy5cbiAqL1xuY29uc3QgZWFydGhDaXJjdW1mZXJlbmNlID0gMiAqIE1hdGguUEkgKiBlYXJ0aFJhZGl1czsgLy8gbWV0ZXJzXG5cbi8qXG4gKiBUaGUgY2lyY3VtZmVyZW5jZSBhdCBhIGxpbmUgb2YgbGF0aXR1ZGUgaW4gbWV0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2lyY3VtZmVyZW5jZUF0TGF0aXR1ZGUobGF0aXR1ZGU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGVhcnRoQ2lyY3VtZmVyZW5jZSAqIE1hdGguY29zKGxhdGl0dWRlICogTWF0aC5QSSAvIDE4MCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJjYXRvclhmcm9tTG5nKGxuZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKDE4MCArIGxuZykgLyAzNjA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJjYXRvcllmcm9tTGF0KGxhdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKDE4MCAtICgxODAgLyBNYXRoLlBJICogTWF0aC5sb2coTWF0aC50YW4oTWF0aC5QSSAvIDQgKyBsYXQgKiBNYXRoLlBJIC8gMzYwKSkpKSAvIDM2MDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmNhdG9yWmZyb21BbHRpdHVkZShhbHRpdHVkZTogbnVtYmVyLCBsYXQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGFsdGl0dWRlIC8gY2lyY3VtZmVyZW5jZUF0TGF0aXR1ZGUobGF0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxuZ0Zyb21NZXJjYXRvclgoeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4geCAqIDM2MCAtIDE4MDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhdEZyb21NZXJjYXRvclkoeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB5MiA9IDE4MCAtIHkgKiAzNjA7XG4gICAgcmV0dXJuIDM2MCAvIE1hdGguUEkgKiBNYXRoLmF0YW4oTWF0aC5leHAoeTIgKiBNYXRoLlBJIC8gMTgwKSkgLSA5MDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsdGl0dWRlRnJvbU1lcmNhdG9yWih6OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHogKiBjaXJjdW1mZXJlbmNlQXRMYXRpdHVkZShsYXRGcm9tTWVyY2F0b3JZKHkpKTtcbn1cblxuZXhwb3J0IGNvbnN0IE1BWF9NRVJDQVRPUl9MQVRJVFVERSA9IDg1LjA1MTEyOTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIE1lcmNhdG9yIHNjYWxlIGZhY3RvciBmb3IgYSBnaXZlbiBsYXRpdHVkZSwgc2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZXJjYXRvcl9wcm9qZWN0aW9uI1NjYWxlX2ZhY3RvclxuICpcbiAqIEF0IHRoZSBlcXVhdG9yIHRoZSBzY2FsZSBmYWN0b3Igd2lsbCBiZSAxLCB3aGljaCBpbmNyZWFzZXMgYXQgaGlnaGVyIGxhdGl0dWRlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbGF0IExhdGl0dWRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBzY2FsZSBmYWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJjYXRvclNjYWxlKGxhdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMSAvIE1hdGguY29zKGxhdCAqIE1hdGguUEkgLyAxODApO1xufVxuXG4vKipcbiAqIEEgYE1lcmNhdG9yQ29vcmRpbmF0ZWAgb2JqZWN0IHJlcHJlc2VudHMgYSBwcm9qZWN0ZWQgdGhyZWUgZGltZW5zaW9uYWwgcG9zaXRpb24uXG4gKlxuICogYE1lcmNhdG9yQ29vcmRpbmF0ZWAgdXNlcyB0aGUgd2ViIG1lcmNhdG9yIHByb2plY3Rpb24gKFtFUFNHOjM4NTddKGh0dHBzOi8vZXBzZy5pby8zODU3KSkgd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgdW5pdHM6XG4gKiAtIHRoZSBzaXplIG9mIDEgdW5pdCBpcyB0aGUgd2lkdGggb2YgdGhlIHByb2plY3RlZCB3b3JsZCBpbnN0ZWFkIG9mIHRoZSBcIm1lcmNhdG9yIG1ldGVyXCJcbiAqIC0gdGhlIG9yaWdpbiBvZiB0aGUgY29vcmRpbmF0ZSBzcGFjZSBpcyBhdCB0aGUgbm9ydGgtd2VzdCBjb3JuZXIgaW5zdGVhZCBvZiB0aGUgbWlkZGxlLlxuICpcbiAqIEZvciBleGFtcGxlLCBgTWVyY2F0b3JDb29yZGluYXRlKDAsIDAsIDApYCBpcyB0aGUgbm9ydGgtd2VzdCBjb3JuZXIgb2YgdGhlIG1lcmNhdG9yIHdvcmxkIGFuZFxuICogYE1lcmNhdG9yQ29vcmRpbmF0ZSgxLCAxLCAwKWAgaXMgdGhlIHNvdXRoLWVhc3QgY29ybmVyLiBJZiB5b3UgYXJlIGZhbWlsaWFyIHdpdGhcbiAqIFt2ZWN0b3IgdGlsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvdmVjdG9yLXRpbGUtc3BlYykgaXQgbWF5IGJlIGhlbHBmdWwgdG8gdGhpbmtcbiAqIG9mIHRoZSBjb29yZGluYXRlIHNwYWNlIGFzIHRoZSBgMC8wLzBgIHRpbGUgd2l0aCBhbiBleHRlbnQgb2YgYDFgLlxuICpcbiAqIFRoZSBgemAgZGltZW5zaW9uIG9mIGBNZXJjYXRvckNvb3JkaW5hdGVgIGlzIGNvbmZvcm1hbC4gQSBjdWJlIGluIHRoZSBtZXJjYXRvciBjb29yZGluYXRlIHNwYWNlIHdvdWxkIGJlIHJlbmRlcmVkIGFzIGEgY3ViZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeCBjb21wb25lbnQgb2YgdGhlIHBvc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IHkgVGhlIHkgY29tcG9uZW50IG9mIHRoZSBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSB6IFRoZSB6IGNvbXBvbmVudCBvZiB0aGUgcG9zaXRpb24uXG4gKiBAZXhhbXBsZVxuICogY29uc3QgbnVsbElzbGFuZCA9IG5ldyBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUoMC41LCAwLjUsIDApO1xuICpcbiAqIEBzZWUgW0V4YW1wbGU6IEFkZCBhIGN1c3RvbSBzdHlsZSBsYXllcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jdXN0b20tc3R5bGUtbGF5ZXIvKVxuICovXG5jbGFzcyBNZXJjYXRvckNvb3JkaW5hdGUge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgejogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciA9IDApIHtcbiAgICAgICAgdGhpcy54ID0gK3g7XG4gICAgICAgIHRoaXMueSA9ICt5O1xuICAgICAgICB0aGlzLnogPSArejtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9qZWN0IGEgYExuZ0xhdGAgdG8gYSBgTWVyY2F0b3JDb29yZGluYXRlYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbG5nTGF0TGlrZSBUaGUgbG9jYXRpb24gdG8gcHJvamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWx0aXR1ZGUgVGhlIGFsdGl0dWRlIGluIG1ldGVycyBvZiB0aGUgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge01lcmNhdG9yQ29vcmRpbmF0ZX0gVGhlIHByb2plY3RlZCBtZXJjYXRvciBjb29yZGluYXRlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgY29vcmQgPSBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdCh7bG5nOiAwLCBsYXQ6IDB9LCAwKTtcbiAgICAgKiBjb25zb2xlLmxvZyhjb29yZCk7IC8vIE1lcmNhdG9yQ29vcmRpbmF0ZSgwLjUsIDAuNSwgMClcbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUxuZ0xhdChsbmdMYXRMaWtlOiBMbmdMYXRMaWtlLCBhbHRpdHVkZTogbnVtYmVyID0gMCk6IE1lcmNhdG9yQ29vcmRpbmF0ZSB7XG4gICAgICAgIGNvbnN0IGxuZ0xhdCA9IExuZ0xhdC5jb252ZXJ0KGxuZ0xhdExpa2UpO1xuXG4gICAgICAgIHJldHVybiBuZXcgTWVyY2F0b3JDb29yZGluYXRlKFxuICAgICAgICAgICAgICAgIG1lcmNhdG9yWGZyb21MbmcobG5nTGF0LmxuZyksXG4gICAgICAgICAgICAgICAgbWVyY2F0b3JZZnJvbUxhdChsbmdMYXQubGF0KSxcbiAgICAgICAgICAgICAgICBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoYWx0aXR1ZGUsIGxuZ0xhdC5sYXQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgTG5nTGF0YCBmb3IgdGhlIGNvb3JkaW5hdGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgYExuZ0xhdGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgY29vcmQgPSBuZXcgbWFwYm94Z2wuTWVyY2F0b3JDb29yZGluYXRlKDAuNSwgMC41LCAwKTtcbiAgICAgKiBjb25zdCBsbmdMYXQgPSBjb29yZC50b0xuZ0xhdCgpOyAvLyBMbmdMYXQoMCwgMClcbiAgICAgKi9cbiAgICB0b0xuZ0xhdCgpOiBMbmdMYXQge1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChcbiAgICAgICAgICAgICAgICBsbmdGcm9tTWVyY2F0b3JYKHRoaXMueCksXG4gICAgICAgICAgICAgICAgbGF0RnJvbU1lcmNhdG9yWSh0aGlzLnkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBhbHRpdHVkZSBpbiBtZXRlcnMgb2YgdGhlIGNvb3JkaW5hdGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgYWx0aXR1ZGUgaW4gbWV0ZXJzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgY29vcmQgPSBuZXcgbWFwYm94Z2wuTWVyY2F0b3JDb29yZGluYXRlKDAsIDAsIDAuMDIpO1xuICAgICAqIGNvb3JkLnRvQWx0aXR1ZGUoKTsgLy8gNjkxNC4yODE5NTYyOTUzMzlcbiAgICAgKi9cbiAgICB0b0FsdGl0dWRlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBhbHRpdHVkZUZyb21NZXJjYXRvcloodGhpcy56LCB0aGlzLnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRpc3RhbmNlIG9mIDEgbWV0ZXIgaW4gYE1lcmNhdG9yQ29vcmRpbmF0ZWAgdW5pdHMgYXQgdGhpcyBsYXRpdHVkZS5cbiAgICAgKlxuICAgICAqIEZvciBjb29yZGluYXRlcyBpbiByZWFsIHdvcmxkIHVuaXRzIHVzaW5nIG1ldGVycywgdGhpcyBuYXR1cmFsbHkgcHJvdmlkZXMgdGhlIHNjYWxlXG4gICAgICogdG8gdHJhbnNmb3JtIGludG8gYE1lcmNhdG9yQ29vcmRpbmF0ZWBzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gRGlzdGFuY2Ugb2YgMSBtZXRlciBpbiBgTWVyY2F0b3JDb29yZGluYXRlYCB1bml0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIENhbGN1bGF0ZSBhIG5ldyBNZXJjYXRvckNvb3JkaW5hdGUgdGhhdCBpcyAxNTAgbWV0ZXJzIHdlc3Qgb2YgdGhlIG90aGVyIGNvb3JkLlxuICAgICAqIGNvbnN0IGNvb3JkID0gbmV3IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZSgwLjUsIDAuMjUsIDApO1xuICAgICAqIGNvbnN0IG9mZnNldEluTWV0ZXJzID0gMTUwO1xuICAgICAqIGNvbnN0IG9mZnNldEluTWVyY2F0b3JDb29yZGluYXRlVW5pdHMgPSBvZmZzZXRJbk1ldGVycyAqIGNvb3JkLm1ldGVySW5NZXJjYXRvckNvb3JkaW5hdGVVbml0cygpO1xuICAgICAqIGNvbnN0IHdlc3RDb29yZCA9IG5ldyBtYXBib3hnbC5NZXJjYXRvckNvb3JkaW5hdGUoY29vcmQueCAtIG9mZnNldEluTWVyY2F0b3JDb29yZGluYXRlVW5pdHMsIGNvb3JkLnksIGNvb3JkLnopO1xuICAgICAqL1xuICAgIG1ldGVySW5NZXJjYXRvckNvb3JkaW5hdGVVbml0cygpOiBudW1iZXIge1xuICAgICAgICAvLyAxIG1ldGVyIC8gY2lyY3VtZmVyZW5jZSBhdCBlcXVhdG9yIGluIG1ldGVycyAqIE1lcmNhdG9yIHByb2plY3Rpb24gc2NhbGUgZmFjdG9yIGF0IHRoaXMgbGF0aXR1ZGVcbiAgICAgICAgcmV0dXJuIDEgLyBlYXJ0aENpcmN1bWZlcmVuY2UgKiBtZXJjYXRvclNjYWxlKGxhdEZyb21NZXJjYXRvclkodGhpcy55KSk7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lcmNhdG9yQ29vcmRpbmF0ZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuZnVuY3Rpb24gcG9pbnRUb0xpbmVEaXN0KHB4LCBweSwgYXgsIGF5LCBieCwgYnkpIHtcbiAgICBjb25zdCBkeCA9IGF4IC0gYng7XG4gICAgY29uc3QgZHkgPSBheSAtIGJ5O1xuICAgIHJldHVybiBNYXRoLmFicygoYXkgLSBweSkgKiBkeCAtIChheCAtIHB4KSAqIGR5KSAvIE1hdGguaHlwb3QoZHgsIGR5KTtcbn1cblxuZnVuY3Rpb24gYWRkUmVzYW1wbGVkKHJlc2FtcGxlZCwgbXgwLCBteTAsIG14MiwgbXkyLCBzdGFydCwgZW5kLCByZXByb2plY3QsIHRvbGVyYW5jZSkge1xuICAgIGNvbnN0IG14MSA9IChteDAgKyBteDIpIC8gMjtcbiAgICBjb25zdCBteTEgPSAobXkwICsgbXkyKSAvIDI7XG4gICAgY29uc3QgbWlkID0gbmV3IFBvaW50KG14MSwgbXkxKTtcbiAgICByZXByb2plY3QobWlkKTtcbiAgICBjb25zdCBlcnIgPSBwb2ludFRvTGluZURpc3QobWlkLngsIG1pZC55LCBzdGFydC54LCBzdGFydC55LCBlbmQueCwgZW5kLnkpO1xuXG4gICAgLy8gaWYgcmVwcm9qZWN0ZWQgbWlkUG9pbnQgaXMgdG9vIGZhciBmcm9tIGdlb21ldHJpYyBtaWRwb2ludCwgcmVjdXJzZSBpbnRvIHR3byBoYWx2ZXNcbiAgICBpZiAoZXJyID49IHRvbGVyYW5jZSkge1xuICAgICAgICAvLyB3ZSdyZSB2ZXJ5IHVubGlrZWx5IHRvIGhpdCBtYXggY2FsbCBzdGFjayBleGNlZWRlZCBoZXJlLFxuICAgICAgICAvLyBidXQgd2UgbWlnaHQgd2FudCB0byBzYWZlZ3VhcmQgYWdhaW5zdCBpdCBpbiB0aGUgZnV0dXJlXG4gICAgICAgIGFkZFJlc2FtcGxlZChyZXNhbXBsZWQsIG14MCwgbXkwLCBteDEsIG15MSwgc3RhcnQsIG1pZCwgcmVwcm9qZWN0LCB0b2xlcmFuY2UpO1xuICAgICAgICBhZGRSZXNhbXBsZWQocmVzYW1wbGVkLCBteDEsIG15MSwgbXgyLCBteTIsIG1pZCwgZW5kLCByZXByb2plY3QsIHRvbGVyYW5jZSk7XG5cbiAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UsIGp1c3QgYWRkIHRoZSBwb2ludFxuICAgICAgICByZXNhbXBsZWQucHVzaChlbmQpO1xuICAgIH1cbn1cblxuLy8gcmVwcm9qZWN0IGFuZCByZXNhbXBsZSBhIGxpbmUsIGFkZGluZyBwb2ludCB3aGVyZSBuZWNlc3NhcnkgZm9yIGxpbmVzIHRoYXQgYmVjb21lIGN1cnZlcztcbi8vIG5vdGUgdGhhdCB0aGlzIG9wZXJhdGlvbiBpcyBtdXRhYmxlIChtb2RpZnlpbmcgb3JpZ2luYWwgcG9pbnRzKSBmb3IgcGVyZm9ybWFuY2VcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlc2FtcGxlKGxpbmU6IEFycmF5PFBvaW50PiwgcmVwcm9qZWN0OiAoUG9pbnQpID0+IFBvaW50LCB0b2xlcmFuY2U6IG51bWJlcik6IEFycmF5PFBvaW50PiB7XG4gICAgbGV0IHByZXYgPSBsaW5lWzBdO1xuICAgIGxldCBteDAgPSBwcmV2Lng7XG4gICAgbGV0IG15MCA9IHByZXYueTtcbiAgICByZXByb2plY3QocHJldik7XG4gICAgY29uc3QgcmVzYW1wbGVkID0gW3ByZXZdO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gbGluZVtpXTtcbiAgICAgICAgY29uc3Qge3gsIHl9ID0gcG9pbnQ7XG4gICAgICAgIHJlcHJvamVjdChwb2ludCk7XG4gICAgICAgIGFkZFJlc2FtcGxlZChyZXNhbXBsZWQsIG14MCwgbXkwLCB4LCB5LCBwcmV2LCBwb2ludCwgcmVwcm9qZWN0LCB0b2xlcmFuY2UpO1xuICAgICAgICBteDAgPSB4O1xuICAgICAgICBteTAgPSB5O1xuICAgICAgICBwcmV2ID0gcG9pbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc2FtcGxlZDtcbn1cblxuZnVuY3Rpb24gYWRkUmVzYW1wbGVkUHJlZChyZXNhbXBsZWQ6IFBvaW50W10sIGE6IFBvaW50LCBiOiBQb2ludCwgcmVwcm9qZWN0LCBwcmVkKSB7XG4gICAgY29uc3Qgc3BsaXQgPSBwcmVkKGEsIGIpO1xuXG4gICAgLy8gaWYgdGhlIHByZWRpY2F0ZSBjb25kaXRpb24gaXMgbWV0LCByZWN1cnNlIGludG8gdHdvIGhhbHZlc1xuICAgIGlmIChzcGxpdCkge1xuICAgICAgICBjb25zdCBtaWQgPSBhLmFkZChiKS5tdWx0KDAuNSk7XG4gICAgICAgIHJlcHJvamVjdChtaWQpO1xuXG4gICAgICAgIGFkZFJlc2FtcGxlZFByZWQocmVzYW1wbGVkLCBhLCBtaWQsIHJlcHJvamVjdCwgcHJlZCk7XG4gICAgICAgIGFkZFJlc2FtcGxlZFByZWQocmVzYW1wbGVkLCBtaWQsIGIsIHJlcHJvamVjdCwgcHJlZCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXNhbXBsZWQucHVzaChiKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNhbXBsZVByZWQobGluZTogUG9pbnRbXSwgcmVwcm9qZWN0OiAoUG9pbnQpID0+IFBvaW50LCBwcmVkaWNhdGU6IChQb2ludCwgUG9pbnQpID0+IGJvb2xlYW4pOiBQb2ludFtdIHtcbiAgICBsZXQgcHJldiA9IGxpbmVbMF07XG4gICAgcmVwcm9qZWN0KHByZXYpO1xuICAgIGNvbnN0IHJlc2FtcGxlZCA9IFtwcmV2XTtcblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwb2ludCA9IGxpbmVbaV07XG4gICAgICAgIHJlcHJvamVjdChwb2ludCk7XG4gICAgICAgIGFkZFJlc2FtcGxlZFByZWQocmVzYW1wbGVkLCBwcmV2LCBwb2ludCwgcmVwcm9qZWN0LCBwcmVkaWNhdGUpO1xuICAgICAgICBwcmV2ID0gcG9pbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc2FtcGxlZDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7d2Fybk9uY2UsIGNsYW1wfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuXG5pbXBvcnQgRVhURU5UIGZyb20gJy4vZXh0ZW50LmpzJztcbmltcG9ydCB7bG5nRnJvbU1lcmNhdG9yWCwgbGF0RnJvbU1lcmNhdG9yWX0gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHJlc2FtcGxlIGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3Jlc2FtcGxlLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVUcmFuc2Zvcm19IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcblxuLy8gVGhlc2UgYm91bmRzIGRlZmluZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBzdXBwb3J0ZWQgY29vcmRpbmF0ZSB2YWx1ZXMuXG4vLyBXaGlsZSB2aXNpYmxlIGNvb3JkaW5hdGVzIGFyZSB3aXRoaW4gWzAsIEVYVEVOVF0sIHRpbGVzIG1heSB0aGVvcmV0aWNhbGx5XG4vLyBjb250YWluIGNvb3JkaW5hdGVzIHdpdGhpbiBbLUluZmluaXR5LCBJbmZpbml0eV0uIE91ciByYW5nZSBpcyBsaW1pdGVkIGJ5IHRoZVxuLy8gbnVtYmVyIG9mIGJpdHMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvb3JkaW5hdGUuXG5jb25zdCBCSVRTID0gMTU7XG5jb25zdCBNQVggPSBNYXRoLnBvdygyLCBCSVRTIC0gMSkgLSAxO1xuY29uc3QgTUlOID0gLU1BWCAtIDE7XG5cbmZ1bmN0aW9uIHByZXBhcmVQb2ludChwb2ludDogUG9pbnQsIHNjYWxlOiBudW1iZXIpIHtcbiAgICBjb25zdCB4ID0gTWF0aC5yb3VuZChwb2ludC54ICogc2NhbGUpO1xuICAgIGNvbnN0IHkgPSBNYXRoLnJvdW5kKHBvaW50LnkgKiBzY2FsZSk7XG4gICAgcG9pbnQueCA9IGNsYW1wKHgsIE1JTiwgTUFYKTtcbiAgICBwb2ludC55ID0gY2xhbXAoeSwgTUlOLCBNQVgpO1xuICAgIGlmICh4IDwgcG9pbnQueCB8fCB4ID4gcG9pbnQueCArIDEgfHwgeSA8IHBvaW50LnkgfHwgeSA+IHBvaW50LnkgKyAxKSB7XG4gICAgICAgIC8vIHdhcm4gd2hlbiBleGNlZWRpbmcgYWxsb3dlZCBleHRlbnQgZXhjZXB0IGZvciB0aGUgMS1weC1vZmYgY2FzZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvODk5MlxuICAgICAgICB3YXJuT25jZSgnR2VvbWV0cnkgZXhjZWVkcyBhbGxvd2VkIGV4dGVudCwgcmVkdWNlIHlvdXIgdmVjdG9yIHRpbGUgYnVmZmVyIHNpemUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50O1xufVxuXG4vLyBhIHN1YnNldCBvZiBWZWN0b3JUaWxlR2VvbWV0cnlcbnR5cGUgRmVhdHVyZVdpdGhHZW9tZXRyeSA9IHtcbiAgICBleHRlbnQ6IG51bWJlcjtcbiAgICB0eXBlOiAxIHwgMiB8IDM7XG4gICAgbG9hZEdlb21ldHJ5KCk6IEFycmF5PEFycmF5PFBvaW50Pj47XG59XG5cbi8qKlxuICogTG9hZHMgYSBnZW9tZXRyeSBmcm9tIGEgVmVjdG9yVGlsZUZlYXR1cmUgYW5kIHNjYWxlcyBpdCB0byB0aGUgY29tbW9uIGV4dGVudFxuICogdXNlZCBpbnRlcm5hbGx5LlxuICogQHBhcmFtIHtWZWN0b3JUaWxlRmVhdHVyZX0gZmVhdHVyZVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbG9hZEdlb21ldHJ5KGZlYXR1cmU6IEZlYXR1cmVXaXRoR2VvbWV0cnksIGNhbm9uaWNhbD86IENhbm9uaWNhbFRpbGVJRCwgdGlsZVRyYW5zZm9ybT86IFRpbGVUcmFuc2Zvcm0pOiBBcnJheTxBcnJheTxQb2ludD4+IHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IGZlYXR1cmUubG9hZEdlb21ldHJ5KCk7XG4gICAgY29uc3QgZXh0ZW50ID0gZmVhdHVyZS5leHRlbnQ7XG4gICAgY29uc3QgZXh0ZW50U2NhbGUgPSBFWFRFTlQgLyBleHRlbnQ7XG5cbiAgICBpZiAoY2Fub25pY2FsICYmIHRpbGVUcmFuc2Zvcm0gJiYgdGlsZVRyYW5zZm9ybS5wcm9qZWN0aW9uLmlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZSkge1xuICAgICAgICBjb25zdCB6MiA9IDEgPDwgY2Fub25pY2FsLno7XG4gICAgICAgIGNvbnN0IHtzY2FsZSwgeCwgeSwgcHJvamVjdGlvbn0gPSB0aWxlVHJhbnNmb3JtO1xuXG4gICAgICAgIGNvbnN0IHJlcHJvamVjdCA9IChwKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsbmcgPSBsbmdGcm9tTWVyY2F0b3JYKChjYW5vbmljYWwueCArIHAueCAvIGV4dGVudCkgLyB6Mik7XG4gICAgICAgICAgICBjb25zdCBsYXQgPSBsYXRGcm9tTWVyY2F0b3JZKChjYW5vbmljYWwueSArIHAueSAvIGV4dGVudCkgLyB6Mik7XG4gICAgICAgICAgICBjb25zdCBwMiA9IHByb2plY3Rpb24ucHJvamVjdChsbmcsIGxhdCk7XG4gICAgICAgICAgICBwLnggPSAocDIueCAqIHNjYWxlIC0geCkgKiBleHRlbnQ7XG4gICAgICAgICAgICBwLnkgPSAocDIueSAqIHNjYWxlIC0geSkgKiBleHRlbnQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnZW9tZXRyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUudHlwZSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5W2ldID0gcmVzYW1wbGUoZ2VvbWV0cnlbaV0sIHJlcHJvamVjdCwgMSk7IC8vIHJlc2FtcGxlIGxpbmVzIGFuZCBwb2x5Z29uc1xuXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBwb2ludHNcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIGdlb21ldHJ5W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgcG9pbnQgZmVhdHVyZXMgb3V0c2lkZSB0aWxlIGJvdW5kYXJpZXMgbm93OyBpdCdkIGJlIGhhcmRlciB0byBkbyBsYXRlclxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBjb29yZHMgYXJlIHJlcHJvamVjdGVkIGFuZCBubyBsb25nZXIgYXhpcy1hbGlnbmVkOyBpZGVhbGx5IHRoaXMgd291bGQgaGFwcGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdCBkZXBlbmRpbmcgb24gaG93IHRoZSBnZW9tZXRyeSBpcyB1c2VkLCBidXQgd2UgZm9yZWdvIHRoZSBjb21wbGV4aXR5IGZvciBub3dcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAueCA8IDAgfHwgcC54ID49IGV4dGVudCB8fCBwLnkgPCAwIHx8IHAueSA+PSBleHRlbnQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICByZXByb2plY3QocCk7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUucHVzaChwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnlbaV0gPSBsaW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBsaW5lKSB7XG4gICAgICAgICAgICBwcmVwYXJlUG9pbnQocCwgZXh0ZW50U2NhbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGdlb21ldHJ5O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuL2xvYWRfZ2VvbWV0cnkuanMnO1xuXG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxudHlwZSBFdmFsdWF0aW9uRmVhdHVyZSA9IHtcbiAgICArdHlwZTogMSB8IDIgfCAzIHwgJ1Vua25vd24nIHwgJ1BvaW50JyB8ICdNdWx0aVBvaW50JyB8ICdMaW5lU3RyaW5nJyB8ICdNdWx0aUxpbmVTdHJpbmcnIHwgJ1BvbHlnb24nIHwgJ011bHRpUG9seWdvbicsXG4gICAgK2lkPzogYW55LFxuICAgICtwcm9wZXJ0aWVzOiB7W186IHN0cmluZ106IGFueX0sXG4gICAgK3BhdHRlcm5zPzoge1tfOiBzdHJpbmddOiB7XCJtaW5cIjogc3RyaW5nLCBcIm1pZFwiOiBzdHJpbmcsIFwibWF4XCI6IHN0cmluZ319LFxuICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+XG59O1xuXG4vKipcbiAqIENvbnN0cnVjdCBhIG5ldyBmZWF0dXJlIGJhc2VkIG9uIGEgVmVjdG9yVGlsZUZlYXR1cmUgZm9yIGV4cHJlc3Npb24gZXZhbHVhdGlvbiwgdGhlIGdlb21ldHJ5IG9mIHdoaWNoXG4gKiB3aWxsIGJlIGxvYWRlZCBiYXNlZCBvbiBuZWNlc3NpdHkuXG4gKiBAcGFyYW0ge1ZlY3RvclRpbGVGZWF0dXJlfSBmZWF0dXJlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5lZWRHZW9tZXRyeVxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdG9FdmFsdWF0aW9uRmVhdHVyZShmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSwgbmVlZEdlb21ldHJ5OiBib29sZWFuKTogRXZhbHVhdGlvbkZlYXR1cmUge1xuICAgIHJldHVybiB7dHlwZTogZmVhdHVyZS50eXBlLFxuICAgICAgICBpZDogZmVhdHVyZS5pZCxcbiAgICAgICAgcHJvcGVydGllczpmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgIGdlb21ldHJ5OiBuZWVkR2VvbWV0cnkgPyBsb2FkR2VvbWV0cnkoZmVhdHVyZSkgOiBbXX07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0NpcmNsZUxheW91dEFycmF5LCBDaXJjbGVHbG9iZUV4dEFycmF5fSBmcm9tICcuLi9hcnJheV90eXBlcy5qcyc7XG5cbmltcG9ydCB7Y2lyY2xlQXR0cmlidXRlcywgY2lyY2xlR2xvYmVBdHRyaWJ1dGVzRXh0fSBmcm9tICcuL2NpcmNsZV9hdHRyaWJ1dGVzLmpzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL3NlZ21lbnQuanMnO1xuaW1wb3J0IHtQcm9ncmFtQ29uZmlndXJhdGlvblNldH0gZnJvbSAnLi4vcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzJztcbmltcG9ydCB7VHJpYW5nbGVJbmRleEFycmF5fSBmcm9tICcuLi9pbmRleF9hcnJheV90eXBlLmpzJztcbmltcG9ydCBsb2FkR2VvbWV0cnkgZnJvbSAnLi4vbG9hZF9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgdG9FdmFsdWF0aW9uRmVhdHVyZSBmcm9tICcuLi9ldmFsdWF0aW9uX2ZlYXR1cmUuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9leHRlbnQuanMnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgQnVja2V0RmVhdHVyZSxcbiAgICBJbmRleGVkRmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIENpcmNsZVN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIEhlYXRtYXBTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL2luZGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi8uLi9zb3VyY2Uvc291cmNlX3N0YXRlLmpzJztcbmltcG9ydCB0eXBlIHtTcHJpdGVQb3NpdGlvbnN9IGZyb20gJy4uLy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVUcmFuc2Zvcm19IGZyb20gJy4uLy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSBQcm9qZWN0aW9uIGZyb20gJy4uLy4uL2dlby9wcm9qZWN0aW9uL3Byb2plY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUge1ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbmZ1bmN0aW9uIGFkZENpcmNsZVZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgeCwgeSwgZXh0cnVkZVgsIGV4dHJ1ZGVZKSB7XG4gICAgbGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICh4ICogMikgKyAoKGV4dHJ1ZGVYICsgMSkgLyAyKSxcbiAgICAgICAgKHkgKiAyKSArICgoZXh0cnVkZVkgKyAxKSAvIDIpKTtcbn1cblxuZnVuY3Rpb24gYWRkR2xvYmVFeHRWZXJ0ZXgodmVydGV4QXJyYXk6IENpcmNsZUdsb2JlRXh0QXJyYXksIHBvczoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCBub3JtYWw6IFZlYzMpIHtcbiAgICBjb25zdCBlbmNvZGUgPSAxIDw8IDE0O1xuICAgIHZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICBwb3MueCwgcG9zLnksIHBvcy56LFxuICAgICAgICBub3JtYWxbMF0gKiBlbmNvZGUsIG5vcm1hbFsxXSAqIGVuY29kZSwgbm9ybWFsWzJdICogZW5jb2RlKTtcbn1cblxuLyoqXG4gKiBDaXJjbGVzIGFyZSByZXByZXNlbnRlZCBieSB0d28gdHJpYW5nbGVzLlxuICpcbiAqIEVhY2ggY29ybmVyIGhhcyBhIHBvcyB0aGF0IGlzIHRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZSBhbmQgYW4gZXh0cnVzaW9uXG4gKiB2ZWN0b3IgdGhhdCBpcyB3aGVyZSBpdCBwb2ludHMuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBDaXJjbGVCdWNrZXQ8TGF5ZXI6IENpcmNsZVN0eWxlTGF5ZXIgfCBIZWF0bWFwU3R5bGVMYXllcj4gaW1wbGVtZW50cyBCdWNrZXQge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG92ZXJzY2FsaW5nOiBudW1iZXI7XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgbGF5ZXJzOiBBcnJheTxMYXllcj47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PExheWVyPjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgbGF5b3V0VmVydGV4QXJyYXk6IENpcmNsZUxheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuICAgIGdsb2JlRXh0VmVydGV4QXJyYXk6ID9DaXJjbGVHbG9iZUV4dEFycmF5O1xuICAgIGdsb2JlRXh0VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIGhhc1BhdHRlcm46IGJvb2xlYW47XG4gICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb25zOiBQcm9ncmFtQ29uZmlndXJhdGlvblNldDxMYXllcj47XG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgdXBsb2FkZWQ6IGJvb2xlYW47XG4gICAgcHJvamVjdGlvbjogUHJvamVjdGlvblNwZWNpZmljYXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPExheWVyPikge1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb2plY3Rpb24gPSBvcHRpb25zLnByb2plY3Rpb247XG5cbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBDaXJjbGVMYXlvdXRBcnJheSgpO1xuICAgICAgICB0aGlzLmluZGV4QXJyYXkgPSBuZXcgVHJpYW5nbGVJbmRleEFycmF5KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXcgU2VnbWVudFZlY3RvcigpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICAgICAgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKChsKSA9PiBsLmlzU3RhdGVEZXBlbmRlbnQoKSkubWFwKChsKSA9PiBsLmlkKTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlczogQXJyYXk8SW5kZXhlZEZlYXR1cmU+LCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCB0aWxlVHJhbnNmb3JtOiBUaWxlVHJhbnNmb3JtKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlTGF5ZXIgPSB0aGlzLmxheWVyc1swXTtcbiAgICAgICAgY29uc3QgYnVja2V0RmVhdHVyZXMgPSBbXTtcbiAgICAgICAgbGV0IGNpcmNsZVNvcnRLZXkgPSBudWxsO1xuXG4gICAgICAgIC8vIEhlYXRtYXAgbGF5ZXJzIGFyZSBoYW5kbGVkIGluIHRoaXMgYnVja2V0IGFuZCBoYXZlIG5vIGV2YWx1YXRlZCBwcm9wZXJ0aWVzLCBzbyB3ZSBjaGVjayBvdXIgYWNjZXNzXG4gICAgICAgIGlmIChzdHlsZUxheWVyLnR5cGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICBjaXJjbGVTb3J0S2V5ID0gKChzdHlsZUxheWVyOiBhbnkpOiBDaXJjbGVTdHlsZUxheWVyKS5sYXlvdXQuZ2V0KCdjaXJjbGUtc29ydC1rZXknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qge2ZlYXR1cmUsIGlkLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5lZWRHZW9tZXRyeSA9IHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeTtcbiAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRpb25GZWF0dXJlID0gdG9FdmFsdWF0aW9uRmVhdHVyZShmZWF0dXJlLCBuZWVkR2VvbWV0cnkpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLmZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKSwgZXZhbHVhdGlvbkZlYXR1cmUsIGNhbm9uaWNhbCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzb3J0S2V5ID0gY2lyY2xlU29ydEtleSA/XG4gICAgICAgICAgICAgICAgY2lyY2xlU29ydEtleS5ldmFsdWF0ZShldmFsdWF0aW9uRmVhdHVyZSwge30sIGNhbm9uaWNhbCkgOlxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgY29uc3QgYnVja2V0RmVhdHVyZTogQnVja2V0RmVhdHVyZSA9IHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgdHlwZTogZmVhdHVyZS50eXBlLFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IG5lZWRHZW9tZXRyeSA/IGV2YWx1YXRpb25GZWF0dXJlLmdlb21ldHJ5IDogbG9hZEdlb21ldHJ5KGZlYXR1cmUsIGNhbm9uaWNhbCwgdGlsZVRyYW5zZm9ybSksXG4gICAgICAgICAgICAgICAgcGF0dGVybnM6IHt9LFxuICAgICAgICAgICAgICAgIHNvcnRLZXlcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGJ1Y2tldEZlYXR1cmVzLnB1c2goYnVja2V0RmVhdHVyZSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaXJjbGVTb3J0S2V5KSB7XG4gICAgICAgICAgICBidWNrZXRGZWF0dXJlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gYS5zb3J0S2V5IGlzIGFsd2F5cyBhIG51bWJlciB3aGVuIGluIHVzZVxuICAgICAgICAgICAgICAgIHJldHVybiAoKGEuc29ydEtleTogYW55KTogbnVtYmVyKSAtICgoYi5zb3J0S2V5OiBhbnkpOiBudW1iZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZ2xvYmVQcm9qZWN0aW9uOiA/UHJvamVjdGlvbiA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRpbGVUcmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICAvLyBFeHRlbmQgdmVydGV4IGF0dHJpYnV0ZXMgaWYgdGhlIGdsb2JlIHByb2plY3Rpb24gaXMgZW5hYmxlZFxuICAgICAgICAgICAgdGhpcy5nbG9iZUV4dFZlcnRleEFycmF5ID0gbmV3IENpcmNsZUdsb2JlRXh0QXJyYXkoKTtcbiAgICAgICAgICAgIGdsb2JlUHJvamVjdGlvbiA9IHRpbGVUcmFuc2Zvcm0ucHJvamVjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgYnVja2V0RmVhdHVyZSBvZiBidWNrZXRGZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3Qge2dlb21ldHJ5LCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gPSBidWNrZXRGZWF0dXJlO1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVzW2luZGV4XS5mZWF0dXJlO1xuXG4gICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoYnVja2V0RmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBvcHRpb25zLmF2YWlsYWJsZUltYWdlcywgY2Fub25pY2FsLCBnbG9iZVByb2plY3Rpb24pO1xuICAgICAgICAgICAgb3B0aW9ucy5mZWF0dXJlSW5kZXguaW5zZXJ0KGZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwgc291cmNlTGF5ZXJJbmRleCwgdGhpcy5pbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoc3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgaW1hZ2VQb3NpdGlvbnM6IFNwcml0ZVBvc2l0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycywgYXZhaWxhYmxlSW1hZ2VzLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMudXBsb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgY2lyY2xlQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmdsb2JlRXh0VmVydGV4QXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JlRXh0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5nbG9iZUV4dFZlcnRleEFycmF5LCBjaXJjbGVHbG9iZUF0dHJpYnV0ZXNFeHQubWVtYmVycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBsb2FkKGNvbnRleHQpO1xuICAgICAgICB0aGlzLnVwbG9hZGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0VmVydGV4QnVmZmVyKSByZXR1cm47XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLmdsb2JlRXh0VmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmdsb2JlRXh0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIGluZGV4OiBudW1iZXIsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIHByb2plY3Rpb24/OiA/UHJvamVjdGlvbikge1xuICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgZ2VvbWV0cnkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcmluZykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBwb2ludC54O1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBwb2ludC55O1xuXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IGluY2x1ZGUgcG9pbnRzIHRoYXQgYXJlIG91dHNpZGUgdGhlIHRpbGUgYm91bmRhcmllcy5cbiAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeCA+PSBFWFRFTlQgfHwgeSA8IDAgfHwgeSA+PSBFWFRFTlQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBnZW9tZXRyeSB3aWxsIGJlIG9mIHRoZSBQb2ludCB0eXBlLCBhbmQgd2UnbGwgZGVyaXZlXG4gICAgICAgICAgICAgICAgLy8gdHdvIHRyaWFuZ2xlcyBmcm9tIGl0LlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8g4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAgICAgICAgICAgICAgLy8g4pSCIDMgICAgIDIg4pSCXG4gICAgICAgICAgICAgICAgLy8g4pSCICAgICAgICAg4pSCXG4gICAgICAgICAgICAgICAgLy8g4pSCIDAgICAgIDEg4pSCXG4gICAgICAgICAgICAgICAgLy8g4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG5cbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0ZWRQb2ludCA9IHByb2plY3Rpb24ucHJvamVjdFRpbGVQb2ludCh4LCB5LCBjYW5vbmljYWwpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub3JtYWwgPSBwcm9qZWN0aW9uLnVwVmVjdG9yKGNhbm9uaWNhbCwgeCwgeSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5OiBhbnkgPSB0aGlzLmdsb2JlRXh0VmVydGV4QXJyYXk7XG5cbiAgICAgICAgICAgICAgICAgICAgYWRkR2xvYmVFeHRWZXJ0ZXgoYXJyYXksIHByb2plY3RlZFBvaW50LCBub3JtYWwpO1xuICAgICAgICAgICAgICAgICAgICBhZGRHbG9iZUV4dFZlcnRleChhcnJheSwgcHJvamVjdGVkUG9pbnQsIG5vcm1hbCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZEdsb2JlRXh0VmVydGV4KGFycmF5LCBwcm9qZWN0ZWRQb2ludCwgbm9ybWFsKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkR2xvYmVFeHRWZXJ0ZXgoYXJyYXksIHByb2plY3RlZFBvaW50LCBub3JtYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXksIGZlYXR1cmUuc29ydEtleSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAtMSwgLTEpO1xuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAxLCAtMSk7XG4gICAgICAgICAgICAgICAgYWRkQ2lyY2xlVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHgsIHksIDEsIDEpO1xuICAgICAgICAgICAgICAgIGFkZENpcmNsZVZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAtMSwgMSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMSwgaW5kZXggKyAyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMiwgaW5kZXggKyAzKTtcblxuICAgICAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUsIGluZGV4LCB7fSwgYXZhaWxhYmxlSW1hZ2VzLCBjYW5vbmljYWwpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoQ2lyY2xlQnVja2V0LCAnQ2lyY2xlQnVja2V0Jywge29taXQ6IFsnbGF5ZXJzJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgQ2lyY2xlQnVja2V0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtpc0NvdW50ZXJDbG9ja3dpc2V9IGZyb20gJy4vdXRpbC5qcyc7XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuZXhwb3J0IHtwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkUG9pbnQsIHBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uLCBwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lLCBwb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24sIGRpc3RUb1NlZ21lbnRTcXVhcmVkLCBwb2x5Z29uSW50ZXJzZWN0c0JveCwgcG9seWdvbkNvbnRhaW5zUG9pbnR9O1xuXG50eXBlIExpbmUgPSBBcnJheTxQb2ludD47XG50eXBlIE11bHRpTGluZSA9IEFycmF5PExpbmU+O1xudHlwZSBSaW5nID0gQXJyYXk8UG9pbnQ+O1xudHlwZSBQb2x5Z29uID0gQXJyYXk8UG9pbnQ+O1xudHlwZSBNdWx0aVBvbHlnb24gPSBBcnJheTxQb2x5Z29uPjtcblxuZnVuY3Rpb24gcG9seWdvbkludGVyc2VjdHNQb2x5Z29uKHBvbHlnb25BOiBQb2x5Z29uLCBwb2x5Z29uQjogUG9seWdvbik6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbkEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb25CLCBwb2x5Z29uQVtpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbkIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb25BLCBwb2x5Z29uQltpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsaW5lSW50ZXJzZWN0c0xpbmUocG9seWdvbkEsIHBvbHlnb25CKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRQb2ludChwb2x5Z29uOiBQb2x5Z29uLCBwb2ludDogUG9pbnQsIHJhZGl1czogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb24sIHBvaW50KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHBvaW50SW50ZXJzZWN0c0J1ZmZlcmVkTGluZShwb2ludCwgcG9seWdvbiwgcmFkaXVzKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbihwb2x5Z29uOiBQb2x5Z29uLCBtdWx0aVBvbHlnb246IE11bHRpUG9seWdvbik6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHBvbHlnb24ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBtdWx0aVBvbHlnb25Db250YWluc1BvaW50KG11bHRpUG9seWdvbiwgcG9seWdvblswXSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtdWx0aVBvbHlnb24ubGVuZ3RoOyBtKyspIHtcbiAgICAgICAgY29uc3QgcmluZyA9IG11bHRpUG9seWdvblttXTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCByaW5nLmxlbmd0aDsgbisrKSB7XG4gICAgICAgICAgICBpZiAocG9seWdvbkNvbnRhaW5zUG9pbnQocG9seWdvbiwgcmluZ1tuXSkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChtdWx0aVBvbHlnb25Db250YWluc1BvaW50KG11bHRpUG9seWdvbiwgcG9seWdvbltpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbXVsdGlQb2x5Z29uLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGlmIChsaW5lSW50ZXJzZWN0c0xpbmUocG9seWdvbiwgbXVsdGlQb2x5Z29uW2tdKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lKHBvbHlnb246IFBvbHlnb24sIG11bHRpTGluZTogTXVsdGlMaW5lLCByYWRpdXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXVsdGlMaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBtdWx0aUxpbmVbaV07XG5cbiAgICAgICAgaWYgKHBvbHlnb24ubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChwb2x5Z29uLCBsaW5lW2tdKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZUludGVyc2VjdHNCdWZmZXJlZExpbmUocG9seWdvbiwgbGluZSwgcmFkaXVzKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZUludGVyc2VjdHNCdWZmZXJlZExpbmUobGluZUE6IExpbmUsIGxpbmVCOiBMaW5lLCByYWRpdXM6IG51bWJlcikge1xuXG4gICAgaWYgKGxpbmVBLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKGxpbmVJbnRlcnNlY3RzTGluZShsaW5lQSwgbGluZUIpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGFueSBwb2ludCBpbiBlaXRoZXIgbGluZSBpcyB3aXRoaW4gcmFkaXVzIG9mIHRoZSBvdGhlciBsaW5lXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZUIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwb2ludEludGVyc2VjdHNCdWZmZXJlZExpbmUobGluZUJbal0sIGxpbmVBLCByYWRpdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZUEubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKHBvaW50SW50ZXJzZWN0c0J1ZmZlcmVkTGluZShsaW5lQVtrXSwgbGluZUIsIHJhZGl1cykpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZUludGVyc2VjdHNMaW5lKGxpbmVBOiBMaW5lLCBsaW5lQjogTGluZSkge1xuICAgIGlmIChsaW5lQS5sZW5ndGggPT09IDAgfHwgbGluZUIubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgYTAgPSBsaW5lQVtpXTtcbiAgICAgICAgY29uc3QgYTEgPSBsaW5lQVtpICsgMV07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZUIubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBiMCA9IGxpbmVCW2pdO1xuICAgICAgICAgICAgY29uc3QgYjEgPSBsaW5lQltqICsgMV07XG4gICAgICAgICAgICBpZiAobGluZVNlZ21lbnRJbnRlcnNlY3RzTGluZVNlZ21lbnQoYTAsIGExLCBiMCwgYjEpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpbmVTZWdtZW50SW50ZXJzZWN0c0xpbmVTZWdtZW50KGEwOiBQb2ludCwgYTE6IFBvaW50LCBiMDogUG9pbnQsIGIxOiBQb2ludCkge1xuICAgIHJldHVybiBpc0NvdW50ZXJDbG9ja3dpc2UoYTAsIGIwLCBiMSkgIT09IGlzQ291bnRlckNsb2Nrd2lzZShhMSwgYjAsIGIxKSAmJlxuICAgICAgICBpc0NvdW50ZXJDbG9ja3dpc2UoYTAsIGExLCBiMCkgIT09IGlzQ291bnRlckNsb2Nrd2lzZShhMCwgYTEsIGIxKTtcbn1cblxuZnVuY3Rpb24gcG9pbnRJbnRlcnNlY3RzQnVmZmVyZWRMaW5lKHA6IFBvaW50LCBsaW5lOiBMaW5lLCByYWRpdXM6IG51bWJlcikge1xuICAgIGNvbnN0IHJhZGl1c1NxdWFyZWQgPSByYWRpdXMgKiByYWRpdXM7XG5cbiAgICBpZiAobGluZS5sZW5ndGggPT09IDEpIHJldHVybiBwLmRpc3RTcXIobGluZVswXSkgPCByYWRpdXNTcXVhcmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIEZpbmQgbGluZSBzZWdtZW50cyB0aGF0IGhhdmUgYSBkaXN0YW5jZSA8PSByYWRpdXNeMiB0byBwXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgdHJlYXQgdGhlIGxpbmUgYXMgXCJjb250YWluaW5nIHBvaW50IHBcIi5cbiAgICAgICAgY29uc3QgdiA9IGxpbmVbaSAtIDFdLCB3ID0gbGluZVtpXTtcbiAgICAgICAgaWYgKGRpc3RUb1NlZ21lbnRTcXVhcmVkKHAsIHYsIHcpIDwgcmFkaXVzU3F1YXJlZCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gQ29kZSBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE1MDE3MjUvMzMxMzc5LlxuZnVuY3Rpb24gZGlzdFRvU2VnbWVudFNxdWFyZWQocDogUG9pbnQsIHY6IFBvaW50LCB3OiBQb2ludCk6IG51bWJlciB7XG4gICAgY29uc3QgbDIgPSB2LmRpc3RTcXIodyk7XG4gICAgaWYgKGwyID09PSAwKSByZXR1cm4gcC5kaXN0U3FyKHYpO1xuICAgIGNvbnN0IHQgPSAoKHAueCAtIHYueCkgKiAody54IC0gdi54KSArIChwLnkgLSB2LnkpICogKHcueSAtIHYueSkpIC8gbDI7XG4gICAgaWYgKHQgPCAwKSByZXR1cm4gcC5kaXN0U3FyKHYpO1xuICAgIGlmICh0ID4gMSkgcmV0dXJuIHAuZGlzdFNxcih3KTtcbiAgICByZXR1cm4gcC5kaXN0U3FyKHcuc3ViKHYpLl9tdWx0KHQpLl9hZGQodikpO1xufVxuXG4vLyBwb2ludCBpbiBwb2x5Z29uIHJheSBjYXN0aW5nIGFsZ29yaXRobVxuZnVuY3Rpb24gbXVsdGlQb2x5Z29uQ29udGFpbnNQb2ludChyaW5nczogQXJyYXk8UmluZz4sIHA6IFBvaW50KSB7XG4gICAgbGV0IGMgPSBmYWxzZSxcbiAgICAgICAgcmluZywgcDEsIHAyO1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCByaW5ncy5sZW5ndGg7IGsrKykge1xuICAgICAgICByaW5nID0gcmluZ3Nba107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gcmluZy5sZW5ndGggLSAxOyBpIDwgcmluZy5sZW5ndGg7IGogPSBpKyspIHtcbiAgICAgICAgICAgIHAxID0gcmluZ1tpXTtcbiAgICAgICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgICAgIGlmICgoKHAxLnkgPiBwLnkpICE9PSAocDIueSA+IHAueSkpICYmIChwLnggPCAocDIueCAtIHAxLngpICogKHAueSAtIHAxLnkpIC8gKHAyLnkgLSBwMS55KSArIHAxLngpKSB7XG4gICAgICAgICAgICAgICAgYyA9ICFjO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjO1xufVxuXG5mdW5jdGlvbiBwb2x5Z29uQ29udGFpbnNQb2ludChyaW5nOiBSaW5nLCBwOiBQb2ludCk6IGJvb2xlYW4ge1xuICAgIGxldCBjID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSByaW5nLmxlbmd0aCAtIDE7IGkgPCByaW5nLmxlbmd0aDsgaiA9IGkrKykge1xuICAgICAgICBjb25zdCBwMSA9IHJpbmdbaV07XG4gICAgICAgIGNvbnN0IHAyID0gcmluZ1tqXTtcbiAgICAgICAgaWYgKCgocDEueSA+IHAueSkgIT09IChwMi55ID4gcC55KSkgJiYgKHAueCA8IChwMi54IC0gcDEueCkgKiAocC55IC0gcDEueSkgLyAocDIueSAtIHAxLnkpICsgcDEueCkpIHtcbiAgICAgICAgICAgIGMgPSAhYztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gcG9seWdvbkludGVyc2VjdHNCb3gocmluZzogUmluZywgYm94WDE6IG51bWJlciwgYm94WTE6IG51bWJlciwgYm94WDI6IG51bWJlciwgYm94WTI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgcCBvZiByaW5nKSB7XG4gICAgICAgIGlmIChib3hYMSA8PSBwLnggJiZcbiAgICAgICAgICAgIGJveFkxIDw9IHAueSAmJlxuICAgICAgICAgICAgYm94WDIgPj0gcC54ICYmXG4gICAgICAgICAgICBib3hZMiA+PSBwLnkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvcm5lcnMgPSBbXG4gICAgICAgIG5ldyBQb2ludChib3hYMSwgYm94WTEpLFxuICAgICAgICBuZXcgUG9pbnQoYm94WDEsIGJveFkyKSxcbiAgICAgICAgbmV3IFBvaW50KGJveFgyLCBib3hZMiksXG4gICAgICAgIG5ldyBQb2ludChib3hYMiwgYm94WTEpXTtcblxuICAgIGlmIChyaW5nLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb3JuZXIgb2YgY29ybmVycykge1xuICAgICAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHJpbmcsIGNvcm5lcikpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5nLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBwMSA9IHJpbmdbaV07XG4gICAgICAgIGNvbnN0IHAyID0gcmluZ1tpICsgMV07XG4gICAgICAgIGlmIChlZGdlSW50ZXJzZWN0c0JveChwMSwgcDIsIGNvcm5lcnMpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGVkZ2VJbnRlcnNlY3RzQm94KGUxOiBQb2ludCwgZTI6IFBvaW50LCBjb3JuZXJzOiBBcnJheTxQb2ludD4pIHtcbiAgICBjb25zdCB0bCA9IGNvcm5lcnNbMF07XG4gICAgY29uc3QgYnIgPSBjb3JuZXJzWzJdO1xuICAgIC8vIHRoZSBlZGdlIGFuZCBib3ggZG8gbm90IGludGVyc2VjdCBpbiBlaXRoZXIgdGhlIHggb3IgeSBkaW1lbnNpb25zXG4gICAgaWYgKCgoZTEueCA8IHRsLngpICYmIChlMi54IDwgdGwueCkpIHx8XG4gICAgICAgICgoZTEueCA+IGJyLngpICYmIChlMi54ID4gYnIueCkpIHx8XG4gICAgICAgICgoZTEueSA8IHRsLnkpICYmIChlMi55IDwgdGwueSkpIHx8XG4gICAgICAgICgoZTEueSA+IGJyLnkpICYmIChlMi55ID4gYnIueSkpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBjaGVjayBpZiBhbGwgY29ybmVycyBvZiB0aGUgYm94IGFyZSBvbiB0aGUgc2FtZSBzaWRlIG9mIHRoZSBlZGdlXG4gICAgY29uc3QgZGlyID0gaXNDb3VudGVyQ2xvY2t3aXNlKGUxLCBlMiwgY29ybmVyc1swXSk7XG4gICAgcmV0dXJuIGRpciAhPT0gaXNDb3VudGVyQ2xvY2t3aXNlKGUxLCBlMiwgY29ybmVyc1sxXSkgfHxcbiAgICAgICAgZGlyICE9PSBpc0NvdW50ZXJDbG9ja3dpc2UoZTEsIGUyLCBjb3JuZXJzWzJdKSB8fFxuICAgICAgICBkaXIgIT09IGlzQ291bnRlckNsb2Nrd2lzZShlMSwgZTIsIGNvcm5lcnNbM10pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgdHlwZSB7UG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlfSBmcm9tICcuL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBDaXJjbGVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBMaW5lQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1heGltdW1QYWludFZhbHVlKHByb3BlcnR5OiBzdHJpbmcsIGxheWVyOiBTdHlsZUxheWVyLCBidWNrZXQ6IENpcmNsZUJ1Y2tldDwqPiB8IExpbmVCdWNrZXQpOiBudW1iZXIge1xuICAgIGNvbnN0IHZhbHVlID0gKChsYXllci5wYWludDogYW55KS5nZXQocHJvcGVydHkpOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8YW55PikudmFsdWU7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCkuZ2V0TWF4VmFsdWUocHJvcGVydHkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZURpc3RhbmNlKHRyYW5zbGF0ZTogW251bWJlciwgbnVtYmVyXSk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguc3FydCh0cmFuc2xhdGVbMF0gKiB0cmFuc2xhdGVbMF0gKyB0cmFuc2xhdGVbMV0gKiB0cmFuc2xhdGVbMV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlQW5jaG9yOiAndmlld3BvcnQnIHwgJ21hcCcsXG4gICAgICAgICAgICAgICAgICAgYmVhcmluZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBudW1iZXIpOiBBcnJheTxQb2ludD4ge1xuICAgIGlmICghdHJhbnNsYXRlWzBdICYmICF0cmFuc2xhdGVbMV0pIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5R2VvbWV0cnk7XG4gICAgfVxuICAgIGNvbnN0IHB0ID0gUG9pbnQuY29udmVydCh0cmFuc2xhdGUpLl9tdWx0KHBpeGVsc1RvVGlsZVVuaXRzKTtcblxuICAgIGlmICh0cmFuc2xhdGVBbmNob3IgPT09IFwidmlld3BvcnRcIikge1xuICAgICAgICBwdC5fcm90YXRlKC1iZWFyaW5nKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeUdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gcXVlcnlHZW9tZXRyeVtpXTtcbiAgICAgICAgdHJhbnNsYXRlZC5wdXNoKHBvaW50LnN1YihwdCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNsYXRlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbGVzcGFjZVRyYW5zbGF0ZSh0cmFuc2xhdGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUFuY2hvcjogJ3ZpZXdwb3J0JyB8ICdtYXAnLFxuICAgICAgICAgICAgICAgICAgICBiZWFyaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzOiBudW1iZXIpOiBQb2ludCB7XG4gICAgY29uc3QgcHQgPSBQb2ludC5jb252ZXJ0KHRyYW5zbGF0ZSkuX211bHQocGl4ZWxzVG9UaWxlVW5pdHMpO1xuXG4gICAgaWYgKHRyYW5zbGF0ZUFuY2hvciA9PT0gXCJ2aWV3cG9ydFwiKSB7XG4gICAgICAgIHB0Ll9yb3RhdGUoLWJlYXJpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiBwdDtcbn1cbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gQGZsb3dcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcblxuaW1wb3J0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBDb2xvclJhbXBQcm9wZXJ0eVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcblxuaW1wb3J0IHR5cGUgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cbmV4cG9ydCB0eXBlIExheW91dFByb3BzID0ge3xcbiAgICBcImNpcmNsZS1zb3J0LWtleVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBsYXlvdXQ6IFByb3BlcnRpZXM8TGF5b3V0UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiY2lyY2xlLXNvcnQta2V5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X2NpcmNsZVwiXVtcImNpcmNsZS1zb3J0LWtleVwiXSksXG59KTtcblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJjaXJjbGUtcmFkaXVzXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiY2lyY2xlLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJjaXJjbGUtYmx1clwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImNpcmNsZS1vcGFjaXR5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiY2lyY2xlLXRyYW5zbGF0ZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBcImNpcmNsZS10cmFuc2xhdGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwiY2lyY2xlLXBpdGNoLXNjYWxlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwiY2lyY2xlLXBpdGNoLWFsaWdubWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiPixcbiAgICBcImNpcmNsZS1zdHJva2Utd2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJjaXJjbGUtc3Ryb2tlLW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJjaXJjbGUtcmFkaXVzXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXJhZGl1c1wiXSksXG4gICAgXCJjaXJjbGUtY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtY29sb3JcIl0pLFxuICAgIFwiY2lyY2xlLWJsdXJcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9jaXJjbGVcIl1bXCJjaXJjbGUtYmx1clwiXSksXG4gICAgXCJjaXJjbGUtb3BhY2l0eVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1vcGFjaXR5XCJdKSxcbiAgICBcImNpcmNsZS10cmFuc2xhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS10cmFuc2xhdGVcIl0pLFxuICAgIFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS10cmFuc2xhdGUtYW5jaG9yXCJdKSxcbiAgICBcImNpcmNsZS1waXRjaC1zY2FsZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXBpdGNoLXNjYWxlXCJdKSxcbiAgICBcImNpcmNsZS1waXRjaC1hbGlnbm1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1waXRjaC1hbGlnbm1lbnRcIl0pLFxuICAgIFwiY2lyY2xlLXN0cm9rZS13aWR0aFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1zdHJva2Utd2lkdGhcIl0pLFxuICAgIFwiY2lyY2xlLXN0cm9rZS1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2NpcmNsZVwiXVtcImNpcmNsZS1zdHJva2UtY29sb3JcIl0pLFxuICAgIFwiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfY2lyY2xlXCJdW1wiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCJdKSxcbn0pO1xuXG4vLyBOb3RlOiB3aXRob3V0IGFkZGluZyB0aGUgZXhwbGljaXQgdHlwZSBhbm5vdGF0aW9uLCBGbG93IGluZmVycyB3ZWFrZXIgdHlwZXNcbi8vIGZvciB0aGVzZSBvYmplY3RzIGZyb20gdGhlaXIgdXNlIGluIHRoZSBjb25zdHJ1Y3RvciB0byBTdHlsZUxheWVyLCBhc1xuLy8ge2xheW91dD86IFByb3BlcnRpZXM8Li4uPiwgcGFpbnQ6IFByb3BlcnRpZXM8Li4uPn1cbmV4cG9ydCBkZWZhdWx0ICh7IHBhaW50LCBsYXlvdXQgfTogJEV4YWN0PHtcbiAgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4sIGxheW91dDogUHJvcGVydGllczxMYXlvdXRQcm9wcz5cbn0+KTtcbiIsIi8qKlxuICogQ29tbW9uIHV0aWxpdGllc1xuICogQG1vZHVsZSBnbE1hdHJpeFxuICovXG4vLyBDb25maWd1cmF0aW9uIENvbnN0YW50c1xuZXhwb3J0IHZhciBFUFNJTE9OID0gMC4wMDAwMDE7XG5leHBvcnQgdmFyIEFSUkFZX1RZUEUgPSB0eXBlb2YgRmxvYXQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IEZsb2F0MzJBcnJheSA6IEFycmF5O1xuZXhwb3J0IHZhciBSQU5ET00gPSBNYXRoLnJhbmRvbTtcbi8qKlxuICogU2V0cyB0aGUgdHlwZSBvZiBhcnJheSB1c2VkIHdoZW4gY3JlYXRpbmcgbmV3IHZlY3RvcnMgYW5kIG1hdHJpY2VzXG4gKlxuICogQHBhcmFtIHtGbG9hdDMyQXJyYXlDb25zdHJ1Y3RvciB8IEFycmF5Q29uc3RydWN0b3J9IHR5cGUgQXJyYXkgdHlwZSwgc3VjaCBhcyBGbG9hdDMyQXJyYXkgb3IgQXJyYXlcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0TWF0cml4QXJyYXlUeXBlKHR5cGUpIHtcbiAgQVJSQVlfVFlQRSA9IHR5cGU7XG59XG52YXIgZGVncmVlID0gTWF0aC5QSSAvIDE4MDtcbi8qKlxuICogQ29udmVydCBEZWdyZWUgVG8gUmFkaWFuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQW5nbGUgaW4gRGVncmVlc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0b1JhZGlhbihhKSB7XG4gIHJldHVybiBhICogZGVncmVlO1xufVxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIG9yIG5vdCB0aGUgYXJndW1lbnRzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSB2YWx1ZSwgd2l0aGluIGFuIGFic29sdXRlXG4gKiBvciByZWxhdGl2ZSB0b2xlcmFuY2Ugb2YgZ2xNYXRyaXguRVBTSUxPTiAoYW4gYWJzb2x1dGUgdG9sZXJhbmNlIGlzIHVzZWQgZm9yIHZhbHVlcyBsZXNzXG4gKiB0aGFuIG9yIGVxdWFsIHRvIDEuMCwgYW5kIGEgcmVsYXRpdmUgdG9sZXJhbmNlIGlzIHVzZWQgZm9yIGxhcmdlciB2YWx1ZXMpXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGEgVGhlIGZpcnN0IG51bWJlciB0byB0ZXN0LlxuICogQHBhcmFtIHtOdW1iZXJ9IGIgVGhlIHNlY29uZCBudW1iZXIgdG8gdGVzdC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBudW1iZXJzIGFyZSBhcHByb3hpbWF0ZWx5IGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYSksIE1hdGguYWJzKGIpKTtcbn1cbmlmICghTWF0aC5oeXBvdCkgTWF0aC5oeXBvdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHkgPSAwLFxuICAgICAgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgd2hpbGUgKGktLSkge1xuICAgIHkgKz0gYXJndW1lbnRzW2ldICogYXJndW1lbnRzW2ldO1xuICB9XG5cbiAgcmV0dXJuIE1hdGguc3FydCh5KTtcbn07IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcbiAqIDJ4MiBNYXRyaXhcbiAqIEBtb2R1bGUgbWF0MlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQyXG4gKlxuICogQHJldHVybnMge21hdDJ9IGEgbmV3IDJ4MiBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICB9XG5cbiAgb3V0WzBdID0gMTtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0Mn0gYSBuZXcgMngyIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgYSBtYXQyIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlIGEgbmV3IG1hdDIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHJldHVybnMge21hdDJ9IG91dCBBIG5ldyAyeDIgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0xMDtcbiAgb3V0WzNdID0gbTExO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTEwLCBtMTEpIHtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0xMDtcbiAgb3V0WzNdID0gbTExO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlKG91dCwgYSkge1xuICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlXG4gIC8vIHNvbWUgdmFsdWVzXG4gIGlmIChvdXQgPT09IGEpIHtcbiAgICB2YXIgYTEgPSBhWzFdO1xuICAgIG91dFsxXSA9IGFbMl07XG4gICAgb3V0WzJdID0gYTE7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzJdO1xuICAgIG91dFsyXSA9IGFbMV07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEludmVydHMgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBhMCAqIGEzIC0gYTIgKiBhMTtcblxuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSBhMyAqIGRldDtcbiAgb3V0WzFdID0gLWExICogZGV0O1xuICBvdXRbMl0gPSAtYTIgKiBkZXQ7XG4gIG91dFszXSA9IGEwICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRqb2ludChvdXQsIGEpIHtcbiAgLy8gQ2FjaGluZyB0aGlzIHZhbHVlIGlzIG5lc3NlY2FyeSBpZiBvdXQgPT0gYVxuICB2YXIgYTAgPSBhWzBdO1xuICBvdXRbMF0gPSBhWzNdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIG91dFszXSA9IGEwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHJldHVybiBhWzBdICogYVszXSAtIGFbMl0gKiBhWzFdO1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQyJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXTtcbiAgb3V0WzBdID0gYTAgKiBiMCArIGEyICogYjE7XG4gIG91dFsxXSA9IGExICogYjAgKyBhMyAqIGIxO1xuICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgb3V0WzNdID0gYTEgKiBiMiArIGEzICogYjM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyIGJ5IHRoZSBnaXZlbiBhbmdsZVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgcmFkKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBhMCAqIGMgKyBhMiAqIHM7XG4gIG91dFsxXSA9IGExICogYyArIGEzICogcztcbiAgb3V0WzJdID0gYTAgKiAtcyArIGEyICogYztcbiAgb3V0WzNdID0gYTEgKiAtcyArIGEzICogYztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIHYpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXTtcbiAgdmFyIHYwID0gdlswXSxcbiAgICAgIHYxID0gdlsxXTtcbiAgb3V0WzBdID0gYTAgKiB2MDtcbiAgb3V0WzFdID0gYTEgKiB2MDtcbiAgb3V0WzJdID0gYTIgKiB2MTtcbiAgb3V0WzNdID0gYTMgKiB2MTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQyLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDIucm90YXRlKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgbWF0MiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSBzO1xuICBvdXRbMl0gPSAtcztcbiAgb3V0WzNdID0gYztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQyLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDIuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCBtYXQyIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gdlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJtYXQyKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiKVwiO1xufVxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9iKGEpIHtcbiAgcmV0dXJuIE1hdGguaHlwb3QoYVswXSwgYVsxXSwgYVsyXSwgYVszXSk7XG59XG4vKipcbiAqIFJldHVybnMgTCwgRCBhbmQgVSBtYXRyaWNlcyAoTG93ZXIgdHJpYW5ndWxhciwgRGlhZ29uYWwgYW5kIFVwcGVyIHRyaWFuZ3VsYXIpIGJ5IGZhY3Rvcml6aW5nIHRoZSBpbnB1dCBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBMIHRoZSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IEQgdGhlIGRpYWdvbmFsIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IFUgdGhlIHVwcGVyIHRyaWFuZ3VsYXIgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgaW5wdXQgbWF0cml4IHRvIGZhY3Rvcml6ZVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBMRFUoTCwgRCwgVSwgYSkge1xuICBMWzJdID0gYVsyXSAvIGFbMF07XG4gIFVbMF0gPSBhWzBdO1xuICBVWzFdID0gYVsxXTtcbiAgVVszXSA9IGFbM10gLSBMWzJdICogVVsxXTtcbiAgcmV0dXJuIFtMLCBELCBVXTtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MidzXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU3VidHJhY3RzIG1hdHJpeCBiIGZyb20gbWF0cml4IGFcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJ0cmFjdChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC0gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM107XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJ9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSk7XG59XG4vKipcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gbWF0MidzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzdWIgPSBzdWJ0cmFjdDsiLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxuICogMngzIE1hdHJpeFxuICogQG1vZHVsZSBtYXQyZFxuICogQGRlc2NyaXB0aW9uXG4gKiBBIG1hdDJkIGNvbnRhaW5zIHNpeCBlbGVtZW50cyBkZWZpbmVkIGFzOlxuICogPHByZT5cbiAqIFthLCBiLFxuICogIGMsIGQsXG4gKiAgdHgsIHR5XVxuICogPC9wcmU+XG4gKiBUaGlzIGlzIGEgc2hvcnQgZm9ybSBmb3IgdGhlIDN4MyBtYXRyaXg6XG4gKiA8cHJlPlxuICogW2EsIGIsIDAsXG4gKiAgYywgZCwgMCxcbiAqICB0eCwgdHksIDFdXG4gKiA8L3ByZT5cbiAqIFRoZSBsYXN0IGNvbHVtbiBpcyBpZ25vcmVkIHNvIHRoZSBhcnJheSBpcyBzaG9ydGVyIGFuZCBvcGVyYXRpb25zIGFyZSBmYXN0ZXIuXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJkXG4gKlxuICogQHJldHVybnMge21hdDJkfSBhIG5ldyAyeDMgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDYpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbM10gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDJkIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIG1hdHJpeCB0byBjbG9uZVxuICogQHJldHVybnMge21hdDJkfSBhIG5ldyAyeDMgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDYpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MmQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgYSBtYXQyZCB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlIGEgbmV3IG1hdDJkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIENvbXBvbmVudCBBIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgQ29tcG9uZW50IEIgKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gYyBDb21wb25lbnQgQyAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBkIENvbXBvbmVudCBEIChpbmRleCAzKVxuICogQHBhcmFtIHtOdW1iZXJ9IHR4IENvbXBvbmVudCBUWCAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eSBDb21wb25lbnQgVFkgKGluZGV4IDUpXG4gKiBAcmV0dXJucyB7bWF0MmR9IEEgbmV3IG1hdDJkXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoYSwgYiwgYywgZCwgdHgsIHR5KSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcbiAgb3V0WzBdID0gYTtcbiAgb3V0WzFdID0gYjtcbiAgb3V0WzJdID0gYztcbiAgb3V0WzNdID0gZDtcbiAgb3V0WzRdID0gdHg7XG4gIG91dFs1XSA9IHR5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQyZCB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge051bWJlcn0gYSBDb21wb25lbnQgQSAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIENvbXBvbmVudCBCIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IGMgQ29tcG9uZW50IEMgKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gZCBDb21wb25lbnQgRCAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eCBDb21wb25lbnQgVFggKGluZGV4IDQpXG4gKiBAcGFyYW0ge051bWJlcn0gdHkgQ29tcG9uZW50IFRZIChpbmRleCA1KVxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG91dCwgYSwgYiwgYywgZCwgdHgsIHR5KSB7XG4gIG91dFswXSA9IGE7XG4gIG91dFsxXSA9IGI7XG4gIG91dFsyXSA9IGM7XG4gIG91dFszXSA9IGQ7XG4gIG91dFs0XSA9IHR4O1xuICBvdXRbNV0gPSB0eTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydChvdXQsIGEpIHtcbiAgdmFyIGFhID0gYVswXSxcbiAgICAgIGFiID0gYVsxXSxcbiAgICAgIGFjID0gYVsyXSxcbiAgICAgIGFkID0gYVszXTtcbiAgdmFyIGF0eCA9IGFbNF0sXG4gICAgICBhdHkgPSBhWzVdO1xuICB2YXIgZGV0ID0gYWEgKiBhZCAtIGFiICogYWM7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gYWQgKiBkZXQ7XG4gIG91dFsxXSA9IC1hYiAqIGRldDtcbiAgb3V0WzJdID0gLWFjICogZGV0O1xuICBvdXRbM10gPSBhYSAqIGRldDtcbiAgb3V0WzRdID0gKGFjICogYXR5IC0gYWQgKiBhdHgpICogZGV0O1xuICBvdXRbNV0gPSAoYWIgKiBhdHggLSBhYSAqIGF0eSkgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5hbnQoYSkge1xuICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzFdICogYVsyXTtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MmQnc1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXSxcbiAgICAgIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XTtcbiAgb3V0WzBdID0gYTAgKiBiMCArIGEyICogYjE7XG4gIG91dFsxXSA9IGExICogYjAgKyBhMyAqIGIxO1xuICBvdXRbMl0gPSBhMCAqIGIyICsgYTIgKiBiMztcbiAgb3V0WzNdID0gYTEgKiBiMiArIGEzICogYjM7XG4gIG91dFs0XSA9IGEwICogYjQgKyBhMiAqIGI1ICsgYTQ7XG4gIG91dFs1XSA9IGExICogYjQgKyBhMyAqIGI1ICsgYTU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyZCBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdO1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYTAgKiBjICsgYTIgKiBzO1xuICBvdXRbMV0gPSBhMSAqIGMgKyBhMyAqIHM7XG4gIG91dFsyXSA9IGEwICogLXMgKyBhMiAqIGM7XG4gIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gIG91dFs0XSA9IGE0O1xuICBvdXRbNV0gPSBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyZCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciB2MCA9IHZbMF0sXG4gICAgICB2MSA9IHZbMV07XG4gIG91dFswXSA9IGEwICogdjA7XG4gIG91dFsxXSA9IGExICogdjA7XG4gIG91dFsyXSA9IGEyICogdjE7XG4gIG91dFszXSA9IGEzICogdjE7XG4gIG91dFs0XSA9IGE0O1xuICBvdXRbNV0gPSBhNTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNsYXRlcyB0aGUgbWF0MmQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzJcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgdGhlIHZlYzIgdG8gdHJhbnNsYXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBhLCB2KSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM10sXG4gICAgICBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV07XG4gIHZhciB2MCA9IHZbMF0sXG4gICAgICB2MSA9IHZbMV07XG4gIG91dFswXSA9IGEwO1xuICBvdXRbMV0gPSBhMTtcbiAgb3V0WzJdID0gYTI7XG4gIG91dFszXSA9IGEzO1xuICBvdXRbNF0gPSBhMCAqIHYwICsgYTIgKiB2MSArIGE0O1xuICBvdXRbNV0gPSBhMSAqIHYwICsgYTMgKiB2MSArIGE1O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDJkLnJvdGF0ZShkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21Sb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gcztcbiAgb3V0WzJdID0gLXM7XG4gIG91dFszXSA9IGM7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0MmQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0MmQuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gdlsxXTtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHRyYW5zbGF0aW9uXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0MmQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0MmQudHJhbnNsYXRlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IG1hdDJkIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UcmFuc2xhdGlvbihvdXQsIHYpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgb3V0WzRdID0gdlswXTtcbiAgb3V0WzVdID0gdlsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcIm1hdDJkKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiLCBcIiArIGFbNF0gKyBcIiwgXCIgKyBhWzVdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgRnJvYmVuaXVzIG5vcm0gb2YgYSBtYXQyZFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIDEpO1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQyZCdzXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU3VidHJhY3RzIG1hdHJpeCBiIGZyb20gbWF0cml4IGFcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICBvdXRbNF0gPSBhWzRdIC0gYls0XTtcbiAgb3V0WzVdID0gYVs1XSAtIGJbNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDJkfSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgbWF0cml4J3MgZWxlbWVudHMgYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgb3V0WzRdID0gYVs0XSAqIGI7XG4gIG91dFs1XSA9IGFbNV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQyZCdzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIncyBlbGVtZW50cyBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhckFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdICogc2NhbGU7XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXSAmJiBhWzRdID09PSBiWzRdICYmIGFbNV0gPT09IGJbNV07XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXSxcbiAgICAgIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJiBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiYgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpO1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDJkLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcbiAqIDN4MyBNYXRyaXhcbiAqIEBtb2R1bGUgbWF0M1xuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQzXG4gKlxuICogQHJldHVybnMge21hdDN9IGEgbmV3IDN4MyBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOSk7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gIH1cblxuICBvdXRbMF0gPSAxO1xuICBvdXRbNF0gPSAxO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDb3BpZXMgdGhlIHVwcGVyLWxlZnQgM3gzIHZhbHVlcyBpbnRvIHRoZSBnaXZlbiBtYXQzLlxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgM3gzIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgICB0aGUgc291cmNlIDR4NCBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbU1hdDQob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbNF07XG4gIG91dFs0XSA9IGFbNV07XG4gIG91dFs1XSA9IGFbNl07XG4gIG91dFs2XSA9IGFbOF07XG4gIG91dFs3XSA9IGFbOV07XG4gIG91dFs4XSA9IGFbMTBdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDMgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSBhWzRdO1xuICBvdXRbNV0gPSBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MyB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBtYXQzIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggOClcbiAqIEByZXR1cm5zIHttYXQzfSBBIG5ldyBtYXQzXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMobTAwLCBtMDEsIG0wMiwgbTEwLCBtMTEsIG0xMiwgbTIwLCBtMjEsIG0yMikge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOSk7XG4gIG91dFswXSA9IG0wMDtcbiAgb3V0WzFdID0gbTAxO1xuICBvdXRbMl0gPSBtMDI7XG4gIG91dFszXSA9IG0xMDtcbiAgb3V0WzRdID0gbTExO1xuICBvdXRbNV0gPSBtMTI7XG4gIG91dFs2XSA9IG0yMDtcbiAgb3V0WzddID0gbTIxO1xuICBvdXRbOF0gPSBtMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDMgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDQpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDUpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDYpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIxIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDEgcG9zaXRpb24gKGluZGV4IDcpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDgpXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIG0wMCwgbTAxLCBtMDIsIG0xMCwgbTExLCBtMTIsIG0yMCwgbTIxLCBtMjIpIHtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0wMjtcbiAgb3V0WzNdID0gbTEwO1xuICBvdXRbNF0gPSBtMTE7XG4gIG91dFs1XSA9IG0xMjtcbiAgb3V0WzZdID0gbTIwO1xuICBvdXRbN10gPSBtMjE7XG4gIG91dFs4XSA9IG0yMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgbWF0MyB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkob3V0KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDE7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2Uob3V0LCBhKSB7XG4gIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgaWYgKG91dCA9PT0gYSkge1xuICAgIHZhciBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMTIgPSBhWzVdO1xuICAgIG91dFsxXSA9IGFbM107XG4gICAgb3V0WzJdID0gYVs2XTtcbiAgICBvdXRbM10gPSBhMDE7XG4gICAgb3V0WzVdID0gYVs3XTtcbiAgICBvdXRbNl0gPSBhMDI7XG4gICAgb3V0WzddID0gYTEyO1xuICB9IGVsc2Uge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVszXTtcbiAgICBvdXRbMl0gPSBhWzZdO1xuICAgIG91dFszXSA9IGFbMV07XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzddO1xuICAgIG91dFs2XSA9IGFbMl07XG4gICAgb3V0WzddID0gYVs1XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdO1xuICB2YXIgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdO1xuICB2YXIgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdO1xuICB2YXIgYjAxID0gYTIyICogYTExIC0gYTEyICogYTIxO1xuICB2YXIgYjExID0gLWEyMiAqIGExMCArIGExMiAqIGEyMDtcbiAgdmFyIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMDsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBhMDAgKiBiMDEgKyBhMDEgKiBiMTEgKyBhMDIgKiBiMjE7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gYjAxICogZGV0O1xuICBvdXRbMV0gPSAoLWEyMiAqIGEwMSArIGEwMiAqIGEyMSkgKiBkZXQ7XG4gIG91dFsyXSA9IChhMTIgKiBhMDEgLSBhMDIgKiBhMTEpICogZGV0O1xuICBvdXRbM10gPSBiMTEgKiBkZXQ7XG4gIG91dFs0XSA9IChhMjIgKiBhMDAgLSBhMDIgKiBhMjApICogZGV0O1xuICBvdXRbNV0gPSAoLWExMiAqIGEwMCArIGEwMiAqIGExMCkgKiBkZXQ7XG4gIG91dFs2XSA9IGIyMSAqIGRldDtcbiAgb3V0WzddID0gKC1hMjEgKiBhMDAgKyBhMDEgKiBhMjApICogZGV0O1xuICBvdXRbOF0gPSAoYTExICogYTAwIC0gYTAxICogYTEwKSAqIGRldDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkam9pbnQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl07XG4gIHZhciBhMTAgPSBhWzNdLFxuICAgICAgYTExID0gYVs0XSxcbiAgICAgIGExMiA9IGFbNV07XG4gIHZhciBhMjAgPSBhWzZdLFxuICAgICAgYTIxID0gYVs3XSxcbiAgICAgIGEyMiA9IGFbOF07XG4gIG91dFswXSA9IGExMSAqIGEyMiAtIGExMiAqIGEyMTtcbiAgb3V0WzFdID0gYTAyICogYTIxIC0gYTAxICogYTIyO1xuICBvdXRbMl0gPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTE7XG4gIG91dFszXSA9IGExMiAqIGEyMCAtIGExMCAqIGEyMjtcbiAgb3V0WzRdID0gYTAwICogYTIyIC0gYTAyICogYTIwO1xuICBvdXRbNV0gPSBhMDIgKiBhMTAgLSBhMDAgKiBhMTI7XG4gIG91dFs2XSA9IGExMCAqIGEyMSAtIGExMSAqIGEyMDtcbiAgb3V0WzddID0gYTAxICogYTIwIC0gYTAwICogYTIxO1xuICBvdXRbOF0gPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluYW50KGEpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXTtcbiAgdmFyIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XTtcbiAgdmFyIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XTtcbiAgcmV0dXJuIGEwMCAqIChhMjIgKiBhMTEgLSBhMTIgKiBhMjEpICsgYTAxICogKC1hMjIgKiBhMTAgKyBhMTIgKiBhMjApICsgYTAyICogKGEyMSAqIGExMCAtIGExMSAqIGEyMCk7XG59XG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDMnc1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdO1xuICB2YXIgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdO1xuICB2YXIgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdO1xuICB2YXIgYjAwID0gYlswXSxcbiAgICAgIGIwMSA9IGJbMV0sXG4gICAgICBiMDIgPSBiWzJdO1xuICB2YXIgYjEwID0gYlszXSxcbiAgICAgIGIxMSA9IGJbNF0sXG4gICAgICBiMTIgPSBiWzVdO1xuICB2YXIgYjIwID0gYls2XSxcbiAgICAgIGIyMSA9IGJbN10sXG4gICAgICBiMjIgPSBiWzhdO1xuICBvdXRbMF0gPSBiMDAgKiBhMDAgKyBiMDEgKiBhMTAgKyBiMDIgKiBhMjA7XG4gIG91dFsxXSA9IGIwMCAqIGEwMSArIGIwMSAqIGExMSArIGIwMiAqIGEyMTtcbiAgb3V0WzJdID0gYjAwICogYTAyICsgYjAxICogYTEyICsgYjAyICogYTIyO1xuICBvdXRbM10gPSBiMTAgKiBhMDAgKyBiMTEgKiBhMTAgKyBiMTIgKiBhMjA7XG4gIG91dFs0XSA9IGIxMCAqIGEwMSArIGIxMSAqIGExMSArIGIxMiAqIGEyMTtcbiAgb3V0WzVdID0gYjEwICogYTAyICsgYjExICogYTEyICsgYjEyICogYTIyO1xuICBvdXRbNl0gPSBiMjAgKiBhMDAgKyBiMjEgKiBhMTAgKyBiMjIgKiBhMjA7XG4gIG91dFs3XSA9IGIyMCAqIGEwMSArIGIyMSAqIGExMSArIGIyMiAqIGEyMTtcbiAgb3V0WzhdID0gYjIwICogYTAyICsgYjIxICogYTEyICsgYjIyICogYTIyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2xhdGUgYSBtYXQzIGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTEwID0gYVszXSxcbiAgICAgIGExMSA9IGFbNF0sXG4gICAgICBhMTIgPSBhWzVdLFxuICAgICAgYTIwID0gYVs2XSxcbiAgICAgIGEyMSA9IGFbN10sXG4gICAgICBhMjIgPSBhWzhdLFxuICAgICAgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXTtcbiAgb3V0WzBdID0gYTAwO1xuICBvdXRbMV0gPSBhMDE7XG4gIG91dFsyXSA9IGEwMjtcbiAgb3V0WzNdID0gYTEwO1xuICBvdXRbNF0gPSBhMTE7XG4gIG91dFs1XSA9IGExMjtcbiAgb3V0WzZdID0geCAqIGEwMCArIHkgKiBhMTAgKyBhMjA7XG4gIG91dFs3XSA9IHggKiBhMDEgKyB5ICogYTExICsgYTIxO1xuICBvdXRbOF0gPSB4ICogYTAyICsgeSAqIGExMiArIGEyMjtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIG1hdDMgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGExMCA9IGFbM10sXG4gICAgICBhMTEgPSBhWzRdLFxuICAgICAgYTEyID0gYVs1XSxcbiAgICAgIGEyMCA9IGFbNl0sXG4gICAgICBhMjEgPSBhWzddLFxuICAgICAgYTIyID0gYVs4XSxcbiAgICAgIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGMgKiBhMDAgKyBzICogYTEwO1xuICBvdXRbMV0gPSBjICogYTAxICsgcyAqIGExMTtcbiAgb3V0WzJdID0gYyAqIGEwMiArIHMgKiBhMTI7XG4gIG91dFszXSA9IGMgKiBhMTAgLSBzICogYTAwO1xuICBvdXRbNF0gPSBjICogYTExIC0gcyAqIGEwMTtcbiAgb3V0WzVdID0gYyAqIGExMiAtIHMgKiBhMDI7XG4gIG91dFs2XSA9IGEyMDtcbiAgb3V0WzddID0gYTIxO1xuICBvdXRbOF0gPSBhMjI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MyBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgdGhlIHZlYzIgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICoqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gIHZhciB4ID0gdlswXSxcbiAgICAgIHkgPSB2WzFdO1xuICBvdXRbMF0gPSB4ICogYVswXTtcbiAgb3V0WzFdID0geCAqIGFbMV07XG4gIG91dFsyXSA9IHggKiBhWzJdO1xuICBvdXRbM10gPSB5ICogYVszXTtcbiAgb3V0WzRdID0geSAqIGFbNF07XG4gIG91dFs1XSA9IHkgKiBhWzVdO1xuICBvdXRbNl0gPSBhWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICBvdXRbOF0gPSBhWzhdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3IgdHJhbnNsYXRpb25cbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQzLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDMudHJhbnNsYXRlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21UcmFuc2xhdGlvbihvdXQsIHYpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gdlswXTtcbiAgb3V0WzddID0gdlsxXTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgZ2l2ZW4gYW5nbGVcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQzLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDMucm90YXRlKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSBzO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAtcztcbiAgb3V0WzRdID0gYztcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHNjYWxpbmdcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQzLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDMuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gdiBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NhbGluZyhvdXQsIHYpIHtcbiAgb3V0WzBdID0gdlswXTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gdlsxXTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgZnJvbSBhIG1hdDJkIGludG8gYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQyZH0gYSB0aGUgbWF0cml4IHRvIGNvcHlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQyZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gYVsyXTtcbiAgb3V0WzRdID0gYVszXTtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gYVs0XTtcbiAgb3V0WzddID0gYVs1XTtcbiAgb3V0WzhdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyBhIDN4MyBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIFF1YXRlcm5pb24gdG8gY3JlYXRlIG1hdHJpeCBmcm9tXG4gKlxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUXVhdChvdXQsIHEpIHtcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB5eCA9IHkgKiB4MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgenggPSB6ICogeDI7XG4gIHZhciB6eSA9IHogKiB5MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICBvdXRbMF0gPSAxIC0geXkgLSB6ejtcbiAgb3V0WzNdID0geXggLSB3ejtcbiAgb3V0WzZdID0genggKyB3eTtcbiAgb3V0WzFdID0geXggKyB3ejtcbiAgb3V0WzRdID0gMSAtIHh4IC0geno7XG4gIG91dFs3XSA9IHp5IC0gd3g7XG4gIG91dFsyXSA9IHp4IC0gd3k7XG4gIG91dFs1XSA9IHp5ICsgd3g7XG4gIG91dFs4XSA9IDEgLSB4eCAtIHl5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIGEgM3gzIG5vcm1hbCBtYXRyaXggKHRyYW5zcG9zZSBpbnZlcnNlKSBmcm9tIHRoZSA0eDQgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgTWF0NCB0byBkZXJpdmUgdGhlIG5vcm1hbCBtYXRyaXggZnJvbVxuICpcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsRnJvbU1hdDQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdO1xuICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwO1xuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwO1xuICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExO1xuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyO1xuICB2YXIgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwO1xuICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwO1xuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwO1xuICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxO1xuICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxO1xuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyOyAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG5cbiAgdmFyIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcblxuICBpZiAoIWRldCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZGV0ID0gMS4wIC8gZGV0O1xuICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDtcbiAgb3V0WzFdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gIG91dFsyXSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0O1xuICBvdXRbM10gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgb3V0WzRdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXQ7XG4gIG91dFs1XSA9IChhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDYpICogZGV0O1xuICBvdXRbNl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldDtcbiAgb3V0WzddID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7XG4gIG91dFs4XSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSAyRCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGggV2lkdGggb2YgeW91ciBnbCBjb250ZXh0XG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0IEhlaWdodCBvZiBnbCBjb250ZXh0XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2plY3Rpb24ob3V0LCB3aWR0aCwgaGVpZ2h0KSB7XG4gIG91dFswXSA9IDIgLyB3aWR0aDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gLTIgLyBoZWlnaHQ7XG4gIG91dFs1XSA9IDA7XG4gIG91dFs2XSA9IC0xO1xuICBvdXRbN10gPSAxO1xuICBvdXRbOF0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcIm1hdDMoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIsIFwiICsgYVs0XSArIFwiLCBcIiArIGFbNV0gKyBcIiwgXCIgKyBhWzZdICsgXCIsIFwiICsgYVs3XSArIFwiLCBcIiArIGFbOF0gKyBcIilcIjtcbn1cbi8qKlxuICogUmV0dXJucyBGcm9iZW5pdXMgbm9ybSBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvYihhKSB7XG4gIHJldHVybiBNYXRoLmh5cG90KGFbMF0sIGFbMV0sIGFbMl0sIGFbM10sIGFbNF0sIGFbNV0sIGFbNl0sIGFbN10sIGFbOF0pO1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQzJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl07XG4gIG91dFszXSA9IGFbM10gKyBiWzNdO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgb3V0WzVdID0gYVs1XSArIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdO1xuICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgb3V0WzhdID0gYVs4XSArIGJbOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICBvdXRbNF0gPSBhWzRdIC0gYls0XTtcbiAgb3V0WzVdID0gYVs1XSAtIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gLSBiWzZdO1xuICBvdXRbN10gPSBhWzddIC0gYls3XTtcbiAgb3V0WzhdID0gYVs4XSAtIGJbOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5U2NhbGFyKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgb3V0WzRdID0gYVs0XSAqIGI7XG4gIG91dFs1XSA9IGFbNV0gKiBiO1xuICBvdXRbNl0gPSBhWzZdICogYjtcbiAgb3V0WzddID0gYVs3XSAqIGI7XG4gIG91dFs4XSA9IGFbOF0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byBtYXQzJ3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXJBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICBvdXRbM10gPSBhWzNdICsgYlszXSAqIHNjYWxlO1xuICBvdXRbNF0gPSBhWzRdICsgYls0XSAqIHNjYWxlO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XSAqIHNjYWxlO1xuICBvdXRbNl0gPSBhWzZdICsgYls2XSAqIHNjYWxlO1xuICBvdXRbN10gPSBhWzddICsgYls3XSAqIHNjYWxlO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIGFbNF0gPT09IGJbNF0gJiYgYVs1XSA9PT0gYls1XSAmJiBhWzZdID09PSBiWzZdICYmIGFbN10gPT09IGJbN10gJiYgYVs4XSA9PT0gYls4XTtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0M30gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXSxcbiAgICAgIGEzID0gYVszXSxcbiAgICAgIGE0ID0gYVs0XSxcbiAgICAgIGE1ID0gYVs1XSxcbiAgICAgIGE2ID0gYVs2XSxcbiAgICAgIGE3ID0gYVs3XSxcbiAgICAgIGE4ID0gYVs4XTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXSxcbiAgICAgIGIzID0gYlszXSxcbiAgICAgIGI0ID0gYls0XSxcbiAgICAgIGI1ID0gYls1XSxcbiAgICAgIGI2ID0gYls2XSxcbiAgICAgIGI3ID0gYls3XSxcbiAgICAgIGI4ID0gYls4XTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpICYmIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJiBNYXRoLmFicyhhNCAtIGI0KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiYgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTUpLCBNYXRoLmFicyhiNSkpICYmIE1hdGguYWJzKGE2IC0gYjYpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE2KSwgTWF0aC5hYnMoYjYpKSAmJiBNYXRoLmFicyhhNyAtIGI3KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNyksIE1hdGguYWJzKGI3KSkgJiYgTWF0aC5hYnMoYTggLSBiOCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTgpLCBNYXRoLmFicyhiOCkpO1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDMuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0OyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuLyoqXG4gKiA0eDQgTWF0cml4PGJyPkZvcm1hdDogY29sdW1uLW1ham9yLCB3aGVuIHR5cGVkIG91dCBpdCBsb29rcyBsaWtlIHJvdy1tYWpvcjxicj5UaGUgbWF0cmljZXMgYXJlIGJlaW5nIHBvc3QgbXVsdGlwbGllZC5cbiAqIEBtb2R1bGUgbWF0NFxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQ0XG4gKlxuICogQHJldHVybnMge21hdDR9IGEgbmV3IDR4NCBtYXRyaXhcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMTYpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgfVxuXG4gIG91dFswXSA9IDE7XG4gIG91dFs1XSA9IDE7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQ0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgbWF0cml4XG4gKlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0NH0gYSBuZXcgNHg0IG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZShhKSB7XG4gIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIG91dFs0XSA9IGFbNF07XG4gIG91dFs1XSA9IGFbNV07XG4gIG91dFs2XSA9IGFbNl07XG4gIG91dFs3XSA9IGFbN107XG4gIG91dFs4XSA9IGFbOF07XG4gIG91dFs5XSA9IGFbOV07XG4gIG91dFsxMF0gPSBhWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdO1xuICBvdXRbMTJdID0gYVsxMl07XG4gIG91dFsxM10gPSBhWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdO1xuICBvdXRbMTVdID0gYVsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQ0IHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgb3V0WzhdID0gYVs4XTtcbiAgb3V0WzldID0gYVs5XTtcbiAgb3V0WzEwXSA9IGFbMTBdO1xuICBvdXRbMTFdID0gYVsxMV07XG4gIG91dFsxMl0gPSBhWzEyXTtcbiAgb3V0WzEzXSA9IGFbMTNdO1xuICBvdXRbMTRdID0gYVsxNF07XG4gIG91dFsxNV0gPSBhWzE1XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlIGEgbmV3IG1hdDQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMyBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA1KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA2KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMyBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAzIHBvc2l0aW9uIChpbmRleCA3KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA4KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA5KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjMgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMTEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMwIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDAgcG9zaXRpb24gKGluZGV4IDEyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMSBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzIgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTQpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMzIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDMgcG9zaXRpb24gKGluZGV4IDE1KVxuICogQHJldHVybnMge21hdDR9IEEgbmV3IG1hdDRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVZhbHVlcyhtMDAsIG0wMSwgbTAyLCBtMDMsIG0xMCwgbTExLCBtMTIsIG0xMywgbTIwLCBtMjEsIG0yMiwgbTIzLCBtMzAsIG0zMSwgbTMyLCBtMzMpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDE2KTtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0wMjtcbiAgb3V0WzNdID0gbTAzO1xuICBvdXRbNF0gPSBtMTA7XG4gIG91dFs1XSA9IG0xMTtcbiAgb3V0WzZdID0gbTEyO1xuICBvdXRbN10gPSBtMTM7XG4gIG91dFs4XSA9IG0yMDtcbiAgb3V0WzldID0gbTIxO1xuICBvdXRbMTBdID0gbTIyO1xuICBvdXRbMTFdID0gbTIzO1xuICBvdXRbMTJdID0gbTMwO1xuICBvdXRbMTNdID0gbTMxO1xuICBvdXRbMTRdID0gbTMyO1xuICBvdXRbMTVdID0gbTMzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQ0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMiBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMyBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA1KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMiBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAyIHBvc2l0aW9uIChpbmRleCA2KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMyBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAzIHBvc2l0aW9uIChpbmRleCA3KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMCBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAwIHBvc2l0aW9uIChpbmRleCA4KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMSBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAxIHBvc2l0aW9uIChpbmRleCA5KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMiBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjMgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMTEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMwIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDAgcG9zaXRpb24gKGluZGV4IDEyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMSBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzIgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTQpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMzIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDMgcG9zaXRpb24gKGluZGV4IDE1KVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCBtMDAsIG0wMSwgbTAyLCBtMDMsIG0xMCwgbTExLCBtMTIsIG0xMywgbTIwLCBtMjEsIG0yMiwgbTIzLCBtMzAsIG0zMSwgbTMyLCBtMzMpIHtcbiAgb3V0WzBdID0gbTAwO1xuICBvdXRbMV0gPSBtMDE7XG4gIG91dFsyXSA9IG0wMjtcbiAgb3V0WzNdID0gbTAzO1xuICBvdXRbNF0gPSBtMTA7XG4gIG91dFs1XSA9IG0xMTtcbiAgb3V0WzZdID0gbTEyO1xuICBvdXRbN10gPSBtMTM7XG4gIG91dFs4XSA9IG0yMDtcbiAgb3V0WzldID0gbTIxO1xuICBvdXRbMTBdID0gbTIyO1xuICBvdXRbMTFdID0gbTIzO1xuICBvdXRbMTJdID0gbTMwO1xuICBvdXRbMTNdID0gbTMxO1xuICBvdXRbMTRdID0gbTMyO1xuICBvdXRbMTVdID0gbTMzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgYSBtYXQ0IHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMTtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMTtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNwb3NlIHRoZSB2YWx1ZXMgb2YgYSBtYXQ0XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZShvdXQsIGEpIHtcbiAgLy8gSWYgd2UgYXJlIHRyYW5zcG9zaW5nIG91cnNlbHZlcyB3ZSBjYW4gc2tpcCBhIGZldyBzdGVwcyBidXQgaGF2ZSB0byBjYWNoZSBzb21lIHZhbHVlc1xuICBpZiAob3V0ID09PSBhKSB7XG4gICAgdmFyIGEwMSA9IGFbMV0sXG4gICAgICAgIGEwMiA9IGFbMl0sXG4gICAgICAgIGEwMyA9IGFbM107XG4gICAgdmFyIGExMiA9IGFbNl0sXG4gICAgICAgIGExMyA9IGFbN107XG4gICAgdmFyIGEyMyA9IGFbMTFdO1xuICAgIG91dFsxXSA9IGFbNF07XG4gICAgb3V0WzJdID0gYVs4XTtcbiAgICBvdXRbM10gPSBhWzEyXTtcbiAgICBvdXRbNF0gPSBhMDE7XG4gICAgb3V0WzZdID0gYVs5XTtcbiAgICBvdXRbN10gPSBhWzEzXTtcbiAgICBvdXRbOF0gPSBhMDI7XG4gICAgb3V0WzldID0gYTEyO1xuICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICBvdXRbMTJdID0gYTAzO1xuICAgIG91dFsxM10gPSBhMTM7XG4gICAgb3V0WzE0XSA9IGEyMztcbiAgfSBlbHNlIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbNF07XG4gICAgb3V0WzJdID0gYVs4XTtcbiAgICBvdXRbM10gPSBhWzEyXTtcbiAgICBvdXRbNF0gPSBhWzFdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs5XTtcbiAgICBvdXRbN10gPSBhWzEzXTtcbiAgICBvdXRbOF0gPSBhWzJdO1xuICAgIG91dFs5XSA9IGFbNl07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzE0XTtcbiAgICBvdXRbMTJdID0gYVszXTtcbiAgICBvdXRbMTNdID0gYVs3XTtcbiAgICBvdXRbMTRdID0gYVsxMV07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMDtcbiAgdmFyIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMDtcbiAgdmFyIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDtcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMTtcbiAgdmFyIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMTtcbiAgdmFyIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjtcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMDtcbiAgdmFyIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMDtcbiAgdmFyIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDtcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMTtcbiAgdmFyIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMTtcbiAgdmFyIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuXG4gIHZhciBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG5cbiAgaWYgKCFkZXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRldCA9IDEuMCAvIGRldDtcbiAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gIG91dFsxXSA9IChhMDIgKiBiMTAgLSBhMDEgKiBiMTEgLSBhMDMgKiBiMDkpICogZGV0O1xuICBvdXRbMl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldDtcbiAgb3V0WzNdID0gKGEyMiAqIGIwNCAtIGEyMSAqIGIwNSAtIGEyMyAqIGIwMykgKiBkZXQ7XG4gIG91dFs0XSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0O1xuICBvdXRbNV0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDtcbiAgb3V0WzZdID0gKGEzMiAqIGIwMiAtIGEzMCAqIGIwNSAtIGEzMyAqIGIwMSkgKiBkZXQ7XG4gIG91dFs3XSA9IChhMjAgKiBiMDUgLSBhMjIgKiBiMDIgKyBhMjMgKiBiMDEpICogZGV0O1xuICBvdXRbOF0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcbiAgb3V0WzldID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXQ7XG4gIG91dFsxMF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldDtcbiAgb3V0WzExXSA9IChhMjEgKiBiMDIgLSBhMjAgKiBiMDQgLSBhMjMgKiBiMDApICogZGV0O1xuICBvdXRbMTJdID0gKGExMSAqIGIwNyAtIGExMCAqIGIwOSAtIGExMiAqIGIwNikgKiBkZXQ7XG4gIG91dFsxM10gPSAoYTAwICogYjA5IC0gYTAxICogYjA3ICsgYTAyICogYjA2KSAqIGRldDtcbiAgb3V0WzE0XSA9IChhMzEgKiBiMDEgLSBhMzAgKiBiMDMgLSBhMzIgKiBiMDApICogZGV0O1xuICBvdXRbMTVdID0gKGEyMCAqIGIwMyAtIGEyMSAqIGIwMSArIGEyMiAqIGIwMCkgKiBkZXQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGpvaW50KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSxcbiAgICAgIGEwMSA9IGFbMV0sXG4gICAgICBhMDIgPSBhWzJdLFxuICAgICAgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF0sXG4gICAgICBhMTEgPSBhWzVdLFxuICAgICAgYTEyID0gYVs2XSxcbiAgICAgIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdLFxuICAgICAgYTIxID0gYVs5XSxcbiAgICAgIGEyMiA9IGFbMTBdLFxuICAgICAgYTIzID0gYVsxMV07XG4gIHZhciBhMzAgPSBhWzEyXSxcbiAgICAgIGEzMSA9IGFbMTNdLFxuICAgICAgYTMyID0gYVsxNF0sXG4gICAgICBhMzMgPSBhWzE1XTtcbiAgb3V0WzBdID0gYTExICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpO1xuICBvdXRbMV0gPSAtKGEwMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSk7XG4gIG91dFsyXSA9IGEwMSAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTExICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKTtcbiAgb3V0WzNdID0gLShhMDEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSAtIGExMSAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpICsgYTIxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICBvdXRbNF0gPSAtKGExMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzAgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSk7XG4gIG91dFs1XSA9IGEwMCAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKTtcbiAgb3V0WzZdID0gLShhMDAgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICBvdXRbN10gPSBhMDAgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSAtIGExMCAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpICsgYTIwICogKGEwMiAqIGExMyAtIGEwMyAqIGExMik7XG4gIG91dFs4XSA9IGExMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKTtcbiAgb3V0WzldID0gLShhMDAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMDEgKiBhMzMgLSBhMDMgKiBhMzEpICsgYTMwICogKGEwMSAqIGEyMyAtIGEwMyAqIGEyMSkpO1xuICBvdXRbMTBdID0gYTAwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpO1xuICBvdXRbMTFdID0gLShhMDAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKSAtIGExMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpICsgYTIwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSkpO1xuICBvdXRbMTJdID0gLShhMTAgKiAoYTIxICogYTMyIC0gYTIyICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzIgLSBhMTIgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMiAtIGExMiAqIGEyMSkpO1xuICBvdXRbMTNdID0gYTAwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjIgLSBhMDIgKiBhMjEpO1xuICBvdXRbMTRdID0gLShhMDAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMiAtIGEwMiAqIGExMSkpO1xuICBvdXRbMTVdID0gYTAwICogKGExMSAqIGEyMiAtIGExMiAqIGEyMSkgLSBhMTAgKiAoYTAxICogYTIyIC0gYTAyICogYTIxKSArIGEyMCAqIChhMDEgKiBhMTIgLSBhMDIgKiBhMTEpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmFudChhKSB7XG4gIHZhciBhMDAgPSBhWzBdLFxuICAgICAgYTAxID0gYVsxXSxcbiAgICAgIGEwMiA9IGFbMl0sXG4gICAgICBhMDMgPSBhWzNdO1xuICB2YXIgYTEwID0gYVs0XSxcbiAgICAgIGExMSA9IGFbNV0sXG4gICAgICBhMTIgPSBhWzZdLFxuICAgICAgYTEzID0gYVs3XTtcbiAgdmFyIGEyMCA9IGFbOF0sXG4gICAgICBhMjEgPSBhWzldLFxuICAgICAgYTIyID0gYVsxMF0sXG4gICAgICBhMjMgPSBhWzExXTtcbiAgdmFyIGEzMCA9IGFbMTJdLFxuICAgICAgYTMxID0gYVsxM10sXG4gICAgICBhMzIgPSBhWzE0XSxcbiAgICAgIGEzMyA9IGFbMTVdO1xuICB2YXIgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwO1xuICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwO1xuICB2YXIgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwO1xuICB2YXIgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExO1xuICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExO1xuICB2YXIgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyO1xuICB2YXIgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwO1xuICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwO1xuICB2YXIgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwO1xuICB2YXIgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxO1xuICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxO1xuICB2YXIgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyOyAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG5cbiAgcmV0dXJuIGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcbn1cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0NHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGEwMCA9IGFbMF0sXG4gICAgICBhMDEgPSBhWzFdLFxuICAgICAgYTAyID0gYVsyXSxcbiAgICAgIGEwMyA9IGFbM107XG4gIHZhciBhMTAgPSBhWzRdLFxuICAgICAgYTExID0gYVs1XSxcbiAgICAgIGExMiA9IGFbNl0sXG4gICAgICBhMTMgPSBhWzddO1xuICB2YXIgYTIwID0gYVs4XSxcbiAgICAgIGEyMSA9IGFbOV0sXG4gICAgICBhMjIgPSBhWzEwXSxcbiAgICAgIGEyMyA9IGFbMTFdO1xuICB2YXIgYTMwID0gYVsxMl0sXG4gICAgICBhMzEgPSBhWzEzXSxcbiAgICAgIGEzMiA9IGFbMTRdLFxuICAgICAgYTMzID0gYVsxNV07IC8vIENhY2hlIG9ubHkgdGhlIGN1cnJlbnQgbGluZSBvZiB0aGUgc2Vjb25kIG1hdHJpeFxuXG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIG91dFswXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbMV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzJdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFszXSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICBiMCA9IGJbNF07XG4gIGIxID0gYls1XTtcbiAgYjIgPSBiWzZdO1xuICBiMyA9IGJbN107XG4gIG91dFs0XSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbNV0gPSBiMCAqIGEwMSArIGIxICogYTExICsgYjIgKiBhMjEgKyBiMyAqIGEzMTtcbiAgb3V0WzZdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFs3XSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICBiMCA9IGJbOF07XG4gIGIxID0gYls5XTtcbiAgYjIgPSBiWzEwXTtcbiAgYjMgPSBiWzExXTtcbiAgb3V0WzhdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gIG91dFs5XSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICBvdXRbMTBdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gIG91dFsxMV0gPSBiMCAqIGEwMyArIGIxICogYTEzICsgYjIgKiBhMjMgKyBiMyAqIGEzMztcbiAgYjAgPSBiWzEyXTtcbiAgYjEgPSBiWzEzXTtcbiAgYjIgPSBiWzE0XTtcbiAgYjMgPSBiWzE1XTtcbiAgb3V0WzEyXSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICBvdXRbMTNdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gIG91dFsxNF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgb3V0WzE1XSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2xhdGUgYSBtYXQ0IGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXSxcbiAgICAgIHogPSB2WzJdO1xuICB2YXIgYTAwLCBhMDEsIGEwMiwgYTAzO1xuICB2YXIgYTEwLCBhMTEsIGExMiwgYTEzO1xuICB2YXIgYTIwLCBhMjEsIGEyMiwgYTIzO1xuXG4gIGlmIChhID09PSBvdXQpIHtcbiAgICBvdXRbMTJdID0gYVswXSAqIHggKyBhWzRdICogeSArIGFbOF0gKiB6ICsgYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMV0gKiB4ICsgYVs1XSAqIHkgKyBhWzldICogeiArIGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzJdICogeCArIGFbNl0gKiB5ICsgYVsxMF0gKiB6ICsgYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbM10gKiB4ICsgYVs3XSAqIHkgKyBhWzExXSAqIHogKyBhWzE1XTtcbiAgfSBlbHNlIHtcbiAgICBhMDAgPSBhWzBdO1xuICAgIGEwMSA9IGFbMV07XG4gICAgYTAyID0gYVsyXTtcbiAgICBhMDMgPSBhWzNdO1xuICAgIGExMCA9IGFbNF07XG4gICAgYTExID0gYVs1XTtcbiAgICBhMTIgPSBhWzZdO1xuICAgIGExMyA9IGFbN107XG4gICAgYTIwID0gYVs4XTtcbiAgICBhMjEgPSBhWzldO1xuICAgIGEyMiA9IGFbMTBdO1xuICAgIGEyMyA9IGFbMTFdO1xuICAgIG91dFswXSA9IGEwMDtcbiAgICBvdXRbMV0gPSBhMDE7XG4gICAgb3V0WzJdID0gYTAyO1xuICAgIG91dFszXSA9IGEwMztcbiAgICBvdXRbNF0gPSBhMTA7XG4gICAgb3V0WzVdID0gYTExO1xuICAgIG91dFs2XSA9IGExMjtcbiAgICBvdXRbN10gPSBhMTM7XG4gICAgb3V0WzhdID0gYTIwO1xuICAgIG91dFs5XSA9IGEyMTtcbiAgICBvdXRbMTBdID0gYTIyO1xuICAgIG91dFsxMV0gPSBhMjM7XG4gICAgb3V0WzEyXSA9IGEwMCAqIHggKyBhMTAgKiB5ICsgYTIwICogeiArIGFbMTJdO1xuICAgIG91dFsxM10gPSBhMDEgKiB4ICsgYTExICogeSArIGEyMSAqIHogKyBhWzEzXTtcbiAgICBvdXRbMTRdID0gYTAyICogeCArIGExMiAqIHkgKyBhMjIgKiB6ICsgYVsxNF07XG4gICAgb3V0WzE1XSA9IGEwMyAqIHggKyBhMTMgKiB5ICsgYTIzICogeiArIGFbMTVdO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQ0IGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMzIG5vdCB1c2luZyB2ZWN0b3JpemF0aW9uXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgdikge1xuICB2YXIgeCA9IHZbMF0sXG4gICAgICB5ID0gdlsxXSxcbiAgICAgIHogPSB2WzJdO1xuICBvdXRbMF0gPSBhWzBdICogeDtcbiAgb3V0WzFdID0gYVsxXSAqIHg7XG4gIG91dFsyXSA9IGFbMl0gKiB4O1xuICBvdXRbM10gPSBhWzNdICogeDtcbiAgb3V0WzRdID0gYVs0XSAqIHk7XG4gIG91dFs1XSA9IGFbNV0gKiB5O1xuICBvdXRbNl0gPSBhWzZdICogeTtcbiAgb3V0WzddID0gYVs3XSAqIHk7XG4gIG91dFs4XSA9IGFbOF0gKiB6O1xuICBvdXRbOV0gPSBhWzldICogejtcbiAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgb3V0WzExXSA9IGFbMTFdICogejtcbiAgb3V0WzEyXSA9IGFbMTJdO1xuICBvdXRbMTNdID0gYVsxM107XG4gIG91dFsxNF0gPSBhWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0NCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBnaXZlbiBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGF4aXMgdGhlIGF4aXMgdG8gcm90YXRlIGFyb3VuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUob3V0LCBhLCByYWQsIGF4aXMpIHtcbiAgdmFyIHggPSBheGlzWzBdLFxuICAgICAgeSA9IGF4aXNbMV0sXG4gICAgICB6ID0gYXhpc1syXTtcbiAgdmFyIGxlbiA9IE1hdGguaHlwb3QoeCwgeSwgeik7XG4gIHZhciBzLCBjLCB0O1xuICB2YXIgYTAwLCBhMDEsIGEwMiwgYTAzO1xuICB2YXIgYTEwLCBhMTEsIGExMiwgYTEzO1xuICB2YXIgYTIwLCBhMjEsIGEyMiwgYTIzO1xuICB2YXIgYjAwLCBiMDEsIGIwMjtcbiAgdmFyIGIxMCwgYjExLCBiMTI7XG4gIHZhciBiMjAsIGIyMSwgYjIyO1xuXG4gIGlmIChsZW4gPCBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZW4gPSAxIC8gbGVuO1xuICB4ICo9IGxlbjtcbiAgeSAqPSBsZW47XG4gIHogKj0gbGVuO1xuICBzID0gTWF0aC5zaW4ocmFkKTtcbiAgYyA9IE1hdGguY29zKHJhZCk7XG4gIHQgPSAxIC0gYztcbiAgYTAwID0gYVswXTtcbiAgYTAxID0gYVsxXTtcbiAgYTAyID0gYVsyXTtcbiAgYTAzID0gYVszXTtcbiAgYTEwID0gYVs0XTtcbiAgYTExID0gYVs1XTtcbiAgYTEyID0gYVs2XTtcbiAgYTEzID0gYVs3XTtcbiAgYTIwID0gYVs4XTtcbiAgYTIxID0gYVs5XTtcbiAgYTIyID0gYVsxMF07XG4gIGEyMyA9IGFbMTFdOyAvLyBDb25zdHJ1Y3QgdGhlIGVsZW1lbnRzIG9mIHRoZSByb3RhdGlvbiBtYXRyaXhcblxuICBiMDAgPSB4ICogeCAqIHQgKyBjO1xuICBiMDEgPSB5ICogeCAqIHQgKyB6ICogcztcbiAgYjAyID0geiAqIHggKiB0IC0geSAqIHM7XG4gIGIxMCA9IHggKiB5ICogdCAtIHogKiBzO1xuICBiMTEgPSB5ICogeSAqIHQgKyBjO1xuICBiMTIgPSB6ICogeSAqIHQgKyB4ICogcztcbiAgYjIwID0geCAqIHogKiB0ICsgeSAqIHM7XG4gIGIyMSA9IHkgKiB6ICogdCAtIHggKiBzO1xuICBiMjIgPSB6ICogeiAqIHQgKyBjOyAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IGEwMCAqIGIwMCArIGExMCAqIGIwMSArIGEyMCAqIGIwMjtcbiAgb3V0WzFdID0gYTAxICogYjAwICsgYTExICogYjAxICsgYTIxICogYjAyO1xuICBvdXRbMl0gPSBhMDIgKiBiMDAgKyBhMTIgKiBiMDEgKyBhMjIgKiBiMDI7XG4gIG91dFszXSA9IGEwMyAqIGIwMCArIGExMyAqIGIwMSArIGEyMyAqIGIwMjtcbiAgb3V0WzRdID0gYTAwICogYjEwICsgYTEwICogYjExICsgYTIwICogYjEyO1xuICBvdXRbNV0gPSBhMDEgKiBiMTAgKyBhMTEgKiBiMTEgKyBhMjEgKiBiMTI7XG4gIG91dFs2XSA9IGEwMiAqIGIxMCArIGExMiAqIGIxMSArIGEyMiAqIGIxMjtcbiAgb3V0WzddID0gYTAzICogYjEwICsgYTEzICogYjExICsgYTIzICogYjEyO1xuICBvdXRbOF0gPSBhMDAgKiBiMjAgKyBhMTAgKiBiMjEgKyBhMjAgKiBiMjI7XG4gIG91dFs5XSA9IGEwMSAqIGIyMCArIGExMSAqIGIyMSArIGEyMSAqIGIyMjtcbiAgb3V0WzEwXSA9IGEwMiAqIGIyMCArIGExMiAqIGIyMSArIGEyMiAqIGIyMjtcbiAgb3V0WzExXSA9IGEwMyAqIGIyMCArIGExMyAqIGIyMSArIGEyMyAqIGIyMjtcblxuICBpZiAoYSAhPT0gb3V0KSB7XG4gICAgLy8gSWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlmZmVyLCBjb3B5IHRoZSB1bmNoYW5nZWQgbGFzdCByb3dcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFggYXhpc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWChvdXQsIGEsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGExMCA9IGFbNF07XG4gIHZhciBhMTEgPSBhWzVdO1xuICB2YXIgYTEyID0gYVs2XTtcbiAgdmFyIGExMyA9IGFbN107XG4gIHZhciBhMjAgPSBhWzhdO1xuICB2YXIgYTIxID0gYVs5XTtcbiAgdmFyIGEyMiA9IGFbMTBdO1xuICB2YXIgYTIzID0gYVsxMV07XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgfSAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cblxuICBvdXRbNF0gPSBhMTAgKiBjICsgYTIwICogcztcbiAgb3V0WzVdID0gYTExICogYyArIGEyMSAqIHM7XG4gIG91dFs2XSA9IGExMiAqIGMgKyBhMjIgKiBzO1xuICBvdXRbN10gPSBhMTMgKiBjICsgYTIzICogcztcbiAgb3V0WzhdID0gYTIwICogYyAtIGExMCAqIHM7XG4gIG91dFs5XSA9IGEyMSAqIGMgLSBhMTEgKiBzO1xuICBvdXRbMTBdID0gYTIyICogYyAtIGExMiAqIHM7XG4gIG91dFsxMV0gPSBhMjMgKiBjIC0gYTEzICogcztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBZIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7XG4gIHZhciBhMDAgPSBhWzBdO1xuICB2YXIgYTAxID0gYVsxXTtcbiAgdmFyIGEwMiA9IGFbMl07XG4gIHZhciBhMDMgPSBhWzNdO1xuICB2YXIgYTIwID0gYVs4XTtcbiAgdmFyIGEyMSA9IGFbOV07XG4gIHZhciBhMjIgPSBhWzEwXTtcbiAgdmFyIGEyMyA9IGFbMTFdO1xuXG4gIGlmIChhICE9PSBvdXQpIHtcbiAgICAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gIH0gLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG5cbiAgb3V0WzBdID0gYTAwICogYyAtIGEyMCAqIHM7XG4gIG91dFsxXSA9IGEwMSAqIGMgLSBhMjEgKiBzO1xuICBvdXRbMl0gPSBhMDIgKiBjIC0gYTIyICogcztcbiAgb3V0WzNdID0gYTAzICogYyAtIGEyMyAqIHM7XG4gIG91dFs4XSA9IGEwMCAqIHMgKyBhMjAgKiBjO1xuICBvdXRbOV0gPSBhMDEgKiBzICsgYTIxICogYztcbiAgb3V0WzEwXSA9IGEwMiAqIHMgKyBhMjIgKiBjO1xuICBvdXRbMTFdID0gYTAzICogcyArIGEyMyAqIGM7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWiBheGlzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVaKG91dCwgYSwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB2YXIgYTAwID0gYVswXTtcbiAgdmFyIGEwMSA9IGFbMV07XG4gIHZhciBhMDIgPSBhWzJdO1xuICB2YXIgYTAzID0gYVszXTtcbiAgdmFyIGExMCA9IGFbNF07XG4gIHZhciBhMTEgPSBhWzVdO1xuICB2YXIgYTEyID0gYVs2XTtcbiAgdmFyIGExMyA9IGFbN107XG5cbiAgaWYgKGEgIT09IG91dCkge1xuICAgIC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICBvdXRbOV0gPSBhWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICB9IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuXG4gIG91dFswXSA9IGEwMCAqIGMgKyBhMTAgKiBzO1xuICBvdXRbMV0gPSBhMDEgKiBjICsgYTExICogcztcbiAgb3V0WzJdID0gYTAyICogYyArIGExMiAqIHM7XG4gIG91dFszXSA9IGEwMyAqIGMgKyBhMTMgKiBzO1xuICBvdXRbNF0gPSBhMTAgKiBjIC0gYTAwICogcztcbiAgb3V0WzVdID0gYTExICogYyAtIGEwMSAqIHM7XG4gIG91dFs2XSA9IGExMiAqIGMgLSBhMDIgKiBzO1xuICBvdXRbN10gPSBhMTMgKiBjIC0gYTAzICogcztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgdmVjdG9yIHRyYW5zbGF0aW9uXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB2KSB7XG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDE7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSAxO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF07XG4gIG91dFsxM10gPSB2WzFdO1xuICBvdXRbMTRdID0gdlsyXTtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgU2NhbGluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVNjYWxpbmcob3V0LCB2KSB7XG4gIG91dFswXSA9IHZbMF07XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IHZbMV07XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSB2WzJdO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlIGFyb3VuZCBhIGdpdmVuIGF4aXNcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQucm90YXRlKGRlc3QsIGRlc3QsIHJhZCwgYXhpcyk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uKG91dCwgcmFkLCBheGlzKSB7XG4gIHZhciB4ID0gYXhpc1swXSxcbiAgICAgIHkgPSBheGlzWzFdLFxuICAgICAgeiA9IGF4aXNbMl07XG4gIHZhciBsZW4gPSBNYXRoLmh5cG90KHgsIHksIHopO1xuICB2YXIgcywgYywgdDtcblxuICBpZiAobGVuIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGVuID0gMSAvIGxlbjtcbiAgeCAqPSBsZW47XG4gIHkgKj0gbGVuO1xuICB6ICo9IGxlbjtcbiAgcyA9IE1hdGguc2luKHJhZCk7XG4gIGMgPSBNYXRoLmNvcyhyYWQpO1xuICB0ID0gMSAtIGM7IC8vIFBlcmZvcm0gcm90YXRpb24tc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0geCAqIHggKiB0ICsgYztcbiAgb3V0WzFdID0geSAqIHggKiB0ICsgeiAqIHM7XG4gIG91dFsyXSA9IHogKiB4ICogdCAtIHkgKiBzO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB4ICogeSAqIHQgLSB6ICogcztcbiAgb3V0WzVdID0geSAqIHkgKiB0ICsgYztcbiAgb3V0WzZdID0geiAqIHkgKiB0ICsgeCAqIHM7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHggKiB6ICogdCArIHkgKiBzO1xuICBvdXRbOV0gPSB5ICogeiAqIHQgLSB4ICogcztcbiAgb3V0WzEwXSA9IHogKiB6ICogdCArIGM7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFggYXhpc1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5yb3RhdGVYKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVhSb3RhdGlvbihvdXQsIHJhZCkge1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIHZhciBjID0gTWF0aC5jb3MocmFkKTsgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuXG4gIG91dFswXSA9IDE7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IGM7XG4gIG91dFs2XSA9IHM7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IC1zO1xuICBvdXRbMTBdID0gYztcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAwO1xuICBvdXRbMTNdID0gMDtcbiAgb3V0WzE0XSA9IDA7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnJvdGF0ZVkoZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tWVJvdGF0aW9uKG91dCwgcmFkKSB7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGMgPSBNYXRoLmNvcyhyYWQpOyAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG5cbiAgb3V0WzBdID0gYztcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gLXM7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IDE7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IHM7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMF0gPSBjO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBaIGF4aXNcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQucm90YXRlWihkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21aUm90YXRpb24ob3V0LCByYWQpIHtcbiAgdmFyIHMgPSBNYXRoLnNpbihyYWQpO1xuICB2YXIgYyA9IE1hdGguY29zKHJhZCk7IC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cblxuICBvdXRbMF0gPSBjO1xuICBvdXRbMV0gPSBzO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAtcztcbiAgb3V0WzVdID0gYztcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IDE7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSAwO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIGEgcXVhdGVybmlvbiByb3RhdGlvbiBhbmQgdmVjdG9yIHRyYW5zbGF0aW9uXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xuICogICAgIGxldCBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3F1YXQ0fSBxIFJvdGF0aW9uIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIHEsIHYpIHtcbiAgLy8gUXVhdGVybmlvbiBtYXRoXG4gIHZhciB4ID0gcVswXSxcbiAgICAgIHkgPSBxWzFdLFxuICAgICAgeiA9IHFbMl0sXG4gICAgICB3ID0gcVszXTtcbiAgdmFyIHgyID0geCArIHg7XG4gIHZhciB5MiA9IHkgKyB5O1xuICB2YXIgejIgPSB6ICsgejtcbiAgdmFyIHh4ID0geCAqIHgyO1xuICB2YXIgeHkgPSB4ICogeTI7XG4gIHZhciB4eiA9IHggKiB6MjtcbiAgdmFyIHl5ID0geSAqIHkyO1xuICB2YXIgeXogPSB5ICogejI7XG4gIHZhciB6eiA9IHogKiB6MjtcbiAgdmFyIHd4ID0gdyAqIHgyO1xuICB2YXIgd3kgPSB3ICogeTI7XG4gIHZhciB3eiA9IHcgKiB6MjtcbiAgb3V0WzBdID0gMSAtICh5eSArIHp6KTtcbiAgb3V0WzFdID0geHkgKyB3ejtcbiAgb3V0WzJdID0geHogLSB3eTtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0geHkgLSB3ejtcbiAgb3V0WzVdID0gMSAtICh4eCArIHp6KTtcbiAgb3V0WzZdID0geXogKyB3eDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0geHogKyB3eTtcbiAgb3V0WzldID0geXogLSB3eDtcbiAgb3V0WzEwXSA9IDEgLSAoeHggKyB5eSk7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXTtcbiAgb3V0WzEzXSA9IHZbMV07XG4gIG91dFsxNF0gPSB2WzJdO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQ0IGZyb20gYSBkdWFsIHF1YXQuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgTWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgRHVhbCBRdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7bWF0NH0gbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUXVhdDIob3V0LCBhKSB7XG4gIHZhciB0cmFuc2xhdGlvbiA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICB2YXIgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdLFxuICAgICAgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddO1xuICB2YXIgbWFnbml0dWRlID0gYnggKiBieCArIGJ5ICogYnkgKyBieiAqIGJ6ICsgYncgKiBidzsgLy9Pbmx5IHNjYWxlIGlmIGl0IG1ha2VzIHNlbnNlXG5cbiAgaWYgKG1hZ25pdHVkZSA+IDApIHtcbiAgICB0cmFuc2xhdGlvblswXSA9IChheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5KSAqIDIgLyBtYWduaXR1ZGU7XG4gICAgdHJhbnNsYXRpb25bMV0gPSAoYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieikgKiAyIC8gbWFnbml0dWRlO1xuICAgIHRyYW5zbGF0aW9uWzJdID0gKGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngpICogMiAvIG1hZ25pdHVkZTtcbiAgfSBlbHNlIHtcbiAgICB0cmFuc2xhdGlvblswXSA9IChheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5KSAqIDI7XG4gICAgdHJhbnNsYXRpb25bMV0gPSAoYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieikgKiAyO1xuICAgIHRyYW5zbGF0aW9uWzJdID0gKGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngpICogMjtcbiAgfVxuXG4gIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uKG91dCwgYSwgdHJhbnNsYXRpb24pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IgY29tcG9uZW50IG9mIGEgdHJhbnNmb3JtYXRpb25cbiAqICBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGggZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24sXG4gKiAgdGhlIHJldHVybmVkIHZlY3RvciB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3JcbiAqICBvcmlnaW5hbGx5IHN1cHBsaWVkLlxuICogQHBhcmFtICB7dmVjM30gb3V0IFZlY3RvciB0byByZWNlaXZlIHRyYW5zbGF0aW9uIGNvbXBvbmVudFxuICogQHBhcmFtICB7UmVhZG9ubHlNYXQ0fSBtYXQgTWF0cml4IHRvIGJlIGRlY29tcG9zZWQgKGlucHV0KVxuICogQHJldHVybiB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uKG91dCwgbWF0KSB7XG4gIG91dFswXSA9IG1hdFsxMl07XG4gIG91dFsxXSA9IG1hdFsxM107XG4gIG91dFsyXSA9IG1hdFsxNF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIHNjYWxpbmcgZmFjdG9yIGNvbXBvbmVudCBvZiBhIHRyYW5zZm9ybWF0aW9uXG4gKiAgbWF0cml4LiBJZiBhIG1hdHJpeCBpcyBidWlsdCB3aXRoIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVcbiAqICB3aXRoIGEgbm9ybWFsaXplZCBRdWF0ZXJuaW9uIHBhcmFtdGVyLCB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpbGwgYmVcbiAqICB0aGUgc2FtZSBhcyB0aGUgc2NhbGluZyB2ZWN0b3JcbiAqICBvcmlnaW5hbGx5IHN1cHBsaWVkLlxuICogQHBhcmFtICB7dmVjM30gb3V0IFZlY3RvciB0byByZWNlaXZlIHNjYWxpbmcgZmFjdG9yIGNvbXBvbmVudFxuICogQHBhcmFtICB7UmVhZG9ubHlNYXQ0fSBtYXQgTWF0cml4IHRvIGJlIGRlY29tcG9zZWQgKGlucHV0KVxuICogQHJldHVybiB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxpbmcob3V0LCBtYXQpIHtcbiAgdmFyIG0xMSA9IG1hdFswXTtcbiAgdmFyIG0xMiA9IG1hdFsxXTtcbiAgdmFyIG0xMyA9IG1hdFsyXTtcbiAgdmFyIG0yMSA9IG1hdFs0XTtcbiAgdmFyIG0yMiA9IG1hdFs1XTtcbiAgdmFyIG0yMyA9IG1hdFs2XTtcbiAgdmFyIG0zMSA9IG1hdFs4XTtcbiAgdmFyIG0zMiA9IG1hdFs5XTtcbiAgdmFyIG0zMyA9IG1hdFsxMF07XG4gIG91dFswXSA9IE1hdGguaHlwb3QobTExLCBtMTIsIG0xMyk7XG4gIG91dFsxXSA9IE1hdGguaHlwb3QobTIxLCBtMjIsIG0yMyk7XG4gIG91dFsyXSA9IE1hdGguaHlwb3QobTMxLCBtMzIsIG0zMyk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgYSBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyB0aGUgcm90YXRpb25hbCBjb21wb25lbnRcbiAqICBvZiBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aFxuICogIGZyb21Sb3RhdGlvblRyYW5zbGF0aW9uLCB0aGUgcmV0dXJuZWQgcXVhdGVybmlvbiB3aWxsIGJlIHRoZVxuICogIHNhbWUgYXMgdGhlIHF1YXRlcm5pb24gb3JpZ2luYWxseSBzdXBwbGllZC5cbiAqIEBwYXJhbSB7cXVhdH0gb3V0IFF1YXRlcm5pb24gdG8gcmVjZWl2ZSB0aGUgcm90YXRpb24gY29tcG9uZW50XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gbWF0IE1hdHJpeCB0byBiZSBkZWNvbXBvc2VkIChpbnB1dClcbiAqIEByZXR1cm4ge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3RhdGlvbihvdXQsIG1hdCkge1xuICB2YXIgc2NhbGluZyA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBnZXRTY2FsaW5nKHNjYWxpbmcsIG1hdCk7XG4gIHZhciBpczEgPSAxIC8gc2NhbGluZ1swXTtcbiAgdmFyIGlzMiA9IDEgLyBzY2FsaW5nWzFdO1xuICB2YXIgaXMzID0gMSAvIHNjYWxpbmdbMl07XG4gIHZhciBzbTExID0gbWF0WzBdICogaXMxO1xuICB2YXIgc20xMiA9IG1hdFsxXSAqIGlzMjtcbiAgdmFyIHNtMTMgPSBtYXRbMl0gKiBpczM7XG4gIHZhciBzbTIxID0gbWF0WzRdICogaXMxO1xuICB2YXIgc20yMiA9IG1hdFs1XSAqIGlzMjtcbiAgdmFyIHNtMjMgPSBtYXRbNl0gKiBpczM7XG4gIHZhciBzbTMxID0gbWF0WzhdICogaXMxO1xuICB2YXIgc20zMiA9IG1hdFs5XSAqIGlzMjtcbiAgdmFyIHNtMzMgPSBtYXRbMTBdICogaXMzO1xuICB2YXIgdHJhY2UgPSBzbTExICsgc20yMiArIHNtMzM7XG4gIHZhciBTID0gMDtcblxuICBpZiAodHJhY2UgPiAwKSB7XG4gICAgUyA9IE1hdGguc3FydCh0cmFjZSArIDEuMCkgKiAyO1xuICAgIG91dFszXSA9IDAuMjUgKiBTO1xuICAgIG91dFswXSA9IChzbTIzIC0gc20zMikgLyBTO1xuICAgIG91dFsxXSA9IChzbTMxIC0gc20xMykgLyBTO1xuICAgIG91dFsyXSA9IChzbTEyIC0gc20yMSkgLyBTO1xuICB9IGVsc2UgaWYgKHNtMTEgPiBzbTIyICYmIHNtMTEgPiBzbTMzKSB7XG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBzbTExIC0gc20yMiAtIHNtMzMpICogMjtcbiAgICBvdXRbM10gPSAoc20yMyAtIHNtMzIpIC8gUztcbiAgICBvdXRbMF0gPSAwLjI1ICogUztcbiAgICBvdXRbMV0gPSAoc20xMiArIHNtMjEpIC8gUztcbiAgICBvdXRbMl0gPSAoc20zMSArIHNtMTMpIC8gUztcbiAgfSBlbHNlIGlmIChzbTIyID4gc20zMykge1xuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgc20yMiAtIHNtMTEgLSBzbTMzKSAqIDI7XG4gICAgb3V0WzNdID0gKHNtMzEgLSBzbTEzKSAvIFM7XG4gICAgb3V0WzBdID0gKHNtMTIgKyBzbTIxKSAvIFM7XG4gICAgb3V0WzFdID0gMC4yNSAqIFM7XG4gICAgb3V0WzJdID0gKHNtMjMgKyBzbTMyKSAvIFM7XG4gIH0gZWxzZSB7XG4gICAgUyA9IE1hdGguc3FydCgxLjAgKyBzbTMzIC0gc20xMSAtIHNtMjIpICogMjtcbiAgICBvdXRbM10gPSAoc20xMiAtIHNtMjEpIC8gUztcbiAgICBvdXRbMF0gPSAoc20zMSArIHNtMTMpIC8gUztcbiAgICBvdXRbMV0gPSAoc20yMyArIHNtMzIpIC8gUztcbiAgICBvdXRbMl0gPSAwLjI1ICogUztcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24sIHZlY3RvciB0cmFuc2xhdGlvbiBhbmQgdmVjdG9yIHNjYWxlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xuICogICAgIGxldCBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIHNjYWxlKVxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gcyBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlKG91dCwgcSwgdiwgcykge1xuICAvLyBRdWF0ZXJuaW9uIG1hdGhcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB4eSA9IHggKiB5MjtcbiAgdmFyIHh6ID0geCAqIHoyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB5eiA9IHkgKiB6MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICB2YXIgc3ggPSBzWzBdO1xuICB2YXIgc3kgPSBzWzFdO1xuICB2YXIgc3ogPSBzWzJdO1xuICBvdXRbMF0gPSAoMSAtICh5eSArIHp6KSkgKiBzeDtcbiAgb3V0WzFdID0gKHh5ICsgd3opICogc3g7XG4gIG91dFsyXSA9ICh4eiAtIHd5KSAqIHN4O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAoeHkgLSB3eikgKiBzeTtcbiAgb3V0WzVdID0gKDEgLSAoeHggKyB6eikpICogc3k7XG4gIG91dFs2XSA9ICh5eiArIHd4KSAqIHN5O1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAoeHogKyB3eSkgKiBzejtcbiAgb3V0WzldID0gKHl6IC0gd3gpICogc3o7XG4gIG91dFsxMF0gPSAoMSAtICh4eCArIHl5KSkgKiBzejtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSB2WzBdO1xuICBvdXRbMTNdID0gdlsxXTtcbiAgb3V0WzE0XSA9IHZbMl07XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uLCB2ZWN0b3IgdHJhbnNsYXRpb24gYW5kIHZlY3RvciBzY2FsZSwgcm90YXRpbmcgYW5kIHNjYWxpbmcgYXJvdW5kIHRoZSBnaXZlbiBvcmlnaW5cbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgb3JpZ2luKTtcbiAqICAgICBsZXQgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBuZWdhdGl2ZU9yaWdpbik7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiBUcmFuc2xhdGlvbiB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBzIFNjYWxpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gbyBUaGUgb3JpZ2luIHZlY3RvciBhcm91bmQgd2hpY2ggdG8gc2NhbGUgYW5kIHJvdGF0ZVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlT3JpZ2luKG91dCwgcSwgdiwgcywgbykge1xuICAvLyBRdWF0ZXJuaW9uIG1hdGhcbiAgdmFyIHggPSBxWzBdLFxuICAgICAgeSA9IHFbMV0sXG4gICAgICB6ID0gcVsyXSxcbiAgICAgIHcgPSBxWzNdO1xuICB2YXIgeDIgPSB4ICsgeDtcbiAgdmFyIHkyID0geSArIHk7XG4gIHZhciB6MiA9IHogKyB6O1xuICB2YXIgeHggPSB4ICogeDI7XG4gIHZhciB4eSA9IHggKiB5MjtcbiAgdmFyIHh6ID0geCAqIHoyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB5eiA9IHkgKiB6MjtcbiAgdmFyIHp6ID0geiAqIHoyO1xuICB2YXIgd3ggPSB3ICogeDI7XG4gIHZhciB3eSA9IHcgKiB5MjtcbiAgdmFyIHd6ID0gdyAqIHoyO1xuICB2YXIgc3ggPSBzWzBdO1xuICB2YXIgc3kgPSBzWzFdO1xuICB2YXIgc3ogPSBzWzJdO1xuICB2YXIgb3ggPSBvWzBdO1xuICB2YXIgb3kgPSBvWzFdO1xuICB2YXIgb3ogPSBvWzJdO1xuICB2YXIgb3V0MCA9ICgxIC0gKHl5ICsgenopKSAqIHN4O1xuICB2YXIgb3V0MSA9ICh4eSArIHd6KSAqIHN4O1xuICB2YXIgb3V0MiA9ICh4eiAtIHd5KSAqIHN4O1xuICB2YXIgb3V0NCA9ICh4eSAtIHd6KSAqIHN5O1xuICB2YXIgb3V0NSA9ICgxIC0gKHh4ICsgenopKSAqIHN5O1xuICB2YXIgb3V0NiA9ICh5eiArIHd4KSAqIHN5O1xuICB2YXIgb3V0OCA9ICh4eiArIHd5KSAqIHN6O1xuICB2YXIgb3V0OSA9ICh5eiAtIHd4KSAqIHN6O1xuICB2YXIgb3V0MTAgPSAoMSAtICh4eCArIHl5KSkgKiBzejtcbiAgb3V0WzBdID0gb3V0MDtcbiAgb3V0WzFdID0gb3V0MTtcbiAgb3V0WzJdID0gb3V0MjtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gb3V0NDtcbiAgb3V0WzVdID0gb3V0NTtcbiAgb3V0WzZdID0gb3V0NjtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gb3V0ODtcbiAgb3V0WzldID0gb3V0OTtcbiAgb3V0WzEwXSA9IG91dDEwO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IHZbMF0gKyBveCAtIChvdXQwICogb3ggKyBvdXQ0ICogb3kgKyBvdXQ4ICogb3opO1xuICBvdXRbMTNdID0gdlsxXSArIG95IC0gKG91dDEgKiBveCArIG91dDUgKiBveSArIG91dDkgKiBveik7XG4gIG91dFsxNF0gPSB2WzJdICsgb3ogLSAob3V0MiAqIG94ICsgb3V0NiAqIG95ICsgb3V0MTAgKiBveik7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIGEgNHg0IG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgUXVhdGVybmlvbiB0byBjcmVhdGUgbWF0cml4IGZyb21cbiAqXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21RdWF0KG91dCwgcSkge1xuICB2YXIgeCA9IHFbMF0sXG4gICAgICB5ID0gcVsxXSxcbiAgICAgIHogPSBxWzJdLFxuICAgICAgdyA9IHFbM107XG4gIHZhciB4MiA9IHggKyB4O1xuICB2YXIgeTIgPSB5ICsgeTtcbiAgdmFyIHoyID0geiArIHo7XG4gIHZhciB4eCA9IHggKiB4MjtcbiAgdmFyIHl4ID0geSAqIHgyO1xuICB2YXIgeXkgPSB5ICogeTI7XG4gIHZhciB6eCA9IHogKiB4MjtcbiAgdmFyIHp5ID0geiAqIHkyO1xuICB2YXIgenogPSB6ICogejI7XG4gIHZhciB3eCA9IHcgKiB4MjtcbiAgdmFyIHd5ID0gdyAqIHkyO1xuICB2YXIgd3ogPSB3ICogejI7XG4gIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICBvdXRbMV0gPSB5eCArIHd6O1xuICBvdXRbMl0gPSB6eCAtIHd5O1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB5eCAtIHd6O1xuICBvdXRbNV0gPSAxIC0geHggLSB6ejtcbiAgb3V0WzZdID0genkgKyB3eDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0genggKyB3eTtcbiAgb3V0WzldID0genkgLSB3eDtcbiAgb3V0WzEwXSA9IDEgLSB4eCAtIHl5O1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTRdID0gMDtcbiAgb3V0WzE1XSA9IDE7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIGZydXN0dW0gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7TnVtYmVyfSBsZWZ0IExlZnQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSByaWdodCBSaWdodCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IGJvdHRvbSBCb3R0b20gYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSB0b3AgVG9wIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcnVzdHVtKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgdmFyIHJsID0gMSAvIChyaWdodCAtIGxlZnQpO1xuICB2YXIgdGIgPSAxIC8gKHRvcCAtIGJvdHRvbSk7XG4gIHZhciBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gIG91dFswXSA9IG5lYXIgKiAyICogcmw7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IG5lYXIgKiAyICogdGI7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IChyaWdodCArIGxlZnQpICogcmw7XG4gIG91dFs5XSA9ICh0b3AgKyBib3R0b20pICogdGI7XG4gIG91dFsxMF0gPSAoZmFyICsgbmVhcikgKiBuZjtcbiAgb3V0WzExXSA9IC0xO1xuICBvdXRbMTJdID0gMDtcbiAgb3V0WzEzXSA9IDA7XG4gIG91dFsxNF0gPSBmYXIgKiBuZWFyICogMiAqIG5mO1xuICBvdXRbMTVdID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLlxuICogVGhlIG5lYXIvZmFyIGNsaXAgcGxhbmVzIGNvcnJlc3BvbmQgdG8gYSBub3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlIFogcmFuZ2Ugb2YgWy0xLCAxXSxcbiAqIHdoaWNoIG1hdGNoZXMgV2ViR0wvT3BlbkdMJ3MgY2xpcCB2b2x1bWUuXG4gKiBQYXNzaW5nIG51bGwvdW5kZWZpbmVkL25vIHZhbHVlIGZvciBmYXIgd2lsbCBnZW5lcmF0ZSBpbmZpbml0ZSBwcm9qZWN0aW9uIG1hdHJpeC5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gZm92eSBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgQXNwZWN0IHJhdGlvLiB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGgvaGVpZ2h0XG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bSwgY2FuIGJlIG51bGwgb3IgSW5maW5pdHlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGVyc3BlY3RpdmVOTyhvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgICAgbmY7XG4gIG91dFswXSA9IGYgLyBhc3BlY3Q7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IGY7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMV0gPSAtMTtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTVdID0gMDtcblxuICBpZiAoZmFyICE9IG51bGwgJiYgZmFyICE9PSBJbmZpbml0eSkge1xuICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzE0XSA9IDIgKiBmYXIgKiBuZWFyICogbmY7XG4gIH0gZWxzZSB7XG4gICAgb3V0WzEwXSA9IC0xO1xuICAgIG91dFsxNF0gPSAtMiAqIG5lYXI7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQucGVyc3BlY3RpdmVOT31cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgcGVyc3BlY3RpdmUgPSBwZXJzcGVjdGl2ZU5PO1xuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIG1hdHJpeCBzdWl0YWJsZSBmb3IgV2ViR1BVIHdpdGggdGhlIGdpdmVuIGJvdW5kcy5cbiAqIFRoZSBuZWFyL2ZhciBjbGlwIHBsYW5lcyBjb3JyZXNwb25kIHRvIGEgbm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZSBaIHJhbmdlIG9mIFswLCAxXSxcbiAqIHdoaWNoIG1hdGNoZXMgV2ViR1BVL1Z1bGthbi9EaXJlY3RYL01ldGFsJ3MgY2xpcCB2b2x1bWUuXG4gKiBQYXNzaW5nIG51bGwvdW5kZWZpbmVkL25vIHZhbHVlIGZvciBmYXIgd2lsbCBnZW5lcmF0ZSBpbmZpbml0ZSBwcm9qZWN0aW9uIG1hdHJpeC5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gZm92eSBWZXJ0aWNhbCBmaWVsZCBvZiB2aWV3IGluIHJhZGlhbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBhc3BlY3QgQXNwZWN0IHJhdGlvLiB0eXBpY2FsbHkgdmlld3BvcnQgd2lkdGgvaGVpZ2h0XG4gKiBAcGFyYW0ge251bWJlcn0gbmVhciBOZWFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gZmFyIEZhciBib3VuZCBvZiB0aGUgZnJ1c3R1bSwgY2FuIGJlIG51bGwgb3IgSW5maW5pdHlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcGVyc3BlY3RpdmVaTyhvdXQsIGZvdnksIGFzcGVjdCwgbmVhciwgZmFyKSB7XG4gIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgICAgbmY7XG4gIG91dFswXSA9IGYgLyBhc3BlY3Q7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDA7XG4gIG91dFs0XSA9IDA7XG4gIG91dFs1XSA9IGY7XG4gIG91dFs2XSA9IDA7XG4gIG91dFs3XSA9IDA7XG4gIG91dFs4XSA9IDA7XG4gIG91dFs5XSA9IDA7XG4gIG91dFsxMV0gPSAtMTtcbiAgb3V0WzEyXSA9IDA7XG4gIG91dFsxM10gPSAwO1xuICBvdXRbMTVdID0gMDtcblxuICBpZiAoZmFyICE9IG51bGwgJiYgZmFyICE9PSBJbmZpbml0eSkge1xuICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMTBdID0gZmFyICogbmY7XG4gICAgb3V0WzE0XSA9IGZhciAqIG5lYXIgKiBuZjtcbiAgfSBlbHNlIHtcbiAgICBvdXRbMTBdID0gLTE7XG4gICAgb3V0WzE0XSA9IC1uZWFyO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZmllbGQgb2Ygdmlldy5cbiAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBwcm9qZWN0aW9uIG1hdHJpY2VzIHRvIGJlIHVzZWRcbiAqIHdpdGggdGhlIHN0aWxsIGV4cGVyaWVtZW50YWwgV2ViVlIgQVBJLlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7T2JqZWN0fSBmb3YgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IHVwRGVncmVlcywgZG93bkRlZ3JlZXMsIGxlZnREZWdyZWVzLCByaWdodERlZ3JlZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcnNwZWN0aXZlRnJvbUZpZWxkT2ZWaWV3KG91dCwgZm92LCBuZWFyLCBmYXIpIHtcbiAgdmFyIHVwVGFuID0gTWF0aC50YW4oZm92LnVwRGVncmVlcyAqIE1hdGguUEkgLyAxODAuMCk7XG4gIHZhciBkb3duVGFuID0gTWF0aC50YW4oZm92LmRvd25EZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIGxlZnRUYW4gPSBNYXRoLnRhbihmb3YubGVmdERlZ3JlZXMgKiBNYXRoLlBJIC8gMTgwLjApO1xuICB2YXIgcmlnaHRUYW4gPSBNYXRoLnRhbihmb3YucmlnaHREZWdyZWVzICogTWF0aC5QSSAvIDE4MC4wKTtcbiAgdmFyIHhTY2FsZSA9IDIuMCAvIChsZWZ0VGFuICsgcmlnaHRUYW4pO1xuICB2YXIgeVNjYWxlID0gMi4wIC8gKHVwVGFuICsgZG93blRhbik7XG4gIG91dFswXSA9IHhTY2FsZTtcbiAgb3V0WzFdID0gMC4wO1xuICBvdXRbMl0gPSAwLjA7XG4gIG91dFszXSA9IDAuMDtcbiAgb3V0WzRdID0gMC4wO1xuICBvdXRbNV0gPSB5U2NhbGU7XG4gIG91dFs2XSA9IDAuMDtcbiAgb3V0WzddID0gMC4wO1xuICBvdXRbOF0gPSAtKChsZWZ0VGFuIC0gcmlnaHRUYW4pICogeFNjYWxlICogMC41KTtcbiAgb3V0WzldID0gKHVwVGFuIC0gZG93blRhbikgKiB5U2NhbGUgKiAwLjU7XG4gIG91dFsxMF0gPSBmYXIgLyAobmVhciAtIGZhcik7XG4gIG91dFsxMV0gPSAtMS4wO1xuICBvdXRbMTJdID0gMC4wO1xuICBvdXRbMTNdID0gMC4wO1xuICBvdXRbMTRdID0gZmFyICogbmVhciAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzE1XSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgb3J0aG9nb25hbCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHMuXG4gKiBUaGUgbmVhci9mYXIgY2xpcCBwbGFuZXMgY29ycmVzcG9uZCB0byBhIG5vcm1hbGl6ZWQgZGV2aWNlIGNvb3JkaW5hdGUgWiByYW5nZSBvZiBbLTEsIDFdLFxuICogd2hpY2ggbWF0Y2hlcyBXZWJHTC9PcGVuR0wncyBjbGlwIHZvbHVtZS5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gb3J0aG9OTyhvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gIHZhciBsciA9IDEgLyAobGVmdCAtIHJpZ2h0KTtcbiAgdmFyIGJ0ID0gMSAvIChib3R0b20gLSB0b3ApO1xuICB2YXIgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICBvdXRbMF0gPSAtMiAqIGxyO1xuICBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSAwO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAtMiAqIGJ0O1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSAwO1xuICBvdXRbOV0gPSAwO1xuICBvdXRbMTBdID0gMiAqIG5mO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IChsZWZ0ICsgcmlnaHQpICogbHI7XG4gIG91dFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJ0O1xuICBvdXRbMTRdID0gKGZhciArIG5lYXIpICogbmY7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQub3J0aG9OT31cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgb3J0aG8gPSBvcnRob05PO1xuLyoqXG4gKiBHZW5lcmF0ZXMgYSBvcnRob2dvbmFsIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kcy5cbiAqIFRoZSBuZWFyL2ZhciBjbGlwIHBsYW5lcyBjb3JyZXNwb25kIHRvIGEgbm9ybWFsaXplZCBkZXZpY2UgY29vcmRpbmF0ZSBaIHJhbmdlIG9mIFswLCAxXSxcbiAqIHdoaWNoIG1hdGNoZXMgV2ViR1BVL1Z1bGthbi9EaXJlY3RYL01ldGFsJ3MgY2xpcCB2b2x1bWUuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCBmcnVzdHVtIG1hdHJpeCB3aWxsIGJlIHdyaXR0ZW4gaW50b1xuICogQHBhcmFtIHtudW1iZXJ9IGxlZnQgTGVmdCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IHJpZ2h0IFJpZ2h0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gYm90dG9tIEJvdHRvbSBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IHRvcCBUb3AgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG9ydGhvWk8ob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICB2YXIgbHIgPSAxIC8gKGxlZnQgLSByaWdodCk7XG4gIHZhciBidCA9IDEgLyAoYm90dG9tIC0gdG9wKTtcbiAgdmFyIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgb3V0WzBdID0gLTIgKiBscjtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gLTIgKiBidDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gMDtcbiAgb3V0WzldID0gMDtcbiAgb3V0WzEwXSA9IG5mO1xuICBvdXRbMTFdID0gMDtcbiAgb3V0WzEyXSA9IChsZWZ0ICsgcmlnaHQpICogbHI7XG4gIG91dFsxM10gPSAodG9wICsgYm90dG9tKSAqIGJ0O1xuICBvdXRbMTRdID0gbmVhciAqIG5mO1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgbG9vay1hdCBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXMuXG4gKiBJZiB5b3Ugd2FudCBhIG1hdHJpeCB0aGF0IGFjdHVhbGx5IG1ha2VzIGFuIG9iamVjdCBsb29rIGF0IGFub3RoZXIgb2JqZWN0LCB5b3Ugc2hvdWxkIHVzZSB0YXJnZXRUbyBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBleWUgUG9zaXRpb24gb2YgdGhlIHZpZXdlclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB1cCB2ZWMzIHBvaW50aW5nIHVwXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxvb2tBdChvdXQsIGV5ZSwgY2VudGVyLCB1cCkge1xuICB2YXIgeDAsIHgxLCB4MiwgeTAsIHkxLCB5MiwgejAsIHoxLCB6MiwgbGVuO1xuICB2YXIgZXlleCA9IGV5ZVswXTtcbiAgdmFyIGV5ZXkgPSBleWVbMV07XG4gIHZhciBleWV6ID0gZXllWzJdO1xuICB2YXIgdXB4ID0gdXBbMF07XG4gIHZhciB1cHkgPSB1cFsxXTtcbiAgdmFyIHVweiA9IHVwWzJdO1xuICB2YXIgY2VudGVyeCA9IGNlbnRlclswXTtcbiAgdmFyIGNlbnRlcnkgPSBjZW50ZXJbMV07XG4gIHZhciBjZW50ZXJ6ID0gY2VudGVyWzJdO1xuXG4gIGlmIChNYXRoLmFicyhleWV4IC0gY2VudGVyeCkgPCBnbE1hdHJpeC5FUFNJTE9OICYmIE1hdGguYWJzKGV5ZXkgLSBjZW50ZXJ5KSA8IGdsTWF0cml4LkVQU0lMT04gJiYgTWF0aC5hYnMoZXlleiAtIGNlbnRlcnopIDwgZ2xNYXRyaXguRVBTSUxPTikge1xuICAgIHJldHVybiBpZGVudGl0eShvdXQpO1xuICB9XG5cbiAgejAgPSBleWV4IC0gY2VudGVyeDtcbiAgejEgPSBleWV5IC0gY2VudGVyeTtcbiAgejIgPSBleWV6IC0gY2VudGVyejtcbiAgbGVuID0gMSAvIE1hdGguaHlwb3QoejAsIHoxLCB6Mik7XG4gIHowICo9IGxlbjtcbiAgejEgKj0gbGVuO1xuICB6MiAqPSBsZW47XG4gIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcbiAgeDEgPSB1cHogKiB6MCAtIHVweCAqIHoyO1xuICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gIGxlbiA9IE1hdGguaHlwb3QoeDAsIHgxLCB4Mik7XG5cbiAgaWYgKCFsZW4pIHtcbiAgICB4MCA9IDA7XG4gICAgeDEgPSAwO1xuICAgIHgyID0gMDtcbiAgfSBlbHNlIHtcbiAgICBsZW4gPSAxIC8gbGVuO1xuICAgIHgwICo9IGxlbjtcbiAgICB4MSAqPSBsZW47XG4gICAgeDIgKj0gbGVuO1xuICB9XG5cbiAgeTAgPSB6MSAqIHgyIC0gejIgKiB4MTtcbiAgeTEgPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgeTIgPSB6MCAqIHgxIC0gejEgKiB4MDtcbiAgbGVuID0gTWF0aC5oeXBvdCh5MCwgeTEsIHkyKTtcblxuICBpZiAoIWxlbikge1xuICAgIHkwID0gMDtcbiAgICB5MSA9IDA7XG4gICAgeTIgPSAwO1xuICB9IGVsc2Uge1xuICAgIGxlbiA9IDEgLyBsZW47XG4gICAgeTAgKj0gbGVuO1xuICAgIHkxICo9IGxlbjtcbiAgICB5MiAqPSBsZW47XG4gIH1cblxuICBvdXRbMF0gPSB4MDtcbiAgb3V0WzFdID0geTA7XG4gIG91dFsyXSA9IHowO1xuICBvdXRbM10gPSAwO1xuICBvdXRbNF0gPSB4MTtcbiAgb3V0WzVdID0geTE7XG4gIG91dFs2XSA9IHoxO1xuICBvdXRbN10gPSAwO1xuICBvdXRbOF0gPSB4MjtcbiAgb3V0WzldID0geTI7XG4gIG91dFsxMF0gPSB6MjtcbiAgb3V0WzExXSA9IDA7XG4gIG91dFsxMl0gPSAtKHgwICogZXlleCArIHgxICogZXlleSArIHgyICogZXlleik7XG4gIG91dFsxM10gPSAtKHkwICogZXlleCArIHkxICogZXlleSArIHkyICogZXlleik7XG4gIG91dFsxNF0gPSAtKHowICogZXlleCArIHoxICogZXlleSArIHoyICogZXlleik7XG4gIG91dFsxNV0gPSAxO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXRyaXggdGhhdCBtYWtlcyBzb21ldGhpbmcgbG9vayBhdCBzb21ldGhpbmcgZWxzZS5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gZXllIFBvc2l0aW9uIG9mIHRoZSB2aWV3ZXJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBjZW50ZXIgUG9pbnQgdGhlIHZpZXdlciBpcyBsb29raW5nIGF0XG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0YXJnZXRUbyhvdXQsIGV5ZSwgdGFyZ2V0LCB1cCkge1xuICB2YXIgZXlleCA9IGV5ZVswXSxcbiAgICAgIGV5ZXkgPSBleWVbMV0sXG4gICAgICBleWV6ID0gZXllWzJdLFxuICAgICAgdXB4ID0gdXBbMF0sXG4gICAgICB1cHkgPSB1cFsxXSxcbiAgICAgIHVweiA9IHVwWzJdO1xuICB2YXIgejAgPSBleWV4IC0gdGFyZ2V0WzBdLFxuICAgICAgejEgPSBleWV5IC0gdGFyZ2V0WzFdLFxuICAgICAgejIgPSBleWV6IC0gdGFyZ2V0WzJdO1xuICB2YXIgbGVuID0gejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyO1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgIHowICo9IGxlbjtcbiAgICB6MSAqPSBsZW47XG4gICAgejIgKj0gbGVuO1xuICB9XG5cbiAgdmFyIHgwID0gdXB5ICogejIgLSB1cHogKiB6MSxcbiAgICAgIHgxID0gdXB6ICogejAgLSB1cHggKiB6MixcbiAgICAgIHgyID0gdXB4ICogejEgLSB1cHkgKiB6MDtcbiAgbGVuID0geDAgKiB4MCArIHgxICogeDEgKyB4MiAqIHgyO1xuXG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgIHgwICo9IGxlbjtcbiAgICB4MSAqPSBsZW47XG4gICAgeDIgKj0gbGVuO1xuICB9XG5cbiAgb3V0WzBdID0geDA7XG4gIG91dFsxXSA9IHgxO1xuICBvdXRbMl0gPSB4MjtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gejEgKiB4MiAtIHoyICogeDE7XG4gIG91dFs1XSA9IHoyICogeDAgLSB6MCAqIHgyO1xuICBvdXRbNl0gPSB6MCAqIHgxIC0gejEgKiB4MDtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gejA7XG4gIG91dFs5XSA9IHoxO1xuICBvdXRbMTBdID0gejI7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gZXlleDtcbiAgb3V0WzEzXSA9IGV5ZXk7XG4gIG91dFsxNF0gPSBleWV6O1xuICBvdXRbMTVdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzdHIoYSkge1xuICByZXR1cm4gXCJtYXQ0KFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiLCBcIiArIGFbNF0gKyBcIiwgXCIgKyBhWzVdICsgXCIsIFwiICsgYVs2XSArIFwiLCBcIiArIGFbN10gKyBcIiwgXCIgKyBhWzhdICsgXCIsIFwiICsgYVs5XSArIFwiLCBcIiArIGFbMTBdICsgXCIsIFwiICsgYVsxMV0gKyBcIiwgXCIgKyBhWzEyXSArIFwiLCBcIiArIGFbMTNdICsgXCIsIFwiICsgYVsxNF0gKyBcIiwgXCIgKyBhWzE1XSArIFwiKVwiO1xufVxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9iKGEpIHtcbiAgcmV0dXJuIE1hdGguaHlwb3QoYVswXSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XSwgYVs2XSwgYVs3XSwgYVs4XSwgYVs5XSwgYVsxMF0sIGFbMTFdLCBhWzEyXSwgYVsxM10sIGFbMTRdLCBhWzE1XSk7XG59XG4vKipcbiAqIEFkZHMgdHdvIG1hdDQnc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl07XG4gIG91dFs3XSA9IGFbN10gKyBiWzddO1xuICBvdXRbOF0gPSBhWzhdICsgYls4XTtcbiAgb3V0WzldID0gYVs5XSArIGJbOV07XG4gIG91dFsxMF0gPSBhWzEwXSArIGJbMTBdO1xuICBvdXRbMTFdID0gYVsxMV0gKyBiWzExXTtcbiAgb3V0WzEyXSA9IGFbMTJdICsgYlsxMl07XG4gIG91dFsxM10gPSBhWzEzXSArIGJbMTNdO1xuICBvdXRbMTRdID0gYVsxNF0gKyBiWzE0XTtcbiAgb3V0WzE1XSA9IGFbMTVdICsgYlsxNV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFN1YnRyYWN0cyBtYXRyaXggYiBmcm9tIG1hdHJpeCBhXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICBvdXRbNF0gPSBhWzRdIC0gYls0XTtcbiAgb3V0WzVdID0gYVs1XSAtIGJbNV07XG4gIG91dFs2XSA9IGFbNl0gLSBiWzZdO1xuICBvdXRbN10gPSBhWzddIC0gYls3XTtcbiAgb3V0WzhdID0gYVs4XSAtIGJbOF07XG4gIG91dFs5XSA9IGFbOV0gLSBiWzldO1xuICBvdXRbMTBdID0gYVsxMF0gLSBiWzEwXTtcbiAgb3V0WzExXSA9IGFbMTFdIC0gYlsxMV07XG4gIG91dFsxMl0gPSBhWzEyXSAtIGJbMTJdO1xuICBvdXRbMTNdID0gYVsxM10gLSBiWzEzXTtcbiAgb3V0WzE0XSA9IGFbMTRdIC0gYlsxNF07XG4gIG91dFsxNV0gPSBhWzE1XSAtIGJbMTVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICBvdXRbMl0gPSBhWzJdICogYjtcbiAgb3V0WzNdID0gYVszXSAqIGI7XG4gIG91dFs0XSA9IGFbNF0gKiBiO1xuICBvdXRbNV0gPSBhWzVdICogYjtcbiAgb3V0WzZdID0gYVs2XSAqIGI7XG4gIG91dFs3XSA9IGFbN10gKiBiO1xuICBvdXRbOF0gPSBhWzhdICogYjtcbiAgb3V0WzldID0gYVs5XSAqIGI7XG4gIG91dFsxMF0gPSBhWzEwXSAqIGI7XG4gIG91dFsxMV0gPSBhWzExXSAqIGI7XG4gIG91dFsxMl0gPSBhWzEyXSAqIGI7XG4gIG91dFsxM10gPSBhWzEzXSAqIGI7XG4gIG91dFsxNF0gPSBhWzE0XSAqIGI7XG4gIG91dFsxNV0gPSBhWzE1XSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFkZHMgdHdvIG1hdDQncyBhZnRlciBtdWx0aXBseWluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGJ5IGEgc2NhbGFyIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhckFuZEFkZChvdXQsIGEsIGIsIHNjYWxlKSB7XG4gIG91dFswXSA9IGFbMF0gKyBiWzBdICogc2NhbGU7XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdICogc2NhbGU7XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdICogc2NhbGU7XG4gIG91dFszXSA9IGFbM10gKyBiWzNdICogc2NhbGU7XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdICogc2NhbGU7XG4gIG91dFs1XSA9IGFbNV0gKyBiWzVdICogc2NhbGU7XG4gIG91dFs2XSA9IGFbNl0gKyBiWzZdICogc2NhbGU7XG4gIG91dFs3XSA9IGFbN10gKyBiWzddICogc2NhbGU7XG4gIG91dFs4XSA9IGFbOF0gKyBiWzhdICogc2NhbGU7XG4gIG91dFs5XSA9IGFbOV0gKyBiWzldICogc2NhbGU7XG4gIG91dFsxMF0gPSBhWzEwXSArIGJbMTBdICogc2NhbGU7XG4gIG91dFsxMV0gPSBhWzExXSArIGJbMTFdICogc2NhbGU7XG4gIG91dFsxMl0gPSBhWzEyXSArIGJbMTJdICogc2NhbGU7XG4gIG91dFsxM10gPSBhWzEzXSArIGJbMTNdICogc2NhbGU7XG4gIG91dFsxNF0gPSBhWzE0XSArIGJbMTRdICogc2NhbGU7XG4gIG91dFsxNV0gPSBhWzE1XSArIGJbMTVdICogc2NhbGU7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdICYmIGFbNl0gPT09IGJbNl0gJiYgYVs3XSA9PT0gYls3XSAmJiBhWzhdID09PSBiWzhdICYmIGFbOV0gPT09IGJbOV0gJiYgYVsxMF0gPT09IGJbMTBdICYmIGFbMTFdID09PSBiWzExXSAmJiBhWzEyXSA9PT0gYlsxMl0gJiYgYVsxM10gPT09IGJbMTNdICYmIGFbMTRdID09PSBiWzE0XSAmJiBhWzE1XSA9PT0gYlsxNV07XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0NH0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBhNCA9IGFbNF0sXG4gICAgICBhNSA9IGFbNV0sXG4gICAgICBhNiA9IGFbNl0sXG4gICAgICBhNyA9IGFbN107XG4gIHZhciBhOCA9IGFbOF0sXG4gICAgICBhOSA9IGFbOV0sXG4gICAgICBhMTAgPSBhWzEwXSxcbiAgICAgIGExMSA9IGFbMTFdO1xuICB2YXIgYTEyID0gYVsxMl0sXG4gICAgICBhMTMgPSBhWzEzXSxcbiAgICAgIGExNCA9IGFbMTRdLFxuICAgICAgYTE1ID0gYVsxNV07XG4gIHZhciBiMCA9IGJbMF0sXG4gICAgICBiMSA9IGJbMV0sXG4gICAgICBiMiA9IGJbMl0sXG4gICAgICBiMyA9IGJbM107XG4gIHZhciBiNCA9IGJbNF0sXG4gICAgICBiNSA9IGJbNV0sXG4gICAgICBiNiA9IGJbNl0sXG4gICAgICBiNyA9IGJbN107XG4gIHZhciBiOCA9IGJbOF0sXG4gICAgICBiOSA9IGJbOV0sXG4gICAgICBiMTAgPSBiWzEwXSxcbiAgICAgIGIxMSA9IGJbMTFdO1xuICB2YXIgYjEyID0gYlsxMl0sXG4gICAgICBiMTMgPSBiWzEzXSxcbiAgICAgIGIxNCA9IGJbMTRdLFxuICAgICAgYjE1ID0gYlsxNV07XG4gIHJldHVybiBNYXRoLmFicyhhMCAtIGIwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiYgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEpLCBNYXRoLmFicyhiMSkpICYmIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJiBNYXRoLmFicyhhMyAtIGIzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiYgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTQpLCBNYXRoLmFicyhiNCkpICYmIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKSAmJiBNYXRoLmFicyhhNiAtIGI2KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiYgTWF0aC5hYnMoYTcgLSBiNykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTcpLCBNYXRoLmFicyhiNykpICYmIE1hdGguYWJzKGE4IC0gYjgpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE4KSwgTWF0aC5hYnMoYjgpKSAmJiBNYXRoLmFicyhhOSAtIGI5KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhOSksIE1hdGguYWJzKGI5KSkgJiYgTWF0aC5hYnMoYTEwIC0gYjEwKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTApLCBNYXRoLmFicyhiMTApKSAmJiBNYXRoLmFicyhhMTEgLSBiMTEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMSksIE1hdGguYWJzKGIxMSkpICYmIE1hdGguYWJzKGExMiAtIGIxMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEyKSwgTWF0aC5hYnMoYjEyKSkgJiYgTWF0aC5hYnMoYTEzIC0gYjEzKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTMpLCBNYXRoLmFicyhiMTMpKSAmJiBNYXRoLmFicyhhMTQgLSBiMTQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExNCksIE1hdGguYWJzKGIxNCkpICYmIE1hdGguYWJzKGExNSAtIGIxNSkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTE1KSwgTWF0aC5hYnMoYjE1KSk7XG59XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0NC5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbXVsID0gbXVsdGlwbHk7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0NC5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3ViID0gc3VidHJhY3Q7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcbiAqIDMgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbW9kdWxlIHZlYzNcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzNcbiAqXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7dmVjM30gYSBuZXcgM0QgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICBvdXRbMl0gPSBhWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHopO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKHgsIHksIHopIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMyB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldChvdXQsIHgsIHksIHopIHtcbiAgb3V0WzBdID0geDtcbiAgb3V0WzFdID0geTtcbiAgb3V0WzJdID0gejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQWRkcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogRGl2aWRlcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gIG91dFsyXSA9IGFbMl0gLyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjZWlsXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICBvdXRbMl0gPSBNYXRoLmNlaWwoYVsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBmbG9vclxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmbG9vcihvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5mbG9vcihhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5tYXgoYVsyXSwgYlsyXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byByb3VuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5yb3VuZChhWzJdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2NhbGVzIGEgdmVjMyBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFkZHMgdHdvIHZlYzMncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVBbmRBZGQob3V0LCBhLCBiLCBzY2FsZSkge1xuICBvdXRbMF0gPSBhWzBdICsgYlswXSAqIHNjYWxlO1xuICBvdXRbMV0gPSBhWzFdICsgYlsxXSAqIHNjYWxlO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlKGEsIGIpIHtcbiAgdmFyIHggPSBiWzBdIC0gYVswXTtcbiAgdmFyIHkgPSBiWzFdIC0gYVsxXTtcbiAgdmFyIHogPSBiWzJdIC0gYVsyXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSwgeik7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNxdWFyZWREaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHJldHVybiB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG59XG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB2ZWN0b3IgdG8gaW52ZXJ0XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGludmVyc2Uob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5ICsgeiAqIHo7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IGFbMF0gKiBsZW47XG4gIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gIG91dFsyXSA9IGFbMl0gKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl07XG59XG4vKipcbiAqIENvbXB1dGVzIHRoZSBjcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIGEsIGIpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXTtcbiAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gIG91dFsxXSA9IGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbMl0gPSBheCAqIGJ5IC0gYXkgKiBieDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdO1xuICB2YXIgYXkgPSBhWzFdO1xuICB2YXIgYXogPSBhWzJdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIG91dFsyXSA9IGF6ICsgdCAqIChiWzJdIC0gYXopO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBQZXJmb3JtcyBhIGhlcm1pdGUgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGhlcm1pdGUob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdDtcbiAgdmFyIGZhY3RvcjEgPSBmYWN0b3JUaW1lczIgKiAoMiAqIHQgLSAzKSArIDE7XG4gIHZhciBmYWN0b3IyID0gZmFjdG9yVGltZXMyICogKHQgLSAyKSArIHQ7XG4gIHZhciBmYWN0b3IzID0gZmFjdG9yVGltZXMyICogKHQgLSAxKTtcbiAgdmFyIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiAoMyAtIDIgKiB0KTtcbiAgb3V0WzBdID0gYVswXSAqIGZhY3RvcjEgKyBiWzBdICogZmFjdG9yMiArIGNbMF0gKiBmYWN0b3IzICsgZFswXSAqIGZhY3RvcjQ7XG4gIG91dFsxXSA9IGFbMV0gKiBmYWN0b3IxICsgYlsxXSAqIGZhY3RvcjIgKyBjWzFdICogZmFjdG9yMyArIGRbMV0gKiBmYWN0b3I0O1xuICBvdXRbMl0gPSBhWzJdICogZmFjdG9yMSArIGJbMl0gKiBmYWN0b3IyICsgY1syXSAqIGZhY3RvcjMgKyBkWzJdICogZmFjdG9yNDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBiZXppZXIgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGJlemllcihvdXQsIGEsIGIsIGMsIGQsIHQpIHtcbiAgdmFyIGludmVyc2VGYWN0b3IgPSAxIC0gdDtcbiAgdmFyIGludmVyc2VGYWN0b3JUaW1lc1R3byA9IGludmVyc2VGYWN0b3IgKiBpbnZlcnNlRmFjdG9yO1xuICB2YXIgZmFjdG9yVGltZXMyID0gdCAqIHQ7XG4gIHZhciBmYWN0b3IxID0gaW52ZXJzZUZhY3RvclRpbWVzVHdvICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvcjIgPSAzICogdCAqIGludmVyc2VGYWN0b3JUaW1lc1R3bztcbiAgdmFyIGZhY3RvcjMgPSAzICogZmFjdG9yVGltZXMyICogaW52ZXJzZUZhY3RvcjtcbiAgdmFyIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiB0O1xuICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDtcbiAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7XG4gIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20ob3V0LCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gIHZhciB6ID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgLSAxLjA7XG4gIHZhciB6U2NhbGUgPSBNYXRoLnNxcnQoMS4wIC0geiAqIHopICogc2NhbGU7XG4gIG91dFswXSA9IE1hdGguY29zKHIpICogelNjYWxlO1xuICBvdXRbMV0gPSBNYXRoLnNpbihyKSAqIHpTY2FsZTtcbiAgb3V0WzJdID0geiAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQ0LlxuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1NYXQ0KG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdO1xuICB2YXIgdyA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XTtcbiAgdyA9IHcgfHwgMS4wO1xuICBvdXRbMF0gPSAobVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0pIC8gdztcbiAgb3V0WzFdID0gKG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzldICogeiArIG1bMTNdKSAvIHc7XG4gIG91dFsyXSA9IChtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0pIC8gdztcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0My5cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBtIHRoZSAzeDMgbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDMob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIG91dFswXSA9IHggKiBtWzBdICsgeSAqIG1bM10gKyB6ICogbVs2XTtcbiAgb3V0WzFdID0geCAqIG1bMV0gKyB5ICogbVs0XSArIHogKiBtWzddO1xuICBvdXRbMl0gPSB4ICogbVsyXSArIHkgKiBtWzVdICsgeiAqIG1bOF07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzMgd2l0aCBhIHF1YXRcbiAqIENhbiBhbHNvIGJlIHVzZWQgZm9yIGR1YWwgcXVhdGVybmlvbnMuIChNdWx0aXBseSBpdCB3aXRoIHRoZSByZWFsIHBhcnQpXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybVF1YXQob3V0LCBhLCBxKSB7XG4gIC8vIGJlbmNobWFya3M6IGh0dHBzOi8vanNwZXJmLmNvbS9xdWF0ZXJuaW9uLXRyYW5zZm9ybS12ZWMzLWltcGxlbWVudGF0aW9ucy1maXhlZFxuICB2YXIgcXggPSBxWzBdLFxuICAgICAgcXkgPSBxWzFdLFxuICAgICAgcXogPSBxWzJdLFxuICAgICAgcXcgPSBxWzNdO1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXSxcbiAgICAgIHogPSBhWzJdOyAvLyB2YXIgcXZlYyA9IFtxeCwgcXksIHF6XTtcbiAgLy8gdmFyIHV2ID0gdmVjMy5jcm9zcyhbXSwgcXZlYywgYSk7XG5cbiAgdmFyIHV2eCA9IHF5ICogeiAtIHF6ICogeSxcbiAgICAgIHV2eSA9IHF6ICogeCAtIHF4ICogeixcbiAgICAgIHV2eiA9IHF4ICogeSAtIHF5ICogeDsgLy8gdmFyIHV1diA9IHZlYzMuY3Jvc3MoW10sIHF2ZWMsIHV2KTtcblxuICB2YXIgdXV2eCA9IHF5ICogdXZ6IC0gcXogKiB1dnksXG4gICAgICB1dXZ5ID0gcXogKiB1dnggLSBxeCAqIHV2eixcbiAgICAgIHV1dnogPSBxeCAqIHV2eSAtIHF5ICogdXZ4OyAvLyB2ZWMzLnNjYWxlKHV2LCB1diwgMiAqIHcpO1xuXG4gIHZhciB3MiA9IHF3ICogMjtcbiAgdXZ4ICo9IHcyO1xuICB1dnkgKj0gdzI7XG4gIHV2eiAqPSB3MjsgLy8gdmVjMy5zY2FsZSh1dXYsIHV1diwgMik7XG5cbiAgdXV2eCAqPSAyO1xuICB1dXZ5ICo9IDI7XG4gIHV1dnogKj0gMjsgLy8gcmV0dXJuIHZlYzMuYWRkKG91dCwgYSwgdmVjMy5hZGQob3V0LCB1diwgdXV2KSk7XG5cbiAgb3V0WzBdID0geCArIHV2eCArIHV1dng7XG4gIG91dFsxXSA9IHkgKyB1dnkgKyB1dXZ5O1xuICBvdXRbMl0gPSB6ICsgdXZ6ICsgdXV2ejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlIGEgM0QgdmVjdG9yIGFyb3VuZCB0aGUgeC1heGlzXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzNcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWChvdXQsIGEsIGIsIHJhZCkge1xuICB2YXIgcCA9IFtdLFxuICAgICAgciA9IFtdOyAvL1RyYW5zbGF0ZSBwb2ludCB0byB0aGUgb3JpZ2luXG5cbiAgcFswXSA9IGFbMF0gLSBiWzBdO1xuICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIHBbMl0gPSBhWzJdIC0gYlsyXTsgLy9wZXJmb3JtIHJvdGF0aW9uXG5cbiAgclswXSA9IHBbMF07XG4gIHJbMV0gPSBwWzFdICogTWF0aC5jb3MocmFkKSAtIHBbMl0gKiBNYXRoLnNpbihyYWQpO1xuICByWzJdID0gcFsxXSAqIE1hdGguc2luKHJhZCkgKyBwWzJdICogTWF0aC5jb3MocmFkKTsgLy90cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHJbMF0gKyBiWzBdO1xuICBvdXRbMV0gPSByWzFdICsgYlsxXTtcbiAgb3V0WzJdID0gclsyXSArIGJbMl07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHktYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgdmVjMyBwb2ludCB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIFRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCBiLCByYWQpIHtcbiAgdmFyIHAgPSBbXSxcbiAgICAgIHIgPSBbXTsgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXG4gIHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgcFsxXSA9IGFbMV0gLSBiWzFdO1xuICBwWzJdID0gYVsyXSAtIGJbMl07IC8vcGVyZm9ybSByb3RhdGlvblxuXG4gIHJbMF0gPSBwWzJdICogTWF0aC5zaW4ocmFkKSArIHBbMF0gKiBNYXRoLmNvcyhyYWQpO1xuICByWzFdID0gcFsxXTtcbiAgclsyXSA9IHBbMl0gKiBNYXRoLmNvcyhyYWQpIC0gcFswXSAqIE1hdGguc2luKHJhZCk7IC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblxuICBvdXRbMF0gPSByWzBdICsgYlswXTtcbiAgb3V0WzFdID0gclsxXSArIGJbMV07XG4gIG91dFsyXSA9IHJbMl0gKyBiWzJdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB6LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYiBUaGUgb3JpZ2luIG9mIHRoZSByb3RhdGlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCBUaGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gcmFkaWFuc1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVaKG91dCwgYSwgYiwgcmFkKSB7XG4gIHZhciBwID0gW10sXG4gICAgICByID0gW107IC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cblxuICBwWzBdID0gYVswXSAtIGJbMF07XG4gIHBbMV0gPSBhWzFdIC0gYlsxXTtcbiAgcFsyXSA9IGFbMl0gLSBiWzJdOyAvL3BlcmZvcm0gcm90YXRpb25cblxuICByWzBdID0gcFswXSAqIE1hdGguY29zKHJhZCkgLSBwWzFdICogTWF0aC5zaW4ocmFkKTtcbiAgclsxXSA9IHBbMF0gKiBNYXRoLnNpbihyYWQpICsgcFsxXSAqIE1hdGguY29zKHJhZCk7XG4gIHJbMl0gPSBwWzJdOyAvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG5cbiAgb3V0WzBdID0gclswXSArIGJbMF07XG4gIG91dFsxXSA9IHJbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSByWzJdICsgYlsyXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAzRCB2ZWN0b3JzXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgYW5nbGUgaW4gcmFkaWFuc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBhbmdsZShhLCBiKSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBieCA9IGJbMF0sXG4gICAgICBieSA9IGJbMV0sXG4gICAgICBieiA9IGJbMl0sXG4gICAgICBtYWcxID0gTWF0aC5zcXJ0KGF4ICogYXggKyBheSAqIGF5ICsgYXogKiBheiksXG4gICAgICBtYWcyID0gTWF0aC5zcXJ0KGJ4ICogYnggKyBieSAqIGJ5ICsgYnogKiBieiksXG4gICAgICBtYWcgPSBtYWcxICogbWFnMixcbiAgICAgIGNvc2luZSA9IG1hZyAmJiBkb3QoYSwgYikgLyBtYWc7XG4gIHJldHVybiBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5tYXgoY29zaW5lLCAtMSksIDEpKTtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMyB0byB6ZXJvXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIG91dFsyXSA9IDAuMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInZlYzMoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIilcIjtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgVGhlIHNlY29uZCB2ZWN0b3IuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgdmFyIGEwID0gYVswXSxcbiAgICAgIGExID0gYVsxXSxcbiAgICAgIGEyID0gYVsyXTtcbiAgdmFyIGIwID0gYlswXSxcbiAgICAgIGIxID0gYlsxXSxcbiAgICAgIGIyID0gYlsyXTtcbiAgcmV0dXJuIE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJiBNYXRoLmFicyhhMSAtIGIxKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiYgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTIpLCBNYXRoLmFicyhiMikpO1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5kaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjM3MuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjMy4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzNzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlYyA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgIHZhciBpLCBsO1xuXG4gICAgaWYgKCFzdHJpZGUpIHtcbiAgICAgIHN0cmlkZSA9IDM7XG4gICAgfVxuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBsID0gTWF0aC5taW4oY291bnQgKiBzdHJpZGUgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGEubGVuZ3RoO1xuICAgIH1cblxuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICB2ZWNbMF0gPSBhW2ldO1xuICAgICAgdmVjWzFdID0gYVtpICsgMV07XG4gICAgICB2ZWNbMl0gPSBhW2kgKyAyXTtcbiAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgYVtpXSA9IHZlY1swXTtcbiAgICAgIGFbaSArIDFdID0gdmVjWzFdO1xuICAgICAgYVtpICsgMl0gPSB2ZWNbMl07XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG4gIH07XG59KCk7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG4vKipcbiAqIDQgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbW9kdWxlIHZlYzRcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzRcbiAqXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gY2xvbmVcbiAqIEByZXR1cm5zIHt2ZWM0fSBhIG5ldyA0RCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmUoYSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjNCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKHgsIHksIHosIHcpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB5O1xuICBvdXRbMl0gPSB6O1xuICBvdXRbM10gPSB3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjNCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkob3V0LCBhKSB7XG4gIG91dFswXSA9IGFbMF07XG4gIG91dFsxXSA9IGFbMV07XG4gIG91dFsyXSA9IGFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzQgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4LCB5LCB6LCB3KSB7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIG91dFszXSA9IHc7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFkZHMgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3Qob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgb3V0WzNdID0gYVszXSAqIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgb3V0WzNdID0gYVszXSAvIGJbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNlaWxcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2VpbChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5jZWlsKGFbM10pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gZmxvb3JcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIG91dFsyXSA9IE1hdGguZmxvb3IoYVsyXSk7XG4gIG91dFszXSA9IE1hdGguZmxvb3IoYVszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1pbihhWzJdLCBiWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5taW4oYVszXSwgYlszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1heChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5tYXgoYVszXSwgYlszXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byByb3VuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChvdXQsIGEpIHtcbiAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgb3V0WzJdID0gTWF0aC5yb3VuZChhWzJdKTtcbiAgb3V0WzNdID0gTWF0aC5yb3VuZChhWzNdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2NhbGVzIGEgdmVjNCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGUob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IGFbMF0gKiBiO1xuICBvdXRbMV0gPSBhWzFdICogYjtcbiAgb3V0WzJdID0gYVsyXSAqIGI7XG4gIG91dFszXSA9IGFbM10gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byB2ZWM0J3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgb3V0WzJdID0gYVsyXSArIGJbMl0gKiBzY2FsZTtcbiAgb3V0WzNdID0gYVszXSArIGJbM10gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF07XG4gIHZhciB5ID0gYlsxXSAtIGFbMV07XG4gIHZhciB6ID0gYlsyXSAtIGFbMl07XG4gIHZhciB3ID0gYlszXSAtIGFbM107XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHksIHosIHcpO1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdO1xuICB2YXIgeSA9IGJbMV0gLSBhWzFdO1xuICB2YXIgeiA9IGJbMl0gLSBhWzJdO1xuICB2YXIgdyA9IGJbM10gLSBhWzNdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICByZXR1cm4gTWF0aC5oeXBvdCh4LCB5LCB6LCB3KTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkTGVuZ3RoKGEpIHtcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcbiAgdmFyIHcgPSBhWzNdO1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG59XG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbmVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSAtYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICBvdXRbM10gPSAxLjAgLyBhWzNdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuICB2YXIgdyA9IGFbM107XG4gIHZhciBsZW4gPSB4ICogeCArIHkgKiB5ICsgeiAqIHogKyB3ICogdztcblxuICBpZiAobGVuID4gMCkge1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IHggKiBsZW47XG4gIG91dFsxXSA9IHkgKiBsZW47XG4gIG91dFsyXSA9IHogKiBsZW47XG4gIG91dFszXSA9IHcgKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl0gKyBhWzNdICogYlszXTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgY3Jvc3MtcHJvZHVjdCBvZiB0aHJlZSB2ZWN0b3JzIGluIGEgNC1kaW1lbnNpb25hbCBzcGFjZVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSByZXN1bHQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBVIHRoZSBmaXJzdCB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBWIHRoZSBzZWNvbmQgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gVyB0aGUgdGhpcmQgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjNH0gcmVzdWx0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyb3NzKG91dCwgdSwgdiwgdykge1xuICB2YXIgQSA9IHZbMF0gKiB3WzFdIC0gdlsxXSAqIHdbMF0sXG4gICAgICBCID0gdlswXSAqIHdbMl0gLSB2WzJdICogd1swXSxcbiAgICAgIEMgPSB2WzBdICogd1szXSAtIHZbM10gKiB3WzBdLFxuICAgICAgRCA9IHZbMV0gKiB3WzJdIC0gdlsyXSAqIHdbMV0sXG4gICAgICBFID0gdlsxXSAqIHdbM10gLSB2WzNdICogd1sxXSxcbiAgICAgIEYgPSB2WzJdICogd1szXSAtIHZbM10gKiB3WzJdO1xuICB2YXIgRyA9IHVbMF07XG4gIHZhciBIID0gdVsxXTtcbiAgdmFyIEkgPSB1WzJdO1xuICB2YXIgSiA9IHVbM107XG4gIG91dFswXSA9IEggKiBGIC0gSSAqIEUgKyBKICogRDtcbiAgb3V0WzFdID0gLShHICogRikgKyBJICogQyAtIEogKiBCO1xuICBvdXRbMl0gPSBHICogRSAtIEggKiBDICsgSiAqIEE7XG4gIG91dFszXSA9IC0oRyAqIEQpICsgSCAqIEIgLSBJICogQTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQsIGluIHRoZSByYW5nZSBbMC0xXSwgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZXJwKG91dCwgYSwgYiwgdCkge1xuICB2YXIgYXggPSBhWzBdO1xuICB2YXIgYXkgPSBhWzFdO1xuICB2YXIgYXogPSBhWzJdO1xuICB2YXIgYXcgPSBhWzNdO1xuICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgb3V0WzFdID0gYXkgKyB0ICogKGJbMV0gLSBheSk7XG4gIG91dFsyXSA9IGF6ICsgdCAqIChiWzJdIC0gYXopO1xuICBvdXRbM10gPSBhdyArIHQgKiAoYlszXSAtIGF3KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7IC8vIE1hcnNhZ2xpYSwgR2VvcmdlLiBDaG9vc2luZyBhIFBvaW50IGZyb20gdGhlIFN1cmZhY2Ugb2YgYVxuICAvLyBTcGhlcmUuIEFubi4gTWF0aC4gU3RhdGlzdC4gNDMgKDE5NzIpLCBuby4gMiwgNjQ1LS02NDYuXG4gIC8vIGh0dHA6Ly9wcm9qZWN0ZXVjbGlkLm9yZy9ldWNsaWQuYW9tcy8xMTc3NjkyNjQ0O1xuXG4gIHZhciB2MSwgdjIsIHYzLCB2NDtcbiAgdmFyIHMxLCBzMjtcblxuICBkbyB7XG4gICAgdjEgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHYyID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICBzMSA9IHYxICogdjEgKyB2MiAqIHYyO1xuICB9IHdoaWxlIChzMSA+PSAxKTtcblxuICBkbyB7XG4gICAgdjMgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIgLSAxO1xuICAgIHY0ID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyIC0gMTtcbiAgICBzMiA9IHYzICogdjMgKyB2NCAqIHY0O1xuICB9IHdoaWxlIChzMiA+PSAxKTtcblxuICB2YXIgZCA9IE1hdGguc3FydCgoMSAtIHMxKSAvIHMyKTtcbiAgb3V0WzBdID0gc2NhbGUgKiB2MTtcbiAgb3V0WzFdID0gc2NhbGUgKiB2MjtcbiAgb3V0WzJdID0gc2NhbGUgKiB2MyAqIGQ7XG4gIG91dFszXSA9IHNjYWxlICogdjQgKiBkO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWM0IHdpdGggYSBtYXQ0LlxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl0sXG4gICAgICB3ID0gYVszXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0gKiB3O1xuICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVs5XSAqIHogKyBtWzEzXSAqIHc7XG4gIG91dFsyXSA9IG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSAqIHc7XG4gIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XSAqIHc7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzQgd2l0aCBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHF1YXRlcm5pb24gdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtUXVhdChvdXQsIGEsIHEpIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV0sXG4gICAgICB6ID0gYVsyXTtcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXTsgLy8gY2FsY3VsYXRlIHF1YXQgKiB2ZWNcblxuICB2YXIgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHk7XG4gIHZhciBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcbiAgdmFyIGl6ID0gcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4O1xuICB2YXIgaXcgPSAtcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6OyAvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0XG5cbiAgb3V0WzBdID0gaXggKiBxdyArIGl3ICogLXF4ICsgaXkgKiAtcXogLSBpeiAqIC1xeTtcbiAgb3V0WzFdID0gaXkgKiBxdyArIGl3ICogLXF5ICsgaXogKiAtcXggLSBpeCAqIC1xejtcbiAgb3V0WzJdID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcbiAgb3V0WzNdID0gYVszXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNCB0byB6ZXJvXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gemVybyhvdXQpIHtcbiAgb3V0WzBdID0gMC4wO1xuICBvdXRbMV0gPSAwLjA7XG4gIG91dFsyXSA9IDAuMDtcbiAgb3V0WzNdID0gMC4wO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwidmVjNChcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIsIFwiICsgYVsyXSArIFwiLCBcIiArIGFbM10gKyBcIilcIjtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdmVjdG9ycyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzR9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGV4YWN0RXF1YWxzKGEsIGIpIHtcbiAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM107XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWM0fSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpO1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5kaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQubGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBsZW4gPSBsZW5ndGg7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzcXJMZW4gPSBzcXVhcmVkTGVuZ3RoO1xuLyoqXG4gKiBQZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG92ZXIgYW4gYXJyYXkgb2YgdmVjNHMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYSB0aGUgYXJyYXkgb2YgdmVjdG9ycyB0byBpdGVyYXRlIG92ZXJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzdHJpZGUgTnVtYmVyIG9mIGVsZW1lbnRzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2ggdmVjNC4gSWYgMCBhc3N1bWVzIHRpZ2h0bHkgcGFja2VkXG4gKiBAcGFyYW0ge051bWJlcn0gb2Zmc2V0IE51bWJlciBvZiBlbGVtZW50cyB0byBza2lwIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gY291bnQgTnVtYmVyIG9mIHZlYzRzIHRvIGl0ZXJhdGUgb3Zlci4gSWYgMCBpdGVyYXRlcyBvdmVyIGVudGlyZSBhcnJheVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gRnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gKiBAcGFyYW0ge09iamVjdH0gW2FyZ10gYWRkaXRpb25hbCBhcmd1bWVudCB0byBwYXNzIHRvIGZuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGFcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZm9yRWFjaCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZlYyA9IGNyZWF0ZSgpO1xuICByZXR1cm4gZnVuY3Rpb24gKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgIHZhciBpLCBsO1xuXG4gICAgaWYgKCFzdHJpZGUpIHtcbiAgICAgIHN0cmlkZSA9IDQ7XG4gICAgfVxuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICBsID0gTWF0aC5taW4oY291bnQgKiBzdHJpZGUgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbCA9IGEubGVuZ3RoO1xuICAgIH1cblxuICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IGw7IGkgKz0gc3RyaWRlKSB7XG4gICAgICB2ZWNbMF0gPSBhW2ldO1xuICAgICAgdmVjWzFdID0gYVtpICsgMV07XG4gICAgICB2ZWNbMl0gPSBhW2kgKyAyXTtcbiAgICAgIHZlY1szXSA9IGFbaSArIDNdO1xuICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICBhW2ldID0gdmVjWzBdO1xuICAgICAgYVtpICsgMV0gPSB2ZWNbMV07XG4gICAgICBhW2kgKyAyXSA9IHZlY1syXTtcbiAgICAgIGFbaSArIDNdID0gdmVjWzNdO1xuICAgIH1cblxuICAgIHJldHVybiBhO1xuICB9O1xufSgpOyIsImltcG9ydCAqIGFzIGdsTWF0cml4IGZyb20gXCIuL2NvbW1vbi5qc1wiO1xuaW1wb3J0ICogYXMgbWF0MyBmcm9tIFwiLi9tYXQzLmpzXCI7XG5pbXBvcnQgKiBhcyB2ZWMzIGZyb20gXCIuL3ZlYzMuanNcIjtcbmltcG9ydCAqIGFzIHZlYzQgZnJvbSBcIi4vdmVjNC5qc1wiO1xuLyoqXG4gKiBRdWF0ZXJuaW9uXG4gKiBAbW9kdWxlIHF1YXRcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgcXVhdFxuICpcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuXG4gIGlmIChnbE1hdHJpeC5BUlJBWV9UWVBFICE9IEZsb2F0MzJBcnJheSkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICB9XG5cbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgcXVhdCB0byB0aGUgaWRlbnRpdHkgcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0cyBhIHF1YXQgZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYW5kIHJvdGF0aW9uIGF4aXMsXG4gKiB0aGVuIHJldHVybnMgaXQuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYXhpcyB0aGUgYXhpcyBhcm91bmQgd2hpY2ggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSBpbiByYWRpYW5zXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBeGlzQW5nbGUob3V0LCBheGlzLCByYWQpIHtcbiAgcmFkID0gcmFkICogMC41O1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gIG91dFswXSA9IHMgKiBheGlzWzBdO1xuICBvdXRbMV0gPSBzICogYXhpc1sxXTtcbiAgb3V0WzJdID0gcyAqIGF4aXNbMl07XG4gIG91dFszXSA9IE1hdGguY29zKHJhZCk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdldHMgdGhlIHJvdGF0aW9uIGF4aXMgYW5kIGFuZ2xlIGZvciBhIGdpdmVuXG4gKiAgcXVhdGVybmlvbi4gSWYgYSBxdWF0ZXJuaW9uIGlzIGNyZWF0ZWQgd2l0aFxuICogIHNldEF4aXNBbmdsZSwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNhbWVcbiAqICB2YWx1ZXMgYXMgcHJvdmlkaWVkIGluIHRoZSBvcmlnaW5hbCBwYXJhbWV0ZXIgbGlzdFxuICogIE9SIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqIEV4YW1wbGU6IFRoZSBxdWF0ZXJuaW9uIGZvcm1lZCBieSBheGlzIFswLCAwLCAxXSBhbmRcbiAqICBhbmdsZSAtOTAgaXMgdGhlIHNhbWUgYXMgdGhlIHF1YXRlcm5pb24gZm9ybWVkIGJ5XG4gKiAgWzAsIDAsIDFdIGFuZCAyNzAuIFRoaXMgbWV0aG9kIGZhdm9ycyB0aGUgbGF0dGVyLlxuICogQHBhcmFtICB7dmVjM30gb3V0X2F4aXMgIFZlY3RvciByZWNlaXZpbmcgdGhlIGF4aXMgb2Ygcm90YXRpb25cbiAqIEBwYXJhbSAge1JlYWRvbmx5UXVhdH0gcSAgICAgUXVhdGVybmlvbiB0byBiZSBkZWNvbXBvc2VkXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICBBbmdsZSwgaW4gcmFkaWFucywgb2YgdGhlIHJvdGF0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF4aXNBbmdsZShvdXRfYXhpcywgcSkge1xuICB2YXIgcmFkID0gTWF0aC5hY29zKHFbM10pICogMi4wO1xuICB2YXIgcyA9IE1hdGguc2luKHJhZCAvIDIuMCk7XG5cbiAgaWYgKHMgPiBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgb3V0X2F4aXNbMF0gPSBxWzBdIC8gcztcbiAgICBvdXRfYXhpc1sxXSA9IHFbMV0gLyBzO1xuICAgIG91dF9heGlzWzJdID0gcVsyXSAvIHM7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgcyBpcyB6ZXJvLCByZXR1cm4gYW55IGF4aXMgKG5vIHJvdGF0aW9uIC0gYXhpcyBkb2VzIG5vdCBtYXR0ZXIpXG4gICAgb3V0X2F4aXNbMF0gPSAxO1xuICAgIG91dF9heGlzWzFdID0gMDtcbiAgICBvdXRfYXhpc1syXSA9IDA7XG4gIH1cblxuICByZXR1cm4gcmFkO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBhbmd1bGFyIGRpc3RhbmNlIGJldHdlZW4gdHdvIHVuaXQgcXVhdGVybmlvbnNcbiAqXG4gKiBAcGFyYW0gIHtSZWFkb25seVF1YXR9IGEgICAgIE9yaWdpbiB1bml0IHF1YXRlcm5pb25cbiAqIEBwYXJhbSAge1JlYWRvbmx5UXVhdH0gYiAgICAgRGVzdGluYXRpb24gdW5pdCBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICBBbmdsZSwgaW4gcmFkaWFucywgYmV0d2VlbiB0aGUgdHdvIHF1YXRlcm5pb25zXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlKGEsIGIpIHtcbiAgdmFyIGRvdHByb2R1Y3QgPSBkb3QoYSwgYik7XG4gIHJldHVybiBNYXRoLmFjb3MoMiAqIGRvdHByb2R1Y3QgKiBkb3Rwcm9kdWN0IC0gMSk7XG59XG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gYlswXSxcbiAgICAgIGJ5ID0gYlsxXSxcbiAgICAgIGJ6ID0gYlsyXSxcbiAgICAgIGJ3ID0gYlszXTtcbiAgb3V0WzBdID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgb3V0WzJdID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieDtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIHF1YXRlcm5pb24gYnkgdGhlIGdpdmVuIGFuZ2xlIGFib3V0IHRoZSBYIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBhbmdsZSAoaW4gcmFkaWFucykgdG8gcm90YXRlXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVgob3V0LCBhLCByYWQpIHtcbiAgcmFkICo9IDAuNTtcbiAgdmFyIGF4ID0gYVswXSxcbiAgICAgIGF5ID0gYVsxXSxcbiAgICAgIGF6ID0gYVsyXSxcbiAgICAgIGF3ID0gYVszXTtcbiAgdmFyIGJ4ID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgIGJ3ID0gTWF0aC5jb3MocmFkKTtcbiAgb3V0WzBdID0gYXggKiBidyArIGF3ICogYng7XG4gIG91dFsxXSA9IGF5ICogYncgKyBheiAqIGJ4O1xuICBvdXRbMl0gPSBheiAqIGJ3IC0gYXkgKiBieDtcbiAgb3V0WzNdID0gYXcgKiBidyAtIGF4ICogYng7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBxdWF0ZXJuaW9uIGJ5IHRoZSBnaXZlbiBhbmdsZSBhYm91dCB0aGUgWSBheGlzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgcXVhdCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdCB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgYW5nbGUgKGluIHJhZGlhbnMpIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVZKG91dCwgYSwgcmFkKSB7XG4gIHJhZCAqPSAwLjU7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIHZhciBieSA9IE1hdGguc2luKHJhZCksXG4gICAgICBidyA9IE1hdGguY29zKHJhZCk7XG4gIG91dFswXSA9IGF4ICogYncgLSBheiAqIGJ5O1xuICBvdXRbMV0gPSBheSAqIGJ3ICsgYXcgKiBieTtcbiAgb3V0WzJdID0gYXogKiBidyArIGF4ICogYnk7XG4gIG91dFszXSA9IGF3ICogYncgLSBheSAqIGJ5O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFogYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGFuZ2xlIChpbiByYWRpYW5zKSB0byByb3RhdGVcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIHJhZCkge1xuICByYWQgKj0gMC41O1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICB2YXIgYnogPSBNYXRoLnNpbihyYWQpLFxuICAgICAgYncgPSBNYXRoLmNvcyhyYWQpO1xuICBvdXRbMF0gPSBheCAqIGJ3ICsgYXkgKiBiejtcbiAgb3V0WzFdID0gYXkgKiBidyAtIGF4ICogYno7XG4gIG91dFsyXSA9IGF6ICogYncgKyBhdyAqIGJ6O1xuICBvdXRbM10gPSBhdyAqIGJ3IC0gYXogKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgVyBjb21wb25lbnQgb2YgYSBxdWF0IGZyb20gdGhlIFgsIFksIGFuZCBaIGNvbXBvbmVudHMuXG4gKiBBc3N1bWVzIHRoYXQgcXVhdGVybmlvbiBpcyAxIHVuaXQgaW4gbGVuZ3RoLlxuICogQW55IGV4aXN0aW5nIFcgY29tcG9uZW50IHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIFcgY29tcG9uZW50IG9mXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVcob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl07XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIG91dFsyXSA9IHo7XG4gIG91dFszXSA9IE1hdGguc3FydChNYXRoLmFicygxLjAgLSB4ICogeCAtIHkgKiB5IC0geiAqIHopKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBleHBvbmVudGlhbCBvZiBhIHVuaXQgcXVhdGVybmlvbi5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIHRoZSBleHBvbmVudGlhbCBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleHAob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl0sXG4gICAgICB3ID0gYVszXTtcbiAgdmFyIHIgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTtcbiAgdmFyIGV0ID0gTWF0aC5leHAodyk7XG4gIHZhciBzID0gciA+IDAgPyBldCAqIE1hdGguc2luKHIpIC8gciA6IDA7XG4gIG91dFswXSA9IHggKiBzO1xuICBvdXRbMV0gPSB5ICogcztcbiAgb3V0WzJdID0geiAqIHM7XG4gIG91dFszXSA9IGV0ICogTWF0aC5jb3Mocik7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgYSB1bml0IHF1YXRlcm5pb24uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0IHRvIGNhbGN1bGF0ZSB0aGUgZXhwb25lbnRpYWwgb2ZcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbG4ob3V0LCBhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdLFxuICAgICAgeiA9IGFbMl0sXG4gICAgICB3ID0gYVszXTtcbiAgdmFyIHIgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSArIHogKiB6KTtcbiAgdmFyIHQgPSByID4gMCA/IE1hdGguYXRhbjIociwgdykgLyByIDogMDtcbiAgb3V0WzBdID0geCAqIHQ7XG4gIG91dFsxXSA9IHkgKiB0O1xuICBvdXRbMl0gPSB6ICogdDtcbiAgb3V0WzNdID0gMC41ICogTWF0aC5sb2coeCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHcpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHNjYWxhciBwb3dlciBvZiBhIHVuaXQgcXVhdGVybmlvbi5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIHRoZSBleHBvbmVudGlhbCBvZlxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBxdWF0ZXJuaW9uIGJ5XG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBvdyhvdXQsIGEsIGIpIHtcbiAgbG4ob3V0LCBhKTtcbiAgc2NhbGUob3V0LCBvdXQsIGIpO1xuICBleHAob3V0LCBvdXQpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBQZXJmb3JtcyBhIHNwaGVyaWNhbCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNsZXJwKG91dCwgYSwgYiwgdCkge1xuICAvLyBiZW5jaG1hcmtzOlxuICAvLyAgICBodHRwOi8vanNwZXJmLmNvbS9xdWF0ZXJuaW9uLXNsZXJwLWltcGxlbWVudGF0aW9uc1xuICB2YXIgYXggPSBhWzBdLFxuICAgICAgYXkgPSBhWzFdLFxuICAgICAgYXogPSBhWzJdLFxuICAgICAgYXcgPSBhWzNdO1xuICB2YXIgYnggPSBiWzBdLFxuICAgICAgYnkgPSBiWzFdLFxuICAgICAgYnogPSBiWzJdLFxuICAgICAgYncgPSBiWzNdO1xuICB2YXIgb21lZ2EsIGNvc29tLCBzaW5vbSwgc2NhbGUwLCBzY2FsZTE7IC8vIGNhbGMgY29zaW5lXG5cbiAgY29zb20gPSBheCAqIGJ4ICsgYXkgKiBieSArIGF6ICogYnogKyBhdyAqIGJ3OyAvLyBhZGp1c3Qgc2lnbnMgKGlmIG5lY2Vzc2FyeSlcblxuICBpZiAoY29zb20gPCAwLjApIHtcbiAgICBjb3NvbSA9IC1jb3NvbTtcbiAgICBieCA9IC1ieDtcbiAgICBieSA9IC1ieTtcbiAgICBieiA9IC1iejtcbiAgICBidyA9IC1idztcbiAgfSAvLyBjYWxjdWxhdGUgY29lZmZpY2llbnRzXG5cblxuICBpZiAoMS4wIC0gY29zb20gPiBnbE1hdHJpeC5FUFNJTE9OKSB7XG4gICAgLy8gc3RhbmRhcmQgY2FzZSAoc2xlcnApXG4gICAgb21lZ2EgPSBNYXRoLmFjb3MoY29zb20pO1xuICAgIHNpbm9tID0gTWF0aC5zaW4ob21lZ2EpO1xuICAgIHNjYWxlMCA9IE1hdGguc2luKCgxLjAgLSB0KSAqIG9tZWdhKSAvIHNpbm9tO1xuICAgIHNjYWxlMSA9IE1hdGguc2luKHQgKiBvbWVnYSkgLyBzaW5vbTtcbiAgfSBlbHNlIHtcbiAgICAvLyBcImZyb21cIiBhbmQgXCJ0b1wiIHF1YXRlcm5pb25zIGFyZSB2ZXJ5IGNsb3NlXG4gICAgLy8gIC4uLiBzbyB3ZSBjYW4gZG8gYSBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgIHNjYWxlMCA9IDEuMCAtIHQ7XG4gICAgc2NhbGUxID0gdDtcbiAgfSAvLyBjYWxjdWxhdGUgZmluYWwgdmFsdWVzXG5cblxuICBvdXRbMF0gPSBzY2FsZTAgKiBheCArIHNjYWxlMSAqIGJ4O1xuICBvdXRbMV0gPSBzY2FsZTAgKiBheSArIHNjYWxlMSAqIGJ5O1xuICBvdXRbMl0gPSBzY2FsZTAgKiBheiArIHNjYWxlMSAqIGJ6O1xuICBvdXRbM10gPSBzY2FsZTAgKiBhdyArIHNjYWxlMSAqIGJ3O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdW5pdCBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShvdXQpIHtcbiAgLy8gSW1wbGVtZW50YXRpb24gb2YgaHR0cDovL3BsYW5uaW5nLmNzLnVpdWMuZWR1L25vZGUxOTguaHRtbFxuICAvLyBUT0RPOiBDYWxsaW5nIHJhbmRvbSAzIHRpbWVzIGlzIHByb2JhYmx5IG5vdCB0aGUgZmFzdGVzdCBzb2x1dGlvblxuICB2YXIgdTEgPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgdmFyIHUyID0gZ2xNYXRyaXguUkFORE9NKCk7XG4gIHZhciB1MyA9IGdsTWF0cml4LlJBTkRPTSgpO1xuICB2YXIgc3FydDFNaW51c1UxID0gTWF0aC5zcXJ0KDEgLSB1MSk7XG4gIHZhciBzcXJ0VTEgPSBNYXRoLnNxcnQodTEpO1xuICBvdXRbMF0gPSBzcXJ0MU1pbnVzVTEgKiBNYXRoLnNpbigyLjAgKiBNYXRoLlBJICogdTIpO1xuICBvdXRbMV0gPSBzcXJ0MU1pbnVzVTEgKiBNYXRoLmNvcygyLjAgKiBNYXRoLlBJICogdTIpO1xuICBvdXRbMl0gPSBzcXJ0VTEgKiBNYXRoLnNpbigyLjAgKiBNYXRoLlBJICogdTMpO1xuICBvdXRbM10gPSBzcXJ0VTEgKiBNYXRoLmNvcygyLjAgKiBNYXRoLlBJICogdTMpO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBpbnZlcnNlIG9mIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgaW52ZXJzZSBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBhMCA9IGFbMF0sXG4gICAgICBhMSA9IGFbMV0sXG4gICAgICBhMiA9IGFbMl0sXG4gICAgICBhMyA9IGFbM107XG4gIHZhciBkb3QgPSBhMCAqIGEwICsgYTEgKiBhMSArIGEyICogYTIgKyBhMyAqIGEzO1xuICB2YXIgaW52RG90ID0gZG90ID8gMS4wIC8gZG90IDogMDsgLy8gVE9ETzogV291bGQgYmUgZmFzdGVyIHRvIHJldHVybiBbMCwwLDAsMF0gaW1tZWRpYXRlbHkgaWYgZG90ID09IDBcblxuICBvdXRbMF0gPSAtYTAgKiBpbnZEb3Q7XG4gIG91dFsxXSA9IC1hMSAqIGludkRvdDtcbiAgb3V0WzJdID0gLWEyICogaW52RG90O1xuICBvdXRbM10gPSBhMyAqIGludkRvdDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgY29uanVnYXRlIG9mIGEgcXVhdFxuICogSWYgdGhlIHF1YXRlcm5pb24gaXMgbm9ybWFsaXplZCwgdGhpcyBmdW5jdGlvbiBpcyBmYXN0ZXIgdGhhbiBxdWF0LmludmVyc2UgYW5kIHByb2R1Y2VzIHRoZSBzYW1lIHJlc3VsdC5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIGNvbmp1Z2F0ZSBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb25qdWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgb3V0WzJdID0gLWFbMl07XG4gIG91dFszXSA9IGFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBxdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIDN4MyByb3RhdGlvbiBtYXRyaXguXG4gKlxuICogTk9URTogVGhlIHJlc3VsdGFudCBxdWF0ZXJuaW9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyB5b3Ugc2hvdWxkIGJlIHN1cmVcbiAqIHRvIHJlbm9ybWFsaXplIHRoZSBxdWF0ZXJuaW9uIHlvdXJzZWxmIHdoZXJlIG5lY2Vzc2FyeS5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQzfSBtIHJvdGF0aW9uIG1hdHJpeFxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYXQzKG91dCwgbSkge1xuICAvLyBBbGdvcml0aG0gaW4gS2VuIFNob2VtYWtlJ3MgYXJ0aWNsZSBpbiAxOTg3IFNJR0dSQVBIIGNvdXJzZSBub3Rlc1xuICAvLyBhcnRpY2xlIFwiUXVhdGVybmlvbiBDYWxjdWx1cyBhbmQgRmFzdCBBbmltYXRpb25cIi5cbiAgdmFyIGZUcmFjZSA9IG1bMF0gKyBtWzRdICsgbVs4XTtcbiAgdmFyIGZSb290O1xuXG4gIGlmIChmVHJhY2UgPiAwLjApIHtcbiAgICAvLyB8d3wgPiAxLzIsIG1heSBhcyB3ZWxsIGNob29zZSB3ID4gMS8yXG4gICAgZlJvb3QgPSBNYXRoLnNxcnQoZlRyYWNlICsgMS4wKTsgLy8gMndcblxuICAgIG91dFszXSA9IDAuNSAqIGZSb290O1xuICAgIGZSb290ID0gMC41IC8gZlJvb3Q7IC8vIDEvKDR3KVxuXG4gICAgb3V0WzBdID0gKG1bNV0gLSBtWzddKSAqIGZSb290O1xuICAgIG91dFsxXSA9IChtWzZdIC0gbVsyXSkgKiBmUm9vdDtcbiAgICBvdXRbMl0gPSAobVsxXSAtIG1bM10pICogZlJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgLy8gfHd8IDw9IDEvMlxuICAgIHZhciBpID0gMDtcbiAgICBpZiAobVs0XSA+IG1bMF0pIGkgPSAxO1xuICAgIGlmIChtWzhdID4gbVtpICogMyArIGldKSBpID0gMjtcbiAgICB2YXIgaiA9IChpICsgMSkgJSAzO1xuICAgIHZhciBrID0gKGkgKyAyKSAlIDM7XG4gICAgZlJvb3QgPSBNYXRoLnNxcnQobVtpICogMyArIGldIC0gbVtqICogMyArIGpdIC0gbVtrICogMyArIGtdICsgMS4wKTtcbiAgICBvdXRbaV0gPSAwLjUgKiBmUm9vdDtcbiAgICBmUm9vdCA9IDAuNSAvIGZSb290O1xuICAgIG91dFszXSA9IChtW2ogKiAzICsga10gLSBtW2sgKiAzICsgal0pICogZlJvb3Q7XG4gICAgb3V0W2pdID0gKG1baiAqIDMgKyBpXSArIG1baSAqIDMgKyBqXSkgKiBmUm9vdDtcbiAgICBvdXRba10gPSAobVtrICogMyArIGldICsgbVtpICogMyArIGtdKSAqIGZSb290O1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIHF1YXRlcm5pb24gZnJvbSB0aGUgZ2l2ZW4gZXVsZXIgYW5nbGUgeCwgeSwgei5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7eH0gQW5nbGUgdG8gcm90YXRlIGFyb3VuZCBYIGF4aXMgaW4gZGVncmVlcy5cbiAqIEBwYXJhbSB7eX0gQW5nbGUgdG8gcm90YXRlIGFyb3VuZCBZIGF4aXMgaW4gZGVncmVlcy5cbiAqIEBwYXJhbSB7en0gQW5nbGUgdG8gcm90YXRlIGFyb3VuZCBaIGF4aXMgaW4gZGVncmVlcy5cbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRXVsZXIob3V0LCB4LCB5LCB6KSB7XG4gIHZhciBoYWxmVG9SYWQgPSAwLjUgKiBNYXRoLlBJIC8gMTgwLjA7XG4gIHggKj0gaGFsZlRvUmFkO1xuICB5ICo9IGhhbGZUb1JhZDtcbiAgeiAqPSBoYWxmVG9SYWQ7XG4gIHZhciBzeCA9IE1hdGguc2luKHgpO1xuICB2YXIgY3ggPSBNYXRoLmNvcyh4KTtcbiAgdmFyIHN5ID0gTWF0aC5zaW4oeSk7XG4gIHZhciBjeSA9IE1hdGguY29zKHkpO1xuICB2YXIgc3ogPSBNYXRoLnNpbih6KTtcbiAgdmFyIGN6ID0gTWF0aC5jb3Moeik7XG4gIG91dFswXSA9IHN4ICogY3kgKiBjeiAtIGN4ICogc3kgKiBzejtcbiAgb3V0WzFdID0gY3ggKiBzeSAqIGN6ICsgc3ggKiBjeSAqIHN6O1xuICBvdXRbMl0gPSBjeCAqIGN5ICogc3ogLSBzeCAqIHN5ICogY3o7XG4gIG91dFszXSA9IGN4ICogY3kgKiBjeiArIHN4ICogc3kgKiBzejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHF1YXRlbmlvblxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInF1YXQoXCIgKyBhWzBdICsgXCIsIFwiICsgYVsxXSArIFwiLCBcIiArIGFbMl0gKyBcIiwgXCIgKyBhWzNdICsgXCIpXCI7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBxdWF0ZXJuaW9uIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBjbG9uZSA9IHZlYzQuY2xvbmU7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgcXVhdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZnJvbVZhbHVlcyA9IHZlYzQuZnJvbVZhbHVlcztcbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHF1YXQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIHNvdXJjZSBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGNvcHkgPSB2ZWM0LmNvcHk7XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHF1YXQgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc2V0ID0gdmVjNC5zZXQ7XG4vKipcbiAqIEFkZHMgdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBhZGQgPSB2ZWM0LmFkZDtcbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogU2NhbGVzIGEgcXVhdCBieSBhIHNjYWxhciBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc2NhbGUgPSB2ZWM0LnNjYWxlO1xuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gcXVhdCdzXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBkb3QgPSB2ZWM0LmRvdDtcbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbGVycCA9IHZlYzQubGVycDtcbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG5cbmV4cG9ydCB2YXIgbGVuZ3RoID0gdmVjNC5sZW5ndGg7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGxlbiA9IGxlbmd0aDtcbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBsZW5ndGggb2YgYSBxdWF0XG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzcXVhcmVkTGVuZ3RoID0gdmVjNC5zcXVhcmVkTGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxuICogTm9ybWFsaXplIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgcXVhdGVybmlvbiB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbm9ybWFsaXplID0gdmVjNC5ub3JtYWxpemU7XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHF1YXRlcm5pb25zIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSBUaGUgZmlyc3QgcXVhdGVybmlvbi5cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIFRoZSBzZWNvbmQgcXVhdGVybmlvbi5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCB2YXIgZXhhY3RFcXVhbHMgPSB2ZWM0LmV4YWN0RXF1YWxzO1xuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBxdWF0ZXJuaW9ucyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cblxuZXhwb3J0IHZhciBlcXVhbHMgPSB2ZWM0LmVxdWFscztcbi8qKlxuICogU2V0cyBhIHF1YXRlcm5pb24gdG8gcmVwcmVzZW50IHRoZSBzaG9ydGVzdCByb3RhdGlvbiBmcm9tIG9uZVxuICogdmVjdG9yIHRvIGFub3RoZXIuXG4gKlxuICogQm90aCB2ZWN0b3JzIGFyZSBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoLlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvbi5cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSBhIHRoZSBpbml0aWFsIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IGIgdGhlIGRlc3RpbmF0aW9uIHZlY3RvclxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5cbmV4cG9ydCB2YXIgcm90YXRpb25UbyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRtcHZlYzMgPSB2ZWMzLmNyZWF0ZSgpO1xuICB2YXIgeFVuaXRWZWMzID0gdmVjMy5mcm9tVmFsdWVzKDEsIDAsIDApO1xuICB2YXIgeVVuaXRWZWMzID0gdmVjMy5mcm9tVmFsdWVzKDAsIDEsIDApO1xuICByZXR1cm4gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBkb3QgPSB2ZWMzLmRvdChhLCBiKTtcblxuICAgIGlmIChkb3QgPCAtMC45OTk5OTkpIHtcbiAgICAgIHZlYzMuY3Jvc3ModG1wdmVjMywgeFVuaXRWZWMzLCBhKTtcbiAgICAgIGlmICh2ZWMzLmxlbih0bXB2ZWMzKSA8IDAuMDAwMDAxKSB2ZWMzLmNyb3NzKHRtcHZlYzMsIHlVbml0VmVjMywgYSk7XG4gICAgICB2ZWMzLm5vcm1hbGl6ZSh0bXB2ZWMzLCB0bXB2ZWMzKTtcbiAgICAgIHNldEF4aXNBbmdsZShvdXQsIHRtcHZlYzMsIE1hdGguUEkpO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGVsc2UgaWYgKGRvdCA+IDAuOTk5OTk5KSB7XG4gICAgICBvdXRbMF0gPSAwO1xuICAgICAgb3V0WzFdID0gMDtcbiAgICAgIG91dFsyXSA9IDA7XG4gICAgICBvdXRbM10gPSAxO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmVjMy5jcm9zcyh0bXB2ZWMzLCBhLCBiKTtcbiAgICAgIG91dFswXSA9IHRtcHZlYzNbMF07XG4gICAgICBvdXRbMV0gPSB0bXB2ZWMzWzFdO1xuICAgICAgb3V0WzJdID0gdG1wdmVjM1syXTtcbiAgICAgIG91dFszXSA9IDEgKyBkb3Q7XG4gICAgICByZXR1cm4gbm9ybWFsaXplKG91dCwgb3V0KTtcbiAgICB9XG4gIH07XG59KCk7XG4vKipcbiAqIFBlcmZvcm1zIGEgc3BoZXJpY2FsIGxpbmVhciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdH0gYyB0aGUgdGhpcmQgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IHZhciBzcWxlcnAgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB0ZW1wMSA9IGNyZWF0ZSgpO1xuICB2YXIgdGVtcDIgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvdXQsIGEsIGIsIGMsIGQsIHQpIHtcbiAgICBzbGVycCh0ZW1wMSwgYSwgZCwgdCk7XG4gICAgc2xlcnAodGVtcDIsIGIsIGMsIHQpO1xuICAgIHNsZXJwKG91dCwgdGVtcDEsIHRlbXAyLCAyICogdCAqICgxIC0gdCkpO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG59KCk7XG4vKipcbiAqIFNldHMgdGhlIHNwZWNpZmllZCBxdWF0ZXJuaW9uIHdpdGggdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuXG4gKiBheGVzLiBFYWNoIGF4aXMgaXMgYSB2ZWMzIGFuZCBpcyBleHBlY3RlZCB0byBiZSB1bml0IGxlbmd0aCBhbmRcbiAqIHBlcnBlbmRpY3VsYXIgdG8gYWxsIG90aGVyIHNwZWNpZmllZCBheGVzLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB2aWV3ICB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgdmlld2luZyBkaXJlY3Rpb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSByaWdodCB0aGUgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgXCJyaWdodFwiIGRpcmVjdGlvblxuICogQHBhcmFtIHtSZWFkb25seVZlYzN9IHVwICAgIHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhbCBcInVwXCIgZGlyZWN0aW9uXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cblxuZXhwb3J0IHZhciBzZXRBeGVzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbWF0ciA9IG1hdDMuY3JlYXRlKCk7XG4gIHJldHVybiBmdW5jdGlvbiAob3V0LCB2aWV3LCByaWdodCwgdXApIHtcbiAgICBtYXRyWzBdID0gcmlnaHRbMF07XG4gICAgbWF0clszXSA9IHJpZ2h0WzFdO1xuICAgIG1hdHJbNl0gPSByaWdodFsyXTtcbiAgICBtYXRyWzFdID0gdXBbMF07XG4gICAgbWF0cls0XSA9IHVwWzFdO1xuICAgIG1hdHJbN10gPSB1cFsyXTtcbiAgICBtYXRyWzJdID0gLXZpZXdbMF07XG4gICAgbWF0cls1XSA9IC12aWV3WzFdO1xuICAgIG1hdHJbOF0gPSAtdmlld1syXTtcbiAgICByZXR1cm4gbm9ybWFsaXplKG91dCwgZnJvbU1hdDMob3V0LCBtYXRyKSk7XG4gIH07XG59KCk7IiwiaW1wb3J0ICogYXMgZ2xNYXRyaXggZnJvbSBcIi4vY29tbW9uLmpzXCI7XG5pbXBvcnQgKiBhcyBxdWF0IGZyb20gXCIuL3F1YXQuanNcIjtcbmltcG9ydCAqIGFzIG1hdDQgZnJvbSBcIi4vbWF0NC5qc1wiO1xuLyoqXG4gKiBEdWFsIFF1YXRlcm5pb248YnI+XG4gKiBGb3JtYXQ6IFtyZWFsLCBkdWFsXTxicj5cbiAqIFF1YXRlcm5pb24gZm9ybWF0OiBYWVpXPGJyPlxuICogTWFrZSBzdXJlIHRvIGhhdmUgbm9ybWFsaXplZCBkdWFsIHF1YXRlcm5pb25zLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9ucyBtYXkgbm90IHdvcmsgYXMgaW50ZW5kZWQuPGJyPlxuICogQG1vZHVsZSBxdWF0MlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBkdWFsIHF1YXRcbiAqXG4gKiBAcmV0dXJucyB7cXVhdDJ9IGEgbmV3IGR1YWwgcXVhdGVybmlvbiBbcmVhbCAtPiByb3RhdGlvbiwgZHVhbCAtPiB0cmFuc2xhdGlvbl1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgZHEgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg4KTtcblxuICBpZiAoZ2xNYXRyaXguQVJSQVlfVFlQRSAhPSBGbG9hdDMyQXJyYXkpIHtcbiAgICBkcVswXSA9IDA7XG4gICAgZHFbMV0gPSAwO1xuICAgIGRxWzJdID0gMDtcbiAgICBkcVs0XSA9IDA7XG4gICAgZHFbNV0gPSAwO1xuICAgIGRxWzZdID0gMDtcbiAgICBkcVs3XSA9IDA7XG4gIH1cblxuICBkcVszXSA9IDE7XG4gIHJldHVybiBkcTtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBxdWF0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBkdWFsIHF1YXRlcm5pb24gdG8gY2xvbmVcbiAqIEByZXR1cm5zIHtxdWF0Mn0gbmV3IGR1YWwgcXVhdGVybmlvblxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIGRxID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOCk7XG4gIGRxWzBdID0gYVswXTtcbiAgZHFbMV0gPSBhWzFdO1xuICBkcVsyXSA9IGFbMl07XG4gIGRxWzNdID0gYVszXTtcbiAgZHFbNF0gPSBhWzRdO1xuICBkcVs1XSA9IGFbNV07XG4gIGRxWzZdID0gYVs2XTtcbiAgZHFbN10gPSBhWzddO1xuICByZXR1cm4gZHE7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZHVhbCBxdWF0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MSBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkxIFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gejEgWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MSBXIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHgyIFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geTIgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6MiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcyIFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7cXVhdDJ9IG5ldyBkdWFsIHF1YXRlcm5pb25cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVmFsdWVzKHgxLCB5MSwgejEsIHcxLCB4MiwgeTIsIHoyLCB3Mikge1xuICB2YXIgZHEgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg4KTtcbiAgZHFbMF0gPSB4MTtcbiAgZHFbMV0gPSB5MTtcbiAgZHFbMl0gPSB6MTtcbiAgZHFbM10gPSB3MTtcbiAgZHFbNF0gPSB4MjtcbiAgZHFbNV0gPSB5MjtcbiAgZHFbNl0gPSB6MjtcbiAgZHFbN10gPSB3MjtcbiAgcmV0dXJuIGRxO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGR1YWwgcXVhdCBmcm9tIHRoZSBnaXZlbiB2YWx1ZXMgKHF1YXQgYW5kIHRyYW5zbGF0aW9uKVxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MSBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkxIFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gejEgWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MSBXIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHgyIFggY29tcG9uZW50ICh0cmFuc2xhdGlvbilcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MiBZIGNvbXBvbmVudCAodHJhbnNsYXRpb24pXG4gKiBAcGFyYW0ge051bWJlcn0gejIgWiBjb21wb25lbnQgKHRyYW5zbGF0aW9uKVxuICogQHJldHVybnMge3F1YXQyfSBuZXcgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25WYWx1ZXMoeDEsIHkxLCB6MSwgdzEsIHgyLCB5MiwgejIpIHtcbiAgdmFyIGRxID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoOCk7XG4gIGRxWzBdID0geDE7XG4gIGRxWzFdID0geTE7XG4gIGRxWzJdID0gejE7XG4gIGRxWzNdID0gdzE7XG4gIHZhciBheCA9IHgyICogMC41LFxuICAgICAgYXkgPSB5MiAqIDAuNSxcbiAgICAgIGF6ID0gejIgKiAwLjU7XG4gIGRxWzRdID0gYXggKiB3MSArIGF5ICogejEgLSBheiAqIHkxO1xuICBkcVs1XSA9IGF5ICogdzEgKyBheiAqIHgxIC0gYXggKiB6MTtcbiAgZHFbNl0gPSBheiAqIHcxICsgYXggKiB5MSAtIGF5ICogeDE7XG4gIGRxWzddID0gLWF4ICogeDEgLSBheSAqIHkxIC0gYXogKiB6MTtcbiAgcmV0dXJuIGRxO1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgZHVhbCBxdWF0IGZyb20gYSBxdWF0ZXJuaW9uIGFuZCBhIHRyYW5zbGF0aW9uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIGEgbm9ybWFsaXplZCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdCB0cmFubGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge3F1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIHEsIHQpIHtcbiAgdmFyIGF4ID0gdFswXSAqIDAuNSxcbiAgICAgIGF5ID0gdFsxXSAqIDAuNSxcbiAgICAgIGF6ID0gdFsyXSAqIDAuNSxcbiAgICAgIGJ4ID0gcVswXSxcbiAgICAgIGJ5ID0gcVsxXSxcbiAgICAgIGJ6ID0gcVsyXSxcbiAgICAgIGJ3ID0gcVszXTtcbiAgb3V0WzBdID0gYng7XG4gIG91dFsxXSA9IGJ5O1xuICBvdXRbMl0gPSBiejtcbiAgb3V0WzNdID0gYnc7XG4gIG91dFs0XSA9IGF4ICogYncgKyBheSAqIGJ6IC0gYXogKiBieTtcbiAgb3V0WzVdID0gYXkgKiBidyArIGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbNl0gPSBheiAqIGJ3ICsgYXggKiBieSAtIGF5ICogYng7XG4gIG91dFs3XSA9IC1heCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBkdWFsIHF1YXQgZnJvbSBhIHRyYW5zbGF0aW9uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMzfSB0IHRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge3F1YXQyfSBkdWFsIHF1YXRlcm5pb24gcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVHJhbnNsYXRpb24ob3V0LCB0KSB7XG4gIG91dFswXSA9IDA7XG4gIG91dFsxXSA9IDA7XG4gIG91dFsyXSA9IDA7XG4gIG91dFszXSA9IDE7XG4gIG91dFs0XSA9IHRbMF0gKiAwLjU7XG4gIG91dFs1XSA9IHRbMV0gKiAwLjU7XG4gIG91dFs2XSA9IHRbMl0gKiAwLjU7XG4gIG91dFs3XSA9IDA7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBkdWFsIHF1YXQgZnJvbSBhIHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGR1YWwgcXVhdGVybmlvbiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgdGhlIHF1YXRlcm5pb25cbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0ZXJuaW9uIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVJvdGF0aW9uKG91dCwgcSkge1xuICBvdXRbMF0gPSBxWzBdO1xuICBvdXRbMV0gPSBxWzFdO1xuICBvdXRbMl0gPSBxWzJdO1xuICBvdXRbM10gPSBxWzNdO1xuICBvdXRbNF0gPSAwO1xuICBvdXRbNV0gPSAwO1xuICBvdXRbNl0gPSAwO1xuICBvdXRbN10gPSAwO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGR1YWwgcXVhdCBmcm9tIGEgbWF0cml4ICg0eDQpXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlNYXQ0fSBhIHRoZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtxdWF0Mn0gZHVhbCBxdWF0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbU1hdDQob3V0LCBhKSB7XG4gIC8vVE9ETyBPcHRpbWl6ZSB0aGlzXG4gIHZhciBvdXRlciA9IHF1YXQuY3JlYXRlKCk7XG4gIG1hdDQuZ2V0Um90YXRpb24ob3V0ZXIsIGEpO1xuICB2YXIgdCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICBtYXQ0LmdldFRyYW5zbGF0aW9uKHQsIGEpO1xuICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbihvdXQsIG91dGVyLCB0KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIGR1YWwgcXVhdCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIHNvdXJjZSBkdWFsIHF1YXRlcm5pb25cbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgb3V0WzJdID0gYVsyXTtcbiAgb3V0WzNdID0gYVszXTtcbiAgb3V0WzRdID0gYVs0XTtcbiAgb3V0WzVdID0gYVs1XTtcbiAgb3V0WzZdID0gYVs2XTtcbiAgb3V0WzddID0gYVs3XTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IGEgZHVhbCBxdWF0IHRvIHRoZSBpZGVudGl0eSBkdWFsIHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgb3V0WzBdID0gMDtcbiAgb3V0WzFdID0gMDtcbiAgb3V0WzJdID0gMDtcbiAgb3V0WzNdID0gMTtcbiAgb3V0WzRdID0gMDtcbiAgb3V0WzVdID0gMDtcbiAgb3V0WzZdID0gMDtcbiAgb3V0WzddID0gMDtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgZHVhbCBxdWF0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge051bWJlcn0geDEgWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5MSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHoxIFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdzEgVyBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB4MiBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkyIFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gejIgWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3MiBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4MSwgeTEsIHoxLCB3MSwgeDIsIHkyLCB6MiwgdzIpIHtcbiAgb3V0WzBdID0geDE7XG4gIG91dFsxXSA9IHkxO1xuICBvdXRbMl0gPSB6MTtcbiAgb3V0WzNdID0gdzE7XG4gIG91dFs0XSA9IHgyO1xuICBvdXRbNV0gPSB5MjtcbiAgb3V0WzZdID0gejI7XG4gIG91dFs3XSA9IHcyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBHZXRzIHRoZSByZWFsIHBhcnQgb2YgYSBkdWFsIHF1YXRcbiAqIEBwYXJhbSAge3F1YXR9IG91dCByZWFsIHBhcnRcbiAqIEBwYXJhbSAge1JlYWRvbmx5UXVhdDJ9IGEgRHVhbCBRdWF0ZXJuaW9uXG4gKiBAcmV0dXJuIHtxdWF0fSByZWFsIHBhcnRcbiAqL1xuXG5leHBvcnQgdmFyIGdldFJlYWwgPSBxdWF0LmNvcHk7XG4vKipcbiAqIEdldHMgdGhlIGR1YWwgcGFydCBvZiBhIGR1YWwgcXVhdFxuICogQHBhcmFtICB7cXVhdH0gb3V0IGR1YWwgcGFydFxuICogQHBhcmFtICB7UmVhZG9ubHlRdWF0Mn0gYSBEdWFsIFF1YXRlcm5pb25cbiAqIEByZXR1cm4ge3F1YXR9IGR1YWwgcGFydFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREdWFsKG91dCwgYSkge1xuICBvdXRbMF0gPSBhWzRdO1xuICBvdXRbMV0gPSBhWzVdO1xuICBvdXRbMl0gPSBhWzZdO1xuICBvdXRbM10gPSBhWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTZXQgdGhlIHJlYWwgY29tcG9uZW50IG9mIGEgZHVhbCBxdWF0IHRvIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgYSBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyB0aGUgcmVhbCBwYXJ0XG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzZXRSZWFsID0gcXVhdC5jb3B5O1xuLyoqXG4gKiBTZXQgdGhlIGR1YWwgY29tcG9uZW50IG9mIGEgZHVhbCBxdWF0IHRvIHRoZSBnaXZlbiBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgYSBxdWF0ZXJuaW9uIHJlcHJlc2VudGluZyB0aGUgZHVhbCBwYXJ0XG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNldER1YWwob3V0LCBxKSB7XG4gIG91dFs0XSA9IHFbMF07XG4gIG91dFs1XSA9IHFbMV07XG4gIG91dFs2XSA9IHFbMl07XG4gIG91dFs3XSA9IHFbM107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdldHMgdGhlIHRyYW5zbGF0aW9uIG9mIGEgbm9ybWFsaXplZCBkdWFsIHF1YXRcbiAqIEBwYXJhbSAge3ZlYzN9IG91dCB0cmFuc2xhdGlvblxuICogQHBhcmFtICB7UmVhZG9ubHlRdWF0Mn0gYSBEdWFsIFF1YXRlcm5pb24gdG8gYmUgZGVjb21wb3NlZFxuICogQHJldHVybiB7dmVjM30gdHJhbnNsYXRpb25cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb24ob3V0LCBhKSB7XG4gIHZhciBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN10sXG4gICAgICBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM107XG4gIG91dFswXSA9IChheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5KSAqIDI7XG4gIG91dFsxXSA9IChheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6KSAqIDI7XG4gIG91dFsyXSA9IChheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4KSAqIDI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zbGF0ZXMgYSBkdWFsIHF1YXQgYnkgdGhlIGdpdmVuIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGUob3V0LCBhLCB2KSB7XG4gIHZhciBheDEgPSBhWzBdLFxuICAgICAgYXkxID0gYVsxXSxcbiAgICAgIGF6MSA9IGFbMl0sXG4gICAgICBhdzEgPSBhWzNdLFxuICAgICAgYngxID0gdlswXSAqIDAuNSxcbiAgICAgIGJ5MSA9IHZbMV0gKiAwLjUsXG4gICAgICBiejEgPSB2WzJdICogMC41LFxuICAgICAgYXgyID0gYVs0XSxcbiAgICAgIGF5MiA9IGFbNV0sXG4gICAgICBhejIgPSBhWzZdLFxuICAgICAgYXcyID0gYVs3XTtcbiAgb3V0WzBdID0gYXgxO1xuICBvdXRbMV0gPSBheTE7XG4gIG91dFsyXSA9IGF6MTtcbiAgb3V0WzNdID0gYXcxO1xuICBvdXRbNF0gPSBhdzEgKiBieDEgKyBheTEgKiBiejEgLSBhejEgKiBieTEgKyBheDI7XG4gIG91dFs1XSA9IGF3MSAqIGJ5MSArIGF6MSAqIGJ4MSAtIGF4MSAqIGJ6MSArIGF5MjtcbiAgb3V0WzZdID0gYXcxICogYnoxICsgYXgxICogYnkxIC0gYXkxICogYngxICsgYXoyO1xuICBvdXRbN10gPSAtYXgxICogYngxIC0gYXkxICogYnkxIC0gYXoxICogYnoxICsgYXcyO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGFyb3VuZCB0aGUgWCBheGlzXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSByYWQgaG93IGZhciBzaG91bGQgdGhlIHJvdGF0aW9uIGJlXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVYKG91dCwgYSwgcmFkKSB7XG4gIHZhciBieCA9IC1hWzBdLFxuICAgICAgYnkgPSAtYVsxXSxcbiAgICAgIGJ6ID0gLWFbMl0sXG4gICAgICBidyA9IGFbM10sXG4gICAgICBheCA9IGFbNF0sXG4gICAgICBheSA9IGFbNV0sXG4gICAgICBheiA9IGFbNl0sXG4gICAgICBhdyA9IGFbN10sXG4gICAgICBheDEgPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5LFxuICAgICAgYXkxID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBieixcbiAgICAgIGF6MSA9IGF6ICogYncgKyBhdyAqIGJ6ICsgYXggKiBieSAtIGF5ICogYngsXG4gICAgICBhdzEgPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICBxdWF0LnJvdGF0ZVgob3V0LCBhLCByYWQpO1xuICBieCA9IG91dFswXTtcbiAgYnkgPSBvdXRbMV07XG4gIGJ6ID0gb3V0WzJdO1xuICBidyA9IG91dFszXTtcbiAgb3V0WzRdID0gYXgxICogYncgKyBhdzEgKiBieCArIGF5MSAqIGJ6IC0gYXoxICogYnk7XG4gIG91dFs1XSA9IGF5MSAqIGJ3ICsgYXcxICogYnkgKyBhejEgKiBieCAtIGF4MSAqIGJ6O1xuICBvdXRbNl0gPSBhejEgKiBidyArIGF3MSAqIGJ6ICsgYXgxICogYnkgLSBheTEgKiBieDtcbiAgb3V0WzddID0gYXcxICogYncgLSBheDEgKiBieCAtIGF5MSAqIGJ5IC0gYXoxICogYno7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJvdGF0ZXMgYSBkdWFsIHF1YXQgYXJvdW5kIHRoZSBZIGF4aXNcbiAqXG4gKiBAcGFyYW0ge3F1YXQyfSBvdXQgdGhlIHJlY2VpdmluZyBkdWFsIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBob3cgZmFyIHNob3VsZCB0aGUgcm90YXRpb24gYmVcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdGF0ZVkob3V0LCBhLCByYWQpIHtcbiAgdmFyIGJ4ID0gLWFbMF0sXG4gICAgICBieSA9IC1hWzFdLFxuICAgICAgYnogPSAtYVsyXSxcbiAgICAgIGJ3ID0gYVszXSxcbiAgICAgIGF4ID0gYVs0XSxcbiAgICAgIGF5ID0gYVs1XSxcbiAgICAgIGF6ID0gYVs2XSxcbiAgICAgIGF3ID0gYVs3XSxcbiAgICAgIGF4MSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnksXG4gICAgICBheTEgPSBheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6LFxuICAgICAgYXoxID0gYXogKiBidyArIGF3ICogYnogKyBheCAqIGJ5IC0gYXkgKiBieCxcbiAgICAgIGF3MSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gIHF1YXQucm90YXRlWShvdXQsIGEsIHJhZCk7XG4gIGJ4ID0gb3V0WzBdO1xuICBieSA9IG91dFsxXTtcbiAgYnogPSBvdXRbMl07XG4gIGJ3ID0gb3V0WzNdO1xuICBvdXRbNF0gPSBheDEgKiBidyArIGF3MSAqIGJ4ICsgYXkxICogYnogLSBhejEgKiBieTtcbiAgb3V0WzVdID0gYXkxICogYncgKyBhdzEgKiBieSArIGF6MSAqIGJ4IC0gYXgxICogYno7XG4gIG91dFs2XSA9IGF6MSAqIGJ3ICsgYXcxICogYnogKyBheDEgKiBieSAtIGF5MSAqIGJ4O1xuICBvdXRbN10gPSBhdzEgKiBidyAtIGF4MSAqIGJ4IC0gYXkxICogYnkgLSBhejEgKiBiejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBhcm91bmQgdGhlIFogYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkIGhvdyBmYXIgc2hvdWxkIHRoZSByb3RhdGlvbiBiZVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlWihvdXQsIGEsIHJhZCkge1xuICB2YXIgYnggPSAtYVswXSxcbiAgICAgIGJ5ID0gLWFbMV0sXG4gICAgICBieiA9IC1hWzJdLFxuICAgICAgYncgPSBhWzNdLFxuICAgICAgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddLFxuICAgICAgYXgxID0gYXggKiBidyArIGF3ICogYnggKyBheSAqIGJ6IC0gYXogKiBieSxcbiAgICAgIGF5MSA9IGF5ICogYncgKyBhdyAqIGJ5ICsgYXogKiBieCAtIGF4ICogYnosXG4gICAgICBhejEgPSBheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4LFxuICAgICAgYXcxID0gYXcgKiBidyAtIGF4ICogYnggLSBheSAqIGJ5IC0gYXogKiBiejtcbiAgcXVhdC5yb3RhdGVaKG91dCwgYSwgcmFkKTtcbiAgYnggPSBvdXRbMF07XG4gIGJ5ID0gb3V0WzFdO1xuICBieiA9IG91dFsyXTtcbiAgYncgPSBvdXRbM107XG4gIG91dFs0XSA9IGF4MSAqIGJ3ICsgYXcxICogYnggKyBheTEgKiBieiAtIGF6MSAqIGJ5O1xuICBvdXRbNV0gPSBheTEgKiBidyArIGF3MSAqIGJ5ICsgYXoxICogYnggLSBheDEgKiBiejtcbiAgb3V0WzZdID0gYXoxICogYncgKyBhdzEgKiBieiArIGF4MSAqIGJ5IC0gYXkxICogYng7XG4gIG91dFs3XSA9IGF3MSAqIGJ3IC0gYXgxICogYnggLSBheTEgKiBieSAtIGF6MSAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGJ5IGEgZ2l2ZW4gcXVhdGVybmlvbiAoYSAqIHEpXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGR1YWwgcXVhdGVybmlvbiB0byByb3RhdGVcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0fSBxIHF1YXRlcm5pb24gdG8gcm90YXRlIGJ5XG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVCeVF1YXRBcHBlbmQob3V0LCBhLCBxKSB7XG4gIHZhciBxeCA9IHFbMF0sXG4gICAgICBxeSA9IHFbMV0sXG4gICAgICBxeiA9IHFbMl0sXG4gICAgICBxdyA9IHFbM10sXG4gICAgICBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV0sXG4gICAgICBheiA9IGFbMl0sXG4gICAgICBhdyA9IGFbM107XG4gIG91dFswXSA9IGF4ICogcXcgKyBhdyAqIHF4ICsgYXkgKiBxeiAtIGF6ICogcXk7XG4gIG91dFsxXSA9IGF5ICogcXcgKyBhdyAqIHF5ICsgYXogKiBxeCAtIGF4ICogcXo7XG4gIG91dFsyXSA9IGF6ICogcXcgKyBhdyAqIHF6ICsgYXggKiBxeSAtIGF5ICogcXg7XG4gIG91dFszXSA9IGF3ICogcXcgLSBheCAqIHF4IC0gYXkgKiBxeSAtIGF6ICogcXo7XG4gIGF4ID0gYVs0XTtcbiAgYXkgPSBhWzVdO1xuICBheiA9IGFbNl07XG4gIGF3ID0gYVs3XTtcbiAgb3V0WzRdID0gYXggKiBxdyArIGF3ICogcXggKyBheSAqIHF6IC0gYXogKiBxeTtcbiAgb3V0WzVdID0gYXkgKiBxdyArIGF3ICogcXkgKyBheiAqIHF4IC0gYXggKiBxejtcbiAgb3V0WzZdID0gYXogKiBxdyArIGF3ICogcXogKyBheCAqIHF5IC0gYXkgKiBxeDtcbiAgb3V0WzddID0gYXcgKiBxdyAtIGF4ICogcXggLSBheSAqIHF5IC0gYXogKiBxejtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlcyBhIGR1YWwgcXVhdCBieSBhIGdpdmVuIHF1YXRlcm5pb24gKHEgKiBhKVxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXR9IHEgcXVhdGVybmlvbiB0byByb3RhdGUgYnlcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZHVhbCBxdWF0ZXJuaW9uIHRvIHJvdGF0ZVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlQnlRdWF0UHJlcGVuZChvdXQsIHEsIGEpIHtcbiAgdmFyIHF4ID0gcVswXSxcbiAgICAgIHF5ID0gcVsxXSxcbiAgICAgIHF6ID0gcVsyXSxcbiAgICAgIHF3ID0gcVszXSxcbiAgICAgIGJ4ID0gYVswXSxcbiAgICAgIGJ5ID0gYVsxXSxcbiAgICAgIGJ6ID0gYVsyXSxcbiAgICAgIGJ3ID0gYVszXTtcbiAgb3V0WzBdID0gcXggKiBidyArIHF3ICogYnggKyBxeSAqIGJ6IC0gcXogKiBieTtcbiAgb3V0WzFdID0gcXkgKiBidyArIHF3ICogYnkgKyBxeiAqIGJ4IC0gcXggKiBiejtcbiAgb3V0WzJdID0gcXogKiBidyArIHF3ICogYnogKyBxeCAqIGJ5IC0gcXkgKiBieDtcbiAgb3V0WzNdID0gcXcgKiBidyAtIHF4ICogYnggLSBxeSAqIGJ5IC0gcXogKiBiejtcbiAgYnggPSBhWzRdO1xuICBieSA9IGFbNV07XG4gIGJ6ID0gYVs2XTtcbiAgYncgPSBhWzddO1xuICBvdXRbNF0gPSBxeCAqIGJ3ICsgcXcgKiBieCArIHF5ICogYnogLSBxeiAqIGJ5O1xuICBvdXRbNV0gPSBxeSAqIGJ3ICsgcXcgKiBieSArIHF6ICogYnggLSBxeCAqIGJ6O1xuICBvdXRbNl0gPSBxeiAqIGJ3ICsgcXcgKiBieiArIHF4ICogYnkgLSBxeSAqIGJ4O1xuICBvdXRbN10gPSBxdyAqIGJ3IC0gcXggKiBieCAtIHF5ICogYnkgLSBxeiAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSb3RhdGVzIGEgZHVhbCBxdWF0IGFyb3VuZCBhIGdpdmVuIGF4aXMuIERvZXMgdGhlIG5vcm1hbGlzYXRpb24gYXV0b21hdGljYWxseVxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXRlcm5pb24gdG8gcm90YXRlXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIGhvdyBmYXIgdGhlIHJvdGF0aW9uIHNob3VsZCBiZVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlQXJvdW5kQXhpcyhvdXQsIGEsIGF4aXMsIHJhZCkge1xuICAvL1NwZWNpYWwgY2FzZSBmb3IgcmFkID0gMFxuICBpZiAoTWF0aC5hYnMocmFkKSA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICByZXR1cm4gY29weShvdXQsIGEpO1xuICB9XG5cbiAgdmFyIGF4aXNMZW5ndGggPSBNYXRoLmh5cG90KGF4aXNbMF0sIGF4aXNbMV0sIGF4aXNbMl0pO1xuICByYWQgPSByYWQgKiAwLjU7XG4gIHZhciBzID0gTWF0aC5zaW4ocmFkKTtcbiAgdmFyIGJ4ID0gcyAqIGF4aXNbMF0gLyBheGlzTGVuZ3RoO1xuICB2YXIgYnkgPSBzICogYXhpc1sxXSAvIGF4aXNMZW5ndGg7XG4gIHZhciBieiA9IHMgKiBheGlzWzJdIC8gYXhpc0xlbmd0aDtcbiAgdmFyIGJ3ID0gTWF0aC5jb3MocmFkKTtcbiAgdmFyIGF4MSA9IGFbMF0sXG4gICAgICBheTEgPSBhWzFdLFxuICAgICAgYXoxID0gYVsyXSxcbiAgICAgIGF3MSA9IGFbM107XG4gIG91dFswXSA9IGF4MSAqIGJ3ICsgYXcxICogYnggKyBheTEgKiBieiAtIGF6MSAqIGJ5O1xuICBvdXRbMV0gPSBheTEgKiBidyArIGF3MSAqIGJ5ICsgYXoxICogYnggLSBheDEgKiBiejtcbiAgb3V0WzJdID0gYXoxICogYncgKyBhdzEgKiBieiArIGF4MSAqIGJ5IC0gYXkxICogYng7XG4gIG91dFszXSA9IGF3MSAqIGJ3IC0gYXgxICogYnggLSBheTEgKiBieSAtIGF6MSAqIGJ6O1xuICB2YXIgYXggPSBhWzRdLFxuICAgICAgYXkgPSBhWzVdLFxuICAgICAgYXogPSBhWzZdLFxuICAgICAgYXcgPSBhWzddO1xuICBvdXRbNF0gPSBheCAqIGJ3ICsgYXcgKiBieCArIGF5ICogYnogLSBheiAqIGJ5O1xuICBvdXRbNV0gPSBheSAqIGJ3ICsgYXcgKiBieSArIGF6ICogYnggLSBheCAqIGJ6O1xuICBvdXRbNl0gPSBheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4O1xuICBvdXRbN10gPSBhdyAqIGJ3IC0gYXggKiBieCAtIGF5ICogYnkgLSBheiAqIGJ6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byBkdWFsIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgb3V0WzNdID0gYVszXSArIGJbM107XG4gIG91dFs0XSA9IGFbNF0gKyBiWzRdO1xuICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgb3V0WzZdID0gYVs2XSArIGJbNl07XG4gIG91dFs3XSA9IGFbN10gKyBiWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBkdWFsIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseShvdXQsIGEsIGIpIHtcbiAgdmFyIGF4MCA9IGFbMF0sXG4gICAgICBheTAgPSBhWzFdLFxuICAgICAgYXowID0gYVsyXSxcbiAgICAgIGF3MCA9IGFbM10sXG4gICAgICBieDEgPSBiWzRdLFxuICAgICAgYnkxID0gYls1XSxcbiAgICAgIGJ6MSA9IGJbNl0sXG4gICAgICBidzEgPSBiWzddLFxuICAgICAgYXgxID0gYVs0XSxcbiAgICAgIGF5MSA9IGFbNV0sXG4gICAgICBhejEgPSBhWzZdLFxuICAgICAgYXcxID0gYVs3XSxcbiAgICAgIGJ4MCA9IGJbMF0sXG4gICAgICBieTAgPSBiWzFdLFxuICAgICAgYnowID0gYlsyXSxcbiAgICAgIGJ3MCA9IGJbM107XG4gIG91dFswXSA9IGF4MCAqIGJ3MCArIGF3MCAqIGJ4MCArIGF5MCAqIGJ6MCAtIGF6MCAqIGJ5MDtcbiAgb3V0WzFdID0gYXkwICogYncwICsgYXcwICogYnkwICsgYXowICogYngwIC0gYXgwICogYnowO1xuICBvdXRbMl0gPSBhejAgKiBidzAgKyBhdzAgKiBiejAgKyBheDAgKiBieTAgLSBheTAgKiBieDA7XG4gIG91dFszXSA9IGF3MCAqIGJ3MCAtIGF4MCAqIGJ4MCAtIGF5MCAqIGJ5MCAtIGF6MCAqIGJ6MDtcbiAgb3V0WzRdID0gYXgwICogYncxICsgYXcwICogYngxICsgYXkwICogYnoxIC0gYXowICogYnkxICsgYXgxICogYncwICsgYXcxICogYngwICsgYXkxICogYnowIC0gYXoxICogYnkwO1xuICBvdXRbNV0gPSBheTAgKiBidzEgKyBhdzAgKiBieTEgKyBhejAgKiBieDEgLSBheDAgKiBiejEgKyBheTEgKiBidzAgKyBhdzEgKiBieTAgKyBhejEgKiBieDAgLSBheDEgKiBiejA7XG4gIG91dFs2XSA9IGF6MCAqIGJ3MSArIGF3MCAqIGJ6MSArIGF4MCAqIGJ5MSAtIGF5MCAqIGJ4MSArIGF6MSAqIGJ3MCArIGF3MSAqIGJ6MCArIGF4MSAqIGJ5MCAtIGF5MSAqIGJ4MDtcbiAgb3V0WzddID0gYXcwICogYncxIC0gYXgwICogYngxIC0gYXkwICogYnkxIC0gYXowICogYnoxICsgYXcxICogYncwIC0gYXgxICogYngwIC0gYXkxICogYnkwIC0gYXoxICogYnowO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQyLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBtdWwgPSBtdWx0aXBseTtcbi8qKlxuICogU2NhbGVzIGEgZHVhbCBxdWF0IGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7cXVhdDJ9IG91dCB0aGUgcmVjZWl2aW5nIGR1YWwgcXVhdFxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBkdWFsIHF1YXQgdG8gc2NhbGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBiIGFtb3VudCB0byBzY2FsZSB0aGUgZHVhbCBxdWF0IGJ5XG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlKG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYjtcbiAgb3V0WzFdID0gYVsxXSAqIGI7XG4gIG91dFsyXSA9IGFbMl0gKiBiO1xuICBvdXRbM10gPSBhWzNdICogYjtcbiAgb3V0WzRdID0gYVs0XSAqIGI7XG4gIG91dFs1XSA9IGFbNV0gKiBiO1xuICBvdXRbNl0gPSBhWzZdICogYjtcbiAgb3V0WzddID0gYVs3XSAqIGI7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byBkdWFsIHF1YXQncyAoVGhlIGRvdCBwcm9kdWN0IG9mIHRoZSByZWFsIHBhcnRzKVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBkb3QgPSBxdWF0LmRvdDtcbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBkdWFsIHF1YXRzJ3NcbiAqIE5PVEU6IFRoZSByZXN1bHRpbmcgZHVhbCBxdWF0ZXJuaW9ucyB3b24ndCBhbHdheXMgYmUgbm9ybWFsaXplZCAoVGhlIGVycm9yIGlzIG1vc3Qgbm90aWNlYWJsZSB3aGVuIHQgPSAwLjUpXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0XG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSB0IGludGVycG9sYXRpb24gYW1vdW50LCBpbiB0aGUgcmFuZ2UgWzAtMV0sIGJldHdlZW4gdGhlIHR3byBpbnB1dHNcbiAqIEByZXR1cm5zIHtxdWF0Mn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBtdCA9IDEgLSB0O1xuICBpZiAoZG90KGEsIGIpIDwgMCkgdCA9IC10O1xuICBvdXRbMF0gPSBhWzBdICogbXQgKyBiWzBdICogdDtcbiAgb3V0WzFdID0gYVsxXSAqIG10ICsgYlsxXSAqIHQ7XG4gIG91dFsyXSA9IGFbMl0gKiBtdCArIGJbMl0gKiB0O1xuICBvdXRbM10gPSBhWzNdICogbXQgKyBiWzNdICogdDtcbiAgb3V0WzRdID0gYVs0XSAqIG10ICsgYls0XSAqIHQ7XG4gIG91dFs1XSA9IGFbNV0gKiBtdCArIGJbNV0gKiB0O1xuICBvdXRbNl0gPSBhWzZdICogbXQgKyBiWzZdICogdDtcbiAgb3V0WzddID0gYVs3XSAqIG10ICsgYls3XSAqIHQ7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGludmVyc2Ugb2YgYSBkdWFsIHF1YXQuIElmIHRoZXkgYXJlIG5vcm1hbGl6ZWQsIGNvbmp1Z2F0ZSBpcyBjaGVhcGVyXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgZHVhbCBxdWF0IHRvIGNhbGN1bGF0ZSBpbnZlcnNlIG9mXG4gKiBAcmV0dXJucyB7cXVhdDJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnQob3V0LCBhKSB7XG4gIHZhciBzcWxlbiA9IHNxdWFyZWRMZW5ndGgoYSk7XG4gIG91dFswXSA9IC1hWzBdIC8gc3FsZW47XG4gIG91dFsxXSA9IC1hWzFdIC8gc3FsZW47XG4gIG91dFsyXSA9IC1hWzJdIC8gc3FsZW47XG4gIG91dFszXSA9IGFbM10gLyBzcWxlbjtcbiAgb3V0WzRdID0gLWFbNF0gLyBzcWxlbjtcbiAgb3V0WzVdID0gLWFbNV0gLyBzcWxlbjtcbiAgb3V0WzZdID0gLWFbNl0gLyBzcWxlbjtcbiAgb3V0WzddID0gYVs3XSAvIHNxbGVuO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBjb25qdWdhdGUgb2YgYSBkdWFsIHF1YXRcbiAqIElmIHRoZSBkdWFsIHF1YXRlcm5pb24gaXMgbm9ybWFsaXplZCwgdGhpcyBmdW5jdGlvbiBpcyBmYXN0ZXIgdGhhbiBxdWF0Mi5pbnZlcnNlIGFuZCBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHQuXG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHF1YXQgdG8gY2FsY3VsYXRlIGNvbmp1Z2F0ZSBvZlxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29uanVnYXRlKG91dCwgYSkge1xuICBvdXRbMF0gPSAtYVswXTtcbiAgb3V0WzFdID0gLWFbMV07XG4gIG91dFsyXSA9IC1hWzJdO1xuICBvdXRbM10gPSBhWzNdO1xuICBvdXRbNF0gPSAtYVs0XTtcbiAgb3V0WzVdID0gLWFbNV07XG4gIG91dFs2XSA9IC1hWzZdO1xuICBvdXRbN10gPSBhWzddO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSBkdWFsIHF1YXRcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgZHVhbCBxdWF0IHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGxlbmd0aCA9IHF1YXQubGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQyLmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIGR1YWwgcXVhdFxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYSBkdWFsIHF1YXQgdG8gY2FsY3VsYXRlIHNxdWFyZWQgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGxlbmd0aCBvZiBhXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHNxdWFyZWRMZW5ndGggPSBxdWF0LnNxdWFyZWRMZW5ndGg7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdDIuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxuICogTm9ybWFsaXplIGEgZHVhbCBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgZHVhbCBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgZHVhbCBxdWF0ZXJuaW9uIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3F1YXQyfSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUob3V0LCBhKSB7XG4gIHZhciBtYWduaXR1ZGUgPSBzcXVhcmVkTGVuZ3RoKGEpO1xuXG4gIGlmIChtYWduaXR1ZGUgPiAwKSB7XG4gICAgbWFnbml0dWRlID0gTWF0aC5zcXJ0KG1hZ25pdHVkZSk7XG4gICAgdmFyIGEwID0gYVswXSAvIG1hZ25pdHVkZTtcbiAgICB2YXIgYTEgPSBhWzFdIC8gbWFnbml0dWRlO1xuICAgIHZhciBhMiA9IGFbMl0gLyBtYWduaXR1ZGU7XG4gICAgdmFyIGEzID0gYVszXSAvIG1hZ25pdHVkZTtcbiAgICB2YXIgYjAgPSBhWzRdO1xuICAgIHZhciBiMSA9IGFbNV07XG4gICAgdmFyIGIyID0gYVs2XTtcbiAgICB2YXIgYjMgPSBhWzddO1xuICAgIHZhciBhX2RvdF9iID0gYTAgKiBiMCArIGExICogYjEgKyBhMiAqIGIyICsgYTMgKiBiMztcbiAgICBvdXRbMF0gPSBhMDtcbiAgICBvdXRbMV0gPSBhMTtcbiAgICBvdXRbMl0gPSBhMjtcbiAgICBvdXRbM10gPSBhMztcbiAgICBvdXRbNF0gPSAoYjAgLSBhMCAqIGFfZG90X2IpIC8gbWFnbml0dWRlO1xuICAgIG91dFs1XSA9IChiMSAtIGExICogYV9kb3RfYikgLyBtYWduaXR1ZGU7XG4gICAgb3V0WzZdID0gKGIyIC0gYTIgKiBhX2RvdF9iKSAvIG1hZ25pdHVkZTtcbiAgICBvdXRbN10gPSAoYjMgLSBhMyAqIGFfZG90X2IpIC8gbWFnbml0dWRlO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGR1YWwgcXVhdGVuaW9uXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIGR1YWwgcXVhdGVybmlvbiB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZHVhbCBxdWF0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cihhKSB7XG4gIHJldHVybiBcInF1YXQyKFwiICsgYVswXSArIFwiLCBcIiArIGFbMV0gKyBcIiwgXCIgKyBhWzJdICsgXCIsIFwiICsgYVszXSArIFwiLCBcIiArIGFbNF0gKyBcIiwgXCIgKyBhWzVdICsgXCIsIFwiICsgYVs2XSArIFwiLCBcIiArIGFbN10gKyBcIilcIjtcbn1cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZHVhbCBxdWF0ZXJuaW9ucyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVF1YXQyfSBhIHRoZSBmaXJzdCBkdWFsIHF1YXRlcm5pb24uXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGIgdGhlIHNlY29uZCBkdWFsIHF1YXRlcm5pb24uXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgZHVhbCBxdWF0ZXJuaW9ucyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZXhhY3RFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXSAmJiBhWzRdID09PSBiWzRdICYmIGFbNV0gPT09IGJbNV0gJiYgYVs2XSA9PT0gYls2XSAmJiBhWzddID09PSBiWzddO1xufVxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBkdWFsIHF1YXRlcm5pb25zIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5UXVhdDJ9IGEgdGhlIGZpcnN0IGR1YWwgcXVhdC5cbiAqIEBwYXJhbSB7UmVhZG9ubHlRdWF0Mn0gYiB0aGUgc2Vjb25kIGR1YWwgcXVhdC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBkdWFsIHF1YXRzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdLFxuICAgICAgYTIgPSBhWzJdLFxuICAgICAgYTMgPSBhWzNdLFxuICAgICAgYTQgPSBhWzRdLFxuICAgICAgYTUgPSBhWzVdLFxuICAgICAgYTYgPSBhWzZdLFxuICAgICAgYTcgPSBhWzddO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdLFxuICAgICAgYjIgPSBiWzJdLFxuICAgICAgYjMgPSBiWzNdLFxuICAgICAgYjQgPSBiWzRdLFxuICAgICAgYjUgPSBiWzVdLFxuICAgICAgYjYgPSBiWzZdLFxuICAgICAgYjcgPSBiWzddO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJiBNYXRoLmFicyhhMiAtIGIyKSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiYgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTMpLCBNYXRoLmFicyhiMykpICYmIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJiBNYXRoLmFicyhhNSAtIGI1KSA8PSBnbE1hdHJpeC5FUFNJTE9OICogTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSkgJiYgTWF0aC5hYnMoYTYgLSBiNikgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTYpLCBNYXRoLmFicyhiNikpICYmIE1hdGguYWJzKGE3IC0gYjcpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE3KSwgTWF0aC5hYnMoYjcpKTtcbn0iLCJpbXBvcnQgKiBhcyBnbE1hdHJpeCBmcm9tIFwiLi9jb21tb24uanNcIjtcbi8qKlxuICogMiBEaW1lbnNpb25hbCBWZWN0b3JcbiAqIEBtb2R1bGUgdmVjMlxuICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjMlxuICpcbiAqIEByZXR1cm5zIHt2ZWMyfSBhIG5ldyAyRCB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKCkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG5cbiAgaWYgKGdsTWF0cml4LkFSUkFZX1RZUEUgIT0gRmxvYXQzMkFycmF5KSB7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGNsb25lXG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKGEpIHtcbiAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuICBvdXRbMF0gPSBhWzBdO1xuICBvdXRbMV0gPSBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzIgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjMn0gYSBuZXcgMkQgdmVjdG9yXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21WYWx1ZXMoeCwgeSkge1xuICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMik7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMyIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29weShvdXQsIGEpIHtcbiAgb3V0WzBdID0gYVswXTtcbiAgb3V0WzFdID0gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMiB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQob3V0LCB4LCB5KSB7XG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IHk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEFkZHMgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KG91dCwgYSwgYikge1xuICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjZWlsXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNlaWwob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB2ZWN0b3IgdG8gZmxvb3JcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmxvb3Iob3V0LCBhKSB7XG4gIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIG1pbihvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgob3V0LCBhLCBiKSB7XG4gIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIHJvdW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKG91dCwgYSkge1xuICBvdXRbMF0gPSBNYXRoLnJvdW5kKGFbMF0pO1xuICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMyIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIHZlY3RvciBieVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZShvdXQsIGEsIGIpIHtcbiAgb3V0WzBdID0gYVswXSAqIGI7XG4gIG91dFsxXSA9IGFbMV0gKiBiO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBBZGRzIHR3byB2ZWMyJ3MgYWZ0ZXIgc2NhbGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYiBieSBiZWZvcmUgYWRkaW5nXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlQW5kQWRkKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgb3V0WzBdID0gYVswXSArIGJbMF0gKiBzY2FsZTtcbiAgb3V0WzFdID0gYVsxXSArIGJbMV0gKiBzY2FsZTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZShhLCBiKSB7XG4gIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICB5ID0gYlsxXSAtIGFbMV07XG4gIHJldHVybiBNYXRoLmh5cG90KHgsIHkpO1xufVxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkRGlzdGFuY2UoYSwgYikge1xuICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICByZXR1cm4geCAqIHggKyB5ICogeTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGgoYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSk7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHNxdWFyZWQgbGVuZ3RoIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgc3F1YXJlZCBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IHNxdWFyZWQgbGVuZ3RoIG9mIGFcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3F1YXJlZExlbmd0aChhKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICByZXR1cm4geCAqIHggKyB5ICogeTtcbn1cbi8qKlxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBuZWdhdGUob3V0LCBhKSB7XG4gIG91dFswXSA9IC1hWzBdO1xuICBvdXRbMV0gPSAtYVsxXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnNlKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKG91dCwgYSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgdmFyIGxlbiA9IHggKiB4ICsgeSAqIHk7XG5cbiAgaWYgKGxlbiA+IDApIHtcbiAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgfVxuXG4gIG91dFswXSA9IGFbMF0gKiBsZW47XG4gIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdO1xufVxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMidzXG4gKiBOb3RlIHRoYXQgdGhlIGNyb3NzIHByb2R1Y3QgbXVzdCBieSBkZWZpbml0aW9uIHByb2R1Y2UgYSAzRCB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9zcyhvdXQsIGEsIGIpIHtcbiAgdmFyIHogPSBhWzBdICogYlsxXSAtIGFbMV0gKiBiWzBdO1xuICBvdXRbMF0gPSBvdXRbMV0gPSAwO1xuICBvdXRbMl0gPSB6O1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCwgaW4gdGhlIHJhbmdlIFswLTFdLCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxlcnAob3V0LCBhLCBiLCB0KSB7XG4gIHZhciBheCA9IGFbMF0sXG4gICAgICBheSA9IGFbMV07XG4gIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tKG91dCwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG4gIHZhciByID0gZ2xNYXRyaXguUkFORE9NKCkgKiAyLjAgKiBNYXRoLlBJO1xuICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHNjYWxlO1xuICBvdXRbMV0gPSBNYXRoLnNpbihyKSAqIHNjYWxlO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0Mn0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtTWF0MihvdXQsIGEsIG0pIHtcbiAgdmFyIHggPSBhWzBdLFxuICAgICAgeSA9IGFbMV07XG4gIG91dFswXSA9IG1bMF0gKiB4ICsgbVsyXSAqIHk7XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHk7XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge1JlYWRvbmx5TWF0MmR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDJkKG91dCwgYSwgbSkge1xuICB2YXIgeCA9IGFbMF0sXG4gICAgICB5ID0gYVsxXTtcbiAgb3V0WzBdID0gbVswXSAqIHggKyBtWzJdICogeSArIG1bNF07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHkgKyBtWzVdO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQzXG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDN9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDMob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXSxcbiAgICAgIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bM10gKiB5ICsgbVs2XTtcbiAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzRdICogeSArIG1bN107XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzIgd2l0aCBhIG1hdDRcbiAqIDNyZCB2ZWN0b3IgY29tcG9uZW50IGlzIGltcGxpY2l0bHkgJzAnXG4gKiA0dGggdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHtSZWFkb25seU1hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybU1hdDQob3V0LCBhLCBtKSB7XG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVsxMl07XG4gIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzEzXTtcbiAgcmV0dXJuIG91dDtcbn1cbi8qKlxuICogUm90YXRlIGEgMkQgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCBUaGUgcmVjZWl2aW5nIHZlYzJcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSB2ZWMyIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgVGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIHJhZGlhbnNcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKG91dCwgYSwgYiwgcmFkKSB7XG4gIC8vVHJhbnNsYXRlIHBvaW50IHRvIHRoZSBvcmlnaW5cbiAgdmFyIHAwID0gYVswXSAtIGJbMF0sXG4gICAgICBwMSA9IGFbMV0gLSBiWzFdLFxuICAgICAgc2luQyA9IE1hdGguc2luKHJhZCksXG4gICAgICBjb3NDID0gTWF0aC5jb3MocmFkKTsgLy9wZXJmb3JtIHJvdGF0aW9uIGFuZCB0cmFuc2xhdGUgdG8gY29ycmVjdCBwb3NpdGlvblxuXG4gIG91dFswXSA9IHAwICogY29zQyAtIHAxICogc2luQyArIGJbMF07XG4gIG91dFsxXSA9IHAwICogc2luQyArIHAxICogY29zQyArIGJbMV07XG4gIHJldHVybiBvdXQ7XG59XG4vKipcbiAqIEdldCB0aGUgYW5nbGUgYmV0d2VlbiB0d28gMkQgdmVjdG9yc1xuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgVGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBiIFRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gVGhlIGFuZ2xlIGluIHJhZGlhbnNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gYW5nbGUoYSwgYikge1xuICB2YXIgeDEgPSBhWzBdLFxuICAgICAgeTEgPSBhWzFdLFxuICAgICAgeDIgPSBiWzBdLFxuICAgICAgeTIgPSBiWzFdLFxuICAgICAgLy8gbWFnIGlzIHRoZSBwcm9kdWN0IG9mIHRoZSBtYWduaXR1ZGVzIG9mIGEgYW5kIGJcbiAgbWFnID0gTWF0aC5zcXJ0KHgxICogeDEgKyB5MSAqIHkxKSAqIE1hdGguc3FydCh4MiAqIHgyICsgeTIgKiB5MiksXG4gICAgICAvLyBtYWcgJiYuLiBzaG9ydCBjaXJjdWl0cyBpZiBtYWcgPT0gMFxuICBjb3NpbmUgPSBtYWcgJiYgKHgxICogeDIgKyB5MSAqIHkyKSAvIG1hZzsgLy8gTWF0aC5taW4oTWF0aC5tYXgoY29zaW5lLCAtMSksIDEpIGNsYW1wcyB0aGUgY29zaW5lIGJldHdlZW4gLTEgYW5kIDFcblxuICByZXR1cm4gTWF0aC5hY29zKE1hdGgubWluKE1hdGgubWF4KGNvc2luZSwgLTEpLCAxKSk7XG59XG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzIgdG8gemVyb1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8ob3V0KSB7XG4gIG91dFswXSA9IDAuMDtcbiAgb3V0WzFdID0gMC4wO1xuICByZXR1cm4gb3V0O1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdmVjdG9yXG4gKlxuICogQHBhcmFtIHtSZWFkb25seVZlYzJ9IGEgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyKGEpIHtcbiAgcmV0dXJuIFwidmVjMihcIiArIGFbMF0gKyBcIiwgXCIgKyBhWzFdICsgXCIpXCI7XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgZXhhY3RseSBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBleGFjdEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV07XG59XG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7UmVhZG9ubHlWZWMyfSBhIFRoZSBmaXJzdCB2ZWN0b3IuXG4gKiBAcGFyYW0ge1JlYWRvbmx5VmVjMn0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMoYSwgYikge1xuICB2YXIgYTAgPSBhWzBdLFxuICAgICAgYTEgPSBhWzFdO1xuICB2YXIgYjAgPSBiWzBdLFxuICAgICAgYjEgPSBiWzFdO1xuICByZXR1cm4gTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTiAqIE1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTApLCBNYXRoLmFicyhiMCkpICYmIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04gKiBNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKTtcbn1cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmxlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgbGVuID0gbGVuZ3RoO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIHN1YiA9IHN1YnRyYWN0O1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIG11bCA9IG11bHRpcGx5O1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBkaXYgPSBkaXZpZGU7XG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgZGlzdCA9IGRpc3RhbmNlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cblxuZXhwb3J0IHZhciBzcXJEaXN0ID0gc3F1YXJlZERpc3RhbmNlO1xuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5cbmV4cG9ydCB2YXIgc3FyTGVuID0gc3F1YXJlZExlbmd0aDtcbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzJzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzIuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMycyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xuXG5leHBvcnQgdmFyIGZvckVhY2ggPSBmdW5jdGlvbiAoKSB7XG4gIHZhciB2ZWMgPSBjcmVhdGUoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICB2YXIgaSwgbDtcblxuICAgIGlmICghc3RyaWRlKSB7XG4gICAgICBzdHJpZGUgPSAyO1xuICAgIH1cblxuICAgIGlmICghb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIGlmIChjb3VudCkge1xuICAgICAgbCA9IE1hdGgubWluKGNvdW50ICogc3RyaWRlICsgb2Zmc2V0LCBhLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgdmVjWzBdID0gYVtpXTtcbiAgICAgIHZlY1sxXSA9IGFbaSArIDFdO1xuICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICBhW2ldID0gdmVjWzBdO1xuICAgICAgYVtpICsgMV0gPSB2ZWNbMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGE7XG4gIH07XG59KCk7IiwiLy8gQGZsb3dcblxuaW1wb3J0IHt2ZWMzLCB2ZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7VmVjM30gZnJvbSAnZ2wtbWF0cml4JztcblxuY2xhc3MgUmF5IHtcbiAgICBwb3M6IFZlYzM7XG4gICAgZGlyOiBWZWMzO1xuXG4gICAgY29uc3RydWN0b3IocG9zXzogVmVjMywgZGlyXzogVmVjMykge1xuICAgICAgICB0aGlzLnBvcyA9IHBvc187XG4gICAgICAgIHRoaXMuZGlyID0gZGlyXztcbiAgICB9XG5cbiAgICBpbnRlcnNlY3RzUGxhbmUocHQ6IFZlYzMsIG5vcm1hbDogVmVjMywgb3V0OiBWZWMzKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IEQgPSB2ZWMzLmRvdChub3JtYWwsIHRoaXMuZGlyKTtcblxuICAgICAgICAvLyByYXkgaXMgcGFyYWxsZWwgdG8gcGxhbmUsIHNvIGl0IG1pc3Nlc1xuICAgICAgICBpZiAoTWF0aC5hYnMoRCkgPCAxZS02KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGNvbnN0IHQgPSAoXG4gICAgICAgICAgICAocHRbMF0gLSB0aGlzLnBvc1swXSkgKiBub3JtYWxbMF0gK1xuICAgICAgICAgICAgKHB0WzFdIC0gdGhpcy5wb3NbMV0pICogbm9ybWFsWzFdICtcbiAgICAgICAgICAgIChwdFsyXSAtIHRoaXMucG9zWzJdKSAqIG5vcm1hbFsyXSkgLyBEO1xuXG4gICAgICAgIG91dFswXSA9IHRoaXMucG9zWzBdICsgdGhpcy5kaXJbMF0gKiB0O1xuICAgICAgICBvdXRbMV0gPSB0aGlzLnBvc1sxXSArIHRoaXMuZGlyWzFdICogdDtcbiAgICAgICAgb3V0WzJdID0gdGhpcy5wb3NbMl0gKyB0aGlzLmRpclsyXSAqIHQ7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY2xvc2VzdFBvaW50T25TcGhlcmUoY2VudGVyOiBWZWMzLCByOiBudW1iZXIsIG91dDogVmVjMyk6IGJvb2xlYW4ge1xuICAgICAgICBhc3NlcnQodmVjMy5zcXVhcmVkTGVuZ3RoKHRoaXMuZGlyKSA+IDAuMCAmJiByID49IDAuMCk7XG5cbiAgICAgICAgaWYgKHZlYzMuZXF1YWxzKHRoaXMucG9zLCBjZW50ZXIpIHx8IHIgPT09IDAuMCkge1xuICAgICAgICAgICAgb3V0WzBdID0gb3V0WzFdID0gb3V0WzJdID0gMDtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtkeCwgZHksIGR6XSA9IHRoaXMuZGlyO1xuXG4gICAgICAgIGNvbnN0IHB4ID0gdGhpcy5wb3NbMF0gLSBjZW50ZXJbMF07XG4gICAgICAgIGNvbnN0IHB5ID0gdGhpcy5wb3NbMV0gLSBjZW50ZXJbMV07XG4gICAgICAgIGNvbnN0IHB6ID0gdGhpcy5wb3NbMl0gLSBjZW50ZXJbMl07XG5cbiAgICAgICAgY29uc3QgYSA9IGR4ICogZHggKyBkeSAqIGR5ICsgZHogKiBkejtcbiAgICAgICAgY29uc3QgYiA9IDIuMCAqIChweCAqIGR4ICsgcHkgKiBkeSArIHB6ICogZHopO1xuICAgICAgICBjb25zdCBjID0gKHB4ICogcHggKyBweSAqIHB5ICsgcHogKiBweikgLSByICogcjtcbiAgICAgICAgY29uc3QgZCA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuXG4gICAgICAgIGlmIChkIDwgMC4wKSB7XG4gICAgICAgICAgICAvLyBObyBpbnRlcnNlY3Rpb24sIGZpbmQgZGlzdGFuY2UgYmV0d2VlbiBjbG9zZXN0IHBvaW50c1xuICAgICAgICAgICAgY29uc3QgdCA9IE1hdGgubWF4KC1iIC8gMiwgMC4wKTtcbiAgICAgICAgICAgIGNvbnN0IGd4ID0gcHggKyBkeCAqIHQ7IC8vIHBvaW50IHRvIGdsb2JlXG4gICAgICAgICAgICBjb25zdCBneSA9IHB5ICsgZHkgKiB0O1xuICAgICAgICAgICAgY29uc3QgZ3ogPSBweiArIGR6ICogdDtcbiAgICAgICAgICAgIGNvbnN0IGdsZW4gPSBNYXRoLmh5cG90KGd4LCBneSwgZ3opO1xuICAgICAgICAgICAgb3V0WzBdID0gZ3ggKiByIC8gZ2xlbjtcbiAgICAgICAgICAgIG91dFsxXSA9IGd5ICogciAvIGdsZW47XG4gICAgICAgICAgICBvdXRbMl0gPSBneiAqIHIgLyBnbGVuO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQoYSA+IDAuMCk7XG4gICAgICAgICAgICBjb25zdCB0ID0gKC1iIC0gTWF0aC5zcXJ0KGQpKSAvICgyLjAgKiBhKTtcblxuICAgICAgICAgICAgaWYgKHQgPCAwLjApIHtcbiAgICAgICAgICAgICAgICAvLyBSYXkgaXMgcG9pbnRpbmcgYXdheSBmcm9tIHRoZSBzcGhlcmVcbiAgICAgICAgICAgICAgICBjb25zdCBwbGVuID0gTWF0aC5oeXBvdChweCwgcHksIHB6KTtcbiAgICAgICAgICAgICAgICBvdXRbMF0gPSBweCAqIHIgLyBwbGVuO1xuICAgICAgICAgICAgICAgIG91dFsxXSA9IHB5ICogciAvIHBsZW47XG4gICAgICAgICAgICAgICAgb3V0WzJdID0gcHogKiByIC8gcGxlbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0WzBdID0gcHggKyBkeCAqIHQ7XG4gICAgICAgICAgICAgICAgb3V0WzFdID0gcHkgKyBkeSAqIHQ7XG4gICAgICAgICAgICAgICAgb3V0WzJdID0gcHogKyBkeiAqIHQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIEZydXN0dW1Db3JuZXJzIHtcbiAgICBUTDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIFRSOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgQlI6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICBCTDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIGhvcml6b246IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKFRMXzogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBUUl86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgQlJfOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIEJMXzogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBob3Jpem9uXzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuVEwgPSBUTF87XG4gICAgICAgIHRoaXMuVFIgPSBUUl87XG4gICAgICAgIHRoaXMuQlIgPSBCUl87XG4gICAgICAgIHRoaXMuQkwgPSBCTF87XG4gICAgICAgIHRoaXMuaG9yaXpvbiA9IGhvcml6b25fO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSW52UHJvamVjdGlvbk1hdHJpeChpbnZQcm9qOiBBcnJheTxudW1iZXI+LCBob3Jpem9uRnJvbVRvcDogbnVtYmVyLCB2aWV3cG9ydEhlaWdodDogbnVtYmVyKTogRnJ1c3R1bUNvcm5lcnMge1xuICAgICAgICBjb25zdCBUTENsaXAgPSBbLTEsIDEsIDFdO1xuICAgICAgICBjb25zdCBUUkNsaXAgPSBbMSwgMSwgMV07XG4gICAgICAgIGNvbnN0IEJSQ2xpcCA9IFsxLCAtMSwgMV07XG4gICAgICAgIGNvbnN0IEJMQ2xpcCA9IFstMSwgLTEsIDFdO1xuXG4gICAgICAgIGNvbnN0IFRMID0gdmVjMy50cmFuc2Zvcm1NYXQ0KFRMQ2xpcCwgVExDbGlwLCBpbnZQcm9qKTtcbiAgICAgICAgY29uc3QgVFIgPSB2ZWMzLnRyYW5zZm9ybU1hdDQoVFJDbGlwLCBUUkNsaXAsIGludlByb2opO1xuICAgICAgICBjb25zdCBCUiA9IHZlYzMudHJhbnNmb3JtTWF0NChCUkNsaXAsIEJSQ2xpcCwgaW52UHJvaik7XG4gICAgICAgIGNvbnN0IEJMID0gdmVjMy50cmFuc2Zvcm1NYXQ0KEJMQ2xpcCwgQkxDbGlwLCBpbnZQcm9qKTtcblxuICAgICAgICByZXR1cm4gbmV3IEZydXN0dW1Db3JuZXJzKFRMLCBUUiwgQlIsIEJMLCBob3Jpem9uRnJvbVRvcCAvIHZpZXdwb3J0SGVpZ2h0KTtcbiAgICB9XG59XG5cbmNsYXNzIEZydXN0dW0ge1xuICAgIHBvaW50czogQXJyYXk8QXJyYXk8bnVtYmVyPj47XG4gICAgcGxhbmVzOiBBcnJheTxBcnJheTxudW1iZXI+PjtcblxuICAgIGNvbnN0cnVjdG9yKHBvaW50c186IEFycmF5PEFycmF5PG51bWJlcj4+LCBwbGFuZXNfOiBBcnJheTxBcnJheTxudW1iZXI+Pikge1xuICAgICAgICB0aGlzLnBvaW50cyA9IHBvaW50c187XG4gICAgICAgIHRoaXMucGxhbmVzID0gcGxhbmVzXztcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUludlByb2plY3Rpb25NYXRyaXgoaW52UHJvajogRmxvYXQ2NEFycmF5LCB3b3JsZFNpemU6IG51bWJlciwgem9vbTogbnVtYmVyLCB6SW5NZXRlcnM6IGJvb2xlYW4pOiBGcnVzdHVtIHtcbiAgICAgICAgY29uc3QgY2xpcFNwYWNlQ29ybmVycyA9IFtcbiAgICAgICAgICAgIFstMSwgMSwgLTEsIDFdLFxuICAgICAgICAgICAgWyAxLCAxLCAtMSwgMV0sXG4gICAgICAgICAgICBbIDEsIC0xLCAtMSwgMV0sXG4gICAgICAgICAgICBbLTEsIC0xLCAtMSwgMV0sXG4gICAgICAgICAgICBbLTEsIDEsIDEsIDFdLFxuICAgICAgICAgICAgWyAxLCAxLCAxLCAxXSxcbiAgICAgICAgICAgIFsgMSwgLTEsIDEsIDFdLFxuICAgICAgICAgICAgWy0xLCAtMSwgMSwgMV1cbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDIsIHpvb20pO1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSBmcnVzdHVtIGNvcm5lciBwb2ludHMgZnJvbSBjbGlwIHNwYWNlIHRvIHRpbGUgc3BhY2VcbiAgICAgICAgY29uc3QgZnJ1c3R1bUNvb3JkcyA9IGNsaXBTcGFjZUNvcm5lcnNcbiAgICAgICAgICAgIC5tYXAodiA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcyA9IHZlYzQudHJhbnNmb3JtTWF0NChbXSwgdiwgaW52UHJvaik7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IDEuMCAvIHNbM10gLyB3b3JsZFNpemUgKiBzY2FsZTtcbiAgICAgICAgICAgICAgICAvLyBaIHNjYWxlIGluIG1ldGVycy5cbiAgICAgICAgICAgICAgICByZXR1cm4gdmVjNC5tdWwocywgcywgW2ssIGssIHpJbk1ldGVycyA/IDEuMCAvIHNbM10gOiBrLCBrXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBmcnVzdHVtUGxhbmVQb2ludEluZGljZXMgPSBbXG4gICAgICAgICAgICBbMCwgMSwgMl0sICAvLyBuZWFyXG4gICAgICAgICAgICBbNiwgNSwgNF0sICAvLyBmYXJcbiAgICAgICAgICAgIFswLCAzLCA3XSwgIC8vIGxlZnRcbiAgICAgICAgICAgIFsyLCAxLCA1XSwgIC8vIHJpZ2h0XG4gICAgICAgICAgICBbMywgMiwgNl0sICAvLyBib3R0b21cbiAgICAgICAgICAgIFswLCA0LCA1XSAgIC8vIHRvcFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IGZydXN0dW1QbGFuZXMgPSBmcnVzdHVtUGxhbmVQb2ludEluZGljZXMubWFwKChwOiBBcnJheTxudW1iZXI+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhID0gdmVjMy5zdWIoW10sIGZydXN0dW1Db29yZHNbcFswXV0sIGZydXN0dW1Db29yZHNbcFsxXV0pO1xuICAgICAgICAgICAgY29uc3QgYiA9IHZlYzMuc3ViKFtdLCBmcnVzdHVtQ29vcmRzW3BbMl1dLCBmcnVzdHVtQ29vcmRzW3BbMV1dKTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSB2ZWMzLm5vcm1hbGl6ZShbXSwgdmVjMy5jcm9zcyhbXSwgYSwgYikpO1xuICAgICAgICAgICAgY29uc3QgZCA9IC12ZWMzLmRvdChuLCBmcnVzdHVtQ29vcmRzW3BbMV1dKTtcbiAgICAgICAgICAgIHJldHVybiBuLmNvbmNhdChkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGcnVzdHVtKGZydXN0dW1Db29yZHMsIGZydXN0dW1QbGFuZXMpO1xuICAgIH1cbn1cblxuY2xhc3MgQWFiYiB7XG4gICAgbWluOiBWZWMzO1xuICAgIG1heDogVmVjMztcbiAgICBjZW50ZXI6IFZlYzM7XG5cbiAgICBjb25zdHJ1Y3RvcihtaW5fOiBWZWMzLCBtYXhfOiBWZWMzKSB7XG4gICAgICAgIHRoaXMubWluID0gbWluXztcbiAgICAgICAgdGhpcy5tYXggPSBtYXhfO1xuICAgICAgICB0aGlzLmNlbnRlciA9IHZlYzMuc2NhbGUoW10sIHZlYzMuYWRkKFtdLCB0aGlzLm1pbiwgdGhpcy5tYXgpLCAwLjUpO1xuICAgIH1cblxuICAgIHF1YWRyYW50KGluZGV4OiBudW1iZXIpOiBBYWJiIHtcbiAgICAgICAgY29uc3Qgc3BsaXQgPSBbKGluZGV4ICUgMikgPT09IDAsIGluZGV4IDwgMl07XG4gICAgICAgIGNvbnN0IHFNaW4gPSB2ZWMzLmNsb25lKHRoaXMubWluKTtcbiAgICAgICAgY29uc3QgcU1heCA9IHZlYzMuY2xvbmUodGhpcy5tYXgpO1xuICAgICAgICBmb3IgKGxldCBheGlzID0gMDsgYXhpcyA8IHNwbGl0Lmxlbmd0aDsgYXhpcysrKSB7XG4gICAgICAgICAgICBxTWluW2F4aXNdID0gc3BsaXRbYXhpc10gPyB0aGlzLm1pbltheGlzXSA6IHRoaXMuY2VudGVyW2F4aXNdO1xuICAgICAgICAgICAgcU1heFtheGlzXSA9IHNwbGl0W2F4aXNdID8gdGhpcy5jZW50ZXJbYXhpc10gOiB0aGlzLm1heFtheGlzXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUZW1wb3JhcmlseSwgZWxldmF0aW9uIGlzIGNvbnN0YW50LCBoZW5jZSBxdWFkcmFudC5tYXgueiA9IHRoaXMubWF4LnpcbiAgICAgICAgcU1heFsyXSA9IHRoaXMubWF4WzJdO1xuICAgICAgICByZXR1cm4gbmV3IEFhYmIocU1pbiwgcU1heCk7XG4gICAgfVxuXG4gICAgZGlzdGFuY2VYKHBvaW50OiBBcnJheTxudW1iZXI+KTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcG9pbnRPbkFhYmIgPSBNYXRoLm1heChNYXRoLm1pbih0aGlzLm1heFswXSwgcG9pbnRbMF0pLCB0aGlzLm1pblswXSk7XG4gICAgICAgIHJldHVybiBwb2ludE9uQWFiYiAtIHBvaW50WzBdO1xuICAgIH1cblxuICAgIGRpc3RhbmNlWShwb2ludDogQXJyYXk8bnVtYmVyPik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBvaW50T25BYWJiID0gTWF0aC5tYXgoTWF0aC5taW4odGhpcy5tYXhbMV0sIHBvaW50WzFdKSwgdGhpcy5taW5bMV0pO1xuICAgICAgICByZXR1cm4gcG9pbnRPbkFhYmIgLSBwb2ludFsxXTtcbiAgICB9XG5cbiAgICBkaXN0YW5jZVoocG9pbnQ6IEFycmF5PG51bWJlcj4pOiBudW1iZXIge1xuICAgICAgICBjb25zdCBwb2ludE9uQWFiYiA9IE1hdGgubWF4KE1hdGgubWluKHRoaXMubWF4WzJdLCBwb2ludFsyXSksIHRoaXMubWluWzJdKTtcbiAgICAgICAgcmV0dXJuIHBvaW50T25BYWJiIC0gcG9pbnRbMl07XG4gICAgfVxuXG4gICAgZ2V0Q29ybmVycygpOiBBcnJheTxBcnJheTxudW1iZXI+PiB7XG4gICAgICAgIGNvbnN0IG1uID0gdGhpcy5taW47XG4gICAgICAgIGNvbnN0IG14ID0gdGhpcy5tYXg7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBbbW5bMF0sIG1uWzFdLCBtblsyXV0sXG4gICAgICAgICAgICBbbXhbMF0sIG1uWzFdLCBtblsyXV0sXG4gICAgICAgICAgICBbbXhbMF0sIG14WzFdLCBtblsyXV0sXG4gICAgICAgICAgICBbbW5bMF0sIG14WzFdLCBtblsyXV0sXG4gICAgICAgICAgICBbbW5bMF0sIG1uWzFdLCBteFsyXV0sXG4gICAgICAgICAgICBbbXhbMF0sIG1uWzFdLCBteFsyXV0sXG4gICAgICAgICAgICBbbXhbMF0sIG14WzFdLCBteFsyXV0sXG4gICAgICAgICAgICBbbW5bMF0sIG14WzFdLCBteFsyXV0sXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybXMgYSBmcnVzdHVtLWFhYmIgaW50ZXJzZWN0aW9uIHRlc3QuIFJldHVybnMgMCBpZiB0aGVyZSdzIG5vIGludGVyc2VjdGlvbixcbiAgICAvLyAxIGlmIHNoYXBlcyBhcmUgaW50ZXJzZWN0aW5nIGFuZCAyIGlmIHRoZSBhYWJiIGlmIGZ1bGx5IGluc2lkZSB0aGUgZnJ1c3R1bS5cbiAgICBpbnRlcnNlY3RzKGZydXN0dW06IEZydXN0dW0pOiBudW1iZXIge1xuICAgICAgICAvLyBFeGVjdXRlIHNlcGFyYXRpbmcgYXhpcyB0ZXN0IGJldHdlZW4gdHdvIGNvbnZleCBvYmplY3RzIHRvIGZpbmQgaW50ZXJzZWN0aW9uc1xuICAgICAgICAvLyBFYWNoIGZydXN0dW0gcGxhbmUgdG9nZXRoZXIgd2l0aCAzIG1ham9yIGF4ZXMgZGVmaW5lIHRoZSBzZXBhcmF0aW5nIGF4ZXNcblxuICAgICAgICBjb25zdCBhYWJiUG9pbnRzID0gdGhpcy5nZXRDb3JuZXJzKCk7XG4gICAgICAgIGxldCBmdWxseUluc2lkZSA9IHRydWU7XG5cbiAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCBmcnVzdHVtLnBsYW5lcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgY29uc3QgcGxhbmUgPSBmcnVzdHVtLnBsYW5lc1twXTtcbiAgICAgICAgICAgIGxldCBwb2ludHNJbnNpZGUgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFhYmJQb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwb2ludHNJbnNpZGUgKz0gdmVjMy5kb3QocGxhbmUsIGFhYmJQb2ludHNbaV0pICsgcGxhbmVbM10gPj0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBvaW50c0luc2lkZSA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcblxuICAgICAgICAgICAgaWYgKHBvaW50c0luc2lkZSAhPT0gYWFiYlBvaW50cy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZnVsbHlJbnNpZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmdWxseUluc2lkZSlcbiAgICAgICAgICAgIHJldHVybiAyO1xuXG4gICAgICAgIGZvciAobGV0IGF4aXMgPSAwOyBheGlzIDwgMzsgYXhpcysrKSB7XG4gICAgICAgICAgICBsZXQgcHJvak1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgICAgICBsZXQgcHJvak1heCA9IC1OdW1iZXIuTUFYX1ZBTFVFO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IGZydXN0dW0ucG9pbnRzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkUG9pbnQgPSBmcnVzdHVtLnBvaW50c1twXVtheGlzXSAtIHRoaXMubWluW2F4aXNdO1xuXG4gICAgICAgICAgICAgICAgcHJvak1pbiA9IE1hdGgubWluKHByb2pNaW4sIHByb2plY3RlZFBvaW50KTtcbiAgICAgICAgICAgICAgICBwcm9qTWF4ID0gTWF0aC5tYXgocHJvak1heCwgcHJvamVjdGVkUG9pbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvak1heCA8IDAgfHwgcHJvak1pbiA+IHRoaXMubWF4W2F4aXNdIC0gdGhpcy5taW5bYXhpc10pXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG59XG5leHBvcnQge1xuICAgIEFhYmIsXG4gICAgRnJ1c3R1bSxcbiAgICBGcnVzdHVtQ29ybmVycyxcbiAgICBSYXlcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllci5qcyc7XG5cbmltcG9ydCBDaXJjbGVCdWNrZXQgZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldC5qcyc7XG5pbXBvcnQge3BvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRQb2ludH0gZnJvbSAnLi4vLi4vdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMuanMnO1xuaW1wb3J0IHtnZXRNYXhpbXVtUGFpbnRWYWx1ZSwgdHJhbnNsYXRlRGlzdGFuY2UsIHRpbGVzcGFjZVRyYW5zbGF0ZX0gZnJvbSAnLi4vcXVlcnlfdXRpbHMuanMnO1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9jaXJjbGVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge1RyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBMYXlvdXQsIFBvc3NpYmx5RXZhbHVhdGVkfSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7dmVjNCwgdmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBQcm9ncmFtQ29uZmlndXJhdGlvbiBmcm9tICcuLi8uLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQge1JheX0gZnJvbSAnLi4vLi4vdXRpbC9wcmltaXRpdmVzLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7bGF0RnJvbU1lcmNhdG9yWSwgbWVyY2F0b3JaZnJvbUFsdGl0dWRlfSBmcm9tICcuLi8uLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uLy4uL2RhdGEvZXh0ZW50LmpzJztcblxuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZX0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtCdWNrZXQsIEJ1Y2tldFBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIHtMYXlvdXRQcm9wcywgUGFpbnRQcm9wc30gZnJvbSAnLi9jaXJjbGVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlc3BhY2VRdWVyeUdlb21ldHJ5fSBmcm9tICcuLi9xdWVyeV9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgdHlwZSB7REVNU2FtcGxlcn0gZnJvbSAnLi4vLi4vdGVycmFpbi9lbGV2YXRpb24uanMnO1xuXG5jbGFzcyBDaXJjbGVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3VuZXZhbHVhdGVkTGF5b3V0OiBMYXlvdXQ8TGF5b3V0UHJvcHM+O1xuICAgIGxheW91dDogUG9zc2libHlFdmFsdWF0ZWQ8TGF5b3V0UHJvcHM+O1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8Kj4pOiBDaXJjbGVCdWNrZXQ8Q2lyY2xlU3R5bGVMYXllcj4ge1xuICAgICAgICByZXR1cm4gbmV3IENpcmNsZUJ1Y2tldChwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBxdWVyeVJhZGl1cyhidWNrZXQ6IEJ1Y2tldCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNpcmNsZUJ1Y2tldDogQ2lyY2xlQnVja2V0PENpcmNsZVN0eWxlTGF5ZXI+ID0gKGJ1Y2tldDogYW55KTtcbiAgICAgICAgcmV0dXJuIGdldE1heGltdW1QYWludFZhbHVlKCdjaXJjbGUtcmFkaXVzJywgdGhpcywgY2lyY2xlQnVja2V0KSArXG4gICAgICAgICAgICBnZXRNYXhpbXVtUGFpbnRWYWx1ZSgnY2lyY2xlLXN0cm9rZS13aWR0aCcsIHRoaXMsIGNpcmNsZUJ1Y2tldCkgK1xuICAgICAgICAgICAgdHJhbnNsYXRlRGlzdGFuY2UodGhpcy5wYWludC5nZXQoJ2NpcmNsZS10cmFuc2xhdGUnKSk7XG4gICAgfVxuXG4gICAgcXVlcnlJbnRlcnNlY3RzRmVhdHVyZShxdWVyeUdlb21ldHJ5OiBUaWxlc3BhY2VRdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxldmF0aW9uSGVscGVyOiA/REVNU2FtcGxlcik6IGJvb2xlYW4ge1xuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGlsZXNwYWNlVHJhbnNsYXRlKFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2NpcmNsZS10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtdHJhbnNsYXRlLWFuY2hvcicpLFxuICAgICAgICAgICAgdHJhbnNmb3JtLmFuZ2xlLCBxdWVyeUdlb21ldHJ5LnBpeGVsVG9UaWxlVW5pdHNGYWN0b3IpO1xuXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnBhaW50LmdldCgnY2lyY2xlLXJhZGl1cycpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSkgK1xuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2NpcmNsZS1zdHJva2Utd2lkdGgnKS5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuXG4gICAgICAgIHJldHVybiBxdWVyeUludGVyc2VjdHNDaXJjbGUocXVlcnlHZW9tZXRyeSwgZ2VvbWV0cnksIHRyYW5zZm9ybSwgcGl4ZWxQb3NNYXRyaXgsIGVsZXZhdGlvbkhlbHBlcixcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdjaXJjbGUtcGl0Y2gtYWxpZ25tZW50JykgPT09ICdtYXAnLFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1zY2FsZScpID09PSAnbWFwJywgdHJhbnNsYXRpb24sIHNpemUpO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1JZHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBbJ2NpcmNsZSddO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1Db25maWd1cmF0aW9uKHpvb206IG51bWJlcik6IFByb2dyYW1Db25maWd1cmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvbih0aGlzLCB6b29tKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeUludGVyc2VjdHNDaXJjbGUocXVlcnlHZW9tZXRyeTogVGlsZXNwYWNlUXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFBvc01hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICBlbGV2YXRpb25IZWxwZXI6ID9ERU1TYW1wbGVyLFxuICAgICAgICAgICAgICAgICAgICAgICBhbGlnbldpdGhNYXA6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgIHNjYWxlV2l0aE1hcDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb246IFBvaW50LFxuICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoYWxpZ25XaXRoTWFwICYmIHF1ZXJ5R2VvbWV0cnkucXVlcnlHZW9tZXRyeS5pc0Fib3ZlSG9yaXpvbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gRm9yIHBpdGNoLWFsaWdubWVudDogbWFwLCBjb21wYXJlIGZlYXR1cmUgZ2VvbWV0cnkgdG8gcXVlcnkgZ2VvbWV0cnkgaW4gdGhlIHBsYW5lIG9mIHRoZSB0aWxlXG4gICAgLy8gLy8gT3RoZXJ3aXNlLCBjb21wYXJlIGdlb21ldHJ5IGluIHRoZSBwbGFuZSBvZiB0aGUgdmlld3BvcnRcbiAgICAvLyAvLyBBIGNpcmNsZSB3aXRoIGZpeGVkIHNjYWxpbmcgcmVsYXRpdmUgdG8gdGhlIHZpZXdwb3J0IGdldHMgbGFyZ2VyIGluIHRpbGUgc3BhY2UgYXMgaXQgbW92ZXMgaW50byB0aGUgZGlzdGFuY2VcbiAgICAvLyAvLyBBIGNpcmNsZSB3aXRoIGZpeGVkIHNjYWxpbmcgcmVsYXRpdmUgdG8gdGhlIG1hcCBnZXRzIHNtYWxsZXIgaW4gdmlld3BvcnQgc3BhY2UgYXMgaXQgbW92ZXMgaW50byB0aGUgZGlzdGFuY2VcbiAgICBpZiAoYWxpZ25XaXRoTWFwKSBzaXplICo9IHF1ZXJ5R2VvbWV0cnkucGl4ZWxUb1RpbGVVbml0c0ZhY3RvcjtcblxuICAgIGNvbnN0IHRpbGVJZCA9IHF1ZXJ5R2VvbWV0cnkudGlsZUlELmNhbm9uaWNhbDtcbiAgICBjb25zdCBlbGV2YXRpb25TY2FsZSA9IHRyYW5zZm9ybS5wcm9qZWN0aW9uLnVwVmVjdG9yU2NhbGUodGlsZUlkLCB0cmFuc2Zvcm0uY2VudGVyLmxhdCwgdHJhbnNmb3JtLndvcmxkU2l6ZSkubWV0ZXJzVG9UaWxlO1xuXG4gICAgZm9yIChjb25zdCByaW5nIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcmluZykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZFBvaW50ID0gcG9pbnQuYWRkKHRyYW5zbGF0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IHogPSAoZWxldmF0aW9uSGVscGVyICYmIHRyYW5zZm9ybS5lbGV2YXRpb24pID9cbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm0uZWxldmF0aW9uLmV4YWdnZXJhdGlvbigpICogZWxldmF0aW9uSGVscGVyLmdldEVsZXZhdGlvbkF0KHRyYW5zbGF0ZWRQb2ludC54LCB0cmFuc2xhdGVkUG9pbnQueSwgdHJ1ZSkgOlxuICAgICAgICAgICAgICAgIDA7XG5cbiAgICAgICAgICAgIC8vIFJlcHJvamVjdCB0aWxlIGNvb3JkaW5hdGUgdG8gdGhlIGxvY2FsIGNvb3JkaW5hdGUgc3BhY2UgdXNlZCBieSB0aGUgcHJvamVjdGlvblxuICAgICAgICAgICAgY29uc3QgcmVwcm9qID0gdHJhbnNmb3JtLnByb2plY3Rpb24ucHJvamVjdFRpbGVQb2ludCh0cmFuc2xhdGVkUG9pbnQueCwgdHJhbnNsYXRlZFBvaW50LnksIHRpbGVJZCk7XG5cbiAgICAgICAgICAgIGlmICh6ID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpciA9IHRyYW5zZm9ybS5wcm9qZWN0aW9uLnVwVmVjdG9yKHRpbGVJZCwgdHJhbnNsYXRlZFBvaW50LngsIHRyYW5zbGF0ZWRQb2ludC55KTtcbiAgICAgICAgICAgICAgICByZXByb2oueCArPSBkaXJbMF0gKiBlbGV2YXRpb25TY2FsZSAqIHo7XG4gICAgICAgICAgICAgICAgcmVwcm9qLnkgKz0gZGlyWzFdICogZWxldmF0aW9uU2NhbGUgKiB6O1xuICAgICAgICAgICAgICAgIHJlcHJvai56ICs9IGRpclsyXSAqIGVsZXZhdGlvblNjYWxlICogejtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRQb2ludCA9IGFsaWduV2l0aE1hcCA/IHRyYW5zbGF0ZWRQb2ludCA6IHByb2plY3RQb2ludChyZXByb2oueCwgcmVwcm9qLnksIHJlcHJvai56LCBwaXhlbFBvc01hdHJpeCk7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFBvbHlnb24gPSBhbGlnbldpdGhNYXAgP1xuICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnkudGlsZXNwYWNlUmF5cy5tYXAoKHIpID0+IGludGVyc2VjdEF0SGVpZ2h0KHIsIHopKSA6XG4gICAgICAgICAgICAgICAgcXVlcnlHZW9tZXRyeS5xdWVyeUdlb21ldHJ5LnNjcmVlbkdlb21ldHJ5O1xuXG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0ZWRDZW50ZXIgPSB2ZWM0LnRyYW5zZm9ybU1hdDQoW10sIFtyZXByb2oueCwgcmVwcm9qLnksIHJlcHJvai56LCAxXSwgcGl4ZWxQb3NNYXRyaXgpO1xuICAgICAgICAgICAgaWYgKCFzY2FsZVdpdGhNYXAgJiYgYWxpZ25XaXRoTWFwKSB7XG4gICAgICAgICAgICAgICAgc2l6ZSAqPSBwcm9qZWN0ZWRDZW50ZXJbM10gLyB0cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NhbGVXaXRoTWFwICYmICFhbGlnbldpdGhNYXApIHtcbiAgICAgICAgICAgICAgICBzaXplICo9IHRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlIC8gcHJvamVjdGVkQ2VudGVyWzNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWxpZ25XaXRoTWFwKSB7XG4gICAgICAgICAgICAgICAgLy8gQXBwbHkgZXh0cmEgc2NhbGluZyB0byBjb3ZlciBkaWZmZXJlbnQgcGl4ZWxQZXJNZXRlciByYXRpb3MgYXQgZGlmZmVyZW50IGxhdGl0dWRlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhdCA9IGxhdEZyb21NZXJjYXRvclkoKHBvaW50LnkgLyBFWFRFTlQgKyB0aWxlSWQueSkgLyAoMSA8PCB0aWxlSWQueikpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdHJhbnNmb3JtLnByb2plY3Rpb24ucGl4ZWxzUGVyTWV0ZXIobGF0LCAxKSAvIG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCBsYXQpO1xuXG4gICAgICAgICAgICAgICAgc2l6ZSAvPSBzY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRQb2ludCh0cmFuc2Zvcm1lZFBvbHlnb24sIHRyYW5zZm9ybWVkUG9pbnQsIHNpemUpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50KHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIsIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXkpIHtcbiAgICBjb25zdCBwb2ludCA9IHZlYzQudHJhbnNmb3JtTWF0NChbXSwgW3gsIHksIHosIDFdLCBwaXhlbFBvc01hdHJpeCk7XG4gICAgcmV0dXJuIG5ldyBQb2ludChwb2ludFswXSAvIHBvaW50WzNdLCBwb2ludFsxXSAvIHBvaW50WzNdKTtcbn1cblxuY29uc3Qgb3JpZ2luID0gdmVjMy5mcm9tVmFsdWVzKDAsIDAsIDApO1xuY29uc3QgdXAgPSB2ZWMzLmZyb21WYWx1ZXMoMCwgMCwgMSk7XG5cbmZ1bmN0aW9uIGludGVyc2VjdEF0SGVpZ2h0KHI6IFJheSwgejogbnVtYmVyKTogUG9pbnQge1xuICAgIGNvbnN0IGludGVyc2VjdGlvblB0ID0gdmVjMy5jcmVhdGUoKTtcbiAgICBvcmlnaW5bMl0gPSB6O1xuICAgIGNvbnN0IGludGVyc2VjdHMgPSByLmludGVyc2VjdHNQbGFuZShvcmlnaW4sIHVwLCBpbnRlcnNlY3Rpb25QdCk7XG4gICAgYXNzZXJ0KGludGVyc2VjdHMsICd0aWxlc3BhY2VQb2ludCBzaG91bGQgYWx3YXlzIGJlIGJlbG93IGhvcml6b24sIGFuZCBzaW5jZSBjYW1lcmEgY2Fubm90IGhhdmUgcGl0Y2ggPjkwLCByYXkgc2hvdWxkIGFsd2F5cyBpbnRlcnNlY3QnKTtcblxuICAgIHJldHVybiBuZXcgUG9pbnQoaW50ZXJzZWN0aW9uUHRbMF0sIGludGVyc2VjdGlvblB0WzFdKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2lyY2xlU3R5bGVMYXllcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDaXJjbGVCdWNrZXQgZnJvbSAnLi9jaXJjbGVfYnVja2V0LmpzJztcblxuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcblxuaW1wb3J0IHR5cGUgSGVhdG1hcFN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvaGVhdG1hcF9zdHlsZV9sYXllci5qcyc7XG5cbmNsYXNzIEhlYXRtYXBCdWNrZXQgZXh0ZW5kcyBDaXJjbGVCdWNrZXQ8SGVhdG1hcFN0eWxlTGF5ZXI+IHtcbiAgICAvLyBOZWVkZWQgZm9yIGZsb3cgdG8gYWNjZXB0IG9taXQ6IFsnbGF5ZXJzJ10gYmVsb3csIGR1ZSB0b1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy80MjYyXG4gICAgbGF5ZXJzOiBBcnJheTxIZWF0bWFwU3R5bGVMYXllcj47XG59XG5cbnJlZ2lzdGVyKEhlYXRtYXBCdWNrZXQsICdIZWF0bWFwQnVja2V0Jywge29taXQ6IFsnbGF5ZXJzJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgSGVhdG1hcEJ1Y2tldDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcblxuZXhwb3J0IHR5cGUgU2l6ZSA9IHtcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFNwcml0ZVBvc2l0aW9uIHtcbiAgICArdGw6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgK2JyOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICtwaXhlbFJhdGlvPzogbnVtYmVyXG59XG5leHBvcnQgdHlwZSBTcHJpdGVQb3NpdGlvbnMgPSB7W186IHN0cmluZ106IFNwcml0ZVBvc2l0aW9ufTtcblxudHlwZSBQb2ludCA9IHtcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVJbWFnZTxUOiBBbHBoYUltYWdlIHwgUkdCQUltYWdlPihpbWFnZTogVCwge3dpZHRoLCBoZWlnaHR9OiBTaXplLCBjaGFubmVsczogbnVtYmVyLCBkYXRhPzogVWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5KTogVCB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIGRhdGEgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIGNoYW5uZWxzKTtcbiAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSkge1xuICAgICAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIpO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5sZW5ndGggIT09IHdpZHRoICogaGVpZ2h0ICogY2hhbm5lbHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ21pc21hdGNoZWQgaW1hZ2Ugc2l6ZScpO1xuICAgIH1cbiAgICBpbWFnZS53aWR0aCA9IHdpZHRoO1xuICAgIGltYWdlLmhlaWdodCA9IGhlaWdodDtcbiAgICBpbWFnZS5kYXRhID0gZGF0YTtcbiAgICByZXR1cm4gaW1hZ2U7XG59XG5cbmZ1bmN0aW9uIHJlc2l6ZUltYWdlPFQ6IEFscGhhSW1hZ2UgfCBSR0JBSW1hZ2U+KGltYWdlOiBULCBuZXdJbWFnZTogVCwgY2hhbm5lbHM6IG51bWJlcikge1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IG5ld0ltYWdlO1xuICAgIGlmICh3aWR0aCA9PT0gaW1hZ2Uud2lkdGggJiYgaGVpZ2h0ID09PSBpbWFnZS5oZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvcHlJbWFnZShpbWFnZSwgbmV3SW1hZ2UsIHt4OiAwLCB5OiAwfSwge3g6IDAsIHk6IDB9LCB7XG4gICAgICAgIHdpZHRoOiBNYXRoLm1pbihpbWFnZS53aWR0aCwgd2lkdGgpLFxuICAgICAgICBoZWlnaHQ6IE1hdGgubWluKGltYWdlLmhlaWdodCwgaGVpZ2h0KVxuICAgIH0sIGNoYW5uZWxzKTtcblxuICAgIGltYWdlLndpZHRoID0gd2lkdGg7XG4gICAgaW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGltYWdlLmRhdGEgPSBuZXdJbWFnZS5kYXRhO1xufVxuXG5mdW5jdGlvbiBjb3B5SW1hZ2U8VDogUkdCQUltYWdlIHwgQWxwaGFJbWFnZT4oc3JjSW1nOiBUIHwgSW1hZ2VEYXRhLCBkc3RJbWc6IFQsIHNyY1B0OiBQb2ludCwgZHN0UHQ6IFBvaW50LCBzaXplOiBTaXplLCBjaGFubmVsczogbnVtYmVyKTogVCB7XG4gICAgaWYgKHNpemUud2lkdGggPT09IDAgfHwgc2l6ZS5oZWlnaHQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGRzdEltZztcbiAgICB9XG5cbiAgICBpZiAoc2l6ZS53aWR0aCA+IHNyY0ltZy53aWR0aCB8fFxuICAgICAgICBzaXplLmhlaWdodCA+IHNyY0ltZy5oZWlnaHQgfHxcbiAgICAgICAgc3JjUHQueCA+IHNyY0ltZy53aWR0aCAtIHNpemUud2lkdGggfHxcbiAgICAgICAgc3JjUHQueSA+IHNyY0ltZy5oZWlnaHQgLSBzaXplLmhlaWdodCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIHNvdXJjZSBjb29yZGluYXRlcyBmb3IgaW1hZ2UgY29weScpO1xuICAgIH1cblxuICAgIGlmIChzaXplLndpZHRoID4gZHN0SW1nLndpZHRoIHx8XG4gICAgICAgIHNpemUuaGVpZ2h0ID4gZHN0SW1nLmhlaWdodCB8fFxuICAgICAgICBkc3RQdC54ID4gZHN0SW1nLndpZHRoIC0gc2l6ZS53aWR0aCB8fFxuICAgICAgICBkc3RQdC55ID4gZHN0SW1nLmhlaWdodCAtIHNpemUuaGVpZ2h0KSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgZGVzdGluYXRpb24gY29vcmRpbmF0ZXMgZm9yIGltYWdlIGNvcHknKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcmNEYXRhID0gc3JjSW1nLmRhdGE7XG4gICAgY29uc3QgZHN0RGF0YSA9IGRzdEltZy5kYXRhO1xuXG4gICAgYXNzZXJ0KHNyY0RhdGEgIT09IGRzdERhdGEpO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrKSB7XG4gICAgICAgIGNvbnN0IHNyY09mZnNldCA9ICgoc3JjUHQueSArIHkpICogc3JjSW1nLndpZHRoICsgc3JjUHQueCkgKiBjaGFubmVscztcbiAgICAgICAgY29uc3QgZHN0T2Zmc2V0ID0gKChkc3RQdC55ICsgeSkgKiBkc3RJbWcud2lkdGggKyBkc3RQdC54KSAqIGNoYW5uZWxzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemUud2lkdGggKiBjaGFubmVsczsgaSsrKSB7XG4gICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCArIGldID0gc3JjRGF0YVtzcmNPZmZzZXQgKyBpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZHN0SW1nO1xufVxuXG5leHBvcnQgY2xhc3MgQWxwaGFJbWFnZSB7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBkYXRhOiBVaW50OEFycmF5O1xuXG4gICAgY29uc3RydWN0b3Ioc2l6ZTogU2l6ZSwgZGF0YT86IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSkge1xuICAgICAgICBjcmVhdGVJbWFnZSh0aGlzLCBzaXplLCAxLCBkYXRhKTtcbiAgICB9XG5cbiAgICByZXNpemUoc2l6ZTogU2l6ZSkge1xuICAgICAgICByZXNpemVJbWFnZSh0aGlzLCBuZXcgQWxwaGFJbWFnZShzaXplKSwgMSk7XG4gICAgfVxuXG4gICAgY2xvbmUoKTogQWxwaGFJbWFnZSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxwaGFJbWFnZSh7d2lkdGg6IHRoaXMud2lkdGgsIGhlaWdodDogdGhpcy5oZWlnaHR9LCBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29weShzcmNJbWc6IEFscGhhSW1hZ2UsIGRzdEltZzogQWxwaGFJbWFnZSwgc3JjUHQ6IFBvaW50LCBkc3RQdDogUG9pbnQsIHNpemU6IFNpemUpIHtcbiAgICAgICAgY29weUltYWdlKHNyY0ltZywgZHN0SW1nLCBzcmNQdCwgZHN0UHQsIHNpemUsIDEpO1xuICAgIH1cbn1cblxuLy8gTm90IHByZW11bHRpcGxpZWQsIGJlY2F1c2UgSW1hZ2VEYXRhIGlzIG5vdCBwcmVtdWx0aXBsaWVkLlxuLy8gVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMIG11c3QgYmUgdXNlZCB3aGVuIHVwbG9hZGluZyB0byBhIHRleHR1cmUuXG5leHBvcnQgY2xhc3MgUkdCQUltYWdlIHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuXG4gICAgLy8gZGF0YSBtdXN0IGJlIGEgVWludDhBcnJheSBpbnN0ZWFkIG9mIFVpbnQ4Q2xhbXBlZEFycmF5IGJlY2F1c2UgdGV4SW1hZ2UyRCBkb2VzIG5vdFxuICAgIC8vIHN1cHBvcnQgVWludDhDbGFtcGVkQXJyYXkgaW4gYWxsIGJyb3dzZXJzXG4gICAgZGF0YTogVWludDhBcnJheTtcblxuICAgIGNvbnN0cnVjdG9yKHNpemU6IFNpemUsIGRhdGE/OiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXkpIHtcbiAgICAgICAgY3JlYXRlSW1hZ2UodGhpcywgc2l6ZSwgNCwgZGF0YSk7XG4gICAgfVxuXG4gICAgcmVzaXplKHNpemU6IFNpemUpIHtcbiAgICAgICAgcmVzaXplSW1hZ2UodGhpcywgbmV3IFJHQkFJbWFnZShzaXplKSwgNCk7XG4gICAgfVxuXG4gICAgcmVwbGFjZShkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXksIGNvcHk/OiBib29sZWFuKSB7XG4gICAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuc2V0KGRhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5idWZmZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsb25lKCk6IFJHQkFJbWFnZSB7XG4gICAgICAgIHJldHVybiBuZXcgUkdCQUltYWdlKHt3aWR0aDogdGhpcy53aWR0aCwgaGVpZ2h0OiB0aGlzLmhlaWdodH0sIG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YSkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb3B5KHNyY0ltZzogUkdCQUltYWdlIHwgSW1hZ2VEYXRhLCBkc3RJbWc6IFJHQkFJbWFnZSwgc3JjUHQ6IFBvaW50LCBkc3RQdDogUG9pbnQsIHNpemU6IFNpemUpIHtcbiAgICAgICAgY29weUltYWdlKHNyY0ltZywgZHN0SW1nLCBzcmNQdCwgZHN0UHQsIHNpemUsIDQpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoQWxwaGFJbWFnZSwgJ0FscGhhSW1hZ2UnKTtcbnJlZ2lzdGVyKFJHQkFJbWFnZSwgJ1JHQkFJbWFnZScpO1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuXG5leHBvcnQgdHlwZSBQYWludFByb3BzID0ge3xcbiAgICBcImhlYXRtYXAtcmFkaXVzXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaGVhdG1hcC13ZWlnaHRcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJoZWF0bWFwLWludGVuc2l0eVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaGVhdG1hcC1jb2xvclwiOiBDb2xvclJhbXBQcm9wZXJ0eSxcbiAgICBcImhlYXRtYXAtb3BhY2l0eVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiaGVhdG1hcC1yYWRpdXNcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oZWF0bWFwXCJdW1wiaGVhdG1hcC1yYWRpdXNcIl0pLFxuICAgIFwiaGVhdG1hcC13ZWlnaHRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oZWF0bWFwXCJdW1wiaGVhdG1hcC13ZWlnaHRcIl0pLFxuICAgIFwiaGVhdG1hcC1pbnRlbnNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLWludGVuc2l0eVwiXSksXG4gICAgXCJoZWF0bWFwLWNvbG9yXCI6IG5ldyBDb2xvclJhbXBQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oZWF0bWFwXCJdW1wiaGVhdG1hcC1jb2xvclwiXSksXG4gICAgXCJoZWF0bWFwLW9wYWNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hlYXRtYXBcIl1bXCJoZWF0bWFwLW9wYWNpdHlcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQgfTogJEV4YWN0PHtcbiAgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz5cbn0+KTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7UkdCQUltYWdlfSBmcm9tICcuL2ltYWdlLmpzJztcbmltcG9ydCB7aXNQb3dlck9mVHdvfSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eUV4cHJlc3Npb259IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5cbmV4cG9ydCB0eXBlIENvbG9yUmFtcFBhcmFtcyA9IHtcbiAgICBleHByZXNzaW9uOiBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbjtcbiAgICBldmFsdWF0aW9uS2V5OiBzdHJpbmc7XG4gICAgcmVzb2x1dGlvbj86IG51bWJlcjtcbiAgICBpbWFnZT86IFJHQkFJbWFnZTtcbiAgICBjbGlwcz86IEFycmF5PE9iamVjdD47XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gZXhwcmVzc2lvbiB0aGF0IHNob3VsZCBldmFsdWF0ZSB0byBhIGNvbG9yIHJhbXAsXG4gKiByZXR1cm4gYSBSR0JBIGltYWdlIHJlcHJlc2VudGluZyB0aGF0IHJhbXAgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29sb3JSYW1wKHBhcmFtczogQ29sb3JSYW1wUGFyYW1zKTogUkdCQUltYWdlIHtcbiAgICBjb25zdCBldmFsdWF0aW9uR2xvYmFscyA9IHt9O1xuICAgIGNvbnN0IHdpZHRoID0gcGFyYW1zLnJlc29sdXRpb24gfHwgMjU2O1xuICAgIGNvbnN0IGhlaWdodCA9IHBhcmFtcy5jbGlwcyA/IHBhcmFtcy5jbGlwcy5sZW5ndGggOiAxO1xuICAgIGNvbnN0IGltYWdlID0gcGFyYW1zLmltYWdlIHx8IG5ldyBSR0JBSW1hZ2Uoe3dpZHRoLCBoZWlnaHR9KTtcblxuICAgIGFzc2VydChpc1Bvd2VyT2ZUd28od2lkdGgpKTtcblxuICAgIGNvbnN0IHJlbmRlclBpeGVsID0gKHN0cmlkZSwgaW5kZXgsIHByb2dyZXNzKSA9PiB7XG4gICAgICAgIGV2YWx1YXRpb25HbG9iYWxzW3BhcmFtcy5ldmFsdWF0aW9uS2V5XSA9IHByb2dyZXNzO1xuICAgICAgICBjb25zdCBweENvbG9yID0gcGFyYW1zLmV4cHJlc3Npb24uZXZhbHVhdGUoKGV2YWx1YXRpb25HbG9iYWxzOiBhbnkpKTtcbiAgICAgICAgLy8gdGhlIGNvbG9ycyBhcmUgYmVpbmcgdW5wcmVtdWx0aXBsaWVkIGJlY2F1c2UgQ29sb3IgdXNlc1xuICAgICAgICAvLyBwcmVtdWx0aXBsaWVkIHZhbHVlcywgYW5kIHRoZSBUZXh0dXJlIGNsYXNzIGV4cGVjdHMgdW5wcmVtdWx0aXBsaWVkIG9uZXNcbiAgICAgICAgaW1hZ2UuZGF0YVtzdHJpZGUgKyBpbmRleCArIDBdID0gTWF0aC5mbG9vcihweENvbG9yLnIgKiAyNTUgLyBweENvbG9yLmEpO1xuICAgICAgICBpbWFnZS5kYXRhW3N0cmlkZSArIGluZGV4ICsgMV0gPSBNYXRoLmZsb29yKHB4Q29sb3IuZyAqIDI1NSAvIHB4Q29sb3IuYSk7XG4gICAgICAgIGltYWdlLmRhdGFbc3RyaWRlICsgaW5kZXggKyAyXSA9IE1hdGguZmxvb3IocHhDb2xvci5iICogMjU1IC8gcHhDb2xvci5hKTtcbiAgICAgICAgaW1hZ2UuZGF0YVtzdHJpZGUgKyBpbmRleCArIDNdID0gTWF0aC5mbG9vcihweENvbG9yLmEgKiAyNTUpO1xuICAgIH07XG5cbiAgICBpZiAoIXBhcmFtcy5jbGlwcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCB3aWR0aDsgaSsrLCBqICs9IDQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gaSAvICh3aWR0aCAtIDEpO1xuXG4gICAgICAgICAgICByZW5kZXJQaXhlbCgwLCBqLCBwcm9ncmVzcyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBjbGlwID0gMCwgc3RyaWRlID0gMDsgY2xpcCA8IGhlaWdodDsgKytjbGlwLCBzdHJpZGUgKz0gd2lkdGggKiA0KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IDA7IGkgPCB3aWR0aDsgaSsrLCBqICs9IDQpIHtcbiAgICAgICAgICAgICAgICAvLyBSZW1hcCBwcm9ncmVzcyBiZXR3ZWVuIGNsaXBzXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBpIC8gKHdpZHRoIC0gMSk7XG4gICAgICAgICAgICAgICAgY29uc3Qge3N0YXJ0LCBlbmR9ID0gcGFyYW1zLmNsaXBzW2NsaXBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRpb25Qcm9ncmVzcyA9IHN0YXJ0ICogKDEgLSBwcm9ncmVzcykgKyBlbmQgKiBwcm9ncmVzcztcbiAgICAgICAgICAgICAgICByZW5kZXJQaXhlbChzdHJpZGUsIGosIGV2YWx1YXRpb25Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW1hZ2U7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllci5qcyc7XG5cbmltcG9ydCBIZWF0bWFwQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L2hlYXRtYXBfYnVja2V0LmpzJztcbmltcG9ydCB7UkdCQUltYWdlfSBmcm9tICcuLi8uLi91dGlsL2ltYWdlLmpzJztcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vaGVhdG1hcF9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7cmVuZGVyQ29sb3JSYW1wfSBmcm9tICcuLi8uLi91dGlsL2NvbG9yX3JhbXAuanMnO1xuaW1wb3J0IHtUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWR9IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHtxdWVyeUludGVyc2VjdHNDaXJjbGV9IGZyb20gJy4vY2lyY2xlX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB7Z2V0TWF4aW11bVBhaW50VmFsdWV9IGZyb20gJy4uL3F1ZXJ5X3V0aWxzLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHR5cGUge0J1Y2tldCwgQnVja2V0UGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUgVGV4dHVyZSBmcm9tICcuLi8uLi9yZW5kZXIvdGV4dHVyZS5qcyc7XG5pbXBvcnQgdHlwZSBGcmFtZWJ1ZmZlciBmcm9tICcuLi8uLi9nbC9mcmFtZWJ1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7UGFpbnRQcm9wc30gZnJvbSAnLi9oZWF0bWFwX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgUHJvZ3JhbUNvbmZpZ3VyYXRpb24gZnJvbSAnLi4vLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHR5cGUge1RpbGVzcGFjZVF1ZXJ5R2VvbWV0cnl9IGZyb20gJy4uL3F1ZXJ5X2dlb21ldHJ5LmpzJztcbmltcG9ydCB0eXBlIHtERU1TYW1wbGVyfSBmcm9tICcuLi8uLi90ZXJyYWluL2VsZXZhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUgQ2lyY2xlQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L2NpcmNsZV9idWNrZXQuanMnO1xuXG5jbGFzcyBIZWF0bWFwU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuXG4gICAgaGVhdG1hcEZibzogP0ZyYW1lYnVmZmVyO1xuICAgIGNvbG9yUmFtcDogUkdCQUltYWdlO1xuICAgIGNvbG9yUmFtcFRleHR1cmU6ID9UZXh0dXJlO1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8Kj4pOiBIZWF0bWFwQnVja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBIZWF0bWFwQnVja2V0KHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSBjb2xvciByYW1wIHRleHR1cmUgaXMgZ2VuZXJhdGVkIGZvciBkZWZhdWx0IGhlYXRtYXAgY29sb3IgdG9vXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbG9yUmFtcCgpO1xuICAgIH1cblxuICAgIF9oYW5kbGVTcGVjaWFsUGFpbnRQcm9wZXJ0eVVwZGF0ZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdoZWF0bWFwLWNvbG9yJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlQ29sb3JSYW1wKCkge1xuICAgICAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5fdHJhbnNpdGlvbmFibGVQYWludC5fdmFsdWVzWydoZWF0bWFwLWNvbG9yJ10udmFsdWUuZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5jb2xvclJhbXAgPSByZW5kZXJDb2xvclJhbXAoe1xuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIGV2YWx1YXRpb25LZXk6ICdoZWF0bWFwRGVuc2l0eScsXG4gICAgICAgICAgICBpbWFnZTogdGhpcy5jb2xvclJhbXBcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29sb3JSYW1wVGV4dHVyZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmVzaXplKCkge1xuICAgICAgICBpZiAodGhpcy5oZWF0bWFwRmJvKSB7XG4gICAgICAgICAgICB0aGlzLmhlYXRtYXBGYm8uZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5oZWF0bWFwRmJvID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHF1ZXJ5UmFkaXVzKGJ1Y2tldDogQnVja2V0KTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGdldE1heGltdW1QYWludFZhbHVlKCdoZWF0bWFwLXJhZGl1cycsIHRoaXMsICgoYnVja2V0OiBhbnkpOiBDaXJjbGVCdWNrZXQ8Kj4pKTtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnk6IFRpbGVzcGFjZVF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbGV2YXRpb25IZWxwZXI6ID9ERU1TYW1wbGVyKTogYm9vbGVhbiB7XG5cbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucGFpbnQuZ2V0KCdoZWF0bWFwLXJhZGl1cycpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIHJldHVybiBxdWVyeUludGVyc2VjdHNDaXJjbGUoXG4gICAgICAgICAgICBxdWVyeUdlb21ldHJ5LCBnZW9tZXRyeSwgdHJhbnNmb3JtLCBwaXhlbFBvc01hdHJpeCwgZWxldmF0aW9uSGVscGVyLFxuICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSwgbmV3IFBvaW50KDAsIDApLCBzaXplKTtcbiAgICB9XG5cbiAgICBoYXNPZmZzY3JlZW5QYXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWludC5nZXQoJ2hlYXRtYXAtb3BhY2l0eScpICE9PSAwICYmIHRoaXMudmlzaWJpbGl0eSAhPT0gJ25vbmUnO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1JZHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBbJ2hlYXRtYXAnLCAnaGVhdG1hcFRleHR1cmUnXTtcbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtQ29uZmlndXJhdGlvbih6b29tOiBudW1iZXIpOiBQcm9ncmFtQ29uZmlndXJhdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb24odGhpcywgem9vbSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIZWF0bWFwU3R5bGVMYXllcjtcbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gQGZsb3dcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcblxuaW1wb3J0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBDb2xvclJhbXBQcm9wZXJ0eVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcblxuaW1wb3J0IHR5cGUgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvblwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PENvbG9yPixcbiAgICBcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Q29sb3I+LFxuICAgIFwiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJoaWxsc2hhZGUtaWxsdW1pbmF0aW9uLWRpcmVjdGlvblwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1kaXJlY3Rpb25cIl0pLFxuICAgIFwiaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1pbGx1bWluYXRpb24tYW5jaG9yXCJdKSxcbiAgICBcImhpbGxzaGFkZS1leGFnZ2VyYXRpb25cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1leGFnZ2VyYXRpb25cIl0pLFxuICAgIFwiaGlsbHNoYWRlLXNoYWRvdy1jb2xvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfaGlsbHNoYWRlXCJdW1wiaGlsbHNoYWRlLXNoYWRvdy1jb2xvclwiXSksXG4gICAgXCJoaWxsc2hhZGUtaGlnaGxpZ2h0LWNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9oaWxsc2hhZGVcIl1bXCJoaWxsc2hhZGUtaGlnaGxpZ2h0LWNvbG9yXCJdKSxcbiAgICBcImhpbGxzaGFkZS1hY2NlbnQtY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2hpbGxzaGFkZVwiXVtcImhpbGxzaGFkZS1hY2NlbnQtY29sb3JcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQgfTogJEV4YWN0PHtcbiAgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz5cbn0+KTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyLmpzJztcblxuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9oaWxsc2hhZGVfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge1RyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZH0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtQYWludFByb3BzfSBmcm9tICcuL2hpbGxzaGFkZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuXG5jbGFzcyBIaWxsc2hhZGVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgaGFzT2Zmc2NyZWVuUGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFpbnQuZ2V0KCdoaWxsc2hhZGUtZXhhZ2dlcmF0aW9uJykgIT09IDAgJiYgdGhpcy52aXNpYmlsaXR5ICE9PSAnbm9uZSc7XG4gICAgfVxuXG4gICAgZ2V0UHJvZ3JhbUlkcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIFsnaGlsbHNoYWRlJywgJ2hpbGxzaGFkZVByZXBhcmUnXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhpbGxzaGFkZVN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtjcmVhdGVMYXlvdXR9IGZyb20gJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcblxuaW1wb3J0IHR5cGUge1N0cnVjdEFycmF5TGF5b3V0fSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmNvbnN0IGxheW91dDogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3MnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfVxuXSwgNCk7XG5cbmV4cG9ydCBkZWZhdWx0IGxheW91dDtcbmV4cG9ydCBjb25zdCB7bWVtYmVycywgc2l6ZSwgYWxpZ25tZW50fSA9IGxheW91dDtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBlYXJjdXQ7XG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gZWFyY3V0O1xuXG5mdW5jdGlvbiBlYXJjdXQoZGF0YSwgaG9sZUluZGljZXMsIGRpbSkge1xuXG4gICAgZGltID0gZGltIHx8IDI7XG5cbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsXG4gICAgICAgIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoLFxuICAgICAgICBvdXRlck5vZGUgPSBsaW5rZWRMaXN0KGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUpLFxuICAgICAgICB0cmlhbmdsZXMgPSBbXTtcblxuICAgIGlmICghb3V0ZXJOb2RlIHx8IG91dGVyTm9kZS5uZXh0ID09PSBvdXRlck5vZGUucHJldikgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgaW52U2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgaW52U2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgICAgIGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuICAgIH1cblxuICAgIGVhcmN1dExpbmtlZChvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHJldHVybiB0cmlhbmdsZXM7XG59XG5cbi8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlclxuZnVuY3Rpb24gbGlua2VkTGlzdChkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSkge1xuICAgIHZhciBpLCBsYXN0O1xuXG4gICAgaWYgKGNsb2Nrd2lzZSA9PT0gKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSA+IDApKSB7XG4gICAgICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaSA9IGVuZCAtIGRpbTsgaSA+PSBzdGFydDsgaSAtPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9XG5cbiAgICBpZiAobGFzdCAmJiBlcXVhbHMobGFzdCwgbGFzdC5uZXh0KSkge1xuICAgICAgICByZW1vdmVOb2RlKGxhc3QpO1xuICAgICAgICBsYXN0ID0gbGFzdC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBsYXN0O1xufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoIXN0YXJ0KSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKCFlbmQpIGVuZCA9IHN0YXJ0O1xuXG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgYWdhaW47XG4gICAgZG8ge1xuICAgICAgICBhZ2FpbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghcC5zdGVpbmVyICYmIChlcXVhbHMocCwgcC5uZXh0KSB8fCBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA9PT0gMCkpIHtcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICBwID0gZW5kID0gcC5wcmV2O1xuICAgICAgICAgICAgaWYgKHAgPT09IHAubmV4dCkgYnJlYWs7XG4gICAgICAgICAgICBhZ2FpbiA9IHRydWU7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAgPSBwLm5leHQ7XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChhZ2FpbiB8fCBwICE9PSBlbmQpO1xuXG4gICAgcmV0dXJuIGVuZDtcbn1cblxuLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpXG5mdW5jdGlvbiBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcykge1xuICAgIGlmICghZWFyKSByZXR1cm47XG5cbiAgICAvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG4gICAgaWYgKCFwYXNzICYmIGludlNpemUpIGluZGV4Q3VydmUoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcblxuICAgIHZhciBzdG9wID0gZWFyLFxuICAgICAgICBwcmV2LCBuZXh0O1xuXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG4gICAgd2hpbGUgKGVhci5wcmV2ICE9PSBlYXIubmV4dCkge1xuICAgICAgICBwcmV2ID0gZWFyLnByZXY7XG4gICAgICAgIG5leHQgPSBlYXIubmV4dDtcblxuICAgICAgICBpZiAoaW52U2l6ZSA/IGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSkgOiBpc0VhcihlYXIpKSB7XG4gICAgICAgICAgICAvLyBjdXQgb2ZmIHRoZSB0cmlhbmdsZVxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocHJldi5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGVhci5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKG5leHQuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIHJlbW92ZU5vZGUoZWFyKTtcblxuICAgICAgICAgICAgLy8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGV4IGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMik7XG5cbiAgICAgICAgICAgIC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuZnVuY3Rpb24gaXNFYXIoZWFyKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcbiAgICB2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gZWFyLnByZXYpIHtcbiAgICAgICAgaWYgKHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcbiAgICB2YXIgbWluVFggPSBhLnggPCBiLnggPyAoYS54IDwgYy54ID8gYS54IDogYy54KSA6IChiLnggPCBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtaW5UWSA9IGEueSA8IGIueSA/IChhLnkgPCBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA8IGMueSA/IGIueSA6IGMueSksXG4gICAgICAgIG1heFRYID0gYS54ID4gYi54ID8gKGEueCA+IGMueCA/IGEueCA6IGMueCkgOiAoYi54ID4gYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWF4VFkgPSBhLnkgPiBiLnkgPyAoYS55ID4gYy55ID8gYS55IDogYy55KSA6IChiLnkgPiBjLnkgPyBiLnkgOiBjLnkpO1xuXG4gICAgLy8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcbiAgICB2YXIgbWluWiA9IHpPcmRlcihtaW5UWCwgbWluVFksIG1pblgsIG1pblksIGludlNpemUpLFxuICAgICAgICBtYXhaID0gek9yZGVyKG1heFRYLCBtYXhUWSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG5cbiAgICB2YXIgcCA9IGVhci5wcmV2WixcbiAgICAgICAgbiA9IGVhci5uZXh0WjtcblxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGJvdGggZGlyZWN0aW9uc1xuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aICYmIG4gJiYgbi56IDw9IG1heFopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuXG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICAvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGluY3JlYXNpbmcgei1vcmRlclxuICAgIHdoaWxlIChuICYmIG4ueiA8PSBtYXhaKSB7XG4gICAgICAgIGlmIChuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55KSAmJlxuICAgICAgICAgICAgYXJlYShuLnByZXYsIG4sIG4ubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBuID0gbi5uZXh0WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGZpbHRlclBvaW50cyhwKTtcbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSkge1xuICAgIC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG4gICAgdmFyIGEgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBiID0gYS5uZXh0Lm5leHQ7XG4gICAgICAgIHdoaWxlIChiICE9PSBhLnByZXYpIHtcbiAgICAgICAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG4gICAgICAgICAgICAgICAgdmFyIGMgPSBzcGxpdFBvbHlnb24oYSwgYik7XG5cbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xuICAgICAgICAgICAgICAgIGEgPSBmaWx0ZXJQb2ludHMoYSwgYS5uZXh0KTtcbiAgICAgICAgICAgICAgICBjID0gZmlsdGVyUG9pbnRzKGMsIGMubmV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBydW4gZWFyY3V0IG9uIGVhY2ggaGFsZlxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiID0gYi5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhLm5leHQ7XG4gICAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpO1xufVxuXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pIHtcbiAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGlzdCA9IGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSk7XG4gICAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7XG4gICAgICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNvcnQoY29tcGFyZVgpO1xuXG4gICAgLy8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcbiAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0ZXJOb2RlID0gZWxpbWluYXRlSG9sZShxdWV1ZVtpXSwgb3V0ZXJOb2RlKTtcbiAgICAgICAgb3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRlck5vZGU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKGEsIGIpIHtcbiAgICByZXR1cm4gYS54IC0gYi54O1xufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgdmFyIGJyaWRnZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7XG4gICAgaWYgKCFicmlkZ2UpIHtcbiAgICAgICAgcmV0dXJuIG91dGVyTm9kZTtcbiAgICB9XG5cbiAgICB2YXIgYnJpZGdlUmV2ZXJzZSA9IHNwbGl0UG9seWdvbihicmlkZ2UsIGhvbGUpO1xuXG4gICAgLy8gZmlsdGVyIGNvbGxpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG4gICAgdmFyIGZpbHRlcmVkQnJpZGdlID0gZmlsdGVyUG9pbnRzKGJyaWRnZSwgYnJpZGdlLm5leHQpO1xuICAgIGZpbHRlclBvaW50cyhicmlkZ2VSZXZlcnNlLCBicmlkZ2VSZXZlcnNlLm5leHQpO1xuXG4gICAgLy8gQ2hlY2sgaWYgaW5wdXQgbm9kZSB3YXMgcmVtb3ZlZCBieSB0aGUgZmlsdGVyaW5nXG4gICAgcmV0dXJuIG91dGVyTm9kZSA9PT0gYnJpZGdlID8gZmlsdGVyZWRCcmlkZ2UgOiBvdXRlck5vZGU7XG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIHZhciBwID0gb3V0ZXJOb2RlLFxuICAgICAgICBoeCA9IGhvbGUueCxcbiAgICAgICAgaHkgPSBob2xlLnksXG4gICAgICAgIHF4ID0gLUluZmluaXR5LFxuICAgICAgICBtO1xuXG4gICAgLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xuICAgIC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcbiAgICBkbyB7XG4gICAgICAgIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkgJiYgcC5uZXh0LnkgIT09IHAueSkge1xuICAgICAgICAgICAgdmFyIHggPSBwLnggKyAoaHkgLSBwLnkpICogKHAubmV4dC54IC0gcC54KSAvIChwLm5leHQueSAtIHAueSk7XG4gICAgICAgICAgICBpZiAoeCA8PSBoeCAmJiB4ID4gcXgpIHtcbiAgICAgICAgICAgICAgICBxeCA9IHg7XG4gICAgICAgICAgICAgICAgaWYgKHggPT09IGh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC55KSByZXR1cm4gcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5ID09PSBwLm5leHQueSkgcmV0dXJuIHAubmV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IG91dGVyTm9kZSk7XG5cbiAgICBpZiAoIW0pIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGh4ID09PSBxeCkgcmV0dXJuIG07IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxlZnRtb3N0IGVuZHBvaW50XG5cbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XG4gICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuICAgIHZhciBzdG9wID0gbSxcbiAgICAgICAgbXggPSBtLngsXG4gICAgICAgIG15ID0gbS55LFxuICAgICAgICB0YW5NaW4gPSBJbmZpbml0eSxcbiAgICAgICAgdGFuO1xuXG4gICAgcCA9IG07XG5cbiAgICBkbyB7XG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiZcbiAgICAgICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkpKSB7XG5cbiAgICAgICAgICAgIHRhbiA9IE1hdGguYWJzKGh5IC0gcC55KSAvIChoeCAtIHAueCk7IC8vIHRhbmdlbnRpYWxcblxuICAgICAgICAgICAgaWYgKGxvY2FsbHlJbnNpZGUocCwgaG9sZSkgJiZcbiAgICAgICAgICAgICAgICAodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiAocC54ID4gbS54IHx8IChwLnggPT09IG0ueCAmJiBzZWN0b3JDb250YWluc1NlY3RvcihtLCBwKSkpKSkpIHtcbiAgICAgICAgICAgICAgICBtID0gcDtcbiAgICAgICAgICAgICAgICB0YW5NaW4gPSB0YW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0b3ApO1xuXG4gICAgcmV0dXJuIG07XG59XG5cbi8vIHdoZXRoZXIgc2VjdG9yIGluIHZlcnRleCBtIGNvbnRhaW5zIHNlY3RvciBpbiB2ZXJ0ZXggcCBpbiB0aGUgc2FtZSBjb29yZGluYXRlc1xuZnVuY3Rpb24gc2VjdG9yQ29udGFpbnNTZWN0b3IobSwgcCkge1xuICAgIHJldHVybiBhcmVhKG0ucHJldiwgbSwgcC5wcmV2KSA8IDAgJiYgYXJlYShwLm5leHQsIG0sIG0ubmV4dCkgPCAwO1xufVxuXG4vLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG5mdW5jdGlvbiBpbmRleEN1cnZlKHN0YXJ0LCBtaW5YLCBtaW5ZLCBpbnZTaXplKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnogPT09IG51bGwpIHAueiA9IHpPcmRlcihwLngsIHAueSwgbWluWCwgbWluWSwgaW52U2l6ZSk7XG4gICAgICAgIHAucHJldlogPSBwLnByZXY7XG4gICAgICAgIHAubmV4dFogPSBwLm5leHQ7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcC5wcmV2Wi5uZXh0WiA9IG51bGw7XG4gICAgcC5wcmV2WiA9IG51bGw7XG5cbiAgICBzb3J0TGlua2VkKHApO1xufVxuXG4vLyBTaW1vbiBUYXRoYW0ncyBsaW5rZWQgbGlzdCBtZXJnZSBzb3J0IGFsZ29yaXRobVxuLy8gaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrL35zZ3RhdGhhbS9hbGdvcml0aG1zL2xpc3Rzb3J0Lmh0bWxcbmZ1bmN0aW9uIHNvcnRMaW5rZWQobGlzdCkge1xuICAgIHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSxcbiAgICAgICAgaW5TaXplID0gMTtcblxuICAgIGRvIHtcbiAgICAgICAgcCA9IGxpc3Q7XG4gICAgICAgIGxpc3QgPSBudWxsO1xuICAgICAgICB0YWlsID0gbnVsbDtcbiAgICAgICAgbnVtTWVyZ2VzID0gMDtcblxuICAgICAgICB3aGlsZSAocCkge1xuICAgICAgICAgICAgbnVtTWVyZ2VzKys7XG4gICAgICAgICAgICBxID0gcDtcbiAgICAgICAgICAgIHBTaXplID0gMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpblNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIHBTaXplKys7XG4gICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgaWYgKCFxKSBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHFTaXplID0gaW5TaXplO1xuXG4gICAgICAgICAgICB3aGlsZSAocFNpemUgPiAwIHx8IChxU2l6ZSA+IDAgJiYgcSkpIHtcblxuICAgICAgICAgICAgICAgIGlmIChwU2l6ZSAhPT0gMCAmJiAocVNpemUgPT09IDAgfHwgIXEgfHwgcC56IDw9IHEueikpIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHA7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBwU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xuICAgICAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcVNpemUtLTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGFpbCkgdGFpbC5uZXh0WiA9IGU7XG4gICAgICAgICAgICAgICAgZWxzZSBsaXN0ID0gZTtcblxuICAgICAgICAgICAgICAgIGUucHJldlogPSB0YWlsO1xuICAgICAgICAgICAgICAgIHRhaWwgPSBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwID0gcTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWwubmV4dFogPSBudWxsO1xuICAgICAgICBpblNpemUgKj0gMjtcblxuICAgIH0gd2hpbGUgKG51bU1lcmdlcyA+IDEpO1xuXG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIHotb3JkZXIgb2YgYSBwb2ludCBnaXZlbiBjb29yZHMgYW5kIGludmVyc2Ugb2YgdGhlIGxvbmdlciBzaWRlIG9mIGRhdGEgYmJveFxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIGludlNpemUpIHtcbiAgICAvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG4gICAgeCA9IDMyNzY3ICogKHggLSBtaW5YKSAqIGludlNpemU7XG4gICAgeSA9IDMyNzY3ICogKHkgLSBtaW5ZKSAqIGludlNpemU7XG5cbiAgICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcbmZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnggPCBsZWZ0bW9zdC54IHx8IChwLnggPT09IGxlZnRtb3N0LnggJiYgcC55IDwgbGVmdG1vc3QueSkpIGxlZnRtb3N0ID0gcDtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gbGVmdG1vc3Q7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGVcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkpIHtcbiAgICByZXR1cm4gKGN4IC0gcHgpICogKGF5IC0gcHkpIC0gKGF4IC0gcHgpICogKGN5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGF4IC0gcHgpICogKGJ5IC0gcHkpIC0gKGJ4IC0gcHgpICogKGF5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGJ4IC0gcHgpICogKGN5IC0gcHkpIC0gKGN4IC0gcHgpICogKGJ5IC0gcHkpID49IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKGEsIGIpIHtcbiAgICByZXR1cm4gYS5uZXh0LmkgIT09IGIuaSAmJiBhLnByZXYuaSAhPT0gYi5pICYmICFpbnRlcnNlY3RzUG9seWdvbihhLCBiKSAmJiAvLyBkb25lcyd0IGludGVyc2VjdCBvdGhlciBlZGdlc1xuICAgICAgICAgICAobG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpICYmIG1pZGRsZUluc2lkZShhLCBiKSAmJiAvLyBsb2NhbGx5IHZpc2libGVcbiAgICAgICAgICAgIChhcmVhKGEucHJldiwgYSwgYi5wcmV2KSB8fCBhcmVhKGEsIGIucHJldiwgYikpIHx8IC8vIGRvZXMgbm90IGNyZWF0ZSBvcHBvc2l0ZS1mYWNpbmcgc2VjdG9yc1xuICAgICAgICAgICAgZXF1YWxzKGEsIGIpICYmIGFyZWEoYS5wcmV2LCBhLCBhLm5leHQpID4gMCAmJiBhcmVhKGIucHJldiwgYiwgYi5uZXh0KSA+IDApOyAvLyBzcGVjaWFsIHplcm8tbGVuZ3RoIGNhc2Vcbn1cblxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxuZnVuY3Rpb24gYXJlYShwLCBxLCByKSB7XG4gICAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xufVxuXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxuZnVuY3Rpb24gZXF1YWxzKHAxLCBwMikge1xuICAgIHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3RcbmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHtcbiAgICB2YXIgbzEgPSBzaWduKGFyZWEocDEsIHExLCBwMikpO1xuICAgIHZhciBvMiA9IHNpZ24oYXJlYShwMSwgcTEsIHEyKSk7XG4gICAgdmFyIG8zID0gc2lnbihhcmVhKHAyLCBxMiwgcDEpKTtcbiAgICB2YXIgbzQgPSBzaWduKGFyZWEocDIsIHEyLCBxMSkpO1xuXG4gICAgaWYgKG8xICE9PSBvMiAmJiBvMyAhPT0gbzQpIHJldHVybiB0cnVlOyAvLyBnZW5lcmFsIGNhc2VcblxuICAgIGlmIChvMSA9PT0gMCAmJiBvblNlZ21lbnQocDEsIHAyLCBxMSkpIHJldHVybiB0cnVlOyAvLyBwMSwgcTEgYW5kIHAyIGFyZSBjb2xsaW5lYXIgYW5kIHAyIGxpZXMgb24gcDFxMVxuICAgIGlmIChvMiA9PT0gMCAmJiBvblNlZ21lbnQocDEsIHEyLCBxMSkpIHJldHVybiB0cnVlOyAvLyBwMSwgcTEgYW5kIHEyIGFyZSBjb2xsaW5lYXIgYW5kIHEyIGxpZXMgb24gcDFxMVxuICAgIGlmIChvMyA9PT0gMCAmJiBvblNlZ21lbnQocDIsIHAxLCBxMikpIHJldHVybiB0cnVlOyAvLyBwMiwgcTIgYW5kIHAxIGFyZSBjb2xsaW5lYXIgYW5kIHAxIGxpZXMgb24gcDJxMlxuICAgIGlmIChvNCA9PT0gMCAmJiBvblNlZ21lbnQocDIsIHExLCBxMikpIHJldHVybiB0cnVlOyAvLyBwMiwgcTIgYW5kIHExIGFyZSBjb2xsaW5lYXIgYW5kIHExIGxpZXMgb24gcDJxMlxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBmb3IgY29sbGluZWFyIHBvaW50cyBwLCBxLCByLCBjaGVjayBpZiBwb2ludCBxIGxpZXMgb24gc2VnbWVudCBwclxuZnVuY3Rpb24gb25TZWdtZW50KHAsIHEsIHIpIHtcbiAgICByZXR1cm4gcS54IDw9IE1hdGgubWF4KHAueCwgci54KSAmJiBxLnggPj0gTWF0aC5taW4ocC54LCByLngpICYmIHEueSA8PSBNYXRoLm1heChwLnksIHIueSkgJiYgcS55ID49IE1hdGgubWluKHAueSwgci55KTtcbn1cblxuZnVuY3Rpb24gc2lnbihudW0pIHtcbiAgICByZXR1cm4gbnVtID4gMCA/IDEgOiBudW0gPCAwID8gLTEgOiAwO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50c1xuZnVuY3Rpb24gaW50ZXJzZWN0c1BvbHlnb24oYSwgYikge1xuICAgIHZhciBwID0gYTtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLmkgIT09IGEuaSAmJiBwLm5leHQuaSAhPT0gYS5pICYmIHAuaSAhPT0gYi5pICYmIHAubmV4dC5pICE9PSBiLmkgJiZcbiAgICAgICAgICAgICAgICBpbnRlcnNlY3RzKHAsIHAubmV4dCwgYSwgYikpIHJldHVybiB0cnVlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoYSwgYikge1xuICAgIHJldHVybiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA8IDAgP1xuICAgICAgICBhcmVhKGEsIGIsIGEubmV4dCkgPj0gMCAmJiBhcmVhKGEsIGEucHJldiwgYikgPj0gMCA6XG4gICAgICAgIGFyZWEoYSwgYiwgYS5wcmV2KSA8IDAgfHwgYXJlYShhLCBhLm5leHQsIGIpIDwgMDtcbn1cblxuLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBtaWRkbGVJbnNpZGUoYSwgYikge1xuICAgIHZhciBwID0gYSxcbiAgICAgICAgaW5zaWRlID0gZmFsc2UsXG4gICAgICAgIHB4ID0gKGEueCArIGIueCkgLyAyLFxuICAgICAgICBweSA9IChhLnkgKyBiLnkpIC8gMjtcbiAgICBkbyB7XG4gICAgICAgIGlmICgoKHAueSA+IHB5KSAhPT0gKHAubmV4dC55ID4gcHkpKSAmJiBwLm5leHQueSAhPT0gcC55ICYmXG4gICAgICAgICAgICAgICAgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcbiAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gaW5zaWRlO1xufVxuXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcbmZ1bmN0aW9uIHNwbGl0UG9seWdvbihhLCBiKSB7XG4gICAgdmFyIGEyID0gbmV3IE5vZGUoYS5pLCBhLngsIGEueSksXG4gICAgICAgIGIyID0gbmV3IE5vZGUoYi5pLCBiLngsIGIueSksXG4gICAgICAgIGFuID0gYS5uZXh0LFxuICAgICAgICBicCA9IGIucHJldjtcblxuICAgIGEubmV4dCA9IGI7XG4gICAgYi5wcmV2ID0gYTtcblxuICAgIGEyLm5leHQgPSBhbjtcbiAgICBhbi5wcmV2ID0gYTI7XG5cbiAgICBiMi5uZXh0ID0gYTI7XG4gICAgYTIucHJldiA9IGIyO1xuXG4gICAgYnAubmV4dCA9IGIyO1xuICAgIGIyLnByZXYgPSBicDtcblxuICAgIHJldHVybiBiMjtcbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkge1xuICAgIHZhciBwID0gbmV3IE5vZGUoaSwgeCwgeSk7XG5cbiAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgcC5wcmV2ID0gcDtcbiAgICAgICAgcC5uZXh0ID0gcDtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAubmV4dCA9IGxhc3QubmV4dDtcbiAgICAgICAgcC5wcmV2ID0gbGFzdDtcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xuICAgICAgICBsYXN0Lm5leHQgPSBwO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XG4gICAgcC5uZXh0LnByZXYgPSBwLnByZXY7XG4gICAgcC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cbiAgICBpZiAocC5wcmV2WikgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG4gICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xufVxuXG5mdW5jdGlvbiBOb2RlKGksIHgsIHkpIHtcbiAgICAvLyB2ZXJ0ZXggaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcbiAgICB0aGlzLmkgPSBpO1xuXG4gICAgLy8gdmVydGV4IGNvb3JkaW5hdGVzXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGV4IG5vZGVzIGluIGEgcG9seWdvbiByaW5nXG4gICAgdGhpcy5wcmV2ID0gbnVsbDtcbiAgICB0aGlzLm5leHQgPSBudWxsO1xuXG4gICAgLy8gei1vcmRlciBjdXJ2ZSB2YWx1ZVxuICAgIHRoaXMueiA9IG51bGw7XG5cbiAgICAvLyBwcmV2aW91cyBhbmQgbmV4dCBub2RlcyBpbiB6LW9yZGVyXG4gICAgdGhpcy5wcmV2WiA9IG51bGw7XG4gICAgdGhpcy5uZXh0WiA9IG51bGw7XG5cbiAgICAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludFxuICAgIHRoaXMuc3RlaW5lciA9IGZhbHNlO1xufVxuXG4vLyByZXR1cm4gYSBwZXJjZW50YWdlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9seWdvbiBhcmVhIGFuZCBpdHMgdHJpYW5ndWxhdGlvbiBhcmVhO1xuLy8gdXNlZCB0byB2ZXJpZnkgY29ycmVjdG5lc3Mgb2YgdHJpYW5ndWxhdGlvblxuZWFyY3V0LmRldmlhdGlvbiA9IGZ1bmN0aW9uIChkYXRhLCBob2xlSW5kaWNlcywgZGltLCB0cmlhbmdsZXMpIHtcbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGg7XG4gICAgdmFyIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXG4gICAgdmFyIHBvbHlnb25BcmVhID0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCAwLCBvdXRlckxlbiwgZGltKSk7XG4gICAgaWYgKGhhc0hvbGVzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgICAgICB2YXIgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgIHBvbHlnb25BcmVhIC09IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdHJpYW5nbGVzQXJlYSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB2YXIgYSA9IHRyaWFuZ2xlc1tpXSAqIGRpbTtcbiAgICAgICAgdmFyIGIgPSB0cmlhbmdsZXNbaSArIDFdICogZGltO1xuICAgICAgICB2YXIgYyA9IHRyaWFuZ2xlc1tpICsgMl0gKiBkaW07XG4gICAgICAgIHRyaWFuZ2xlc0FyZWEgKz0gTWF0aC5hYnMoXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbY10pICogKGRhdGFbYiArIDFdIC0gZGF0YVthICsgMV0pIC1cbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtiXSkgKiAoZGF0YVtjICsgMV0gLSBkYXRhW2EgKyAxXSkpO1xuICAgIH1cblxuICAgIHJldHVybiBwb2x5Z29uQXJlYSA9PT0gMCAmJiB0cmlhbmdsZXNBcmVhID09PSAwID8gMCA6XG4gICAgICAgIE1hdGguYWJzKCh0cmlhbmdsZXNBcmVhIC0gcG9seWdvbkFyZWEpIC8gcG9seWdvbkFyZWEpO1xufTtcblxuZnVuY3Rpb24gc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pIHtcbiAgICB2YXIgc3VtID0gMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltKSB7XG4gICAgICAgIHN1bSArPSAoZGF0YVtqXSAtIGRhdGFbaV0pICogKGRhdGFbaSArIDFdICsgZGF0YVtqICsgMV0pO1xuICAgICAgICBqID0gaTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bTtcbn1cblxuLy8gdHVybiBhIHBvbHlnb24gaW4gYSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBmb3JtIChlLmcuIGFzIGluIEdlb0pTT04pIGludG8gYSBmb3JtIEVhcmN1dCBhY2NlcHRzXG5lYXJjdXQuZmxhdHRlbiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIGRpbSA9IGRhdGFbMF1bMF0ubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSB7dmVydGljZXM6IFtdLCBob2xlczogW10sIGRpbWVuc2lvbnM6IGRpbX0sXG4gICAgICAgIGhvbGVJbmRleCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkYXRhW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGRpbTsgZCsrKSByZXN1bHQudmVydGljZXMucHVzaChkYXRhW2ldW2pdW2RdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIGhvbGVJbmRleCArPSBkYXRhW2kgLSAxXS5sZW5ndGg7XG4gICAgICAgICAgICByZXN1bHQuaG9sZXMucHVzaChob2xlSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnIsIGssIGxlZnQsIHJpZ2h0LCBjb21wYXJlKSB7XG4gICAgcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbGVmdCB8fCAwLCByaWdodCB8fCAoYXJyLmxlbmd0aCAtIDEpLCBjb21wYXJlIHx8IGRlZmF1bHRDb21wYXJlKTtcbn1cblxuZnVuY3Rpb24gcXVpY2tzZWxlY3RTdGVwKGFyciwgaywgbGVmdCwgcmlnaHQsIGNvbXBhcmUpIHtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgdmFyIG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgdmFyIG0gPSBrIC0gbGVmdCArIDE7XG4gICAgICAgICAgICB2YXIgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgdmFyIHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgICAgICAgdmFyIHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogKG0gLSBuIC8gMiA8IDAgPyAtMSA6IDEpO1xuICAgICAgICAgICAgdmFyIG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgdmFyIG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBxdWlja3NlbGVjdFN0ZXAoYXJyLCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdCA9IGFycltrXTtcbiAgICAgICAgdmFyIGkgPSBsZWZ0O1xuICAgICAgICB2YXIgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXAoYXJyLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvbXBhcmUoYXJyW3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFyciwgbGVmdCwgcmlnaHQpO1xuXG4gICAgICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgICAgICAgc3dhcChhcnIsIGksIGopO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyW2ldLCB0KSA8IDApIGkrKztcbiAgICAgICAgICAgIHdoaWxlIChjb21wYXJlKGFycltqXSwgdCkgPiAwKSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tcGFyZShhcnJbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFyciwgbGVmdCwgaik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgc3dhcChhcnIsIGosIHJpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICAgICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN3YXAoYXJyLCBpLCBqKSB7XG4gICAgdmFyIHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHF1aWNrc2VsZWN0IGZyb20gJ3F1aWNrc2VsZWN0JztcblxuaW1wb3J0IHtjYWxjdWxhdGVTaWduZWRBcmVhfSBmcm9tICcuL3V0aWwuanMnO1xuXG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuLy8gY2xhc3NpZmllcyBhbiBhcnJheSBvZiByaW5ncyBpbnRvIHBvbHlnb25zIHdpdGggb3V0ZXIgcmluZ3MgYW5kIGhvbGVzXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbGFzc2lmeVJpbmdzKHJpbmdzOiBBcnJheTxBcnJheTxQb2ludD4+LCBtYXhSaW5nczogbnVtYmVyKTogQXJyYXk8QXJyYXk8QXJyYXk8UG9pbnQ+Pj4ge1xuICAgIGNvbnN0IGxlbiA9IHJpbmdzLmxlbmd0aDtcblxuICAgIGlmIChsZW4gPD0gMSkgcmV0dXJuIFtyaW5nc107XG5cbiAgICBjb25zdCBwb2x5Z29ucyA9IFtdO1xuICAgIGxldCBwb2x5Z29uLFxuICAgICAgICBjY3c7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGFyZWEgPSBjYWxjdWxhdGVTaWduZWRBcmVhKHJpbmdzW2ldKTtcbiAgICAgICAgaWYgKGFyZWEgPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIChyaW5nc1tpXTogYW55KS5hcmVhID0gTWF0aC5hYnMoYXJlYSk7XG5cbiAgICAgICAgaWYgKGNjdyA9PT0gdW5kZWZpbmVkKSBjY3cgPSBhcmVhIDwgMDtcblxuICAgICAgICBpZiAoY2N3ID09PSBhcmVhIDwgMCkge1xuICAgICAgICAgICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG4gICAgICAgICAgICBwb2x5Z29uID0gW3JpbmdzW2ldXTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKHBvbHlnb246IGFueSkucHVzaChyaW5nc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG5cbiAgICAvLyBFYXJjdXQgcGVyZm9ybWFuY2UgZGVncmFkZXMgd2l0aCB0aGUgIyBvZiByaW5ncyBpbiBhIHBvbHlnb24uIEZvciB0aGlzXG4gICAgLy8gcmVhc29uLCB3ZSBsaW1pdCBzdHJpcCBvdXQgYWxsIGJ1dCB0aGUgYG1heFJpbmdzYCBsYXJnZXN0IHJpbmdzLlxuICAgIGlmIChtYXhSaW5ncyA+IDEpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwb2x5Z29ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHBvbHlnb25zW2pdLmxlbmd0aCA8PSBtYXhSaW5ncykgY29udGludWU7XG4gICAgICAgICAgICBxdWlja3NlbGVjdChwb2x5Z29uc1tqXSwgbWF4UmluZ3MsIDEsIHBvbHlnb25zW2pdLmxlbmd0aCAtIDEsIGNvbXBhcmVBcmVhcyk7XG4gICAgICAgICAgICBwb2x5Z29uc1tqXSA9IHBvbHlnb25zW2pdLnNsaWNlKDAsIG1heFJpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwb2x5Z29ucztcbn1cblxuZnVuY3Rpb24gY29tcGFyZUFyZWFzKGEsIGIpIHtcbiAgICByZXR1cm4gYi5hcmVhIC0gYS5hcmVhO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIEZpbGxTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgTGluZVN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllci5qcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBCdWNrZXRGZWF0dXJlLFxuICAgIFBvcHVsYXRlUGFyYW1ldGVyc1xufSBmcm9tICcuLi9idWNrZXQuanMnO1xuXG50eXBlIFBhdHRlcm5TdHlsZUxheWVycyA9XG4gICAgQXJyYXk8TGluZVN0eWxlTGF5ZXI+IHxcbiAgICBBcnJheTxGaWxsU3R5bGVMYXllcj4gfFxuICAgIEFycmF5PEZpbGxFeHRydXNpb25TdHlsZUxheWVyPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1BhdHRlcm4odHlwZTogc3RyaW5nLCBsYXllcnM6IFBhdHRlcm5TdHlsZUxheWVycywgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0dGVybnMgPSBvcHRpb25zLnBhdHRlcm5EZXBlbmRlbmNpZXM7XG4gICAgbGV0IGhhc1BhdHRlcm4gPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgbGF5ZXJzKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eSA9IGxheWVyLnBhaW50LmdldChgJHt0eXBlfS1wYXR0ZXJuYCk7XG4gICAgICAgIGlmICghcGF0dGVyblByb3BlcnR5LmlzQ29uc3RhbnQoKSkge1xuICAgICAgICAgICAgaGFzUGF0dGVybiA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25zdGFudFBhdHRlcm4gPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcihudWxsKTtcbiAgICAgICAgaWYgKGNvbnN0YW50UGF0dGVybikge1xuICAgICAgICAgICAgaGFzUGF0dGVybiA9IHRydWU7XG4gICAgICAgICAgICBwYXR0ZXJuc1tjb25zdGFudFBhdHRlcm4udG9dID0gIHRydWU7XG4gICAgICAgICAgICBwYXR0ZXJuc1tjb25zdGFudFBhdHRlcm4uZnJvbV0gPSAgdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoYXNQYXR0ZXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkUGF0dGVybkRlcGVuZGVuY2llcyh0eXBlOiBzdHJpbmcsIGxheWVyczogUGF0dGVyblN0eWxlTGF5ZXJzLCBwYXR0ZXJuRmVhdHVyZTogQnVja2V0RmVhdHVyZSwgem9vbTogbnVtYmVyLCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMpOiBCdWNrZXRGZWF0dXJlIHtcbiAgICBjb25zdCBwYXR0ZXJucyA9IG9wdGlvbnMucGF0dGVybkRlcGVuZGVuY2llcztcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHkgPSBsYXllci5wYWludC5nZXQoYCR7dHlwZX0tcGF0dGVybmApO1xuXG4gICAgICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eVZhbHVlID0gcGF0dGVyblByb3BlcnR5LnZhbHVlO1xuICAgICAgICBpZiAocGF0dGVyblByb3BlcnR5VmFsdWUua2luZCAhPT0gXCJjb25zdGFudFwiKSB7XG4gICAgICAgICAgICBsZXQgbWluID0gcGF0dGVyblByb3BlcnR5VmFsdWUuZXZhbHVhdGUoe3pvb206IHpvb20gLSAxfSwgcGF0dGVybkZlYXR1cmUsIHt9LCBvcHRpb25zLmF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICBsZXQgbWlkID0gcGF0dGVyblByb3BlcnR5VmFsdWUuZXZhbHVhdGUoe3pvb219LCBwYXR0ZXJuRmVhdHVyZSwge30sIG9wdGlvbnMuYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgICAgIGxldCBtYXggPSBwYXR0ZXJuUHJvcGVydHlWYWx1ZS5ldmFsdWF0ZSh7em9vbTogem9vbSArIDF9LCBwYXR0ZXJuRmVhdHVyZSwge30sIG9wdGlvbnMuYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgICAgIG1pbiA9IG1pbiAmJiBtaW4ubmFtZSA/IG1pbi5uYW1lIDogbWluO1xuICAgICAgICAgICAgbWlkID0gbWlkICYmIG1pZC5uYW1lID8gbWlkLm5hbWUgOiBtaWQ7XG4gICAgICAgICAgICBtYXggPSBtYXggJiYgbWF4Lm5hbWUgPyBtYXgubmFtZSA6IG1heDtcbiAgICAgICAgICAgIC8vIGFkZCB0byBwYXR0ZXJuRGVwZW5kZW5jaWVzXG4gICAgICAgICAgICBwYXR0ZXJuc1ttaW5dID0gdHJ1ZTtcbiAgICAgICAgICAgIHBhdHRlcm5zW21pZF0gPSB0cnVlO1xuICAgICAgICAgICAgcGF0dGVybnNbbWF4XSA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIHNhdmUgZm9yIGxheW91dFxuICAgICAgICAgICAgcGF0dGVybkZlYXR1cmUucGF0dGVybnNbbGF5ZXIuaWRdID0ge21pbiwgbWlkLCBtYXh9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuRmVhdHVyZTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7RmlsbExheW91dEFycmF5fSBmcm9tICcuLi9hcnJheV90eXBlcy5qcyc7XG5cbmltcG9ydCB7bWVtYmVycyBhcyBsYXlvdXRBdHRyaWJ1dGVzfSBmcm9tICcuL2ZpbGxfYXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9zZWdtZW50LmpzJztcbmltcG9ydCB7UHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXR9IGZyb20gJy4uL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQge0xpbmVJbmRleEFycmF5LCBUcmlhbmdsZUluZGV4QXJyYXl9IGZyb20gJy4uL2luZGV4X2FycmF5X3R5cGUuanMnO1xuaW1wb3J0IGVhcmN1dCBmcm9tICdlYXJjdXQnO1xuaW1wb3J0IGNsYXNzaWZ5UmluZ3MgZnJvbSAnLi4vLi4vdXRpbC9jbGFzc2lmeV9yaW5ncy5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5jb25zdCBFQVJDVVRfTUFYX1JJTkdTID0gNTAwO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcbmltcG9ydCB7aGFzUGF0dGVybiwgYWRkUGF0dGVybkRlcGVuZGVuY2llc30gZnJvbSAnLi9wYXR0ZXJuX2J1Y2tldF9mZWF0dXJlcy5qcyc7XG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4uL2xvYWRfZ2VvbWV0cnkuanMnO1xuaW1wb3J0IHRvRXZhbHVhdGlvbkZlYXR1cmUgZnJvbSAnLi4vZXZhbHVhdGlvbl9mZWF0dXJlLmpzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgQnVja2V0RmVhdHVyZSxcbiAgICBJbmRleGVkRmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIEZpbGxTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL2luZGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi8uLi9zb3VyY2Uvc291cmNlX3N0YXRlLmpzJztcbmltcG9ydCB0eXBlIHtTcHJpdGVQb3NpdGlvbnN9IGZyb20gJy4uLy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3Rpb25TcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlVHJhbnNmb3JtfSBmcm9tICcuLi8uLi9nZW8vcHJvamVjdGlvbi90aWxlX3RyYW5zZm9ybS5qcyc7XG5cbmNsYXNzIEZpbGxCdWNrZXQgaW1wbGVtZW50cyBCdWNrZXQge1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIG92ZXJzY2FsaW5nOiBudW1iZXI7XG4gICAgbGF5ZXJzOiBBcnJheTxGaWxsU3R5bGVMYXllcj47XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PEZpbGxTdHlsZUxheWVyPjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHBhdHRlcm5GZWF0dXJlczogQXJyYXk8QnVja2V0RmVhdHVyZT47XG5cbiAgICBsYXlvdXRWZXJ0ZXhBcnJheTogRmlsbExheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXkyOiBMaW5lSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjI6IEluZGV4QnVmZmVyO1xuXG4gICAgaGFzUGF0dGVybjogYm9vbGVhbjtcbiAgICBwcm9ncmFtQ29uZmlndXJhdGlvbnM6IFByb2dyYW1Db25maWd1cmF0aW9uU2V0PEZpbGxTdHlsZUxheWVyPjtcbiAgICBzZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICBzZWdtZW50czI6IFNlZ21lbnRWZWN0b3I7XG4gICAgdXBsb2FkZWQ6IGJvb2xlYW47XG4gICAgcHJvamVjdGlvbjogUHJvamVjdGlvblNwZWNpZmljYXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPEZpbGxTdHlsZUxheWVyPikge1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhdHRlcm5GZWF0dXJlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgRmlsbExheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5pbmRleEFycmF5MiA9IG5ldyBMaW5lSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucyA9IG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldChvcHRpb25zLmxheWVycywgb3B0aW9ucy56b29tKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMyID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5zdGF0ZURlcGVuZGVudExheWVySWRzID0gdGhpcy5sYXllcnMuZmlsdGVyKChsKSA9PiBsLmlzU3RhdGVEZXBlbmRlbnQoKSkubWFwKChsKSA9PiBsLmlkKTtcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uID0gb3B0aW9ucy5wcm9qZWN0aW9uO1xuICAgIH1cblxuICAgIHBvcHVsYXRlKGZlYXR1cmVzOiBBcnJheTxJbmRleGVkRmVhdHVyZT4sIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIHRpbGVUcmFuc2Zvcm06IFRpbGVUcmFuc2Zvcm0pIHtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gaGFzUGF0dGVybignZmlsbCcsIHRoaXMubGF5ZXJzLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZmlsbFNvcnRLZXkgPSB0aGlzLmxheWVyc1swXS5sYXlvdXQuZ2V0KCdmaWxsLXNvcnQta2V5Jyk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldEZlYXR1cmVzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaWQsIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSBvZiBmZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3QgbmVlZEdlb21ldHJ5ID0gdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5O1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGlvbkZlYXR1cmUgPSB0b0V2YWx1YXRpb25GZWF0dXJlKGZlYXR1cmUsIG5lZWRHZW9tZXRyeSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aGlzLnpvb20pLCBldmFsdWF0aW9uRmVhdHVyZSwgY2Fub25pY2FsKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvcnRLZXkgPSBmaWxsU29ydEtleSA/XG4gICAgICAgICAgICAgICAgZmlsbFNvcnRLZXkuZXZhbHVhdGUoZXZhbHVhdGlvbkZlYXR1cmUsIHt9LCBjYW5vbmljYWwsIG9wdGlvbnMuYXZhaWxhYmxlSW1hZ2VzKSA6XG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlOiBCdWNrZXRGZWF0dXJlID0ge1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0eXBlOiBmZWF0dXJlLnR5cGUsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogbmVlZEdlb21ldHJ5ID8gZXZhbHVhdGlvbkZlYXR1cmUuZ2VvbWV0cnkgOiBsb2FkR2VvbWV0cnkoZmVhdHVyZSwgY2Fub25pY2FsLCB0aWxlVHJhbnNmb3JtKSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuczoge30sXG4gICAgICAgICAgICAgICAgc29ydEtleVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYnVja2V0RmVhdHVyZXMucHVzaChidWNrZXRGZWF0dXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxsU29ydEtleSkge1xuICAgICAgICAgICAgYnVja2V0RmVhdHVyZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGEuc29ydEtleSBpcyBhbHdheXMgYSBudW1iZXIgd2hlbiBpbiB1c2VcbiAgICAgICAgICAgICAgICByZXR1cm4gKChhLnNvcnRLZXk6IGFueSk6IG51bWJlcikgLSAoKGIuc29ydEtleTogYW55KTogbnVtYmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBidWNrZXRGZWF0dXJlIG9mIGJ1Y2tldEZlYXR1cmVzKSB7XG4gICAgICAgICAgICBjb25zdCB7Z2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSA9IGJ1Y2tldEZlYXR1cmU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1BhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJuRmVhdHVyZSA9IGFkZFBhdHRlcm5EZXBlbmRlbmNpZXMoJ2ZpbGwnLCB0aGlzLmxheWVycywgYnVja2V0RmVhdHVyZSwgdGhpcy56b29tLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAvLyBwYXR0ZXJuIGZlYXR1cmVzIGFyZSBhZGRlZCBvbmx5IG9uY2UgdGhlIHBhdHRlcm4gaXMgbG9hZGVkIGludG8gdGhlIGltYWdlIGF0bGFzXG4gICAgICAgICAgICAgICAgLy8gc28gYXJlIHN0b3JlZCBkdXJpbmcgcG9wdWxhdGUgdW50aWwgbGF0ZXIgdXBkYXRlZCB3aXRoIHBvc2l0aW9ucyBieSB0aWxlIHdvcmtlciBpbiBhZGRGZWF0dXJlc1xuICAgICAgICAgICAgICAgIHRoaXMucGF0dGVybkZlYXR1cmVzLnB1c2gocGF0dGVybkZlYXR1cmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoYnVja2V0RmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBjYW5vbmljYWwsIHt9LCBvcHRpb25zLmF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlc1tpbmRleF0uZmVhdHVyZTtcbiAgICAgICAgICAgIG9wdGlvbnMuZmVhdHVyZUluZGV4Lmluc2VydChmZWF0dXJlLCBnZW9tZXRyeSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIHRoaXMuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlKHN0YXRlczogRmVhdHVyZVN0YXRlcywgdnRMYXllcjogVmVjdG9yVGlsZUxheWVyLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGltYWdlUG9zaXRpb25zOiBTcHJpdGVQb3NpdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyhzdGF0ZXMsIHZ0TGF5ZXIsIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMsIGF2YWlsYWJsZUltYWdlcywgaW1hZ2VQb3NpdGlvbnMpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmVzKG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIGltYWdlUG9zaXRpb25zOiBTcHJpdGVQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgXzogVGlsZVRyYW5zZm9ybSkge1xuICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgdGhpcy5wYXR0ZXJuRmVhdHVyZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmVhdHVyZShmZWF0dXJlLCBmZWF0dXJlLmdlb21ldHJ5LCBmZWF0dXJlLmluZGV4LCBjYW5vbmljYWwsIGltYWdlUG9zaXRpb25zLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHVwbG9hZFBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGxvYWRlZCB8fCB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVwbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXksIGxheW91dEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhCdWZmZXIyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIpIHJldHVybjtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlcjIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzMi5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZShmZWF0dXJlOiBCdWNrZXRGZWF0dXJlLCBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgaW5kZXg6IG51bWJlciwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIGltYWdlUG9zaXRpb25zOiBTcHJpdGVQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiA9IFtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBjbGFzc2lmeVJpbmdzKGdlb21ldHJ5LCBFQVJDVVRfTUFYX1JJTkdTKSkge1xuICAgICAgICAgICAgbGV0IG51bVZlcnRpY2VzID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgbnVtVmVydGljZXMgKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRyaWFuZ2xlU2VnbWVudCA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQobnVtVmVydGljZXMsIHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHRoaXMuaW5kZXhBcnJheSk7XG4gICAgICAgICAgICBjb25zdCB0cmlhbmdsZUluZGV4ID0gdHJpYW5nbGVTZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbmVkID0gW107XG4gICAgICAgICAgICBjb25zdCBob2xlSW5kaWNlcyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgcG9seWdvbikge1xuICAgICAgICAgICAgICAgIGlmIChyaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmluZyAhPT0gcG9seWdvblswXSkge1xuICAgICAgICAgICAgICAgICAgICBob2xlSW5kaWNlcy5wdXNoKGZsYXR0ZW5lZC5sZW5ndGggLyAyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lU2VnbWVudCA9IHRoaXMuc2VnbWVudHMyLnByZXBhcmVTZWdtZW50KHJpbmcubGVuZ3RoLCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXkyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lSW5kZXggPSBsaW5lU2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHJpbmdbMF0ueCwgcmluZ1swXS55KTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkyLmVtcGxhY2VCYWNrKGxpbmVJbmRleCArIHJpbmcubGVuZ3RoIC0gMSwgbGluZUluZGV4KTtcbiAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChyaW5nWzBdLngpO1xuICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHJpbmdbMF0ueSk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhyaW5nW2ldLngsIHJpbmdbaV0ueSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheTIuZW1wbGFjZUJhY2sobGluZUluZGV4ICsgaSAtIDEsIGxpbmVJbmRleCArIGkpO1xuICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChyaW5nW2ldLngpO1xuICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChyaW5nW2ldLnkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxpbmVTZWdtZW50LnZlcnRleExlbmd0aCArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBsaW5lU2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBlYXJjdXQoZmxhdHRlbmVkLCBob2xlSW5kaWNlcyk7XG4gICAgICAgICAgICBhc3NlcnQoaW5kaWNlcy5sZW5ndGggJSAzID09PSAwKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgdHJpYW5nbGVJbmRleCArIGluZGljZXNbaSArIDFdLFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tpICsgMl0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cmlhbmdsZVNlZ21lbnQudmVydGV4TGVuZ3RoICs9IG51bVZlcnRpY2VzO1xuICAgICAgICAgICAgdHJpYW5nbGVTZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSBpbmRpY2VzLmxlbmd0aCAvIDM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMucG9wdWxhdGVQYWludEFycmF5cyh0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCwgZmVhdHVyZSwgaW5kZXgsIGltYWdlUG9zaXRpb25zLCBhdmFpbGFibGVJbWFnZXMsIGNhbm9uaWNhbCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcihGaWxsQnVja2V0LCAnRmlsbEJ1Y2tldCcsIHtvbWl0OiBbJ2xheWVycycsICdwYXR0ZXJuRmVhdHVyZXMnXX0pO1xuXG5leHBvcnQgZGVmYXVsdCBGaWxsQnVja2V0O1xuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuZXhwb3J0IHR5cGUgTGF5b3V0UHJvcHMgPSB7fFxuICAgIFwiZmlsbC1zb3J0LWtleVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBsYXlvdXQ6IFByb3BlcnRpZXM8TGF5b3V0UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiZmlsbC1zb3J0LWtleVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9maWxsXCJdW1wiZmlsbC1zb3J0LWtleVwiXSksXG59KTtcblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJmaWxsLWFudGlhbGlhc1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcImZpbGwtb3BhY2l0eVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImZpbGwtY29sb3JcIjogRGF0YURyaXZlblByb3BlcnR5PENvbG9yPixcbiAgICBcImZpbGwtb3V0bGluZS1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwiZmlsbC10cmFuc2xhdGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIj4sXG4gICAgXCJmaWxsLXBhdHRlcm5cIjogQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eTxSZXNvbHZlZEltYWdlPixcbnx9O1xuXG5jb25zdCBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImZpbGwtYW50aWFsaWFzXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsXCJdW1wiZmlsbC1hbnRpYWxpYXNcIl0pLFxuICAgIFwiZmlsbC1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtb3BhY2l0eVwiXSksXG4gICAgXCJmaWxsLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtY29sb3JcIl0pLFxuICAgIFwiZmlsbC1vdXRsaW5lLWNvbG9yXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtb3V0bGluZS1jb2xvclwiXSksXG4gICAgXCJmaWxsLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtdHJhbnNsYXRlXCJdKSxcbiAgICBcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgXCJmaWxsLXBhdHRlcm5cIjogbmV3IENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbFwiXVtcImZpbGwtcGF0dGVyblwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCwgbGF5b3V0IH06ICRFeGFjdDx7XG4gIHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+LCBsYXlvdXQ6IFByb3BlcnRpZXM8TGF5b3V0UHJvcHM+XG59Pik7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllci5qcyc7XG5cbmltcG9ydCBGaWxsQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0LmpzJztcbmltcG9ydCB7cG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb259IGZyb20gJy4uLy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzLmpzJztcbmltcG9ydCB7dHJhbnNsYXRlRGlzdGFuY2UsIHRyYW5zbGF0ZX0gZnJvbSAnLi4vcXVlcnlfdXRpbHMuanMnO1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9maWxsX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHtUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgTGF5b3V0LCBQb3NzaWJseUV2YWx1YXRlZH0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgUHJvZ3JhbUNvbmZpZ3VyYXRpb24gZnJvbSAnLi4vLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMnO1xuXG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge0J1Y2tldFBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge0xheW91dFByb3BzLCBQYWludFByb3BzfSBmcm9tICcuL2ZpbGxfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZXNwYWNlUXVlcnlHZW9tZXRyeX0gZnJvbSAnLi4vcXVlcnlfZ2VvbWV0cnkuanMnO1xuXG5jbGFzcyBGaWxsU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF91bmV2YWx1YXRlZExheW91dDogTGF5b3V0PExheW91dFByb3BzPjtcbiAgICBsYXlvdXQ6IFBvc3NpYmx5RXZhbHVhdGVkPExheW91dFByb3BzPjtcblxuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1JZHMoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5wYWludC5nZXQoJ2ZpbGwtcGF0dGVybicpO1xuICAgICAgICBjb25zdCBpbWFnZSA9IHBhdHRlcm4gJiYgcGF0dGVybi5jb25zdGFudE9yKCgxOiBhbnkpKTtcblxuICAgICAgICBjb25zdCBpZHMgPSBbaW1hZ2UgPyAnZmlsbFBhdHRlcm4nIDogJ2ZpbGwnXTtcblxuICAgICAgICBpZiAodGhpcy5wYWludC5nZXQoJ2ZpbGwtYW50aWFsaWFzJykpIHtcbiAgICAgICAgICAgIGlkcy5wdXNoKGltYWdlICYmICF0aGlzLmdldFBhaW50UHJvcGVydHkoJ2ZpbGwtb3V0bGluZS1jb2xvcicpID8gJ2ZpbGxPdXRsaW5lUGF0dGVybicgOiAnZmlsbE91dGxpbmUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpZHM7XG4gICAgfVxuXG4gICAgZ2V0UHJvZ3JhbUNvbmZpZ3VyYXRpb24oem9vbTogbnVtYmVyKTogUHJvZ3JhbUNvbmZpZ3VyYXRpb24ge1xuICAgICAgICByZXR1cm4gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uKHRoaXMsIHpvb20pO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgc3VwZXIucmVjYWxjdWxhdGUocGFyYW1ldGVycywgYXZhaWxhYmxlSW1hZ2VzKTtcblxuICAgICAgICBjb25zdCBvdXRsaW5lQ29sb3IgPSB0aGlzLnBhaW50Ll92YWx1ZXNbJ2ZpbGwtb3V0bGluZS1jb2xvciddO1xuICAgICAgICBpZiAob3V0bGluZUNvbG9yLnZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcgJiYgb3V0bGluZUNvbG9yLnZhbHVlLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMucGFpbnQuX3ZhbHVlc1snZmlsbC1vdXRsaW5lLWNvbG9yJ10gPSB0aGlzLnBhaW50Ll92YWx1ZXNbJ2ZpbGwtY29sb3InXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUJ1Y2tldChwYXJhbWV0ZXJzOiBCdWNrZXRQYXJhbWV0ZXJzPCo+KTogRmlsbEJ1Y2tldCB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsbEJ1Y2tldChwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBxdWVyeVJhZGl1cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdHJhbnNsYXRlRGlzdGFuY2UodGhpcy5wYWludC5nZXQoJ2ZpbGwtdHJhbnNsYXRlJykpO1xuICAgIH1cblxuICAgIHF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUocXVlcnlHZW9tZXRyeTogVGlsZXNwYWNlUXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChxdWVyeUdlb21ldHJ5LnF1ZXJ5R2VvbWV0cnkuaXNBYm92ZUhvcml6b24pIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB0cmFuc2xhdGVkUG9seWdvbiA9IHRyYW5zbGF0ZShxdWVyeUdlb21ldHJ5LnRpbGVzcGFjZUdlb21ldHJ5LFxuICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2ZpbGwtdHJhbnNsYXRlJyksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnZmlsbC10cmFuc2xhdGUtYW5jaG9yJyksXG4gICAgICAgICAgICB0cmFuc2Zvcm0uYW5nbGUsIHF1ZXJ5R2VvbWV0cnkucGl4ZWxUb1RpbGVVbml0c0ZhY3Rvcik7XG4gICAgICAgIHJldHVybiBwb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbih0cmFuc2xhdGVkUG9seWdvbiwgZ2VvbWV0cnkpO1xuICAgIH1cblxuICAgIGlzVGlsZUNsaXBwZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsbFN0eWxlTGF5ZXI7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtjcmVhdGVMYXlvdXR9IGZyb20gJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcblxuaW1wb3J0IHR5cGUge1N0cnVjdEFycmF5TGF5b3V0fSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmV4cG9ydCBjb25zdCBmaWxsRXh0cnVzaW9uQXR0cmlidXRlczogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3Nfbm9ybWFsX2VkJywgY29tcG9uZW50czogNCwgdHlwZTogJ0ludDE2J31cbl0pO1xuXG5leHBvcnQgY29uc3QgY2VudHJvaWRBdHRyaWJ1dGVzOiBTdHJ1Y3RBcnJheUxheW91dCA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX2NlbnRyb2lkX3BvcycsICBjb21wb25lbnRzOiAyLCB0eXBlOiAnVWludDE2J31cbl0pO1xuXG5leHBvcnQgY29uc3QgZmlsbEV4dHJ1c2lvbkF0dHJpYnV0ZXNFeHQ6IFN0cnVjdEFycmF5TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zXzMnLCBjb21wb25lbnRzOiAzLCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2FfcG9zX25vcm1hbF8zJywgY29tcG9uZW50czogMywgdHlwZTogJ0ludDE2J31cbl0pO1xuXG5leHBvcnQgY29uc3Qge21lbWJlcnMsIHNpemUsIGFsaWdubWVudH0gPSBmaWxsRXh0cnVzaW9uQXR0cmlidXRlcztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFBvaW50ID0gcmVxdWlyZSgnQG1hcGJveC9wb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVGZWF0dXJlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShwYmYsIGVuZCwgZXh0ZW50LCBrZXlzLCB2YWx1ZXMpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudDtcbiAgICB0aGlzLnR5cGUgPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9nZW9tZXRyeSA9IC0xO1xuICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRGZWF0dXJlLCB0aGlzLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmVhdHVyZSh0YWcsIGZlYXR1cmUsIHBiZikge1xuICAgIGlmICh0YWcgPT0gMSkgZmVhdHVyZS5pZCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDIpIHJlYWRUYWcocGJmLCBmZWF0dXJlKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMykgZmVhdHVyZS50eXBlID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gNCkgZmVhdHVyZS5fZ2VvbWV0cnkgPSBwYmYucG9zO1xufVxuXG5mdW5jdGlvbiByZWFkVGFnKHBiZiwgZmVhdHVyZSkge1xuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciBrZXkgPSBmZWF0dXJlLl9rZXlzW3BiZi5yZWFkVmFyaW50KCldLFxuICAgICAgICAgICAgdmFsdWUgPSBmZWF0dXJlLl92YWx1ZXNbcGJmLnJlYWRWYXJpbnQoKV07XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgfVxufVxuXG5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmxvYWRHZW9tZXRyeSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIGxpbmVzID0gW10sXG4gICAgICAgIGxpbmU7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAobGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG5cbiAgICAgICAgICAgIGlmIChjbWQgPT09IDEpIHsgLy8gbW92ZVRvXG4gICAgICAgICAgICAgICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgbGluZSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lLnB1c2gobmV3IFBvaW50KHgsIHkpKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gNykge1xuXG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcG5pay12ZWN0b3ItdGlsZS9pc3N1ZXMvOTBcbiAgICAgICAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgICAgICAgICAgbGluZS5wdXNoKGxpbmVbMF0uY2xvbmUoKSk7IC8vIGNsb3NlUG9seWdvblxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB4MSA9IEluZmluaXR5LFxuICAgICAgICB4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgeTEgPSBJbmZpbml0eSxcbiAgICAgICAgeTIgPSAtSW5maW5pdHk7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAobGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICBpZiAoeCA8IHgxKSB4MSA9IHg7XG4gICAgICAgICAgICBpZiAoeCA+IHgyKSB4MiA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IHkxKSB5MSA9IHk7XG4gICAgICAgICAgICBpZiAoeSA+IHkyKSB5MiA9IHk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgIT09IDcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzaXplID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCB6KSxcbiAgICAgICAgeDAgPSB0aGlzLmV4dGVudCAqIHgsXG4gICAgICAgIHkwID0gdGhpcy5leHRlbnQgKiB5LFxuICAgICAgICBjb29yZHMgPSB0aGlzLmxvYWRHZW9tZXRyeSgpLFxuICAgICAgICB0eXBlID0gVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbdGhpcy50eXBlXSxcbiAgICAgICAgaSwgajtcblxuICAgIGZ1bmN0aW9uIHByb2plY3QobGluZSkge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBwID0gbGluZVtqXSwgeTIgPSAxODAgLSAocC55ICsgeTApICogMzYwIC8gc2l6ZTtcbiAgICAgICAgICAgIGxpbmVbal0gPSBbXG4gICAgICAgICAgICAgICAgKHAueCArIHgwKSAqIDM2MCAvIHNpemUgLSAxODAsXG4gICAgICAgICAgICAgICAgMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICBjYXNlIDE6XG4gICAgICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcG9pbnRzW2ldID0gY29vcmRzW2ldWzBdO1xuICAgICAgICB9XG4gICAgICAgIGNvb3JkcyA9IHBvaW50cztcbiAgICAgICAgcHJvamVjdChjb29yZHMpO1xuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgMjpcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcHJvamVjdChjb29yZHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAzOlxuICAgICAgICBjb29yZHMgPSBjbGFzc2lmeVJpbmdzKGNvb3Jkcyk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0KGNvb3Jkc1tpXVtqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvb3Jkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSAnTXVsdGknICsgdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY29vcmRzXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllc1xuICAgIH07XG5cbiAgICBpZiAoJ2lkJyBpbiB0aGlzKSB7XG4gICAgICAgIHJlc3VsdC5pZCA9IHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIGNsYXNzaWZpZXMgYW4gYXJyYXkgb2YgcmluZ3MgaW50byBwb2x5Z29ucyB3aXRoIG91dGVyIHJpbmdzIGFuZCBob2xlc1xuXG5mdW5jdGlvbiBjbGFzc2lmeVJpbmdzKHJpbmdzKSB7XG4gICAgdmFyIGxlbiA9IHJpbmdzLmxlbmd0aDtcblxuICAgIGlmIChsZW4gPD0gMSkgcmV0dXJuIFtyaW5nc107XG5cbiAgICB2YXIgcG9seWdvbnMgPSBbXSxcbiAgICAgICAgcG9seWdvbixcbiAgICAgICAgY2N3O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYXJlYSA9IHNpZ25lZEFyZWEocmluZ3NbaV0pO1xuICAgICAgICBpZiAoYXJlYSA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKGNjdyA9PT0gdW5kZWZpbmVkKSBjY3cgPSBhcmVhIDwgMDtcblxuICAgICAgICBpZiAoY2N3ID09PSBhcmVhIDwgMCkge1xuICAgICAgICAgICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG4gICAgICAgICAgICBwb2x5Z29uID0gW3JpbmdzW2ldXTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9seWdvbi5wdXNoKHJpbmdzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9seWdvbikgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcblxuICAgIHJldHVybiBwb2x5Z29ucztcbn1cblxuZnVuY3Rpb24gc2lnbmVkQXJlYShyaW5nKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMSwgcDEsIHAyOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIHAxID0gcmluZ1tpXTtcbiAgICAgICAgcDIgPSByaW5nW2pdO1xuICAgICAgICBzdW0gKz0gKHAyLnggLSBwMS54KSAqIChwMS55ICsgcDIueSk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlTGF5ZXI7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVMYXllcihwYmYsIGVuZCkge1xuICAgIC8vIFB1YmxpY1xuICAgIHRoaXMudmVyc2lvbiA9IDE7XG4gICAgdGhpcy5uYW1lID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IDQwOTY7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9rZXlzID0gW107XG4gICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgdGhpcy5fZmVhdHVyZXMgPSBbXTtcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRMYXllciwgdGhpcywgZW5kKTtcblxuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiByZWFkTGF5ZXIodGFnLCBsYXllciwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMTUpIGxheWVyLnZlcnNpb24gPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMSkgbGF5ZXIubmFtZSA9IHBiZi5yZWFkU3RyaW5nKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA1KSBsYXllci5leHRlbnQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMikgbGF5ZXIuX2ZlYXR1cmVzLnB1c2gocGJmLnBvcyk7XG4gICAgZWxzZSBpZiAodGFnID09PSAzKSBsYXllci5fa2V5cy5wdXNoKHBiZi5yZWFkU3RyaW5nKCkpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNCkgbGF5ZXIuX3ZhbHVlcy5wdXNoKHJlYWRWYWx1ZU1lc3NhZ2UocGJmKSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRWYWx1ZU1lc3NhZ2UocGJmKSB7XG4gICAgdmFyIHZhbHVlID0gbnVsbCxcbiAgICAgICAgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIgdGFnID0gcGJmLnJlYWRWYXJpbnQoKSA+PiAzO1xuXG4gICAgICAgIHZhbHVlID0gdGFnID09PSAxID8gcGJmLnJlYWRTdHJpbmcoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDIgPyBwYmYucmVhZEZsb2F0KCkgOlxuICAgICAgICAgICAgdGFnID09PSAzID8gcGJmLnJlYWREb3VibGUoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDQgPyBwYmYucmVhZFZhcmludDY0KCkgOlxuICAgICAgICAgICAgdGFnID09PSA1ID8gcGJmLnJlYWRWYXJpbnQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDYgPyBwYmYucmVhZFNWYXJpbnQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDcgPyBwYmYucmVhZEJvb2xlYW4oKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyByZXR1cm4gZmVhdHVyZSBgaWAgZnJvbSB0aGlzIGxheWVyIGFzIGEgYFZlY3RvclRpbGVGZWF0dXJlYFxuVmVjdG9yVGlsZUxheWVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24oaSkge1xuICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHMnKTtcblxuICAgIHRoaXMuX3BiZi5wb3MgPSB0aGlzLl9mZWF0dXJlc1tpXTtcblxuICAgIHZhciBlbmQgPSB0aGlzLl9wYmYucmVhZFZhcmludCgpICsgdGhpcy5fcGJmLnBvcztcbiAgICByZXR1cm4gbmV3IFZlY3RvclRpbGVGZWF0dXJlKHRoaXMuX3BiZiwgZW5kLCB0aGlzLmV4dGVudCwgdGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVsYXllcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGU7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGUocGJmLCBlbmQpIHtcbiAgICB0aGlzLmxheWVycyA9IHBiZi5yZWFkRmllbGRzKHJlYWRUaWxlLCB7fSwgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZFRpbGUodGFnLCBsYXllcnMsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDMpIHtcbiAgICAgICAgdmFyIGxheWVyID0gbmV3IFZlY3RvclRpbGVMYXllcihwYmYsIHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zKTtcbiAgICAgICAgaWYgKGxheWVyLmxlbmd0aCkgbGF5ZXJzW2xheWVyLm5hbWVdID0gbGF5ZXI7XG4gICAgfVxufVxuXG4iLCJtb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZS5qcycpO1xubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWxheWVyLmpzJyk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmV4cG9ydCB0eXBlIENsaXBwZWRQb2x5Z29uID0ge1xuICAgIHBvbHlnb246IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgYm91bmRzOiBbUG9pbnQsIFBvaW50XVxufTtcblxuZnVuY3Rpb24gY2xpcFBvbHlnb24ocG9seWdvbnM6IEFycmF5PEFycmF5PFBvaW50Pj4sIGNsaXBBeGlzMTogbnVtYmVyLCBjbGlwQXhpczI6IG51bWJlciwgYXhpczogbnVtYmVyKTogQXJyYXk8QXJyYXk8UG9pbnQ+PiB7XG4gICAgY29uc3QgaW50ZXJzZWN0WCA9IChyaW5nLCBheCwgYXksIGJ4LCBieSwgeCkgPT4ge1xuICAgICAgICByaW5nLnB1c2gobmV3IFBvaW50KHgsIGF5ICsgKGJ5IC0gYXkpICogKCh4IC0gYXgpIC8gKGJ4IC0gYXgpKSkpO1xuICAgIH07XG4gICAgY29uc3QgaW50ZXJzZWN0WSA9IChyaW5nLCBheCwgYXksIGJ4LCBieSwgeSkgPT4ge1xuICAgICAgICByaW5nLnB1c2gobmV3IFBvaW50KGF4ICsgKGJ4IC0gYXgpICogKCh5IC0gYXkpIC8gKGJ5IC0gYXkpKSwgeSkpO1xuICAgIH07XG5cbiAgICBjb25zdCBwb2x5Z29uc0NsaXBwZWQgPSBbXTtcbiAgICBjb25zdCBpbnRlcnNlY3QgPSBheGlzID09PSAwID8gaW50ZXJzZWN0WCA6IGludGVyc2VjdFk7XG4gICAgZm9yIChjb25zdCBwb2x5Z29uIG9mIHBvbHlnb25zKSB7XG4gICAgICAgIGNvbnN0IHBvbHlnb25DbGlwcGVkID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgICAgICBpZiAocmluZy5sZW5ndGggPD0gMikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjbGlwcGVkID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmcubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXggPSByaW5nW2ldLng7XG4gICAgICAgICAgICAgICAgY29uc3QgYXkgPSByaW5nW2ldLnk7XG4gICAgICAgICAgICAgICAgY29uc3QgYnggPSByaW5nW2kgKyAxXS54O1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ5ID0gcmluZ1tpICsgMV0ueTtcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gYXhpcyA9PT0gMCA/IGF4IDogYXk7XG4gICAgICAgICAgICAgICAgY29uc3QgYiA9IGF4aXMgPT09IDAgPyBieCA6IGJ5O1xuICAgICAgICAgICAgICAgIGlmIChhIDwgY2xpcEF4aXMxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiID4gY2xpcEF4aXMxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QoY2xpcHBlZCwgYXgsIGF5LCBieCwgYnksIGNsaXBBeGlzMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPiBjbGlwQXhpczIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIgPCBjbGlwQXhpczIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyc2VjdChjbGlwcGVkLCBheCwgYXksIGJ4LCBieSwgY2xpcEF4aXMyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNsaXBwZWQucHVzaChyaW5nW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGIgPCBjbGlwQXhpczEgJiYgYSA+PSBjbGlwQXhpczEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0KGNsaXBwZWQsIGF4LCBheSwgYngsIGJ5LCBjbGlwQXhpczEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYiA+IGNsaXBBeGlzMiAmJiBhIDw9IGNsaXBBeGlzMikge1xuICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QoY2xpcHBlZCwgYXgsIGF5LCBieCwgYnksIGNsaXBBeGlzMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbGFzdCA9IHJpbmdbcmluZy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBheGlzID09PSAwID8gbGFzdC54IDogbGFzdC55O1xuICAgICAgICAgICAgaWYgKGEgPj0gY2xpcEF4aXMxICYmIGEgPD0gY2xpcEF4aXMyKSB7XG4gICAgICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGxhc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNsaXBwZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGFzdCA9IGNsaXBwZWRbY2xpcHBlZC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBpZiAoY2xpcHBlZFswXS54ICE9PSBsYXN0LnggfHwgY2xpcHBlZFswXS55ICE9PSBsYXN0LnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGNsaXBwZWRbMF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb2x5Z29uQ2xpcHBlZC5wdXNoKGNsaXBwZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwb2x5Z29uQ2xpcHBlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBvbHlnb25zQ2xpcHBlZC5wdXNoKHBvbHlnb25DbGlwcGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwb2x5Z29uc0NsaXBwZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWJkaXZpZGVQb2x5Z29ucyhwb2x5Z29uczogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgYm91bmRzOiBbUG9pbnQsIFBvaW50XSwgZ3JpZFNpemVYOiBudW1iZXIsIGdyaWRTaXplWTogbnVtYmVyLCBwYWRkaW5nOiBudW1iZXIgPSAwLjAsIHNwbGl0Rm46IEZ1bmN0aW9uKTogQXJyYXk8Q2xpcHBlZFBvbHlnb24+IHtcbiAgICBjb25zdCBvdXRQb2x5Z29ucyA9IFtdO1xuXG4gICAgaWYgKCFwb2x5Z29ucy5sZW5ndGggfHwgIWdyaWRTaXplWCB8fCAhZ3JpZFNpemVZKSB7XG4gICAgICAgIHJldHVybiBvdXRQb2x5Z29ucztcbiAgICB9XG5cbiAgICBjb25zdCBhZGRSZXN1bHQgPSAoY2xpcHBlZCwgYm91bmRzKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBjbGlwcGVkKSB7XG4gICAgICAgICAgICBvdXRQb2x5Z29ucy5wdXNoKHtwb2x5Z29uLCBib3VuZHN9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoU3BsaXRzID0gTWF0aC5jZWlsKE1hdGgubG9nMihncmlkU2l6ZVgpKTtcbiAgICBjb25zdCB2U3BsaXRzID0gTWF0aC5jZWlsKE1hdGgubG9nMihncmlkU2l6ZVkpKTtcblxuICAgIGNvbnN0IGluaXRpYWxTcGxpdHMgPSBoU3BsaXRzIC0gdlNwbGl0cztcblxuICAgIGNvbnN0IHNwbGl0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5hYnMoaW5pdGlhbFNwbGl0cyk7IGkrKykge1xuICAgICAgICBzcGxpdHMucHVzaChpbml0aWFsU3BsaXRzID4gMCA/IDAgOiAxKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKGhTcGxpdHMsIHZTcGxpdHMpOyBpKyspIHtcbiAgICAgICAgc3BsaXRzLnB1c2goMCk7IC8vIHhcbiAgICAgICAgc3BsaXRzLnB1c2goMSk7IC8vIHlcbiAgICB9XG5cbiAgICBsZXQgc3BsaXQgPSBwb2x5Z29ucztcblxuICAgIHNwbGl0ID0gY2xpcFBvbHlnb24oc3BsaXQsIGJvdW5kc1swXS55IC0gcGFkZGluZywgYm91bmRzWzFdLnkgKyBwYWRkaW5nLCAxKTtcbiAgICBzcGxpdCA9IGNsaXBQb2x5Z29uKHNwbGl0LCBib3VuZHNbMF0ueCAtIHBhZGRpbmcsIGJvdW5kc1sxXS54ICsgcGFkZGluZywgMCk7XG5cbiAgICBpZiAoIXNwbGl0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gb3V0UG9seWdvbnM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2sgPSBbXTtcbiAgICBpZiAoc3BsaXRzLmxlbmd0aCkge1xuICAgICAgICBzdGFjay5wdXNoKHtwb2x5Z29uczogc3BsaXQsIGJvdW5kcywgZGVwdGg6IDB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhZGRSZXN1bHQoc3BsaXQsIGJvdW5kcyk7XG4gICAgfVxuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBmcmFtZSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGFzc2VydChmcmFtZS5wb2x5Z29ucy5sZW5ndGggPiAwKTtcblxuICAgICAgICBjb25zdCBkZXB0aCA9IGZyYW1lLmRlcHRoO1xuICAgICAgICBjb25zdCBheGlzID0gc3BsaXRzW2RlcHRoXTtcblxuICAgICAgICBjb25zdCBiYm94TWluID0gZnJhbWUuYm91bmRzWzBdO1xuICAgICAgICBjb25zdCBiYm94TWF4ID0gZnJhbWUuYm91bmRzWzFdO1xuXG4gICAgICAgIGNvbnN0IHNwbGl0TWluID0gYXhpcyA9PT0gMCA/IGJib3hNaW4ueCA6IGJib3hNaW4ueTtcbiAgICAgICAgY29uc3Qgc3BsaXRNYXggPSBheGlzID09PSAwID8gYmJveE1heC54IDogYmJveE1heC55O1xuXG4gICAgICAgIGNvbnN0IHNwbGl0TWlkID0gc3BsaXRGbiA/IHNwbGl0Rm4oYXhpcywgc3BsaXRNaW4sIHNwbGl0TWF4KSA6IDAuNSAqIChzcGxpdE1pbiArIHNwbGl0TWF4KTtcblxuICAgICAgICBjb25zdCBsY2xpcCA9IGNsaXBQb2x5Z29uKGZyYW1lLnBvbHlnb25zLCBzcGxpdE1pbiAtIHBhZGRpbmcsIHNwbGl0TWlkICsgcGFkZGluZywgYXhpcyk7XG4gICAgICAgIGNvbnN0IHJjbGlwID0gY2xpcFBvbHlnb24oZnJhbWUucG9seWdvbnMsIHNwbGl0TWlkIC0gcGFkZGluZywgc3BsaXRNYXggKyBwYWRkaW5nLCBheGlzKTtcblxuICAgICAgICBpZiAobGNsaXAubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBiYk1heFggPSBheGlzID09PSAwID8gc3BsaXRNaWQgOiBiYm94TWF4Lng7XG4gICAgICAgICAgICBjb25zdCBiYk1heFkgPSBheGlzID09PSAxID8gc3BsaXRNaWQgOiBiYm94TWF4Lnk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJiTWF4ID0gbmV3IFBvaW50KGJiTWF4WCwgYmJNYXhZKTtcblxuICAgICAgICAgICAgY29uc3QgbGNsaXBCb3VuZHMgPSBbYmJveE1pbiwgYmJNYXhdO1xuXG4gICAgICAgICAgICBpZiAoc3BsaXRzLmxlbmd0aCA+IGRlcHRoICsgMSkge1xuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goe3BvbHlnb25zOiBsY2xpcCwgYm91bmRzOiBsY2xpcEJvdW5kcywgZGVwdGg6IGRlcHRoICsgMX0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGRSZXN1bHQobGNsaXAsIGxjbGlwQm91bmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyY2xpcC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGJiTWluWCA9IGF4aXMgPT09IDAgPyBzcGxpdE1pZCA6IGJib3hNaW4ueDtcbiAgICAgICAgICAgIGNvbnN0IGJiTWluWSA9IGF4aXMgPT09IDEgPyBzcGxpdE1pZCA6IGJib3hNaW4ueTtcblxuICAgICAgICAgICAgY29uc3QgYmJNaW4gPSBuZXcgUG9pbnQoYmJNaW5YLCBiYk1pblkpO1xuXG4gICAgICAgICAgICBjb25zdCByY2xpcEJvdW5kcyA9IFtiYk1pbiwgYmJveE1heF07XG5cbiAgICAgICAgICAgIGlmIChzcGxpdHMubGVuZ3RoID4gZGVwdGggKyAxKSB7XG4gICAgICAgICAgICAgICAgc3RhY2sucHVzaCh7cG9seWdvbnM6IHJjbGlwLCBib3VuZHM6IHJjbGlwQm91bmRzLCBkZXB0aDogZGVwdGggKyAxfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFkZFJlc3VsdChyY2xpcCwgcmNsaXBCb3VuZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dFBvbHlnb25zO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXksIEZpbGxFeHRydXNpb25FeHRBcnJheSwgRmlsbEV4dHJ1c2lvbkNlbnRyb2lkQXJyYXl9IGZyb20gJy4uL2FycmF5X3R5cGVzLmpzJztcblxuaW1wb3J0IHttZW1iZXJzIGFzIGxheW91dEF0dHJpYnV0ZXMsIGNlbnRyb2lkQXR0cmlidXRlcywgZmlsbEV4dHJ1c2lvbkF0dHJpYnV0ZXNFeHR9IGZyb20gJy4vZmlsbF9leHRydXNpb25fYXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9zZWdtZW50LmpzJztcbmltcG9ydCB7UHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXR9IGZyb20gJy4uL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQge1RyaWFuZ2xlSW5kZXhBcnJheX0gZnJvbSAnLi4vaW5kZXhfYXJyYXlfdHlwZS5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2V4dGVudC5qcyc7XG5pbXBvcnQgZWFyY3V0IGZyb20gJ2VhcmN1dCc7XG5pbXBvcnQgbXZ0IGZyb20gJ0BtYXBib3gvdmVjdG9yLXRpbGUnO1xuY29uc3QgdmVjdG9yVGlsZUZlYXR1cmVUeXBlcyA9IG12dC5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcztcbmltcG9ydCBjbGFzc2lmeVJpbmdzIGZyb20gJy4uLy4uL3V0aWwvY2xhc3NpZnlfcmluZ3MuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuY29uc3QgRUFSQ1VUX01BWF9SSU5HUyA9IDUwMDtcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uLy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5pbXBvcnQge2hhc1BhdHRlcm4sIGFkZFBhdHRlcm5EZXBlbmRlbmNpZXN9IGZyb20gJy4vcGF0dGVybl9idWNrZXRfZmVhdHVyZXMuanMnO1xuaW1wb3J0IGxvYWRHZW9tZXRyeSBmcm9tICcuLi9sb2FkX2dlb21ldHJ5LmpzJztcbmltcG9ydCB0b0V2YWx1YXRpb25GZWF0dXJlIGZyb20gJy4uL2V2YWx1YXRpb25fZmVhdHVyZS5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IHtsbmdGcm9tTWVyY2F0b3JYLCBsYXRGcm9tTWVyY2F0b3JZLCBtZXJjYXRvcllmcm9tTGF0fSBmcm9tICcuLi8uLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQge3N1YmRpdmlkZVBvbHlnb25zfSBmcm9tICcuLi8uLi91dGlsL3BvbHlnb25fY2xpcHBpbmcuanMnO1xuaW1wb3J0IHR5cGUge0NsaXBwZWRQb2x5Z29ufSBmcm9tICcuLi8uLi91dGlsL3BvbHlnb25fY2xpcHBpbmcuanMnO1xuaW1wb3J0IHR5cGUge1ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldFBhcmFtZXRlcnMsXG4gICAgQnVja2V0RmVhdHVyZSxcbiAgICBJbmRleGVkRmVhdHVyZSxcbiAgICBQb3B1bGF0ZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vYnVja2V0LmpzJztcblxuaW1wb3J0IHR5cGUgRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL2luZGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi4vLi4vc291cmNlL3NvdXJjZV9zdGF0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7U3ByaXRlUG9zaXRpb25zfSBmcm9tICcuLi8uLi91dGlsL2ltYWdlLmpzJztcbmltcG9ydCB0eXBlIHtQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZVRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHtlYXJ0aFJhZGl1c30gZnJvbSAnLi4vLi4vZ2VvL2xuZ19sYXQuanMnO1xuXG5jb25zdCBGQUNUT1IgPSBNYXRoLnBvdygyLCAxMyk7XG5cbi8vIEFsc28gZGVjbGFyZWQgaW4gX3ByZWx1ZGVfdGVycmFpbi52ZXJ0ZXguZ2xzbFxuLy8gVXNlZCB0byBzY2FsZSBtb3N0IGxpa2VseSBlbGV2YXRpb24gdmFsdWVzIHRvIGZpdCB3ZWxsIGluIGFuIHVpbnQxNlxuLy8gKEVsZXZhdGlvbiBvZiBEZWFkIFNlYSArIEVMRVZBVElPTl9PRkZTRVQpICogRUxFVkFUSU9OX1NDQUxFIGlzIHJvdWdobHkgMFxuLy8gKEhlaWdodCBvZiBtdCBldmVyZXN0ICsgRUxFVkFUSU9OX09GRlNFVCkgKiBFTEVWQVRJT05fU0NBTEUgaXMgcm91Z2hseSA2NGtcbmV4cG9ydCBjb25zdCBFTEVWQVRJT05fU0NBTEUgPSA3LjA7XG5leHBvcnQgY29uc3QgRUxFVkFUSU9OX09GRlNFVCA9IDQ1MDtcblxuZnVuY3Rpb24gYWRkVmVydGV4KHZlcnRleEFycmF5LCB4LCB5LCBueFJhdGlvLCBueVNpZ24sIG5vcm1hbFVwLCB0b3AsIGUpIHtcbiAgICB2ZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgLy8gYV9wb3Nfbm9ybWFsX2VkOlxuICAgICAgICAvLyBFbmNvZGUgdG9wIGFuZCBzaWRlL3VwIG5vcm1hbCB1c2luZyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0c1xuICAgICAgICAoeCA8PCAxKSArIHRvcCxcbiAgICAgICAgKHkgPDwgMSkgKyBub3JtYWxVcCxcbiAgICAgICAgLy8gZHhkeSBpcyBzaWduZWQsIGVuY29kZSBxdWFkcmFudCBpbmZvIHVzaW5nIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRcbiAgICAgICAgKE1hdGguZmxvb3IobnhSYXRpbyAqIEZBQ1RPUikgPDwgMSkgKyBueVNpZ24sXG4gICAgICAgIC8vIGVkZ2VkaXN0YW5jZSAodXNlZCBmb3Igd3JhcHBpbmcgcGF0dGVybnMgYXJvdW5kIGV4dHJ1c2lvbiBzaWRlcylcbiAgICAgICAgTWF0aC5yb3VuZChlKVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGFkZEdsb2JlRXh0VmVydGV4KHZlcnRleEFycmF5OiBGaWxsRXh0cnVzaW9uRXh0QXJyYXksIHBvczoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCBub3JtYWw6IFZlYzMpIHtcbiAgICBjb25zdCBlbmNvZGUgPSAxIDw8IDE0O1xuICAgIHZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICBwb3MueCwgcG9zLnksIHBvcy56LFxuICAgICAgICBub3JtYWxbMF0gKiBlbmNvZGUsIG5vcm1hbFsxXSAqIGVuY29kZSwgbm9ybWFsWzJdICogZW5jb2RlKTtcbn1cblxuY2xhc3MgUGFydE1ldGFkYXRhIHtcbiAgICBhY2M6IFBvaW50O1xuICAgIG1pbjogUG9pbnQ7XG4gICAgbWF4OiBQb2ludDtcbiAgICBwb2x5Q291bnQ6IEFycmF5PHtlZGdlczogbnVtYmVyLCB0b3A6IG51bWJlcn0+O1xuICAgIGN1cnJlbnRQb2x5Q291bnQ6IHtlZGdlczogbnVtYmVyLCB0b3A6IG51bWJlcn07XG4gICAgYm9yZGVyczogQXJyYXk8W251bWJlciwgbnVtYmVyXT47IC8vIEFycmF5PFttaW4sIG1heF0+XG4gICAgdmVydGV4QXJyYXlPZmZzZXQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFjYyA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICAgICAgdGhpcy5wb2x5Q291bnQgPSBbXTtcbiAgICB9XG5cbiAgICBzdGFydFJpbmcocDogUG9pbnQpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UG9seUNvdW50ID0ge2VkZ2VzOiAwLCB0b3A6IDB9O1xuICAgICAgICB0aGlzLnBvbHlDb3VudC5wdXNoKHRoaXMuY3VycmVudFBvbHlDb3VudCk7XG4gICAgICAgIGlmICh0aGlzLm1pbikgcmV0dXJuO1xuICAgICAgICB0aGlzLm1pbiA9IG5ldyBQb2ludChwLngsIHAueSk7XG4gICAgICAgIHRoaXMubWF4ID0gbmV3IFBvaW50KHAueCwgcC55KTtcbiAgICB9XG5cbiAgICBhcHBlbmQocDogUG9pbnQsIHByZXY6IFBvaW50KSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBvbHlDb3VudC5lZGdlcysrO1xuXG4gICAgICAgIHRoaXMuYWNjLl9hZGQocCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluLCBtYXggPSB0aGlzLm1heDtcbiAgICAgICAgaWYgKHAueCA8IG1pbi54KSB7XG4gICAgICAgICAgICBtaW4ueCA9IHAueDtcbiAgICAgICAgfSBlbHNlIGlmIChwLnggPiBtYXgueCkge1xuICAgICAgICAgICAgbWF4LnggPSBwLng7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAueSA8IG1pbi55KSB7XG4gICAgICAgICAgICBtaW4ueSA9IHAueTtcbiAgICAgICAgfSBlbHNlIGlmIChwLnkgPiBtYXgueSkge1xuICAgICAgICAgICAgbWF4LnkgPSBwLnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCgocC54ID09PSAwIHx8IHAueCA9PT0gRVhURU5UKSAmJiBwLnggPT09IHByZXYueCkgIT09ICgocC55ID09PSAwIHx8IHAueSA9PT0gRVhURU5UKSAmJiBwLnkgPT09IHByZXYueSkpIHtcbiAgICAgICAgICAgIC8vIEN1c3RvbSBkZWZpbmVkIGdlb2pzb24gYnVpbGRpbmdzIGFyZSBjdXQgb24gYm9yZGVycy4gUG9pbnRzIGFyZVxuICAgICAgICAgICAgLy8gcmVwZWF0ZWQgd2hlbiBlZGdlIGN1dHMgdGlsZSBjb3JuZXIgKHJlYXNvbiBmb3IgdXNpbmcgeG9yKS5cbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0JvcmRlck92ZXJsYXAocCwgcHJldik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgYm9yZGVyIGludGVyc2VjdGlvblxuICAgICAgICBpZiAoKHByZXYueCA8IDApICE9PSAocC54IDwgMCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQm9yZGVySW50ZXJzZWN0aW9uKDAsIGludGVycG9sYXRlKHByZXYueSwgcC55LCAoMCAtIHByZXYueCkgLyAocC54IC0gcHJldi54KSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgocHJldi54ID4gRVhURU5UKSAhPT0gKHAueCA+IEVYVEVOVCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQm9yZGVySW50ZXJzZWN0aW9uKDEsIGludGVycG9sYXRlKHByZXYueSwgcC55LCAoRVhURU5UIC0gcHJldi54KSAvIChwLnggLSBwcmV2LngpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChwcmV2LnkgPCAwKSAhPT0gKHAueSA8IDApKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEJvcmRlckludGVyc2VjdGlvbigyLCBpbnRlcnBvbGF0ZShwcmV2LngsIHAueCwgKDAgLSBwcmV2LnkpIC8gKHAueSAtIHByZXYueSkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHByZXYueSA+IEVYVEVOVCkgIT09IChwLnkgPiBFWFRFTlQpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEJvcmRlckludGVyc2VjdGlvbigzLCBpbnRlcnBvbGF0ZShwcmV2LngsIHAueCwgKEVYVEVOVCAtIHByZXYueSkgLyAocC55IC0gcHJldi55KSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkQm9yZGVySW50ZXJzZWN0aW9uKGluZGV4OiAwIHwgMSB8IDIgfCAzLCBpOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJvcmRlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYm9yZGVycyA9IFtcbiAgICAgICAgICAgICAgICBbTnVtYmVyLk1BWF9WQUxVRSwgLU51bWJlci5NQVhfVkFMVUVdLFxuICAgICAgICAgICAgICAgIFtOdW1iZXIuTUFYX1ZBTFVFLCAtTnVtYmVyLk1BWF9WQUxVRV0sXG4gICAgICAgICAgICAgICAgW051bWJlci5NQVhfVkFMVUUsIC1OdW1iZXIuTUFYX1ZBTFVFXSxcbiAgICAgICAgICAgICAgICBbTnVtYmVyLk1BWF9WQUxVRSwgLU51bWJlci5NQVhfVkFMVUVdXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGIgPSB0aGlzLmJvcmRlcnNbaW5kZXhdO1xuICAgICAgICBpZiAoaSA8IGJbMF0pIGJbMF0gPSBpO1xuICAgICAgICBpZiAoaSA+IGJbMV0pIGJbMV0gPSBpO1xuICAgIH1cblxuICAgIHByb2Nlc3NCb3JkZXJPdmVybGFwKHA6IFBvaW50LCBwcmV2OiBQb2ludCkge1xuICAgICAgICBpZiAocC54ID09PSBwcmV2LngpIHtcbiAgICAgICAgICAgIGlmIChwLnkgPT09IHByZXYueSkgcmV0dXJuOyAvLyBjdXN0b20gZGVmaW5lZCBnZW9qc29uIGNvdWxkIGhhdmUgcG9pbnRzIHJlcGVhdGVkLlxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwLnggPT09IDAgPyAwIDogMTtcbiAgICAgICAgICAgIHRoaXMuYWRkQm9yZGVySW50ZXJzZWN0aW9uKGluZGV4LCBwcmV2LnkpO1xuICAgICAgICAgICAgdGhpcy5hZGRCb3JkZXJJbnRlcnNlY3Rpb24oaW5kZXgsIHAueSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQocC55ID09PSBwcmV2LnkpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwLnkgPT09IDAgPyAyIDogMztcbiAgICAgICAgICAgIHRoaXMuYWRkQm9yZGVySW50ZXJzZWN0aW9uKGluZGV4LCBwcmV2LngpO1xuICAgICAgICAgICAgdGhpcy5hZGRCb3JkZXJJbnRlcnNlY3Rpb24oaW5kZXgsIHAueCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjZW50cm9pZCgpOiBQb2ludCB7XG4gICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5wb2x5Q291bnQucmVkdWNlKChhY2MsIHApID0+IGFjYyArIHAuZWRnZXMsIDApO1xuICAgICAgICByZXR1cm4gY291bnQgIT09IDAgPyB0aGlzLmFjYy5kaXYoY291bnQpLl9yb3VuZCgpIDogbmV3IFBvaW50KDAsIDApO1xuICAgIH1cblxuICAgIHNwYW4oKTogUG9pbnQge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KHRoaXMubWF4LnggLSB0aGlzLm1pbi54LCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSk7XG4gICAgfVxuXG4gICAgaW50ZXJzZWN0c0NvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvcmRlcnMucmVkdWNlKChhY2MsIHApID0+IGFjYyArICsocFswXSAhPT0gTnVtYmVyLk1BWF9WQUxVRSksIDApO1xuICAgIH1cbn1cblxuY2xhc3MgRmlsbEV4dHJ1c2lvbkJ1Y2tldCBpbXBsZW1lbnRzIEJ1Y2tldCB7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICB6b29tOiBudW1iZXI7XG4gICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQ7XG4gICAgb3ZlcnNjYWxpbmc6IG51bWJlcjtcbiAgICBlbmFibGVUZXJyYWluOiBib29sZWFuO1xuICAgIGxheWVyczogQXJyYXk8RmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXI+O1xuICAgIGxheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJzOiBBcnJheTxGaWxsRXh0cnVzaW9uU3R5bGVMYXllcj47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcklkczogQXJyYXk8c3RyaW5nPjtcblxuICAgIGxheW91dFZlcnRleEFycmF5OiBGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXk7XG4gICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBjZW50cm9pZFZlcnRleEFycmF5OiBGaWxsRXh0cnVzaW9uQ2VudHJvaWRBcnJheTtcbiAgICBjZW50cm9pZFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgbGF5b3V0VmVydGV4RXh0QXJyYXk6ID9GaWxsRXh0cnVzaW9uRXh0QXJyYXk7XG4gICAgbGF5b3V0VmVydGV4RXh0QnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuXG4gICAgaW5kZXhBcnJheTogVHJpYW5nbGVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIGhhc1BhdHRlcm46IGJvb2xlYW47XG4gICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb25zOiBQcm9ncmFtQ29uZmlndXJhdGlvblNldDxGaWxsRXh0cnVzaW9uU3R5bGVMYXllcj47XG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgdXBsb2FkZWQ6IGJvb2xlYW47XG4gICAgZmVhdHVyZXM6IEFycmF5PEJ1Y2tldEZlYXR1cmU+O1xuXG4gICAgZmVhdHVyZXNPbkJvcmRlcjogQXJyYXk8UGFydE1ldGFkYXRhPjtcbiAgICAvLyBib3JkZXJzIC8gYm9yZGVyRG9uZVdpdGhOZWlnaGJvclo6IDAgLSBsZWZ0LCAxLCByaWdodCwgMiAtIHRvcCwgMyAtIGJvdHRvbVxuICAgIGJvcmRlcnM6IEFycmF5PEFycmF5PG51bWJlcj4+OyAvLyBGb3IgZWFjaCBzaWRlLCBpbmRpY2VzIGludG8gZmVhdHVyZXNPbkJvcmRlciBhcnJheS5cbiAgICBib3JkZXJEb25lV2l0aE5laWdoYm9yWjogQXJyYXk8bnVtYmVyPjtcbiAgICBuZWVkc0NlbnRyb2lkVXBkYXRlOiBib29sZWFuO1xuICAgIHRpbGVUb01ldGVyOiBudW1iZXI7IC8vIGNhY2hlIGNvbnZlcnNpb24uXG4gICAgcHJvamVjdGlvbjogUHJvamVjdGlvblNwZWNpZmljYXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPEZpbGxFeHRydXNpb25TdHlsZUxheWVyPikge1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMuY2Fub25pY2FsID0gb3B0aW9ucy5jYW5vbmljYWw7XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnByb2plY3Rpb24gPSBvcHRpb25zLnByb2plY3Rpb247XG5cbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5jZW50cm9pZFZlcnRleEFycmF5ID0gbmV3IEZpbGxFeHRydXNpb25DZW50cm9pZEFycmF5KCk7XG4gICAgICAgIHRoaXMuaW5kZXhBcnJheSA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMgPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQob3B0aW9ucy5sYXllcnMsIG9wdGlvbnMuem9vbSk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXcgU2VnbWVudFZlY3RvcigpO1xuICAgICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoKGwpID0+IGwuaXNTdGF0ZURlcGVuZGVudCgpKS5tYXAoKGwpID0+IGwuaWQpO1xuICAgICAgICB0aGlzLmVuYWJsZVRlcnJhaW4gPSBvcHRpb25zLmVuYWJsZVRlcnJhaW47XG4gICAgfVxuXG4gICAgcG9wdWxhdGUoZmVhdHVyZXM6IEFycmF5PEluZGV4ZWRGZWF0dXJlPiwgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgdGlsZVRyYW5zZm9ybTogVGlsZVRyYW5zZm9ybSkge1xuICAgICAgICB0aGlzLmZlYXR1cmVzID0gW107XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGhhc1BhdHRlcm4oJ2ZpbGwtZXh0cnVzaW9uJywgdGhpcy5sYXllcnMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmZlYXR1cmVzT25Cb3JkZXIgPSBbXTtcbiAgICAgICAgdGhpcy5ib3JkZXJzID0gW1tdLCBbXSwgW10sIFtdXTtcbiAgICAgICAgdGhpcy5ib3JkZXJEb25lV2l0aE5laWdoYm9yWiA9IFstMSwgLTEsIC0xLCAtMV07XG4gICAgICAgIHRoaXMudGlsZVRvTWV0ZXIgPSB0aWxlVG9NZXRlcihjYW5vbmljYWwpO1xuXG4gICAgICAgIGZvciAoY29uc3Qge2ZlYXR1cmUsIGlkLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0gb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5lZWRHZW9tZXRyeSA9IHRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLm5lZWRHZW9tZXRyeTtcbiAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRpb25GZWF0dXJlID0gdG9FdmFsdWF0aW9uRmVhdHVyZShmZWF0dXJlLCBuZWVkR2VvbWV0cnkpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMubGF5ZXJzWzBdLl9mZWF0dXJlRmlsdGVyLmZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy56b29tKSwgZXZhbHVhdGlvbkZlYXR1cmUsIGNhbm9uaWNhbCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBidWNrZXRGZWF0dXJlOiBCdWNrZXRGZWF0dXJlID0ge1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IG5lZWRHZW9tZXRyeSA/IGV2YWx1YXRpb25GZWF0dXJlLmdlb21ldHJ5IDogbG9hZEdlb21ldHJ5KGZlYXR1cmUsIGNhbm9uaWNhbCwgdGlsZVRyYW5zZm9ybSksXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgICAgICBwYXR0ZXJuczoge31cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IHZlcnRleEFycmF5T2Zmc2V0ID0gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKGFkZFBhdHRlcm5EZXBlbmRlbmNpZXMoJ2ZpbGwtZXh0cnVzaW9uJywgdGhpcy5sYXllcnMsIGJ1Y2tldEZlYXR1cmUsIHRoaXMuem9vbSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoYnVja2V0RmVhdHVyZSwgYnVja2V0RmVhdHVyZS5nZW9tZXRyeSwgaW5kZXgsIGNhbm9uaWNhbCwge30sIG9wdGlvbnMuYXZhaWxhYmxlSW1hZ2VzLCB0aWxlVHJhbnNmb3JtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3B0aW9ucy5mZWF0dXJlSW5kZXguaW5zZXJ0KGZlYXR1cmUsIGJ1Y2tldEZlYXR1cmUuZ2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4LCB0aGlzLmluZGV4LCB2ZXJ0ZXhBcnJheU9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zb3J0Qm9yZGVycygpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmVzKG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIGltYWdlUG9zaXRpb25zOiBTcHJpdGVQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgdGlsZVRyYW5zZm9ybTogVGlsZVRyYW5zZm9ybSkge1xuICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgdGhpcy5mZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3Qge2dlb21ldHJ5fSA9IGZlYXR1cmU7XG4gICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoZmVhdHVyZSwgZ2VvbWV0cnksIGZlYXR1cmUuaW5kZXgsIGNhbm9uaWNhbCwgaW1hZ2VQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlcywgdGlsZVRyYW5zZm9ybSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zb3J0Qm9yZGVycygpO1xuICAgIH1cblxuICAgIHVwZGF0ZShzdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBpbWFnZVBvc2l0aW9uczogU3ByaXRlUG9zaXRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5wcm9ncmFtQ29uZmlndXJhdGlvbnMudXBkYXRlUGFpbnRBcnJheXMoc3RhdGVzLCB2dExheWVyLCB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJzLCBhdmFpbGFibGVJbWFnZXMsIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgdXBsb2FkUGVuZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnVwbG9hZGVkIHx8IHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy51cGxvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LCBsYXlvdXRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHRoaXMuaW5kZXhBcnJheSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxheW91dFZlcnRleEV4dEFycmF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhFeHRCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEV4dEFycmF5LCBmaWxsRXh0cnVzaW9uQXR0cmlidXRlc0V4dC5tZW1iZXJzLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHVwbG9hZENlbnRyb2lkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLmNlbnRyb2lkVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmNlbnRyb2lkVmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5jZW50cm9pZFZlcnRleEFycmF5LCBjZW50cm9pZEF0dHJpYnV0ZXMubWVtYmVycywgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5uZWVkc0NlbnRyb2lkVXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmNlbnRyb2lkVmVydGV4QnVmZmVyLnVwZGF0ZURhdGEodGhpcy5jZW50cm9pZFZlcnRleEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5lZWRzQ2VudHJvaWRVcGRhdGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0VmVydGV4QnVmZmVyKSByZXR1cm47XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKHRoaXMuY2VudHJvaWRWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY2VudHJvaWRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxheW91dFZlcnRleEV4dEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhFeHRCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIGluZGV4OiBudW1iZXIsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCBpbWFnZVBvc2l0aW9uczogU3ByaXRlUG9zaXRpb25zLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIHRpbGVUcmFuc2Zvcm06IFRpbGVUcmFuc2Zvcm0pIHtcbiAgICAgICAgY29uc3QgdGlsZUJvdW5kcyA9IFtuZXcgUG9pbnQoMCwgMCksIG5ldyBQb2ludChFWFRFTlQsIEVYVEVOVCldO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gdGlsZVRyYW5zZm9ybS5wcm9qZWN0aW9uO1xuICAgICAgICBjb25zdCBpc0dsb2JlID0gcHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnO1xuICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZW5hYmxlVGVycmFpbiAmJiAhaXNHbG9iZSA/IG5ldyBQYXJ0TWV0YWRhdGEoKSA6IG51bGw7XG5cbiAgICAgICAgaWYgKGlzR2xvYmUgJiYgIXRoaXMubGF5b3V0VmVydGV4RXh0QXJyYXkpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4RXh0QXJyYXkgPSBuZXcgRmlsbEV4dHJ1c2lvbkV4dEFycmF5KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb2x5Z29ucyA9IGNsYXNzaWZ5UmluZ3MoZ2VvbWV0cnksIEVBUkNVVF9NQVhfUklOR1MpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBwb2x5Z29ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgcG9seWdvbiA9IHBvbHlnb25zW2ldO1xuICAgICAgICAgICAgaWYgKHBvbHlnb24ubGVuZ3RoID09PSAwIHx8IGlzRW50aXJlbHlPdXRzaWRlKHBvbHlnb25bMF0pKSB7XG4gICAgICAgICAgICAgICAgcG9seWdvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNsaXBwZWRQb2x5Z29uczogQ2xpcHBlZFBvbHlnb25bXTtcbiAgICAgICAgaWYgKGlzR2xvYmUpIHtcbiAgICAgICAgICAgIC8vIFBlcmZvcm0gdGVzc2VsYXRpb24gZm9yIHBvbHlnb25zIG9mIHRpbGVzIGluIG9yZGVyIHRvIHN1cHBvcnQgbG9uZyBwbGFuYXJcbiAgICAgICAgICAgIC8vIHRyaWFuZ2xlcyBvbiB0aGUgY3VydmVkIHN1cmZhY2Ugb2YgdGhlIGdsb2JlLiBUaGlzIGlzIGRvbmUgZm9yIGFsbCBwb2x5Z29uc1xuICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB0aGVpciBzaXplIGluIG9yZGVyIGd1YXJhbnRlZSBpZGVudGljYWwgcmVzdWx0cyBvbiBhbGwgc2lkZXMgb2ZcbiAgICAgICAgICAgIC8vIHRpbGUgYm91bmRhcmllcy5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgZ2xvYmUgaXMgc3ViZGl2aWRlZCBpbnRvIGEgMzJ4MTYgZ3JpZC4gVGhlIG51bWJlciBvZiBzdWJkaXZpc2lvbnMgZG9uZVxuICAgICAgICAgICAgLy8gZm9yIGEgdGlsZSBkZXBlbmRzIG9uIHRoZSB6b29tIGxldmVsLiBGb3IgZXhhbXBsZSB0aWxlIHdpdGggej0wIHJlcXVpcmVzIDLigbRcbiAgICAgICAgICAgIC8vIHN1YmRpdmlzaW9ucywgdGlsZSB3aXRoIHo9MSAywrMgZXRjLiBUaGUgc3ViZGl2aXNpb24gaXMgZG9uZSBpbiBwb2xhciBjb29yZGluYXRlc1xuICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiB0aWxlIGNvb3JkaW5hdGVzLlxuICAgICAgICAgICAgY2xpcHBlZFBvbHlnb25zID0gcmVzYW1wbGVGaWxsRXh0cnVzaW9uUG9seWdvbnNGb3JHbG9iZShwb2x5Z29ucywgdGlsZUJvdW5kcywgY2Fub25pY2FsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsaXBwZWRQb2x5Z29ucyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2x5Z29uIG9mIHBvbHlnb25zKSB7XG4gICAgICAgICAgICAgICAgY2xpcHBlZFBvbHlnb25zLnB1c2goe3BvbHlnb24sIGJvdW5kczogdGlsZUJvdW5kc30pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBjbGlwcGVkUG9seWdvbiBvZiBjbGlwcGVkUG9seWdvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvbHlnb24gPSBjbGlwcGVkUG9seWdvbi5wb2x5Z29uO1xuICAgICAgICAgICAgbGV0IG51bVZlcnRpY2VzID0gMDtcbiAgICAgICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudCg0LCB0aGlzLmxheW91dFZlcnRleEFycmF5LCB0aGlzLmluZGV4QXJyYXkpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb24ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByaW5nID0gcG9seWdvbltpXTtcbiAgICAgICAgICAgICAgICBpZiAocmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG51bVZlcnRpY2VzICs9IHJpbmcubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgbGV0IGVkZ2VEaXN0YW5jZSA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhKSBtZXRhZGF0YS5zdGFydFJpbmcocmluZ1swXSk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHJpbmcubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcDEgPSByaW5nW3BdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHAyID0gcmluZ1twIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQm91bmRhcnlFZGdlKHAxLCBwMiwgY2xpcHBlZFBvbHlnb24uYm91bmRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YSkgbWV0YWRhdGEuYXBwZW5kKHAxLCBwMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQudmVydGV4TGVuZ3RoICsgNCA+IFNlZ21lbnRWZWN0b3IuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCA9IHRoaXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkID0gcDEuc3ViKHAyKS5fcGVycCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdpdmVuIHRoYXQgbnogPT09IDAsIGVuY29kZSBueCAvIChhYnMobngpICsgYWJzKG55KSkgYW5kIHNpZ25zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaW5mb3JtYXRpb24gaXMgc3VmZmljaWVudCB0byByZWNvbnN0cnVjdCBub3JtYWwgdmVjdG9yIGluIHZlcnRleCBzaGFkZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbnhSYXRpbyA9IGQueCAvIChNYXRoLmFicyhkLngpICsgTWF0aC5hYnMoZC55KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbnlTaWduID0gZC55ID4gMCA/IDEgOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3QgPSBwMi5kaXN0KHAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWRnZURpc3RhbmNlICsgZGlzdCA+IDMyNzY4KSBlZGdlRGlzdGFuY2UgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmVydGV4KHRoaXMubGF5b3V0VmVydGV4QXJyYXksIHAxLngsIHAxLnksIG54UmF0aW8sIG55U2lnbiwgMCwgMCwgZWRnZURpc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgcDEueCwgcDEueSwgbnhSYXRpbywgbnlTaWduLCAwLCAxLCBlZGdlRGlzdGFuY2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZURpc3RhbmNlICs9IGRpc3Q7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgcDIueCwgcDIueSwgbnhSYXRpbywgbnlTaWduLCAwLCAwLCBlZGdlRGlzdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleCh0aGlzLmxheW91dFZlcnRleEFycmF5LCBwMi54LCBwMi55LCBueFJhdGlvLCBueVNpZ24sIDAsIDEsIGVkZ2VEaXN0YW5jZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3R0b21SaWdodCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g4pSCIDAgIDEg4pSCIENvdW50ZXItY2xvY2t3aXNlIHdpbmRpbmcgb3JkZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g4pSCICAgICAg4pSCIFRyaWFuZ2xlIDE6IDAgPT4gMiA9PiAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g4pSCIDIgIDMg4pSCIFRyaWFuZ2xlIDI6IDEgPT4gMiA9PiAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGJvdHRvbVJpZ2h0LCBib3R0b21SaWdodCArIDIsIGJvdHRvbVJpZ2h0ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleEFycmF5LmVtcGxhY2VCYWNrKGJvdHRvbVJpZ2h0ICsgMSwgYm90dG9tUmlnaHQgKyAyLCBib3R0b21SaWdodCArIDMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSAyO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR2xvYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXk6IGFueSA9IHRoaXMubGF5b3V0VmVydGV4RXh0QXJyYXk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkUDEgPSBwcm9qZWN0aW9uLnByb2plY3RUaWxlUG9pbnQocDEueCwgcDEueSwgY2Fub25pY2FsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkUDIgPSBwcm9qZWN0aW9uLnByb2plY3RUaWxlUG9pbnQocDIueCwgcDIueSwgY2Fub25pY2FsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuMSA9IHByb2plY3Rpb24udXBWZWN0b3IoY2Fub25pY2FsLCBwMS54LCBwMS55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbjIgPSBwcm9qZWN0aW9uLnVwVmVjdG9yKGNhbm9uaWNhbCwgcDIueCwgcDIueSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkR2xvYmVFeHRWZXJ0ZXgoYXJyYXksIHByb2plY3RlZFAxLCBuMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEdsb2JlRXh0VmVydGV4KGFycmF5LCBwcm9qZWN0ZWRQMSwgbjEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRHbG9iZUV4dFZlcnRleChhcnJheSwgcHJvamVjdGVkUDIsIG4yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkR2xvYmVFeHRWZXJ0ZXgoYXJyYXksIHByb2plY3RlZFAyLCBuMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VnbWVudC52ZXJ0ZXhMZW5ndGggKyBudW1WZXJ0aWNlcyA+IFNlZ21lbnRWZWN0b3IuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudChudW1WZXJ0aWNlcywgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9Pbmx5IHRyaWFuZ3VsYXRlIGFuZCBkcmF3IHRoZSBhcmVhIG9mIHRoZSBmZWF0dXJlIGlmIGl0IGlzIGEgcG9seWdvblxuICAgICAgICAgICAgLy9PdGhlciBmZWF0dXJlIHR5cGVzIChlLmcuIExpbmVTdHJpbmcpIGRvIG5vdCBoYXZlIGFyZWEsIHNvIHRyaWFuZ3VsYXRpb24gaXMgcG9pbnRsZXNzIC8gdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAodmVjdG9yVGlsZUZlYXR1cmVUeXBlc1tmZWF0dXJlLnR5cGVdICE9PSAnUG9seWdvbicpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaG9sZUluZGljZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHRyaWFuZ2xlSW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmluZyA9IHBvbHlnb25baV07XG4gICAgICAgICAgICAgICAgaWYgKHJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyaW5nICE9PSBwb2x5Z29uWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvbGVJbmRpY2VzLnB1c2goZmxhdHRlbmVkLmxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gcmluZ1tpXTtcblxuICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgcC54LCBwLnksIDAsIDAsIDEsIDEsIDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHAueCk7XG4gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHAueSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YSkgbWV0YWRhdGEuY3VycmVudFBvbHlDb3VudC50b3ArKztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNHbG9iZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXk6IGFueSA9IHRoaXMubGF5b3V0VmVydGV4RXh0QXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0ZWRQID0gcHJvamVjdGlvbi5wcm9qZWN0VGlsZVBvaW50KHAueCwgcC55LCBjYW5vbmljYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHByb2plY3Rpb24udXBWZWN0b3IoY2Fub25pY2FsLCBwLngsIHAueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRHbG9iZUV4dFZlcnRleChhcnJheSwgcHJvamVjdGVkUCwgbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBlYXJjdXQoZmxhdHRlbmVkLCBob2xlSW5kaWNlcyk7XG4gICAgICAgICAgICBhc3NlcnQoaW5kaWNlcy5sZW5ndGggJSAzID09PSAwKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRpY2VzLmxlbmd0aDsgaiArPSAzKSB7XG4gICAgICAgICAgICAgICAgLy8gQ291bnRlci1jbG9ja3dpc2Ugd2luZGluZyBvcmRlci5cbiAgICAgICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2pdLFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tqICsgMl0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2ogKyAxXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IGluZGljZXMubGVuZ3RoIC8gMztcbiAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IG51bVZlcnRpY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KCFpc0dsb2JlIHx8ICh0aGlzLmxheW91dFZlcnRleEV4dEFycmF5ICYmIHRoaXMubGF5b3V0VmVydGV4RXh0QXJyYXkubGVuZ3RoID09PSB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCkpO1xuXG4gICAgICAgIGlmIChtZXRhZGF0YSAmJiBtZXRhZGF0YS5wb2x5Q291bnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gV2hlbiBidWlsZGluZyBpcyBzcGxpdCBiZXR3ZWVuIHRpbGVzLCBkb24ndCBoYW5kbGUgZmxhdCByb29mcyBoZXJlLlxuICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmJvcmRlcnMpIHtcbiAgICAgICAgICAgICAgICAvLyBTdG9yZSB0byB0aGUgYnVja2V0LiBGbGF0IHJvb2ZzIGFyZSBoYW5kbGVkIGluIGZsYXRSb29mc1VwZGF0ZSxcbiAgICAgICAgICAgICAgICAvLyBhZnRlciBqb2luaW5nIHBhcnRzIHRoYXQgbGF5IGluIGRpZmZlcmVudCBidWNrZXRzLlxuICAgICAgICAgICAgICAgIG1ldGFkYXRhLnZlcnRleEFycmF5T2Zmc2V0ID0gdGhpcy5jZW50cm9pZFZlcnRleEFycmF5Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBib3JkZXJzID0gbWV0YWRhdGEuYm9yZGVycztcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZmVhdHVyZXNPbkJvcmRlci5wdXNoKG1ldGFkYXRhKSAtIDE7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvcmRlcnNbaV1bMF0gIT09IE51bWJlci5NQVhfVkFMVUUpIHsgdGhpcy5ib3JkZXJzW2ldLnB1c2goaW5kZXgpOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbmNvZGVDZW50cm9pZChtZXRhZGF0YS5ib3JkZXJzID8gdW5kZWZpbmVkIDogbWV0YWRhdGEuY2VudHJvaWQoKSwgbWV0YWRhdGEpO1xuICAgICAgICAgICAgYXNzZXJ0KCF0aGlzLmNlbnRyb2lkVmVydGV4QXJyYXkubGVuZ3RoIHx8IHRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheS5sZW5ndGggPT09IHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUsIGluZGV4LCBpbWFnZVBvc2l0aW9ucywgYXZhaWxhYmxlSW1hZ2VzLCBjYW5vbmljYWwpO1xuICAgIH1cblxuICAgIHNvcnRCb3JkZXJzKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgLy8gU29ydCBieSBib3JkZXIgaW50ZXJzZWN0aW9uIGFyZWEgbWluaW11bXMsIGFzY2VuZGluZy5cbiAgICAgICAgICAgIHRoaXMuYm9yZGVyc1tpXS5zb3J0KChhLCBiKSA9PiB0aGlzLmZlYXR1cmVzT25Cb3JkZXJbYV0uYm9yZGVyc1tpXVswXSAtIHRoaXMuZmVhdHVyZXNPbkJvcmRlcltiXS5ib3JkZXJzW2ldWzBdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVuY29kZUNlbnRyb2lkKGM6IFBvaW50LCBtZXRhZGF0YTogUGFydE1ldGFkYXRhLCBhcHBlbmQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIGxldCB4LCB5O1xuICAgICAgICAvLyBFbmNvZGVkIGNlbnRyb2lkIHggYW5kIHk6XG4gICAgICAgIC8vICAgICB4ICAgICB5XG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyAgICAgMCAgICAgMCAgICBEZWZhdWx0LCBubyBmbGF0IHJvb2YuXG4gICAgICAgIC8vICAgICAwICAgICAxICAgIEhpZGUsIHVzZWQgdG8gaGlkZSBwYXJ0cyBvZiBidWlsZGluZ3Mgb24gYm9yZGVyIHdoaWxlIGV4cGVjdGluZyB0aGUgb3RoZXIgc2lkZSB0byBnZXQgbG9hZGVkXG4gICAgICAgIC8vICAgID4wICAgICAwICAgIEVsZXZhdGlvbiBlbmNvZGVkIHRvIHVpbnQxNiB3b3JkXG4gICAgICAgIC8vICAgID4wICAgID4wICAgIEVuY29kZWQgY2VudHJvaWQgcG9zaXRpb24gYW5kIHggJiB5IHNwYW5cbiAgICAgICAgaWYgKGMpIHtcbiAgICAgICAgICAgIGlmIChjLnkgIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGFuID0gbWV0YWRhdGEuc3BhbigpLl9tdWx0KHRoaXMudGlsZVRvTWV0ZXIpO1xuICAgICAgICAgICAgICAgIHggPSAoTWF0aC5tYXgoYy54LCAxKSA8PCAzKSArIE1hdGgubWluKDcsIE1hdGgucm91bmQoc3Bhbi54IC8gMTApKTtcbiAgICAgICAgICAgICAgICB5ID0gKE1hdGgubWF4KGMueSwgMSkgPDwgMykgKyBNYXRoLm1pbig3LCBNYXRoLnJvdW5kKHNwYW4ueSAvIDEwKSk7XG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBlbmNvZGUgaGVpZ2h0OlxuICAgICAgICAgICAgICAgIHggPSBNYXRoLmNlaWwoKGMueCArIEVMRVZBVElPTl9PRkZTRVQpICogRUxFVkFUSU9OX1NDQUxFKTtcbiAgICAgICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgaW1wb3NzaWJsZSBzaXR1YXRpb24gKGJ1aWxkaW5nIHRoYXQgaGFzIHdpZHRoIGFuZCBkb2Vzbid0IGNyb3NzIGJvcmRlciBjYW5ub3QgaGF2ZSBjZW50cm9pZFxuICAgICAgICAgICAgLy8gYXQgYm9yZGVyKSB0byBlbmNvZGUgdW5wcm9jZXNzZWQgYm9yZGVyIGJ1aWxkaW5nOiBpdCBpcyBpbml0aWFsbHkgKGFwcGVuZCA9PT0gdHJ1ZSkgaGlkZGVuIHVudGlsXG4gICAgICAgICAgICAvLyBjb21wdXRpbmcgY2VudHJvaWQgZm9yIGpvaW5lZCBidWlsZGluZyBwYXJ0cyBpbiByZW5kZXJpbmcgdGhyZWFkIChmbGF0Um9vZnNVcGRhdGUpLiBJZiBpdCBpbnRlcnNlY3RzIG1vcmUgdGhhblxuICAgICAgICAgICAgLy8gdHdvIGJvcmRlcnMsIGZsYXQgcm9vZiBhcHByb2FjaCBpcyBub3QgYXBwbGllZC5cbiAgICAgICAgICAgIHggPSAwO1xuICAgICAgICAgICAgeSA9ICthcHBlbmQ7IC8vIEhpZGUgKDEpIGluaXRpYWxseSB3aGVuIGNyZWF0aW5nIC0gdmlzaWJpbGl0eSBpcyBjaGFuZ2VkIGluIGRyYXdfZmlsbF9leHRydXNpb24gYXMgc29vbiBhcyBuZWlnaGJvciB0aWxlIGdldHMgbG9hZGVkLlxuICAgICAgICB9XG5cbiAgICAgICAgYXNzZXJ0KGFwcGVuZCB8fCBtZXRhZGF0YS52ZXJ0ZXhBcnJheU9mZnNldCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgbGV0IG9mZnNldCA9IGFwcGVuZCA/IHRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheS5sZW5ndGggOiBtZXRhZGF0YS52ZXJ0ZXhBcnJheU9mZnNldDtcbiAgICAgICAgZm9yIChjb25zdCBwb2x5SW5mbyBvZiBtZXRhZGF0YS5wb2x5Q291bnQpIHtcbiAgICAgICAgICAgIGlmIChhcHBlbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNlbnRyb2lkVmVydGV4QXJyYXkucmVzaXplKHRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheS5sZW5ndGggKyBwb2x5SW5mby5lZGdlcyAqIDQgKyBwb2x5SW5mby50b3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5SW5mby5lZGdlcyAqIDI7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2VudHJvaWRWZXJ0ZXhBcnJheS5lbXBsYWNlKG9mZnNldCsrLCAwLCB5KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNlbnRyb2lkVmVydGV4QXJyYXkuZW1wbGFjZShvZmZzZXQrKywgeCwgeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlJbmZvLnRvcDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZW50cm9pZFZlcnRleEFycmF5LmVtcGxhY2Uob2Zmc2V0KyssIHgsIHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5yZWdpc3RlcihGaWxsRXh0cnVzaW9uQnVja2V0LCAnRmlsbEV4dHJ1c2lvbkJ1Y2tldCcsIHtvbWl0OiBbJ2xheWVycycsICdmZWF0dXJlcyddfSk7XG5yZWdpc3RlcihQYXJ0TWV0YWRhdGEsICdQYXJ0TWV0YWRhdGEnKTtcblxuZXhwb3J0IGRlZmF1bHQgRmlsbEV4dHJ1c2lvbkJ1Y2tldDtcblxuZnVuY3Rpb24gaXNCb3VuZGFyeUVkZ2UocDEsIHAyLCBib3VuZHMpIHtcbiAgICByZXR1cm4gKHAxLnggPT09IHAyLnggJiYgKHAxLnggPCBib3VuZHNbMF0ueCB8fCBwMS54ID4gYm91bmRzWzFdLngpKSB8fFxuICAgICAgICAgICAocDEueSA9PT0gcDIueSAmJiAocDEueSA8IGJvdW5kc1swXS55IHx8IHAxLnkgPiBib3VuZHNbMV0ueSkpO1xufVxuXG5mdW5jdGlvbiBpc0VudGlyZWx5T3V0c2lkZShyaW5nKSB7XG4gICAgLy8gRGlzY2FyZCByaW5ncyB3aXRoIGNvcm5lcnMgb24gYm9yZGVyIGlmIGFsbCBvdGhlciB2ZXJ0aWNlcyBhcmUgb3V0c2lkZTogdGhleSBnZXQgZGVmaW5lZFxuICAgIC8vIGFsc28gaW4gdGhlIHRpbGUgYWNyb3NzIHRoZSBib3JkZXIuIEV2ZW50dWFsIHplcm8gYXJlYSByaW5ncyBhdCBib3JkZXIgYXJlIGRpc2NhcmRlZCBieSBjbGFzc2lmeVJpbmdzXG4gICAgLy8gYW5kIHRoZXJlIGlzIG5vIG5lZWQgdG8gaGFuZGxlIHRoYXQgY2FzZSBoZXJlLlxuICAgIHJldHVybiByaW5nLmV2ZXJ5KHAgPT4gcC54IDw9IDApIHx8XG4gICAgICAgIHJpbmcuZXZlcnkocCA9PiBwLnggPj0gRVhURU5UKSB8fFxuICAgICAgICByaW5nLmV2ZXJ5KHAgPT4gcC55IDw9IDApIHx8XG4gICAgICAgIHJpbmcuZXZlcnkocCA9PiBwLnkgPj0gRVhURU5UKTtcbn1cblxuZnVuY3Rpb24gdGlsZVRvTWV0ZXIoY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICBjb25zdCBjaXJjdW1mZXJlbmNlQXRFcXVhdG9yID0gNDAwNzUwMTc7XG4gICAgY29uc3QgbWVyY2F0b3JZID0gY2Fub25pY2FsLnkgLyAoMSA8PCBjYW5vbmljYWwueik7XG4gICAgY29uc3QgZXhwID0gTWF0aC5leHAoTWF0aC5QSSAqICgxIC0gMiAqIG1lcmNhdG9yWSkpO1xuICAgIC8vIHNpbXBsaWZ5IGNvcygyICogYXRhbihlKSAtIFBJLzIpIGZyb20gbWVyY2F0b3JfY29vcmRpbmF0ZS5qcywgcmVtb3ZlIHRyaWdvbm9tZXRyaWNzLlxuICAgIHJldHVybiBjaXJjdW1mZXJlbmNlQXRFcXVhdG9yICogMiAqIGV4cCAvIChleHAgKiBleHAgKyAxKSAvIEVYVEVOVCAvICgxIDw8IGNhbm9uaWNhbC56KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGxFeHRydXNpb25IZWlnaHRMaWZ0KCk6IG51bWJlciB7XG4gICAgLy8gQSByZWN0YW5nbGUgY292ZXJpbmcgZ2xvYmUgaXMgc3ViZGl2aWRlZCBpbnRvIGEgZ3JpZCBvZiAzMiBjZWxsc1xuICAgIC8vIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgdG8gZGVkdWNlIGEgbWluaW11bSBsaWZ0IHZhbHVlIHNvIHRoYXRcbiAgICAvLyBmaWxsIGV4dHJ1c2lvbnMgd2l0aCAwIGhlaWdodCB3aWxsIG5ldmVyIGdvIGJlbG93IHRoZSBncm91bmQuXG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLlBJIC8gMzIuMDtcbiAgICBjb25zdCB0YW5BbmdsZSA9IE1hdGgudGFuKGFuZ2xlKTtcbiAgICBjb25zdCByID0gZWFydGhSYWRpdXM7XG4gICAgcmV0dXJuIHIgKiBNYXRoLnNxcnQoMS4wICsgMi4wICogdGFuQW5nbGUgKiB0YW5BbmdsZSkgLSByO1xufVxuXG4vLyBSZXNhbXBsZXMgZmlsbCBleHRydXNpb24gcG9seWdvbnMgYnkgc3ViZGl2aWRpbmcgdGhlbSBpbnRvIDMyeDE2IGNlbGxzIGluIG1lcmNhdG9yIHNwYWNlLlxuLy8gVGhlIGlkZWEgaXMgdG8gYWxsb3cgcmVwcm9qZWN0aW9uIG9mIGxhcmdlIGNvbnRpbnVvdXMgcGxhbmFyIHNoYXBlcyBvbiB0aGUgc3VyZmFjZSBvZiB0aGUgZ2xvYmVcbmV4cG9ydCBmdW5jdGlvbiByZXNhbXBsZUZpbGxFeHRydXNpb25Qb2x5Z29uc0Zvckdsb2JlKHBvbHlnb25zOiBQb2ludFtdW11bXSwgdGlsZUJvdW5kczogW1BvaW50LCBQb2ludF0sIHRpbGVJRDogQ2Fub25pY2FsVGlsZUlEKTogQ2xpcHBlZFBvbHlnb25bXSB7XG4gICAgY29uc3QgY2VsbENvdW50ID0gMzYwLjAgLyAzMi4wO1xuICAgIGNvbnN0IHRpbGVzID0gMSA8PCB0aWxlSUQuejtcbiAgICBjb25zdCBsZWZ0TG5nID0gbG5nRnJvbU1lcmNhdG9yWCh0aWxlSUQueCAvIHRpbGVzKTtcbiAgICBjb25zdCByaWdodExuZyA9IGxuZ0Zyb21NZXJjYXRvclgoKHRpbGVJRC54ICsgMSkgLyB0aWxlcyk7XG4gICAgY29uc3QgdG9wTGF0ID0gbGF0RnJvbU1lcmNhdG9yWSh0aWxlSUQueSAvIHRpbGVzKTtcbiAgICBjb25zdCBib3R0b21MYXQgPSBsYXRGcm9tTWVyY2F0b3JZKCh0aWxlSUQueSArIDEpIC8gdGlsZXMpO1xuICAgIGNvbnN0IGNlbGxDb3VudE9uWEF4aXMgPSBNYXRoLmNlaWwoKHJpZ2h0TG5nIC0gbGVmdExuZykgLyBjZWxsQ291bnQpO1xuICAgIGNvbnN0IGNlbGxDb3VudE9uWUF4aXMgPSBNYXRoLmNlaWwoKHRvcExhdCAtIGJvdHRvbUxhdCkgLyBjZWxsQ291bnQpO1xuXG4gICAgY29uc3Qgc3BsaXRGbiA9IChheGlzLCBtaW4sIG1heCkgPT4ge1xuICAgICAgICBpZiAoYXhpcyA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDAuNSAqIChtaW4gKyBtYXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWF4TGF0ID0gbGF0RnJvbU1lcmNhdG9yWSgodGlsZUlELnkgKyBtaW4gLyBFWFRFTlQpIC8gdGlsZXMpO1xuICAgICAgICAgICAgY29uc3QgbWluTGF0ID0gbGF0RnJvbU1lcmNhdG9yWSgodGlsZUlELnkgKyBtYXggLyBFWFRFTlQpIC8gdGlsZXMpO1xuICAgICAgICAgICAgY29uc3QgbWlkTGF0ID0gMC41ICogKG1pbkxhdCArIG1heExhdCk7XG4gICAgICAgICAgICByZXR1cm4gKG1lcmNhdG9yWWZyb21MYXQobWlkTGF0KSAqIHRpbGVzIC0gdGlsZUlELnkpICogRVhURU5UO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBzdWJkaXZpZGVQb2x5Z29ucyhwb2x5Z29ucywgdGlsZUJvdW5kcywgY2VsbENvdW50T25YQXhpcywgY2VsbENvdW50T25ZQXhpcywgMS4wLCBzcGxpdEZuKTtcbn1cbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gQGZsb3dcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcblxuaW1wb3J0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBDb2xvclJhbXBQcm9wZXJ0eVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcblxuaW1wb3J0IHR5cGUgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiPixcbiAgICBcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIjogQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eTxSZXNvbHZlZEltYWdlPixcbiAgICBcImZpbGwtZXh0cnVzaW9uLWhlaWdodFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImZpbGwtZXh0cnVzaW9uLWJhc2VcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi12ZXJ0aWNhbC1ncmFkaWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbnx9O1xuXG5jb25zdCBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tb3BhY2l0eVwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tY29sb3JcIl0pLFxuICAgIFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZVwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwiZmlsbC1leHRydXNpb24tcGF0dGVyblwiOiBuZXcgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9maWxsLWV4dHJ1c2lvblwiXVtcImZpbGwtZXh0cnVzaW9uLXBhdHRlcm5cIl0pLFxuICAgIFwiZmlsbC1leHRydXNpb24taGVpZ2h0XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIl0pLFxuICAgIFwiZmlsbC1leHRydXNpb24tYmFzZVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2ZpbGwtZXh0cnVzaW9uXCJdW1wiZmlsbC1leHRydXNpb24tYmFzZVwiXSksXG4gICAgXCJmaWxsLWV4dHJ1c2lvbi12ZXJ0aWNhbC1ncmFkaWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfZmlsbC1leHRydXNpb25cIl1bXCJmaWxsLWV4dHJ1c2lvbi12ZXJ0aWNhbC1ncmFkaWVudFwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiZXhwb3J0IHsgZ2V0VVJMLCBnZXRUaWxlQkJveCwgZ2V0TWVyY0Nvb3JkcyB9O1xuXG5cbi8qKlxuICogZ2V0VVJMXG4gKlxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBiYXNlVXJsICBCYXNlIHVybCBvZiB0aGUgV01TIHNlcnZlclxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBsYXllciAgICBMYXllciBuYW1lXG4gKiBAcGFyYW0gICAge051bWJlcn0gIHggICAgICAgIFRpbGUgY29vcmRpbmF0ZSB4XG4gKiBAcGFyYW0gICAge051bWJlcn0gIHkgICAgICAgIFRpbGUgY29vcmRpbmF0ZSB5XG4gKiBAcGFyYW0gICAge051bWJlcn0gIHogICAgICAgIFRpbGUgem9vbVxuICogQHBhcmFtICAgIHtPYmplY3R9ICBbb3B0aW9uc11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMuZm9ybWF0PSdpbWFnZS9wbmcnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5zZXJ2aWNlPSdXTVMnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy52ZXJzaW9uPScxLjEuMSddXG4gKiBAcGFyYW0gICAge1N0cmluZ30gIFtvcHRpb25zLnJlcXVlc3Q9J0dldE1hcCddXG4gKiBAcGFyYW0gICAge1N0cmluZ30gIFtvcHRpb25zLnNycz0nRVBTRzozODU3J11cbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgW29wdGlvbnMud2lkdGg9JzI1NiddXG4gKiBAcGFyYW0gICAge051bWJlcn0gIFtvcHRpb25zLmhlaWdodD0nMjU2J11cbiAqIEByZXR1cm5zICB7U3RyaW5nfSAgdXJsXG4gKiBAZXhhbXBsZVxuICogdmFyIGJhc2VVcmwgPSAnaHR0cDovL2dlb2RhdGEuc3RhdGUubmoudXMvaW1hZ2VyeXdtcy9OYXR1cmFsMjAxNSc7XG4gKiB2YXIgbGF5ZXIgPSAnTmF0dXJhbDIwMTUnO1xuICogdmFyIHVybCA9IHdob290cy5nZXRVUkwoYmFzZVVybCwgbGF5ZXIsIDE1NDMwOCwgMTk3MTY3LCAxOSk7XG4gKi9cbmZ1bmN0aW9uIGdldFVSTChiYXNlVXJsLCBsYXllciwgeCwgeSwgeiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgdmFyIHVybCA9IGJhc2VVcmwgKyAnPycgKyBbXG4gICAgICAgICdiYm94PScgICAgKyBnZXRUaWxlQkJveCh4LCB5LCB6KSxcbiAgICAgICAgJ2Zvcm1hdD0nICArIChvcHRpb25zLmZvcm1hdCB8fCAnaW1hZ2UvcG5nJyksXG4gICAgICAgICdzZXJ2aWNlPScgKyAob3B0aW9ucy5zZXJ2aWNlIHx8ICdXTVMnKSxcbiAgICAgICAgJ3ZlcnNpb249JyArIChvcHRpb25zLnZlcnNpb24gfHwgJzEuMS4xJyksXG4gICAgICAgICdyZXF1ZXN0PScgKyAob3B0aW9ucy5yZXF1ZXN0IHx8ICdHZXRNYXAnKSxcbiAgICAgICAgJ3Nycz0nICAgICArIChvcHRpb25zLnNycyB8fCAnRVBTRzozODU3JyksXG4gICAgICAgICd3aWR0aD0nICAgKyAob3B0aW9ucy53aWR0aCB8fCAyNTYpLFxuICAgICAgICAnaGVpZ2h0PScgICsgKG9wdGlvbnMuaGVpZ2h0IHx8IDI1NiksXG4gICAgICAgICdsYXllcnM9JyAgKyBsYXllclxuICAgIF0uam9pbignJicpO1xuXG4gICAgcmV0dXJuIHVybDtcbn1cblxuXG4vKipcbiAqIGdldFRpbGVCQm94XG4gKlxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB4ICBUaWxlIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICBUaWxlIGNvb3JkaW5hdGUgeVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB6ICBUaWxlIHpvb21cbiAqIEByZXR1cm5zICB7U3RyaW5nfSAgU3RyaW5nIG9mIHRoZSBib3VuZGluZyBib3hcbiAqL1xuZnVuY3Rpb24gZ2V0VGlsZUJCb3goeCwgeSwgeikge1xuICAgIC8vIGZvciBHb29nbGUvT1NNIHRpbGUgc2NoZW1lIHdlIG5lZWQgdG8gYWx0ZXIgdGhlIHlcbiAgICB5ID0gKE1hdGgucG93KDIsIHopIC0geSAtIDEpO1xuXG4gICAgdmFyIG1pbiA9IGdldE1lcmNDb29yZHMoeCAqIDI1NiwgeSAqIDI1NiwgeiksXG4gICAgICAgIG1heCA9IGdldE1lcmNDb29yZHMoKHggKyAxKSAqIDI1NiwgKHkgKyAxKSAqIDI1Niwgeik7XG5cbiAgICByZXR1cm4gbWluWzBdICsgJywnICsgbWluWzFdICsgJywnICsgbWF4WzBdICsgJywnICsgbWF4WzFdO1xufVxuXG5cbi8qKlxuICogZ2V0TWVyY0Nvb3Jkc1xuICpcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeCAgUGl4ZWwgY29vcmRpbmF0ZSB4XG4gKiBAcGFyYW0gICAge051bWJlcn0gIHkgIFBpeGVsIGNvb3JkaW5hdGUgeVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB6ICBUaWxlIHpvb21cbiAqIEByZXR1cm5zICB7QXJyYXl9ICAgW3gsIHldXG4gKi9cbmZ1bmN0aW9uIGdldE1lcmNDb29yZHMoeCwgeSwgeikge1xuICAgIHZhciByZXNvbHV0aW9uID0gKDIgKiBNYXRoLlBJICogNjM3ODEzNyAvIDI1NikgLyBNYXRoLnBvdygyLCB6KSxcbiAgICAgICAgbWVyY194ID0gKHggKiByZXNvbHV0aW9uIC0gMiAqIE1hdGguUEkgICogNjM3ODEzNyAvIDIuMCksXG4gICAgICAgIG1lcmNfeSA9ICh5ICogcmVzb2x1dGlvbiAtIDIgKiBNYXRoLlBJICAqIDYzNzgxMzcgLyAyLjApO1xuXG4gICAgcmV0dXJuIFttZXJjX3gsIG1lcmNfeV07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2dldFRpbGVCQm94fSBmcm9tICdAbWFwYm94L3dob290cy1qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgQ2Fub25pY2FsVGlsZUlEIHtcbiAgICB6OiBudW1iZXI7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICBrZXk6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICAgICAgYXNzZXJ0KHogPj0gMCAmJiB6IDw9IDI1KTtcbiAgICAgICAgYXNzZXJ0KHggPj0gMCAmJiB4IDwgTWF0aC5wb3coMiwgeikpO1xuICAgICAgICBhc3NlcnQoeSA+PSAwICYmIHkgPCBNYXRoLnBvdygyLCB6KSk7XG4gICAgICAgIHRoaXMueiA9IHo7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHRoaXMua2V5ID0gY2FsY3VsYXRlS2V5KDAsIHosIHosIHgsIHkpO1xuICAgIH1cblxuICAgIGVxdWFscyhpZDogQ2Fub25pY2FsVGlsZUlEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnogPT09IGlkLnogJiYgdGhpcy54ID09PSBpZC54ICYmIHRoaXMueSA9PT0gaWQueTtcbiAgICB9XG5cbiAgICAvLyBnaXZlbiBhIGxpc3Qgb2YgdXJscywgY2hvb3NlIGEgdXJsIHRlbXBsYXRlIGFuZCByZXR1cm4gYSB0aWxlIFVSTFxuICAgIHVybCh1cmxzOiBBcnJheTxzdHJpbmc+LCBzY2hlbWU6ID9zdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBiYm94ID0gZ2V0VGlsZUJCb3godGhpcy54LCB0aGlzLnksIHRoaXMueik7XG4gICAgICAgIGNvbnN0IHF1YWRrZXkgPSBnZXRRdWFka2V5KHRoaXMueiwgdGhpcy54LCB0aGlzLnkpO1xuXG4gICAgICAgIHJldHVybiB1cmxzWyh0aGlzLnggKyB0aGlzLnkpICUgdXJscy5sZW5ndGhdXG4gICAgICAgICAgICAucmVwbGFjZSgne3ByZWZpeH0nLCAodGhpcy54ICUgMTYpLnRvU3RyaW5nKDE2KSArICh0aGlzLnkgJSAxNikudG9TdHJpbmcoMTYpKVxuICAgICAgICAgICAgLnJlcGxhY2UoL3t6fS9nLCBTdHJpbmcodGhpcy56KSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC97eH0vZywgU3RyaW5nKHRoaXMueCkpXG4gICAgICAgICAgICAucmVwbGFjZSgve3l9L2csIFN0cmluZyhzY2hlbWUgPT09ICd0bXMnID8gKE1hdGgucG93KDIsIHRoaXMueikgLSB0aGlzLnkgLSAxKSA6IHRoaXMueSkpXG4gICAgICAgICAgICAucmVwbGFjZSgne3F1YWRrZXl9JywgcXVhZGtleSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7YmJveC1lcHNnLTM4NTd9JywgYmJveCk7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMuen0vJHt0aGlzLnh9LyR7dGhpcy55fWA7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW53cmFwcGVkVGlsZUlEIHtcbiAgICB3cmFwOiBudW1iZXI7XG4gICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQ7XG4gICAga2V5OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih3cmFwOiBudW1iZXIsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlEKSB7XG4gICAgICAgIHRoaXMud3JhcCA9IHdyYXA7XG4gICAgICAgIHRoaXMuY2Fub25pY2FsID0gY2Fub25pY2FsO1xuICAgICAgICB0aGlzLmtleSA9IGNhbGN1bGF0ZUtleSh3cmFwLCBjYW5vbmljYWwueiwgY2Fub25pY2FsLnosIGNhbm9uaWNhbC54LCBjYW5vbmljYWwueSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgT3ZlcnNjYWxlZFRpbGVJRCB7XG4gICAgb3ZlcnNjYWxlZFo6IG51bWJlcjtcbiAgICB3cmFwOiBudW1iZXI7XG4gICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQ7XG4gICAga2V5OiBudW1iZXI7XG4gICAgcHJvak1hdHJpeDogRmxvYXQzMkFycmF5O1xuXG4gICAgY29uc3RydWN0b3Iob3ZlcnNjYWxlZFo6IG51bWJlciwgd3JhcDogbnVtYmVyLCB6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XG4gICAgICAgIGFzc2VydChvdmVyc2NhbGVkWiA+PSB6KTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGVkWiA9IG92ZXJzY2FsZWRaO1xuICAgICAgICB0aGlzLndyYXAgPSB3cmFwO1xuICAgICAgICB0aGlzLmNhbm9uaWNhbCA9IG5ldyBDYW5vbmljYWxUaWxlSUQoeiwgK3gsICt5KTtcbiAgICAgICAgdGhpcy5rZXkgPSB3cmFwID09PSAwICYmIG92ZXJzY2FsZWRaID09PSB6ID8gdGhpcy5jYW5vbmljYWwua2V5IDogY2FsY3VsYXRlS2V5KHdyYXAsIG92ZXJzY2FsZWRaLCB6LCB4LCB5KTtcbiAgICB9XG5cbiAgICBlcXVhbHMoaWQ6IE92ZXJzY2FsZWRUaWxlSUQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcnNjYWxlZFogPT09IGlkLm92ZXJzY2FsZWRaICYmIHRoaXMud3JhcCA9PT0gaWQud3JhcCAmJiB0aGlzLmNhbm9uaWNhbC5lcXVhbHMoaWQuY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICBzY2FsZWRUbyh0YXJnZXRaOiBudW1iZXIpOiBPdmVyc2NhbGVkVGlsZUlEIHtcbiAgICAgICAgYXNzZXJ0KHRhcmdldFogPD0gdGhpcy5vdmVyc2NhbGVkWik7XG4gICAgICAgIGNvbnN0IHpEaWZmZXJlbmNlID0gdGhpcy5jYW5vbmljYWwueiAtIHRhcmdldFo7XG4gICAgICAgIGlmICh0YXJnZXRaID4gdGhpcy5jYW5vbmljYWwueikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHRhcmdldFosIHRoaXMud3JhcCwgdGhpcy5jYW5vbmljYWwueiwgdGhpcy5jYW5vbmljYWwueCwgdGhpcy5jYW5vbmljYWwueSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJzY2FsZWRUaWxlSUQodGFyZ2V0WiwgdGhpcy53cmFwLCB0YXJnZXRaLCB0aGlzLmNhbm9uaWNhbC54ID4+IHpEaWZmZXJlbmNlLCB0aGlzLmNhbm9uaWNhbC55ID4+IHpEaWZmZXJlbmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogY2FsY3VsYXRlU2NhbGVkS2V5IGlzIGFuIG9wdGltaXphdGlvbjpcbiAgICAgKiB3aGVuIHdpdGhXcmFwID09IHRydWUsIGltcGxlbWVudHMgdGhlIHNhbWUgYXMgdGhpcy5zY2FsZWRUbyh6KS5rZXksXG4gICAgICogd2hlbiB3aXRoV3JhcCA9PSBmYWxzZSwgaW1wbGVtZW50cyB0aGUgc2FtZSBhcyB0aGlzLnNjYWxlZFRvKHopLndyYXBwZWQoKS5rZXkuXG4gICAgICovXG4gICAgY2FsY3VsYXRlU2NhbGVkS2V5KHRhcmdldFo6IG51bWJlciwgd2l0aFdyYXA6IGJvb2xlYW4gPSB0cnVlKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMub3ZlcnNjYWxlZFogPT09IHRhcmdldFogJiYgd2l0aFdyYXApIHJldHVybiB0aGlzLmtleTtcbiAgICAgICAgaWYgKHRhcmdldFogPiB0aGlzLmNhbm9uaWNhbC56KSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsY3VsYXRlS2V5KHRoaXMud3JhcCAqICt3aXRoV3JhcCwgdGFyZ2V0WiwgdGhpcy5jYW5vbmljYWwueiwgdGhpcy5jYW5vbmljYWwueCwgdGhpcy5jYW5vbmljYWwueSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB6RGlmZmVyZW5jZSA9IHRoaXMuY2Fub25pY2FsLnogLSB0YXJnZXRaO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZUtleSh0aGlzLndyYXAgKiArd2l0aFdyYXAsIHRhcmdldFosIHRhcmdldFosIHRoaXMuY2Fub25pY2FsLnggPj4gekRpZmZlcmVuY2UsIHRoaXMuY2Fub25pY2FsLnkgPj4gekRpZmZlcmVuY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNDaGlsZE9mKHBhcmVudDogT3ZlcnNjYWxlZFRpbGVJRCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAocGFyZW50LndyYXAgIT09IHRoaXMud3JhcCkge1xuICAgICAgICAgICAgLy8gV2UgY2FuJ3QgYmUgYSBjaGlsZCBpZiB3ZSdyZSBpbiBhIGRpZmZlcmVudCB3b3JsZCBjb3B5XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgekRpZmZlcmVuY2UgPSB0aGlzLmNhbm9uaWNhbC56IC0gcGFyZW50LmNhbm9uaWNhbC56O1xuICAgICAgICAvLyBXZSdyZSBmaXJzdCB0ZXN0aW5nIGZvciB6ID09IDAsIHRvIGF2b2lkIGEgMzIgYml0IHNoaWZ0LCB3aGljaCBpcyB1bmRlZmluZWQuXG4gICAgICAgIHJldHVybiBwYXJlbnQub3ZlcnNjYWxlZFogPT09IDAgfHwgKFxuICAgICAgICAgICAgcGFyZW50Lm92ZXJzY2FsZWRaIDwgdGhpcy5vdmVyc2NhbGVkWiAmJlxuICAgICAgICAgICAgICAgIHBhcmVudC5jYW5vbmljYWwueCA9PT0gKHRoaXMuY2Fub25pY2FsLnggPj4gekRpZmZlcmVuY2UpICYmXG4gICAgICAgICAgICAgICAgcGFyZW50LmNhbm9uaWNhbC55ID09PSAodGhpcy5jYW5vbmljYWwueSA+PiB6RGlmZmVyZW5jZSkpO1xuICAgIH1cblxuICAgIGNoaWxkcmVuKHNvdXJjZU1heFpvb206IG51bWJlcik6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+IHtcbiAgICAgICAgaWYgKHRoaXMub3ZlcnNjYWxlZFogPj0gc291cmNlTWF4Wm9vbSkge1xuICAgICAgICAgICAgLy8gcmV0dXJuIGEgc2luZ2xlIHRpbGUgY29vcmQgcmVwcmVzZW50aW5nIGEgYW4gb3ZlcnNjYWxlZCB0aWxlXG4gICAgICAgICAgICByZXR1cm4gW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRoaXMub3ZlcnNjYWxlZFogKyAxLCB0aGlzLndyYXAsIHRoaXMuY2Fub25pY2FsLnosIHRoaXMuY2Fub25pY2FsLngsIHRoaXMuY2Fub25pY2FsLnkpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHogPSB0aGlzLmNhbm9uaWNhbC56ICsgMTtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMuY2Fub25pY2FsLnggKiAyO1xuICAgICAgICBjb25zdCB5ID0gdGhpcy5jYW5vbmljYWwueSAqIDI7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB0aGlzLndyYXAsIHosIHgsIHkpLFxuICAgICAgICAgICAgbmV3IE92ZXJzY2FsZWRUaWxlSUQoeiwgdGhpcy53cmFwLCB6LCB4ICsgMSwgeSksXG4gICAgICAgICAgICBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB0aGlzLndyYXAsIHosIHgsIHkgKyAxKSxcbiAgICAgICAgICAgIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHosIHRoaXMud3JhcCwgeiwgeCArIDEsIHkgKyAxKVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGlzTGVzc1RoYW4ocmhzOiBPdmVyc2NhbGVkVGlsZUlEKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLndyYXAgPCByaHMud3JhcCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLndyYXAgPiByaHMud3JhcCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLm92ZXJzY2FsZWRaIDwgcmhzLm92ZXJzY2FsZWRaKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMub3ZlcnNjYWxlZFogPiByaHMub3ZlcnNjYWxlZFopIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5jYW5vbmljYWwueCA8IHJocy5jYW5vbmljYWwueCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0aGlzLmNhbm9uaWNhbC54ID4gcmhzLmNhbm9uaWNhbC54KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuY2Fub25pY2FsLnkgPCByaHMuY2Fub25pY2FsLnkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgd3JhcHBlZCgpOiBPdmVyc2NhbGVkVGlsZUlEIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPdmVyc2NhbGVkVGlsZUlEKHRoaXMub3ZlcnNjYWxlZFosIDAsIHRoaXMuY2Fub25pY2FsLnosIHRoaXMuY2Fub25pY2FsLngsIHRoaXMuY2Fub25pY2FsLnkpO1xuICAgIH1cblxuICAgIHVud3JhcFRvKHdyYXA6IG51bWJlcik6IE92ZXJzY2FsZWRUaWxlSUQge1xuICAgICAgICByZXR1cm4gbmV3IE92ZXJzY2FsZWRUaWxlSUQodGhpcy5vdmVyc2NhbGVkWiwgd3JhcCwgdGhpcy5jYW5vbmljYWwueiwgdGhpcy5jYW5vbmljYWwueCwgdGhpcy5jYW5vbmljYWwueSk7XG4gICAgfVxuXG4gICAgb3ZlcnNjYWxlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBNYXRoLnBvdygyLCB0aGlzLm92ZXJzY2FsZWRaIC0gdGhpcy5jYW5vbmljYWwueik7XG4gICAgfVxuXG4gICAgdG9VbndyYXBwZWQoKTogVW53cmFwcGVkVGlsZUlEIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVbndyYXBwZWRUaWxlSUQodGhpcy53cmFwLCB0aGlzLmNhbm9uaWNhbCk7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMub3ZlcnNjYWxlZFp9LyR7dGhpcy5jYW5vbmljYWwueH0vJHt0aGlzLmNhbm9uaWNhbC55fWA7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVLZXkod3JhcDogbnVtYmVyLCBvdmVyc2NhbGVkWjogbnVtYmVyLCB6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBvbmx5IHVzZSAyMiBiaXRzIGZvciB4ICYgeSBzbyB0aGF0IHRoZSBrZXkgZml0cyBpbnRvIE1BWF9TQUZFX0lOVEVHRVJcbiAgICBjb25zdCBkaW0gPSAxIDw8IE1hdGgubWluKHosIDIyKTtcbiAgICBsZXQgeHkgPSBkaW0gKiAoeSAlIGRpbSkgKyAoeCAlIGRpbSk7XG5cbiAgICAvLyB6aWd6YWctZW5jb2RlIHdyYXAgaWYgd2UgaGF2ZSB0aGUgcm9vbSBmb3IgaXRcbiAgICBpZiAod3JhcCAmJiB6IDwgMjIpIHtcbiAgICAgICAgY29uc3QgYml0c0F2YWlsYWJsZSA9IDIgKiAoMjIgLSB6KTtcbiAgICAgICAgeHkgKz0gZGltICogZGltICogKCh3cmFwIDwgMCA/IC0yICogd3JhcCAtIDEgOiAyICogd3JhcCkgJSAoMSA8PCBiaXRzQXZhaWxhYmxlKSk7XG4gICAgfVxuXG4gICAgLy8gZW5jb2RlIHogaW50byA1IGJpdHMgKDI0IG1heCkgYW5kIG92ZXJzY2FsZWRaIGludG8gNCBiaXRzICgxMCBtYXgpXG4gICAgY29uc3Qga2V5ID0gKCh4eSAqIDMyKSArIHopICogMTYgKyAob3ZlcnNjYWxlZFogLSB6KTtcbiAgICBhc3NlcnQoa2V5ID49IDAgJiYga2V5IDw9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtcblxuICAgIHJldHVybiBrZXk7XG59XG5cbmZ1bmN0aW9uIGdldFF1YWRrZXkoeiwgeCwgeSkge1xuICAgIGxldCBxdWFka2V5ID0gJycsIG1hc2s7XG4gICAgZm9yIChsZXQgaSA9IHo7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgbWFzayA9IDEgPDwgKGkgLSAxKTtcbiAgICAgICAgcXVhZGtleSArPSAoKHggJiBtYXNrID8gMSA6IDApICsgKHkgJiBtYXNrID8gMiA6IDApKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1YWRrZXk7XG59XG5cbnJlZ2lzdGVyKENhbm9uaWNhbFRpbGVJRCwgJ0Nhbm9uaWNhbFRpbGVJRCcpO1xucmVnaXN0ZXIoT3ZlcnNjYWxlZFRpbGVJRCwgJ092ZXJzY2FsZWRUaWxlSUQnLCB7b21pdDogWydwcm9qTWF0cml4J119KTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCBGaWxsRXh0cnVzaW9uQnVja2V0LCB7RUxFVkFUSU9OX1NDQUxFLCBFTEVWQVRJT05fT0ZGU0VULCBmaWxsRXh0cnVzaW9uSGVpZ2h0TGlmdCwgcmVzYW1wbGVGaWxsRXh0cnVzaW9uUG9seWdvbnNGb3JHbG9iZX0gZnJvbSAnLi4vLi4vZGF0YS9idWNrZXQvZmlsbF9leHRydXNpb25fYnVja2V0LmpzJztcbmltcG9ydCB7cG9seWdvbkludGVyc2VjdHNQb2x5Z29uLCBwb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbn0gZnJvbSAnLi4vLi4vdXRpbC9pbnRlcnNlY3Rpb25fdGVzdHMuanMnO1xuaW1wb3J0IHt0cmFuc2xhdGVEaXN0YW5jZSwgdGlsZXNwYWNlVHJhbnNsYXRlfSBmcm9tICcuLi9xdWVyeV91dGlscy5qcyc7XG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHtUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWR9IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IFByb2dyYW1Db25maWd1cmF0aW9uIGZyb20gJy4uLy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzJztcbmltcG9ydCB7dmVjMywgdmVjNH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vLi4vZGF0YS9leHRlbnQuanMnO1xuaW1wb3J0IHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkLmpzJztcblxuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZX0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtCdWNrZXRQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSB7UGFpbnRQcm9wc30gZnJvbSAnLi9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVzcGFjZVF1ZXJ5R2VvbWV0cnl9IGZyb20gJy4uL3F1ZXJ5X2dlb21ldHJ5LmpzJztcbmltcG9ydCB0eXBlIHtERU1TYW1wbGVyfSBmcm9tICcuLi8uLi90ZXJyYWluL2VsZXZhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7VmVjMiwgVmVjNH0gZnJvbSAnZ2wtbWF0cml4JztcblxuY2xhc3MgRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICBjcmVhdGVCdWNrZXQocGFyYW1ldGVyczogQnVja2V0UGFyYW1ldGVyczxGaWxsRXh0cnVzaW9uU3R5bGVMYXllcj4pOiBGaWxsRXh0cnVzaW9uQnVja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGaWxsRXh0cnVzaW9uQnVja2V0KHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHF1ZXJ5UmFkaXVzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVEaXN0YW5jZSh0aGlzLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tdHJhbnNsYXRlJykpO1xuICAgIH1cblxuICAgIGlzM0QoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1JZHMoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHkgPSB0aGlzLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tcGF0dGVybicpO1xuICAgICAgICBjb25zdCBpbWFnZSA9IHBhdHRlcm5Qcm9wZXJ0eS5jb25zdGFudE9yKCgxOiBhbnkpKTtcbiAgICAgICAgcmV0dXJuIFtpbWFnZSA/ICdmaWxsRXh0cnVzaW9uUGF0dGVybicgOiAnZmlsbEV4dHJ1c2lvbiddO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1Db25maWd1cmF0aW9uKHpvb206IG51bWJlcik6IFByb2dyYW1Db25maWd1cmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvbih0aGlzLCB6b29tKTtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKHF1ZXJ5R2VvbWV0cnk6IFRpbGVzcGFjZVF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbGV2YXRpb25IZWxwZXI6ID9ERU1TYW1wbGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0VmVydGV4QXJyYXlPZmZzZXQ6IG51bWJlcik6IGJvb2xlYW4gfCBudW1iZXIge1xuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGlsZXNwYWNlVHJhbnNsYXRlKHRoaXMucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLmFuZ2xlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeUdlb21ldHJ5LnBpeGVsVG9UaWxlVW5pdHNGYWN0b3IpO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24taGVpZ2h0JykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgY29uc3QgYmFzZSA9IHRoaXMucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1iYXNlJykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcblxuICAgICAgICBjb25zdCBjZW50cm9pZCA9IFswLCAwXTtcbiAgICAgICAgY29uc3QgdGVycmFpblZpc2libGUgPSBlbGV2YXRpb25IZWxwZXIgJiYgdHJhbnNmb3JtLmVsZXZhdGlvbjtcbiAgICAgICAgY29uc3QgZXhhZ2dlcmF0aW9uID0gdHJhbnNmb3JtLmVsZXZhdGlvbiA/IHRyYW5zZm9ybS5lbGV2YXRpb24uZXhhZ2dlcmF0aW9uKCkgOiAxO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBxdWVyeUdlb21ldHJ5LnRpbGUuZ2V0QnVja2V0KHRoaXMpO1xuICAgICAgICBpZiAodGVycmFpblZpc2libGUgJiYgYnVja2V0IGluc3RhbmNlb2YgRmlsbEV4dHJ1c2lvbkJ1Y2tldCkge1xuICAgICAgICAgICAgY29uc3QgY2VudHJvaWRWZXJ0ZXhBcnJheSA9IGJ1Y2tldC5jZW50cm9pZFZlcnRleEFycmF5O1xuXG4gICAgICAgICAgICAvLyBTZWUgRmlsbEV4dHJ1c2lvbkJ1Y2tldCNlbmNvZGVDZW50cm9pZCgpLCBjZW50cm9pZCBpcyBpbnNlcnRlZCBhdCB2ZXJ0ZXhPZmZzZXQgKyAxXG4gICAgICAgICAgICBjb25zdCBjZW50cm9pZE9mZnNldCA9IGxheW91dFZlcnRleEFycmF5T2Zmc2V0ICsgMTtcbiAgICAgICAgICAgIGlmIChjZW50cm9pZE9mZnNldCA8IGNlbnRyb2lkVmVydGV4QXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VudHJvaWRWZXJ0ZXhPYmplY3QgPSBjZW50cm9pZFZlcnRleEFycmF5LmdldChjZW50cm9pZE9mZnNldCk7XG4gICAgICAgICAgICAgICAgY2VudHJvaWRbMF0gPSBjZW50cm9pZFZlcnRleE9iamVjdC5hX2NlbnRyb2lkX3BvczA7XG4gICAgICAgICAgICAgICAgY2VudHJvaWRbMV0gPSBjZW50cm9pZFZlcnRleE9iamVjdC5hX2NlbnRyb2lkX3BvczE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYXJseSBleGl0IGlmIGZpbGwgZXh0cnVzaW9uIGlzIHN0aWxsIGhpZGRlbiB3aGlsZSB3YWl0aW5nIGZvciBiYWNrZmlsbFxuICAgICAgICBjb25zdCBpc0hpZGRlbiA9IGNlbnRyb2lkWzBdID09PSAwICYmIGNlbnRyb2lkWzFdID09PSAxO1xuICAgICAgICBpZiAoaXNIaWRkZW4pIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAodHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJykge1xuICAgICAgICAgICAgLy8gRmlsbCBleHRydXNpb24gZ2VvbWV0cnkgaGFzIHRvIGJlIHJlc2FtcGxlZCBzbyB0aGF0IGxhcmdlIHBsYW5hciBwb2x5Z29uc1xuICAgICAgICAgICAgLy8gY2FuIGJlIHJlbmRlcmVkIG9uIHRoZSBjdXJ2ZWQgc3VyZmFjZVxuICAgICAgICAgICAgY29uc3QgYm91bmRzID0gW25ldyBQb2ludCgwLCAwKSwgbmV3IFBvaW50KEVYVEVOVCwgRVhURU5UKV07XG4gICAgICAgICAgICBjb25zdCByZXNhbXBsZWRHZW9tZXRyeSA9IHJlc2FtcGxlRmlsbEV4dHJ1c2lvblBvbHlnb25zRm9yR2xvYmUoW2dlb21ldHJ5XSwgYm91bmRzLCBxdWVyeUdlb21ldHJ5LnRpbGVJRC5jYW5vbmljYWwpO1xuICAgICAgICAgICAgZ2VvbWV0cnkgPSByZXNhbXBsZWRHZW9tZXRyeS5tYXAoY2xpcHBlZCA9PiBjbGlwcGVkLnBvbHlnb24pLmZsYXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlbVNhbXBsZXIgPSB0ZXJyYWluVmlzaWJsZSA/IGVsZXZhdGlvbkhlbHBlciA6IG51bGw7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZCA9IHByb2plY3RFeHRydXNpb24odHJhbnNmb3JtLCBnZW9tZXRyeSwgYmFzZSwgaGVpZ2h0LCB0cmFuc2xhdGlvbiwgcGl4ZWxQb3NNYXRyaXgsIGRlbVNhbXBsZXIsIGNlbnRyb2lkLCBleGFnZ2VyYXRpb24sIHRyYW5zZm9ybS5jZW50ZXIubGF0LCBxdWVyeUdlb21ldHJ5LnRpbGVJRC5jYW5vbmljYWwpO1xuICAgICAgICBjb25zdCBwcm9qZWN0ZWRCYXNlID0gcHJvamVjdGVkWzBdO1xuICAgICAgICBjb25zdCBwcm9qZWN0ZWRUb3AgPSBwcm9qZWN0ZWRbMV07XG5cbiAgICAgICAgY29uc3Qgc2NyZWVuUXVlcnkgPSBxdWVyeUdlb21ldHJ5LnF1ZXJ5R2VvbWV0cnk7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZFF1ZXJ5R2VvbWV0cnkgPSBzY3JlZW5RdWVyeS5pc1BvaW50UXVlcnkoKSA/IHNjcmVlblF1ZXJ5LnNjcmVlbkJvdW5kcyA6IHNjcmVlblF1ZXJ5LnNjcmVlbkdlb21ldHJ5O1xuICAgICAgICByZXR1cm4gY2hlY2tJbnRlcnNlY3Rpb24ocHJvamVjdGVkQmFzZSwgcHJvamVjdGVkVG9wLCBwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRvdChhLCBiKSB7XG4gICAgcmV0dXJuIGEueCAqIGIueCArIGEueSAqIGIueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVyc2VjdGlvbkRpc3RhbmNlKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PiwgcHJvamVjdGVkRmFjZTogQXJyYXk8UG9pbnQ+KTogbnVtYmVyIHtcblxuICAgIGlmIChwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBGb3IgcG9pbnQgcXVlcmllcyBjYWxjdWxhdGUgdGhlIHogYXQgd2hpY2ggdGhlIHBvaW50IGludGVyc2VjdHMgdGhlIGZhY2VcbiAgICAgICAgLy8gdXNpbmcgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMuXG5cbiAgICAgICAgLy8gRmluZCB0aGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgb2YgdGhlIHByb2plY3RlZCBwb2ludCB3aXRoaW4gdGhlIGZpcnN0XG4gICAgICAgIC8vIHRyaWFuZ2xlIG9mIHRoZSBmYWNlLCB1c2luZyBvbmx5IHRoZSB4eSBwbGFuZS4gSXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlXG4gICAgICAgIC8vIHBvaW50IGlzIG91dHNpZGUgdGhlIGZpcnN0IHRyaWFuZ2xlIGJlY2F1c2UgYWxsIHRoZSB0cmlhbmdsZXMgaW4gdGhlIGZhY2VcbiAgICAgICAgLy8gYXJlIGluIHRoZSBzYW1lIHBsYW5lLlxuICAgICAgICAvL1xuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHBvaW50cyBhcmUgY29pbmNpZGVudCBhbmQgdXNlIG90aGVyIHBvaW50cyBpZiB0aGV5IGFyZS5cbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBjb25zdCBhID0gcHJvamVjdGVkRmFjZVtpKytdO1xuICAgICAgICBsZXQgYjtcbiAgICAgICAgd2hpbGUgKCFiIHx8IGEuZXF1YWxzKGIpKSB7XG4gICAgICAgICAgICBiID0gcHJvamVjdGVkRmFjZVtpKytdO1xuICAgICAgICAgICAgaWYgKCFiKSByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb29wIHVudGlsIHBvaW50IGBjYCBpcyBub3QgY29saW5lYXIgd2l0aCBwb2ludHMgYGFgIGFuZCBgYmAuXG4gICAgICAgIGZvciAoOyBpIDwgcHJvamVjdGVkRmFjZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IHByb2plY3RlZEZhY2VbaV07XG5cbiAgICAgICAgICAgIGNvbnN0IHAgPSBwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5WzBdO1xuXG4gICAgICAgICAgICBjb25zdCBhYiA9IGIuc3ViKGEpO1xuICAgICAgICAgICAgY29uc3QgYWMgPSBjLnN1YihhKTtcbiAgICAgICAgICAgIGNvbnN0IGFwID0gcC5zdWIoYSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRvdEFCQUIgPSBkb3QoYWIsIGFiKTtcbiAgICAgICAgICAgIGNvbnN0IGRvdEFCQUMgPSBkb3QoYWIsIGFjKTtcbiAgICAgICAgICAgIGNvbnN0IGRvdEFDQUMgPSBkb3QoYWMsIGFjKTtcbiAgICAgICAgICAgIGNvbnN0IGRvdEFQQUIgPSBkb3QoYXAsIGFiKTtcbiAgICAgICAgICAgIGNvbnN0IGRvdEFQQUMgPSBkb3QoYXAsIGFjKTtcbiAgICAgICAgICAgIGNvbnN0IGRlbm9tID0gZG90QUJBQiAqIGRvdEFDQUMgLSBkb3RBQkFDICogZG90QUJBQztcblxuICAgICAgICAgICAgY29uc3QgdiA9IChkb3RBQ0FDICogZG90QVBBQiAtIGRvdEFCQUMgKiBkb3RBUEFDKSAvIGRlbm9tO1xuICAgICAgICAgICAgY29uc3QgdyA9IChkb3RBQkFCICogZG90QVBBQyAtIGRvdEFCQUMgKiBkb3RBUEFCKSAvIGRlbm9tO1xuICAgICAgICAgICAgY29uc3QgdSA9IDEgLSB2IC0gdztcblxuICAgICAgICAgICAgLy8gVXNlIHRoZSBiYXJ5Y2VudHJpYyB3ZWlnaHRpbmcgYWxvbmcgd2l0aCB0aGUgb3JpZ2luYWwgdHJpYW5nbGUgeiBjb29yZGluYXRlcyB0byBnZXQgdGhlIHBvaW50IG9mIGludGVyc2VjdGlvbi5cbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gYS56ICogdSArIGIueiAqIHYgKyBjLnogKiB3O1xuXG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGlzdGFuY2UpKSByZXR1cm4gZGlzdGFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gSW5maW5pdHk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgY291bnRzIGFzIGNsb3Nlc3QgaXMgbGVzcyBjbGVhciB3aGVuIHRoZSBxdWVyeSBpcyBhIGJveC4gVGhpc1xuICAgICAgICAvLyByZXR1cm5zIHRoZSBkaXN0YW5jZSB0byB0aGUgbmVhcmVzdCBwb2ludCBvbiB0aGUgZmFjZSwgd2hldGhlciBpdCBpc1xuICAgICAgICAvLyB3aXRoaW4gdGhlIHF1ZXJ5IG9yIG5vdC4gSXQgY291bGQgYmUgbW9yZSBjb3JyZWN0IHRvIHJldHVybiB0aGVcbiAgICAgICAgLy8gZGlzdGFuY2UgdG8gdGhlIGNsb3Nlc3QgcG9pbnQgd2l0aGluIHRoZSBxdWVyeSBib3ggYnV0IHRoaXMgd291bGQgYmVcbiAgICAgICAgLy8gbW9yZSBjb21wbGljYXRlZCBhbmQgZXhwZW5zaXZlIHRvIGNhbGN1bGF0ZSB3aXRoIGxpdHRsZSBiZW5lZml0LlxuICAgICAgICBsZXQgY2xvc2VzdERpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBwcm9qZWN0ZWRGYWNlKSB7XG4gICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSBNYXRoLm1pbihjbG9zZXN0RGlzdGFuY2UsIHAueik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsb3Nlc3REaXN0YW5jZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50ZXJzZWN0aW9uKHByb2plY3RlZEJhc2U6IEFycmF5PFBvaW50PiwgcHJvamVjdGVkVG9wOiBBcnJheTxQb2ludD4sIHByb2plY3RlZFF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50Pikge1xuICAgIGxldCBjbG9zZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcblxuICAgIGlmIChwb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbihwcm9qZWN0ZWRRdWVyeUdlb21ldHJ5LCBwcm9qZWN0ZWRUb3ApKSB7XG4gICAgICAgIGNsb3Nlc3REaXN0YW5jZSA9IGdldEludGVyc2VjdGlvbkRpc3RhbmNlKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnksIHByb2plY3RlZFRvcFswXSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBwcm9qZWN0ZWRUb3AubGVuZ3RoOyByKyspIHtcbiAgICAgICAgY29uc3QgcmluZ1RvcCA9IHByb2plY3RlZFRvcFtyXTtcbiAgICAgICAgY29uc3QgcmluZ0Jhc2UgPSBwcm9qZWN0ZWRCYXNlW3JdO1xuICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHJpbmdUb3AubGVuZ3RoIC0gMTsgcCsrKSB7XG4gICAgICAgICAgICBjb25zdCB0b3BBID0gcmluZ1RvcFtwXTtcbiAgICAgICAgICAgIGNvbnN0IHRvcEIgPSByaW5nVG9wW3AgKyAxXTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VBID0gcmluZ0Jhc2VbcF07XG4gICAgICAgICAgICBjb25zdCBiYXNlQiA9IHJpbmdCYXNlW3AgKyAxXTtcbiAgICAgICAgICAgIGNvbnN0IGZhY2UgPSBbdG9wQSwgdG9wQiwgYmFzZUIsIGJhc2VBLCB0b3BBXTtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24ocHJvamVjdGVkUXVlcnlHZW9tZXRyeSwgZmFjZSkpIHtcbiAgICAgICAgICAgICAgICBjbG9zZXN0RGlzdGFuY2UgPSBNYXRoLm1pbihjbG9zZXN0RGlzdGFuY2UsIGdldEludGVyc2VjdGlvbkRpc3RhbmNlKHByb2plY3RlZFF1ZXJ5R2VvbWV0cnksIGZhY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbG9zZXN0RGlzdGFuY2UgPT09IEluZmluaXR5ID8gZmFsc2UgOiBjbG9zZXN0RGlzdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHByb2plY3RFeHRydXNpb24odHI6IFRyYW5zZm9ybSwgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIHpCYXNlOiBudW1iZXIsIHpUb3A6IG51bWJlciwgdHJhbnNsYXRpb246IFBvaW50LCBtOiBGbG9hdDMyQXJyYXksIGRlbVNhbXBsZXI6ID9ERU1TYW1wbGVyLCBjZW50cm9pZDogVmVjMiwgZXhhZ2dlcmF0aW9uOiBudW1iZXIsIGxhdDogbnVtYmVyLCB0aWxlSUQ6IENhbm9uaWNhbFRpbGVJRCkge1xuICAgIGlmICh0ci5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgcmV0dXJuIHByb2plY3RFeHRydXNpb25HbG9iZSh0ciwgZ2VvbWV0cnksIHpCYXNlLCB6VG9wLCB0cmFuc2xhdGlvbiwgbSwgZGVtU2FtcGxlciwgY2VudHJvaWQsIGV4YWdnZXJhdGlvbiwgbGF0LCB0aWxlSUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkZW1TYW1wbGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvamVjdEV4dHJ1c2lvbjNEKGdlb21ldHJ5LCB6QmFzZSwgelRvcCwgdHJhbnNsYXRpb24sIG0sIGRlbVNhbXBsZXIsIGNlbnRyb2lkLCBleGFnZ2VyYXRpb24sIGxhdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvamVjdEV4dHJ1c2lvbjJEKGdlb21ldHJ5LCB6QmFzZSwgelRvcCwgdHJhbnNsYXRpb24sIG0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwcm9qZWN0RXh0cnVzaW9uR2xvYmUodHI6IFRyYW5zZm9ybSwgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIHpCYXNlOiBudW1iZXIsIHpUb3A6IG51bWJlciwgdHJhbnNsYXRpb246IFBvaW50LCBtOiBGbG9hdDMyQXJyYXksIGRlbVNhbXBsZXI6ID9ERU1TYW1wbGVyLCBjZW50cm9pZDogVmVjMiwgZXhhZ2dlcmF0aW9uOiBudW1iZXIsIGxhdDogbnVtYmVyLCB0aWxlSUQ6IENhbm9uaWNhbFRpbGVJRCkge1xuICAgIGNvbnN0IHByb2plY3RlZEJhc2UgPSBbXTtcbiAgICBjb25zdCBwcm9qZWN0ZWRUb3AgPSBbXTtcbiAgICBjb25zdCBlbGV2YXRpb25TY2FsZSA9IHRyLnByb2plY3Rpb24udXBWZWN0b3JTY2FsZSh0aWxlSUQsIHRyLmNlbnRlci5sYXQsIHRyLndvcmxkU2l6ZSkubWV0ZXJzVG9UaWxlO1xuICAgIGNvbnN0IGJhc2VQb2ludCA9IFswLCAwLCAwLCAxXTtcbiAgICBjb25zdCB0b3BQb2ludCA9IFswLCAwLCAwLCAxXTtcblxuICAgIGNvbnN0IHNldFBvaW50ID0gKHBvaW50LCB4LCB5LCB6KSA9PiB7XG4gICAgICAgIHBvaW50WzBdID0geDtcbiAgICAgICAgcG9pbnRbMV0gPSB5O1xuICAgICAgICBwb2ludFsyXSA9IHo7XG4gICAgICAgIHBvaW50WzNdID0gMTtcbiAgICB9O1xuXG4gICAgLy8gRml4ZWQgXCJsaWZ0XCIgdmFsdWUgaXMgYWRkZWQgdG8gaGVpZ2h0IHNvIHRoYXQgMC1oZWlnaHQgZmlsbCBleHRydXNpb25zIHdvbnQgY2xpcCB3aXRoIGdsb2JlJ3Mgc3VyZmFjZVxuICAgIGNvbnN0IGxpZnQgPSBmaWxsRXh0cnVzaW9uSGVpZ2h0TGlmdCgpO1xuXG4gICAgaWYgKHpCYXNlID4gMCkge1xuICAgICAgICB6QmFzZSArPSBsaWZ0O1xuICAgIH1cbiAgICB6VG9wICs9IGxpZnQ7XG5cbiAgICBmb3IgKGNvbnN0IHIgb2YgZ2VvbWV0cnkpIHtcbiAgICAgICAgY29uc3QgcmluZ0Jhc2UgPSBbXTtcbiAgICAgICAgY29uc3QgcmluZ1RvcCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2Ygcikge1xuICAgICAgICAgICAgY29uc3QgeCA9IHAueCArIHRyYW5zbGF0aW9uLng7XG4gICAgICAgICAgICBjb25zdCB5ID0gcC55ICsgdHJhbnNsYXRpb24ueTtcblxuICAgICAgICAgICAgLy8gUmVwcm9qZWN0IHRpbGUgY29vcmRpbmF0ZSBpbnRvIGVjZWYgYW5kIGFwcGx5IGVsZXZhdGlvbiB0byBjb3JyZWN0IGRpcmVjdGlvblxuICAgICAgICAgICAgY29uc3QgcmVwcm9qID0gdHIucHJvamVjdGlvbi5wcm9qZWN0VGlsZVBvaW50KHgsIHksIHRpbGVJRCk7XG4gICAgICAgICAgICBjb25zdCBkaXIgPSB0ci5wcm9qZWN0aW9uLnVwVmVjdG9yKHRpbGVJRCwgcC54LCBwLnkpO1xuXG4gICAgICAgICAgICBsZXQgekJhc2VQb2ludCA9IHpCYXNlO1xuICAgICAgICAgICAgbGV0IHpUb3BQb2ludCA9IHpUb3A7XG5cbiAgICAgICAgICAgIGlmIChkZW1TYW1wbGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZ2V0VGVycmFpbkhlaWdodE9mZnNldCh4LCB5LCB6QmFzZSwgelRvcCwgZGVtU2FtcGxlciwgY2VudHJvaWQsIGV4YWdnZXJhdGlvbiwgbGF0KTtcblxuICAgICAgICAgICAgICAgIHpCYXNlUG9pbnQgKz0gb2Zmc2V0LmJhc2U7XG4gICAgICAgICAgICAgICAgelRvcFBvaW50ICs9IG9mZnNldC50b3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh6QmFzZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHNldFBvaW50KFxuICAgICAgICAgICAgICAgICAgICBiYXNlUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHJlcHJvai54ICsgZGlyWzBdICogZWxldmF0aW9uU2NhbGUgKiB6QmFzZVBvaW50LFxuICAgICAgICAgICAgICAgICAgICByZXByb2oueSArIGRpclsxXSAqIGVsZXZhdGlvblNjYWxlICogekJhc2VQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgcmVwcm9qLnogKyBkaXJbMl0gKiBlbGV2YXRpb25TY2FsZSAqIHpCYXNlUG9pbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRQb2ludChiYXNlUG9pbnQsIHJlcHJvai54LCByZXByb2oueSwgcmVwcm9qLnopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZXRQb2ludChcbiAgICAgICAgICAgICAgICB0b3BQb2ludCxcbiAgICAgICAgICAgICAgICByZXByb2oueCArIGRpclswXSAqIGVsZXZhdGlvblNjYWxlICogelRvcFBvaW50LFxuICAgICAgICAgICAgICAgIHJlcHJvai55ICsgZGlyWzFdICogZWxldmF0aW9uU2NhbGUgKiB6VG9wUG9pbnQsXG4gICAgICAgICAgICAgICAgcmVwcm9qLnogKyBkaXJbMl0gKiBlbGV2YXRpb25TY2FsZSAqIHpUb3BQb2ludCk7XG5cbiAgICAgICAgICAgIHZlYzMudHJhbnNmb3JtTWF0NChiYXNlUG9pbnQsIGJhc2VQb2ludCwgbSk7XG4gICAgICAgICAgICB2ZWMzLnRyYW5zZm9ybU1hdDQodG9wUG9pbnQsIHRvcFBvaW50LCBtKTtcblxuICAgICAgICAgICAgcmluZ0Jhc2UucHVzaCh0b1BvaW50KGJhc2VQb2ludCkpO1xuICAgICAgICAgICAgcmluZ1RvcC5wdXNoKHRvUG9pbnQodG9wUG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICBwcm9qZWN0ZWRCYXNlLnB1c2gocmluZ0Jhc2UpO1xuICAgICAgICBwcm9qZWN0ZWRUb3AucHVzaChyaW5nVG9wKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW3Byb2plY3RlZEJhc2UsIHByb2plY3RlZFRvcF07XG59XG5cbi8qXG4gKiBQcm9qZWN0IHRoZSBnZW9tZXRyeSB1c2luZyBtYXRyaXggYG1gLiBUaGlzIGlzIGVzc2VudGlhbGx5IGRvaW5nXG4gKiBgdmVjNC50cmFuc2Zvcm1NYXQ0KFtdLCBbcC54LCBwLnksIHosIDFdLCBtKWAgYnV0IHRoZSBtdWx0aXBsaWNhdGlvblxuICogaXMgaW5saW5lZCBzbyB0aGF0IHBhcnRzIG9mIHRoZSBwcm9qZWN0aW9uIHRoYXQgYXJlIHRoZSBzYW1lIGFjcm9zc1xuICogZGlmZmVyZW50IHBvaW50cyBjYW4gb25seSBiZSBkb25lIG9uY2UuIFRoaXMgcHJvZHVjZWQgYSBtZWFzdXJhYmxlXG4gKiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC5cbiAqL1xuZnVuY3Rpb24gcHJvamVjdEV4dHJ1c2lvbjJEKGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCB6QmFzZTogbnVtYmVyLCB6VG9wOiBudW1iZXIsIHRyYW5zbGF0aW9uOiBQb2ludCwgbTogRmxvYXQzMkFycmF5KSB7XG4gICAgY29uc3QgcHJvamVjdGVkQmFzZSA9IFtdO1xuICAgIGNvbnN0IHByb2plY3RlZFRvcCA9IFtdO1xuXG4gICAgY29uc3QgYmFzZVhaID0gbVs4XSAqIHpCYXNlO1xuICAgIGNvbnN0IGJhc2VZWiA9IG1bOV0gKiB6QmFzZTtcbiAgICBjb25zdCBiYXNlWlogPSBtWzEwXSAqIHpCYXNlO1xuICAgIGNvbnN0IGJhc2VXWiA9IG1bMTFdICogekJhc2U7XG4gICAgY29uc3QgdG9wWFogPSBtWzhdICogelRvcDtcbiAgICBjb25zdCB0b3BZWiA9IG1bOV0gKiB6VG9wO1xuICAgIGNvbnN0IHRvcFpaID0gbVsxMF0gKiB6VG9wO1xuICAgIGNvbnN0IHRvcFdaID0gbVsxMV0gKiB6VG9wO1xuXG4gICAgZm9yIChjb25zdCByIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgIGNvbnN0IHJpbmdCYXNlID0gW107XG4gICAgICAgIGNvbnN0IHJpbmdUb3AgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHIpIHtcbiAgICAgICAgICAgIGNvbnN0IHggPSBwLnggKyB0cmFuc2xhdGlvbi54O1xuICAgICAgICAgICAgY29uc3QgeSA9IHAueSArIHRyYW5zbGF0aW9uLnk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNYID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bMTJdO1xuICAgICAgICAgICAgY29uc3Qgc1kgPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gICAgICAgICAgICBjb25zdCBzWiA9IG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzE0XTtcbiAgICAgICAgICAgIGNvbnN0IHNXID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTVdO1xuXG4gICAgICAgICAgICBjb25zdCBiYXNlWCA9IHNYICsgYmFzZVhaO1xuICAgICAgICAgICAgY29uc3QgYmFzZVkgPSBzWSArIGJhc2VZWjtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VaID0gc1ogKyBiYXNlWlo7XG4gICAgICAgICAgICBjb25zdCBiYXNlVyA9IE1hdGgubWF4KHNXICsgYmFzZVdaLCAwLjAwMDAxKTtcblxuICAgICAgICAgICAgY29uc3QgdG9wWCA9IHNYICsgdG9wWFo7XG4gICAgICAgICAgICBjb25zdCB0b3BZID0gc1kgKyB0b3BZWjtcbiAgICAgICAgICAgIGNvbnN0IHRvcFogPSBzWiArIHRvcFpaO1xuICAgICAgICAgICAgY29uc3QgdG9wVyA9IE1hdGgubWF4KHNXICsgdG9wV1osIDAuMDAwMDEpO1xuXG4gICAgICAgICAgICBjb25zdCBiID0gbmV3IFBvaW50KGJhc2VYIC8gYmFzZVcsIGJhc2VZIC8gYmFzZVcpO1xuICAgICAgICAgICAgYi56ID0gYmFzZVogLyBiYXNlVztcbiAgICAgICAgICAgIHJpbmdCYXNlLnB1c2goYik7XG5cbiAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgUG9pbnQodG9wWCAvIHRvcFcsIHRvcFkgLyB0b3BXKTtcbiAgICAgICAgICAgIHQueiA9IHRvcFogLyB0b3BXO1xuICAgICAgICAgICAgcmluZ1RvcC5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgICAgIHByb2plY3RlZEJhc2UucHVzaChyaW5nQmFzZSk7XG4gICAgICAgIHByb2plY3RlZFRvcC5wdXNoKHJpbmdUb3ApO1xuICAgIH1cbiAgICByZXR1cm4gW3Byb2plY3RlZEJhc2UsIHByb2plY3RlZFRvcF07XG59XG5cbi8qXG4gKiBQcm9qZWN0cyBhIGZpbGwgZXh0cnVzaW9uIHZlcnRpY2VzIHRvIHNjcmVlbiB3aGlsZSBhY2NvdW50aW5nIGZvciB0ZXJyYWluLlxuICogVGhpcyBhbmQgaXRzIGRlcGVuZGVudCBmdW5jdGlvbnMgYXJlIHBvcnRlZCBkaXJlY3RseSBmcm9tIGBmaWxsX2V4dHJ1c2lvbi52ZXJ0ZXguZ2xzbGBcbiAqIHdpdGggYSBmZXcgY28tb3JkaW5hdGUgc3BhY2UgZGlmZmVyZW5jZXMuXG4gKlxuICogLSBNYXRyaXggYG1gIHByb2plY3RzIHRvIHNjcmVlbi1waXhlbCBzcGFjZSBpbnN0ZWFkIG9mIHRvIGdsLWNvb3JkaW5hdGVzIChOREMpXG4gKiAtIFRleHR1cmUgcXVlcnlpbmcgaXMgcGVyZm9ybWVkIGluIHRleHR1cmUgcGl4ZWwgY29vcmRpbmF0ZXMgaW5zdGVhZCBvZiAgbm9ybWFsaXplZCB1diBjb29yZGluYXRlcy5cbiAqIC0gSGVpZ2h0IG9mZnNldCBjYWxjdWxhdGlvbiBmb3IgZmlsbC1leHRydXNpb24tYmFzZSBpcyBvZmZzZXQgd2l0aCAtMSBpbnN0ZWFkIG9mIC01IHRvIHByZXZlbnQgdW5kZXJncm91bmQgcGlja2luZy5cbiAqL1xuZnVuY3Rpb24gcHJvamVjdEV4dHJ1c2lvbjNEKGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCB6QmFzZTogbnVtYmVyLCB6VG9wOiBudW1iZXIsIHRyYW5zbGF0aW9uOiBQb2ludCwgbTogRmxvYXQzMkFycmF5LCBkZW1TYW1wbGVyOiBERU1TYW1wbGVyLCBjZW50cm9pZDogVmVjMiwgZXhhZ2dlcmF0aW9uOiBudW1iZXIsIGxhdDogbnVtYmVyKSB7XG4gICAgY29uc3QgcHJvamVjdGVkQmFzZSA9IFtdO1xuICAgIGNvbnN0IHByb2plY3RlZFRvcCA9IFtdO1xuICAgIGNvbnN0IHYgPSBbMCwgMCwgMCwgMV07XG5cbiAgICBmb3IgKGNvbnN0IHIgb2YgZ2VvbWV0cnkpIHtcbiAgICAgICAgY29uc3QgcmluZ0Jhc2UgPSBbXTtcbiAgICAgICAgY29uc3QgcmluZ1RvcCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2Ygcikge1xuICAgICAgICAgICAgY29uc3QgeCA9IHAueCArIHRyYW5zbGF0aW9uLng7XG4gICAgICAgICAgICBjb25zdCB5ID0gcC55ICsgdHJhbnNsYXRpb24ueTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodE9mZnNldCA9IGdldFRlcnJhaW5IZWlnaHRPZmZzZXQoeCwgeSwgekJhc2UsIHpUb3AsIGRlbVNhbXBsZXIsIGNlbnRyb2lkLCBleGFnZ2VyYXRpb24sIGxhdCk7XG5cbiAgICAgICAgICAgIHZbMF0gPSB4O1xuICAgICAgICAgICAgdlsxXSA9IHk7XG4gICAgICAgICAgICB2WzJdID0gaGVpZ2h0T2Zmc2V0LmJhc2U7XG4gICAgICAgICAgICB2WzNdID0gMTtcbiAgICAgICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NCh2LCB2LCBtKTtcbiAgICAgICAgICAgIHZbM10gPSBNYXRoLm1heCh2WzNdLCAwLjAwMDAxKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSB0b1BvaW50KFt2WzBdIC8gdlszXSwgdlsxXSAvIHZbM10sIHZbMl0gLyB2WzNdXSk7XG5cbiAgICAgICAgICAgIHZbMF0gPSB4O1xuICAgICAgICAgICAgdlsxXSA9IHk7XG4gICAgICAgICAgICB2WzJdID0gaGVpZ2h0T2Zmc2V0LnRvcDtcbiAgICAgICAgICAgIHZbM10gPSAxO1xuICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHYsIHYsIG0pO1xuICAgICAgICAgICAgdlszXSA9IE1hdGgubWF4KHZbM10sIDAuMDAwMDEpO1xuICAgICAgICAgICAgY29uc3QgdG9wID0gdG9Qb2ludChbdlswXSAvIHZbM10sIHZbMV0gLyB2WzNdLCB2WzJdIC8gdlszXV0pO1xuXG4gICAgICAgICAgICByaW5nQmFzZS5wdXNoKGJhc2UpO1xuICAgICAgICAgICAgcmluZ1RvcC5wdXNoKHRvcCk7XG4gICAgICAgIH1cbiAgICAgICAgcHJvamVjdGVkQmFzZS5wdXNoKHJpbmdCYXNlKTtcbiAgICAgICAgcHJvamVjdGVkVG9wLnB1c2gocmluZ1RvcCk7XG4gICAgfVxuICAgIHJldHVybiBbcHJvamVjdGVkQmFzZSwgcHJvamVjdGVkVG9wXTtcbn1cblxuZnVuY3Rpb24gdG9Qb2ludCh2OiBWZWM0KTogUG9pbnQge1xuICAgIGNvbnN0IHAgPSBuZXcgUG9pbnQodlswXSwgdlsxXSk7XG4gICAgcC56ID0gdlsyXTtcbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gZ2V0VGVycmFpbkhlaWdodE9mZnNldCh4OiBudW1iZXIsIHk6IG51bWJlciwgekJhc2U6IG51bWJlciwgelRvcDogbnVtYmVyLCBkZW1TYW1wbGVyOiBERU1TYW1wbGVyLCBjZW50cm9pZDogVmVjMiwgZXhhZ2dlcmF0aW9uOiBudW1iZXIsIGxhdDogbnVtYmVyKTogeyBiYXNlOiBudW1iZXIsIHRvcDogbnVtYmVyfSB7XG4gICAgY29uc3QgZWxlID0gZXhhZ2dlcmF0aW9uICogZGVtU2FtcGxlci5nZXRFbGV2YXRpb25BdCh4LCB5LCB0cnVlLCB0cnVlKTtcbiAgICBjb25zdCBmbGF0Um9vZiA9IGNlbnRyb2lkWzBdICE9PSAwO1xuICAgIGNvbnN0IGNlbnRyb2lkRWxldmF0aW9uID0gZmxhdFJvb2YgPyBjZW50cm9pZFsxXSA9PT0gMCA/IGV4YWdnZXJhdGlvbiAqIGVsZXZhdGlvbkZyb21VaW50MTYoY2VudHJvaWRbMF0pIDogZXhhZ2dlcmF0aW9uICogZmxhdEVsZXZhdGlvbihkZW1TYW1wbGVyLCBjZW50cm9pZCwgbGF0KSA6IGVsZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBiYXNlOiBlbGUgKyAoekJhc2UgPT09IDApID8gLTEgOiB6QmFzZSwgLy8gVXNlIC0xIGluc3RlYWQgb2YgLTUgaW4gc2hhZGVyIHRvIHByZXZlbnQgcGlja2luZyB1bmRlcmdyb3VuZFxuICAgICAgICB0b3A6IGZsYXRSb29mID8gTWF0aC5tYXgoY2VudHJvaWRFbGV2YXRpb24gKyB6VG9wLCBlbGUgKyB6QmFzZSArIDIpIDogZWxlICsgelRvcFxuICAgIH07XG59XG5cbi8vIEVsZXZhdGlvbiBpcyBlbmNvZGVkIGludG8gdW5pdDE2IGluIGZpbGxfZXh0cnVzaW9uX2J1Y2tldC5qcyBGaWxsRXh0cnVzaW9uQnVja2V0I2VuY29kZUNlbnRyb2lkXG5mdW5jdGlvbiBlbGV2YXRpb25Gcm9tVWludDE2KG46IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIG4gLyBFTEVWQVRJT05fU0NBTEUgLSBFTEVWQVRJT05fT0ZGU0VUO1xufVxuXG4vLyBFcXVpdmFsZW50IEdQVSBzaWRlIGZ1bmN0aW9uIGlzIGluIF9wcmVsdWRlX3RlcnJhaW4udmVydGV4Lmdsc2xcbmZ1bmN0aW9uIGZsYXRFbGV2YXRpb24oZGVtU2FtcGxlcjogREVNU2FtcGxlciwgY2VudHJvaWQ6IFZlYzIsIGxhdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBTcGFuIGFuZCBwb3MgYXJlIHBhY2tlZCB0d28gMTYgYml0IHVpbnQxNiB2YWx1ZXMgaW4gZmlsbF9leHRydXNpb25fYnVja2V0LmpzIEZpbGxFeHRydXNpb25CdWNrZXQjZW5jb2RlQ2VudHJvaWRcbiAgICAvLyBwb3MgaXMgZW5jb2RlZCBieSA8PCBieSAzIGJpdHMgdGh1cyBkaXZpZGluZyBieSA4IHBlcmZvcm1zIGVxdWl2YWxlbnQgb2YgcmlnaHQgc2hpZnRpbmcgaXQgYmFjay5cbiAgICBjb25zdCBwb3NYID0gTWF0aC5mbG9vcihjZW50cm9pZFswXSAvIDgpO1xuICAgIGNvbnN0IHBvc1kgPSBNYXRoLmZsb29yKGNlbnRyb2lkWzFdIC8gOCk7XG5cbiAgICAvLyBTcGFuIGlzIHN0b3JlZCBpbiB0aGUgbG93ZXIgdGhyZWUgYml0cyBpbiBtdWx0aXBsZXMgb2YgMTBcbiAgICBjb25zdCBzcGFuWCA9IDEwICogKGNlbnRyb2lkWzBdIC0gcG9zWCAqIDgpO1xuICAgIGNvbnN0IHNwYW5ZID0gMTAgKiAoY2VudHJvaWRbMV0gLSBwb3NZICogOCk7XG5cbiAgICAvLyBHZXQgaGVpZ2h0IGF0IGNlbnRyb2lkXG4gICAgY29uc3QgeiA9IGRlbVNhbXBsZXIuZ2V0RWxldmF0aW9uQXQocG9zWCwgcG9zWSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgY29uc3QgbWV0ZXJUb0RFTSA9IGRlbVNhbXBsZXIuZ2V0TWV0ZXJUb0RFTShsYXQpO1xuXG4gICAgY29uc3Qgd1ggPSBNYXRoLmZsb29yKDAuNSAqIChzcGFuWCAqIG1ldGVyVG9ERU0gLSAxKSk7XG4gICAgY29uc3Qgd1kgPSBNYXRoLmZsb29yKDAuNSAqIChzcGFuWSAqIG1ldGVyVG9ERU0gLSAxKSk7XG5cbiAgICBjb25zdCBwb3NQeCA9IGRlbVNhbXBsZXIudGlsZUNvb3JkVG9QaXhlbChwb3NYLCBwb3NZKTtcblxuICAgIGNvbnN0IG9mZnNldFggPSAyICogd1ggKyAxO1xuICAgIGNvbnN0IG9mZnNldFkgPSAyICogd1kgKyAxO1xuICAgIGNvbnN0IGNvcm5lcnMgPSBmb3VyU2FtcGxlKGRlbVNhbXBsZXIsIHBvc1B4LnggLSB3WCwgcG9zUHgueSAtIHdZLCBvZmZzZXRYLCBvZmZzZXRZKTtcblxuICAgIGNvbnN0IGRpZmZYID0gTWF0aC5hYnMoY29ybmVyc1swXSAtIGNvcm5lcnNbMV0pO1xuICAgIGNvbnN0IGRpZmZZID0gTWF0aC5hYnMoY29ybmVyc1syXSAtIGNvcm5lcnNbM10pO1xuICAgIGNvbnN0IGRpZmZaID0gTWF0aC5hYnMoY29ybmVyc1swXSAtIGNvcm5lcnNbMl0pO1xuICAgIGNvbnN0IGRpZmZXID0gTWF0aC5hYnMoY29ybmVyc1sxXSAtIGNvcm5lcnNbM10pO1xuXG4gICAgY29uc3QgZGlmZlN1bVggPSBkaWZmWCArIGRpZmZZO1xuICAgIGNvbnN0IGRpZmZTdW1ZID0gZGlmZlogKyBkaWZmVztcblxuICAgIGNvbnN0IHNsb3BlWCA9IE1hdGgubWluKDAuMjUsIG1ldGVyVG9ERU0gKiAwLjUgKiBkaWZmU3VtWCAvIG9mZnNldFgpO1xuICAgIGNvbnN0IHNsb3BlWSA9IE1hdGgubWluKDAuMjUsIG1ldGVyVG9ERU0gKiAwLjUgKiBkaWZmU3VtWSAvIG9mZnNldFkpO1xuXG4gICAgcmV0dXJuIHogKyBNYXRoLm1heChzbG9wZVggKiBzcGFuWCwgc2xvcGVZICogc3BhblkpO1xufVxuXG5mdW5jdGlvbiBmb3VyU2FtcGxlKGRlbVNhbXBsZXI6IERFTVNhbXBsZXIsIHBvc1g6IG51bWJlciwgcG9zWTogbnVtYmVyLCBvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlcik6IFZlYzQge1xuICAgIHJldHVybiBbXG4gICAgICAgIGRlbVNhbXBsZXIuZ2V0RWxldmF0aW9uQXRQaXhlbChwb3NYLCBwb3NZLCB0cnVlKSxcbiAgICAgICAgZGVtU2FtcGxlci5nZXRFbGV2YXRpb25BdFBpeGVsKHBvc1ggKyBvZmZzZXRZLCBwb3NZLCB0cnVlKSxcbiAgICAgICAgZGVtU2FtcGxlci5nZXRFbGV2YXRpb25BdFBpeGVsKHBvc1gsIHBvc1kgKyBvZmZzZXRZLCB0cnVlKSxcbiAgICAgICAgZGVtU2FtcGxlci5nZXRFbGV2YXRpb25BdFBpeGVsKHBvc1ggKyBvZmZzZXRYLCBwb3NZICsgb2Zmc2V0WSwgdHJ1ZSlcbiAgICBdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxsRXh0cnVzaW9uU3R5bGVMYXllcjtcbiIsIi8vIEBmbG93XG5pbXBvcnQge2NyZWF0ZUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5pbXBvcnQgdHlwZSB7U3RydWN0QXJyYXlMYXlvdXR9IGZyb20gJy4uLy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcblxuY29uc3QgbGluZUxheW91dEF0dHJpYnV0ZXM6IFN0cnVjdEFycmF5TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zX25vcm1hbCcsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV9kYXRhJywgY29tcG9uZW50czogNCwgdHlwZTogJ1VpbnQ4J30sXG4gICAge25hbWU6ICdhX2xpbmVzb2ZhcicsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdGbG9hdDMyJ31cbl0sIDQpO1xuXG5leHBvcnQgZGVmYXVsdCBsaW5lTGF5b3V0QXR0cmlidXRlcztcbmV4cG9ydCBjb25zdCB7bWVtYmVycywgc2l6ZSwgYWxpZ25tZW50fSA9IGxpbmVMYXlvdXRBdHRyaWJ1dGVzO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7Y3JlYXRlTGF5b3V0fSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmltcG9ydCB0eXBlIHtTdHJ1Y3RBcnJheUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5jb25zdCBsaW5lTGF5b3V0QXR0cmlidXRlc0V4dDogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wYWNrZWQnLCBjb21wb25lbnRzOiA0LCB0eXBlOiAnRmxvYXQzMid9XG5dKTtcblxuZXhwb3J0IGRlZmF1bHQgbGluZUxheW91dEF0dHJpYnV0ZXNFeHQ7XG5leHBvcnQgY29uc3Qge21lbWJlcnMsIHNpemUsIGFsaWdubWVudH0gPSBsaW5lTGF5b3V0QXR0cmlidXRlc0V4dDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7TGluZUxheW91dEFycmF5LCBMaW5lRXh0TGF5b3V0QXJyYXl9IGZyb20gJy4uL2FycmF5X3R5cGVzLmpzJztcblxuaW1wb3J0IHttZW1iZXJzIGFzIGxheW91dEF0dHJpYnV0ZXN9IGZyb20gJy4vbGluZV9hdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7bWVtYmVycyBhcyBsYXlvdXRBdHRyaWJ1dGVzRXh0fSBmcm9tICcuL2xpbmVfYXR0cmlidXRlc19leHQuanMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vc2VnbWVudC5qcyc7XG5pbXBvcnQge1Byb2dyYW1Db25maWd1cmF0aW9uU2V0fSBmcm9tICcuLi9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHtUcmlhbmdsZUluZGV4QXJyYXl9IGZyb20gJy4uL2luZGV4X2FycmF5X3R5cGUuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9leHRlbnQuanMnO1xuaW1wb3J0IG12dCBmcm9tICdAbWFwYm94L3ZlY3Rvci10aWxlJztcbmNvbnN0IHZlY3RvclRpbGVGZWF0dXJlVHlwZXMgPSBtdnQuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXM7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuaW1wb3J0IHtoYXNQYXR0ZXJuLCBhZGRQYXR0ZXJuRGVwZW5kZW5jaWVzfSBmcm9tICcuL3BhdHRlcm5fYnVja2V0X2ZlYXR1cmVzLmpzJztcbmltcG9ydCBsb2FkR2VvbWV0cnkgZnJvbSAnLi4vbG9hZF9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgdG9FdmFsdWF0aW9uRmVhdHVyZSBmcm9tICcuLi9ldmFsdWF0aW9uX2ZlYXR1cmUuanMnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7UHJvamVjdGlvblNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRQYXJhbWV0ZXJzLFxuICAgIEJ1Y2tldEZlYXR1cmUsXG4gICAgSW5kZXhlZEZlYXR1cmUsXG4gICAgUG9wdWxhdGVQYXJhbWV0ZXJzXG59IGZyb20gJy4uL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBMaW5lU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge1NlZ21lbnR9IGZyb20gJy4uL3NlZ21lbnQuanMnO1xuaW1wb3J0IHR5cGUge1JHQkFJbWFnZSwgU3ByaXRlUG9zaXRpb25zfSBmcm9tICcuLi8uLi91dGlsL2ltYWdlLmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBUZXh0dXJlIGZyb20gJy4uLy4uL3JlbmRlci90ZXh0dXJlLmpzJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL2luZGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi4vLi4vc291cmNlL3NvdXJjZV9zdGF0ZS5qcyc7XG5pbXBvcnQgdHlwZSBMaW5lQXRsYXMgZnJvbSAnLi4vLi4vcmVuZGVyL2xpbmVfYXRsYXMuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVUcmFuc2Zvcm19IGZyb20gJy4uLy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcblxuLy8gTk9URSBPTiBFWFRSVURFIFNDQUxFOlxuLy8gc2NhbGUgdGhlIGV4dHJ1c2lvbiB2ZWN0b3Igc28gdGhhdCB0aGUgbm9ybWFsIGxlbmd0aCBpcyB0aGlzIHZhbHVlLlxuLy8gY29udGFpbnMgdGhlIFwidGV4dHVyZVwiIG5vcm1hbHMgKC0xLi4xKS4gdGhpcyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBleHRydWRlXG4vLyBub3JtYWxzIGZvciBsaW5lIGpvaW5zLCBiZWNhdXNlIHRoZSB4LXZhbHVlIHJlbWFpbnMgMCBmb3IgdGhlIHRleHR1cmVcbi8vIG5vcm1hbCBhcnJheSwgd2hpbGUgdGhlIGV4dHJ1ZGUgbm9ybWFsIGFjdHVhbGx5IG1vdmVzIHRoZSB2ZXJ0ZXggdG8gY3JlYXRlXG4vLyB0aGUgYWN1dGUvYmV2ZWxsZWQgbGluZSBqb2luLlxuY29uc3QgRVhUUlVERV9TQ0FMRSA9IDYzO1xuXG4vKlxuICogU2hhcnAgY29ybmVycyBjYXVzZSBkYXNoZWQgbGluZXMgdG8gdGlsdCBiZWNhdXNlIHRoZSBkaXN0YW5jZSBhbG9uZyB0aGUgbGluZVxuICogaXMgdGhlIHNhbWUgYXQgYm90aCB0aGUgaW5uZXIgYW5kIG91dGVyIGNvcm5lcnMuIFRvIGltcHJvdmUgdGhlIGFwcGVhcmFuY2Ugb2ZcbiAqIGRhc2hlZCBsaW5lcyB3ZSBhZGQgZXh0cmEgcG9pbnRzIG5lYXIgc2hhcnAgY29ybmVycyBzbyB0aGF0IGEgc21hbGxlciBwYXJ0XG4gKiBvZiB0aGUgbGluZSBpcyB0aWx0ZWQuXG4gKlxuICogQ09TX0hBTEZfU0hBUlBfQ09STkVSIGNvbnRyb2xzIGhvdyBzaGFycCBhIGNvcm5lciBoYXMgdG8gYmUgZm9yIHVzIHRvIGFkZCBhblxuICogZXh0cmEgdmVydGV4LiBUaGUgZGVmYXVsdCBpcyA3NSBkZWdyZWVzLlxuICpcbiAqIFRoZSBuZXdseSBjcmVhdGVkIHZlcnRpY2VzIGFyZSBwbGFjZWQgU0hBUlBfQ09STkVSX09GRlNFVCBwaXhlbHMgZnJvbSB0aGUgY29ybmVyLlxuICovXG5jb25zdCBDT1NfSEFMRl9TSEFSUF9DT1JORVIgPSBNYXRoLmNvcyg3NSAvIDIgKiAoTWF0aC5QSSAvIDE4MCkpO1xuY29uc3QgU0hBUlBfQ09STkVSX09GRlNFVCA9IDE1O1xuXG4vLyBBbmdsZSBwZXIgdHJpYW5nbGUgZm9yIGFwcHJveGltYXRpbmcgcm91bmQgbGluZSBqb2lucy5cbmNvbnN0IERFR19QRVJfVFJJQU5HTEUgPSAyMDtcblxudHlwZSBMaW5lQ2xpcHMgPSB7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbn1cblxudHlwZSBHcmFkaWVudFRleHR1cmUgPSB7XG4gICAgdGV4dHVyZTogVGV4dHVyZTtcbiAgICBncmFkaWVudDogP1JHQkFJbWFnZTtcbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgTGluZUJ1Y2tldCBpbXBsZW1lbnRzIEJ1Y2tldCB7XG4gICAgZGlzdGFuY2U6IG51bWJlcjtcbiAgICB0b3RhbERpc3RhbmNlOiBudW1iZXI7XG4gICAgbWF4TGluZUxlbmd0aDogbnVtYmVyO1xuICAgIHNjYWxlZERpc3RhbmNlOiBudW1iZXI7XG4gICAgbGluZVNvRmFyOiBudW1iZXI7XG4gICAgbGluZUNsaXBzOiA/TGluZUNsaXBzO1xuXG4gICAgZTE6IG51bWJlcjtcbiAgICBlMjogbnVtYmVyO1xuXG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICB6b29tOiBudW1iZXI7XG4gICAgb3ZlcnNjYWxpbmc6IG51bWJlcjtcbiAgICBsYXllcnM6IEFycmF5PExpbmVTdHlsZUxheWVyPjtcbiAgICBsYXllcklkczogQXJyYXk8c3RyaW5nPjtcbiAgICBncmFkaWVudHM6IHtbc3RyaW5nXTogR3JhZGllbnRUZXh0dXJlfTtcbiAgICBzdGF0ZURlcGVuZGVudExheWVyczogQXJyYXk8YW55PjtcbiAgICBzdGF0ZURlcGVuZGVudExheWVySWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIHBhdHRlcm5GZWF0dXJlczogQXJyYXk8QnVja2V0RmVhdHVyZT47XG4gICAgbGluZUNsaXBzQXJyYXk6IEFycmF5PExpbmVDbGlwcz47XG5cbiAgICBsYXlvdXRWZXJ0ZXhBcnJheTogTGluZUxheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuICAgIGxheW91dFZlcnRleEFycmF5MjogTGluZUV4dExheW91dEFycmF5O1xuICAgIGxheW91dFZlcnRleEJ1ZmZlcjI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG5cbiAgICBoYXNQYXR0ZXJuOiBib29sZWFuO1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8TGluZVN0eWxlTGF5ZXI+O1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuICAgIHByb2plY3Rpb246IFByb2plY3Rpb25TcGVjaWZpY2F0aW9uO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogQnVja2V0UGFyYW1ldGVyczxMaW5lU3R5bGVMYXllcj4pIHtcbiAgICAgICAgdGhpcy56b29tID0gb3B0aW9ucy56b29tO1xuICAgICAgICB0aGlzLm92ZXJzY2FsaW5nID0gb3B0aW9ucy5vdmVyc2NhbGluZztcbiAgICAgICAgdGhpcy5sYXllcnMgPSBvcHRpb25zLmxheWVycztcbiAgICAgICAgdGhpcy5sYXllcklkcyA9IHRoaXMubGF5ZXJzLm1hcChsYXllciA9PiBsYXllci5pZCk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuICAgICAgICB0aGlzLnByb2plY3Rpb24gPSBvcHRpb25zLnByb2plY3Rpb247XG4gICAgICAgIHRoaXMuaGFzUGF0dGVybiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhdHRlcm5GZWF0dXJlcyA9IFtdO1xuICAgICAgICB0aGlzLmxpbmVDbGlwc0FycmF5ID0gW107XG4gICAgICAgIHRoaXMuZ3JhZGllbnRzID0ge307XG4gICAgICAgIHRoaXMubGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncmFkaWVudHNbbGF5ZXIuaWRdID0ge307XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgTGluZUxheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkyID0gbmV3IExpbmVFeHRMYXlvdXRBcnJheSgpO1xuICAgICAgICB0aGlzLmluZGV4QXJyYXkgPSBuZXcgVHJpYW5nbGVJbmRleEFycmF5KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uU2V0KG9wdGlvbnMubGF5ZXJzLCBvcHRpb25zLnpvb20pO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5tYXhMaW5lTGVuZ3RoID0gMDtcblxuICAgICAgICB0aGlzLnN0YXRlRGVwZW5kZW50TGF5ZXJJZHMgPSB0aGlzLmxheWVycy5maWx0ZXIoKGwpID0+IGwuaXNTdGF0ZURlcGVuZGVudCgpKS5tYXAoKGwpID0+IGwuaWQpO1xuICAgIH1cblxuICAgIHBvcHVsYXRlKGZlYXR1cmVzOiBBcnJheTxJbmRleGVkRmVhdHVyZT4sIG9wdGlvbnM6IFBvcHVsYXRlUGFyYW1ldGVycywgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIHRpbGVUcmFuc2Zvcm06IFRpbGVUcmFuc2Zvcm0pIHtcbiAgICAgICAgdGhpcy5oYXNQYXR0ZXJuID0gaGFzUGF0dGVybignbGluZScsIHRoaXMubGF5ZXJzLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgbGluZVNvcnRLZXkgPSB0aGlzLmxheWVyc1swXS5sYXlvdXQuZ2V0KCdsaW5lLXNvcnQta2V5Jyk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldEZlYXR1cmVzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaWQsIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSBvZiBmZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3QgbmVlZEdlb21ldHJ5ID0gdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIubmVlZEdlb21ldHJ5O1xuICAgICAgICAgICAgY29uc3QgZXZhbHVhdGlvbkZlYXR1cmUgPSB0b0V2YWx1YXRpb25GZWF0dXJlKGZlYXR1cmUsIG5lZWRHZW9tZXRyeSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5sYXllcnNbMF0uX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aGlzLnpvb20pLCBldmFsdWF0aW9uRmVhdHVyZSwgY2Fub25pY2FsKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvcnRLZXkgPSBsaW5lU29ydEtleSA/XG4gICAgICAgICAgICAgICAgbGluZVNvcnRLZXkuZXZhbHVhdGUoZXZhbHVhdGlvbkZlYXR1cmUsIHt9LCBjYW5vbmljYWwpIDpcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldEZlYXR1cmU6IEJ1Y2tldEZlYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZlYXR1cmUudHlwZSxcbiAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBuZWVkR2VvbWV0cnkgPyBldmFsdWF0aW9uRmVhdHVyZS5nZW9tZXRyeSA6IGxvYWRHZW9tZXRyeShmZWF0dXJlLCBjYW5vbmljYWwsIHRpbGVUcmFuc2Zvcm0pLFxuICAgICAgICAgICAgICAgIHBhdHRlcm5zOiB7fSxcbiAgICAgICAgICAgICAgICBzb3J0S2V5XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBidWNrZXRGZWF0dXJlcy5wdXNoKGJ1Y2tldEZlYXR1cmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpbmVTb3J0S2V5KSB7XG4gICAgICAgICAgICBidWNrZXRGZWF0dXJlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gYS5zb3J0S2V5IGlzIGFsd2F5cyBhIG51bWJlciB3aGVuIGluIHVzZVxuICAgICAgICAgICAgICAgIHJldHVybiAoKGEuc29ydEtleTogYW55KTogbnVtYmVyKSAtICgoYi5zb3J0S2V5OiBhbnkpOiBudW1iZXIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7bGluZUF0bGFzLCBmZWF0dXJlSW5kZXh9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgaGFzRmVhdHVyZURhc2hlcyA9IHRoaXMuYWRkQ29uc3RhbnREYXNoZXMobGluZUF0bGFzKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGJ1Y2tldEZlYXR1cmUgb2YgYnVja2V0RmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHtnZW9tZXRyeSwgaW5kZXgsIHNvdXJjZUxheWVySW5kZXh9ID0gYnVja2V0RmVhdHVyZTtcblxuICAgICAgICAgICAgaWYgKGhhc0ZlYXR1cmVEYXNoZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmVEYXNoZXMoYnVja2V0RmVhdHVyZSwgbGluZUF0bGFzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzUGF0dGVybikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5CdWNrZXRGZWF0dXJlID0gYWRkUGF0dGVybkRlcGVuZGVuY2llcygnbGluZScsIHRoaXMubGF5ZXJzLCBidWNrZXRGZWF0dXJlLCB0aGlzLnpvb20sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIC8vIHBhdHRlcm4gZmVhdHVyZXMgYXJlIGFkZGVkIG9ubHkgb25jZSB0aGUgcGF0dGVybiBpcyBsb2FkZWQgaW50byB0aGUgaW1hZ2UgYXRsYXNcbiAgICAgICAgICAgICAgICAvLyBzbyBhcmUgc3RvcmVkIGR1cmluZyBwb3B1bGF0ZSB1bnRpbCBsYXRlciB1cGRhdGVkIHdpdGggcG9zaXRpb25zIGJ5IHRpbGUgd29ya2VyIGluIGFkZEZlYXR1cmVzXG4gICAgICAgICAgICAgICAgdGhpcy5wYXR0ZXJuRmVhdHVyZXMucHVzaChwYXR0ZXJuQnVja2V0RmVhdHVyZSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGJ1Y2tldEZlYXR1cmUsIGdlb21ldHJ5LCBpbmRleCwgY2Fub25pY2FsLCBsaW5lQXRsYXMucG9zaXRpb25zLCBvcHRpb25zLmF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlc1tpbmRleF0uZmVhdHVyZTtcbiAgICAgICAgICAgIGZlYXR1cmVJbmRleC5pbnNlcnQoZmVhdHVyZSwgZ2VvbWV0cnksIGluZGV4LCBzb3VyY2VMYXllckluZGV4LCB0aGlzLmluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZENvbnN0YW50RGFzaGVzKGxpbmVBdGxhczogTGluZUF0bGFzKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBoYXNGZWF0dXJlRGFzaGVzID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICAgICAgY29uc3QgZGFzaFByb3BlcnR5VmFsdWUgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtZGFzaGFycmF5JykudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBjYXBQcm9wZXJ0eVZhbHVlID0gbGF5ZXIubGF5b3V0LmdldCgnbGluZS1jYXAnKS52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGRhc2hQcm9wZXJ0eVZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcgfHwgY2FwUHJvcGVydHlWYWx1ZS5raW5kICE9PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICAgICAgaGFzRmVhdHVyZURhc2hlcyA9IHRydWU7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RDYXAgPSBjYXBQcm9wZXJ0eVZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0RGFzaCA9IGRhc2hQcm9wZXJ0eVZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICghY29uc3REYXNoKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsaW5lQXRsYXMuYWRkRGFzaChjb25zdERhc2guZnJvbSwgY29uc3RDYXApO1xuICAgICAgICAgICAgICAgIGxpbmVBdGxhcy5hZGREYXNoKGNvbnN0RGFzaC50bywgY29uc3RDYXApO1xuICAgICAgICAgICAgICAgIGlmIChjb25zdERhc2gub3RoZXIpIGxpbmVBdGxhcy5hZGREYXNoKGNvbnN0RGFzaC5vdGhlciwgY29uc3RDYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0ZlYXR1cmVEYXNoZXM7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZURhc2hlcyhmZWF0dXJlOiBCdWNrZXRGZWF0dXJlLCBsaW5lQXRsYXM6IExpbmVBdGxhcykge1xuXG4gICAgICAgIGNvbnN0IHpvb20gPSB0aGlzLnpvb207XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICAgICAgY29uc3QgZGFzaFByb3BlcnR5VmFsdWUgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtZGFzaGFycmF5JykudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBjYXBQcm9wZXJ0eVZhbHVlID0gbGF5ZXIubGF5b3V0LmdldCgnbGluZS1jYXAnKS52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGRhc2hQcm9wZXJ0eVZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcgJiYgY2FwUHJvcGVydHlWYWx1ZS5raW5kID09PSAnY29uc3RhbnQnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgbGV0IG1pbkRhc2hBcnJheSwgbWlkRGFzaEFycmF5LCBtYXhEYXNoQXJyYXksIG1pbkNhcCwgbWlkQ2FwLCBtYXhDYXA7XG5cbiAgICAgICAgICAgIGlmIChkYXNoUHJvcGVydHlWYWx1ZS5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3REYXNoID0gZGFzaFByb3BlcnR5VmFsdWUudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKCFjb25zdERhc2gpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIG1pbkRhc2hBcnJheSA9IGNvbnN0RGFzaC5vdGhlciB8fCBjb25zdERhc2gudG87XG4gICAgICAgICAgICAgICAgbWlkRGFzaEFycmF5ID0gY29uc3REYXNoLnRvO1xuICAgICAgICAgICAgICAgIG1heERhc2hBcnJheSA9IGNvbnN0RGFzaC5mcm9tO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1pbkRhc2hBcnJheSA9IGRhc2hQcm9wZXJ0eVZhbHVlLmV2YWx1YXRlKHt6b29tOiB6b29tIC0gMX0sIGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgIG1pZERhc2hBcnJheSA9IGRhc2hQcm9wZXJ0eVZhbHVlLmV2YWx1YXRlKHt6b29tfSwgZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgbWF4RGFzaEFycmF5ID0gZGFzaFByb3BlcnR5VmFsdWUuZXZhbHVhdGUoe3pvb206IHpvb20gKyAxfSwgZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYXBQcm9wZXJ0eVZhbHVlLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgICAgICAgICBtaW5DYXAgPSBtaWRDYXAgPSBtYXhDYXAgPSBjYXBQcm9wZXJ0eVZhbHVlLnZhbHVlO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1pbkNhcCA9IGNhcFByb3BlcnR5VmFsdWUuZXZhbHVhdGUoe3pvb206IHpvb20gLSAxfSwgZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgbWlkQ2FwID0gY2FwUHJvcGVydHlWYWx1ZS5ldmFsdWF0ZSh7em9vbX0sIGZlYXR1cmUpO1xuICAgICAgICAgICAgICAgIG1heENhcCA9IGNhcFByb3BlcnR5VmFsdWUuZXZhbHVhdGUoe3pvb206IHpvb20gKyAxfSwgZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpbmVBdGxhcy5hZGREYXNoKG1pbkRhc2hBcnJheSwgbWluQ2FwKTtcbiAgICAgICAgICAgIGxpbmVBdGxhcy5hZGREYXNoKG1pZERhc2hBcnJheSwgbWlkQ2FwKTtcbiAgICAgICAgICAgIGxpbmVBdGxhcy5hZGREYXNoKG1heERhc2hBcnJheSwgbWF4Q2FwKTtcblxuICAgICAgICAgICAgY29uc3QgbWluID0gbGluZUF0bGFzLmdldEtleShtaW5EYXNoQXJyYXksIG1pbkNhcCk7XG4gICAgICAgICAgICBjb25zdCBtaWQgPSBsaW5lQXRsYXMuZ2V0S2V5KG1pZERhc2hBcnJheSwgbWlkQ2FwKTtcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IGxpbmVBdGxhcy5nZXRLZXkobWF4RGFzaEFycmF5LCBtYXhDYXApO1xuXG4gICAgICAgICAgICAvLyBzYXZlIHBvc2l0aW9ucyBmb3IgcGFpbnQgYXJyYXlcbiAgICAgICAgICAgIGZlYXR1cmUucGF0dGVybnNbbGF5ZXIuaWRdID0ge21pbiwgbWlkLCBtYXh9O1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICB1cGRhdGUoc3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgaW1hZ2VQb3NpdGlvbnM6IFNwcml0ZVBvc2l0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcnMubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwZGF0ZVBhaW50QXJyYXlzKHN0YXRlcywgdnRMYXllciwgdGhpcy5zdGF0ZURlcGVuZGVudExheWVycywgYXZhaWxhYmxlSW1hZ2VzLCBpbWFnZVBvc2l0aW9ucyk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZXMob3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgaW1hZ2VQb3NpdGlvbnM6IFNwcml0ZVBvc2l0aW9ucywgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBfOiBUaWxlVHJhbnNmb3JtKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiB0aGlzLnBhdHRlcm5GZWF0dXJlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRGZWF0dXJlKGZlYXR1cmUsIGZlYXR1cmUuZ2VvbWV0cnksIGZlYXR1cmUuaW5kZXgsIGNhbm9uaWNhbCwgaW1hZ2VQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgdXBsb2FkUGVuZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnVwbG9hZGVkIHx8IHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLm5lZWRzVXBsb2FkO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICghdGhpcy51cGxvYWRlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0VmVydGV4QXJyYXkyLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyMiA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMubGF5b3V0VmVydGV4QXJyYXkyLCBsYXlvdXRBdHRyaWJ1dGVzRXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgbGF5b3V0QXR0cmlidXRlcyk7XG4gICAgICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgdGhpcy51cGxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGxpbmVGZWF0dXJlQ2xpcHMoZmVhdHVyZTogQnVja2V0RmVhdHVyZSk6ID9MaW5lQ2xpcHMge1xuICAgICAgICBpZiAoISFmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KCdtYXBib3hfY2xpcF9zdGFydCcpICYmIGZlYXR1cmUucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSgnbWFwYm94X2NsaXBfZW5kJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gK2ZlYXR1cmUucHJvcGVydGllc1snbWFwYm94X2NsaXBfc3RhcnQnXTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9ICtmZWF0dXJlLnByb3BlcnRpZXNbJ21hcGJveF9jbGlwX2VuZCddO1xuICAgICAgICAgICAgcmV0dXJuIHtzdGFydCwgZW5kfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgZ2VvbWV0cnk6IEFycmF5PEFycmF5PFBvaW50Pj4sIGluZGV4OiBudW1iZXIsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCBpbWFnZVBvc2l0aW9uczogU3ByaXRlUG9zaXRpb25zLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0O1xuICAgICAgICBjb25zdCBqb2luID0gbGF5b3V0LmdldCgnbGluZS1qb2luJykuZXZhbHVhdGUoZmVhdHVyZSwge30pO1xuICAgICAgICBjb25zdCBjYXAgPSBsYXlvdXQuZ2V0KCdsaW5lLWNhcCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9KTtcbiAgICAgICAgY29uc3QgbWl0ZXJMaW1pdCA9IGxheW91dC5nZXQoJ2xpbmUtbWl0ZXItbGltaXQnKTtcbiAgICAgICAgY29uc3Qgcm91bmRMaW1pdCA9IGxheW91dC5nZXQoJ2xpbmUtcm91bmQtbGltaXQnKTtcbiAgICAgICAgdGhpcy5saW5lQ2xpcHMgPSB0aGlzLmxpbmVGZWF0dXJlQ2xpcHMoZmVhdHVyZSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGdlb21ldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFkZExpbmUobGluZSwgZmVhdHVyZSwgam9pbiwgY2FwLCBtaXRlckxpbWl0LCByb3VuZExpbWl0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXModGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIGZlYXR1cmUsIGluZGV4LCBpbWFnZVBvc2l0aW9ucywgYXZhaWxhYmxlSW1hZ2VzLCBjYW5vbmljYWwpO1xuICAgIH1cblxuICAgIGFkZExpbmUodmVydGljZXM6IEFycmF5PFBvaW50PiwgZmVhdHVyZTogQnVja2V0RmVhdHVyZSwgam9pbjogc3RyaW5nLCBjYXA6IHN0cmluZywgbWl0ZXJMaW1pdDogbnVtYmVyLCByb3VuZExpbWl0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5kaXN0YW5jZSA9IDA7XG4gICAgICAgIHRoaXMuc2NhbGVkRGlzdGFuY2UgPSAwO1xuICAgICAgICB0aGlzLnRvdGFsRGlzdGFuY2UgPSAwO1xuICAgICAgICB0aGlzLmxpbmVTb0ZhciA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMubGluZUNsaXBzKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVDbGlwc0FycmF5LnB1c2godGhpcy5saW5lQ2xpcHMpO1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0b3RhbCBkaXN0YW5jZSwgaW4gdGlsZSB1bml0cywgb2YgdGhpcyB0aWxlZCBsaW5lIGZlYXR1cmVcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbERpc3RhbmNlICs9IHZlcnRpY2VzW2ldLmRpc3QodmVydGljZXNbaSArIDFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2NhbGVkRGlzdGFuY2UoKTtcbiAgICAgICAgICAgIHRoaXMubWF4TGluZUxlbmd0aCA9IE1hdGgubWF4KHRoaXMubWF4TGluZUxlbmd0aCwgdGhpcy50b3RhbERpc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUG9seWdvbiA9IHZlY3RvclRpbGVGZWF0dXJlVHlwZXNbZmVhdHVyZS50eXBlXSA9PT0gJ1BvbHlnb24nO1xuXG4gICAgICAgIC8vIElmIHRoZSBsaW5lIGhhcyBkdXBsaWNhdGUgdmVydGljZXMgYXQgdGhlIGVuZHMsIGFkanVzdCBzdGFydC9sZW5ndGggdG8gcmVtb3ZlIHRoZW0uXG4gICAgICAgIGxldCBsZW4gPSB2ZXJ0aWNlcy5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChsZW4gPj0gMiAmJiB2ZXJ0aWNlc1tsZW4gLSAxXS5lcXVhbHModmVydGljZXNbbGVuIC0gMl0pKSB7XG4gICAgICAgICAgICBsZW4tLTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZmlyc3QgPSAwO1xuICAgICAgICB3aGlsZSAoZmlyc3QgPCBsZW4gLSAxICYmIHZlcnRpY2VzW2ZpcnN0XS5lcXVhbHModmVydGljZXNbZmlyc3QgKyAxXSkpIHtcbiAgICAgICAgICAgIGZpcnN0Kys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZ25vcmUgaW52YWxpZCBnZW9tZXRyeS5cbiAgICAgICAgaWYgKGxlbiA8IChpc1BvbHlnb24gPyAzIDogMikpIHJldHVybjtcblxuICAgICAgICBpZiAoam9pbiA9PT0gJ2JldmVsJykgbWl0ZXJMaW1pdCA9IDEuMDU7XG5cbiAgICAgICAgY29uc3Qgc2hhcnBDb3JuZXJPZmZzZXQgPSB0aGlzLm92ZXJzY2FsaW5nIDw9IDE2ID9cbiAgICAgICAgICAgIFNIQVJQX0NPUk5FUl9PRkZTRVQgKiBFWFRFTlQgLyAoNTEyICogdGhpcy5vdmVyc2NhbGluZykgOlxuICAgICAgICAgICAgMDtcblxuICAgICAgICAvLyB3ZSBjb3VsZCBiZSBtb3JlIHByZWNpc2UsIGJ1dCBpdCB3b3VsZCBvbmx5IHNhdmUgYSBuZWdsaWdpYmxlIGFtb3VudCBvZiBzcGFjZVxuICAgICAgICBjb25zdCBzZWdtZW50ID0gdGhpcy5zZWdtZW50cy5wcmVwYXJlU2VnbWVudChsZW4gKiAxMCwgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5pbmRleEFycmF5KTtcblxuICAgICAgICBsZXQgY3VycmVudFZlcnRleDtcbiAgICAgICAgbGV0IHByZXZWZXJ0ZXggPSAoKHVuZGVmaW5lZDogYW55KTogUG9pbnQpO1xuICAgICAgICBsZXQgbmV4dFZlcnRleCA9ICgodW5kZWZpbmVkOiBhbnkpOiBQb2ludCk7XG4gICAgICAgIGxldCBwcmV2Tm9ybWFsID0gKCh1bmRlZmluZWQ6IGFueSk6IFBvaW50KTtcbiAgICAgICAgbGV0IG5leHROb3JtYWwgPSAoKHVuZGVmaW5lZDogYW55KTogUG9pbnQpO1xuXG4gICAgICAgIC8vIHRoZSBsYXN0IHR3byB2ZXJ0aWNlcyBhZGRlZFxuICAgICAgICB0aGlzLmUxID0gdGhpcy5lMiA9IC0xO1xuXG4gICAgICAgIGlmIChpc1BvbHlnb24pIHtcbiAgICAgICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tsZW4gLSAyXTtcbiAgICAgICAgICAgIG5leHROb3JtYWwgPSB2ZXJ0aWNlc1tmaXJzdF0uc3ViKGN1cnJlbnRWZXJ0ZXgpLl91bml0KCkuX3BlcnAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7XG5cbiAgICAgICAgICAgIG5leHRWZXJ0ZXggPSBpID09PSBsZW4gLSAxID9cbiAgICAgICAgICAgICAgICAoaXNQb2x5Z29uID8gdmVydGljZXNbZmlyc3QgKyAxXSA6ICh1bmRlZmluZWQ6IGFueSkpIDogLy8gaWYgaXQncyBhIHBvbHlnb24sIHRyZWF0IHRoZSBsYXN0IHZlcnRleCBsaWtlIHRoZSBmaXJzdFxuICAgICAgICAgICAgICAgIHZlcnRpY2VzW2kgKyAxXTsgLy8ganVzdCB0aGUgbmV4dCB2ZXJ0ZXhcblxuICAgICAgICAgICAgLy8gaWYgdHdvIGNvbnNlY3V0aXZlIHZlcnRpY2VzIGV4aXN0LCBza2lwIHRoZSBjdXJyZW50IG9uZVxuICAgICAgICAgICAgaWYgKG5leHRWZXJ0ZXggJiYgdmVydGljZXNbaV0uZXF1YWxzKG5leHRWZXJ0ZXgpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgaWYgKG5leHROb3JtYWwpIHByZXZOb3JtYWwgPSBuZXh0Tm9ybWFsO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRWZXJ0ZXgpIHByZXZWZXJ0ZXggPSBjdXJyZW50VmVydGV4O1xuXG4gICAgICAgICAgICBjdXJyZW50VmVydGV4ID0gdmVydGljZXNbaV07XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbm9ybWFsIHRvd2FyZHMgdGhlIG5leHQgdmVydGV4IGluIHRoaXMgbGluZS4gSW4gY2FzZVxuICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gbmV4dCB2ZXJ0ZXgsIHByZXRlbmQgdGhhdCB0aGUgbGluZSBpcyBjb250aW51aW5nIHN0cmFpZ2h0LFxuICAgICAgICAgICAgLy8gbWVhbmluZyB0aGF0IHdlIGFyZSBqdXN0IHVzaW5nIHRoZSBwcmV2aW91cyBub3JtYWwuXG4gICAgICAgICAgICBuZXh0Tm9ybWFsID0gbmV4dFZlcnRleCA/IG5leHRWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXgpLl91bml0KCkuX3BlcnAoKSA6IHByZXZOb3JtYWw7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGRvbid0IGhhdmUgYSBwcmV2aW91cyBub3JtYWwsIHRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiBhXG4gICAgICAgICAgICAvLyBub24tY2xvc2VkIGxpbmUsIHNvIHdlJ3JlIGRvaW5nIGEgc3RyYWlnaHQgXCJqb2luXCIuXG4gICAgICAgICAgICBwcmV2Tm9ybWFsID0gcHJldk5vcm1hbCB8fCBuZXh0Tm9ybWFsO1xuXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIG5vcm1hbCBvZiB0aGUgam9pbiBleHRydXNpb24uIEl0IGlzIHRoZSBhbmdsZSBiaXNlY3RvclxuICAgICAgICAgICAgLy8gb2YgdGhlIHNlZ21lbnRzIGJldHdlZW4gdGhlIHByZXZpb3VzIGxpbmUgYW5kIHRoZSBuZXh0IGxpbmUuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBvZiAxODDCsCBhbmdsZXMsIHRoZSBwcmV2IGFuZCBuZXh0IG5vcm1hbHMgY2FuY2VsIGVhY2ggb3RoZXIgb3V0OlxuICAgICAgICAgICAgLy8gcHJldk5vcm1hbCArIG5leHROb3JtYWwgPSAoMCwgMCksIGl0cyBtYWduaXR1ZGUgaXMgMCwgc28gdGhlIHVuaXQgdmVjdG9yIHdvdWxkIGJlXG4gICAgICAgICAgICAvLyB1bmRlZmluZWQuIEluIHRoYXQgY2FzZSwgd2UncmUga2VlcGluZyB0aGUgam9pbk5vcm1hbCBhdCAoMCwgMCksIHNvIHRoYXQgdGhlIGNvc0hhbGZBbmdsZVxuICAgICAgICAgICAgLy8gYmVsb3cgd2lsbCBhbHNvIGJlY29tZSAwIGFuZCBtaXRlckxlbmd0aCB3aWxsIGJlY29tZSBJbmZpbml0eS5cbiAgICAgICAgICAgIGxldCBqb2luTm9ybWFsID0gcHJldk5vcm1hbC5hZGQobmV4dE5vcm1hbCk7XG4gICAgICAgICAgICBpZiAoam9pbk5vcm1hbC54ICE9PSAwIHx8IGpvaW5Ob3JtYWwueSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwuX3VuaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qICBqb2luTm9ybWFsICAgICBwcmV2Tm9ybWFsXG4gICAgICAgICAgICAgKiAgICAgICAgICAgICDihpYgICAgICDihpFcbiAgICAgICAgICAgICAqICAgICAgICAgICAgICAgIC5fX19fX19fXy4gcHJldlZlcnRleFxuICAgICAgICAgICAgICogICAgICAgICAgICAgICAgfFxuICAgICAgICAgICAgICogbmV4dE5vcm1hbCAg4oaQICB8ICBjdXJyZW50VmVydGV4XG4gICAgICAgICAgICAgKiAgICAgICAgICAgICAgICB8XG4gICAgICAgICAgICAgKiAgICAgbmV4dFZlcnRleCAhXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBjb3NpbmVzIG9mIHRoZSBhbmdsZSAoYW5kIGl0cyBoYWxmKSB1c2luZyBkb3QgcHJvZHVjdFxuICAgICAgICAgICAgY29uc3QgY29zQW5nbGUgPSBwcmV2Tm9ybWFsLnggKiBuZXh0Tm9ybWFsLnggKyBwcmV2Tm9ybWFsLnkgKiBuZXh0Tm9ybWFsLnk7XG4gICAgICAgICAgICBjb25zdCBjb3NIYWxmQW5nbGUgPSBqb2luTm9ybWFsLnggKiBuZXh0Tm9ybWFsLnggKyBqb2luTm9ybWFsLnkgKiBuZXh0Tm9ybWFsLnk7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBtaXRlciAodGhlIHJhdGlvIG9mIHRoZSBtaXRlciB0byB0aGUgd2lkdGgpXG4gICAgICAgICAgICAvLyBhcyB0aGUgaW52ZXJzZSBvZiBjb3NpbmUgb2YgdGhlIGFuZ2xlIGJldHdlZW4gbmV4dCBhbmQgam9pbiBub3JtYWxzXG4gICAgICAgICAgICBjb25zdCBtaXRlckxlbmd0aCA9IGNvc0hhbGZBbmdsZSAhPT0gMCA/IDEgLyBjb3NIYWxmQW5nbGUgOiBJbmZpbml0eTtcblxuICAgICAgICAgICAgLy8gYXBwcm94aW1hdGUgYW5nbGUgZnJvbSBjb3NpbmVcbiAgICAgICAgICAgIGNvbnN0IGFwcHJveEFuZ2xlID0gMiAqIE1hdGguc3FydCgyIC0gMiAqIGNvc0hhbGZBbmdsZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGlzU2hhcnBDb3JuZXIgPSBjb3NIYWxmQW5nbGUgPCBDT1NfSEFMRl9TSEFSUF9DT1JORVIgJiYgcHJldlZlcnRleCAmJiBuZXh0VmVydGV4O1xuICAgICAgICAgICAgY29uc3QgbGluZVR1cm5zTGVmdCA9IHByZXZOb3JtYWwueCAqIG5leHROb3JtYWwueSAtIHByZXZOb3JtYWwueSAqIG5leHROb3JtYWwueCA+IDA7XG5cbiAgICAgICAgICAgIGlmIChpc1NoYXJwQ29ybmVyICYmIGkgPiBmaXJzdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZTZWdtZW50TGVuZ3RoID0gY3VycmVudFZlcnRleC5kaXN0KHByZXZWZXJ0ZXgpO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2U2VnbWVudExlbmd0aCA+IDIgKiBzaGFycENvcm5lck9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdQcmV2VmVydGV4ID0gY3VycmVudFZlcnRleC5zdWIoY3VycmVudFZlcnRleC5zdWIocHJldlZlcnRleCkuX211bHQoc2hhcnBDb3JuZXJPZmZzZXQgLyBwcmV2U2VnbWVudExlbmd0aCkuX3JvdW5kKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlKHByZXZWZXJ0ZXgsIG5ld1ByZXZWZXJ0ZXgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgobmV3UHJldlZlcnRleCwgcHJldk5vcm1hbCwgMCwgMCwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHByZXZWZXJ0ZXggPSBuZXdQcmV2VmVydGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVGhlIGpvaW4gaWYgYSBtaWRkbGUgdmVydGV4LCBvdGhlcndpc2UgdGhlIGNhcC5cbiAgICAgICAgICAgIGNvbnN0IG1pZGRsZVZlcnRleCA9IHByZXZWZXJ0ZXggJiYgbmV4dFZlcnRleDtcbiAgICAgICAgICAgIGxldCBjdXJyZW50Sm9pbiA9IG1pZGRsZVZlcnRleCA/IGpvaW4gOiBpc1BvbHlnb24gPyAnYnV0dCcgOiBjYXA7XG5cbiAgICAgICAgICAgIGlmIChtaWRkbGVWZXJ0ZXggJiYgY3VycmVudEpvaW4gPT09ICdyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAobWl0ZXJMZW5ndGggPCByb3VuZExpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRKb2luID0gJ21pdGVyJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pdGVyTGVuZ3RoIDw9IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEpvaW4gPSAnZmFrZXJvdW5kJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ21pdGVyJyAmJiBtaXRlckxlbmd0aCA+IG1pdGVyTGltaXQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Sm9pbiA9ICdiZXZlbCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2JldmVsJykge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIGV4dHJ1ZGUgbGVuZ3RoIGlzIDEyOCAvIDYzID0gMiB0aW1lcyB0aGUgd2lkdGggb2YgdGhlIGxpbmVcbiAgICAgICAgICAgICAgICAvLyBzbyBpZiBtaXRlckxlbmd0aCA+PSAyIHdlIG5lZWQgdG8gZHJhdyBhIGRpZmZlcmVudCB0eXBlIG9mIGJldmVsIGhlcmUuXG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoID4gMikgY3VycmVudEpvaW4gPSAnZmxpcGJldmVsJztcblxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBtaXRlckxlbmd0aCBpcyByZWFsbHkgc21hbGwgYW5kIHRoZSBsaW5lIGJldmVsIHdvdWxkbid0IGJlIHZpc2libGUsXG4gICAgICAgICAgICAgICAgLy8ganVzdCBkcmF3IGEgbWl0ZXIgam9pbiB0byBzYXZlIGEgdHJpYW5nbGUuXG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoIDwgbWl0ZXJMaW1pdCkgY3VycmVudEpvaW4gPSAnbWl0ZXInO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgaG93IGZhciBhbG9uZyB0aGUgbGluZSB0aGUgY3VycmVudFZlcnRleCBpc1xuICAgICAgICAgICAgaWYgKHByZXZWZXJ0ZXgpIHRoaXMudXBkYXRlRGlzdGFuY2UocHJldlZlcnRleCwgY3VycmVudFZlcnRleCk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ21pdGVyJykge1xuXG4gICAgICAgICAgICAgICAgam9pbk5vcm1hbC5fbXVsdChtaXRlckxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGpvaW5Ob3JtYWwsIDAsIDAsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnZmxpcGJldmVsJykge1xuICAgICAgICAgICAgICAgIC8vIG1pdGVyIGlzIHRvbyBiaWcsIGZsaXAgdGhlIGRpcmVjdGlvbiB0byBtYWtlIGEgYmV2ZWxlZCBqb2luXG5cbiAgICAgICAgICAgICAgICBpZiAobWl0ZXJMZW5ndGggPiAxMDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxtb3N0IHBhcmFsbGVsIGxpbmVzXG4gICAgICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwgPSBuZXh0Tm9ybWFsLm11bHQoLTEpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmV2ZWxMZW5ndGggPSBtaXRlckxlbmd0aCAqIHByZXZOb3JtYWwuYWRkKG5leHROb3JtYWwpLm1hZygpIC8gcHJldk5vcm1hbC5zdWIobmV4dE5vcm1hbCkubWFnKCk7XG4gICAgICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwuX3BlcnAoKS5fbXVsdChiZXZlbExlbmd0aCAqIChsaW5lVHVybnNMZWZ0ID8gLTEgOiAxKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBqb2luTm9ybWFsLCAwLCAwLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgam9pbk5vcm1hbC5tdWx0KC0xKSwgMCwgMCwgc2VnbWVudCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEpvaW4gPT09ICdiZXZlbCcgfHwgY3VycmVudEpvaW4gPT09ICdmYWtlcm91bmQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gLU1hdGguc3FydChtaXRlckxlbmd0aCAqIG1pdGVyTGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0QSA9IGxpbmVUdXJuc0xlZnQgPyBvZmZzZXQgOiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldEIgPSBsaW5lVHVybnNMZWZ0ID8gMCA6IG9mZnNldDtcblxuICAgICAgICAgICAgICAgIC8vIENsb3NlIHByZXZpb3VzIHNlZ21lbnQgd2l0aCBhIGJldmVsXG4gICAgICAgICAgICAgICAgaWYgKHByZXZWZXJ0ZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHByZXZOb3JtYWwsIG9mZnNldEEsIG9mZnNldEIsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2Zha2Vyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGpvaW4gYW5nbGUgaXMgc2hhcnAgZW5vdWdoIHRoYXQgYSByb3VuZCBqb2luIHdvdWxkIGJlIHZpc2libGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJldmVsIGpvaW5zIGZpbGwgdGhlIGdhcCBiZXR3ZWVuIHNlZ21lbnRzIHdpdGggYSBzaW5nbGUgcGllIHNsaWNlIHRyaWFuZ2xlLlxuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSByb3VuZCBqb2luIGJ5IGFkZGluZyBtdWx0aXBsZSBwaWUgc2xpY2VzLiBUaGUgam9pbiBpc24ndCBhY3R1YWxseSByb3VuZCwgYnV0XG4gICAgICAgICAgICAgICAgICAgIC8vIGl0IGxvb2tzIGxpa2UgaXQgaXMgYXQgdGhlIHNpemVzIHdlIHJlbmRlciBsaW5lcyBhdC5cblxuICAgICAgICAgICAgICAgICAgICAvLyBwaWNrIHRoZSBudW1iZXIgb2YgdHJpYW5nbGVzIGZvciBhcHByb3hpbWF0aW5nIHJvdW5kIGpvaW4gYnkgYmFzZWQgb24gdGhlIGFuZ2xlIGJldHdlZW4gbm9ybWFsc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gTWF0aC5yb3VuZCgoYXBwcm94QW5nbGUgKiAxODAgLyBNYXRoLlBJKSAvIERFR19QRVJfVFJJQU5HTEUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG0gPSAxOyBtIDwgbjsgbSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdCA9IG0gLyBuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgIT09IDAuNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcHJveGltYXRlIHNwaGVyaWNhbCBpbnRlcnBvbGF0aW9uIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AbW91cm5lci9hcHByb3hpbWF0aW5nLWdlb21ldHJpYy1zbGVycFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQyID0gdCAtIDAuNTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBID0gMS4wOTA0ICsgY29zQW5nbGUgKiAoLTMuMjQ1MiArIGNvc0FuZ2xlICogKDMuNTU2NDUgLSBjb3NBbmdsZSAqIDEuNDM1MTkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCID0gMC44NDgwMTMgKyBjb3NBbmdsZSAqICgtMS4wNjAyMSArIGNvc0FuZ2xlICogMC4yMTU2MzgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ICsgdCAqIHQyICogKHQgLSAxKSAqIChBICogdDIgKiB0MiArIEIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0cnVkZSA9IG5leHROb3JtYWwuc3ViKHByZXZOb3JtYWwpLl9tdWx0KHQpLl9hZGQocHJldk5vcm1hbCkuX3VuaXQoKS5fbXVsdChsaW5lVHVybnNMZWZ0ID8gLTEgOiAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSGFsZlZlcnRleChjdXJyZW50VmVydGV4LCBleHRydWRlLngsIGV4dHJ1ZGUueSwgZmFsc2UsIGxpbmVUdXJuc0xlZnQsIDAsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5leHRWZXJ0ZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBuZXh0Tm9ybWFsLCAtb2Zmc2V0QSwgLW9mZnNldEIsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2J1dHQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGpvaW5Ob3JtYWwsIDAsIDAsIHNlZ21lbnQpOyAvLyBidXR0IGNhcFxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnc3F1YXJlJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IHByZXZWZXJ0ZXggPyAxIDogLTE7IC8vIGNsb3Npbmcgb3Igc3RhcnRpbmcgc3F1YXJlIGNhcFxuXG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2VmVydGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBqb2luTm9ybWFsLCBvZmZzZXQsIG9mZnNldCwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gbWFrZSB0aGUgY2FwIGl0J3Mgb3duIHF1YWQgdG8gYXZvaWQgdGhlIGNhcCBhZmZlY3RpbmcgdGhlIGxpbmUgZGlzdGFuY2VcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgam9pbk5vcm1hbCwgMCwgMCwgc2VnbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocHJldlZlcnRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgam9pbk5vcm1hbCwgb2Zmc2V0LCBvZmZzZXQsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ3JvdW5kJykge1xuXG4gICAgICAgICAgICAgICAgaWYgKHByZXZWZXJ0ZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgcHJldmlvdXMgc2VnbWVudCB3aXRoIGJ1dHRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHByZXZOb3JtYWwsIDAsIDAsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCByb3VuZCBjYXAgb3IgbGluZWpvaW4gYXQgZW5kIG9mIHNlZ21lbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHByZXZOb3JtYWwsIDEsIDEsIHNlZ21lbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmV4dFZlcnRleCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgcm91bmQgY2FwIGJlZm9yZSBmaXJzdCBzZWdtZW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCBuZXh0Tm9ybWFsLCAtMSwgLTEsIHNlZ21lbnQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG5leHQgc2VnbWVudCB3aXRoIGEgYnV0dFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgbmV4dE5vcm1hbCwgMCwgMCwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNTaGFycENvcm5lciAmJiBpIDwgbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTZWdtZW50TGVuZ3RoID0gY3VycmVudFZlcnRleC5kaXN0KG5leHRWZXJ0ZXgpO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0U2VnbWVudExlbmd0aCA+IDIgKiBzaGFycENvcm5lck9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDdXJyZW50VmVydGV4ID0gY3VycmVudFZlcnRleC5hZGQobmV4dFZlcnRleC5zdWIoY3VycmVudFZlcnRleCkuX211bHQoc2hhcnBDb3JuZXJPZmZzZXQgLyBuZXh0U2VnbWVudExlbmd0aCkuX3JvdW5kKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURpc3RhbmNlKGN1cnJlbnRWZXJ0ZXgsIG5ld0N1cnJlbnRWZXJ0ZXgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgobmV3Q3VycmVudFZlcnRleCwgbmV4dE5vcm1hbCwgMCwgMCwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWZXJ0ZXggPSBuZXdDdXJyZW50VmVydGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0d28gdmVydGljZXMgdG8gdGhlIGJ1ZmZlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcCB0aGUgbGluZSB2ZXJ0ZXggdG8gYWRkIGJ1ZmZlciB2ZXJ0aWNlcyBmb3JcbiAgICAgKiBAcGFyYW0gbm9ybWFsIHZlcnRleCBub3JtYWxcbiAgICAgKiBAcGFyYW0gZW5kTGVmdCBleHRydWRlIHRvIHNoaWZ0IHRoZSBsZWZ0IHZlcnRleCBhbG9uZyB0aGUgbGluZVxuICAgICAqIEBwYXJhbSBlbmRSaWdodCBleHRydWRlIHRvIHNoaWZ0IHRoZSBsZWZ0IHZlcnRleCBhbG9uZyB0aGUgbGluZVxuICAgICAqIEBwYXJhbSBzZWdtZW50IHRoZSBzZWdtZW50IG9iamVjdCB0byBhZGQgdGhlIHZlcnRleCB0b1xuICAgICAqIEBwYXJhbSByb3VuZCB3aGV0aGVyIHRoaXMgaXMgYSByb3VuZCBjYXBcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFkZEN1cnJlbnRWZXJ0ZXgocDogUG9pbnQsIG5vcm1hbDogUG9pbnQsIGVuZExlZnQ6IG51bWJlciwgZW5kUmlnaHQ6IG51bWJlciwgc2VnbWVudDogU2VnbWVudCwgcm91bmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICAvLyBsZWZ0IGFuZCByaWdodCBleHRydWRlIHZlY3RvcnMsIHBlcnBlbmRpY3VsYXJseSBzaGlmdGVkIGJ5IGVuZExlZnQvZW5kUmlnaHRcbiAgICAgICAgY29uc3QgbGVmdFggPSBub3JtYWwueCArIG5vcm1hbC55ICogZW5kTGVmdDtcbiAgICAgICAgY29uc3QgbGVmdFkgPSBub3JtYWwueSAtIG5vcm1hbC54ICogZW5kTGVmdDtcbiAgICAgICAgY29uc3QgcmlnaHRYID0gLW5vcm1hbC54ICsgbm9ybWFsLnkgKiBlbmRSaWdodDtcbiAgICAgICAgY29uc3QgcmlnaHRZID0gLW5vcm1hbC55IC0gbm9ybWFsLnggKiBlbmRSaWdodDtcblxuICAgICAgICB0aGlzLmFkZEhhbGZWZXJ0ZXgocCwgbGVmdFgsIGxlZnRZLCByb3VuZCwgZmFsc2UsIGVuZExlZnQsIHNlZ21lbnQpO1xuICAgICAgICB0aGlzLmFkZEhhbGZWZXJ0ZXgocCwgcmlnaHRYLCByaWdodFksIHJvdW5kLCB0cnVlLCAtZW5kUmlnaHQsIHNlZ21lbnQpO1xuICAgIH1cblxuICAgIGFkZEhhbGZWZXJ0ZXgoe3gsIHl9OiBQb2ludCwgZXh0cnVkZVg6IG51bWJlciwgZXh0cnVkZVk6IG51bWJlciwgcm91bmQ6IGJvb2xlYW4sIHVwOiBib29sZWFuLCBkaXI6IG51bWJlciwgc2VnbWVudDogU2VnbWVudCkge1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgLy8gYV9wb3Nfbm9ybWFsXG4gICAgICAgICAgICAvLyBFbmNvZGUgcm91bmQvdXAgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHNcbiAgICAgICAgICAgICh4IDw8IDEpICsgKHJvdW5kID8gMSA6IDApLFxuICAgICAgICAgICAgKHkgPDwgMSkgKyAodXAgPyAxIDogMCksXG4gICAgICAgICAgICAvLyBhX2RhdGFcbiAgICAgICAgICAgIC8vIGFkZCAxMjggdG8gc3RvcmUgYSBieXRlIGluIGFuIHVuc2lnbmVkIGJ5dGVcbiAgICAgICAgICAgIE1hdGgucm91bmQoRVhUUlVERV9TQ0FMRSAqIGV4dHJ1ZGVYKSArIDEyOCxcbiAgICAgICAgICAgIE1hdGgucm91bmQoRVhUUlVERV9TQ0FMRSAqIGV4dHJ1ZGVZKSArIDEyOCxcbiAgICAgICAgICAgICgoZGlyID09PSAwID8gMCA6IChkaXIgPCAwID8gLTEgOiAxKSkgKyAxKSxcbiAgICAgICAgICAgIDAsIC8vIHVudXNlZFxuICAgICAgICAgICAgLy8gYV9saW5lc29mYXJcbiAgICAgICAgICAgIHRoaXMubGluZVNvRmFyKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3RzIGEgc2Vjb25kIHZlcnRleCBidWZmZXIgd2l0aCBoaWdoZXIgcHJlY2lzaW9uIGxpbmUgcHJvZ3Jlc3NcbiAgICAgICAgaWYgKHRoaXMubGluZUNsaXBzKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFZlcnRleEFycmF5Mi5lbXBsYWNlQmFjayh0aGlzLnNjYWxlZERpc3RhbmNlLCB0aGlzLmxpbmVDbGlwc0FycmF5Lmxlbmd0aCwgdGhpcy5saW5lQ2xpcHMuc3RhcnQsIHRoaXMubGluZUNsaXBzLmVuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGgrKztcbiAgICAgICAgaWYgKHRoaXMuZTEgPj0gMCAmJiB0aGlzLmUyID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhBcnJheS5lbXBsYWNlQmFjayh0aGlzLmUxLCB0aGlzLmUyLCBlKTtcbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwKSB7XG4gICAgICAgICAgICB0aGlzLmUyID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZTEgPSBlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlU2NhbGVkRGlzdGFuY2UoKSB7XG4gICAgICAgIC8vIEtub3dpbmcgdGhlIHJhdGlvIG9mIHRoZSBmdWxsIGxpbmVzdHJpbmcgY292ZXJlZCBieSB0aGlzIHRpbGVkIGZlYXR1cmUsIGFzIHdlbGxcbiAgICAgICAgLy8gYXMgdGhlIHRvdGFsIGRpc3RhbmNlIChpbiB0aWxlIHVuaXRzKSBvZiB0aGlzIHRpbGVkIGZlYXR1cmUsIGFuZCB0aGUgZGlzdGFuY2VcbiAgICAgICAgLy8gKGluIHRpbGUgdW5pdHMpIG9mIHRoZSBjdXJyZW50IHZlcnRleCwgd2UgY2FuIGRldGVybWluZSB0aGUgcmVsYXRpdmUgZGlzdGFuY2VcbiAgICAgICAgLy8gb2YgdGhpcyB2ZXJ0ZXggYWxvbmcgdGhlIGZ1bGwgbGluZXN0cmluZyBmZWF0dXJlLlxuICAgICAgICBpZiAodGhpcy5saW5lQ2xpcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVTaGFyZSA9IHRoaXMubGluZUNsaXBzLmVuZCAtIHRoaXMubGluZUNsaXBzLnN0YXJ0O1xuICAgICAgICAgICAgY29uc3QgdG90YWxGZWF0dXJlTGVuZ3RoID0gdGhpcy50b3RhbERpc3RhbmNlIC8gZmVhdHVyZVNoYXJlO1xuICAgICAgICAgICAgdGhpcy5zY2FsZWREaXN0YW5jZSA9IHRoaXMuZGlzdGFuY2UgLyB0aGlzLnRvdGFsRGlzdGFuY2U7XG4gICAgICAgICAgICB0aGlzLmxpbmVTb0ZhciA9IHRvdGFsRmVhdHVyZUxlbmd0aCAqIHRoaXMubGluZUNsaXBzLnN0YXJ0ICsgdGhpcy5kaXN0YW5jZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGluZVNvRmFyID0gdGhpcy5kaXN0YW5jZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZURpc3RhbmNlKHByZXY6IFBvaW50LCBuZXh0OiBQb2ludCkge1xuICAgICAgICB0aGlzLmRpc3RhbmNlICs9IHByZXYuZGlzdChuZXh0KTtcbiAgICAgICAgdGhpcy51cGRhdGVTY2FsZWREaXN0YW5jZSgpO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoTGluZUJ1Y2tldCwgJ0xpbmVCdWNrZXQnLCB7b21pdDogWydsYXllcnMnLCAncGF0dGVybkZlYXR1cmVzJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgTGluZUJ1Y2tldDtcbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gQGZsb3dcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcblxuaW1wb3J0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBDb2xvclJhbXBQcm9wZXJ0eVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcblxuaW1wb3J0IHR5cGUgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cbmV4cG9ydCB0eXBlIExheW91dFByb3BzID0ge3xcbiAgICBcImxpbmUtY2FwXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxcImJ1dHRcIiB8IFwicm91bmRcIiB8IFwic3F1YXJlXCI+LFxuICAgIFwibGluZS1qb2luXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxcImJldmVsXCIgfCBcInJvdW5kXCIgfCBcIm1pdGVyXCI+LFxuICAgIFwibGluZS1taXRlci1saW1pdFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwibGluZS1yb3VuZC1saW1pdFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwibGluZS1zb3J0LWtleVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5jb25zdCBsYXlvdXQ6IFByb3BlcnRpZXM8TGF5b3V0UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwibGluZS1jYXBcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfbGluZVwiXVtcImxpbmUtY2FwXCJdKSxcbiAgICBcImxpbmUtam9pblwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9saW5lXCJdW1wibGluZS1qb2luXCJdKSxcbiAgICBcImxpbmUtbWl0ZXItbGltaXRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9saW5lXCJdW1wibGluZS1taXRlci1saW1pdFwiXSksXG4gICAgXCJsaW5lLXJvdW5kLWxpbWl0XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfbGluZVwiXVtcImxpbmUtcm91bmQtbGltaXRcIl0pLFxuICAgIFwibGluZS1zb3J0LWtleVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9saW5lXCJdW1wibGluZS1zb3J0LWtleVwiXSksXG59KTtcblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJsaW5lLW9wYWNpdHlcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJsaW5lLXRyYW5zbGF0ZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiPixcbiAgICBcImxpbmUtd2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJsaW5lLWdhcC13aWR0aFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImxpbmUtb2Zmc2V0XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwibGluZS1ibHVyXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwibGluZS1kYXNoYXJyYXlcIjogQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eTxBcnJheTxudW1iZXI+PixcbiAgICBcImxpbmUtcGF0dGVyblwiOiBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5PFJlc29sdmVkSW1hZ2U+LFxuICAgIFwibGluZS1ncmFkaWVudFwiOiBDb2xvclJhbXBQcm9wZXJ0eSxcbiAgICBcImxpbmUtdHJpbS1vZmZzZXRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJsaW5lLW9wYWNpdHlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1vcGFjaXR5XCJdKSxcbiAgICBcImxpbmUtY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1jb2xvclwiXSksXG4gICAgXCJsaW5lLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtdHJhbnNsYXRlXCJdKSxcbiAgICBcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtdHJhbnNsYXRlLWFuY2hvclwiXSksXG4gICAgXCJsaW5lLXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtd2lkdGhcIl0pLFxuICAgIFwibGluZS1nYXAtd2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1nYXAtd2lkdGhcIl0pLFxuICAgIFwibGluZS1vZmZzZXRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1vZmZzZXRcIl0pLFxuICAgIFwibGluZS1ibHVyXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtYmx1clwiXSksXG4gICAgXCJsaW5lLWRhc2hhcnJheVwiOiBuZXcgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9saW5lXCJdW1wibGluZS1kYXNoYXJyYXlcIl0pLFxuICAgIFwibGluZS1wYXR0ZXJuXCI6IG5ldyBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X2xpbmVcIl1bXCJsaW5lLXBhdHRlcm5cIl0pLFxuICAgIFwibGluZS1ncmFkaWVudFwiOiBuZXcgQ29sb3JSYW1wUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtZ3JhZGllbnRcIl0pLFxuICAgIFwibGluZS10cmltLW9mZnNldFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfbGluZVwiXVtcImxpbmUtdHJpbS1vZmZzZXRcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQsIGxheW91dCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiwgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgTGluZUJ1Y2tldCBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC9saW5lX2J1Y2tldC5qcyc7XG5pbXBvcnQge3BvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmV9IGZyb20gJy4uLy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzLmpzJztcbmltcG9ydCB7Z2V0TWF4aW11bVBhaW50VmFsdWUsIHRyYW5zbGF0ZURpc3RhbmNlLCB0cmFuc2xhdGV9IGZyb20gJy4uL3F1ZXJ5X3V0aWxzLmpzJztcbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vbGluZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQge1RyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBMYXlvdXQsIFBvc3NpYmx5RXZhbHVhdGVkLCBEYXRhRHJpdmVuUHJvcGVydHl9IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IFByb2dyYW1Db25maWd1cmF0aW9uIGZyb20gJy4uLy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzJztcblxuaW1wb3J0IFN0ZXAgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL3N0ZXAuanMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVTdGF0ZSwgWm9vbUNvbnN0YW50RXhwcmVzc2lvbiwgU3R5bGVQcm9wZXJ0eUV4cHJlc3Npb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7QnVja2V0LCBCdWNrZXRQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSB7TGF5b3V0UHJvcHMsIFBhaW50UHJvcHN9IGZyb20gJy4vbGluZV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVzcGFjZVF1ZXJ5R2VvbWV0cnl9IGZyb20gJy4uL3F1ZXJ5X2dlb21ldHJ5LmpzJztcblxuY2xhc3MgTGluZUZsb29yd2lkdGhQcm9wZXJ0eSBleHRlbmRzIERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+IHtcbiAgICB1c2VJbnRlZ2VyWm9vbTogdHJ1ZTtcblxuICAgIHBvc3NpYmx5RXZhbHVhdGUodmFsdWUsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyhNYXRoLmZsb29yKHBhcmFtZXRlcnMuem9vbSksIHtcbiAgICAgICAgICAgIG5vdzogcGFyYW1ldGVycy5ub3csXG4gICAgICAgICAgICBmYWRlRHVyYXRpb246IHBhcmFtZXRlcnMuZmFkZUR1cmF0aW9uLFxuICAgICAgICAgICAgem9vbUhpc3Rvcnk6IHBhcmFtZXRlcnMuem9vbUhpc3RvcnksXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBwYXJhbWV0ZXJzLnRyYW5zaXRpb25cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdXBlci5wb3NzaWJseUV2YWx1YXRlKHZhbHVlLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBldmFsdWF0ZSh2YWx1ZSwgZ2xvYmFscywgZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSB7XG4gICAgICAgIGdsb2JhbHMgPSBleHRlbmQoe30sIGdsb2JhbHMsIHt6b29tOiBNYXRoLmZsb29yKGdsb2JhbHMuem9vbSl9KTtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmV2YWx1YXRlKHZhbHVlLCBnbG9iYWxzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUpO1xuICAgIH1cbn1cblxuY29uc3QgbGluZUZsb29yd2lkdGhQcm9wZXJ0eSA9IG5ldyBMaW5lRmxvb3J3aWR0aFByb3BlcnR5KHByb3BlcnRpZXMucGFpbnQucHJvcGVydGllc1snbGluZS13aWR0aCddLnNwZWNpZmljYXRpb24pO1xubGluZUZsb29yd2lkdGhQcm9wZXJ0eS51c2VJbnRlZ2VyWm9vbSA9IHRydWU7XG5cbmNsYXNzIExpbmVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3VuZXZhbHVhdGVkTGF5b3V0OiBMYXlvdXQ8TGF5b3V0UHJvcHM+O1xuICAgIGxheW91dDogUG9zc2libHlFdmFsdWF0ZWQ8TGF5b3V0UHJvcHM+O1xuXG4gICAgZ3JhZGllbnRWZXJzaW9uOiBudW1iZXI7XG4gICAgc3RlcEludGVycG9sYW50OiBib29sZWFuO1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgICAgIHRoaXMuZ3JhZGllbnRWZXJzaW9uID0gMDtcbiAgICB9XG5cbiAgICBfaGFuZGxlU3BlY2lhbFBhaW50UHJvcGVydHlVcGRhdGUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChuYW1lID09PSAnbGluZS1ncmFkaWVudCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb246IFpvb21Db25zdGFudEV4cHJlc3Npb248J3NvdXJjZSc+ID0gKCh0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbJ2xpbmUtZ3JhZGllbnQnXS52YWx1ZS5leHByZXNzaW9uKTogYW55KTtcbiAgICAgICAgICAgIHRoaXMuc3RlcEludGVycG9sYW50ID0gZXhwcmVzc2lvbi5fc3R5bGVFeHByZXNzaW9uICYmIGV4cHJlc3Npb24uX3N0eWxlRXhwcmVzc2lvbi5leHByZXNzaW9uIGluc3RhbmNlb2YgU3RlcDtcbiAgICAgICAgICAgIHRoaXMuZ3JhZGllbnRWZXJzaW9uID0gKHRoaXMuZ3JhZGllbnRWZXJzaW9uICsgMSkgJSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdyYWRpZW50RXhwcmVzc2lvbigpOiBTdHlsZVByb3BlcnR5RXhwcmVzc2lvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uYWJsZVBhaW50Ll92YWx1ZXNbJ2xpbmUtZ3JhZGllbnQnXS52YWx1ZS5leHByZXNzaW9uO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzLCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgc3VwZXIucmVjYWxjdWxhdGUocGFyYW1ldGVycywgYXZhaWxhYmxlSW1hZ2VzKTtcblxuICAgICAgICAodGhpcy5wYWludC5fdmFsdWVzOiBhbnkpWydsaW5lLWZsb29yd2lkdGgnXSA9XG4gICAgICAgICAgICBsaW5lRmxvb3J3aWR0aFByb3BlcnR5LnBvc3NpYmx5RXZhbHVhdGUodGhpcy5fdHJhbnNpdGlvbmluZ1BhaW50Ll92YWx1ZXNbJ2xpbmUtd2lkdGgnXS52YWx1ZSwgcGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8Kj4pOiBMaW5lQnVja2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQnVja2V0KHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1JZHMoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHkgPSB0aGlzLnBhaW50LmdldCgnbGluZS1wYXR0ZXJuJyk7XG4gICAgICAgIGNvbnN0IGltYWdlID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuICAgICAgICBjb25zdCBwcm9ncmFtSWQgPSBpbWFnZSA/ICdsaW5lUGF0dGVybicgOiAnbGluZSc7XG4gICAgICAgIHJldHVybiBbcHJvZ3JhbUlkXTtcbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtQ29uZmlndXJhdGlvbih6b29tOiBudW1iZXIpOiBQcm9ncmFtQ29uZmlndXJhdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb24odGhpcywgem9vbSk7XG4gICAgfVxuXG4gICAgcXVlcnlSYWRpdXMoYnVja2V0OiBCdWNrZXQpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBsaW5lQnVja2V0OiBMaW5lQnVja2V0ID0gKGJ1Y2tldDogYW55KTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBnZXRMaW5lV2lkdGgoXG4gICAgICAgICAgICBnZXRNYXhpbXVtUGFpbnRWYWx1ZSgnbGluZS13aWR0aCcsIHRoaXMsIGxpbmVCdWNrZXQpLFxuICAgICAgICAgICAgZ2V0TWF4aW11bVBhaW50VmFsdWUoJ2xpbmUtZ2FwLXdpZHRoJywgdGhpcywgbGluZUJ1Y2tldCkpO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBnZXRNYXhpbXVtUGFpbnRWYWx1ZSgnbGluZS1vZmZzZXQnLCB0aGlzLCBsaW5lQnVja2V0KTtcbiAgICAgICAgcmV0dXJuIHdpZHRoIC8gMiArIE1hdGguYWJzKG9mZnNldCkgKyB0cmFuc2xhdGVEaXN0YW5jZSh0aGlzLnBhaW50LmdldCgnbGluZS10cmFuc2xhdGUnKSk7XG4gICAgfVxuXG4gICAgcXVlcnlJbnRlcnNlY3RzRmVhdHVyZShxdWVyeUdlb21ldHJ5OiBUaWxlc3BhY2VRdWVyeUdlb21ldHJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHF1ZXJ5R2VvbWV0cnkucXVlcnlHZW9tZXRyeS5pc0Fib3ZlSG9yaXpvbikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRQb2x5Z29uID0gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnkudGlsZXNwYWNlR2VvbWV0cnksXG4gICAgICAgICAgICB0aGlzLnBhaW50LmdldCgnbGluZS10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdsaW5lLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIHRyYW5zZm9ybS5hbmdsZSwgcXVlcnlHZW9tZXRyeS5waXhlbFRvVGlsZVVuaXRzRmFjdG9yKTtcbiAgICAgICAgY29uc3QgaGFsZldpZHRoID0gcXVlcnlHZW9tZXRyeS5waXhlbFRvVGlsZVVuaXRzRmFjdG9yIC8gMiAqIGdldExpbmVXaWR0aChcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdsaW5lLXdpZHRoJykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKSxcbiAgICAgICAgICAgIHRoaXMucGFpbnQuZ2V0KCdsaW5lLWdhcC13aWR0aCcpLmV2YWx1YXRlKGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSkpO1xuICAgICAgICBjb25zdCBsaW5lT2Zmc2V0ID0gdGhpcy5wYWludC5nZXQoJ2xpbmUtb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwgZmVhdHVyZVN0YXRlKTtcbiAgICAgICAgaWYgKGxpbmVPZmZzZXQpIHtcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gb2Zmc2V0TGluZShnZW9tZXRyeSwgbGluZU9mZnNldCAqIHF1ZXJ5R2VvbWV0cnkucGl4ZWxUb1RpbGVVbml0c0ZhY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpTGluZSh0cmFuc2xhdGVkUG9seWdvbiwgZ2VvbWV0cnksIGhhbGZXaWR0aCk7XG4gICAgfVxuXG4gICAgaXNUaWxlQ2xpcHBlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaW5lU3R5bGVMYXllcjtcblxuZnVuY3Rpb24gZ2V0TGluZVdpZHRoKGxpbmVXaWR0aCwgbGluZUdhcFdpZHRoKSB7XG4gICAgaWYgKGxpbmVHYXBXaWR0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGxpbmVHYXBXaWR0aCArIDIgKiBsaW5lV2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxpbmVXaWR0aDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldExpbmUocmluZ3MsIG9mZnNldCkge1xuICAgIGNvbnN0IG5ld1JpbmdzID0gW107XG4gICAgY29uc3QgemVybyA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHJpbmdzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSByaW5nc1trXTtcbiAgICAgICAgY29uc3QgbmV3UmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByaW5nW2kgLSAxXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByaW5nW2ldO1xuICAgICAgICAgICAgY29uc3QgYyA9IHJpbmdbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgYVRvQiA9IGkgPT09IDAgPyB6ZXJvIDogYi5zdWIoYSkuX3VuaXQoKS5fcGVycCgpO1xuICAgICAgICAgICAgY29uc3QgYlRvQyA9IGkgPT09IHJpbmcubGVuZ3RoIC0gMSA/IHplcm8gOiBjLnN1YihiKS5fdW5pdCgpLl9wZXJwKCk7XG4gICAgICAgICAgICBjb25zdCBleHRydWRlID0gYVRvQi5fYWRkKGJUb0MpLl91bml0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvc0hhbGZBbmdsZSA9IGV4dHJ1ZGUueCAqIGJUb0MueCArIGV4dHJ1ZGUueSAqIGJUb0MueTtcbiAgICAgICAgICAgIGV4dHJ1ZGUuX211bHQoMSAvIGNvc0hhbGZBbmdsZSk7XG5cbiAgICAgICAgICAgIG5ld1JpbmcucHVzaChleHRydWRlLl9tdWx0KG9mZnNldCkuX2FkZChiKSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3UmluZ3MucHVzaChuZXdSaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1JpbmdzO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7Y3JlYXRlTGF5b3V0fSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmltcG9ydCB0eXBlIHtTdHJ1Y3RBcnJheUxheW91dH0gZnJvbSAnLi4vLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5leHBvcnQgY29uc3Qgc3ltYm9sTGF5b3V0QXR0cmlidXRlczogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3Nfb2Zmc2V0JywgICBjb21wb25lbnRzOiA0LCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2FfdGV4X3NpemUnLCAgICAgY29tcG9uZW50czogNCwgdHlwZTogJ1VpbnQxNid9LFxuICAgIHtuYW1lOiAnYV9waXhlbG9mZnNldCcsICBjb21wb25lbnRzOiA0LCB0eXBlOiAnSW50MTYnfVxuXSwgNCk7XG5cbmV4cG9ydCBjb25zdCBzeW1ib2xHbG9iZUV4dEF0dHJpYnV0ZXM6IFN0cnVjdEFycmF5TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfZ2xvYmVfYW5jaG9yJywgY29tcG9uZW50czogMywgdHlwZTogJ0ludDE2J30sXG4gICAge25hbWU6ICdhX2dsb2JlX25vcm1hbCcsIGNvbXBvbmVudHM6IDMsIHR5cGU6ICdGbG9hdDMyJ30sXG5dLCA0KTtcblxuZXhwb3J0IGNvbnN0IGR5bmFtaWNMYXlvdXRBdHRyaWJ1dGVzOiBTdHJ1Y3RBcnJheUxheW91dCA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3Byb2plY3RlZF9wb3MnLCBjb21wb25lbnRzOiA0LCB0eXBlOiAnRmxvYXQzMid9XG5dLCA0KTtcblxuZXhwb3J0IGNvbnN0IHBsYWNlbWVudE9wYWNpdHlBdHRyaWJ1dGVzOiBTdHJ1Y3RBcnJheUxheW91dCA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX2ZhZGVfb3BhY2l0eScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdVaW50MzInfVxuXSwgNCk7XG5cbmV4cG9ydCBjb25zdCBjb2xsaXNpb25WZXJ0ZXhBdHRyaWJ1dGVzOiBTdHJ1Y3RBcnJheUxheW91dCA9IGNyZWF0ZUxheW91dChbXG4gICAge25hbWU6ICdhX3BsYWNlZCcsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdVaW50OCd9LFxuICAgIHtuYW1lOiAnYV9zaGlmdCcsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdGbG9hdDMyJ30sXG5dKTtcblxuZXhwb3J0IGNvbnN0IGNvbGxpc2lvblZlcnRleEF0dHJpYnV0ZXNFeHQ6IFN0cnVjdEFycmF5TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2Ffc2l6ZV9zY2FsZScsIGNvbXBvbmVudHM6IDEsIHR5cGU6ICdGbG9hdDMyJ30sXG4gICAge25hbWU6ICdhX3BhZGRpbmcnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnRmxvYXQzMid9LFxuXSk7XG5cbmV4cG9ydCBjb25zdCBjb2xsaXNpb25Cb3g6IFN0cnVjdEFycmF5TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICAvLyB0aGUgYm94IGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUgYW5jaG9yIHBvaW50XG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdwcm9qZWN0ZWRBbmNob3JYJ30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdwcm9qZWN0ZWRBbmNob3JZJ30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdwcm9qZWN0ZWRBbmNob3JaJ30sXG5cbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ3RpbGVBbmNob3JYJ30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICd0aWxlQW5jaG9yWSd9LFxuXG4gICAgLy8gZGlzdGFuY2VzIHRvIHRoZSBlZGdlcyBmcm9tIHRoZSBhbmNob3JcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAneDEnfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAneTEnfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAneDInfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAneTInfSxcblxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAncGFkZGluZyd9LFxuXG4gICAgLy8gdGhlIGluZGV4IG9mIHRoZSBmZWF0dXJlIGluIHRoZSBvcmlnaW5hbCB2ZWN0b3J0aWxlXG4gICAge3R5cGU6ICdVaW50MzInLCBuYW1lOiAnZmVhdHVyZUluZGV4J30sXG4gICAgLy8gdGhlIHNvdXJjZSBsYXllciB0aGUgZmVhdHVyZSBhcHBlYXJzIGluXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnc291cmNlTGF5ZXJJbmRleCd9LFxuICAgIC8vIHRoZSBidWNrZXQgdGhlIGZlYXR1cmUgYXBwZWFycyBpblxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ2J1Y2tldEluZGV4J30sXG5dKTtcblxuZXhwb3J0IGNvbnN0IGNvbGxpc2lvbkJveExheW91dDogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoWyAvLyB1c2VkIHRvIHJlbmRlciBjb2xsaXNpb24gYm94ZXMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgIHtuYW1lOiAnYV9wb3MnLCAgICAgICAgICAgICBjb21wb25lbnRzOiAzLCB0eXBlOiAnSW50MTYnfSxcbiAgICB7bmFtZTogJ2FfYW5jaG9yX3BvcycsICAgICAgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J30sXG4gICAge25hbWU6ICdhX2V4dHJ1ZGUnLCAgICAgICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9XG5dLCA0KTtcblxuZXhwb3J0IGNvbnN0IGNvbGxpc2lvbkNpcmNsZUxheW91dDogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoWyAvLyB1c2VkIHRvIHJlbmRlciBjb2xsaXNpb24gY2lyY2xlcyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzXG4gICAge25hbWU6ICdhX3Bvc18yZicsICAgICBjb21wb25lbnRzOiAyLCB0eXBlOiAnRmxvYXQzMid9LFxuICAgIHtuYW1lOiAnYV9yYWRpdXMnLCAgICAgY29tcG9uZW50czogMSwgdHlwZTogJ0Zsb2F0MzInfSxcbiAgICB7bmFtZTogJ2FfZmxhZ3MnLCAgICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9XG5dLCA0KTtcblxuZXhwb3J0IGNvbnN0IHF1YWRUcmlhbmdsZTogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAndHJpYW5nbGUnLCBjb21wb25lbnRzOiAzLCB0eXBlOiAnVWludDE2J30sXG5dKTtcblxuZXhwb3J0IGNvbnN0IHBsYWNlbWVudDogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAncHJvamVjdGVkQW5jaG9yWCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAncHJvamVjdGVkQW5jaG9yWSd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAncHJvamVjdGVkQW5jaG9yWid9LFxuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICd0aWxlQW5jaG9yWCd9LFxuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICd0aWxlQW5jaG9yWSd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ2dseXBoU3RhcnRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ251bUdseXBocyd9LFxuICAgIHt0eXBlOiAnVWludDMyJywgbmFtZTogJ3ZlcnRleFN0YXJ0SW5kZXgnfSxcbiAgICB7dHlwZTogJ1VpbnQzMicsIG5hbWU6ICdsaW5lU3RhcnRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDMyJywgbmFtZTogJ2xpbmVMZW5ndGgnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdzZWdtZW50J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnbG93ZXJTaXplJ30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAndXBwZXJTaXplJ30sXG4gICAge3R5cGU6ICdGbG9hdDMyJywgbmFtZTogJ2xpbmVPZmZzZXRYJ30sXG4gICAge3R5cGU6ICdGbG9hdDMyJywgbmFtZTogJ2xpbmVPZmZzZXRZJ30sXG4gICAge3R5cGU6ICdVaW50OCcsIG5hbWU6ICd3cml0aW5nTW9kZSd9LFxuICAgIHt0eXBlOiAnVWludDgnLCBuYW1lOiAncGxhY2VkT3JpZW50YXRpb24nfSxcbiAgICB7dHlwZTogJ1VpbnQ4JywgbmFtZTogJ2hpZGRlbid9LFxuICAgIHt0eXBlOiAnVWludDMyJywgbmFtZTogJ2Nyb3NzVGlsZUlEJ30sXG4gICAge3R5cGU6ICdJbnQxNicsIG5hbWU6ICdhc3NvY2lhdGVkSWNvbkluZGV4J30sXG4gICAge3R5cGU6ICdVaW50OCcsIG5hbWU6ICdmbGlwU3RhdGUnfVxuXSk7XG5cbmV4cG9ydCBjb25zdCBzeW1ib2xJbnN0YW5jZTogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAncHJvamVjdGVkQW5jaG9yWCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAncHJvamVjdGVkQW5jaG9yWSd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAncHJvamVjdGVkQW5jaG9yWid9LFxuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICd0aWxlQW5jaG9yWCd9LFxuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICd0aWxlQW5jaG9yWSd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAncmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgnfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ2NlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAnbGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAndmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgnfSxcbiAgICB7dHlwZTogJ0ludDE2JywgbmFtZTogJ3BsYWNlZEljb25TeW1ib2xJbmRleCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAndmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXgnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdrZXknfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICd0ZXh0Qm94U3RhcnRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ3RleHRCb3hFbmRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ3ZlcnRpY2FsVGV4dEJveFN0YXJ0SW5kZXgnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICd2ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ2ljb25Cb3hTdGFydEluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnaWNvbkJveEVuZEluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAndmVydGljYWxJY29uQm94U3RhcnRJbmRleCd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ3ZlcnRpY2FsSWNvbkJveEVuZEluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnZmVhdHVyZUluZGV4J30sXG4gICAge3R5cGU6ICdVaW50MTYnLCBuYW1lOiAnbnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdudW1WZXJ0aWNhbEdseXBoVmVydGljZXMnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdudW1JY29uVmVydGljZXMnfSxcbiAgICB7dHlwZTogJ1VpbnQxNicsIG5hbWU6ICdudW1WZXJ0aWNhbEljb25WZXJ0aWNlcyd9LFxuICAgIHt0eXBlOiAnVWludDE2JywgbmFtZTogJ3VzZVJ1bnRpbWVDb2xsaXNpb25DaXJjbGVzJ30sXG4gICAge3R5cGU6ICdVaW50MzInLCBuYW1lOiAnY3Jvc3NUaWxlSUQnfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBjb21wb25lbnRzOiAyLCBuYW1lOiAndGV4dE9mZnNldCd9LFxuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdjb2xsaXNpb25DaXJjbGVEaWFtZXRlcid9LFxuXSk7XG5cbmV4cG9ydCBjb25zdCBnbHlwaE9mZnNldDogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdvZmZzZXRYJ31cbl0pO1xuXG5leHBvcnQgY29uc3QgbGluZVZlcnRleDogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAneCd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAneSd9LFxuICAgIHt0eXBlOiAnSW50MTYnLCBuYW1lOiAndGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3InfVxuXSk7XG4iLCIvLyBAZmxvd1xuLy8gT05FX0VNIGNvbnN0YW50IHVzZWQgdG8gZ28gYmV0d2VlbiBcImVtXCIgdW5pdHMgdXNlZCBpbiBzdHlsZSBzcGVjIGFuZCBcInBvaW50c1wiIHVzZWQgaW50ZXJuYWxseSBmb3IgbGF5b3V0XG5cbmV4cG9ydCBkZWZhdWx0IDI0O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtudW1iZXIgYXMgaW50ZXJwb2xhdGV9IGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQgSW50ZXJwb2xhdGUgZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCB7Y2xhbXB9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcblxuaW1wb3J0IHR5cGUge1Byb3BlcnR5VmFsdWUsIFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZX0gZnJvbSAnLi4vc3R5bGUvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSB7SW50ZXJwb2xhdGlvblR5cGV9IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9kZWZpbml0aW9ucy9pbnRlcnBvbGF0ZS5qcyc7XG5cbmNvbnN0IFNJWkVfUEFDS19GQUNUT1IgPSAxMjg7XG5cbmV4cG9ydCB7Z2V0U2l6ZURhdGEsIGV2YWx1YXRlU2l6ZUZvckZlYXR1cmUsIGV2YWx1YXRlU2l6ZUZvclpvb20sIFNJWkVfUEFDS19GQUNUT1J9O1xuXG5leHBvcnQgdHlwZSBTaXplRGF0YSA9IHtcbiAgICBraW5kOiAnY29uc3RhbnQnLFxuICAgIGxheW91dFNpemU6IG51bWJlclxufSB8IHtcbiAgICBraW5kOiAnc291cmNlJ1xufSB8IHtcbiAgICBraW5kOiAnY2FtZXJhJyxcbiAgICBtaW5ab29tOiBudW1iZXIsXG4gICAgbWF4Wm9vbTogbnVtYmVyLFxuICAgIG1pblNpemU6IG51bWJlcixcbiAgICBtYXhTaXplOiBudW1iZXIsXG4gICAgaW50ZXJwb2xhdGlvblR5cGU6ID9JbnRlcnBvbGF0aW9uVHlwZVxufSB8IHtcbiAgICBraW5kOiAnY29tcG9zaXRlJyxcbiAgICBtaW5ab29tOiBudW1iZXIsXG4gICAgbWF4Wm9vbTogbnVtYmVyLFxuICAgIGludGVycG9sYXRpb25UeXBlOiA/SW50ZXJwb2xhdGlvblR5cGVcbn07XG5cbmV4cG9ydCB0eXBlIEludGVycG9sYXRlZFNpemUgPSB7fFxuICAgIHVTaXplOiBudW1iZXIsXG4gICAgdVNpemVUOiBudW1iZXJcbnx9O1xuXG4vLyBGb3Ige3RleHQsaWNvbn0tc2l6ZSwgZ2V0IHRoZSBidWNrZXQtbGV2ZWwgZGF0YSB0aGF0IHdpbGwgYmUgbmVlZGVkIGJ5XG4vLyB0aGUgcGFpbnRlciB0byBzZXQgc3ltYm9sLXNpemUtcmVsYXRlZCB1bmlmb3Jtc1xuZnVuY3Rpb24gZ2V0U2l6ZURhdGEodGlsZVpvb206IG51bWJlciwgdmFsdWU6IFByb3BlcnR5VmFsdWU8bnVtYmVyLCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPj4pOiBTaXplRGF0YSB7XG4gICAgY29uc3Qge2V4cHJlc3Npb259ID0gdmFsdWU7XG5cbiAgICBpZiAoZXhwcmVzc2lvbi5raW5kID09PSAnY29uc3RhbnQnKSB7XG4gICAgICAgIGNvbnN0IGxheW91dFNpemUgPSBleHByZXNzaW9uLmV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aWxlWm9vbSArIDEpKTtcbiAgICAgICAgcmV0dXJuIHtraW5kOiAnY29uc3RhbnQnLCBsYXlvdXRTaXplfTtcblxuICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbi5raW5kID09PSAnc291cmNlJykge1xuICAgICAgICByZXR1cm4ge2tpbmQ6ICdzb3VyY2UnfTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHt6b29tU3RvcHMsIGludGVycG9sYXRpb25UeXBlfSA9IGV4cHJlc3Npb247XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIGNvdmVyaW5nIHpvb20gc3RvcHMgZm9yIHpvb20tZGVwZW5kZW50IHZhbHVlc1xuICAgICAgICBsZXQgbG93ZXIgPSAwO1xuICAgICAgICB3aGlsZSAobG93ZXIgPCB6b29tU3RvcHMubGVuZ3RoICYmIHpvb21TdG9wc1tsb3dlcl0gPD0gdGlsZVpvb20pIGxvd2VyKys7XG4gICAgICAgIGxvd2VyID0gTWF0aC5tYXgoMCwgbG93ZXIgLSAxKTtcbiAgICAgICAgbGV0IHVwcGVyID0gbG93ZXI7XG4gICAgICAgIHdoaWxlICh1cHBlciA8IHpvb21TdG9wcy5sZW5ndGggJiYgem9vbVN0b3BzW3VwcGVyXSA8IHRpbGVab29tICsgMSkgdXBwZXIrKztcbiAgICAgICAgdXBwZXIgPSBNYXRoLm1pbih6b29tU3RvcHMubGVuZ3RoIC0gMSwgdXBwZXIpO1xuXG4gICAgICAgIGNvbnN0IG1pblpvb20gPSB6b29tU3RvcHNbbG93ZXJdO1xuICAgICAgICBjb25zdCBtYXhab29tID0gem9vbVN0b3BzW3VwcGVyXTtcblxuICAgICAgICAvLyBXZSdkIGxpa2UgdG8gYmUgYWJsZSB0byB1c2UgQ2FtZXJhRXhwcmVzc2lvbiBvciBDb21wb3NpdGVFeHByZXNzaW9uIGluIHRoZXNlXG4gICAgICAgIC8vIHJldHVybiB0eXBlcyByYXRoZXIgdGhhbiBFeHByZXNzaW9uU3BlY2lmaWNhdGlvbiwgYnV0IHRoZSBmb3JtZXIgYXJlIG5vdFxuICAgICAgICAvLyB0cmFuc2ZlcnJhYmxlIGFjcm9zcyBXZWIgV29ya2VyIGJvdW5kYXJpZXMuXG4gICAgICAgIGlmIChleHByZXNzaW9uLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgICAgICByZXR1cm4ge2tpbmQ6ICdjb21wb3NpdGUnLCBtaW5ab29tLCBtYXhab29tLCBpbnRlcnBvbGF0aW9uVHlwZX07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmb3IgY2FtZXJhIGZ1bmN0aW9ucywgYWxzbyBzYXZlIG9mZiB0aGUgZnVuY3Rpb24gdmFsdWVzXG4gICAgICAgIC8vIGV2YWx1YXRlZCBhdCB0aGUgY292ZXJpbmcgem9vbSBsZXZlbHNcbiAgICAgICAgY29uc3QgbWluU2l6ZSA9IGV4cHJlc3Npb24uZXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1pblpvb20pKTtcbiAgICAgICAgY29uc3QgbWF4U2l6ZSA9IGV4cHJlc3Npb24uZXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1heFpvb20pKTtcblxuICAgICAgICByZXR1cm4ge2tpbmQ6ICdjYW1lcmEnLCBtaW5ab29tLCBtYXhab29tLCBtaW5TaXplLCBtYXhTaXplLCBpbnRlcnBvbGF0aW9uVHlwZX07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBldmFsdWF0ZVNpemVGb3JGZWF0dXJlKHNpemVEYXRhOiBTaXplRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3VTaXplLCB1U2l6ZVR9OiBJbnRlcnBvbGF0ZWRTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bG93ZXJTaXplLCB1cHBlclNpemV9OiB7IGxvd2VyU2l6ZTogbnVtYmVyLCB1cHBlclNpemU6IG51bWJlcn0pOiBudW1iZXIge1xuICAgIGlmIChzaXplRGF0YS5raW5kID09PSAnc291cmNlJykge1xuICAgICAgICByZXR1cm4gbG93ZXJTaXplIC8gU0laRV9QQUNLX0ZBQ1RPUjtcbiAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShsb3dlclNpemUgLyBTSVpFX1BBQ0tfRkFDVE9SLCB1cHBlclNpemUgLyBTSVpFX1BBQ0tfRkFDVE9SLCB1U2l6ZVQpO1xuICAgIH1cbiAgICByZXR1cm4gdVNpemU7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlU2l6ZUZvclpvb20oc2l6ZURhdGE6IFNpemVEYXRhLCB6b29tOiBudW1iZXIpOiBJbnRlcnBvbGF0ZWRTaXplIHtcbiAgICBsZXQgdVNpemVUID0gMDtcbiAgICBsZXQgdVNpemUgPSAwO1xuXG4gICAgaWYgKHNpemVEYXRhLmtpbmQgPT09ICdjb25zdGFudCcpIHtcbiAgICAgICAgdVNpemUgPSBzaXplRGF0YS5sYXlvdXRTaXplO1xuXG4gICAgfSBlbHNlIGlmIChzaXplRGF0YS5raW5kICE9PSAnc291cmNlJykge1xuICAgICAgICBjb25zdCB7aW50ZXJwb2xhdGlvblR5cGUsIG1pblpvb20sIG1heFpvb219ID0gc2l6ZURhdGE7XG5cbiAgICAgICAgLy8gRXZlbiB0aG91Z2ggd2UgY291bGQgZ2V0IHRoZSBleGFjdCB2YWx1ZSBvZiB0aGUgY2FtZXJhIGZ1bmN0aW9uXG4gICAgICAgIC8vIGF0IHogPSB0ci56b29tLCB3ZSBpbnRlbnRpb25hbGx5IGRvIG5vdDogaW5zdGVhZCwgd2UgaW50ZXJwb2xhdGVcbiAgICAgICAgLy8gYmV0d2VlbiB0aGUgY2FtZXJhIGZ1bmN0aW9uIHZhbHVlcyBhdCBhIHBhaXIgb2Ygem9vbSBzdG9wcyBjb3ZlcmluZ1xuICAgICAgICAvLyBbdGlsZVpvb20sIHRpbGVab29tICsgMV0gaW4gb3JkZXIgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoaXNcbiAgICAgICAgLy8gcmVzdHJpY3Rpb24gb24gY29tcG9zaXRlIGZ1bmN0aW9uc1xuICAgICAgICBjb25zdCB0ID0gIWludGVycG9sYXRpb25UeXBlID8gMCA6IGNsYW1wKFxuICAgICAgICAgICAgSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGlvbkZhY3RvcihpbnRlcnBvbGF0aW9uVHlwZSwgem9vbSwgbWluWm9vbSwgbWF4Wm9vbSksIDAsIDEpO1xuXG4gICAgICAgIGlmIChzaXplRGF0YS5raW5kID09PSAnY2FtZXJhJykge1xuICAgICAgICAgICAgdVNpemUgPSBpbnRlcnBvbGF0ZShzaXplRGF0YS5taW5TaXplLCBzaXplRGF0YS5tYXhTaXplLCB0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVTaXplVCA9IHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge3VTaXplVCwgdVNpemV9O1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtwbHVnaW4gYXMgcnRsVGV4dFBsdWdpbn0gZnJvbSAnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbi5qcyc7XG5cbmltcG9ydCB0eXBlIFN5bWJvbFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcblxuZnVuY3Rpb24gdHJhbnNmb3JtVGV4dCh0ZXh0OiBzdHJpbmcsIGxheWVyOiBTeW1ib2xTdHlsZUxheWVyLCBmZWF0dXJlOiBGZWF0dXJlKSB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gbGF5ZXIubGF5b3V0LmdldCgndGV4dC10cmFuc2Zvcm0nKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSk7XG4gICAgaWYgKHRyYW5zZm9ybSA9PT0gJ3VwcGVyY2FzZScpIHtcbiAgICAgICAgdGV4dCA9IHRleHQudG9Mb2NhbGVVcHBlckNhc2UoKTtcbiAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybSA9PT0gJ2xvd2VyY2FzZScpIHtcbiAgICAgICAgdGV4dCA9IHRleHQudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAocnRsVGV4dFBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcpIHtcbiAgICAgICAgdGV4dCA9IHJ0bFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nKHRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiB0ZXh0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0ZXh0OiBGb3JtYXR0ZWQsIGxheWVyOiBTeW1ib2xTdHlsZUxheWVyLCBmZWF0dXJlOiBGZWF0dXJlKTogRm9ybWF0dGVkIHtcbiAgICB0ZXh0LnNlY3Rpb25zLmZvckVhY2goc2VjdGlvbiA9PiB7XG4gICAgICAgIHNlY3Rpb24udGV4dCA9IHRyYW5zZm9ybVRleHQoc2VjdGlvbi50ZXh0LCBsYXllciwgZmVhdHVyZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRleHQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7U3ltYm9sRmVhdHVyZX0gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChmZWF0dXJlczogQXJyYXk8U3ltYm9sRmVhdHVyZT4pOiBBcnJheTxTeW1ib2xGZWF0dXJlPiB7XG4gICAgY29uc3QgbGVmdEluZGV4OiB7W186IHN0cmluZ106IG51bWJlcn0gPSB7fTtcbiAgICBjb25zdCByaWdodEluZGV4OiB7W186IHN0cmluZ106IG51bWJlcn0gPSB7fTtcbiAgICBjb25zdCBtZXJnZWRGZWF0dXJlcyA9IFtdO1xuICAgIGxldCBtZXJnZWRJbmRleCA9IDA7XG5cbiAgICBmdW5jdGlvbiBhZGQoaykge1xuICAgICAgICBtZXJnZWRGZWF0dXJlcy5wdXNoKGZlYXR1cmVzW2tdKTtcbiAgICAgICAgbWVyZ2VkSW5kZXgrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUZyb21SaWdodChsZWZ0S2V5OiBzdHJpbmcsIHJpZ2h0S2V5OiBzdHJpbmcsIGdlb20pIHtcbiAgICAgICAgY29uc3QgaSA9IHJpZ2h0SW5kZXhbbGVmdEtleV07XG4gICAgICAgIGRlbGV0ZSByaWdodEluZGV4W2xlZnRLZXldO1xuICAgICAgICByaWdodEluZGV4W3JpZ2h0S2V5XSA9IGk7XG5cbiAgICAgICAgbWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnlbMF0ucG9wKCk7XG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdID0gbWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnlbMF0uY29uY2F0KGdlb21bMF0pO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUZyb21MZWZ0KGxlZnRLZXk6IHN0cmluZywgcmlnaHRLZXk6IHN0cmluZywgZ2VvbSkge1xuICAgICAgICBjb25zdCBpID0gbGVmdEluZGV4W3JpZ2h0S2V5XTtcbiAgICAgICAgZGVsZXRlIGxlZnRJbmRleFtyaWdodEtleV07XG4gICAgICAgIGxlZnRJbmRleFtsZWZ0S2V5XSA9IGk7XG5cbiAgICAgICAgbWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnlbMF0uc2hpZnQoKTtcbiAgICAgICAgbWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnlbMF0gPSBnZW9tWzBdLmNvbmNhdChtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeVswXSk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEtleSh0ZXh0LCBnZW9tLCBvblJpZ2h0KSB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gb25SaWdodCA/IGdlb21bMF1bZ2VvbVswXS5sZW5ndGggLSAxXSA6IGdlb21bMF1bMF07XG4gICAgICAgIHJldHVybiBgJHt0ZXh0fToke3BvaW50Lnh9OiR7cG9pbnQueX1gO1xuICAgIH1cblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgZmVhdHVyZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVzW2tdO1xuICAgICAgICBjb25zdCBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeTtcbiAgICAgICAgY29uc3QgdGV4dCA9IGZlYXR1cmUudGV4dCA/IGZlYXR1cmUudGV4dC50b1N0cmluZygpIDogbnVsbDtcblxuICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgIGFkZChrKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGVmdEtleSA9IGdldEtleSh0ZXh0LCBnZW9tKSxcbiAgICAgICAgICAgIHJpZ2h0S2V5ID0gZ2V0S2V5KHRleHQsIGdlb20sIHRydWUpO1xuXG4gICAgICAgIGlmICgobGVmdEtleSBpbiByaWdodEluZGV4KSAmJiAocmlnaHRLZXkgaW4gbGVmdEluZGV4KSAmJiAocmlnaHRJbmRleFtsZWZ0S2V5XSAhPT0gbGVmdEluZGV4W3JpZ2h0S2V5XSkpIHtcbiAgICAgICAgICAgIC8vIGZvdW5kIGxpbmVzIHdpdGggdGhlIHNhbWUgdGV4dCBhZGphY2VudCB0byBib3RoIGVuZHMgb2YgdGhlIGN1cnJlbnQgbGluZSwgbWVyZ2UgYWxsIHRocmVlXG4gICAgICAgICAgICBjb25zdCBqID0gbWVyZ2VGcm9tTGVmdChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSk7XG4gICAgICAgICAgICBjb25zdCBpID0gbWVyZ2VGcm9tUmlnaHQobGVmdEtleSwgcmlnaHRLZXksIG1lcmdlZEZlYXR1cmVzW2pdLmdlb21ldHJ5KTtcblxuICAgICAgICAgICAgZGVsZXRlIGxlZnRJbmRleFtsZWZ0S2V5XTtcbiAgICAgICAgICAgIGRlbGV0ZSByaWdodEluZGV4W3JpZ2h0S2V5XTtcblxuICAgICAgICAgICAgcmlnaHRJbmRleFtnZXRLZXkodGV4dCwgbWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnksIHRydWUpXSA9IGk7XG4gICAgICAgICAgICBtZXJnZWRGZWF0dXJlc1tqXS5nZW9tZXRyeSA9IChudWxsOiBhbnkpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAobGVmdEtleSBpbiByaWdodEluZGV4KSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBtZXJnZWFibGUgbGluZSBhZGphY2VudCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgbGluZSwgbWVyZ2VcbiAgICAgICAgICAgIG1lcmdlRnJvbVJpZ2h0KGxlZnRLZXksIHJpZ2h0S2V5LCBnZW9tKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJpZ2h0S2V5IGluIGxlZnRJbmRleCkge1xuICAgICAgICAgICAgLy8gZm91bmQgbWVyZ2VhYmxlIGxpbmUgYWRqYWNlbnQgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLCBtZXJnZVxuICAgICAgICAgICAgbWVyZ2VGcm9tTGVmdChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIGFkamFjZW50IGxpbmVzLCBhZGQgYXMgYSBuZXcgaXRlbVxuICAgICAgICAgICAgYWRkKGspO1xuICAgICAgICAgICAgbGVmdEluZGV4W2xlZnRLZXldID0gbWVyZ2VkSW5kZXggLSAxO1xuICAgICAgICAgICAgcmlnaHRJbmRleFtyaWdodEtleV0gPSBtZXJnZWRJbmRleCAtIDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkRmVhdHVyZXMuZmlsdGVyKChmKSA9PiBmLmdlb21ldHJ5KTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Y2hhckhhc1JvdGF0ZWRWZXJ0aWNhbE9yaWVudGF0aW9ufSBmcm9tICcuL3NjcmlwdF9kZXRlY3Rpb24uanMnO1xuXG5leHBvcnQgY29uc3QgdmVydGljYWxpemVkQ2hhcmFjdGVyTWFwID0ge1xuICAgICchJzogJ++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++5gidcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZlcnRpY2FsaXplUHVuY3R1YXRpb24oaW5wdXQ6IHN0cmluZywgc2tpcENvbnRleHRDaGVja2luZzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBuZXh0Q2hhckNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkgKyAxKSB8fCBudWxsO1xuICAgICAgICBjb25zdCBwcmV2Q2hhckNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkgLSAxKSB8fCBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNhblJlcGxhY2VQdW5jdHVhdGlvbiA9IHNraXBDb250ZXh0Q2hlY2tpbmcgfHwgKFxuICAgICAgICAgICAgKCFuZXh0Q2hhckNvZGUgfHwgIWNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbihuZXh0Q2hhckNvZGUpIHx8IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcFtpbnB1dFtpICsgMV1dKSAmJlxuICAgICAgICAgICAgKCFwcmV2Q2hhckNvZGUgfHwgIWNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbihwcmV2Q2hhckNvZGUpIHx8IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcFtpbnB1dFtpIC0gMV1dKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjYW5SZXBsYWNlUHVuY3R1YXRpb24gJiYgdmVydGljYWxpemVkQ2hhcmFjdGVyTWFwW2lucHV0W2ldXSkge1xuICAgICAgICAgICAgb3V0cHV0ICs9IHZlcnRpY2FsaXplZENoYXJhY3Rlck1hcFtpbnB1dFtpXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gaW5wdXRbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJ0aWNhbENsb3NlUHVuY3R1YXRpb24oY2hyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2hyID09PSAn77i2JyB8fCBjaHIgPT09ICfvuYgnIHx8IGNociA9PT0gJ++4uCcgfHwgY2hyID09PSAn77mEJyB8fCBjaHIgPT09ICfvuYInIHx8IGNociA9PT0gJ++4vicgfHxcbiAgICAgICAgICAgY2hyID09PSAn77i8JyB8fCBjaHIgPT09ICfvuLonIHx8IGNociA9PT0gJ++4mCcgfHwgY2hyID09PSAn77mAJyB8fCBjaHIgPT09ICfvuJAnIHx8IGNociA9PT0gJ++4kycgfHxcbiAgICAgICAgICAgY2hyID09PSAn77iUJyB8fCBjaHIgPT09ICfvvYAnIHx8IGNociA9PT0gJ++/oycgfHwgY2hyID09PSAn77iRJyB8fCBjaHIgPT09ICfvuJInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWZXJ0aWNhbE9wZW5QdW5jdHVhdGlvbihjaHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaHIgPT09ICfvuLUnIHx8IGNociA9PT0gJ++5hycgfHwgY2hyID09PSAn77i3JyB8fCBjaHIgPT09ICfvuYMnIHx8IGNociA9PT0gJ++5gScgfHwgY2hyID09PSAn77i9JyB8fFxuICAgICAgICAgICBjaHIgPT09ICfvuLsnIHx8IGNociA9PT0gJ++4uScgfHwgY2hyID09PSAn77iXJyB8fCBjaHIgPT09ICfvuL8nO1xufVxuIiwiLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbmV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBuQml0cyA9IC03XG4gIHZhciBpID0gaXNMRSA/IChuQnl0ZXMgLSAxKSA6IDBcbiAgdmFyIGQgPSBpc0xFID8gLTEgOiAxXG4gIHZhciBzID0gYnVmZmVyW29mZnNldCArIGldXG5cbiAgaSArPSBkXG5cbiAgZSA9IHMgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgcyA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gZUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gKGUgKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gKG0gKiAyNTYpICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgcnQgPSAobUxlbiA9PT0gMjMgPyBNYXRoLnBvdygyLCAtMjQpIC0gTWF0aC5wb3coMiwgLTc3KSA6IDApXG4gIHZhciBpID0gaXNMRSA/IDAgOiAobkJ5dGVzIC0gMSlcbiAgdmFyIGQgPSBpc0xFID8gMSA6IC0xXG4gIHZhciBzID0gdmFsdWUgPCAwIHx8ICh2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSA/IDEgOiAwXG5cbiAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoaXNOYU4odmFsdWUpIHx8IHZhbHVlID09PSBJbmZpbml0eSkge1xuICAgIG0gPSBpc05hTih2YWx1ZSkgPyAxIDogMFxuICAgIGUgPSBlTWF4XG4gIH0gZWxzZSB7XG4gICAgZSA9IE1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjIpXG4gICAgaWYgKHZhbHVlICogKGMgPSBNYXRoLnBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tXG4gICAgICBjICo9IDJcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICB2YWx1ZSArPSBydCAvIGNcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBNYXRoLnBvdygyLCAxIC0gZUJpYXMpXG4gICAgfVxuICAgIGlmICh2YWx1ZSAqIGMgPj0gMikge1xuICAgICAgZSsrXG4gICAgICBjIC89IDJcbiAgICB9XG5cbiAgICBpZiAoZSArIGVCaWFzID49IGVNYXgpIHtcbiAgICAgIG0gPSAwXG4gICAgICBlID0gZU1heFxuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAoKHZhbHVlICogYykgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYmY7XG5cbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpO1xuXG5mdW5jdGlvbiBQYmYoYnVmKSB7XG4gICAgdGhpcy5idWYgPSBBcnJheUJ1ZmZlci5pc1ZpZXcgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGJ1ZikgPyBidWYgOiBuZXcgVWludDhBcnJheShidWYgfHwgMCk7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMudHlwZSA9IDA7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLmJ1Zi5sZW5ndGg7XG59XG5cblBiZi5WYXJpbnQgID0gMDsgLy8gdmFyaW50OiBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuUGJmLkZpeGVkNjQgPSAxOyAvLyA2NC1iaXQ6IGRvdWJsZSwgZml4ZWQ2NCwgc2ZpeGVkNjRcblBiZi5CeXRlcyAgID0gMjsgLy8gbGVuZ3RoLWRlbGltaXRlZDogc3RyaW5nLCBieXRlcywgZW1iZWRkZWQgbWVzc2FnZXMsIHBhY2tlZCByZXBlYXRlZCBmaWVsZHNcblBiZi5GaXhlZDMyID0gNTsgLy8gMzItYml0OiBmbG9hdCwgZml4ZWQzMiwgc2ZpeGVkMzJcblxudmFyIFNISUZUX0xFRlRfMzIgPSAoMSA8PCAxNikgKiAoMSA8PCAxNiksXG4gICAgU0hJRlRfUklHSFRfMzIgPSAxIC8gU0hJRlRfTEVGVF8zMjtcblxuLy8gVGhyZXNob2xkIGNob3NlbiBiYXNlZCBvbiBib3RoIGJlbmNobWFya2luZyBhbmQga25vd2xlZGdlIGFib3V0IGJyb3dzZXIgc3RyaW5nXG4vLyBkYXRhIHN0cnVjdHVyZXMgKHdoaWNoIGN1cnJlbnRseSBzd2l0Y2ggc3RydWN0dXJlIHR5cGVzIGF0IDEyIGJ5dGVzIG9yIG1vcmUpXG52YXIgVEVYVF9ERUNPREVSX01JTl9MRU5HVEggPSAxMjtcbnZhciB1dGY4VGV4dERlY29kZXIgPSB0eXBlb2YgVGV4dERlY29kZXIgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IG5ldyBUZXh0RGVjb2RlcigndXRmOCcpO1xuXG5QYmYucHJvdG90eXBlID0ge1xuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuYnVmID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gPT09IFJFQURJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHJlYWRGaWVsZHM6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0LCBlbmQpIHtcbiAgICAgICAgZW5kID0gZW5kIHx8IHRoaXMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMucmVhZFZhcmludCgpLFxuICAgICAgICAgICAgICAgIHRhZyA9IHZhbCA+PiAzLFxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG5cbiAgICAgICAgICAgIHRoaXMudHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgICAgIHJlYWRGaWVsZCh0YWcsIHJlc3VsdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA9PT0gc3RhcnRQb3MpIHRoaXMuc2tpcCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHJlYWRNZXNzYWdlOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHJlYWRGaWVsZCwgcmVzdWx0LCB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zKTtcbiAgICB9LFxuXG4gICAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gcmVhZFVJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gcmVhZEludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIC8vIDY0LWJpdCBpbnQgaGFuZGxpbmcgaXMgYmFzZWQgb24gZ2l0aHViLmNvbS9kcHcvbm9kZS1idWZmZXItbW9yZS1pbnRzIChNSVQtbGljZW5zZWQpXG5cbiAgICByZWFkRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcykgKyByZWFkVUludDMyKHRoaXMuYnVmLCB0aGlzLnBvcyArIDQpICogU0hJRlRfTEVGVF8zMjtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHJlYWRVSW50MzIodGhpcy5idWYsIHRoaXMucG9zKSArIHJlYWRJbnQzMih0aGlzLmJ1ZiwgdGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSBpZWVlNzU0LnJlYWQodGhpcy5idWYsIHRoaXMucG9zLCB0cnVlLCAyMywgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gaWVlZTc1NC5yZWFkKHRoaXMuYnVmLCB0aGlzLnBvcywgdHJ1ZSwgNTIsIDgpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkVmFyaW50OiBmdW5jdGlvbihpc1NpZ25lZCkge1xuICAgICAgICB2YXIgYnVmID0gdGhpcy5idWYsXG4gICAgICAgICAgICB2YWwsIGI7XG5cbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsICA9ICBiICYgMHg3ZjsgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsIHw9IChiICYgMHg3ZikgPDwgNzsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsIHw9IChiICYgMHg3ZikgPDwgMTQ7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvcysrXTsgdmFsIHw9IChiICYgMHg3ZikgPDwgMjE7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICAgICAgYiA9IGJ1Zlt0aGlzLnBvc107ICAgdmFsIHw9IChiICYgMHgwZikgPDwgMjg7XG5cbiAgICAgICAgcmV0dXJuIHJlYWRWYXJpbnRSZW1haW5kZXIodmFsLCBpc1NpZ25lZCwgdGhpcyk7XG4gICAgfSxcblxuICAgIHJlYWRWYXJpbnQ2NDogZnVuY3Rpb24oKSB7IC8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdjIuMC4xXG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRWYXJpbnQodHJ1ZSk7XG4gICAgfSxcblxuICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG51bSA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gICAgfSxcblxuICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgIH0sXG5cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3M7XG4gICAgICAgIHZhciBwb3MgPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG5cbiAgICAgICAgaWYgKGVuZCAtIHBvcyA+PSBURVhUX0RFQ09ERVJfTUlOX0xFTkdUSCAmJiB1dGY4VGV4dERlY29kZXIpIHtcbiAgICAgICAgICAgIC8vIGxvbmdlciBzdHJpbmdzIGFyZSBmYXN0IHdpdGggdGhlIGJ1aWx0LWluIGJyb3dzZXIgVGV4dERlY29kZXIgQVBJXG4gICAgICAgICAgICByZXR1cm4gcmVhZFV0ZjhUZXh0RGVjb2Rlcih0aGlzLmJ1ZiwgcG9zLCBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNob3J0IHN0cmluZ3MgYXJlIGZhc3Qgd2l0aCBvdXIgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gICAgICAgIHJldHVybiByZWFkVXRmOCh0aGlzLmJ1ZiwgcG9zLCBlbmQpO1xuICAgIH0sXG5cbiAgICByZWFkQnl0ZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcyxcbiAgICAgICAgICAgIGJ1ZmZlciA9IHRoaXMuYnVmLnN1YmFycmF5KHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9LFxuXG4gICAgLy8gdmVyYm9zZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczsgZG9lc24ndCBhZmZlY3QgZ3ppcHBlZCBzaXplXG5cbiAgICByZWFkUGFja2VkVmFyaW50OiBmdW5jdGlvbihhcnIsIGlzU2lnbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFZhcmludChpc1NpZ25lZCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFZhcmludChpc1NpZ25lZCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZFNWYXJpbnQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBQYmYuQnl0ZXMpIHJldHVybiBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkQm9vbGVhbjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEJvb2xlYW4oKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZsb2F0KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZERvdWJsZTogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZERvdWJsZSgpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWREb3VibGUoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkRml4ZWQzMjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkMzIoKSk7XG4gICAgICAgIHZhciBlbmQgPSByZWFkUGFja2VkRW5kKHRoaXMpO1xuICAgICAgICBhcnIgPSBhcnIgfHwgW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oYXJyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09IFBiZi5CeXRlcykgcmV0dXJuIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZFNGaXhlZDMyKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkNjQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBQYmYuQnl0ZXMpIHJldHVybiBhcnIucHVzaCh0aGlzLnJlYWRGaXhlZDY0KCkpO1xuICAgICAgICB2YXIgZW5kID0gcmVhZFBhY2tlZEVuZCh0aGlzKTtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKGFycikge1xuICAgICAgICBpZiAodGhpcy50eXBlICE9PSBQYmYuQnl0ZXMpIHJldHVybiBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtcbiAgICAgICAgdmFyIGVuZCA9IHJlYWRQYWNrZWRFbmQodGhpcyk7XG4gICAgICAgIGFyciA9IGFyciB8fCBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQ2NCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuXG4gICAgc2tpcDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHZhciB0eXBlID0gdmFsICYgMHg3O1xuICAgICAgICBpZiAodHlwZSA9PT0gUGJmLlZhcmludCkgd2hpbGUgKHRoaXMuYnVmW3RoaXMucG9zKytdID4gMHg3Zikge31cbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkJ5dGVzKSB0aGlzLnBvcyA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3M7XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5GaXhlZDMyKSB0aGlzLnBvcyArPSA0O1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQ2NCkgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ1VuaW1wbGVtZW50ZWQgdHlwZTogJyArIHR5cGUpO1xuICAgIH0sXG5cbiAgICAvLyA9PT0gV1JJVElORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgd3JpdGVUYWc6IGZ1bmN0aW9uKHRhZywgdHlwZSkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KCh0YWcgPDwgMykgfCB0eXBlKTtcbiAgICB9LFxuXG4gICAgcmVhbGxvYzogZnVuY3Rpb24obWluKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8fCAxNjtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoIDwgdGhpcy5wb3MgKyBtaW4pIGxlbmd0aCAqPSAyO1xuXG4gICAgICAgIGlmIChsZW5ndGggIT09IHRoaXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICAgICAgICAgIGJ1Zi5zZXQodGhpcy5idWYpO1xuICAgICAgICAgICAgdGhpcy5idWYgPSBidWY7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMucG9zO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1Zi5zdWJhcnJheSgwLCB0aGlzLmxlbmd0aCk7XG4gICAgfSxcblxuICAgIHdyaXRlRml4ZWQzMjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgd3JpdGVJbnQzMih0aGlzLmJ1ZiwgdmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkNjQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoOCk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHdyaXRlSW50MzIodGhpcy5idWYsIE1hdGguZmxvb3IodmFsICogU0hJRlRfUklHSFRfMzIpLCB0aGlzLnBvcyArIDQpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZVNGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCB2YWwgJiAtMSwgdGhpcy5wb3MpO1xuICAgICAgICB3cml0ZUludDMyKHRoaXMuYnVmLCBNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YWwgPSArdmFsIHx8IDA7XG5cbiAgICAgICAgaWYgKHZhbCA+IDB4ZmZmZmZmZiB8fCB2YWwgPCAwKSB7XG4gICAgICAgICAgICB3cml0ZUJpZ1ZhcmludCh2YWwsIHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuXG4gICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gICAgICAgICAgIHZhbCAmIDB4N2YgIHwgKHZhbCA+IDB4N2YgPyAweDgwIDogMCk7IGlmICh2YWwgPD0gMHg3ZikgcmV0dXJuO1xuICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+Pj0gNykgJiAweDdmKSB8ICh2YWwgPiAweDdmID8gMHg4MCA6IDApOyBpZiAodmFsIDw9IDB4N2YpIHJldHVybjtcbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj49IDcpICYgMHg3ZikgfCAodmFsID4gMHg3ZiA/IDB4ODAgOiAwKTsgaWYgKHZhbCA8PSAweDdmKSByZXR1cm47XG4gICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gICAodmFsID4+PiA3KSAmIDB4N2Y7XG4gICAgfSxcblxuICAgIHdyaXRlU1ZhcmludDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQodmFsIDwgMCA/IC12YWwgKiAyIC0gMSA6IHZhbCAqIDIpO1xuICAgIH0sXG5cbiAgICB3cml0ZUJvb2xlYW46IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KEJvb2xlYW4odmFsKSk7XG4gICAgfSxcblxuICAgIHdyaXRlU3RyaW5nOiBmdW5jdGlvbihzdHIpIHtcbiAgICAgICAgc3RyID0gU3RyaW5nKHN0cik7XG4gICAgICAgIHRoaXMucmVhbGxvYyhzdHIubGVuZ3RoICogNCk7XG5cbiAgICAgICAgdGhpcy5wb3MrKzsgLy8gcmVzZXJ2ZSAxIGJ5dGUgZm9yIHNob3J0IHN0cmluZyBsZW5ndGhcblxuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgLy8gd3JpdGUgdGhlIHN0cmluZyBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdGhpcy5wb3MgPSB3cml0ZVV0ZjgodGhpcy5idWYsIHN0ciwgdGhpcy5wb3MpO1xuICAgICAgICB2YXIgbGVuID0gdGhpcy5wb3MgLSBzdGFydFBvcztcblxuICAgICAgICBpZiAobGVuID49IDB4ODApIG1ha2VSb29tRm9yRXh0cmFMZW5ndGgoc3RhcnRQb3MsIGxlbiwgdGhpcyk7XG5cbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgIH0sXG5cbiAgICB3cml0ZUZsb2F0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICBpZWVlNzU0LndyaXRlKHRoaXMuYnVmLCB2YWwsIHRoaXMucG9zLCB0cnVlLCAyMywgNCk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICBpZWVlNzU0LndyaXRlKHRoaXMuYnVmLCB2YWwsIHRoaXMucG9zLCB0cnVlLCA1MiwgOCk7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgfSxcblxuICAgIHdyaXRlQnl0ZXM6IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAgICAgICB2YXIgbGVuID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnJlYWxsb2MobGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgdGhpcy5idWZbdGhpcy5wb3MrK10gPSBidWZmZXJbaV07XG4gICAgfSxcblxuICAgIHdyaXRlUmF3TWVzc2FnZTogZnVuY3Rpb24oZm4sIG9iaikge1xuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgbWVzc2FnZSBsZW5ndGhcblxuICAgICAgICAvLyB3cml0ZSB0aGUgbWVzc2FnZSBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGZuKG9iaiwgdGhpcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIGlmIChsZW4gPj0gMHg4MCkgbWFrZVJvb21Gb3JFeHRyYUxlbmd0aChzdGFydFBvcywgbGVuLCB0aGlzKTtcblxuICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgbWVzc2FnZSBsZW5ndGggaW4gdGhlIHJlc2VydmVkIHBsYWNlIGFuZCByZXN0b3JlIHRoZSBwb3NpdGlvblxuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0UG9zIC0gMTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgfSxcblxuICAgIHdyaXRlTWVzc2FnZTogZnVuY3Rpb24odGFnLCBmbiwgb2JqKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlUmF3TWVzc2FnZShmbiwgb2JqKTtcbiAgICB9LFxuXG4gICAgd3JpdGVQYWNrZWRWYXJpbnQ6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRWYXJpbnQsIGFycik7ICAgfSxcbiAgICB3cml0ZVBhY2tlZFNWYXJpbnQ6ICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNWYXJpbnQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkQm9vbGVhbjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkQm9vbGVhbiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRGbG9hdDogICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGbG9hdCwgYXJyKTsgICAgfSxcbiAgICB3cml0ZVBhY2tlZERvdWJsZTogICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZERvdWJsZSwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQzMjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQzMiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24odGFnLCBhcnIpIHsgaWYgKGFyci5sZW5ndGgpIHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQzMiwgYXJyKTsgfSxcbiAgICB3cml0ZVBhY2tlZEZpeGVkNjQ6ICBmdW5jdGlvbih0YWcsIGFycikgeyBpZiAoYXJyLmxlbmd0aCkgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkNjQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IGlmIChhcnIubGVuZ3RoKSB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkNjQsIGFycik7IH0sXG5cbiAgICB3cml0ZUJ5dGVzRmllbGQ6IGZ1bmN0aW9uKHRhZywgYnVmZmVyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlQnl0ZXMoYnVmZmVyKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkMzIodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkNjQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVNWYXJpbnQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU3RyaW5nRmllbGQ6IGZ1bmN0aW9uKHRhZywgc3RyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKHN0cik7XG4gICAgfSxcbiAgICB3cml0ZUZsb2F0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGbG9hdCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVEb3VibGVGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZURvdWJsZSh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVCb29sZWFuRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnRGaWVsZCh0YWcsIEJvb2xlYW4odmFsKSk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gcmVhZFZhcmludFJlbWFpbmRlcihsLCBzLCBwKSB7XG4gICAgdmFyIGJ1ZiA9IHAuYnVmLFxuICAgICAgICBoLCBiO1xuXG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCAgPSAoYiAmIDB4NzApID4+IDQ7ICBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgICBiID0gYnVmW3AucG9zKytdOyBoIHw9IChiICYgMHg3ZikgPDwgMzsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDdmKSA8PCAxMDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG4gICAgYiA9IGJ1ZltwLnBvcysrXTsgaCB8PSAoYiAmIDB4N2YpIDw8IDE3OyBpZiAoYiA8IDB4ODApIHJldHVybiB0b051bShsLCBoLCBzKTtcbiAgICBiID0gYnVmW3AucG9zKytdOyBoIHw9IChiICYgMHg3ZikgPDwgMjQ7IGlmIChiIDwgMHg4MCkgcmV0dXJuIHRvTnVtKGwsIGgsIHMpO1xuICAgIGIgPSBidWZbcC5wb3MrK107IGggfD0gKGIgJiAweDAxKSA8PCAzMTsgaWYgKGIgPCAweDgwKSByZXR1cm4gdG9OdW0obCwgaCwgcyk7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRQYWNrZWRFbmQocGJmKSB7XG4gICAgcmV0dXJuIHBiZi50eXBlID09PSBQYmYuQnl0ZXMgP1xuICAgICAgICBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyA6IHBiZi5wb3MgKyAxO1xufVxuXG5mdW5jdGlvbiB0b051bShsb3csIGhpZ2gsIGlzU2lnbmVkKSB7XG4gICAgaWYgKGlzU2lnbmVkKSB7XG4gICAgICAgIHJldHVybiBoaWdoICogMHgxMDAwMDAwMDAgKyAobG93ID4+PiAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKChoaWdoID4+PiAwKSAqIDB4MTAwMDAwMDAwKSArIChsb3cgPj4+IDApO1xufVxuXG5mdW5jdGlvbiB3cml0ZUJpZ1ZhcmludCh2YWwsIHBiZikge1xuICAgIHZhciBsb3csIGhpZ2g7XG5cbiAgICBpZiAodmFsID49IDApIHtcbiAgICAgICAgbG93ICA9ICh2YWwgJSAweDEwMDAwMDAwMCkgfCAwO1xuICAgICAgICBoaWdoID0gKHZhbCAvIDB4MTAwMDAwMDAwKSB8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG93ICA9IH4oLXZhbCAlIDB4MTAwMDAwMDAwKTtcbiAgICAgICAgaGlnaCA9IH4oLXZhbCAvIDB4MTAwMDAwMDAwKTtcblxuICAgICAgICBpZiAobG93IF4gMHhmZmZmZmZmZikge1xuICAgICAgICAgICAgbG93ID0gKGxvdyArIDEpIHwgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvdyA9IDA7XG4gICAgICAgICAgICBoaWdoID0gKGhpZ2ggKyAxKSB8IDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsID49IDB4MTAwMDAwMDAwMDAwMDAwMDAgfHwgdmFsIDwgLTB4MTAwMDAwMDAwMDAwMDAwMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXZlbiB2YXJpbnQgZG9lc25cXCd0IGZpdCBpbnRvIDEwIGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgcGJmLnJlYWxsb2MoMTApO1xuXG4gICAgd3JpdGVCaWdWYXJpbnRMb3cobG93LCBoaWdoLCBwYmYpO1xuICAgIHdyaXRlQmlnVmFyaW50SGlnaChoaWdoLCBwYmYpO1xufVxuXG5mdW5jdGlvbiB3cml0ZUJpZ1ZhcmludExvdyhsb3csIGhpZ2gsIHBiZikge1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGxvdyAmIDB4N2YgfCAweDgwOyBsb3cgPj4+PSA3O1xuICAgIHBiZi5idWZbcGJmLnBvc10gICA9IGxvdyAmIDB4N2Y7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50SGlnaChoaWdoLCBwYmYpIHtcbiAgICB2YXIgbHNiID0gKGhpZ2ggJiAweDA3KSA8PCA0O1xuXG4gICAgcGJmLmJ1ZltwYmYucG9zKytdIHw9IGxzYiAgICAgICAgIHwgKChoaWdoID4+Pj0gMykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3ZiB8ICgoaGlnaCA+Pj49IDcpID8gMHg4MCA6IDApOyBpZiAoIWhpZ2gpIHJldHVybjtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gID0gaGlnaCAmIDB4N2YgfCAoKGhpZ2ggPj4+PSA3KSA/IDB4ODAgOiAwKTsgaWYgKCFoaWdoKSByZXR1cm47XG4gICAgcGJmLmJ1ZltwYmYucG9zKytdICA9IGhpZ2ggJiAweDdmIHwgKChoaWdoID4+Pj0gNykgPyAweDgwIDogMCk7IGlmICghaGlnaCkgcmV0dXJuO1xuICAgIHBiZi5idWZbcGJmLnBvcysrXSAgPSBoaWdoICYgMHg3ZiB8ICgoaGlnaCA+Pj49IDcpID8gMHg4MCA6IDApOyBpZiAoIWhpZ2gpIHJldHVybjtcbiAgICBwYmYuYnVmW3BiZi5wb3MrK10gID0gaGlnaCAmIDB4N2Y7XG59XG5cbmZ1bmN0aW9uIG1ha2VSb29tRm9yRXh0cmFMZW5ndGgoc3RhcnRQb3MsIGxlbiwgcGJmKSB7XG4gICAgdmFyIGV4dHJhTGVuID1cbiAgICAgICAgbGVuIDw9IDB4M2ZmZiA/IDEgOlxuICAgICAgICBsZW4gPD0gMHgxZmZmZmYgPyAyIDpcbiAgICAgICAgbGVuIDw9IDB4ZmZmZmZmZiA/IDMgOiBNYXRoLmZsb29yKE1hdGgubG9nKGxlbikgLyAoTWF0aC5MTjIgKiA3KSk7XG5cbiAgICAvLyBpZiAxIGJ5dGUgaXNuJ3QgZW5vdWdoIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCwgc2hpZnQgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0XG4gICAgcGJmLnJlYWxsb2MoZXh0cmFMZW4pO1xuICAgIGZvciAodmFyIGkgPSBwYmYucG9zIC0gMTsgaSA+PSBzdGFydFBvczsgaS0tKSBwYmYuYnVmW2kgKyBleHRyYUxlbl0gPSBwYmYuYnVmW2ldO1xufVxuXG5mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludChhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVWYXJpbnQoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNWYXJpbnQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTVmFyaW50KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KGFyciwgcGJmKSAgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGbG9hdChhcnJbaV0pOyAgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZShhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVEb3VibGUoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4oYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVCb29sZWFuKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDMyKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pOyB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDY0KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQ2NChhcnJbaV0pOyB9XG5cbi8vIEJ1ZmZlciBjb2RlIGJlbG93IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIsIE1JVC1saWNlbnNlZFxuXG5mdW5jdGlvbiByZWFkVUludDMyKGJ1ZiwgcG9zKSB7XG4gICAgcmV0dXJuICgoYnVmW3Bvc10pIHxcbiAgICAgICAgKGJ1Zltwb3MgKyAxXSA8PCA4KSB8XG4gICAgICAgIChidWZbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgIChidWZbcG9zICsgM10gKiAweDEwMDAwMDApO1xufVxuXG5mdW5jdGlvbiB3cml0ZUludDMyKGJ1ZiwgdmFsLCBwb3MpIHtcbiAgICBidWZbcG9zXSA9IHZhbDtcbiAgICBidWZbcG9zICsgMV0gPSAodmFsID4+PiA4KTtcbiAgICBidWZbcG9zICsgMl0gPSAodmFsID4+PiAxNik7XG4gICAgYnVmW3BvcyArIDNdID0gKHZhbCA+Pj4gMjQpO1xufVxuXG5mdW5jdGlvbiByZWFkSW50MzIoYnVmLCBwb3MpIHtcbiAgICByZXR1cm4gKChidWZbcG9zXSkgfFxuICAgICAgICAoYnVmW3BvcyArIDFdIDw8IDgpIHxcbiAgICAgICAgKGJ1Zltwb3MgKyAyXSA8PCAxNikpICtcbiAgICAgICAgKGJ1Zltwb3MgKyAzXSA8PCAyNCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRVdGY4KGJ1ZiwgcG9zLCBlbmQpIHtcbiAgICB2YXIgc3RyID0gJyc7XG4gICAgdmFyIGkgPSBwb3M7XG5cbiAgICB3aGlsZSAoaSA8IGVuZCkge1xuICAgICAgICB2YXIgYjAgPSBidWZbaV07XG4gICAgICAgIHZhciBjID0gbnVsbDsgLy8gY29kZXBvaW50XG4gICAgICAgIHZhciBieXRlc1BlclNlcXVlbmNlID1cbiAgICAgICAgICAgIGIwID4gMHhFRiA/IDQgOlxuICAgICAgICAgICAgYjAgPiAweERGID8gMyA6XG4gICAgICAgICAgICBiMCA+IDB4QkYgPyAyIDogMTtcblxuICAgICAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPiBlbmQpIGJyZWFrO1xuXG4gICAgICAgIHZhciBiMSwgYjIsIGIzO1xuXG4gICAgICAgIGlmIChieXRlc1BlclNlcXVlbmNlID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoYjAgPCAweDgwKSB7XG4gICAgICAgICAgICAgICAgYyA9IGIwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzUGVyU2VxdWVuY2UgPT09IDIpIHtcbiAgICAgICAgICAgIGIxID0gYnVmW2kgKyAxXTtcbiAgICAgICAgICAgIGlmICgoYjEgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgICAgIGMgPSAoYjAgJiAweDFGKSA8PCAweDYgfCAoYjEgJiAweDNGKTtcbiAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDdGKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChieXRlc1BlclNlcXVlbmNlID09PSAzKSB7XG4gICAgICAgICAgICBiMSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICBiMiA9IGJ1ZltpICsgMl07XG4gICAgICAgICAgICBpZiAoKGIxICYgMHhDMCkgPT09IDB4ODAgJiYgKGIyICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgICBjID0gKGIwICYgMHhGKSA8PCAweEMgfCAoYjEgJiAweDNGKSA8PCAweDYgfCAoYjIgJiAweDNGKTtcbiAgICAgICAgICAgICAgICBpZiAoYyA8PSAweDdGRiB8fCAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERGRkYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChieXRlc1BlclNlcXVlbmNlID09PSA0KSB7XG4gICAgICAgICAgICBiMSA9IGJ1ZltpICsgMV07XG4gICAgICAgICAgICBiMiA9IGJ1ZltpICsgMl07XG4gICAgICAgICAgICBiMyA9IGJ1ZltpICsgM107XG4gICAgICAgICAgICBpZiAoKGIxICYgMHhDMCkgPT09IDB4ODAgJiYgKGIyICYgMHhDMCkgPT09IDB4ODAgJiYgKGIzICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgICAgICBjID0gKGIwICYgMHhGKSA8PCAweDEyIHwgKGIxICYgMHgzRikgPDwgMHhDIHwgKGIyICYgMHgzRikgPDwgMHg2IHwgKGIzICYgMHgzRik7XG4gICAgICAgICAgICAgICAgaWYgKGMgPD0gMHhGRkZGIHx8IGMgPj0gMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGMgPSAweEZGRkQ7XG4gICAgICAgICAgICBieXRlc1BlclNlcXVlbmNlID0gMTtcblxuICAgICAgICB9IGVsc2UgaWYgKGMgPiAweEZGRkYpIHtcbiAgICAgICAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMgPj4+IDEwICYgMHgzRkYgfCAweEQ4MDApO1xuICAgICAgICAgICAgYyA9IDB4REMwMCB8IGMgJiAweDNGRjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICAgICAgICBpICs9IGJ5dGVzUGVyU2VxdWVuY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gcmVhZFV0ZjhUZXh0RGVjb2RlcihidWYsIHBvcywgZW5kKSB7XG4gICAgcmV0dXJuIHV0ZjhUZXh0RGVjb2Rlci5kZWNvZGUoYnVmLnN1YmFycmF5KHBvcywgZW5kKSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlVXRmOChidWYsIHN0ciwgcG9zKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpOyAvLyBjb2RlIHBvaW50XG5cbiAgICAgICAgaWYgKGMgPiAweEQ3RkYgJiYgYyA8IDB4RTAwMCkge1xuICAgICAgICAgICAgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA8IDB4REMwMCkge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhFRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkY7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEJEO1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gYztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA+IDB4REJGRiB8fCAoaSArIDEgPT09IHN0ci5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEVGO1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRjtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgIGJ1Zltwb3MrK10gPSAweEVGO1xuICAgICAgICAgICAgYnVmW3BvcysrXSA9IDB4QkY7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gMHhCRDtcbiAgICAgICAgICAgIGxlYWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBidWZbcG9zKytdID0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweDYgfCAweEMwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHhDIHwgMHhFMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBidWZbcG9zKytdID0gYyA+PiAweDEyIHwgMHhGMDtcbiAgICAgICAgICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgPj4gMHhDICYgMHgzRiB8IDB4ODA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ1Zltwb3MrK10gPSBjID4+IDB4NiAmIDB4M0YgfCAweDgwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmW3BvcysrXSA9IGMgJiAweDNGIHwgMHg4MDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcG9zO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtBbHBoYUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlLmpzJztcblxuaW1wb3J0IFByb3RvYnVmIGZyb20gJ3BiZic7XG5jb25zdCBib3JkZXIgPSAzO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi9zdHlsZV9nbHlwaC5qcyc7XG5cbmZ1bmN0aW9uIHJlYWRGb250c3RhY2tzKHRhZzogbnVtYmVyLCBnbHlwaERhdGE6IHtnbHlwaHM6IEFycmF5PFN0eWxlR2x5cGg+LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfSwgcGJmOiBQcm90b2J1Zikge1xuICAgIGdseXBoRGF0YS5nbHlwaHMgPSBbXTtcbiAgICBpZiAodGFnID09PSAxKSB7XG4gICAgICAgIHBiZi5yZWFkTWVzc2FnZShyZWFkRm9udHN0YWNrLCBnbHlwaERhdGEpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVhZEZvbnRzdGFjayh0YWc6IG51bWJlciwgIGdseXBoRGF0YToge2dseXBoczogQXJyYXk8U3R5bGVHbHlwaD4sIGFzY2VuZGVyPzogbnVtYmVyLCBkZXNjZW5kZXI/OiBudW1iZXJ9LCBwYmY6IFByb3RvYnVmKSB7XG4gICAgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICBjb25zdCB7aWQsIGJpdG1hcCwgd2lkdGgsIGhlaWdodCwgbGVmdCwgdG9wLCBhZHZhbmNlfSA9IHBiZi5yZWFkTWVzc2FnZShyZWFkR2x5cGgsIHt9KTtcbiAgICAgICAgZ2x5cGhEYXRhLmdseXBocy5wdXNoKHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgYml0bWFwOiBuZXcgQWxwaGFJbWFnZSh7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoICsgMiAqIGJvcmRlcixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCArIDIgKiBib3JkZXJcbiAgICAgICAgICAgIH0sIGJpdG1hcCksXG4gICAgICAgICAgICBtZXRyaWNzOiB7d2lkdGgsIGhlaWdodCwgbGVmdCwgdG9wLCBhZHZhbmNlfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRhZyA9PT0gNCkge1xuICAgICAgICBnbHlwaERhdGEuYXNjZW5kZXIgPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICB9IGVsc2UgaWYgKHRhZyA9PT0gNSkge1xuICAgICAgICBnbHlwaERhdGEuZGVzY2VuZGVyID0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkR2x5cGgodGFnOiBudW1iZXIsIGdseXBoOiBPYmplY3QsIHBiZjogUHJvdG9idWYpIHtcbiAgICBpZiAodGFnID09PSAxKSBnbHlwaC5pZCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBnbHlwaC5iaXRtYXAgPSBwYmYucmVhZEJ5dGVzKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAzKSBnbHlwaC53aWR0aCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBnbHlwaC5oZWlnaHQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgZ2x5cGgubGVmdCA9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNikgZ2x5cGgudG9wID0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA3KSBnbHlwaC5hZHZhbmNlID0gcGJmLnJlYWRWYXJpbnQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGRhdGE6IEFycmF5QnVmZmVyIHwgVWludDhBcnJheSk6IHtnbHlwaHM6IEFycmF5PFN0eWxlR2x5cGg+LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfSB7XG4gICAgcmV0dXJuIG5ldyBQcm90b2J1ZihkYXRhKS5yZWFkRmllbGRzKHJlYWRGb250c3RhY2tzLCB7fSk7XG59XG5cbmV4cG9ydCBjb25zdCBHTFlQSF9QQkZfQk9SREVSID0gYm9yZGVyO1xuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBwb3RwYWNrKGJveGVzKSB7XG5cbiAgICAvLyBjYWxjdWxhdGUgdG90YWwgYm94IGFyZWEgYW5kIG1heGltdW0gYm94IHdpZHRoXG4gICAgbGV0IGFyZWEgPSAwO1xuICAgIGxldCBtYXhXaWR0aCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGJveCBvZiBib3hlcykge1xuICAgICAgICBhcmVhICs9IGJveC53ICogYm94Lmg7XG4gICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGJveC53KTtcbiAgICB9XG5cbiAgICAvLyBzb3J0IHRoZSBib3hlcyBmb3IgaW5zZXJ0aW9uIGJ5IGhlaWdodCwgZGVzY2VuZGluZ1xuICAgIGJveGVzLnNvcnQoKGEsIGIpID0+IGIuaCAtIGEuaCk7XG5cbiAgICAvLyBhaW0gZm9yIGEgc3F1YXJpc2ggcmVzdWx0aW5nIGNvbnRhaW5lcixcbiAgICAvLyBzbGlnaHRseSBhZGp1c3RlZCBmb3Igc3ViLTEwMCUgc3BhY2UgdXRpbGl6YXRpb25cbiAgICBjb25zdCBzdGFydFdpZHRoID0gTWF0aC5tYXgoTWF0aC5jZWlsKE1hdGguc3FydChhcmVhIC8gMC45NSkpLCBtYXhXaWR0aCk7XG5cbiAgICAvLyBzdGFydCB3aXRoIGEgc2luZ2xlIGVtcHR5IHNwYWNlLCB1bmJvdW5kZWQgYXQgdGhlIGJvdHRvbVxuICAgIGNvbnN0IHNwYWNlcyA9IFt7eDogMCwgeTogMCwgdzogc3RhcnRXaWR0aCwgaDogSW5maW5pdHl9XTtcblxuICAgIGxldCB3aWR0aCA9IDA7XG4gICAgbGV0IGhlaWdodCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGJveCBvZiBib3hlcykge1xuICAgICAgICAvLyBsb29rIHRocm91Z2ggc3BhY2VzIGJhY2t3YXJkcyBzbyB0aGF0IHdlIGNoZWNrIHNtYWxsZXIgc3BhY2VzIGZpcnN0XG4gICAgICAgIGZvciAobGV0IGkgPSBzcGFjZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IHNwYWNlID0gc3BhY2VzW2ldO1xuXG4gICAgICAgICAgICAvLyBsb29rIGZvciBlbXB0eSBzcGFjZXMgdGhhdCBjYW4gYWNjb21tb2RhdGUgdGhlIGN1cnJlbnQgYm94XG4gICAgICAgICAgICBpZiAoYm94LncgPiBzcGFjZS53IHx8IGJveC5oID4gc3BhY2UuaCkgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIGZvdW5kIHRoZSBzcGFjZTsgYWRkIHRoZSBib3ggdG8gaXRzIHRvcC1sZWZ0IGNvcm5lclxuICAgICAgICAgICAgLy8gfC0tLS0tLS18LS0tLS0tLXxcbiAgICAgICAgICAgIC8vIHwgIGJveCAgfCAgICAgICB8XG4gICAgICAgICAgICAvLyB8X19fX19fX3wgICAgICAgfFxuICAgICAgICAgICAgLy8gfCAgICAgICAgIHNwYWNlIHxcbiAgICAgICAgICAgIC8vIHxfX19fX19fX19fX19fX198XG4gICAgICAgICAgICBib3gueCA9IHNwYWNlLng7XG4gICAgICAgICAgICBib3gueSA9IHNwYWNlLnk7XG5cbiAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgYm94LnkgKyBib3guaCk7XG4gICAgICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBib3gueCArIGJveC53KTtcblxuICAgICAgICAgICAgaWYgKGJveC53ID09PSBzcGFjZS53ICYmIGJveC5oID09PSBzcGFjZS5oKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BhY2UgbWF0Y2hlcyB0aGUgYm94IGV4YWN0bHk7IHJlbW92ZSBpdFxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBzcGFjZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBzcGFjZXMubGVuZ3RoKSBzcGFjZXNbaV0gPSBsYXN0O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJveC5oID09PSBzcGFjZS5oKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BhY2UgbWF0Y2hlcyB0aGUgYm94IGhlaWdodDsgdXBkYXRlIGl0IGFjY29yZGluZ2x5XG4gICAgICAgICAgICAgICAgLy8gfC0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfFxuICAgICAgICAgICAgICAgIC8vIHwgIGJveCAgfCB1cGRhdGVkIHNwYWNlIHxcbiAgICAgICAgICAgICAgICAvLyB8X19fX19fX3xfX19fX19fX19fX19fX198XG4gICAgICAgICAgICAgICAgc3BhY2UueCArPSBib3gudztcbiAgICAgICAgICAgICAgICBzcGFjZS53IC09IGJveC53O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJveC53ID09PSBzcGFjZS53KSB7XG4gICAgICAgICAgICAgICAgLy8gc3BhY2UgbWF0Y2hlcyB0aGUgYm94IHdpZHRoOyB1cGRhdGUgaXQgYWNjb3JkaW5nbHlcbiAgICAgICAgICAgICAgICAvLyB8LS0tLS0tLS0tLS0tLS0tfFxuICAgICAgICAgICAgICAgIC8vIHwgICAgICBib3ggICAgICB8XG4gICAgICAgICAgICAgICAgLy8gfF9fX19fX19fX19fX19fX3xcbiAgICAgICAgICAgICAgICAvLyB8IHVwZGF0ZWQgc3BhY2UgfFxuICAgICAgICAgICAgICAgIC8vIHxfX19fX19fX19fX19fX198XG4gICAgICAgICAgICAgICAgc3BhY2UueSArPSBib3guaDtcbiAgICAgICAgICAgICAgICBzcGFjZS5oIC09IGJveC5oO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgYm94IHNwbGl0cyB0aGUgc3BhY2UgaW50byB0d28gc3BhY2VzXG4gICAgICAgICAgICAgICAgLy8gfC0tLS0tLS18LS0tLS0tLS0tLS18XG4gICAgICAgICAgICAgICAgLy8gfCAgYm94ICB8IG5ldyBzcGFjZSB8XG4gICAgICAgICAgICAgICAgLy8gfF9fX19fX198X19fX19fX19fX198XG4gICAgICAgICAgICAgICAgLy8gfCB1cGRhdGVkIHNwYWNlICAgICB8XG4gICAgICAgICAgICAgICAgLy8gfF9fX19fX19fX19fX19fX19fX198XG4gICAgICAgICAgICAgICAgc3BhY2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB4OiBzcGFjZS54ICsgYm94LncsXG4gICAgICAgICAgICAgICAgICAgIHk6IHNwYWNlLnksXG4gICAgICAgICAgICAgICAgICAgIHc6IHNwYWNlLncgLSBib3gudyxcbiAgICAgICAgICAgICAgICAgICAgaDogYm94LmhcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzcGFjZS55ICs9IGJveC5oO1xuICAgICAgICAgICAgICAgIHNwYWNlLmggLT0gYm94Lmg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHc6IHdpZHRoLCAvLyBjb250YWluZXIgd2lkdGhcbiAgICAgICAgaDogaGVpZ2h0LCAvLyBjb250YWluZXIgaGVpZ2h0XG4gICAgICAgIGZpbGw6IChhcmVhIC8gKHdpZHRoICogaGVpZ2h0KSkgfHwgMCAvLyBzcGFjZSB1dGlsaXphdGlvblxuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1JHQkFJbWFnZX0gZnJvbSAnLi4vdXRpbC9pbWFnZS5qcyc7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuaW1wb3J0IHBvdHBhY2sgZnJvbSAncG90cGFjayc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSBJbWFnZU1hbmFnZXIgZnJvbSAnLi9pbWFnZV9tYW5hZ2VyLmpzJztcbmltcG9ydCB0eXBlIFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlLmpzJztcbmltcG9ydCB0eXBlIHtTcHJpdGVQb3NpdGlvbn0gZnJvbSAnLi4vdXRpbC9pbWFnZS5qcyc7XG5cbmNvbnN0IElNQUdFX1BBRERJTkc6IG51bWJlciA9IDE7XG5leHBvcnQge0lNQUdFX1BBRERJTkd9O1xuXG50eXBlIFJlY3QgPSB7XG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB3OiBudW1iZXIsXG4gICAgaDogbnVtYmVyXG59O1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VQb3NpdGlvbiBpbXBsZW1lbnRzIFNwcml0ZVBvc2l0aW9uIHtcbiAgICBwYWRkZWRSZWN0OiBSZWN0O1xuICAgIHBpeGVsUmF0aW86IG51bWJlcjtcbiAgICB2ZXJzaW9uOiBudW1iZXI7XG4gICAgc3RyZXRjaFk6ID9BcnJheTxbbnVtYmVyLCBudW1iZXJdPjtcbiAgICBzdHJldGNoWDogP0FycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuICAgIGNvbnRlbnQ6ID9bbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICAgIGNvbnN0cnVjdG9yKHBhZGRlZFJlY3Q6IFJlY3QsIHtwaXhlbFJhdGlvLCB2ZXJzaW9uLCBzdHJldGNoWCwgc3RyZXRjaFksIGNvbnRlbnR9OiBTdHlsZUltYWdlKSB7XG4gICAgICAgIHRoaXMucGFkZGVkUmVjdCA9IHBhZGRlZFJlY3Q7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMuc3RyZXRjaFggPSBzdHJldGNoWDtcbiAgICAgICAgdGhpcy5zdHJldGNoWSA9IHN0cmV0Y2hZO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIH1cblxuICAgIGdldCB0bCgpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRoaXMucGFkZGVkUmVjdC54ICsgSU1BR0VfUEFERElORyxcbiAgICAgICAgICAgIHRoaXMucGFkZGVkUmVjdC55ICsgSU1BR0VfUEFERElOR1xuICAgICAgICBdO1xuICAgIH1cblxuICAgIGdldCBicigpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHRoaXMucGFkZGVkUmVjdC54ICsgdGhpcy5wYWRkZWRSZWN0LncgLSBJTUFHRV9QQURESU5HLFxuICAgICAgICAgICAgdGhpcy5wYWRkZWRSZWN0LnkgKyB0aGlzLnBhZGRlZFJlY3QuaCAtIElNQUdFX1BBRERJTkdcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBnZXQgZGlzcGxheVNpemUoKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAodGhpcy5wYWRkZWRSZWN0LncgLSBJTUFHRV9QQURESU5HICogMikgLyB0aGlzLnBpeGVsUmF0aW8sXG4gICAgICAgICAgICAodGhpcy5wYWRkZWRSZWN0LmggLSBJTUFHRV9QQURESU5HICogMikgLyB0aGlzLnBpeGVsUmF0aW9cbiAgICAgICAgXTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlQXRsYXMge1xuICAgIGltYWdlOiBSR0JBSW1hZ2U7XG4gICAgaWNvblBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufTtcbiAgICBwYXR0ZXJuUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259O1xuICAgIGhhdmVSZW5kZXJDYWxsYmFja3M6IEFycmF5PHN0cmluZz47XG4gICAgdXBsb2FkZWQ6ID9ib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoaWNvbnM6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0sIHBhdHRlcm5zOiB7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9KSB7XG4gICAgICAgIGNvbnN0IGljb25Qb3NpdGlvbnMgPSB7fSwgcGF0dGVyblBvc2l0aW9ucyA9IHt9O1xuICAgICAgICB0aGlzLmhhdmVSZW5kZXJDYWxsYmFja3MgPSBbXTtcblxuICAgICAgICBjb25zdCBiaW5zID0gW107XG5cbiAgICAgICAgdGhpcy5hZGRJbWFnZXMoaWNvbnMsIGljb25Qb3NpdGlvbnMsIGJpbnMpO1xuICAgICAgICB0aGlzLmFkZEltYWdlcyhwYXR0ZXJucywgcGF0dGVyblBvc2l0aW9ucywgYmlucyk7XG5cbiAgICAgICAgY29uc3Qge3csIGh9ID0gcG90cGFjayhiaW5zKTtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgUkdCQUltYWdlKHt3aWR0aDogdyB8fCAxLCBoZWlnaHQ6IGggfHwgMX0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gaWNvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IGljb25zW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IGljb25Qb3NpdGlvbnNbaWRdLnBhZGRlZFJlY3Q7XG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHt4OiAwLCB5OiAwfSwge3g6IGJpbi54ICsgSU1BR0VfUEFERElORywgeTogYmluLnkgKyBJTUFHRV9QQURESU5HfSwgc3JjLmRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBwYXR0ZXJucykge1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gcGF0dGVybnNbaWRdO1xuICAgICAgICAgICAgY29uc3QgYmluID0gcGF0dGVyblBvc2l0aW9uc1tpZF0ucGFkZGVkUmVjdDtcbiAgICAgICAgICAgIGNvbnN0IHggPSBiaW4ueCArIElNQUdFX1BBRERJTkcsXG4gICAgICAgICAgICAgICAgeSA9IGJpbi55ICsgSU1BR0VfUEFERElORyxcbiAgICAgICAgICAgICAgICB3ID0gc3JjLmRhdGEud2lkdGgsXG4gICAgICAgICAgICAgICAgaCA9IHNyYy5kYXRhLmhlaWdodDtcblxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7eDogMCwgeTogMH0sIHt4LCB5fSwgc3JjLmRhdGEpO1xuICAgICAgICAgICAgLy8gQWRkIDEgcGl4ZWwgd3JhcHBlZCBwYWRkaW5nIG9uIGVhY2ggc2lkZSBvZiB0aGUgaW1hZ2UuXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHt4OiAwLCB5OiBoIC0gMX0sIHt4LCB5OiB5IC0gMX0sIHt3aWR0aDogdywgaGVpZ2h0OiAxfSk7IC8vIFRcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYy5kYXRhLCBpbWFnZSwge3g6IDAsIHk6ICAgICAwfSwge3gsIHk6IHkgKyBofSwge3dpZHRoOiB3LCBoZWlnaHQ6IDF9KTsgLy8gQlxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLmRhdGEsIGltYWdlLCB7eDogdyAtIDEsIHk6IDB9LCB7eDogeCAtIDEsIHl9LCB7d2lkdGg6IDEsIGhlaWdodDogaH0pOyAvLyBMXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMuZGF0YSwgaW1hZ2UsIHt4OiAwLCAgICAgeTogMH0sIHt4OiB4ICsgdywgeX0sIHt3aWR0aDogMSwgaGVpZ2h0OiBofSk7IC8vIFJcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcbiAgICAgICAgdGhpcy5pY29uUG9zaXRpb25zID0gaWNvblBvc2l0aW9ucztcbiAgICAgICAgdGhpcy5wYXR0ZXJuUG9zaXRpb25zID0gcGF0dGVyblBvc2l0aW9ucztcbiAgICB9XG5cbiAgICBhZGRJbWFnZXMoaW1hZ2VzOiB7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9LCBwb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sIGJpbnM6IEFycmF5PFJlY3Q+KSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gaW1hZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSBpbWFnZXNbaWRdO1xuICAgICAgICAgICAgY29uc3QgYmluID0ge1xuICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICB3OiBzcmMuZGF0YS53aWR0aCArIDIgKiBJTUFHRV9QQURESU5HLFxuICAgICAgICAgICAgICAgIGg6IHNyYy5kYXRhLmhlaWdodCArIDIgKiBJTUFHRV9QQURESU5HLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJpbnMucHVzaChiaW4pO1xuICAgICAgICAgICAgcG9zaXRpb25zW2lkXSA9IG5ldyBJbWFnZVBvc2l0aW9uKGJpbiwgc3JjKTtcblxuICAgICAgICAgICAgaWYgKHNyYy5oYXNSZW5kZXJDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGF2ZVJlbmRlckNhbGxiYWNrcy5wdXNoKGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhdGNoVXBkYXRlZEltYWdlcyhpbWFnZU1hbmFnZXI6IEltYWdlTWFuYWdlciwgdGV4dHVyZTogVGV4dHVyZSkge1xuICAgICAgICB0aGlzLmhhdmVSZW5kZXJDYWxsYmFja3MgPSB0aGlzLmhhdmVSZW5kZXJDYWxsYmFja3MuZmlsdGVyKGlkID0+IGltYWdlTWFuYWdlci5oYXNJbWFnZShpZCkpO1xuICAgICAgICBpbWFnZU1hbmFnZXIuZGlzcGF0Y2hSZW5kZXJDYWxsYmFja3ModGhpcy5oYXZlUmVuZGVyQ2FsbGJhY2tzKTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGltYWdlTWFuYWdlci51cGRhdGVkSW1hZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZEltYWdlKHRoaXMuaWNvblBvc2l0aW9uc1tuYW1lXSwgaW1hZ2VNYW5hZ2VyLmdldEltYWdlKG5hbWUpLCB0ZXh0dXJlKTtcbiAgICAgICAgICAgIHRoaXMucGF0Y2hVcGRhdGVkSW1hZ2UodGhpcy5wYXR0ZXJuUG9zaXRpb25zW25hbWVdLCBpbWFnZU1hbmFnZXIuZ2V0SW1hZ2UobmFtZSksIHRleHR1cmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGF0Y2hVcGRhdGVkSW1hZ2UocG9zaXRpb246ID9JbWFnZVBvc2l0aW9uLCBpbWFnZTogP1N0eWxlSW1hZ2UsIHRleHR1cmU6IFRleHR1cmUpIHtcbiAgICAgICAgaWYgKCFwb3NpdGlvbiB8fCAhaW1hZ2UpIHJldHVybjtcblxuICAgICAgICBpZiAocG9zaXRpb24udmVyc2lvbiA9PT0gaW1hZ2UudmVyc2lvbikgcmV0dXJuO1xuXG4gICAgICAgIHBvc2l0aW9uLnZlcnNpb24gPSBpbWFnZS52ZXJzaW9uO1xuICAgICAgICBjb25zdCBbeCwgeV0gPSBwb3NpdGlvbi50bDtcbiAgICAgICAgdGV4dHVyZS51cGRhdGUoaW1hZ2UuZGF0YSwgdW5kZWZpbmVkLCB7eCwgeX0pO1xuICAgIH1cblxufVxuXG5yZWdpc3RlcihJbWFnZVBvc2l0aW9uLCAnSW1hZ2VQb3NpdGlvbicpO1xucmVnaXN0ZXIoSW1hZ2VBdGxhcywgJ0ltYWdlQXRsYXMnKTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7XG4gICAgY2hhckhhc1VwcmlnaHRWZXJ0aWNhbE9yaWVudGF0aW9uLFxuICAgIGNoYXJBbGxvd3NJZGVvZ3JhcGhpY0JyZWFraW5nLFxuICAgIGNoYXJJbkNvbXBsZXhTaGFwaW5nU2NyaXB0XG59IGZyb20gJy4uL3V0aWwvc2NyaXB0X2RldGVjdGlvbi5qcyc7XG5pbXBvcnQgdmVydGljYWxpemVQdW5jdHVhdGlvbiBmcm9tICcuLi91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uLmpzJztcbmltcG9ydCB7cGx1Z2luIGFzIHJ0bFRleHRQbHVnaW59IGZyb20gJy4uL3NvdXJjZS9ydGxfdGV4dF9wbHVnaW4uanMnO1xuaW1wb3J0IE9ORV9FTSBmcm9tICcuL29uZV9lbS5qcyc7XG5pbXBvcnQge3dhcm5PbmNlfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaCwgR2x5cGhNZXRyaWNzfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9nbHlwaC5qcyc7XG5pbXBvcnQge0dMWVBIX1BCRl9CT1JERVJ9IGZyb20gJy4uL3N0eWxlL3BhcnNlX2dseXBoX3BiZi5qcyc7XG5pbXBvcnQgdHlwZSB7SW1hZ2VQb3NpdGlvbn0gZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzLmpzJztcbmltcG9ydCB7SU1BR0VfUEFERElOR30gZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzLmpzJztcbmltcG9ydCB0eXBlIHtHbHlwaFJlY3QsIEdseXBoUG9zaXRpb25zfSBmcm9tICcuLi9yZW5kZXIvZ2x5cGhfYXRsYXMuanMnO1xuaW1wb3J0IEZvcm1hdHRlZCwge0Zvcm1hdHRlZFNlY3Rpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuXG5jb25zdCBXcml0aW5nTW9kZSA9IHtcbiAgICBob3Jpem9udGFsOiAxLFxuICAgIHZlcnRpY2FsOiAyLFxuICAgIGhvcml6b250YWxPbmx5OiAzXG59O1xuXG5jb25zdCBTSEFQSU5HX0RFRkFVTFRfT0ZGU0VUID0gLTE3O1xuZXhwb3J0IHtzaGFwZVRleHQsIHNoYXBlSWNvbiwgZml0SWNvblRvVGV4dCwgZ2V0QW5jaG9yQWxpZ25tZW50LCBXcml0aW5nTW9kZSwgU0hBUElOR19ERUZBVUxUX09GRlNFVH07XG5cbi8vIFRoZSBwb3NpdGlvbiBvZiBhIGdseXBoIHJlbGF0aXZlIHRvIHRoZSB0ZXh0J3MgYW5jaG9yIHBvaW50LlxuZXhwb3J0IHR5cGUgUG9zaXRpb25lZEdseXBoID0ge1xuICAgIGdseXBoOiBudW1iZXIsXG4gICAgaW1hZ2VOYW1lOiBzdHJpbmcgfCBudWxsLFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgdmVydGljYWw6IGJvb2xlYW4sXG4gICAgc2NhbGU6IG51bWJlcixcbiAgICBmb250U3RhY2s6IHN0cmluZyxcbiAgICBzZWN0aW9uSW5kZXg6IG51bWJlcixcbiAgICBtZXRyaWNzOiBHbHlwaE1ldHJpY3MsXG4gICAgcmVjdDogR2x5cGhSZWN0IHwgbnVsbCxcbiAgICBsb2NhbEdseXBoPzogYm9vbGVhblxufTtcblxuZXhwb3J0IHR5cGUgUG9zaXRpb25lZExpbmUgPSB7XG4gICAgcG9zaXRpb25lZEdseXBoczogQXJyYXk8UG9zaXRpb25lZEdseXBoPixcbiAgICBsaW5lT2Zmc2V0OiBudW1iZXJcbn07XG5cbi8vIEEgY29sbGVjdGlvbiBvZiBwb3NpdGlvbmVkIGdseXBocyBhbmQgc29tZSBtZXRhZGF0YVxuZXhwb3J0IHR5cGUgU2hhcGluZyA9IHtcbiAgICBwb3NpdGlvbmVkTGluZXM6IEFycmF5PFBvc2l0aW9uZWRMaW5lPixcbiAgICB0b3A6IG51bWJlcixcbiAgICBib3R0b206IG51bWJlcixcbiAgICBsZWZ0OiBudW1iZXIsXG4gICAgcmlnaHQ6IG51bWJlcixcbiAgICB3cml0aW5nTW9kZTogMSB8IDIsXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGljb25zSW5UZXh0OiBib29sZWFuLFxuICAgIHZlcnRpY2FsaXphYmxlOiBib29sZWFuLFxuICAgIGhhc0Jhc2VsaW5lOiBib29sZWFuXG59O1xuXG50eXBlIEFuY2hvckFsaWdubWVudCA9IHt8XG4gICAgaG9yaXpvbnRhbEFsaWduOiBudW1iZXIsXG4gICAgdmVydGljYWxBbGlnbjogbnVtYmVyXG58fTtcblxuZnVuY3Rpb24gaXNFbXB0eShwb3NpdGlvbmVkTGluZXM6IEFycmF5PFBvc2l0aW9uZWRMaW5lPikge1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBwb3NpdGlvbmVkTGluZXMpIHtcbiAgICAgICAgaWYgKGxpbmUucG9zaXRpb25lZEdseXBocy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IHR5cGUgU3ltYm9sQW5jaG9yID0gJ2NlbnRlcicgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ3RvcCcgfCAnYm90dG9tJyB8ICd0b3AtbGVmdCcgfCAndG9wLXJpZ2h0JyB8ICdib3R0b20tbGVmdCcgfCAnYm90dG9tLXJpZ2h0JztcbmV4cG9ydCB0eXBlIFRleHRKdXN0aWZ5ID0gJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnO1xuXG4vLyBNYXggbnVtYmVyIG9mIGltYWdlcyBpbiBsYWJlbCBpcyA2NDAxIFUrRTAwMOKAk1UrRjhGRiB0aGF0IGNvdmVyc1xuLy8gQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIFVuaWNvZGUgUHJpdmF0ZSBVc2UgQXJlYSAoUFVBKS5cbmNvbnN0IFBVQWJlZ2luID0gMHhFMDAwO1xuY29uc3QgUFVBZW5kID0gMHhGOEZGO1xuXG5jbGFzcyBTZWN0aW9uT3B0aW9ucyB7XG4gICAgLy8gVGV4dCBvcHRpb25zXG4gICAgc2NhbGU6IG51bWJlcjtcbiAgICBmb250U3RhY2s6IHN0cmluZztcbiAgICAvLyBJbWFnZSBvcHRpb25zXG4gICAgaW1hZ2VOYW1lOiBzdHJpbmcgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2NhbGUgPSAxLjA7XG4gICAgICAgIHRoaXMuZm9udFN0YWNrID0gXCJcIjtcbiAgICAgICAgdGhpcy5pbWFnZU5hbWUgPSBudWxsO1xuICAgIH1cblxuICAgIHN0YXRpYyBmb3JUZXh0KHNjYWxlOiBudW1iZXIgfCBudWxsLCBmb250U3RhY2s6IHN0cmluZykge1xuICAgICAgICBjb25zdCB0ZXh0T3B0aW9ucyA9IG5ldyBTZWN0aW9uT3B0aW9ucygpO1xuICAgICAgICB0ZXh0T3B0aW9ucy5zY2FsZSA9IHNjYWxlIHx8IDE7XG4gICAgICAgIHRleHRPcHRpb25zLmZvbnRTdGFjayA9IGZvbnRTdGFjaztcbiAgICAgICAgcmV0dXJuIHRleHRPcHRpb25zO1xuICAgIH1cblxuICAgIHN0YXRpYyBmb3JJbWFnZShpbWFnZU5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBpbWFnZU9wdGlvbnMgPSBuZXcgU2VjdGlvbk9wdGlvbnMoKTtcbiAgICAgICAgaW1hZ2VPcHRpb25zLmltYWdlTmFtZSA9IGltYWdlTmFtZTtcbiAgICAgICAgcmV0dXJuIGltYWdlT3B0aW9ucztcbiAgICB9XG5cbn1cblxuY2xhc3MgVGFnZ2VkU3RyaW5nIHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgc2VjdGlvbkluZGV4OiBBcnJheTxudW1iZXI+IC8vIG1hcHMgZWFjaCBjaGFyYWN0ZXIgaW4gJ3RleHQnIHRvIGl0cyBjb3JyZXNwb25kaW5nIGVudHJ5IGluICdzZWN0aW9ucydcbiAgICBzZWN0aW9uczogQXJyYXk8U2VjdGlvbk9wdGlvbnM+XG4gICAgaW1hZ2VTZWN0aW9uSUQ6IG51bWJlciB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy50ZXh0ID0gXCJcIjtcbiAgICAgICAgdGhpcy5zZWN0aW9uSW5kZXggPSBbXTtcbiAgICAgICAgdGhpcy5zZWN0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmltYWdlU2VjdGlvbklEID0gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUZlYXR1cmUodGV4dDogRm9ybWF0dGVkLCBkZWZhdWx0Rm9udFN0YWNrOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFRhZ2dlZFN0cmluZygpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQuc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSB0ZXh0LnNlY3Rpb25zW2ldO1xuICAgICAgICAgICAgaWYgKCFzZWN0aW9uLmltYWdlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmFkZFRleHRTZWN0aW9uKHNlY3Rpb24sIGRlZmF1bHRGb250U3RhY2spO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuYWRkSW1hZ2VTZWN0aW9uKHNlY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQubGVuZ3RoO1xuICAgIH1cblxuICAgIGdldFNlY3Rpb24oaW5kZXg6IG51bWJlcik6IFNlY3Rpb25PcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VjdGlvbnNbdGhpcy5zZWN0aW9uSW5kZXhbaW5kZXhdXTtcbiAgICB9XG5cbiAgICBnZXRTZWN0aW9ucygpOiBBcnJheTxTZWN0aW9uT3B0aW9ucz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWN0aW9ucztcbiAgICB9XG5cbiAgICBnZXRTZWN0aW9uSW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlY3Rpb25JbmRleFtpbmRleF07XG4gICAgfVxuXG4gICAgZ2V0Q2hhckNvZGUoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQuY2hhckNvZGVBdChpbmRleCk7XG4gICAgfVxuXG4gICAgdmVydGljYWxpemVQdW5jdHVhdGlvbihza2lwQ29udGV4dENoZWNraW5nOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IHZlcnRpY2FsaXplUHVuY3R1YXRpb24odGhpcy50ZXh0LCBza2lwQ29udGV4dENoZWNraW5nKTtcbiAgICB9XG5cbiAgICB0cmltKCkge1xuICAgICAgICBsZXQgYmVnaW5uaW5nV2hpdGVzcGFjZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwO1xuICAgICAgICAgICAgaSA8IHRoaXMudGV4dC5sZW5ndGggJiYgd2hpdGVzcGFjZVt0aGlzLnRleHQuY2hhckNvZGVBdChpKV07XG4gICAgICAgICAgICBpKyspIHtcbiAgICAgICAgICAgIGJlZ2lubmluZ1doaXRlc3BhY2UrKztcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHJhaWxpbmdXaGl0ZXNwYWNlID0gdGhpcy50ZXh0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMudGV4dC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgaSA+PSAwICYmIGkgPj0gYmVnaW5uaW5nV2hpdGVzcGFjZSAmJiB3aGl0ZXNwYWNlW3RoaXMudGV4dC5jaGFyQ29kZUF0KGkpXTtcbiAgICAgICAgICAgIGktLSkge1xuICAgICAgICAgICAgdHJhaWxpbmdXaGl0ZXNwYWNlLS07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnN1YnN0cmluZyhiZWdpbm5pbmdXaGl0ZXNwYWNlLCB0cmFpbGluZ1doaXRlc3BhY2UpO1xuICAgICAgICB0aGlzLnNlY3Rpb25JbmRleCA9IHRoaXMuc2VjdGlvbkluZGV4LnNsaWNlKGJlZ2lubmluZ1doaXRlc3BhY2UsIHRyYWlsaW5nV2hpdGVzcGFjZSk7XG4gICAgfVxuXG4gICAgc3Vic3RyaW5nKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogVGFnZ2VkU3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc3Vic3RyaW5nID0gbmV3IFRhZ2dlZFN0cmluZygpO1xuICAgICAgICBzdWJzdHJpbmcudGV4dCA9IHRoaXMudGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICAgIHN1YnN0cmluZy5zZWN0aW9uSW5kZXggPSB0aGlzLnNlY3Rpb25JbmRleC5zbGljZShzdGFydCwgZW5kKTtcbiAgICAgICAgc3Vic3RyaW5nLnNlY3Rpb25zID0gdGhpcy5zZWN0aW9ucztcbiAgICAgICAgcmV0dXJuIHN1YnN0cmluZztcbiAgICB9XG5cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0O1xuICAgIH1cblxuICAgIGdldE1heFNjYWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWN0aW9uSW5kZXgucmVkdWNlKChtYXgsIGluZGV4KSA9PiBNYXRoLm1heChtYXgsIHRoaXMuc2VjdGlvbnNbaW5kZXhdLnNjYWxlKSwgMCk7XG4gICAgfVxuXG4gICAgYWRkVGV4dFNlY3Rpb24oc2VjdGlvbjogRm9ybWF0dGVkU2VjdGlvbiwgZGVmYXVsdEZvbnRTdGFjazogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudGV4dCArPSBzZWN0aW9uLnRleHQ7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMucHVzaChTZWN0aW9uT3B0aW9ucy5mb3JUZXh0KHNlY3Rpb24uc2NhbGUsIHNlY3Rpb24uZm9udFN0YWNrIHx8IGRlZmF1bHRGb250U3RhY2spKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlY3Rpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VjdGlvbi50ZXh0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLnNlY3Rpb25JbmRleC5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEltYWdlU2VjdGlvbihzZWN0aW9uOiBGb3JtYXR0ZWRTZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGltYWdlTmFtZSA9IHNlY3Rpb24uaW1hZ2UgPyBzZWN0aW9uLmltYWdlLm5hbWUgOiAnJztcbiAgICAgICAgaWYgKGltYWdlTmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGBDYW4ndCBhZGQgRm9ybWF0dGVkU2VjdGlvbiB3aXRoIGFuIGVtcHR5IGltYWdlLmApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV4dEltYWdlU2VjdGlvbkNoYXJDb2RlID0gdGhpcy5nZXROZXh0SW1hZ2VTZWN0aW9uQ2hhckNvZGUoKTtcbiAgICAgICAgaWYgKCFuZXh0SW1hZ2VTZWN0aW9uQ2hhckNvZGUpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGBSZWFjaGVkIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyAke1BVQWVuZCAtIFBVQWJlZ2luICsgMn1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGV4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG5leHRJbWFnZVNlY3Rpb25DaGFyQ29kZSk7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMucHVzaChTZWN0aW9uT3B0aW9ucy5mb3JJbWFnZShpbWFnZU5hbWUpKTtcbiAgICAgICAgdGhpcy5zZWN0aW9uSW5kZXgucHVzaCh0aGlzLnNlY3Rpb25zLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIGdldE5leHRJbWFnZVNlY3Rpb25DaGFyQ29kZSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlU2VjdGlvbklEKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlU2VjdGlvbklEID0gUFVBYmVnaW47XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbWFnZVNlY3Rpb25JRDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmltYWdlU2VjdGlvbklEID49IFBVQWVuZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiArK3RoaXMuaW1hZ2VTZWN0aW9uSUQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBicmVha0xpbmVzKGlucHV0OiBUYWdnZWRTdHJpbmcsIGxpbmVCcmVha1BvaW50czogQXJyYXk8bnVtYmVyPik6IEFycmF5PFRhZ2dlZFN0cmluZz4ge1xuICAgIGNvbnN0IGxpbmVzID0gW107XG4gICAgY29uc3QgdGV4dCA9IGlucHV0LnRleHQ7XG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGxpbmVCcmVhayBvZiBsaW5lQnJlYWtQb2ludHMpIHtcbiAgICAgICAgbGluZXMucHVzaChpbnB1dC5zdWJzdHJpbmcoc3RhcnQsIGxpbmVCcmVhaykpO1xuICAgICAgICBzdGFydCA9IGxpbmVCcmVhaztcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgICBsaW5lcy5wdXNoKGlucHV0LnN1YnN0cmluZyhzdGFydCwgdGV4dC5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzO1xufVxuXG5mdW5jdGlvbiBzaGFwZVRleHQodGV4dDogRm9ybWF0dGVkLFxuICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB7W186IHN0cmluZ106IHtnbHlwaHM6IHtbXzogbnVtYmVyXTogP1N0eWxlR2x5cGh9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfX0sXG4gICAgICAgICAgICAgICAgICAgZ2x5cGhQb3NpdGlvbnM6IEdseXBoUG9zaXRpb25zLFxuICAgICAgICAgICAgICAgICAgIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LFxuICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGb250U3RhY2s6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yOiBTeW1ib2xBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgdGV4dEp1c3RpZnk6IFRleHRKdXN0aWZ5LFxuICAgICAgICAgICAgICAgICAgIHNwYWNpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgd3JpdGluZ01vZGU6IDEgfCAyLFxuICAgICAgICAgICAgICAgICAgIGFsbG93VmVydGljYWxQbGFjZW1lbnQ6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgc3ltYm9sUGxhY2VtZW50OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgbGF5b3V0VGV4dFNpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBsYXlvdXRUZXh0U2l6ZVRoaXNab29tOiBudW1iZXIpOiBTaGFwaW5nIHwgZmFsc2Uge1xuICAgIGNvbnN0IGxvZ2ljYWxJbnB1dCA9IFRhZ2dlZFN0cmluZy5mcm9tRmVhdHVyZSh0ZXh0LCBkZWZhdWx0Rm9udFN0YWNrKTtcblxuICAgIGlmICh3cml0aW5nTW9kZSA9PT0gV3JpdGluZ01vZGUudmVydGljYWwpIHtcbiAgICAgICAgbG9naWNhbElucHV0LnZlcnRpY2FsaXplUHVuY3R1YXRpb24oYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCk7XG4gICAgfVxuXG4gICAgbGV0IGxpbmVzOiBBcnJheTxUYWdnZWRTdHJpbmc+O1xuXG4gICAgY29uc3Qge3Byb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCwgcHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0fSA9IHJ0bFRleHRQbHVnaW47XG4gICAgaWYgKHByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCAmJiBsb2dpY2FsSW5wdXQuc2VjdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIEJpZGkgZG9lc24ndCBoYXZlIHRvIGJlIHN0eWxlLWF3YXJlXG4gICAgICAgIGxpbmVzID0gW107XG4gICAgICAgIGNvbnN0IHVudGFnZ2VkTGluZXMgPVxuICAgICAgICAgICAgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0KGxvZ2ljYWxJbnB1dC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZUxpbmVCcmVha3MobG9naWNhbElucHV0LCBzcGFjaW5nLCBtYXhXaWR0aCwgZ2x5cGhNYXAsIGltYWdlUG9zaXRpb25zLCBzeW1ib2xQbGFjZW1lbnQsIGxheW91dFRleHRTaXplKSk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiB1bnRhZ2dlZExpbmVzKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdnZWRMaW5lID0gbmV3IFRhZ2dlZFN0cmluZygpO1xuICAgICAgICAgICAgdGFnZ2VkTGluZS50ZXh0ID0gbGluZTtcbiAgICAgICAgICAgIHRhZ2dlZExpbmUuc2VjdGlvbnMgPSBsb2dpY2FsSW5wdXQuc2VjdGlvbnM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0YWdnZWRMaW5lLnNlY3Rpb25JbmRleC5wdXNoKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGluZXMucHVzaCh0YWdnZWRMaW5lKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0KSB7XG4gICAgICAgIC8vIE5lZWQgdmVyc2lvbiBvZiBtYXBib3gtZ2wtcnRsLXRleHQgd2l0aCBzdHlsZSBzdXBwb3J0IGZvciBjb21iaW5pbmcgUlRMIHRleHRcbiAgICAgICAgLy8gd2l0aCBmb3JtYXR0aW5nXG4gICAgICAgIGxpbmVzID0gW107XG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZExpbmVzID1cbiAgICAgICAgICAgIHByb2Nlc3NTdHlsZWRCaWRpcmVjdGlvbmFsVGV4dChsb2dpY2FsSW5wdXQudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsSW5wdXQuc2VjdGlvbkluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZUxpbmVCcmVha3MobG9naWNhbElucHV0LCBzcGFjaW5nLCBtYXhXaWR0aCwgZ2x5cGhNYXAsIGltYWdlUG9zaXRpb25zLCBzeW1ib2xQbGFjZW1lbnQsIGxheW91dFRleHRTaXplKSk7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBwcm9jZXNzZWRMaW5lcykge1xuICAgICAgICAgICAgY29uc3QgdGFnZ2VkTGluZSA9IG5ldyBUYWdnZWRTdHJpbmcoKTtcbiAgICAgICAgICAgIHRhZ2dlZExpbmUudGV4dCA9IGxpbmVbMF07XG4gICAgICAgICAgICB0YWdnZWRMaW5lLnNlY3Rpb25JbmRleCA9IGxpbmVbMV07XG4gICAgICAgICAgICB0YWdnZWRMaW5lLnNlY3Rpb25zID0gbG9naWNhbElucHV0LnNlY3Rpb25zO1xuICAgICAgICAgICAgbGluZXMucHVzaCh0YWdnZWRMaW5lKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzID0gYnJlYWtMaW5lcyhsb2dpY2FsSW5wdXQsIGRldGVybWluZUxpbmVCcmVha3MobG9naWNhbElucHV0LCBzcGFjaW5nLCBtYXhXaWR0aCwgZ2x5cGhNYXAsIGltYWdlUG9zaXRpb25zLCBzeW1ib2xQbGFjZW1lbnQsIGxheW91dFRleHRTaXplKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb25lZExpbmVzID0gW107XG4gICAgY29uc3Qgc2hhcGluZyA9IHtcbiAgICAgICAgcG9zaXRpb25lZExpbmVzLFxuICAgICAgICB0ZXh0OiBsb2dpY2FsSW5wdXQudG9TdHJpbmcoKSxcbiAgICAgICAgdG9wOiB0cmFuc2xhdGVbMV0sXG4gICAgICAgIGJvdHRvbTogdHJhbnNsYXRlWzFdLFxuICAgICAgICBsZWZ0OiB0cmFuc2xhdGVbMF0sXG4gICAgICAgIHJpZ2h0OiB0cmFuc2xhdGVbMF0sXG4gICAgICAgIHdyaXRpbmdNb2RlLFxuICAgICAgICBpY29uc0luVGV4dDogZmFsc2UsXG4gICAgICAgIHZlcnRpY2FsaXphYmxlOiBmYWxzZSxcbiAgICAgICAgaGFzQmFzZWxpbmU6IGZhbHNlXG4gICAgfTtcblxuICAgIHNoYXBlTGluZXMoc2hhcGluZywgZ2x5cGhNYXAsIGdseXBoUG9zaXRpb25zLCBpbWFnZVBvc2l0aW9ucywgbGluZXMsIGxpbmVIZWlnaHQsIHRleHRBbmNob3IsIHRleHRKdXN0aWZ5LCB3cml0aW5nTW9kZSwgc3BhY2luZywgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCwgbGF5b3V0VGV4dFNpemVUaGlzWm9vbSk7XG4gICAgaWYgKGlzRW1wdHkocG9zaXRpb25lZExpbmVzKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIHNoYXBpbmc7XG59XG5cbi8vIHVzaW5nIGNvbXB1dGVkIHByb3BlcnRpZXMgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8zODBcbi8qIGVzbGludCBuby11c2VsZXNzLWNvbXB1dGVkLWtleTogMCAqL1xuXG5jb25zdCB3aGl0ZXNwYWNlOiB7W186IG51bWJlcl06IGJvb2xlYW59ID0ge1xuICAgIFsweDA5XTogdHJ1ZSwgLy8gdGFiXG4gICAgWzB4MGFdOiB0cnVlLCAvLyBuZXdsaW5lXG4gICAgWzB4MGJdOiB0cnVlLCAvLyB2ZXJ0aWNhbCB0YWJcbiAgICBbMHgwY106IHRydWUsIC8vIGZvcm0gZmVlZFxuICAgIFsweDBkXTogdHJ1ZSwgLy8gY2FycmlhZ2UgcmV0dXJuXG4gICAgWzB4MjBdOiB0cnVlLCAvLyBzcGFjZVxufTtcblxuY29uc3QgYnJlYWthYmxlOiB7W186IG51bWJlcl06IGJvb2xlYW59ID0ge1xuICAgIFsweDBhXTogICB0cnVlLCAvLyBuZXdsaW5lXG4gICAgWzB4MjBdOiAgIHRydWUsIC8vIHNwYWNlXG4gICAgWzB4MjZdOiAgIHRydWUsIC8vIGFtcGVyc2FuZFxuICAgIFsweDI4XTogICB0cnVlLCAvLyBsZWZ0IHBhcmVudGhlc2lzXG4gICAgWzB4MjldOiAgIHRydWUsIC8vIHJpZ2h0IHBhcmVudGhlc2lzXG4gICAgWzB4MmJdOiAgIHRydWUsIC8vIHBsdXMgc2lnblxuICAgIFsweDJkXTogICB0cnVlLCAvLyBoeXBoZW4tbWludXNcbiAgICBbMHgyZl06ICAgdHJ1ZSwgLy8gc29saWR1c1xuICAgIFsweGFkXTogICB0cnVlLCAvLyBzb2Z0IGh5cGhlblxuICAgIFsweGI3XTogICB0cnVlLCAvLyBtaWRkbGUgZG90XG4gICAgWzB4MjAwYl06IHRydWUsIC8vIHplcm8td2lkdGggc3BhY2VcbiAgICBbMHgyMDEwXTogdHJ1ZSwgLy8gaHlwaGVuXG4gICAgWzB4MjAxM106IHRydWUsIC8vIGVuIGRhc2hcbiAgICBbMHgyMDI3XTogdHJ1ZSAgLy8gaW50ZXJwdW5jdFxuICAgIC8vIE1hbnkgb3RoZXIgY2hhcmFjdGVycyBtYXkgYmUgcmVhc29uYWJsZSBicmVha3BvaW50c1xuICAgIC8vIENvbnNpZGVyIFwibmV1dHJhbCBvcmllbnRhdGlvblwiIGNoYXJhY3RlcnMgYXQgc2NyaXB0RGV0ZWN0aW9uLmNoYXJIYXNOZXV0cmFsVmVydGljYWxPcmllbnRhdGlvblxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzY1OFxufTtcblxuZnVuY3Rpb24gZ2V0R2x5cGhBZHZhbmNlKGNvZGVQb2ludDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IFNlY3Rpb25PcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB7W186IHN0cmluZ106IHtnbHlwaHM6IHtbXzogbnVtYmVyXTogP1N0eWxlR2x5cGh9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb3NpdGlvbnM6IHtbXzogc3RyaW5nXTogSW1hZ2VQb3NpdGlvbn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFRleHRTaXplOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghc2VjdGlvbi5pbWFnZU5hbWUpIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gZ2x5cGhNYXBbc2VjdGlvbi5mb250U3RhY2tdO1xuICAgICAgICBjb25zdCBnbHlwaCA9IHBvc2l0aW9ucyAmJiBwb3NpdGlvbnMuZ2x5cGhzW2NvZGVQb2ludF07XG4gICAgICAgIGlmICghZ2x5cGgpIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gZ2x5cGgubWV0cmljcy5hZHZhbmNlICogc2VjdGlvbi5zY2FsZSArIHNwYWNpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW1hZ2VQb3NpdGlvbiA9IGltYWdlUG9zaXRpb25zW3NlY3Rpb24uaW1hZ2VOYW1lXTtcbiAgICAgICAgaWYgKCFpbWFnZVBvc2l0aW9uKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIGltYWdlUG9zaXRpb24uZGlzcGxheVNpemVbMF0gKiBzZWN0aW9uLnNjYWxlICogT05FX0VNIC8gbGF5b3V0VGV4dFNpemUgKyBzcGFjaW5nO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lQXZlcmFnZUxpbmVXaWR0aChsb2dpY2FsSW5wdXQ6IFRhZ2dlZFN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tfOiBzdHJpbmddOiB7Z2x5cGhzOiB7W186IG51bWJlcl06ID9TdHlsZUdseXBofSwgYXNjZW5kZXI/OiBudW1iZXIsIGRlc2NlbmRlcj86IG51bWJlcn19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBJbWFnZVBvc2l0aW9ufSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0VGV4dFNpemU6IG51bWJlcikge1xuICAgIGxldCB0b3RhbFdpZHRoID0gMDtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsb2dpY2FsSW5wdXQubGVuZ3RoKCk7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGxvZ2ljYWxJbnB1dC5nZXRTZWN0aW9uKGluZGV4KTtcbiAgICAgICAgdG90YWxXaWR0aCArPSBnZXRHbHlwaEFkdmFuY2UobG9naWNhbElucHV0LmdldENoYXJDb2RlKGluZGV4KSwgc2VjdGlvbiwgZ2x5cGhNYXAsIGltYWdlUG9zaXRpb25zLCBzcGFjaW5nLCBsYXlvdXRUZXh0U2l6ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZUNvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsV2lkdGggLyBtYXhXaWR0aCkpO1xuICAgIHJldHVybiB0b3RhbFdpZHRoIC8gbGluZUNvdW50O1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVCYWRuZXNzKGxpbmVXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5hbHR5OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGFzdEJyZWFrOiBib29sZWFuKSB7XG4gICAgY29uc3QgcmFnZ2VkbmVzcyA9IE1hdGgucG93KGxpbmVXaWR0aCAtIHRhcmdldFdpZHRoLCAyKTtcbiAgICBpZiAoaXNMYXN0QnJlYWspIHtcbiAgICAgICAgLy8gRmF2b3IgZmluYWxzIGxpbmVzIHNob3J0ZXIgdGhhbiBhdmVyYWdlIG92ZXIgbG9uZ2VyIHRoYW4gYXZlcmFnZVxuICAgICAgICBpZiAobGluZVdpZHRoIDwgdGFyZ2V0V2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiByYWdnZWRuZXNzIC8gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByYWdnZWRuZXNzICogMjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByYWdnZWRuZXNzICsgTWF0aC5hYnMocGVuYWx0eSkgKiBwZW5hbHR5O1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVQZW5hbHR5KGNvZGVQb2ludDogbnVtYmVyLCBuZXh0Q29kZVBvaW50OiBudW1iZXIsIHBlbmFsaXphYmxlSWRlb2dyYXBoaWNCcmVhazogYm9vbGVhbikge1xuICAgIGxldCBwZW5hbHR5ID0gMDtcbiAgICAvLyBGb3JjZSBicmVhayBvbiBuZXdsaW5lXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gMHgwYSkge1xuICAgICAgICBwZW5hbHR5IC09IDEwMDAwO1xuICAgIH1cbiAgICAvLyBQZW5hbGl6ZSBicmVha3MgYmV0d2VlbiBjaGFyYWN0ZXJzIHRoYXQgYWxsb3cgaWRlb2dyYXBoaWMgYnJlYWtpbmcgYmVjYXVzZVxuICAgIC8vIHRoZXkgYXJlIGxlc3MgcHJlZmVyYWJsZSB0aGFuIGJyZWFrcyBhdCBzcGFjZXMgKG9yIHplcm8gd2lkdGggc3BhY2VzKS5cbiAgICBpZiAocGVuYWxpemFibGVJZGVvZ3JhcGhpY0JyZWFrKSB7XG4gICAgICAgIHBlbmFsdHkgKz0gMTUwO1xuICAgIH1cblxuICAgIC8vIFBlbmFsaXplIG9wZW4gcGFyZW50aGVzaXMgYXQgZW5kIG9mIGxpbmVcbiAgICBpZiAoY29kZVBvaW50ID09PSAweDI4IHx8IGNvZGVQb2ludCA9PT0gMHhmZjA4KSB7XG4gICAgICAgIHBlbmFsdHkgKz0gNTA7XG4gICAgfVxuXG4gICAgLy8gUGVuYWxpemUgY2xvc2UgcGFyZW50aGVzaXMgYXQgYmVnaW5uaW5nIG9mIGxpbmVcbiAgICBpZiAobmV4dENvZGVQb2ludCA9PT0gMHgyOSB8fCBuZXh0Q29kZVBvaW50ID09PSAweGZmMDkpIHtcbiAgICAgICAgcGVuYWx0eSArPSA1MDtcbiAgICB9XG4gICAgcmV0dXJuIHBlbmFsdHk7XG59XG5cbnR5cGUgQnJlYWsgPSB7XG4gICAgaW5kZXg6IG51bWJlcixcbiAgICB4OiBudW1iZXIsXG4gICAgcHJpb3JCcmVhazogP0JyZWFrLFxuICAgIGJhZG5lc3M6IG51bWJlclxufTtcblxuZnVuY3Rpb24gZXZhbHVhdGVCcmVhayhicmVha0luZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrWDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRXaWR0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxCcmVha3M6IEFycmF5PEJyZWFrPixcbiAgICAgICAgICAgICAgICAgICAgICAgcGVuYWx0eTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICBpc0xhc3RCcmVhazogYm9vbGVhbik6IEJyZWFrIHtcbiAgICAvLyBXZSBjb3VsZCBza2lwIGV2YWx1YXRpbmcgYnJlYWtzIHdoZXJlIHRoZSBsaW5lIGxlbmd0aCAoYnJlYWtYIC0gcHJpb3JCcmVhay54KSA+IG1heFdpZHRoXG4gICAgLy8gIC4uLmJ1dCBpbiBmYWN0IHdlIGFsbG93IGxpbmVzIGxvbmdlciB0aGFuIG1heFdpZHRoIChpZiB0aGVyZSdzIG5vIGJyZWFrIHBvaW50cylcbiAgICAvLyAgLi4uYW5kIHdoZW4gdGFyZ2V0V2lkdGggYW5kIG1heFdpZHRoIGFyZSBjbG9zZSwgc3RyaWN0bHkgZW5mb3JjaW5nIG1heFdpZHRoIGNhbiBnaXZlXG4gICAgLy8gICAgIG1vcmUgbG9wc2lkZWQgcmVzdWx0cy5cblxuICAgIGxldCBiZXN0UHJpb3JCcmVhazogP0JyZWFrID0gbnVsbDtcbiAgICBsZXQgYmVzdEJyZWFrQmFkbmVzcyA9IGNhbGN1bGF0ZUJhZG5lc3MoYnJlYWtYLCB0YXJnZXRXaWR0aCwgcGVuYWx0eSwgaXNMYXN0QnJlYWspO1xuXG4gICAgZm9yIChjb25zdCBwb3RlbnRpYWxCcmVhayBvZiBwb3RlbnRpYWxCcmVha3MpIHtcbiAgICAgICAgY29uc3QgbGluZVdpZHRoID0gYnJlYWtYIC0gcG90ZW50aWFsQnJlYWsueDtcbiAgICAgICAgY29uc3QgYnJlYWtCYWRuZXNzID1cbiAgICAgICAgICAgIGNhbGN1bGF0ZUJhZG5lc3MobGluZVdpZHRoLCB0YXJnZXRXaWR0aCwgcGVuYWx0eSwgaXNMYXN0QnJlYWspICsgcG90ZW50aWFsQnJlYWsuYmFkbmVzcztcbiAgICAgICAgaWYgKGJyZWFrQmFkbmVzcyA8PSBiZXN0QnJlYWtCYWRuZXNzKSB7XG4gICAgICAgICAgICBiZXN0UHJpb3JCcmVhayA9IHBvdGVudGlhbEJyZWFrO1xuICAgICAgICAgICAgYmVzdEJyZWFrQmFkbmVzcyA9IGJyZWFrQmFkbmVzcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGluZGV4OiBicmVha0luZGV4LFxuICAgICAgICB4OiBicmVha1gsXG4gICAgICAgIHByaW9yQnJlYWs6IGJlc3RQcmlvckJyZWFrLFxuICAgICAgICBiYWRuZXNzOiBiZXN0QnJlYWtCYWRuZXNzXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbGVhc3RCYWRCcmVha3MobGFzdExpbmVCcmVhazogP0JyZWFrKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgaWYgKCFsYXN0TGluZUJyZWFrKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIGxlYXN0QmFkQnJlYWtzKGxhc3RMaW5lQnJlYWsucHJpb3JCcmVhaykuY29uY2F0KGxhc3RMaW5lQnJlYWsuaW5kZXgpO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVMaW5lQnJlYWtzKGxvZ2ljYWxJbnB1dDogVGFnZ2VkU3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB7W186IHN0cmluZ106IHtnbHlwaHM6IHtbXzogbnVtYmVyXTogP1N0eWxlR2x5cGh9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xQbGFjZW1lbnQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0VGV4dFNpemU6IG51bWJlcik6IEFycmF5PG51bWJlcj4ge1xuICAgIGlmIChzeW1ib2xQbGFjZW1lbnQgIT09ICdwb2ludCcpXG4gICAgICAgIHJldHVybiBbXTtcblxuICAgIGlmICghbG9naWNhbElucHV0KVxuICAgICAgICByZXR1cm4gW107XG5cbiAgICBjb25zdCBwb3RlbnRpYWxMaW5lQnJlYWtzID0gW107XG4gICAgY29uc3QgdGFyZ2V0V2lkdGggPSBkZXRlcm1pbmVBdmVyYWdlTGluZVdpZHRoKGxvZ2ljYWxJbnB1dCwgc3BhY2luZywgbWF4V2lkdGgsIGdseXBoTWFwLCBpbWFnZVBvc2l0aW9ucywgbGF5b3V0VGV4dFNpemUpO1xuXG4gICAgY29uc3QgaGFzU2VydmVyU3VnZ2VzdGVkQnJlYWtwb2ludHMgPSBsb2dpY2FsSW5wdXQudGV4dC5pbmRleE9mKFwiXFx1MjAwYlwiKSA+PSAwO1xuXG4gICAgbGV0IGN1cnJlbnRYID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9naWNhbElucHV0Lmxlbmd0aCgpOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbiA9IGxvZ2ljYWxJbnB1dC5nZXRTZWN0aW9uKGkpO1xuICAgICAgICBjb25zdCBjb2RlUG9pbnQgPSBsb2dpY2FsSW5wdXQuZ2V0Q2hhckNvZGUoaSk7XG4gICAgICAgIGlmICghd2hpdGVzcGFjZVtjb2RlUG9pbnRdKSBjdXJyZW50WCArPSBnZXRHbHlwaEFkdmFuY2UoY29kZVBvaW50LCBzZWN0aW9uLCBnbHlwaE1hcCwgaW1hZ2VQb3NpdGlvbnMsIHNwYWNpbmcsIGxheW91dFRleHRTaXplKTtcblxuICAgICAgICAvLyBJZGVvZ3JhcGhpYyBjaGFyYWN0ZXJzLCBzcGFjZXMsIGFuZCB3b3JkLWJyZWFraW5nIHB1bmN0dWF0aW9uIHRoYXQgb2Z0ZW4gYXBwZWFyIHdpdGhvdXRcbiAgICAgICAgLy8gc3Vycm91bmRpbmcgc3BhY2VzLlxuICAgICAgICBpZiAoKGkgPCBsb2dpY2FsSW5wdXQubGVuZ3RoKCkgLSAxKSkge1xuICAgICAgICAgICAgY29uc3QgaWRlb2dyYXBoaWNCcmVhayA9IGNoYXJBbGxvd3NJZGVvZ3JhcGhpY0JyZWFraW5nKGNvZGVQb2ludCk7XG4gICAgICAgICAgICBpZiAoYnJlYWthYmxlW2NvZGVQb2ludF0gfHwgaWRlb2dyYXBoaWNCcmVhayB8fCBzZWN0aW9uLmltYWdlTmFtZSkge1xuXG4gICAgICAgICAgICAgICAgcG90ZW50aWFsTGluZUJyZWFrcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZUJyZWFrKFxuICAgICAgICAgICAgICAgICAgICAgICAgaSArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50WCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsTGluZUJyZWFrcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBlbmFsdHkoY29kZVBvaW50LCBsb2dpY2FsSW5wdXQuZ2V0Q2hhckNvZGUoaSArIDEpLCBpZGVvZ3JhcGhpY0JyZWFrICYmIGhhc1NlcnZlclN1Z2dlc3RlZEJyZWFrcG9pbnRzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGVhc3RCYWRCcmVha3MoXG4gICAgICAgIGV2YWx1YXRlQnJlYWsoXG4gICAgICAgICAgICBsb2dpY2FsSW5wdXQubGVuZ3RoKCksXG4gICAgICAgICAgICBjdXJyZW50WCxcbiAgICAgICAgICAgIHRhcmdldFdpZHRoLFxuICAgICAgICAgICAgcG90ZW50aWFsTGluZUJyZWFrcyxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB0cnVlKSk7XG59XG5cbmZ1bmN0aW9uIGdldEFuY2hvckFsaWdubWVudChhbmNob3I6IFN5bWJvbEFuY2hvcik6IEFuY2hvckFsaWdubWVudCB7XG4gICAgbGV0IGhvcml6b250YWxBbGlnbiA9IDAuNSwgdmVydGljYWxBbGlnbiA9IDAuNTtcblxuICAgIHN3aXRjaCAoYW5jaG9yKSB7XG4gICAgY2FzZSAncmlnaHQnOlxuICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgaG9yaXpvbnRhbEFsaWduID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgY2FzZSAndG9wLWxlZnQnOlxuICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgaG9yaXpvbnRhbEFsaWduID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICBjYXNlICdib3R0b20nOlxuICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICB2ZXJ0aWNhbEFsaWduID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9wJzpcbiAgICBjYXNlICd0b3AtcmlnaHQnOlxuICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgdmVydGljYWxBbGlnbiA9IDA7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiB7aG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWdufTtcbn1cblxuZnVuY3Rpb24gc2hhcGVMaW5lcyhzaGFwaW5nOiBTaGFwaW5nLFxuICAgICAgICAgICAgICAgICAgICBnbHlwaE1hcDoge1tfOiBzdHJpbmddOiB7Z2x5cGhzOiB7W186IG51bWJlcl06ID9TdHlsZUdseXBofSwgYXNjZW5kZXI/OiBudW1iZXIsIGRlc2NlbmRlcj86IG51bWJlcn19LFxuICAgICAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9uczogR2x5cGhQb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LFxuICAgICAgICAgICAgICAgICAgICBsaW5lczogQXJyYXk8VGFnZ2VkU3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yOiBTeW1ib2xBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZ5OiBUZXh0SnVzdGlmeSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGluZ01vZGU6IDEgfCAyLFxuICAgICAgICAgICAgICAgICAgICBzcGFjaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93VmVydGljYWxQbGFjZW1lbnQ6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgIGxheW91dFRleHRTaXplVGhpc1pvb206IG51bWJlcikge1xuXG4gICAgbGV0IHggPSAwO1xuICAgIGxldCB5ID0gMDtcblxuICAgIGxldCBtYXhMaW5lTGVuZ3RoID0gMDtcbiAgICBsZXQgbWF4TGluZUhlaWdodCA9IDA7XG5cbiAgICBjb25zdCBqdXN0aWZ5ID1cbiAgICAgICAgdGV4dEp1c3RpZnkgPT09ICdyaWdodCcgPyAxIDpcbiAgICAgICAgdGV4dEp1c3RpZnkgPT09ICdsZWZ0JyA/IDAgOiAwLjU7XG5cbiAgICBsZXQgaGFzQmFzZWxpbmUgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBsaW5lLmdldFNlY3Rpb25zKCk7XG4gICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgICAgICAgaWYgKHNlY3Rpb24uaW1hZ2VOYW1lKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZ2x5cGhEYXRhID0gZ2x5cGhNYXBbc2VjdGlvbi5mb250U3RhY2tdO1xuICAgICAgICAgICAgaWYgKCFnbHlwaERhdGEpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBoYXNCYXNlbGluZSA9IGdseXBoRGF0YS5hc2NlbmRlciAhPT0gdW5kZWZpbmVkICYmIGdseXBoRGF0YS5kZXNjZW5kZXIgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghaGFzQmFzZWxpbmUpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGFzQmFzZWxpbmUpIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCBsaW5lSW5kZXggPSAwO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgICBsaW5lLnRyaW0oKTtcblxuICAgICAgICBjb25zdCBsaW5lTWF4U2NhbGUgPSBsaW5lLmdldE1heFNjYWxlKCk7XG4gICAgICAgIGNvbnN0IG1heExpbmVPZmZzZXQgPSAobGluZU1heFNjYWxlIC0gMSkgKiBPTkVfRU07XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uZWRMaW5lID0ge3Bvc2l0aW9uZWRHbHlwaHM6IFtdLCBsaW5lT2Zmc2V0OiAwfTtcbiAgICAgICAgc2hhcGluZy5wb3NpdGlvbmVkTGluZXNbbGluZUluZGV4XSA9IHBvc2l0aW9uZWRMaW5lO1xuICAgICAgICBjb25zdCBwb3NpdGlvbmVkR2x5cGhzID0gcG9zaXRpb25lZExpbmUucG9zaXRpb25lZEdseXBocztcbiAgICAgICAgbGV0IGxpbmVPZmZzZXQgPSAwLjA7XG5cbiAgICAgICAgaWYgKCFsaW5lLmxlbmd0aCgpKSB7XG4gICAgICAgICAgICB5ICs9IGxpbmVIZWlnaHQ7IC8vIFN0aWxsIG5lZWQgYSBsaW5lIGZlZWQgYWZ0ZXIgZW1wdHkgbGluZVxuICAgICAgICAgICAgKytsaW5lSW5kZXg7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiaWdnZXN0SGVpZ2h0ID0gMDtcbiAgICAgICAgbGV0IGJhc2VsaW5lT2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCgpOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb24gPSBsaW5lLmdldFNlY3Rpb24oaSk7XG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uSW5kZXggPSBsaW5lLmdldFNlY3Rpb25JbmRleChpKTtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVQb2ludCA9IGxpbmUuZ2V0Q2hhckNvZGUoaSk7XG5cbiAgICAgICAgICAgIGxldCBzZWN0aW9uU2NhbGUgPSBzZWN0aW9uLnNjYWxlO1xuICAgICAgICAgICAgbGV0IG1ldHJpY3MgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHJlY3QgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGltYWdlTmFtZSA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdmVydGljYWxBZHZhbmNlID0gT05FX0VNO1xuICAgICAgICAgICAgbGV0IGdseXBoT2Zmc2V0ID0gMDtcblxuICAgICAgICAgICAgY29uc3QgdmVydGljYWwgPSAhKHdyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS5ob3Jpem9udGFsIHx8XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgdmVydGljYWxpemUgZ2x5cGhzIHRoYXQgaGF2ZSBubyB1cHJpZ2h0IG9yaWVudGF0aW9uIGlmIHZlcnRpY2FsIHBsYWNlbWVudCBpcyBkaXNhYmxlZC5cbiAgICAgICAgICAgICAgICAoIWFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgIWNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjb2RlUG9pbnQpKSB8fFxuICAgICAgICAgICAgICAgIC8vIElmIHZlcnRpY2FsIHBsYWNlbWVudCBpcyBlbmFibGVkLCBkb24ndCB2ZXJ0aWNhbGl6ZSBnbHlwaHMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBmcm9tIGNvbXBsZXggdGV4dCBsYXlvdXQgc2NyaXB0LCBvciB3aGl0ZXNwYWNlcy5cbiAgICAgICAgICAgICAgICAoYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiAod2hpdGVzcGFjZVtjb2RlUG9pbnRdIHx8IGNoYXJJbkNvbXBsZXhTaGFwaW5nU2NyaXB0KGNvZGVQb2ludCkpKSk7XG5cbiAgICAgICAgICAgIGlmICghc2VjdGlvbi5pbWFnZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIGdseXBoIHBvc2l0aW9uIGluIHRoZSBnbHlwaCBhdGxhcywgaWYgYml0bWFwIGlzIG51bGwsXG4gICAgICAgICAgICAgICAgLy8gZ2x5cGhQb3NpdGlvbiB3aWxsIG5vdCBleGl0IGluIHRoZSBnbHlwaFBvc2l0aW9uIG1hcFxuICAgICAgICAgICAgICAgIGNvbnN0IGdseXBoUG9zaXRpb25EYXRhID0gZ2x5cGhQb3NpdGlvbnNbc2VjdGlvbi5mb250U3RhY2tdO1xuICAgICAgICAgICAgICAgIGlmICghZ2x5cGhQb3NpdGlvbkRhdGEpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChnbHlwaFBvc2l0aW9uRGF0YVtjb2RlUG9pbnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QgPSBnbHlwaFBvc2l0aW9uRGF0YVtjb2RlUG9pbnRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBnbHlwaERhdGEgPSBnbHlwaE1hcFtzZWN0aW9uLmZvbnRTdGFja107XG4gICAgICAgICAgICAgICAgaWYgKCFnbHlwaERhdGEpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdseXBoID0gZ2x5cGhEYXRhLmdseXBoc1tjb2RlUG9pbnRdO1xuICAgICAgICAgICAgICAgIGlmICghZ2x5cGgpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgbWV0cmljcyA9IGdseXBoLm1ldHJpY3M7XG4gICAgICAgICAgICAgICAgdmVydGljYWxBZHZhbmNlID0gY29kZVBvaW50ICE9PSAweDIwMGIgPyBPTkVfRU0gOiAwO1xuXG4gICAgICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gbWFrZSBkaWZmZXJlbnQgZm9udHMgYWxpZ25lZCwgdGhleSBtdXN0IHNoYXJlIGEgZ2VuZXJhbCBiYXNlbGluZSB0aGF0IGFsaWducyB3aXRoIGV2ZXJ5XG4gICAgICAgICAgICAgICAgLy8gZm9udCdzIHJlYWwgYmFzZWxpbmUuIEdseXBoJ3Mgb2Zmc2V0IGlzIGNvdW50ZWQgZnJvbSB0aGUgdG9wIGxlZnQgY29ybmVyLCB3aGVyZSB0aGUgYXNjZW5kZXIgbGluZVxuICAgICAgICAgICAgICAgIC8vIHN0YXJ0cy5cbiAgICAgICAgICAgICAgICAvLyBGaXJzdCBvZiBhbGwsIGVhY2ggZ2x5cGgncyBiYXNlbGluZSBsaWVzIG9uIHRoZSBjZW50ZXIgbGluZSBvZiB0aGUgc2hhcGluZyBsaW5lLiBTaW5jZSBhc2NlbmRlclxuICAgICAgICAgICAgICAgIC8vIGlzIGFib3ZlIHRoZSBiYXNlbGluZSwgdGhlIGdseXBoT2Zmc2V0IGlzIHRoZSBuZWdhdGl2ZSBzaGlmdC4gVGhlbiwgaW4gb3JkZXIgdG8gbWFrZSBnbHlwaHMgZml0IGluXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNoYXBpbmcgYm94LCBmb3IgZWFjaCBsaW5lLCB3ZSBzaGlmdCB0aGUgZ2x5cGggd2l0aCBiaWdnZXN0IGhlaWdodCh3aXRoIHNjYWxlKSB0byBtYWtlIGl0cyBjZW50ZXJcbiAgICAgICAgICAgICAgICAvLyBsaWUgb24gdGhlIGNlbnRlciBsaW5lIG9mIHRoZSBsaW5lLCB3aGljaCB3aWxsIGxlYWQgdG8gYSBiYXNlbGluZSBzaGlmdC4gVGhlbiBhZGp1c3QgdGhlIHdob2xlIGxpbmVcbiAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBiYXNlbGluZSBvZmZzZXQgd2UgY2FsY3VsYXRlZCBmcm9tIHRoZSBzaGlmdC5cbiAgICAgICAgICAgICAgICBpZiAoaGFzQmFzZWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXNjZW5kZXIgPSBnbHlwaERhdGEuYXNjZW5kZXIgIT09IHVuZGVmaW5lZCA/IE1hdGguYWJzKGdseXBoRGF0YS5hc2NlbmRlcikgOiAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjZW5kZXIgPSBnbHlwaERhdGEuZGVzY2VuZGVyICE9PSB1bmRlZmluZWQgPyBNYXRoLmFicyhnbHlwaERhdGEuZGVzY2VuZGVyKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKGFzY2VuZGVyICsgZGVzY2VuZGVyKSAqIHNlY3Rpb25TY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJpZ2dlc3RIZWlnaHQgPCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYmlnZ2VzdEhlaWdodCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmVPZmZzZXQgPSAoYXNjZW5kZXIgLSBkZXNjZW5kZXIpIC8gMiAqIHNlY3Rpb25TY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBnbHlwaE9mZnNldCA9IC1hc2NlbmRlciAqIHNlY3Rpb25TY2FsZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBmb250J3MgYmFzZWxpbmUgaXMgbm90IGFwcGxpY2FibGUsIGZhbGwgYmFjayB0byB1c2UgYSBkZWZhdWx0IGJhc2VsaW5lIG9mZnNldCwgc2VlXG4gICAgICAgICAgICAgICAgICAgIC8vIFNoYXBpbmc6OnlPZmZzZXQuIFNpbmNlIHdlJ3JlIGxheWluZyBvdXQgYXQgMjQgcG9pbnRzLCB3ZSBuZWVkIGFsc28gY2FsY3VsYXRlIGhvdyBtdWNoIGl0IHdpbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSB3aGVuIHdlIHNjYWxlIHVwIG9yIGRvd24uXG4gICAgICAgICAgICAgICAgICAgIGdseXBoT2Zmc2V0ID0gU0hBUElOR19ERUZBVUxUX09GRlNFVCArIChsaW5lTWF4U2NhbGUgLSBzZWN0aW9uU2NhbGUpICogT05FX0VNO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2VQb3NpdGlvbiA9IGltYWdlUG9zaXRpb25zW3NlY3Rpb24uaW1hZ2VOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIWltYWdlUG9zaXRpb24pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGltYWdlTmFtZSA9IHNlY3Rpb24uaW1hZ2VOYW1lO1xuICAgICAgICAgICAgICAgIHNoYXBpbmcuaWNvbnNJblRleHQgPSBzaGFwaW5nLmljb25zSW5UZXh0IHx8IHRydWU7XG4gICAgICAgICAgICAgICAgcmVjdCA9IGltYWdlUG9zaXRpb24ucGFkZGVkUmVjdDtcbiAgICAgICAgICAgICAgICBjb25zdCBzaXplID0gaW1hZ2VQb3NpdGlvbi5kaXNwbGF5U2l6ZTtcbiAgICAgICAgICAgICAgICAvLyBJZiBuZWVkZWQsIGFsbG93IHRvIHNldCBzY2FsZSBmYWN0b3IgZm9yIGFuIGltYWdlIHVzaW5nXG4gICAgICAgICAgICAgICAgLy8gYWxpYXMgXCJpbWFnZS1zY2FsZVwiIHRoYXQgY291bGQgYmUgYWxpYXMgZm9yIFwiZm9udC1zY2FsZVwiXG4gICAgICAgICAgICAgICAgLy8gd2hlbiBGb3JtYXR0ZWRTZWN0aW9uIGlzIGFuIGltYWdlIHNlY3Rpb24uXG4gICAgICAgICAgICAgICAgc2VjdGlvblNjYWxlID0gc2VjdGlvblNjYWxlICogT05FX0VNIC8gbGF5b3V0VGV4dFNpemVUaGlzWm9vbTtcblxuICAgICAgICAgICAgICAgIG1ldHJpY3MgPSB7d2lkdGg6IHNpemVbMF0sXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogc2l6ZVsxXSxcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogSU1BR0VfUEFERElORyxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAtR0xZUEhfUEJGX0JPUkRFUixcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZTogdmVydGljYWwgPyBzaXplWzFdIDogc2l6ZVswXSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxHbHlwaDogZmFsc2V9O1xuXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNCYXNlbGluZSkge1xuICAgICAgICAgICAgICAgICAgICBnbHlwaE9mZnNldCA9IFNIQVBJTkdfREVGQVVMVF9PRkZTRVQgKyBsaW5lTWF4U2NhbGUgKiBPTkVfRU0gLSBzaXplWzFdICogc2VjdGlvblNjYWxlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJhc2VkIG9uIG5vZGUtZm9udG5pazogJ3RvcCA9IGhlaWdodEFib3ZlQmFzZWxpbmUgLSBBc2NlbmRlcicoaXQgaXMgbm90IHZhbGlkIGZvciBsb2NhbGx5XG4gICAgICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlZCBnbHlwaCkuIFNpbmNlIHRoZSB0b3AgaXMgYSBjb25zdGFudDogZ2x5cGgncyBib3JkZXJTaXplLiBTbyBpZiB3ZSBzZXQgaW1hZ2UgZ2x5cGggd2l0aFxuICAgICAgICAgICAgICAgICAgICAvLyAnYXNjZW5kZXIgPSBoZWlnaHQnLCBpdCBtZWFucyB3ZSBwdWxsIGRvd24gdGhlIGdseXBoIHVuZGVyIGJhc2VsaW5lIHdpdGggYSBkaXN0YW5jZSBvZiBnbHlwaCdzIGJvcmRlclNpemUuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlQXNjZW5kZXIgPSBtZXRyaWNzLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhPZmZzZXQgPSAtaW1hZ2VBc2NlbmRlciAqIHNlY3Rpb25TY2FsZTtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFkdmFuY2UgPSBtZXRyaWNzLmFkdmFuY2U7XG5cbiAgICAgICAgICAgICAgICAvLyBEaWZmZXJlbmNlIGJldHdlZW4gaGVpZ2h0IG9mIGFuIGltYWdlIGFuZCBvbmUgRU0gYXQgbWF4IGxpbmUgc2NhbGUuXG4gICAgICAgICAgICAgICAgLy8gUHVzaGVzIGN1cnJlbnQgbGluZSBkb3duIGlmIGFuIGltYWdlIHNpemUgaXMgb3ZlciAxIEVNIGF0IG1heCBsaW5lIHNjYWxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh2ZXJ0aWNhbCA/IHNpemVbMF0gOiBzaXplWzFdKSAqIHNlY3Rpb25TY2FsZSAtIE9ORV9FTSAqIGxpbmVNYXhTY2FsZTtcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCAmJiBvZmZzZXQgPiBsaW5lT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25lZEdseXBocy5wdXNoKHtnbHlwaDogY29kZVBvaW50LCBpbWFnZU5hbWUsIHgsIHk6IHkgKyBnbHlwaE9mZnNldCwgdmVydGljYWwsIHNjYWxlOiBzZWN0aW9uU2NhbGUsIGxvY2FsR2x5cGg6IG1ldHJpY3MubG9jYWxHbHlwaCwgZm9udFN0YWNrOiBzZWN0aW9uLmZvbnRTdGFjaywgc2VjdGlvbkluZGV4LCBtZXRyaWNzLCByZWN0fSk7XG4gICAgICAgICAgICAgICAgeCArPSBtZXRyaWNzLmFkdmFuY2UgKiBzZWN0aW9uU2NhbGUgKyBzcGFjaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaGFwaW5nLnZlcnRpY2FsaXphYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbmVkR2x5cGhzLnB1c2goe2dseXBoOiBjb2RlUG9pbnQsIGltYWdlTmFtZSwgeCwgeTogeSArIGdseXBoT2Zmc2V0LCB2ZXJ0aWNhbCwgc2NhbGU6IHNlY3Rpb25TY2FsZSwgbG9jYWxHbHlwaDogbWV0cmljcy5sb2NhbEdseXBoLCBmb250U3RhY2s6IHNlY3Rpb24uZm9udFN0YWNrLCBzZWN0aW9uSW5kZXgsIG1ldHJpY3MsIHJlY3R9KTtcbiAgICAgICAgICAgICAgICB4ICs9IHZlcnRpY2FsQWR2YW5jZSAqIHNlY3Rpb25TY2FsZSArIHNwYWNpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IGp1c3RpZnkgaWYgd2UgcGxhY2VkIGF0IGxlYXN0IG9uZSBnbHlwaFxuICAgICAgICBpZiAocG9zaXRpb25lZEdseXBocy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSB4IC0gc3BhY2luZztcbiAgICAgICAgICAgIG1heExpbmVMZW5ndGggPSBNYXRoLm1heChsaW5lTGVuZ3RoLCBtYXhMaW5lTGVuZ3RoKTtcbiAgICAgICAgICAgIC8vIEp1c3RpZnkgdGhlIGxpbmUgc28gdGhhdCBpdHMgdG9wIGlzIGFsaWduZWQgd2l0aCB0aGUgY3VycmVudCBoZWlnaHQgb2YgeSwgYW5kIGl0cyBob3Jpem9udGFsIGNvb3JkaW5hdGVzXG4gICAgICAgICAgICAvLyBhcmUganVzdGlmaWVkIGFjY29yZGluZyB0byB0aGUgVGV4dEp1c3RpZnlUeXBlXG4gICAgICAgICAgICBpZiAoaGFzQmFzZWxpbmUpIHtcbiAgICAgICAgICAgICAgICBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzLCBqdXN0aWZ5LCBsaW5lT2Zmc2V0LCBiYXNlbGluZU9mZnNldCwgbGluZUhlaWdodCAqIGxpbmVNYXhTY2FsZSAvIDIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTY2FsZWQgbGluZSBoZWlnaHQgb2Zmc2V0IGlzIGNvdW50ZWQgaW4gZ2x5cGhPZmZzZXQsIHNvIGhlcmUganVzdCB1c2UgYW4gdW5zY2FsZWQgbGluZSBoZWlnaHRcbiAgICAgICAgICAgICAgICBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzLCBqdXN0aWZ5LCBsaW5lT2Zmc2V0LCAwLCBsaW5lSGVpZ2h0IC8gMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB4ID0gMDtcbiAgICAgICAgY29uc3QgY3VycmVudExpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0ICogbGluZU1heFNjYWxlICsgbGluZU9mZnNldDtcbiAgICAgICAgcG9zaXRpb25lZExpbmUubGluZU9mZnNldCA9IE1hdGgubWF4KGxpbmVPZmZzZXQsIG1heExpbmVPZmZzZXQpO1xuICAgICAgICB5ICs9IGN1cnJlbnRMaW5lSGVpZ2h0O1xuICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gTWF0aC5tYXgoY3VycmVudExpbmVIZWlnaHQsIG1heExpbmVIZWlnaHQpO1xuICAgICAgICArK2xpbmVJbmRleDtcbiAgICB9XG5cbiAgICBjb25zdCBoZWlnaHQgPSB5O1xuICAgIGNvbnN0IHtob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ259ID0gZ2V0QW5jaG9yQWxpZ25tZW50KHRleHRBbmNob3IpO1xuICAgIGFsaWduKHNoYXBpbmcucG9zaXRpb25lZExpbmVzLCBqdXN0aWZ5LCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIG1heExpbmVMZW5ndGgsIGhlaWdodCk7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBib3VuZGluZyBib3hcbiAgICBzaGFwaW5nLnRvcCArPSAtdmVydGljYWxBbGlnbiAqIGhlaWdodDtcbiAgICBzaGFwaW5nLmJvdHRvbSA9IHNoYXBpbmcudG9wICsgaGVpZ2h0O1xuICAgIHNoYXBpbmcubGVmdCArPSAtaG9yaXpvbnRhbEFsaWduICogbWF4TGluZUxlbmd0aDtcbiAgICBzaGFwaW5nLnJpZ2h0ID0gc2hhcGluZy5sZWZ0ICsgbWF4TGluZUxlbmd0aDtcbiAgICBzaGFwaW5nLmhhc0Jhc2VsaW5lID0gaGFzQmFzZWxpbmU7XG59XG5cbi8vIGp1c3RpZnkgcmlnaHQgPSAxLCBsZWZ0ID0gMCwgY2VudGVyID0gMC41XG5mdW5jdGlvbiBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzOiBBcnJheTxQb3NpdGlvbmVkR2x5cGg+LFxuICAgICAgICAgICAgICAgICAgICAganVzdGlmeTogMSB8IDAgfCAwLjUsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICBiYXNlbGluZU9mZnNldDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgaGFsZkxpbmVIZWlnaHQ6IG51bWJlcikge1xuICAgIGlmICghanVzdGlmeSAmJiAhbGluZU9mZnNldCAmJiAhYmFzZWxpbmVPZmZzZXQgJiYgIWhhbGZMaW5lSGVpZ2h0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZW5kID0gcG9zaXRpb25lZEdseXBocy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IGxhc3RHbHlwaCA9IHBvc2l0aW9uZWRHbHlwaHNbZW5kXTtcbiAgICBjb25zdCBsYXN0QWR2YW5jZSA9IGxhc3RHbHlwaC5tZXRyaWNzLmFkdmFuY2UgKiBsYXN0R2x5cGguc2NhbGU7XG4gICAgY29uc3QgbGluZUluZGVudCA9IChsYXN0R2x5cGgueCArIGxhc3RBZHZhbmNlKSAqIGp1c3RpZnk7XG5cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBlbmQ7IGorKykge1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnggLT0gbGluZUluZGVudDtcbiAgICAgICAgcG9zaXRpb25lZEdseXBoc1tqXS55ICs9IGxpbmVPZmZzZXQgKyBiYXNlbGluZU9mZnNldCArIGhhbGZMaW5lSGVpZ2h0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWxpZ24ocG9zaXRpb25lZExpbmVzOiBBcnJheTxQb3NpdGlvbmVkTGluZT4sXG4gICAgICAgICAgICAgICBqdXN0aWZ5OiBudW1iZXIsXG4gICAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ246IG51bWJlcixcbiAgICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246IG51bWJlcixcbiAgICAgICAgICAgICAgIG1heExpbmVMZW5ndGg6IG51bWJlcixcbiAgICAgICAgICAgICAgIGJsb2NrSGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCBzaGlmdFggPSAoanVzdGlmeSAtIGhvcml6b250YWxBbGlnbikgKiBtYXhMaW5lTGVuZ3RoO1xuXG4gICAgY29uc3Qgc2hpZnRZID0gLWJsb2NrSGVpZ2h0ICogdmVydGljYWxBbGlnbjtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcG9zaXRpb25lZExpbmVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9zaXRpb25lZEdseXBoIG9mIGxpbmUucG9zaXRpb25lZEdseXBocykge1xuICAgICAgICAgICAgcG9zaXRpb25lZEdseXBoLnggKz0gc2hpZnRYO1xuICAgICAgICAgICAgcG9zaXRpb25lZEdseXBoLnkgKz0gc2hpZnRZO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBQb3NpdGlvbmVkSWNvbiA9IHtcbiAgICBpbWFnZTogSW1hZ2VQb3NpdGlvbixcbiAgICB0b3A6IG51bWJlcixcbiAgICBib3R0b206IG51bWJlcixcbiAgICBsZWZ0OiBudW1iZXIsXG4gICAgcmlnaHQ6IG51bWJlcixcbiAgICBjb2xsaXNpb25QYWRkaW5nPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbn07XG5cbmZ1bmN0aW9uIHNoYXBlSWNvbihpbWFnZTogSW1hZ2VQb3NpdGlvbiwgaWNvbk9mZnNldDogW251bWJlciwgbnVtYmVyXSwgaWNvbkFuY2hvcjogU3ltYm9sQW5jaG9yKTogUG9zaXRpb25lZEljb24ge1xuICAgIGNvbnN0IHtob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ259ID0gZ2V0QW5jaG9yQWxpZ25tZW50KGljb25BbmNob3IpO1xuICAgIGNvbnN0IGR4ID0gaWNvbk9mZnNldFswXTtcbiAgICBjb25zdCBkeSA9IGljb25PZmZzZXRbMV07XG4gICAgY29uc3QgeDEgPSBkeCAtIGltYWdlLmRpc3BsYXlTaXplWzBdICogaG9yaXpvbnRhbEFsaWduO1xuICAgIGNvbnN0IHgyID0geDEgKyBpbWFnZS5kaXNwbGF5U2l6ZVswXTtcbiAgICBjb25zdCB5MSA9IGR5IC0gaW1hZ2UuZGlzcGxheVNpemVbMV0gKiB2ZXJ0aWNhbEFsaWduO1xuICAgIGNvbnN0IHkyID0geTEgKyBpbWFnZS5kaXNwbGF5U2l6ZVsxXTtcbiAgICByZXR1cm4ge2ltYWdlLCB0b3A6IHkxLCBib3R0b206IHkyLCBsZWZ0OiB4MSwgcmlnaHQ6IHgyfTtcbn1cblxuZnVuY3Rpb24gZml0SWNvblRvVGV4dChzaGFwZWRJY29uOiBQb3NpdGlvbmVkSWNvbiwgc2hhcGVkVGV4dDogU2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpdDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBbIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciBdLFxuICAgICAgICAgICAgICAgICAgICAgICBpY29uT2Zmc2V0OiBbIG51bWJlciwgbnVtYmVyIF0sIGZvbnRTY2FsZTogbnVtYmVyKTogUG9zaXRpb25lZEljb24ge1xuICAgIGFzc2VydCh0ZXh0Rml0ICE9PSAnbm9uZScpO1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHBhZGRpbmcpICYmIHBhZGRpbmcubGVuZ3RoID09PSA0KTtcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShpY29uT2Zmc2V0KSAmJiBpY29uT2Zmc2V0Lmxlbmd0aCA9PT0gMik7XG5cbiAgICBjb25zdCBpbWFnZSA9IHNoYXBlZEljb24uaW1hZ2U7XG5cbiAgICBsZXQgY29sbGlzaW9uUGFkZGluZztcbiAgICBpZiAoaW1hZ2UuY29udGVudCkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gaW1hZ2UuY29udGVudDtcbiAgICAgICAgY29uc3QgcGl4ZWxSYXRpbyA9IGltYWdlLnBpeGVsUmF0aW8gfHwgMTtcbiAgICAgICAgY29sbGlzaW9uUGFkZGluZyA9IFtcbiAgICAgICAgICAgIGNvbnRlbnRbMF0gLyBwaXhlbFJhdGlvLFxuICAgICAgICAgICAgY29udGVudFsxXSAvIHBpeGVsUmF0aW8sXG4gICAgICAgICAgICBpbWFnZS5kaXNwbGF5U2l6ZVswXSAtIGNvbnRlbnRbMl0gLyBwaXhlbFJhdGlvLFxuICAgICAgICAgICAgaW1hZ2UuZGlzcGxheVNpemVbMV0gLSBjb250ZW50WzNdIC8gcGl4ZWxSYXRpb1xuICAgICAgICBdO1xuICAgIH1cblxuICAgIC8vIFdlIGRvbid0IHJlc3BlY3QgdGhlIGljb24tYW5jaG9yLCBiZWNhdXNlIGljb24tdGV4dC1maXQgaXMgc2V0LiBJbnN0ZWFkLFxuICAgIC8vIHRoZSBpY29uIHdpbGwgYmUgY2VudGVyZWQgb24gdGhlIHRleHQsIHRoZW4gc3RyZXRjaGVkIGluIHRoZSBnaXZlblxuICAgIC8vIGRpbWVuc2lvbnMuXG5cbiAgICBjb25zdCB0ZXh0TGVmdCA9IHNoYXBlZFRleHQubGVmdCAqIGZvbnRTY2FsZTtcbiAgICBjb25zdCB0ZXh0UmlnaHQgPSBzaGFwZWRUZXh0LnJpZ2h0ICogZm9udFNjYWxlO1xuXG4gICAgbGV0IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdDtcbiAgICBpZiAodGV4dEZpdCA9PT0gJ3dpZHRoJyB8fCB0ZXh0Rml0ID09PSAnYm90aCcpIHtcbiAgICAgICAgLy8gU3RyZXRjaGVkIGhvcml6b250YWxseSB0byB0aGUgdGV4dCB3aWR0aFxuICAgICAgICBsZWZ0ID0gaWNvbk9mZnNldFswXSArIHRleHRMZWZ0IC0gcGFkZGluZ1szXTtcbiAgICAgICAgcmlnaHQgPSBpY29uT2Zmc2V0WzBdICsgdGV4dFJpZ2h0ICsgcGFkZGluZ1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDZW50ZXJlZCBvbiB0aGUgdGV4dFxuICAgICAgICBsZWZ0ID0gaWNvbk9mZnNldFswXSArICh0ZXh0TGVmdCArIHRleHRSaWdodCAtIGltYWdlLmRpc3BsYXlTaXplWzBdKSAvIDI7XG4gICAgICAgIHJpZ2h0ID0gbGVmdCArIGltYWdlLmRpc3BsYXlTaXplWzBdO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRUb3AgPSBzaGFwZWRUZXh0LnRvcCAqIGZvbnRTY2FsZTtcbiAgICBjb25zdCB0ZXh0Qm90dG9tID0gc2hhcGVkVGV4dC5ib3R0b20gKiBmb250U2NhbGU7XG4gICAgaWYgKHRleHRGaXQgPT09ICdoZWlnaHQnIHx8IHRleHRGaXQgPT09ICdib3RoJykge1xuICAgICAgICAvLyBTdHJldGNoZWQgdmVydGljYWxseSB0byB0aGUgdGV4dCBoZWlnaHRcbiAgICAgICAgdG9wID0gaWNvbk9mZnNldFsxXSArIHRleHRUb3AgLSBwYWRkaW5nWzBdO1xuICAgICAgICBib3R0b20gPSBpY29uT2Zmc2V0WzFdICsgdGV4dEJvdHRvbSArIHBhZGRpbmdbMl07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ2VudGVyZWQgb24gdGhlIHRleHRcbiAgICAgICAgdG9wID0gaWNvbk9mZnNldFsxXSArICh0ZXh0VG9wICsgdGV4dEJvdHRvbSAtIGltYWdlLmRpc3BsYXlTaXplWzFdKSAvIDI7XG4gICAgICAgIGJvdHRvbSA9IHRvcCArIGltYWdlLmRpc3BsYXlTaXplWzFdO1xuICAgIH1cblxuICAgIHJldHVybiB7aW1hZ2UsIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgY29sbGlzaW9uUGFkZGluZ307XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5cbmNsYXNzIEFuY2hvciBleHRlbmRzIFBvaW50IHtcbiAgICBhbmdsZTogYW55O1xuICAgIHo6IG51bWJlcjtcbiAgICBzZWdtZW50OiBudW1iZXIgfCB2b2lkO1xuXG4gICAgY29uc3RydWN0b3IoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciwgYW5nbGU6IG51bWJlciwgc2VnbWVudD86IG51bWJlcikge1xuICAgICAgICBzdXBlcih4LCB5KTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICB0aGlzLnogPSB6O1xuICAgICAgICBpZiAoc2VnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnQgPSBzZWdtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xvbmUoKTogQW5jaG9yIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy5hbmdsZSwgdGhpcy5zZWdtZW50KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKEFuY2hvciwgJ0FuY2hvcicpO1xuXG5leHBvcnQgZGVmYXVsdCBBbmNob3I7XG4iLCIvLyBAZmxvd1xuXG5leHBvcnQgZGVmYXVsdCBjaGVja01heEFuZ2xlO1xuXG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIEFuY2hvciBmcm9tICcuL2FuY2hvci5qcyc7XG5cbi8qKlxuICogTGFiZWxzIHBsYWNlZCBhcm91bmQgcmVhbGx5IHNoYXJwIGFuZ2xlcyBhcmVuJ3QgcmVhZGFibGUuIENoZWNrIGlmIGFueVxuICogcGFydCBvZiB0aGUgcG90ZW50aWFsIGxhYmVsIGhhcyBhIGNvbWJpbmVkIGFuZ2xlIHRoYXQgaXMgdG9vIGJpZy5cbiAqXG4gKiBAcGFyYW0gbGluZVxuICogQHBhcmFtIGFuY2hvciBUaGUgcG9pbnQgb24gdGhlIGxpbmUgYXJvdW5kIHdoaWNoIHRoZSBsYWJlbCBpcyBhbmNob3JlZC5cbiAqIEBwYXJhbSBsYWJlbExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBsYWJlbCBpbiBnZW9tZXRyeSB1bml0cy5cbiAqIEBwYXJhbSB3aW5kb3dTaXplIFRoZSBjaGVjayBmYWlscyBpZiB0aGUgY29tYmluZWQgYW5nbGVzIHdpdGhpbiBhIHBhcnQgb2YgdGhlIGxpbmUgdGhhdCBpcyBgd2luZG93U2l6ZWAgbG9uZyBpcyB0b28gYmlnLlxuICogQHBhcmFtIG1heEFuZ2xlIFRoZSBtYXhpbXVtIGNvbWJpbmVkIGFuZ2xlIHRoYXQgYW55IHdpbmRvdyBhbG9uZyB0aGUgbGFiZWwgaXMgYWxsb3dlZCB0byBoYXZlLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBsYWJlbCBzaG91bGQgYmUgcGxhY2VkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja01heEFuZ2xlKGxpbmU6IEFycmF5PFBvaW50PiwgYW5jaG9yOiBBbmNob3IsIGxhYmVsTGVuZ3RoOiBudW1iZXIsIHdpbmRvd1NpemU6IG51bWJlciwgbWF4QW5nbGU6IG51bWJlcik6IGJvb2xlYW4ge1xuXG4gICAgLy8gaG9yaXpvbnRhbCBsYWJlbHMgYWx3YXlzIHBhc3NcbiAgICBpZiAoYW5jaG9yLnNlZ21lbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG5cbiAgICBsZXQgcCA9IGFuY2hvcjtcbiAgICBsZXQgaW5kZXggPSBhbmNob3Iuc2VnbWVudCArIDE7XG4gICAgbGV0IGFuY2hvckRpc3RhbmNlID0gMDtcblxuICAgIC8vIG1vdmUgYmFja3dhcmRzIGFsb25nIHRoZSBsaW5lIHRvIHRoZSBmaXJzdCBzZWdtZW50IHRoZSBsYWJlbCBhcHBlYXJzIG9uXG4gICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlID4gLWxhYmVsTGVuZ3RoIC8gMikge1xuICAgICAgICBpbmRleC0tO1xuXG4gICAgICAgIC8vIHRoZXJlIGlzbid0IGVub3VnaCByb29tIGZvciB0aGUgbGFiZWwgYWZ0ZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZVxuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgYW5jaG9yRGlzdGFuY2UgLT0gbGluZVtpbmRleF0uZGlzdChwKTtcbiAgICAgICAgcCA9IGxpbmVbaW5kZXhdO1xuICAgIH1cblxuICAgIGFuY2hvckRpc3RhbmNlICs9IGxpbmVbaW5kZXhdLmRpc3QobGluZVtpbmRleCArIDFdKTtcbiAgICBpbmRleCsrO1xuXG4gICAgLy8gc3RvcmUgcmVjZW50IGNvcm5lcnMgYW5kIHRoZWlyIHRvdGFsIGFuZ2xlIGRpZmZlcmVuY2VcbiAgICBjb25zdCByZWNlbnRDb3JuZXJzID0gW107XG4gICAgbGV0IHJlY2VudEFuZ2xlRGVsdGEgPSAwO1xuXG4gICAgLy8gbW92ZSBmb3J3YXJkcyBieSB0aGUgbGVuZ3RoIG9mIHRoZSBsYWJlbCBhbmQgY2hlY2sgYW5nbGVzIGFsb25nIHRoZSB3YXlcbiAgICB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgPCBsYWJlbExlbmd0aCAvIDIpIHtcbiAgICAgICAgY29uc3QgcHJldiA9IGxpbmVbaW5kZXggLSAxXTtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGxpbmVbaW5kZXhdO1xuICAgICAgICBjb25zdCBuZXh0ID0gbGluZVtpbmRleCArIDFdO1xuXG4gICAgICAgIC8vIHRoZXJlIGlzbid0IGVub3VnaCByb29tIGZvciB0aGUgbGFiZWwgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGxpbmVcbiAgICAgICAgaWYgKCFuZXh0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgbGV0IGFuZ2xlRGVsdGEgPSBwcmV2LmFuZ2xlVG8oY3VycmVudCkgLSBjdXJyZW50LmFuZ2xlVG8obmV4dCk7XG4gICAgICAgIC8vIHJlc3RyaWN0IGFuZ2xlIHRvIC1waS4ucGkgcmFuZ2VcbiAgICAgICAgYW5nbGVEZWx0YSA9IE1hdGguYWJzKCgoYW5nbGVEZWx0YSArIDMgKiBNYXRoLlBJKSAlIChNYXRoLlBJICogMikpIC0gTWF0aC5QSSk7XG5cbiAgICAgICAgcmVjZW50Q29ybmVycy5wdXNoKHtcbiAgICAgICAgICAgIGRpc3RhbmNlOiBhbmNob3JEaXN0YW5jZSxcbiAgICAgICAgICAgIGFuZ2xlRGVsdGFcbiAgICAgICAgfSk7XG4gICAgICAgIHJlY2VudEFuZ2xlRGVsdGEgKz0gYW5nbGVEZWx0YTtcblxuICAgICAgICAvLyByZW1vdmUgY29ybmVycyB0aGF0IGFyZSBmYXIgZW5vdWdoIGF3YXkgZnJvbSB0aGUgbGlzdCBvZiByZWNlbnQgYW5jaG9yc1xuICAgICAgICB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgLSByZWNlbnRDb3JuZXJzWzBdLmRpc3RhbmNlID4gd2luZG93U2l6ZSkge1xuICAgICAgICAgICAgcmVjZW50QW5nbGVEZWx0YSAtPSByZWNlbnRDb3JuZXJzLnNoaWZ0KCkuYW5nbGVEZWx0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZSBzdW0gb2YgYW5nbGVzIHdpdGhpbiB0aGUgd2luZG93IGFyZWEgZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlLiBjaGVjayBmYWlscy5cbiAgICAgICAgaWYgKHJlY2VudEFuZ2xlRGVsdGEgPiBtYXhBbmdsZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGFuY2hvckRpc3RhbmNlICs9IGN1cnJlbnQuZGlzdChuZXh0KTtcbiAgICB9XG5cbiAgICAvLyBubyBwYXJ0IG9mIHRoZSBsaW5lIGhhZCBhbiBhbmdsZSBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZC4gY2hlY2sgcGFzc2VzLlxuICAgIHJldHVybiB0cnVlO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtudW1iZXIgYXMgaW50ZXJwb2xhdGV9IGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5cbmltcG9ydCBBbmNob3IgZnJvbSAnLi4vc3ltYm9sL2FuY2hvci5qcyc7XG5pbXBvcnQgY2hlY2tNYXhBbmdsZSBmcm9tICcuL2NoZWNrX21heF9hbmdsZS5qcyc7XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge1NoYXBpbmcsIFBvc2l0aW9uZWRJY29ufSBmcm9tICcuL3NoYXBpbmcuanMnO1xuXG5leHBvcnQge2dldEFuY2hvcnMsIGdldENlbnRlckFuY2hvcn07XG5cbmZ1bmN0aW9uIGdldExpbmVMZW5ndGgobGluZTogQXJyYXk8UG9pbnQ+KTogbnVtYmVyIHtcbiAgICBsZXQgbGluZUxlbmd0aCA9IDA7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW5lLmxlbmd0aCAtIDE7IGsrKykge1xuICAgICAgICBsaW5lTGVuZ3RoICs9IGxpbmVba10uZGlzdChsaW5lW2sgKyAxXSk7XG4gICAgfVxuICAgIHJldHVybiBsaW5lTGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBnZXRBbmdsZVdpbmRvd1NpemUoc2hhcGVkVGV4dDogP1NoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94U2NhbGU6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHNoYXBlZFRleHQgP1xuICAgICAgICAzIC8gNSAqIGdseXBoU2l6ZSAqIGJveFNjYWxlIDpcbiAgICAgICAgMDtcbn1cblxuZnVuY3Rpb24gZ2V0U2hhcGVkTGFiZWxMZW5ndGgoc2hhcGVkVGV4dDogP1NoYXBpbmcsIHNoYXBlZEljb246ID9Qb3NpdGlvbmVkSWNvbik6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgICBzaGFwZWRUZXh0ID8gc2hhcGVkVGV4dC5yaWdodCAtIHNoYXBlZFRleHQubGVmdCA6IDAsXG4gICAgICAgIHNoYXBlZEljb24gPyBzaGFwZWRJY29uLnJpZ2h0IC0gc2hhcGVkSWNvbi5sZWZ0IDogMCk7XG59XG5cbmZ1bmN0aW9uIGdldENlbnRlckFuY2hvcihsaW5lOiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgbWF4QW5nbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0OiA/U2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZWRJY29uOiA/UG9zaXRpb25lZEljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgYm94U2NhbGU6IG51bWJlcik6ID9BbmNob3Ige1xuICAgIGNvbnN0IGFuZ2xlV2luZG93U2l6ZSA9IGdldEFuZ2xlV2luZG93U2l6ZShzaGFwZWRUZXh0LCBnbHlwaFNpemUsIGJveFNjYWxlKTtcbiAgICBjb25zdCBsYWJlbExlbmd0aCA9IGdldFNoYXBlZExhYmVsTGVuZ3RoKHNoYXBlZFRleHQsIHNoYXBlZEljb24pICogYm94U2NhbGU7XG5cbiAgICBsZXQgcHJldkRpc3RhbmNlID0gMDtcbiAgICBjb25zdCBjZW50ZXJEaXN0YW5jZSA9IGdldExpbmVMZW5ndGgobGluZSkgLyAyO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKykge1xuXG4gICAgICAgIGNvbnN0IGEgPSBsaW5lW2ldLFxuICAgICAgICAgICAgYiA9IGxpbmVbaSArIDFdO1xuXG4gICAgICAgIGNvbnN0IHNlZ21lbnREaXN0YW5jZSA9IGEuZGlzdChiKTtcblxuICAgICAgICBpZiAocHJldkRpc3RhbmNlICsgc2VnbWVudERpc3RhbmNlID4gY2VudGVyRGlzdGFuY2UpIHtcbiAgICAgICAgICAgIC8vIFRoZSBjZW50ZXIgaXMgb24gdGhpcyBzZWdtZW50XG4gICAgICAgICAgICBjb25zdCB0ID0gKGNlbnRlckRpc3RhbmNlIC0gcHJldkRpc3RhbmNlKSAvIHNlZ21lbnREaXN0YW5jZSxcbiAgICAgICAgICAgICAgICB4ID0gaW50ZXJwb2xhdGUoYS54LCBiLngsIHQpLFxuICAgICAgICAgICAgICAgIHkgPSBpbnRlcnBvbGF0ZShhLnksIGIueSwgdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBBbmNob3IoeCwgeSwgMCwgYi5hbmdsZVRvKGEpLCBpKTtcbiAgICAgICAgICAgIGlmICghYW5nbGVXaW5kb3dTaXplIHx8IGNoZWNrTWF4QW5nbGUobGluZSwgYW5jaG9yLCBsYWJlbExlbmd0aCwgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYW5jaG9yO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2RGlzdGFuY2UgKz0gc2VnbWVudERpc3RhbmNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0QW5jaG9ycyhsaW5lOiBBcnJheTxQb2ludD4sXG4gICAgICAgICAgICAgICAgICAgIHNwYWNpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgbWF4QW5nbGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dDogP1NoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb246ID9Qb3NpdGlvbmVkSWNvbixcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhTaXplOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIGJveFNjYWxlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJzY2FsaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHRpbGVFeHRlbnQ6IG51bWJlcik6IEFycmF5PEFuY2hvcj4ge1xuXG4gICAgLy8gUmVzYW1wbGUgYSBsaW5lIHRvIGdldCBhbmNob3IgcG9pbnRzIGZvciBsYWJlbHMgYW5kIGNoZWNrIHRoYXQgZWFjaFxuICAgIC8vIHBvdGVudGlhbCBsYWJlbCBwYXNzZXMgdGV4dC1tYXgtYW5nbGUgY2hlY2sgYW5kIGhhcyBlbm91Z2ggZnJvb20gdG8gZml0XG4gICAgLy8gb24gdGhlIGxpbmUuXG5cbiAgICBjb25zdCBhbmdsZVdpbmRvd1NpemUgPSBnZXRBbmdsZVdpbmRvd1NpemUoc2hhcGVkVGV4dCwgZ2x5cGhTaXplLCBib3hTY2FsZSk7XG4gICAgY29uc3Qgc2hhcGVkTGFiZWxMZW5ndGggPSBnZXRTaGFwZWRMYWJlbExlbmd0aChzaGFwZWRUZXh0LCBzaGFwZWRJY29uKTtcbiAgICBjb25zdCBsYWJlbExlbmd0aCA9IHNoYXBlZExhYmVsTGVuZ3RoICogYm94U2NhbGU7XG5cbiAgICAvLyBJcyB0aGUgbGluZSBjb250aW51ZWQgZnJvbSBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kYXJ5P1xuICAgIGNvbnN0IGlzTGluZUNvbnRpbnVlZCA9IGxpbmVbMF0ueCA9PT0gMCB8fCBsaW5lWzBdLnggPT09IHRpbGVFeHRlbnQgfHwgbGluZVswXS55ID09PSAwIHx8IGxpbmVbMF0ueSA9PT0gdGlsZUV4dGVudDtcblxuICAgIC8vIElzIHRoZSBsYWJlbCBsb25nLCByZWxhdGl2ZSB0byB0aGUgc3BhY2luZz9cbiAgICAvLyBJZiBzbywgYWRqdXN0IHRoZSBzcGFjaW5nIHNvIHRoZXJlIGlzIGFsd2F5cyBhIG1pbmltdW0gc3BhY2Ugb2YgYHNwYWNpbmcgLyA0YCBiZXR3ZWVuIGxhYmVsIGVkZ2VzLlxuICAgIGlmIChzcGFjaW5nIC0gbGFiZWxMZW5ndGggPCBzcGFjaW5nIC8gNCkge1xuICAgICAgICBzcGFjaW5nID0gbGFiZWxMZW5ndGggKyBzcGFjaW5nIC8gNDtcbiAgICB9XG5cbiAgICAvLyBPZmZzZXQgdGhlIGZpcnN0IGFuY2hvciBieTpcbiAgICAvLyBFaXRoZXIgaGFsZiB0aGUgbGFiZWwgbGVuZ3RoIHBsdXMgYSBmaXhlZCBleHRyYSBvZmZzZXQgaWYgdGhlIGxpbmUgaXMgbm90IGNvbnRpbnVlZFxuICAgIC8vIE9yIGhhbGYgdGhlIHNwYWNpbmcgaWYgdGhlIGxpbmUgaXMgY29udGludWVkLlxuXG4gICAgLy8gRm9yIG5vbi1jb250aW51ZWQgbGluZXMsIGFkZCBhIGJpdCBvZiBmaXhlZCBleHRyYSBvZmZzZXQgdG8gYXZvaWQgY29sbGlzaW9ucyBhdCBUIGludGVyc2VjdGlvbnMuXG4gICAgY29uc3QgZml4ZWRFeHRyYU9mZnNldCA9IGdseXBoU2l6ZSAqIDI7XG5cbiAgICBjb25zdCBvZmZzZXQgPSAhaXNMaW5lQ29udGludWVkID9cbiAgICAgICAgKChzaGFwZWRMYWJlbExlbmd0aCAvIDIgKyBmaXhlZEV4dHJhT2Zmc2V0KSAqIGJveFNjYWxlICogb3ZlcnNjYWxpbmcpICUgc3BhY2luZyA6XG4gICAgICAgIChzcGFjaW5nIC8gMiAqIG92ZXJzY2FsaW5nKSAlIHNwYWNpbmc7XG5cbiAgICByZXR1cm4gcmVzYW1wbGUobGluZSwgb2Zmc2V0LCBzcGFjaW5nLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlLCBsYWJlbExlbmd0aCwgaXNMaW5lQ29udGludWVkLCBmYWxzZSwgdGlsZUV4dGVudCk7XG59XG5cbmZ1bmN0aW9uIHJlc2FtcGxlKGxpbmUsIG9mZnNldCwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGgsIGlzTGluZUNvbnRpbnVlZCwgcGxhY2VBdE1pZGRsZSwgdGlsZUV4dGVudCkge1xuXG4gICAgY29uc3QgaGFsZkxhYmVsTGVuZ3RoID0gbGFiZWxMZW5ndGggLyAyO1xuICAgIGNvbnN0IGxpbmVMZW5ndGggPSBnZXRMaW5lTGVuZ3RoKGxpbmUpO1xuXG4gICAgbGV0IGRpc3RhbmNlID0gMCxcbiAgICAgICAgbWFya2VkRGlzdGFuY2UgPSBvZmZzZXQgLSBzcGFjaW5nO1xuXG4gICAgbGV0IGFuY2hvcnMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspIHtcblxuICAgICAgICBjb25zdCBhID0gbGluZVtpXSxcbiAgICAgICAgICAgIGIgPSBsaW5lW2kgKyAxXTtcblxuICAgICAgICBjb25zdCBzZWdtZW50RGlzdCA9IGEuZGlzdChiKSxcbiAgICAgICAgICAgIGFuZ2xlID0gYi5hbmdsZVRvKGEpO1xuXG4gICAgICAgIHdoaWxlIChtYXJrZWREaXN0YW5jZSArIHNwYWNpbmcgPCBkaXN0YW5jZSArIHNlZ21lbnREaXN0KSB7XG4gICAgICAgICAgICBtYXJrZWREaXN0YW5jZSArPSBzcGFjaW5nO1xuXG4gICAgICAgICAgICBjb25zdCB0ID0gKG1hcmtlZERpc3RhbmNlIC0gZGlzdGFuY2UpIC8gc2VnbWVudERpc3QsXG4gICAgICAgICAgICAgICAgeCA9IGludGVycG9sYXRlKGEueCwgYi54LCB0KSxcbiAgICAgICAgICAgICAgICB5ID0gaW50ZXJwb2xhdGUoYS55LCBiLnksIHQpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBwb2ludCBpcyB3aXRoaW4gdGhlIHRpbGUgYm91bmRhcmllcyBhbmQgdGhhdFxuICAgICAgICAgICAgLy8gdGhlIGxhYmVsIHdvdWxkIGZpdCBiZWZvcmUgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBsaW5lXG4gICAgICAgICAgICAvLyBpZiBwbGFjZWQgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgIGlmICh4ID49IDAgJiYgeCA8IHRpbGVFeHRlbnQgJiYgeSA+PSAwICYmIHkgPCB0aWxlRXh0ZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIG1hcmtlZERpc3RhbmNlIC0gaGFsZkxhYmVsTGVuZ3RoID49IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgbWFya2VkRGlzdGFuY2UgKyBoYWxmTGFiZWxMZW5ndGggPD0gbGluZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBBbmNob3IoeCwgeSwgMCwgYW5nbGUsIGkpO1xuICAgICAgICAgICAgICAgIGFuY2hvci5fcm91bmQoKTtcblxuICAgICAgICAgICAgICAgIGlmICghYW5nbGVXaW5kb3dTaXplIHx8IGNoZWNrTWF4QW5nbGUobGluZSwgYW5jaG9yLCBsYWJlbExlbmd0aCwgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9ycy5wdXNoKGFuY2hvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGlzdGFuY2UgKz0gc2VnbWVudERpc3Q7XG4gICAgfVxuXG4gICAgaWYgKCFwbGFjZUF0TWlkZGxlICYmICFhbmNob3JzLmxlbmd0aCAmJiAhaXNMaW5lQ29udGludWVkKSB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBhdHRlbXB0IGF0IGZpbmRpbmcgYW5jaG9ycyBhdCB3aGljaCBsYWJlbHMgY2FuIGJlIHBsYWNlZCBmYWlsZWQuXG4gICAgICAgIC8vIFRyeSBhZ2FpbiwgYnV0IHRoaXMgdGltZSBqdXN0IHRyeSBwbGFjaW5nIG9uZSBhbmNob3IgYXQgdGhlIG1pZGRsZSBvZiB0aGUgbGluZS5cbiAgICAgICAgLy8gVGhpcyBoYXMgdGhlIG1vc3QgZWZmZWN0IGZvciBzaG9ydCBsaW5lcyBpbiBvdmVyc2NhbGVkIHRpbGVzLCBzaW5jZSB0aGVcbiAgICAgICAgLy8gaW5pdGlhbCBvZmZzZXQgdXNlZCBpbiBvdmVyc2NhbGVkIHRpbGVzIGlzIGNhbGN1bGF0ZWQgdG8gYWxpZ24gbGFiZWxzIHdpdGggcG9zaXRpb25zIGluXG4gICAgICAgIC8vIHBhcmVudCB0aWxlcyBpbnN0ZWFkIG9mIHBsYWNpbmcgdGhlIGxhYmVsIGFzIGNsb3NlIHRvIHRoZSBiZWdpbm5pbmcgYXMgcG9zc2libGUuXG4gICAgICAgIGFuY2hvcnMgPSByZXNhbXBsZShsaW5lLCBkaXN0YW5jZSAvIDIsIHNwYWNpbmcsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUsIGxhYmVsTGVuZ3RoLCBpc0xpbmVDb250aW51ZWQsIHRydWUsIHRpbGVFeHRlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNob3JzO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGlwTGluZTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXJ0IG9mIGEgbXVsdGlsaW5lIHRoYXQgaW50ZXJzZWN0cyB3aXRoIHRoZSBwcm92aWRlZCByZWN0YW5ndWxhciBib3guXG4gKlxuICogQHBhcmFtIGxpbmVzXG4gKiBAcGFyYW0geDEgdGhlIGxlZnQgZWRnZSBvZiB0aGUgYm94XG4gKiBAcGFyYW0geTEgdGhlIHRvcCBlZGdlIG9mIHRoZSBib3hcbiAqIEBwYXJhbSB4MiB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgYm94XG4gKiBAcGFyYW0geTIgdGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBib3hcbiAqIEByZXR1cm5zIGxpbmVzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjbGlwTGluZShsaW5lczogQXJyYXk8QXJyYXk8UG9pbnQ+PiwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcik6IEFycmF5PEFycmF5PFBvaW50Pj4ge1xuICAgIGNvbnN0IGNsaXBwZWRMaW5lcyA9IFtdO1xuXG4gICAgZm9yIChsZXQgbCA9IDA7IGwgPCBsaW5lcy5sZW5ndGg7IGwrKykge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbbF07XG4gICAgICAgIGxldCBjbGlwcGVkTGluZTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcDAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgbGV0IHAxID0gbGluZVtpICsgMV07XG5cbiAgICAgICAgICAgIGlmIChwMC54IDwgeDEgJiYgcDEueCA8IHgxKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnggPCB4MSkge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHgxLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDEgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueCA8IHgxKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQoeDEsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MSAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocDAueSA8IHkxICYmIHAxLnkgPCB5MSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC55IDwgeTEpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTEgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnkgPCB5MSkge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHAwLnggKyAocDEueCAtIHAwLngpICogKCh5MSAtIHAwLnkpIC8gKHAxLnkgLSBwMC55KSksIHkxKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAwLnggPj0geDIgJiYgcDEueCA+PSB4Mikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC54ID49IHgyKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQoeDIsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MiAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS54ID49IHgyKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQoeDIsIHAwLnkgKyAocDEueSAtIHAwLnkpICogKCh4MiAtIHAwLngpIC8gKHAxLnggLSBwMC54KSkpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocDAueSA+PSB5MiAmJiBwMS55ID49IHkyKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAwLnkgPj0geTIpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTIgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MikuX3JvdW5kKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnkgPj0geTIpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTIgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MikuX3JvdW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghY2xpcHBlZExpbmUgfHwgIXAwLmVxdWFscyhjbGlwcGVkTGluZVtjbGlwcGVkTGluZS5sZW5ndGggLSAxXSkpIHtcbiAgICAgICAgICAgICAgICBjbGlwcGVkTGluZSA9IFtwMF07XG4gICAgICAgICAgICAgICAgY2xpcHBlZExpbmVzLnB1c2goY2xpcHBlZExpbmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbGlwcGVkTGluZS5wdXNoKHAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbGlwcGVkTGluZXM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2dldEFycmF5QnVmZmVyLCBSZXNvdXJjZVR5cGV9IGZyb20gJy4uL3V0aWwvYWpheC5qcyc7XG5cbmltcG9ydCBwYXJzZUdseXBoUEJGIGZyb20gJy4vcGFyc2VfZ2x5cGhfcGJmLmpzJztcblxuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4vc3R5bGVfZ2x5cGguanMnO1xuaW1wb3J0IHR5cGUge1JlcXVlc3RNYW5hZ2VyfSBmcm9tICcuLi91dGlsL21hcGJveC5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGZvbnRzdGFjazogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybFRlbXBsYXRlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWFuYWdlcjogUmVxdWVzdE1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogQ2FsbGJhY2s8e2dseXBoczoge1tudW1iZXJdOiBTdHlsZUdseXBoIHwgbnVsbH0sIGFzY2VuZGVyPzogbnVtYmVyLCBkZXNjZW5kZXI/OiBudW1iZXJ9Pikge1xuICAgIGNvbnN0IGJlZ2luID0gcmFuZ2UgKiAyNTY7XG4gICAgY29uc3QgZW5kID0gYmVnaW4gKyAyNTU7XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdChcbiAgICAgICAgcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplR2x5cGhzVVJMKHVybFRlbXBsYXRlKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3tmb250c3RhY2t9JywgZm9udHN0YWNrKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3tyYW5nZX0nLCBgJHtiZWdpbn0tJHtlbmR9YCksXG4gICAgICAgIFJlc291cmNlVHlwZS5HbHlwaHMpO1xuXG4gICAgZ2V0QXJyYXlCdWZmZXIocmVxdWVzdCwgKGVycjogP0Vycm9yLCBkYXRhOiA/QXJyYXlCdWZmZXIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBnbHlwaHMgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IGdseXBoRGF0YSA9IHBhcnNlR2x5cGhQQkYoZGF0YSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdseXBoIG9mIGdseXBoRGF0YS5nbHlwaHMpIHtcbiAgICAgICAgICAgICAgICBnbHlwaHNbZ2x5cGguaWRdID0gZ2x5cGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB7Z2x5cGhzLCBhc2NlbmRlcjogZ2x5cGhEYXRhLmFzY2VuZGVyLCBkZXNjZW5kZXI6IGdseXBoRGF0YS5kZXNjZW5kZXJ9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwiY29uc3QgSU5GID0gMWUyMDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlueVNERiB7XG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBmb250U2l6ZSA9IDI0LFxuICAgICAgICBidWZmZXIgPSAzLFxuICAgICAgICByYWRpdXMgPSA4LFxuICAgICAgICBjdXRvZmYgPSAwLjI1LFxuICAgICAgICBmb250RmFtaWx5ID0gJ3NhbnMtc2VyaWYnLFxuICAgICAgICBmb250V2VpZ2h0ID0gJ25vcm1hbCcsXG4gICAgICAgIGZvbnRTdHlsZSA9ICdub3JtYWwnXG4gICAgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICB0aGlzLmN1dG9mZiA9IGN1dG9mZjtcbiAgICAgICAgdGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cbiAgICAgICAgLy8gbWFrZSB0aGUgY2FudmFzIHNpemUgYmlnIGVub3VnaCB0byBib3RoIGhhdmUgdGhlIHNwZWNpZmllZCBidWZmZXIgYXJvdW5kIHRoZSBnbHlwaFxuICAgICAgICAvLyBmb3IgXCJoYWxvXCIsIGFuZCBhY2NvdW50IGZvciBzb21lIGdseXBocyBwb3NzaWJseSBiZWluZyBsYXJnZXIgdGhhbiB0aGVpciBmb250IHNpemVcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZSA9IGZvbnRTaXplICsgYnVmZmVyICogNDtcblxuICAgICAgICBjb25zdCBjYW52YXMgPSB0aGlzLl9jcmVhdGVDYW52YXMoc2l6ZSk7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywge3dpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZX0pO1xuICAgICAgICBjdHguZm9udCA9IGAke2ZvbnRTdHlsZX0gJHtmb250V2VpZ2h0fSAke2ZvbnRTaXplfXB4ICR7Zm9udEZhbWlseX1gO1xuXG4gICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnYWxwaGFiZXRpYyc7XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnbGVmdCc7IC8vIE5lY2Vzc2FyeSBzbyB0aGF0IFJUTCB0ZXh0IGRvZXNuJ3QgaGF2ZSBkaWZmZXJlbnQgYWxpZ25tZW50XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSAnYmxhY2snO1xuXG4gICAgICAgIC8vIHRlbXBvcmFyeSBhcnJheXMgZm9yIHRoZSBkaXN0YW5jZSB0cmFuc2Zvcm1cbiAgICAgICAgdGhpcy5ncmlkT3V0ZXIgPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUgKiBzaXplKTtcbiAgICAgICAgdGhpcy5ncmlkSW5uZXIgPSBuZXcgRmxvYXQ2NEFycmF5KHNpemUgKiBzaXplKTtcbiAgICAgICAgdGhpcy5mID0gbmV3IEZsb2F0NjRBcnJheShzaXplKTtcbiAgICAgICAgdGhpcy56ID0gbmV3IEZsb2F0NjRBcnJheShzaXplICsgMSk7XG4gICAgICAgIHRoaXMudiA9IG5ldyBVaW50MTZBcnJheShzaXplKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2FudmFzKHNpemUpIHtcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIGNhbnZhcy53aWR0aCA9IGNhbnZhcy5oZWlnaHQgPSBzaXplO1xuICAgICAgICByZXR1cm4gY2FudmFzO1xuICAgIH1cblxuICAgIGRyYXcoY2hhcikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB3aWR0aDogZ2x5cGhBZHZhbmNlLFxuICAgICAgICAgICAgYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQsXG4gICAgICAgICAgICBhY3R1YWxCb3VuZGluZ0JveERlc2NlbnQsXG4gICAgICAgICAgICBhY3R1YWxCb3VuZGluZ0JveExlZnQsXG4gICAgICAgICAgICBhY3R1YWxCb3VuZGluZ0JveFJpZ2h0XG4gICAgICAgIH0gPSB0aGlzLmN0eC5tZWFzdXJlVGV4dChjaGFyKTtcblxuICAgICAgICAvLyBUaGUgaW50ZWdlci9waXhlbCBwYXJ0IG9mIHRoZSB0b3AgYWxpZ25tZW50IGlzIGVuY29kZWQgaW4gbWV0cmljcy5nbHlwaFRvcFxuICAgICAgICAvLyBUaGUgcmVtYWluZGVyIGlzIGltcGxpY2l0bHkgZW5jb2RlZCBpbiB0aGUgcmFzdGVyaXphdGlvblxuICAgICAgICBjb25zdCBnbHlwaFRvcCA9IE1hdGguY2VpbChhY3R1YWxCb3VuZGluZ0JveEFzY2VudCk7XG4gICAgICAgIGNvbnN0IGdseXBoTGVmdCA9IDA7XG5cbiAgICAgICAgLy8gSWYgdGhlIGdseXBoIG92ZXJmbG93cyB0aGUgY2FudmFzIHNpemUsIGl0IHdpbGwgYmUgY2xpcHBlZCBhdCB0aGUgYm90dG9tL3JpZ2h0XG4gICAgICAgIGNvbnN0IGdseXBoV2lkdGggPSBNYXRoLm1pbih0aGlzLnNpemUgLSB0aGlzLmJ1ZmZlciwgTWF0aC5jZWlsKGFjdHVhbEJvdW5kaW5nQm94UmlnaHQgLSBhY3R1YWxCb3VuZGluZ0JveExlZnQpKTtcbiAgICAgICAgY29uc3QgZ2x5cGhIZWlnaHQgPSBNYXRoLm1pbih0aGlzLnNpemUgLSB0aGlzLmJ1ZmZlciwgZ2x5cGhUb3AgKyBNYXRoLmNlaWwoYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50KSk7XG5cbiAgICAgICAgY29uc3Qgd2lkdGggPSBnbHlwaFdpZHRoICsgMiAqIHRoaXMuYnVmZmVyO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBnbHlwaEhlaWdodCArIDIgKiB0aGlzLmJ1ZmZlcjtcblxuICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1heCh3aWR0aCAqIGhlaWdodCwgMCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobGVuKTtcbiAgICAgICAgY29uc3QgZ2x5cGggPSB7ZGF0YSwgd2lkdGgsIGhlaWdodCwgZ2x5cGhXaWR0aCwgZ2x5cGhIZWlnaHQsIGdseXBoVG9wLCBnbHlwaExlZnQsIGdseXBoQWR2YW5jZX07XG4gICAgICAgIGlmIChnbHlwaFdpZHRoID09PSAwIHx8IGdseXBoSGVpZ2h0ID09PSAwKSByZXR1cm4gZ2x5cGg7XG5cbiAgICAgICAgY29uc3Qge2N0eCwgYnVmZmVyLCBncmlkSW5uZXIsIGdyaWRPdXRlcn0gPSB0aGlzO1xuICAgICAgICBjdHguY2xlYXJSZWN0KGJ1ZmZlciwgYnVmZmVyLCBnbHlwaFdpZHRoLCBnbHlwaEhlaWdodCk7XG4gICAgICAgIGN0eC5maWxsVGV4dChjaGFyLCBidWZmZXIsIGJ1ZmZlciArIGdseXBoVG9wKTtcbiAgICAgICAgY29uc3QgaW1nRGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoYnVmZmVyLCBidWZmZXIsIGdseXBoV2lkdGgsIGdseXBoSGVpZ2h0KTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIGdyaWRzIG91dHNpZGUgdGhlIGdseXBoIHJhbmdlIHRvIGFscGhhIDBcbiAgICAgICAgZ3JpZE91dGVyLmZpbGwoSU5GLCAwLCBsZW4pO1xuICAgICAgICBncmlkSW5uZXIuZmlsbCgwLCAwLCBsZW4pO1xuXG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgZ2x5cGhIZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBnbHlwaFdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhID0gaW1nRGF0YS5kYXRhWzQgKiAoeSAqIGdseXBoV2lkdGggKyB4KSArIDNdIC8gMjU1OyAvLyBhbHBoYSB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChhID09PSAwKSBjb250aW51ZTsgLy8gZW1wdHkgcGl4ZWxzXG5cbiAgICAgICAgICAgICAgICBjb25zdCBqID0gKHkgKyBidWZmZXIpICogd2lkdGggKyB4ICsgYnVmZmVyO1xuXG4gICAgICAgICAgICAgICAgaWYgKGEgPT09IDEpIHsgLy8gZnVsbHkgZHJhd24gcGl4ZWxzXG4gICAgICAgICAgICAgICAgICAgIGdyaWRPdXRlcltqXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGdyaWRJbm5lcltqXSA9IElORjtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFsaWFzZWQgcGl4ZWxzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSAwLjUgLSBhO1xuICAgICAgICAgICAgICAgICAgICBncmlkT3V0ZXJbal0gPSBkID4gMCA/IGQgKiBkIDogMDtcbiAgICAgICAgICAgICAgICAgICAgZ3JpZElubmVyW2pdID0gZCA8IDAgPyBkICogZCA6IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWR0KGdyaWRPdXRlciwgMCwgMCwgd2lkdGgsIGhlaWdodCwgd2lkdGgsIHRoaXMuZiwgdGhpcy52LCB0aGlzLnopO1xuICAgICAgICBlZHQoZ3JpZElubmVyLCBidWZmZXIsIGJ1ZmZlciwgZ2x5cGhXaWR0aCwgZ2x5cGhIZWlnaHQsIHdpZHRoLCB0aGlzLmYsIHRoaXMudiwgdGhpcy56KTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkID0gTWF0aC5zcXJ0KGdyaWRPdXRlcltpXSkgLSBNYXRoLnNxcnQoZ3JpZElubmVyW2ldKTtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBNYXRoLnJvdW5kKDI1NSAtIDI1NSAqIChkIC8gdGhpcy5yYWRpdXMgKyB0aGlzLmN1dG9mZikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdseXBoO1xuICAgIH1cbn1cblxuLy8gMkQgRXVjbGlkZWFuIHNxdWFyZWQgZGlzdGFuY2UgdHJhbnNmb3JtIGJ5IEZlbHplbnN6d2FsYiAmIEh1dHRlbmxvY2hlciBodHRwczovL2NzLmJyb3duLmVkdS9+cGZmL3BhcGVycy9kdC1maW5hbC5wZGZcbmZ1bmN0aW9uIGVkdChkYXRhLCB4MCwgeTAsIHdpZHRoLCBoZWlnaHQsIGdyaWRTaXplLCBmLCB2LCB6KSB7XG4gICAgZm9yIChsZXQgeCA9IHgwOyB4IDwgeDAgKyB3aWR0aDsgeCsrKSBlZHQxZChkYXRhLCB5MCAqIGdyaWRTaXplICsgeCwgZ3JpZFNpemUsIGhlaWdodCwgZiwgdiwgeik7XG4gICAgZm9yIChsZXQgeSA9IHkwOyB5IDwgeTAgKyBoZWlnaHQ7IHkrKykgZWR0MWQoZGF0YSwgeSAqIGdyaWRTaXplICsgeDAsIDEsIHdpZHRoLCBmLCB2LCB6KTtcbn1cblxuLy8gMUQgc3F1YXJlZCBkaXN0YW5jZSB0cmFuc2Zvcm1cbmZ1bmN0aW9uIGVkdDFkKGdyaWQsIG9mZnNldCwgc3RyaWRlLCBsZW5ndGgsIGYsIHYsIHopIHtcbiAgICB2WzBdID0gMDtcbiAgICB6WzBdID0gLUlORjtcbiAgICB6WzFdID0gSU5GO1xuICAgIGZbMF0gPSBncmlkW29mZnNldF07XG5cbiAgICBmb3IgKGxldCBxID0gMSwgayA9IDAsIHMgPSAwOyBxIDwgbGVuZ3RoOyBxKyspIHtcbiAgICAgICAgZltxXSA9IGdyaWRbb2Zmc2V0ICsgcSAqIHN0cmlkZV07XG4gICAgICAgIGNvbnN0IHEyID0gcSAqIHE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSB2W2tdO1xuICAgICAgICAgICAgcyA9IChmW3FdIC0gZltyXSArIHEyIC0gciAqIHIpIC8gKHEgLSByKSAvIDI7XG4gICAgICAgIH0gd2hpbGUgKHMgPD0geltrXSAmJiAtLWsgPiAtMSk7XG5cbiAgICAgICAgaysrO1xuICAgICAgICB2W2tdID0gcTtcbiAgICAgICAgeltrXSA9IHM7XG4gICAgICAgIHpbayArIDFdID0gSU5GO1xuICAgIH1cblxuICAgIGZvciAobGV0IHEgPSAwLCBrID0gMDsgcSA8IGxlbmd0aDsgcSsrKSB7XG4gICAgICAgIHdoaWxlICh6W2sgKyAxXSA8IHEpIGsrKztcbiAgICAgICAgY29uc3QgciA9IHZba107XG4gICAgICAgIGNvbnN0IHFyID0gcSAtIHI7XG4gICAgICAgIGdyaWRbb2Zmc2V0ICsgcSAqIHN0cmlkZV0gPSBmW3JdICsgcXIgKiBxcjtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgbG9hZEdseXBoUmFuZ2UgZnJvbSAnLi4vc3R5bGUvbG9hZF9nbHlwaF9yYW5nZS5qcyc7XG5cbmltcG9ydCBUaW55U0RGIGZyb20gJ0BtYXBib3gvdGlueS1zZGYnO1xuaW1wb3J0IGlzQ2hhciBmcm9tICcuLi91dGlsL2lzX2NoYXJfaW5fdW5pY29kZV9ibG9jay5qcyc7XG5pbXBvcnQge2FzeW5jQWxsfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtBbHBoYUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlLmpzJztcblxuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2dseXBoLmpzJztcbmltcG9ydCB0eXBlIHtSZXF1ZXN0TWFuYWdlcn0gZnJvbSAnLi4vdXRpbC9tYXBib3guanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5cbi8qXG4gIFNERl9TQ0FMRSBjb250cm9scyB0aGUgcGl4ZWwgZGVuc2l0eSBvZiBsb2NhbGx5IGdlbmVyYXRlZCBnbHlwaHMgcmVsYXRpdmVcbiAgdG8gXCJub3JtYWxcIiBTREZzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYXQgMjRwdCBmb250IGFuZCBhIFwicGl4ZWwgcmF0aW9cIiBvZiAxLlxuICBUaGUgR2x5cGhNYW5hZ2VyIHdpbGwgZ2VuZXJhdGUgZ2x5cGhzIFNERl9TQ0FMRSB0aW1lcyBhcyBsYXJnZSxcbiAgYnV0IHdpdGggdGhlIHNhbWUgZ2x5cGggbWV0cmljcywgYW5kIHRoZSBxdWFkIGdlbmVyYXRpb24gY29kZSB3aWxsIHNjYWxlIHRoZW1cbiAgYmFjayBkb3duIHNvIHRoZXkgZGlzcGxheSBhdCB0aGUgc2FtZSBzaXplLlxuXG4gIFRoZSBjaG9pY2Ugb2YgU0RGX1NDQUxFIGlzIGEgdHJhZGUtb2ZmIGJldHdlZW4gcGVyZm9ybWFuY2UgYW5kIHF1YWxpdHkuXG4gIEdseXBoIGdlbmVyYXRpb24gdGltZSBncm93cyBxdWFkcmF0aWNhbGx5IHdpdGggdGhlIHRoZSBzY2FsZSwgd2hpbGUgcXVhbGl0eVxuICBpbXByb3ZlbWVudHMgZHJvcCBvZmYgcmFwaWRseSB3aGVuIHRoZSBzY2FsZSBpcyBoaWdoZXIgdGhhbiB0aGUgcGl4ZWwgcmF0aW9cbiAgb2YgdGhlIGRldmljZS4gVGhlIHNjYWxlIG9mIDIgYnV5cyBub3RpY2VhYmxlIGltcHJvdmVtZW50cyBvbiBIRFBJIHNjcmVlbnNcbiAgYXQgYWNjZXB0YWJsZSBjb3N0LlxuXG4gIFRoZSBzY2FsZSBjYW4gYmUgYW55IHZhbHVlLCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgc21hbGwgZGlzdG9ydGlvbnMsIHRoZXNlXG4gIHBpeGVsLWJhc2VkIHZhbHVlcyBtdXN0IGNvbWUgb3V0IHRvIGludGVnZXJzOlxuICAgLSBcImxvY2FsR2x5cGhQYWRkaW5nXCIgaW4gR2x5cGhBdGxhc1xuICAgLSBGb250L0NhbnZhcy9CdWZmZXIgc2l6ZSBmb3IgVGlueVNERlxuICBsb2NhbEdseXBoUGFkZGluZyArIGJ1ZmZlciBzaG91bGQgZXF1YWwgNCAqIFNERl9TQ0FMRS4gU28gaWYgeW91IHdhbnRlZCB0b1xuICB1c2UgYW4gU0RGX1NDQUxFIG9mIDEuNzUsIHlvdSBjb3VsZCBtYW51YWxseSBzZXQgbG9jYWxHbHlwaEFkZGluZyB0byAyIGFuZFxuICBidWZmZXIgdG8gNS5cbiovXG5leHBvcnQgY29uc3QgU0RGX1NDQUxFID0gMjtcblxudHlwZSBFbnRyeSA9IHtcbiAgICAvLyBudWxsIG1lYW5zIHdlJ3ZlIHJlcXVlc3RlZCB0aGUgcmFuZ2UsIGJ1dCB0aGUgZ2x5cGggd2Fzbid0IGluY2x1ZGVkIGluIHRoZSByZXN1bHQuXG4gICAgZ2x5cGhzOiB7W2lkOiBudW1iZXJdOiBTdHlsZUdseXBoIHwgbnVsbH0sXG4gICAgcmVxdWVzdHM6IHtbcmFuZ2U6IG51bWJlcl06IEFycmF5PENhbGxiYWNrPHtnbHlwaHM6IHtbbnVtYmVyXTogU3R5bGVHbHlwaCB8IG51bGx9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfT4+fSxcbiAgICByYW5nZXM6IHtbcmFuZ2U6IG51bWJlcl06IGJvb2xlYW4gfCBudWxsfSxcbiAgICB0aW55U0RGPzogVGlueVNERixcbiAgICBhc2NlbmRlcj86IG51bWJlcixcbiAgICBkZXNjZW5kZXI/OiBudW1iZXJcbn07XG5cbmV4cG9ydCBjb25zdCBMb2NhbEdseXBoTW9kZSA9IHtcbiAgICBub25lOiAwLFxuICAgIGlkZW9ncmFwaHM6IDEsXG4gICAgYWxsOiAyXG59O1xuXG5jbGFzcyBHbHlwaE1hbmFnZXIge1xuICAgIHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlcjtcbiAgICBsb2NhbEZvbnRGYW1pbHk6ID9zdHJpbmc7XG4gICAgbG9jYWxHbHlwaE1vZGU6IG51bWJlcjtcbiAgICBlbnRyaWVzOiB7W186IHN0cmluZ106IEVudHJ5fTtcbiAgICAvLyBNdWx0aXBsZSBmb250c3RhY2tzIG1heSBzaGFyZSB0aGUgc2FtZSBsb2NhbCBnbHlwaHMsIHNvIGtlZXAgYW4gaW5kZXhcbiAgICAvLyBpbnRvIHRoZSBnbHlwaHMgYmFzZWQgc29sZXkgb24gZm9udCB3ZWlnaHRcbiAgICBsb2NhbEdseXBoczoge1tfOiBzdHJpbmddOiB7Z2x5cGhzOiB7W2lkOiBudW1iZXJdOiBTdHlsZUdseXBoIHwgbnVsbH0sIGFzY2VuZGVyOiA/bnVtYmVyLCBkZXNjZW5kZXI6ID9udW1iZXJ9fTtcbiAgICB1cmw6ID9zdHJpbmc7XG5cbiAgICAvLyBleHBvc2VkIGFzIHN0YXRpY3MgdG8gZW5hYmxlIHN0dWJiaW5nIGluIHVuaXQgdGVzdHNcbiAgICBzdGF0aWMgbG9hZEdseXBoUmFuZ2U6IHR5cGVvZiBsb2FkR2x5cGhSYW5nZTtcbiAgICBzdGF0aWMgVGlueVNERjogQ2xhc3M8VGlueVNERj47XG5cbiAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0TWFuYWdlcjogUmVxdWVzdE1hbmFnZXIsIGxvY2FsR2x5cGhNb2RlOiBudW1iZXIsIGxvY2FsRm9udEZhbWlseTogP3N0cmluZykge1xuICAgICAgICB0aGlzLnJlcXVlc3RNYW5hZ2VyID0gcmVxdWVzdE1hbmFnZXI7XG4gICAgICAgIHRoaXMubG9jYWxHbHlwaE1vZGUgPSBsb2NhbEdseXBoTW9kZTtcbiAgICAgICAgdGhpcy5sb2NhbEZvbnRGYW1pbHkgPSBsb2NhbEZvbnRGYW1pbHk7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IHt9O1xuICAgICAgICB0aGlzLmxvY2FsR2x5cGhzID0ge1xuICAgICAgICAgICAgLy8gT25seSB0aGVzZSBmb3VyIGZvbnQgd2VpZ2h0cyBhcmUgc3VwcG9ydGVkXG4gICAgICAgICAgICAnMjAwJzoge30sXG4gICAgICAgICAgICAnNDAwJzoge30sXG4gICAgICAgICAgICAnNTAwJzoge30sXG4gICAgICAgICAgICAnOTAwJzoge31cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXRVUkwodXJsOiA/c3RyaW5nKSB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsO1xuICAgIH1cblxuICAgIGdldEdseXBocyhnbHlwaHM6IHtbc3RhY2s6IHN0cmluZ106IEFycmF5PG51bWJlcj59LCBjYWxsYmFjazogQ2FsbGJhY2s8e1tzdGFjazogc3RyaW5nXToge2dseXBoczoge1tfOiBudW1iZXJdOiA/U3R5bGVHbHlwaH0sIGFzY2VuZGVyPzogbnVtYmVyLCBkZXNjZW5kZXI/OiBudW1iZXJ9fT4pIHtcbiAgICAgICAgY29uc3QgYWxsID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGFjayBpbiBnbHlwaHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgZ2x5cGhzW3N0YWNrXSkge1xuICAgICAgICAgICAgICAgIGFsbC5wdXNoKHtzdGFjaywgaWR9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFzeW5jQWxsKGFsbCwgKHtzdGFjaywgaWR9LCBmbkNhbGxiYWNrOiBDYWxsYmFjazx7c3RhY2s6IHN0cmluZywgaWQ6IG51bWJlciwgZ2x5cGg6ID9TdHlsZUdseXBofT4pID0+IHtcbiAgICAgICAgICAgIGxldCBlbnRyeSA9IHRoaXMuZW50cmllc1tzdGFja107XG4gICAgICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZW50cnkgPSB0aGlzLmVudHJpZXNbc3RhY2tdID0ge1xuICAgICAgICAgICAgICAgICAgICBnbHlwaHM6IHt9LFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czoge30sXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlczoge30sXG4gICAgICAgICAgICAgICAgICAgIGFzY2VuZGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NlbmRlcjogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGdseXBoID0gZW50cnkuZ2x5cGhzW2lkXTtcbiAgICAgICAgICAgIGlmIChnbHlwaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZm5DYWxsYmFjayhudWxsLCB7c3RhY2ssIGlkLCBnbHlwaH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2x5cGggPSB0aGlzLl90aW55U0RGKGVudHJ5LCBzdGFjaywgaWQpO1xuICAgICAgICAgICAgaWYgKGdseXBoKSB7XG4gICAgICAgICAgICAgICAgZW50cnkuZ2x5cGhzW2lkXSA9IGdseXBoO1xuICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2sobnVsbCwge3N0YWNrLCBpZCwgZ2x5cGh9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gTWF0aC5mbG9vcihpZCAvIDI1Nik7XG4gICAgICAgICAgICBpZiAocmFuZ2UgKiAyNTYgPiA2NTUzNSkge1xuICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2sobmV3IEVycm9yKCdnbHlwaHMgPiA2NTUzNSBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVudHJ5LnJhbmdlc1tyYW5nZV0pIHtcbiAgICAgICAgICAgICAgICBmbkNhbGxiYWNrKG51bGwsIHtzdGFjaywgaWQsIGdseXBofSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVxdWVzdHMgPSBlbnRyeS5yZXF1ZXN0c1tyYW5nZV07XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3RzKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdHMgPSBlbnRyeS5yZXF1ZXN0c1tyYW5nZV0gPSBbXTtcbiAgICAgICAgICAgICAgICBHbHlwaE1hbmFnZXIubG9hZEdseXBoUmFuZ2Uoc3RhY2ssIHJhbmdlLCAodGhpcy51cmw6IGFueSksIHRoaXMucmVxdWVzdE1hbmFnZXIsXG4gICAgICAgICAgICAgICAgICAgIChlcnIsIHJlc3BvbnNlOiA/e2dseXBoczoge1tfOiBudW1iZXJdOiBTdHlsZUdseXBoIHwgbnVsbH0sIGFzY2VuZGVyPzogbnVtYmVyLCBkZXNjZW5kZXI/OiBudW1iZXJ9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5hc2NlbmRlciA9IHJlc3BvbnNlLmFzY2VuZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRlc2NlbmRlciA9IHJlc3BvbnNlLmRlc2NlbmRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHJlc3BvbnNlLmdseXBocykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RvZXNDaGFyU3VwcG9ydExvY2FsR2x5cGgoK2lkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2x5cGhzWytpZF0gPSByZXNwb25zZS5nbHlwaHNbK2lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5yYW5nZXNbcmFuZ2VdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2Igb2YgcmVxdWVzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYihlcnIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlbnRyeS5yZXF1ZXN0c1tyYW5nZV07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXF1ZXN0cy5wdXNoKChlcnIsIHJlc3VsdDogP3tnbHlwaHM6IHtbXzogbnVtYmVyXTogU3R5bGVHbHlwaCB8IG51bGx9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZm5DYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZuQ2FsbGJhY2sobnVsbCwge3N0YWNrLCBpZCwgZ2x5cGg6IHJlc3VsdC5nbHlwaHNbaWRdIHx8IG51bGx9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgKGVyciwgZ2x5cGhzOiA/QXJyYXk8e3N0YWNrOiBzdHJpbmcsIGlkOiBudW1iZXIsIGdseXBoOiA/U3R5bGVHbHlwaH0+KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2x5cGhzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHtzdGFjaywgaWQsIGdseXBofSBvZiBnbHlwaHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIGdseXBoIHNvIHRoYXQgb3VyIG93biBjb3B5IG9mIGl0cyBBcnJheUJ1ZmZlciBkb2Vzbid0IGdldCB0cmFuc2ZlcnJlZC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdFtzdGFja10gPT09IHVuZGVmaW5lZCkgcmVzdWx0W3N0YWNrXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0W3N0YWNrXS5nbHlwaHMgPT09IHVuZGVmaW5lZCkgcmVzdWx0W3N0YWNrXS5nbHlwaHMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3N0YWNrXS5nbHlwaHNbaWRdID0gZ2x5cGggJiYge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGdseXBoLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwOiBnbHlwaC5iaXRtYXAuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3M6IGdseXBoLm1ldHJpY3NcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3N0YWNrXS5hc2NlbmRlciA9IHRoaXMuZW50cmllc1tzdGFja10uYXNjZW5kZXI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtzdGFja10uZGVzY2VuZGVyID0gdGhpcy5lbnRyaWVzW3N0YWNrXS5kZXNjZW5kZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2RvZXNDaGFyU3VwcG9ydExvY2FsR2x5cGgoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5sb2NhbEdseXBoTW9kZSA9PT0gTG9jYWxHbHlwaE1vZGUubm9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9jYWxHbHlwaE1vZGUgPT09IExvY2FsR2x5cGhNb2RlLmFsbCkge1xuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5sb2NhbEZvbnRGYW1pbHk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuZXctY2FwICovXG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLmxvY2FsRm9udEZhbWlseSAmJlxuICAgICAgICAgICAgKChpc0NoYXJbJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnXShpZCkgfHxcbiAgICAgICAgICAgICAgICBpc0NoYXJbJ0hhbmd1bCBTeWxsYWJsZXMnXShpZCkgfHxcbiAgICAgICAgICAgICAgICBpc0NoYXJbJ0hpcmFnYW5hJ10oaWQpIHx8XG4gICAgICAgICAgICAgICAgaXNDaGFyWydLYXRha2FuYSddKGlkKSkgfHxcbiAgICAgICAgICAgICAgICAvLyBnbC1uYXRpdmUgcGFyaXR5OiBFeHRlbmQgSWRlb2dyYXBocyByYXN0ZXJpemF0aW9uIHJhbmdlIHRvIGluY2x1ZGUgQ0pLIHN5bWJvbHMgYW5kIHB1bmN0dWF0aW9uc1xuICAgICAgICAgICAgICAgIGlzQ2hhclsnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJ10oaWQpKTtcbiAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbmV3LWNhcCAqL1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3RpbnlTREYoZW50cnk6IEVudHJ5LCBzdGFjazogc3RyaW5nLCBpZDogbnVtYmVyKTogP1N0eWxlR2x5cGgge1xuICAgICAgICBjb25zdCBmb250RmFtaWx5ID0gdGhpcy5sb2NhbEZvbnRGYW1pbHk7XG4gICAgICAgIGlmICghZm9udEZhbWlseSB8fCAhdGhpcy5fZG9lc0NoYXJTdXBwb3J0TG9jYWxHbHlwaChpZCkpIHJldHVybjtcblxuICAgICAgICBsZXQgdGlueVNERiA9IGVudHJ5LnRpbnlTREY7XG4gICAgICAgIGlmICghdGlueVNERikge1xuICAgICAgICAgICAgbGV0IGZvbnRXZWlnaHQgPSAnNDAwJztcbiAgICAgICAgICAgIGlmICgvYm9sZC9pLnRlc3Qoc3RhY2spKSB7XG4gICAgICAgICAgICAgICAgZm9udFdlaWdodCA9ICc5MDAnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgvbWVkaXVtL2kudGVzdChzdGFjaykpIHtcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0ID0gJzUwMCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKC9saWdodC9pLnRlc3Qoc3RhY2spKSB7XG4gICAgICAgICAgICAgICAgZm9udFdlaWdodCA9ICcyMDAnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmb250U2l6ZSA9IDI0ICogU0RGX1NDQUxFO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gMyAqIFNERl9TQ0FMRTtcbiAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IDggKiBTREZfU0NBTEU7XG4gICAgICAgICAgICB0aW55U0RGID0gZW50cnkudGlueVNERiA9IG5ldyBHbHlwaE1hbmFnZXIuVGlueVNERih7Zm9udEZhbWlseSwgZm9udFdlaWdodCwgZm9udFNpemUsIGJ1ZmZlciwgcmFkaXVzfSk7XG4gICAgICAgICAgICB0aW55U0RGLmZvbnRXZWlnaHQgPSBmb250V2VpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG9jYWxHbHlwaHNbdGlueVNERi5mb250V2VpZ2h0XVtpZF0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsR2x5cGhzW3RpbnlTREYuZm9udFdlaWdodF1baWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaWQpO1xuICAgICAgICBjb25zdCB7ZGF0YSwgd2lkdGgsIGhlaWdodCwgZ2x5cGhXaWR0aCwgZ2x5cGhIZWlnaHQsIGdseXBoTGVmdCwgZ2x5cGhUb3AsIGdseXBoQWR2YW5jZX0gPSB0aW55U0RGLmRyYXcoY2hhcik7XG4gICAgICAgIC8qXG4gICAgICAgIFRpbnlTREYncyBcInRvcFwiIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBhbHBoYWJldGljIGJhc2VsaW5lIHRvIHRoZVxuICAgICAgICAgdG9wIG9mIHRoZSBnbHlwaC5cblxuICAgICAgICBTZXJ2ZXItZ2VuZXJhdGVkIGZvbnRzIHNwZWNpZnkgXCJ0b3BcIiByZWxhdGl2ZSB0byBhbiBvcmlnaW4gYWJvdmUgdGhlXG4gICAgICAgICBlbSBib3ggKHRoZSBvcmlnaW4gY29tZXMgZnJvbSBGcmVlVHlwZSwgYnV0IEknbSB1bmNsZWFyIG9uIGV4YWN0bHlcbiAgICAgICAgIGhvdyBpdCdzIGRlcml2ZWQpXG4gICAgICAgICAgcmVmOiBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L3NkZi1nbHlwaC1mb3VuZHJ5XG5cbiAgICAgICAgU2VydmVyIGZvbnRzIGRvbid0IHlldCBpbmNsdWRlIGJhc2VsaW5lIGluZm9ybWF0aW9uLCBzbyB3ZSBjYW4ndCBsaW5lXG4gICAgICAgIHVwIGV4YWN0bHkgd2l0aCB0aGVtIChhbmQgdGhleSBkb24ndCBsaW5lIHVwIHdpdGggZWFjaCBvdGhlcilcbiAgICAgICAgICByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbm9kZS1mb250bmlrL3B1bGwvMTYwXG5cbiAgICAgICAgVG8gYXBwcm94aW1hdGVseSBhbGlnbiBUaW55U0RGIGdseXBocyB3aXRoIHNlcnZlci1wcm92aWRlZCBnbHlwaHMsIHdlXG4gICAgICAgIHVzZSB0aGlzIGJhc2VsaW5lIGFkanVzdG1lbnQgZmFjdG9yIGNhbGlicmF0ZWQgdG8gYmUgaW4gYmV0d2VlbiBESU4gUHJvXG4gICAgICAgIGFuZCBBcmlhbCBVbmljb2RlIChidXQgY2xvc2VyIHRvIEFyaWFsIFVuaWNvZGUpXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IGJhc2VsaW5lQWRqdXN0bWVudCA9IDI3O1xuXG4gICAgICAgIGNvbnN0IGdseXBoID0gdGhpcy5sb2NhbEdseXBoc1t0aW55U0RGLmZvbnRXZWlnaHRdW2lkXSA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgYml0bWFwOiBuZXcgQWxwaGFJbWFnZSh7d2lkdGgsIGhlaWdodH0sIGRhdGEpLFxuICAgICAgICAgICAgbWV0cmljczoge1xuICAgICAgICAgICAgICAgIHdpZHRoOiBnbHlwaFdpZHRoIC8gU0RGX1NDQUxFLFxuICAgICAgICAgICAgICAgIGhlaWdodDogZ2x5cGhIZWlnaHQgLyBTREZfU0NBTEUsXG4gICAgICAgICAgICAgICAgbGVmdDogZ2x5cGhMZWZ0IC8gU0RGX1NDQUxFLFxuICAgICAgICAgICAgICAgIHRvcDogZ2x5cGhUb3AgLyBTREZfU0NBTEUgLSBiYXNlbGluZUFkanVzdG1lbnQsXG4gICAgICAgICAgICAgICAgYWR2YW5jZTogZ2x5cGhBZHZhbmNlIC8gU0RGX1NDQUxFLFxuICAgICAgICAgICAgICAgIGxvY2FsR2x5cGg6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGdseXBoO1xuICAgIH1cbn1cblxuR2x5cGhNYW5hZ2VyLmxvYWRHbHlwaFJhbmdlID0gbG9hZEdseXBoUmFuZ2U7XG5HbHlwaE1hbmFnZXIuVGlueVNERiA9IFRpbnlTREY7XG5cbmV4cG9ydCBkZWZhdWx0IEdseXBoTWFuYWdlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHtHTFlQSF9QQkZfQk9SREVSfSBmcm9tICcuLi9zdHlsZS9wYXJzZV9nbHlwaF9wYmYuanMnO1xuXG5pbXBvcnQgdHlwZSBBbmNob3IgZnJvbSAnLi9hbmNob3IuanMnO1xuaW1wb3J0IHR5cGUge1Bvc2l0aW9uZWRJY29uLCBTaGFwaW5nfSBmcm9tICcuL3NoYXBpbmcuanMnO1xuaW1wb3J0IHtJTUFHRV9QQURESU5HfSBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMuanMnO1xuaW1wb3J0IHtTREZfU0NBTEV9IGZyb20gJy4uL3JlbmRlci9nbHlwaF9tYW5hZ2VyLmpzJztcbmltcG9ydCB0eXBlIFN5bWJvbFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlfSBmcm9tICcuLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge1N0eWxlSW1hZ2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2ltYWdlLmpzJztcbmltcG9ydCB7aXNWZXJ0aWNhbENsb3NlUHVuY3R1YXRpb24sIGlzVmVydGljYWxPcGVuUHVuY3R1YXRpb259IGZyb20gJy4uL3V0aWwvdmVydGljYWxpemVfcHVuY3R1YXRpb24uanMnO1xuaW1wb3J0IE9ORV9FTSBmcm9tICcuL29uZV9lbS5qcyc7XG5pbXBvcnQge3dhcm5PbmNlfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuXG4vKipcbiAqIEEgdGV4dHVyZWQgcXVhZCBmb3IgcmVuZGVyaW5nIGEgc2luZ2xlIGljb24gb3IgZ2x5cGguXG4gKlxuICogVGhlIHpvb20gcmFuZ2UgdGhlIGdseXBoIGNhbiBiZSBzaG93biBpcyBkZWZpbmVkIGJ5IG1pblNjYWxlIGFuZCBtYXhTY2FsZS5cbiAqXG4gKiBAcGFyYW0gdGwgVGhlIG9mZnNldCBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIGZyb20gdGhlIGFuY2hvci5cbiAqIEBwYXJhbSB0ciBUaGUgb2Zmc2V0IG9mIHRoZSB0b3AgcmlnaHQgY29ybmVyIGZyb20gdGhlIGFuY2hvci5cbiAqIEBwYXJhbSBibCBUaGUgb2Zmc2V0IG9mIHRoZSBib3R0b20gbGVmdCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIGJyIFRoZSBvZmZzZXQgb2YgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIHRleCBUaGUgdGV4dHVyZSBjb29yZGluYXRlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgdHlwZSBTeW1ib2xRdWFkID0ge1xuICAgIHRsOiBQb2ludCxcbiAgICB0cjogUG9pbnQsXG4gICAgYmw6IFBvaW50LFxuICAgIGJyOiBQb2ludCxcbiAgICB0ZXg6IHtcbiAgICAgICAgeDogbnVtYmVyLFxuICAgICAgICB5OiBudW1iZXIsXG4gICAgICAgIHc6IG51bWJlcixcbiAgICAgICAgaDogbnVtYmVyXG4gICAgfSxcbiAgICBwaXhlbE9mZnNldFRMOiBQb2ludCxcbiAgICBwaXhlbE9mZnNldEJSOiBQb2ludCxcbiAgICB3cml0aW5nTW9kZTogYW55IHwgdm9pZCxcbiAgICBnbHlwaE9mZnNldDogW251bWJlciwgbnVtYmVyXSxcbiAgICBzZWN0aW9uSW5kZXg6IG51bWJlcixcbiAgICBpc1NERjogYm9vbGVhbixcbiAgICBtaW5Gb250U2NhbGVYOiBudW1iZXIsXG4gICAgbWluRm9udFNjYWxlWTogbnVtYmVyXG59O1xuXG4vLyBJZiB5b3UgaGF2ZSBhIDEwcHggaWNvbiB0aGF0IGlzbid0IHBlcmZlY3RseSBhbGlnbmVkIHRvIHRoZSBwaXhlbCBncmlkIGl0IHdpbGwgY292ZXIgMTEgYWN0dWFsXG4vLyBwaXhlbHMuIFRoZSBxdWFkIG5lZWRzIHRvIGJlIHBhZGRlZCB0byBhY2NvdW50IGZvciB0aGlzLCBvdGhlcndpc2UgdGhleSdsbCBsb29rIHNsaWdodGx5IGNsaXBwZWRcbi8vIG9uIG9uZSBlZGdlIGluIHNvbWUgY2FzZXMuXG5jb25zdCBib3JkZXIgPSBJTUFHRV9QQURESU5HO1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgcXVhZHMgdXNlZCBmb3IgcmVuZGVyaW5nIGFuIGljb24uXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SWNvblF1YWRzKFxuICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb246IFBvc2l0aW9uZWRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgIGljb25Sb3RhdGU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICBpc1NERkljb246IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgaGFzSWNvblRleHRGaXQ6IGJvb2xlYW4pOiBBcnJheTxTeW1ib2xRdWFkPiB7XG4gICAgY29uc3QgcXVhZHMgPSBbXTtcblxuICAgIGNvbnN0IGltYWdlID0gc2hhcGVkSWNvbi5pbWFnZTtcbiAgICBjb25zdCBwaXhlbFJhdGlvID0gaW1hZ2UucGl4ZWxSYXRpbztcbiAgICBjb25zdCBpbWFnZVdpZHRoID0gaW1hZ2UucGFkZGVkUmVjdC53IC0gMiAqIGJvcmRlcjtcbiAgICBjb25zdCBpbWFnZUhlaWdodCA9IGltYWdlLnBhZGRlZFJlY3QuaCAtIDIgKiBib3JkZXI7XG5cbiAgICBjb25zdCBpY29uV2lkdGggPSBzaGFwZWRJY29uLnJpZ2h0IC0gc2hhcGVkSWNvbi5sZWZ0O1xuICAgIGNvbnN0IGljb25IZWlnaHQgPSBzaGFwZWRJY29uLmJvdHRvbSAtIHNoYXBlZEljb24udG9wO1xuXG4gICAgY29uc3Qgc3RyZXRjaFggPSBpbWFnZS5zdHJldGNoWCB8fCBbWzAsIGltYWdlV2lkdGhdXTtcbiAgICBjb25zdCBzdHJldGNoWSA9IGltYWdlLnN0cmV0Y2hZIHx8IFtbMCwgaW1hZ2VIZWlnaHRdXTtcblxuICAgIGNvbnN0IHJlZHVjZVJhbmdlcyA9IChzdW0sIHJhbmdlKSA9PiBzdW0gKyByYW5nZVsxXSAtIHJhbmdlWzBdO1xuICAgIGNvbnN0IHN0cmV0Y2hXaWR0aCA9IHN0cmV0Y2hYLnJlZHVjZShyZWR1Y2VSYW5nZXMsIDApO1xuICAgIGNvbnN0IHN0cmV0Y2hIZWlnaHQgPSBzdHJldGNoWS5yZWR1Y2UocmVkdWNlUmFuZ2VzLCAwKTtcbiAgICBjb25zdCBmaXhlZFdpZHRoID0gaW1hZ2VXaWR0aCAtIHN0cmV0Y2hXaWR0aDtcbiAgICBjb25zdCBmaXhlZEhlaWdodCA9IGltYWdlSGVpZ2h0IC0gc3RyZXRjaEhlaWdodDtcblxuICAgIGxldCBzdHJldGNoT2Zmc2V0WCA9IDA7XG4gICAgbGV0IHN0cmV0Y2hDb250ZW50V2lkdGggPSBzdHJldGNoV2lkdGg7XG4gICAgbGV0IHN0cmV0Y2hPZmZzZXRZID0gMDtcbiAgICBsZXQgc3RyZXRjaENvbnRlbnRIZWlnaHQgPSBzdHJldGNoSGVpZ2h0O1xuICAgIGxldCBmaXhlZE9mZnNldFggPSAwO1xuICAgIGxldCBmaXhlZENvbnRlbnRXaWR0aCA9IGZpeGVkV2lkdGg7XG4gICAgbGV0IGZpeGVkT2Zmc2V0WSA9IDA7XG4gICAgbGV0IGZpeGVkQ29udGVudEhlaWdodCA9IGZpeGVkSGVpZ2h0O1xuXG4gICAgaWYgKGltYWdlLmNvbnRlbnQgJiYgaGFzSWNvblRleHRGaXQpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGltYWdlLmNvbnRlbnQ7XG4gICAgICAgIHN0cmV0Y2hPZmZzZXRYID0gc3VtV2l0aGluUmFuZ2Uoc3RyZXRjaFgsIDAsIGNvbnRlbnRbMF0pO1xuICAgICAgICBzdHJldGNoT2Zmc2V0WSA9IHN1bVdpdGhpblJhbmdlKHN0cmV0Y2hZLCAwLCBjb250ZW50WzFdKTtcbiAgICAgICAgc3RyZXRjaENvbnRlbnRXaWR0aCA9IHN1bVdpdGhpblJhbmdlKHN0cmV0Y2hYLCBjb250ZW50WzBdLCBjb250ZW50WzJdKTtcbiAgICAgICAgc3RyZXRjaENvbnRlbnRIZWlnaHQgPSBzdW1XaXRoaW5SYW5nZShzdHJldGNoWSwgY29udGVudFsxXSwgY29udGVudFszXSk7XG4gICAgICAgIGZpeGVkT2Zmc2V0WCA9IGNvbnRlbnRbMF0gLSBzdHJldGNoT2Zmc2V0WDtcbiAgICAgICAgZml4ZWRPZmZzZXRZID0gY29udGVudFsxXSAtIHN0cmV0Y2hPZmZzZXRZO1xuICAgICAgICBmaXhlZENvbnRlbnRXaWR0aCA9IGNvbnRlbnRbMl0gLSBjb250ZW50WzBdIC0gc3RyZXRjaENvbnRlbnRXaWR0aDtcbiAgICAgICAgZml4ZWRDb250ZW50SGVpZ2h0ID0gY29udGVudFszXSAtIGNvbnRlbnRbMV0gLSBzdHJldGNoQ29udGVudEhlaWdodDtcbiAgICB9XG5cbiAgICBjb25zdCBtYWtlQm94ID0gKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxlZnRFbSA9IGdldEVtT2Zmc2V0KGxlZnQuc3RyZXRjaCAtIHN0cmV0Y2hPZmZzZXRYLCBzdHJldGNoQ29udGVudFdpZHRoLCBpY29uV2lkdGgsIHNoYXBlZEljb24ubGVmdCk7XG4gICAgICAgIGNvbnN0IGxlZnRQeCA9IGdldFB4T2Zmc2V0KGxlZnQuZml4ZWQgLSBmaXhlZE9mZnNldFgsIGZpeGVkQ29udGVudFdpZHRoLCBsZWZ0LnN0cmV0Y2gsIHN0cmV0Y2hXaWR0aCk7XG5cbiAgICAgICAgY29uc3QgdG9wRW0gPSBnZXRFbU9mZnNldCh0b3Auc3RyZXRjaCAtIHN0cmV0Y2hPZmZzZXRZLCBzdHJldGNoQ29udGVudEhlaWdodCwgaWNvbkhlaWdodCwgc2hhcGVkSWNvbi50b3ApO1xuICAgICAgICBjb25zdCB0b3BQeCA9IGdldFB4T2Zmc2V0KHRvcC5maXhlZCAtIGZpeGVkT2Zmc2V0WSwgZml4ZWRDb250ZW50SGVpZ2h0LCB0b3Auc3RyZXRjaCwgc3RyZXRjaEhlaWdodCk7XG5cbiAgICAgICAgY29uc3QgcmlnaHRFbSA9IGdldEVtT2Zmc2V0KHJpZ2h0LnN0cmV0Y2ggLSBzdHJldGNoT2Zmc2V0WCwgc3RyZXRjaENvbnRlbnRXaWR0aCwgaWNvbldpZHRoLCBzaGFwZWRJY29uLmxlZnQpO1xuICAgICAgICBjb25zdCByaWdodFB4ID0gZ2V0UHhPZmZzZXQocmlnaHQuZml4ZWQgLSBmaXhlZE9mZnNldFgsIGZpeGVkQ29udGVudFdpZHRoLCByaWdodC5zdHJldGNoLCBzdHJldGNoV2lkdGgpO1xuXG4gICAgICAgIGNvbnN0IGJvdHRvbUVtID0gZ2V0RW1PZmZzZXQoYm90dG9tLnN0cmV0Y2ggLSBzdHJldGNoT2Zmc2V0WSwgc3RyZXRjaENvbnRlbnRIZWlnaHQsIGljb25IZWlnaHQsIHNoYXBlZEljb24udG9wKTtcbiAgICAgICAgY29uc3QgYm90dG9tUHggPSBnZXRQeE9mZnNldChib3R0b20uZml4ZWQgLSBmaXhlZE9mZnNldFksIGZpeGVkQ29udGVudEhlaWdodCwgYm90dG9tLnN0cmV0Y2gsIHN0cmV0Y2hIZWlnaHQpO1xuXG4gICAgICAgIGNvbnN0IHRsID0gbmV3IFBvaW50KGxlZnRFbSwgdG9wRW0pO1xuICAgICAgICBjb25zdCB0ciA9IG5ldyBQb2ludChyaWdodEVtLCB0b3BFbSk7XG4gICAgICAgIGNvbnN0IGJyID0gbmV3IFBvaW50KHJpZ2h0RW0sIGJvdHRvbUVtKTtcbiAgICAgICAgY29uc3QgYmwgPSBuZXcgUG9pbnQobGVmdEVtLCBib3R0b21FbSk7XG4gICAgICAgIGNvbnN0IHBpeGVsT2Zmc2V0VEwgPSBuZXcgUG9pbnQobGVmdFB4IC8gcGl4ZWxSYXRpbywgdG9wUHggLyBwaXhlbFJhdGlvKTtcbiAgICAgICAgY29uc3QgcGl4ZWxPZmZzZXRCUiA9IG5ldyBQb2ludChyaWdodFB4IC8gcGl4ZWxSYXRpbywgYm90dG9tUHggLyBwaXhlbFJhdGlvKTtcblxuICAgICAgICBjb25zdCBhbmdsZSA9IGljb25Sb3RhdGUgKiBNYXRoLlBJIC8gMTgwO1xuXG4gICAgICAgIGlmIChhbmdsZSkge1xuICAgICAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgICAgIGNvcyA9IE1hdGguY29zKGFuZ2xlKSxcbiAgICAgICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgICAgIHRsLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgICAgICB0ci5fbWF0TXVsdChtYXRyaXgpO1xuICAgICAgICAgICAgYmwuX21hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgIGJyLl9tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4MSA9IGxlZnQuc3RyZXRjaCArIGxlZnQuZml4ZWQ7XG4gICAgICAgIGNvbnN0IHgyID0gcmlnaHQuc3RyZXRjaCArIHJpZ2h0LmZpeGVkO1xuICAgICAgICBjb25zdCB5MSA9IHRvcC5zdHJldGNoICsgdG9wLmZpeGVkO1xuICAgICAgICBjb25zdCB5MiA9IGJvdHRvbS5zdHJldGNoICsgYm90dG9tLmZpeGVkO1xuXG4gICAgICAgIGNvbnN0IHN1YlJlY3QgPSB7XG4gICAgICAgICAgICB4OiBpbWFnZS5wYWRkZWRSZWN0LnggKyBib3JkZXIgKyB4MSxcbiAgICAgICAgICAgIHk6IGltYWdlLnBhZGRlZFJlY3QueSArIGJvcmRlciArIHkxLFxuICAgICAgICAgICAgdzogeDIgLSB4MSxcbiAgICAgICAgICAgIGg6IHkyIC0geTFcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBtaW5Gb250U2NhbGVYID0gZml4ZWRDb250ZW50V2lkdGggLyBwaXhlbFJhdGlvIC8gaWNvbldpZHRoO1xuICAgICAgICBjb25zdCBtaW5Gb250U2NhbGVZID0gZml4ZWRDb250ZW50SGVpZ2h0IC8gcGl4ZWxSYXRpbyAvIGljb25IZWlnaHQ7XG5cbiAgICAgICAgLy8gSWNvbiBxdWFkIGlzIHBhZGRlZCwgc28gdGV4dHVyZSBjb29yZGluYXRlcyBhbHNvIG5lZWQgdG8gYmUgcGFkZGVkLlxuICAgICAgICByZXR1cm4ge3RsLCB0ciwgYmwsIGJyLCB0ZXg6IHN1YlJlY3QsIHdyaXRpbmdNb2RlOiB1bmRlZmluZWQsIGdseXBoT2Zmc2V0OiBbMCwgMF0sIHNlY3Rpb25JbmRleDogMCwgcGl4ZWxPZmZzZXRUTCwgcGl4ZWxPZmZzZXRCUiwgbWluRm9udFNjYWxlWCwgbWluRm9udFNjYWxlWSwgaXNTREY6IGlzU0RGSWNvbn07XG4gICAgfTtcblxuICAgIGlmICghaGFzSWNvblRleHRGaXQgfHwgKCFpbWFnZS5zdHJldGNoWCAmJiAhaW1hZ2Uuc3RyZXRjaFkpKSB7XG4gICAgICAgIHF1YWRzLnB1c2gobWFrZUJveChcbiAgICAgICAgICAgIHtmaXhlZDogMCwgc3RyZXRjaDogLTF9LFxuICAgICAgICAgICAge2ZpeGVkOiAwLCBzdHJldGNoOiAtMX0sXG4gICAgICAgICAgICB7Zml4ZWQ6IDAsIHN0cmV0Y2g6IGltYWdlV2lkdGggKyAxfSxcbiAgICAgICAgICAgIHtmaXhlZDogMCwgc3RyZXRjaDogaW1hZ2VIZWlnaHQgKyAxfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHhDdXRzID0gc3RyZXRjaFpvbmVzVG9DdXRzKHN0cmV0Y2hYLCBmaXhlZFdpZHRoLCBzdHJldGNoV2lkdGgpO1xuICAgICAgICBjb25zdCB5Q3V0cyA9IHN0cmV0Y2hab25lc1RvQ3V0cyhzdHJldGNoWSwgZml4ZWRIZWlnaHQsIHN0cmV0Y2hIZWlnaHQpO1xuXG4gICAgICAgIGZvciAobGV0IHhpID0gMDsgeGkgPCB4Q3V0cy5sZW5ndGggLSAxOyB4aSsrKSB7XG4gICAgICAgICAgICBjb25zdCB4MSA9IHhDdXRzW3hpXTtcbiAgICAgICAgICAgIGNvbnN0IHgyID0geEN1dHNbeGkgKyAxXTtcbiAgICAgICAgICAgIGZvciAobGV0IHlpID0gMDsgeWkgPCB5Q3V0cy5sZW5ndGggLSAxOyB5aSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeTEgPSB5Q3V0c1t5aV07XG4gICAgICAgICAgICAgICAgY29uc3QgeTIgPSB5Q3V0c1t5aSArIDFdO1xuICAgICAgICAgICAgICAgIHF1YWRzLnB1c2gobWFrZUJveCh4MSwgeTEsIHgyLCB5MikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1YWRzO1xufVxuXG5mdW5jdGlvbiBzdW1XaXRoaW5SYW5nZShyYW5nZXMsIG1pbiwgbWF4KSB7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHtcbiAgICAgICAgc3VtICs9IE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCByYW5nZVsxXSkpIC0gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHJhbmdlWzBdKSk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG5cbmZ1bmN0aW9uIHN0cmV0Y2hab25lc1RvQ3V0cyhzdHJldGNoWm9uZXMsIGZpeGVkU2l6ZSwgc3RyZXRjaFNpemUpIHtcbiAgICBjb25zdCBjdXRzID0gW3tmaXhlZDogLWJvcmRlciwgc3RyZXRjaDogMH1dO1xuXG4gICAgZm9yIChjb25zdCBbYzEsIGMyXSBvZiBzdHJldGNoWm9uZXMpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IGN1dHNbY3V0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY3V0cy5wdXNoKHtcbiAgICAgICAgICAgIGZpeGVkOiBjMSAtIGxhc3Quc3RyZXRjaCxcbiAgICAgICAgICAgIHN0cmV0Y2g6IGxhc3Quc3RyZXRjaFxuICAgICAgICB9KTtcbiAgICAgICAgY3V0cy5wdXNoKHtcbiAgICAgICAgICAgIGZpeGVkOiBjMSAtIGxhc3Quc3RyZXRjaCxcbiAgICAgICAgICAgIHN0cmV0Y2g6IGxhc3Quc3RyZXRjaCArIChjMiAtIGMxKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY3V0cy5wdXNoKHtcbiAgICAgICAgZml4ZWQ6IGZpeGVkU2l6ZSArIGJvcmRlcixcbiAgICAgICAgc3RyZXRjaDogc3RyZXRjaFNpemVcbiAgICB9KTtcbiAgICByZXR1cm4gY3V0cztcbn1cblxuZnVuY3Rpb24gZ2V0RW1PZmZzZXQoc3RyZXRjaE9mZnNldCwgc3RyZXRjaFNpemUsIGljb25TaXplLCBpY29uT2Zmc2V0KSB7XG4gICAgcmV0dXJuIHN0cmV0Y2hPZmZzZXQgLyBzdHJldGNoU2l6ZSAqIGljb25TaXplICsgaWNvbk9mZnNldDtcbn1cblxuZnVuY3Rpb24gZ2V0UHhPZmZzZXQoZml4ZWRPZmZzZXQsIGZpeGVkU2l6ZSwgc3RyZXRjaE9mZnNldCwgc3RyZXRjaFNpemUpIHtcbiAgICByZXR1cm4gZml4ZWRPZmZzZXQgLSBmaXhlZFNpemUgKiBzdHJldGNoT2Zmc2V0IC8gc3RyZXRjaFNpemU7XG59XG5cbmZ1bmN0aW9uIGdldFJvdGF0ZU9mZnNldCh0ZXh0T2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdKSB7XG4gICAgY29uc3QgeCA9IHRleHRPZmZzZXRbMF0sIHkgPSB0ZXh0T2Zmc2V0WzFdO1xuICAgIGNvbnN0IHByb2R1Y3QgPSB4ICogeTtcbiAgICBpZiAocHJvZHVjdCA+IDApIHtcbiAgICAgICAgcmV0dXJuIFt4LCAteV07XG4gICAgfSBlbHNlIGlmIChwcm9kdWN0IDwgMCkge1xuICAgICAgICByZXR1cm4gWy14LCB5XTtcbiAgICB9IGVsc2UgaWYgKHggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFt5LCB4XTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3ksIC14XTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldE1pZGxpbmVPZmZzZXQoc2hhcGluZywgbGluZUhlaWdodCwgcHJldmlvdXNPZmZzZXQsIGxpbmVJbmRleCkge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5lSGVpZ2h0ID0gKGxpbmVIZWlnaHQgKyBzaGFwaW5nLnBvc2l0aW9uZWRMaW5lc1tsaW5lSW5kZXhdLmxpbmVPZmZzZXQpO1xuICAgIGlmIChsaW5lSW5kZXggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzT2Zmc2V0ICsgY3VycmVudExpbmVIZWlnaHQgLyAyLjA7XG4gICAgfVxuICAgIGNvbnN0IGFib3ZlTGluZUhlaWdodCA9IChsaW5lSGVpZ2h0ICsgc2hhcGluZy5wb3NpdGlvbmVkTGluZXNbbGluZUluZGV4IC0gMV0ubGluZU9mZnNldCk7XG4gICAgcmV0dXJuIHByZXZpb3VzT2Zmc2V0ICsgKGN1cnJlbnRMaW5lSGVpZ2h0ICsgYWJvdmVMaW5lSGVpZ2h0KSAvIDIuMDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIHF1YWRzIHVzZWQgZm9yIHJlbmRlcmluZyBhIHRleHQgbGFiZWwuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2x5cGhRdWFkcyhhbmNob3I6IEFuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgICAgc2hhcGluZzogU2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldDogW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgIGFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZTogRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXA6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0sXG4gICAgICAgICAgICAgICAgICAgICAgIGFsbG93VmVydGljYWxQbGFjZW1lbnQ6IGJvb2xlYW4pOiBBcnJheTxTeW1ib2xRdWFkPiB7XG4gICAgY29uc3QgcXVhZHMgPSBbXTtcbiAgICBpZiAoc2hhcGluZy5wb3NpdGlvbmVkTGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gcXVhZHM7XG5cbiAgICBjb25zdCB0ZXh0Um90YXRlID0gbGF5ZXIubGF5b3V0LmdldCgndGV4dC1yb3RhdGUnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSkgKiBNYXRoLlBJIC8gMTgwO1xuICAgIGNvbnN0IHJvdGF0ZU9mZnNldCA9IGdldFJvdGF0ZU9mZnNldCh0ZXh0T2Zmc2V0KTtcblxuICAgIGxldCBzaGFwaW5nSGVpZ2h0ID0gTWF0aC5hYnMoc2hhcGluZy50b3AgLSBzaGFwaW5nLmJvdHRvbSk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHNoYXBpbmcucG9zaXRpb25lZExpbmVzKSB7XG4gICAgICAgIHNoYXBpbmdIZWlnaHQgLT0gbGluZS5saW5lT2Zmc2V0O1xuICAgIH1cbiAgICBjb25zdCBsaW5lQ291bnRzID0gc2hhcGluZy5wb3NpdGlvbmVkTGluZXMubGVuZ3RoO1xuICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBzaGFwaW5nSGVpZ2h0IC8gbGluZUNvdW50cztcbiAgICBsZXQgY3VycmVudE9mZnNldCA9IHNoYXBpbmcudG9wIC0gdGV4dE9mZnNldFsxXTtcbiAgICBmb3IgKGxldCBsaW5lSW5kZXggPSAwOyBsaW5lSW5kZXggPCBsaW5lQ291bnRzOyArK2xpbmVJbmRleCkge1xuICAgICAgICBjb25zdCBsaW5lID0gc2hhcGluZy5wb3NpdGlvbmVkTGluZXNbbGluZUluZGV4XTtcbiAgICAgICAgY3VycmVudE9mZnNldCA9IGdldE1pZGxpbmVPZmZzZXQoc2hhcGluZywgbGluZUhlaWdodCwgY3VycmVudE9mZnNldCwgbGluZUluZGV4KTtcbiAgICAgICAgZm9yIChjb25zdCBwb3NpdGlvbmVkR2x5cGggb2YgbGluZS5wb3NpdGlvbmVkR2x5cGhzKSB7XG4gICAgICAgICAgICBpZiAoIXBvc2l0aW9uZWRHbHlwaC5yZWN0KSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHRleHR1cmVSZWN0ID0gcG9zaXRpb25lZEdseXBoLnJlY3QgfHwge307XG5cbiAgICAgICAgICAgIC8vIFRoZSByZWN0cyBoYXZlIGFuIGFkZGl0aW9uYWwgYnVmZmVyIHRoYXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZWlyIHNpemUuXG4gICAgICAgICAgICBjb25zdCBnbHlwaFBhZGRpbmcgPSAxLjA7XG4gICAgICAgICAgICBsZXQgcmVjdEJ1ZmZlciA9IEdMWVBIX1BCRl9CT1JERVIgKyBnbHlwaFBhZGRpbmc7XG4gICAgICAgICAgICBsZXQgaXNTREYgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHBpeGVsUmF0aW8gPSAxLjA7XG4gICAgICAgICAgICBsZXQgbGluZU9mZnNldCA9IDAuMDtcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbmVkR2x5cGguaW1hZ2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBpbWFnZU1hcFtwb3NpdGlvbmVkR2x5cGguaW1hZ2VOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIWltYWdlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2Uuc2RmKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5PbmNlKFwiU0RGIGltYWdlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBmb3JtYXR0ZWQgdGV4dCBhbmQgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlzU0RGID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcGl4ZWxSYXRpbyA9IGltYWdlLnBpeGVsUmF0aW87XG4gICAgICAgICAgICAgICAgcmVjdEJ1ZmZlciA9IElNQUdFX1BBRERJTkcgLyBwaXhlbFJhdGlvO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb3RhdGVWZXJ0aWNhbEdseXBoID0gKGFsb25nTGluZSB8fCBhbGxvd1ZlcnRpY2FsUGxhY2VtZW50KSAmJiBwb3NpdGlvbmVkR2x5cGgudmVydGljYWw7XG4gICAgICAgICAgICBjb25zdCBoYWxmQWR2YW5jZSA9IHBvc2l0aW9uZWRHbHlwaC5tZXRyaWNzLmFkdmFuY2UgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgLyAyO1xuICAgICAgICAgICAgY29uc3QgbWV0cmljcyA9IHBvc2l0aW9uZWRHbHlwaC5tZXRyaWNzO1xuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHBvc2l0aW9uZWRHbHlwaC5yZWN0O1xuICAgICAgICAgICAgaWYgKHJlY3QgPT09IG51bGwpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBBbGlnbiBpbWFnZXMgYW5kIHNjYWxlZCBnbHlwaHMgaW4gdGhlIG1pZGRsZSBvZiBhIHZlcnRpY2FsIGxpbmUuXG4gICAgICAgICAgICBpZiAoYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiBzaGFwaW5nLnZlcnRpY2FsaXphYmxlKSB7XG4gICAgICAgICAgICAgICAgLy8gaW1hZ2UncyBhZHZhbmNlIGZvciB2ZXJ0aWNhbCBzaGFwaW5nIGlzIGl0cyBoZWlnaHQsIHNvIHRoYXQgd2UgaGF2ZSB0byB0YWtlIHRoZSBkaWZmZXJlbmNlIGludG9cbiAgICAgICAgICAgICAgICAvLyBhY2NvdW50IGFmdGVyIGltYWdlIGdseXBoIGlzIHJvdGF0ZWRcbiAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0ID0gcG9zaXRpb25lZEdseXBoLmltYWdlTmFtZSA/IGhhbGZBZHZhbmNlIC0gcG9zaXRpb25lZEdseXBoLm1ldHJpY3Mud2lkdGggKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgLyAyLjAgOiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBnbHlwaE9mZnNldCA9IGFsb25nTGluZSA/XG4gICAgICAgICAgICAgICAgW3Bvc2l0aW9uZWRHbHlwaC54ICsgaGFsZkFkdmFuY2UsIHBvc2l0aW9uZWRHbHlwaC55XSA6XG4gICAgICAgICAgICAgICAgWzAsIDBdO1xuXG4gICAgICAgICAgICBsZXQgYnVpbHRJbk9mZnNldCA9IFswLCAwXTtcbiAgICAgICAgICAgIGxldCB2ZXJ0aWNhbGl6ZWRMYWJlbE9mZnNldCA9IFswLCAwXTtcbiAgICAgICAgICAgIGxldCB1c2VSb3RhdGVPZmZzZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghYWxvbmdMaW5lKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJvdGF0ZVZlcnRpY2FsR2x5cGgpIHtcbiAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbCBQT0kgbGFiZWxzIHRoYXQgYXJlIHJvdGF0ZWQgOTBkZWcgQ1cgYW5kIHdob3NlIGdseXBocyBtdXN0IHByZXNlcnZlIHVwcmlnaHQgb3JpZW50YXRpb25cbiAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGJlIHJvdGF0ZWQgOTBkZWcgQ0NXLiBBZnRlciBhIHF1YWQgaXMgcm90YXRlZCwgaXQgaXMgdHJhbnNsYXRlZCB0byB0aGUgb3JpZ2luYWwgYnVpbHQtaW4gb2Zmc2V0LlxuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbGl6ZWRMYWJlbE9mZnNldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBbcG9zaXRpb25lZEdseXBoLnggKyBoYWxmQWR2YW5jZSArIHJvdGF0ZU9mZnNldFswXSwgcG9zaXRpb25lZEdseXBoLnkgKyByb3RhdGVPZmZzZXRbMV0gLSBsaW5lT2Zmc2V0XTtcbiAgICAgICAgICAgICAgICAgICAgdXNlUm90YXRlT2Zmc2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBidWlsdEluT2Zmc2V0ID0gIFtwb3NpdGlvbmVkR2x5cGgueCArIGhhbGZBZHZhbmNlICsgdGV4dE9mZnNldFswXSwgcG9zaXRpb25lZEdseXBoLnkgKyB0ZXh0T2Zmc2V0WzFdIC0gbGluZU9mZnNldF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYWRkZWRXaWR0aCA9XG4gICAgICAgICAgICAgICAgcmVjdC53ICogcG9zaXRpb25lZEdseXBoLnNjYWxlIC8gKHBpeGVsUmF0aW8gKiAocG9zaXRpb25lZEdseXBoLmxvY2FsR2x5cGggPyBTREZfU0NBTEUgOiAxKSk7XG4gICAgICAgICAgICBjb25zdCAgcGFkZGVkSGVpZ2h0ID1cbiAgICAgICAgICAgICAgICByZWN0LmggKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgLyAocGl4ZWxSYXRpbyAqIChwb3NpdGlvbmVkR2x5cGgubG9jYWxHbHlwaCA/IFNERl9TQ0FMRSA6IDEpKTtcblxuICAgICAgICAgICAgbGV0IHRsLCB0ciwgYmwsIGJyO1xuICAgICAgICAgICAgaWYgKCFyb3RhdGVWZXJ0aWNhbEdseXBoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeDEgPSAobWV0cmljcy5sZWZ0IC0gcmVjdEJ1ZmZlcikgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgLSBoYWxmQWR2YW5jZSArIGJ1aWx0SW5PZmZzZXRbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgeTEgPSAoLW1ldHJpY3MudG9wIC0gcmVjdEJ1ZmZlcikgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGUgKyBidWlsdEluT2Zmc2V0WzFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHgyID0geDEgKyBwYWRkZWRXaWR0aDtcbiAgICAgICAgICAgICAgICBjb25zdCB5MiA9IHkxICsgcGFkZGVkSGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgdGwgPSBuZXcgUG9pbnQoeDEsIHkxKTtcbiAgICAgICAgICAgICAgICB0ciA9IG5ldyBQb2ludCh4MiwgeTEpO1xuICAgICAgICAgICAgICAgIGJsID0gbmV3IFBvaW50KHgxLCB5Mik7XG4gICAgICAgICAgICAgICAgYnIgPSBuZXcgUG9pbnQoeDIsIHkyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHZlcnRpY2FsIGdseXBoIHBsYWNlbWVudCwgZm9sbG93IHRoZSBzdGVwcyB0byBwdXQgdGhlIGdseXBoIGJpdG1hcCBpbiByaWdodCBjb29yZGluYXRlczpcbiAgICAgICAgICAgICAgICAvLyAxLiBSb3RhdGUgdGhlIGdseXBoIGJ5IHVzaW5nIG9yaWdpbmFsIGdseXBoIGNvb3JkaW5hdGVzIGluc3RlYWQgb2YgcGFkZGVkIGNvb3JkaW5hdGVzLCBzaW5jZSB0aGVcbiAgICAgICAgICAgICAgICAvLyByb3RhdGlvbiBjZW50ZXIgYW5kIHhPZmZzZXRDb3JyZWN0aW9uIGFyZSBhbGwgYmFzZWQgb24gb3JpZ2luYWwgZ2x5cGgncyBzaXplLlxuICAgICAgICAgICAgICAgIC8vIDIuIERvIHggb2Zmc2V0IGNvcnJlY3Rpb24gc28gdGhhdCAndGwnIGlzIHNoaWZ0ZWQgdG8gdGhlIHNhbWUgeCBjb29yZGluYXRlIGJlZm9yZSByb3RhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyAzLiBBZGp1c3QgZ2x5cGggcG9zaXRvbiBmb3IgJ3RsJyBieSBhcHBseWluZyB2ZXJ0aWFsIHBhZGRpbmcgYW5kIGhvcml6b250YWwgc2hpZnQsIG5vdyAndGwnIGlzIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNvb3JkaW5hdGUgd2hlcmUgd2UgZHJhdyB0aGUgZ2x5cGggYml0bWFwLlxuICAgICAgICAgICAgICAgIC8vIDQuIENhbGN1bGF0ZSBvdGhlciB0aHJlZSBiaXRtYXAgY29vcmRpbmF0ZXMuXG5cbiAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbC1zdXBwb3J0aW5nIGdseXBocyBhcmUgbGFpZCBvdXQgaW4gMjR4MjQgcG9pbnQgYm94ZXMgKDEgc3F1YXJlIGVtKVxuICAgICAgICAgICAgICAgIC8vIEluIGhvcml6b250YWwgb3JpZW50YXRpb24sIHRoZSBcInlTaGlmdFwiIGlzIHRoZSBuZWdhdGl2ZSB2YWx1ZSBvZiB0aGUgaGVpZ2h0IHRoYXRcbiAgICAgICAgICAgICAgICAvLyB0aGUgZ2x5cGggaXMgYWJvdmUgdGhlIGhvcml6b250YWwgbWlkbGluZS5cbiAgICAgICAgICAgICAgICAvLyBCeSByb3RhdGluZyBjb3VudGVyLWNsb2Nrd2lzZSBhcm91bmQgdGhlIHBvaW50IGF0IHRoZSBjZW50ZXIgb2YgdGhlIGxlZnRcbiAgICAgICAgICAgICAgICAvLyBlZGdlIG9mIGEgMjR4MjQgbGF5b3V0IGJveCBjZW50ZXJlZCBiZWxvdyB0aGUgbWlkbGluZSwgd2UgYWxpZ24gdGhlIG1pZGxpbmVcbiAgICAgICAgICAgICAgICAvLyBvZiB0aGUgcm90YXRlZCBnbHlwaHMgd2l0aCB0aGUgaG9yaXpvbnRhbCBtaWRsaW5lLCBzbyB0aGUgeVNoaWZ0IGlzIG5vIGxvbmdlclxuICAgICAgICAgICAgICAgIC8vIG5lY2Vzc2FyeSwgYnV0IHdlIGFsc28gcHVsbCB0aGUgZ2x5cGggdG8gdGhlIGxlZnQgYWxvbmcgdGhlIHggYXhpcy5cbiAgICAgICAgICAgICAgICBjb25zdCB5U2hpZnQgPSAocG9zaXRpb25lZEdseXBoLnkgLSBjdXJyZW50T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBuZXcgUG9pbnQoLWhhbGZBZHZhbmNlLCBoYWxmQWR2YW5jZSAtIHlTaGlmdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxSb3RhdGlvbiA9IC1NYXRoLlBJIC8gMjtcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbE9mZnNldENvcnJlY3Rpb24gPSBuZXcgUG9pbnQoLi4udmVydGljYWxpemVkTGFiZWxPZmZzZXQpO1xuICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlIHBvc2l0aW9uIGJlZm9yZSByb3RhdGlvblxuICAgICAgICAgICAgICAgIC8vIHRsIC0tLS0tIHRyXG4gICAgICAgICAgICAgICAgLy8gICB8ICAgICB8XG4gICAgICAgICAgICAgICAgLy8gICB8ICAgICB8XG4gICAgICAgICAgICAgICAgLy8gYmwgLS0tLS0gYnJcbiAgICAgICAgICAgICAgICB0bCA9IG5ldyBQb2ludCgtaGFsZkFkdmFuY2UgKyBidWlsdEluT2Zmc2V0WzBdLCBidWlsdEluT2Zmc2V0WzFdKTtcbiAgICAgICAgICAgICAgICB0bC5fcm90YXRlQXJvdW5kKHZlcnRpY2FsUm90YXRpb24sIGNlbnRlcikuX2FkZCh2ZXJ0aWNhbE9mZnNldENvcnJlY3Rpb24pO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVsYXRpdmUgcG9zaXRpb24gYWZ0ZXIgcm90YXRpbmdcbiAgICAgICAgICAgICAgICAvLyB0ciAtLS0tLSBiclxuICAgICAgICAgICAgICAgIC8vICAgfCAgICAgfFxuICAgICAgICAgICAgICAgIC8vICAgfCAgICAgfFxuICAgICAgICAgICAgICAgIC8vIHRsIC0tLS0tIGJsXG4gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgcm90YXRpb24sIGdseXBoIGxpZXMgb24gdGhlIGhvcml6b250YWwgbWlkbGluZS5cbiAgICAgICAgICAgICAgICAvLyBTaGlmdCBiYWNrIHRvIHRsJ3Mgb3JpZ2luYWwgeCBjb29yZGluYXRlIGJlZm9yZSByb3RhdGlvbiBieSBhcHBseWluZyAneE9mZnNldENvcnJlY3Rpb24nLlxuICAgICAgICAgICAgICAgIHRsLnggKz0gLXlTaGlmdCArIGhhbGZBZHZhbmNlO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHBhZGRpbmcgZm9yIHkgY29vcmRpbmF0ZSdzIGp1c3RpZmljYXRpb25cbiAgICAgICAgICAgICAgICB0bC55IC09IChtZXRyaWNzLmxlZnQgLSByZWN0QnVmZmVyKSAqIHBvc2l0aW9uZWRHbHlwaC5zY2FsZTtcblxuICAgICAgICAgICAgICAgIC8vIEFkanVzdCB4IGNvb3JkaW5hdGUgYWNjb3JkaW5nIHRvIGdseXBoIGJpdG1hcCdzIGhlaWdodCBhbmQgdGhlIHZlY3RpY2FsIGFkdmFuY2VcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbEFkdmFuY2UgPSBwb3NpdGlvbmVkR2x5cGguaW1hZ2VOYW1lID8gbWV0cmljcy5hZHZhbmNlICogcG9zaXRpb25lZEdseXBoLnNjYWxlIDpcbiAgICAgICAgICAgICAgICAgICAgT05FX0VNICogcG9zaXRpb25lZEdseXBoLnNjYWxlO1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIHdldGhlciB0aGUgZ2x5cGggaXMgZ2VuZXJhdGVkIGZyb20gc2VydmVyIHNpZGUgb3IgbG9jYWxseVxuICAgICAgICAgICAgICAgIGNvbnN0IGNociA9IFN0cmluZy5mcm9tQ2hhckNvZGUocG9zaXRpb25lZEdseXBoLmdseXBoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNWZXJ0aWNhbENsb3NlUHVuY3R1YXRpb24oY2hyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQbGFjZSB2ZXJ0aWNhbCBwdW5jdHVhdGlvbiBpbiByaWdodCBwbGFjZSwgcHVsbCBkb3duIDEgcGl4ZWwncyBzcGFjZSBmb3IgY2xvc2UgcHVuY3R1YXRpb25zXG4gICAgICAgICAgICAgICAgICAgIHRsLnggKz0gKC1yZWN0QnVmZmVyICsgMSkgKiBwb3NpdGlvbmVkR2x5cGguc2NhbGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1ZlcnRpY2FsT3BlblB1bmN0dWF0aW9uKGNocikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeE9mZnNldCA9IHZlcnRpY2FsQWR2YW5jZSAtIG1ldHJpY3MuaGVpZ2h0ICogcG9zaXRpb25lZEdseXBoLnNjYWxlO1xuICAgICAgICAgICAgICAgICAgICAvLyBQbGFjZSB2ZXJ0aWNhbCBwdW5jdHVhdGlvbiBpbiByaWdodCBwbGFjZSwgcHVsbCB1cCAxIHBpeGVsJ3Mgc3BhY2UgZm9yIG9wZW4gcHVuY3R1YXRpb25zXG4gICAgICAgICAgICAgICAgICAgIHRsLnggKz0geE9mZnNldCArICgtcmVjdEJ1ZmZlciAtIDEpICogcG9zaXRpb25lZEdseXBoLnNjYWxlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXBvc2l0aW9uZWRHbHlwaC5pbWFnZU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICgobWV0cmljcy53aWR0aCArIHJlY3RCdWZmZXIgKiAyKSAhPT0gcmVjdC53IHx8IG1ldHJpY3MuaGVpZ2h0ICsgcmVjdEJ1ZmZlciAqIDIgIT09IHJlY3QuaCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTG9jYWxseSBnZW5lcmF0ZWQgZ2x5cGhzJyBiaXRtYXAgZG8gbm90IGhhdmUgZXhhY3QgJ3JlY3RCdWZmZXInIHBhZGRlZCBhcm91bmQgdGhlIGdseXBocyxcbiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHRoZSBvcmlnaW5hbCB0bCBkbyBoYXZlIGRpc3RhbmNlIG9mIHJlY3RCdWZmZXIgcGFkZGVkIHRvIHRoZSB0b3Agb2YgdGhlIGdseXBoLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwZXJmZWN0UGFkZGVkSGVpZ2h0ID0gKG1ldHJpY3MuaGVpZ2h0ICsgcmVjdEJ1ZmZlciAqIDIpICogcG9zaXRpb25lZEdseXBoLnNjYWxlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9IHZlcnRpY2FsQWR2YW5jZSAtIHBlcmZlY3RQYWRkZWRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHRsLnggKz0gZGVsdGEgLyAyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBsYWNlIHRoZSBnbHlwaCBiaXRtYXAgcmlnaHQgaW4gdGhlIGNlbnRlciBvZiB0aGUgMjR4MjQgcG9pbnQgYm94ZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPSB2ZXJ0aWNhbEFkdmFuY2UgLSBwYWRkZWRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHRsLnggKz0gZGVsdGEgLyAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgb3RoZXIgdGhyZWUgcG9pbnRzXG4gICAgICAgICAgICAgICAgdHIgPSBuZXcgUG9pbnQodGwueCwgdGwueSAtIHBhZGRlZFdpZHRoKTtcbiAgICAgICAgICAgICAgICBibCA9IG5ldyBQb2ludCh0bC54ICsgcGFkZGVkSGVpZ2h0LCB0bC55KTtcbiAgICAgICAgICAgICAgICBiciA9IG5ldyBQb2ludCh0bC54ICsgcGFkZGVkSGVpZ2h0LCB0bC55IC0gcGFkZGVkV2lkdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGV4dFJvdGF0ZSkge1xuICAgICAgICAgICAgICAgIGxldCBjZW50ZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFhbG9uZ0xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVJvdGF0ZU9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbmV3IFBvaW50KHJvdGF0ZU9mZnNldFswXSwgcm90YXRlT2Zmc2V0WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IG5ldyBQb2ludCh0ZXh0T2Zmc2V0WzBdLCB0ZXh0T2Zmc2V0WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGwuX3JvdGF0ZUFyb3VuZCh0ZXh0Um90YXRlLCBjZW50ZXIpO1xuICAgICAgICAgICAgICAgIHRyLl9yb3RhdGVBcm91bmQodGV4dFJvdGF0ZSwgY2VudGVyKTtcbiAgICAgICAgICAgICAgICBibC5fcm90YXRlQXJvdW5kKHRleHRSb3RhdGUsIGNlbnRlcik7XG4gICAgICAgICAgICAgICAgYnIuX3JvdGF0ZUFyb3VuZCh0ZXh0Um90YXRlLCBjZW50ZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwaXhlbE9mZnNldFRMID0gbmV3IFBvaW50KDAsIDApO1xuICAgICAgICAgICAgY29uc3QgcGl4ZWxPZmZzZXRCUiA9IG5ldyBQb2ludCgwLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IG1pbkZvbnRTY2FsZVggPSAwO1xuICAgICAgICAgICAgY29uc3QgbWluRm9udFNjYWxlWSA9IDA7XG4gICAgICAgICAgICBxdWFkcy5wdXNoKHt0bCwgdHIsIGJsLCBiciwgdGV4OiB0ZXh0dXJlUmVjdCwgd3JpdGluZ01vZGU6IHNoYXBpbmcud3JpdGluZ01vZGUsIGdseXBoT2Zmc2V0LCBzZWN0aW9uSW5kZXg6IHBvc2l0aW9uZWRHbHlwaC5zZWN0aW9uSW5kZXgsIGlzU0RGLCBwaXhlbE9mZnNldFRMLCBwaXhlbE9mZnNldEJSLCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVhZHM7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbnlRdWV1ZSB7XG4gICAgY29uc3RydWN0b3IoZGF0YSA9IFtdLCBjb21wYXJlID0gZGVmYXVsdENvbXBhcmUpIHtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoO1xuICAgICAgICB0aGlzLmNvbXBhcmUgPSBjb21wYXJlO1xuXG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAodGhpcy5sZW5ndGggPj4gMSkgLSAxOyBpID49IDA7IGktLSkgdGhpcy5fZG93bihpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1c2goaXRlbSkge1xuICAgICAgICB0aGlzLmRhdGEucHVzaChpdGVtKTtcbiAgICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAgICAgdGhpcy5fdXAodGhpcy5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICBwb3AoKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLmRhdGFbMF07XG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHRoaXMuZGF0YS5wb3AoKTtcbiAgICAgICAgdGhpcy5sZW5ndGgtLTtcblxuICAgICAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFbMF0gPSBib3R0b207XG4gICAgICAgICAgICB0aGlzLl9kb3duKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRvcDtcbiAgICB9XG5cbiAgICBwZWVrKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhWzBdO1xuICAgIH1cblxuICAgIF91cChwb3MpIHtcbiAgICAgICAgY29uc3Qge2RhdGEsIGNvbXBhcmV9ID0gdGhpcztcbiAgICAgICAgY29uc3QgaXRlbSA9IGRhdGFbcG9zXTtcblxuICAgICAgICB3aGlsZSAocG9zID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gKHBvcyAtIDEpID4+IDE7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gZGF0YVtwYXJlbnRdO1xuICAgICAgICAgICAgaWYgKGNvbXBhcmUoaXRlbSwgY3VycmVudCkgPj0gMCkgYnJlYWs7XG4gICAgICAgICAgICBkYXRhW3Bvc10gPSBjdXJyZW50O1xuICAgICAgICAgICAgcG9zID0gcGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtwb3NdID0gaXRlbTtcbiAgICB9XG5cbiAgICBfZG93bihwb3MpIHtcbiAgICAgICAgY29uc3Qge2RhdGEsIGNvbXBhcmV9ID0gdGhpcztcbiAgICAgICAgY29uc3QgaGFsZkxlbmd0aCA9IHRoaXMubGVuZ3RoID4+IDE7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhW3Bvc107XG5cbiAgICAgICAgd2hpbGUgKHBvcyA8IGhhbGZMZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBsZWZ0ID0gKHBvcyA8PCAxKSArIDE7XG4gICAgICAgICAgICBsZXQgYmVzdCA9IGRhdGFbbGVmdF07XG4gICAgICAgICAgICBjb25zdCByaWdodCA9IGxlZnQgKyAxO1xuXG4gICAgICAgICAgICBpZiAocmlnaHQgPCB0aGlzLmxlbmd0aCAmJiBjb21wYXJlKGRhdGFbcmlnaHRdLCBiZXN0KSA8IDApIHtcbiAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgYmVzdCA9IGRhdGFbcmlnaHRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbXBhcmUoYmVzdCwgaXRlbSkgPj0gMCkgYnJlYWs7XG5cbiAgICAgICAgICAgIGRhdGFbcG9zXSA9IGJlc3Q7XG4gICAgICAgICAgICBwb3MgPSBsZWZ0O1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtwb3NdID0gaXRlbTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUXVldWUgZnJvbSAndGlueXF1ZXVlJztcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtkaXN0VG9TZWdtZW50U3F1YXJlZH0gZnJvbSAnLi9pbnRlcnNlY3Rpb25fdGVzdHMuanMnO1xuXG4vKipcbiAqIEZpbmRzIGFuIGFwcHJveGltYXRpb24gb2YgYSBwb2x5Z29uJ3MgUG9sZSBPZiBJbmFjY2Vzc2liaWxpdHkgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUG9sZV9vZl9pbmFjY2Vzc2liaWxpdHlcbiAqIFRoaXMgaXMgYSBjb3B5IG9mIGh0dHA6Ly9naXRodWIuY29tL21hcGJveC9wb2x5bGFiZWwgYWRhcHRlZCB0byB1c2UgUG9pbnRzXG4gKlxuICogQHBhcmFtIHBvbHlnb25SaW5ncyBmaXJzdCBpdGVtIGluIGFycmF5IGlzIHRoZSBvdXRlciByaW5nIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgdGhlIGxpc3Qgb2YgaG9sZXMsIHNob3VsZCBiZSBhbiBlbGVtZW50IG9mIHRoZSByZXN1bHQgb2YgdXRpbC9jbGFzc2lmeV9yaW5nc1xuICogQHBhcmFtIHByZWNpc2lvbiBTcGVjaWZpZWQgaW4gaW5wdXQgY29vcmRpbmF0ZSB1bml0cy4gSWYgMCByZXR1cm5zIGFmdGVyIGZpcnN0IHJ1biwgaWYgPiAwIHJlcGVhdGVkbHkgbmFycm93cyB0aGUgc2VhcmNoIHNwYWNlIHVudGlsIHRoZSByYWRpdXMgb2YgdGhlIGFyZWEgc2VhcmNoZWQgZm9yIHRoZSBiZXN0IHBvbGUgaXMgbGVzcyB0aGFuIHByZWNpc2lvblxuICogQHBhcmFtIGRlYnVnIFByaW50IHNvbWUgc3RhdGlzdGljcyB0byB0aGUgY29uc29sZSBkdXJpbmcgZXhlY3V0aW9uXG4gKiBAcmV0dXJucyBQb2xlIG9mIEluYWNjZXNzaWJpbGl0eS5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChwb2x5Z29uUmluZ3M6IEFycmF5PEFycmF5PFBvaW50Pj4sIHByZWNpc2lvbj86IG51bWJlciA9IDEsIGRlYnVnPzogYm9vbGVhbiA9IGZhbHNlKTogUG9pbnQge1xuICAgIC8vIGZpbmQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgb3V0ZXIgcmluZ1xuICAgIGxldCBtaW5YID0gSW5maW5pdHksIG1pblkgPSBJbmZpbml0eSwgbWF4WCA9IC1JbmZpbml0eSwgbWF4WSA9IC1JbmZpbml0eTtcbiAgICBjb25zdCBvdXRlclJpbmcgPSBwb2x5Z29uUmluZ3NbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRlclJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcCA9IG91dGVyUmluZ1tpXTtcbiAgICAgICAgaWYgKCFpIHx8IHAueCA8IG1pblgpIG1pblggPSBwLng7XG4gICAgICAgIGlmICghaSB8fCBwLnkgPCBtaW5ZKSBtaW5ZID0gcC55O1xuICAgICAgICBpZiAoIWkgfHwgcC54ID4gbWF4WCkgbWF4WCA9IHAueDtcbiAgICAgICAgaWYgKCFpIHx8IHAueSA+IG1heFkpIG1heFkgPSBwLnk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBtYXhYIC0gbWluWDtcbiAgICBjb25zdCBoZWlnaHQgPSBtYXhZIC0gbWluWTtcbiAgICBjb25zdCBjZWxsU2l6ZSA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpO1xuICAgIGxldCBoID0gY2VsbFNpemUgLyAyO1xuXG4gICAgLy8gYSBwcmlvcml0eSBxdWV1ZSBvZiBjZWxscyBpbiBvcmRlciBvZiB0aGVpciBcInBvdGVudGlhbFwiIChtYXggZGlzdGFuY2UgdG8gcG9seWdvbilcbiAgICBjb25zdCBjZWxsUXVldWUgPSBuZXcgUXVldWUoW10sIGNvbXBhcmVNYXgpO1xuXG4gICAgaWYgKGNlbGxTaXplID09PSAwKSByZXR1cm4gbmV3IFBvaW50KG1pblgsIG1pblkpO1xuXG4gICAgLy8gY292ZXIgcG9seWdvbiB3aXRoIGluaXRpYWwgY2VsbHNcbiAgICBmb3IgKGxldCB4ID0gbWluWDsgeCA8IG1heFg7IHggKz0gY2VsbFNpemUpIHtcbiAgICAgICAgZm9yIChsZXQgeSA9IG1pblk7IHkgPCBtYXhZOyB5ICs9IGNlbGxTaXplKSB7XG4gICAgICAgICAgICBjZWxsUXVldWUucHVzaChuZXcgQ2VsbCh4ICsgaCwgeSArIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gdGFrZSBjZW50cm9pZCBhcyB0aGUgZmlyc3QgYmVzdCBndWVzc1xuICAgIGxldCBiZXN0Q2VsbCA9IGdldENlbnRyb2lkQ2VsbChwb2x5Z29uUmluZ3MpO1xuICAgIGxldCBudW1Qcm9iZXMgPSBjZWxsUXVldWUubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGNlbGxRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgLy8gcGljayB0aGUgbW9zdCBwcm9taXNpbmcgY2VsbCBmcm9tIHRoZSBxdWV1ZVxuICAgICAgICBjb25zdCBjZWxsID0gY2VsbFF1ZXVlLnBvcCgpO1xuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgYmVzdCBjZWxsIGlmIHdlIGZvdW5kIGEgYmV0dGVyIG9uZVxuICAgICAgICBpZiAoY2VsbC5kID4gYmVzdENlbGwuZCB8fCAhYmVzdENlbGwuZCkge1xuICAgICAgICAgICAgYmVzdENlbGwgPSBjZWxsO1xuICAgICAgICAgICAgaWYgKGRlYnVnKSBjb25zb2xlLmxvZygnZm91bmQgYmVzdCAlZCBhZnRlciAlZCBwcm9iZXMnLCBNYXRoLnJvdW5kKDFlNCAqIGNlbGwuZCkgLyAxZTQsIG51bVByb2Jlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkbyBub3QgZHJpbGwgZG93biBmdXJ0aGVyIGlmIHRoZXJlJ3Mgbm8gY2hhbmNlIG9mIGEgYmV0dGVyIHNvbHV0aW9uXG4gICAgICAgIGlmIChjZWxsLm1heCAtIGJlc3RDZWxsLmQgPD0gcHJlY2lzaW9uKSBjb250aW51ZTtcblxuICAgICAgICAvLyBzcGxpdCB0aGUgY2VsbCBpbnRvIGZvdXIgY2VsbHNcbiAgICAgICAgaCA9IGNlbGwuaCAvIDI7XG4gICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKGNlbGwucC54IC0gaCwgY2VsbC5wLnkgLSBoLCBoLCBwb2x5Z29uUmluZ3MpKTtcbiAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoY2VsbC5wLnggKyBoLCBjZWxsLnAueSAtIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICBjZWxsUXVldWUucHVzaChuZXcgQ2VsbChjZWxsLnAueCAtIGgsIGNlbGwucC55ICsgaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKGNlbGwucC54ICsgaCwgY2VsbC5wLnkgKyBoLCBoLCBwb2x5Z29uUmluZ3MpKTtcbiAgICAgICAgbnVtUHJvYmVzICs9IDQ7XG4gICAgfVxuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBudW0gcHJvYmVzOiAke251bVByb2Jlc31gKTtcbiAgICAgICAgY29uc29sZS5sb2coYGJlc3QgZGlzdGFuY2U6ICR7YmVzdENlbGwuZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmVzdENlbGwucDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZU1heChhLCBiKSB7XG4gICAgcmV0dXJuIGIubWF4IC0gYS5tYXg7XG59XG5cbmZ1bmN0aW9uIENlbGwoeCwgeSwgaCwgcG9seWdvbikge1xuICAgIHRoaXMucCA9IG5ldyBQb2ludCh4LCB5KTtcbiAgICB0aGlzLmggPSBoOyAvLyBoYWxmIHRoZSBjZWxsIHNpemVcbiAgICB0aGlzLmQgPSBwb2ludFRvUG9seWdvbkRpc3QodGhpcy5wLCBwb2x5Z29uKTsgLy8gZGlzdGFuY2UgZnJvbSBjZWxsIGNlbnRlciB0byBwb2x5Z29uXG4gICAgdGhpcy5tYXggPSB0aGlzLmQgKyB0aGlzLmggKiBNYXRoLlNRUlQyOyAvLyBtYXggZGlzdGFuY2UgdG8gcG9seWdvbiB3aXRoaW4gYSBjZWxsXG59XG5cbi8vIHNpZ25lZCBkaXN0YW5jZSBmcm9tIHBvaW50IHRvIHBvbHlnb24gb3V0bGluZSAobmVnYXRpdmUgaWYgcG9pbnQgaXMgb3V0c2lkZSlcbmZ1bmN0aW9uIHBvaW50VG9Qb2x5Z29uRGlzdChwLCBwb2x5Z29uKSB7XG4gICAgbGV0IGluc2lkZSA9IGZhbHNlO1xuICAgIGxldCBtaW5EaXN0U3EgPSBJbmZpbml0eTtcblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcG9seWdvbi5sZW5ndGg7IGsrKykge1xuICAgICAgICBjb25zdCByaW5nID0gcG9seWdvbltrXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gcmluZ1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByaW5nW2pdO1xuXG4gICAgICAgICAgICBpZiAoKGEueSA+IHAueSAhPT0gYi55ID4gcC55KSAmJlxuICAgICAgICAgICAgICAgIChwLnggPCAoYi54IC0gYS54KSAqIChwLnkgLSBhLnkpIC8gKGIueSAtIGEueSkgKyBhLngpKSBpbnNpZGUgPSAhaW5zaWRlO1xuXG4gICAgICAgICAgICBtaW5EaXN0U3EgPSBNYXRoLm1pbihtaW5EaXN0U3EsIGRpc3RUb1NlZ21lbnRTcXVhcmVkKHAsIGEsIGIpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoaW5zaWRlID8gMSA6IC0xKSAqIE1hdGguc3FydChtaW5EaXN0U3EpO1xufVxuXG4vLyBnZXQgcG9seWdvbiBjZW50cm9pZFxuZnVuY3Rpb24gZ2V0Q2VudHJvaWRDZWxsKHBvbHlnb24pIHtcbiAgICBsZXQgYXJlYSA9IDA7XG4gICAgbGV0IHggPSAwO1xuICAgIGxldCB5ID0gMDtcbiAgICBjb25zdCBwb2ludHMgPSBwb2x5Z29uWzBdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwb2ludHMubGVuZ3RoLCBqID0gbGVuIC0gMTsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICBjb25zdCBhID0gcG9pbnRzW2ldO1xuICAgICAgICBjb25zdCBiID0gcG9pbnRzW2pdO1xuICAgICAgICBjb25zdCBmID0gYS54ICogYi55IC0gYi54ICogYS55O1xuICAgICAgICB4ICs9IChhLnggKyBiLngpICogZjtcbiAgICAgICAgeSArPSAoYS55ICsgYi55KSAqIGY7XG4gICAgICAgIGFyZWEgKz0gZiAqIDM7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ2VsbCh4IC8gYXJlYSwgeSAvIGFyZWEsIDAsIHBvbHlnb24pO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEFuY2hvciBmcm9tICcuL2FuY2hvci5qcyc7XG5cbmltcG9ydCB7Z2V0QW5jaG9ycywgZ2V0Q2VudGVyQW5jaG9yfSBmcm9tICcuL2dldF9hbmNob3JzLmpzJztcbmltcG9ydCBjbGlwTGluZSBmcm9tICcuL2NsaXBfbGluZS5qcyc7XG5pbXBvcnQge3NoYXBlVGV4dCwgc2hhcGVJY29uLCBXcml0aW5nTW9kZSwgZml0SWNvblRvVGV4dH0gZnJvbSAnLi9zaGFwaW5nLmpzJztcbmltcG9ydCB7Z2V0R2x5cGhRdWFkcywgZ2V0SWNvblF1YWRzfSBmcm9tICcuL3F1YWRzLmpzJztcbmltcG9ydCB7d2Fybk9uY2UsIGRlZ1RvUmFkfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtcbiAgICBhbGxvd3NWZXJ0aWNhbFdyaXRpbmdNb2RlLFxuICAgIGFsbG93c0xldHRlclNwYWNpbmdcbn0gZnJvbSAnLi4vdXRpbC9zY3JpcHRfZGV0ZWN0aW9uLmpzJztcbmltcG9ydCBmaW5kUG9sZU9mSW5hY2Nlc3NpYmlsaXR5IGZyb20gJy4uL3V0aWwvZmluZF9wb2xlX29mX2luYWNjZXNzaWJpbGl0eS5qcyc7XG5pbXBvcnQgY2xhc3NpZnlSaW5ncyBmcm9tICcuLi91dGlsL2NsYXNzaWZ5X3JpbmdzLmpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQuanMnO1xuaW1wb3J0IFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHtTSVpFX1BBQ0tfRkFDVE9SfSBmcm9tICcuL3N5bWJvbF9zaXplLmpzJztcbmltcG9ydCBPTkVfRU0gZnJvbSAnLi9vbmVfZW0uanMnO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge1NoYXBpbmcsIFBvc2l0aW9uZWRJY29uLCBUZXh0SnVzdGlmeX0gZnJvbSAnLi9zaGFwaW5nLmpzJztcbmltcG9ydCB0eXBlIHtDb2xsaXNpb25Cb3hBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7U3ltYm9sRmVhdHVyZX0gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZX0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfaW1hZ2UuanMnO1xuaW1wb3J0IHR5cGUge1N0eWxlR2x5cGh9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2dseXBoLmpzJztcbmltcG9ydCB0eXBlIFN5bWJvbFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMuanMnO1xuaW1wb3J0IHR5cGUge0dseXBoUG9zaXRpb25zfSBmcm9tICcuLi9yZW5kZXIvZ2x5cGhfYXRsYXMuanMnO1xuaW1wb3J0IHR5cGUge1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZX0gZnJvbSAnLi4vc3R5bGUvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSBQcm9qZWN0aW9uIGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3Byb2plY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUge1ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBtdXJtdXIzIGZyb20gJ211cm11cmhhc2gtanMnO1xuXG4vLyBUaGUgc3ltYm9sIGxheW91dCBwcm9jZXNzIG5lZWRzIGB0ZXh0LXNpemVgIGV2YWx1YXRlZCBhdCB1cCB0byBmaXZlIGRpZmZlcmVudCB6b29tIGxldmVscywgYW5kXG4vLyBgaWNvbi1zaXplYCBhdCB1cCB0byB0aHJlZTpcbi8vXG4vLyAgIDEuIGB0ZXh0LXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQuIFVzZWQgdG8gY2FsY3VsYXRlIGEgcGVyLWZlYXR1cmUgc2l6ZSBmb3Igc291cmNlIGB0ZXh0LXNpemVgXG4vLyAgICAgICBleHByZXNzaW9ucywgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgYm94IGRpbWVuc2lvbnMgZm9yIGljb24tdGV4dC1maXQuXG4vLyAgIDIuIGBpY29uLXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQuIFVzZWQgdG8gY2FsY3VsYXRlIGEgcGVyLWZlYXR1cmUgc2l6ZSBmb3Igc291cmNlIGBpY29uLXNpemVgXG4vLyAgICAgICBleHByZXNzaW9ucy5cbi8vICAgMy4gYHRleHQtc2l6ZWAgYW5kIGBpY29uLXNpemVgIGF0IHRoZSB6b29tIGxldmVsIG9mIHRoZSBidWNrZXQsIHBsdXMgb25lLiBVc2VkIHRvIGNhbGN1bGF0ZSBjb2xsaXNpb24gYm94ZXMuXG4vLyAgIDQuIGB0ZXh0LXNpemVgIGF0IHpvb20gbGV2ZWwgMTguIFVzZWQgZm9yIHNvbWV0aGluZyBsaW5lLXN5bWJvbC1wbGFjZW1lbnQtcmVsYXRlZC5cbi8vICAgNS4gIEZvciBjb21wb3NpdGUgYCotc2l6ZWAgZXhwcmVzc2lvbnM6IHR3byB6b29tIGxldmVscyBvZiBjdXJ2ZSBzdG9wcyB0aGF0IFwiY292ZXJcIiB0aGUgem9vbSBsZXZlbCBvZiB0aGVcbi8vICAgICAgIGJ1Y2tldC4gVGhlc2UgZ28gaW50byBhIHZlcnRleCBidWZmZXIgYW5kIGFyZSB1c2VkIGJ5IHRoZSBzaGFkZXIgdG8gaW50ZXJwb2xhdGUgdGhlIHNpemUgYXQgcmVuZGVyIHRpbWUuXG4vL1xuLy8gKDEpIGFuZCAoMikgYXJlIHN0b3JlZCBpbiBgYnVja2V0LmxheWVyc1swXS5sYXlvdXRgLiBUaGUgcmVtYWluZGVyIGFyZSBiZWxvdy5cbi8vXG50eXBlIFNpemVzID0ge1xuICAgIGxheW91dFRleHRTaXplOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPiwgLy8gKDMpXG4gICAgbGF5b3V0SWNvblNpemU6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+LCAvLyAoMylcbiAgICB0ZXh0TWF4U2l6ZTogUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlPG51bWJlcj4sICAgIC8vICg0KVxuICAgIGNvbXBvc2l0ZVRleHRTaXplczogW1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+LCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPl0sIC8vICg1KVxuICAgIGNvbXBvc2l0ZUljb25TaXplczogW1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxudW1iZXI+LCBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8bnVtYmVyPl0sIC8vICg1KVxufTtcblxuZXhwb3J0IHR5cGUgVGV4dEFuY2hvciA9ICdjZW50ZXInIHwgJ2xlZnQnIHwgJ3JpZ2h0JyB8ICd0b3AnIHwgJ2JvdHRvbScgfCAndG9wLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ2JvdHRvbS1yaWdodCc7XG5cbi8vIFRoZSByYWRpYWwgb2Zmc2V0IGlzIHRvIHRoZSBlZGdlIG9mIHRoZSB0ZXh0IGJveFxuLy8gSW4gdGhlIGhvcml6b250YWwgZGlyZWN0aW9uLCB0aGUgZWRnZSBvZiB0aGUgdGV4dCBib3ggaXMgd2hlcmUgZ2x5cGhzIHN0YXJ0XG4vLyBCdXQgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbiwgdGhlIGdseXBocyBhcHBlYXIgdG8gXCJzdGFydFwiIGF0IHRoZSBiYXNlbGluZVxuLy8gV2UgZG9uJ3QgYWN0dWFsbHkgbG9hZCBiYXNlbGluZSBkYXRhLCBidXQgd2UgYXNzdW1lIGFuIG9mZnNldCBvZiBPTkVfRU0gLSAxN1xuLy8gKHNlZSBcInlPZmZzZXRcIiBpbiBzaGFwaW5nLmpzKVxuY29uc3QgYmFzZWxpbmVPZmZzZXQgPSA3O1xuY29uc3QgSU5WQUxJRF9URVhUX09GRlNFVCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbmNvbnN0IHNxcnQyID0gTWF0aC5zcXJ0KDIpO1xuXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVWYXJpYWJsZU9mZnNldChhbmNob3I6IFRleHRBbmNob3IsIG9mZnNldDogW251bWJlciwgbnVtYmVyXSk6IFtudW1iZXIsIG51bWJlcl0ge1xuXG4gICAgZnVuY3Rpb24gZnJvbVJhZGlhbE9mZnNldChhbmNob3I6IFRleHRBbmNob3IsIHJhZGlhbE9mZnNldDogbnVtYmVyKSB7XG4gICAgICAgIGxldCB4ID0gMCwgeSA9IDA7XG4gICAgICAgIGlmIChyYWRpYWxPZmZzZXQgPCAwKSByYWRpYWxPZmZzZXQgPSAwOyAvLyBJZ25vcmUgbmVnYXRpdmUgb2Zmc2V0LlxuICAgICAgICAvLyBzb2x2ZSBmb3IgciB3aGVyZSByXjIgKyByXjIgPSByYWRpYWxPZmZzZXReMlxuICAgICAgICBjb25zdCBoeXBvdGVudXNlID0gcmFkaWFsT2Zmc2V0IC8gc3FydDI7XG4gICAgICAgIHN3aXRjaCAoYW5jaG9yKSB7XG4gICAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgICAgIHkgPSBoeXBvdGVudXNlIC0gYmFzZWxpbmVPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICAgICAgeSA9IC1oeXBvdGVudXNlICsgYmFzZWxpbmVPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHkgPSAtcmFkaWFsT2Zmc2V0ICsgYmFzZWxpbmVPZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgIHkgPSByYWRpYWxPZmZzZXQgLSBiYXNlbGluZU9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICAgICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0JzpcbiAgICAgICAgICAgIHggPSAtaHlwb3RlbnVzZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgICAgIHggPSBoeXBvdGVudXNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgeCA9IHJhZGlhbE9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICB4ID0gLXJhZGlhbE9mZnNldDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFt4LCB5XTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmcm9tVGV4dE9mZnNldChhbmNob3I6IFRleHRBbmNob3IsIG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyKSB7XG4gICAgICAgIGxldCB4ID0gMCwgeSA9IDA7XG4gICAgICAgIC8vIFVzZSBhYnNvbHV0ZSBvZmZzZXQgdmFsdWVzLlxuICAgICAgICBvZmZzZXRYID0gTWF0aC5hYnMob2Zmc2V0WCk7XG4gICAgICAgIG9mZnNldFkgPSBNYXRoLmFicyhvZmZzZXRZKTtcblxuICAgICAgICBzd2l0Y2ggKGFuY2hvcikge1xuICAgICAgICBjYXNlICd0b3AtcmlnaHQnOlxuICAgICAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICB5ID0gb2Zmc2V0WSAtIGJhc2VsaW5lT2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHkgPSAtb2Zmc2V0WSArIGJhc2VsaW5lT2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGFuY2hvcikge1xuICAgICAgICBjYXNlICd0b3AtcmlnaHQnOlxuICAgICAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICB4ID0gLW9mZnNldFg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wLWxlZnQnOlxuICAgICAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgeCA9IG9mZnNldFg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbeCwgeV07XG4gICAgfVxuXG4gICAgcmV0dXJuIChvZmZzZXRbMV0gIT09IElOVkFMSURfVEVYVF9PRkZTRVQpID8gZnJvbVRleHRPZmZzZXQoYW5jaG9yLCBvZmZzZXRbMF0sIG9mZnNldFsxXSkgOiBmcm9tUmFkaWFsT2Zmc2V0KGFuY2hvciwgb2Zmc2V0WzBdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBlcmZvcm1TeW1ib2xMYXlvdXQoYnVja2V0OiBTeW1ib2xCdWNrZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoTWFwOiB7W186IHN0cmluZ106IHtnbHlwaHM6IHtbXzogbnVtYmVyXTogP1N0eWxlR2x5cGh9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoUG9zaXRpb25zOiBHbHlwaFBvc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXA6IHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUG9zaXRpb25zOiB7W186IHN0cmluZ106IEltYWdlUG9zaXRpb259LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVab29tOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb246IFByb2plY3Rpb24pIHtcbiAgICBidWNrZXQuY3JlYXRlQXJyYXlzKCk7XG5cbiAgICBjb25zdCB0aWxlU2l6ZSA9IDUxMiAqIGJ1Y2tldC5vdmVyc2NhbGluZztcbiAgICBidWNrZXQudGlsZVBpeGVsUmF0aW8gPSBFWFRFTlQgLyB0aWxlU2l6ZTtcbiAgICBidWNrZXQuY29tcGFyZVRleHQgPSB7fTtcbiAgICBidWNrZXQuaWNvbnNOZWVkTGluZWFyID0gZmFsc2U7XG5cbiAgICBjb25zdCBsYXlvdXQgPSBidWNrZXQubGF5ZXJzWzBdLmxheW91dDtcbiAgICBjb25zdCB1bmV2YWx1YXRlZExheW91dFZhbHVlcyA9IGJ1Y2tldC5sYXllcnNbMF0uX3VuZXZhbHVhdGVkTGF5b3V0Ll92YWx1ZXM7XG5cbiAgICBjb25zdCBzaXplcyA9IHt9O1xuXG4gICAgaWYgKGJ1Y2tldC50ZXh0U2l6ZURhdGEua2luZCA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgY29uc3Qge21pblpvb20sIG1heFpvb219ID0gYnVja2V0LnRleHRTaXplRGF0YTtcbiAgICAgICAgc2l6ZXMuY29tcG9zaXRlVGV4dFNpemVzID0gW1xuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1pblpvb20pLCBjYW5vbmljYWwpLFxuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1heFpvb20pLCBjYW5vbmljYWwpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgaWYgKGJ1Y2tldC5pY29uU2l6ZURhdGEua2luZCA9PT0gJ2NvbXBvc2l0ZScpIHtcbiAgICAgICAgY29uc3Qge21pblpvb20sIG1heFpvb219ID0gYnVja2V0Lmljb25TaXplRGF0YTtcbiAgICAgICAgc2l6ZXMuY29tcG9zaXRlSWNvblNpemVzID0gW1xuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1pblpvb20pLCBjYW5vbmljYWwpLFxuICAgICAgICAgICAgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKG1heFpvb20pLCBjYW5vbmljYWwpXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgc2l6ZXMubGF5b3V0VGV4dFNpemUgPSB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10ucG9zc2libHlFdmFsdWF0ZShuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGlsZVpvb20gKyAxKSwgY2Fub25pY2FsKTtcbiAgICBzaXplcy5sYXlvdXRJY29uU2l6ZSA9IHVuZXZhbHVhdGVkTGF5b3V0VmFsdWVzWydpY29uLXNpemUnXS5wb3NzaWJseUV2YWx1YXRlKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aWxlWm9vbSArIDEpLCBjYW5vbmljYWwpO1xuICAgIHNpemVzLnRleHRNYXhTaXplID0gdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ3RleHQtc2l6ZSddLnBvc3NpYmx5RXZhbHVhdGUobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKDE4KSwgY2Fub25pY2FsKTtcblxuICAgIGNvbnN0IHRleHRBbG9uZ0xpbmUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyAmJiBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCc7XG4gICAgY29uc3QgdGV4dFNpemUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXNpemUnKTtcblxuICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBidWNrZXQuZmVhdHVyZXMpIHtcbiAgICAgICAgY29uc3QgZm9udHN0YWNrID0gbGF5b3V0LmdldCgndGV4dC1mb250JykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCkuam9pbignLCcpO1xuICAgICAgICBjb25zdCBsYXlvdXRUZXh0U2l6ZVRoaXNab29tID0gdGV4dFNpemUuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgICAgIGNvbnN0IGxheW91dFRleHRTaXplID0gc2l6ZXMubGF5b3V0VGV4dFNpemUuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgICAgIGNvbnN0IGxheW91dEljb25TaXplID0gc2l6ZXMubGF5b3V0SWNvblNpemUuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG5cbiAgICAgICAgY29uc3Qgc2hhcGVkVGV4dE9yaWVudGF0aW9ucyA9IHtcbiAgICAgICAgICAgIGhvcml6b250YWw6IHt9LFxuICAgICAgICAgICAgdmVydGljYWw6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB0ZXh0ID0gZmVhdHVyZS50ZXh0O1xuICAgICAgICBsZXQgdGV4dE9mZnNldDogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcbiAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuZm9ybWF0dGVkVGV4dCA9IHRleHQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHNwYWNpbmcgPSBsYXlvdXQuZ2V0KCd0ZXh0LWxldHRlci1zcGFjaW5nJykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCkgKiBPTkVfRU07XG4gICAgICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gbGF5b3V0LmdldCgndGV4dC1saW5lLWhlaWdodCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpICogT05FX0VNO1xuICAgICAgICAgICAgY29uc3Qgc3BhY2luZ0lmQWxsb3dlZCA9IGFsbG93c0xldHRlclNwYWNpbmcodW5mb3JtYXR0ZWRUZXh0KSA/IHNwYWNpbmcgOiAwO1xuXG4gICAgICAgICAgICBjb25zdCB0ZXh0QW5jaG9yID0gbGF5b3V0LmdldCgndGV4dC1hbmNob3InKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKTtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlVGV4dEFuY2hvciA9IGxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG5cbiAgICAgICAgICAgIGlmICghdmFyaWFibGVUZXh0QW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFkaWFsT2Zmc2V0ID0gbGF5b3V0LmdldCgndGV4dC1yYWRpYWwtb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICAgICAgLy8gTGF5ZXJzIHdpdGggdmFyaWFibGUgYW5jaG9ycyB1c2UgdGhlIGB0ZXh0LXJhZGlhbC1vZmZzZXRgIHByb3BlcnR5IGFuZCB0aGUgW3gsIHldIG9mZnNldCB2ZWN0b3JcbiAgICAgICAgICAgICAgICAvLyBpcyBjYWxjdWxhdGVkIGF0IHBsYWNlbWVudCB0aW1lIGluc3RlYWQgb2YgbGF5b3V0IHRpbWVcbiAgICAgICAgICAgICAgICBpZiAocmFkaWFsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzdHlsZSBzcGVjIHNheXMgZG9uJ3QgdXNlIGB0ZXh0LW9mZnNldGAgYW5kIGB0ZXh0LXJhZGlhbC1vZmZzZXRgIHRvZ2V0aGVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IHNwZWNpZnkgd2hhdCBoYXBwZW5zIGlmIHlvdSB1c2UgYm90aC4gV2UgZ28gd2l0aCB0aGUgcmFkaWFsIG9mZnNldC5cbiAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCA9IGV2YWx1YXRlVmFyaWFibGVPZmZzZXQodGV4dEFuY2hvciwgW3JhZGlhbE9mZnNldCAqIE9ORV9FTSwgSU5WQUxJRF9URVhUX09GRlNFVF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQgPSAobGF5b3V0LmdldCgndGV4dC1vZmZzZXQnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKS5tYXAodCA9PiB0ICogT05FX0VNKTogYW55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0SnVzdGlmeSA9IHRleHRBbG9uZ0xpbmUgP1xuICAgICAgICAgICAgICAgIFwiY2VudGVyXCIgOlxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtanVzdGlmeScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpO1xuXG4gICAgICAgICAgICBjb25zdCBzeW1ib2xQbGFjZW1lbnQgPSBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50Jyk7XG4gICAgICAgICAgICBjb25zdCBpc1BvaW50UGxhY2VtZW50ID0gc3ltYm9sUGxhY2VtZW50ID09PSAncG9pbnQnO1xuICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBzeW1ib2xQbGFjZW1lbnQgPT09ICdwb2ludCcgP1xuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtbWF4LXdpZHRoJykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCkgKiBPTkVfRU0gOlxuICAgICAgICAgICAgICAgIDA7XG5cbiAgICAgICAgICAgIGNvbnN0IGFkZFZlcnRpY2FsU2hhcGluZ0lmTmVlZGVkID0gKHRleHRKdXN0aWZ5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIGFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUodW5mb3JtYXR0ZWRUZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbCBQT0kgbGFiZWwgcGxhY2VtZW50IGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIHNjcmlwdHMgdGhhdCBzdXBwb3J0IHZlcnRpY2FsXG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRpbmcgbW9kZSwgdGh1cywgZGVmYXVsdCBsZWZ0IGp1c3RpZmljYXRpb24gaXMgdXNlZC4gSWYgTGF0aW5cbiAgICAgICAgICAgICAgICAgICAgLy8gc2NyaXB0cyB3b3VsZCBuZWVkIHRvIGJlIHN1cHBvcnRlZCwgdGhpcyBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgb3RoZXIganVzdGlmaWNhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwgPSBzaGFwZVRleHQodGV4dCwgZ2x5cGhNYXAsIGdseXBoUG9zaXRpb25zLCBpbWFnZVBvc2l0aW9ucywgZm9udHN0YWNrLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgdGV4dEFuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0SnVzdGlmeSwgc3BhY2luZ0lmQWxsb3dlZCwgdGV4dE9mZnNldCwgV3JpdGluZ01vZGUudmVydGljYWwsIHRydWUsIHN5bWJvbFBsYWNlbWVudCwgbGF5b3V0VGV4dFNpemUsIGxheW91dFRleHRTaXplVGhpc1pvb20pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgbGF5ZXIgdXNlcyB0ZXh0LXZhcmlhYmxlLWFuY2hvciwgZ2VuZXJhdGUgc2hhcGluZ3MgZm9yIGFsbCBqdXN0aWZpY2F0aW9uIHBvc3NpYmlsaXRpZXMuXG4gICAgICAgICAgICBpZiAoIXRleHRBbG9uZ0xpbmUgJiYgdmFyaWFibGVUZXh0QW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QganVzdGlmaWNhdGlvbnMgPSB0ZXh0SnVzdGlmeSA9PT0gXCJhdXRvXCIgP1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVRleHRBbmNob3IubWFwKGEgPT4gZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbihhKSkgOlxuICAgICAgICAgICAgICAgICAgICBbdGV4dEp1c3RpZnldO1xuXG4gICAgICAgICAgICAgICAgbGV0IHNpbmdsZUxpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGp1c3RpZmljYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGp1c3RpZmljYXRpb246IFRleHRKdXN0aWZ5ID0ganVzdGlmaWNhdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWxbanVzdGlmaWNhdGlvbl0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2luZ2xlTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNoYXBpbmcgZm9yIHRoZSBmaXJzdCBqdXN0aWZpY2F0aW9uIHdhcyBvbmx5IGEgc2luZ2xlIGxpbmUsIHdlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4gcmUtdXNlIGl0IGZvciB0aGUgb3RoZXIganVzdGlmaWNhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbFtqdXN0aWZpY2F0aW9uXSA9IHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbFswXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHVzaW5nIHRleHQtdmFyaWFibGUtYW5jaG9yIGZvciB0aGUgbGF5ZXIsIHdlIHVzZSBhIGNlbnRlciBhbmNob3IgZm9yIGFsbCBzaGFwaW5ncyBhbmQgYXBwbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvZmZzZXRzIGZvciB0aGUgYW5jaG9yIGluIHRoZSBwbGFjZW1lbnQgc3RlcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXBpbmcgPSBzaGFwZVRleHQodGV4dCwgZ2x5cGhNYXAsIGdseXBoUG9zaXRpb25zLCBpbWFnZVBvc2l0aW9ucywgZm9udHN0YWNrLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZmljYXRpb24sIHNwYWNpbmdJZkFsbG93ZWQsIHRleHRPZmZzZXQsIFdyaXRpbmdNb2RlLmhvcml6b250YWwsIGZhbHNlLCBzeW1ib2xQbGFjZW1lbnQsIGxheW91dFRleHRTaXplLCBsYXlvdXRUZXh0U2l6ZVRoaXNab29tKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGFwaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsW2p1c3RpZmljYXRpb25dID0gc2hhcGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVMaW5lID0gc2hhcGluZy5wb3NpdGlvbmVkTGluZXMubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYWRkVmVydGljYWxTaGFwaW5nSWZOZWVkZWQoJ2xlZnQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRleHRKdXN0aWZ5ID09PSBcImF1dG9cIikge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0SnVzdGlmeSA9IGdldEFuY2hvckp1c3RpZmljYXRpb24odGV4dEFuY2hvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFkZCBob3Jpem9udGFsIHNoYXBpbmcgZm9yIGFsbCBwb2ludCBsYWJlbHMgYW5kIGxpbmUgbGFiZWxzIHRoYXQgbmVlZCBob3Jpem9udGFsIHdyaXRpbmcgbW9kZS5cbiAgICAgICAgICAgICAgICBpZiAoaXNQb2ludFBsYWNlbWVudCB8fCAoKGxheW91dC5nZXQoXCJ0ZXh0LXdyaXRpbmctbW9kZVwiKS5pbmRleE9mKCdob3Jpem9udGFsJykgPj0gMCkgfHwgIWFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUodW5mb3JtYXR0ZWRUZXh0KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcGluZyA9IHNoYXBlVGV4dCh0ZXh0LCBnbHlwaE1hcCwgZ2x5cGhQb3NpdGlvbnMsIGltYWdlUG9zaXRpb25zLCBmb250c3RhY2ssIG1heFdpZHRoLCBsaW5lSGVpZ2h0LCB0ZXh0QW5jaG9yLCB0ZXh0SnVzdGlmeSwgc3BhY2luZ0lmQWxsb3dlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldCwgV3JpdGluZ01vZGUuaG9yaXpvbnRhbCwgZmFsc2UsIHN5bWJvbFBsYWNlbWVudCwgbGF5b3V0VGV4dFNpemUsIGxheW91dFRleHRTaXplVGhpc1pvb20pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcGluZykgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsW3RleHRKdXN0aWZ5XSA9IHNoYXBpbmc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVmVydGljYWwgcG9pbnQgbGFiZWwgKGlmIGFsbG93VmVydGljYWxQbGFjZW1lbnQgaXMgZW5hYmxlZCkuXG4gICAgICAgICAgICAgICAgYWRkVmVydGljYWxTaGFwaW5nSWZOZWVkZWQoc3ltYm9sUGxhY2VtZW50ID09PSAncG9pbnQnID8gJ2xlZnQnIDogdGV4dEp1c3RpZnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNoYXBlZEljb247XG4gICAgICAgIGxldCBpc1NERkljb24gPSBmYWxzZTtcbiAgICAgICAgaWYgKGZlYXR1cmUuaWNvbiAmJiBmZWF0dXJlLmljb24ubmFtZSkge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBpbWFnZU1hcFtmZWF0dXJlLmljb24ubmFtZV07XG4gICAgICAgICAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICAgICBzaGFwZWRJY29uID0gc2hhcGVJY29uKFxuICAgICAgICAgICAgICAgICAgICBpbWFnZVBvc2l0aW9uc1tmZWF0dXJlLmljb24ubmFtZV0sXG4gICAgICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24tb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCksXG4gICAgICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24tYW5jaG9yJykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCkpO1xuICAgICAgICAgICAgICAgIGlzU0RGSWNvbiA9IGltYWdlLnNkZjtcbiAgICAgICAgICAgICAgICBpZiAoYnVja2V0LnNkZkljb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LnNkZkljb25zID0gaW1hZ2Uuc2RmO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVja2V0LnNkZkljb25zICE9PSBpbWFnZS5zZGYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Fybk9uY2UoJ1N0eWxlIHNoZWV0IHdhcm5pbmc6IENhbm5vdCBtaXggU0RGIGFuZCBub24tU0RGIGljb25zIGluIG9uZSBidWZmZXInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGltYWdlLnBpeGVsUmF0aW8gIT09IGJ1Y2tldC5waXhlbFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5pY29uc05lZWRMaW5lYXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5b3V0LmdldCgnaWNvbi1yb3RhdGUnKS5jb25zdGFudE9yKDEpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5pY29uc05lZWRMaW5lYXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNoYXBlZFRleHQgPSBnZXREZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmcoc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsKSB8fCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsO1xuICAgICAgICBpZiAoIWJ1Y2tldC5pY29uc0luVGV4dCkge1xuICAgICAgICAgICAgYnVja2V0Lmljb25zSW5UZXh0ID0gc2hhcGVkVGV4dCA/IHNoYXBlZFRleHQuaWNvbnNJblRleHQgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hhcGVkVGV4dCB8fCBzaGFwZWRJY29uKSB7XG4gICAgICAgICAgICBhZGRGZWF0dXJlKGJ1Y2tldCwgZmVhdHVyZSwgc2hhcGVkVGV4dE9yaWVudGF0aW9ucywgc2hhcGVkSWNvbiwgaW1hZ2VNYXAsIHNpemVzLCBsYXlvdXRUZXh0U2l6ZSwgbGF5b3V0SWNvblNpemUsIHRleHRPZmZzZXQsIGlzU0RGSWNvbiwgYXZhaWxhYmxlSW1hZ2VzLCBjYW5vbmljYWwsIHByb2plY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3dDb2xsaXNpb25Cb3hlcykge1xuICAgICAgICBidWNrZXQuZ2VuZXJhdGVDb2xsaXNpb25EZWJ1Z0J1ZmZlcnModGlsZVpvb20sIGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheSk7XG4gICAgfVxufVxuXG4vLyBDaG9vc2UgdGhlIGp1c3RpZmljYXRpb24gdGhhdCBtYXRjaGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIFRleHRBbmNob3JcbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmNob3JKdXN0aWZpY2F0aW9uKGFuY2hvcjogVGV4dEFuY2hvcik6IFRleHRKdXN0aWZ5ICB7XG4gICAgc3dpdGNoIChhbmNob3IpIHtcbiAgICBjYXNlICdyaWdodCc6XG4gICAgY2FzZSAndG9wLXJpZ2h0JzpcbiAgICBjYXNlICdib3R0b20tcmlnaHQnOlxuICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICBjYXNlICdsZWZ0JzpcbiAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgY2FzZSAnYm90dG9tLWxlZnQnOlxuICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgIH1cbiAgICByZXR1cm4gJ2NlbnRlcic7XG59XG5cbi8qKlxuICogZm9yIFwidmVyeVwiIG92ZXJzY2FsZWQgdGlsZXMgKG92ZXJzY2FsZUZhY3RvciA+IDIpIG9uIGhpZ2ggem9vbSBsZXZlbHMgKHogPiAxOClcbiAqIHdlIHVzZSB0aGUgdGlsZSBwaXhlbCByYXRpbyBmcm9tIHRoZSBwcmV2aW91cyB6b29tIGxldmVsIGFuZCBjbGFtcCBpdCB0byAxXG4gKiBpbiBvcmRlciB0byB0aGluIG91dCBsYWJlbHMgZGVuc2l0eSBhbmQgc2F2ZSBtZW1vcnkgYW5kIENQVSAuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0aWxlUGl4ZWxSYXRpb0ZvclN5bWJvbFNwYWNpbmcob3ZlcnNjYWxlRmFjdG9yLCBvdmVyc2NhbGVkWikge1xuICAgIGlmIChvdmVyc2NhbGVkWiA+IDE4ICYmIG92ZXJzY2FsZUZhY3RvciA+IDIpIHtcbiAgICAgICAgb3ZlcnNjYWxlRmFjdG9yID4+PSAxO1xuICAgIH1cbiAgICBjb25zdCB0aWxlUGl4ZWxSYXRpbyA9IEVYVEVOVCAvICg1MTIgKiBvdmVyc2NhbGVGYWN0b3IpO1xuICAgIHJldHVybiBNYXRoLm1heCh0aWxlUGl4ZWxSYXRpbywgMSk7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBmZWF0dXJlIGFuZCBpdHMgc2hhcGVkIHRleHQgYW5kIGljb24gZGF0YSwgYWRkIGEgJ3N5bWJvbFxuICogaW5zdGFuY2UnIGZvciBlYWNoIF9wb3NzaWJsZV8gcGxhY2VtZW50IG9mIHRoZSBzeW1ib2wgZmVhdHVyZS5cbiAqIChBdCByZW5kZXIgdGltZVBsYWNlU3ltYm9scyNwbGFjZSgpIHNlbGVjdHMgd2hpY2ggb2YgdGhlc2UgaW5zdGFuY2VzIHRvXG4gKiBzaG93IG9yIGhpZGUgYmFzZWQgb24gY29sbGlzaW9ucyB3aXRoIHN5bWJvbHMgaW4gb3RoZXIgbGF5ZXJzLilcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZEZlYXR1cmUoYnVja2V0OiBTeW1ib2xCdWNrZXQsXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFN5bWJvbEZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnM6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogUG9zaXRpb25lZEljb24gfCB2b2lkLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZU1hcDoge1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZXM6IFNpemVzLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRUZXh0U2l6ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXRJY29uU2l6ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgICBpc1NERkljb246IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsXG4gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb246IFByb2plY3Rpb24pIHtcbiAgICAvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBsYWJlbHMgdGhhdCBqdW1wIGFyb3VuZCB3aGVuIHpvb21pbmcgd2UgbmVlZFxuICAgIC8vIHRvIHVzZSBhIHRleHQtc2l6ZSB2YWx1ZSB0aGF0IGlzIHRoZSBzYW1lIGZvciBhbGwgem9vbSBsZXZlbHMuXG4gICAgLy8gYnVja2V0IGNhbGN1bGF0ZXMgdGV4dC1zaXplIGF0IGEgaGlnaCB6b29tIGxldmVsIHNvIHRoYXQgYWxsIHRpbGVzIGNhblxuICAgIC8vIHVzZSB0aGUgc2FtZSB2YWx1ZSB3aGVuIGNhbGN1bGF0aW5nIGFuY2hvciBwb3NpdGlvbnMuXG4gICAgbGV0IHRleHRNYXhTaXplID0gc2l6ZXMudGV4dE1heFNpemUuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgaWYgKHRleHRNYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGV4dE1heFNpemUgPSBsYXlvdXRUZXh0U2l6ZTtcbiAgICB9XG4gICAgY29uc3QgbGF5b3V0ID0gYnVja2V0LmxheWVyc1swXS5sYXlvdXQ7XG4gICAgY29uc3QgaWNvbk9mZnNldCA9IGxheW91dC5nZXQoJ2ljb24tb2Zmc2V0JykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgY29uc3QgZGVmYXVsdFNoYXBpbmcgPSBnZXREZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmcoc2hhcGVkVGV4dE9yaWVudGF0aW9ucy5ob3Jpem9udGFsKSB8fCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsO1xuICAgIGNvbnN0IGlzR2xvYmUgPSBwcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZSc7XG5cbiAgICBjb25zdCBnbHlwaFNpemUgPSBPTkVfRU0sXG4gICAgICAgIGZvbnRTY2FsZSA9IGxheW91dFRleHRTaXplIC8gZ2x5cGhTaXplLFxuICAgICAgICB0ZXh0TWF4Qm94U2NhbGUgPSBidWNrZXQudGlsZVBpeGVsUmF0aW8gKiB0ZXh0TWF4U2l6ZSAvIGdseXBoU2l6ZSxcbiAgICAgICAgaWNvbkJveFNjYWxlID0gYnVja2V0LnRpbGVQaXhlbFJhdGlvICogbGF5b3V0SWNvblNpemUsXG4gICAgICAgIHN5bWJvbE1pbkRpc3RhbmNlID0gdGlsZVBpeGVsUmF0aW9Gb3JTeW1ib2xTcGFjaW5nKGJ1Y2tldC5vdmVyc2NhbGluZywgYnVja2V0Lnpvb20pICogbGF5b3V0LmdldCgnc3ltYm9sLXNwYWNpbmcnKSxcbiAgICAgICAgdGV4dFBhZGRpbmcgPSBsYXlvdXQuZ2V0KCd0ZXh0LXBhZGRpbmcnKSAqIGJ1Y2tldC50aWxlUGl4ZWxSYXRpbyxcbiAgICAgICAgaWNvblBhZGRpbmcgPSBsYXlvdXQuZ2V0KCdpY29uLXBhZGRpbmcnKSAqIGJ1Y2tldC50aWxlUGl4ZWxSYXRpbyxcbiAgICAgICAgdGV4dE1heEFuZ2xlID0gZGVnVG9SYWQobGF5b3V0LmdldCgndGV4dC1tYXgtYW5nbGUnKSksXG4gICAgICAgIHRleHRBbG9uZ0xpbmUgPSBsYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyAmJiBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCcsXG4gICAgICAgIGljb25BbG9uZ0xpbmUgPSBsYXlvdXQuZ2V0KCdpY29uLXJvdGF0aW9uLWFsaWdubWVudCcpID09PSAnbWFwJyAmJiBsYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgIT09ICdwb2ludCcsXG4gICAgICAgIHN5bWJvbFBsYWNlbWVudCA9IGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSxcbiAgICAgICAgdGV4dFJlcGVhdERpc3RhbmNlID0gc3ltYm9sTWluRGlzdGFuY2UgLyAyO1xuXG4gICAgY29uc3QgaWNvblRleHRGaXQgPSBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0Jyk7XG4gICAgbGV0IHZlcnRpY2FsbHlTaGFwZWRJY29uO1xuXG4gICAgLy8gQWRqdXN0IHNoYXBlZCBpY29uIHNpemUgd2hlbiBpY29uLXRleHQtZml0IGlzIHVzZWQuXG4gICAgaWYgKHNoYXBlZEljb24gJiYgaWNvblRleHRGaXQgIT09ICdub25lJykge1xuICAgICAgICBpZiAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgdmVydGljYWxseVNoYXBlZEljb24gPSBmaXRJY29uVG9UZXh0KHNoYXBlZEljb24sIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwsIGljb25UZXh0Rml0LFxuICAgICAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQtcGFkZGluZycpLCBpY29uT2Zmc2V0LCBmb250U2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWZhdWx0U2hhcGluZykge1xuICAgICAgICAgICAgc2hhcGVkSWNvbiA9IGZpdEljb25Ub1RleHQoc2hhcGVkSWNvbiwgZGVmYXVsdFNoYXBpbmcsIGljb25UZXh0Rml0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdC1wYWRkaW5nJyksIGljb25PZmZzZXQsIGZvbnRTY2FsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZGRTeW1ib2xBdEFuY2hvciA9IChsaW5lLCBhbmNob3IsIGNhbm9uaWNhbElkKSA9PiB7XG4gICAgICAgIGlmIChhbmNob3IueCA8IDAgfHwgYW5jaG9yLnggPj0gRVhURU5UIHx8IGFuY2hvci55IDwgMCB8fCBhbmNob3IueSA+PSBFWFRFTlQpIHtcbiAgICAgICAgICAgIC8vIFN5bWJvbCBsYXllcnMgYXJlIGRyYXduIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMsIFdlIGZpbHRlciBvdXQgc3ltYm9sc1xuICAgICAgICAgICAgLy8gb3V0c2lkZSBvdXIgdGlsZSBib3VuZGFyaWVzICh3aGljaCBtYXkgYmUgaW5jbHVkZWQgaW4gdmVjdG9yIHRpbGUgYnVmZmVycylcbiAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgZG91YmxlLWRyYXdpbmcgc3ltYm9scy5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBnbG9iZTogP3thbmNob3I6IEFuY2hvciwgdXA6IFZlYzN9ID0gbnVsbDtcbiAgICAgICAgaWYgKGlzR2xvYmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHt4LCB5LCB6fSA9IHByb2plY3Rpb24ucHJvamVjdFRpbGVQb2ludChhbmNob3IueCwgYW5jaG9yLnksIGNhbm9uaWNhbElkKTtcbiAgICAgICAgICAgIGdsb2JlID0ge1xuICAgICAgICAgICAgICAgIGFuY2hvcjogbmV3IEFuY2hvcih4LCB5LCB6LCAwLCB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgIHVwOiBwcm9qZWN0aW9uLnVwVmVjdG9yKGNhbm9uaWNhbElkLCBhbmNob3IueCwgYW5jaG9yLnkpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkU3ltYm9sKGJ1Y2tldCwgYW5jaG9yLCBnbG9iZSwgbGluZSwgc2hhcGVkVGV4dE9yaWVudGF0aW9ucywgc2hhcGVkSWNvbiwgaW1hZ2VNYXAsIHZlcnRpY2FsbHlTaGFwZWRJY29uLCBidWNrZXQubGF5ZXJzWzBdLFxuICAgICAgICAgICAgYnVja2V0LmNvbGxpc2lvbkJveEFycmF5LCBmZWF0dXJlLmluZGV4LCBmZWF0dXJlLnNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICBidWNrZXQuaW5kZXgsIHRleHRQYWRkaW5nLCB0ZXh0QWxvbmdMaW5lLCB0ZXh0T2Zmc2V0LFxuICAgICAgICAgICAgaWNvbkJveFNjYWxlLCBpY29uUGFkZGluZywgaWNvbkFsb25nTGluZSwgaWNvbk9mZnNldCxcbiAgICAgICAgICAgIGZlYXR1cmUsIHNpemVzLCBpc1NERkljb24sIGF2YWlsYWJsZUltYWdlcywgY2Fub25pY2FsKTtcbiAgICB9O1xuXG4gICAgaWYgKHN5bWJvbFBsYWNlbWVudCA9PT0gJ2xpbmUnKSB7XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBjbGlwTGluZShmZWF0dXJlLmdlb21ldHJ5LCAwLCAwLCBFWFRFTlQsIEVYVEVOVCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFuY2hvcnMgPSBnZXRBbmNob3JzKFxuICAgICAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICAgICAgc3ltYm9sTWluRGlzdGFuY2UsXG4gICAgICAgICAgICAgICAgdGV4dE1heEFuZ2xlLFxuICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwgfHwgZGVmYXVsdFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgc2hhcGVkSWNvbixcbiAgICAgICAgICAgICAgICBnbHlwaFNpemUsXG4gICAgICAgICAgICAgICAgdGV4dE1heEJveFNjYWxlLFxuICAgICAgICAgICAgICAgIGJ1Y2tldC5vdmVyc2NhbGluZyxcbiAgICAgICAgICAgICAgICBFWFRFTlRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFuY2hvciBvZiBhbmNob3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcGVkVGV4dCA9IGRlZmF1bHRTaGFwaW5nO1xuICAgICAgICAgICAgICAgIGlmICghc2hhcGVkVGV4dCB8fCAhYW5jaG9ySXNUb29DbG9zZShidWNrZXQsIHNoYXBlZFRleHQudGV4dCwgdGV4dFJlcGVhdERpc3RhbmNlLCBhbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFN5bWJvbEF0QW5jaG9yKGxpbmUsIGFuY2hvciwgY2Fub25pY2FsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN5bWJvbFBsYWNlbWVudCA9PT0gJ2xpbmUtY2VudGVyJykge1xuICAgICAgICAvLyBObyBjbGlwcGluZywgbXVsdGlwbGUgbGluZXMgcGVyIGZlYXR1cmUgYXJlIGFsbG93ZWRcbiAgICAgICAgLy8gXCJsaW5lc1wiIHdpdGggb25seSBvbmUgcG9pbnQgYXJlIGlnbm9yZWQgYXMgaW4gY2xpcExpbmVzXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBmZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gZ2V0Q2VudGVyQW5jaG9yKFxuICAgICAgICAgICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0TWF4QW5nbGUsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwgfHwgZGVmYXVsdFNoYXBpbmcsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlZEljb24sXG4gICAgICAgICAgICAgICAgICAgIGdseXBoU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dE1heEJveFNjYWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFN5bWJvbEF0QW5jaG9yKGxpbmUsIGFuY2hvciwgY2Fub25pY2FsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZlYXR1cmUudHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBjbGFzc2lmeVJpbmdzKGZlYXR1cmUuZ2VvbWV0cnksIDApKSB7XG4gICAgICAgICAgICAvLyAxNiBoZXJlIHJlcHJlc2VudHMgMiBwaXhlbHNcbiAgICAgICAgICAgIGNvbnN0IHBvaSA9IGZpbmRQb2xlT2ZJbmFjY2Vzc2liaWxpdHkocG9seWdvbiwgMTYpO1xuICAgICAgICAgICAgYWRkU3ltYm9sQXRBbmNob3IocG9seWdvblswXSwgbmV3IEFuY2hvcihwb2kueCwgcG9pLnksIDAsIDAsIHVuZGVmaW5lZCksIGNhbm9uaWNhbCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZlYXR1cmUudHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8zODA4XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBmZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihsaW5lLCBuZXcgQW5jaG9yKGxpbmVbMF0ueCwgbGluZVswXS55LCAwLCAwLCB1bmRlZmluZWQpLCBjYW5vbmljYWwpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBwb2ludHMgb2YgZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiBwb2ludHMpIHtcbiAgICAgICAgICAgICAgICBhZGRTeW1ib2xBdEFuY2hvcihbcG9pbnRdLCBuZXcgQW5jaG9yKHBvaW50LngsIHBvaW50LnksIDAsIDAsIHVuZGVmaW5lZCksIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IE1BWF9HTFlQSF9JQ09OX1NJWkUgPSAyNTU7XG5jb25zdCBNQVhfUEFDS0VEX1NJWkUgPSBNQVhfR0xZUEhfSUNPTl9TSVpFICogU0laRV9QQUNLX0ZBQ1RPUjtcbmV4cG9ydCB7TUFYX1BBQ0tFRF9TSVpFfTtcblxuZnVuY3Rpb24gYWRkVGV4dFZlcnRpY2VzKGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JlOiA/eyBhbmNob3I6IEFuY2hvciwgdXA6IFZlYzMgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlQW5jaG9yOiBBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dDogU2hhcGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1hcDoge1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcjogU3ltYm9sU3R5bGVMYXllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0QWxvbmdMaW5lOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFN5bWJvbEZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE9mZnNldDogW251bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQXJyYXk6IHtsaW5lU3RhcnRJbmRleDogbnVtYmVyLCBsaW5lTGVuZ3RoOiBudW1iZXJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmdNb2RlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50VHlwZXM6IEFycmF5PCd2ZXJ0aWNhbCcgfCAnY2VudGVyJyB8ICdsZWZ0JyB8ICdyaWdodCc+LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzOiB7W186IHN0cmluZ106IG51bWJlcn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VkSWNvbkluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZXM6IFNpemVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCkge1xuICAgIGNvbnN0IGdseXBoUXVhZHMgPSBnZXRHbHlwaFF1YWRzKHRpbGVBbmNob3IsIHNoYXBlZFRleHQsIHRleHRPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsIHRleHRBbG9uZ0xpbmUsIGZlYXR1cmUsIGltYWdlTWFwLCBidWNrZXQuYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCk7XG5cbiAgICBjb25zdCBzaXplRGF0YSA9IGJ1Y2tldC50ZXh0U2l6ZURhdGE7XG4gICAgbGV0IHRleHRTaXplRGF0YSA9IG51bGw7XG5cbiAgICBpZiAoc2l6ZURhdGEua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgdGV4dFNpemVEYXRhID0gW1xuICAgICAgICAgICAgU0laRV9QQUNLX0ZBQ1RPUiAqIGxheWVyLmxheW91dC5nZXQoJ3RleHQtc2l6ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0ZXh0U2l6ZURhdGFbMF0gPiBNQVhfUEFDS0VEX1NJWkUpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGAke2J1Y2tldC5sYXllcklkc1swXX06IFZhbHVlIGZvciBcInRleHQtc2l6ZVwiIGlzID49ICR7TUFYX0dMWVBIX0lDT05fU0laRX0uIFJlZHVjZSB5b3VyIFwidGV4dC1zaXplXCIuYCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgIHRleHRTaXplRGF0YSA9IFtcbiAgICAgICAgICAgIFNJWkVfUEFDS19GQUNUT1IgKiBzaXplcy5jb21wb3NpdGVUZXh0U2l6ZXNbMF0uZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCksXG4gICAgICAgICAgICBTSVpFX1BBQ0tfRkFDVE9SICogc2l6ZXMuY29tcG9zaXRlVGV4dFNpemVzWzFdLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0ZXh0U2l6ZURhdGFbMF0gPiBNQVhfUEFDS0VEX1NJWkUgfHwgdGV4dFNpemVEYXRhWzFdID4gTUFYX1BBQ0tFRF9TSVpFKSB7XG4gICAgICAgICAgICB3YXJuT25jZShgJHtidWNrZXQubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJ0ZXh0LXNpemVcIiBpcyA+PSAke01BWF9HTFlQSF9JQ09OX1NJWkV9LiBSZWR1Y2UgeW91ciBcInRleHQtc2l6ZVwiLmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVja2V0LmFkZFN5bWJvbHMoXG4gICAgICAgIGJ1Y2tldC50ZXh0LFxuICAgICAgICBnbHlwaFF1YWRzLFxuICAgICAgICB0ZXh0U2l6ZURhdGEsXG4gICAgICAgIHRleHRPZmZzZXQsXG4gICAgICAgIHRleHRBbG9uZ0xpbmUsXG4gICAgICAgIGZlYXR1cmUsXG4gICAgICAgIHdyaXRpbmdNb2RlLFxuICAgICAgICBnbG9iZSxcbiAgICAgICAgdGlsZUFuY2hvcixcbiAgICAgICAgbGluZUFycmF5LmxpbmVTdGFydEluZGV4LFxuICAgICAgICBsaW5lQXJyYXkubGluZUxlbmd0aCxcbiAgICAgICAgcGxhY2VkSWNvbkluZGV4LFxuICAgICAgICBhdmFpbGFibGVJbWFnZXMsXG4gICAgICAgIGNhbm9uaWNhbCk7XG5cbiAgICAvLyBUaGUgcGxhY2VkU3ltYm9sQXJyYXkgaXMgdXNlZCBhdCByZW5kZXIgdGltZSBpbiBkcmF3VGlsZVN5bWJvbHNcbiAgICAvLyBUaGVzZSBpbmRpY2VzIGFsbG93IGFjY2VzcyB0byB0aGUgYXJyYXkgYXQgY29sbGlzaW9uIGRldGVjdGlvbiB0aW1lXG4gICAgZm9yIChjb25zdCBwbGFjZW1lbnRUeXBlIG9mIHBsYWNlbWVudFR5cGVzKSB7XG4gICAgICAgIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzW3BsYWNlbWVudFR5cGVdID0gYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2x5cGhRdWFkcy5sZW5ndGggKiA0O1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0SG9yaXpvbnRhbFNoYXBpbmcoaG9yaXpvbnRhbFNoYXBpbmc6IHtbXzogVGV4dEp1c3RpZnldOiBTaGFwaW5nfSk6IFNoYXBpbmcgfCBudWxsIHtcbiAgICAvLyBXZSBkb24ndCBjYXJlIHdoaWNoIHNoYXBpbmcgd2UgZ2V0IGJlY2F1c2UgdGhpcyBpcyB1c2VkIGZvciBjb2xsaXNpb24gcHVycG9zZXNcbiAgICAvLyBhbmQgYWxsIHRoZSBqdXN0aWZpY2F0aW9ucyBoYXZlIHRoZSBzYW1lIGNvbGxpc2lvbiBib3hcbiAgICBmb3IgKGNvbnN0IGp1c3RpZmljYXRpb246IGFueSBpbiBob3Jpem9udGFsU2hhcGluZykge1xuICAgICAgICByZXR1cm4gaG9yaXpvbnRhbFNoYXBpbmdbanVzdGlmaWNhdGlvbl07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVCb3hDb2xsaXNpb25GZWF0dXJlKGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ZWRBbmNob3I6IEFuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlQW5jaG9yOiBBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGVkOiBPYmplY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQ6ID9bbnVtYmVyLCBudW1iZXJdKTogbnVtYmVyIHtcbiAgICBsZXQgeTEgPSBzaGFwZWQudG9wO1xuICAgIGxldCB5MiA9IHNoYXBlZC5ib3R0b207XG4gICAgbGV0IHgxID0gc2hhcGVkLmxlZnQ7XG4gICAgbGV0IHgyID0gc2hhcGVkLnJpZ2h0O1xuXG4gICAgY29uc3QgY29sbGlzaW9uUGFkZGluZyA9IHNoYXBlZC5jb2xsaXNpb25QYWRkaW5nO1xuICAgIGlmIChjb2xsaXNpb25QYWRkaW5nKSB7XG4gICAgICAgIHgxIC09IGNvbGxpc2lvblBhZGRpbmdbMF07XG4gICAgICAgIHkxIC09IGNvbGxpc2lvblBhZGRpbmdbMV07XG4gICAgICAgIHgyICs9IGNvbGxpc2lvblBhZGRpbmdbMl07XG4gICAgICAgIHkyICs9IGNvbGxpc2lvblBhZGRpbmdbM107XG4gICAgfVxuXG4gICAgaWYgKHJvdGF0ZSkge1xuICAgICAgICAvLyBBY2NvdW50IGZvciAqLXJvdGF0ZSBpbiBwb2ludCBjb2xsaXNpb24gYm94ZXNcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy82MDc1XG4gICAgICAgIC8vIERvZXNuJ3QgYWNjb3VudCBmb3IgaWNvbi10ZXh0LWZpdFxuXG4gICAgICAgIGNvbnN0IHRsID0gbmV3IFBvaW50KHgxLCB5MSk7XG4gICAgICAgIGNvbnN0IHRyID0gbmV3IFBvaW50KHgyLCB5MSk7XG4gICAgICAgIGNvbnN0IGJsID0gbmV3IFBvaW50KHgxLCB5Mik7XG4gICAgICAgIGNvbnN0IGJyID0gbmV3IFBvaW50KHgyLCB5Mik7XG5cbiAgICAgICAgY29uc3Qgcm90YXRlUmFkaWFucyA9IGRlZ1RvUmFkKHJvdGF0ZSk7XG4gICAgICAgIGxldCByb3RhdGVDZW50ZXIgPSBuZXcgUG9pbnQoMCwgMCk7XG5cbiAgICAgICAgaWYgKHRleHRPZmZzZXQpIHtcbiAgICAgICAgICAgIHJvdGF0ZUNlbnRlciA9IG5ldyBQb2ludCh0ZXh0T2Zmc2V0WzBdLCB0ZXh0T2Zmc2V0WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRsLl9yb3RhdGVBcm91bmQocm90YXRlUmFkaWFucywgcm90YXRlQ2VudGVyKTtcbiAgICAgICAgdHIuX3JvdGF0ZUFyb3VuZChyb3RhdGVSYWRpYW5zLCByb3RhdGVDZW50ZXIpO1xuICAgICAgICBibC5fcm90YXRlQXJvdW5kKHJvdGF0ZVJhZGlhbnMsIHJvdGF0ZUNlbnRlcik7XG4gICAgICAgIGJyLl9yb3RhdGVBcm91bmQocm90YXRlUmFkaWFucywgcm90YXRlQ2VudGVyKTtcblxuICAgICAgICAvLyBDb2xsaXNpb24gZmVhdHVyZXMgcmVxdWlyZSBhbiBcIm9uLWF4aXNcIiBnZW9tZXRyeSxcbiAgICAgICAgLy8gc28gdGFrZSB0aGUgZW52ZWxvcGUgb2YgdGhlIHJvdGF0ZWQgZ2VvbWV0cnlcbiAgICAgICAgLy8gKG1heSBiZSBxdWl0ZSBsYXJnZSBmb3Igd2lkZSBsYWJlbHMgcm90YXRlZCA0NSBkZWdyZWVzKVxuICAgICAgICB4MSA9IE1hdGgubWluKHRsLngsIHRyLngsIGJsLngsIGJyLngpO1xuICAgICAgICB4MiA9IE1hdGgubWF4KHRsLngsIHRyLngsIGJsLngsIGJyLngpO1xuICAgICAgICB5MSA9IE1hdGgubWluKHRsLnksIHRyLnksIGJsLnksIGJyLnkpO1xuICAgICAgICB5MiA9IE1hdGgubWF4KHRsLnksIHRyLnksIGJsLnksIGJyLnkpO1xuICAgIH1cblxuICAgIGNvbGxpc2lvbkJveEFycmF5LmVtcGxhY2VCYWNrKHByb2plY3RlZEFuY2hvci54LCBwcm9qZWN0ZWRBbmNob3IueSwgcHJvamVjdGVkQW5jaG9yLnosIHRpbGVBbmNob3IueCwgdGlsZUFuY2hvci55LCB4MSwgeTEsIHgyLCB5MiwgcGFkZGluZywgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCk7XG5cbiAgICByZXR1cm4gY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoIC0gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQ2lyY2xlQ29sbGlzaW9uRmVhdHVyZShzaGFwZWQ6IE9iamVjdCk6IG51bWJlciB8IG51bGwge1xuICAgIGlmIChzaGFwZWQuY29sbGlzaW9uUGFkZGluZykge1xuICAgICAgICAvLyBDb21wdXRlIGhlaWdodCBvZiB0aGUgc2hhcGUgaW4gZ2x5cGggbWV0cmljcyBhbmQgYXBwbHkgcGFkZGluZy5cbiAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBwaXhlbCBiYXNlZCAndGV4dC1wYWRkaW5nJyBpcyBhcHBsaWVkIGF0IHJ1bnRpbWVcbiAgICAgICAgc2hhcGVkLnRvcCAtPSBzaGFwZWQuY29sbGlzaW9uUGFkZGluZ1sxXTtcbiAgICAgICAgc2hhcGVkLmJvdHRvbSArPSBzaGFwZWQuY29sbGlzaW9uUGFkZGluZ1szXTtcbiAgICB9XG5cbiAgICAvLyBTZXQgbWluaW11bSBib3ggaGVpZ2h0IHRvIGF2b2lkIHZlcnkgbWFueSBzbWFsbCBsYWJlbHNcbiAgICBjb25zdCBoZWlnaHQgPSBzaGFwZWQuYm90dG9tIC0gc2hhcGVkLnRvcDtcbiAgICByZXR1cm4gaGVpZ2h0ID4gMCA/IE1hdGgubWF4KDEwLCBoZWlnaHQpIDogbnVsbDtcbn1cblxuLyoqXG4gKiBBZGQgYSBzaW5nbGUgbGFiZWwgJiBpY29uIHBsYWNlbWVudC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBhZGRTeW1ib2woYnVja2V0OiBTeW1ib2xCdWNrZXQsXG4gICAgICAgICAgICAgICAgICAgYW5jaG9yOiBBbmNob3IsXG4gICAgICAgICAgICAgICAgICAgZ2xvYmU6ID97IGFuY2hvcjogQW5jaG9yLCB1cDogVmVjMyB9LFxuICAgICAgICAgICAgICAgICAgIGxpbmU6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zOiBhbnksXG4gICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbjogUG9zaXRpb25lZEljb24gfCB2b2lkLFxuICAgICAgICAgICAgICAgICAgIGltYWdlTWFwOiB7W186IHN0cmluZ106IFN0eWxlSW1hZ2V9LFxuICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsbHlTaGFwZWRJY29uOiBQb3NpdGlvbmVkSWNvbiB8IHZvaWQsXG4gICAgICAgICAgICAgICAgICAgbGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIHRleHRQYWRkaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgdGV4dEFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICB0ZXh0T2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIGljb25Cb3hTY2FsZTogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgIGljb25QYWRkaW5nOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgaWNvbkFsb25nTGluZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICBpY29uT2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgICAgIGZlYXR1cmU6IFN5bWJvbEZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgc2l6ZXM6IFNpemVzLFxuICAgICAgICAgICAgICAgICAgIGlzU0RGSWNvbjogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sXG4gICAgICAgICAgICAgICAgICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICBjb25zdCBsaW5lQXJyYXkgPSBidWNrZXQuYWRkVG9MaW5lVmVydGV4QXJyYXkoYW5jaG9yLCBsaW5lKTtcbiAgICBsZXQgdGV4dEJveEluZGV4LCBpY29uQm94SW5kZXgsIHZlcnRpY2FsVGV4dEJveEluZGV4LCB2ZXJ0aWNhbEljb25Cb3hJbmRleDtcbiAgICBsZXQgdGV4dENpcmNsZSwgdmVydGljYWxUZXh0Q2lyY2xlLCB2ZXJ0aWNhbEljb25DaXJjbGU7XG5cbiAgICBsZXQgbnVtSWNvblZlcnRpY2VzID0gMDtcbiAgICBsZXQgbnVtVmVydGljYWxJY29uVmVydGljZXMgPSAwO1xuICAgIGxldCBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyA9IDA7XG4gICAgbGV0IG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA9IDA7XG4gICAgbGV0IHBsYWNlZEljb25TeW1ib2xJbmRleCA9IC0xO1xuICAgIGxldCB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCA9IC0xO1xuICAgIGNvbnN0IHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzID0ge307XG4gICAgbGV0IGtleSA9IG11cm11cjMoJycpO1xuICAgIGNvbnN0IGNvbGxpc2lvbkZlYXR1cmVBbmNob3I6IEFuY2hvciA9IGdsb2JlID8gZ2xvYmUuYW5jaG9yIDogYW5jaG9yO1xuXG4gICAgbGV0IHRleHRPZmZzZXQwID0gMDtcbiAgICBsZXQgdGV4dE9mZnNldDEgPSAwO1xuICAgIGlmIChsYXllci5fdW5ldmFsdWF0ZWRMYXlvdXQuZ2V0VmFsdWUoJ3RleHQtcmFkaWFsLW9mZnNldCcpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgW3RleHRPZmZzZXQwLCB0ZXh0T2Zmc2V0MV0gPSAobGF5ZXIubGF5b3V0LmdldCgndGV4dC1vZmZzZXQnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKS5tYXAodCA9PiB0ICogT05FX0VNKTogYW55KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0T2Zmc2V0MCA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtcmFkaWFsLW9mZnNldCcpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpICogT05FX0VNO1xuICAgICAgICB0ZXh0T2Zmc2V0MSA9IElOVkFMSURfVEVYVF9PRkZTRVQ7XG4gICAgfVxuXG4gICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIHNoYXBlZFRleHRPcmllbnRhdGlvbnMudmVydGljYWwpIHtcbiAgICAgICAgY29uc3QgdmVydGljYWxTaGFwaW5nID0gc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbDtcbiAgICAgICAgaWYgKHRleHRBbG9uZ0xpbmUpIHtcbiAgICAgICAgICAgIHZlcnRpY2FsVGV4dENpcmNsZSA9IGV2YWx1YXRlQ2lyY2xlQ29sbGlzaW9uRmVhdHVyZSh2ZXJ0aWNhbFNoYXBpbmcpO1xuICAgICAgICAgICAgaWYgKHZlcnRpY2FsbHlTaGFwZWRJY29uKSB7XG4gICAgICAgICAgICAgICAgdmVydGljYWxJY29uQ2lyY2xlID0gZXZhbHVhdGVDaXJjbGVDb2xsaXNpb25GZWF0dXJlKHZlcnRpY2FsbHlTaGFwZWRJY29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRSb3RhdGlvbiA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtcm90YXRlJykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbFRleHRSb3RhdGlvbiA9IHRleHRSb3RhdGlvbiArIDkwLjA7XG4gICAgICAgICAgICB2ZXJ0aWNhbFRleHRCb3hJbmRleCA9IGV2YWx1YXRlQm94Q29sbGlzaW9uRmVhdHVyZShjb2xsaXNpb25Cb3hBcnJheSwgY29sbGlzaW9uRmVhdHVyZUFuY2hvciwgYW5jaG9yLCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCB2ZXJ0aWNhbFNoYXBpbmcsIHRleHRQYWRkaW5nLCB2ZXJ0aWNhbFRleHRSb3RhdGlvbiwgdGV4dE9mZnNldCk7XG4gICAgICAgICAgICBpZiAodmVydGljYWxseVNoYXBlZEljb24pIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbEljb25Cb3hJbmRleCA9IGV2YWx1YXRlQm94Q29sbGlzaW9uRmVhdHVyZShjb2xsaXNpb25Cb3hBcnJheSwgY29sbGlzaW9uRmVhdHVyZUFuY2hvciwgYW5jaG9yLCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCB2ZXJ0aWNhbGx5U2hhcGVkSWNvbiwgaWNvblBhZGRpbmcsIHZlcnRpY2FsVGV4dFJvdGF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vUGxhY2UgaWNvbiBmaXJzdCwgc28gdGV4dCBjYW4gaGF2ZSBhIHJlZmVyZW5jZSB0byBpdHMgaW5kZXggaW4gdGhlIHBsYWNlZCBzeW1ib2wgYXJyYXkuXG4gICAgLy9UZXh0IHN5bWJvbHMgY2FuIGxhemlseSBzaGlmdCBhdCByZW5kZXItdGltZSBiZWNhdXNlIG9mIHZhcmlhYmxlIGFuY2hvciBwbGFjZW1lbnQuXG4gICAgLy9JZiB0aGUgc3R5bGUgc3BlY2lmaWVzIGFuIGBpY29uLXRleHQtZml0YCB0aGVuIHRoZSBpY29uIHdvdWxkIGhhdmUgdG8gc2hpZnQgYWxvbmcgd2l0aCBpdC5cbiAgICAvLyBGb3IgbW9yZSBpbmZvIGNoZWNrIGB1cGRhdGVWYXJpYWJsZUFuY2hvcnNgIGluIGBkcmF3X3N5bWJvbC5qc2AgLlxuICAgIGlmIChzaGFwZWRJY29uKSB7XG4gICAgICAgIGNvbnN0IGljb25Sb3RhdGUgPSBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXJvdGF0ZScpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpO1xuICAgICAgICBjb25zdCBoYXNJY29uVGV4dEZpdCA9IGxheWVyLmxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKSAhPT0gJ25vbmUnO1xuICAgICAgICBjb25zdCBpY29uUXVhZHMgPSBnZXRJY29uUXVhZHMoc2hhcGVkSWNvbiwgaWNvblJvdGF0ZSwgaXNTREZJY29uLCBoYXNJY29uVGV4dEZpdCk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsSWNvblF1YWRzID0gdmVydGljYWxseVNoYXBlZEljb24gPyBnZXRJY29uUXVhZHModmVydGljYWxseVNoYXBlZEljb24sIGljb25Sb3RhdGUsIGlzU0RGSWNvbiwgaGFzSWNvblRleHRGaXQpIDogdW5kZWZpbmVkO1xuICAgICAgICBpY29uQm94SW5kZXggPSBldmFsdWF0ZUJveENvbGxpc2lvbkZlYXR1cmUoY29sbGlzaW9uQm94QXJyYXksIGNvbGxpc2lvbkZlYXR1cmVBbmNob3IsIGFuY2hvciwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCwgc2hhcGVkSWNvbiwgaWNvblBhZGRpbmcsIGljb25Sb3RhdGUpO1xuICAgICAgICBudW1JY29uVmVydGljZXMgPSBpY29uUXVhZHMubGVuZ3RoICogNDtcblxuICAgICAgICBjb25zdCBzaXplRGF0YSA9IGJ1Y2tldC5pY29uU2l6ZURhdGE7XG4gICAgICAgIGxldCBpY29uU2l6ZURhdGEgPSBudWxsO1xuXG4gICAgICAgIGlmIChzaXplRGF0YS5raW5kID09PSAnc291cmNlJykge1xuICAgICAgICAgICAgaWNvblNpemVEYXRhID0gW1xuICAgICAgICAgICAgICAgIFNJWkVfUEFDS19GQUNUT1IgKiBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXNpemUnKS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChpY29uU2l6ZURhdGFbMF0gPiBNQVhfUEFDS0VEX1NJWkUpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZShgJHtidWNrZXQubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJpY29uLXNpemVcIiBpcyA+PSAke01BWF9HTFlQSF9JQ09OX1NJWkV9LiBSZWR1Y2UgeW91ciBcImljb24tc2l6ZVwiLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNpemVEYXRhLmtpbmQgPT09ICdjb21wb3NpdGUnKSB7XG4gICAgICAgICAgICBpY29uU2l6ZURhdGEgPSBbXG4gICAgICAgICAgICAgICAgU0laRV9QQUNLX0ZBQ1RPUiAqIHNpemVzLmNvbXBvc2l0ZUljb25TaXplc1swXS5ldmFsdWF0ZShmZWF0dXJlLCB7fSwgY2Fub25pY2FsKSxcbiAgICAgICAgICAgICAgICBTSVpFX1BBQ0tfRkFDVE9SICogc2l6ZXMuY29tcG9zaXRlSWNvblNpemVzWzFdLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwpXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKGljb25TaXplRGF0YVswXSA+IE1BWF9QQUNLRURfU0laRSB8fCBpY29uU2l6ZURhdGFbMV0gPiBNQVhfUEFDS0VEX1NJWkUpIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZShgJHtidWNrZXQubGF5ZXJJZHNbMF19OiBWYWx1ZSBmb3IgXCJpY29uLXNpemVcIiBpcyA+PSAke01BWF9HTFlQSF9JQ09OX1NJWkV9LiBSZWR1Y2UgeW91ciBcImljb24tc2l6ZVwiLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnVja2V0LmFkZFN5bWJvbHMoXG4gICAgICAgICAgICBidWNrZXQuaWNvbixcbiAgICAgICAgICAgIGljb25RdWFkcyxcbiAgICAgICAgICAgIGljb25TaXplRGF0YSxcbiAgICAgICAgICAgIGljb25PZmZzZXQsXG4gICAgICAgICAgICBpY29uQWxvbmdMaW5lLFxuICAgICAgICAgICAgZmVhdHVyZSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgZ2xvYmUsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBsaW5lQXJyYXkubGluZVN0YXJ0SW5kZXgsXG4gICAgICAgICAgICBsaW5lQXJyYXkubGluZUxlbmd0aCxcbiAgICAgICAgICAgIC8vIFRoZSBpY29uIGl0c2VsZiBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgc3ltYm9sIHNpbmNlIHRoZSB0ZXh0IGlzbnQgcGxhY2VkIHlldFxuICAgICAgICAgICAgLTEsXG4gICAgICAgICAgICBhdmFpbGFibGVJbWFnZXMsXG4gICAgICAgICAgICBjYW5vbmljYWwpO1xuXG4gICAgICAgIHBsYWNlZEljb25TeW1ib2xJbmRleCA9IGJ1Y2tldC5pY29uLnBsYWNlZFN5bWJvbEFycmF5Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgaWYgKHZlcnRpY2FsSWNvblF1YWRzKSB7XG4gICAgICAgICAgICBudW1WZXJ0aWNhbEljb25WZXJ0aWNlcyA9IHZlcnRpY2FsSWNvblF1YWRzLmxlbmd0aCAqIDQ7XG5cbiAgICAgICAgICAgIGJ1Y2tldC5hZGRTeW1ib2xzKFxuICAgICAgICAgICAgICAgIGJ1Y2tldC5pY29uLFxuICAgICAgICAgICAgICAgIHZlcnRpY2FsSWNvblF1YWRzLFxuICAgICAgICAgICAgICAgIGljb25TaXplRGF0YSxcbiAgICAgICAgICAgICAgICBpY29uT2Zmc2V0LFxuICAgICAgICAgICAgICAgIGljb25BbG9uZ0xpbmUsXG4gICAgICAgICAgICAgICAgZmVhdHVyZSxcbiAgICAgICAgICAgICAgICBXcml0aW5nTW9kZS52ZXJ0aWNhbCxcbiAgICAgICAgICAgICAgICBnbG9iZSxcbiAgICAgICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICAgICAgbGluZUFycmF5LmxpbmVTdGFydEluZGV4LFxuICAgICAgICAgICAgICAgIGxpbmVBcnJheS5saW5lTGVuZ3RoLFxuICAgICAgICAgICAgICAgIC8vIFRoZSBpY29uIGl0c2VsZiBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgc3ltYm9sIHNpbmNlIHRoZSB0ZXh0IGlzbnQgcGxhY2VkIHlldFxuICAgICAgICAgICAgICAgIC0xLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJsZUltYWdlcyxcbiAgICAgICAgICAgICAgICBjYW5vbmljYWwpO1xuXG4gICAgICAgICAgICB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCA9IGJ1Y2tldC5pY29uLnBsYWNlZFN5bWJvbEFycmF5Lmxlbmd0aCAtIDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGp1c3RpZmljYXRpb246IGFueSBpbiBzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWwpIHtcbiAgICAgICAgY29uc3Qgc2hhcGluZyA9IHNoYXBlZFRleHRPcmllbnRhdGlvbnMuaG9yaXpvbnRhbFtqdXN0aWZpY2F0aW9uXTtcblxuICAgICAgICBpZiAoIXRleHRCb3hJbmRleCkge1xuICAgICAgICAgICAga2V5ID0gbXVybXVyMyhzaGFwaW5nLnRleHQpO1xuICAgICAgICAgICAgLy8gQXMgYSBjb2xsaXNpb24gYXBwcm94aW1hdGlvbiwgd2UgY2FuIHVzZSBlaXRoZXIgdGhlIHZlcnRpY2FsIG9yIGFueSBvZiB0aGUgaG9yaXpvbnRhbCB2ZXJzaW9ucyBvZiB0aGUgZmVhdHVyZVxuICAgICAgICAgICAgLy8gV2UncmUgY291bnRpbmcgb24gYWxsIHZlcnNpb25zIGhhdmluZyBzaW1pbGFyIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICh0ZXh0QWxvbmdMaW5lKSB7XG4gICAgICAgICAgICAgICAgdGV4dENpcmNsZSA9IGV2YWx1YXRlQ2lyY2xlQ29sbGlzaW9uRmVhdHVyZShzaGFwaW5nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dFJvdGF0ZSA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtcm90YXRlJykuZXZhbHVhdGUoZmVhdHVyZSwge30sIGNhbm9uaWNhbCk7XG4gICAgICAgICAgICAgICAgdGV4dEJveEluZGV4ID0gZXZhbHVhdGVCb3hDb2xsaXNpb25GZWF0dXJlKGNvbGxpc2lvbkJveEFycmF5LCBjb2xsaXNpb25GZWF0dXJlQW5jaG9yLCBhbmNob3IsIGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgsIHNoYXBpbmcsIHRleHRQYWRkaW5nLCB0ZXh0Um90YXRlLCB0ZXh0T2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpbmdsZUxpbmUgPSBzaGFwaW5nLnBvc2l0aW9uZWRMaW5lcy5sZW5ndGggPT09IDE7XG4gICAgICAgIG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzICs9IGFkZFRleHRWZXJ0aWNlcyhcbiAgICAgICAgICAgIGJ1Y2tldCwgZ2xvYmUsIGFuY2hvciwgc2hhcGluZywgaW1hZ2VNYXAsIGxheWVyLCB0ZXh0QWxvbmdMaW5lLCBmZWF0dXJlLCB0ZXh0T2Zmc2V0LCBsaW5lQXJyYXksXG4gICAgICAgICAgICBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsID8gV3JpdGluZ01vZGUuaG9yaXpvbnRhbCA6IFdyaXRpbmdNb2RlLmhvcml6b250YWxPbmx5LFxuICAgICAgICAgICAgc2luZ2xlTGluZSA/IChPYmplY3Qua2V5cyhzaGFwZWRUZXh0T3JpZW50YXRpb25zLmhvcml6b250YWwpOiBhbnkpIDogW2p1c3RpZmljYXRpb25dLFxuICAgICAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMsIHBsYWNlZEljb25TeW1ib2xJbmRleCwgc2l6ZXMsIGF2YWlsYWJsZUltYWdlcywgY2Fub25pY2FsKTtcblxuICAgICAgICBpZiAoc2luZ2xlTGluZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hhcGVkVGV4dE9yaWVudGF0aW9ucy52ZXJ0aWNhbCkge1xuICAgICAgICBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMgKz0gYWRkVGV4dFZlcnRpY2VzKFxuICAgICAgICAgICAgYnVja2V0LCBnbG9iZSwgYW5jaG9yLCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLnZlcnRpY2FsLCBpbWFnZU1hcCwgbGF5ZXIsIHRleHRBbG9uZ0xpbmUsIGZlYXR1cmUsXG4gICAgICAgICAgICB0ZXh0T2Zmc2V0LCBsaW5lQXJyYXksIFdyaXRpbmdNb2RlLnZlcnRpY2FsLCBbJ3ZlcnRpY2FsJ10sIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLCB2ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCwgc2l6ZXMsIGF2YWlsYWJsZUltYWdlcywgY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBydW50aW1lIGNvbGxpc2lvbiBjaXJjbGVzIHNob3VsZCBiZSB1c2VkIGZvciBhbnkgb2YgdGhlIGNvbGxpc2lvbiBmZWF0dXJlcy5cbiAgICAvLyBJdCBpcyBlbm91Z2ggdG8gY2hvb3NlIHRoZSB0YWxsZXN0IGZlYXR1cmUgc2hhcGUgYXMgY2lyY2xlcyBhcmUgYWx3YXlzIHBsYWNlZCBvbiBhIGxpbmUuXG4gICAgLy8gQWxsIG1lYXN1cmVtZW50cyBhcmUgaW4gZ2x5cGggbWV0cmljcyBhbmQgbGF0ZXIgY29udmVydGVkIGludG8gcGl4ZWxzIHVzaW5nIHByb3BlciBmb250IHNpemUgXCJsYXlvdXRUZXh0U2l6ZVwiXG4gICAgbGV0IGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyID0gLTE7XG5cbiAgICBjb25zdCBnZXRDb2xsaXNpb25DaXJjbGVIZWlnaHQgPSAoZGlhbWV0ZXI6ID9udW1iZXIsIHByZXZIZWlnaHQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiBkaWFtZXRlciA/IE1hdGgubWF4KGRpYW1ldGVyLCBwcmV2SGVpZ2h0KSA6IHByZXZIZWlnaHQ7XG4gICAgfTtcblxuICAgIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyID0gZ2V0Q29sbGlzaW9uQ2lyY2xlSGVpZ2h0KHRleHRDaXJjbGUsIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyKTtcbiAgICBjb2xsaXNpb25DaXJjbGVEaWFtZXRlciA9IGdldENvbGxpc2lvbkNpcmNsZUhlaWdodCh2ZXJ0aWNhbFRleHRDaXJjbGUsIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyKTtcbiAgICBjb2xsaXNpb25DaXJjbGVEaWFtZXRlciA9IGdldENvbGxpc2lvbkNpcmNsZUhlaWdodCh2ZXJ0aWNhbEljb25DaXJjbGUsIGNvbGxpc2lvbkNpcmNsZURpYW1ldGVyKTtcbiAgICBjb25zdCB1c2VSdW50aW1lQ29sbGlzaW9uQ2lyY2xlcyA9IChjb2xsaXNpb25DaXJjbGVEaWFtZXRlciA+IC0xKSA/IDEgOiAwO1xuXG4gICAgaWYgKGJ1Y2tldC5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCA+PSBTeW1ib2xCdWNrZXQuTUFYX0dMWVBIUykgd2Fybk9uY2UoXG4gICAgICAgIFwiVG9vIG1hbnkgZ2x5cGhzIGJlaW5nIHJlbmRlcmVkIGluIGEgdGlsZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTA3XCJcbiAgICApO1xuXG4gICAgaWYgKGZlYXR1cmUuc29ydEtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJ1Y2tldC5hZGRUb1NvcnRLZXlSYW5nZXMoYnVja2V0LnN5bWJvbEluc3RhbmNlcy5sZW5ndGgsIGZlYXR1cmUuc29ydEtleSk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdGVkQW5jaG9yID0gY29sbGlzaW9uRmVhdHVyZUFuY2hvcjtcblxuICAgIGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMuZW1wbGFjZUJhY2soXG4gICAgICAgIHByb2plY3RlZEFuY2hvci54LFxuICAgICAgICBwcm9qZWN0ZWRBbmNob3IueSxcbiAgICAgICAgcHJvamVjdGVkQW5jaG9yLnosXG4gICAgICAgIGFuY2hvci54LFxuICAgICAgICBhbmNob3IueSxcbiAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMucmlnaHQgPj0gMCA/IHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLnJpZ2h0IDogLTEsXG4gICAgICAgIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLmNlbnRlciA+PSAwID8gcGxhY2VkVGV4dFN5bWJvbEluZGljZXMuY2VudGVyIDogLTEsXG4gICAgICAgIHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLmxlZnQgPj0gMCA/IHBsYWNlZFRleHRTeW1ib2xJbmRpY2VzLmxlZnQgOiAtMSxcbiAgICAgICAgcGxhY2VkVGV4dFN5bWJvbEluZGljZXMudmVydGljYWwgID49IDAgPyBwbGFjZWRUZXh0U3ltYm9sSW5kaWNlcy52ZXJ0aWNhbCA6IC0xLFxuICAgICAgICBwbGFjZWRJY29uU3ltYm9sSW5kZXgsXG4gICAgICAgIHZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4LFxuICAgICAgICBrZXksXG4gICAgICAgIHRleHRCb3hJbmRleCAhPT0gdW5kZWZpbmVkID8gdGV4dEJveEluZGV4IDogYnVja2V0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgdGV4dEJveEluZGV4ICE9PSB1bmRlZmluZWQgPyB0ZXh0Qm94SW5kZXggKyAxIDogYnVja2V0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgdmVydGljYWxUZXh0Qm94SW5kZXggIT09IHVuZGVmaW5lZCA/IHZlcnRpY2FsVGV4dEJveEluZGV4IDogYnVja2V0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgdmVydGljYWxUZXh0Qm94SW5kZXggIT09IHVuZGVmaW5lZCA/IHZlcnRpY2FsVGV4dEJveEluZGV4ICsgMSA6IGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsXG4gICAgICAgIGljb25Cb3hJbmRleCAhPT0gdW5kZWZpbmVkID8gaWNvbkJveEluZGV4IDogYnVja2V0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgaWNvbkJveEluZGV4ICE9PSB1bmRlZmluZWQgPyBpY29uQm94SW5kZXggKyAxIDogYnVja2V0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgdmVydGljYWxJY29uQm94SW5kZXggPyB2ZXJ0aWNhbEljb25Cb3hJbmRleCA6IGJ1Y2tldC5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGgsXG4gICAgICAgIHZlcnRpY2FsSWNvbkJveEluZGV4ID8gdmVydGljYWxJY29uQm94SW5kZXggKyAxIDogYnVja2V0LmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aCxcbiAgICAgICAgZmVhdHVyZUluZGV4LFxuICAgICAgICBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyxcbiAgICAgICAgbnVtVmVydGljYWxHbHlwaFZlcnRpY2VzLFxuICAgICAgICBudW1JY29uVmVydGljZXMsXG4gICAgICAgIG51bVZlcnRpY2FsSWNvblZlcnRpY2VzLFxuICAgICAgICB1c2VSdW50aW1lQ29sbGlzaW9uQ2lyY2xlcyxcbiAgICAgICAgMCxcbiAgICAgICAgdGV4dE9mZnNldDAsXG4gICAgICAgIHRleHRPZmZzZXQxLFxuICAgICAgICBjb2xsaXNpb25DaXJjbGVEaWFtZXRlcik7XG59XG5cbmZ1bmN0aW9uIGFuY2hvcklzVG9vQ2xvc2UoYnVja2V0OiBhbnksIHRleHQ6IHN0cmluZywgcmVwZWF0RGlzdGFuY2U6IG51bWJlciwgYW5jaG9yOiBQb2ludCkge1xuICAgIGNvbnN0IGNvbXBhcmVUZXh0ID0gYnVja2V0LmNvbXBhcmVUZXh0O1xuICAgIGlmICghKHRleHQgaW4gY29tcGFyZVRleHQpKSB7XG4gICAgICAgIGNvbXBhcmVUZXh0W3RleHRdID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgb3RoZXJBbmNob3JzID0gY29tcGFyZVRleHRbdGV4dF07XG4gICAgICAgIGZvciAobGV0IGsgPSBvdGhlckFuY2hvcnMubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHtcbiAgICAgICAgICAgIGlmIChhbmNob3IuZGlzdChvdGhlckFuY2hvcnNba10pIDwgcmVwZWF0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIHdpdGhpbiByZXBlYXREaXN0YW5jZSBvZiBvbmUgYW5jaG9yLCBzdG9wIGxvb2tpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBhbmNob3IgaXMgbm90IHdpdGhpbiByZXBlYXREaXN0YW5jZSBvZiBhbnkgb3RoZXIgYW5jaG9yLCBhZGQgdG8gYXJyYXlcbiAgICBjb21wYXJlVGV4dFt0ZXh0XS5wdXNoKGFuY2hvcik7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7Y3JlYXRlTGF5b3V0fSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmltcG9ydCB0eXBlIHtTdHJ1Y3RBcnJheUxheW91dH0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5jb25zdCBsYXlvdXQ6IFN0cnVjdEFycmF5TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnYV9nbG9iZV9wb3MnLCBjb21wb25lbnRzOiAzfSxcbiAgICB7dHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnYV9tZXJjX3BvcycsIGNvbXBvbmVudHM6IDJ9LFxuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdhX3V2JywgY29tcG9uZW50czogMn1cbl0pO1xuXG5leHBvcnQgZGVmYXVsdCBsYXlvdXQ7XG5leHBvcnQgY29uc3Qge21lbWJlcnMsIHNpemUsIGFsaWdubWVudH0gPSBsYXlvdXQ7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtjcmVhdGVMYXlvdXR9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcblxuaW1wb3J0IHR5cGUge1N0cnVjdEFycmF5TGF5b3V0fSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmV4cG9ydCBjb25zdCBwb3NBdHRyaWJ1dGVzR2xvYmVFeHQ6IFN0cnVjdEFycmF5TGF5b3V0ID0gY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zXzMnLCBjb21wb25lbnRzOiAzLCB0eXBlOiAnSW50MTYnfSxcbl0pO1xuXG5leHBvcnQgZGVmYXVsdCAoY3JlYXRlTGF5b3V0KFtcbiAgICB7bmFtZTogJ2FfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMn1cbl0pOiBTdHJ1Y3RBcnJheUxheW91dCk7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge1xuICAgIGxuZ0Zyb21NZXJjYXRvclgsXG4gICAgbGF0RnJvbU1lcmNhdG9yWSxcbiAgICBtZXJjYXRvclpmcm9tQWx0aXR1ZGUsXG4gICAgbWVyY2F0b3JYZnJvbUxuZyxcbiAgICBtZXJjYXRvcllmcm9tTGF0LFxuICAgIE1BWF9NRVJDQVRPUl9MQVRJVFVERVxufSBmcm9tICcuLi9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vLi4vZGF0YS9leHRlbnQuanMnO1xuaW1wb3J0IHtudW1iZXIgYXMgaW50ZXJwb2xhdGV9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQge2RlZ1RvUmFkLCByYWRUb0RlZywgY2xhbXAsIHNtb290aHN0ZXAsIGdldENvbHVtbiwgc2hvcnRlc3RBbmdsZX0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7dmVjMywgdmVjNCwgbWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uLy4uL2RhdGEvc2VnbWVudC5qcyc7XG5pbXBvcnQge21lbWJlcnMgYXMgZ2xvYmVMYXlvdXRBdHRyaWJ1dGVzfSBmcm9tICcuLi8uLi90ZXJyYWluL2dsb2JlX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHBvc0F0dHJpYnV0ZXMgZnJvbSAnLi4vLi4vZGF0YS9wb3NfYXR0cmlidXRlcy5qcyc7XG5pbXBvcnQge1RyaWFuZ2xlSW5kZXhBcnJheSwgR2xvYmVWZXJ0ZXhBcnJheSwgTGluZUluZGV4QXJyYXksIFBvc0FycmF5fSBmcm9tICcuLi8uLi9kYXRhL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB7QWFiYiwgUmF5fSBmcm9tICcuLi8uLi91dGlsL3ByaW1pdGl2ZXMuanMnO1xuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuLi9sbmdfbGF0X2JvdW5kcy5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uLy4uL3JlbmRlci9wYWludGVyLmpzJztcblxuaW1wb3J0IHR5cGUgTG5nTGF0IGZyb20gJy4uL2xuZ19sYXQuanMnO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRCwgVW53cmFwcGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1ZlYzMsIE1hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi8uLi9nbC9pbmRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL3ZlcnRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmV4cG9ydCBjb25zdCBHTE9CRV9aT09NX1RIUkVTSE9MRF9NSU4gPSA1O1xuZXhwb3J0IGNvbnN0IEdMT0JFX1pPT01fVEhSRVNIT0xEX01BWCA9IDY7XG5cbi8vIEF0IGxvdyB6b29tIGxldmVscyB0aGUgZ2xvYmUgZ2V0cyByZW5kZXJlZCBzbyB0aGF0IHRoZSBzY2FsZSBhdCB0aGlzXG4vLyBsYXRpdHVkZSBtYXRjaGVzIGl0J3Mgc2NhbGUgaW4gYSBtZXJjYXRvciBtYXAuIFRoZSBjaG9pY2Ugb2YgbGF0aXR1ZGUgaXNcbi8vIGEgYml0IGFyYml0cmFyeS4gRGlmZmVyZW50IGNob2ljZXMgd2lsbCBtYXRjaCBtZXJjYXRvciBtb3JlIGNsb3NlbHkgaW4gZGlmZmVyZW50XG4vLyB2aWV3cy4gNDUgaXMgYSBnb29kIGVub3VnaCBjaG9pY2UgYmVjYXVzZTpcbi8vIC0gaXQncyBoYWxmIHdheSBmcm9tIHRoZSBwb2xlIHRvIHRoZSBlcXVhdG9yXG4vLyAtIG1hdGNoZXMgbW9zdCBtaWRkbGUgbGF0aXR1ZGVzIHJlYXNvbmFibHkgd2VsbFxuLy8gLSBiaWFzZXMgdG93YXJkcyBpbmNyZWFzaW5nIHNpemUgcmF0aGVyIHRoYW4gZGVjcmVhc2luZ1xuLy8gLSBtYWtlcyB0aGUgZ2xvYmUgc2xpZ2h0bHkgbGFyZ2VyIGF0IHZlcnkgbG93IHpvb20gbGV2ZWxzLCB3aGVyZSBpdCBhbHJlYWR5XG4vLyAgIGNvdmVycyBsZXNzIHBpeGVscyB0aGFuIG1lcmNhdG9yIChkdWUgdG8gdGhlIGN1cnZlZCBzdXJmYWNlKVxuLy9cbi8vICAgQ2hhbmdpbmcgdGhpcyB2YWx1ZSB3aWxsIGNoYW5nZSBob3cgbGFyZ2UgYSBnbG9iZSBpcyByZW5kZXJlZCBhbmQgY291bGQgYWZmZWN0XG4vLyAgIGVuZCB1c2Vycy4gVGhpcyBzaG91bGQgb25seSBiZSBkb25lIG9mIHRoZSB0cmFkZW9mZnMgYmV0d2VlbiBjaGFuZ2UgYW5kIGltcHJvdmVtZW50XG4vLyAgIGFyZSBjYXJlZnVsbHkgY29uc2lkZXJlZC5cbmV4cG9ydCBjb25zdCBHTE9CRV9TQ0FMRV9NQVRDSF9MQVRJVFVERSA9IDQ1O1xuXG5leHBvcnQgY29uc3QgR0xPQkVfUkFESVVTID0gRVhURU5UIC8gTWF0aC5QSSAvIDIuMDtcbmV4cG9ydCBjb25zdCBHTE9CRV9NRVRFUlNfVE9fRUNFRiA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCAwLjApICogMi4wICogR0xPQkVfUkFESVVTICogTWF0aC5QSTtcbmNvbnN0IEdMT0JFX05PUk1BTElaQVRJT05fQklUX1JBTkdFID0gMTU7XG5jb25zdCBHTE9CRV9OT1JNQUxJWkFUSU9OX01BU0sgPSAoMSA8PCAoR0xPQkVfTk9STUFMSVpBVElPTl9CSVRfUkFOR0UgLSAxKSkgLSAxO1xuY29uc3QgR0xPQkVfVkVSVEVYX0dSSURfU0laRSA9IDY0O1xuY29uc3QgR0xPQkVfTEFUSVRVRElOQUxfR1JJRF9MT0RfVEFCTEUgPSBbR0xPQkVfVkVSVEVYX0dSSURfU0laRSwgR0xPQkVfVkVSVEVYX0dSSURfU0laRSAvIDIsIEdMT0JFX1ZFUlRFWF9HUklEX1NJWkUgLyA0XTtcbmNvbnN0IFRJTEVfU0laRSA9IDUxMjtcblxuY29uc3QgR0xPQkVfTUlOID0gLUdMT0JFX1JBRElVUztcbmNvbnN0IEdMT0JFX01BWCA9IEdMT0JFX1JBRElVUztcblxuY29uc3QgR0xPQkVfTE9XX1pPT01fVElMRV9BQUJCUyA9IFtcbiAgICAvLyB6ID09IDBcbiAgICBuZXcgQWFiYihbR0xPQkVfTUlOLCBHTE9CRV9NSU4sIEdMT0JFX01JTl0sIFtHTE9CRV9NQVgsIEdMT0JFX01BWCwgR0xPQkVfTUFYXSksXG4gICAgLy8geiA9PSAxXG4gICAgbmV3IEFhYmIoW0dMT0JFX01JTiwgR0xPQkVfTUlOLCBHTE9CRV9NSU5dLCBbMCwgMCwgR0xPQkVfTUFYXSksIC8vIHg9MCwgeT0wXG4gICAgbmV3IEFhYmIoWzAsIEdMT0JFX01JTiwgR0xPQkVfTUlOXSwgW0dMT0JFX01BWCwgMCwgR0xPQkVfTUFYXSksIC8vIHg9MSwgeT0wXG4gICAgbmV3IEFhYmIoW0dMT0JFX01JTiwgMCwgR0xPQkVfTUlOXSwgWzAsIEdMT0JFX01BWCwgR0xPQkVfTUFYXSksIC8vIHg9MCwgeT0xXG4gICAgbmV3IEFhYmIoWzAsIDAsIEdMT0JFX01JTl0sIFtHTE9CRV9NQVgsIEdMT0JFX01BWCwgR0xPQkVfTUFYXSkgIC8vIHg9MSwgeT0xXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2xvYmVQb2ludENvb3JkaW5hdGUodHI6IFRyYW5zZm9ybSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGNsYW1wVG9Ib3Jpem9uOiBib29sZWFuID0gdHJ1ZSk6ID9NZXJjYXRvckNvb3JkaW5hdGUge1xuICAgIGNvbnN0IHBvaW50MCA9IHZlYzMuc2NhbGUoW10sIHRyLl9jYW1lcmEucG9zaXRpb24sIHRyLndvcmxkU2l6ZSk7XG4gICAgY29uc3QgcG9pbnQxID0gW3gsIHksIDEsIDFdO1xuXG4gICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHBvaW50MSwgcG9pbnQxLCB0ci5waXhlbE1hdHJpeEludmVyc2UpO1xuICAgIHZlYzQuc2NhbGUocG9pbnQxLCBwb2ludDEsIDEgLyBwb2ludDFbM10pO1xuXG4gICAgY29uc3QgcDBwMSA9IHZlYzMuc3ViKFtdLCBwb2ludDEsIHBvaW50MCk7XG4gICAgY29uc3QgZGlyID0gdmVjMy5ub3JtYWxpemUoW10sIHAwcDEpO1xuXG4gICAgLy8gRmluZCBjbG9zZXN0IHBvaW50IG9uIHRoZSBzcGhlcmUgdG8gdGhlIHJheS4gVGhpcyBpcyBhIGJpdCBtb3JlIGludm9sdmluZyBvcGVyYXRpb25cbiAgICAvLyBpZiB0aGUgcmF5IGlzIG5vdCBpbnRlcnNlY3Rpbmcgd2l0aCB0aGUgc3BoZXJlLCBpbiB3aGljaCBjYXNlIHdlIFwiY2xhbXBcIiB0aGUgcmF5XG4gICAgLy8gdG8gdGhlIHN1cmZhY2Ugb2YgdGhlIHNwaGVyZSwgaS5lLiBmaW5kIGEgdGFuZ2VudCB2ZWN0b3IgdGhhdCBvcmlnaW5hdGVzIGZyb20gdGhlIGNhbWVyYSBwb3NpdGlvblxuICAgIGNvbnN0IG0gPSB0ci5nbG9iZU1hdHJpeDtcbiAgICBjb25zdCBnbG9iZUNlbnRlciA9IFttWzEyXSwgbVsxM10sIG1bMTRdXTtcbiAgICBjb25zdCBwMHRvQ2VudGVyID0gdmVjMy5zdWIoW10sIGdsb2JlQ2VudGVyLCBwb2ludDApO1xuICAgIGNvbnN0IHAwdG9DZW50ZXJEaXN0ID0gdmVjMy5sZW5ndGgocDB0b0NlbnRlcik7XG4gICAgY29uc3QgY2VudGVyRGlyID0gdmVjMy5ub3JtYWxpemUoW10sIHAwdG9DZW50ZXIpO1xuICAgIGNvbnN0IHJhZGl1cyA9IHRyLndvcmxkU2l6ZSAvICgyLjAgKiBNYXRoLlBJKTtcbiAgICBjb25zdCBjb3NBbmdsZSA9IHZlYzMuZG90KGNlbnRlckRpciwgZGlyKTtcblxuICAgIGNvbnN0IG9yaWdvVGFuZ2VudEFuZ2xlID0gTWF0aC5hc2luKHJhZGl1cyAvIHAwdG9DZW50ZXJEaXN0KTtcbiAgICBjb25zdCBvcmlnb0RpckFuZ2xlID0gTWF0aC5hY29zKGNvc0FuZ2xlKTtcblxuICAgIGlmIChvcmlnb1RhbmdlbnRBbmdsZSA8IG9yaWdvRGlyQW5nbGUpIHtcbiAgICAgICAgaWYgKCFjbGFtcFRvSG9yaXpvbikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gRmluZCB0aGUgdGFuZ2VudCB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyBiZXR3ZWVuIGNhbWVyYS10by1nbG9iZSBhbmQgY2FtZXJhLXRvLWNsaWNrIHZlY3RvcnMuXG4gICAgICAgIC8vIEZpcnN0IHdlJ2xsIGZpbmQgYSBwb2ludCBQMSBvbiB0aGUgY2xpY2tlZCByYXkgdGhhdCBmb3JtcyBhIHJpZ2h0LWFuZ2xlZCB0cmlhbmdsZSB3aXRoIHRoZSBjYW1lcmEgcG9zaXRpb25cbiAgICAgICAgLy8gYW5kIHRoZSBjZW50ZXIgb2YgdGhlIGdsb2JlLiBBbmdsZSBvZiB0aGUgdGFuZ2V0IHZlY3RvciBpcyB0aGVuIHVzZWQgYXMgdGhlIGludGVycG9sYXRpb24gZmFjdG9yXG4gICAgICAgIGNvbnN0IGNsYW1wZWRQMSA9IFtdLCBvcmlnb1RvUDEgPSBbXTtcblxuICAgICAgICB2ZWMzLnNjYWxlKGNsYW1wZWRQMSwgZGlyLCBwMHRvQ2VudGVyRGlzdCAvIGNvc0FuZ2xlKTtcbiAgICAgICAgdmVjMy5ub3JtYWxpemUob3JpZ29Ub1AxLCB2ZWMzLnN1Yihvcmlnb1RvUDEsIGNsYW1wZWRQMSwgcDB0b0NlbnRlcikpO1xuICAgICAgICB2ZWMzLm5vcm1hbGl6ZShkaXIsIHZlYzMuYWRkKGRpciwgcDB0b0NlbnRlciwgdmVjMy5zY2FsZShkaXIsIG9yaWdvVG9QMSwgTWF0aC50YW4ob3JpZ29UYW5nZW50QW5nbGUpICogcDB0b0NlbnRlckRpc3QpKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9pbnRPbkdsb2JlID0gW107XG4gICAgY29uc3QgcmF5ID0gbmV3IFJheShwb2ludDAsIGRpcik7XG5cbiAgICByYXkuY2xvc2VzdFBvaW50T25TcGhlcmUoZ2xvYmVDZW50ZXIsIHJhZGl1cywgcG9pbnRPbkdsb2JlKTtcblxuICAgIC8vIFRyYW5zZm9ybSBjb29yZGluYXRlIGF4ZXMgdG8gZmluZCBsYXQgJiBsbmcgb2YgdGhlIHBvc2l0aW9uXG4gICAgY29uc3QgeGEgPSB2ZWMzLm5vcm1hbGl6ZShbXSwgZ2V0Q29sdW1uKG0sIDApKTtcbiAgICBjb25zdCB5YSA9IHZlYzMubm9ybWFsaXplKFtdLCBnZXRDb2x1bW4obSwgMSkpO1xuICAgIGNvbnN0IHphID0gdmVjMy5ub3JtYWxpemUoW10sIGdldENvbHVtbihtLCAyKSk7XG5cbiAgICBjb25zdCB4cCA9IHZlYzMuZG90KHhhLCBwb2ludE9uR2xvYmUpO1xuICAgIGNvbnN0IHlwID0gdmVjMy5kb3QoeWEsIHBvaW50T25HbG9iZSk7XG4gICAgY29uc3QgenAgPSB2ZWMzLmRvdCh6YSwgcG9pbnRPbkdsb2JlKTtcblxuICAgIGNvbnN0IGxhdCA9IHJhZFRvRGVnKE1hdGguYXNpbigteXAgLyByYWRpdXMpKTtcbiAgICBsZXQgbG5nID0gcmFkVG9EZWcoTWF0aC5hdGFuMih4cCwgenApKTtcblxuICAgIC8vIENoZWNrIHRoYXQgdGhlIHJldHVybmVkIGxvbmdpdHVkZSBhbmdsZSBpcyBub3Qgd3JhcHBlZFxuICAgIGxuZyA9IHRyLmNlbnRlci5sbmcgKyBzaG9ydGVzdEFuZ2xlKHRyLmNlbnRlci5sbmcsIGxuZyk7XG5cbiAgICBjb25zdCBteCA9IG1lcmNhdG9yWGZyb21MbmcobG5nKTtcbiAgICBjb25zdCBteSA9IGNsYW1wKG1lcmNhdG9yWWZyb21MYXQobGF0KSwgMCwgMSk7XG5cbiAgICByZXR1cm4gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShteCwgbXkpO1xufVxuXG5leHBvcnQgY2xhc3MgQXJjIHtcbiAgICBjb25zdHJ1Y3RvcihwMDogVmVjMywgcDE6IFZlYzMsIGNlbnRlcjogVmVjMykge1xuICAgICAgICB0aGlzLmEgPSB2ZWMzLnN1YihbXSwgcDAsIGNlbnRlcik7XG4gICAgICAgIHRoaXMuYiA9IHZlYzMuc3ViKFtdLCBwMSwgY2VudGVyKTtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSBjZW50ZXI7XG4gICAgICAgIGNvbnN0IGFuID0gdmVjMy5ub3JtYWxpemUoW10sIHRoaXMuYSk7XG4gICAgICAgIGNvbnN0IGJuID0gdmVjMy5ub3JtYWxpemUoW10sIHRoaXMuYik7XG4gICAgICAgIHRoaXMuYW5nbGUgPSBNYXRoLmFjb3ModmVjMy5kb3QoYW4sIGJuKSk7XG4gICAgfVxuXG4gICAgYTogVmVjMztcbiAgICBiOiBWZWMzO1xuICAgIGNlbnRlcjogVmVjMztcbiAgICBhbmdsZTogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xlcnAoYTogbnVtYmVyLCBiOiBudW1iZXIsIGFuZ2xlOiBudW1iZXIsIHQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc2luYSA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICByZXR1cm4gYSAqIChNYXRoLnNpbigoMS4wIC0gdCkgKiBhbmdsZSkgLyBzaW5hKSArIGIgKiAoTWF0aC5zaW4odCAqIGFuZ2xlKSAvIHNpbmEpO1xufVxuXG4vLyBDb21wdXRlcyBsb2NhbCBleHRyZW11bSBwb2ludCBvZiBhbiBhcmMgb24gb25lIG9mIHRoZSBkaW1lbnNpb25zICh4LCB5IG9yIHopLFxuLy8gaS5lLiB2YWx1ZSBvZiBhIHBvaW50IHdoZXJlIGQvZHQqZih4LHksdCkgPT0gMFxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsRXh0cmVtdW0oYXJjOiBBcmMsIGRpbTogbnVtYmVyKTogP251bWJlciB7XG4gICAgLy8gZC9kdCpzbGVycCh4LHksdCkgPSAwXG4gICAgLy8gPT4gdCA9ICgxL2EpKmF0YW4oeS8oeCpzaW4oYSkpLTEvdGFuKGEpKSwgeCA+IDBcbiAgICAvLyA9PiB0ID0gKDEvYSkqKHBpLzIpLCB4ID09IDBcbiAgICBpZiAoYXJjLmFuZ2xlID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB0OiBudW1iZXI7XG4gICAgaWYgKGFyYy5hW2RpbV0gPT09IDApIHtcbiAgICAgICAgdCA9ICgxLjAgLyBhcmMuYW5nbGUpICogMC41ICogTWF0aC5QSTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0ID0gMS4wIC8gYXJjLmFuZ2xlICogTWF0aC5hdGFuKGFyYy5iW2RpbV0gLyBhcmMuYVtkaW1dIC8gTWF0aC5zaW4oYXJjLmFuZ2xlKSAtIDEuMCAvIE1hdGgudGFuKGFyYy5hbmdsZSkpO1xuICAgIH1cblxuICAgIGlmICh0IDwgMCB8fCB0ID4gMSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2xlcnAoYXJjLmFbZGltXSwgYXJjLmJbZGltXSwgYXJjLmFuZ2xlLCBjbGFtcCh0LCAwLjAsIDEuMCkpICsgYXJjLmNlbnRlcltkaW1dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2xvYmVUaWxlQm91bmRzKGlkOiBDYW5vbmljYWxUaWxlSUQpOiBBYWJiIHtcbiAgICBpZiAoaWQueiA8PSAxKSB7XG4gICAgICAgIHJldHVybiBHTE9CRV9MT1dfWk9PTV9USUxFX0FBQkJTW2lkLnogKyBpZC55ICogMiArIGlkLnhdO1xuICAgIH1cblxuICAgIC8vIEFmdGVyIHpvb20gMSBzdXJmYWNlIGZ1bmN0aW9uIGlzIG1vbm90b25pYyBmb3IgYWxsIHRpbGUgcGF0Y2hlc1xuICAgIC8vID0+IGl0IGlzIGVub3VnaCB0byBwcm9qZWN0IGNvcm5lciBwb2ludHNcbiAgICBjb25zdCBbbWluLCBtYXhdID0gZ2xvYmVUaWxlTGF0TG5nQ29ybmVycyhpZCk7XG5cbiAgICBjb25zdCBjb3JuZXJzID0gW1xuICAgICAgICBsYXRMbmdUb0VDRUYobWluWzBdLCBtaW5bMV0pLFxuICAgICAgICBsYXRMbmdUb0VDRUYobWluWzBdLCBtYXhbMV0pLFxuICAgICAgICBsYXRMbmdUb0VDRUYobWF4WzBdLCBtaW5bMV0pLFxuICAgICAgICBsYXRMbmdUb0VDRUYobWF4WzBdLCBtYXhbMV0pXG4gICAgXTtcblxuICAgIGNvbnN0IGJNaW4gPSBbR0xPQkVfTUFYLCBHTE9CRV9NQVgsIEdMT0JFX01BWF07XG4gICAgY29uc3QgYk1heCA9IFtHTE9CRV9NSU4sIEdMT0JFX01JTiwgR0xPQkVfTUlOXTtcblxuICAgIGZvciAoY29uc3QgcCBvZiBjb3JuZXJzKSB7XG4gICAgICAgIGJNaW5bMF0gPSBNYXRoLm1pbihiTWluWzBdLCBwWzBdKTtcbiAgICAgICAgYk1pblsxXSA9IE1hdGgubWluKGJNaW5bMV0sIHBbMV0pO1xuICAgICAgICBiTWluWzJdID0gTWF0aC5taW4oYk1pblsyXSwgcFsyXSk7XG5cbiAgICAgICAgYk1heFswXSA9IE1hdGgubWF4KGJNYXhbMF0sIHBbMF0pO1xuICAgICAgICBiTWF4WzFdID0gTWF0aC5tYXgoYk1heFsxXSwgcFsxXSk7XG4gICAgICAgIGJNYXhbMl0gPSBNYXRoLm1heChiTWF4WzJdLCBwWzJdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFhYmIoYk1pbiwgYk1heCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhYWJiRm9yVGlsZU9uR2xvYmUodHI6IFRyYW5zZm9ybSwgbnVtVGlsZXM6IG51bWJlciwgdGlsZUlkOiBDYW5vbmljYWxUaWxlSUQpOiBBYWJiIHtcbiAgICBjb25zdCBzY2FsZSA9IG51bVRpbGVzIC8gdHIud29ybGRTaXplO1xuXG4gICAgY29uc3QgbXggPSBOdW1iZXIuTUFYX1ZBTFVFO1xuICAgIGNvbnN0IGNvcm5lck1heCA9IFstbXgsIC1teCwgLW14XTtcbiAgICBjb25zdCBjb3JuZXJNaW4gPSBbbXgsIG14LCBteF07XG4gICAgY29uc3QgbSA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO1xuICAgIG1hdDQuc2NhbGUobSwgbSwgW3NjYWxlLCBzY2FsZSwgc2NhbGVdKTtcbiAgICBtYXQ0Lm11bHRpcGx5KG0sIG0sIHRyLmdsb2JlTWF0cml4KTtcblxuICAgIGlmICh0aWxlSWQueiA8PSAxKSB7XG4gICAgICAgIC8vIENvbXB1dGUgbWluaW11bSBib3VuZGluZyBib3ggdGhhdCBmdWxseSBlbmNhcHN1bGF0ZXNcbiAgICAgICAgLy8gdHJhbnNmb3JtZWQgY29ybmVycyBvZiB0aGUgbG9jYWwgYWFiYlxuICAgICAgICBjb25zdCBhYWJiID0gZ2xvYmVUaWxlQm91bmRzKHRpbGVJZCk7XG4gICAgICAgIGNvbnN0IGNvcm5lcnMgPSBhYWJiLmdldENvcm5lcnMoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvcm5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZlYzMudHJhbnNmb3JtTWF0NChjb3JuZXJzW2ldLCBjb3JuZXJzW2ldLCBtKTtcbiAgICAgICAgICAgIHZlYzMubWluKGNvcm5lck1pbiwgY29ybmVyTWluLCBjb3JuZXJzW2ldKTtcbiAgICAgICAgICAgIHZlYzMubWF4KGNvcm5lck1heCwgY29ybmVyTWF4LCBjb3JuZXJzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgQWFiYihjb3JuZXJNaW4sIGNvcm5lck1heCk7XG4gICAgfVxuXG4gICAgLy8gRmluZCBtaW5pbWFsIGFhYmIgZm9yIGEgdGlsZS4gQ29ycmVjdCBzb2x1dGlvbiB3b3VsZCBiZSB0byBjb21wdXRlIGJvdW5kaW5nIGJveCB0aGF0XG4gICAgLy8gZnVsbHkgZW5jYXBzdWxhdGVzIHRoZSBjdXJ2ZWQgcGF0Y2ggdGhhdCByZXByZXNlbnRzIHRoZSB0aWxlIG9uIGdsb2JlcyBzdXJmYWNlLlxuICAgIC8vIFRoaXMgY2FuIGJlIHNpbXBsaWZpZWQgYSBiaXQgYXMgdGhlIGdsb2JlIHRyYW5zZm9ybWF0aW9uIGlzIGNvbnN0cmFpbmVkOlxuICAgIC8vICAxLiBDYW1lcmEgYWx3YXlzIGZhY2VzIHRoZSBjZW50ZXIgcG9pbnQgb24gdGhlIG1hcFxuICAgIC8vICAyLiBDYW1lcmEgaXMgYWx3YXlzIGFib3ZlICh6LWNvb3JkaW5hdGUpIGFsbCBvZiB0aGUgdGlsZXNcbiAgICAvLyAgMy4gVXAgZGlyZWN0aW9uIG9mIHRoZSBjb29yZGluYXRlIHNwYWNlIChwaXhlbCBzcGFjZSkgaXMgYWx3YXlzICt6LiBUaGlzIG1lYW5zIHRoYXRcbiAgICAvLyAgICAgdGhlIFwiaGlnaGVzdFwiIHBvaW50IG9mIHRoZSBtYXAgaXMgYXQgdGhlIGNlbnRlci5cbiAgICAvLyAgNC4gei1jb29yZGluYXRlIG9mIGFueSBwb2ludCBpbiBhbnkgdGlsZSBkZXNjZW5kcyBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXJcblxuICAgIC8vIFNpbXBsaWZpZWQgYWFiYiBpcyBjb21wdXRlZCBieSBmaXJzdCBlbmNhcHN1bGF0aW5nIDQgdHJhbnNmb3JtZWQgY29ybmVyIHBvaW50cyBvZiB0aGUgdGlsZS5cbiAgICAvLyBUaGUgcmVzdWx0aW5nIGFhYmIgaXMgbm90IGNvbXBsZXRlIHlldCBhcyBjdXJ2ZWQgZWRnZXMgb2YgdGhlIHRpbGUgbWlnaHQgc3BhbiBvdXRzaWRlIG9mIHRoZSBib3VuZGFyaWVzLlxuICAgIC8vIEl0IGlzIGVub3VnaCB0byBleHRlbmQgdGhlIGFhYmIgdG8gY29udGFpbiBvbmx5IHRoZSBlZGdlIHRoYXQncyBjbG9zZXN0IHRvIHRoZSBjZW50ZXIgcG9pbnQuXG4gICAgY29uc3QgW253LCBzZV0gPSBnbG9iZVRpbGVMYXRMbmdDb3JuZXJzKHRpbGVJZCk7XG4gICAgY29uc3QgYm91bmRzID0gbmV3IExuZ0xhdEJvdW5kcygpO1xuICAgIGJvdW5kcy5zZXRTb3V0aFdlc3QoW253WzFdLCBzZVswXV0pO1xuICAgIGJvdW5kcy5zZXROb3J0aEVhc3QoW3NlWzFdLCBud1swXV0pO1xuXG4gICAgY29uc3QgY29ybmVycyA9IFtcbiAgICAgICAgbGF0TG5nVG9FQ0VGKGJvdW5kcy5nZXRTb3V0aCgpLCBib3VuZHMuZ2V0V2VzdCgpKSxcbiAgICAgICAgbGF0TG5nVG9FQ0VGKGJvdW5kcy5nZXRTb3V0aCgpLCBib3VuZHMuZ2V0RWFzdCgpKSxcbiAgICAgICAgbGF0TG5nVG9FQ0VGKGJvdW5kcy5nZXROb3J0aCgpLCBib3VuZHMuZ2V0RWFzdCgpKSxcbiAgICAgICAgbGF0TG5nVG9FQ0VGKGJvdW5kcy5nZXROb3J0aCgpLCBib3VuZHMuZ2V0V2VzdCgpKVxuICAgIF07XG5cbiAgICAvLyBOb3RlIHRoYXQgaGVyZSB3ZSdyZSB0cmFuc2Zvcm1pbmcgdGhlIGNvcm5lcnMgdG8gd29ybGQgc3BhY2Ugd2hpbGUgZmluZGluZyB0aGUgbWluL21heCB2YWx1ZXMuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3JuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZlYzMudHJhbnNmb3JtTWF0NChjb3JuZXJzW2ldLCBjb3JuZXJzW2ldLCBtKTtcbiAgICAgICAgdmVjMy5taW4oY29ybmVyTWluLCBjb3JuZXJNaW4sIGNvcm5lcnNbaV0pO1xuICAgICAgICB2ZWMzLm1heChjb3JuZXJNYXgsIGNvcm5lck1heCwgY29ybmVyc1tpXSk7XG4gICAgfVxuXG4gICAgaWYgKGJvdW5kcy5jb250YWlucyh0ci5jZW50ZXIpKSB7XG4gICAgICAgIC8vIEV4dGVuZCB0aGUgYWFiYiBieSBlbmNhcHN1bGF0aW5nIHRoZSBjZW50ZXIgcG9pbnRcbiAgICAgICAgY29ybmVyTWF4WzJdID0gMC4wO1xuICAgICAgICBjb25zdCBwb2ludCA9IHRyLnBvaW50O1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBbcG9pbnQueCAqIHNjYWxlLCBwb2ludC55ICogc2NhbGUsIDBdO1xuICAgICAgICB2ZWMzLm1pbihjb3JuZXJNaW4sIGNvcm5lck1pbiwgY2VudGVyKTtcbiAgICAgICAgdmVjMy5tYXgoY29ybmVyTWF4LCBjb3JuZXJNYXgsIGNlbnRlcik7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBBYWJiKGNvcm5lck1pbiwgY29ybmVyTWF4KTtcbiAgICB9XG5cbiAgICAvLyBDb21wdXRlIHBhcmFtZXRlcnMgZGVzY3JpYmluZyBlZGdlcyBvZiB0aGUgdGlsZSAoaS5lLiBhcmNzKSBvbiB0aGUgZ2xvYmUgc3VyZmFjZS5cbiAgICAvLyBWZXJ0aWNhbCBlZGdlcyByZXZvbHZlcyBhcm91bmQgdGhlIGdsb2JlIG9yaWdpbiB3aGVyZWFzIGhvcml6b250YWwgZWRnZXMgcmV2b2x2ZXMgYXJvdW5kIHRoZSB5LWF4aXMuXG4gICAgY29uc3QgZ2xvYmVDZW50ZXIgPSBbbVsxMl0sIG1bMTNdLCBtWzE0XV07XG5cbiAgICBjb25zdCBjZW50ZXJMbmcgPSB0ci5jZW50ZXIubG5nO1xuICAgIGNvbnN0IGNlbnRlckxhdCA9IGNsYW1wKHRyLmNlbnRlci5sYXQsIC1NQVhfTUVSQ0FUT1JfTEFUSVRVREUsIE1BWF9NRVJDQVRPUl9MQVRJVFVERSk7XG4gICAgY29uc3QgY2VudGVyID0gW21lcmNhdG9yWGZyb21MbmcoY2VudGVyTG5nKSwgbWVyY2F0b3JZZnJvbUxhdChjZW50ZXJMYXQpXTtcblxuICAgIGNvbnN0IHRpbGVDZW50ZXJMbmcgPSBib3VuZHMuZ2V0Q2VudGVyKCkubG5nO1xuICAgIGNvbnN0IHRpbGVDZW50ZXJMYXQgPSBjbGFtcChib3VuZHMuZ2V0Q2VudGVyKCkubGF0LCAtTUFYX01FUkNBVE9SX0xBVElUVURFLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREUpO1xuICAgIGNvbnN0IHRpbGVDZW50ZXIgPSBbbWVyY2F0b3JYZnJvbUxuZyh0aWxlQ2VudGVyTG5nKSwgbWVyY2F0b3JZZnJvbUxhdCh0aWxlQ2VudGVyTGF0KV07XG4gICAgbGV0IGFyY0NlbnRlciA9IG5ldyBBcnJheSgzKTtcbiAgICBsZXQgY2xvc2VzdEFyY0lkeCA9IDA7XG5cbiAgICBsZXQgZHggPSBjZW50ZXJbMF0gLSB0aWxlQ2VudGVyWzBdO1xuICAgIGNvbnN0IGR5ID0gY2VudGVyWzFdIC0gdGlsZUNlbnRlclsxXTtcblxuICAgIC8vIFNob3J0ZXN0IGRpc3RhbmNlIG1pZ2h0IGJlIGFjcm9zcyB0aGUgYW50aW1lcmlkaWFuXG4gICAgaWYgKGR4ID4gLjUpIHtcbiAgICAgICAgZHggLT0gMTtcbiAgICB9IGVsc2UgaWYgKGR4IDwgLS41KSB7XG4gICAgICAgIGR4ICs9IDE7XG4gICAgfVxuXG4gICAgLy8gSGVyZSB3ZSBkZXRlcm1pbmUgdGhlIGFyYyB3aGljaCBpcyBjbG9zZXN0IHRvIHRoZSBtYXAgY2VudGVyIHBvaW50LlxuICAgIC8vIEhvcml6b250YWwgYXJjcyBvcmlnaW4gPSBnbG9iZUNlbnRlci5cbiAgICAvLyBWZXJ0aWNhbCBhcmNzIG9yaWdpbiA9IGdsb2JlQ2VudGVyICsgeUF4aXMgKiBzaGlmdC5cbiAgICAvLyBXaGVyZSBgc2hpZnRgIGlzIGRldGVybWluZWQgYnkgbGF0aXR1ZGUuXG4gICAgaWYgKE1hdGguYWJzKGR4KSA+IE1hdGguYWJzKGR5KSkge1xuICAgICAgICBjbG9zZXN0QXJjSWR4ID0gZHggPj0gMCA/IDEgOiAzO1xuICAgICAgICBhcmNDZW50ZXIgPSBnbG9iZUNlbnRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjbG9zZXN0QXJjSWR4ID0gZHkgPj0gMCA/IDAgOiAyO1xuICAgICAgICBjb25zdCB5QXhpcyA9IFttWzRdLCBtWzVdLCBtWzZdXTtcbiAgICAgICAgbGV0IHNoaWZ0OiBudW1iZXI7XG4gICAgICAgIGlmIChkeSA+PSAwKSB7XG4gICAgICAgICAgICBzaGlmdCA9IC1NYXRoLnNpbihkZWdUb1JhZChib3VuZHMuZ2V0U291dGgoKSkpICogR0xPQkVfUkFESVVTO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2hpZnQgPSAtTWF0aC5zaW4oZGVnVG9SYWQoYm91bmRzLmdldE5vcnRoKCkpKSAqIEdMT0JFX1JBRElVUztcbiAgICAgICAgfVxuICAgICAgICBhcmNDZW50ZXIgPSB2ZWMzLnNjYWxlQW5kQWRkKGFyY0NlbnRlciwgZ2xvYmVDZW50ZXIsIHlBeGlzLCBzaGlmdCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXJjQSA9IGNvcm5lcnNbY2xvc2VzdEFyY0lkeF07XG4gICAgY29uc3QgYXJjQiA9IGNvcm5lcnNbKGNsb3Nlc3RBcmNJZHggKyAxKSAlIDRdO1xuXG4gICAgY29uc3QgY2xvc2VzdEFyYyA9IG5ldyBBcmMoYXJjQSwgYXJjQiwgYXJjQ2VudGVyKTtcbiAgICBjb25zdCBhcmNCb3VuZHMgPSBbKGxvY2FsRXh0cmVtdW0oY2xvc2VzdEFyYywgMCkgfHwgYXJjQVswXSksXG4gICAgICAgIChsb2NhbEV4dHJlbXVtKGNsb3Nlc3RBcmMsIDEpIHx8IGFyY0FbMV0pLFxuICAgICAgICAobG9jYWxFeHRyZW11bShjbG9zZXN0QXJjLCAyKSB8fCBhcmNBWzJdKV07XG5cbiAgICAvLyBSZWR1Y2UgaGVpZ2h0IG9mIHRoZSBhYWJiIHRvIG1hdGNoIGhlaWdodCBvZiB0aGUgY2xvc2VzdCBhcmMuIFRoaXMgcmVkdWNlcyBmYWxzZSBwb3NpdGl2ZXNcbiAgICAvLyBvZiB0aWxlcyBmYXJ0aGVyIGF3YXkgZnJvbSB0aGUgY2VudGVyIGFzIHRoZXkgd291bGQgb3RoZXJ3aXNlIGludGVyc2VjdCB3aXRoIGZhciBlbmRcbiAgICAvLyBvZiB0aGUgdmlldyBmcnVzdHVtXG4gICAgY29ybmVyTWluWzJdID0gTWF0aC5taW4oYXJjQVsyXSwgYXJjQlsyXSk7XG5cbiAgICB2ZWMzLm1pbihjb3JuZXJNaW4sIGNvcm5lck1pbiwgYXJjQm91bmRzKTtcbiAgICB2ZWMzLm1heChjb3JuZXJNYXgsIGNvcm5lck1heCwgYXJjQm91bmRzKTtcblxuICAgIHJldHVybiBuZXcgQWFiYihjb3JuZXJNaW4sIGNvcm5lck1heCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnbG9iZVRpbGVMYXRMbmdDb3JuZXJzKGlkOiBDYW5vbmljYWxUaWxlSUQpOiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0ge1xuICAgIGNvbnN0IHRpbGVTY2FsZSA9IDEgPDwgaWQuejtcbiAgICBjb25zdCBsZWZ0ID0gaWQueCAvIHRpbGVTY2FsZTtcbiAgICBjb25zdCByaWdodCA9IChpZC54ICsgMSkgLyB0aWxlU2NhbGU7XG4gICAgY29uc3QgdG9wID0gaWQueSAvIHRpbGVTY2FsZTtcbiAgICBjb25zdCBib3R0b20gPSAoaWQueSArIDEpIC8gdGlsZVNjYWxlO1xuXG4gICAgY29uc3QgbGF0TG5nVEwgPSBbIGxhdEZyb21NZXJjYXRvclkodG9wKSwgbG5nRnJvbU1lcmNhdG9yWChsZWZ0KSBdO1xuICAgIGNvbnN0IGxhdExuZ0JSID0gWyBsYXRGcm9tTWVyY2F0b3JZKGJvdHRvbSksIGxuZ0Zyb21NZXJjYXRvclgocmlnaHQpIF07XG5cbiAgICByZXR1cm4gW2xhdExuZ1RMLCBsYXRMbmdCUl07XG59XG5cbmZ1bmN0aW9uIGNzTGF0TG5nVG9FQ0VGKGNvc0xhdDogbnVtYmVyLCBzaW5MYXQ6IG51bWJlciwgbG5nOiBudW1iZXIsIHJhZGl1czogbnVtYmVyID0gR0xPQkVfUkFESVVTKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgbG5nID0gZGVnVG9SYWQobG5nKTtcblxuICAgIC8vIENvbnZlcnQgbGF0ICYgbG5nIHRvIHNwaGVyaWNhbCByZXByZXNlbnRhdGlvbi4gVXNlIHpvb209MCBhcyBhIHJlZmVyZW5jZVxuICAgIGNvbnN0IHN4ID0gY29zTGF0ICogTWF0aC5zaW4obG5nKSAqIHJhZGl1cztcbiAgICBjb25zdCBzeSA9IC1zaW5MYXQgKiByYWRpdXM7XG4gICAgY29uc3Qgc3ogPSBjb3NMYXQgKiBNYXRoLmNvcyhsbmcpICogcmFkaXVzO1xuXG4gICAgcmV0dXJuIFtzeCwgc3ksIHN6XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhdExuZ1RvRUNFRihsYXQ6IG51bWJlciwgbG5nOiBudW1iZXIsIHJhZGl1cz86IG51bWJlcik6IEFycmF5PG51bWJlcj4ge1xuICAgIHJldHVybiBjc0xhdExuZ1RvRUNFRihNYXRoLmNvcyhkZWdUb1JhZChsYXQpKSwgTWF0aC5zaW4oZGVnVG9SYWQobGF0KSksIGxuZywgcmFkaXVzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpbGVDb29yZFRvRUNFRih4OiBudW1iZXIsIHk6IG51bWJlciwgaWQ6IENhbm9uaWNhbFRpbGVJRCk6IEFycmF5PG51bWJlcj4ge1xuICAgIGNvbnN0IHRpbGVzID0gTWF0aC5wb3coMi4wLCBpZC56KTtcbiAgICBjb25zdCBteCA9ICh4IC8gRVhURU5UICsgaWQueCkgLyB0aWxlcztcbiAgICBjb25zdCBteSA9ICh5IC8gRVhURU5UICsgaWQueSkgLyB0aWxlcztcbiAgICBjb25zdCBsYXQgPSBsYXRGcm9tTWVyY2F0b3JZKG15KTtcbiAgICBjb25zdCBsbmcgPSBsbmdGcm9tTWVyY2F0b3JYKG14KTtcbiAgICBjb25zdCBwb3MgPSBsYXRMbmdUb0VDRUYobGF0LCBsbmcpO1xuICAgIHJldHVybiBwb3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnbG9iZUVDRUZPcmlnaW4odGlsZU1hdHJpeDogTWF0NCwgaWQ6IFVud3JhcHBlZFRpbGVJRCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgY29uc3Qgb3JpZ2luID0gWzAsIDAsIDBdO1xuICAgIGNvbnN0IGJvdW5kcyA9IGdsb2JlVGlsZUJvdW5kcyhpZC5jYW5vbmljYWwpO1xuICAgIGNvbnN0IG5vcm1hbGl6YXRpb25NYXRyaXggPSBnbG9iZU5vcm1hbGl6ZUVDRUYoYm91bmRzKTtcbiAgICB2ZWMzLnRyYW5zZm9ybU1hdDQob3JpZ2luLCBvcmlnaW4sIG5vcm1hbGl6YXRpb25NYXRyaXgpO1xuICAgIHZlYzMudHJhbnNmb3JtTWF0NChvcmlnaW4sIG9yaWdpbiwgdGlsZU1hdHJpeCk7XG4gICAgcmV0dXJuIG9yaWdpbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JlRUNFRk5vcm1hbGl6YXRpb25TY2FsZShib3VuZHM6IEFhYmIpOiBudW1iZXIge1xuICAgIGNvbnN0IG1heEV4dCA9IE1hdGgubWF4KC4uLnZlYzMuc3ViKFtdLCBib3VuZHMubWF4LCBib3VuZHMubWluKSk7XG4gICAgcmV0dXJuIEdMT0JFX05PUk1BTElaQVRJT05fTUFTSyAvIG1heEV4dDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JlTm9ybWFsaXplRUNFRihib3VuZHM6IEFhYmIpOiBGbG9hdDY0QXJyYXkge1xuICAgIGNvbnN0IG0gPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDY0QXJyYXkoMTYpKTtcbiAgICBjb25zdCBzY2FsZSA9IGdsb2JlRUNFRk5vcm1hbGl6YXRpb25TY2FsZShib3VuZHMpO1xuICAgIG1hdDQuc2NhbGUobSwgbSwgW3NjYWxlLCBzY2FsZSwgc2NhbGVdKTtcbiAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCB2ZWMzLm5lZ2F0ZShbXSwgYm91bmRzLm1pbikpO1xuICAgIHJldHVybiBtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2xvYmVEZW5vcm1hbGl6ZUVDRUYoYm91bmRzOiBBYWJiKTogRmxvYXQ2NEFycmF5IHtcbiAgICBjb25zdCBtID0gbWF0NC5pZGVudGl0eShuZXcgRmxvYXQ2NEFycmF5KDE2KSk7XG4gICAgY29uc3Qgc2NhbGUgPSAxLjAgLyBnbG9iZUVDRUZOb3JtYWxpemF0aW9uU2NhbGUoYm91bmRzKTtcbiAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBib3VuZHMubWluKTtcbiAgICBtYXQ0LnNjYWxlKG0sIG0sIFtzY2FsZSwgc2NhbGUsIHNjYWxlXSk7XG4gICAgcmV0dXJuIG07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnbG9iZUVDRUZVbml0c1RvUGl4ZWxTY2FsZSh3b3JsZFNpemU6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgbG9jYWxSYWRpdXMgPSBFWFRFTlQgLyAoMi4wICogTWF0aC5QSSk7XG4gICAgY29uc3Qgd3NSYWRpdXMgPSB3b3JsZFNpemUgLyAoMi4wICogTWF0aC5QSSk7XG4gICAgcmV0dXJuIHdzUmFkaXVzIC8gbG9jYWxSYWRpdXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnbG9iZVBpeGVsc1RvVGlsZVVuaXRzKHpvb206IG51bWJlciwgaWQ6IENhbm9uaWNhbFRpbGVJRCk6IG51bWJlciB7XG4gICAgY29uc3QgZWNlZlBlclBpeGVsID0gRVhURU5UIC8gKFRJTEVfU0laRSAqIE1hdGgucG93KDIsIHpvb20pKTtcbiAgICBjb25zdCBub3JtQ29lZmYgPSBnbG9iZUVDRUZOb3JtYWxpemF0aW9uU2NhbGUoZ2xvYmVUaWxlQm91bmRzKGlkKSk7XG5cbiAgICByZXR1cm4gZWNlZlBlclBpeGVsICogbm9ybUNvZWZmO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVHbG9iZVBvc01hdHJpeCh4LCB5LCB3b3JsZFNpemUsIGxuZywgbGF0KTogRmxvYXQ2NEFycmF5IHtcbiAgICAvLyB0cmFuc2Zvcm0gdGhlIGdsb2JlIGZyb20gcmVmZXJlbmNlIGNvb3JkaW5hdGUgc3BhY2UgdG8gd29ybGQgc3BhY2VcbiAgICBjb25zdCBzY2FsZSA9IGdsb2JlRUNFRlVuaXRzVG9QaXhlbFNjYWxlKHdvcmxkU2l6ZSk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gW3gsIHksIC13b3JsZFNpemUgLyAoMi4wICogTWF0aC5QSSldO1xuICAgIGNvbnN0IG0gPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDY0QXJyYXkoMTYpKTtcbiAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBvZmZzZXQpO1xuICAgIG1hdDQuc2NhbGUobSwgbSwgW3NjYWxlLCBzY2FsZSwgc2NhbGVdKTtcbiAgICBtYXQ0LnJvdGF0ZVgobSwgbSwgZGVnVG9SYWQoLWxhdCkpO1xuICAgIG1hdDQucm90YXRlWShtLCBtLCBkZWdUb1JhZCgtbG5nKSk7XG4gICAgcmV0dXJuIG07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVHbG9iZU1hdHJpeCh0cjogVHJhbnNmb3JtKTogRmxvYXQ2NEFycmF5IHtcbiAgICBjb25zdCB7eCwgeX0gPSB0ci5wb2ludDtcbiAgICBjb25zdCB7bG5nLCBsYXR9ID0gdHIuX2NlbnRlcjtcbiAgICByZXR1cm4gY2FsY3VsYXRlR2xvYmVQb3NNYXRyaXgoeCwgeSwgdHIud29ybGRTaXplLCBsbmcsIGxhdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVHbG9iZUxhYmVsTWF0cml4KHRyOiBUcmFuc2Zvcm0sIGlkOiBDYW5vbmljYWxUaWxlSUQpOiBGbG9hdDY0QXJyYXkge1xuICAgIGNvbnN0IHt4LCB5fSA9IHRyLnBvaW50O1xuXG4gICAgLy8gTWFwIGFsaWduZWQgbGFiZWwgc3BhY2UgZm9yIGdsb2JlIHZpZXcgaXMgdGhlIG5vbi1yb3RhdGVkIGdsb2JlIGl0c2VsZiBpbiBwaXhlbCBjb29yZGluYXRlcy5cblxuICAgIC8vIENhbWVyYSBpcyBtb3ZlZCBjbG9zZXIgdG93YXJkcyB0aGUgZ3JvdW5kIG5lYXIgcG9sZXMgYXMgcGFydCBvZlxuICAgIC8vIGNvbXBlc2FudGluZyB0aGUgcmVwcm9qZWN0aW9uLiBUaGlzIGhhcyB0byBiZSBjb21wZW5zYXRlZCBmb3IgdGhlXG4gICAgLy8gbWFwIGFsaWduZWQgbGFiZWwgc3BhY2UuIFdoaXRob3V0IHRoaXMgbG9naWMgbWFwIGFsaWduZWQgc3ltYm9sc1xuICAgIC8vIHdvdWxkIGFwcGVhciBsYXJnZXIgdGhhbiBpbnRlbmRlZC5cbiAgICBjb25zdCBtID0gY2FsY3VsYXRlR2xvYmVQb3NNYXRyaXgoeCwgeSwgdHIud29ybGRTaXplIC8gdHIuX3Byb2plY3Rpb25TY2FsZXIsIDAsIDApO1xuICAgIHJldHVybiBtYXQ0Lm11bHRpcGx5KG0sIG0sIGdsb2JlRGVub3JtYWxpemVFQ0VGKGdsb2JlVGlsZUJvdW5kcyhpZCkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUdsb2JlTWVyY2F0b3JNYXRyaXgodHI6IFRyYW5zZm9ybSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3Qgd29ybGRTaXplID0gdHIud29ybGRTaXplO1xuICAgIGNvbnN0IHBvaW50ID0gdHIucG9pbnQ7XG5cbiAgICBjb25zdCBtZXJjYXRvclogPSBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgdHIuY2VudGVyLmxhdCkgKiB3b3JsZFNpemU7XG4gICAgY29uc3QgcHJvamVjdGlvblNjYWxlciA9IG1lcmNhdG9yWiAvIHRyLnBpeGVsc1Blck1ldGVyO1xuICAgIGNvbnN0IHpTY2FsZSA9IHRyLnBpeGVsc1Blck1ldGVyO1xuICAgIGNvbnN0IHdzID0gd29ybGRTaXplIC8gcHJvamVjdGlvblNjYWxlcjtcblxuICAgIGNvbnN0IHBvc01hdHJpeCA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO1xuICAgIG1hdDQudHJhbnNsYXRlKHBvc01hdHJpeCwgcG9zTWF0cml4LCBbcG9pbnQueCwgcG9pbnQueSwgMC4wXSk7XG4gICAgbWF0NC5zY2FsZShwb3NNYXRyaXgsIHBvc01hdHJpeCwgW3dzLCB3cywgelNjYWxlXSk7XG5cbiAgICByZXR1cm4gRmxvYXQzMkFycmF5LmZyb20ocG9zTWF0cml4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JlVG9NZXJjYXRvclRyYW5zaXRpb24oem9vbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gc21vb3Roc3RlcChHTE9CRV9aT09NX1RIUkVTSE9MRF9NSU4sIEdMT0JFX1pPT01fVEhSRVNIT0xEX01BWCwgem9vbSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnbG9iZU1hdHJpeEZvclRpbGUoaWQ6IENhbm9uaWNhbFRpbGVJRCwgZ2xvYmVNYXRyaXg6IEZsb2F0NjRBcnJheSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgZGVjb2RlID0gZ2xvYmVEZW5vcm1hbGl6ZUVDRUYoZ2xvYmVUaWxlQm91bmRzKGlkKSk7XG4gICAgcmV0dXJuIG1hdDQubXVsKG1hdDQuY3JlYXRlKCksIGdsb2JlTWF0cml4LCBkZWNvZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2xvYmVQb2xlTWF0cml4Rm9yVGlsZSh6OiBudW1iZXIsIHg6IG51bWJlciwgdHI6IFRyYW5zZm9ybSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgcG9sZU1hdHJpeCA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO1xuICAgIGNvbnN0IG51bVRpbGVzID0gMSA8PCB6O1xuICAgIGNvbnN0IHhPZmZzZXRBbmdsZSA9ICh4IC8gbnVtVGlsZXMgLSAwLjUpICogMzYwO1xuICAgIGNvbnN0IHBvaW50ID0gdHIucG9pbnQ7XG4gICAgY29uc3Qgd3MgPSB0ci53b3JsZFNpemU7XG4gICAgY29uc3QgcyA9IHRyLndvcmxkU2l6ZSAvICh0ci50aWxlU2l6ZSAqIG51bVRpbGVzKTtcblxuICAgIG1hdDQudHJhbnNsYXRlKHBvbGVNYXRyaXgsIHBvbGVNYXRyaXgsIFtwb2ludC54LCBwb2ludC55LCAtKHdzIC8gTWF0aC5QSSAvIDIuMCldKTtcbiAgICBtYXQ0LnNjYWxlKHBvbGVNYXRyaXgsIHBvbGVNYXRyaXgsIFtzLCBzLCBzXSk7XG4gICAgbWF0NC5yb3RhdGVYKHBvbGVNYXRyaXgsIHBvbGVNYXRyaXgsIGRlZ1RvUmFkKC10ci5fY2VudGVyLmxhdCkpO1xuICAgIG1hdDQucm90YXRlWShwb2xlTWF0cml4LCBwb2xlTWF0cml4LCBkZWdUb1JhZCgtdHIuX2NlbnRlci5sbmcgKyB4T2Zmc2V0QW5nbGUpKTtcblxuICAgIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbShwb2xlTWF0cml4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JlVXNlQ3VzdG9tQW50aUFsaWFzaW5nKHBhaW50ZXI6IFBhaW50ZXIsIGNvbnRleHQ6IENvbnRleHQsIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHJhbnNpdGlvblQgPSBnbG9iZVRvTWVyY2F0b3JUcmFuc2l0aW9uKHRyYW5zZm9ybS56b29tKTtcbiAgICBjb25zdCB1c2VDb250ZXh0QUEgPSBwYWludGVyLnN0eWxlLm1hcC5fYW50aWFsaWFzO1xuICAgIGNvbnN0IGhhc1N0YW5kYXJkRGVyaXZhdGl2ZXMgPSAhIWNvbnRleHQuZXh0U3RhbmRhcmREZXJpdmF0aXZlcztcbiAgICBjb25zdCBkaXNhYmxlZCA9IGNvbnRleHQuZXh0U3RhbmRhcmREZXJpdmF0aXZlc0ZvcmNlT2ZmIHx8IChwYWludGVyLnRlcnJhaW4gJiYgcGFpbnRlci50ZXJyYWluLmV4YWdnZXJhdGlvbigpID4gMC4wKTtcbiAgICByZXR1cm4gdHJhbnNpdGlvblQgPT09IDAuMCAmJiAhdXNlQ29udGV4dEFBICYmICFkaXNhYmxlZCAmJiBoYXNTdGFuZGFyZERlcml2YXRpdmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R3JpZE1hdHJpeChpZDogQ2Fub25pY2FsVGlsZUlELCBjb3JuZXJzOiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0sIGxhdGl0dWRpbmFsTG9kOiBudW1iZXIpOiBBcnJheTxudW1iZXI+IHtcbiAgICBjb25zdCBbdGwsIGJyXSA9IGNvcm5lcnM7XG4gICAgY29uc3QgUyA9IDEuMCAvIEdMT0JFX1ZFUlRFWF9HUklEX1NJWkU7XG4gICAgY29uc3QgeCA9IChiclsxXSAtIHRsWzFdKSAqIFM7XG4gICAgY29uc3QgbGF0aXR1ZGluYWxTdWJkaXZzID0gR0xPQkVfTEFUSVRVRElOQUxfR1JJRF9MT0RfVEFCTEVbbGF0aXR1ZGluYWxMb2RdO1xuICAgIGNvbnN0IHkgPSAoYnJbMF0gLSB0bFswXSkgLyBsYXRpdHVkaW5hbFN1YmRpdnM7XG4gICAgY29uc3QgdGlsZVpvb20gPSAxIDw8IGlkLno7XG4gICAgcmV0dXJuIFswLCB4LCB0aWxlWm9vbSwgeSwgMCwgaWQueSwgdGxbMF0sIHRsWzFdLCBTXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGl0dWRpbmFsTG9kKGxhdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBVUFBFUl9MQVRJVFVERSA9IE1BWF9NRVJDQVRPUl9MQVRJVFVERSAtIDUuMDtcbiAgICBsYXQgPSBjbGFtcChsYXQsIC1VUFBFUl9MQVRJVFVERSwgVVBQRVJfTEFUSVRVREUpIC8gVVBQRVJfTEFUSVRVREUgKiA5MC4wO1xuICAgIC8vIGNvbnN0IHQgPSBNYXRoLnBvdygxLjAgLSBNYXRoLmNvcyhkZWdUb1JhZChsYXQpKSwgMik7XG4gICAgY29uc3QgdCA9IE1hdGgucG93KE1hdGguYWJzKE1hdGguc2luKGRlZ1RvUmFkKGxhdCkpKSwgMyk7XG4gICAgY29uc3QgbG9kID0gTWF0aC5yb3VuZCh0ICogKEdMT0JFX0xBVElUVURJTkFMX0dSSURfTE9EX1RBQkxFLmxlbmd0aCAtIDEpKTtcbiAgICByZXR1cm4gbG9kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2xvYmVDZW50ZXJUb1NjcmVlblBvaW50KHRyOiBUcmFuc2Zvcm0pOiBQb2ludCB7XG4gICAgY29uc3QgcG9zID0gWzAsIDAsIDBdO1xuICAgIGNvbnN0IG1hdHJpeCA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO1xuICAgIG1hdDQubXVsdGlwbHkobWF0cml4LCB0ci5waXhlbE1hdHJpeCwgdHIuZ2xvYmVNYXRyaXgpO1xuICAgIHZlYzMudHJhbnNmb3JtTWF0NChwb3MsIHBvcywgbWF0cml4KTtcbiAgICByZXR1cm4gbmV3IFBvaW50KHBvc1swXSwgcG9zWzFdKTtcbn1cblxuZnVuY3Rpb24gY2FtZXJhUG9zaXRpb25JbkVDRUYodHI6IFRyYW5zZm9ybSk6IEFycmF5PG51bWJlcj4ge1xuICAgIC8vIEhlcmUgXCJjZW50ZXJcIiBpcyB0aGUgY2VudGVyIG9mIHRoZSBnbG9iZS4gV2UgcmVmZXIgdG8gdHJhbnNmb3JtLl9jZW50ZXJcbiAgICAvLyAodGhlIHN1cmZhY2Ugb2YgdGhlIG1hcCBvbiB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4pIGFzIFwicGl2b3RcIiB0byBhdm9pZCBjb25mdXNpb24uXG4gICAgY29uc3QgY2VudGVyVG9QaXZvdCA9IGxhdExuZ1RvRUNFRih0ci5fY2VudGVyLmxhdCwgdHIuX2NlbnRlci5sbmcpO1xuXG4gICAgLy8gU2V0IGF4aXMgdG8gRWFzdC1XZXN0IGxpbmUgdGFuZ2VudCB0byBzcGhlcmUgYXQgcGl2b3RcbiAgICBjb25zdCBzb3V0aCA9IHZlYzMuZnJvbVZhbHVlcygwLCAxLCAwKTtcbiAgICBsZXQgYXhpcyA9IHZlYzMuY3Jvc3MoW10sIHNvdXRoLCBjZW50ZXJUb1Bpdm90KTtcblxuICAgIC8vIFJvdGF0ZSBheGlzIGFyb3VuZCBwaXZvdCBieSBiZWFyaW5nXG4gICAgY29uc3Qgcm90YXRpb24gPSBtYXQ0LmZyb21Sb3RhdGlvbihbXSwgLXRyLmFuZ2xlLCBjZW50ZXJUb1Bpdm90KTtcbiAgICBheGlzID0gdmVjMy50cmFuc2Zvcm1NYXQ0KGF4aXMsIGF4aXMsIHJvdGF0aW9uKTtcblxuICAgIC8vIFJvdGF0ZSBjYW1lcmEgYXJvdW5kIGF4aXMgYnkgcGl0Y2hcbiAgICBtYXQ0LmZyb21Sb3RhdGlvbihyb3RhdGlvbiwgLXRyLl9waXRjaCwgYXhpcyk7XG5cbiAgICBjb25zdCBwaXZvdFRvQ2FtZXJhID0gdmVjMy5ub3JtYWxpemUoW10sIGNlbnRlclRvUGl2b3QpO1xuICAgIHZlYzMuc2NhbGUocGl2b3RUb0NhbWVyYSwgcGl2b3RUb0NhbWVyYSwgdHIuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvIHRyLnBpeGVsc1Blck1ldGVyICogR0xPQkVfTUVURVJTX1RPX0VDRUYpO1xuICAgIHZlYzMudHJhbnNmb3JtTWF0NChwaXZvdFRvQ2FtZXJhLCBwaXZvdFRvQ2FtZXJhLCByb3RhdGlvbik7XG5cbiAgICByZXR1cm4gdmVjMy5hZGQoW10sIGNlbnRlclRvUGl2b3QsIHBpdm90VG9DYW1lcmEpO1xufVxuXG4vLyBSZXR1cm4gdGhlIGFuZ2xlIG9mIHRoZSBub3JtYWwgdmVjdG9yIG9mIHRoZSBzcGhlcmUgcmVsYXRpdmUgdG8gdGhlIGNhbWVyYS5cbi8vIGkuZS4gaG93IG11Y2ggdG8gdGlsdCBtYXAtYWxpZ25lZCBtYXJrZXJzLlxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JlVGlsdEF0TG5nTGF0KHRyOiBUcmFuc2Zvcm0sIGxuZ0xhdDogTG5nTGF0KTogbnVtYmVyIHtcbiAgICBjb25zdCBjZW50ZXJUb1BvaW50ID0gbGF0TG5nVG9FQ0VGKGxuZ0xhdC5sYXQsIGxuZ0xhdC5sbmcpO1xuICAgIGNvbnN0IGNlbnRlclRvQ2FtZXJhID0gY2FtZXJhUG9zaXRpb25JbkVDRUYodHIpO1xuICAgIGNvbnN0IHBvaW50VG9DYW1lcmEgPSB2ZWMzLnN1YnRyYWN0KFtdLCBjZW50ZXJUb0NhbWVyYSwgY2VudGVyVG9Qb2ludCk7XG4gICAgcmV0dXJuIHZlYzMuYW5nbGUocG9pbnRUb0NhbWVyYSwgY2VudGVyVG9Qb2ludCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xuZ0xhdEJlaGluZEdsb2JlKHRyOiBUcmFuc2Zvcm0sIGxuZ0xhdDogTG5nTGF0KTogYm9vbGVhbiB7XG4gICAgLy8gV2UgY29uc2lkZXIgMSUgcGFzdCB0aGUgaG9yaXpvbiBub3Qgb2NjbHVkZWQsIHRoaXMgYWxsb3dzIHBvcHVwcyB0byBiZSBkcmFnZ2VkIGFyb3VuZCB0aGUgZ2xvYmUgZWRnZSB3aXRob3V0IGZhZGluZy5cbiAgICByZXR1cm4gKGdsb2JlVGlsdEF0TG5nTGF0KHRyLCBsbmdMYXQpID4gTWF0aC5QSSAvIDIgKiAxLjAxKTtcbn1cblxuY29uc3QgUE9MRV9SQUQgPSBkZWdUb1JhZCg4NS4wKTtcbmNvbnN0IFBPTEVfQ09TID0gTWF0aC5jb3MoUE9MRV9SQUQpO1xuY29uc3QgUE9MRV9TSU4gPSBNYXRoLnNpbihQT0xFX1JBRCk7XG5cbmV4cG9ydCBjbGFzcyBHbG9iZVNoYXJlZEJ1ZmZlcnMge1xuICAgIF9wb2xlTm9ydGhWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcbiAgICBfcG9sZVNvdXRoVmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgX3BvbGVJbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgX3BvbGVTZWdtZW50czogQXJyYXk8U2VnbWVudFZlY3Rvcj47XG5cbiAgICBfZ3JpZEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuICAgIF9ncmlkSW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuICAgIF9ncmlkU2VnbWVudHM6IEFycmF5PFNlZ21lbnRWZWN0b3I+O1xuXG4gICAgX3dpcmVmcmFtZUluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcbiAgICBfd2lyZWZyYW1lU2VnbWVudHM6IEFycmF5PFNlZ21lbnRWZWN0b3I+O1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICB0aGlzLl9jcmVhdGVHcmlkKGNvbnRleHQpO1xuICAgICAgICB0aGlzLl9jcmVhdGVQb2xlcyhjb250ZXh0KTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9wb2xlSW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLl9ncmlkQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fZ3JpZEluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fcG9sZU5vcnRoVmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5fcG9sZVNvdXRoVmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50cyBvZiB0aGlzLl9wb2xlU2VnbWVudHMpIHNlZ21lbnRzLmRlc3Ryb3koKTtcbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50cyBvZiB0aGlzLl9ncmlkU2VnbWVudHMpIHNlZ21lbnRzLmRlc3Ryb3koKTtcblxuICAgICAgICBpZiAodGhpcy5fd2lyZWZyYW1lSW5kZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dpcmVmcmFtZUluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnbWVudHMgb2YgdGhpcy5fd2lyZWZyYW1lU2VnbWVudHMpIHNlZ21lbnRzLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jcmVhdGVHcmlkKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgZ3JpZFZlcnRpY2VzID0gbmV3IFBvc0FycmF5KCk7XG4gICAgICAgIGNvbnN0IGdyaWRJbmRpY2VzID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuXG4gICAgICAgIGNvbnN0IHF1YWRFeHQgPSBHTE9CRV9WRVJURVhfR1JJRF9TSVpFO1xuICAgICAgICBjb25zdCB2ZXJ0ZXhFeHQgPSBxdWFkRXh0ICsgMTtcblxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZlcnRleEV4dDsgaisrKVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhFeHQ7IGkrKylcbiAgICAgICAgICAgICAgICBncmlkVmVydGljZXMuZW1wbGFjZUJhY2soaSwgaik7XG5cbiAgICAgICAgdGhpcy5fZ3JpZFNlZ21lbnRzID0gW107XG4gICAgICAgIGZvciAobGV0IGsgPSAwLCBwcmltaXRpdmVPZmZzZXQgPSAwOyBrIDwgR0xPQkVfTEFUSVRVRElOQUxfR1JJRF9MT0RfVEFCTEUubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxhdGl0dWRpbmFsTG9kID0gR0xPQkVfTEFUSVRVRElOQUxfR1JJRF9MT0RfVEFCTEVba107XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhdGl0dWRpbmFsTG9kOyBqKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1YWRFeHQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGogKiB2ZXJ0ZXhFeHQgKyBpO1xuICAgICAgICAgICAgICAgICAgICBncmlkSW5kaWNlcy5lbXBsYWNlQmFjayhpbmRleCArIDEsIGluZGV4LCBpbmRleCArIHZlcnRleEV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGdyaWRJbmRpY2VzLmVtcGxhY2VCYWNrKGluZGV4ICsgdmVydGV4RXh0LCBpbmRleCArIHZlcnRleEV4dCArIDEsIGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBudW1WZXJ0aWNlcyA9IChsYXRpdHVkaW5hbExvZCArIDEpICogdmVydGV4RXh0O1xuICAgICAgICAgICAgY29uc3QgbnVtUHJpbWl0aXZlcyA9IGxhdGl0dWRpbmFsTG9kICogcXVhZEV4dCAqIDI7XG5cbiAgICAgICAgICAgIHRoaXMuX2dyaWRTZWdtZW50cy5wdXNoKFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCBwcmltaXRpdmVPZmZzZXQsIG51bVZlcnRpY2VzLCBudW1QcmltaXRpdmVzKSk7XG4gICAgICAgICAgICBwcmltaXRpdmVPZmZzZXQgKz0gbnVtUHJpbWl0aXZlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dyaWRCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihncmlkVmVydGljZXMsIHBvc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMuX2dyaWRJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIoZ3JpZEluZGljZXMsIHRydWUpO1xuICAgIH1cblxuICAgIF9jcmVhdGVQb2xlcyhjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHBvbGVJbmRpY2VzID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBHTE9CRV9WRVJURVhfR1JJRF9TSVpFOyBpKyspIHtcbiAgICAgICAgICAgIHBvbGVJbmRpY2VzLmVtcGxhY2VCYWNrKDAsIGkgKyAxLCBpICsgMik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcG9sZUluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcihwb2xlSW5kaWNlcywgdHJ1ZSk7XG5cbiAgICAgICAgY29uc3Qgbm9ydGhWZXJ0aWNlcyA9IG5ldyBHbG9iZVZlcnRleEFycmF5KCk7XG4gICAgICAgIGNvbnN0IHNvdXRoVmVydGljZXMgPSBuZXcgR2xvYmVWZXJ0ZXhBcnJheSgpO1xuICAgICAgICBjb25zdCBwb2xlUHJpbWl0aXZlcyA9IEdMT0JFX1ZFUlRFWF9HUklEX1NJWkU7XG4gICAgICAgIGNvbnN0IHBvbGVWZXJ0aWNlcyA9IEdMT0JFX1ZFUlRFWF9HUklEX1NJWkUgKyAyO1xuICAgICAgICB0aGlzLl9wb2xlU2VnbWVudHMgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCB6b29tID0gMCwgb2Zmc2V0ID0gMDsgem9vbSA8IEdMT0JFX1pPT01fVEhSRVNIT0xEX01JTjsgem9vbSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlcyA9IDEgPDwgem9vbTtcbiAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IHRpbGVzICogVElMRV9TSVpFIC8gTWF0aC5QSSAvIDIuMDtcbiAgICAgICAgICAgIGNvbnN0IGVuZEFuZ2xlID0gMzYwLjAgLyB0aWxlcztcblxuICAgICAgICAgICAgbm9ydGhWZXJ0aWNlcy5lbXBsYWNlQmFjaygwLCAtcmFkaXVzLCAwLCAwLCAwLCAwLjUsIDApOyAvLyBwbGFjZSB0aGUgdGlwXG4gICAgICAgICAgICBzb3V0aFZlcnRpY2VzLmVtcGxhY2VCYWNrKDAsIC1yYWRpdXMsIDAsIDAsIDAsIDAuNSwgMSk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IEdMT0JFX1ZFUlRFWF9HUklEX1NJWkU7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHV2WCA9IGkgLyBHTE9CRV9WRVJURVhfR1JJRF9TSVpFO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuZ2xlID0gaW50ZXJwb2xhdGUoMCwgZW5kQW5nbGUsIHV2WCk7XG4gICAgICAgICAgICAgICAgY29uc3QgW2d4LCBneSwgZ3pdID0gY3NMYXRMbmdUb0VDRUYoUE9MRV9DT1MsIFBPTEVfU0lOLCBhbmdsZSwgcmFkaXVzKTtcbiAgICAgICAgICAgICAgICBub3J0aFZlcnRpY2VzLmVtcGxhY2VCYWNrKGd4LCBneSwgZ3osIDAsIDAsIHV2WCwgMCk7XG4gICAgICAgICAgICAgICAgc291dGhWZXJ0aWNlcy5lbXBsYWNlQmFjayhneCwgZ3ksIGd6LCAwLCAwLCB1dlgsIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9wb2xlU2VnbWVudHMucHVzaChTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQob2Zmc2V0LCAwLCBwb2xlVmVydGljZXMsIHBvbGVQcmltaXRpdmVzKSk7XG5cbiAgICAgICAgICAgIG9mZnNldCArPSBwb2xlVmVydGljZXM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wb2xlTm9ydGhWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihub3J0aFZlcnRpY2VzLCBnbG9iZUxheW91dEF0dHJpYnV0ZXMsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcG9sZVNvdXRoVmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIoc291dGhWZXJ0aWNlcywgZ2xvYmVMYXlvdXRBdHRyaWJ1dGVzLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZ2V0R3JpZEJ1ZmZlcnMobGF0aXR1ZGluYWxMb2Q6IG51bWJlcik6IFtWZXJ0ZXhCdWZmZXIsIEluZGV4QnVmZmVyLCBTZWdtZW50VmVjdG9yXSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5fZ3JpZEJ1ZmZlciwgdGhpcy5fZ3JpZEluZGV4QnVmZmVyLCB0aGlzLl9ncmlkU2VnbWVudHNbbGF0aXR1ZGluYWxMb2RdXTtcbiAgICB9XG5cbiAgICBnZXRQb2xlQnVmZmVycyh6OiBudW1iZXIpOiBbVmVydGV4QnVmZmVyLCBWZXJ0ZXhCdWZmZXIsIEluZGV4QnVmZmVyLCBTZWdtZW50VmVjdG9yXSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5fcG9sZU5vcnRoVmVydGV4QnVmZmVyLCB0aGlzLl9wb2xlU291dGhWZXJ0ZXhCdWZmZXIsIHRoaXMuX3BvbGVJbmRleEJ1ZmZlciwgdGhpcy5fcG9sZVNlZ21lbnRzW3pdXTtcbiAgICB9XG5cbiAgICBnZXRXaXJlZmFtZUJ1ZmZlcnMoY29udGV4dDogQ29udGV4dCwgbG9kOiBudW1iZXIpOiBbVmVydGV4QnVmZmVyLCBJbmRleEJ1ZmZlciwgU2VnbWVudFZlY3Rvcl0ge1xuICAgICAgICBpZiAoIXRoaXMuX3dpcmVmcmFtZVNlZ21lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCB3aXJlZnJhbWVJbmRpY2VzID0gbmV3IExpbmVJbmRleEFycmF5KCk7XG4gICAgICAgICAgICBjb25zdCBxdWFkRXh0ID0gR0xPQkVfVkVSVEVYX0dSSURfU0laRTtcbiAgICAgICAgICAgIGNvbnN0IHZlcnRleEV4dCA9IHF1YWRFeHQgKyAxO1xuXG4gICAgICAgICAgICB0aGlzLl93aXJlZnJhbWVTZWdtZW50cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDAsIHByaW1pdGl2ZU9mZnNldCA9IDA7IGsgPCBHTE9CRV9MQVRJVFVESU5BTF9HUklEX0xPRF9UQUJMRS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhdGl0dWRpbmFsTG9kID0gR0xPQkVfTEFUSVRVRElOQUxfR1JJRF9MT0RfVEFCTEVba107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYXRpdHVkaW5hbExvZDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVhZEV4dDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGogKiB2ZXJ0ZXhFeHQgKyBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lyZWZyYW1lSW5kaWNlcy5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtZUluZGljZXMuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgdmVydGV4RXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtZUluZGljZXMuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgdmVydGV4RXh0ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBudW1WZXJ0aWNlcyA9IChsYXRpdHVkaW5hbExvZCArIDEpICogdmVydGV4RXh0O1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bVByaW1pdGl2ZXMgPSBsYXRpdHVkaW5hbExvZCAqIHF1YWRFeHQgKiAzO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fd2lyZWZyYW1lU2VnbWVudHMucHVzaChTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgcHJpbWl0aXZlT2Zmc2V0LCBudW1WZXJ0aWNlcywgbnVtUHJpbWl0aXZlcykpO1xuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU9mZnNldCArPSBudW1QcmltaXRpdmVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl93aXJlZnJhbWVJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIod2lyZWZyYW1lSW5kaWNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0aGlzLl9ncmlkQnVmZmVyLCB0aGlzLl93aXJlZnJhbWVJbmRleEJ1ZmZlciwgdGhpcy5fd2lyZWZyYW1lU2VnbWVudHNbbG9kXV07XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7dmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7UmF5fSBmcm9tICcuLi8uLi91dGlsL3ByaW1pdGl2ZXMuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL3RyYW5zZm9ybS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lKHRyOiBUcmFuc2Zvcm0sIHBpeGVsc1Blck1ldGVyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIEZpbmQgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNlbnRlciBwb2ludCBbd2lkdGgvMiArIG9mZnNldC54LCBoZWlnaHQvMiArIG9mZnNldC55XSB0byB0aGVcbiAgICAvLyBjZW50ZXIgdG9wIHBvaW50IFt3aWR0aC8yICsgb2Zmc2V0LngsIDBdIGluIFogdW5pdHMsIHVzaW5nIHRoZSBsYXcgb2Ygc2luZXMuXG4gICAgLy8gMSBaIHVuaXQgaXMgZXF1aXZhbGVudCB0byAxIGhvcml6b250YWwgcHggYXQgdGhlIGNlbnRlciBvZiB0aGUgbWFwXG4gICAgLy8gKHRoZSBkaXN0YW5jZSBiZXR3ZWVuW3dpZHRoLzIsIGhlaWdodC8yXSBhbmQgW3dpZHRoLzIgKyAxLCBoZWlnaHQvMl0pXG4gICAgY29uc3QgZm92QWJvdmVDZW50ZXIgPSB0ci5mb3ZBYm92ZUNlbnRlcjtcblxuICAgIC8vIEFkanVzdCBkaXN0YW5jZSB0byBNU0wgYnkgdGhlIG1pbmltdW0gcG9zc2libGUgZWxldmF0aW9uIHZpc2libGUgb24gc2NyZWVuLFxuICAgIC8vIHRoaXMgd2F5IHRoZSBmYXIgcGxhbmUgaXMgcHVzaGVkIGZ1cnRoZXIgaW4gdGhlIGNhc2Ugb2YgbmVnYXRpdmUgZWxldmF0aW9uLlxuICAgIGNvbnN0IG1pbkVsZXZhdGlvbkluUGl4ZWxzID0gdHIuZWxldmF0aW9uID9cbiAgICAgICAgdHIuZWxldmF0aW9uLmdldE1pbkVsZXZhdGlvbkJlbG93TVNMKCkgKiBwaXhlbHNQZXJNZXRlciA6XG4gICAgICAgIDA7XG4gICAgY29uc3QgY2FtZXJhVG9TZWFMZXZlbERpc3RhbmNlID0gKCh0ci5fY2FtZXJhLnBvc2l0aW9uWzJdICogdHIud29ybGRTaXplKSAtIG1pbkVsZXZhdGlvbkluUGl4ZWxzKSAvIE1hdGguY29zKHRyLl9waXRjaCk7XG4gICAgY29uc3QgdG9wSGFsZlN1cmZhY2VEaXN0YW5jZSA9IE1hdGguc2luKGZvdkFib3ZlQ2VudGVyKSAqIGNhbWVyYVRvU2VhTGV2ZWxEaXN0YW5jZSAvIE1hdGguc2luKE1hdGgubWF4KE1hdGguUEkgLyAyLjAgLSB0ci5fcGl0Y2ggLSBmb3ZBYm92ZUNlbnRlciwgMC4wMSkpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHogZGlzdGFuY2Ugb2YgdGhlIGZhcnRoZXN0IGZyYWdtZW50IHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkLlxuICAgIGNvbnN0IGZ1cnRoZXN0RGlzdGFuY2UgPSBNYXRoLnNpbih0ci5fcGl0Y2gpICogdG9wSGFsZlN1cmZhY2VEaXN0YW5jZSArIGNhbWVyYVRvU2VhTGV2ZWxEaXN0YW5jZTtcbiAgICBjb25zdCBob3Jpem9uRGlzdGFuY2UgPSBjYW1lcmFUb1NlYUxldmVsRGlzdGFuY2UgKiAoMSAvIHRyLl9ob3Jpem9uU2hpZnQpO1xuXG4gICAgLy8gQWRkIGEgYml0IGV4dHJhIHRvIGF2b2lkIHByZWNpc2lvbiBwcm9ibGVtcyB3aGVuIGEgZnJhZ21lbnQncyBkaXN0YW5jZSBpcyBleGFjdGx5IGBmdXJ0aGVzdERpc3RhbmNlYFxuICAgIHJldHVybiBNYXRoLm1pbihmdXJ0aGVzdERpc3RhbmNlICogMS4wMSwgaG9yaXpvbkRpc3RhbmNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZhcnRoZXN0UGl4ZWxEaXN0YW5jZU9uU3BoZXJlKHRyOiBUcmFuc2Zvcm0sIHBpeGVsc1Blck1ldGVyOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIEZpbmQgZmFydGhlc3QgZGlzdGFuY2Ugb2YgdGhlIGdsb2JlIHRoYXQgaXMgcG90ZW50aWFsbHkgdmlzaWJsZSB0byB0aGUgY2FtZXJhLlxuICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZSB2aWV3IGZydXN0dW0gaXMgZnVsbHkgY292ZXJlZCBieSB0aGUgbWFwIGJ5IGNhc3RpbmcgYSByYXlcbiAgICAvLyBmcm9tIHRoZSB0b3AgbGVmdC9yaWdodCBjb3JuZXIgYW5kIHNlZSBpZiBpdCBpbnRlcnNlY3RzIHdpdGggdGhlIGdsb2JlLiBJbiBjYXNlXG4gICAgLy8gb2Ygbm8gaW50ZXJzZWN0aW9uIHdlIG5lZWQgdG8gZmluZCBkaXN0YW5jZSB0byB0aGUgaG9yaXpvbiBwb2ludCB3aGVyZSB0aGVcbiAgICAvLyBzdXJmYWNlIG5vcm1hbCBpcyBwZXJwZW5kaWN1bGFyIHRvIHRoZSBjYW1lcmEgZm9yd2FyZCBkaXJlY3Rpb24uXG4gICAgY29uc3QgY2FtZXJhRGlzdGFuY2UgPSB0ci5jYW1lcmFUb0NlbnRlckRpc3RhbmNlO1xuICAgIGNvbnN0IGNlbnRlclBpeGVsQWx0aXR1ZGUgPSB0ci5fY2VudGVyQWx0aXR1ZGUgKiBwaXhlbHNQZXJNZXRlcjtcblxuICAgIGNvbnN0IGNhbWVyYSA9IHRyLl9jYW1lcmE7XG4gICAgY29uc3QgZm9yd2FyZCA9IHRyLl9jYW1lcmEuZm9yd2FyZCgpO1xuICAgIGNvbnN0IGNhbWVyYVBvc2l0aW9uID0gdmVjMy5hZGQoW10sIHZlYzMuc2NhbGUoW10sIGZvcndhcmQsIC1jYW1lcmFEaXN0YW5jZSksIFswLCAwLCBjZW50ZXJQaXhlbEFsdGl0dWRlXSk7XG5cbiAgICBjb25zdCBnbG9iZVJhZGl1cyA9IHRyLndvcmxkU2l6ZSAvICgyLjAgKiBNYXRoLlBJKTtcbiAgICBjb25zdCBnbG9iZUNlbnRlciA9IFswLCAwLCAtZ2xvYmVSYWRpdXNdO1xuXG4gICAgY29uc3QgYXNwZWN0UmF0aW8gPSB0ci53aWR0aCAvIHRyLmhlaWdodDtcbiAgICBjb25zdCB0YW5Gb3ZBYm92ZUNlbnRlciA9IE1hdGgudGFuKHRyLmZvdkFib3ZlQ2VudGVyKTtcblxuICAgIGNvbnN0IHVwID0gdmVjMy5zY2FsZShbXSwgY2FtZXJhLnVwKCksIHRhbkZvdkFib3ZlQ2VudGVyKTtcbiAgICBjb25zdCByaWdodCA9IHZlYzMuc2NhbGUoW10sIGNhbWVyYS5yaWdodCgpLCB0YW5Gb3ZBYm92ZUNlbnRlciAqIGFzcGVjdFJhdGlvKTtcbiAgICBjb25zdCBkaXIgPSB2ZWMzLm5vcm1hbGl6ZShbXSwgdmVjMy5hZGQoW10sIHZlYzMuYWRkKFtdLCBmb3J3YXJkLCB1cCksIHJpZ2h0KSk7XG5cbiAgICBjb25zdCBwb2ludE9uR2xvYmUgPSBbXTtcbiAgICBjb25zdCByYXkgPSBuZXcgUmF5KGNhbWVyYVBvc2l0aW9uLCBkaXIpO1xuXG4gICAgbGV0IHBpeGVsRGlzdGFuY2U7XG4gICAgaWYgKHJheS5jbG9zZXN0UG9pbnRPblNwaGVyZShnbG9iZUNlbnRlciwgZ2xvYmVSYWRpdXMsIHBvaW50T25HbG9iZSkpIHtcbiAgICAgICAgY29uc3QgcDAgPSB2ZWMzLmFkZChbXSwgcG9pbnRPbkdsb2JlLCBnbG9iZUNlbnRlcik7XG4gICAgICAgIGNvbnN0IHAxID0gdmVjMy5zdWIoW10sIHAwLCBjYW1lcmFQb3NpdGlvbik7XG4gICAgICAgIC8vIEdsb2JlIGlzIGZ1bGx5IGNvdmVyaW5nIHRoZSB2aWV3IGZydXN0dW0uIFByb2plY3QgdGhlIGludGVyc2VjdGlvblxuICAgICAgICAvLyBwb2ludCB0byB0aGUgY2FtZXJhIHZpZXcgdmVjdG9yIGluIG9yZGVyIHRvIGZpbmQgdGhlIHBpeGVsIGRpc3RhbmNlXG4gICAgICAgIHBpeGVsRGlzdGFuY2UgPSBNYXRoLmNvcyh0ci5mb3ZBYm92ZUNlbnRlcikgKiB2ZWMzLmxlbmd0aChwMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQmFja2dyb3VuZCBzcGFjZSBpcyB2aXNpYmxlLiBGaW5kIGRpc3RhbmNlIHRvIHRoZSBwb2ludCBvZiB0aGVcbiAgICAgICAgLy8gZ2xvYmUgd2hlcmUgc3VyZmFjZSBub3JtYWwgaXMgcGFyYWxsZWwgdG8gdGhlIHZpZXcgdmVjdG9yXG4gICAgICAgIGNvbnN0IGdsb2JlQ2VudGVyVG9DYW1lcmEgPSB2ZWMzLnN1YihbXSwgY2FtZXJhUG9zaXRpb24sIGdsb2JlQ2VudGVyKTtcbiAgICAgICAgY29uc3QgY2FtZXJhVG9HbG9iZSA9IHZlYzMuc3ViKFtdLCBnbG9iZUNlbnRlciwgY2FtZXJhUG9zaXRpb24pO1xuICAgICAgICB2ZWMzLm5vcm1hbGl6ZShjYW1lcmFUb0dsb2JlLCBjYW1lcmFUb0dsb2JlKTtcblxuICAgICAgICBjb25zdCBjYW1lcmFIZWlnaHQgPSB2ZWMzLmxlbmd0aChnbG9iZUNlbnRlclRvQ2FtZXJhKSAtIGdsb2JlUmFkaXVzO1xuICAgICAgICBwaXhlbERpc3RhbmNlID0gTWF0aC5zcXJ0KGNhbWVyYUhlaWdodCAqIChjYW1lcmFIZWlnaHQgKyAyICogZ2xvYmVSYWRpdXMpKTtcbiAgICAgICAgY29uc3QgYW5nbGUgPSBNYXRoLmFjb3MocGl4ZWxEaXN0YW5jZSAvIChnbG9iZVJhZGl1cyArIGNhbWVyYUhlaWdodCkpIC0gTWF0aC5hY29zKHZlYzMuZG90KGZvcndhcmQsIGNhbWVyYVRvR2xvYmUpKTtcbiAgICAgICAgcGl4ZWxEaXN0YW5jZSAqPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBpeGVsRGlzdGFuY2UgKiAxLjAxO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUsIHthbHRpdHVkZUZyb21NZXJjYXRvclosIGxuZ0Zyb21NZXJjYXRvclgsIGxhdEZyb21NZXJjYXRvcll9IGZyb20gJy4uL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi8uLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQge3ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQge0FhYmJ9IGZyb20gJy4uLy4uL3V0aWwvcHJpbWl0aXZlcy5qcyc7XG5pbXBvcnQge2FhYmJGb3JUaWxlT25HbG9iZX0gZnJvbSAnLi9nbG9iZV91dGlsLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5cbmltcG9ydCB0eXBlIHtWZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHR5cGUgUHJvamVjdGlvbiBmcm9tICcuL3Byb2plY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL3RyYW5zZm9ybS5qcyc7XG5cbmV4cG9ydCB0eXBlIFRpbGVUcmFuc2Zvcm0gPSB7XG4gICAgc2NhbGU6IG51bWJlcixcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHgyOiBudW1iZXIsXG4gICAgeTI6IG51bWJlcixcbiAgICBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aWxlVHJhbnNmb3JtKGlkOiBPYmplY3QsIHByb2plY3Rpb246IFByb2plY3Rpb24pOiBUaWxlVHJhbnNmb3JtIHtcbiAgICBpZiAoIXByb2plY3Rpb24uaXNSZXByb2plY3RlZEluVGlsZVNwYWNlKSB7XG4gICAgICAgIHJldHVybiB7c2NhbGU6IDEgPDwgaWQueiwgeDogaWQueCwgeTogaWQueSwgeDI6IGlkLnggKyAxLCB5MjogaWQueSArIDEsIHByb2plY3Rpb259O1xuICAgIH1cblxuICAgIGNvbnN0IHMgPSBNYXRoLnBvdygyLCAtaWQueik7XG5cbiAgICBjb25zdCB4MSA9IChpZC54KSAqIHM7XG4gICAgY29uc3QgeDIgPSAoaWQueCArIDEpICogcztcbiAgICBjb25zdCB5MSA9IChpZC55KSAqIHM7XG4gICAgY29uc3QgeTIgPSAoaWQueSArIDEpICogcztcblxuICAgIGNvbnN0IGxuZzEgPSBsbmdGcm9tTWVyY2F0b3JYKHgxKTtcbiAgICBjb25zdCBsbmcyID0gbG5nRnJvbU1lcmNhdG9yWCh4Mik7XG4gICAgY29uc3QgbGF0MSA9IGxhdEZyb21NZXJjYXRvclkoeTEpO1xuICAgIGNvbnN0IGxhdDIgPSBsYXRGcm9tTWVyY2F0b3JZKHkyKTtcblxuICAgIGNvbnN0IHAwID0gcHJvamVjdGlvbi5wcm9qZWN0KGxuZzEsIGxhdDEpO1xuICAgIGNvbnN0IHAxID0gcHJvamVjdGlvbi5wcm9qZWN0KGxuZzIsIGxhdDEpO1xuICAgIGNvbnN0IHAyID0gcHJvamVjdGlvbi5wcm9qZWN0KGxuZzIsIGxhdDIpO1xuICAgIGNvbnN0IHAzID0gcHJvamVjdGlvbi5wcm9qZWN0KGxuZzEsIGxhdDIpO1xuXG4gICAgbGV0IG1pblggPSBNYXRoLm1pbihwMC54LCBwMS54LCBwMi54LCBwMy54KTtcbiAgICBsZXQgbWluWSA9IE1hdGgubWluKHAwLnksIHAxLnksIHAyLnksIHAzLnkpO1xuICAgIGxldCBtYXhYID0gTWF0aC5tYXgocDAueCwgcDEueCwgcDIueCwgcDMueCk7XG4gICAgbGV0IG1heFkgPSBNYXRoLm1heChwMC55LCBwMS55LCBwMi55LCBwMy55KTtcblxuICAgIC8vIHdlIHBpY2sgYW4gZXJyb3IgdGhyZXNob2xkIGZvciBjYWxjdWxhdGluZyB0aGUgYmJveCB0aGF0IGJhbGFuY2VzIGJldHdlZW4gcGVyZm9ybWFuY2UgYW5kIHByZWNpc2lvblxuICAgIGNvbnN0IG1heEVyciA9IHMgLyAxNjtcblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NTZWdtZW50KHBhLCBwYiwgYXgsIGF5LCBieCwgYnkpIHtcbiAgICAgICAgY29uc3QgbXggPSAoYXggKyBieCkgLyAyO1xuICAgICAgICBjb25zdCBteSA9IChheSArIGJ5KSAvIDI7XG5cbiAgICAgICAgY29uc3QgcG0gPSBwcm9qZWN0aW9uLnByb2plY3QobG5nRnJvbU1lcmNhdG9yWChteCksIGxhdEZyb21NZXJjYXRvclkobXkpKTtcbiAgICAgICAgY29uc3QgZXJyID0gTWF0aC5tYXgoMCwgbWluWCAtIHBtLngsIG1pblkgLSBwbS55LCBwbS54IC0gbWF4WCwgcG0ueSAtIG1heFkpO1xuXG4gICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBwbS54KTtcbiAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHBtLngpO1xuICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgcG0ueSk7XG4gICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBwbS55KTtcblxuICAgICAgICBpZiAoZXJyID4gbWF4RXJyKSB7XG4gICAgICAgICAgICBwcm9jZXNzU2VnbWVudChwYSwgcG0sIGF4LCBheSwgbXgsIG15KTtcbiAgICAgICAgICAgIHByb2Nlc3NTZWdtZW50KHBtLCBwYiwgbXgsIG15LCBieCwgYnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc1NlZ21lbnQocDAsIHAxLCB4MSwgeTEsIHgyLCB5MSk7XG4gICAgcHJvY2Vzc1NlZ21lbnQocDEsIHAyLCB4MiwgeTEsIHgyLCB5Mik7XG4gICAgcHJvY2Vzc1NlZ21lbnQocDIsIHAzLCB4MiwgeTIsIHgxLCB5Mik7XG4gICAgcHJvY2Vzc1NlZ21lbnQocDMsIHAwLCB4MSwgeTIsIHgxLCB5MSk7XG5cbiAgICAvLyBleHRlbmQgdGhlIGJib3ggYnkgbWF4IGVycm9yIHRvIG1ha2Ugc3VyZSBjb29yZHMgZG9uJ3QgZ28gcGFzdCB0aWxlIGV4dGVudFxuICAgIG1pblggLT0gbWF4RXJyO1xuICAgIG1pblkgLT0gbWF4RXJyO1xuICAgIG1heFggKz0gbWF4RXJyO1xuICAgIG1heFkgKz0gbWF4RXJyO1xuXG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKTtcbiAgICBjb25zdCBzY2FsZSA9IDEgLyBtYXg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBzY2FsZSxcbiAgICAgICAgeDogbWluWCAqIHNjYWxlLFxuICAgICAgICB5OiBtaW5ZICogc2NhbGUsXG4gICAgICAgIHgyOiBtYXhYICogc2NhbGUsXG4gICAgICAgIHkyOiBtYXhZICogc2NhbGUsXG4gICAgICAgIHByb2plY3Rpb25cbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGlsZUFBQkIodHI6IFRyYW5zZm9ybSwgbnVtVGlsZXM6IG51bWJlciwgejogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgd3JhcDogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIsIHByb2plY3Rpb246IFByb2plY3Rpb24pOiBBYWJiIHtcbiAgICBpZiAocHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKSB7XG4gICAgICAgIGNvbnN0IHRpbGVJZCA9IG5ldyBDYW5vbmljYWxUaWxlSUQoeiwgeCwgeSk7XG4gICAgICAgIHJldHVybiBhYWJiRm9yVGlsZU9uR2xvYmUodHIsIG51bVRpbGVzLCB0aWxlSWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHR0ID0gdGlsZVRyYW5zZm9ybSh7eiwgeCwgeX0sIHByb2plY3Rpb24pO1xuICAgIGNvbnN0IHR4ID0gdHQueCAvIHR0LnNjYWxlO1xuICAgIGNvbnN0IHR5ID0gdHQueSAvIHR0LnNjYWxlO1xuICAgIGNvbnN0IHR4MiA9IHR0LngyIC8gdHQuc2NhbGU7XG4gICAgY29uc3QgdHkyID0gdHQueTIgLyB0dC5zY2FsZTtcblxuICAgIGlmIChpc05hTih0eCkgfHwgaXNOYU4odHgyKSB8fCBpc05hTih0eSkgfHwgaXNOYU4odHkyKSkge1xuICAgICAgICBhc3NlcnQoZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQWFiYihcbiAgICAgICAgWyh3cmFwICsgdHgpICogbnVtVGlsZXMsIG51bVRpbGVzICogdHksIG1pbl0sXG4gICAgICAgIFsod3JhcCAgKyB0eDIpICogbnVtVGlsZXMsIG51bVRpbGVzICogdHkyLCBtYXhdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbGVQb2ludCh0aWxlVHJhbnNmb3JtOiBUaWxlVHJhbnNmb3JtLCB7eCwgeX06IHt4OiBudW1iZXIsIHk6IG51bWJlcn0sIHdyYXA6IG51bWJlciA9IDApOiBQb2ludCB7XG4gICAgcmV0dXJuIG5ldyBQb2ludChcbiAgICAgICAgKCh4IC0gd3JhcCkgKiB0aWxlVHJhbnNmb3JtLnNjYWxlIC0gdGlsZVRyYW5zZm9ybS54KSAqIEVYVEVOVCxcbiAgICAgICAgKHkgKiB0aWxlVHJhbnNmb3JtLnNjYWxlIC0gdGlsZVRyYW5zZm9ybS55KSAqIEVYVEVOVCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaWxlVmVjMyh0aWxlVHJhbnNmb3JtOiBUaWxlVHJhbnNmb3JtLCBjb29yZDogTWVyY2F0b3JDb29yZGluYXRlLCB3cmFwOiBudW1iZXIgPSAwKTogVmVjMyB7XG4gICAgY29uc3QgeCA9ICgoY29vcmQueCAtIHdyYXApICogdGlsZVRyYW5zZm9ybS5zY2FsZSAtIHRpbGVUcmFuc2Zvcm0ueCkgKiBFWFRFTlQ7XG4gICAgY29uc3QgeSA9IChjb29yZC55ICogdGlsZVRyYW5zZm9ybS5zY2FsZSAtIHRpbGVUcmFuc2Zvcm0ueSkgKiBFWFRFTlQ7XG4gICAgcmV0dXJuIHZlYzMuZnJvbVZhbHVlcyh4LCB5LCBhbHRpdHVkZUZyb21NZXJjYXRvclooY29vcmQueiwgY29vcmQueSkpO1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vbG5nX2xhdC5qcyc7XG5pbXBvcnQge21lcmNhdG9yWmZyb21BbHRpdHVkZX0gZnJvbSAnLi4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQge2ZhcnRoZXN0UGl4ZWxEaXN0YW5jZU9uUGxhbmV9IGZyb20gJy4vZmFyX3ouanMnO1xuaW1wb3J0IHttYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi8uLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQgdGlsZVRyYW5zZm9ybSBmcm9tICcuL3RpbGVfdHJhbnNmb3JtLmpzJztcblxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUge1ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgdHlwZSBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgdHlwZSB7UHJvamVjdGlvblNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRCwgVW53cmFwcGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5cbmV4cG9ydCB0eXBlIFByb2plY3RlZFBvaW50ID0ge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgejogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRWxldmF0aW9uU2NhbGUgPSB7XG4gICAgLy8gYG1ldGVyc1RvVGlsZWAgY29udmVydHMgbWV0ZXJzIHRvIHVuaXRzIHVzZWQgdG8gZGVzY3JpYmUgZWxldmF0aW9uIGluIHRpbGUgc3BhY2UuXG4gICAgLy8gRGVmYXVsdCB1bml0cyBpbiBtZXJjYXRvciBzcGFjZSBhcmUgeCAmIHk6IFswLCA4MTkyXSBhbmQgejogbWV0ZXJzXG4gICAgbWV0ZXJzVG9UaWxlOiBudW1iZXJcbn1cblxuY29uc3QgaWRlbnRpdHkgPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDMyQXJyYXkoMTYpKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvamVjdGlvbiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHdyYXA6IGJvb2xlYW47XG4gICAgY29uaWM6IGJvb2xlYW47XG4gICAgcmVxdWlyZXNEcmFwaW5nOiBib29sZWFuO1xuICAgIHN1cHBvcnRzV29ybGRDb3BpZXM6IGJvb2xlYW47XG4gICAgc3VwcG9ydHNUZXJyYWluOiBib29sZWFuO1xuICAgIHN1cHBvcnRzRm9nOiBib29sZWFuO1xuICAgIHN1cHBvcnRzRnJlZUNhbWVyYTogYm9vbGVhbjtcbiAgICB6QXhpc1VuaXQ6ICdtZXRlcnMnIHwgJ3BpeGVscyc7XG4gICAgaXNSZXByb2plY3RlZEluVGlsZVNwYWNlOiBib29sZWFuO1xuICAgIGNlbnRlcjogW251bWJlciwgbnVtYmVyXTtcbiAgICByYW5nZTogP1tudW1iZXIsIG51bWJlcl07XG4gICAgcGFyYWxsZWxzOiA/W251bWJlciwgbnVtYmVyXTtcbiAgICB1bnN1cHBvcnRlZExheWVyczogQXJyYXk8c3RyaW5nPjtcbiAgICBzcGVjOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFByb2plY3Rpb25TcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuc3BlYyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICAgICAgdGhpcy53cmFwID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVxdWlyZXNEcmFwaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNXb3JsZENvcGllcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1cHBvcnRzVGVycmFpbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnN1cHBvcnRzRm9nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNGcmVlQ2FtZXJhID0gZmFsc2U7XG4gICAgICAgIHRoaXMuekF4aXNVbml0ID0gJ21ldGVycyc7XG4gICAgICAgIHRoaXMuaXNSZXByb2plY3RlZEluVGlsZVNwYWNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51bnN1cHBvcnRlZExheWVycyA9IFsnY3VzdG9tJ107XG4gICAgICAgIHRoaXMuY2VudGVyID0gWzAsIDBdO1xuICAgICAgICB0aGlzLnJhbmdlID0gWzMuNSwgN107XG4gICAgfVxuXG4gICAgcHJvamVjdChsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpOiBQcm9qZWN0ZWRQb2ludCB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgcmV0dXJuIHt4OiAwLCB5OiAwLCB6OiAwfTsgLy8gb3ZlcnJpZGVuIGluIHN1YmNsYXNzZXNcbiAgICB9XG5cbiAgICB1bnByb2plY3QoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBMbmdMYXQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KDAsIDApOyAvLyBvdmVycmlkZW4gaW4gc3ViY2xhc3Nlc1xuICAgIH1cblxuICAgIHByb2plY3RUaWxlUG9pbnQoeDogbnVtYmVyLCB5OiBudW1iZXIsIF86IENhbm9uaWNhbFRpbGVJRCk6IFByb2plY3RlZFBvaW50IHtcbiAgICAgICAgcmV0dXJuIHt4LCB5LCB6OiAwfTtcbiAgICB9XG5cbiAgICBsb2NhdGlvblBvaW50KHRyOiBUcmFuc2Zvcm0sIGxuZ0xhdDogTG5nTGF0LCB0ZXJyYWluOiBib29sZWFuID0gdHJ1ZSk6IFBvaW50IHtcbiAgICAgICAgcmV0dXJuIHRyLl9jb29yZGluYXRlUG9pbnQodHIubG9jYXRpb25Db29yZGluYXRlKGxuZ0xhdCksIHRlcnJhaW4pO1xuICAgIH1cblxuICAgIHBpeGVsc1Blck1ldGVyKGxhdDogbnVtYmVyLCB3b3JsZFNpemU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgbGF0KSAqIHdvcmxkU2l6ZTtcbiAgICB9XG5cbiAgICAvLyBwaXhlbHMtcGVyLW1ldGVyIGlzIHVzZWQgdG8gZGVzY3JpYmUgcmVsYXRpb24gYmV0d2VlbiByZWFsIHdvcmxkIGFuZCBwaXhlbCBkaXN0YW5jZXMuXG4gICAgLy8gYHBpeGVsU3BhY2VDb252ZXJzaW9uYCBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IHRoZSByYXRpbyBmcm9tIG1lcmNhdG9yIHByb2plY3Rpb24gdG9cbiAgICAvLyB0aGUgY3VycmVudGx5IGFjdGl2ZSBwcm9qZWN0aW9uLlxuICAgIC8vXG4gICAgLy8gYHBpeGVsU3BhY2VDb252ZXJzaW9uYCBpcyB1c2VmdWwgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBwaXhlbCBzcGFjZXMgd2hlcmUgc29tZSBsb2dpY1xuICAgIC8vIGV4cGVjdHMgbWVyY2F0b3IgcGl4ZWxzLCBzdWNoIGFzIHJheWNhc3Rpbmcgd2hlcmUgdGhlIHNjYWxlIGlzIGV4cGVjdGVkIHRvIGJlIGluXG4gICAgLy8gbWVyY2F0b3IgcGl4ZWxzLlxuICAgIHBpeGVsU3BhY2VDb252ZXJzaW9uKGxhdDogbnVtYmVyLCB3b3JsZFNpemU6IG51bWJlciwgaW50ZXJwb2xhdGlvblQ6IG51bWJlcik6IG51bWJlciB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgcmV0dXJuIDEuMDtcbiAgICB9XG5cbiAgICBmYXJ0aGVzdFBpeGVsRGlzdGFuY2UodHI6IFRyYW5zZm9ybSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lKHRyLCB0ci5waXhlbHNQZXJNZXRlcik7XG4gICAgfVxuXG4gICAgcG9pbnRDb29yZGluYXRlKHRyOiBUcmFuc2Zvcm0sIHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIpOiBNZXJjYXRvckNvb3JkaW5hdGUge1xuICAgICAgICBjb25zdCBob3Jpem9uT2Zmc2V0ID0gdHIuaG9yaXpvbkxpbmVGcm9tVG9wKGZhbHNlKTtcbiAgICAgICAgY29uc3QgY2xhbXBlZCA9IG5ldyBQb2ludCh4LCBNYXRoLm1heChob3Jpem9uT2Zmc2V0LCB5KSk7XG4gICAgICAgIHJldHVybiB0ci5yYXlJbnRlcnNlY3Rpb25Db29yZGluYXRlKHRyLnBvaW50UmF5SW50ZXJzZWN0aW9uKGNsYW1wZWQsIHopKTtcbiAgICB9XG5cbiAgICBwb2ludENvb3JkaW5hdGUzRCh0cjogVHJhbnNmb3JtLCB4OiBudW1iZXIsIHk6IG51bWJlcik6ID9WZWMzIHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBQb2ludCh4LCB5KTtcbiAgICAgICAgaWYgKHRyLmVsZXZhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRyLmVsZXZhdGlvbi5wb2ludENvb3JkaW5hdGUocCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtYyA9IHRoaXMucG9pbnRDb29yZGluYXRlKHRyLCBwLngsIHAueSwgMCk7XG4gICAgICAgICAgICByZXR1cm4gW21jLngsIG1jLnksIG1jLnpdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNQb2ludEFib3ZlSG9yaXpvbih0cjogVHJhbnNmb3JtLCBwOiBQb2ludCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHIuZWxldmF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCByYXljYXN0T25UZXJyYWluID0gdGhpcy5wb2ludENvb3JkaW5hdGUzRCh0ciwgcC54LCBwLnkpO1xuICAgICAgICAgICAgcmV0dXJuICFyYXljYXN0T25UZXJyYWluO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhvcml6b24gPSB0ci5ob3Jpem9uTGluZUZyb21Ub3AoKTtcbiAgICAgICAgcmV0dXJuIHAueSA8IGhvcml6b247XG4gICAgfVxuXG4gICAgY3JlYXRlSW52ZXJzaW9uTWF0cml4KHRyOiBUcmFuc2Zvcm0sIGlkOiBDYW5vbmljYWxUaWxlSUQpOiBGbG9hdDMyQXJyYXkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICB9XG5cbiAgICBjcmVhdGVUaWxlTWF0cml4KHRyOiBUcmFuc2Zvcm0sIHdvcmxkU2l6ZTogbnVtYmVyLCBpZDogVW53cmFwcGVkVGlsZUlEKTogRmxvYXQ2NEFycmF5IHtcbiAgICAgICAgbGV0IHNjYWxlLCBzY2FsZWRYLCBzY2FsZWRZO1xuICAgICAgICBjb25zdCBjYW5vbmljYWwgPSBpZC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IHBvc01hdHJpeCA9IG1hdDQuaWRlbnRpdHkobmV3IEZsb2F0NjRBcnJheSgxNikpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZSkge1xuICAgICAgICAgICAgY29uc3QgY3MgPSB0aWxlVHJhbnNmb3JtKGNhbm9uaWNhbCwgdGhpcyk7XG4gICAgICAgICAgICBzY2FsZSA9IDE7XG4gICAgICAgICAgICBzY2FsZWRYID0gY3MueCArIGlkLndyYXAgKiBjcy5zY2FsZTtcbiAgICAgICAgICAgIHNjYWxlZFkgPSBjcy55O1xuICAgICAgICAgICAgbWF0NC5zY2FsZShwb3NNYXRyaXgsIHBvc01hdHJpeCwgW3NjYWxlIC8gY3Muc2NhbGUsIHNjYWxlIC8gY3Muc2NhbGUsIHRyLnBpeGVsc1Blck1ldGVyIC8gd29ybGRTaXplXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY2FsZSA9IHdvcmxkU2l6ZSAvIHRyLnpvb21TY2FsZShjYW5vbmljYWwueik7XG4gICAgICAgICAgICBjb25zdCB1bndyYXBwZWRYID0gY2Fub25pY2FsLnggKyBNYXRoLnBvdygyLCBjYW5vbmljYWwueikgKiBpZC53cmFwO1xuICAgICAgICAgICAgc2NhbGVkWCA9IHVud3JhcHBlZFggKiBzY2FsZTtcbiAgICAgICAgICAgIHNjYWxlZFkgPSBjYW5vbmljYWwueSAqIHNjYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWF0NC50cmFuc2xhdGUocG9zTWF0cml4LCBwb3NNYXRyaXgsIFtzY2FsZWRYLCBzY2FsZWRZLCAwXSk7XG4gICAgICAgIG1hdDQuc2NhbGUocG9zTWF0cml4LCBwb3NNYXRyaXgsIFtzY2FsZSAvIEVYVEVOVCwgc2NhbGUgLyBFWFRFTlQsIDFdKTtcblxuICAgICAgICByZXR1cm4gcG9zTWF0cml4O1xuICAgIH1cblxuICAgIHVwVmVjdG9yKGlkOiBDYW5vbmljYWxUaWxlSUQsIHg6IG51bWJlciwgeTogbnVtYmVyKTogVmVjMyB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgcmV0dXJuIFswLCAwLCAxXTtcbiAgICB9XG5cbiAgICB1cFZlY3RvclNjYWxlKGlkOiBDYW5vbmljYWxUaWxlSUQsIGxhdGl0dWRlOiBudW1iZXIsIHdvcmxkU2l6ZTogbnVtYmVyKTogRWxldmF0aW9uU2NhbGUgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgIHJldHVybiB7bWV0ZXJzVG9UaWxlOiAxfTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9sbmdfbGF0LmpzJztcbmltcG9ydCB7Y2xhbXAsIHdyYXAsIGRlZ1RvUmFkLCByYWRUb0RlZ30gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7TUFYX01FUkNBVE9SX0xBVElUVURFfSBmcm9tICcuLi9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCBQcm9qZWN0aW9uIGZyb20gJy4vcHJvamVjdGlvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHtQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7UHJvamVjdGVkUG9pbnR9IGZyb20gJy4vcHJvamVjdGlvbi5qcyc7XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1nZW8tcHJvamVjdGlvbiwgTUlULWxpY2Vuc2VkXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBbGJlcnMgZXh0ZW5kcyBQcm9qZWN0aW9uIHtcbiAgICBuOiBudW1iZXI7XG4gICAgYzogbnVtYmVyO1xuICAgIHIwOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5yYW5nZSA9IFs0LCA3XTtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSBvcHRpb25zLmNlbnRlciB8fCBbLTk2LCAzNy41XTtcbiAgICAgICAgY29uc3QgW2xhdDAsIGxhdDFdID0gdGhpcy5wYXJhbGxlbHMgPSBvcHRpb25zLnBhcmFsbGVscyB8fCBbMjkuNSwgNDUuNV07XG5cbiAgICAgICAgY29uc3Qgc3kwID0gTWF0aC5zaW4oZGVnVG9SYWQobGF0MCkpO1xuICAgICAgICB0aGlzLm4gPSAoc3kwICsgTWF0aC5zaW4oZGVnVG9SYWQobGF0MSkpKSAvIDI7XG4gICAgICAgIHRoaXMuYyA9IDEgKyBzeTAgKiAoMiAqIHRoaXMubiAtIHN5MCk7XG4gICAgICAgIHRoaXMucjAgPSBNYXRoLnNxcnQodGhpcy5jKSAvIHRoaXMubjtcbiAgICB9XG5cbiAgICBwcm9qZWN0KGxuZzogbnVtYmVyLCBsYXQ6IG51bWJlcik6IFByb2plY3RlZFBvaW50IHtcbiAgICAgICAgY29uc3Qge24sIGMsIHIwfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGxhbWJkYSA9IGRlZ1RvUmFkKGxuZyAtIHRoaXMuY2VudGVyWzBdKTtcbiAgICAgICAgY29uc3QgcGhpID0gZGVnVG9SYWQobGF0KTtcblxuICAgICAgICBjb25zdCByID0gTWF0aC5zcXJ0KGMgLSAyICogbiAqIE1hdGguc2luKHBoaSkpIC8gbjtcbiAgICAgICAgY29uc3QgeCA9IHIgKiBNYXRoLnNpbihsYW1iZGEgKiBuKTtcbiAgICAgICAgY29uc3QgeSA9IHIgKiBNYXRoLmNvcyhsYW1iZGEgKiBuKSAtIHIwO1xuICAgICAgICByZXR1cm4ge3gsIHksIHo6IDB9O1xuICAgIH1cblxuICAgIHVucHJvamVjdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IExuZ0xhdCB7XG4gICAgICAgIGNvbnN0IHtuLCBjLCByMH0gPSB0aGlzO1xuICAgICAgICBjb25zdCByMHkgPSByMCArIHk7XG4gICAgICAgIGxldCBsID0gTWF0aC5hdGFuMih4LCBNYXRoLmFicyhyMHkpKSAqIE1hdGguc2lnbihyMHkpO1xuICAgICAgICBpZiAocjB5ICogbiA8IDApIHtcbiAgICAgICAgICAgIGwgLT0gTWF0aC5QSSAqIE1hdGguc2lnbih4KSAqIE1hdGguc2lnbihyMHkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGR0ID0gZGVnVG9SYWQodGhpcy5jZW50ZXJbMF0pICogbjtcbiAgICAgICAgbCA9IHdyYXAobCwgLU1hdGguUEkgLSBkdCwgTWF0aC5QSSAtIGR0KTtcblxuICAgICAgICBjb25zdCBsbmcgPSByYWRUb0RlZyhsIC8gbikgKyB0aGlzLmNlbnRlclswXTtcbiAgICAgICAgY29uc3QgcGhpID0gTWF0aC5hc2luKGNsYW1wKChjIC0gKHggKiB4ICsgcjB5ICogcjB5KSAqIG4gKiBuKSAvICgyICogbiksIC0xLCAxKSk7XG4gICAgICAgIGNvbnN0IGxhdCA9IGNsYW1wKHJhZFRvRGVnKHBoaSksIC1NQVhfTUVSQ0FUT1JfTEFUSVRVREUsIE1BWF9NRVJDQVRPUl9MQVRJVFVERSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQobG5nLCBsYXQpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2xuZ19sYXQuanMnO1xuaW1wb3J0IHtjbGFtcH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7TUFYX01FUkNBVE9SX0xBVElUVURFfSBmcm9tICcuLi9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCBQcm9qZWN0aW9uIGZyb20gJy4vcHJvamVjdGlvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHtQcm9qZWN0ZWRQb2ludH0gZnJvbSAnLi9wcm9qZWN0aW9uLmpzJztcblxuY29uc3QgYTEgPSAxLjM0MDI2NDtcbmNvbnN0IGEyID0gLTAuMDgxMTA2O1xuY29uc3QgYTMgPSAwLjAwMDg5MztcbmNvbnN0IGE0ID0gMC4wMDM3OTY7XG5jb25zdCBNID0gTWF0aC5zcXJ0KDMpIC8gMjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRXF1YWxFYXJ0aCBleHRlbmRzIFByb2plY3Rpb24ge1xuXG4gICAgcHJvamVjdChsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpOiBQcm9qZWN0ZWRQb2ludCB7XG4gICAgICAgIC8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1nZW8sIE1JVC1saWNlbnNlZFxuICAgICAgICBsYXQgPSBsYXQgLyAxODAgKiBNYXRoLlBJO1xuICAgICAgICBsbmcgPSBsbmcgLyAxODAgKiBNYXRoLlBJO1xuICAgICAgICBjb25zdCB0aGV0YSA9IE1hdGguYXNpbihNICogTWF0aC5zaW4obGF0KSk7XG4gICAgICAgIGNvbnN0IHRoZXRhMiA9IHRoZXRhICogdGhldGE7XG4gICAgICAgIGNvbnN0IHRoZXRhNiA9IHRoZXRhMiAqIHRoZXRhMiAqIHRoZXRhMjtcbiAgICAgICAgY29uc3QgeCA9IGxuZyAqIE1hdGguY29zKHRoZXRhKSAvIChNICogKGExICsgMyAqIGEyICogdGhldGEyICsgdGhldGE2ICogKDcgKiBhMyArIDkgKiBhNCAqIHRoZXRhMikpKTtcbiAgICAgICAgY29uc3QgeSA9IHRoZXRhICogKGExICsgYTIgKiB0aGV0YTIgKyB0aGV0YTYgKiAoYTMgKyBhNCAqIHRoZXRhMikpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiAoeCAvIE1hdGguUEkgKyAwLjUpICogMC41LFxuICAgICAgICAgICAgeTogMSAtICh5IC8gTWF0aC5QSSArIDEpICogMC41LFxuICAgICAgICAgICAgejogMFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHVucHJvamVjdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IExuZ0xhdCB7XG4gICAgICAgIC8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1nZW8sIE1JVC1saWNlbnNlZFxuICAgICAgICB4ID0gKDIgKiB4IC0gMC41KSAqIE1hdGguUEk7XG4gICAgICAgIHkgPSAoMiAqICgxIC0geSkgLSAxKSAqIE1hdGguUEk7XG4gICAgICAgIGxldCB0aGV0YSA9IHk7XG4gICAgICAgIGxldCB0aGV0YTIgPSB0aGV0YSAqIHRoZXRhO1xuICAgICAgICBsZXQgdGhldGE2ID0gdGhldGEyICogdGhldGEyICogdGhldGEyO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBkZWx0YSwgZnksIGZweTsgaSA8IDEyOyArK2kpIHtcbiAgICAgICAgICAgIGZ5ID0gdGhldGEgKiAoYTEgKyBhMiAqIHRoZXRhMiArIHRoZXRhNiAqIChhMyArIGE0ICogdGhldGEyKSkgLSB5O1xuICAgICAgICAgICAgZnB5ID0gYTEgKyAzICogYTIgKiB0aGV0YTIgKyB0aGV0YTYgKiAoNyAqIGEzICsgOSAqIGE0ICogdGhldGEyKTtcbiAgICAgICAgICAgIGRlbHRhID0gZnkgLyBmcHk7XG4gICAgICAgICAgICB0aGV0YSA9IGNsYW1wKHRoZXRhIC0gZGVsdGEsIC1NYXRoLlBJIC8gMywgTWF0aC5QSSAvIDMpO1xuICAgICAgICAgICAgdGhldGEyID0gdGhldGEgKiB0aGV0YTtcbiAgICAgICAgICAgIHRoZXRhNiA9IHRoZXRhMiAqIHRoZXRhMiAqIHRoZXRhMjtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkZWx0YSkgPCAxZS0xMikgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYW1iZGEgPSBNICogeCAqIChhMSArIDMgKiBhMiAqIHRoZXRhMiArIHRoZXRhNiAqICg3ICogYTMgKyA5ICogYTQgKiB0aGV0YTIpKSAvIE1hdGguY29zKHRoZXRhKTtcbiAgICAgICAgY29uc3QgcGhpID0gTWF0aC5hc2luKE1hdGguc2luKHRoZXRhKSAvIE0pO1xuICAgICAgICBjb25zdCBsbmcgPSBjbGFtcChsYW1iZGEgKiAxODAgLyBNYXRoLlBJLCAtMTgwLCAxODApO1xuICAgICAgICBjb25zdCBsYXQgPSBjbGFtcChwaGkgKiAxODAgLyBNYXRoLlBJLCAtTUFYX01FUkNBVE9SX0xBVElUVURFLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREUpO1xuXG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KGxuZywgbGF0KTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9sbmdfbGF0LmpzJztcbmltcG9ydCB7Y2xhbXB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge01BWF9NRVJDQVRPUl9MQVRJVFVERX0gZnJvbSAnLi4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgUHJvamVjdGlvbiBmcm9tICcuL3Byb2plY3Rpb24uanMnO1xuXG5pbXBvcnQgdHlwZSB7UHJvamVjdGlvblNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3RlZFBvaW50fSBmcm9tICcuL3Byb2plY3Rpb24uanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFcXVpcmVjdGFuZ3VsYXIgZXh0ZW5kcyBQcm9qZWN0aW9uIHtcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFByb2plY3Rpb25TcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLndyYXAgPSB0cnVlO1xuICAgICAgICB0aGlzLnN1cHBvcnRzV29ybGRDb3BpZXMgPSB0cnVlO1xuICAgIH1cblxuICAgIHByb2plY3QobG5nOiBudW1iZXIsIGxhdDogbnVtYmVyKTogUHJvamVjdGVkUG9pbnQge1xuICAgICAgICBjb25zdCB4ID0gMC41ICsgbG5nIC8gMzYwO1xuICAgICAgICBjb25zdCB5ID0gMC41IC0gbGF0IC8gMzYwO1xuICAgICAgICByZXR1cm4ge3gsIHksIHo6IDB9O1xuICAgIH1cblxuICAgIHVucHJvamVjdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IExuZ0xhdCB7XG4gICAgICAgIGNvbnN0IGxuZyA9ICh4IC0gMC41KSAqIDM2MDtcbiAgICAgICAgY29uc3QgbGF0ID0gY2xhbXAoKDAuNSAtIHkpICogMzYwLCAtTUFYX01FUkNBVE9SX0xBVElUVURFLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREUpO1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChsbmcsIGxhdCk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vbG5nX2xhdC5qcyc7XG5pbXBvcnQge2NsYW1wLCBkZWdUb1JhZCwgcmFkVG9EZWd9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge01BWF9NRVJDQVRPUl9MQVRJVFVERX0gZnJvbSAnLi4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgUHJvamVjdGlvbiBmcm9tICcuL3Byb2plY3Rpb24uanMnO1xuXG5pbXBvcnQgdHlwZSB7UHJvamVjdGlvblNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3RlZFBvaW50fSBmcm9tICcuL3Byb2plY3Rpb24uanMnO1xuXG5jb25zdCBoYWxmUGkgPSBNYXRoLlBJIC8gMjtcblxuZnVuY3Rpb24gdGFueSh5KSB7XG4gICAgcmV0dXJuIE1hdGgudGFuKChoYWxmUGkgKyB5KSAvIDIpO1xufVxuXG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtZ2VvLCBNSVQtbGljZW5zZWRcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhbWJlcnRDb25mb3JtYWxDb25pYyBleHRlbmRzIFByb2plY3Rpb24ge1xuICAgIG46IG51bWJlcjtcbiAgICBmOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSBvcHRpb25zLmNlbnRlciB8fCBbMCwgMzBdO1xuICAgICAgICBjb25zdCBbbGF0MCwgbGF0MV0gPSB0aGlzLnBhcmFsbGVscyA9IG9wdGlvbnMucGFyYWxsZWxzIHx8IFszMCwgMzBdO1xuXG4gICAgICAgIGNvbnN0IHkwID0gZGVnVG9SYWQobGF0MCk7XG4gICAgICAgIGNvbnN0IHkxID0gZGVnVG9SYWQobGF0MSk7XG4gICAgICAgIGNvbnN0IGN5MCA9IE1hdGguY29zKHkwKTtcbiAgICAgICAgdGhpcy5uID0geTAgPT09IHkxID8gTWF0aC5zaW4oeTApIDogTWF0aC5sb2coY3kwIC8gTWF0aC5jb3MoeTEpKSAvIE1hdGgubG9nKHRhbnkoeTEpIC8gdGFueSh5MCkpO1xuICAgICAgICB0aGlzLmYgPSBjeTAgKiBNYXRoLnBvdyh0YW55KHkwKSwgdGhpcy5uKSAvIHRoaXMubjtcbiAgICB9XG5cbiAgICBwcm9qZWN0KGxuZzogbnVtYmVyLCBsYXQ6IG51bWJlcik6IFByb2plY3RlZFBvaW50IHtcbiAgICAgICAgbGF0ID0gZGVnVG9SYWQobGF0KTtcbiAgICAgICAgbG5nID0gZGVnVG9SYWQobG5nIC0gdGhpcy5jZW50ZXJbMF0pO1xuXG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSAxZS02O1xuICAgICAgICBjb25zdCB7biwgZn0gPSB0aGlzO1xuXG4gICAgICAgIGlmIChmID4gMCkge1xuICAgICAgICAgICAgaWYgKGxhdCA8IC1oYWxmUGkgKyBlcHNpbG9uKSBsYXQgPSAtaGFsZlBpICsgZXBzaWxvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsYXQgPiBoYWxmUGkgLSBlcHNpbG9uKSBsYXQgPSBoYWxmUGkgLSBlcHNpbG9uO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgciA9IGYgLyBNYXRoLnBvdyh0YW55KGxhdCksIG4pO1xuICAgICAgICBjb25zdCB4ID0gciAqIE1hdGguc2luKG4gKiBsbmcpO1xuICAgICAgICBjb25zdCB5ID0gZiAtIHIgKiBNYXRoLmNvcyhuICogbG5nKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogKHggLyBNYXRoLlBJICsgMC41KSAqIDAuNSxcbiAgICAgICAgICAgIHk6IDEgLSAoeSAvIE1hdGguUEkgKyAwLjUpICogMC41LFxuICAgICAgICAgICAgejogMFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHVucHJvamVjdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IExuZ0xhdCB7XG4gICAgICAgIHggPSAoMiAqIHggLSAwLjUpICogTWF0aC5QSTtcbiAgICAgICAgeSA9ICgyICogKDEgLSB5KSAtIDAuNSkgKiBNYXRoLlBJO1xuICAgICAgICBjb25zdCB7biwgZn0gPSB0aGlzO1xuICAgICAgICBjb25zdCBmeSA9IGYgLSB5O1xuICAgICAgICBjb25zdCBzaWduRnkgPSBNYXRoLnNpZ24oZnkpO1xuICAgICAgICBjb25zdCByID0gTWF0aC5zaWduKG4pICogTWF0aC5zcXJ0KHggKiB4ICsgZnkgKiBmeSk7XG4gICAgICAgIGxldCBsID0gTWF0aC5hdGFuMih4LCBNYXRoLmFicyhmeSkpICogc2lnbkZ5O1xuXG4gICAgICAgIGlmIChmeSAqIG4gPCAwKSBsIC09IE1hdGguUEkgKiBNYXRoLnNpZ24oeCkgKiBzaWduRnk7XG5cbiAgICAgICAgY29uc3QgbG5nID0gY2xhbXAocmFkVG9EZWcobCAvIG4pICsgdGhpcy5jZW50ZXJbMF0sIC0xODAsIDE4MCk7XG4gICAgICAgIGNvbnN0IHBoaSA9IDIgKiBNYXRoLmF0YW4oTWF0aC5wb3coZiAvIHIsIDEgLyBuKSkgLSBoYWxmUGk7XG4gICAgICAgIGNvbnN0IGxhdCA9IGNsYW1wKHJhZFRvRGVnKHBoaSksIC1NQVhfTUVSQ0FUT1JfTEFUSVRVREUsIE1BWF9NRVJDQVRPUl9MQVRJVFVERSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQobG5nLCBsYXQpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2xuZ19sYXQuanMnO1xuaW1wb3J0IHttZXJjYXRvclhmcm9tTG5nLCBtZXJjYXRvcllmcm9tTGF0LCBsbmdGcm9tTWVyY2F0b3JYLCBsYXRGcm9tTWVyY2F0b3JZfSBmcm9tICcuLi9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCBQcm9qZWN0aW9uIGZyb20gJy4vcHJvamVjdGlvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHtQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7UHJvamVjdGVkUG9pbnR9IGZyb20gJy4vcHJvamVjdGlvbi5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lcmNhdG9yIGV4dGVuZHMgUHJvamVjdGlvbiB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy53cmFwID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0c1dvcmxkQ29waWVzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0c1RlcnJhaW4gPSB0cnVlO1xuICAgICAgICB0aGlzLnN1cHBvcnRzRm9nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0c0ZyZWVDYW1lcmEgPSB0cnVlO1xuICAgICAgICB0aGlzLmlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnVuc3VwcG9ydGVkTGF5ZXJzID0gW107XG4gICAgICAgIHRoaXMucmFuZ2UgPSBudWxsO1xuICAgIH1cblxuICAgIHByb2plY3QobG5nOiBudW1iZXIsIGxhdDogbnVtYmVyKTogUHJvamVjdGVkUG9pbnQge1xuICAgICAgICBjb25zdCB4ID0gbWVyY2F0b3JYZnJvbUxuZyhsbmcpO1xuICAgICAgICBjb25zdCB5ID0gbWVyY2F0b3JZZnJvbUxhdChsYXQpO1xuICAgICAgICByZXR1cm4ge3gsIHksIHo6IDB9O1xuICAgIH1cblxuICAgIHVucHJvamVjdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IExuZ0xhdCB7XG4gICAgICAgIGNvbnN0IGxuZyA9IGxuZ0Zyb21NZXJjYXRvclgoeCk7XG4gICAgICAgIGNvbnN0IGxhdCA9IGxhdEZyb21NZXJjYXRvclkoeSk7XG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KGxuZywgbGF0KTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9sbmdfbGF0LmpzJztcbmltcG9ydCB7Y2xhbXAsIGRlZ1RvUmFkLCByYWRUb0RlZ30gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7TUFYX01FUkNBVE9SX0xBVElUVURFfSBmcm9tICcuLi9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCBQcm9qZWN0aW9uIGZyb20gJy4vcHJvamVjdGlvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHtQcm9qZWN0ZWRQb2ludH0gZnJvbSAnLi9wcm9qZWN0aW9uLmpzJztcblxuY29uc3QgbWF4UGhpID0gZGVnVG9SYWQoTUFYX01FUkNBVE9SX0xBVElUVURFKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmF0dXJhbEVhcnRoIGV4dGVuZHMgUHJvamVjdGlvbiB7XG5cbiAgICBwcm9qZWN0KGxuZzogbnVtYmVyLCBsYXQ6IG51bWJlcik6IFByb2plY3RlZFBvaW50IHtcbiAgICAgICAgLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLWdlbywgTUlULWxpY2Vuc2VkXG4gICAgICAgIGxhdCA9IGRlZ1RvUmFkKGxhdCk7XG4gICAgICAgIGxuZyA9IGRlZ1RvUmFkKGxuZyk7XG5cbiAgICAgICAgY29uc3QgcGhpMiA9IGxhdCAqIGxhdDtcbiAgICAgICAgY29uc3QgcGhpNCA9IHBoaTIgKiBwaGkyO1xuICAgICAgICBjb25zdCB4ID0gbG5nICogKDAuODcwNyAtIDAuMTMxOTc5ICogcGhpMiArIHBoaTQgKiAoLTAuMDEzNzkxICsgcGhpNCAqICgwLjAwMzk3MSAqIHBoaTIgLSAwLjAwMTUyOSAqIHBoaTQpKSk7XG4gICAgICAgIGNvbnN0IHkgPSBsYXQgKiAoMS4wMDcyMjYgKyBwaGkyICogKDAuMDE1MDg1ICsgcGhpNCAqICgtMC4wNDQ0NzUgKyAwLjAyODg3NCAqIHBoaTIgLSAwLjAwNTkxNiAqIHBoaTQpKSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6ICh4IC8gTWF0aC5QSSArIDAuNSkgKiAwLjUsXG4gICAgICAgICAgICB5OiAxIC0gKHkgLyBNYXRoLlBJICsgMSkgKiAwLjUsXG4gICAgICAgICAgICB6OiAwXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdW5wcm9qZWN0KHg6IG51bWJlciwgeTogbnVtYmVyKTogTG5nTGF0IHtcbiAgICAgICAgLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLWdlbywgTUlULWxpY2Vuc2VkXG4gICAgICAgIHggPSAoMiAqIHggLSAwLjUpICogTWF0aC5QSTtcbiAgICAgICAgeSA9ICgyICogKDEgLSB5KSAtIDEpICogTWF0aC5QSTtcbiAgICAgICAgY29uc3QgZXBzaWxvbiA9IDFlLTY7XG4gICAgICAgIGxldCBwaGkgPSB5O1xuICAgICAgICBsZXQgaSA9IDI1O1xuICAgICAgICBsZXQgZGVsdGEgPSAwO1xuICAgICAgICBsZXQgcGhpMiA9IHBoaSAqIHBoaTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBwaGkyID0gcGhpICogcGhpO1xuICAgICAgICAgICAgY29uc3QgcGhpNCA9IHBoaTIgKiBwaGkyO1xuICAgICAgICAgICAgZGVsdGEgPSAocGhpICogKDEuMDA3MjI2ICsgcGhpMiAqICgwLjAxNTA4NSArIHBoaTQgKiAoLTAuMDQ0NDc1ICsgMC4wMjg4NzQgKiBwaGkyIC0gMC4wMDU5MTYgKiBwaGk0KSkpIC0geSkgL1xuICAgICAgICAgICAgICAgICgxLjAwNzIyNiArIHBoaTIgKiAoMC4wMTUwODUgKiAzICsgcGhpNCAqICgtMC4wNDQ0NzUgKiA3ICsgMC4wMjg4NzQgKiA5ICogcGhpMiAtIDAuMDA1OTE2ICogMTEgKiBwaGk0KSkpO1xuICAgICAgICAgICAgcGhpID0gY2xhbXAocGhpIC0gZGVsdGEsIC1tYXhQaGksIG1heFBoaSk7XG4gICAgICAgIH0gd2hpbGUgKE1hdGguYWJzKGRlbHRhKSA+IGVwc2lsb24gJiYgLS1pID4gMCk7XG5cbiAgICAgICAgcGhpMiA9IHBoaSAqIHBoaTtcbiAgICAgICAgY29uc3QgbGFtYmRhID0geCAvICgwLjg3MDcgKyBwaGkyICogKC0wLjEzMTk3OSArIHBoaTIgKiAoLTAuMDEzNzkxICsgcGhpMiAqIHBoaTIgKiBwaGkyICogKDAuMDAzOTcxIC0gMC4wMDE1MjkgKiBwaGkyKSkpKTtcblxuICAgICAgICBjb25zdCBsbmcgPSBjbGFtcChyYWRUb0RlZyhsYW1iZGEpLCAtMTgwLCAxODApO1xuICAgICAgICBjb25zdCBsYXQgPSByYWRUb0RlZyhwaGkpO1xuXG4gICAgICAgIHJldHVybiBuZXcgTG5nTGF0KGxuZywgbGF0KTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9sbmdfbGF0LmpzJztcbmltcG9ydCB7Y2xhbXAsIGRlZ1RvUmFkLCByYWRUb0RlZ30gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7TUFYX01FUkNBVE9SX0xBVElUVURFfSBmcm9tICcuLi9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCBQcm9qZWN0aW9uIGZyb20gJy4vcHJvamVjdGlvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHtQcm9qZWN0ZWRQb2ludH0gZnJvbSAnLi9wcm9qZWN0aW9uLmpzJztcblxuY29uc3QgbWF4UGhpID0gZGVnVG9SYWQoTUFYX01FUkNBVE9SX0xBVElUVURFKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2lua2VsVHJpcGVsIGV4dGVuZHMgUHJvamVjdGlvbiB7XG5cbiAgICBwcm9qZWN0KGxuZzogbnVtYmVyLCBsYXQ6IG51bWJlcik6IFByb2plY3RlZFBvaW50IHtcbiAgICAgICAgbGF0ID0gZGVnVG9SYWQobGF0KTtcbiAgICAgICAgbG5nID0gZGVnVG9SYWQobG5nKTtcbiAgICAgICAgY29uc3QgY29zTGF0ID0gTWF0aC5jb3MobGF0KTtcbiAgICAgICAgY29uc3QgdHdvT3ZlclBpID0gMiAvIE1hdGguUEk7XG4gICAgICAgIGNvbnN0IGFscGhhID0gTWF0aC5hY29zKGNvc0xhdCAqIE1hdGguY29zKGxuZyAvIDIpKTtcbiAgICAgICAgY29uc3Qgc2luQWxwaGFPdmVyQWxwaGEgPSBNYXRoLnNpbihhbHBoYSkgLyBhbHBoYTtcbiAgICAgICAgY29uc3QgeCA9IDAuNSAqIChsbmcgKiB0d29PdmVyUGkgKyAoMiAqIGNvc0xhdCAqIE1hdGguc2luKGxuZyAvIDIpKSAvIHNpbkFscGhhT3ZlckFscGhhKSB8fCAwO1xuICAgICAgICBjb25zdCB5ID0gMC41ICogKGxhdCArIE1hdGguc2luKGxhdCkgLyBzaW5BbHBoYU92ZXJBbHBoYSkgfHwgMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6ICh4IC8gTWF0aC5QSSArIDAuNSkgKiAwLjUsXG4gICAgICAgICAgICB5OiAxIC0gKHkgLyBNYXRoLlBJICsgMSkgKiAwLjUsXG4gICAgICAgICAgICB6OiAwXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdW5wcm9qZWN0KHg6IG51bWJlciwgeTogbnVtYmVyKTogTG5nTGF0IHtcbiAgICAgICAgLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLWdlby1wcm9qZWN0aW9uLCBNSVQtbGljZW5zZWRcbiAgICAgICAgeCA9ICgyICogeCAtIDAuNSkgKiBNYXRoLlBJO1xuICAgICAgICB5ID0gKDIgKiAoMSAtIHkpIC0gMSkgKiBNYXRoLlBJO1xuICAgICAgICBsZXQgbGFtYmRhID0geDtcbiAgICAgICAgbGV0IHBoaSA9IHk7XG4gICAgICAgIGxldCBpID0gMjU7XG4gICAgICAgIGNvbnN0IGVwc2lsb24gPSAxZS02O1xuICAgICAgICBsZXQgZGxhbWJkYSA9IDAsIGRwaGkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjb25zdCBjb3NwaGkgPSBNYXRoLmNvcyhwaGkpLFxuICAgICAgICAgICAgICAgIHNpbnBoaSA9IE1hdGguc2luKHBoaSksXG4gICAgICAgICAgICAgICAgc2lucGhpMiA9IDIgKiBzaW5waGkgKiBjb3NwaGksXG4gICAgICAgICAgICAgICAgc2luMnBoaSA9IHNpbnBoaSAqIHNpbnBoaSxcbiAgICAgICAgICAgICAgICBjb3MycGhpID0gY29zcGhpICogY29zcGhpLFxuICAgICAgICAgICAgICAgIGNvc2xhbWJkYTIgPSBNYXRoLmNvcyhsYW1iZGEgLyAyKSxcbiAgICAgICAgICAgICAgICBzaW5sYW1iZGEyID0gTWF0aC5zaW4obGFtYmRhIC8gMiksXG4gICAgICAgICAgICAgICAgc2lubGFtYmRhID0gMiAqIGNvc2xhbWJkYTIgKiBzaW5sYW1iZGEyLFxuICAgICAgICAgICAgICAgIHNpbjJsYW1iZGEyID0gc2lubGFtYmRhMiAqIHNpbmxhbWJkYTIsXG4gICAgICAgICAgICAgICAgQyA9IDEgLSBjb3MycGhpICogY29zbGFtYmRhMiAqIGNvc2xhbWJkYTIsXG4gICAgICAgICAgICAgICAgRiA9IEMgPyAxIC8gQyA6IDAsXG4gICAgICAgICAgICAgICAgRSA9IEMgPyBNYXRoLmFjb3MoY29zcGhpICogY29zbGFtYmRhMikgKiBNYXRoLnNxcnQoMSAvIEMpIDogMCxcbiAgICAgICAgICAgICAgICBmeCA9IDAuNSAqICgyICogRSAqIGNvc3BoaSAqIHNpbmxhbWJkYTIgKyBsYW1iZGEgKiAyIC8gTWF0aC5QSSkgLSB4LFxuICAgICAgICAgICAgICAgIGZ5ID0gMC41ICogKEUgKiBzaW5waGkgKyBwaGkpIC0geSxcbiAgICAgICAgICAgICAgICBkeGRsYW1iZGEgPSAwLjUgKiBGICogKGNvczJwaGkgKiBzaW4ybGFtYmRhMiArIEUgKiBjb3NwaGkgKiBjb3NsYW1iZGEyICogc2luMnBoaSkgKyAxIC8gTWF0aC5QSSxcbiAgICAgICAgICAgICAgICBkeGRwaGkgPSBGICogKHNpbmxhbWJkYSAqIHNpbnBoaTIgLyA0IC0gRSAqIHNpbnBoaSAqIHNpbmxhbWJkYTIpLFxuICAgICAgICAgICAgICAgIGR5ZGxhbWJkYSA9IDAuMTI1ICogRiAqIChzaW5waGkyICogc2lubGFtYmRhMiAtIEUgKiBzaW5waGkgKiBjb3MycGhpICogc2lubGFtYmRhKSxcbiAgICAgICAgICAgICAgICBkeWRwaGkgPSAwLjUgKiBGICogKHNpbjJwaGkgKiBjb3NsYW1iZGEyICsgRSAqIHNpbjJsYW1iZGEyICogY29zcGhpKSArIDAuNSxcbiAgICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IGR4ZHBoaSAqIGR5ZGxhbWJkYSAtIGR5ZHBoaSAqIGR4ZGxhbWJkYTtcblxuICAgICAgICAgICAgZGxhbWJkYSA9IChmeSAqIGR4ZHBoaSAtIGZ4ICogZHlkcGhpKSAvIGRlbm9taW5hdG9yO1xuICAgICAgICAgICAgZHBoaSA9IChmeCAqIGR5ZGxhbWJkYSAtIGZ5ICogZHhkbGFtYmRhKSAvIGRlbm9taW5hdG9yO1xuICAgICAgICAgICAgbGFtYmRhID0gY2xhbXAobGFtYmRhIC0gZGxhbWJkYSwgLU1hdGguUEksIE1hdGguUEkpO1xuICAgICAgICAgICAgcGhpID0gY2xhbXAocGhpIC0gZHBoaSwgLW1heFBoaSwgbWF4UGhpKTtcblxuICAgICAgICB9IHdoaWxlICgoTWF0aC5hYnMoZGxhbWJkYSkgPiBlcHNpbG9uIHx8IE1hdGguYWJzKGRwaGkpID4gZXBzaWxvbikgJiYgLS1pID4gMCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQocmFkVG9EZWcobGFtYmRhKSwgcmFkVG9EZWcocGhpKSk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vbG5nX2xhdC5qcyc7XG5pbXBvcnQge2NsYW1wLCBkZWdUb1JhZCwgcmFkVG9EZWd9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge01BWF9NRVJDQVRPUl9MQVRJVFVERX0gZnJvbSAnLi4vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgUHJvamVjdGlvbiBmcm9tICcuL3Byb2plY3Rpb24uanMnO1xuXG5pbXBvcnQgdHlwZSB7UHJvamVjdGlvblNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3RlZFBvaW50fSBmcm9tICcuL3Byb2plY3Rpb24uanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDeWxpbmRyaWNhbEVxdWFsQXJlYSBleHRlbmRzIFByb2plY3Rpb24ge1xuICAgIGNvc1BoaTogbnVtYmVyO1xuICAgIHNjYWxlOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSBvcHRpb25zLmNlbnRlciB8fCBbMCwgMF07XG4gICAgICAgIHRoaXMucGFyYWxsZWxzID0gb3B0aW9ucy5wYXJhbGxlbHMgfHwgWzAsIDBdO1xuICAgICAgICB0aGlzLmNvc1BoaSA9IE1hdGgubWF4KDAuMDEsIE1hdGguY29zKGRlZ1RvUmFkKHRoaXMucGFyYWxsZWxzWzBdKSkpO1xuICAgICAgICAvLyBzY2FsZSBjb29yZGluYXRlcyBiZXR3ZWVuIDAgYW5kIDEgdG8gYXZvaWQgY29uc3RyYWludCBpc3N1ZXNcbiAgICAgICAgdGhpcy5zY2FsZSA9IDEgLyAoMiAqIE1hdGgubWF4KE1hdGguUEkgKiB0aGlzLmNvc1BoaSwgMSAvIHRoaXMuY29zUGhpKSk7XG4gICAgICAgIHRoaXMud3JhcCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3VwcG9ydHNXb3JsZENvcGllcyA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJvamVjdChsbmc6IG51bWJlciwgbGF0OiBudW1iZXIpOiBQcm9qZWN0ZWRQb2ludCB7XG4gICAgICAgIGNvbnN0IHtzY2FsZSwgY29zUGhpfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHggPSBkZWdUb1JhZChsbmcpICogY29zUGhpO1xuICAgICAgICBjb25zdCB5ID0gTWF0aC5zaW4oZGVnVG9SYWQobGF0KSkgLyBjb3NQaGk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6ICh4ICogc2NhbGUpICsgMC41LFxuICAgICAgICAgICAgeTogKC15ICogc2NhbGUpICsgMC41LFxuICAgICAgICAgICAgejogMFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHVucHJvamVjdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IExuZ0xhdCB7XG4gICAgICAgIGNvbnN0IHtzY2FsZSwgY29zUGhpfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHhfID0gKHggLSAwLjUpIC8gc2NhbGU7XG4gICAgICAgIGNvbnN0IHlfID0gLSh5IC0gMC41KSAvIHNjYWxlO1xuICAgICAgICBjb25zdCBsbmcgPSBjbGFtcChyYWRUb0RlZyh4XykgLyBjb3NQaGksIC0xODAsIDE4MCk7XG4gICAgICAgIGNvbnN0IHkyID0geV8gKiBjb3NQaGk7XG4gICAgICAgIGNvbnN0IHkzID0gTWF0aC5hc2luKGNsYW1wKHkyLCAtMSwgMSkpO1xuICAgICAgICBjb25zdCBsYXQgPSBjbGFtcChyYWRUb0RlZyh5MyksIC1NQVhfTUVSQ0FUT1JfTEFUSVRVREUsIE1BWF9NRVJDQVRPUl9MQVRJVFVERSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQobG5nLCBsYXQpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQge21hdDQsIHZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uLy4uL2RhdGEvZXh0ZW50LmpzJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vbG5nX2xhdC5qcyc7XG5pbXBvcnQge2RlZ1RvUmFkfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge1xuICAgIGxuZ0Zyb21NZXJjYXRvclgsXG4gICAgbGF0RnJvbU1lcmNhdG9yWSxcbiAgICBtZXJjYXRvclpmcm9tQWx0aXR1ZGUsXG59IGZyb20gJy4uL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IE1lcmNhdG9yIGZyb20gJy4vbWVyY2F0b3IuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblBsYW5lLCBmYXJ0aGVzdFBpeGVsRGlzdGFuY2VPblNwaGVyZX0gZnJvbSAnLi9mYXJfei5qcyc7XG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCB7XG4gICAgR0xPQkVfTUVURVJTX1RPX0VDRUYsXG4gICAgR0xPQkVfU0NBTEVfTUFUQ0hfTEFUSVRVREUsXG4gICAgbGF0TG5nVG9FQ0VGLFxuICAgIGdsb2JlVGlsZUJvdW5kcyxcbiAgICBnbG9iZU5vcm1hbGl6ZUVDRUYsXG4gICAgZ2xvYmVEZW5vcm1hbGl6ZUVDRUYsXG4gICAgZ2xvYmVFQ0VGTm9ybWFsaXphdGlvblNjYWxlLFxuICAgIGdsb2JlVG9NZXJjYXRvclRyYW5zaXRpb24sXG4gICAgZ2xvYmVQb2ludENvb3JkaW5hdGVcbn0gZnJvbSAnLi9nbG9iZV91dGlsLmpzJztcblxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSB7RWxldmF0aW9uU2NhbGV9IGZyb20gJy4vcHJvamVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7VmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB0eXBlIHtQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlELCBVbndyYXBwZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2xvYmUgZXh0ZW5kcyBNZXJjYXRvciB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5yZXF1aXJlc0RyYXBpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnN1cHBvcnRzV29ybGRDb3BpZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdXBwb3J0c0ZvZyA9IHRydWU7XG4gICAgICAgIHRoaXMuekF4aXNVbml0ID0gXCJwaXhlbHNcIjtcbiAgICAgICAgdGhpcy51bnN1cHBvcnRlZExheWVycyA9IFsnZGVidWcnLCAnY3VzdG9tJ107XG4gICAgICAgIHRoaXMucmFuZ2UgPSBbMywgNV07XG4gICAgfVxuXG4gICAgcHJvamVjdFRpbGVQb2ludCh4OiBudW1iZXIsIHk6IG51bWJlciwgaWQ6IENhbm9uaWNhbFRpbGVJRCk6IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSB7XG4gICAgICAgIGNvbnN0IHRpbGVzID0gTWF0aC5wb3coMi4wLCBpZC56KTtcbiAgICAgICAgY29uc3QgbXggPSAoeCAvIEVYVEVOVCArIGlkLngpIC8gdGlsZXM7XG4gICAgICAgIGNvbnN0IG15ID0gKHkgLyBFWFRFTlQgKyBpZC55KSAvIHRpbGVzO1xuICAgICAgICBjb25zdCBsYXQgPSBsYXRGcm9tTWVyY2F0b3JZKG15KTtcbiAgICAgICAgY29uc3QgbG5nID0gbG5nRnJvbU1lcmNhdG9yWChteCk7XG4gICAgICAgIGNvbnN0IHBvcyA9IGxhdExuZ1RvRUNFRihsYXQsIGxuZyk7XG5cbiAgICAgICAgY29uc3QgYm91bmRzID0gZ2xvYmVUaWxlQm91bmRzKGlkKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXphdGlvbk1hdHJpeCA9IGdsb2JlTm9ybWFsaXplRUNFRihib3VuZHMpO1xuICAgICAgICB2ZWMzLnRyYW5zZm9ybU1hdDQocG9zLCBwb3MsIG5vcm1hbGl6YXRpb25NYXRyaXgpO1xuXG4gICAgICAgIHJldHVybiB7eDogcG9zWzBdLCB5OiBwb3NbMV0sIHo6IHBvc1syXX07XG4gICAgfVxuXG4gICAgbG9jYXRpb25Qb2ludCh0cjogVHJhbnNmb3JtLCBsbmdMYXQ6IExuZ0xhdCk6IFBvaW50IHtcbiAgICAgICAgY29uc3QgcG9zID0gbGF0TG5nVG9FQ0VGKGxuZ0xhdC5sYXQsIGxuZ0xhdC5sbmcpO1xuICAgICAgICBjb25zdCB1cCA9IHZlYzMubm9ybWFsaXplKFtdLCBwb3MpO1xuXG4gICAgICAgIGNvbnN0IGVsZXZhdGlvbiA9IHRyLmVsZXZhdGlvbiA/XG4gICAgICAgICAgICB0ci5lbGV2YXRpb24uZ2V0QXRQb2ludE9yWmVybyh0ci5sb2NhdGlvbkNvb3JkaW5hdGUobG5nTGF0KSwgdHIuX2NlbnRlckFsdGl0dWRlKSA6XG4gICAgICAgICAgICB0ci5fY2VudGVyQWx0aXR1ZGU7XG5cbiAgICAgICAgY29uc3QgdXBTY2FsZSA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCAwKSAqIEVYVEVOVCAqIGVsZXZhdGlvbjtcbiAgICAgICAgdmVjMy5zY2FsZUFuZEFkZChwb3MsIHBvcywgdXAsIHVwU2NhbGUpO1xuICAgICAgICBjb25zdCBtYXRyaXggPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDY0QXJyYXkoMTYpKTtcbiAgICAgICAgbWF0NC5tdWx0aXBseShtYXRyaXgsIHRyLnBpeGVsTWF0cml4LCB0ci5nbG9iZU1hdHJpeCk7XG4gICAgICAgIHZlYzMudHJhbnNmb3JtTWF0NChwb3MsIHBvcywgbWF0cml4KTtcblxuICAgICAgICByZXR1cm4gbmV3IFBvaW50KHBvc1swXSwgcG9zWzFdKTtcbiAgICB9XG5cbiAgICBwaXhlbHNQZXJNZXRlcihsYXQ6IG51bWJlciwgd29ybGRTaXplOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIDApICogd29ybGRTaXplO1xuICAgIH1cblxuICAgIHBpeGVsU3BhY2VDb252ZXJzaW9uKGxhdDogbnVtYmVyLCB3b3JsZFNpemU6IG51bWJlciwgaW50ZXJwb2xhdGlvblQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIC8vIFVzaW5nIG9ubHkgdGhlIGNlbnRlciBsYXRpdHVkZSB0byBkZXRlcm1pbmUgc2NhbGUgY2F1c2VzIHRoZSBnbG9iZSB0byByYXBpZGx5IGNoYW5nZVxuICAgICAgICAvLyBzaXplIGFzIHlvdSBwYW4gdXAgYW5kIGRvd24uIEFzIHlvdSBhcHByb2FjaCB0aGUgcG9sZSwgdGhlIGdsb2JlJ3Mgc2l6ZSBhcHByb2FjaGVzIGluZmluaXR5LlxuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugem9vbSBsZXZlbHMgYXJlIGJhc2VkIG9uIG1lcmNhdG9yLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJbnN0ZWFkLCB1c2UgYSBmaXhlZCByZWZlcmVuY2UgbGF0aXR1ZGUgYXQgbG93ZXIgem9vbSBsZXZlbHMuIEFuZCB0cmFuc2l0aW9uIGJldHdlZW5cbiAgICAgICAgLy8gdGhpcyBsYXRpdHVkZSBhbmQgdGhlIGNlbnRlcidzIGxhdGl0dWRlIGFzIHlvdSB6b29tIGluLiBUaGlzIGlzIGEgY29tcHJvbWlzZSB0aGF0XG4gICAgICAgIC8vIG1ha2VzIGdsb2JlIHZpZXcgbW9yZSB1c2FibGUgd2l0aCBleGlzdGluZyBjYW1lcmEgcGFyYW1ldGVycywgc3R5bGVzIGFuZCBkYXRhLlxuICAgICAgICBjb25zdCByZWZlcmVuY2VTY2FsZSA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCBHTE9CRV9TQ0FMRV9NQVRDSF9MQVRJVFVERSkgKiB3b3JsZFNpemU7XG4gICAgICAgIGNvbnN0IGNlbnRlclNjYWxlID0gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIGxhdCkgKiB3b3JsZFNpemU7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkU2NhbGUgPSBpbnRlcnBvbGF0ZShyZWZlcmVuY2VTY2FsZSwgY2VudGVyU2NhbGUsIGludGVycG9sYXRpb25UKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGl4ZWxzUGVyTWV0ZXIobGF0LCB3b3JsZFNpemUpIC8gY29tYmluZWRTY2FsZTtcbiAgICB9XG5cbiAgICBjcmVhdGVUaWxlTWF0cml4KHRyOiBUcmFuc2Zvcm0sIHdvcmxkU2l6ZTogbnVtYmVyLCBpZDogVW53cmFwcGVkVGlsZUlEKTogRmxvYXQ2NEFycmF5IHtcbiAgICAgICAgY29uc3QgZGVjb2RlID0gZ2xvYmVEZW5vcm1hbGl6ZUVDRUYoZ2xvYmVUaWxlQm91bmRzKGlkLmNhbm9uaWNhbCkpO1xuICAgICAgICByZXR1cm4gbWF0NC5tdWx0aXBseShuZXcgRmxvYXQ2NEFycmF5KDE2KSwgdHIuZ2xvYmVNYXRyaXgsIGRlY29kZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlSW52ZXJzaW9uTWF0cml4KHRyOiBUcmFuc2Zvcm0sIGlkOiBDYW5vbmljYWxUaWxlSUQpOiBGbG9hdDMyQXJyYXkge1xuICAgICAgICBjb25zdCB7Y2VudGVyfSA9IHRyO1xuICAgICAgICBjb25zdCBtYXRyaXggPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDY0QXJyYXkoMTYpKTtcbiAgICAgICAgY29uc3QgZW5jb2RlID0gZ2xvYmVOb3JtYWxpemVFQ0VGKGdsb2JlVGlsZUJvdW5kcyhpZCkpO1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KG1hdHJpeCwgbWF0cml4LCBlbmNvZGUpO1xuICAgICAgICBtYXQ0LnJvdGF0ZVkobWF0cml4LCBtYXRyaXgsIGRlZ1RvUmFkKGNlbnRlci5sbmcpKTtcbiAgICAgICAgbWF0NC5yb3RhdGVYKG1hdHJpeCwgbWF0cml4LCBkZWdUb1JhZChjZW50ZXIubGF0KSk7XG4gICAgICAgIG1hdDQuc2NhbGUobWF0cml4LCBtYXRyaXgsIFt0ci5fcHJvamVjdGlvblNjYWxlciwgdHIuX3Byb2plY3Rpb25TY2FsZXIsIDEuMF0pO1xuICAgICAgICByZXR1cm4gRmxvYXQzMkFycmF5LmZyb20obWF0cml4KTtcbiAgICB9XG5cbiAgICBwb2ludENvb3JkaW5hdGUodHI6IFRyYW5zZm9ybSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIF86IG51bWJlcik6IE1lcmNhdG9yQ29vcmRpbmF0ZSB7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gZ2xvYmVQb2ludENvb3JkaW5hdGUodHIsIHgsIHksIHRydWUpO1xuICAgICAgICBpZiAoIWNvb3JkKSB7IHJldHVybiBuZXcgTWVyY2F0b3JDb29yZGluYXRlKDAsIDApOyB9IC8vIFRoaXMgd29uJ3QgaGFwcGVuLCBpcyBoZXJlIGZvciBGbG93XG4gICAgICAgIHJldHVybiBjb29yZDtcbiAgICB9XG5cbiAgICBwb2ludENvb3JkaW5hdGUzRCh0cjogVHJhbnNmb3JtLCB4OiBudW1iZXIsIHk6IG51bWJlcik6ID9WZWMzIHtcbiAgICAgICAgY29uc3QgY29vcmQgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZSh0ciwgeCwgeSwgMCk7XG4gICAgICAgIHJldHVybiBbY29vcmQueCwgY29vcmQueSwgY29vcmQuel07XG4gICAgfVxuXG4gICAgaXNQb2ludEFib3ZlSG9yaXpvbih0cjogVHJhbnNmb3JtLCBwOiBQb2ludCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByYXljYXN0T25HbG9iZSA9IGdsb2JlUG9pbnRDb29yZGluYXRlKHRyLCBwLngsIHAueSwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gIXJheWNhc3RPbkdsb2JlO1xuICAgIH1cblxuICAgIGZhcnRoZXN0UGl4ZWxEaXN0YW5jZSh0cjogVHJhbnNmb3JtKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcGl4ZWxzUGVyTWV0ZXIgPSB0aGlzLnBpeGVsc1Blck1ldGVyKHRyLmNlbnRlci5sYXQsIHRyLndvcmxkU2l6ZSk7XG4gICAgICAgIGNvbnN0IGdsb2JlUGl4ZWxEaXN0YW5jZSA9IGZhcnRoZXN0UGl4ZWxEaXN0YW5jZU9uU3BoZXJlKHRyLCBwaXhlbHNQZXJNZXRlcik7XG4gICAgICAgIGNvbnN0IHQgPSBnbG9iZVRvTWVyY2F0b3JUcmFuc2l0aW9uKHRyLnpvb20pO1xuICAgICAgICBpZiAodCA+IDAuMCkge1xuICAgICAgICAgICAgY29uc3QgbWVyY2F0b3JQaXhlbHNQZXJNZXRlciA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCB0ci5jZW50ZXIubGF0KSAqIHRyLndvcmxkU2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IG1lcmNhdG9yUGl4ZWxEaXN0YW5jZSA9IGZhcnRoZXN0UGl4ZWxEaXN0YW5jZU9uUGxhbmUodHIsIG1lcmNhdG9yUGl4ZWxzUGVyTWV0ZXIpO1xuICAgICAgICAgICAgY29uc3QgcGl4ZWxSYWRpdXMgPSB0ci53b3JsZFNpemUgLyAoMi4wICogTWF0aC5QSSk7XG4gICAgICAgICAgICBjb25zdCBhcHByb3hUaWxlQXJjSGFsZkFuZ2xlID0gTWF0aC5tYXgodHIud2lkdGgsIHRyLmhlaWdodCkgLyB0ci53b3JsZFNpemUgKiBNYXRoLlBJO1xuICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IHBpeGVsUmFkaXVzICogKDEuMCAtIE1hdGguY29zKGFwcHJveFRpbGVBcmNIYWxmQW5nbGUpKTtcblxuICAgICAgICAgICAgLy8gRHVyaW5nIHRyYW5zaXRpb24gdG8gbWVyY2F0b3Igd2Ugd291bGQgbGlrZSB0byBrZWVwXG4gICAgICAgICAgICAvLyB0aGUgZmFyIHBsYW5lIGxvd2VyIHRvIGVuc3VyZSB0aGF0IGdlb21ldHJpZXMgKGUuZy4gY2lyY2xlcykgdGhhdCBhcmUgZmFyIGF3YXkgYW5kIGFyZSBub3Qgc3VwcG9zZWRcbiAgICAgICAgICAgIC8vIHRvIGJlIHJlbmRlcmVkIGdldCBjdWxsZWQgb3V0IGNvcnJlY3RseS4gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8xMTQ3NlxuICAgICAgICAgICAgLy8gVG8gYWNoaWV2ZSB0aGlzIHdlIGRhbXBlbiB0aGUgaW50ZXJwb2xhdGlvbi5cbiAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZShnbG9iZVBpeGVsRGlzdGFuY2UsIG1lcmNhdG9yUGl4ZWxEaXN0YW5jZSArIHBhZGRpbmcsIE1hdGgucG93KHQsIDEwLjApKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2xvYmVQaXhlbERpc3RhbmNlO1xuICAgIH1cblxuICAgIHVwVmVjdG9yKGlkOiBDYW5vbmljYWxUaWxlSUQsIHg6IG51bWJlciwgeTogbnVtYmVyKTogVmVjMyB7XG4gICAgICAgIGNvbnN0IHRpbGVzID0gMSA8PCBpZC56O1xuICAgICAgICBjb25zdCBtZXJjWCA9ICh4IC8gRVhURU5UICsgaWQueCkgLyB0aWxlcztcbiAgICAgICAgY29uc3QgbWVyY1kgPSAoeSAvIEVYVEVOVCArIGlkLnkpIC8gdGlsZXM7XG4gICAgICAgIHJldHVybiBsYXRMbmdUb0VDRUYobGF0RnJvbU1lcmNhdG9yWShtZXJjWSksIGxuZ0Zyb21NZXJjYXRvclgobWVyY1gpLCAxLjApO1xuICAgIH1cblxuICAgIHVwVmVjdG9yU2NhbGUoaWQ6IENhbm9uaWNhbFRpbGVJRCk6IEVsZXZhdGlvblNjYWxlIHtcbiAgICAgICAgcmV0dXJuIHttZXRlcnNUb1RpbGU6IEdMT0JFX01FVEVSU19UT19FQ0VGICogZ2xvYmVFQ0VGTm9ybWFsaXphdGlvblNjYWxlKGdsb2JlVGlsZUJvdW5kcyhpZCkpfTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IEFsYmVycyBmcm9tICcuL2FsYmVycy5qcyc7XG5pbXBvcnQgRXF1YWxFYXJ0aCBmcm9tICcuL2VxdWFsX2VhcnRoLmpzJztcbmltcG9ydCBFcXVpcmVjdGFuZ3VsYXIgZnJvbSAnLi9lcXVpcmVjdGFuZ3VsYXIuanMnO1xuaW1wb3J0IExhbWJlcnRDb25mb3JtYWxDb25pYyBmcm9tICcuL2xhbWJlcnQuanMnO1xuaW1wb3J0IE1lcmNhdG9yIGZyb20gJy4vbWVyY2F0b3IuanMnO1xuaW1wb3J0IE5hdHVyYWxFYXJ0aCBmcm9tICcuL25hdHVyYWxfZWFydGguanMnO1xuaW1wb3J0IFdpbmtlbFRyaXBlbCBmcm9tICcuL3dpbmtlbF90cmlwZWwuanMnO1xuaW1wb3J0IEN5bGluZHJpY2FsRXF1YWxBcmVhIGZyb20gJy4vY3lsaW5kcmljYWxfZXF1YWxfYXJlYS5qcyc7XG5pbXBvcnQgR2xvYmUgZnJvbSAnLi9nbG9iZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSBQcm9qZWN0aW9uIGZyb20gJy4vcHJvamVjdGlvbi5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9qZWN0aW9uKGNvbmZpZzogUHJvamVjdGlvblNwZWNpZmljYXRpb24pOiBQcm9qZWN0aW9uIHtcblxuICAgIGNvbnN0IHBhcmFsbGVscyA9IGNvbmZpZy5wYXJhbGxlbHM7XG4gICAgY29uc3QgaXNEZWdlbmVyYXRlQ29uaWMgPSBwYXJhbGxlbHMgPyBNYXRoLmFicyhwYXJhbGxlbHNbMF0gKyBwYXJhbGxlbHNbMV0pIDwgMC4wMSA6IGZhbHNlO1xuXG4gICAgc3dpdGNoIChjb25maWcubmFtZSkge1xuICAgIGNhc2UgJ21lcmNhdG9yJzpcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJjYXRvcihjb25maWcpO1xuICAgIGNhc2UgJ2VxdWlyZWN0YW5ndWxhcic6XG4gICAgICAgIHJldHVybiBuZXcgRXF1aXJlY3Rhbmd1bGFyKGNvbmZpZyk7XG4gICAgY2FzZSAnbmF0dXJhbEVhcnRoJzpcbiAgICAgICAgcmV0dXJuIG5ldyBOYXR1cmFsRWFydGgoY29uZmlnKTtcbiAgICBjYXNlICdlcXVhbEVhcnRoJzpcbiAgICAgICAgcmV0dXJuIG5ldyBFcXVhbEVhcnRoKGNvbmZpZyk7XG4gICAgY2FzZSAnd2lua2VsVHJpcGVsJzpcbiAgICAgICAgcmV0dXJuIG5ldyBXaW5rZWxUcmlwZWwoY29uZmlnKTtcbiAgICBjYXNlICdhbGJlcnMnOlxuICAgICAgICByZXR1cm4gaXNEZWdlbmVyYXRlQ29uaWMgPyBuZXcgQ3lsaW5kcmljYWxFcXVhbEFyZWEoY29uZmlnKSA6IG5ldyBBbGJlcnMoY29uZmlnKTtcbiAgICBjYXNlICdsYW1iZXJ0Q29uZm9ybWFsQ29uaWMnOlxuICAgICAgICByZXR1cm4gaXNEZWdlbmVyYXRlQ29uaWMgPyBuZXcgQ3lsaW5kcmljYWxFcXVhbEFyZWEoY29uZmlnKSA6IG5ldyBMYW1iZXJ0Q29uZm9ybWFsQ29uaWMoY29uZmlnKTtcbiAgICBjYXNlICdnbG9iZSc6XG4gICAgICAgIHJldHVybiBuZXcgR2xvYmUoY29uZmlnKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJvamVjdGlvbiBuYW1lOiAke2NvbmZpZy5uYW1lfWApO1xufVxuXG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3N5bWJvbExheW91dEF0dHJpYnV0ZXMsXG4gICAgc3ltYm9sR2xvYmVFeHRBdHRyaWJ1dGVzLFxuICAgIGNvbGxpc2lvblZlcnRleEF0dHJpYnV0ZXMsXG4gICAgY29sbGlzaW9uVmVydGV4QXR0cmlidXRlc0V4dCxcbiAgICBjb2xsaXNpb25Cb3hMYXlvdXQsXG4gICAgZHluYW1pY0xheW91dEF0dHJpYnV0ZXNcbn0gZnJvbSAnLi9zeW1ib2xfYXR0cmlidXRlcy5qcyc7XG5cbmltcG9ydCB7U3ltYm9sTGF5b3V0QXJyYXksXG4gICAgU3ltYm9sR2xvYmVFeHRBcnJheSxcbiAgICBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXksXG4gICAgU3ltYm9sT3BhY2l0eUFycmF5LFxuICAgIENvbGxpc2lvbkJveExheW91dEFycmF5LFxuICAgIENvbGxpc2lvblZlcnRleEV4dEFycmF5LFxuICAgIENvbGxpc2lvblZlcnRleEFycmF5LFxuICAgIFBsYWNlZFN5bWJvbEFycmF5LFxuICAgIFN5bWJvbEluc3RhbmNlQXJyYXksXG4gICAgR2x5cGhPZmZzZXRBcnJheSxcbiAgICBTeW1ib2xMaW5lVmVydGV4QXJyYXlcbn0gZnJvbSAnLi4vYXJyYXlfdHlwZXMuanMnO1xuXG5pbXBvcnQgT05FX0VNIGZyb20gJy4uLy4uL3N5bWJvbC9vbmVfZW0uanMnO1xuaW1wb3J0ICogYXMgc3ltYm9sU2l6ZSBmcm9tICcuLi8uLi9zeW1ib2wvc3ltYm9sX3NpemUuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vc2VnbWVudC5qcyc7XG5pbXBvcnQge1Byb2dyYW1Db25maWd1cmF0aW9uU2V0fSBmcm9tICcuLi9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHtUcmlhbmdsZUluZGV4QXJyYXksIExpbmVJbmRleEFycmF5fSBmcm9tICcuLi9pbmRleF9hcnJheV90eXBlLmpzJztcbmltcG9ydCB0cmFuc2Zvcm1UZXh0IGZyb20gJy4uLy4uL3N5bWJvbC90cmFuc2Zvcm1fdGV4dC5qcyc7XG5pbXBvcnQgbWVyZ2VMaW5lcyBmcm9tICcuLi8uLi9zeW1ib2wvbWVyZ2VsaW5lcy5qcyc7XG5pbXBvcnQge2FsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUsIHN0cmluZ0NvbnRhaW5zUlRMVGV4dH0gZnJvbSAnLi4vLi4vdXRpbC9zY3JpcHRfZGV0ZWN0aW9uLmpzJztcbmltcG9ydCB7V3JpdGluZ01vZGV9IGZyb20gJy4uLy4uL3N5bWJvbC9zaGFwaW5nLmpzJztcbmltcG9ydCBsb2FkR2VvbWV0cnkgZnJvbSAnLi4vbG9hZF9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgdG9FdmFsdWF0aW9uRmVhdHVyZSBmcm9tICcuLi9ldmFsdWF0aW9uX2ZlYXR1cmUuanMnO1xuaW1wb3J0IG12dCBmcm9tICdAbWFwYm94L3ZlY3Rvci10aWxlJztcbmNvbnN0IHZlY3RvclRpbGVGZWF0dXJlVHlwZXMgPSBtdnQuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXM7XG5pbXBvcnQge3ZlcnRpY2FsaXplZENoYXJhY3Rlck1hcH0gZnJvbSAnLi4vLi4vdXRpbC92ZXJ0aWNhbGl6ZV9wdW5jdHVhdGlvbi5qcyc7XG5pbXBvcnQgQW5jaG9yIGZyb20gJy4uLy4uL3N5bWJvbC9hbmNob3IuanMnO1xuaW1wb3J0IHtnZXRTaXplRGF0YX0gZnJvbSAnLi4vLi4vc3ltYm9sL3N5bWJvbF9zaXplLmpzJztcbmltcG9ydCB7TUFYX1BBQ0tFRF9TSVpFfSBmcm9tICcuLi8uLi9zeW1ib2wvc3ltYm9sX2xheW91dC5qcyc7XG5pbXBvcnQge3JlZ2lzdGVyfSBmcm9tICcuLi8uLi91dGlsL3dlYl93b3JrZXJfdHJhbnNmZXIuanMnO1xuaW1wb3J0IEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuaW1wb3J0IFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcbmltcG9ydCB7cGx1Z2luIGFzIGdsb2JhbFJUTFRleHRQbHVnaW4sIGdldFJUTFRleHRQbHVnaW5TdGF0dXN9IGZyb20gJy4uLy4uL3NvdXJjZS9ydGxfdGV4dF9wbHVnaW4uanMnO1xuaW1wb3J0IHtyZXNhbXBsZVByZWR9IGZyb20gJy4uLy4uL2dlby9wcm9qZWN0aW9uL3Jlc2FtcGxlLmpzJztcbmltcG9ydCB7bG5nRnJvbU1lcmNhdG9yWCwgbGF0RnJvbU1lcmNhdG9yWX0gZnJvbSAnLi4vLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHtsYXRMbmdUb0VDRUZ9IGZyb20gJy4uLy4uL2dlby9wcm9qZWN0aW9uL2dsb2JlX3V0aWwuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3Rpb25TcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB7Z2V0UHJvamVjdGlvbn0gZnJvbSAnLi4vLi4vZ2VvL3Byb2plY3Rpb24vaW5kZXguanMnO1xuaW1wb3J0IHR5cGUgUHJvamVjdGlvbiBmcm9tICcuLi8uLi9nZW8vcHJvamVjdGlvbi9wcm9qZWN0aW9uLmpzJztcbmltcG9ydCB7bWF0NCwgdmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZXh0ZW50LmpzJztcblxuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRCwgT3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge1xuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRQYXJhbWV0ZXJzLFxuICAgIEluZGV4ZWRGZWF0dXJlLFxuICAgIFBvcHVsYXRlUGFyYW1ldGVyc1xufSBmcm9tICcuLi9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUge0NvbGxpc2lvbkJveEFycmF5LCBDb2xsaXNpb25Cb3gsIFN5bWJvbEluc3RhbmNlfSBmcm9tICcuLi9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7U3RydWN0QXJyYXksIFN0cnVjdEFycmF5TWVtYmVyfSBmcm9tICcuLi8uLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5pbXBvcnQgU3ltYm9sU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uLy4uL2dsL2luZGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7U3ltYm9sUXVhZH0gZnJvbSAnLi4vLi4vc3ltYm9sL3F1YWRzLmpzJztcbmltcG9ydCB0eXBlIHtTaXplRGF0YX0gZnJvbSAnLi4vLi4vc3ltYm9sL3N5bWJvbF9zaXplLmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi8uLi9zb3VyY2Uvc291cmNlX3N0YXRlLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlVHJhbnNmb3JtfSBmcm9tICcuLi8uLi9nZW8vcHJvamVjdGlvbi90aWxlX3RyYW5zZm9ybS5qcyc7XG5leHBvcnQgdHlwZSBTaW5nbGVDb2xsaXNpb25Cb3ggPSB7XG4gICAgeDE6IG51bWJlcjtcbiAgICB5MTogbnVtYmVyO1xuICAgIHgyOiBudW1iZXI7XG4gICAgeTI6IG51bWJlcjtcbiAgICBwYWRkaW5nOiBudW1iZXI7XG4gICAgcHJvamVjdGVkQW5jaG9yWDogbnVtYmVyO1xuICAgIHByb2plY3RlZEFuY2hvclk6IG51bWJlcjtcbiAgICBwcm9qZWN0ZWRBbmNob3JaOiBudW1iZXI7XG4gICAgdGlsZUFuY2hvclg6IG51bWJlcjtcbiAgICB0aWxlQW5jaG9yWTogbnVtYmVyO1xuICAgIGVsZXZhdGlvbj86IG51bWJlcjtcbiAgICB0aWxlSUQ/OiBPdmVyc2NhbGVkVGlsZUlEO1xufTtcbmltcG9ydCB0eXBlIHtNYXQ0LCBWZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHR5cGUge1Nwcml0ZVBvc2l0aW9uc30gZnJvbSAnLi4vLi4vdXRpbC9pbWFnZS5qcyc7XG5cbmV4cG9ydCB0eXBlIENvbGxpc2lvbkFycmF5cyA9IHtcbiAgICB0ZXh0Qm94PzogU2luZ2xlQ29sbGlzaW9uQm94O1xuICAgIHZlcnRpY2FsVGV4dEJveD86IFNpbmdsZUNvbGxpc2lvbkJveDtcbiAgICBpY29uQm94PzogU2luZ2xlQ29sbGlzaW9uQm94O1xuICAgIHZlcnRpY2FsSWNvbkJveD86IFNpbmdsZUNvbGxpc2lvbkJveDtcbiAgICB0ZXh0RmVhdHVyZUluZGV4PzogbnVtYmVyO1xuICAgIHZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleD86IG51bWJlcjtcbiAgICBpY29uRmVhdHVyZUluZGV4PzogbnVtYmVyO1xuICAgIHZlcnRpY2FsSWNvbkZlYXR1cmVJbmRleD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFN5bWJvbEZlYXR1cmUgPSB7fFxuICAgIHNvcnRLZXk6IG51bWJlciB8IHZvaWQsXG4gICAgdGV4dDogRm9ybWF0dGVkIHwgdm9pZCxcbiAgICBpY29uOiA/UmVzb2x2ZWRJbWFnZSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8UG9pbnQ+PixcbiAgICBwcm9wZXJ0aWVzOiBPYmplY3QsXG4gICAgdHlwZTogJ1BvaW50JyB8ICdMaW5lU3RyaW5nJyB8ICdQb2x5Z29uJyxcbiAgICBpZD86IGFueVxufH07XG5cbmV4cG9ydCB0eXBlIFNvcnRLZXlSYW5nZSA9IHtcbiAgICBzb3J0S2V5OiBudW1iZXIsXG4gICAgc3ltYm9sSW5zdGFuY2VTdGFydDogbnVtYmVyLFxuICAgIHN5bWJvbEluc3RhbmNlRW5kOiBudW1iZXJcbn07XG5cbnR5cGUgTGluZVZlcnRleFJhbmdlID0ge3xcbiAgICBsaW5lTGVuZ3RoOiBudW1iZXIsXG4gICAgbGluZVN0YXJ0SW5kZXg6IG51bWJlclxufH07XG5cbi8vIE9wYWNpdHkgYXJyYXlzIGFyZSBmcmVxdWVudGx5IHVwZGF0ZWQgYnV0IGRvbid0IGNvbnRhaW4gYSBsb3Qgb2YgaW5mb3JtYXRpb24sIHNvIHdlIHBhY2sgdGhlbVxuLy8gdGlnaHQuIEVhY2ggVWludDMyIGlzIGFjdHVhbGx5IGZvdXIgZHVwbGljYXRlIFVpbnQ4cyBmb3IgdGhlIGZvdXIgY29ybmVycyBvZiBhIGdseXBoXG4vLyA3IGJpdHMgYXJlIGZvciB0aGUgY3VycmVudCBvcGFjaXR5LCBhbmQgdGhlIGxvd2VzdCBiaXQgaXMgdGhlIHRhcmdldCBvcGFjaXR5XG5cbi8vIGFjdHVhbGx5IGRlZmluZWQgaW4gc3ltYm9sX2F0dHJpYnV0ZXMuanNcbi8vIGNvbnN0IHBsYWNlbWVudE9wYWNpdHlBdHRyaWJ1dGVzID0gW1xuLy8gICAgIHsgbmFtZTogJ2FfZmFkZV9vcGFjaXR5JywgY29tcG9uZW50czogMSwgdHlwZTogJ1VpbnQzMicgfVxuLy8gXTtcbmNvbnN0IHNoYWRlck9wYWNpdHlBdHRyaWJ1dGVzID0gW1xuICAgIHtuYW1lOiAnYV9mYWRlX29wYWNpdHknLCBjb21wb25lbnRzOiAxLCB0eXBlOiAnVWludDgnLCBvZmZzZXQ6IDB9XG5dO1xuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgoYXJyYXksIHRpbGVBbmNob3JYLCB0aWxlQW5jaG9yWSwgb3gsIG95LCB0eCwgdHksIHNpemVWZXJ0ZXgsIGlzU0RGOiBib29sZWFuLCBwaXhlbE9mZnNldFgsIHBpeGVsT2Zmc2V0WSwgbWluRm9udFNjYWxlWCwgbWluRm9udFNjYWxlWSkge1xuICAgIGNvbnN0IGFTaXplWCA9IHNpemVWZXJ0ZXggPyBNYXRoLm1pbihNQVhfUEFDS0VEX1NJWkUsIE1hdGgucm91bmQoc2l6ZVZlcnRleFswXSkpIDogMDtcbiAgICBjb25zdCBhU2l6ZVkgPSBzaXplVmVydGV4ID8gTWF0aC5taW4oTUFYX1BBQ0tFRF9TSVpFLCBNYXRoLnJvdW5kKHNpemVWZXJ0ZXhbMV0pKSA6IDA7XG5cbiAgICBhcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgLy8gYV9wb3Nfb2Zmc2V0XG4gICAgICAgIHRpbGVBbmNob3JYLFxuICAgICAgICB0aWxlQW5jaG9yWSxcbiAgICAgICAgTWF0aC5yb3VuZChveCAqIDMyKSxcbiAgICAgICAgTWF0aC5yb3VuZChveSAqIDMyKSxcblxuICAgICAgICAvLyBhX2RhdGFcbiAgICAgICAgdHgsIC8vIHggY29vcmRpbmF0ZSBvZiBzeW1ib2wgb24gZ2x5cGggYXRsYXMgdGV4dHVyZVxuICAgICAgICB0eSwgLy8geSBjb29yZGluYXRlIG9mIHN5bWJvbCBvbiBnbHlwaCBhdGxhcyB0ZXh0dXJlXG4gICAgICAgIChhU2l6ZVggPDwgMSkgKyAoaXNTREYgPyAxIDogMCksXG4gICAgICAgIGFTaXplWSxcbiAgICAgICAgcGl4ZWxPZmZzZXRYICogMTYsXG4gICAgICAgIHBpeGVsT2Zmc2V0WSAqIDE2LFxuICAgICAgICBtaW5Gb250U2NhbGVYICogMjU2LFxuICAgICAgICBtaW5Gb250U2NhbGVZICogMjU2XG4gICAgKTtcbn1cblxuZnVuY3Rpb24gYWRkR2xvYmVWZXJ0ZXgoYXJyYXksIHByb2pBbmNob3JYLCBwcm9qQW5jaG9yWSwgcHJvakFuY2hvclosIG5vcm1YLCBub3JtWSwgbm9ybVopIHtcbiAgICBhcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgLy8gYV9nbG9iZV9hbmNob3JcbiAgICAgICAgcHJvakFuY2hvclgsXG4gICAgICAgIHByb2pBbmNob3JZLFxuICAgICAgICBwcm9qQW5jaG9yWixcblxuICAgICAgICAvLyBhX2dsb2JlX25vcm1hbFxuICAgICAgICBub3JtWCxcbiAgICAgICAgbm9ybVksXG4gICAgICAgIG5vcm1aXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlR2xvYmVWZXJ0ZXhOb3JtYWwoYXJyYXk6IFN5bWJvbEdsb2JlRXh0QXJyYXksIHZlcnRleElkeDogbnVtYmVyLCBub3JtWDogbnVtYmVyLCBub3JtWTogbnVtYmVyLCBub3JtWjogbnVtYmVyKSB7XG4gICAgLy8gTW9kaWZ5IGZsb2F0MzIgYXJyYXkgZGlyZWN0bHkuIDIwIGJ5dGVzIHBlciBlbnRyeSwgM3hJbnQxNiBmb3IgcG9zaXRpb24sIDN4ZmxvYXQzMiBmb3Igbm9ybWFsXG4gICAgY29uc3Qgb2Zmc2V0ID0gdmVydGV4SWR4ICogNSArIDI7XG4gICAgYXJyYXkuZmxvYXQzMltvZmZzZXQgKyAwXSA9IG5vcm1YO1xuICAgIGFycmF5LmZsb2F0MzJbb2Zmc2V0ICsgMV0gPSBub3JtWTtcbiAgICBhcnJheS5mbG9hdDMyW29mZnNldCArIDJdID0gbm9ybVo7XG59XG5cbmZ1bmN0aW9uIGFkZER5bmFtaWNBdHRyaWJ1dGVzKGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheTogU3RydWN0QXJyYXksIHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIsIGFuZ2xlOiBudW1iZXIpIHtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2soeCwgeSwgeiwgYW5nbGUpO1xuICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayh4LCB5LCB6LCBhbmdsZSk7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHgsIHksIHosIGFuZ2xlKTtcbiAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2soeCwgeSwgeiwgYW5nbGUpO1xufVxuXG5mdW5jdGlvbiBjb250YWluc1JUTFRleHQoZm9ybWF0dGVkVGV4dDogRm9ybWF0dGVkKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGZvcm1hdHRlZFRleHQuc2VjdGlvbnMpIHtcbiAgICAgICAgaWYgKHN0cmluZ0NvbnRhaW5zUlRMVGV4dChzZWN0aW9uLnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBTeW1ib2xCdWZmZXJzIHtcbiAgICBsYXlvdXRWZXJ0ZXhBcnJheTogU3ltYm9sTGF5b3V0QXJyYXk7XG4gICAgbGF5b3V0VmVydGV4QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG5cbiAgICBpbmRleEFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXk7XG4gICAgaW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuXG4gICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb25zOiBQcm9ncmFtQ29uZmlndXJhdGlvblNldDxTeW1ib2xTdHlsZUxheWVyPjtcbiAgICBzZWdtZW50czogU2VnbWVudFZlY3RvcjtcblxuICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheTogU3ltYm9sRHluYW1pY0xheW91dEFycmF5O1xuICAgIGR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIG9wYWNpdHlWZXJ0ZXhBcnJheTogU3ltYm9sT3BhY2l0eUFycmF5O1xuICAgIG9wYWNpdHlWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGdsb2JlRXh0VmVydGV4QXJyYXk6IFN5bWJvbEdsb2JlRXh0QXJyYXk7XG4gICAgZ2xvYmVFeHRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIHBsYWNlZFN5bWJvbEFycmF5OiBQbGFjZWRTeW1ib2xBcnJheTtcblxuICAgIGNvbnN0cnVjdG9yKHByb2dyYW1Db25maWd1cmF0aW9uczogUHJvZ3JhbUNvbmZpZ3VyYXRpb25TZXQ8U3ltYm9sU3R5bGVMYXllcj4pIHtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSA9IG5ldyBTeW1ib2xMYXlvdXRBcnJheSgpO1xuICAgICAgICB0aGlzLmluZGV4QXJyYXkgPSBuZXcgVHJpYW5nbGVJbmRleEFycmF5KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zID0gcHJvZ3JhbUNvbmZpZ3VyYXRpb25zO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbmV3IFNlZ21lbnRWZWN0b3IoKTtcbiAgICAgICAgdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgU3ltYm9sRHluYW1pY0xheW91dEFycmF5KCk7XG4gICAgICAgIHRoaXMub3BhY2l0eVZlcnRleEFycmF5ID0gbmV3IFN5bWJvbE9wYWNpdHlBcnJheSgpO1xuICAgICAgICB0aGlzLnBsYWNlZFN5bWJvbEFycmF5ID0gbmV3IFBsYWNlZFN5bWJvbEFycmF5KCk7XG4gICAgICAgIHRoaXMuZ2xvYmVFeHRWZXJ0ZXhBcnJheSA9IG5ldyBTeW1ib2xHbG9iZUV4dEFycmF5KCk7XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICB0aGlzLmluZGV4QXJyYXkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIHRoaXMub3BhY2l0eVZlcnRleEFycmF5Lmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCwgZHluYW1pY0luZGV4QnVmZmVyOiBib29sZWFuLCB1cGxvYWQ/OiBib29sZWFuLCB1cGRhdGU/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVwbG9hZCkge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmxheW91dFZlcnRleEFycmF5LCBzeW1ib2xMYXlvdXRBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5LCBkeW5hbWljSW5kZXhCdWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5keW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGR5bmFtaWNMYXlvdXRBdHRyaWJ1dGVzLm1lbWJlcnMsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5vcGFjaXR5VmVydGV4QXJyYXksIHNoYWRlck9wYWNpdHlBdHRyaWJ1dGVzLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmdsb2JlRXh0VmVydGV4QXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2xvYmVFeHRWZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmdsb2JlRXh0VmVydGV4QXJyYXksIHN5bWJvbEdsb2JlRXh0QXR0cmlidXRlcy5tZW1iZXJzLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBwZXJmb3JtYW5jZSBoYWNrIHNvIHRoYXQgd2UgY2FuIHdyaXRlIHRvIG9wYWNpdHlWZXJ0ZXhBcnJheSB3aXRoIHVpbnQzMnNcbiAgICAgICAgICAgIC8vIGV2ZW4gdGhvdWdoIHRoZSBzaGFkZXJzIHJlYWQgdWludDhzXG4gICAgICAgICAgICB0aGlzLm9wYWNpdHlWZXJ0ZXhCdWZmZXIuaXRlbVNpemUgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGxvYWQgfHwgdXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAoIXRoaXMubGF5b3V0VmVydGV4QnVmZmVyKSByZXR1cm47XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMub3BhY2l0eVZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLmdsb2JlRXh0VmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmdsb2JlRXh0VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxucmVnaXN0ZXIoU3ltYm9sQnVmZmVycywgJ1N5bWJvbEJ1ZmZlcnMnKTtcblxuY2xhc3MgQ29sbGlzaW9uQnVmZmVycyB7XG4gICAgbGF5b3V0VmVydGV4QXJyYXk6IFN0cnVjdEFycmF5O1xuICAgIGxheW91dEF0dHJpYnV0ZXM6IEFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcblxuICAgIGluZGV4QXJyYXk6IFRyaWFuZ2xlSW5kZXhBcnJheSB8IExpbmVJbmRleEFycmF5O1xuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcblxuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuXG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXk6IENvbGxpc2lvblZlcnRleEFycmF5O1xuICAgIGNvbGxpc2lvblZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuXG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXlFeHQ6IENvbGxpc2lvblZlcnRleEV4dEFycmF5O1xuICAgIGNvbGxpc2lvblZlcnRleEJ1ZmZlckV4dDogVmVydGV4QnVmZmVyO1xuXG4gICAgY29uc3RydWN0b3IoTGF5b3V0QXJyYXk6IENsYXNzPFN0cnVjdEFycmF5PixcbiAgICAgICAgICAgICAgICBsYXlvdXRBdHRyaWJ1dGVzOiBBcnJheTxTdHJ1Y3RBcnJheU1lbWJlcj4sXG4gICAgICAgICAgICAgICAgSW5kZXhBcnJheTogQ2xhc3M8VHJpYW5nbGVJbmRleEFycmF5IHwgTGluZUluZGV4QXJyYXk+KSB7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgTGF5b3V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5sYXlvdXRBdHRyaWJ1dGVzID0gbGF5b3V0QXR0cmlidXRlcztcbiAgICAgICAgdGhpcy5pbmRleEFycmF5ID0gbmV3IEluZGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBTZWdtZW50VmVjdG9yKCk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uVmVydGV4QXJyYXkgPSBuZXcgQ29sbGlzaW9uVmVydGV4QXJyYXkoKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25WZXJ0ZXhBcnJheUV4dCA9IG5ldyBDb2xsaXNpb25WZXJ0ZXhFeHRBcnJheSgpO1xuICAgIH1cblxuICAgIHVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheSwgdGhpcy5sYXlvdXRBdHRyaWJ1dGVzKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRleEFycmF5KTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmNvbGxpc2lvblZlcnRleEFycmF5LCBjb2xsaXNpb25WZXJ0ZXhBdHRyaWJ1dGVzLm1lbWJlcnMsIHRydWUpO1xuICAgICAgICB0aGlzLmNvbGxpc2lvblZlcnRleEJ1ZmZlckV4dCA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMuY29sbGlzaW9uVmVydGV4QXJyYXlFeHQsIGNvbGxpc2lvblZlcnRleEF0dHJpYnV0ZXNFeHQubWVtYmVycywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dFZlcnRleEJ1ZmZlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmxheW91dFZlcnRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaW5kZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmNvbGxpc2lvblZlcnRleEJ1ZmZlckV4dC5kZXN0cm95KCk7XG4gICAgfVxufVxuXG5yZWdpc3RlcihDb2xsaXNpb25CdWZmZXJzLCAnQ29sbGlzaW9uQnVmZmVycycpO1xuXG4vKipcbiAqIFVubGlrZSBvdGhlciBidWNrZXRzLCB3aGljaCBzaW1wbHkgaW1wbGVtZW50ICNhZGRGZWF0dXJlIHdpdGggdHlwZS1zcGVjaWZpY1xuICogbG9naWMgZm9yIChlc3NlbnRpYWxseSkgdHJpYW5ndWxhdGluZyBmZWF0dXJlIGdlb21ldHJpZXMsIFN5bWJvbEJ1Y2tldFxuICogcmVxdWlyZXMgc3BlY2lhbGl6ZWQgYmVoYXZpb3I6XG4gKlxuICogMS4gV29ya2VyVGlsZSNwYXJzZSgpLCB0aGUgbG9naWNhbCBvd25lciBvZiB0aGUgYnVja2V0IGNyZWF0aW9uIHByb2Nlc3MsXG4gKiAgICBjYWxscyBTeW1ib2xCdWNrZXQjcG9wdWxhdGUoKSwgd2hpY2ggcmVzb2x2ZXMgdGV4dCBhbmQgaWNvbiB0b2tlbnMgb25cbiAqICAgIGVhY2ggZmVhdHVyZSwgYWRkcyBlYWNoIGdseXBocyBhbmQgc3ltYm9scyBuZWVkZWQgdG8gdGhlIHBhc3NlZC1pblxuICogICAgY29sbGVjdGlvbnMgb3B0aW9ucy5nbHlwaERlcGVuZGVuY2llcyBhbmQgb3B0aW9ucy5pY29uRGVwZW5kZW5jaWVzLCBhbmRcbiAqICAgIHN0b3JlcyB0aGUgZmVhdHVyZSBkYXRhIGZvciB1c2UgaW4gc3Vic2VxdWVudCBzdGVwICh0aGlzLmZlYXR1cmVzKS5cbiAqXG4gKiAyLiBXb3JrZXJUaWxlIGFzeW5jaHJvbm91c2x5IHJlcXVlc3RzIGZyb20gdGhlIG1haW4gdGhyZWFkIGFsbCBvZiB0aGUgZ2x5cGhzXG4gKiAgICBhbmQgaWNvbnMgbmVlZGVkIChieSB0aGlzIGJ1Y2tldCBhbmQgYW55IG90aGVycykuIFdoZW4gZ2x5cGhzIGFuZCBpY29uc1xuICogICAgaGF2ZSBiZWVuIHJlY2VpdmVkLCB0aGUgV29ya2VyVGlsZSBjcmVhdGVzIGEgQ29sbGlzaW9uSW5kZXggYW5kIGludm9rZXM6XG4gKlxuICogMy4gcGVyZm9ybVN5bWJvbExheW91dChidWNrZXQsIHN0YWNrcywgaWNvbnMpIHBlcmZvcm0gdGV4dHMgc2hhcGluZyBhbmRcbiAqICAgIGxheW91dCBvbiBhIFN5bWJvbCBCdWNrZXQuIFRoaXMgc3RlcCBwb3B1bGF0ZXM6XG4gKiAgICAgIGB0aGlzLnN5bWJvbEluc3RhbmNlc2A6IG1ldGFkYXRhIG9uIGdlbmVyYXRlZCBzeW1ib2xzXG4gKiAgICAgIGBjb2xsaXNpb25Cb3hBcnJheWA6IGNvbGxpc2lvbiBkYXRhIGZvciB1c2UgYnkgZm9yZWdyb3VuZFxuICogICAgICBgdGhpcy50ZXh0YDogU3ltYm9sQnVmZmVycyBmb3IgdGV4dCBzeW1ib2xzXG4gKiAgICAgIGB0aGlzLmljb25zYDogU3ltYm9sQnVmZmVycyBmb3IgaWNvbnNcbiAqICAgICAgYHRoaXMuaWNvbkNvbGxpc2lvbkJveGA6IERlYnVnIFN5bWJvbEJ1ZmZlcnMgZm9yIGljb24gY29sbGlzaW9uIGJveGVzXG4gKiAgICAgIGB0aGlzLnRleHRDb2xsaXNpb25Cb3hgOiBEZWJ1ZyBTeW1ib2xCdWZmZXJzIGZvciB0ZXh0IGNvbGxpc2lvbiBib3hlc1xuICogICAgVGhlIHJlc3VsdHMgYXJlIHNlbnQgdG8gdGhlIGZvcmVncm91bmQgZm9yIHJlbmRlcmluZ1xuICpcbiAqIDQuIHBlcmZvcm1TeW1ib2xQbGFjZW1lbnQoYnVja2V0LCBjb2xsaXNpb25JbmRleCkgaXMgcnVuIG9uIHRoZSBmb3JlZ3JvdW5kLFxuICogICAgYW5kIHVzZXMgdGhlIENvbGxpc2lvbkluZGV4IGFsb25nIHdpdGggY3VycmVudCBjYW1lcmEgc2V0dGluZ3MgdG8gZGV0ZXJtaW5lXG4gKiAgICB3aGljaCBzeW1ib2xzIGNhbiBhY3R1YWxseSBzaG93IG9uIHRoZSBtYXAuIENvbGxpZGVkIHN5bWJvbHMgYXJlIGhpZGRlblxuICogICAgdXNpbmcgYSBkeW5hbWljIFwiT3BhY2l0eVZlcnRleEFycmF5XCIuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3ltYm9sQnVja2V0IGltcGxlbWVudHMgQnVja2V0IHtcbiAgICBzdGF0aWMgTUFYX0dMWVBIUzogbnVtYmVyO1xuICAgIHN0YXRpYyBhZGREeW5hbWljQXR0cmlidXRlczogdHlwZW9mIGFkZER5bmFtaWNBdHRyaWJ1dGVzO1xuXG4gICAgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5O1xuICAgIHpvb206IG51bWJlcjtcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xuICAgIGxheWVyczogQXJyYXk8U3ltYm9sU3R5bGVMYXllcj47XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgc3RhdGVEZXBlbmRlbnRMYXllcnM6IEFycmF5PFN5bWJvbFN0eWxlTGF5ZXI+O1xuICAgIHN0YXRlRGVwZW5kZW50TGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG5cbiAgICBpbmRleDogbnVtYmVyO1xuICAgIHNkZkljb25zOiBib29sZWFuO1xuICAgIGljb25zSW5UZXh0OiBib29sZWFuO1xuICAgIGljb25zTmVlZExpbmVhcjogYm9vbGVhbjtcbiAgICBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXI7XG4gICAganVzdFJlbG9hZGVkOiBib29sZWFuO1xuICAgIGhhc1BhdHRlcm46IGJvb2xlYW47XG4gICAgZnVsbHlDbGlwcGVkOiBib29sZWFuO1xuXG4gICAgdGV4dFNpemVEYXRhOiBTaXplRGF0YTtcbiAgICBpY29uU2l6ZURhdGE6IFNpemVEYXRhO1xuXG4gICAgZ2x5cGhPZmZzZXRBcnJheTogR2x5cGhPZmZzZXRBcnJheTtcbiAgICBsaW5lVmVydGV4QXJyYXk6IFN5bWJvbExpbmVWZXJ0ZXhBcnJheTtcbiAgICBmZWF0dXJlczogQXJyYXk8U3ltYm9sRmVhdHVyZT47XG4gICAgc3ltYm9sSW5zdGFuY2VzOiBTeW1ib2xJbnN0YW5jZUFycmF5O1xuICAgIGNvbGxpc2lvbkFycmF5czogQXJyYXk8Q29sbGlzaW9uQXJyYXlzPjtcbiAgICBzb3J0S2V5UmFuZ2VzOiBBcnJheTxTb3J0S2V5UmFuZ2U+O1xuICAgIHBpeGVsUmF0aW86IG51bWJlcjtcbiAgICB0aWxlUGl4ZWxSYXRpbzogbnVtYmVyO1xuICAgIGNvbXBhcmVUZXh0OiB7W186IHN0cmluZ106IEFycmF5PFBvaW50Pn07XG4gICAgZmFkZVN0YXJ0VGltZTogbnVtYmVyO1xuICAgIHNvcnRGZWF0dXJlc0J5S2V5OiBib29sZWFuO1xuICAgIHNvcnRGZWF0dXJlc0J5WTogYm9vbGVhbjtcbiAgICBjYW5PdmVybGFwOiBib29sZWFuO1xuICAgIHNvcnRlZEFuZ2xlOiBudW1iZXI7XG4gICAgZmVhdHVyZVNvcnRPcmRlcjogQXJyYXk8bnVtYmVyPjtcblxuICAgIGNvbGxpc2lvbkNpcmNsZUFycmF5OiBBcnJheTxudW1iZXI+O1xuICAgIHBsYWNlbWVudEludlByb2pNYXRyaXg6IE1hdDQ7XG4gICAgcGxhY2VtZW50Vmlld3BvcnRNYXRyaXg6IE1hdDQ7XG5cbiAgICB0ZXh0OiBTeW1ib2xCdWZmZXJzO1xuICAgIGljb246IFN5bWJvbEJ1ZmZlcnM7XG4gICAgdGV4dENvbGxpc2lvbkJveDogQ29sbGlzaW9uQnVmZmVycztcbiAgICBpY29uQ29sbGlzaW9uQm94OiBDb2xsaXNpb25CdWZmZXJzO1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcjtcbiAgICBzb3VyY2VJRDogc3RyaW5nO1xuICAgIHN5bWJvbEluc3RhbmNlSW5kZXhlczogQXJyYXk8bnVtYmVyPjtcbiAgICB3cml0aW5nTW9kZXM6IEFycmF5PG51bWJlcj47XG4gICAgYWxsb3dWZXJ0aWNhbFBsYWNlbWVudDogYm9vbGVhbjtcbiAgICBoYXNSVExUZXh0OiBib29sZWFuO1xuICAgIHByb2plY3Rpb246IFByb2plY3Rpb25TcGVjaWZpY2F0aW9uO1xuICAgIHByb2plY3Rpb25JbnN0YW5jZTogP1Byb2plY3Rpb247XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCdWNrZXRQYXJhbWV0ZXJzPFN5bWJvbFN0eWxlTGF5ZXI+KSB7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQm94QXJyYXkgPSBvcHRpb25zLmNvbGxpc2lvbkJveEFycmF5O1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBvcHRpb25zLm92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLmxheWVycyA9IG9wdGlvbnMubGF5ZXJzO1xuICAgICAgICB0aGlzLmxheWVySWRzID0gdGhpcy5sYXllcnMubWFwKGxheWVyID0+IGxheWVyLmlkKTtcbiAgICAgICAgdGhpcy5pbmRleCA9IG9wdGlvbnMuaW5kZXg7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpbyA9IG9wdGlvbnMucGl4ZWxSYXRpbztcbiAgICAgICAgdGhpcy5zb3VyY2VMYXllckluZGV4ID0gb3B0aW9ucy5zb3VyY2VMYXllckluZGV4O1xuICAgICAgICB0aGlzLmhhc1BhdHRlcm4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNSVExUZXh0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZnVsbHlDbGlwcGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ydEtleVJhbmdlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXkgPSBbXTtcbiAgICAgICAgdGhpcy5wbGFjZW1lbnRJbnZQcm9qTWF0cml4ID0gbWF0NC5pZGVudGl0eShbXSk7XG4gICAgICAgIHRoaXMucGxhY2VtZW50Vmlld3BvcnRNYXRyaXggPSBtYXQ0LmlkZW50aXR5KFtdKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzWzBdO1xuICAgICAgICBjb25zdCB1bmV2YWx1YXRlZExheW91dFZhbHVlcyA9IGxheWVyLl91bmV2YWx1YXRlZExheW91dC5fdmFsdWVzO1xuXG4gICAgICAgIHRoaXMudGV4dFNpemVEYXRhID0gZ2V0U2l6ZURhdGEodGhpcy56b29tLCB1bmV2YWx1YXRlZExheW91dFZhbHVlc1sndGV4dC1zaXplJ10pO1xuICAgICAgICB0aGlzLmljb25TaXplRGF0YSA9IGdldFNpemVEYXRhKHRoaXMuem9vbSwgdW5ldmFsdWF0ZWRMYXlvdXRWYWx1ZXNbJ2ljb24tc2l6ZSddKTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheWVyc1swXS5sYXlvdXQ7XG4gICAgICAgIGNvbnN0IHNvcnRLZXkgPSBsYXlvdXQuZ2V0KCdzeW1ib2wtc29ydC1rZXknKTtcbiAgICAgICAgY29uc3Qgek9yZGVyID0gbGF5b3V0LmdldCgnc3ltYm9sLXotb3JkZXInKTtcbiAgICAgICAgdGhpcy5jYW5PdmVybGFwID1cbiAgICAgICAgICAgIGxheW91dC5nZXQoJ3RleHQtYWxsb3ctb3ZlcmxhcCcpIHx8XG4gICAgICAgICAgICBsYXlvdXQuZ2V0KCdpY29uLWFsbG93LW92ZXJsYXAnKSB8fFxuICAgICAgICAgICAgbGF5b3V0LmdldCgndGV4dC1pZ25vcmUtcGxhY2VtZW50JykgfHxcbiAgICAgICAgICAgIGxheW91dC5nZXQoJ2ljb24taWdub3JlLXBsYWNlbWVudCcpO1xuICAgICAgICB0aGlzLnNvcnRGZWF0dXJlc0J5S2V5ID0gek9yZGVyICE9PSAndmlld3BvcnQteScgJiYgc29ydEtleS5jb25zdGFudE9yKDEpICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHpPcmRlckJ5Vmlld3BvcnRZID0gek9yZGVyID09PSAndmlld3BvcnQteScgfHwgKHpPcmRlciA9PT0gJ2F1dG8nICYmICF0aGlzLnNvcnRGZWF0dXJlc0J5S2V5KTtcbiAgICAgICAgdGhpcy5zb3J0RmVhdHVyZXNCeVkgPSB6T3JkZXJCeVZpZXdwb3J0WSAmJiB0aGlzLmNhbk92ZXJsYXA7XG5cbiAgICAgICAgdGhpcy53cml0aW5nTW9kZXMgPSBsYXlvdXQuZ2V0KCd0ZXh0LXdyaXRpbmctbW9kZScpLm1hcCh3bSA9PiBXcml0aW5nTW9kZVt3bV0pO1xuXG4gICAgICAgIHRoaXMuc3RhdGVEZXBlbmRlbnRMYXllcklkcyA9IHRoaXMubGF5ZXJzLmZpbHRlcigobCkgPT4gbC5pc1N0YXRlRGVwZW5kZW50KCkpLm1hcCgobCkgPT4gbC5pZCk7XG5cbiAgICAgICAgdGhpcy5zb3VyY2VJRCA9IG9wdGlvbnMuc291cmNlSUQ7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbiA9IG9wdGlvbnMucHJvamVjdGlvbjtcbiAgICB9XG5cbiAgICBjcmVhdGVBcnJheXMoKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IG5ldyBTeW1ib2xCdWZmZXJzKG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldCh0aGlzLmxheWVycywgdGhpcy56b29tLCBwcm9wZXJ0eSA9PiAvXnRleHQvLnRlc3QocHJvcGVydHkpKSk7XG4gICAgICAgIHRoaXMuaWNvbiA9IG5ldyBTeW1ib2xCdWZmZXJzKG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvblNldCh0aGlzLmxheWVycywgdGhpcy56b29tLCBwcm9wZXJ0eSA9PiAvXmljb24vLnRlc3QocHJvcGVydHkpKSk7XG5cbiAgICAgICAgdGhpcy5nbHlwaE9mZnNldEFycmF5ID0gbmV3IEdseXBoT2Zmc2V0QXJyYXkoKTtcbiAgICAgICAgdGhpcy5saW5lVmVydGV4QXJyYXkgPSBuZXcgU3ltYm9sTGluZVZlcnRleEFycmF5KCk7XG4gICAgICAgIHRoaXMuc3ltYm9sSW5zdGFuY2VzID0gbmV3IFN5bWJvbEluc3RhbmNlQXJyYXkoKTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVHbHlwaERlcGVuZGVuY2llcyh0ZXh0OiBzdHJpbmcsIHN0YWNrOiB7W186IG51bWJlcl06IGJvb2xlYW59LCB0ZXh0QWxvbmdMaW5lOiBib29sZWFuLCBhbGxvd1ZlcnRpY2FsUGxhY2VtZW50OiBib29sZWFuLCBkb2VzQWxsb3dWZXJ0aWNhbFdyaXRpbmdNb2RlOiBib29sZWFuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3RhY2tbdGV4dC5jaGFyQ29kZUF0KGkpXSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoYWxsb3dWZXJ0aWNhbFBsYWNlbWVudCAmJiBkb2VzQWxsb3dWZXJ0aWNhbFdyaXRpbmdNb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxDaGFyID0gdmVydGljYWxpemVkQ2hhcmFjdGVyTWFwW3RleHQuY2hhckF0KGkpXTtcbiAgICAgICAgICAgICAgICBpZiAodmVydGljYWxDaGFyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrW3ZlcnRpY2FsQ2hhci5jaGFyQ29kZUF0KDApXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcG9wdWxhdGUoZmVhdHVyZXM6IEFycmF5PEluZGV4ZWRGZWF0dXJlPiwgb3B0aW9uczogUG9wdWxhdGVQYXJhbWV0ZXJzLCBjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgdGlsZVRyYW5zZm9ybTogVGlsZVRyYW5zZm9ybSkge1xuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJzWzBdO1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBsYXllci5sYXlvdXQ7XG4gICAgICAgIGNvbnN0IGlzR2xvYmUgPSB0aGlzLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJztcblxuICAgICAgICBjb25zdCB0ZXh0Rm9udCA9IGxheW91dC5nZXQoJ3RleHQtZm9udCcpO1xuICAgICAgICBjb25zdCB0ZXh0RmllbGQgPSBsYXlvdXQuZ2V0KCd0ZXh0LWZpZWxkJyk7XG4gICAgICAgIGNvbnN0IGljb25JbWFnZSA9IGxheW91dC5nZXQoJ2ljb24taW1hZ2UnKTtcbiAgICAgICAgY29uc3QgaGFzVGV4dCA9XG4gICAgICAgICAgICAodGV4dEZpZWxkLnZhbHVlLmtpbmQgIT09ICdjb25zdGFudCcgfHxcbiAgICAgICAgICAgICAgICAodGV4dEZpZWxkLnZhbHVlLnZhbHVlIGluc3RhbmNlb2YgRm9ybWF0dGVkICYmICF0ZXh0RmllbGQudmFsdWUudmFsdWUuaXNFbXB0eSgpKSB8fFxuICAgICAgICAgICAgICAgIHRleHRGaWVsZC52YWx1ZS52YWx1ZS50b1N0cmluZygpLmxlbmd0aCA+IDApICYmXG4gICAgICAgICAgICAodGV4dEZvbnQudmFsdWUua2luZCAhPT0gJ2NvbnN0YW50JyB8fCB0ZXh0Rm9udC52YWx1ZS52YWx1ZS5sZW5ndGggPiAwKTtcbiAgICAgICAgLy8gd2Ugc2hvdWxkIGFsd2F5cyByZXNvbHZlIHRoZSBpY29uLWltYWdlIHZhbHVlIGlmIHRoZSBwcm9wZXJ0eSB3YXMgZGVmaW5lZCBpbiB0aGUgc3R5bGVcbiAgICAgICAgLy8gdGhpcyBhbGxvd3MgdXMgdG8gZmlyZSB0aGUgc3R5bGVpbWFnZW1pc3NpbmcgZXZlbnQgaWYgaW1hZ2UgZXZhbHVhdGlvbiByZXR1cm5zIG51bGxcbiAgICAgICAgLy8gdGhlIG9ubHkgd2F5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbnVsbCByZXR1cm5lZCBmcm9tIGEgY29hbGVzY2Ugc3RhdGVtZW50IHdpdGggbm8gdmFsaWQgaW1hZ2VzXG4gICAgICAgIC8vIGFuZCBudWxsIHJldHVybmVkIGJlY2F1c2UgaWNvbi1pbWFnZSB3YXNuJ3QgZGVmaW5lZCBpcyB0byBjaGVjayB3aGV0aGVyIG9yIG5vdCBpY29uSW1hZ2UucGFyYW1ldGVycyBpcyBhbiBlbXB0eSBvYmplY3RcbiAgICAgICAgY29uc3QgaGFzSWNvbiA9IGljb25JbWFnZS52YWx1ZS5raW5kICE9PSAnY29uc3RhbnQnIHx8ICEhaWNvbkltYWdlLnZhbHVlLnZhbHVlIHx8IE9iamVjdC5rZXlzKGljb25JbWFnZS5wYXJhbWV0ZXJzKS5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBzeW1ib2xTb3J0S2V5ID0gbGF5b3V0LmdldCgnc3ltYm9sLXNvcnQta2V5Jyk7XG5cbiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IFtdO1xuXG4gICAgICAgIGlmICghaGFzVGV4dCAmJiAhaGFzSWNvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWNvbnMgPSBvcHRpb25zLmljb25EZXBlbmRlbmNpZXM7XG4gICAgICAgIGNvbnN0IHN0YWNrcyA9IG9wdGlvbnMuZ2x5cGhEZXBlbmRlbmNpZXM7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZUltYWdlcyA9IG9wdGlvbnMuYXZhaWxhYmxlSW1hZ2VzO1xuICAgICAgICBjb25zdCBnbG9iYWxQcm9wZXJ0aWVzID0gbmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMuem9vbSk7XG5cbiAgICAgICAgZm9yIChjb25zdCB7ZmVhdHVyZSwgaWQsIGluZGV4LCBzb3VyY2VMYXllckluZGV4fSBvZiBmZWF0dXJlcykge1xuXG4gICAgICAgICAgICBjb25zdCBuZWVkR2VvbWV0cnkgPSBsYXllci5fZmVhdHVyZUZpbHRlci5uZWVkR2VvbWV0cnk7XG4gICAgICAgICAgICBjb25zdCBldmFsdWF0aW9uRmVhdHVyZSA9IHRvRXZhbHVhdGlvbkZlYXR1cmUoZmVhdHVyZSwgbmVlZEdlb21ldHJ5KTtcbiAgICAgICAgICAgIGlmICghbGF5ZXIuX2ZlYXR1cmVGaWx0ZXIuZmlsdGVyKGdsb2JhbFByb3BlcnRpZXMsIGV2YWx1YXRpb25GZWF0dXJlLCBjYW5vbmljYWwpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghbmVlZEdlb21ldHJ5KSBldmFsdWF0aW9uRmVhdHVyZS5nZW9tZXRyeSA9IGxvYWRHZW9tZXRyeShmZWF0dXJlLCBjYW5vbmljYWwsIHRpbGVUcmFuc2Zvcm0pO1xuXG4gICAgICAgICAgICBpZiAoaXNHbG9iZSAmJiBmZWF0dXJlLnR5cGUgIT09IDEgJiYgY2Fub25pY2FsLnogPD0gNSkge1xuICAgICAgICAgICAgICAgIC8vIFJlc2FtcGxlIGxvbmcgbGluZXMgYW5kIHBvbHlnb25zIGluIGdsb2JlIHZpZXcgc28gdGhhdCB0aGVpciBsZW5ndGggd29udCBleGNlZWQgfjAuMTkgcmFkaWFucyAoMzYwLzMyIGRlZ3JlZXMpLlxuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBsaW5lcyBjb3VsZCBjbGlwIHRocm91Z2ggdGhlIGdsb2JlIGFzIHRoZSByZXNvbHV0aW9uIGlzIG5vdCBlbm91Z2ggdG8gcmVwcmVzZW50IGN1cnZlZCBwYXRocy5cbiAgICAgICAgICAgICAgICAvLyBUaGUgdGhyZXNob2xkIHZhbHVlIGZvbGxvd3Mgc3ViZGl2aXNpb24gc2l6ZSB1c2VkIHdpdGggZmlsbCBleHRydXNpb25zXG4gICAgICAgICAgICAgICAgY29uc3QgZ2VvbSA9IGV2YWx1YXRpb25GZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGVzID0gMSA8PCBjYW5vbmljYWwuejtcbiAgICAgICAgICAgICAgICBjb25zdCBteCA9IGNhbm9uaWNhbC54O1xuICAgICAgICAgICAgICAgIGNvbnN0IG15ID0gY2Fub25pY2FsLnk7XG5cbiAgICAgICAgICAgICAgICAvLyBjb3MoMTEuMjUgZGVncmVlcykgPSAwLjk4MDc4NTI4MDU2XG4gICAgICAgICAgICAgICAgY29uc3QgY29zQW5nbGVUaHJlc2hvbGQgPSAwLjk4MDc4NTI4MDU2O1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlb21baV0gPSByZXNhbXBsZVByZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgcCA9PiBwLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2MCA9IGxhdExuZ1RvRUNFRihsYXRGcm9tTWVyY2F0b3JZKChhLnkgLyBFWFRFTlQgKyBteSkgLyB0aWxlcyksIGxuZ0Zyb21NZXJjYXRvclgoKGEueCAvIEVYVEVOVCArIG14KSAvIHRpbGVzKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdjEgPSBsYXRMbmdUb0VDRUYobGF0RnJvbU1lcmNhdG9yWSgoYi55IC8gRVhURU5UICsgbXkpIC8gdGlsZXMpLCBsbmdGcm9tTWVyY2F0b3JYKChiLnggLyBFWFRFTlQgKyBteCkgLyB0aWxlcyksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWMzLmRvdCh2MCwgdjEpIDwgY29zQW5nbGVUaHJlc2hvbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0OiBGb3JtYXR0ZWQgfCB2b2lkO1xuICAgICAgICAgICAgaWYgKGhhc1RleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBFeHByZXNzaW9uIGV2YWx1YXRpb24gd2lsbCBhdXRvbWF0aWNhbGx5IGNvZXJjZSB0byBGb3JtYXR0ZWRcbiAgICAgICAgICAgICAgICAvLyBidXQgcGxhaW4gc3RyaW5nIHRva2VuIGV2YWx1YXRpb24gc2tpcHMgdGhhdCBwYXRod2F5IHNvIGRvIHRoZVxuICAgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24gaGVyZS5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFRva2VucyA9IGxheWVyLmdldFZhbHVlQW5kUmVzb2x2ZVRva2VucygndGV4dC1maWVsZCcsIGV2YWx1YXRpb25GZWF0dXJlLCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkVGV4dCA9IEZvcm1hdHRlZC5mYWN0b3J5KHJlc29sdmVkVG9rZW5zKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNSVExUZXh0KGZvcm1hdHRlZFRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzUlRMVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuaGFzUlRMVGV4dCB8fCAvLyBub24tcnRsIHRleHQgc28gY2FuIHByb2NlZWQgc2FmZWx5XG4gICAgICAgICAgICAgICAgICAgIGdldFJUTFRleHRQbHVnaW5TdGF0dXMoKSA9PT0gJ3VuYXZhaWxhYmxlJyB8fCAvLyBXZSBkb24ndCBpbnRlbmQgdG8gbGF6eS1sb2FkIHRoZSBydGwgdGV4dCBwbHVnaW4sIHNvIHByb2NlZWQgd2l0aCBpbmNvcnJlY3Qgc2hhcGluZ1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5oYXNSVExUZXh0ICYmIGdsb2JhbFJUTFRleHRQbHVnaW4uaXNQYXJzZWQoKSkgLy8gVXNlIHRoZSBydGxUZXh0IHBsdWdpbiB0byBzaGFwZSB0ZXh0XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0cmFuc2Zvcm1UZXh0KGZvcm1hdHRlZFRleHQsIGxheWVyLCBldmFsdWF0aW9uRmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgaWNvbjogP1Jlc29sdmVkSW1hZ2U7XG4gICAgICAgICAgICBpZiAoaGFzSWNvbikge1xuICAgICAgICAgICAgICAgIC8vIEV4cHJlc3Npb24gZXZhbHVhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgY29lcmNlIHRvIEltYWdlXG4gICAgICAgICAgICAgICAgLy8gYnV0IHBsYWluIHN0cmluZyB0b2tlbiBldmFsdWF0aW9uIHNraXBzIHRoYXQgcGF0aHdheSBzbyBkbyB0aGVcbiAgICAgICAgICAgICAgICAvLyBjb252ZXJzaW9uIGhlcmUuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRUb2tlbnMgPSBsYXllci5nZXRWYWx1ZUFuZFJlc29sdmVUb2tlbnMoJ2ljb24taW1hZ2UnLCBldmFsdWF0aW9uRmVhdHVyZSwgY2Fub25pY2FsLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFRva2VucyBpbnN0YW5jZW9mIFJlc29sdmVkSW1hZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWNvbiA9IHJlc29sdmVkVG9rZW5zO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGljb24gPSBSZXNvbHZlZEltYWdlLmZyb21TdHJpbmcocmVzb2x2ZWRUb2tlbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0ZXh0ICYmICFpY29uKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzb3J0S2V5ID0gdGhpcy5zb3J0RmVhdHVyZXNCeUtleSA/XG4gICAgICAgICAgICAgICAgc3ltYm9sU29ydEtleS5ldmFsdWF0ZShldmFsdWF0aW9uRmVhdHVyZSwge30sIGNhbm9uaWNhbCkgOlxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgY29uc3Qgc3ltYm9sRmVhdHVyZTogU3ltYm9sRmVhdHVyZSA9IHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgIGljb24sXG4gICAgICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogZXZhbHVhdGlvbkZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIHR5cGU6IHZlY3RvclRpbGVGZWF0dXJlVHlwZXNbZmVhdHVyZS50eXBlXSxcbiAgICAgICAgICAgICAgICBzb3J0S2V5XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5mZWF0dXJlcy5wdXNoKHN5bWJvbEZlYXR1cmUpO1xuXG4gICAgICAgICAgICBpZiAoaWNvbikge1xuICAgICAgICAgICAgICAgIGljb25zW2ljb24ubmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnRTdGFjayA9IHRleHRGb250LmV2YWx1YXRlKGV2YWx1YXRpb25GZWF0dXJlLCB7fSwgY2Fub25pY2FsKS5qb2luKCcsJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dEFsb25nTGluZSA9IGxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnICYmIGxheW91dC5nZXQoJ3N5bWJvbC1wbGFjZW1lbnQnKSAhPT0gJ3BvaW50JztcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG93VmVydGljYWxQbGFjZW1lbnQgPSB0aGlzLndyaXRpbmdNb2RlcyAmJiB0aGlzLndyaXRpbmdNb2Rlcy5pbmRleE9mKFdyaXRpbmdNb2RlLnZlcnRpY2FsKSA+PSAwO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0ZXh0LnNlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2VjdGlvbi5pbWFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9lc0FsbG93VmVydGljYWxXcml0aW5nTW9kZSA9IGFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUodGV4dC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25Gb250ID0gc2VjdGlvbi5mb250U3RhY2sgfHwgZm9udFN0YWNrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VjdGlvblN0YWNrID0gc3RhY2tzW3NlY3Rpb25Gb250XSA9IHN0YWNrc1tzZWN0aW9uRm9udF0gfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUdseXBoRGVwZW5kZW5jaWVzKHNlY3Rpb24udGV4dCwgc2VjdGlvblN0YWNrLCB0ZXh0QWxvbmdMaW5lLCB0aGlzLmFsbG93VmVydGljYWxQbGFjZW1lbnQsIGRvZXNBbGxvd1ZlcnRpY2FsV3JpdGluZ01vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHNlY3Rpb24gaW1hZ2UgdG8gdGhlIGxpc3Qgb2YgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbnNbc2VjdGlvbi5pbWFnZS5uYW1lXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpID09PSAnbGluZScpIHtcbiAgICAgICAgICAgIC8vIE1lcmdlIGFkamFjZW50IGxpbmVzIHdpdGggdGhlIHNhbWUgdGV4dCB0byBpbXByb3ZlIGxhYmVsbGluZy5cbiAgICAgICAgICAgIC8vIEl0J3MgYmV0dGVyIHRvIHBsYWNlIGxhYmVscyBvbiBvbmUgbG9uZyBsaW5lIHRoYW4gb24gbWFueSBzaG9ydCBzZWdtZW50cy5cbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMgPSBtZXJnZUxpbmVzKHRoaXMuZmVhdHVyZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc29ydEZlYXR1cmVzQnlLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGEuc29ydEtleSBpcyBhbHdheXMgYSBudW1iZXIgd2hlbiBzb3J0RmVhdHVyZXNCeUtleSBpcyB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuICgoYS5zb3J0S2V5OiBhbnkpOiBudW1iZXIpIC0gKChiLnNvcnRLZXk6IGFueSk6IG51bWJlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZShzdGF0ZXM6IEZlYXR1cmVTdGF0ZXMsIHZ0TGF5ZXI6IFZlY3RvclRpbGVMYXllciwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBpbWFnZVBvc2l0aW9uczogU3ByaXRlUG9zaXRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZURlcGVuZGVudExheWVycy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy50ZXh0LnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyhzdGF0ZXMsIHZ0TGF5ZXIsIHRoaXMubGF5ZXJzLCBhdmFpbGFibGVJbWFnZXMsIGltYWdlUG9zaXRpb25zKTtcbiAgICAgICAgdGhpcy5pY29uLnByb2dyYW1Db25maWd1cmF0aW9ucy51cGRhdGVQYWludEFycmF5cyhzdGF0ZXMsIHZ0TGF5ZXIsIHRoaXMubGF5ZXJzLCBhdmFpbGFibGVJbWFnZXMsIGltYWdlUG9zaXRpb25zKTtcbiAgICB9XG5cbiAgICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBXaGVuIHRoZSBidWNrZXQgZW5jb3VudGVycyBvbmx5IHJ0bC10ZXh0IGJ1dCB0aGUgcGx1Z2luIGlzbid0IGxvYWRlZCwgbm8gc3ltYm9sIGluc3RhbmNlcyB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgICAgIC8vIEluIG9yZGVyIGZvciB0aGUgYnVja2V0IHRvIGJlIHNlcmlhbGl6ZWQsIGFuZCBub3QgZGlzY2FyZGVkIGFzIGFuIGVtcHR5IGJ1Y2tldCBib3RoIGNoZWNrcyBhcmUgbmVjZXNzYXJ5LlxuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoID09PSAwICYmICF0aGlzLmhhc1JUTFRleHQ7XG4gICAgfVxuXG4gICAgdXBsb2FkUGVuZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnVwbG9hZGVkIHx8IHRoaXMudGV4dC5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQgfHwgdGhpcy5pY29uLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZDtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBpZiAoIXRoaXMudXBsb2FkZWQgJiYgdGhpcy5oYXNEZWJ1Z0RhdGEoKSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0Q29sbGlzaW9uQm94LnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgICAgIHRoaXMuaWNvbkNvbGxpc2lvbkJveC51cGxvYWQoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50ZXh0LnVwbG9hZChjb250ZXh0LCB0aGlzLnNvcnRGZWF0dXJlc0J5WSwgIXRoaXMudXBsb2FkZWQsIHRoaXMudGV4dC5wcm9ncmFtQ29uZmlndXJhdGlvbnMubmVlZHNVcGxvYWQpO1xuICAgICAgICB0aGlzLmljb24udXBsb2FkKGNvbnRleHQsIHRoaXMuc29ydEZlYXR1cmVzQnlZLCAhdGhpcy51cGxvYWRlZCwgdGhpcy5pY29uLnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCk7XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRlc3Ryb3lEZWJ1Z0RhdGEoKSB7XG4gICAgICAgIHRoaXMudGV4dENvbGxpc2lvbkJveC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaWNvbkNvbGxpc2lvbkJveC5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgZ2V0UHJvamVjdGlvbigpOiBQcm9qZWN0aW9uIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb2plY3Rpb25JbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0aW9uSW5zdGFuY2UgPSBnZXRQcm9qZWN0aW9uKHRoaXMucHJvamVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdGlvbkluc3RhbmNlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudGV4dC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaWNvbi5kZXN0cm95KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdEYXRhKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveURlYnVnRGF0YSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkVG9MaW5lVmVydGV4QXJyYXkoYW5jaG9yOiBBbmNob3IsIGxpbmU6IGFueSk6IExpbmVWZXJ0ZXhSYW5nZSB7XG4gICAgICAgIGNvbnN0IGxpbmVTdGFydEluZGV4ID0gdGhpcy5saW5lVmVydGV4QXJyYXkubGVuZ3RoO1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gYW5jaG9yLnNlZ21lbnQ7XG4gICAgICAgIGlmIChzZWdtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBzdW1Gb3J3YXJkTGVuZ3RoID0gYW5jaG9yLmRpc3QobGluZVtzZWdtZW50ICsgMV0pO1xuICAgICAgICAgICAgbGV0IHN1bUJhY2t3YXJkTGVuZ3RoID0gYW5jaG9yLmRpc3QobGluZVtzZWdtZW50XSk7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNlZ21lbnQgKyAxOyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZlcnRpY2VzW2ldID0ge3g6IGxpbmVbaV0ueCwgeTogbGluZVtpXS55LCB0aWxlVW5pdERpc3RhbmNlRnJvbUFuY2hvcjogc3VtRm9yd2FyZExlbmd0aH07XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsaW5lLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtRm9yd2FyZExlbmd0aCArPSBsaW5lW2kgKyAxXS5kaXN0KGxpbmVbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzZWdtZW50IHx8IDA7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgdmVydGljZXNbaV0gPSB7eDogbGluZVtpXS54LCB5OiBsaW5lW2ldLnksIHRpbGVVbml0RGlzdGFuY2VGcm9tQW5jaG9yOiBzdW1CYWNrd2FyZExlbmd0aH07XG4gICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1bUJhY2t3YXJkTGVuZ3RoICs9IGxpbmVbaSAtIDFdLmRpc3QobGluZVtpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVydGV4ID0gdmVydGljZXNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lVmVydGV4QXJyYXkuZW1wbGFjZUJhY2sodmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgudGlsZVVuaXREaXN0YW5jZUZyb21BbmNob3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5lU3RhcnRJbmRleCxcbiAgICAgICAgICAgIGxpbmVMZW5ndGg6IHRoaXMubGluZVZlcnRleEFycmF5Lmxlbmd0aCAtIGxpbmVTdGFydEluZGV4XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYWRkU3ltYm9scyhhcnJheXM6IFN5bWJvbEJ1ZmZlcnMsXG4gICAgICAgICAgICAgICBxdWFkczogQXJyYXk8U3ltYm9sUXVhZD4sXG4gICAgICAgICAgICAgICBzaXplVmVydGV4OiBhbnksXG4gICAgICAgICAgICAgICBsaW5lT2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgICAgYWxvbmdMaW5lOiBib29sZWFuLFxuICAgICAgICAgICAgICAgZmVhdHVyZTogU3ltYm9sRmVhdHVyZSxcbiAgICAgICAgICAgICAgIHdyaXRpbmdNb2RlOiBhbnksXG4gICAgICAgICAgICAgICBnbG9iZTogP3sgYW5jaG9yOiBBbmNob3IsIHVwOiBWZWMzIH0sXG4gICAgICAgICAgICAgICB0aWxlQW5jaG9yOiBBbmNob3IsXG4gICAgICAgICAgICAgICBsaW5lU3RhcnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgbGluZUxlbmd0aDogbnVtYmVyLFxuICAgICAgICAgICAgICAgYXNzb2NpYXRlZEljb25JbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICAgICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQpIHtcbiAgICAgICAgY29uc3QgaW5kZXhBcnJheSA9IGFycmF5cy5pbmRleEFycmF5O1xuICAgICAgICBjb25zdCBsYXlvdXRWZXJ0ZXhBcnJheSA9IGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3QgZ2xvYmVFeHRWZXJ0ZXhBcnJheSA9IGFycmF5cy5nbG9iZUV4dFZlcnRleEFycmF5O1xuXG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSBhcnJheXMuc2VnbWVudHMucHJlcGFyZVNlZ21lbnQoNCAqIHF1YWRzLmxlbmd0aCwgbGF5b3V0VmVydGV4QXJyYXksIGluZGV4QXJyYXksIHRoaXMuY2FuT3ZlcmxhcCA/IGZlYXR1cmUuc29ydEtleSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGdseXBoT2Zmc2V0QXJyYXlTdGFydCA9IHRoaXMuZ2x5cGhPZmZzZXRBcnJheS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHZlcnRleFN0YXJ0SW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICBjb25zdCBhbmdsZSA9ICh0aGlzLmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgd3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsKSA/IE1hdGguUEkgLyAyIDogMDtcblxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGZlYXR1cmUudGV4dCAmJiBmZWF0dXJlLnRleHQuc2VjdGlvbnM7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qge3RsLCB0ciwgYmwsIGJyLCB0ZXgsIHBpeGVsT2Zmc2V0VEwsIHBpeGVsT2Zmc2V0QlIsIG1pbkZvbnRTY2FsZVgsIG1pbkZvbnRTY2FsZVksIGdseXBoT2Zmc2V0LCBpc1NERiwgc2VjdGlvbkluZGV4fSA9IHF1YWRzW2ldO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgY29uc3QgeSA9IGdseXBoT2Zmc2V0WzFdO1xuICAgICAgICAgICAgYWRkVmVydGV4KGxheW91dFZlcnRleEFycmF5LCB0aWxlQW5jaG9yLngsIHRpbGVBbmNob3IueSwgdGwueCwgeSArIHRsLnksIHRleC54LCB0ZXgueSwgc2l6ZVZlcnRleCwgaXNTREYsIHBpeGVsT2Zmc2V0VEwueCwgcGl4ZWxPZmZzZXRUTC55LCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZKTtcbiAgICAgICAgICAgIGFkZFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgdGlsZUFuY2hvci54LCB0aWxlQW5jaG9yLnksIHRyLngsIHkgKyB0ci55LCB0ZXgueCArIHRleC53LCB0ZXgueSwgc2l6ZVZlcnRleCwgaXNTREYsIHBpeGVsT2Zmc2V0QlIueCwgcGl4ZWxPZmZzZXRUTC55LCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZKTtcbiAgICAgICAgICAgIGFkZFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgdGlsZUFuY2hvci54LCB0aWxlQW5jaG9yLnksIGJsLngsIHkgKyBibC55LCB0ZXgueCwgdGV4LnkgKyB0ZXguaCwgc2l6ZVZlcnRleCwgaXNTREYsIHBpeGVsT2Zmc2V0VEwueCwgcGl4ZWxPZmZzZXRCUi55LCBtaW5Gb250U2NhbGVYLCBtaW5Gb250U2NhbGVZKTtcbiAgICAgICAgICAgIGFkZFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgdGlsZUFuY2hvci54LCB0aWxlQW5jaG9yLnksIGJyLngsIHkgKyBici55LCB0ZXgueCArIHRleC53LCB0ZXgueSArIHRleC5oLCBzaXplVmVydGV4LCBpc1NERiwgcGl4ZWxPZmZzZXRCUi54LCBwaXhlbE9mZnNldEJSLnksIG1pbkZvbnRTY2FsZVgsIG1pbkZvbnRTY2FsZVkpO1xuXG4gICAgICAgICAgICBpZiAoZ2xvYmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBnbG9iZUFuY2hvciA9IGdsb2JlLmFuY2hvcjtcbiAgICAgICAgICAgICAgICBjb25zdCB1cCA9IGdsb2JlLnVwO1xuICAgICAgICAgICAgICAgIGFkZEdsb2JlVmVydGV4KGdsb2JlRXh0VmVydGV4QXJyYXksIGdsb2JlQW5jaG9yLngsIGdsb2JlQW5jaG9yLnksIGdsb2JlQW5jaG9yLnosIHVwWzBdLCB1cFsxXSwgdXBbMl0pO1xuICAgICAgICAgICAgICAgIGFkZEdsb2JlVmVydGV4KGdsb2JlRXh0VmVydGV4QXJyYXksIGdsb2JlQW5jaG9yLngsIGdsb2JlQW5jaG9yLnksIGdsb2JlQW5jaG9yLnosIHVwWzBdLCB1cFsxXSwgdXBbMl0pO1xuICAgICAgICAgICAgICAgIGFkZEdsb2JlVmVydGV4KGdsb2JlRXh0VmVydGV4QXJyYXksIGdsb2JlQW5jaG9yLngsIGdsb2JlQW5jaG9yLnksIGdsb2JlQW5jaG9yLnosIHVwWzBdLCB1cFsxXSwgdXBbMl0pO1xuICAgICAgICAgICAgICAgIGFkZEdsb2JlVmVydGV4KGdsb2JlRXh0VmVydGV4QXJyYXksIGdsb2JlQW5jaG9yLngsIGdsb2JlQW5jaG9yLnksIGdsb2JlQW5jaG9yLnosIHVwWzBdLCB1cFsxXSwgdXBbMl0pO1xuXG4gICAgICAgICAgICAgICAgYWRkRHluYW1pY0F0dHJpYnV0ZXMoYXJyYXlzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgZ2xvYmVBbmNob3IueCwgZ2xvYmVBbmNob3IueSwgZ2xvYmVBbmNob3IueiwgYW5nbGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhZGREeW5hbWljQXR0cmlidXRlcyhhcnJheXMuZHluYW1pY0xheW91dFZlcnRleEFycmF5LCB0aWxlQW5jaG9yLngsIHRpbGVBbmNob3IueSwgdGlsZUFuY2hvci56LCBhbmdsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMSwgaW5kZXggKyAyKTtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyAxLCBpbmRleCArIDIsIGluZGV4ICsgMyk7XG5cbiAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSAyO1xuXG4gICAgICAgICAgICB0aGlzLmdseXBoT2Zmc2V0QXJyYXkuZW1wbGFjZUJhY2soZ2x5cGhPZmZzZXRbMF0pO1xuXG4gICAgICAgICAgICBpZiAoaSA9PT0gcXVhZHMubGVuZ3RoIC0gMSB8fCBzZWN0aW9uSW5kZXggIT09IHF1YWRzW2kgKyAxXS5zZWN0aW9uSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBhcnJheXMucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLnBvcHVsYXRlUGFpbnRBcnJheXMobGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCBmZWF0dXJlLCBmZWF0dXJlLmluZGV4LCB7fSwgYXZhaWxhYmxlSW1hZ2VzLCBjYW5vbmljYWwsIHNlY3Rpb25zICYmIHNlY3Rpb25zW3NlY3Rpb25JbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvamVjdGVkQW5jaG9yID0gZ2xvYmUgPyBnbG9iZS5hbmNob3IgOiB0aWxlQW5jaG9yO1xuXG4gICAgICAgIGFycmF5cy5wbGFjZWRTeW1ib2xBcnJheS5lbXBsYWNlQmFjayhwcm9qZWN0ZWRBbmNob3IueCwgcHJvamVjdGVkQW5jaG9yLnksIHByb2plY3RlZEFuY2hvci56LCB0aWxlQW5jaG9yLngsIHRpbGVBbmNob3IueSxcbiAgICAgICAgICAgIGdseXBoT2Zmc2V0QXJyYXlTdGFydCwgdGhpcy5nbHlwaE9mZnNldEFycmF5Lmxlbmd0aCAtIGdseXBoT2Zmc2V0QXJyYXlTdGFydCwgdmVydGV4U3RhcnRJbmRleCxcbiAgICAgICAgICAgIGxpbmVTdGFydEluZGV4LCBsaW5lTGVuZ3RoLCAodGlsZUFuY2hvci5zZWdtZW50OiBhbnkpLFxuICAgICAgICAgICAgc2l6ZVZlcnRleCA/IHNpemVWZXJ0ZXhbMF0gOiAwLCBzaXplVmVydGV4ID8gc2l6ZVZlcnRleFsxXSA6IDAsXG4gICAgICAgICAgICBsaW5lT2Zmc2V0WzBdLCBsaW5lT2Zmc2V0WzFdLFxuICAgICAgICAgICAgd3JpdGluZ01vZGUsXG4gICAgICAgICAgICAvLyBwbGFjZWRPcmllbnRhdGlvbiBpcyBudWxsIGluaXRpYWxseTsgd2lsbCBiZSB1cGRhdGVkIHRvIGhvcml6b250YWwoMSkvdmVydGljYWwoMikgaWYgcGxhY2VkXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgKGZhbHNlOiBhbnkpLFxuICAgICAgICAgICAgLy8gVGhlIGNyb3NzVGlsZUlEIGlzIG9ubHkgZmlsbGVkL3VzZWQgb24gdGhlIGZvcmVncm91bmQgZm9yIGR5bmFtaWMgdGV4dCBhbmNob3JzXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgYXNzb2NpYXRlZEljb25JbmRleCxcbiAgICAgICAgICAgIC8vIGZsaXBTdGF0ZSBpcyB1bmtub3duIGluaXRpYWxseTsgd2lsbCBiZSB1cGRhdGVkIHRvIGZsaXBSZXF1aXJlZCgxKS9mbGlwTm90UmVxdWlyZWQoMikgZHVyaW5nIGxpbmUgbGFiZWwgcmVwcm9qZWN0aW9uXG4gICAgICAgICAgICAwXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgX2NvbW1pdExheW91dFZlcnRleChhcnJheTogU3RydWN0QXJyYXksIGJveFRpbGVBbmNob3JYOiBudW1iZXIsIGJveFRpbGVBbmNob3JZOiBudW1iZXIsIGJveFRpbGVBbmNob3JaOiBudW1iZXIsIHRpbGVBbmNob3JYOiBudW1iZXIsIHRpbGVBbmNob3JZOiBudW1iZXIsIGV4dHJ1ZGU6IFBvaW50KSB7XG4gICAgICAgIGFycmF5LmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgLy8gcG9zXG4gICAgICAgICAgICBib3hUaWxlQW5jaG9yWCxcbiAgICAgICAgICAgIGJveFRpbGVBbmNob3JZLFxuICAgICAgICAgICAgYm94VGlsZUFuY2hvclosXG4gICAgICAgICAgICAvLyBhX2FuY2hvcl9wb3NcbiAgICAgICAgICAgIHRpbGVBbmNob3JYLFxuICAgICAgICAgICAgdGlsZUFuY2hvclksXG4gICAgICAgICAgICAvLyBleHRydWRlXG4gICAgICAgICAgICBNYXRoLnJvdW5kKGV4dHJ1ZGUueCksXG4gICAgICAgICAgICBNYXRoLnJvdW5kKGV4dHJ1ZGUueSkpO1xuICAgIH1cblxuICAgIF9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRpY2VzKGJveDogQ29sbGlzaW9uQm94LCBzY2FsZTogbnVtYmVyLCBhcnJheXM6IENvbGxpc2lvbkJ1ZmZlcnMsIGJveFRpbGVBbmNob3JYOiBudW1iZXIsIGJveFRpbGVBbmNob3JZOiBudW1iZXIsIGJveFRpbGVBbmNob3JaOiBudW1iZXIsIHN5bWJvbEluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSkge1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gYXJyYXlzLnNlZ21lbnRzLnByZXBhcmVTZWdtZW50KDQsIGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgYXJyYXlzLmluZGV4QXJyYXkpO1xuICAgICAgICBjb25zdCBpbmRleCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuICAgICAgICBjb25zdCBzeW1ib2xUaWxlQW5jaG9yWCA9IHN5bWJvbEluc3RhbmNlLnRpbGVBbmNob3JYO1xuICAgICAgICBjb25zdCBzeW1ib2xUaWxlQW5jaG9yWSA9IHN5bWJvbEluc3RhbmNlLnRpbGVBbmNob3JZO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBhcnJheXMuY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2soMCwgMCwgMCwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheXMuY29sbGlzaW9uVmVydGV4QXJyYXlFeHQuZW1wbGFjZUJhY2soc2NhbGUsIC1ib3gucGFkZGluZywgLWJveC5wYWRkaW5nKTtcbiAgICAgICAgYXJyYXlzLmNvbGxpc2lvblZlcnRleEFycmF5RXh0LmVtcGxhY2VCYWNrKHNjYWxlLCAgYm94LnBhZGRpbmcsIC1ib3gucGFkZGluZyk7XG4gICAgICAgIGFycmF5cy5jb2xsaXNpb25WZXJ0ZXhBcnJheUV4dC5lbXBsYWNlQmFjayhzY2FsZSwgIGJveC5wYWRkaW5nLCAgYm94LnBhZGRpbmcpO1xuICAgICAgICBhcnJheXMuY29sbGlzaW9uVmVydGV4QXJyYXlFeHQuZW1wbGFjZUJhY2soc2NhbGUsIC1ib3gucGFkZGluZywgIGJveC5wYWRkaW5nKTtcblxuICAgICAgICB0aGlzLl9jb21taXRMYXlvdXRWZXJ0ZXgoYXJyYXlzLmxheW91dFZlcnRleEFycmF5LCBib3hUaWxlQW5jaG9yWCwgYm94VGlsZUFuY2hvclksIGJveFRpbGVBbmNob3JaLCBzeW1ib2xUaWxlQW5jaG9yWCwgc3ltYm9sVGlsZUFuY2hvclksIG5ldyBQb2ludChib3gueDEsIGJveC55MSkpO1xuICAgICAgICB0aGlzLl9jb21taXRMYXlvdXRWZXJ0ZXgoYXJyYXlzLmxheW91dFZlcnRleEFycmF5LCBib3hUaWxlQW5jaG9yWCwgYm94VGlsZUFuY2hvclksIGJveFRpbGVBbmNob3JaLCBzeW1ib2xUaWxlQW5jaG9yWCwgc3ltYm9sVGlsZUFuY2hvclksIG5ldyBQb2ludChib3gueDIsIGJveC55MSkpO1xuICAgICAgICB0aGlzLl9jb21taXRMYXlvdXRWZXJ0ZXgoYXJyYXlzLmxheW91dFZlcnRleEFycmF5LCBib3hUaWxlQW5jaG9yWCwgYm94VGlsZUFuY2hvclksIGJveFRpbGVBbmNob3JaLCBzeW1ib2xUaWxlQW5jaG9yWCwgc3ltYm9sVGlsZUFuY2hvclksIG5ldyBQb2ludChib3gueDIsIGJveC55MikpO1xuICAgICAgICB0aGlzLl9jb21taXRMYXlvdXRWZXJ0ZXgoYXJyYXlzLmxheW91dFZlcnRleEFycmF5LCBib3hUaWxlQW5jaG9yWCwgYm94VGlsZUFuY2hvclksIGJveFRpbGVBbmNob3JaLCBzeW1ib2xUaWxlQW5jaG9yWCwgc3ltYm9sVGlsZUFuY2hvclksIG5ldyBQb2ludChib3gueDEsIGJveC55MikpO1xuXG4gICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG5cbiAgICAgICAgY29uc3QgaW5kZXhBcnJheTogTGluZUluZGV4QXJyYXkgPSAoYXJyYXlzLmluZGV4QXJyYXk6IGFueSk7XG4gICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMSk7XG4gICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyAxLCBpbmRleCArIDIpO1xuICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMiwgaW5kZXggKyAzKTtcbiAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDMsIGluZGV4KTtcblxuICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSA0O1xuICAgIH1cblxuICAgIF9hZGRUZXh0RGVidWdDb2xsaXNpb25Cb3hlcyhzaXplOiBhbnksIHpvb206IG51bWJlciwgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5LCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIGluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSkge1xuICAgICAgICBmb3IgKGxldCBiID0gc3RhcnRJbmRleDsgYiA8IGVuZEluZGV4OyBiKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChiKTogYW55KTtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5nZXRTeW1ib2xJbnN0YW5jZVRleHRTaXplKHNpemUsIGluc3RhbmNlLCB6b29tLCBiKTtcblxuICAgICAgICAgICAgdGhpcy5fYWRkQ29sbGlzaW9uRGVidWdWZXJ0aWNlcyhib3gsIHNjYWxlLCB0aGlzLnRleHRDb2xsaXNpb25Cb3gsIGJveC5wcm9qZWN0ZWRBbmNob3JYLCBib3gucHJvamVjdGVkQW5jaG9yWSwgYm94LnByb2plY3RlZEFuY2hvclosIGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9hZGRJY29uRGVidWdDb2xsaXNpb25Cb3hlcyhzaXplOiBhbnksIHpvb206IG51bWJlciwgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5LCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIGluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSkge1xuICAgICAgICBmb3IgKGxldCBiID0gc3RhcnRJbmRleDsgYiA8IGVuZEluZGV4OyBiKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChiKTogYW55KTtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5nZXRTeW1ib2xJbnN0YW5jZUljb25TaXplKHNpemUsIHpvb20sIGIpO1xuXG4gICAgICAgICAgICB0aGlzLl9hZGRDb2xsaXNpb25EZWJ1Z1ZlcnRpY2VzKGJveCwgc2NhbGUsIHRoaXMuaWNvbkNvbGxpc2lvbkJveCwgYm94LnByb2plY3RlZEFuY2hvclgsIGJveC5wcm9qZWN0ZWRBbmNob3JZLCBib3gucHJvamVjdGVkQW5jaG9yWiwgaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2VuZXJhdGVDb2xsaXNpb25EZWJ1Z0J1ZmZlcnMoem9vbTogbnVtYmVyLCBjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRGVidWdEYXRhKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveURlYnVnRGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZXh0Q29sbGlzaW9uQm94ID0gbmV3IENvbGxpc2lvbkJ1ZmZlcnMoQ29sbGlzaW9uQm94TGF5b3V0QXJyYXksIGNvbGxpc2lvbkJveExheW91dC5tZW1iZXJzLCBMaW5lSW5kZXhBcnJheSk7XG4gICAgICAgIHRoaXMuaWNvbkNvbGxpc2lvbkJveCA9IG5ldyBDb2xsaXNpb25CdWZmZXJzKENvbGxpc2lvbkJveExheW91dEFycmF5LCBjb2xsaXNpb25Cb3hMYXlvdXQubWVtYmVycywgTGluZUluZGV4QXJyYXkpO1xuXG4gICAgICAgIGNvbnN0IGljb25TaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHRoaXMuaWNvblNpemVEYXRhLCB6b29tKTtcbiAgICAgICAgY29uc3QgdGV4dFNpemUgPSBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvclpvb20odGhpcy50ZXh0U2l6ZURhdGEsIHpvb20pO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlID0gdGhpcy5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgdGhpcy5fYWRkVGV4dERlYnVnQ29sbGlzaW9uQm94ZXModGV4dFNpemUsIHpvb20sIGNvbGxpc2lvbkJveEFycmF5LCBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UudGV4dEJveEVuZEluZGV4LCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLl9hZGRUZXh0RGVidWdDb2xsaXNpb25Cb3hlcyh0ZXh0U2l6ZSwgem9vbSwgY29sbGlzaW9uQm94QXJyYXksIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsVGV4dEJveFN0YXJ0SW5kZXgsIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsVGV4dEJveEVuZEluZGV4LCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLl9hZGRJY29uRGVidWdDb2xsaXNpb25Cb3hlcyhpY29uU2l6ZSwgem9vbSwgY29sbGlzaW9uQm94QXJyYXksIHN5bWJvbEluc3RhbmNlLmljb25Cb3hTdGFydEluZGV4LCBzeW1ib2xJbnN0YW5jZS5pY29uQm94RW5kSW5kZXgsIHN5bWJvbEluc3RhbmNlKTtcbiAgICAgICAgICAgIHRoaXMuX2FkZEljb25EZWJ1Z0NvbGxpc2lvbkJveGVzKGljb25TaXplLCB6b29tLCBjb2xsaXNpb25Cb3hBcnJheSwgc3ltYm9sSW5zdGFuY2UudmVydGljYWxJY29uQm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UudmVydGljYWxJY29uQm94RW5kSW5kZXgsIHN5bWJvbEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFN5bWJvbEluc3RhbmNlVGV4dFNpemUodGV4dFNpemU6IGFueSwgaW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCB6b29tOiBudW1iZXIsIGJveEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzeW1ib2xJbmRleCA9IGluc3RhbmNlLnJpZ2h0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4ID49IDAgP1xuICAgICAgICAgICAgaW5zdGFuY2UucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXggOiBpbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXggPj0gMCA/XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4IDogaW5zdGFuY2UubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCA+PSAwID9cbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleCA6IGluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4ID49IDAgP1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXggOiBib3hJbmRleDtcblxuICAgICAgICBjb25zdCBzeW1ib2w6IGFueSA9IHRoaXMudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoc3ltYm9sSW5kZXgpO1xuICAgICAgICBjb25zdCBmZWF0dXJlU2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZSh0aGlzLnRleHRTaXplRGF0YSwgdGV4dFNpemUsIHN5bWJvbCkgLyBPTkVfRU07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZVBpeGVsUmF0aW8gKiBmZWF0dXJlU2l6ZTtcbiAgICB9XG5cbiAgICBnZXRTeW1ib2xJbnN0YW5jZUljb25TaXplKGljb25TaXplOiBhbnksIHpvb206IG51bWJlciwgaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHN5bWJvbDogYW55ID0gdGhpcy5pY29uLnBsYWNlZFN5bWJvbEFycmF5LmdldChpbmRleCk7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3JGZWF0dXJlKHRoaXMuaWNvblNpemVEYXRhLCBpY29uU2l6ZSwgc3ltYm9sKTtcblxuICAgICAgICByZXR1cm4gdGhpcy50aWxlUGl4ZWxSYXRpbyAqIGZlYXR1cmVTaXplO1xuICAgIH1cblxuICAgIF9jb21taXREZWJ1Z0NvbGxpc2lvblZlcnRleFVwZGF0ZShhcnJheTogU3RydWN0QXJyYXksIHNjYWxlOiBudW1iZXIsIHBhZGRpbmc6IG51bWJlcikge1xuICAgICAgICBhcnJheS5lbXBsYWNlQmFjayhzY2FsZSwgLXBhZGRpbmcsIC1wYWRkaW5nKTtcbiAgICAgICAgYXJyYXkuZW1wbGFjZUJhY2soc2NhbGUsICBwYWRkaW5nLCAtcGFkZGluZyk7XG4gICAgICAgIGFycmF5LmVtcGxhY2VCYWNrKHNjYWxlLCAgcGFkZGluZywgIHBhZGRpbmcpO1xuICAgICAgICBhcnJheS5lbXBsYWNlQmFjayhzY2FsZSwgLXBhZGRpbmcsICBwYWRkaW5nKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlVGV4dERlYnVnQ29sbGlzaW9uQm94ZXMoc2l6ZTogYW55LCB6b29tOiBudW1iZXIsIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCBpbnN0YW5jZTogU3ltYm9sSW5zdGFuY2UpIHtcbiAgICAgICAgZm9yIChsZXQgYiA9IHN0YXJ0SW5kZXg7IGIgPCBlbmRJbmRleDsgYisrKSB7XG4gICAgICAgICAgICBjb25zdCBib3g6IENvbGxpc2lvbkJveCA9IChjb2xsaXNpb25Cb3hBcnJheS5nZXQoYik6IGFueSk7XG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuZ2V0U3ltYm9sSW5zdGFuY2VUZXh0U2l6ZShzaXplLCBpbnN0YW5jZSwgem9vbSwgYik7XG4gICAgICAgICAgICBjb25zdCBhcnJheSA9IHRoaXMudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheUV4dDtcbiAgICAgICAgICAgIHRoaXMuX2NvbW1pdERlYnVnQ29sbGlzaW9uVmVydGV4VXBkYXRlKGFycmF5LCBzY2FsZSwgYm94LnBhZGRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZUljb25EZWJ1Z0NvbGxpc2lvbkJveGVzKHNpemU6IGFueSwgem9vbTogbnVtYmVyLCBjb2xsaXNpb25Cb3hBcnJheTogQ29sbGlzaW9uQm94QXJyYXksIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcikge1xuICAgICAgICBmb3IgKGxldCBiID0gc3RhcnRJbmRleDsgYiA8IGVuZEluZGV4OyBiKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChiKTogYW55KTtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy5nZXRTeW1ib2xJbnN0YW5jZUljb25TaXplKHNpemUsIHpvb20sIGIpO1xuICAgICAgICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXlFeHQ7XG4gICAgICAgICAgICB0aGlzLl9jb21taXREZWJ1Z0NvbGxpc2lvblZlcnRleFVwZGF0ZShhcnJheSwgc2NhbGUsIGJveC5wYWRkaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZUNvbGxpc2lvbkRlYnVnQnVmZmVycyh6b29tOiBudW1iZXIsIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzRGVidWdEYXRhKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhKCkpIHRoaXMudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheUV4dC5jbGVhcigpO1xuICAgICAgICBpZiAodGhpcy5oYXNJY29uQ29sbGlzaW9uQm94RGF0YSgpKSB0aGlzLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXlFeHQuY2xlYXIoKTtcblxuICAgICAgICBjb25zdCBpY29uU2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbSh0aGlzLmljb25TaXplRGF0YSwgem9vbSk7XG4gICAgICAgIGNvbnN0IHRleHRTaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHRoaXMudGV4dFNpemVEYXRhLCB6b29tKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRleHREZWJ1Z0NvbGxpc2lvbkJveGVzKHRleHRTaXplLCB6b29tLCBjb2xsaXNpb25Cb3hBcnJheSwgc3ltYm9sSW5zdGFuY2UudGV4dEJveFN0YXJ0SW5kZXgsIHN5bWJvbEluc3RhbmNlLnRleHRCb3hFbmRJbmRleCwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGV4dERlYnVnQ29sbGlzaW9uQm94ZXModGV4dFNpemUsIHpvb20sIGNvbGxpc2lvbkJveEFycmF5LCBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFRleHRCb3hTdGFydEluZGV4LCBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSWNvbkRlYnVnQ29sbGlzaW9uQm94ZXMoaWNvblNpemUsIHpvb20sIGNvbGxpc2lvbkJveEFycmF5LCBzeW1ib2xJbnN0YW5jZS5pY29uQm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UuaWNvbkJveEVuZEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUljb25EZWJ1Z0NvbGxpc2lvbkJveGVzKGljb25TaXplLCB6b29tLCBjb2xsaXNpb25Cb3hBcnJheSwgc3ltYm9sSW5zdGFuY2UudmVydGljYWxJY29uQm94U3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UudmVydGljYWxJY29uQm94RW5kSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSAmJiB0aGlzLnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyRXh0KSB7XG4gICAgICAgICAgICB0aGlzLnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyRXh0LnVwZGF0ZURhdGEodGhpcy50ZXh0Q29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5RXh0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNJY29uQ29sbGlzaW9uQm94RGF0YSgpICYmIHRoaXMuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXJFeHQpIHtcbiAgICAgICAgICAgIHRoaXMuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXJFeHQudXBkYXRlRGF0YSh0aGlzLmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXlFeHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlc2UgZmxhdCBhcnJheXMgYXJlIG1lYW50IHRvIGJlIHF1aWNrZXIgdG8gaXRlcmF0ZSBvdmVyIHRoYW4gdGhlIHNvdXJjZVxuICAgIC8vIENvbGxpc2lvbkJveEFycmF5XG4gICAgX2Rlc2VyaWFsaXplQ29sbGlzaW9uQm94ZXNGb3JTeW1ib2woY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICB0ZXh0U3RhcnRJbmRleDogbnVtYmVyLCB0ZXh0RW5kSW5kZXg6IG51bWJlcixcbiAgICAgICAgdmVydGljYWxUZXh0U3RhcnRJbmRleDogbnVtYmVyLCB2ZXJ0aWNhbFRleHRFbmRJbmRleDogbnVtYmVyLFxuICAgICAgICBpY29uU3RhcnRJbmRleDogbnVtYmVyLCBpY29uRW5kSW5kZXg6IG51bWJlcixcbiAgICAgICAgdmVydGljYWxJY29uU3RhcnRJbmRleDogbnVtYmVyLCB2ZXJ0aWNhbEljb25FbmRJbmRleDogbnVtYmVyKTogQ29sbGlzaW9uQXJyYXlzIHtcblxuICAgICAgICBjb25zdCBjb2xsaXNpb25BcnJheXMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgayA9IHRleHRTdGFydEluZGV4OyBrIDwgdGV4dEVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChrKTogYW55KTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy50ZXh0Qm94ID0ge3gxOiBib3gueDEsIHkxOiBib3gueTEsIHgyOiBib3gueDIsIHkyOiBib3gueTIsIHBhZGRpbmc6IGJveC5wYWRkaW5nLCBwcm9qZWN0ZWRBbmNob3JYOiBib3gucHJvamVjdGVkQW5jaG9yWCwgcHJvamVjdGVkQW5jaG9yWTogYm94LnByb2plY3RlZEFuY2hvclksIHByb2plY3RlZEFuY2hvclo6IGJveC5wcm9qZWN0ZWRBbmNob3JaLCB0aWxlQW5jaG9yWDogYm94LnRpbGVBbmNob3JYLCB0aWxlQW5jaG9yWTogYm94LnRpbGVBbmNob3JZfTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy50ZXh0RmVhdHVyZUluZGV4ID0gYm94LmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgIGJyZWFrOyAvLyBPbmx5IG9uZSBib3ggYWxsb3dlZCBwZXIgaW5zdGFuY2VcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrID0gdmVydGljYWxUZXh0U3RhcnRJbmRleDsgayA8IHZlcnRpY2FsVGV4dEVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChrKTogYW55KTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbFRleHRCb3ggPSB7eDE6IGJveC54MSwgeTE6IGJveC55MSwgeDI6IGJveC54MiwgeTI6IGJveC55MiwgcGFkZGluZzogYm94LnBhZGRpbmcsIHByb2plY3RlZEFuY2hvclg6IGJveC5wcm9qZWN0ZWRBbmNob3JYLCBwcm9qZWN0ZWRBbmNob3JZOiBib3gucHJvamVjdGVkQW5jaG9yWSwgcHJvamVjdGVkQW5jaG9yWjogYm94LnByb2plY3RlZEFuY2hvclosIHRpbGVBbmNob3JYOiBib3gudGlsZUFuY2hvclgsIHRpbGVBbmNob3JZOiBib3gudGlsZUFuY2hvcll9O1xuICAgICAgICAgICAgY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleCA9IGJveC5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICBicmVhazsgLy8gT25seSBvbmUgYm94IGFsbG93ZWQgcGVyIGluc3RhbmNlXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgayA9IGljb25TdGFydEluZGV4OyBrIDwgaWNvbkVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIC8vIEFuIGljb24gY2FuIG9ubHkgaGF2ZSBvbmUgYm94IG5vdywgc28gdGhpcyBpbmRleGluZyBpcyBhIGJpdCB2ZXN0aWdpYWwuLi5cbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChrKTogYW55KTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy5pY29uQm94ID0ge3gxOiBib3gueDEsIHkxOiBib3gueTEsIHgyOiBib3gueDIsIHkyOiBib3gueTIsIHBhZGRpbmc6IGJveC5wYWRkaW5nLCBwcm9qZWN0ZWRBbmNob3JYOiBib3gucHJvamVjdGVkQW5jaG9yWCwgcHJvamVjdGVkQW5jaG9yWTogYm94LnByb2plY3RlZEFuY2hvclksIHByb2plY3RlZEFuY2hvclo6IGJveC5wcm9qZWN0ZWRBbmNob3JaLCB0aWxlQW5jaG9yWDogYm94LnRpbGVBbmNob3JYLCB0aWxlQW5jaG9yWTogYm94LnRpbGVBbmNob3JZfTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy5pY29uRmVhdHVyZUluZGV4ID0gYm94LmZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgIGJyZWFrOyAvLyBPbmx5IG9uZSBib3ggYWxsb3dlZCBwZXIgaW5zdGFuY2VcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBrID0gdmVydGljYWxJY29uU3RhcnRJbmRleDsgayA8IHZlcnRpY2FsSWNvbkVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIC8vIEFuIGljb24gY2FuIG9ubHkgaGF2ZSBvbmUgYm94IG5vdywgc28gdGhpcyBpbmRleGluZyBpcyBhIGJpdCB2ZXN0aWdpYWwuLi5cbiAgICAgICAgICAgIGNvbnN0IGJveDogQ29sbGlzaW9uQm94ID0gKGNvbGxpc2lvbkJveEFycmF5LmdldChrKTogYW55KTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbEljb25Cb3ggPSB7eDE6IGJveC54MSwgeTE6IGJveC55MSwgeDI6IGJveC54MiwgeTI6IGJveC55MiwgcGFkZGluZzogYm94LnBhZGRpbmcsIHByb2plY3RlZEFuY2hvclg6IGJveC5wcm9qZWN0ZWRBbmNob3JYLCBwcm9qZWN0ZWRBbmNob3JZOiBib3gucHJvamVjdGVkQW5jaG9yWSwgcHJvamVjdGVkQW5jaG9yWjogYm94LnByb2plY3RlZEFuY2hvclosIHRpbGVBbmNob3JYOiBib3gudGlsZUFuY2hvclgsIHRpbGVBbmNob3JZOiBib3gudGlsZUFuY2hvcll9O1xuICAgICAgICAgICAgY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsSWNvbkZlYXR1cmVJbmRleCA9IGJveC5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICBicmVhazsgLy8gT25seSBvbmUgYm94IGFsbG93ZWQgcGVyIGluc3RhbmNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxpc2lvbkFycmF5cztcbiAgICB9XG5cbiAgICBkZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheSkge1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkFycmF5cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHRoaXMuY29sbGlzaW9uQXJyYXlzLnB1c2godGhpcy5fZGVzZXJpYWxpemVDb2xsaXNpb25Cb3hlc0ZvclN5bWJvbChcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94RW5kSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UudmVydGljYWxUZXh0Qm94U3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFRleHRCb3hFbmRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5pY29uQm94U3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5pY29uQm94RW5kSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UudmVydGljYWxJY29uQm94U3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbEljb25Cb3hFbmRJbmRleFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNUZXh0RGF0YSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dC5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGhhc0ljb25EYXRhKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uLnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgaGFzRGVidWdEYXRhKCk6IENvbGxpc2lvbkJ1ZmZlcnMge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0Q29sbGlzaW9uQm94ICYmIHRoaXMuaWNvbkNvbGxpc2lvbkJveDtcbiAgICB9XG5cbiAgICBoYXNUZXh0Q29sbGlzaW9uQm94RGF0YSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzRGVidWdEYXRhKCkgJiYgdGhpcy50ZXh0Q29sbGlzaW9uQm94LnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgaGFzSWNvbkNvbGxpc2lvbkJveERhdGEoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0RlYnVnRGF0YSgpICYmIHRoaXMuaWNvbkNvbGxpc2lvbkJveC5zZWdtZW50cy5nZXQoKS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIGFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2woaWNvbk9yVGV4dDogU3ltYm9sQnVmZmVycywgcGxhY2VkU3ltYm9sSW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwbGFjZWRTeW1ib2wgPSBpY29uT3JUZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChwbGFjZWRTeW1ib2xJbmRleCk7XG5cbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBwbGFjZWRTeW1ib2wudmVydGV4U3RhcnRJbmRleCArIHBsYWNlZFN5bWJvbC5udW1HbHlwaHMgKiA0O1xuICAgICAgICBmb3IgKGxldCB2ZXJ0ZXhJbmRleCA9IHBsYWNlZFN5bWJvbC52ZXJ0ZXhTdGFydEluZGV4OyB2ZXJ0ZXhJbmRleCA8IGVuZEluZGV4OyB2ZXJ0ZXhJbmRleCArPSA0KSB7XG4gICAgICAgICAgICBpY29uT3JUZXh0LmluZGV4QXJyYXkuZW1wbGFjZUJhY2sodmVydGV4SW5kZXgsIHZlcnRleEluZGV4ICsgMSwgdmVydGV4SW5kZXggKyAyKTtcbiAgICAgICAgICAgIGljb25PclRleHQuaW5kZXhBcnJheS5lbXBsYWNlQmFjayh2ZXJ0ZXhJbmRleCArIDEsIHZlcnRleEluZGV4ICsgMiwgdmVydGV4SW5kZXggKyAzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFNvcnRlZFN5bWJvbEluZGV4ZXMoYW5nbGU6IG51bWJlcik6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICBpZiAodGhpcy5zb3J0ZWRBbmdsZSA9PT0gYW5nbGUgJiYgdGhpcy5zeW1ib2xJbnN0YW5jZUluZGV4ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSW5zdGFuY2VJbmRleGVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgICBjb25zdCByb3RhdGVkWXMgPSBbXTtcbiAgICAgICAgY29uc3QgZmVhdHVyZUluZGV4ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goaSk7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzLmdldChpKTtcbiAgICAgICAgICAgIHJvdGF0ZWRZcy5wdXNoKE1hdGgucm91bmQoc2luICogc3ltYm9sSW5zdGFuY2UudGlsZUFuY2hvclggKyBjb3MgKiBzeW1ib2xJbnN0YW5jZS50aWxlQW5jaG9yWSkgfCAwKTtcbiAgICAgICAgICAgIGZlYXR1cmVJbmRleGVzLnB1c2goc3ltYm9sSW5zdGFuY2UuZmVhdHVyZUluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5zb3J0KChhSW5kZXgsIGJJbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChyb3RhdGVkWXNbYUluZGV4XSAtIHJvdGF0ZWRZc1tiSW5kZXhdKSB8fFxuICAgICAgICAgICAgICAgICAgIChmZWF0dXJlSW5kZXhlc1tiSW5kZXhdIC0gZmVhdHVyZUluZGV4ZXNbYUluZGV4XSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgYWRkVG9Tb3J0S2V5UmFuZ2VzKHN5bWJvbEluc3RhbmNlSW5kZXg6IG51bWJlciwgc29ydEtleTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLnNvcnRLZXlSYW5nZXNbdGhpcy5zb3J0S2V5UmFuZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAobGFzdCAmJiBsYXN0LnNvcnRLZXkgPT09IHNvcnRLZXkpIHtcbiAgICAgICAgICAgIGxhc3Quc3ltYm9sSW5zdGFuY2VFbmQgPSBzeW1ib2xJbnN0YW5jZUluZGV4ICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc29ydEtleVJhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzb3J0S2V5LFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlU3RhcnQ6IHN5bWJvbEluc3RhbmNlSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2VFbmQ6IHN5bWJvbEluc3RhbmNlSW5kZXggKyAxXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNvcnRGZWF0dXJlcyhhbmdsZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5zb3J0RmVhdHVyZXNCeVkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuc29ydGVkQW5nbGUgPT09IGFuZ2xlKSByZXR1cm47XG5cbiAgICAgICAgLy8gVGhlIGN1cnJlbnQgYXBwcm9hY2ggdG8gc29ydGluZyBkb2Vzbid0IHNvcnQgYWNyb3NzIHNlZ21lbnRzIHNvIGRvbid0IHRyeS5cbiAgICAgICAgLy8gU29ydGluZyB3aXRoaW4gc2VnbWVudHMgc2VwYXJhdGVseSBzZWVtZWQgbm90IHRvIGJlIHdvcnRoIHRoZSBjb21wbGV4aXR5LlxuICAgICAgICBpZiAodGhpcy50ZXh0LnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDEgfHwgdGhpcy5pY29uLnNlZ21lbnRzLmdldCgpLmxlbmd0aCA+IDEpIHJldHVybjtcblxuICAgICAgICAvLyBJZiB0aGUgc3ltYm9scyBhcmUgYWxsb3dlZCB0byBvdmVybGFwIHNvcnQgdGhlbSBieSB0aGVpciB2ZXJ0aWNhbCBzY3JlZW4gcG9zaXRpb24uXG4gICAgICAgIC8vIFRoZSBpbmRleCBhcnJheSBidWZmZXIgaXMgcmV3cml0dGVuIHRvIHJlZmVyZW5jZSB0aGUgKHVuY2hhbmdlZCkgdmVydGljZXMgaW4gdGhlXG4gICAgICAgIC8vIHNvcnRlZCBvcmRlci5cblxuICAgICAgICAvLyBUbyBhdm9pZCBzb3J0aW5nIHRoZSBhY3R1YWwgc3ltYm9sSW5zdGFuY2UgYXJyYXkgd2Ugc29ydCBhbiBhcnJheSBvZiBpbmRleGVzLlxuICAgICAgICB0aGlzLnN5bWJvbEluc3RhbmNlSW5kZXhlcyA9IHRoaXMuZ2V0U29ydGVkU3ltYm9sSW5kZXhlcyhhbmdsZSk7XG4gICAgICAgIHRoaXMuc29ydGVkQW5nbGUgPSBhbmdsZTtcblxuICAgICAgICB0aGlzLnRleHQuaW5kZXhBcnJheS5jbGVhcigpO1xuICAgICAgICB0aGlzLmljb24uaW5kZXhBcnJheS5jbGVhcigpO1xuXG4gICAgICAgIHRoaXMuZmVhdHVyZVNvcnRPcmRlciA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLnN5bWJvbEluc3RhbmNlSW5kZXhlcykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSB0aGlzLnN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVTb3J0T3JkZXIucHVzaChzeW1ib2xJbnN0YW5jZS5mZWF0dXJlSW5kZXgpO1xuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXhcbiAgICAgICAgICAgIF0uZm9yRWFjaCgoaW5kZXgsIGksIGFycmF5KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBhZGQgYSBnaXZlbiBpbmRleCB0aGUgZmlyc3QgdGltZSBpdCBzaG93cyB1cCxcbiAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBkdXBsaWNhdGUgb3BhY2l0eSBlbnRyaWVzIHdoZW4gbXVsdGlwbGUganVzdGlmaWNhdGlvbnNcbiAgICAgICAgICAgICAgICAvLyBzaGFyZSB0aGUgc2FtZSBnbHlwaHMuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgYXJyYXkuaW5kZXhPZihpbmRleCkgPT09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJbmRpY2VzRm9yUGxhY2VkU3ltYm9sKHRoaXMudGV4dCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkSW5kaWNlc0ZvclBsYWNlZFN5bWJvbCh0aGlzLnRleHQsIHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnBsYWNlZEljb25TeW1ib2xJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRJbmRpY2VzRm9yUGxhY2VkU3ltYm9sKHRoaXMuaWNvbiwgc3ltYm9sSW5zdGFuY2UucGxhY2VkSWNvblN5bWJvbEluZGV4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkSWNvblN5bWJvbEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEluZGljZXNGb3JQbGFjZWRTeW1ib2wodGhpcy5pY29uLCBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZEljb25TeW1ib2xJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50ZXh0LmluZGV4QnVmZmVyKSB0aGlzLnRleHQuaW5kZXhCdWZmZXIudXBkYXRlRGF0YSh0aGlzLnRleHQuaW5kZXhBcnJheSk7XG4gICAgICAgIGlmICh0aGlzLmljb24uaW5kZXhCdWZmZXIpIHRoaXMuaWNvbi5pbmRleEJ1ZmZlci51cGRhdGVEYXRhKHRoaXMuaWNvbi5pbmRleEFycmF5KTtcbiAgICB9XG59XG5cbnJlZ2lzdGVyKFN5bWJvbEJ1Y2tldCwgJ1N5bWJvbEJ1Y2tldCcsIHtcbiAgICBvbWl0OiBbJ2xheWVycycsICdjb2xsaXNpb25Cb3hBcnJheScsICdmZWF0dXJlcycsICdjb21wYXJlVGV4dCddXG59KTtcblxuLy8gdGhpcyBjb25zdGFudCBpcyBiYXNlZCBvbiB0aGUgc2l6ZSBvZiBTdHJ1Y3RBcnJheSBpbmRleGVzIHVzZWQgaW4gYSBzeW1ib2xcbi8vIGJ1Y2tldC0tbmFtZWx5LCBnbHlwaE9mZnNldEFycmF5U3RhcnRcbi8vIGVnIHRoZSBtYXggdmFsaWQgVUludDE2IGlzIDY1LDUzNVxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTA3IGZvciBtb3RpdmF0aW9uXG4vLyBsaW5lU3RhcnRJbmRleCBhbmQgdGV4dEJveFN0YXJ0SW5kZXggY291bGQgcG90ZW50aWFsbHkgYmUgY29uY2VybnNcbi8vIGJ1dCB3ZSBleHBlY3QgdGhlcmUgdG8gYmUgbWFueSBmZXdlciBib3hlcy9saW5lcyB0aGFuIGdseXBoc1xuU3ltYm9sQnVja2V0Lk1BWF9HTFlQSFMgPSA2NTUzNTtcblxuU3ltYm9sQnVja2V0LmFkZER5bmFtaWNBdHRyaWJ1dGVzID0gYWRkRHluYW1pY0F0dHJpYnV0ZXM7XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbEJ1Y2tldDtcbmV4cG9ydCB7YWRkRHluYW1pY0F0dHJpYnV0ZXMsIHVwZGF0ZUdsb2JlVmVydGV4Tm9ybWFsfTtcbiIsIi8vIEBmbG93XG5leHBvcnQgZGVmYXVsdCByZXNvbHZlVG9rZW5zO1xuXG4vKipcbiAqIFJlcGxhY2UgdG9rZW5zIGluIGEgc3RyaW5nIHRlbXBsYXRlIHdpdGggdmFsdWVzIGluIGFuIG9iamVjdFxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0aWVzIGEga2V5L3ZhbHVlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRva2VucyBhbmQgcmVwbGFjZW1lbnRzXG4gKiBAcGFyYW0gdGV4dCB0aGUgdGVtcGxhdGUgc3RyaW5nXG4gKiBAcmV0dXJucyB0aGUgdGVtcGxhdGUgd2l0aCB0b2tlbnMgcmVwbGFjZWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUb2tlbnMocHJvcGVydGllczogeytbc3RyaW5nXTogbWl4ZWR9LCB0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL3soW157fV0rKX0vZywgKG1hdGNoLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4ga2V5IGluIHByb3BlcnRpZXMgPyBTdHJpbmcocHJvcGVydGllc1trZXldKSA6ICcnO1xuICAgIH0pO1xufVxuIiwiLy8gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZC4gRWRpdCBidWlsZC9nZW5lcmF0ZS1zdHlsZS1jb2RlLmpzLCB0aGVuIHJ1biBgeWFybiBydW4gY29kZWdlbmAuXG4vLyBAZmxvd1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuXG5pbXBvcnQge1xuICAgIFByb3BlcnRpZXMsXG4gICAgRGF0YUNvbnN0YW50UHJvcGVydHksXG4gICAgRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWREYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZFByb3BlcnR5LFxuICAgIENvbG9yUmFtcFByb3BlcnR5XG59IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG5pbXBvcnQgdHlwZSBGb3JtYXR0ZWQgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL2Zvcm1hdHRlZC5qcyc7XG5cbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuaW1wb3J0IHtcbiAgICBDb2xvclR5cGVcbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgTGF5b3V0UHJvcHMgPSB7fFxuICAgIFwic3ltYm9sLXBsYWNlbWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcInBvaW50XCIgfCBcImxpbmVcIiB8IFwibGluZS1jZW50ZXJcIj4sXG4gICAgXCJzeW1ib2wtc3BhY2luZ1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwic3ltYm9sLWF2b2lkLWVkZ2VzXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwic3ltYm9sLXNvcnQta2V5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwic3ltYm9sLXotb3JkZXJcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJhdXRvXCIgfCBcInZpZXdwb3J0LXlcIiB8IFwic291cmNlXCI+LFxuICAgIFwiaWNvbi1hbGxvdy1vdmVybGFwXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwiaWNvbi1pZ25vcmUtcGxhY2VtZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxuICAgIFwiaWNvbi1vcHRpb25hbFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcImljb24tcm90YXRpb24tYWxpZ25tZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCIgfCBcImF1dG9cIj4sXG4gICAgXCJpY29uLXNpemVcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLXRleHQtZml0XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibm9uZVwiIHwgXCJ3aWR0aFwiIHwgXCJoZWlnaHRcIiB8IFwiYm90aFwiPixcbiAgICBcImljb24tdGV4dC1maXQtcGFkZGluZ1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXT4sXG4gICAgXCJpY29uLWltYWdlXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxSZXNvbHZlZEltYWdlPixcbiAgICBcImljb24tcm90YXRlXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaWNvbi1wYWRkaW5nXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLWtlZXAtdXByaWdodFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxib29sZWFuPixcbiAgICBcImljb24tb2Zmc2V0XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBcImljb24tYW5jaG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxcImNlbnRlclwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcInRvcFwiIHwgXCJib3R0b21cIiB8IFwidG9wLWxlZnRcIiB8IFwidG9wLXJpZ2h0XCIgfCBcImJvdHRvbS1sZWZ0XCIgfCBcImJvdHRvbS1yaWdodFwiPixcbiAgICBcImljb24tcGl0Y2gtYWxpZ25tZW50XCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCIgfCBcImF1dG9cIj4sXG4gICAgXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcIm1hcFwiIHwgXCJ2aWV3cG9ydFwiIHwgXCJhdXRvXCI+LFxuICAgIFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJtYXBcIiB8IFwidmlld3BvcnRcIiB8IFwiYXV0b1wiPixcbiAgICBcInRleHQtZmllbGRcIjogRGF0YURyaXZlblByb3BlcnR5PEZvcm1hdHRlZD4sXG4gICAgXCJ0ZXh0LWZvbnRcIjogRGF0YURyaXZlblByb3BlcnR5PEFycmF5PHN0cmluZz4+LFxuICAgIFwidGV4dC1zaXplXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1tYXgtd2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LWxpbmUtaGVpZ2h0XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1sZXR0ZXItc3BhY2luZ1wiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtanVzdGlmeVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8XCJhdXRvXCIgfCBcImxlZnRcIiB8IFwiY2VudGVyXCIgfCBcInJpZ2h0XCI+LFxuICAgIFwidGV4dC1yYWRpYWwtb2Zmc2V0XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC12YXJpYWJsZS1hbmNob3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8QXJyYXk8XCJjZW50ZXJcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJ0b3BcIiB8IFwiYm90dG9tXCIgfCBcInRvcC1sZWZ0XCIgfCBcInRvcC1yaWdodFwiIHwgXCJib3R0b20tbGVmdFwiIHwgXCJib3R0b20tcmlnaHRcIj4+LFxuICAgIFwidGV4dC1hbmNob3JcIjogRGF0YURyaXZlblByb3BlcnR5PFwiY2VudGVyXCIgfCBcImxlZnRcIiB8IFwicmlnaHRcIiB8IFwidG9wXCIgfCBcImJvdHRvbVwiIHwgXCJ0b3AtbGVmdFwiIHwgXCJ0b3AtcmlnaHRcIiB8IFwiYm90dG9tLWxlZnRcIiB8IFwiYm90dG9tLXJpZ2h0XCI+LFxuICAgIFwidGV4dC1tYXgtYW5nbGVcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtd3JpdGluZy1tb2RlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PEFycmF5PFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiPj4sXG4gICAgXCJ0ZXh0LXJvdGF0ZVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtcGFkZGluZ1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1rZWVwLXVwcmlnaHRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJ0ZXh0LXRyYW5zZm9ybVwiOiBEYXRhRHJpdmVuUHJvcGVydHk8XCJub25lXCIgfCBcInVwcGVyY2FzZVwiIHwgXCJsb3dlcmNhc2VcIj4sXG4gICAgXCJ0ZXh0LW9mZnNldFwiOiBEYXRhRHJpdmVuUHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJ0ZXh0LWFsbG93LW92ZXJsYXBcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Ym9vbGVhbj4sXG4gICAgXCJ0ZXh0LW9wdGlvbmFsXCI6IERhdGFDb25zdGFudFByb3BlcnR5PGJvb2xlYW4+LFxufH07XG5cbmNvbnN0IGxheW91dDogUHJvcGVydGllczxMYXlvdXRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJzeW1ib2wtcGxhY2VtZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLXBsYWNlbWVudFwiXSksXG4gICAgXCJzeW1ib2wtc3BhY2luZ1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInN5bWJvbC1zcGFjaW5nXCJdKSxcbiAgICBcInN5bWJvbC1hdm9pZC1lZGdlc1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInN5bWJvbC1hdm9pZC1lZGdlc1wiXSksXG4gICAgXCJzeW1ib2wtc29ydC1rZXlcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLXNvcnQta2V5XCJdKSxcbiAgICBcInN5bWJvbC16LW9yZGVyXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wic3ltYm9sLXotb3JkZXJcIl0pLFxuICAgIFwiaWNvbi1hbGxvdy1vdmVybGFwXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1hbGxvdy1vdmVybGFwXCJdKSxcbiAgICBcImljb24taWdub3JlLXBsYWNlbWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24taWdub3JlLXBsYWNlbWVudFwiXSksXG4gICAgXCJpY29uLW9wdGlvbmFsXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1vcHRpb25hbFwiXSksXG4gICAgXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tcm90YXRpb24tYWxpZ25tZW50XCJdKSxcbiAgICBcImljb24tc2l6ZVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXNpemVcIl0pLFxuICAgIFwiaWNvbi10ZXh0LWZpdFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tdGV4dC1maXRcIl0pLFxuICAgIFwiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi10ZXh0LWZpdC1wYWRkaW5nXCJdKSxcbiAgICBcImljb24taW1hZ2VcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1wiaWNvbi1pbWFnZVwiXSksXG4gICAgXCJpY29uLXJvdGF0ZVwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXJvdGF0ZVwiXSksXG4gICAgXCJpY29uLXBhZGRpbmdcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLXBhZGRpbmdcIl0pLFxuICAgIFwiaWNvbi1rZWVwLXVwcmlnaHRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLWtlZXAtdXByaWdodFwiXSksXG4gICAgXCJpY29uLW9mZnNldFwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLW9mZnNldFwiXSksXG4gICAgXCJpY29uLWFuY2hvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJpY29uLWFuY2hvclwiXSksXG4gICAgXCJpY29uLXBpdGNoLWFsaWdubWVudFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcImljb24tcGl0Y2gtYWxpZ25tZW50XCJdKSxcbiAgICBcInRleHQtcGl0Y2gtYWxpZ25tZW50XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1waXRjaC1hbGlnbm1lbnRcIl0pLFxuICAgIFwidGV4dC1yb3RhdGlvbi1hbGlnbm1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiXSksXG4gICAgXCJ0ZXh0LWZpZWxkXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtZmllbGRcIl0pLFxuICAgIFwidGV4dC1mb250XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtZm9udFwiXSksXG4gICAgXCJ0ZXh0LXNpemVcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1zaXplXCJdKSxcbiAgICBcInRleHQtbWF4LXdpZHRoXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtbWF4LXdpZHRoXCJdKSxcbiAgICBcInRleHQtbGluZS1oZWlnaHRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1saW5lLWhlaWdodFwiXSksXG4gICAgXCJ0ZXh0LWxldHRlci1zcGFjaW5nXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtbGV0dGVyLXNwYWNpbmdcIl0pLFxuICAgIFwidGV4dC1qdXN0aWZ5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtanVzdGlmeVwiXSksXG4gICAgXCJ0ZXh0LXJhZGlhbC1vZmZzZXRcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1yYWRpYWwtb2Zmc2V0XCJdKSxcbiAgICBcInRleHQtdmFyaWFibGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC12YXJpYWJsZS1hbmNob3JcIl0pLFxuICAgIFwidGV4dC1hbmNob3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJsYXlvdXRfc3ltYm9sXCJdW1widGV4dC1hbmNob3JcIl0pLFxuICAgIFwidGV4dC1tYXgtYW5nbGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LW1heC1hbmdsZVwiXSksXG4gICAgXCJ0ZXh0LXdyaXRpbmctbW9kZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtd3JpdGluZy1tb2RlXCJdKSxcbiAgICBcInRleHQtcm90YXRlXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtcm90YXRlXCJdKSxcbiAgICBcInRleHQtcGFkZGluZ1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtcGFkZGluZ1wiXSksXG4gICAgXCJ0ZXh0LWtlZXAtdXByaWdodFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQta2VlcC11cHJpZ2h0XCJdKSxcbiAgICBcInRleHQtdHJhbnNmb3JtXCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtdHJhbnNmb3JtXCJdKSxcbiAgICBcInRleHQtb2Zmc2V0XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtb2Zmc2V0XCJdKSxcbiAgICBcInRleHQtYWxsb3ctb3ZlcmxhcFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtYWxsb3ctb3ZlcmxhcFwiXSksXG4gICAgXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcImxheW91dF9zeW1ib2xcIl1bXCJ0ZXh0LWlnbm9yZS1wbGFjZW1lbnRcIl0pLFxuICAgIFwidGV4dC1vcHRpb25hbFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wibGF5b3V0X3N5bWJvbFwiXVtcInRleHQtb3B0aW9uYWxcIl0pLFxufSk7XG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwiaWNvbi1vcGFjaXR5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwiaWNvbi1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwiaWNvbi1oYWxvLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJpY29uLWhhbG8td2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJpY29uLWhhbG8tYmx1clwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcImljb24tdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwiaWNvbi10cmFuc2xhdGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwidGV4dC1vcGFjaXR5XCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwidGV4dC1jb2xvclwiOiBEYXRhRHJpdmVuUHJvcGVydHk8Q29sb3I+LFxuICAgIFwidGV4dC1oYWxvLWNvbG9yXCI6IERhdGFEcml2ZW5Qcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJ0ZXh0LWhhbG8td2lkdGhcIjogRGF0YURyaXZlblByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJ0ZXh0LWhhbG8tYmx1clwiOiBEYXRhRHJpdmVuUHJvcGVydHk8bnVtYmVyPixcbiAgICBcInRleHQtdHJhbnNsYXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwiaWNvbi1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1wiaWNvbi1vcGFjaXR5XCJdKSxcbiAgICBcImljb24tY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWNvbG9yXCJdKSxcbiAgICBcImljb24taGFsby1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcImljb24taGFsby1jb2xvclwiXSksXG4gICAgXCJpY29uLWhhbG8td2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWhhbG8td2lkdGhcIl0pLFxuICAgIFwiaWNvbi1oYWxvLWJsdXJcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLWhhbG8tYmx1clwiXSksXG4gICAgXCJpY29uLXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1wiaWNvbi10cmFuc2xhdGVcIl0pLFxuICAgIFwiaWNvbi10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJpY29uLXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxuICAgIFwidGV4dC1vcGFjaXR5XCI6IG5ldyBEYXRhRHJpdmVuUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1widGV4dC1vcGFjaXR5XCJdKSxcbiAgICBcInRleHQtY29sb3JcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWNvbG9yXCJdLCB7IHJ1bnRpbWVUeXBlOiBDb2xvclR5cGUsIGdldE92ZXJyaWRlOiAobykgPT4gby50ZXh0Q29sb3IsIGhhc092ZXJyaWRlOiAobykgPT4gISFvLnRleHRDb2xvciB9KSxcbiAgICBcInRleHQtaGFsby1jb2xvclwiOiBuZXcgRGF0YURyaXZlblByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3N5bWJvbFwiXVtcInRleHQtaGFsby1jb2xvclwiXSksXG4gICAgXCJ0ZXh0LWhhbG8td2lkdGhcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWhhbG8td2lkdGhcIl0pLFxuICAgIFwidGV4dC1oYWxvLWJsdXJcIjogbmV3IERhdGFEcml2ZW5Qcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LWhhbG8tYmx1clwiXSksXG4gICAgXCJ0ZXh0LXRyYW5zbGF0ZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc3ltYm9sXCJdW1widGV4dC10cmFuc2xhdGVcIl0pLFxuICAgIFwidGV4dC10cmFuc2xhdGUtYW5jaG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9zeW1ib2xcIl1bXCJ0ZXh0LXRyYW5zbGF0ZS1hbmNob3JcIl0pLFxufSk7XG5cbi8vIE5vdGU6IHdpdGhvdXQgYWRkaW5nIHRoZSBleHBsaWNpdCB0eXBlIGFubm90YXRpb24sIEZsb3cgaW5mZXJzIHdlYWtlciB0eXBlc1xuLy8gZm9yIHRoZXNlIG9iamVjdHMgZnJvbSB0aGVpciB1c2UgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIFN0eWxlTGF5ZXIsIGFzXG4vLyB7bGF5b3V0PzogUHJvcGVydGllczwuLi4+LCBwYWludDogUHJvcGVydGllczwuLi4+fVxuZXhwb3J0IGRlZmF1bHQgKHsgcGFpbnQsIGxheW91dCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPiwgbGF5b3V0OiBQcm9wZXJ0aWVzPExheW91dFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHR5cGUge0V4cHJlc3Npb259IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25Db250ZXh0IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9ldmFsdWF0aW9uX2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1R5cGV9IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7Wm9vbUNvbnN0YW50RXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcbmltcG9ydCB7TnVsbFR5cGV9IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy5qcyc7XG5pbXBvcnQge1Bvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZX0gZnJvbSAnLi9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5cbi8vIFRoaXMgaXMgYW4gaW50ZXJuYWwgZXhwcmVzc2lvbiBjbGFzcy4gSXQgaXMgb25seSB1c2VkIGluIEdMIEpTIGFuZFxuLy8gaGFzIEdMIEpTIGRlcGVuZGVuY2llcyB3aGljaCBjYW4gYnJlYWsgdGhlIHN0YW5kYWxvbmUgc3R5bGUtc3BlYyBtb2R1bGVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZvcm1hdFNlY3Rpb25PdmVycmlkZTxUPiBpbXBsZW1lbnRzIEV4cHJlc3Npb24ge1xuICAgIHR5cGU6IFR5cGU7XG4gICAgZGVmYXVsdFZhbHVlOiBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWU8VD47XG5cbiAgICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWU6IFBvc3NpYmx5RXZhbHVhdGVkUHJvcGVydHlWYWx1ZTxUPikge1xuICAgICAgICBhc3NlcnQoZGVmYXVsdFZhbHVlLnByb3BlcnR5Lm92ZXJyaWRlcyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy50eXBlID0gZGVmYXVsdFZhbHVlLnByb3BlcnR5Lm92ZXJyaWRlcyA/IGRlZmF1bHRWYWx1ZS5wcm9wZXJ0eS5vdmVycmlkZXMucnVudGltZVR5cGUgOiBOdWxsVHlwZTtcbiAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgZXZhbHVhdGUoY3R4OiBFdmFsdWF0aW9uQ29udGV4dCk6IFQge1xuICAgICAgICBpZiAoY3R4LmZvcm1hdHRlZFNlY3Rpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlcyA9IHRoaXMuZGVmYXVsdFZhbHVlLnByb3BlcnR5Lm92ZXJyaWRlcztcbiAgICAgICAgICAgIGlmIChvdmVycmlkZXMgJiYgb3ZlcnJpZGVzLmhhc092ZXJyaWRlKGN0eC5mb3JtYXR0ZWRTZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdmVycmlkZXMuZ2V0T3ZlcnJpZGUoY3R4LmZvcm1hdHRlZFNlY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN0eC5mZWF0dXJlICYmIGN0eC5mZWF0dXJlU3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZS5ldmFsdWF0ZShjdHguZmVhdHVyZSwgY3R4LmZlYXR1cmVTdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBub3Qgc3VyZSBob3cgdG8gbWFrZSBGbG93IHJlZmluZSB0aGUgdHlwZSBwcm9wZXJseSBoZXJlIOKAlCB3aWxsIG5lZWQgaW52ZXN0aWdhdGlvblxuICAgICAgICByZXR1cm4gKCh0aGlzLmRlZmF1bHRWYWx1ZS5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uLmRlZmF1bHQ6IGFueSk6IFQpO1xuICAgIH1cblxuICAgIGVhY2hDaGlsZChmbjogKF86IEV4cHJlc3Npb24pID0+IHZvaWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlZmF1bHRWYWx1ZS5pc0NvbnN0YW50KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cHI6IFpvb21Db25zdGFudEV4cHJlc3Npb248J3NvdXJjZSc+ID0gKCh0aGlzLmRlZmF1bHRWYWx1ZS52YWx1ZSk6IGFueSk7XG4gICAgICAgICAgICBmbihleHByLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYW5ub3QgYmUgc3RhdGljYWxseSBldmFsdWF0ZWQsIGFzIHRoZSBvdXRwdXQgZGVwZW5kcyBvbiB0aGUgZXZhbHVhdGlvbiBjb250ZXh0LlxuICAgIG91dHB1dERlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoRm9ybWF0U2VjdGlvbk92ZXJyaWRlLCAnRm9ybWF0U2VjdGlvbk92ZXJyaWRlJywge29taXQ6IFsnZGVmYXVsdFZhbHVlJ119KTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyLmpzJztcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IFN5bWJvbEJ1Y2tldCBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCByZXNvbHZlVG9rZW5zIGZyb20gJy4uLy4uL3V0aWwvcmVzb2x2ZV90b2tlbnMuanMnO1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9zeW1ib2xfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCB7XG4gICAgVHJhbnNpdGlvbmFibGUsXG4gICAgVHJhbnNpdGlvbmluZyxcbiAgICBMYXlvdXQsXG4gICAgUG9zc2libHlFdmFsdWF0ZWQsXG4gICAgUG9zc2libHlFdmFsdWF0ZWRQcm9wZXJ0eVZhbHVlLFxuICAgIFByb3BlcnR5VmFsdWVcbn0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCB7XG4gICAgaXNFeHByZXNzaW9uLFxuICAgIFN0eWxlRXhwcmVzc2lvbixcbiAgICBab29tQ29uc3RhbnRFeHByZXNzaW9uLFxuICAgIFpvb21EZXBlbmRlbnRFeHByZXNzaW9uXG59IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5cbmltcG9ydCB0eXBlIHtCdWNrZXRQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9kYXRhL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSB7TGF5b3V0UHJvcHMsIFBhaW50UHJvcHN9IGZyb20gJy4vc3ltYm9sX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmUsIFNvdXJjZUV4cHJlc3Npb24sIENvbXBvc2l0ZUV4cHJlc3Npb259IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7RXhwcmVzc2lvbn0gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHtGb3JtYXR0ZWRUeXBlfSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMuanMnO1xuaW1wb3J0IHt0eXBlT2Z9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi92YWx1ZXMuanMnO1xuaW1wb3J0IEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcbmltcG9ydCBGb3JtYXRTZWN0aW9uT3ZlcnJpZGUgZnJvbSAnLi4vZm9ybWF0X3NlY3Rpb25fb3ZlcnJpZGUuanMnO1xuaW1wb3J0IEZvcm1hdEV4cHJlc3Npb24gZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2RlZmluaXRpb25zL2Zvcm1hdC5qcyc7XG5pbXBvcnQgTGl0ZXJhbCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vZGVmaW5pdGlvbnMvbGl0ZXJhbC5qcyc7XG5pbXBvcnQgUHJvZ3JhbUNvbmZpZ3VyYXRpb24gZnJvbSAnLi4vLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMnO1xuXG5jbGFzcyBTeW1ib2xTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3VuZXZhbHVhdGVkTGF5b3V0OiBMYXlvdXQ8TGF5b3V0UHJvcHM+O1xuICAgIGxheW91dDogUG9zc2libHlFdmFsdWF0ZWQ8TGF5b3V0UHJvcHM+O1xuXG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuXG4gICAgY29uc3RydWN0b3IobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcihsYXllciwgcHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgcmVjYWxjdWxhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBzdXBlci5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzLCBhdmFpbGFibGVJbWFnZXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpICE9PSAncG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1snaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9ICdtYXAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddID0gJ3ZpZXdwb3J0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpICE9PSAncG9pbnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1sndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9ICdtYXAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID0gJ3ZpZXdwb3J0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHVuc3BlY2lmaWVkLCBgKi1waXRjaC1hbGlnbm1lbnRgIGluaGVyaXRzIGAqLXJvdGF0aW9uLWFsaWdubWVudGBcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0LmdldCgndGV4dC1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dC5fdmFsdWVzWyd0ZXh0LXBpdGNoLWFsaWdubWVudCddID0gdGhpcy5sYXlvdXQuZ2V0KCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxheW91dC5nZXQoJ2ljb24tcGl0Y2gtYWxpZ25tZW50JykgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1snaWNvbi1waXRjaC1hbGlnbm1lbnQnXSA9IHRoaXMubGF5b3V0LmdldCgnaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdyaXRpbmdNb2RlcyA9IHRoaXMubGF5b3V0LmdldCgndGV4dC13cml0aW5nLW1vZGUnKTtcbiAgICAgICAgaWYgKHdyaXRpbmdNb2Rlcykge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZXMsIHByZXNlcnZpbmcgb3JkZXJcbiAgICAgICAgICAgIGNvbnN0IGRlZHVwZWQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbSBvZiB3cml0aW5nTW9kZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVkdXBlZC5pbmRleE9mKG0pIDwgMCkgZGVkdXBlZC5wdXNoKG0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1sndGV4dC13cml0aW5nLW1vZGUnXSA9IGRlZHVwZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXlvdXQuZ2V0KCdzeW1ib2wtcGxhY2VtZW50JykgPT09ICdwb2ludCcpIHtcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgdmFsdWUgZm9yICdwb2ludCcgcGxhY2VtZW50IHN5bWJvbHNcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Ll92YWx1ZXNbJ3RleHQtd3JpdGluZy1tb2RlJ10gPSBbJ2hvcml6b250YWwnXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgdmFsdWUgZm9yICdsaW5lJyBwbGFjZW1lbnQgc3ltYm9sc1xuICAgICAgICAgICAgdGhpcy5sYXlvdXQuX3ZhbHVlc1sndGV4dC13cml0aW5nLW1vZGUnXSA9IFsnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCddO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2V0UGFpbnRPdmVycmlkZXMoKTtcbiAgICB9XG5cbiAgICBnZXRWYWx1ZUFuZFJlc29sdmVUb2tlbnMobmFtZTogKiwgZmVhdHVyZTogRmVhdHVyZSwgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5sYXlvdXQuZ2V0KG5hbWUpLmV2YWx1YXRlKGZlYXR1cmUsIHt9LCBjYW5vbmljYWwsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgIGNvbnN0IHVuZXZhbHVhdGVkID0gdGhpcy5fdW5ldmFsdWF0ZWRMYXlvdXQuX3ZhbHVlc1tuYW1lXTtcbiAgICAgICAgaWYgKCF1bmV2YWx1YXRlZC5pc0RhdGFEcml2ZW4oKSAmJiAhaXNFeHByZXNzaW9uKHVuZXZhbHVhdGVkLnZhbHVlKSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVUb2tlbnMoZmVhdHVyZS5wcm9wZXJ0aWVzLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY3JlYXRlQnVja2V0KHBhcmFtZXRlcnM6IEJ1Y2tldFBhcmFtZXRlcnM8Kj4pOiBTeW1ib2xCdWNrZXQge1xuICAgICAgICByZXR1cm4gbmV3IFN5bWJvbEJ1Y2tldChwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBxdWVyeVJhZGl1cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBxdWVyeUludGVyc2VjdHNGZWF0dXJlKCk6IGJvb2xlYW4ge1xuICAgICAgICBhc3NlcnQoZmFsc2UpOyAvLyBTaG91bGQgdGFrZSBhIGRpZmZlcmVudCBwYXRoIGluIEZlYXR1cmVJbmRleFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX3NldFBhaW50T3ZlcnJpZGVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IG92ZXJyaWRhYmxlIG9mIHByb3BlcnRpZXMucGFpbnQub3ZlcnJpZGFibGVQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBpZiAoIVN5bWJvbFN0eWxlTGF5ZXIuaGFzUGFpbnRPdmVycmlkZSh0aGlzLmxheW91dCwgb3ZlcnJpZGFibGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvdmVycmlkZW4gPSB0aGlzLnBhaW50LmdldChvdmVycmlkYWJsZSk7XG4gICAgICAgICAgICBjb25zdCBvdmVycmlkZSA9IG5ldyBGb3JtYXRTZWN0aW9uT3ZlcnJpZGUob3ZlcnJpZGVuKTtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlRXhwcmVzc2lvbiA9IG5ldyBTdHlsZUV4cHJlc3Npb24ob3ZlcnJpZGUsIG92ZXJyaWRlbi5wcm9wZXJ0eS5zcGVjaWZpY2F0aW9uKTtcbiAgICAgICAgICAgIGxldCBleHByZXNzaW9uID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChvdmVycmlkZW4udmFsdWUua2luZCA9PT0gJ2NvbnN0YW50JyB8fCBvdmVycmlkZW4udmFsdWUua2luZCA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gKG5ldyBab29tQ29uc3RhbnRFeHByZXNzaW9uKCdzb3VyY2UnLCBzdHlsZUV4cHJlc3Npb24pOiBTb3VyY2VFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IChuZXcgWm9vbURlcGVuZGVudEV4cHJlc3Npb24oJ2NvbXBvc2l0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlbi52YWx1ZS56b29tU3RvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVuLnZhbHVlLl9pbnRlcnBvbGF0aW9uVHlwZSk6IENvbXBvc2l0ZUV4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wYWludC5fdmFsdWVzW292ZXJyaWRhYmxlXSA9IG5ldyBQb3NzaWJseUV2YWx1YXRlZFByb3BlcnR5VmFsdWUob3ZlcnJpZGVuLnByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlbi5wYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9oYW5kbGVPdmVycmlkYWJsZVBhaW50UHJvcGVydHlVcGRhdGU8VCwgUj4obmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogUHJvcGVydHlWYWx1ZTxULCBSPiwgbmV3VmFsdWU6IFByb3BlcnR5VmFsdWU8VCwgUj4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dCB8fCBvbGRWYWx1ZS5pc0RhdGFEcml2ZW4oKSB8fCBuZXdWYWx1ZS5pc0RhdGFEcml2ZW4oKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTeW1ib2xTdHlsZUxheWVyLmhhc1BhaW50T3ZlcnJpZGUodGhpcy5sYXlvdXQsIG5hbWUpO1xuICAgIH1cblxuICAgIHN0YXRpYyBoYXNQYWludE92ZXJyaWRlKGxheW91dDogUG9zc2libHlFdmFsdWF0ZWQ8TGF5b3V0UHJvcHM+LCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0ZXh0RmllbGQgPSBsYXlvdXQuZ2V0KCd0ZXh0LWZpZWxkJyk7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gcHJvcGVydGllcy5wYWludC5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgIGxldCBoYXNPdmVycmlkZXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBjaGVja1NlY3Rpb25zID0gKHNlY3Rpb25zKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkub3ZlcnJpZGVzICYmIHByb3BlcnR5Lm92ZXJyaWRlcy5oYXNPdmVycmlkZShzZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNPdmVycmlkZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0ZXh0RmllbGQudmFsdWUua2luZCA9PT0gJ2NvbnN0YW50JyAmJiB0ZXh0RmllbGQudmFsdWUudmFsdWUgaW5zdGFuY2VvZiBGb3JtYXR0ZWQpIHtcbiAgICAgICAgICAgIGNoZWNrU2VjdGlvbnModGV4dEZpZWxkLnZhbHVlLnZhbHVlLnNlY3Rpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZXh0RmllbGQudmFsdWUua2luZCA9PT0gJ3NvdXJjZScpIHtcblxuICAgICAgICAgICAgY29uc3QgY2hlY2tFeHByZXNzaW9uID0gKGV4cHJlc3Npb246IEV4cHJlc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3ZlcnJpZGVzKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIExpdGVyYWwgJiYgdHlwZU9mKGV4cHJlc3Npb24udmFsdWUpID09PSBGb3JtYXR0ZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZDogRm9ybWF0dGVkID0gKChleHByZXNzaW9uLnZhbHVlKTogYW55KTtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTZWN0aW9ucyhmb3JtYXR0ZWQuc2VjdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEZvcm1hdEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tTZWN0aW9ucyhleHByZXNzaW9uLnNlY3Rpb25zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLmVhY2hDaGlsZChjaGVja0V4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGV4cHI6IFpvb21Db25zdGFudEV4cHJlc3Npb248J3NvdXJjZSc+ID0gKCh0ZXh0RmllbGQudmFsdWUpOiBhbnkpO1xuICAgICAgICAgICAgaWYgKGV4cHIuX3N0eWxlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGNoZWNrRXhwcmVzc2lvbihleHByLl9zdHlsZUV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzT3ZlcnJpZGVzO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1Db25maWd1cmF0aW9uKHpvb206IG51bWJlcik6IFByb2dyYW1Db25maWd1cmF0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9ncmFtQ29uZmlndXJhdGlvbih0aGlzLCB6b29tKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbFN0eWxlTGF5ZXI7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdC5qcyc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcblxuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuXG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwiYmFja2dyb3VuZC1jb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIjogQ3Jvc3NGYWRlZFByb3BlcnR5PFJlc29sdmVkSW1hZ2U+LFxuICAgIFwiYmFja2dyb3VuZC1vcGFjaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJiYWNrZ3JvdW5kLWNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9iYWNrZ3JvdW5kXCJdW1wiYmFja2dyb3VuZC1jb2xvclwiXSksXG4gICAgXCJiYWNrZ3JvdW5kLXBhdHRlcm5cIjogbmV3IENyb3NzRmFkZWRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9iYWNrZ3JvdW5kXCJdW1wiYmFja2dyb3VuZC1wYXR0ZXJuXCJdKSxcbiAgICBcImJhY2tncm91bmQtb3BhY2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfYmFja2dyb3VuZFwiXVtcImJhY2tncm91bmQtb3BhY2l0eVwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXIuanMnO1xuXG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICcuL2JhY2tncm91bmRfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge1RyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZH0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCB0eXBlIHtQYWludFByb3BzfSBmcm9tICcuL2JhY2tncm91bmRfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcblxuY2xhc3MgQmFja2dyb3VuZFN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcbiAgICBfdHJhbnNpdGlvbmFibGVQYWludDogVHJhbnNpdGlvbmFibGU8UGFpbnRQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmdQYWludDogVHJhbnNpdGlvbmluZzxQYWludFByb3BzPjtcbiAgICBwYWludDogUG9zc2libHlFdmFsdWF0ZWQ8UGFpbnRQcm9wcz47XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtSWRzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMucGFpbnQuZ2V0KCdiYWNrZ3JvdW5kLXBhdHRlcm4nKTtcbiAgICAgICAgcmV0dXJuIFtpbWFnZSA/ICdiYWNrZ3JvdW5kUGF0dGVybicgOiAnYmFja2dyb3VuZCddO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFja2dyb3VuZFN0eWxlTGF5ZXI7XG4iLCIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkLiBFZGl0IGJ1aWxkL2dlbmVyYXRlLXN0eWxlLWNvZGUuanMsIHRoZW4gcnVuIGB5YXJuIHJ1biBjb2RlZ2VuYC5cbi8vIEBmbG93XG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdC5qcyc7XG5cbmltcG9ydCB7XG4gICAgUHJvcGVydGllcyxcbiAgICBEYXRhQ29uc3RhbnRQcm9wZXJ0eSxcbiAgICBEYXRhRHJpdmVuUHJvcGVydHksXG4gICAgQ3Jvc3NGYWRlZERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkUHJvcGVydHksXG4gICAgQ29sb3JSYW1wUHJvcGVydHlcbn0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5cbmltcG9ydCB0eXBlIEZvcm1hdHRlZCBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvZm9ybWF0dGVkLmpzJztcblxuaW1wb3J0IHR5cGUgUmVzb2x2ZWRJbWFnZSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL2V4cHJlc3Npb24vdHlwZXMvcmVzb2x2ZWRfaW1hZ2UuanMnO1xuXG5cbmV4cG9ydCB0eXBlIFBhaW50UHJvcHMgPSB7fFxuICAgIFwicmFzdGVyLW9wYWNpdHlcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInJhc3Rlci1odWUtcm90YXRlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJyYXN0ZXItYnJpZ2h0bmVzcy1taW5cIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwicmFzdGVyLXNhdHVyYXRpb25cIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInJhc3Rlci1jb250cmFzdFwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwicmFzdGVyLXJlc2FtcGxpbmdcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8XCJsaW5lYXJcIiB8IFwibmVhcmVzdFwiPixcbiAgICBcInJhc3Rlci1mYWRlLWR1cmF0aW9uXCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcGFpbnQ6IFByb3BlcnRpZXM8UGFpbnRQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJyYXN0ZXItb3BhY2l0eVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfcmFzdGVyXCJdW1wicmFzdGVyLW9wYWNpdHlcIl0pLFxuICAgIFwicmFzdGVyLWh1ZS1yb3RhdGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1odWUtcm90YXRlXCJdKSxcbiAgICBcInJhc3Rlci1icmlnaHRuZXNzLW1pblwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfcmFzdGVyXCJdW1wicmFzdGVyLWJyaWdodG5lc3MtbWluXCJdKSxcbiAgICBcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfcmFzdGVyXCJdW1wicmFzdGVyLWJyaWdodG5lc3MtbWF4XCJdKSxcbiAgICBcInJhc3Rlci1zYXR1cmF0aW9uXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9yYXN0ZXJcIl1bXCJyYXN0ZXItc2F0dXJhdGlvblwiXSksXG4gICAgXCJyYXN0ZXItY29udHJhc3RcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1jb250cmFzdFwiXSksXG4gICAgXCJyYXN0ZXItcmVzYW1wbGluZ1wiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfcmFzdGVyXCJdW1wicmFzdGVyLXJlc2FtcGxpbmdcIl0pLFxuICAgIFwicmFzdGVyLWZhZGUtZHVyYXRpb25cIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3Jhc3RlclwiXVtcInJhc3Rlci1mYWRlLWR1cmF0aW9uXCJdKSxcbn0pO1xuXG4vLyBOb3RlOiB3aXRob3V0IGFkZGluZyB0aGUgZXhwbGljaXQgdHlwZSBhbm5vdGF0aW9uLCBGbG93IGluZmVycyB3ZWFrZXIgdHlwZXNcbi8vIGZvciB0aGVzZSBvYmplY3RzIGZyb20gdGhlaXIgdXNlIGluIHRoZSBjb25zdHJ1Y3RvciB0byBTdHlsZUxheWVyLCBhc1xuLy8ge2xheW91dD86IFByb3BlcnRpZXM8Li4uPiwgcGFpbnQ6IFByb3BlcnRpZXM8Li4uPn1cbmV4cG9ydCBkZWZhdWx0ICh7IHBhaW50IH06ICRFeGFjdDx7XG4gIHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+XG59Pik7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZV9sYXllci5qcyc7XG5cbmltcG9ydCBwcm9wZXJ0aWVzIGZyb20gJy4vcmFzdGVyX3N0eWxlX2xheWVyX3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHtUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWR9IGZyb20gJy4uL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7UGFpbnRQcm9wc30gZnJvbSAnLi9yYXN0ZXJfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcblxuY2xhc3MgUmFzdGVyU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuICAgIF90cmFuc2l0aW9uYWJsZVBhaW50OiBUcmFuc2l0aW9uYWJsZTxQYWludFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZ1BhaW50OiBUcmFuc2l0aW9uaW5nPFBhaW50UHJvcHM+O1xuICAgIHBhaW50OiBQb3NzaWJseUV2YWx1YXRlZDxQYWludFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyOiBMYXllclNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgc3VwZXIobGF5ZXIsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIGdldFByb2dyYW1JZHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBbJ3Jhc3RlciddO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmFzdGVyU3R5bGVMYXllcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi8uLi91aS9tYXAuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHR5cGUge1ZhbGlkYXRpb25FcnJvcnN9IGZyb20gJy4uL3ZhbGlkYXRlX3N0eWxlLmpzJztcblxudHlwZSBDdXN0b21SZW5kZXJNZXRob2QgPSAoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgbWF0cml4OiBBcnJheTxudW1iZXI+KSA9PiB2b2lkO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY3VzdG9tIHN0eWxlIGxheWVycy4gVGhpcyBpcyBhIHNwZWNpZmljYXRpb24gZm9yXG4gKiBpbXBsZW1lbnRlcnMgdG8gbW9kZWw6IGl0IGlzIG5vdCBhbiBleHBvcnRlZCBtZXRob2Qgb3IgY2xhc3MuXG4gKlxuICogQ3VzdG9tIGxheWVycyBhbGxvdyBhIHVzZXIgdG8gcmVuZGVyIGRpcmVjdGx5IGludG8gdGhlIG1hcCdzIEdMIGNvbnRleHQgdXNpbmcgdGhlIG1hcCdzIGNhbWVyYS5cbiAqIFRoZXNlIGxheWVycyBjYW4gYmUgYWRkZWQgYmV0d2VlbiBhbnkgcmVndWxhciBsYXllcnMgdXNpbmcge0BsaW5rIE1hcCNhZGRMYXllcn0uXG4gKlxuICogQ3VzdG9tIGxheWVycyBtdXN0IGhhdmUgYSB1bmlxdWUgYGlkYCBhbmQgbXVzdCBoYXZlIHRoZSBgdHlwZWAgb2YgYFwiY3VzdG9tXCJgLlxuICogVGhleSBtdXN0IGltcGxlbWVudCBgcmVuZGVyYCBhbmQgbWF5IGltcGxlbWVudCBgcHJlcmVuZGVyYCwgYG9uQWRkYCBhbmQgYG9uUmVtb3ZlYC5cbiAqIFRoZXkgY2FuIHRyaWdnZXIgcmVuZGVyaW5nIHVzaW5nIHtAbGluayBNYXAjdHJpZ2dlclJlcGFpbnR9XG4gKiBhbmQgdGhleSBzaG91bGQgYXBwcm9wcmlhdGVseSBoYW5kbGUge0BsaW5rIE1hcC5ldmVudDp3ZWJnbGNvbnRleHRsb3N0fSBhbmRcbiAqIHtAbGluayBNYXAuZXZlbnQ6d2ViZ2xjb250ZXh0cmVzdG9yZWR9LlxuICpcbiAqIFRoZSBgcmVuZGVyaW5nTW9kZWAgcHJvcGVydHkgY29udHJvbHMgd2hldGhlciB0aGUgbGF5ZXIgaXMgdHJlYXRlZCBhcyBhIGBcIjJkXCJgIG9yIGBcIjNkXCJgIG1hcCBsYXllci4gVXNlOlxuICogLSBgXCJyZW5kZXJpbmdNb2RlXCI6IFwiM2RcImAgdG8gdXNlIHRoZSBkZXB0aCBidWZmZXIgYW5kIHNoYXJlIGl0IHdpdGggb3RoZXIgbGF5ZXJzXG4gKiAtIGBcInJlbmRlcmluZ01vZGVcIjogXCIyZFwiYCB0byBhZGQgYSBsYXllciB3aXRoIG5vIGRlcHRoLiBJZiB5b3UgbmVlZCB0byB1c2UgdGhlIGRlcHRoIGJ1ZmZlciBmb3IgYSBgXCIyZFwiYCBsYXllciB5b3UgbXVzdCB1c2UgYW4gb2Zmc2NyZWVuXG4gKiAgIGZyYW1lYnVmZmVyIGFuZCB7QGxpbmsgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UjcHJlcmVuZGVyfS5cbiAqXG4gKiBAaW50ZXJmYWNlIEN1c3RvbUxheWVySW50ZXJmYWNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgQSB1bmlxdWUgbGF5ZXIgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBUaGUgbGF5ZXIncyB0eXBlLiBNdXN0IGJlIGBcImN1c3RvbVwiYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZW5kZXJpbmdNb2RlIEVpdGhlciBgXCIyZFwiYCBvciBgXCIzZFwiYC4gRGVmYXVsdHMgdG8gYFwiMmRcImAuXG4gKiBAZXhhbXBsZVxuICogLy8gQ3VzdG9tIGxheWVyIGltcGxlbWVudGVkIGFzIEVTNiBjbGFzc1xuICogY2xhc3MgTnVsbElzbGFuZExheWVyIHtcbiAqICAgICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICAgICAgdGhpcy5pZCA9ICdudWxsLWlzbGFuZCc7XG4gKiAgICAgICAgIHRoaXMudHlwZSA9ICdjdXN0b20nO1xuICogICAgICAgICB0aGlzLnJlbmRlcmluZ01vZGUgPSAnMmQnO1xuICogICAgIH1cbiAqXG4gKiAgICAgb25BZGQobWFwLCBnbCkge1xuICogICAgICAgICBjb25zdCB2ZXJ0ZXhTb3VyY2UgPSBgXG4gKiAgICAgICAgIHVuaWZvcm0gbWF0NCB1X21hdHJpeDtcbiAqICAgICAgICAgdm9pZCBtYWluKCkge1xuICogICAgICAgICAgICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoMC41LCAwLjUsIDAuMCwgMS4wKTtcbiAqICAgICAgICAgICAgIGdsX1BvaW50U2l6ZSA9IDIwLjA7XG4gKiAgICAgICAgIH1gO1xuICpcbiAqICAgICAgICAgY29uc3QgZnJhZ21lbnRTb3VyY2UgPSBgXG4gKiAgICAgICAgIHZvaWQgbWFpbigpIHtcbiAqICAgICAgICAgICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMS4wLCAwLjAsIDAuMCwgMS4wKTtcbiAqICAgICAgICAgfWA7XG4gKlxuICogICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUik7XG4gKiAgICAgICAgIGdsLnNoYWRlclNvdXJjZSh2ZXJ0ZXhTaGFkZXIsIHZlcnRleFNvdXJjZSk7XG4gKiAgICAgICAgIGdsLmNvbXBpbGVTaGFkZXIodmVydGV4U2hhZGVyKTtcbiAqICAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSKTtcbiAqICAgICAgICAgZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNvdXJjZSk7XG4gKiAgICAgICAgIGdsLmNvbXBpbGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpO1xuICpcbiAqICAgICAgICAgdGhpcy5wcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuICogICAgICAgICBnbC5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpO1xuICogICAgICAgICBnbC5hdHRhY2hTaGFkZXIodGhpcy5wcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7XG4gKiAgICAgICAgIGdsLmxpbmtQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gKiAgICAgfVxuICpcbiAqICAgICByZW5kZXIoZ2wsIG1hdHJpeCkge1xuICogICAgICAgICBnbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gKiAgICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYoZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgXCJ1X21hdHJpeFwiKSwgZmFsc2UsIG1hdHJpeCk7XG4gKiAgICAgICAgIGdsLmRyYXdBcnJheXMoZ2wuUE9JTlRTLCAwLCAxKTtcbiAqICAgICB9XG4gKiB9XG4gKlxuICogbWFwLm9uKCdsb2FkJywgKCkgPT4ge1xuICogICAgIG1hcC5hZGRMYXllcihuZXcgTnVsbElzbGFuZExheWVyKCkpO1xuICogfSk7XG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSBjdXN0b20gc3R5bGUgbGF5ZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2N1c3RvbS1zdHlsZS1sYXllci8pXG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSAzRCBtb2RlbF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLTNkLW1vZGVsLylcbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgbGF5ZXIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIE1hcCB3aXRoIHtAbGluayBNYXAjYWRkTGF5ZXJ9LiBUaGlzXG4gKiBnaXZlcyB0aGUgbGF5ZXIgYSBjaGFuY2UgdG8gaW5pdGlhbGl6ZSBnbCByZXNvdXJjZXMgYW5kIHJlZ2lzdGVyIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBDdXN0b21MYXllckludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvbkFkZFxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY3VzdG9tIGxheWVyIHdhcyBqdXN0IGFkZGVkIHRvLlxuICogQHBhcmFtIHtXZWJHTFJlbmRlcmluZ0NvbnRleHR9IGdsIFRoZSBnbCBjb250ZXh0IGZvciB0aGUgbWFwLlxuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBsYXllciBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIE1hcCB3aXRoIHtAbGluayBNYXAjcmVtb3ZlTGF5ZXJ9LiBUaGlzXG4gKiBnaXZlcyB0aGUgbGF5ZXIgYSBjaGFuY2UgdG8gY2xlYW4gdXAgZ2wgcmVzb3VyY2VzIGFuZCBldmVudCBsaXN0ZW5lcnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgQ3VzdG9tTGF5ZXJJbnRlcmZhY2VcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgb25SZW1vdmVcbiAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcCB0aGlzIGN1c3RvbSBsYXllciB3YXMganVzdCBhZGRlZCB0by5cbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgZ2wgY29udGV4dCBmb3IgdGhlIG1hcC5cbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgZHVyaW5nIGEgcmVuZGVyIGZyYW1lIHRvIGFsbG93IGEgbGF5ZXIgdG8gcHJlcGFyZSByZXNvdXJjZXMgb3IgcmVuZGVyIGludG8gYSB0ZXh0dXJlLlxuICpcbiAqIFRoZSBsYXllciBjYW5ub3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGN1cnJlbnQgR0wgc3RhdGUgYW5kIG11c3QgYmluZCBhIGZyYW1lYnVmZmVyIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgQ3VzdG9tTGF5ZXJJbnRlcmZhY2VcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgcHJlcmVuZGVyXG4gKiBAcGFyYW0ge1dlYkdMUmVuZGVyaW5nQ29udGV4dH0gZ2wgVGhlIG1hcCdzIGdsIGNvbnRleHQuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IG1hdHJpeCBUaGUgbWFwJ3MgY2FtZXJhIG1hdHJpeC4gSXQgcHJvamVjdHMgc3BoZXJpY2FsIG1lcmNhdG9yXG4gKiBjb29yZGluYXRlcyB0byBnbCBjb29yZGluYXRlcy4gVGhlIG1lcmNhdG9yIGNvb3JkaW5hdGUgYFswLCAwXWAgcmVwcmVzZW50cyB0aGVcbiAqIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgbWVyY2F0b3Igd29ybGQgYW5kIGBbMSwgMV1gIHJlcHJlc2VudHMgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuIFdoZW5cbiAqIHRoZSBgcmVuZGVyaW5nTW9kZWAgaXMgYFwiM2RcImAsIHRoZSB6IGNvb3JkaW5hdGUgaXMgY29uZm9ybWFsLiBBIGJveCB3aXRoIGlkZW50aWNhbCB4LCB5LCBhbmQgelxuICogbGVuZ3RocyBpbiBtZXJjYXRvciB1bml0cyB3b3VsZCBiZSByZW5kZXJlZCBhcyBhIGN1YmUuIHtAbGluayBNZXJjYXRvckNvb3JkaW5hdGV9LmZyb21MbmdMYXRcbiAqIGNhbiBiZSB1c2VkIHRvIHByb2plY3QgYSBgTG5nTGF0YCB0byBhIG1lcmNhdG9yIGNvb3JkaW5hdGUuXG4gKi9cblxuLyoqXG4gKiBDYWxsZWQgZHVyaW5nIGEgcmVuZGVyIGZyYW1lIGFsbG93aW5nIHRoZSBsYXllciB0byBkcmF3IGludG8gdGhlIEdMIGNvbnRleHQuXG4gKlxuICogVGhlIGxheWVyIGNhbiBhc3N1bWUgYmxlbmRpbmcgYW5kIGRlcHRoIHN0YXRlIGlzIHNldCB0byBhbGxvdyB0aGUgbGF5ZXIgdG8gcHJvcGVybHlcbiAqIGJsZW5kIGFuZCBjbGlwIG90aGVyIGxheWVycy4gVGhlIGxheWVyIGNhbm5vdCBtYWtlIGFueSBvdGhlciBhc3N1bXB0aW9ucyBhYm91dCB0aGVcbiAqIGN1cnJlbnQgR0wgc3RhdGUuXG4gKlxuICogSWYgdGhlIGxheWVyIG5lZWRzIHRvIHJlbmRlciB0byBhIHRleHR1cmUsIGl0IHNob3VsZCBpbXBsZW1lbnQgdGhlIGBwcmVyZW5kZXJgIG1ldGhvZFxuICogdG8gZG8gdGhpcyBhbmQgb25seSB1c2UgdGhlIGByZW5kZXJgIG1ldGhvZCBmb3IgZHJhd2luZyBkaXJlY3RseSBpbnRvIHRoZSBtYWluIGZyYW1lYnVmZmVyLlxuICpcbiAqIFRoZSBibGVuZCBmdW5jdGlvbiBpcyBzZXQgdG8gYGdsLmJsZW5kRnVuYyhnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpYC4gVGhpcyBleHBlY3RzXG4gKiBjb2xvcnMgdG8gYmUgcHJvdmlkZWQgaW4gcHJlbXVsdGlwbGllZCBhbHBoYSBmb3JtIHdoZXJlIHRoZSBgcmAsIGBnYCBhbmQgYGJgIHZhbHVlcyBhcmUgYWxyZWFkeVxuICogbXVsdGlwbGllZCBieSB0aGUgYGFgIHZhbHVlLiBJZiB5b3UgYXJlIHVuYWJsZSB0byBwcm92aWRlIGNvbG9ycyBpbiBwcmVtdWx0aXBsaWVkIGZvcm0geW91XG4gKiBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIGJsZW5kIGZ1bmN0aW9uIHRvXG4gKiBgZ2wuYmxlbmRGdW5jU2VwYXJhdGUoZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEpYC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBDdXN0b21MYXllckludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSByZW5kZXJcbiAqIEBwYXJhbSB7V2ViR0xSZW5kZXJpbmdDb250ZXh0fSBnbCBUaGUgbWFwJ3MgZ2wgY29udGV4dC5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gbWF0cml4IFRoZSBtYXAncyBjYW1lcmEgbWF0cml4LiBJdCBwcm9qZWN0cyBzcGhlcmljYWwgbWVyY2F0b3JcbiAqIGNvb3JkaW5hdGVzIHRvIGdsIGNvb3JkaW5hdGVzLiBUaGUgc3BoZXJpY2FsIG1lcmNhdG9yIGNvb3JkaW5hdGUgYFswLCAwXWAgcmVwcmVzZW50cyB0aGVcbiAqIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgbWVyY2F0b3Igd29ybGQgYW5kIGBbMSwgMV1gIHJlcHJlc2VudHMgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIuIFdoZW5cbiAqIHRoZSBgcmVuZGVyaW5nTW9kZWAgaXMgYFwiM2RcImAsIHRoZSB6IGNvb3JkaW5hdGUgaXMgY29uZm9ybWFsLiBBIGJveCB3aXRoIGlkZW50aWNhbCB4LCB5LCBhbmQgelxuICogbGVuZ3RocyBpbiBtZXJjYXRvciB1bml0cyB3b3VsZCBiZSByZW5kZXJlZCBhcyBhIGN1YmUuIHtAbGluayBNZXJjYXRvckNvb3JkaW5hdGV9LmZyb21MbmdMYXRcbiAqIGNhbiBiZSB1c2VkIHRvIHByb2plY3QgYSBgTG5nTGF0YCB0byBhIG1lcmNhdG9yIGNvb3JkaW5hdGUuXG4gKi9cbmV4cG9ydCB0eXBlIEN1c3RvbUxheWVySW50ZXJmYWNlID0ge1xuICAgIGlkOiBzdHJpbmcsXG4gICAgdHlwZTogXCJjdXN0b21cIixcbiAgICByZW5kZXJpbmdNb2RlOiBcIjJkXCIgfCBcIjNkXCIsXG4gICAgcmVuZGVyOiBDdXN0b21SZW5kZXJNZXRob2QsXG4gICAgcHJlcmVuZGVyOiA/Q3VzdG9tUmVuZGVyTWV0aG9kLFxuICAgIG9uQWRkOiA/KG1hcDogTWFwLCBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSA9PiB2b2lkLFxuICAgIG9uUmVtb3ZlOiA/KG1hcDogTWFwLCBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUN1c3RvbVN0eWxlTGF5ZXIobGF5ZXJPYmplY3Q6IEN1c3RvbUxheWVySW50ZXJmYWNlKTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgY29uc3QgZXJyb3JzID0gW107XG4gICAgY29uc3QgaWQgPSBsYXllck9iamVjdC5pZDtcblxuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBsYXllcnMuJHtpZH06IG1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgXCJpZFwiYFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXJPYmplY3QucmVuZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgbWVzc2FnZTogYGxheWVycy4ke2lkfTogbWlzc2luZyByZXF1aXJlZCBtZXRob2QgXCJyZW5kZXJcImBcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGxheWVyT2JqZWN0LnJlbmRlcmluZ01vZGUgJiZcbiAgICAgICAgbGF5ZXJPYmplY3QucmVuZGVyaW5nTW9kZSAhPT0gJzJkJyAmJlxuICAgICAgICBsYXllck9iamVjdC5yZW5kZXJpbmdNb2RlICE9PSAnM2QnKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBsYXllcnMuJHtpZH06IHByb3BlcnR5IFwicmVuZGVyaW5nTW9kZVwiIG11c3QgYmUgZWl0aGVyIFwiMmRcIiBvciBcIjNkXCJgXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59XG5cbmNsYXNzIEN1c3RvbVN0eWxlTGF5ZXIgZXh0ZW5kcyBTdHlsZUxheWVyIHtcblxuICAgIGltcGxlbWVudGF0aW9uOiBDdXN0b21MYXllckludGVyZmFjZTtcblxuICAgIGNvbnN0cnVjdG9yKGltcGxlbWVudGF0aW9uOiBDdXN0b21MYXllckludGVyZmFjZSkge1xuICAgICAgICBzdXBlcihpbXBsZW1lbnRhdGlvbiwge30pO1xuICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uID0gaW1wbGVtZW50YXRpb247XG4gICAgfVxuXG4gICAgaXMzRCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1wbGVtZW50YXRpb24ucmVuZGVyaW5nTW9kZSA9PT0gJzNkJztcbiAgICB9XG5cbiAgICBoYXNPZmZzY3JlZW5QYXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbXBsZW1lbnRhdGlvbi5wcmVyZW5kZXIgIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZSgpIHt9XG4gICAgdXBkYXRlVHJhbnNpdGlvbnMoKSB7fVxuICAgIGhhc1RyYW5zaXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1leHRlbmRdIC0gQ3VzdG9tU3R5bGVMYXllciBpcyBub3Qgc2VyaWFsaXphYmxlXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBhc3NlcnQoZmFsc2UsIFwiQ3VzdG9tIGxheWVycyBjYW5ub3QgYmUgc2VyaWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICBpZiAodGhpcy5pbXBsZW1lbnRhdGlvbi5vbkFkZCkge1xuICAgICAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvbi5vbkFkZChtYXAsIG1hcC5wYWludGVyLmNvbnRleHQuZ2wpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25SZW1vdmUobWFwOiBNYXApIHtcbiAgICAgICAgaWYgKHRoaXMuaW1wbGVtZW50YXRpb24ub25SZW1vdmUpIHtcbiAgICAgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb24ub25SZW1vdmUobWFwLCBtYXAucGFpbnRlci5jb250ZXh0LmdsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ3VzdG9tU3R5bGVMYXllcjtcbiIsIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQuIEVkaXQgYnVpbGQvZ2VuZXJhdGUtc3R5bGUtY29kZS5qcywgdGhlbiBydW4gYHlhcm4gcnVuIGNvZGVnZW5gLlxuLy8gQGZsb3dcbi8qIGVzbGludC1kaXNhYmxlICovXG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcblxuaW1wb3J0IHtcbiAgICBQcm9wZXJ0aWVzLFxuICAgIERhdGFDb25zdGFudFByb3BlcnR5LFxuICAgIERhdGFEcml2ZW5Qcm9wZXJ0eSxcbiAgICBDcm9zc0ZhZGVkRGF0YURyaXZlblByb3BlcnR5LFxuICAgIENyb3NzRmFkZWRQcm9wZXJ0eSxcbiAgICBDb2xvclJhbXBQcm9wZXJ0eVxufSBmcm9tICcuLi9wcm9wZXJ0aWVzLmpzJztcblxuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcblxuaW1wb3J0IHR5cGUgRm9ybWF0dGVkIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9mb3JtYXR0ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cblxuZXhwb3J0IHR5cGUgUGFpbnRQcm9wcyA9IHt8XG4gICAgXCJza3ktdHlwZVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxcImdyYWRpZW50XCIgfCBcImF0bW9zcGhlcmVcIj4sXG4gICAgXCJza3ktYXRtb3NwaGVyZS1zdW5cIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJza3ktYXRtb3NwaGVyZS1zdW4taW50ZW5zaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG4gICAgXCJza3ktZ3JhZGllbnQtY2VudGVyXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIFwic2t5LWdyYWRpZW50LXJhZGl1c1wiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxuICAgIFwic2t5LWdyYWRpZW50XCI6IENvbG9yUmFtcFByb3BlcnR5LFxuICAgIFwic2t5LWF0bW9zcGhlcmUtaGFsby1jb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJza3ktYXRtb3NwaGVyZS1jb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJza3ktb3BhY2l0eVwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxudW1iZXI+LFxufH07XG5cbmNvbnN0IHBhaW50OiBQcm9wZXJ0aWVzPFBhaW50UHJvcHM+ID0gbmV3IFByb3BlcnRpZXMoe1xuICAgIFwic2t5LXR5cGVcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3NreVwiXVtcInNreS10eXBlXCJdKSxcbiAgICBcInNreS1hdG1vc3BoZXJlLXN1blwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc2t5XCJdW1wic2t5LWF0bW9zcGhlcmUtc3VuXCJdKSxcbiAgICBcInNreS1hdG1vc3BoZXJlLXN1bi1pbnRlbnNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3NreVwiXVtcInNreS1hdG1vc3BoZXJlLXN1bi1pbnRlbnNpdHlcIl0pLFxuICAgIFwic2t5LWdyYWRpZW50LWNlbnRlclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc2t5XCJdW1wic2t5LWdyYWRpZW50LWNlbnRlclwiXSksXG4gICAgXCJza3ktZ3JhZGllbnQtcmFkaXVzXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9za3lcIl1bXCJza3ktZ3JhZGllbnQtcmFkaXVzXCJdKSxcbiAgICBcInNreS1ncmFkaWVudFwiOiBuZXcgQ29sb3JSYW1wUHJvcGVydHkoc3R5bGVTcGVjW1wicGFpbnRfc2t5XCJdW1wic2t5LWdyYWRpZW50XCJdKSxcbiAgICBcInNreS1hdG1vc3BoZXJlLWhhbG8tY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3NreVwiXVtcInNreS1hdG1vc3BoZXJlLWhhbG8tY29sb3JcIl0pLFxuICAgIFwic2t5LWF0bW9zcGhlcmUtY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlY1tcInBhaW50X3NreVwiXVtcInNreS1hdG1vc3BoZXJlLWNvbG9yXCJdKSxcbiAgICBcInNreS1vcGFjaXR5XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWNbXCJwYWludF9za3lcIl1bXCJza3ktb3BhY2l0eVwiXSksXG59KTtcblxuLy8gTm90ZTogd2l0aG91dCBhZGRpbmcgdGhlIGV4cGxpY2l0IHR5cGUgYW5ub3RhdGlvbiwgRmxvdyBpbmZlcnMgd2Vha2VyIHR5cGVzXG4vLyBmb3IgdGhlc2Ugb2JqZWN0cyBmcm9tIHRoZWlyIHVzZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gU3R5bGVMYXllciwgYXNcbi8vIHtsYXlvdXQ/OiBQcm9wZXJ0aWVzPC4uLj4sIHBhaW50OiBQcm9wZXJ0aWVzPC4uLj59XG5leHBvcnQgZGVmYXVsdCAoeyBwYWludCB9OiAkRXhhY3Q8e1xuICBwYWludDogUHJvcGVydGllczxQYWludFByb3BzPlxufT4pO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAnLi9za3lfc3R5bGVfbGF5ZXJfcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge1RyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZH0gZnJvbSAnLi4vcHJvcGVydGllcy5qcyc7XG5pbXBvcnQge3JlbmRlckNvbG9yUmFtcH0gZnJvbSAnLi4vLi4vdXRpbC9jb2xvcl9yYW1wLmpzJztcbmltcG9ydCB0eXBlIHtQYWludFByb3BzfSBmcm9tICcuL3NreV9zdHlsZV9sYXllcl9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIFRleHR1cmUgZnJvbSAnLi4vLi4vcmVuZGVyL3RleHR1cmUuanMnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi8uLi9yZW5kZXIvcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi8uLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIEZyYW1lYnVmZmVyIGZyb20gJy4uLy4uL2dsL2ZyYW1lYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHtSR0JBSW1hZ2V9IGZyb20gJy4uLy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHR5cGUgU2t5Ym94R2VvbWV0cnkgZnJvbSAnLi4vLi4vcmVuZGVyL3NreWJveF9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgdHlwZSB7TGlnaHRQb3NpdGlvbn0gZnJvbSAnLi4vbGlnaHQuanMnO1xuaW1wb3J0IHt3YXJuT25jZSwgZGVnVG9SYWR9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge3ZlYzMsIHF1YXR9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmZ1bmN0aW9uIGdldENlbGVzdGlhbERpcmVjdGlvbihhemltdXRoOiBudW1iZXIsIGFsdGl0dWRlOiBudW1iZXIsIGxlZnRIYW5kZWQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB1cCA9IFswLCAwLCAxXTtcbiAgICBjb25zdCByb3RhdGlvbiA9IHF1YXQuaWRlbnRpdHkoW10pO1xuXG4gICAgcXVhdC5yb3RhdGVZKHJvdGF0aW9uLCByb3RhdGlvbiwgbGVmdEhhbmRlZCA/IC1kZWdUb1JhZChhemltdXRoKSArIE1hdGguUEkgOiBkZWdUb1JhZChhemltdXRoKSk7XG4gICAgcXVhdC5yb3RhdGVYKHJvdGF0aW9uLCByb3RhdGlvbiwgLWRlZ1RvUmFkKGFsdGl0dWRlKSk7XG4gICAgdmVjMy50cmFuc2Zvcm1RdWF0KHVwLCB1cCwgcm90YXRpb24pO1xuXG4gICAgcmV0dXJuIHZlYzMubm9ybWFsaXplKHVwLCB1cCk7XG59XG5cbmNsYXNzIFNreUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgX3RyYW5zaXRpb25hYmxlUGFpbnQ6IFRyYW5zaXRpb25hYmxlPFBhaW50UHJvcHM+O1xuICAgIF90cmFuc2l0aW9uaW5nUGFpbnQ6IFRyYW5zaXRpb25pbmc8UGFpbnRQcm9wcz47XG4gICAgcGFpbnQ6IFBvc3NpYmx5RXZhbHVhdGVkPFBhaW50UHJvcHM+O1xuICAgIF9saWdodFBvc2l0aW9uOiBMaWdodFBvc2l0aW9uO1xuXG4gICAgc2t5Ym94RmJvOiA/RnJhbWVidWZmZXI7XG4gICAgc2t5Ym94VGV4dHVyZTogP1dlYkdMVGV4dHVyZTtcbiAgICBfc2t5Ym94SW52YWxpZGF0ZWQ6ID9ib29sZWFuO1xuXG4gICAgY29sb3JSYW1wOiBSR0JBSW1hZ2U7XG4gICAgY29sb3JSYW1wVGV4dHVyZTogP1RleHR1cmU7XG5cbiAgICBza3lib3hHZW9tZXRyeTogU2t5Ym94R2VvbWV0cnk7XG5cbiAgICBjb25zdHJ1Y3RvcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGxheWVyLCBwcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29sb3JSYW1wKCk7XG4gICAgfVxuXG4gICAgX2hhbmRsZVNwZWNpYWxQYWludFByb3BlcnR5VXBkYXRlKG5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ3NreS1ncmFkaWVudCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbG9yUmFtcCgpO1xuICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdza3ktYXRtb3NwaGVyZS1zdW4nIHx8XG4gICAgICAgICAgICAgICAgICAgbmFtZSA9PT0gJ3NreS1hdG1vc3BoZXJlLWhhbG8tY29sb3InIHx8XG4gICAgICAgICAgICAgICAgICAgbmFtZSA9PT0gJ3NreS1hdG1vc3BoZXJlLWNvbG9yJyB8fFxuICAgICAgICAgICAgICAgICAgIG5hbWUgPT09ICdza3ktYXRtb3NwaGVyZS1zdW4taW50ZW5zaXR5Jykge1xuICAgICAgICAgICAgdGhpcy5fc2t5Ym94SW52YWxpZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZUNvbG9yUmFtcCgpIHtcbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuX3RyYW5zaXRpb25hYmxlUGFpbnQuX3ZhbHVlc1snc2t5LWdyYWRpZW50J10udmFsdWUuZXhwcmVzc2lvbjtcbiAgICAgICAgdGhpcy5jb2xvclJhbXAgPSByZW5kZXJDb2xvclJhbXAoe1xuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIGV2YWx1YXRpb25LZXk6ICdza3lSYWRpYWxQcm9ncmVzcydcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmNvbG9yUmFtcFRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuY29sb3JSYW1wVGV4dHVyZS5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLmNvbG9yUmFtcFRleHR1cmUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmVlZHNTa3lib3hDYXB0dXJlKHBhaW50ZXI6IFBhaW50ZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCEhdGhpcy5fc2t5Ym94SW52YWxpZGF0ZWQgfHwgIXRoaXMuc2t5Ym94VGV4dHVyZSB8fCAhdGhpcy5za3lib3hHZW9tZXRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnBhaW50LmdldCgnc2t5LWF0bW9zcGhlcmUtc3VuJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpZ2h0UG9zaXRpb24gPSBwYWludGVyLnN0eWxlLmxpZ2h0LnByb3BlcnRpZXMuZ2V0KCdwb3NpdGlvbicpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpZ2h0UG9zaXRpb24uYXppbXV0aGFsICE9PSBsaWdodFBvc2l0aW9uLmF6aW11dGhhbCB8fFxuICAgICAgICAgICAgICAgICAgIHRoaXMuX2xpZ2h0UG9zaXRpb24ucG9sYXIgIT09IGxpZ2h0UG9zaXRpb24ucG9sYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGdldENlbnRlcihwYWludGVyOiBQYWludGVyLCBsZWZ0SGFuZGVkOiBib29sZWFuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMucGFpbnQuZ2V0KCdza3ktdHlwZScpO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2F0bW9zcGhlcmUnKSB7XG4gICAgICAgICAgICBjb25zdCBzdW5Qb3NpdGlvbiA9IHRoaXMucGFpbnQuZ2V0KCdza3ktYXRtb3NwaGVyZS1zdW4nKTtcbiAgICAgICAgICAgIGNvbnN0IHVzZUxpZ2h0UG9zaXRpb24gPSAhc3VuUG9zaXRpb247XG4gICAgICAgICAgICBjb25zdCBsaWdodCA9IHBhaW50ZXIuc3R5bGUubGlnaHQ7XG4gICAgICAgICAgICBjb25zdCBsaWdodFBvc2l0aW9uID0gbGlnaHQucHJvcGVydGllcy5nZXQoJ3Bvc2l0aW9uJyk7XG5cbiAgICAgICAgICAgIGlmICh1c2VMaWdodFBvc2l0aW9uICYmIGxpZ2h0LnByb3BlcnRpZXMuZ2V0KCdhbmNob3InKSA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKCdUaGUgc3VuIGRpcmVjdGlvbiBpcyBhdHRhY2hlZCB0byBhIGxpZ2h0IHdpdGggdmlld3BvcnQgYW5jaG9yLCBsaWdodGluZyBtYXkgYmVoYXZlIHVuZXhwZWN0ZWRseS4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVzZUxpZ2h0UG9zaXRpb24gP1xuICAgICAgICAgICAgICAgIGdldENlbGVzdGlhbERpcmVjdGlvbihsaWdodFBvc2l0aW9uLmF6aW11dGhhbCwgLWxpZ2h0UG9zaXRpb24ucG9sYXIgKyA5MCwgbGVmdEhhbmRlZCkgOlxuICAgICAgICAgICAgICAgIGdldENlbGVzdGlhbERpcmVjdGlvbihzdW5Qb3NpdGlvblswXSwgLXN1blBvc2l0aW9uWzFdICsgOTAsIGxlZnRIYW5kZWQpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydCh0eXBlID09PSAnZ3JhZGllbnQnKTtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5wYWludC5nZXQoJ3NreS1ncmFkaWVudC1jZW50ZXInKTtcbiAgICAgICAgcmV0dXJuIGdldENlbGVzdGlhbERpcmVjdGlvbihkaXJlY3Rpb25bMF0sIC1kaXJlY3Rpb25bMV0gKyA5MCwgbGVmdEhhbmRlZCk7XG4gICAgfVxuXG4gICAgaXMzRCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzU2t5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBtYXJrU2t5Ym94VmFsaWQocGFpbnRlcjogUGFpbnRlcikge1xuICAgICAgICB0aGlzLl9za3lib3hJbnZhbGlkYXRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9saWdodFBvc2l0aW9uID0gcGFpbnRlci5zdHlsZS5saWdodC5wcm9wZXJ0aWVzLmdldCgncG9zaXRpb24nKTtcbiAgICB9XG5cbiAgICBoYXNPZmZzY3JlZW5QYXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXRQcm9ncmFtSWRzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLnBhaW50LmdldCgnc2t5LXR5cGUnKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdhdG1vc3BoZXJlJykge1xuICAgICAgICAgICAgcmV0dXJuIFsnc2t5Ym94Q2FwdHVyZScsICdza3lib3gnXTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZ3JhZGllbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gWydza3lib3hHcmFkaWVudCddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2t5TGF5ZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4vc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IGNpcmNsZSBmcm9tICcuL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgaGVhdG1hcCBmcm9tICcuL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IGhpbGxzaGFkZSBmcm9tICcuL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgZmlsbCBmcm9tICcuL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IGZpbGxFeHRydXNpb24gZnJvbSAnLi9zdHlsZV9sYXllci9maWxsX2V4dHJ1c2lvbl9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgbGluZSBmcm9tICcuL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHN5bWJvbCBmcm9tICcuL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgYmFja2dyb3VuZCBmcm9tICcuL3N0eWxlX2xheWVyL2JhY2tncm91bmRfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHJhc3RlciBmcm9tICcuL3N0eWxlX2xheWVyL3Jhc3Rlcl9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgQ3VzdG9tU3R5bGVMYXllciBmcm9tICcuL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgc2t5IGZyb20gJy4vc3R5bGVfbGF5ZXIvc2t5X3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIHtDdXN0b21MYXllckludGVyZmFjZX0gZnJvbSAnLi9zdHlsZV9sYXllci9jdXN0b21fc3R5bGVfbGF5ZXIuanMnO1xuXG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcblxuY29uc3Qgc3ViY2xhc3NlcyA9IHtcbiAgICBjaXJjbGUsXG4gICAgaGVhdG1hcCxcbiAgICBoaWxsc2hhZGUsXG4gICAgZmlsbCxcbiAgICAnZmlsbC1leHRydXNpb24nOiBmaWxsRXh0cnVzaW9uLFxuICAgIGxpbmUsXG4gICAgc3ltYm9sLFxuICAgIGJhY2tncm91bmQsXG4gICAgcmFzdGVyLFxuICAgIHNreVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlU3R5bGVMYXllcihsYXllcjogTGF5ZXJTcGVjaWZpY2F0aW9uIHwgQ3VzdG9tTGF5ZXJJbnRlcmZhY2UpOiBTdHlsZUxheWVyIHwgQ3VzdG9tU3R5bGVMYXllciB7XG4gICAgaWYgKGxheWVyLnR5cGUgPT09ICdjdXN0b20nKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3VzdG9tU3R5bGVMYXllcihsYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBzdWJjbGFzc2VzW2xheWVyLnR5cGVdKGxheWVyKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtSR0JBSW1hZ2UsIEFscGhhSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuXG5leHBvcnQgdHlwZSBUZXh0dXJlRm9ybWF0ID1cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnUkdCQSc+XG4gICAgfCAkUHJvcGVydHlUeXBlPFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgJ0FMUEhBJz47XG5leHBvcnQgdHlwZSBUZXh0dXJlRmlsdGVyID1cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTElORUFSJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTElORUFSX01JUE1BUF9ORUFSRVNUJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTkVBUkVTVCc+O1xuZXhwb3J0IHR5cGUgVGV4dHVyZVdyYXAgPVxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdSRVBFQVQnPlxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdDTEFNUF9UT19FREdFJz5cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTUlSUk9SRURfUkVQRUFUJz47XG5cbnR5cGUgRW1wdHlJbWFnZSA9IHtcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICAgIGRhdGE6IG51bGxcbn1cblxuZXhwb3J0IHR5cGUgVGV4dHVyZUltYWdlID1cbiAgICB8IFJHQkFJbWFnZVxuICAgIHwgQWxwaGFJbWFnZVxuICAgIHwgSFRNTEltYWdlRWxlbWVudFxuICAgIHwgSFRNTENhbnZhc0VsZW1lbnRcbiAgICB8IEhUTUxWaWRlb0VsZW1lbnRcbiAgICB8IEltYWdlRGF0YVxuICAgIHwgRW1wdHlJbWFnZVxuICAgIHwgSW1hZ2VCaXRtYXA7XG5cbmNsYXNzIFRleHR1cmUge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgc2l6ZTogW251bWJlciwgbnVtYmVyXTtcbiAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmU7XG4gICAgZm9ybWF0OiBUZXh0dXJlRm9ybWF0O1xuICAgIGZpbHRlcjogP1RleHR1cmVGaWx0ZXI7XG4gICAgd3JhcDogP1RleHR1cmVXcmFwO1xuICAgIHVzZU1pcG1hcDogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGltYWdlOiBUZXh0dXJlSW1hZ2UsIGZvcm1hdDogVGV4dHVyZUZvcm1hdCwgb3B0aW9uczogP3sgcHJlbXVsdGlwbHk/OiBib29sZWFuLCB1c2VNaXBtYXA/OiBib29sZWFuIH0pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGNvbnRleHQuZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICB0aGlzLnVwZGF0ZShpbWFnZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdXBkYXRlKGltYWdlOiBUZXh0dXJlSW1hZ2UsIG9wdGlvbnM6ID97cHJlbXVsdGlwbHk/OiBib29sZWFuLCB1c2VNaXBtYXA/OiBib29sZWFufSwgcG9zaXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0pIHtcbiAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gaW1hZ2U7XG4gICAgICAgIGNvbnN0IHtjb250ZXh0fSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHtnbH0gPSBjb250ZXh0O1xuICAgICAgICBjb25zdCB7SFRNTEltYWdlRWxlbWVudCwgSFRNTENhbnZhc0VsZW1lbnQsIEhUTUxWaWRlb0VsZW1lbnQsIEltYWdlRGF0YSwgSW1hZ2VCaXRtYXB9ID0gd2luZG93O1xuXG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG5cbiAgICAgICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrRmxpcFkuc2V0KGZhbHNlKTtcbiAgICAgICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrLnNldCgxKTtcbiAgICAgICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXQodGhpcy5mb3JtYXQgPT09IGdsLlJHQkEgJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMucHJlbXVsdGlwbHkgIT09IGZhbHNlKSk7XG5cbiAgICAgICAgaWYgKCFwb3NpdGlvbiAmJiAoIXRoaXMuc2l6ZSB8fCB0aGlzLnNpemVbMF0gIT09IHdpZHRoIHx8IHRoaXMuc2l6ZVsxXSAhPT0gaGVpZ2h0KSkge1xuICAgICAgICAgICAgdGhpcy5zaXplID0gW3dpZHRoLCBoZWlnaHRdO1xuXG4gICAgICAgICAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSW1hZ2VEYXRhIHx8IChJbWFnZUJpdG1hcCAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwKSkge1xuICAgICAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5mb3JtYXQsIHRoaXMuZm9ybWF0LCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgcHJvcC1taXNzaW5nIC0gRmxvdyBjYW4ndCByZWZpbmUgaW1hZ2UgdHlwZSBoZXJlXG4gICAgICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCB0aGlzLmZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwgdGhpcy5mb3JtYXQsIGdsLlVOU0lHTkVEX0JZVEUsIGltYWdlLmRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7eCwgeX0gPSBwb3NpdGlvbiB8fCB7eDogMCwgeTogMH07XG4gICAgICAgICAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSW1hZ2VEYXRhIHx8IChJbWFnZUJpdG1hcCAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwKSkge1xuICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgeCwgeSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgaW1hZ2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIHByb3AtbWlzc2luZyAtIEZsb3cgY2FuJ3QgcmVmaW5lIGltYWdlIHR5cGUgaGVyZVxuICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgaW1hZ2UuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVzZU1pcG1hcCA9IEJvb2xlYW4ob3B0aW9ucyAmJiBvcHRpb25zLnVzZU1pcG1hcCAmJiB0aGlzLmlzU2l6ZVBvd2VyT2ZUd28oKSk7XG4gICAgICAgIGlmICh0aGlzLnVzZU1pcG1hcCkge1xuICAgICAgICAgICAgZ2wuZ2VuZXJhdGVNaXBtYXAoZ2wuVEVYVFVSRV8yRCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKGZpbHRlcjogVGV4dHVyZUZpbHRlciwgd3JhcDogVGV4dHVyZVdyYXApIHtcbiAgICAgICAgY29uc3Qge2NvbnRleHR9ID0gdGhpcztcbiAgICAgICAgY29uc3Qge2dsfSA9IGNvbnRleHQ7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG5cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdGhpcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBmaWx0ZXIpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsXG4gICAgICAgICAgICAgICAgdGhpcy51c2VNaXBtYXAgPyAoZmlsdGVyID09PSBnbC5ORUFSRVNUID8gZ2wuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCA6IGdsLkxJTkVBUl9NSVBNQVBfTkVBUkVTVCkgOiBmaWx0ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3cmFwICE9PSB0aGlzLndyYXApIHtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIHdyYXApO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgd3JhcCk7XG4gICAgICAgICAgICB0aGlzLndyYXAgPSB3cmFwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNTaXplUG93ZXJPZlR3bygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZVswXSA9PT0gdGhpcy5zaXplWzFdICYmIChNYXRoLmxvZyh0aGlzLnNpemVbMF0pIC8gTWF0aC5MTjIpICUgMSA9PT0gMDtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBjb25zdCB7Z2x9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBnbC5kZWxldGVUZXh0dXJlKHRoaXMudGV4dHVyZSk7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IChudWxsOiBhbnkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGV4dHVyZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7d2Fybk9uY2UsIG5leHRQb3dlck9mVHdvfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtBbHBoYUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlLmpzJztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5cbmltcG9ydCB0eXBlIHtTcHJpdGVQb3NpdGlvbiwgU3ByaXRlUG9zaXRpb25zfSBmcm9tICcuLi91dGlsL2ltYWdlLmpzJztcblxudHlwZSBEYXNoUmFuZ2UgPSB7fFxuICAgIGlzRGFzaDogYm9vbGVhbixcbiAgICBsZWZ0OiBudW1iZXIsXG4gICAgcmlnaHQ6IG51bWJlcixcbiAgICB6ZXJvTGVuZ3RoOiBib29sZWFuXG58fTtcblxuLyoqXG4gKiBBIExpbmVBdGxhcyBsZXRzIHVzIHJldXNlIHJlbmRlcmVkIGRhc2hlZCBsaW5lc1xuICogYnkgd3JpdGluZyBtYW55IG9mIHRoZW0gdG8gYSB0ZXh0dXJlIGFuZCB0aGVuIGZldGNoaW5nIHRoZWlyIHBvc2l0aW9uc1xuICogdXNpbmcgLmdldERhc2guXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcGFyYW0ge251bWJlcn0gaGVpZ2h0XG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBMaW5lQXRsYXMge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gICAgbmV4dFJvdzogbnVtYmVyO1xuICAgIGltYWdlOiBBbHBoYUltYWdlO1xuICAgIHBvc2l0aW9uczogU3ByaXRlUG9zaXRpb25zO1xuICAgIHVwbG9hZGVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgdGhpcy5uZXh0Um93ID0gMDtcbiAgICAgICAgdGhpcy5pbWFnZSA9IG5ldyBBbHBoYUltYWdlKHt3aWR0aCwgaGVpZ2h0fSk7XG4gICAgICAgIHRoaXMucG9zaXRpb25zID0ge307XG4gICAgICAgIHRoaXMudXBsb2FkZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBkYXNoIGxpbmUgcGF0dGVybi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gZGFzaGFycmF5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmVDYXAgdGhlIHR5cGUgb2YgbGluZSBjYXBzIHRvIGJlIGFkZGVkIHRvIGRhc2hlc1xuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHBvc2l0aW9uIG9mIGRhc2ggdGV4dHVyZSBpbiB7IHksIGhlaWdodCwgd2lkdGggfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0RGFzaChkYXNoYXJyYXk6IEFycmF5PG51bWJlcj4sIGxpbmVDYXA6IHN0cmluZyk6IFNwcml0ZVBvc2l0aW9uIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkoZGFzaGFycmF5LCBsaW5lQ2FwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb25zW2tleV07XG4gICAgfVxuXG4gICAgdHJpbSgpIHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodCA9IG5leHRQb3dlck9mVHdvKHRoaXMubmV4dFJvdyk7XG4gICAgICAgIHRoaXMuaW1hZ2UucmVzaXplKHt3aWR0aCwgaGVpZ2h0fSk7XG4gICAgfVxuXG4gICAgZ2V0S2V5KGRhc2hhcnJheTogQXJyYXk8bnVtYmVyPiwgbGluZUNhcDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGRhc2hhcnJheS5qb2luKCcsJykgKyBsaW5lQ2FwO1xuICAgIH1cblxuICAgIGdldERhc2hSYW5nZXMoZGFzaGFycmF5OiBBcnJheTxudW1iZXI+LCBsaW5lQXRsYXNXaWR0aDogbnVtYmVyLCBzdHJldGNoOiBudW1iZXIpOiBBcnJheTxEYXNoUmFuZ2U+IHtcbiAgICAgICAgLy8gSWYgZGFzaGFycmF5IGhhcyBhbiBvZGQgbGVuZ3RoLCBib3RoIHRoZSBmaXJzdCBhbmQgbGFzdCBwYXJ0c1xuICAgICAgICAvLyBhcmUgZGFzaGVzIGFuZCBzaG91bGQgYmUgam9pbmVkIHNlYW1sZXNzbHkuXG4gICAgICAgIGNvbnN0IG9kZERhc2hBcnJheSA9IGRhc2hhcnJheS5sZW5ndGggJSAyID09PSAxO1xuXG4gICAgICAgIGNvbnN0IHJhbmdlcyA9IFtdO1xuXG4gICAgICAgIGxldCBsZWZ0ID0gb2RkRGFzaEFycmF5ID8gLWRhc2hhcnJheVtkYXNoYXJyYXkubGVuZ3RoIC0gMV0gKiBzdHJldGNoIDogMDtcbiAgICAgICAgbGV0IHJpZ2h0ID0gZGFzaGFycmF5WzBdICogc3RyZXRjaDtcbiAgICAgICAgbGV0IGlzRGFzaCA9IHRydWU7XG5cbiAgICAgICAgcmFuZ2VzLnB1c2goe2xlZnQsIHJpZ2h0LCBpc0Rhc2gsIHplcm9MZW5ndGg6IGRhc2hhcnJheVswXSA9PT0gMH0pO1xuXG4gICAgICAgIGxldCBjdXJyZW50RGFzaExlbmd0aCA9IGRhc2hhcnJheVswXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBkYXNoYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlzRGFzaCA9ICFpc0Rhc2g7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhc2hMZW5ndGggPSBkYXNoYXJyYXlbaV07XG4gICAgICAgICAgICBsZWZ0ID0gY3VycmVudERhc2hMZW5ndGggKiBzdHJldGNoO1xuICAgICAgICAgICAgY3VycmVudERhc2hMZW5ndGggKz0gZGFzaExlbmd0aDtcbiAgICAgICAgICAgIHJpZ2h0ID0gY3VycmVudERhc2hMZW5ndGggKiBzdHJldGNoO1xuXG4gICAgICAgICAgICByYW5nZXMucHVzaCh7bGVmdCwgcmlnaHQsIGlzRGFzaCwgemVyb0xlbmd0aDogZGFzaExlbmd0aCA9PT0gMH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICB9XG5cbiAgICBhZGRSb3VuZERhc2gocmFuZ2VzOiBBcnJheTxEYXNoUmFuZ2U+LCBzdHJldGNoOiBudW1iZXIsIG46IG51bWJlcikge1xuICAgICAgICBjb25zdCBoYWxmU3RyZXRjaCA9IHN0cmV0Y2ggLyAyO1xuXG4gICAgICAgIGZvciAobGV0IHkgPSAtbjsgeSA8PSBuOyB5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRoaXMubmV4dFJvdyArIG4gKyB5O1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLndpZHRoICogcm93O1xuICAgICAgICAgICAgbGV0IGN1cnJJbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZXNbY3VyckluZGV4XTtcblxuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAoeCAvIHJhbmdlLnJpZ2h0ID4gMSkgeyByYW5nZSA9IHJhbmdlc1srK2N1cnJJbmRleF07IH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RMZWZ0ID0gTWF0aC5hYnMoeCAtIHJhbmdlLmxlZnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RSaWdodCA9IE1hdGguYWJzKHggLSByYW5nZS5yaWdodCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWluRGlzdCA9IE1hdGgubWluKGRpc3RMZWZ0LCBkaXN0UmlnaHQpO1xuICAgICAgICAgICAgICAgIGxldCBzaWduZWREaXN0YW5jZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RNaWRkbGUgPSAgeSAvIG4gKiAoaGFsZlN0cmV0Y2ggKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuaXNEYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RFZGdlID0gaGFsZlN0cmV0Y2ggLSBNYXRoLmFicyhkaXN0TWlkZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmVkRGlzdGFuY2UgPSBNYXRoLnNxcnQobWluRGlzdCAqIG1pbkRpc3QgKyBkaXN0RWRnZSAqIGRpc3RFZGdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzaWduZWREaXN0YW5jZSA9IGhhbGZTdHJldGNoIC0gTWF0aC5zcXJ0KG1pbkRpc3QgKiBtaW5EaXN0ICsgZGlzdE1pZGRsZSAqIGRpc3RNaWRkbGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2UuZGF0YVtpbmRleCArIHhdID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBzaWduZWREaXN0YW5jZSArIDEyOCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkUmVndWxhckRhc2gocmFuZ2VzOiBBcnJheTxEYXNoUmFuZ2U+LCBjYXBMZW5ndGg6IG51bWJlcikge1xuXG4gICAgICAgIC8vIENvbGxhcHNlIGFueSB6ZXJvLWxlbmd0aCByYW5nZVxuICAgICAgICAvLyBDb2xsYXBzZSBuZWlnaGJvdXJpbmcgc2FtZS10eXBlIHBhcnRzIGludG8gYSBzaW5nbGUgcGFydFxuICAgICAgICBmb3IgKGxldCBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IHJhbmdlc1tpICsgMV07XG4gICAgICAgICAgICBpZiAocGFydC56ZXJvTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCAmJiBuZXh0LmlzRGFzaCA9PT0gcGFydC5pc0Rhc2gpIHtcbiAgICAgICAgICAgICAgICBuZXh0LmxlZnQgPSBwYXJ0LmxlZnQ7XG4gICAgICAgICAgICAgICAgcmFuZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbWJpbmUgdGhlIGZpcnN0IGFuZCBsYXN0IHBhcnRzIGlmIHBvc3NpYmxlXG4gICAgICAgIGNvbnN0IGZpcnN0ID0gcmFuZ2VzWzBdO1xuICAgICAgICBjb25zdCBsYXN0ID0gcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGZpcnN0LmlzRGFzaCA9PT0gbGFzdC5pc0Rhc2gpIHtcbiAgICAgICAgICAgIGZpcnN0LmxlZnQgPSBsYXN0LmxlZnQgLSB0aGlzLndpZHRoO1xuICAgICAgICAgICAgbGFzdC5yaWdodCA9IGZpcnN0LnJpZ2h0ICsgdGhpcy53aWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy53aWR0aCAqIHRoaXMubmV4dFJvdztcbiAgICAgICAgbGV0IGN1cnJJbmRleCA9IDA7XG4gICAgICAgIGxldCByYW5nZSA9IHJhbmdlc1tjdXJySW5kZXhdO1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBpZiAoeCAvIHJhbmdlLnJpZ2h0ID4gMSkge1xuICAgICAgICAgICAgICAgIHJhbmdlID0gcmFuZ2VzWysrY3VyckluZGV4XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGlzdExlZnQgPSBNYXRoLmFicyh4IC0gcmFuZ2UubGVmdCk7XG4gICAgICAgICAgICBjb25zdCBkaXN0UmlnaHQgPSBNYXRoLmFicyh4IC0gcmFuZ2UucmlnaHQpO1xuXG4gICAgICAgICAgICBjb25zdCBtaW5EaXN0ID0gTWF0aC5taW4oZGlzdExlZnQsIGRpc3RSaWdodCk7XG4gICAgICAgICAgICBjb25zdCBzaWduZWREaXN0YW5jZSA9IChyYW5nZS5pc0Rhc2ggPyBtaW5EaXN0IDogLW1pbkRpc3QpICsgY2FwTGVuZ3RoO1xuXG4gICAgICAgICAgICB0aGlzLmltYWdlLmRhdGFbaW5kZXggKyB4XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgc2lnbmVkRGlzdGFuY2UgKyAxMjgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZERhc2goZGFzaGFycmF5OiBBcnJheTxudW1iZXI+LCBsaW5lQ2FwOiBzdHJpbmcpOiBudWxsIHwgU3ByaXRlUG9zaXRpb24ge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShkYXNoYXJyYXksIGxpbmVDYXApO1xuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbnNba2V5XSkgcmV0dXJuIHRoaXMucG9zaXRpb25zW2tleV07XG5cbiAgICAgICAgY29uc3Qgcm91bmQgPSBsaW5lQ2FwID09PSAncm91bmQnO1xuICAgICAgICBjb25zdCBuID0gcm91bmQgPyA3IDogMDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gMiAqIG4gKyAxO1xuXG4gICAgICAgIGlmICh0aGlzLm5leHRSb3cgKyBoZWlnaHQgPiB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ0xpbmVBdGxhcyBvdXQgb2Ygc3BhY2UnKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGFzaGFycmF5IGlzIGVtcHR5LCBkcmF3cyBhIGZ1bGwgbGluZSAobm8gZGFzaCBvciBubyBnYXAgbGVuZ3RoIHJlcHJlc2VudGVkLCBkZWZhdWx0IGJlaGF2aW9yKVxuICAgICAgICBpZiAoZGFzaGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gaW5zZXJ0IGEgc2luZ2xlIGRhc2ggcmFuZ2UgaW4gb3JkZXIgdG8gZHJhdyBhIGZ1bGwgbGluZVxuICAgICAgICAgICAgZGFzaGFycmF5LnB1c2goMSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXNoYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkYXNoYXJyYXlbaV0gPCAwKSB7XG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoJ05lZ2F0aXZlIHZhbHVlIGlzIGZvdW5kIGluIGxpbmUgZGFzaGFycmF5LCByZXBsYWNpbmcgdmFsdWVzIHdpdGggMCcpO1xuICAgICAgICAgICAgICAgIGRhc2hhcnJheVtpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZW5ndGggKz0gZGFzaGFycmF5W2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc3RyZXRjaCA9IHRoaXMud2lkdGggLyBsZW5ndGg7XG4gICAgICAgICAgICBjb25zdCByYW5nZXMgPSB0aGlzLmdldERhc2hSYW5nZXMoZGFzaGFycmF5LCB0aGlzLndpZHRoLCBzdHJldGNoKTtcblxuICAgICAgICAgICAgaWYgKHJvdW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRSb3VuZERhc2gocmFuZ2VzLCBzdHJldGNoLCBuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FwTGVuZ3RoID0gbGluZUNhcCA9PT0gJ3NxdWFyZScgPyAwLjUgKiBzdHJldGNoIDogMDtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFJlZ3VsYXJEYXNoKHJhbmdlcywgY2FwTGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLm5leHRSb3cgKyBuO1xuXG4gICAgICAgIHRoaXMubmV4dFJvdyArPSBoZWlnaHQ7XG5cbiAgICAgICAgY29uc3QgcG9zID0ge1xuICAgICAgICAgICAgdGw6IFt5LCBuXSxcbiAgICAgICAgICAgIGJyOiBbbGVuZ3RoLCAwXVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBvc2l0aW9uc1trZXldID0gcG9zO1xuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cbn1cblxucmVnaXN0ZXIoTGluZUF0bGFzLCAnTGluZUF0bGFzJyk7XG5cbmV4cG9ydCBkZWZhdWx0IExpbmVBdGxhcztcbiIsIi8vIEBmbG93XG5cbi8qKlxuICogSW52b2tlcyB0aGUgd3JhcHBlZCBmdW5jdGlvbiBpbiBhIG5vbi1ibG9ja2luZyB3YXkgd2hlbiB0cmlnZ2VyKCkgaXMgY2FsbGVkLiBJbnZvY2F0aW9uIHJlcXVlc3RzXG4gKiBhcmUgaWdub3JlZCB1bnRpbCB0aGUgZnVuY3Rpb24gd2FzIGFjdHVhbGx5IGludm9rZWQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVGhyb3R0bGVkSW52b2tlciB7XG4gICAgX2NoYW5uZWw6ID9NZXNzYWdlQ2hhbm5lbDtcbiAgICBfdHJpZ2dlcmVkOiBib29sZWFuO1xuICAgIF9jYWxsYmFjazogRnVuY3Rpb25cblxuICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLl90cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwucG9ydDIub25tZXNzYWdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJpZ2dlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90cmlnZ2VyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhbm5lbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5uZWwucG9ydDEucG9zdE1lc3NhZ2UodHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5fY2hhbm5lbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSAoKSA9PiB7fTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRocm90dGxlZEludm9rZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVGhyb3R0bGVkSW52b2tlciBmcm9tICcuL3Rocm90dGxlZF9pbnZva2VyLmpzJztcbmltcG9ydCB7YmluZEFsbCwgaXNXb3JrZXJ9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQge1BlcmZvcm1hbmNlVXRpbHN9IGZyb20gJy4vcGVyZm9ybWFuY2UuanMnO1xuXG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZS5qcyc7XG5cbnR5cGUgVGFza01ldGFkYXRhID0ge1xuICAgIHR5cGU6ICdtZXNzYWdlJyB8ICdtYXliZVByZXBhcmUnIHwgJ3BhcnNlVGlsZScsXG4gICAgaXNTeW1ib2xUaWxlOiA/Ym9vbGVhbixcbiAgICB6b29tPzogbnVtYmVyXG59O1xuXG50eXBlIFRhc2tGdW5jdGlvbiA9ICgpID0+IHZvaWQ7XG5cbnR5cGUgVGFzayA9IHtcbiAgICBmbjogVGFza0Z1bmN0aW9uLFxuICAgIG1ldGFkYXRhOiBUYXNrTWV0YWRhdGEsXG4gICAgcHJpb3JpdHk6IG51bWJlcixcbiAgICBpZDogbnVtYmVyXG59O1xuXG5jbGFzcyBTY2hlZHVsZXIge1xuXG4gICAgdGFza3M6IHsgW251bWJlcl06IFRhc2sgfTtcbiAgICB0YXNrUXVldWU6IEFycmF5PG51bWJlcj47XG4gICAgaW52b2tlcjogVGhyb3R0bGVkSW52b2tlcjtcbiAgICBuZXh0SWQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRhc2tzID0ge307XG4gICAgICAgIHRoaXMudGFza1F1ZXVlID0gW107XG4gICAgICAgIGJpbmRBbGwoWydwcm9jZXNzJ10sIHRoaXMpO1xuICAgICAgICB0aGlzLmludm9rZXIgPSBuZXcgVGhyb3R0bGVkSW52b2tlcih0aGlzLnByb2Nlc3MpO1xuXG4gICAgICAgIHRoaXMubmV4dElkID0gMDtcbiAgICB9XG5cbiAgICBhZGQoZm46IFRhc2tGdW5jdGlvbiwgbWV0YWRhdGE6IFRhc2tNZXRhZGF0YSk6IENhbmNlbGFibGUge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMubmV4dElkKys7XG4gICAgICAgIGNvbnN0IHByaW9yaXR5ID0gZ2V0UHJpb3JpdHkobWV0YWRhdGEpO1xuXG4gICAgICAgIGlmIChwcmlvcml0eSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gUHJvY2VzcyB0YXNrcyB3aXRoIHByaW9yaXR5IDAgaW1tZWRpYXRlbHkuIERvIG5vdCB5aWVsZCB0byB0aGUgZXZlbnQgbG9vcC5cbiAgICAgICAgICAgIGNvbnN0IG0gPSBpc1dvcmtlcigpID8gUGVyZm9ybWFuY2VVdGlscy5iZWdpbk1lYXN1cmUoJ3dvcmtlclRhc2snKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKG0pIFBlcmZvcm1hbmNlVXRpbHMuZW5kTWVhc3VyZShtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY2FuY2VsOiAoKSA9PiB7fVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGFza3NbaWRdID0ge2ZuLCBtZXRhZGF0YSwgcHJpb3JpdHksIGlkfTtcbiAgICAgICAgdGhpcy50YXNrUXVldWUucHVzaChpZCk7XG4gICAgICAgIHRoaXMuaW52b2tlci50cmlnZ2VyKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW5jZWw6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50YXNrc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJvY2VzcygpIHtcbiAgICAgICAgY29uc3QgbSA9IGlzV29ya2VyKCkgPyBQZXJmb3JtYW5jZVV0aWxzLmJlZ2luTWVhc3VyZSgnd29ya2VyVGFzaycpIDogdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy50YXNrUXVldWUgPSB0aGlzLnRhc2tRdWV1ZS5maWx0ZXIoaWQgPT4gISF0aGlzLnRhc2tzW2lkXSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy50YXNrUXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLnBpY2soKTtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB0YXNrID0gdGhpcy50YXNrc1tpZF07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy50YXNrc1tpZF07XG4gICAgICAgICAgICAvLyBTY2hlZHVsZSBhbm90aGVyIHByb2Nlc3MgY2FsbCBpZiB3ZSBrbm93IHRoZXJlJ3MgbW9yZSB0byBwcm9jZXNzIF9iZWZvcmVfIGludm9raW5nIHRoZVxuICAgICAgICAgICAgLy8gY3VycmVudCB0YXNrLiBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IHByb2Nlc3NpbmcgY29udGludWVzIGV2ZW4gaWYgdGhlIGN1cnJlbnQgdGFza1xuICAgICAgICAgICAgLy8gZG9lc24ndCBleGVjdXRlIHN1Y2Nlc3NmdWxseS5cbiAgICAgICAgICAgIGlmICh0aGlzLnRhc2tRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZXIudHJpZ2dlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0YXNrKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRhc2sgSUQgZG9lc24ndCBoYXZlIGFzc29jaWF0ZWQgdGFzayBkYXRhIGFueW1vcmUsIGl0IHdhcyBjYW5jZWxlZC5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRhc2suZm4oKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChtKSBQZXJmb3JtYW5jZVV0aWxzLmVuZE1lYXN1cmUobSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwaWNrKCk6IG51bGwgfCBudW1iZXIge1xuICAgICAgICBsZXQgbWluSW5kZXggPSBudWxsO1xuICAgICAgICBsZXQgbWluUHJpb3JpdHkgPSBJbmZpbml0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRhc2tRdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLnRhc2tRdWV1ZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IHRhc2sgPSB0aGlzLnRhc2tzW2lkXTtcbiAgICAgICAgICAgIGlmICh0YXNrLnByaW9yaXR5IDwgbWluUHJpb3JpdHkpIHtcbiAgICAgICAgICAgICAgICBtaW5Qcmlvcml0eSA9IHRhc2sucHJpb3JpdHk7XG4gICAgICAgICAgICAgICAgbWluSW5kZXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtaW5JbmRleCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy50YXNrUXVldWVbbWluSW5kZXhdO1xuICAgICAgICB0aGlzLnRhc2tRdWV1ZS5zcGxpY2UobWluSW5kZXgsIDEpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLmludm9rZXIucmVtb3ZlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRQcmlvcml0eSh7dHlwZSwgaXNTeW1ib2xUaWxlLCB6b29tfTogVGFza01ldGFkYXRhKTogbnVtYmVyIHtcbiAgICB6b29tID0gem9vbSB8fCAwO1xuICAgIGlmICh0eXBlID09PSAnbWVzc2FnZScpIHJldHVybiAwO1xuICAgIGlmICh0eXBlID09PSAnbWF5YmVQcmVwYXJlJyAmJiAhaXNTeW1ib2xUaWxlKSByZXR1cm4gMTAwIC0gem9vbTtcbiAgICBpZiAodHlwZSA9PT0gJ3BhcnNlVGlsZScgJiYgIWlzU3ltYm9sVGlsZSkgcmV0dXJuIDIwMCAtIHpvb207XG4gICAgaWYgKHR5cGUgPT09ICdwYXJzZVRpbGUnICYmIGlzU3ltYm9sVGlsZSkgcmV0dXJuIDMwMCAtIHpvb207XG4gICAgaWYgKHR5cGUgPT09ICdtYXliZVByZXBhcmUnICYmIGlzU3ltYm9sVGlsZSkgcmV0dXJuIDQwMCAtIHpvb207XG4gICAgcmV0dXJuIDUwMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgU2NoZWR1bGVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtiaW5kQWxsLCBpc1dvcmtlciwgaXNTYWZhcml9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4vd2luZG93LmpzJztcbmltcG9ydCB7c2VyaWFsaXplLCBkZXNlcmlhbGl6ZX0gZnJvbSAnLi93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcbmltcG9ydCBTY2hlZHVsZXIgZnJvbSAnLi9zY2hlZHVsZXIuanMnO1xuXG5pbXBvcnQgdHlwZSB7VHJhbnNmZXJhYmxlfSBmcm9tICcuLi90eXBlcy90cmFuc2ZlcmFibGUuanMnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUuanMnO1xuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBbQWN0b3IgZGVzaWduIHBhdHRlcm5dKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWN0b3JfbW9kZWwpXG4gKiB0aGF0IG1haW50YWlucyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYXN5bmNocm9ub3VzIHRhc2tzIGFuZCB0aGUgb2JqZWN0c1xuICogdGhhdCBzcGluIHRoZW0gb2ZmIC0gaW4gdGhpcyBjYXNlLCB0YXNrcyBsaWtlIHBhcnNpbmcgcGFydHMgb2Ygc3R5bGVzLFxuICogb3duZWQgYnkgdGhlIHN0eWxlc1xuICpcbiAqIEBwYXJhbSB7V2ViV29ya2VyfSB0YXJnZXRcbiAqIEBwYXJhbSB7V2ViV29ya2VyfSBwYXJlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbWFwSWQgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIE1hcCBpbnN0YW5jZSB1c2luZyB0aGlzIEFjdG9yLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQWN0b3Ige1xuICAgIHRhcmdldDogYW55O1xuICAgIHBhcmVudDogYW55O1xuICAgIG1hcElkOiA/bnVtYmVyO1xuICAgIGNhbGxiYWNrczogeyBudW1iZXI6IGFueSB9O1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBjYW5jZWxDYWxsYmFja3M6IHsgbnVtYmVyOiBDYW5jZWxhYmxlIH07XG4gICAgZ2xvYmFsU2NvcGU6IGFueTtcbiAgICBzY2hlZHVsZXI6IFNjaGVkdWxlcjtcblxuICAgIGNvbnN0cnVjdG9yKHRhcmdldDogYW55LCBwYXJlbnQ6IGFueSwgbWFwSWQ6ID9udW1iZXIpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLm1hcElkID0gbWFwSWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzID0ge307XG4gICAgICAgIHRoaXMuY2FuY2VsQ2FsbGJhY2tzID0ge307XG4gICAgICAgIGJpbmRBbGwoWydyZWNlaXZlJ10sIHRoaXMpO1xuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5yZWNlaXZlLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuZ2xvYmFsU2NvcGUgPSBpc1dvcmtlcigpID8gdGFyZ2V0IDogd2luZG93O1xuICAgICAgICB0aGlzLnNjaGVkdWxlciA9IG5ldyBTY2hlZHVsZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIG1lc3NhZ2UgZnJvbSBhIG1haW4tdGhyZWFkIG1hcCB0byBhIFdvcmtlciBvciBmcm9tIGEgV29ya2VyIGJhY2sgdG9cbiAgICAgKiBhIG1haW4tdGhyZWFkIG1hcCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0eXBlIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgbWV0aG9kIHRvIGludm9rZSBvciAnW3NvdXJjZS10eXBlXS5bc291cmNlLW5hbWVdLm5hbWUnIGZvciBhIG1ldGhvZCBvbiBhIFdvcmtlclNvdXJjZS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0TWFwSWQgQSBwYXJ0aWN1bGFyIG1hcElkIHRvIHdoaWNoIHRvIHNlbmQgdGhpcyBtZXNzYWdlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2VuZCh0eXBlOiBzdHJpbmcsIGRhdGE6IG1peGVkLCBjYWxsYmFjazogP0Z1bmN0aW9uLCB0YXJnZXRNYXBJZDogP3N0cmluZywgbXVzdFF1ZXVlOiBib29sZWFuID0gZmFsc2UsIGNhbGxiYWNrTWV0YWRhdGE/OiBPYmplY3QpOiA/Q2FuY2VsYWJsZSB7XG4gICAgICAgIC8vIFdlJ3JlIHVzaW5nIGEgc3RyaW5nIElEIGluc3RlYWQgb2YgbnVtYmVycyBiZWNhdXNlIHRoZXkgYXJlIGJlaW5nIHVzZWQgYXMgb2JqZWN0IGtleXNcbiAgICAgICAgLy8gYW55d2F5LCBhbmQgdGh1cyBzdHJpbmdpZmllZCBpbXBsaWNpdGx5LiBXZSB1c2UgcmFuZG9tIElEcyBiZWNhdXNlIGFuIGFjdG9yIG1heSByZWNlaXZlXG4gICAgICAgIC8vIG1lc3NhZ2UgZnJvbSBtdWx0aXBsZSBvdGhlciBhY3RvcnMgd2hpY2ggY291bGQgcnVuIGluIGRpZmZlcmVudCBleGVjdXRpb24gY29udGV4dC4gQVxuICAgICAgICAvLyBsaW5lYXJseSBpbmNyZWFzaW5nIElEIGNvdWxkIHByb2R1Y2UgY29sbGlzaW9ucy5cbiAgICAgICAgY29uc3QgaWQgPSBNYXRoLnJvdW5kKChNYXRoLnJhbmRvbSgpICogMWUxOCkpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMCwgMTApO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrLm1ldGFkYXRhID0gY2FsbGJhY2tNZXRhZGF0YTtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzW2lkXSA9IGNhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnM6ID9BcnJheTxUcmFuc2ZlcmFibGU+ID0gaXNTYWZhcmkodGhpcy5nbG9iYWxTY29wZSkgPyB1bmRlZmluZWQgOiBbXTtcbiAgICAgICAgdGhpcy50YXJnZXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaGFzQ2FsbGJhY2s6ICEhY2FsbGJhY2ssXG4gICAgICAgICAgICB0YXJnZXRNYXBJZCxcbiAgICAgICAgICAgIG11c3RRdWV1ZSxcbiAgICAgICAgICAgIHNvdXJjZU1hcElkOiB0aGlzLm1hcElkLFxuICAgICAgICAgICAgZGF0YTogc2VyaWFsaXplKGRhdGEsIGJ1ZmZlcnMpXG4gICAgICAgIH0sIGJ1ZmZlcnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgdG8gbnVsbCBzbyB0aGF0IGl0IG5ldmVyIGZpcmVzIGFmdGVyIHRoZSByZXF1ZXN0IGlzIGFib3J0ZWQuXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1tpZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICc8Y2FuY2VsPicsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1hcElkLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VNYXBJZDogdGhpcy5tYXBJZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJlY2VpdmUobWVzc2FnZTogT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBtZXNzYWdlLmRhdGEsXG4gICAgICAgICAgICBpZCA9IGRhdGEuaWQ7XG5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEudGFyZ2V0TWFwSWQgJiYgdGhpcy5tYXBJZCAhPT0gZGF0YS50YXJnZXRNYXBJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJzxjYW5jZWw+Jykge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGZyb20gdGhlIHF1ZXVlLiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgaXRcbiAgICAgICAgICAgIC8vIGhhc24ndCBiZWVuIGtpY2tlZCBvZmYgeWV0LiBUaGUgaWQgd2lsbCByZW1haW4gaW4gdGhlIHF1ZXVlLCBidXQgYmVjYXVzZVxuICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gYXNzb2NpYXRlZCB0YXNrLCBpdCB3aWxsIGJlIGRyb3BwZWQgb25jZSBpdCdzIHRpbWUgdG8gZXhlY3V0ZSBpdC5cbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbCA9IHRoaXMuY2FuY2VsQ2FsbGJhY2tzW2lkXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbmNlbENhbGxiYWNrc1tpZF07XG4gICAgICAgICAgICBpZiAoY2FuY2VsKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsLmNhbmNlbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRhdGEubXVzdFF1ZXVlIHx8IGlzV29ya2VyKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBmb3Igd29ya2VyIHRhc2tzIHRoYXQgYXJlIG9mdGVuIGNhbmNlbGxlZCwgc3VjaCBhcyBsb2FkVGlsZSwgc3RvcmUgdGhlbSBiZWZvcmUgYWN0dWFsbHlcbiAgICAgICAgICAgICAgICAvLyBwcm9jZXNzaW5nIHRoZW0uIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2Ugd2FudCB0byBrZWVwIHJlY2VpdmluZyA8Y2FuY2VsPiBtZXNzYWdlcy5cbiAgICAgICAgICAgICAgICAvLyBTb21lIHRhc2tzIG1heSB0YWtlIGEgd2hpbGUgaW4gdGhlIHdvcmtlciB0aHJlYWQsIHNvIGJlZm9yZSBleGVjdXRpbmcgdGhlIG5leHQgdGFza1xuICAgICAgICAgICAgICAgIC8vIGluIG91ciBxdWV1ZSwgcG9zdE1lc3NhZ2UgcHJlZW1wdHMgdGhpcyBhbmQgPGNhbmNlbD4gbWVzc2FnZXMgY2FuIGJlIHByb2Nlc3NlZC5cbiAgICAgICAgICAgICAgICAvLyBXZSdyZSB1c2luZyBhIE1lc3NhZ2VDaGFubmVsIG9iamVjdCB0byBnZXQgdGhyb3R0bGUgdGhlIHByb2Nlc3MoKSBmbG93IHRvIG9uZSBhdCBhIHRpbWUuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmNhbGxiYWNrc1tpZF07XG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSAoY2FsbGJhY2sgJiYgY2FsbGJhY2subWV0YWRhdGEpIHx8IHt0eXBlOiBcIm1lc3NhZ2VcIn07XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxDYWxsYmFja3NbaWRdID0gdGhpcy5zY2hlZHVsZXIuYWRkKCgpID0+IHRoaXMucHJvY2Vzc1Rhc2soaWQsIGRhdGEpLCBtZXRhZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBtYWluIHRocmVhZCwgcHJvY2VzcyBtZXNzYWdlcyBpbW1lZGlhdGVseSBzbyB0aGF0IG90aGVyIHdvcmsgZG9lcyBub3Qgc2xpcCBpblxuICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gZ2V0dGluZyBwYXJ0aWFsIGRhdGEgYmFjayBmcm9tIHdvcmtlcnMuXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzVGFzayhpZCwgZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9jZXNzVGFzayhpZDogbnVtYmVyLCB0YXNrOiBhbnkpIHtcbiAgICAgICAgaWYgKHRhc2sudHlwZSA9PT0gJzxyZXNwb25zZT4nKSB7XG4gICAgICAgICAgICAvLyBUaGUgZG9uZSgpIGZ1bmN0aW9uIGluIHRoZSBjb3VudGVycGFydCBoYXMgYmVlbiBjYWxsZWQsIGFuZCB3ZSBhcmUgbm93XG4gICAgICAgICAgICAvLyBmaXJpbmcgdGhlIGNhbGxiYWNrIGluIHRoZSBvcmlnaW5hdGluZyBhY3RvciwgaWYgdGhlcmUgaXMgb25lLlxuICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmNhbGxiYWNrc1tpZF07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbaWRdO1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgZ2V0IGEgcmVzcG9uc2UsIGJ1dCBkb24ndCBoYXZlIGEgY2FsbGJhY2ssIHRoZSByZXF1ZXN0IHdhcyBjYW5jZWxlZC5cbiAgICAgICAgICAgICAgICBpZiAodGFzay5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhkZXNlcmlhbGl6ZSh0YXNrLmVycm9yKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGVzZXJpYWxpemUodGFzay5kYXRhKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyczogP0FycmF5PFRyYW5zZmVyYWJsZT4gPSBpc1NhZmFyaSh0aGlzLmdsb2JhbFNjb3BlKSA/IHVuZGVmaW5lZCA6IFtdO1xuICAgICAgICAgICAgY29uc3QgZG9uZSA9IHRhc2suaGFzQ2FsbGJhY2sgPyAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FuY2VsQ2FsbGJhY2tzW2lkXTtcbiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnPHJlc3BvbnNlPicsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU1hcElkOiB0aGlzLm1hcElkLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyID8gc2VyaWFsaXplKGVycikgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBzZXJpYWxpemUoZGF0YSwgYnVmZmVycylcbiAgICAgICAgICAgICAgICB9LCBidWZmZXJzKTtcbiAgICAgICAgICAgIH0gOiAoXykgPT4ge1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gKGRlc2VyaWFsaXplKHRhc2suZGF0YSk6IGFueSk7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRbdGFzay50eXBlXSkge1xuICAgICAgICAgICAgICAgIC8vIHRhc2sudHlwZSA9PSAnbG9hZFRpbGUnLCAncmVtb3ZlVGlsZScsIGV0Yy5cbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFt0YXNrLnR5cGVdKHRhc2suc291cmNlTWFwSWQsIHBhcmFtcywgZG9uZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGFyZW50LmdldFdvcmtlclNvdXJjZSkge1xuICAgICAgICAgICAgICAgIC8vIHRhc2sudHlwZSA9PSBzb3VyY2V0eXBlLm1ldGhvZFxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSB0YXNrLnR5cGUuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY29wZSA9ICh0aGlzLnBhcmVudDogYW55KS5nZXRXb3JrZXJTb3VyY2UodGFzay5zb3VyY2VNYXBJZCwga2V5c1swXSwgcGFyYW1zLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgc2NvcGVba2V5c1sxXV0ocGFyYW1zLCBkb25lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm8gZnVuY3Rpb24gd2FzIGZvdW5kLlxuICAgICAgICAgICAgICAgIGRvbmUobmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBmdW5jdGlvbiAke3Rhc2sudHlwZX1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVyLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5yZWNlaXZlLCBmYWxzZSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBY3RvcjtcbiIsIi8vIEBmbG93IHN0cmljdFxuXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmNsYXNzIERpY3Rpb25hcnlDb2RlciB7XG4gICAgX3N0cmluZ1RvTnVtYmVyOiB7W186IHN0cmluZ106IG51bWJlciB9O1xuICAgIF9udW1iZXJUb1N0cmluZzogQXJyYXk8c3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yKHN0cmluZ3M6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5fc3RyaW5nVG9OdW1iZXIgPSB7fTtcbiAgICAgICAgdGhpcy5fbnVtYmVyVG9TdHJpbmcgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdHJpbmcgPSBzdHJpbmdzW2ldO1xuICAgICAgICAgICAgdGhpcy5fc3RyaW5nVG9OdW1iZXJbc3RyaW5nXSA9IGk7XG4gICAgICAgICAgICB0aGlzLl9udW1iZXJUb1N0cmluZ1tpXSA9IHN0cmluZztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVuY29kZShzdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGFzc2VydChzdHJpbmcgaW4gdGhpcy5fc3RyaW5nVG9OdW1iZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyaW5nVG9OdW1iZXJbc3RyaW5nXTtcbiAgICB9XG5cbiAgICBkZWNvZGUobjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgYXNzZXJ0KG4gPCB0aGlzLl9udW1iZXJUb1N0cmluZy5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyVG9TdHJpbmdbbl07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEaWN0aW9uYXJ5Q29kZXI7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTkdlb21ldHJ5LCBHZW9KU09ORmVhdHVyZX0gZnJvbSAnQG1hcGJveC9nZW9qc29uLXR5cGVzJztcblxuLy8gd2UgYXVnbWVudCBHZW9KU09OIHdpdGggY3VzdG9tIHByb3BlcnRpZXMgaW4gcXVlcnkqRmVhdHVyZXMgcmVzdWx0c1xuZXhwb3J0IHR5cGUgUXVlcnlGZWF0dXJlID0gJFJlYWRPbmx5PEdlb0pTT05GZWF0dXJlPiAmIHtcbiAgICBsYXllcj86ID9MYXllclNwZWNpZmljYXRpb247XG4gICAgW2tleTogc3RyaW5nXTogbWl4ZWQ7XG59O1xuXG5jb25zdCBjdXN0b21Qcm9wcyA9IFsndGlsZScsICdsYXllcicsICdzb3VyY2UnLCAnc291cmNlTGF5ZXInLCAnc3RhdGUnXTtcblxuY2xhc3MgRmVhdHVyZSB7XG4gICAgdHlwZTogJ0ZlYXR1cmUnO1xuICAgIF9nZW9tZXRyeTogP0dlb0pTT05HZW9tZXRyeTtcbiAgICBwcm9wZXJ0aWVzOiB7fTtcbiAgICBpZDogbnVtYmVyIHwgc3RyaW5nIHwgdm9pZDtcbiAgICBfdmVjdG9yVGlsZUZlYXR1cmU6IFZlY3RvclRpbGVGZWF0dXJlO1xuICAgIF94OiBudW1iZXI7XG4gICAgX3k6IG51bWJlcjtcbiAgICBfejogbnVtYmVyO1xuXG4gICAgdGlsZTogP21peGVkO1xuICAgIGxheWVyOiA/TGF5ZXJTcGVjaWZpY2F0aW9uO1xuICAgIHNvdXJjZTogP21peGVkO1xuICAgIHNvdXJjZUxheWVyOiA/bWl4ZWQ7XG4gICAgc3RhdGU6ID9taXhlZDtcblxuICAgIGNvbnN0cnVjdG9yKHZlY3RvclRpbGVGZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSwgejogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgaWQ6IHN0cmluZyB8IG51bWJlciB8IHZvaWQpIHtcbiAgICAgICAgdGhpcy50eXBlID0gJ0ZlYXR1cmUnO1xuXG4gICAgICAgIHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlID0gdmVjdG9yVGlsZUZlYXR1cmU7XG4gICAgICAgIHRoaXMuX3ogPSB6O1xuICAgICAgICB0aGlzLl94ID0geDtcbiAgICAgICAgdGhpcy5feSA9IHk7XG5cbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gdmVjdG9yVGlsZUZlYXR1cmUucHJvcGVydGllcztcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgIH1cblxuICAgIGdldCBnZW9tZXRyeSgpOiA/R2VvSlNPTkdlb21ldHJ5IHtcbiAgICAgICAgaWYgKHRoaXMuX2dlb21ldHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb21ldHJ5ID0gdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUudG9HZW9KU09OKHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3opLmdlb21ldHJ5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW9tZXRyeTtcbiAgICB9XG5cbiAgICBzZXQgZ2VvbWV0cnkoZzogP0dlb0pTT05HZW9tZXRyeSkge1xuICAgICAgICB0aGlzLl9nZW9tZXRyeSA9IGc7XG4gICAgfVxuXG4gICAgdG9KU09OKCk6IFF1ZXJ5RmVhdHVyZSB7XG4gICAgICAgIGNvbnN0IGpzb246IFF1ZXJ5RmVhdHVyZSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgICAgIGdlb21ldHJ5OiB0aGlzLmdlb21ldHJ5LFxuICAgICAgICAgICAgcHJvcGVydGllczogdGhpcy5wcm9wZXJ0aWVzXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmlkICE9PSB1bmRlZmluZWQpIGpzb24uaWQgPSB0aGlzLmlkO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBjdXN0b21Qcm9wcykge1xuICAgICAgICAgICAgLy8gRmxvdyBkb2Vzbid0IHN1cHBvcnQgaW5kZXhlZCBhY2Nlc3MgZm9yIGNsYXNzZXMgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzEzMjNcbiAgICAgICAgICAgIGlmICgodGhpczogYW55KVtrZXldICE9PSB1bmRlZmluZWQpIGpzb25ba2V5XSA9ICh0aGlzOiBhbnkpW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge0NvbGxpc2lvbkJveEFycmF5fSBmcm9tICcuL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlIGZyb20gJy4uL3N0eWxlL3N0eWxlLmpzJztcbmltcG9ydCB0eXBlIHtUeXBlZFN0eWxlTGF5ZXJ9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3R5cGVkX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIEZlYXR1cmVJbmRleCBmcm9tICcuL2ZlYXR1cmVfaW5kZXguanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX3N0YXRlLmpzJztcbmltcG9ydCB0eXBlIHtTcHJpdGVQb3NpdGlvbnN9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHR5cGUgTGluZUF0bGFzIGZyb20gJy4uL3JlbmRlci9saW5lX2F0bGFzLmpzJztcbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlVHJhbnNmb3JtfSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi90aWxlX3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIEJ1Y2tldFBhcmFtZXRlcnM8TGF5ZXI6IFR5cGVkU3R5bGVMYXllcj4gPSB7XG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBsYXllcnM6IEFycmF5PExheWVyPixcbiAgICB6b29tOiBudW1iZXIsXG4gICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQsXG4gICAgcGl4ZWxSYXRpbzogbnVtYmVyLFxuICAgIG92ZXJzY2FsaW5nOiBudW1iZXIsXG4gICAgY29sbGlzaW9uQm94QXJyYXk6IENvbGxpc2lvbkJveEFycmF5LFxuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICBzb3VyY2VJRDogc3RyaW5nLFxuICAgIGVuYWJsZVRlcnJhaW46IGJvb2xlYW4sXG4gICAgcHJvamVjdGlvbjogUHJvamVjdGlvblNwZWNpZmljYXRpb25cbn1cblxuZXhwb3J0IHR5cGUgUG9wdWxhdGVQYXJhbWV0ZXJzID0ge1xuICAgIGZlYXR1cmVJbmRleDogRmVhdHVyZUluZGV4LFxuICAgIGljb25EZXBlbmRlbmNpZXM6IHt9LFxuICAgIHBhdHRlcm5EZXBlbmRlbmNpZXM6IHt9LFxuICAgIGdseXBoRGVwZW5kZW5jaWVzOiB7fSxcbiAgICBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sXG4gICAgbGluZUF0bGFzOiBMaW5lQXRsYXNcbn1cblxuZXhwb3J0IHR5cGUgSW5kZXhlZEZlYXR1cmUgPSB7XG4gICAgZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsXG4gICAgaWQ6IG51bWJlciB8IHN0cmluZyB8IHZvaWQsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBzb3VyY2VMYXllckluZGV4OiBudW1iZXIsXG59XG5cbmV4cG9ydCB0eXBlIEJ1Y2tldEZlYXR1cmUgPSB7fFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLFxuICAgIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LFxuICAgIHByb3BlcnRpZXM6IE9iamVjdCxcbiAgICB0eXBlOiAxIHwgMiB8IDMsXG4gICAgaWQ/OiBhbnksXG4gICAgK3BhdHRlcm5zOiB7W186IHN0cmluZ106IHtcIm1pblwiOiBzdHJpbmcsIFwibWlkXCI6IHN0cmluZywgXCJtYXhcIjogc3RyaW5nfX0sXG4gICAgc29ydEtleT86IG51bWJlclxufH07XG5cbi8qKlxuICogVGhlIGBCdWNrZXRgIGludGVyZmFjZSBpcyB0aGUgc2luZ2xlIHBvaW50IG9mIGtub3dsZWRnZSBhYm91dCB0dXJuaW5nIHZlY3RvclxuICogdGlsZXMgaW50byBXZWJHTCBidWZmZXJzLlxuICpcbiAqIGBCdWNrZXRgIGlzIGFuIGFic3RyYWN0IGludGVyZmFjZS4gQW4gaW1wbGVtZW50YXRpb24gZXhpc3RzIGZvciBlYWNoIHN0eWxlIGxheWVyIHR5cGUuXG4gKiBDcmVhdGUgYSBidWNrZXQgdmlhIHRoZSBgU3R5bGVMYXllciNjcmVhdGVCdWNrZXRgIG1ldGhvZC5cbiAqXG4gKiBUaGUgY29uY3JldGUgYnVja2V0IHR5cGVzLCB1c2luZyBsYXlvdXQgb3B0aW9ucyBmcm9tIHRoZSBzdHlsZSBsYXllcixcbiAqIHRyYW5zZm9ybSBmZWF0dXJlIGdlb21ldHJpZXMgaW50byB2ZXJ0ZXggYW5kIGluZGV4IGRhdGEgZm9yIHVzZSBieSB0aGVcbiAqIHZlcnRleCBzaGFkZXIuICBUaGV5IGFsc28gKHZpYSBgUHJvZ3JhbUNvbmZpZ3VyYXRpb25gKSB1c2UgZmVhdHVyZVxuICogcHJvcGVydGllcyBhbmQgdGhlIHpvb20gbGV2ZWwgdG8gcG9wdWxhdGUgdGhlIGF0dHJpYnV0ZXMgbmVlZGVkIGZvclxuICogZGF0YS1kcml2ZW4gc3R5bGluZy5cbiAqXG4gKiBCdWNrZXRzIGFyZSBkZXNpZ25lZCB0byBiZSBidWlsdCBvbiBhIHdvcmtlciB0aHJlYWQgYW5kIHRoZW4gc2VyaWFsaXplZCBhbmRcbiAqIHRyYW5zZmVycmVkIGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkIGZvciByZW5kZXJpbmcuICBPbiB0aGUgd29ya2VyIHNpZGUsIGFcbiAqIGJ1Y2tldCdzIHZlcnRleCwgaW5kZXgsIGFuZCBhdHRyaWJ1dGUgZGF0YSBpcyBzdG9yZWQgaW4gYGJ1Y2tldC5hcnJheXM6XG4gKiBBcnJheUdyb3VwYC4gIFdoZW4gYSBidWNrZXQncyBkYXRhIGlzIHNlcmlhbGl6ZWQgYW5kIHNlbnQgYmFjayB0byB0aGUgbWFpblxuICogdGhyZWFkLCBpcyBnZXRzIGRlc2VyaWFsaXplZCAodXNpbmcgYG5ldyBCdWNrZXQoc2VyaWFsaXplZEJ1Y2tldERhdGEpYCwgd2l0aFxuICogdGhlIGFycmF5IGRhdGEgbm93IHN0b3JlZCBpbiBgYnVja2V0LmJ1ZmZlcnM6IEJ1ZmZlckdyb3VwYC4gIEJ1ZmZlckdyb3Vwc1xuICogaG9sZCB0aGUgc2FtZSBkYXRhIGFzIEFycmF5R3JvdXBzLCBidXQgYXJlIHR1bmVkIGZvciBjb25zdW1wdGlvbiBieSBXZWJHTC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Y2tldCB7XG4gICAgbGF5ZXJJZHM6IEFycmF5PHN0cmluZz47XG4gICAgaGFzUGF0dGVybjogYm9vbGVhbjtcbiAgICArbGF5ZXJzOiBBcnJheTxhbnk+O1xuICAgICtzdGF0ZURlcGVuZGVudExheWVyczogQXJyYXk8YW55PjtcbiAgICArc3RhdGVEZXBlbmRlbnRMYXllcklkczogQXJyYXk8c3RyaW5nPjtcbiAgICBwb3B1bGF0ZShmZWF0dXJlczogQXJyYXk8SW5kZXhlZEZlYXR1cmU+LCBvcHRpb25zOiBQb3B1bGF0ZVBhcmFtZXRlcnMsIGNhbm9uaWNhbDogQ2Fub25pY2FsVGlsZUlELCB0aWxlVHJhbnNmb3JtOiBUaWxlVHJhbnNmb3JtKTogdm9pZDtcbiAgICB1cGRhdGUoc3RhdGVzOiBGZWF0dXJlU3RhdGVzLCB2dExheWVyOiBWZWN0b3JUaWxlTGF5ZXIsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgaW1hZ2VQb3NpdGlvbnM6IFNwcml0ZVBvc2l0aW9ucyk6IHZvaWQ7XG4gICAgaXNFbXB0eSgpOiBib29sZWFuO1xuXG4gICAgdXBsb2FkKGNvbnRleHQ6IENvbnRleHQpOiB2b2lkO1xuICAgIHVwbG9hZFBlbmRpbmcoKTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFJlbGVhc2UgdGhlIFdlYkdMIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlcnMuIE5vdGUgdGhhdCBiZWNhdXNlXG4gICAgICogYnVja2V0cyBhcmUgc2hhcmVkIGJldHdlZW4gbGF5ZXJzIGhhdmluZyB0aGUgc2FtZSBsYXlvdXQgcHJvcGVydGllcywgdGhleVxuICAgICAqIG11c3QgYmUgZGVzdHJveWVkIGluIGdyb3VwcyAoYWxsIGJ1Y2tldHMgZm9yIGEgdGlsZSwgb3IgYWxsIHN5bWJvbCBidWNrZXRzKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZGVzdHJveSgpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUoaW5wdXQ6IEFycmF5PEJ1Y2tldD4sIHN0eWxlOiBTdHlsZSk6IHtbXzogc3RyaW5nXTogQnVja2V0fSB7XG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG5cbiAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtYXAncyBzdHlsZSBoYXMgYmVlbiBzZXQgdG8gbnVsbCB3aGlsZVxuICAgIC8vIHRoaXMgYnVja2V0IGhhcyBiZWVuIHBhcnNpbmcuXG4gICAgaWYgKCFzdHlsZSkgcmV0dXJuIG91dHB1dDtcblxuICAgIGZvciAoY29uc3QgYnVja2V0IG9mIGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGxheWVycyA9IGJ1Y2tldC5sYXllcklkc1xuICAgICAgICAgICAgLm1hcCgoaWQpID0+IHN0eWxlLmdldExheWVyKGlkKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgaWYgKGxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbG9vayB1cCBTdHlsZUxheWVyIG9iamVjdHMgZnJvbSBsYXllciBpZHMgKHNpbmNlIHdlIGRvbid0XG4gICAgICAgIC8vIHdhbnQgdG8gd2FzdGUgdGltZSBzZXJpYWxpemluZy9jb3B5aW5nIHRoZW0gZnJvbSB0aGUgd29ya2VyKVxuICAgICAgICAoYnVja2V0OiBhbnkpLmxheWVycyA9IGxheWVycztcbiAgICAgICAgaWYgKChidWNrZXQ6IGFueSkuc3RhdGVEZXBlbmRlbnRMYXllcklkcykge1xuICAgICAgICAgICAgKGJ1Y2tldDogYW55KS5zdGF0ZURlcGVuZGVudExheWVycyA9IChidWNrZXQ6IGFueSkuc3RhdGVEZXBlbmRlbnRMYXllcklkcy5tYXAoKGxJZCkgPT4gbGF5ZXJzLmZpbHRlcigobCkgPT4gbC5pZCA9PT0gbElkKVswXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIG91dHB1dFtsYXllci5pZF0gPSBidWNrZXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdy5qcyc7XG5cbi8qKlxuICogVGhpcyBpcyBhIHByaXZhdGUgbmFtZXNwYWNlIGZvciB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IHdpbGwgZ2V0IGF1dG9tYXRpY2FsbHkgc3RyaXBwZWRcbiAqIG91dCBpbiBwcm9kdWN0aW9uIGJ1aWxkcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgRGVidWcgPSB7XG4gICAgZXh0ZW5kKGRlc3Q6IE9iamVjdCwgLi4uc291cmNlczogQXJyYXk8P09iamVjdD4pOiBPYmplY3Qge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKGRlc3QsIC4uLnNvdXJjZXMpO1xuICAgIH0sXG5cbiAgICBydW4oZm46ICgpID0+IGFueSkge1xuICAgICAgICBmbigpO1xuICAgIH0sXG5cbiAgICBsb2dUb0VsZW1lbnQobWVzc2FnZTogc3RyaW5nLCBvdmVyd3JpdGU6IGJvb2xlYW4gPSBmYWxzZSwgaWQ6IHN0cmluZyA9IFwibG9nXCIpIHtcbiAgICAgICAgY29uc3QgZWwgPSB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgIGlmIChvdmVyd3JpdGUpIGVsLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgZWwuaW5uZXJIVE1MICs9IGA8YnI+JHttZXNzYWdlfWA7XG4gICAgICAgIH1cblxuICAgIH1cbn07XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtQb3NBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheX0gZnJvbSBcIi4vYXJyYXlfdHlwZXMuanNcIjtcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gXCIuL3NlZ21lbnQuanNcIjtcbmltcG9ydCBwb3NBdHRyaWJ1dGVzIGZyb20gJy4vcG9zX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IENvbG9yIGZyb20gXCIuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanNcIjtcblxuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gXCIuLi9nbC92ZXJ0ZXhfYnVmZmVyLmpzXCI7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tIFwiLi4vZ2wvaW5kZXhfYnVmZmVyLmpzXCI7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcIi4uL2dsL2NvbnRleHQuanNcIjtcblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0byBkcmF3IGRlYnVnIGdlb21ldHJ5IGluIHRpbGUtc3BhY2VcbiAqXG4gKiBAY2xhc3MgVGlsZVNwYWNlRGVidWdCdWZmZXJcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBUaWxlU3BhY2VEZWJ1Z0J1ZmZlciB7XG4gICAgdmVydGljZXM6IFBvc0FycmF5O1xuICAgIGluZGljZXM6IExpbmVTdHJpcEluZGV4QXJyYXk7XG4gICAgdGlsZVNpemU6IG51bWJlcjtcbiAgICBuZWVkc1VwbG9hZDogYm9vbGVhbjtcbiAgICBjb2xvcjogQ29sb3I7XG5cbiAgICB2ZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXI7XG4gICAgaW5kZXhCdWZmZXI6ID9JbmRleEJ1ZmZlcjtcbiAgICBzZWdtZW50czogP1NlZ21lbnRWZWN0b3I7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aWxlU2l6ZTogbnVtYmVyLCBjb2xvcjogQ29sb3IgPSBDb2xvci5yZWQpIHtcbiAgICAgICAgdGhpcy52ZXJ0aWNlcyA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICB0aGlzLmluZGljZXMgPSBuZXcgTGluZVN0cmlwSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gdGlsZVNpemU7XG4gICAgICAgIHRoaXMubmVlZHNVcGxvYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbG9yID0gY29sb3I7XG4gICAgfVxuXG4gICAgYWRkUG9pbnRzKHBvaW50czogUG9pbnRbXSkge1xuICAgICAgICB0aGlzLmNsZWFyUG9pbnRzKCk7XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcG9pbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFBvaW50KHBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZFBvaW50KHBvaW50c1swXSk7XG4gICAgfVxuXG4gICAgYWRkUG9pbnQocDogUG9pbnQpIHtcbiAgICAgICAgLy8gQWRkIGEgYm93dGllIHNoYXBlXG4gICAgICAgIGNvbnN0IGNyb3NzaGFpclNpemUgPSA4MDtcbiAgICAgICAgY29uc3QgY3VyckxpbmVMaW5lTGVuZ3RoID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMudmVydGljZXMuZW1wbGFjZUJhY2socC54LCBwLnkpO1xuICAgICAgICB0aGlzLnZlcnRpY2VzLmVtcGxhY2VCYWNrKHAueCArIGNyb3NzaGFpclNpemUgLyAyLCBwLnkpO1xuICAgICAgICB0aGlzLnZlcnRpY2VzLmVtcGxhY2VCYWNrKHAueCwgcC55IC0gY3Jvc3NoYWlyU2l6ZSAvIDIpO1xuICAgICAgICB0aGlzLnZlcnRpY2VzLmVtcGxhY2VCYWNrKHAueCwgcC55ICsgY3Jvc3NoYWlyU2l6ZSAvIDIpO1xuICAgICAgICB0aGlzLnZlcnRpY2VzLmVtcGxhY2VCYWNrKHAueCAtIGNyb3NzaGFpclNpemUgLyAyLCBwLnkpO1xuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soY3VyckxpbmVMaW5lTGVuZ3RoKTtcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKGN1cnJMaW5lTGluZUxlbmd0aCArIDEpO1xuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soY3VyckxpbmVMaW5lTGVuZ3RoICsgMik7XG4gICAgICAgIHRoaXMuaW5kaWNlcy5lbXBsYWNlQmFjayhjdXJyTGluZUxpbmVMZW5ndGggKyAzKTtcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKGN1cnJMaW5lTGluZUxlbmd0aCArIDQpO1xuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soY3VyckxpbmVMaW5lTGVuZ3RoKTtcblxuICAgICAgICB0aGlzLm5lZWRzVXBsb2FkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjbGVhclBvaW50cygpIHtcbiAgICAgICAgdGhpcy52ZXJ0aWNlcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmluZGljZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9IHRydWU7XG4gICAgfVxuXG4gICAgbGF6eVVwbG9hZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLm5lZWRzVXBsb2FkICYmIHRoaXMuaGFzVmVydGljZXMoKSkge1xuICAgICAgICAgICAgdGhpcy51bmxvYWQoKTtcblxuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLnZlcnRpY2VzLCBwb3NBdHRyaWJ1dGVzLm1lbWJlcnMsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGhpcy5pbmRpY2VzLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgdGhpcy52ZXJ0aWNlcy5sZW5ndGgsIHRoaXMuaW5kaWNlcy5sZW5ndGgpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc1VwbG9hZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzVmVydGljZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2VzLmxlbmd0aCA+IDE7XG4gICAgfVxuXG4gICAgdW5sb2FkKCkge1xuICAgICAgICBpZiAodGhpcy52ZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRleEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5pbmRleEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWdtZW50cykge1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zZWdtZW50cztcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vIEBmbG93XG4vLyBsb2dpYyBmb3IgZ2VuZXJhdGluZyBub24tTWVyY2F0b3IgYWRhcHRpdmUgcmFzdGVyIHRpbGUgcmVwcm9qZWN0aW9uIG1lc2hlcyB3aXRoIE1BUlRJTklcblxuaW1wb3J0IHRpbGVUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQge2xuZ0Zyb21NZXJjYXRvclgsIGxhdEZyb21NZXJjYXRvcll9IGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCB7VGlsZUJvdW5kc0FycmF5LCBUcmlhbmdsZUluZGV4QXJyYXl9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7Q2Fub25pY2FsVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUgUHJvamVjdGlvbiBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9wcm9qZWN0aW9uLmpzJztcblxuY29uc3QgbWVzaFNpemUgPSAzMjtcbmNvbnN0IGdyaWRTaXplID0gbWVzaFNpemUgKyAxO1xuXG5jb25zdCBudW1UcmlhbmdsZXMgPSBtZXNoU2l6ZSAqIG1lc2hTaXplICogMiAtIDI7XG5jb25zdCBudW1QYXJlbnRUcmlhbmdsZXMgPSBudW1UcmlhbmdsZXMgLSBtZXNoU2l6ZSAqIG1lc2hTaXplO1xuXG5jb25zdCBjb29yZHMgPSBuZXcgVWludDE2QXJyYXkobnVtVHJpYW5nbGVzICogNCk7XG5cbi8vIHByZWNhbGN1bGF0ZSBSVElOIHRyaWFuZ2xlIGNvb3JkaW5hdGVzXG5mb3IgKGxldCBpID0gMDsgaSA8IG51bVRyaWFuZ2xlczsgaSsrKSB7XG4gICAgbGV0IGlkID0gaSArIDI7XG4gICAgbGV0IGF4ID0gMCwgYXkgPSAwLCBieCA9IDAsIGJ5ID0gMCwgY3ggPSAwLCBjeSA9IDA7XG5cbiAgICBpZiAoaWQgJiAxKSB7XG4gICAgICAgIGJ4ID0gYnkgPSBjeCA9IG1lc2hTaXplOyAvLyBib3R0b20tbGVmdCB0cmlhbmdsZVxuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXggPSBheSA9IGN5ID0gbWVzaFNpemU7IC8vIHRvcC1yaWdodCB0cmlhbmdsZVxuICAgIH1cblxuICAgIHdoaWxlICgoaWQgPj49IDEpID4gMSkge1xuICAgICAgICBjb25zdCBteCA9IChheCArIGJ4KSA+PiAxO1xuICAgICAgICBjb25zdCBteSA9IChheSArIGJ5KSA+PiAxO1xuXG4gICAgICAgIGlmIChpZCAmIDEpIHsgLy8gbGVmdCBoYWxmXG4gICAgICAgICAgICBieCA9IGF4OyBieSA9IGF5O1xuICAgICAgICAgICAgYXggPSBjeDsgYXkgPSBjeTtcblxuICAgICAgICB9IGVsc2UgeyAvLyByaWdodCBoYWxmXG4gICAgICAgICAgICBheCA9IGJ4OyBheSA9IGJ5O1xuICAgICAgICAgICAgYnggPSBjeDsgYnkgPSBjeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN4ID0gbXg7IGN5ID0gbXk7XG4gICAgfVxuXG4gICAgY29uc3QgayA9IGkgKiA0O1xuICAgIGNvb3Jkc1trICsgMF0gPSBheDtcbiAgICBjb29yZHNbayArIDFdID0gYXk7XG4gICAgY29vcmRzW2sgKyAyXSA9IGJ4O1xuICAgIGNvb3Jkc1trICsgM10gPSBieTtcbn1cblxuLy8gdGVtcG9yYXJ5IGFycmF5cyB3ZSdsbCByZXVzZSBmb3IgTUFSVElOSSBtZXNoIGNvZGVcbmNvbnN0IHJlcHJvamVjdGVkQ29vcmRzID0gbmV3IFVpbnQxNkFycmF5KGdyaWRTaXplICogZ3JpZFNpemUgKiAyKTtcbmNvbnN0IHVzZWQgPSBuZXcgVWludDhBcnJheShncmlkU2l6ZSAqIGdyaWRTaXplKTtcbmNvbnN0IGluZGV4TWFwID0gbmV3IFVpbnQxNkFycmF5KGdyaWRTaXplICogZ3JpZFNpemUpO1xuXG50eXBlIFRpbGVNZXNoID0ge1xuICAgIHZlcnRpY2VzOiBUaWxlQm91bmRzQXJyYXksXG4gICAgaW5kaWNlczogVHJpYW5nbGVJbmRleEFycmF5XG59O1xuXG4vLyBUaGVyZSBjYW4gYmUgdmlzaWJsZSBzZWFtcyBiZXR3ZWVuIG5laWdoYm91cmluZyB0aWxlcyBiZWNhdXNlIG9mIHByZWNpc2lvbiBpc3N1ZXNcbi8vIGFuZCByZXNhbXBsaW5nIGRpZmZlcmVuY2VzLiBBZGRpbmcgYSBiaXQgb2YgcGFkZGluZyBhcm91bmQgdGhlIGVkZ2VzIG9mIHRpbGVzIGhpZGVzXG4vLyBtb3N0IG9mIHRoZXNlIGlzc3Vlcy5cbmNvbnN0IGNvbW1vblJhc3RlclRpbGVTaXplID0gMjU2O1xuY29uc3QgcGFkZGluZ1NpemUgPSBtZXNoU2l6ZSAvIGNvbW1vblJhc3RlclRpbGVTaXplIC8gNDtcbmZ1bmN0aW9uIHNlYW1QYWRkaW5nKG4pIHtcbiAgICBpZiAobiA9PT0gMCkgcmV0dXJuIC1wYWRkaW5nU2l6ZTtcbiAgICBlbHNlIGlmIChuID09PSBncmlkU2l6ZSAtIDEpIHJldHVybiBwYWRkaW5nU2l6ZTtcbiAgICBlbHNlIHJldHVybiAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRUaWxlTWVzaChjYW5vbmljYWw6IENhbm9uaWNhbFRpbGVJRCwgcHJvamVjdGlvbjogUHJvamVjdGlvbik6IFRpbGVNZXNoIHtcbiAgICBjb25zdCBjcyA9IHRpbGVUcmFuc2Zvcm0oY2Fub25pY2FsLCBwcm9qZWN0aW9uKTtcbiAgICBjb25zdCB6MiA9IE1hdGgucG93KDIsIGNhbm9uaWNhbC56KTtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgZ3JpZFNpemU7IHkrKykge1xuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGdyaWRTaXplOyB4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxuZyA9IGxuZ0Zyb21NZXJjYXRvclgoKGNhbm9uaWNhbC54ICsgKHggKyBzZWFtUGFkZGluZyh4KSkgLyBtZXNoU2l6ZSkgLyB6Mik7XG4gICAgICAgICAgICBjb25zdCBsYXQgPSBsYXRGcm9tTWVyY2F0b3JZKChjYW5vbmljYWwueSArICh5ICsgc2VhbVBhZGRpbmcoeSkpIC8gbWVzaFNpemUpIC8gejIpO1xuICAgICAgICAgICAgY29uc3QgcCA9IHByb2plY3Rpb24ucHJvamVjdChsbmcsIGxhdCk7XG4gICAgICAgICAgICBjb25zdCBrID0geSAqIGdyaWRTaXplICsgeDtcbiAgICAgICAgICAgIHJlcHJvamVjdGVkQ29vcmRzWzIgKiBrICsgMF0gPSBNYXRoLnJvdW5kKChwLnggKiBjcy5zY2FsZSAtIGNzLngpICogRVhURU5UKTtcbiAgICAgICAgICAgIHJlcHJvamVjdGVkQ29vcmRzWzIgKiBrICsgMV0gPSBNYXRoLnJvdW5kKChwLnkgKiBjcy5zY2FsZSAtIGNzLnkpICogRVhURU5UKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVzZWQuZmlsbCgwKTtcbiAgICBpbmRleE1hcC5maWxsKDApO1xuXG4gICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBwb3NzaWJsZSB0cmlhbmdsZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHNtYWxsZXN0IGxldmVsXG4gICAgZm9yIChsZXQgaSA9IG51bVRyaWFuZ2xlcyAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IGsgPSBpICogNDtcbiAgICAgICAgY29uc3QgYXggPSBjb29yZHNbayArIDBdO1xuICAgICAgICBjb25zdCBheSA9IGNvb3Jkc1trICsgMV07XG4gICAgICAgIGNvbnN0IGJ4ID0gY29vcmRzW2sgKyAyXTtcbiAgICAgICAgY29uc3QgYnkgPSBjb29yZHNbayArIDNdO1xuICAgICAgICBjb25zdCBteCA9IChheCArIGJ4KSA+PiAxO1xuICAgICAgICBjb25zdCBteSA9IChheSArIGJ5KSA+PiAxO1xuICAgICAgICBjb25zdCBjeCA9IG14ICsgbXkgLSBheTtcbiAgICAgICAgY29uc3QgY3kgPSBteSArIGF4IC0gbXg7XG5cbiAgICAgICAgY29uc3QgYUluZGV4ID0gYXkgKiBncmlkU2l6ZSArIGF4O1xuICAgICAgICBjb25zdCBiSW5kZXggPSBieSAqIGdyaWRTaXplICsgYng7XG4gICAgICAgIGNvbnN0IG1JbmRleCA9IG15ICogZ3JpZFNpemUgKyBteDtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgZXJyb3IgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbG9uZyBlZGdlIG9mIHRoZSB0cmlhbmdsZVxuICAgICAgICBjb25zdCByYXggPSByZXByb2plY3RlZENvb3Jkc1syICogYUluZGV4ICsgMF07XG4gICAgICAgIGNvbnN0IHJheSA9IHJlcHJvamVjdGVkQ29vcmRzWzIgKiBhSW5kZXggKyAxXTtcbiAgICAgICAgY29uc3QgcmJ4ID0gcmVwcm9qZWN0ZWRDb29yZHNbMiAqIGJJbmRleCArIDBdO1xuICAgICAgICBjb25zdCByYnkgPSByZXByb2plY3RlZENvb3Jkc1syICogYkluZGV4ICsgMV07XG4gICAgICAgIGNvbnN0IHJteCA9IHJlcHJvamVjdGVkQ29vcmRzWzIgKiBtSW5kZXggKyAwXTtcbiAgICAgICAgY29uc3Qgcm15ID0gcmVwcm9qZWN0ZWRDb29yZHNbMiAqIG1JbmRleCArIDFdO1xuXG4gICAgICAgIC8vIHJhc3RlciB0aWxlcyBhcmUgdHlwaWNhbGx5IDUxMnB4LCBhbmQgd2UgdXNlIDFweCBhcyBhbiBlcnJvciB0aHJlc2hvbGQ7IDgxOTIgLyA1MTIgPSAxNlxuICAgICAgICBjb25zdCBpc1VzZWQgPSBNYXRoLmh5cG90KChyYXggKyByYngpIC8gMiAtIHJteCwgKHJheSArIHJieSkgLyAyIC0gcm15KSA+PSAxNjtcblxuICAgICAgICB1c2VkW21JbmRleF0gPSB1c2VkW21JbmRleF0gfHwgKGlzVXNlZCA/IDEgOiAwKTtcblxuICAgICAgICBpZiAoaSA8IG51bVBhcmVudFRyaWFuZ2xlcykgeyAvLyBiaWdnZXIgdHJpYW5nbGVzOyBhY2N1bXVsYXRlIGVycm9yIHdpdGggY2hpbGRyZW5cbiAgICAgICAgICAgIGNvbnN0IGxlZnRDaGlsZEluZGV4ID0gKChheSArIGN5KSA+PiAxKSAqIGdyaWRTaXplICsgKChheCArIGN4KSA+PiAxKTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0Q2hpbGRJbmRleCA9ICgoYnkgKyBjeSkgPj4gMSkgKiBncmlkU2l6ZSArICgoYnggKyBjeCkgPj4gMSk7XG4gICAgICAgICAgICB1c2VkW21JbmRleF0gPSB1c2VkW21JbmRleF0gfHwgdXNlZFtsZWZ0Q2hpbGRJbmRleF0gfHwgdXNlZFtyaWdodENoaWxkSW5kZXhdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdmVydGljZXMgPSBuZXcgVGlsZUJvdW5kc0FycmF5KCk7XG4gICAgY29uc3QgaW5kaWNlcyA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcblxuICAgIGxldCBudW1WZXJ0aWNlcyA9IDA7XG5cbiAgICBmdW5jdGlvbiBhZGRWZXJ0ZXgoeCwgeSkge1xuICAgICAgICBjb25zdCBrID0geSAqIGdyaWRTaXplICsgeDtcblxuICAgICAgICBpZiAoaW5kZXhNYXBba10gPT09IDApIHtcbiAgICAgICAgICAgIHZlcnRpY2VzLmVtcGxhY2VCYWNrKFxuICAgICAgICAgICAgICAgIHJlcHJvamVjdGVkQ29vcmRzWzIgKiBrICsgMF0sXG4gICAgICAgICAgICAgICAgcmVwcm9qZWN0ZWRDb29yZHNbMiAqIGsgKyAxXSxcbiAgICAgICAgICAgICAgICB4ICogRVhURU5UIC8gbWVzaFNpemUsXG4gICAgICAgICAgICAgICAgeSAqIEVYVEVOVCAvIG1lc2hTaXplKTtcblxuICAgICAgICAgICAgLy8gc2F2ZSBuZXcgdmVydGV4IGluZGV4IHNvIHRoYXQgd2UgY2FuIHJldXNlIGl0XG4gICAgICAgICAgICBpbmRleE1hcFtrXSA9ICsrbnVtVmVydGljZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5kZXhNYXBba10gLSAxO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFRyaWFuZ2xlcyhheCwgYXksIGJ4LCBieSwgY3gsIGN5KSB7XG4gICAgICAgIGNvbnN0IG14ID0gKGF4ICsgYngpID4+IDE7XG4gICAgICAgIGNvbnN0IG15ID0gKGF5ICsgYnkpID4+IDE7XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKGF4IC0gY3gpICsgTWF0aC5hYnMoYXkgLSBjeSkgPiAxICYmIHVzZWRbbXkgKiBncmlkU2l6ZSArIG14XSkge1xuICAgICAgICAgICAgLy8gdHJpYW5nbGUgZG9lc24ndCBhcHByb3hpbWF0ZSB0aGUgc3VyZmFjZSB3ZWxsIGVub3VnaDsgZHJpbGwgZG93biBmdXJ0aGVyXG4gICAgICAgICAgICBhZGRUcmlhbmdsZXMoY3gsIGN5LCBheCwgYXksIG14LCBteSk7XG4gICAgICAgICAgICBhZGRUcmlhbmdsZXMoYngsIGJ5LCBjeCwgY3ksIG14LCBteSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGFpID0gYWRkVmVydGV4KGF4LCBheSk7XG4gICAgICAgICAgICBjb25zdCBiaSA9IGFkZFZlcnRleChieCwgYnkpO1xuICAgICAgICAgICAgY29uc3QgY2kgPSBhZGRWZXJ0ZXgoY3gsIGN5KTtcbiAgICAgICAgICAgIGluZGljZXMuZW1wbGFjZUJhY2soYWksIGJpLCBjaSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRUcmlhbmdsZXMoMCwgMCwgbWVzaFNpemUsIG1lc2hTaXplLCBtZXNoU2l6ZSwgMCk7XG4gICAgYWRkVHJpYW5nbGVzKG1lc2hTaXplLCBtZXNoU2l6ZSwgMCwgMCwgMCwgbWVzaFNpemUpO1xuXG4gICAgcmV0dXJuIHt2ZXJ0aWNlcywgaW5kaWNlc307XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtjcmVhdGVMYXlvdXR9IGZyb20gJy4uL3V0aWwvc3RydWN0X2FycmF5LmpzJztcblxuaW1wb3J0IHR5cGUge1N0cnVjdEFycmF5TGF5b3V0fSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3MnLCB0eXBlOiAnSW50MTYnLCBjb21wb25lbnRzOiAyfSxcbiAgICB7bmFtZTogJ2FfdGV4dHVyZV9wb3MnLCB0eXBlOiAnSW50MTYnLCBjb21wb25lbnRzOiAyfVxuXSk6IFN0cnVjdEFycmF5TGF5b3V0KTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7dW5pcXVlSWQsIHBhcnNlQ2FjaGVDb250cm9sfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtkZXNlcmlhbGl6ZSBhcyBkZXNlcmlhbGl6ZUJ1Y2tldH0gZnJvbSAnLi4vZGF0YS9idWNrZXQuanMnO1xuaW1wb3J0IEZlYXR1cmVJbmRleCBmcm9tICcuLi9kYXRhL2ZlYXR1cmVfaW5kZXguanMnO1xuaW1wb3J0IEdlb0pTT05GZWF0dXJlIGZyb20gJy4uL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uLmpzJztcbmltcG9ydCBmZWF0dXJlRmlsdGVyIGZyb20gJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXIvaW5kZXguanMnO1xuaW1wb3J0IFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCB7Q29sbGlzaW9uQm94QXJyYXksIFRpbGVCb3VuZHNBcnJheSwgUG9zQXJyYXksIFRyaWFuZ2xlSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheSwgUG9zR2xvYmVFeHRBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9yZW5kZXIvdGV4dHVyZS5qcyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuaW1wb3J0IHtEZWJ1Z30gZnJvbSAnLi4vdXRpbC9kZWJ1Zy5qcyc7XG5pbXBvcnQgdG9FdmFsdWF0aW9uRmVhdHVyZSBmcm9tICcuLi9kYXRhL2V2YWx1YXRpb25fZmVhdHVyZS5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCBTb3VyY2VGZWF0dXJlU3RhdGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9zdGF0ZS5qcyc7XG5pbXBvcnQge2xhenlMb2FkUlRMVGV4dFBsdWdpbn0gZnJvbSAnLi9ydGxfdGV4dF9wbHVnaW4uanMnO1xuaW1wb3J0IHtUaWxlU3BhY2VEZWJ1Z0J1ZmZlcn0gZnJvbSAnLi4vZGF0YS9kZWJ1Z192aXouanMnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4uL2RhdGEvbG9hZF9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgZWFyY3V0IGZyb20gJ2VhcmN1dCc7XG5pbXBvcnQgZ2V0VGlsZU1lc2ggZnJvbSAnLi90aWxlX21lc2guanMnO1xuaW1wb3J0IHRpbGVUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuXG5pbXBvcnQgYm91bmRzQXR0cmlidXRlcyBmcm9tICcuLi9kYXRhL2JvdW5kc19hdHRyaWJ1dGVzLmpzJztcbmltcG9ydCBwb3NBdHRyaWJ1dGVzLCB7cG9zQXR0cmlidXRlc0dsb2JlRXh0fSBmcm9tICcuLi9kYXRhL3Bvc19hdHRyaWJ1dGVzLmpzJztcblxuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQuanMnO1xuXG5jb25zdCBDTE9DS19TS0VXX1JFVFJZX1RJTUVPVVQgPSAzMDAwMDtcblxuaW1wb3J0IHR5cGUge0J1Y2tldH0gZnJvbSAnLi4vZGF0YS9idWNrZXQuanMnO1xuaW1wb3J0IEZpbGxCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvZmlsbF9idWNrZXQuanMnO1xuaW1wb3J0IExpbmVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvbGluZV9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7V29ya2VyVGlsZVJlc3VsdH0gZnJvbSAnLi93b3JrZXJfc291cmNlLmpzJztcbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgREVNRGF0YSBmcm9tICcuLi9kYXRhL2RlbV9kYXRhLmpzJztcbmltcG9ydCB0eXBlIHtBbHBoYUltYWdlLCBTcHJpdGVQb3NpdGlvbnN9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHR5cGUgSW1hZ2VBdGxhcyBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfYXRsYXMuanMnO1xuaW1wb3J0IHR5cGUgTGluZUF0bGFzIGZyb20gJy4uL3JlbmRlci9saW5lX2F0bGFzLmpzJztcbmltcG9ydCB0eXBlIEltYWdlTWFuYWdlciBmcm9tICcuLi9yZW5kZXIvaW1hZ2VfbWFuYWdlci5qcyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge0Nhbm9uaWNhbFRpbGVJRCwgT3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIEZyYW1lYnVmZmVyIGZyb20gJy4uL2dsL2ZyYW1lYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtMYXllckZlYXR1cmVTdGF0ZXN9IGZyb20gJy4vc291cmNlX3N0YXRlLmpzJztcbmltcG9ydCB0eXBlIHtDYW5jZWxhYmxlfSBmcm9tICcuLi90eXBlcy9jYW5jZWxhYmxlLmpzJztcbmltcG9ydCB0eXBlIHtGaWx0ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlc3BhY2VRdWVyeUdlb21ldHJ5fSBmcm9tICcuLi9zdHlsZS9xdWVyeV9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgUHJvamVjdGlvbiBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9wcm9qZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlVHJhbnNmb3JtfSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi90aWxlX3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSB7UXVlcnlSZXN1bHR9IGZyb20gJy4uL2RhdGEvZmVhdHVyZV9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3JlbmRlci9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIHtRdWVyeUZlYXR1cmV9IGZyb20gJy4uL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uLmpzJztcbmltcG9ydCB7Z2xvYmVUaWxlQm91bmRzLCAgZ2xvYmVOb3JtYWxpemVFQ0VGLCB0aWxlQ29vcmRUb0VDRUZ9IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL2dsb2JlX3V0aWwuanMnO1xuaW1wb3J0IHt2ZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHR5cGUge1RleHR1cmVJbWFnZX0gZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUuanMnO1xuXG5leHBvcnQgdHlwZSBUaWxlU3RhdGUgPVxuICAgIHwgJ2xvYWRpbmcnICAgLy8gVGlsZSBkYXRhIGlzIGluIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcuXG4gICAgfCAnbG9hZGVkJyAgICAvLyBUaWxlIGRhdGEgaGFzIGJlZW4gbG9hZGVkLiBUaWxlIGNhbiBiZSByZW5kZXJlZC5cbiAgICB8ICdyZWxvYWRpbmcnIC8vIFRpbGUgZGF0YSBoYXMgYmVlbiBsb2FkZWQgYW5kIGlzIGJlaW5nIHVwZGF0ZWQuIFRpbGUgY2FuIGJlIHJlbmRlcmVkLlxuICAgIHwgJ3VubG9hZGVkJyAgLy8gVGlsZSBkYXRhIGhhcyBiZWVuIGRlbGV0ZWQuXG4gICAgfCAnZXJyb3JlZCcgICAvLyBUaWxlIGRhdGEgd2FzIG5vdCBsb2FkZWQgYmVjYXVzZSBvZiBhbiBlcnJvci5cbiAgICB8ICdleHBpcmVkJzsgIC8qIFRpbGUgZGF0YSB3YXMgcHJldmlvdXNseSBsb2FkZWQsIGJ1dCBoYXMgZXhwaXJlZCBwZXIgaXRzXG4gICAgICAgICAgICAgICAgICAgKiBIVFRQIGhlYWRlcnMgYW5kIGlzIGluIHRoZSBwcm9jZXNzIG9mIHJlZnJlc2hpbmcuICovXG5cbi8vIGEgdGlsZSBib3VuZHMgb3V0bGluZSB1c2VkIGZvciBnZXR0aW5nIHJlcHJvamVjdGVkIHRpbGUgZ2VvbWV0cnkgaW4gbm9uLW1lcmNhdG9yIHByb2plY3Rpb25zXG5jb25zdCBCT1VORFNfRkVBVFVSRSA9ICgoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogMixcbiAgICAgICAgZXh0ZW50OiBFWFRFTlQsXG4gICAgICAgIGxvYWRHZW9tZXRyeSgpIHtcbiAgICAgICAgICAgIHJldHVybiBbW1xuICAgICAgICAgICAgICAgIG5ldyBQb2ludCgwLCAwKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoRVhURU5UICsgMSwgMCksXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KEVYVEVOVCArIDEsIEVYVEVOVCArIDEpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludCgwLCBFWFRFTlQgKyAxKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoMCwgMClcbiAgICAgICAgICAgIF1dO1xuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogQSB0aWxlIG9iamVjdCBpcyB0aGUgY29tYmluYXRpb24gb2YgYSBDb29yZGluYXRlLCB3aGljaCBkZWZpbmVzXG4gKiBpdHMgcGxhY2UsIGFzIHdlbGwgYXMgYSB1bmlxdWUgSUQgYW5kIGRhdGEgdHJhY2tpbmcgZm9yIGl0cyBjb250ZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVGlsZSB7XG4gICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEO1xuICAgIHVpZDogbnVtYmVyO1xuICAgIHVzZXM6IG51bWJlcjtcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuICAgIHRpbGVab29tOiBudW1iZXI7XG4gICAgYnVja2V0czoge1tfOiBzdHJpbmddOiBCdWNrZXR9O1xuICAgIGxhdGVzdEZlYXR1cmVJbmRleDogP0ZlYXR1cmVJbmRleDtcbiAgICBsYXRlc3RSYXdUaWxlRGF0YTogP0FycmF5QnVmZmVyO1xuICAgIGltYWdlQXRsYXM6ID9JbWFnZUF0bGFzO1xuICAgIGltYWdlQXRsYXNUZXh0dXJlOiBUZXh0dXJlO1xuICAgIGxpbmVBdGxhczogP0xpbmVBdGxhcztcbiAgICBsaW5lQXRsYXNUZXh0dXJlOiBUZXh0dXJlO1xuICAgIGdseXBoQXRsYXNJbWFnZTogP0FscGhhSW1hZ2U7XG4gICAgZ2x5cGhBdGxhc1RleHR1cmU6IFRleHR1cmU7XG4gICAgZXhwaXJhdGlvblRpbWU6IGFueTtcbiAgICBleHBpcmVkUmVxdWVzdENvdW50OiBudW1iZXI7XG4gICAgc3RhdGU6IFRpbGVTdGF0ZTtcbiAgICB0aW1lQWRkZWQ6IGFueTtcbiAgICBmYWRlRW5kVGltZTogYW55O1xuICAgIGNvbGxpc2lvbkJveEFycmF5OiA/Q29sbGlzaW9uQm94QXJyYXk7XG4gICAgcmVkb1doZW5Eb25lOiBib29sZWFuO1xuICAgIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbjtcbiAgICBwbGFjZW1lbnRTb3VyY2U6IGFueTtcbiAgICBhY3RvcjogP0FjdG9yO1xuICAgIHZ0TGF5ZXJzOiB7W186IHN0cmluZ106IFZlY3RvclRpbGVMYXllcn07XG4gICAgaXNTeW1ib2xUaWxlOiA/Ym9vbGVhbjtcbiAgICBpc1Jhc3RlcjogP2Jvb2xlYW47XG4gICAgX3RpbGVUcmFuc2Zvcm06IFRpbGVUcmFuc2Zvcm07XG5cbiAgICBuZWlnaGJvcmluZ1RpbGVzOiA/T2JqZWN0O1xuICAgIGRlbTogP0RFTURhdGE7XG4gICAgYWJvcnRlZDogP2Jvb2xlYW47XG4gICAgbmVlZHNIaWxsc2hhZGVQcmVwYXJlOiA/Ym9vbGVhbjtcbiAgICBuZWVkc0RFTVRleHR1cmVVcGxvYWQ6ID9ib29sZWFuO1xuICAgIHJlcXVlc3Q6ID9DYW5jZWxhYmxlO1xuICAgIHRleHR1cmU6IGFueTtcbiAgICBmYm86ID9GcmFtZWJ1ZmZlcjtcbiAgICBkZW1UZXh0dXJlOiA/VGV4dHVyZTtcbiAgICByZWZyZXNoZWRVcG9uRXhwaXJhdGlvbjogYm9vbGVhbjtcbiAgICByZWxvYWRDYWxsYmFjazogYW55O1xuICAgIHJlc291cmNlVGltaW5nOiA/QXJyYXk8UGVyZm9ybWFuY2VSZXNvdXJjZVRpbWluZz47XG4gICAgcXVlcnlQYWRkaW5nOiBudW1iZXI7XG5cbiAgICBzeW1ib2xGYWRlSG9sZFVudGlsOiA/bnVtYmVyO1xuICAgIGhhc1N5bWJvbEJ1Y2tldHM6IGJvb2xlYW47XG4gICAgaGFzUlRMVGV4dDogYm9vbGVhbjtcbiAgICBkZXBlbmRlbmNpZXM6IE9iamVjdDtcbiAgICBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uO1xuXG4gICAgcXVlcnlHZW9tZXRyeURlYnVnVml6OiA/VGlsZVNwYWNlRGVidWdCdWZmZXI7XG4gICAgcXVlcnlCb3VuZHNEZWJ1Z1ZpejogP1RpbGVTcGFjZURlYnVnQnVmZmVyO1xuXG4gICAgX3RpbGVEZWJ1Z0J1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBfdGlsZUJvdW5kc0J1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBfdGlsZURlYnVnSW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuICAgIF90aWxlQm91bmRzSW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuICAgIF90aWxlRGVidWdTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICBfdGlsZUJvdW5kc1NlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIF9nbG9iZVRpbGVEZWJ1Z0JvcmRlckJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBfdGlsZURlYnVnVGV4dEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBfdGlsZURlYnVnVGV4dFNlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIF90aWxlRGVidWdUZXh0SW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyO1xuICAgIF9nbG9iZVRpbGVEZWJ1Z1RleHRCdWZmZXI6ID9WZXJ0ZXhCdWZmZXI7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge092ZXJzY2FsZWRUaWxlSUR9IHRpbGVJRFxuICAgICAqIEBwYXJhbSBzaXplXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHNpemU6IG51bWJlciwgdGlsZVpvb206IG51bWJlciwgcGFpbnRlcjogYW55LCBpc1Jhc3Rlcj86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy50aWxlSUQgPSB0aWxlSUQ7XG4gICAgICAgIHRoaXMudWlkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgdGhpcy51c2VzID0gMDtcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMudGlsZVpvb20gPSB0aWxlWm9vbTtcbiAgICAgICAgdGhpcy5idWNrZXRzID0ge307XG4gICAgICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBudWxsO1xuICAgICAgICB0aGlzLnF1ZXJ5UGFkZGluZyA9IDA7XG4gICAgICAgIHRoaXMuaGFzU3ltYm9sQnVja2V0cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhhc1JUTFRleHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSB7fTtcbiAgICAgICAgdGhpcy5pc1Jhc3RlciA9IGlzUmFzdGVyO1xuXG4gICAgICAgIC8vIENvdW50cyB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcmVzcG9uc2Ugd2FzIGFscmVhZHkgZXhwaXJlZCB3aGVuXG4gICAgICAgIC8vIHJlY2VpdmVkLiBXZSdyZSB1c2luZyB0aGlzIHRvIGFkZCBhIGRlbGF5IHdoZW4gbWFraW5nIGEgbmV3IHJlcXVlc3RcbiAgICAgICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIHJldHJ5aW5nIGltbWVkaWF0ZWx5IGluIGNhc2Ugb2YgYSBzZXJ2ZXJcbiAgICAgICAgLy8gc2VydmluZyBleHBpcmVkIHRpbGVzLlxuICAgICAgICB0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQgPSAwO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSAnbG9hZGluZyc7XG5cbiAgICAgICAgaWYgKHBhaW50ZXIgJiYgcGFpbnRlci50cmFuc2Zvcm0pIHtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdGlvbiA9IHBhaW50ZXIudHJhbnNmb3JtLnByb2plY3Rpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWdpc3RlckZhZGVEdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGZhZGVFbmRUaW1lID0gZHVyYXRpb24gKyB0aGlzLnRpbWVBZGRlZDtcbiAgICAgICAgaWYgKGZhZGVFbmRUaW1lIDwgYnJvd3Nlci5ub3coKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5mYWRlRW5kVGltZSAmJiBmYWRlRW5kVGltZSA8IHRoaXMuZmFkZUVuZFRpbWUpIHJldHVybjtcblxuICAgICAgICB0aGlzLmZhZGVFbmRUaW1lID0gZmFkZUVuZFRpbWU7XG4gICAgfVxuXG4gICAgd2FzUmVxdWVzdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gJ2Vycm9yZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdsb2FkZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdyZWxvYWRpbmcnO1xuICAgIH1cblxuICAgIGdldCB0aWxlVHJhbnNmb3JtKCk6IFRpbGVUcmFuc2Zvcm0ge1xuICAgICAgICBpZiAoIXRoaXMuX3RpbGVUcmFuc2Zvcm0pIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVUcmFuc2Zvcm0gPSB0aWxlVHJhbnNmb3JtKHRoaXMudGlsZUlELmNhbm9uaWNhbCwgdGhpcy5wcm9qZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdGlsZVRyYW5zZm9ybTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGRhdGEgb2JqZWN0IHdpdGggYSAnYnVmZmVycycgcHJvcGVydHksIGxvYWQgaXQgaW50b1xuICAgICAqIHRoaXMgdGlsZSdzIGVsZW1lbnRHcm91cHMgYW5kIGJ1ZmZlcnMgcHJvcGVydGllcyBhbmQgc2V0IGxvYWRlZFxuICAgICAqIHRvIHRydWUuIElmIHRoZSBkYXRhIGlzIG51bGwsIGxpa2UgaW4gdGhlIGNhc2Ugb2YgYW4gZW1wdHlcbiAgICAgKiBHZW9KU09OIHRpbGUsIG5vLW9wIGJ1dCBzdGlsbCBzZXQgbG9hZGVkIHRvIHRydWUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKiBAcGFyYW0gcGFpbnRlclxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2FkVmVjdG9yRGF0YShkYXRhOiA/V29ya2VyVGlsZVJlc3VsdCwgcGFpbnRlcjogYW55LCBqdXN0UmVsb2FkZWQ6ID9ib29sZWFuKSB7XG4gICAgICAgIHRoaXMudW5sb2FkVmVjdG9yRGF0YSgpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSAnbG9hZGVkJztcblxuICAgICAgICAvLyBlbXB0eSBHZW9KU09OIHRpbGVcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gbmV3IENvbGxpc2lvbkJveEFycmF5KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YS5mZWF0dXJlSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4ID0gZGF0YS5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICBpZiAoZGF0YS5yYXdUaWxlRGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgdmVjdG9yIHRpbGVzIGhhdmUgcmF3VGlsZURhdGEsIGFuZCB0aGV5IHdvbid0IHVwZGF0ZSBpdCBmb3JcbiAgICAgICAgICAgICAgICAvLyAncmVsb2FkVGlsZSdcbiAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdFJhd1RpbGVEYXRhID0gZGF0YS5yYXdUaWxlRGF0YTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5yYXdUaWxlRGF0YSA9IGRhdGEucmF3VGlsZURhdGE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGF0ZXN0UmF3VGlsZURhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiByYXdUaWxlRGF0YSBoYXNuJ3QgdXBkYXRlZCwgaG9sZCBvbnRvIGEgcG9pbnRlciB0byB0aGUgbGFzdFxuICAgICAgICAgICAgICAgIC8vIG9uZSB3ZSByZWNlaXZlZFxuICAgICAgICAgICAgICAgIHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LnJhd1RpbGVEYXRhID0gdGhpcy5sYXRlc3RSYXdUaWxlRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gZGF0YS5jb2xsaXNpb25Cb3hBcnJheTtcbiAgICAgICAgdGhpcy5idWNrZXRzID0gZGVzZXJpYWxpemVCdWNrZXQoZGF0YS5idWNrZXRzLCBwYWludGVyLnN0eWxlKTtcblxuICAgICAgICB0aGlzLmhhc1N5bWJvbEJ1Y2tldHMgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMuYnVja2V0c1tpZF07XG4gICAgICAgICAgICBpZiAoYnVja2V0IGluc3RhbmNlb2YgU3ltYm9sQnVja2V0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNTeW1ib2xCdWNrZXRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoanVzdFJlbG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5qdXN0UmVsb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFzUlRMVGV4dCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5oYXNTeW1ib2xCdWNrZXRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IHRoaXMuYnVja2V0c1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKGJ1Y2tldCBpbnN0YW5jZW9mIFN5bWJvbEJ1Y2tldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnVja2V0Lmhhc1JUTFRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzUlRMVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXp5TG9hZFJUTFRleHRQbHVnaW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWVyeVBhZGRpbmcgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gdGhpcy5idWNrZXRzW2lkXTtcbiAgICAgICAgICAgIHRoaXMucXVlcnlQYWRkaW5nID0gTWF0aC5tYXgodGhpcy5xdWVyeVBhZGRpbmcsIHBhaW50ZXIuc3R5bGUuZ2V0TGF5ZXIoaWQpLnF1ZXJ5UmFkaXVzKGJ1Y2tldCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEuaW1hZ2VBdGxhcykge1xuICAgICAgICAgICAgdGhpcy5pbWFnZUF0bGFzID0gZGF0YS5pbWFnZUF0bGFzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLmdseXBoQXRsYXNJbWFnZSkge1xuICAgICAgICAgICAgdGhpcy5nbHlwaEF0bGFzSW1hZ2UgPSBkYXRhLmdseXBoQXRsYXNJbWFnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5saW5lQXRsYXMpIHtcbiAgICAgICAgICAgIHRoaXMubGluZUF0bGFzID0gZGF0YS5saW5lQXRsYXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlIGFueSBkYXRhIG9yIFdlYkdMIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoaXMgdGlsZS5cbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdW5sb2FkVmVjdG9yRGF0YSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc0RhdGEoKSkgcmV0dXJuO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5idWNrZXRzKSB7XG4gICAgICAgICAgICB0aGlzLmJ1Y2tldHNbaWRdLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1Y2tldHMgPSB7fTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlQXRsYXMgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGluZUF0bGFzKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVBdGxhcyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbWFnZUF0bGFzVGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZUF0bGFzVGV4dHVyZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nbHlwaEF0bGFzVGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5nbHlwaEF0bGFzVGV4dHVyZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5saW5lQXRsYXNUZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVBdGxhc1RleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3RpbGVCb3VuZHNCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVCb3VuZHNCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fdGlsZUJvdW5kc0luZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVCb3VuZHNTZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl90aWxlQm91bmRzQnVmZmVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl90aWxlRGVidWdCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVEZWJ1Z0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl90aWxlRGVidWdJbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl90aWxlRGVidWdTZWdtZW50cy5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl90aWxlRGVidWdCdWZmZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2dsb2JlVGlsZURlYnVnQm9yZGVyQnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9nbG9iZVRpbGVEZWJ1Z0JvcmRlckJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9nbG9iZVRpbGVEZWJ1Z0JvcmRlckJ1ZmZlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fdGlsZURlYnVnVGV4dEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5fdGlsZURlYnVnVGV4dEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl90aWxlRGVidWdUZXh0U2VnbWVudHMuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fdGlsZURlYnVnVGV4dEluZGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVEZWJ1Z1RleHRCdWZmZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2dsb2JlVGlsZURlYnVnVGV4dEJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5fZ2xvYmVUaWxlRGVidWdUZXh0QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX2dsb2JlVGlsZURlYnVnVGV4dEJ1ZmZlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBEZWJ1Zy5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlHZW9tZXRyeURlYnVnVml6KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeUdlb21ldHJ5RGVidWdWaXoudW5sb2FkKCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucXVlcnlHZW9tZXRyeURlYnVnVml6O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlCb3VuZHNEZWJ1Z1Zpeikge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlCb3VuZHNEZWJ1Z1Zpei51bmxvYWQoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5xdWVyeUJvdW5kc0RlYnVnVml6O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXggPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXRlID0gJ3VubG9hZGVkJztcbiAgICB9XG5cbiAgICBnZXRCdWNrZXQobGF5ZXI6IFN0eWxlTGF5ZXIpOiBCdWNrZXQge1xuICAgICAgICByZXR1cm4gdGhpcy5idWNrZXRzW2xheWVyLmlkXTtcbiAgICB9XG5cbiAgICB1cGxvYWQoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gdGhpcy5idWNrZXRzW2lkXTtcbiAgICAgICAgICAgIGlmIChidWNrZXQudXBsb2FkUGVuZGluZygpKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0LnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VBdGxhcyAmJiAhdGhpcy5pbWFnZUF0bGFzLnVwbG9hZGVkKSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlQXRsYXNUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5pbWFnZUF0bGFzLmltYWdlLCBnbC5SR0JBKTtcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VBdGxhcy51cGxvYWRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5nbHlwaEF0bGFzSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBdGxhc1RleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB0aGlzLmdseXBoQXRsYXNJbWFnZSwgZ2wuQUxQSEEpO1xuICAgICAgICAgICAgdGhpcy5nbHlwaEF0bGFzSW1hZ2UgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGluZUF0bGFzICYmICF0aGlzLmxpbmVBdGxhcy51cGxvYWRlZCkge1xuICAgICAgICAgICAgdGhpcy5saW5lQXRsYXNUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy5saW5lQXRsYXMuaW1hZ2UsIGdsLkFMUEhBKTtcbiAgICAgICAgICAgIHRoaXMubGluZUF0bGFzLnVwbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByZXBhcmUoaW1hZ2VNYW5hZ2VyOiBJbWFnZU1hbmFnZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VBdGxhcykge1xuICAgICAgICAgICAgdGhpcy5pbWFnZUF0bGFzLnBhdGNoVXBkYXRlZEltYWdlcyhpbWFnZU1hbmFnZXIsIHRoaXMuaW1hZ2VBdGxhc1RleHR1cmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUXVlcmllcyBub24tc3ltYm9sIGZlYXR1cmVzIHJlbmRlcmVkIGZvciB0aGlzIHRpbGUuXG4gICAgLy8gU3ltYm9sIGZlYXR1cmVzIGFyZSBxdWVyaWVkIGdsb2JhbGx5XG4gICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKGxheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZExheWVyczoge1tzdHJpbmddOiBPYmplY3R9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGZWF0dXJlU3RhdGU6IFNvdXJjZUZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZVJlc3VsdDogVGlsZXNwYWNlUXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IGZpbHRlcjogRmlsdGVyU3BlY2lmaWNhdGlvbiwgbGF5ZXJzOiBBcnJheTxzdHJpbmc+LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbGl6ZVF1ZXJ5R2VvbWV0cnk6IGJvb2xlYW4pOiBRdWVyeVJlc3VsdCB7XG4gICAgICAgIERlYnVnLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodmlzdWFsaXplUXVlcnlHZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIGxldCBnZW9tZXRyeVZpeiA9IHRoaXMucXVlcnlHZW9tZXRyeURlYnVnVml6O1xuICAgICAgICAgICAgICAgIGxldCBib3VuZHNWaXogPSB0aGlzLnF1ZXJ5Qm91bmRzRGVidWdWaXo7XG4gICAgICAgICAgICAgICAgaWYgKCFnZW9tZXRyeVZpeikge1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeVZpeiA9IHRoaXMucXVlcnlHZW9tZXRyeURlYnVnVml6ID0gbmV3IFRpbGVTcGFjZURlYnVnQnVmZmVyKHRoaXMudGlsZVNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWJvdW5kc1Zpeikge1xuICAgICAgICAgICAgICAgICAgICBib3VuZHNWaXogPSB0aGlzLnF1ZXJ5Qm91bmRzRGVidWdWaXogPSBuZXcgVGlsZVNwYWNlRGVidWdCdWZmZXIodGhpcy50aWxlU2l6ZSwgQ29sb3IuYmx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnlWaXouYWRkUG9pbnRzKHRpbGVSZXN1bHQudGlsZXNwYWNlR2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgIGJvdW5kc1Zpei5hZGRQb2ludHModGlsZVJlc3VsdC5idWZmZXJlZFRpbGVzcGFjZUdlb21ldHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmxhdGVzdEZlYXR1cmVJbmRleCB8fCAhdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEpXG4gICAgICAgICAgICByZXR1cm4ge307XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4LnF1ZXJ5KHtcbiAgICAgICAgICAgIHRpbGVSZXN1bHQsXG4gICAgICAgICAgICBwaXhlbFBvc01hdHJpeCxcbiAgICAgICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgIHRpbGVUcmFuc2Zvcm06IHRoaXMudGlsZVRyYW5zZm9ybVxuICAgICAgICB9LCBsYXllcnMsIHNlcmlhbGl6ZWRMYXllcnMsIHNvdXJjZUZlYXR1cmVTdGF0ZSk7XG4gICAgfVxuXG4gICAgcXVlcnlTb3VyY2VGZWF0dXJlcyhyZXN1bHQ6IEFycmF5PFF1ZXJ5RmVhdHVyZT4sIHBhcmFtczogYW55KSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVJbmRleCA9IHRoaXMubGF0ZXN0RmVhdHVyZUluZGV4O1xuICAgICAgICBpZiAoIWZlYXR1cmVJbmRleCB8fCAhZmVhdHVyZUluZGV4LnJhd1RpbGVEYXRhKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdnRMYXllcnMgPSBmZWF0dXJlSW5kZXgubG9hZFZUTGF5ZXJzKCk7XG5cbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBwYXJhbXMgPyBwYXJhbXMuc291cmNlTGF5ZXIgOiAnJztcbiAgICAgICAgY29uc3QgbGF5ZXIgPSB2dExheWVycy5fZ2VvanNvblRpbGVMYXllciB8fCB2dExheWVyc1tzb3VyY2VMYXllcl07XG5cbiAgICAgICAgaWYgKCFsYXllcikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlciA9IGZlYXR1cmVGaWx0ZXIocGFyYW1zICYmIHBhcmFtcy5maWx0ZXIpO1xuICAgICAgICBjb25zdCB7eiwgeCwgeX0gPSB0aGlzLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IGNvb3JkID0ge3osIHgsIHl9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBsYXllci5mZWF0dXJlKGkpO1xuICAgICAgICAgICAgaWYgKGZpbHRlci5uZWVkR2VvbWV0cnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmFsdWF0aW9uRmVhdHVyZSA9IHRvRXZhbHVhdGlvbkZlYXR1cmUoZmVhdHVyZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIuZmlsdGVyKG5ldyBFdmFsdWF0aW9uUGFyYW1ldGVycyh0aGlzLnRpbGVJRC5vdmVyc2NhbGVkWiksIGV2YWx1YXRpb25GZWF0dXJlLCB0aGlzLnRpbGVJRC5jYW5vbmljYWwpKSBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZpbHRlci5maWx0ZXIobmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHRoaXMudGlsZUlELm92ZXJzY2FsZWRaKSwgZmVhdHVyZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gZmVhdHVyZUluZGV4LmdldElkKGZlYXR1cmUsIHNvdXJjZUxheWVyKTtcbiAgICAgICAgICAgIGNvbnN0IGdlb2pzb25GZWF0dXJlID0gbmV3IEdlb0pTT05GZWF0dXJlKGZlYXR1cmUsIHosIHgsIHksIGlkKTtcbiAgICAgICAgICAgIGdlb2pzb25GZWF0dXJlLnRpbGUgPSBjb29yZDtcblxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZ2VvanNvbkZlYXR1cmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFzRGF0YSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUgPT09ICdsb2FkZWQnIHx8IHRoaXMuc3RhdGUgPT09ICdyZWxvYWRpbmcnIHx8IHRoaXMuc3RhdGUgPT09ICdleHBpcmVkJztcbiAgICB9XG5cbiAgICBwYXR0ZXJuc0xvYWRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5pbWFnZUF0bGFzICYmICEhT2JqZWN0LmtleXModGhpcy5pbWFnZUF0bGFzLnBhdHRlcm5Qb3NpdGlvbnMpLmxlbmd0aDtcbiAgICB9XG5cbiAgICBzZXRFeHBpcnlEYXRhKGRhdGE6IGFueSkge1xuICAgICAgICBjb25zdCBwcmlvciA9IHRoaXMuZXhwaXJhdGlvblRpbWU7XG5cbiAgICAgICAgaWYgKGRhdGEuY2FjaGVDb250cm9sKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRDQyA9IHBhcnNlQ2FjaGVDb250cm9sKGRhdGEuY2FjaGVDb250cm9sKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRDQ1snbWF4LWFnZSddKSB0aGlzLmV4cGlyYXRpb25UaW1lID0gRGF0ZS5ub3coKSArIHBhcnNlZENDWydtYXgtYWdlJ10gKiAxMDAwO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXhwaXJlcykge1xuICAgICAgICAgICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IG5ldyBEYXRlKGRhdGEuZXhwaXJlcykuZ2V0VGltZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgaXNFeHBpcmVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmV4cGlyYXRpb25UaW1lID4gbm93KSB7XG4gICAgICAgICAgICAgICAgaXNFeHBpcmVkID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFwcmlvcikge1xuICAgICAgICAgICAgICAgIGlzRXhwaXJlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXhwaXJhdGlvblRpbWUgPCBwcmlvcikge1xuICAgICAgICAgICAgICAgIC8vIEV4cGlyaW5nIGRhdGUgaXMgZ29pbmcgYmFja3dhcmRzOlxuICAgICAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAgICAgICAgICAgICAgaXNFeHBpcmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9IHRoaXMuZXhwaXJhdGlvblRpbWUgLSBwcmlvcjtcblxuICAgICAgICAgICAgICAgIGlmICghZGVsdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGlzIHNlcnZpbmcgdGhlIHNhbWUgZXhwaXJlZCByZXNvdXJjZSBvdmVyIGFuZCBvdmVyOiBmYWxsXG4gICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gZXhwb25lbnRpYWwgYmFja29mZi5cbiAgICAgICAgICAgICAgICAgICAgaXNFeHBpcmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGVpdGhlciB0aGUgY2xpZW50IG9yIHRoZSBzZXJ2ZXIgY2xvY2sgaXMgd3JvbmcgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBpbnRlcnBvbGF0ZSBhIHZhbGlkIGV4cGlyYXRpb24gZGF0ZSAoZnJvbSB0aGUgY2xpZW50IFBPVilcbiAgICAgICAgICAgICAgICAgICAgLy8gb2JzZXJ2aW5nIGEgbWluaW11bSB0aW1lb3V0LlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGlyYXRpb25UaW1lID0gbm93ICsgTWF0aC5tYXgoZGVsdGEsIENMT0NLX1NLRVdfUkVUUllfVElNRU9VVCk7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0V4cGlyZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQrKztcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2V4cGlyZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0RXhwaXJ5VGltZW91dCgpOiB2b2lkIHwgbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmV4cGlyZWRSZXF1ZXN0Q291bnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTAwMCAqICgxIDw8IE1hdGgubWluKHRoaXMuZXhwaXJlZFJlcXVlc3RDb3VudCAtIDEsIDMxKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1heCB2YWx1ZSBmb3IgYHNldFRpbWVvdXRgIGltcGxlbWVudGF0aW9ucyBpcyBhIDMyIGJpdCBpbnRlZ2VyOyBjYXAgdGhpcyBhY2NvcmRpbmdseVxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLmV4cGlyYXRpb25UaW1lIC0gbmV3IERhdGUoKS5nZXRUaW1lKCksIE1hdGgucG93KDIsIDMxKSAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RmVhdHVyZVN0YXRlKHN0YXRlczogTGF5ZXJGZWF0dXJlU3RhdGVzLCBwYWludGVyOiA/UGFpbnRlcikge1xuICAgICAgICBpZiAoIXRoaXMubGF0ZXN0RmVhdHVyZUluZGV4IHx8XG4gICAgICAgICAgICAhdGhpcy5sYXRlc3RGZWF0dXJlSW5kZXgucmF3VGlsZURhdGEgfHxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0YXRlcykubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAhcGFpbnRlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdnRMYXllcnMgPSB0aGlzLmxhdGVzdEZlYXR1cmVJbmRleC5sb2FkVlRMYXllcnMoKTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlSW1hZ2VzID0gcGFpbnRlci5zdHlsZS5saXN0SW1hZ2VzKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLmJ1Y2tldHMpIHtcbiAgICAgICAgICAgIGlmICghcGFpbnRlci5zdHlsZS5oYXNMYXllcihpZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBidWNrZXQgPSB0aGlzLmJ1Y2tldHNbaWRdO1xuICAgICAgICAgICAgLy8gQnVja2V0cyBhcmUgZ3JvdXBlZCBieSBjb21tb24gc291cmNlLWxheWVyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllcklkID0gYnVja2V0LmxheWVyc1swXVsnc291cmNlTGF5ZXInXSB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB2dExheWVyc1tzb3VyY2VMYXllcklkXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVyU3RhdGVzID0gc3RhdGVzW3NvdXJjZUxheWVySWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VMYXllciB8fCAhc291cmNlTGF5ZXJTdGF0ZXMgfHwgT2JqZWN0LmtleXMoc291cmNlTGF5ZXJTdGF0ZXMpLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdIEZsb3cgY2FuJ3QgaW50ZXJwcmV0IEltYWdlUG9zaXRpb24gYXMgU3ByaXRlUG9zaXRpb24gZm9yIHNvbWUgcmVhc29uIGhlcmVcbiAgICAgICAgICAgIGNvbnN0IGltYWdlUG9zaXRpb25zOiBTcHJpdGVQb3NpdGlvbnMgPSAodGhpcy5pbWFnZUF0bGFzICYmIHRoaXMuaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zKSB8fCB7fTtcbiAgICAgICAgICAgIGJ1Y2tldC51cGRhdGUoc291cmNlTGF5ZXJTdGF0ZXMsIHNvdXJjZUxheWVyLCBhdmFpbGFibGVJbWFnZXMsIGltYWdlUG9zaXRpb25zKTtcbiAgICAgICAgICAgIGlmIChidWNrZXQgaW5zdGFuY2VvZiBMaW5lQnVja2V0IHx8IGJ1Y2tldCBpbnN0YW5jZW9mIEZpbGxCdWNrZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHBhaW50ZXIuc3R5bGUuX2dldFNvdXJjZUNhY2hlKGJ1Y2tldC5sYXllcnNbMF0uc291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpbnRlci5fdGVycmFpbiAmJiBwYWludGVyLl90ZXJyYWluLmVuYWJsZWQgJiYgc291cmNlQ2FjaGUgJiYgYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5uZWVkc1VwbG9hZCkge1xuICAgICAgICAgICAgICAgICAgICBwYWludGVyLl90ZXJyYWluLl9jbGVhclJlbmRlckNhY2hlRm9yVGlsZShzb3VyY2VDYWNoZS5pZCwgdGhpcy50aWxlSUQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gcGFpbnRlciAmJiBwYWludGVyLnN0eWxlICYmIHBhaW50ZXIuc3R5bGUuZ2V0TGF5ZXIoaWQpO1xuICAgICAgICAgICAgaWYgKGxheWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeVBhZGRpbmcgPSBNYXRoLm1heCh0aGlzLnF1ZXJ5UGFkZGluZywgbGF5ZXIucXVlcnlSYWRpdXMoYnVja2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob2xkaW5nRm9yRmFkZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sRmFkZUhvbGRVbnRpbCAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHN5bWJvbEZhZGVGaW5pc2hlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWwgfHwgdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsIDwgYnJvd3Nlci5ub3coKTtcbiAgICB9XG5cbiAgICBjbGVhckZhZGVIb2xkKCkge1xuICAgICAgICB0aGlzLnN5bWJvbEZhZGVIb2xkVW50aWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgc2V0SG9sZER1cmF0aW9uKGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zeW1ib2xGYWRlSG9sZFVudGlsID0gYnJvd3Nlci5ub3coKSArIGR1cmF0aW9uO1xuICAgIH1cblxuICAgIHNldFRleHR1cmUoaW1nOiBUZXh0dXJlSW1hZ2UsIHBhaW50ZXI6IFBhaW50ZXIpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLnRleHR1cmUgPSBwYWludGVyLmdldFRpbGVUZXh0dXJlKGltZy53aWR0aCk7XG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS51cGRhdGUoaW1nLCB7dXNlTWlwbWFwOiB0cnVlfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCBpbWcsIGdsLlJHQkEsIHt1c2VNaXBtYXA6IHRydWV9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICAgICAgICAgIGlmIChjb250ZXh0LmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYykge1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmYoZ2wuVEVYVFVSRV8yRCwgY29udGV4dC5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMuVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIGNvbnRleHQuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljTWF4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldERlcGVuZGVuY2llcyhuYW1lc3BhY2U6IHN0cmluZywgZGVwZW5kZW5jaWVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgZGVwIG9mIGRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgaW5kZXhbZGVwXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNbbmFtZXNwYWNlXSA9IGluZGV4O1xuICAgIH1cblxuICAgIGhhc0RlcGVuZGVuY3kobmFtZXNwYWNlczogQXJyYXk8c3RyaW5nPiwga2V5czogQXJyYXk8c3RyaW5nPik6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBvZiBuYW1lc3BhY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSB0aGlzLmRlcGVuZGVuY2llc1tuYW1lc3BhY2VdO1xuICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY2xlYXJRdWVyeURlYnVnVml6KCkge1xuICAgICAgICBEZWJ1Zy5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlHZW9tZXRyeURlYnVnVml6KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeUdlb21ldHJ5RGVidWdWaXouY2xlYXJQb2ludHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5Qm91bmRzRGVidWdWaXopIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5Qm91bmRzRGVidWdWaXouY2xlYXJQb2ludHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX21ha2VEZWJ1Z1RpbGVCb3VuZHNCdWZmZXJzKGNvbnRleHQ6IENvbnRleHQsIHByb2plY3Rpb246IFByb2plY3Rpb24pIHtcbiAgICAgICAgaWYgKCFwcm9qZWN0aW9uIHx8IHByb2plY3Rpb24ubmFtZSA9PT0gJ21lcmNhdG9yJyB8fCB0aGlzLl90aWxlRGVidWdCdWZmZXIpIHJldHVybjtcblxuICAgICAgICAvLyByZXByb2plY3QgdGlsZSBvdXRsaW5lIHdpdGggYWRhcHRpdmUgcmVzYW1wbGluZ1xuICAgICAgICBjb25zdCBib3VuZHNMaW5lID0gbG9hZEdlb21ldHJ5KEJPVU5EU19GRUFUVVJFLCB0aGlzLnRpbGVJRC5jYW5vbmljYWwsIHRoaXMudGlsZVRyYW5zZm9ybSlbMF07XG5cbiAgICAgICAgLy8gZ2VuZXJhdGUgdmVydGljZXMgZm9yIGRlYnVnZ2luZyB0aWxlIGJvdW5kYXJpZXNcbiAgICAgICAgY29uc3QgZGVidWdWZXJ0aWNlcyA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICBjb25zdCBkZWJ1Z0luZGljZXMgPSBuZXcgTGluZVN0cmlwSW5kZXhBcnJheSgpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRzTGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qge3gsIHl9ID0gYm91bmRzTGluZVtpXTtcbiAgICAgICAgICAgIGRlYnVnVmVydGljZXMuZW1wbGFjZUJhY2soeCwgeSk7XG4gICAgICAgICAgICBkZWJ1Z0luZGljZXMuZW1wbGFjZUJhY2soaSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVidWdJbmRpY2VzLmVtcGxhY2VCYWNrKDApO1xuXG4gICAgICAgIHRoaXMuX3RpbGVEZWJ1Z0luZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcihkZWJ1Z0luZGljZXMpO1xuICAgICAgICB0aGlzLl90aWxlRGVidWdCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcihkZWJ1Z1ZlcnRpY2VzLCBwb3NBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLl90aWxlRGVidWdTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCBkZWJ1Z1ZlcnRpY2VzLmxlbmd0aCwgZGVidWdJbmRpY2VzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgX21ha2VUaWxlQm91bmRzQnVmZmVycyhjb250ZXh0OiBDb250ZXh0LCBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl90aWxlQm91bmRzQnVmZmVyIHx8ICFwcm9qZWN0aW9uIHx8IHByb2plY3Rpb24ubmFtZSA9PT0gJ21lcmNhdG9yJykgcmV0dXJuO1xuXG4gICAgICAgIC8vIHJlcHJvamVjdCB0aWxlIG91dGxpbmUgd2l0aCBhZGFwdGl2ZSByZXNhbXBsaW5nXG4gICAgICAgIGNvbnN0IGJvdW5kc0xpbmUgPSBsb2FkR2VvbWV0cnkoQk9VTkRTX0ZFQVRVUkUsIHRoaXMudGlsZUlELmNhbm9uaWNhbCwgdGhpcy50aWxlVHJhbnNmb3JtKVswXTtcblxuICAgICAgICBsZXQgYm91bmRzVmVydGljZXMsIGJvdW5kc0luZGljZXM7XG4gICAgICAgIGlmICh0aGlzLmlzUmFzdGVyKSB7XG4gICAgICAgICAgICAvLyBmb3IgcmFzdGVyIHRpbGVzLCBnZW5lcmF0ZSBhbiBhZGFwdGl2ZSBNQVJUSU5JIG1lc2hcbiAgICAgICAgICAgIGNvbnN0IG1lc2ggPSBnZXRUaWxlTWVzaCh0aGlzLnRpbGVJRC5jYW5vbmljYWwsIHByb2plY3Rpb24pO1xuICAgICAgICAgICAgYm91bmRzVmVydGljZXMgPSBtZXNoLnZlcnRpY2VzO1xuICAgICAgICAgICAgYm91bmRzSW5kaWNlcyA9IG1lc2guaW5kaWNlcztcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZm9yIHZlY3RvciB0aWxlcywgZ2VuZXJhdGUgYW4gRWFyY3V0IHRyaWFuZ3VsYXRpb24gb2YgdGhlIG91dGxpbmVcbiAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzID0gbmV3IFRpbGVCb3VuZHNBcnJheSgpO1xuICAgICAgICAgICAgYm91bmRzSW5kaWNlcyA9IG5ldyBUcmlhbmdsZUluZGV4QXJyYXkoKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB7eCwgeX0gb2YgYm91bmRzTGluZSkge1xuICAgICAgICAgICAgICAgIGJvdW5kc1ZlcnRpY2VzLmVtcGxhY2VCYWNrKHgsIHksIDAsIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW5kaWNlcyA9IGVhcmN1dChib3VuZHNWZXJ0aWNlcy5pbnQxNiwgdW5kZWZpbmVkLCA0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgICAgIGJvdW5kc0luZGljZXMuZW1wbGFjZUJhY2soaW5kaWNlc1tpXSwgaW5kaWNlc1tpICsgMV0sIGluZGljZXNbaSArIDJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90aWxlQm91bmRzQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIoYm91bmRzVmVydGljZXMsIGJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMuX3RpbGVCb3VuZHNJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIoYm91bmRzSW5kaWNlcyk7XG4gICAgICAgIHRoaXMuX3RpbGVCb3VuZHNTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCBib3VuZHNWZXJ0aWNlcy5sZW5ndGgsIGJvdW5kc0luZGljZXMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBfbWFrZUdsb2JlVGlsZURlYnVnQnVmZmVycyhjb250ZXh0OiBDb250ZXh0LCBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl9nbG9iZVRpbGVEZWJ1Z0JvcmRlckJ1ZmZlciB8fCB0aGlzLl9nbG9iZVRpbGVEZWJ1Z1RleHRCdWZmZXIgfHwgIXByb2plY3Rpb24gfHwgcHJvamVjdGlvbi5uYW1lICE9PSAnZ2xvYmUnKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IGdsb2JlVGlsZUJvdW5kcyhpZCk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6YXRpb25NYXRyaXggPSBnbG9iZU5vcm1hbGl6ZUVDRUYoYm91bmRzKTtcblxuICAgICAgICB0aGlzLl9tYWtlR2xvYmVUaWxlRGVidWdCb3JkZXJCdWZmZXIoY29udGV4dCwgaWQsIG5vcm1hbGl6YXRpb25NYXRyaXgpO1xuICAgICAgICB0aGlzLl9tYWtlR2xvYmVUaWxlRGVidWdUZXh0QnVmZmVyKGNvbnRleHQsIGlkLCBub3JtYWxpemF0aW9uTWF0cml4KTtcbiAgICB9XG5cbiAgICBfbWFrZUdsb2JlVGlsZURlYnVnQm9yZGVyQnVmZmVyKGNvbnRleHQ6IENvbnRleHQsIGlkOiBDYW5vbmljYWxUaWxlSUQsIG5vcm1hbGl6YXRpb25NYXRyaXg6IEZsb2F0NjRBcnJheSkge1xuICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICBjb25zdCBpbmRpY2VzID0gbmV3IExpbmVTdHJpcEluZGV4QXJyYXkoKTtcbiAgICAgICAgY29uc3QgZXh0cmFHbG9iZSA9IG5ldyBQb3NHbG9iZUV4dEFycmF5KCk7XG5cbiAgICAgICAgY29uc3QgYWRkTGluZSA9IChzeDogbnVtYmVyLCBzeTogbnVtYmVyLCBleDogbnVtYmVyLCBleTogbnVtYmVyLCBwb2ludENvdW50OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBYID0gKGV4IC0gc3gpIC8gKHBvaW50Q291bnQgLSAxKTtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBZID0gKGV5IC0gc3kpIC8gKHBvaW50Q291bnQgLSAxKTtcblxuICAgICAgICAgICAgY29uc3Qgdk9mZnNldCA9IHZlcnRpY2VzLmxlbmd0aDtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludENvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gc3ggKyBpICogc3RlcFg7XG4gICAgICAgICAgICAgICAgY29uc3QgeSA9IHN5ICsgaSAqIHN0ZXBZO1xuICAgICAgICAgICAgICAgIHZlcnRpY2VzLmVtcGxhY2VCYWNrKHgsIHkpO1xuXG4gICAgICAgICAgICAgICAgLy8gVGhlIG5leHQgdHdvIGxpbmVzIGFyZSBlcXVpdmFsZW50IHRvIGRvaW5nIHByb2plY3Rpb24ucHJvamVjdFRpbGVQb2ludC5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIHdheSB3ZSBkb24ndCByZWNvbXB1dGUgdGhlIG5vcm1hbGl6YXRpb24gbWF0cml4IGV2ZXJ5dGltZSBzaW5jZSBpdCByZW1haW5zIHRoZSBzYW1lIGZvciBhbGwgcG9pbnRzLlxuICAgICAgICAgICAgICAgIGNvbnN0IGVjZWYgPSB0aWxlQ29vcmRUb0VDRUYoeCwgeSwgaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdwID0gdmVjMy50cmFuc2Zvcm1NYXQ0KGVjZWYsIGVjZWYsIG5vcm1hbGl6YXRpb25NYXRyaXgpO1xuXG4gICAgICAgICAgICAgICAgZXh0cmFHbG9iZS5lbXBsYWNlQmFjayhncFswXSwgZ3BbMV0sIGdwWzJdKTtcbiAgICAgICAgICAgICAgICBpbmRpY2VzLmVtcGxhY2VCYWNrKHZPZmZzZXQgKyBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlID0gRVhURU5UO1xuICAgICAgICBhZGRMaW5lKDAsIDAsIGUsIDAsIDE2KTtcbiAgICAgICAgYWRkTGluZShlLCAwLCBlLCBlLCAxNik7XG4gICAgICAgIGFkZExpbmUoZSwgZSwgMCwgZSwgMTYpO1xuICAgICAgICBhZGRMaW5lKDAsIGUsIDAsIDAsIDE2KTtcblxuICAgICAgICB0aGlzLl90aWxlRGVidWdJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIoaW5kaWNlcyk7XG4gICAgICAgIHRoaXMuX3RpbGVEZWJ1Z0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHZlcnRpY2VzLCBwb3NBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLl9nbG9iZVRpbGVEZWJ1Z0JvcmRlckJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKGV4dHJhR2xvYmUsIHBvc0F0dHJpYnV0ZXNHbG9iZUV4dC5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy5fdGlsZURlYnVnU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgdmVydGljZXMubGVuZ3RoLCBpbmRpY2VzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgX21ha2VHbG9iZVRpbGVEZWJ1Z1RleHRCdWZmZXIoY29udGV4dDogQ29udGV4dCwgaWQ6IENhbm9uaWNhbFRpbGVJRCwgbm9ybWFsaXphdGlvbk1hdHJpeDogRmxvYXQ2NEFycmF5KSB7XG4gICAgICAgIGNvbnN0IFNFR01FTlRTID0gNDtcbiAgICAgICAgY29uc3QgbnVtVmVydGljZXMgPSBTRUdNRU5UUyArIDE7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSBFWFRFTlQgLyBTRUdNRU5UUztcblxuICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICBjb25zdCBpbmRpY2VzID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICBjb25zdCBleHRyYUdsb2JlID0gbmV3IFBvc0dsb2JlRXh0QXJyYXkoKTtcblxuICAgICAgICBjb25zdCB0b3RhbFZlcnRpY2VzID0gbnVtVmVydGljZXMgKiBudW1WZXJ0aWNlcztcbiAgICAgICAgY29uc3QgdG90YWxUcmlhbmdsZXMgPSBTRUdNRU5UUyAqIFNFR01FTlRTICogMjtcbiAgICAgICAgaW5kaWNlcy5yZXNlcnZlKHRvdGFsVHJpYW5nbGVzKTtcbiAgICAgICAgdmVydGljZXMucmVzZXJ2ZSh0b3RhbFZlcnRpY2VzKTtcbiAgICAgICAgZXh0cmFHbG9iZS5yZXNlcnZlKHRvdGFsVmVydGljZXMpO1xuXG4gICAgICAgIGNvbnN0IHRvSW5kZXggPSAoajogbnVtYmVyLCBpOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRvdGFsVmVydGljZXMgKiBqICsgaTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBhZGQgdmVydGljZXMuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdG90YWxWZXJ0aWNlczsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCB5ID0gaiAqIHN0ZXA7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsVmVydGljZXM7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBpICogc3RlcDtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNlcy5lbXBsYWNlQmFjayh4LCB5KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGVjZWYgPSB0aWxlQ29vcmRUb0VDRUYoeCwgeSwgaWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdwID0gdmVjMy50cmFuc2Zvcm1NYXQ0KGVjZWYsIGVjZWYsIG5vcm1hbGl6YXRpb25NYXRyaXgpO1xuICAgICAgICAgICAgICAgIGV4dHJhR2xvYmUuZW1wbGFjZUJhY2soZ3BbMF0sIGdwWzFdLCBncFsyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgaW5kaWNlcy5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBTRUdNRU5UUzsgaisrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IFNFR01FTlRTOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0bCA9IHRvSW5kZXgoaiwgaSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHIgPSB0b0luZGV4KGosIGkgKyAxKTtcbiAgICAgICAgICAgICAgICBjb25zdCBibCA9IHRvSW5kZXgoaiArIDEsIGkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyID0gdG9JbmRleChqICsgMSwgaSArIDEpO1xuXG4gICAgICAgICAgICAgICAgLy8gZmlyc3QgdHJpYW5nbGUgb2YgdGhlIHN1Yi1wYXRjaC5cbiAgICAgICAgICAgICAgICBpbmRpY2VzLmVtcGxhY2VCYWNrKHRsLCB0ciwgYmwpO1xuXG4gICAgICAgICAgICAgICAgLy8gc2Vjb25kIHRyaWFuZ2xlIG9mIHRoZSBzdWItcGF0Y2guXG4gICAgICAgICAgICAgICAgaW5kaWNlcy5lbXBsYWNlQmFjayhibCwgdHIsIGJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RpbGVEZWJ1Z1RleHRJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIoaW5kaWNlcyk7XG4gICAgICAgIHRoaXMuX3RpbGVEZWJ1Z1RleHRCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZVZlcnRleEJ1ZmZlcih2ZXJ0aWNlcywgcG9zQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy5fZ2xvYmVUaWxlRGVidWdUZXh0QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIoZXh0cmFHbG9iZSwgcG9zQXR0cmlidXRlc0dsb2JlRXh0Lm1lbWJlcnMpO1xuICAgICAgICB0aGlzLl90aWxlRGVidWdUZXh0U2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgdG90YWxWZXJ0aWNlcywgdG90YWxUcmlhbmdsZXMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGlsZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlLmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGV9IGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3JlbmRlci9wYWludGVyLmpzJztcblxuZXhwb3J0IHR5cGUgRmVhdHVyZVN0YXRlcyA9IHtbZmVhdHVyZV9pZDogc3RyaW5nXTogRmVhdHVyZVN0YXRlfTtcbmV4cG9ydCB0eXBlIExheWVyRmVhdHVyZVN0YXRlcyA9IHtbbGF5ZXI6IHN0cmluZ106IEZlYXR1cmVTdGF0ZXN9O1xuXG4vKipcbiAqIFNvdXJjZUZlYXR1cmVTdGF0ZSBtYW5hZ2VzIHRoZSBzdGF0ZSBhbmQgcGVuZGluZyBjaGFuZ2VzXG4gKiB0byBmZWF0dXJlcyBpbiBhIHNvdXJjZSwgc2VwYXJhdGVkIGJ5IHNvdXJjZSBsYXllci5cbiAqIHN0YXRlQ2hhbmdlcyBhbmQgZGVsZXRlZFN0YXRlcyBiYXRjaCBhbGwgY2hhbmdlcyB0byB0aGUgdGlsZSAodXBkYXRlcyBhbmQgcmVtb3ZlcywgcmVzcGVjdGl2ZWx5KVxuICogYmV0d2VlbiBjb2FsZXNjZSgpIGV2ZW50cy4gYWRkRmVhdHVyZVN0YXRlKCkgYW5kIHJlbW92ZUZlYXR1cmVTdGF0ZSgpIGFsc28gdXBkYXRlIHRoZWlyIGNvdW50ZXJwYXJ0J3NcbiAqIGxpc3Qgb2YgY2hhbmdlcywgc3VjaCB0aGF0IGNvYWxlc2NlKCkgY2FuIGFwcGx5IHRoZSBwcm9wZXIgc3RhdGUgY2hhbmdlcyB3aGlsZSBhZ25vc3RpYyB0byB0aGUgb3JkZXIgb2Ygb3BlcmF0aW9ucy5cbiAqIEluIGRlbGV0ZWRTdGF0ZXMsIGFsbCBudWxsJ3MgZGVub3RlIGNvbXBsZXRlIHJlbW92YWwgb2Ygc3RhdGUgYXQgdGhhdCBzY29wZVxuICogQHByaXZhdGVcbiovXG5jbGFzcyBTb3VyY2VGZWF0dXJlU3RhdGUge1xuICAgIHN0YXRlOiBMYXllckZlYXR1cmVTdGF0ZXM7XG4gICAgc3RhdGVDaGFuZ2VzOiBMYXllckZlYXR1cmVTdGF0ZXM7XG4gICAgZGVsZXRlZFN0YXRlczoge307XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcyA9IHt9O1xuICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXMgPSB7fTtcbiAgICB9XG5cbiAgICB1cGRhdGVTdGF0ZShzb3VyY2VMYXllcjogc3RyaW5nLCBmZWF0dXJlSWQ6IG51bWJlciB8IHN0cmluZywgbmV3U3RhdGU6IE9iamVjdCkge1xuICAgICAgICBjb25zdCBmZWF0dXJlID0gU3RyaW5nKGZlYXR1cmVJZCk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSA9IHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdIHx8IHt9O1xuICAgICAgICBleHRlbmQodGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdLCBuZXdTdGF0ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZnQgaW4gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZnQgIT09IGZlYXR1cmUpIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZnRdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVEZWxldGlvblF1ZXVlZCA9IHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0gJiYgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSA9PT0gbnVsbDtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlRGVsZXRpb25RdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2ZlYXR1cmVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV3U3RhdGVbcHJvcF0pIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1bcHJvcF0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmV3U3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRpb25JblF1ZXVlID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSAmJiB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdICYmIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XSA9PT0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0aW9uSW5RdWV1ZSkgZGVsZXRlIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXI6IHN0cmluZywgZmVhdHVyZUlkPzogbnVtYmVyIHwgc3RyaW5nLCBrZXk/OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJEZWxldGVkID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9PT0gbnVsbDtcbiAgICAgICAgaWYgKHNvdXJjZUxheWVyRGVsZXRlZCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBTdHJpbmcoZmVhdHVyZUlkKTtcblxuICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID0gdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSB8fCB7fTtcblxuICAgICAgICBpZiAoa2V5ICYmIGZlYXR1cmVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdIHx8IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZmVhdHVyZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUluUXVldWUgPSB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl0gJiYgdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdO1xuICAgICAgICAgICAgaWYgKHVwZGF0ZUluUXVldWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gdGhpcy5zdGF0ZUNoYW5nZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdKSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdW2tleV0gPSBudWxsO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTdGF0ZShzb3VyY2VMYXllcjogc3RyaW5nLCBmZWF0dXJlSWQ6IG51bWJlciB8IHN0cmluZyk6IEZlYXR1cmVTdGF0ZXMge1xuICAgICAgICBjb25zdCBmZWF0dXJlID0gU3RyaW5nKGZlYXR1cmVJZCk7XG4gICAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLnN0YXRlW3NvdXJjZUxheWVyXSB8fCB7fTtcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSB8fCB7fTtcblxuICAgICAgICBjb25zdCByZWNvbmNpbGVkU3RhdGUgPSBleHRlbmQoe30sIGJhc2VbZmVhdHVyZV0sIGNoYW5nZXNbZmVhdHVyZV0pO1xuXG4gICAgICAgIC8vcmV0dXJuIGVtcHR5IG9iamVjdCBpZiB0aGUgd2hvbGUgc291cmNlIGxheWVyIGlzIGF3YWl0aW5nIGRlbGV0aW9uXG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdID09PSBudWxsKSByZXR1cm4ge307XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVEZWxldGlvbnMgPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVJZF07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZURlbGV0aW9ucyA9PT0gbnVsbCkgcmV0dXJuIHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wIGluIGZlYXR1cmVEZWxldGlvbnMpIGRlbGV0ZSByZWNvbmNpbGVkU3RhdGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZWRTdGF0ZTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplVGlsZVN0YXRlKHRpbGU6IFRpbGUsIHBhaW50ZXI6ID9QYWludGVyKSB7XG4gICAgICAgIHRpbGUuc2V0RmVhdHVyZVN0YXRlKHRoaXMuc3RhdGUsIHBhaW50ZXIpO1xuICAgIH1cblxuICAgIGNvYWxlc2NlQ2hhbmdlcyh0aWxlczoge1tfOiBhbnldOiBUaWxlfSwgcGFpbnRlcjogYW55KSB7XG4gICAgICAgIC8vdHJhY2sgY2hhbmdlcyB3aXRoIGZ1bGwgc3RhdGUgb2JqZWN0cywgYnV0IG9ubHkgZm9yIGZlYXR1cmVzIHRoYXQgZ290IG1vZGlmaWVkXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzQ2hhbmdlZDogTGF5ZXJGZWF0dXJlU3RhdGVzID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VMYXllciBpbiB0aGlzLnN0YXRlQ2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0gID0gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0gfHwge307XG4gICAgICAgICAgICBjb25zdCBsYXllclN0YXRlcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIGluIHRoaXMuc3RhdGVDaGFuZ2VzW3NvdXJjZUxheWVyXSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV0pIHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0ge307XG4gICAgICAgICAgICAgICAgZXh0ZW5kKHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2ZlYXR1cmVdLCB0aGlzLnN0YXRlQ2hhbmdlc1tzb3VyY2VMYXllcl1bZmVhdHVyZV0pO1xuICAgICAgICAgICAgICAgIGxheWVyU3RhdGVzW2ZlYXR1cmVdID0gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmZWF0dXJlc0NoYW5nZWRbc291cmNlTGF5ZXJdID0gbGF5ZXJTdGF0ZXM7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUxheWVyIGluIHRoaXMuZGVsZXRlZFN0YXRlcykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0gID0gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0gfHwge307XG4gICAgICAgICAgICBjb25zdCBsYXllclN0YXRlcyA9IHt9O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZnQgaW4gdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJTdGF0ZXNbZnRdID0ge307XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2Z0XSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIGluIHRoaXMuZGVsZXRlZFN0YXRlc1tzb3VyY2VMYXllcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlV2hvbGVGZWF0dXJlU3RhdGUgPSB0aGlzLmRlbGV0ZWRTdGF0ZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID09PSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlV2hvbGVGZWF0dXJlU3RhdGUpIHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2ZlYXR1cmVdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5kZWxldGVkU3RhdGVzW3NvdXJjZUxheWVyXVtmZWF0dXJlXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdGF0ZVtzb3VyY2VMYXllcl1bZmVhdHVyZV1ba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXllclN0YXRlc1tmZWF0dXJlXSA9IHRoaXMuc3RhdGVbc291cmNlTGF5ZXJdW2ZlYXR1cmVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmVhdHVyZXNDaGFuZ2VkW3NvdXJjZUxheWVyXSA9IGZlYXR1cmVzQ2hhbmdlZFtzb3VyY2VMYXllcl0gfHwge307XG4gICAgICAgICAgICBleHRlbmQoZmVhdHVyZXNDaGFuZ2VkW3NvdXJjZUxheWVyXSwgbGF5ZXJTdGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMgPSB7fTtcbiAgICAgICAgdGhpcy5kZWxldGVkU3RhdGVzID0ge307XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGZlYXR1cmVzQ2hhbmdlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aWxlcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRpbGVzW2lkXTtcbiAgICAgICAgICAgIHRpbGUuc2V0RmVhdHVyZVN0YXRlKGZlYXR1cmVzQ2hhbmdlZCwgcGFpbnRlcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNvdXJjZUZlYXR1cmVTdGF0ZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBERU1EYXRhIGZyb20gXCIuL2RlbV9kYXRhLmpzXCI7XG5pbXBvcnQge3ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCB7Y2xhbXB9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5cbmltcG9ydCB0eXBlIHtWZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuXG5jbGFzcyBNaXBMZXZlbCB7XG4gICAgc2l6ZTogbnVtYmVyO1xuICAgIG1pbmltdW1zOiBBcnJheTxudW1iZXI+O1xuICAgIG1heGltdW1zOiBBcnJheTxudW1iZXI+O1xuICAgIGxlYXZlczogQXJyYXk8bnVtYmVyPjtcblxuICAgIGNvbnN0cnVjdG9yKHNpemVfOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZV87XG4gICAgICAgIHRoaXMubWluaW11bXMgPSBbXTtcbiAgICAgICAgdGhpcy5tYXhpbXVtcyA9IFtdO1xuICAgICAgICB0aGlzLmxlYXZlcyA9IFtdO1xuICAgIH1cblxuICAgIGdldEVsZXZhdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IHsgbWluOiBudW1iZXIsIG1heDogbnVtYmVyfSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMudG9JZHgoeCwgeSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtaW46IHRoaXMubWluaW11bXNbaWR4XSxcbiAgICAgICAgICAgIG1heDogdGhpcy5tYXhpbXVtc1tpZHhdXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaXNMZWFmKHg6IG51bWJlciwgeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVhdmVzW3RoaXMudG9JZHgoeCwgeSldO1xuICAgIH1cblxuICAgIHRvSWR4KHg6IG51bWJlciwgeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHkgKiB0aGlzLnNpemUgKyB4O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWFiYlJheUludGVyc2VjdChtaW46IFZlYzMsIG1heDogVmVjMywgcG9zOiBWZWMzLCBkaXI6IFZlYzMpOiA/bnVtYmVyIHtcbiAgICBsZXQgdE1pbiA9IDA7XG4gICAgbGV0IHRNYXggPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXG4gICAgY29uc3QgZXBzaWxvbiA9IDFlLTE1O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgaWYgKE1hdGguYWJzKGRpcltpXSkgPCBlcHNpbG9uKSB7XG4gICAgICAgICAgICAvLyBQYXJhbGxlbCByYXlcbiAgICAgICAgICAgIGlmIChwb3NbaV0gPCBtaW5baV0gfHwgcG9zW2ldID4gbWF4W2ldKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb29kID0gMS4wIC8gZGlyW2ldO1xuICAgICAgICAgICAgbGV0IHQxID0gKG1pbltpXSAtIHBvc1tpXSkgKiBvb2Q7XG4gICAgICAgICAgICBsZXQgdDIgPSAobWF4W2ldIC0gcG9zW2ldKSAqIG9vZDtcbiAgICAgICAgICAgIGlmICh0MSA+IHQyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IHQxO1xuICAgICAgICAgICAgICAgIHQxID0gdDI7XG4gICAgICAgICAgICAgICAgdDIgPSB0ZW1wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHQxID4gdE1pbilcbiAgICAgICAgICAgICAgICB0TWluID0gdDE7XG4gICAgICAgICAgICBpZiAodDIgPCB0TWF4KVxuICAgICAgICAgICAgICAgIHRNYXggPSB0MjtcbiAgICAgICAgICAgIGlmICh0TWluID4gdE1heClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0TWluO1xufVxuXG5mdW5jdGlvbiB0cmlhbmdsZVJheUludGVyc2VjdChheCwgYXksIGF6LCBieCwgYnksIGJ6LCBjeCwgY3ksIGN6LCBwb3M6IFZlYzMsIGRpcjogVmVjMyk6ID9udW1iZXIge1xuICAgIC8vIENvbXB1dGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgdSBhbmQgdiB0byBmaW5kIHRoZSBpbnRlcnNlY3Rpb25cbiAgICBjb25zdCBhYlggPSBieCAtIGF4O1xuICAgIGNvbnN0IGFiWSA9IGJ5IC0gYXk7XG4gICAgY29uc3QgYWJaID0gYnogLSBhejtcblxuICAgIGNvbnN0IGFjWCA9IGN4IC0gYXg7XG4gICAgY29uc3QgYWNZID0gY3kgLSBheTtcbiAgICBjb25zdCBhY1ogPSBjeiAtIGF6O1xuXG4gICAgLy8gcHZlYyA9IGNyb3NzKGRpciwgYSksIGRldCA9IGRvdChhYiwgcHZlYylcbiAgICBjb25zdCBwdmVjWCA9IGRpclsxXSAqIGFjWiAtIGRpclsyXSAqIGFjWTtcbiAgICBjb25zdCBwdmVjWSA9IGRpclsyXSAqIGFjWCAtIGRpclswXSAqIGFjWjtcbiAgICBjb25zdCBwdmVjWiA9IGRpclswXSAqIGFjWSAtIGRpclsxXSAqIGFjWDtcbiAgICBjb25zdCBkZXQgPSBhYlggKiBwdmVjWCArIGFiWSAqIHB2ZWNZICsgYWJaICogcHZlY1o7XG5cbiAgICBpZiAoTWF0aC5hYnMoZGV0KSA8IDFlLTE1KVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGludkRldCA9IDEuMCAvIGRldDtcbiAgICBjb25zdCB0dmVjWCA9IHBvc1swXSAtIGF4O1xuICAgIGNvbnN0IHR2ZWNZID0gcG9zWzFdIC0gYXk7XG4gICAgY29uc3QgdHZlY1ogPSBwb3NbMl0gLSBhejtcbiAgICBjb25zdCB1ID0gKHR2ZWNYICogcHZlY1ggKyB0dmVjWSAqIHB2ZWNZICsgdHZlY1ogKiBwdmVjWikgKiBpbnZEZXQ7XG5cbiAgICBpZiAodSA8IDAuMCB8fCB1ID4gMS4wKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgIC8vIHF2ZWMgPSBjcm9zcyh0dmVjLCBhYilcbiAgICBjb25zdCBxdmVjWCA9IHR2ZWNZICogYWJaIC0gdHZlY1ogKiBhYlk7XG4gICAgY29uc3QgcXZlY1kgPSB0dmVjWiAqIGFiWCAtIHR2ZWNYICogYWJaO1xuICAgIGNvbnN0IHF2ZWNaID0gdHZlY1ggKiBhYlkgLSB0dmVjWSAqIGFiWDtcbiAgICBjb25zdCB2ID0gKGRpclswXSAqIHF2ZWNYICsgZGlyWzFdICogcXZlY1kgKyBkaXJbMl0gKiBxdmVjWikgKiBpbnZEZXQ7XG5cbiAgICBpZiAodiA8IDAuMCB8fCB1ICsgdiA+IDEuMClcbiAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gKGFjWCAqIHF2ZWNYICsgYWNZICogcXZlY1kgKyBhY1ogKiBxdmVjWikgKiBpbnZEZXQ7XG59XG5cbmZ1bmN0aW9uIGZyYWModiwgbG8sIGhpKSB7XG4gICAgcmV0dXJuICh2IC0gbG8pIC8gKGhpIC0gbG8pO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVCb3VuZHMoeCwgeSwgZGVwdGgsIGJvdW5kc01pbngsIGJvdW5kc01pbnksIGJvdW5kc01heHgsIGJvdW5kc01heHksIG91dE1pbiwgb3V0TWF4KSB7XG4gICAgY29uc3Qgc2NhbGUgPSAxIDw8IGRlcHRoO1xuICAgIGNvbnN0IHJhbmdleCA9IGJvdW5kc01heHggLSBib3VuZHNNaW54O1xuICAgIGNvbnN0IHJhbmdleSA9IGJvdW5kc01heHkgLSBib3VuZHNNaW55O1xuXG4gICAgY29uc3QgbWluWCA9ICh4ICsgMCkgLyBzY2FsZSAqIHJhbmdleCArIGJvdW5kc01pbng7XG4gICAgY29uc3QgbWF4WCA9ICh4ICsgMSkgLyBzY2FsZSAqIHJhbmdleCArIGJvdW5kc01pbng7XG4gICAgY29uc3QgbWluWSA9ICh5ICsgMCkgLyBzY2FsZSAqIHJhbmdleSArIGJvdW5kc01pbnk7XG4gICAgY29uc3QgbWF4WSA9ICh5ICsgMSkgLyBzY2FsZSAqIHJhbmdleSArIGJvdW5kc01pbnk7XG5cbiAgICBvdXRNaW5bMF0gPSBtaW5YO1xuICAgIG91dE1pblsxXSA9IG1pblk7XG4gICAgb3V0TWF4WzBdID0gbWF4WDtcbiAgICBvdXRNYXhbMV0gPSBtYXhZO1xufVxuXG4vLyBBIHNtYWxsIHBhZGRpbmcgdmFsdWUgaXMgdXNlZCB3aXRoIGJvdW5kaW5nIGJveGVzIHRvIGV4dGVuZCB0aGUgYm90dG9tIGJlbG93IHNlYSBsZXZlbFxuY29uc3QgYWFiYlNraXJ0UGFkZGluZyA9IDEwMDtcblxuLy8gQSBzcGFyc2UgbWluIG1heCBxdWFkIHRyZWUgZm9yIHBlcmZvcm1pbmcgYWNjZWxlcmF0ZWQgcXVlcmllcyBhZ2FpbnN0IGRlbSBlbGV2YXRpb24gZGF0YS5cbi8vIEVhY2ggdHJlZSBub2RlIHN0b3JlcyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBlbGV2YXRpb24gb2YgaXRzIGNoaWxkcmVuIG5vZGVzIGFuZCBhIGZsYWcgd2hldGhlciB0aGUgbm9kZSBpcyBhIGxlYWYuXG4vLyBOb2RlIGRhdGEgaXMgc3RvcmVkIGluIG5vbi1pbnRlcmxlYXZlZCBhcnJheXMgd2hlcmUgdGhlIHJvb3QgaXMgYXQgaW5kZXggMC5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlbU1pbk1heFF1YWRUcmVlIHtcbiAgICBtYXhpbXVtczogQXJyYXk8bnVtYmVyPjtcbiAgICBtaW5pbXVtczogQXJyYXk8bnVtYmVyPjtcbiAgICBsZWF2ZXM6IEFycmF5PG51bWJlcj47XG4gICAgY2hpbGRPZmZzZXRzOiBBcnJheTxudW1iZXI+O1xuICAgIG5vZGVDb3VudDogbnVtYmVyO1xuICAgIGRlbTogREVNRGF0YTtcbiAgICBfc2libGluZ09mZnNldDogQXJyYXk8QXJyYXk8bnVtYmVyPj47XG5cbiAgICBjb25zdHJ1Y3RvcihkZW1fOiBERU1EYXRhKSB7XG4gICAgICAgIHRoaXMubWF4aW11bXMgPSBbXTtcbiAgICAgICAgdGhpcy5taW5pbXVtcyA9IFtdO1xuICAgICAgICB0aGlzLmxlYXZlcyA9IFtdO1xuICAgICAgICB0aGlzLmNoaWxkT2Zmc2V0cyA9IFtdO1xuICAgICAgICB0aGlzLm5vZGVDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuZGVtID0gZGVtXztcblxuICAgICAgICAvLyBQcmVjb21wdXRlIHRoZSBvcmRlciBvZiA0IHNpYmxpbmcgbm9kZXMgaW4gdGhlIG1lbW9yeS4gVG9wLWxlZnQsIHRvcC1yaWdodCwgYm90dG9tLWxlZnQsIGJvdHRvbS1yaWdodFxuICAgICAgICB0aGlzLl9zaWJsaW5nT2Zmc2V0ID0gW1xuICAgICAgICAgICAgWzAsIDBdLFxuICAgICAgICAgICAgWzEsIDBdLFxuICAgICAgICAgICAgWzAsIDFdLFxuICAgICAgICAgICAgWzEsIDFdXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKCF0aGlzLmRlbSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBtaXBzID0gYnVpbGREZW1NaXBtYXAodGhpcy5kZW0pO1xuICAgICAgICBjb25zdCBtYXhMdmwgPSBtaXBzLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSByb290IG5vZGVcbiAgICAgICAgY29uc3Qgcm9vdE1pcCA9IG1pcHNbbWF4THZsXTtcbiAgICAgICAgY29uc3QgbWluID0gcm9vdE1pcC5taW5pbXVtcztcbiAgICAgICAgY29uc3QgbWF4ID0gcm9vdE1pcC5tYXhpbXVtcztcbiAgICAgICAgY29uc3QgbGVhdmVzID0gcm9vdE1pcC5sZWF2ZXM7XG4gICAgICAgIHRoaXMuX2FkZE5vZGUobWluWzBdLCBtYXhbMF0sIGxlYXZlc1swXSk7XG5cbiAgICAgICAgLy8gQ29uc3RydWN0IHRoZSByZXN0IG9mIHRoZSB0cmVlIHJlY3Vyc2l2ZWx5XG4gICAgICAgIHRoaXMuX2NvbnN0cnVjdChtaXBzLCAwLCAwLCBtYXhMdmwsIDApO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm1zIHJheWNhc3QgYWdhaW5zdCB0aGUgdHJlZSByb290IG9ubHkuIE1pbiBhbmQgbWF4IGNvb3JkaW5hdGVzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHJvb3Qgbm9kZVxuICAgIHJheWNhc3RSb290KG1pbng6IG51bWJlciwgbWlueTogbnVtYmVyLCBtYXh4OiBudW1iZXIsIG1heHk6IG51bWJlciwgcDogVmVjMywgZDogVmVjMywgZXhhZ2dlcmF0aW9uOiBudW1iZXIgPSAxKTogP251bWJlciB7XG4gICAgICAgIGNvbnN0IG1pbiA9IFttaW54LCBtaW55LCAtYWFiYlNraXJ0UGFkZGluZ107XG4gICAgICAgIGNvbnN0IG1heCA9IFttYXh4LCBtYXh5LCB0aGlzLm1heGltdW1zWzBdICogZXhhZ2dlcmF0aW9uXTtcbiAgICAgICAgcmV0dXJuIGFhYmJSYXlJbnRlcnNlY3QobWluLCBtYXgsIHAsIGQpO1xuICAgIH1cblxuICAgIHJheWNhc3Qocm9vdE1pbng6IG51bWJlciwgcm9vdE1pbnk6IG51bWJlciwgcm9vdE1heHg6IG51bWJlciwgcm9vdE1heHk6IG51bWJlciwgcDogVmVjMywgZDogVmVjMywgZXhhZ2dlcmF0aW9uOiBudW1iZXIgPSAxKTogP251bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5ub2RlQ291bnQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB0ID0gdGhpcy5yYXljYXN0Um9vdChyb290TWlueCwgcm9vdE1pbnksIHJvb3RNYXh4LCByb290TWF4eSwgcCwgZCwgZXhhZ2dlcmF0aW9uKTtcbiAgICAgICAgaWYgKHQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHRIaXRzID0gW107XG4gICAgICAgIGNvbnN0IHNvcnRlZEhpdHMgPSBbXTtcbiAgICAgICAgY29uc3QgYm91bmRzTWluID0gW107XG4gICAgICAgIGNvbnN0IGJvdW5kc01heCA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHN0YWNrID0gW3tcbiAgICAgICAgICAgIGlkeDogMCxcbiAgICAgICAgICAgIHQsXG4gICAgICAgICAgICBub2RleDogMCxcbiAgICAgICAgICAgIG5vZGV5OiAwLFxuICAgICAgICAgICAgZGVwdGg6IDBcbiAgICAgICAgfV07XG5cbiAgICAgICAgLy8gVHJhdmVyc2UgdGhlIHRyZWUgdW50aWwgc29tZXRoaW5nIGlzIGhpdCBvciB0aGUgcmF5IGVzY2FwZXNcbiAgICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHtpZHgsIHQsIG5vZGV4LCBub2RleSwgZGVwdGh9ID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxlYXZlc1tpZHhdKSB7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIDIgdHJpYW5nbGVzIHRvIGFwcHJveGltYXRlIHRoZSBzdXJmYWNlIHBsYW5lIGZvciBtb3JlIHByZWNpc2UgdGVzdHNcbiAgICAgICAgICAgICAgICBkZWNvZGVCb3VuZHMobm9kZXgsIG5vZGV5LCBkZXB0aCwgcm9vdE1pbngsIHJvb3RNaW55LCByb290TWF4eCwgcm9vdE1heHksIGJvdW5kc01pbiwgYm91bmRzTWF4KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gMSA8PCBkZXB0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBtaW54VXYgPSAobm9kZXggKyAwKSAvIHNjYWxlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heHhVdiA9IChub2RleCArIDEpIC8gc2NhbGU7XG4gICAgICAgICAgICAgICAgY29uc3QgbWlueVV2ID0gKG5vZGV5ICsgMCkgLyBzY2FsZTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXh5VXYgPSAobm9kZXkgKyAxKSAvIHNjYWxlO1xuXG4gICAgICAgICAgICAgICAgLy8gNCBjb3JuZXIgcG9pbnRzIEEsIEIsIEMgYW5kIEQgZGVmaW5lcyB0aGUgKHF1YWQpIGFyZWEgY292ZXJlZCBieSB0aGlzIG5vZGVcbiAgICAgICAgICAgICAgICBjb25zdCBheiA9IHNhbXBsZUVsZXZhdGlvbihtaW54VXYsIG1pbnlVdiwgdGhpcy5kZW0pICogZXhhZ2dlcmF0aW9uO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ6ID0gc2FtcGxlRWxldmF0aW9uKG1heHhVdiwgbWlueVV2LCB0aGlzLmRlbSkgKiBleGFnZ2VyYXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgY3ogPSBzYW1wbGVFbGV2YXRpb24obWF4eFV2LCBtYXh5VXYsIHRoaXMuZGVtKSAqIGV4YWdnZXJhdGlvbjtcbiAgICAgICAgICAgICAgICBjb25zdCBkeiA9IHNhbXBsZUVsZXZhdGlvbihtaW54VXYsIG1heHlVdiwgdGhpcy5kZW0pICogZXhhZ2dlcmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdDA6IGFueSA9IHRyaWFuZ2xlUmF5SW50ZXJzZWN0KFxuICAgICAgICAgICAgICAgICAgICBib3VuZHNNaW5bMF0sIGJvdW5kc01pblsxXSwgYXosICAgICAvLyBBXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kc01heFswXSwgYm91bmRzTWluWzFdLCBieiwgICAgIC8vIEJcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzTWF4WzBdLCBib3VuZHNNYXhbMV0sIGN6LCAgICAgLy8gQ1xuICAgICAgICAgICAgICAgICAgICBwLCBkKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHQxOiBhbnkgPSB0cmlhbmdsZVJheUludGVyc2VjdChcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzTWF4WzBdLCBib3VuZHNNYXhbMV0sIGN6LFxuICAgICAgICAgICAgICAgICAgICBib3VuZHNNaW5bMF0sIGJvdW5kc01heFsxXSwgZHosXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kc01pblswXSwgYm91bmRzTWluWzFdLCBheixcbiAgICAgICAgICAgICAgICAgICAgcCwgZCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0TWluID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICAgIHQwICE9PSBudWxsID8gdDAgOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICAgICAgICAgICAgICB0MSAhPT0gbnVsbCA/IHQxIDogTnVtYmVyLk1BWF9WQUxVRSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgcmF5IG1pZ2h0IGdvIGJlbG93IHRoZSB0d28gc3VyZmFjZSB0cmlhbmdsZXMgYnV0IGhpdCBvbmUgb2YgdGhlIHNpZGVzLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgY292ZXJzIHRoZSBjYXNlIG9mIHNraXJ0IGdlb21ldHJ5IGJldHdlZW4gdHdvIGRlbSB0aWxlcyBvZiBkaWZmZXJlbnQgem9vbSBsZXZlbFxuICAgICAgICAgICAgICAgIGlmICh0TWluID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpdFBvcyA9IHZlYzMuc2NhbGVBbmRBZGQoW10sIHAsIGQsIHQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcmFjeCA9IGZyYWMoaGl0UG9zWzBdLCBib3VuZHNNaW5bMF0sIGJvdW5kc01heFswXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYWN5ID0gZnJhYyhoaXRQb3NbMV0sIGJvdW5kc01pblsxXSwgYm91bmRzTWF4WzFdKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYmlsaW5lYXJMZXJwKGF6LCBieiwgZHosIGN6LCBmcmFjeCwgZnJhY3kpID49IGhpdFBvc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0TWluO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBQZXJmb3JtIGludGVyc2VjdGlvbiB0ZXN0cyBhZ2FpbnMgZWFjaCBvZiB0aGUgNCBjaGlsZCBub2RlcyBhbmQgc3RvcmUgcmVzdWx0cyBmcm9tIGNsb3Nlc3QgdG8gZnVydGhlc3QuXG4gICAgICAgICAgICBsZXQgaGl0Q291bnQgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3NpYmxpbmdPZmZzZXQubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZVggPSAobm9kZXggPDwgMSkgKyB0aGlzLl9zaWJsaW5nT2Zmc2V0W2ldWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZVkgPSAobm9kZXkgPDwgMSkgKyB0aGlzLl9zaWJsaW5nT2Zmc2V0W2ldWzFdO1xuXG4gICAgICAgICAgICAgICAgLy8gRGVjb2RlIG5vZGUgYWFiYiBmcm9tIHRoZSBtb3J0b24gY29kZVxuICAgICAgICAgICAgICAgIGRlY29kZUJvdW5kcyhjaGlsZE5vZGVYLCBjaGlsZE5vZGVZLCBkZXB0aCArIDEsIHJvb3RNaW54LCByb290TWlueSwgcm9vdE1heHgsIHJvb3RNYXh5LCBib3VuZHNNaW4sIGJvdW5kc01heCk7XG5cbiAgICAgICAgICAgICAgICBib3VuZHNNaW5bMl0gPSAtYWFiYlNraXJ0UGFkZGluZztcbiAgICAgICAgICAgICAgICBib3VuZHNNYXhbMl0gPSB0aGlzLm1heGltdW1zW3RoaXMuY2hpbGRPZmZzZXRzW2lkeF0gKyBpXSAqIGV4YWdnZXJhdGlvbjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGFhYmJSYXlJbnRlcnNlY3QoYm91bmRzTWluLCBib3VuZHNNYXgsIHAsIGQpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgcmVzdWx0IGxpc3QgZnJvbSBmdXJ0aGVzdCB0byBjbG9zZXN0IGhpdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG9yZGVyIHdpbGwgYmUgaW52ZXJzZWQgd2hlbiBidWlsZGluZyB0aGUgc3RhY2tcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdEhpdDogbnVtYmVyID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB0SGl0c1tpXSA9IHRIaXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaGl0Q291bnQgJiYgIWFkZGVkOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0SGl0ID49IHRIaXRzW3NvcnRlZEhpdHNbal1dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkSGl0cy5zcGxpY2UoaiwgMCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWRkZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRIaXRzW2hpdENvdW50XSA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGhpdENvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb250aW51ZSByZWN1cnNpb24gZnJvbSBjbG9zZXN0IHRvIGZ1cnRoZXN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpdENvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoaXRJZHggPSBzb3J0ZWRIaXRzW2ldO1xuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBpZHg6IHRoaXMuY2hpbGRPZmZzZXRzW2lkeF0gKyBoaXRJZHgsXG4gICAgICAgICAgICAgICAgICAgIHQ6IHRIaXRzW2hpdElkeF0sXG4gICAgICAgICAgICAgICAgICAgIG5vZGV4OiAobm9kZXggPDwgMSkgKyB0aGlzLl9zaWJsaW5nT2Zmc2V0W2hpdElkeF1bMF0sXG4gICAgICAgICAgICAgICAgICAgIG5vZGV5OiAobm9kZXkgPDwgMSkgKyB0aGlzLl9zaWJsaW5nT2Zmc2V0W2hpdElkeF1bMV0sXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoOiBkZXB0aCArIDFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIF9hZGROb2RlKG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgbGVhZjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgdGhpcy5taW5pbXVtcy5wdXNoKG1pbik7XG4gICAgICAgIHRoaXMubWF4aW11bXMucHVzaChtYXgpO1xuICAgICAgICB0aGlzLmxlYXZlcy5wdXNoKGxlYWYpO1xuICAgICAgICB0aGlzLmNoaWxkT2Zmc2V0cy5wdXNoKDApO1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlQ291bnQrKztcbiAgICB9XG5cbiAgICBfY29uc3RydWN0KG1pcHM6IEFycmF5PE1pcExldmVsPiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGx2bDogbnVtYmVyLCBwYXJlbnRJZHg6IG51bWJlcikge1xuICAgICAgICBpZiAobWlwc1tsdmxdLmlzTGVhZih4LCB5KSA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHBhcmVudCBvZmZzZXRcbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkT2Zmc2V0c1twYXJlbnRJZHhdKVxuICAgICAgICAgICAgdGhpcy5jaGlsZE9mZnNldHNbcGFyZW50SWR4XSA9IHRoaXMubm9kZUNvdW50O1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhbGwgNCBjaGlsZHJlbiBhbmQgcGxhY2UgdGhlbSBuZXh0IHRvIGVhY2ggb3RoZXIgaW4gbWVtb3J5XG4gICAgICAgIGNvbnN0IGNoaWxkTHZsID0gbHZsIC0gMTtcbiAgICAgICAgY29uc3QgY2hpbGRNaXAgPSBtaXBzW2NoaWxkTHZsXTtcblxuICAgICAgICBsZXQgbGVhZk1hc2sgPSAwO1xuICAgICAgICBsZXQgZmlyc3ROb2RlSWR4ID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3NpYmxpbmdPZmZzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkWCA9IHggKiAyICsgdGhpcy5fc2libGluZ09mZnNldFtpXVswXTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkWSA9IHkgKiAyICsgdGhpcy5fc2libGluZ09mZnNldFtpXVsxXTtcblxuICAgICAgICAgICAgY29uc3QgZWxldmF0aW9uID0gY2hpbGRNaXAuZ2V0RWxldmF0aW9uKGNoaWxkWCwgY2hpbGRZKTtcbiAgICAgICAgICAgIGNvbnN0IGxlYWYgPSBjaGlsZE1pcC5pc0xlYWYoY2hpbGRYLCBjaGlsZFkpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZUlkeCA9IHRoaXMuX2FkZE5vZGUoZWxldmF0aW9uLm1pbiwgZWxldmF0aW9uLm1heCwgbGVhZik7XG5cbiAgICAgICAgICAgIGlmIChsZWFmKVxuICAgICAgICAgICAgICAgIGxlYWZNYXNrIHw9IDEgPDwgaTtcbiAgICAgICAgICAgIGlmICghZmlyc3ROb2RlSWR4KVxuICAgICAgICAgICAgICAgIGZpcnN0Tm9kZUlkeCA9IG5vZGVJZHg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250aW51ZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIHRyZWUgcmVjdXJzaXZlbHkgdG8gbm9uLWxlYWYgbm9kZXMuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc2libGluZ09mZnNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCEobGVhZk1hc2sgJiAoMSA8PCBpKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25zdHJ1Y3QobWlwcywgeCAqIDIgKyB0aGlzLl9zaWJsaW5nT2Zmc2V0W2ldWzBdLCB5ICogMiArIHRoaXMuX3NpYmxpbmdPZmZzZXRbaV1bMV0sIGNoaWxkTHZsLCBmaXJzdE5vZGVJZHggKyBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gYmlsaW5lYXJMZXJwKHAwMDogYW55LCBwMTA6IGFueSwgcDAxOiBhbnksIHAxMTogYW55LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIGludGVycG9sYXRlKFxuICAgICAgICBpbnRlcnBvbGF0ZShwMDAsIHAwMSwgeSksXG4gICAgICAgIGludGVycG9sYXRlKHAxMCwgcDExLCB5KSxcbiAgICAgICAgeCk7XG59XG5cbi8vIFNhbXBsZSBlbGV2YXRpb24gaW4gbm9ybWFsaXplZCB1di1zcGFjZSAoWzAsIDBdIGlzIHRoZSB0b3AgbGVmdClcbi8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWNjb3VudCBmb3IgZXhhZ2dlcmF0aW9uXG5leHBvcnQgZnVuY3Rpb24gc2FtcGxlRWxldmF0aW9uKGZ4OiBudW1iZXIsIGZ5OiBudW1iZXIsIGRlbTogREVNRGF0YSk6IG51bWJlciB7XG4gICAgLy8gU2FtcGxlIHBvc2l0aW9uIGluIHRleGVsc1xuICAgIGNvbnN0IGRlbVNpemUgPSBkZW0uZGltO1xuICAgIGNvbnN0IHggPSBjbGFtcChmeCAqIGRlbVNpemUgLSAwLjUsIDAsIGRlbVNpemUgLSAxKTtcbiAgICBjb25zdCB5ID0gY2xhbXAoZnkgKiBkZW1TaXplIC0gMC41LCAwLCBkZW1TaXplIC0gMSk7XG5cbiAgICAvLyBDb21wdXRlIDQgY29ybmVyIHBvaW50cyBmb3IgYmlsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgIGNvbnN0IGl4TWluID0gTWF0aC5mbG9vcih4KTtcbiAgICBjb25zdCBpeU1pbiA9IE1hdGguZmxvb3IoeSk7XG4gICAgY29uc3QgaXhNYXggPSBNYXRoLm1pbihpeE1pbiArIDEsIGRlbVNpemUgLSAxKTtcbiAgICBjb25zdCBpeU1heCA9IE1hdGgubWluKGl5TWluICsgMSwgZGVtU2l6ZSAtIDEpO1xuXG4gICAgY29uc3QgZTAwID0gZGVtLmdldChpeE1pbiwgaXlNaW4pO1xuICAgIGNvbnN0IGUxMCA9IGRlbS5nZXQoaXhNYXgsIGl5TWluKTtcbiAgICBjb25zdCBlMDEgPSBkZW0uZ2V0KGl4TWluLCBpeU1heCk7XG4gICAgY29uc3QgZTExID0gZGVtLmdldChpeE1heCwgaXlNYXgpO1xuXG4gICAgcmV0dXJuIGJpbGluZWFyTGVycChlMDAsIGUxMCwgZTAxLCBlMTEsIHggLSBpeE1pbiwgeSAtIGl5TWluKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGVtTWlwbWFwKGRlbTogREVNRGF0YSk6IEFycmF5PE1pcExldmVsPiB7XG4gICAgY29uc3QgZGVtU2l6ZSA9IGRlbS5kaW07XG5cbiAgICBjb25zdCBlbGV2YXRpb25EaWZmVGhyZXNob2xkID0gNTtcbiAgICBjb25zdCB0ZXhlbFNpemVPZk1pcDAgPSA4O1xuICAgIGNvbnN0IGxldmVsQ291bnQgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKGRlbVNpemUgLyB0ZXhlbFNpemVPZk1pcDApKTtcbiAgICBjb25zdCBtaXBzOiBBcnJheTxNaXBMZXZlbD4gPSBbXTtcblxuICAgIGxldCBibG9ja0NvdW50ID0gTWF0aC5jZWlsKE1hdGgucG93KDIsIGxldmVsQ291bnQpKTtcbiAgICBjb25zdCBibG9ja1NpemUgPSAxIC8gYmxvY2tDb3VudDtcblxuICAgIGNvbnN0IGJsb2NrU2FtcGxlcyA9ICh4LCB5LCBzaXplLCBleGNsdXNpdmUsIG91dEJvdW5kcykgPT4ge1xuICAgICAgICBjb25zdCBwYWRkaW5nID0gZXhjbHVzaXZlID8gMSA6IDA7XG4gICAgICAgIGNvbnN0IG1pbnggPSB4ICogc2l6ZTtcbiAgICAgICAgY29uc3QgbWF4eCA9ICh4ICsgMSkgKiBzaXplIC0gcGFkZGluZztcbiAgICAgICAgY29uc3QgbWlueSA9IHkgKiBzaXplO1xuICAgICAgICBjb25zdCBtYXh5ID0gKHkgKyAxKSAqIHNpemUgLSBwYWRkaW5nO1xuXG4gICAgICAgIG91dEJvdW5kc1swXSA9IG1pbng7XG4gICAgICAgIG91dEJvdW5kc1sxXSA9IG1pbnk7XG4gICAgICAgIG91dEJvdW5kc1syXSA9IG1heHg7XG4gICAgICAgIG91dEJvdW5kc1szXSA9IG1heHk7XG4gICAgfTtcblxuICAgIC8vIFRoZSBmaXJzdCBtaXAgKDApIGlzIGJ1aWx0IGJ5IHNhbXBsaW5nIDQgY29ybmVyIHBvaW50cyBvZiBlYWNoIDh4OCB0ZXhlbCBibG9ja1xuICAgIGxldCBtaXAgPSBuZXcgTWlwTGV2ZWwoYmxvY2tDb3VudCk7XG4gICAgY29uc3QgYmxvY2tCb3VuZHMgPSBbXTtcblxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGJsb2NrQ291bnQgKiBibG9ja0NvdW50OyBpZHgrKykge1xuICAgICAgICBjb25zdCB5ID0gTWF0aC5mbG9vcihpZHggLyBibG9ja0NvdW50KTtcbiAgICAgICAgY29uc3QgeCA9IGlkeCAlIGJsb2NrQ291bnQ7XG5cbiAgICAgICAgYmxvY2tTYW1wbGVzKHgsIHksIGJsb2NrU2l6ZSwgZmFsc2UsIGJsb2NrQm91bmRzKTtcblxuICAgICAgICBjb25zdCBlMCA9IHNhbXBsZUVsZXZhdGlvbihibG9ja0JvdW5kc1swXSwgYmxvY2tCb3VuZHNbMV0sIGRlbSk7ICAgIC8vIG1pbngsIG1pbnlcbiAgICAgICAgY29uc3QgZTEgPSBzYW1wbGVFbGV2YXRpb24oYmxvY2tCb3VuZHNbMl0sIGJsb2NrQm91bmRzWzFdLCBkZW0pOyAgICAvLyBtYXh4LCBtaW55XG4gICAgICAgIGNvbnN0IGUyID0gc2FtcGxlRWxldmF0aW9uKGJsb2NrQm91bmRzWzJdLCBibG9ja0JvdW5kc1szXSwgZGVtKTsgICAgLy8gbWF4eCwgbWF4eVxuICAgICAgICBjb25zdCBlMyA9IHNhbXBsZUVsZXZhdGlvbihibG9ja0JvdW5kc1swXSwgYmxvY2tCb3VuZHNbM10sIGRlbSk7ICAgIC8vIG1pbngsIG1heHlcblxuICAgICAgICBtaXAubWluaW11bXMucHVzaChNYXRoLm1pbihlMCwgZTEsIGUyLCBlMykpO1xuICAgICAgICBtaXAubWF4aW11bXMucHVzaChNYXRoLm1heChlMCwgZTEsIGUyLCBlMykpO1xuICAgICAgICBtaXAubGVhdmVzLnB1c2goMSk7XG4gICAgfVxuXG4gICAgbWlwcy5wdXNoKG1pcCk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIHJlc3Qgb2YgdGhlIG1pcCBsZXZlbHMgZnJvbSBib3R0b20gdG8gdXBcbiAgICBmb3IgKGJsb2NrQ291bnQgLz0gMjsgYmxvY2tDb3VudCA+PSAxOyBibG9ja0NvdW50IC89IDIpIHtcbiAgICAgICAgY29uc3QgcHJldk1pcCA9IG1pcHNbbWlwcy5sZW5ndGggLSAxXTtcblxuICAgICAgICBtaXAgPSBuZXcgTWlwTGV2ZWwoYmxvY2tDb3VudCk7XG5cbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgYmxvY2tDb3VudCAqIGJsb2NrQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgICAgICBjb25zdCB5ID0gTWF0aC5mbG9vcihpZHggLyBibG9ja0NvdW50KTtcbiAgICAgICAgICAgIGNvbnN0IHggPSBpZHggJSBibG9ja0NvdW50O1xuXG4gICAgICAgICAgICAvLyBTYW1wbGUgZWxldmF0aW9uIG9mIGFsbCA0IGNoaWxkcmVuIG1pcCB0ZXhlbHMuIDQgbGVhZiBub2RlcyBjYW4gYmUgY29uY2F0ZW5hdGVkIGludG8gYSBzaW5nbGVcbiAgICAgICAgICAgIC8vIGxlYWYgaWYgdGhlIHRvdGFsIGVsZXZhdGlvbiBkaWZmZXJlbmNlIGlzIGJlbG93IHRoZSB0aHJlc2hvbGQgdmFsdWVcbiAgICAgICAgICAgIGJsb2NrU2FtcGxlcyh4LCB5LCAyLCB0cnVlLCBibG9ja0JvdW5kcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGUwID0gcHJldk1pcC5nZXRFbGV2YXRpb24oYmxvY2tCb3VuZHNbMF0sIGJsb2NrQm91bmRzWzFdKTtcbiAgICAgICAgICAgIGNvbnN0IGUxID0gcHJldk1pcC5nZXRFbGV2YXRpb24oYmxvY2tCb3VuZHNbMl0sIGJsb2NrQm91bmRzWzFdKTtcbiAgICAgICAgICAgIGNvbnN0IGUyID0gcHJldk1pcC5nZXRFbGV2YXRpb24oYmxvY2tCb3VuZHNbMl0sIGJsb2NrQm91bmRzWzNdKTtcbiAgICAgICAgICAgIGNvbnN0IGUzID0gcHJldk1pcC5nZXRFbGV2YXRpb24oYmxvY2tCb3VuZHNbMF0sIGJsb2NrQm91bmRzWzNdKTtcblxuICAgICAgICAgICAgY29uc3QgbDAgPSBwcmV2TWlwLmlzTGVhZihibG9ja0JvdW5kc1swXSwgYmxvY2tCb3VuZHNbMV0pO1xuICAgICAgICAgICAgY29uc3QgbDEgPSBwcmV2TWlwLmlzTGVhZihibG9ja0JvdW5kc1syXSwgYmxvY2tCb3VuZHNbMV0pO1xuICAgICAgICAgICAgY29uc3QgbDIgPSBwcmV2TWlwLmlzTGVhZihibG9ja0JvdW5kc1syXSwgYmxvY2tCb3VuZHNbM10pO1xuICAgICAgICAgICAgY29uc3QgbDMgPSBwcmV2TWlwLmlzTGVhZihibG9ja0JvdW5kc1swXSwgYmxvY2tCb3VuZHNbM10pO1xuXG4gICAgICAgICAgICBjb25zdCBtaW5FbGV2YXRpb24gPSBNYXRoLm1pbihlMC5taW4sIGUxLm1pbiwgZTIubWluLCBlMy5taW4pO1xuICAgICAgICAgICAgY29uc3QgbWF4RWxldmF0aW9uID0gTWF0aC5tYXgoZTAubWF4LCBlMS5tYXgsIGUyLm1heCwgZTMubWF4KTtcbiAgICAgICAgICAgIGNvbnN0IGNhbkNvbmNhdGVuYXRlID0gbDAgJiYgbDEgJiYgbDIgJiYgbDM7XG5cbiAgICAgICAgICAgIG1pcC5tYXhpbXVtcy5wdXNoKG1heEVsZXZhdGlvbik7XG4gICAgICAgICAgICBtaXAubWluaW11bXMucHVzaChtaW5FbGV2YXRpb24pO1xuXG4gICAgICAgICAgICBpZiAobWF4RWxldmF0aW9uIC0gbWluRWxldmF0aW9uIDw9IGVsZXZhdGlvbkRpZmZUaHJlc2hvbGQgJiYgY2FuQ29uY2F0ZW5hdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBBbGwgc2FtcGxlcyBoYXZlIHVuaWZvcm0gZWxldmF0aW9uLiBNYXJrIHRoaXMgYXMgYSBsZWFmXG4gICAgICAgICAgICAgICAgbWlwLmxlYXZlcy5wdXNoKDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtaXAubGVhdmVzLnB1c2goMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBtaXBzLnB1c2gobWlwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWlwcztcbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQge1JHQkFJbWFnZX0gZnJvbSAnLi4vdXRpbC9pbWFnZS5qcyc7XG5cbmltcG9ydCB7d2Fybk9uY2UsIGNsYW1wfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcbmltcG9ydCBEZW1NaW5NYXhRdWFkVHJlZSBmcm9tICcuL2RlbV90cmVlLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuLy8gREVNRGF0YSBpcyBhIGRhdGEgc3RydWN0dXJlIGZvciBkZWNvZGluZywgYmFja2ZpbGxpbmcsIGFuZCBzdG9yaW5nIGVsZXZhdGlvbiBkYXRhIGZvciBwcm9jZXNzaW5nIGluIHRoZSBoaWxsc2hhZGUgc2hhZGVyc1xuLy8gZGF0YSBjYW4gYmUgcG9wdWxhdGVkIGVpdGhlciBmcm9tIGEgcG5ncmF3IGltYWdlIHRpbGUgb3IgZnJvbSBzZXJsaWF6ZWQgZGF0YSBzZW50IGJhY2sgZnJvbSBhIHdvcmtlci4gV2hlbiBkYXRhIGlzIGluaXRpYWxseVxuLy8gbG9hZGVkIGZyb20gYSBpbWFnZSB0aWxlLCB3ZSBkZWNvZGUgdGhlIHBpeGVsIHZhbHVlcyB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZGVjb2RpbmcgZm9ybXVsYSwgYnV0IHdlIHN0b3JlIHRoZVxuLy8gZWxldmF0aW9uIGRhdGEgYXMgYW4gSW50MzIgdmFsdWUuIHdlIGFkZCA2NTUzNiAoMl4xNikgdG8gZWxpbWluYXRlIG5lZ2F0aXZlIHZhbHVlcyBhbmQgZW5hYmxlIHRoZSB1c2Ugb2Zcbi8vIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBjcmVhdGluZyB0aGUgdGV4dHVyZSB1c2VkIGluIHRoZSBoaWxsc2hhZGVQcmVwYXJlIHN0ZXAuXG5cbi8vIERFTURhdGEgYWxzbyBoYW5kbGVzIHRoZSBiYWNrZmlsbGluZyBvZiBkYXRhIGZyb20gYSB0aWxlJ3MgbmVpZ2hib3JpbmcgdGlsZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIGEgcGl4ZWwncyA4XG4vLyBzdXJyb3VuZGluZyBwaXhlbCB2YWx1ZXMgdG8gY29tcHV0ZSB0aGUgc2xvcGUgYXQgdGhhdCBwaXhlbCwgYW5kIHdlIGNhbm5vdCBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgc2xvcGUgYXQgcGl4ZWxzIG9uIGFcbi8vIHRpbGUncyBlZGdlIHdpdGhvdXQgYmFja2ZpbGxpbmcgZnJvbSBuZWlnaGJvcmluZyB0aWxlcy5cblxuZXhwb3J0IHR5cGUgREVNRW5jb2RpbmcgPSBcIm1hcGJveFwiIHwgXCJ0ZXJyYXJpdW1cIjtcblxuY29uc3QgdW5wYWNrVmVjdG9ycyA9IHtcbiAgICBtYXBib3g6IFs2NTUzLjYsIDI1LjYsIDAuMSwgMTAwMDAuMF0sXG4gICAgdGVycmFyaXVtOiBbMjU2LjAsIDEuMCwgMS4wIC8gMjU2LjAsIDMyNzY4LjBdXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBERU1EYXRhIHtcbiAgICB1aWQ6IG51bWJlcjtcbiAgICBwaXhlbHM6IFVpbnQ4QXJyYXk7XG4gICAgc3RyaWRlOiBudW1iZXI7XG4gICAgZGltOiBudW1iZXI7XG4gICAgZW5jb2Rpbmc6IERFTUVuY29kaW5nO1xuICAgIGJvcmRlclJlYWR5OiBib29sZWFuO1xuICAgIF90cmVlOiBEZW1NaW5NYXhRdWFkVHJlZTtcbiAgICBnZXQgdHJlZSgpOiBEZW1NaW5NYXhRdWFkVHJlZSB7XG4gICAgICAgIGlmICghdGhpcy5fdHJlZSkgdGhpcy5fYnVpbGRRdWFkVHJlZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJlZTtcbiAgICB9XG5cbiAgICAvLyBSR0JBSW1hZ2UgZGF0YSBoYXMgdW5pZm9ybSAxcHggcGFkZGluZyBvbiBhbGwgc2lkZXM6IHNxdWFyZSB0aWxlIGVkZ2Ugc2l6ZSBkZWZpbmVzIHN0cmlkZVxuICAgIC8vIGFuZCBkaW0gaXMgY2FsY3VsYXRlZCBhcyBzdHJpZGUgLSAyLlxuICAgIGNvbnN0cnVjdG9yKHVpZDogbnVtYmVyLCBkYXRhOiBJbWFnZURhdGEsIGVuY29kaW5nOiBERU1FbmNvZGluZywgYm9yZGVyUmVhZHk6IGJvb2xlYW4gPSBmYWxzZSwgYnVpbGRRdWFkVHJlZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMudWlkID0gdWlkO1xuICAgICAgICBpZiAoZGF0YS5oZWlnaHQgIT09IGRhdGEud2lkdGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdERU0gdGlsZXMgbXVzdCBiZSBzcXVhcmUnKTtcbiAgICAgICAgaWYgKGVuY29kaW5nICYmIGVuY29kaW5nICE9PSBcIm1hcGJveFwiICYmIGVuY29kaW5nICE9PSBcInRlcnJhcml1bVwiKSByZXR1cm4gd2Fybk9uY2UoXG4gICAgICAgICAgICBgXCIke2VuY29kaW5nfVwiIGlzIG5vdCBhIHZhbGlkIGVuY29kaW5nIHR5cGUuIFZhbGlkIHR5cGVzIGluY2x1ZGUgXCJtYXBib3hcIiBhbmQgXCJ0ZXJyYXJpdW1cIi5gXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc3RyaWRlID0gZGF0YS5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGRpbSA9IHRoaXMuZGltID0gZGF0YS5oZWlnaHQgLSAyO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5kYXRhLmJ1ZmZlcik7XG4gICAgICAgIHRoaXMucGl4ZWxzID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5kYXRhLmJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAnbWFwYm94JztcbiAgICAgICAgdGhpcy5ib3JkZXJSZWFkeSA9IGJvcmRlclJlYWR5O1xuXG4gICAgICAgIGlmIChib3JkZXJSZWFkeSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIGluIG9yZGVyIHRvIGF2b2lkIGZsYXNoaW5nIHNlYW1zIGJldHdlZW4gdGlsZXMsIGhlcmUgd2UgYXJlIGluaXRpYWxseSBwb3B1bGF0aW5nIGEgMXB4IGJvcmRlciBvZiBwaXhlbHMgYXJvdW5kIHRoZSBpbWFnZVxuICAgICAgICAvLyB3aXRoIHRoZSBkYXRhIG9mIHRoZSBuZWFyZXN0IHBpeGVsIGZyb20gdGhlIGltYWdlLiB0aGlzIGRhdGEgaXMgZXZlbnR1YWxseSByZXBsYWNlZCB3aGVuIHRoZSB0aWxlJ3MgbmVpZ2hib3JpbmdcbiAgICAgICAgLy8gdGlsZXMgYXJlIGxvYWRlZCBhbmQgdGhlIGFjY3VyYXRlIGRhdGEgY2FuIGJlIGJhY2tmaWxsZWQgdXNpbmcgREVNRGF0YSNiYWNrZmlsbEJvcmRlclxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGRpbTsgeCsrKSB7XG4gICAgICAgICAgICAvLyBsZWZ0IHZlcnRpY2FsIGJvcmRlclxuICAgICAgICAgICAgdmFsdWVzW3RoaXMuX2lkeCgtMSwgeCldID0gdmFsdWVzW3RoaXMuX2lkeCgwLCB4KV07XG4gICAgICAgICAgICAvLyByaWdodCB2ZXJ0aWNhbCBib3JkZXJcbiAgICAgICAgICAgIHZhbHVlc1t0aGlzLl9pZHgoZGltLCB4KV0gPSB2YWx1ZXNbdGhpcy5faWR4KGRpbSAtIDEsIHgpXTtcbiAgICAgICAgICAgIC8vIGxlZnQgaG9yaXpvbnRhbCBib3JkZXJcbiAgICAgICAgICAgIHZhbHVlc1t0aGlzLl9pZHgoeCwgLTEpXSA9IHZhbHVlc1t0aGlzLl9pZHgoeCwgMCldO1xuICAgICAgICAgICAgLy8gcmlnaHQgaG9yaXpvbnRhbCBib3JkZXJcbiAgICAgICAgICAgIHZhbHVlc1t0aGlzLl9pZHgoeCwgZGltKV0gPSB2YWx1ZXNbdGhpcy5faWR4KHgsIGRpbSAtIDEpXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb3JuZXJzXG4gICAgICAgIHZhbHVlc1t0aGlzLl9pZHgoLTEsIC0xKV0gPSB2YWx1ZXNbdGhpcy5faWR4KDAsIDApXTtcbiAgICAgICAgdmFsdWVzW3RoaXMuX2lkeChkaW0sIC0xKV0gPSB2YWx1ZXNbdGhpcy5faWR4KGRpbSAtIDEsIDApXTtcbiAgICAgICAgdmFsdWVzW3RoaXMuX2lkeCgtMSwgZGltKV0gPSB2YWx1ZXNbdGhpcy5faWR4KDAsIGRpbSAtIDEpXTtcbiAgICAgICAgdmFsdWVzW3RoaXMuX2lkeChkaW0sIGRpbSldID0gdmFsdWVzW3RoaXMuX2lkeChkaW0gLSAxLCBkaW0gLSAxKV07XG4gICAgICAgIGlmIChidWlsZFF1YWRUcmVlKSB0aGlzLl9idWlsZFF1YWRUcmVlKCk7XG4gICAgfVxuXG4gICAgX2J1aWxkUXVhZFRyZWUoKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5fdHJlZSk7XG4gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgaW1wbGljaXQgc3BhcnNlIHF1YWQgdHJlZSBieSB0cmF2ZXJzaW5nIG1pcHMgZnJvbSB0b3AgdG8gZG93blxuICAgICAgICB0aGlzLl90cmVlID0gbmV3IERlbU1pbk1heFF1YWRUcmVlKHRoaXMpO1xuICAgIH1cblxuICAgIGdldCh4OiBudW1iZXIsIHk6IG51bWJlciwgY2xhbXBUb0VkZ2U6IGJvb2xlYW4gPSBmYWxzZSk6IG51bWJlciB7XG4gICAgICAgIGlmIChjbGFtcFRvRWRnZSkge1xuICAgICAgICAgICAgeCA9IGNsYW1wKHgsIC0xLCB0aGlzLmRpbSk7XG4gICAgICAgICAgICB5ID0gY2xhbXAoeSwgLTEsIHRoaXMuZGltKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2lkeCh4LCB5KSAqIDQ7XG4gICAgICAgIGNvbnN0IHVucGFjayA9IHRoaXMuZW5jb2RpbmcgPT09IFwidGVycmFyaXVtXCIgPyB0aGlzLl91bnBhY2tUZXJyYXJpdW0gOiB0aGlzLl91bnBhY2tNYXBib3g7XG4gICAgICAgIHJldHVybiB1bnBhY2sodGhpcy5waXhlbHNbaW5kZXhdLCB0aGlzLnBpeGVsc1tpbmRleCArIDFdLCB0aGlzLnBpeGVsc1tpbmRleCArIDJdKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0VW5wYWNrVmVjdG9yKGVuY29kaW5nOiBERU1FbmNvZGluZyk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgcmV0dXJuIHVucGFja1ZlY3RvcnNbZW5jb2RpbmddO1xuICAgIH1cblxuICAgIGdldCB1bnBhY2tWZWN0b3IoKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICByZXR1cm4gdW5wYWNrVmVjdG9yc1t0aGlzLmVuY29kaW5nXTtcbiAgICB9XG5cbiAgICBfaWR4KHg6IG51bWJlciwgeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHggPCAtMSB8fCB4ID49IHRoaXMuZGltICsgMSB8fCAgeSA8IC0xIHx8IHkgPj0gdGhpcy5kaW0gKyAxKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb3V0IG9mIHJhbmdlIHNvdXJjZSBjb29yZGluYXRlcyBmb3IgREVNIGRhdGEnKTtcbiAgICAgICAgcmV0dXJuICh5ICsgMSkgKiB0aGlzLnN0cmlkZSArICh4ICsgMSk7XG4gICAgfVxuXG4gICAgX3VucGFja01hcGJveChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgLy8gdW5wYWNraW5nIGZvcm11bGEgZm9yIG1hcGJveC50ZXJyYWluLXJnYjpcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cubWFwYm94LmNvbS9oZWxwL2FjY2Vzcy1lbGV2YXRpb24tZGF0YS8jbWFwYm94LXRlcnJhaW4tcmdiXG4gICAgICAgIHJldHVybiAoKHIgKiAyNTYgKiAyNTYgKyBnICogMjU2LjAgKyBiKSAvIDEwLjAgLSAxMDAwMC4wKTtcbiAgICB9XG5cbiAgICBfdW5wYWNrVGVycmFyaXVtKHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICAvLyB1bnBhY2tpbmcgZm9ybXVsYSBmb3IgbWFwemVuIHRlcnJhcml1bTpcbiAgICAgICAgLy8gaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9wdWJsaWMtZGF0YXNldHMvdGVycmFpbi9cbiAgICAgICAgcmV0dXJuICgociAqIDI1NiArIGcgKyBiIC8gMjU2KSAtIDMyNzY4LjApO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYWNrKGFsdGl0dWRlOiBudW1iZXIsIGVuY29kaW5nOiBERU1FbmNvZGluZyk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSBbMCwgMCwgMCwgMF07XG4gICAgICAgIGNvbnN0IHZlY3RvciA9IERFTURhdGEuZ2V0VW5wYWNrVmVjdG9yKGVuY29kaW5nKTtcbiAgICAgICAgbGV0IHYgPSBNYXRoLmZsb29yKChhbHRpdHVkZSArIHZlY3RvclszXSkgLyB2ZWN0b3JbMl0pO1xuICAgICAgICBjb2xvclsyXSA9IHYgJSAyNTY7XG4gICAgICAgIHYgPSBNYXRoLmZsb29yKHYgLyAyNTYpO1xuICAgICAgICBjb2xvclsxXSA9IHYgJSAyNTY7XG4gICAgICAgIHYgPSBNYXRoLmZsb29yKHYgLyAyNTYpO1xuICAgICAgICBjb2xvclswXSA9IHY7XG4gICAgICAgIHJldHVybiBjb2xvcjtcbiAgICB9XG5cbiAgICBnZXRQaXhlbHMoKTogUkdCQUltYWdlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSR0JBSW1hZ2Uoe3dpZHRoOiB0aGlzLnN0cmlkZSwgaGVpZ2h0OiB0aGlzLnN0cmlkZX0sIHRoaXMucGl4ZWxzKTtcbiAgICB9XG5cbiAgICBiYWNrZmlsbEJvcmRlcihib3JkZXJUaWxlOiBERU1EYXRhLCBkeDogbnVtYmVyLCBkeTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmRpbSAhPT0gYm9yZGVyVGlsZS5kaW0pIHRocm93IG5ldyBFcnJvcignZGVtIGRpbWVuc2lvbiBtaXNtYXRjaCcpO1xuXG4gICAgICAgIGxldCB4TWluID0gZHggKiB0aGlzLmRpbSxcbiAgICAgICAgICAgIHhNYXggPSBkeCAqIHRoaXMuZGltICsgdGhpcy5kaW0sXG4gICAgICAgICAgICB5TWluID0gZHkgKiB0aGlzLmRpbSxcbiAgICAgICAgICAgIHlNYXggPSBkeSAqIHRoaXMuZGltICsgdGhpcy5kaW07XG5cbiAgICAgICAgc3dpdGNoIChkeCkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgICAgeE1pbiA9IHhNYXggLSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHhNYXggPSB4TWluICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChkeSkge1xuICAgICAgICBjYXNlIC0xOlxuICAgICAgICAgICAgeU1pbiA9IHlNYXggLSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHlNYXggPSB5TWluICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3ggPSAtZHggKiB0aGlzLmRpbTtcbiAgICAgICAgY29uc3Qgb3kgPSAtZHkgKiB0aGlzLmRpbTtcbiAgICAgICAgZm9yIChsZXQgeSA9IHlNaW47IHkgPCB5TWF4OyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDwgeE1heDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaSA9IDQgKiB0aGlzLl9pZHgoeCwgeSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaiA9IDQgKiB0aGlzLl9pZHgoeCArIG94LCB5ICsgb3kpO1xuICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxzW2kgKyAwXSA9IGJvcmRlclRpbGUucGl4ZWxzW2ogKyAwXTtcbiAgICAgICAgICAgICAgICB0aGlzLnBpeGVsc1tpICsgMV0gPSBib3JkZXJUaWxlLnBpeGVsc1tqICsgMV07XG4gICAgICAgICAgICAgICAgdGhpcy5waXhlbHNbaSArIDJdID0gYm9yZGVyVGlsZS5waXhlbHNbaiArIDJdO1xuICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxzW2kgKyAzXSA9IGJvcmRlclRpbGUucGl4ZWxzW2ogKyAzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uRGVzZXJpYWxpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLl90cmVlKSB0aGlzLl90cmVlLmRlbSA9IHRoaXM7XG4gICAgfVxufVxuXG5yZWdpc3RlcihERU1EYXRhLCAnREVNRGF0YScpO1xucmVnaXN0ZXIoRGVtTWluTWF4UXVhZFRyZWUsICdEZW1NaW5NYXhRdWFkVHJlZScsIHtvbWl0OiBbJ2RlbSddfSk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4vdGlsZS5qcyc7XG5cbi8qKlxuICogQSBbbGVhc3QtcmVjZW50bHktdXNlZCBjYWNoZV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYWNoZV9hbGdvcml0aG1zKVxuICogd2l0aCBoYXNoIGxvb2t1cCBtYWRlIHBvc3NpYmxlIGJ5IGtlZXBpbmcgYSBsaXN0IG9mIGtleXMgaW4gcGFyYWxsZWwgdG9cbiAqIGFuIGFycmF5IG9mIGRpY3Rpb25hcnkgb2YgdmFsdWVzXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVGlsZUNhY2hlIHtcbiAgICBtYXg6IG51bWJlcjtcbiAgICBkYXRhOiB7W2tleTogc3RyaW5nIHwgbnVtYmVyXTogQXJyYXk8eyB2YWx1ZTogVGlsZSwgdGltZW91dDogP1RpbWVvdXRJRH0+fTtcbiAgICBvcmRlcjogQXJyYXk8bnVtYmVyPjtcbiAgICBvblJlbW92ZTogKGVsZW1lbnQ6IFRpbGUpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heCBUaGUgbWF4IG51bWJlciBvZiBwZXJtaXR0ZWQgdmFsdWVzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25SZW1vdmUgVGhlIGNhbGxiYWNrIGNhbGxlZCB3aXRoIGl0ZW1zIHdoZW4gdGhleSBleHBpcmUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWF4OiBudW1iZXIsIG9uUmVtb3ZlOiAoZWxlbWVudDogVGlsZSkgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcbiAgICAgICAgdGhpcy5vblJlbW92ZSA9IG9uUmVtb3ZlO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHJlc2V0KCk6IHRoaXMge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVtb3ZlZERhdGEgb2YgdGhpcy5kYXRhW2tleV0pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZERhdGEudGltZW91dCkgY2xlYXJUaW1lb3V0KHJlbW92ZWREYXRhLnRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMub25SZW1vdmUocmVtb3ZlZERhdGEudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kYXRhID0ge307XG4gICAgICAgIHRoaXMub3JkZXIgPSBbXTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBrZXksIHZhbHVlIGNvbWJpbmF0aW9uIHRvIHRoZSBjYWNoZSwgdHJpbW1pbmcgaXRzIHNpemUgaWYgdGhpcyBwdXNoZXNcbiAgICAgKiBpdCBvdmVyIG1heCBsZW5ndGguXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge092ZXJzY2FsZWRUaWxlSUR9IHRpbGVJRCBsb29rdXAga2V5IGZvciB0aGUgaXRlbVxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBhbnkgdmFsdWVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtUaWxlQ2FjaGV9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGQodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCBkYXRhOiBUaWxlLCBleHBpcnlUaW1lb3V0OiBudW1iZXIgfCB2b2lkKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRpbGVJRC53cmFwcGVkKCkua2V5O1xuICAgICAgICBpZiAodGhpcy5kYXRhW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhW2tleV0gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGFXcmFwcGVyID0ge1xuICAgICAgICAgICAgdmFsdWU6IGRhdGEsXG4gICAgICAgICAgICB0aW1lb3V0OiB1bmRlZmluZWRcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZXhwaXJ5VGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkYXRhV3JhcHBlci50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUodGlsZUlELCBkYXRhV3JhcHBlcik7XG4gICAgICAgICAgICB9LCBleHBpcnlUaW1lb3V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YVtrZXldLnB1c2goZGF0YVdyYXBwZXIpO1xuICAgICAgICB0aGlzLm9yZGVyLnB1c2goa2V5KTtcblxuICAgICAgICBpZiAodGhpcy5vcmRlci5sZW5ndGggPiB0aGlzLm1heCkge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZERhdGEgPSB0aGlzLl9nZXRBbmRSZW1vdmVCeUtleSh0aGlzLm9yZGVyWzBdKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkRGF0YSkgdGhpcy5vblJlbW92ZShyZW1vdmVkRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgdmFsdWUgYXR0YWNoZWQgdG8gYGtleWAgaXMgcHJlc2VudFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPdmVyc2NhbGVkVGlsZUlEfSB0aWxlSUQgdGhlIGtleSB0byBiZSBsb29rZWQtdXBcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgY2FjaGUgaGFzIHRoaXMgdmFsdWVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGhhcyh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRpbGVJRC53cmFwcGVkKCkua2V5IGluIHRoaXMuZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGF0dGFjaGVkIHRvIGEgc3BlY2lmaWMga2V5IGFuZCByZW1vdmUgZGF0YSBmcm9tIGNhY2hlLlxuICAgICAqIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kLCByZXR1cm5zIGBudWxsYFxuICAgICAqXG4gICAgICogQHBhcmFtIHtPdmVyc2NhbGVkVGlsZUlEfSB0aWxlSUQgdGhlIGtleSB0byBsb29rIHVwXG4gICAgICogQHJldHVybnMgeyp9IHRoZSBkYXRhLCBvciBudWxsIGlmIGl0IGlzbid0IGZvdW5kXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRBbmRSZW1vdmUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogP1RpbGUge1xuICAgICAgICBpZiAoIXRoaXMuaGFzKHRpbGVJRCkpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFuZFJlbW92ZUJ5S2V5KHRpbGVJRC53cmFwcGVkKCkua2V5KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEdldCBhbmQgcmVtb3ZlIHRoZSB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LlxuICAgICAqL1xuICAgIF9nZXRBbmRSZW1vdmVCeUtleShrZXk6IG51bWJlcik6ID9UaWxlIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YVtrZXldLnNoaWZ0KCk7XG4gICAgICAgIGlmIChkYXRhLnRpbWVvdXQpIGNsZWFyVGltZW91dChkYXRhLnRpbWVvdXQpO1xuXG4gICAgICAgIGlmICh0aGlzLmRhdGFba2V5XS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRhdGFba2V5XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2Yoa2V5KSwgMSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGEudmFsdWU7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBHZXQgdGhlIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCAod3JhcHBlZCB0aWxlKSBrZXkuXG4gICAgICovXG4gICAgZ2V0QnlLZXkoa2V5OiBudW1iZXIpOiA/VGlsZSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFba2V5XTtcbiAgICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhWzBdLnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIGF0dGFjaGVkIHRvIGEgc3BlY2lmaWMga2V5IHdpdGhvdXQgcmVtb3ZpbmcgZGF0YVxuICAgICAqIGZyb20gdGhlIGNhY2hlLiBJZiB0aGUga2V5IGlzIG5vdCBmb3VuZCwgcmV0dXJucyBgbnVsbGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIHRoZSBrZXkgdG8gbG9vayB1cFxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgZGF0YSwgb3IgbnVsbCBpZiBpdCBpc24ndCBmb3VuZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0KHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6ID9UaWxlIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhcyh0aWxlSUQpKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YVt0aWxlSUQud3JhcHBlZCgpLmtleV1bMF07XG4gICAgICAgIHJldHVybiBkYXRhLnZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGtleS92YWx1ZSBjb21iaW5hdGlvbiBmcm9tIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIHRoZSBrZXkgZm9yIHRoZSBwYWlyIHRvIGRlbGV0ZVxuICAgICAqIEBwYXJhbSB7VGlsZX0gdmFsdWUgSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCwgcmVtb3ZlIHRoYXQgZXhhY3QgdmVyc2lvbiBvZiB0aGUgdmFsdWUuXG4gICAgICogQHJldHVybnMge1RpbGVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVtb3ZlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgdmFsdWU6ID97IHZhbHVlOiBUaWxlLCB0aW1lb3V0OiA/VGltZW91dElEfSk6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMuaGFzKHRpbGVJRCkpIHsgcmV0dXJuIHRoaXM7IH1cbiAgICAgICAgY29uc3Qga2V5ID0gdGlsZUlELndyYXBwZWQoKS5rZXk7XG5cbiAgICAgICAgY29uc3QgZGF0YUluZGV4ID0gdmFsdWUgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLmRhdGFba2V5XS5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YVtrZXldW2RhdGFJbmRleF07XG4gICAgICAgIHRoaXMuZGF0YVtrZXldLnNwbGljZShkYXRhSW5kZXgsIDEpO1xuICAgICAgICBpZiAoZGF0YS50aW1lb3V0KSBjbGVhclRpbWVvdXQoZGF0YS50aW1lb3V0KTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVtrZXldLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25SZW1vdmUoZGF0YS52YWx1ZSk7XG4gICAgICAgIHRoaXMub3JkZXIuc3BsaWNlKHRoaXMub3JkZXIuaW5kZXhPZihrZXkpLCAxKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG1heCBzaXplIG9mIHRoZSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXggdGhlIG1heCBzaXplIG9mIHRoZSBjYWNoZVxuICAgICAqIEByZXR1cm5zIHtUaWxlQ2FjaGV9IHRoaXMgY2FjaGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNldE1heFNpemUobWF4OiBudW1iZXIpOiBUaWxlQ2FjaGUge1xuICAgICAgICB0aGlzLm1heCA9IG1heDtcblxuICAgICAgICB3aGlsZSAodGhpcy5vcmRlci5sZW5ndGggPiB0aGlzLm1heCkge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZERhdGEgPSB0aGlzLl9nZXRBbmRSZW1vdmVCeUtleSh0aGlzLm9yZGVyWzBdKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkRGF0YSkgdGhpcy5vblJlbW92ZShyZW1vdmVkRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZW50cmllcyB0aGF0IGRvIG5vdCBwYXNzIGEgZmlsdGVyIGZ1bmN0aW9uLiBVc2VkIGZvciByZW1vdmluZ1xuICAgICAqIHN0YWxlIHRpbGVzIGZyb20gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBmaWx0ZXJGbiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRpbGUgaXMgZmlsdGVyZWQuIElmIHRoZSBzdXBwbGllZCBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgdGlsZSB3aWxsIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKi9cbiAgICBmaWx0ZXIoZmlsdGVyRm46ICh0aWxlOiBUaWxlKSA9PiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZGF0YVtrZXldKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJGbihlbnRyeS52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByIG9mIHJlbW92ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlKHIudmFsdWUudGlsZUlELCByKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGlsZUNhY2hlO1xuIiwiLy8gQGZsb3dcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUge1N0cnVjdEFycmF5fSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5pbXBvcnQgdHlwZSB7VHJpYW5nbGVJbmRleEFycmF5LCBMaW5lSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheX0gZnJvbSAnLi4vZGF0YS9pbmRleF9hcnJheV90eXBlLmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5cbmNsYXNzIEluZGV4QnVmZmVyIHtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuICAgIGJ1ZmZlcjogV2ViR0xCdWZmZXI7XG4gICAgZHluYW1pY0RyYXc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCBhcnJheTogVHJpYW5nbGVJbmRleEFycmF5IHwgTGluZUluZGV4QXJyYXkgfCBMaW5lU3RyaXBJbmRleEFycmF5LCBkeW5hbWljRHJhdz86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICB0aGlzLmR5bmFtaWNEcmF3ID0gQm9vbGVhbihkeW5hbWljRHJhdyk7XG5cbiAgICAgICAgLy8gVGhlIGJvdW5kIGluZGV4IGJ1ZmZlciBpcyBwYXJ0IG9mIHZlcnRleCBhcnJheSBvYmplY3Qgc3RhdGUuIFdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gbW9kaWZ5IHdoYXRldmVyIFZBTyBoYXBwZW5zIHRvIGJlIGN1cnJlbnRseSBib3VuZCwgc28gbWFrZSBzdXJlIHRoZSBkZWZhdWx0XG4gICAgICAgIC8vIHZlcnRleCBhcnJheSBwcm92aWRlZCBieSB0aGUgY29udGV4dCBpcyBib3VuZCBpbnN0ZWFkLlxuICAgICAgICB0aGlzLmNvbnRleHQudW5iaW5kVkFPKCk7XG5cbiAgICAgICAgY29udGV4dC5iaW5kRWxlbWVudEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBhcnJheS5hcnJheUJ1ZmZlciwgdGhpcy5keW5hbWljRHJhdyA/IGdsLkRZTkFNSUNfRFJBVyA6IGdsLlNUQVRJQ19EUkFXKTtcblxuICAgICAgICBpZiAoIXRoaXMuZHluYW1pY0RyYXcpIHtcbiAgICAgICAgICAgIGFycmF5LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5iaW5kRWxlbWVudEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgIH1cblxuICAgIHVwZGF0ZURhdGEoYXJyYXk6IFN0cnVjdEFycmF5KSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICBhc3NlcnQodGhpcy5keW5hbWljRHJhdyk7XG4gICAgICAgIC8vIFRoZSByaWdodCBWQU8gd2lsbCBnZXQgdGhpcyBidWZmZXIgcmUtYm91bmQgbGF0ZXIgaW4gVmVydGV4QXJyYXlPYmplY3QjYmluZFxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzU2MjBcbiAgICAgICAgdGhpcy5jb250ZXh0LnVuYmluZFZBTygpO1xuICAgICAgICB0aGlzLmJpbmQoKTtcbiAgICAgICAgZ2wuYnVmZmVyU3ViRGF0YShnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCwgYXJyYXkuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5idWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEluZGV4QnVmZmVyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgU3RydWN0QXJyYXksXG4gICAgU3RydWN0QXJyYXlNZW1iZXJcbn0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5pbXBvcnQgdHlwZSBQcm9ncmFtIGZyb20gJy4uL3JlbmRlci9wcm9ncmFtLmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5cbi8qKlxuICogQGVudW0ge3N0cmluZ30gQXR0cmlidXRlVHlwZVxuICogQHByaXZhdGVcbiAqIEByZWFkb25seVxuICovXG5jb25zdCBBdHRyaWJ1dGVUeXBlID0ge1xuICAgIEludDg6ICAgJ0JZVEUnLFxuICAgIFVpbnQ4OiAgJ1VOU0lHTkVEX0JZVEUnLFxuICAgIEludDE2OiAgJ1NIT1JUJyxcbiAgICBVaW50MTY6ICdVTlNJR05FRF9TSE9SVCcsXG4gICAgSW50MzI6ICAnSU5UJyxcbiAgICBVaW50MzI6ICdVTlNJR05FRF9JTlQnLFxuICAgIEZsb2F0MzI6ICdGTE9BVCdcbn07XG5cbi8qKlxuICogVGhlIGBWZXJ0ZXhCdWZmZXJgIGNsYXNzIHR1cm5zIGEgYFN0cnVjdEFycmF5YCBpbnRvIGEgV2ViR0wgYnVmZmVyLiBFYWNoIG1lbWJlciBvZiB0aGUgU3RydWN0QXJyYXknc1xuICogU3RydWN0IHR5cGUgaXMgY29udmVydGVkIHRvIGEgV2ViR0wgYXRyaWJ1dGUuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBWZXJ0ZXhCdWZmZXIge1xuICAgIGxlbmd0aDogbnVtYmVyO1xuICAgIGF0dHJpYnV0ZXM6ICRSZWFkT25seUFycmF5PFN0cnVjdEFycmF5TWVtYmVyPjtcbiAgICBpdGVtU2l6ZTogbnVtYmVyO1xuICAgIGR5bmFtaWNEcmF3OiA/Ym9vbGVhbjtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuICAgIGJ1ZmZlcjogV2ViR0xCdWZmZXI7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZHluYW1pY0RyYXcgV2hldGhlciB0aGlzIGJ1ZmZlciB3aWxsIGJlIHJlcGVhdGVkbHkgdXBkYXRlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIGFycmF5OiBTdHJ1Y3RBcnJheSwgYXR0cmlidXRlczogJFJlYWRPbmx5QXJyYXk8U3RydWN0QXJyYXlNZW1iZXI+LCBkeW5hbWljRHJhdz86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgICAgIHRoaXMuaXRlbVNpemUgPSBhcnJheS5ieXRlc1BlckVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZHluYW1pY0RyYXcgPSBkeW5hbWljRHJhdztcblxuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIGNvbnRleHQuYmluZFZlcnRleEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgICAgICBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgYXJyYXkuYXJyYXlCdWZmZXIsIHRoaXMuZHluYW1pY0RyYXcgPyBnbC5EWU5BTUlDX0RSQVcgOiBnbC5TVEFUSUNfRFJBVyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmR5bmFtaWNEcmF3KSB7XG4gICAgICAgICAgICBhcnJheS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuYmluZFZlcnRleEJ1ZmZlci5zZXQodGhpcy5idWZmZXIpO1xuICAgIH1cblxuICAgIHVwZGF0ZURhdGEoYXJyYXk6IFN0cnVjdEFycmF5KSB7XG4gICAgICAgIGFzc2VydChhcnJheS5sZW5ndGggPT09IHRoaXMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuICAgICAgICBnbC5idWZmZXJTdWJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgMCwgYXJyYXkuYXJyYXlCdWZmZXIpO1xuICAgIH1cblxuICAgIGVuYWJsZUF0dHJpYnV0ZXMoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcHJvZ3JhbTogUHJvZ3JhbTwqPikge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3QgbWVtYmVyID0gdGhpcy5hdHRyaWJ1dGVzW2pdO1xuICAgICAgICAgICAgY29uc3QgYXR0cmliSW5kZXg6IG51bWJlciB8IHZvaWQgPSBwcm9ncmFtLmF0dHJpYnV0ZXNbbWVtYmVyLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGF0dHJpYkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShhdHRyaWJJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGF0dHJpYnV0ZSBwb2ludGVycyBpbiBhIFdlYkdMIGNvbnRleHQuXG4gICAgICogQHBhcmFtIGdsIFRoZSBXZWJHTCBjb250ZXh0LlxuICAgICAqIEBwYXJhbSBwcm9ncmFtIFRoZSBhY3RpdmUgV2ViR0wgcHJvZ3JhbS5cbiAgICAgKiBAcGFyYW0gdmVydGV4T2Zmc2V0IEluZGV4IG9mIHRoZSBzdGFydGluZyB2ZXJ0ZXggb2YgdGhlIHNlZ21lbnQuXG4gICAgICovXG4gICAgc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcHJvZ3JhbTogUHJvZ3JhbTwqPiwgdmVydGV4T2Zmc2V0OiA/bnVtYmVyKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBtZW1iZXIgPSB0aGlzLmF0dHJpYnV0ZXNbal07XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJJbmRleDogbnVtYmVyIHwgdm9pZCA9IHByb2dyYW0uYXR0cmlidXRlc1ttZW1iZXIubmFtZV07XG5cbiAgICAgICAgICAgIGlmIChhdHRyaWJJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIG1lbWJlci5jb21wb25lbnRzLFxuICAgICAgICAgICAgICAgICAgICAoZ2w6IGFueSlbQXR0cmlidXRlVHlwZVttZW1iZXIudHlwZV1dLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyLm9mZnNldCArICh0aGlzLml0ZW1TaXplICogKHZlcnRleE9mZnNldCB8fCAwKSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGUgR0wgYnVmZmVyIGJvdW5kIHRvIHRoZSBnaXZlbiBXZWJHTCBjb250ZXh0LlxuICAgICAqL1xuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgIGdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5idWZmZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZlcnRleEJ1ZmZlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4vY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQmxlbmRGdW5jVHlwZSxcbiAgICBCbGVuZEVxdWF0aW9uVHlwZSxcbiAgICBDb2xvck1hc2tUeXBlLFxuICAgIERlcHRoUmFuZ2VUeXBlLFxuICAgIERlcHRoTWFza1R5cGUsXG4gICAgU3RlbmNpbEZ1bmNUeXBlLFxuICAgIFN0ZW5jaWxPcFR5cGUsXG4gICAgRGVwdGhGdW5jVHlwZSxcbiAgICBUZXh0dXJlVW5pdFR5cGUsXG4gICAgVmlld3BvcnRUeXBlLFxuICAgIEN1bGxGYWNlTW9kZVR5cGUsXG4gICAgRnJvbnRGYWNlVHlwZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWU8VD4ge1xuICAgIGN1cnJlbnQ6IFQ7XG4gICAgZGVmYXVsdDogVDtcbiAgICBkaXJ0eTogYm9vbGVhbjtcbiAgICBnZXQoKTogVDtcbiAgICBzZXREZWZhdWx0KCk6IHZvaWQ7XG4gICAgc2V0KHZhbHVlOiBUKTogdm9pZDtcbn1cblxuY2xhc3MgQmFzZVZhbHVlPFQ+IGltcGxlbWVudHMgVmFsdWU8VD4ge1xuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG4gICAgY3VycmVudDogVDtcbiAgICBkZWZhdWx0OiBUO1xuICAgIGRpcnR5OiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICB0aGlzLmdsID0gY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5kZWZhdWx0ID0gdGhpcy5nZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMuZGVmYXVsdDtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdldCgpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudDtcbiAgICB9XG4gICAgc2V0KHZhbHVlOiBUKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgLy8gb3ZlcnJpZGRlbiBpbiBjaGlsZCBjbGFzc2VzO1xuICAgIH1cblxuICAgIGdldERlZmF1bHQoKTogVCB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHQ7IC8vIG92ZXJyaWRlbiBpbiBjaGlsZCBjbGFzc2VzXG4gICAgfVxuICAgIHNldERlZmF1bHQoKSB7XG4gICAgICAgIHRoaXMuc2V0KHRoaXMuZGVmYXVsdCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYXJDb2xvciBleHRlbmRzIEJhc2VWYWx1ZTxDb2xvcj4ge1xuICAgIGdldERlZmF1bHQoKTogQ29sb3Ige1xuICAgICAgICByZXR1cm4gQ29sb3IudHJhbnNwYXJlbnQ7XG4gICAgfVxuICAgIHNldCh2OiBDb2xvcikge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodi5yID09PSBjLnIgJiYgdi5nID09PSBjLmcgJiYgdi5iID09PSBjLmIgJiYgdi5hID09PSBjLmEgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5jbGVhckNvbG9yKHYuciwgdi5nLCB2LmIsIHYuYSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhckRlcHRoIGV4dGVuZHMgQmFzZVZhbHVlPG51bWJlcj4ge1xuICAgIGdldERlZmF1bHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHNldCh2OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmNsZWFyRGVwdGgodik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhclN0ZW5jaWwgZXh0ZW5kcyBCYXNlVmFsdWU8bnVtYmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgc2V0KHY6IG51bWJlcikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuY2xlYXJTdGVuY2lsKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sb3JNYXNrIGV4dGVuZHMgQmFzZVZhbHVlPENvbG9yTWFza1R5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IENvbG9yTWFza1R5cGUge1xuICAgICAgICByZXR1cm4gW3RydWUsIHRydWUsIHRydWUsIHRydWVdO1xuICAgIH1cbiAgICBzZXQodjogQ29sb3JNYXNrVHlwZSkge1xuICAgICAgICBjb25zdCBjID0gdGhpcy5jdXJyZW50O1xuICAgICAgICBpZiAodlswXSA9PT0gY1swXSAmJiB2WzFdID09PSBjWzFdICYmIHZbMl0gPT09IGNbMl0gJiYgdlszXSA9PT0gY1szXSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmNvbG9yTWFzayh2WzBdLCB2WzFdLCB2WzJdLCB2WzNdKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRoTWFzayBleHRlbmRzIEJhc2VWYWx1ZTxEZXB0aE1hc2tUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBEZXB0aE1hc2tUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNldCh2OiBEZXB0aE1hc2tUeXBlKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5kZXB0aE1hc2sodik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGVuY2lsTWFzayBleHRlbmRzIEJhc2VWYWx1ZTxudW1iZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAweEZGO1xuICAgIH1cbiAgICBzZXQodjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5zdGVuY2lsTWFzayh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN0ZW5jaWxGdW5jIGV4dGVuZHMgQmFzZVZhbHVlPFN0ZW5jaWxGdW5jVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogU3RlbmNpbEZ1bmNUeXBlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZ1bmM6IHRoaXMuZ2wuQUxXQVlTLFxuICAgICAgICAgICAgcmVmOiAwLFxuICAgICAgICAgICAgbWFzazogMHhGRlxuICAgICAgICB9O1xuICAgIH1cbiAgICBzZXQodjogU3RlbmNpbEZ1bmNUeXBlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICAgIGlmICh2LmZ1bmMgPT09IGMuZnVuYyAmJiB2LnJlZiA9PT0gYy5yZWYgJiYgdi5tYXNrID09PSBjLm1hc2sgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgLy8gQXNzdW1lIFVOU0lHTkVEX0lOVF8yNF84IHN0b3JhZ2UsIHdpdGggOCBiaXRzIGRlZGljYXRlZCB0byBzdGVuY2lsLlxuICAgICAgICAvLyBQbGVhc2UgcmV2aXNlIHlvdXIgc3RlbmNpbCB2YWx1ZXMgaWYgdGhpcyB0aHJlc2hvbGQgaXMgdHJpZ2dlcmVkLlxuICAgICAgICBhc3NlcnQodi5yZWYgPj0gMCAmJiB2LnJlZiA8PSAyNTUpO1xuICAgICAgICB0aGlzLmdsLnN0ZW5jaWxGdW5jKHYuZnVuYywgdi5yZWYsIHYubWFzayk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGVuY2lsT3AgZXh0ZW5kcyBCYXNlVmFsdWU8U3RlbmNpbE9wVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogU3RlbmNpbE9wVHlwZSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgcmV0dXJuIFtnbC5LRUVQLCBnbC5LRUVQLCBnbC5LRUVQXTtcbiAgICB9XG4gICAgc2V0KHY6IFN0ZW5jaWxPcFR5cGUpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHZbMF0gPT09IGNbMF0gJiYgdlsxXSA9PT0gY1sxXSAmJiB2WzJdID09PSBjWzJdICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuc3RlbmNpbE9wKHZbMF0sIHZbMV0sIHZbMl0pO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RlbmNpbFRlc3QgZXh0ZW5kcyBCYXNlVmFsdWU8Ym9vbGVhbj4ge1xuICAgIGdldERlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2V0KHY6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICBnbC5lbmFibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVwdGhSYW5nZSBleHRlbmRzIEJhc2VWYWx1ZTxEZXB0aFJhbmdlVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogRGVwdGhSYW5nZVR5cGUge1xuICAgICAgICByZXR1cm4gWzAsIDFdO1xuICAgIH1cbiAgICBzZXQodjogRGVwdGhSYW5nZVR5cGUpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHZbMF0gPT09IGNbMF0gJiYgdlsxXSA9PT0gY1sxXSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmRlcHRoUmFuZ2UodlswXSwgdlsxXSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aFRlc3QgZXh0ZW5kcyBCYXNlVmFsdWU8Ym9vbGVhbj4ge1xuICAgIGdldERlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2V0KHY6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5kaXNhYmxlKGdsLkRFUFRIX1RFU1QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aEZ1bmMgZXh0ZW5kcyBCYXNlVmFsdWU8RGVwdGhGdW5jVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogRGVwdGhGdW5jVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsLkxFU1M7XG4gICAgfVxuICAgIHNldCh2OiBEZXB0aEZ1bmNUeXBlKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5kZXB0aEZ1bmModik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCbGVuZCBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIGdsLmVuYWJsZShnbC5CTEVORCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5kaXNhYmxlKGdsLkJMRU5EKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmxlbmRGdW5jIGV4dGVuZHMgQmFzZVZhbHVlPEJsZW5kRnVuY1R5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IEJsZW5kRnVuY1R5cGUge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIHJldHVybiBbZ2wuT05FLCBnbC5aRVJPXTtcbiAgICB9XG4gICAgc2V0KHY6IEJsZW5kRnVuY1R5cGUpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHZbMF0gPT09IGNbMF0gJiYgdlsxXSA9PT0gY1sxXSAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmJsZW5kRnVuYyh2WzBdLCB2WzFdKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJsZW5kQ29sb3IgZXh0ZW5kcyBCYXNlVmFsdWU8Q29sb3I+IHtcbiAgICBnZXREZWZhdWx0KCk6IENvbG9yIHtcbiAgICAgICAgcmV0dXJuIENvbG9yLnRyYW5zcGFyZW50O1xuICAgIH1cbiAgICBzZXQodjogQ29sb3IpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHYuciA9PT0gYy5yICYmIHYuZyA9PT0gYy5nICYmIHYuYiA9PT0gYy5iICYmIHYuYSA9PT0gYy5hICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuYmxlbmRDb2xvcih2LnIsIHYuZywgdi5iLCB2LmEpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmxlbmRFcXVhdGlvbiBleHRlbmRzIEJhc2VWYWx1ZTxCbGVuZEVxdWF0aW9uVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogQmxlbmRFcXVhdGlvblR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5GVU5DX0FERDtcbiAgICB9XG4gICAgc2V0KHY6IEJsZW5kRXF1YXRpb25UeXBlKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC5ibGVuZEVxdWF0aW9uKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3VsbEZhY2UgZXh0ZW5kcyBCYXNlVmFsdWU8Ym9vbGVhbj4ge1xuICAgIGdldERlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc2V0KHY6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICBnbC5lbmFibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3VsbEZhY2VTaWRlIGV4dGVuZHMgQmFzZVZhbHVlPEN1bGxGYWNlTW9kZVR5cGU+IHtcbiAgICBnZXREZWZhdWx0KCk6IEN1bGxGYWNlTW9kZVR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5CQUNLO1xuICAgIH1cbiAgICBzZXQodjogQ3VsbEZhY2VNb2RlVHlwZSkge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuY3VsbEZhY2Uodik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGcm9udEZhY2UgZXh0ZW5kcyBCYXNlVmFsdWU8RnJvbnRGYWNlVHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogRnJvbnRGYWNlVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdsLkNDVztcbiAgICB9XG4gICAgc2V0KHY6IEZyb250RmFjZVR5cGUpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmdsLmZyb250RmFjZSh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb2dyYW0gZXh0ZW5kcyBCYXNlVmFsdWU8P1dlYkdMUHJvZ3JhbT4ge1xuICAgIGdldERlZmF1bHQoKTogV2ViR0xQcm9ncmFtIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xQcm9ncmFtKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC51c2VQcm9ncmFtKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWN0aXZlVGV4dHVyZVVuaXQgZXh0ZW5kcyBCYXNlVmFsdWU8VGV4dHVyZVVuaXRUeXBlPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBUZXh0dXJlVW5pdFR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5nbC5URVhUVVJFMDtcbiAgICB9XG4gICAgc2V0KHY6IFRleHR1cmVVbml0VHlwZSkge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuZ2wuYWN0aXZlVGV4dHVyZSh2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZpZXdwb3J0IGV4dGVuZHMgQmFzZVZhbHVlPFZpZXdwb3J0VHlwZT4ge1xuICAgIGdldERlZmF1bHQoKTogVmlld3BvcnRUeXBlIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICByZXR1cm4gWzAsIDAsIGdsLmRyYXdpbmdCdWZmZXJXaWR0aCwgZ2wuZHJhd2luZ0J1ZmZlckhlaWdodF07XG4gICAgfVxuICAgIHNldCh2OiBWaWV3cG9ydFR5cGUpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuY3VycmVudDtcbiAgICAgICAgaWYgKHZbMF0gPT09IGNbMF0gJiYgdlsxXSA9PT0gY1sxXSAmJiB2WzJdID09PSBjWzJdICYmIHZbM10gPT09IGNbM10gJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5nbC52aWV3cG9ydCh2WzBdLCB2WzFdLCB2WzJdLCB2WzNdKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRGcmFtZWJ1ZmZlciBleHRlbmRzIEJhc2VWYWx1ZTw/V2ViR0xGcmFtZWJ1ZmZlcj4ge1xuICAgIGdldERlZmF1bHQoKTogV2ViR0xGcmFtZWJ1ZmZlciB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXQodjogP1dlYkdMRnJhbWVidWZmZXIpIHtcbiAgICAgICAgaWYgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgdik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5kUmVuZGVyYnVmZmVyIGV4dGVuZHMgQmFzZVZhbHVlPD9XZWJHTFJlbmRlcmJ1ZmZlcj4ge1xuICAgIGdldERlZmF1bHQoKTogV2ViR0xSZW5kZXJidWZmZXIge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2V0KHY6ID9XZWJHTFJlbmRlcmJ1ZmZlcikge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuYmluZFJlbmRlcmJ1ZmZlcihnbC5SRU5ERVJCVUZGRVIsIHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZFRleHR1cmUgZXh0ZW5kcyBCYXNlVmFsdWU8P1dlYkdMVGV4dHVyZT4ge1xuICAgIGdldERlZmF1bHQoKTogV2ViR0xUZXh0dXJlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xUZXh0dXJlKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRWZXJ0ZXhCdWZmZXIgZXh0ZW5kcyBCYXNlVmFsdWU8P1dlYkdMQnVmZmVyPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBXZWJHTEJ1ZmZlciB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXQodjogP1dlYkdMQnVmZmVyKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgdik7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5kRWxlbWVudEJ1ZmZlciBleHRlbmRzIEJhc2VWYWx1ZTw/V2ViR0xCdWZmZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IFdlYkdMQnVmZmVyIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xCdWZmZXIpIHtcbiAgICAgICAgLy8gQWx3YXlzIHJlYmluZFxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZFZlcnRleEFycmF5T0VTIGV4dGVuZHMgQmFzZVZhbHVlPGFueT4ge1xuICAgIHZhbzogYW55O1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBzdXBlcihjb250ZXh0KTtcbiAgICAgICAgdGhpcy52YW8gPSBjb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0O1xuICAgIH1cbiAgICBnZXREZWZhdWx0KCk6IGFueSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzZXQodjogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy52YW8gfHwgKHYgPT09IHRoaXMuY3VycmVudCAmJiAhdGhpcy5kaXJ0eSkpIHJldHVybjtcbiAgICAgICAgdGhpcy52YW8uYmluZFZlcnRleEFycmF5T0VTKHYpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGl4ZWxTdG9yZVVucGFjayBleHRlbmRzIEJhc2VWYWx1ZTxudW1iZXI+IHtcbiAgICBnZXREZWZhdWx0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiA0O1xuICAgIH1cbiAgICBzZXQodjogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfQUxJR05NRU5ULCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhIGV4dGVuZHMgQmFzZVZhbHVlPGJvb2xlYW4+IHtcbiAgICBnZXREZWZhdWx0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNldCh2OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5waXhlbFN0b3JlaShnbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsICh2OiBhbnkpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBpeGVsU3RvcmVVbnBhY2tGbGlwWSBleHRlbmRzIEJhc2VWYWx1ZTxib29sZWFuPiB7XG4gICAgZ2V0RGVmYXVsdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzZXQodjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAodiA9PT0gdGhpcy5jdXJyZW50ICYmICF0aGlzLmRpcnR5KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wucGl4ZWxTdG9yZWkoZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgKHY6IGFueSkpO1xuICAgICAgICB0aGlzLmN1cnJlbnQgPSB2O1xuICAgICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgfVxufVxuXG5jbGFzcyBGcmFtZWJ1ZmZlckF0dGFjaG1lbnQ8VD4gZXh0ZW5kcyBCYXNlVmFsdWU8P1Q+IHtcbiAgICBwYXJlbnQ6IFdlYkdMRnJhbWVidWZmZXI7XG4gICAgY29udGV4dDogQ29udGV4dDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIHBhcmVudDogV2ViR0xGcmFtZWJ1ZmZlcikge1xuICAgICAgICBzdXBlcihjb250ZXh0KTtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGdldERlZmF1bHQoKTogbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbG9yQXR0YWNobWVudCBleHRlbmRzIEZyYW1lYnVmZmVyQXR0YWNobWVudDxXZWJHTFRleHR1cmU+IHtcbiAgICBzZXREaXJ0eSgpIHtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuICAgIHNldCh2OiA/V2ViR0xUZXh0dXJlKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQodGhpcy5wYXJlbnQpO1xuICAgICAgICAvLyBub3RlOiBpdCdzIHBvc3NpYmxlIHRvIGF0dGFjaCBhIHJlbmRlcmJ1ZmZlciB0byB0aGUgY29sb3JcbiAgICAgICAgLy8gYXR0YWNobWVudCBwb2ludCwgYnV0IHRodXMgZmFyIE1CR0wgb25seSB1c2VzIHRleHR1cmVzIGZvciBjb2xvclxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgdiwgMCk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IHY7XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZXB0aEF0dGFjaG1lbnQgZXh0ZW5kcyBGcmFtZWJ1ZmZlckF0dGFjaG1lbnQ8V2ViR0xSZW5kZXJidWZmZXI+IHtcbiAgICBhdHRhY2htZW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmdsLkRFUFRIX0FUVEFDSE1FTlQ7IH1cbiAgICBzZXQodjogP1dlYkdMUmVuZGVyYnVmZmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh2ID09PSB0aGlzLmN1cnJlbnQgJiYgIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQodGhpcy5wYXJlbnQpO1xuICAgICAgICAvLyBub3RlOiBpdCdzIHBvc3NpYmxlIHRvIGF0dGFjaCBhIHRleHR1cmUgdG8gdGhlIGRlcHRoIGF0dGFjaG1lbnRcbiAgICAgICAgLy8gcG9pbnQsIGJ1dCB0aHVzIGZhciBNQkdMIG9ubHkgdXNlcyByZW5kZXJidWZmZXJzIGZvciBkZXB0aFxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCB0aGlzLmF0dGFjaG1lbnQoKSwgZ2wuUkVOREVSQlVGRkVSLCB2KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gdjtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRoU3RlbmNpbEF0dGFjaG1lbnQgZXh0ZW5kcyBEZXB0aEF0dGFjaG1lbnQge1xuICAgIGF0dGFjaG1lbnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UOyB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtDb2xvckF0dGFjaG1lbnQsIERlcHRoQXR0YWNobWVudH0gZnJvbSAnLi92YWx1ZS5qcyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi9jb250ZXh0LmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuY2xhc3MgRnJhbWVidWZmZXIge1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBmcmFtZWJ1ZmZlcjogV2ViR0xGcmFtZWJ1ZmZlcjtcbiAgICBjb2xvckF0dGFjaG1lbnQ6IENvbG9yQXR0YWNobWVudDtcbiAgICBkZXB0aEF0dGFjaG1lbnQ6IERlcHRoQXR0YWNobWVudDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBoYXNEZXB0aDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGNvbnN0IGZibyA9IHRoaXMuZnJhbWVidWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuXG4gICAgICAgIHRoaXMuY29sb3JBdHRhY2htZW50ID0gbmV3IENvbG9yQXR0YWNobWVudChjb250ZXh0LCBmYm8pO1xuICAgICAgICBpZiAoaGFzRGVwdGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhBdHRhY2htZW50ID0gbmV3IERlcHRoQXR0YWNobWVudChjb250ZXh0LCBmYm8pO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKSA9PT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSB0aGlzLmNvbG9yQXR0YWNobWVudC5nZXQoKTtcbiAgICAgICAgaWYgKHRleHR1cmUpIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwdGhBdHRhY2htZW50KSB7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJidWZmZXIgPSB0aGlzLmRlcHRoQXR0YWNobWVudC5nZXQoKTtcbiAgICAgICAgICAgIGlmIChyZW5kZXJidWZmZXIpIGdsLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyZW5kZXJidWZmZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGcmFtZWJ1ZmZlcjtcbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7RGVwdGhGdW5jVHlwZSwgRGVwdGhNYXNrVHlwZSwgRGVwdGhSYW5nZVR5cGV9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5jb25zdCBBTFdBWVMgPSAweDAyMDc7XG5cbmNsYXNzIERlcHRoTW9kZSB7XG4gICAgZnVuYzogRGVwdGhGdW5jVHlwZTtcbiAgICBtYXNrOiBEZXB0aE1hc2tUeXBlO1xuICAgIHJhbmdlOiBEZXB0aFJhbmdlVHlwZTtcblxuICAgIC8vIERlcHRoTWFzayBlbnVtc1xuICAgIHN0YXRpYyBSZWFkT25seTogYm9vbGVhbjtcbiAgICBzdGF0aWMgUmVhZFdyaXRlOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZGVwdGhGdW5jOiBEZXB0aEZ1bmNUeXBlLCBkZXB0aE1hc2s6IERlcHRoTWFza1R5cGUsIGRlcHRoUmFuZ2U6IERlcHRoUmFuZ2VUeXBlKSB7XG4gICAgICAgIHRoaXMuZnVuYyA9IGRlcHRoRnVuYztcbiAgICAgICAgdGhpcy5tYXNrID0gZGVwdGhNYXNrO1xuICAgICAgICB0aGlzLnJhbmdlID0gZGVwdGhSYW5nZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGlzYWJsZWQ6ICRSZWFkT25seTxEZXB0aE1vZGU+O1xufVxuXG5EZXB0aE1vZGUuUmVhZE9ubHkgPSBmYWxzZTtcbkRlcHRoTW9kZS5SZWFkV3JpdGUgPSB0cnVlO1xuXG5EZXB0aE1vZGUuZGlzYWJsZWQgPSBuZXcgRGVwdGhNb2RlKEFMV0FZUywgRGVwdGhNb2RlLlJlYWRPbmx5LCBbMCwgMV0pO1xuXG5leHBvcnQgZGVmYXVsdCBEZXB0aE1vZGU7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUge1N0ZW5jaWxPcENvbnN0YW50LCBTdGVuY2lsVGVzdH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IEFMV0FZUyA9IDB4MDIwNztcbmNvbnN0IEtFRVAgPSAweDFFMDA7XG5cbmNsYXNzIFN0ZW5jaWxNb2RlIHtcbiAgICB0ZXN0OiBTdGVuY2lsVGVzdDtcbiAgICByZWY6IG51bWJlcjtcbiAgICBtYXNrOiBudW1iZXI7XG4gICAgZmFpbDogU3RlbmNpbE9wQ29uc3RhbnQ7XG4gICAgZGVwdGhGYWlsOiBTdGVuY2lsT3BDb25zdGFudDtcbiAgICBwYXNzOiBTdGVuY2lsT3BDb25zdGFudDtcblxuICAgIGNvbnN0cnVjdG9yKHRlc3Q6IFN0ZW5jaWxUZXN0LCByZWY6IG51bWJlciwgbWFzazogbnVtYmVyLCBmYWlsOiBTdGVuY2lsT3BDb25zdGFudCxcbiAgICAgICAgZGVwdGhGYWlsOiBTdGVuY2lsT3BDb25zdGFudCwgcGFzczogU3RlbmNpbE9wQ29uc3RhbnQpIHtcbiAgICAgICAgdGhpcy50ZXN0ID0gdGVzdDtcbiAgICAgICAgdGhpcy5yZWYgPSByZWY7XG4gICAgICAgIHRoaXMubWFzayA9IG1hc2s7XG4gICAgICAgIHRoaXMuZmFpbCA9IGZhaWw7XG4gICAgICAgIHRoaXMuZGVwdGhGYWlsID0gZGVwdGhGYWlsO1xuICAgICAgICB0aGlzLnBhc3MgPSBwYXNzO1xuICAgIH1cblxuICAgIHN0YXRpYyBkaXNhYmxlZDogJFJlYWRPbmx5PFN0ZW5jaWxNb2RlPjtcbn1cblxuU3RlbmNpbE1vZGUuZGlzYWJsZWQgPSBuZXcgU3RlbmNpbE1vZGUoe2Z1bmM6IEFMV0FZUywgbWFzazogMH0sIDAsIDAsIEtFRVAsIEtFRVAsIEtFRVApO1xuXG5leHBvcnQgZGVmYXVsdCBTdGVuY2lsTW9kZTtcbiIsIi8vIEBmbG93XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcblxuaW1wb3J0IHR5cGUge0JsZW5kRnVuY1R5cGUsIENvbG9yTWFza1R5cGV9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5jb25zdCBaRVJPID0gMHgwMDAwO1xuY29uc3QgT05FID0gMHgwMDAxO1xuY29uc3QgT05FX01JTlVTX1NSQ19BTFBIQSA9IDB4MDMwMztcblxuY2xhc3MgQ29sb3JNb2RlIHtcbiAgICBibGVuZEZ1bmN0aW9uOiBCbGVuZEZ1bmNUeXBlO1xuICAgIGJsZW5kQ29sb3I6IENvbG9yO1xuICAgIG1hc2s6IENvbG9yTWFza1R5cGU7XG5cbiAgICBjb25zdHJ1Y3RvcihibGVuZEZ1bmN0aW9uOiBCbGVuZEZ1bmNUeXBlLCBibGVuZENvbG9yOiBDb2xvciwgbWFzazogQ29sb3JNYXNrVHlwZSkge1xuICAgICAgICB0aGlzLmJsZW5kRnVuY3Rpb24gPSBibGVuZEZ1bmN0aW9uO1xuICAgICAgICB0aGlzLmJsZW5kQ29sb3IgPSBibGVuZENvbG9yO1xuICAgICAgICB0aGlzLm1hc2sgPSBtYXNrO1xuICAgIH1cblxuICAgIHN0YXRpYyBSZXBsYWNlOiBCbGVuZEZ1bmNUeXBlO1xuXG4gICAgc3RhdGljIGRpc2FibGVkOiAkUmVhZE9ubHk8Q29sb3JNb2RlPjtcbiAgICBzdGF0aWMgdW5ibGVuZGVkOiAkUmVhZE9ubHk8Q29sb3JNb2RlPjtcbiAgICBzdGF0aWMgYWxwaGFCbGVuZGVkOiAkUmVhZE9ubHk8Q29sb3JNb2RlPjtcbn1cblxuQ29sb3JNb2RlLlJlcGxhY2UgPSBbT05FLCBaRVJPXTtcblxuQ29sb3JNb2RlLmRpc2FibGVkID0gbmV3IENvbG9yTW9kZShDb2xvck1vZGUuUmVwbGFjZSwgQ29sb3IudHJhbnNwYXJlbnQsIFtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZV0pO1xuQ29sb3JNb2RlLnVuYmxlbmRlZCA9IG5ldyBDb2xvck1vZGUoQ29sb3JNb2RlLlJlcGxhY2UsIENvbG9yLnRyYW5zcGFyZW50LCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuQ29sb3JNb2RlLmFscGhhQmxlbmRlZCA9IG5ldyBDb2xvck1vZGUoW09ORSwgT05FX01JTlVTX1NSQ19BTFBIQV0sIENvbG9yLnRyYW5zcGFyZW50LCBbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xvck1vZGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7Q3VsbEZhY2VNb2RlVHlwZSwgRnJvbnRGYWNlVHlwZX0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IEJBQ0sgPSAweDA0MDU7XG5jb25zdCBGUk9OVCA9IDB4MDQwNDtcbmNvbnN0IENDVyA9IDB4MDkwMTtcbmNvbnN0IENXID0gMHgwOTAwO1xuXG5jbGFzcyBDdWxsRmFjZU1vZGUge1xuICAgIGVuYWJsZTogYm9vbGVhbjtcbiAgICBtb2RlOiBDdWxsRmFjZU1vZGVUeXBlO1xuICAgIGZyb250RmFjZTogRnJvbnRGYWNlVHlwZTtcblxuICAgIGNvbnN0cnVjdG9yKGVuYWJsZTogYm9vbGVhbiwgbW9kZTogQ3VsbEZhY2VNb2RlVHlwZSwgZnJvbnRGYWNlOiBGcm9udEZhY2VUeXBlKSB7XG4gICAgICAgIHRoaXMuZW5hYmxlID0gZW5hYmxlO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICB0aGlzLmZyb250RmFjZSA9IGZyb250RmFjZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZGlzYWJsZWQ6ICRSZWFkT25seTxDdWxsRmFjZU1vZGU+O1xuICAgIHN0YXRpYyBiYWNrQ0NXOiAkUmVhZE9ubHk8Q3VsbEZhY2VNb2RlPjtcbiAgICBzdGF0aWMgYmFja0NXOiAkUmVhZE9ubHk8Q3VsbEZhY2VNb2RlPjtcbiAgICBzdGF0aWMgZnJvbnRDVzogJFJlYWRPbmx5PEN1bGxGYWNlTW9kZT47XG4gICAgc3RhdGljIGZyb250Q0NXOiAkUmVhZE9ubHk8Q3VsbEZhY2VNb2RlPjtcbn1cblxuQ3VsbEZhY2VNb2RlLmRpc2FibGVkID0gbmV3IEN1bGxGYWNlTW9kZShmYWxzZSwgQkFDSywgQ0NXKTtcbkN1bGxGYWNlTW9kZS5iYWNrQ0NXID0gbmV3IEN1bGxGYWNlTW9kZSh0cnVlLCBCQUNLLCBDQ1cpO1xuQ3VsbEZhY2VNb2RlLmJhY2tDVyA9IG5ldyBDdWxsRmFjZU1vZGUodHJ1ZSwgQkFDSywgQ1cpO1xuQ3VsbEZhY2VNb2RlLmZyb250Q1cgPSBuZXcgQ3VsbEZhY2VNb2RlKHRydWUsIEZST05ULCBDVyk7XG5DdWxsRmFjZU1vZGUuZnJvbnRDQ1cgPSBuZXcgQ3VsbEZhY2VNb2RlKHRydWUsIEZST05ULCBDQ1cpO1xuXG5leHBvcnQgZGVmYXVsdCBDdWxsRmFjZU1vZGU7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IEluZGV4QnVmZmVyIGZyb20gJy4vaW5kZXhfYnVmZmVyLmpzJztcblxuaW1wb3J0IFZlcnRleEJ1ZmZlciBmcm9tICcuL3ZlcnRleF9idWZmZXIuanMnO1xuaW1wb3J0IEZyYW1lYnVmZmVyIGZyb20gJy4vZnJhbWVidWZmZXIuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuL2RlcHRoX21vZGUuanMnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4vc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi9jb2xvcl9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi9jdWxsX2ZhY2VfbW9kZS5qcyc7XG5pbXBvcnQge2RlZXBFcXVhbH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7Q2xlYXJDb2xvciwgQ2xlYXJEZXB0aCwgQ2xlYXJTdGVuY2lsLCBDb2xvck1hc2ssIERlcHRoTWFzaywgU3RlbmNpbE1hc2ssIFN0ZW5jaWxGdW5jLCBTdGVuY2lsT3AsIFN0ZW5jaWxUZXN0LCBEZXB0aFJhbmdlLCBEZXB0aFRlc3QsIERlcHRoRnVuYywgQmxlbmQsIEJsZW5kRnVuYywgQmxlbmRDb2xvciwgQmxlbmRFcXVhdGlvbiwgQ3VsbEZhY2UsIEN1bGxGYWNlU2lkZSwgRnJvbnRGYWNlLCBQcm9ncmFtLCBBY3RpdmVUZXh0dXJlVW5pdCwgVmlld3BvcnQsIEJpbmRGcmFtZWJ1ZmZlciwgQmluZFJlbmRlcmJ1ZmZlciwgQmluZFRleHR1cmUsIEJpbmRWZXJ0ZXhCdWZmZXIsIEJpbmRFbGVtZW50QnVmZmVyLCBCaW5kVmVydGV4QXJyYXlPRVMsIFBpeGVsU3RvcmVVbnBhY2ssIFBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLCBQaXhlbFN0b3JlVW5wYWNrRmxpcFl9IGZyb20gJy4vdmFsdWUuanMnO1xuXG5pbXBvcnQgdHlwZSB7VHJpYW5nbGVJbmRleEFycmF5LCBMaW5lSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheX0gZnJvbSAnLi4vZGF0YS9pbmRleF9hcnJheV90eXBlLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgICBTdHJ1Y3RBcnJheSxcbiAgICBTdHJ1Y3RBcnJheU1lbWJlclxufSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5pbXBvcnQgdHlwZSBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuXG50eXBlIENsZWFyQXJncyA9IHtcbiAgICBjb2xvcj86IENvbG9yLFxuICAgIGRlcHRoPzogbnVtYmVyLFxuICAgIHN0ZW5jaWw/OiBudW1iZXJcbn07XG5cbmNsYXNzIENvbnRleHQge1xuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG4gICAgZXh0VmVydGV4QXJyYXlPYmplY3Q6IGFueTtcbiAgICBjdXJyZW50TnVtQXR0cmlidXRlczogP251bWJlcjtcbiAgICBtYXhUZXh0dXJlU2l6ZTogbnVtYmVyO1xuXG4gICAgY2xlYXJDb2xvcjogQ2xlYXJDb2xvcjtcbiAgICBjbGVhckRlcHRoOiBDbGVhckRlcHRoO1xuICAgIGNsZWFyU3RlbmNpbDogQ2xlYXJTdGVuY2lsO1xuICAgIGNvbG9yTWFzazogQ29sb3JNYXNrO1xuICAgIGRlcHRoTWFzazogRGVwdGhNYXNrO1xuICAgIHN0ZW5jaWxNYXNrOiBTdGVuY2lsTWFzaztcbiAgICBzdGVuY2lsRnVuYzogU3RlbmNpbEZ1bmM7XG4gICAgc3RlbmNpbE9wOiBTdGVuY2lsT3A7XG4gICAgc3RlbmNpbFRlc3Q6IFN0ZW5jaWxUZXN0O1xuICAgIGRlcHRoUmFuZ2U6IERlcHRoUmFuZ2U7XG4gICAgZGVwdGhUZXN0OiBEZXB0aFRlc3Q7XG4gICAgZGVwdGhGdW5jOiBEZXB0aEZ1bmM7XG4gICAgYmxlbmQ6IEJsZW5kO1xuICAgIGJsZW5kRnVuYzogQmxlbmRGdW5jO1xuICAgIGJsZW5kQ29sb3I6IEJsZW5kQ29sb3I7XG4gICAgYmxlbmRFcXVhdGlvbjogQmxlbmRFcXVhdGlvbjtcbiAgICBjdWxsRmFjZTogQ3VsbEZhY2U7XG4gICAgY3VsbEZhY2VTaWRlOiBDdWxsRmFjZVNpZGU7XG4gICAgZnJvbnRGYWNlOiBGcm9udEZhY2U7XG4gICAgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgICBhY3RpdmVUZXh0dXJlOiBBY3RpdmVUZXh0dXJlVW5pdDtcbiAgICB2aWV3cG9ydDogVmlld3BvcnQ7XG4gICAgYmluZEZyYW1lYnVmZmVyOiBCaW5kRnJhbWVidWZmZXI7XG4gICAgYmluZFJlbmRlcmJ1ZmZlcjogQmluZFJlbmRlcmJ1ZmZlcjtcbiAgICBiaW5kVGV4dHVyZTogQmluZFRleHR1cmU7XG4gICAgYmluZFZlcnRleEJ1ZmZlcjogQmluZFZlcnRleEJ1ZmZlcjtcbiAgICBiaW5kRWxlbWVudEJ1ZmZlcjogQmluZEVsZW1lbnRCdWZmZXI7XG4gICAgYmluZFZlcnRleEFycmF5T0VTOiBCaW5kVmVydGV4QXJyYXlPRVM7XG4gICAgcGl4ZWxTdG9yZVVucGFjazogUGl4ZWxTdG9yZVVucGFjaztcbiAgICBwaXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYTogUGl4ZWxTdG9yZVVucGFja1ByZW11bHRpcGx5QWxwaGE7XG4gICAgcGl4ZWxTdG9yZVVucGFja0ZsaXBZOiBQaXhlbFN0b3JlVW5wYWNrRmxpcFk7XG5cbiAgICBleHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWM6IGFueTtcbiAgICBleHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWNNYXg6IGFueTtcbiAgICBleHRUZXh0dXJlSGFsZkZsb2F0OiBhbnk7XG4gICAgZXh0UmVuZGVyVG9UZXh0dXJlSGFsZkZsb2F0OiBhbnk7XG4gICAgZXh0U3RhbmRhcmREZXJpdmF0aXZlczogYW55O1xuICAgIGV4dFRpbWVyUXVlcnk6IGFueTtcblxuICAgIGV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpY0ZvcmNlT2ZmOiBib29sZWFuO1xuICAgIGV4dFN0YW5kYXJkRGVyaXZhdGl2ZXNGb3JjZU9mZjogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgICB0aGlzLmV4dFZlcnRleEFycmF5T2JqZWN0ID0gdGhpcy5nbC5nZXRFeHRlbnNpb24oJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG5cbiAgICAgICAgdGhpcy5jbGVhckNvbG9yID0gbmV3IENsZWFyQ29sb3IodGhpcyk7XG4gICAgICAgIHRoaXMuY2xlYXJEZXB0aCA9IG5ldyBDbGVhckRlcHRoKHRoaXMpO1xuICAgICAgICB0aGlzLmNsZWFyU3RlbmNpbCA9IG5ldyBDbGVhclN0ZW5jaWwodGhpcyk7XG4gICAgICAgIHRoaXMuY29sb3JNYXNrID0gbmV3IENvbG9yTWFzayh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXB0aE1hc2sgPSBuZXcgRGVwdGhNYXNrKHRoaXMpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxNYXNrID0gbmV3IFN0ZW5jaWxNYXNrKHRoaXMpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxGdW5jID0gbmV3IFN0ZW5jaWxGdW5jKHRoaXMpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxPcCA9IG5ldyBTdGVuY2lsT3AodGhpcyk7XG4gICAgICAgIHRoaXMuc3RlbmNpbFRlc3QgPSBuZXcgU3RlbmNpbFRlc3QodGhpcyk7XG4gICAgICAgIHRoaXMuZGVwdGhSYW5nZSA9IG5ldyBEZXB0aFJhbmdlKHRoaXMpO1xuICAgICAgICB0aGlzLmRlcHRoVGVzdCA9IG5ldyBEZXB0aFRlc3QodGhpcyk7XG4gICAgICAgIHRoaXMuZGVwdGhGdW5jID0gbmV3IERlcHRoRnVuYyh0aGlzKTtcbiAgICAgICAgdGhpcy5ibGVuZCA9IG5ldyBCbGVuZCh0aGlzKTtcbiAgICAgICAgdGhpcy5ibGVuZEZ1bmMgPSBuZXcgQmxlbmRGdW5jKHRoaXMpO1xuICAgICAgICB0aGlzLmJsZW5kQ29sb3IgPSBuZXcgQmxlbmRDb2xvcih0aGlzKTtcbiAgICAgICAgdGhpcy5ibGVuZEVxdWF0aW9uID0gbmV3IEJsZW5kRXF1YXRpb24odGhpcyk7XG4gICAgICAgIHRoaXMuY3VsbEZhY2UgPSBuZXcgQ3VsbEZhY2UodGhpcyk7XG4gICAgICAgIHRoaXMuY3VsbEZhY2VTaWRlID0gbmV3IEN1bGxGYWNlU2lkZSh0aGlzKTtcbiAgICAgICAgdGhpcy5mcm9udEZhY2UgPSBuZXcgRnJvbnRGYWNlKHRoaXMpO1xuICAgICAgICB0aGlzLnByb2dyYW0gPSBuZXcgUHJvZ3JhbSh0aGlzKTtcbiAgICAgICAgdGhpcy5hY3RpdmVUZXh0dXJlID0gbmV3IEFjdGl2ZVRleHR1cmVVbml0KHRoaXMpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0KHRoaXMpO1xuICAgICAgICB0aGlzLmJpbmRGcmFtZWJ1ZmZlciA9IG5ldyBCaW5kRnJhbWVidWZmZXIodGhpcyk7XG4gICAgICAgIHRoaXMuYmluZFJlbmRlcmJ1ZmZlciA9IG5ldyBCaW5kUmVuZGVyYnVmZmVyKHRoaXMpO1xuICAgICAgICB0aGlzLmJpbmRUZXh0dXJlID0gbmV3IEJpbmRUZXh0dXJlKHRoaXMpO1xuICAgICAgICB0aGlzLmJpbmRWZXJ0ZXhCdWZmZXIgPSBuZXcgQmluZFZlcnRleEJ1ZmZlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kRWxlbWVudEJ1ZmZlciA9IG5ldyBCaW5kRWxlbWVudEJ1ZmZlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iaW5kVmVydGV4QXJyYXlPRVMgPSB0aGlzLmV4dFZlcnRleEFycmF5T2JqZWN0ICYmIG5ldyBCaW5kVmVydGV4QXJyYXlPRVModGhpcyk7XG4gICAgICAgIHRoaXMucGl4ZWxTdG9yZVVucGFjayA9IG5ldyBQaXhlbFN0b3JlVW5wYWNrKHRoaXMpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhID0gbmV3IFBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhKHRoaXMpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2tGbGlwWSA9IG5ldyBQaXhlbFN0b3JlVW5wYWNrRmxpcFkodGhpcyk7XG5cbiAgICAgICAgdGhpcy5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMgPSAoXG4gICAgICAgICAgICBnbC5nZXRFeHRlbnNpb24oJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycpIHx8XG4gICAgICAgICAgICBnbC5nZXRFeHRlbnNpb24oJ01PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnKSB8fFxuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJylcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljKSB7XG4gICAgICAgICAgICB0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpY01heCA9IGdsLmdldFBhcmFtZXRlcih0aGlzLmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYy5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljRm9yY2VPZmYgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5leHRTdGFuZGFyZERlcml2YXRpdmVzRm9yY2VPZmYgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmV4dFRleHR1cmVIYWxmRmxvYXQgPSBnbC5nZXRFeHRlbnNpb24oJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnKTtcbiAgICAgICAgaWYgKHRoaXMuZXh0VGV4dHVyZUhhbGZGbG9hdCkge1xuICAgICAgICAgICAgZ2wuZ2V0RXh0ZW5zaW9uKCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicpO1xuICAgICAgICAgICAgdGhpcy5leHRSZW5kZXJUb1RleHR1cmVIYWxmRmxvYXQgPSBnbC5nZXRFeHRlbnNpb24oJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXh0U3RhbmRhcmREZXJpdmF0aXZlcyA9IGdsLmdldEV4dGVuc2lvbignT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyk7XG5cbiAgICAgICAgdGhpcy5leHRUaW1lclF1ZXJ5ID0gZ2wuZ2V0RXh0ZW5zaW9uKCdFWFRfZGlzam9pbnRfdGltZXJfcXVlcnknKTtcbiAgICAgICAgdGhpcy5tYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfVEVYVFVSRV9TSVpFKTtcbiAgICB9XG5cbiAgICBzZXREZWZhdWx0KCkge1xuICAgICAgICB0aGlzLnVuYmluZFZBTygpO1xuXG4gICAgICAgIHRoaXMuY2xlYXJDb2xvci5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xlYXJEZXB0aC5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb2xvck1hc2suc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRlcHRoTWFzay5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc3RlbmNpbE1hc2suc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxGdW5jLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zdGVuY2lsT3Auc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0LnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5kZXB0aFJhbmdlLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5kZXB0aFRlc3Quc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRlcHRoRnVuYy5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuYmxlbmQuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmJsZW5kRnVuYy5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuYmxlbmRDb2xvci5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuYmxlbmRFcXVhdGlvbi5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY3VsbEZhY2Uuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmN1bGxGYWNlU2lkZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZnJvbnRGYWNlLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5wcm9ncmFtLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5hY3RpdmVUZXh0dXJlLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5iaW5kRnJhbWVidWZmZXIuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2suc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkuc2V0RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHNldERpcnR5KCkge1xuICAgICAgICB0aGlzLmNsZWFyQ29sb3IuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNsZWFyRGVwdGguZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNsZWFyU3RlbmNpbC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29sb3JNYXNrLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZXB0aE1hc2suZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnN0ZW5jaWxNYXNrLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGVuY2lsRnVuYy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RlbmNpbE9wLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdGVuY2lsVGVzdC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVwdGhSYW5nZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVwdGhUZXN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZXB0aEZ1bmMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJsZW5kLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ibGVuZEZ1bmMuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJsZW5kQ29sb3IuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJsZW5kRXF1YXRpb24uZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmN1bGxGYWNlLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jdWxsRmFjZVNpZGUuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmZyb250RmFjZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMucHJvZ3JhbS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYWN0aXZlVGV4dHVyZS5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMudmlld3BvcnQuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJpbmRGcmFtZWJ1ZmZlci5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuYmluZFRleHR1cmUuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJpbmRWZXJ0ZXhCdWZmZXIuZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmJpbmRFbGVtZW50QnVmZmVyLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuZXh0VmVydGV4QXJyYXlPYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZFZlcnRleEFycmF5T0VTLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2suZGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5waXhlbFN0b3JlVW5wYWNrRmxpcFkuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIGNyZWF0ZUluZGV4QnVmZmVyKGFycmF5OiBUcmlhbmdsZUluZGV4QXJyYXkgfCBMaW5lSW5kZXhBcnJheSB8IExpbmVTdHJpcEluZGV4QXJyYXksIGR5bmFtaWNEcmF3PzogYm9vbGVhbik6IEluZGV4QnVmZmVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbmRleEJ1ZmZlcih0aGlzLCBhcnJheSwgZHluYW1pY0RyYXcpO1xuICAgIH1cblxuICAgIGNyZWF0ZVZlcnRleEJ1ZmZlcihhcnJheTogU3RydWN0QXJyYXksIGF0dHJpYnV0ZXM6ICRSZWFkT25seUFycmF5PFN0cnVjdEFycmF5TWVtYmVyPiwgZHluYW1pY0RyYXc/OiBib29sZWFuKTogVmVydGV4QnVmZmVyIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZXJ0ZXhCdWZmZXIodGhpcywgYXJyYXksIGF0dHJpYnV0ZXMsIGR5bmFtaWNEcmF3KTtcbiAgICB9XG5cbiAgICBjcmVhdGVSZW5kZXJidWZmZXIoc3RvcmFnZUZvcm1hdDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6ID9XZWJHTFJlbmRlcmJ1ZmZlciB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcblxuICAgICAgICBjb25zdCByYm8gPSBnbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcbiAgICAgICAgdGhpcy5iaW5kUmVuZGVyYnVmZmVyLnNldChyYm8pO1xuICAgICAgICBnbC5yZW5kZXJidWZmZXJTdG9yYWdlKGdsLlJFTkRFUkJVRkZFUiwgc3RvcmFnZUZvcm1hdCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMuYmluZFJlbmRlcmJ1ZmZlci5zZXQobnVsbCk7XG5cbiAgICAgICAgcmV0dXJuIHJibztcbiAgICB9XG5cbiAgICBjcmVhdGVGcmFtZWJ1ZmZlcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgaGFzRGVwdGg6IGJvb2xlYW4pOiBGcmFtZWJ1ZmZlciB7XG4gICAgICAgIHJldHVybiBuZXcgRnJhbWVidWZmZXIodGhpcywgd2lkdGgsIGhlaWdodCwgaGFzRGVwdGgpO1xuICAgIH1cblxuICAgIGNsZWFyKHtjb2xvciwgZGVwdGgsIHN0ZW5jaWx9OiBDbGVhckFyZ3MpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBsZXQgbWFzayA9IDA7XG5cbiAgICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgICAgICBtYXNrIHw9IGdsLkNPTE9SX0JVRkZFUl9CSVQ7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ29sb3Iuc2V0KGNvbG9yKTtcbiAgICAgICAgICAgIHRoaXMuY29sb3JNYXNrLnNldChbdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkZXB0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG1hc2sgfD0gZ2wuREVQVEhfQlVGRkVSX0JJVDtcblxuICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgcGxhdGZvcm1zIHdoZXJlIGNsZWFyRGVwdGggZG9lc24ndCBzZWVtIHRvIHdvcmtcbiAgICAgICAgICAgIC8vIHdpdGhvdXQgcmVzZXRpbmcgdGhlIGRlcHRoUmFuZ2UuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzQzN1xuICAgICAgICAgICAgdGhpcy5kZXB0aFJhbmdlLnNldChbMCwgMV0pO1xuXG4gICAgICAgICAgICB0aGlzLmNsZWFyRGVwdGguc2V0KGRlcHRoKTtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhNYXNrLnNldCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc3RlbmNpbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG1hc2sgfD0gZ2wuU1RFTkNJTF9CVUZGRVJfQklUO1xuICAgICAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwuc2V0KHN0ZW5jaWwpO1xuICAgICAgICAgICAgdGhpcy5zdGVuY2lsTWFzay5zZXQoMHhGRik7XG4gICAgICAgIH1cblxuICAgICAgICBnbC5jbGVhcihtYXNrKTtcbiAgICB9XG5cbiAgICBzZXRDdWxsRmFjZShjdWxsRmFjZU1vZGU6ICRSZWFkT25seTxDdWxsRmFjZU1vZGU+KSB7XG4gICAgICAgIGlmIChjdWxsRmFjZU1vZGUuZW5hYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5jdWxsRmFjZS5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdWxsRmFjZS5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmN1bGxGYWNlU2lkZS5zZXQoY3VsbEZhY2VNb2RlLm1vZGUpO1xuICAgICAgICAgICAgdGhpcy5mcm9udEZhY2Uuc2V0KGN1bGxGYWNlTW9kZS5mcm9udEZhY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0RGVwdGhNb2RlKGRlcHRoTW9kZTogJFJlYWRPbmx5PERlcHRoTW9kZT4pIHtcbiAgICAgICAgaWYgKGRlcHRoTW9kZS5mdW5jID09PSB0aGlzLmdsLkFMV0FZUyAmJiAhZGVwdGhNb2RlLm1hc2spIHtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhUZXN0LnNldChmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlcHRoVGVzdC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmRlcHRoRnVuYy5zZXQoZGVwdGhNb2RlLmZ1bmMpO1xuICAgICAgICAgICAgdGhpcy5kZXB0aE1hc2suc2V0KGRlcHRoTW9kZS5tYXNrKTtcbiAgICAgICAgICAgIHRoaXMuZGVwdGhSYW5nZS5zZXQoZGVwdGhNb2RlLnJhbmdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFN0ZW5jaWxNb2RlKHN0ZW5jaWxNb2RlOiAkUmVhZE9ubHk8U3RlbmNpbE1vZGU+KSB7XG4gICAgICAgIGlmIChzdGVuY2lsTW9kZS50ZXN0LmZ1bmMgPT09IHRoaXMuZ2wuQUxXQVlTICYmICFzdGVuY2lsTW9kZS5tYXNrKSB7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0LnNldChmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0ZW5jaWxUZXN0LnNldCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc3RlbmNpbE1hc2suc2V0KHN0ZW5jaWxNb2RlLm1hc2spO1xuICAgICAgICAgICAgdGhpcy5zdGVuY2lsT3Auc2V0KFtzdGVuY2lsTW9kZS5mYWlsLCBzdGVuY2lsTW9kZS5kZXB0aEZhaWwsIHN0ZW5jaWxNb2RlLnBhc3NdKTtcbiAgICAgICAgICAgIHRoaXMuc3RlbmNpbEZ1bmMuc2V0KHtcbiAgICAgICAgICAgICAgICBmdW5jOiBzdGVuY2lsTW9kZS50ZXN0LmZ1bmMsXG4gICAgICAgICAgICAgICAgcmVmOiBzdGVuY2lsTW9kZS5yZWYsXG4gICAgICAgICAgICAgICAgbWFzazogc3RlbmNpbE1vZGUudGVzdC5tYXNrXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldENvbG9yTW9kZShjb2xvck1vZGU6ICRSZWFkT25seTxDb2xvck1vZGU+KSB7XG4gICAgICAgIGlmIChkZWVwRXF1YWwoY29sb3JNb2RlLmJsZW5kRnVuY3Rpb24sIENvbG9yTW9kZS5SZXBsYWNlKSkge1xuICAgICAgICAgICAgdGhpcy5ibGVuZC5zZXQoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ibGVuZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmJsZW5kRnVuYy5zZXQoY29sb3JNb2RlLmJsZW5kRnVuY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy5ibGVuZENvbG9yLnNldChjb2xvck1vZGUuYmxlbmRDb2xvcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbG9yTWFzay5zZXQoY29sb3JNb2RlLm1hc2spO1xuICAgIH1cblxuICAgIHVuYmluZFZBTygpIHtcbiAgICAgICAgLy8gVW5iaW5kaW5nIHRoZSBWQU8gcHJldmVudHMgb3RoZXIgdGhpbmdzIChjdXN0b20gbGF5ZXJzLCBuZXcgYnVmZmVyIGNyZWF0aW9uKSBmcm9tXG4gICAgICAgIC8vIHVuaW50ZW50aW9uYWxseSBjaGFuZ2luZyB0aGUgc3RhdGUgb2YgdGhlIGxhc3QgVkFPIHVzZWQuXG4gICAgICAgIGlmICh0aGlzLmV4dFZlcnRleEFycmF5T2JqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRWZXJ0ZXhBcnJheU9FUy5zZXQobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbnRleHQ7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUuanMnO1xuaW1wb3J0IHtFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCBUaWxlQ2FjaGUgZnJvbSAnLi90aWxlX2NhY2hlLmpzJztcbmltcG9ydCB7YXN5bmNBbGwsIGtleXNEaWZmZXJlbmNlLCB2YWx1ZXMsIGNsYW1wfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuaW1wb3J0IHtPdmVyc2NhbGVkVGlsZUlELCBDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgU291cmNlRmVhdHVyZVN0YXRlIGZyb20gJy4vc291cmNlX3N0YXRlLmpzJztcbmltcG9ydCB7bWVyY2F0b3JYZnJvbUxuZ30gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuXG5pbXBvcnQgdHlwZSB7U291cmNlfSBmcm9tICcuL3NvdXJjZS5qcyc7XG5pbXBvcnQgdHlwZSB7U291cmNlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7ZGVmYXVsdCBhcyBNYXBib3hNYXB9IGZyb20gJy4uL3VpL21hcC5qcyc7XG5pbXBvcnQgdHlwZSBTdHlsZSBmcm9tICcuLi9zdHlsZS9zdHlsZS5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZVN0YXRlfSBmcm9tICcuL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgdHlwZSB7RmVhdHVyZVN0YXRlc30gZnJvbSAnLi9zb3VyY2Vfc3RhdGUuanMnO1xuaW1wb3J0IHR5cGUge1F1ZXJ5R2VvbWV0cnksIFRpbGVzcGFjZVF1ZXJ5R2VvbWV0cnl9IGZyb20gJy4uL3N0eWxlL3F1ZXJ5X2dlb21ldHJ5LmpzJztcblxuLyoqXG4gKiBgU291cmNlQ2FjaGVgIGlzIHJlc3BvbnNpYmxlIGZvclxuICpcbiAqICAtIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIGBTb3VyY2VgXG4gKiAgLSBmb3J3YXJkaW5nIGV2ZW50cyBmcm9tIGBTb3VyY2VgXG4gKiAgLSBjYWNoaW5nIHRpbGVzIGxvYWRlZCBmcm9tIGFuIGluc3RhbmNlIG9mIGBTb3VyY2VgXG4gKiAgLSBsb2FkaW5nIHRoZSB0aWxlcyBuZWVkZWQgdG8gcmVuZGVyIGEgZ2l2ZW4gdmlld3BvcnRcbiAqICAtIHVubG9hZGluZyB0aGUgY2FjaGVkIHRpbGVzIG5vdCBuZWVkZWQgdG8gcmVuZGVyIGEgZ2l2ZW4gdmlld3BvcnRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTb3VyY2VDYWNoZSBleHRlbmRzIEV2ZW50ZWQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWFwOiBNYXBib3hNYXA7XG4gICAgc3R5bGU6IFN0eWxlO1xuXG4gICAgX3NvdXJjZTogU291cmNlO1xuICAgIF9zb3VyY2VMb2FkZWQ6IGJvb2xlYW47XG4gICAgX3NvdXJjZUVycm9yZWQ6IGJvb2xlYW47XG4gICAgX3RpbGVzOiB7W186IHN0cmluZyB8IG51bWJlcl06IFRpbGV9O1xuICAgIF9wcmV2TG5nOiBudW1iZXIgfCB2b2lkO1xuICAgIF9jYWNoZTogVGlsZUNhY2hlO1xuICAgIF90aW1lcnM6IHtbXzogYW55XTogVGltZW91dElEfTtcbiAgICBfY2FjaGVUaW1lcnM6IHtbXzogYW55XTogVGltZW91dElEfTtcbiAgICBfbWluVGlsZUNhY2hlU2l6ZTogP251bWJlcjtcbiAgICBfbWF4VGlsZUNhY2hlU2l6ZTogP251bWJlcjtcbiAgICBfcGF1c2VkOiBib29sZWFuO1xuICAgIF9pc1Jhc3RlcjogYm9vbGVhbjtcbiAgICBfc2hvdWxkUmVsb2FkT25SZXN1bWU6IGJvb2xlYW47XG4gICAgX2NvdmVyZWRUaWxlczoge1tfOiBudW1iZXIgfCBzdHJpbmddOiBib29sZWFufTtcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybTtcbiAgICBfaXNJZFJlbmRlcmFibGU6IChpZDogbnVtYmVyLCBzeW1ib2xMYXllcj86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgdXNlZDogYm9vbGVhbjtcbiAgICB1c2VkRm9yVGVycmFpbjogYm9vbGVhbjtcbiAgICBfc3RhdGU6IFNvdXJjZUZlYXR1cmVTdGF0ZTtcbiAgICBfbG9hZGVkUGFyZW50VGlsZXM6IHtbXzogbnVtYmVyIHwgc3RyaW5nXTogP1RpbGV9O1xuICAgIF9vbmx5U3ltYm9sczogP2Jvb2xlYW47XG5cbiAgICBzdGF0aWMgbWF4VW5kZXJ6b29taW5nOiBudW1iZXI7XG4gICAgc3RhdGljIG1heE92ZXJ6b29taW5nOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBzb3VyY2U6IFNvdXJjZSwgb25seVN5bWJvbHM/OiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5fb25seVN5bWJvbHMgPSBvbmx5U3ltYm9scztcblxuICAgICAgICBzb3VyY2Uub24oJ2RhdGEnLCAoZSkgPT4ge1xuICAgICAgICAgICAgLy8gdGhpcy5fc291cmNlTG9hZGVkIHNpZ25pZmllcyB0aGF0IHRoZSBUaWxlSlNPTiBpcyBsb2FkZWQgaWYgYXBwbGljYWJsZS5cbiAgICAgICAgICAgIC8vIGlmIHRoZSBzb3VyY2UgdHlwZSBkb2VzIG5vdCBjb21lIHdpdGggYSBUaWxlSlNPTiwgdGhlIGZsYWcgc2lnbmlmaWVzIHRoZVxuICAgICAgICAgICAgLy8gc291cmNlIGRhdGEgaGFzIGxvYWRlZCAoaW4gb3RoZXIgd29yZHMsIEdlb0pTT04gaGFzIGJlZW4gdGlsZWQgb24gdGhlIHdvcmtlciBhbmQgaXMgcmVhZHkpXG4gICAgICAgICAgICBpZiAoZS5kYXRhVHlwZSA9PT0gJ3NvdXJjZScgJiYgZS5zb3VyY2VEYXRhVHlwZSA9PT0gJ21ldGFkYXRhJykgdGhpcy5fc291cmNlTG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gZm9yIHNvdXJjZXMgd2l0aCBtdXRhYmxlIGRhdGEsIHRoaXMgZXZlbnQgZmlyZXMgd2hlbiB0aGUgdW5kZXJseWluZyBkYXRhXG4gICAgICAgICAgICAvLyB0byBhIHNvdXJjZSBpcyBjaGFuZ2VkIChmb3IgZXhhbXBsZSwgdXNpbmcgW0dlb0pTT05Tb3VyY2Ujc2V0RGF0YV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9zb3VyY2VzLyNnZW9qc29uc291cmNlI3NldGRhdGEpIG9yIFtJbWFnZVNvdXJjZSNzZXRDb29yZGluYXRlc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9zb3VyY2VzLyNpbWFnZXNvdXJjZSNzZXRjb29yZGluYXRlcykpXG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlTG9hZGVkICYmICF0aGlzLl9wYXVzZWQgJiYgZS5kYXRhVHlwZSA9PT0gXCJzb3VyY2VcIiAmJiBlLnNvdXJjZURhdGFUeXBlID09PSAnY29udGVudCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBzb3VyY2Uub24oJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlRXJyb3JlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5fdGlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fY2FjaGUgPSBuZXcgVGlsZUNhY2hlKDAsIHRoaXMuX3VubG9hZFRpbGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuX3RpbWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9jYWNoZVRpbWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9taW5UaWxlQ2FjaGVTaXplID0gc291cmNlLm1pblRpbGVDYWNoZVNpemU7XG4gICAgICAgIHRoaXMuX21heFRpbGVDYWNoZVNpemUgPSBzb3VyY2UubWF4VGlsZUNhY2hlU2l6ZTtcbiAgICAgICAgdGhpcy5fbG9hZGVkUGFyZW50VGlsZXMgPSB7fTtcblxuICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBuZXcgU291cmNlRmVhdHVyZVN0YXRlKCk7XG4gICAgICAgIHRoaXMuX2lzUmFzdGVyID1cbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZS50eXBlID09PSAncmFzdGVyJyB8fFxuICAgICAgICAgICAgdGhpcy5fc291cmNlLnR5cGUgPT09ICdyYXN0ZXItZGVtJyB8fFxuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICAgICAgICAodGhpcy5fc291cmNlLnR5cGUgPT09ICdjdXN0b20nICYmIHRoaXMuX3NvdXJjZS5fZGF0YVR5cGUgPT09ICdyYXN0ZXInKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcGJveE1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fbWluVGlsZUNhY2hlU2l6ZSA9IHRoaXMuX21pblRpbGVDYWNoZVNpemUgPT09IHVuZGVmaW5lZCAmJiBtYXAgPyBtYXAuX21pblRpbGVDYWNoZVNpemUgOiB0aGlzLl9taW5UaWxlQ2FjaGVTaXplO1xuICAgICAgICB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID0gdGhpcy5fbWF4VGlsZUNhY2hlU2l6ZSA9PT0gdW5kZWZpbmVkICYmIG1hcCA/IG1hcC5fbWF4VGlsZUNhY2hlU2l6ZSA6IHRoaXMuX21heFRpbGVDYWNoZVNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRydWUgaWYgbm8gdGlsZSBkYXRhIGlzIHBlbmRpbmcsIHRpbGVzIHdpbGwgbm90IGNoYW5nZSB1bmxlc3NcbiAgICAgKiBhbiBhZGRpdGlvbmFsIEFQSSBjYWxsIGlzIHJlY2VpdmVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlRXJyb3JlZCkgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZUxvYWRlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2UubG9hZGVkKCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgIGZvciAoY29uc3QgdCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW3RdO1xuICAgICAgICAgICAgaWYgKHRpbGUuc3RhdGUgIT09ICdsb2FkZWQnICYmIHRpbGUuc3RhdGUgIT09ICdlcnJvcmVkJylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZ2V0U291cmNlKCk6IFNvdXJjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gICAgfVxuXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXMuX3BhdXNlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmVzdW1lKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3BhdXNlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzaG91bGRSZWxvYWQgPSB0aGlzLl9zaG91bGRSZWxvYWRPblJlc3VtZTtcbiAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lID0gZmFsc2U7XG4gICAgICAgIGlmIChzaG91bGRSZWxvYWQpIHRoaXMucmVsb2FkKCk7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybSkgdGhpcy51cGRhdGUodGhpcy50cmFuc2Zvcm0pO1xuICAgIH1cblxuICAgIF9sb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pOiB2b2lkIHtcbiAgICAgICAgdGlsZS5pc1N5bWJvbFRpbGUgPSB0aGlzLl9vbmx5U3ltYm9scztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5sb2FkVGlsZSh0aWxlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgX3VubG9hZFRpbGUodGlsZTogVGlsZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlLnVubG9hZFRpbGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLnVubG9hZFRpbGUodGlsZSwgKCkgPT4ge30pO1xuICAgIH1cblxuICAgIF9hYm9ydFRpbGUodGlsZTogVGlsZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlLmFib3J0VGlsZSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2UuYWJvcnRUaWxlKHRpbGUsICgpID0+IHt9KTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU291cmNlU3BlY2lmaWNhdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2Uuc2VyaWFsaXplKCk7XG4gICAgfVxuXG4gICAgcHJlcGFyZShjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGlmICAodGhpcy5fc291cmNlLnByZXBhcmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5wcmVwYXJlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdGF0ZS5jb2FsZXNjZUNoYW5nZXModGhpcy5fdGlsZXMsIHRoaXMubWFwID8gdGhpcy5tYXAucGFpbnRlciA6IG51bGwpO1xuXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UucHJlcGFyZVRpbGUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fc291cmNlLnByZXBhcmVUaWxlKHRpbGUpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIHRoaXMubWFwLnBhaW50ZXIudGVycmFpbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5wYWludGVyLnRlcnJhaW4uX2NsZWFyUmVuZGVyQ2FjaGVGb3JUaWxlKHRoaXMuaWQsIHRpbGUudGlsZUlEKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aWxlLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB0aWxlLnByZXBhcmUodGhpcy5tYXAuc3R5bGUuaW1hZ2VNYW5hZ2VyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBpIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaV07XG4gICAgICAgICAgICB0aWxlLnVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgICAgIHRpbGUucHJlcGFyZSh0aGlzLm1hcC5zdHlsZS5pbWFnZU1hbmFnZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFsbCB0aWxlIGlkcyBvcmRlcmVkIHdpdGggei1vcmRlciwgYW5kIGNhc3QgdG8gbnVtYmVyc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0SWRzKCk6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdmFsdWVzKCh0aGlzLl90aWxlczogYW55KSkubWFwKCh0aWxlOiBUaWxlKSA9PiB0aWxlLnRpbGVJRCkuc29ydChjb21wYXJlVGlsZUlkKS5tYXAoaWQgPT4gaWQua2V5KTtcbiAgICB9XG5cbiAgICBnZXRSZW5kZXJhYmxlSWRzKHN5bWJvbExheWVyPzogYm9vbGVhbik6IEFycmF5PG51bWJlcj4ge1xuICAgICAgICBjb25zdCByZW5kZXJhYmxlczogQXJyYXk8VGlsZT4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzSWRSZW5kZXJhYmxlKCtpZCwgc3ltYm9sTGF5ZXIpKSByZW5kZXJhYmxlcy5wdXNoKHRoaXMuX3RpbGVzW2lkXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN5bWJvbExheWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyYWJsZXMuc29ydCgoYV86IFRpbGUsIGJfOiBUaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYSA9IGFfLnRpbGVJRDtcbiAgICAgICAgICAgICAgICBjb25zdCBiID0gYl8udGlsZUlEO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdGF0ZWRBID0gKG5ldyBQb2ludChhLmNhbm9uaWNhbC54LCBhLmNhbm9uaWNhbC55KSkuX3JvdGF0ZSh0aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm90YXRlZEIgPSAobmV3IFBvaW50KGIuY2Fub25pY2FsLngsIGIuY2Fub25pY2FsLnkpKS5fcm90YXRlKHRoaXMudHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5vdmVyc2NhbGVkWiAtIGIub3ZlcnNjYWxlZFogfHwgcm90YXRlZEIueSAtIHJvdGF0ZWRBLnkgfHwgcm90YXRlZEIueCAtIHJvdGF0ZWRBLng7XG4gICAgICAgICAgICB9KS5tYXAodGlsZSA9PiB0aWxlLnRpbGVJRC5rZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZW5kZXJhYmxlcy5tYXAodGlsZSA9PiB0aWxlLnRpbGVJRCkuc29ydChjb21wYXJlVGlsZUlkKS5tYXAoaWQgPT4gaWQua2V5KTtcbiAgICB9XG5cbiAgICBoYXNSZW5kZXJhYmxlUGFyZW50KHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBwYXJlbnRUaWxlID0gdGhpcy5maW5kTG9hZGVkUGFyZW50KHRpbGVJRCwgMCk7XG4gICAgICAgIGlmIChwYXJlbnRUaWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNJZFJlbmRlcmFibGUocGFyZW50VGlsZS50aWxlSUQua2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX2lzSWRSZW5kZXJhYmxlKGlkOiBudW1iZXIsIHN5bWJvbExheWVyPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGlsZXNbaWRdICYmIHRoaXMuX3RpbGVzW2lkXS5oYXNEYXRhKCkgJiZcbiAgICAgICAgICAgICF0aGlzLl9jb3ZlcmVkVGlsZXNbaWRdICYmIChzeW1ib2xMYXllciB8fCAhdGhpcy5fdGlsZXNbaWRdLmhvbGRpbmdGb3JGYWRlKCkpO1xuICAgIH1cblxuICAgIHJlbG9hZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5fc2hvdWxkUmVsb2FkT25SZXN1bWUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FjaGUucmVzZXQoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGkgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90aWxlc1tpXS5zdGF0ZSAhPT0gXCJlcnJvcmVkXCIpIHRoaXMuX3JlbG9hZFRpbGUoK2ksICdyZWxvYWRpbmcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9yZWxvYWRUaWxlKGlkOiBudW1iZXIsIHN0YXRlOiBUaWxlU3RhdGUpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcblxuICAgICAgICAvLyB0aGlzIHBvdGVudGlhbGx5IGRvZXMgbm90IGFkZHJlc3MgYWxsIHVuZGVybHlpbmdcbiAgICAgICAgLy8gaXNzdWVzIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy80MjUyXG4gICAgICAgIC8vIC0gaGFyZCB0byB0ZWxsIHdpdGhvdXQgcmVwcm8gc3RlcHNcbiAgICAgICAgaWYgKCF0aWxlKSByZXR1cm47XG5cbiAgICAgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBcImxvYWRpbmdcIiB0aWxlcyBhbmQgXCJyZWxvYWRpbmdcIiBvciBcImV4cGlyZWRcIlxuICAgICAgICAvLyB0aWxlcyBpcyB0aGF0IFwicmVsb2FkaW5nXCIvXCJleHBpcmVkXCIgdGlsZXMgYXJlIFwicmVuZGVyYWJsZVwiLlxuICAgICAgICAvLyBUaGVyZWZvcmUsIGEgXCJsb2FkaW5nXCIgdGlsZSBjYW5ub3QgYmVjb21lIGEgXCJyZWxvYWRpbmdcIiB0aWxlIHdpdGhvdXRcbiAgICAgICAgLy8gZmlyc3QgYmVjb21pbmcgYSBcImxvYWRlZFwiIHRpbGUuXG4gICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGluZycpIHtcbiAgICAgICAgICAgIHRpbGUuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvYWRUaWxlKHRpbGUsIHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLCB0aWxlLCBpZCwgc3RhdGUpKTtcbiAgICB9XG5cbiAgICBfdGlsZUxvYWRlZCh0aWxlOiBUaWxlLCBpZDogbnVtYmVyLCBwcmV2aW91c1N0YXRlOiBUaWxlU3RhdGUsIGVycjogP0Vycm9yKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnZXJyb3JlZCc7XG4gICAgICAgICAgICBpZiAoKGVycjogYW55KS5zdGF0dXMgIT09IDQwNCkgdGhpcy5fc291cmNlLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyLCB7dGlsZX0pKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIHRyeSBsb2FkaW5nIHBhcmVudC9jaGlsZHJlbiB0aWxlcyBpZiBhIHRpbGUgZG9lc24ndCBleGlzdCAoNDA0KVxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUZvclRlcnJhaW4gPSB0aGlzLl9zb3VyY2UudHlwZSA9PT0gJ3Jhc3Rlci1kZW0nICYmIHRoaXMudXNlZEZvclRlcnJhaW47XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUZvclRlcnJhaW4gJiYgdGhpcy5tYXAucGFpbnRlci50ZXJyYWluKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlcnJhaW4gPSB0aGlzLm1hcC5wYWludGVyLnRlcnJhaW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMudHJhbnNmb3JtLCB0ZXJyYWluLmdldFNjYWxlZERlbVRpbGVTaXplKCksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0ZXJyYWluLnJlc2V0VGlsZUxvb2t1cENhY2hlKHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aWxlLnRpbWVBZGRlZCA9IGJyb3dzZXIubm93KCk7XG4gICAgICAgIGlmIChwcmV2aW91c1N0YXRlID09PSAnZXhwaXJlZCcpIHRpbGUucmVmcmVzaGVkVXBvbkV4cGlyYXRpb24gPSB0cnVlO1xuICAgICAgICB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIoaWQsIHRpbGUpO1xuICAgICAgICBpZiAodGhpcy5fc291cmNlLnR5cGUgPT09ICdyYXN0ZXItZGVtJyAmJiB0aWxlLmRlbSkgdGhpcy5fYmFja2ZpbGxERU0odGlsZSk7XG4gICAgICAgIHRoaXMuX3N0YXRlLmluaXRpYWxpemVUaWxlU3RhdGUodGlsZSwgdGhpcy5tYXAgPyB0aGlzLm1hcC5wYWludGVyIDogbnVsbCk7XG5cbiAgICAgICAgdGhpcy5fc291cmNlLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgdGlsZSwgY29vcmQ6IHRpbGUudGlsZUlELCAnc291cmNlQ2FjaGVJZCc6IHRoaXMuaWR9KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBGb3IgcmFzdGVyIHRlcnJhaW4gc291cmNlLCBiYWNrZmlsbCBERU0gdG8gZWxpbWluYXRlIHZpc2libGUgdGlsZSBib3VuZGFyaWVzXG4gICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgX2JhY2tmaWxsREVNKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyYWJsZXMgPSB0aGlzLmdldFJlbmRlcmFibGVJZHMoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW5kZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYm9yZGVySWQgPSByZW5kZXJhYmxlc1tpXTtcbiAgICAgICAgICAgIGlmICh0aWxlLm5laWdoYm9yaW5nVGlsZXMgJiYgdGlsZS5uZWlnaGJvcmluZ1RpbGVzW2JvcmRlcklkXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlclRpbGUgPSB0aGlzLmdldFRpbGVCeUlEKGJvcmRlcklkKTtcbiAgICAgICAgICAgICAgICBmaWxsQm9yZGVyKHRpbGUsIGJvcmRlclRpbGUpO1xuICAgICAgICAgICAgICAgIGZpbGxCb3JkZXIoYm9yZGVyVGlsZSwgdGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBmaWxsQm9yZGVyKHRpbGUsIGJvcmRlclRpbGUpIHtcbiAgICAgICAgICAgIGlmICghdGlsZS5kZW0gfHwgdGlsZS5kZW0uYm9yZGVyUmVhZHkpIHJldHVybjtcbiAgICAgICAgICAgIHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRpbGUubmVlZHNERU1UZXh0dXJlVXBsb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBkeCA9IGJvcmRlclRpbGUudGlsZUlELmNhbm9uaWNhbC54IC0gdGlsZS50aWxlSUQuY2Fub25pY2FsLng7XG4gICAgICAgICAgICBjb25zdCBkeSA9IGJvcmRlclRpbGUudGlsZUlELmNhbm9uaWNhbC55IC0gdGlsZS50aWxlSUQuY2Fub25pY2FsLnk7XG4gICAgICAgICAgICBjb25zdCBkaW0gPSBNYXRoLnBvdygyLCB0aWxlLnRpbGVJRC5jYW5vbmljYWwueik7XG4gICAgICAgICAgICBjb25zdCBib3JkZXJJZCA9IGJvcmRlclRpbGUudGlsZUlELmtleTtcbiAgICAgICAgICAgIGlmIChkeCA9PT0gMCAmJiBkeSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoZHkpID4gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeCkgPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBkZWx0YSBjb29yZGluYXRlIGZvciB3b3JsZCB3cmFwYXJvdW5kLlxuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeCArIGRpbSkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZHggKz0gZGltO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZHggLSBkaW0pID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGR4IC09IGRpbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWJvcmRlclRpbGUuZGVtIHx8ICF0aWxlLmRlbSkgcmV0dXJuO1xuICAgICAgICAgICAgdGlsZS5kZW0uYmFja2ZpbGxCb3JkZXIoYm9yZGVyVGlsZS5kZW0sIGR4LCBkeSk7XG4gICAgICAgICAgICBpZiAodGlsZS5uZWlnaGJvcmluZ1RpbGVzICYmIHRpbGUubmVpZ2hib3JpbmdUaWxlc1tib3JkZXJJZF0pXG4gICAgICAgICAgICAgICAgdGlsZS5uZWlnaGJvcmluZ1RpbGVzW2JvcmRlcklkXS5iYWNrZmlsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyB0aWxlIGJ5IFRpbGVJRFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0VGlsZSh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpOiBUaWxlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGlsZUJ5SUQodGlsZUlELmtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgc3BlY2lmaWMgdGlsZSBieSBpZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0VGlsZUJ5SUQoaWQ6IG51bWJlcik6IFRpbGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGlsZXNbaWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBhIGdpdmVuIHNldCBvZiB0aWxlcywgcmV0YWluIGNoaWxkcmVuIHRoYXQgYXJlIGxvYWRlZCBhbmQgaGF2ZSBhIHpvb21cbiAgICAgKiBiZXR3ZWVuIGB6b29tYCAoZXhjbHVzaXZlKSBhbmQgYG1heENvdmVyaW5nWm9vbWAgKGluY2x1c2l2ZSlcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9yZXRhaW5Mb2FkZWRDaGlsZHJlbihcbiAgICAgICAgaWRlYWxUaWxlczoge1tudW1iZXIgfCBzdHJpbmddOiBPdmVyc2NhbGVkVGlsZUlEfSxcbiAgICAgICAgem9vbTogbnVtYmVyLFxuICAgICAgICBtYXhDb3ZlcmluZ1pvb206IG51bWJlcixcbiAgICAgICAgcmV0YWluOiB7W251bWJlciB8IHN0cmluZ106IE92ZXJzY2FsZWRUaWxlSUR9XG4gICAgKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuXG4gICAgICAgICAgICAvLyBvbmx5IGNvbnNpZGVyIHJlbmRlcmFibGUgdGlsZXMgdXAgdG8gbWF4Q292ZXJpbmdab29tXG4gICAgICAgICAgICBpZiAocmV0YWluW2lkXSB8fFxuICAgICAgICAgICAgICAgICF0aWxlLmhhc0RhdGEoKSB8fFxuICAgICAgICAgICAgICAgIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaIDw9IHpvb20gfHxcbiAgICAgICAgICAgICAgICB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiA+IG1heENvdmVyaW5nWm9vbVxuICAgICAgICAgICAgKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHBhcmVudHMgYW5kIHJldGFpbiB0aGUgdG9wbW9zdCBsb2FkZWQgb25lIGlmIGZvdW5kXG4gICAgICAgICAgICBsZXQgdG9wbW9zdExvYWRlZElEID0gdGlsZS50aWxlSUQ7XG4gICAgICAgICAgICB3aGlsZSAodGlsZSAmJiB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiA+IHpvb20gKyAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SUQgPSB0aWxlLnRpbGVJRC5zY2FsZWRUbyh0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIDEpO1xuXG4gICAgICAgICAgICAgICAgdGlsZSA9IHRoaXMuX3RpbGVzW3BhcmVudElELmtleV07XG5cbiAgICAgICAgICAgICAgICBpZiAodGlsZSAmJiB0aWxlLmhhc0RhdGEoKSkge1xuICAgICAgICAgICAgICAgICAgICB0b3Btb3N0TG9hZGVkSUQgPSBwYXJlbnRJRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCBhbmNlc3RvcnMgb2YgdGhlIHRvcG1vc3QgbG9hZGVkIGNoaWxkIHRvIHNlZSBpZiB0aGVyZSdzIG9uZSB0aGF0IG5lZWRlZCBpdFxuICAgICAgICAgICAgbGV0IHRpbGVJRCA9IHRvcG1vc3RMb2FkZWRJRDtcbiAgICAgICAgICAgIHdoaWxlICh0aWxlSUQub3ZlcnNjYWxlZFogPiB6b29tKSB7XG4gICAgICAgICAgICAgICAgdGlsZUlEID0gdGlsZUlELnNjYWxlZFRvKHRpbGVJRC5vdmVyc2NhbGVkWiAtIDEpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlkZWFsVGlsZXNbdGlsZUlELmtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYSBwYXJlbnQgdGhhdCBuZWVkZWQgYSBsb2FkZWQgY2hpbGQ7IHJldGFpbiB0aGF0IGNoaWxkXG4gICAgICAgICAgICAgICAgICAgIHJldGFpblt0b3Btb3N0TG9hZGVkSUQua2V5XSA9IHRvcG1vc3RMb2FkZWRJRDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBhIGxvYWRlZCBwYXJlbnQgb2YgdGhlIGdpdmVuIHRpbGUgKHVwIHRvIG1pbkNvdmVyaW5nWm9vbSlcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZpbmRMb2FkZWRQYXJlbnQodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCBtaW5Db3ZlcmluZ1pvb206IG51bWJlcik6ID9UaWxlIHtcbiAgICAgICAgaWYgKHRpbGVJRC5rZXkgaW4gdGhpcy5fbG9hZGVkUGFyZW50VGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzW3RpbGVJRC5rZXldO1xuICAgICAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQudGlsZUlELm92ZXJzY2FsZWRaID49IG1pbkNvdmVyaW5nWm9vbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHogPSB0aWxlSUQub3ZlcnNjYWxlZFogLSAxOyB6ID49IG1pbkNvdmVyaW5nWm9vbTsgei0tKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRUaWxlSUQgPSB0aWxlSUQuc2NhbGVkVG8oeik7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fZ2V0TG9hZGVkVGlsZShwYXJlbnRUaWxlSUQpO1xuICAgICAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRMb2FkZWRUaWxlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6ID9UaWxlIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW3RpbGVJRC5rZXldO1xuICAgICAgICBpZiAodGlsZSAmJiB0aWxlLmhhc0RhdGEoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRpbGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGlsZUNhY2hlIGlnbm9yZXMgd3JhcCBpbiBsb29rdXAuXG4gICAgICAgIGNvbnN0IGNhY2hlZFRpbGUgPSB0aGlzLl9jYWNoZS5nZXRCeUtleSh0aGlzLl9zb3VyY2UucmVwYXJzZU92ZXJzY2FsZWQgPyB0aWxlSUQud3JhcHBlZCgpLmtleSA6IHRpbGVJRC5jYW5vbmljYWwua2V5KTtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFRpbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgdGlsZSBjYWNoZSBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3cG9ydCdzIHNpemVcbiAgICAgKiBvciB0aGUgbWluVGlsZUNhY2hlU2l6ZSBhbmQgbWF4VGlsZUNhY2hlU2l6ZSBvcHRpb25zIHBhc3NlZCBkdXJpbmcgbWFwIGNyZWF0aW9uXG4gICAgICpcbiAgICAgKiBMYXJnZXIgdmlld3BvcnRzIHVzZSBtb3JlIHRpbGVzIGFuZCBuZWVkIGxhcmdlciBjYWNoZXMuIExhcmdlciB2aWV3cG9ydHNcbiAgICAgKiBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgZm91bmQgb24gZGV2aWNlcyB3aXRoIG1vcmUgbWVtb3J5IGFuZCBvbiBwYWdlcyB3aGVyZVxuICAgICAqIHRoZSBtYXAgaXMgbW9yZSBpbXBvcnRhbnQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB1cGRhdGVDYWNoZVNpemUodHJhbnNmb3JtOiBUcmFuc2Zvcm0sIHRpbGVTaXplPzogbnVtYmVyKSB7XG4gICAgICAgIHRpbGVTaXplID0gdGlsZVNpemUgfHwgdGhpcy5fc291cmNlLnRpbGVTaXplO1xuICAgICAgICBjb25zdCB3aWR0aEluVGlsZXMgPSBNYXRoLmNlaWwodHJhbnNmb3JtLndpZHRoIC8gdGlsZVNpemUpICsgMTtcbiAgICAgICAgY29uc3QgaGVpZ2h0SW5UaWxlcyA9IE1hdGguY2VpbCh0cmFuc2Zvcm0uaGVpZ2h0IC8gdGlsZVNpemUpICsgMTtcbiAgICAgICAgY29uc3QgYXBwcm94VGlsZXNJblZpZXcgPSB3aWR0aEluVGlsZXMgKiBoZWlnaHRJblRpbGVzO1xuICAgICAgICBjb25zdCBjb21tb25ab29tUmFuZ2UgPSA1O1xuXG4gICAgICAgIGNvbnN0IHZpZXdEZXBlbmRlbnRNYXhTaXplID0gTWF0aC5mbG9vcihhcHByb3hUaWxlc0luVmlldyAqIGNvbW1vblpvb21SYW5nZSk7XG4gICAgICAgIGNvbnN0IG1pblNpemUgPSB0eXBlb2YgdGhpcy5fbWluVGlsZUNhY2hlU2l6ZSA9PT0gJ251bWJlcicgPyBNYXRoLm1heCh0aGlzLl9taW5UaWxlQ2FjaGVTaXplLCB2aWV3RGVwZW5kZW50TWF4U2l6ZSkgOiB2aWV3RGVwZW5kZW50TWF4U2l6ZTtcbiAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHR5cGVvZiB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID09PSAnbnVtYmVyJyA/IE1hdGgubWluKHRoaXMuX21heFRpbGVDYWNoZVNpemUsIG1pblNpemUpIDogbWluU2l6ZTtcblxuICAgICAgICB0aGlzLl9jYWNoZS5zZXRNYXhTaXplKG1heFNpemUpO1xuICAgIH1cblxuICAgIGhhbmRsZVdyYXBKdW1wKGxuZzogbnVtYmVyKSB7XG4gICAgICAgIC8vIE9uIHRvcCBvZiB0aGUgcmVndWxhciB6L3gveSB2YWx1ZXMsIFRpbGVJRHMgaGF2ZSBhIGB3cmFwYCB2YWx1ZSB0aGF0IHNwZWNpZnlcbiAgICAgICAgLy8gd2hpY2ggY29weSBvZiB0aGUgd29ybGQgdGhlIHRpbGUgYmVsb25ncyB0by4gRm9yIGV4YW1wbGUsIGF0IGBsbmc6IDEwYCB5b3VcbiAgICAgICAgLy8gbWlnaHQgcmVuZGVyIHoveC95LzAgd2hpbGUgYXQgYGxuZzogMzcwYCB5b3Ugd291bGQgcmVuZGVyIHoveC95LzEuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdoZW4gbG5nIHZhbHVlcyBnZXQgd3JhcHBlZCAoZ29pbmcgZnJvbSBgbG5nOiAzNzBgIHRvIGBsb25nOiAxMGApIHlvdSBleHBlY3RcbiAgICAgICAgLy8gdG8gc2VlIHRoZSBzYW1lIHRoaW5nIG9uIHRoZSBzY3JlZW4gKDM3MCBkZWdyZWVzIGFuZCAxMCBkZWdyZWVzIGlzIHRoZSBzYW1lXG4gICAgICAgIC8vIHBsYWNlIGluIHRoZSB3b3JsZCkgYnV0IGFsbCB0aGUgVGlsZUlEcyB3aWxsIGhhdmUgZGlmZmVyZW50IHdyYXAgdmFsdWVzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJbiBvcmRlciB0byBtYWtlIHRoaXMgdHJhbnNpdGlvbiBzZWFtbGVzcywgd2UgY2FsY3VsYXRlIHRoZSByb3VuZGVkIGRpZmZlcmVuY2Ugb2ZcbiAgICAgICAgLy8gXCJ3b3JsZHNcIiBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBmcmFtZS4gSWYgdGhlIG1hcCBwYW5uZWQgYnlcbiAgICAgICAgLy8gYSB3b3JsZCwgdGhlbiB3ZSBjYW4gYXNzaWduIGFsbCB0aGUgdGlsZXMgbmV3IFRpbGVJRHMgd2l0aCB1cGRhdGVkIHdyYXAgdmFsdWVzLlxuICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYXNzaWduIHoveC95LzEgYSBuZXcgaWQ6IHoveC95LzAuIEl0IGlzIHRoZSBzYW1lIHRpbGUsIGp1c3QgcmVuZGVyZWRcbiAgICAgICAgLy8gaW4gYSBkaWZmZXJlbnQgcG9zaXRpb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgZW5hYmxlcyB1cyB0byByZXVzZSB0aGUgdGlsZXMgYXQgbW9yZSBpZGVhbCBsb2NhdGlvbnMgYW5kIHByZXZlbnQgZmxpY2tlcmluZy5cbiAgICAgICAgY29uc3QgcHJldkxuZyA9IHRoaXMuX3ByZXZMbmcgPT09IHVuZGVmaW5lZCA/IGxuZyA6IHRoaXMuX3ByZXZMbmc7XG4gICAgICAgIGNvbnN0IGxuZ0RpZmZlcmVuY2UgPSBsbmcgLSBwcmV2TG5nO1xuICAgICAgICBjb25zdCB3b3JsZERpZmZlcmVuY2UgPSBsbmdEaWZmZXJlbmNlIC8gMzYwO1xuICAgICAgICBjb25zdCB3cmFwRGVsdGEgPSBNYXRoLnJvdW5kKHdvcmxkRGlmZmVyZW5jZSk7XG4gICAgICAgIHRoaXMuX3ByZXZMbmcgPSBsbmc7XG5cbiAgICAgICAgaWYgKHdyYXBEZWx0YSkge1xuICAgICAgICAgICAgY29uc3QgdGlsZXM6IHtbXzogc3RyaW5nIHwgbnVtYmVyXTogVGlsZX0gPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2tleV07XG4gICAgICAgICAgICAgICAgdGlsZS50aWxlSUQgPSB0aWxlLnRpbGVJRC51bndyYXBUbyh0aWxlLnRpbGVJRC53cmFwICsgd3JhcERlbHRhKTtcbiAgICAgICAgICAgICAgICB0aWxlc1t0aWxlLnRpbGVJRC5rZXldID0gdGlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3RpbGVzID0gdGlsZXM7XG5cbiAgICAgICAgICAgIC8vIFJlc2V0IHRpbGUgcmVsb2FkIHRpbWVyc1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aW1lcnMpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJzW2lkXSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RpbWVyc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIoK2lkLCB0aWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGlsZXMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgdmlld3BvcnQgYW5kIGFkZHMgbmV3IHRpbGVzIHRoYXRcbiAgICAgKiBhcmUgaW5zaWRlIHRoZSB2aWV3cG9ydC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXBkYXRlRm9yVGVycmFpbiBTaWduYWxzIHRvIHVwZGF0ZSB0aWxlcyBldmVuIGlmIHRoZVxuICAgICAqIHNvdXJjZSBpcyBub3QgdXNlZCAodGhpcy51c2VkKSBieSBsYXllcnM6IGl0IGlzIHVzZWQgZm9yIHRlcnJhaW4uXG4gICAgICogQHBhcmFtIHt0aWxlU2l6ZX0gdGlsZVNpemUgSWYgbmVlZGVkIHRvIGdldCBsb3dlciByZXNvbHV0aW9uIGlkZWFsIGNvdmVyLFxuICAgICAqIG92ZXJyaWRlIHNvdXJjZS50aWxlU2l6ZSB1c2VkIGluIHRpbGUgY292ZXIgY2FsY3VsYXRpb24uXG4gICAgICovXG4gICAgdXBkYXRlKHRyYW5zZm9ybTogVHJhbnNmb3JtLCB0aWxlU2l6ZT86IG51bWJlciwgdXBkYXRlRm9yVGVycmFpbj86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIGlmICghdGhpcy5fc291cmNlTG9hZGVkIHx8IHRoaXMuX3BhdXNlZCB8fCB0aGlzLnRyYW5zZm9ybS5mcmVlemVUaWxlQ292ZXJhZ2UpIHsgcmV0dXJuOyB9XG4gICAgICAgIGFzc2VydCghKHVwZGF0ZUZvclRlcnJhaW4gJiYgIXRoaXMudXNlZEZvclRlcnJhaW4pKTtcbiAgICAgICAgaWYgKHRoaXMudXNlZEZvclRlcnJhaW4gJiYgIXVwZGF0ZUZvclRlcnJhaW4pIHtcbiAgICAgICAgICAgIC8vIElmIHNvdXJjZSBpcyB1c2VkIGZvciBib3RoIHRlcnJhaW4gYW5kIGhpbGxzaGFkZSwgZG9uJ3QgdXBkYXRlIGl0IHR3aWNlLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVDYWNoZVNpemUodHJhbnNmb3JtLCB0aWxlU2l6ZSk7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgIT09ICdnbG9iZScpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlV3JhcEp1bXAodGhpcy50cmFuc2Zvcm0uY2VudGVyLmxuZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb3ZlcmVkIGlzIGEgbGlzdCBvZiByZXRhaW5lZCB0aWxlcyB3aG8ncyBhcmVhcyBhcmUgZnVsbHkgY292ZXJlZCBieSBvdGhlcixcbiAgICAgICAgLy8gYmV0dGVyLCByZXRhaW5lZCB0aWxlcy4gVGhleSBhcmUgbm90IGRyYXduIHNlcGFyYXRlbHkuXG4gICAgICAgIHRoaXMuX2NvdmVyZWRUaWxlcyA9IHt9O1xuXG4gICAgICAgIGxldCBpZGVhbFRpbGVJRHM7XG4gICAgICAgIGlmICghdGhpcy51c2VkICYmICF0aGlzLnVzZWRGb3JUZXJyYWluKSB7XG4gICAgICAgICAgICBpZGVhbFRpbGVJRHMgPSBbXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2UudGlsZUlEKSB7XG4gICAgICAgICAgICBpZGVhbFRpbGVJRHMgPSB0cmFuc2Zvcm0uZ2V0VmlzaWJsZVVud3JhcHBlZENvb3JkaW5hdGVzKHRoaXMuX3NvdXJjZS50aWxlSUQpXG4gICAgICAgICAgICAgICAgLm1hcCgodW53cmFwcGVkKSA9PiBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh1bndyYXBwZWQuY2Fub25pY2FsLnosIHVud3JhcHBlZC53cmFwLCB1bndyYXBwZWQuY2Fub25pY2FsLnosIHVud3JhcHBlZC5jYW5vbmljYWwueCwgdW53cmFwcGVkLmNhbm9uaWNhbC55KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZGVhbFRpbGVJRHMgPSB0cmFuc2Zvcm0uY292ZXJpbmdUaWxlcyh7XG4gICAgICAgICAgICAgICAgdGlsZVNpemU6IHRpbGVTaXplIHx8IHRoaXMuX3NvdXJjZS50aWxlU2l6ZSxcbiAgICAgICAgICAgICAgICBtaW56b29tOiB0aGlzLl9zb3VyY2UubWluem9vbSxcbiAgICAgICAgICAgICAgICBtYXh6b29tOiB0aGlzLl9zb3VyY2UubWF4em9vbSxcbiAgICAgICAgICAgICAgICByb3VuZFpvb206IHRoaXMuX3NvdXJjZS5yb3VuZFpvb20gJiYgIXVwZGF0ZUZvclRlcnJhaW4sXG4gICAgICAgICAgICAgICAgcmVwYXJzZU92ZXJzY2FsZWQ6IHRoaXMuX3NvdXJjZS5yZXBhcnNlT3ZlcnNjYWxlZCxcbiAgICAgICAgICAgICAgICBpc1RlcnJhaW5ERU06IHRoaXMudXNlZEZvclRlcnJhaW5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlLmhhc1RpbGUpIHtcbiAgICAgICAgICAgICAgICBpZGVhbFRpbGVJRHMgPSBpZGVhbFRpbGVJRHMuZmlsdGVyKChjb29yZCkgPT4gKHRoaXMuX3NvdXJjZS5oYXNUaWxlOiBhbnkpKGNvb3JkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXRhaW4gaXMgYSBsaXN0IG9mIHRpbGVzIHRoYXQgd2Ugc2hvdWxkbid0IGRlbGV0ZSwgZXZlbiBpZiB0aGV5IGFyZSBub3RcbiAgICAgICAgLy8gdGhlIG1vc3QgaWRlYWwgdGlsZSBmb3IgdGhlIGN1cnJlbnQgdmlld3BvcnQuIFRoaXMgbWF5IGluY2x1ZGUgdGlsZXMgbGlrZVxuICAgICAgICAvLyBwYXJlbnQgb3IgY2hpbGQgdGlsZXMgdGhhdCBhcmUgKmFscmVhZHkqIGxvYWRlZC5cbiAgICAgICAgY29uc3QgcmV0YWluID0gdGhpcy5fdXBkYXRlUmV0YWluZWRUaWxlcyhpZGVhbFRpbGVJRHMpO1xuXG4gICAgICAgIGlmIChpc1Jhc3RlclR5cGUodGhpcy5fc291cmNlLnR5cGUpICYmIGlkZWFsVGlsZUlEcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudHNGb3JGYWRpbmc6IHtbXzogc3RyaW5nIHwgbnVtYmVyXTogT3ZlcnNjYWxlZFRpbGVJRH0gPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IGZhZGluZ1RpbGVzID0ge307XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBPYmplY3Qua2V5cyhyZXRhaW4pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlSUQgPSByZXRhaW5baWRdO1xuICAgICAgICAgICAgICAgIGFzc2VydCh0aWxlSUQua2V5ID09PSAraWQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgKHRpbGUuZmFkZUVuZFRpbWUgJiYgdGlsZS5mYWRlRW5kVGltZSA8PSBicm93c2VyLm5vdygpKSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGlsZSBpcyBsb2FkZWQgYnV0IHN0aWxsIGZhZGluZyBpbiwgZmluZCBwYXJlbnRzIHRvIGNyb3NzLWZhZGUgd2l0aCBpdFxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFRpbGUgPSB0aGlzLmZpbmRMb2FkZWRQYXJlbnQodGlsZUlELCBNYXRoLm1heCh0aWxlSUQub3ZlcnNjYWxlZFogLSBTb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZywgdGhpcy5fc291cmNlLm1pbnpvb20pKTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50VGlsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRUaWxlKHBhcmVudFRpbGUudGlsZUlEKTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50c0ZvckZhZGluZ1twYXJlbnRUaWxlLnRpbGVJRC5rZXldID0gcGFyZW50VGlsZS50aWxlSUQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmFkaW5nVGlsZXNbaWRdID0gdGlsZUlEO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3IgY2hpbGRyZW4gdGlsZXMgd2l0aCBwYXJlbnQgdGlsZXMgc3RpbGwgZmFkaW5nIGluLFxuICAgICAgICAgICAgLy8gcmV0YWluIHRoZSBjaGlsZHJlbiBzbyB0aGUgcGFyZW50IGNhbiBmYWRlIG9uIHRvcFxuICAgICAgICAgICAgY29uc3QgbWluWm9vbSA9IGlkZWFsVGlsZUlEc1tpZGVhbFRpbGVJRHMubGVuZ3RoIC0gMV0ub3ZlcnNjYWxlZFo7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRUaWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICAgICAgICAgIGlmIChyZXRhaW5baWRdIHx8ICFjaGlsZFRpbGUuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJRCA9IGNoaWxkVGlsZS50aWxlSUQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudElELm92ZXJzY2FsZWRaID4gbWluWm9vbSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRJRCA9IHBhcmVudElELnNjYWxlZFRvKHBhcmVudElELm92ZXJzY2FsZWRaIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1twYXJlbnRJRC5rZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGlsZSAmJiB0aWxlLmhhc0RhdGEoKSAmJiBmYWRpbmdUaWxlc1twYXJlbnRJRC5rZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5baWRdID0gY2hpbGRUaWxlLnRpbGVJRDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHBhcmVudHNGb3JGYWRpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJldGFpbltpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSB0aWxlIGlzIG9ubHkgbmVlZGVkIGZvciBmYWRpbmcsIG1hcmsgaXQgYXMgY292ZXJlZCBzbyB0aGF0IGl0IGlzbid0IHJlbmRlcmVkIG9uIGl0J3Mgb3duLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW2lkXSA9IHBhcmVudHNGb3JGYWRpbmdbaWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmV0YWluZWRJZCBpbiByZXRhaW4pIHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSByZXRhaW5lZCB0aWxlcyBhbHdheXMgY2xlYXIgYW55IGV4aXN0aW5nIGZhZGUgaG9sZHNcbiAgICAgICAgICAgIC8vIHNvIHRoYXQgaWYgdGhleSdyZSByZW1vdmVkIGFnYWluIHRoZWlyIGZhZGUgdGltZXIgc3RhcnRzIGZyZXNoLlxuICAgICAgICAgICAgdGhpcy5fdGlsZXNbcmV0YWluZWRJZF0uY2xlYXJGYWRlSG9sZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0aWxlcyB3ZSBkb24ndCBuZWVkIGFueW1vcmUuXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IGtleXNEaWZmZXJlbmNlKCh0aGlzLl90aWxlczogYW55KSwgKHJldGFpbjogYW55KSk7XG4gICAgICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIHJlbW92ZSkge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW3RpbGVJRF07XG4gICAgICAgICAgICBpZiAodGlsZS5oYXNTeW1ib2xCdWNrZXRzICYmICF0aWxlLmhvbGRpbmdGb3JGYWRlKCkpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnNldEhvbGREdXJhdGlvbih0aGlzLm1hcC5fZmFkZUR1cmF0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRpbGUuaGFzU3ltYm9sQnVja2V0cyB8fCB0aWxlLnN5bWJvbEZhZGVGaW5pc2hlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlVGlsZSgrdGlsZUlEKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhIGNhY2hlIG9mIGxvYWRlZCBwYXJlbnRzXG4gICAgICAgIHRoaXMuX3VwZGF0ZUxvYWRlZFBhcmVudFRpbGVDYWNoZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9vbmx5U3ltYm9scyAmJiB0aGlzLl9zb3VyY2UuYWZ0ZXJVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5hZnRlclVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVsZWFzZVN5bWJvbEZhZGVUaWxlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl90aWxlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbGVzW2lkXS5ob2xkaW5nRm9yRmFkZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlVGlsZSgraWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZVJldGFpbmVkVGlsZXMoaWRlYWxUaWxlSURzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPik6IHtbXzogbnVtYmVyIHwgc3RyaW5nXTogT3ZlcnNjYWxlZFRpbGVJRH0ge1xuICAgICAgICBjb25zdCByZXRhaW46IHtbXzogbnVtYmVyIHwgc3RyaW5nXTogT3ZlcnNjYWxlZFRpbGVJRH0gPSB7fTtcbiAgICAgICAgaWYgKGlkZWFsVGlsZUlEcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHJldGFpbjsgfVxuXG4gICAgICAgIGNvbnN0IGNoZWNrZWQ6IHtbXzogbnVtYmVyIHwgc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gICAgICAgIGNvbnN0IG1pblpvb20gPSBpZGVhbFRpbGVJRHMucmVkdWNlKChtaW4sIGlkKSA9PiBNYXRoLm1pbihtaW4sIGlkLm92ZXJzY2FsZWRaKSwgSW5maW5pdHkpO1xuICAgICAgICBjb25zdCBtYXhab29tID0gaWRlYWxUaWxlSURzWzBdLm92ZXJzY2FsZWRaO1xuICAgICAgICBhc3NlcnQobWluWm9vbSA8PSBtYXhab29tKTtcbiAgICAgICAgY29uc3QgbWluQ292ZXJpbmdab29tID0gTWF0aC5tYXgobWF4Wm9vbSAtIFNvdXJjZUNhY2hlLm1heE92ZXJ6b29taW5nLCB0aGlzLl9zb3VyY2UubWluem9vbSk7XG4gICAgICAgIGNvbnN0IG1heENvdmVyaW5nWm9vbSA9IE1hdGgubWF4KG1heFpvb20gKyBTb3VyY2VDYWNoZS5tYXhVbmRlcnpvb21pbmcsICB0aGlzLl9zb3VyY2UubWluem9vbSk7XG5cbiAgICAgICAgY29uc3QgbWlzc2luZ1RpbGVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIGlkZWFsVGlsZUlEcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX2FkZFRpbGUodGlsZUlEKTtcblxuICAgICAgICAgICAgLy8gcmV0YWluIHRoZSB0aWxlIGV2ZW4gaWYgaXQncyBub3QgbG9hZGVkIGJlY2F1c2UgaXQncyBhbiBpZGVhbCB0aWxlLlxuICAgICAgICAgICAgcmV0YWluW3RpbGVJRC5rZXldID0gdGlsZUlEO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5oYXNEYXRhKCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAobWluWm9vbSA8IHRoaXMuX3NvdXJjZS5tYXh6b29tKSB7XG4gICAgICAgICAgICAgICAgLy8gc2F2ZSBtaXNzaW5nIHRpbGVzIHRoYXQgcG90ZW50aWFsbHkgaGF2ZSBsb2FkZWQgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBtaXNzaW5nVGlsZXNbdGlsZUlELmtleV0gPSB0aWxlSUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXRhaW4gYW55IGxvYWRlZCBjaGlsZHJlbiBvZiBpZGVhbCB0aWxlcyB1cCB0byBtYXhDb3ZlcmluZ1pvb21cbiAgICAgICAgdGhpcy5fcmV0YWluTG9hZGVkQ2hpbGRyZW4obWlzc2luZ1RpbGVzLCBtaW5ab29tLCBtYXhDb3ZlcmluZ1pvb20sIHJldGFpbik7XG5cbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgaWRlYWxUaWxlSURzKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMuX3RpbGVzW3RpbGVJRC5rZXldO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5oYXNEYXRhKCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBUaGUgdGlsZSB3ZSByZXF1aXJlIGlzIG5vdCB5ZXQgbG9hZGVkIG9yIGRvZXMgbm90IGV4aXN0O1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBmaW5kIGNoaWxkcmVuIHRoYXQgZnVsbHkgY292ZXIgaXQuXG5cbiAgICAgICAgICAgIGlmICh0aWxlSUQuY2Fub25pY2FsLnogPj0gdGhpcy5fc291cmNlLm1heHpvb20pIHtcbiAgICAgICAgICAgICAgICAvLyBXZSdyZSBsb29raW5nIGZvciBhbiBvdmVyem9vbWVkIGNoaWxkIHRpbGUuXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRDb29yZCA9IHRpbGVJRC5jaGlsZHJlbih0aGlzLl9zb3VyY2UubWF4em9vbSlbMF07XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRUaWxlID0gdGhpcy5nZXRUaWxlKGNoaWxkQ29vcmQpO1xuICAgICAgICAgICAgICAgIGlmICghIWNoaWxkVGlsZSAmJiBjaGlsZFRpbGUuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldGFpbltjaGlsZENvb3JkLmtleV0gPSBjaGlsZENvb3JkO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gdGlsZSBpcyBjb3ZlcmVkIGJ5IG92ZXJ6b29tZWQgY2hpbGRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGFsbCA0IGltbWVkaWF0ZSBjaGlsZHJlbiBhcmUgbG9hZGVkIChpbiBvdGhlciB3b3JkcywgdGhlIG1pc3NpbmcgaWRlYWwgdGlsZSBpcyBjb3ZlcmVkKVxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGlsZUlELmNoaWxkcmVuKHRoaXMuX3NvdXJjZS5tYXh6b29tKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXRhaW5bY2hpbGRyZW5bMF0ua2V5XSAmJlxuICAgICAgICAgICAgICAgICAgICByZXRhaW5bY2hpbGRyZW5bMV0ua2V5XSAmJlxuICAgICAgICAgICAgICAgICAgICByZXRhaW5bY2hpbGRyZW5bMl0ua2V5XSAmJlxuICAgICAgICAgICAgICAgICAgICByZXRhaW5bY2hpbGRyZW5bM10ua2V5XSkgY29udGludWU7IC8vIHRpbGUgaXMgY292ZXJlZCBieSBjaGlsZHJlblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXZSBjb3VsZG4ndCBmaW5kIGNoaWxkIHRpbGVzIHRoYXQgZW50aXJlbHkgY292ZXIgdGhlIGlkZWFsIHRpbGU7IGxvb2sgZm9yIHBhcmVudHMgbm93LlxuXG4gICAgICAgICAgICAvLyBBcyB3ZSBhc2NlbmQgdXAgdGhlIHRpbGUgcHlyYW1pZCBvZiB0aGUgaWRlYWwgdGlsZSwgd2UgY2hlY2sgd2hldGhlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAvLyB0aWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgcmVxdWVzdGVkIChhbmQgZXJyb3JlZCBiZWNhdXNlIHdlIG9ubHkgbG9vcCBvdmVyIHRpbGVzIHdpdGggbm8gZGF0YSlcbiAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIHJlcXVlc3QgaXRzIHBhcmVudC5cbiAgICAgICAgICAgIGxldCBwYXJlbnRXYXNSZXF1ZXN0ZWQgPSB0aWxlLndhc1JlcXVlc3RlZCgpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBvdmVyc2NhbGVkWiA9IHRpbGVJRC5vdmVyc2NhbGVkWiAtIDE7IG92ZXJzY2FsZWRaID49IG1pbkNvdmVyaW5nWm9vbTsgLS1vdmVyc2NhbGVkWikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudElkID0gdGlsZUlELnNjYWxlZFRvKG92ZXJzY2FsZWRaKTtcblxuICAgICAgICAgICAgICAgIC8vIEJyZWFrIHBhcmVudCB0aWxlIGFzY2VudCBpZiB0aGlzIHJvdXRlIGhhcyBiZWVuIHByZXZpb3VzbHkgY2hlY2tlZCBieSBhbm90aGVyIGNoaWxkLlxuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkW3BhcmVudElkLmtleV0pIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNoZWNrZWRbcGFyZW50SWQua2V5XSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy5nZXRUaWxlKHBhcmVudElkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgJiYgcGFyZW50V2FzUmVxdWVzdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUgPSB0aGlzLl9hZGRUaWxlKHBhcmVudElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0YWluW3BhcmVudElkLmtleV0gPSBwYXJlbnRJZDtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCB2YWx1ZXMsIHNpbmNlIHRoZXkncmUgdGhlIHBhcmVudCBvZiB0aGUgbmV4dCBpdGVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHBhcmVudCB0aWxlIGFzY2VudCBsb29wLlxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRXYXNSZXF1ZXN0ZWQgPSB0aWxlLndhc1JlcXVlc3RlZCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGlsZS5oYXNEYXRhKCkpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXRhaW47XG4gICAgfVxuXG4gICAgX3VwZGF0ZUxvYWRlZFBhcmVudFRpbGVDYWNoZSgpIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkUGFyZW50VGlsZXMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGVLZXkgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBbXTtcbiAgICAgICAgICAgIGxldCBwYXJlbnRUaWxlOiA/VGlsZTtcbiAgICAgICAgICAgIGxldCBjdXJyZW50SWQgPSB0aGlzLl90aWxlc1t0aWxlS2V5XS50aWxlSUQ7XG5cbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGNsb3Nlc3QgbG9hZGVkIGFuY2VzdG9yIGJ5IHRyYXZlcnNpbmcgdGhlIHRpbGUgdHJlZSB0b3dhcmRzIHRoZSByb290IGFuZFxuICAgICAgICAgICAgLy8gY2FjaGluZyByZXN1bHRzIGFsb25nIHRoZSB3YXlcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50SWQub3ZlcnNjYWxlZFogPiAwKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBEbyB3ZSBoYXZlIGEgY2FjaGVkIHJlc3VsdCBmcm9tIHByZXZpb3VzIHRyYXZlcnNhbHM/XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJZC5rZXkgaW4gdGhpcy5fbG9hZGVkUGFyZW50VGlsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50VGlsZSA9IHRoaXMuX2xvYWRlZFBhcmVudFRpbGVzW2N1cnJlbnRJZC5rZXldO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXRoLnB1c2goY3VycmVudElkLmtleSk7XG5cbiAgICAgICAgICAgICAgICAvLyBJcyB0aGUgcGFyZW50IGxvYWRlZD9cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJZCA9IGN1cnJlbnRJZC5zY2FsZWRUbyhjdXJyZW50SWQub3ZlcnNjYWxlZFogLSAxKTtcbiAgICAgICAgICAgICAgICBwYXJlbnRUaWxlID0gdGhpcy5fZ2V0TG9hZGVkVGlsZShwYXJlbnRJZCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VycmVudElkID0gcGFyZW50SWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHQgb2YgdGhpcyB0cmF2ZXJzYWwgdG8gYWxsIG5ld2x5IHZpc2l0ZWQgdGlsZXNcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHBhdGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkZWRQYXJlbnRUaWxlc1trZXldID0gcGFyZW50VGlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIHRpbGUsIGdpdmVuIGl0cyBjb29yZGluYXRlLCB0byB0aGUgcHlyYW1pZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRUaWxlKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6IFRpbGUge1xuICAgICAgICBsZXQgdGlsZSA9IHRoaXMuX3RpbGVzW3RpbGVJRC5rZXldO1xuICAgICAgICBpZiAodGlsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5wcmVwYXJlVGlsZSkgdGhpcy5fc291cmNlLnByZXBhcmVUaWxlKHRpbGUpO1xuICAgICAgICAgICAgcmV0dXJuIHRpbGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aWxlID0gdGhpcy5fY2FjaGUuZ2V0QW5kUmVtb3ZlKHRpbGVJRCk7XG4gICAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIodGlsZUlELmtleSwgdGlsZSk7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIHRpbGVJRCBiZWNhdXNlIHRoZSBjYWNoZWQgdGlsZSBjb3VsZCBoYXZlIGhhZCBhIGRpZmZlcmVudCB3cmFwIHZhbHVlXG4gICAgICAgICAgICB0aWxlLnRpbGVJRCA9IHRpbGVJRDtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlLmluaXRpYWxpemVUaWxlU3RhdGUodGlsZSwgdGhpcy5tYXAgPyB0aGlzLm1hcC5wYWludGVyIDogbnVsbCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVUaW1lcnNbdGlsZUlELmtleV0pIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fY2FjaGVUaW1lcnNbdGlsZUlELmtleV0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWNoZVRpbWVyc1t0aWxlSUQua2V5XTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRUaWxlUmVsb2FkVGltZXIodGlsZUlELmtleSwgdGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYWNoZWQgPSBCb29sZWFuKHRpbGUpO1xuICAgICAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgICAgICAgY29uc3QgcGFpbnRlciA9IHRoaXMubWFwID8gdGhpcy5tYXAucGFpbnRlciA6IG51bGw7XG4gICAgICAgICAgICB0aWxlID0gbmV3IFRpbGUodGlsZUlELCB0aGlzLl9zb3VyY2UudGlsZVNpemUgKiB0aWxlSUQub3ZlcnNjYWxlRmFjdG9yKCksIHRoaXMudHJhbnNmb3JtLnRpbGVab29tLCBwYWludGVyLCB0aGlzLl9pc1Jhc3Rlcik7XG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlLnByZXBhcmVUaWxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX3NvdXJjZS5wcmVwYXJlVGlsZSh0aWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHRoaXMuX2xvYWRUaWxlKHRpbGUsIHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLCB0aWxlLCB0aWxlSUQua2V5LCB0aWxlLnN0YXRlKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRUaWxlKHRpbGUsIHRoaXMuX3RpbGVMb2FkZWQuYmluZCh0aGlzLCB0aWxlLCB0aWxlSUQua2V5LCB0aWxlLnN0YXRlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbXBvc3NpYmxlLCBidXQgc2lsZW5jZSBmbG93LlxuICAgICAgICBpZiAoIXRpbGUpIHJldHVybiAobnVsbDogYW55KTtcblxuICAgICAgICB0aWxlLnVzZXMrKztcbiAgICAgICAgdGhpcy5fdGlsZXNbdGlsZUlELmtleV0gPSB0aWxlO1xuICAgICAgICBpZiAoIWNhY2hlZCkgdGhpcy5fc291cmNlLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHt0aWxlLCBjb29yZDogdGlsZS50aWxlSUQsIGRhdGFUeXBlOiAnc291cmNlJ30pKTtcblxuICAgICAgICByZXR1cm4gdGlsZTtcbiAgICB9XG5cbiAgICBfc2V0VGlsZVJlbG9hZFRpbWVyKGlkOiBudW1iZXIsIHRpbGU6IFRpbGUpIHtcbiAgICAgICAgaWYgKGlkIGluIHRoaXMuX3RpbWVycykge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyc1tpZF0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RpbWVyc1tpZF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHBpcnlUaW1lb3V0ID0gdGlsZS5nZXRFeHBpcnlUaW1lb3V0KCk7XG4gICAgICAgIGlmIChleHBpcnlUaW1lb3V0KSB7XG4gICAgICAgICAgICB0aGlzLl90aW1lcnNbaWRdID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkVGlsZShpZCwgJ2V4cGlyZWQnKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdGltZXJzW2lkXTtcbiAgICAgICAgICAgIH0sIGV4cGlyeVRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgdGlsZSwgZ2l2ZW4gaXRzIGlkLCBmcm9tIHRoZSBweXJhbWlkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcmVtb3ZlVGlsZShpZDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgIGlmICghdGlsZSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aWxlLnVzZXMtLTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3RpbGVzW2lkXTtcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVyc1tpZF0pIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcnNbaWRdKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90aW1lcnNbaWRdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbGUudXNlcyA+IDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKHRpbGUuaGFzRGF0YSgpICYmIHRpbGUuc3RhdGUgIT09ICdyZWxvYWRpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZS5hZGQodGlsZS50aWxlSUQsIHRpbGUsIHRpbGUuZ2V0RXhwaXJ5VGltZW91dCgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpbGUuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9hYm9ydFRpbGUodGlsZSk7XG4gICAgICAgICAgICB0aGlzLl91bmxvYWRUaWxlKHRpbGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFsbCB0aWxlcyBmcm9tIHRoaXMgcHlyYW1pZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNsZWFyVGlsZXMoKSB7XG4gICAgICAgIHRoaXMuX3Nob3VsZFJlbG9hZE9uUmVzdW1lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpXG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVUaWxlKCtpZCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5fY2xlYXIpIHRoaXMuX3NvdXJjZS5fY2xlYXIoKTtcblxuICAgICAgICB0aGlzLl9jYWNoZS5yZXNldCgpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcCAmJiB0aGlzLnVzZWRGb3JUZXJyYWluICYmIHRoaXMubWFwLnBhaW50ZXIudGVycmFpbikge1xuICAgICAgICAgICAgdGhpcy5tYXAucGFpbnRlci50ZXJyYWluLnJlc2V0VGlsZUxvb2t1cENhY2hlKHRoaXMuaWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VhcmNoIHRocm91Z2ggb3VyIGN1cnJlbnQgdGlsZXMgYW5kIGF0dGVtcHQgdG8gZmluZCB0aGUgdGlsZXMgdGhhdCBjb3ZlciB0aGUgZ2l2ZW4gYHF1ZXJ5R2VvbWV0cnlgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtRdWVyeUdlb21ldHJ5fSBxdWVyeUdlb21ldHJ5XG4gICAgICogQHBhcmFtIHtib29sZWFufSBbdmlzdWFsaXplUXVlcnlHZW9tZXRyeT1mYWxzZV1cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVzZTNEUXVlcnlcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGlsZXNJbihxdWVyeUdlb21ldHJ5OiBRdWVyeUdlb21ldHJ5LCB1c2UzRFF1ZXJ5OiBib29sZWFuLCB2aXN1YWxpemVRdWVyeUdlb21ldHJ5OiBib29sZWFuKTogVGlsZXNwYWNlUXVlcnlHZW9tZXRyeVtdIHtcbiAgICAgICAgY29uc3QgdGlsZVJlc3VsdHMgPSBbXTtcblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybTtcbiAgICAgICAgaWYgKCF0cmFuc2Zvcm0pIHJldHVybiB0aWxlUmVzdWx0cztcblxuICAgICAgICBjb25zdCBpc0dsb2JlID0gdHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJztcbiAgICAgICAgY29uc3QgY2VudGVyWCA9IG1lcmNhdG9yWGZyb21MbmcodHJhbnNmb3JtLmNlbnRlci5sbmcpO1xuXG4gICAgICAgIGZvciAoY29uc3QgdGlsZUlEIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbdGlsZUlEXTtcbiAgICAgICAgICAgIGlmICh2aXN1YWxpemVRdWVyeUdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgdGlsZS5jbGVhclF1ZXJ5RGVidWdWaXooKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aWxlLmhvbGRpbmdGb3JGYWRlKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaWxlcyBoZWxkIGZvciBmYWRpbmcgYXJlIGNvdmVyZWQgYnkgdGlsZXMgdGhhdCBhcmUgY2xvc2VyIHRvIGlkZWFsXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFuIGFycmF5IG9mIHdyYXAgdmFsdWVzIGZvciB0aGUgdGlsZSBbLTEsIDAsIDFdLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwIGJ1dCAtMSBvciAxIHdyYXBwaW5nXG4gICAgICAgICAgICAvLyBtaWdodCBiZSByZXF1aXJlZCBpbiBnbG9iZSB2aWV3IGR1ZSB0byBnbG9iZSdzIHN1cmZhY2UgYmVpbmcgY29udGludW91cy5cbiAgICAgICAgICAgIGxldCB0aWxlc1RvQ2hlY2s7XG5cbiAgICAgICAgICAgIGlmIChpc0dsb2JlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ29tcGFyZSBkaXN0YW5jZXMgdG8gY29waWVzIG9mIHRoZSB0aWxlIHRvIHNlZSBpZiBhIHdyYXBwZWQgb25lIHNob3VsZCBiZSB1c2VkLlxuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gdGlsZS50aWxlSUQuY2Fub25pY2FsO1xuICAgICAgICAgICAgICAgIGFzc2VydCh0aWxlLnRpbGVJRC53cmFwID09PSAwKTtcblxuICAgICAgICAgICAgICAgIGlmIChpZC56ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbmRlciB0aGUgem9vbSBsZXZlbCAwIHRpbGUgdHdpY2UgYXMgdGhlIHF1ZXJ5IHBvbHlnb24gbWlnaHQgc3BhbiBvdmVyIHRoZSBhbnRpbWVyaWRpYW5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzdGFuY2VzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoY2xhbXAoY2VudGVyWCwgLi4udGlsZUJvdW5kc1goaWQsIC0xKSkgLSBjZW50ZXJYKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguYWJzKGNsYW1wKGNlbnRlclgsIC4uLnRpbGVCb3VuZHNYKGlkLCAxKSkgLSBjZW50ZXJYKVxuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIHRpbGVzVG9DaGVjayA9IFswLCBkaXN0YW5jZXMuaW5kZXhPZihNYXRoLm1pbiguLi5kaXN0YW5jZXMpKSAqIDIgLSAxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXN0YW5jZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhjbGFtcChjZW50ZXJYLCAuLi50aWxlQm91bmRzWChpZCwgLTEpKSAtIGNlbnRlclgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoY2xhbXAoY2VudGVyWCwgLi4udGlsZUJvdW5kc1goaWQsIDApKSAtIGNlbnRlclgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoY2xhbXAoY2VudGVyWCwgLi4udGlsZUJvdW5kc1goaWQsIDEpKSAtIGNlbnRlclgpXG4gICAgICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAgICAgdGlsZXNUb0NoZWNrID0gW2Rpc3RhbmNlcy5pbmRleE9mKE1hdGgubWluKC4uLmRpc3RhbmNlcykpIC0gMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aWxlc1RvQ2hlY2sgPSBbMF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgd3JhcCBvZiB0aWxlc1RvQ2hlY2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlUmVzdWx0ID0gcXVlcnlHZW9tZXRyeS5jb250YWluc1RpbGUodGlsZSwgdHJhbnNmb3JtLCB1c2UzRFF1ZXJ5LCB3cmFwKTtcbiAgICAgICAgICAgICAgICBpZiAodGlsZVJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICB0aWxlUmVzdWx0cy5wdXNoKHRpbGVSZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGlsZVJlc3VsdHM7XG4gICAgfVxuXG4gICAgZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKHN5bWJvbExheWVyPzogYm9vbGVhbik6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+IHtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5nZXRSZW5kZXJhYmxlSWRzKHN5bWJvbExheWVyKS5tYXAoKGlkKSA9PiB0aGlzLl90aWxlc1tpZF0udGlsZUlEKTtcbiAgICAgICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgICAgIGNvb3JkLnByb2pNYXRyaXggPSB0aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGVQcm9qTWF0cml4KGNvb3JkLnRvVW53cmFwcGVkKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb29yZHM7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5oYXNUcmFuc2l0aW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzUmFzdGVyVHlwZSh0aGlzLl9zb3VyY2UudHlwZSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICAgICAgICAgIGlmICh0aWxlLmZhZGVFbmRUaW1lICE9PSB1bmRlZmluZWQgJiYgdGlsZS5mYWRlRW5kVGltZSA+PSBicm93c2VyLm5vdygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGEgcGFydGljdWxhciBzdGF0ZSBmb3IgYSBmZWF0dXJlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXRGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXI/OiBzdHJpbmcsIGZlYXR1cmVJZDogbnVtYmVyIHwgc3RyaW5nLCBzdGF0ZTogT2JqZWN0KSB7XG4gICAgICAgIHNvdXJjZUxheWVyID0gc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJztcbiAgICAgICAgdGhpcy5fc3RhdGUudXBkYXRlU3RhdGUoc291cmNlTGF5ZXIsIGZlYXR1cmVJZCwgc3RhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyB0aGUgdmFsdWUgb2YgYSBwYXJ0aWN1bGFyIHN0YXRlIGtleSBmb3IgYSBmZWF0dXJlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZW1vdmVGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXI/OiBzdHJpbmcsIGZlYXR1cmVJZD86IG51bWJlciB8IHN0cmluZywga2V5Pzogc3RyaW5nKSB7XG4gICAgICAgIHNvdXJjZUxheWVyID0gc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJztcbiAgICAgICAgdGhpcy5fc3RhdGUucmVtb3ZlRmVhdHVyZVN0YXRlKHNvdXJjZUxheWVyLCBmZWF0dXJlSWQsIGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBlbnRpcmUgc3RhdGUgb2JqZWN0IGZvciBhIGZlYXR1cmVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldEZlYXR1cmVTdGF0ZShzb3VyY2VMYXllcj86IHN0cmluZywgZmVhdHVyZUlkOiBudW1iZXIgfCBzdHJpbmcpOiBGZWF0dXJlU3RhdGVzIHtcbiAgICAgICAgc291cmNlTGF5ZXIgPSBzb3VyY2VMYXllciB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUuZ2V0U3RhdGUoc291cmNlTGF5ZXIsIGZlYXR1cmVJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2V0IG9mIGtleXMgdGhhdCB0aGUgdGlsZSBkZXBlbmRzIG9uLiBUaGlzIGFsbG93cyB0aWxlcyB0b1xuICAgICAqIGJlIHJlbG9hZGVkIHdoZW4gdGhlaXIgZGVwZW5kZW5jaWVzIGNoYW5nZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNldERlcGVuZGVuY2llcyh0aWxlS2V5OiBudW1iZXIsIG5hbWVzcGFjZTogc3RyaW5nLCBkZXBlbmRlbmNpZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW3RpbGVLZXldO1xuICAgICAgICBpZiAodGlsZSkge1xuICAgICAgICAgICAgdGlsZS5zZXREZXBlbmRlbmNpZXMobmFtZXNwYWNlLCBkZXBlbmRlbmNpZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVsb2FkcyBhbGwgdGlsZXMgdGhhdCBkZXBlbmQgb24gdGhlIGdpdmVuIGtleXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZWxvYWRUaWxlc0ZvckRlcGVuZGVuY2llcyhuYW1lc3BhY2VzOiBBcnJheTxzdHJpbmc+LCBrZXlzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgICAgICBpZiAodGlsZS5oYXNEZXBlbmRlbmN5KG5hbWVzcGFjZXMsIGtleXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkVGlsZSgraWQsICdyZWxvYWRpbmcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWNoZS5maWx0ZXIodGlsZSA9PiAhdGlsZS5oYXNEZXBlbmRlbmN5KG5hbWVzcGFjZXMsIGtleXMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVsb2FkcyBhbGwgdGlsZXMgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZCBmb3Igb25lIG9yIGEgc2VyaWVzIG9mIHRyYW5zZm9ybWF0aW9uc1xuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGB0aGlzYCB8IFByb21pc2UuXG4gICAgICovXG4gICAgX3ByZWxvYWRUaWxlcyh0cmFuc2Zvcm06IFRyYW5zZm9ybSB8IEFycmF5PFRyYW5zZm9ybT4sIGNhbGxiYWNrOiBDYWxsYmFjazxhbnk+KSB7XG4gICAgICAgIGNvbnN0IGNvdmVyaW5nVGlsZXNJRHM6IE1hcDxudW1iZXIsIE92ZXJzY2FsZWRUaWxlSUQ+ID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1zID0gQXJyYXkuaXNBcnJheSh0cmFuc2Zvcm0pID8gdHJhbnNmb3JtIDogW3RyYW5zZm9ybV07XG5cbiAgICAgICAgY29uc3QgdGVycmFpbiA9IHRoaXMubWFwLnBhaW50ZXIudGVycmFpbjtcbiAgICAgICAgY29uc3QgdGlsZVNpemUgPSB0aGlzLnVzZWRGb3JUZXJyYWluICYmIHRlcnJhaW4gPyB0ZXJyYWluLmdldFNjYWxlZERlbVRpbGVTaXplKCkgOiB0aGlzLl9zb3VyY2UudGlsZVNpemU7XG5cbiAgICAgICAgZm9yIChjb25zdCB0ciBvZiB0cmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlSURzID0gdHIuY292ZXJpbmdUaWxlcyh7XG4gICAgICAgICAgICAgICAgdGlsZVNpemUsXG4gICAgICAgICAgICAgICAgbWluem9vbTogdGhpcy5fc291cmNlLm1pbnpvb20sXG4gICAgICAgICAgICAgICAgbWF4em9vbTogdGhpcy5fc291cmNlLm1heHpvb20sXG4gICAgICAgICAgICAgICAgcm91bmRab29tOiB0aGlzLl9zb3VyY2Uucm91bmRab29tICYmICF0aGlzLnVzZWRGb3JUZXJyYWluLFxuICAgICAgICAgICAgICAgIHJlcGFyc2VPdmVyc2NhbGVkOiB0aGlzLl9zb3VyY2UucmVwYXJzZU92ZXJzY2FsZWQsXG4gICAgICAgICAgICAgICAgaXNUZXJyYWluREVNOiB0aGlzLnVzZWRGb3JUZXJyYWluXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgdGlsZUlEcykge1xuICAgICAgICAgICAgICAgIGNvdmVyaW5nVGlsZXNJRHMuc2V0KHRpbGVJRC5rZXksIHRpbGVJRCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnVzZWRGb3JUZXJyYWluKSB7XG4gICAgICAgICAgICAgICAgdHIudXBkYXRlRWxldmF0aW9uKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbGVJRHMgPSBBcnJheS5mcm9tKGNvdmVyaW5nVGlsZXNJRHMudmFsdWVzKCkpO1xuXG4gICAgICAgIGFzeW5jQWxsKHRpbGVJRHMsICh0aWxlSUQsIGRvbmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSBuZXcgVGlsZSh0aWxlSUQsIHRoaXMuX3NvdXJjZS50aWxlU2l6ZSAqIHRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKSwgdGhpcy50cmFuc2Zvcm0udGlsZVpvb20sIHRoaXMubWFwLnBhaW50ZXIsIHRoaXMuX2lzUmFzdGVyKTtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRUaWxlKHRpbGUsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc291cmNlLnR5cGUgPT09ICdyYXN0ZXItZGVtJyAmJiB0aWxlLmRlbSkgdGhpcy5fYmFja2ZpbGxERU0odGlsZSk7XG4gICAgICAgICAgICAgICAgZG9uZShlcnIsIHRpbGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICB9XG59XG5cblNvdXJjZUNhY2hlLm1heE92ZXJ6b29taW5nID0gMTA7XG5Tb3VyY2VDYWNoZS5tYXhVbmRlcnpvb21pbmcgPSAzO1xuXG5mdW5jdGlvbiBjb21wYXJlVGlsZUlkKGE6IE92ZXJzY2FsZWRUaWxlSUQsIGI6IE92ZXJzY2FsZWRUaWxlSUQpOiBudW1iZXIge1xuICAgIC8vIERpZmZlcmVudCBjb3BpZXMgb2YgdGhlIHdvcmxkIGFyZSBzb3J0ZWQgYmFzZWQgb24gdGhlaXIgZGlzdGFuY2UgdG8gdGhlIGNlbnRlci5cbiAgICAvLyBXcmFwIHZhbHVlcyBhcmUgY29udmVydGVkIHRvIHVuc2lnbmVkIGRpc3RhbmNlcyBieSByZXNlcnZpbmcgb2RkIG51bWJlciBmb3IgY29waWVzXG4gICAgLy8gd2l0aCBuZWdhdGl2ZSB3cmFwIGFuZCBldmVuIG51bWJlcnMgZm9yIGNvcGllcyB3aXRoIHBvc2l0aXZlIHdyYXAuXG4gICAgY29uc3QgYVdyYXAgPSBNYXRoLmFicyhhLndyYXAgKiAyKSAtICsoYS53cmFwIDwgMCk7XG4gICAgY29uc3QgYldyYXAgPSBNYXRoLmFicyhiLndyYXAgKiAyKSAtICsoYi53cmFwIDwgMCk7XG4gICAgcmV0dXJuIGEub3ZlcnNjYWxlZFogLSBiLm92ZXJzY2FsZWRaIHx8IGJXcmFwIC0gYVdyYXAgfHwgYi5jYW5vbmljYWwueSAtIGEuY2Fub25pY2FsLnkgfHwgYi5jYW5vbmljYWwueCAtIGEuY2Fub25pY2FsLng7XG59XG5cbmZ1bmN0aW9uIGlzUmFzdGVyVHlwZSh0eXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdyYXN0ZXInIHx8IHR5cGUgPT09ICdpbWFnZScgfHwgdHlwZSA9PT0gJ3ZpZGVvJztcbn1cblxuZnVuY3Rpb24gdGlsZUJvdW5kc1goaWQ6IENhbm9uaWNhbFRpbGVJRCwgd3JhcDogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgY29uc3QgdGlsZXMgPSAxIDw8IGlkLno7XG4gICAgcmV0dXJuIFtpZC54IC8gdGlsZXMgKyB3cmFwLCAoaWQueCArIDEpIC8gdGlsZXMgKyB3cmFwXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgU291cmNlQ2FjaGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlLCB7bWVyY2F0b3JaZnJvbUFsdGl0dWRlfSBmcm9tICcuLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgREVNRGF0YSBmcm9tICcuLi9kYXRhL2RlbV9kYXRhLmpzJztcbmltcG9ydCBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlLmpzJztcbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlfSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQge3ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcblxuaW1wb3J0IHR5cGUgUHJvamVjdGlvbiBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9wcm9qZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUge1ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbi8qKlxuICogT3B0aW9ucyBjb21tb24gdG8ge0BsaW5rIE1hcCNxdWVyeVRlcnJhaW5FbGV2YXRpb259IGFuZCB7QGxpbmsgTWFwI3VucHJvamVjdDNkfSwgdXNlZCB0byBjb250cm9sIGhvdyBlbGV2YXRpb25cbiAqIGRhdGEgaXMgcmV0dXJuZWQuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gRWxldmF0aW9uUXVlcnlPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGV4YWdnZXJhdGVkIFdoZW4gc2V0IHRvIGB0cnVlYCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZWxldmF0aW9uIHdpdGggdGhlIHRlcnJhaW5zIGBleGFnZ2VyYXRpb25gIG9uIHRoZSBzdHlsZSBhbHJlYWR5IGFwcGxpZWQsXG4gKiB3aGVuYGZhbHNlYCBpdCByZXR1cm5zIHRoZSByYXcgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgZGF0YSB3aXRob3V0IHN0eWxpbmcgYXBwbGllZC5cbiAqL1xuZXhwb3J0IHR5cGUgRWxldmF0aW9uUXVlcnlPcHRpb25zID0ge1xuICAgIGV4YWdnZXJhdGVkOiBib29sZWFuXG59O1xuXG4vKipcbiAqIFByb3ZpZGVzIGFjY2VzcyB0byBlbGV2YXRpb24gZGF0YSBmcm9tIHJhc3Rlci1kZW0gc291cmNlIGNhY2hlLlxuICovXG5leHBvcnQgY2xhc3MgRWxldmF0aW9uIHtcblxuICAgIC8qKlxuICAgICAqIEhlbHBlciB0aGF0IGNoZWNrcyB3aGV0aGVyIERFTSBkYXRhIGlzIGF2YWlsYWJsZSBhdCBhIGdpdmVuIG1lcmNhdG9yIGNvb3JkaW5hdGUuXG4gICAgICogQHBhcmFtIHtNZXJjYXRvckNvb3JkaW5hdGV9IHBvaW50IE1lcmNhdG9yIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50IHRvIGNoZWNrIGFnYWluc3QuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGRhdGEgaXMgYXZhaWxhYmxlIGF0IGBwb2ludGAsIGFuZCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc0RhdGFBdmFpbGFibGVBdFBvaW50KHBvaW50OiBNZXJjYXRvckNvb3JkaW5hdGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLl9zb3VyY2UoKTtcbiAgICAgICAgaWYgKCFzb3VyY2VDYWNoZSB8fCBwb2ludC55IDwgMC4wIHx8IHBvaW50LnkgPiAxLjApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlOiBTb3VyY2VDYWNoZSA9IHNvdXJjZUNhY2hlO1xuICAgICAgICBjb25zdCB6ID0gY2FjaGUuZ2V0U291cmNlKCkubWF4em9vbTtcbiAgICAgICAgY29uc3QgdGlsZXMgPSAxIDw8IHo7XG4gICAgICAgIGNvbnN0IHdyYXAgPSBNYXRoLmZsb29yKHBvaW50LngpO1xuICAgICAgICBjb25zdCBweCA9IHBvaW50LnggLSB3cmFwO1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5mbG9vcihweCAqIHRpbGVzKTtcbiAgICAgICAgY29uc3QgeSA9IE1hdGguZmxvb3IocG9pbnQueSAqIHRpbGVzKTtcbiAgICAgICAgY29uc3QgZGVtVGlsZSA9IHRoaXMuZmluZERFTVRpbGVGb3IobmV3IE92ZXJzY2FsZWRUaWxlSUQoeiwgd3JhcCwgeiwgeCwgeSkpO1xuXG4gICAgICAgIHJldHVybiAhIShkZW1UaWxlICYmIGRlbVRpbGUuZGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgYXJvdW5kIGBnZXRBdFBvaW50YCB0aGF0IGd1YXJhbnRlZXMgdGhhdCBhIG51bWVyaWMgdmFsdWUgaXMgcmV0dXJuZWQuXG4gICAgICogQHBhcmFtIHtNZXJjYXRvckNvb3JkaW5hdGV9IHBvaW50IE1lcmNhdG9yIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWZhdWx0SWZOb3RMb2FkZWQgVmFsdWUgdGhhdCBpcyByZXR1cm5lZCBpZiB0aGUgZGVtIHRpbGUgb2YgdGhlIHByb3ZpZGVkIHBvaW50IGlzIG5vdCBsb2FkZWQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gQWx0aXR1ZGUgaW4gbWV0ZXJzLlxuICAgICAqL1xuICAgIGdldEF0UG9pbnRPclplcm8ocG9pbnQ6IE1lcmNhdG9yQ29vcmRpbmF0ZSwgZGVmYXVsdElmTm90TG9hZGVkOiBudW1iZXIgPSAwKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXRQb2ludChwb2ludCwgZGVmYXVsdElmTm90TG9hZGVkKSB8fCAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGl0dWRlIGFib3ZlIHNlYSBsZXZlbCBpbiBtZXRlcnMgYXQgc3BlY2lmaWVkIHBvaW50LlxuICAgICAqIEBwYXJhbSB7TWVyY2F0b3JDb29yZGluYXRlfSBwb2ludCBNZXJjYXRvciBjb29yZGluYXRlIG9mIHRoZSBwb2ludC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVmYXVsdElmTm90TG9hZGVkIFZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgaWYgdGhlIERFTSB0aWxlIG9mIHRoZSBwcm92aWRlZCBwb2ludCBpcyBub3QgbG9hZGVkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXhhZ2dlcmF0ZWQgYHRydWVgIGlmIHN0eWxpbmcgZXhhZ2dlcmF0aW9uIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSByZXN1bHRpbmcgZWxldmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEFsdGl0dWRlIGluIG1ldGVycy5cbiAgICAgKiBJZiB0aGVyZSBpcyBubyBsb2FkZWQgdGlsZSB0aGF0IGNhcnJpZXMgaW5mb3JtYXRpb24gZm9yIHRoZSByZXF1ZXN0ZWRcbiAgICAgKiBwb2ludCBlbGV2YXRpb24sIHJldHVybnMgYGRlZmF1bHRJZk5vdExvYWRlZGAuXG4gICAgICogRG9lc24ndCBpbnZva2UgbmV0d29yayByZXF1ZXN0IHRvIGZldGNoIHRoZSBkYXRhLlxuICAgICAqL1xuICAgIGdldEF0UG9pbnQocG9pbnQ6IE1lcmNhdG9yQ29vcmRpbmF0ZSwgZGVmYXVsdElmTm90TG9hZGVkOiA/bnVtYmVyLCBleGFnZ2VyYXRlZDogYm9vbGVhbiA9IHRydWUpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgLy8gRm9yY2UgYSBjYXN0IHRvIG51bGwgZm9yIGJvdGggbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICAgIGlmIChkZWZhdWx0SWZOb3RMb2FkZWQgPT0gbnVsbCkgZGVmYXVsdElmTm90TG9hZGVkID0gbnVsbDtcblxuICAgICAgICBjb25zdCBzcmMgPSB0aGlzLl9zb3VyY2UoKTtcbiAgICAgICAgaWYgKCFzcmMpIHJldHVybiBkZWZhdWx0SWZOb3RMb2FkZWQ7XG4gICAgICAgIGlmIChwb2ludC55IDwgMC4wIHx8IHBvaW50LnkgPiAxLjApIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0SWZOb3RMb2FkZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FjaGU6IFNvdXJjZUNhY2hlID0gc3JjO1xuICAgICAgICBjb25zdCB6ID0gY2FjaGUuZ2V0U291cmNlKCkubWF4em9vbTtcbiAgICAgICAgY29uc3QgdGlsZXMgPSAxIDw8IHo7XG4gICAgICAgIGNvbnN0IHdyYXAgPSBNYXRoLmZsb29yKHBvaW50LngpO1xuICAgICAgICBjb25zdCBweCA9IHBvaW50LnggLSB3cmFwO1xuICAgICAgICBjb25zdCB0aWxlSUQgPSBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh6LCB3cmFwLCB6LCBNYXRoLmZsb29yKHB4ICogdGlsZXMpLCBNYXRoLmZsb29yKHBvaW50LnkgKiB0aWxlcykpO1xuICAgICAgICBjb25zdCBkZW1UaWxlID0gdGhpcy5maW5kREVNVGlsZUZvcih0aWxlSUQpO1xuICAgICAgICBpZiAoIShkZW1UaWxlICYmIGRlbVRpbGUuZGVtKSkgeyByZXR1cm4gZGVmYXVsdElmTm90TG9hZGVkOyB9XG4gICAgICAgIGNvbnN0IGRlbTogREVNRGF0YSA9IGRlbVRpbGUuZGVtO1xuICAgICAgICBjb25zdCB0aWxlc0F0VGlsZVpvb20gPSAxIDw8IGRlbVRpbGUudGlsZUlELmNhbm9uaWNhbC56O1xuICAgICAgICBjb25zdCB4ID0gKHB4ICogdGlsZXNBdFRpbGVab29tIC0gZGVtVGlsZS50aWxlSUQuY2Fub25pY2FsLngpICogZGVtLmRpbTtcbiAgICAgICAgY29uc3QgeSA9IChwb2ludC55ICogdGlsZXNBdFRpbGVab29tIC0gZGVtVGlsZS50aWxlSUQuY2Fub25pY2FsLnkpICogZGVtLmRpbTtcbiAgICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IoeCk7XG4gICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKHkpO1xuICAgICAgICBjb25zdCBleGFnZ2VyYXRpb24gPSBleGFnZ2VyYXRlZCA/IHRoaXMuZXhhZ2dlcmF0aW9uKCkgOiAxO1xuXG4gICAgICAgIHJldHVybiBleGFnZ2VyYXRpb24gKiBpbnRlcnBvbGF0ZShcbiAgICAgICAgICAgIGludGVycG9sYXRlKGRlbS5nZXQoaSwgaiksIGRlbS5nZXQoaSwgaiArIDEpLCB5IC0gaiksXG4gICAgICAgICAgICBpbnRlcnBvbGF0ZShkZW0uZ2V0KGkgKyAxLCBqKSwgZGVtLmdldChpICsgMSwgaiArIDEpLCB5IC0gaiksXG4gICAgICAgICAgICB4IC0gaSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiB4IGFuZCB5IGFyZSBvZmZzZXQgd2l0aGluIHRpbGUsIGluIDAgLi4gRVhURU5UIGNvb3JkaW5hdGUgc3BhY2UuXG4gICAgICovXG4gICAgZ2V0QXRUaWxlT2Zmc2V0KHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aWxlc0F0VGlsZVpvb20gPSAxIDw8IHRpbGVJRC5jYW5vbmljYWwuejtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXRQb2ludE9yWmVybyhuZXcgTWVyY2F0b3JDb29yZGluYXRlKFxuICAgICAgICAgICAgdGlsZUlELndyYXAgKyAodGlsZUlELmNhbm9uaWNhbC54ICsgeCAvIEVYVEVOVCkgLyB0aWxlc0F0VGlsZVpvb20sXG4gICAgICAgICAgICAodGlsZUlELmNhbm9uaWNhbC55ICsgeSAvIEVYVEVOVCkgLyB0aWxlc0F0VGlsZVpvb20pKTtcbiAgICB9XG5cbiAgICBnZXRBdFRpbGVPZmZzZXRGdW5jKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgbGF0OiBudW1iZXIsIHdvcmxkU2l6ZTogbnVtYmVyLCBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uKTogRnVuY3Rpb24ge1xuICAgICAgICByZXR1cm4gKHAgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxldmF0aW9uID0gdGhpcy5nZXRBdFRpbGVPZmZzZXQodGlsZUlELCBwLngsIHAueSk7XG4gICAgICAgICAgICBjb25zdCB1cFZlY3RvciA9IHByb2plY3Rpb24udXBWZWN0b3IodGlsZUlELmNhbm9uaWNhbCwgcC54LCBwLnkpO1xuICAgICAgICAgICAgY29uc3QgdXBWZWN0b3JTY2FsZSA9IHByb2plY3Rpb24udXBWZWN0b3JTY2FsZSh0aWxlSUQuY2Fub25pY2FsLCBsYXQsIHdvcmxkU2l6ZSkubWV0ZXJzVG9UaWxlO1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBjYW4ndCB5ZXQgcmVzb2x2ZSB0dXBsZSB2cyBhcnJheSBpbmNvbXBhdGliaWxpdGllc1xuICAgICAgICAgICAgdmVjMy5zY2FsZSh1cFZlY3RvciwgdXBWZWN0b3IsIGVsZXZhdGlvbiAqIHVwVmVjdG9yU2NhbGUpO1xuICAgICAgICAgICAgcmV0dXJuIHVwVmVjdG9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEJhdGNoIGZldGNoIGZvciBtdWx0aXBsZSB0aWxlIHBvaW50czogcG9pbnRzIGhvbGRzIGlucHV0IGFuZCByZXR1cm4gdmFsdWU6XG4gICAgICogdmVjMydzIGl0ZW1zIG9uIGluZGV4IDAgYW5kIDEgZGVmaW5lIHggYW5kIHkgb2Zmc2V0IHdpdGhpbiB0aWxlLCBpbiBbMCAuLiBFWFRFTlRdXG4gICAgICogcmFuZ2UsIHJlc3BlY3RpdmVseS4gdmVjMyBpdGVtIGF0IGluZGV4IDIgaXMgb3V0cHV0IHZhbHVlLCBpbiBtZXRlcnMuXG4gICAgICogSWYgYSBERU0gdGlsZSB0aGF0IGNvdmVycyB0aWxlSUQgaXMgbG9hZGVkLCB0cnVlIGlzIHJldHVybmVkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAgICogTmVhcmVzdCBmaWx0ZXIgc2FtcGxpbmcgb24gZGVtIGRhdGEgaXMgZG9uZSAobm8gaW50ZXJwb2xhdGlvbikuXG4gICAgICovXG4gICAgZ2V0Rm9yVGlsZVBvaW50cyh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHBvaW50czogQXJyYXk8VmVjMz4sIGludGVycG9sYXRlZDogP2Jvb2xlYW4sIHVzZURlbVRpbGU6ID9UaWxlKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGhlbHBlciA9IERFTVNhbXBsZXIuY3JlYXRlKHRoaXMsIHRpbGVJRCwgdXNlRGVtVGlsZSk7XG4gICAgICAgIGlmICghaGVscGVyKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIHBvaW50cy5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgcFsyXSA9IHRoaXMuZXhhZ2dlcmF0aW9uKCkgKiBoZWxwZXIuZ2V0RWxldmF0aW9uQXQocFswXSwgcFsxXSwgaW50ZXJwb2xhdGVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBlbGV2YXRpb24gbWluaW11bSBhbmQgbWF4aW11bSBmb3IgdGlsZSBpZGVudGlmaWVkIGJ5IGB0aWxlSURgLlxuICAgICAqIEBwYXJhbSB7T3ZlcnNjYWxlZFRpbGVJRH0gdGlsZUlEIFRoZSBgdGlsZUlkYCBpcyBhIHN1YiB0aWxlIChvciBjb3ZlcnMgdGhlIHNhbWUgc3BhY2UpIG9mIHRoZSBERU0gdGlsZSB3ZSByZWFkIHRoZSBpbmZvcm1hdGlvbiBmcm9tLlxuICAgICAqIEByZXR1cm5zIHs/e21pbjogbnVtYmVyLCBtYXg6IG51bWJlcn19IFRoZSBtaW4gYW5kIG1heCBlbGV2YXRpb24uXG4gICAgICovXG4gICAgZ2V0TWluTWF4Rm9yVGlsZSh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpOiA/e21pbjogbnVtYmVyLCBtYXg6IG51bWJlcn0ge1xuICAgICAgICBjb25zdCBkZW1UaWxlID0gdGhpcy5maW5kREVNVGlsZUZvcih0aWxlSUQpO1xuICAgICAgICBpZiAoIShkZW1UaWxlICYmIGRlbVRpbGUuZGVtKSkgeyByZXR1cm4gbnVsbDsgfVxuICAgICAgICBjb25zdCBkZW06IERFTURhdGEgPSBkZW1UaWxlLmRlbTtcbiAgICAgICAgY29uc3QgdHJlZSA9IGRlbS50cmVlO1xuICAgICAgICBjb25zdCBkZW1UaWxlSUQgPSBkZW1UaWxlLnRpbGVJRDtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSAxIDw8IHRpbGVJRC5jYW5vbmljYWwueiAtIGRlbVRpbGVJRC5jYW5vbmljYWwuejtcbiAgICAgICAgbGV0IHhPZmZzZXQgPSB0aWxlSUQuY2Fub25pY2FsLnggLyBzY2FsZSAtIGRlbVRpbGVJRC5jYW5vbmljYWwueDtcbiAgICAgICAgbGV0IHlPZmZzZXQgPSB0aWxlSUQuY2Fub25pY2FsLnkgLyBzY2FsZSAtIGRlbVRpbGVJRC5jYW5vbmljYWwueTtcbiAgICAgICAgbGV0IGluZGV4ID0gMDsgLy8gU3RhcnQgZnJvbSBERU0gdHJlZSByb290LlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpbGVJRC5jYW5vbmljYWwueiAtIGRlbVRpbGVJRC5jYW5vbmljYWwuejsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHJlZS5sZWF2ZXNbaW5kZXhdKSBicmVhaztcbiAgICAgICAgICAgIHhPZmZzZXQgKj0gMjtcbiAgICAgICAgICAgIHlPZmZzZXQgKj0gMjtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkT2Zmc2V0ID0gMiAqIE1hdGguZmxvb3IoeU9mZnNldCkgKyBNYXRoLmZsb29yKHhPZmZzZXQpO1xuICAgICAgICAgICAgaW5kZXggPSB0cmVlLmNoaWxkT2Zmc2V0c1tpbmRleF0gKyBjaGlsZE9mZnNldDtcbiAgICAgICAgICAgIHhPZmZzZXQgPSB4T2Zmc2V0ICUgMTtcbiAgICAgICAgICAgIHlPZmZzZXQgPSB5T2Zmc2V0ICUgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge21pbjogdGhpcy5leGFnZ2VyYXRpb24oKSAqIHRyZWUubWluaW11bXNbaW5kZXhdLCBtYXg6IHRoaXMuZXhhZ2dlcmF0aW9uKCkgKiB0cmVlLm1heGltdW1zW2luZGV4XX07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGVsZXZhdGlvbiBtaW5pbXVtIGJlbG93IE1TTCBmb3IgdGhlIHZpc2libGUgdGlsZXMuIFRoaXMgZnVuY3Rpb24gYWNjb3VudHNcbiAgICAgKiBmb3IgdGVycmFpbiBleGFnZ2VyYXRpb24gYW5kIGlzIGNvbnNlcnZhdGl2ZSBiYXNlZCBvbiB0aGUgbWF4aW11bSBERU0gZXJyb3IsXG4gICAgICogZG8gbm90IGV4cGVjdCBhY2N1cmF0ZSB2YWx1ZXMgZnJvbSB0aGlzIGZ1bmN0aW9uLlxuICAgICAqIElmIG5vIG5lZ2F0aXZlIGVsZXZhdGlvbiBpcyB2aXNpYmxlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbWluIGVsZXZhdGlvbiBiZWxvdyBzZWEgbGV2ZWwgb2YgYWxsIHZpc2libGUgdGlsZXMuXG4gICAgICovXG4gICAgZ2V0TWluRWxldmF0aW9uQmVsb3dNU0woKTogbnVtYmVyIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQdXJlIHZpcnR1YWwgbWV0aG9kIGNhbGxlZC4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyByYXljYXN0IGFnYWluc3QgdmlzaWJsZSBERU0gdGlsZXMgb24gdGhlIHNjcmVlbiBhbmQgcmV0dXJucyB0aGUgZGlzdGFuY2UgdHJhdmVsbGVkIGFsb25nIHRoZSByYXkuXG4gICAgICogYHhgICYgYHlgIGNvbXBvbmVudHMgb2YgdGhlIHBvc2l0aW9uIGFyZSBleHBlY3RlZCB0byBiZSBpbiBub3JtYWxpemVkIG1lcmNhdG9yIGNvb3JkaW5hdGVzIFswLCAxXSBhbmQgeiBpbiBtZXRlcnMuXG4gICAgICogQHBhcmFtIHt2ZWMzfSBwb3NpdGlvbiBUaGUgcmF5IG9yaWdpbi5cbiAgICAgKiBAcGFyYW0ge3ZlYzN9IGRpciBUaGUgcmF5IGRpcmVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXhhZ2dlcmF0aW9uIFRoZSB0ZXJyYWluIGV4YWdnZXJhdGlvbi5cbiAgICAqL1xuICAgIHJheWNhc3QocG9zaXRpb246IFZlYzMsIGRpcjogVmVjMywgZXhhZ2dlcmF0aW9uOiBudW1iZXIpOiA/bnVtYmVyIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQdXJlIHZpcnR1YWwgbWV0aG9kIGNhbGxlZC4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHBvaW50IG9uIHNjcmVlbiwgcmV0dXJucyAzRCBNZXJjYXRvckNvb3JkaW5hdGUgb24gdGVycmFpbi5cbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgcmF5Y2FzdGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBzY3JlZW5Qb2ludCBTY3JlZW4gcG9pbnQgaW4gcGl4ZWxzIGluIHRvcC1sZWZ0IG9yaWdpbiBjb29yZGluYXRlIHN5c3RlbS5cbiAgICAgKiBAcmV0dXJucyB7dmVjM30gSWYgdGhlcmUgaXMgaW50ZXJzZWN0aW9uIHdpdGggdGVycmFpbiwgcmV0dXJucyAzRCBNZXJjYXRvckNvb3JkaW5hdGUncyBvZlxuICAgICAqIGludGVyc2VjdGlvbiwgYXMgdmVjMyh4LCB5LCB6KSwgb3RoZXJ3aXNlIG51bGwuXG4gICAgICovIC8qIGVzbGludCBuby11bnVzZWQtdmFyczogW1wiZXJyb3JcIiwgeyBcImFyZ3NcIjogXCJub25lXCIgfV0gKi9cbiAgICBwb2ludENvb3JkaW5hdGUoc2NyZWVuUG9pbnQ6IFBvaW50KTogP1ZlYzMge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1B1cmUgdmlydHVhbCBtZXRob2QgY2FsbGVkLicpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogSW1wbGVtZW50YXRpb24gcHJvdmlkZXMgU291cmNlQ2FjaGUgb2YgcmFzdGVyLWRlbSBzb3VyY2UgdHlwZSBjYWNoZSwgaW5cbiAgICAgKiBvcmRlciB0byBhY2Nlc3MgYWxyZWFkeSBsb2FkZWQgY2FjaGVkIHRpbGVzLlxuICAgICAqL1xuICAgIF9zb3VyY2UoKTogP1NvdXJjZUNhY2hlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQdXJlIHZpcnR1YWwgbWV0aG9kIGNhbGxlZC4nKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgbXVsdGlwbGllciBkZWZpbmVkIGJ5IHN0eWxlIGFzIHRlcnJhaW4gZXhhZ2dlcmF0aW9uLiBFbGV2YXRpb24gcHJvdmlkZWRcbiAgICAgKiBieSBnZXRYWFhYIG1ldGhvZHMgaXMgbXVsdGlwbGllZCBieSB0aGlzLlxuICAgICAqL1xuICAgIGV4YWdnZXJhdGlvbigpOiBudW1iZXIge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1B1cmUgdmlydHVhbCBtZXRob2QgY2FsbGVkLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvb2t1cCBERU0gdGlsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIChjb3ZlcnMpIHRpbGVJRC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGZpbmRERU1UaWxlRm9yKF86IE92ZXJzY2FsZWRUaWxlSUQpOiA/VGlsZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUHVyZSB2aXJ0dWFsIG1ldGhvZCBjYWxsZWQuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGxpc3Qgb2YgREVNIHRpbGVzIHVzZWQgdG8gcmVuZGVyIGN1cnJlbnQgZnJhbWUuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQgdmlzaWJsZURlbVRpbGVzKCk6IEFycmF5PFRpbGU+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZXR0ZXIgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcy4nKTtcbiAgICB9XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGNvbXB1dGVzIGFuZCBjYWNoZXMgZGF0YSByZXF1aXJlZCB0byBsb29rdXAgZWxldmF0aW9uIG9mZnNldHMgYXQgdGhlIHRpbGUgbGV2ZWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBERU1TYW1wbGVyIHtcbiAgICBfZGVtVGlsZTogVGlsZTtcbiAgICBfZGVtOiBERU1EYXRhO1xuICAgIF9zY2FsZTogbnVtYmVyO1xuICAgIF9vZmZzZXQ6IFtudW1iZXIsIG51bWJlcl07XG5cbiAgICBjb25zdHJ1Y3RvcihkZW1UaWxlOiBUaWxlLCBzY2FsZTogbnVtYmVyLCBvZmZzZXQ6IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICAgICAgdGhpcy5fZGVtVGlsZSA9IGRlbVRpbGU7XG4gICAgICAgIC8vIGRlbVRpbGUuZGVtIHdpbGwgYWx3YXlzIGV4aXN0IGJlY2F1c2UgdGhlIGZhY3RvcnkgbWV0aG9kIGBjcmVhdGVgIGRvZXMgdGhlIGNoZWNrXG4gICAgICAgIC8vIE1ha2UgZmxvdyBoYXBweSB3aXRoIGEgY2FzdCB0aHJvdWdoIGFueVxuICAgICAgICB0aGlzLl9kZW0gPSAoKCh0aGlzLl9kZW1UaWxlLmRlbSk6IGFueSk6IERFTURhdGEpO1xuICAgICAgICB0aGlzLl9zY2FsZSA9IHNjYWxlO1xuICAgICAgICB0aGlzLl9vZmZzZXQgPSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShlbGV2YXRpb246IEVsZXZhdGlvbiwgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB1c2VEZW1UaWxlOiA/VGlsZSk6ID9ERU1TYW1wbGVyIHtcbiAgICAgICAgY29uc3QgZGVtVGlsZSA9IHVzZURlbVRpbGUgfHwgZWxldmF0aW9uLmZpbmRERU1UaWxlRm9yKHRpbGVJRCk7XG4gICAgICAgIGlmICghKGRlbVRpbGUgJiYgZGVtVGlsZS5kZW0pKSB7IHJldHVybjsgfVxuICAgICAgICBjb25zdCBkZW06IERFTURhdGEgPSBkZW1UaWxlLmRlbTtcbiAgICAgICAgY29uc3QgZGVtVGlsZUlEID0gZGVtVGlsZS50aWxlSUQ7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gMSA8PCB0aWxlSUQuY2Fub25pY2FsLnogLSBkZW1UaWxlSUQuY2Fub25pY2FsLno7XG4gICAgICAgIGNvbnN0IHhPZmZzZXQgPSAodGlsZUlELmNhbm9uaWNhbC54IC8gc2NhbGUgLSBkZW1UaWxlSUQuY2Fub25pY2FsLngpICogZGVtLmRpbTtcbiAgICAgICAgY29uc3QgeU9mZnNldCA9ICh0aWxlSUQuY2Fub25pY2FsLnkgLyBzY2FsZSAtIGRlbVRpbGVJRC5jYW5vbmljYWwueSkgKiBkZW0uZGltO1xuICAgICAgICBjb25zdCBrID0gZGVtVGlsZS50aWxlU2l6ZSAvIEVYVEVOVCAvIHNjYWxlO1xuXG4gICAgICAgIHJldHVybiBuZXcgREVNU2FtcGxlcihkZW1UaWxlLCBrLCBbeE9mZnNldCwgeU9mZnNldF0pO1xuICAgIH1cblxuICAgIHRpbGVDb29yZFRvUGl4ZWwoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQb2ludCB7XG4gICAgICAgIGNvbnN0IHB4ID0geCAqIHRoaXMuX3NjYWxlICsgdGhpcy5fb2Zmc2V0WzBdO1xuICAgICAgICBjb25zdCBweSA9IHkgKiB0aGlzLl9zY2FsZSArIHRoaXMuX29mZnNldFsxXTtcbiAgICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IocHgpO1xuICAgICAgICBjb25zdCBqID0gTWF0aC5mbG9vcihweSk7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoaSwgaik7XG4gICAgfVxuXG4gICAgZ2V0RWxldmF0aW9uQXQoeDogbnVtYmVyLCB5OiBudW1iZXIsIGludGVycG9sYXRlZDogP2Jvb2xlYW4sIGNsYW1wVG9FZGdlOiA/Ym9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHB4ID0geCAqIHRoaXMuX3NjYWxlICsgdGhpcy5fb2Zmc2V0WzBdO1xuICAgICAgICBjb25zdCBweSA9IHkgKiB0aGlzLl9zY2FsZSArIHRoaXMuX29mZnNldFsxXTtcbiAgICAgICAgY29uc3QgaSA9IE1hdGguZmxvb3IocHgpO1xuICAgICAgICBjb25zdCBqID0gTWF0aC5mbG9vcihweSk7XG4gICAgICAgIGNvbnN0IGRlbSA9IHRoaXMuX2RlbTtcblxuICAgICAgICBjbGFtcFRvRWRnZSA9ICEhY2xhbXBUb0VkZ2U7XG5cbiAgICAgICAgcmV0dXJuIGludGVycG9sYXRlZCA/IGludGVycG9sYXRlKFxuICAgICAgICAgICAgaW50ZXJwb2xhdGUoZGVtLmdldChpLCBqLCBjbGFtcFRvRWRnZSksIGRlbS5nZXQoaSwgaiArIDEsIGNsYW1wVG9FZGdlKSwgcHkgLSBqKSxcbiAgICAgICAgICAgIGludGVycG9sYXRlKGRlbS5nZXQoaSArIDEsIGosIGNsYW1wVG9FZGdlKSwgZGVtLmdldChpICsgMSwgaiArIDEsIGNsYW1wVG9FZGdlKSwgcHkgLSBqKSxcbiAgICAgICAgICAgIHB4IC0gaSkgOlxuICAgICAgICAgICAgZGVtLmdldChpLCBqLCBjbGFtcFRvRWRnZSk7XG4gICAgfVxuXG4gICAgZ2V0RWxldmF0aW9uQXRQaXhlbCh4OiBudW1iZXIsIHk6IG51bWJlciwgY2xhbXBUb0VkZ2U6ID9ib29sZWFuKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlbS5nZXQoeCwgeSwgISFjbGFtcFRvRWRnZSk7XG4gICAgfVxuXG4gICAgZ2V0TWV0ZXJUb0RFTShsYXQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoMSA8PCB0aGlzLl9kZW1UaWxlLnRpbGVJRC5jYW5vbmljYWwueikgKiBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgbGF0KSAqIHRoaXMuX2RlbS5zdHJpZGU7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgbG9hZEdlb21ldHJ5IGZyb20gJy4vbG9hZF9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgdG9FdmFsdWF0aW9uRmVhdHVyZSBmcm9tICcuL2V2YWx1YXRpb25fZmVhdHVyZS5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4vZXh0ZW50LmpzJztcbmltcG9ydCBmZWF0dXJlRmlsdGVyIGZyb20gJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXIvaW5kZXguanMnO1xuaW1wb3J0IEdyaWQgZnJvbSAnZ3JpZC1pbmRleCc7XG5pbXBvcnQgRGljdGlvbmFyeUNvZGVyIGZyb20gJy4uL3V0aWwvZGljdGlvbmFyeV9jb2Rlci5qcyc7XG5pbXBvcnQgdnQgZnJvbSAnQG1hcGJveC92ZWN0b3ItdGlsZSc7XG5pbXBvcnQgUHJvdG9idWYgZnJvbSAncGJmJztcbmltcG9ydCBHZW9KU09ORmVhdHVyZSBmcm9tICcuLi91dGlsL3ZlY3RvcnRpbGVfdG9fZ2VvanNvbi5qcyc7XG5pbXBvcnQge2FycmF5c0ludGVyc2VjdCwgbWFwT2JqZWN0LCBleHRlbmR9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB7cmVnaXN0ZXJ9IGZyb20gJy4uL3V0aWwvd2ViX3dvcmtlcl90cmFuc2Zlci5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCBTb3VyY2VGZWF0dXJlU3RhdGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9zdGF0ZS5qcyc7XG5pbXBvcnQge3BvbHlnb25JbnRlcnNlY3RzQm94fSBmcm9tICcuLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cy5qcyc7XG5pbXBvcnQge1Bvc3NpYmx5RXZhbHVhdGVkfSBmcm9tICcuLi9zdHlsZS9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB7RmVhdHVyZUluZGV4QXJyYXl9IGZyb20gJy4vYXJyYXlfdHlwZXMuanMnO1xuaW1wb3J0IHtERU1TYW1wbGVyfSBmcm9tICcuLi90ZXJyYWluL2VsZXZhdGlvbi5qcyc7XG5cbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUge1F1ZXJ5RmVhdHVyZX0gZnJvbSAnLi4vdXRpbC92ZWN0b3J0aWxlX3RvX2dlb2pzb24uanMnO1xuaW1wb3J0IHR5cGUge0ZlYXR1cmVGaWx0ZXJ9IGZyb20gJy4uL3N0eWxlLXNwZWMvZmVhdHVyZV9maWx0ZXIvaW5kZXguanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUge0ZpbHRlclNwZWNpZmljYXRpb24sIFByb21vdGVJZFNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1RpbGVzcGFjZVF1ZXJ5R2VvbWV0cnl9IGZyb20gJy4uL3N0eWxlL3F1ZXJ5X2dlb21ldHJ5LmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlSW5kZXggYXMgRmVhdHVyZUluZGV4U3RydWN0fSBmcm9tICcuL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtUaWxlVHJhbnNmb3JtfSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi90aWxlX3RyYW5zZm9ybS5qcyc7XG5cbnR5cGUgUXVlcnlQYXJhbWV0ZXJzID0ge1xuICAgIHBpeGVsUG9zTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgdGlsZVJlc3VsdDogVGlsZXNwYWNlUXVlcnlHZW9tZXRyeSxcbiAgICB0aWxlVHJhbnNmb3JtOiBUaWxlVHJhbnNmb3JtLFxuICAgIHBhcmFtczoge1xuICAgICAgICBmaWx0ZXI6IEZpbHRlclNwZWNpZmljYXRpb24sXG4gICAgICAgIGxheWVyczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBRdWVyeVJlc3VsdCA9IHtbXzogc3RyaW5nXTogQXJyYXk8eyBmZWF0dXJlSW5kZXg6IG51bWJlciwgZmVhdHVyZTogUXVlcnlGZWF0dXJlIH0+fTtcblxudHlwZSBGZWF0dXJlSW5kaWNlcyA9IHtcbiAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICBmZWF0dXJlSW5kZXg6IG51bWJlcixcbiAgICBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldDogbnVtYmVyXG59IHwgRmVhdHVyZUluZGV4U3RydWN0O1xuXG5jbGFzcyBGZWF0dXJlSW5kZXgge1xuICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRDtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHo6IG51bWJlcjtcbiAgICBncmlkOiBHcmlkO1xuICAgIGZlYXR1cmVJbmRleEFycmF5OiBGZWF0dXJlSW5kZXhBcnJheTtcbiAgICBwcm9tb3RlSWQ6ID9Qcm9tb3RlSWRTcGVjaWZpY2F0aW9uO1xuXG4gICAgcmF3VGlsZURhdGE6IEFycmF5QnVmZmVyO1xuICAgIGJ1Y2tldExheWVySURzOiBBcnJheTxBcnJheTxzdHJpbmc+PjtcblxuICAgIHZ0TGF5ZXJzOiB7W186IHN0cmluZ106IFZlY3RvclRpbGVMYXllcn07XG4gICAgdnRGZWF0dXJlczoge1tfOiBzdHJpbmddOiBWZWN0b3JUaWxlRmVhdHVyZVtdfTtcbiAgICBzb3VyY2VMYXllckNvZGVyOiBEaWN0aW9uYXJ5Q29kZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHByb21vdGVJZD86ID9Qcm9tb3RlSWRTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIHRoaXMudGlsZUlEID0gdGlsZUlEO1xuICAgICAgICB0aGlzLnggPSB0aWxlSUQuY2Fub25pY2FsLng7XG4gICAgICAgIHRoaXMueSA9IHRpbGVJRC5jYW5vbmljYWwueTtcbiAgICAgICAgdGhpcy56ID0gdGlsZUlELmNhbm9uaWNhbC56O1xuICAgICAgICB0aGlzLmdyaWQgPSBuZXcgR3JpZChFWFRFTlQsIDE2LCAwKTtcbiAgICAgICAgdGhpcy5mZWF0dXJlSW5kZXhBcnJheSA9IG5ldyBGZWF0dXJlSW5kZXhBcnJheSgpO1xuICAgICAgICB0aGlzLnByb21vdGVJZCA9IHByb21vdGVJZDtcbiAgICB9XG5cbiAgICBpbnNlcnQoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIGdlb21ldHJ5OiBBcnJheTxBcnJheTxQb2ludD4+LCBmZWF0dXJlSW5kZXg6IG51bWJlciwgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyLCBidWNrZXRJbmRleDogbnVtYmVyLCBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldDogbnVtYmVyID0gMCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmZlYXR1cmVJbmRleEFycmF5Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5mZWF0dXJlSW5kZXhBcnJheS5lbXBsYWNlQmFjayhmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldCk7XG5cbiAgICAgICAgY29uc3QgZ3JpZCA9IHRoaXMuZ3JpZDtcblxuICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IGdlb21ldHJ5Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBjb25zdCByaW5nID0gZ2VvbWV0cnlbcl07XG5cbiAgICAgICAgICAgIGNvbnN0IGJib3ggPSBbSW5maW5pdHksIEluZmluaXR5LCAtSW5maW5pdHksIC1JbmZpbml0eV07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gcmluZ1tpXTtcbiAgICAgICAgICAgICAgICBiYm94WzBdID0gTWF0aC5taW4oYmJveFswXSwgcC54KTtcbiAgICAgICAgICAgICAgICBiYm94WzFdID0gTWF0aC5taW4oYmJveFsxXSwgcC55KTtcbiAgICAgICAgICAgICAgICBiYm94WzJdID0gTWF0aC5tYXgoYmJveFsyXSwgcC54KTtcbiAgICAgICAgICAgICAgICBiYm94WzNdID0gTWF0aC5tYXgoYmJveFszXSwgcC55KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGJib3hbMF0gPCBFWFRFTlQgJiZcbiAgICAgICAgICAgICAgICBiYm94WzFdIDwgRVhURU5UICYmXG4gICAgICAgICAgICAgICAgYmJveFsyXSA+PSAwICYmXG4gICAgICAgICAgICAgICAgYmJveFszXSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZ3JpZC5pbnNlcnQoa2V5LCBiYm94WzBdLCBiYm94WzFdLCBiYm94WzJdLCBiYm94WzNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRWVExheWVycygpOiB7W186IHN0cmluZ106IFZlY3RvclRpbGVMYXllcn0ge1xuICAgICAgICBpZiAoIXRoaXMudnRMYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMudnRMYXllcnMgPSBuZXcgdnQuVmVjdG9yVGlsZShuZXcgUHJvdG9idWYodGhpcy5yYXdUaWxlRGF0YSkpLmxheWVycztcbiAgICAgICAgICAgIHRoaXMuc291cmNlTGF5ZXJDb2RlciA9IG5ldyBEaWN0aW9uYXJ5Q29kZXIodGhpcy52dExheWVycyA/IE9iamVjdC5rZXlzKHRoaXMudnRMYXllcnMpLnNvcnQoKSA6IFsnX2dlb2pzb25UaWxlTGF5ZXInXSk7XG4gICAgICAgICAgICB0aGlzLnZ0RmVhdHVyZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXIgaW4gdGhpcy52dExheWVycykge1xuICAgICAgICAgICAgICAgIHRoaXMudnRGZWF0dXJlc1tsYXllcl0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52dExheWVycztcbiAgICB9XG5cbiAgICAvLyBGaW5kcyBub24tc3ltYm9sIGZlYXR1cmVzIGluIHRoaXMgdGlsZSBhdCBhIHBhcnRpY3VsYXIgcG9zaXRpb24uXG4gICAgcXVlcnkoYXJnczogUXVlcnlQYXJhbWV0ZXJzLCBzdHlsZUxheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfSwgc2VyaWFsaXplZExheWVyczoge1tfOiBzdHJpbmddOiBPYmplY3R9LCBzb3VyY2VGZWF0dXJlU3RhdGU6IFNvdXJjZUZlYXR1cmVTdGF0ZSk6IFF1ZXJ5UmVzdWx0IHtcbiAgICAgICAgdGhpcy5sb2FkVlRMYXllcnMoKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gYXJncy5wYXJhbXMgfHwge30sXG4gICAgICAgICAgICBmaWx0ZXIgPSBmZWF0dXJlRmlsdGVyKHBhcmFtcy5maWx0ZXIpO1xuICAgICAgICBjb25zdCB0aWxlc3BhY2VHZW9tZXRyeSA9IGFyZ3MudGlsZVJlc3VsdDtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gYXJncy50cmFuc2Zvcm07XG5cbiAgICAgICAgY29uc3QgYm91bmRzID0gdGlsZXNwYWNlR2VvbWV0cnkuYnVmZmVyZWRUaWxlc3BhY2VCb3VuZHM7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UHJlZGljYXRlID0gKGJ4MSwgYnkxLCBieDIsIGJ5MikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHBvbHlnb25JbnRlcnNlY3RzQm94KHRpbGVzcGFjZUdlb21ldHJ5LmJ1ZmZlcmVkVGlsZXNwYWNlR2VvbWV0cnksIGJ4MSwgYnkxLCBieDIsIGJ5Mik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nID0gdGhpcy5ncmlkLnF1ZXJ5KGJvdW5kcy5taW4ueCwgYm91bmRzLm1pbi55LCBib3VuZHMubWF4LngsIGJvdW5kcy5tYXgueSwgcXVlcnlQcmVkaWNhdGUpO1xuICAgICAgICBtYXRjaGluZy5zb3J0KHRvcERvd25GZWF0dXJlQ29tcGFyYXRvcik7XG5cbiAgICAgICAgbGV0IGVsZXZhdGlvbkhlbHBlciA9IG51bGw7XG4gICAgICAgIGlmICh0cmFuc2Zvcm0uZWxldmF0aW9uICYmIG1hdGNoaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGVsZXZhdGlvbkhlbHBlciA9IERFTVNhbXBsZXIuY3JlYXRlKHRyYW5zZm9ybS5lbGV2YXRpb24sIHRoaXMudGlsZUlEKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBsZXQgcHJldmlvdXNJbmRleDtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYXRjaGluZy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBtYXRjaGluZ1trXTtcblxuICAgICAgICAgICAgLy8gZG9uJ3QgY2hlY2sgdGhlIHNhbWUgZmVhdHVyZSBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBwcmV2aW91c0luZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIHByZXZpb3VzSW5kZXggPSBpbmRleDtcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmZlYXR1cmVJbmRleEFycmF5LmdldChpbmRleCk7XG4gICAgICAgICAgICBsZXQgZmVhdHVyZUdlb21ldHJ5ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMubG9hZE1hdGNoaW5nRmVhdHVyZShcbiAgICAgICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICAgICAgbWF0Y2gsXG4gICAgICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgICAgIHBhcmFtcy5sYXllcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zLmF2YWlsYWJsZUltYWdlcyxcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVycyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHNvdXJjZUZlYXR1cmVTdGF0ZSxcbiAgICAgICAgICAgICAgICAoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIHN0eWxlTGF5ZXI6IFN0eWxlTGF5ZXIsIGZlYXR1cmVTdGF0ZTogT2JqZWN0LCBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldDogbnVtYmVyID0gMCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZlYXR1cmVHZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUsIHRoaXMudGlsZUlELmNhbm9uaWNhbCwgYXJncy50aWxlVHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZUxheWVyLnF1ZXJ5SW50ZXJzZWN0c0ZlYXR1cmUodGlsZXNwYWNlR2VvbWV0cnksIGZlYXR1cmUsIGZlYXR1cmVTdGF0ZSwgZmVhdHVyZUdlb21ldHJ5LCB0aGlzLnosIGFyZ3MudHJhbnNmb3JtLCBhcmdzLnBpeGVsUG9zTWF0cml4LCBlbGV2YXRpb25IZWxwZXIsIGxheW91dFZlcnRleEFycmF5T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBsb2FkTWF0Y2hpbmdGZWF0dXJlKFxuICAgICAgICByZXN1bHQ6IFF1ZXJ5UmVzdWx0LFxuICAgICAgICBmZWF0dXJlSW5kZXhEYXRhOiBGZWF0dXJlSW5kaWNlcyxcbiAgICAgICAgZmlsdGVyOiBGZWF0dXJlRmlsdGVyLFxuICAgICAgICBmaWx0ZXJMYXllcklEczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICBzdHlsZUxheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfSxcbiAgICAgICAgc2VyaWFsaXplZExheWVyczoge1tfOiBzdHJpbmddOiBPYmplY3R9LFxuICAgICAgICBzb3VyY2VGZWF0dXJlU3RhdGU/OiBTb3VyY2VGZWF0dXJlU3RhdGUsXG4gICAgICAgIGludGVyc2VjdGlvblRlc3Q/OiAoZmVhdHVyZTogVmVjdG9yVGlsZUZlYXR1cmUsIHN0eWxlTGF5ZXI6IFN0eWxlTGF5ZXIsIGZlYXR1cmVTdGF0ZTogT2JqZWN0LCBsYXlvdXRWZXJ0ZXhBcnJheU9mZnNldDogbnVtYmVyKSA9PiBib29sZWFuIHwgbnVtYmVyKSB7XG5cbiAgICAgICAgY29uc3Qge2ZlYXR1cmVJbmRleCwgYnVja2V0SW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGxheW91dFZlcnRleEFycmF5T2Zmc2V0fSA9IGZlYXR1cmVJbmRleERhdGE7XG4gICAgICAgIGNvbnN0IGxheWVySURzID0gdGhpcy5idWNrZXRMYXllcklEc1tidWNrZXRJbmRleF07XG4gICAgICAgIGlmIChmaWx0ZXJMYXllcklEcyAmJiAhYXJyYXlzSW50ZXJzZWN0KGZpbHRlckxheWVySURzLCBsYXllcklEcykpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJOYW1lID0gdGhpcy5zb3VyY2VMYXllckNvZGVyLmRlY29kZShzb3VyY2VMYXllckluZGV4KTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB0aGlzLnZ0TGF5ZXJzW3NvdXJjZUxheWVyTmFtZV07XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBzb3VyY2VMYXllci5mZWF0dXJlKGZlYXR1cmVJbmRleCk7XG5cbiAgICAgICAgaWYgKGZpbHRlci5uZWVkR2VvbWV0cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2YWx1YXRpb25GZWF0dXJlID0gdG9FdmFsdWF0aW9uRmVhdHVyZShmZWF0dXJlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmICghZmlsdGVyLmZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy50aWxlSUQub3ZlcnNjYWxlZFopLCBldmFsdWF0aW9uRmVhdHVyZSwgdGhpcy50aWxlSUQuY2Fub25pY2FsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghZmlsdGVyLmZpbHRlcihuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnModGhpcy50aWxlSUQub3ZlcnNjYWxlZFopLCBmZWF0dXJlKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdldElkKGZlYXR1cmUsIHNvdXJjZUxheWVyTmFtZSk7XG5cbiAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBsYXllcklEcy5sZW5ndGg7IGwrKykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJRCA9IGxheWVySURzW2xdO1xuXG4gICAgICAgICAgICBpZiAoZmlsdGVyTGF5ZXJJRHMgJiYgZmlsdGVyTGF5ZXJJRHMuaW5kZXhPZihsYXllcklEKSA8IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3R5bGVMYXllciA9IHN0eWxlTGF5ZXJzW2xheWVySURdO1xuXG4gICAgICAgICAgICBpZiAoIXN0eWxlTGF5ZXIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgZmVhdHVyZVN0YXRlID0ge307XG4gICAgICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2VGZWF0dXJlU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBgZmVhdHVyZS1zdGF0ZWAgZXhwcmVzc2lvbiBldmFsdWF0aW9uIHJlcXVpcmVzIGZlYXR1cmUgc3RhdGUgdG8gYmUgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgZmVhdHVyZVN0YXRlID0gc291cmNlRmVhdHVyZVN0YXRlLmdldFN0YXRlKHN0eWxlTGF5ZXIuc291cmNlTGF5ZXIgfHwgJ19nZW9qc29uVGlsZUxheWVyJywgaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkTGF5ZXIgPSBleHRlbmQoe30sIHNlcmlhbGl6ZWRMYXllcnNbbGF5ZXJJRF0pO1xuXG4gICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXIucGFpbnQgPSBldmFsdWF0ZVByb3BlcnRpZXMoc2VyaWFsaXplZExheWVyLnBhaW50LCBzdHlsZUxheWVyLnBhaW50LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXIubGF5b3V0ID0gZXZhbHVhdGVQcm9wZXJ0aWVzKHNlcmlhbGl6ZWRMYXllci5sYXlvdXQsIHN0eWxlTGF5ZXIubGF5b3V0LCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdGlvblogPSAhaW50ZXJzZWN0aW9uVGVzdCB8fCBpbnRlcnNlY3Rpb25UZXN0KGZlYXR1cmUsIHN0eWxlTGF5ZXIsIGZlYXR1cmVTdGF0ZSwgbGF5b3V0VmVydGV4QXJyYXlPZmZzZXQpO1xuICAgICAgICAgICAgaWYgKCFpbnRlcnNlY3Rpb25aKSB7XG4gICAgICAgICAgICAgICAgLy8gT25seSBhcHBsaWVkIGZvciBub24tc3ltYm9sIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGdlb2pzb25GZWF0dXJlID0gbmV3IEdlb0pTT05GZWF0dXJlKGZlYXR1cmUsIHRoaXMueiwgdGhpcy54LCB0aGlzLnksIGlkKTtcbiAgICAgICAgICAgIGdlb2pzb25GZWF0dXJlLmxheWVyID0gc2VyaWFsaXplZExheWVyO1xuICAgICAgICAgICAgbGV0IGxheWVyUmVzdWx0ID0gcmVzdWx0W2xheWVySURdO1xuICAgICAgICAgICAgaWYgKGxheWVyUmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsYXllclJlc3VsdCA9IHJlc3VsdFtsYXllcklEXSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsYXllclJlc3VsdC5wdXNoKHtmZWF0dXJlSW5kZXgsIGZlYXR1cmU6IGdlb2pzb25GZWF0dXJlLCBpbnRlcnNlY3Rpb25afSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhIHNldCBvZiBzeW1ib2wgaW5kZXhlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGxvb2tlZCB1cCxcbiAgICAvLyByZXR1cm4gYSBtYXRjaGluZyBzZXQgb2YgR2VvSlNPTkZlYXR1cmVzXG4gICAgbG9va3VwU3ltYm9sRmVhdHVyZXMoc3ltYm9sRmVhdHVyZUluZGV4ZXM6IEFycmF5PG51bWJlcj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZExheWVyczoge1tzdHJpbmddOiBTdHlsZUxheWVyfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJTcGVjOiBGaWx0ZXJTcGVjaWZpY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckxheWVySURzOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPixcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUxheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfSk6IFF1ZXJ5UmVzdWx0IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIHRoaXMubG9hZFZUTGF5ZXJzKCk7XG5cbiAgICAgICAgY29uc3QgZmlsdGVyID0gZmVhdHVyZUZpbHRlcihmaWx0ZXJTcGVjKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHN5bWJvbEZlYXR1cmVJbmRleCBvZiBzeW1ib2xGZWF0dXJlSW5kZXhlcykge1xuICAgICAgICAgICAgdGhpcy5sb2FkTWF0Y2hpbmdGZWF0dXJlKFxuICAgICAgICAgICAgICAgIHJlc3VsdCwge1xuICAgICAgICAgICAgICAgICAgICBidWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4OiBzeW1ib2xGZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGxheW91dFZlcnRleEFycmF5T2Zmc2V0OiAwXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgZmlsdGVyTGF5ZXJJRHMsXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzLFxuICAgICAgICAgICAgICAgIHN0eWxlTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRMYXllcnNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGxvYWRGZWF0dXJlKGZlYXR1cmVJbmRleERhdGE6IEZlYXR1cmVJbmRpY2VzKTogVmVjdG9yVGlsZUZlYXR1cmUge1xuICAgICAgICBjb25zdCB7ZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4fSA9IGZlYXR1cmVJbmRleERhdGE7XG5cbiAgICAgICAgdGhpcy5sb2FkVlRMYXllcnMoKTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJOYW1lID0gdGhpcy5zb3VyY2VMYXllckNvZGVyLmRlY29kZShzb3VyY2VMYXllckluZGV4KTtcblxuICAgICAgICBjb25zdCBmZWF0dXJlQ2FjaGUgPSB0aGlzLnZ0RmVhdHVyZXNbc291cmNlTGF5ZXJOYW1lXTtcbiAgICAgICAgaWYgKGZlYXR1cmVDYWNoZVtmZWF0dXJlSW5kZXhdKSB7XG4gICAgICAgICAgICByZXR1cm4gZmVhdHVyZUNhY2hlW2ZlYXR1cmVJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB0aGlzLnZ0TGF5ZXJzW3NvdXJjZUxheWVyTmFtZV07XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBzb3VyY2VMYXllci5mZWF0dXJlKGZlYXR1cmVJbmRleCk7XG4gICAgICAgIGZlYXR1cmVDYWNoZVtmZWF0dXJlSW5kZXhdID0gZmVhdHVyZTtcblxuICAgICAgICByZXR1cm4gZmVhdHVyZTtcbiAgICB9XG5cbiAgICBoYXNMYXllcihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRHMgb2YgdGhpcy5idWNrZXRMYXllcklEcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklEIG9mIGxheWVySURzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlkID09PSBsYXllcklEKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXRJZChmZWF0dXJlOiBWZWN0b3JUaWxlRmVhdHVyZSwgc291cmNlTGF5ZXJJZDogc3RyaW5nKTogc3RyaW5nIHwgbnVtYmVyIHwgdm9pZCB7XG4gICAgICAgIGxldCBpZCA9IGZlYXR1cmUuaWQ7XG4gICAgICAgIGlmICh0aGlzLnByb21vdGVJZCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlb2YgdGhpcy5wcm9tb3RlSWQgPT09ICdzdHJpbmcnID8gdGhpcy5wcm9tb3RlSWQgOiB0aGlzLnByb21vdGVJZFtzb3VyY2VMYXllcklkXTtcbiAgICAgICAgICAgIGlkID0gZmVhdHVyZS5wcm9wZXJ0aWVzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdib29sZWFuJykgaWQgPSAgTnVtYmVyKGlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxufVxuXG5yZWdpc3RlcihGZWF0dXJlSW5kZXgsICdGZWF0dXJlSW5kZXgnLCB7b21pdDogWydyYXdUaWxlRGF0YScsICdzb3VyY2VMYXllckNvZGVyJ119KTtcblxuZXhwb3J0IGRlZmF1bHQgRmVhdHVyZUluZGV4O1xuXG5mdW5jdGlvbiBldmFsdWF0ZVByb3BlcnRpZXMoc2VyaWFsaXplZFByb3BlcnRpZXMsIHN0eWxlTGF5ZXJQcm9wZXJ0aWVzLCBmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlcykge1xuICAgIHJldHVybiBtYXBPYmplY3Qoc2VyaWFsaXplZFByb3BlcnRpZXMsIChwcm9wZXJ0eSwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBzdHlsZUxheWVyUHJvcGVydGllcyBpbnN0YW5jZW9mIFBvc3NpYmx5RXZhbHVhdGVkID8gc3R5bGVMYXllclByb3BlcnRpZXMuZ2V0KGtleSkgOiBudWxsO1xuICAgICAgICByZXR1cm4gcHJvcCAmJiBwcm9wLmV2YWx1YXRlID8gcHJvcC5ldmFsdWF0ZShmZWF0dXJlLCBmZWF0dXJlU3RhdGUsIGF2YWlsYWJsZUltYWdlcykgOiBwcm9wO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB0b3BEb3duRmVhdHVyZUNvbXBhcmF0b3IoYSwgYikge1xuICAgIHJldHVybiBiIC0gYTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7U0RGX1NDQUxFfSBmcm9tICcuLi9yZW5kZXIvZ2x5cGhfbWFuYWdlci5qcyc7XG5pbXBvcnQge0FscGhhSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHtyZWdpc3Rlcn0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyX3RyYW5zZmVyLmpzJztcbmltcG9ydCBwb3RwYWNrIGZyb20gJ3BvdHBhY2snO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGguanMnO1xuXG5jb25zdCBnbHlwaFBhZGRpbmcgPSAxO1xuLypcbiAgICBUaGUgZ2x5cGggcGFkZGluZyBpcyBqdXN0IHRvIHByZXZlbnQgc2FtcGxpbmcgZXJyb3JzIGF0IHRoZSBib3VuZGFyaWVzIGJldHdlZW5cbiAgICBnbHlwaHMgaW4gdGhlIGF0bGFzIHRleHR1cmUsIGFuZCBmb3IgdGhhdCBwdXJwb3NlIHRoZXJlJ3Mgbm8gbmVlZCB0byBtYWtlIGl0XG4gICAgYmlnZ2VyIHdpdGggaGlnaC1yZXMgU0RGcy4gSG93ZXZlciwgbGF5b3V0IGlzIGRvbmUgYmFzZWQgb24gdGhlIGdseXBoIHNpemVcbiAgICBpbmNsdWRpbmcgdGhpcyBwYWRkaW5nLCBzbyBzY2FsaW5nIHRoaXMgcGFkZGluZyBpcyB0aGUgZWFzaWVzdCB3YXkgdG8ga2VlcFxuICAgIGxheW91dCBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBTREZfU0NBTEUgY2hhbmdlcy5cbiovXG5jb25zdCBsb2NhbEdseXBoUGFkZGluZyA9IGdseXBoUGFkZGluZyAqIFNERl9TQ0FMRTtcblxuZXhwb3J0IHR5cGUgR2x5cGhSZWN0ID0ge1xuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgdzogbnVtYmVyLFxuICAgIGg6IG51bWJlclxufTtcbi8vIHtnbHlwaElEOiBnbHlwaFJlY3R9XG5leHBvcnQgdHlwZSBHbHlwaFBvc2l0aW9uTWFwID0geyBbXzogbnVtYmVyXTogR2x5cGhSZWN0IH07XG5cbi8vIHtmb250U3RhY2s6IGdseXBoUG9pc3Rpb25NYXB9XG5leHBvcnQgdHlwZSBHbHlwaFBvc2l0aW9ucyA9IHsgW186IHN0cmluZ106IEdseXBoUG9zaXRpb25NYXAgfTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2x5cGhBdGxhcyB7XG4gICAgaW1hZ2U6IEFscGhhSW1hZ2U7XG4gICAgcG9zaXRpb25zOiBHbHlwaFBvc2l0aW9ucztcbiAgICBjb25zdHJ1Y3RvcihzdGFja3M6IHtbXzogc3RyaW5nXToge2dseXBoczoge1tfOiBudW1iZXJdOiA/U3R5bGVHbHlwaCB9LCBhc2NlbmRlcj86IG51bWJlciwgZGVzY2VuZGVyPzogbnVtYmVyIH19KSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHt9O1xuICAgICAgICBjb25zdCBiaW5zID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGFjayBpbiBzdGFja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGdseXBoRGF0YSA9IHN0YWNrc1tzdGFja107XG4gICAgICAgICAgICBjb25zdCBnbHlwaFBvc2l0aW9uTWFwID0gcG9zaXRpb25zW3N0YWNrXSA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGdseXBoRGF0YS5nbHlwaHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcmMgPSBnbHlwaERhdGEuZ2x5cGhzWytpZF07XG4gICAgICAgICAgICAgICAgaWYgKCFzcmMgfHwgc3JjLmJpdG1hcC53aWR0aCA9PT0gMCB8fCBzcmMuYml0bWFwLmhlaWdodCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gc3JjLm1ldHJpY3MubG9jYWxHbHlwaCA/IGxvY2FsR2x5cGhQYWRkaW5nIDogZ2x5cGhQYWRkaW5nO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJpbiA9IHtcbiAgICAgICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICAgICAgdzogc3JjLmJpdG1hcC53aWR0aCArIDIgKiBwYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICBoOiBzcmMuYml0bWFwLmhlaWdodCArIDIgKiBwYWRkaW5nXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBiaW5zLnB1c2goYmluKTtcbiAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9uTWFwW2lkXSA9IGJpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHt3LCBofSA9IHBvdHBhY2soYmlucyk7XG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEFscGhhSW1hZ2Uoe3dpZHRoOiB3IHx8IDEsIGhlaWdodDogaCB8fCAxfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzdGFjayBpbiBzdGFja3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGdseXBoRGF0YSA9IHN0YWNrc1tzdGFja107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gZ2x5cGhEYXRhLmdseXBocykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNyYyA9IGdseXBoRGF0YS5nbHlwaHNbK2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoIXNyYyB8fCBzcmMuYml0bWFwLndpZHRoID09PSAwIHx8IHNyYy5iaXRtYXAuaGVpZ2h0ID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBiaW4gPSBwb3NpdGlvbnNbc3RhY2tdW2lkXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWRkaW5nID0gc3JjLm1ldHJpY3MubG9jYWxHbHlwaCA/IGxvY2FsR2x5cGhQYWRkaW5nIDogZ2x5cGhQYWRkaW5nO1xuICAgICAgICAgICAgICAgIEFscGhhSW1hZ2UuY29weShzcmMuYml0bWFwLCBpbWFnZSwge3g6IDAsIHk6IDB9LCB7eDogYmluLnggKyBwYWRkaW5nLCB5OiBiaW4ueSArIHBhZGRpbmd9LCBzcmMuYml0bWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBwb3NpdGlvbnM7XG4gICAgfVxufVxuXG5yZWdpc3RlcihHbHlwaEF0bGFzLCAnR2x5cGhBdGxhcycpO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEZlYXR1cmVJbmRleCBmcm9tICcuLi9kYXRhL2ZlYXR1cmVfaW5kZXguanMnO1xuXG5pbXBvcnQge3BlcmZvcm1TeW1ib2xMYXlvdXR9IGZyb20gJy4uL3N5bWJvbC9zeW1ib2xfbGF5b3V0LmpzJztcbmltcG9ydCB7Q29sbGlzaW9uQm94QXJyYXl9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMuanMnO1xuaW1wb3J0IERpY3Rpb25hcnlDb2RlciBmcm9tICcuLi91dGlsL2RpY3Rpb25hcnlfY29kZXIuanMnO1xuaW1wb3J0IFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCBMaW5lQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0LmpzJztcbmltcG9ydCBGaWxsQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2ZpbGxfYnVja2V0LmpzJztcbmltcG9ydCBGaWxsRXh0cnVzaW9uQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldC5qcyc7XG5pbXBvcnQge3dhcm5PbmNlLCBtYXBPYmplY3QsIHZhbHVlc30gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBMaW5lQXRsYXMgZnJvbSAnLi4vcmVuZGVyL2xpbmVfYXRsYXMuanMnO1xuaW1wb3J0IEltYWdlQXRsYXMgZnJvbSAnLi4vcmVuZGVyL2ltYWdlX2F0bGFzLmpzJztcbmltcG9ydCBHbHlwaEF0bGFzIGZyb20gJy4uL3JlbmRlci9nbHlwaF9hdGxhcy5qcyc7XG5pbXBvcnQgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCB7Q2Fub25pY2FsVGlsZUlELCBPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQuanMnO1xuaW1wb3J0IHtQZXJmb3JtYW5jZVV0aWxzfSBmcm9tICcuLi91dGlsL3BlcmZvcm1hbmNlLmpzJztcbmltcG9ydCB0aWxlVHJhbnNmb3JtIGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIFByb2plY3Rpb24gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vcHJvamVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7QnVja2V0fSBmcm9tICcuLi9kYXRhL2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBBY3RvciBmcm9tICcuLi91dGlsL2FjdG9yLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllckluZGV4IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi4vc3R5bGUvc3R5bGVfZ2x5cGguanMnO1xuaW1wb3J0IHR5cGUge1Nwcml0ZVBvc2l0aW9uc30gZnJvbSAnLi4vdXRpbC9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgV29ya2VyVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyVGlsZUNhbGxiYWNrLFxufSBmcm9tICcuLi9zb3VyY2Uvd29ya2VyX3NvdXJjZS5qcyc7XG5pbXBvcnQgdHlwZSB7UHJvbW90ZUlkU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VGlsZVRyYW5zZm9ybX0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuXG5jbGFzcyBXb3JrZXJUaWxlIHtcbiAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQ7XG4gICAgdWlkOiBudW1iZXI7XG4gICAgem9vbTogbnVtYmVyO1xuICAgIHRpbGVab29tOiBudW1iZXI7XG4gICAgY2Fub25pY2FsOiBDYW5vbmljYWxUaWxlSUQ7XG4gICAgcGl4ZWxSYXRpbzogbnVtYmVyO1xuICAgIHRpbGVTaXplOiBudW1iZXI7XG4gICAgc291cmNlOiBzdHJpbmc7XG4gICAgcHJvbW90ZUlkOiA/UHJvbW90ZUlkU3BlY2lmaWNhdGlvbjtcbiAgICBvdmVyc2NhbGluZzogbnVtYmVyO1xuICAgIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbjtcbiAgICBjb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW47XG4gICAgcmV0dXJuRGVwZW5kZW5jaWVzOiBib29sZWFuO1xuICAgIGVuYWJsZVRlcnJhaW46IGJvb2xlYW47XG4gICAgaXNTeW1ib2xUaWxlOiA/Ym9vbGVhbjtcbiAgICBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uO1xuICAgIHRpbGVUcmFuc2Zvcm06IFRpbGVUcmFuc2Zvcm07XG5cbiAgICBzdGF0dXM6ICdwYXJzaW5nJyB8ICdkb25lJztcbiAgICBkYXRhOiBWZWN0b3JUaWxlO1xuICAgIGNvbGxpc2lvbkJveEFycmF5OiBDb2xsaXNpb25Cb3hBcnJheTtcblxuICAgIGFib3J0OiA/KCkgPT4gdm9pZDtcbiAgICByZWxvYWRDYWxsYmFjazogP1dvcmtlclRpbGVDYWxsYmFjaztcbiAgICB2ZWN0b3JUaWxlOiBWZWN0b3JUaWxlO1xuXG4gICAgY29uc3RydWN0b3IocGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycykge1xuICAgICAgICB0aGlzLnRpbGVJRCA9IG5ldyBPdmVyc2NhbGVkVGlsZUlEKHBhcmFtcy50aWxlSUQub3ZlcnNjYWxlZFosIHBhcmFtcy50aWxlSUQud3JhcCwgcGFyYW1zLnRpbGVJRC5jYW5vbmljYWwueiwgcGFyYW1zLnRpbGVJRC5jYW5vbmljYWwueCwgcGFyYW1zLnRpbGVJRC5jYW5vbmljYWwueSk7XG4gICAgICAgIHRoaXMudGlsZVpvb20gPSBwYXJhbXMudGlsZVpvb207XG4gICAgICAgIHRoaXMudWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgdGhpcy56b29tID0gcGFyYW1zLnpvb207XG4gICAgICAgIHRoaXMuY2Fub25pY2FsID0gcGFyYW1zLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpbyA9IHBhcmFtcy5waXhlbFJhdGlvO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gcGFyYW1zLnRpbGVTaXplO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHBhcmFtcy5zb3VyY2U7XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSB0aGlzLnRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKTtcbiAgICAgICAgdGhpcy5zaG93Q29sbGlzaW9uQm94ZXMgPSBwYXJhbXMuc2hvd0NvbGxpc2lvbkJveGVzO1xuICAgICAgICB0aGlzLmNvbGxlY3RSZXNvdXJjZVRpbWluZyA9ICEhcGFyYW1zLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcbiAgICAgICAgdGhpcy5yZXR1cm5EZXBlbmRlbmNpZXMgPSAhIXBhcmFtcy5yZXR1cm5EZXBlbmRlbmNpZXM7XG4gICAgICAgIHRoaXMucHJvbW90ZUlkID0gcGFyYW1zLnByb21vdGVJZDtcbiAgICAgICAgdGhpcy5lbmFibGVUZXJyYWluID0gISFwYXJhbXMuZW5hYmxlVGVycmFpbjtcbiAgICAgICAgdGhpcy5pc1N5bWJvbFRpbGUgPSBwYXJhbXMuaXNTeW1ib2xUaWxlO1xuICAgICAgICB0aGlzLnRpbGVUcmFuc2Zvcm0gPSB0aWxlVHJhbnNmb3JtKHBhcmFtcy50aWxlSUQuY2Fub25pY2FsLCBwYXJhbXMucHJvamVjdGlvbik7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbiA9IHBhcmFtcy5wcm9qZWN0aW9uO1xuICAgIH1cblxuICAgIHBhcnNlKGRhdGE6IFZlY3RvclRpbGUsIGxheWVySW5kZXg6IFN0eWxlTGF5ZXJJbmRleCwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBhY3RvcjogQWN0b3IsIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbSA9IFBlcmZvcm1hbmNlVXRpbHMuYmVnaW5NZWFzdXJlKCdwYXJzZVRpbGUxJyk7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ3BhcnNpbmcnO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uQm94QXJyYXkgPSBuZXcgQ29sbGlzaW9uQm94QXJyYXkoKTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJDb2RlciA9IG5ldyBEaWN0aW9uYXJ5Q29kZXIoT2JqZWN0LmtleXMoZGF0YS5sYXllcnMpLnNvcnQoKSk7XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZUluZGV4ID0gbmV3IEZlYXR1cmVJbmRleCh0aGlzLnRpbGVJRCwgdGhpcy5wcm9tb3RlSWQpO1xuICAgICAgICBmZWF0dXJlSW5kZXguYnVja2V0TGF5ZXJJRHMgPSBbXTtcblxuICAgICAgICBjb25zdCBidWNrZXRzOiB7W186IHN0cmluZ106IEJ1Y2tldH0gPSB7fTtcblxuICAgICAgICAvLyB3ZSBpbml0aWFsbHkgcmVzZXJ2ZSBzcGFjZSBmb3IgYSAyNTZ4MjU2IGF0bGFzLCBidXQgdHJpbSBpdCBhZnRlciBwcm9jZXNzaW5nIGFsbCBsaW5lIGZlYXR1cmVzXG4gICAgICAgIGNvbnN0IGxpbmVBdGxhcyA9IG5ldyBMaW5lQXRsYXMoMjU2LCAyNTYpO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBmZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICBpY29uRGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgICAgICAgIHBhdHRlcm5EZXBlbmRlbmNpZXM6IHt9LFxuICAgICAgICAgICAgZ2x5cGhEZXBlbmRlbmNpZXM6IHt9LFxuICAgICAgICAgICAgbGluZUF0bGFzLFxuICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbGF5ZXJGYW1pbGllcyA9IGxheWVySW5kZXguZmFtaWxpZXNCeVNvdXJjZVt0aGlzLnNvdXJjZV07XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlTGF5ZXJJZCBpbiBsYXllckZhbWlsaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IGRhdGEubGF5ZXJzW3NvdXJjZUxheWVySWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYW55U3ltYm9sTGF5ZXJzID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgYW55T3RoZXJMYXllcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmFtaWx5IG9mIGxheWVyRmFtaWxpZXNbc291cmNlTGF5ZXJJZF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZmFtaWx5WzBdLnR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgICAgIGFueVN5bWJvbExheWVycyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYW55T3RoZXJMYXllcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTeW1ib2xUaWxlID09PSB0cnVlICYmICFhbnlTeW1ib2xMYXllcnMpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1N5bWJvbFRpbGUgPT09IGZhbHNlICYmICFhbnlPdGhlckxheWVycykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc291cmNlTGF5ZXIudmVyc2lvbiA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHdhcm5PbmNlKGBWZWN0b3IgdGlsZSBzb3VyY2UgXCIke3RoaXMuc291cmNlfVwiIGxheWVyIFwiJHtzb3VyY2VMYXllcklkfVwiIGAgK1xuICAgICAgICAgICAgICAgICAgICBgZG9lcyBub3QgdXNlIHZlY3RvciB0aWxlIHNwZWMgdjIgYW5kIHRoZXJlZm9yZSBtYXkgaGF2ZSBzb21lIHJlbmRlcmluZyBlcnJvcnMuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVySW5kZXggPSBzb3VyY2VMYXllckNvZGVyLmVuY29kZShzb3VyY2VMYXllcklkKTtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlTGF5ZXIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IHNvdXJjZUxheWVyLmZlYXR1cmUoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZmVhdHVyZUluZGV4LmdldElkKGZlYXR1cmUsIHNvdXJjZUxheWVySWQpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2goe2ZlYXR1cmUsIGlkLCBpbmRleCwgc291cmNlTGF5ZXJJbmRleH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZhbWlseSBvZiBsYXllckZhbWlsaWVzW3NvdXJjZUxheWVySWRdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBmYW1pbHlbMF07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTeW1ib2xUaWxlICE9PSB1bmRlZmluZWQgJiYgKGxheWVyLnR5cGUgPT09ICdzeW1ib2wnKSAhPT0gdGhpcy5pc1N5bWJvbFRpbGUpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgYXNzZXJ0KGxheWVyLnNvdXJjZSA9PT0gdGhpcy5zb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5taW56b29tICYmIHRoaXMuem9vbSA8IE1hdGguZmxvb3IobGF5ZXIubWluem9vbSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5tYXh6b29tICYmIHRoaXMuem9vbSA+PSBsYXllci5tYXh6b29tKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIudmlzaWJpbGl0eSA9PT0gJ25vbmUnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlTGF5ZXJzKGZhbWlseSwgdGhpcy56b29tLCBhdmFpbGFibGVJbWFnZXMpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gYnVja2V0c1tsYXllci5pZF0gPSBsYXllci5jcmVhdGVCdWNrZXQoe1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogZmVhdHVyZUluZGV4LmJ1Y2tldExheWVySURzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBmYW1pbHksXG4gICAgICAgICAgICAgICAgICAgIHpvb206IHRoaXMuem9vbSxcbiAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsOiB0aGlzLmNhbm9uaWNhbCxcbiAgICAgICAgICAgICAgICAgICAgcGl4ZWxSYXRpbzogdGhpcy5waXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICBvdmVyc2NhbGluZzogdGhpcy5vdmVyc2NhbGluZyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXk6IHRoaXMuY29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlEOiB0aGlzLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlVGVycmFpbjogdGhpcy5lbmFibGVUZXJyYWluLFxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uOiB0aGlzLnByb2plY3Rpb24uc3BlYyxcbiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBhc3NlcnQodGhpcy50aWxlVHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSA9PT0gdGhpcy5wcm9qZWN0aW9uLm5hbWUpO1xuICAgICAgICAgICAgICAgIGJ1Y2tldC5wb3B1bGF0ZShmZWF0dXJlcywgb3B0aW9ucywgdGhpcy50aWxlSUQuY2Fub25pY2FsLCB0aGlzLnRpbGVUcmFuc2Zvcm0pO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleC5idWNrZXRMYXllcklEcy5wdXNoKGZhbWlseS5tYXAoKGwpID0+IGwuaWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVBdGxhcy50cmltKCk7XG5cbiAgICAgICAgbGV0IGVycm9yOiA/RXJyb3I7XG4gICAgICAgIGxldCBnbHlwaE1hcDogP3tbXzogc3RyaW5nXToge2dseXBoczoge1tfOiBudW1iZXJdOiA/U3R5bGVHbHlwaH0sIGFzY2VuZGVyPzogbnVtYmVyLCBkZXNjZW5kZXI/OiBudW1iZXJ9fTtcbiAgICAgICAgbGV0IGljb25NYXA6ID97W186IHN0cmluZ106IFN0eWxlSW1hZ2V9O1xuICAgICAgICBsZXQgcGF0dGVybk1hcDogP3tbXzogc3RyaW5nXTogU3R5bGVJbWFnZX07XG4gICAgICAgIGNvbnN0IHRhc2tNZXRhZGF0YSA9IHt0eXBlOiAnbWF5YmVQcmVwYXJlJywgaXNTeW1ib2xUaWxlOiB0aGlzLmlzU3ltYm9sVGlsZSwgem9vbTogdGhpcy56b29tfTtcblxuICAgICAgICBjb25zdCBzdGFja3MgPSBtYXBPYmplY3Qob3B0aW9ucy5nbHlwaERlcGVuZGVuY2llcywgKGdseXBocykgPT4gT2JqZWN0LmtleXMoZ2x5cGhzKS5tYXAoTnVtYmVyKSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdGFja3MpLmxlbmd0aCkge1xuICAgICAgICAgICAgYWN0b3Iuc2VuZCgnZ2V0R2x5cGhzJywge3VpZDogdGhpcy51aWQsIHN0YWNrc30sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgIGdseXBoTWFwID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBtYXliZVByZXBhcmUuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB1bmRlZmluZWQsIGZhbHNlLCB0YXNrTWV0YWRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2x5cGhNYXAgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGljb25zID0gT2JqZWN0LmtleXMob3B0aW9ucy5pY29uRGVwZW5kZW5jaWVzKTtcbiAgICAgICAgaWYgKGljb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWN0b3Iuc2VuZCgnZ2V0SW1hZ2VzJywge2ljb25zLCBzb3VyY2U6IHRoaXMuc291cmNlLCB0aWxlSUQ6IHRoaXMudGlsZUlELCB0eXBlOiAnaWNvbnMnfSwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICAgICAgaWNvbk1hcCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgbWF5YmVQcmVwYXJlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgdW5kZWZpbmVkLCBmYWxzZSwgdGFza01ldGFkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGljb25NYXAgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdHRlcm5zID0gT2JqZWN0LmtleXMob3B0aW9ucy5wYXR0ZXJuRGVwZW5kZW5jaWVzKTtcbiAgICAgICAgaWYgKHBhdHRlcm5zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWN0b3Iuc2VuZCgnZ2V0SW1hZ2VzJywge2ljb25zOiBwYXR0ZXJucywgc291cmNlOiB0aGlzLnNvdXJjZSwgdGlsZUlEOiB0aGlzLnRpbGVJRCwgdHlwZTogJ3BhdHRlcm5zJ30sIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm5NYXAgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIG1heWJlUHJlcGFyZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHVuZGVmaW5lZCwgZmFsc2UsIHRhc2tNZXRhZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXR0ZXJuTWFwID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLmVuZE1lYXN1cmUobSk7XG5cbiAgICAgICAgbWF5YmVQcmVwYXJlLmNhbGwodGhpcyk7XG5cbiAgICAgICAgZnVuY3Rpb24gbWF5YmVQcmVwYXJlKCkge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2x5cGhNYXAgJiYgaWNvbk1hcCAmJiBwYXR0ZXJuTWFwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbSA9IFBlcmZvcm1hbmNlVXRpbHMuYmVnaW5NZWFzdXJlKCdwYXJzZVRpbGUyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2x5cGhBdGxhcyA9IG5ldyBHbHlwaEF0bGFzKGdseXBoTWFwKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZUF0bGFzID0gbmV3IEltYWdlQXRsYXMoaWNvbk1hcCwgcGF0dGVybk1hcCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBidWNrZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IGJ1Y2tldHNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldCBpbnN0YW5jZW9mIFN5bWJvbEJ1Y2tldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjYWxjdWxhdGVMYXllcnMoYnVja2V0LmxheWVycywgdGhpcy56b29tLCBhdmFpbGFibGVJbWFnZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVN5bWJvbExheW91dChidWNrZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhNYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhBdGxhcy5wb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUF0bGFzLmljb25Qb3NpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q29sbGlzaW9uQm94ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGlsZUlELmNhbm9uaWNhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbGVab29tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnVja2V0Lmhhc1BhdHRlcm4gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChidWNrZXQgaW5zdGFuY2VvZiBMaW5lQnVja2V0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0IGluc3RhbmNlb2YgRmlsbEJ1Y2tldCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCBpbnN0YW5jZW9mIEZpbGxFeHRydXNpb25CdWNrZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNhbGN1bGF0ZUxheWVycyhidWNrZXQubGF5ZXJzLCB0aGlzLnpvb20sIGF2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS10eXBlXSBGbG93IGNhbid0IGludGVycHJldCBJbWFnZVBvc2l0aW9uIGFzIFNwcml0ZVBvc2l0aW9uIGZvciBzb21lIHJlYXNvbiBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZVBvc2l0aW9uczogU3ByaXRlUG9zaXRpb25zID0gaW1hZ2VBdGxhcy5wYXR0ZXJuUG9zaXRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmFkZEZlYXR1cmVzKG9wdGlvbnMsIHRoaXMudGlsZUlELmNhbm9uaWNhbCwgaW1hZ2VQb3NpdGlvbnMsIGF2YWlsYWJsZUltYWdlcywgdGhpcy50aWxlVHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ2RvbmUnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0czogdmFsdWVzKGJ1Y2tldHMpLmZpbHRlcihiID0+ICFiLmlzRW1wdHkoKSksXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXk6IHRoaXMuY29sbGlzaW9uQm94QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIGdseXBoQXRsYXNJbWFnZTogZ2x5cGhBdGxhcy5pbWFnZSxcbiAgICAgICAgICAgICAgICAgICAgbGluZUF0bGFzLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZUF0bGFzLFxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHVzZWQgZm9yIGJlbmNobWFya2luZzpcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhNYXA6IHRoaXMucmV0dXJuRGVwZW5kZW5jaWVzID8gZ2x5cGhNYXAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpY29uTWFwOiB0aGlzLnJldHVybkRlcGVuZGVuY2llcyA/IGljb25NYXAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBnbHlwaFBvc2l0aW9uczogdGhpcy5yZXR1cm5EZXBlbmRlbmNpZXMgPyBnbHlwaEF0bGFzLnBvc2l0aW9ucyA6IG51bGxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLmVuZE1lYXN1cmUobSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlY2FsY3VsYXRlTGF5ZXJzKGxheWVyczogJFJlYWRPbmx5QXJyYXk8U3R5bGVMYXllcj4sIHpvb206IG51bWJlciwgYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgLy8gTGF5ZXJzIGFyZSBzaGFyZWQgYW5kIG1heSBoYXZlIGJlZW4gdXNlZCBieSBhIFdvcmtlclRpbGUgd2l0aCBhIGRpZmZlcmVudCB6b29tLlxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBuZXcgRXZhbHVhdGlvblBhcmFtZXRlcnMoem9vbSk7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgbGF5ZXIucmVjYWxjdWxhdGUocGFyYW1ldGVycywgYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFdvcmtlclRpbGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2dldEFycmF5QnVmZmVyfSBmcm9tICcuLi91dGlsL2FqYXguanMnO1xuXG5pbXBvcnQgdnQgZnJvbSAnQG1hcGJveC92ZWN0b3ItdGlsZSc7XG5pbXBvcnQgUHJvdG9idWYgZnJvbSAncGJmJztcbmltcG9ydCBXb3JrZXJUaWxlIGZyb20gJy4vd29ya2VyX3RpbGUuanMnO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge2dldFBlcmZvcm1hbmNlTWVhc3VyZW1lbnR9IGZyb20gJy4uL3V0aWwvcGVyZm9ybWFuY2UuanMnO1xuaW1wb3J0IHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHRpbGVUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gICAgV29ya2VyU291cmNlLFxuICAgIFdvcmtlclRpbGVQYXJhbWV0ZXJzLFxuICAgIFJlcXVlc3RlZFRpbGVQYXJhbWV0ZXJzLFxuICAgIFdvcmtlclRpbGVDYWxsYmFjayxcbiAgICBUaWxlUGFyYW1ldGVyc1xufSBmcm9tICcuLi9zb3VyY2Uvd29ya2VyX3NvdXJjZS5qcyc7XG5cbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllckluZGV4IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUgU2NoZWR1bGVyIGZyb20gJy4uL3V0aWwvc2NoZWR1bGVyLmpzJztcblxuZXhwb3J0IHR5cGUgTG9hZFZlY3RvclRpbGVSZXN1bHQgPSB7XG4gICAgcmF3RGF0YTogQXJyYXlCdWZmZXI7XG4gICAgdmVjdG9yVGlsZT86IFZlY3RvclRpbGU7XG4gICAgZXhwaXJlcz86IGFueTtcbiAgICBjYWNoZUNvbnRyb2w/OiBhbnk7XG4gICAgcmVzb3VyY2VUaW1pbmc/OiBBcnJheTxQZXJmb3JtYW5jZVJlc291cmNlVGltaW5nPjtcbn07XG5cbi8qKlxuICogQGNhbGxiYWNrIExvYWRWZWN0b3JEYXRhQ2FsbGJhY2tcbiAqIEBwYXJhbSBlcnJvclxuICogQHBhcmFtIHZlY3RvclRpbGVcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCB0eXBlIExvYWRWZWN0b3JEYXRhQ2FsbGJhY2sgPSBDYWxsYmFjazw/TG9hZFZlY3RvclRpbGVSZXN1bHQ+O1xuXG5leHBvcnQgdHlwZSBBYm9ydFZlY3RvckRhdGEgPSAoKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgTG9hZFZlY3RvckRhdGEgPSAocGFyYW1zOiBSZXF1ZXN0ZWRUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IExvYWRWZWN0b3JEYXRhQ2FsbGJhY2spID0+ID9BYm9ydFZlY3RvckRhdGE7XG5leHBvcnQgY2xhc3MgRGVkdXBlZFJlcXVlc3Qge1xuICAgIGVudHJpZXM6IHsgW3N0cmluZ106IE9iamVjdCB9O1xuICAgIHNjaGVkdWxlcjogP1NjaGVkdWxlcjtcblxuICAgIGNvbnN0cnVjdG9yKHNjaGVkdWxlcj86IFNjaGVkdWxlcikge1xuICAgICAgICB0aGlzLmVudHJpZXMgPSB7fTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7XG4gICAgfVxuXG4gICAgcmVxdWVzdChrZXk6IHN0cmluZywgbWV0YWRhdGE6IE9iamVjdCwgcmVxdWVzdDogYW55LCBjYWxsYmFjazogTG9hZFZlY3RvckRhdGFDYWxsYmFjayk6ICgoKSA9PiB2b2lkKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzW2tleV0gPSB0aGlzLmVudHJpZXNba2V5XSB8fCB7Y2FsbGJhY2tzOiBbXX07XG5cbiAgICAgICAgaWYgKGVudHJ5LnJlc3VsdCkge1xuICAgICAgICAgICAgY29uc3QgW2VyciwgcmVzdWx0XSA9IGVudHJ5LnJlc3VsdDtcbiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVkdWxlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVyLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LCBtZXRhZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVudHJ5LmNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcblxuICAgICAgICBpZiAoIWVudHJ5LmNhbmNlbCkge1xuICAgICAgICAgICAgZW50cnkuY2FuY2VsID0gcmVxdWVzdCgoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBlbnRyeS5yZXN1bHQgPSBbZXJyLCByZXN1bHRdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2Igb2YgZW50cnkuY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjaGVkdWxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZXIuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYihlcnIsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBtZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYihlcnIsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBkZWxldGUgdGhpcy5lbnRyaWVzW2tleV0sIDEwMDAgKiAzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5yZXN1bHQpIHJldHVybjtcbiAgICAgICAgICAgIGVudHJ5LmNhbGxiYWNrcyA9IGVudHJ5LmNhbGxiYWNrcy5maWx0ZXIoY2IgPT4gY2IgIT09IGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmICghZW50cnkuY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGVudHJ5LmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmVudHJpZXNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRWZWN0b3JUaWxlKHBhcmFtczogUmVxdWVzdGVkVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBMb2FkVmVjdG9yRGF0YUNhbGxiYWNrLCBza2lwUGFyc2U/OiBib29sZWFuKTogKCgpID0+IHZvaWQpIHtcbiAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMucmVxdWVzdCk7XG5cbiAgICBjb25zdCBtYWtlUmVxdWVzdCA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gZ2V0QXJyYXlCdWZmZXIocGFyYW1zLnJlcXVlc3QsIChlcnI6ID9FcnJvciwgZGF0YTogP0FycmF5QnVmZmVyLCBjYWNoZUNvbnRyb2w6ID9zdHJpbmcsIGV4cGlyZXM6ID9zdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgICAgICAgICAgICB2ZWN0b3JUaWxlOiBza2lwUGFyc2UgPyB1bmRlZmluZWQgOiBuZXcgdnQuVmVjdG9yVGlsZShuZXcgUHJvdG9idWYoZGF0YSkpLFxuICAgICAgICAgICAgICAgICAgICByYXdEYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICBjYWNoZUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgICAgIGV4cGlyZXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgaWYgKHBhcmFtcy5kYXRhKSB7XG4gICAgICAgIC8vIGlmIHdlIGFscmVhZHkgZ290IHRoZSByZXN1bHQgZWFybGllciAob24gdGhlIG1haW4gdGhyZWFkKSwgcmV0dXJuIGl0IGRpcmVjdGx5XG4gICAgICAgICh0aGlzLmRlZHVwZWQ6IERlZHVwZWRSZXF1ZXN0KS5lbnRyaWVzW2tleV0gPSB7cmVzdWx0OiBbbnVsbCwgcGFyYW1zLmRhdGFdfTtcbiAgICB9XG5cbiAgICBjb25zdCBjYWxsYmFja01ldGFkYXRhID0ge3R5cGU6ICdwYXJzZVRpbGUnLCBpc1N5bWJvbFRpbGU6IHBhcmFtcy5pc1N5bWJvbFRpbGUsIHpvb206IHBhcmFtcy50aWxlWm9vbX07XG4gICAgcmV0dXJuICh0aGlzLmRlZHVwZWQ6IERlZHVwZWRSZXF1ZXN0KS5yZXF1ZXN0KGtleSwgY2FsbGJhY2tNZXRhZGF0YSwgbWFrZVJlcXVlc3QsIGNhbGxiYWNrKTtcbn1cblxuLyoqXG4gKiBUaGUge0BsaW5rIFdvcmtlclNvdXJjZX0gaW1wbGVtZW50YXRpb24gdGhhdCBzdXBwb3J0cyB7QGxpbmsgVmVjdG9yVGlsZVNvdXJjZX0uXG4gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGVhc2lseSByZXVzZWQgdG8gc3VwcG9ydCBjdXN0b20gc291cmNlIHR5cGVzXG4gKiBmb3IgZGF0YSBmb3JtYXRzIHRoYXQgY2FuIGJlIHBhcnNlZC9jb252ZXJ0ZWQgaW50byBhbiBpbi1tZW1vcnkgVmVjdG9yVGlsZVxuICogcmVwcmVzZW50YXRpb24uICBUbyBkbyBzbywgY3JlYXRlIGl0IHdpdGhcbiAqIGBuZXcgVmVjdG9yVGlsZVdvcmtlclNvdXJjZShhY3Rvciwgc3R5bGVMYXllcnMsIGN1c3RvbUxvYWRWZWN0b3JEYXRhRnVuY3Rpb24pYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBWZWN0b3JUaWxlV29ya2VyU291cmNlIGV4dGVuZHMgRXZlbnRlZCBpbXBsZW1lbnRzIFdvcmtlclNvdXJjZSB7XG4gICAgYWN0b3I6IEFjdG9yO1xuICAgIGxheWVySW5kZXg6IFN0eWxlTGF5ZXJJbmRleDtcbiAgICBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz47XG4gICAgbG9hZFZlY3RvckRhdGE6IExvYWRWZWN0b3JEYXRhO1xuICAgIGxvYWRpbmc6IHtbXzogbnVtYmVyXTogV29ya2VyVGlsZSB9O1xuICAgIGxvYWRlZDoge1tfOiBudW1iZXJdOiBXb3JrZXJUaWxlIH07XG4gICAgZGVkdXBlZDogRGVkdXBlZFJlcXVlc3Q7XG4gICAgaXNTcHJpdGVMb2FkZWQ6IGJvb2xlYW47XG4gICAgc2NoZWR1bGVyOiA/U2NoZWR1bGVyO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIFtsb2FkVmVjdG9yRGF0YV0gT3B0aW9uYWwgbWV0aG9kIGZvciBjdXN0b20gbG9hZGluZyBvZiBhIFZlY3RvclRpbGVcbiAgICAgKiBvYmplY3QgYmFzZWQgb24gcGFyYW1ldGVycyBwYXNzZWQgZnJvbSB0aGUgbWFpbi10aHJlYWQgU291cmNlLiBTZWVcbiAgICAgKiB7QGxpbmsgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSNsb2FkVGlsZX0uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseVxuICAgICAqIGxvYWRzIHRoZSBwYmYgYXQgYHBhcmFtcy51cmxgLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYWN0b3I6IEFjdG9yLCBsYXllckluZGV4OiBTdHlsZUxheWVySW5kZXgsIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiwgaXNTcHJpdGVMb2FkZWQ6IGJvb2xlYW4sIGxvYWRWZWN0b3JEYXRhOiA/TG9hZFZlY3RvckRhdGEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5hY3RvciA9IGFjdG9yO1xuICAgICAgICB0aGlzLmxheWVySW5kZXggPSBsYXllckluZGV4O1xuICAgICAgICB0aGlzLmF2YWlsYWJsZUltYWdlcyA9IGF2YWlsYWJsZUltYWdlcztcbiAgICAgICAgdGhpcy5sb2FkVmVjdG9yRGF0YSA9IGxvYWRWZWN0b3JEYXRhIHx8IGxvYWRWZWN0b3JUaWxlO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB7fTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSB7fTtcbiAgICAgICAgdGhpcy5kZWR1cGVkID0gbmV3IERlZHVwZWRSZXF1ZXN0KGFjdG9yLnNjaGVkdWxlcik7XG4gICAgICAgIHRoaXMuaXNTcHJpdGVMb2FkZWQgPSBpc1Nwcml0ZUxvYWRlZDtcbiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBhY3Rvci5zY2hlZHVsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI2xvYWRUaWxlfS4gRGVsZWdhdGVzIHRvXG4gICAgICoge0BsaW5rIFZlY3RvclRpbGVXb3JrZXJTb3VyY2UjbG9hZFZlY3RvckRhdGF9ICh3aGljaCBieSBkZWZhdWx0IGV4cGVjdHNcbiAgICAgKiBhIGBwYXJhbXMudXJsYCBwcm9wZXJ0eSkgZm9yIGZldGNoaW5nIGFuZCBwcm9kdWNpbmcgYSBWZWN0b3JUaWxlIG9iamVjdC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGxvYWRUaWxlKHBhcmFtczogV29ya2VyVGlsZVBhcmFtZXRlcnMsIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgdWlkID0gcGFyYW1zLnVpZDtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UGFyYW0gPSBwYXJhbXMgJiYgcGFyYW1zLnJlcXVlc3Q7XG4gICAgICAgIGNvbnN0IHBlcmYgPSByZXF1ZXN0UGFyYW0gJiYgcmVxdWVzdFBhcmFtLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcblxuICAgICAgICBjb25zdCB3b3JrZXJUaWxlID0gdGhpcy5sb2FkaW5nW3VpZF0gPSBuZXcgV29ya2VyVGlsZShwYXJhbXMpO1xuICAgICAgICB3b3JrZXJUaWxlLmFib3J0ID0gdGhpcy5sb2FkVmVjdG9yRGF0YShwYXJhbXMsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGFib3J0ZWQgPSAhdGhpcy5sb2FkaW5nW3VpZF07XG5cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdbdWlkXTtcblxuICAgICAgICAgICAgaWYgKGFib3J0ZWQgfHwgZXJyIHx8ICFyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHdvcmtlclRpbGUuc3RhdHVzID0gJ2RvbmUnO1xuICAgICAgICAgICAgICAgIGlmICghYWJvcnRlZCkgdGhpcy5sb2FkZWRbdWlkXSA9IHdvcmtlclRpbGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJhd1RpbGVEYXRhID0gcmVzcG9uc2UucmF3RGF0YTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlQ29udHJvbCA9IHt9O1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmV4cGlyZXMpIGNhY2hlQ29udHJvbC5leHBpcmVzID0gcmVzcG9uc2UuZXhwaXJlcztcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5jYWNoZUNvbnRyb2wpIGNhY2hlQ29udHJvbC5jYWNoZUNvbnRyb2wgPSByZXNwb25zZS5jYWNoZUNvbnRyb2w7XG5cbiAgICAgICAgICAgIC8vIHJlc3BvbnNlLnZlY3RvclRpbGUgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBHZW9KU09OIHdvcmtlciBjYXNlICh3aGljaCBpbmhlcml0cyBmcm9tIHRoaXMgY2xhc3MpXG4gICAgICAgICAgICAvLyBiZWNhdXNlIHdlIHN0dWIgdGhlIHZlY3RvciB0aWxlIGludGVyZmFjZSBhcm91bmQgSlNPTiBkYXRhIGluc3RlYWQgb2YgcGFyc2luZyBpdCBkaXJlY3RseVxuICAgICAgICAgICAgd29ya2VyVGlsZS52ZWN0b3JUaWxlID0gcmVzcG9uc2UudmVjdG9yVGlsZSB8fCBuZXcgdnQuVmVjdG9yVGlsZShuZXcgUHJvdG9idWYocmF3VGlsZURhdGEpKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlVGlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB3b3JrZXJUaWxlLnBhcnNlKHdvcmtlclRpbGUudmVjdG9yVGlsZSwgdGhpcy5sYXllckluZGV4LCB0aGlzLmF2YWlsYWJsZUltYWdlcywgdGhpcy5hY3RvciwgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgfHwgIXJlc3VsdCkgcmV0dXJuIGNhbGxiYWNrKGVycik7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VUaW1pbmcgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlcmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zZmVycmluZyBhIGNvcHkgb2YgcmF3VGlsZURhdGEgYmVjYXVzZSB0aGUgd29ya2VyIG5lZWRzIHRvIHJldGFpbiBpdHMgY29weS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVGltaW5nRGF0YSA9IGdldFBlcmZvcm1hbmNlTWVhc3VyZW1lbnQocmVxdWVzdFBhcmFtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgbmVjZXNzYXJ5IHRvIGV2YWwgdGhlIHJlc3VsdCBvZiBnZXRFbnRyaWVzQnlOYW1lKCkgaGVyZSB2aWEgcGFyc2Uvc3RyaW5naWZ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXRlIGV2YWx1YXRpb24gaW4gdGhlIG1haW4gdGhyZWFkIGNhdXNlcyBUeXBlRXJyb3I6IGlsbGVnYWwgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlVGltaW5nRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VUaW1pbmcucmVzb3VyY2VUaW1pbmcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlc291cmNlVGltaW5nRGF0YSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGV4dGVuZCh7cmF3VGlsZURhdGE6IHJhd1RpbGVEYXRhLnNsaWNlKDApfSwgcmVzdWx0LCBjYWNoZUNvbnRyb2wsIHJlc291cmNlVGltaW5nKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc1Nwcml0ZUxvYWRlZCkge1xuICAgICAgICAgICAgICAgIHBhcnNlVGlsZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2UoJ2lzU3ByaXRlTG9hZGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2hlZHVsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0ge3R5cGU6ICdwYXJzZVRpbGUnLCBpc1N5bWJvbFRpbGU6IHBhcmFtcy5pc1N5bWJvbFRpbGUsIHpvb206IHBhcmFtcy50aWxlWm9vbX07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlci5hZGQocGFyc2VUaWxlLCBtZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZVRpbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRoaXMubG9hZGVkIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5sb2FkZWRbdWlkXSA9IHdvcmtlclRpbGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNyZWxvYWRUaWxlfS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHJlbG9hZFRpbGUocGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLmxvYWRlZCxcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQsXG4gICAgICAgICAgICB2dFNvdXJjZSA9IHRoaXM7XG4gICAgICAgIGlmIChsb2FkZWQgJiYgbG9hZGVkW3VpZF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlclRpbGUgPSBsb2FkZWRbdWlkXTtcbiAgICAgICAgICAgIHdvcmtlclRpbGUuc2hvd0NvbGxpc2lvbkJveGVzID0gcGFyYW1zLnNob3dDb2xsaXNpb25Cb3hlcztcbiAgICAgICAgICAgIHdvcmtlclRpbGUuZW5hYmxlVGVycmFpbiA9ICEhcGFyYW1zLmVuYWJsZVRlcnJhaW47XG4gICAgICAgICAgICB3b3JrZXJUaWxlLnByb2plY3Rpb24gPSBwYXJhbXMucHJvamVjdGlvbjtcbiAgICAgICAgICAgIHdvcmtlclRpbGUudGlsZVRyYW5zZm9ybSA9IHRpbGVUcmFuc2Zvcm0ocGFyYW1zLnRpbGVJRC5jYW5vbmljYWwsIHBhcmFtcy5wcm9qZWN0aW9uKTtcblxuICAgICAgICAgICAgY29uc3QgZG9uZSA9IChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxvYWRDYWxsYmFjayA9IHdvcmtlclRpbGUucmVsb2FkQ2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgaWYgKHJlbG9hZENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3b3JrZXJUaWxlLnJlbG9hZENhbGxiYWNrO1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXJUaWxlLnBhcnNlKHdvcmtlclRpbGUudmVjdG9yVGlsZSwgdnRTb3VyY2UubGF5ZXJJbmRleCwgdGhpcy5hdmFpbGFibGVJbWFnZXMsIHZ0U291cmNlLmFjdG9yLCByZWxvYWRDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgZGF0YSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAod29ya2VyVGlsZS5zdGF0dXMgPT09ICdwYXJzaW5nJykge1xuICAgICAgICAgICAgICAgIHdvcmtlclRpbGUucmVsb2FkQ2FsbGJhY2sgPSBkb25lO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3b3JrZXJUaWxlLnN0YXR1cyA9PT0gJ2RvbmUnKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIG5vIHZlY3RvciB0aWxlIGRhdGEgb24gdGhlIGluaXRpYWwgbG9hZCwgZG9uJ3QgdHJ5IGFuZCByZS1wYXJzZSB0aWxlXG4gICAgICAgICAgICAgICAgaWYgKHdvcmtlclRpbGUudmVjdG9yVGlsZSkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXJUaWxlLnBhcnNlKHdvcmtlclRpbGUudmVjdG9yVGlsZSwgdGhpcy5sYXllckluZGV4LCB0aGlzLmF2YWlsYWJsZUltYWdlcywgdGhpcy5hY3RvciwgZG9uZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNhYm9ydFRpbGV9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwYXJhbSBwYXJhbXMudWlkIFRoZSBVSUQgZm9yIHRoaXMgdGlsZS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGFib3J0VGlsZShwYXJhbXM6IFRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHVpZCA9IHBhcmFtcy51aWQ7XG4gICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLmxvYWRpbmdbdWlkXTtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0KSB0aWxlLmFib3J0KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5sb2FkaW5nW3VpZF07XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRzIHtAbGluayBXb3JrZXJTb3VyY2UjcmVtb3ZlVGlsZX0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICogQHBhcmFtIHBhcmFtcy51aWQgVGhlIFVJRCBmb3IgdGhpcyB0aWxlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVtb3ZlVGlsZShwYXJhbXM6IFRpbGVQYXJhbWV0ZXJzLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMubG9hZGVkLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgZGVsZXRlIGxvYWRlZFt1aWRdO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWZWN0b3JUaWxlV29ya2VyU291cmNlO1xuIiwiLy8gQGZsb3dcbmV4cG9ydCBkZWZhdWx0IFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ21pbnpvb20nLCAnbWF4em9vbScsICdmaWx0ZXInLCAnbGF5b3V0J107XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuL3R5cGVzLmpzJztcblxuaW1wb3J0IHJlZlByb3BlcnRpZXMgZnJvbSAnLi91dGlsL3JlZl9wcm9wZXJ0aWVzLmpzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgfHwgb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsKVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgbGV0IHN0ciA9ICdbJztcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2Ygb2JqKSB7XG4gICAgICAgICAgICBzdHIgKz0gYCR7c3RyaW5naWZ5KHZhbCl9LGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3N0cn1dYDtcbiAgICB9XG5cbiAgICBsZXQgc3RyID0gJ3snO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikuc29ydCgpKSB7XG4gICAgICAgIHN0ciArPSBgJHtrZXl9OiR7c3RyaW5naWZ5KChvYmo6IGFueSlba2V5XSl9LGA7XG4gICAgfVxuICAgIHJldHVybiBgJHtzdHJ9fWA7XG59XG5cbmZ1bmN0aW9uIGdldEtleShsYXllcikge1xuICAgIGxldCBrZXkgPSAnJztcbiAgICBmb3IgKGNvbnN0IGsgb2YgcmVmUHJvcGVydGllcykge1xuICAgICAgICBrZXkgKz0gYC8ke3N0cmluZ2lmeSgobGF5ZXI6IGFueSlba10pfWA7XG4gICAgfVxuICAgIHJldHVybiBrZXk7XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgbGF5ZXJzLCByZXR1cm4gYW4gYXJyYXkgb2YgYXJyYXlzIG9mIGxheWVycyB3aGVyZSBhbGxcbiAqIGxheWVycyBpbiBlYWNoIGdyb3VwIGhhdmUgaWRlbnRpY2FsIGxheW91dC1hZmZlY3RpbmcgcHJvcGVydGllcy4gVGhlc2VcbiAqIGFyZSB0aGUgcHJvcGVydGllcyB0aGF0IHdlcmUgZm9ybWVybHkgdXNlZCBieSBleHBsaWNpdCBgcmVmYCBtZWNoYW5pc21cbiAqIGZvciBsYXllcnM6ICd0eXBlJywgJ3NvdXJjZScsICdzb3VyY2UtbGF5ZXInLCAnbWluem9vbScsICdtYXh6b29tJyxcbiAqICdmaWx0ZXInLCBhbmQgJ2xheW91dCcuXG4gKlxuICogVGhlIGlucHV0IGlzIG5vdCBtb2RpZmllZC4gVGhlIG91dHB1dCBsYXllcnMgYXJlIHJlZmVyZW5jZXMgdG8gdGhlXG4gKiBpbnB1dCBsYXllcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXk8TGF5ZXI+fSBsYXllcnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbY2FjaGVkS2V5c10gLSBhbiBvYmplY3QgdG8ga2VlcCBhbHJlYWR5IGNhbGN1bGF0ZWQga2V5cy5cbiAqIEByZXR1cm5zIHtBcnJheTxBcnJheTxMYXllcj4+fVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBncm91cEJ5TGF5b3V0KGxheWVyczogQXJyYXk8TGF5ZXJTcGVjaWZpY2F0aW9uPiwgY2FjaGVkS2V5czoge1tpZDogc3RyaW5nXTogc3RyaW5nfSk6IEFycmF5PEFycmF5PExheWVyU3BlY2lmaWNhdGlvbj4+IHtcbiAgICBjb25zdCBncm91cHMgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgY29uc3QgayA9IChjYWNoZWRLZXlzICYmIGNhY2hlZEtleXNbbGF5ZXJzW2ldLmlkXSkgfHwgZ2V0S2V5KGxheWVyc1tpXSk7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgY2FjaGUgaWYgdGhlcmUgaXMgb25lXG4gICAgICAgIGlmIChjYWNoZWRLZXlzKVxuICAgICAgICAgICAgY2FjaGVkS2V5c1tsYXllcnNbaV0uaWRdID0gaztcblxuICAgICAgICBsZXQgZ3JvdXAgPSBncm91cHNba107XG4gICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgIGdyb3VwID0gZ3JvdXBzW2tdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAucHVzaChsYXllcnNbaV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBrIGluIGdyb3Vwcykge1xuICAgICAgICByZXN1bHQucHVzaChncm91cHNba10pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgY3JlYXRlU3R5bGVMYXllciBmcm9tICcuL2NyZWF0ZV9zdHlsZV9sYXllci5qcyc7XG5cbmltcG9ydCB7dmFsdWVzfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IGdyb3VwQnlMYXlvdXQgZnJvbSAnLi4vc3R5bGUtc3BlYy9ncm91cF9ieV9sYXlvdXQuanMnO1xuXG5pbXBvcnQgdHlwZSB7VHlwZWRTdHlsZUxheWVyfSBmcm9tICcuL3N0eWxlX2xheWVyL3R5cGVkX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIHtMYXllclNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSBMYXllckNvbmZpZ3MgPSB7W186IHN0cmluZ106IExheWVyU3BlY2lmaWNhdGlvbiB9O1xuZXhwb3J0IHR5cGUgRmFtaWx5PExheWVyOiBUeXBlZFN0eWxlTGF5ZXI+ID0gQXJyYXk8TGF5ZXI+O1xuXG5jbGFzcyBTdHlsZUxheWVySW5kZXgge1xuICAgIGZhbWlsaWVzQnlTb3VyY2U6IHsgW3NvdXJjZTogc3RyaW5nXTogeyBbc291cmNlTGF5ZXI6IHN0cmluZ106IEFycmF5PEZhbWlseTxUeXBlZFN0eWxlTGF5ZXI+PiB9IH07XG4gICAga2V5Q2FjaGU6IHsgW3NvdXJjZTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgICBfbGF5ZXJDb25maWdzOiBMYXllckNvbmZpZ3M7XG4gICAgX2xheWVyczoge1tfOiBzdHJpbmddOiBUeXBlZFN0eWxlTGF5ZXIgfTtcblxuICAgIGNvbnN0cnVjdG9yKGxheWVyQ29uZmlnczogP0FycmF5PExheWVyU3BlY2lmaWNhdGlvbj4pIHtcbiAgICAgICAgdGhpcy5rZXlDYWNoZSA9IHt9O1xuICAgICAgICBpZiAobGF5ZXJDb25maWdzKSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2UobGF5ZXJDb25maWdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlcGxhY2UobGF5ZXJDb25maWdzOiBBcnJheTxMYXllclNwZWNpZmljYXRpb24+KSB7XG4gICAgICAgIHRoaXMuX2xheWVyQ29uZmlncyA9IHt9O1xuICAgICAgICB0aGlzLl9sYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy51cGRhdGUobGF5ZXJDb25maWdzLCBbXSk7XG4gICAgfVxuXG4gICAgdXBkYXRlKGxheWVyQ29uZmlnczogQXJyYXk8TGF5ZXJTcGVjaWZpY2F0aW9uPiwgcmVtb3ZlZElkczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyQ29uZmlnIG9mIGxheWVyQ29uZmlncykge1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJDb25maWdzW2xheWVyQ29uZmlnLmlkXSA9IGxheWVyQ29uZmlnO1xuXG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllckNvbmZpZy5pZF0gPSAoKGNyZWF0ZVN0eWxlTGF5ZXIobGF5ZXJDb25maWcpOiBhbnkpOiBUeXBlZFN0eWxlTGF5ZXIpO1xuICAgICAgICAgICAgbGF5ZXIuY29tcGlsZUZpbHRlcigpO1xuICAgICAgICAgICAgaWYgKHRoaXMua2V5Q2FjaGVbbGF5ZXJDb25maWcuaWRdKVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmtleUNhY2hlW2xheWVyQ29uZmlnLmlkXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHJlbW92ZWRJZHMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmtleUNhY2hlW2lkXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllckNvbmZpZ3NbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZhbWlsaWVzQnlTb3VyY2UgPSB7fTtcblxuICAgICAgICBjb25zdCBncm91cHMgPSBncm91cEJ5TGF5b3V0KHZhbHVlcyh0aGlzLl9sYXllckNvbmZpZ3MpLCB0aGlzLmtleUNhY2hlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxheWVyQ29uZmlncyBvZiBncm91cHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVycyA9IGxheWVyQ29uZmlncy5tYXAoKGxheWVyQ29uZmlnKSA9PiB0aGlzLl9sYXllcnNbbGF5ZXJDb25maWcuaWRdKTtcblxuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBsYXllcnNbMF07XG4gICAgICAgICAgICBpZiAobGF5ZXIudmlzaWJpbGl0eSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUlkID0gbGF5ZXIuc291cmNlIHx8ICcnO1xuICAgICAgICAgICAgbGV0IHNvdXJjZUdyb3VwID0gdGhpcy5mYW1pbGllc0J5U291cmNlW3NvdXJjZUlkXTtcbiAgICAgICAgICAgIGlmICghc291cmNlR3JvdXApIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VHcm91cCA9IHRoaXMuZmFtaWxpZXNCeVNvdXJjZVtzb3VyY2VJZF0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJJZCA9IGxheWVyLnNvdXJjZUxheWVyIHx8ICdfZ2VvanNvblRpbGVMYXllcic7XG4gICAgICAgICAgICBsZXQgc291cmNlTGF5ZXJGYW1pbGllcyA9IHNvdXJjZUdyb3VwW3NvdXJjZUxheWVySWRdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VMYXllckZhbWlsaWVzKSB7XG4gICAgICAgICAgICAgICAgc291cmNlTGF5ZXJGYW1pbGllcyA9IHNvdXJjZUdyb3VwW3NvdXJjZUxheWVySWRdID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNvdXJjZUxheWVyRmFtaWxpZXMucHVzaChsYXllcnMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTdHlsZUxheWVySW5kZXg7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgREVNRGF0YSBmcm9tICcuLi9kYXRhL2RlbV9kYXRhLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cuanMnO1xuXG5pbXBvcnQgdHlwZSBBY3RvciBmcm9tICcuLi91dGlsL2FjdG9yLmpzJztcbmltcG9ydCB0eXBlIHtXb3JrZXJERU1UaWxlUGFyYW1ldGVycywgV29ya2VyREVNVGlsZUNhbGxiYWNrfSBmcm9tICcuL3dvcmtlcl9zb3VyY2UuanMnO1xuXG5jbGFzcyBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlIHtcbiAgICBhY3RvcjogQWN0b3I7XG4gICAgb2Zmc2NyZWVuQ2FudmFzOiBPZmZzY3JlZW5DYW52YXM7XG4gICAgb2Zmc2NyZWVuQ2FudmFzQ29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gICAgbG9hZFRpbGUocGFyYW1zOiBXb3JrZXJERU1UaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlckRFTVRpbGVDYWxsYmFjaykge1xuICAgICAgICBjb25zdCB7dWlkLCBlbmNvZGluZywgcmF3SW1hZ2VEYXRhLCBwYWRkaW5nLCBidWlsZFF1YWRUcmVlfSA9IHBhcmFtcztcbiAgICAgICAgLy8gTWFpbiB0aHJlYWQgd2lsbCB0cmFuc2ZlciBJbWFnZUJpdG1hcCBpZiBvZmZzY3JlZW4gZGVjb2RlIHdpdGggT2Zmc2NyZWVuQ2FudmFzIGlzIHN1cHBvcnRlZCwgZWxzZSBpdCB3aWxsIHRyYW5zZmVyIGFuIGFscmVhZHkgZGVjb2RlZCBpbWFnZS5cbiAgICAgICAgLy8gRmxvdyBzdHJ1Z2dsZXMgdG8gcmVmaW5lIEltYWdlQml0bWFwIHR5cGUsIGxpa2VseSBkdWUgdG8gdGhlIEpTRG9tIHNoaW1cbiAgICAgICAgY29uc3QgaW1hZ2VQaXhlbHMgPSB3aW5kb3cuSW1hZ2VCaXRtYXAgJiYgcmF3SW1hZ2VEYXRhIGluc3RhbmNlb2Ygd2luZG93LkltYWdlQml0bWFwID8gdGhpcy5nZXRJbWFnZURhdGEocmF3SW1hZ2VEYXRhLCBwYWRkaW5nKSA6ICgocmF3SW1hZ2VEYXRhOiBhbnkpOiBJbWFnZURhdGEpO1xuICAgICAgICBjb25zdCBkZW0gPSBuZXcgREVNRGF0YSh1aWQsIGltYWdlUGl4ZWxzLCBlbmNvZGluZywgcGFkZGluZyA8IDEsIGJ1aWxkUXVhZFRyZWUpO1xuICAgICAgICBjYWxsYmFjayhudWxsLCBkZW0pO1xuICAgIH1cblxuICAgIGdldEltYWdlRGF0YShpbWdCaXRtYXA6IEltYWdlQml0bWFwLCBwYWRkaW5nOiBudW1iZXIpOiBJbWFnZURhdGEge1xuICAgICAgICAvLyBMYXppbHkgaW5pdGlhbGl6ZSBPZmZzY3JlZW5DYW52YXNcbiAgICAgICAgaWYgKCF0aGlzLm9mZnNjcmVlbkNhbnZhcyB8fCAhdGhpcy5vZmZzY3JlZW5DYW52YXNDb250ZXh0KSB7XG4gICAgICAgICAgICAvLyBEZW0gdGlsZXMgYXJlIHR5cGljYWxseSAyNTZ4MjU2XG4gICAgICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoaW1nQml0bWFwLndpZHRoLCBpbWdCaXRtYXAuaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2NyZWVuQ2FudmFzQ29udGV4dCA9IHRoaXMub2Zmc2NyZWVuQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhcy53aWR0aCA9IGltZ0JpdG1hcC53aWR0aDtcbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DYW52YXMuaGVpZ2h0ID0gaW1nQml0bWFwLmhlaWdodDtcblxuICAgICAgICB0aGlzLm9mZnNjcmVlbkNhbnZhc0NvbnRleHQuZHJhd0ltYWdlKGltZ0JpdG1hcCwgMCwgMCwgaW1nQml0bWFwLndpZHRoLCBpbWdCaXRtYXAuaGVpZ2h0KTtcbiAgICAgICAgLy8gSW5zZXJ0IG9yIHJlbW92ZSBkZWZpbmVkIHBhZGRpbmcgYXJvdW5kIHRoZSBpbWFnZSB0byBhbGxvdyBiYWNrZmlsbGluZyBmb3IgbmVpZ2hib3JpbmcgZGF0YS5cbiAgICAgICAgY29uc3QgaW1nRGF0YSA9IHRoaXMub2Zmc2NyZWVuQ2FudmFzQ29udGV4dC5nZXRJbWFnZURhdGEoLXBhZGRpbmcsIC1wYWRkaW5nLCBpbWdCaXRtYXAud2lkdGggKyAyICogcGFkZGluZywgaW1nQml0bWFwLmhlaWdodCArIDIgKiBwYWRkaW5nKTtcbiAgICAgICAgdGhpcy5vZmZzY3JlZW5DYW52YXNDb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLm9mZnNjcmVlbkNhbnZhcy53aWR0aCwgdGhpcy5vZmZzY3JlZW5DYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIGltZ0RhdGE7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlO1xuIiwiXG5tb2R1bGUuZXhwb3J0cyA9IHJld2luZDtcblxuZnVuY3Rpb24gcmV3aW5kKGdqLCBvdXRlcikge1xuICAgIHZhciB0eXBlID0gZ2ogJiYgZ2oudHlwZSwgaTtcblxuICAgIGlmICh0eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnai5mZWF0dXJlcy5sZW5ndGg7IGkrKykgcmV3aW5kKGdqLmZlYXR1cmVzW2ldLCBvdXRlcik7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnai5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKSByZXdpbmQoZ2ouZ2VvbWV0cmllc1tpXSwgb3V0ZXIpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgcmV3aW5kKGdqLmdlb21ldHJ5LCBvdXRlcik7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICByZXdpbmRSaW5ncyhnai5jb29yZGluYXRlcywgb3V0ZXIpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2ouY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHJld2luZFJpbmdzKGdqLmNvb3JkaW5hdGVzW2ldLCBvdXRlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdqO1xufVxuXG5mdW5jdGlvbiByZXdpbmRSaW5ncyhyaW5ncywgb3V0ZXIpIHtcbiAgICBpZiAocmluZ3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICByZXdpbmRSaW5nKHJpbmdzWzBdLCBvdXRlcik7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXdpbmRSaW5nKHJpbmdzW2ldLCAhb3V0ZXIpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmV3aW5kUmluZyhyaW5nLCBkaXIpIHtcbiAgICB2YXIgYXJlYSA9IDAsIGVyciA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMTsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICB2YXIgayA9IChyaW5nW2ldWzBdIC0gcmluZ1tqXVswXSkgKiAocmluZ1tqXVsxXSArIHJpbmdbaV1bMV0pO1xuICAgICAgICB2YXIgbSA9IGFyZWEgKyBrO1xuICAgICAgICBlcnIgKz0gTWF0aC5hYnMoYXJlYSkgPj0gTWF0aC5hYnMoaykgPyBhcmVhIC0gbSArIGsgOiBrIC0gbSArIGFyZWE7XG4gICAgICAgIGFyZWEgPSBtO1xuICAgIH1cbiAgICBpZiAoYXJlYSArIGVyciA+PSAwICE9PSAhIWRpcikgcmluZy5yZXZlcnNlKCk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmltcG9ydCBtdnQgZnJvbSAnQG1hcGJveC92ZWN0b3ItdGlsZSc7XG5jb25zdCB0b0dlb0pTT04gPSBtdnQuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTjtcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQuanMnO1xuXG4vLyBUaGUgZmVhdHVyZSB0eXBlIHVzZWQgYnkgZ2VvanNvbi12dCBhbmQgc3VwZXJjbHVzdGVyLiBTaG91bGQgYmUgZXh0cmFjdGVkIHRvXG4vLyBnbG9iYWwgdHlwZSBhbmQgdXNlZCBpbiBtb2R1bGUgZGVmaW5pdGlvbnMgZm9yIHRob3NlIHR3byBtb2R1bGVzLlxudHlwZSBGZWF0dXJlID0ge1xuICAgIHR5cGU6IDEsXG4gICAgaWQ6IG1peGVkLFxuICAgIHRhZ3M6IHtbXzogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbn0sXG4gICAgZ2VvbWV0cnk6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LFxufSB8IHtcbiAgICB0eXBlOiAyIHwgMyxcbiAgICBpZDogbWl4ZWQsXG4gICAgdGFnczoge1tfOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFufSxcbiAgICBnZW9tZXRyeTogQXJyYXk8QXJyYXk8W251bWJlciwgbnVtYmVyXT4+LFxufVxuXG5jbGFzcyBGZWF0dXJlV3JhcHBlciBpbXBsZW1lbnRzIFZlY3RvclRpbGVGZWF0dXJlIHtcbiAgICBfZmVhdHVyZTogRmVhdHVyZTtcblxuICAgIGV4dGVudDogbnVtYmVyO1xuICAgIHR5cGU6IDEgfCAyIHwgMztcbiAgICBpZDogbnVtYmVyO1xuICAgIHByb3BlcnRpZXM6IHtbXzogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbn07XG5cbiAgICBjb25zdHJ1Y3RvcihmZWF0dXJlOiBGZWF0dXJlKSB7XG4gICAgICAgIHRoaXMuX2ZlYXR1cmUgPSBmZWF0dXJlO1xuXG4gICAgICAgIHRoaXMuZXh0ZW50ID0gRVhURU5UO1xuICAgICAgICB0aGlzLnR5cGUgPSBmZWF0dXJlLnR5cGU7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IGZlYXR1cmUudGFncztcblxuICAgICAgICAvLyBJZiB0aGUgZmVhdHVyZSBoYXMgYSB0b3AtbGV2ZWwgYGlkYCBwcm9wZXJ0eSwgY29weSBpdCBvdmVyLCBidXQgb25seVxuICAgICAgICAvLyBpZiBpdCBjYW4gYmUgY29lcmNlZCB0byBhbiBpbnRlZ2VyLCBiZWNhdXNlIHRoaXMgd3JhcHBlciBpcyB1c2VkIGZvclxuICAgICAgICAvLyBzZXJpYWxpemluZyBnZW9qc29uIGZlYXR1cmUgZGF0YSBpbnRvIHZlY3RvciB0aWxlIFBCRiBkYXRhLCBhbmQgdGhlXG4gICAgICAgIC8vIHZlY3RvciB0aWxlIHNwZWMgb25seSBzdXBwb3J0cyBpbnRlZ2VyIHZhbHVlcyBmb3IgZmVhdHVyZSBpZHMgLS1cbiAgICAgICAgLy8gYWxsb3dpbmcgbm9uLWludGVnZXIgdmFsdWVzIGhlcmUgcmVzdWx0cyBpbiBhIG5vbi1jb21wbGlhbnQgUEJGXG4gICAgICAgIC8vIHRoYXQgY2F1c2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGlzIHBhcnNlZCB3aXRoIHZlY3Rvci10aWxlLWpzXG4gICAgICAgIGlmICgnaWQnIGluIGZlYXR1cmUgJiYgIWlzTmFOKGZlYXR1cmUuaWQpKSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gcGFyc2VJbnQoZmVhdHVyZS5pZCwgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZEdlb21ldHJ5KCkge1xuICAgICAgICBpZiAodGhpcy5fZmVhdHVyZS50eXBlID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludCBvZiB0aGlzLl9mZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkucHVzaChbbmV3IFBvaW50KHBvaW50WzBdLCBwb2ludFsxXSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgdGhpcy5fZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1JpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChwb2ludFswXSwgcG9pbnRbMV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnkucHVzaChuZXdSaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvR2VvSlNPTih4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0b0dlb0pTT04uY2FsbCh0aGlzLCB4LCB5LCB6KTtcbiAgICB9XG59XG5cbmNsYXNzIEdlb0pTT05XcmFwcGVyIGltcGxlbWVudHMgVmVjdG9yVGlsZSwgVmVjdG9yVGlsZUxheWVyIHtcbiAgICBsYXllcnM6IHtbXzogc3RyaW5nXTogVmVjdG9yVGlsZUxheWVyfTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZXh0ZW50OiBudW1iZXI7XG4gICAgbGVuZ3RoOiBudW1iZXI7XG4gICAgX2ZlYXR1cmVzOiBBcnJheTxGZWF0dXJlPjtcblxuICAgIGNvbnN0cnVjdG9yKGZlYXR1cmVzOiBBcnJheTxGZWF0dXJlPikge1xuICAgICAgICB0aGlzLmxheWVycyA9IHsnX2dlb2pzb25UaWxlTGF5ZXInOiB0aGlzfTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ19nZW9qc29uVGlsZUxheWVyJztcbiAgICAgICAgdGhpcy5leHRlbnQgPSBFWFRFTlQ7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLl9mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICAgIH1cblxuICAgIGZlYXR1cmUoaTogbnVtYmVyKTogVmVjdG9yVGlsZUZlYXR1cmUge1xuICAgICAgICByZXR1cm4gbmV3IEZlYXR1cmVXcmFwcGVyKHRoaXMuX2ZlYXR1cmVzW2ldKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlb0pTT05XcmFwcGVyO1xuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknKVxudmFyIFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnQG1hcGJveC92ZWN0b3ItdGlsZScpLlZlY3RvclRpbGVGZWF0dXJlXG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTldyYXBwZXJcblxuLy8gY29uZm9ybSB0byB2ZWN0b3J0aWxlIGFwaVxuZnVuY3Rpb24gR2VvSlNPTldyYXBwZXIgKGZlYXR1cmVzLCBvcHRpb25zKSB7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzXG4gIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoXG59XG5cbkdlb0pTT05XcmFwcGVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24gKGkpIHtcbiAgcmV0dXJuIG5ldyBGZWF0dXJlV3JhcHBlcih0aGlzLmZlYXR1cmVzW2ldLCB0aGlzLm9wdGlvbnMuZXh0ZW50KVxufVxuXG5mdW5jdGlvbiBGZWF0dXJlV3JhcHBlciAoZmVhdHVyZSwgZXh0ZW50KSB7XG4gIHRoaXMuaWQgPSB0eXBlb2YgZmVhdHVyZS5pZCA9PT0gJ251bWJlcicgPyBmZWF0dXJlLmlkIDogdW5kZWZpbmVkXG4gIHRoaXMudHlwZSA9IGZlYXR1cmUudHlwZVxuICB0aGlzLnJhd0dlb21ldHJ5ID0gZmVhdHVyZS50eXBlID09PSAxID8gW2ZlYXR1cmUuZ2VvbWV0cnldIDogZmVhdHVyZS5nZW9tZXRyeVxuICB0aGlzLnByb3BlcnRpZXMgPSBmZWF0dXJlLnRhZ3NcbiAgdGhpcy5leHRlbnQgPSBleHRlbnQgfHwgNDA5NlxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcmluZ3MgPSB0aGlzLnJhd0dlb21ldHJ5XG4gIHRoaXMuZ2VvbWV0cnkgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG4gICAgdmFyIG5ld1JpbmcgPSBbXVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChyaW5nW2pdWzBdLCByaW5nW2pdWzFdKSlcbiAgICB9XG4gICAgdGhpcy5nZW9tZXRyeS5wdXNoKG5ld1JpbmcpXG4gIH1cbiAgcmV0dXJuIHRoaXMuZ2VvbWV0cnlcbn1cblxuRmVhdHVyZVdyYXBwZXIucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5nZW9tZXRyeSkgdGhpcy5sb2FkR2VvbWV0cnkoKVxuXG4gIHZhciByaW5ncyA9IHRoaXMuZ2VvbWV0cnlcbiAgdmFyIHgxID0gSW5maW5pdHlcbiAgdmFyIHgyID0gLUluZmluaXR5XG4gIHZhciB5MSA9IEluZmluaXR5XG4gIHZhciB5MiA9IC1JbmZpbml0eVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmluZyA9IHJpbmdzW2ldXG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBjb29yZCA9IHJpbmdbal1cblxuICAgICAgeDEgPSBNYXRoLm1pbih4MSwgY29vcmQueClcbiAgICAgIHgyID0gTWF0aC5tYXgoeDIsIGNvb3JkLngpXG4gICAgICB5MSA9IE1hdGgubWluKHkxLCBjb29yZC55KVxuICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY29vcmQueSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXVxufVxuXG5GZWF0dXJlV3JhcHBlci5wcm90b3R5cGUudG9HZW9KU09OID0gVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTlxuIiwidmFyIFBiZiA9IHJlcXVpcmUoJ3BiZicpXG52YXIgR2VvSlNPTldyYXBwZXIgPSByZXF1aXJlKCcuL2xpYi9nZW9qc29uX3dyYXBwZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZyb21WZWN0b3JUaWxlSnNcbm1vZHVsZS5leHBvcnRzLmZyb21WZWN0b3JUaWxlSnMgPSBmcm9tVmVjdG9yVGlsZUpzXG5tb2R1bGUuZXhwb3J0cy5mcm9tR2VvanNvblZ0ID0gZnJvbUdlb2pzb25WdFxubW9kdWxlLmV4cG9ydHMuR2VvSlNPTldyYXBwZXIgPSBHZW9KU09OV3JhcHBlclxuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIHZlY3Rvci10aWxlLWpzLWNyZWF0ZWQgdGlsZSB0byBwYmZcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGlsZVxuICogQHJldHVybiB7QnVmZmVyfSB1bmNvbXByZXNzZWQsIHBiZi1zZXJpYWxpemVkIHRpbGUgZGF0YVxuICovXG5mdW5jdGlvbiBmcm9tVmVjdG9yVGlsZUpzICh0aWxlKSB7XG4gIHZhciBvdXQgPSBuZXcgUGJmKClcbiAgd3JpdGVUaWxlKHRpbGUsIG91dClcbiAgcmV0dXJuIG91dC5maW5pc2goKVxufVxuXG4vKipcbiAqIFNlcmlhbGl6ZWQgYSBnZW9qc29uLXZ0LWNyZWF0ZWQgdGlsZSB0byBwYmYuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGxheWVycyAtIEFuIG9iamVjdCBtYXBwaW5nIGxheWVyIG5hbWVzIHRvIGdlb2pzb24tdnQtY3JlYXRlZCB2ZWN0b3IgdGlsZSBvYmplY3RzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQW4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIHZlY3Rvci10aWxlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBhbmQgZXh0ZW50IHRoYXQgd2VyZSB1c2VkIHRvIGNyZWF0ZSBgbGF5ZXJzYC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52ZXJzaW9uPTFdIC0gVmVyc2lvbiBvZiB2ZWN0b3ItdGlsZSBzcGVjIHVzZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5leHRlbnQ9NDA5Nl0gLSBFeHRlbnQgb2YgdGhlIHZlY3RvciB0aWxlXG4gKiBAcmV0dXJuIHtCdWZmZXJ9IHVuY29tcHJlc3NlZCwgcGJmLXNlcmlhbGl6ZWQgdGlsZSBkYXRhXG4gKi9cbmZ1bmN0aW9uIGZyb21HZW9qc29uVnQgKGxheWVycywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICB2YXIgbCA9IHt9XG4gIGZvciAodmFyIGsgaW4gbGF5ZXJzKSB7XG4gICAgbFtrXSA9IG5ldyBHZW9KU09OV3JhcHBlcihsYXllcnNba10uZmVhdHVyZXMsIG9wdGlvbnMpXG4gICAgbFtrXS5uYW1lID0ga1xuICAgIGxba10udmVyc2lvbiA9IG9wdGlvbnMudmVyc2lvblxuICAgIGxba10uZXh0ZW50ID0gb3B0aW9ucy5leHRlbnRcbiAgfVxuICByZXR1cm4gZnJvbVZlY3RvclRpbGVKcyh7IGxheWVyczogbCB9KVxufVxuXG5mdW5jdGlvbiB3cml0ZVRpbGUgKHRpbGUsIHBiZikge1xuICBmb3IgKHZhciBrZXkgaW4gdGlsZS5sYXllcnMpIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDMsIHdyaXRlTGF5ZXIsIHRpbGUubGF5ZXJzW2tleV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVMYXllciAobGF5ZXIsIHBiZikge1xuICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxNSwgbGF5ZXIudmVyc2lvbiB8fCAxKVxuICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCBsYXllci5uYW1lIHx8ICcnKVxuICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCBsYXllci5leHRlbnQgfHwgNDA5NilcblxuICB2YXIgaVxuICB2YXIgY29udGV4dCA9IHtcbiAgICBrZXlzOiBbXSxcbiAgICB2YWx1ZXM6IFtdLFxuICAgIGtleWNhY2hlOiB7fSxcbiAgICB2YWx1ZWNhY2hlOiB7fVxuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29udGV4dC5mZWF0dXJlID0gbGF5ZXIuZmVhdHVyZShpKVxuICAgIHBiZi53cml0ZU1lc3NhZ2UoMiwgd3JpdGVGZWF0dXJlLCBjb250ZXh0KVxuICB9XG5cbiAgdmFyIGtleXMgPSBjb250ZXh0LmtleXNcbiAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgzLCBrZXlzW2ldKVxuICB9XG5cbiAgdmFyIHZhbHVlcyA9IGNvbnRleHQudmFsdWVzXG4gIGZvciAoaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBwYmYud3JpdGVNZXNzYWdlKDQsIHdyaXRlVmFsdWUsIHZhbHVlc1tpXSlcbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZUZlYXR1cmUgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuXG4gIGlmIChmZWF0dXJlLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCgxLCBmZWF0dXJlLmlkKVxuICB9XG5cbiAgcGJmLndyaXRlTWVzc2FnZSgyLCB3cml0ZVByb3BlcnRpZXMsIGNvbnRleHQpXG4gIHBiZi53cml0ZVZhcmludEZpZWxkKDMsIGZlYXR1cmUudHlwZSlcbiAgcGJmLndyaXRlTWVzc2FnZSg0LCB3cml0ZUdlb21ldHJ5LCBmZWF0dXJlKVxufVxuXG5mdW5jdGlvbiB3cml0ZVByb3BlcnRpZXMgKGNvbnRleHQsIHBiZikge1xuICB2YXIgZmVhdHVyZSA9IGNvbnRleHQuZmVhdHVyZVxuICB2YXIga2V5cyA9IGNvbnRleHQua2V5c1xuICB2YXIgdmFsdWVzID0gY29udGV4dC52YWx1ZXNcbiAgdmFyIGtleWNhY2hlID0gY29udGV4dC5rZXljYWNoZVxuICB2YXIgdmFsdWVjYWNoZSA9IGNvbnRleHQudmFsdWVjYWNoZVxuXG4gIGZvciAodmFyIGtleSBpbiBmZWF0dXJlLnByb3BlcnRpZXMpIHtcbiAgICB2YXIgdmFsdWUgPSBmZWF0dXJlLnByb3BlcnRpZXNba2V5XVxuXG4gICAgdmFyIGtleUluZGV4ID0ga2V5Y2FjaGVba2V5XVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgY29udGludWUgLy8gZG9uJ3QgZW5jb2RlIG51bGwgdmFsdWUgcHJvcGVydGllc1xuXG4gICAgaWYgKHR5cGVvZiBrZXlJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGtleXMucHVzaChrZXkpXG4gICAgICBrZXlJbmRleCA9IGtleXMubGVuZ3RoIC0gMVxuICAgICAga2V5Y2FjaGVba2V5XSA9IGtleUluZGV4XG4gICAgfVxuICAgIHBiZi53cml0ZVZhcmludChrZXlJbmRleClcblxuICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHR5cGUgIT09ICdib29sZWFuJyAmJiB0eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgICB9XG4gICAgdmFyIHZhbHVlS2V5ID0gdHlwZSArICc6JyArIHZhbHVlXG4gICAgdmFyIHZhbHVlSW5kZXggPSB2YWx1ZWNhY2hlW3ZhbHVlS2V5XVxuICAgIGlmICh0eXBlb2YgdmFsdWVJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKVxuICAgICAgdmFsdWVJbmRleCA9IHZhbHVlcy5sZW5ndGggLSAxXG4gICAgICB2YWx1ZWNhY2hlW3ZhbHVlS2V5XSA9IHZhbHVlSW5kZXhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KHZhbHVlSW5kZXgpXG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWFuZCAoY21kLCBsZW5ndGgpIHtcbiAgcmV0dXJuIChsZW5ndGggPDwgMykgKyAoY21kICYgMHg3KVxufVxuXG5mdW5jdGlvbiB6aWd6YWcgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAxKSBeIChudW0gPj4gMzEpXG59XG5cbmZ1bmN0aW9uIHdyaXRlR2VvbWV0cnkgKGZlYXR1cmUsIHBiZikge1xuICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmxvYWRHZW9tZXRyeSgpXG4gIHZhciB0eXBlID0gZmVhdHVyZS50eXBlXG4gIHZhciB4ID0gMFxuICB2YXIgeSA9IDBcbiAgdmFyIHJpbmdzID0gZ2VvbWV0cnkubGVuZ3RoXG4gIGZvciAodmFyIHIgPSAwOyByIDwgcmluZ3M7IHIrKykge1xuICAgIHZhciByaW5nID0gZ2VvbWV0cnlbcl1cbiAgICB2YXIgY291bnQgPSAxXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgIGNvdW50ID0gcmluZy5sZW5ndGhcbiAgICB9XG4gICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMSwgY291bnQpKSAvLyBtb3ZldG9cbiAgICAvLyBkbyBub3Qgd3JpdGUgcG9seWdvbiBjbG9zaW5nIHBhdGggYXMgbGluZXRvXG4gICAgdmFyIGxpbmVDb3VudCA9IHR5cGUgPT09IDMgPyByaW5nLmxlbmd0aCAtIDEgOiByaW5nLmxlbmd0aFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHtcbiAgICAgIGlmIChpID09PSAxICYmIHR5cGUgIT09IDEpIHtcbiAgICAgICAgcGJmLndyaXRlVmFyaW50KGNvbW1hbmQoMiwgbGluZUNvdW50IC0gMSkpIC8vIGxpbmV0b1xuICAgICAgfVxuICAgICAgdmFyIGR4ID0gcmluZ1tpXS54IC0geFxuICAgICAgdmFyIGR5ID0gcmluZ1tpXS55IC0geVxuICAgICAgcGJmLndyaXRlVmFyaW50KHppZ3phZyhkeCkpXG4gICAgICBwYmYud3JpdGVWYXJpbnQoemlnemFnKGR5KSlcbiAgICAgIHggKz0gZHhcbiAgICAgIHkgKz0gZHlcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IDMpIHtcbiAgICAgIHBiZi53cml0ZVZhcmludChjb21tYW5kKDcsIDEpKSAvLyBjbG9zZXBhdGhcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVWYWx1ZSAodmFsdWUsIHBiZikge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZVxuICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCB2YWx1ZSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICBwYmYud3JpdGVCb29sZWFuRmllbGQoNywgdmFsdWUpXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodmFsdWUgJSAxICE9PSAwKSB7XG4gICAgICBwYmYud3JpdGVEb3VibGVGaWVsZCgzLCB2YWx1ZSlcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgcGJmLndyaXRlU1ZhcmludEZpZWxkKDYsIHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBwYmYud3JpdGVWYXJpbnRGaWVsZCg1LCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgcmlnaHQsIGRlcHRoKSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA8PSBub2RlU2l6ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgbSA9IChsZWZ0ICsgcmlnaHQpID4+IDE7XG5cbiAgICBzZWxlY3QoaWRzLCBjb29yZHMsIG0sIGxlZnQsIHJpZ2h0LCBkZXB0aCAlIDIpO1xuXG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbGVmdCwgbSAtIDEsIGRlcHRoICsgMSk7XG4gICAgc29ydEtEKGlkcywgY29vcmRzLCBub2RlU2l6ZSwgbSArIDEsIHJpZ2h0LCBkZXB0aCArIDEpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3QoaWRzLCBjb29yZHMsIGssIGxlZnQsIHJpZ2h0LCBpbmMpIHtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICAgICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICAgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHNlbGVjdChpZHMsIGNvb3JkcywgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGluYyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ID0gY29vcmRzWzIgKiBrICsgaW5jXTtcbiAgICAgICAgbGV0IGkgPSBsZWZ0O1xuICAgICAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvb3Jkc1syICogcmlnaHQgKyBpbmNdID4gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIHJpZ2h0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb29yZHNbMiAqIGkgKyBpbmNdIDwgdCkgaSsrO1xuICAgICAgICAgICAgd2hpbGUgKGNvb3Jkc1syICogaiArIGluY10gPiB0KSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29vcmRzWzIgKiBsZWZ0ICsgaW5jXSA9PT0gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIGopO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBqLCByaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwSXRlbShpZHMsIGNvb3JkcywgaSwgaikge1xuICAgIHN3YXAoaWRzLCBpLCBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGksIDIgKiBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGkgKyAxLCAyICogaiArIDEpO1xufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIGNvbnN0IHRtcCA9IGFycltpXTtcbiAgICBhcnJbaV0gPSBhcnJbal07XG4gICAgYXJyW2pdID0gdG1wO1xufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByYW5nZShpZHMsIGNvb3JkcywgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgbm9kZVNpemUpIHtcbiAgICBjb25zdCBzdGFjayA9IFswLCBpZHMubGVuZ3RoIC0gMSwgMF07XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgbGV0IHgsIHk7XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGF4aXMgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgY29uc3QgbGVmdCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPD0gbm9kZVNpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBsZWZ0OyBpIDw9IHJpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgICAgICB4ID0gY29vcmRzWzIgKiBpXTtcbiAgICAgICAgICAgICAgICB5ID0gY29vcmRzWzIgKiBpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKHggPj0gbWluWCAmJiB4IDw9IG1heFggJiYgeSA+PSBtaW5ZICYmIHkgPD0gbWF4WSkgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmICh4ID49IG1pblggJiYgeCA8PSBtYXhYICYmIHkgPj0gbWluWSAmJiB5IDw9IG1heFkpIHJlc3VsdC5wdXNoKGlkc1ttXSk7XG5cbiAgICAgICAgY29uc3QgbmV4dEF4aXMgPSAoYXhpcyArIDEpICUgMjtcblxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IG1pblggPD0geCA6IG1pblkgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBtYXhYID49IHggOiBtYXhZID49IHkpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSArIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChyaWdodCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdpdGhpbihpZHMsIGNvb3JkcywgcXgsIHF5LCByLCBub2RlU2l6ZSkge1xuICAgIGNvbnN0IHN0YWNrID0gWzAsIGlkcy5sZW5ndGggLSAxLCAwXTtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCByMiA9IHIgKiByO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBheGlzID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDw9IG5vZGVTaXplKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNxRGlzdChjb29yZHNbMiAqIGldLCBjb29yZHNbMiAqIGkgKyAxXSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcblxuICAgICAgICBjb25zdCB4ID0gY29vcmRzWzIgKiBtXTtcbiAgICAgICAgY29uc3QgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmIChzcURpc3QoeCwgeSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW21dKTtcblxuICAgICAgICBjb25zdCBuZXh0QXhpcyA9IChheGlzICsgMSkgJSAyO1xuXG4gICAgICAgIGlmIChheGlzID09PSAwID8gcXggLSByIDw9IHggOiBxeSAtIHIgPD0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChsZWZ0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobSAtIDEpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF4aXMgPT09IDAgPyBxeCArIHIgPj0geCA6IHF5ICsgciA+PSB5KSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG0gKyAxKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gocmlnaHQpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChuZXh0QXhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzcURpc3QoYXgsIGF5LCBieCwgYnkpIHtcbiAgICBjb25zdCBkeCA9IGF4IC0gYng7XG4gICAgY29uc3QgZHkgPSBheSAtIGJ5O1xuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cbiIsIlxuaW1wb3J0IHNvcnQgZnJvbSAnLi9zb3J0JztcbmltcG9ydCByYW5nZSBmcm9tICcuL3JhbmdlJztcbmltcG9ydCB3aXRoaW4gZnJvbSAnLi93aXRoaW4nO1xuXG5jb25zdCBkZWZhdWx0R2V0WCA9IHAgPT4gcFswXTtcbmNvbnN0IGRlZmF1bHRHZXRZID0gcCA9PiBwWzFdO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBLREJ1c2gge1xuICAgIGNvbnN0cnVjdG9yKHBvaW50cywgZ2V0WCA9IGRlZmF1bHRHZXRYLCBnZXRZID0gZGVmYXVsdEdldFksIG5vZGVTaXplID0gNjQsIEFycmF5VHlwZSA9IEZsb2F0NjRBcnJheSkge1xuICAgICAgICB0aGlzLm5vZGVTaXplID0gbm9kZVNpemU7XG4gICAgICAgIHRoaXMucG9pbnRzID0gcG9pbnRzO1xuXG4gICAgICAgIGNvbnN0IEluZGV4QXJyYXlUeXBlID0gcG9pbnRzLmxlbmd0aCA8IDY1NTM2ID8gVWludDE2QXJyYXkgOiBVaW50MzJBcnJheTtcblxuICAgICAgICBjb25zdCBpZHMgPSB0aGlzLmlkcyA9IG5ldyBJbmRleEFycmF5VHlwZShwb2ludHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5jb29yZHMgPSBuZXcgQXJyYXlUeXBlKHBvaW50cy5sZW5ndGggKiAyKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWRzW2ldID0gaTtcbiAgICAgICAgICAgIGNvb3Jkc1syICogaV0gPSBnZXRYKHBvaW50c1tpXSk7XG4gICAgICAgICAgICBjb29yZHNbMiAqIGkgKyAxXSA9IGdldFkocG9pbnRzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvcnQoaWRzLCBjb29yZHMsIG5vZGVTaXplLCAwLCBpZHMubGVuZ3RoIC0gMSwgMCk7XG4gICAgfVxuXG4gICAgcmFuZ2UobWluWCwgbWluWSwgbWF4WCwgbWF4WSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UodGhpcy5pZHMsIHRoaXMuY29vcmRzLCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB0aGlzLm5vZGVTaXplKTtcbiAgICB9XG5cbiAgICB3aXRoaW4oeCwgeSwgcikge1xuICAgICAgICByZXR1cm4gd2l0aGluKHRoaXMuaWRzLCB0aGlzLmNvb3JkcywgeCwgeSwgciwgdGhpcy5ub2RlU2l6ZSk7XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgS0RCdXNoIGZyb20gJ2tkYnVzaCc7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIG1pblpvb206IDAsICAgLy8gbWluIHpvb20gdG8gZ2VuZXJhdGUgY2x1c3RlcnMgb25cbiAgICBtYXhab29tOiAxNiwgIC8vIG1heCB6b29tIGxldmVsIHRvIGNsdXN0ZXIgdGhlIHBvaW50cyBvblxuICAgIG1pblBvaW50czogMiwgLy8gbWluaW11bSBwb2ludHMgdG8gZm9ybSBhIGNsdXN0ZXJcbiAgICByYWRpdXM6IDQwLCAgIC8vIGNsdXN0ZXIgcmFkaXVzIGluIHBpeGVsc1xuICAgIGV4dGVudDogNTEyLCAgLy8gdGlsZSBleHRlbnQgKHJhZGl1cyBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIGl0KVxuICAgIG5vZGVTaXplOiA2NCwgLy8gc2l6ZSBvZiB0aGUgS0QtdHJlZSBsZWFmIG5vZGUsIGFmZmVjdHMgcGVyZm9ybWFuY2VcbiAgICBsb2c6IGZhbHNlLCAgIC8vIHdoZXRoZXIgdG8gbG9nIHRpbWluZyBpbmZvXG5cbiAgICAvLyB3aGV0aGVyIHRvIGdlbmVyYXRlIG51bWVyaWMgaWRzIGZvciBpbnB1dCBmZWF0dXJlcyAoaW4gdmVjdG9yIHRpbGVzKVxuICAgIGdlbmVyYXRlSWQ6IGZhbHNlLFxuXG4gICAgLy8gYSByZWR1Y2UgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIGN1c3RvbSBjbHVzdGVyIHByb3BlcnRpZXNcbiAgICByZWR1Y2U6IG51bGwsIC8vIChhY2N1bXVsYXRlZCwgcHJvcHMpID0+IHsgYWNjdW11bGF0ZWQuc3VtICs9IHByb3BzLnN1bTsgfVxuXG4gICAgLy8gcHJvcGVydGllcyB0byB1c2UgZm9yIGluZGl2aWR1YWwgcG9pbnRzIHdoZW4gcnVubmluZyB0aGUgcmVkdWNlclxuICAgIG1hcDogcHJvcHMgPT4gcHJvcHMgLy8gcHJvcHMgPT4gKHtzdW06IHByb3BzLm15X3ZhbHVlfSlcbn07XG5cbmNvbnN0IGZyb3VuZCA9IE1hdGguZnJvdW5kIHx8ICh0bXAgPT4gKCh4KSA9PiB7IHRtcFswXSA9ICt4OyByZXR1cm4gdG1wWzBdOyB9KSkobmV3IEZsb2F0MzJBcnJheSgxKSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1cGVyY2x1c3RlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZShkZWZhdWx0T3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnRyZWVzID0gbmV3IEFycmF5KHRoaXMub3B0aW9ucy5tYXhab29tICsgMSk7XG4gICAgfVxuXG4gICAgbG9hZChwb2ludHMpIHtcbiAgICAgICAgY29uc3Qge2xvZywgbWluWm9vbSwgbWF4Wm9vbSwgbm9kZVNpemV9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICAgIGlmIChsb2cpIGNvbnNvbGUudGltZSgndG90YWwgdGltZScpO1xuXG4gICAgICAgIGNvbnN0IHRpbWVySWQgPSBgcHJlcGFyZSAkeyAgcG9pbnRzLmxlbmd0aCAgfSBwb2ludHNgO1xuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWUodGltZXJJZCk7XG5cbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG5cbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBjbHVzdGVyIG9iamVjdCBmb3IgZWFjaCBwb2ludCBhbmQgaW5kZXggaW5wdXQgcG9pbnRzIGludG8gYSBLRC10cmVlXG4gICAgICAgIGxldCBjbHVzdGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFwb2ludHNbaV0uZ2VvbWV0cnkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY2x1c3RlcnMucHVzaChjcmVhdGVQb2ludENsdXN0ZXIocG9pbnRzW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmVlc1ttYXhab29tICsgMV0gPSBuZXcgS0RCdXNoKGNsdXN0ZXJzLCBnZXRYLCBnZXRZLCBub2RlU2l6ZSwgRmxvYXQzMkFycmF5KTtcblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQodGltZXJJZCk7XG5cbiAgICAgICAgLy8gY2x1c3RlciBwb2ludHMgb24gbWF4IHpvb20sIHRoZW4gY2x1c3RlciB0aGUgcmVzdWx0cyBvbiBwcmV2aW91cyB6b29tLCBldGMuO1xuICAgICAgICAvLyByZXN1bHRzIGluIGEgY2x1c3RlciBoaWVyYXJjaHkgYWNyb3NzIHpvb20gbGV2ZWxzXG4gICAgICAgIGZvciAobGV0IHogPSBtYXhab29tOyB6ID49IG1pblpvb207IHotLSkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gK0RhdGUubm93KCk7XG5cbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBzZXQgb2YgY2x1c3RlcnMgZm9yIHRoZSB6b29tIGFuZCBpbmRleCB0aGVtIHdpdGggYSBLRC10cmVlXG4gICAgICAgICAgICBjbHVzdGVycyA9IHRoaXMuX2NsdXN0ZXIoY2x1c3RlcnMsIHopO1xuICAgICAgICAgICAgdGhpcy50cmVlc1t6XSA9IG5ldyBLREJ1c2goY2x1c3RlcnMsIGdldFgsIGdldFksIG5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xuXG4gICAgICAgICAgICBpZiAobG9nKSBjb25zb2xlLmxvZygneiVkOiAlZCBjbHVzdGVycyBpbiAlZG1zJywgeiwgY2x1c3RlcnMubGVuZ3RoLCArRGF0ZS5ub3coKSAtIG5vdyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQoJ3RvdGFsIHRpbWUnKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXRDbHVzdGVycyhiYm94LCB6b29tKSB7XG4gICAgICAgIGxldCBtaW5MbmcgPSAoKGJib3hbMF0gKyAxODApICUgMzYwICsgMzYwKSAlIDM2MCAtIDE4MDtcbiAgICAgICAgY29uc3QgbWluTGF0ID0gTWF0aC5tYXgoLTkwLCBNYXRoLm1pbig5MCwgYmJveFsxXSkpO1xuICAgICAgICBsZXQgbWF4TG5nID0gYmJveFsyXSA9PT0gMTgwID8gMTgwIDogKChiYm94WzJdICsgMTgwKSAlIDM2MCArIDM2MCkgJSAzNjAgLSAxODA7XG4gICAgICAgIGNvbnN0IG1heExhdCA9IE1hdGgubWF4KC05MCwgTWF0aC5taW4oOTAsIGJib3hbM10pKTtcblxuICAgICAgICBpZiAoYmJveFsyXSAtIGJib3hbMF0gPj0gMzYwKSB7XG4gICAgICAgICAgICBtaW5MbmcgPSAtMTgwO1xuICAgICAgICAgICAgbWF4TG5nID0gMTgwO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbkxuZyA+IG1heExuZykge1xuICAgICAgICAgICAgY29uc3QgZWFzdGVybkhlbSA9IHRoaXMuZ2V0Q2x1c3RlcnMoW21pbkxuZywgbWluTGF0LCAxODAsIG1heExhdF0sIHpvb20pO1xuICAgICAgICAgICAgY29uc3Qgd2VzdGVybkhlbSA9IHRoaXMuZ2V0Q2x1c3RlcnMoWy0xODAsIG1pbkxhdCwgbWF4TG5nLCBtYXhMYXRdLCB6b29tKTtcbiAgICAgICAgICAgIHJldHVybiBlYXN0ZXJuSGVtLmNvbmNhdCh3ZXN0ZXJuSGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyZWUgPSB0aGlzLnRyZWVzW3RoaXMuX2xpbWl0Wm9vbSh6b29tKV07XG4gICAgICAgIGNvbnN0IGlkcyA9IHRyZWUucmFuZ2UobG5nWChtaW5MbmcpLCBsYXRZKG1heExhdCksIGxuZ1gobWF4TG5nKSwgbGF0WShtaW5MYXQpKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSB0cmVlLnBvaW50c1tpZF07XG4gICAgICAgICAgICBjbHVzdGVycy5wdXNoKGMubnVtUG9pbnRzID8gZ2V0Q2x1c3RlckpTT04oYykgOiB0aGlzLnBvaW50c1tjLmluZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJzO1xuICAgIH1cblxuICAgIGdldENoaWxkcmVuKGNsdXN0ZXJJZCkge1xuICAgICAgICBjb25zdCBvcmlnaW5JZCA9IHRoaXMuX2dldE9yaWdpbklkKGNsdXN0ZXJJZCk7XG4gICAgICAgIGNvbnN0IG9yaWdpblpvb20gPSB0aGlzLl9nZXRPcmlnaW5ab29tKGNsdXN0ZXJJZCk7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gJ05vIGNsdXN0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGlkLic7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnRyZWVzW29yaWdpblpvb21dO1xuICAgICAgICBpZiAoIWluZGV4KSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuXG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IGluZGV4LnBvaW50c1tvcmlnaW5JZF07XG4gICAgICAgIGlmICghb3JpZ2luKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cpO1xuXG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLm9wdGlvbnMucmFkaXVzIC8gKHRoaXMub3B0aW9ucy5leHRlbnQgKiBNYXRoLnBvdygyLCBvcmlnaW5ab29tIC0gMSkpO1xuICAgICAgICBjb25zdCBpZHMgPSBpbmRleC53aXRoaW4ob3JpZ2luLngsIG9yaWdpbi55LCByKTtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBpbmRleC5wb2ludHNbaWRdO1xuICAgICAgICAgICAgaWYgKGMucGFyZW50SWQgPT09IGNsdXN0ZXJJZCkge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYy5udW1Qb2ludHMgPyBnZXRDbHVzdGVySlNPTihjKSA6IHRoaXMucG9pbnRzW2MuaW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyk7XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cblxuICAgIGdldExlYXZlcyhjbHVzdGVySWQsIGxpbWl0LCBvZmZzZXQpIHtcbiAgICAgICAgbGltaXQgPSBsaW1pdCB8fCAxMDtcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICAgICAgY29uc3QgbGVhdmVzID0gW107XG4gICAgICAgIHRoaXMuX2FwcGVuZExlYXZlcyhsZWF2ZXMsIGNsdXN0ZXJJZCwgbGltaXQsIG9mZnNldCwgMCk7XG5cbiAgICAgICAgcmV0dXJuIGxlYXZlcztcbiAgICB9XG5cbiAgICBnZXRUaWxlKHosIHgsIHkpIHtcbiAgICAgICAgY29uc3QgdHJlZSA9IHRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKHopXTtcbiAgICAgICAgY29uc3QgejIgPSBNYXRoLnBvdygyLCB6KTtcbiAgICAgICAgY29uc3Qge2V4dGVudCwgcmFkaXVzfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgcCA9IHJhZGl1cyAvIGV4dGVudDtcbiAgICAgICAgY29uc3QgdG9wID0gKHkgLSBwKSAvIHoyO1xuICAgICAgICBjb25zdCBib3R0b20gPSAoeSArIDEgKyBwKSAvIHoyO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSB7XG4gICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9hZGRUaWxlRmVhdHVyZXMoXG4gICAgICAgICAgICB0cmVlLnJhbmdlKCh4IC0gcCkgLyB6MiwgdG9wLCAoeCArIDEgKyBwKSAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgdHJlZS5wb2ludHMsIHgsIHksIHoyLCB0aWxlKTtcblxuICAgICAgICBpZiAoeCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWRkVGlsZUZlYXR1cmVzKFxuICAgICAgICAgICAgICAgIHRyZWUucmFuZ2UoMSAtIHAgLyB6MiwgdG9wLCAxLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCB6MiwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4ID09PSB6MiAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICB0cmVlLnJhbmdlKDAsIHRvcCwgcCAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCAtMSwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGUuZmVhdHVyZXMubGVuZ3RoID8gdGlsZSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20oY2x1c3RlcklkKSB7XG4gICAgICAgIGxldCBleHBhbnNpb25ab29tID0gdGhpcy5fZ2V0T3JpZ2luWm9vbShjbHVzdGVySWQpIC0gMTtcbiAgICAgICAgd2hpbGUgKGV4cGFuc2lvblpvb20gPD0gdGhpcy5vcHRpb25zLm1heFpvb20pIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbihjbHVzdGVySWQpO1xuICAgICAgICAgICAgZXhwYW5zaW9uWm9vbSsrO1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCAhPT0gMSkgYnJlYWs7XG4gICAgICAgICAgICBjbHVzdGVySWQgPSBjaGlsZHJlblswXS5wcm9wZXJ0aWVzLmNsdXN0ZXJfaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4cGFuc2lvblpvb207XG4gICAgfVxuXG4gICAgX2FwcGVuZExlYXZlcyhyZXN1bHQsIGNsdXN0ZXJJZCwgbGltaXQsIG9mZnNldCwgc2tpcHBlZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oY2x1c3RlcklkKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGNoaWxkLnByb3BlcnRpZXM7XG5cbiAgICAgICAgICAgIGlmIChwcm9wcyAmJiBwcm9wcy5jbHVzdGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNraXBwZWQgKyBwcm9wcy5wb2ludF9jb3VudCA8PSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgd2hvbGUgY2x1c3RlclxuICAgICAgICAgICAgICAgICAgICBza2lwcGVkICs9IHByb3BzLnBvaW50X2NvdW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVudGVyIHRoZSBjbHVzdGVyXG4gICAgICAgICAgICAgICAgICAgIHNraXBwZWQgPSB0aGlzLl9hcHBlbmRMZWF2ZXMocmVzdWx0LCBwcm9wcy5jbHVzdGVyX2lkLCBsaW1pdCwgb2Zmc2V0LCBza2lwcGVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhpdCB0aGUgY2x1c3RlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2tpcHBlZCA8IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIC8vIHNraXAgYSBzaW5nbGUgcG9pbnRcbiAgICAgICAgICAgICAgICBza2lwcGVkKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGFkZCBhIHNpbmdsZSBwb2ludFxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSBsaW1pdCkgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2tpcHBlZDtcbiAgICB9XG5cbiAgICBfYWRkVGlsZUZlYXR1cmVzKGlkcywgcG9pbnRzLCB4LCB5LCB6MiwgdGlsZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgaWRzKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29uc3QgaXNDbHVzdGVyID0gYy5udW1Qb2ludHM7XG5cbiAgICAgICAgICAgIGxldCB0YWdzLCBweCwgcHk7XG4gICAgICAgICAgICBpZiAoaXNDbHVzdGVyKSB7XG4gICAgICAgICAgICAgICAgdGFncyA9IGdldENsdXN0ZXJQcm9wZXJ0aWVzKGMpO1xuICAgICAgICAgICAgICAgIHB4ID0gYy54O1xuICAgICAgICAgICAgICAgIHB5ID0gYy55O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gdGhpcy5wb2ludHNbYy5pbmRleF07XG4gICAgICAgICAgICAgICAgdGFncyA9IHAucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICBweCA9IGxuZ1gocC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSk7XG4gICAgICAgICAgICAgICAgcHkgPSBsYXRZKHAuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IFtbXG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCAqIChweCAqIHoyIC0geCkpLFxuICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKHRoaXMub3B0aW9ucy5leHRlbnQgKiAocHkgKiB6MiAtIHkpKVxuICAgICAgICAgICAgICAgIF1dLFxuICAgICAgICAgICAgICAgIHRhZ3NcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIGFzc2lnbiBpZFxuICAgICAgICAgICAgbGV0IGlkO1xuICAgICAgICAgICAgaWYgKGlzQ2x1c3Rlcikge1xuICAgICAgICAgICAgICAgIGlkID0gYy5pZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmdlbmVyYXRlSWQpIHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25hbGx5IGdlbmVyYXRlIGlkXG4gICAgICAgICAgICAgICAgaWQgPSBjLmluZGV4O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBvaW50c1tjLmluZGV4XS5pZCkge1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgaWQgaWYgYWxyZWFkeSBhc3NpZ25lZFxuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5wb2ludHNbYy5pbmRleF0uaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSBmLmlkID0gaWQ7XG5cbiAgICAgICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaChmKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9saW1pdFpvb20oeikge1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5vcHRpb25zLm1pblpvb20sIE1hdGgubWluKCt6LCB0aGlzLm9wdGlvbnMubWF4Wm9vbSArIDEpKTtcbiAgICB9XG5cbiAgICBfY2x1c3Rlcihwb2ludHMsIHpvb20pIHtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBbXTtcbiAgICAgICAgY29uc3Qge3JhZGl1cywgZXh0ZW50LCByZWR1Y2UsIG1pblBvaW50c30gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHIgPSByYWRpdXMgLyAoZXh0ZW50ICogTWF0aC5wb3coMiwgem9vbSkpO1xuXG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBlYWNoIHBvaW50XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgLy8gaWYgd2UndmUgYWxyZWFkeSB2aXNpdGVkIHRoZSBwb2ludCBhdCB0aGlzIHpvb20gbGV2ZWwsIHNraXAgaXRcbiAgICAgICAgICAgIGlmIChwLnpvb20gPD0gem9vbSkgY29udGludWU7XG4gICAgICAgICAgICBwLnpvb20gPSB6b29tO1xuXG4gICAgICAgICAgICAvLyBmaW5kIGFsbCBuZWFyYnkgcG9pbnRzXG4gICAgICAgICAgICBjb25zdCB0cmVlID0gdGhpcy50cmVlc1t6b29tICsgMV07XG4gICAgICAgICAgICBjb25zdCBuZWlnaGJvcklkcyA9IHRyZWUud2l0aGluKHAueCwgcC55LCByKTtcblxuICAgICAgICAgICAgY29uc3QgbnVtUG9pbnRzT3JpZ2luID0gcC5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgIGxldCBudW1Qb2ludHMgPSBudW1Qb2ludHNPcmlnaW47XG5cbiAgICAgICAgICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgcG9pbnRzIGluIGEgcG90ZW50aWFsIGNsdXN0ZXJcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmVpZ2hib3JJZCBvZiBuZWlnaGJvcklkcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IG5laWdoYm9ycyB0aGF0IGFyZSBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgICAgICAgICAgIGlmIChiLnpvb20gPiB6b29tKSBudW1Qb2ludHMgKz0gYi5udW1Qb2ludHMgfHwgMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2VyZSBuZWlnaGJvcnMgdG8gbWVyZ2UsIGFuZCB0aGVyZSBhcmUgZW5vdWdoIHBvaW50cyB0byBmb3JtIGEgY2x1c3RlclxuICAgICAgICAgICAgaWYgKG51bVBvaW50cyA+IG51bVBvaW50c09yaWdpbiAmJiBudW1Qb2ludHMgPj0gbWluUG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHd4ID0gcC54ICogbnVtUG9pbnRzT3JpZ2luO1xuICAgICAgICAgICAgICAgIGxldCB3eSA9IHAueSAqIG51bVBvaW50c09yaWdpbjtcblxuICAgICAgICAgICAgICAgIGxldCBjbHVzdGVyUHJvcGVydGllcyA9IHJlZHVjZSAmJiBudW1Qb2ludHNPcmlnaW4gPiAxID8gdGhpcy5fbWFwKHAsIHRydWUpIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIGVuY29kZSBib3RoIHpvb20gYW5kIHBvaW50IGluZGV4IG9uIHdoaWNoIHRoZSBjbHVzdGVyIG9yaWdpbmF0ZWQgLS0gb2Zmc2V0IGJ5IHRvdGFsIGxlbmd0aCBvZiBmZWF0dXJlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gKGkgPDwgNSkgKyAoem9vbSArIDEpICsgdGhpcy5wb2ludHMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuZWlnaGJvcklkIG9mIG5laWdoYm9ySWRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYi56b29tIDw9IHpvb20pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tOyAvLyBzYXZlIHRoZSB6b29tIChzbyBpdCBkb2Vzbid0IGdldCBwcm9jZXNzZWQgdHdpY2UpXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtUG9pbnRzMiA9IGIubnVtUG9pbnRzIHx8IDE7XG4gICAgICAgICAgICAgICAgICAgIHd4ICs9IGIueCAqIG51bVBvaW50czI7IC8vIGFjY3VtdWxhdGUgY29vcmRpbmF0ZXMgZm9yIGNhbGN1bGF0aW5nIHdlaWdodGVkIGNlbnRlclxuICAgICAgICAgICAgICAgICAgICB3eSArPSBiLnkgKiBudW1Qb2ludHMyO1xuXG4gICAgICAgICAgICAgICAgICAgIGIucGFyZW50SWQgPSBpZDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVkdWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsdXN0ZXJQcm9wZXJ0aWVzKSBjbHVzdGVyUHJvcGVydGllcyA9IHRoaXMuX21hcChwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZShjbHVzdGVyUHJvcGVydGllcywgdGhpcy5fbWFwKGIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHAucGFyZW50SWQgPSBpZDtcbiAgICAgICAgICAgICAgICBjbHVzdGVycy5wdXNoKGNyZWF0ZUNsdXN0ZXIod3ggLyBudW1Qb2ludHMsIHd5IC8gbnVtUG9pbnRzLCBpZCwgbnVtUG9pbnRzLCBjbHVzdGVyUHJvcGVydGllcykpO1xuXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBsZWZ0IHBvaW50cyBhcyB1bmNsdXN0ZXJlZFxuICAgICAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2gocCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobnVtUG9pbnRzID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5laWdoYm9ySWQgb2YgbmVpZ2hib3JJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLnpvb20gPD0gem9vbSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBiLnpvb20gPSB6b29tO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnMucHVzaChiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbHVzdGVycztcbiAgICB9XG5cbiAgICAvLyBnZXQgaW5kZXggb2YgdGhlIHBvaW50IGZyb20gd2hpY2ggdGhlIGNsdXN0ZXIgb3JpZ2luYXRlZFxuICAgIF9nZXRPcmlnaW5JZChjbHVzdGVySWQpIHtcbiAgICAgICAgcmV0dXJuIChjbHVzdGVySWQgLSB0aGlzLnBvaW50cy5sZW5ndGgpID4+IDU7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHpvb20gb2YgdGhlIHBvaW50IGZyb20gd2hpY2ggdGhlIGNsdXN0ZXIgb3JpZ2luYXRlZFxuICAgIF9nZXRPcmlnaW5ab29tKGNsdXN0ZXJJZCkge1xuICAgICAgICByZXR1cm4gKGNsdXN0ZXJJZCAtIHRoaXMucG9pbnRzLmxlbmd0aCkgJSAzMjtcbiAgICB9XG5cbiAgICBfbWFwKHBvaW50LCBjbG9uZSkge1xuICAgICAgICBpZiAocG9pbnQubnVtUG9pbnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvbmUgPyBleHRlbmQoe30sIHBvaW50LnByb3BlcnRpZXMpIDogcG9pbnQucHJvcGVydGllcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMucG9pbnRzW3BvaW50LmluZGV4XS5wcm9wZXJ0aWVzO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm9wdGlvbnMubWFwKG9yaWdpbmFsKTtcbiAgICAgICAgcmV0dXJuIGNsb25lICYmIHJlc3VsdCA9PT0gb3JpZ2luYWwgPyBleHRlbmQoe30sIHJlc3VsdCkgOiByZXN1bHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDbHVzdGVyKHgsIHksIGlkLCBudW1Qb2ludHMsIHByb3BlcnRpZXMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBmcm91bmQoeCksIC8vIHdlaWdodGVkIGNsdXN0ZXIgY2VudGVyOyByb3VuZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBGbG9hdDMyQXJyYXkgaW5kZXhcbiAgICAgICAgeTogZnJvdW5kKHkpLFxuICAgICAgICB6b29tOiBJbmZpbml0eSwgLy8gdGhlIGxhc3Qgem9vbSB0aGUgY2x1c3RlciB3YXMgcHJvY2Vzc2VkIGF0XG4gICAgICAgIGlkLCAvLyBlbmNvZGVzIGluZGV4IG9mIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY2x1c3RlciBhbmQgaXRzIHpvb20gbGV2ZWxcbiAgICAgICAgcGFyZW50SWQ6IC0xLCAvLyBwYXJlbnQgY2x1c3RlciBpZFxuICAgICAgICBudW1Qb2ludHMsXG4gICAgICAgIHByb3BlcnRpZXNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQb2ludENsdXN0ZXIocCwgaWQpIHtcbiAgICBjb25zdCBbeCwgeV0gPSBwLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGZyb3VuZChsbmdYKHgpKSwgLy8gcHJvamVjdGVkIHBvaW50IGNvb3JkaW5hdGVzXG4gICAgICAgIHk6IGZyb3VuZChsYXRZKHkpKSxcbiAgICAgICAgem9vbTogSW5maW5pdHksIC8vIHRoZSBsYXN0IHpvb20gdGhlIHBvaW50IHdhcyBwcm9jZXNzZWQgYXRcbiAgICAgICAgaW5kZXg6IGlkLCAvLyBpbmRleCBvZiB0aGUgc291cmNlIGZlYXR1cmUgaW4gdGhlIG9yaWdpbmFsIGlucHV0IGFycmF5LFxuICAgICAgICBwYXJlbnRJZDogLTEgLy8gcGFyZW50IGNsdXN0ZXIgaWRcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbHVzdGVySlNPTihjbHVzdGVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICBpZDogY2x1c3Rlci5pZCxcbiAgICAgICAgcHJvcGVydGllczogZ2V0Q2x1c3RlclByb3BlcnRpZXMoY2x1c3RlciksXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFt4TG5nKGNsdXN0ZXIueCksIHlMYXQoY2x1c3Rlci55KV1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldENsdXN0ZXJQcm9wZXJ0aWVzKGNsdXN0ZXIpIHtcbiAgICBjb25zdCBjb3VudCA9IGNsdXN0ZXIubnVtUG9pbnRzO1xuICAgIGNvbnN0IGFiYnJldiA9XG4gICAgICAgIGNvdW50ID49IDEwMDAwID8gYCR7TWF0aC5yb3VuZChjb3VudCAvIDEwMDApICB9a2AgOlxuICAgICAgICBjb3VudCA+PSAxMDAwID8gYCR7TWF0aC5yb3VuZChjb3VudCAvIDEwMCkgLyAxMCAgfWtgIDogY291bnQ7XG4gICAgcmV0dXJuIGV4dGVuZChleHRlbmQoe30sIGNsdXN0ZXIucHJvcGVydGllcyksIHtcbiAgICAgICAgY2x1c3RlcjogdHJ1ZSxcbiAgICAgICAgY2x1c3Rlcl9pZDogY2x1c3Rlci5pZCxcbiAgICAgICAgcG9pbnRfY291bnQ6IGNvdW50LFxuICAgICAgICBwb2ludF9jb3VudF9hYmJyZXZpYXRlZDogYWJicmV2XG4gICAgfSk7XG59XG5cbi8vIGxvbmdpdHVkZS9sYXRpdHVkZSB0byBzcGhlcmljYWwgbWVyY2F0b3IgaW4gWzAuLjFdIHJhbmdlXG5mdW5jdGlvbiBsbmdYKGxuZykge1xuICAgIHJldHVybiBsbmcgLyAzNjAgKyAwLjU7XG59XG5mdW5jdGlvbiBsYXRZKGxhdCkge1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGxhdCAqIE1hdGguUEkgLyAxODApO1xuICAgIGNvbnN0IHkgPSAoMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJKTtcbiAgICByZXR1cm4geSA8IDAgPyAwIDogeSA+IDEgPyAxIDogeTtcbn1cblxuLy8gc3BoZXJpY2FsIG1lcmNhdG9yIHRvIGxvbmdpdHVkZS9sYXRpdHVkZVxuZnVuY3Rpb24geExuZyh4KSB7XG4gICAgcmV0dXJuICh4IC0gMC41KSAqIDM2MDtcbn1cbmZ1bmN0aW9uIHlMYXQoeSkge1xuICAgIGNvbnN0IHkyID0gKDE4MCAtIHkgKiAzNjApICogTWF0aC5QSSAvIDE4MDtcbiAgICByZXR1cm4gMzYwICogTWF0aC5hdGFuKE1hdGguZXhwKHkyKSkgLyBNYXRoLlBJIC0gOTA7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKGNvbnN0IGlkIGluIHNyYykgZGVzdFtpZF0gPSBzcmNbaWRdO1xuICAgIHJldHVybiBkZXN0O1xufVxuXG5mdW5jdGlvbiBnZXRYKHApIHtcbiAgICByZXR1cm4gcC54O1xufVxuZnVuY3Rpb24gZ2V0WShwKSB7XG4gICAgcmV0dXJuIHAueTtcbn1cbiIsIlxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2ltcGxpZnkoY29vcmRzLCBmaXJzdCwgbGFzdCwgc3FUb2xlcmFuY2UpIHtcbiAgICB2YXIgbWF4U3FEaXN0ID0gc3FUb2xlcmFuY2U7XG4gICAgdmFyIG1pZCA9IChsYXN0IC0gZmlyc3QpID4+IDE7XG4gICAgdmFyIG1pblBvc1RvTWlkID0gbGFzdCAtIGZpcnN0O1xuICAgIHZhciBpbmRleDtcblxuICAgIHZhciBheCA9IGNvb3Jkc1tmaXJzdF07XG4gICAgdmFyIGF5ID0gY29vcmRzW2ZpcnN0ICsgMV07XG4gICAgdmFyIGJ4ID0gY29vcmRzW2xhc3RdO1xuICAgIHZhciBieSA9IGNvb3Jkc1tsYXN0ICsgMV07XG5cbiAgICBmb3IgKHZhciBpID0gZmlyc3QgKyAzOyBpIDwgbGFzdDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBkID0gZ2V0U3FTZWdEaXN0KGNvb3Jkc1tpXSwgY29vcmRzW2kgKyAxXSwgYXgsIGF5LCBieCwgYnkpO1xuXG4gICAgICAgIGlmIChkID4gbWF4U3FEaXN0KSB7XG4gICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICBtYXhTcURpc3QgPSBkO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZCA9PT0gbWF4U3FEaXN0KSB7XG4gICAgICAgICAgICAvLyBhIHdvcmthcm91bmQgdG8gZW5zdXJlIHdlIGNob29zZSBhIHBpdm90IGNsb3NlIHRvIHRoZSBtaWRkbGUgb2YgdGhlIGxpc3QsXG4gICAgICAgICAgICAvLyByZWR1Y2luZyByZWN1cnNpb24gZGVwdGgsIGZvciBjZXJ0YWluIGRlZ2VuZXJhdGUgaW5wdXRzXG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L2dlb2pzb24tdnQvaXNzdWVzLzEwNFxuICAgICAgICAgICAgdmFyIHBvc1RvTWlkID0gTWF0aC5hYnMoaSAtIG1pZCk7XG4gICAgICAgICAgICBpZiAocG9zVG9NaWQgPCBtaW5Qb3NUb01pZCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBtaW5Qb3NUb01pZCA9IHBvc1RvTWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1heFNxRGlzdCA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgIGlmIChpbmRleCAtIGZpcnN0ID4gMykgc2ltcGxpZnkoY29vcmRzLCBmaXJzdCwgaW5kZXgsIHNxVG9sZXJhbmNlKTtcbiAgICAgICAgY29vcmRzW2luZGV4ICsgMl0gPSBtYXhTcURpc3Q7XG4gICAgICAgIGlmIChsYXN0IC0gaW5kZXggPiAzKSBzaW1wbGlmeShjb29yZHMsIGluZGV4LCBsYXN0LCBzcVRvbGVyYW5jZSk7XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHB4LCBweSwgeCwgeSwgYngsIGJ5KSB7XG5cbiAgICB2YXIgZHggPSBieCAtIHg7XG4gICAgdmFyIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNyZWF0ZUZlYXR1cmUoaWQsIHR5cGUsIGdlb20sIHRhZ3MpIHtcbiAgICB2YXIgZmVhdHVyZSA9IHtcbiAgICAgICAgaWQ6IHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogaWQsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGdlb21ldHJ5OiBnZW9tLFxuICAgICAgICB0YWdzOiB0YWdzLFxuICAgICAgICBtaW5YOiBJbmZpbml0eSxcbiAgICAgICAgbWluWTogSW5maW5pdHksXG4gICAgICAgIG1heFg6IC1JbmZpbml0eSxcbiAgICAgICAgbWF4WTogLUluZmluaXR5XG4gICAgfTtcbiAgICBjYWxjQkJveChmZWF0dXJlKTtcbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuZnVuY3Rpb24gY2FsY0JCb3goZmVhdHVyZSkge1xuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeTtcbiAgICB2YXIgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50JyB8fCB0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb20pO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjYWxjTGluZUJCb3goZmVhdHVyZSwgZ2VvbVtpXSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ2VvbVtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNhbGNMaW5lQkJveChmZWF0dXJlLCBnZW9tW2ldW2pdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY0xpbmVCQm94KGZlYXR1cmUsIGdlb20pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgZmVhdHVyZS5taW5YID0gTWF0aC5taW4oZmVhdHVyZS5taW5YLCBnZW9tW2ldKTtcbiAgICAgICAgZmVhdHVyZS5taW5ZID0gTWF0aC5taW4oZmVhdHVyZS5taW5ZLCBnZW9tW2kgKyAxXSk7XG4gICAgICAgIGZlYXR1cmUubWF4WCA9IE1hdGgubWF4KGZlYXR1cmUubWF4WCwgZ2VvbVtpXSk7XG4gICAgICAgIGZlYXR1cmUubWF4WSA9IE1hdGgubWF4KGZlYXR1cmUubWF4WSwgZ2VvbVtpICsgMV0pO1xuICAgIH1cbn1cbiIsIlxuaW1wb3J0IHNpbXBsaWZ5IGZyb20gJy4vc2ltcGxpZnknO1xuaW1wb3J0IGNyZWF0ZUZlYXR1cmUgZnJvbSAnLi9mZWF0dXJlJztcblxuLy8gY29udmVydHMgR2VvSlNPTiBmZWF0dXJlIGludG8gYW4gaW50ZXJtZWRpYXRlIHByb2plY3RlZCBKU09OIHZlY3RvciBmb3JtYXQgd2l0aCBzaW1wbGlmaWNhdGlvbiBkYXRhXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnZlcnQoZGF0YSwgb3B0aW9ucykge1xuICAgIHZhciBmZWF0dXJlcyA9IFtdO1xuICAgIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YS5mZWF0dXJlc1tpXSwgb3B0aW9ucywgaSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEsIG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2luZ2xlIGdlb21ldHJ5IG9yIGEgZ2VvbWV0cnkgY29sbGVjdGlvblxuICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywge2dlb21ldHJ5OiBkYXRhfSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZ2VvanNvbiwgb3B0aW9ucywgaW5kZXgpIHtcbiAgICBpZiAoIWdlb2pzb24uZ2VvbWV0cnkpIHJldHVybjtcblxuICAgIHZhciBjb29yZHMgPSBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIHZhciB0eXBlID0gZ2VvanNvbi5nZW9tZXRyeS50eXBlO1xuICAgIHZhciB0b2xlcmFuY2UgPSBNYXRoLnBvdyhvcHRpb25zLnRvbGVyYW5jZSAvICgoMSA8PCBvcHRpb25zLm1heFpvb20pICogb3B0aW9ucy5leHRlbnQpLCAyKTtcbiAgICB2YXIgZ2VvbWV0cnkgPSBbXTtcbiAgICB2YXIgaWQgPSBnZW9qc29uLmlkO1xuICAgIGlmIChvcHRpb25zLnByb21vdGVJZCkge1xuICAgICAgICBpZCA9IGdlb2pzb24ucHJvcGVydGllc1tvcHRpb25zLnByb21vdGVJZF07XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmdlbmVyYXRlSWQpIHtcbiAgICAgICAgaWQgPSBpbmRleCB8fCAwO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBjb252ZXJ0UG9pbnQoY29vcmRzLCBnZW9tZXRyeSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydFBvaW50KGNvb3Jkc1tpXSwgZ2VvbWV0cnkpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICBjb252ZXJ0TGluZShjb29yZHMsIGdlb21ldHJ5LCB0b2xlcmFuY2UsIGZhbHNlKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubGluZU1ldHJpY3MpIHtcbiAgICAgICAgICAgIC8vIGV4cGxvZGUgaW50byBsaW5lc3RyaW5ncyB0byBiZSBhYmxlIHRvIHRyYWNrIG1ldHJpY3NcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnZlcnRMaW5lKGNvb3Jkc1tpXSwgZ2VvbWV0cnksIHRvbGVyYW5jZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZShpZCwgJ0xpbmVTdHJpbmcnLCBnZW9tZXRyeSwgZ2VvanNvbi5wcm9wZXJ0aWVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb252ZXJ0TGluZXMoY29vcmRzLCBnZW9tZXRyeSwgdG9sZXJhbmNlLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIGNvbnZlcnRMaW5lcyhjb29yZHMsIGdlb21ldHJ5LCB0b2xlcmFuY2UsIHRydWUpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9seWdvbiA9IFtdO1xuICAgICAgICAgICAgY29udmVydExpbmVzKGNvb3Jkc1tpXSwgcG9seWdvbiwgdG9sZXJhbmNlLCB0cnVlKTtcbiAgICAgICAgICAgIGdlb21ldHJ5LnB1c2gocG9seWdvbik7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmdlb21ldHJ5Lmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9qc29uLmdlb21ldHJ5Lmdlb21ldHJpZXNbaV0sXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczogZ2VvanNvbi5wcm9wZXJ0aWVzXG4gICAgICAgICAgICB9LCBvcHRpb25zLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC4nKTtcbiAgICB9XG5cbiAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZUZlYXR1cmUoaWQsIHR5cGUsIGdlb21ldHJ5LCBnZW9qc29uLnByb3BlcnRpZXMpKTtcbn1cblxuZnVuY3Rpb24gY29udmVydFBvaW50KGNvb3Jkcywgb3V0KSB7XG4gICAgb3V0LnB1c2gocHJvamVjdFgoY29vcmRzWzBdKSk7XG4gICAgb3V0LnB1c2gocHJvamVjdFkoY29vcmRzWzFdKSk7XG4gICAgb3V0LnB1c2goMCk7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRMaW5lKHJpbmcsIG91dCwgdG9sZXJhbmNlLCBpc1BvbHlnb24pIHtcbiAgICB2YXIgeDAsIHkwO1xuICAgIHZhciBzaXplID0gMDtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgeCA9IHByb2plY3RYKHJpbmdbal1bMF0pO1xuICAgICAgICB2YXIgeSA9IHByb2plY3RZKHJpbmdbal1bMV0pO1xuXG4gICAgICAgIG91dC5wdXNoKHgpO1xuICAgICAgICBvdXQucHVzaCh5KTtcbiAgICAgICAgb3V0LnB1c2goMCk7XG5cbiAgICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgICAgICBpZiAoaXNQb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSAoeDAgKiB5IC0geCAqIHkwKSAvIDI7IC8vIGFyZWFcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2l6ZSArPSBNYXRoLnNxcnQoTWF0aC5wb3coeCAtIHgwLCAyKSArIE1hdGgucG93KHkgLSB5MCwgMikpOyAvLyBsZW5ndGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB4MCA9IHg7XG4gICAgICAgIHkwID0geTtcbiAgICB9XG5cbiAgICB2YXIgbGFzdCA9IG91dC5sZW5ndGggLSAzO1xuICAgIG91dFsyXSA9IDE7XG4gICAgc2ltcGxpZnkob3V0LCAwLCBsYXN0LCB0b2xlcmFuY2UpO1xuICAgIG91dFtsYXN0ICsgMl0gPSAxO1xuXG4gICAgb3V0LnNpemUgPSBNYXRoLmFicyhzaXplKTtcbiAgICBvdXQuc3RhcnQgPSAwO1xuICAgIG91dC5lbmQgPSBvdXQuc2l6ZTtcbn1cblxuZnVuY3Rpb24gY29udmVydExpbmVzKHJpbmdzLCBvdXQsIHRvbGVyYW5jZSwgaXNQb2x5Z29uKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZ2VvbSA9IFtdO1xuICAgICAgICBjb252ZXJ0TGluZShyaW5nc1tpXSwgZ2VvbSwgdG9sZXJhbmNlLCBpc1BvbHlnb24pO1xuICAgICAgICBvdXQucHVzaChnZW9tKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHByb2plY3RYKHgpIHtcbiAgICByZXR1cm4geCAvIDM2MCArIDAuNTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFkoeSkge1xuICAgIHZhciBzaW4gPSBNYXRoLnNpbih5ICogTWF0aC5QSSAvIDE4MCk7XG4gICAgdmFyIHkyID0gMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJO1xuICAgIHJldHVybiB5MiA8IDAgPyAwIDogeTIgPiAxID8gMSA6IHkyO1xufVxuIiwiXG5pbXBvcnQgY3JlYXRlRmVhdHVyZSBmcm9tICcuL2ZlYXR1cmUnO1xuXG4vKiBjbGlwIGZlYXR1cmVzIGJldHdlZW4gdHdvIGF4aXMtcGFyYWxsZWwgbGluZXM6XG4gKiAgICAgfCAgICAgICAgfFxuICogIF9fX3xfX18gICAgIHwgICAgIC9cbiAqIC8gICB8ICAgXFxfX19ffF9fX18vXG4gKiAgICAgfCAgICAgICAgfFxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsaXAoZmVhdHVyZXMsIHNjYWxlLCBrMSwgazIsIGF4aXMsIG1pbkFsbCwgbWF4QWxsLCBvcHRpb25zKSB7XG5cbiAgICBrMSAvPSBzY2FsZTtcbiAgICBrMiAvPSBzY2FsZTtcblxuICAgIGlmIChtaW5BbGwgPj0gazEgJiYgbWF4QWxsIDwgazIpIHJldHVybiBmZWF0dXJlczsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICBlbHNlIGlmIChtYXhBbGwgPCBrMSB8fCBtaW5BbGwgPj0gazIpIHJldHVybiBudWxsOyAvLyB0cml2aWFsIHJlamVjdFxuXG4gICAgdmFyIGNsaXBwZWQgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldO1xuICAgICAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgICB2YXIgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICB2YXIgbWluID0gYXhpcyA9PT0gMCA/IGZlYXR1cmUubWluWCA6IGZlYXR1cmUubWluWTtcbiAgICAgICAgdmFyIG1heCA9IGF4aXMgPT09IDAgPyBmZWF0dXJlLm1heFggOiBmZWF0dXJlLm1heFk7XG5cbiAgICAgICAgaWYgKG1pbiA+PSBrMSAmJiBtYXggPCBrMikgeyAvLyB0cml2aWFsIGFjY2VwdFxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGZlYXR1cmUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWF4IDwgazEgfHwgbWluID49IGsyKSB7IC8vIHRyaXZpYWwgcmVqZWN0XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXdHZW9tZXRyeSA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnUG9pbnQnIHx8IHR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgY2xpcFBvaW50cyhnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcyk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIGNsaXBMaW5lKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzLCBmYWxzZSwgb3B0aW9ucy5saW5lTWV0cmljcyk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgY2xpcExpbmVzKGdlb21ldHJ5LCBuZXdHZW9tZXRyeSwgazEsIGsyLCBheGlzLCBmYWxzZSk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgIGNsaXBMaW5lcyhnZW9tZXRyeSwgbmV3R2VvbWV0cnksIGsxLCBrMiwgYXhpcywgdHJ1ZSk7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBnZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBwb2x5Z29uID0gW107XG4gICAgICAgICAgICAgICAgY2xpcExpbmVzKGdlb21ldHJ5W2pdLCBwb2x5Z29uLCBrMSwgazIsIGF4aXMsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXdHZW9tZXRyeS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbmVNZXRyaWNzICYmIHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuZXdHZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBjbGlwcGVkLnB1c2goY3JlYXRlRmVhdHVyZShmZWF0dXJlLmlkLCB0eXBlLCBuZXdHZW9tZXRyeVtqXSwgZmVhdHVyZS50YWdzKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld0dlb21ldHJ5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ0xpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeSA9IG5ld0dlb21ldHJ5WzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyB8fCB0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gbmV3R2VvbWV0cnkubGVuZ3RoID09PSAzID8gJ1BvaW50JyA6ICdNdWx0aVBvaW50JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xpcHBlZC5wdXNoKGNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5pZCwgdHlwZSwgbmV3R2VvbWV0cnksIGZlYXR1cmUudGFncykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBwZWQubGVuZ3RoID8gY2xpcHBlZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNsaXBQb2ludHMoZ2VvbSwgbmV3R2VvbSwgazEsIGsyLCBheGlzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gZ2VvbVtpICsgYXhpc107XG5cbiAgICAgICAgaWYgKGEgPj0gazEgJiYgYSA8PSBrMikge1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKGdlb21baSArIDFdKTtcbiAgICAgICAgICAgIG5ld0dlb20ucHVzaChnZW9tW2kgKyAyXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNsaXBMaW5lKGdlb20sIG5ld0dlb20sIGsxLCBrMiwgYXhpcywgaXNQb2x5Z29uLCB0cmFja01ldHJpY3MpIHtcblxuICAgIHZhciBzbGljZSA9IG5ld1NsaWNlKGdlb20pO1xuICAgIHZhciBpbnRlcnNlY3QgPSBheGlzID09PSAwID8gaW50ZXJzZWN0WCA6IGludGVyc2VjdFk7XG4gICAgdmFyIGxlbiA9IGdlb20uc3RhcnQ7XG4gICAgdmFyIHNlZ0xlbiwgdDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGggLSAzOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGF4ID0gZ2VvbVtpXTtcbiAgICAgICAgdmFyIGF5ID0gZ2VvbVtpICsgMV07XG4gICAgICAgIHZhciBheiA9IGdlb21baSArIDJdO1xuICAgICAgICB2YXIgYnggPSBnZW9tW2kgKyAzXTtcbiAgICAgICAgdmFyIGJ5ID0gZ2VvbVtpICsgNF07XG4gICAgICAgIHZhciBhID0gYXhpcyA9PT0gMCA/IGF4IDogYXk7XG4gICAgICAgIHZhciBiID0gYXhpcyA9PT0gMCA/IGJ4IDogYnk7XG4gICAgICAgIHZhciBleGl0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzZWdMZW4gPSBNYXRoLnNxcnQoTWF0aC5wb3coYXggLSBieCwgMikgKyBNYXRoLnBvdyhheSAtIGJ5LCAyKSk7XG5cbiAgICAgICAgaWYgKGEgPCBrMSkge1xuICAgICAgICAgICAgLy8gLS0tfC0tPiAgfCAobGluZSBlbnRlcnMgdGhlIGNsaXAgcmVnaW9uIGZyb20gdGhlIGxlZnQpXG4gICAgICAgICAgICBpZiAoYiA+IGsxKSB7XG4gICAgICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsxKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5zdGFydCA9IGxlbiArIHNlZ0xlbiAqIHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYSA+IGsyKSB7XG4gICAgICAgICAgICAvLyB8ICA8LS18LS0tIChsaW5lIGVudGVycyB0aGUgY2xpcCByZWdpb24gZnJvbSB0aGUgcmlnaHQpXG4gICAgICAgICAgICBpZiAoYiA8IGsyKSB7XG4gICAgICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsyKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5zdGFydCA9IGxlbiArIHNlZ0xlbiAqIHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZGRQb2ludChzbGljZSwgYXgsIGF5LCBheik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPCBrMSAmJiBhID49IGsxKSB7XG4gICAgICAgICAgICAvLyA8LS18LS0tICB8IG9yIDwtLXwtLS0tLXwtLS0gKGxpbmUgZXhpdHMgdGhlIGNsaXAgcmVnaW9uIG9uIHRoZSBsZWZ0KVxuICAgICAgICAgICAgdCA9IGludGVyc2VjdChzbGljZSwgYXgsIGF5LCBieCwgYnksIGsxKTtcbiAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPiBrMiAmJiBhIDw9IGsyKSB7XG4gICAgICAgICAgICAvLyB8ICAtLS18LS0+IG9yIC0tLXwtLS0tLXwtLT4gKGxpbmUgZXhpdHMgdGhlIGNsaXAgcmVnaW9uIG9uIHRoZSByaWdodClcbiAgICAgICAgICAgIHQgPSBpbnRlcnNlY3Qoc2xpY2UsIGF4LCBheSwgYngsIGJ5LCBrMik7XG4gICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1BvbHlnb24gJiYgZXhpdGVkKSB7XG4gICAgICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBzbGljZS5lbmQgPSBsZW4gKyBzZWdMZW4gKiB0O1xuICAgICAgICAgICAgbmV3R2VvbS5wdXNoKHNsaWNlKTtcbiAgICAgICAgICAgIHNsaWNlID0gbmV3U2xpY2UoZ2VvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhY2tNZXRyaWNzKSBsZW4gKz0gc2VnTGVuO1xuICAgIH1cblxuICAgIC8vIGFkZCB0aGUgbGFzdCBwb2ludFxuICAgIHZhciBsYXN0ID0gZ2VvbS5sZW5ndGggLSAzO1xuICAgIGF4ID0gZ2VvbVtsYXN0XTtcbiAgICBheSA9IGdlb21bbGFzdCArIDFdO1xuICAgIGF6ID0gZ2VvbVtsYXN0ICsgMl07XG4gICAgYSA9IGF4aXMgPT09IDAgPyBheCA6IGF5O1xuICAgIGlmIChhID49IGsxICYmIGEgPD0gazIpIGFkZFBvaW50KHNsaWNlLCBheCwgYXksIGF6KTtcblxuICAgIC8vIGNsb3NlIHRoZSBwb2x5Z29uIGlmIGl0cyBlbmRwb2ludHMgYXJlIG5vdCB0aGUgc2FtZSBhZnRlciBjbGlwcGluZ1xuICAgIGxhc3QgPSBzbGljZS5sZW5ndGggLSAzO1xuICAgIGlmIChpc1BvbHlnb24gJiYgbGFzdCA+PSAzICYmIChzbGljZVtsYXN0XSAhPT0gc2xpY2VbMF0gfHwgc2xpY2VbbGFzdCArIDFdICE9PSBzbGljZVsxXSkpIHtcbiAgICAgICAgYWRkUG9pbnQoc2xpY2UsIHNsaWNlWzBdLCBzbGljZVsxXSwgc2xpY2VbMl0pO1xuICAgIH1cblxuICAgIC8vIGFkZCB0aGUgZmluYWwgc2xpY2VcbiAgICBpZiAoc2xpY2UubGVuZ3RoKSB7XG4gICAgICAgIG5ld0dlb20ucHVzaChzbGljZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBuZXdTbGljZShsaW5lKSB7XG4gICAgdmFyIHNsaWNlID0gW107XG4gICAgc2xpY2Uuc2l6ZSA9IGxpbmUuc2l6ZTtcbiAgICBzbGljZS5zdGFydCA9IGxpbmUuc3RhcnQ7XG4gICAgc2xpY2UuZW5kID0gbGluZS5lbmQ7XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuXG5mdW5jdGlvbiBjbGlwTGluZXMoZ2VvbSwgbmV3R2VvbSwgazEsIGsyLCBheGlzLCBpc1BvbHlnb24pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2xpcExpbmUoZ2VvbVtpXSwgbmV3R2VvbSwgazEsIGsyLCBheGlzLCBpc1BvbHlnb24sIGZhbHNlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGFkZFBvaW50KG91dCwgeCwgeSwgeikge1xuICAgIG91dC5wdXNoKHgpO1xuICAgIG91dC5wdXNoKHkpO1xuICAgIG91dC5wdXNoKHopO1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3RYKG91dCwgYXgsIGF5LCBieCwgYnksIHgpIHtcbiAgICB2YXIgdCA9ICh4IC0gYXgpIC8gKGJ4IC0gYXgpO1xuICAgIG91dC5wdXNoKHgpO1xuICAgIG91dC5wdXNoKGF5ICsgKGJ5IC0gYXkpICogdCk7XG4gICAgb3V0LnB1c2goMSk7XG4gICAgcmV0dXJuIHQ7XG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdFkob3V0LCBheCwgYXksIGJ4LCBieSwgeSkge1xuICAgIHZhciB0ID0gKHkgLSBheSkgLyAoYnkgLSBheSk7XG4gICAgb3V0LnB1c2goYXggKyAoYnggLSBheCkgKiB0KTtcbiAgICBvdXQucHVzaCh5KTtcbiAgICBvdXQucHVzaCgxKTtcbiAgICByZXR1cm4gdDtcbn1cbiIsIlxuaW1wb3J0IGNsaXAgZnJvbSAnLi9jbGlwJztcbmltcG9ydCBjcmVhdGVGZWF0dXJlIGZyb20gJy4vZmVhdHVyZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgYnVmZmVyID0gb3B0aW9ucy5idWZmZXIgLyBvcHRpb25zLmV4dGVudDtcbiAgICB2YXIgbWVyZ2VkID0gZmVhdHVyZXM7XG4gICAgdmFyIGxlZnQgID0gY2xpcChmZWF0dXJlcywgMSwgLTEgLSBidWZmZXIsIGJ1ZmZlciwgICAgIDAsIC0xLCAyLCBvcHRpb25zKTsgLy8gbGVmdCB3b3JsZCBjb3B5XG4gICAgdmFyIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgMSwgIDEgLSBidWZmZXIsIDIgKyBidWZmZXIsIDAsIC0xLCAyLCBvcHRpb25zKTsgLy8gcmlnaHQgd29ybGQgY29weVxuXG4gICAgaWYgKGxlZnQgfHwgcmlnaHQpIHtcbiAgICAgICAgbWVyZ2VkID0gY2xpcChmZWF0dXJlcywgMSwgLWJ1ZmZlciwgMSArIGJ1ZmZlciwgMCwgLTEsIDIsIG9wdGlvbnMpIHx8IFtdOyAvLyBjZW50ZXIgd29ybGQgY29weVxuXG4gICAgICAgIGlmIChsZWZ0KSBtZXJnZWQgPSBzaGlmdEZlYXR1cmVDb29yZHMobGVmdCwgMSkuY29uY2F0KG1lcmdlZCk7IC8vIG1lcmdlIGxlZnQgaW50byBjZW50ZXJcbiAgICAgICAgaWYgKHJpZ2h0KSBtZXJnZWQgPSBtZXJnZWQuY29uY2F0KHNoaWZ0RmVhdHVyZUNvb3JkcyhyaWdodCwgLTEpKTsgLy8gbWVyZ2UgcmlnaHQgaW50byBjZW50ZXJcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBzaGlmdEZlYXR1cmVDb29yZHMoZmVhdHVyZXMsIG9mZnNldCkge1xuICAgIHZhciBuZXdGZWF0dXJlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICB2YXIgbmV3R2VvbWV0cnk7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnIHx8IHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5LCBvZmZzZXQpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICAgICAgbmV3R2VvbWV0cnkgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1BvbHlnb24gPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGZlYXR1cmUuZ2VvbWV0cnlbal0ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3UG9seWdvbi5wdXNoKHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnlbal1ba10sIG9mZnNldCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXdHZW9tZXRyeS5wdXNoKG5ld1BvbHlnb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbmV3RmVhdHVyZXMucHVzaChjcmVhdGVGZWF0dXJlKGZlYXR1cmUuaWQsIHR5cGUsIG5ld0dlb21ldHJ5LCBmZWF0dXJlLnRhZ3MpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3RmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIHNoaWZ0Q29vcmRzKHBvaW50cywgb2Zmc2V0KSB7XG4gICAgdmFyIG5ld1BvaW50cyA9IFtdO1xuICAgIG5ld1BvaW50cy5zaXplID0gcG9pbnRzLnNpemU7XG5cbiAgICBpZiAocG9pbnRzLnN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3UG9pbnRzLnN0YXJ0ID0gcG9pbnRzLnN0YXJ0O1xuICAgICAgICBuZXdQb2ludHMuZW5kID0gcG9pbnRzLmVuZDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICBuZXdQb2ludHMucHVzaChwb2ludHNbaV0gKyBvZmZzZXQsIHBvaW50c1tpICsgMV0sIHBvaW50c1tpICsgMl0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UG9pbnRzO1xufVxuIiwiXG4vLyBUcmFuc2Zvcm1zIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIGZlYXR1cmUgaW4gdGhlIGdpdmVuIHRpbGUgZnJvbVxuLy8gbWVyY2F0b3ItcHJvamVjdGVkIHNwYWNlIGludG8gKGV4dGVudCB4IGV4dGVudCkgdGlsZSBzcGFjZS5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUodGlsZSwgZXh0ZW50KSB7XG4gICAgaWYgKHRpbGUudHJhbnNmb3JtZWQpIHJldHVybiB0aWxlO1xuXG4gICAgdmFyIHoyID0gMSA8PCB0aWxlLnosXG4gICAgICAgIHR4ID0gdGlsZS54LFxuICAgICAgICB0eSA9IHRpbGUueSxcbiAgICAgICAgaSwgaiwgaztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0aWxlLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gdGlsZS5mZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICBmZWF0dXJlLmdlb21ldHJ5ID0gW107XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaiArPSAyKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZS5nZW9tZXRyeS5wdXNoKHRyYW5zZm9ybVBvaW50KGdlb21bal0sIGdlb21baiArIDFdLCBleHRlbnQsIHoyLCB0eCwgdHkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJpbmcgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZ2VvbVtqXS5sZW5ndGg7IGsgKz0gMikge1xuICAgICAgICAgICAgICAgICAgICByaW5nLnB1c2godHJhbnNmb3JtUG9pbnQoZ2VvbVtqXVtrXSwgZ2VvbVtqXVtrICsgMV0sIGV4dGVudCwgejIsIHR4LCB0eSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmZWF0dXJlLmdlb21ldHJ5LnB1c2gocmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aWxlLnRyYW5zZm9ybWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludCh4LCB5LCBleHRlbnQsIHoyLCB0eCwgdHkpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBNYXRoLnJvdW5kKGV4dGVudCAqICh4ICogejIgLSB0eCkpLFxuICAgICAgICBNYXRoLnJvdW5kKGV4dGVudCAqICh5ICogejIgLSB0eSkpXTtcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgeiwgdHgsIHR5LCBvcHRpb25zKSB7XG4gICAgdmFyIHRvbGVyYW5jZSA9IHogPT09IG9wdGlvbnMubWF4Wm9vbSA/IDAgOiBvcHRpb25zLnRvbGVyYW5jZSAvICgoMSA8PCB6KSAqIG9wdGlvbnMuZXh0ZW50KTtcbiAgICB2YXIgdGlsZSA9IHtcbiAgICAgICAgZmVhdHVyZXM6IFtdLFxuICAgICAgICBudW1Qb2ludHM6IDAsXG4gICAgICAgIG51bVNpbXBsaWZpZWQ6IDAsXG4gICAgICAgIG51bUZlYXR1cmVzOiAwLFxuICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgIHg6IHR4LFxuICAgICAgICB5OiB0eSxcbiAgICAgICAgejogeixcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICBtaW5YOiAyLFxuICAgICAgICBtaW5ZOiAxLFxuICAgICAgICBtYXhYOiAtMSxcbiAgICAgICAgbWF4WTogMFxuICAgIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aWxlLm51bUZlYXR1cmVzKys7XG4gICAgICAgIGFkZEZlYXR1cmUodGlsZSwgZmVhdHVyZXNbaV0sIHRvbGVyYW5jZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIG1pblggPSBmZWF0dXJlc1tpXS5taW5YO1xuICAgICAgICB2YXIgbWluWSA9IGZlYXR1cmVzW2ldLm1pblk7XG4gICAgICAgIHZhciBtYXhYID0gZmVhdHVyZXNbaV0ubWF4WDtcbiAgICAgICAgdmFyIG1heFkgPSBmZWF0dXJlc1tpXS5tYXhZO1xuXG4gICAgICAgIGlmIChtaW5YIDwgdGlsZS5taW5YKSB0aWxlLm1pblggPSBtaW5YO1xuICAgICAgICBpZiAobWluWSA8IHRpbGUubWluWSkgdGlsZS5taW5ZID0gbWluWTtcbiAgICAgICAgaWYgKG1heFggPiB0aWxlLm1heFgpIHRpbGUubWF4WCA9IG1heFg7XG4gICAgICAgIGlmIChtYXhZID4gdGlsZS5tYXhZKSB0aWxlLm1heFkgPSBtYXhZO1xuICAgIH1cbiAgICByZXR1cm4gdGlsZTtcbn1cblxuZnVuY3Rpb24gYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlLCB0b2xlcmFuY2UsIG9wdGlvbnMpIHtcblxuICAgIHZhciBnZW9tID0gZmVhdHVyZS5nZW9tZXRyeSxcbiAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZSxcbiAgICAgICAgc2ltcGxpZmllZCA9IFtdO1xuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baV0pO1xuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKGdlb21baSArIDFdKTtcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBnZW9tLCB0aWxlLCB0b2xlcmFuY2UsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBnZW9tW2ldLCB0aWxlLCB0b2xlcmFuY2UsIHR5cGUgPT09ICdQb2x5Z29uJywgaSA9PT0gMCk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcblxuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGdlb20ubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHZhciBwb2x5Z29uID0gZ2VvbVtrXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYWRkTGluZShzaW1wbGlmaWVkLCBwb2x5Z29uW2ldLCB0aWxlLCB0b2xlcmFuY2UsIHRydWUsIGkgPT09IDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbXBsaWZpZWQubGVuZ3RoKSB7XG4gICAgICAgIHZhciB0YWdzID0gZmVhdHVyZS50YWdzIHx8IG51bGw7XG4gICAgICAgIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgJiYgb3B0aW9ucy5saW5lTWV0cmljcykge1xuICAgICAgICAgICAgdGFncyA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGZlYXR1cmUudGFncykgdGFnc1trZXldID0gZmVhdHVyZS50YWdzW2tleV07XG4gICAgICAgICAgICB0YWdzWydtYXBib3hfY2xpcF9zdGFydCddID0gZ2VvbS5zdGFydCAvIGdlb20uc2l6ZTtcbiAgICAgICAgICAgIHRhZ3NbJ21hcGJveF9jbGlwX2VuZCddID0gZ2VvbS5lbmQgLyBnZW9tLnNpemU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRpbGVGZWF0dXJlID0ge1xuICAgICAgICAgICAgZ2VvbWV0cnk6IHNpbXBsaWZpZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlID09PSAnUG9seWdvbicgfHwgdHlwZSA9PT0gJ011bHRpUG9seWdvbicgPyAzIDpcbiAgICAgICAgICAgICAgICB0eXBlID09PSAnTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgPyAyIDogMSxcbiAgICAgICAgICAgIHRhZ3M6IHRhZ3NcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZlYXR1cmUuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRpbGVGZWF0dXJlLmlkID0gZmVhdHVyZS5pZDtcbiAgICAgICAgfVxuICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2godGlsZUZlYXR1cmUpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYWRkTGluZShyZXN1bHQsIGdlb20sIHRpbGUsIHRvbGVyYW5jZSwgaXNQb2x5Z29uLCBpc091dGVyKSB7XG4gICAgdmFyIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlO1xuXG4gICAgaWYgKHRvbGVyYW5jZSA+IDAgJiYgKGdlb20uc2l6ZSA8IChpc1BvbHlnb24gPyBzcVRvbGVyYW5jZSA6IHRvbGVyYW5jZSkpKSB7XG4gICAgICAgIHRpbGUubnVtUG9pbnRzICs9IGdlb20ubGVuZ3RoIC8gMztcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByaW5nID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgaWYgKHRvbGVyYW5jZSA9PT0gMCB8fCBnZW9tW2kgKyAyXSA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgICAgIHJpbmcucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIHJpbmcucHVzaChnZW9tW2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGlsZS5udW1Qb2ludHMrKztcbiAgICB9XG5cbiAgICBpZiAoaXNQb2x5Z29uKSByZXdpbmQocmluZywgaXNPdXRlcik7XG5cbiAgICByZXN1bHQucHVzaChyaW5nKTtcbn1cblxuZnVuY3Rpb24gcmV3aW5kKHJpbmcsIGNsb2Nrd2lzZSkge1xuICAgIHZhciBhcmVhID0gMDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcmluZy5sZW5ndGgsIGogPSBsZW4gLSAyOyBpIDwgbGVuOyBqID0gaSwgaSArPSAyKSB7XG4gICAgICAgIGFyZWEgKz0gKHJpbmdbaV0gLSByaW5nW2pdKSAqIChyaW5nW2kgKyAxXSArIHJpbmdbaiArIDFdKTtcbiAgICB9XG4gICAgaWYgKGFyZWEgPiAwID09PSBjbG9ja3dpc2UpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbGVuID0gcmluZy5sZW5ndGg7IGkgPCBsZW4gLyAyOyBpICs9IDIpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcmluZ1tpXTtcbiAgICAgICAgICAgIHZhciB5ID0gcmluZ1tpICsgMV07XG4gICAgICAgICAgICByaW5nW2ldID0gcmluZ1tsZW4gLSAyIC0gaV07XG4gICAgICAgICAgICByaW5nW2kgKyAxXSA9IHJpbmdbbGVuIC0gMSAtIGldO1xuICAgICAgICAgICAgcmluZ1tsZW4gLSAyIC0gaV0gPSB4O1xuICAgICAgICAgICAgcmluZ1tsZW4gLSAxIC0gaV0gPSB5O1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiXG5pbXBvcnQgY29udmVydCBmcm9tICcuL2NvbnZlcnQnOyAgICAgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG5pbXBvcnQgY2xpcCBmcm9tICcuL2NsaXAnOyAgICAgICAgICAgLy8gc3RyaXBlIGNsaXBwaW5nIGFsZ29yaXRobVxuaW1wb3J0IHdyYXAgZnJvbSAnLi93cmFwJzsgICAgICAgICAgIC8vIGRhdGUgbGluZSBwcm9jZXNzaW5nXG5pbXBvcnQgdHJhbnNmb3JtIGZyb20gJy4vdHJhbnNmb3JtJzsgLy8gY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvblxuaW1wb3J0IGNyZWF0ZVRpbGUgZnJvbSAnLi90aWxlJzsgICAgIC8vIGZpbmFsIHNpbXBsaWZpZWQgdGlsZSBnZW5lcmF0aW9uXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdlb2pzb252dChkYXRhLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIEdlb0pTT05WVChkYXRhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKHRoaXMub3B0aW9ucyksIG9wdGlvbnMpO1xuXG4gICAgdmFyIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmIChkZWJ1ZykgY29uc29sZS50aW1lKCdwcmVwcm9jZXNzIGRhdGEnKTtcblxuICAgIGlmIChvcHRpb25zLm1heFpvb20gPCAwIHx8IG9wdGlvbnMubWF4Wm9vbSA+IDI0KSB0aHJvdyBuZXcgRXJyb3IoJ21heFpvb20gc2hvdWxkIGJlIGluIHRoZSAwLTI0IHJhbmdlJyk7XG4gICAgaWYgKG9wdGlvbnMucHJvbW90ZUlkICYmIG9wdGlvbnMuZ2VuZXJhdGVJZCkgdGhyb3cgbmV3IEVycm9yKCdwcm9tb3RlSWQgYW5kIGdlbmVyYXRlSWQgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuJyk7XG5cbiAgICB2YXIgZmVhdHVyZXMgPSBjb252ZXJ0KGRhdGEsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy50aWxlcyA9IHt9O1xuICAgIHRoaXMudGlsZUNvb3JkcyA9IFtdO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgncHJlcHJvY2VzcyBkYXRhJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpbmRleDogbWF4Wm9vbTogJWQsIG1heFBvaW50czogJWQnLCBvcHRpb25zLmluZGV4TWF4Wm9vbSwgb3B0aW9ucy5pbmRleE1heFBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZSgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHt9O1xuICAgICAgICB0aGlzLnRvdGFsID0gMDtcbiAgICB9XG5cbiAgICBmZWF0dXJlcyA9IHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMpO1xuXG4gICAgLy8gc3RhcnQgc2xpY2luZyBmcm9tIHRoZSB0b3AgdGlsZSBkb3duXG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgdGhpcy5zcGxpdFRpbGUoZmVhdHVyZXMsIDAsIDAsIDApO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIGNvbnNvbGUubG9nKCdmZWF0dXJlczogJWQsIHBvaW50czogJWQnLCB0aGlzLnRpbGVzWzBdLm51bUZlYXR1cmVzLCB0aGlzLnRpbGVzWzBdLm51bVBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3RpbGVzIGdlbmVyYXRlZDonLCB0aGlzLnRvdGFsLCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSk7XG4gICAgfVxufVxuXG5HZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnMgPSB7XG4gICAgbWF4Wm9vbTogMTQsICAgICAgICAgICAgLy8gbWF4IHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIG9uXG4gICAgaW5kZXhNYXhab29tOiA1LCAgICAgICAgLy8gbWF4IHpvb20gaW4gdGhlIHRpbGUgaW5kZXhcbiAgICBpbmRleE1heFBvaW50czogMTAwMDAwLCAvLyBtYXggbnVtYmVyIG9mIHBvaW50cyBwZXIgdGlsZSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIHRvbGVyYW5jZTogMywgICAgICAgICAgIC8vIHNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpXG4gICAgZXh0ZW50OiA0MDk2LCAgICAgICAgICAgLy8gdGlsZSBleHRlbnRcbiAgICBidWZmZXI6IDY0LCAgICAgICAgICAgICAvLyB0aWxlIGJ1ZmZlciBvbiBlYWNoIHNpZGVcbiAgICBsaW5lTWV0cmljczogZmFsc2UsICAgICAvLyB3aGV0aGVyIHRvIGNhbGN1bGF0ZSBsaW5lIG1ldHJpY3NcbiAgICBwcm9tb3RlSWQ6IG51bGwsICAgICAgICAvLyBuYW1lIG9mIGEgZmVhdHVyZSBwcm9wZXJ0eSB0byBiZSBwcm9tb3RlZCB0byBmZWF0dXJlLmlkXG4gICAgZ2VuZXJhdGVJZDogZmFsc2UsICAgICAgLy8gd2hldGhlciB0byBnZW5lcmF0ZSBmZWF0dXJlIGlkcy4gQ2Fubm90IGJlIHVzZWQgd2l0aCBwcm9tb3RlSWRcbiAgICBkZWJ1ZzogMCAgICAgICAgICAgICAgICAvLyBsb2dnaW5nIGxldmVsICgwLCAxIG9yIDIpXG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLnNwbGl0VGlsZSA9IGZ1bmN0aW9uIChmZWF0dXJlcywgeiwgeCwgeSwgY3osIGN4LCBjeSkge1xuXG4gICAgdmFyIHN0YWNrID0gW2ZlYXR1cmVzLCB6LCB4LCB5XSxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgLy8gYXZvaWQgcmVjdXJzaW9uIGJ5IHVzaW5nIGEgcHJvY2Vzc2luZyBxdWV1ZVxuICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgeSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB4ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHogPSBzdGFjay5wb3AoKTtcbiAgICAgICAgZmVhdHVyZXMgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICB2YXIgejIgPSAxIDw8IHosXG4gICAgICAgICAgICBpZCA9IHRvSUQoeiwgeCwgeSksXG4gICAgICAgICAgICB0aWxlID0gdGhpcy50aWxlc1tpZF07XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NyZWF0aW9uJyk7XG5cbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHosIHgsIHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6IHosIHg6IHgsIHk6IHl9KTtcblxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHosIHgsIHksIHRpbGUubnVtRmVhdHVyZXMsIHRpbGUubnVtUG9pbnRzLCB0aWxlLm51bVNpbXBsaWZpZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2NyZWF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAneicgKyB6O1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHNba2V5XSA9ICh0aGlzLnN0YXRzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWwrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGdlb21ldHJ5IGluIHRpbGUgc28gdGhhdCB3ZSBjYW4gZHJpbGwgZG93biBsYXRlciBpZiB3ZSBzdG9wIG5vd1xuICAgICAgICB0aWxlLnNvdXJjZSA9IGZlYXR1cmVzO1xuXG4gICAgICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0LXBhc3MgdGlsaW5nXG4gICAgICAgIGlmICghY3opIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgbWF4IHpvb20sIG9yIGlmIHRoZSB0aWxlIGlzIHRvbyBzaW1wbGVcbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLmluZGV4TWF4Wm9vbSB8fCB0aWxlLm51bVBvaW50cyA8PSBvcHRpb25zLmluZGV4TWF4UG9pbnRzKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBhIGRyaWxsZG93biB0byBhIHNwZWNpZmljIHRpbGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgYmFzZSB6b29tIG9yIG91ciB0YXJnZXQgdGlsZSB6b29tXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5tYXhab29tIHx8IHogPT09IGN6KSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgaXQncyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIHRhcmdldCB0aWxlXG4gICAgICAgICAgICB2YXIgbSA9IDEgPDwgKGN6IC0geik7XG4gICAgICAgICAgICBpZiAoeCAhPT0gTWF0aC5mbG9vcihjeCAvIG0pIHx8IHkgIT09IE1hdGguZmxvb3IoY3kgLyBtKSkgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB3ZSBzbGljZSBmdXJ0aGVyIGRvd24sIG5vIG5lZWQgdG8ga2VlcCBzb3VyY2UgZ2VvbWV0cnlcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY2xpcHBpbmcnKTtcblxuICAgICAgICAvLyB2YWx1ZXMgd2UnbGwgdXNlIGZvciBjbGlwcGluZ1xuICAgICAgICB2YXIgazEgPSAwLjUgKiBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICAgICAgazIgPSAwLjUgLSBrMSxcbiAgICAgICAgICAgIGszID0gMC41ICsgazEsXG4gICAgICAgICAgICBrNCA9IDEgKyBrMSxcbiAgICAgICAgICAgIHRsLCBibCwgdHIsIGJyLCBsZWZ0LCByaWdodDtcblxuICAgICAgICB0bCA9IGJsID0gdHIgPSBiciA9IG51bGw7XG5cbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCAtIGsxLCB4ICsgazMsIDAsIHRpbGUubWluWCwgdGlsZS5tYXhYLCBvcHRpb25zKTtcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCArIGsyLCB4ICsgazQsIDAsIHRpbGUubWluWCwgdGlsZS5tYXhYLCBvcHRpb25zKTtcbiAgICAgICAgZmVhdHVyZXMgPSBudWxsO1xuXG4gICAgICAgIGlmIChsZWZ0KSB7XG4gICAgICAgICAgICB0bCA9IGNsaXAobGVmdCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBibCA9IGNsaXAobGVmdCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBsZWZ0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgdHIgPSBjbGlwKHJpZ2h0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIHRpbGUubWluWSwgdGlsZS5tYXhZLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGJyID0gY2xpcChyaWdodCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCB0aWxlLm1pblksIHRpbGUubWF4WSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByaWdodCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2NsaXBwaW5nJyk7XG5cbiAgICAgICAgc3RhY2sucHVzaCh0bCB8fCBbXSwgeiArIDEsIHggKiAyLCAgICAgeSAqIDIpO1xuICAgICAgICBzdGFjay5wdXNoKGJsIHx8IFtdLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMiArIDEpO1xuICAgICAgICBzdGFjay5wdXNoKHRyIHx8IFtdLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMik7XG4gICAgICAgIHN0YWNrLnB1c2goYnIgfHwgW10sIHogKyAxLCB4ICogMiArIDEsIHkgKiAyICsgMSk7XG4gICAgfVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5nZXRUaWxlID0gZnVuY3Rpb24gKHosIHgsIHkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZXh0ZW50ID0gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmICh6IDwgMCB8fCB6ID4gMjQpIHJldHVybiBudWxsO1xuXG4gICAgdmFyIHoyID0gMSA8PCB6O1xuICAgIHggPSAoKHggJSB6MikgKyB6MikgJSB6MjsgLy8gd3JhcCB0aWxlIHggY29vcmRpbmF0ZVxuXG4gICAgdmFyIGlkID0gdG9JRCh6LCB4LCB5KTtcbiAgICBpZiAodGhpcy50aWxlc1tpZF0pIHJldHVybiB0cmFuc2Zvcm0odGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQnLCB6LCB4LCB5KTtcblxuICAgIHZhciB6MCA9IHosXG4gICAgICAgIHgwID0geCxcbiAgICAgICAgeTAgPSB5LFxuICAgICAgICBwYXJlbnQ7XG5cbiAgICB3aGlsZSAoIXBhcmVudCAmJiB6MCA+IDApIHtcbiAgICAgICAgejAtLTtcbiAgICAgICAgeDAgPSBNYXRoLmZsb29yKHgwIC8gMik7XG4gICAgICAgIHkwID0gTWF0aC5mbG9vcih5MCAvIDIpO1xuICAgICAgICBwYXJlbnQgPSB0aGlzLnRpbGVzW3RvSUQoejAsIHgwLCB5MCldO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQuc291cmNlKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIGlmIHdlIGZvdW5kIGEgcGFyZW50IHRpbGUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZ2VvbWV0cnksIHdlIGNhbiBkcmlsbCBkb3duIGZyb20gaXRcbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZm91bmQgcGFyZW50IHRpbGUgeiVkLSVkLSVkJywgejAsIHgwLCB5MCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICB0aGlzLnNwbGl0VGlsZShwYXJlbnQuc291cmNlLCB6MCwgeDAsIHkwLCB6LCB4LCB5KTtcbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWVFbmQoJ2RyaWxsaW5nIGRvd24nKTtcblxuICAgIHJldHVybiB0aGlzLnRpbGVzW2lkXSA/IHRyYW5zZm9ybSh0aGlzLnRpbGVzW2lkXSwgZXh0ZW50KSA6IG51bGw7XG59O1xuXG5mdW5jdGlvbiB0b0lEKHosIHgsIHkpIHtcbiAgICByZXR1cm4gKCgoMSA8PCB6KSAqIHkgKyB4KSAqIDMyKSArIHo7XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpIGluIHNyYykgZGVzdFtpXSA9IHNyY1tpXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Z2V0SlNPTn0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcblxuaW1wb3J0IHtnZXRQZXJmb3JtYW5jZU1lYXN1cmVtZW50fSBmcm9tICcuLi91dGlsL3BlcmZvcm1hbmNlLmpzJztcbmltcG9ydCByZXdpbmQgZnJvbSAnQG1hcGJveC9nZW9qc29uLXJld2luZCc7XG5pbXBvcnQgR2VvSlNPTldyYXBwZXIgZnJvbSAnLi9nZW9qc29uX3dyYXBwZXIuanMnO1xuaW1wb3J0IHZ0cGJmIGZyb20gJ3Z0LXBiZic7XG5pbXBvcnQgU3VwZXJjbHVzdGVyIGZyb20gJ3N1cGVyY2x1c3Rlcic7XG5pbXBvcnQgZ2VvanNvbnZ0IGZyb20gJ2dlb2pzb24tdnQnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IFZlY3RvclRpbGVXb3JrZXJTb3VyY2UgZnJvbSAnLi92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlLmpzJztcbmltcG9ydCB7Y3JlYXRlRXhwcmVzc2lvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL2luZGV4LmpzJztcblxuaW1wb3J0IHR5cGUge1xuICAgIFJlcXVlc3RlZFRpbGVQYXJhbWV0ZXJzLFxuICAgIFdvcmtlclRpbGVQYXJhbWV0ZXJzLFxuICAgIFdvcmtlclRpbGVDYWxsYmFjayxcbn0gZnJvbSAnLi4vc291cmNlL3dvcmtlcl9zb3VyY2UuanMnO1xuXG5pbXBvcnQgdHlwZSBBY3RvciBmcm9tICcuLi91dGlsL2FjdG9yLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXJJbmRleCBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllcl9pbmRleC5qcyc7XG5cbmltcG9ydCB0eXBlIHtMb2FkVmVjdG9yRGF0YUNhbGxiYWNrfSBmcm9tICcuL3ZlY3Rvcl90aWxlX3dvcmtlcl9zb3VyY2UuanMnO1xuaW1wb3J0IHR5cGUge1JlcXVlc3RQYXJhbWV0ZXJzLCBSZXNwb25zZUNhbGxiYWNrfSBmcm9tICcuLi91dGlsL2FqYXguanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTkZlYXR1cmV9IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5cbmV4cG9ydCB0eXBlIEdlb0pTT05Xb3JrZXJPcHRpb25zID0ge1xuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIGNsdXN0ZXI6IGJvb2xlYW4sXG4gICAgc3VwZXJjbHVzdGVyT3B0aW9ucz86IE9iamVjdCxcbiAgICBnZW9qc29uVnRPcHRpb25zPzogT2JqZWN0LFxuICAgIGNsdXN0ZXJQcm9wZXJ0aWVzPzogT2JqZWN0LFxuICAgIGZpbHRlcj86IEFycmF5PG1peGVkPlxufTtcblxuZXhwb3J0IHR5cGUgTG9hZEdlb0pTT05QYXJhbWV0ZXJzID0gR2VvSlNPTldvcmtlck9wdGlvbnMgJiB7XG4gICAgcmVxdWVzdD86IFJlcXVlc3RQYXJhbWV0ZXJzLFxuICAgIGRhdGE/OiBzdHJpbmdcbn07XG5cbmV4cG9ydCB0eXBlIExvYWRHZW9KU09OID0gKHBhcmFtczogTG9hZEdlb0pTT05QYXJhbWV0ZXJzLCBjYWxsYmFjazogUmVzcG9uc2VDYWxsYmFjazxPYmplY3Q+KSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdlb0pTT05JbmRleCB7XG4gICAgZ2V0VGlsZSh6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogT2JqZWN0O1xuXG4gICAgLy8gc3VwZXJjbHVzdGVyIG1ldGhvZHNcbiAgICBnZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShjbHVzdGVySWQ6IG51bWJlcik6IG51bWJlcjtcbiAgICBnZXRDaGlsZHJlbihjbHVzdGVySWQ6IG51bWJlcik6IEFycmF5PEdlb0pTT05GZWF0dXJlPjtcbiAgICBnZXRMZWF2ZXMoY2x1c3RlcklkOiBudW1iZXIsIGxpbWl0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyKTogQXJyYXk8R2VvSlNPTkZlYXR1cmU+O1xufVxuXG5mdW5jdGlvbiBsb2FkR2VvSlNPTlRpbGUocGFyYW1zOiBSZXF1ZXN0ZWRUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IExvYWRWZWN0b3JEYXRhQ2FsbGJhY2spIHtcbiAgICBjb25zdCBjYW5vbmljYWwgPSBwYXJhbXMudGlsZUlELmNhbm9uaWNhbDtcblxuICAgIGlmICghdGhpcy5fZ2VvSlNPTkluZGV4KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTsgIC8vIHdlIGNvdWxkbid0IGxvYWQgdGhlIGZpbGVcbiAgICB9XG5cbiAgICBjb25zdCBnZW9KU09OVGlsZSA9IHRoaXMuX2dlb0pTT05JbmRleC5nZXRUaWxlKGNhbm9uaWNhbC56LCBjYW5vbmljYWwueCwgY2Fub25pY2FsLnkpO1xuICAgIGlmICghZ2VvSlNPTlRpbGUpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG51bGwpOyAvLyBub3RoaW5nIGluIHRoZSBnaXZlbiB0aWxlXG4gICAgfVxuXG4gICAgY29uc3QgZ2VvanNvbldyYXBwZXIgPSBuZXcgR2VvSlNPTldyYXBwZXIoZ2VvSlNPTlRpbGUuZmVhdHVyZXMpO1xuXG4gICAgLy8gRW5jb2RlIHRoZSBnZW9qc29uLXZ0IHRpbGUgaW50byBiaW5hcnkgdmVjdG9yIHRpbGUgZm9ybS4gIFRoaXNcbiAgICAvLyBpcyBhIGNvbnZlbmllbmNlIHRoYXQgYWxsb3dzIGBGZWF0dXJlSW5kZXhgIHRvIG9wZXJhdGUgdGhlIHNhbWUgd2F5XG4gICAgLy8gYWNyb3NzIGBWZWN0b3JUaWxlU291cmNlYCBhbmQgYEdlb0pTT05Tb3VyY2VgIGRhdGEuXG4gICAgbGV0IHBiZiA9IHZ0cGJmKGdlb2pzb25XcmFwcGVyKTtcbiAgICBpZiAocGJmLmJ5dGVPZmZzZXQgIT09IDAgfHwgcGJmLmJ5dGVMZW5ndGggIT09IHBiZi5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAvLyBDb21wYXRpYmlsaXR5IHdpdGggbm9kZSBCdWZmZXIgKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvcGJmL2lzc3Vlcy8zNSlcbiAgICAgICAgcGJmID0gbmV3IFVpbnQ4QXJyYXkocGJmKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayhudWxsLCB7XG4gICAgICAgIHZlY3RvclRpbGU6IGdlb2pzb25XcmFwcGVyLFxuICAgICAgICByYXdEYXRhOiBwYmYuYnVmZmVyXG4gICAgfSk7XG59XG5cbi8qKlxuICogVGhlIHtAbGluayBXb3JrZXJTb3VyY2V9IGltcGxlbWVudGF0aW9uIHRoYXQgc3VwcG9ydHMge0BsaW5rIEdlb0pTT05Tb3VyY2V9LlxuICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBlYXNpbHkgcmV1c2VkIHRvIHN1cHBvcnQgY3VzdG9tIHNvdXJjZSB0eXBlc1xuICogZm9yIGRhdGEgZm9ybWF0cyB0aGF0IGNhbiBiZSBwYXJzZWQvY29udmVydGVkIGludG8gYW4gaW4tbWVtb3J5IEdlb0pTT05cbiAqIHJlcHJlc2VudGF0aW9uLiAgVG8gZG8gc28sIGNyZWF0ZSBpdCB3aXRoXG4gKiBgbmV3IEdlb0pTT05Xb3JrZXJTb3VyY2UoYWN0b3IsIGxheWVySW5kZXgsIGN1c3RvbUxvYWRHZW9KU09ORnVuY3Rpb24pYC5cbiAqIEZvciBhIGZ1bGwgZXhhbXBsZSwgc2VlIFttYXBib3gtZ2wtdG9wb2pzb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZlbG9wbWVudHNlZWQvbWFwYm94LWdsLXRvcG9qc29uKS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBHZW9KU09OV29ya2VyU291cmNlIGV4dGVuZHMgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSB7XG4gICAgbG9hZEdlb0pTT046IExvYWRHZW9KU09OO1xuICAgIF9nZW9KU09OSW5kZXg6IEdlb0pTT05JbmRleFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIFtsb2FkR2VvSlNPTl0gT3B0aW9uYWwgbWV0aG9kIGZvciBjdXN0b20gbG9hZGluZy9wYXJzaW5nIG9mXG4gICAgICogR2VvSlNPTiBiYXNlZCBvbiBwYXJhbWV0ZXJzIHBhc3NlZCBmcm9tIHRoZSBtYWluLXRocmVhZCBTb3VyY2UuXG4gICAgICogU2VlIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2xvYWRHZW9KU09OfS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFjdG9yOiBBY3RvciwgbGF5ZXJJbmRleDogU3R5bGVMYXllckluZGV4LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4sIGlzU3ByaXRlTG9hZGVkOiBib29sZWFuLCBsb2FkR2VvSlNPTjogP0xvYWRHZW9KU09OKSB7XG4gICAgICAgIHN1cGVyKGFjdG9yLCBsYXllckluZGV4LCBhdmFpbGFibGVJbWFnZXMsIGlzU3ByaXRlTG9hZGVkLCBsb2FkR2VvSlNPTlRpbGUpO1xuICAgICAgICBpZiAobG9hZEdlb0pTT04pIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEdlb0pTT04gPSBsb2FkR2VvSlNPTjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgKGlmIGFwcHJvcHJpYXRlKSwgcGFyc2VzLCBhbmQgaW5kZXggZ2VvanNvbiBkYXRhIGludG8gdGlsZXMuIFRoaXNcbiAgICAgKiBwcmVwYXJhdG9yeSBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2xvYWRUaWxlfVxuICAgICAqIGNhbiBjb3JyZWN0bHkgc2VydmUgdXAgdGlsZXMuXG4gICAgICpcbiAgICAgKiBEZWZlcnMgdG8ge0BsaW5rIEdlb0pTT05Xb3JrZXJTb3VyY2UjbG9hZEdlb0pTT059IGZvciB0aGUgZmV0Y2hpbmcvcGFyc2luZyxcbiAgICAgKiBleHBlY3RpbmcgYGNhbGxiYWNrKGVycm9yLCBkYXRhKWAgdG8gYmUgY2FsbGVkIHdpdGggZWl0aGVyIGFuIGVycm9yIG9yIGFcbiAgICAgKiBwYXJzZWQgR2VvSlNPTiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBXaGVuIGBsb2FkRGF0YWAgcmVxdWVzdHMgY29tZSBpbiBmYXN0ZXIgdGhhbiB0aGV5IGNhbiBiZSBwcm9jZXNzZWQsXG4gICAgICogdGhleSBhcmUgY29hbGVzY2VkIGludG8gYSBzaW5nbGUgcmVxdWVzdCB1c2luZyB0aGUgbGF0ZXN0IGRhdGEuXG4gICAgICogU2VlIHtAbGluayBHZW9KU09OV29ya2VyU291cmNlI2NvYWxlc2NlfVxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqIEBwYXJhbSBjYWxsYmFja1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZERhdGEocGFyYW1zOiBMb2FkR2VvSlNPTlBhcmFtZXRlcnMsIGNhbGxiYWNrOiBDYWxsYmFjazx7cmVzb3VyY2VUaW1pbmc/OiB7W186IHN0cmluZ106IEFycmF5PFBlcmZvcm1hbmNlUmVzb3VyY2VUaW1pbmc+fX0+KSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXJhbSA9IHBhcmFtcyAmJiBwYXJhbXMucmVxdWVzdDtcbiAgICAgICAgY29uc3QgcGVyZiA9IHJlcXVlc3RQYXJhbSAmJiByZXF1ZXN0UGFyYW0uY29sbGVjdFJlc291cmNlVGltaW5nO1xuXG4gICAgICAgIHRoaXMubG9hZEdlb0pTT04ocGFyYW1zLCAoZXJyOiA/RXJyb3IsIGRhdGE6ID9PYmplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIgfHwgIWRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW5wdXQgZGF0YSBnaXZlbiB0byAnJHtwYXJhbXMuc291cmNlfScgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuYCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXdpbmQoZGF0YSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGlsZWQgPSBjcmVhdGVFeHByZXNzaW9uKHBhcmFtcy5maWx0ZXIsIHt0eXBlOiAnYm9vbGVhbicsICdwcm9wZXJ0eS10eXBlJzogJ2RhdGEtZHJpdmVuJywgb3ZlcnJpZGFibGU6IGZhbHNlLCB0cmFuc2l0aW9uOiBmYWxzZX0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVkLnJlc3VsdCA9PT0gJ2Vycm9yJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY29tcGlsZWQudmFsdWUubWFwKGVyciA9PiBgJHtlcnIua2V5fTogJHtlcnIubWVzc2FnZX1gKS5qb2luKCcsICcpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBkYXRhLmZlYXR1cmVzLmZpbHRlcihmZWF0dXJlID0+IGNvbXBpbGVkLnZhbHVlLmV2YWx1YXRlKHt6b29tOiAwfSwgZmVhdHVyZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHt0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLCBmZWF0dXJlc307XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZW9KU09OSW5kZXggPSBwYXJhbXMuY2x1c3RlciA/XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3VwZXJjbHVzdGVyKGdldFN1cGVyY2x1c3Rlck9wdGlvbnMocGFyYW1zKSkubG9hZChkYXRhLmZlYXR1cmVzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9qc29udnQoZGF0YSwgcGFyYW1zLmdlb2pzb25WdE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHt9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgICAgICAgICAgaWYgKHBlcmYpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VUaW1pbmdEYXRhID0gZ2V0UGVyZm9ybWFuY2VNZWFzdXJlbWVudChyZXF1ZXN0UGFyYW0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIG5lY2Vzc2FyeSB0byBldmFsIHRoZSByZXN1bHQgb2YgZ2V0RW50cmllc0J5TmFtZSgpIGhlcmUgdmlhIHBhcnNlL3N0cmluZ2lmeVxuICAgICAgICAgICAgICAgICAgICAvLyBsYXRlIGV2YWx1YXRpb24gaW4gdGhlIG1haW4gdGhyZWFkIGNhdXNlcyBUeXBlRXJyb3I6IGlsbGVnYWwgaW52b2NhdGlvblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VUaW1pbmdEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzb3VyY2VUaW1pbmcgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXNvdXJjZVRpbWluZ1twYXJhbXMuc291cmNlXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzb3VyY2VUaW1pbmdEYXRhKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBJbXBsZW1lbnRzIHtAbGluayBXb3JrZXJTb3VyY2UjcmVsb2FkVGlsZX0uXG4gICAgKlxuICAgICogSWYgdGhlIHRpbGUgaXMgbG9hZGVkLCB1c2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiBWZWN0b3JUaWxlV29ya2VyU291cmNlLlxuICAgICogT3RoZXJ3aXNlLCBzdWNoIGFzIGFmdGVyIGEgc2V0RGF0YSgpIGNhbGwsIHdlIGxvYWQgdGhlIHRpbGUgZnJlc2guXG4gICAgKlxuICAgICogQHBhcmFtIHBhcmFtc1xuICAgICogQHBhcmFtIHBhcmFtcy51aWQgVGhlIFVJRCBmb3IgdGhpcyB0aWxlLlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIHJlbG9hZFRpbGUocGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjayk6IHZvaWQge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLmxvYWRlZCxcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQ7XG5cbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlbG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkVGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGFuZCBwYXJzZSBHZW9KU09OIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gcGFyYW1zLiAgQ2FsbHMgYGNhbGxiYWNrYFxuICAgICAqIHdpdGggYChlcnIsIGRhdGEpYCwgd2hlcmUgYGRhdGFgIGlzIGEgcGFyc2VkIEdlb0pTT04gb2JqZWN0LlxuICAgICAqXG4gICAgICogR2VvSlNPTiBpcyBsb2FkZWQgYW5kIHBhcnNlZCBmcm9tIGBwYXJhbXMudXJsYCBpZiBpdCBleGlzdHMsIG9yIGVsc2VcbiAgICAgKiBleHBlY3RlZCBhcyBhIGxpdGVyYWwgKHN0cmluZyBvciBvYmplY3QpIGBwYXJhbXMuZGF0YWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICogQHBhcmFtIFtwYXJhbXMudXJsXSBBIFVSTCB0byB0aGUgcmVtb3RlIEdlb0pTT04gZGF0YS5cbiAgICAgKiBAcGFyYW0gW3BhcmFtcy5kYXRhXSBMaXRlcmFsIEdlb0pTT04gZGF0YS4gTXVzdCBiZSBwcm92aWRlZCBpZiBgcGFyYW1zLnVybGAgaXMgbm90LlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZEdlb0pTT04ocGFyYW1zOiBMb2FkR2VvSlNPTlBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPE9iamVjdD4pOiB2b2lkIHtcbiAgICAgICAgLy8gQmVjYXVzZSBvZiBzYW1lIG9yaWdpbiBpc3N1ZXMsIHVybHMgbXVzdCBlaXRoZXIgaW5jbHVkZSBhbiBleHBsaWNpdFxuICAgICAgICAvLyBvcmlnaW4gb3IgYWJzb2x1dGUgcGF0aC5cbiAgICAgICAgLy8gaWU6IC9mb28vYmFyLmpzb24gb3IgaHR0cDovL2V4YW1wbGUuY29tL2Jhci5qc29uXG4gICAgICAgIC8vIGJ1dCBub3QgLi4vZm9vL2Jhci5qc29uXG4gICAgICAgIGlmIChwYXJhbXMucmVxdWVzdCkge1xuICAgICAgICAgICAgZ2V0SlNPTihwYXJhbXMucmVxdWVzdCwgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXMuZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIEpTT04ucGFyc2UocGFyYW1zLmRhdGEpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBJbnB1dCBkYXRhIGdpdmVuIHRvICcke3BhcmFtcy5zb3VyY2V9JyBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBJbnB1dCBkYXRhIGdpdmVuIHRvICcke3BhcmFtcy5zb3VyY2V9JyBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5gKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDbHVzdGVyRXhwYW5zaW9uWm9vbShwYXJhbXM6IHtjbHVzdGVySWQ6IG51bWJlcn0sIGNhbGxiYWNrOiBDYWxsYmFjazxudW1iZXI+KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzLl9nZW9KU09OSW5kZXguZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20ocGFyYW1zLmNsdXN0ZXJJZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENsdXN0ZXJDaGlsZHJlbihwYXJhbXM6IHtjbHVzdGVySWQ6IG51bWJlcn0sIGNhbGxiYWNrOiBDYWxsYmFjazxBcnJheTxHZW9KU09ORmVhdHVyZT4+KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCB0aGlzLl9nZW9KU09OSW5kZXguZ2V0Q2hpbGRyZW4ocGFyYW1zLmNsdXN0ZXJJZCkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENsdXN0ZXJMZWF2ZXMocGFyYW1zOiB7Y2x1c3RlcklkOiBudW1iZXIsIGxpbWl0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyfSwgY2FsbGJhY2s6IENhbGxiYWNrPEFycmF5PEdlb0pTT05GZWF0dXJlPj4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHRoaXMuX2dlb0pTT05JbmRleC5nZXRMZWF2ZXMocGFyYW1zLmNsdXN0ZXJJZCwgcGFyYW1zLmxpbWl0LCBwYXJhbXMub2Zmc2V0KSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRTdXBlcmNsdXN0ZXJPcHRpb25zKHtzdXBlcmNsdXN0ZXJPcHRpb25zLCBjbHVzdGVyUHJvcGVydGllc30pIHtcbiAgICBpZiAoIWNsdXN0ZXJQcm9wZXJ0aWVzIHx8ICFzdXBlcmNsdXN0ZXJPcHRpb25zKSByZXR1cm4gc3VwZXJjbHVzdGVyT3B0aW9ucztcblxuICAgIGNvbnN0IG1hcEV4cHJlc3Npb25zID0ge307XG4gICAgY29uc3QgcmVkdWNlRXhwcmVzc2lvbnMgPSB7fTtcbiAgICBjb25zdCBnbG9iYWxzID0ge2FjY3VtdWxhdGVkOiBudWxsLCB6b29tOiAwfTtcbiAgICBjb25zdCBmZWF0dXJlID0ge3Byb3BlcnRpZXM6IG51bGx9O1xuICAgIGNvbnN0IHByb3BlcnR5TmFtZXMgPSBPYmplY3Qua2V5cyhjbHVzdGVyUHJvcGVydGllcyk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IFtvcGVyYXRvciwgbWFwRXhwcmVzc2lvbl0gPSBjbHVzdGVyUHJvcGVydGllc1trZXldO1xuXG4gICAgICAgIGNvbnN0IG1hcEV4cHJlc3Npb25QYXJzZWQgPSBjcmVhdGVFeHByZXNzaW9uKG1hcEV4cHJlc3Npb24pO1xuICAgICAgICBjb25zdCByZWR1Y2VFeHByZXNzaW9uUGFyc2VkID0gY3JlYXRlRXhwcmVzc2lvbihcbiAgICAgICAgICAgIHR5cGVvZiBvcGVyYXRvciA9PT0gJ3N0cmluZycgPyBbb3BlcmF0b3IsIFsnYWNjdW11bGF0ZWQnXSwgWydnZXQnLCBrZXldXSA6IG9wZXJhdG9yKTtcblxuICAgICAgICBhc3NlcnQobWFwRXhwcmVzc2lvblBhcnNlZC5yZXN1bHQgPT09ICdzdWNjZXNzJyk7XG4gICAgICAgIGFzc2VydChyZWR1Y2VFeHByZXNzaW9uUGFyc2VkLnJlc3VsdCA9PT0gJ3N1Y2Nlc3MnKTtcblxuICAgICAgICBtYXBFeHByZXNzaW9uc1trZXldID0gbWFwRXhwcmVzc2lvblBhcnNlZC52YWx1ZTtcbiAgICAgICAgcmVkdWNlRXhwcmVzc2lvbnNba2V5XSA9IHJlZHVjZUV4cHJlc3Npb25QYXJzZWQudmFsdWU7XG4gICAgfVxuXG4gICAgc3VwZXJjbHVzdGVyT3B0aW9ucy5tYXAgPSAocG9pbnRQcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllcyA9IHBvaW50UHJvcGVydGllcztcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzW2tleV0gPSBtYXBFeHByZXNzaW9uc1trZXldLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH07XG4gICAgc3VwZXJjbHVzdGVyT3B0aW9ucy5yZWR1Y2UgPSAoYWNjdW11bGF0ZWQsIGNsdXN0ZXJQcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllcyA9IGNsdXN0ZXJQcm9wZXJ0aWVzO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBwcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICBnbG9iYWxzLmFjY3VtdWxhdGVkID0gYWNjdW11bGF0ZWRba2V5XTtcbiAgICAgICAgICAgIGFjY3VtdWxhdGVkW2tleV0gPSByZWR1Y2VFeHByZXNzaW9uc1trZXldLmV2YWx1YXRlKGdsb2JhbHMsIGZlYXR1cmUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBzdXBlcmNsdXN0ZXJPcHRpb25zO1xufVxuXG5leHBvcnQgZGVmYXVsdCBHZW9KU09OV29ya2VyU291cmNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3IuanMnO1xuXG5pbXBvcnQgU3R5bGVMYXllckluZGV4IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4LmpzJztcbmltcG9ydCBWZWN0b3JUaWxlV29ya2VyU291cmNlIGZyb20gJy4vdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZS5qcyc7XG5pbXBvcnQgUmFzdGVyREVNVGlsZVdvcmtlclNvdXJjZSBmcm9tICcuL3Jhc3Rlcl9kZW1fdGlsZV93b3JrZXJfc291cmNlLmpzJztcbmltcG9ydCBHZW9KU09OV29ya2VyU291cmNlIGZyb20gJy4vZ2VvanNvbl93b3JrZXJfc291cmNlLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7cGx1Z2luIGFzIGdsb2JhbFJUTFRleHRQbHVnaW59IGZyb20gJy4vcnRsX3RleHRfcGx1Z2luLmpzJztcbmltcG9ydCB7ZW5mb3JjZUNhY2hlU2l6ZUxpbWl0fSBmcm9tICcuLi91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZS5qcyc7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7UGVyZm9ybWFuY2VVdGlsc30gZnJvbSAnLi4vdXRpbC9wZXJmb3JtYW5jZS5qcyc7XG5pbXBvcnQge0V2ZW50fSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHtnZXRQcm9qZWN0aW9ufSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9pbmRleC5qcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBXb3JrZXJTb3VyY2UsXG4gICAgV29ya2VyVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyREVNVGlsZVBhcmFtZXRlcnMsXG4gICAgV29ya2VyVGlsZUNhbGxiYWNrLFxuICAgIFdvcmtlckRFTVRpbGVDYWxsYmFjayxcbiAgICBUaWxlUGFyYW1ldGVyc1xufSBmcm9tICcuLi9zb3VyY2Uvd29ya2VyX3NvdXJjZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtXb3JrZXJHbG9iYWxTY29wZUludGVyZmFjZX0gZnJvbSAnLi4vdXRpbC93ZWJfd29ya2VyLmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUge0xheWVyU3BlY2lmaWNhdGlvbiwgUHJvamVjdGlvblNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1BsdWdpblN0YXRlfSBmcm9tICcuL3J0bF90ZXh0X3BsdWdpbi5qcyc7XG5pbXBvcnQgdHlwZSBQcm9qZWN0aW9uIGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3Byb2plY3Rpb24uanMnO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdvcmtlciB7XG4gICAgc2VsZjogV29ya2VyR2xvYmFsU2NvcGVJbnRlcmZhY2U7XG4gICAgYWN0b3I6IEFjdG9yO1xuICAgIGxheWVySW5kZXhlczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVySW5kZXggfTtcbiAgICBhdmFpbGFibGVJbWFnZXM6IHtbXzogc3RyaW5nXTogQXJyYXk8c3RyaW5nPiB9O1xuICAgIHdvcmtlclNvdXJjZVR5cGVzOiB7W186IHN0cmluZ106IENsYXNzPFdvcmtlclNvdXJjZT4gfTtcbiAgICB3b3JrZXJTb3VyY2VzOiB7W186IHN0cmluZ106IHtbXzogc3RyaW5nXToge1tfOiBzdHJpbmddOiBXb3JrZXJTb3VyY2UgfSB9IH07XG4gICAgZGVtV29ya2VyU291cmNlczoge1tfOiBzdHJpbmddOiB7W186IHN0cmluZ106IFJhc3RlckRFTVRpbGVXb3JrZXJTb3VyY2UgfSB9O1xuICAgIHByb2plY3Rpb25zOiB7W186IHN0cmluZ106IFByb2plY3Rpb24gfTtcbiAgICBkZWZhdWx0UHJvamVjdGlvbjogUHJvamVjdGlvbjtcbiAgICBpc1Nwcml0ZUxvYWRlZDoge1tfOiBzdHJpbmddOiBib29sZWFuIH07XG4gICAgcmVmZXJyZXI6ID9zdHJpbmc7XG4gICAgdGVycmFpbjogP2Jvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihzZWxmOiBXb3JrZXJHbG9iYWxTY29wZUludGVyZmFjZSkge1xuICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLm1lYXN1cmUoJ3dvcmtlckV2YWx1YXRlU2NyaXB0Jyk7XG4gICAgICAgIHRoaXMuc2VsZiA9IHNlbGY7XG4gICAgICAgIHRoaXMuYWN0b3IgPSBuZXcgQWN0b3Ioc2VsZiwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5sYXllckluZGV4ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5hdmFpbGFibGVJbWFnZXMgPSB7fTtcbiAgICAgICAgdGhpcy5pc1Nwcml0ZUxvYWRlZCA9IHt9O1xuXG4gICAgICAgIHRoaXMucHJvamVjdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5kZWZhdWx0UHJvamVjdGlvbiA9IGdldFByb2plY3Rpb24oe25hbWU6ICdtZXJjYXRvcid9KTtcblxuICAgICAgICB0aGlzLndvcmtlclNvdXJjZVR5cGVzID0ge1xuICAgICAgICAgICAgdmVjdG9yOiBWZWN0b3JUaWxlV29ya2VyU291cmNlLFxuICAgICAgICAgICAgZ2VvanNvbjogR2VvSlNPTldvcmtlclNvdXJjZVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFttYXBJZF1bc291cmNlVHlwZV1bc291cmNlTmFtZV0gPT4gd29ya2VyIHNvdXJjZSBpbnN0YW5jZVxuICAgICAgICB0aGlzLndvcmtlclNvdXJjZXMgPSB7fTtcbiAgICAgICAgdGhpcy5kZW1Xb3JrZXJTb3VyY2VzID0ge307XG5cbiAgICAgICAgdGhpcy5zZWxmLnJlZ2lzdGVyV29ya2VyU291cmNlID0gKG5hbWU6IHN0cmluZywgV29ya2VyU291cmNlOiBDbGFzczxXb3JrZXJTb3VyY2U+KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy53b3JrZXJTb3VyY2VUeXBlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV29ya2VyIHNvdXJjZSB3aXRoIG5hbWUgXCIke25hbWV9XCIgYWxyZWFkeSByZWdpc3RlcmVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VUeXBlc1tuYW1lXSA9IFdvcmtlclNvdXJjZTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUaGlzIGlzIGludm9rZWQgYnkgdGhlIFJUTCB0ZXh0IHBsdWdpbiB3aGVuIHRoZSBkb3dubG9hZCB2aWEgdGhlIGBpbXBvcnRTY3JpcHRzYCBjYWxsIGhhcyBmaW5pc2hlZCwgYW5kIHRoZSBjb2RlIGhhcyBiZWVuIHBhcnNlZC5cbiAgICAgICAgdGhpcy5zZWxmLnJlZ2lzdGVyUlRMVGV4dFBsdWdpbiA9IChydGxUZXh0UGx1Z2luOiB7YXBwbHlBcmFiaWNTaGFwaW5nOiBGdW5jdGlvbiwgcHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0OiBGdW5jdGlvbiwgcHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0PzogRnVuY3Rpb259KSA9PiB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsUlRMVGV4dFBsdWdpbi5pc1BhcnNlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSVEwgdGV4dCBwbHVnaW4gYWxyZWFkeSByZWdpc3RlcmVkLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2xvYmFsUlRMVGV4dFBsdWdpblsnYXBwbHlBcmFiaWNTaGFwaW5nJ10gPSBydGxUZXh0UGx1Z2luLmFwcGx5QXJhYmljU2hhcGluZztcbiAgICAgICAgICAgIGdsb2JhbFJUTFRleHRQbHVnaW5bJ3Byb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCddID0gcnRsVGV4dFBsdWdpbi5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQ7XG4gICAgICAgICAgICBnbG9iYWxSVExUZXh0UGx1Z2luWydwcm9jZXNzU3R5bGVkQmlkaXJlY3Rpb25hbFRleHQnXSA9IHJ0bFRleHRQbHVnaW4ucHJvY2Vzc1N0eWxlZEJpZGlyZWN0aW9uYWxUZXh0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNsZWFyQ2FjaGVzKG1hcElkOiBzdHJpbmcsIHVudXNlZDogbWl4ZWQsIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgZGVsZXRlIHRoaXMubGF5ZXJJbmRleGVzW21hcElkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuYXZhaWxhYmxlSW1hZ2VzW21hcElkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGNoZWNrSWZSZWFkeShtYXBJRDogc3RyaW5nLCB1bnVzZWQ6IG1peGVkLCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIC8vIG5vb3AsIHVzZWQgdG8gY2hlY2sgaWYgYSB3b3JrZXIgaXMgZnVsbHkgc2V0IHVwIGFuZCByZWFkeSB0byByZWNlaXZlIG1lc3NhZ2VzXG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgc2V0UmVmZXJyZXIobWFwSUQ6IHN0cmluZywgcmVmZXJyZXI6IHN0cmluZykge1xuICAgICAgICB0aGlzLnJlZmVycmVyID0gcmVmZXJyZXI7XG4gICAgfVxuXG4gICAgc3ByaXRlTG9hZGVkKG1hcElkOiBzdHJpbmcsIGJvb2w6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5pc1Nwcml0ZUxvYWRlZFttYXBJZF0gPSBib29sO1xuICAgICAgICBmb3IgKGNvbnN0IHdvcmtlclNvdXJjZSBpbiB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdKSB7XG4gICAgICAgICAgICBjb25zdCB3cyA9IHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bd29ya2VyU291cmNlXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlIGluIHdzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdzW3NvdXJjZV0gaW5zdGFuY2VvZiBWZWN0b3JUaWxlV29ya2VyU291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdzW3NvdXJjZV0uaXNTcHJpdGVMb2FkZWQgPSBib29sO1xuICAgICAgICAgICAgICAgICAgICB3c1tzb3VyY2VdLmZpcmUobmV3IEV2ZW50KCdpc1Nwcml0ZUxvYWRlZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJbWFnZXMobWFwSWQ6IHN0cmluZywgaW1hZ2VzOiBBcnJheTxzdHJpbmc+LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlSW1hZ2VzW21hcElkXSA9IGltYWdlcztcbiAgICAgICAgZm9yIChjb25zdCB3b3JrZXJTb3VyY2UgaW4gdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXSkge1xuICAgICAgICAgICAgY29uc3Qgd3MgPSB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3dvcmtlclNvdXJjZV07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZSBpbiB3cykge1xuICAgICAgICAgICAgICAgIHdzW3NvdXJjZV0uYXZhaWxhYmxlSW1hZ2VzID0gaW1hZ2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgZW5hYmxlVGVycmFpbihtYXBJZDogc3RyaW5nLCBlbmFibGU6IGJvb2xlYW4sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy50ZXJyYWluID0gZW5hYmxlO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHNldFByb2plY3Rpb24obWFwSWQ6IHN0cmluZywgY29uZmlnOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbikge1xuICAgICAgICB0aGlzLnByb2plY3Rpb25zW21hcElkXSA9IGdldFByb2plY3Rpb24oY29uZmlnKTtcbiAgICB9XG5cbiAgICBzZXRMYXllcnMobWFwSWQ6IHN0cmluZywgbGF5ZXJzOiBBcnJheTxMYXllclNwZWNpZmljYXRpb24+LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuZ2V0TGF5ZXJJbmRleChtYXBJZCkucmVwbGFjZShsYXllcnMpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHVwZGF0ZUxheWVycyhtYXBJZDogc3RyaW5nLCBwYXJhbXM6IHtsYXllcnM6IEFycmF5PExheWVyU3BlY2lmaWNhdGlvbj4sIHJlbW92ZWRJZHM6IEFycmF5PHN0cmluZz59LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuZ2V0TGF5ZXJJbmRleChtYXBJZCkudXBkYXRlKHBhcmFtcy5sYXllcnMsIHBhcmFtcy5yZW1vdmVkSWRzKTtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZShtYXBJZDogc3RyaW5nLCBwYXJhbXM6IFdvcmtlclRpbGVQYXJhbWV0ZXJzICYge3R5cGU6IHN0cmluZ30sIGNhbGxiYWNrOiBXb3JrZXJUaWxlQ2FsbGJhY2spIHtcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlKTtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMuZW5hYmxlVGVycmFpbiA/IGV4dGVuZCh7ZW5hYmxlVGVycmFpbjogdGhpcy50ZXJyYWlufSwgcGFyYW1zKSA6IHBhcmFtcztcbiAgICAgICAgcC5wcm9qZWN0aW9uID0gdGhpcy5wcm9qZWN0aW9uc1ttYXBJZF0gfHwgdGhpcy5kZWZhdWx0UHJvamVjdGlvbjtcbiAgICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy50eXBlLCBwYXJhbXMuc291cmNlKS5sb2FkVGlsZShwLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgbG9hZERFTVRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBXb3JrZXJERU1UaWxlUGFyYW1ldGVycywgY2FsbGJhY2s6IFdvcmtlckRFTVRpbGVDYWxsYmFjaykge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5lbmFibGVUZXJyYWluID8gZXh0ZW5kKHtidWlsZFF1YWRUcmVlOiB0aGlzLnRlcnJhaW59LCBwYXJhbXMpIDogcGFyYW1zO1xuICAgICAgICB0aGlzLmdldERFTVdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnNvdXJjZSkubG9hZFRpbGUocCwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHJlbG9hZFRpbGUobWFwSWQ6IHN0cmluZywgcGFyYW1zOiBXb3JrZXJUaWxlUGFyYW1ldGVycyAmIHt0eXBlOiBzdHJpbmd9LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmVuYWJsZVRlcnJhaW4gPyBleHRlbmQoe2VuYWJsZVRlcnJhaW46IHRoaXMudGVycmFpbn0sIHBhcmFtcykgOiBwYXJhbXM7XG4gICAgICAgIHAucHJvamVjdGlvbiA9IHRoaXMucHJvamVjdGlvbnNbbWFwSWRdIHx8IHRoaXMuZGVmYXVsdFByb2plY3Rpb247XG4gICAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSwgcGFyYW1zLnNvdXJjZSkucmVsb2FkVGlsZShwLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgYWJvcnRUaWxlKG1hcElkOiBzdHJpbmcsIHBhcmFtczogVGlsZVBhcmFtZXRlcnMgJiB7dHlwZTogc3RyaW5nfSwgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xuICAgICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnR5cGUsIHBhcmFtcy5zb3VyY2UpLmFib3J0VGlsZShwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICByZW1vdmVUaWxlKG1hcElkOiBzdHJpbmcsIHBhcmFtczogVGlsZVBhcmFtZXRlcnMgJiB7dHlwZTogc3RyaW5nfSwgY2FsbGJhY2s6IFdvcmtlclRpbGVDYWxsYmFjaykge1xuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xuICAgICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnR5cGUsIHBhcmFtcy5zb3VyY2UpLnJlbW92ZVRpbGUocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgcmVtb3ZlU291cmNlKG1hcElkOiBzdHJpbmcsIHBhcmFtczoge3NvdXJjZTogc3RyaW5nfSAmIHt0eXBlOiBzdHJpbmd9LCBjYWxsYmFjazogV29ya2VyVGlsZUNhbGxiYWNrKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIGFzc2VydChwYXJhbXMuc291cmNlKTtcblxuICAgICAgICBpZiAoIXRoaXMud29ya2VyU291cmNlc1ttYXBJZF0gfHxcbiAgICAgICAgICAgICF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3BhcmFtcy50eXBlXSB8fFxuICAgICAgICAgICAgIXRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bcGFyYW1zLnR5cGVdW3BhcmFtcy5zb3VyY2VdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3b3JrZXIgPSB0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3BhcmFtcy50eXBlXVtwYXJhbXMuc291cmNlXTtcbiAgICAgICAgZGVsZXRlIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bcGFyYW1zLnR5cGVdW3BhcmFtcy5zb3VyY2VdO1xuXG4gICAgICAgIGlmICh3b3JrZXIucmVtb3ZlU291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdvcmtlci5yZW1vdmVTb3VyY2UocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHtAbGluayBXb3JrZXJTb3VyY2V9IHNjcmlwdCBhdCBwYXJhbXMudXJsLiAgVGhlIHNjcmlwdCBpcyBydW5cbiAgICAgKiAodXNpbmcgaW1wb3J0U2NyaXB0cykgd2l0aCBgcmVnaXN0ZXJXb3JrZXJTb3VyY2VgIGluIHNjb3BlLCB3aGljaCBpcyBhXG4gICAgICogZnVuY3Rpb24gdGFraW5nIGAobmFtZSwgd29ya2VyU291cmNlT2JqZWN0KWAuXG4gICAgICogIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZFdvcmtlclNvdXJjZShtYXA6IHN0cmluZywgcGFyYW1zOiB7IHVybDogc3RyaW5nIH0sIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5zZWxmLmltcG9ydFNjcmlwdHMocGFyYW1zLnVybCk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3luY1JUTFBsdWdpblN0YXRlKG1hcDogc3RyaW5nLCBzdGF0ZTogUGx1Z2luU3RhdGUsIGNhbGxiYWNrOiBDYWxsYmFjazxib29sZWFuPikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZ2xvYmFsUlRMVGV4dFBsdWdpbi5zZXRTdGF0ZShzdGF0ZSk7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW5VUkwgPSBnbG9iYWxSVExUZXh0UGx1Z2luLmdldFBsdWdpblVSTCgpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGdsb2JhbFJUTFRleHRQbHVnaW4uaXNMb2FkZWQoKSAmJlxuICAgICAgICAgICAgICAgICFnbG9iYWxSVExUZXh0UGx1Z2luLmlzUGFyc2VkKCkgJiZcbiAgICAgICAgICAgICAgICBwbHVnaW5VUkwgIT0gbnVsbCAvLyBOb3QgcG9zc2libGUgd2hlbiBgaXNMb2FkZWRgIGlzIHRydWUsIGJ1dCBrZWVwcyBmbG93IGhhcHB5XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGYuaW1wb3J0U2NyaXB0cyhwbHVnaW5VUkwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlID0gZ2xvYmFsUlRMVGV4dFBsdWdpbi5pc1BhcnNlZCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gY29tcGxldGUgPyB1bmRlZmluZWQgOiBuZXcgRXJyb3IoYFJUTCBUZXh0IFBsdWdpbiBmYWlsZWQgdG8gaW1wb3J0IHNjcmlwdHMgZnJvbSAke3BsdWdpblVSTH1gKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnJvciwgY29tcGxldGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0QXZhaWxhYmxlSW1hZ2VzKG1hcElkOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgbGV0IGF2YWlsYWJsZUltYWdlcyA9IHRoaXMuYXZhaWxhYmxlSW1hZ2VzW21hcElkXTtcblxuICAgICAgICBpZiAoIWF2YWlsYWJsZUltYWdlcykge1xuICAgICAgICAgICAgYXZhaWxhYmxlSW1hZ2VzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXZhaWxhYmxlSW1hZ2VzO1xuICAgIH1cblxuICAgIGdldExheWVySW5kZXgobWFwSWQ6IHN0cmluZyk6IFN0eWxlTGF5ZXJJbmRleCB7XG4gICAgICAgIGxldCBsYXllckluZGV4ZXMgPSB0aGlzLmxheWVySW5kZXhlc1ttYXBJZF07XG4gICAgICAgIGlmICghbGF5ZXJJbmRleGVzKSB7XG4gICAgICAgICAgICBsYXllckluZGV4ZXMgPSB0aGlzLmxheWVySW5kZXhlc1ttYXBJZF0gPSBuZXcgU3R5bGVMYXllckluZGV4KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheWVySW5kZXhlcztcbiAgICB9XG5cbiAgICBnZXRXb3JrZXJTb3VyY2UobWFwSWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZyk6IFdvcmtlclNvdXJjZSB7XG4gICAgICAgIGlmICghdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXSlcbiAgICAgICAgICAgIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF0gPSB7fTtcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3R5cGVdKVxuICAgICAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXSA9IHt9O1xuXG4gICAgICAgIGlmICghdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXVtzb3VyY2VdKSB7XG4gICAgICAgICAgICAvLyB1c2UgYSB3cmFwcGVkIGFjdG9yIHNvIHRoYXQgd2UgY2FuIGF0dGFjaCBhIHRhcmdldCBtYXBJZCBwYXJhbVxuICAgICAgICAgICAgLy8gdG8gYW55IG1lc3NhZ2VzIGludm9rZWQgYnkgdGhlIFdvcmtlclNvdXJjZVxuICAgICAgICAgICAgY29uc3QgYWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgc2VuZDogKHR5cGUsIGRhdGEsIGNhbGxiYWNrLCBfLCBtdXN0UXVldWUsIG1ldGFkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0b3Iuc2VuZCh0eXBlLCBkYXRhLCBjYWxsYmFjaywgbWFwSWQsIG11c3RRdWV1ZSwgbWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVyOiB0aGlzLmFjdG9yLnNjaGVkdWxlclxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bdHlwZV1bc291cmNlXSA9IG5ldyAodGhpcy53b3JrZXJTb3VyY2VUeXBlc1t0eXBlXTogYW55KSgoYWN0b3I6IGFueSksIHRoaXMuZ2V0TGF5ZXJJbmRleChtYXBJZCksIHRoaXMuZ2V0QXZhaWxhYmxlSW1hZ2VzKG1hcElkKSwgdGhpcy5pc1Nwcml0ZUxvYWRlZFttYXBJZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bdHlwZV1bc291cmNlXTtcbiAgICB9XG5cbiAgICBnZXRERU1Xb3JrZXJTb3VyY2UobWFwSWQ6IHN0cmluZywgc291cmNlOiBzdHJpbmcpOiBSYXN0ZXJERU1UaWxlV29ya2VyU291cmNlIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdKVxuICAgICAgICAgICAgdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW21hcElkXSA9IHt9O1xuXG4gICAgICAgIGlmICghdGhpcy5kZW1Xb3JrZXJTb3VyY2VzW21hcElkXVtzb3VyY2VdKSB7XG4gICAgICAgICAgICB0aGlzLmRlbVdvcmtlclNvdXJjZXNbbWFwSWRdW3NvdXJjZV0gPSBuZXcgUmFzdGVyREVNVGlsZVdvcmtlclNvdXJjZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVtV29ya2VyU291cmNlc1ttYXBJZF1bc291cmNlXTtcbiAgICB9XG5cbiAgICBlbmZvcmNlQ2FjaGVTaXplTGltaXQobWFwSWQ6IHN0cmluZywgbGltaXQ6IG51bWJlcikge1xuICAgICAgICBlbmZvcmNlQ2FjaGVTaXplTGltaXQobGltaXQpO1xuICAgIH1cblxuICAgIGdldFdvcmtlclBlcmZvcm1hbmNlTWV0cmljcyhtYXBJZDogc3RyaW5nLCBwYXJhbXM6IGFueSwgY2FsbGJhY2s6IChlcnJvcjogP0Vycm9yLCByZXN1bHQ6ID9PYmplY3QpID0+IHZvaWQpIHtcbiAgICAgICAgY2FsbGJhY2sodW5kZWZpbmVkLCBQZXJmb3JtYW5jZVV0aWxzLmdldFdvcmtlclBlcmZvcm1hbmNlTWV0cmljcygpKTtcbiAgICB9XG59XG5cbi8qIGdsb2JhbCBzZWxmLCBXb3JrZXJHbG9iYWxTY29wZSAqL1xuaWYgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUpIHtcbiAgICBzZWxmLndvcmtlciA9IG5ldyBXb3JrZXIoc2VsZik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuc3VwcG9ydGVkID0gaXNTdXBwb3J0ZWQ7XG5leHBvcnRzLm5vdFN1cHBvcnRlZFJlYXNvbiA9IG5vdFN1cHBvcnRlZFJlYXNvbjtcblxuLyoqXG4gKiBUZXN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBzdXBwb3J0cyBNYXBib3ggR0wgSlNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ9ZmFsc2VdIFJldHVybiBgZmFsc2VgXG4gKiAgIGlmIHRoZSBwZXJmb3JtYW5jZSBvZiBNYXBib3ggR0wgSlMgd291bGQgYmUgZHJhbWF0aWNhbGx5IHdvcnNlIHRoYW5cbiAqICAgZXhwZWN0ZWQgKGkuZS4gYSBzb2Z0d2FyZSByZW5kZXJlciBpcyB3b3VsZCBiZSB1c2VkKVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTdXBwb3J0ZWQob3B0aW9ucykge1xuICAgIHJldHVybiAhbm90U3VwcG9ydGVkUmVhc29uKG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBub3RTdXBwb3J0ZWRSZWFzb24ob3B0aW9ucykge1xuICAgIGlmICghaXNCcm93c2VyKCkpIHJldHVybiAnbm90IGEgYnJvd3Nlcic7XG4gICAgaWYgKCFpc0FycmF5U3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNlbnQgQXJyYXkgc3VwcG9ydCc7XG4gICAgaWYgKCFpc0Z1bmN0aW9uU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEZ1bmN0aW9uIHN1cHBvcnQnO1xuICAgIGlmICghaXNPYmplY3RTdXBwb3J0ZWQoKSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgT2JqZWN0IHN1cHBvcnQnO1xuICAgIGlmICghaXNKU09OU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEpTT04gc3VwcG9ydCc7XG4gICAgaWYgKCFpc1dvcmtlclN1cHBvcnRlZCgpKSByZXR1cm4gJ2luc3VmZmljaWVudCB3b3JrZXIgc3VwcG9ydCc7XG4gICAgaWYgKCFpc1VpbnQ4Q2xhbXBlZEFycmF5U3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IFVpbnQ4Q2xhbXBlZEFycmF5IHN1cHBvcnQnO1xuICAgIGlmICghaXNBcnJheUJ1ZmZlclN1cHBvcnRlZCgpKSByZXR1cm4gJ2luc3VmZmljaWVudCBBcnJheUJ1ZmZlciBzdXBwb3J0JztcbiAgICBpZiAoIWlzQ2FudmFzR2V0SW1hZ2VEYXRhU3VwcG9ydGVkKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IENhbnZhcy9nZXRJbWFnZURhdGEgc3VwcG9ydCc7XG4gICAgaWYgKCFpc1dlYkdMU3VwcG9ydGVkQ2FjaGVkKG9wdGlvbnMgJiYgb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSkgcmV0dXJuICdpbnN1ZmZpY2llbnQgV2ViR0wgc3VwcG9ydCc7XG4gICAgaWYgKCFpc05vdElFKCkpIHJldHVybiAnaW5zdWZmaWNpZW50IEVDTUFTY3JpcHQgNiBzdXBwb3J0Jztcbn1cblxuZnVuY3Rpb24gaXNCcm93c2VyKCkge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5U3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAoXG4gICAgICAgIEFycmF5LnByb3RvdHlwZSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZXZlcnkgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZpbHRlciAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLm1hcCAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUuc29tZSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodCAmJlxuICAgICAgICBBcnJheS5pc0FycmF5XG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvblN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdFN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBPYmplY3Qua2V5cyAmJlxuICAgICAgICBPYmplY3QuY3JlYXRlICYmXG4gICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZiAmJlxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyAmJlxuICAgICAgICBPYmplY3QuaXNTZWFsZWQgJiZcbiAgICAgICAgT2JqZWN0LmlzRnJvemVuICYmXG4gICAgICAgIE9iamVjdC5pc0V4dGVuc2libGUgJiZcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJlxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiZcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgJiZcbiAgICAgICAgT2JqZWN0LnNlYWwgJiZcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJlxuICAgICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnNcbiAgICApO1xufVxuXG5mdW5jdGlvbiBpc0pTT05TdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdKU09OJyBpbiB3aW5kb3cgJiYgJ3BhcnNlJyBpbiBKU09OICYmICdzdHJpbmdpZnknIGluIEpTT047XG59XG5cbmZ1bmN0aW9uIGlzV29ya2VyU3VwcG9ydGVkKCkge1xuICAgIGlmICghKCdXb3JrZXInIGluIHdpbmRvdyAmJiAnQmxvYicgaW4gd2luZG93ICYmICdVUkwnIGluIHdpbmRvdykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoWycnXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KTtcbiAgICB2YXIgd29ya2VyVVJMID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB2YXIgc3VwcG9ydGVkO1xuICAgIHZhciB3b3JrZXI7XG5cbiAgICB0cnkge1xuICAgICAgICB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVSTCk7XG4gICAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAod29ya2VyKSB7XG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICB9XG4gICAgVVJMLnJldm9rZU9iamVjdFVSTCh3b3JrZXJVUkwpO1xuXG4gICAgcmV0dXJuIHN1cHBvcnRlZDtcbn1cblxuLy8gSUUxMSBvbmx5IHN1cHBvcnRzIGBVaW50OENsYW1wZWRBcnJheWAgYXMgb2YgdmVyc2lvblxuLy8gW0tCMjkyOTQzN10oaHR0cHM6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZW4tdXMva2IvMjkyOTQzNylcbmZ1bmN0aW9uIGlzVWludDhDbGFtcGVkQXJyYXlTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdVaW50OENsYW1wZWRBcnJheScgaW4gd2luZG93O1xufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1zdXBwb3J0ZWQvaXNzdWVzLzE5XG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXc7XG59XG5cbi8vIFNvbWUgYnJvd3NlcnMgb3IgYnJvd3NlciBleHRlbnNpb25zIGJsb2NrIGFjY2VzcyB0byBjYW52YXMgZGF0YSB0byBwcmV2ZW50IGZpbmdlcnByaW50aW5nLlxuLy8gTWFwYm94IEdMIHVzZXMgdGhpcyBBUEkgdG8gbG9hZCBzcHJpdGVzIGFuZCBpbWFnZXMgaW4gZ2VuZXJhbC5cbmZ1bmN0aW9uIGlzQ2FudmFzR2V0SW1hZ2VEYXRhU3VwcG9ydGVkKCkge1xuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBjYW52YXMuaGVpZ2h0ID0gMTtcbiAgICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBpbWFnZURhdGEgPSBjb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKTtcbiAgICByZXR1cm4gaW1hZ2VEYXRhICYmIGltYWdlRGF0YS53aWR0aCA9PT0gY2FudmFzLndpZHRoO1xufVxuXG52YXIgaXNXZWJHTFN1cHBvcnRlZENhY2hlID0ge307XG5mdW5jdGlvbiBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVkKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpIHtcblxuICAgIGlmIChpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF0gPSBpc1dlYkdMU3VwcG9ydGVkKGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpO1xuICAgIH1cblxuICAgIHJldHVybiBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVbZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdF07XG59XG5cbmlzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gICAgYW50aWFsaWFzOiBmYWxzZSxcbiAgICBhbHBoYTogdHJ1ZSxcbiAgICBzdGVuY2lsOiB0cnVlLFxuICAgIGRlcHRoOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBnZXRXZWJHTENvbnRleHQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCkge1xuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcblxuICAgIHZhciBhdHRyaWJ1dGVzID0gT2JqZWN0LmNyZWF0ZShpc1N1cHBvcnRlZC53ZWJHTENvbnRleHRBdHRyaWJ1dGVzKTtcbiAgICBhdHRyaWJ1dGVzLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgPSBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0O1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNXZWJHTFN1cHBvcnRlZChmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KSB7XG4gICAgdmFyIGdsID0gZ2V0V2ViR0xDb250ZXh0KGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQpO1xuICAgIGlmICghZ2wpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRyeSBjb21waWxpbmcgYSBzaGFkZXIgYW5kIGdldCBpdHMgY29tcGlsZSBzdGF0dXMuIFNvbWUgYnJvd3NlcnMgbGlrZSBCcmF2ZSBibG9jayB0aGlzIEFQSVxuICAgIC8vIHRvIHByZXZlbnQgZmluZ2VycHJpbnRpbmcuIFVuZm9ydHVuYXRlbHksIHRoaXMgYWxzbyBtZWFucyB0aGF0IE1hcGJveCBHTCB3b24ndCB3b3JrLlxuICAgIHZhciBzaGFkZXI7XG4gICAgdHJ5IHtcbiAgICAgICAgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gc29tZSBvbGRlciBicm93c2VycyB0aHJvdyBhbiBleGNlcHRpb24gdGhhdCBgY3JlYXRlU2hhZGVyYCBpcyBub3QgZGVmaW5lZFxuICAgICAgICAvLyBzbyBoYW5kbGUgdGhpcyBzZXBhcmF0ZWx5IGZyb20gdGhlIGNhc2Ugd2hlcmUgYnJvd3NlcnMgYmxvY2sgYGNyZWF0ZVNoYWRlcmBcbiAgICAgICAgLy8gZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghc2hhZGVyIHx8IGdsLmlzQ29udGV4dExvc3QoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdsLnNoYWRlclNvdXJjZShzaGFkZXIsICd2b2lkIG1haW4oKSB7fScpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcbiAgICByZXR1cm4gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc05vdElFKCkge1xuICAgIHJldHVybiAhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xufVxuIiwiLy8gQGZsb3cgc3RyaWN0XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdy5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbi8vIHJlZmluZSB0aGUgcmV0dXJuIHR5cGUgYmFzZWQgb24gdGFnTmFtZSwgZS5nLiAnYnV0dG9uJyAtPiBIVE1MQnV0dG9uRWxlbWVudFxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZTxUOiBzdHJpbmc+KHRhZ05hbWU6IFQsIGNsYXNzTmFtZTogP3N0cmluZywgY29udGFpbmVyPzogSFRNTEVsZW1lbnQpOiAkQ2FsbDx0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCwgVD4ge1xuICAgIGNvbnN0IGVsID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgaWYgKGNsYXNzTmFtZSAhPT0gdW5kZWZpbmVkKSBlbC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgaWYgKGNvbnRhaW5lcikgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsKTtcbiAgICByZXR1cm4gZWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTVkcodGFnTmFtZTogc3RyaW5nLCBhdHRyaWJ1dGVzOiB7W3N0cmluZ106IHN0cmluZyB8IG51bWJlcn0sIGNvbnRhaW5lcj86IEVsZW1lbnQpOiBFbGVtZW50IHtcbiAgICBjb25zdCBlbCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgdGFnTmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKG51bGwsIG5hbWUsIGF0dHJpYnV0ZXNbbmFtZV0pO1xuICAgIH1cbiAgICBpZiAoY29udGFpbmVyKSBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIHJldHVybiBlbDtcbn1cblxuY29uc3QgZG9jU3R5bGUgPSB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTtcbmNvbnN0IHNlbGVjdFByb3AgPSBkb2NTdHlsZSAmJiBkb2NTdHlsZS51c2VyU2VsZWN0ICE9PSB1bmRlZmluZWQgPyAndXNlclNlbGVjdCcgOiAnV2Via2l0VXNlclNlbGVjdCc7XG5sZXQgdXNlclNlbGVjdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc2FibGVEcmFnKCkge1xuICAgIGlmIChkb2NTdHlsZSAmJiBzZWxlY3RQcm9wKSB7XG4gICAgICAgIHVzZXJTZWxlY3QgPSBkb2NTdHlsZVtzZWxlY3RQcm9wXTtcbiAgICAgICAgZG9jU3R5bGVbc2VsZWN0UHJvcF0gPSAnbm9uZSc7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlRHJhZygpIHtcbiAgICBpZiAoZG9jU3R5bGUgJiYgc2VsZWN0UHJvcCkge1xuICAgICAgICBkb2NTdHlsZVtzZWxlY3RQcm9wXSA9IHVzZXJTZWxlY3Q7XG4gICAgfVxufVxuXG4vLyBTdXBwcmVzcyB0aGUgbmV4dCBjbGljaywgYnV0IG9ubHkgaWYgaXQncyBpbW1lZGlhdGUuXG5mdW5jdGlvbiBzdXBwcmVzc0NsaWNrTGlzdGVuZXIoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHN1cHByZXNzQ2xpY2tMaXN0ZW5lciwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdXBwcmVzc0NsaWNrKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHN1cHByZXNzQ2xpY2tMaXN0ZW5lciwgdHJ1ZSk7XG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdXBwcmVzc0NsaWNrTGlzdGVuZXIsIHRydWUpO1xuICAgIH0sIDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW91c2VQb3MoZWw6IEhUTUxFbGVtZW50LCBlOiBNb3VzZUV2ZW50IHwgV2hlZWxFdmVudCk6IFBvaW50IHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIGdldFNjYWxlZFBvaW50KGVsLCByZWN0LCBlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoUG9zKGVsOiBIVE1MRWxlbWVudCwgdG91Y2hlczogVG91Y2hMaXN0KTogQXJyYXk8UG9pbnQ+IHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIHBvaW50cyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKGdldFNjYWxlZFBvaW50KGVsLCByZWN0LCB0b3VjaGVzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb3VzZUJ1dHRvbihlOiBNb3VzZUV2ZW50KTogbnVtYmVyIHtcbiAgICBhc3NlcnQoZS50eXBlID09PSAnbW91c2Vkb3duJyB8fCBlLnR5cGUgPT09ICdtb3VzZXVwJyk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuSW5zdGFsbFRyaWdnZXIgIT09ICd1bmRlZmluZWQnICYmIGUuYnV0dG9uID09PSAyICYmIGUuY3RybEtleSAmJlxuICAgICAgICB3aW5kb3cubmF2aWdhdG9yLnBsYXRmb3JtLnRvVXBwZXJDYXNlKCkuaW5kZXhPZignTUFDJykgPj0gMCkge1xuICAgICAgICAvLyBGaXggZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8zMTMxOlxuICAgICAgICAvLyBGaXJlZm94IChkZXRlY3RlZCBieSBJbnN0YWxsVHJpZ2dlcikgb24gTWFjIGRldGVybWluZXMgZS5idXR0b24gPSAyIHdoZW5cbiAgICAgICAgLy8gdXNpbmcgQ29udHJvbCArIGxlZnQgY2xpY2tcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBlLmJ1dHRvbjtcbn1cblxuZnVuY3Rpb24gZ2V0U2NhbGVkUG9pbnQoZWw6IEhUTUxFbGVtZW50LCByZWN0OiBDbGllbnRSZWN0LCBlOiBNb3VzZUV2ZW50IHwgV2hlZWxFdmVudCB8IFRvdWNoKSB7XG4gICAgLy8gVW50aWwgd2UgZ2V0IHN1cHBvcnQgZm9yIHBvaW50ZXIgZXZlbnRzIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUG9pbnRlckV2ZW50KVxuICAgIC8vIHdlIHVzZSB0aGlzIGRpcnR5IHRyaWNrIHdoaWNoIHdvdWxkIG5vdCB3b3JrIGZvciB0aGUgY2FzZSBvZiByb3RhdGVkIHRyYW5zZm9ybXMsIGJ1dCB3b3JrcyB3ZWxsIGZvclxuICAgIC8vIHRoZSBjYXNlIG9mIHNpbXBsZSBzY2FsaW5nLlxuICAgIC8vIE5vdGU6IGBlbC5vZmZzZXRXaWR0aCA9PT0gcmVjdC53aWR0aGAgZWxpbWluYXRlcyB0aGUgYDAvMGAgY2FzZS5cbiAgICBjb25zdCBzY2FsaW5nID0gZWwub2Zmc2V0V2lkdGggPT09IHJlY3Qud2lkdGggPyAxIDogZWwub2Zmc2V0V2lkdGggLyByZWN0LndpZHRoO1xuICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgIChlLmNsaWVudFggLSByZWN0LmxlZnQpICogc2NhbGluZyxcbiAgICAgICAgKGUuY2xpZW50WSAtIHJlY3QudG9wKSAqIHNjYWxpbmdcbiAgICApO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtnZXRKU09OLCBnZXRJbWFnZSwgUmVzb3VyY2VUeXBlfSBmcm9tICcuLi91dGlsL2FqYXguanMnO1xuXG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuaW1wb3J0IHtSR0JBSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZX0gZnJvbSAnLi9zdHlsZV9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7UmVxdWVzdE1hbmFnZXJ9IGZyb20gJy4uL3V0aWwvbWFwYm94LmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihiYXNlVVJMOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IENhbGxiYWNrPHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0+KTogQ2FuY2VsYWJsZSB7XG4gICAgbGV0IGpzb246IGFueSwgaW1hZ2UsIGVycm9yO1xuICAgIGNvbnN0IGZvcm1hdCA9IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyA+IDEgPyAnQDJ4JyA6ICcnO1xuXG4gICAgbGV0IGpzb25SZXF1ZXN0ID0gZ2V0SlNPTihyZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHJlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVNwcml0ZVVSTChiYXNlVVJMLCBmb3JtYXQsICcuanNvbicpLCBSZXNvdXJjZVR5cGUuU3ByaXRlSlNPTiksIChlcnI6ID9FcnJvciwgZGF0YTogP09iamVjdCkgPT4ge1xuICAgICAgICBqc29uUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICAgICAganNvbiA9IGRhdGE7XG4gICAgICAgICAgICBtYXliZUNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCBpbWFnZVJlcXVlc3QgPSBnZXRJbWFnZShyZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHJlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVNwcml0ZVVSTChiYXNlVVJMLCBmb3JtYXQsICcucG5nJyksIFJlc291cmNlVHlwZS5TcHJpdGVJbWFnZSksIChlcnIsIGltZykgPT4ge1xuICAgICAgICBpbWFnZVJlcXVlc3QgPSBudWxsO1xuICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgIGltYWdlID0gaW1nO1xuICAgICAgICAgICAgbWF5YmVDb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtYXliZUNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmIChqc29uICYmIGltYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBpbWFnZURhdGEgPSBicm93c2VyLmdldEltYWdlRGF0YShpbWFnZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBqc29uKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIHgsIHksIHNkZiwgcGl4ZWxSYXRpbywgc3RyZXRjaFgsIHN0cmV0Y2hZLCBjb250ZW50fSA9IGpzb25baWRdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgUkdCQUltYWdlKHt3aWR0aCwgaGVpZ2h0fSk7XG4gICAgICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoaW1hZ2VEYXRhLCBkYXRhLCB7eCwgeX0sIHt4OiAwLCB5OiAwfSwge3dpZHRoLCBoZWlnaHR9KTtcbiAgICAgICAgICAgICAgICByZXN1bHRbaWRdID0ge2RhdGEsIHBpeGVsUmF0aW8sIHNkZiwgc3RyZXRjaFgsIHN0cmV0Y2hZLCBjb250ZW50fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGNhbmNlbCgpIHtcbiAgICAgICAgICAgIGlmIChqc29uUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIGpzb25SZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIGpzb25SZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbWFnZVJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBpbWFnZVJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgaW1hZ2VSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1JHQkFJbWFnZX0gZnJvbSAnLi4vdXRpbC9pbWFnZS5qcyc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAuanMnO1xuXG5leHBvcnQgdHlwZSBTdHlsZUltYWdlRGF0YSA9IHtcbiAgICBkYXRhOiBSR0JBSW1hZ2UsXG4gICAgdmVyc2lvbjogbnVtYmVyLFxuICAgIGhhc1JlbmRlckNhbGxiYWNrPzogYm9vbGVhbixcbiAgICB1c2VySW1hZ2U/OiBTdHlsZUltYWdlSW50ZXJmYWNlXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZUltYWdlTWV0YWRhdGEgPSB7XG4gICAgcGl4ZWxSYXRpbzogbnVtYmVyLFxuICAgIHNkZjogYm9vbGVhbixcbiAgICBzdHJldGNoWD86IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIHN0cmV0Y2hZPzogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgY29udGVudD86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZUltYWdlID0gU3R5bGVJbWFnZURhdGEgJiBTdHlsZUltYWdlTWV0YWRhdGE7XG5cbmV4cG9ydCB0eXBlIFN0eWxlSW1hZ2VJbnRlcmZhY2UgPSB7XG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgICBkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXksXG4gICAgcmVuZGVyPzogKCkgPT4gYm9vbGVhbixcbiAgICBvbkFkZD86IChtYXA6IE1hcCwgaWQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBvblJlbW92ZT86ICgpID0+IHZvaWRcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTdHlsZUltYWdlKGltYWdlOiBTdHlsZUltYWdlKTogYm9vbGVhbiB7XG4gICAgY29uc3Qge3VzZXJJbWFnZX0gPSBpbWFnZTtcbiAgICBpZiAodXNlckltYWdlICYmIHVzZXJJbWFnZS5yZW5kZXIpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IHVzZXJJbWFnZS5yZW5kZXIoKTtcbiAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgIGltYWdlLmRhdGEucmVwbGFjZShuZXcgVWludDhBcnJheSh1c2VySW1hZ2UuZGF0YS5idWZmZXIpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBzdHlsZSBpbWFnZXMuIFRoaXMgaXMgYSBzcGVjaWZpY2F0aW9uIGZvclxuICogaW1wbGVtZW50ZXJzIHRvIG1vZGVsOiBpdCBpcyBub3QgYW4gZXhwb3J0ZWQgbWV0aG9kIG9yIGNsYXNzLlxuICpcbiAqIEltYWdlcyBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHJlZHJhd24gZm9yIGV2ZXJ5IGZyYW1lLiBUaGV5IGNhbiBiZSB1c2VkIHRvIGFuaW1hdGVcbiAqIGljb25zIGFuZCBwYXR0ZXJucyBvciBtYWtlIHRoZW0gcmVzcG9uZCB0byB1c2VyIGlucHV0LiBTdHlsZSBpbWFnZXMgY2FuIGltcGxlbWVudCBhXG4gKiB7QGxpbmsgU3R5bGVJbWFnZUludGVyZmFjZSNyZW5kZXJ9IG1ldGhvZC4gVGhlIG1ldGhvZCBpcyBjYWxsZWQgZXZlcnkgZnJhbWUgYW5kXG4gKiBjYW4gYmUgdXNlZCB0byB1cGRhdGUgdGhlIGltYWdlLlxuICpcbiAqIEBpbnRlcmZhY2UgU3R5bGVJbWFnZUludGVyZmFjZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHdpZHRoIFdpZHRoIGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgSGVpZ2h0IGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7VWludDhBcnJheSB8IFVpbnQ4Q2xhbXBlZEFycmF5fSBkYXRhIEJ5dGUgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBpbWFnZS4gVG8gZW5zdXJlIHNwYWNlIGZvciBhbGwgZm91ciBjaGFubmVscyBpbiBhbiBSR0JBIGNvbG9yLCBzaXplIG11c3QgYmUgd2lkdGggw5cgaGVpZ2h0IMOXIDQuXG4gKlxuICogQHNlZSBbRXhhbXBsZTogQWRkIGFuIGFuaW1hdGVkIGljb24gdG8gdGhlIG1hcC5dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS1hbmltYXRlZC8pXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGZsYXNoaW5nU3F1YXJlID0ge1xuICogICAgIHdpZHRoOiA2NCxcbiAqICAgICBoZWlnaHQ6IDY0LFxuICogICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KDY0ICogNjQgKiA0KSxcbiAqXG4gKiAgICAgb25BZGQobWFwKSB7XG4gKiAgICAgICAgIHRoaXMubWFwID0gbWFwO1xuICogICAgIH0sXG4gKlxuICogICAgIHJlbmRlcigpIHtcbiAqICAgICAgICAgLy8ga2VlcCByZXBhaW50aW5nIHdoaWxlIHRoZSBpY29uIGlzIG9uIHRoZSBtYXBcbiAqICAgICAgICAgdGhpcy5tYXAudHJpZ2dlclJlcGFpbnQoKTtcbiAqXG4gKiAgICAgICAgIC8vIGFsdGVybmF0ZSBiZXR3ZWVuIGJsYWNrIGFuZCB3aGl0ZSBiYXNlZCBvbiB0aGUgdGltZVxuICogICAgICAgICBjb25zdCB2YWx1ZSA9IE1hdGgucm91bmQoRGF0ZS5ub3coKSAvIDEwMDApICUgMiA9PT0gMCAgPyAyNTUgOiAwO1xuICpcbiAqICAgICAgICAgLy8gY2hlY2sgaWYgaW1hZ2UgbmVlZHMgdG8gYmUgY2hhbmdlZFxuICogICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMucHJldmlvdXNWYWx1ZSkge1xuICogICAgICAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gdmFsdWU7XG4gKlxuICogICAgICAgICAgICAgY29uc3QgYnl0ZXNQZXJQaXhlbCA9IDQ7XG4gKiAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMud2lkdGg7IHgrKykge1xuICogICAgICAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQ7IHkrKykge1xuICogICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAoeSAqIHRoaXMud2lkdGggKyB4KSAqIGJ5dGVzUGVyUGl4ZWw7XG4gKiAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtvZmZzZXQgKyAwXSA9IHZhbHVlO1xuICogICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFbb2Zmc2V0ICsgMV0gPSB2YWx1ZTtcbiAqICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW29mZnNldCArIDJdID0gdmFsdWU7XG4gKiAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtvZmZzZXQgKyAzXSA9IDI1NTtcbiAqICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICB9XG4gKlxuICogICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW1hZ2UgY2hhbmdlZFxuICogICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gKiAgICAgICAgIH1cbiAqICAgICB9XG4gKiB9O1xuICpcbiAqIG1hcC5hZGRJbWFnZSgnZmxhc2hpbmdfc3F1YXJlJywgZmxhc2hpbmdTcXVhcmUpO1xuICovXG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgYmVmb3JlIGV2ZXJ5IGZyYW1lIHdoZXJlIHRoZSBpY29uIHdpbGwgYmUgdXNlZC5cbiAqIFRoZSBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdXBkYXRlIHRoZSBpbWFnZSdzIGBkYXRhYCBtZW1iZXIgd2l0aCBhIG5ldyBpbWFnZS5cbiAqXG4gKiBJZiB0aGUgbWV0aG9kIHVwZGF0ZXMgdGhlIGltYWdlIGl0IG11c3QgcmV0dXJuIGB0cnVlYCB0byBjb21taXQgdGhlIGNoYW5nZS5cbiAqIElmIHRoZSBtZXRob2QgcmV0dXJucyBgZmFsc2VgIG9yIG5vdGhpbmcgdGhlIGltYWdlIGlzIGFzc3VtZWQgdG8gbm90IGhhdmUgY2hhbmdlZC5cbiAqXG4gKiBJZiB1cGRhdGVzIGFyZSBpbmZyZXF1ZW50IGl0IG1heWJlIGVhc2llciB0byB1c2Uge0BsaW5rIE1hcCN1cGRhdGVJbWFnZX0gdG8gdXBkYXRlXG4gKiB0aGUgaW1hZ2UgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcgdGhpcyBtZXRob2QuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgU3R5bGVJbWFnZUludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSByZW5kZXJcbiAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGlzIG1ldGhvZCB1cGRhdGVkIHRoZSBpbWFnZS4gYGZhbHNlYCBpZiB0aGUgaW1hZ2Ugd2FzIG5vdCBjaGFuZ2VkLlxuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBsYXllciBoYXMgYmVlbiBhZGRlZCB0byB0aGUgTWFwIHdpdGgge0BsaW5rIE1hcCNhZGRJbWFnZX0uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgU3R5bGVJbWFnZUludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvbkFkZFxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY3VzdG9tIGxheWVyIHdhcyBqdXN0IGFkZGVkIHRvLlxuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBpY29uIGlzIHJlbW92ZWQgZnJvbSB0aGUgbWFwIHdpdGgge0BsaW5rIE1hcCNyZW1vdmVJbWFnZX0uXG4gKiBUaGlzIGdpdmVzIHRoZSBpbWFnZSBhIGNoYW5jZSB0byBjbGVhbiB1cCByZXNvdXJjZXMgYW5kIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBTdHlsZUltYWdlSW50ZXJmYWNlXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIG9uUmVtb3ZlXG4gKi9cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBwb3RwYWNrIGZyb20gJ3BvdHBhY2snO1xuXG5pbXBvcnQge0V2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHtSR0JBSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuaW1wb3J0IHtJbWFnZVBvc2l0aW9ufSBmcm9tICcuL2ltYWdlX2F0bGFzLmpzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZS5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge3JlbmRlclN0eWxlSW1hZ2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2ltYWdlLmpzJztcbmltcG9ydCB7d2Fybk9uY2V9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZUltYWdlfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge0Jpbn0gZnJvbSAncG90cGFjayc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcbmltcG9ydCB0eXBlIHtTaXplfSBmcm9tICcuLi91dGlsL2ltYWdlLmpzJztcblxudHlwZSBQYXR0ZXJuID0ge1xuICAgIGJpbjogQmluLFxuICAgIHBvc2l0aW9uOiBJbWFnZVBvc2l0aW9uXG59O1xuXG4vLyBXaGVuIGNvcGllZCBpbnRvIHRoZSBhdGxhcyB0ZXh0dXJlLCBpbWFnZSBkYXRhIGlzIHBhZGRlZCBieSBvbmUgcGl4ZWwgb24gZWFjaCBzaWRlLiBJY29uXG4vLyBpbWFnZXMgYXJlIHBhZGRlZCB3aXRoIGZ1bGx5IHRyYW5zcGFyZW50IHBpeGVscywgd2hpbGUgcGF0dGVybiBpbWFnZXMgYXJlIHBhZGRlZCB3aXRoIGFcbi8vIGNvcHkgb2YgdGhlIGltYWdlIGRhdGEgd3JhcHBlZCBmcm9tIHRoZSBvcHBvc2l0ZSBzaWRlLiBJbiBib3RoIGNhc2VzLCB0aGlzIGVuc3VyZXMgdGhlXG4vLyBjb3JyZWN0IGJlaGF2aW9yIG9mIEdMX0xJTkVBUiB0ZXh0dXJlIHNhbXBsaW5nIG1vZGUuXG5jb25zdCBwYWRkaW5nID0gMTtcblxuLypcbiAgICBJbWFnZU1hbmFnZXIgZG9lcyB0aHJlZSB0aGluZ3M6XG5cbiAgICAgICAgMS4gVHJhY2tzIHJlcXVlc3RzIGZvciBpY29uIGltYWdlcyBmcm9tIHRpbGUgd29ya2VycyBhbmQgc2VuZHMgcmVzcG9uc2VzIHdoZW4gdGhlIHJlcXVlc3RzIGFyZSBmdWxmaWxsZWQuXG4gICAgICAgIDIuIEJ1aWxkcyBhIHRleHR1cmUgYXRsYXMgZm9yIHBhdHRlcm4gaW1hZ2VzLlxuICAgICAgICAzLiBSZXJlbmRlcnMgcmVuZGVyYWJsZSBpbWFnZXMgb25jZSBwZXIgZnJhbWVcblxuICAgIFRoZXNlIGFyZSBkaXNwYXJhdGUgcmVzcG9uc2liaWxpdGllcyBhbmQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgaGFuZGxlZCBieSBkaWZmZXJlbnQgY2xhc3Nlcy4gV2hlbiB3ZSBpbXBsZW1lbnRcbiAgICBkYXRhLWRyaXZlbiBzdXBwb3J0IGZvciBgKi1wYXR0ZXJuYCwgd2UnbGwgbGlrZWx5IHVzZSBwZXItYnVja2V0IHBhdHRlcm4gYXRsYXNlcywgYW5kIHRoYXQgd291bGQgYmUgYSBnb29kIHRpbWVcbiAgICB0byByZWZhY3RvciB0aGlzLlxuKi9cbmNsYXNzIEltYWdlTWFuYWdlciBleHRlbmRzIEV2ZW50ZWQge1xuICAgIGltYWdlczoge1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfTtcbiAgICB1cGRhdGVkSW1hZ2VzOiB7W186IHN0cmluZ106IGJvb2xlYW59O1xuICAgIGNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZToge1tfOiBzdHJpbmddOiBib29sZWFufTtcbiAgICBsb2FkZWQ6IGJvb2xlYW47XG4gICAgcmVxdWVzdG9yczogQXJyYXk8e2lkczogQXJyYXk8c3RyaW5nPiwgY2FsbGJhY2s6IENhbGxiYWNrPHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0+fT47XG5cbiAgICBwYXR0ZXJuczoge1tfOiBzdHJpbmddOiBQYXR0ZXJufTtcbiAgICBhdGxhc0ltYWdlOiBSR0JBSW1hZ2U7XG4gICAgYXRsYXNUZXh0dXJlOiA/VGV4dHVyZTtcbiAgICBkaXJ0eTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmltYWdlcyA9IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZWRJbWFnZXMgPSB7fTtcbiAgICAgICAgdGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWUgPSB7fTtcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0b3JzID0gW107XG5cbiAgICAgICAgdGhpcy5wYXR0ZXJucyA9IHt9O1xuICAgICAgICB0aGlzLmF0bGFzSW1hZ2UgPSBuZXcgUkdCQUltYWdlKHt3aWR0aDogMSwgaGVpZ2h0OiAxfSk7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIGlzTG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZWQ7XG4gICAgfVxuXG4gICAgc2V0TG9hZGVkKGxvYWRlZDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5sb2FkZWQgPT09IGxvYWRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkZWQgPSBsb2FkZWQ7XG5cbiAgICAgICAgaWYgKGxvYWRlZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB7aWRzLCBjYWxsYmFja30gb2YgdGhpcy5yZXF1ZXN0b3JzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5KGlkcywgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0b3JzID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNJbWFnZShpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZ2V0SW1hZ2UoaWQpO1xuICAgIH1cblxuICAgIGdldEltYWdlKGlkOiBzdHJpbmcpOiA/U3R5bGVJbWFnZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlc1tpZF07XG4gICAgfVxuXG4gICAgYWRkSW1hZ2UoaWQ6IHN0cmluZywgaW1hZ2U6IFN0eWxlSW1hZ2UpIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmltYWdlc1tpZF0pO1xuICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUoaWQsIGltYWdlKSkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZXNbaWRdID0gaW1hZ2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdmFsaWRhdGUoaWQ6IHN0cmluZywgaW1hZ2U6IFN0eWxlSW1hZ2UpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLl92YWxpZGF0ZVN0cmV0Y2goaW1hZ2Uuc3RyZXRjaFgsIGltYWdlLmRhdGEgJiYgaW1hZ2UuZGF0YS53aWR0aCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYEltYWdlIFwiJHtpZH1cIiBoYXMgaW52YWxpZCBcInN0cmV0Y2hYXCIgdmFsdWVgKSkpO1xuICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX3ZhbGlkYXRlU3RyZXRjaChpbWFnZS5zdHJldGNoWSwgaW1hZ2UuZGF0YSAmJiBpbWFnZS5kYXRhLmhlaWdodCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYEltYWdlIFwiJHtpZH1cIiBoYXMgaW52YWxpZCBcInN0cmV0Y2hZXCIgdmFsdWVgKSkpO1xuICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX3ZhbGlkYXRlQ29udGVudChpbWFnZS5jb250ZW50LCBpbWFnZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYEltYWdlIFwiJHtpZH1cIiBoYXMgaW52YWxpZCBcImNvbnRlbnRcIiB2YWx1ZWApKSk7XG4gICAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVTdHJldGNoKHN0cmV0Y2g6ID9BcnJheTxbbnVtYmVyLCBudW1iZXJdPiB8IHZvaWQsIHNpemU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXN0cmV0Y2gpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgbGFzdCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBzdHJldGNoKSB7XG4gICAgICAgICAgICBpZiAocGFydFswXSA8IGxhc3QgfHwgcGFydFsxXSA8IHBhcnRbMF0gfHwgc2l6ZSA8IHBhcnRbMV0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxhc3QgPSBwYXJ0WzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZUNvbnRlbnQoY29udGVudDogP1tudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgdm9pZCwgaW1hZ2U6IFN0eWxlSW1hZ2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFjb250ZW50KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoICE9PSA0KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChjb250ZW50WzBdIDwgMCB8fCBpbWFnZS5kYXRhLndpZHRoIDwgY29udGVudFswXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoY29udGVudFsxXSA8IDAgfHwgaW1hZ2UuZGF0YS5oZWlnaHQgPCBjb250ZW50WzFdKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChjb250ZW50WzJdIDwgMCB8fCBpbWFnZS5kYXRhLndpZHRoIDwgY29udGVudFsyXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoY29udGVudFszXSA8IDAgfHwgaW1hZ2UuZGF0YS5oZWlnaHQgPCBjb250ZW50WzNdKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChjb250ZW50WzJdIDwgY29udGVudFswXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoY29udGVudFszXSA8IGNvbnRlbnRbMV0pIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdXBkYXRlSW1hZ2UoaWQ6IHN0cmluZywgaW1hZ2U6IFN0eWxlSW1hZ2UpIHtcbiAgICAgICAgY29uc3Qgb2xkSW1hZ2UgPSB0aGlzLmltYWdlc1tpZF07XG4gICAgICAgIGFzc2VydChvbGRJbWFnZSk7XG4gICAgICAgIGFzc2VydChvbGRJbWFnZS5kYXRhLndpZHRoID09PSBpbWFnZS5kYXRhLndpZHRoKTtcbiAgICAgICAgYXNzZXJ0KG9sZEltYWdlLmRhdGEuaGVpZ2h0ID09PSBpbWFnZS5kYXRhLmhlaWdodCk7XG4gICAgICAgIGltYWdlLnZlcnNpb24gPSBvbGRJbWFnZS52ZXJzaW9uICsgMTtcbiAgICAgICAgdGhpcy5pbWFnZXNbaWRdID0gaW1hZ2U7XG4gICAgICAgIHRoaXMudXBkYXRlZEltYWdlc1tpZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJlbW92ZUltYWdlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuaW1hZ2VzW2lkXSk7XG4gICAgICAgIGNvbnN0IGltYWdlID0gdGhpcy5pbWFnZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5pbWFnZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5wYXR0ZXJuc1tpZF07XG5cbiAgICAgICAgaWYgKGltYWdlLnVzZXJJbWFnZSAmJiBpbWFnZS51c2VySW1hZ2Uub25SZW1vdmUpIHtcbiAgICAgICAgICAgIGltYWdlLnVzZXJJbWFnZS5vblJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGlzdEltYWdlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaW1hZ2VzKTtcbiAgICB9XG5cbiAgICBnZXRJbWFnZXMoaWRzOiBBcnJheTxzdHJpbmc+LCBjYWxsYmFjazogQ2FsbGJhY2s8e1tfOiBzdHJpbmddOiBTdHlsZUltYWdlfT4pIHtcbiAgICAgICAgLy8gSWYgdGhlIHNwcml0ZSBoYXMgYmVlbiBsb2FkZWQsIG9yIGlmIGFsbCB0aGUgaWNvbiBkZXBlbmRlbmNpZXMgYXJlIGFscmVhZHkgcHJlc2VudFxuICAgICAgICAvLyAoaS5lLiBpZiB0aGV5J3ZlIGJlZW4gYWRkZWQgdmlhIHJ1bnRpbWUgc3R5bGluZyksIHRoZW4gbm90aWZ5IHRoZSByZXF1ZXN0b3IgaW1tZWRpYXRlbHkuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgZGVsYXkgbm90aWZpY2F0aW9uIHVudGlsIHRoZSBzcHJpdGUgaXMgbG9hZGVkLiBBdCB0aGF0IHBvaW50LCBpZiBhbnkgb2YgdGhlXG4gICAgICAgIC8vIGRlcGVuZGVuY2llcyBhcmUgc3RpbGwgdW5hdmFpbGFibGUsIHdlJ2xsIGp1c3QgYXNzdW1lIHRoZXkgYXJlIHBlcm1hbmVudGx5IG1pc3NpbmcuXG4gICAgICAgIGxldCBoYXNBbGxEZXBlbmRlbmNpZXMgPSB0cnVlO1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2FkZWQoKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW1hZ2VzW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNBbGxEZXBlbmRlbmNpZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkZWQoKSB8fCBoYXNBbGxEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdGlmeShpZHMsIGNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdG9ycy5wdXNoKHtpZHMsIGNhbGxiYWNrfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfbm90aWZ5KGlkczogQXJyYXk8c3RyaW5nPiwgY2FsbGJhY2s6IENhbGxiYWNrPHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0+KSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbWFnZXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnc3R5bGVpbWFnZW1pc3NpbmcnLCB7aWR9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuaW1hZ2VzW2lkXTtcbiAgICAgICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgICAgIC8vIENsb25lIHRoZSBpbWFnZSBzbyB0aGF0IG91ciBvd24gY29weSBvZiBpdHMgQXJyYXlCdWZmZXIgZG9lc24ndCBnZXQgdHJhbnNmZXJyZWQuXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VbaWRdID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpbWFnZS5kYXRhLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIHBpeGVsUmF0aW86IGltYWdlLnBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgICAgIHNkZjogaW1hZ2Uuc2RmLFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBpbWFnZS52ZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICBzdHJldGNoWDogaW1hZ2Uuc3RyZXRjaFgsXG4gICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hZOiBpbWFnZS5zdHJldGNoWSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogaW1hZ2UuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgaGFzUmVuZGVyQ2FsbGJhY2s6IEJvb2xlYW4oaW1hZ2UudXNlckltYWdlICYmIGltYWdlLnVzZXJJbWFnZS5yZW5kZXIpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoYEltYWdlIFwiJHtpZH1cIiBjb3VsZCBub3QgYmUgbG9hZGVkLiBQbGVhc2UgbWFrZSBzdXJlIHlvdSBoYXZlIGFkZGVkIHRoZSBpbWFnZSB3aXRoIG1hcC5hZGRJbWFnZSgpIG9yIGEgXCJzcHJpdGVcIiBwcm9wZXJ0eSBpbiB5b3VyIHN0eWxlLiBZb3UgY2FuIHByb3ZpZGUgbWlzc2luZyBpbWFnZXMgYnkgbGlzdGVuaW5nIGZvciB0aGUgXCJzdHlsZWltYWdlbWlzc2luZ1wiIG1hcCBldmVudC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICAvLyBQYXR0ZXJuIHN0dWZmXG5cbiAgICBnZXRQaXhlbFNpemUoKTogU2l6ZSB7XG4gICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHRoaXMuYXRsYXNJbWFnZTtcbiAgICAgICAgcmV0dXJuIHt3aWR0aCwgaGVpZ2h0fTtcbiAgICB9XG5cbiAgICBnZXRQYXR0ZXJuKGlkOiBzdHJpbmcpOiA/SW1hZ2VQb3NpdGlvbiB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLnBhdHRlcm5zW2lkXTtcblxuICAgICAgICBjb25zdCBpbWFnZSA9IHRoaXMuZ2V0SW1hZ2UoaWQpO1xuICAgICAgICBpZiAoIWltYWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuICYmIHBhdHRlcm4ucG9zaXRpb24udmVyc2lvbiA9PT0gaW1hZ2UudmVyc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4ucG9zaXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhdHRlcm4pIHtcbiAgICAgICAgICAgIGNvbnN0IHcgPSBpbWFnZS5kYXRhLndpZHRoICsgcGFkZGluZyAqIDI7XG4gICAgICAgICAgICBjb25zdCBoID0gaW1hZ2UuZGF0YS5oZWlnaHQgKyBwYWRkaW5nICogMjtcbiAgICAgICAgICAgIGNvbnN0IGJpbiA9IHt3LCBoLCB4OiAwLCB5OiAwfTtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gbmV3IEltYWdlUG9zaXRpb24oYmluLCBpbWFnZSk7XG4gICAgICAgICAgICB0aGlzLnBhdHRlcm5zW2lkXSA9IHtiaW4sIHBvc2l0aW9ufTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhdHRlcm4ucG9zaXRpb24udmVyc2lvbiA9IGltYWdlLnZlcnNpb247XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVQYXR0ZXJuQXRsYXMoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5wYXR0ZXJuc1tpZF0ucG9zaXRpb247XG4gICAgfVxuXG4gICAgYmluZChjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgaWYgKCF0aGlzLmF0bGFzVGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy5hdGxhc1RleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB0aGlzLmF0bGFzSW1hZ2UsIGdsLlJHQkEpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuYXRsYXNUZXh0dXJlLnVwZGF0ZSh0aGlzLmF0bGFzSW1hZ2UpO1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdGxhc1RleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgIH1cblxuICAgIF91cGRhdGVQYXR0ZXJuQXRsYXMoKSB7XG4gICAgICAgIGNvbnN0IGJpbnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnBhdHRlcm5zKSB7XG4gICAgICAgICAgICBiaW5zLnB1c2godGhpcy5wYXR0ZXJuc1tpZF0uYmluKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHt3LCBofSA9IHBvdHBhY2soYmlucyk7XG5cbiAgICAgICAgY29uc3QgZHN0ID0gdGhpcy5hdGxhc0ltYWdlO1xuICAgICAgICBkc3QucmVzaXplKHt3aWR0aDogdyB8fCAxLCBoZWlnaHQ6IGggfHwgMX0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5wYXR0ZXJucykge1xuICAgICAgICAgICAgY29uc3Qge2Jpbn0gPSB0aGlzLnBhdHRlcm5zW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IHggPSBiaW4ueCArIHBhZGRpbmc7XG4gICAgICAgICAgICBjb25zdCB5ID0gYmluLnkgKyBwYWRkaW5nO1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gdGhpcy5pbWFnZXNbaWRdLmRhdGE7XG4gICAgICAgICAgICBjb25zdCB3ID0gc3JjLndpZHRoO1xuICAgICAgICAgICAgY29uc3QgaCA9IHNyYy5oZWlnaHQ7XG5cbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYywgZHN0LCB7eDogMCwgeTogMH0sIHt4LCB5fSwge3dpZHRoOiB3LCBoZWlnaHQ6IGh9KTtcblxuICAgICAgICAgICAgLy8gQWRkIDEgcGl4ZWwgd3JhcHBlZCBwYWRkaW5nIG9uIGVhY2ggc2lkZSBvZiB0aGUgaW1hZ2UuXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwge3g6IDAsIHk6IGggLSAxfSwge3gsIHk6IHkgLSAxfSwge3dpZHRoOiB3LCBoZWlnaHQ6IDF9KTsgLy8gVFxuICAgICAgICAgICAgUkdCQUltYWdlLmNvcHkoc3JjLCBkc3QsIHt4OiAwLCB5OiAgICAgMH0sIHt4LCB5OiB5ICsgaH0sIHt3aWR0aDogdywgaGVpZ2h0OiAxfSk7IC8vIEJcbiAgICAgICAgICAgIFJHQkFJbWFnZS5jb3B5KHNyYywgZHN0LCB7eDogdyAtIDEsIHk6IDB9LCB7eDogeCAtIDEsIHl9LCB7d2lkdGg6IDEsIGhlaWdodDogaH0pOyAvLyBMXG4gICAgICAgICAgICBSR0JBSW1hZ2UuY29weShzcmMsIGRzdCwge3g6IDAsICAgICB5OiAwfSwge3g6IHggKyB3LCB5fSwge3dpZHRoOiAxLCBoZWlnaHQ6IGh9KTsgLy8gUlxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgYmVnaW5GcmFtZSgpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWUgPSB7fTtcbiAgICB9XG5cbiAgICBkaXNwYXRjaFJlbmRlckNhbGxiYWNrcyhpZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcblxuICAgICAgICAgICAgLy8gdGhlIGNhbGxiYWNrIGZvciB0aGUgaW1hZ2Ugd2FzIGFscmVhZHkgZGlzcGF0Y2hlZCBmb3IgYSBkaWZmZXJlbnQgZnJhbWVcbiAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrRGlzcGF0Y2hlZFRoaXNGcmFtZVtpZF0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja0Rpc3BhdGNoZWRUaGlzRnJhbWVbaWRdID0gdHJ1ZTtcblxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmltYWdlc1tpZF07XG4gICAgICAgICAgICBhc3NlcnQoaW1hZ2UpO1xuXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkID0gcmVuZGVyU3R5bGVJbWFnZShpbWFnZSk7XG4gICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSW1hZ2UoaWQsIGltYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2VNYW5hZ2VyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHN0eWxlU3BlYyBmcm9tICcuLi9zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QuanMnO1xuXG5pbXBvcnQge2VuZHNXaXRoLCBleHRlbmQsIGRlZ1RvUmFkfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHtcbiAgICB2YWxpZGF0ZVN0eWxlLFxuICAgIHZhbGlkYXRlTGlnaHQsXG4gICAgZW1pdFZhbGlkYXRpb25FcnJvcnNcbn0gZnJvbSAnLi92YWxpZGF0ZV9zdHlsZS5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlfSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IHtQcm9wZXJ0aWVzLCBUcmFuc2l0aW9uYWJsZSwgVHJhbnNpdGlvbmluZywgUG9zc2libHlFdmFsdWF0ZWQsIERhdGFDb25zdGFudFByb3BlcnR5fSBmcm9tICcuL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7U3R5bGVQcm9wZXJ0eVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvc3R5bGUtc3BlYy5qcyc7XG5pbXBvcnQgdHlwZSBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVTZXR0ZXJPcHRpb25zfSBmcm9tICcuLi9zdHlsZS9zdHlsZS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgUHJvcGVydHksXG4gICAgUHJvcGVydHlWYWx1ZSxcbiAgICBUcmFuc2l0aW9uUGFyYW1ldGVyc1xufSBmcm9tICcuL3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7TGlnaHRTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgTGlnaHRQb3NpdGlvbiA9IHtcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHo6IG51bWJlcixcbiAgICBhemltdXRoYWw6IG51bWJlcixcbiAgICBwb2xhcjogbnVtYmVyLFxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBzcGhlcmljYWwgY29vcmRpbmF0ZXMgdG8gY2FydGVzaWFuIExpZ2h0UG9zaXRpb24gY29vcmRpbmF0ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBzcGhlcmljYWwgU3BoZXJpY2FsIGNvb3JkaW5hdGVzLCBpbiBbcmFkaWFsLCBhemltdXRoYWwsIHBvbGFyXVxuICogQHJldHVybiBMaWdodFBvc2l0aW9uIGNhcnRlc2lhbiBjb29yZGluYXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3BoZXJpY2FsVG9DYXJ0ZXNpYW4oW3IsIGF6aW11dGhhbCwgcG9sYXJdOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pOiBMaWdodFBvc2l0aW9uIHtcbiAgICAvLyBXZSBhYnN0cmFjdCBcIm5vcnRoXCIvXCJ1cFwiIChjb21wYXNzLXdpc2UpIHRvIGJlIDDCsCB3aGVuIHJlYWxseSB0aGlzIGlzIDkwwrAgKM+ALzIpOlxuICAgIC8vIGNvcnJlY3QgZm9yIHRoYXQgaGVyZVxuICAgIGNvbnN0IGEgPSBkZWdUb1JhZChhemltdXRoYWwgKyA5MCksIHAgPSBkZWdUb1JhZChwb2xhcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiByICogTWF0aC5jb3MoYSkgKiBNYXRoLnNpbihwKSxcbiAgICAgICAgeTogciAqIE1hdGguc2luKGEpICogTWF0aC5zaW4ocCksXG4gICAgICAgIHo6IHIgKiBNYXRoLmNvcyhwKSxcbiAgICAgICAgYXppbXV0aGFsLCBwb2xhclxuICAgIH07XG59XG5cbmNsYXNzIExpZ2h0UG9zaXRpb25Qcm9wZXJ0eSBpbXBsZW1lbnRzIFByb3BlcnR5PFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgTGlnaHRQb3NpdGlvbj4ge1xuICAgIHNwZWNpZmljYXRpb246IFN0eWxlUHJvcGVydHlTcGVjaWZpY2F0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc3BlY2lmaWNhdGlvbiA9IHN0eWxlU3BlYy5saWdodC5wb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwb3NzaWJseUV2YWx1YXRlKHZhbHVlOiBQcm9wZXJ0eVZhbHVlPFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgTGlnaHRQb3NpdGlvbj4sIHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKTogTGlnaHRQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiBzcGhlcmljYWxUb0NhcnRlc2lhbih2YWx1ZS5leHByZXNzaW9uLmV2YWx1YXRlKHBhcmFtZXRlcnMpKTtcbiAgICB9XG5cbiAgICBpbnRlcnBvbGF0ZShhOiBMaWdodFBvc2l0aW9uLCBiOiBMaWdodFBvc2l0aW9uLCB0OiBudW1iZXIpOiBMaWdodFBvc2l0aW9uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IGludGVycG9sYXRlKGEueCwgYi54LCB0KSxcbiAgICAgICAgICAgIHk6IGludGVycG9sYXRlKGEueSwgYi55LCB0KSxcbiAgICAgICAgICAgIHo6IGludGVycG9sYXRlKGEueiwgYi56LCB0KSxcbiAgICAgICAgICAgIGF6aW11dGhhbDogaW50ZXJwb2xhdGUoYS5hemltdXRoYWwsIGIuYXppbXV0aGFsLCB0KSxcbiAgICAgICAgICAgIHBvbGFyOiBpbnRlcnBvbGF0ZShhLnBvbGFyLCBiLnBvbGFyLCB0KSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbnR5cGUgUHJvcHMgPSB7fFxuICAgIFwiYW5jaG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PFwibWFwXCIgfCBcInZpZXdwb3J0XCI+LFxuICAgIFwicG9zaXRpb25cIjogTGlnaHRQb3NpdGlvblByb3BlcnR5LFxuICAgIFwiY29sb3JcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8Q29sb3I+LFxuICAgIFwiaW50ZW5zaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgcHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJhbmNob3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy5saWdodC5hbmNob3IpLFxuICAgIFwicG9zaXRpb25cIjogbmV3IExpZ2h0UG9zaXRpb25Qcm9wZXJ0eSgpLFxuICAgIFwiY29sb3JcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy5saWdodC5jb2xvciksXG4gICAgXCJpbnRlbnNpdHlcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy5saWdodC5pbnRlbnNpdHkpLFxufSk7XG5cbmNvbnN0IFRSQU5TSVRJT05fU1VGRklYID0gJy10cmFuc2l0aW9uJztcblxuLypcbiAqIFJlcHJlc2VudHMgdGhlIGxpZ2h0IHVzZWQgdG8gbGlnaHQgZXh0cnVkZWQgZmVhdHVyZXMuXG4gKi9cbmNsYXNzIExpZ2h0IGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgX3RyYW5zaXRpb25hYmxlOiBUcmFuc2l0aW9uYWJsZTxQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmc6IFRyYW5zaXRpb25pbmc8UHJvcHM+O1xuICAgIHByb3BlcnRpZXM6IFBvc3NpYmx5RXZhbHVhdGVkPFByb3BzPjtcblxuICAgIGNvbnN0cnVjdG9yKGxpZ2h0T3B0aW9ucz86IExpZ2h0U3BlY2lmaWNhdGlvbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZSA9IG5ldyBUcmFuc2l0aW9uYWJsZShwcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy5zZXRMaWdodChsaWdodE9wdGlvbnMpO1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uaW5nID0gdGhpcy5fdHJhbnNpdGlvbmFibGUudW50cmFuc2l0aW9uZWQoKTtcbiAgICB9XG5cbiAgICBnZXRMaWdodCgpOiBMaWdodFNwZWNpZmljYXRpb24ge1xuICAgICAgICByZXR1cm4gKHRoaXMuX3RyYW5zaXRpb25hYmxlLnNlcmlhbGl6ZSgpOiBhbnkpO1xuICAgIH1cblxuICAgIHNldExpZ2h0KGxpZ2h0PzogTGlnaHRTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVMaWdodCwgbGlnaHQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gbGlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbGlnaHRbbmFtZV07XG4gICAgICAgICAgICBpZiAoZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGUuc2V0VHJhbnNpdGlvbihuYW1lLnNsaWNlKDAsIC1UUkFOU0lUSU9OX1NVRkZJWC5sZW5ndGgpLCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnM6IFRyYW5zaXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25pbmcgPSB0aGlzLl90cmFuc2l0aW9uYWJsZS50cmFuc2l0aW9uZWQocGFyYW1ldGVycywgdGhpcy5fdHJhbnNpdGlvbmluZyk7XG4gICAgfVxuXG4gICAgaGFzVHJhbnNpdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25pbmcuaGFzVHJhbnNpdGlvbigpO1xuICAgIH1cblxuICAgIHJlY2FsY3VsYXRlKHBhcmFtZXRlcnM6IEV2YWx1YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHRoaXMuX3RyYW5zaXRpb25pbmcucG9zc2libHlFdmFsdWF0ZShwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGUodmFsaWRhdGU6IEZ1bmN0aW9uLCB2YWx1ZTogbWl4ZWQsIG9wdGlvbnM/OiB7dmFsaWRhdGU/OiBib29sZWFufSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnZhbGlkYXRlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlLmNhbGwodmFsaWRhdGVTdHlsZSwgZXh0ZW5kKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI0MDdcbiAgICAgICAgICAgIHN0eWxlOiB7Z2x5cGhzOiB0cnVlLCBzcHJpdGU6IHRydWV9LFxuICAgICAgICAgICAgc3R5bGVTcGVjXG4gICAgICAgIH0pKSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaWdodDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBzdHlsZVNwZWMgZnJvbSAnLi4vc3R5bGUtc3BlYy9yZWZlcmVuY2UvbGF0ZXN0LmpzJztcbmltcG9ydCB7ZW5kc1dpdGh9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge0V2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQge1Byb3BlcnRpZXMsIFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZCwgRGF0YUNvbnN0YW50UHJvcGVydHl9IGZyb20gJy4vcHJvcGVydGllcy5qcyc7XG5cbmltcG9ydCB0eXBlIEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCB0eXBlIHtUcmFuc2l0aW9uUGFyYW1ldGVyc30gZnJvbSAnLi9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIHtUZXJyYWluU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5cbnR5cGUgUHJvcHMgPSB7fFxuICAgIFwic291cmNlXCI6IERhdGFDb25zdGFudFByb3BlcnR5PHN0cmluZz4sXG4gICAgXCJleGFnZ2VyYXRpb25cIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbnx9O1xuXG5leHBvcnQgY29uc3QgRHJhcGVSZW5kZXJNb2RlID0ge1xuICAgIGRlZmVycmVkOiAwLFxuICAgIGVsZXZhdGVkOiAxXG59O1xuXG5jb25zdCBwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzPFByb3BzPiA9IG5ldyBQcm9wZXJ0aWVzKHtcbiAgICBcInNvdXJjZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjLnRlcnJhaW4uc291cmNlKSxcbiAgICBcImV4YWdnZXJhdGlvblwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjLnRlcnJhaW4uZXhhZ2dlcmF0aW9uKSxcbn0pO1xuXG5jb25zdCBUUkFOU0lUSU9OX1NVRkZJWCA9ICctdHJhbnNpdGlvbic7XG5cbmNsYXNzIFRlcnJhaW4gZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBfdHJhbnNpdGlvbmFibGU6IFRyYW5zaXRpb25hYmxlPFByb3BzPjtcbiAgICBfdHJhbnNpdGlvbmluZzogVHJhbnNpdGlvbmluZzxQcm9wcz47XG4gICAgcHJvcGVydGllczogUG9zc2libHlFdmFsdWF0ZWQ8UHJvcHM+O1xuICAgIGRyYXBlUmVuZGVyTW9kZTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IodGVycmFpbk9wdGlvbnM6IFRlcnJhaW5TcGVjaWZpY2F0aW9uLCBkcmFwZVJlbmRlck1vZGU6IG51bWJlcikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZSA9IG5ldyBUcmFuc2l0aW9uYWJsZShwcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy5zZXQodGVycmFpbk9wdGlvbnMpO1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uaW5nID0gdGhpcy5fdHJhbnNpdGlvbmFibGUudW50cmFuc2l0aW9uZWQoKTtcbiAgICAgICAgdGhpcy5kcmFwZVJlbmRlck1vZGUgPSBkcmFwZVJlbmRlck1vZGU7XG4gICAgfVxuXG4gICAgZ2V0KCk6IFRlcnJhaW5TcGVjaWZpY2F0aW9uIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl90cmFuc2l0aW9uYWJsZS5zZXJpYWxpemUoKTogYW55KTtcbiAgICB9XG5cbiAgICBzZXQodGVycmFpbjogVGVycmFpblNwZWNpZmljYXRpb24pIHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIHRlcnJhaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGVycmFpbltuYW1lXTtcbiAgICAgICAgICAgIGlmIChlbmRzV2l0aChuYW1lLCBUUkFOU0lUSU9OX1NVRkZJWCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZS5zZXRUcmFuc2l0aW9uKG5hbWUuc2xpY2UoMCwgLVRSQU5TSVRJT05fU1VGRklYLmxlbmd0aCksIHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGUuc2V0VmFsdWUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlVHJhbnNpdGlvbnMocGFyYW1ldGVyczogVHJhbnNpdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZyA9IHRoaXMuX3RyYW5zaXRpb25hYmxlLnRyYW5zaXRpb25lZChwYXJhbWV0ZXJzLCB0aGlzLl90cmFuc2l0aW9uaW5nKTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmluZy5oYXNUcmFuc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcmVjYWxjdWxhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gdGhpcy5fdHJhbnNpdGlvbmluZy5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGVycmFpbjtcbiIsIi8vIEBmbG93XG5pbXBvcnQge3ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCB7c21vb3Roc3RlcH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB0eXBlIExuZ0xhdCBmcm9tICcuLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgdHlwZSB7VW53cmFwcGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5cbmV4cG9ydCBjb25zdCBGT0dfUElUQ0hfU1RBUlQgPSA0NTtcbmV4cG9ydCBjb25zdCBGT0dfUElUQ0hfRU5EID0gNjU7XG5leHBvcnQgY29uc3QgRk9HX1NZTUJPTF9DTElQUElOR19USFJFU0hPTEQgPSAwLjk7XG5cbmV4cG9ydCB0eXBlIEZvZ1N0YXRlID0ge1xuICAgIHJhbmdlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGhvcml6b25CbGVuZDogbnVtYmVyLFxuICAgIGFscGhhOiBudW1iZXJcbn07XG5cbi8vIEFzIGRlZmluZWQgaW4gX3ByZWx1ZGVfZm9nLmZyYWdtZW50Lmdsc2wjZm9nX29wYWNpdHlcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb2dPcGFjaXR5KHN0YXRlOiBGb2dTdGF0ZSwgcG9zOiBBcnJheTxudW1iZXI+LCBwaXRjaDogbnVtYmVyLCBmb3Y6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgZm9nUGl0Y2hPcGFjaXR5ID0gc21vb3Roc3RlcChGT0dfUElUQ0hfU1RBUlQsIEZPR19QSVRDSF9FTkQsIHBpdGNoKTtcbiAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBnZXRGb3ZBZGp1c3RlZEZvZ1JhbmdlKHN0YXRlLCBmb3YpO1xuXG4gICAgLy8gVGhlIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgbWF0Y2ggX3ByZWx1ZGVfZm9nLmZyYWdtZW50Lmdsc2xcbiAgICAvLyBGb3IgZnVydGhlciBkZXRhaWxzLCByZWZlciB0byB0aGUgaW1wbGVtZW50YXRpb24gaW4gdGhlIHNoYWRlciBjb2RlXG4gICAgY29uc3QgZGVjYXkgPSA2O1xuICAgIGNvbnN0IGRlcHRoID0gdmVjMy5sZW5ndGgocG9zKTtcbiAgICBjb25zdCBmb2dSYW5nZSA9IChkZXB0aCAtIHN0YXJ0KSAvIChlbmQgLSBzdGFydCk7XG4gICAgbGV0IGZhbGxvZmYgPSAxLjAgLSBNYXRoLm1pbigxLCBNYXRoLmV4cCgtZGVjYXkgKiBmb2dSYW5nZSkpO1xuXG4gICAgZmFsbG9mZiAqPSBmYWxsb2ZmICogZmFsbG9mZjtcbiAgICBmYWxsb2ZmID0gTWF0aC5taW4oMS4wLCAxLjAwNzQ3ICogZmFsbG9mZik7XG5cbiAgICByZXR1cm4gZmFsbG9mZiAqIGZvZ1BpdGNoT3BhY2l0eSAqIHN0YXRlLmFscGhhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm92QWRqdXN0ZWRGb2dSYW5nZShzdGF0ZTogRm9nU3RhdGUsIGZvdjogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyBhIHNoaWZ0ZWQgZm9nIHJhbmdlIHNvIHRoYXQgdGhlIGFwcGVhcmFuY2UgaXMgdW5jaGFuZ2VkXG4gICAgLy8gd2hlbiB0aGUgZm92IGNoYW5nZXMuIFdlIGRlZmluZSByYW5nZT0wIHN0YXJ0aW5nIGF0IHRoZSBjYW1lcmEgcG9zaXRpb24gZ2l2ZW5cbiAgICAvLyB0aGUgZGVmYXVsdCBmb3YuIFdlIGF2b2lkIHN0YXJ0aW5nIHRoZSBmb2cgcmFuZ2UgYXQgdGhlIGNhbWVyYSBjZW50ZXIgc28gdGhhdFxuICAgIC8vIHJhbmdlcyBhcmVuJ3QgZ2VuZXJhbGx5IG5lZ2F0aXZlIHVubGVzcyB0aGUgRk9WIGlzIG1vZGlmaWVkLlxuICAgIGNvbnN0IHNoaWZ0ID0gMC41IC8gTWF0aC50YW4oZm92ICogMC41KTtcbiAgICByZXR1cm4gW3N0YXRlLnJhbmdlWzBdICsgc2hpZnQsIHN0YXRlLnJhbmdlWzFdICsgc2hpZnRdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9nT3BhY2l0eUF0VGlsZUNvb3JkKHN0YXRlOiBGb2dTdGF0ZSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciwgdGlsZUlkOiBVbndyYXBwZWRUaWxlSUQsIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogbnVtYmVyIHtcbiAgICBjb25zdCBtYXQgPSB0cmFuc2Zvcm0uY2FsY3VsYXRlRm9nVGlsZU1hdHJpeCh0aWxlSWQpO1xuICAgIGNvbnN0IHBvcyA9IFt4LCB5LCB6XTtcbiAgICB2ZWMzLnRyYW5zZm9ybU1hdDQocG9zLCBwb3MsIG1hdCk7XG5cbiAgICByZXR1cm4gZ2V0Rm9nT3BhY2l0eShzdGF0ZSwgcG9zLCB0cmFuc2Zvcm0ucGl0Y2gsIHRyYW5zZm9ybS5fZm92KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvZ09wYWNpdHlBdExuZ0xhdChzdGF0ZTogRm9nU3RhdGUsIGxuZ0xhdDogTG5nTGF0LCB0cmFuc2Zvcm06IFRyYW5zZm9ybSk6IG51bWJlciB7XG4gICAgY29uc3QgbWV0ZXJzID0gTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQobG5nTGF0KTtcbiAgICBjb25zdCBlbGV2YXRpb24gPSB0cmFuc2Zvcm0uZWxldmF0aW9uID8gdHJhbnNmb3JtLmVsZXZhdGlvbi5nZXRBdFBvaW50T3JaZXJvKG1ldGVycykgOiAwO1xuICAgIGNvbnN0IHBvcyA9IFttZXRlcnMueCwgbWV0ZXJzLnksIGVsZXZhdGlvbl07XG4gICAgdmVjMy50cmFuc2Zvcm1NYXQ0KHBvcywgcG9zLCB0cmFuc2Zvcm0ubWVyY2F0b3JGb2dNYXRyaXgpO1xuXG4gICAgcmV0dXJuIGdldEZvZ09wYWNpdHkoc3RhdGUsIHBvcywgdHJhbnNmb3JtLnBpdGNoLCB0cmFuc2Zvcm0uX2Zvdik7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdC5qcyc7XG5pbXBvcnQge2VuZHNXaXRoLCBleHRlbmQsIHNtb290aHN0ZXB9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge0V2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQge3ZhbGlkYXRlU3R5bGUsIHZhbGlkYXRlRm9nLCBlbWl0VmFsaWRhdGlvbkVycm9yc30gZnJvbSAnLi92YWxpZGF0ZV9zdHlsZS5qcyc7XG5pbXBvcnQge1Byb3BlcnRpZXMsIFRyYW5zaXRpb25hYmxlLCBUcmFuc2l0aW9uaW5nLCBQb3NzaWJseUV2YWx1YXRlZCwgRGF0YUNvbnN0YW50UHJvcGVydHl9IGZyb20gJy4vcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcbmltcG9ydCB7Rk9HX1BJVENIX1NUQVJULCBGT0dfUElUQ0hfRU5ELCBnZXRGb2dPcGFjaXR5QXRMbmdMYXQsIGdldEZvdkFkanVzdGVkRm9nUmFuZ2V9IGZyb20gJy4vZm9nX2hlbHBlcnMuanMnO1xuaW1wb3J0IHR5cGUge0ZvZ1NwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgRXZhbHVhdGlvblBhcmFtZXRlcnMgZnJvbSAnLi9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHR5cGUge1RyYW5zaXRpb25QYXJhbWV0ZXJzfSBmcm9tICcuL3Byb3BlcnRpZXMuanMnO1xuaW1wb3J0IHR5cGUgTG5nTGF0IGZyb20gJy4uL2dlby9sbmdfbGF0LmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtTdHlsZVNldHRlck9wdGlvbnN9IGZyb20gJy4uL3N0eWxlL3N0eWxlLmpzJztcbmltcG9ydCB0eXBlIHtGb2dTdGF0ZX0gZnJvbSAnLi9mb2dfaGVscGVycy5qcyc7XG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCB7Z2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbn0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vZ2xvYmVfdXRpbC5qcyc7XG5cbnR5cGUgUHJvcHMgPSB7fFxuICAgIFwicmFuZ2VcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgXCJjb2xvclwiOiBEYXRhQ29uc3RhbnRQcm9wZXJ0eTxDb2xvcj4sXG4gICAgXCJoaWdoLWNvbG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PENvbG9yPixcbiAgICBcInNwYWNlLWNvbG9yXCI6IERhdGFDb25zdGFudFByb3BlcnR5PENvbG9yPixcbiAgICBcImhvcml6b24tYmxlbmRcIjogRGF0YUNvbnN0YW50UHJvcGVydHk8bnVtYmVyPixcbiAgICBcInN0YXItaW50ZW5zaXR5XCI6IERhdGFDb25zdGFudFByb3BlcnR5PG51bWJlcj4sXG58fTtcblxuY29uc3QgZm9nUHJvcGVydGllczogUHJvcGVydGllczxQcm9wcz4gPSBuZXcgUHJvcGVydGllcyh7XG4gICAgXCJyYW5nZVwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjLmZvZy5yYW5nZSksXG4gICAgXCJjb2xvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjLmZvZy5jb2xvciksXG4gICAgXCJoaWdoLWNvbG9yXCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWMuZm9nW1wiaGlnaC1jb2xvclwiXSksXG4gICAgXCJzcGFjZS1jb2xvclwiOiBuZXcgRGF0YUNvbnN0YW50UHJvcGVydHkoc3R5bGVTcGVjLmZvZ1tcInNwYWNlLWNvbG9yXCJdKSxcbiAgICBcImhvcml6b24tYmxlbmRcIjogbmV3IERhdGFDb25zdGFudFByb3BlcnR5KHN0eWxlU3BlYy5mb2dbXCJob3Jpem9uLWJsZW5kXCJdKSxcbiAgICBcInN0YXItaW50ZW5zaXR5XCI6IG5ldyBEYXRhQ29uc3RhbnRQcm9wZXJ0eShzdHlsZVNwZWMuZm9nW1wic3Rhci1pbnRlbnNpdHlcIl0pLFxufSk7XG5cbmNvbnN0IFRSQU5TSVRJT05fU1VGRklYID0gJy10cmFuc2l0aW9uJztcblxuY2xhc3MgRm9nIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgX3RyYW5zaXRpb25hYmxlOiBUcmFuc2l0aW9uYWJsZTxQcm9wcz47XG4gICAgX3RyYW5zaXRpb25pbmc6IFRyYW5zaXRpb25pbmc8UHJvcHM+O1xuICAgIHByb3BlcnRpZXM6IFBvc3NpYmx5RXZhbHVhdGVkPFByb3BzPjtcblxuICAgIC8vIEFsdGVybmF0ZSBwcm9qZWN0aW9ucyBkbyBub3QgeWV0IHN1cHBvcnQgZm9nLlxuICAgIC8vIEhvbGQgb24gdG8gdHJhbnNmb3JtIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIGEgcHJvamVjdGlvbiBpcyBzZXQuXG4gICAgX3RyYW5zZm9ybTogVHJhbnNmb3JtO1xuXG4gICAgY29uc3RydWN0b3IoZm9nT3B0aW9ucz86IEZvZ1NwZWNpZmljYXRpb24sIHRyYW5zZm9ybTogVHJhbnNmb3JtKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25hYmxlID0gbmV3IFRyYW5zaXRpb25hYmxlKGZvZ1Byb3BlcnRpZXMpO1xuICAgICAgICB0aGlzLnNldChmb2dPcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZyA9IHRoaXMuX3RyYW5zaXRpb25hYmxlLnVudHJhbnNpdGlvbmVkKCk7XG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICB9XG5cbiAgICBnZXQgc3RhdGUoKTogRm9nU3RhdGUge1xuICAgICAgICBjb25zdCB0ciA9IHRoaXMuX3RyYW5zZm9ybTtcbiAgICAgICAgY29uc3QgaXNHbG9iZSA9IHRyLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJztcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvblQgPSBnbG9iZVRvTWVyY2F0b3JUcmFuc2l0aW9uKHRyLnpvb20pO1xuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMucHJvcGVydGllcy5nZXQoJ3JhbmdlJyk7XG4gICAgICAgIGNvbnN0IGdsb2JlRml4ZWRGb2dSYW5nZSA9IFswLjUsIDNdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmFuZ2U6IGlzR2xvYmUgPyBbXG4gICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUoZ2xvYmVGaXhlZEZvZ1JhbmdlWzBdLCByYW5nZVswXSwgdHJhbnNpdGlvblQpLFxuICAgICAgICAgICAgICAgIGludGVycG9sYXRlKGdsb2JlRml4ZWRGb2dSYW5nZVsxXSwgcmFuZ2VbMV0sIHRyYW5zaXRpb25UKVxuICAgICAgICAgICAgXSA6IHJhbmdlLFxuICAgICAgICAgICAgaG9yaXpvbkJsZW5kOiB0aGlzLnByb3BlcnRpZXMuZ2V0KCdob3Jpem9uLWJsZW5kJyksXG4gICAgICAgICAgICBhbHBoYTogdGhpcy5wcm9wZXJ0aWVzLmdldCgnY29sb3InKS5hXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0KCk6IEZvZ1NwZWNpZmljYXRpb24ge1xuICAgICAgICByZXR1cm4gKHRoaXMuX3RyYW5zaXRpb25hYmxlLnNlcmlhbGl6ZSgpOiBhbnkpO1xuICAgIH1cblxuICAgIHNldChmb2c/OiBGb2dTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVGb2csIGZvZywgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhzdHlsZVNwZWMuZm9nKSkge1xuICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gdXNlIGRlZmF1bHQgc3R5bGUgc3BlY2lmaWNhdGlvbiB3aGVuIHRoZSBwcm9wZXJ0aWVzIHdhc24ndCBzZXRcbiAgICAgICAgICAgIGlmIChmb2cgJiYgZm9nW25hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBmb2dbbmFtZV0gPSBzdHlsZVNwZWMuZm9nW25hbWVdLmRlZmF1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZm9nKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZvZ1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChlbmRzV2l0aChuYW1lLCBUUkFOU0lUSU9OX1NVRkZJWCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uYWJsZS5zZXRUcmFuc2l0aW9uKG5hbWUuc2xpY2UoMCwgLVRSQU5TSVRJT05fU1VGRklYLmxlbmd0aCksIHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmFibGUuc2V0VmFsdWUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0T3BhY2l0eShwaXRjaDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLl90cmFuc2Zvcm0ucHJvamVjdGlvbi5zdXBwb3J0c0ZvZykgcmV0dXJuIDA7XG5cbiAgICAgICAgY29uc3QgZm9nQ29sb3IgPSAodGhpcy5wcm9wZXJ0aWVzICYmIHRoaXMucHJvcGVydGllcy5nZXQoJ2NvbG9yJykpIHx8IDEuMDtcbiAgICAgICAgY29uc3QgaXNHbG9iZSA9IHRoaXMuX3RyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZSc7XG4gICAgICAgIGNvbnN0IHBpdGNoRmFjdG9yID0gaXNHbG9iZSA/IDEuMCA6IHNtb290aHN0ZXAoRk9HX1BJVENIX1NUQVJULCBGT0dfUElUQ0hfRU5ELCBwaXRjaCk7XG4gICAgICAgIHJldHVybiBwaXRjaEZhY3RvciAqIGZvZ0NvbG9yLmE7XG4gICAgfVxuXG4gICAgZ2V0T3BhY2l0eUF0TGF0TG5nKGxuZ0xhdDogTG5nTGF0LCB0cmFuc2Zvcm06IFRyYW5zZm9ybSk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5fdHJhbnNmb3JtLnByb2plY3Rpb24uc3VwcG9ydHNGb2cpIHJldHVybiAwO1xuXG4gICAgICAgIHJldHVybiBnZXRGb2dPcGFjaXR5QXRMbmdMYXQodGhpcy5zdGF0ZSwgbG5nTGF0LCB0cmFuc2Zvcm0pO1xuICAgIH1cblxuICAgIGdldEZvdkFkanVzdGVkUmFuZ2UoZm92OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgLy8gV2UgY2FuIHJldHVybiBhbnkgYXJiaXRyYXJ5IHJhbmdlIGJlY2F1c2Ugd2UgZXhwZWN0IG9wYWNpdHk9MCB0byBjbGVhbiBpdCB1cFxuICAgICAgICBpZiAoIXRoaXMuX3RyYW5zZm9ybS5wcm9qZWN0aW9uLnN1cHBvcnRzRm9nKSByZXR1cm4gWzAsIDFdO1xuXG4gICAgICAgIHJldHVybiBnZXRGb3ZBZGp1c3RlZEZvZ1JhbmdlKHRoaXMuc3RhdGUsIGZvdik7XG4gICAgfVxuXG4gICAgdXBkYXRlVHJhbnNpdGlvbnMocGFyYW1ldGVyczogVHJhbnNpdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbmluZyA9IHRoaXMuX3RyYW5zaXRpb25hYmxlLnRyYW5zaXRpb25lZChwYXJhbWV0ZXJzLCB0aGlzLl90cmFuc2l0aW9uaW5nKTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbmluZy5oYXNUcmFuc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcmVjYWxjdWxhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gdGhpcy5fdHJhbnNpdGlvbmluZy5wb3NzaWJseUV2YWx1YXRlKHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZSh2YWxpZGF0ZTogRnVuY3Rpb24sIHZhbHVlOiBtaXhlZCwgb3B0aW9ucz86IHt2YWxpZGF0ZT86IGJvb2xlYW59KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW1pdFZhbGlkYXRpb25FcnJvcnModGhpcywgdmFsaWRhdGUuY2FsbCh2YWxpZGF0ZVN0eWxlLCBleHRlbmQoe1xuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBzdHlsZToge2dseXBoczogdHJ1ZSwgc3ByaXRlOiB0cnVlfSxcbiAgICAgICAgICAgIHN0eWxlU3BlY1xuICAgICAgICB9KSkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRm9nO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHt1bmlxdWVJZCwgYXN5bmNBbGx9IGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgQWN0b3IgZnJvbSAnLi9hY3Rvci5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB0eXBlIFdvcmtlclBvb2wgZnJvbSAnLi93b3JrZXJfcG9vbC5qcyc7XG5cbi8qKlxuICogUmVzcG9uc2libGUgZm9yIHNlbmRpbmcgbWVzc2FnZXMgZnJvbSBhIHtAbGluayBTb3VyY2V9IHRvIGFuIGFzc29jaWF0ZWRcbiAqIHtAbGluayBXb3JrZXJTb3VyY2V9LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIERpc3BhdGNoZXIge1xuICAgIHdvcmtlclBvb2w6IFdvcmtlclBvb2w7XG4gICAgYWN0b3JzOiBBcnJheTxBY3Rvcj47XG4gICAgY3VycmVudEFjdG9yOiBudW1iZXI7XG4gICAgaWQ6IG51bWJlcjtcbiAgICByZWFkeTogYm9vbGVhbjtcblxuICAgIC8vIGV4cG9zZWQgdG8gYWxsb3cgc3R1YmJpbmcgaW4gdW5pdCB0ZXN0c1xuICAgIHN0YXRpYyBBY3RvcjogQ2xhc3M8QWN0b3I+O1xuXG4gICAgY29uc3RydWN0b3Iod29ya2VyUG9vbDogV29ya2VyUG9vbCwgcGFyZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy53b3JrZXJQb29sID0gd29ya2VyUG9vbDtcbiAgICAgICAgdGhpcy5hY3RvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50QWN0b3IgPSAwO1xuICAgICAgICB0aGlzLmlkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5hY3F1aXJlKHRoaXMuaWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmtlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaV07XG4gICAgICAgICAgICBjb25zdCBhY3RvciA9IG5ldyBEaXNwYXRjaGVyLkFjdG9yKHdvcmtlciwgcGFyZW50LCB0aGlzLmlkKTtcbiAgICAgICAgICAgIGFjdG9yLm5hbWUgPSBgV29ya2VyICR7aX1gO1xuICAgICAgICAgICAgdGhpcy5hY3RvcnMucHVzaChhY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0KHRoaXMuYWN0b3JzLmxlbmd0aCk7XG5cbiAgICAgICAgLy8gdHJhY2sgd2hldGhlciBhbGwgd29ya2VycyBhcmUgaW5zdGFudGlhdGVkIGFuZCByZWFkeSB0byByZWNlaXZlIG1lc3NhZ2VzO1xuICAgICAgICAvLyB1c2VkIGZvciBvcHRpbWl6YXRpb25zIG9uIGluaXRpYWwgbWFwIGxvYWRcbiAgICAgICAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJyb2FkY2FzdCgnY2hlY2tJZlJlYWR5JywgbnVsbCwgKCkgPT4geyB0aGlzLnJlYWR5ID0gdHJ1ZTsgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byBhbGwgV29ya2Vycy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGJyb2FkY2FzdCh0eXBlOiBzdHJpbmcsIGRhdGE6IG1peGVkLCBjYj86IEZ1bmN0aW9uKSB7XG4gICAgICAgIGFzc2VydCh0aGlzLmFjdG9ycy5sZW5ndGgpO1xuICAgICAgICBjYiA9IGNiIHx8IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICBhc3luY0FsbCh0aGlzLmFjdG9ycywgKGFjdG9yLCBkb25lKSA9PiB7XG4gICAgICAgICAgICBhY3Rvci5zZW5kKHR5cGUsIGRhdGEsIGRvbmUpO1xuICAgICAgICB9LCBjYik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWNxdWlyZXMgYW4gYWN0b3IgdG8gZGlzcGF0Y2ggbWVzc2FnZXMgdG8uIFRoZSBhY3RvcnMgYXJlIGRpc3RyaWJ1dGVkIGluIHJvdW5kLXJvYmluIGZhc2hpb24uXG4gICAgICogQHJldHVybnMge0FjdG9yfSBBbiBhY3RvciBvYmplY3QgYmFja2VkIGJ5IGEgd2ViIHdvcmtlciBmb3IgcHJvY2Vzc2luZyBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICBnZXRBY3RvcigpOiBBY3RvciB7XG4gICAgICAgIGFzc2VydCh0aGlzLmFjdG9ycy5sZW5ndGgpO1xuICAgICAgICB0aGlzLmN1cnJlbnRBY3RvciA9ICh0aGlzLmN1cnJlbnRBY3RvciArIDEpICUgdGhpcy5hY3RvcnMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RvcnNbdGhpcy5jdXJyZW50QWN0b3JdO1xuICAgIH1cblxuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5hY3RvcnMuZm9yRWFjaCgoYWN0b3IpID0+IHsgYWN0b3IucmVtb3ZlKCk7IH0pO1xuICAgICAgICB0aGlzLmFjdG9ycyA9IFtdO1xuICAgICAgICB0aGlzLndvcmtlclBvb2wucmVsZWFzZSh0aGlzLmlkKTtcbiAgICB9XG59XG5cbkRpc3BhdGNoZXIuQWN0b3IgPSBBY3RvcjtcblxuZXhwb3J0IGRlZmF1bHQgRGlzcGF0Y2hlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7bWF0Mn0gZnJvbSAnZ2wtbWF0cml4JztcblxuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5cbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUge1RpbGVUcmFuc2Zvcm19IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHBpeGVsIHZhbHVlIGF0IGEgdGhlIGdpdmVuIHpvb20gbGV2ZWwgdG8gdGlsZSB1bml0cy5cbiAqXG4gKiBUaGUgc2hhZGVycyBtb3N0bHkgY2FsY3VsYXRlIGV2ZXJ5dGhpbmcgaW4gdGlsZSB1bml0cyBzbyBzdHlsZVxuICogcHJvcGVydGllcyBuZWVkIHRvIGJlIGNvbnZlcnRlZCBmcm9tIHBpeGVscyB0byB0aWxlIHVuaXRzIHVzaW5nIHRoaXMuXG4gKlxuICogRm9yIGV4YW1wbGUsIGEgdHJhbnNsYXRpb24gYnkgMzAgcGl4ZWxzIGF0IHpvb20gNi41IHdpbGwgYmUgYVxuICogdHJhbnNsYXRpb24gYnkgcGl4ZWxzVG9UaWxlVW5pdHMoMzAsIDYuNSkgdGlsZSB1bml0cy5cbiAqXG4gKiBAcmV0dXJucyB2YWx1ZSBpbiB0aWxlIHVuaXRzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0aWxlOiB7dGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB0aWxlU2l6ZTogbnVtYmVyfSwgcGl4ZWxWYWx1ZTogbnVtYmVyLCB6OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBwaXhlbFZhbHVlICogKEVYVEVOVCAvICh0aWxlLnRpbGVTaXplICogTWF0aC5wb3coMiwgeiAtIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGl4ZWxzVG9UaWxlVW5pdHNNYXRyaXgodGlsZToge3RpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgdGlsZVNpemU6IG51bWJlciwgK3RpbGVUcmFuc2Zvcm06IFRpbGVUcmFuc2Zvcm19LCB0cmFuc2Zvcm06IFRyYW5zZm9ybSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3Qge3NjYWxlfSA9IHRpbGUudGlsZVRyYW5zZm9ybTtcbiAgICBjb25zdCBzID0gc2NhbGUgKiBFWFRFTlQgLyAodGlsZS50aWxlU2l6ZSAqIE1hdGgucG93KDIsIHRyYW5zZm9ybS56b29tIC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFogKyB0aWxlLnRpbGVJRC5jYW5vbmljYWwueikpO1xuICAgIHJldHVybiBtYXQyLnNjYWxlKG5ldyBGbG9hdDMyQXJyYXkoNCksIHRyYW5zZm9ybS5pbnZlcnNlQWRqdXN0bWVudE1hdHJpeCwgW3MsIHNdKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7Z2V0Qm91bmRzLCBjbGFtcCwgcG9seWdvbml6ZUJvdW5kcywgYnVmZmVyQ29udmV4UG9seWdvbn0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7cG9seWdvbkludGVyc2VjdHNCb3gsIHBvbHlnb25Db250YWluc1BvaW50fSBmcm9tICcuLi91dGlsL2ludGVyc2VjdGlvbl90ZXN0cy5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50LmpzJztcbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZS5qcyc7XG5pbXBvcnQgcGl4ZWxzVG9UaWxlVW5pdHMgZnJvbSAnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzLmpzJztcbmltcG9ydCB7dmVjMywgdmVjNCwgbWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7UmF5fSBmcm9tICcuLi91dGlsL3ByaW1pdGl2ZXMuanMnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge21lcmNhdG9yWGZyb21Mbmd9IGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQge2dldFRpbGVQb2ludCwgZ2V0VGlsZVZlYzN9IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcbmltcG9ydCByZXNhbXBsZSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9yZXNhbXBsZS5qcyc7XG5pbXBvcnQge0dMT0JFX1JBRElVU30gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vZ2xvYmVfdXRpbC5qcyc7XG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzJztcblxudHlwZSBDYWNoZWRQb2x5Z29uID0ge1xuICAgIC8vIFF1ZXJ5IHJlY3RhbmdsZSBwcm9qZWN0ZWQgb24gdGhlIG1hcCBwbGFuZVxuICAgIHBvbHlnb246IE1lcmNhdG9yQ29vcmRpbmF0ZVtdO1xuXG4gICAgLy8gQSBmbGFnIHRlbGxpbmd3aGV0aGVyIHRoZSBxdWVyeSBwb2x5Z29uIG1pZ2h0IHNwYW4gYWNyb3NzIG1lcmNhdG9yIGJvdW5kYXJpZXMgWzAsIDFdXG4gICAgdW53cmFwcGVkOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBBIGRhdGEtY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgc2NyZWVuc3BhY2UgcXVlcnkgZnJvbSBgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc2AuXG4gKiBBbGwgdGhlIGludGVybmFsIGdlb21ldHJpZXMgYW5kIGRhdGEgYXJlIGludGVudGVkIHRvIGJlIGltbXV0YWJsZSBhbmQgcmVhZC1vbmx5LlxuICogSXRzIGxpZmV0aW1lIGlzIG9ubHkgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcXVlcnkgYW5kIGZpeGVkIHN0YXRlIG9mIHRoZSBtYXAgd2hpbGUgdGhlIHF1ZXJ5IGlzIGJlaW5nIHByb2Nlc3NlZC5cbiAqXG4gKiBAY2xhc3MgUXVlcnlHZW9tZXRyeVxuICovXG5leHBvcnQgY2xhc3MgUXVlcnlHZW9tZXRyeSB7XG4gICAgc2NyZWVuQm91bmRzOiBQb2ludFtdO1xuICAgIGNhbWVyYVBvaW50OiBQb2ludDtcbiAgICBzY3JlZW5HZW9tZXRyeTogUG9pbnRbXTtcbiAgICBzY3JlZW5HZW9tZXRyeU1lcmNhdG9yOiBDYWNoZWRQb2x5Z29uO1xuXG4gICAgX3NjcmVlblJheWNhc3RDYWNoZTogeyBbXzogbnVtYmVyXTogQ2FjaGVkUG9seWdvbn07XG4gICAgX2NhbWVyYVJheWNhc3RDYWNoZTogeyBbXzogbnVtYmVyXTogQ2FjaGVkUG9seWdvbn07XG5cbiAgICBpc0Fib3ZlSG9yaXpvbjogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmVlbkJvdW5kczogUG9pbnRbXSwgY2FtZXJhUG9pbnQ6IFBvaW50LCBhYm92ZUhvcml6b246IGJvb2xlYW4sIHRyYW5zZm9ybTogVHJhbnNmb3JtKSB7XG4gICAgICAgIHRoaXMuc2NyZWVuQm91bmRzID0gc2NyZWVuQm91bmRzO1xuICAgICAgICB0aGlzLmNhbWVyYVBvaW50ID0gY2FtZXJhUG9pbnQ7XG4gICAgICAgIHRoaXMuX3NjcmVlblJheWNhc3RDYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLl9jYW1lcmFSYXljYXN0Q2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5pc0Fib3ZlSG9yaXpvbiA9IGFib3ZlSG9yaXpvbjtcblxuICAgICAgICB0aGlzLnNjcmVlbkdlb21ldHJ5ID0gdGhpcy5idWZmZXJlZFNjcmVlbkdlb21ldHJ5KDApO1xuICAgICAgICB0aGlzLnNjcmVlbkdlb21ldHJ5TWVyY2F0b3IgPSB0aGlzLl9idWZmZXJlZFNjcmVlbk1lcmNhdG9yKDAsIHRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmFjdG9yeSBtZXRob2QgdG8gaGVscCBjb250cnVjdCBhbiBpbnN0YW5jZSAgd2hpbGUgYWNjb3VudGluZyBmb3IgY3VycmVudCBtYXAgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHsoUG9pbnRMaWtlIHwgW1BvaW50TGlrZSwgUG9pbnRMaWtlXSl9IGdlb21ldHJ5IFRoZSBxdWVyeSBnZW9tZXRyeS5cbiAgICAgKiBAcGFyYW0ge1RyYW5zZm9ybX0gdHJhbnNmb3JtIFRoZSBjdXJyZW50IG1hcCB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybnMge1F1ZXJ5R2VvbWV0cnl9IEFuIGluc3RhbmNlIG9mIHRoZSBRdWVyeUdlb21ldHJ5IGNsYXNzLlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVGcm9tU2NyZWVuUG9pbnRzKGdlb21ldHJ5OiBQb2ludExpa2UgfCBbUG9pbnRMaWtlLCBQb2ludExpa2VdLCB0cmFuc2Zvcm06IFRyYW5zZm9ybSk6IFF1ZXJ5R2VvbWV0cnkge1xuICAgICAgICBsZXQgc2NyZWVuR2VvbWV0cnk7XG4gICAgICAgIGxldCBhYm92ZUhvcml6b247XG4gICAgICAgIGlmIChnZW9tZXRyeSBpbnN0YW5jZW9mIFBvaW50IHx8IHR5cGVvZiBnZW9tZXRyeVswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNvbnN0IHB0ID0gUG9pbnQuY29udmVydChnZW9tZXRyeSk7XG4gICAgICAgICAgICBzY3JlZW5HZW9tZXRyeSA9IFtQb2ludC5jb252ZXJ0KGdlb21ldHJ5KV07XG4gICAgICAgICAgICBhYm92ZUhvcml6b24gPSB0cmFuc2Zvcm0uaXNQb2ludEFib3ZlSG9yaXpvbihwdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0bCA9IFBvaW50LmNvbnZlcnQoZ2VvbWV0cnlbMF0pO1xuICAgICAgICAgICAgY29uc3QgYnIgPSBQb2ludC5jb252ZXJ0KGdlb21ldHJ5WzFdKTtcbiAgICAgICAgICAgIHNjcmVlbkdlb21ldHJ5ID0gW3RsLCBicl07XG4gICAgICAgICAgICBhYm92ZUhvcml6b24gPSBwb2x5Z29uaXplQm91bmRzKHRsLCBicikuZXZlcnkoKHApID0+IHRyYW5zZm9ybS5pc1BvaW50QWJvdmVIb3Jpem9uKHApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlHZW9tZXRyeShzY3JlZW5HZW9tZXRyeSwgdHJhbnNmb3JtLmdldENhbWVyYVBvaW50KCksIGFib3ZlSG9yaXpvbiwgdHJhbnNmb3JtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGluaXRpYWwgcXVlcnkgYnkgdGhlIHVzZXIgd2FzIGEgc2luZ2xlIHBvaW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBpbml0aWFsIHF1ZXJ5IGdlb21ldHJ5IHdhcyBhIHNpbmdsZSBwb2ludC5cbiAgICAgKi9cbiAgICBpc1BvaW50UXVlcnkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcmVlbkJvdW5kcy5sZW5ndGggPT09IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHVlIHRvIGRhdGEtZHJpdmVuIHN0eWxpbmcgZmVhdHVyZXMgZG8gbm90IHVuaWZvcm0gc2l6ZShlZyBgY2lyY2xlLXJhZGl1c2ApIGFuZCBjYW4gYmUgb2Zmc2V0IGRpZmZlcm50bHlcbiAgICAgKiBmcm9tIHRoZWlyIG9yaWdpbmFsIGxvY2F0aW9uKGZvciBleGFtcGxlIHdpdGggYCotdHJhbnNsYXRlYCkuIFRoaXMgbWVhbnMgd2UgaGF2ZSB0byBleHBhbmQgb3VyIHF1ZXJ5IHJlZ2lvbiBmb3JcbiAgICAgKiBlYWNoIHRpbGUgdG8gYWNjb3VudCBmb3IgdmFyaWF0aW9uIGluIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICogRWFjaCB0aWxlIGNhbGN1bGF0ZXMgYSB0aWxlIGxldmVsIG1heCBwYWRkaW5nIHZhbHVlIChpbiBzY3JlZW5zcGFjZSBwaXhlbHMpIHdoZW4gaXRzIHBhcnNlZCwgdGhpcyBmdW5jdGlvblxuICAgICAqIGxldHMgdXMgY2FsY3VsYXRlIGEgYnVmZmVyZWQgdmVyc2lvbiBvZiB0aGUgc2NyZWVuc3BhY2UgcXVlcnkgZ2VvbWV0cnkgZm9yIGVhY2ggdGlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBidWZmZXIgVGhlIHRpbGUgcGFkZGluZyBpbiBzY3JlZW5zcGFjZSBwaXhlbHMuXG4gICAgICogQHJldHVybnMge1BvaW50W119IFRoZSBidWZmZXJlZCBxdWVyeSBnZW9tZXRyeS5cbiAgICAgKi9cbiAgICBidWZmZXJlZFNjcmVlbkdlb21ldHJ5KGJ1ZmZlcjogbnVtYmVyKTogUG9pbnRbXSB7XG4gICAgICAgIHJldHVybiBwb2x5Z29uaXplQm91bmRzKFxuICAgICAgICAgICAgdGhpcy5zY3JlZW5Cb3VuZHNbMF0sXG4gICAgICAgICAgICB0aGlzLnNjcmVlbkJvdW5kcy5sZW5ndGggPT09IDEgPyB0aGlzLnNjcmVlbkJvdW5kc1swXSA6IHRoaXMuc2NyZWVuQm91bmRzWzFdLFxuICAgICAgICAgICAgYnVmZmVyXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgbWFwIGlzIHBpdGNoZWQsIHNvbWUgb2YgdGhlIDNEIGZlYXR1cmVzIHRoYXQgaW50ZXJzZWN0IGEgcXVlcnkgd2lsbCBub3QgaW50ZXJzZWN0XG4gICAgICogdGhlIHF1ZXJ5IGF0IHRoZSBzdXJmYWNlIG9mIHRoZSBlYXJ0aC4gSW5zdGVhZCB0aGUgZmVhdHVyZSBtYXkgYmUgY2xvc2VyIGFuZCBvbmx5IGludGVyc2VjdFxuICAgICAqIHRoZSBxdWVyeSBiZWNhdXNlIGl0IGV4dHJ1ZGVzIGludG8gdGhlIGFpci5cbiAgICAgKlxuICAgICAqIFRoaXMgcmV0dXJucyBhIGdlb21ldHJ5IHRoYXQgaXMgYSBjb252ZXggcG9seWdvbiB0aGF0IGVuY29tcGFzc2VzIHRoZSBxdWVyeSBmcnVzdHVtIGFuZCB0aGUgcG9pbnQgdW5kZXJuZWF0aCB0aGUgY2FtZXJhLlxuICAgICAqIFNpbWlsYXIgdG8gYGJ1ZmZlcmVkU2NyZWVuR2VvbWV0cnlgLCBidWZmZXJpbmcgaXMgYWRkZWQgdG8gYWNjb3VudCBmb3IgdmFyaWF0aW9uIGluIHBhaW50IHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBDYXNlIDE6IHBvaW50IHVuZGVybmVhdGggY2FtZXJhIGlzIGV4YWN0bHkgYmVoaW5kIHF1ZXJ5IHZvbHVtZVxuICAgICAqICAgICAgICAgICAgICArLS0tLS0tLS0tLStcbiAgICAgKiAgICAgICAgICAgICAgfCAgICAgICAgICB8XG4gICAgICogICAgICAgICAgICAgIHwgICAgICAgICAgfFxuICAgICAqICAgICAgICAgICAgICB8ICAgICAgICAgIHxcbiAgICAgKiAgICAgICAgICAgICAgKyAgICAgICAgICArXG4gICAgICogICAgICAgICAgICAgICBYICAgICAgICBYXG4gICAgICogICAgICAgICAgICAgICAgWCAgICAgIFhcbiAgICAgKiAgICAgICAgICAgICAgICAgWCAgICBYXG4gICAgICogICAgICAgICAgICAgICAgICBYICBYXG4gICAgICogICAgICAgICAgICAgICAgICAgWFguXG4gICAgICpcbiAgICAgKiBDYXNlIDI6IHBvaW50IGlzIGJlaGluZCBhbmQgdG8gdGhlIHJpZ2h0XG4gICAgICogICAgICAgICAgICAgICstLS0tLS0tLS0tK1xuICAgICAqICAgICAgICAgICAgICB8ICAgICAgICAgIFhcbiAgICAgKiAgICAgICAgICAgICAgfCAgICAgICAgICAgWFxuICAgICAqICAgICAgICAgICAgICB8ICAgICAgICAgICBYWFxuICAgICAqICAgICAgICAgICAgICArICAgICAgICAgICAgWFxuICAgICAqICAgICAgICAgICAgICBYWFggICAgICAgICAgWFhcbiAgICAgKiAgICAgICAgICAgICAgICAgWFhYWCAgICAgICBYXG4gICAgICogICAgICAgICAgICAgICAgICAgIFhYWCAgICAgWFhcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIFhYICAgWFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgWFhYLlxuICAgICAqXG4gICAgICogQ2FzZSAzOiBwb2ludCBpcyBiZWhpbmQgYW5kIHRvIHRoZSBsZWZ0XG4gICAgICogICAgICAgICAgICAgICstLS0tLS0tLS0tK1xuICAgICAqICAgICAgICAgICAgIFggICAgICAgICAgIHxcbiAgICAgKiAgICAgICAgICAgICBYICAgICAgICAgICB8XG4gICAgICogICAgICAgICAgICBYWCAgICAgICAgICAgfFxuICAgICAqICAgICAgICAgICAgWCAgICAgICAgICAgICtcbiAgICAgKiAgICAgICAgICAgWCAgICAgICAgICBYWFhYXG4gICAgICogICAgICAgICAgWFggICAgICAgWFhYXG4gICAgICogICAgICAgICAgWCAgICBYWFhYXG4gICAgICogICAgICAgICBYIFhYWFhcbiAgICAgKiAgICAgICAgIFhYWC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBidWZmZXIgVGhlIHRpbGUgcGFkZGluZyBpbiBzY3JlZW5zcGFjZSBwaXhlbHMuXG4gICAgICogQHJldHVybnMge1BvaW50W119IFRoZSBidWZmZXJlZCBxdWVyeSBnZW9tZXRyeS5cbiAgICAgKi9cbiAgICBidWZmZXJlZENhbWVyYUdlb21ldHJ5KGJ1ZmZlcjogbnVtYmVyKTogUG9pbnRbXSB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMuc2NyZWVuQm91bmRzWzBdO1xuICAgICAgICBjb25zdCBtYXggPSB0aGlzLnNjcmVlbkJvdW5kcy5sZW5ndGggPT09IDEgPyB0aGlzLnNjcmVlbkJvdW5kc1swXS5hZGQobmV3IFBvaW50KDEsIDEpKSA6IHRoaXMuc2NyZWVuQm91bmRzWzFdO1xuICAgICAgICBjb25zdCBjYW1lcmFQb2x5Z29uID0gcG9seWdvbml6ZUJvdW5kcyhtaW4sIG1heCwgMCwgZmFsc2UpO1xuXG4gICAgICAgIC8vIE9ubHkgbmVlZCB0byBhY2NvdW50IGZvciBwb2ludCB1bmRlcm5lYXRoIGNhbWVyYSBpZiBpdHMgYmVoaW5kIHF1ZXJ5IHZvbHVtZVxuICAgICAgICBpZiAodGhpcy5jYW1lcmFQb2ludC55ID4gbWF4LnkpIHtcbiAgICAgICAgICAgIC8vY2FzZSAxOiBpbnNlcnQgcG9pbnQgaW4gdGhlIG1pZGRsZVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FtZXJhUG9pbnQueCA+IG1pbi54ICYmIHRoaXMuY2FtZXJhUG9pbnQueCA8IG1heC54KSB7XG4gICAgICAgICAgICAgICAgY2FtZXJhUG9seWdvbi5zcGxpY2UoMywgMCwgdGhpcy5jYW1lcmFQb2ludCk7XG4gICAgICAgICAgICAvL2Nhc2UgMjogcmVwbGFjZSBidG0gcmlnaHQgcG9pbnRcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYW1lcmFQb2ludC54ID49IG1heC54KSB7XG4gICAgICAgICAgICAgICAgY2FtZXJhUG9seWdvblsyXSA9IHRoaXMuY2FtZXJhUG9pbnQ7XG4gICAgICAgICAgICAvL2Nhc2UgMzogcmVwbGFjZSBidG0gbGVmdCBwb2ludFxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhbWVyYVBvaW50LnggPD0gbWluLngpIHtcbiAgICAgICAgICAgICAgICBjYW1lcmFQb2x5Z29uWzNdID0gdGhpcy5jYW1lcmFQb2ludDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBidWZmZXJDb252ZXhQb2x5Z29uKGNhbWVyYVBvbHlnb24sIGJ1ZmZlcik7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlcyBhIGNvbnZleCBwb2x5Z29uIGluIHNjcmVlbiBjb29yZGluYXRlcyB0aGF0IGVuY29tcGFzc2VzIHRoZSBxdWVyeSBmcnVzdHVtIGFuZFxuICAgIC8vIHRoZSBjYW1lcmEgbG9jYXRpb24gYXQgZ2xvYmUncyBzdXJmYWNlLiBDYW1lcmEgcG9pbnQgY2FuIGJlIGF0IGFueSBzaWRlIG9mIHRoZSBxdWVyeSBwb2x5Z29uIGFzXG4gICAgLy8gb3Bwb3NlZCB0byBgYnVmZmVyZWRDYW1lcmFHZW9tZXRyeWAgd2hpY2ggcmVzdHJpY3RzIHRoZSBsb2NhdGlvbiB0byB1bmRlcm5lYXRoIHRoZSBwb2x5Z29uLlxuICAgIGJ1ZmZlcmVkQ2FtZXJhR2VvbWV0cnlHbG9iZShidWZmZXI6IG51bWJlcik6IFBvaW50W10ge1xuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLnNjcmVlbkJvdW5kc1swXTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5zY3JlZW5Cb3VuZHMubGVuZ3RoID09PSAxID8gdGhpcy5zY3JlZW5Cb3VuZHNbMF0uYWRkKG5ldyBQb2ludCgxLCAxKSkgOiB0aGlzLnNjcmVlbkJvdW5kc1sxXTtcblxuICAgICAgICAvLyBQYWRkaW5nIGlzIGFkZGVkIHRvIHRoZSBxdWVyeSBwb2x5Z29uIGJlZm9yZSBpbmNsdXNpb24gb2YgdGhlIGNhbWVyYSBsb2NhdGlvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBidWZmZXJlZCAobmFycm93KSBwb2x5Z29uIGNvdWxkIHBlbmV0cmF0ZSB0aGUgZ2xvYmUgY3JlYXRpbmcgYSBsb3Qgb2YgZmFsc2UgcG9zaXRpdmVzXG4gICAgICAgIGNvbnN0IGNhbWVyYVBvbHlnb24gPSBwb2x5Z29uaXplQm91bmRzKG1pbiwgbWF4LCBidWZmZXIpO1xuXG4gICAgICAgIGNvbnN0IGNhbVBvcyA9IHRoaXMuY2FtZXJhUG9pbnQuY2xvbmUoKTtcbiAgICAgICAgY29uc3QgY29sdW1uID0gKGNhbVBvcy54ID4gbWluLngpICsgKGNhbVBvcy54ID4gbWF4LngpO1xuICAgICAgICBjb25zdCByb3cgPSAoY2FtUG9zLnkgPiBtaW4ueSkgKyAoY2FtUG9zLnkgPiBtYXgueSk7XG4gICAgICAgIGNvbnN0IHNlY3RvciA9IHJvdyAqIDMgKyBjb2x1bW47XG5cbiAgICAgICAgc3dpdGNoIChzZWN0b3IpIHtcbiAgICAgICAgY2FzZSAwOiAgICAgLy8gcmVwbGFjZSB0b3AtbGVmdCBwb2ludCAoY2xvc2VkIHBvbHlnb24pXG4gICAgICAgICAgICBjYW1lcmFQb2x5Z29uWzBdID0gY2FtUG9zO1xuICAgICAgICAgICAgY2FtZXJhUG9seWdvbls0XSA9IGNhbVBvcy5jbG9uZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTogICAgIC8vIGluc2VydCBwb2ludCBpbiB0aGUgbWlkZGxlIG9mIHRvcC1sZWZ0IGFuZCB0b3AtcmlnaHRcbiAgICAgICAgICAgIGNhbWVyYVBvbHlnb24uc3BsaWNlKDEsIDAsIGNhbVBvcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOiAgICAgLy8gcmVwbGFjZSB0b3AtcmlnaHQgcG9pbnRcbiAgICAgICAgICAgIGNhbWVyYVBvbHlnb25bMV0gPSBjYW1Qb3M7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOiAgICAgLy8gaW5zZXJ0IHBvaW50IGluIHRoZSBtaWRkbGUgb2YgdG9wLWxlZnQgYW5kIGJvdHRvbS1sZWZ0XG4gICAgICAgICAgICBjYW1lcmFQb2x5Z29uLnNwbGljZSg0LCAwLCBjYW1Qb3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTogICAgIC8vIGluc2VydCBwb2ludCBpbiB0aGUgbWlkZGxlIG9mIHRvcC1yaWdodCBhbmQgYm90dG9tLXJpZ2h0XG4gICAgICAgICAgICBjYW1lcmFQb2x5Z29uLnNwbGljZSgyLCAwLCBjYW1Qb3MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjogICAgIC8vIHJlcGxhY2UgYm90dG9tLWxlZnQgcG9pbnRcbiAgICAgICAgICAgIGNhbWVyYVBvbHlnb25bM10gPSBjYW1Qb3M7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OiAgICAgLy8gaW5zZXJ0IHBvaW50IGluIHRoZSBtaWRkbGUgb2YgYm90dG9tLWxlZnQgYW5kIGJvdHRvbS1yaWdodFxuICAgICAgICAgICAgY2FtZXJhUG9seWdvbi5zcGxpY2UoMywgMCwgY2FtUG9zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDg6ICAgICAvLyByZXBsYWNlIGJvdHRvbS1yaWdodCBwb2ludFxuICAgICAgICAgICAgY2FtZXJhUG9seWdvblsyXSA9IGNhbVBvcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbWVyYVBvbHlnb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgdGlsZSBpcyBjb250YWluZWQgd2l0aGluIHRoaXMgcXVlcnkgZ2VvbWV0cnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1RpbGV9IHRpbGUgVGhlIHRpbGUgdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtUcmFuc2Zvcm19IHRyYW5zZm9ybSBUaGUgY3VycmVudCBtYXAgdHJhbnNmb3JtLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlM0QgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byBxdWVyeSAzRCBmZWF0dXJlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY2FtZXJhV3JhcCBBIHdyYXAgdmFsdWUgZm9yIG9mZnNldHRpbmcgdGhlIGNhbWVyYSBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7P1RpbGVzcGFjZVF1ZXJ5R2VvbWV0cnl9IFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIHRpbGUgZG9lcyBub3QgaW50ZXJzZWN0LlxuICAgICAqL1xuICAgIGNvbnRhaW5zVGlsZSh0aWxlOiBUaWxlLCB0cmFuc2Zvcm06IFRyYW5zZm9ybSwgdXNlM0Q6IGJvb2xlYW4sIGNhbWVyYVdyYXA6IG51bWJlciA9IDApOiA/VGlsZXNwYWNlUXVlcnlHZW9tZXRyeSB7XG4gICAgICAgIC8vIFRoZSBidWZmZXIgYXJvdW5kIHRoZSBxdWVyeSBnZW9tZXRyeSBpcyBhcHBsaWVkIGluIHNjcmVlbi1zcGFjZS5cbiAgICAgICAgLy8gdHJhbnNmb3JtLl9wcm9qZWN0aW9uU2NhbGVyIGlzIHVzZWQgdG8gY29tcGVuc2F0ZSBhbnkgZXh0cmEgc2NhbGluZyBhcHBsaWVkIGZyb20gdGhlIGN1cnJlbnRseSBhY3RpdmUgcHJvamVjdGlvbi5cbiAgICAgICAgLy8gRmxvYXRpbmcgcG9pbnQgZXJyb3JzIHdoZW4gcHJvamVjdGluZyBpbnRvIHRpbGVzcGFjZSBjb3VsZCBsZWF2ZSBhIGZlYXR1cmVcbiAgICAgICAgLy8gb3V0c2lkZSB0aGUgcXVlcnkgdm9sdW1lIGV2ZW4gaWYgaXQgbG9va3MgbGlrZSBpdCBvdmVybGFwcyB2aXN1YWxseSwgYSAxcHggYmlhcyB2YWx1ZSBvdmVyY29tZXMgdGhhdC5cbiAgICAgICAgY29uc3QgYmlhcyA9IDE7XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSB0aWxlLnF1ZXJ5UGFkZGluZyAvIHRyYW5zZm9ybS5fcHJvamVjdGlvblNjYWxlciArIGJpYXM7XG5cbiAgICAgICAgY29uc3QgY2FjaGVkUXVlcnkgPSB1c2UzRCA/XG4gICAgICAgICAgICB0aGlzLl9idWZmZXJlZENhbWVyYU1lcmNhdG9yKHBhZGRpbmcsIHRyYW5zZm9ybSkgOlxuICAgICAgICAgICAgdGhpcy5fYnVmZmVyZWRTY3JlZW5NZXJjYXRvcihwYWRkaW5nLCB0cmFuc2Zvcm0pO1xuXG4gICAgICAgIGxldCB3cmFwID0gdGlsZS50aWxlSUQud3JhcCArIChjYWNoZWRRdWVyeS51bndyYXBwZWQgPyBjYW1lcmFXcmFwIDogMCk7XG4gICAgICAgIGNvbnN0IGdlb21ldHJ5Rm9yVGlsZUNoZWNrID0gY2FjaGVkUXVlcnkucG9seWdvbi5tYXAoKHApID0+IGdldFRpbGVQb2ludCh0aWxlLnRpbGVUcmFuc2Zvcm0sIHAsIHdyYXApKTtcblxuICAgICAgICBpZiAoIXBvbHlnb25JbnRlcnNlY3RzQm94KGdlb21ldHJ5Rm9yVGlsZUNoZWNrLCAwLCAwLCBFWFRFTlQsIEVYVEVOVCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB3cmFwID0gdGlsZS50aWxlSUQud3JhcCArICh0aGlzLnNjcmVlbkdlb21ldHJ5TWVyY2F0b3IudW53cmFwcGVkID8gY2FtZXJhV3JhcCA6IDApO1xuICAgICAgICBjb25zdCB0aWxlc3BhY2VWZWMzcyA9IHRoaXMuc2NyZWVuR2VvbWV0cnlNZXJjYXRvci5wb2x5Z29uLm1hcCgocCkgPT4gZ2V0VGlsZVZlYzModGlsZS50aWxlVHJhbnNmb3JtLCBwLCB3cmFwKSk7XG4gICAgICAgIGNvbnN0IHRpbGVzcGFjZUdlb21ldHJ5ID0gdGlsZXNwYWNlVmVjM3MubWFwKCh2KSA9PiBuZXcgUG9pbnQodlswXSwgdlsxXSkpO1xuXG4gICAgICAgIGNvbnN0IGNhbWVyYU1lcmNhdG9yID0gdHJhbnNmb3JtLmdldEZyZWVDYW1lcmFPcHRpb25zKCkucG9zaXRpb24gfHwgbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZSgwLCAwLCAwKTtcbiAgICAgICAgY29uc3QgdGlsZXNwYWNlQ2FtZXJhUG9zaXRpb24gPSBnZXRUaWxlVmVjMyh0aWxlLnRpbGVUcmFuc2Zvcm0sIGNhbWVyYU1lcmNhdG9yLCB3cmFwKTtcbiAgICAgICAgY29uc3QgdGlsZXNwYWNlUmF5cyA9IHRpbGVzcGFjZVZlYzNzLm1hcCgodGlsZVZlYykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGlyID0gdmVjMy5zdWIodGlsZVZlYywgdGlsZVZlYywgdGlsZXNwYWNlQ2FtZXJhUG9zaXRpb24pO1xuICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUoZGlyLCBkaXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXkodGlsZXNwYWNlQ2FtZXJhUG9zaXRpb24sIGRpcik7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwaXhlbFRvVGlsZVVuaXRzRmFjdG9yID0gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgdHJhbnNmb3JtLnpvb20pICogdHJhbnNmb3JtLl9wcm9qZWN0aW9uU2NhbGVyO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeUdlb21ldHJ5OiB0aGlzLFxuICAgICAgICAgICAgdGlsZXNwYWNlR2VvbWV0cnksXG4gICAgICAgICAgICB0aWxlc3BhY2VSYXlzLFxuICAgICAgICAgICAgYnVmZmVyZWRUaWxlc3BhY2VHZW9tZXRyeTogZ2VvbWV0cnlGb3JUaWxlQ2hlY2ssXG4gICAgICAgICAgICBidWZmZXJlZFRpbGVzcGFjZUJvdW5kczogY2xhbXBCb3VuZHNUb1RpbGVFeHRlbnRzKGdldEJvdW5kcyhnZW9tZXRyeUZvclRpbGVDaGVjaykpLFxuICAgICAgICAgICAgdGlsZSxcbiAgICAgICAgICAgIHRpbGVJRDogdGlsZS50aWxlSUQsXG4gICAgICAgICAgICBwaXhlbFRvVGlsZVVuaXRzRmFjdG9yXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlc2UgbWV0aG9kcyBhZGQgY2FjaGluZyBvbiB0b3Agb2YgdGhlIHRlcnJhaW4gcmF5Y2FzdGluZyBwcm92aWRlZCBieSBgVHJhbnNmb3JtI3BvaW50Q29vcmRpbmF0ZTNkYC5cbiAgICAgKiBUaWxlcyBjb21lIHdpdGggZGlmZmVyZW50IHZhbHVlcyBvZiBwYWRkaW5nLCBob3dldmVyIGl0cyB2ZXJ5IGxpa2VseSB0aGF0IG11bHRpcGxlIHRpbGVzIHNoYXJlIHRoZSBzYW1lIHZhbHVlIG9mIHBhZGRpbmdcbiAgICAgKiBiYXNlZCBvbiB0aGUgc3R5bGUuIEluIHRoYXQgY2FzZSB3ZSB3YW50IHRvIHJldXNlIHRoZSByZXN1bHQgZnJvbSBhIHByZXZpb3VzbHkgY29tcHV0ZWQgdGVycmFpbiByYXljYXN0LlxuICAgICAqL1xuXG4gICAgX2J1ZmZlcmVkU2NyZWVuTWVyY2F0b3IocGFkZGluZzogbnVtYmVyLCB0cmFuc2Zvcm06IFRyYW5zZm9ybSk6IENhY2hlZFBvbHlnb24ge1xuICAgICAgICBjb25zdCBrZXkgPSBjYWNoZUtleShwYWRkaW5nKTtcbiAgICAgICAgaWYgKHRoaXMuX3NjcmVlblJheWNhc3RDYWNoZVtrZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2NyZWVuUmF5Y2FzdENhY2hlW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcG9seTogQ2FjaGVkUG9seWdvbjtcblxuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgICAgICAgICBwb2x5ID0gdGhpcy5fcHJvamVjdEFuZFJlc2FtcGxlKHRoaXMuYnVmZmVyZWRTY3JlZW5HZW9tZXRyeShwYWRkaW5nKSwgdHJhbnNmb3JtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcG9seSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcG9seWdvbjogdGhpcy5idWZmZXJlZFNjcmVlbkdlb21ldHJ5KHBhZGRpbmcpLm1hcCgocCkgPT4gdHJhbnNmb3JtLnBvaW50Q29vcmRpbmF0ZTNEKHApKSxcbiAgICAgICAgICAgICAgICAgICAgdW53cmFwcGVkOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fc2NyZWVuUmF5Y2FzdENhY2hlW2tleV0gPSBwb2x5O1xuICAgICAgICAgICAgcmV0dXJuIHBvbHk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYnVmZmVyZWRDYW1lcmFNZXJjYXRvcihwYWRkaW5nOiBudW1iZXIsIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogQ2FjaGVkUG9seWdvbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHBhZGRpbmcpO1xuICAgICAgICBpZiAodGhpcy5fY2FtZXJhUmF5Y2FzdENhY2hlW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYW1lcmFSYXljYXN0Q2FjaGVba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwb2x5OiBDYWNoZWRQb2x5Z29uO1xuXG4gICAgICAgICAgICBpZiAodHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJykge1xuICAgICAgICAgICAgICAgIHBvbHkgPSB0aGlzLl9wcm9qZWN0QW5kUmVzYW1wbGUodGhpcy5idWZmZXJlZENhbWVyYUdlb21ldHJ5R2xvYmUocGFkZGluZyksIHRyYW5zZm9ybSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBvbHkgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb246IHRoaXMuYnVmZmVyZWRDYW1lcmFHZW9tZXRyeShwYWRkaW5nKS5tYXAoKHApID0+IHRyYW5zZm9ybS5wb2ludENvb3JkaW5hdGUzRChwKSksXG4gICAgICAgICAgICAgICAgICAgIHVud3JhcHBlZDogdHJ1ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2NhbWVyYVJheWNhc3RDYWNoZVtrZXldID0gcG9seTtcbiAgICAgICAgICAgIHJldHVybiBwb2x5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3Byb2plY3RBbmRSZXNhbXBsZShwb2x5Z29uOiBQb2ludFtdLCB0cmFuc2Zvcm06IFRyYW5zZm9ybSk6IENhY2hlZFBvbHlnb24ge1xuICAgICAgICAvLyBIYW5kbGUgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgZWl0aGVyIG5vcnRoIG9yIHNvdXRoIHBvbGUgaXMgaW5zaWRlIHRoZSBxdWVyeSBwb2x5Z29uXG4gICAgICAgIGNvbnN0IHBvbGVQb2x5Z29uOiA/Q2FjaGVkUG9seWdvbiA9IHByb2plY3RQb2x5Z29uQ292ZXJpbmdQb2xlcyhwb2x5Z29uLCB0cmFuc2Zvcm0pO1xuXG4gICAgICAgIGlmIChwb2xlUG9seWdvbikge1xuICAgICAgICAgICAgcmV0dXJuIHBvbGVQb2x5Z29uO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzYW1wbGUgdGhlIHBvbHlnb24gYnkgYWRkaW5nIGludGVybWVkaWF0ZSBwb2ludHMgc28gdGhhdCBzdHJhaWdodCBsaW5lcyBvZiB0aGUgc2hhcGVcbiAgICAgICAgLy8gYXJlIGNvcnJlY3RseSBwcm9qZWN0ZWQgb24gdGhlIHN1cmZhY2Ugb2YgdGhlIGdsb2JlLlxuICAgICAgICBjb25zdCByZXNhbXBsZWQgPSB1bndyYXBRdWVyeVBvbHlnb24ocmVzYW1wbGVQb2x5Z29uKHBvbHlnb24sIHRyYW5zZm9ybSkubWFwKHAgPT4gbmV3IFBvaW50KHdyYXAocC54KSwgcC55KSksIHRyYW5zZm9ybSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBvbHlnb246IHJlc2FtcGxlZC5wb2x5Z29uLm1hcChwID0+IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUocC54LCBwLnkpKSxcbiAgICAgICAgICAgIHVud3JhcHBlZDogcmVzYW1wbGVkLnVud3JhcHBlZFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHBvbHlnb24gaXMgY3Jvc3NpbmcgdGhlIGFudGltZXJpZGlhbiBsaW5lIGFuZCB1bndyYXBzIGl0IGlmIG5lY2Vzc2FyeS5cbi8vIFRoZSByZXN1bHRpbmcgcG9seWdvbiBpcyBjb250aW51b3VzXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwUXVlcnlQb2x5Z29uKHBvbHlnb246IFBvaW50W10sIHRyOiBUcmFuc2Zvcm0pOiB7cG9seWdvbjogUG9pbnRbXSwgdW53cmFwcGVkOiBib29sZWFufSB7XG4gICAgbGV0IHVud3JhcHBlZCA9IGZhbHNlO1xuXG4gICAgLy8gVHJhdmVyc2UgZWRnZXMgb2YgdGhlIHBvbHlnb24gYW5kIHVud3JhcCB2ZXJ0aWNlcyB0aGF0IGFyZSBjcm9zc2luZyB0aGUgYW50aW1lcmlkaWFuLlxuICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgIGxldCBzdGFydEVkZ2UgPSAwO1xuXG4gICAgZm9yIChsZXQgZSA9IDA7IGUgPCBwb2x5Z29uLmxlbmd0aCAtIDE7IGUrKykge1xuICAgICAgICBpZiAocG9seWdvbltlXS54ID4gbWF4WCkge1xuICAgICAgICAgICAgbWF4WCA9IHBvbHlnb25bZV0ueDtcbiAgICAgICAgICAgIHN0YXJ0RWRnZSA9IGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb24ubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGVkZ2UgPSAoc3RhcnRFZGdlICsgaSkgJSAocG9seWdvbi5sZW5ndGggLSAxKTtcbiAgICAgICAgY29uc3QgYSA9IHBvbHlnb25bZWRnZV07XG4gICAgICAgIGNvbnN0IGIgPSBwb2x5Z29uW2VkZ2UgKyAxXTtcblxuICAgICAgICBpZiAoTWF0aC5hYnMoYS54IC0gYi54KSA+IDAuNSkge1xuICAgICAgICAgICAgLy8gQSBzdHJhaWdodCBsaW5lIGRyYXduIG9uIHRoZSBnbG9iZSBjYW4ndCBoYXZlIGxvbmdlciBsZW5ndGggdGhhbiAwLjUgb24gdGhlIHgtYXhpc1xuICAgICAgICAgICAgLy8gd2l0aG91dCBjcm9zc2luZyB0aGUgYW50aW1lcmlkaWFuXG4gICAgICAgICAgICBpZiAoYS54IDwgYi54KSB7XG4gICAgICAgICAgICAgICAgYS54ICs9IDE7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWRnZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCBhbmQgbGFzdCBwb2ludHMgYXJlIGR1cGxpY2F0ZSBmb3IgY2xvc2VkIHBvbHlnb25zXG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb25bcG9seWdvbi5sZW5ndGggLSAxXS54ICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBiLnggKz0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChlZGdlICsgMSA9PT0gcG9seWdvbi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvbHlnb25bMF0ueCArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdW53cmFwcGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNhbWVyYVggPSBtZXJjYXRvclhmcm9tTG5nKHRyLmNlbnRlci5sbmcpO1xuICAgIGlmICh1bndyYXBwZWQgJiYgY2FtZXJhWCA8IE1hdGguYWJzKGNhbWVyYVggLSAxKSkge1xuICAgICAgICBwb2x5Z29uLmZvckVhY2gocCA9PiB7IHAueCAtPSAxOyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBwb2x5Z29uLFxuICAgICAgICB1bndyYXBwZWRcbiAgICB9O1xufVxuXG4vLyBTcGVjaWFsIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBzY2VuYXJpb3Mgd2hlcmUgb25lIG9mIHRoZSBwb2xlcyBpcyBpbnNpZGUgdGhlIHF1ZXJ5IHBvbHlnb24uXG4vLyBGaW5kaW5nIHByb2plY3Rpb24gb2YgdGhlc2Uga2luZCBvZiBwb2x5Z29ucyBpcyBtb3JlIGludm9sdmluZyBhcyBwcm9qZWN0aW5nIGp1c3QgdGhlIGNvcm5lcnMgd2lsbFxuLy8gcHJvZHVjZSBhIGRlZ2VuZXJhdGUgKHNlbGYtaW50ZXJzZWN0aW5nLCBub24tY29udGludW91cywgZXRjLikgcG9seWdvbiBpbiBtZXJjYXRvciBjb29yZGluYXRlc1xuZXhwb3J0IGZ1bmN0aW9uIHByb2plY3RQb2x5Z29uQ292ZXJpbmdQb2xlcyhwb2x5Z29uOiBQb2ludFtdLCB0cjogVHJhbnNmb3JtKTogP0NhY2hlZFBvbHlnb24ge1xuICAgIGNvbnN0IG1hdHJpeCA9IG1hdDQubXVsdGlwbHkoW10sIHRyLnBpeGVsTWF0cml4LCB0ci5nbG9iZU1hdHJpeCk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gbm9ydGggYW5kIHNvdXRoIHBvbGUgY29vcmRpbmF0ZXMgdG8gdGhlIHNjcmVlbiB0byBzZWUgaWYgdGhleSdyZVxuICAgIC8vIGluc2lkZSB0aGUgcXVlcnkgcG9seWdvblxuICAgIGNvbnN0IG5vcnRoUG9sZSA9IFswLCAtR0xPQkVfUkFESVVTLCAwLCAxXTtcbiAgICBjb25zdCBzb3V0aFBvbGUgPSBbMCwgR0xPQkVfUkFESVVTLCAwLCAxXTtcbiAgICBjb25zdCBjZW50ZXIgPSBbMCwgMCwgMCwgMV07XG5cbiAgICB2ZWM0LnRyYW5zZm9ybU1hdDQobm9ydGhQb2xlLCBub3J0aFBvbGUsIG1hdHJpeCk7XG4gICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHNvdXRoUG9sZSwgc291dGhQb2xlLCBtYXRyaXgpO1xuICAgIHZlYzQudHJhbnNmb3JtTWF0NChjZW50ZXIsIGNlbnRlciwgbWF0cml4KTtcblxuICAgIGNvbnN0IHNjcmVlbk5wID0gbmV3IFBvaW50KG5vcnRoUG9sZVswXSAvIG5vcnRoUG9sZVszXSwgbm9ydGhQb2xlWzFdIC8gbm9ydGhQb2xlWzNdKTtcbiAgICBjb25zdCBzY3JlZW5TcCA9IG5ldyBQb2ludChzb3V0aFBvbGVbMF0gLyBzb3V0aFBvbGVbM10sIHNvdXRoUG9sZVsxXSAvIHNvdXRoUG9sZVszXSk7XG4gICAgY29uc3QgY29udGFpbnNOcCA9IHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb24sIHNjcmVlbk5wKSAmJiBub3J0aFBvbGVbM10gPCBjZW50ZXJbM107XG4gICAgY29uc3QgY29udGFpbnNTcCA9IHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb24sIHNjcmVlblNwKSAmJiBzb3V0aFBvbGVbM10gPCBjZW50ZXJbM107XG5cbiAgICBpZiAoIWNvbnRhaW5zTnAgJiYgIWNvbnRhaW5zU3ApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gUHJvamVjdCBjb3JuZXIgcG9pbnRzIG9mIHRoZSBwb2x5Z29uIGFuZCB0cmF2ZXJzZSB0aGUgcmluZyB0byBmaW5kIHRoZSBlZGdlIHRoYXQnc1xuICAgIC8vIGNyb3NzaW5nIHRoZSB6ZXJvIGxvbmdpdHVkZSBib3JkZXIuXG4gICAgY29uc3QgcmVzdWx0ID0gZmluZEVkZ2VDcm9zc2luZ0FudGltZXJpZGlhbihwb2x5Z29uLCB0ciwgY29udGFpbnNOcCA/IC0xIDogMSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBjb25zdHJ1Y3RpbmcgdGhlIG5ldyBwb2x5Z29uIGJ5IHJlc2FtcGxpbmcgZWRnZXMgdW50aWwgdGhlIGNyb3NzaW5nIGVkZ2VcbiAgICBjb25zdCB7aWR4LCB0fSA9IHJlc3VsdDtcbiAgICBsZXQgcGFydEEgPSBpZHggPiAxID8gcmVzYW1wbGVQb2x5Z29uKHBvbHlnb24uc2xpY2UoMCwgaWR4KSwgdHIpIDogW107XG4gICAgbGV0IHBhcnRCID0gaWR4IDwgcG9seWdvbi5sZW5ndGggPyByZXNhbXBsZVBvbHlnb24ocG9seWdvbi5zbGljZShpZHgpLCB0cikgOiBbXTtcblxuICAgIHBhcnRBID0gcGFydEEubWFwKHAgPT4gbmV3IFBvaW50KHdyYXAocC54KSwgcC55KSk7XG4gICAgcGFydEIgPSBwYXJ0Qi5tYXAocCA9PiBuZXcgUG9pbnQod3JhcChwLngpLCBwLnkpKTtcblxuICAgIC8vIFJlc2FtcGxlIGZpcnN0IHNlY3Rpb24gb2YgdGhlIHJpbmcgKHVwIHRvIHRoZSBlZGdlIHRoYXQgY3Jvc3NlcyB0aGUgMC1saW5lKVxuICAgIGNvbnN0IHJlc2FtcGxlZCA9IFsuLi5wYXJ0QV07XG5cbiAgICBpZiAocmVzYW1wbGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXNhbXBsZWQucHVzaChwYXJ0QltwYXJ0Qi5sZW5ndGggLSAxXSk7XG4gICAgfVxuXG4gICAgLy8gRmluZCBsb2NhdGlvbiBvZiB0aGUgY3Jvc3NpbmcgYnkgaW50ZXJwb2xhdGluZyBtZXJjYXRvciBjb29yZGluYXRlcy5cbiAgICAvLyBUaGlzIHdpbGwgcHJvZHVjZSBzbGlnaHRseSBvZmYgcmVzdWx0IGFzIHRoZSBjcm9zc2luZyBlZGdlIGlzIG5vdCBhY3R1YWxseVxuICAgIC8vIGxpbmVhciBvbiB0aGUgZ2xvYmUuXG4gICAgY29uc3QgYSA9IHJlc2FtcGxlZFtyZXNhbXBsZWQubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYiA9IHBhcnRCLmxlbmd0aCA9PT0gMCA/IHBhcnRBWzBdIDogcGFydEJbMF07XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uWSA9IGludGVycG9sYXRlKGEueSwgYi55LCB0KTtcblxuICAgIGxldCBtaWQ7XG5cbiAgICBpZiAoY29udGFpbnNOcCkge1xuICAgICAgICBtaWQgPSBbXG4gICAgICAgICAgICBuZXcgUG9pbnQoMCwgaW50ZXJzZWN0aW9uWSksXG4gICAgICAgICAgICBuZXcgUG9pbnQoMCwgMCksXG4gICAgICAgICAgICBuZXcgUG9pbnQoMSwgMCksXG4gICAgICAgICAgICBuZXcgUG9pbnQoMSwgaW50ZXJzZWN0aW9uWSlcbiAgICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBtaWQgPSBbXG4gICAgICAgICAgICBuZXcgUG9pbnQoMSwgaW50ZXJzZWN0aW9uWSksXG4gICAgICAgICAgICBuZXcgUG9pbnQoMSwgMSksXG4gICAgICAgICAgICBuZXcgUG9pbnQoMCwgMSksXG4gICAgICAgICAgICBuZXcgUG9pbnQoMCwgaW50ZXJzZWN0aW9uWSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICByZXNhbXBsZWQucHVzaCguLi5taWQpO1xuXG4gICAgLy8gUmVzYW1wbGUgdG8gdGhlIHNlY29uZCBzZWN0aW9uIG9mIHRoZSByaW5nXG4gICAgaWYgKHBhcnRCLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXNhbXBsZWQucHVzaChwYXJ0QVswXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzYW1wbGVkLnB1c2goLi4ucGFydEIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHBvbHlnb246IHJlc2FtcGxlZC5tYXAocCA9PiBuZXcgTWVyY2F0b3JDb29yZGluYXRlKHAueCwgcC55KSksXG4gICAgICAgIHVud3JhcHBlZDogZmFsc2VcbiAgICB9O1xufVxuXG5mdW5jdGlvbiByZXNhbXBsZVBvbHlnb24ocG9seWdvbjogUG9pbnRbXSwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBQb2ludFtdIHtcbiAgICAvLyBDaG9vc2UgYSB0b2xlcmFuY2UgdmFsdWUgZm9yIHRoZSByZXNhbXBsaW5nIGxvZ2ljIHRoYXQgcHJvZHVjZXMgc3VmZmljaWVudGx5XG4gICAgLy8gYWNjdXJhdGUgcG9seWdvbnMgd2l0aG91dCBjcmVhdGluZyB0b28gbWFueSBwb2ludHMuIFRoZSB2YWx1ZSAxIC8gMjU2IHdhcyBjaG9zZW5cbiAgICAvLyBiYXNlZCBvbiBlbXBpcmljYWwgdGVzdGluZ1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDEuMCAvIDI1Ni4wO1xuICAgIHJldHVybiByZXNhbXBsZShcbiAgICAgICAgcG9seWdvbixcbiAgICAgICAgcCA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYyA9IHRyYW5zZm9ybS5wb2ludENvb3JkaW5hdGUzRChwKTtcbiAgICAgICAgICAgIHAueCA9IG1jLng7XG4gICAgICAgICAgICBwLnkgPSBtYy55O1xuICAgICAgICB9LFxuICAgICAgICB0b2xlcmFuY2UpO1xufVxuXG5mdW5jdGlvbiB3cmFwKG1lcmNhdG9yWDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbWVyY2F0b3JYIDwgMCA/IDEgKyAobWVyY2F0b3JYICUgMSkgOiBtZXJjYXRvclggJSAxO1xufVxuXG5mdW5jdGlvbiBmaW5kRWRnZUNyb3NzaW5nQW50aW1lcmlkaWFuKHBvbHlnb246IFBvaW50W10sIHRyOiBUcmFuc2Zvcm0sIGRpcmVjdGlvbjogbnVtYmVyKTogP3tpZHg6IG51bWJlciwgdDogbnVtYmVyfSB7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGEgPSB3cmFwKHRyLnBvaW50Q29vcmRpbmF0ZTNEKHBvbHlnb25baSAtIDFdKS54KTtcbiAgICAgICAgY29uc3QgYiA9IHdyYXAodHIucG9pbnRDb29yZGluYXRlM0QocG9seWdvbltpXSkueCk7XG5cbiAgICAgICAgLy8gZGlyZWN0aW9uIDwgMDogbWVyY2F0b3IgY29vcmRpbmF0ZSAwIHdpbGwgYmUgY3Jvc3NlZCBmcm9tIGxlZnRcbiAgICAgICAgLy8gZGlyZWN0aW9uID4gMDogbWVyY2F0b3IgY29vcmRpbmF0ZSAxIHdpbGwgYmUgY3Jvc3NlZCBmcm9tIHJpZ2h0XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPCAwKSB7XG4gICAgICAgICAgICBpZiAoYSA8IGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge2lkeDogaSwgdDogLWEgLyAoYiAtIDEgLSBhKX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYiA8IGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge2lkeDogaSwgdDogKDEgLSBhKSAvIChiICsgMSAtIGEpfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufVxuXG4vL1BhZGRpbmcgaXMgaW4gc2NyZWVuIHBpeGVscyBhbmQgaXMgb25seSB1c2VkIGFzIGEgY29hcnNlIGNoZWNrLCBzbyAyIGRlY2ltYWwgcGxhY2VzIG9mIHByZWNpc2lvbiBzaG91bGQgYmUgZ29vZCBlbm91Z2ggZm9yIGEgY2FjaGUuXG5mdW5jdGlvbiBjYWNoZUtleShwYWRkaW5nOiBudW1iZXIpOiBudW1iZXIgIHtcbiAgICByZXR1cm4gKHBhZGRpbmcgKiAxMDApIHwgMDtcbn1cblxuZXhwb3J0IHR5cGUgVGlsZXNwYWNlUXVlcnlHZW9tZXRyeSA9IHtcbiAgICBxdWVyeUdlb21ldHJ5OiBRdWVyeUdlb21ldHJ5LFxuICAgIHRpbGVzcGFjZUdlb21ldHJ5OiBQb2ludFtdLFxuICAgIHRpbGVzcGFjZVJheXM6IFJheVtdLFxuICAgIGJ1ZmZlcmVkVGlsZXNwYWNlR2VvbWV0cnk6IFBvaW50W10sXG4gICAgYnVmZmVyZWRUaWxlc3BhY2VCb3VuZHM6IHsgbWluOiBQb2ludCwgbWF4OiBQb2ludH0sXG4gICAgdGlsZTogVGlsZSxcbiAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsXG4gICAgcGl4ZWxUb1RpbGVVbml0c0ZhY3RvcjogbnVtYmVyXG59O1xuXG5mdW5jdGlvbiBjbGFtcEJvdW5kc1RvVGlsZUV4dGVudHMoYm91bmRzOiB7bWluOiBQb2ludCwgbWF4OiBQb2ludH0pOiB7bWluOiBQb2ludCwgbWF4OiBQb2ludH0ge1xuICAgIGJvdW5kcy5taW4ueCA9IGNsYW1wKGJvdW5kcy5taW4ueCwgMCwgRVhURU5UKTtcbiAgICBib3VuZHMubWluLnkgPSBjbGFtcChib3VuZHMubWluLnksIDAsIEVYVEVOVCk7XG5cbiAgICBib3VuZHMubWF4LnggPSBjbGFtcChib3VuZHMubWF4LngsIDAsIEVYVEVOVCk7XG4gICAgYm91bmRzLm1heC55ID0gY2xhbXAoYm91bmRzLm1heC55LCAwLCBFWFRFTlQpO1xuICAgIHJldHVybiBib3VuZHM7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3BpY2ssIGV4dGVuZH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHtnZXRKU09OLCBSZXNvdXJjZVR5cGV9IGZyb20gJy4uL3V0aWwvYWpheC5qcyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuXG5pbXBvcnQgdHlwZSB7UmVxdWVzdE1hbmFnZXJ9IGZyb20gJy4uL3V0aWwvbWFwYm94LmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUge1RpbGVKU09OfSBmcm9tICcuLi90eXBlcy90aWxlanNvbi5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9wdGlvbnM6IGFueSwgcmVxdWVzdE1hbmFnZXI6IFJlcXVlc3RNYW5hZ2VyLCBsYW5ndWFnZTogP3N0cmluZywgd29ybGR2aWV3OiA/c3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2s8VGlsZUpTT04+KTogQ2FuY2VsYWJsZSB7XG4gICAgY29uc3QgbG9hZGVkID0gZnVuY3Rpb24oZXJyOiA/RXJyb3IsIHRpbGVKU09OOiA/T2JqZWN0KSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9IGVsc2UgaWYgKHRpbGVKU09OKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHBpY2soXG4gICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgc291cmNlIG9wdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgVGlsZUpTT05cbiAgICAgICAgICAgICAgICBleHRlbmQodGlsZUpTT04sIG9wdGlvbnMpLFxuICAgICAgICAgICAgICAgIFsndGlsZXMnLCAnbWluem9vbScsICdtYXh6b29tJywgJ2F0dHJpYnV0aW9uJywgJ21hcGJveF9sb2dvJywgJ2JvdW5kcycsICdzY2hlbWUnLCAndGlsZVNpemUnLCAnZW5jb2RpbmcnXVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHRpbGVKU09OLnZlY3Rvcl9sYXllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudmVjdG9yTGF5ZXJzID0gdGlsZUpTT04udmVjdG9yX2xheWVycztcbiAgICAgICAgICAgICAgICByZXN1bHQudmVjdG9yTGF5ZXJJZHMgPSByZXN1bHQudmVjdG9yTGF5ZXJzLm1hcCgobGF5ZXIpID0+IHsgcmV0dXJuIGxheWVyLmlkOyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBBIHRpbGVzZXQgc3VwcG9ydHMgbGFuZ3VhZ2UgbG9jYWxpemF0aW9uIGlmIHRoZSBUaWxlSlNPTiBjb250YWluc1xuICAgICAgICAgICAgICogYSBgbGFuZ3VhZ2Vfb3B0aW9uc2Agb2JqZWN0IGluIHRoZSByZXNwb25zZS5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRpbGVKU09OLmxhbmd1YWdlX29wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQubGFuZ3VhZ2VPcHRpb25zID0gdGlsZUpTT04ubGFuZ3VhZ2Vfb3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRpbGVKU09OLmxhbmd1YWdlICYmIHRpbGVKU09OLmxhbmd1YWdlW3RpbGVKU09OLmlkXSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5sYW5ndWFnZSA9IHRpbGVKU09OLmxhbmd1YWdlW3RpbGVKU09OLmlkXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBBIHRpbGVzZXQgc3VwcG9ydHMgZGlmZmVyZW50IHdvcmxkdmlld3MgaWYgdGhlIFRpbGVKU09OIGNvbnRhaW5zXG4gICAgICAgICAgICAgKiBhIGB3b3JsZHZpZXdfb3B0aW9uc2Agb2JqZWN0IGluIHRoZSByZXBzb25zZSBhcyB3ZWxsIGFzIGEgYHdvcmxkdmlld19kZWZhdWx0YCBrZXkuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmICh0aWxlSlNPTi53b3JsZHZpZXdfb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC53b3JsZHZpZXdPcHRpb25zID0gdGlsZUpTT04ud29ybGR2aWV3X29wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aWxlSlNPTi53b3JsZHZpZXcpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQud29ybGR2aWV3ID0gdGlsZUpTT04ud29ybGR2aWV3W3RpbGVKU09OLmlkXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGlsZUpTT04ud29ybGR2aWV3X2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQud29ybGR2aWV3ID0gdGlsZUpTT04ud29ybGR2aWV3X2RlZmF1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdC50aWxlcyA9IHJlcXVlc3RNYW5hZ2VyLmNhbm9uaWNhbGl6ZVRpbGVzZXQocmVzdWx0LCBvcHRpb25zLnVybCk7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLnVybCkge1xuICAgICAgICByZXR1cm4gZ2V0SlNPTihyZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHJlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVNvdXJjZVVSTChvcHRpb25zLnVybCwgbnVsbCwgbGFuZ3VhZ2UsIHdvcmxkdmlldyksIFJlc291cmNlVHlwZS5Tb3VyY2UpLCBsb2FkZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBicm93c2VyLmZyYW1lKCgpID0+IGxvYWRlZChudWxsLCBvcHRpb25zKSk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuLi9nZW8vbG5nX2xhdF9ib3VuZHMuanMnO1xuaW1wb3J0IHttZXJjYXRvclhmcm9tTG5nLCBtZXJjYXRvcllmcm9tTGF0fSBmcm9tICcuLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5cbmltcG9ydCB0eXBlIHtDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5cbmNsYXNzIFRpbGVCb3VuZHMge1xuICAgIGJvdW5kczogTG5nTGF0Qm91bmRzO1xuICAgIG1pbnpvb206IG51bWJlcjtcbiAgICBtYXh6b29tOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcihib3VuZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBtaW56b29tOiA/bnVtYmVyLCBtYXh6b29tOiA/bnVtYmVyKSB7XG4gICAgICAgIHRoaXMuYm91bmRzID0gTG5nTGF0Qm91bmRzLmNvbnZlcnQodGhpcy52YWxpZGF0ZUJvdW5kcyhib3VuZHMpKTtcbiAgICAgICAgdGhpcy5taW56b29tID0gbWluem9vbSB8fCAwO1xuICAgICAgICB0aGlzLm1heHpvb20gPSBtYXh6b29tIHx8IDI0O1xuICAgIH1cblxuICAgIHZhbGlkYXRlQm91bmRzKGJvdW5kczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYm91bmRzIHByb3BlcnR5IGNvbnRhaW5zIHZhbGlkIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGVzXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShib3VuZHMpIHx8IGJvdW5kcy5sZW5ndGggIT09IDQpIHJldHVybiBbLTE4MCwgLTkwLCAxODAsIDkwXTtcbiAgICAgICAgcmV0dXJuIFtNYXRoLm1heCgtMTgwLCBib3VuZHNbMF0pLCBNYXRoLm1heCgtOTAsIGJvdW5kc1sxXSksIE1hdGgubWluKDE4MCwgYm91bmRzWzJdKSwgTWF0aC5taW4oOTAsIGJvdW5kc1szXSldO1xuICAgIH1cblxuICAgIGNvbnRhaW5zKHRpbGVJRDogQ2Fub25pY2FsVGlsZUlEKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHdvcmxkU2l6ZSA9IE1hdGgucG93KDIsIHRpbGVJRC56KTtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSB7XG4gICAgICAgICAgICBtaW5YOiBNYXRoLmZsb29yKG1lcmNhdG9yWGZyb21MbmcodGhpcy5ib3VuZHMuZ2V0V2VzdCgpKSAqIHdvcmxkU2l6ZSksXG4gICAgICAgICAgICBtaW5ZOiBNYXRoLmZsb29yKG1lcmNhdG9yWWZyb21MYXQodGhpcy5ib3VuZHMuZ2V0Tm9ydGgoKSkgKiB3b3JsZFNpemUpLFxuICAgICAgICAgICAgbWF4WDogTWF0aC5jZWlsKG1lcmNhdG9yWGZyb21MbmcodGhpcy5ib3VuZHMuZ2V0RWFzdCgpKSAqIHdvcmxkU2l6ZSksXG4gICAgICAgICAgICBtYXhZOiBNYXRoLmNlaWwobWVyY2F0b3JZZnJvbUxhdCh0aGlzLmJvdW5kcy5nZXRTb3V0aCgpKSAqIHdvcmxkU2l6ZSlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGl0ID0gdGlsZUlELnggPj0gbGV2ZWwubWluWCAmJiB0aWxlSUQueCA8IGxldmVsLm1heFggJiYgdGlsZUlELnkgPj0gbGV2ZWwubWluWSAmJiB0aWxlSUQueSA8IGxldmVsLm1heFk7XG4gICAgICAgIHJldHVybiBoaXQ7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUaWxlQm91bmRzO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcblxuaW1wb3J0IHtleHRlbmQsIHBpY2t9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgbG9hZFRpbGVKU09OIGZyb20gJy4vbG9hZF90aWxlanNvbi5qcyc7XG5pbXBvcnQge3Bvc3RUdXJuc3RpbGVFdmVudH0gZnJvbSAnLi4vdXRpbC9tYXBib3guanMnO1xuaW1wb3J0IFRpbGVCb3VuZHMgZnJvbSAnLi90aWxlX2JvdW5kcy5qcyc7XG5pbXBvcnQge1Jlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQge2NhY2hlRW50cnlQb3NzaWJseUFkZGVkfSBmcm9tICcuLi91dGlsL3RpbGVfcmVxdWVzdF9jYWNoZS5qcyc7XG5pbXBvcnQge0RlZHVwZWRSZXF1ZXN0LCBsb2FkVmVjdG9yVGlsZX0gZnJvbSAnLi92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlLmpzJztcblxuaW1wb3J0IHR5cGUge1NvdXJjZX0gZnJvbSAnLi9zb3VyY2UuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwLmpzJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlLmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUuanMnO1xuaW1wb3J0IHR5cGUge1ZlY3RvclNvdXJjZVNwZWNpZmljYXRpb24sIFByb21vdGVJZFNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgQWN0b3IgZnJvbSAnLi4vdXRpbC9hY3Rvci5qcyc7XG5pbXBvcnQgdHlwZSB7TG9hZFZlY3RvclRpbGVSZXN1bHR9IGZyb20gJy4vdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZS5qcyc7XG5cbi8qKlxuICogQSBzb3VyY2UgY29udGFpbmluZyB2ZWN0b3IgdGlsZXMgaW4gW01hcGJveCBWZWN0b3IgVGlsZSBmb3JtYXRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL3ZlY3Rvci10aWxlcy9yZWZlcmVuY2UvKS5cbiAqIFNlZSB0aGUgW1N0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3NvdXJjZXMvI3ZlY3RvcikgZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAndmVjdG9yJyxcbiAqICAgICB1cmw6ICdtYXBib3g6Ly9tYXBib3gubWFwYm94LXN0cmVldHMtdjgnXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAndmVjdG9yJyxcbiAqICAgICB0aWxlczogWydodHRwczovL2QyNXVhcmh4eXd6bDFqLmNsb3VkZnJvbnQubmV0L3YwLjEve3p9L3t4fS97eX0ubXZ0J10sXG4gKiAgICAgbWluem9vbTogNixcbiAqICAgICBtYXh6b29tOiAxNFxuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKS5zZXRVcmwoXCJtYXBib3g6Ly9tYXBib3gubWFwYm94LXN0cmVldHMtdjhcIik7XG4gKlxuICogQGV4YW1wbGVcbiAqIG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKS5zZXRUaWxlcyhbJ2h0dHBzOi8vZDI1dWFyaHh5d3psMWouY2xvdWRmcm9udC5uZXQvdjAuMS97en0ve3h9L3t5fS5tdnQnXSk7XG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSB2ZWN0b3IgdGlsZSBzb3VyY2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3ZlY3Rvci1zb3VyY2UvKVxuICogQHNlZSBbRXhhbXBsZTogQWRkIGEgdGhpcmQgcGFydHkgdmVjdG9yIHRpbGUgc291cmNlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90aGlyZC1wYXJ0eS8pXG4gKi9cbmNsYXNzIFZlY3RvclRpbGVTb3VyY2UgZXh0ZW5kcyBFdmVudGVkIGltcGxlbWVudHMgU291cmNlIHtcbiAgICB0eXBlOiAndmVjdG9yJztcbiAgICBpZDogc3RyaW5nO1xuICAgIG1pbnpvb206IG51bWJlcjtcbiAgICBtYXh6b29tOiBudW1iZXI7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgc2NoZW1lOiBzdHJpbmc7XG4gICAgdGlsZVNpemU6IG51bWJlcjtcbiAgICBwcm9tb3RlSWQ6ID9Qcm9tb3RlSWRTcGVjaWZpY2F0aW9uO1xuXG4gICAgX29wdGlvbnM6IFZlY3RvclNvdXJjZVNwZWNpZmljYXRpb247XG4gICAgX2NvbGxlY3RSZXNvdXJjZVRpbWluZzogYm9vbGVhbjtcbiAgICBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xuICAgIG1hcDogTWFwO1xuICAgIGJvdW5kczogP1tudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIHRpbGVzOiBBcnJheTxzdHJpbmc+O1xuICAgIHRpbGVCb3VuZHM6IFRpbGVCb3VuZHM7XG4gICAgcmVwYXJzZU92ZXJzY2FsZWQ6IGJvb2xlYW47XG4gICAgaXNUaWxlQ2xpcHBlZDogYm9vbGVhbjtcbiAgICBfdGlsZUpTT05SZXF1ZXN0OiA/Q2FuY2VsYWJsZTtcbiAgICBfbG9hZGVkOiBib29sZWFuO1xuICAgIF90aWxlV29ya2Vyczoge1tzdHJpbmddOiBBY3Rvcn07XG4gICAgX2RlZHVwZWQ6IERlZHVwZWRSZXF1ZXN0O1xuICAgIGxhbmd1YWdlOiA/c3RyaW5nO1xuICAgIGxhbmd1YWdlT3B0aW9uczogP3tbc3RyaW5nXTogc3RyaW5nfTtcbiAgICB3b3JsZHZpZXc6ID9zdHJpbmc7XG4gICAgd29ybGR2aWV3T3B0aW9uczogP3tbc3RyaW5nXTogc3RyaW5nfTtcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFZlY3RvclNvdXJjZVNwZWNpZmljYXRpb24gJiB7Y29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFufSwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG5cbiAgICAgICAgdGhpcy50eXBlID0gJ3ZlY3Rvcic7XG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDIyO1xuICAgICAgICB0aGlzLnNjaGVtZSA9ICd4eXonO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gNTEyO1xuICAgICAgICB0aGlzLnJlcGFyc2VPdmVyc2NhbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc1RpbGVDbGlwcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgZXh0ZW5kKHRoaXMsIHBpY2sob3B0aW9ucywgWyd1cmwnLCAnc2NoZW1lJywgJ3RpbGVTaXplJywgJ3Byb21vdGVJZCddKSk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBleHRlbmQoe3R5cGU6ICd2ZWN0b3InfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nID0gb3B0aW9ucy5jb2xsZWN0UmVzb3VyY2VUaW1pbmc7XG5cbiAgICAgICAgaWYgKHRoaXMudGlsZVNpemUgIT09IDUxMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2ZWN0b3IgdGlsZSBzb3VyY2VzIG11c3QgaGF2ZSBhIHRpbGVTaXplIG9mIDUxMicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgICAgIHRoaXMuX3RpbGVXb3JrZXJzID0ge307XG4gICAgICAgIHRoaXMuX2RlZHVwZWQgPSBuZXcgRGVkdXBlZFJlcXVlc3QoKTtcbiAgICB9XG5cbiAgICBsb2FkKGNhbGxiYWNrPzogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc291cmNlJ30pKTtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmxhbmd1YWdlIHx8IHRoaXMubWFwLl9sYW5ndWFnZTtcbiAgICAgICAgY29uc3Qgd29ybGR2aWV3ID0gdGhpcy53b3JsZHZpZXcgfHwgdGhpcy5tYXAuX3dvcmxkdmlldztcbiAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbG9hZFRpbGVKU09OKHRoaXMuX29wdGlvbnMsIHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlciwgbGFuZ3VhZ2UsIHdvcmxkdmlldywgKGVyciwgdGlsZUpTT04pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZSkgY29uc29sZS53YXJuKGBFbnN1cmUgdGhhdCB5b3VyIHJlcXVlc3RlZCBsYW5ndWFnZSBzdHJpbmcgaXMgYSB2YWxpZCBCQ1AtNDcgY29kZS4gRm91bmQ6ICR7bGFuZ3VhZ2V9YCk7XG4gICAgICAgICAgICAgICAgaWYgKHdvcmxkdmlldyAmJiB3b3JsZHZpZXcubGVuZ3RoICE9PSAyKSBjb25zb2xlLndhcm4oYFJlcXVlc3RlZCB3b3JsZHZpZXcgc3RyaW5ncyBtdXN0IGJlIGEgdmFsaWQgSVNPIGFscGhhLTIgY29kZS4gRm91bmQ6ICR7d29ybGR2aWV3fWApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxlSlNPTikge1xuICAgICAgICAgICAgICAgIGV4dGVuZCh0aGlzLCB0aWxlSlNPTik7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGVKU09OLmJvdW5kcykgdGhpcy50aWxlQm91bmRzID0gbmV3IFRpbGVCb3VuZHModGlsZUpTT04uYm91bmRzLCB0aGlzLm1pbnpvb20sIHRoaXMubWF4em9vbSk7XG4gICAgICAgICAgICAgICAgcG9zdFR1cm5zdGlsZUV2ZW50KHRpbGVKU09OLnRpbGVzLCB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIuX2N1c3RvbUFjY2Vzc1Rva2VuKTtcblxuICAgICAgICAgICAgICAgIC8vIGBjb250ZW50YCBpcyBpbmNsdWRlZCBoZXJlIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBgU3R5bGUjX3VwZGF0ZVNvdXJjZXNgIGlzIGNhbGxlZFxuICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgVGlsZUpTT04gYXJyaXZlcy4gdGhpcyBtYWtlcyBzdXJlIHRoZSB0aWxlcyBuZWVkZWQgYXJlIGxvYWRlZCBvbmNlIFRpbGVKU09OIGFycml2ZXNcbiAgICAgICAgICAgICAgICAvLyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL3B1bGwvNDM0NyNkaXNjdXNzaW9uX3IxMDQ0MTgwODhcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdtZXRhZGF0YSd9KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnY29udGVudCd9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xuICAgIH1cblxuICAgIGhhc1RpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy50aWxlQm91bmRzIHx8IHRoaXMudGlsZUJvdW5kcy5jb250YWlucyh0aWxlSUQuY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgc2V0U291cmNlUHJvcGVydHkoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl90aWxlSlNPTlJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKCk7XG5cbiAgICAgICAgLy8gUmVsb2FkIGN1cnJlbnQgdGlsZXMgYWZ0ZXIgVGlsZUpTT04gaXMgbG9hZGVkXG4gICAgICAgIHRoaXMubG9hZCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLm1hcC5zdHlsZS5fZ2V0U291cmNlQ2FjaGVzKHRoaXMuaWQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2VDYWNoZSBvZiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VDYWNoZS5jbGVhclRpbGVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNvdXJjZSBgdGlsZXNgIHByb3BlcnR5IGFuZCByZS1yZW5kZXJzIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0aWxlcyBBbiBhcnJheSBvZiBvbmUgb3IgbW9yZSB0aWxlIHNvdXJjZSBVUkxzLCBhcyBpbiB0aGUgVGlsZUpTT04gc3BlYy5cbiAgICAgKiBAcmV0dXJucyB7VmVjdG9yVGlsZVNvdXJjZX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5hZGRTb3VyY2UoJ3ZlY3Rvcl9zb3VyY2VfaWQnLCB7XG4gICAgICogICAgIHR5cGU6ICd2ZWN0b3InLFxuICAgICAqICAgICB0aWxlczogWydodHRwczovL3NvbWVfZW5kX3BvaW50Lm5ldC97en0ve3h9L3t5fS5tdnQnXSxcbiAgICAgKiAgICAgbWluem9vbTogNixcbiAgICAgKiAgICAgbWF4em9vbTogMTRcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGNvbnN0IHZlY3RvclRpbGVTb3VyY2UgPSBtYXAuZ2V0U291cmNlKCd2ZWN0b3Jfc291cmNlX2lkJyk7XG4gICAgICpcbiAgICAgKiAvLyBTZXQgdGhlIGVuZHBvaW50IGFzc29jaWF0ZWQgd2l0aCBhIHZlY3RvciB0aWxlIHNvdXJjZS5cbiAgICAgKiB2ZWN0b3JUaWxlU291cmNlLnNldFRpbGVzKFsnaHR0cHM6Ly9hbm90aGVyX2VuZF9wb2ludC5uZXQve3p9L3t4fS97eX0ubXZ0J10pO1xuICAgICAqL1xuICAgIHNldFRpbGVzKHRpbGVzOiBBcnJheTxzdHJpbmc+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuc2V0U291cmNlUHJvcGVydHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy50aWxlcyA9IHRpbGVzO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzb3VyY2UgYHVybGAgcHJvcGVydHkgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgQSBVUkwgdG8gYSBUaWxlSlNPTiByZXNvdXJjZS4gU3VwcG9ydGVkIHByb3RvY29scyBhcmUgYGh0dHA6YCwgYGh0dHBzOmAsIGFuZCBgbWFwYm94Oi8vPFRpbGVzZXQgSUQ+YC5cbiAgICAgKiBAcmV0dXJucyB7VmVjdG9yVGlsZVNvdXJjZX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5hZGRTb3VyY2UoJ3ZlY3Rvcl9zb3VyY2VfaWQnLCB7XG4gICAgICogICAgIHR5cGU6ICd2ZWN0b3InLFxuICAgICAqICAgICB1cmw6ICdtYXBib3g6Ly9tYXBib3gubWFwYm94LXN0cmVldHMtdjcnXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjb25zdCB2ZWN0b3JUaWxlU291cmNlID0gbWFwLmdldFNvdXJjZSgndmVjdG9yX3NvdXJjZV9pZCcpO1xuICAgICAqXG4gICAgICogLy8gVXBkYXRlIHZlY3RvciB0aWxlIHNvdXJjZSB0byBhIG5ldyBVUkwgZW5kcG9pbnRcbiAgICAgKiB2ZWN0b3JUaWxlU291cmNlLnNldFVybChcIm1hcGJveDovL21hcGJveC5tYXBib3gtc3RyZWV0cy12OFwiKTtcbiAgICAgKi9cbiAgICBzZXRVcmwodXJsOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5zZXRTb3VyY2VQcm9wZXJ0eSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVybCA9IHVybDtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMudXJsID0gdXJsO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfc2V0TGFuZ3VhZ2UobGFuZ3VhZ2U/OiA/c3RyaW5nKTogdGhpcyB7XG4gICAgICAgIGlmIChsYW5ndWFnZSA9PT0gdGhpcy5sYW5ndWFnZSkgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgdGhpcy5zZXRTb3VyY2VQcm9wZXJ0eSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9zZXRXb3JsZHZpZXcod29ybGR2aWV3PzogP3N0cmluZyk6IHRoaXMge1xuICAgICAgICBpZiAod29ybGR2aWV3ID09PSB0aGlzLndvcmxkdmlldykgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICh0aGlzLndvcmxkdmlld09wdGlvbnMgJiYgd29ybGR2aWV3ICYmICF0aGlzLndvcmxkdmlld09wdGlvbnNbd29ybGR2aWV3XSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBWZWN0b3IgdGlsZSBzb3VyY2UgXCIke3RoaXMuaWR9XCIgZG9lcyBub3Qgc3VwcG9ydCB3b3JsZHZpZXcgXCIke3dvcmxkdmlld31cIi5gKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTb3VyY2VQcm9wZXJ0eSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndvcmxkdmlldyA9IHdvcmxkdmlldztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl90aWxlSlNPTlJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVKU09OUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogVmVjdG9yU291cmNlU3BlY2lmaWNhdGlvbiB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHRoaXMuX29wdGlvbnMpO1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplVGlsZVVSTCh0aWxlLnRpbGVJRC5jYW5vbmljYWwudXJsKHRoaXMudGlsZXMsIHRoaXMuc2NoZW1lKSk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5UaWxlKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgIHRpbGVJRDogdGlsZS50aWxlSUQsXG4gICAgICAgICAgICB0aWxlWm9vbTogdGlsZS50aWxlWm9vbSxcbiAgICAgICAgICAgIHpvb206IHRpbGUudGlsZUlELm92ZXJzY2FsZWRaLFxuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUgKiB0aWxlLnRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKSxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIHBpeGVsUmF0aW86IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIHNob3dDb2xsaXNpb25Cb3hlczogdGhpcy5tYXAuc2hvd0NvbGxpc2lvbkJveGVzLFxuICAgICAgICAgICAgcHJvbW90ZUlkOiB0aGlzLnByb21vdGVJZCxcbiAgICAgICAgICAgIGlzU3ltYm9sVGlsZTogdGlsZS5pc1N5bWJvbFRpbGVcbiAgICAgICAgfTtcbiAgICAgICAgcGFyYW1zLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nID0gdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nO1xuXG4gICAgICAgIGlmICghdGlsZS5hY3RvciB8fCB0aWxlLnN0YXRlID09PSAnZXhwaXJlZCcpIHtcbiAgICAgICAgICAgIHRpbGUuYWN0b3IgPSB0aGlzLl90aWxlV29ya2Vyc1t1cmxdID0gdGhpcy5fdGlsZVdvcmtlcnNbdXJsXSB8fCB0aGlzLmRpc3BhdGNoZXIuZ2V0QWN0b3IoKTtcblxuICAgICAgICAgICAgLy8gaWYgd29ya2VycyBhcmUgbm90IHJlYWR5IHRvIHJlY2VpdmUgbWVzc2FnZXMgeWV0LCB1c2UgdGhlIGlkbGUgdGltZSB0byBwcmVlbXB0aXZlbHlcbiAgICAgICAgICAgIC8vIGxvYWQgdGlsZXMgb24gdGhlIG1haW4gdGhyZWFkIGFuZCBwYXNzIHRoZSByZXN1bHQgaW5zdGVhZCBvZiByZXF1ZXN0aW5nIGEgd29ya2VyIHRvIGRvIHNvXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzcGF0Y2hlci5yZWFkeSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbCA9IGxvYWRWZWN0b3JUaWxlLmNhbGwoe2RlZHVwZWQ6IHRoaXMuX2RlZHVwZWR9LCBwYXJhbXMsIChlcnI6ID9FcnJvciwgZGF0YTogP0xvYWRWZWN0b3JUaWxlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgfHwgIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUuY2FsbCh0aGlzLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdvcmtlciB3aWxsIHNraXAgdGhlIG5ldHdvcmsgcmVxdWVzdCBpZiB0aGUgZGF0YSBpcyBhbHJlYWR5IHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUNvbnRyb2w6IGRhdGEuY2FjaGVDb250cm9sLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM6IGRhdGEuZXhwaXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdEYXRhOiBkYXRhLnJhd0RhdGEuc2xpY2UoMClcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGlsZS5hY3RvcikgdGlsZS5hY3Rvci5zZW5kKCdsb2FkVGlsZScsIHBhcmFtcywgZG9uZS5iaW5kKHRoaXMpLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGlsZS5yZXF1ZXN0ID0ge2NhbmNlbH07XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGlsZS5yZXF1ZXN0ID0gdGlsZS5hY3Rvci5zZW5kKCdsb2FkVGlsZScsIHBhcmFtcywgZG9uZS5iaW5kKHRoaXMpLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAodGlsZS5zdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgICAgICAvLyBzY2hlZHVsZSB0aWxlIHJlbG9hZGluZyBhZnRlciBpdCBoYXMgYmVlbiBsb2FkZWRcbiAgICAgICAgICAgIHRpbGUucmVsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZS5yZXF1ZXN0ID0gdGlsZS5hY3Rvci5zZW5kKCdyZWxvYWRUaWxlJywgcGFyYW1zLCBkb25lLmJpbmQodGhpcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZG9uZShlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLnJlcXVlc3Q7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0ZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgICAgICAgICBpZiAoZXJyICYmIGVyci5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc291cmNlVGltaW5nKVxuICAgICAgICAgICAgICAgIHRpbGUucmVzb3VyY2VUaW1pbmcgPSBkYXRhLnJlc291cmNlVGltaW5nO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMgJiYgZGF0YSkgdGlsZS5zZXRFeHBpcnlEYXRhKGRhdGEpO1xuICAgICAgICAgICAgdGlsZS5sb2FkVmVjdG9yRGF0YShkYXRhLCB0aGlzLm1hcC5wYWludGVyKTtcblxuICAgICAgICAgICAgY2FjaGVFbnRyeVBvc3NpYmx5QWRkZWQodGhpcy5kaXNwYXRjaGVyKTtcblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLnJlbG9hZENhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkVGlsZSh0aWxlLCB0aWxlLnJlbG9hZENhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICB0aWxlLnJlbG9hZENhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFib3J0VGlsZSh0aWxlOiBUaWxlKSB7XG4gICAgICAgIGlmICh0aWxlLnJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRpbGUucmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLnJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbGUuYWN0b3IpIHtcbiAgICAgICAgICAgIHRpbGUuYWN0b3Iuc2VuZCgnYWJvcnRUaWxlJywge3VpZDogdGlsZS51aWQsIHR5cGU6IHRoaXMudHlwZSwgc291cmNlOiB0aGlzLmlkfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1bmxvYWRUaWxlKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKCk7XG4gICAgICAgIGlmICh0aWxlLmFjdG9yKSB7XG4gICAgICAgICAgICB0aWxlLmFjdG9yLnNlbmQoJ3JlbW92ZVRpbGUnLCB7dWlkOiB0aWxlLnVpZCwgdHlwZTogdGhpcy50eXBlLCBzb3VyY2U6IHRoaXMuaWR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhZnRlclVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5fdGlsZVdvcmtlcnMgPSB7fTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZlY3RvclRpbGVTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2V4dGVuZCwgcGlja30gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHtnZXRJbWFnZSwgUmVzb3VyY2VUeXBlfSBmcm9tICcuLi91dGlsL2FqYXguanMnO1xuaW1wb3J0IHtFdmVudCwgRXJyb3JFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCBsb2FkVGlsZUpTT04gZnJvbSAnLi9sb2FkX3RpbGVqc29uLmpzJztcbmltcG9ydCB7cG9zdFR1cm5zdGlsZUV2ZW50fSBmcm9tICcuLi91dGlsL21hcGJveC5qcyc7XG5pbXBvcnQgVGlsZUJvdW5kcyBmcm9tICcuL3RpbGVfYm91bmRzLmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5cbmltcG9ydCB7Y2FjaGVFbnRyeVBvc3NpYmx5QWRkZWR9IGZyb20gJy4uL3V0aWwvdGlsZV9yZXF1ZXN0X2NhY2hlLmpzJztcblxuaW1wb3J0IHR5cGUge1NvdXJjZX0gZnJvbSAnLi9zb3VyY2UuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwLmpzJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcmVuZGVyL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZS5qcyc7XG5pbXBvcnQgdHlwZSB7VGV4dHVyZUltYWdlfSBmcm9tICcuLi9yZW5kZXIvdGV4dHVyZS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgUmFzdGVyU291cmNlU3BlY2lmaWNhdGlvbixcbiAgICBSYXN0ZXJERU1Tb3VyY2VTcGVjaWZpY2F0aW9uXG59IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuXG5jbGFzcyBSYXN0ZXJUaWxlU291cmNlIGV4dGVuZHMgRXZlbnRlZCBpbXBsZW1lbnRzIFNvdXJjZSB7XG4gICAgdHlwZTogJ3Jhc3RlcicgfCAncmFzdGVyLWRlbSc7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtaW56b29tOiBudW1iZXI7XG4gICAgbWF4em9vbTogbnVtYmVyO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHNjaGVtZTogc3RyaW5nO1xuICAgIHRpbGVTaXplOiBudW1iZXI7XG5cbiAgICBib3VuZHM6ID9bbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICB0aWxlQm91bmRzOiBUaWxlQm91bmRzO1xuICAgIHJvdW5kWm9vbTogYm9vbGVhbjtcbiAgICBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xuICAgIG1hcDogTWFwO1xuICAgIHRpbGVzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgX2xvYWRlZDogYm9vbGVhbjtcbiAgICBfb3B0aW9uczogUmFzdGVyU291cmNlU3BlY2lmaWNhdGlvbiB8IFJhc3RlckRFTVNvdXJjZVNwZWNpZmljYXRpb247XG4gICAgX3RpbGVKU09OUmVxdWVzdDogP0NhbmNlbGFibGU7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBvcHRpb25zOiBSYXN0ZXJTb3VyY2VTcGVjaWZpY2F0aW9uIHwgUmFzdGVyREVNU291cmNlU3BlY2lmaWNhdGlvbiwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG4gICAgICAgIHRoaXMuc2V0RXZlbnRlZFBhcmVudChldmVudGVkUGFyZW50KTtcblxuICAgICAgICB0aGlzLnR5cGUgPSAncmFzdGVyJztcbiAgICAgICAgdGhpcy5taW56b29tID0gMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMjI7XG4gICAgICAgIHRoaXMucm91bmRab29tID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zY2hlbWUgPSAneHl6JztcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IDUxMjtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IGV4dGVuZCh7dHlwZTogJ3Jhc3Rlcid9LCBvcHRpb25zKTtcbiAgICAgICAgZXh0ZW5kKHRoaXMsIHBpY2sob3B0aW9ucywgWyd1cmwnLCAnc2NoZW1lJywgJ3RpbGVTaXplJ10pKTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSkpO1xuICAgICAgICB0aGlzLl90aWxlSlNPTlJlcXVlc3QgPSBsb2FkVGlsZUpTT04odGhpcy5fb3B0aW9ucywgdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLCBudWxsLCBudWxsLCAoZXJyLCB0aWxlSlNPTikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxlSlNPTikge1xuICAgICAgICAgICAgICAgIGV4dGVuZCh0aGlzLCB0aWxlSlNPTik7XG4gICAgICAgICAgICAgICAgaWYgKHRpbGVKU09OLmJvdW5kcykgdGhpcy50aWxlQm91bmRzID0gbmV3IFRpbGVCb3VuZHModGlsZUpTT04uYm91bmRzLCB0aGlzLm1pbnpvb20sIHRoaXMubWF4em9vbSk7XG5cbiAgICAgICAgICAgICAgICBwb3N0VHVybnN0aWxlRXZlbnQodGlsZUpTT04udGlsZXMpO1xuXG4gICAgICAgICAgICAgICAgLy8gYGNvbnRlbnRgIGlzIGluY2x1ZGVkIGhlcmUgdG8gcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGBTdHlsZSNfdXBkYXRlU291cmNlc2AgaXMgY2FsbGVkXG4gICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBUaWxlSlNPTiBhcnJpdmVzLiB0aGlzIG1ha2VzIHN1cmUgdGhlIHRpbGVzIG5lZWRlZCBhcmUgbG9hZGVkIG9uY2UgVGlsZUpTT04gYXJyaXZlc1xuICAgICAgICAgICAgICAgIC8vIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvcHVsbC80MzQ3I2Rpc2N1c3Npb25fcjEwNDQxODA4OFxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ21ldGFkYXRhJ30pKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdjb250ZW50J30pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RpbGVKU09OUmVxdWVzdCkge1xuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fdGlsZUpTT05SZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpOiBSYXN0ZXJTb3VyY2VTcGVjaWZpY2F0aW9uIHwgUmFzdGVyREVNU291cmNlU3BlY2lmaWNhdGlvbiB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIHRoaXMuX29wdGlvbnMpO1xuICAgIH1cblxuICAgIGhhc1RpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy50aWxlQm91bmRzIHx8IHRoaXMudGlsZUJvdW5kcy5jb250YWlucyh0aWxlSUQuY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgY29uc3QgdXNlMnggPSBicm93c2VyLmRldmljZVBpeGVsUmF0aW8gPj0gMjtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLm5vcm1hbGl6ZVRpbGVVUkwodGlsZS50aWxlSUQuY2Fub25pY2FsLnVybCh0aGlzLnRpbGVzLCB0aGlzLnNjaGVtZSksIHVzZTJ4LCB0aGlzLnRpbGVTaXplKTtcbiAgICAgICAgdGlsZS5yZXF1ZXN0ID0gZ2V0SW1hZ2UodGhpcy5tYXAuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuVGlsZSksIChlcnJvciwgZGF0YSwgY2FjaGVDb250cm9sLCBleHBpcmVzKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuXG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICd1bmxvYWRlZCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZGF0YSkgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMpIHRpbGUuc2V0RXhwaXJ5RGF0YSh7Y2FjaGVDb250cm9sLCBleHBpcmVzfSk7XG4gICAgICAgICAgICB0aWxlLnNldFRleHR1cmUoZGF0YSwgdGhpcy5tYXAucGFpbnRlcik7XG4gICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG5cbiAgICAgICAgICAgIGNhY2hlRW50cnlQb3NzaWJseUFkZGVkKHRoaXMuZGlzcGF0Y2hlcik7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGxvYWRUaWxlRGF0YSh0aWxlOiBUaWxlLCBkYXRhOiBUZXh0dXJlSW1hZ2UsIHBhaW50ZXI6IFBhaW50ZXIpIHtcbiAgICAgICAgdGlsZS5zZXRUZXh0dXJlKGRhdGEsIHBhaW50ZXIpO1xuICAgIH1cblxuICAgIHN0YXRpYyB1bmxvYWRUaWxlRGF0YSh0aWxlOiBUaWxlLCBwYWludGVyOiBQYWludGVyKSB7XG4gICAgICAgIGlmICh0aWxlLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHBhaW50ZXIuc2F2ZVRpbGVUZXh0dXJlKHRpbGUudGV4dHVyZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYm9ydFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KSB7XG4gICAgICAgIGlmICh0aWxlLnJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRpbGUucmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aWxlLnJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICB1bmxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICBpZiAodGlsZS50ZXh0dXJlKSB0aGlzLm1hcC5wYWludGVyLnNhdmVUaWxlVGV4dHVyZSh0aWxlLnRleHR1cmUpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3RlclRpbGVTb3VyY2U7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuL3dpbmRvdy5qcyc7XG5cbmxldCBzdXBwb3J0c09mZnNjcmVlbkNhbnZhczogP2Jvb2xlYW47XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoc3VwcG9ydHNPZmZzY3JlZW5DYW52YXMgPT0gbnVsbCkge1xuICAgICAgICBzdXBwb3J0c09mZnNjcmVlbkNhbnZhcyA9IHdpbmRvdy5PZmZzY3JlZW5DYW52YXMgJiZcbiAgICAgICAgICAgIG5ldyB3aW5kb3cuT2Zmc2NyZWVuQ2FudmFzKDEsIDEpLmdldENvbnRleHQoJzJkJykgJiZcbiAgICAgICAgICAgIHR5cGVvZiB3aW5kb3cuY3JlYXRlSW1hZ2VCaXRtYXAgPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cHBvcnRzT2Zmc2NyZWVuQ2FudmFzO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtnZXRJbWFnZSwgUmVzb3VyY2VUeXBlfSBmcm9tICcuLi91dGlsL2FqYXguanMnO1xuaW1wb3J0IHtleHRlbmQsIHByZXZQb3dlck9mVHdvfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cuanMnO1xuaW1wb3J0IG9mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCBmcm9tICcuLi91dGlsL29mZnNjcmVlbl9jYW52YXNfc3VwcG9ydGVkLmpzJztcbmltcG9ydCB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkLmpzJztcbmltcG9ydCBSYXN0ZXJUaWxlU291cmNlIGZyb20gJy4vcmFzdGVyX3RpbGVfc291cmNlLmpzJztcbi8vIGVuc3VyZSBERU1EYXRhIGlzIHJlZ2lzdGVyZWQgZm9yIHdvcmtlciB0cmFuc2ZlciBvbiBtYWluIHRocmVhZDpcbmltcG9ydCAnLi4vZGF0YS9kZW1fZGF0YS5qcyc7XG5cbmltcG9ydCB0eXBlIHtTb3VyY2V9IGZyb20gJy4vc291cmNlLmpzJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlLmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUge1Jhc3RlckRFTVNvdXJjZVNwZWNpZmljYXRpb259IGZyb20gJy4uL3N0eWxlLXNwZWMvdHlwZXMuanMnO1xuXG5jbGFzcyBSYXN0ZXJERU1UaWxlU291cmNlIGV4dGVuZHMgUmFzdGVyVGlsZVNvdXJjZSBpbXBsZW1lbnRzIFNvdXJjZSB7XG4gICAgZW5jb2Rpbmc6IFwibWFwYm94XCIgfCBcInRlcnJhcml1bVwiO1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZywgb3B0aW9uczogUmFzdGVyREVNU291cmNlU3BlY2lmaWNhdGlvbiwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgICAgICBzdXBlcihpZCwgb3B0aW9ucywgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdyYXN0ZXItZGVtJztcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMjI7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBleHRlbmQoe3R5cGU6ICdyYXN0ZXItZGVtJ30sIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZyB8fCBcIm1hcGJveFwiO1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplVGlsZVVSTCh0aWxlLnRpbGVJRC5jYW5vbmljYWwudXJsKHRoaXMudGlsZXMsIHRoaXMuc2NoZW1lKSwgZmFsc2UsIHRoaXMudGlsZVNpemUpO1xuICAgICAgICB0aWxlLnJlcXVlc3QgPSBnZXRJbWFnZSh0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5UaWxlKSwgaW1hZ2VMb2FkZWQuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgZnVuY3Rpb24gaW1hZ2VMb2FkZWQoZXJyLCBpbWcsIGNhY2hlQ29udHJvbCwgZXhwaXJlcykge1xuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ3VubG9hZGVkJztcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbWcpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAuX3JlZnJlc2hFeHBpcmVkVGlsZXMpIHRpbGUuc2V0RXhwaXJ5RGF0YSh7Y2FjaGVDb250cm9sLCBleHBpcmVzfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmZXIgPSB3aW5kb3cuSW1hZ2VCaXRtYXAgJiYgaW1nIGluc3RhbmNlb2Ygd2luZG93LkltYWdlQml0bWFwICYmIG9mZnNjcmVlbkNhbnZhc1N1cHBvcnRlZCgpO1xuICAgICAgICAgICAgICAgIC8vIERFTURhdGEgdXNlcyAxcHggcGFkZGluZy4gSGFuZGxlIGNhc2VzIHdpdGggaW1hZ2UgYnVmZmVyIG9mIDEgYW5kIDIgcHhzLCB0aGUgcmVzdCBhc3N1bWUgZGVmYXVsdCBidWZmZXIgMFxuICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGtlZXAgdGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIHdvcmtpbmcgKG5vIHZhbGlkYXRpb24gYWdhaW5zdCB0aWxlU2l6ZSkuXG4gICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gKGltZy53aWR0aCAtIHByZXZQb3dlck9mVHdvKGltZy53aWR0aCkpIC8gMjtcbiAgICAgICAgICAgICAgICAvLyBwYWRkaW5nIGlzIHVzZWQgaW4gZ2V0SW1hZ2VEYXRhLiBBcyBERU1EYXRhIGhhcyAxcHggcGFkZGluZywgaWYgREVNIHRpbGUgYnVmZmVyIGlzIDJweCwgZGlzY2FyZCBvdXRlcm1vc3QgcGl4ZWxzLlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSAxIC0gYnVmZmVyO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvcmRlclJlYWR5ID0gcGFkZGluZyA8IDE7XG4gICAgICAgICAgICAgICAgaWYgKCFib3JkZXJSZWFkeSAmJiAhdGlsZS5uZWlnaGJvcmluZ1RpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubmVpZ2hib3JpbmdUaWxlcyA9IHRoaXMuX2dldE5laWdoYm9yaW5nVGlsZXModGlsZS50aWxlSUQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByYXdJbWFnZURhdGEgPSB0cmFuc2ZlciA/IGltZyA6IGJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGltZywgcGFkZGluZyk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICB1aWQ6IHRpbGUudWlkLFxuICAgICAgICAgICAgICAgICAgICBjb29yZDogdGlsZS50aWxlSUQsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgcmF3SW1hZ2VEYXRhLFxuICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogdGhpcy5lbmNvZGluZyxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUuYWN0b3IgfHwgdGlsZS5zdGF0ZSA9PT0gJ2V4cGlyZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUuYWN0b3IgPSB0aGlzLmRpc3BhdGNoZXIuZ2V0QWN0b3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5hY3Rvci5zZW5kKCdsb2FkREVNVGlsZScsIHBhcmFtcywgZG9uZS5iaW5kKHRoaXMpLCB1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGRvbmUoZXJyLCBkZW0pIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkZW0pIHtcbiAgICAgICAgICAgICAgICB0aWxlLmRlbSA9IGRlbTtcbiAgICAgICAgICAgICAgICB0aWxlLmRlbS5vbkRlc2VyaWFsaXplKCk7XG4gICAgICAgICAgICAgICAgdGlsZS5uZWVkc0hpbGxzaGFkZVByZXBhcmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRpbGUubmVlZHNERU1UZXh0dXJlVXBsb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZ2V0TmVpZ2hib3JpbmdUaWxlcyh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpOiB7W251bWJlcl06IHtiYWNrZmlsbGVkOiBib29sZWFufX0ge1xuICAgICAgICBjb25zdCBjYW5vbmljYWwgPSB0aWxlSUQuY2Fub25pY2FsO1xuICAgICAgICBjb25zdCBkaW0gPSBNYXRoLnBvdygyLCBjYW5vbmljYWwueik7XG5cbiAgICAgICAgY29uc3QgcHggPSAoY2Fub25pY2FsLnggLSAxICsgZGltKSAlIGRpbTtcbiAgICAgICAgY29uc3QgcHh3ID0gY2Fub25pY2FsLnggPT09IDAgPyB0aWxlSUQud3JhcCAtIDEgOiB0aWxlSUQud3JhcDtcbiAgICAgICAgY29uc3QgbnggPSAoY2Fub25pY2FsLnggKyAxICsgZGltKSAlIGRpbTtcbiAgICAgICAgY29uc3Qgbnh3ID0gY2Fub25pY2FsLnggKyAxID09PSBkaW0gPyB0aWxlSUQud3JhcCArIDEgOiB0aWxlSUQud3JhcDtcblxuICAgICAgICBjb25zdCBuZWlnaGJvcmluZ1RpbGVzID0ge307XG4gICAgICAgIC8vIGFkZCBhZGphY2VudCB0aWxlc1xuICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgcHh3LCBjYW5vbmljYWwueiwgcHgsIGNhbm9uaWNhbC55KS5rZXldID0ge2JhY2tmaWxsZWQ6IGZhbHNlfTtcbiAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIG54dywgY2Fub25pY2FsLnosIG54LCBjYW5vbmljYWwueSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG5cbiAgICAgICAgLy8gQWRkIHVwcGVyIG5laWdoYm9yaW5nVGlsZXNcbiAgICAgICAgaWYgKGNhbm9uaWNhbC55ID4gMCkge1xuICAgICAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIHB4dywgY2Fub25pY2FsLnosIHB4LCBjYW5vbmljYWwueSAtIDEpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xuICAgICAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIHRpbGVJRC53cmFwLCBjYW5vbmljYWwueiwgY2Fub25pY2FsLngsIGNhbm9uaWNhbC55IC0gMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgbnh3LCBjYW5vbmljYWwueiwgbngsIGNhbm9uaWNhbC55IC0gMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIGxvd2VyIG5laWdoYm9yaW5nVGlsZXNcbiAgICAgICAgaWYgKGNhbm9uaWNhbC55ICsgMSA8IGRpbSkge1xuICAgICAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIHB4dywgY2Fub25pY2FsLnosIHB4LCBjYW5vbmljYWwueSArIDEpLmtleV0gPSB7YmFja2ZpbGxlZDogZmFsc2V9O1xuICAgICAgICAgICAgbmVpZ2hib3JpbmdUaWxlc1tuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlSUQub3ZlcnNjYWxlZFosIHRpbGVJRC53cmFwLCBjYW5vbmljYWwueiwgY2Fub25pY2FsLngsIGNhbm9uaWNhbC55ICsgMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgICAgICBuZWlnaGJvcmluZ1RpbGVzW25ldyBPdmVyc2NhbGVkVGlsZUlEKHRpbGVJRC5vdmVyc2NhbGVkWiwgbnh3LCBjYW5vbmljYWwueiwgbngsIGNhbm9uaWNhbC55ICsgMSkua2V5XSA9IHtiYWNrZmlsbGVkOiBmYWxzZX07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmVpZ2hib3JpbmdUaWxlcztcbiAgICB9XG5cbiAgICB1bmxvYWRUaWxlKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUuZGVtVGV4dHVyZSkgdGhpcy5tYXAucGFpbnRlci5zYXZlVGlsZVRleHR1cmUodGlsZS5kZW1UZXh0dXJlKTtcbiAgICAgICAgaWYgKHRpbGUuZmJvKSB7XG4gICAgICAgICAgICB0aWxlLmZiby5kZXN0cm95KCk7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5mYm87XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbGUuZGVtKSBkZWxldGUgdGlsZS5kZW07XG4gICAgICAgIGRlbGV0ZSB0aWxlLm5laWdoYm9yaW5nVGlsZXM7XG5cbiAgICAgICAgdGlsZS5zdGF0ZSA9ICd1bmxvYWRlZCc7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFJhc3RlckRFTVRpbGVTb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0V2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuXG5pbXBvcnQge2V4dGVuZH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQuanMnO1xuaW1wb3J0IHtSZXNvdXJjZVR5cGV9IGZyb20gJy4uL3V0aWwvYWpheC5qcyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuXG5pbXBvcnQgdHlwZSB7U291cmNlfSBmcm9tICcuL3NvdXJjZS5qcyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwLmpzJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlLmpzJztcbmltcG9ydCB0eXBlIEFjdG9yIGZyb20gJy4uL3V0aWwvYWN0b3IuanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgdHlwZSB7R2VvSlNPTldvcmtlck9wdGlvbnN9IGZyb20gJy4vZ2VvanNvbl93b3JrZXJfc291cmNlLmpzJztcbmltcG9ydCB0eXBlIHtHZW9KU09OLCBHZW9KU09ORmVhdHVyZX0gZnJvbSAnQG1hcGJveC9nZW9qc29uLXR5cGVzJztcbmltcG9ydCB0eXBlIHtHZW9KU09OU291cmNlU3BlY2lmaWNhdGlvbiwgUHJvbW90ZUlkU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZS5qcyc7XG5cbi8qKlxuICogQSBzb3VyY2UgY29udGFpbmluZyBHZW9KU09OLlxuICogU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy1nZW9qc29uKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBtYXAuYWRkU291cmNlKCdzb21lIGlkJywge1xuICogICAgIHR5cGU6ICdnZW9qc29uJyxcbiAqICAgICBkYXRhOiAnaHR0cHM6Ly9kMmFkNmI0dXI3eXZwcS5jbG91ZGZyb250Lm5ldC9uYXR1cmFsZWFydGgtMy4zLjAvbmVfMTBtX3BvcnRzLmdlb2pzb24nXG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAnZ2VvanNvbicsXG4gKiAgICAgZGF0YToge1xuICogICAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICogICAgICAgICBcImZlYXR1cmVzXCI6IFt7XG4gKiAgICAgICAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXG4gKiAgICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge30sXG4gKiAgICAgICAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICAgICAgICAgIFwiY29vcmRpbmF0ZXNcIjogW1xuICogICAgICAgICAgICAgICAgICAgICAtNzYuNTMwNjMyOTcyNzE3MjksXG4gKiAgICAgICAgICAgICAgICAgICAgIDM5LjE4MTc0MDc3OTk0MTA4XG4gKiAgICAgICAgICAgICAgICAgXVxuICogICAgICAgICAgICAgfVxuICogICAgICAgICB9XVxuICogICAgIH1cbiAqIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBtYXAuZ2V0U291cmNlKCdzb21lIGlkJykuc2V0RGF0YSh7XG4gKiAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAqICAgICBcImZlYXR1cmVzXCI6IFt7XG4gKiAgICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcIm5hbWVcIjogXCJOdWxsIElzbGFuZFwifSxcbiAqICAgICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gKiAgICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbIDAsIDAgXVxuICogICAgICAgICB9XG4gKiAgICAgfV1cbiAqIH0pO1xuICogQHNlZSBbRXhhbXBsZTogRHJhdyBHZW9KU09OIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLW1hcmtlcnMvKVxuICogQHNlZSBbRXhhbXBsZTogQWRkIGEgR2VvSlNPTiBsaW5lXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dlb2pzb24tbGluZS8pXG4gKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBoZWF0bWFwIGZyb20gcG9pbnRzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2hlYXRtYXAvKVxuICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGFuZCBzdHlsZSBjbHVzdGVyc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jbHVzdGVyLylcbiAqL1xuY2xhc3MgR2VvSlNPTlNvdXJjZSBleHRlbmRzIEV2ZW50ZWQgaW1wbGVtZW50cyBTb3VyY2Uge1xuICAgIHR5cGU6ICdnZW9qc29uJztcbiAgICBpZDogc3RyaW5nO1xuICAgIG1pbnpvb206IG51bWJlcjtcbiAgICBtYXh6b29tOiBudW1iZXI7XG4gICAgdGlsZVNpemU6IG51bWJlcjtcbiAgICBhdHRyaWJ1dGlvbjogc3RyaW5nO1xuICAgIHByb21vdGVJZDogP1Byb21vdGVJZFNwZWNpZmljYXRpb247XG5cbiAgICBpc1RpbGVDbGlwcGVkOiBib29sZWFuO1xuICAgIHJlcGFyc2VPdmVyc2NhbGVkOiBib29sZWFuO1xuICAgIF9kYXRhOiBHZW9KU09OIHwgc3RyaW5nO1xuICAgIF9vcHRpb25zOiBHZW9KU09OU291cmNlU3BlY2lmaWNhdGlvbjtcbiAgICB3b3JrZXJPcHRpb25zOiBHZW9KU09OV29ya2VyT3B0aW9ucztcbiAgICBtYXA6IE1hcDtcbiAgICBhY3RvcjogQWN0b3I7XG4gICAgX2xvYWRlZDogYm9vbGVhbjtcbiAgICBfY29hbGVzY2U6ID9ib29sZWFuO1xuICAgIF9tZXRhZGF0YUZpcmVkOiA/Ym9vbGVhbjtcbiAgICBfY29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFuO1xuICAgIF9wZW5kaW5nTG9hZDogP0NhbmNlbGFibGU7XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IEdlb0pTT05Tb3VyY2VTcGVjaWZpY2F0aW9uICYge3dvcmtlck9wdGlvbnM/OiBHZW9KU09OV29ya2VyT3B0aW9ucywgY29sbGVjdFJlc291cmNlVGltaW5nOiBib29sZWFufSwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMuaWQgPSBpZDtcblxuICAgICAgICAvLyBgdHlwZWAgaXMgYSBwcm9wZXJ0eSByYXRoZXIgdGhhbiBhIGNvbnN0YW50IHRvIG1ha2UgaXQgZWFzeSBmb3IgM3JkXG4gICAgICAgIC8vIHBhcnRpZXMgdG8gdXNlIEdlb0pTT05Tb3VyY2UgdG8gYnVpbGQgdGhlaXIgb3duIHNvdXJjZSB0eXBlcy5cbiAgICAgICAgdGhpcy50eXBlID0gJ2dlb2pzb24nO1xuXG4gICAgICAgIHRoaXMubWluem9vbSA9IDA7XG4gICAgICAgIHRoaXMubWF4em9vbSA9IDE4O1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gNTEyO1xuICAgICAgICB0aGlzLmlzVGlsZUNsaXBwZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlcGFyc2VPdmVyc2NhbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5hY3RvciA9IGRpc3BhdGNoZXIuZ2V0QWN0b3IoKTtcbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgICAgIHRoaXMuX2RhdGEgPSAob3B0aW9ucy5kYXRhOiBhbnkpO1xuICAgICAgICB0aGlzLl9vcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcgPSBvcHRpb25zLmNvbGxlY3RSZXNvdXJjZVRpbWluZztcblxuICAgICAgICBpZiAob3B0aW9ucy5tYXh6b29tICE9PSB1bmRlZmluZWQpIHRoaXMubWF4em9vbSA9IG9wdGlvbnMubWF4em9vbTtcbiAgICAgICAgaWYgKG9wdGlvbnMudHlwZSkgdGhpcy50eXBlID0gb3B0aW9ucy50eXBlO1xuICAgICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGlvbikgdGhpcy5hdHRyaWJ1dGlvbiA9IG9wdGlvbnMuYXR0cmlidXRpb247XG4gICAgICAgIHRoaXMucHJvbW90ZUlkID0gb3B0aW9ucy5wcm9tb3RlSWQ7XG5cbiAgICAgICAgY29uc3Qgc2NhbGUgPSBFWFRFTlQgLyB0aGlzLnRpbGVTaXplO1xuXG4gICAgICAgIC8vIHNlbnQgdG8gdGhlIHdvcmtlciwgYWxvbmcgd2l0aCBgdXJsOiAuLi5gIG9yIGBkYXRhOiBsaXRlcmFsIGdlb2pzb25gLFxuICAgICAgICAvLyBzbyB0aGF0IGl0IGNhbiBsb2FkL3BhcnNlL2luZGV4IHRoZSBnZW9qc29uIGRhdGFcbiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYG9wdGlvbnMud29ya2VyT3B0aW9uc2AgaGVscHMgdG8gbWFrZSBpdCBlYXN5IGZvclxuICAgICAgICAvLyB0aGlyZC1wYXJ0eSBzb3VyY2VzIHRvIGhhY2svcmV1c2UgR2VvSlNPTlNvdXJjZS5cbiAgICAgICAgdGhpcy53b3JrZXJPcHRpb25zID0gZXh0ZW5kKHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIGNsdXN0ZXI6IG9wdGlvbnMuY2x1c3RlciB8fCBmYWxzZSxcbiAgICAgICAgICAgIGdlb2pzb25WdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBidWZmZXI6IChvcHRpb25zLmJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5idWZmZXIgOiAxMjgpICogc2NhbGUsXG4gICAgICAgICAgICAgICAgdG9sZXJhbmNlOiAob3B0aW9ucy50b2xlcmFuY2UgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMudG9sZXJhbmNlIDogMC4zNzUpICogc2NhbGUsXG4gICAgICAgICAgICAgICAgZXh0ZW50OiBFWFRFTlQsXG4gICAgICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgICAgICAgIGxpbmVNZXRyaWNzOiBvcHRpb25zLmxpbmVNZXRyaWNzIHx8IGZhbHNlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlSWQ6IG9wdGlvbnMuZ2VuZXJhdGVJZCB8fCBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1cGVyY2x1c3Rlck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBtYXhab29tOiBvcHRpb25zLmNsdXN0ZXJNYXhab29tICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsdXN0ZXJNYXhab29tIDogdGhpcy5tYXh6b29tIC0gMSxcbiAgICAgICAgICAgICAgICBtaW5Qb2ludHM6IE1hdGgubWF4KDIsIG9wdGlvbnMuY2x1c3Rlck1pblBvaW50cyB8fCAyKSxcbiAgICAgICAgICAgICAgICBleHRlbnQ6IEVYVEVOVCxcbiAgICAgICAgICAgICAgICByYWRpdXM6IChvcHRpb25zLmNsdXN0ZXJSYWRpdXMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2x1c3RlclJhZGl1cyA6IDUwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIGxvZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVJZDogb3B0aW9ucy5nZW5lcmF0ZUlkIHx8IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2x1c3RlclByb3BlcnRpZXM6IG9wdGlvbnMuY2x1c3RlclByb3BlcnRpZXMsXG4gICAgICAgICAgICBmaWx0ZXI6IG9wdGlvbnMuZmlsdGVyXG4gICAgICAgIH0sIG9wdGlvbnMud29ya2VyT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuc2V0RGF0YSh0aGlzLl9kYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBHZW9KU09OIGRhdGEgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgc3RyaW5nfSBkYXRhIEEgR2VvSlNPTiBkYXRhIG9iamVjdCBvciBhIFVSTCB0byBvbmUuIFRoZSBsYXR0ZXIgaXMgcHJlZmVyYWJsZSBpbiB0aGUgY2FzZSBvZiBsYXJnZSBHZW9KU09OIGZpbGVzLlxuICAgICAqIEByZXR1cm5zIHtHZW9KU09OU291cmNlfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmFkZFNvdXJjZSgnc291cmNlX2lkJywge1xuICAgICAqICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICogICAgIGRhdGE6IHtcbiAgICAgKiAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICogICAgICAgICBmZWF0dXJlczogW11cbiAgICAgKiAgICAgfVxuICAgICAqIH0pO1xuICAgICAqIGNvbnN0IGdlb2pzb25Tb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdzb3VyY2VfaWQnKTtcbiAgICAgKiAvLyBVcGRhdGUgdGhlIGRhdGEgYWZ0ZXIgdGhlIEdlb0pTT04gc291cmNlIHdhcyBjcmVhdGVkXG4gICAgICogZ2VvanNvblNvdXJjZS5zZXREYXRhKHtcbiAgICAgKiAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAgICAgKiAgICAgXCJmZWF0dXJlc1wiOiBbe1xuICAgICAqICAgICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZVwiLFxuICAgICAqICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcIm5hbWVcIjogXCJOdWxsIElzbGFuZFwifSxcbiAgICAgKiAgICAgICAgIFwiZ2VvbWV0cnlcIjoge1xuICAgICAqICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBvaW50XCIsXG4gICAgICogICAgICAgICAgICAgXCJjb29yZGluYXRlc1wiOiBbIDAsIDAgXVxuICAgICAqICAgICAgICAgfVxuICAgICAqICAgICB9XVxuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHNldERhdGEoZGF0YTogR2VvSlNPTiB8IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICAgICAgdGhpcy5fdXBkYXRlV29ya2VyRGF0YSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgY2x1c3RlcmVkIHNvdXJjZXMsIGZldGNoZXMgdGhlIHpvb20gYXQgd2hpY2ggdGhlIGdpdmVuIGNsdXN0ZXIgZXhwYW5kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjbHVzdGVySWQgVGhlIHZhbHVlIG9mIHRoZSBjbHVzdGVyJ3MgYGNsdXN0ZXJfaWRgIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHpvb20gdmFsdWUgaXMgcmV0cmlldmVkIChgKGVycm9yLCB6b29tKSA9PiB7IC4uLiB9YCkuXG4gICAgICogQHJldHVybnMge0dlb0pTT05Tb3VyY2V9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBBc3N1bWluZyB0aGUgbWFwIGhhcyBhIGxheWVyIG5hbWVkICdjbHVzdGVycycgYW5kIGEgc291cmNlICdlYXJ0aHF1YWtlcydcbiAgICAgKiAvLyBUaGUgZm9sbG93aW5nIGNyZWF0ZXMgYSBjYW1lcmEgYW5pbWF0aW9uIG9uIGNsdXN0ZXIgZmVhdHVyZSBjbGlja1xuICAgICAqIG1hcC5vbignY2xpY2snLCAnY2x1c3RlcnMnLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCwge1xuICAgICAqICAgICAgICAgbGF5ZXJzOiBbJ2NsdXN0ZXJzJ11cbiAgICAgKiAgICAgfSk7XG4gICAgICpcbiAgICAgKiAgICAgY29uc3QgY2x1c3RlcklkID0gZmVhdHVyZXNbMF0ucHJvcGVydGllcy5jbHVzdGVyX2lkO1xuICAgICAqXG4gICAgICogICAgIC8vIEVhc2UgdGhlIGNhbWVyYSB0byB0aGUgbmV4dCBjbHVzdGVyIGV4cGFuc2lvblxuICAgICAqICAgICBtYXAuZ2V0U291cmNlKCdlYXJ0aHF1YWtlcycpLmdldENsdXN0ZXJFeHBhbnNpb25ab29tKFxuICAgICAqICAgICAgICAgY2x1c3RlcklkLFxuICAgICAqICAgICAgICAgKGVyciwgem9vbSkgPT4ge1xuICAgICAqICAgICAgICAgICAgIGlmICghZXJyKSB7XG4gICAgICogICAgICAgICAgICAgICAgIG1hcC5lYXNlVG8oe1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgY2VudGVyOiBmZWF0dXJlc1swXS5nZW9tZXRyeS5jb29yZGluYXRlcyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHpvb21cbiAgICAgKiAgICAgICAgICAgICAgICAgfSk7XG4gICAgICogICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgfVxuICAgICAqICAgICApO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldENsdXN0ZXJFeHBhbnNpb25ab29tKGNsdXN0ZXJJZDogbnVtYmVyLCBjYWxsYmFjazogQ2FsbGJhY2s8bnVtYmVyPik6IHRoaXMge1xuICAgICAgICB0aGlzLmFjdG9yLnNlbmQoJ2dlb2pzb24uZ2V0Q2x1c3RlckV4cGFuc2lvblpvb20nLCB7Y2x1c3RlcklkLCBzb3VyY2U6IHRoaXMuaWR9LCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBjbHVzdGVyZWQgc291cmNlcywgZmV0Y2hlcyB0aGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIGNsdXN0ZXIgb24gdGhlIG5leHQgem9vbSBsZXZlbCAoYXMgYW4gYXJyYXkgb2YgR2VvSlNPTiBmZWF0dXJlcykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY2x1c3RlcklkIFRoZSB2YWx1ZSBvZiB0aGUgY2x1c3RlcidzIGBjbHVzdGVyX2lkYCBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBmZWF0dXJlcyBhcmUgcmV0cmlldmVkIChgKGVycm9yLCBmZWF0dXJlcykgPT4geyAuLi4gfWApLlxuICAgICAqIEByZXR1cm5zIHtHZW9KU09OU291cmNlfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gUmV0cmlldmUgY2x1c3RlciBjaGlsZHJlbiBvbiBjbGlja1xuICAgICAqIG1hcC5vbignY2xpY2snLCAnY2x1c3RlcnMnLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCwge1xuICAgICAqICAgICAgICAgbGF5ZXJzOiBbJ2NsdXN0ZXJzJ11cbiAgICAgKiAgICAgfSk7XG4gICAgICpcbiAgICAgKiAgICAgY29uc3QgY2x1c3RlcklkID0gZmVhdHVyZXNbMF0ucHJvcGVydGllcy5jbHVzdGVyX2lkO1xuICAgICAqXG4gICAgICogICAgIGNsdXN0ZXJTb3VyY2UuZ2V0Q2x1c3RlckNoaWxkcmVuKGNsdXN0ZXJJZCwgKGVycm9yLCBmZWF0dXJlcykgPT4ge1xuICAgICAqICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAqICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDbHVzdGVyIGNoaWxkcmVuOicsIGZlYXR1cmVzKTtcbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgfSk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKi9cbiAgICBnZXRDbHVzdGVyQ2hpbGRyZW4oY2x1c3RlcklkOiBudW1iZXIsIGNhbGxiYWNrOiBDYWxsYmFjazxBcnJheTxHZW9KU09ORmVhdHVyZT4+KTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWN0b3Iuc2VuZCgnZ2VvanNvbi5nZXRDbHVzdGVyQ2hpbGRyZW4nLCB7Y2x1c3RlcklkLCBzb3VyY2U6IHRoaXMuaWR9LCBjYWxsYmFjayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvciBjbHVzdGVyZWQgc291cmNlcywgZmV0Y2hlcyB0aGUgb3JpZ2luYWwgcG9pbnRzIHRoYXQgYmVsb25nIHRvIHRoZSBjbHVzdGVyIChhcyBhbiBhcnJheSBvZiBHZW9KU09OIGZlYXR1cmVzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjbHVzdGVySWQgVGhlIHZhbHVlIG9mIHRoZSBjbHVzdGVyJ3MgYGNsdXN0ZXJfaWRgIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCBUaGUgbWF4aW11bSBudW1iZXIgb2YgZmVhdHVyZXMgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byBgMTBgIGlmIGEgZmFsc3kgdmFsdWUgaXMgZ2l2ZW4uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCBUaGUgbnVtYmVyIG9mIGZlYXR1cmVzIHRvIHNraXAgKGZvciBleGFtcGxlLCBmb3IgcGFnaW5hdGlvbikuIERlZmF1bHRzIHRvIGAwYCBpZiBhIGZhbHN5IHZhbHVlIGlzIGdpdmVuLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGZlYXR1cmVzIGFyZSByZXRyaWV2ZWQgKGAoZXJyb3IsIGZlYXR1cmVzKSA9PiB7IC4uLiB9YCkuXG4gICAgICogQHJldHVybnMge0dlb0pTT05Tb3VyY2V9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBSZXRyaWV2ZSBjbHVzdGVyIGxlYXZlcyBvbiBjbGlja1xuICAgICAqIG1hcC5vbignY2xpY2snLCAnY2x1c3RlcnMnLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludCwge1xuICAgICAqICAgICAgICAgbGF5ZXJzOiBbJ2NsdXN0ZXJzJ11cbiAgICAgKiAgICAgfSk7XG4gICAgICpcbiAgICAgKiAgICAgY29uc3QgY2x1c3RlcklkID0gZmVhdHVyZXNbMF0ucHJvcGVydGllcy5jbHVzdGVyX2lkO1xuICAgICAqICAgICBjb25zdCBwb2ludENvdW50ID0gZmVhdHVyZXNbMF0ucHJvcGVydGllcy5wb2ludF9jb3VudDtcbiAgICAgKiAgICAgY29uc3QgY2x1c3RlclNvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ2NsdXN0ZXJzJyk7XG4gICAgICpcbiAgICAgKiAgICAgY2x1c3RlclNvdXJjZS5nZXRDbHVzdGVyTGVhdmVzKGNsdXN0ZXJJZCwgcG9pbnRDb3VudCwgMCwgKGVycm9yLCBmZWF0dXJlcykgPT4ge1xuICAgICAqICAgICAvLyBQcmludCBjbHVzdGVyIGxlYXZlcyBpbiB0aGUgY29uc29sZVxuICAgICAqICAgICAgICAgY29uc29sZS5sb2coJ0NsdXN0ZXIgbGVhdmVzOicsIGVycm9yLCBmZWF0dXJlcyk7XG4gICAgICogICAgIH0pO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGdldENsdXN0ZXJMZWF2ZXMoY2x1c3RlcklkOiBudW1iZXIsIGxpbWl0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyLCBjYWxsYmFjazogQ2FsbGJhY2s8QXJyYXk8R2VvSlNPTkZlYXR1cmU+Pik6IHRoaXMge1xuICAgICAgICB0aGlzLmFjdG9yLnNlbmQoJ2dlb2pzb24uZ2V0Q2x1c3RlckxlYXZlcycsIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5pZCxcbiAgICAgICAgICAgIGNsdXN0ZXJJZCxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgb2Zmc2V0XG4gICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZXNwb25zaWJsZSBmb3IgaW52b2tpbmcgV29ya2VyU291cmNlJ3MgZ2VvanNvbi5sb2FkRGF0YSB0YXJnZXQsIHdoaWNoXG4gICAgICogaGFuZGxlcyBsb2FkaW5nIHRoZSBnZW9qc29uIGRhdGEgYW5kIHByZXBhcmluZyB0byBzZXJ2ZSBpdCB1cCBhcyB0aWxlcyxcbiAgICAgKiB1c2luZyBnZW9qc29uLXZ0IG9yIHN1cGVyY2x1c3RlciBhcyBhcHByb3ByaWF0ZS5cbiAgICAgKi9cbiAgICBfdXBkYXRlV29ya2VyRGF0YSgpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUncyBhbiBlYXJsaWVyIGxvYWREYXRhIHRvIGZpbmlzaCwgd2FpdCB1bnRpbCBpdCBmaW5pc2hlcyBhbmQgdGhlbiBkbyBhbm90aGVyIHVwZGF0ZVxuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0xvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvYWxlc2NlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc291cmNlJ30pKTtcblxuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGV4dGVuZCh7fSwgdGhpcy53b3JrZXJPcHRpb25zKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX2RhdGE7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG9wdGlvbnMucmVxdWVzdCA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KGJyb3dzZXIucmVzb2x2ZVVSTChkYXRhKSwgUmVzb3VyY2VUeXBlLlNvdXJjZSk7XG4gICAgICAgICAgICBvcHRpb25zLnJlcXVlc3QuY29sbGVjdFJlc291cmNlVGltaW5nID0gdGhpcy5fY29sbGVjdFJlc291cmNlVGltaW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucy5kYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0YXJnZXQge3RoaXMudHlwZX0ubG9hZERhdGEgcmF0aGVyIHRoYW4gbGl0ZXJhbGx5IGdlb2pzb24ubG9hZERhdGEsXG4gICAgICAgIC8vIHNvIHRoYXQgb3RoZXIgZ2VvanNvbi1saWtlIHNvdXJjZSB0eXBlcyBjYW4gZWFzaWx5IHJldXNlIHRoaXNcbiAgICAgICAgLy8gaW1wbGVtZW50YXRpb25cbiAgICAgICAgdGhpcy5fcGVuZGluZ0xvYWQgPSB0aGlzLmFjdG9yLnNlbmQoYCR7dGhpcy50eXBlfS5sb2FkRGF0YWAsIG9wdGlvbnMsIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdMb2FkID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBhbHRob3VnaCBHZW9KU09OIHNvdXJjZXMgY29udGFpbiBubyBtZXRhZGF0YSwgd2UgZmlyZSB0aGlzIGV2ZW50IGF0IGZpcnN0XG4gICAgICAgICAgICAgICAgLy8gdG8gbGV0IHRoZSBTb3VyY2VDYWNoZSBrbm93IGl0cyBvayB0byBzdGFydCByZXF1ZXN0aW5nIHRpbGVzLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGE6IE9iamVjdCA9IHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiB0aGlzLl9tZXRhZGF0YUZpcmVkID8gJ2NvbnRlbnQnIDogJ21ldGFkYXRhJ307XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyAmJiByZXN1bHQgJiYgcmVzdWx0LnJlc291cmNlVGltaW5nICYmIHJlc3VsdC5yZXNvdXJjZVRpbWluZ1t0aGlzLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnJlc291cmNlVGltaW5nID0gcmVzdWx0LnJlc291cmNlVGltaW5nW3RoaXMuaWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywgZGF0YSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhRmlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fY29hbGVzY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVXb3JrZXJEYXRhKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29hbGVzY2UgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gIXRpbGUuYWN0b3IgPyAnbG9hZFRpbGUnIDogJ3JlbG9hZFRpbGUnO1xuICAgICAgICB0aWxlLmFjdG9yID0gdGhpcy5hY3RvcjtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgIHRpbGVJRDogdGlsZS50aWxlSUQsXG4gICAgICAgICAgICB0aWxlWm9vbTogdGlsZS50aWxlWm9vbSxcbiAgICAgICAgICAgIHpvb206IHRpbGUudGlsZUlELm92ZXJzY2FsZWRaLFxuICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBwaXhlbFJhdGlvOiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IHRoaXMubWFwLnNob3dDb2xsaXNpb25Cb3hlcyxcbiAgICAgICAgICAgIHByb21vdGVJZDogdGhpcy5wcm9tb3RlSWRcbiAgICAgICAgfTtcblxuICAgICAgICB0aWxlLnJlcXVlc3QgPSB0aGlzLmFjdG9yLnNlbmQobWVzc2FnZSwgcGFyYW1zLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuICAgICAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKCk7XG5cbiAgICAgICAgICAgIGlmICh0aWxlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGlsZS5sb2FkVmVjdG9yRGF0YShkYXRhLCB0aGlzLm1hcC5wYWludGVyLCBtZXNzYWdlID09PSAncmVsb2FkVGlsZScpO1xuXG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0sIHVuZGVmaW5lZCwgbWVzc2FnZSA9PT0gJ2xvYWRUaWxlJyk7XG4gICAgfVxuXG4gICAgYWJvcnRUaWxlKHRpbGU6IFRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUucmVxdWVzdCkge1xuICAgICAgICAgICAgdGlsZS5yZXF1ZXN0LmNhbmNlbCgpO1xuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcbiAgICAgICAgfVxuICAgICAgICB0aWxlLmFib3J0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHVubG9hZFRpbGUodGlsZTogVGlsZSkge1xuICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEoKTtcbiAgICAgICAgdGhpcy5hY3Rvci5zZW5kKCdyZW1vdmVUaWxlJywge3VpZDogdGlsZS51aWQsIHR5cGU6IHRoaXMudHlwZSwgc291cmNlOiB0aGlzLmlkfSk7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nTG9hZCkge1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0xvYWQuY2FuY2VsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogR2VvSlNPTlNvdXJjZVNwZWNpZmljYXRpb24ge1xuICAgICAgICByZXR1cm4gZXh0ZW5kKHt9LCB0aGlzLl9vcHRpb25zLCB7XG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBkYXRhOiB0aGlzLl9kYXRhXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdlb0pTT05Tb3VyY2U7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkLmpzJztcbmltcG9ydCB7RXZlbnQsIEVycm9yRXZlbnQsIEV2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQge2dldEltYWdlLCBSZXNvdXJjZVR5cGV9IGZyb20gJy4uL3V0aWwvYWpheC5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50LmpzJztcbmltcG9ydCB7UmFzdGVyQm91bmRzQXJyYXl9IGZyb20gJy4uL2RhdGEvYXJyYXlfdHlwZXMuanMnO1xuaW1wb3J0IGJvdW5kc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9ib3VuZHNfYXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQuanMnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUuanMnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSBmcm9tICcuLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuaW1wb3J0IHRpbGVUcmFuc2Zvcm0sIHtnZXRUaWxlUG9pbnR9IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3RpbGVfdHJhbnNmb3JtLmpzJztcbmltcG9ydCB7bWF0MywgdmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cuanMnO1xuXG5pbXBvcnQgdHlwZSB7U291cmNlfSBmcm9tICcuL3NvdXJjZS5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FudmFzU291cmNlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi9jYW52YXNfc291cmNlLmpzJztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAuanMnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgSW1hZ2VTb3VyY2VTcGVjaWZpY2F0aW9uLFxuICAgIFZpZGVvU291cmNlU3BlY2lmaWNhdGlvblxufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5cbnR5cGUgQ29vcmRpbmF0ZXMgPSBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV07XG5cbi8vIHBlcnNwZWN0aXZlIGNvcnJlY3Rpb24gZm9yIHRleHR1cmUgbWFwcGluZywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy85MTU4XG4vLyBhZGFwdGVkIGZyb20gaHR0cHM6Ly9tYXRoLnN0YWNrZXhjaGFuZ2UuY29tL2EvMzM5MDMzLzQ4NjUzXG5cbmZ1bmN0aW9uIGJhc2lzVG9Qb2ludHMoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0KSB7XG4gICAgY29uc3QgbSA9IFt4MSwgeDIsIHgzLCB5MSwgeTIsIHkzLCAxLCAxLCAxXTtcbiAgICBjb25zdCBzID0gW3g0LCB5NCwgMV07XG4gICAgY29uc3QgbWEgPSBtYXQzLmFkam9pbnQoW10sIG0pO1xuICAgIGNvbnN0IFtzeCwgc3ksIHN6XSA9IHZlYzMudHJhbnNmb3JtTWF0MyhzLCBzLCBtYXQzLnRyYW5zcG9zZShtYSwgbWEpKTtcbiAgICByZXR1cm4gbWF0My5tdWx0aXBseShtLCBbc3gsIDAsIDAsIDAsIHN5LCAwLCAwLCAwLCBzel0sIG0pO1xufVxuXG5mdW5jdGlvbiBnZXRQZXJzcGVjdGl2ZVRyYW5zZm9ybSh3LCBoLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIHtcbiAgICBjb25zdCBzID0gYmFzaXNUb1BvaW50cygwLCAwLCB3LCAwLCAwLCBoLCB3LCBoKTtcbiAgICBjb25zdCBtID0gYmFzaXNUb1BvaW50cyh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpO1xuICAgIG1hdDMubXVsdGlwbHkobSwgbWF0My5hZGpvaW50KHMsIHMpLCBtKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBtWzZdIC8gbVs4XSAqIHcgLyBFWFRFTlQsXG4gICAgICAgIG1bN10gLyBtWzhdICogaCAvIEVYVEVOVFxuICAgIF07XG59XG5cbi8qKlxuICogQSBkYXRhIHNvdXJjZSBjb250YWluaW5nIGFuIGltYWdlLlxuICogU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy1pbWFnZSkgZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAnaW1hZ2UnLFxuICogICAgIHVybDogJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vaW1hZ2VzL2Zvby5wbmcnLFxuICogICAgIGNvb3JkaW5hdGVzOiBbXG4gKiAgICAgICAgIFstNzYuNTQsIDM5LjE4XSxcbiAqICAgICAgICAgWy03Ni41MiwgMzkuMThdLFxuICogICAgICAgICBbLTc2LjUyLCAzOS4xN10sXG4gKiAgICAgICAgIFstNzYuNTQsIDM5LjE3XVxuICogICAgIF1cbiAqIH0pO1xuICpcbiAqIC8vIHVwZGF0ZSBjb29yZGluYXRlc1xuICogY29uc3QgbXlTb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdzb21lIGlkJyk7XG4gKiBteVNvdXJjZS5zZXRDb29yZGluYXRlcyhbXG4gKiAgICAgWy03Ni41NDMzNTczNzIyODM5NCwgMzkuMTg1Nzk5MDcyMjk3NDhdLFxuICogICAgIFstNzYuNTI4MDM2NTk0MzkwODcsIDM5LjE4MzgzNjQ4NDc1ODddLFxuICogICAgIFstNzYuNTI5NTM4NjMxNDM5MiwgMzkuMTc2ODMzOTI1MDc2MDZdLFxuICogICAgIFstNzYuNTQ1MjAyNzMyMDg2MTgsIDM5LjE3ODc2MzQ0MTA2NjQyXVxuICogXSk7XG4gKlxuICogLy8gdXBkYXRlIHVybCBhbmQgY29vcmRpbmF0ZXMgc2ltdWx0YW5lb3VzbHlcbiAqIG15U291cmNlLnVwZGF0ZUltYWdlKHtcbiAqICAgICB1cmw6ICdodHRwczovL3d3dy5tYXBib3guY29tL2ltYWdlcy9iYXIucG5nJyxcbiAqICAgICBjb29yZGluYXRlczogW1xuICogICAgICAgICBbLTc2LjU0MzM1NzM3MjI4Mzk0LCAzOS4xODU3OTkwNzIyOTc0OF0sXG4gKiAgICAgICAgIFstNzYuNTI4MDM2NTk0MzkwODcsIDM5LjE4MzgzNjQ4NDc1ODddLFxuICogICAgICAgICBbLTc2LjUyOTUzODYzMTQzOTIsIDM5LjE3NjgzMzkyNTA3NjA2XSxcbiAqICAgICAgICAgWy03Ni41NDUyMDI3MzIwODYxOCwgMzkuMTc4NzYzNDQxMDY2NDJdXG4gKiAgICAgXVxuICogfSk7XG4gKlxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgYW4gaW1hZ2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaW1hZ2Utb24tYS1tYXAvKVxuICogQHNlZSBbRXhhbXBsZTogQW5pbWF0ZSBhIHNlcmllcyBvZiBpbWFnZXNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYW5pbWF0ZS1pbWFnZXMvKVxuICovXG5jbGFzcyBJbWFnZVNvdXJjZSBleHRlbmRzIEV2ZW50ZWQgaW1wbGVtZW50cyBTb3VyY2Uge1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBpZDogc3RyaW5nO1xuICAgIG1pbnpvb206IG51bWJlcjtcbiAgICBtYXh6b29tOiBudW1iZXI7XG4gICAgdGlsZVNpemU6IG51bWJlcjtcbiAgICB1cmw6IHN0cmluZztcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuXG4gICAgY29vcmRpbmF0ZXM6IENvb3JkaW5hdGVzO1xuICAgIHRpbGVzOiB7W186IHN0cmluZ106IFRpbGV9O1xuICAgIG9wdGlvbnM6IGFueTtcbiAgICBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyO1xuICAgIG1hcDogTWFwO1xuICAgIHRleHR1cmU6IFRleHR1cmUgfCBudWxsO1xuICAgIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50IHwgSW1hZ2VCaXRtYXAgfCBJbWFnZURhdGE7XG4gICAgdGlsZUlEOiBDYW5vbmljYWxUaWxlSUQ7XG4gICAgX2JvdW5kc0FycmF5OiA/UmFzdGVyQm91bmRzQXJyYXk7XG4gICAgYm91bmRzQnVmZmVyOiA/VmVydGV4QnVmZmVyO1xuICAgIGJvdW5kc1NlZ21lbnRzOiA/U2VnbWVudFZlY3RvcjtcbiAgICBfbG9hZGVkOiBib29sZWFuO1xuICAgIHBlcnNwZWN0aXZlVHJhbnNmb3JtOiBbbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBvcHRpb25zOiBJbWFnZVNvdXJjZVNwZWNpZmljYXRpb24gfCBWaWRlb1NvdXJjZVNwZWNpZmljYXRpb24gfCBDYW52YXNTb3VyY2VTcGVjaWZpY2F0aW9uLCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlcyA9IG9wdGlvbnMuY29vcmRpbmF0ZXM7XG5cbiAgICAgICAgdGhpcy50eXBlID0gJ2ltYWdlJztcbiAgICAgICAgdGhpcy5taW56b29tID0gMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMjI7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XG4gICAgICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuXG4gICAgbG9hZChuZXdDb29yZGluYXRlcz86IENvb3JkaW5hdGVzLCBsb2FkZWQ/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGxvYWRlZCB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSkpO1xuXG4gICAgICAgIHRoaXMudXJsID0gdGhpcy5vcHRpb25zLnVybDtcblxuICAgICAgICBnZXRJbWFnZSh0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh0aGlzLnVybCwgUmVzb3VyY2VUeXBlLkltYWdlKSwgKGVyciwgaW1hZ2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycikpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtIVE1MSW1hZ2VFbGVtZW50fSA9IHdpbmRvdztcbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2UgPSBicm93c2VyLmdldEltYWdlRGF0YShpbWFnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5pbWFnZS53aWR0aDtcbiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuaW1hZ2UuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmIChuZXdDb29yZGluYXRlcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvb3JkaW5hdGVzID0gbmV3Q29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGltYWdlIFVSTCBhbmQsIG9wdGlvbmFsbHksIHRoZSBjb29yZGluYXRlcy4gVG8gYXZvaWQgaGF2aW5nIHRoZSBpbWFnZSBmbGFzaCBhZnRlciBjaGFuZ2luZyxcbiAgICAgKiBzZXQgdGhlIGByYXN0ZXItZmFkZS1kdXJhdGlvbmAgcGFpbnQgcHJvcGVydHkgb24gdGhlIHJhc3RlciBsYXllciB0byAwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnVybF0gUmVxdWlyZWQgaW1hZ2UgVVJMLlxuICAgICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IFtvcHRpb25zLmNvb3JkaW5hdGVzXSBGb3VyIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyxcbiAgICAgKiAgIHJlcHJlc2VudGVkIGFzIGFycmF5cyBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIG51bWJlcnMsIHdoaWNoIGRlZmluZSB0aGUgY29ybmVycyBvZiB0aGUgaW1hZ2UuXG4gICAgICogICBUaGUgY29vcmRpbmF0ZXMgc3RhcnQgYXQgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UgYW5kIHByb2NlZWQgaW4gY2xvY2t3aXNlIG9yZGVyLlxuICAgICAqICAgVGhleSBkbyBub3QgaGF2ZSB0byByZXByZXNlbnQgYSByZWN0YW5nbGUuXG4gICAgICogQHJldHVybnMge0ltYWdlU291cmNlfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gQWRkIHRvIGFuIGltYWdlIHNvdXJjZSB0byB0aGUgbWFwIHdpdGggc29tZSBpbml0aWFsIFVSTCBhbmQgY29vcmRpbmF0ZXNcbiAgICAgKiBtYXAuYWRkU291cmNlKCdpbWFnZV9zb3VyY2VfaWQnLCB7XG4gICAgICogICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICogICAgIHVybDogJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vaW1hZ2VzL2Zvby5wbmcnLFxuICAgICAqICAgICBjb29yZGluYXRlczogW1xuICAgICAqICAgICAgICAgWy03Ni41NCwgMzkuMThdLFxuICAgICAqICAgICAgICAgWy03Ni41MiwgMzkuMThdLFxuICAgICAqICAgICAgICAgWy03Ni41MiwgMzkuMTddLFxuICAgICAqICAgICAgICAgWy03Ni41NCwgMzkuMTddXG4gICAgICogICAgIF1cbiAgICAgKiB9KTtcbiAgICAgKiAvLyBUaGVuIHVwZGF0ZSB0aGUgaW1hZ2UgVVJMIGFuZCBjb29yZGluYXRlc1xuICAgICAqIGltYWdlU291cmNlLnVwZGF0ZUltYWdlKHtcbiAgICAgKiAgICAgdXJsOiAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9pbWFnZXMvYmFyLnBuZycsXG4gICAgICogICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICogICAgICAgICBbLTc2LjU0MzMsIDM5LjE4NTddLFxuICAgICAqICAgICAgICAgWy03Ni41MjgwLCAzOS4xODM4XSxcbiAgICAgKiAgICAgICAgIFstNzYuNTI5NSwgMzkuMTc2OF0sXG4gICAgICogICAgICAgICBbLTc2LjU0NTIsIDM5LjE3ODddXG4gICAgICogICAgIF1cbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB1cGRhdGVJbWFnZShvcHRpb25zOiB7dXJsOiBzdHJpbmcsIGNvb3JkaW5hdGVzPzogQ29vcmRpbmF0ZXN9KTogdGhpcyB7XG4gICAgICAgIGlmICghdGhpcy5pbWFnZSB8fCAhb3B0aW9ucy51cmwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucy51cmwgPSBvcHRpb25zLnVybDtcbiAgICAgICAgdGhpcy5sb2FkKG9wdGlvbnMuY29vcmRpbmF0ZXMsIHRoaXMuX2xvYWRlZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9maW5pc2hMb2FkaW5nKCkge1xuICAgICAgICBpZiAodGhpcy5tYXApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29vcmRpbmF0ZXModGhpcy5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdtZXRhZGF0YSd9KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUpIHRoaXMudGV4dHVyZS5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaW1hZ2UncyBjb29yZGluYXRlcyBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMsXG4gICAgICogICByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBudW1iZXJzLCB3aGljaCBkZWZpbmUgdGhlIGNvcm5lcnMgb2YgdGhlIGltYWdlLlxuICAgICAqICAgVGhlIGNvb3JkaW5hdGVzIHN0YXJ0IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlIGFuZCBwcm9jZWVkIGluIGNsb2Nrd2lzZSBvcmRlci5cbiAgICAgKiAgIFRoZXkgZG8gbm90IGhhdmUgdG8gcmVwcmVzZW50IGEgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm5zIHtJbWFnZVNvdXJjZX0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEFkZCBhbiBpbWFnZSBzb3VyY2UgdG8gdGhlIG1hcCB3aXRoIHNvbWUgaW5pdGlhbCBjb29yZGluYXRlc1xuICAgICAqIG1hcC5hZGRTb3VyY2UoJ2ltYWdlX3NvdXJjZV9pZCcsIHtcbiAgICAgKiAgICAgdHlwZTogJ2ltYWdlJyxcbiAgICAgKiAgICAgdXJsOiAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9pbWFnZXMvZm9vLnBuZycsXG4gICAgICogICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICogICAgICAgICBbLTc2LjU0LCAzOS4xOF0sXG4gICAgICogICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXG4gICAgICogICAgICAgICBbLTc2LjUyLCAzOS4xN10sXG4gICAgICogICAgICAgICBbLTc2LjU0LCAzOS4xN11cbiAgICAgKiAgICAgXVxuICAgICAqIH0pO1xuICAgICAqIC8vIFRoZW4gdXBkYXRlIHRoZSBpbWFnZSBjb29yZGluYXRlc1xuICAgICAqIGltYWdlU291cmNlLnNldENvb3JkaW5hdGVzKFtcbiAgICAgKiAgICAgWy03Ni41NDMzLCAzOS4xODU3XSxcbiAgICAgKiAgICAgWy03Ni41MjgwLCAzOS4xODM4XSxcbiAgICAgKiAgICAgWy03Ni41Mjk1LCAzOS4xNzY4XSxcbiAgICAgKiAgICAgWy03Ni41NDUyLCAzOS4xNzg3XVxuICAgICAqIF0pO1xuICAgICAqL1xuICAgIHNldENvb3JkaW5hdGVzKGNvb3JkaW5hdGVzOiBDb29yZGluYXRlcyk6IHRoaXMge1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG4gICAgICAgIHRoaXMuX2JvdW5kc0FycmF5ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB3aGljaCBtZXJjYXRvciB0aWxlIGlzIHN1aXRhYmxlIGZvciByZW5kZXJpbmcgdGhlIHZpZGVvIGluXG4gICAgICAgIC8vIGFuZCBjcmVhdGUgYSBidWZmZXIgd2l0aCB0aGUgY29ybmVyIGNvb3JkaW5hdGVzLiBUaGVzZSBjb29yZGluYXRlc1xuICAgICAgICAvLyBtYXkgYmUgb3V0c2lkZSB0aGUgdGlsZSwgYmVjYXVzZSByYXN0ZXIgdGlsZXMgYXJlbid0IGNsaXBwZWQgd2hlbiByZW5kZXJpbmcuXG5cbiAgICAgICAgLy8gdHJhbnNmb3JtIHRoZSBnZW8gY29vcmRpbmF0ZXMgaW50byAoem9vbSAwKSB0aWxlIHNwYWNlIGNvb3JkaW5hdGVzXG4gICAgICAgIGNvbnN0IGNvcm5lckNvb3JkcyA9IGNvb3JkaW5hdGVzLm1hcChNZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdCk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRpbGUgd2UnbGwgdXNlIHRvIGhvbGQgdGhpcyBpbWFnZSdzXG4gICAgICAgIC8vIHJlbmRlciBkYXRhXG4gICAgICAgIHRoaXMudGlsZUlEID0gZ2V0Q29vcmRpbmF0ZXNDZW50ZXJUaWxlSUQoY29ybmVyQ29vcmRzKTtcblxuICAgICAgICAvLyBDb25zdHJhaW4gbWluL21heCB6b29tIHRvIG91ciB0aWxlJ3Mgem9vbSBsZXZlbCBpbiBvcmRlciB0byBmb3JjZVxuICAgICAgICAvLyBTb3VyY2VDYWNoZSB0byByZXF1ZXN0IHRoaXMgdGlsZSAobm8gbWF0dGVyIHdoYXQgdGhlIG1hcCdzIHpvb21cbiAgICAgICAgLy8gbGV2ZWwpXG4gICAgICAgIHRoaXMubWluem9vbSA9IHRoaXMubWF4em9vbSA9IHRoaXMudGlsZUlELno7XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTonc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdjb250ZW50J30pKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX2NsZWFyKCkge1xuICAgICAgICB0aGlzLl9ib3VuZHNBcnJheSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBfcHJlcGFyZURhdGEoY29udGV4dDogQ29udGV4dCkge1xuICAgICAgICBmb3IgKGNvbnN0IHcgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMudGlsZXNbd107XG4gICAgICAgICAgICBpZiAodGlsZS5zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gdGhpcy50ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2JvdW5kc0FycmF5KSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdGlsZVRyID0gdGlsZVRyYW5zZm9ybSh0aGlzLnRpbGVJRCwgdGhpcy5tYXAudHJhbnNmb3JtLnByb2plY3Rpb24pO1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgY29ybmVyIGNvb3JkaW5hdGVzIGludG8gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2Ygb3VyIHRpbGUuXG4gICAgICAgIGNvbnN0IFt0bCwgdHIsIGJyLCBibF0gPSB0aGlzLmNvb3JkaW5hdGVzLm1hcCgoY29vcmQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3RlZENvb3JkID0gdGlsZVRyLnByb2plY3Rpb24ucHJvamVjdChjb29yZFswXSwgY29vcmRbMV0pO1xuICAgICAgICAgICAgcmV0dXJuIGdldFRpbGVQb2ludCh0aWxlVHIsIHByb2plY3RlZENvb3JkKS5fcm91bmQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wZXJzcGVjdGl2ZVRyYW5zZm9ybSA9IGdldFBlcnNwZWN0aXZlVHJhbnNmb3JtKFxuICAgICAgICAgICAgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIHRsLngsIHRsLnksIHRyLngsIHRyLnksIGJsLngsIGJsLnksIGJyLngsIGJyLnkpO1xuXG4gICAgICAgIGNvbnN0IGJvdW5kc0FycmF5ID0gdGhpcy5fYm91bmRzQXJyYXkgPSBuZXcgUmFzdGVyQm91bmRzQXJyYXkoKTtcbiAgICAgICAgYm91bmRzQXJyYXkuZW1wbGFjZUJhY2sodGwueCwgdGwueSwgMCwgMCk7XG4gICAgICAgIGJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKHRyLngsIHRyLnksIEVYVEVOVCwgMCk7XG4gICAgICAgIGJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKGJsLngsIGJsLnksIDAsIEVYVEVOVCk7XG4gICAgICAgIGJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKGJyLngsIGJyLnksIEVYVEVOVCwgRVhURU5UKTtcblxuICAgICAgICBpZiAodGhpcy5ib3VuZHNCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvdW5kc0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKGJvdW5kc0FycmF5LCBib3VuZHNBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLmJvdW5kc1NlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuICAgIH1cblxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5sZW5ndGggPT09IDAgfHwgIXRoaXMuaW1hZ2UpIHJldHVybjtcblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5tYXAucGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHRoaXMuaW1hZ2UsIGdsLlJHQkEpO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZS51cGRhdGUodGhpcy5pbWFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wcmVwYXJlRGF0YShjb250ZXh0KTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIHNpbmdsZSB0aWxlIC0tIHdob29zZSBjb29yZGluYXRlcyBhcmUgdGhpcy50aWxlSUQgLS0gdGhhdFxuICAgICAgICAvLyBjb3ZlcnMgdGhlIGltYWdlIHdlIHdhbnQgdG8gcmVuZGVyLiAgSWYgdGhhdCdzIHRoZSBvbmUgYmVpbmdcbiAgICAgICAgLy8gcmVxdWVzdGVkLCBzZXQgaXQgdXAgd2l0aCB0aGUgaW1hZ2U7IG90aGVyd2lzZSwgbWFyayB0aGUgdGlsZSBhc1xuICAgICAgICAvLyBgZXJyb3JlZGAgdG8gaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIG5vIGRhdGEgZm9yIGl0LlxuICAgICAgICAvLyBJZiB0aGUgd29ybGQgd3JhcHMsIHdlIG1heSBoYXZlIG11bHRpcGxlIFwid3JhcHBlZFwiIGNvcGllcyBvZiB0aGVcbiAgICAgICAgLy8gc2luZ2xlIHRpbGUuXG4gICAgICAgIGlmICh0aGlzLnRpbGVJRCAmJiB0aGlzLnRpbGVJRC5lcXVhbHModGlsZS50aWxlSUQuY2Fub25pY2FsKSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1tTdHJpbmcodGlsZS50aWxlSUQud3JhcCldID0gdGlsZTtcbiAgICAgICAgICAgIHRpbGUuYnVja2V0cyA9IHt9O1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy51cmwsXG4gICAgICAgICAgICBjb29yZGluYXRlczogdGhpcy5jb29yZGluYXRlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGNvb3JkaW5hdGVzLCBnZXQgdGhlaXIgY2VudGVyIGFzIGEgY29vcmRpbmF0ZS5cbiAqXG4gKiBAcmV0dXJucyBjZW50ZXJwb2ludFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvb3JkaW5hdGVzQ2VudGVyVGlsZUlEKGNvb3JkczogQXJyYXk8TWVyY2F0b3JDb29yZGluYXRlPik6IENhbm9uaWNhbFRpbGVJRCB7XG4gICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIGNvb3JkLngpO1xuICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgY29vcmQueSk7XG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBjb29yZC54KTtcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGNvb3JkLnkpO1xuICAgIH1cblxuICAgIGNvbnN0IGR4ID0gbWF4WCAtIG1pblg7XG4gICAgY29uc3QgZHkgPSBtYXhZIC0gbWluWTtcbiAgICBjb25zdCBkTWF4ID0gTWF0aC5tYXgoZHgsIGR5KTtcbiAgICBjb25zdCB6b29tID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigtTWF0aC5sb2coZE1heCkgLyBNYXRoLkxOMikpO1xuICAgIGNvbnN0IHRpbGVzQXRab29tID0gTWF0aC5wb3coMiwgem9vbSk7XG5cbiAgICByZXR1cm4gbmV3IENhbm9uaWNhbFRpbGVJRChcbiAgICAgICAgICAgIHpvb20sXG4gICAgICAgICAgICBNYXRoLmZsb29yKChtaW5YICsgbWF4WCkgLyAyICogdGlsZXNBdFpvb20pLFxuICAgICAgICAgICAgTWF0aC5mbG9vcigobWluWSArIG1heFkpIC8gMiAqIHRpbGVzQXRab29tKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEltYWdlU291cmNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtnZXRWaWRlbywgUmVzb3VyY2VUeXBlfSBmcm9tICcuLi91dGlsL2FqYXguanMnO1xuXG5pbXBvcnQgSW1hZ2VTb3VyY2UgZnJvbSAnLi9pbWFnZV9zb3VyY2UuanMnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUuanMnO1xuaW1wb3J0IHtFcnJvckV2ZW50fSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IFZhbGlkYXRpb25FcnJvciBmcm9tICcuLi9zdHlsZS1zcGVjL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3IuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwLmpzJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyLmpzJztcbmltcG9ydCB0eXBlIHtFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IHR5cGUge1ZpZGVvU291cmNlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5cbi8qKlxuICogQSBkYXRhIHNvdXJjZSBjb250YWluaW5nIHZpZGVvLlxuICogU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy12aWRlbykgZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAndmlkZW8nLFxuICogICAgIHVybDogW1xuICogICAgICAgICAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9ibG9nL2Fzc2V0cy9iYWx0aW1vcmUtc21va2UubXA0JyxcbiAqICAgICAgICAgJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vYmxvZy9hc3NldHMvYmFsdGltb3JlLXNtb2tlLndlYm0nXG4gKiAgICAgXSxcbiAqICAgICBjb29yZGluYXRlczogW1xuICogICAgICAgICBbLTc2LjU0LCAzOS4xOF0sXG4gKiAgICAgICAgIFstNzYuNTIsIDM5LjE4XSxcbiAqICAgICAgICAgWy03Ni41MiwgMzkuMTddLFxuICogICAgICAgICBbLTc2LjU0LCAzOS4xN11cbiAqICAgICBdXG4gKiB9KTtcbiAqXG4gKiAvLyB1cGRhdGVcbiAqIGNvbnN0IG15U291cmNlID0gbWFwLmdldFNvdXJjZSgnc29tZSBpZCcpO1xuICogbXlTb3VyY2Uuc2V0Q29vcmRpbmF0ZXMoW1xuICogICAgIFstNzYuNTQzMzU3MzcyMjgzOTQsIDM5LjE4NTc5OTA3MjI5NzQ4XSxcbiAqICAgICBbLTc2LjUyODAzNjU5NDM5MDg3LCAzOS4xODM4MzY0ODQ3NTg3XSxcbiAqICAgICBbLTc2LjUyOTUzODYzMTQzOTIsIDM5LjE3NjgzMzkyNTA3NjA2XSxcbiAqICAgICBbLTc2LjU0NTIwMjczMjA4NjE4LCAzOS4xNzg3NjM0NDEwNjY0Ml1cbiAqIF0pO1xuICpcbiAqIG1hcC5yZW1vdmVTb3VyY2UoJ3NvbWUgaWQnKTsgIC8vIHJlbW92ZVxuICogQHNlZSBbRXhhbXBsZTogQWRkIGEgdmlkZW9dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdmlkZW8tb24tYS1tYXAvKVxuICovXG5jbGFzcyBWaWRlb1NvdXJjZSBleHRlbmRzIEltYWdlU291cmNlIHtcbiAgICBvcHRpb25zOiBWaWRlb1NvdXJjZVNwZWNpZmljYXRpb247XG4gICAgdXJsczogQXJyYXk8c3RyaW5nPjtcbiAgICB2aWRlbzogSFRNTFZpZGVvRWxlbWVudDtcbiAgICByb3VuZFpvb206IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IFZpZGVvU291cmNlU3BlY2lmaWNhdGlvbiwgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudDogRXZlbnRlZCkge1xuICAgICAgICBzdXBlcihpZCwgb3B0aW9ucywgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCk7XG4gICAgICAgIHRoaXMucm91bmRab29tID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3ZpZGVvJztcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgICB0aGlzLnVybHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB1cmwgb2Ygb3B0aW9ucy51cmxzKSB7XG4gICAgICAgICAgICB0aGlzLnVybHMucHVzaCh0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5Tb3VyY2UpLnVybCk7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRWaWRlbyh0aGlzLnVybHMsIChlcnIsIHZpZGVvKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnIpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW8pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvID0gdmlkZW87XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlby5sb29wID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgdGhlIHZpZGVvIGZyb20gdGFraW5nIG92ZXIgdGhlIHNjcmVlbiBpbiBpT1NcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvLnNldEF0dHJpYnV0ZSgncGxheXNpbmxpbmUnLCAnJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBTdGFydCByZXBhaW50aW5nIHdoZW4gdmlkZW8gc3RhcnRzIHBsYXlpbmcuIGhhc1RyYW5zaXRpb24oKSB3aWxsIHRoZW4gcmV0dXJuXG4gICAgICAgICAgICAgICAgLy8gdHJ1ZSB0byB0cmlnZ2VyIGFkZGl0aW9uYWwgZnJhbWVzIGFzIGxvbmcgYXMgdGhlIHZpZGVvcyBjb250aW51ZXMgcGxheWluZy5cbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLnRyaWdnZXJSZXBhaW50KCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWRlby5wbGF5KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fZmluaXNoTG9hZGluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXVzZXMgdGhlIHZpZGVvLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBBc3N1bWluZyBhIHZpZGVvIHNvdXJjZSBpZGVudGlmaWVkIGJ5IHZpZGVvX3NvdXJjZV9pZCB3YXMgYWRkZWQgdG8gdGhlIG1hcFxuICAgICAqIGNvbnN0IHZpZGVvU291cmNlID0gbWFwLmdldFNvdXJjZSgndmlkZW9fc291cmNlX2lkJyk7XG4gICAgICpcbiAgICAgKiAvLyBQYXVzZXMgdGhlIHZpZGVvXG4gICAgICogdmlkZW9Tb3VyY2UucGF1c2UoKTtcbiAgICAgKi9cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgaWYgKHRoaXMudmlkZW8pIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8ucGF1c2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYXlzIHRoZSB2aWRlby5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gQXNzdW1pbmcgYSB2aWRlbyBzb3VyY2UgaWRlbnRpZmllZCBieSB2aWRlb19zb3VyY2VfaWQgd2FzIGFkZGVkIHRvIHRoZSBtYXBcbiAgICAgKiBjb25zdCB2aWRlb1NvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ3ZpZGVvX3NvdXJjZV9pZCcpO1xuICAgICAqXG4gICAgICogLy8gU3RhcnRzIHRoZSB2aWRlb1xuICAgICAqIHZpZGVvU291cmNlLnBsYXkoKTtcbiAgICAgKi9cbiAgICBwbGF5KCkge1xuICAgICAgICBpZiAodGhpcy52aWRlbykge1xuICAgICAgICAgICAgdGhpcy52aWRlby5wbGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHBsYXliYWNrIHRvIGEgdGltZXN0YW1wLCBpbiBzZWNvbmRzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2VlayhzZWNvbmRzOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMudmlkZW8pIHtcbiAgICAgICAgICAgIGNvbnN0IHNlZWthYmxlUmFuZ2UgPSB0aGlzLnZpZGVvLnNlZWthYmxlO1xuICAgICAgICAgICAgaWYgKHNlY29uZHMgPCBzZWVrYWJsZVJhbmdlLnN0YXJ0KDApIHx8IHNlY29uZHMgPiBzZWVrYWJsZVJhbmdlLmVuZCgwKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgVmFsaWRhdGlvbkVycm9yKGBzb3VyY2VzLiR7dGhpcy5pZH1gLCBudWxsLCBgUGxheWJhY2sgZm9yIHRoaXMgdmlkZW8gY2FuIGJlIHNldCBvbmx5IGJldHdlZW4gdGhlICR7c2Vla2FibGVSYW5nZS5zdGFydCgwKX0gYW5kICR7c2Vla2FibGVSYW5nZS5lbmQoMCl9LXNlY29uZCBtYXJrLmApKSk7XG4gICAgICAgICAgICB9IGVsc2UgdGhpcy52aWRlby5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIGB2aWRlb2AgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MVmlkZW9FbGVtZW50fSBUaGUgSFRNTCBgdmlkZW9gIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBBc3N1bWluZyBhIHZpZGVvIHNvdXJjZSBpZGVudGlmaWVkIGJ5IHZpZGVvX3NvdXJjZV9pZCB3YXMgYWRkZWQgdG8gdGhlIG1hcFxuICAgICAqIGNvbnN0IHZpZGVvU291cmNlID0gbWFwLmdldFNvdXJjZSgndmlkZW9fc291cmNlX2lkJyk7XG4gICAgICpcbiAgICAgKiB2aWRlb1NvdXJjZS5nZXRWaWRlbygpOyAvLyA8dmlkZW8gY3Jvc3NvcmlnaW49XCJBbm9ueW1vdXNcIiBsb29wPVwiXCI+Li4uPC92aWRlbz5cbiAgICAgKi9cbiAgICBnZXRWaWRlbygpOiBIVE1MVmlkZW9FbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW87XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApIHtcbiAgICAgICAgaWYgKHRoaXMubWFwKSByZXR1cm47XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgaWYgKHRoaXMudmlkZW8pIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW8ucGxheSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRDb29yZGluYXRlcyh0aGlzLmNvb3JkaW5hdGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZpZGVvJ3MgY29vcmRpbmF0ZXMgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBtZXRob2Qgc2V0Q29vcmRpbmF0ZXNcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgVmlkZW9Tb3VyY2VcbiAgICAgKiBAcmV0dXJucyB7VmlkZW9Tb3VyY2V9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBBZGQgYSB2aWRlbyBzb3VyY2UgdG8gdGhlIG1hcCB0byBtYXBcbiAgICAgKiBtYXAuYWRkU291cmNlKCd2aWRlb19zb3VyY2VfaWQnLCB7XG4gICAgICogICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICogICAgIHVybDogW1xuICAgICAqICAgICAgICAgJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vYmxvZy9hc3NldHMvYmFsdGltb3JlLXNtb2tlLm1wNCcsXG4gICAgICogICAgICAgICAnaHR0cHM6Ly93d3cubWFwYm94LmNvbS9ibG9nL2Fzc2V0cy9iYWx0aW1vcmUtc21va2Uud2VibSdcbiAgICAgKiAgICAgXSxcbiAgICAgKiAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgKiAgICAgICAgIFstNzYuNTQsIDM5LjE4XSxcbiAgICAgKiAgICAgICAgIFstNzYuNTIsIDM5LjE4XSxcbiAgICAgKiAgICAgICAgIFstNzYuNTIsIDM5LjE3XSxcbiAgICAgKiAgICAgICAgIFstNzYuNTQsIDM5LjE3XVxuICAgICAqICAgICBdXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBUaGVuIHVwZGF0ZSB0aGUgdmlkZW8gc291cmNlIGNvb3JkaW5hdGVzIGJ5IG5ldyBjb29yZGluYXRlc1xuICAgICAqIGNvbnN0IHZpZGVvU291cmNlID0gbWFwLmdldFNvdXJjZSgndmlkZW9fc291cmNlX2lkJyk7XG4gICAgICogdmlkZW9Tb3VyY2Uuc2V0Q29vcmRpbmF0ZXMoW1xuICAgICAqICAgICBbLTc2LjU0MzMsIDM5LjE4NTddLFxuICAgICAqICAgICBbLTc2LjUyODAsIDM5LjE4MzhdLFxuICAgICAqICAgICBbLTc2LjUyOTUsIDM5LjE3NjhdLFxuICAgICAqICAgICBbLTc2LjU0NTIsIDM5LjE3ODddXG4gICAgICogXSk7XG4gICAgICovXG4gICAgLy8gc2V0Q29vcmRpbmF0ZXMgaW5oZXJpdGVkIGZyb20gSW1hZ2VTb3VyY2VcblxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnRpbGVzKS5sZW5ndGggPT09IDAgfHwgdGhpcy52aWRlby5yZWFkeVN0YXRlIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBub3QgZW5vdWdoIGRhdGEgZm9yIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLm1hcC5wYWludGVyLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgdGhpcy52aWRlbywgZ2wuUkdCQSk7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMudmlkZW8udmlkZW9XaWR0aDtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy52aWRlby52aWRlb0hlaWdodDtcblxuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnZpZGVvLnBhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgdGhpcy52aWRlbyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wcmVwYXJlRGF0YShjb250ZXh0KTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogVmlkZW9Tb3VyY2VTcGVjaWZpY2F0aW9uIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICd2aWRlbycsXG4gICAgICAgICAgICB1cmxzOiB0aGlzLnVybHMsXG4gICAgICAgICAgICBjb29yZGluYXRlczogdGhpcy5jb29yZGluYXRlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvICYmICF0aGlzLnZpZGVvLnBhdXNlZDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZpZGVvU291cmNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEltYWdlU291cmNlIGZyb20gJy4vaW1hZ2Vfc291cmNlLmpzJztcblxuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi91dGlsL3dpbmRvdy5qcyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9yZW5kZXIvdGV4dHVyZS5qcyc7XG5pbXBvcnQge0Vycm9yRXZlbnR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQgVmFsaWRhdGlvbkVycm9yIGZyb20gJy4uL3N0eWxlLXNwZWMvZXJyb3IvdmFsaWRhdGlvbl9lcnJvci5qcyc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi91aS9tYXAuanMnO1xuaW1wb3J0IHR5cGUgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHR5cGUge0V2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5cbmV4cG9ydCB0eXBlIENhbnZhc1NvdXJjZVNwZWNpZmljYXRpb24gPSB7fFxuICAgIFwidHlwZVwiOiBcImNhbnZhc1wiLFxuICAgIFwiY29vcmRpbmF0ZXNcIjogW1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dLFxuICAgIFwiYW5pbWF0ZVwiPzogYm9vbGVhbixcbiAgICBcImNhbnZhc1wiOiBzdHJpbmcgfCBIVE1MQ2FudmFzRWxlbWVudFxufH07XG5cbi8qKlxuICogT3B0aW9ucyB0byBhZGQgYSBjYW52YXMgc291cmNlIHR5cGUgdG8gdGhlIG1hcC5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDYW52YXNTb3VyY2VPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBTb3VyY2UgdHlwZS4gTXVzdCBiZSBgXCJjYW52YXNcImAuXG4gKiBAcHJvcGVydHkge3N0cmluZ3xIVE1MQ2FudmFzRWxlbWVudH0gY2FudmFzIENhbnZhcyBzb3VyY2UgZnJvbSB3aGljaCB0byByZWFkIHBpeGVscy4gQ2FuIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSUQgb2YgdGhlIGNhbnZhcyBlbGVtZW50LCBvciB0aGUgYEhUTUxDYW52YXNFbGVtZW50YCBpdHNlbGYuXG4gKiBAcHJvcGVydHkge0FycmF5PEFycmF5PG51bWJlcj4+fSBjb29yZGluYXRlcyBGb3VyIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyBkZW5vdGluZyB3aGVyZSB0byBwbGFjZSB0aGUgY29ybmVycyBvZiB0aGUgY2FudmFzLCBzcGVjaWZpZWQgaW4gYFtsb25naXR1ZGUsIGxhdGl0dWRlXWAgcGFpcnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbmltYXRlPXRydWVdIFdoZXRoZXIgdGhlIGNhbnZhcyBzb3VyY2UgaXMgYW5pbWF0ZWQuIElmIHRoZSBjYW52YXMgaXMgc3RhdGljIChwaXhlbHMgZG8gbm90IG5lZWQgdG8gYmUgcmUtcmVhZCBvbiBldmVyeSBmcmFtZSksIGBhbmltYXRlYCBzaG91bGQgYmUgc2V0IHRvIGBmYWxzZWAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAqL1xuXG4vKipcbiAqIEEgZGF0YSBzb3VyY2UgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYW4gSFRNTCBjYW52YXMuIFNlZSB7QGxpbmsgQ2FudmFzU291cmNlT3B0aW9uc30gZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb2Ygb3B0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gYWRkIHRvIG1hcFxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAnY2FudmFzJyxcbiAqICAgICBjYW52YXM6ICdpZE9mTXlIVE1MQ2FudmFzJyxcbiAqICAgICBhbmltYXRlOiB0cnVlLFxuICogICAgIGNvb3JkaW5hdGVzOiBbXG4gKiAgICAgICAgIFstNzYuNTQsIDM5LjE4XSxcbiAqICAgICAgICAgWy03Ni41MiwgMzkuMThdLFxuICogICAgICAgICBbLTc2LjUyLCAzOS4xN10sXG4gKiAgICAgICAgIFstNzYuNTQsIDM5LjE3XVxuICogICAgIF1cbiAqIH0pO1xuICpcbiAqIC8vIHVwZGF0ZVxuICogY29uc3QgbXlTb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdzb21lIGlkJyk7XG4gKiBteVNvdXJjZS5zZXRDb29yZGluYXRlcyhbXG4gKiAgICAgWy03Ni41NDMzNTczNzIyODM5NCwgMzkuMTg1Nzk5MDcyMjk3NDhdLFxuICogICAgIFstNzYuNTI4MDM2NTk0MzkwODcsIDM5LjE4MzgzNjQ4NDc1ODddLFxuICogICAgIFstNzYuNTI5NTM4NjMxNDM5MiwgMzkuMTc2ODMzOTI1MDc2MDZdLFxuICogICAgIFstNzYuNTQ1MjAyNzMyMDg2MTgsIDM5LjE3ODc2MzQ0MTA2NjQyXVxuICogXSk7XG4gKlxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSBjYW52YXMgc291cmNlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jYW52YXMtc291cmNlLylcbiAqL1xuY2xhc3MgQ2FudmFzU291cmNlIGV4dGVuZHMgSW1hZ2VTb3VyY2Uge1xuICAgIG9wdGlvbnM6IENhbnZhc1NvdXJjZVNwZWNpZmljYXRpb247XG4gICAgYW5pbWF0ZTogYm9vbGVhbjtcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIHBsYXk6ICgpID0+IHZvaWQ7XG4gICAgcGF1c2U6ICgpID0+IHZvaWQ7XG4gICAgX3BsYXlpbmc6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIG9wdGlvbnM6IENhbnZhc1NvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpIHtcbiAgICAgICAgc3VwZXIoaWQsIG9wdGlvbnMsIGRpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgICAgIC8vIFdlIGJ1aWxkIGluIHNvbWUgdmFsaWRhdGlvbiBoZXJlLCBzaW5jZSBjYW52YXMgc291cmNlcyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIHN0eWxlIHNwZWM6XG4gICAgICAgIGlmICghb3B0aW9ucy5jb29yZGluYXRlcykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBWYWxpZGF0aW9uRXJyb3IoYHNvdXJjZXMuJHtpZH1gLCBudWxsLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcImNvb3JkaW5hdGVzXCInKSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KG9wdGlvbnMuY29vcmRpbmF0ZXMpIHx8IG9wdGlvbnMuY29vcmRpbmF0ZXMubGVuZ3RoICE9PSA0IHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jb29yZGluYXRlcy5zb21lKGMgPT4gIUFycmF5LmlzQXJyYXkoYykgfHwgYy5sZW5ndGggIT09IDIgfHwgYy5zb21lKGwgPT4gdHlwZW9mIGwgIT09ICdudW1iZXInKSkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgVmFsaWRhdGlvbkVycm9yKGBzb3VyY2VzLiR7aWR9YCwgbnVsbCwgJ1wiY29vcmRpbmF0ZXNcIiBwcm9wZXJ0eSBtdXN0IGJlIGFuIGFycmF5IG9mIDQgbG9uZ2l0dWRlL2xhdGl0dWRlIGFycmF5IHBhaXJzJykpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGUgJiYgdHlwZW9mIG9wdGlvbnMuYW5pbWF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlcy4ke2lkfWAsIG51bGwsICdvcHRpb25hbCBcImFuaW1hdGVcIiBwcm9wZXJ0eSBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZScpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wdGlvbnMuY2FudmFzKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IFZhbGlkYXRpb25FcnJvcihgc291cmNlcy4ke2lkfWAsIG51bGwsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiY2FudmFzXCInKSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLmNhbnZhcyAhPT0gJ3N0cmluZycgJiYgIShvcHRpb25zLmNhbnZhcyBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgVmFsaWRhdGlvbkVycm9yKGBzb3VyY2VzLiR7aWR9YCwgbnVsbCwgJ1wiY2FudmFzXCIgbXVzdCBiZSBlaXRoZXIgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBJRCBvZiB0aGUgY2FudmFzIGVsZW1lbnQgZnJvbSB3aGljaCB0byByZWFkLCBvciBhbiBIVE1MQ2FudmFzRWxlbWVudCBpbnN0YW5jZScpKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmFuaW1hdGUgPSBvcHRpb25zLmFuaW1hdGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYW5pbWF0ZSA6IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBhbmltYXRpb24uIFRoZSBpbWFnZSB3aWxsIGJlIGNvcGllZCBmcm9tIHRoZSBjYW52YXMgdG8gdGhlIG1hcCBvbiBlYWNoIGZyYW1lLlxuICAgICAqXG4gICAgICogQG1ldGhvZCBwbGF5XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIENhbnZhc1NvdXJjZVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgYW5pbWF0aW9uLiBUaGUgbWFwIHdpbGwgZGlzcGxheSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBjYW52YXMgaW1hZ2UuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIHBhdXNlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIENhbnZhc1NvdXJjZVxuICAgICAqL1xuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSAodGhpcy5vcHRpb25zLmNhbnZhcyBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCkgP1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jYW52YXMgOlxuICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuY2FudmFzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5jYW52YXMud2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0O1xuXG4gICAgICAgIGlmICh0aGlzLl9oYXNJbnZhbGlkRGltZW5zaW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdDYW52YXMgZGltZW5zaW9ucyBjYW5ub3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8uJykpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5fcGxheWluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLm1hcC50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIGBjYW52YXNgIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9IFRoZSBIVE1MIGBjYW52YXNgIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBBc3N1bWluZyB0aGUgZm9sbG93aW5nIGNhbnZhcyBpcyBhZGRlZCB0byB5b3VyIHBhZ2VcbiAgICAgKiAvLyA8Y2FudmFzIGlkPVwiY2FudmFzSURcIiB3aWR0aD1cIjQwMFwiIGhlaWdodD1cIjQwMFwiPjwvY2FudmFzPlxuICAgICAqIG1hcC5hZGRTb3VyY2UoJ2NhbnZhcy1zb3VyY2UnLCB7XG4gICAgICogICAgIHR5cGU6ICdjYW52YXMnLFxuICAgICAqICAgICBjYW52YXM6ICdjYW52YXNJRCcsXG4gICAgICogICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICogICAgICAgICBbOTEuNDQ2MSwgMjEuNTAwNl0sXG4gICAgICogICAgICAgICBbMTAwLjM1NDEsIDIxLjUwMDZdLFxuICAgICAqICAgICAgICAgWzEwMC4zNTQxLCAxMy45NzA2XSxcbiAgICAgKiAgICAgICAgIFs5MS40NDYxLCAxMy45NzA2XVxuICAgICAqICAgICBdXG4gICAgICogfSk7XG4gICAgICogbWFwLmdldFNvdXJjZSgnY2FudmFzLXNvdXJjZScpLmdldENhbnZhcygpOyAvLyA8Y2FudmFzIGlkPVwiY2FudmFzSURcIiB3aWR0aD1cIjQwMFwiIGhlaWdodD1cIjQwMFwiPjwvY2FudmFzPlxuICAgICAqL1xuICAgIGdldENhbnZhcygpOiBIVE1MQ2FudmFzRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbnZhcztcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgIGlmICh0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZSkgdGhpcy5wbGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNhbnZhcydzIGNvb3JkaW5hdGVzIGFuZCByZS1yZW5kZXJzIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIHNldENvb3JkaW5hdGVzXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIENhbnZhc1NvdXJjZVxuICAgICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGVzIEZvdXIgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzLFxuICAgICAqICAgcmVwcmVzZW50ZWQgYXMgYXJyYXlzIG9mIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgbnVtYmVycywgd2hpY2ggZGVmaW5lIHRoZSBjb3JuZXJzIG9mIHRoZSBjYW52YXMuXG4gICAgICogICBUaGUgY29vcmRpbmF0ZXMgc3RhcnQgYXQgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzIGFuZCBwcm9jZWVkIGluIGNsb2Nrd2lzZSBvcmRlci5cbiAgICAgKiAgIFRoZXkgZG8gbm90IGhhdmUgdG8gcmVwcmVzZW50IGEgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm5zIHtDYW52YXNTb3VyY2V9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICovXG5cbiAgICAvLyBzZXRDb29yZGluYXRlcyBpbmhlcml0ZWQgZnJvbSBJbWFnZVNvdXJjZVxuXG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgbGV0IHJlc2l6ZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5jYW52YXMud2lkdGggIT09IHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmNhbnZhcy53aWR0aDtcbiAgICAgICAgICAgIHJlc2l6ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzLmhlaWdodCAhPT0gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0O1xuICAgICAgICAgICAgcmVzaXplID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9oYXNJbnZhbGlkRGltZW5zaW9ucygpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuOyAvLyBub3QgZW5vdWdoIGRhdGEgZm9yIGN1cnJlbnQgcG9zaXRpb25cblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5tYXAucGFpbnRlci5jb250ZXh0O1xuXG4gICAgICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB0aGlzLmNhbnZhcywgY29udGV4dC5nbC5SR0JBLCB7cHJlbXVsdGlwbHk6IHRydWV9KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNpemUgfHwgdGhpcy5fcGxheWluZykge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlLnVwZGF0ZSh0aGlzLmNhbnZhcywge3ByZW11bHRpcGx5OiB0cnVlfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wcmVwYXJlRGF0YShjb250ZXh0KTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogT2JqZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6ICdjYW52YXMnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IHRoaXMuY29vcmRpbmF0ZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGxheWluZztcbiAgICB9XG5cbiAgICBfaGFzSW52YWxpZERpbWVuc2lvbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3QgeCBvZiBbdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodF0pIHtcbiAgICAgICAgICAgIGlmIChpc05hTih4KSB8fCB4IDw9IDApIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENhbnZhc1NvdXJjZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZS5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcbmltcG9ydCBUaWxlQm91bmRzIGZyb20gJy4vdGlsZV9ib3VuZHMuanMnO1xuaW1wb3J0IFJhc3RlclRpbGVTb3VyY2UgZnJvbSAnLi9yYXN0ZXJfdGlsZV9zb3VyY2UuanMnO1xuaW1wb3J0IHtleHRlbmQsIHBpY2t9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge0V2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwLmpzJztcbmltcG9ydCB0eXBlIERpc3BhdGNoZXIgZnJvbSAnLi4vdXRpbC9kaXNwYXRjaGVyLmpzJztcbmltcG9ydCB0eXBlIHtTb3VyY2V9IGZyb20gJy4vc291cmNlLmpzJztcbmltcG9ydCB0eXBlIHtDYWxsYmFja30gZnJvbSAnLi4vdHlwZXMvY2FsbGJhY2suanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4vdGlsZV9pZC5qcyc7XG5cbnR5cGUgRGF0YVR5cGUgPSAncmFzdGVyJztcblxuZnVuY3Rpb24gaXNSYXN0ZXIoZGF0YTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRhdGEgaW5zdGFuY2VvZiB3aW5kb3cuSW1hZ2VEYXRhIHx8XG4gICAgICAgIGRhdGEgaW5zdGFuY2VvZiB3aW5kb3cuSW1hZ2VCaXRtYXAgfHxcbiAgICAgICAgZGF0YSBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudDtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGN1c3RvbSBzb3VyY2VzLiBUaGlzIGlzIGEgc3BlY2lmaWNhdGlvbiBmb3JcbiAqIGltcGxlbWVudGVycyB0byBtb2RlbDogaXQgaXMgbm90IGFuIGV4cG9ydGVkIG1ldGhvZCBvciBjbGFzcy5cbiAqXG4gKiBDdXN0b20gc291cmNlcyBhbGxvdyBhIHVzZXIgdG8gbG9hZCBhbmQgbW9kaWZ5IHRoZWlyIG93biB0aWxlcy5cbiAqIFRoZXNlIHNvdXJjZXMgY2FuIGJlIGFkZGVkIGJldHdlZW4gYW55IHJlZ3VsYXIgc291cmNlcyB1c2luZyB7QGxpbmsgTWFwI2FkZFNvdXJjZX0uXG4gKlxuICogQ3VzdG9tIHNvdXJjZXMgbXVzdCBoYXZlIGEgdW5pcXVlIGBpZGAgYW5kIG11c3QgaGF2ZSB0aGUgYHR5cGVgIG9mIGBcImN1c3RvbVwiYC5cbiAqIFRoZXkgbXVzdCBpbXBsZW1lbnQgYGxvYWRUaWxlYCBhbmQgbWF5IGltcGxlbWVudCBgdW5sb2FkVGlsZWAsIGBwcmVwYXJlVGlsZWAsIGBvbkFkZGAgYW5kIGBvblJlbW92ZWAuXG4gKiBUaGV5IGNhbiB0cmlnZ2VyIHJlbmRlcmluZyB1c2luZyB7QGxpbmsgTWFwI3RyaWdnZXJSZXBhaW50fS5cbiAqXG4gKiBAaW50ZXJmYWNlIEN1c3RvbVNvdXJjZUludGVyZmFjZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIEEgdW5pcXVlIHNvdXJjZSBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSBzb3VyY2UncyB0eXBlLiBNdXN0IGJlIGBcImN1c3RvbVwiYC5cbiAqIEBleGFtcGxlXG4gKiAvLyBDdXN0b20gc291cmNlIGltcGxlbWVudGVkIGFzIEVTNiBjbGFzc1xuICogY2xhc3MgQ3VzdG9tU291cmNlIHtcbiAqICAgICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgICAgICAgdGhpcy5pZCA9ICdjdXN0b20tc291cmNlJztcbiAqICAgICAgICAgdGhpcy50eXBlID0gJ2N1c3RvbSc7XG4gKiAgICAgICAgIHRoaXMudGlsZVNpemUgPSAyNTY7XG4gKiAgICAgICAgIHRoaXMudGlsZXNVcmwgPSAnaHR0cHM6Ly9zdGFtZW4tdGlsZXMuYS5zc2wuZmFzdGx5Lm5ldC93YXRlcmNvbG9yL3t6fS97eH0ve3l9LmpwZyc7XG4gKiAgICAgICAgIHRoaXMuYXR0cmlidXRpb24gPSAnTWFwIHRpbGVzIGJ5IFN0YW1lbiBEZXNpZ24sIHVuZGVyIENDIEJZIDMuMCc7XG4gKiAgICAgfVxuICpcbiAqICAgICBhc3luYyBsb2FkVGlsZSh0aWxlLCB7c2lnbmFsfSkge1xuICogICAgICAgICBjb25zdCB1cmwgPSB0aGlzLnRpbGVzVXJsXG4gKiAgICAgICAgICAgICAucmVwbGFjZSgne3p9JywgU3RyaW5nKHRpbGUueikpXG4gKiAgICAgICAgICAgICAucmVwbGFjZSgne3h9JywgU3RyaW5nKHRpbGUueCkpXG4gKiAgICAgICAgICAgICAucmVwbGFjZSgne3l9JywgU3RyaW5nKHRpbGUueSkpO1xuICpcbiAqICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtzaWduYWx9KTtcbiAqICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCk7XG4gKlxuICogICAgICAgICBjb25zdCBibG9iID0gbmV3IHdpbmRvdy5CbG9iKFtuZXcgVWludDhBcnJheShkYXRhKV0sIHt0eXBlOiAnaW1hZ2UvcG5nJ30pO1xuICogICAgICAgICBjb25zdCBpbWFnZUJpdG1hcCA9IGF3YWl0IHdpbmRvdy5jcmVhdGVJbWFnZUJpdG1hcChibG9iKTtcbiAqXG4gKiAgICAgICAgIHJldHVybiBpbWFnZUJpdG1hcDtcbiAqICAgICB9XG4gKiB9XG4gKlxuICogbWFwLm9uKCdsb2FkJywgKCkgPT4ge1xuICogICAgIG1hcC5hZGRTb3VyY2UoJ2N1c3RvbS1zb3VyY2UnLCBuZXcgQ3VzdG9tU291cmNlKCkpO1xuICogICAgIG1hcC5hZGRMYXllcih7XG4gKiAgICAgICAgIGlkOiAnbGF5ZXInLFxuICogICAgICAgICB0eXBlOiAncmFzdGVyJyxcbiAqICAgICAgICAgc291cmNlOiAnY3VzdG9tLXNvdXJjZSdcbiAqICAgICB9KTtcbiAqIH0pO1xuICovXG5cbi8qKlxuICogT3B0aW9uYWwgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBzb3VyY2UgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIE1hcCB3aXRoIHtAbGluayBNYXAjYWRkU291cmNlfS5cbiAqIFRoaXMgZ2l2ZXMgdGhlIHNvdXJjZSBhIGNoYW5jZSB0byBpbml0aWFsaXplIHJlc291cmNlcyBhbmQgcmVnaXN0ZXIgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIEN1c3RvbVNvdXJjZUludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvbkFkZFxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY3VzdG9tIHNvdXJjZSB3YXMganVzdCBhZGRlZCB0by5cbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgc291cmNlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgTWFwIHdpdGgge0BsaW5rIE1hcCNyZW1vdmVTb3VyY2V9LlxuICogVGhpcyBnaXZlcyB0aGUgc291cmNlIGEgY2hhbmNlIHRvIGNsZWFuIHVwIHJlc291cmNlcyBhbmQgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIEN1c3RvbVNvdXJjZUludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvblJlbW92ZVxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY3VzdG9tIHNvdXJjZSB3YXMgYWRkZWQgdG8uXG4gKi9cblxuLyoqXG4gKiBPcHRpb25hbCBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSB0aWxlIGlzIHVubG9hZGVkIGZyb20gdGhlIG1hcCB2aWV3cG9ydC4gVGhpc1xuICogZ2l2ZXMgdGhlIHNvdXJjZSBhIGNoYW5jZSB0byBjbGVhbiB1cCByZXNvdXJjZXMgYW5kIGV2ZW50IGxpc3RlbmVycy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBDdXN0b21Tb3VyY2VJbnRlcmZhY2VcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgdW5sb2FkVGlsZVxuICogQHBhcmFtIHt7IHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIgfX0gdGlsZSBUaWxlIG5hbWUgdG8gdW5sb2FkIGluIHRoZSBYWVogc2NoZW1lIGZvcm1hdC5cbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgZHVyaW5nIGEgcmVuZGVyIGZyYW1lIHRvIGNoZWNrIGlmIHRoZXJlIGlzIGEgdGlsZSB0byByZW5kZXIuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgQ3VzdG9tU291cmNlSW50ZXJmYWNlXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIGhhc1RpbGVcbiAqIEBwYXJhbSB7eyB6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyIH19IHRpbGUgVGlsZSBuYW1lIHRvIHByZXBhcmUgaW4gdGhlIFhZWiBzY2hlbWUgZm9ybWF0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGlsZSBleGlzdHMsIG90aGVyd2lzZSBmYWxzZS5cbiAqL1xuXG4vKipcbiAqIE9wdGlvbmFsIG1ldGhvZCBjYWxsZWQgZHVyaW5nIGEgcmVuZGVyIGZyYW1lIHRvIGFsbG93IGEgc291cmNlIHRvIHByZXBhcmUgYW5kIG1vZGlmeSBhIHRpbGUgdGV4dHVyZSBpZiBuZWVkZWQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgQ3VzdG9tU291cmNlSW50ZXJmYWNlXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIHByZXBhcmVUaWxlXG4gKiBAcGFyYW0ge3sgejogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciB9fSB0aWxlIFRpbGUgbmFtZSB0byBwcmVwYXJlIGluIHRoZSBYWVogc2NoZW1lIGZvcm1hdC5cbiAqIEByZXR1cm5zIHtUZXh0dXJlSW1hZ2V9IFRoZSB0aWxlIGltYWdlIGRhdGEgYXMgYW4gYEhUTUxJbWFnZUVsZW1lbnRgLCBgSW1hZ2VEYXRhYCwgYEltYWdlQml0bWFwYCBvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYC5cbiAqL1xuXG4vKipcbiAqIENhbGxlZCB3aGVuIHRoZSBtYXAgc3RhcnRzIGxvYWRpbmcgdGlsZSBmb3IgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIGZyYW1lLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIEN1c3RvbVNvdXJjZUludGVyZmFjZVxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBsb2FkVGlsZVxuICogQHBhcmFtIHt7IHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIgfX0gdGlsZSBUaWxlIG5hbWUgdG8gbG9hZCBpbiB0aGUgWFlaIHNjaGVtZSBmb3JtYXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBPcHRpb25zLlxuICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gb3B0aW9ucy5zaWduYWwgQSBzaWduYWwgb2JqZWN0IHRoYXQgYWxsb3dzIHRoZSBtYXAgdG8gY2FuY2VsIHRpbGUgbG9hZGluZyByZXF1ZXN0LlxuICogQHJldHVybnMge1Byb21pc2U8VGV4dHVyZUltYWdlPn0gVGhlIHRpbGUgaW1hZ2UgZGF0YSBhcyBhbiBgSFRNTEltYWdlRWxlbWVudGAsIGBJbWFnZURhdGFgLCBgSW1hZ2VCaXRtYXBgIG9yIG9iamVjdCB3aXRoIGB3aWR0aGAsIGBoZWlnaHRgLCBhbmQgYGRhdGFgLlxuICovXG5leHBvcnQgdHlwZSBDdXN0b21Tb3VyY2VJbnRlcmZhY2U8VD4gPSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICBkYXRhVHlwZTogP0RhdGFUeXBlLFxuICAgIG1pbnpvb206ID9udW1iZXIsXG4gICAgbWF4em9vbTogP251bWJlcixcbiAgICBzY2hlbWU6ID9zdHJpbmc7XG4gICAgdGlsZVNpemU6ID9udW1iZXIsXG4gICAgYXR0cmlidXRpb246ID9zdHJpbmcsXG4gICAgYm91bmRzOiA/W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgaGFzVGlsZTogPyh0aWxlSUQ6IHsgejogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciB9KSA9PiBib29sZWFuLFxuICAgIGxvYWRUaWxlOiAodGlsZUlEOiB7IHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIgfSwgb3B0aW9uczogeyBzaWduYWw6IEFib3J0U2lnbmFsIH0pID0+IFByb21pc2U8VD4sXG4gICAgcHJlcGFyZVRpbGU6ID8odGlsZUlEOiB7IHo6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIgfSkgPT4gP1QsXG4gICAgdW5sb2FkVGlsZTogPyh0aWxlSUQ6IHsgejogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciB9KSA9PiB2b2lkLFxuICAgIG9uQWRkOiA/KG1hcDogTWFwKSA9PiB2b2lkLFxuICAgIG9uUmVtb3ZlOiA/KG1hcDogTWFwKSA9PiB2b2lkLFxufVxuXG5jbGFzcyBDdXN0b21Tb3VyY2U8VD4gZXh0ZW5kcyBFdmVudGVkIGltcGxlbWVudHMgU291cmNlIHtcblxuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogJ2N1c3RvbSc7XG4gICAgc2NoZW1lOiBzdHJpbmc7XG4gICAgbWluem9vbTogbnVtYmVyO1xuICAgIG1heHpvb206IG51bWJlcjtcbiAgICB0aWxlU2l6ZTogbnVtYmVyO1xuICAgIGF0dHJpYnV0aW9uOiBzdHJpbmc7XG5cbiAgICByb3VuZFpvb206IGJvb2xlYW47XG4gICAgdGlsZUJvdW5kczogP1RpbGVCb3VuZHM7XG4gICAgbWluVGlsZUNhY2hlU2l6ZTogP251bWJlcjtcbiAgICBtYXhUaWxlQ2FjaGVTaXplOiA/bnVtYmVyO1xuXG4gICAgX21hcDogTWFwO1xuICAgIF9sb2FkZWQ6IGJvb2xlYW47XG4gICAgX2Rpc3BhdGNoZXI6IERpc3BhdGNoZXI7XG4gICAgX2RhdGFUeXBlOiA/RGF0YVR5cGU7XG4gICAgX2ltcGxlbWVudGF0aW9uOiBDdXN0b21Tb3VyY2VJbnRlcmZhY2U8VD47XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nLCBpbXBsZW1lbnRhdGlvbjogQ3VzdG9tU291cmNlSW50ZXJmYWNlPFQ+LCBkaXNwYXRjaGVyOiBEaXNwYXRjaGVyLCBldmVudGVkUGFyZW50OiBFdmVudGVkKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy50eXBlID0gJ2N1c3RvbSc7XG4gICAgICAgIHRoaXMuX2RhdGFUeXBlID0gJ3Jhc3Rlcic7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuICAgICAgICB0aGlzLl9pbXBsZW1lbnRhdGlvbiA9IGltcGxlbWVudGF0aW9uO1xuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XG5cbiAgICAgICAgdGhpcy5zY2hlbWUgPSAneHl6JztcbiAgICAgICAgdGhpcy5taW56b29tID0gMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMjI7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XG5cbiAgICAgICAgdGhpcy5fbG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucm91bmRab29tID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXRoaXMuX2ltcGxlbWVudGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBNaXNzaW5nIGltcGxlbWVudGF0aW9uIGZvciAke3RoaXMuaWR9IGN1c3RvbSBzb3VyY2VgKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9pbXBsZW1lbnRhdGlvbi5sb2FkVGlsZSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgTWlzc2luZyBsb2FkVGlsZSBpbXBsZW1lbnRhdGlvbiBmb3IgJHt0aGlzLmlkfSBjdXN0b20gc291cmNlYCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pbXBsZW1lbnRhdGlvbi5ib3VuZHMpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZUJvdW5kcyA9IG5ldyBUaWxlQm91bmRzKHRoaXMuX2ltcGxlbWVudGF0aW9uLmJvdW5kcywgdGhpcy5taW56b29tLCB0aGlzLm1heHpvb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICAgIGltcGxlbWVudGF0aW9uLnVwZGF0ZSA9IHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgICBpbXBsZW1lbnRhdGlvbi5jb3ZlcmluZ1RpbGVzID0gdGhpcy5fY292ZXJpbmdUaWxlcy5iaW5kKHRoaXMpO1xuXG4gICAgICAgIGV4dGVuZCh0aGlzLCBwaWNrKGltcGxlbWVudGF0aW9uLCBbJ2RhdGFUeXBlJywgJ3NjaGVtZScsICdtaW56b29tJywgJ21heHpvb20nLCAndGlsZVNpemUnLCAnYXR0cmlidXRpb24nLCAnbWluVGlsZUNhY2hlU2l6ZScsICdtYXhUaWxlQ2FjaGVTaXplJ10pKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU291cmNlIHtcbiAgICAgICAgcmV0dXJuIHBpY2sodGhpcywgWyd0eXBlJywgJ3NjaGVtZScsICdtaW56b29tJywgJ21heHpvb20nLCAndGlsZVNpemUnLCAnYXR0cmlidXRpb24nXSk7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnbWV0YWRhdGEnfSkpO1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJywgc291cmNlRGF0YVR5cGU6ICdjb250ZW50J30pKTtcbiAgICB9XG5cbiAgICBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQ7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSkpO1xuICAgICAgICBpZiAodGhpcy5faW1wbGVtZW50YXRpb24ub25BZGQpIHRoaXMuX2ltcGxlbWVudGF0aW9uLm9uQWRkKG1hcCk7XG4gICAgICAgIHRoaXMubG9hZCgpO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKG1hcDogTWFwKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9pbXBsZW1lbnRhdGlvbi5vblJlbW92ZSkge1xuICAgICAgICAgICAgdGhpcy5faW1wbGVtZW50YXRpb24ub25SZW1vdmUobWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhc1RpbGUodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9pbXBsZW1lbnRhdGlvbi5oYXNUaWxlKSB7XG4gICAgICAgICAgICBjb25zdCB7eCwgeSwgen0gPSB0aWxlSUQuY2Fub25pY2FsO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ltcGxlbWVudGF0aW9uLmhhc1RpbGUoe3gsIHksIHp9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdGhpcy50aWxlQm91bmRzIHx8IHRoaXMudGlsZUJvdW5kcy5jb250YWlucyh0aWxlSUQuY2Fub25pY2FsKTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qge3gsIHksIHp9ID0gdGlsZS50aWxlSUQuY2Fub25pY2FsO1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IHdpbmRvdy5BYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgY29uc3Qgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX2ltcGxlbWVudGF0aW9uLmxvYWRUaWxlKHt4LCB5LCB6fSwge3NpZ25hbH0pO1xuICAgICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBpbWFnZSBhbmQgc2V0IHRoZSB0aWxlIHN0YXRlIHRvIGBsb2FkZWRgXG4gICAgICAgICAgICAvLyBpZiB0aGUgaW1wbGVtZW50YXRpb24gZGlkbid0IHJldHVybiB0aGUgYXN5bmMgdGlsZSByZXF1ZXN0XG4gICAgICAgICAgICBjb25zdCBlbXB0eUltYWdlID0ge3dpZHRoOiB0aGlzLnRpbGVTaXplLCBoZWlnaHQ6IHRoaXMudGlsZVNpemUsIGRhdGE6IG51bGx9O1xuICAgICAgICAgICAgdGhpcy5sb2FkVGlsZURhdGEodGlsZSwgKGVtcHR5SW1hZ2U6IGFueSkpO1xuICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgICAgIHJlcXVlc3QuY2FuY2VsID0gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuXG4gICAgICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgICB0aWxlLnJlcXVlc3QgPSByZXF1ZXN0LnRoZW4odGlsZUxvYWRlZC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzaWxlbmNlIEFib3J0RXJyb3JcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMjApIHJldHVybjtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIHRpbGVMb2FkZWQoZGF0YSkge1xuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcblxuICAgICAgICAgICAgaWYgKHRpbGUuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGltYWdlIGFuZCBzZXQgdGhlIHRpbGUgc3RhdGUgdG8gYGxvYWRlZGBcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgbm8gdGlsZSBkYXRhXG4gICAgICAgICAgICAgICAgY29uc3QgZW1wdHlJbWFnZSA9IHt3aWR0aDogdGhpcy50aWxlU2l6ZSwgaGVpZ2h0OiB0aGlzLnRpbGVTaXplLCBkYXRhOiBudWxsfTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRUaWxlRGF0YSh0aWxlLCAoZW1wdHlJbWFnZTogYW55KSk7XG4gICAgICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc1Jhc3RlcihkYXRhKSkge1xuICAgICAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnZXJyb3JlZCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgQ2FuJ3QgaW5mZXIgZGF0YSB0eXBlIGZvciAke3RoaXMuaWR9LCBvbmx5IHJhc3RlciBkYXRhIHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50YCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRUaWxlRGF0YSh0aWxlLCBkYXRhKTtcbiAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZFRpbGVEYXRhKHRpbGU6IFRpbGUsIGRhdGE6IFQpOiB2b2lkIHtcbiAgICAgICAgLy8gT25seSByYXN0ZXIgZGF0YSBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudFxuICAgICAgICBSYXN0ZXJUaWxlU291cmNlLmxvYWRUaWxlRGF0YSh0aWxlLCAoZGF0YTogYW55KSwgdGhpcy5fbWFwLnBhaW50ZXIpO1xuICAgIH1cblxuICAgIHVubG9hZFRpbGVEYXRhKHRpbGU6IFRpbGUpOiB2b2lkIHtcbiAgICAgICAgLy8gT25seSByYXN0ZXIgZGF0YSBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudFxuICAgICAgICBSYXN0ZXJUaWxlU291cmNlLnVubG9hZFRpbGVEYXRhKHRpbGUsIHRoaXMuX21hcC5wYWludGVyKTtcbiAgICB9XG5cbiAgICBwcmVwYXJlVGlsZSh0aWxlOiBUaWxlKTogP1Qge1xuICAgICAgICBpZiAoIXRoaXMuX2ltcGxlbWVudGF0aW9uLnByZXBhcmVUaWxlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB7eCwgeSwgen0gPSB0aWxlLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9pbXBsZW1lbnRhdGlvbi5wcmVwYXJlVGlsZSh7eCwgeSwgen0pO1xuICAgICAgICBpZiAoIWRhdGEpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHRoaXMubG9hZFRpbGVEYXRhKHRpbGUsIGRhdGEpO1xuICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHVubG9hZFRpbGUodGlsZTogVGlsZSwgY2FsbGJhY2s6IENhbGxiYWNrPHZvaWQ+KTogdm9pZCB7XG4gICAgICAgIHRoaXMudW5sb2FkVGlsZURhdGEodGlsZSk7XG4gICAgICAgIGlmICh0aGlzLl9pbXBsZW1lbnRhdGlvbi51bmxvYWRUaWxlKSB7XG4gICAgICAgICAgICBjb25zdCB7eCwgeSwgen0gPSB0aWxlLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgICAgICB0aGlzLl9pbXBsZW1lbnRhdGlvbi51bmxvYWRUaWxlKHt4LCB5LCB6fSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIGFib3J0VGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRpbGUucmVxdWVzdCAmJiB0aWxlLnJlcXVlc3QuY2FuY2VsKSB7XG4gICAgICAgICAgICB0aWxlLnJlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX2NvdmVyaW5nVGlsZXMoKTogeyB6OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyIH1bXSB7XG4gICAgICAgIGNvbnN0IHRpbGVJRHMgPSB0aGlzLl9tYXAudHJhbnNmb3JtLmNvdmVyaW5nVGlsZXMoe1xuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgICBtaW56b29tOiB0aGlzLm1pbnpvb20sXG4gICAgICAgICAgICBtYXh6b29tOiB0aGlzLm1heHpvb20sXG4gICAgICAgICAgICByb3VuZFpvb206IHRoaXMucm91bmRab29tXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aWxlSURzLm1hcCh0aWxlSUQgPT4gKHt4OiB0aWxlSUQuY2Fub25pY2FsLngsIHk6IHRpbGVJRC5jYW5vbmljYWwueSwgejogdGlsZUlELmNhbm9uaWNhbC56fSkpO1xuICAgIH1cblxuICAgIF91cGRhdGUoKSB7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnLCBzb3VyY2VEYXRhVHlwZTogJ2NvbnRlbnQnfSkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ3VzdG9tU291cmNlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtiaW5kQWxsfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuXG5pbXBvcnQgdHlwZSBEaXNwYXRjaGVyIGZyb20gJy4uL3V0aWwvZGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgdHlwZSB7RXZlbnQsIEV2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vdWkvbWFwLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi90aWxlLmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge0NhbGxiYWNrfSBmcm9tICcuLi90eXBlcy9jYWxsYmFjay5qcyc7XG5pbXBvcnQge0Nhbm9uaWNhbFRpbGVJRH0gZnJvbSAnLi90aWxlX2lkLmpzJztcblxuLyoqXG4gKiBUaGUgYFNvdXJjZWAgaW50ZXJmYWNlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgZWFjaCBzb3VyY2UgdHlwZSwgaW5jbHVkaW5nIFwiY29yZVwiIHR5cGVzIGxpa2UgYHZlY3RvcmAsIGByYXN0ZXJgLFxuICogb3IgYHZpZGVvYCkgYW5kIGFsbCBjdXN0b20sIHRoaXJkLXBhcnR5IHR5cGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gTXVzdCBub3QgYmUgdXNlZCBieSBhbnkgZXhpc3Rpbmcgc291cmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgU291cmNlIG9wdGlvbnMsIHNwZWNpZmljIHRvIHRoZSBzb3VyY2UgdHlwZSAoZXhjZXB0IGZvciBgb3B0aW9ucy50eXBlYCwgd2hpY2ggaXMgYWx3YXlzXG4gKiByZXF1aXJlZCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIFRoZSBzb3VyY2UgdHlwZSwgbWF0Y2hpbmcgdGhlIHZhbHVlIG9mIGBuYW1lYCB1c2VkIGluIHtAbGluayBTdHlsZSNhZGRTb3VyY2VUeXBlfS5cbiAqIEBwYXJhbSB7RGlzcGF0Y2hlcn0gZGlzcGF0Y2hlciBBIHtAbGluayBEaXNwYXRjaGVyfSBpbnN0YW5jZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgd29ya2Vycy5cbiAqXG4gKiBAZmlyZXMgTWFwLmV2ZW50OmRhdGEgRmlyZXMgYGRhdGFgIHdpdGggYHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnbWV0YWRhdGEnfWBcbiAqIHRvIGluZGljYXRlIHRoYXQgYW55IG5lY2Vzc2FyeSBtZXRhZGF0YSBoYXMgYmVlbiBsb2FkZWQgc28gdGhhdCBpdCdzIG9rYXkgdG8gY2FsbCBgbG9hZFRpbGVgO1xuICogZmlyZXMgYGRhdGFgIHdpdGggYHtkYXRhVHlwZTogJ3NvdXJjZScsIHNvdXJjZURhdGFUeXBlOiAnY29udGVudCd9YFxuICogdG8gaW5kaWNhdGUgdGhhdCB0aGUgc291cmNlIGRhdGEgaGFzIGNoYW5nZWQsIHNvIHRoYXQgYW55IGN1cnJlbnQgY2FjaGVzIHNob3VsZCBiZSBmbHVzaGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gIE11c3QgbWF0Y2ggdGhlIGlkIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWluem9vbVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heHpvb21cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNUaWxlQ2xpcHBlZCBgZmFsc2VgIGlmIHRpbGVzIGNhbiBiZSBkcmF3biBvdXRzaWRlIHRoZWlyIGJvdW5kYXJpZXMsIGB0cnVlYCBpZiB0aGV5IGNhbm5vdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwYXJzZU92ZXJzY2FsZWQgYHRydWVgIGlmIHRpbGVzIHNob3VsZCBiZSBzZW50IGJhY2sgdG8gdGhlIHdvcmtlciBmb3IgZWFjaCBvdmVyem9vbWVkIHpvb21cbiAqIGxldmVsLCBgZmFsc2VgIGlmIG5vdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcm91bmRab29tIGB0cnVlYCBpZiB6b29tIGxldmVscyBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGluIHRoZSBzb3VyY2UgZGF0YSwgYGZhbHNlYFxuICogaWYgdGhleSBhcmUgZmxvb3ItZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb3VyY2Uge1xuICAgICt0eXBlOiBzdHJpbmc7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtaW56b29tOiBudW1iZXIsXG4gICAgbWF4em9vbTogbnVtYmVyLFxuICAgIHRpbGVTaXplOiBudW1iZXIsXG4gICAgYXR0cmlidXRpb24/OiBzdHJpbmcsXG5cbiAgICByb3VuZFpvb20/OiBib29sZWFuLFxuICAgIGlzVGlsZUNsaXBwZWQ/OiBib29sZWFuLFxuICAgIG1hcGJveF9sb2dvPzogYm9vbGVhbixcbiAgICB0aWxlSUQ/OiBDYW5vbmljYWxUaWxlSUQ7XG4gICAgcmVwYXJzZU92ZXJzY2FsZWQ/OiBib29sZWFuLFxuICAgIHZlY3RvckxheWVySWRzPzogQXJyYXk8c3RyaW5nPixcbiAgICBtaW5UaWxlQ2FjaGVTaXplPzogP251bWJlcjtcbiAgICBtYXhUaWxlQ2FjaGVTaXplPzogP251bWJlcjtcbiAgICBsYW5ndWFnZT86ID9zdHJpbmc7XG4gICAgd29ybGR2aWV3PzogP3N0cmluZztcblxuICAgIGhhc1RyYW5zaXRpb24oKTogYm9vbGVhbjtcbiAgICBsb2FkZWQoKTogYm9vbGVhbjtcblxuICAgIGZpcmUoZXZlbnQ6IEV2ZW50KTogbWl4ZWQ7XG4gICAgb24odHlwZTogKiwgbGlzdGVuZXI6IChPYmplY3QpID0+IGFueSk6IEV2ZW50ZWQ7XG4gICAgc2V0RXZlbnRlZFBhcmVudChwYXJlbnQ6ID9FdmVudGVkLCBkYXRhPzogT2JqZWN0IHwgKCkgPT4gT2JqZWN0KTogRXZlbnRlZDtcblxuICAgICtvbkFkZD86IChtYXA6IE1hcCkgPT4gdm9pZDtcbiAgICArb25SZW1vdmU/OiAobWFwOiBNYXApID0+IHZvaWQ7XG5cbiAgICBsb2FkVGlsZSh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4sIHRpbGVXb3JrZXJzPzoge1tzdHJpbmddOiBBY3Rvcn0pOiB2b2lkO1xuICAgICtoYXNUaWxlPzogKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkgPT4gYm9vbGVhbjtcbiAgICArYWJvcnRUaWxlPzogKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikgPT4gdm9pZDtcbiAgICArdW5sb2FkVGlsZT86ICh0aWxlOiBUaWxlLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pID0+IHZvaWQ7XG4gICAgK3ByZXBhcmVUaWxlPzogKHRpbGU6IFRpbGUpID0+ID9hbnk7XG4gICAgK19zZXRMYW5ndWFnZT86IChsYW5ndWFnZT86ID9zdHJpbmcpID0+IFNvdXJjZTtcbiAgICArX3NldFdvcmxkdmlldz86ICh3b3JsZHZpZXc/OiA/c3RyaW5nKSA9PiBTb3VyY2U7XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBBIHBsYWluIChzdHJpbmdpZmlhYmxlKSBKUyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzb3VyY2UuXG4gICAgICogQ3JlYXRpbmcgYSBzb3VyY2UgdXNpbmcgdGhlIHJldHVybmVkIG9iamVjdCBhcyB0aGUgYG9wdGlvbnNgIHNob3VsZCByZXN1bHQgaW4gYSBTb3VyY2UgdGhhdCBpc1xuICAgICAqIGVxdWl2YWxlbnQgdG8gdGhpcyBvbmUuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXJpYWxpemUoKTogT2JqZWN0O1xuXG4gICAgK3ByZXBhcmU/OiAoKSA9PiB2b2lkO1xuXG4gICAgK2FmdGVyVXBkYXRlPzogKCkgPT4gdm9pZDtcbiAgICArX2NsZWFyPzogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBTb3VyY2VTdGF0aWNzID0ge1xuICAgIC8qXG4gICAgICogQW4gb3B0aW9uYWwgVVJMIHRvIGEgc2NyaXB0IHdoaWNoLCB3aGVuIHJ1biBieSBhIFdvcmtlciwgcmVnaXN0ZXJzIGEge0BsaW5rIFdvcmtlclNvdXJjZX1cbiAgICAgKiBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBTb3VyY2UgdHlwZSBieSBjYWxsaW5nIGBzZWxmLnJlZ2lzdGVyV29ya2VyU291cmNlKHdvcmtlclNvdXJjZTogV29ya2VyU291cmNlKWAuXG4gICAgICovXG4gICAgd29ya2VyU291cmNlVVJMPzogVVJMO1xufTtcblxuZXhwb3J0IHR5cGUgU291cmNlQ2xhc3MgPSBDbGFzczxTb3VyY2U+ICYgU291cmNlU3RhdGljcztcblxuaW1wb3J0IHZlY3RvciBmcm9tICcuLi9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlLmpzJztcbmltcG9ydCByYXN0ZXIgZnJvbSAnLi4vc291cmNlL3Jhc3Rlcl90aWxlX3NvdXJjZS5qcyc7XG5pbXBvcnQgcmFzdGVyRGVtIGZyb20gJy4uL3NvdXJjZS9yYXN0ZXJfZGVtX3RpbGVfc291cmNlLmpzJztcbmltcG9ydCBnZW9qc29uIGZyb20gJy4uL3NvdXJjZS9nZW9qc29uX3NvdXJjZS5qcyc7XG5pbXBvcnQgdmlkZW8gZnJvbSAnLi4vc291cmNlL3ZpZGVvX3NvdXJjZS5qcyc7XG5pbXBvcnQgaW1hZ2UgZnJvbSAnLi4vc291cmNlL2ltYWdlX3NvdXJjZS5qcyc7XG5pbXBvcnQgY2FudmFzIGZyb20gJy4uL3NvdXJjZS9jYW52YXNfc291cmNlLmpzJztcbmltcG9ydCBjdXN0b20gZnJvbSAnLi4vc291cmNlL2N1c3RvbV9zb3VyY2UuanMnO1xuXG5pbXBvcnQgdHlwZSB7U291cmNlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5cbmNvbnN0IHNvdXJjZVR5cGVzID0ge1xuICAgIHZlY3RvcixcbiAgICByYXN0ZXIsXG4gICAgJ3Jhc3Rlci1kZW0nOiByYXN0ZXJEZW0sXG4gICAgZ2VvanNvbixcbiAgICB2aWRlbyxcbiAgICBpbWFnZSxcbiAgICBjYW52YXMsXG4gICAgY3VzdG9tXG59O1xuXG4vKlxuICogQ3JlYXRlcyBhIHRpbGVkIGRhdGEgc291cmNlIGluc3RhbmNlIGdpdmVuIGFuIG9wdGlvbnMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBpZFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBBIHNvdXJjZSBkZWZpbml0aW9uIG9iamVjdCBjb21wbGlhbnQgd2l0aFxuICogW2BtYXBib3gtZ2wtc3R5bGUtc3BlY2BdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMpIG9yLCBmb3IgYSB0aGlyZC1wYXJ0eSBzb3VyY2UgdHlwZSxcbiAgKiB3aXRoIHRoYXQgdHlwZSdzIHJlcXVpcmVtZW50cy5cbiAqIEBwYXJhbSB7RGlzcGF0Y2hlcn0gZGlzcGF0Y2hlclxuICogQHJldHVybnMge1NvdXJjZX1cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZSA9IGZ1bmN0aW9uKGlkOiBzdHJpbmcsIHNwZWNpZmljYXRpb246IFNvdXJjZVNwZWNpZmljYXRpb24sIGRpc3BhdGNoZXI6IERpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQ6IEV2ZW50ZWQpOiBTb3VyY2Uge1xuICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBzb3VyY2VUeXBlc1tzcGVjaWZpY2F0aW9uLnR5cGVdKGlkLCAoc3BlY2lmaWNhdGlvbjogYW55KSwgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCk7XG5cbiAgICBpZiAoc291cmNlLmlkICE9PSBpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFNvdXJjZSBpZCB0byBiZSAke2lkfSBpbnN0ZWFkIG9mICR7c291cmNlLmlkfWApO1xuICAgIH1cblxuICAgIGJpbmRBbGwoWydsb2FkJywgJ2Fib3J0JywgJ3VubG9hZCcsICdzZXJpYWxpemUnLCAncHJlcGFyZSddLCBzb3VyY2UpO1xuICAgIHJldHVybiBzb3VyY2U7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VHlwZSA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcpOiBDbGFzczxTb3VyY2U+IHtcbiAgICByZXR1cm4gc291cmNlVHlwZXNbbmFtZV07XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0VHlwZSA9IGZ1bmN0aW9uIChuYW1lOiBzdHJpbmcsIHR5cGU6IENsYXNzPFNvdXJjZT4pIHtcbiAgICBzb3VyY2VUeXBlc1tuYW1lXSA9IHR5cGU7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjdG9yIHtcbiAgICBzZW5kKHR5cGU6IHN0cmluZywgZGF0YTogT2JqZWN0LCBjYWxsYmFjazogQ2FsbGJhY2s8YW55Pik6IHZvaWQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIENvbGxpc2lvbkluZGV4IGZyb20gJy4uL3N5bWJvbC9jb2xsaXNpb25faW5kZXguanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUge1JldGFpbmVkUXVlcnlEYXRhfSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50LmpzJztcbmltcG9ydCB0eXBlIHtGaWx0ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtRdWVyeUdlb21ldHJ5fSBmcm9tICcuLi9zdHlsZS9xdWVyeV9nZW9tZXRyeS5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge21hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge1F1ZXJ5UmVzdWx0fSBmcm9tICcuLi9kYXRhL2ZlYXR1cmVfaW5kZXguanMnO1xuaW1wb3J0IHR5cGUge1F1ZXJ5RmVhdHVyZX0gZnJvbSAnLi4vdXRpbC92ZWN0b3J0aWxlX3RvX2dlb2pzb24uanMnO1xuXG5leHBvcnQgdHlwZSBSZW5kZXJlZEZlYXR1cmVMYXllcnMgPSBBcnJheTx7XG4gICAgd3JhcHBlZFRpbGVJRDogbnVtYmVyO1xuICAgIHF1ZXJ5UmVzdWx0czogUXVlcnlSZXN1bHRcbn0+O1xuXG4vKlxuICogUmV0dXJucyBhIG1hdHJpeCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgZnJvbSB0aWxlIGNvb3JkaW5hdGVzIHRvIHZpZXdwb3J0IHBpeGVsIGNvb3JkaW5hdGVzLlxuICovXG5mdW5jdGlvbiBnZXRQaXhlbFBvc01hdHJpeCh0cmFuc2Zvcm0sIHRpbGVJRCkge1xuICAgIGNvbnN0IHQgPSBtYXQ0LmlkZW50aXR5KFtdKTtcbiAgICBtYXQ0LnNjYWxlKHQsIHQsIFt0cmFuc2Zvcm0ud2lkdGggKiAwLjUsIC10cmFuc2Zvcm0uaGVpZ2h0ICogMC41LCAxXSk7XG4gICAgbWF0NC50cmFuc2xhdGUodCwgdCwgWzEsIC0xLCAwXSk7XG4gICAgbWF0NC5tdWx0aXBseSh0LCB0LCB0cmFuc2Zvcm0uY2FsY3VsYXRlUHJvak1hdHJpeCh0aWxlSUQudG9VbndyYXBwZWQoKSkpO1xuICAgIHJldHVybiBGbG9hdDMyQXJyYXkuZnJvbSh0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVMYXllcnM6IHtbXzogc3RyaW5nXTogU3R5bGVMYXllcn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZExheWVyczoge1tfOiBzdHJpbmddOiBPYmplY3R9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnk6IFF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IGZpbHRlcjogRmlsdGVyU3BlY2lmaWNhdGlvbiwgbGF5ZXJzOiBBcnJheTxzdHJpbmc+LCBhdmFpbGFibGVJbWFnZXM6IEFycmF5PHN0cmluZz4gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UzRFF1ZXJ5OiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbGl6ZVF1ZXJ5R2VvbWV0cnk6IGJvb2xlYW4gPSBmYWxzZSk6IFF1ZXJ5UmVzdWx0IHtcbiAgICBjb25zdCB0aWxlUmVzdWx0cyA9IHNvdXJjZUNhY2hlLnRpbGVzSW4ocXVlcnlHZW9tZXRyeSwgdXNlM0RRdWVyeSwgdmlzdWFsaXplUXVlcnlHZW9tZXRyeSk7XG4gICAgdGlsZVJlc3VsdHMuc29ydChzb3J0VGlsZXNJbik7XG4gICAgY29uc3QgcmVuZGVyZWRGZWF0dXJlTGF5ZXJzID0gW107XG4gICAgZm9yIChjb25zdCB0aWxlUmVzdWx0IG9mIHRpbGVSZXN1bHRzKSB7XG4gICAgICAgIHJlbmRlcmVkRmVhdHVyZUxheWVycy5wdXNoKHtcbiAgICAgICAgICAgIHdyYXBwZWRUaWxlSUQ6IHRpbGVSZXN1bHQudGlsZS50aWxlSUQud3JhcHBlZCgpLmtleSxcbiAgICAgICAgICAgIHF1ZXJ5UmVzdWx0czogdGlsZVJlc3VsdC50aWxlLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVycyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlLl9zdGF0ZSxcbiAgICAgICAgICAgICAgICB0aWxlUmVzdWx0LFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgZ2V0UGl4ZWxQb3NNYXRyaXgoc291cmNlQ2FjaGUudHJhbnNmb3JtLCB0aWxlUmVzdWx0LnRpbGUudGlsZUlEKSxcbiAgICAgICAgICAgICAgICB2aXN1YWxpemVRdWVyeUdlb21ldHJ5KVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBtZXJnZVJlbmRlcmVkRmVhdHVyZUxheWVycyhyZW5kZXJlZEZlYXR1cmVMYXllcnMpO1xuXG4gICAgLy8gTWVyZ2Ugc3RhdGUgZnJvbSBTb3VyY2VDYWNoZSBpbnRvIHRoZSByZXN1bHRzXG4gICAgZm9yIChjb25zdCBsYXllcklEIGluIHJlc3VsdCkge1xuICAgICAgICByZXN1bHRbbGF5ZXJJRF0uZm9yRWFjaCgoZmVhdHVyZVdyYXBwZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlV3JhcHBlci5mZWF0dXJlO1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBmZWF0dXJlLmxheWVyO1xuXG4gICAgICAgICAgICBpZiAoIWxheWVyIHx8IGxheWVyLnR5cGUgPT09ICdiYWNrZ3JvdW5kJyB8fCBsYXllci50eXBlID09PSAnc2t5JykgcmV0dXJuO1xuXG4gICAgICAgICAgICBmZWF0dXJlLnNvdXJjZSA9IGxheWVyLnNvdXJjZTtcbiAgICAgICAgICAgIGlmIChsYXllclsnc291cmNlLWxheWVyJ10pIHtcbiAgICAgICAgICAgICAgICBmZWF0dXJlLnNvdXJjZUxheWVyID0gbGF5ZXJbJ3NvdXJjZS1sYXllciddO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmVhdHVyZS5zdGF0ZSA9IGZlYXR1cmUuaWQgIT09IHVuZGVmaW5lZCA/IHNvdXJjZUNhY2hlLmdldEZlYXR1cmVTdGF0ZShsYXllclsnc291cmNlLWxheWVyJ10sIGZlYXR1cmUuaWQpIDoge307XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlSZW5kZXJlZFN5bWJvbHMoc3R5bGVMYXllcnM6IHtbXzogc3RyaW5nXTogU3R5bGVMYXllcn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZExheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXllclNvdXJjZUNhY2hlOiAobGF5ZXI6IFN0eWxlTGF5ZXIpID0+IFNvdXJjZUNhY2hlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgZmlsdGVyOiBGaWx0ZXJTcGVjaWZpY2F0aW9uLCBsYXllcnM6IEFycmF5PHN0cmluZz4sIGF2YWlsYWJsZUltYWdlczogQXJyYXk8c3RyaW5nPiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkluZGV4OiBDb2xsaXNpb25JbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5lZFF1ZXJ5RGF0YToge1tfOiBudW1iZXJdOiBSZXRhaW5lZFF1ZXJ5RGF0YX0pOiBRdWVyeVJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgY29uc3QgcmVuZGVyZWRTeW1ib2xzID0gY29sbGlzaW9uSW5kZXgucXVlcnlSZW5kZXJlZFN5bWJvbHMocXVlcnlHZW9tZXRyeSk7XG4gICAgY29uc3QgYnVja2V0UXVlcnlEYXRhID0gW107XG4gICAgZm9yIChjb25zdCBidWNrZXRJbnN0YW5jZUlkIG9mIE9iamVjdC5rZXlzKHJlbmRlcmVkU3ltYm9scykubWFwKE51bWJlcikpIHtcbiAgICAgICAgYnVja2V0UXVlcnlEYXRhLnB1c2gocmV0YWluZWRRdWVyeURhdGFbYnVja2V0SW5zdGFuY2VJZF0pO1xuICAgIH1cbiAgICBidWNrZXRRdWVyeURhdGEuc29ydChzb3J0VGlsZXNJbik7XG5cbiAgICBmb3IgKGNvbnN0IHF1ZXJ5RGF0YSBvZiBidWNrZXRRdWVyeURhdGEpIHtcbiAgICAgICAgY29uc3QgYnVja2V0U3ltYm9scyA9IHF1ZXJ5RGF0YS5mZWF0dXJlSW5kZXgubG9va3VwU3ltYm9sRmVhdHVyZXMoXG4gICAgICAgICAgICAgICAgcmVuZGVyZWRTeW1ib2xzW3F1ZXJ5RGF0YS5idWNrZXRJbnN0YW5jZUlkXSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzLFxuICAgICAgICAgICAgICAgIHF1ZXJ5RGF0YS5idWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICBxdWVyeURhdGEuc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBwYXJhbXMuZmlsdGVyLFxuICAgICAgICAgICAgICAgIHBhcmFtcy5sYXllcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zLmF2YWlsYWJsZUltYWdlcyxcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVycyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEIGluIGJ1Y2tldFN5bWJvbHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEZlYXR1cmVzID0gcmVzdWx0W2xheWVySURdID0gcmVzdWx0W2xheWVySURdIHx8IFtdO1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJTeW1ib2xzID0gYnVja2V0U3ltYm9sc1tsYXllcklEXTtcbiAgICAgICAgICAgIGxheWVyU3ltYm9scy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTWF0Y2ggdG9wRG93bkZlYXR1cmVDb21wYXJhdG9yIGZyb20gRmVhdHVyZUluZGV4LCBidXQgdXNpbmdcbiAgICAgICAgICAgICAgICAvLyBtb3N0IHJlY2VudCBzb3J0aW5nIG9mIGZlYXR1cmVzIGZyb20gYnVja2V0LnNvcnRGZWF0dXJlc1xuICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVTb3J0T3JkZXIgPSBxdWVyeURhdGEuZmVhdHVyZVNvcnRPcmRlcjtcbiAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZVNvcnRPcmRlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBxdWVyeVJlbmRlcmVkU3ltYm9scyBkb2N1bWVudGF0aW9uIHNheXMgd2UnbGwgcmV0dXJuIGZlYXR1cmVzIGluXG4gICAgICAgICAgICAgICAgICAgIC8vIFwidG9wLXRvLWJvdHRvbVwiIHJlbmRlcmluZyBvcmRlciAoYWthIGxhc3QtdG8tZmlyc3QpLlxuICAgICAgICAgICAgICAgICAgICAvLyBBY3R1YWxseSB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgc3ltYm9sIGluc3RhbmNlcyBwZXIgZmVhdHVyZSwgc29cbiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc29ydCBlYWNoIGZlYXR1cmUgYmFzZWQgb24gdGhlIGZpcnN0IG1hdGNoaW5nIHN5bWJvbCBpbnN0YW5jZS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkQSA9IGZlYXR1cmVTb3J0T3JkZXIuaW5kZXhPZihhLmZlYXR1cmVJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZEIgPSBmZWF0dXJlU29ydE9yZGVyLmluZGV4T2YoYi5mZWF0dXJlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc29ydGVkQSA+PSAwKTtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHNvcnRlZEIgPj0gMCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0ZWRCIC0gc29ydGVkQTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBCdWNrZXQgaGFzbid0IGJlZW4gcmUtc29ydGVkIGJhc2VkIG9uIGFuZ2xlLCBzbyB1c2UgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJldmVyc2Ugb2YgdGhlIG9yZGVyIHRoZSBmZWF0dXJlcyBhcHBlYXJlZCBpbiB0aGUgZGF0YS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIuZmVhdHVyZUluZGV4IC0gYS5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN5bWJvbEZlYXR1cmUgb2YgbGF5ZXJTeW1ib2xzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0RmVhdHVyZXMucHVzaChzeW1ib2xGZWF0dXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1lcmdlIHN0YXRlIGZyb20gU291cmNlQ2FjaGUgaW50byB0aGUgcmVzdWx0c1xuICAgIGZvciAoY29uc3QgbGF5ZXJOYW1lIGluIHJlc3VsdCkge1xuICAgICAgICByZXN1bHRbbGF5ZXJOYW1lXS5mb3JFYWNoKChmZWF0dXJlV3JhcHBlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVXcmFwcGVyLmZlYXR1cmU7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHN0eWxlTGF5ZXJzW2xheWVyTmFtZV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IGdldExheWVyU291cmNlQ2FjaGUobGF5ZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSBzb3VyY2VDYWNoZS5nZXRGZWF0dXJlU3RhdGUoZmVhdHVyZS5sYXllclsnc291cmNlLWxheWVyJ10sIGZlYXR1cmUuaWQpO1xuICAgICAgICAgICAgZmVhdHVyZS5zb3VyY2UgPSBmZWF0dXJlLmxheWVyLnNvdXJjZTtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlLmxheWVyWydzb3VyY2UtbGF5ZXInXSkge1xuICAgICAgICAgICAgICAgIGZlYXR1cmUuc291cmNlTGF5ZXIgPSBmZWF0dXJlLmxheWVyWydzb3VyY2UtbGF5ZXInXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZlYXR1cmUuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeVNvdXJjZUZlYXR1cmVzKHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgcGFyYW1zOiBhbnkpOiBBcnJheTxRdWVyeUZlYXR1cmU+IHtcbiAgICBjb25zdCB0aWxlcyA9IHNvdXJjZUNhY2hlLmdldFJlbmRlcmFibGVJZHMoKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIHJldHVybiBzb3VyY2VDYWNoZS5nZXRUaWxlQnlJRChpZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGNvbnN0IGRhdGFUaWxlcyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHRpbGVzW2ldO1xuICAgICAgICBjb25zdCBkYXRhSUQgPSB0aWxlLnRpbGVJRC5jYW5vbmljYWwua2V5O1xuICAgICAgICBpZiAoIWRhdGFUaWxlc1tkYXRhSURdKSB7XG4gICAgICAgICAgICBkYXRhVGlsZXNbZGF0YUlEXSA9IHRydWU7XG4gICAgICAgICAgICB0aWxlLnF1ZXJ5U291cmNlRmVhdHVyZXMocmVzdWx0LCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc29ydFRpbGVzSW4oYSwgYikge1xuICAgIGNvbnN0IGlkQSA9IGEudGlsZUlEO1xuICAgIGNvbnN0IGlkQiA9IGIudGlsZUlEO1xuICAgIHJldHVybiAoaWRBLm92ZXJzY2FsZWRaIC0gaWRCLm92ZXJzY2FsZWRaKSB8fCAoaWRBLmNhbm9uaWNhbC55IC0gaWRCLmNhbm9uaWNhbC55KSB8fCAoaWRBLndyYXAgLSBpZEIud3JhcCkgfHwgKGlkQS5jYW5vbmljYWwueCAtIGlkQi5jYW5vbmljYWwueCk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUmVuZGVyZWRGZWF0dXJlTGF5ZXJzKHRpbGVzOiBSZW5kZXJlZEZlYXR1cmVMYXllcnMpOiBRdWVyeVJlc3VsdCB7XG4gICAgLy8gTWVyZ2UgcmVzdWx0cyBmcm9tIGFsbCB0aWxlcywgYnV0IGlmIHR3byB0aWxlcyBzaGFyZSB0aGUgc2FtZVxuICAgIC8vIHdyYXBwZWQgSUQsIGRvbid0IGR1cGxpY2F0ZSBmZWF0dXJlcyBiZXR3ZWVuIHRoZSB0d28gdGlsZXNcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBjb25zdCB3cmFwcGVkSURMYXllck1hcCA9IHt9O1xuICAgIGZvciAoY29uc3QgdGlsZSBvZiB0aWxlcykge1xuICAgICAgICBjb25zdCBxdWVyeVJlc3VsdHMgPSB0aWxlLnF1ZXJ5UmVzdWx0cztcbiAgICAgICAgY29uc3Qgd3JhcHBlZElEID0gdGlsZS53cmFwcGVkVGlsZUlEO1xuICAgICAgICBjb25zdCB3cmFwcGVkSURMYXllcnMgPSB3cmFwcGVkSURMYXllck1hcFt3cmFwcGVkSURdID0gd3JhcHBlZElETGF5ZXJNYXBbd3JhcHBlZElEXSB8fCB7fTtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEIGluIHF1ZXJ5UmVzdWx0cykge1xuICAgICAgICAgICAgY29uc3QgdGlsZUZlYXR1cmVzID0gcXVlcnlSZXN1bHRzW2xheWVySURdO1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZElERmVhdHVyZXMgPSB3cmFwcGVkSURMYXllcnNbbGF5ZXJJRF0gPSB3cmFwcGVkSURMYXllcnNbbGF5ZXJJRF0gfHwge307XG4gICAgICAgICAgICBjb25zdCByZXN1bHRGZWF0dXJlcyA9IHJlc3VsdFtsYXllcklEXSA9IHJlc3VsdFtsYXllcklEXSB8fCBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGlsZUZlYXR1cmUgb2YgdGlsZUZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3cmFwcGVkSURGZWF0dXJlc1t0aWxlRmVhdHVyZS5mZWF0dXJlSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyYXBwZWRJREZlYXR1cmVzW3RpbGVGZWF0dXJlLmZlYXR1cmVJbmRleF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRGZWF0dXJlcy5wdXNoKHRpbGVGZWF0dXJlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vd2luZG93LmpzJztcbmltcG9ydCBtYXBib3hnbCBmcm9tICcuLi8uLi9pbmRleC5qcyc7XG5cbmltcG9ydCB0eXBlIHtXb3JrZXJJbnRlcmZhY2V9IGZyb20gJy4uL3dlYl93b3JrZXIuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoKTogV29ya2VySW50ZXJmYWNlIHtcbiAgICByZXR1cm4gKG1hcGJveGdsLndvcmtlckNsYXNzICE9IG51bGwpID8gbmV3IG1hcGJveGdsLndvcmtlckNsYXNzKCkgOiAobmV3IHdpbmRvdy5Xb3JrZXIobWFwYm94Z2wud29ya2VyVXJsKTogYW55KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgV2ViV29ya2VyIGZyb20gJy4vd2ViX3dvcmtlci5qcyc7XG5pbXBvcnQgdHlwZSB7V29ya2VySW50ZXJmYWNlfSBmcm9tICcuL3dlYl93b3JrZXIuanMnO1xuXG5leHBvcnQgY29uc3QgUFJFTE9BRF9QT09MX0lEID0gJ21hcGJveGdsX3ByZWxvYWRlZF93b3JrZXJfcG9vbCc7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIHdvcmtlciBwb29sLlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29ya2VyUG9vbCB7XG4gICAgc3RhdGljIHdvcmtlckNvdW50OiBudW1iZXI7XG5cbiAgICBhY3RpdmU6IHtbXzogbnVtYmVyIHwgc3RyaW5nXTogYm9vbGVhbn07XG4gICAgd29ya2VyczogQXJyYXk8V29ya2VySW50ZXJmYWNlPjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IHt9O1xuICAgIH1cblxuICAgIGFjcXVpcmUobWFwSWQ6IG51bWJlciB8IHN0cmluZyk6IEFycmF5PFdvcmtlckludGVyZmFjZT4ge1xuICAgICAgICBpZiAoIXRoaXMud29ya2Vycykge1xuICAgICAgICAgICAgLy8gTGF6aWx5IGxvb2sgdXAgdGhlIHZhbHVlIG9mIG1hcGJveGdsLndvcmtlckNvdW50IHNvIHRoYXRcbiAgICAgICAgICAgIC8vIGNsaWVudCBjb2RlIGhhcyBoYWQgYSBjaGFuY2UgdG8gc2V0IGl0LlxuICAgICAgICAgICAgdGhpcy53b3JrZXJzID0gW107XG4gICAgICAgICAgICB3aGlsZSAodGhpcy53b3JrZXJzLmxlbmd0aCA8IFdvcmtlclBvb2wud29ya2VyQ291bnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtlcnMucHVzaChuZXcgV2ViV29ya2VyKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RpdmVbbWFwSWRdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMud29ya2Vycy5zbGljZSgpO1xuICAgIH1cblxuICAgIHJlbGVhc2UobWFwSWQ6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICBkZWxldGUgdGhpcy5hY3RpdmVbbWFwSWRdO1xuICAgICAgICBpZiAodGhpcy5udW1BY3RpdmUoKSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzLmZvckVhY2goKHcpID0+IHtcbiAgICAgICAgICAgICAgICB3LnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLndvcmtlcnMgPSAobnVsbDogYW55KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzUHJlbG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmFjdGl2ZVtQUkVMT0FEX1BPT0xfSURdO1xuICAgIH1cblxuICAgIG51bUFjdGl2ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5hY3RpdmUpLmxlbmd0aDtcbiAgICB9XG59XG5cbi8vIGV4dGVuc2l2ZSBiZW5jaG1hcmtpbmcgc2hvd2VkIDIgdG8gYmUgdGhlIGJlc3QgZGVmYXVsdCBmb3IgYm90aCBkZXNrdG9wIGFuZCBtb2JpbGUgZGV2aWNlcztcbi8vIHdlIGNhbid0IHJlbHkgb24gaGFyZHdhcmVDb25jdXJyZW5jeSBiZWNhdXNlIG9mIHdpbGQgaW5jb25zaXN0ZW5jeSBvZiByZXBvcnRlZCBudW1iZXJzIGJldHdlZW4gYnJvd3NlcnNcbldvcmtlclBvb2wud29ya2VyQ291bnQgPSAyO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFdvcmtlclBvb2wsIHtQUkVMT0FEX1BPT0xfSUR9IGZyb20gJy4vd29ya2VyX3Bvb2wuanMnO1xuXG5sZXQgZ2xvYmFsV29ya2VyUG9vbDtcblxuLyoqXG4gKiBDcmVhdGVzIChpZiBuZWNlc3NhcnkpIGFuZCByZXR1cm5zIHRoZSBzaW5nbGUsIGdsb2JhbCBXb3JrZXJQb29sIGluc3RhbmNlXG4gKiB0byBiZSBzaGFyZWQgYWNyb3NzIGVhY2ggTWFwXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRHbG9iYWxXb3JrZXJQb29sICgpOiBXb3JrZXJQb29sIHtcbiAgICBpZiAoIWdsb2JhbFdvcmtlclBvb2wpIHtcbiAgICAgICAgZ2xvYmFsV29ya2VyUG9vbCA9IG5ldyBXb3JrZXJQb29sKCk7XG4gICAgfVxuICAgIHJldHVybiBnbG9iYWxXb3JrZXJQb29sO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJld2FybSgpIHtcbiAgICBjb25zdCB3b3JrZXJQb29sID0gZ2V0R2xvYmFsV29ya2VyUG9vbCgpO1xuICAgIHdvcmtlclBvb2wuYWNxdWlyZShQUkVMT0FEX1BPT0xfSUQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJQcmV3YXJtZWRSZXNvdXJjZXMoKSB7XG4gICAgY29uc3QgcG9vbCA9IGdsb2JhbFdvcmtlclBvb2w7XG4gICAgaWYgKHBvb2wpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBwb29sIG9ubHkgaWYgYWxsIG1hcHMgdGhhdCByZWZlcmVuY2VkIHRoZSBwcmVsb2FkZWQgZ2xvYmFsIHdvcmtlciBwb29sIGhhdmUgYmVlbiByZW1vdmVkLlxuICAgICAgICBpZiAocG9vbC5pc1ByZWxvYWRlZCgpICYmIHBvb2wubnVtQWN0aXZlKCkgPT09IDEpIHtcbiAgICAgICAgICAgIHBvb2wucmVsZWFzZShQUkVMT0FEX1BPT0xfSUQpO1xuICAgICAgICAgICAgZ2xvYmFsV29ya2VyUG9vbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBjbGVhciBXZWJXb3JrZXJzIHNpbmNlIHRoZXJlIGFyZSBhY3RpdmUgTWFwIGluc3RhbmNlcyB0aGF0IHN0aWxsIHJlZmVyZW5jZSBpdC4gVGhlIHByZS13YXJtZWQgV2ViV29ya2VyIHBvb2wgY2FuIG9ubHkgYmUgY2xlYXJlZCB3aGVuIGFsbCBtYXAgaW5zdGFuY2VzIGhhdmUgYmVlbiByZW1vdmVkIHdpdGggbWFwLnJlbW92ZSgpJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgcmVmUHJvcGVydGllcyBmcm9tICcuL3V0aWwvcmVmX3Byb3BlcnRpZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7TGF5ZXJTcGVjaWZpY2F0aW9ufSBmcm9tICcuL3R5cGVzLmpzJztcblxuZnVuY3Rpb24gZGVyZWYobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbiwgcGFyZW50OiBMYXllclNwZWNpZmljYXRpb24pOiBMYXllclNwZWNpZmljYXRpb24ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrIGluIGxheWVyKSB7XG4gICAgICAgIGlmIChrICE9PSAncmVmJykge1xuICAgICAgICAgICAgcmVzdWx0W2tdID0gbGF5ZXJba107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWZQcm9wZXJ0aWVzLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgaWYgKGsgaW4gcGFyZW50KSB7XG4gICAgICAgICAgICByZXN1bHRba10gPSAocGFyZW50OiBhbnkpW2tdO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gKChyZXN1bHQ6IGFueSk6IExheWVyU3BlY2lmaWNhdGlvbik7XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgbGF5ZXJzLCBzb21lIG9mIHdoaWNoIG1heSBjb250YWluIGByZWZgIHByb3BlcnRpZXNcbiAqIHdob3NlIHZhbHVlIGlzIHRoZSBgaWRgIG9mIGFub3RoZXIgcHJvcGVydHksIHJldHVybiBhIG5ldyBhcnJheSB3aGVyZVxuICogc3VjaCBsYXllcnMgaGF2ZSBiZWVuIGF1Z21lbnRlZCB3aXRoIHRoZSAndHlwZScsICdzb3VyY2UnLCBldGMuIHByb3BlcnRpZXNcbiAqIGZyb20gdGhlIHBhcmVudCBsYXllciwgYW5kIHRoZSBgcmVmYCBwcm9wZXJ0eSBoYXMgYmVlbiByZW1vdmVkLlxuICpcbiAqIFRoZSBpbnB1dCBpcyBub3QgbW9kaWZpZWQuIFRoZSBvdXRwdXQgbWF5IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBwb3J0aW9uc1xuICogb2YgdGhlIGlucHV0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5PExheWVyPn0gbGF5ZXJzXG4gKiBAcmV0dXJucyB7QXJyYXk8TGF5ZXI+fVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXJlZkxheWVycyhsYXllcnM6IEFycmF5PExheWVyU3BlY2lmaWNhdGlvbj4pOiBBcnJheTxMYXllclNwZWNpZmljYXRpb24+IHtcbiAgICBsYXllcnMgPSBsYXllcnMuc2xpY2UoKTtcblxuICAgIGNvbnN0IG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWFwW2xheWVyc1tpXS5pZF0gPSBsYXllcnNbaV07XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCdyZWYnIGluIGxheWVyc1tpXSkge1xuICAgICAgICAgICAgbGF5ZXJzW2ldID0gZGVyZWYobGF5ZXJzW2ldLCBtYXBbKGxheWVyc1tpXTogYW55KS5yZWZdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsYXllcnM7XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHR5cGUge1N0eWxlU3BlY2lmaWNhdGlvbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGVtcHR5U3R5bGUoKTogU3R5bGVTcGVjaWZpY2F0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB2ZXJzaW9uOiA4LFxuICAgICAgICBsYXllcnM6IFtdLFxuICAgICAgICBzb3VyY2VzOiB7fVxuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgaXNFcXVhbCBmcm9tICcuL3V0aWwvZGVlcF9lcXVhbC5qcyc7XG5cbmltcG9ydCB0eXBlIHtTdHlsZVNwZWNpZmljYXRpb259IGZyb20gJy4vdHlwZXMuanMnO1xuXG50eXBlIENvbW1hbmQgPSB7XG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIGFyZ3M6IEFycmF5PGFueT47XG59O1xuXG5leHBvcnQgY29uc3Qgb3BlcmF0aW9uczoge1tfOiBzdHJpbmddOiBzdHJpbmd9ID0ge1xuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRTdHlsZScsIGFyZ3M6IFtzdHlsZXNoZWV0XSB9XG4gICAgICovXG4gICAgc2V0U3R5bGU6ICdzZXRTdHlsZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ2FkZExheWVyJywgYXJnczogW2xheWVyLCAnYmVmb3JlTGF5ZXJJZCddIH1cbiAgICAgKi9cbiAgICBhZGRMYXllcjogJ2FkZExheWVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAncmVtb3ZlTGF5ZXInLCBhcmdzOiBbJ2xheWVySWQnXSB9XG4gICAgICovXG4gICAgcmVtb3ZlTGF5ZXI6ICdyZW1vdmVMYXllcicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFBhaW50UHJvcGVydHknLCBhcmdzOiBbJ2xheWVySWQnLCAncHJvcCcsIHZhbHVlXSB9XG4gICAgICovXG4gICAgc2V0UGFpbnRQcm9wZXJ0eTogJ3NldFBhaW50UHJvcGVydHknLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMYXlvdXRQcm9wZXJ0eScsIGFyZ3M6IFsnbGF5ZXJJZCcsICdwcm9wJywgdmFsdWVdIH1cbiAgICAgKi9cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eTogJ3NldExheW91dFByb3BlcnR5JyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0RmlsdGVyJywgYXJnczogWydsYXllcklkJywgZmlsdGVyXSB9XG4gICAgICovXG4gICAgc2V0RmlsdGVyOiAnc2V0RmlsdGVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnYWRkU291cmNlJywgYXJnczogWydzb3VyY2VJZCcsIHNvdXJjZV0gfVxuICAgICAqL1xuICAgIGFkZFNvdXJjZTogJ2FkZFNvdXJjZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3JlbW92ZVNvdXJjZScsIGFyZ3M6IFsnc291cmNlSWQnXSB9XG4gICAgICovXG4gICAgcmVtb3ZlU291cmNlOiAncmVtb3ZlU291cmNlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0R2VvSlNPTlNvdXJjZURhdGEnLCBhcmdzOiBbJ3NvdXJjZUlkJywgZGF0YV0gfVxuICAgICAqL1xuICAgIHNldEdlb0pTT05Tb3VyY2VEYXRhOiAnc2V0R2VvSlNPTlNvdXJjZURhdGEnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMYXllclpvb21SYW5nZScsIGFyZ3M6IFsnbGF5ZXJJZCcsIDAsIDIyXSB9XG4gICAgICovXG4gICAgc2V0TGF5ZXJab29tUmFuZ2U6ICdzZXRMYXllclpvb21SYW5nZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExheWVyUHJvcGVydHknLCBhcmdzOiBbJ2xheWVySWQnLCAncHJvcCcsIHZhbHVlXSB9XG4gICAgICovXG4gICAgc2V0TGF5ZXJQcm9wZXJ0eTogJ3NldExheWVyUHJvcGVydHknLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRDZW50ZXInLCBhcmdzOiBbW2xvbiwgbGF0XV0gfVxuICAgICAqL1xuICAgIHNldENlbnRlcjogJ3NldENlbnRlcicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFpvb20nLCBhcmdzOiBbem9vbV0gfVxuICAgICAqL1xuICAgIHNldFpvb206ICdzZXRab29tJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0QmVhcmluZycsIGFyZ3M6IFtiZWFyaW5nXSB9XG4gICAgICovXG4gICAgc2V0QmVhcmluZzogJ3NldEJlYXJpbmcnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRQaXRjaCcsIGFyZ3M6IFtwaXRjaF0gfVxuICAgICAqL1xuICAgIHNldFBpdGNoOiAnc2V0UGl0Y2gnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRTcHJpdGUnLCBhcmdzOiBbJ3Nwcml0ZVVybCddIH1cbiAgICAgKi9cbiAgICBzZXRTcHJpdGU6ICdzZXRTcHJpdGUnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRHbHlwaHMnLCBhcmdzOiBbJ2dseXBoc1VybCddIH1cbiAgICAgKi9cbiAgICBzZXRHbHlwaHM6ICdzZXRHbHlwaHMnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRUcmFuc2l0aW9uJywgYXJnczogW3RyYW5zaXRpb25dIH1cbiAgICAgKi9cbiAgICBzZXRUcmFuc2l0aW9uOiAnc2V0VHJhbnNpdGlvbicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldExpZ2h0aW5nJywgYXJnczogW2xpZ2h0UHJvcGVydGllc10gfVxuICAgICAqL1xuICAgIHNldExpZ2h0OiAnc2V0TGlnaHQnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRUZXJyYWluJywgYXJnczogW3RlcnJhaW5Qcm9wZXJ0aWVzXSB9XG4gICAgICovXG4gICAgc2V0VGVycmFpbjogJ3NldFRlcnJhaW4nLFxuXG4gICAgLypcbiAgICAgKiAgeyBjb21tYW5kOiAnc2V0Rm9nJywgYXJnczogW2ZvZ1Byb3BlcnRpZXNdIH1cbiAgICAgKi9cbiAgICBzZXRGb2c6ICdzZXRGb2cnLFxuXG4gICAgLypcbiAgICAgKiAgeyBjb21tYW5kOiAnc2V0UHJvamVjdGlvbicsIGFyZ3M6IFtwcm9qZWN0aW9uUHJvcGVydGllc10gfVxuICAgICAqL1xuICAgIHNldFByb2plY3Rpb246ICdzZXRQcm9qZWN0aW9uJ1xufTtcblxuZnVuY3Rpb24gYWRkU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMpIHtcbiAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLmFkZFNvdXJjZSwgYXJnczogW3NvdXJjZUlkLCBhZnRlcltzb3VyY2VJZF1dfSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZShzb3VyY2VJZCwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKSB7XG4gICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5yZW1vdmVTb3VyY2UsIGFyZ3M6IFtzb3VyY2VJZF19KTtcbiAgICBzb3VyY2VzUmVtb3ZlZFtzb3VyY2VJZF0gPSB0cnVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTb3VyY2Uoc291cmNlSWQsIGFmdGVyLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpIHtcbiAgICByZW1vdmVTb3VyY2Uoc291cmNlSWQsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCk7XG4gICAgYWRkU291cmNlKHNvdXJjZUlkLCBhZnRlciwgY29tbWFuZHMpO1xufVxuXG5mdW5jdGlvbiBjYW5VcGRhdGVHZW9KU09OKGJlZm9yZSwgYWZ0ZXIsIHNvdXJjZUlkKSB7XG4gICAgbGV0IHByb3A7XG4gICAgZm9yIChwcm9wIGluIGJlZm9yZVtzb3VyY2VJZF0pIHtcbiAgICAgICAgaWYgKCFiZWZvcmVbc291cmNlSWRdLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHByb3AgIT09ICdkYXRhJyAmJiAhaXNFcXVhbChiZWZvcmVbc291cmNlSWRdW3Byb3BdLCBhZnRlcltzb3VyY2VJZF1bcHJvcF0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChwcm9wIGluIGFmdGVyW3NvdXJjZUlkXSkge1xuICAgICAgICBpZiAoIWFmdGVyW3NvdXJjZUlkXS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgIGlmIChwcm9wICE9PSAnZGF0YScgJiYgIWlzRXF1YWwoYmVmb3JlW3NvdXJjZUlkXVtwcm9wXSwgYWZ0ZXJbc291cmNlSWRdW3Byb3BdKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkaWZmU291cmNlcyhiZWZvcmUsIGFmdGVyLCBjb21tYW5kcywgc291cmNlc1JlbW92ZWQpIHtcbiAgICBiZWZvcmUgPSBiZWZvcmUgfHwge307XG4gICAgYWZ0ZXIgPSBhZnRlciB8fCB7fTtcblxuICAgIGxldCBzb3VyY2VJZDtcblxuICAgIC8vIGxvb2sgZm9yIHNvdXJjZXMgdG8gcmVtb3ZlXG4gICAgZm9yIChzb3VyY2VJZCBpbiBiZWZvcmUpIHtcbiAgICAgICAgaWYgKCFiZWZvcmUuaGFzT3duUHJvcGVydHkoc291cmNlSWQpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFhZnRlci5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgIHJlbW92ZVNvdXJjZShzb3VyY2VJZCwgY29tbWFuZHMsIHNvdXJjZXNSZW1vdmVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxvb2sgZm9yIHNvdXJjZXMgdG8gYWRkL3VwZGF0ZVxuICAgIGZvciAoc291cmNlSWQgaW4gYWZ0ZXIpIHtcbiAgICAgICAgaWYgKCFhZnRlci5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgIGFkZFNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzKTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNFcXVhbChiZWZvcmVbc291cmNlSWRdLCBhZnRlcltzb3VyY2VJZF0pKSB7XG4gICAgICAgICAgICBpZiAoYmVmb3JlW3NvdXJjZUlkXS50eXBlID09PSAnZ2VvanNvbicgJiYgYWZ0ZXJbc291cmNlSWRdLnR5cGUgPT09ICdnZW9qc29uJyAmJiBjYW5VcGRhdGVHZW9KU09OKGJlZm9yZSwgYWZ0ZXIsIHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0R2VvSlNPTlNvdXJjZURhdGEsIGFyZ3M6IFtzb3VyY2VJZCwgYWZ0ZXJbc291cmNlSWRdLmRhdGFdfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG5vIHVwZGF0ZSBjb21tYW5kLCBtdXN0IHJlbW92ZSB0aGVuIGFkZFxuICAgICAgICAgICAgICAgIHVwZGF0ZVNvdXJjZShzb3VyY2VJZCwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmUsIGFmdGVyLCBjb21tYW5kcywgbGF5ZXJJZCwga2xhc3MsIGNvbW1hbmQpIHtcbiAgICBiZWZvcmUgPSBiZWZvcmUgfHwge307XG4gICAgYWZ0ZXIgPSBhZnRlciB8fCB7fTtcblxuICAgIGxldCBwcm9wO1xuXG4gICAgZm9yIChwcm9wIGluIGJlZm9yZSkge1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVbcHJvcF0sIGFmdGVyW3Byb3BdKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZCwgYXJnczogW2xheWVySWQsIHByb3AsIGFmdGVyW3Byb3BdLCBrbGFzc119KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHByb3AgaW4gYWZ0ZXIpIHtcbiAgICAgICAgaWYgKCFhZnRlci5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCBiZWZvcmUuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlW3Byb3BdLCBhZnRlcltwcm9wXSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQsIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlcltwcm9wXSwga2xhc3NdfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBsdWNrSWQobGF5ZXIpIHtcbiAgICByZXR1cm4gbGF5ZXIuaWQ7XG59XG5mdW5jdGlvbiBpbmRleEJ5SWQoZ3JvdXAsIGxheWVyKSB7XG4gICAgZ3JvdXBbbGF5ZXIuaWRdID0gbGF5ZXI7XG4gICAgcmV0dXJuIGdyb3VwO1xufVxuXG5mdW5jdGlvbiBkaWZmTGF5ZXJzKGJlZm9yZSwgYWZ0ZXIsIGNvbW1hbmRzKSB7XG4gICAgYmVmb3JlID0gYmVmb3JlIHx8IFtdO1xuICAgIGFmdGVyID0gYWZ0ZXIgfHwgW107XG5cbiAgICAvLyBvcmRlciBvZiBsYXllcnMgYnkgaWRcbiAgICBjb25zdCBiZWZvcmVPcmRlciA9IGJlZm9yZS5tYXAocGx1Y2tJZCk7XG4gICAgY29uc3QgYWZ0ZXJPcmRlciA9IGFmdGVyLm1hcChwbHVja0lkKTtcblxuICAgIC8vIGluZGV4IG9mIGxheWVyIGJ5IGlkXG4gICAgY29uc3QgYmVmb3JlSW5kZXggPSBiZWZvcmUucmVkdWNlKGluZGV4QnlJZCwge30pO1xuICAgIGNvbnN0IGFmdGVySW5kZXggPSBhZnRlci5yZWR1Y2UoaW5kZXhCeUlkLCB7fSk7XG5cbiAgICAvLyB0cmFjayBvcmRlciBvZiBsYXllcnMgYXMgaWYgdGhleSBoYXZlIGJlZW4gbXV0YXRlZFxuICAgIGNvbnN0IHRyYWNrZXIgPSBiZWZvcmVPcmRlci5zbGljZSgpO1xuXG4gICAgLy8gbGF5ZXJzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGRvIG5vdCBuZWVkIHRvIGJlIGRpZmZlZFxuICAgIGNvbnN0IGNsZWFuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIGxldCBpLCBkLCBsYXllcklkLCBiZWZvcmVMYXllciwgYWZ0ZXJMYXllciwgaW5zZXJ0QmVmb3JlTGF5ZXJJZCwgcHJvcDtcblxuICAgIC8vIHJlbW92ZSBsYXllcnNcbiAgICBmb3IgKGkgPSAwLCBkID0gMDsgaSA8IGJlZm9yZU9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxheWVySWQgPSBiZWZvcmVPcmRlcltpXTtcbiAgICAgICAgaWYgKCFhZnRlckluZGV4Lmhhc093blByb3BlcnR5KGxheWVySWQpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF19KTtcbiAgICAgICAgICAgIHRyYWNrZXIuc3BsaWNlKHRyYWNrZXIuaW5kZXhPZihsYXllcklkLCBkKSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBsaW1pdCB3aGVyZSBpbiB0cmFja2VyIHdlIG5lZWQgdG8gbG9vayBmb3IgYSBtYXRjaFxuICAgICAgICAgICAgZCsrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRkL3Jlb3JkZXIgbGF5ZXJzXG4gICAgZm9yIChpID0gMCwgZCA9IDA7IGkgPCBhZnRlck9yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIHdvcmsgYmFja3dhcmRzIGFzIGluc2VydCBpcyBiZWZvcmUgYW4gZXhpc3RpbmcgbGF5ZXJcbiAgICAgICAgbGF5ZXJJZCA9IGFmdGVyT3JkZXJbYWZ0ZXJPcmRlci5sZW5ndGggLSAxIC0gaV07XG5cbiAgICAgICAgaWYgKHRyYWNrZXJbdHJhY2tlci5sZW5ndGggLSAxIC0gaV0gPT09IGxheWVySWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChiZWZvcmVJbmRleC5oYXNPd25Qcm9wZXJ0eShsYXllcklkKSkge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBsYXllciBiZWZvcmUgd2UgaW5zZXJ0IGF0IHRoZSBjb3JyZWN0IHBvc2l0aW9uXG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF19KTtcbiAgICAgICAgICAgIHRyYWNrZXIuc3BsaWNlKHRyYWNrZXIubGFzdEluZGV4T2YobGF5ZXJJZCwgdHJhY2tlci5sZW5ndGggLSBkKSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBsaW1pdCB3aGVyZSBpbiB0cmFja2VyIHdlIG5lZWQgdG8gbG9vayBmb3IgYSBtYXRjaFxuICAgICAgICAgICAgZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGxheWVyIGF0IGNvcnJlY3QgcG9zaXRpb25cbiAgICAgICAgaW5zZXJ0QmVmb3JlTGF5ZXJJZCA9IHRyYWNrZXJbdHJhY2tlci5sZW5ndGggLSBpXTtcbiAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5hZGRMYXllciwgYXJnczogW2FmdGVySW5kZXhbbGF5ZXJJZF0sIGluc2VydEJlZm9yZUxheWVySWRdfSk7XG4gICAgICAgIHRyYWNrZXIuc3BsaWNlKHRyYWNrZXIubGVuZ3RoIC0gaSwgMCwgbGF5ZXJJZCk7XG4gICAgICAgIGNsZWFuW2xheWVySWRdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgbGF5ZXJzXG4gICAgZm9yIChpID0gMDsgaSA8IGFmdGVyT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGF5ZXJJZCA9IGFmdGVyT3JkZXJbaV07XG4gICAgICAgIGJlZm9yZUxheWVyID0gYmVmb3JlSW5kZXhbbGF5ZXJJZF07XG4gICAgICAgIGFmdGVyTGF5ZXIgPSBhZnRlckluZGV4W2xheWVySWRdO1xuXG4gICAgICAgIC8vIG5vIG5lZWQgdG8gdXBkYXRlIGlmIHByZXZpb3VzbHkgYWRkZWQgKG5ldyBvciBtb3ZlZClcbiAgICAgICAgaWYgKGNsZWFuW2xheWVySWRdIHx8IGlzRXF1YWwoYmVmb3JlTGF5ZXIsIGFmdGVyTGF5ZXIpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBJZiBzb3VyY2UsIHNvdXJjZS1sYXllciwgb3IgdHlwZSBoYXZlIGNoYW5nZXMsIHRoZW4gcmVtb3ZlIHRoZSBsYXllclxuICAgICAgICAvLyBhbmQgYWRkIGl0IGJhY2sgJ2Zyb20gc2NyYXRjaCcuXG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmVMYXllci5zb3VyY2UsIGFmdGVyTGF5ZXIuc291cmNlKSB8fCAhaXNFcXVhbChiZWZvcmVMYXllclsnc291cmNlLWxheWVyJ10sIGFmdGVyTGF5ZXJbJ3NvdXJjZS1sYXllciddKSB8fCAhaXNFcXVhbChiZWZvcmVMYXllci50eXBlLCBhZnRlckxheWVyLnR5cGUpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF19KTtcbiAgICAgICAgICAgIC8vIHdlIGFkZCB0aGUgbGF5ZXIgYmFjayBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpdCB3YXMgYWxyZWFkeSBpbiwgc29cbiAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gbmVlZCB0byB1cGRhdGUgdGhlIGB0cmFja2VyYFxuICAgICAgICAgICAgaW5zZXJ0QmVmb3JlTGF5ZXJJZCA9IHRyYWNrZXJbdHJhY2tlci5sYXN0SW5kZXhPZihsYXllcklkKSArIDFdO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5hZGRMYXllciwgYXJnczogW2FmdGVyTGF5ZXIsIGluc2VydEJlZm9yZUxheWVySWRdfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxheW91dCwgcGFpbnQsIGZpbHRlciwgbWluem9vbSwgbWF4em9vbVxuICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXIubGF5b3V0LCBhZnRlckxheWVyLmxheW91dCwgY29tbWFuZHMsIGxheWVySWQsIG51bGwsIG9wZXJhdGlvbnMuc2V0TGF5b3V0UHJvcGVydHkpO1xuICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXIucGFpbnQsIGFmdGVyTGF5ZXIucGFpbnQsIGNvbW1hbmRzLCBsYXllcklkLCBudWxsLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIuZmlsdGVyLCBhZnRlckxheWVyLmZpbHRlcikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0RmlsdGVyLCBhcmdzOiBbbGF5ZXJJZCwgYWZ0ZXJMYXllci5maWx0ZXJdfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZUxheWVyLm1pbnpvb20sIGFmdGVyTGF5ZXIubWluem9vbSkgfHwgIWlzRXF1YWwoYmVmb3JlTGF5ZXIubWF4em9vbSwgYWZ0ZXJMYXllci5tYXh6b29tKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRMYXllclpvb21SYW5nZSwgYXJnczogW2xheWVySWQsIGFmdGVyTGF5ZXIubWluem9vbSwgYWZ0ZXJMYXllci5tYXh6b29tXX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGFsbCBvdGhlciBsYXllciBwcm9wcywgaW5jbHVkaW5nIHBhaW50LipcbiAgICAgICAgZm9yIChwcm9wIGluIGJlZm9yZUxheWVyKSB7XG4gICAgICAgICAgICBpZiAoIWJlZm9yZUxheWVyLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnbGF5b3V0JyB8fCBwcm9wID09PSAncGFpbnQnIHx8IHByb3AgPT09ICdmaWx0ZXInIHx8XG4gICAgICAgICAgICAgICAgcHJvcCA9PT0gJ21ldGFkYXRhJyB8fCBwcm9wID09PSAnbWluem9vbScgfHwgcHJvcCA9PT0gJ21heHpvb20nKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluZGV4T2YoJ3BhaW50LicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGJlZm9yZUxheWVyW3Byb3BdLCBhZnRlckxheWVyW3Byb3BdLCBjb21tYW5kcywgbGF5ZXJJZCwgcHJvcC5zbGljZSg2KSwgb3BlcmF0aW9ucy5zZXRQYWludFByb3BlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRMYXllclByb3BlcnR5LCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJMYXllcltwcm9wXV19KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHByb3AgaW4gYWZ0ZXJMYXllcikge1xuICAgICAgICAgICAgaWYgKCFhZnRlckxheWVyLmhhc093blByb3BlcnR5KHByb3ApIHx8IGJlZm9yZUxheWVyLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnbGF5b3V0JyB8fCBwcm9wID09PSAncGFpbnQnIHx8IHByb3AgPT09ICdmaWx0ZXInIHx8XG4gICAgICAgICAgICAgICAgcHJvcCA9PT0gJ21ldGFkYXRhJyB8fCBwcm9wID09PSAnbWluem9vbScgfHwgcHJvcCA9PT0gJ21heHpvb20nKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluZGV4T2YoJ3BhaW50LicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGJlZm9yZUxheWVyW3Byb3BdLCBhZnRlckxheWVyW3Byb3BdLCBjb21tYW5kcywgbGF5ZXJJZCwgcHJvcC5zbGljZSg2KSwgb3BlcmF0aW9ucy5zZXRQYWludFByb3BlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRMYXllclByb3BlcnR5LCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJMYXllcltwcm9wXV19KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBEaWZmIHR3byBzdHlsZXNoZWV0XG4gKlxuICogQ3JlYXRlcyBzZW1hbnRpY2x5IGF3YXJlIGRpZmZzIHRoYXQgY2FuIGVhc2lseSBiZSBhcHBsaWVkIGF0IHJ1bnRpbWUuXG4gKiBPcGVyYXRpb25zIHByb2R1Y2VkIGJ5IHRoZSBkaWZmIGNsb3NlbHkgcmVzZW1ibGUgdGhlIG1hcGJveC1nbC1qcyBBUEkuIEFueVxuICogZXJyb3IgY3JlYXRpbmcgdGhlIGRpZmYgd2lsbCBmYWxsIGJhY2sgdG8gdGhlICdzZXRTdHlsZScgb3BlcmF0aW9uLlxuICpcbiAqIEV4YW1wbGUgZGlmZjpcbiAqIFtcbiAqICAgICB7IGNvbW1hbmQ6ICdzZXRDb25zdGFudCcsIGFyZ3M6IFsnQHdhdGVyJywgJyMwMDAwRkYnXSB9LFxuICogICAgIHsgY29tbWFuZDogJ3NldFBhaW50UHJvcGVydHknLCBhcmdzOiBbJ2JhY2tncm91bmQnLCAnYmFja2dyb3VuZC1jb2xvcicsICdibGFjayddIH1cbiAqIF1cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBbYmVmb3JlXSBzdHlsZXNoZWV0IHRvIGNvbXBhcmUgZnJvbVxuICogQHBhcmFtIHsqfSBhZnRlciBzdHlsZXNoZWV0IHRvIGNvbXBhcmUgdG9cbiAqIEByZXR1cm5zIEFycmF5IGxpc3Qgb2YgY2hhbmdlc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkaWZmU3R5bGVzKGJlZm9yZTogU3R5bGVTcGVjaWZpY2F0aW9uLCBhZnRlcjogU3R5bGVTcGVjaWZpY2F0aW9uKTogQXJyYXk8Q29tbWFuZD4ge1xuICAgIGlmICghYmVmb3JlKSByZXR1cm4gW3tjb21tYW5kOiBvcGVyYXRpb25zLnNldFN0eWxlLCBhcmdzOiBbYWZ0ZXJdfV07XG5cbiAgICBsZXQgY29tbWFuZHMgPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2VzIHRvIHRvcC1sZXZlbCBwcm9wZXJ0aWVzXG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUudmVyc2lvbiwgYWZ0ZXIudmVyc2lvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBbe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0U3R5bGUsIGFyZ3M6IFthZnRlcl19XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmNlbnRlciwgYWZ0ZXIuY2VudGVyKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRDZW50ZXIsIGFyZ3M6IFthZnRlci5jZW50ZXJdfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS56b29tLCBhZnRlci56b29tKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRab29tLCBhcmdzOiBbYWZ0ZXIuem9vbV19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmJlYXJpbmcsIGFmdGVyLmJlYXJpbmcpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldEJlYXJpbmcsIGFyZ3M6IFthZnRlci5iZWFyaW5nXX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUucGl0Y2gsIGFmdGVyLnBpdGNoKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRQaXRjaCwgYXJnczogW2FmdGVyLnBpdGNoXX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUuc3ByaXRlLCBhZnRlci5zcHJpdGUpKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldFNwcml0ZSwgYXJnczogW2FmdGVyLnNwcml0ZV19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmdseXBocywgYWZ0ZXIuZ2x5cGhzKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRHbHlwaHMsIGFyZ3M6IFthZnRlci5nbHlwaHNdfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS50cmFuc2l0aW9uLCBhZnRlci50cmFuc2l0aW9uKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRUcmFuc2l0aW9uLCBhcmdzOiBbYWZ0ZXIudHJhbnNpdGlvbl19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmxpZ2h0LCBhZnRlci5saWdodCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0TGlnaHQsIGFyZ3M6IFthZnRlci5saWdodF19KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmZvZywgYWZ0ZXIuZm9nKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRGb2csIGFyZ3M6IFthZnRlci5mb2ddfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5wcm9qZWN0aW9uLCBhZnRlci5wcm9qZWN0aW9uKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRQcm9qZWN0aW9uLCBhcmdzOiBbYWZ0ZXIucHJvamVjdGlvbl19KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2VzIHRvIGBzb3VyY2VzYFxuICAgICAgICAvLyBJZiBhIHNvdXJjZSBpcyB0byBiZSByZW1vdmVkLCB3ZSBhbHNvLS1iZWZvcmUgdGhlIHJlbW92ZVNvdXJjZVxuICAgICAgICAvLyBjb21tYW5kLS1uZWVkIHRvIHJlbW92ZSBhbGwgdGhlIHN0eWxlIGxheWVycyB0aGF0IGRlcGVuZCBvbiBpdC5cbiAgICAgICAgY29uc3Qgc291cmNlc1JlbW92ZWQgPSB7fTtcblxuICAgICAgICAvLyBGaXJzdCBjb2xsZWN0IHRoZSB7YWRkLHJlbW92ZX1Tb3VyY2UgY29tbWFuZHNcbiAgICAgICAgY29uc3QgcmVtb3ZlT3JBZGRTb3VyY2VDb21tYW5kcyA9IFtdO1xuICAgICAgICBkaWZmU291cmNlcyhiZWZvcmUuc291cmNlcywgYWZ0ZXIuc291cmNlcywgcmVtb3ZlT3JBZGRTb3VyY2VDb21tYW5kcywgc291cmNlc1JlbW92ZWQpO1xuXG4gICAgICAgIC8vIFB1c2ggYSByZW1vdmVMYXllciBjb21tYW5kIGZvciBlYWNoIHN0eWxlIGxheWVyIHRoYXQgZGVwZW5kcyBvbiBhXG4gICAgICAgIC8vIHNvdXJjZSB0aGF0J3MgYmVpbmcgcmVtb3ZlZC5cbiAgICAgICAgLy8gQWxzbywgZXhjbHVkZSBhbnkgc3VjaCBsYXllcnMgdGhlbSBmcm9tIHRoZSBpbnB1dCB0byBgZGlmZkxheWVyc2BcbiAgICAgICAgLy8gYmVsb3csIHNvIHRoYXQgZGlmZkxheWVycyBwcm9kdWNlcyB0aGUgYXBwcm9wcmlhdGUgYGFkZExheWVyc2BcbiAgICAgICAgLy8gY29tbWFuZFxuICAgICAgICBjb25zdCBiZWZvcmVMYXllcnMgPSBbXTtcbiAgICAgICAgaWYgKGJlZm9yZS5sYXllcnMpIHtcbiAgICAgICAgICAgIGJlZm9yZS5sYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuc291cmNlICYmIHNvdXJjZXNSZW1vdmVkW2xheWVyLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7Y29tbWFuZDogb3BlcmF0aW9ucy5yZW1vdmVMYXllciwgYXJnczogW2xheWVyLmlkXX0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZUxheWVycy5wdXNoKGxheWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdGVycmFpbiBpZiB0aGUgc291cmNlIGZvciB0aGF0IHRlcnJhaW4gaXMgYmVpbmcgcmVtb3ZlZFxuICAgICAgICBsZXQgYmVmb3JlVGVycmFpbiA9IGJlZm9yZS50ZXJyYWluO1xuICAgICAgICBpZiAoYmVmb3JlVGVycmFpbikge1xuICAgICAgICAgICAgaWYgKHNvdXJjZXNSZW1vdmVkW2JlZm9yZVRlcnJhaW4uc291cmNlXSkge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goe2NvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0VGVycmFpbiwgYXJnczogW3VuZGVmaW5lZF19KTtcbiAgICAgICAgICAgICAgICBiZWZvcmVUZXJyYWluID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29tbWFuZHMgPSBjb21tYW5kcy5jb25jYXQocmVtb3ZlT3JBZGRTb3VyY2VDb21tYW5kcyk7XG5cbiAgICAgICAgLy8gRXZlbiB0aG91Z2ggdGVycmFpbiBpcyBhIHRvcC1sZXZlbCBwcm9wZXJ0eVxuICAgICAgICAvLyBJdHMgbGlrZSBhIGxheWVyIGluIHRoZSBzZW5zZSB0aGF0IGl0IGRlcGVuZHMgb24gYSBzb3VyY2UgYmVpbmcgcHJlc2VudC5cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZVRlcnJhaW4sIGFmdGVyLnRlcnJhaW4pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHtjb21tYW5kOiBvcGVyYXRpb25zLnNldFRlcnJhaW4sIGFyZ3M6IFthZnRlci50ZXJyYWluXX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGNoYW5nZXMgdG8gYGxheWVyc2BcbiAgICAgICAgZGlmZkxheWVycyhiZWZvcmVMYXllcnMsIGFmdGVyLmxheWVycywgY29tbWFuZHMpO1xuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBmYWxsIGJhY2sgdG8gc2V0U3R5bGVcbiAgICAgICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gY29tcHV0ZSBzdHlsZSBkaWZmOicsIGUpO1xuICAgICAgICBjb21tYW5kcyA9IFt7Y29tbWFuZDogb3BlcmF0aW9ucy5zZXRTdHlsZSwgYXJnczogW2FmdGVyXX1dO1xuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kcztcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7Y2xhbXB9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmNsYXNzIFBhdGhJbnRlcnBvbGF0b3Ige1xuICAgIHBvaW50czogQXJyYXk8UG9pbnQ+O1xuICAgIGxlbmd0aDogbnVtYmVyO1xuICAgIHBhZGRlZExlbmd0aDogbnVtYmVyO1xuICAgIHBhZGRpbmc6IG51bWJlcjtcbiAgICBfZGlzdGFuY2VzOiBBcnJheTxudW1iZXI+O1xuXG4gICAgY29uc3RydWN0b3IocG9pbnRzXzogP0FycmF5PFBvaW50PiwgcGFkZGluZ186ID9udW1iZXIpIHtcbiAgICAgICAgdGhpcy5yZXNldChwb2ludHNfLCBwYWRkaW5nXyk7XG4gICAgfVxuXG4gICAgcmVzZXQocG9pbnRzXzogP0FycmF5PFBvaW50PiwgcGFkZGluZ186ID9udW1iZXIpIHtcbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHNfIHx8IFtdO1xuXG4gICAgICAgIC8vIENvbXB1dGUgY3VtdWxhdGl2ZSBkaXN0YW5jZSBmcm9tIGZpcnN0IHBvaW50IHRvIGV2ZXJ5IG90aGVyIHBvaW50IGluIHRoZSBzZWdtZW50LlxuICAgICAgICAvLyBMYXN0IGVudHJ5IGluIHRoZSBhcnJheSBpcyB0b3RhbCBsZW5ndGggb2YgdGhlIHBhdGhcbiAgICAgICAgdGhpcy5fZGlzdGFuY2VzID0gWzAuMF07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fZGlzdGFuY2VzW2ldID0gdGhpcy5fZGlzdGFuY2VzW2kgLSAxXSArIHRoaXMucG9pbnRzW2ldLmRpc3QodGhpcy5wb2ludHNbaSAtIDFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5fZGlzdGFuY2VzW3RoaXMuX2Rpc3RhbmNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgdGhpcy5wYWRkaW5nID0gTWF0aC5taW4ocGFkZGluZ18gfHwgMCwgdGhpcy5sZW5ndGggKiAwLjUpO1xuICAgICAgICB0aGlzLnBhZGRlZExlbmd0aCA9IHRoaXMubGVuZ3RoIC0gdGhpcy5wYWRkaW5nICogMi4wO1xuICAgIH1cblxuICAgIGxlcnAodDogbnVtYmVyKTogUG9pbnQge1xuICAgICAgICBhc3NlcnQodGhpcy5wb2ludHMubGVuZ3RoID4gMCk7XG4gICAgICAgIGlmICh0aGlzLnBvaW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBvaW50c1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHQgPSBjbGFtcCh0LCAwLCAxKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBjb3JyZWN0IHNlZ21lbnQgW3AwLCBwMV0gd2hlcmUgcDAgPD0geCA8IHAxXG4gICAgICAgIGxldCBjdXJyZW50SW5kZXggPSAxO1xuICAgICAgICBsZXQgZGlzdE9mQ3VycmVudElkeCA9IHRoaXMuX2Rpc3RhbmNlc1tjdXJyZW50SW5kZXhdO1xuICAgICAgICBjb25zdCBkaXN0VG9UYXJnZXQgPSB0ICogdGhpcy5wYWRkZWRMZW5ndGggKyB0aGlzLnBhZGRpbmc7XG5cbiAgICAgICAgd2hpbGUgKGRpc3RPZkN1cnJlbnRJZHggPCBkaXN0VG9UYXJnZXQgJiYgY3VycmVudEluZGV4IDwgdGhpcy5fZGlzdGFuY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGlzdE9mQ3VycmVudElkeCA9IHRoaXMuX2Rpc3RhbmNlc1srK2N1cnJlbnRJbmRleF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZSB0d28gcG9pbnRzIG9mIHRoZSBzZWdtZW50XG4gICAgICAgIGNvbnN0IGlkeE9mUHJldlBvaW50ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgY29uc3QgZGlzdE9mUHJldklkeCA9IHRoaXMuX2Rpc3RhbmNlc1tpZHhPZlByZXZQb2ludF07XG4gICAgICAgIGNvbnN0IHNlZ21lbnRMZW5ndGggPSBkaXN0T2ZDdXJyZW50SWR4IC0gZGlzdE9mUHJldklkeDtcbiAgICAgICAgY29uc3Qgc2VnbWVudFQgPSBzZWdtZW50TGVuZ3RoID4gMCA/IChkaXN0VG9UYXJnZXQgLSBkaXN0T2ZQcmV2SWR4KSAvIHNlZ21lbnRMZW5ndGggOiAwO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50c1tpZHhPZlByZXZQb2ludF0ubXVsdCgxLjAgLSBzZWdtZW50VCkuYWRkKHRoaXMucG9pbnRzW2N1cnJlbnRJbmRleF0ubXVsdChzZWdtZW50VCkpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGF0aEludGVycG9sYXRvcjtcbiIsIi8vIEBmbG93XG5cbnR5cGUgR3JpZEl0ZW0gPSB7XG4gICAga2V5OiBhbnksXG4gICAgeDE6IG51bWJlcixcbiAgICB5MTogbnVtYmVyLFxuICAgIHgyOiBudW1iZXIsXG4gICAgeTI6IG51bWJlclxufTtcblxuLyoqXG4gKiBHcmlkSW5kZXggaXMgYSBkYXRhIHN0cnVjdHVyZSBmb3IgdGVzdGluZyB0aGUgaW50ZXJzZWN0aW9uIG9mXG4gKiBjaXJjbGVzIGFuZCByZWN0YW5nbGVzIGluIGEgMmQgcGxhbmUuXG4gKiBJdCBpcyBvcHRpbWl6ZWQgZm9yIHJhcGlkIGluc2VydGlvbiBhbmQgcXVlcnlpbmcuXG4gKiBHcmlkSW5kZXggc3BsaXRzIHRoZSBwbGFuZSBpbnRvIGEgc2V0IG9mIFwiY2VsbHNcIiBhbmQga2VlcHMgdHJhY2tcbiAqIG9mIHdoaWNoIGdlb21ldHJpZXMgaW50ZXJzZWN0IHdpdGggZWFjaCBjZWxsLiBBdCBxdWVyeSB0aW1lLFxuICogZnVsbCBnZW9tZXRyeSBjb21wYXJpc29ucyBhcmUgb25seSBkb25lIGZvciBpdGVtcyB0aGF0IHNoYXJlXG4gKiBhdCBsZWFzdCBvbmUgY2VsbC4gQXMgbG9uZyBhcyB0aGUgZ2VvbWV0cmllcyBhcmUgcmVsYXRpdmVseVxuICogdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgcGxhbmUsIHRoaXMgZ3JlYXRseSByZWR1Y2VzXG4gKiB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIG5lY2Vzc2FyeS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBHcmlkSW5kZXgge1xuICAgIGNpcmNsZUtleXM6IEFycmF5PGFueT47XG4gICAgYm94S2V5czogQXJyYXk8YW55PjtcbiAgICBib3hDZWxsczogQXJyYXk8QXJyYXk8bnVtYmVyPj47XG4gICAgY2lyY2xlQ2VsbHM6IEFycmF5PEFycmF5PG51bWJlcj4+O1xuICAgIGJib3hlczogQXJyYXk8bnVtYmVyPjtcbiAgICBjaXJjbGVzOiBBcnJheTxudW1iZXI+O1xuICAgIHhDZWxsQ291bnQ6IG51bWJlcjtcbiAgICB5Q2VsbENvdW50OiBudW1iZXI7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICB4U2NhbGU6IG51bWJlcjtcbiAgICB5U2NhbGU6IG51bWJlcjtcbiAgICBib3hVaWQ6IG51bWJlcjtcbiAgICBjaXJjbGVVaWQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgY2VsbFNpemU6IG51bWJlcikge1xuICAgICAgICBjb25zdCBib3hDZWxscyA9IHRoaXMuYm94Q2VsbHMgPSBbXTtcbiAgICAgICAgY29uc3QgY2lyY2xlQ2VsbHMgPSB0aGlzLmNpcmNsZUNlbGxzID0gW107XG5cbiAgICAgICAgLy8gTW9yZSBjZWxscyAtPiBmZXdlciBnZW9tZXRyaWVzIHRvIGNoZWNrIHBlciBjZWxsLCBidXQgaXRlbXMgdGVuZFxuICAgICAgICAvLyB0byBiZSBzcGxpdCBhY3Jvc3MgbW9yZSBjZWxscy5cbiAgICAgICAgLy8gU3dlZXQgc3BvdCBhbGxvd3MgbW9zdCBzbWFsbCBpdGVtcyB0byBmaXQgaW4gb25lIGNlbGxcbiAgICAgICAgdGhpcy54Q2VsbENvdW50ID0gTWF0aC5jZWlsKHdpZHRoIC8gY2VsbFNpemUpO1xuICAgICAgICB0aGlzLnlDZWxsQ291bnQgPSBNYXRoLmNlaWwoaGVpZ2h0IC8gY2VsbFNpemUpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy54Q2VsbENvdW50ICogdGhpcy55Q2VsbENvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGJveENlbGxzLnB1c2goW10pO1xuICAgICAgICAgICAgY2lyY2xlQ2VsbHMucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaXJjbGVLZXlzID0gW107XG4gICAgICAgIHRoaXMuYm94S2V5cyA9IFtdO1xuICAgICAgICB0aGlzLmJib3hlcyA9IFtdO1xuICAgICAgICB0aGlzLmNpcmNsZXMgPSBbXTtcblxuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLnhTY2FsZSA9IHRoaXMueENlbGxDb3VudCAvIHdpZHRoO1xuICAgICAgICB0aGlzLnlTY2FsZSA9IHRoaXMueUNlbGxDb3VudCAvIGhlaWdodDtcbiAgICAgICAgdGhpcy5ib3hVaWQgPSAwO1xuICAgICAgICB0aGlzLmNpcmNsZVVpZCA9IDA7XG4gICAgfVxuXG4gICAga2V5c0xlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3hLZXlzLmxlbmd0aCArIHRoaXMuY2lyY2xlS2V5cy5sZW5ndGg7XG4gICAgfVxuXG4gICAgaW5zZXJ0KGtleTogYW55LCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2ZvckVhY2hDZWxsKHgxLCB5MSwgeDIsIHkyLCB0aGlzLl9pbnNlcnRCb3hDZWxsLCB0aGlzLmJveFVpZCsrKTtcbiAgICAgICAgdGhpcy5ib3hLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgdGhpcy5iYm94ZXMucHVzaCh4MSk7XG4gICAgICAgIHRoaXMuYmJveGVzLnB1c2goeTEpO1xuICAgICAgICB0aGlzLmJib3hlcy5wdXNoKHgyKTtcbiAgICAgICAgdGhpcy5iYm94ZXMucHVzaCh5Mik7XG4gICAgfVxuXG4gICAgaW5zZXJ0Q2lyY2xlKGtleTogYW55LCB4OiBudW1iZXIsIHk6IG51bWJlciwgcmFkaXVzOiBudW1iZXIpIHtcbiAgICAgICAgLy8gSW5zZXJ0IGNpcmNsZSBpbnRvIGdyaWQgZm9yIGFsbCBjZWxscyBpbiB0aGUgY2lyY3Vtc2NyaWJpbmcgc3F1YXJlXG4gICAgICAgIC8vIEl0J3MgbW9yZSB0aGFuIG5lY2Vzc2FyeSAoYnkgYSBmYWN0b3Igb2YgNC9QSSksIGJ1dCBmYXN0IHRvIGluc2VydFxuICAgICAgICB0aGlzLl9mb3JFYWNoQ2VsbCh4IC0gcmFkaXVzLCB5IC0gcmFkaXVzLCB4ICsgcmFkaXVzLCB5ICsgcmFkaXVzLCB0aGlzLl9pbnNlcnRDaXJjbGVDZWxsLCB0aGlzLmNpcmNsZVVpZCsrKTtcbiAgICAgICAgdGhpcy5jaXJjbGVLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgdGhpcy5jaXJjbGVzLnB1c2goeCk7XG4gICAgICAgIHRoaXMuY2lyY2xlcy5wdXNoKHkpO1xuICAgICAgICB0aGlzLmNpcmNsZXMucHVzaChyYWRpdXMpO1xuICAgIH1cblxuICAgIF9pbnNlcnRCb3hDZWxsKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIGNlbGxJbmRleDogbnVtYmVyLCB1aWQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLmJveENlbGxzW2NlbGxJbmRleF0ucHVzaCh1aWQpO1xuICAgIH1cblxuICAgIF9pbnNlcnRDaXJjbGVDZWxsKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIGNlbGxJbmRleDogbnVtYmVyLCB1aWQ6IG51bWJlcikgIHtcbiAgICAgICAgdGhpcy5jaXJjbGVDZWxsc1tjZWxsSW5kZXhdLnB1c2godWlkKTtcbiAgICB9XG5cbiAgICBfcXVlcnkoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgaGl0VGVzdDogYm9vbGVhbiwgcHJlZGljYXRlPzogYW55KTogYm9vbGVhbiB8IEFycmF5PEdyaWRJdGVtPiB7XG4gICAgICAgIGlmICh4MiA8IDAgfHwgeDEgPiB0aGlzLndpZHRoIHx8IHkyIDwgMCB8fCB5MSA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGl0VGVzdCA/IGZhbHNlIDogW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGlmICh4MSA8PSAwICYmIHkxIDw9IDAgJiYgdGhpcy53aWR0aCA8PSB4MiAmJiB0aGlzLmhlaWdodCA8PSB5Mikge1xuICAgICAgICAgICAgaWYgKGhpdFRlc3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGJveFVpZCA9IDA7IGJveFVpZCA8IHRoaXMuYm94S2V5cy5sZW5ndGg7IGJveFVpZCsrKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuYm94S2V5c1tib3hVaWRdLFxuICAgICAgICAgICAgICAgICAgICB4MTogdGhpcy5iYm94ZXNbYm94VWlkICogNF0sXG4gICAgICAgICAgICAgICAgICAgIHkxOiB0aGlzLmJib3hlc1tib3hVaWQgKiA0ICsgMV0sXG4gICAgICAgICAgICAgICAgICAgIHgyOiB0aGlzLmJib3hlc1tib3hVaWQgKiA0ICsgMl0sXG4gICAgICAgICAgICAgICAgICAgIHkyOiB0aGlzLmJib3hlc1tib3hVaWQgKiA0ICsgM11cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGNpcmNsZVVpZCA9IDA7IGNpcmNsZVVpZCA8IHRoaXMuY2lyY2xlS2V5cy5sZW5ndGg7IGNpcmNsZVVpZCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IHRoaXMuY2lyY2xlc1tjaXJjbGVVaWQgKiAzXTtcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gdGhpcy5jaXJjbGVzW2NpcmNsZVVpZCAqIDMgKyAxXTtcbiAgICAgICAgICAgICAgICBjb25zdCByYWRpdXMgPSB0aGlzLmNpcmNsZXNbY2lyY2xlVWlkICogMyArIDJdO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiB0aGlzLmNpcmNsZUtleXNbY2lyY2xlVWlkXSxcbiAgICAgICAgICAgICAgICAgICAgeDE6IHggLSByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgIHkxOiB5IC0gcmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICB4MjogeCArIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgeTI6IHkgKyByYWRpdXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGUgPyByZXN1bHQuZmlsdGVyKHByZWRpY2F0ZSkgOiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeUFyZ3MgPSB7XG4gICAgICAgICAgICAgICAgaGl0VGVzdCxcbiAgICAgICAgICAgICAgICBzZWVuVWlkczoge2JveDoge30sIGNpcmNsZToge319XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fZm9yRWFjaENlbGwoeDEsIHkxLCB4MiwgeTIsIHRoaXMuX3F1ZXJ5Q2VsbCwgcmVzdWx0LCBxdWVyeUFyZ3MsIHByZWRpY2F0ZSk7XG4gICAgICAgICAgICByZXR1cm4gaGl0VGVzdCA/IHJlc3VsdC5sZW5ndGggPiAwIDogcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3F1ZXJ5Q2lyY2xlKHg6IG51bWJlciwgeTogbnVtYmVyLCByYWRpdXM6IG51bWJlciwgaGl0VGVzdDogYm9vbGVhbiwgcHJlZGljYXRlPzogYW55KTogYm9vbGVhbiB8IEFycmF5PEdyaWRJdGVtPiB7XG4gICAgICAgIC8vIEluc2VydCBjaXJjbGUgaW50byBncmlkIGZvciBhbGwgY2VsbHMgaW4gdGhlIGNpcmN1bXNjcmliaW5nIHNxdWFyZVxuICAgICAgICAvLyBJdCdzIG1vcmUgdGhhbiBuZWNlc3NhcnkgKGJ5IGEgZmFjdG9yIG9mIDQvUEkpLCBidXQgZmFzdCB0byBpbnNlcnRcbiAgICAgICAgY29uc3QgeDEgPSB4IC0gcmFkaXVzO1xuICAgICAgICBjb25zdCB4MiA9IHggKyByYWRpdXM7XG4gICAgICAgIGNvbnN0IHkxID0geSAtIHJhZGl1cztcbiAgICAgICAgY29uc3QgeTIgPSB5ICsgcmFkaXVzO1xuICAgICAgICBpZiAoeDIgPCAwIHx8IHgxID4gdGhpcy53aWR0aCB8fCB5MiA8IDAgfHwgeTEgPiB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIGhpdFRlc3QgPyBmYWxzZSA6IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm94IHF1ZXJ5IGVhcmx5IGV4aXRzIGlmIHRoZSBib3VuZGluZyBib3ggaXMgbGFyZ2VyIHRoYW4gdGhlIGdyaWQsIGJ1dCB3ZSBkb24ndCBkb1xuICAgICAgICAvLyB0aGUgZXF1aXZhbGVudCBjYWxjdWxhdGlvbiBmb3IgY2lyY2xlIHF1ZXJpZXMgYmVjYXVzZSBlYXJseSBleGl0IGlzIGxlc3MgbGlrZWx5XG4gICAgICAgIC8vIGFuZCB0aGUgY2FsY3VsYXRpb24gaXMgbW9yZSBleHBlbnNpdmVcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGNvbnN0IHF1ZXJ5QXJncyA9IHtcbiAgICAgICAgICAgIGhpdFRlc3QsXG4gICAgICAgICAgICBjaXJjbGU6IHt4LCB5LCByYWRpdXN9LFxuICAgICAgICAgICAgc2VlblVpZHM6IHtib3g6IHt9LCBjaXJjbGU6IHt9fVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9mb3JFYWNoQ2VsbCh4MSwgeTEsIHgyLCB5MiwgdGhpcy5fcXVlcnlDZWxsQ2lyY2xlLCByZXN1bHQsIHF1ZXJ5QXJncywgcHJlZGljYXRlKTtcbiAgICAgICAgcmV0dXJuIGhpdFRlc3QgPyByZXN1bHQubGVuZ3RoID4gMCA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICBxdWVyeSh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBwcmVkaWNhdGU/OiBhbnkpOiBBcnJheTxHcmlkSXRlbT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuX3F1ZXJ5KHgxLCB5MSwgeDIsIHkyLCBmYWxzZSwgcHJlZGljYXRlKTogYW55KTtcbiAgICB9XG5cbiAgICBoaXRUZXN0KHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIHByZWRpY2F0ZT86IGFueSk6IGJvb2xlYW4gIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9xdWVyeSh4MSwgeTEsIHgyLCB5MiwgdHJ1ZSwgcHJlZGljYXRlKTogYW55KTtcbiAgICB9XG5cbiAgICBoaXRUZXN0Q2lyY2xlKHg6IG51bWJlciwgeTogbnVtYmVyLCByYWRpdXM6IG51bWJlciwgcHJlZGljYXRlPzogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodGhpcy5fcXVlcnlDaXJjbGUoeCwgeSwgcmFkaXVzLCB0cnVlLCBwcmVkaWNhdGUpOiBhbnkpO1xuICAgIH1cblxuICAgIF9xdWVyeUNlbGwoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHJlc3VsdDogYW55LCBxdWVyeUFyZ3M6IGFueSwgcHJlZGljYXRlPzogYW55KTogdm9pZCB8IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWVuVWlkcyA9IHF1ZXJ5QXJncy5zZWVuVWlkcztcbiAgICAgICAgY29uc3QgYm94Q2VsbCA9IHRoaXMuYm94Q2VsbHNbY2VsbEluZGV4XTtcbiAgICAgICAgaWYgKGJveENlbGwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJib3hlcyA9IHRoaXMuYmJveGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBib3hVaWQgb2YgYm94Q2VsbCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VlblVpZHMuYm94W2JveFVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHMuYm94W2JveFVpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBib3hVaWQgKiA0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHgxIDw9IGJib3hlc1tvZmZzZXQgKyAyXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICh5MSA8PSBiYm94ZXNbb2Zmc2V0ICsgM10pICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoeDIgPj0gYmJveGVzW29mZnNldCArIDBdKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHkyID49IGJib3hlc1tvZmZzZXQgKyAxXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZSh0aGlzLmJveEtleXNbYm94VWlkXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlBcmdzLmhpdFRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuYm94S2V5c1tib3hVaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTogYmJveGVzW29mZnNldF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxOiBiYm94ZXNbb2Zmc2V0ICsgMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyOiBiYm94ZXNbb2Zmc2V0ICsgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyOiBiYm94ZXNbb2Zmc2V0ICsgM11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaXJjbGVDZWxsID0gdGhpcy5jaXJjbGVDZWxsc1tjZWxsSW5kZXhdO1xuICAgICAgICBpZiAoY2lyY2xlQ2VsbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgY2lyY2xlcyA9IHRoaXMuY2lyY2xlcztcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2lyY2xlVWlkIG9mIGNpcmNsZUNlbGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNlZW5VaWRzLmNpcmNsZVtjaXJjbGVVaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5VaWRzLmNpcmNsZVtjaXJjbGVVaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gY2lyY2xlVWlkICogMztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZUFuZFJlY3RDb2xsaWRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlc1tvZmZzZXQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZXNbb2Zmc2V0ICsgMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICB4MSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHkxLFxuICAgICAgICAgICAgICAgICAgICAgICAgeDIsXG4gICAgICAgICAgICAgICAgICAgICAgICB5MikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZSh0aGlzLmNpcmNsZUtleXNbY2lyY2xlVWlkXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlBcmdzLmhpdFRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IGNpcmNsZXNbb2Zmc2V0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB5ID0gY2lyY2xlc1tvZmZzZXQgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpdXMgPSBjaXJjbGVzW29mZnNldCArIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB0aGlzLmNpcmNsZUtleXNbY2lyY2xlVWlkXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDE6IHggLSByYWRpdXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkxOiB5IC0gcmFkaXVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MjogeCArIHJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTI6IHkgKyByYWRpdXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9xdWVyeUNlbGxDaXJjbGUoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgY2VsbEluZGV4OiBudW1iZXIsIHJlc3VsdDogYW55LCBxdWVyeUFyZ3M6IGFueSwgcHJlZGljYXRlPzogYW55KTogdm9pZCB8IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjaXJjbGUgPSBxdWVyeUFyZ3MuY2lyY2xlO1xuICAgICAgICBjb25zdCBzZWVuVWlkcyA9IHF1ZXJ5QXJncy5zZWVuVWlkcztcbiAgICAgICAgY29uc3QgYm94Q2VsbCA9IHRoaXMuYm94Q2VsbHNbY2VsbEluZGV4XTtcbiAgICAgICAgaWYgKGJveENlbGwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGJib3hlcyA9IHRoaXMuYmJveGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBib3hVaWQgb2YgYm94Q2VsbCkge1xuICAgICAgICAgICAgICAgIGlmICghc2VlblVpZHMuYm94W2JveFVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2VlblVpZHMuYm94W2JveFVpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBib3hVaWQgKiA0O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2lyY2xlQW5kUmVjdENvbGxpZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUueCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS55LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLnJhZGl1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJib3hlc1tvZmZzZXQgKyAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJib3hlc1tvZmZzZXQgKyAxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJib3hlc1tvZmZzZXQgKyAyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJib3hlc1tvZmZzZXQgKyAzXSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICghcHJlZGljYXRlIHx8IHByZWRpY2F0ZSh0aGlzLmJveEtleXNbYm94VWlkXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2lyY2xlQ2VsbCA9IHRoaXMuY2lyY2xlQ2VsbHNbY2VsbEluZGV4XTtcbiAgICAgICAgaWYgKGNpcmNsZUNlbGwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGNpcmNsZXMgPSB0aGlzLmNpcmNsZXM7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNpcmNsZVVpZCBvZiBjaXJjbGVDZWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzZWVuVWlkcy5jaXJjbGVbY2lyY2xlVWlkXSkge1xuICAgICAgICAgICAgICAgICAgICBzZWVuVWlkcy5jaXJjbGVbY2lyY2xlVWlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGNpcmNsZVVpZCAqIDM7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaXJjbGVzQ29sbGlkZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZXNbb2Zmc2V0XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZXNbb2Zmc2V0ICsgMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVzW29mZnNldCArIDJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLngsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGUueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZS5yYWRpdXMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoIXByZWRpY2F0ZSB8fCBwcmVkaWNhdGUodGhpcy5jaXJjbGVLZXlzW2NpcmNsZVVpZF0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9mb3JFYWNoQ2VsbCh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCBmbjogYW55LCBhcmcxOiBhbnksIGFyZzI/OiBhbnksIHByZWRpY2F0ZT86IGFueSkge1xuICAgICAgICBjb25zdCBjeDEgPSB0aGlzLl9jb252ZXJ0VG9YQ2VsbENvb3JkKHgxKTtcbiAgICAgICAgY29uc3QgY3kxID0gdGhpcy5fY29udmVydFRvWUNlbGxDb29yZCh5MSk7XG4gICAgICAgIGNvbnN0IGN4MiA9IHRoaXMuX2NvbnZlcnRUb1hDZWxsQ29vcmQoeDIpO1xuICAgICAgICBjb25zdCBjeTIgPSB0aGlzLl9jb252ZXJ0VG9ZQ2VsbENvb3JkKHkyKTtcblxuICAgICAgICBmb3IgKGxldCB4ID0gY3gxOyB4IDw9IGN4MjsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gY3kxOyB5IDw9IGN5MjsgeSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbEluZGV4ID0gdGhpcy54Q2VsbENvdW50ICogeSArIHg7XG4gICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwodGhpcywgeDEsIHkxLCB4MiwgeTIsIGNlbGxJbmRleCwgYXJnMSwgYXJnMiwgcHJlZGljYXRlKSkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NvbnZlcnRUb1hDZWxsQ29vcmQoeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMueENlbGxDb3VudCAtIDEsIE1hdGguZmxvb3IoeCAqIHRoaXMueFNjYWxlKSkpO1xuICAgIH1cblxuICAgIF9jb252ZXJ0VG9ZQ2VsbENvb3JkKHk6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLnlDZWxsQ291bnQgLSAxLCBNYXRoLmZsb29yKHkgKiB0aGlzLnlTY2FsZSkpKTtcbiAgICB9XG5cbiAgICBfY2lyY2xlc0NvbGxpZGUoeDE6IG51bWJlciwgeTE6IG51bWJlciwgcjE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgcjI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkeCA9IHgyIC0geDE7XG4gICAgICAgIGNvbnN0IGR5ID0geTIgLSB5MTtcbiAgICAgICAgY29uc3QgYm90aFJhZGlpID0gcjEgKyByMjtcbiAgICAgICAgcmV0dXJuIChib3RoUmFkaWkgKiBib3RoUmFkaWkpID4gKGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICB9XG5cbiAgICBfY2lyY2xlQW5kUmVjdENvbGxpZGUoY2lyY2xlWDogbnVtYmVyLCBjaXJjbGVZOiBudW1iZXIsIHJhZGl1czogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGhhbGZSZWN0V2lkdGggPSAoeDIgLSB4MSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0WCA9IE1hdGguYWJzKGNpcmNsZVggLSAoeDEgKyBoYWxmUmVjdFdpZHRoKSk7XG4gICAgICAgIGlmIChkaXN0WCA+IChoYWxmUmVjdFdpZHRoICsgcmFkaXVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFsZlJlY3RIZWlnaHQgPSAoeTIgLSB5MSkgLyAyO1xuICAgICAgICBjb25zdCBkaXN0WSA9IE1hdGguYWJzKGNpcmNsZVkgLSAoeTEgKyBoYWxmUmVjdEhlaWdodCkpO1xuICAgICAgICBpZiAoZGlzdFkgPiAoaGFsZlJlY3RIZWlnaHQgKyByYWRpdXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzdFggPD0gaGFsZlJlY3RXaWR0aCB8fCBkaXN0WSA8PSBoYWxmUmVjdEhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkeCA9IGRpc3RYIC0gaGFsZlJlY3RXaWR0aDtcbiAgICAgICAgY29uc3QgZHkgPSBkaXN0WSAtIGhhbGZSZWN0SGVpZ2h0O1xuICAgICAgICByZXR1cm4gKGR4ICogZHggKyBkeSAqIGR5IDw9IChyYWRpdXMgKiByYWRpdXMpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdyaWRJbmRleDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcblxuaW1wb3J0IHttYXQyLCBtYXQ0LCB2ZWMzLCB2ZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0ICogYXMgc3ltYm9sU2l6ZSBmcm9tICcuL3N5bWJvbF9zaXplLmpzJztcbmltcG9ydCB7YWRkRHluYW1pY0F0dHJpYnV0ZXMsIHVwZGF0ZUdsb2JlVmVydGV4Tm9ybWFsfSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIFByb2plY3Rpb24gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vcHJvamVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3JlbmRlci9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIFN5bWJvbEJ1Y2tldCBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgICBHbHlwaE9mZnNldEFycmF5LFxuICAgIFN5bWJvbExpbmVWZXJ0ZXhBcnJheSxcbiAgICBTeW1ib2xEeW5hbWljTGF5b3V0QXJyYXksXG4gICAgU3ltYm9sR2xvYmVFeHRBcnJheVxufSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtNYXQ0LCBWZWMzLCBWZWM0fSBmcm9tICdnbC1tYXRyaXgnO1xuXG5pbXBvcnQge1dyaXRpbmdNb2RlfSBmcm9tICcuLi9zeW1ib2wvc2hhcGluZy5qcyc7XG5pbXBvcnQge0Nhbm9uaWNhbFRpbGVJRCwgT3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHtjYWxjdWxhdGVHbG9iZUxhYmVsTWF0cml4fSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9nbG9iZV91dGlsLmpzJztcbmV4cG9ydCB7dXBkYXRlTGluZUxhYmVscywgaGlkZUdseXBocywgZ2V0TGFiZWxQbGFuZU1hdHJpeEZvclJlbmRlcmluZywgZ2V0TGFiZWxQbGFuZU1hdHJpeEZvclBsYWNlbWVudCwgZ2V0R2xDb29yZE1hdHJpeCwgcHJvamVjdCwgcHJvamVjdFZlY3RvciwgcHJvamVjdENsYW1wZWQsIGdldFBlcnNwZWN0aXZlUmF0aW8sIHBsYWNlRmlyc3RBbmRMYXN0R2x5cGgsIHBsYWNlR2x5cGhBbG9uZ0xpbmUsIHh5VHJhbnNmb3JtTWF0NH07XG5cbnR5cGUgUHJvamVjdGVkU3ltYm9sID0ge3xcbiAgICBwb2ludDogVmVjMyxcbiAgICBzaWduZWREaXN0YW5jZUZyb21DYW1lcmE6IG51bWJlclxufH07XG50eXBlIFBsYWNlZEdseXBoID0ge3xcbiAgICBhbmdsZTogbnVtYmVyLFxuICAgIHBhdGg6IEFycmF5PFZlYzM+LFxuICAgIHBvaW50OiBWZWMzLFxuICAgIHRpbGVQYXRoOiBBcnJheTxQb2ludD4sXG4gICAgdXA6IFZlYzNcbnx9XG5cbmNvbnN0IEZsaXBTdGF0ZSA9IHtcbiAgICB1bmtub3duOiAwLFxuICAgIGZsaXBSZXF1aXJlZDogMSxcbiAgICBmbGlwTm90UmVxdWlyZWQ6IDJcbn07XG5cbmNvbnN0IG1heFRhbmdlbnQgPSBNYXRoLnRhbig4NSAqIE1hdGguUEkgLyAxODApO1xuXG4vKlxuICogIyBPdmVydmlldyBvZiBjb29yZGluYXRlIHNwYWNlc1xuICpcbiAqICMjIFRpbGUgY29vcmRpbmF0ZSBzcGFjZXNcbiAqIEVhY2ggbGFiZWwgaGFzIGFuIGFuY2hvci4gU29tZSBsYWJlbHMgaGF2ZSBjb3JyZXNwb25kaW5nIGxpbmUgZ2VvbWV0cmllcy5cbiAqIFRoZSBwb2ludHMgZm9yIGJvdGggYW5jaG9ycyBhbmQgbGluZXMgYXJlIHN0b3JlZCBpbiB0aWxlIHVuaXRzLiBFYWNoIHRpbGUgaGFzIGl0J3Mgb3duXG4gKiBjb29yZGluYXRlIHNwYWNlIGdvaW5nIGZyb20gKDAsIDApIGF0IHRoZSB0b3AgbGVmdCB0byAoRVhURU5ULCBFWFRFTlQpIGF0IHRoZSBib3R0b20gcmlnaHQuXG4gKlxuICogIyMgR0wgY29vcmRpbmF0ZSBzcGFjZVxuICogQXQgdGhlIGVuZCBvZiBldmVyeXRoaW5nLCB0aGUgdmVydGV4IHNoYWRlciBuZWVkcyB0byBwcm9kdWNlIGEgcG9zaXRpb24gaW4gR0wgY29vcmRpbmF0ZSBzcGFjZSxcbiAqIHdoaWNoIGlzICgtMSwgMSkgYXQgdGhlIHRvcCBsZWZ0IGFuZCAoMSwgLTEpIGluIHRoZSBib3R0b20gcmlnaHQuXG4gKlxuICogIyMgTWFwIHBpeGVsIGNvb3JkaW5hdGUgc3BhY2VzXG4gKiBFYWNoIHRpbGUgaGFzIGEgcGl4ZWwgY29vcmRpbmF0ZSBzcGFjZS4gSXQncyBqdXN0IHRoZSB0aWxlIHVuaXRzIHNjYWxlZCBzbyB0aGF0IG9uZSB1bml0IGlzXG4gKiB3aGF0ZXZlciBjb3VudHMgYXMgMSBwaXhlbCBhdCB0aGUgY3VycmVudCB6b29tLlxuICogVGhpcyBzcGFjZSBpcyB1c2VkIGZvciBwaXRjaC1hbGlnbm1lbnQ9bWFwLCByb3RhdGlvbi1hbGlnbm1lbnQ9bWFwXG4gKlxuICogIyMgUm90YXRlZCBtYXAgcGl4ZWwgY29vcmRpbmF0ZSBzcGFjZXNcbiAqIExpa2UgdGhlIGFib3ZlLCBidXQgcm90YXRlZCBzbyBheGlzIG9mIHRoZSBzcGFjZSBhcmUgYWxpZ25lZCB3aXRoIHRoZSB2aWV3cG9ydCBpbnN0ZWFkIG9mIHRoZSB0aWxlLlxuICogVGhpcyBzcGFjZSBpcyB1c2VkIGZvciBwaXRjaC1hbGlnbm1lbnQ9bWFwLCByb3RhdGlvbi1hbGlnbm1lbnQ9dmlld3BvcnRcbiAqXG4gKiAjIyBWaWV3cG9ydCBwaXhlbCBjb29yZGluYXRlIHNwYWNlXG4gKiAoMCwgMCkgaXMgYXQgdGhlIHRvcCBsZWZ0IG9mIHRoZSBjYW52YXMgYW5kIChwaXhlbFdpZHRoLCBwaXhlbEhlaWdodCkgaXMgYXQgdGhlIGJvdHRvbSByaWdodCBjb3JuZXJcbiAqIG9mIHRoZSBjYW52YXMuIFRoaXMgc3BhY2UgaXMgdXNlZCBmb3IgcGl0Y2gtYWxpZ25tZW50PXZpZXdwb3J0XG4gKlxuICpcbiAqICMgVmVydGV4IHByb2plY3Rpb25cbiAqIEl0IGdvZXMgcm91Z2hseSBsaWtlIHRoaXM6XG4gKiAxLiBwcm9qZWN0IHRoZSBhbmNob3IgYW5kIGxpbmUgZnJvbSB0aWxlIHVuaXRzIGludG8gdGhlIGNvcnJlY3QgbGFiZWwgY29vcmRpbmF0ZSBzcGFjZVxuICogICAgICAtIG1hcCBwaXhlbCBzcGFjZSAgICAgICAgICAgcGl0Y2gtYWxpZ25tZW50PW1hcCAgICAgICAgIHJvdGF0aW9uLWFsaWdubWVudD1tYXBcbiAqICAgICAgLSByb3RhdGVkIG1hcCBwaXhlbCBzcGFjZSAgIHBpdGNoLWFsaWdubWVudD1tYXAgICAgICAgICByb3RhdGlvbi1hbGlnbm1lbnQ9dmlld3BvcnRcbiAqICAgICAgLSB2aWV3cG9ydCBwaXhlbCBzcGFjZSAgICAgIHBpdGNoLWFsaWdubWVudD12aWV3cG9ydCAgICByb3RhdGlvbi1hbGlnbm1lbnQ9KlxuICogMi4gaWYgdGhlIGxhYmVsIGZvbGxvd3MgYSBsaW5lLCBmaW5kIHRoZSBwb2ludCBhbG9uZyB0aGUgbGluZSB0aGF0IGlzIHRoZSBjb3JyZWN0IGRpc3RhbmNlIGZyb20gdGhlIGFuY2hvci5cbiAqIDMuIGFkZCB0aGUgZ2x5cGgncyBjb3JuZXIgb2Zmc2V0IHRvIHRoZSBwb2ludCBmcm9tIHN0ZXAgM1xuICogNC4gY29udmVydCBmcm9tIHRoZSBsYWJlbCBjb29yZGluYXRlIHNwYWNlIHRvIGdsIGNvb3JkaW5hdGVzXG4gKlxuICogRm9yIGhvcml6b250YWwgbGFiZWxzIHdlIHdhbnQgdG8gZG8gc3RlcCAxIGluIHRoZSBzaGFkZXIgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKG5vIGNwdSB3b3JrKS5cbiAqICAgICAgVGhpcyBpcyB3aGF0IGB1X2xhYmVsX3BsYW5lX21hdHJpeGAgaXMgdXNlZCBmb3IuXG4gKiBGb3IgbGFiZWxzIGFsaWduZWQgd2l0aCBsaW5lcyB3ZSBoYXZlIHRvIHN0ZXBzIDEgYW5kIDIgb24gdGhlIGNwdSBzaW5jZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgbGluZSBnZW9tZXRyeS5cbiAqICAgICAgVGhpcyBpcyB3aGF0IGB1cGRhdGVMaW5lTGFiZWxzKC4uLilgIGRvZXMuXG4gKiAgICAgIFNpbmNlIHRoZSBjb252ZXJzaW9uIGlzIGhhbmRsZWQgb24gdGhlIGNwdSB3ZSBqdXN0IHNldCBgdV9sYWJlbF9wbGFuZV9tYXRyaXhgIHRvIGFuIGlkZW50aXR5IG1hdHJpeC5cbiAqXG4gKiBTdGVwcyAzIGFuZCA0IGFyZSBkb25lIGluIHRoZSBzaGFkZXJzIGZvciBhbGwgbGFiZWxzLlxuICovXG5cbi8qXG4gKiBSZXR1cm5zIGEgbWF0cml4IGZvciBjb252ZXJ0aW5nIGZyb20gdGlsZSB1bml0cyB0byB0aGUgY29ycmVjdCBsYWJlbCBjb29yZGluYXRlIHNwYWNlLlxuICogVGhpcyB2YXJpYXRpb24gb2YgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBsYWJlbCBzcGFjZSBtYXRyaXggc3BlY2lhbGl6ZWQgZm9yIHJlbmRlcmluZy5cbiAqIEl0IHRyYW5zZm9ybXMgY29vcmRpbmF0ZXMgYXMtaXMgdG8gd2hhdGV2ZXIgdGhlIHRhcmdldCBzcGFjZSBpcyAoZWl0aGVyIDJEIG9yIDNEKS5cbiAqIFNlZSBhbHNvIGBnZXRMYWJlbFBsYW5lTWF0cml4Rm9yUGxhY2VtZW50YFxuICovXG5mdW5jdGlvbiBnZXRMYWJlbFBsYW5lTWF0cml4Rm9yUmVuZGVyaW5nKHBvc01hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlSUQ6IENhbm9uaWNhbFRpbGVJRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbjogUHJvamVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IEZsb2F0MzJBcnJheSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgbSA9IG1hdDQuY3JlYXRlKCk7XG5cbiAgICBpZiAocGl0Y2hXaXRoTWFwKSB7XG4gICAgICAgIGlmIChwcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxtID0gY2FsY3VsYXRlR2xvYmVMYWJlbE1hdHJpeCh0cmFuc2Zvcm0sIHRpbGVJRCk7XG4gICAgICAgICAgICBtYXQ0Lm11bHRpcGx5KG0sIG0sIGxtKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBtYXQyLmludmVydChbXSwgcGl4ZWxzVG9UaWxlVW5pdHMpO1xuICAgICAgICAgICAgbVswXSA9IHNbMF07XG4gICAgICAgICAgICBtWzFdID0gc1sxXTtcbiAgICAgICAgICAgIG1bNF0gPSBzWzJdO1xuICAgICAgICAgICAgbVs1XSA9IHNbM107XG4gICAgICAgICAgICBpZiAoIXJvdGF0ZVdpdGhNYXApIHtcbiAgICAgICAgICAgICAgICBtYXQ0LnJvdGF0ZVoobSwgbSwgdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdDQubXVsdGlwbHkobSwgdHJhbnNmb3JtLmxhYmVsUGxhbmVNYXRyaXgsIHBvc01hdHJpeCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG07XG59XG5cbi8qXG4gKiBSZXR1cm5zIGEgbWF0cml4IGZvciBjb252ZXJ0aW5nIGZyb20gdGlsZSB1bml0cyB0byB0aGUgY29ycmVjdCBsYWJlbCBjb29yZGluYXRlIHNwYWNlLlxuICogVGhpcyB2YXJpYXRpb24gb2YgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBtYXRyaXggc3BlY2lhbGl6ZWQgZm9yIHBsYWNlbWVudCBsb2dpYy5cbiAqIENvb3JkaW5hdGVzIHdpbGwgYmUgY2xhbXBlZCB0byB4JnkgMkQgcGxhbmUgd2hpY2ggaXMgdXNlZCB3aXRoIHZpZXdwb3J0IGFuZCBtYXAgYWxpZ25lZCBwbGFjZW1lbnRcbiAqIGxvZ2ljIGluIG1vc3QgY2FzZXMuIENlcnRhaW4gcHJvamVjdGlvbnMgc3VjaCBhcyBnbG9iZSB2aWV3IHdpbGwgdXNlIDNEIHNwYWNlIGZvciBtYXAgYWxpZ25lZFxuICogbGFiZWwgcGxhY2VtZW50LlxuICovXG5mdW5jdGlvbiBnZXRMYWJlbFBsYW5lTWF0cml4Rm9yUGxhY2VtZW50KHBvc01hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlSUQ6IENhbm9uaWNhbFRpbGVJRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbjogUHJvamVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IEZsb2F0MzJBcnJheSk6IEZsb2F0MzJBcnJheSB7XG4gICAgY29uc3QgbSA9IGdldExhYmVsUGxhbmVNYXRyaXhGb3JSZW5kZXJpbmcocG9zTWF0cml4LCB0aWxlSUQsIHBpdGNoV2l0aE1hcCwgcm90YXRlV2l0aE1hcCwgdHJhbnNmb3JtLCBwcm9qZWN0aW9uLCBwaXhlbHNUb1RpbGVVbml0cyk7XG5cbiAgICAvLyBTeW1ib2wgcGxhY2VtZW50IGxvZ2ljIGlzIHBlcmZvcm1lZCBpbiAyRCBpbiBtb3N0IHNjZW5hcmlvcy5cbiAgICAvLyBGb3IgdGhpcyByZWFzb24gcHJvamVjdCBhbGwgY29vcmRpbmF0ZXMgdG8gdGhlIHh5LXBsYW5lIGJ5IGRpc2NhcmRpbmcgdGhlIHotY29tcG9uZW50XG4gICAgaWYgKHByb2plY3Rpb24ubmFtZSAhPT0gJ2dsb2JlJyB8fCAhcGl0Y2hXaXRoTWFwKSB7XG4gICAgICAgIC8vIFByZS1tdWx0aXBseSBieSBzY2FsaW5nIHogdG8gMFxuICAgICAgICBtWzJdID0gbVs2XSA9IG1bMTBdID0gbVsxNF0gPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBtO1xufVxuXG4vKlxuICogUmV0dXJucyBhIG1hdHJpeCBmb3IgY29udmVydGluZyBmcm9tIHRoZSBjb3JyZWN0IGxhYmVsIGNvb3JkaW5hdGUgc3BhY2UgdG8gZ2wgY29vcmRzLlxuICovXG5mdW5jdGlvbiBnZXRHbENvb3JkTWF0cml4KHBvc01hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlSUQ6IENhbm9uaWNhbFRpbGVJRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVXaXRoTWFwOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbjogUHJvamVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHM6IEZsb2F0MzJBcnJheSk6IEZsb2F0MzJBcnJheSB7XG4gICAgaWYgKHBpdGNoV2l0aE1hcCkge1xuICAgICAgICBpZiAocHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICBjb25zdCBtID0gZ2V0TGFiZWxQbGFuZU1hdHJpeEZvclJlbmRlcmluZyhwb3NNYXRyaXgsIHRpbGVJRCwgcGl0Y2hXaXRoTWFwLCByb3RhdGVXaXRoTWFwLCB0cmFuc2Zvcm0sIHByb2plY3Rpb24sIHBpeGVsc1RvVGlsZVVuaXRzKTtcbiAgICAgICAgICAgIG1hdDQuaW52ZXJ0KG0sIG0pO1xuICAgICAgICAgICAgbWF0NC5tdWx0aXBseShtLCBwb3NNYXRyaXgsIG0pO1xuICAgICAgICAgICAgcmV0dXJuIG07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtID0gbWF0NC5jbG9uZShwb3NNYXRyaXgpO1xuICAgICAgICAgICAgY29uc3QgcyA9IG1hdDQuaWRlbnRpdHkoW10pO1xuICAgICAgICAgICAgc1swXSA9IHBpeGVsc1RvVGlsZVVuaXRzWzBdO1xuICAgICAgICAgICAgc1sxXSA9IHBpeGVsc1RvVGlsZVVuaXRzWzFdO1xuICAgICAgICAgICAgc1s0XSA9IHBpeGVsc1RvVGlsZVVuaXRzWzJdO1xuICAgICAgICAgICAgc1s1XSA9IHBpeGVsc1RvVGlsZVVuaXRzWzNdO1xuICAgICAgICAgICAgbWF0NC5tdWx0aXBseShtLCBtLCBzKTtcbiAgICAgICAgICAgIGlmICghcm90YXRlV2l0aE1hcCkge1xuICAgICAgICAgICAgICAgIG1hdDQucm90YXRlWihtLCBtLCAtdHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS5nbENvb3JkTWF0cml4O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcHJvamVjdChwb2ludDogUG9pbnQsIG1hdHJpeDogTWF0NCwgZWxldmF0aW9uOiBudW1iZXIgPSAwKTogUHJvamVjdGVkU3ltYm9sIHtcbiAgICBjb25zdCBwb3MgPSBbcG9pbnQueCwgcG9pbnQueSwgZWxldmF0aW9uLCAxXTtcbiAgICBpZiAoZWxldmF0aW9uKSB7XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChwb3MsIHBvcywgbWF0cml4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB4eVRyYW5zZm9ybU1hdDQocG9zLCBwb3MsIG1hdHJpeCk7XG4gICAgfVxuICAgIGNvbnN0IHcgPSBwb3NbM107XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9pbnQ6IFtwb3NbMF0gLyB3LCBwb3NbMV0gLyB3LCBwb3NbMl0gLyB3XSxcbiAgICAgICAgc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhOiB3XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFZlY3Rvcihwb2ludDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBtYXRyaXg6IE1hdDQpOiBQcm9qZWN0ZWRTeW1ib2wge1xuICAgIGNvbnN0IHBvcyA9IFtwb2ludFswXSwgcG9pbnRbMV0sIHBvaW50WzJdLCAxXTtcbiAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocG9zLCBwb3MsIG1hdHJpeCk7XG4gICAgY29uc3QgdyA9IHBvc1szXTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwb2ludDogW3Bvc1swXSAvIHcsIHBvc1sxXSAvIHcsIHBvc1syXSAvIHddLFxuICAgICAgICBzaWduZWREaXN0YW5jZUZyb21DYW1lcmE6IHdcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0Q2xhbXBlZChwb2ludDogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBtYXRyaXg6IE1hdDQpOiBWZWM0IHtcbiAgICBjb25zdCBwb3MgPSBbcG9pbnRbMF0sIHBvaW50WzFdLCBwb2ludFsyXSwgMV07XG4gICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHBvcywgcG9zLCBtYXRyaXgpO1xuXG4gICAgLy8gQ2xhbXAgZGlzdGFuY2UgdG8gYSBwb3NpdGl2ZSB2YWx1ZSBzbyB3ZSBjYW4gYXZvaWQgc2NyZWVuIGNvb3JkaW5hdGVcbiAgICAvLyBiZWluZyBmbGlwcGVkIHBvc3NpYmx5IGR1ZSB0byBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uXG4gICAgY29uc3QgdyA9IE1hdGgubWF4KHBvc1szXSwgMC4wMDAwMDEpO1xuXG4gICAgcmV0dXJuIFtwb3NbMF0gLyB3LCBwb3NbMV0gLyB3LCBwb3NbMl0gLyB3LCB3XTtcbn1cblxuZnVuY3Rpb24gZ2V0UGVyc3BlY3RpdmVSYXRpbyhjYW1lcmFUb0NlbnRlckRpc3RhbmNlOiBudW1iZXIsIHNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5taW4oMC41ICsgMC41ICogKGNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyBzaWduZWREaXN0YW5jZUZyb21DYW1lcmEpLCAxLjUpO1xufVxuXG5mdW5jdGlvbiBpc1Zpc2libGUoYW5jaG9yUG9zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICBjbGlwcGluZ0J1ZmZlcjogW251bWJlciwgbnVtYmVyXSkge1xuICAgIGNvbnN0IHggPSBhbmNob3JQb3NbMF0gLyBhbmNob3JQb3NbM107XG4gICAgY29uc3QgeSA9IGFuY2hvclBvc1sxXSAvIGFuY2hvclBvc1szXTtcbiAgICBjb25zdCBpblBhZGRlZFZpZXdwb3J0ID0gKFxuICAgICAgICB4ID49IC1jbGlwcGluZ0J1ZmZlclswXSAmJlxuICAgICAgICB4IDw9IGNsaXBwaW5nQnVmZmVyWzBdICYmXG4gICAgICAgIHkgPj0gLWNsaXBwaW5nQnVmZmVyWzFdICYmXG4gICAgICAgIHkgPD0gY2xpcHBpbmdCdWZmZXJbMV0pO1xuICAgIHJldHVybiBpblBhZGRlZFZpZXdwb3J0O1xufVxuXG4vKlxuICogIFVwZGF0ZSB0aGUgYGR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXJgIGZvciB0aGUgYnVmZmVyIHdpdGggdGhlIGNvcnJlY3QgZ2x5cGggcG9zaXRpb25zIGZvciB0aGUgY3VycmVudCBtYXAgdmlldy5cbiAqICBUaGlzIGlzIG9ubHkgcnVuIG9uIGxhYmVscyB0aGF0IGFyZSBhbGlnbmVkIHdpdGggbGluZXMuIEhvcml6b250YWwgbGFiZWxzIGFyZSBoYW5kbGVkIGVudGlyZWx5IGluIHRoZSBzaGFkZXIuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUxpbmVMYWJlbHMoYnVja2V0OiBTeW1ib2xCdWNrZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBvc01hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludGVyOiBQYWludGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RleHQ6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xDb29yZE1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBVcHJpZ2h0OiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbGV2YXRpb246ID8oKHA6IFBvaW50KSA9PiBBcnJheTxudW1iZXI+KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG5cbiAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IHNpemVEYXRhID0gaXNUZXh0ID8gYnVja2V0LnRleHRTaXplRGF0YSA6IGJ1Y2tldC5pY29uU2l6ZURhdGE7XG4gICAgY29uc3QgcGFydGlhbGx5RXZhbHVhdGVkU2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbShzaXplRGF0YSwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSk7XG4gICAgY29uc3QgaXNHbG9iZSA9IHRyLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJztcblxuICAgIGNvbnN0IGNsaXBwaW5nQnVmZmVyID0gWzI1NiAvIHBhaW50ZXIud2lkdGggKiAyICsgMSwgMjU2IC8gcGFpbnRlci5oZWlnaHQgKiAyICsgMV07XG5cbiAgICBjb25zdCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkgPSBpc1RleHQgP1xuICAgICAgICBidWNrZXQudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QXJyYXkgOlxuICAgICAgICBidWNrZXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QXJyYXk7XG4gICAgZHluYW1pY0xheW91dFZlcnRleEFycmF5LmNsZWFyKCk7XG5cbiAgICBsZXQgZ2xvYmVFeHRWZXJ0ZXhBcnJheTogP1N5bWJvbEdsb2JlRXh0QXJyYXkgPSBudWxsO1xuICAgIGlmIChpc0dsb2JlKSB7XG4gICAgICAgIGdsb2JlRXh0VmVydGV4QXJyYXkgPSBpc1RleHQgP1xuICAgICAgICAgICAgYnVja2V0LnRleHQuZ2xvYmVFeHRWZXJ0ZXhBcnJheSA6XG4gICAgICAgICAgICBidWNrZXQuaWNvbi5nbG9iZUV4dFZlcnRleEFycmF5O1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVWZXJ0ZXhBcnJheSA9IGJ1Y2tldC5saW5lVmVydGV4QXJyYXk7XG4gICAgY29uc3QgcGxhY2VkU3ltYm9scyA9IGlzVGV4dCA/IGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5IDogYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXk7XG5cbiAgICBjb25zdCBhc3BlY3RSYXRpbyA9IHBhaW50ZXIudHJhbnNmb3JtLndpZHRoIC8gcGFpbnRlci50cmFuc2Zvcm0uaGVpZ2h0O1xuXG4gICAgbGV0IHVzZVZlcnRpY2FsID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBzID0gMDsgcyA8IHBsYWNlZFN5bWJvbHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sOiBhbnkgPSBwbGFjZWRTeW1ib2xzLmdldChzKTtcblxuICAgICAgICAvLyBOb3JtYWxseSwgdGhlICdIb3Jpem9udGFsfFZlcnRpY2FsJyB3cml0aW5nIG1vZGUgaXMgZm9sbG93ZWQgYnkgYSAnVmVydGljYWwnIGNvdW50ZXJwYXJ0LCB0aGlzXG4gICAgICAgIC8vIGlzIG5vdCB0cnVlIGZvciAnVmVydGljYWwnIG9ubHkgbGluZSBsYWJlbHMuIEZvciB0aGlzIGNhc2UsIHdlJ2xsIGhhdmUgdG8gb3ZlcndyaXRlIHRoZSAndXNlVmVydGljYWwnXG4gICAgICAgIC8vIHN0YXR1cyBiZWZvcmUgZnVydGhlciBjaGVja3MuXG4gICAgICAgIGlmIChzeW1ib2wud3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsICYmICF1c2VWZXJ0aWNhbCkge1xuICAgICAgICAgICAgaWYgKHMgPT09IDAgfHwgcGxhY2VkU3ltYm9scy5nZXQocyAtIDEpLndyaXRpbmdNb2RlICE9PSBXcml0aW5nTW9kZS5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgdXNlVmVydGljYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgZG8gY2FsY3VsYXRpb25zIGZvciB2ZXJ0aWNhbCBnbHlwaHMgdW5sZXNzIHRoZSBwcmV2aW91cyBzeW1ib2wgd2FzIGhvcml6b250YWxcbiAgICAgICAgLy8gYW5kIHdlIGRldGVybWluZWQgdGhhdCB2ZXJ0aWNhbCBnbHlwaHMgd2VyZSBuZWNlc3NhcnkuXG4gICAgICAgIC8vIEFsc28gZG9uJ3QgZG8gY2FsY3VsYXRpb25zIGZvciBzeW1ib2xzIHRoYXQgYXJlIGNvbGxpZGVkIGFuZCBmdWxseSBmYWRlZCBvdXRcbiAgICAgICAgaWYgKChzeW1ib2wuaGlkZGVuIHx8IHN5bWJvbC53cml0aW5nTW9kZSA9PT0gV3JpdGluZ01vZGUudmVydGljYWwpICYmICF1c2VWZXJ0aWNhbCkge1xuICAgICAgICAgICAgaGlkZUdseXBocyhzeW1ib2wubnVtR2x5cGhzLCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXdrd2FyZC4uLiBidXQgd2UncmUgY291bnRpbmcgb24gdGhlIHBhaXJlZCBcInZlcnRpY2FsXCIgc3ltYm9sIGNvbWluZyBpbW1lZGlhdGVseSBhZnRlciBpdHMgaG9yaXpvbnRhbCBjb3VudGVycGFydFxuICAgICAgICB1c2VWZXJ0aWNhbCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFByb2plY3QgdGlsZSBhbmNob3IgdG8gZ2xvYmUgYW5jaG9yXG4gICAgICAgIGNvbnN0IHRpbGVBbmNob3JQb2ludCA9IG5ldyBQb2ludChzeW1ib2wudGlsZUFuY2hvclgsIHN5bWJvbC50aWxlQW5jaG9yWSk7XG4gICAgICAgIGNvbnN0IGVsZXZhdGlvbiA9IGdldEVsZXZhdGlvbiA/IGdldEVsZXZhdGlvbih0aWxlQW5jaG9yUG9pbnQpIDogWzAsIDAsIDBdO1xuICAgICAgICBjb25zdCBwcm9qZWN0ZWRBbmNob3IgPSB0ci5wcm9qZWN0aW9uLnByb2plY3RUaWxlUG9pbnQodGlsZUFuY2hvclBvaW50LngsIHRpbGVBbmNob3JQb2ludC55LCB0aWxlSUQuY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgZWxldmF0ZWRBbmNob3IgPSBbcHJvamVjdGVkQW5jaG9yLnggKyBlbGV2YXRpb25bMF0sIHByb2plY3RlZEFuY2hvci55ICsgZWxldmF0aW9uWzFdLCBwcm9qZWN0ZWRBbmNob3IueiArIGVsZXZhdGlvblsyXV07XG4gICAgICAgIGNvbnN0IGFuY2hvclBvcyA9IFsuLi5lbGV2YXRlZEFuY2hvciwgMS4wXTtcblxuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQoYW5jaG9yUG9zLCBhbmNob3JQb3MsIHBvc01hdHJpeCk7XG5cbiAgICAgICAgLy8gRG9uJ3QgYm90aGVyIGNhbGN1bGF0aW5nIHRoZSBjb3JyZWN0IHBvaW50IGZvciBpbnZpc2libGUgbGFiZWxzLlxuICAgICAgICBpZiAoIWlzVmlzaWJsZShhbmNob3JQb3MsIGNsaXBwaW5nQnVmZmVyKSkge1xuICAgICAgICAgICAgaGlkZUdseXBocyhzeW1ib2wubnVtR2x5cGhzLCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FtZXJhVG9BbmNob3JEaXN0YW5jZSA9IGFuY2hvclBvc1szXTtcbiAgICAgICAgY29uc3QgcGVyc3BlY3RpdmVSYXRpbyA9IGdldFBlcnNwZWN0aXZlUmF0aW8ocGFpbnRlci50cmFuc2Zvcm0uY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSwgY2FtZXJhVG9BbmNob3JEaXN0YW5jZSk7XG5cbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvckZlYXR1cmUoc2l6ZURhdGEsIHBhcnRpYWxseUV2YWx1YXRlZFNpemUsIHN5bWJvbCk7XG4gICAgICAgIGNvbnN0IHBpdGNoU2NhbGVkRm9udFNpemUgPSBwaXRjaFdpdGhNYXAgPyBmb250U2l6ZSAvIHBlcnNwZWN0aXZlUmF0aW8gOiBmb250U2l6ZSAqIHBlcnNwZWN0aXZlUmF0aW87XG5cbiAgICAgICAgY29uc3QgbGFiZWxQbGFuZUFuY2hvclBvaW50ID0gcHJvamVjdChuZXcgUG9pbnQoZWxldmF0ZWRBbmNob3JbMF0sIGVsZXZhdGVkQW5jaG9yWzFdKSwgbGFiZWxQbGFuZU1hdHJpeCwgZWxldmF0ZWRBbmNob3JbMl0pO1xuXG4gICAgICAgIC8vIFNraXAgbGFiZWxzIGJlaGluZCB0aGUgY2FtZXJhXG4gICAgICAgIGlmIChsYWJlbFBsYW5lQW5jaG9yUG9pbnQuc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhIDw9IDAuMCkge1xuICAgICAgICAgICAgaGlkZUdseXBocyhzeW1ib2wubnVtR2x5cGhzLCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHJvamVjdGlvbkNhY2hlOiB7W186IG51bWJlcl06IFZlYzN9ID0ge307XG5cbiAgICAgICAgY29uc3QgZ2V0RWxldmF0aW9uRm9yUGxhY2VtZW50ID0gcGl0Y2hXaXRoTWFwID8gbnVsbCA6IGdldEVsZXZhdGlvbjsgLy8gV2hlbiBwaXRjaFdpdGhNYXAsIHdlJ3JlIHByb2plY3RpbmcgdG8gc2NhbGVkIHRpbGUgY29vcmRpbmF0ZSBzcGFjZTogdGhlcmUgaXMgbm8gbmVlZCB0byBnZXQgZWxldmF0aW9uIGFzIGl0IGRvZXNuJ3QgYWZmZWN0IHByb2plY3Rpb24uXG4gICAgICAgIGNvbnN0IHBsYWNlVW5mbGlwcGVkOiBhbnkgPSBwbGFjZUdseXBoc0Fsb25nTGluZShzeW1ib2wsIHBpdGNoU2NhbGVkRm9udFNpemUsIGZhbHNlIC8qdW5mbGlwcGVkKi8sIGtlZXBVcHJpZ2h0LCBwb3NNYXRyaXgsIGxhYmVsUGxhbmVNYXRyaXgsIGdsQ29vcmRNYXRyaXgsXG4gICAgICAgICAgICBidWNrZXQuZ2x5cGhPZmZzZXRBcnJheSwgbGluZVZlcnRleEFycmF5LCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGdsb2JlRXh0VmVydGV4QXJyYXksIGxhYmVsUGxhbmVBbmNob3JQb2ludC5wb2ludCwgdGlsZUFuY2hvclBvaW50LCBwcm9qZWN0aW9uQ2FjaGUsIGFzcGVjdFJhdGlvLCBnZXRFbGV2YXRpb25Gb3JQbGFjZW1lbnQsIHRyLnByb2plY3Rpb24sIHRpbGVJRCwgcGl0Y2hXaXRoTWFwKTtcblxuICAgICAgICB1c2VWZXJ0aWNhbCA9IHBsYWNlVW5mbGlwcGVkLnVzZVZlcnRpY2FsO1xuXG4gICAgICAgIGlmIChnZXRFbGV2YXRpb25Gb3JQbGFjZW1lbnQgJiYgcGxhY2VVbmZsaXBwZWQubmVlZHNGbGlwcGluZykgcHJvamVjdGlvbkNhY2hlID0ge307IC8vIFRydW5jYXRlZCBwb2ludHMgc2hvdWxkIGJlIHJlY2FsY3VsYXRlZC5cbiAgICAgICAgaWYgKHBsYWNlVW5mbGlwcGVkLm5vdEVub3VnaFJvb20gfHwgdXNlVmVydGljYWwgfHxcbiAgICAgICAgICAgIChwbGFjZVVuZmxpcHBlZC5uZWVkc0ZsaXBwaW5nICYmXG4gICAgICAgICAgICAgcGxhY2VHbHlwaHNBbG9uZ0xpbmUoc3ltYm9sLCBwaXRjaFNjYWxlZEZvbnRTaXplLCB0cnVlIC8qZmxpcHBlZCovLCBrZWVwVXByaWdodCwgcG9zTWF0cml4LCBsYWJlbFBsYW5lTWF0cml4LCBnbENvb3JkTWF0cml4LFxuICAgICAgICAgICAgICAgICBidWNrZXQuZ2x5cGhPZmZzZXRBcnJheSwgbGluZVZlcnRleEFycmF5LCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXksIGdsb2JlRXh0VmVydGV4QXJyYXksIGxhYmVsUGxhbmVBbmNob3JQb2ludC5wb2ludCwgdGlsZUFuY2hvclBvaW50LCBwcm9qZWN0aW9uQ2FjaGUsIGFzcGVjdFJhdGlvLCBnZXRFbGV2YXRpb25Gb3JQbGFjZW1lbnQsIHRyLnByb2plY3Rpb24sIHRpbGVJRCwgcGl0Y2hXaXRoTWFwKS5ub3RFbm91Z2hSb29tKSkge1xuICAgICAgICAgICAgaGlkZUdseXBocyhzeW1ib2wubnVtR2x5cGhzLCBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzVGV4dCkge1xuICAgICAgICBidWNrZXQudGV4dC5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICAgICAgaWYgKGdsb2JlRXh0VmVydGV4QXJyYXkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC50ZXh0Lmdsb2JlRXh0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZ2xvYmVFeHRWZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBidWNrZXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZHluYW1pY0xheW91dFZlcnRleEFycmF5KTtcbiAgICAgICAgaWYgKGdsb2JlRXh0VmVydGV4QXJyYXkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5pY29uLmdsb2JlRXh0VmVydGV4QnVmZmVyLnVwZGF0ZURhdGEoZ2xvYmVFeHRWZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHBsYWNlRmlyc3RBbmRMYXN0R2x5cGgoXG4gICAgZm9udFNjYWxlOiBudW1iZXIsXG4gICAgZ2x5cGhPZmZzZXRBcnJheTogR2x5cGhPZmZzZXRBcnJheSxcbiAgICBsaW5lT2Zmc2V0WDogbnVtYmVyLFxuICAgIGxpbmVPZmZzZXRZOiBudW1iZXIsXG4gICAgZmxpcDogYm9vbGVhbixcbiAgICBhbmNob3JQb2ludDogVmVjMyxcbiAgICB0aWxlQW5jaG9yUG9pbnQ6IFBvaW50LFxuICAgIHN5bWJvbDogYW55LFxuICAgIGxpbmVWZXJ0ZXhBcnJheTogU3ltYm9sTGluZVZlcnRleEFycmF5LFxuICAgIGxhYmVsUGxhbmVNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBwcm9qZWN0aW9uQ2FjaGU6IGFueSxcbiAgICBnZXRFbGV2YXRpb246ID8oKHA6IFBvaW50KSA9PiBBcnJheTxudW1iZXI+KSxcbiAgICByZXR1cm5QYXRoSW5UaWxlQ29vcmRzOiA/Ym9vbGVhbixcbiAgICBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uLFxuICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCxcbiAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4pOiBudWxsIHwge3xmaXJzdDogUGxhY2VkR2x5cGgsIGxhc3Q6IFBsYWNlZEdseXBofH0ge1xuXG4gICAgY29uc3QgZ2x5cGhFbmRJbmRleCA9IHN5bWJvbC5nbHlwaFN0YXJ0SW5kZXggKyBzeW1ib2wubnVtR2x5cGhzO1xuICAgIGNvbnN0IGxpbmVTdGFydEluZGV4ID0gc3ltYm9sLmxpbmVTdGFydEluZGV4O1xuICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IHN5bWJvbC5saW5lU3RhcnRJbmRleCArIHN5bWJvbC5saW5lTGVuZ3RoO1xuXG4gICAgY29uc3QgZmlyc3RHbHlwaE9mZnNldCA9IGdseXBoT2Zmc2V0QXJyYXkuZ2V0b2Zmc2V0WChzeW1ib2wuZ2x5cGhTdGFydEluZGV4KTtcbiAgICBjb25zdCBsYXN0R2x5cGhPZmZzZXQgPSBnbHlwaE9mZnNldEFycmF5LmdldG9mZnNldFgoZ2x5cGhFbmRJbmRleCAtIDEpO1xuXG4gICAgY29uc3QgZmlyc3RQbGFjZWRHbHlwaCA9IHBsYWNlR2x5cGhBbG9uZ0xpbmUoZm9udFNjYWxlICogZmlyc3RHbHlwaE9mZnNldCwgbGluZU9mZnNldFgsIGxpbmVPZmZzZXRZLCBmbGlwLCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBzeW1ib2wuc2VnbWVudCxcbiAgICAgICAgbGluZVN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCwgbGluZVZlcnRleEFycmF5LCBsYWJlbFBsYW5lTWF0cml4LCBwcm9qZWN0aW9uQ2FjaGUsIGdldEVsZXZhdGlvbiwgcmV0dXJuUGF0aEluVGlsZUNvb3JkcywgdHJ1ZSwgcHJvamVjdGlvbiwgdGlsZUlELCBwaXRjaFdpdGhNYXApO1xuICAgIGlmICghZmlyc3RQbGFjZWRHbHlwaClcbiAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBsYXN0UGxhY2VkR2x5cGggPSBwbGFjZUdseXBoQWxvbmdMaW5lKGZvbnRTY2FsZSAqIGxhc3RHbHlwaE9mZnNldCwgbGluZU9mZnNldFgsIGxpbmVPZmZzZXRZLCBmbGlwLCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBzeW1ib2wuc2VnbWVudCxcbiAgICAgICAgbGluZVN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCwgbGluZVZlcnRleEFycmF5LCBsYWJlbFBsYW5lTWF0cml4LCBwcm9qZWN0aW9uQ2FjaGUsIGdldEVsZXZhdGlvbiwgcmV0dXJuUGF0aEluVGlsZUNvb3JkcywgdHJ1ZSwgcHJvamVjdGlvbiwgdGlsZUlELCBwaXRjaFdpdGhNYXApO1xuICAgIGlmICghbGFzdFBsYWNlZEdseXBoKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB7Zmlyc3Q6IGZpcnN0UGxhY2VkR2x5cGgsIGxhc3Q6IGxhc3RQbGFjZWRHbHlwaH07XG59XG5cbi8vIENoZWNrIGluIHRoZSBnbENvb3JkaW5hdGUgc3BhY2UsIHRoZSByb3VnaCBlc3RpbWF0aW9uIG9mIGFuZ2xlIGJldHdlZW4gdGhlIHRleHQgbGluZSBhbmQgdGhlIFkgYXhpcy5cbi8vIElmIHRoZSBhbmdsZSBpZiBsZXNzIG9yIGVxdWFsIHRvIDUgZGVncmVlLCB0aGVuIGtlZXAgdGhlIHRleHQgZ2x5cGhzIHVuZmxpcHBlZCBldmVuIGlmIGl0IGlzIHJlcXVpcmVkLlxuZnVuY3Rpb24gaXNJbkZsaXBSZXRhaW5SYW5nZShmaXJzdFBvaW50LCBsYXN0UG9pbnQsIGFzcGVjdFJhdGlvKSB7XG4gICAgY29uc3QgZGVsdGFZID0gbGFzdFBvaW50LnkgLSBmaXJzdFBvaW50Lnk7XG4gICAgY29uc3QgZGVsdGFYID0gKGxhc3RQb2ludC54IC0gZmlyc3RQb2ludC54KSAqIGFzcGVjdFJhdGlvO1xuICAgIGlmIChkZWx0YVggPT09IDAuMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgYWJzVGFuZ2VudCA9IE1hdGguYWJzKGRlbHRhWSAvIGRlbHRhWCk7XG4gICAgcmV0dXJuIChhYnNUYW5nZW50ID4gbWF4VGFuZ2VudCk7XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVzT3JpZW50YXRpb25DaGFuZ2Uoc3ltYm9sLCBmaXJzdFBvaW50LCBsYXN0UG9pbnQsIGFzcGVjdFJhdGlvKSB7XG4gICAgaWYgKHN5bWJvbC53cml0aW5nTW9kZSA9PT0gV3JpdGluZ01vZGUuaG9yaXpvbnRhbCkge1xuICAgICAgICAvLyBPbiB0b3Agb2YgY2hvb3Npbmcgd2hldGhlciB0byBmbGlwLCBjaG9vc2Ugd2hldGhlciB0byByZW5kZXIgdGhpcyB2ZXJzaW9uIG9mIHRoZSBnbHlwaHMgb3IgdGhlIGFsdGVybmF0ZVxuICAgICAgICAvLyB2ZXJ0aWNhbCBnbHlwaHMuIFdlIGNhbid0IGp1c3QgZmlsdGVyIG91dCB2ZXJ0aWNhbCBnbHlwaHMgaW4gdGhlIGhvcml6b250YWwgcmFuZ2UgYmVjYXVzZSB0aGUgaG9yaXpvbnRhbFxuICAgICAgICAvLyBhbmQgdmVydGljYWwgdmVyc2lvbnMgY2FuIGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50IHByb2plY3Rpb25zIHdoaWNoIGNvdWxkIGxlYWQgdG8gYW5nbGVzIHdoZXJlIGJvdGggb3JcbiAgICAgICAgLy8gbmVpdGhlciBzaG93ZWQuXG4gICAgICAgIGNvbnN0IHJpc2UgPSBNYXRoLmFicyhsYXN0UG9pbnQueSAtIGZpcnN0UG9pbnQueSk7XG4gICAgICAgIGNvbnN0IHJ1biA9IE1hdGguYWJzKGxhc3RQb2ludC54IC0gZmlyc3RQb2ludC54KSAqIGFzcGVjdFJhdGlvO1xuICAgICAgICBpZiAocmlzZSA+IHJ1bikge1xuICAgICAgICAgICAgcmV0dXJuIHt1c2VWZXJ0aWNhbDogdHJ1ZX07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgZmxpcHBpbmcgaXMgcmVxdWlyZWQgZm9yIFwidmVydGljYWxPbmx5XCIgY2FzZS5cbiAgICBpZiAoc3ltYm9sLndyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCkge1xuICAgICAgICByZXR1cm4gKGZpcnN0UG9pbnQueSA8IGxhc3RQb2ludC55KSA/IHtuZWVkc0ZsaXBwaW5nOiB0cnVlfSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gc3ltYm9sJ3MgZmxpcFN0YXRlIHN0b3JlcyB0aGUgZmxpcCBkZWNpc2lvbiBmcm9tIHRoZSBwcmV2aW91cyBmcmFtZSwgYW5kIHRoYXRcbiAgICAvLyBkZWNpc2lvbiBpcyByZXVzZWQgd2hlbiB0aGUgc3ltYm9sIGlzIGluIHRoZSByZXRhaW4gcmFuZ2UuXG4gICAgaWYgKHN5bWJvbC5mbGlwU3RhdGUgIT09IEZsaXBTdGF0ZS51bmtub3duICYmIGlzSW5GbGlwUmV0YWluUmFuZ2UoZmlyc3RQb2ludCwgbGFzdFBvaW50LCBhc3BlY3RSYXRpbykpIHtcbiAgICAgICAgcmV0dXJuIChzeW1ib2wuZmxpcFN0YXRlID09PSBGbGlwU3RhdGUuZmxpcFJlcXVpcmVkKSA/IHtuZWVkc0ZsaXBwaW5nOiB0cnVlfSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZmxpcHBpbmcgaXMgcmVxdWlyZWQgZm9yIFwiaG9yaXpvbnRhbFwiIGNhc2UuXG4gICAgcmV0dXJuIChmaXJzdFBvaW50LnggPiBsYXN0UG9pbnQueCkgPyB7bmVlZHNGbGlwcGluZzogdHJ1ZX0gOiBudWxsO1xufVxuXG5mdW5jdGlvbiBwbGFjZUdseXBoc0Fsb25nTGluZShzeW1ib2wsIGZvbnRTaXplLCBmbGlwLCBrZWVwVXByaWdodCwgcG9zTWF0cml4LCBsYWJlbFBsYW5lTWF0cml4LCBnbENvb3JkTWF0cml4LCBnbHlwaE9mZnNldEFycmF5LCBsaW5lVmVydGV4QXJyYXksIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgZ2xvYmVFeHRWZXJ0ZXhBcnJheSwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgcHJvamVjdGlvbkNhY2hlLCBhc3BlY3RSYXRpbywgZ2V0RWxldmF0aW9uLCBwcm9qZWN0aW9uLCB0aWxlSUQsIHBpdGNoV2l0aE1hcCkge1xuICAgIGNvbnN0IGZvbnRTY2FsZSA9IGZvbnRTaXplIC8gMjQ7XG4gICAgY29uc3QgbGluZU9mZnNldFggPSBzeW1ib2wubGluZU9mZnNldFggKiBmb250U2NhbGU7XG4gICAgY29uc3QgbGluZU9mZnNldFkgPSBzeW1ib2wubGluZU9mZnNldFkgKiBmb250U2NhbGU7XG5cbiAgICBsZXQgcGxhY2VkR2x5cGhzO1xuICAgIGlmIChzeW1ib2wubnVtR2x5cGhzID4gMSkge1xuICAgICAgICBjb25zdCBnbHlwaEVuZEluZGV4ID0gc3ltYm9sLmdseXBoU3RhcnRJbmRleCArIHN5bWJvbC5udW1HbHlwaHM7XG4gICAgICAgIGNvbnN0IGxpbmVTdGFydEluZGV4ID0gc3ltYm9sLmxpbmVTdGFydEluZGV4O1xuICAgICAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBzeW1ib2wubGluZVN0YXJ0SW5kZXggKyBzeW1ib2wubGluZUxlbmd0aDtcblxuICAgICAgICAvLyBQbGFjZSB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGdseXBoIGluIHRoZSBsYWJlbCBmaXJzdCwgc28gd2UgY2FuIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gdGhlIG92ZXJhbGwgb3JpZW50YXRpb24gb2YgdGhlIGxhYmVsIGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBuZWVkcyB0byBiZSBmbGlwcGVkIGluIGtlZXBVcHJpZ2h0IG1vZGVcbiAgICAgICAgY29uc3QgZmlyc3RBbmRMYXN0R2x5cGggPSBwbGFjZUZpcnN0QW5kTGFzdEdseXBoKGZvbnRTY2FsZSwgZ2x5cGhPZmZzZXRBcnJheSwgbGluZU9mZnNldFgsIGxpbmVPZmZzZXRZLCBmbGlwLCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBzeW1ib2wsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlLCBnZXRFbGV2YXRpb24sIGZhbHNlLCBwcm9qZWN0aW9uLCB0aWxlSUQsIHBpdGNoV2l0aE1hcCk7XG4gICAgICAgIGlmICghZmlyc3RBbmRMYXN0R2x5cGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7bm90RW5vdWdoUm9vbTogdHJ1ZX07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RWZWMgPSBwcm9qZWN0VmVjdG9yKChmaXJzdEFuZExhc3RHbHlwaC5maXJzdC5wb2ludDogYW55KSwgZ2xDb29yZE1hdHJpeCkucG9pbnQ7XG4gICAgICAgIGNvbnN0IGxhc3RWZWMgPSBwcm9qZWN0VmVjdG9yKChmaXJzdEFuZExhc3RHbHlwaC5sYXN0LnBvaW50OiBhbnkpLCBnbENvb3JkTWF0cml4KS5wb2ludDtcblxuICAgICAgICBjb25zdCBmaXJzdFBvaW50ID0gbmV3IFBvaW50KGZpcnN0VmVjWzBdLCBmaXJzdFZlY1sxXSk7XG4gICAgICAgIGNvbnN0IGxhc3RQb2ludCA9IG5ldyBQb2ludChsYXN0VmVjWzBdLCBsYXN0VmVjWzFdKTtcblxuICAgICAgICBpZiAoa2VlcFVwcmlnaHQgJiYgIWZsaXApIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWVudGF0aW9uQ2hhbmdlID0gcmVxdWlyZXNPcmllbnRhdGlvbkNoYW5nZShzeW1ib2wsIGZpcnN0UG9pbnQsIGxhc3RQb2ludCwgYXNwZWN0UmF0aW8pO1xuICAgICAgICAgICAgc3ltYm9sLmZsaXBTdGF0ZSA9IG9yaWVudGF0aW9uQ2hhbmdlICYmIG9yaWVudGF0aW9uQ2hhbmdlLm5lZWRzRmxpcHBpbmcgPyBGbGlwU3RhdGUuZmxpcFJlcXVpcmVkIDogRmxpcFN0YXRlLmZsaXBOb3RSZXF1aXJlZDtcbiAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmllbnRhdGlvbkNoYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHBsYWNlZEdseXBocyA9IFtmaXJzdEFuZExhc3RHbHlwaC5maXJzdF07XG4gICAgICAgIGZvciAobGV0IGdseXBoSW5kZXggPSBzeW1ib2wuZ2x5cGhTdGFydEluZGV4ICsgMTsgZ2x5cGhJbmRleCA8IGdseXBoRW5kSW5kZXggLSAxOyBnbHlwaEluZGV4KyspIHtcbiAgICAgICAgICAgIC8vIFNpbmNlIGZpcnN0IGFuZCBsYXN0IGdseXBoIGZpdCBvbiB0aGUgbGluZSwgd2UncmUgc3VyZSB0aGF0IHRoZSByZXN0IG9mIHRoZSBnbHlwaHMgY2FuIGJlIHBsYWNlZFxuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICAgICAgcGxhY2VkR2x5cGhzLnB1c2gocGxhY2VHbHlwaEFsb25nTGluZShmb250U2NhbGUgKiBnbHlwaE9mZnNldEFycmF5LmdldG9mZnNldFgoZ2x5cGhJbmRleCksIGxpbmVPZmZzZXRYLCBsaW5lT2Zmc2V0WSwgZmxpcCwgYW5jaG9yUG9pbnQsIHRpbGVBbmNob3JQb2ludCwgc3ltYm9sLnNlZ21lbnQsXG4gICAgICAgICAgICAgICAgbGluZVN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCwgbGluZVZlcnRleEFycmF5LCBsYWJlbFBsYW5lTWF0cml4LCBwcm9qZWN0aW9uQ2FjaGUsIGdldEVsZXZhdGlvbiwgZmFsc2UsIGZhbHNlLCBwcm9qZWN0aW9uLCB0aWxlSUQsIHBpdGNoV2l0aE1hcCkpO1xuICAgICAgICB9XG4gICAgICAgIHBsYWNlZEdseXBocy5wdXNoKGZpcnN0QW5kTGFzdEdseXBoLmxhc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE9ubHkgYSBzaW5nbGUgZ2x5cGggdG8gcGxhY2VcbiAgICAgICAgLy8gU28sIGRldGVybWluZSB3aGV0aGVyIHRvIGZsaXAgYmFzZWQgb24gcHJvamVjdGVkIGFuZ2xlIG9mIHRoZSBsaW5lIHNlZ21lbnQgaXQncyBvblxuICAgICAgICBpZiAoa2VlcFVwcmlnaHQgJiYgIWZsaXApIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBwcm9qZWN0KHRpbGVBbmNob3JQb2ludCwgcG9zTWF0cml4KS5wb2ludDtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVWZXJ0ZXhJbmRleCA9IChzeW1ib2wubGluZVN0YXJ0SW5kZXggKyBzeW1ib2wuc2VnbWVudCArIDEpO1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgICAgICAgY29uc3QgdGlsZVNlZ21lbnRFbmQgPSBuZXcgUG9pbnQobGluZVZlcnRleEFycmF5LmdldHgodGlsZVZlcnRleEluZGV4KSwgbGluZVZlcnRleEFycmF5LmdldHkodGlsZVZlcnRleEluZGV4KSk7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0ZWRWZXJ0ZXggPSBwcm9qZWN0KHRpbGVTZWdtZW50RW5kLCBwb3NNYXRyaXgpO1xuICAgICAgICAgICAgLy8gV2Uga25vdyB0aGUgYW5jaG9yIHdpbGwgYmUgaW4gdGhlIHZpZXdwb3J0LCBidXQgdGhlIGVuZCBvZiB0aGUgbGluZSBzZWdtZW50IG1heSBiZVxuICAgICAgICAgICAgLy8gYmVoaW5kIHRoZSBwbGFuZSBvZiB0aGUgY2FtZXJhLCBpbiB3aGljaCBjYXNlIHdlIGNhbiB1c2UgYSBwb2ludCBhdCBhbnkgYXJiaXRyYXJ5IChjbG9zZXIpXG4gICAgICAgICAgICAvLyBwb2ludCBvbiB0aGUgc2VnbWVudC5cbiAgICAgICAgICAgIGNvbnN0IGIgPSAocHJvamVjdGVkVmVydGV4LnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA+IDApID9cbiAgICAgICAgICAgICAgICBwcm9qZWN0ZWRWZXJ0ZXgucG9pbnQgOlxuICAgICAgICAgICAgICAgIHByb2plY3RUcnVuY2F0ZWRMaW5lU2VnbWVudCh0aWxlQW5jaG9yUG9pbnQsIHRpbGVTZWdtZW50RW5kLCBhLCAxLCBwb3NNYXRyaXgsIHVuZGVmaW5lZCwgcHJvamVjdGlvbiwgdGlsZUlELmNhbm9uaWNhbCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9yaWVudGF0aW9uQ2hhbmdlID0gcmVxdWlyZXNPcmllbnRhdGlvbkNoYW5nZShzeW1ib2wsIG5ldyBQb2ludChhWzBdLCBhWzFdKSwgbmV3IFBvaW50KGJbMF0sIGJbMV0pLCBhc3BlY3RSYXRpbyk7XG4gICAgICAgICAgICBzeW1ib2wuZmxpcFN0YXRlID0gb3JpZW50YXRpb25DaGFuZ2UgJiYgb3JpZW50YXRpb25DaGFuZ2UubmVlZHNGbGlwcGluZyA/IEZsaXBTdGF0ZS5mbGlwUmVxdWlyZWQgOiBGbGlwU3RhdGUuZmxpcE5vdFJlcXVpcmVkO1xuICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWVudGF0aW9uQ2hhbmdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgY29uc3Qgc2luZ2xlR2x5cGggPSBwbGFjZUdseXBoQWxvbmdMaW5lKGZvbnRTY2FsZSAqIGdseXBoT2Zmc2V0QXJyYXkuZ2V0b2Zmc2V0WChzeW1ib2wuZ2x5cGhTdGFydEluZGV4KSwgbGluZU9mZnNldFgsIGxpbmVPZmZzZXRZLCBmbGlwLCBhbmNob3JQb2ludCwgdGlsZUFuY2hvclBvaW50LCBzeW1ib2wuc2VnbWVudCxcbiAgICAgICAgICAgIHN5bWJvbC5saW5lU3RhcnRJbmRleCwgc3ltYm9sLmxpbmVTdGFydEluZGV4ICsgc3ltYm9sLmxpbmVMZW5ndGgsIGxpbmVWZXJ0ZXhBcnJheSwgbGFiZWxQbGFuZU1hdHJpeCwgcHJvamVjdGlvbkNhY2hlLCBnZXRFbGV2YXRpb24sIGZhbHNlLCBmYWxzZSwgcHJvamVjdGlvbiwgdGlsZUlELCBwaXRjaFdpdGhNYXApO1xuICAgICAgICBpZiAoIXNpbmdsZUdseXBoKVxuICAgICAgICAgICAgcmV0dXJuIHtub3RFbm91Z2hSb29tOiB0cnVlfTtcblxuICAgICAgICBwbGFjZWRHbHlwaHMgPSBbc2luZ2xlR2x5cGhdO1xuICAgIH1cblxuICAgIGlmIChnbG9iZUV4dFZlcnRleEFycmF5KSB7XG4gICAgICAgIGZvciAoY29uc3QgZ2x5cGg6IGFueSBvZiBwbGFjZWRHbHlwaHMpIHtcbiAgICAgICAgICAgIHVwZGF0ZUdsb2JlVmVydGV4Tm9ybWFsKGdsb2JlRXh0VmVydGV4QXJyYXksIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggKyAwLCBnbHlwaC51cFswXSwgZ2x5cGgudXBbMV0sIGdseXBoLnVwWzJdKTtcbiAgICAgICAgICAgIHVwZGF0ZUdsb2JlVmVydGV4Tm9ybWFsKGdsb2JlRXh0VmVydGV4QXJyYXksIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggKyAxLCBnbHlwaC51cFswXSwgZ2x5cGgudXBbMV0sIGdseXBoLnVwWzJdKTtcbiAgICAgICAgICAgIHVwZGF0ZUdsb2JlVmVydGV4Tm9ybWFsKGdsb2JlRXh0VmVydGV4QXJyYXksIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggKyAyLCBnbHlwaC51cFswXSwgZ2x5cGgudXBbMV0sIGdseXBoLnVwWzJdKTtcbiAgICAgICAgICAgIHVwZGF0ZUdsb2JlVmVydGV4Tm9ybWFsKGdsb2JlRXh0VmVydGV4QXJyYXksIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggKyAzLCBnbHlwaC51cFswXSwgZ2x5cGgudXBbMV0sIGdseXBoLnVwWzJdKTtcbiAgICAgICAgICAgIGFkZER5bmFtaWNBdHRyaWJ1dGVzKGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheSwgZ2x5cGgucG9pbnRbMF0sIGdseXBoLnBvaW50WzFdLCBnbHlwaC5wb2ludFsyXSwgZ2x5cGguYW5nbGUpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBnbHlwaDogYW55IG9mIHBsYWNlZEdseXBocykge1xuICAgICAgICAgICAgYWRkRHluYW1pY0F0dHJpYnV0ZXMoZHluYW1pY0xheW91dFZlcnRleEFycmF5LCBnbHlwaC5wb2ludFswXSwgZ2x5cGgucG9pbnRbMV0sIGdseXBoLnBvaW50WzJdLCBnbHlwaC5hbmdsZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBlbGV2YXRlUG9pbnRBbmRQcm9qZWN0KHA6IFBvaW50LCB0aWxlSUQ6IENhbm9uaWNhbFRpbGVJRCwgcG9zTWF0cml4OiBGbG9hdDMyQXJyYXksIHByb2plY3Rpb246IFByb2plY3Rpb24sIGdldEVsZXZhdGlvbjogPygocDogUG9pbnQpID0+IEFycmF5PG51bWJlcj4pKSB7XG4gICAgY29uc3QgcG9pbnQgPSBwcm9qZWN0aW9uLnByb2plY3RUaWxlUG9pbnQocC54LCBwLnksIHRpbGVJRCk7XG4gICAgaWYgKCFnZXRFbGV2YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHByb2plY3QocG9pbnQsIHBvc01hdHJpeCwgcG9pbnQueik7XG4gICAgfVxuXG4gICAgY29uc3QgZWxldmF0aW9uID0gZ2V0RWxldmF0aW9uKHApO1xuICAgIHJldHVybiBwcm9qZWN0KG5ldyBQb2ludChwb2ludC54ICsgZWxldmF0aW9uWzBdLCBwb2ludC55ICsgZWxldmF0aW9uWzFdKSwgcG9zTWF0cml4LCBwb2ludC56ICsgZWxldmF0aW9uWzJdKTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFRydW5jYXRlZExpbmVTZWdtZW50KHByZXZpb3VzVGlsZVBvaW50OiBQb2ludCwgY3VycmVudFRpbGVQb2ludDogUG9pbnQsIHByZXZpb3VzUHJvamVjdGVkUG9pbnQ6IFZlYzMsIG1pbmltdW1MZW5ndGg6IG51bWJlciwgcHJvamVjdGlvbk1hdHJpeDogRmxvYXQzMkFycmF5LCBnZXRFbGV2YXRpb246ID8oKHA6IFBvaW50KSA9PiBBcnJheTxudW1iZXI+KSwgcHJvamVjdGlvbjogUHJvamVjdGlvbiwgdGlsZUlEOiBDYW5vbmljYWxUaWxlSUQpOiBWZWMzIHtcbiAgICAvLyBXZSBhcmUgYXNzdW1pbmcgXCJwcmV2aW91c1RpbGVQb2ludFwiIHdvbid0IHByb2plY3QgdG8gYSBwb2ludCB3aXRoaW4gb25lIHVuaXQgb2YgdGhlIGNhbWVyYSBwbGFuZVxuICAgIC8vIElmIGl0IGRpZCwgdGhhdCB3b3VsZCBtZWFuIG91ciBsYWJlbCBleHRlbmRlZCBhbGwgdGhlIHdheSBvdXQgZnJvbSB3aXRoaW4gdGhlIHZpZXdwb3J0IHRvIGEgKHZlcnkgZGlzdGFudClcbiAgICAvLyBwb2ludCBuZWFyIHRoZSBwbGFuZSBvZiB0aGUgY2FtZXJhLiBXZSB3b3VsZG4ndCBiZSBhYmxlIHRvIHJlbmRlciB0aGUgbGFiZWwgYW55d2F5IG9uY2UgaXQgY3Jvc3NlZCB0aGVcbiAgICAvLyBwbGFuZSBvZiB0aGUgY2FtZXJhLlxuICAgIGNvbnN0IHVuaXRWZXJ0ZXggPSBwcmV2aW91c1RpbGVQb2ludC5hZGQocHJldmlvdXNUaWxlUG9pbnQuc3ViKGN1cnJlbnRUaWxlUG9pbnQpLl91bml0KCkpO1xuICAgIGNvbnN0IHByb2plY3RlZFVuaXRWZXJ0ZXggPSBlbGV2YXRlUG9pbnRBbmRQcm9qZWN0KHVuaXRWZXJ0ZXgsIHRpbGVJRCwgcHJvamVjdGlvbk1hdHJpeCwgcHJvamVjdGlvbiwgZ2V0RWxldmF0aW9uKS5wb2ludDtcbiAgICBjb25zdCBwcm9qZWN0ZWRVbml0U2VnbWVudCA9IHZlYzMuc3ViKFtdLCBwcmV2aW91c1Byb2plY3RlZFBvaW50LCBwcm9qZWN0ZWRVbml0VmVydGV4KTtcblxuICAgIHJldHVybiB2ZWMzLnNjYWxlQW5kQWRkKFtdLCBwcmV2aW91c1Byb2plY3RlZFBvaW50LCBwcm9qZWN0ZWRVbml0U2VnbWVudCwgbWluaW11bUxlbmd0aCAvIHZlYzMubGVuZ3RoKHByb2plY3RlZFVuaXRTZWdtZW50KSk7XG59XG5cbmZ1bmN0aW9uIHBsYWNlR2x5cGhBbG9uZ0xpbmUoXG4gICAgb2Zmc2V0WDogbnVtYmVyLFxuICAgIGxpbmVPZmZzZXRYOiBudW1iZXIsXG4gICAgbGluZU9mZnNldFk6IG51bWJlcixcbiAgICBmbGlwOiBib29sZWFuLFxuICAgIGFuY2hvclBvaW50OiBWZWMzLFxuICAgIHRpbGVBbmNob3JQb2ludDogUG9pbnQsXG4gICAgYW5jaG9yU2VnbWVudDogbnVtYmVyLFxuICAgIGxpbmVTdGFydEluZGV4OiBudW1iZXIsXG4gICAgbGluZUVuZEluZGV4OiBudW1iZXIsXG4gICAgbGluZVZlcnRleEFycmF5OiBTeW1ib2xMaW5lVmVydGV4QXJyYXksXG4gICAgbGFiZWxQbGFuZU1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHByb2plY3Rpb25DYWNoZToge1tfOiBudW1iZXJdOiBWZWMzfSxcbiAgICBnZXRFbGV2YXRpb246ID8oKHA6IFBvaW50KSA9PiBBcnJheTxudW1iZXI+KSxcbiAgICByZXR1cm5QYXRoSW5UaWxlQ29vcmRzOiA/Ym9vbGVhbixcbiAgICBlbmRHbHlwaDogP2Jvb2xlYW4sXG4gICAgcmVwcm9qZWN0aW9uOiBQcm9qZWN0aW9uLFxuICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCxcbiAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4pOiBudWxsIHwgUGxhY2VkR2x5cGgge1xuXG4gICAgY29uc3QgY29tYmluZWRPZmZzZXRYID0gZmxpcCA/XG4gICAgICAgIG9mZnNldFggLSBsaW5lT2Zmc2V0WCA6XG4gICAgICAgIG9mZnNldFggKyBsaW5lT2Zmc2V0WDtcblxuICAgIGxldCBkaXIgPSBjb21iaW5lZE9mZnNldFggPiAwID8gMSA6IC0xO1xuXG4gICAgbGV0IGFuZ2xlID0gMDtcbiAgICBpZiAoZmxpcCkge1xuICAgICAgICAvLyBUaGUgbGFiZWwgbmVlZHMgdG8gYmUgZmxpcHBlZCB0byBrZWVwIHRleHQgdXByaWdodC5cbiAgICAgICAgLy8gSXRlcmF0ZSBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24uXG4gICAgICAgIGRpciAqPSAtMTtcbiAgICAgICAgYW5nbGUgPSBNYXRoLlBJO1xuICAgIH1cblxuICAgIGlmIChkaXIgPCAwKSBhbmdsZSArPSBNYXRoLlBJO1xuXG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IGRpciA+IDAgP1xuICAgICAgICBsaW5lU3RhcnRJbmRleCArIGFuY2hvclNlZ21lbnQgOlxuICAgICAgICBsaW5lU3RhcnRJbmRleCArIGFuY2hvclNlZ21lbnQgKyAxO1xuXG4gICAgbGV0IGN1cnJlbnQgPSBhbmNob3JQb2ludDtcbiAgICBsZXQgcHJldiA9IGFuY2hvclBvaW50O1xuICAgIGxldCBkaXN0YW5jZVRvUHJldiA9IDA7XG4gICAgbGV0IGN1cnJlbnRTZWdtZW50RGlzdGFuY2UgPSAwO1xuICAgIGNvbnN0IGFic09mZnNldFggPSBNYXRoLmFicyhjb21iaW5lZE9mZnNldFgpO1xuICAgIGNvbnN0IHBhdGhWZXJ0aWNlcyA9IFtdO1xuICAgIGNvbnN0IHRpbGVQYXRoID0gW107XG4gICAgbGV0IGN1cnJlbnRWZXJ0ZXggPSB0aWxlQW5jaG9yUG9pbnQ7XG5cbiAgICBjb25zdCBwcmV2aW91c1RpbGVQb2ludCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMaW5lVmVydGV4SW5kZXggPSBjdXJyZW50SW5kZXggLSBkaXI7XG4gICAgICAgIHJldHVybiBkaXN0YW5jZVRvUHJldiA9PT0gMCA/XG4gICAgICAgICAgICB0aWxlQW5jaG9yUG9pbnQgOlxuICAgICAgICAgICAgbmV3IFBvaW50KGxpbmVWZXJ0ZXhBcnJheS5nZXR4KHByZXZpb3VzTGluZVZlcnRleEluZGV4KSwgbGluZVZlcnRleEFycmF5LmdldHkocHJldmlvdXNMaW5lVmVydGV4SW5kZXgpKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0VHJ1bmNhdGVkTGluZVNlZ21lbnQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBwcm9qZWN0VHJ1bmNhdGVkTGluZVNlZ21lbnQocHJldmlvdXNUaWxlUG9pbnQoKSwgY3VycmVudFZlcnRleCwgcHJldiwgYWJzT2Zmc2V0WCAtIGRpc3RhbmNlVG9QcmV2ICsgMSwgbGFiZWxQbGFuZU1hdHJpeCwgZ2V0RWxldmF0aW9uLCByZXByb2plY3Rpb24sIHRpbGVJRC5jYW5vbmljYWwpO1xuICAgIH07XG5cbiAgICB3aGlsZSAoZGlzdGFuY2VUb1ByZXYgKyBjdXJyZW50U2VnbWVudERpc3RhbmNlIDw9IGFic09mZnNldFgpIHtcbiAgICAgICAgY3VycmVudEluZGV4ICs9IGRpcjtcblxuICAgICAgICAvLyBvZmZzZXQgZG9lcyBub3QgZml0IG9uIHRoZSBwcm9qZWN0ZWQgbGluZVxuICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgbGluZVN0YXJ0SW5kZXggfHwgY3VycmVudEluZGV4ID49IGxpbmVFbmRJbmRleClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHByZXYgPSBjdXJyZW50O1xuICAgICAgICBwYXRoVmVydGljZXMucHVzaChjdXJyZW50KTtcbiAgICAgICAgaWYgKHJldHVyblBhdGhJblRpbGVDb29yZHMpIHRpbGVQYXRoLnB1c2goY3VycmVudFZlcnRleCB8fCBwcmV2aW91c1RpbGVQb2ludCgpKTtcblxuICAgICAgICBjdXJyZW50ID0gcHJvamVjdGlvbkNhY2hlW2N1cnJlbnRJbmRleF07XG4gICAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRWZXJ0ZXggPSBuZXcgUG9pbnQobGluZVZlcnRleEFycmF5LmdldHgoY3VycmVudEluZGV4KSwgbGluZVZlcnRleEFycmF5LmdldHkoY3VycmVudEluZGV4KSk7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gZWxldmF0ZVBvaW50QW5kUHJvamVjdChjdXJyZW50VmVydGV4LCB0aWxlSUQuY2Fub25pY2FsLCBsYWJlbFBsYW5lTWF0cml4LCByZXByb2plY3Rpb24sIGdldEVsZXZhdGlvbik7XG4gICAgICAgICAgICBpZiAocHJvamVjdGlvbi5zaWduZWREaXN0YW5jZUZyb21DYW1lcmEgPiAwKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHByb2plY3Rpb25DYWNoZVtjdXJyZW50SW5kZXhdID0gcHJvamVjdGlvbi5wb2ludDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHZlcnRleCBpcyBiZWhpbmQgdGhlIHBsYW5lIG9mIHRoZSBjYW1lcmEsIHNvIHdlIGNhbid0IHByb2plY3QgaXRcbiAgICAgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSdsbCBjcmVhdGUgYSB2ZXJ0ZXggYWxvbmcgdGhlIGxpbmUgdGhhdCdzIGZhciBlbm91Z2ggdG8gaW5jbHVkZSB0aGUgZ2x5cGhcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBjYWNoZSBiZWNhdXNlIHRoZSBuZXcgdmVydGV4IG1pZ2h0IG5vdCBiZSBmYXIgZW5vdWdoIG91dCBmb3IgZnV0dXJlIGdseXBocyBvbiB0aGUgc2FtZSBzZWdtZW50XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGdldFRydW5jYXRlZExpbmVTZWdtZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50VmVydGV4ID0gbnVsbDsgLy8gbnVsbCBzdGFsZSBkYXRhXG4gICAgICAgIH1cblxuICAgICAgICBkaXN0YW5jZVRvUHJldiArPSBjdXJyZW50U2VnbWVudERpc3RhbmNlO1xuICAgICAgICBjdXJyZW50U2VnbWVudERpc3RhbmNlID0gdmVjMy5kaXN0YW5jZShwcmV2LCBjdXJyZW50KTtcbiAgICB9XG5cbiAgICBjdXJyZW50VmVydGV4ID0gY3VycmVudFZlcnRleCB8fCBuZXcgUG9pbnQobGluZVZlcnRleEFycmF5LmdldHgoY3VycmVudEluZGV4KSwgbGluZVZlcnRleEFycmF5LmdldHkoY3VycmVudEluZGV4KSk7XG4gICAgY29uc3QgcHJldlZlcnRleCA9IHByZXZpb3VzVGlsZVBvaW50KCk7XG5cbiAgICBpZiAoZW5kR2x5cGggJiYgZ2V0RWxldmF0aW9uKSB7XG4gICAgICAgIC8vIEZvciB0ZXJyYWluLCBhbHdheXMgdHJ1bmNhdGUgZW5kIHBvaW50cyBpbiBvcmRlciB0byBoYW5kbGUgdGVycmFpbiBjdXJ2YXR1cmUuXG4gICAgICAgIC8vIElmIHByZXZpb3VzbHkgdHJ1bmNhdGVkLCBvbiBzaWduZWREaXN0YW5jZUZyb21DYW1lcmEgPCAwLCBkb24ndCBkbyBpdC5cbiAgICAgICAgLy8gQ2FjaGUgYXMgZW5kIHBvaW50LiBUaGUgY2FjaGUgaXMgY2xlYXJlZCBpZiB0aGVyZSBpcyBuZWVkIGZvciBmbGlwcGluZyBpbiB1cGRhdGVMaW5lTGFiZWxzLlxuICAgICAgICBwcm9qZWN0aW9uQ2FjaGVbY3VycmVudEluZGV4XSA9IGN1cnJlbnQgPSAocHJvamVjdGlvbkNhY2hlW2N1cnJlbnRJbmRleF0gPT09IHVuZGVmaW5lZCkgPyBjdXJyZW50IDogZ2V0VHJ1bmNhdGVkTGluZVNlZ21lbnQoKTtcbiAgICAgICAgY3VycmVudFNlZ21lbnREaXN0YW5jZSA9IHZlYzMuZGlzdGFuY2UocHJldiwgY3VycmVudCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHBvaW50IGlzIG9uIHRoZSBjdXJyZW50IHNlZ21lbnQuIEludGVycG9sYXRlIHRvIGZpbmQgaXQuIENvbXB1dGUgcG9pbnRzIG9uIGJvdGggbGFiZWwgcGxhbmUgYW5kIHRpbGUgc3BhY2VcbiAgICBjb25zdCBzZWdtZW50SW50ZXJwb2xhdGlvblQgPSAoYWJzT2Zmc2V0WCAtIGRpc3RhbmNlVG9QcmV2KSAvIGN1cnJlbnRTZWdtZW50RGlzdGFuY2U7XG4gICAgY29uc3QgdGlsZVBvaW50ID0gY3VycmVudFZlcnRleC5zdWIocHJldlZlcnRleCkubXVsdChzZWdtZW50SW50ZXJwb2xhdGlvblQpLl9hZGQocHJldlZlcnRleCk7XG4gICAgY29uc3QgcHJldlRvQ3VycmVudCA9IHZlYzMuc3ViKFtdLCBjdXJyZW50LCBwcmV2KTtcbiAgICBjb25zdCBsYWJlbFBsYW5lUG9pbnQgPSB2ZWMzLnNjYWxlQW5kQWRkKFtdLCBwcmV2LCBwcmV2VG9DdXJyZW50LCBzZWdtZW50SW50ZXJwb2xhdGlvblQpO1xuXG4gICAgbGV0IGF4aXNaID0gWzAsIDAsIDFdO1xuICAgIGxldCBkaWZmWCA9IHByZXZUb0N1cnJlbnRbMF07XG4gICAgbGV0IGRpZmZZID0gcHJldlRvQ3VycmVudFsxXTtcblxuICAgIGlmIChwaXRjaFdpdGhNYXApIHtcbiAgICAgICAgYXhpc1ogPSByZXByb2plY3Rpb24udXBWZWN0b3IodGlsZUlELmNhbm9uaWNhbCwgdGlsZVBvaW50LngsIHRpbGVQb2ludC55KTtcblxuICAgICAgICBpZiAoYXhpc1pbMF0gIT09IDAgfHwgYXhpc1pbMV0gIT09IDAgfHwgYXhpc1pbMl0gIT09IDEpIHtcbiAgICAgICAgICAgIC8vIENvbXB1dGUgY29vcmRpbmF0ZSBmcmFtZSB0aGF0IGlzIGFsaWduZWQgdG8gdGhlIHRhbmdlbnQgb2YgdGhlIHN1cmZhY2VcbiAgICAgICAgICAgIGNvbnN0IGF4aXNYID0gWzEsIDAsIDBdO1xuICAgICAgICAgICAgY29uc3QgYXhpc1kgPSBbMCwgMSwgMF07XG5cbiAgICAgICAgICAgIGF4aXNYWzBdID0gYXhpc1pbMl07XG4gICAgICAgICAgICBheGlzWFsxXSA9IDA7XG4gICAgICAgICAgICBheGlzWFsyXSA9IC1heGlzWlswXTtcbiAgICAgICAgICAgIHZlYzMuY3Jvc3MoYXhpc1ksIGF4aXNaLCBheGlzWCk7XG4gICAgICAgICAgICB2ZWMzLm5vcm1hbGl6ZShheGlzWCwgYXhpc1gpO1xuICAgICAgICAgICAgdmVjMy5ub3JtYWxpemUoYXhpc1ksIGF4aXNZKTtcblxuICAgICAgICAgICAgZGlmZlggPSB2ZWMzLmRvdChwcmV2VG9DdXJyZW50LCBheGlzWCk7XG4gICAgICAgICAgICBkaWZmWSA9IHZlYzMuZG90KHByZXZUb0N1cnJlbnQsIGF4aXNZKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIG9mZnNldCB0aGUgcG9pbnQgZnJvbSB0aGUgbGluZSB0byB0ZXh0LW9mZnNldCBhbmQgaWNvbi1vZmZzZXRcbiAgICBpZiAobGluZU9mZnNldFkpIHtcbiAgICAgICAgLy8gRmluZCBhIGNvb3JkaW5hdGUgZnJhbWUgZm9yIHRoZSB2ZXJ0aWNhbCBvZmZzZXRcbiAgICAgICAgY29uc3Qgb2Zmc2V0RGlyID0gdmVjMy5jcm9zcyhbXSwgYXhpc1osIHByZXZUb0N1cnJlbnQpO1xuICAgICAgICB2ZWMzLm5vcm1hbGl6ZShvZmZzZXREaXIsIG9mZnNldERpcik7XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQobGFiZWxQbGFuZVBvaW50LCBsYWJlbFBsYW5lUG9pbnQsIG9mZnNldERpciwgbGluZU9mZnNldFkgKiBkaXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlZ21lbnRBbmdsZSA9IGFuZ2xlICsgTWF0aC5hdGFuMihkaWZmWSwgZGlmZlgpO1xuXG4gICAgcGF0aFZlcnRpY2VzLnB1c2gobGFiZWxQbGFuZVBvaW50KTtcbiAgICBpZiAocmV0dXJuUGF0aEluVGlsZUNvb3Jkcykge1xuICAgICAgICB0aWxlUGF0aC5wdXNoKHRpbGVQb2ludCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcG9pbnQ6IGxhYmVsUGxhbmVQb2ludCxcbiAgICAgICAgYW5nbGU6IHNlZ21lbnRBbmdsZSxcbiAgICAgICAgcGF0aDogcGF0aFZlcnRpY2VzLFxuICAgICAgICB0aWxlUGF0aCxcbiAgICAgICAgdXA6IGF4aXNaXG4gICAgfTtcbn1cblxuY29uc3QgaGlkZGVuR2x5cGhBdHRyaWJ1dGVzID0gbmV3IEZsb2F0MzJBcnJheShbLUluZmluaXR5LCAtSW5maW5pdHksIDAsIC1JbmZpbml0eSwgLUluZmluaXR5LCAwLCAtSW5maW5pdHksIC1JbmZpbml0eSwgMCwgLUluZmluaXR5LCAtSW5maW5pdHksIDAsIC1JbmZpbml0eSwgLUluZmluaXR5LCAwXSk7XG5cbi8vIEhpZGUgdGhlbSBieSBtb3ZpbmcgdGhlbSBvZmZzY3JlZW4uIFdlIHN0aWxsIG5lZWQgdG8gYWRkIHRoZW0gdG8gdGhlIGJ1ZmZlclxuLy8gYmVjYXVzZSB0aGUgZHluYW1pYyBidWZmZXIgaXMgcGFpcmVkIHdpdGggYSBzdGF0aWMgYnVmZmVyIHRoYXQgZG9lc24ndCBnZXQgdXBkYXRlZC5cbmZ1bmN0aW9uIGhpZGVHbHlwaHMobnVtOiBudW1iZXIsIGR5bmFtaWNMYXlvdXRWZXJ0ZXhBcnJheTogU3ltYm9sRHluYW1pY0xheW91dEFycmF5KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW07IGkrKykge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoO1xuICAgICAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkucmVzaXplKG9mZnNldCArIDQpO1xuICAgICAgICAvLyBTaW5jZSBhbGwgaGlkZGVuIGdseXBocyBoYXZlIHRoZSBzYW1lIGF0dHJpYnV0ZXMsIHdlIGNhbiBidWlsZCB1cCB0aGUgYXJyYXkgZmFzdGVyIHdpdGggYSBzaW5nbGUgY2FsbCB0byBGbG9hdDMyQXJyYXkuc2V0XG4gICAgICAgIC8vIGZvciBlYWNoIHNldCBvZiBmb3VyIHZlcnRpY2VzLCBpbnN0ZWFkIG9mIGNhbGxpbmcgYWRkRHluYW1pY0F0dHJpYnV0ZXMgZm9yIGVhY2ggdmVydGV4LlxuICAgICAgICBkeW5hbWljTGF5b3V0VmVydGV4QXJyYXkuZmxvYXQzMi5zZXQoaGlkZGVuR2x5cGhBdHRyaWJ1dGVzLCBvZmZzZXQgKiA0KTtcbiAgICB9XG59XG5cbi8vIEZvciBsaW5lIGxhYmVsIGxheW91dCwgd2UncmUgbm90IHVzaW5nIHogb3V0cHV0IGFuZCBvdXIgdyBpbnB1dCBpcyBhbHdheXMgMVxuLy8gVGhpcyBjdXN0b20gbWF0cml4IHRyYW5zZm9ybWF0aW9uIGlnbm9yZXMgdGhvc2UgY29tcG9uZW50cyB0byBtYWtlIHByb2plY3Rpb24gZmFzdGVyXG5mdW5jdGlvbiB4eVRyYW5zZm9ybU1hdDQob3V0OiBWZWM0LCBhOiBWZWM0LCBtOiBNYXQ0KTogVmVjNCB7XG4gICAgY29uc3QgeCA9IGFbMF0sIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gICAgb3V0WzNdID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTVdO1xuICAgIHJldHVybiBvdXQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgY2xpcExpbmUgZnJvbSAnLi9jbGlwX2xpbmUuanMnO1xuaW1wb3J0IFBhdGhJbnRlcnBvbGF0b3IgZnJvbSAnLi9wYXRoX2ludGVycG9sYXRvci5qcyc7XG5cbmltcG9ydCAqIGFzIGludGVyc2VjdGlvblRlc3RzIGZyb20gJy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzLmpzJztcbmltcG9ydCBHcmlkIGZyb20gJy4vZ3JpZF9pbmRleC5qcyc7XG5pbXBvcnQge21hdDQsIHZlYzR9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgT05FX0VNIGZyb20gJy4uL3N5bWJvbC9vbmVfZW0uanMnO1xuXG5pbXBvcnQge0ZPR19TWU1CT0xfQ0xJUFBJTkdfVEhSRVNIT0xELCBnZXRGb2dPcGFjaXR5QXRUaWxlQ29vcmR9IGZyb20gJy4uL3N0eWxlL2ZvZ19oZWxwZXJzLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0ICogYXMgcHJvamVjdGlvbiBmcm9tICcuLi9zeW1ib2wvcHJvamVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSBQcm9qZWN0aW9uIGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3Byb2plY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgU3ltYm9sQnVja2V0LCB7U2luZ2xlQ29sbGlzaW9uQm94fSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgICBHbHlwaE9mZnNldEFycmF5LFxuICAgIFN5bWJvbExpbmVWZXJ0ZXhBcnJheVxufSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtGb2dTdGF0ZX0gZnJvbSAnLi4vc3R5bGUvZm9nX2hlbHBlcnMuanMnO1xuaW1wb3J0IHR5cGUge1ZlYzMsIE1hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbnR5cGUgUGxhY2VkQ29sbGlzaW9uQm94ID0ge3xcbiAgICBib3g6IEFycmF5PG51bWJlcj4sXG4gICAgb2Zmc2NyZWVuOiBib29sZWFuLFxuICAgIG9jY2x1ZGVkOiBib29sZWFuXG58fTtcbnR5cGUgUGxhY2VkQ29sbGlzaW9uQ2lyY2xlcyA9IHt8XG4gICAgY2lyY2xlczogQXJyYXk8bnVtYmVyPixcbiAgICBvZmZzY3JlZW46IGJvb2xlYW4sXG4gICAgY29sbGlzaW9uRGV0ZWN0ZWQ6IGJvb2xlYW4sXG4gICAgb2NjbHVkZWQ6IGJvb2xlYW5cbnx9O1xudHlwZSBTY3JlZW5BbmNob3JQb2ludCA9IHt8XG4gIG9jY2x1ZGVkOiBib29sZWFuLFxuICBwZXJzcGVjdGl2ZVJhdGlvOiBudW1iZXIsXG4gIHBvaW50OiBQb2ludCxcbiAgc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhOiBudW1iZXIsXG58fTtcblxuLy8gV2hlbiBhIHN5bWJvbCBjcm9zc2VzIHRoZSBlZGdlIHRoYXQgY2F1c2VzIGl0IHRvIGJlIGluY2x1ZGVkIGluXG4vLyBjb2xsaXNpb24gZGV0ZWN0aW9uLCBpdCB3aWxsIGNhdXNlIGNoYW5nZXMgaW4gdGhlIHN5bWJvbHMgYXJvdW5kXG4vLyBpdC4gVGhpcyBjb25zdGFudCBzcGVjaWZpZXMgaG93IG1hbnkgcGl4ZWxzIHRvIHBhZCB0aGUgZWRnZSBvZlxuLy8gdGhlIHZpZXdwb3J0IGZvciBjb2xsaXNpb24gZGV0ZWN0aW9uIHNvIHRoYXQgdGhlIGJ1bGsgb2YgdGhlIGNoYW5nZXNcbi8vIG9jY3VyIG9mZnNjcmVlbi4gTWFraW5nIHRoaXMgY29uc3RhbnQgZ3JlYXRlciBpbmNyZWFzZXMgbGFiZWxcbi8vIHN0YWJpbGl0eSwgYnV0IGl0J3MgZXhwZW5zaXZlLlxuY29uc3Qgdmlld3BvcnRQYWRkaW5nID0gMTAwO1xuXG4vKipcbiAqIEEgY29sbGlzaW9uIGluZGV4IHVzZWQgdG8gcHJldmVudCBzeW1ib2xzIGZyb20gb3ZlcmxhcHBpbmcuIEl0IGtlZXAgdHJhY2tzIG9mXG4gKiB3aGVyZSBwcmV2aW91cyBzeW1ib2xzIGhhdmUgYmVlbiBwbGFjZWQgYW5kIGlzIHVzZWQgdG8gY2hlY2sgaWYgYSBuZXdcbiAqIHN5bWJvbCBvdmVybGFwcyB3aXRoIGFueSBwcmV2aW91c2x5IGFkZGVkIHN5bWJvbHMuXG4gKlxuICogVGhlcmUgYXJlIHR3byBzdGVwcyB0byBpbnNlcnRpb246IGZpcnN0IHBsYWNlQ29sbGlzaW9uQm94L0NpcmNsZXMgY2hlY2tzIGlmXG4gKiB0aGVyZSdzIHJvb20gZm9yIGEgc3ltYm9sLCB0aGVuIGluc2VydENvbGxpc2lvbkJveC9DaXJjbGVzIGFjdHVhbGx5IHB1dHMgdGhlXG4gKiBzeW1ib2wgaW4gdGhlIGluZGV4LiBUaGUgdHdvIHN0ZXAgcHJvY2VzcyBhbGxvd3MgcGFpcmVkIHN5bWJvbHMgdG8gYmUgaW5zZXJ0ZWRcbiAqIHRvZ2V0aGVyIGV2ZW4gaWYgdGhleSBvdmVybGFwLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvbGxpc2lvbkluZGV4IHtcbiAgICBncmlkOiBHcmlkO1xuICAgIGlnbm9yZWRHcmlkOiBHcmlkO1xuICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtO1xuICAgIHBpdGNoZmFjdG9yOiBudW1iZXI7XG4gICAgc2NyZWVuUmlnaHRCb3VuZGFyeTogbnVtYmVyO1xuICAgIHNjcmVlbkJvdHRvbUJvdW5kYXJ5OiBudW1iZXI7XG4gICAgZ3JpZFJpZ2h0Qm91bmRhcnk6IG51bWJlcjtcbiAgICBncmlkQm90dG9tQm91bmRhcnk6IG51bWJlcjtcbiAgICBmb2dTdGF0ZTogP0ZvZ1N0YXRlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgICAgICBmb2dTdGF0ZTogP0ZvZ1N0YXRlLFxuICAgICAgICBncmlkOiBHcmlkID0gbmV3IEdyaWQodHJhbnNmb3JtLndpZHRoICsgMiAqIHZpZXdwb3J0UGFkZGluZywgdHJhbnNmb3JtLmhlaWdodCArIDIgKiB2aWV3cG9ydFBhZGRpbmcsIDI1KSxcbiAgICAgICAgaWdub3JlZEdyaWQ6IEdyaWQgPSBuZXcgR3JpZCh0cmFuc2Zvcm0ud2lkdGggKyAyICogdmlld3BvcnRQYWRkaW5nLCB0cmFuc2Zvcm0uaGVpZ2h0ICsgMiAqIHZpZXdwb3J0UGFkZGluZywgMjUpXG4gICAgKSB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuXG4gICAgICAgIHRoaXMuZ3JpZCA9IGdyaWQ7XG4gICAgICAgIHRoaXMuaWdub3JlZEdyaWQgPSBpZ25vcmVkR3JpZDtcbiAgICAgICAgdGhpcy5waXRjaGZhY3RvciA9IE1hdGguY29zKHRyYW5zZm9ybS5fcGl0Y2gpICogdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2U7XG5cbiAgICAgICAgdGhpcy5zY3JlZW5SaWdodEJvdW5kYXJ5ID0gdHJhbnNmb3JtLndpZHRoICsgdmlld3BvcnRQYWRkaW5nO1xuICAgICAgICB0aGlzLnNjcmVlbkJvdHRvbUJvdW5kYXJ5ID0gdHJhbnNmb3JtLmhlaWdodCArIHZpZXdwb3J0UGFkZGluZztcbiAgICAgICAgdGhpcy5ncmlkUmlnaHRCb3VuZGFyeSA9IHRyYW5zZm9ybS53aWR0aCArIDIgKiB2aWV3cG9ydFBhZGRpbmc7XG4gICAgICAgIHRoaXMuZ3JpZEJvdHRvbUJvdW5kYXJ5ID0gdHJhbnNmb3JtLmhlaWdodCArIDIgKiB2aWV3cG9ydFBhZGRpbmc7XG4gICAgICAgIHRoaXMuZm9nU3RhdGUgPSBmb2dTdGF0ZTtcbiAgICB9XG5cbiAgICBwbGFjZUNvbGxpc2lvbkJveChidWNrZXQ6IFN5bWJvbEJ1Y2tldCwgc2NhbGU6IG51bWJlciwgY29sbGlzaW9uQm94OiBTaW5nbGVDb2xsaXNpb25Cb3gsIHNoaWZ0OiBQb2ludCwgYWxsb3dPdmVybGFwOiBib29sZWFuLCB0ZXh0UGl4ZWxSYXRpbzogbnVtYmVyLCBwb3NNYXRyaXg6IE1hdDQsIGNvbGxpc2lvbkdyb3VwUHJlZGljYXRlPzogYW55KTogUGxhY2VkQ29sbGlzaW9uQm94IHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLnRyYW5zZm9ybS5lbGV2YXRpb24gfHwgY29sbGlzaW9uQm94LmVsZXZhdGlvbiAhPT0gdW5kZWZpbmVkKTtcblxuICAgICAgICBsZXQgYW5jaG9yWCA9IGNvbGxpc2lvbkJveC5wcm9qZWN0ZWRBbmNob3JYO1xuICAgICAgICBsZXQgYW5jaG9yWSA9IGNvbGxpc2lvbkJveC5wcm9qZWN0ZWRBbmNob3JZO1xuICAgICAgICBsZXQgYW5jaG9yWiA9IGNvbGxpc2lvbkJveC5wcm9qZWN0ZWRBbmNob3JaO1xuXG4gICAgICAgIC8vIEFwcGx5IGVsZXZhdGlvbiB2ZWN0b3IgdG8gdGhlIGFuY2hvciBwb2ludFxuICAgICAgICBjb25zdCBlbGV2YXRpb24gPSBjb2xsaXNpb25Cb3guZWxldmF0aW9uO1xuICAgICAgICBjb25zdCB0aWxlSUQgPSBjb2xsaXNpb25Cb3gudGlsZUlEO1xuICAgICAgICBpZiAoZWxldmF0aW9uICYmIHRpbGVJRCkge1xuICAgICAgICAgICAgY29uc3QgdXAgPSBidWNrZXQuZ2V0UHJvamVjdGlvbigpLnVwVmVjdG9yKHRpbGVJRC5jYW5vbmljYWwsIGNvbGxpc2lvbkJveC50aWxlQW5jaG9yWCwgY29sbGlzaW9uQm94LnRpbGVBbmNob3JZKTtcbiAgICAgICAgICAgIGNvbnN0IHVwU2NhbGUgPSBidWNrZXQuZ2V0UHJvamVjdGlvbigpLnVwVmVjdG9yU2NhbGUodGlsZUlELmNhbm9uaWNhbCwgdGhpcy50cmFuc2Zvcm0uY2VudGVyLmxhdCwgdGhpcy50cmFuc2Zvcm0ud29ybGRTaXplKS5tZXRlcnNUb1RpbGU7XG5cbiAgICAgICAgICAgIGFuY2hvclggKz0gdXBbMF0gKiBlbGV2YXRpb24gKiB1cFNjYWxlO1xuICAgICAgICAgICAgYW5jaG9yWSArPSB1cFsxXSAqIGVsZXZhdGlvbiAqIHVwU2NhbGU7XG4gICAgICAgICAgICBhbmNob3JaICs9IHVwWzJdICogZWxldmF0aW9uICogdXBTY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoZWNrT2NjbHVzaW9uID0gYnVja2V0LnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJyB8fCAhIWVsZXZhdGlvbiB8fCB0aGlzLnRyYW5zZm9ybS5waXRjaCA+IDA7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZFBvaW50ID0gdGhpcy5wcm9qZWN0QW5kR2V0UGVyc3BlY3RpdmVSYXRpbyhwb3NNYXRyaXgsIFthbmNob3JYLCBhbmNob3JZLCBhbmNob3JaXSwgY29sbGlzaW9uQm94LnRpbGVJRCwgY2hlY2tPY2NsdXNpb24sIGJ1Y2tldC5nZXRQcm9qZWN0aW9uKCkpO1xuXG4gICAgICAgIGNvbnN0IHRpbGVUb1ZpZXdwb3J0ID0gdGV4dFBpeGVsUmF0aW8gKiBwcm9qZWN0ZWRQb2ludC5wZXJzcGVjdGl2ZVJhdGlvO1xuICAgICAgICBjb25zdCB0bFggPSAoY29sbGlzaW9uQm94LngxICogc2NhbGUgKyBzaGlmdC54IC0gY29sbGlzaW9uQm94LnBhZGRpbmcpICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC54O1xuICAgICAgICBjb25zdCB0bFkgPSAoY29sbGlzaW9uQm94LnkxICogc2NhbGUgKyBzaGlmdC55IC0gY29sbGlzaW9uQm94LnBhZGRpbmcpICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC55O1xuICAgICAgICBjb25zdCBiclggPSAoY29sbGlzaW9uQm94LngyICogc2NhbGUgKyBzaGlmdC54ICsgY29sbGlzaW9uQm94LnBhZGRpbmcpICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC54O1xuICAgICAgICBjb25zdCBiclkgPSAoY29sbGlzaW9uQm94LnkyICogc2NhbGUgKyBzaGlmdC55ICsgY29sbGlzaW9uQm94LnBhZGRpbmcpICogdGlsZVRvVmlld3BvcnQgKyBwcm9qZWN0ZWRQb2ludC5wb2ludC55O1xuICAgICAgICAvLyBDbGlwIGF0IDEwIHRpbWVzIHRoZSBkaXN0YW5jZSBvZiB0aGUgbWFwIGNlbnRlciBvciwgc2FpZCBvdGhlcndpc2UsIHdoZW4gdGhlIGxhYmVsXG4gICAgICAgIC8vIHdvdWxkIGJlIGRyYXduIGF0IDEwJSB0aGUgc2l6ZSBvZiB0aGUgZmVhdHVyZXMgYXJvdW5kIGl0IHdpdGhvdXQgc2NhbGluZy4gUmVmZXI6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLW5hdGl2ZS93aWtpL1RleHQtUmVuZGVyaW5nI3BlcnNwZWN0aXZlLXNjYWxpbmdcbiAgICAgICAgLy8gMC41NSA9PT0gcHJvamVjdGlvbi5nZXRQZXJzcGVjdGl2ZVJhdGlvKGNhbWVyYV90b19jZW50ZXIsIGNhbWVyYV90b19jZW50ZXIgKiAxMClcbiAgICAgICAgY29uc3QgbWluUGVyc3BlY3RpdmVSYXRpbyA9IDAuNTU7XG4gICAgICAgIGNvbnN0IGlzQ2xpcHBlZCA9IHByb2plY3RlZFBvaW50LnBlcnNwZWN0aXZlUmF0aW8gPD0gbWluUGVyc3BlY3RpdmVSYXRpbyB8fCBwcm9qZWN0ZWRQb2ludC5vY2NsdWRlZDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNJbnNpZGVHcmlkKHRsWCwgdGxZLCBiclgsIGJyWSkgfHxcbiAgICAgICAgICAgICghYWxsb3dPdmVybGFwICYmIHRoaXMuZ3JpZC5oaXRUZXN0KHRsWCwgdGxZLCBiclgsIGJyWSwgY29sbGlzaW9uR3JvdXBQcmVkaWNhdGUpKSB8fFxuICAgICAgICAgICAgaXNDbGlwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJveDogW10sXG4gICAgICAgICAgICAgICAgb2Zmc2NyZWVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBvY2NsdWRlZDogcHJvamVjdGVkUG9pbnQub2NjbHVkZWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYm94OiBbdGxYLCB0bFksIGJyWCwgYnJZXSxcbiAgICAgICAgICAgIG9mZnNjcmVlbjogdGhpcy5pc09mZnNjcmVlbih0bFgsIHRsWSwgYnJYLCBiclkpLFxuICAgICAgICAgICAgb2NjbHVkZWQ6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcGxhY2VDb2xsaXNpb25DaXJjbGVzKGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd092ZXJsYXA6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbDogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmVydGV4QXJyYXk6IFN5bWJvbExpbmVWZXJ0ZXhBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhPZmZzZXRBcnJheTogR2x5cGhPZmZzZXRBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxUb1NjcmVlbk1hdHJpeD86IE1hdDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDb2xsaXNpb25DaXJjbGVzOiBib29sZWFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkdyb3VwUHJlZGljYXRlPzogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVQaXhlbERpYW1ldGVyOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRQaXhlbFBhZGRpbmc6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogUGxhY2VkQ29sbGlzaW9uQ2lyY2xlcyB7XG4gICAgICAgIGNvbnN0IHBsYWNlZENvbGxpc2lvbkNpcmNsZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZWxldmF0aW9uID0gdGhpcy50cmFuc2Zvcm0uZWxldmF0aW9uO1xuICAgICAgICBjb25zdCBnZXRFbGV2YXRpb24gPSBlbGV2YXRpb24gPyBlbGV2YXRpb24uZ2V0QXRUaWxlT2Zmc2V0RnVuYyh0aWxlSUQsIHRoaXMudHJhbnNmb3JtLmNlbnRlci5sYXQsIHRoaXMudHJhbnNmb3JtLndvcmxkU2l6ZSwgYnVja2V0LmdldFByb2plY3Rpb24oKSkgOiAoXyA9PiBbMCwgMCwgMF0pO1xuICAgICAgICBjb25zdCB0aWxlVW5pdEFuY2hvclBvaW50ID0gbmV3IFBvaW50KHN5bWJvbC50aWxlQW5jaG9yWCwgc3ltYm9sLnRpbGVBbmNob3JZKTtcbiAgICAgICAgY29uc3QgcHJvamVjdGVkQW5jaG9yID0gYnVja2V0LmdldFByb2plY3Rpb24oKS5wcm9qZWN0VGlsZVBvaW50KHN5bWJvbC50aWxlQW5jaG9yWCwgc3ltYm9sLnRpbGVBbmNob3JZLCB0aWxlSUQuY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgYW5jaG9yRWxldmF0aW9uID0gZ2V0RWxldmF0aW9uKHRpbGVVbml0QW5jaG9yUG9pbnQpO1xuICAgICAgICBjb25zdCBlbGV2YXRlZEFuY2hvciA9IFtwcm9qZWN0ZWRBbmNob3IueCArIGFuY2hvckVsZXZhdGlvblswXSwgcHJvamVjdGVkQW5jaG9yLnkgKyBhbmNob3JFbGV2YXRpb25bMV0sIHByb2plY3RlZEFuY2hvci56ICsgYW5jaG9yRWxldmF0aW9uWzJdXTtcbiAgICAgICAgY29uc3QgaXNHbG9iZSA9IGJ1Y2tldC5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZSc7XG4gICAgICAgIGNvbnN0IGNoZWNrT2NjbHVzaW9uID0gaXNHbG9iZSB8fCAhIWVsZXZhdGlvbiB8fCB0aGlzLnRyYW5zZm9ybS5waXRjaCA+IDA7XG4gICAgICAgIGNvbnN0IHNjcmVlbkFuY2hvclBvaW50ID0gdGhpcy5wcm9qZWN0QW5kR2V0UGVyc3BlY3RpdmVSYXRpbyhwb3NNYXRyaXgsIFtlbGV2YXRlZEFuY2hvclswXSwgZWxldmF0ZWRBbmNob3JbMV0sIGVsZXZhdGVkQW5jaG9yWzJdXSwgdGlsZUlELCBjaGVja09jY2x1c2lvbiwgYnVja2V0LmdldFByb2plY3Rpb24oKSk7XG4gICAgICAgIGNvbnN0IHtwZXJzcGVjdGl2ZVJhdGlvfSA9IHNjcmVlbkFuY2hvclBvaW50O1xuICAgICAgICBjb25zdCBsYWJlbFBsYW5lRm9udFNpemUgPSBwaXRjaFdpdGhNYXAgPyBmb250U2l6ZSAvIHBlcnNwZWN0aXZlUmF0aW8gOiBmb250U2l6ZSAqIHBlcnNwZWN0aXZlUmF0aW87XG4gICAgICAgIGNvbnN0IGxhYmVsUGxhbmVGb250U2NhbGUgPSBsYWJlbFBsYW5lRm9udFNpemUgLyBPTkVfRU07XG4gICAgICAgIGNvbnN0IGxhYmVsUGxhbmVBbmNob3JQb2ludCA9IHByb2plY3Rpb24ucHJvamVjdChuZXcgUG9pbnQoZWxldmF0ZWRBbmNob3JbMF0sIGVsZXZhdGVkQW5jaG9yWzFdKSwgbGFiZWxQbGFuZU1hdHJpeCwgZWxldmF0ZWRBbmNob3JbMl0pLnBvaW50O1xuXG4gICAgICAgIGNvbnN0IHByb2plY3Rpb25DYWNoZSA9IHt9O1xuICAgICAgICBjb25zdCBsaW5lT2Zmc2V0WCA9IHN5bWJvbC5saW5lT2Zmc2V0WCAqIGxhYmVsUGxhbmVGb250U2NhbGU7XG4gICAgICAgIGNvbnN0IGxpbmVPZmZzZXRZID0gc3ltYm9sLmxpbmVPZmZzZXRZICogbGFiZWxQbGFuZUZvbnRTY2FsZTtcblxuICAgICAgICBjb25zdCBmaXJzdEFuZExhc3RHbHlwaCA9IHNjcmVlbkFuY2hvclBvaW50LnNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYSA+IDAgPyBwcm9qZWN0aW9uLnBsYWNlRmlyc3RBbmRMYXN0R2x5cGgoXG4gICAgICAgICAgICBsYWJlbFBsYW5lRm9udFNjYWxlLFxuICAgICAgICAgICAgZ2x5cGhPZmZzZXRBcnJheSxcbiAgICAgICAgICAgIGxpbmVPZmZzZXRYLFxuICAgICAgICAgICAgbGluZU9mZnNldFksXG4gICAgICAgICAgICAvKmZsaXAqLyBmYWxzZSxcbiAgICAgICAgICAgIGxhYmVsUGxhbmVBbmNob3JQb2ludCxcbiAgICAgICAgICAgIHRpbGVVbml0QW5jaG9yUG9pbnQsXG4gICAgICAgICAgICBzeW1ib2wsXG4gICAgICAgICAgICBsaW5lVmVydGV4QXJyYXksXG4gICAgICAgICAgICBsYWJlbFBsYW5lTWF0cml4LFxuICAgICAgICAgICAgcHJvamVjdGlvbkNhY2hlLFxuICAgICAgICAgICAgZWxldmF0aW9uICYmICFwaXRjaFdpdGhNYXAgPyBnZXRFbGV2YXRpb24gOiBudWxsLCAvLyBwaXRjaFdpdGhNYXA6IG5vIG5lZWQgdG8gc2FtcGxlIGVsZXZhdGlvbiBhcyBpdCBoYXMgbm8gZWZmZWN0IHdoZW4gcHJvamVjdGluZyB1c2luZyBzY2FsZS9yb3RhdGUgdG8gdGlsZSBzcGFjZSBsYWJlbFBsYW5lTWF0cml4LlxuICAgICAgICAgICAgcGl0Y2hXaXRoTWFwICYmICEhZWxldmF0aW9uLFxuICAgICAgICAgICAgYnVja2V0LmdldFByb2plY3Rpb24oKSxcbiAgICAgICAgICAgIHRpbGVJRCxcbiAgICAgICAgICAgIHBpdGNoV2l0aE1hcFxuICAgICAgICApIDogbnVsbDtcblxuICAgICAgICBsZXQgY29sbGlzaW9uRGV0ZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGluR3JpZCA9IGZhbHNlO1xuICAgICAgICBsZXQgZW50aXJlbHlPZmZzY3JlZW4gPSB0cnVlO1xuXG4gICAgICAgIGlmIChmaXJzdEFuZExhc3RHbHlwaCAmJiAhc2NyZWVuQW5jaG9yUG9pbnQub2NjbHVkZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IGNpcmNsZVBpeGVsRGlhbWV0ZXIgKiAwLjUgKiBwZXJzcGVjdGl2ZVJhdGlvICsgdGV4dFBpeGVsUGFkZGluZztcbiAgICAgICAgICAgIGNvbnN0IHNjcmVlblBsYW5lTWluID0gbmV3IFBvaW50KC12aWV3cG9ydFBhZGRpbmcsIC12aWV3cG9ydFBhZGRpbmcpO1xuICAgICAgICAgICAgY29uc3Qgc2NyZWVuUGxhbmVNYXggPSBuZXcgUG9pbnQodGhpcy5zY3JlZW5SaWdodEJvdW5kYXJ5LCB0aGlzLnNjcmVlbkJvdHRvbUJvdW5kYXJ5KTtcbiAgICAgICAgICAgIGNvbnN0IGludGVycG9sYXRvciA9IG5ldyBQYXRoSW50ZXJwb2xhdG9yKCk7XG5cbiAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhIHByb2plY3RlZCBwYXRoIGZyb20gcHJvamVjdGVkIGxpbmUgdmVydGljZXMuIEFuY2hvciBwb2ludHMgYXJlIGlnbm9yZWQgYW5kIHJlbW92ZWRcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gZmlyc3RBbmRMYXN0R2x5cGguZmlyc3Q7XG4gICAgICAgICAgICBjb25zdCBsYXN0ID0gZmlyc3RBbmRMYXN0R2x5cGgubGFzdDtcblxuICAgICAgICAgICAgbGV0IHByb2plY3RlZFBhdGg6IFZlYzNbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGZpcnN0LnBhdGgubGVuZ3RoIC0gMTsgaSA+PSAxOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0ZWRQYXRoLnB1c2goZmlyc3QucGF0aFtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxhc3QucGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHByb2plY3RlZFBhdGgucHVzaChsYXN0LnBhdGhbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXNzZXJ0KHByb2plY3RlZFBhdGgubGVuZ3RoID49IDIpO1xuXG4gICAgICAgICAgICAvLyBUb2xlcmF0ZSBhIHNsaWdodGx5IGxvbmdlciBkaXN0YW5jZSB0aGFuIG9uZSBkaWFtZXRlciBiZXR3ZWVuIHR3byBhZGphY2VudCBjaXJjbGVzXG4gICAgICAgICAgICBjb25zdCBjaXJjbGVEaXN0ID0gcmFkaXVzICogMi41O1xuXG4gICAgICAgICAgICAvLyBUaGUgcGF0aCBtaWdodCBuZWVkIHRvIGJlIGNvbnZlcnRlZCBpbnRvIHNjcmVlbiBzcGFjZSBpZiBhIHBpdGNoZWQgbWFwIGlzIHVzZWQgYXMgdGhlIGxhYmVsIHNwYWNlXG4gICAgICAgICAgICBpZiAobGFiZWxUb1NjcmVlbk1hdHJpeCkge1xuICAgICAgICAgICAgICAgIGFzc2VydChwaXRjaFdpdGhNYXApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmVlblNwYWNlUGF0aCA9IChlbGV2YXRpb24gJiYgIWlzR2xvYmUpID9cbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGVkUGF0aC5tYXAoKHAsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGV2YXRpb24gPSBnZXRFbGV2YXRpb24oaW5kZXggPCBmaXJzdC5wYXRoLmxlbmd0aCAtIDEgPyBmaXJzdC50aWxlUGF0aFtmaXJzdC5wYXRoLmxlbmd0aCAtIDEgLSBpbmRleF0gOiBsYXN0LnRpbGVQYXRoW2luZGV4IC0gZmlyc3QucGF0aC5sZW5ndGggKyAyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwWzJdID0gZWxldmF0aW9uWzJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2plY3Rpb24ucHJvamVjdFZlY3RvcigocDogYW55KSwgbGFiZWxUb1NjcmVlbk1hdHJpeCk7XG4gICAgICAgICAgICAgICAgICAgIH0pIDpcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGVkUGF0aC5tYXAocCA9PiBwcm9qZWN0aW9uLnByb2plY3RWZWN0b3IoKHA6IGFueSksIGxhYmVsVG9TY3JlZW5NYXRyaXgpKTtcblxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCB0cnkgdG8gcGxhY2UgY29sbGlzaW9uIGNpcmNsZXMgaWYgZXZlbiBvZiB0aGUgcG9pbnRzIGlzIGJlaGluZCB0aGUgY2FtZXJhLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBwbGF1c2libGUgc2NlbmFyaW8gd2l0aCBiaWcgY2FtZXJhIHBpdGNoIGFuZ2xlc1xuICAgICAgICAgICAgICAgIGlmIChzY3JlZW5TcGFjZVBhdGguc29tZShwb2ludCA9PiBwb2ludC5zaWduZWREaXN0YW5jZUZyb21DYW1lcmEgPD0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdGVkUGF0aCA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2plY3RlZFBhdGggPSBzY3JlZW5TcGFjZVBhdGgubWFwKHAgPT4gcC5wb2ludCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc2VnbWVudHMgPSBbXTtcblxuICAgICAgICAgICAgaWYgKHByb2plY3RlZFBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmVlblNwYWNlUGF0aCA9IHByb2plY3RlZFBhdGgubWFwKHAgPT4gbmV3IFBvaW50KHBbMF0sIHBbMV0pKTtcblxuICAgICAgICAgICAgICAgIC8vIFF1aWNrbHkgY2hlY2sgaWYgdGhlIHBhdGggaXMgZnVsbHkgaW5zaWRlIG9yIG91dHNpZGUgb2YgdGhlIHBhZGRlZCBjb2xsaXNpb24gcmVnaW9uLlxuICAgICAgICAgICAgICAgIC8vIEZvciBvdmVybGFwcGluZyBwYXRocyB3ZSdsbCBvbmx5IGNyZWF0ZSBjb2xsaXNpb24gY2lyY2xlcyBmb3IgdGhlIHZpc2libGUgc2VnbWVudHNcbiAgICAgICAgICAgICAgICBsZXQgbWlueCA9IEluZmluaXR5O1xuICAgICAgICAgICAgICAgIGxldCBtYXh4ID0gLUluZmluaXR5O1xuICAgICAgICAgICAgICAgIGxldCBtaW55ID0gSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgbGV0IG1heHkgPSAtSW5maW5pdHk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjcmVlblNwYWNlUGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBtaW54ID0gTWF0aC5taW4obWlueCwgc2NyZWVuU3BhY2VQYXRoW2ldLngpO1xuICAgICAgICAgICAgICAgICAgICBtaW55ID0gTWF0aC5taW4obWlueSwgc2NyZWVuU3BhY2VQYXRoW2ldLnkpO1xuICAgICAgICAgICAgICAgICAgICBtYXh4ID0gTWF0aC5tYXgobWF4eCwgc2NyZWVuU3BhY2VQYXRoW2ldLngpO1xuICAgICAgICAgICAgICAgICAgICBtYXh5ID0gTWF0aC5tYXgobWF4eSwgc2NyZWVuU3BhY2VQYXRoW2ldLnkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtaW54ID49IHNjcmVlblBsYW5lTWluLnggJiYgbWF4eCA8PSBzY3JlZW5QbGFuZU1heC54ICYmXG4gICAgICAgICAgICAgICAgICAgIG1pbnkgPj0gc2NyZWVuUGxhbmVNaW4ueSAmJiBtYXh5IDw9IHNjcmVlblBsYW5lTWF4LnkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUXVhZCBmdWxseSB2aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzID0gW3NjcmVlblNwYWNlUGF0aF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXh4IDwgc2NyZWVuUGxhbmVNaW4ueCB8fCBtaW54ID4gc2NyZWVuUGxhbmVNYXgueCB8fFxuICAgICAgICAgICAgICAgICAgICBtYXh5IDwgc2NyZWVuUGxhbmVNaW4ueSB8fCBtaW55ID4gc2NyZWVuUGxhbmVNYXgueSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3QgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICBzZWdtZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzID0gY2xpcExpbmUoW3NjcmVlblNwYWNlUGF0aF0sIHNjcmVlblBsYW5lTWluLngsIHNjcmVlblBsYW5lTWluLnksIHNjcmVlblBsYW5lTWF4LngsIHNjcmVlblBsYW5lTWF4LnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudHMpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnRlcnBvbGF0ZSBwb3NpdGlvbnMgZm9yIGNvbGxpc2lvbiBjaXJjbGVzLiBBZGQgYSBzbWFsbCBwYWRkaW5nIHRvIGJvdGggZW5kcyBvZiB0aGUgc2VnbWVudFxuICAgICAgICAgICAgICAgIGFzc2VydChzZWcubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICAgICAgaW50ZXJwb2xhdG9yLnJlc2V0KHNlZywgcmFkaXVzICogMC4yNSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgbnVtQ2lyY2xlcyA9IDA7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJwb2xhdG9yLmxlbmd0aCA8PSAwLjUgKiByYWRpdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbnVtQ2lyY2xlcyA9IDE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbnVtQ2lyY2xlcyA9IE1hdGguY2VpbChpbnRlcnBvbGF0b3IucGFkZGVkTGVuZ3RoIC8gY2lyY2xlRGlzdCkgKyAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQ2lyY2xlczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBpIC8gTWF0aC5tYXgobnVtQ2lyY2xlcyAtIDEsIDEpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaXJjbGVQb3NpdGlvbiA9IGludGVycG9sYXRvci5sZXJwKHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZCB2aWV3cG9ydCBwYWRkaW5nIHRvIHRoZSBwb3NpdGlvbiBhbmQgcGVyZm9ybSBpbml0aWFsIGNvbGxpc2lvbiBjaGVja1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZW50ZXJYID0gY2lyY2xlUG9zaXRpb24ueCArIHZpZXdwb3J0UGFkZGluZztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VudGVyWSA9IGNpcmNsZVBvc2l0aW9uLnkgKyB2aWV3cG9ydFBhZGRpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgcGxhY2VkQ29sbGlzaW9uQ2lyY2xlcy5wdXNoKGNlbnRlclgsIGNlbnRlclksIHJhZGl1cywgMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeDEgPSBjZW50ZXJYIC0gcmFkaXVzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB5MSA9IGNlbnRlclkgLSByYWRpdXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHgyID0gY2VudGVyWCArIHJhZGl1cztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeTIgPSBjZW50ZXJZICsgcmFkaXVzO1xuXG4gICAgICAgICAgICAgICAgICAgIGVudGlyZWx5T2Zmc2NyZWVuID0gZW50aXJlbHlPZmZzY3JlZW4gJiYgdGhpcy5pc09mZnNjcmVlbih4MSwgeTEsIHgyLCB5Mik7XG4gICAgICAgICAgICAgICAgICAgIGluR3JpZCA9IGluR3JpZCB8fCB0aGlzLmlzSW5zaWRlR3JpZCh4MSwgeTEsIHgyLCB5Mik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvd092ZXJsYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyaWQuaGl0VGVzdENpcmNsZShjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMsIGNvbGxpc2lvbkdyb3VwUHJlZGljYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGVhcmx5IGV4aXQgaWYgd2UncmUgc2hvd2luZyB0aGUgZGVidWcgY2lyY2xlcyBiZWNhdXNlIHdlIHN0aWxsIHdhbnQgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggY2lyY2xlcyBhcmUgaW4gdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGlzaW9uRGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd0NvbGxpc2lvbkNpcmNsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkRldGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjbHVkZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNpcmNsZXM6ICgoIXNob3dDb2xsaXNpb25DaXJjbGVzICYmIGNvbGxpc2lvbkRldGVjdGVkKSB8fCAhaW5HcmlkKSA/IFtdIDogcGxhY2VkQ29sbGlzaW9uQ2lyY2xlcyxcbiAgICAgICAgICAgIG9mZnNjcmVlbjogZW50aXJlbHlPZmZzY3JlZW4sXG4gICAgICAgICAgICBjb2xsaXNpb25EZXRlY3RlZCxcbiAgICAgICAgICAgIG9jY2x1ZGVkOiBzY3JlZW5BbmNob3JQb2ludC5vY2NsdWRlZFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJlY2F1c2UgdGhlIGdlb21ldHJpZXMgaW4gdGhlIENvbGxpc2lvbkluZGV4IGFyZSBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBzaGFwZSBvZlxuICAgICAqIHN5bWJvbHMgb24gdGhlIG1hcCwgd2UgdXNlIHRoZSBDb2xsaXNpb25JbmRleCB0byBsb29rIHVwIHRoZSBzeW1ib2wgcGFydCBvZlxuICAgICAqIGBxdWVyeVJlbmRlcmVkRmVhdHVyZXNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBxdWVyeVJlbmRlcmVkU3ltYm9scyh2aWV3cG9ydFF1ZXJ5R2VvbWV0cnk6IEFycmF5PFBvaW50Pik6IHtbaWQ6IG51bWJlcl06IEFycmF5PG51bWJlcj59IHtcbiAgICAgICAgaWYgKHZpZXdwb3J0UXVlcnlHZW9tZXRyeS5sZW5ndGggPT09IDAgfHwgKHRoaXMuZ3JpZC5rZXlzTGVuZ3RoKCkgPT09IDAgJiYgdGhpcy5pZ25vcmVkR3JpZC5rZXlzTGVuZ3RoKCkgPT09IDApKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeSA9IFtdO1xuICAgICAgICBsZXQgbWluWCA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgICAgICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygdmlld3BvcnRRdWVyeUdlb21ldHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBncmlkUG9pbnQgPSBuZXcgUG9pbnQocG9pbnQueCArIHZpZXdwb3J0UGFkZGluZywgcG9pbnQueSArIHZpZXdwb3J0UGFkZGluZyk7XG4gICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgZ3JpZFBvaW50LngpO1xuICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIGdyaWRQb2ludC55KTtcbiAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBncmlkUG9pbnQueCk7XG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgZ3JpZFBvaW50LnkpO1xuICAgICAgICAgICAgcXVlcnkucHVzaChncmlkUG9pbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmdyaWQucXVlcnkobWluWCwgbWluWSwgbWF4WCwgbWF4WSlcbiAgICAgICAgICAgIC5jb25jYXQodGhpcy5pZ25vcmVkR3JpZC5xdWVyeShtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZKSk7XG5cbiAgICAgICAgY29uc3Qgc2VlbkZlYXR1cmVzID0ge307XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZUtleSA9IGZlYXR1cmUua2V5O1xuICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IHNlZW4gZmVhdHVyZXMuXG4gICAgICAgICAgICBpZiAoc2VlbkZlYXR1cmVzW2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNlZW5GZWF0dXJlc1tmZWF0dXJlS2V5LmJ1Y2tldEluc3RhbmNlSWRdID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2VlbkZlYXR1cmVzW2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF1bZmVhdHVyZUtleS5mZWF0dXJlSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHF1ZXJ5IGludGVyc2VjdHMgd2l0aCB0aGUgZmVhdHVyZSBib3hcbiAgICAgICAgICAgIC8vIFwiQ29sbGlzaW9uIENpcmNsZXNcIiBmb3IgbGluZSBsYWJlbHMgYXJlIHRyZWF0ZWQgYXMgYm94ZXMgaGVyZVxuICAgICAgICAgICAgLy8gU2luY2UgdGhlcmUncyBubyBhY3R1YWwgY29sbGlzaW9uIHRha2luZyBwbGFjZSwgdGhlIGNpcmNsZSB2cy4gc3F1YXJlXG4gICAgICAgICAgICAvLyBkaXN0aW5jdGlvbiBkb2Vzbid0IG1hdHRlciBhcyBtdWNoLCBhbmQgYm94IGdlb21ldHJ5IGlzIGVhc2llclxuICAgICAgICAgICAgLy8gdG8gd29yayB3aXRoLlxuICAgICAgICAgICAgY29uc3QgYmJveCA9IFtcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoZmVhdHVyZS54MSwgZmVhdHVyZS55MSksXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KGZlYXR1cmUueDIsIGZlYXR1cmUueTEpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChmZWF0dXJlLngyLCBmZWF0dXJlLnkyKSxcbiAgICAgICAgICAgICAgICBuZXcgUG9pbnQoZmVhdHVyZS54MSwgZmVhdHVyZS55MilcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoIWludGVyc2VjdGlvblRlc3RzLnBvbHlnb25JbnRlcnNlY3RzUG9seWdvbihxdWVyeSwgYmJveCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VlbkZlYXR1cmVzW2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF1bZmVhdHVyZUtleS5mZWF0dXJlSW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChyZXN1bHRbZmVhdHVyZUtleS5idWNrZXRJbnN0YW5jZUlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2ZlYXR1cmVLZXkuYnVja2V0SW5zdGFuY2VJZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdFtmZWF0dXJlS2V5LmJ1Y2tldEluc3RhbmNlSWRdLnB1c2goZmVhdHVyZUtleS5mZWF0dXJlSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBpbnNlcnRDb2xsaXNpb25Cb3goY29sbGlzaW9uQm94OiBBcnJheTxudW1iZXI+LCBpZ25vcmVQbGFjZW1lbnQ6IGJvb2xlYW4sIGJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlciwgZmVhdHVyZUluZGV4OiBudW1iZXIsIGNvbGxpc2lvbkdyb3VwSUQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBncmlkID0gaWdub3JlUGxhY2VtZW50ID8gdGhpcy5pZ25vcmVkR3JpZCA6IHRoaXMuZ3JpZDtcblxuICAgICAgICBjb25zdCBrZXkgPSB7YnVja2V0SW5zdGFuY2VJZCwgZmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cElEfTtcbiAgICAgICAgZ3JpZC5pbnNlcnQoa2V5LCBjb2xsaXNpb25Cb3hbMF0sIGNvbGxpc2lvbkJveFsxXSwgY29sbGlzaW9uQm94WzJdLCBjb2xsaXNpb25Cb3hbM10pO1xuICAgIH1cblxuICAgIGluc2VydENvbGxpc2lvbkNpcmNsZXMoY29sbGlzaW9uQ2lyY2xlczogQXJyYXk8bnVtYmVyPiwgaWdub3JlUGxhY2VtZW50OiBib29sZWFuLCBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXIsIGZlYXR1cmVJbmRleDogbnVtYmVyLCBjb2xsaXNpb25Hcm91cElEOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZ3JpZCA9IGlnbm9yZVBsYWNlbWVudCA/IHRoaXMuaWdub3JlZEdyaWQgOiB0aGlzLmdyaWQ7XG5cbiAgICAgICAgY29uc3Qga2V5ID0ge2J1Y2tldEluc3RhbmNlSWQsIGZlYXR1cmVJbmRleCwgY29sbGlzaW9uR3JvdXBJRH07XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY29sbGlzaW9uQ2lyY2xlcy5sZW5ndGg7IGsgKz0gNCkge1xuICAgICAgICAgICAgZ3JpZC5pbnNlcnRDaXJjbGUoa2V5LCBjb2xsaXNpb25DaXJjbGVzW2tdLCBjb2xsaXNpb25DaXJjbGVzW2sgKyAxXSwgY29sbGlzaW9uQ2lyY2xlc1trICsgMl0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvamVjdEFuZEdldFBlcnNwZWN0aXZlUmF0aW8ocG9zTWF0cml4OiBNYXQ0LCBwb2ludDogVmVjMywgdGlsZUlEOiA/T3ZlcnNjYWxlZFRpbGVJRCwgY2hlY2tPY2NsdXNpb246IGJvb2xlYW4sIGJ1Y2tldFByb2plY3Rpb246IFByb2plY3Rpb24pOiBTY3JlZW5BbmNob3JQb2ludCB7XG4gICAgICAgIGNvbnN0IHAgPSBbcG9pbnRbMF0sIHBvaW50WzFdLCBwb2ludFsyXSwgMV07XG4gICAgICAgIGxldCBiZWhpbmRGb2cgPSBmYWxzZTtcbiAgICAgICAgaWYgKHBvaW50WzJdIHx8IHRoaXMudHJhbnNmb3JtLnBpdGNoID4gMCkge1xuICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHAsIHAsIHBvc01hdHJpeCk7XG4gICAgICAgICAgICAvLyBEbyBub3QgcGVyZm9ybSBzeW1ib2wgb2NjbHVzaW9uIG9uIGdsb2JlIGR1ZSB0byBmb2cgZml4ZWQgcmFuZ2VcbiAgICAgICAgICAgIGNvbnN0IGlzR2xvYmUgPSBidWNrZXRQcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZSc7XG4gICAgICAgICAgICBpZiAodGhpcy5mb2dTdGF0ZSAmJiB0aWxlSUQgJiYgIWlzR2xvYmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb2dPcGFjaXR5ID0gZ2V0Rm9nT3BhY2l0eUF0VGlsZUNvb3JkKHRoaXMuZm9nU3RhdGUsIHBvaW50WzBdLCBwb2ludFsxXSwgcG9pbnRbMl0sIHRpbGVJRC50b1Vud3JhcHBlZCgpLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgYmVoaW5kRm9nID0gZm9nT3BhY2l0eSA+IEZPR19TWU1CT0xfQ0xJUFBJTkdfVEhSRVNIT0xEO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvamVjdGlvbi54eVRyYW5zZm9ybU1hdDQocCwgcCwgcG9zTWF0cml4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhID0gbmV3IFBvaW50KFxuICAgICAgICAgICAgKCgocFswXSAvIHBbM10gKyAxKSAvIDIpICogdGhpcy50cmFuc2Zvcm0ud2lkdGgpICsgdmlld3BvcnRQYWRkaW5nLFxuICAgICAgICAgICAgKCgoLXBbMV0gLyBwWzNdICsgMSkgLyAyKSAqIHRoaXMudHJhbnNmb3JtLmhlaWdodCkgKyB2aWV3cG9ydFBhZGRpbmdcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcG9pbnQ6IGEsXG4gICAgICAgICAgICAvLyBTZWUgcGVyc3BlY3RpdmUgcmF0aW8gY29tbWVudCBpbiBzeW1ib2xfc2RmLnZlcnRleFxuICAgICAgICAgICAgLy8gV2UncmUgZG9pbmcgY29sbGlzaW9uIGRldGVjdGlvbiBpbiB2aWV3cG9ydCBzcGFjZSBzbyB3ZSBuZWVkXG4gICAgICAgICAgICAvLyB0byBzY2FsZSBkb3duIGJveGVzIGluIHRoZSBkaXN0YW5jZVxuICAgICAgICAgICAgcGVyc3BlY3RpdmVSYXRpbzogTWF0aC5taW4oMC41ICsgMC41ICogKHRoaXMudHJhbnNmb3JtLmdldENhbWVyYVRvQ2VudGVyRGlzdGFuY2UoYnVja2V0UHJvamVjdGlvbikgLyBwWzNdKSwgMS41KSxcbiAgICAgICAgICAgIHNpZ25lZERpc3RhbmNlRnJvbUNhbWVyYTogcFszXSxcbiAgICAgICAgICAgIG9jY2x1ZGVkOiAoY2hlY2tPY2NsdXNpb24gJiYgcFsyXSA+IHBbM10pIHx8IGJlaGluZEZvZyAvLyBPY2NsdWRlZCBieSB0aGUgZmFyIHBsYW5lXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaXNPZmZzY3JlZW4oeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4geDIgPCB2aWV3cG9ydFBhZGRpbmcgfHwgeDEgPj0gdGhpcy5zY3JlZW5SaWdodEJvdW5kYXJ5IHx8IHkyIDwgdmlld3BvcnRQYWRkaW5nIHx8IHkxID4gdGhpcy5zY3JlZW5Cb3R0b21Cb3VuZGFyeTtcbiAgICB9XG5cbiAgICBpc0luc2lkZUdyaWQoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4geDIgPj0gMCAmJiB4MSA8IHRoaXMuZ3JpZFJpZ2h0Qm91bmRhcnkgJiYgeTIgPj0gMCAmJiB5MSA8IHRoaXMuZ3JpZEJvdHRvbUJvdW5kYXJ5O1xuICAgIH1cblxuICAgIC8qXG4gICAgKiBSZXR1cm5zIGEgbWF0cml4IGZvciB0cmFuc2Zvcm1pbmcgY29sbGlzaW9uIHNoYXBlcyB0byB2aWV3cG9ydCBjb29yZGluYXRlIHNwYWNlLlxuICAgICogVXNlIHRoaXMgZnVuY3Rpb24gdG8gcmVuZGVyIGUuZy4gY29sbGlzaW9uIGNpcmNsZXMgb24gdGhlIHNjcmVlbi5cbiAgICAqICAgZXhhbXBsZSB0cmFuc2Zvcm1hdGlvbjogY2xpcFBvcyA9IGdsQ29vcmRNYXRyaXggKiB2aWV3cG9ydE1hdHJpeCAqIGNpcmNsZV9wb3NcbiAgICAqL1xuICAgIGdldFZpZXdwb3J0TWF0cml4KCk6IE1hdDQge1xuICAgICAgICBjb25zdCBtID0gbWF0NC5pZGVudGl0eShbXSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFstdmlld3BvcnRQYWRkaW5nLCAtdmlld3BvcnRQYWRkaW5nLCAwLjBdKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2xsaXNpb25JbmRleDtcbiIsIi8vIEBmbG93XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUgU3ltYm9sQnVja2V0IGZyb20gJy4uLy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUgUHJvamVjdGlvbiBmcm9tICcuL3Byb2plY3Rpb24uanMnO1xuaW1wb3J0IHttYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5mdW5jdGlvbiByZWNvbnN0cnVjdFRpbGVNYXRyaXgodHJhbnNmb3JtOiBUcmFuc2Zvcm0sIHByb2plY3Rpb246IFByb2plY3Rpb24sIGNvb3JkOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgLy8gQnVja2V0IGJlaW5nIHJlbmRlcmVkIGlzIGJ1aWx0IGZvciBkaWZmZXJlbnQgbWFwIHByb2plY3Rpb25cbiAgICAvLyB0aGFuIGlzIGN1cnJlbnRseSBiZWluZyB1c2VkLiBSZWNvbnN0cnVjdCBjb3JyZWN0IG1hdHJpY2VzLlxuICAgIC8vIFRoaXMgY29kZSBwYXRoIG1heSBoYXBwZW4gZHVyaW5nIGEgR2xvYmUgLSBNZXJjYXRvciB0cmFuc2l0aW9uXG4gICAgY29uc3QgdGlsZU1hdHJpeCA9IHByb2plY3Rpb24uY3JlYXRlVGlsZU1hdHJpeCh0cmFuc2Zvcm0sIHRyYW5zZm9ybS53b3JsZFNpemUsIGNvb3JkLnRvVW53cmFwcGVkKCkpO1xuICAgIHJldHVybiBtYXQ0Lm11bHRpcGx5KG5ldyBGbG9hdDMyQXJyYXkoMTYpLCB0cmFuc2Zvcm0ucHJvak1hdHJpeCwgdGlsZU1hdHJpeCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xsaXNpb25EZWJ1Z1RpbGVQcm9qZWN0aW9uTWF0cml4KGNvb3JkOiBPdmVyc2NhbGVkVGlsZUlELCBidWNrZXQ6IFN5bWJvbEJ1Y2tldCwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBGbG9hdDMyQXJyYXkge1xuICAgIGlmIChidWNrZXQucHJvamVjdGlvbi5uYW1lID09PSB0cmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lKSB7XG4gICAgICAgIGFzc2VydChjb29yZC5wcm9qTWF0cml4KTtcbiAgICAgICAgcmV0dXJuIGNvb3JkLnByb2pNYXRyaXg7XG4gICAgfVxuICAgIGNvbnN0IHRyID0gdHJhbnNmb3JtLmNsb25lKCk7XG4gICAgdHIuc2V0UHJvamVjdGlvbihidWNrZXQucHJvamVjdGlvbik7XG4gICAgcmV0dXJuIHJlY29uc3RydWN0VGlsZU1hdHJpeCh0ciwgYnVja2V0LmdldFByb2plY3Rpb24oKSwgY29vcmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3ltYm9sVGlsZVByb2plY3Rpb25NYXRyaXgoY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQsIGJ1Y2tldFByb2plY3Rpb246IFByb2plY3Rpb24sIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogRmxvYXQzMkFycmF5IHtcbiAgICBpZiAoYnVja2V0UHJvamVjdGlvbi5uYW1lID09PSB0cmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lKSB7XG4gICAgICAgIGFzc2VydChjb29yZC5wcm9qTWF0cml4KTtcbiAgICAgICAgcmV0dXJuIGNvb3JkLnByb2pNYXRyaXg7XG4gICAgfVxuICAgIHJldHVybiByZWNvbnN0cnVjdFRpbGVNYXRyaXgodHJhbnNmb3JtLCBidWNrZXRQcm9qZWN0aW9uLCBjb29yZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTeW1ib2xQbGFjZW1lbnRUaWxlUHJvamVjdGlvbk1hdHJpeChjb29yZDogT3ZlcnNjYWxlZFRpbGVJRCwgYnVja2V0UHJvamVjdGlvbjogUHJvamVjdGlvbiwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sIHJ1bnRpbWVQcm9qZWN0aW9uOiBzdHJpbmcpOiBGbG9hdDMyQXJyYXkge1xuICAgIGlmIChidWNrZXRQcm9qZWN0aW9uLm5hbWUgPT09IHJ1bnRpbWVQcm9qZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm0uY2FsY3VsYXRlUHJvak1hdHJpeChjb29yZC50b1Vud3JhcHBlZCgpKTtcbiAgICB9XG4gICAgYXNzZXJ0KHRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgPT09IGJ1Y2tldFByb2plY3Rpb24ubmFtZSk7XG4gICAgcmV0dXJuIHJlY29uc3RydWN0VGlsZU1hdHJpeCh0cmFuc2Zvcm0sIGJ1Y2tldFByb2plY3Rpb24sIGNvb3JkKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDb2xsaXNpb25JbmRleCBmcm9tICcuL2NvbGxpc2lvbl9pbmRleC5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uL2RhdGEvZXh0ZW50LmpzJztcbmltcG9ydCBPTkVfRU0gZnJvbSAnLi9vbmVfZW0uanMnO1xuaW1wb3J0ICogYXMgc3ltYm9sU2l6ZSBmcm9tICcuL3N5bWJvbF9zaXplLmpzJztcbmltcG9ydCAqIGFzIHByb2plY3Rpb24gZnJvbSAnLi9wcm9qZWN0aW9uLmpzJztcbmltcG9ydCB7Z2V0QW5jaG9ySnVzdGlmaWNhdGlvbiwgZXZhbHVhdGVWYXJpYWJsZU9mZnNldH0gZnJvbSAnLi9zeW1ib2xfbGF5b3V0LmpzJztcbmltcG9ydCB7Z2V0QW5jaG9yQWxpZ25tZW50LCBXcml0aW5nTW9kZX0gZnJvbSAnLi9zaGFwaW5nLmpzJztcbmltcG9ydCB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSBTeW1ib2xCdWNrZXQsIHtDb2xsaXNpb25BcnJheXMsIFNpbmdsZUNvbGxpc2lvbkJveH0gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSB7Q29sbGlzaW9uQm94QXJyYXksIENvbGxpc2lvblZlcnRleEFycmF5LCBTeW1ib2xJbnN0YW5jZX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSBGZWF0dXJlSW5kZXggZnJvbSAnLi4vZGF0YS9mZWF0dXJlX2luZGV4LmpzJztcbmltcG9ydCB7Z2V0U3ltYm9sUGxhY2VtZW50VGlsZVByb2plY3Rpb25NYXRyaXh9IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3Byb2plY3Rpb25fdXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUge1RleHRBbmNob3J9IGZyb20gJy4vc3ltYm9sX2xheW91dC5qcyc7XG5pbXBvcnQgdHlwZSB7Rm9nU3RhdGV9IGZyb20gJy4uL3N0eWxlL2ZvZ19oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHtNYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuXG5jbGFzcyBPcGFjaXR5U3RhdGUge1xuICAgIG9wYWNpdHk6IG51bWJlcjtcbiAgICBwbGFjZWQ6IGJvb2xlYW47XG4gICAgY29uc3RydWN0b3IocHJldlN0YXRlOiA/T3BhY2l0eVN0YXRlLCBpbmNyZW1lbnQ6IG51bWJlciwgcGxhY2VkOiBib29sZWFuLCBza2lwRmFkZTogP2Jvb2xlYW4pIHtcbiAgICAgICAgaWYgKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5vcGFjaXR5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgcHJldlN0YXRlLm9wYWNpdHkgKyAocHJldlN0YXRlLnBsYWNlZCA/IGluY3JlbWVudCA6IC1pbmNyZW1lbnQpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wYWNpdHkgPSAoc2tpcEZhZGUgJiYgcGxhY2VkKSA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGxhY2VkID0gcGxhY2VkO1xuICAgIH1cbiAgICBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BhY2l0eSA9PT0gMCAmJiAhdGhpcy5wbGFjZWQ7XG4gICAgfVxufVxuXG5jbGFzcyBKb2ludE9wYWNpdHlTdGF0ZSB7XG4gICAgdGV4dDogT3BhY2l0eVN0YXRlO1xuICAgIGljb246IE9wYWNpdHlTdGF0ZTtcbiAgICBjbGlwcGVkOiBib29sZWFuO1xuICAgIGNvbnN0cnVjdG9yKHByZXZTdGF0ZTogP0pvaW50T3BhY2l0eVN0YXRlLCBpbmNyZW1lbnQ6IG51bWJlciwgcGxhY2VkVGV4dDogYm9vbGVhbiwgcGxhY2VkSWNvbjogYm9vbGVhbiwgc2tpcEZhZGU6ID9ib29sZWFuLCBjbGlwcGVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy50ZXh0ID0gbmV3IE9wYWNpdHlTdGF0ZShwcmV2U3RhdGUgPyBwcmV2U3RhdGUudGV4dCA6IG51bGwsIGluY3JlbWVudCwgcGxhY2VkVGV4dCwgc2tpcEZhZGUpO1xuICAgICAgICB0aGlzLmljb24gPSBuZXcgT3BhY2l0eVN0YXRlKHByZXZTdGF0ZSA/IHByZXZTdGF0ZS5pY29uIDogbnVsbCwgaW5jcmVtZW50LCBwbGFjZWRJY29uLCBza2lwRmFkZSk7XG5cbiAgICAgICAgdGhpcy5jbGlwcGVkID0gY2xpcHBlZDtcbiAgICB9XG4gICAgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQuaXNIaWRkZW4oKSAmJiB0aGlzLmljb24uaXNIaWRkZW4oKTtcbiAgICB9XG59XG5cbmNsYXNzIEpvaW50UGxhY2VtZW50IHtcbiAgICB0ZXh0OiBib29sZWFuO1xuICAgIGljb246IGJvb2xlYW47XG4gICAgLy8gc2tpcEZhZGUgPSBvdXRzaWRlIHZpZXdwb3J0LCBidXQgd2l0aGluIENvbGxpc2lvbkluZGV4Ojp2aWV3cG9ydFBhZGRpbmcgcHggb2YgdGhlIGVkZ2VcbiAgICAvLyBCZWNhdXNlIHRoZXNlIHN5bWJvbHMgYXJlbid0IG9uc2NyZWVuIHlldCwgd2UgY2FuIHNraXAgdGhlIFwiZmFkZSBpblwiIGFuaW1hdGlvbixcbiAgICAvLyBhbmQgaWYgYSBzdWJzZXF1ZW50IHZpZXdwb3J0IGNoYW5nZSBicmluZ3MgdGhlbSBpbnRvIHZpZXcsIHRoZXknbGwgYmUgZnVsbHlcbiAgICAvLyB2aXNpYmxlIHJpZ2h0IGF3YXkuXG4gICAgc2tpcEZhZGU6IGJvb2xlYW47XG5cbiAgICBjbGlwcGVkOiBib29sZWFuXG4gICAgY29uc3RydWN0b3IodGV4dDogYm9vbGVhbiwgaWNvbjogYm9vbGVhbiwgc2tpcEZhZGU6IGJvb2xlYW4sIGNsaXBwZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmljb24gPSBpY29uO1xuICAgICAgICB0aGlzLnNraXBGYWRlID0gc2tpcEZhZGU7XG4gICAgICAgIHRoaXMuY2xpcHBlZCA9IGNsaXBwZWQ7XG4gICAgfVxufVxuXG5jbGFzcyBDb2xsaXNpb25DaXJjbGVBcnJheSB7XG4gICAgLy8gU3RvcmVzIGNvbGxpc2lvbiBjaXJjbGVzIGFuZCBwbGFjZW1lbnQgbWF0cmljZXMgb2YgYSBidWNrZXQgZm9yIGRlYnVnIHJlbmRlcmluZy5cbiAgICBpbnZQcm9qTWF0cml4OiBNYXQ0O1xuICAgIHZpZXdwb3J0TWF0cml4OiBNYXQ0O1xuICAgIGNpcmNsZXM6IEFycmF5PG51bWJlcj47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pbnZQcm9qTWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydE1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIHRoaXMuY2lyY2xlcyA9IFtdO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJldGFpbmVkUXVlcnlEYXRhIHtcbiAgICBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXI7XG4gICAgZmVhdHVyZUluZGV4OiBGZWF0dXJlSW5kZXg7XG4gICAgc291cmNlTGF5ZXJJbmRleDogbnVtYmVyO1xuICAgIGJ1Y2tldEluZGV4OiBudW1iZXI7XG4gICAgdGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEO1xuICAgIGZlYXR1cmVTb3J0T3JkZXI6ID9BcnJheTxudW1iZXI+XG4gICAgY29uc3RydWN0b3IoYnVja2V0SW5zdGFuY2VJZDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleDogRmVhdHVyZUluZGV4LFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgICAgICB0aGlzLmJ1Y2tldEluc3RhbmNlSWQgPSBidWNrZXRJbnN0YW5jZUlkO1xuICAgICAgICB0aGlzLmZlYXR1cmVJbmRleCA9IGZlYXR1cmVJbmRleDtcbiAgICAgICAgdGhpcy5zb3VyY2VMYXllckluZGV4ID0gc291cmNlTGF5ZXJJbmRleDtcbiAgICAgICAgdGhpcy5idWNrZXRJbmRleCA9IGJ1Y2tldEluZGV4O1xuICAgICAgICB0aGlzLnRpbGVJRCA9IHRpbGVJRDtcbiAgICB9XG59XG5cbnR5cGUgQ29sbGlzaW9uR3JvdXAgPSB7fElEOiBudW1iZXIsIHByZWRpY2F0ZT86IGFueXx9O1xuXG5jbGFzcyBDb2xsaXNpb25Hcm91cHMge1xuICAgIGNvbGxpc2lvbkdyb3Vwczoge1tncm91cE5hbWU6IHN0cmluZ106IENvbGxpc2lvbkdyb3VwfTtcbiAgICBtYXhHcm91cElEOiBudW1iZXI7XG4gICAgY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zID0gY3Jvc3NTb3VyY2VDb2xsaXNpb25zO1xuICAgICAgICB0aGlzLm1heEdyb3VwSUQgPSAwO1xuICAgICAgICB0aGlzLmNvbGxpc2lvbkdyb3VwcyA9IHt9O1xuICAgIH1cblxuICAgIGdldChzb3VyY2VJRDogc3RyaW5nKTogQ29sbGlzaW9uR3JvdXAge1xuICAgICAgICAvLyBUaGUgcHJlZGljYXRlL2dyb3VwSUQgbWVjaGFuaXNtIGFsbG93cyBmb3IgYXJiaXRyYXJ5IGdyb3VwaW5nLFxuICAgICAgICAvLyBidXQgdGhlIGN1cnJlbnQgaW50ZXJmYWNlIGRlZmluZXMgb25lIHNvdXJjZSA9PSBvbmUgZ3JvdXAgd2hlblxuICAgICAgICAvLyBjcm9zc1NvdXJjZUNvbGxpc2lvbnMgPT0gdHJ1ZS5cbiAgICAgICAgaWYgKCF0aGlzLmNyb3NzU291cmNlQ29sbGlzaW9ucykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbGxpc2lvbkdyb3Vwc1tzb3VyY2VJRF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0R3JvdXBJRCA9ICsrdGhpcy5tYXhHcm91cElEO1xuICAgICAgICAgICAgICAgIHRoaXMuY29sbGlzaW9uR3JvdXBzW3NvdXJjZUlEXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgSUQ6IG5leHRHcm91cElELFxuICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGU6IChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkuY29sbGlzaW9uR3JvdXBJRCA9PT0gbmV4dEdyb3VwSUQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGlzaW9uR3JvdXBzW3NvdXJjZUlEXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7SUQ6IDAsIHByZWRpY2F0ZTogbnVsbH07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVZhcmlhYmxlTGF5b3V0U2hpZnQoYW5jaG9yOiBUZXh0QW5jaG9yLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgdGV4dE9mZnNldDogW251bWJlciwgbnVtYmVyXSwgdGV4dFNjYWxlOiBudW1iZXIpOiBQb2ludCB7XG4gICAgY29uc3Qge2hvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbn0gPSBnZXRBbmNob3JBbGlnbm1lbnQoYW5jaG9yKTtcbiAgICBjb25zdCBzaGlmdFggPSAtKGhvcml6b250YWxBbGlnbiAtIDAuNSkgKiB3aWR0aDtcbiAgICBjb25zdCBzaGlmdFkgPSAtKHZlcnRpY2FsQWxpZ24gLSAwLjUpICogaGVpZ2h0O1xuICAgIGNvbnN0IG9mZnNldCA9IGV2YWx1YXRlVmFyaWFibGVPZmZzZXQoYW5jaG9yLCB0ZXh0T2Zmc2V0KTtcbiAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICBzaGlmdFggKyBvZmZzZXRbMF0gKiB0ZXh0U2NhbGUsXG4gICAgICAgIHNoaWZ0WSArIG9mZnNldFsxXSAqIHRleHRTY2FsZVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIG9mZnNldFNoaWZ0KHNoaWZ0WDogbnVtYmVyLCBzaGlmdFk6IG51bWJlciwgcm90YXRlV2l0aE1hcDogYm9vbGVhbiwgcGl0Y2hXaXRoTWFwOiBib29sZWFuLCBhbmdsZTogbnVtYmVyKTogUG9pbnQge1xuICAgIGNvbnN0IHNoaWZ0ID0gbmV3IFBvaW50KHNoaWZ0WCwgc2hpZnRZKTtcbiAgICBpZiAocm90YXRlV2l0aE1hcCkge1xuICAgICAgICBzaGlmdC5fcm90YXRlKHBpdGNoV2l0aE1hcCA/IGFuZ2xlIDogLWFuZ2xlKTtcbiAgICB9XG4gICAgcmV0dXJuIHNoaWZ0O1xufVxuXG5leHBvcnQgdHlwZSBWYXJpYWJsZU9mZnNldCA9IHtcbiAgICB0ZXh0T2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgYW5jaG9yOiBUZXh0QW5jaG9yLFxuICAgIHRleHRTY2FsZTogbnVtYmVyLFxuICAgIHByZXZBbmNob3I/OiBUZXh0QW5jaG9yXG59O1xuXG50eXBlIFRpbGVMYXllclBhcmFtZXRlcnMgPSB7XG4gICAgYnVja2V0OiBTeW1ib2xCdWNrZXQsXG4gICAgbGF5b3V0OiBhbnksXG4gICAgcG9zTWF0cml4OiBNYXQ0LFxuICAgIHRleHRMYWJlbFBsYW5lTWF0cml4OiBNYXQ0LFxuICAgIGxhYmVsVG9TY3JlZW5NYXRyaXg6ID9NYXQ0LFxuICAgIHNjYWxlOiBudW1iZXIsXG4gICAgdGV4dFBpeGVsUmF0aW86IG51bWJlcixcbiAgICBob2xkaW5nRm9yRmFkZTogYm9vbGVhbixcbiAgICBjb2xsaXNpb25Cb3hBcnJheTogP0NvbGxpc2lvbkJveEFycmF5LFxuICAgIHBhcnRpYWxseUV2YWx1YXRlZFRleHRTaXplOiBhbnksXG4gICAgY29sbGlzaW9uR3JvdXA6IGFueVxufTtcblxuZXhwb3J0IHR5cGUgQnVja2V0UGFydCA9IHtcbiAgICBzb3J0S2V5PzogbnVtYmVyIHwgdm9pZCxcbiAgICBzeW1ib2xJbnN0YW5jZVN0YXJ0OiBudW1iZXIsXG4gICAgc3ltYm9sSW5zdGFuY2VFbmQ6IG51bWJlcixcbiAgICBwYXJhbWV0ZXJzOiBUaWxlTGF5ZXJQYXJhbWV0ZXJzXG59O1xuXG5leHBvcnQgdHlwZSBDcm9zc1RpbGVJRCA9IHN0cmluZyB8IG51bWJlcjtcblxuZXhwb3J0IGNsYXNzIFBsYWNlbWVudCB7XG4gICAgcHJvamVjdGlvbjogc3RyaW5nO1xuICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtO1xuICAgIGNvbGxpc2lvbkluZGV4OiBDb2xsaXNpb25JbmRleDtcbiAgICBwbGFjZW1lbnRzOiB7IFtfOiBDcm9zc1RpbGVJRF06IEpvaW50UGxhY2VtZW50IH07XG4gICAgb3BhY2l0aWVzOiB7IFtfOiBDcm9zc1RpbGVJRF06IEpvaW50T3BhY2l0eVN0YXRlIH07XG4gICAgdmFyaWFibGVPZmZzZXRzOiB7W186IENyb3NzVGlsZUlEXTogVmFyaWFibGVPZmZzZXQgfTtcbiAgICBwbGFjZWRPcmllbnRhdGlvbnM6IHtbXzogQ3Jvc3NUaWxlSURdOiBudW1iZXIgfTtcbiAgICBjb21taXRUaW1lOiBudW1iZXI7XG4gICAgcHJldlpvb21BZGp1c3RtZW50OiBudW1iZXI7XG4gICAgbGFzdFBsYWNlbWVudENoYW5nZVRpbWU6IG51bWJlcjtcbiAgICBzdGFsZTogYm9vbGVhbjtcbiAgICBmYWRlRHVyYXRpb246IG51bWJlcjtcbiAgICByZXRhaW5lZFF1ZXJ5RGF0YToge1tfOiBudW1iZXJdOiBSZXRhaW5lZFF1ZXJ5RGF0YX07XG4gICAgY29sbGlzaW9uR3JvdXBzOiBDb2xsaXNpb25Hcm91cHM7XG4gICAgcHJldlBsYWNlbWVudDogP1BsYWNlbWVudDtcbiAgICB6b29tQXRMYXN0UmVjZW5jeUNoZWNrOiBudW1iZXI7XG4gICAgY29sbGlzaW9uQ2lyY2xlQXJyYXlzOiB7W2FueV06IENvbGxpc2lvbkNpcmNsZUFycmF5fTtcblxuICAgIGNvbnN0cnVjdG9yKHRyYW5zZm9ybTogVHJhbnNmb3JtLCBmYWRlRHVyYXRpb246IG51bWJlciwgY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuLCBwcmV2UGxhY2VtZW50PzogUGxhY2VtZW50LCBmb2dTdGF0ZTogP0ZvZ1N0YXRlKSB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtLmNsb25lKCk7XG4gICAgICAgIHRoaXMucHJvamVjdGlvbiA9IHRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWU7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uSW5kZXggPSBuZXcgQ29sbGlzaW9uSW5kZXgodGhpcy50cmFuc2Zvcm0sIGZvZ1N0YXRlKTtcbiAgICAgICAgdGhpcy5wbGFjZW1lbnRzID0ge307XG4gICAgICAgIHRoaXMub3BhY2l0aWVzID0ge307XG4gICAgICAgIHRoaXMudmFyaWFibGVPZmZzZXRzID0ge307XG4gICAgICAgIHRoaXMuc3RhbGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21taXRUaW1lID0gMDtcbiAgICAgICAgdGhpcy5mYWRlRHVyYXRpb24gPSBmYWRlRHVyYXRpb247XG4gICAgICAgIHRoaXMucmV0YWluZWRRdWVyeURhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25Hcm91cHMgPSBuZXcgQ29sbGlzaW9uR3JvdXBzKGNyb3NzU291cmNlQ29sbGlzaW9ucyk7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzID0ge307XG5cbiAgICAgICAgdGhpcy5wcmV2UGxhY2VtZW50ID0gcHJldlBsYWNlbWVudDtcbiAgICAgICAgaWYgKHByZXZQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIHByZXZQbGFjZW1lbnQucHJldlBsYWNlbWVudCA9IHVuZGVmaW5lZDsgLy8gT25seSBob2xkIG9uIHRvIG9uZSBwbGFjZW1lbnQgYmFja1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wbGFjZWRPcmllbnRhdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBnZXRCdWNrZXRQYXJ0cyhyZXN1bHRzOiBBcnJheTxCdWNrZXRQYXJ0Piwgc3R5bGVMYXllcjogU3R5bGVMYXllciwgdGlsZTogVGlsZSwgc29ydEFjcm9zc1RpbGVzOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbEJ1Y2tldCA9ICgodGlsZS5nZXRCdWNrZXQoc3R5bGVMYXllcik6IGFueSk6IFN5bWJvbEJ1Y2tldCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldEZlYXR1cmVJbmRleCA9IHRpbGUubGF0ZXN0RmVhdHVyZUluZGV4O1xuXG4gICAgICAgIGlmICghc3ltYm9sQnVja2V0IHx8ICFidWNrZXRGZWF0dXJlSW5kZXggfHwgc3R5bGVMYXllci5pZCAhPT0gc3ltYm9sQnVja2V0LmxheWVySWRzWzBdKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHN5bWJvbEJ1Y2tldC5sYXllcnNbMF0ubGF5b3V0O1xuXG4gICAgICAgIGNvbnN0IGNvbGxpc2lvbkJveEFycmF5ID0gdGlsZS5jb2xsaXNpb25Cb3hBcnJheTtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygyLCB0aGlzLnRyYW5zZm9ybS56b29tIC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgICAgICBjb25zdCB0ZXh0UGl4ZWxSYXRpbyA9IHRpbGUudGlsZVNpemUgLyBFWFRFTlQ7XG4gICAgICAgIGNvbnN0IHVud3JhcHBlZFRpbGVJRCA9IHRpbGUudGlsZUlELnRvVW53cmFwcGVkKCk7XG5cbiAgICAgICAgdGhpcy50cmFuc2Zvcm0uc2V0UHJvamVjdGlvbihzeW1ib2xCdWNrZXQucHJvamVjdGlvbik7XG5cbiAgICAgICAgY29uc3QgcG9zTWF0cml4ID0gZ2V0U3ltYm9sUGxhY2VtZW50VGlsZVByb2plY3Rpb25NYXRyaXgodGlsZS50aWxlSUQsIHN5bWJvbEJ1Y2tldC5nZXRQcm9qZWN0aW9uKCksIHRoaXMudHJhbnNmb3JtLCB0aGlzLnByb2plY3Rpb24pO1xuXG4gICAgICAgIGNvbnN0IHBpdGNoV2l0aE1hcCA9IGxheW91dC5nZXQoJ3RleHQtcGl0Y2gtYWxpZ25tZW50JykgPT09ICdtYXAnO1xuICAgICAgICBjb25zdCByb3RhdGVXaXRoTWFwID0gbGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG5cbiAgICAgICAgc3R5bGVMYXllci5jb21waWxlRmlsdGVyKCk7XG5cbiAgICAgICAgY29uc3QgZHluYW1pY0ZpbHRlciA9IHN0eWxlTGF5ZXIuZHluYW1pY0ZpbHRlcigpO1xuICAgICAgICBjb25zdCBkeW5hbWljRmlsdGVyTmVlZHNGZWF0dXJlID0gc3R5bGVMYXllci5keW5hbWljRmlsdGVyTmVlZHNGZWF0dXJlKCk7XG4gICAgICAgIGNvbnN0IHBpeGVsc1RvVGlsZXMgPSB0aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGVQaXhlbHNUb1RpbGVVbml0c01hdHJpeCh0aWxlKTtcblxuICAgICAgICBjb25zdCB0ZXh0TGFiZWxQbGFuZU1hdHJpeCA9IHByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeEZvclBsYWNlbWVudChwb3NNYXRyaXgsXG4gICAgICAgICAgICAgICAgdGlsZS50aWxlSUQuY2Fub25pY2FsLFxuICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcCxcbiAgICAgICAgICAgICAgICByb3RhdGVXaXRoTWFwLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgIHN5bWJvbEJ1Y2tldC5nZXRQcm9qZWN0aW9uKCksXG4gICAgICAgICAgICAgICAgcGl4ZWxzVG9UaWxlcyk7XG5cbiAgICAgICAgbGV0IGxhYmVsVG9TY3JlZW5NYXRyaXggPSBudWxsO1xuXG4gICAgICAgIGlmIChwaXRjaFdpdGhNYXApIHtcbiAgICAgICAgICAgIGNvbnN0IGdsTWF0cml4ID0gcHJvamVjdGlvbi5nZXRHbENvb3JkTWF0cml4KFxuICAgICAgICAgICAgICAgIHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICB0aWxlLnRpbGVJRC5jYW5vbmljYWwsXG4gICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwLFxuICAgICAgICAgICAgICAgIHJvdGF0ZVdpdGhNYXAsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgc3ltYm9sQnVja2V0LmdldFByb2plY3Rpb24oKSxcbiAgICAgICAgICAgICAgICBwaXhlbHNUb1RpbGVzKTtcblxuICAgICAgICAgICAgbGFiZWxUb1NjcmVlbk1hdHJpeCA9IG1hdDQubXVsdGlwbHkoW10sIHRoaXMudHJhbnNmb3JtLmxhYmVsUGxhbmVNYXRyaXgsIGdsTWF0cml4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjbGlwcGluZ0RhdGEgPSBudWxsO1xuICAgICAgICBhc3NlcnQoISF0aWxlLmxhdGVzdEZlYXR1cmVJbmRleCk7XG4gICAgICAgIGlmICghIWR5bmFtaWNGaWx0ZXIgJiYgdGlsZS5sYXRlc3RGZWF0dXJlSW5kZXgpIHtcblxuICAgICAgICAgICAgY2xpcHBpbmdEYXRhID0ge1xuICAgICAgICAgICAgICAgIHVud3JhcHBlZFRpbGVJRCxcbiAgICAgICAgICAgICAgICBkeW5hbWljRmlsdGVyLFxuICAgICAgICAgICAgICAgIGR5bmFtaWNGaWx0ZXJOZWVkc0ZlYXR1cmUsXG4gICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4OiB0aWxlLmxhdGVzdEZlYXR1cmVJbmRleFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFzIGxvbmcgYXMgdGhpcyBwbGFjZW1lbnQgbGl2ZXMsIHdlIGhhdmUgdG8gaG9sZCBvbnRvIHRoaXMgYnVja2V0J3NcbiAgICAgICAgLy8gbWF0Y2hpbmcgRmVhdHVyZUluZGV4L2RhdGEgZm9yIHF1ZXJ5aW5nIHB1cnBvc2VzXG4gICAgICAgIHRoaXMucmV0YWluZWRRdWVyeURhdGFbc3ltYm9sQnVja2V0LmJ1Y2tldEluc3RhbmNlSWRdID0gbmV3IFJldGFpbmVkUXVlcnlEYXRhKFxuICAgICAgICAgICAgc3ltYm9sQnVja2V0LmJ1Y2tldEluc3RhbmNlSWQsXG4gICAgICAgICAgICBidWNrZXRGZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xCdWNrZXQuc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgIHN5bWJvbEJ1Y2tldC5pbmRleCxcbiAgICAgICAgICAgIHRpbGUudGlsZUlEXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgICAgICAgIGJ1Y2tldDogc3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgbGF5b3V0LFxuICAgICAgICAgICAgcG9zTWF0cml4LFxuICAgICAgICAgICAgdGV4dExhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICAgICBsYWJlbFRvU2NyZWVuTWF0cml4LFxuICAgICAgICAgICAgY2xpcHBpbmdEYXRhLFxuICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICB0ZXh0UGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIGhvbGRpbmdGb3JGYWRlOiB0aWxlLmhvbGRpbmdGb3JGYWRlKCksXG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheSxcbiAgICAgICAgICAgIHBhcnRpYWxseUV2YWx1YXRlZFRleHRTaXplOiBzeW1ib2xTaXplLmV2YWx1YXRlU2l6ZUZvclpvb20oc3ltYm9sQnVja2V0LnRleHRTaXplRGF0YSwgdGhpcy50cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICAgICBwYXJ0aWFsbHlFdmFsdWF0ZWRJY29uU2l6ZTogc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHN5bWJvbEJ1Y2tldC5pY29uU2l6ZURhdGEsIHRoaXMudHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAgICAgY29sbGlzaW9uR3JvdXA6IHRoaXMuY29sbGlzaW9uR3JvdXBzLmdldChzeW1ib2xCdWNrZXQuc291cmNlSUQpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHNvcnRBY3Jvc3NUaWxlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCByYW5nZSBvZiBzeW1ib2xCdWNrZXQuc29ydEtleVJhbmdlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtzb3J0S2V5LCBzeW1ib2xJbnN0YW5jZVN0YXJ0LCBzeW1ib2xJbnN0YW5jZUVuZH0gPSByYW5nZTtcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe3NvcnRLZXksIHN5bWJvbEluc3RhbmNlU3RhcnQsIHN5bWJvbEluc3RhbmNlRW5kLCBwYXJhbWV0ZXJzfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlU3RhcnQ6IDAsXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2VFbmQ6IHN5bWJvbEJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXR0ZW1wdEFuY2hvclBsYWNlbWVudChhbmNob3I6IFRleHRBbmNob3IsIHRleHRCb3g6IFNpbmdsZUNvbGxpc2lvbkJveCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U2NhbGU6IG51bWJlciwgcm90YXRlV2l0aE1hcDogYm9vbGVhbiwgcGl0Y2hXaXRoTWFwOiBib29sZWFuLCB0ZXh0UGl4ZWxSYXRpbzogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zTWF0cml4OiBNYXQ0LCBjb2xsaXNpb25Hcm91cDogQ29sbGlzaW9uR3JvdXAsIHRleHRBbGxvd092ZXJsYXA6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZTogU3ltYm9sSW5zdGFuY2UsIHN5bWJvbEluZGV4OiBudW1iZXIsIGJ1Y2tldDogU3ltYm9sQnVja2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb246IG51bWJlciwgaWNvbkJveDogP1NpbmdsZUNvbGxpc2lvbkJveCwgdGV4dFNpemU6IGFueSwgaWNvblNpemU6IGFueSk6ID97IHNoaWZ0OiBQb2ludCwgcGxhY2VkR2x5cGhCb3hlczogeyBib3g6IEFycmF5PG51bWJlcj4sIG9mZnNjcmVlbjogYm9vbGVhbiwgb2NjbHVkZWQ6IGJvb2xlYW4gfSB9ICB7XG5cbiAgICAgICAgY29uc3QgdGV4dE9mZnNldCA9IFtzeW1ib2xJbnN0YW5jZS50ZXh0T2Zmc2V0MCwgc3ltYm9sSW5zdGFuY2UudGV4dE9mZnNldDFdO1xuICAgICAgICBjb25zdCBzaGlmdCA9IGNhbGN1bGF0ZVZhcmlhYmxlTGF5b3V0U2hpZnQoYW5jaG9yLCB3aWR0aCwgaGVpZ2h0LCB0ZXh0T2Zmc2V0LCB0ZXh0U2NhbGUpO1xuXG4gICAgICAgIGNvbnN0IHBsYWNlZEdseXBoQm94ZXMgPSB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQm94KFxuICAgICAgICAgICAgYnVja2V0LCB0ZXh0U2NhbGUsIHRleHRCb3gsIG9mZnNldFNoaWZ0KHNoaWZ0LngsIHNoaWZ0LnksIHJvdGF0ZVdpdGhNYXAsIHBpdGNoV2l0aE1hcCwgdGhpcy50cmFuc2Zvcm0uYW5nbGUpLFxuICAgICAgICAgICAgdGV4dEFsbG93T3ZlcmxhcCwgdGV4dFBpeGVsUmF0aW8sIHBvc01hdHJpeCwgY29sbGlzaW9uR3JvdXAucHJlZGljYXRlKTtcblxuICAgICAgICBpZiAoaWNvbkJveCkge1xuICAgICAgICAgICAgY29uc3QgcGxhY2VkSWNvbkJveGVzID0gdGhpcy5jb2xsaXNpb25JbmRleC5wbGFjZUNvbGxpc2lvbkJveChcbiAgICAgICAgICAgICAgICBidWNrZXQsIGJ1Y2tldC5nZXRTeW1ib2xJbnN0YW5jZUljb25TaXplKGljb25TaXplLCB0aGlzLnRyYW5zZm9ybS56b29tLCBzeW1ib2xJbmRleCksXG4gICAgICAgICAgICAgICAgaWNvbkJveCwgb2Zmc2V0U2hpZnQoc2hpZnQueCwgc2hpZnQueSwgcm90YXRlV2l0aE1hcCwgcGl0Y2hXaXRoTWFwLCB0aGlzLnRyYW5zZm9ybS5hbmdsZSksXG4gICAgICAgICAgICAgICAgdGV4dEFsbG93T3ZlcmxhcCwgdGV4dFBpeGVsUmF0aW8sIHBvc01hdHJpeCwgY29sbGlzaW9uR3JvdXAucHJlZGljYXRlKTtcbiAgICAgICAgICAgIGlmIChwbGFjZWRJY29uQm94ZXMuYm94Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYWNlZEdseXBoQm94ZXMuYm94Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBwcmV2QW5jaG9yO1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBsYWJlbCB3YXMgcGxhY2VkIGluIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQsIHJlY29yZCB0aGUgYW5jaG9yIHBvc2l0aW9uXG4gICAgICAgICAgICAvLyB0byBhbGxvdyB1cyB0byBhbmltYXRlIHRoZSB0cmFuc2l0aW9uXG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2UGxhY2VtZW50ICYmXG4gICAgICAgICAgICAgICAgdGhpcy5wcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZQbGFjZW1lbnQucGxhY2VtZW50c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZQbGFjZW1lbnQucGxhY2VtZW50c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0udGV4dCkge1xuICAgICAgICAgICAgICAgIHByZXZBbmNob3IgPSB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXS5hbmNob3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQoc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgIT09IDApO1xuICAgICAgICAgICAgdGhpcy52YXJpYWJsZU9mZnNldHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0ge1xuICAgICAgICAgICAgICAgIHRleHRPZmZzZXQsXG4gICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgICAgICB0ZXh0U2NhbGUsXG4gICAgICAgICAgICAgICAgcHJldkFuY2hvclxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubWFya1VzZWRKdXN0aWZpY2F0aW9uKGJ1Y2tldCwgYW5jaG9yLCBzeW1ib2xJbnN0YW5jZSwgb3JpZW50YXRpb24pO1xuXG4gICAgICAgICAgICBpZiAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkT3JpZW50YXRpb24oYnVja2V0LCBvcmllbnRhdGlvbiwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VkT3JpZW50YXRpb25zW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IG9yaWVudGF0aW9uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge3NoaWZ0LCBwbGFjZWRHbHlwaEJveGVzfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBsYWNlTGF5ZXJCdWNrZXRQYXJ0KGJ1Y2tldFBhcnQ6IE9iamVjdCwgc2VlbkNyb3NzVGlsZUlEczogeyBbc3RyaW5nIHwgbnVtYmVyXTogYm9vbGVhbiB9LCBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW4sIHVwZGF0ZUNvbGxpc2lvbkJveElmTmVjZXNzYXJ5OiBib29sZWFuKSB7XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgYnVja2V0LFxuICAgICAgICAgICAgbGF5b3V0LFxuICAgICAgICAgICAgcG9zTWF0cml4LFxuICAgICAgICAgICAgdGV4dExhYmVsUGxhbmVNYXRyaXgsXG4gICAgICAgICAgICBsYWJlbFRvU2NyZWVuTWF0cml4LFxuICAgICAgICAgICAgY2xpcHBpbmdEYXRhLFxuICAgICAgICAgICAgdGV4dFBpeGVsUmF0aW8sXG4gICAgICAgICAgICBob2xkaW5nRm9yRmFkZSxcbiAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgcGFydGlhbGx5RXZhbHVhdGVkVGV4dFNpemUsXG4gICAgICAgICAgICBwYXJ0aWFsbHlFdmFsdWF0ZWRJY29uU2l6ZSxcbiAgICAgICAgICAgIGNvbGxpc2lvbkdyb3VwXG4gICAgICAgIH0gPSBidWNrZXRQYXJ0LnBhcmFtZXRlcnM7XG5cbiAgICAgICAgY29uc3QgdGV4dE9wdGlvbmFsID0gbGF5b3V0LmdldCgndGV4dC1vcHRpb25hbCcpO1xuICAgICAgICBjb25zdCBpY29uT3B0aW9uYWwgPSBsYXlvdXQuZ2V0KCdpY29uLW9wdGlvbmFsJyk7XG4gICAgICAgIGNvbnN0IHRleHRBbGxvd092ZXJsYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LWFsbG93LW92ZXJsYXAnKTtcbiAgICAgICAgY29uc3QgaWNvbkFsbG93T3ZlcmxhcCA9IGxheW91dC5nZXQoJ2ljb24tYWxsb3ctb3ZlcmxhcCcpO1xuICAgICAgICBjb25zdCByb3RhdGVXaXRoTWFwID0gbGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSA9PT0gJ21hcCc7XG4gICAgICAgIGNvbnN0IHBpdGNoV2l0aE1hcCA9IGxheW91dC5nZXQoJ3RleHQtcGl0Y2gtYWxpZ25tZW50JykgPT09ICdtYXAnO1xuICAgICAgICBjb25zdCBoYXNJY29uVGV4dEZpdCA9IGxheW91dC5nZXQoJ2ljb24tdGV4dC1maXQnKSAhPT0gJ25vbmUnO1xuICAgICAgICBjb25zdCB6T3JkZXJCeVZpZXdwb3J0WSA9IGxheW91dC5nZXQoJ3N5bWJvbC16LW9yZGVyJykgPT09ICd2aWV3cG9ydC15JztcblxuICAgICAgICB0aGlzLnRyYW5zZm9ybS5zZXRQcm9qZWN0aW9uKGJ1Y2tldC5wcm9qZWN0aW9uKTtcblxuICAgICAgICAvLyBUaGlzIGxvZ2ljIGlzIHNpbWlsYXIgdG8gdGhlIFwiZGVmYXVsdE9wYWNpdHlTdGF0ZVwiIGxvZ2ljIGJlbG93IGluIHVwZGF0ZUJ1Y2tldE9wYWNpdGllc1xuICAgICAgICAvLyBJZiB3ZSBrbm93IGEgc3ltYm9sIGlzIGFsd2F5cyBzdXBwb3NlZCB0byBzaG93LCBmb3JjZSBpdCB0byBiZSBtYXJrZWQgdmlzaWJsZSBldmVuIGlmXG4gICAgICAgIC8vIGl0IHdhc24ndCBwbGFjZWQgaW50byB0aGUgY29sbGlzaW9uIGluZGV4IChiZWNhdXNlIHNvbWUgb3IgYWxsIG9mIGl0IHdhcyBvdXRzaWRlIHRoZSByYW5nZVxuICAgICAgICAvLyBvZiB0aGUgY29sbGlzaW9uIGdyaWQpLlxuICAgICAgICAvLyBUaGVyZSBpcyBhIHN1YnRsZSBlZGdlIGNhc2UgaGVyZSB3ZSdyZSBhY2NlcHRpbmc6XG4gICAgICAgIC8vICBTeW1ib2wgQSBoYXMgdGV4dC1hbGxvdy1vdmVybGFwOiB0cnVlLCBpY29uLWFsbG93LW92ZXJsYXA6IHRydWUsIGljb24tb3B0aW9uYWw6IGZhbHNlXG4gICAgICAgIC8vICBBJ3MgaWNvbiBpcyBvdXRzaWRlIHRoZSBncmlkLCBzbyBkb2Vzbid0IGdldCBwbGFjZWRcbiAgICAgICAgLy8gIEEncyB0ZXh0IHdvdWxkIGJlIGluc2lkZSBncmlkLCBidXQgZG9lc24ndCBnZXQgcGxhY2VkIGJlY2F1c2Ugb2YgaWNvbi1vcHRpb25hbDogZmFsc2VcbiAgICAgICAgLy8gIFdlIHN0aWxsIHNob3cgQSBiZWNhdXNlIG9mIHRoZSBhbGxvdy1vdmVybGFwIHNldHRpbmdzLlxuICAgICAgICAvLyAgU3ltYm9sIEIgaGFzIGFsbG93LW92ZXJsYXA6IGZhbHNlLCBhbmQgZ2V0cyBwbGFjZWQgd2hlcmUgQSdzIHRleHQgd291bGQgYmVcbiAgICAgICAgLy8gIE9uIHBhbm5pbmcgaW4sIHRoZXJlIGlzIGEgc2hvcnQgcGVyaW9kIHdoZW4gU3ltYm9sIEIgYW5kIFN5bWJvbCBBIHdpbGwgb3ZlcmxhcFxuICAgICAgICAvLyAgVGhpcyBpcyB0aGUgcmV2ZXJzZSBvZiBvdXIgbm9ybWFsIHBvbGljeSBvZiBcImZhZGUgaW4gb24gcGFuXCIsIGJ1dCBzaG91bGQgbG9vayBsaWtlIGFueSBvdGhlclxuICAgICAgICAvLyAgY29sbGlzaW9uIGFuZCBob3BlZnVsbHkgbm90IGJlIHRvbyBub3RpY2VhYmxlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzcxNzJcbiAgICAgICAgbGV0IGFsd2F5c1Nob3dUZXh0ID0gdGV4dEFsbG93T3ZlcmxhcCAmJiAoaWNvbkFsbG93T3ZlcmxhcCB8fCAhYnVja2V0Lmhhc0ljb25EYXRhKCkgfHwgaWNvbk9wdGlvbmFsKTtcbiAgICAgICAgbGV0IGFsd2F5c1Nob3dJY29uID0gaWNvbkFsbG93T3ZlcmxhcCAmJiAodGV4dEFsbG93T3ZlcmxhcCB8fCAhYnVja2V0Lmhhc1RleHREYXRhKCkgfHwgdGV4dE9wdGlvbmFsKTtcblxuICAgICAgICBpZiAoIWJ1Y2tldC5jb2xsaXNpb25BcnJheXMgJiYgY29sbGlzaW9uQm94QXJyYXkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKGNvbGxpc2lvbkJveEFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaG93Q29sbGlzaW9uQm94ZXMgJiYgdXBkYXRlQ29sbGlzaW9uQm94SWZOZWNlc3NhcnkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC51cGRhdGVDb2xsaXNpb25EZWJ1Z0J1ZmZlcnModGhpcy50cmFuc2Zvcm0uem9vbSwgY29sbGlzaW9uQm94QXJyYXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGxhY2VTeW1ib2wgPSAoc3ltYm9sSW5zdGFuY2U6IFN5bWJvbEluc3RhbmNlLCBzeW1ib2xJbmRleDogbnVtYmVyLCBjb2xsaXNpb25BcnJheXM6IENvbGxpc2lvbkFycmF5cykgPT4ge1xuICAgICAgICAgICAgaWYgKGNsaXBwaW5nRGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIFNldHVwIGdsb2JhbHNcbiAgICAgICAgICAgICAgICBjb25zdCBnbG9iYWxzID0ge1xuICAgICAgICAgICAgICAgICAgICB6b29tOiB0aGlzLnRyYW5zZm9ybS56b29tLFxuICAgICAgICAgICAgICAgICAgICBwaXRjaDogdGhpcy50cmFuc2Zvcm0ucGl0Y2gsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIC8vIERlc2VyaWFsaXplIGZlYXR1cmUgb25seSBpZiBuZWNlc3NhcnlcbiAgICAgICAgICAgICAgICBsZXQgZmVhdHVyZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGNsaXBwaW5nRGF0YS5keW5hbWljRmlsdGVyTmVlZHNGZWF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVJbmRleCA9IGNsaXBwaW5nRGF0YS5mZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldGFpbmVkUXVlcnlEYXRhID0gdGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YVtidWNrZXQuYnVja2V0SW5zdGFuY2VJZF07XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUgPSBmZWF0dXJlSW5kZXgubG9hZEZlYXR1cmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUluZGV4OiBzeW1ib2xJbnN0YW5jZS5mZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXRJbmRleDogcmV0YWluZWRRdWVyeURhdGEuYnVja2V0SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VMYXllckluZGV4OiByZXRhaW5lZFF1ZXJ5RGF0YS5zb3VyY2VMYXllckluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0VmVydGV4QXJyYXlPZmZzZXQ6IDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbFRpbGVJZCA9IHRoaXMucmV0YWluZWRRdWVyeURhdGFbYnVja2V0LmJ1Y2tldEluc3RhbmNlSWRdLnRpbGVJRC5jYW5vbmljYWw7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJGdW5jID0gY2xpcHBpbmdEYXRhLmR5bmFtaWNGaWx0ZXI7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkQ2xpcCA9ICFmaWx0ZXJGdW5jKGdsb2JhbHMsIGZlYXR1cmUsIGNhbm9uaWNhbFRpbGVJZCwgbmV3IFBvaW50KHN5bWJvbEluc3RhbmNlLnRpbGVBbmNob3JYLCBzeW1ib2xJbnN0YW5jZS50aWxlQW5jaG9yWSksIHRoaXMudHJhbnNmb3JtLmNhbGN1bGF0ZURpc3RhbmNlVGlsZURhdGEoY2xpcHBpbmdEYXRhLnVud3JhcHBlZFRpbGVJRCkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENsaXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IG5ldyBKb2ludFBsYWNlbWVudChmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgc2VlbkNyb3NzVGlsZUlEc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2VlbkNyb3NzVGlsZUlEc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0pIHJldHVybjtcbiAgICAgICAgICAgIGlmIChob2xkaW5nRm9yRmFkZSkge1xuICAgICAgICAgICAgICAgIC8vIE1hcmsgYWxsIHN5bWJvbHMgZnJvbSB0aGlzIHRpbGUgYXMgXCJub3QgcGxhY2VkXCIsIGJ1dCBkb24ndCBhZGQgdG8gc2VlbkNyb3NzVGlsZUlEcywgYmVjYXVzZSB3ZSBkb24ndFxuICAgICAgICAgICAgICAgIC8vIGtub3cgeWV0IGlmIHdlIGhhdmUgYSBkdXBsaWNhdGUgaW4gYSBwYXJlbnQgdGlsZSB0aGF0IF9zaG91bGRfIGJlIHBsYWNlZC5cbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gbmV3IEpvaW50UGxhY2VtZW50KGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwbGFjZVRleHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwbGFjZUljb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBvZmZzY3JlZW4gPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHRleHRPY2NsdWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGljb25PY2NsdWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IHNoaWZ0ID0gbnVsbDtcblxuICAgICAgICAgICAgbGV0IHBsYWNlZCA9IHtib3g6IG51bGwsIG9mZnNjcmVlbjogbnVsbCwgb2NjbHVkZWQ6IG51bGx9O1xuICAgICAgICAgICAgbGV0IHBsYWNlZFZlcnRpY2FsVGV4dCA9IHtib3g6IG51bGwsIG9mZnNjcmVlbjogbnVsbCwgb2NjbHVkZWQ6IG51bGx9O1xuXG4gICAgICAgICAgICBsZXQgcGxhY2VkR2x5cGhCb3hlcyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgcGxhY2VkR2x5cGhDaXJjbGVzID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBwbGFjZWRJY29uQm94ZXMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHRleHRGZWF0dXJlSW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IHZlcnRpY2FsVGV4dEZlYXR1cmVJbmRleCA9IDA7XG4gICAgICAgICAgICBsZXQgaWNvbkZlYXR1cmVJbmRleCA9IDA7XG5cbiAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMudGV4dEZlYXR1cmVJbmRleCkge1xuICAgICAgICAgICAgICAgIHRleHRGZWF0dXJlSW5kZXggPSBjb2xsaXNpb25BcnJheXMudGV4dEZlYXR1cmVJbmRleDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ltYm9sSW5zdGFuY2UudXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMpIHtcbiAgICAgICAgICAgICAgICB0ZXh0RmVhdHVyZUluZGV4ID0gc3ltYm9sSW5zdGFuY2UuZmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXggPSBjb2xsaXNpb25BcnJheXMudmVydGljYWxUZXh0RmVhdHVyZUluZGV4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVCb3hEYXRhID0gKGJveDogU2luZ2xlQ29sbGlzaW9uQm94KSA9PiB7XG4gICAgICAgICAgICAgICAgYm94LnRpbGVJRCA9IHRoaXMucmV0YWluZWRRdWVyeURhdGFbYnVja2V0LmJ1Y2tldEluc3RhbmNlSWRdLnRpbGVJRDtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudHJhbnNmb3JtLmVsZXZhdGlvbiAmJiAhYm94LmVsZXZhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGJveC5lbGV2YXRpb24gPSB0aGlzLnRyYW5zZm9ybS5lbGV2YXRpb24gPyB0aGlzLnRyYW5zZm9ybS5lbGV2YXRpb24uZ2V0QXRUaWxlT2Zmc2V0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldGFpbmVkUXVlcnlEYXRhW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXS50aWxlSUQsXG4gICAgICAgICAgICAgICAgICAgIGJveC50aWxlQW5jaG9yWCwgYm94LnRpbGVBbmNob3JZKSA6IDA7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCB0ZXh0Qm94ID0gY29sbGlzaW9uQXJyYXlzLnRleHRCb3g7XG4gICAgICAgICAgICBpZiAodGV4dEJveCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUJveERhdGEodGV4dEJveCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlUHJldmlvdXNPcmllbnRhdGlvbklmTm90UGxhY2VkID0gKGlzUGxhY2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2aW91c09yaWVudGF0aW9uID0gV3JpdGluZ01vZGUuaG9yaXpvbnRhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmICFpc1BsYWNlZCAmJiB0aGlzLnByZXZQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZQbGFjZWRPcmllbnRhdGlvbiA9IHRoaXMucHJldlBsYWNlbWVudC5wbGFjZWRPcmllbnRhdGlvbnNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZQbGFjZWRPcmllbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VkT3JpZW50YXRpb25zW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IHByZXZQbGFjZWRPcmllbnRhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c09yaWVudGF0aW9uID0gcHJldlBsYWNlZE9yaWVudGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFya1VzZWRPcmllbnRhdGlvbihidWNrZXQsIHByZXZpb3VzT3JpZW50YXRpb24sIHN5bWJvbEluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNPcmllbnRhdGlvbjtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VUZXh0Rm9yUGxhY2VtZW50TW9kZXMgPSAocGxhY2VIb3Jpem9udGFsRm4sIHBsYWNlVmVydGljYWxGbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgc3ltYm9sSW5zdGFuY2UubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID4gMCAmJiBjb2xsaXNpb25BcnJheXMudmVydGljYWxUZXh0Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBsYWNlbWVudE1vZGUgb2YgYnVja2V0LndyaXRpbmdNb2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZW1lbnRNb2RlID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWQgPSBwbGFjZVZlcnRpY2FsRm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VkVmVydGljYWxUZXh0ID0gcGxhY2VkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlZCA9IHBsYWNlSG9yaXpvbnRhbEZuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWQgJiYgcGxhY2VkLmJveCAmJiBwbGFjZWQuYm94Lmxlbmd0aCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWQgPSBwbGFjZUhvcml6b250YWxGbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICghbGF5b3V0LmdldCgndGV4dC12YXJpYWJsZS1hbmNob3InKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZUJveCA9IChjb2xsaXNpb25UZXh0Qm94LCBvcmllbnRhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFNjYWxlID0gYnVja2V0LmdldFN5bWJvbEluc3RhbmNlVGV4dFNpemUocGFydGlhbGx5RXZhbHVhdGVkVGV4dFNpemUsIHN5bWJvbEluc3RhbmNlLCB0aGlzLnRyYW5zZm9ybS56b29tLCBzeW1ib2xJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWRGZWF0dXJlID0gdGhpcy5jb2xsaXNpb25JbmRleC5wbGFjZUNvbGxpc2lvbkJveChidWNrZXQsIHRleHRTY2FsZSwgY29sbGlzaW9uVGV4dEJveCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUG9pbnQoMCwgMCksIHRleHRBbGxvd092ZXJsYXAsIHRleHRQaXhlbFJhdGlvLCBwb3NNYXRyaXgsIGNvbGxpc2lvbkdyb3VwLnByZWRpY2F0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VkRmVhdHVyZSAmJiBwbGFjZWRGZWF0dXJlLmJveCAmJiBwbGFjZWRGZWF0dXJlLmJveC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkT3JpZW50YXRpb24oYnVja2V0LCBvcmllbnRhdGlvbiwgc3ltYm9sSW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VkT3JpZW50YXRpb25zW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSA9IG9yaWVudGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlZEZlYXR1cmU7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VIb3Jpem9udGFsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlQm94KHRleHRCb3gsIFdyaXRpbmdNb2RlLmhvcml6b250YWwpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlVmVydGljYWwgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbFRleHRCb3ggPSBjb2xsaXNpb25BcnJheXMudmVydGljYWxUZXh0Qm94O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmIHN5bWJvbEluc3RhbmNlLm51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcyA+IDAgJiYgdmVydGljYWxUZXh0Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQm94RGF0YSh2ZXJ0aWNhbFRleHRCb3gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGFjZUJveCh2ZXJ0aWNhbFRleHRCb3gsIFdyaXRpbmdNb2RlLnZlcnRpY2FsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Ym94OiBudWxsLCBvZmZzY3JlZW46IG51bGwsIG9jY2x1ZGVkOiBudWxsfTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBwbGFjZVRleHRGb3JQbGFjZW1lbnRNb2RlcyhwbGFjZUhvcml6b250YWwsIHBsYWNlVmVydGljYWwpO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcmV2aW91c09yaWVudGF0aW9uSWZOb3RQbGFjZWQocGxhY2VkICYmIHBsYWNlZC5ib3ggJiYgcGxhY2VkLmJveC5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuY2hvcnMgPSBsYXlvdXQuZ2V0KCd0ZXh0LXZhcmlhYmxlLWFuY2hvcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgc3ltYm9sIHdhcyBpbiB0aGUgbGFzdCBwbGFjZW1lbnQsIHNoaWZ0IHRoZSBwcmV2aW91c2x5IHVzZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5jaG9yIHRvIHRoZSBmcm9udCBvZiB0aGUgYW5jaG9yIGxpc3QsIG9ubHkgaWYgdGhlIHByZXZpb3VzIGFuY2hvclxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBzdGlsbCBpbiB0aGUgYW5jaG9yIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldlBsYWNlbWVudCAmJiB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldk9mZnNldHMgPSB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNob3JzLmluZGV4T2YocHJldk9mZnNldHMuYW5jaG9yKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzID0gYW5jaG9ycy5maWx0ZXIoYW5jaG9yID0+IGFuY2hvciAhPT0gcHJldk9mZnNldHMuYW5jaG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JzLnVuc2hpZnQocHJldk9mZnNldHMuYW5jaG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlQm94Rm9yVmFyaWFibGVBbmNob3JzID0gKGNvbGxpc2lvblRleHRCb3gsIGNvbGxpc2lvbkljb25Cb3gsIG9yaWVudGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0U2NhbGUgPSBidWNrZXQuZ2V0U3ltYm9sSW5zdGFuY2VUZXh0U2l6ZShwYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZSwgc3ltYm9sSW5zdGFuY2UsIHRoaXMudHJhbnNmb3JtLnpvb20sIHN5bWJvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gKGNvbGxpc2lvblRleHRCb3gueDIgLSBjb2xsaXNpb25UZXh0Qm94LngxKSAqIHRleHRTY2FsZSArIDIuMCAqIGNvbGxpc2lvblRleHRCb3gucGFkZGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IChjb2xsaXNpb25UZXh0Qm94LnkyIC0gY29sbGlzaW9uVGV4dEJveC55MSkgKiB0ZXh0U2NhbGUgKyAyLjAgKiBjb2xsaXNpb25UZXh0Qm94LnBhZGRpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlSWNvbkJveCA9IGhhc0ljb25UZXh0Rml0ICYmICFpY29uQWxsb3dPdmVybGFwID8gY29sbGlzaW9uSWNvbkJveCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVJY29uQm94KSB1cGRhdGVCb3hEYXRhKHZhcmlhYmxlSWNvbkJveCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwbGFjZWRCb3g6ID97IGJveDogQXJyYXk8bnVtYmVyPiwgb2Zmc2NyZWVuOiBib29sZWFuLCBvY2NsdWRlZDogYm9vbGVhbiB9ID0ge2JveDogW10sIG9mZnNjcmVlbjogZmFsc2UsIG9jY2x1ZGVkOiBmYWxzZX07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZW1lbnRBdHRlbXB0cyA9IHRleHRBbGxvd092ZXJsYXAgPyBhbmNob3JzLmxlbmd0aCAqIDIgOiBhbmNob3JzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2VtZW50QXR0ZW1wdHM7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGFuY2hvcnNbaSAlIGFuY2hvcnMubGVuZ3RoXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvd092ZXJsYXAgPSAoaSA+PSBhbmNob3JzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hdHRlbXB0QW5jaG9yUGxhY2VtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3IsIGNvbGxpc2lvblRleHRCb3gsIHdpZHRoLCBoZWlnaHQsIHRleHRTY2FsZSwgcm90YXRlV2l0aE1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hXaXRoTWFwLCB0ZXh0UGl4ZWxSYXRpbywgcG9zTWF0cml4LCBjb2xsaXNpb25Hcm91cCwgYWxsb3dPdmVybGFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJbnN0YW5jZSwgc3ltYm9sSW5kZXgsIGJ1Y2tldCwgb3JpZW50YXRpb24sIHZhcmlhYmxlSWNvbkJveCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbGx5RXZhbHVhdGVkVGV4dFNpemUsIHBhcnRpYWxseUV2YWx1YXRlZEljb25TaXplKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VkQm94ID0gcmVzdWx0LnBsYWNlZEdseXBoQm94ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZWRCb3ggJiYgcGxhY2VkQm94LmJveCAmJiBwbGFjZWRCb3guYm94Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VUZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gcmVzdWx0LnNoaWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGFjZWRCb3g7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VIb3Jpem9udGFsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYWNlQm94Rm9yVmFyaWFibGVBbmNob3JzKHRleHRCb3gsIGNvbGxpc2lvbkFycmF5cy5pY29uQm94LCBXcml0aW5nTW9kZS5ob3Jpem9udGFsKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZVZlcnRpY2FsID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxUZXh0Qm94ID0gY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEJveDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJ0aWNhbFRleHRCb3gpIHVwZGF0ZUJveERhdGEodmVydGljYWxUZXh0Qm94KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhc1BsYWNlZCA9IHBsYWNlZCAmJiBwbGFjZWQuYm94ICYmIHBsYWNlZC5ib3gubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmICF3YXNQbGFjZWQgJiYgc3ltYm9sSW5zdGFuY2UubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID4gMCAmJiB2ZXJ0aWNhbFRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2VCb3hGb3JWYXJpYWJsZUFuY2hvcnModmVydGljYWxUZXh0Qm94LCBjb2xsaXNpb25BcnJheXMudmVydGljYWxJY29uQm94LCBXcml0aW5nTW9kZS52ZXJ0aWNhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2JveDogbnVsbCwgb2Zmc2NyZWVuOiBudWxsLCBvY2NsdWRlZDogbnVsbH07XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgcGxhY2VUZXh0Rm9yUGxhY2VtZW50TW9kZXMocGxhY2VIb3Jpem9udGFsLCBwbGFjZVZlcnRpY2FsKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGxhY2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZVRleHQgPSBwbGFjZWQuYm94O1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuID0gcGxhY2VkLm9mZnNjcmVlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPY2NsdWRlZCA9IHBsYWNlZC5vY2NsdWRlZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZPcmllbnRhdGlvbiA9IHVwZGF0ZVByZXZpb3VzT3JpZW50YXRpb25JZk5vdFBsYWNlZChwbGFjZWQgJiYgcGxhY2VkLmJveCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGdldCBwbGFjZWQsIHdlIHN0aWxsIG5lZWQgdG8gY29weSBvdXIgcG9zaXRpb24gZnJvbSB0aGUgbGFzdCBwbGFjZW1lbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIGZhZGUgYW5pbWF0aW9uc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYWNlVGV4dCAmJiB0aGlzLnByZXZQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZPZmZzZXQgPSB0aGlzLnByZXZQbGFjZW1lbnQudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2T2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YXJpYWJsZU9mZnNldHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gcHJldk9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkSnVzdGlmaWNhdGlvbihidWNrZXQsIHByZXZPZmZzZXQuYW5jaG9yLCBzeW1ib2xJbnN0YW5jZSwgcHJldk9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwbGFjZWRHbHlwaEJveGVzID0gcGxhY2VkO1xuXG4gICAgICAgICAgICBwbGFjZVRleHQgPSBwbGFjZWRHbHlwaEJveGVzICYmIHBsYWNlZEdseXBoQm94ZXMuYm94ICYmIHBsYWNlZEdseXBoQm94ZXMuYm94Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBvZmZzY3JlZW4gPSBwbGFjZWRHbHlwaEJveGVzICYmIHBsYWNlZEdseXBoQm94ZXMub2Zmc2NyZWVuO1xuICAgICAgICAgICAgdGV4dE9jY2x1ZGVkID0gcGxhY2VkR2x5cGhCb3hlcyAmJiBwbGFjZWRHbHlwaEJveGVzLm9jY2x1ZGVkO1xuXG4gICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UudXNlUnVudGltZUNvbGxpc2lvbkNpcmNsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWRTeW1ib2xJbmRleCA9IHN5bWJvbEluc3RhbmNlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCA+PSAwID8gc3ltYm9sSW5zdGFuY2UuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4IDogc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXg7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VkU3ltYm9sID0gYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KHBsYWNlZFN5bWJvbEluZGV4KTtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250U2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZShidWNrZXQudGV4dFNpemVEYXRhLCBwYXJ0aWFsbHlFdmFsdWF0ZWRUZXh0U2l6ZSwgcGxhY2VkU3ltYm9sKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHRQaXhlbFBhZGRpbmcgPSBsYXlvdXQuZ2V0KCd0ZXh0LXBhZGRpbmcnKTtcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGNpcmNsZSBjb2xsaXNpb24gaGVpZ2h0IGludG8gcGl4ZWxzXG4gICAgICAgICAgICAgICAgY29uc3QgY2lyY2xlUGl4ZWxEaWFtZXRlciA9IHN5bWJvbEluc3RhbmNlLmNvbGxpc2lvbkNpcmNsZURpYW1ldGVyICogZm9udFNpemUgLyBPTkVfRU07XG5cbiAgICAgICAgICAgICAgICBwbGFjZWRHbHlwaENpcmNsZXMgPSB0aGlzLmNvbGxpc2lvbkluZGV4LnBsYWNlQ29sbGlzaW9uQ2lyY2xlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRBbGxvd092ZXJsYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWRTeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQubGluZVZlcnRleEFycmF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmdseXBoT2Zmc2V0QXJyYXksXG4gICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc01hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRMYWJlbFBsYW5lTWF0cml4LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxUb1NjcmVlbk1hdHJpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDb2xsaXNpb25Cb3hlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpdGNoV2l0aE1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkdyb3VwLnByZWRpY2F0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZVBpeGVsRGlhbWV0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0UGl4ZWxQYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXRhaW5lZFF1ZXJ5RGF0YVtidWNrZXQuYnVja2V0SW5zdGFuY2VJZF0udGlsZUlEKTtcblxuICAgICAgICAgICAgICAgIGFzc2VydCghcGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXMubGVuZ3RoIHx8ICghcGxhY2VkR2x5cGhDaXJjbGVzLmNvbGxpc2lvbkRldGVjdGVkIHx8IHNob3dDb2xsaXNpb25Cb3hlcykpO1xuICAgICAgICAgICAgICAgIC8vIElmIHRleHQtYWxsb3ctb3ZlcmxhcCBpcyBzZXQsIGZvcmNlIFwicGxhY2VkQ2lyY2xlc1wiIHRvIHRydWVcbiAgICAgICAgICAgICAgICAvLyBJbiB0aGVvcnkgdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhdCBsZWFzdCBvbmUgY2lyY2xlIHBsYWNlZFxuICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSwgYnV0IGZvciBub3cgcXVpcmtzIGluIHRleHQtYW5jaG9yXG4gICAgICAgICAgICAgICAgLy8gYW5kIHRleHQtb2Zmc2V0IG1heSBwcmV2ZW50IHRoYXQgZnJvbSBiZWluZyB0cnVlLlxuICAgICAgICAgICAgICAgIHBsYWNlVGV4dCA9IHRleHRBbGxvd092ZXJsYXAgfHwgKHBsYWNlZEdseXBoQ2lyY2xlcy5jaXJjbGVzLmxlbmd0aCA+IDAgJiYgIXBsYWNlZEdseXBoQ2lyY2xlcy5jb2xsaXNpb25EZXRlY3RlZCk7XG4gICAgICAgICAgICAgICAgb2Zmc2NyZWVuID0gb2Zmc2NyZWVuICYmIHBsYWNlZEdseXBoQ2lyY2xlcy5vZmZzY3JlZW47XG4gICAgICAgICAgICAgICAgdGV4dE9jY2x1ZGVkID0gcGxhY2VkR2x5cGhDaXJjbGVzLm9jY2x1ZGVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLmljb25GZWF0dXJlSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpY29uRmVhdHVyZUluZGV4ID0gY29sbGlzaW9uQXJyYXlzLmljb25GZWF0dXJlSW5kZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMuaWNvbkJveCkge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VJY29uRmVhdHVyZSA9IGljb25Cb3ggPT4ge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVCb3hEYXRhKGljb25Cb3gpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGlmdFBvaW50OiBQb2ludCA9IGhhc0ljb25UZXh0Rml0ICYmIHNoaWZ0ID9cbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFNoaWZ0KHNoaWZ0LngsIHNoaWZ0LnksIHJvdGF0ZVdpdGhNYXAsIHBpdGNoV2l0aE1hcCwgdGhpcy50cmFuc2Zvcm0uYW5nbGUpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQb2ludCgwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWNvblNjYWxlID0gYnVja2V0LmdldFN5bWJvbEluc3RhbmNlSWNvblNpemUocGFydGlhbGx5RXZhbHVhdGVkSWNvblNpemUsIHRoaXMudHJhbnNmb3JtLnpvb20sIHN5bWJvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sbGlzaW9uSW5kZXgucGxhY2VDb2xsaXNpb25Cb3goYnVja2V0LCBpY29uU2NhbGUsIGljb25Cb3gsIHNoaWZ0UG9pbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQWxsb3dPdmVybGFwLCB0ZXh0UGl4ZWxSYXRpbywgcG9zTWF0cml4LCBjb2xsaXNpb25Hcm91cC5wcmVkaWNhdGUpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAocGxhY2VkVmVydGljYWxUZXh0ICYmIHBsYWNlZFZlcnRpY2FsVGV4dC5ib3ggJiYgcGxhY2VkVmVydGljYWxUZXh0LmJveC5sZW5ndGggJiYgY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsSWNvbkJveCkge1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWRJY29uQm94ZXMgPSBwbGFjZUljb25GZWF0dXJlKGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbEljb25Cb3gpO1xuICAgICAgICAgICAgICAgICAgICBwbGFjZUljb24gPSBwbGFjZWRJY29uQm94ZXMuYm94Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VkSWNvbkJveGVzID0gcGxhY2VJY29uRmVhdHVyZShjb2xsaXNpb25BcnJheXMuaWNvbkJveCk7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlSWNvbiA9IHBsYWNlZEljb25Cb3hlcy5ib3gubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2NyZWVuID0gb2Zmc2NyZWVuICYmIHBsYWNlZEljb25Cb3hlcy5vZmZzY3JlZW47XG4gICAgICAgICAgICAgICAgaWNvbk9jY2x1ZGVkID0gcGxhY2VkSWNvbkJveGVzLm9jY2x1ZGVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpY29uV2l0aG91dFRleHQgPSB0ZXh0T3B0aW9uYWwgfHxcbiAgICAgICAgICAgICAgICAoc3ltYm9sSW5zdGFuY2UubnVtSG9yaXpvbnRhbEdseXBoVmVydGljZXMgPT09IDAgJiYgc3ltYm9sSW5zdGFuY2UubnVtVmVydGljYWxHbHlwaFZlcnRpY2VzID09PSAwKTtcbiAgICAgICAgICAgIGNvbnN0IHRleHRXaXRob3V0SWNvbiA9IGljb25PcHRpb25hbCB8fCBzeW1ib2xJbnN0YW5jZS5udW1JY29uVmVydGljZXMgPT09IDA7XG5cbiAgICAgICAgICAgIC8vIENvbWJpbmUgdGhlIHNjYWxlcyBmb3IgaWNvbnMgYW5kIHRleHQuXG4gICAgICAgICAgICBpZiAoIWljb25XaXRob3V0VGV4dCAmJiAhdGV4dFdpdGhvdXRJY29uKSB7XG4gICAgICAgICAgICAgICAgcGxhY2VJY29uID0gcGxhY2VUZXh0ID0gcGxhY2VJY29uICYmIHBsYWNlVGV4dDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRleHRXaXRob3V0SWNvbikge1xuICAgICAgICAgICAgICAgIHBsYWNlVGV4dCA9IHBsYWNlSWNvbiAmJiBwbGFjZVRleHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpY29uV2l0aG91dFRleHQpIHtcbiAgICAgICAgICAgICAgICBwbGFjZUljb24gPSBwbGFjZUljb24gJiYgcGxhY2VUZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGxhY2VUZXh0ICYmIHBsYWNlZEdseXBoQm94ZXMgJiYgcGxhY2VkR2x5cGhCb3hlcy5ib3gpIHtcbiAgICAgICAgICAgICAgICBpZiAocGxhY2VkVmVydGljYWxUZXh0ICYmIHBsYWNlZFZlcnRpY2FsVGV4dC5ib3ggJiYgdmVydGljYWxUZXh0RmVhdHVyZUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGlzaW9uSW5kZXguaW5zZXJ0Q29sbGlzaW9uQm94KHBsYWNlZEdseXBoQm94ZXMuYm94LCBsYXlvdXQuZ2V0KCd0ZXh0LWlnbm9yZS1wbGFjZW1lbnQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkLCB2ZXJ0aWNhbFRleHRGZWF0dXJlSW5kZXgsIGNvbGxpc2lvbkdyb3VwLklEKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkJveChwbGFjZWRHbHlwaEJveGVzLmJveCwgbGF5b3V0LmdldCgndGV4dC1pZ25vcmUtcGxhY2VtZW50JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCwgdGV4dEZlYXR1cmVJbmRleCwgY29sbGlzaW9uR3JvdXAuSUQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBsYWNlSWNvbiAmJiBwbGFjZWRJY29uQm94ZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkJveChwbGFjZWRJY29uQm94ZXMuYm94LCBsYXlvdXQuZ2V0KCdpY29uLWlnbm9yZS1wbGFjZW1lbnQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkLCBpY29uRmVhdHVyZUluZGV4LCBjb2xsaXNpb25Hcm91cC5JRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGxhY2VkR2x5cGhDaXJjbGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBsYWNlVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxpc2lvbkluZGV4Lmluc2VydENvbGxpc2lvbkNpcmNsZXMocGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXMsIGxheW91dC5nZXQoJ3RleHQtaWdub3JlLXBsYWNlbWVudCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LmJ1Y2tldEluc3RhbmNlSWQsIHRleHRGZWF0dXJlSW5kZXgsIGNvbGxpc2lvbkdyb3VwLklEKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2hvd0NvbGxpc2lvbkJveGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gYnVja2V0LmJ1Y2tldEluc3RhbmNlSWQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaXJjbGVBcnJheSA9IHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW2lkXTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBHcm91cCBjb2xsaXNpb24gY2lyY2xlcyB0b2dldGhlciBieSBidWNrZXQuIENpcmNsZXMgY2FuJ3QgYmUgcHVzaGVkIGZvcndhcmQgZm9yIHJlbmRlcmluZyB5ZXQgYXMgdGhlIHN5bWJvbCBwbGFjZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGEgYnVja2V0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbXBsZXRlIGJlZm9yZSB0aGUgY29tbWl0LWZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoY2lyY2xlQXJyYXkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZUFycmF5ID0gdGhpcy5jb2xsaXNpb25DaXJjbGVBcnJheXNbaWRdID0gbmV3IENvbGxpc2lvbkNpcmNsZUFycmF5KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGFjZWRHbHlwaENpcmNsZXMuY2lyY2xlcy5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlQXJyYXkuY2lyY2xlcy5wdXNoKHBsYWNlZEdseXBoQ2lyY2xlcy5jaXJjbGVzW2kgKyAwXSk7ICAgICAgICAgICAgICAvLyB4XG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVBcnJheS5jaXJjbGVzLnB1c2gocGxhY2VkR2x5cGhDaXJjbGVzLmNpcmNsZXNbaSArIDFdKTsgICAgICAgICAgICAgIC8vIHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNsZUFycmF5LmNpcmNsZXMucHVzaChwbGFjZWRHbHlwaENpcmNsZXMuY2lyY2xlc1tpICsgMl0pOyAgICAgICAgICAgICAgLy8gcmFkaXVzXG4gICAgICAgICAgICAgICAgICAgICAgICBjaXJjbGVBcnJheS5jaXJjbGVzLnB1c2gocGxhY2VkR2x5cGhDaXJjbGVzLmNvbGxpc2lvbkRldGVjdGVkID8gMSA6IDApOyAgIC8vIGNvbGxpc2lvbkRldGVjdGVkLWZsYWdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXNzZXJ0KHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEICE9PSAwKTtcbiAgICAgICAgICAgIGFzc2VydChidWNrZXQuYnVja2V0SW5zdGFuY2VJZCAhPT0gMCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5vdEdsb2JlID0gYnVja2V0LnByb2plY3Rpb24ubmFtZSAhPT0gJ2dsb2JlJztcbiAgICAgICAgICAgIGFsd2F5c1Nob3dUZXh0ID0gYWx3YXlzU2hvd1RleHQgJiYgKG5vdEdsb2JlIHx8ICF0ZXh0T2NjbHVkZWQpO1xuICAgICAgICAgICAgYWx3YXlzU2hvd0ljb24gPSBhbHdheXNTaG93SWNvbiAmJiAobm90R2xvYmUgfHwgIWljb25PY2NsdWRlZCk7XG5cbiAgICAgICAgICAgIHRoaXMucGxhY2VtZW50c1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSBuZXcgSm9pbnRQbGFjZW1lbnQocGxhY2VUZXh0IHx8IGFsd2F5c1Nob3dUZXh0LCBwbGFjZUljb24gfHwgYWx3YXlzU2hvd0ljb24sIG9mZnNjcmVlbiB8fCBidWNrZXQuanVzdFJlbG9hZGVkKTtcbiAgICAgICAgICAgIHNlZW5Dcm9zc1RpbGVJRHNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdID0gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoek9yZGVyQnlWaWV3cG9ydFkpIHtcbiAgICAgICAgICAgIGFzc2VydChidWNrZXRQYXJ0LnN5bWJvbEluc3RhbmNlU3RhcnQgPT09IDApO1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5kZXhlcyA9IGJ1Y2tldC5nZXRTb3J0ZWRTeW1ib2xJbmRleGVzKHRoaXMudHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzeW1ib2xJbmRleGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5kZXggPSBzeW1ib2xJbmRleGVzW2ldO1xuICAgICAgICAgICAgICAgIHBsYWNlU3ltYm9sKGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMuZ2V0KHN5bWJvbEluZGV4KSwgc3ltYm9sSW5kZXgsIGJ1Y2tldC5jb2xsaXNpb25BcnJheXNbc3ltYm9sSW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBidWNrZXRQYXJ0LnN5bWJvbEluc3RhbmNlU3RhcnQ7IGkgPCBidWNrZXRQYXJ0LnN5bWJvbEluc3RhbmNlRW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwbGFjZVN5bWJvbChidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmdldChpKSwgaSwgYnVja2V0LmNvbGxpc2lvbkFycmF5c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hvd0NvbGxpc2lvbkJveGVzICYmIGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkIGluIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzKSB7XG4gICAgICAgICAgICBjb25zdCBjaXJjbGVBcnJheSA9IHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXTtcblxuICAgICAgICAgICAgLy8gU3RvcmUgdmlld3BvcnQgYW5kIGludmVyc2UgcHJvamVjdGlvbiBtYXRyaWNlcyBwZXIgYnVja2V0XG4gICAgICAgICAgICBtYXQ0LmludmVydChjaXJjbGVBcnJheS5pbnZQcm9qTWF0cml4LCBwb3NNYXRyaXgpO1xuICAgICAgICAgICAgY2lyY2xlQXJyYXkudmlld3BvcnRNYXRyaXggPSB0aGlzLmNvbGxpc2lvbkluZGV4LmdldFZpZXdwb3J0TWF0cml4KCk7XG4gICAgICAgIH1cblxuICAgICAgICBidWNrZXQuanVzdFJlbG9hZGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgbWFya1VzZWRKdXN0aWZpY2F0aW9uKGJ1Y2tldDogU3ltYm9sQnVja2V0LCBwbGFjZWRBbmNob3I6IFRleHRBbmNob3IsIHN5bWJvbEluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSwgb3JpZW50YXRpb246IG51bWJlcikge1xuICAgICAgICBjb25zdCBqdXN0aWZpY2F0aW9ucyA9IHtcbiAgICAgICAgICAgIFwibGVmdFwiOiBzeW1ib2xJbnN0YW5jZS5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgXCJjZW50ZXJcIjogc3ltYm9sSW5zdGFuY2UuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgXCJyaWdodFwiOiBzeW1ib2xJbnN0YW5jZS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBhdXRvSW5kZXg7XG4gICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUudmVydGljYWwpIHtcbiAgICAgICAgICAgIGF1dG9JbmRleCA9IHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXV0b0luZGV4ID0ganVzdGlmaWNhdGlvbnNbZ2V0QW5jaG9ySnVzdGlmaWNhdGlvbihwbGFjZWRBbmNob3IpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ZXMgPSBbXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5sZWZ0SnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY2VudGVySnVzdGlmaWVkVGV4dFN5bWJvbEluZGV4LFxuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleFxuICAgICAgICBdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5kZXhlcykge1xuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoYXV0b0luZGV4ID49IDAgJiYgaW5kZXggIT09IGF1dG9JbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbXVsdGlwbGUganVzdGlmaWNhdGlvbnMgYW5kIHRoaXMgb25lIGlzbid0IGl0OiBzaGlmdCBvZmZzY3JlZW5cbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LnRleHQucGxhY2VkU3ltYm9sQXJyYXkuZ2V0KGluZGV4KS5jcm9zc1RpbGVJRCA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGNob3NlbiBqdXN0aWZpY2F0aW9uIG9yIHRoZSBqdXN0aWZpY2F0aW9uIGlzIGhhcmR3aXJlZDogdXNlIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChpbmRleCkuY3Jvc3NUaWxlSUQgPSBzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtYXJrVXNlZE9yaWVudGF0aW9uKGJ1Y2tldDogU3ltYm9sQnVja2V0LCBvcmllbnRhdGlvbjogbnVtYmVyLCBzeW1ib2xJbnN0YW5jZTogU3ltYm9sSW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbCA9IChvcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUuaG9yaXpvbnRhbCB8fCBvcmllbnRhdGlvbiA9PT0gV3JpdGluZ01vZGUuaG9yaXpvbnRhbE9ubHkpID8gb3JpZW50YXRpb24gOiAwO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9IG9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCA/IG9yaWVudGF0aW9uIDogMDtcblxuICAgICAgICBjb25zdCBob3Jpem9udGFsSW5kZXhlcyA9IFtcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmxlZnRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5jZW50ZXJKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICBzeW1ib2xJbnN0YW5jZS5yaWdodEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFxuICAgICAgICBdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgaG9yaXpvbnRhbEluZGV4ZXMpIHtcbiAgICAgICAgICAgIGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChpbmRleCkucGxhY2VkT3JpZW50YXRpb24gPSBob3Jpem9udGFsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLnZlcnRpY2FsUGxhY2VkVGV4dFN5bWJvbEluZGV4KSB7XG4gICAgICAgICAgICBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRUZXh0U3ltYm9sSW5kZXgpLnBsYWNlZE9yaWVudGF0aW9uID0gdmVydGljYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21taXQobm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb21taXRUaW1lID0gbm93O1xuICAgICAgICB0aGlzLnpvb21BdExhc3RSZWNlbmN5Q2hlY2sgPSB0aGlzLnRyYW5zZm9ybS56b29tO1xuXG4gICAgICAgIGNvbnN0IHByZXZQbGFjZW1lbnQgPSB0aGlzLnByZXZQbGFjZW1lbnQ7XG4gICAgICAgIGxldCBwbGFjZW1lbnRDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5wcmV2Wm9vbUFkanVzdG1lbnQgPSBwcmV2UGxhY2VtZW50ID8gcHJldlBsYWNlbWVudC56b29tQWRqdXN0bWVudCh0aGlzLnRyYW5zZm9ybS56b29tKSA6IDA7XG4gICAgICAgIGNvbnN0IGluY3JlbWVudCA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50LnN5bWJvbEZhZGVDaGFuZ2Uobm93KSA6IDE7XG5cbiAgICAgICAgY29uc3QgcHJldk9wYWNpdGllcyA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50Lm9wYWNpdGllcyA6IHt9O1xuICAgICAgICBjb25zdCBwcmV2T2Zmc2V0cyA9IHByZXZQbGFjZW1lbnQgPyBwcmV2UGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0cyA6IHt9O1xuICAgICAgICBjb25zdCBwcmV2T3JpZW50YXRpb25zID0gcHJldlBsYWNlbWVudCA/IHByZXZQbGFjZW1lbnQucGxhY2VkT3JpZW50YXRpb25zIDoge307XG5cbiAgICAgICAgLy8gYWRkIHRoZSBvcGFjaXRpZXMgZnJvbSB0aGUgY3VycmVudCBwbGFjZW1lbnQsIGFuZCBjb3B5IHRoZWlyIGN1cnJlbnQgdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIHBsYWNlbWVudFxuICAgICAgICBmb3IgKGNvbnN0IGNyb3NzVGlsZUlEIGluIHRoaXMucGxhY2VtZW50cykge1xuICAgICAgICAgICAgY29uc3Qgam9pbnRQbGFjZW1lbnQgPSB0aGlzLnBsYWNlbWVudHNbY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgY29uc3QgcHJldk9wYWNpdHkgPSBwcmV2T3BhY2l0aWVzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGlmIChwcmV2T3BhY2l0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSA9IG5ldyBKb2ludE9wYWNpdHlTdGF0ZShwcmV2T3BhY2l0eSwgaW5jcmVtZW50LCBqb2ludFBsYWNlbWVudC50ZXh0LCBqb2ludFBsYWNlbWVudC5pY29uLCBudWxsLCBqb2ludFBsYWNlbWVudC5jbGlwcGVkKTtcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRDaGFuZ2VkID0gcGxhY2VtZW50Q2hhbmdlZCB8fFxuICAgICAgICAgICAgICAgICAgICBqb2ludFBsYWNlbWVudC50ZXh0ICE9PSBwcmV2T3BhY2l0eS50ZXh0LnBsYWNlZCB8fFxuICAgICAgICAgICAgICAgICAgICBqb2ludFBsYWNlbWVudC5pY29uICE9PSBwcmV2T3BhY2l0eS5pY29uLnBsYWNlZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdID0gbmV3IEpvaW50T3BhY2l0eVN0YXRlKG51bGwsIGluY3JlbWVudCwgam9pbnRQbGFjZW1lbnQudGV4dCwgam9pbnRQbGFjZW1lbnQuaWNvbiwgam9pbnRQbGFjZW1lbnQuc2tpcEZhZGUsIGpvaW50UGxhY2VtZW50LmNsaXBwZWQpO1xuICAgICAgICAgICAgICAgIHBsYWNlbWVudENoYW5nZWQgPSBwbGFjZW1lbnRDaGFuZ2VkIHx8IGpvaW50UGxhY2VtZW50LnRleHQgfHwgam9pbnRQbGFjZW1lbnQuaWNvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvcHkgYW5kIHVwZGF0ZSB2YWx1ZXMgZnJvbSB0aGUgcHJldmlvdXMgcGxhY2VtZW50IHRoYXQgYXJlbid0IGluIHRoZSBjdXJyZW50IHBsYWNlbWVudCBidXQgaGF2ZW4ndCBmaW5pc2hlZCBmYWRpbmdcbiAgICAgICAgZm9yIChjb25zdCBjcm9zc1RpbGVJRCBpbiBwcmV2T3BhY2l0aWVzKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2T3BhY2l0eSA9IHByZXZPcGFjaXRpZXNbY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqb2ludE9wYWNpdHkgPSBuZXcgSm9pbnRPcGFjaXR5U3RhdGUocHJldk9wYWNpdHksIGluY3JlbWVudCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWpvaW50T3BhY2l0eS5pc0hpZGRlbigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSA9IGpvaW50T3BhY2l0eTtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50Q2hhbmdlZCA9IHBsYWNlbWVudENoYW5nZWQgfHwgcHJldk9wYWNpdHkudGV4dC5wbGFjZWQgfHwgcHJldk9wYWNpdHkuaWNvbi5wbGFjZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY3Jvc3NUaWxlSUQgaW4gcHJldk9mZnNldHMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52YXJpYWJsZU9mZnNldHNbY3Jvc3NUaWxlSURdICYmIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSAmJiAhdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdLmlzSGlkZGVuKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhcmlhYmxlT2Zmc2V0c1tjcm9zc1RpbGVJRF0gPSBwcmV2T2Zmc2V0c1tjcm9zc1RpbGVJRF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNyb3NzVGlsZUlEIGluIHByZXZPcmllbnRhdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbY3Jvc3NUaWxlSURdICYmIHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXSAmJiAhdGhpcy5vcGFjaXRpZXNbY3Jvc3NUaWxlSURdLmlzSGlkZGVuKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlZE9yaWVudGF0aW9uc1tjcm9zc1RpbGVJRF0gPSBwcmV2T3JpZW50YXRpb25zW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgaXMgdGhlIHRpbWUgb2YgdGhlIGxhc3QgY29tbWl0KCkgdGhhdFxuICAgICAgICAvLyByZXN1bHRlZCBpbiBhIHBsYWNlbWVudCBjaGFuZ2UgLS0gaW4gb3RoZXIgd29yZHMsIHRoZSBzdGFydCB0aW1lIG9mXG4gICAgICAgIC8vIHRoZSBsYXN0IHN5bWJvbCBmYWRlIGFuaW1hdGlvblxuICAgICAgICBhc3NlcnQoIXByZXZQbGFjZW1lbnQgfHwgcHJldlBsYWNlbWVudC5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHBsYWNlbWVudENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgPSBub3c7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RQbGFjZW1lbnRDaGFuZ2VUaW1lID0gcHJldlBsYWNlbWVudCA/IHByZXZQbGFjZW1lbnQubGFzdFBsYWNlbWVudENoYW5nZVRpbWUgOiBub3c7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVMYXllck9wYWNpdGllcyhzdHlsZUxheWVyOiBTdHlsZUxheWVyLCB0aWxlczogQXJyYXk8VGlsZT4pIHtcbiAgICAgICAgY29uc3Qgc2VlbkNyb3NzVGlsZUlEcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHRpbGUgb2YgdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEJ1Y2tldCA9ICgodGlsZS5nZXRCdWNrZXQoc3R5bGVMYXllcik6IGFueSk6IFN5bWJvbEJ1Y2tldCk7XG4gICAgICAgICAgICBpZiAoc3ltYm9sQnVja2V0ICYmIHRpbGUubGF0ZXN0RmVhdHVyZUluZGV4ICYmIHN0eWxlTGF5ZXIuaWQgPT09IHN5bWJvbEJ1Y2tldC5sYXllcklkc1swXSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQnVja2V0T3BhY2l0aWVzKHN5bWJvbEJ1Y2tldCwgc2VlbkNyb3NzVGlsZUlEcywgdGlsZS5jb2xsaXNpb25Cb3hBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVCdWNrZXRPcGFjaXRpZXMoYnVja2V0OiBTeW1ib2xCdWNrZXQsIHNlZW5Dcm9zc1RpbGVJRHM6IHsgW3N0cmluZyB8IG51bWJlcl06IGJvb2xlYW4gfSwgY29sbGlzaW9uQm94QXJyYXk6ID9Db2xsaXNpb25Cb3hBcnJheSkge1xuICAgICAgICBpZiAoYnVja2V0Lmhhc1RleHREYXRhKCkpIGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhBcnJheS5jbGVhcigpO1xuICAgICAgICBpZiAoYnVja2V0Lmhhc0ljb25EYXRhKCkpIGJ1Y2tldC5pY29uLm9wYWNpdHlWZXJ0ZXhBcnJheS5jbGVhcigpO1xuICAgICAgICBpZiAoYnVja2V0Lmhhc0ljb25Db2xsaXNpb25Cb3hEYXRhKCkpIGJ1Y2tldC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LmNsZWFyKCk7XG4gICAgICAgIGlmIChidWNrZXQuaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSkgYnVja2V0LnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXkuY2xlYXIoKTtcblxuICAgICAgICBjb25zdCBsYXlvdXQgPSBidWNrZXQubGF5ZXJzWzBdLmxheW91dDtcbiAgICAgICAgY29uc3QgaGFzQ2xpcHBpbmcgPSAhIWJ1Y2tldC5sYXllcnNbMF0uZHluYW1pY0ZpbHRlcigpO1xuICAgICAgICBjb25zdCBkdXBsaWNhdGVPcGFjaXR5U3RhdGUgPSBuZXcgSm9pbnRPcGFjaXR5U3RhdGUobnVsbCwgMCwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgY29uc3QgdGV4dEFsbG93T3ZlcmxhcCA9IGxheW91dC5nZXQoJ3RleHQtYWxsb3ctb3ZlcmxhcCcpO1xuICAgICAgICBjb25zdCBpY29uQWxsb3dPdmVybGFwID0gbGF5b3V0LmdldCgnaWNvbi1hbGxvdy1vdmVybGFwJyk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlUGxhY2VtZW50ID0gbGF5b3V0LmdldCgndGV4dC12YXJpYWJsZS1hbmNob3InKTtcbiAgICAgICAgY29uc3Qgcm90YXRlV2l0aE1hcCA9IGxheW91dC5nZXQoJ3RleHQtcm90YXRpb24tYWxpZ25tZW50JykgPT09ICdtYXAnO1xuICAgICAgICBjb25zdCBwaXRjaFdpdGhNYXAgPSBsYXlvdXQuZ2V0KCd0ZXh0LXBpdGNoLWFsaWdubWVudCcpID09PSAnbWFwJztcbiAgICAgICAgY29uc3QgaGFzSWNvblRleHRGaXQgPSBsYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0JykgIT09ICdub25lJztcbiAgICAgICAgLy8gSWYgYWxsb3ctb3ZlcmxhcCBpcyB0cnVlLCB3ZSBjYW4gc2hvdyBzeW1ib2xzIGJlZm9yZSBwbGFjZW1lbnQgcnVucyBvbiB0aGVtXG4gICAgICAgIC8vIEJ1dCB3ZSBoYXZlIHRvIHdhaXQgZm9yIHBsYWNlbWVudCBpZiB3ZSBwb3RlbnRpYWxseSBkZXBlbmQgb24gYSBwYWlyZWQgaWNvbi90ZXh0XG4gICAgICAgIC8vIHdpdGggYWxsb3ctb3ZlcmxhcDogZmFsc2UuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvNzAzMlxuICAgICAgICBjb25zdCBkZWZhdWx0T3BhY2l0eVN0YXRlID0gbmV3IEpvaW50T3BhY2l0eVN0YXRlKG51bGwsIDAsXG4gICAgICAgICAgICAgICAgdGV4dEFsbG93T3ZlcmxhcCAmJiAoaWNvbkFsbG93T3ZlcmxhcCB8fCAhYnVja2V0Lmhhc0ljb25EYXRhKCkgfHwgbGF5b3V0LmdldCgnaWNvbi1vcHRpb25hbCcpKSxcbiAgICAgICAgICAgICAgICBpY29uQWxsb3dPdmVybGFwICYmICh0ZXh0QWxsb3dPdmVybGFwIHx8ICFidWNrZXQuaGFzVGV4dERhdGEoKSB8fCBsYXlvdXQuZ2V0KCd0ZXh0LW9wdGlvbmFsJykpLFxuICAgICAgICAgICAgICAgIHRydWUpO1xuXG4gICAgICAgIGlmICghYnVja2V0LmNvbGxpc2lvbkFycmF5cyAmJiBjb2xsaXNpb25Cb3hBcnJheSAmJiAoKGJ1Y2tldC5oYXNJY29uQ29sbGlzaW9uQm94RGF0YSgpIHx8IGJ1Y2tldC5oYXNUZXh0Q29sbGlzaW9uQm94RGF0YSgpKSkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5kZXNlcmlhbGl6ZUNvbGxpc2lvbkJveGVzKGNvbGxpc2lvbkJveEFycmF5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZE9wYWNpdGllcyA9IChpY29uT3JUZXh0LCBudW1WZXJ0aWNlczogbnVtYmVyLCBvcGFjaXR5OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmVydGljZXMgLyA0OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpY29uT3JUZXh0Lm9wYWNpdHlWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhvcGFjaXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgdmlzaWJsZUluc3RhbmNlQ291bnQgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgYnVja2V0LnN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmdldChzKTtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcyxcbiAgICAgICAgICAgICAgICBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMsXG4gICAgICAgICAgICAgICAgY3Jvc3NUaWxlSURcbiAgICAgICAgICAgIH0gPSBzeW1ib2xJbnN0YW5jZTtcblxuICAgICAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSBzZWVuQ3Jvc3NUaWxlSURzW2Nyb3NzVGlsZUlEXTtcblxuICAgICAgICAgICAgbGV0IG9wYWNpdHlTdGF0ZSA9IHRoaXMub3BhY2l0aWVzW2Nyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgIGlmIChpc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgIG9wYWNpdHlTdGF0ZSA9IGR1cGxpY2F0ZU9wYWNpdHlTdGF0ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9wYWNpdHlTdGF0ZSkge1xuICAgICAgICAgICAgICAgIG9wYWNpdHlTdGF0ZSA9IGRlZmF1bHRPcGFjaXR5U3RhdGU7XG4gICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIHN0YXRlIHNvIHRoYXQgZnV0dXJlIHBsYWNlbWVudHMgdXNlIGl0IGFzIGEgc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdGllc1tjcm9zc1RpbGVJRF0gPSBvcGFjaXR5U3RhdGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlZW5Dcm9zc1RpbGVJRHNbY3Jvc3NUaWxlSURdID0gdHJ1ZTtcblxuICAgICAgICAgICAgY29uc3QgaGFzVGV4dCA9IG51bUhvcml6b250YWxHbHlwaFZlcnRpY2VzID4gMCB8fCBudW1WZXJ0aWNhbEdseXBoVmVydGljZXMgPiAwO1xuICAgICAgICAgICAgY29uc3QgaGFzSWNvbiA9IHN5bWJvbEluc3RhbmNlLm51bUljb25WZXJ0aWNlcyA+IDA7XG5cbiAgICAgICAgICAgIGNvbnN0IHBsYWNlZE9yaWVudGF0aW9uID0gdGhpcy5wbGFjZWRPcmllbnRhdGlvbnNbc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbEhpZGRlbiA9IHBsYWNlZE9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbDtcbiAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsSGlkZGVuID0gcGxhY2VkT3JpZW50YXRpb24gPT09IFdyaXRpbmdNb2RlLmhvcml6b250YWwgfHwgcGxhY2VkT3JpZW50YXRpb24gPT09IFdyaXRpbmdNb2RlLmhvcml6b250YWxPbmx5O1xuICAgICAgICAgICAgaWYgKChoYXNUZXh0IHx8IGhhc0ljb24pICYmICFvcGFjaXR5U3RhdGUuaXNIaWRkZW4oKSkgdmlzaWJsZUluc3RhbmNlQ291bnQrKztcblxuICAgICAgICAgICAgaWYgKGhhc1RleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWNrZWRPcGFjaXR5ID0gcGFja09wYWNpdHkob3BhY2l0eVN0YXRlLnRleHQpO1xuICAgICAgICAgICAgICAgIC8vIFZlcnRpY2FsIHRleHQgZmFkZXMgaW4vb3V0IG9uIGNvbGxpc2lvbiB0aGUgc2FtZSB3YXkgYXMgY29ycmVzcG9uZGluZ1xuICAgICAgICAgICAgICAgIC8vIGhvcml6b250YWwgdGV4dC4gU3dpdGNoIGJldHdlZW4gdmVydGljYWwvaG9yaXpvbnRhbCBzaG91bGQgYmUgaW5zdGFudGFuZW91c1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxPcGFjaXR5ID0gaG9yaXpvbnRhbEhpZGRlbiA/IFBBQ0tFRF9ISURERU5fT1BBQ0lUWSA6IHBhY2tlZE9wYWNpdHk7XG4gICAgICAgICAgICAgICAgYWRkT3BhY2l0aWVzKGJ1Y2tldC50ZXh0LCBudW1Ib3Jpem9udGFsR2x5cGhWZXJ0aWNlcywgaG9yaXpvbnRhbE9wYWNpdHkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsT3BhY2l0eSA9IHZlcnRpY2FsSGlkZGVuID8gUEFDS0VEX0hJRERFTl9PUEFDSVRZIDogcGFja2VkT3BhY2l0eTtcbiAgICAgICAgICAgICAgICBhZGRPcGFjaXRpZXMoYnVja2V0LnRleHQsIG51bVZlcnRpY2FsR2x5cGhWZXJ0aWNlcywgdmVydGljYWxPcGFjaXR5KTtcblxuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgbGFiZWwgaXMgY29tcGxldGVseSBmYWRlZCwgbWFyayBpdCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgLy8gaXRzIHBvc2l0aW9uIGF0IHJlbmRlciB0aW1lLiBJZiB0aGlzIGxheWVyIGhhcyB2YXJpYWJsZSBwbGFjZW1lbnQsIHNoaWZ0IHRoZSB2YXJpb3VzXG4gICAgICAgICAgICAgICAgLy8gc3ltYm9sIGluc3RhbmNlcyBhcHByb3ByaWF0ZWx5IHNvIHRoYXQgc3ltYm9scyBmcm9tIGJ1Y2tldHMgdGhhdCBoYXZlIHlldCB0byBiZSBwbGFjZWRcbiAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYXBwcm9wcmlhdGVseS5cbiAgICAgICAgICAgICAgICBjb25zdCBzeW1ib2xIaWRkZW4gPSBvcGFjaXR5U3RhdGUudGV4dC5pc0hpZGRlbigpO1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UucmlnaHRKdXN0aWZpZWRUZXh0U3ltYm9sSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmNlbnRlckp1c3RpZmllZFRleHRTeW1ib2xJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UubGVmdEp1c3RpZmllZFRleHRTeW1ib2xJbmRleFxuICAgICAgICAgICAgICAgIF0uZm9yRWFjaChpbmRleCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheS5nZXQoaW5kZXgpLmhpZGRlbiA9IHN5bWJvbEhpZGRlbiB8fCBob3Jpem9udGFsSGlkZGVuID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC50ZXh0LnBsYWNlZFN5bWJvbEFycmF5LmdldChzeW1ib2xJbnN0YW5jZS52ZXJ0aWNhbFBsYWNlZFRleHRTeW1ib2xJbmRleCkuaGlkZGVuID0gc3ltYm9sSGlkZGVuIHx8IHZlcnRpY2FsSGlkZGVuID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk9mZnNldCA9IHRoaXMudmFyaWFibGVPZmZzZXRzW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICBpZiAocHJldk9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtVc2VkSnVzdGlmaWNhdGlvbihidWNrZXQsIHByZXZPZmZzZXQuYW5jaG9yLCBzeW1ib2xJbnN0YW5jZSwgcGxhY2VkT3JpZW50YXRpb24pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZPcmllbnRhdGlvbiA9IHRoaXMucGxhY2VkT3JpZW50YXRpb25zW3N5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEXTtcbiAgICAgICAgICAgICAgICBpZiAocHJldk9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFya1VzZWRKdXN0aWZpY2F0aW9uKGJ1Y2tldCwgJ2xlZnQnLCBzeW1ib2xJbnN0YW5jZSwgcHJldk9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrVXNlZE9yaWVudGF0aW9uKGJ1Y2tldCwgcHJldk9yaWVudGF0aW9uLCBzeW1ib2xJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGFzSWNvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhY2tlZE9wYWNpdHkgPSBwYWNrT3BhY2l0eShvcGFjaXR5U3RhdGUuaWNvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UucGxhY2VkSWNvblN5bWJvbEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9wYWNpdHkgPSAhaG9yaXpvbnRhbEhpZGRlbiA/IHBhY2tlZE9wYWNpdHkgOiBQQUNLRURfSElEREVOX09QQUNJVFk7XG4gICAgICAgICAgICAgICAgICAgIGFkZE9wYWNpdGllcyhidWNrZXQuaWNvbiwgc3ltYm9sSW5zdGFuY2UubnVtSWNvblZlcnRpY2VzLCBob3Jpem9udGFsT3BhY2l0eSk7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5pY29uLnBsYWNlZFN5bWJvbEFycmF5LmdldChzeW1ib2xJbnN0YW5jZS5wbGFjZWRJY29uU3ltYm9sSW5kZXgpLmhpZGRlbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAob3BhY2l0eVN0YXRlLmljb24uaXNIaWRkZW4oKTogYW55KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0aWNhbE9wYWNpdHkgPSAhdmVydGljYWxIaWRkZW4gPyBwYWNrZWRPcGFjaXR5IDogUEFDS0VEX0hJRERFTl9PUEFDSVRZO1xuICAgICAgICAgICAgICAgICAgICBhZGRPcGFjaXRpZXMoYnVja2V0Lmljb24sIHN5bWJvbEluc3RhbmNlLm51bVZlcnRpY2FsSWNvblZlcnRpY2VzLCB2ZXJ0aWNhbE9wYWNpdHkpO1xuICAgICAgICAgICAgICAgICAgICBidWNrZXQuaWNvbi5wbGFjZWRTeW1ib2xBcnJheS5nZXQoc3ltYm9sSW5zdGFuY2UudmVydGljYWxQbGFjZWRJY29uU3ltYm9sSW5kZXgpLmhpZGRlbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAob3BhY2l0eVN0YXRlLmljb24uaXNIaWRkZW4oKTogYW55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChidWNrZXQuaGFzSWNvbkNvbGxpc2lvbkJveERhdGEoKSB8fCBidWNrZXQuaGFzVGV4dENvbGxpc2lvbkJveERhdGEoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxpc2lvbkFycmF5cyA9IGJ1Y2tldC5jb2xsaXNpb25BcnJheXNbc107XG4gICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2hpZnQgPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy50ZXh0Qm94IHx8IGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbFRleHRCb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZVBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlT2Zmc2V0ID0gdGhpcy52YXJpYWJsZU9mZnNldHNbY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZU9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgc2hvdyBlaXRoZXIgdGhlIGN1cnJlbnRseSBwbGFjZWQgcG9zaXRpb24gb3IgdGhlIGxhc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bGx5IHBsYWNlZCBwb3NpdGlvbiAoc28geW91IGNhbiB2aXN1YWxpemUgd2hhdCBjb2xsaXNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBtYWRlIHRoZSBzeW1ib2wgZGlzYXBwZWFyLCBhbmQgdGhlIG1vc3QgbGlrZWx5IHBsYWNlIGZvciB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ltYm9sIHRvIGNvbWUgYmFjaylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSBjYWxjdWxhdGVWYXJpYWJsZUxheW91dFNoaWZ0KHZhcmlhYmxlT2Zmc2V0LmFuY2hvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVPZmZzZXQud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlT2Zmc2V0LmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVPZmZzZXQudGV4dE9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVPZmZzZXQudGV4dFNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdGF0ZVdpdGhNYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0Ll9yb3RhdGUocGl0Y2hXaXRoTWFwID8gdGhpcy50cmFuc2Zvcm0uYW5nbGUgOiAtdGhpcy50cmFuc2Zvcm0uYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gb2Zmc2V0IC0+IHRoaXMgc3ltYm9sIGhhc24ndCBiZWVuIHBsYWNlZCBzaW5jZSBjb21pbmcgb24tc2NyZWVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHNpbmdsZSBib3ggaXMgcGFydGljdWxhcmx5IG1lYW5pbmdmdWwgYW5kIGFsbCBvZiB0aGVtIHdvdWxkIGJlIHRvbyBub2lzeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGNlbnRlciBib3gganVzdCB0byBzaG93IHNvbWV0aGluZydzIHRoZXJlLCBidXQgbWFyayBpdCBcIm5vdCB1c2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NsaXBwaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCA9ICFvcGFjaXR5U3RhdGUuY2xpcHBlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy50ZXh0Qm94KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sbGlzaW9uVmVydGljZXMoYnVja2V0LnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXksIG9wYWNpdHlTdGF0ZS50ZXh0LnBsYWNlZCwgIXVzZWQgfHwgaG9yaXpvbnRhbEhpZGRlbiwgc2hpZnQueCwgc2hpZnQueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGlzaW9uQXJyYXlzLnZlcnRpY2FsVGV4dEJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbGxpc2lvblZlcnRpY2VzKGJ1Y2tldC50ZXh0Q29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LCBvcGFjaXR5U3RhdGUudGV4dC5wbGFjZWQsICF1c2VkIHx8IHZlcnRpY2FsSGlkZGVuLCBzaGlmdC54LCBzaGlmdC55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2FsSWNvblVzZWQgPSB1c2VkICYmIEJvb2xlYW4oIXZlcnRpY2FsSGlkZGVuICYmIGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbEljb25Cb3gpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xsaXNpb25BcnJheXMuaWNvbkJveCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29sbGlzaW9uVmVydGljZXMoYnVja2V0Lmljb25Db2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QXJyYXksIG9wYWNpdHlTdGF0ZS5pY29uLnBsYWNlZCwgdmVydGljYWxJY29uVXNlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJY29uVGV4dEZpdCA/IHNoaWZ0LnggOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ljb25UZXh0Rml0ID8gc2hpZnQueSA6IDApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGxpc2lvbkFycmF5cy52ZXJ0aWNhbEljb25Cb3gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbGxpc2lvblZlcnRpY2VzKGJ1Y2tldC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5LCBvcGFjaXR5U3RhdGUuaWNvbi5wbGFjZWQsICF2ZXJ0aWNhbEljb25Vc2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0ljb25UZXh0Rml0ID8gc2hpZnQueCA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSWNvblRleHRGaXQgPyBzaGlmdC55IDogMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnVja2V0LmZ1bGx5Q2xpcHBlZCA9IHZpc2libGVJbnN0YW5jZUNvdW50ID09PSAwO1xuICAgICAgICBidWNrZXQuc29ydEZlYXR1cmVzKHRoaXMudHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgaWYgKHRoaXMucmV0YWluZWRRdWVyeURhdGFbYnVja2V0LmJ1Y2tldEluc3RhbmNlSWRdKSB7XG4gICAgICAgICAgICB0aGlzLnJldGFpbmVkUXVlcnlEYXRhW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXS5mZWF0dXJlU29ydE9yZGVyID0gYnVja2V0LmZlYXR1cmVTb3J0T3JkZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnVja2V0Lmhhc1RleHREYXRhKCkgJiYgYnVja2V0LnRleHQub3BhY2l0eVZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgYnVja2V0LnRleHQub3BhY2l0eVZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGJ1Y2tldC50ZXh0Lm9wYWNpdHlWZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1Y2tldC5oYXNJY29uRGF0YSgpICYmIGJ1Y2tldC5pY29uLm9wYWNpdHlWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5pY29uLm9wYWNpdHlWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWNrZXQuaGFzSWNvbkNvbGxpc2lvbkJveERhdGEoKSAmJiBidWNrZXQuaWNvbkNvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGJ1Y2tldC5pY29uQ29sbGlzaW9uQm94LmNvbGxpc2lvblZlcnRleEFycmF5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnVja2V0Lmhhc1RleHRDb2xsaXNpb25Cb3hEYXRhKCkgJiYgYnVja2V0LnRleHRDb2xsaXNpb25Cb3guY29sbGlzaW9uVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBidWNrZXQudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShidWNrZXQudGV4dENvbGxpc2lvbkJveC5jb2xsaXNpb25WZXJ0ZXhBcnJheSk7XG4gICAgICAgIH1cblxuICAgICAgICBhc3NlcnQoYnVja2V0LnRleHQub3BhY2l0eVZlcnRleEFycmF5Lmxlbmd0aCA9PT0gYnVja2V0LnRleHQubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoIC8gNCk7XG4gICAgICAgIGFzc2VydChidWNrZXQuaWNvbi5vcGFjaXR5VmVydGV4QXJyYXkubGVuZ3RoID09PSBidWNrZXQuaWNvbi5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGggLyA0KTtcblxuICAgICAgICAvLyBQdXNoIGdlbmVyYXRlZCBjb2xsaXNpb24gY2lyY2xlcyB0byB0aGUgYnVja2V0IGZvciBkZWJ1ZyByZW5kZXJpbmdcbiAgICAgICAgaWYgKGJ1Y2tldC5idWNrZXRJbnN0YW5jZUlkIGluIHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzKSB7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29sbGlzaW9uQ2lyY2xlQXJyYXlzW2J1Y2tldC5idWNrZXRJbnN0YW5jZUlkXTtcblxuICAgICAgICAgICAgYnVja2V0LnBsYWNlbWVudEludlByb2pNYXRyaXggPSBpbnN0YW5jZS5pbnZQcm9qTWF0cml4O1xuICAgICAgICAgICAgYnVja2V0LnBsYWNlbWVudFZpZXdwb3J0TWF0cml4ID0gaW5zdGFuY2Uudmlld3BvcnRNYXRyaXg7XG4gICAgICAgICAgICBidWNrZXQuY29sbGlzaW9uQ2lyY2xlQXJyYXkgPSBpbnN0YW5jZS5jaXJjbGVzO1xuXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb2xsaXNpb25DaXJjbGVBcnJheXNbYnVja2V0LmJ1Y2tldEluc3RhbmNlSWRdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3ltYm9sRmFkZUNoYW5nZShub3c6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZhZGVEdXJhdGlvbiA9PT0gMCA/XG4gICAgICAgICAgICAxIDpcbiAgICAgICAgICAgICgobm93IC0gdGhpcy5jb21taXRUaW1lKSAvIHRoaXMuZmFkZUR1cmF0aW9uICsgdGhpcy5wcmV2Wm9vbUFkanVzdG1lbnQpO1xuICAgIH1cblxuICAgIHpvb21BZGp1c3RtZW50KHpvb206IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIC8vIFdoZW4gem9vbWluZyBvdXQgcXVpY2tseSwgbGFiZWxzIGNhbiBvdmVybGFwIGVhY2ggb3RoZXIuIFRoaXNcbiAgICAgICAgLy8gYWRqdXN0bWVudCBpcyB1c2VkIHRvIHJlZHVjZSB0aGUgaW50ZXJ2YWwgYmV0d2VlbiBwbGFjZW1lbnQgY2FsY3VsYXRpb25zXG4gICAgICAgIC8vIGFuZCB0byByZWR1Y2UgdGhlIGZhZGUgZHVyYXRpb24gd2hlbiB6b29taW5nIG91dCBxdWlja2x5LiBEaXNjb3ZlcmluZyB0aGVcbiAgICAgICAgLy8gY29sbGlzaW9ucyBtb3JlIHF1aWNrbHkgYW5kIGZhZGluZyB0aGVtIG1vcmUgcXVpY2tseSByZWR1Y2VzIHRoZSB1bndhbnRlZCBlZmZlY3QuXG4gICAgICAgIHJldHVybiBNYXRoLm1heCgwLCAodGhpcy50cmFuc2Zvcm0uem9vbSAtIHpvb20pIC8gMS41KTtcbiAgICB9XG5cbiAgICBoYXNUcmFuc2l0aW9ucyhub3c6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFsZSB8fFxuICAgICAgICAgICAgbm93IC0gdGhpcy5sYXN0UGxhY2VtZW50Q2hhbmdlVGltZSA8IHRoaXMuZmFkZUR1cmF0aW9uO1xuICAgIH1cblxuICAgIHN0aWxsUmVjZW50KG5vdzogbnVtYmVyLCB6b29tOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgLy8gVGhlIGFkanVzdG1lbnQgbWFrZXMgcGxhY2VtZW50IG1vcmUgZnJlcXVlbnQgd2hlbiB6b29taW5nLlxuICAgICAgICAvLyBUaGlzIGNvbmRpdGlvbiBhcHBsaWVzIHRoZSBhZGp1c3RtZW50IG9ubHkgYWZ0ZXIgdGhlIG1hcCBoYXNcbiAgICAgICAgLy8gc3RvcHBlZCB6b29taW5nLiBUaGlzIGF2b2lkcyBhZGRpbmcgZXh0cmEgamFuayB3aGlsZSB6b29taW5nLlxuICAgICAgICBjb25zdCBkdXJhdGlvbkFkanVzdG1lbnQgPSB0aGlzLnpvb21BdExhc3RSZWNlbmN5Q2hlY2sgPT09IHpvb20gP1xuICAgICAgICAgICAgKDEgLSB0aGlzLnpvb21BZGp1c3RtZW50KHpvb20pKSA6XG4gICAgICAgICAgICAxO1xuICAgICAgICB0aGlzLnpvb21BdExhc3RSZWNlbmN5Q2hlY2sgPSB6b29tO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1pdFRpbWUgKyB0aGlzLmZhZGVEdXJhdGlvbiAqIGR1cmF0aW9uQWRqdXN0bWVudCA+IG5vdztcbiAgICB9XG5cbiAgICBzZXRTdGFsZSgpIHtcbiAgICAgICAgdGhpcy5zdGFsZSA9IHRydWU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDb2xsaXNpb25WZXJ0aWNlcyhjb2xsaXNpb25WZXJ0ZXhBcnJheTogQ29sbGlzaW9uVmVydGV4QXJyYXksIHBsYWNlZDogYm9vbGVhbiwgbm90VXNlZDogYm9vbGVhbiB8IG51bWJlciwgc2hpZnRYPzogbnVtYmVyLCBzaGlmdFk/OiBudW1iZXIpIHtcbiAgICBjb2xsaXNpb25WZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwbGFjZWQgPyAxIDogMCwgbm90VXNlZCA/IDEgOiAwLCBzaGlmdFggfHwgMCwgc2hpZnRZIHx8IDApO1xuICAgIGNvbGxpc2lvblZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHBsYWNlZCA/IDEgOiAwLCBub3RVc2VkID8gMSA6IDAsIHNoaWZ0WCB8fCAwLCBzaGlmdFkgfHwgMCk7XG4gICAgY29sbGlzaW9uVmVydGV4QXJyYXkuZW1wbGFjZUJhY2socGxhY2VkID8gMSA6IDAsIG5vdFVzZWQgPyAxIDogMCwgc2hpZnRYIHx8IDAsIHNoaWZ0WSB8fCAwKTtcbiAgICBjb2xsaXNpb25WZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhwbGFjZWQgPyAxIDogMCwgbm90VXNlZCA/IDEgOiAwLCBzaGlmdFggfHwgMCwgc2hpZnRZIHx8IDApO1xufVxuXG4vLyBBbGwgZm91ciB2ZXJ0aWNlcyBmb3IgYSBnbHlwaCB3aWxsIGhhdmUgdGhlIHNhbWUgb3BhY2l0eSBzdGF0ZVxuLy8gU28gd2UgcGFjayB0aGUgb3BhY2l0eSBpbnRvIGEgdWludDgsIGFuZCB0aGVuIHJlcGVhdCBpdCBmb3VyIHRpbWVzXG4vLyB0byBtYWtlIGEgc2luZ2xlIHVpbnQzMiB0aGF0IHdlIGNhbiB1cGxvYWQgZm9yIGVhY2ggZ2x5cGggaW4gdGhlXG4vLyBsYWJlbC5cbmNvbnN0IHNoaWZ0MjUgPSBNYXRoLnBvdygyLCAyNSk7XG5jb25zdCBzaGlmdDI0ID0gTWF0aC5wb3coMiwgMjQpO1xuY29uc3Qgc2hpZnQxNyA9IE1hdGgucG93KDIsIDE3KTtcbmNvbnN0IHNoaWZ0MTYgPSBNYXRoLnBvdygyLCAxNik7XG5jb25zdCBzaGlmdDkgPSBNYXRoLnBvdygyLCA5KTtcbmNvbnN0IHNoaWZ0OCA9IE1hdGgucG93KDIsIDgpO1xuY29uc3Qgc2hpZnQxID0gTWF0aC5wb3coMiwgMSk7XG5mdW5jdGlvbiBwYWNrT3BhY2l0eShvcGFjaXR5U3RhdGU6IE9wYWNpdHlTdGF0ZSk6IG51bWJlciB7XG4gICAgaWYgKG9wYWNpdHlTdGF0ZS5vcGFjaXR5ID09PSAwICYmICFvcGFjaXR5U3RhdGUucGxhY2VkKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAob3BhY2l0eVN0YXRlLm9wYWNpdHkgPT09IDEgJiYgb3BhY2l0eVN0YXRlLnBsYWNlZCkge1xuICAgICAgICByZXR1cm4gNDI5NDk2NzI5NTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0Qml0ID0gb3BhY2l0eVN0YXRlLnBsYWNlZCA/IDEgOiAwO1xuICAgIGNvbnN0IG9wYWNpdHlCaXRzID0gTWF0aC5mbG9vcihvcGFjaXR5U3RhdGUub3BhY2l0eSAqIDEyNyk7XG4gICAgcmV0dXJuIG9wYWNpdHlCaXRzICogc2hpZnQyNSArIHRhcmdldEJpdCAqIHNoaWZ0MjQgK1xuICAgICAgICBvcGFjaXR5Qml0cyAqIHNoaWZ0MTcgKyB0YXJnZXRCaXQgKiBzaGlmdDE2ICtcbiAgICAgICAgb3BhY2l0eUJpdHMgKiBzaGlmdDkgKyB0YXJnZXRCaXQgKiBzaGlmdDggK1xuICAgICAgICBvcGFjaXR5Qml0cyAqIHNoaWZ0MSArIHRhcmdldEJpdDtcbn1cblxuY29uc3QgUEFDS0VEX0hJRERFTl9PUEFDSVRZID0gMDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5cbmltcG9ydCB7UGxhY2VtZW50fSBmcm9tICcuLi9zeW1ib2wvcGxhY2VtZW50LmpzJztcbmltcG9ydCB7UGVyZm9ybWFuY2VVdGlsc30gZnJvbSAnLi4vdXRpbC9wZXJmb3JtYW5jZS5qcyc7XG5cbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBTeW1ib2xTdHlsZUxheWVyIGZyb20gJy4vc3R5bGVfbGF5ZXIvc3ltYm9sX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUge0J1Y2tldFBhcnR9IGZyb20gJy4uL3N5bWJvbC9wbGFjZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUge0ZvZ1N0YXRlfSBmcm9tICcuL2ZvZ19oZWxwZXJzLmpzJztcblxuY2xhc3MgTGF5ZXJQbGFjZW1lbnQge1xuICAgIF9zb3J0QWNyb3NzVGlsZXM6IGJvb2xlYW47XG4gICAgX2N1cnJlbnRUaWxlSW5kZXg6IG51bWJlcjtcbiAgICBfY3VycmVudFBhcnRJbmRleDogbnVtYmVyO1xuICAgIF9zZWVuQ3Jvc3NUaWxlSURzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBib29sZWFuIH07XG4gICAgX2J1Y2tldFBhcnRzOiBBcnJheTxCdWNrZXRQYXJ0PjtcblxuICAgIGNvbnN0cnVjdG9yKHN0eWxlTGF5ZXI6IFN5bWJvbFN0eWxlTGF5ZXIpIHtcbiAgICAgICAgdGhpcy5fc29ydEFjcm9zc1RpbGVzID0gc3R5bGVMYXllci5sYXlvdXQuZ2V0KCdzeW1ib2wtei1vcmRlcicpICE9PSAndmlld3BvcnQteScgJiZcbiAgICAgICAgICAgIHN0eWxlTGF5ZXIubGF5b3V0LmdldCgnc3ltYm9sLXNvcnQta2V5JykuY29uc3RhbnRPcigxKSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRUaWxlSW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9jdXJyZW50UGFydEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fc2VlbkNyb3NzVGlsZUlEcyA9IHt9O1xuICAgICAgICB0aGlzLl9idWNrZXRQYXJ0cyA9IFtdO1xuICAgIH1cblxuICAgIGNvbnRpbnVlUGxhY2VtZW50KHRpbGVzOiBBcnJheTxUaWxlPiwgcGxhY2VtZW50OiBQbGFjZW1lbnQsIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbiwgc3R5bGVMYXllcjogU3R5bGVMYXllciwgc2hvdWxkUGF1c2VQbGFjZW1lbnQ6ICgpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYnVja2V0UGFydHMgPSB0aGlzLl9idWNrZXRQYXJ0cztcblxuICAgICAgICB3aGlsZSAodGhpcy5fY3VycmVudFRpbGVJbmRleCA8IHRpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRpbGVzW3RoaXMuX2N1cnJlbnRUaWxlSW5kZXhdO1xuICAgICAgICAgICAgcGxhY2VtZW50LmdldEJ1Y2tldFBhcnRzKGJ1Y2tldFBhcnRzLCBzdHlsZUxheWVyLCB0aWxlLCB0aGlzLl9zb3J0QWNyb3NzVGlsZXMpO1xuXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VGlsZUluZGV4Kys7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUGF1c2VQbGFjZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3NvcnRBY3Jvc3NUaWxlcykge1xuICAgICAgICAgICAgdGhpcy5fc29ydEFjcm9zc1RpbGVzID0gZmFsc2U7XG4gICAgICAgICAgICBidWNrZXRQYXJ0cy5zb3J0KChhLCBiKSA9PiAoKGEuc29ydEtleTogYW55KTogbnVtYmVyKSAtICgoYi5zb3J0S2V5OiBhbnkpOiBudW1iZXIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlICh0aGlzLl9jdXJyZW50UGFydEluZGV4IDwgYnVja2V0UGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBidWNrZXRQYXJ0ID0gYnVja2V0UGFydHNbdGhpcy5fY3VycmVudFBhcnRJbmRleF07XG4gICAgICAgICAgICBwbGFjZW1lbnQucGxhY2VMYXllckJ1Y2tldFBhcnQoYnVja2V0UGFydCwgdGhpcy5fc2VlbkNyb3NzVGlsZUlEcywgc2hvd0NvbGxpc2lvbkJveGVzLCBidWNrZXRQYXJ0LnN5bWJvbEluc3RhbmNlU3RhcnQgPT09IDApO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFBhcnRJbmRleCsrO1xuICAgICAgICAgICAgaWYgKHNob3VsZFBhdXNlUGxhY2VtZW50KCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5jbGFzcyBQYXVzZWFibGVQbGFjZW1lbnQge1xuICAgIHBsYWNlbWVudDogUGxhY2VtZW50O1xuICAgIF9kb25lOiBib29sZWFuO1xuICAgIF9jdXJyZW50UGxhY2VtZW50SW5kZXg6IG51bWJlcjtcbiAgICBfZm9yY2VGdWxsUGxhY2VtZW50OiBib29sZWFuO1xuICAgIF9zaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW47XG4gICAgX2luUHJvZ3Jlc3NMYXllcjogP0xheWVyUGxhY2VtZW50O1xuXG4gICAgY29uc3RydWN0b3IodHJhbnNmb3JtOiBUcmFuc2Zvcm0sIG9yZGVyOiBBcnJheTxzdHJpbmc+LFxuICAgICAgICAgICAgICAgIGZvcmNlRnVsbFBsYWNlbWVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IGJvb2xlYW4sXG4gICAgICAgICAgICAgICAgZmFkZUR1cmF0aW9uOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuLFxuICAgICAgICAgICAgICAgIHByZXZQbGFjZW1lbnQ/OiBQbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgZm9nU3RhdGU6ID9Gb2dTdGF0ZSkge1xuXG4gICAgICAgIHRoaXMucGxhY2VtZW50ID0gbmV3IFBsYWNlbWVudCh0cmFuc2Zvcm0sIGZhZGVEdXJhdGlvbiwgY3Jvc3NTb3VyY2VDb2xsaXNpb25zLCBwcmV2UGxhY2VtZW50LCBmb2dTdGF0ZSk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleCA9IG9yZGVyLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuX2ZvcmNlRnVsbFBsYWNlbWVudCA9IGZvcmNlRnVsbFBsYWNlbWVudDtcbiAgICAgICAgdGhpcy5fc2hvd0NvbGxpc2lvbkJveGVzID0gc2hvd0NvbGxpc2lvbkJveGVzO1xuICAgICAgICB0aGlzLl9kb25lID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNEb25lKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9uZTtcbiAgICB9XG5cbiAgICBjb250aW51ZVBsYWNlbWVudChvcmRlcjogQXJyYXk8c3RyaW5nPiwgbGF5ZXJzOiB7W186IHN0cmluZ106IFN0eWxlTGF5ZXJ9LCBsYXllclRpbGVzOiB7W186IHN0cmluZ106IEFycmF5PFRpbGU+fSkge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBicm93c2VyLm5vdygpO1xuXG4gICAgICAgIGNvbnN0IHNob3VsZFBhdXNlUGxhY2VtZW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxhcHNlZFRpbWUgPSBicm93c2VyLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvcmNlRnVsbFBsYWNlbWVudCA/IGZhbHNlIDogZWxhcHNlZFRpbWUgPiAyO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdoaWxlICh0aGlzLl9jdXJyZW50UGxhY2VtZW50SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IG9yZGVyW3RoaXMuX2N1cnJlbnRQbGFjZW1lbnRJbmRleF07XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudFpvb20gPSB0aGlzLnBsYWNlbWVudC5jb2xsaXNpb25JbmRleC50cmFuc2Zvcm0uem9vbTtcbiAgICAgICAgICAgIGlmIChsYXllci50eXBlID09PSAnc3ltYm9sJyAmJlxuICAgICAgICAgICAgICAgICghbGF5ZXIubWluem9vbSB8fCBsYXllci5taW56b29tIDw9IHBsYWNlbWVudFpvb20pICYmXG4gICAgICAgICAgICAgICAgKCFsYXllci5tYXh6b29tIHx8IGxheWVyLm1heHpvb20gPiBwbGFjZW1lbnRab29tKSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pblByb2dyZXNzTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5Qcm9ncmVzc0xheWVyID0gbmV3IExheWVyUGxhY2VtZW50KCgobGF5ZXI6IGFueSk6IFN5bWJvbFN0eWxlTGF5ZXIpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXVzZVBsYWNlbWVudCA9IHRoaXMuX2luUHJvZ3Jlc3NMYXllci5jb250aW51ZVBsYWNlbWVudChsYXllclRpbGVzW2xheWVyLnNvdXJjZV0sIHRoaXMucGxhY2VtZW50LCB0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMsIGxheWVyLCBzaG91bGRQYXVzZVBsYWNlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocGF1c2VQbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VVdGlscy5yZWNvcmRQbGFjZW1lbnRUaW1lKGJyb3dzZXIubm93KCkgLSBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBkaWRuJ3QgZmluaXNoIHBsYWNpbmcgYWxsIGxheWVycyB3aXRoaW4gMm1zLFxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2UgY2FuIGtlZXAgcmVuZGVyaW5nIHdpdGggYSBwYXJ0aWFsIHBsYWNlbWVudFxuICAgICAgICAgICAgICAgICAgICAvLyBXZSdsbCByZXN1bWUgaGVyZSBvbiB0aGUgbmV4dCBmcmFtZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2luUHJvZ3Jlc3NMYXllcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY3VycmVudFBsYWNlbWVudEluZGV4LS07XG4gICAgICAgIH1cbiAgICAgICAgUGVyZm9ybWFuY2VVdGlscy5yZWNvcmRQbGFjZW1lbnRUaW1lKGJyb3dzZXIubm93KCkgLSBzdGFydFRpbWUpO1xuICAgICAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb21taXQobm93OiBudW1iZXIpOiBQbGFjZW1lbnQge1xuICAgICAgICB0aGlzLnBsYWNlbWVudC5jb21taXQobm93KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxhY2VtZW50O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGF1c2VhYmxlUGxhY2VtZW50O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5cbmltcG9ydCB7U3ltYm9sSW5zdGFuY2VBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSBQcm9qZWN0aW9uIGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3Byb2plY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUge1N5bWJvbEluc3RhbmNlfSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBTeW1ib2xCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuXG4vKlxuICAgIFRoZSBDcm9zc1RpbGVTeW1ib2xJbmRleCBnZW5lcmFsbHkgd29ya3Mgb24gdGhlIGFzc3VtcHRpb24gdGhhdFxuICAgIGEgY29uY2VwdHVhbCBcInVuaXF1ZSBzeW1ib2xcIiBjYW4gYmUgaWRlbnRpZmllZCBieSB0aGUgdGV4dCBvZlxuICAgIHRoZSBsYWJlbCBjb21iaW5lZCB3aXRoIHRoZSBhbmNob3IgcG9pbnQuIFRoZSBnb2FsIGlzIHRvIGFzc2lnblxuICAgIHRoZXNlIGNvbmNlcHR1YWwgXCJ1bmlxdWUgc3ltYm9sc1wiIGEgc2hhcmVkIGNyb3NzVGlsZUlEIHRoYXQgY2FuIGJlXG4gICAgdXNlZCBieSBQbGFjZW1lbnQgdG8ga2VlcCBmYWRpbmcgb3BhY2l0eSBzdGF0ZXMgY29uc2lzdGVudCBhbmQgdG9cbiAgICBkZWR1cGxpY2F0ZSBsYWJlbHMuXG5cbiAgICBUaGUgQ3Jvc3NUaWxlU3ltYm9sSW5kZXggaW5kZXhlcyBhbGwgdGhlIGN1cnJlbnQgc3ltYm9sIGluc3RhbmNlcyBhbmRcbiAgICB0aGVpciBjcm9zc1RpbGVJRHMuIFdoZW4gYSBzeW1ib2wgYnVja2V0IGdldHMgYWRkZWQgb3IgdXBkYXRlZCwgdGhlXG4gICAgaW5kZXggYXNzaWducyBhIGNyb3NzVGlsZUlEIHRvIGVhY2ggb2YgaXQncyBzeW1ib2wgaW5zdGFuY2VzIGJ5IGVpdGhlclxuICAgIG1hdGNoaW5nIGl0IHdpdGggYW4gZXhpc3RpbmcgaWQgb3IgYXNzaWduaW5nIGEgbmV3IG9uZS5cbiovXG5cbi8vIFJvdW5kIGFuY2hvciBwb3NpdGlvbnMgdG8gcm91Z2hseSA0IHBpeGVsIGdyaWRcbmNvbnN0IHJvdW5kaW5nRmFjdG9yID0gNTEyIC8gRVhURU5UIC8gMjtcblxuY2xhc3MgVGlsZUxheWVySW5kZXgge1xuICAgIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRDtcbiAgICBpbmRleGVkU3ltYm9sSW5zdGFuY2VzOiB7W186IG51bWJlcl06IEFycmF5PHtcbiAgICAgICAgY3Jvc3NUaWxlSUQ6IG51bWJlcixcbiAgICAgICAgY29vcmQ6IHtcbiAgICAgICAgICAgIHg6IG51bWJlcixcbiAgICAgICAgICAgIHk6IG51bWJlclxuICAgICAgICB9XG4gICAgfT59O1xuICAgIGJ1Y2tldEluc3RhbmNlSWQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgc3ltYm9sSW5zdGFuY2VzOiBTeW1ib2xJbnN0YW5jZUFycmF5LCBidWNrZXRJbnN0YW5jZUlkOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy50aWxlSUQgPSB0aWxlSUQ7XG4gICAgICAgIHRoaXMuaW5kZXhlZFN5bWJvbEluc3RhbmNlcyA9IHt9O1xuICAgICAgICB0aGlzLmJ1Y2tldEluc3RhbmNlSWQgPSBidWNrZXRJbnN0YW5jZUlkO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IHN5bWJvbEluc3RhbmNlcy5nZXQoaSk7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBzeW1ib2xJbnN0YW5jZS5rZXk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2tleV0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaXMgdGlsZSBtYXkgaGF2ZSBtdWx0aXBsZSBzeW1ib2wgaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUga2V5XG4gICAgICAgICAgICAvLyBTdG9yZSBlYWNoIG9uZSBhbG9uZyB3aXRoIGl0cyBjb29yZGluYXRlc1xuICAgICAgICAgICAgdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW2tleV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgY3Jvc3NUaWxlSUQ6IHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlELFxuICAgICAgICAgICAgICAgIGNvb3JkOiB0aGlzLmdldFNjYWxlZENvb3JkaW5hdGVzKHN5bWJvbEluc3RhbmNlLCB0aWxlSUQpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnZlcnRzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgaW5wdXQgc3ltYm9sIGluc3RhbmNlIGludG8gY29vcmRpbmF0ZXMgdGhhdCBiZSBjYW4gY29tcGFyZWRcbiAgICAvLyBhZ2FpbnN0IG90aGVyIHN5bWJvbHMgaW4gdGhpcyBpbmRleC4gQ29vcmRpbmF0ZXMgYXJlOlxuICAgIC8vICgxKSB3b3JsZC1iYXNlZCAoc28gYWZ0ZXIgY29udmVyc2lvbiB0aGUgc291cmNlIHRpbGUgaXMgaXJyZWxldmFudClcbiAgICAvLyAoMikgY29udmVydGVkIHRvIHRoZSB6LXNjYWxlIG9mIHRoaXMgVGlsZUxheWVySW5kZXhcbiAgICAvLyAoMykgZG93bi1zYW1wbGVkIGJ5IFwicm91bmRpbmdGYWN0b3JcIiBmcm9tIHRpbGUgY29vcmRpbmF0ZSBwcmVjaXNpb24gaW4gb3JkZXIgdG8gYmVcbiAgICAvLyAgICAgbW9yZSB0b2xlcmFudCBvZiBzbWFsbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRpbGVzLlxuICAgIGdldFNjYWxlZENvb3JkaW5hdGVzKHN5bWJvbEluc3RhbmNlOiBTeW1ib2xJbnN0YW5jZSwgY2hpbGRUaWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQpOiB7fHg6IG51bWJlciwgeTogbnVtYmVyfH0ge1xuICAgICAgICBjb25zdCB6RGlmZmVyZW5jZSA9IGNoaWxkVGlsZUlELmNhbm9uaWNhbC56IC0gdGhpcy50aWxlSUQuY2Fub25pY2FsLno7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gcm91bmRpbmdGYWN0b3IgLyBNYXRoLnBvdygyLCB6RGlmZmVyZW5jZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBNYXRoLmZsb29yKChjaGlsZFRpbGVJRC5jYW5vbmljYWwueCAqIEVYVEVOVCArIHN5bWJvbEluc3RhbmNlLnRpbGVBbmNob3JYKSAqIHNjYWxlKSxcbiAgICAgICAgICAgIHk6IE1hdGguZmxvb3IoKGNoaWxkVGlsZUlELmNhbm9uaWNhbC55ICogRVhURU5UICsgc3ltYm9sSW5zdGFuY2UudGlsZUFuY2hvclkpICogc2NhbGUpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZmluZE1hdGNoZXMoc3ltYm9sSW5zdGFuY2VzOiBTeW1ib2xJbnN0YW5jZUFycmF5LCBuZXdUaWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHpvb21Dcm9zc1RpbGVJRHM6IHtbY3Jvc3NUaWxlSUQ6IG51bWJlcl06IGJvb2xlYW59KSB7XG4gICAgICAgIGNvbnN0IHRvbGVyYW5jZSA9IHRoaXMudGlsZUlELmNhbm9uaWNhbC56IDwgbmV3VGlsZUlELmNhbm9uaWNhbC56ID8gMSA6IE1hdGgucG93KDIsIHRoaXMudGlsZUlELmNhbm9uaWNhbC56IC0gbmV3VGlsZUlELmNhbm9uaWNhbC56KTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN5bWJvbEluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSBzeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgaWYgKHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEKSB7XG4gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBoYXMgYSBtYXRjaCwgc2tpcFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbmRleGVkSW5zdGFuY2VzID0gdGhpcy5pbmRleGVkU3ltYm9sSW5zdGFuY2VzW3N5bWJvbEluc3RhbmNlLmtleV07XG4gICAgICAgICAgICBpZiAoIWluZGV4ZWRJbnN0YW5jZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBObyBzeW1ib2wgd2l0aCB0aGlzIGtleSBpbiB0aGlzIGJ1Y2tldFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzY2FsZWRTeW1ib2xDb29yZCA9IHRoaXMuZ2V0U2NhbGVkQ29vcmRpbmF0ZXMoc3ltYm9sSW5zdGFuY2UsIG5ld1RpbGVJRCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdGhpc1RpbGVTeW1ib2wgb2YgaW5kZXhlZEluc3RhbmNlcykge1xuICAgICAgICAgICAgICAgIC8vIFJldHVybiBhbnkgc3ltYm9sIHdpdGggdGhlIHNhbWUga2V5cyB3aG9zZSBjb29yZGluYXRlcyBhcmUgd2l0aGluIDFcbiAgICAgICAgICAgICAgICAvLyBncmlkIHVuaXQuICh3aXRoIGEgNHB4IGdyaWQsIHRoaXMgY292ZXJzIGEgMTJweCBieSAxMnB4IGFyZWEpXG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHRoaXNUaWxlU3ltYm9sLmNvb3JkLnggLSBzY2FsZWRTeW1ib2xDb29yZC54KSA8PSB0b2xlcmFuY2UgJiZcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnModGhpc1RpbGVTeW1ib2wuY29vcmQueSAtIHNjYWxlZFN5bWJvbENvb3JkLnkpIDw9IHRvbGVyYW5jZSAmJlxuICAgICAgICAgICAgICAgICAgICAhem9vbUNyb3NzVGlsZUlEc1t0aGlzVGlsZVN5bWJvbC5jcm9zc1RpbGVJRF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gT25jZSB3ZSd2ZSBtYXJrZWQgb3Vyc2VsdmVzIGR1cGxpY2F0ZSBhZ2FpbnN0IHRoaXMgcGFyZW50IHN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgbGV0IGFueSBvdGhlciBzeW1ib2xzIGF0IHRoZSBzYW1lIHpvb20gbGV2ZWwgZHVwbGljYXRlIGFnYWluc3RcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgcGFyZW50IChzZWUgaXNzdWUgIzU5OTMpXG4gICAgICAgICAgICAgICAgICAgIHpvb21Dcm9zc1RpbGVJRHNbdGhpc1RpbGVTeW1ib2wuY3Jvc3NUaWxlSURdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgPSB0aGlzVGlsZVN5bWJvbC5jcm9zc1RpbGVJRDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBDcm9zc1RpbGVJRHMge1xuICAgIG1heENyb3NzVGlsZUlEOiBudW1iZXI7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubWF4Q3Jvc3NUaWxlSUQgPSAwO1xuICAgIH1cbiAgICBnZW5lcmF0ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKyt0aGlzLm1heENyb3NzVGlsZUlEO1xuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NUaWxlU3ltYm9sTGF5ZXJJbmRleCB7XG4gICAgaW5kZXhlczoge1t6b29tOiBzdHJpbmcgfCBudW1iZXJdOiB7W3RpbGVJZDogc3RyaW5nIHwgbnVtYmVyXTogVGlsZUxheWVySW5kZXh9fTtcbiAgICB1c2VkQ3Jvc3NUaWxlSURzOiB7W3pvb206IHN0cmluZyB8IG51bWJlcl06IHtbY3Jvc3NUaWxlSUQ6IG51bWJlcl06IGJvb2xlYW59fTtcbiAgICBsbmc6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmluZGV4ZXMgPSB7fTtcbiAgICAgICAgdGhpcy51c2VkQ3Jvc3NUaWxlSURzID0ge307XG4gICAgICAgIHRoaXMubG5nID0gMDtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFNvbWV0aW1lcyB3aGVuIGEgdXNlciBwYW5zIGFjcm9zcyB0aGUgYW50aW1lcmlkaWFuIHRoZSBsb25naXR1ZGUgdmFsdWUgZ2V0cyB3cmFwcGVkLlxuICAgICAqIFRvIHByZXZlbnQgbGFiZWxzIGZyb20gZmxhc2hpbmcgb3V0IGFuZCBpbiB3ZSBhZGp1c3QgdGhlIHRpbGVJRCB2YWx1ZXMgaW4gdGhlIGluZGV4ZXNcbiAgICAgKiBzbyB0aGF0IHRoZXkgbWF0Y2ggdGhlIG5ldyB3cmFwcGVkIHZlcnNpb24gb2YgdGhlIG1hcC5cbiAgICAgKi9cbiAgICBoYW5kbGVXcmFwSnVtcChsbmc6IG51bWJlcikge1xuICAgICAgICBjb25zdCB3cmFwRGVsdGEgPSBNYXRoLnJvdW5kKChsbmcgLSB0aGlzLmxuZykgLyAzNjApO1xuICAgICAgICBpZiAod3JhcERlbHRhICE9PSAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHpvb20gaW4gdGhpcy5pbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgem9vbUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNbem9vbV07XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Wm9vbUluZGV4ID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gem9vbUluZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0aWxlSUQncyB3cmFwIGFuZCBhZGQgaXQgdG8gYSBuZXcgaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB6b29tSW5kZXhlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBpbmRleC50aWxlSUQgPSBpbmRleC50aWxlSUQudW53cmFwVG8oaW5kZXgudGlsZUlELndyYXAgKyB3cmFwRGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICBuZXdab29tSW5kZXhbaW5kZXgudGlsZUlELmtleV0gPSBpbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleGVzW3pvb21dID0gbmV3Wm9vbUluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG5nID0gbG5nO1xuICAgIH1cblxuICAgIGFkZEJ1Y2tldCh0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIGJ1Y2tldDogU3ltYm9sQnVja2V0LCBjcm9zc1RpbGVJRHM6IENyb3NzVGlsZUlEcyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl0gJiZcbiAgICAgICAgICAgIHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdW3RpbGVJRC5rZXldKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl1bdGlsZUlELmtleV0uYnVja2V0SW5zdGFuY2VJZCA9PT1cbiAgICAgICAgICAgICAgICBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UncmUgcmVwbGFjaW5nIHRoaXMgYnVja2V0IHdpdGggYW4gdXBkYXRlZCB2ZXJzaW9uXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBvbGQgYnVja2V0J3MgXCJ1c2VkIGNyb3NzVGlsZUlEc1wiIG5vdyBzbyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gdGhlIG5ldyBidWNrZXQgY2FuIGNsYWltIHRoZW0uXG4gICAgICAgICAgICAgICAgLy8gVGhlIG9sZCBpbmRleCBlbnRyaWVzIHRoZW1zZWx2ZXMgc3RpY2sgYXJvdW5kIHVudGlsXG4gICAgICAgICAgICAgICAgLy8gJ3JlbW92ZVN0YWxlQnVja2V0cycgaXMgY2FsbGVkLlxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHRpbGVJRC5vdmVyc2NhbGVkWixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl1bdGlsZUlELmtleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSUQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnVzZWRDcm9zc1RpbGVJRHNbdGlsZUlELm92ZXJzY2FsZWRaXSkge1xuICAgICAgICAgICAgdGhpcy51c2VkQ3Jvc3NUaWxlSURzW3RpbGVJRC5vdmVyc2NhbGVkWl0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB6b29tQ3Jvc3NUaWxlSURzID0gdGhpcy51c2VkQ3Jvc3NUaWxlSURzW3RpbGVJRC5vdmVyc2NhbGVkWl07XG5cbiAgICAgICAgZm9yIChjb25zdCB6b29tIGluIHRoaXMuaW5kZXhlcykge1xuICAgICAgICAgICAgY29uc3Qgem9vbUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNbem9vbV07XG4gICAgICAgICAgICBpZiAoTnVtYmVyKHpvb20pID4gdGlsZUlELm92ZXJzY2FsZWRaKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB6b29tSW5kZXhlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEluZGV4ID0gem9vbUluZGV4ZXNbaWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleC50aWxlSUQuaXNDaGlsZE9mKHRpbGVJRCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXguZmluZE1hdGNoZXMoYnVja2V0LnN5bWJvbEluc3RhbmNlcywgdGlsZUlELCB6b29tQ3Jvc3NUaWxlSURzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Q29vcmQgPSB0aWxlSUQuc2NhbGVkVG8oTnVtYmVyKHpvb20pKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHpvb21JbmRleGVzW3BhcmVudENvb3JkLmtleV07XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZGV4LmZpbmRNYXRjaGVzKGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMsIHRpbGVJRCwgem9vbUNyb3NzVGlsZUlEcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzeW1ib2xJbnN0YW5jZSA9IGJ1Y2tldC5zeW1ib2xJbnN0YW5jZXMuZ2V0KGkpO1xuICAgICAgICAgICAgaWYgKCFzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRCkge1xuICAgICAgICAgICAgICAgIC8vIHN5bWJvbCBkaWQgbm90IG1hdGNoIGFueSBrbm93biBzeW1ib2wsIGFzc2lnbiBhIG5ldyBpZFxuICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmNyb3NzVGlsZUlEID0gY3Jvc3NUaWxlSURzLmdlbmVyYXRlKCk7XG4gICAgICAgICAgICAgICAgem9vbUNyb3NzVGlsZUlEc1tzeW1ib2xJbnN0YW5jZS5jcm9zc1RpbGVJRF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5kZXhlc1t0aWxlSUQub3ZlcnNjYWxlZFpdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleGVzW3RpbGVJRC5vdmVyc2NhbGVkWl1bdGlsZUlELmtleV0gPSBuZXcgVGlsZUxheWVySW5kZXgodGlsZUlELCBidWNrZXQuc3ltYm9sSW5zdGFuY2VzLCBidWNrZXQuYnVja2V0SW5zdGFuY2VJZCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHpvb206IHN0cmluZyB8IG51bWJlciwgcmVtb3ZlZEJ1Y2tldDogVGlsZUxheWVySW5kZXgpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVtb3ZlZEJ1Y2tldC5pbmRleGVkU3ltYm9sSW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN5bWJvbEluc3RhbmNlIG9mIHJlbW92ZWRCdWNrZXQuaW5kZXhlZFN5bWJvbEluc3RhbmNlc1soa2V5OiBhbnkpXSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnVzZWRDcm9zc1RpbGVJRHNbem9vbV1bc3ltYm9sSW5zdGFuY2UuY3Jvc3NUaWxlSURdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlU3RhbGVCdWNrZXRzKGN1cnJlbnRJRHM6IHsgW3N0cmluZyB8IG51bWJlcl06IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgdGlsZXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgeiBpbiB0aGlzLmluZGV4ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHpvb21JbmRleGVzID0gdGhpcy5pbmRleGVzW3pdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0aWxlS2V5IGluIHpvb21JbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50SURzW3pvb21JbmRleGVzW3RpbGVLZXldLmJ1Y2tldEluc3RhbmNlSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQnVja2V0Q3Jvc3NUaWxlSURzKHosIHpvb21JbmRleGVzW3RpbGVLZXldKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHpvb21JbmRleGVzW3RpbGVLZXldO1xuICAgICAgICAgICAgICAgICAgICB0aWxlc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGlsZXNDaGFuZ2VkO1xuICAgIH1cbn1cblxuY2xhc3MgQ3Jvc3NUaWxlU3ltYm9sSW5kZXgge1xuICAgIGxheWVySW5kZXhlczoge1tsYXllcklkOiBzdHJpbmddOiBDcm9zc1RpbGVTeW1ib2xMYXllckluZGV4fTtcbiAgICBjcm9zc1RpbGVJRHM6IENyb3NzVGlsZUlEcztcbiAgICBtYXhCdWNrZXRJbnN0YW5jZUlkOiBudW1iZXI7XG4gICAgYnVja2V0c0luQ3VycmVudFBsYWNlbWVudDoge1tfOiBudW1iZXJdOiBib29sZWFufTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxheWVySW5kZXhlcyA9IHt9O1xuICAgICAgICB0aGlzLmNyb3NzVGlsZUlEcyA9IG5ldyBDcm9zc1RpbGVJRHMoKTtcbiAgICAgICAgdGhpcy5tYXhCdWNrZXRJbnN0YW5jZUlkID0gMDtcbiAgICAgICAgdGhpcy5idWNrZXRzSW5DdXJyZW50UGxhY2VtZW50ID0ge307XG4gICAgfVxuXG4gICAgYWRkTGF5ZXIoc3R5bGVMYXllcjogU3R5bGVMYXllciwgdGlsZXM6IEFycmF5PFRpbGU+LCBsbmc6IG51bWJlciwgcHJvamVjdGlvbjogUHJvamVjdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgbGF5ZXJJbmRleCA9IHRoaXMubGF5ZXJJbmRleGVzW3N0eWxlTGF5ZXIuaWRdO1xuICAgICAgICBpZiAobGF5ZXJJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXllckluZGV4ID0gdGhpcy5sYXllckluZGV4ZXNbc3R5bGVMYXllci5pZF0gPSBuZXcgQ3Jvc3NUaWxlU3ltYm9sTGF5ZXJJbmRleCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRCdWNrZXRJRHMgPSB7fTtcblxuICAgICAgICBpZiAocHJvamVjdGlvbi5uYW1lICE9PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICBsYXllckluZGV4LmhhbmRsZVdyYXBKdW1wKGxuZyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHRpbGUgb2YgdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEJ1Y2tldCA9ICgodGlsZS5nZXRCdWNrZXQoc3R5bGVMYXllcik6IGFueSk6IFN5bWJvbEJ1Y2tldCk7XG4gICAgICAgICAgICBpZiAoIXN5bWJvbEJ1Y2tldCB8fCBzdHlsZUxheWVyLmlkICE9PSBzeW1ib2xCdWNrZXQubGF5ZXJJZHNbMF0pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmICghc3ltYm9sQnVja2V0LmJ1Y2tldEluc3RhbmNlSWQpIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZCA9ICsrdGhpcy5tYXhCdWNrZXRJbnN0YW5jZUlkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF5ZXJJbmRleC5hZGRCdWNrZXQodGlsZS50aWxlSUQsIHN5bWJvbEJ1Y2tldCwgdGhpcy5jcm9zc1RpbGVJRHMpKSB7XG4gICAgICAgICAgICAgICAgc3ltYm9sQnVja2V0c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudEJ1Y2tldElEc1tzeW1ib2xCdWNrZXQuYnVja2V0SW5zdGFuY2VJZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheWVySW5kZXgucmVtb3ZlU3RhbGVCdWNrZXRzKGN1cnJlbnRCdWNrZXRJRHMpKSB7XG4gICAgICAgICAgICBzeW1ib2xCdWNrZXRzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3ltYm9sQnVja2V0c0NoYW5nZWQ7XG4gICAgfVxuXG4gICAgcHJ1bmVVbnVzZWRMYXllcnModXNlZExheWVyczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICBjb25zdCB1c2VkTGF5ZXJNYXAgPSB7fTtcbiAgICAgICAgdXNlZExheWVycy5mb3JFYWNoKCh1c2VkTGF5ZXIpID0+IHtcbiAgICAgICAgICAgIHVzZWRMYXllck1hcFt1c2VkTGF5ZXJdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLmxheWVySW5kZXhlcykge1xuICAgICAgICAgICAgaWYgKCF1c2VkTGF5ZXJNYXBbbGF5ZXJJZF0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5sYXllckluZGV4ZXNbbGF5ZXJJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENyb3NzVGlsZVN5bWJvbEluZGV4O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQge0V2ZW50LCBFcnJvckV2ZW50LCBFdmVudGVkfSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0IFN0eWxlTGF5ZXIgZnJvbSAnLi9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgY3JlYXRlU3R5bGVMYXllciBmcm9tICcuL2NyZWF0ZV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgbG9hZFNwcml0ZSBmcm9tICcuL2xvYWRfc3ByaXRlLmpzJztcbmltcG9ydCBJbWFnZU1hbmFnZXIgZnJvbSAnLi4vcmVuZGVyL2ltYWdlX21hbmFnZXIuanMnO1xuaW1wb3J0IEdseXBoTWFuYWdlciwge0xvY2FsR2x5cGhNb2RlfSBmcm9tICcuLi9yZW5kZXIvZ2x5cGhfbWFuYWdlci5qcyc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi9saWdodC5qcyc7XG5pbXBvcnQgVGVycmFpbiwge0RyYXBlUmVuZGVyTW9kZX0gZnJvbSAnLi90ZXJyYWluLmpzJztcbmltcG9ydCBGb2cgZnJvbSAnLi9mb2cuanMnO1xuaW1wb3J0IExpbmVBdGxhcyBmcm9tICcuLi9yZW5kZXIvbGluZV9hdGxhcy5qcyc7XG5pbXBvcnQge3BpY2ssIGNsb25lLCBleHRlbmQsIGRlZXBFcXVhbCwgZmlsdGVyT2JqZWN0fSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtnZXRKU09OLCBnZXRSZWZlcnJlciwgbWFrZVJlcXVlc3QsIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCB7aXNNYXBib3hVUkx9IGZyb20gJy4uL3V0aWwvbWFwYm94LmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHtcbiAgICB2YWxpZGF0ZVN0eWxlLFxuICAgIHZhbGlkYXRlU291cmNlLFxuICAgIHZhbGlkYXRlTGF5ZXIsXG4gICAgdmFsaWRhdGVGaWx0ZXIsXG4gICAgdmFsaWRhdGVUZXJyYWluLFxuICAgIGVtaXRWYWxpZGF0aW9uRXJyb3JzIGFzIF9lbWl0VmFsaWRhdGlvbkVycm9yc1xufSBmcm9tICcuL3ZhbGlkYXRlX3N0eWxlLmpzJztcbmltcG9ydCB7UXVlcnlHZW9tZXRyeX0gZnJvbSAnLi4vc3R5bGUvcXVlcnlfZ2VvbWV0cnkuanMnO1xuaW1wb3J0IHtcbiAgICBjcmVhdGUgYXMgY3JlYXRlU291cmNlLFxuICAgIGdldFR5cGUgYXMgZ2V0U291cmNlVHlwZSxcbiAgICBzZXRUeXBlIGFzIHNldFNvdXJjZVR5cGUsXG4gICAgdHlwZSBTb3VyY2VDbGFzc1xufSBmcm9tICcuLi9zb3VyY2Uvc291cmNlLmpzJztcbmltcG9ydCB7cXVlcnlSZW5kZXJlZEZlYXR1cmVzLCBxdWVyeVJlbmRlcmVkU3ltYm9scywgcXVlcnlTb3VyY2VGZWF0dXJlc30gZnJvbSAnLi4vc291cmNlL3F1ZXJ5X2ZlYXR1cmVzLmpzJztcbmltcG9ydCBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlLmpzJztcbmltcG9ydCBHZW9KU09OU291cmNlIGZyb20gJy4uL3NvdXJjZS9nZW9qc29uX3NvdXJjZS5qcyc7XG5pbXBvcnQgc3R5bGVTcGVjIGZyb20gJy4uL3N0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdC5qcyc7XG5pbXBvcnQgZ2V0V29ya2VyUG9vbCBmcm9tICcuLi91dGlsL2dsb2JhbF93b3JrZXJfcG9vbC5qcyc7XG5pbXBvcnQgZGVyZWYgZnJvbSAnLi4vc3R5bGUtc3BlYy9kZXJlZi5qcyc7XG5pbXBvcnQgZW1wdHlTdHlsZSBmcm9tICcuLi9zdHlsZS1zcGVjL2VtcHR5LmpzJztcbmltcG9ydCBkaWZmU3R5bGVzLCB7b3BlcmF0aW9ucyBhcyBkaWZmT3BlcmF0aW9uc30gZnJvbSAnLi4vc3R5bGUtc3BlYy9kaWZmLmpzJztcbmltcG9ydCB7XG4gICAgcmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZSxcbiAgICBldmVudGVkIGFzIHJ0bFRleHRQbHVnaW5FdmVudGVkLFxuICAgIHRyaWdnZXJQbHVnaW5Db21wbGV0aW9uRXZlbnRcbn0gZnJvbSAnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbi5qcyc7XG5pbXBvcnQgUGF1c2VhYmxlUGxhY2VtZW50IGZyb20gJy4vcGF1c2VhYmxlX3BsYWNlbWVudC5qcyc7XG5pbXBvcnQgWm9vbUhpc3RvcnkgZnJvbSAnLi96b29tX2hpc3RvcnkuanMnO1xuaW1wb3J0IENyb3NzVGlsZVN5bWJvbEluZGV4IGZyb20gJy4uL3N5bWJvbC9jcm9zc190aWxlX3N5bWJvbF9pbmRleC5qcyc7XG5pbXBvcnQge3ZhbGlkYXRlQ3VzdG9tU3R5bGVMYXllcn0gZnJvbSAnLi9zdHlsZV9sYXllci9jdXN0b21fc3R5bGVfbGF5ZXIuanMnO1xuXG4vLyBXZSdyZSBza2lwcGluZyB2YWxpZGF0aW9uIGVycm9ycyB3aXRoIHRoZSBgc291cmNlLmNhbnZhc2AgaWRlbnRpZmllciBpbiBvcmRlclxuLy8gdG8gY29udGludWUgdG8gYWxsb3cgY2FudmFzIHNvdXJjZXMgdG8gYmUgYWRkZWQgYXQgcnVudGltZS91cGRhdGVkIGluXG4vLyBzbWFydCBzZXRTdHlsZSAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL3B1bGwvNjQyNCk6XG5jb25zdCBlbWl0VmFsaWRhdGlvbkVycm9ycyA9IChldmVudGVkOiBFdmVudGVkLCBlcnJvcnM6ID9WYWxpZGF0aW9uRXJyb3JzKSA9PlxuICAgIF9lbWl0VmFsaWRhdGlvbkVycm9ycyhldmVudGVkLCBlcnJvcnMgJiYgZXJyb3JzLmZpbHRlcihlcnJvciA9PiBlcnJvci5pZGVudGlmaWVyICE9PSAnc291cmNlLmNhbnZhcycpKTtcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcC5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZX0gZnJvbSAnLi9zdHlsZV9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVHbHlwaH0gZnJvbSAnLi9zdHlsZV9nbHlwaC5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcbmltcG9ydCB0eXBlIEV2YWx1YXRpb25QYXJhbWV0ZXJzIGZyb20gJy4vZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCB0eXBlIHtQbGFjZW1lbnR9IGZyb20gJy4uL3N5bWJvbC9wbGFjZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUge0NhbmNlbGFibGV9IGZyb20gJy4uL3R5cGVzL2NhbmNlbGFibGUuanMnO1xuaW1wb3J0IHR5cGUge1JlcXVlc3RQYXJhbWV0ZXJzLCBSZXNwb25zZUNhbGxiYWNrfSBmcm9tICcuLi91dGlsL2FqYXguanMnO1xuaW1wb3J0IHR5cGUge0dlb0pTT059IGZyb20gJ0BtYXBib3gvZ2VvanNvbi10eXBlcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgTGF5ZXJTcGVjaWZpY2F0aW9uLFxuICAgIEZpbHRlclNwZWNpZmljYXRpb24sXG4gICAgU3R5bGVTcGVjaWZpY2F0aW9uLFxuICAgIExpZ2h0U3BlY2lmaWNhdGlvbixcbiAgICBTb3VyY2VTcGVjaWZpY2F0aW9uLFxuICAgIFRlcnJhaW5TcGVjaWZpY2F0aW9uLFxuICAgIEZvZ1NwZWNpZmljYXRpb24sXG4gICAgUHJvamVjdGlvblNwZWNpZmljYXRpb24sXG4gICAgVHJhbnNpdGlvblNwZWNpZmljYXRpb24sXG4gICAgUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb25cbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7Q3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGZyb20gJy4vc3R5bGVfbGF5ZXIvY3VzdG9tX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIHtWYWxpZGF0b3IsIFZhbGlkYXRpb25FcnJvcnN9IGZyb20gJy4vdmFsaWRhdGVfc3R5bGUuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIHtRdWVyeVJlc3VsdH0gZnJvbSAnLi4vZGF0YS9mZWF0dXJlX2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtRdWVyeUZlYXR1cmV9IGZyb20gJy4uL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uLmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlU3RhdGVzfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX3N0YXRlLmpzJztcbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUge1NvdXJjZX0gZnJvbSAnLi4vc291cmNlL3NvdXJjZS5qcyc7XG5pbXBvcnQgdHlwZSB7VHJhbnNpdGlvblBhcmFtZXRlcnN9IGZyb20gJy4vcHJvcGVydGllcy5qcyc7XG5cbmNvbnN0IHN1cHBvcnRlZERpZmZPcGVyYXRpb25zID0gcGljayhkaWZmT3BlcmF0aW9ucywgW1xuICAgICdhZGRMYXllcicsXG4gICAgJ3JlbW92ZUxheWVyJyxcbiAgICAnc2V0UGFpbnRQcm9wZXJ0eScsXG4gICAgJ3NldExheW91dFByb3BlcnR5JyxcbiAgICAnc2V0RmlsdGVyJyxcbiAgICAnYWRkU291cmNlJyxcbiAgICAncmVtb3ZlU291cmNlJyxcbiAgICAnc2V0TGF5ZXJab29tUmFuZ2UnLFxuICAgICdzZXRMaWdodCcsXG4gICAgJ3NldFRyYW5zaXRpb24nLFxuICAgICdzZXRHZW9KU09OU291cmNlRGF0YScsXG4gICAgJ3NldFRlcnJhaW4nLFxuICAgICdzZXRGb2cnLFxuICAgICdzZXRQcm9qZWN0aW9uJ1xuICAgIC8vICdzZXRHbHlwaHMnLFxuICAgIC8vICdzZXRTcHJpdGUnLFxuXSk7XG5cbmNvbnN0IGlnbm9yZWREaWZmT3BlcmF0aW9ucyA9IHBpY2soZGlmZk9wZXJhdGlvbnMsIFtcbiAgICAnc2V0Q2VudGVyJyxcbiAgICAnc2V0Wm9vbScsXG4gICAgJ3NldEJlYXJpbmcnLFxuICAgICdzZXRQaXRjaCdcbl0pO1xuXG5jb25zdCBlbXB0eSA9IGVtcHR5U3R5bGUoKTtcblxuZXhwb3J0IHR5cGUgU3R5bGVPcHRpb25zID0ge1xuICAgIHZhbGlkYXRlPzogYm9vbGVhbixcbiAgICBsb2NhbEZvbnRGYW1pbHk/OiBzdHJpbmcsXG4gICAgbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5Pzogc3RyaW5nXG59O1xuXG5leHBvcnQgdHlwZSBTdHlsZVNldHRlck9wdGlvbnMgPSB7XG4gICAgdmFsaWRhdGU/OiBib29sZWFuXG59O1xuXG4vLyBTeW1ib2xzIGFyZSBkcmFwZWQgb25seSBmb3Igc3BlY2lmaWMgY2FzZXM6IHNlZSBpc0xheWVyRHJhcGVkXG5jb25zdCBkcmFwZWRMYXllcnMgPSB7J2ZpbGwnOiB0cnVlLCAnbGluZSc6IHRydWUsICdiYWNrZ3JvdW5kJzogdHJ1ZSwgXCJoaWxsc2hhZGVcIjogdHJ1ZSwgXCJyYXN0ZXJcIjogdHJ1ZX07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgU3R5bGUgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBtYXA6IE1hcDtcbiAgICBzdHlsZXNoZWV0OiBTdHlsZVNwZWNpZmljYXRpb247XG4gICAgZGlzcGF0Y2hlcjogRGlzcGF0Y2hlcjtcbiAgICBpbWFnZU1hbmFnZXI6IEltYWdlTWFuYWdlcjtcbiAgICBnbHlwaE1hbmFnZXI6IEdseXBoTWFuYWdlcjtcbiAgICBsaW5lQXRsYXM6IExpbmVBdGxhcztcbiAgICBsaWdodDogTGlnaHQ7XG4gICAgdGVycmFpbjogP1RlcnJhaW47XG4gICAgZm9nOiA/Rm9nO1xuXG4gICAgX3JlcXVlc3Q6ID9DYW5jZWxhYmxlO1xuICAgIF9zcHJpdGVSZXF1ZXN0OiA/Q2FuY2VsYWJsZTtcbiAgICBfbGF5ZXJzOiB7W186IHN0cmluZ106IFN0eWxlTGF5ZXJ9O1xuICAgIF9udW0zRExheWVyczogbnVtYmVyO1xuICAgIF9udW1TeW1ib2xMYXllcnM6IG51bWJlcjtcbiAgICBfbnVtQ2lyY2xlTGF5ZXJzOiBudW1iZXI7XG4gICAgX3NlcmlhbGl6ZWRMYXllcnM6IHtbXzogc3RyaW5nXTogT2JqZWN0fTtcbiAgICBfb3JkZXI6IEFycmF5PHN0cmluZz47XG4gICAgX2RyYXBlZEZpcnN0T3JkZXI6IEFycmF5PHN0cmluZz47XG4gICAgX3NvdXJjZUNhY2hlczoge1tfOiBzdHJpbmddOiBTb3VyY2VDYWNoZX07XG4gICAgX290aGVyU291cmNlQ2FjaGVzOiB7W186IHN0cmluZ106IFNvdXJjZUNhY2hlfTtcbiAgICBfc3ltYm9sU291cmNlQ2FjaGVzOiB7W186IHN0cmluZ106IFNvdXJjZUNhY2hlfTtcbiAgICB6b29tSGlzdG9yeTogWm9vbUhpc3Rvcnk7XG4gICAgX2xvYWRlZDogYm9vbGVhbjtcbiAgICBfcnRsVGV4dFBsdWdpbkNhbGxiYWNrOiBGdW5jdGlvbjtcbiAgICBfY2hhbmdlZDogYm9vbGVhbjtcbiAgICBfdXBkYXRlZFNvdXJjZXM6IHtbXzogc3RyaW5nXTogJ2NsZWFyJyB8ICdyZWxvYWQnfTtcbiAgICBfdXBkYXRlZExheWVyczoge1tfOiBzdHJpbmddOiB0cnVlfTtcbiAgICBfcmVtb3ZlZExheWVyczoge1tfOiBzdHJpbmddOiBTdHlsZUxheWVyfTtcbiAgICBfY2hhbmdlZEltYWdlczoge1tfOiBzdHJpbmddOiB0cnVlfTtcbiAgICBfdXBkYXRlZFBhaW50UHJvcHM6IHtbbGF5ZXI6IHN0cmluZ106IHRydWV9O1xuICAgIF9sYXllck9yZGVyQ2hhbmdlZDogYm9vbGVhbjtcbiAgICBfYXZhaWxhYmxlSW1hZ2VzOiBBcnJheTxzdHJpbmc+O1xuICAgIF9tYXJrZXJzTmVlZFVwZGF0ZTogYm9vbGVhbjtcblxuICAgIGNyb3NzVGlsZVN5bWJvbEluZGV4OiBDcm9zc1RpbGVTeW1ib2xJbmRleDtcbiAgICBwYXVzZWFibGVQbGFjZW1lbnQ6IFBhdXNlYWJsZVBsYWNlbWVudDtcbiAgICBwbGFjZW1lbnQ6IFBsYWNlbWVudDtcbiAgICB6OiBudW1iZXI7XG5cbiAgICAvLyBleHBvc2VkIHRvIGFsbG93IHN0dWJiaW5nIGJ5IHVuaXQgdGVzdHNcbiAgICBzdGF0aWMgZ2V0U291cmNlVHlwZTogdHlwZW9mIGdldFNvdXJjZVR5cGU7XG4gICAgc3RhdGljIHNldFNvdXJjZVR5cGU6IHR5cGVvZiBzZXRTb3VyY2VUeXBlO1xuICAgIHN0YXRpYyByZWdpc3RlckZvclBsdWdpblN0YXRlQ2hhbmdlOiB0eXBlb2YgcmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZTtcblxuICAgIGNvbnN0cnVjdG9yKG1hcDogTWFwLCBvcHRpb25zOiBTdHlsZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgRGlzcGF0Y2hlcihnZXRXb3JrZXJQb29sKCksIHRoaXMpO1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlciA9IG5ldyBJbWFnZU1hbmFnZXIoKTtcbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuc2V0RXZlbnRlZFBhcmVudCh0aGlzKTtcbiAgICAgICAgdGhpcy5nbHlwaE1hbmFnZXIgPSBuZXcgR2x5cGhNYW5hZ2VyKG1hcC5fcmVxdWVzdE1hbmFnZXIsXG4gICAgICAgICAgICBvcHRpb25zLmxvY2FsRm9udEZhbWlseSA/XG4gICAgICAgICAgICAgICAgTG9jYWxHbHlwaE1vZGUuYWxsIDpcbiAgICAgICAgICAgICAgICAob3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPyBMb2NhbEdseXBoTW9kZS5pZGVvZ3JhcGhzIDogTG9jYWxHbHlwaE1vZGUubm9uZSksXG4gICAgICAgICAgICBvcHRpb25zLmxvY2FsRm9udEZhbWlseSB8fCBvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSk7XG4gICAgICAgIHRoaXMubGluZUF0bGFzID0gbmV3IExpbmVBdGxhcygyNTYsIDUxMik7XG4gICAgICAgIHRoaXMuY3Jvc3NUaWxlU3ltYm9sSW5kZXggPSBuZXcgQ3Jvc3NUaWxlU3ltYm9sSW5kZXgoKTtcblxuICAgICAgICB0aGlzLl9sYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fbnVtM0RMYXllcnMgPSAwO1xuICAgICAgICB0aGlzLl9udW1TeW1ib2xMYXllcnMgPSAwO1xuICAgICAgICB0aGlzLl9udW1DaXJjbGVMYXllcnMgPSAwO1xuICAgICAgICB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuX3NvdXJjZUNhY2hlcyA9IHt9O1xuICAgICAgICB0aGlzLl9vdGhlclNvdXJjZUNhY2hlcyA9IHt9O1xuICAgICAgICB0aGlzLl9zeW1ib2xTb3VyY2VDYWNoZXMgPSB7fTtcbiAgICAgICAgdGhpcy56b29tSGlzdG9yeSA9IG5ldyBab29tSGlzdG9yeSgpO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYXZhaWxhYmxlSW1hZ2VzID0gW107XG4gICAgICAgIHRoaXMuX29yZGVyICA9IFtdO1xuICAgICAgICB0aGlzLl9kcmFwZWRGaXJzdE9yZGVyID0gW107XG4gICAgICAgIHRoaXMuX21hcmtlcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fcmVzZXRVcGRhdGVzKCk7XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnc2V0UmVmZXJyZXInLCBnZXRSZWZlcnJlcigpKTtcblxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5fcnRsVGV4dFBsdWdpbkNhbGxiYWNrID0gU3R5bGUucmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICAgICAgICAgIHBsdWdpblN0YXR1czogZXZlbnQucGx1Z2luU3RhdHVzLFxuICAgICAgICAgICAgICAgIHBsdWdpblVSTDogZXZlbnQucGx1Z2luVVJMXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2VsZi5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnc3luY1JUTFBsdWdpblN0YXRlJywgc3RhdGUsIChlcnIsIHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyUGx1Z2luQ29tcGxldGlvbkV2ZW50KGVycik7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsQ29tcGxldGUgPSByZXN1bHRzLmV2ZXJ5KChlbGVtKSA9PiBlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsbENvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNlbGYuX3NvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc2VsZi5fc291cmNlQ2FjaGVzW2lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZVR5cGUgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZVR5cGUgPT09ICd2ZWN0b3InIHx8IHNvdXJjZUNhY2hlVHlwZSA9PT0gJ2dlb2pzb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlLnJlbG9hZCgpOyAvLyBTaG91bGQgYmUgYSBuby1vcCBpZiB0aGUgcGx1Z2luIGxvYWRzIGJlZm9yZSBhbnkgdGlsZXMgbG9hZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub24oJ2RhdGEnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhVHlwZSAhPT0gJ3NvdXJjZScgfHwgZXZlbnQuc291cmNlRGF0YVR5cGUgIT09ICdtZXRhZGF0YScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKGV2ZW50LnNvdXJjZUlkKTtcbiAgICAgICAgICAgIGlmICghc291cmNlIHx8ICFzb3VyY2UudmVjdG9yTGF5ZXJJZHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuc291cmNlID09PSBzb3VyY2UuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVMYXllcihsYXllcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkVVJMKHVybDogc3RyaW5nLCBvcHRpb25zOiB7XG4gICAgICAgIHZhbGlkYXRlPzogYm9vbGVhbixcbiAgICAgICAgYWNjZXNzVG9rZW4/OiBzdHJpbmdcbiAgICB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KSk7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSB0eXBlb2Ygb3B0aW9ucy52YWxpZGF0ZSA9PT0gJ2Jvb2xlYW4nID9cbiAgICAgICAgICAgIG9wdGlvbnMudmFsaWRhdGUgOiAhaXNNYXBib3hVUkwodXJsKTtcblxuICAgICAgICB1cmwgPSB0aGlzLm1hcC5fcmVxdWVzdE1hbmFnZXIubm9ybWFsaXplU3R5bGVVUkwodXJsLCBvcHRpb25zLmFjY2Vzc1Rva2VuKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlci50cmFuc2Zvcm1SZXF1ZXN0KHVybCwgUmVzb3VyY2VUeXBlLlN0eWxlKTtcbiAgICAgICAgdGhpcy5fcmVxdWVzdCA9IGdldEpTT04ocmVxdWVzdCwgKGVycm9yOiA/RXJyb3IsIGpzb246ID9PYmplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KGVycm9yKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGpzb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkKGpzb24sIHZhbGlkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZEpTT04oanNvbjogU3R5bGVTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcblxuICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gYnJvd3Nlci5mcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xvYWQoanNvbiwgb3B0aW9ucy52YWxpZGF0ZSAhPT0gZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkRW1wdHkoKSB7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc3R5bGUnfSkpO1xuICAgICAgICB0aGlzLl9sb2FkKGVtcHR5LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUxheWVyQ291bnQobGF5ZXI6IFN0eWxlTGF5ZXIsIGFkZDogYm9vbGVhbikge1xuICAgICAgICAvLyBUeXBlZCBsYXllciBib29ra2VlcGluZ1xuICAgICAgICBjb25zdCBjb3VudCA9IGFkZCA/IDEgOiAtMTtcbiAgICAgICAgaWYgKGxheWVyLmlzM0QoKSkge1xuICAgICAgICAgICAgdGhpcy5fbnVtM0RMYXllcnMgKz0gY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxheWVyLnR5cGUgPT09ICdjaXJjbGUnKSB7XG4gICAgICAgICAgICB0aGlzLl9udW1DaXJjbGVMYXllcnMgKz0gY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxheWVyLnR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICB0aGlzLl9udW1TeW1ib2xMYXllcnMgKz0gY291bnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfbG9hZChqc29uOiBTdHlsZVNwZWNpZmljYXRpb24sIHZhbGlkYXRlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2YWxpZGF0ZSAmJiBlbWl0VmFsaWRhdGlvbkVycm9ycyh0aGlzLCB2YWxpZGF0ZVN0eWxlKGpzb24pKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zdHlsZXNoZWV0ID0gY2xvbmUoanNvbik7XG4gICAgICAgIHRoaXMuX3VwZGF0ZU1hcFByb2plY3Rpb24oKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGpzb24uc291cmNlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UoaWQsIGpzb24uc291cmNlc1tpZF0sIHt2YWxpZGF0ZTogZmFsc2V9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gZmFsc2U7IC8vIGF2b2lkIHRyaWdnZXJpbmcgcmVkdW5kYW50IHN0eWxlIHVwZGF0ZSBhZnRlciBhZGRpbmcgaW5pdGlhbCBzb3VyY2VzXG4gICAgICAgIGlmIChqc29uLnNwcml0ZSkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZFNwcml0ZShqc29uLnNwcml0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlTWFuYWdlci5zZXRMb2FkZWQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdzcHJpdGVMb2FkZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2x5cGhNYW5hZ2VyLnNldFVSTChqc29uLmdseXBocyk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXJzID0gZGVyZWYodGhpcy5zdHlsZXNoZWV0LmxheWVycyk7XG5cbiAgICAgICAgdGhpcy5fb3JkZXIgPSBsYXllcnMubWFwKChsYXllcikgPT4gbGF5ZXIuaWQpO1xuXG4gICAgICAgIHRoaXMuX2xheWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzID0ge307XG4gICAgICAgIGZvciAobGV0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgbGF5ZXIgPSBjcmVhdGVTdHlsZUxheWVyKGxheWVyKTtcbiAgICAgICAgICAgIGxheWVyLnNldEV2ZW50ZWRQYXJlbnQodGhpcywge2xheWVyOiB7aWQ6IGxheWVyLmlkfX0pO1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJzW2xheWVyLmlkXSA9IGxheWVyO1xuICAgICAgICAgICAgdGhpcy5fc2VyaWFsaXplZExheWVyc1tsYXllci5pZF0gPSBsYXllci5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyQ291bnQobGF5ZXIsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnc2V0TGF5ZXJzJywgdGhpcy5fc2VyaWFsaXplTGF5ZXJzKHRoaXMuX29yZGVyKSk7XG5cbiAgICAgICAgdGhpcy5saWdodCA9IG5ldyBMaWdodCh0aGlzLnN0eWxlc2hlZXQubGlnaHQpO1xuICAgICAgICBpZiAodGhpcy5zdHlsZXNoZWV0LnRlcnJhaW4gJiYgIXRoaXMudGVycmFpblNldEZvckRyYXBpbmdPbmx5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVRlcnJhaW4odGhpcy5zdHlsZXNoZWV0LnRlcnJhaW4sIERyYXBlUmVuZGVyTW9kZS5lbGV2YXRlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3R5bGVzaGVldC5mb2cpIHtcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUZvZyh0aGlzLnN0eWxlc2hlZXQuZm9nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVEcmFwZUZpcnN0TGF5ZXJzKCk7XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnc3R5bGUubG9hZCcpKTtcbiAgICB9XG5cbiAgICB0ZXJyYWluU2V0Rm9yRHJhcGluZ09ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMudGVycmFpbiAmJiB0aGlzLnRlcnJhaW4uZHJhcGVSZW5kZXJNb2RlID09PSBEcmFwZVJlbmRlck1vZGUuZGVmZXJyZWQ7XG4gICAgfVxuXG4gICAgc2V0UHJvamVjdGlvbihwcm9qZWN0aW9uPzogP1Byb2plY3Rpb25TcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgIGlmIChwcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlc2hlZXQucHJvamVjdGlvbiA9IHByb2plY3Rpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZXNoZWV0LnByb2plY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1hcC5fZXhwbGljaXRQcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm1hcC5fdXBkYXRlUHJvamVjdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZU1hcFByb2plY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5tYXAuX2V4cGxpY2l0UHJvamVjdGlvbikgeyAvLyBVcGRhdGUgdGhlIHZpc2libGUgcHJvamVjdGlvbiBpZiBtYXAncyBpcyBudWxsXG4gICAgICAgICAgICB0aGlzLm1hcC5fdXBkYXRlUHJvamVjdGlvbigpO1xuICAgICAgICB9IGVsc2UgeyAvLyBFbnN1cmUgdGhhdCBzdHlsZSBpcyBjb25zaXN0ZW50IHdpdGggY3VycmVudCBwcm9qZWN0aW9uIG9uIHN0eWxlIGxvYWRcbiAgICAgICAgICAgIHRoaXMuYXBwbHlQcm9qZWN0aW9uVXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBseVByb2plY3Rpb25VcGRhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ3NldFByb2plY3Rpb24nLCB0aGlzLm1hcC50cmFuc2Zvcm0ucHJvamVjdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hcC50cmFuc2Zvcm0ucHJvamVjdGlvbi5yZXF1aXJlc0RyYXBpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhc1RlcnJhaW4gPSB0aGlzLmdldFRlcnJhaW4oKSB8fCB0aGlzLnN0eWxlc2hlZXQudGVycmFpbjtcbiAgICAgICAgICAgIGlmICghaGFzVGVycmFpbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VGVycmFpbkZvckRyYXBpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRlcnJhaW5TZXRGb3JEcmFwaW5nT25seSgpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFRlcnJhaW4obnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfbG9hZFNwcml0ZSh1cmw6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9zcHJpdGVSZXF1ZXN0ID0gbG9hZFNwcml0ZSh1cmwsIHRoaXMubWFwLl9yZXF1ZXN0TWFuYWdlciwgKGVyciwgaW1hZ2VzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zcHJpdGVSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQoZXJyKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGltYWdlcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gaW1hZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLmFkZEltYWdlKGlkLCBpbWFnZXNbaWRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLnNldExvYWRlZCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuX2F2YWlsYWJsZUltYWdlcyA9IHRoaXMuaW1hZ2VNYW5hZ2VyLmxpc3RJbWFnZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ3NldEltYWdlcycsIHRoaXMuX2F2YWlsYWJsZUltYWdlcyk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdzcHJpdGVMb2FkZWQnLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZUxheWVyKGxheWVyOiBTdHlsZUxheWVyKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKGxheWVyLnNvdXJjZSk7XG4gICAgICAgIGlmICghc291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IGxheWVyLnNvdXJjZUxheWVyO1xuICAgICAgICBpZiAoIXNvdXJjZUxheWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09ICdnZW9qc29uJyB8fCAoc291cmNlLnZlY3RvckxheWVySWRzICYmIHNvdXJjZS52ZWN0b3JMYXllcklkcy5pbmRleE9mKHNvdXJjZUxheWVyKSA9PT0gLTEpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBTb3VyY2UgbGF5ZXIgXCIke3NvdXJjZUxheWVyfVwiIGAgK1xuICAgICAgICAgICAgICAgIGBkb2VzIG5vdCBleGlzdCBvbiBzb3VyY2UgXCIke3NvdXJjZS5pZH1cIiBgICtcbiAgICAgICAgICAgICAgICBgYXMgc3BlY2lmaWVkIGJ5IHN0eWxlIGxheWVyIFwiJHtsYXllci5pZH1cImBcbiAgICAgICAgICAgICkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3VwZGF0ZWRTb3VyY2VzKS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zb3VyY2VDYWNoZXMpXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZUNhY2hlc1tpZF0ubG9hZGVkKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICghdGhpcy5pbWFnZU1hbmFnZXIuaXNMb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfc2VyaWFsaXplTGF5ZXJzKGlkczogQXJyYXk8c3RyaW5nPik6IEFycmF5PE9iamVjdD4ge1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkTGF5ZXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgICAgICBpZiAobGF5ZXIudHlwZSAhPT0gJ2N1c3RvbScpIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTGF5ZXJzLnB1c2gobGF5ZXIuc2VyaWFsaXplKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemVkTGF5ZXJzO1xuICAgIH1cblxuICAgIGhhc1RyYW5zaXRpb25zKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5saWdodCAmJiB0aGlzLmxpZ2h0Lmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb2cgJiYgdGhpcy5mb2cuaGFzVHJhbnNpdGlvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlQ2FjaGVzW2lkXS5oYXNUcmFuc2l0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGF5ZXJzW2lkXS5oYXNUcmFuc2l0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgb3JkZXIoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGlmICh0aGlzLm1hcC5fb3B0aW1pemVGb3JUZXJyYWluICYmIHRoaXMudGVycmFpbikge1xuICAgICAgICAgICAgYXNzZXJ0KHRoaXMuX2RyYXBlZEZpcnN0T3JkZXIubGVuZ3RoID09PSB0aGlzLl9vcmRlci5sZW5ndGgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYXBlZEZpcnN0T3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX29yZGVyO1xuICAgIH1cblxuICAgIGlzTGF5ZXJEcmFwZWQobGF5ZXI6IFN0eWxlTGF5ZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLnRlcnJhaW4pIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGRyYXBlZExheWVyc1tsYXllci50eXBlXTtcbiAgICB9XG5cbiAgICBfY2hlY2tMb2FkZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0eWxlIGlzIG5vdCBkb25lIGxvYWRpbmcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGx5IHF1ZXVlZCBzdHlsZSB1cGRhdGVzIGluIGEgYmF0Y2ggYW5kIHJlY2FsY3VsYXRlIHpvb20tZGVwZW5kZW50IHBhaW50IHByb3BlcnRpZXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB1cGRhdGUocGFyYW1ldGVyczogRXZhbHVhdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLl9jaGFuZ2VkO1xuICAgICAgICBpZiAodGhpcy5fY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZElkcyA9IE9iamVjdC5rZXlzKHRoaXMuX3VwZGF0ZWRMYXllcnMpO1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZElkcyA9IE9iamVjdC5rZXlzKHRoaXMuX3JlbW92ZWRMYXllcnMpO1xuXG4gICAgICAgICAgICBpZiAodXBkYXRlZElkcy5sZW5ndGggfHwgcmVtb3ZlZElkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVXb3JrZXJMYXllcnModXBkYXRlZElkcywgcmVtb3ZlZElkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3VwZGF0ZWRTb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5fdXBkYXRlZFNvdXJjZXNbaWRdO1xuICAgICAgICAgICAgICAgIGFzc2VydChhY3Rpb24gPT09ICdyZWxvYWQnIHx8IGFjdGlvbiA9PT0gJ2NsZWFyJyk7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ3JlbG9hZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkU291cmNlKGlkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2NsZWFyJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbGVhclNvdXJjZShpZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVUaWxlc0ZvckNoYW5nZWRJbWFnZXMoKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl91cGRhdGVkUGFpbnRQcm9wcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xheWVyc1tpZF0udXBkYXRlVHJhbnNpdGlvbnMocGFyYW1ldGVycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubGlnaHQudXBkYXRlVHJhbnNpdGlvbnMocGFyYW1ldGVycyk7XG4gICAgICAgICAgICBpZiAodGhpcy5mb2cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvZy51cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fcmVzZXRVcGRhdGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VzVXNlZEJlZm9yZSA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlSWQgaW4gdGhpcy5fc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuX3NvdXJjZUNhY2hlc1tzb3VyY2VJZF07XG4gICAgICAgICAgICBzb3VyY2VzVXNlZEJlZm9yZVtzb3VyY2VJZF0gPSBzb3VyY2VDYWNoZS51c2VkO1xuICAgICAgICAgICAgc291cmNlQ2FjaGUudXNlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIHRoaXMuX29yZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcblxuICAgICAgICAgICAgbGF5ZXIucmVjYWxjdWxhdGUocGFyYW1ldGVycywgdGhpcy5fYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgICAgIGlmICghbGF5ZXIuaXNIaWRkZW4ocGFyYW1ldGVycy56b29tKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5fZ2V0TGF5ZXJTb3VyY2VDYWNoZShsYXllcik7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlKSBzb3VyY2VDYWNoZS51c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFpbnRlciA9IHRoaXMubWFwLnBhaW50ZXI7XG4gICAgICAgICAgICBpZiAocGFpbnRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2dyYW1JZHMgPSBsYXllci5nZXRQcm9ncmFtSWRzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9ncmFtSWRzKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gbGF5ZXIuZ2V0UHJvZ3JhbUNvbmZpZ3VyYXRpb24ocGFyYW1ldGVycy56b29tKTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvZ3JhbUlkIG9mIHByb2dyYW1JZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFpbnRlci51c2VQcm9ncmFtKHByb2dyYW1JZCwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlSWQgaW4gc291cmNlc1VzZWRCZWZvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5fc291cmNlQ2FjaGVzW3NvdXJjZUlkXTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VzVXNlZEJlZm9yZVtzb3VyY2VJZF0gIT09IHNvdXJjZUNhY2hlLnVzZWQpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtzb3VyY2VEYXRhVHlwZTogJ3Zpc2liaWxpdHknLCBkYXRhVHlwZTonc291cmNlJywgc291cmNlSWQ6IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLmlkfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saWdodC5yZWNhbGN1bGF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgaWYgKHRoaXMudGVycmFpbikge1xuICAgICAgICAgICAgdGhpcy50ZXJyYWluLnJlY2FsY3VsYXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZvZykge1xuICAgICAgICAgICAgdGhpcy5mb2cucmVjYWxjdWxhdGUocGFyYW1ldGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy56ID0gcGFyYW1ldGVycy56b29tO1xuXG4gICAgICAgIGlmICh0aGlzLl9tYXJrZXJzTmVlZFVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWFya2Vyc09wYWNpdHkoKTtcbiAgICAgICAgICAgIHRoaXMuX21hcmtlcnNOZWVkVXBkYXRlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogQXBwbHkgYW55IHF1ZXVlZCBpbWFnZSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIF91cGRhdGVUaWxlc0ZvckNoYW5nZWRJbWFnZXMoKSB7XG4gICAgICAgIGNvbnN0IGNoYW5nZWRJbWFnZXMgPSBPYmplY3Qua2V5cyh0aGlzLl9jaGFuZ2VkSW1hZ2VzKTtcbiAgICAgICAgaWYgKGNoYW5nZWRJbWFnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdGhpcy5fc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc291cmNlQ2FjaGVzW25hbWVdLnJlbG9hZFRpbGVzRm9yRGVwZW5kZW5jaWVzKFsnaWNvbnMnLCAncGF0dGVybnMnXSwgY2hhbmdlZEltYWdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VkSW1hZ2VzID0ge307XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlV29ya2VyTGF5ZXJzKHVwZGF0ZWRJZHM6IEFycmF5PHN0cmluZz4sIHJlbW92ZWRJZHM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgndXBkYXRlTGF5ZXJzJywge1xuICAgICAgICAgICAgbGF5ZXJzOiB0aGlzLl9zZXJpYWxpemVMYXllcnModXBkYXRlZElkcyksXG4gICAgICAgICAgICByZW1vdmVkSWRzXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZXNldFVwZGF0ZXMoKSB7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl91cGRhdGVkTGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuX3JlbW92ZWRMYXllcnMgPSB7fTtcblxuICAgICAgICB0aGlzLl91cGRhdGVkU291cmNlcyA9IHt9O1xuICAgICAgICB0aGlzLl91cGRhdGVkUGFpbnRQcm9wcyA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2NoYW5nZWRJbWFnZXMgPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhpcyBzdHlsZSdzIHN0YXRlIHRvIG1hdGNoIHRoZSBnaXZlbiBzdHlsZSBKU09OLCBwZXJmb3JtaW5nIG9ubHlcbiAgICAgKiB0aGUgbmVjZXNzYXJ5IG11dGF0aW9ucy5cbiAgICAgKlxuICAgICAqIE1heSB0aHJvdyBhbiBFcnJvciAoJ1VuaW1wbGVtZW50ZWQ6IE1FVEhPRCcpIGlmIHRoZSBtYXBib3gtZ2wtc3R5bGUtc3BlY1xuICAgICAqIGRpZmYgYWxnb3JpdGhtIHByb2R1Y2VzIGFuIG9wZXJhdGlvbiB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhbnkgY2hhbmdlcyB3ZXJlIG1hZGU7IGZhbHNlIG90aGVyd2lzZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2V0U3RhdGUobmV4dFN0YXRlOiBTdHlsZVNwZWNpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBpZiAoZW1pdFZhbGlkYXRpb25FcnJvcnModGhpcywgdmFsaWRhdGVTdHlsZShuZXh0U3RhdGUpKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIG5leHRTdGF0ZSA9IGNsb25lKG5leHRTdGF0ZSk7XG4gICAgICAgIG5leHRTdGF0ZS5sYXllcnMgPSBkZXJlZihuZXh0U3RhdGUubGF5ZXJzKTtcblxuICAgICAgICBjb25zdCBjaGFuZ2VzID0gZGlmZlN0eWxlcyh0aGlzLnNlcmlhbGl6ZSgpLCBuZXh0U3RhdGUpXG4gICAgICAgICAgICAuZmlsdGVyKG9wID0+ICEob3AuY29tbWFuZCBpbiBpZ25vcmVkRGlmZk9wZXJhdGlvbnMpKTtcblxuICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaW1wbGVtZW50ZWRPcHMgPSBjaGFuZ2VzLmZpbHRlcihvcCA9PiAhKG9wLmNvbW1hbmQgaW4gc3VwcG9ydGVkRGlmZk9wZXJhdGlvbnMpKTtcbiAgICAgICAgaWYgKHVuaW1wbGVtZW50ZWRPcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkOiAke3VuaW1wbGVtZW50ZWRPcHMubWFwKG9wID0+IG9wLmNvbW1hbmQpLmpvaW4oJywgJyl9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hhbmdlcy5mb3JFYWNoKChvcCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wLmNvbW1hbmQgPT09ICdzZXRUcmFuc2l0aW9uJykge1xuICAgICAgICAgICAgICAgIC8vIGB0cmFuc2l0aW9uYCBpcyBhbHdheXMgcmVhZCBkaXJlY3RseSBvZmYgb2ZcbiAgICAgICAgICAgICAgICAvLyBgdGhpcy5zdHlsZXNoZWV0YCwgd2hpY2ggd2UgdXBkYXRlIGJlbG93XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKHRoaXM6IGFueSlbb3AuY29tbWFuZF0uYXBwbHkodGhpcywgb3AuYXJncyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3R5bGVzaGVldCA9IG5leHRTdGF0ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlTWFwUHJvamVjdGlvbigpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFkZEltYWdlKGlkOiBzdHJpbmcsIGltYWdlOiBTdHlsZUltYWdlKTogdGhpcyB7XG4gICAgICAgIGlmICh0aGlzLmdldEltYWdlKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoJ0FuIGltYWdlIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLicpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuYWRkSW1hZ2UoaWQsIGltYWdlKTtcbiAgICAgICAgdGhpcy5fYWZ0ZXJJbWFnZVVwZGF0ZWQoaWQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB1cGRhdGVJbWFnZShpZDogc3RyaW5nLCBpbWFnZTogU3R5bGVJbWFnZSkge1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlci51cGRhdGVJbWFnZShpZCwgaW1hZ2UpO1xuICAgIH1cblxuICAgIGdldEltYWdlKGlkOiBzdHJpbmcpOiA/U3R5bGVJbWFnZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlTWFuYWdlci5nZXRJbWFnZShpZCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSW1hZ2UoaWQ6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMuZ2V0SW1hZ2UoaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcignTm8gaW1hZ2Ugd2l0aCB0aGlzIG5hbWUgZXhpc3RzLicpKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIucmVtb3ZlSW1hZ2UoaWQpO1xuICAgICAgICB0aGlzLl9hZnRlckltYWdlVXBkYXRlZChpZCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9hZnRlckltYWdlVXBkYXRlZChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZUltYWdlcyA9IHRoaXMuaW1hZ2VNYW5hZ2VyLmxpc3RJbWFnZXMoKTtcbiAgICAgICAgdGhpcy5fY2hhbmdlZEltYWdlc1tpZF0gPSB0cnVlO1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnc2V0SW1hZ2VzJywgdGhpcy5fYXZhaWxhYmxlSW1hZ2VzKTtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZGF0YScsIHtkYXRhVHlwZTogJ3N0eWxlJ30pKTtcbiAgICB9XG5cbiAgICBsaXN0SW1hZ2VzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fYXZhaWxhYmxlSW1hZ2VzLnNsaWNlKCk7XG4gICAgfVxuXG4gICAgYWRkU291cmNlKGlkOiBzdHJpbmcsIHNvdXJjZTogU291cmNlU3BlY2lmaWNhdGlvbiwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBpZiAodGhpcy5nZXRTb3VyY2UoaWQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgYWxyZWFkeSBhIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc291cmNlLnR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHR5cGUgcHJvcGVydHkgbXVzdCBiZSBkZWZpbmVkLCBidXQgb25seSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgd2VyZSBnaXZlbjogJHtPYmplY3Qua2V5cyhzb3VyY2UpLmpvaW4oJywgJyl9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVpbHRJbnMgPSBbJ3ZlY3RvcicsICdyYXN0ZXInLCAnZ2VvanNvbicsICd2aWRlbycsICdpbWFnZSddO1xuICAgICAgICBjb25zdCBzaG91bGRWYWxpZGF0ZSA9IGJ1aWx0SW5zLmluZGV4T2Yoc291cmNlLnR5cGUpID49IDA7XG4gICAgICAgIGlmIChzaG91bGRWYWxpZGF0ZSAmJiB0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVNvdXJjZSwgYHNvdXJjZXMuJHtpZH1gLCBzb3VyY2UsIG51bGwsIG9wdGlvbnMpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMubWFwICYmIHRoaXMubWFwLl9jb2xsZWN0UmVzb3VyY2VUaW1pbmcpIChzb3VyY2U6IGFueSkuY29sbGVjdFJlc291cmNlVGltaW5nID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZVNvdXJjZShpZCwgc291cmNlLCB0aGlzLmRpc3BhdGNoZXIsIHRoaXMpO1xuXG4gICAgICAgIHNvdXJjZUluc3RhbmNlLnNldEV2ZW50ZWRQYXJlbnQodGhpcywgKCkgPT4gKHtcbiAgICAgICAgICAgIGlzU291cmNlTG9hZGVkOiB0aGlzLl9pc1NvdXJjZUNhY2hlTG9hZGVkKGlkKSxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlSW5zdGFuY2Uuc2VyaWFsaXplKCksXG4gICAgICAgICAgICBzb3VyY2VJZDogaWRcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnN0IGFkZFNvdXJjZUNhY2hlID0gKG9ubHlTeW1ib2xzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZUlkID0gKG9ubHlTeW1ib2xzID8gJ3N5bWJvbDonIDogJ290aGVyOicpICsgaWQ7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuX3NvdXJjZUNhY2hlc1tzb3VyY2VDYWNoZUlkXSA9IG5ldyBTb3VyY2VDYWNoZShzb3VyY2VDYWNoZUlkLCBzb3VyY2VJbnN0YW5jZSwgb25seVN5bWJvbHMpO1xuICAgICAgICAgICAgKG9ubHlTeW1ib2xzID8gdGhpcy5fc3ltYm9sU291cmNlQ2FjaGVzIDogdGhpcy5fb3RoZXJTb3VyY2VDYWNoZXMpW2lkXSA9IHNvdXJjZUNhY2hlO1xuICAgICAgICAgICAgc291cmNlQ2FjaGUuc3R5bGUgPSB0aGlzO1xuXG4gICAgICAgICAgICBzb3VyY2VDYWNoZS5vbkFkZCh0aGlzLm1hcCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgYWRkU291cmNlQ2FjaGUoZmFsc2UpO1xuICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09ICd2ZWN0b3InIHx8IHNvdXJjZS50eXBlID09PSAnZ2VvanNvbicpIHtcbiAgICAgICAgICAgIGFkZFNvdXJjZUNhY2hlKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNvdXJjZUluc3RhbmNlLm9uQWRkKSBzb3VyY2VJbnN0YW5jZS5vbkFkZCh0aGlzLm1hcCk7XG5cbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgc291cmNlIGZyb20gdGhpcyBzdHlsZXNoZWV0LCBnaXZlbiBpdHMgSUQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIG9mIHRoZSBzb3VyY2UgdG8gcmVtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBubyBzb3VyY2UgaXMgZm91bmQgd2l0aCB0aGUgZ2l2ZW4gSUQuXG4gICAgICogQHJldHVybnMge01hcH0gVGhlIHtAbGluayBNYXB9IG9iamVjdC5cbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2UoaWQ6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKGlkKTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgbm8gc291cmNlIHdpdGggdGhpcyBJRCcpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXllcnNbbGF5ZXJJZF0uc291cmNlID09PSBpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBTb3VyY2UgXCIke2lkfVwiIGNhbm5vdCBiZSByZW1vdmVkIHdoaWxlIGxheWVyIFwiJHtsYXllcklkfVwiIGlzIHVzaW5nIGl0LmApKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGVycmFpbiAmJiB0aGlzLnRlcnJhaW4uZ2V0KCkuc291cmNlID09PSBpZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFNvdXJjZSBcIiR7aWR9XCIgY2Fubm90IGJlIHJlbW92ZWQgd2hpbGUgdGVycmFpbiBpcyB1c2luZyBpdC5gKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5fZ2V0U291cmNlQ2FjaGVzKGlkKTtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VDYWNoZSBvZiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VDYWNoZXNbc291cmNlQ2FjaGUuaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW3NvdXJjZUNhY2hlLmlkXTtcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlLmZpcmUobmV3IEV2ZW50KCdkYXRhJywge3NvdXJjZURhdGFUeXBlOiAnbWV0YWRhdGEnLCBkYXRhVHlwZTonc291cmNlJywgc291cmNlSWQ6IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLmlkfSkpO1xuICAgICAgICAgICAgc291cmNlQ2FjaGUuc2V0RXZlbnRlZFBhcmVudChudWxsKTtcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlLmNsZWFyVGlsZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdGhpcy5fb3RoZXJTb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5fc3ltYm9sU291cmNlQ2FjaGVzW2lkXTtcblxuICAgICAgICBzb3VyY2Uuc2V0RXZlbnRlZFBhcmVudChudWxsKTtcbiAgICAgICAgaWYgKHNvdXJjZS5vblJlbW92ZSkge1xuICAgICAgICAgICAgc291cmNlLm9uUmVtb3ZlKHRoaXMubWFwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBTZXQgdGhlIGRhdGEgb2YgYSBHZW9KU09OIHNvdXJjZSwgZ2l2ZW4gaXRzIElELlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIG9mIHRoZSBzb3VyY2UuXG4gICAgKiBAcGFyYW0ge0dlb0pTT058c3RyaW5nfSBkYXRhIEdlb0pTT04gc291cmNlLlxuICAgICovXG4gICAgc2V0R2VvSlNPTlNvdXJjZURhdGEoaWQ6IHN0cmluZywgZGF0YTogR2VvSlNPTiB8IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGFzc2VydCh0aGlzLmdldFNvdXJjZShpZCkgIT09IHVuZGVmaW5lZCwgJ1RoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgY29uc3QgZ2VvanNvblNvdXJjZTogR2VvSlNPTlNvdXJjZSA9ICh0aGlzLmdldFNvdXJjZShpZCk6IGFueSk7XG4gICAgICAgIGFzc2VydChnZW9qc29uU291cmNlLnR5cGUgPT09ICdnZW9qc29uJyk7XG5cbiAgICAgICAgZ2VvanNvblNvdXJjZS5zZXREYXRhKGRhdGEpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzb3VyY2UgYnkgSUQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIG9mIHRoZSBkZXNpcmVkIHNvdXJjZS5cbiAgICAgKiBAcmV0dXJucyB7P1NvdXJjZX0gVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0U291cmNlKGlkOiBzdHJpbmcpOiA/U291cmNlIHtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLl9nZXRTb3VyY2VDYWNoZShpZCk7XG4gICAgICAgIHJldHVybiBzb3VyY2VDYWNoZSAmJiBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBsYXllciB0byB0aGUgbWFwIHN0eWxlLiBUaGUgbGF5ZXIgd2lsbCBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIGxheWVyIHdpdGhcbiAgICAgKiBJRCBgYmVmb3JlYCwgb3IgYXBwZW5kZWQgaWYgYGJlZm9yZWAgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IEN1c3RvbUxheWVySW50ZXJmYWNlfSBsYXllck9iamVjdCBUaGUgc3R5bGUgbGF5ZXIgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYmVmb3JlXSBJRCBvZiBhbiBleGlzdGluZyBsYXllciB0byBpbnNlcnQgYmVmb3JlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFN0eWxlIHNldHRlciBvcHRpb25zLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFRoZSB7QGxpbmsgTWFwfSBvYmplY3QuXG4gICAgICovXG4gICAgYWRkTGF5ZXIobGF5ZXJPYmplY3Q6IExheWVyU3BlY2lmaWNhdGlvbiB8IEN1c3RvbUxheWVySW50ZXJmYWNlLCBiZWZvcmU/OiBzdHJpbmcsIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgaWQgPSBsYXllck9iamVjdC5pZDtcblxuICAgICAgICBpZiAodGhpcy5nZXRMYXllcihpZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYExheWVyIHdpdGggaWQgXCIke2lkfVwiIGFscmVhZHkgZXhpc3RzIG9uIHRoaXMgbWFwYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsYXllcjtcbiAgICAgICAgaWYgKGxheWVyT2JqZWN0LnR5cGUgPT09ICdjdXN0b20nKSB7XG5cbiAgICAgICAgICAgIGlmIChlbWl0VmFsaWRhdGlvbkVycm9ycyh0aGlzLCB2YWxpZGF0ZUN1c3RvbVN0eWxlTGF5ZXIobGF5ZXJPYmplY3QpKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBsYXllciA9IGNyZWF0ZVN0eWxlTGF5ZXIobGF5ZXJPYmplY3QpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGxheWVyT2JqZWN0LnNvdXJjZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNvdXJjZShpZCwgbGF5ZXJPYmplY3Quc291cmNlKTtcbiAgICAgICAgICAgICAgICBsYXllck9iamVjdCA9IGNsb25lKGxheWVyT2JqZWN0KTtcbiAgICAgICAgICAgICAgICBsYXllck9iamVjdCA9IChleHRlbmQobGF5ZXJPYmplY3QsIHtzb3VyY2U6IGlkfSk6IGFueSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHRoaXMgbGF5ZXIgaXMgbm90IGluIHRoZSBzdHlsZS5sYXllcnMgYXJyYXksIHNvIHdlIHBhc3MgYW4gaW1wb3NzaWJsZSBhcnJheSBpbmRleFxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlTGF5ZXIsXG4gICAgICAgICAgICAgICAgYGxheWVycy4ke2lkfWAsIGxheWVyT2JqZWN0LCB7YXJyYXlJbmRleDogLTF9LCBvcHRpb25zKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBsYXllciA9IGNyZWF0ZVN0eWxlTGF5ZXIobGF5ZXJPYmplY3QpO1xuICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVMYXllcihsYXllcik7XG5cbiAgICAgICAgICAgIGxheWVyLnNldEV2ZW50ZWRQYXJlbnQodGhpcywge2xheWVyOiB7aWR9fSk7XG4gICAgICAgICAgICB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzW2xheWVyLmlkXSA9IGxheWVyLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXJDb3VudChsYXllciwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IGJlZm9yZSA/IHRoaXMuX29yZGVyLmluZGV4T2YoYmVmb3JlKSA6IHRoaXMuX29yZGVyLmxlbmd0aDtcbiAgICAgICAgaWYgKGJlZm9yZSAmJiBpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYExheWVyIHdpdGggaWQgXCIke2JlZm9yZX1cIiBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIG1hcC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb3JkZXIuc3BsaWNlKGluZGV4LCAwLCBpZCk7XG4gICAgICAgIHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLl9sYXllcnNbaWRdID0gbGF5ZXI7XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLl9nZXRMYXllclNvdXJjZUNhY2hlKGxheWVyKTtcbiAgICAgICAgaWYgKHRoaXMuX3JlbW92ZWRMYXllcnNbaWRdICYmIGxheWVyLnNvdXJjZSAmJiBzb3VyY2VDYWNoZSAmJiBsYXllci50eXBlICE9PSAnY3VzdG9tJykge1xuICAgICAgICAgICAgLy8gSWYsIGluIHRoZSBjdXJyZW50IGJhdGNoLCB3ZSBoYXZlIGFscmVhZHkgcmVtb3ZlZCB0aGlzIGxheWVyXG4gICAgICAgICAgICAvLyBhbmQgd2UgYXJlIG5vdyByZS1hZGRpbmcgaXQgd2l0aCBhIGRpZmZlcmVudCBgdHlwZWAsIHRoZW4gd2VcbiAgICAgICAgICAgIC8vIG5lZWQgdG8gY2xlYXIgKHJhdGhlciB0aGFuIGp1c3QgcmVsb2FkKSB0aGUgdW5kZXJ5bGluZyBzb3VyY2Unc1xuICAgICAgICAgICAgLy8gdGlsZXMuICBPdGhlcndpc2UsIHRpbGVzIG1hcmtlZCAncmVsb2FkaW5nJyB3aWxsIGhhdmUgYnVja2V0cyAvXG4gICAgICAgICAgICAvLyBidWZmZXJzIHRoYXQgYXJlIHNldCB1cCBmb3IgdGhlIF9wcmV2aW91c18gdmVyc2lvbiBvZiB0aGlzXG4gICAgICAgICAgICAvLyBsYXllciwgY2F1c2luZywgZS5nLjpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8zNjMzXG4gICAgICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5fcmVtb3ZlZExheWVyc1tpZF07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fcmVtb3ZlZExheWVyc1tpZF07XG4gICAgICAgICAgICBpZiAocmVtb3ZlZC50eXBlICE9PSBsYXllci50eXBlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlZFNvdXJjZXNbbGF5ZXIuc291cmNlXSA9ICdjbGVhcic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gPSAncmVsb2FkJztcbiAgICAgICAgICAgICAgICBzb3VyY2VDYWNoZS5wYXVzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcblxuICAgICAgICBpZiAobGF5ZXIub25BZGQpIHtcbiAgICAgICAgICAgIGxheWVyLm9uQWRkKHRoaXMubWFwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZURyYXBlRmlyc3RMYXllcnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyBhIGxheWVyIHRvIGEgZGlmZmVyZW50IHotcG9zaXRpb24uIFRoZSBsYXllciB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgbGF5ZXIgd2l0aFxuICAgICAqIElEIGBiZWZvcmVgLCBvciBhcHBlbmRlZCBpZiBgYmVmb3JlYCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAgSUQgb2YgdGhlIGxheWVyIHRvIG1vdmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtiZWZvcmVdIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCBiZWZvcmUuXG4gICAgICovXG4gICAgbW92ZUxheWVyKGlkOiBzdHJpbmcsIGJlZm9yZT86IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBsYXllciAnJHtpZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIG1vdmVkLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaWQgPT09IGJlZm9yZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9vcmRlci5pbmRleE9mKGlkKTtcbiAgICAgICAgdGhpcy5fb3JkZXIuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGJlZm9yZSA/IHRoaXMuX29yZGVyLmluZGV4T2YoYmVmb3JlKSA6IHRoaXMuX29yZGVyLmxlbmd0aDtcbiAgICAgICAgaWYgKGJlZm9yZSAmJiBuZXdJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYExheWVyIHdpdGggaWQgXCIke2JlZm9yZX1cIiBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIG1hcC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShuZXdJbmRleCwgMCwgaWQpO1xuXG4gICAgICAgIHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLl91cGRhdGVEcmFwZUZpcnN0TGF5ZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBsYXllciB3aXRoIHRoZSBnaXZlbiBpZCBmcm9tIHRoZSBzdHlsZS5cbiAgICAgKlxuICAgICAqIElmIG5vIHN1Y2ggbGF5ZXIgZXhpc3RzLCBhbiBgZXJyb3JgIGV2ZW50IGlzIGZpcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIG9mIHRoZSBsYXllciB0byByZW1vdmUuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDplcnJvclxuICAgICAqL1xuICAgIHJlbW92ZUxheWVyKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBsYXllciAnJHtpZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHJlbW92ZWQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxheWVyLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXJDb3VudChsYXllciwgZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb3JkZXIuaW5kZXhPZihpZCk7XG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJPcmRlckNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlZExheWVyc1tpZF0gPSBsYXllcjtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3VwZGF0ZWRMYXllcnNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5fdXBkYXRlZFBhaW50UHJvcHNbaWRdO1xuXG4gICAgICAgIGlmIChsYXllci5vblJlbW92ZSkge1xuICAgICAgICAgICAgbGF5ZXIub25SZW1vdmUodGhpcy5tYXApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlRHJhcGVGaXJzdExheWVycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgc3R5bGUgbGF5ZXIgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGBpZGAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgb2YgdGhlIGRlc2lyZWQgbGF5ZXIuXG4gICAgICogQHJldHVybnMgez9TdHlsZUxheWVyfSBBIGxheWVyLCBpZiBvbmUgd2l0aCB0aGUgZ2l2ZW4gYGlkYCBleGlzdHMuXG4gICAgICovXG4gICAgZ2V0TGF5ZXIoaWQ6IHN0cmluZyk6ID9TdHlsZUxheWVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xheWVyc1tpZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3BlY2lmaWMgbGF5ZXIgaXMgcHJlc2VudCB3aXRoaW4gdGhlIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIG9mIHRoZSBkZXNpcmVkIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIGJvb2xlYW4gc3BlY2lmeWluZyBpZiB0aGUgZ2l2ZW4gbGF5ZXIgaXMgcHJlc2VudC5cbiAgICAgKi9cbiAgICBoYXNMYXllcihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpZCBpbiB0aGlzLl9sYXllcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgc3BlY2lmaWMgbGF5ZXIgdHlwZSBpcyBwcmVzZW50IHdpdGhpbiB0aGUgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUeXBlIG9mIHRoZSBkZXNpcmVkIGxheWVyLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIGJvb2xlYW4gc3BlY2lmeWluZyBpZiB0aGUgZ2l2ZW4gbGF5ZXIgdHlwZSBpcyBwcmVzZW50LlxuICAgICAqL1xuICAgIGhhc0xheWVyVHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJZF07XG4gICAgICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzZXRMYXllclpvb21SYW5nZShsYXllcklkOiBzdHJpbmcsIG1pbnpvb206ID9udW1iZXIsIG1heHpvb206ID9udW1iZXIpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBsYXllciAnJHtsYXllcklkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgaGF2ZSB6b29tIGV4dGVudC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxheWVyLm1pbnpvb20gPT09IG1pbnpvb20gJiYgbGF5ZXIubWF4em9vbSA9PT0gbWF4em9vbSkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChtaW56b29tICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxheWVyLm1pbnpvb20gPSBtaW56b29tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXh6b29tICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxheWVyLm1heHpvb20gPSBtYXh6b29tO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICB9XG5cbiAgICBzZXRGaWx0ZXIobGF5ZXJJZDogc3RyaW5nLCBmaWx0ZXI6ID9GaWx0ZXJTcGVjaWZpY2F0aW9uLCAgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBsYXllciAnJHtsYXllcklkfScgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgZmlsdGVyZWQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWVwRXF1YWwobGF5ZXIuZmlsdGVyLCBmaWx0ZXIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVyID09PSBudWxsIHx8IGZpbHRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXllci5maWx0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVGaWx0ZXIsIGBsYXllcnMuJHtsYXllci5pZH0uZmlsdGVyYCwgZmlsdGVyLCB7bGF5ZXJUeXBlOiBsYXllci50eXBlfSwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxheWVyLmZpbHRlciA9IGNsb25lKGZpbHRlcik7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsYXllcidzIGZpbHRlciBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIGxheWVyIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSBsYXllcidzIGZpbHRlciwgaWYgYW55LlxuICAgICAqL1xuICAgIGdldEZpbHRlcihsYXllcklkOiBzdHJpbmcpOiA/RmlsdGVyU3BlY2lmaWNhdGlvbiB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcklkKTtcbiAgICAgICAgcmV0dXJuIGxheWVyICYmIGNsb25lKGxheWVyLmZpbHRlcik7XG4gICAgfVxuXG4gICAgc2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksICBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcklkKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGxheWVyICcke2xheWVySWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBzdHlsZWQuYCkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWVwRXF1YWwobGF5ZXIuZ2V0TGF5b3V0UHJvcGVydHkobmFtZSksIHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgICAgIGxheWVyLnNldExheW91dFByb3BlcnR5KG5hbWUsIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXIobGF5ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGxheW91dCBwcm9wZXJ0eSdzIHZhbHVlIGZyb20gYSBnaXZlbiBsYXllci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgbGF5ZXIgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbGF5b3V0IHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHsqfSBUaGUgcHJvcGVydHkgdmFsdWUuXG4gICAgICovXG4gICAgZ2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiA/UHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248bWl4ZWQ+IHtcbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxheWVyLmdldExheW91dFByb3BlcnR5KG5hbWUpO1xuICAgIH1cblxuICAgIHNldFBhaW50UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHN0eWxlZC5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZXBFcXVhbChsYXllci5nZXRQYWludFByb3BlcnR5KG5hbWUpLCB2YWx1ZSkpIHJldHVybjtcblxuICAgICAgICBjb25zdCByZXF1aXJlc1JlbGF5b3V0ID0gbGF5ZXIuc2V0UGFpbnRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChyZXF1aXJlc1JlbGF5b3V0KSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlZFBhaW50UHJvcHNbbGF5ZXJJZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIGdldFBhaW50UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHwgVHJhbnNpdGlvblNwZWNpZmljYXRpb24gfCBQcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxtaXhlZD4ge1xuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgICAgIHJldHVybiBsYXllciAmJiBsYXllci5nZXRQYWludFByb3BlcnR5KG5hbWUpO1xuICAgIH1cblxuICAgIHNldEZlYXR1cmVTdGF0ZSh0YXJnZXQ6IHsgc291cmNlOiBzdHJpbmc7IHNvdXJjZUxheWVyPzogc3RyaW5nOyBpZDogc3RyaW5nIHwgbnVtYmVyOyB9LCBzdGF0ZTogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gdGFyZ2V0LnNvdXJjZTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB0YXJnZXQuc291cmNlTGF5ZXI7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKHNvdXJjZUlkKTtcblxuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZSAnJHtzb3VyY2VJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBzb3VyY2UudHlwZTtcbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgPT09ICdnZW9qc29uJyAmJiBzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgR2VvSlNPTiBzb3VyY2VzIGNhbm5vdCBoYXZlIGEgc291cmNlTGF5ZXIgcGFyYW1ldGVyLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmICFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZUxheWVyIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkIGZvciB2ZWN0b3Igc291cmNlIHR5cGVzLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldC5pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgZmVhdHVyZSBpZCBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZC5gKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5fZ2V0U291cmNlQ2FjaGVzKHNvdXJjZUlkKTtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VDYWNoZSBvZiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlLnNldEZlYXR1cmVTdGF0ZShzb3VyY2VMYXllciwgdGFyZ2V0LmlkLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVGZWF0dXJlU3RhdGUodGFyZ2V0OiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ/OiBzdHJpbmcgfCBudW1iZXI7IH0sIGtleT86IHN0cmluZykge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VJZCA9IHRhcmdldC5zb3VyY2U7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKHNvdXJjZUlkKTtcblxuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZSAnJHtzb3VyY2VJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlVHlwZSA9IHNvdXJjZS50eXBlO1xuICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InID8gdGFyZ2V0LnNvdXJjZUxheWVyIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChzb3VyY2VUeXBlID09PSAndmVjdG9yJyAmJiAhc291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZSBzb3VyY2VMYXllciBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZCBmb3IgdmVjdG9yIHNvdXJjZSB0eXBlcy5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSAmJiAodHlwZW9mIHRhcmdldC5pZCAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHRhcmdldC5pZCAhPT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBBIGZlYXR1cmUgaWQgaXMgcmVxdWlyZWQgdG8gcmVtb3ZlIGl0cyBzcGVjaWZpYyBzdGF0ZSBwcm9wZXJ0eS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5fZ2V0U291cmNlQ2FjaGVzKHNvdXJjZUlkKTtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VDYWNoZSBvZiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlLnJlbW92ZUZlYXR1cmVTdGF0ZShzb3VyY2VMYXllciwgdGFyZ2V0LmlkLCBrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0RmVhdHVyZVN0YXRlKHRhcmdldDogeyBzb3VyY2U6IHN0cmluZzsgc291cmNlTGF5ZXI/OiBzdHJpbmc7IGlkOiBzdHJpbmcgfCBudW1iZXI7IH0pOiA/RmVhdHVyZVN0YXRlcyB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUlkID0gdGFyZ2V0LnNvdXJjZTtcbiAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSB0YXJnZXQuc291cmNlTGF5ZXI7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKHNvdXJjZUlkKTtcblxuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZSAnJHtzb3VyY2VJZH0nIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtYXAncyBzdHlsZS5gKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBzb3VyY2UudHlwZTtcbiAgICAgICAgaWYgKHNvdXJjZVR5cGUgPT09ICd2ZWN0b3InICYmICFzb3VyY2VMYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIHNvdXJjZUxheWVyIHBhcmFtZXRlciBtdXN0IGJlIHByb3ZpZGVkIGZvciB2ZWN0b3Igc291cmNlIHR5cGVzLmApKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldC5pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKGBUaGUgZmVhdHVyZSBpZCBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZC5gKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5fZ2V0U291cmNlQ2FjaGVzKHNvdXJjZUlkKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUNhY2hlc1swXS5nZXRGZWF0dXJlU3RhdGUoc291cmNlTGF5ZXIsIHRhcmdldC5pZCk7XG4gICAgfVxuXG4gICAgZ2V0VHJhbnNpdGlvbigpOiBUcmFuc2l0aW9uU3BlY2lmaWNhdGlvbiB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe2R1cmF0aW9uOiAzMDAsIGRlbGF5OiAwfSwgdGhpcy5zdHlsZXNoZWV0ICYmIHRoaXMuc3R5bGVzaGVldC50cmFuc2l0aW9uKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogU3R5bGVTcGVjaWZpY2F0aW9uIHtcbiAgICAgICAgY29uc3Qgc291cmNlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNhY2hlSWQgaW4gdGhpcy5fc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLl9zb3VyY2VDYWNoZXNbY2FjaGVJZF0uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZXNbc291cmNlLmlkXSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZXNbc291cmNlLmlkXSA9IHNvdXJjZS5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyT2JqZWN0KHtcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMuc3R5bGVzaGVldC52ZXJzaW9uLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5zdHlsZXNoZWV0Lm5hbWUsXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5zdHlsZXNoZWV0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgbGlnaHQ6IHRoaXMuc3R5bGVzaGVldC5saWdodCxcbiAgICAgICAgICAgIHRlcnJhaW46IHRoaXMuc3R5bGVzaGVldC50ZXJyYWluLFxuICAgICAgICAgICAgZm9nOiB0aGlzLnN0eWxlc2hlZXQuZm9nLFxuICAgICAgICAgICAgY2VudGVyOiB0aGlzLnN0eWxlc2hlZXQuY2VudGVyLFxuICAgICAgICAgICAgem9vbTogdGhpcy5zdHlsZXNoZWV0Lnpvb20sXG4gICAgICAgICAgICBiZWFyaW5nOiB0aGlzLnN0eWxlc2hlZXQuYmVhcmluZyxcbiAgICAgICAgICAgIHBpdGNoOiB0aGlzLnN0eWxlc2hlZXQucGl0Y2gsXG4gICAgICAgICAgICBzcHJpdGU6IHRoaXMuc3R5bGVzaGVldC5zcHJpdGUsXG4gICAgICAgICAgICBnbHlwaHM6IHRoaXMuc3R5bGVzaGVldC5nbHlwaHMsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbixcbiAgICAgICAgICAgIHByb2plY3Rpb246IHRoaXMuc3R5bGVzaGVldC5wcm9qZWN0aW9uLFxuICAgICAgICAgICAgc291cmNlcyxcbiAgICAgICAgICAgIGxheWVyczogdGhpcy5fc2VyaWFsaXplTGF5ZXJzKHRoaXMuX29yZGVyKVxuICAgICAgICB9LCAodmFsdWUpID0+IHsgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQ7IH0pO1xuICAgIH1cblxuICAgIF91cGRhdGVMYXllcihsYXllcjogU3R5bGVMYXllcikge1xuICAgICAgICB0aGlzLl91cGRhdGVkTGF5ZXJzW2xheWVyLmlkXSA9IHRydWU7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5fZ2V0TGF5ZXJTb3VyY2VDYWNoZShsYXllcik7XG4gICAgICAgIGlmIChsYXllci5zb3VyY2UgJiYgIXRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gJiZcbiAgICAgICAgICAgIC8vU2tpcCBmb3IgcmFzdGVyIGxheWVycyAoaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzc4NjUpXG4gICAgICAgICAgICBzb3VyY2VDYWNoZSAmJlxuICAgICAgICAgICAgc291cmNlQ2FjaGUuZ2V0U291cmNlKCkudHlwZSAhPT0gJ3Jhc3RlcicpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gPSAncmVsb2FkJztcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGxheWVyLmludmFsaWRhdGVDb21waWxlZEZpbHRlcigpO1xuXG4gICAgfVxuXG4gICAgX2ZsYXR0ZW5BbmRTb3J0UmVuZGVyZWRGZWF0dXJlcyhzb3VyY2VSZXN1bHRzOiBBcnJheTxhbnk+KTogQXJyYXk8bWl4ZWQ+IHtcbiAgICAgICAgLy8gRmVhdHVyZSBvcmRlciBpcyBjb21wbGljYXRlZC5cbiAgICAgICAgLy8gVGhlIG9yZGVyIGJldHdlZW4gZmVhdHVyZXMgaW4gdHdvIDJEIGxheWVycyBpcyBhbHdheXMgZGV0ZXJtaW5lZCBieSBsYXllciBvcmRlci5cbiAgICAgICAgLy8gVGhlIG9yZGVyIGJldHdlZW4gZmVhdHVyZXMgaW4gdHdvIDNEIGxheWVycyBpcyBhbHdheXMgZGV0ZXJtaW5lZCBieSBkZXB0aC5cbiAgICAgICAgLy8gVGhlIG9yZGVyIGJldHdlZW4gYSBmZWF0dXJlIGluIGEgMkQgbGF5ZXIgYW5kIGEgM0QgbGF5ZXIgaXMgdHJpY2t5OlxuICAgICAgICAvLyAgICAgIE1vc3Qgb2Z0ZW4gbGF5ZXIgb3JkZXIgZGV0ZXJtaW5lcyB0aGUgZmVhdHVyZSBvcmRlciBpbiB0aGlzIGNhc2UuIElmXG4gICAgICAgIC8vICAgICAgYSBsaW5lIGxheWVyIGlzIGFib3ZlIGEgZXh0cnVzaW9uIGxheWVyIHRoZSBsaW5lIGZlYXR1cmUgd2lsbCBiZSByZW5kZXJlZFxuICAgICAgICAvLyAgICAgIGFib3ZlIHRoZSBleHRydXNpb24uIElmIHRoZSBsaW5lIGxheWVyIGlzIGJlbG93IHRoZSBleHRydXNpb24gbGF5ZXIsXG4gICAgICAgIC8vICAgICAgaXQgd2lsbCBiZSByZW5kZXJlZCBiZWxvdyBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBUaGVyZSBpcyBhIHdlaXJkIGNhc2UgdGhvdWdoLlxuICAgICAgICAvLyAgICAgIFlvdSBoYXZlIGxheWVycyBpbiB0aGlzIG9yZGVyOiBleHRydXNpb25fbGF5ZXJfYSwgbGluZV9sYXllciwgZXh0cnVzaW9uX2xheWVyX2JcbiAgICAgICAgLy8gICAgICBFYWNoIGxheWVyIGhhcyBhIGZlYXR1cmUgdGhhdCBvdmVybGFwcyB0aGUgb3RoZXIgZmVhdHVyZXMuXG4gICAgICAgIC8vICAgICAgVGhlIGZlYXR1cmUgaW4gZXh0cnVzaW9uX2xheWVyX2EgaXMgY2xvc2VyIHRoYW4gdGhlIGZlYXR1cmUgaW4gZXh0cnVzaW9uX2xheWVyX2Igc28gaXQgaXMgcmVuZGVyZWQgYWJvdmUuXG4gICAgICAgIC8vICAgICAgVGhlIGZlYXR1cmUgaW4gbGluZV9sYXllciBpcyByZW5kZXJlZCBhYm92ZSBleHRydXNpb25fbGF5ZXJfYS5cbiAgICAgICAgLy8gICAgICBUaGlzIG1lYW5zIHRoYXQgdGhhdCB0aGUgbGluZV9sYXllciBmZWF0dXJlIGlzIGFib3ZlIHRoZSBleHRydXNpb25fbGF5ZXJfYiBmZWF0dXJlIGRlc3BpdGVcbiAgICAgICAgLy8gICAgICBpdCBiZWluZyBpbiBhbiBlYXJsaWVyIGxheWVyLlxuXG4gICAgICAgIGNvbnN0IGlzTGF5ZXIzRCA9IGxheWVySWQgPT4gdGhpcy5fbGF5ZXJzW2xheWVySWRdLnR5cGUgPT09ICdmaWxsLWV4dHJ1c2lvbic7XG5cbiAgICAgICAgY29uc3QgbGF5ZXJJbmRleCA9IHt9O1xuICAgICAgICBjb25zdCBmZWF0dXJlczNEID0gW107XG4gICAgICAgIGZvciAobGV0IGwgPSB0aGlzLl9vcmRlci5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHRoaXMuX29yZGVyW2xdO1xuICAgICAgICAgICAgaWYgKGlzTGF5ZXIzRChsYXllcklkKSkge1xuICAgICAgICAgICAgICAgIGxheWVySW5kZXhbbGF5ZXJJZF0gPSBsO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlUmVzdWx0IG9mIHNvdXJjZVJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF5ZXJGZWF0dXJlcyA9IHNvdXJjZVJlc3VsdFtsYXllcklkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxheWVyRmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmVhdHVyZVdyYXBwZXIgb2YgbGF5ZXJGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzM0QucHVzaChmZWF0dXJlV3JhcHBlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmZWF0dXJlczNELnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBiLmludGVyc2VjdGlvblogLSBhLmludGVyc2VjdGlvblo7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gW107XG4gICAgICAgIGZvciAobGV0IGwgPSB0aGlzLl9vcmRlci5sZW5ndGggLSAxOyBsID49IDA7IGwtLSkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJJZCA9IHRoaXMuX29yZGVyW2xdO1xuXG4gICAgICAgICAgICBpZiAoaXNMYXllcjNEKGxheWVySWQpKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGFsbCAzRCBmZWF0dXJlcyB0aGF0IGFyZSBpbiBvciBhYm92ZSB0aGUgY3VycmVudCBsYXllclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBmZWF0dXJlczNELmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvcG1vc3QzRCA9IGZlYXR1cmVzM0RbaV0uZmVhdHVyZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxheWVySW5kZXhbdG9wbW9zdDNELmxheWVyLmlkXSA8IGwpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcy5wdXNoKHRvcG1vc3QzRCk7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzM0QucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZVJlc3VsdCBvZiBzb3VyY2VSZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyRmVhdHVyZXMgPSBzb3VyY2VSZXN1bHRbbGF5ZXJJZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXllckZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmVXcmFwcGVyIG9mIGxheWVyRmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcy5wdXNoKGZlYXR1cmVXcmFwcGVyLmZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzO1xuICAgIH1cblxuICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhxdWVyeUdlb21ldHJ5OiBQb2ludExpa2UgfCBbUG9pbnRMaWtlLCBQb2ludExpa2VdLCBwYXJhbXM6IGFueSwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBBcnJheTxRdWVyeVJlc3VsdD4ge1xuICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlRmlsdGVyLCAncXVlcnlSZW5kZXJlZEZlYXR1cmVzLmZpbHRlcicsIHBhcmFtcy5maWx0ZXIsIG51bGwsIHBhcmFtcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmNsdWRlZFNvdXJjZXMgPSB7fTtcbiAgICAgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMubGF5ZXJzKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLmxheWVycykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKCdwYXJhbWV0ZXJzLmxheWVycyBtdXN0IGJlIGFuIEFycmF5LicpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIHBhcmFtcy5sYXllcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbGF5ZXIgaXMgbm90IGluIHRoZSBzdHlsZS5sYXllcnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihgVGhlIGxheWVyICcke2xheWVySWR9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBxdWVyaWVkIGZvciBmZWF0dXJlcy5gKSkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGluY2x1ZGVkU291cmNlc1tsYXllci5zb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVJlc3VsdHM6IEFycmF5PFF1ZXJ5UmVzdWx0PiA9IFtdO1xuXG4gICAgICAgIHBhcmFtcy5hdmFpbGFibGVJbWFnZXMgPSB0aGlzLl9hdmFpbGFibGVJbWFnZXM7XG5cbiAgICAgICAgY29uc3QgaGFzM0RMYXllciA9IChwYXJhbXMgJiYgcGFyYW1zLmxheWVycykgP1xuICAgICAgICAgICAgcGFyYW1zLmxheWVycy5zb21lKChsYXllcklkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmdldExheWVyKGxheWVySWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBsYXllciAmJiBsYXllci5pczNEKCk7XG4gICAgICAgICAgICB9KSA6XG4gICAgICAgICAgICB0aGlzLmhhczNETGF5ZXJzKCk7XG4gICAgICAgIGNvbnN0IHF1ZXJ5R2VvbWV0cnlTdHJ1Y3QgPSBRdWVyeUdlb21ldHJ5LmNyZWF0ZUZyb21TY3JlZW5Qb2ludHMocXVlcnlHZW9tZXRyeSwgdHJhbnNmb3JtKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3NvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlSWQgPSB0aGlzLl9zb3VyY2VDYWNoZXNbaWRdLmdldFNvdXJjZSgpLmlkO1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5sYXllcnMgJiYgIWluY2x1ZGVkU291cmNlc1tzb3VyY2VJZF0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgc291cmNlUmVzdWx0cy5wdXNoKFxuICAgICAgICAgICAgICAgIHF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc291cmNlQ2FjaGVzW2lkXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXJpYWxpemVkTGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeUdlb21ldHJ5U3RydWN0LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgaGFzM0RMYXllcixcbiAgICAgICAgICAgICAgICAgICAgISF0aGlzLm1hcC5fc2hvd1F1ZXJ5R2VvbWV0cnkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICAvLyBJZiBhIHBsYWNlbWVudCBoYXMgcnVuLCBxdWVyeSBhZ2FpbnN0IGl0cyBDb2xsaXNpb25JbmRleFxuICAgICAgICAgICAgLy8gZm9yIHN5bWJvbCByZXN1bHRzLCBhbmQgdHJlYXQgaXQgYXMgYW4gZXh0cmEgc291cmNlIHRvIG1lcmdlXG4gICAgICAgICAgICBzb3VyY2VSZXN1bHRzLnB1c2goXG4gICAgICAgICAgICAgICAgcXVlcnlSZW5kZXJlZFN5bWJvbHMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheWVycyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VyaWFsaXplZExheWVycyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0TGF5ZXJTb3VyY2VDYWNoZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeUdlb21ldHJ5U3RydWN0LnNjcmVlbkdlb21ldHJ5LFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50LmNvbGxpc2lvbkluZGV4LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudC5yZXRhaW5lZFF1ZXJ5RGF0YSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHRoaXMuX2ZsYXR0ZW5BbmRTb3J0UmVuZGVyZWRGZWF0dXJlcyhzb3VyY2VSZXN1bHRzKTogYW55KTtcbiAgICB9XG5cbiAgICBxdWVyeVNvdXJjZUZlYXR1cmVzKHNvdXJjZUlEOiBzdHJpbmcsIHBhcmFtczogP3tzb3VyY2VMYXllcjogP3N0cmluZywgZmlsdGVyOiA/QXJyYXk8YW55PiwgdmFsaWRhdGU/OiBib29sZWFufSk6IEFycmF5PFF1ZXJ5RmVhdHVyZT4ge1xuICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlRmlsdGVyLCAncXVlcnlTb3VyY2VGZWF0dXJlcy5maWx0ZXInLCBwYXJhbXMuZmlsdGVyLCBudWxsLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IHRoaXMuX2dldFNvdXJjZUNhY2hlcyhzb3VyY2VJRCk7XG4gICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlQ2FjaGUgb2Ygc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQocXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VDYWNoZSwgcGFyYW1zKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgYWRkU291cmNlVHlwZShuYW1lOiBzdHJpbmcsIFNvdXJjZVR5cGU6IFNvdXJjZUNsYXNzLCBjYWxsYmFjazogQ2FsbGJhY2s8dm9pZD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKFN0eWxlLmdldFNvdXJjZVR5cGUobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYEEgc291cmNlIHR5cGUgY2FsbGVkIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzLmApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFN0eWxlLnNldFNvdXJjZVR5cGUobmFtZSwgU291cmNlVHlwZSk7XG5cbiAgICAgICAgaWYgKCFTb3VyY2VUeXBlLndvcmtlclNvdXJjZVVSTCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnbG9hZFdvcmtlclNvdXJjZScsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB1cmw6IFNvdXJjZVR5cGUud29ya2VyU291cmNlVVJMXG4gICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBnZXRMaWdodCgpOiBMaWdodFNwZWNpZmljYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5saWdodC5nZXRMaWdodCgpO1xuICAgIH1cblxuICAgIHNldExpZ2h0KGxpZ2h0T3B0aW9uczogTGlnaHRTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGxpZ2h0ID0gdGhpcy5saWdodC5nZXRMaWdodCgpO1xuICAgICAgICBsZXQgX3VwZGF0ZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBsaWdodE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKGxpZ2h0T3B0aW9uc1trZXldLCBsaWdodFtrZXldKSkge1xuICAgICAgICAgICAgICAgIF91cGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghX3VwZGF0ZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB0aGlzLl9zZXRUcmFuc2l0aW9uUGFyYW1ldGVycyh7ZHVyYXRpb246IDMwMCwgZGVsYXk6IDB9KTtcblxuICAgICAgICB0aGlzLmxpZ2h0LnNldExpZ2h0KGxpZ2h0T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMubGlnaHQudXBkYXRlVHJhbnNpdGlvbnMocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgZ2V0VGVycmFpbigpOiA/VGVycmFpblNwZWNpZmljYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXJyYWluICYmIHRoaXMudGVycmFpbi5kcmFwZVJlbmRlck1vZGUgPT09IERyYXBlUmVuZGVyTW9kZS5lbGV2YXRlZCA/IHRoaXMudGVycmFpbi5nZXQoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgc2V0VGVycmFpbkZvckRyYXBpbmcoKSB7XG4gICAgICAgIGNvbnN0IG1vY2tUZXJyYWluT3B0aW9ucyA9IHtzb3VyY2U6ICcnLCBleGFnZ2VyYXRpb246IDB9O1xuICAgICAgICB0aGlzLnNldFRlcnJhaW4obW9ja1RlcnJhaW5PcHRpb25zLCBEcmFwZVJlbmRlck1vZGUuZGVmZXJyZWQpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby13YXJuaW5nLWNvbW1lbnRzXG4gICAgLy8gVE9ETzogZ2VuZXJpYyBhcHByb2FjaCBmb3Igcm9vdCBsZXZlbCBwcm9wZXJ0eTogbGlnaHQsIHRlcnJhaW4sIHNreWJveC5cbiAgICAvLyBJdCBpcyBub3QgZG9uZSBoZXJlIHRvIHByZXZlbnQgcmViYXNpbmcgaXNzdWVzLlxuICAgIHNldFRlcnJhaW4odGVycmFpbk9wdGlvbnM6ID9UZXJyYWluU3BlY2lmaWNhdGlvbiwgZHJhcGVSZW5kZXJNb2RlOiBudW1iZXIgPSBEcmFwZVJlbmRlck1vZGUuZWxldmF0ZWQpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICAvLyBEaXNhYmxpbmdcbiAgICAgICAgaWYgKCF0ZXJyYWluT3B0aW9ucykge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMudGVycmFpbjtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0eWxlc2hlZXQudGVycmFpbjtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ2VuYWJsZVRlcnJhaW4nLCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLl9mb3JjZTNETGF5ZXJVcGRhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuX21hcmtlcnNOZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkcmFwZVJlbmRlck1vZGUgPT09IERyYXBlUmVuZGVyTW9kZS5lbGV2YXRlZCkge1xuICAgICAgICAgICAgLy8gSW5wdXQgdmFsaWRhdGlvbiBhbmQgc291cmNlIG9iamVjdCB1bnJvbGxpbmdcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGVycmFpbk9wdGlvbnMuc291cmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gJ3RlcnJhaW4tZGVtLXNyYyc7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UoaWQsICgodGVycmFpbk9wdGlvbnMuc291cmNlKTogYW55KSk7XG4gICAgICAgICAgICAgICAgdGVycmFpbk9wdGlvbnMgPSBjbG9uZSh0ZXJyYWluT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGVycmFpbk9wdGlvbnMgPSAoZXh0ZW5kKHRlcnJhaW5PcHRpb25zLCB7c291cmNlOiBpZH0pOiBhbnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVUZXJyYWluLCAndGVycmFpbicsIHRlcnJhaW5PcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuYWJsaW5nXG4gICAgICAgIGlmICghdGhpcy50ZXJyYWluIHx8ICh0aGlzLnRlcnJhaW4gJiYgZHJhcGVSZW5kZXJNb2RlICE9PSB0aGlzLnRlcnJhaW4uZHJhcGVSZW5kZXJNb2RlKSkge1xuICAgICAgICAgICAgdGhpcy5fY3JlYXRlVGVycmFpbih0ZXJyYWluT3B0aW9ucywgZHJhcGVSZW5kZXJNb2RlKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gVXBkYXRpbmdcbiAgICAgICAgICAgIGNvbnN0IHRlcnJhaW4gPSB0aGlzLnRlcnJhaW47XG4gICAgICAgICAgICBjb25zdCBjdXJyU3BlYyA9IHRlcnJhaW4uZ2V0KCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhzdHlsZVNwZWMudGVycmFpbikpIHtcbiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byB1c2UgZGVmYXVsdCBzdHlsZSBzcGVjaWZpY2F0aW9uIHdoZW4gdGhlIHByb3BlcnRpZXMgd2Fzbid0IHNldFxuICAgICAgICAgICAgICAgIGlmICghdGVycmFpbk9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgISFzdHlsZVNwZWMudGVycmFpbltuYW1lXS5kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRlcnJhaW5PcHRpb25zW25hbWVdID0gc3R5bGVTcGVjLnRlcnJhaW5bbmFtZV0uZGVmYXVsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0ZXJyYWluT3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmICghZGVlcEVxdWFsKHRlcnJhaW5PcHRpb25zW2tleV0sIGN1cnJTcGVjW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlcnJhaW4uc2V0KHRlcnJhaW5PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNoZWV0LnRlcnJhaW4gPSB0ZXJyYWluT3B0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuX3NldFRyYW5zaXRpb25QYXJhbWV0ZXJzKHtkdXJhdGlvbjogMH0pO1xuICAgICAgICAgICAgICAgICAgICB0ZXJyYWluLnVwZGF0ZVRyYW5zaXRpb25zKHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVEcmFwZUZpcnN0TGF5ZXJzKCk7XG4gICAgICAgIHRoaXMuX21hcmtlcnNOZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfY3JlYXRlRm9nKGZvZ09wdGlvbnM6IEZvZ1NwZWNpZmljYXRpb24pIHtcbiAgICAgICAgY29uc3QgZm9nID0gdGhpcy5mb2cgPSBuZXcgRm9nKGZvZ09wdGlvbnMsIHRoaXMubWFwLnRyYW5zZm9ybSk7XG4gICAgICAgIHRoaXMuc3R5bGVzaGVldC5mb2cgPSBmb2dPcHRpb25zO1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5fc2V0VHJhbnNpdGlvblBhcmFtZXRlcnMoe2R1cmF0aW9uOiAwfSk7XG4gICAgICAgIGZvZy51cGRhdGVUcmFuc2l0aW9ucyhwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlTWFya2Vyc09wYWNpdHkoKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcC5fbWFya2Vycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1hcC5fcmVxdWVzdERvbVRhc2soKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBtYXJrZXIgb2YgdGhpcy5tYXAuX21hcmtlcnMpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIuX2V2YWx1YXRlT3BhY2l0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRGb2coKTogP0ZvZ1NwZWNpZmljYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5mb2cgPyB0aGlzLmZvZy5nZXQoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgc2V0Rm9nKGZvZ09wdGlvbnM6IEZvZ1NwZWNpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBpZiAoIWZvZ09wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBmb2dcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZvZztcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0eWxlc2hlZXQuZm9nO1xuICAgICAgICAgICAgdGhpcy5fbWFya2Vyc05lZWRVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmZvZykge1xuICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBGb2dcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUZvZyhmb2dPcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVwZGF0aW5nIGZvZ1xuICAgICAgICAgICAgY29uc3QgZm9nID0gdGhpcy5mb2c7XG4gICAgICAgICAgICBjb25zdCBjdXJyU3BlYyA9IGZvZy5nZXQoKTtcblxuICAgICAgICAgICAgLy8gZW1wdHkgb2JqZWN0IHNob3VsZCBwYXNzIHRocm91Z2ggdG8gc2V0IGRlZmF1bHQgdmFsdWVzXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZm9nT3B0aW9ucykubGVuZ3RoID09PSAwKSBmb2cuc2V0KGZvZ09wdGlvbnMpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmb2dPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkZWVwRXF1YWwoZm9nT3B0aW9uc1trZXldLCBjdXJyU3BlY1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBmb2cuc2V0KGZvZ09wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0eWxlc2hlZXQuZm9nID0gZm9nT3B0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuX3NldFRyYW5zaXRpb25QYXJhbWV0ZXJzKHtkdXJhdGlvbjogMH0pO1xuICAgICAgICAgICAgICAgICAgICBmb2cudXBkYXRlVHJhbnNpdGlvbnMocGFyYW1ldGVycyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21hcmtlcnNOZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfc2V0VHJhbnNpdGlvblBhcmFtZXRlcnModHJhbnNpdGlvbk9wdGlvbnM6IE9iamVjdCk6IFRyYW5zaXRpb25QYXJhbWV0ZXJzIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vdzogYnJvd3Nlci5ub3coKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGV4dGVuZChcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uT3B0aW9ucyxcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbilcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfdXBkYXRlRHJhcGVGaXJzdExheWVycygpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1hcC5fb3B0aW1pemVGb3JUZXJyYWluIHx8ICF0aGlzLnRlcnJhaW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRyYXBlZCA9IHRoaXMuX29yZGVyLmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzTGF5ZXJEcmFwZWQodGhpcy5fbGF5ZXJzW2lkXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG5vbkRyYXBlZCA9IHRoaXMuX29yZGVyLmZpbHRlcigoaWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5pc0xheWVyRHJhcGVkKHRoaXMuX2xheWVyc1tpZF0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZHJhcGVkRmlyc3RPcmRlciA9IFtdO1xuICAgICAgICB0aGlzLl9kcmFwZWRGaXJzdE9yZGVyLnB1c2goLi4uZHJhcGVkKTtcbiAgICAgICAgdGhpcy5fZHJhcGVkRmlyc3RPcmRlci5wdXNoKC4uLm5vbkRyYXBlZCk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZVRlcnJhaW4odGVycmFpbk9wdGlvbnM6IFRlcnJhaW5TcGVjaWZpY2F0aW9uLCBkcmFwZVJlbmRlck1vZGU6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0ZXJyYWluID0gdGhpcy50ZXJyYWluID0gbmV3IFRlcnJhaW4odGVycmFpbk9wdGlvbnMsIGRyYXBlUmVuZGVyTW9kZSk7XG4gICAgICAgIHRoaXMuc3R5bGVzaGVldC50ZXJyYWluID0gdGVycmFpbk9wdGlvbnM7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5icm9hZGNhc3QoJ2VuYWJsZVRlcnJhaW4nLCAhdGhpcy50ZXJyYWluU2V0Rm9yRHJhcGluZ09ubHkoKSk7XG4gICAgICAgIHRoaXMuX2ZvcmNlM0RMYXllclVwZGF0ZSgpO1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy5fc2V0VHJhbnNpdGlvblBhcmFtZXRlcnMoe2R1cmF0aW9uOiAwfSk7XG4gICAgICAgIHRlcnJhaW4udXBkYXRlVHJhbnNpdGlvbnMocGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgX2ZvcmNlM0RMYXllclVwZGF0ZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklkIGluIHRoaXMuX2xheWVycykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJZF07XG4gICAgICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ2ZpbGwtZXh0cnVzaW9uJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9mb3JjZVN5bWJvbExheWVyVXBkYXRlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgIGlmIChsYXllci50eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF92YWxpZGF0ZSh2YWxpZGF0ZTogVmFsaWRhdG9yLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgcHJvcHM6IGFueSwgb3B0aW9uczogeyB2YWxpZGF0ZT86IGJvb2xlYW4gfSA9IHt9KTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVtaXRWYWxpZGF0aW9uRXJyb3JzKHRoaXMsIHZhbGlkYXRlLmNhbGwodmFsaWRhdGVTdHlsZSwgZXh0ZW5kKHtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHN0eWxlOiB0aGlzLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBzdHlsZVNwZWNcbiAgICAgICAgfSwgcHJvcHMpKSk7XG4gICAgfVxuXG4gICAgX3JlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3QuY2FuY2VsKCk7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc3ByaXRlUmVxdWVzdCkge1xuICAgICAgICAgICAgdGhpcy5fc3ByaXRlUmVxdWVzdC5jYW5jZWwoKTtcbiAgICAgICAgICAgIHRoaXMuX3Nwcml0ZVJlcXVlc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJ0bFRleHRQbHVnaW5FdmVudGVkLm9mZigncGx1Z2luU3RhdGVDaGFuZ2UnLCB0aGlzLl9ydGxUZXh0UGx1Z2luQ2FsbGJhY2spO1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gdGhpcy5fbGF5ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcjogU3R5bGVMYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgIGxheWVyLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZUNhY2hlc1tpZF0uY2xlYXJUaWxlcygpO1xuICAgICAgICAgICAgdGhpcy5fc291cmNlQ2FjaGVzW2lkXS5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW1hZ2VNYW5hZ2VyLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG4gICAgICAgIHRoaXMuc2V0RXZlbnRlZFBhcmVudChudWxsKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIF9jbGVhclNvdXJjZShpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IHRoaXMuX2dldFNvdXJjZUNhY2hlcyhpZCk7XG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlQ2FjaGUgb2Ygc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBzb3VyY2VDYWNoZS5jbGVhclRpbGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcmVsb2FkU291cmNlKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5fZ2V0U291cmNlQ2FjaGVzKGlkKTtcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2VDYWNoZSBvZiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHNvdXJjZUNhY2hlLnJlc3VtZSgpO1xuICAgICAgICAgICAgc291cmNlQ2FjaGUucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdXBkYXRlU291cmNlcyh0cmFuc2Zvcm06IFRyYW5zZm9ybSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3NvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlQ2FjaGVzW2lkXS51cGRhdGUodHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9nZW5lcmF0ZUNvbGxpc2lvbkJveGVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3NvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLl9zb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICAgICAgc291cmNlQ2FjaGUucmVzdW1lKCk7XG4gICAgICAgICAgICBzb3VyY2VDYWNoZS5yZWxvYWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVQbGFjZW1lbnQodHJhbnNmb3JtOiBUcmFuc2Zvcm0sIHNob3dDb2xsaXNpb25Cb3hlczogYm9vbGVhbiwgZmFkZUR1cmF0aW9uOiBudW1iZXIsIGNyb3NzU291cmNlQ29sbGlzaW9uczogYm9vbGVhbiwgZm9yY2VGdWxsUGxhY2VtZW50OiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHN5bWJvbEJ1Y2tldHNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBwbGFjZW1lbnRDb21taXR0ZWQgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBsYXllclRpbGVzID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEIG9mIHRoaXMuX29yZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZUxheWVyID0gdGhpcy5fbGF5ZXJzW2xheWVySURdO1xuICAgICAgICAgICAgaWYgKHN0eWxlTGF5ZXIudHlwZSAhPT0gJ3N5bWJvbCcpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoIWxheWVyVGlsZXNbc3R5bGVMYXllci5zb3VyY2VdKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLl9nZXRMYXllclNvdXJjZUNhY2hlKHN0eWxlTGF5ZXIpO1xuICAgICAgICAgICAgICAgIGlmICghc291cmNlQ2FjaGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxheWVyVGlsZXNbc3R5bGVMYXllci5zb3VyY2VdID0gc291cmNlQ2FjaGUuZ2V0UmVuZGVyYWJsZUlkcyh0cnVlKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChpZCkgPT4gc291cmNlQ2FjaGUuZ2V0VGlsZUJ5SUQoaWQpKVxuICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gKGIudGlsZUlELm92ZXJzY2FsZWRaIC0gYS50aWxlSUQub3ZlcnNjYWxlZFopIHx8IChhLnRpbGVJRC5pc0xlc3NUaGFuKGIudGlsZUlEKSA/IC0xIDogMSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsYXllckJ1Y2tldHNDaGFuZ2VkID0gdGhpcy5jcm9zc1RpbGVTeW1ib2xJbmRleC5hZGRMYXllcihzdHlsZUxheWVyLCBsYXllclRpbGVzW3N0eWxlTGF5ZXIuc291cmNlXSwgdHJhbnNmb3JtLmNlbnRlci5sbmcsIHRyYW5zZm9ybS5wcm9qZWN0aW9uKTtcbiAgICAgICAgICAgIHN5bWJvbEJ1Y2tldHNDaGFuZ2VkID0gc3ltYm9sQnVja2V0c0NoYW5nZWQgfHwgbGF5ZXJCdWNrZXRzQ2hhbmdlZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4LnBydW5lVW51c2VkTGF5ZXJzKHRoaXMuX29yZGVyKTtcblxuICAgICAgICAvLyBBbnl0aGluZyB0aGF0IGNoYW5nZXMgb3VyIFwiaW4gcHJvZ3Jlc3NcIiBsYXllciBhbmQgdGlsZSBpbmRpY2VzIHJlcXVpcmVzIHVzXG4gICAgICAgIC8vIHRvIHN0YXJ0IG92ZXIuIFdoZW4gd2Ugc3RhcnQgb3Zlciwgd2UgZG8gYSBmdWxsIHBsYWNlbWVudCBpbnN0ZWFkIG9mIGluY3JlbWVudGFsXG4gICAgICAgIC8vIHRvIHByZXZlbnQgc3RhcnZhdGlvbi5cbiAgICAgICAgLy8gV2UgbmVlZCB0byByZXN0YXJ0IHBsYWNlbWVudCB0byBrZWVwIGxheWVyIGluZGljZXMgaW4gc3luYy5cbiAgICAgICAgLy8gQWxzbyBmb3JjZSBmdWxsIHBsYWNlbWVudCB3aGVuIGZhZGVEdXJhdGlvbiA9PT0gMCB0byBlbnN1cmUgdGhhdCBuZXdseSBsb2FkZWRcbiAgICAgICAgLy8gdGlsZXMgd2lsbCBmdWxseSBkaXNwbGF5IHN5bWJvbHMgaW4gdGhlaXIgZmlyc3QgZnJhbWVcbiAgICAgICAgZm9yY2VGdWxsUGxhY2VtZW50ID0gZm9yY2VGdWxsUGxhY2VtZW50IHx8IHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkIHx8IGZhZGVEdXJhdGlvbiA9PT0gMDtcblxuICAgICAgICBpZiAodGhpcy5fbGF5ZXJPcmRlckNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ25ld29yZGVyJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcmNlRnVsbFBsYWNlbWVudCB8fCAhdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQgfHwgKHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpICYmICF0aGlzLnBsYWNlbWVudC5zdGlsbFJlY2VudChicm93c2VyLm5vdygpLCB0cmFuc2Zvcm0uem9vbSkpKSB7XG4gICAgICAgICAgICBjb25zdCBmb2dTdGF0ZSA9IHRoaXMuZm9nICYmIHRyYW5zZm9ybS5wcm9qZWN0aW9uLnN1cHBvcnRzRm9nID8gdGhpcy5mb2cuc3RhdGUgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5wYXVzZWFibGVQbGFjZW1lbnQgPSBuZXcgUGF1c2VhYmxlUGxhY2VtZW50KHRyYW5zZm9ybSwgdGhpcy5fb3JkZXIsIGZvcmNlRnVsbFBsYWNlbWVudCwgc2hvd0NvbGxpc2lvbkJveGVzLCBmYWRlRHVyYXRpb24sIGNyb3NzU291cmNlQ29sbGlzaW9ucywgdGhpcy5wbGFjZW1lbnQsIGZvZ1N0YXRlKTtcbiAgICAgICAgICAgIHRoaXMuX2xheWVyT3JkZXJDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuaXNEb25lKCkpIHtcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IHBsYWNlbWVudCBmaW5pc2hlZCBydW5uaW5nLCBidXQgdGhlIG5leHQgb25lIGhhc27igJl0XG4gICAgICAgICAgICAvLyBzdGFydGVkIHlldCBiZWNhdXNlIG9mIHRoZSBgc3RpbGxSZWNlbnRgIGNoZWNrIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAvLyBhYm92ZSwgc28gbWFyayBpdCBzdGFsZSB0byBlbnN1cmUgdGhhdCB3ZSByZXF1ZXN0IGFub3RoZXJcbiAgICAgICAgICAgIC8vIHJlbmRlciBmcmFtZVxuICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQuc2V0U3RhbGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmNvbnRpbnVlUGxhY2VtZW50KHRoaXMuX29yZGVyLCB0aGlzLl9sYXllcnMsIGxheWVyVGlsZXMpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wYXVzZWFibGVQbGFjZW1lbnQuaXNEb25lKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9IHRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmNvbW1pdChicm93c2VyLm5vdygpKTtcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnRDb21taXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3ltYm9sQnVja2V0c0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcGxhY2VtZW50IGdldHMgc3BsaXQgb3ZlciBtdWx0aXBsZSBmcmFtZXMgaXQgaXMgcG9zc2libGVcbiAgICAgICAgICAgICAgICAvLyB0aGVzZSBidWNrZXRzIHdlcmUgcHJvY2Vzc2VkIGJlZm9yZSB0aGV5IHdlcmUgY2hhbmdlZCBhbmQgc28gdGhlXG4gICAgICAgICAgICAgICAgLy8gcGxhY2VtZW50IGlzIGFscmVhZHkgc3RhbGUgd2hpbGUgaXQgaXMgaW4gcHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICB0aGlzLnBhdXNlYWJsZVBsYWNlbWVudC5wbGFjZW1lbnQuc2V0U3RhbGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwbGFjZW1lbnRDb21taXR0ZWQgfHwgc3ltYm9sQnVja2V0c0NoYW5nZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJRCBvZiB0aGlzLl9vcmRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlTGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJRF07XG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlTGF5ZXIudHlwZSAhPT0gJ3N5bWJvbCcpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucGxhY2VtZW50LnVwZGF0ZUxheWVyT3BhY2l0aWVzKHN0eWxlTGF5ZXIsIGxheWVyVGlsZXNbc3R5bGVMYXllci5zb3VyY2VdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5lZWRzUmVuZGVyIGlzIGZhbHNlIHdoZW4gd2UgaGF2ZSBqdXN0IGZpbmlzaGVkIGEgcGxhY2VtZW50IHRoYXQgZGlkbid0IGNoYW5nZSB0aGUgdmlzaWJpbGl0eSBvZiBhbnkgc3ltYm9sc1xuICAgICAgICBjb25zdCBuZWVkc1JlcmVuZGVyID0gIXRoaXMucGF1c2VhYmxlUGxhY2VtZW50LmlzRG9uZSgpIHx8IHRoaXMucGxhY2VtZW50Lmhhc1RyYW5zaXRpb25zKGJyb3dzZXIubm93KCkpO1xuICAgICAgICByZXR1cm4gbmVlZHNSZXJlbmRlcjtcbiAgICB9XG5cbiAgICBfcmVsZWFzZVN5bWJvbEZhZGVUaWxlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZUNhY2hlc1tpZF0ucmVsZWFzZVN5bWJvbEZhZGVUaWxlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbGJhY2tzIGZyb20gd2ViIHdvcmtlcnNcblxuICAgIGdldEltYWdlcyhtYXBJZDogc3RyaW5nLCBwYXJhbXM6IHtpY29uczogQXJyYXk8c3RyaW5nPiwgc291cmNlOiBzdHJpbmcsIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgdHlwZTogc3RyaW5nfSwgY2FsbGJhY2s6IENhbGxiYWNrPHtbXzogc3RyaW5nXTogU3R5bGVJbWFnZX0+KSB7XG5cbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuZ2V0SW1hZ2VzKHBhcmFtcy5pY29ucywgY2FsbGJhY2spO1xuXG4gICAgICAgIC8vIEFwcGx5IHF1ZXVlZCBpbWFnZSBjaGFuZ2VzIGJlZm9yZSBzZXR0aW5nIHRoZSB0aWxlJ3MgZGVwZW5kZW5jaWVzIHNvIHRoYXQgdGhlIHRpbGVcbiAgICAgICAgLy8gaXMgbm90IHJlbG9hZGVkIHVuZWNlc3NhcmlseS4gV2l0aG91dCB0aGlzIGZvcmNlZCB1cGRhdGUgdGhlIHJlbG9hZCBjb3VsZCBoYXBwZW4gaW4gY2FzZXNcbiAgICAgICAgLy8gbGlrZSB0aGlzIG9uZTpcbiAgICAgICAgLy8gLSBpY29ucyBjb250YWlucyBcIm15LWltYWdlXCJcbiAgICAgICAgLy8gLSBpbWFnZU1hbmFnZXIuZ2V0SW1hZ2VzKC4uLikgdHJpZ2dlcnMgYG9uc3R5bGVpbWFnZW1pc3NpbmdgXG4gICAgICAgIC8vIC0gdGhlIHVzZXIgYWRkcyBcIm15LWltYWdlXCIgd2l0aGluIHRoZSBjYWxsYmFja1xuICAgICAgICAvLyAtIGFkZEltYWdlIGFkZHMgXCJteS1pbWFnZVwiIHRvIHRoaXMuX2NoYW5nZWRJbWFnZXNcbiAgICAgICAgLy8gLSB0aGUgbmV4dCBmcmFtZSB0cmlnZ2VycyBhIHJlbG9hZCBvZiB0aGlzIHRpbGUgZXZlbiB0aG91Z2ggaXQgYWxyZWFkeSBoYXMgdGhlIGxhdGVzdCB2ZXJzaW9uXG4gICAgICAgIHRoaXMuX3VwZGF0ZVRpbGVzRm9yQ2hhbmdlZEltYWdlcygpO1xuXG4gICAgICAgIGNvbnN0IHNldERlcGVuZGVuY2llcyA9IChzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUpID0+IHtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlLnNldERlcGVuZGVuY2llcyhwYXJhbXMudGlsZUlELmtleSwgcGFyYW1zLnR5cGUsIHBhcmFtcy5pY29ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHNldERlcGVuZGVuY2llcyh0aGlzLl9vdGhlclNvdXJjZUNhY2hlc1twYXJhbXMuc291cmNlXSk7XG4gICAgICAgIHNldERlcGVuZGVuY2llcyh0aGlzLl9zeW1ib2xTb3VyY2VDYWNoZXNbcGFyYW1zLnNvdXJjZV0pO1xuICAgIH1cblxuICAgIGdldEdseXBocyhtYXBJZDogc3RyaW5nLCBwYXJhbXM6IHtzdGFja3M6IHtbXzogc3RyaW5nXTogQXJyYXk8bnVtYmVyPn19LCBjYWxsYmFjazogQ2FsbGJhY2s8e1tfOiBzdHJpbmddOiB7Z2x5cGhzOiB7W186IG51bWJlcl06ID9TdHlsZUdseXBofSwgYXNjZW5kZXI/OiBudW1iZXIsIGRlc2NlbmRlcj86IG51bWJlcn19Pikge1xuICAgICAgICB0aGlzLmdseXBoTWFuYWdlci5nZXRHbHlwaHMocGFyYW1zLnN0YWNrcywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGdldFJlc291cmNlKG1hcElkOiBzdHJpbmcsIHBhcmFtczogUmVxdWVzdFBhcmFtZXRlcnMsIGNhbGxiYWNrOiBSZXNwb25zZUNhbGxiYWNrPGFueT4pOiBDYW5jZWxhYmxlIHtcbiAgICAgICAgcmV0dXJuIG1ha2VSZXF1ZXN0KHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIF9nZXRTb3VyY2VDYWNoZShzb3VyY2U6IHN0cmluZyk6IFNvdXJjZUNhY2hlIHwgdm9pZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vdGhlclNvdXJjZUNhY2hlc1tzb3VyY2VdO1xuICAgIH1cblxuICAgIF9nZXRMYXllclNvdXJjZUNhY2hlKGxheWVyOiBTdHlsZUxheWVyKTogU291cmNlQ2FjaGUgfCB2b2lkIHtcbiAgICAgICAgcmV0dXJuIGxheWVyLnR5cGUgPT09ICdzeW1ib2wnID9cbiAgICAgICAgICAgIHRoaXMuX3N5bWJvbFNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdIDpcbiAgICAgICAgICAgIHRoaXMuX290aGVyU291cmNlQ2FjaGVzW2xheWVyLnNvdXJjZV07XG4gICAgfVxuXG4gICAgX2dldFNvdXJjZUNhY2hlcyhzb3VyY2U6IHN0cmluZyk6IEFycmF5PFNvdXJjZUNhY2hlPiB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5fb3RoZXJTb3VyY2VDYWNoZXNbc291cmNlXSkge1xuICAgICAgICAgICAgc291cmNlQ2FjaGVzLnB1c2godGhpcy5fb3RoZXJTb3VyY2VDYWNoZXNbc291cmNlXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N5bWJvbFNvdXJjZUNhY2hlc1tzb3VyY2VdKSB7XG4gICAgICAgICAgICBzb3VyY2VDYWNoZXMucHVzaCh0aGlzLl9zeW1ib2xTb3VyY2VDYWNoZXNbc291cmNlXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZUNhY2hlcztcbiAgICB9XG5cbiAgICBfaXNTb3VyY2VDYWNoZUxvYWRlZChzb3VyY2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLl9nZXRTb3VyY2VDYWNoZXMoc291cmNlKTtcbiAgICAgICAgaWYgKHNvdXJjZUNhY2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIElEICcke3NvdXJjZX0nYCkpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlQ2FjaGVzLmV2ZXJ5KHNjID0+IHNjLmxvYWRlZCgpKTtcbiAgICB9XG5cbiAgICBoYXMzRExheWVycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bTNETGF5ZXJzID4gMDtcbiAgICB9XG5cbiAgICBoYXNTeW1ib2xMYXllcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9udW1TeW1ib2xMYXllcnMgPiAwO1xuICAgIH1cblxuICAgIGhhc0NpcmNsZUxheWVycygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bUNpcmNsZUxheWVycyA+IDA7XG4gICAgfVxuXG4gICAgX2NsZWFyV29ya2VyQ2FjaGVzKCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdjbGVhckNhY2hlcycpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX2NsZWFyV29ya2VyQ2FjaGVzKCk7XG4gICAgICAgIGlmICh0aGlzLnRlcnJhaW5TZXRGb3JEcmFwaW5nT25seSgpKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy50ZXJyYWluO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzaGVldC50ZXJyYWluO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5TdHlsZS5nZXRTb3VyY2VUeXBlID0gZ2V0U291cmNlVHlwZTtcblN0eWxlLnNldFNvdXJjZVR5cGUgPSBzZXRTb3VyY2VUeXBlO1xuU3R5bGUucmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZSA9IHJlZ2lzdGVyRm9yUGx1Z2luU3RhdGVDaGFuZ2U7XG5cbmV4cG9ydCBkZWZhdWx0IFN0eWxlO1xuIiwiXG4vLyBEaXNhYmxlIEZsb3cgYW5ub3RhdGlvbnMgaGVyZSBiZWNhdXNlIEZsb3cgZG9lc24ndCBzdXBwb3J0IGltcG9ydGluZyBHTFNMIGZpbGVzXG4vKiBlc2xpbnQtZGlzYWJsZSBmbG93dHlwZS9yZXF1aXJlLXZhbGlkLWZpbGUtYW5ub3RhdGlvbiAqL1xuXG5pbXBvcnQgcHJlbHVkZUNvbW1vbiBmcm9tICcuL19wcmVsdWRlLmdsc2wnO1xuaW1wb3J0IHByZWx1ZGVGcmFnIGZyb20gJy4vX3ByZWx1ZGUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgcHJlbHVkZVZlcnQgZnJvbSAnLi9fcHJlbHVkZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgYmFja2dyb3VuZEZyYWcgZnJvbSAnLi9iYWNrZ3JvdW5kLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGJhY2tncm91bmRWZXJ0IGZyb20gJy4vYmFja2dyb3VuZC52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgYmFja2dyb3VuZFBhdHRlcm5GcmFnIGZyb20gJy4vYmFja2dyb3VuZF9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGJhY2tncm91bmRQYXR0ZXJuVmVydCBmcm9tICcuL2JhY2tncm91bmRfcGF0dGVybi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgY2lyY2xlRnJhZyBmcm9tICcuL2NpcmNsZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBjaXJjbGVWZXJ0IGZyb20gJy4vY2lyY2xlLnZlcnRleC5nbHNsJztcbmltcG9ydCBjbGlwcGluZ01hc2tGcmFnIGZyb20gJy4vY2xpcHBpbmdfbWFzay5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBjbGlwcGluZ01hc2tWZXJ0IGZyb20gJy4vY2xpcHBpbmdfbWFzay52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgaGVhdG1hcEZyYWcgZnJvbSAnLi9oZWF0bWFwLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGhlYXRtYXBWZXJ0IGZyb20gJy4vaGVhdG1hcC52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgaGVhdG1hcFRleHR1cmVGcmFnIGZyb20gJy4vaGVhdG1hcF90ZXh0dXJlLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGhlYXRtYXBUZXh0dXJlVmVydCBmcm9tICcuL2hlYXRtYXBfdGV4dHVyZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgY29sbGlzaW9uQm94RnJhZyBmcm9tICcuL2NvbGxpc2lvbl9ib3guZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgY29sbGlzaW9uQm94VmVydCBmcm9tICcuL2NvbGxpc2lvbl9ib3gudmVydGV4Lmdsc2wnO1xuaW1wb3J0IGNvbGxpc2lvbkNpcmNsZUZyYWcgZnJvbSAnLi9jb2xsaXNpb25fY2lyY2xlLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGNvbGxpc2lvbkNpcmNsZVZlcnQgZnJvbSAnLi9jb2xsaXNpb25fY2lyY2xlLnZlcnRleC5nbHNsJztcbmltcG9ydCBkZWJ1Z0ZyYWcgZnJvbSAnLi9kZWJ1Zy5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBkZWJ1Z1ZlcnQgZnJvbSAnLi9kZWJ1Zy52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZmlsbEZyYWcgZnJvbSAnLi9maWxsLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxWZXJ0IGZyb20gJy4vZmlsbC52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZmlsbE91dGxpbmVGcmFnIGZyb20gJy4vZmlsbF9vdXRsaW5lLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxPdXRsaW5lVmVydCBmcm9tICcuL2ZpbGxfb3V0bGluZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZmlsbE91dGxpbmVQYXR0ZXJuRnJhZyBmcm9tICcuL2ZpbGxfb3V0bGluZV9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxPdXRsaW5lUGF0dGVyblZlcnQgZnJvbSAnLi9maWxsX291dGxpbmVfcGF0dGVybi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZmlsbFBhdHRlcm5GcmFnIGZyb20gJy4vZmlsbF9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxQYXR0ZXJuVmVydCBmcm9tICcuL2ZpbGxfcGF0dGVybi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgZmlsbEV4dHJ1c2lvbkZyYWcgZnJvbSAnLi9maWxsX2V4dHJ1c2lvbi5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uVmVydCBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uLnZlcnRleC5nbHNsJztcbmltcG9ydCBmaWxsRXh0cnVzaW9uUGF0dGVybkZyYWcgZnJvbSAnLi9maWxsX2V4dHJ1c2lvbl9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IGZpbGxFeHRydXNpb25QYXR0ZXJuVmVydCBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uX3BhdHRlcm4udmVydGV4Lmdsc2wnO1xuaW1wb3J0IGhpbGxzaGFkZVByZXBhcmVGcmFnIGZyb20gJy4vaGlsbHNoYWRlX3ByZXBhcmUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgaGlsbHNoYWRlUHJlcGFyZVZlcnQgZnJvbSAnLi9oaWxsc2hhZGVfcHJlcGFyZS52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgaGlsbHNoYWRlRnJhZyBmcm9tICcuL2hpbGxzaGFkZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBoaWxsc2hhZGVWZXJ0IGZyb20gJy4vaGlsbHNoYWRlLnZlcnRleC5nbHNsJztcbmltcG9ydCBsaW5lRnJhZyBmcm9tICcuL2xpbmUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgbGluZVZlcnQgZnJvbSAnLi9saW5lLnZlcnRleC5nbHNsJztcbmltcG9ydCBsaW5lUGF0dGVybkZyYWcgZnJvbSAnLi9saW5lX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgbGluZVBhdHRlcm5WZXJ0IGZyb20gJy4vbGluZV9wYXR0ZXJuLnZlcnRleC5nbHNsJztcbmltcG9ydCByYXN0ZXJGcmFnIGZyb20gJy4vcmFzdGVyLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHJhc3RlclZlcnQgZnJvbSAnLi9yYXN0ZXIudmVydGV4Lmdsc2wnO1xuaW1wb3J0IHN5bWJvbEljb25GcmFnIGZyb20gJy4vc3ltYm9sX2ljb24uZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgc3ltYm9sSWNvblZlcnQgZnJvbSAnLi9zeW1ib2xfaWNvbi52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgc3ltYm9sU0RGRnJhZyBmcm9tICcuL3N5bWJvbF9zZGYuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgc3ltYm9sU0RGVmVydCBmcm9tICcuL3N5bWJvbF9zZGYudmVydGV4Lmdsc2wnO1xuaW1wb3J0IHN5bWJvbFRleHRBbmRJY29uRnJhZyBmcm9tICcuL3N5bWJvbF90ZXh0X2FuZF9pY29uLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHN5bWJvbFRleHRBbmRJY29uVmVydCBmcm9tICcuL3N5bWJvbF90ZXh0X2FuZF9pY29uLnZlcnRleC5nbHNsJztcbmltcG9ydCBza3lib3hGcmFnIGZyb20gJy4vc2t5Ym94LmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHNreWJveEdyYWRpZW50RnJhZyBmcm9tICcuL3NreWJveF9ncmFkaWVudC5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBza3lib3hWZXJ0IGZyb20gJy4vc2t5Ym94LnZlcnRleC5nbHNsJztcbmltcG9ydCB0ZXJyYWluUmFzdGVyRnJhZyBmcm9tICcuL3RlcnJhaW5fcmFzdGVyLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHRlcnJhaW5SYXN0ZXJWZXJ0IGZyb20gJy4vdGVycmFpbl9yYXN0ZXIudmVydGV4Lmdsc2wnO1xuaW1wb3J0IHRlcnJhaW5EZXB0aEZyYWcgZnJvbSAnLi90ZXJyYWluX2RlcHRoLmZyYWdtZW50Lmdsc2wnO1xuaW1wb3J0IHRlcnJhaW5EZXB0aFZlcnQgZnJvbSAnLi90ZXJyYWluX2RlcHRoLnZlcnRleC5nbHNsJztcbmltcG9ydCBwcmVsdWRlVGVycmFpblZlcnQgZnJvbSAnLi9fcHJlbHVkZV90ZXJyYWluLnZlcnRleC5nbHNsJztcbmltcG9ydCBwcmVsdWRlRm9nVmVydCBmcm9tICcuL19wcmVsdWRlX2ZvZy52ZXJ0ZXguZ2xzbCc7XG5pbXBvcnQgcHJlbHVkZUZvZ0ZyYWcgZnJvbSAnLi9fcHJlbHVkZV9mb2cuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgc2t5Ym94Q2FwdHVyZUZyYWcgZnJvbSAnLi9za3lib3hfY2FwdHVyZS5mcmFnbWVudC5nbHNsJztcbmltcG9ydCBza3lib3hDYXB0dXJlVmVydCBmcm9tICcuL3NreWJveF9jYXB0dXJlLnZlcnRleC5nbHNsJztcbmltcG9ydCBnbG9iZUZyYWcgZnJvbSAnLi9nbG9iZV9yYXN0ZXIuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgZ2xvYmVWZXJ0IGZyb20gJy4vZ2xvYmVfcmFzdGVyLnZlcnRleC5nbHNsJztcbmltcG9ydCBhdG1vc3BoZXJlRnJhZyBmcm9tICcuL2F0bW9zcGhlcmUuZnJhZ21lbnQuZ2xzbCc7XG5pbXBvcnQgYXRtb3NwaGVyZVZlcnQgZnJvbSAnLi9hdG1vc3BoZXJlLnZlcnRleC5nbHNsJztcblxuZXhwb3J0IGxldCBwcmVsdWRlVGVycmFpbiA9IHt9O1xuZXhwb3J0IGxldCBwcmVsdWRlRm9nID0ge307XG5cbnByZWx1ZGVUZXJyYWluID0gY29tcGlsZSgnJywgcHJlbHVkZVRlcnJhaW5WZXJ0LCB0cnVlKTtcbnByZWx1ZGVGb2cgPSBjb21waWxlKHByZWx1ZGVGb2dGcmFnLCBwcmVsdWRlRm9nVmVydCwgdHJ1ZSk7XG5cbmV4cG9ydCBjb25zdCBwcmVsdWRlID0gY29tcGlsZShwcmVsdWRlRnJhZywgcHJlbHVkZVZlcnQpO1xuZXhwb3J0IGNvbnN0IHByZWx1ZGVDb21tb25Tb3VyY2UgPSBwcmVsdWRlQ29tbW9uO1xuXG5leHBvcnQgY29uc3QgcHJlbHVkZVZlcnRQcmVjaXNpb25RdWFsaWZpZXJzID0gYFxuI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZWxzZVxuXG4jaWYgIWRlZmluZWQobG93cClcbiNkZWZpbmUgbG93cFxuI2VuZGlmXG5cbiNpZiAhZGVmaW5lZChtZWRpdW1wKVxuI2RlZmluZSBtZWRpdW1wXG4jZW5kaWZcblxuI2lmICFkZWZpbmVkKGhpZ2hwKVxuI2RlZmluZSBoaWdocFxuI2VuZGlmXG5cbiNlbmRpZmA7XG5leHBvcnQgY29uc3QgcHJlbHVkZUZyYWdQcmVjaXNpb25RdWFsaWZpZXJzID0gYFxuI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNlbHNlXG5cbiNpZiAhZGVmaW5lZChsb3dwKVxuI2RlZmluZSBsb3dwXG4jZW5kaWZcblxuI2lmICFkZWZpbmVkKG1lZGl1bXApXG4jZGVmaW5lIG1lZGl1bXBcbiNlbmRpZlxuXG4jaWYgIWRlZmluZWQoaGlnaHApXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxuI2VuZGlmYDtcblxuZXhwb3J0IGNvbnN0IHN0YW5kYXJkRGVyaXZhdGl2ZXNFeHQgPSAnI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGVcXG4nO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gICAgYmFja2dyb3VuZDogY29tcGlsZShiYWNrZ3JvdW5kRnJhZywgYmFja2dyb3VuZFZlcnQpLFxuICAgIGJhY2tncm91bmRQYXR0ZXJuOiBjb21waWxlKGJhY2tncm91bmRQYXR0ZXJuRnJhZywgYmFja2dyb3VuZFBhdHRlcm5WZXJ0KSxcbiAgICBjaXJjbGU6IGNvbXBpbGUoY2lyY2xlRnJhZywgY2lyY2xlVmVydCksXG4gICAgY2xpcHBpbmdNYXNrOiBjb21waWxlKGNsaXBwaW5nTWFza0ZyYWcsIGNsaXBwaW5nTWFza1ZlcnQpLFxuICAgIGhlYXRtYXA6IGNvbXBpbGUoaGVhdG1hcEZyYWcsIGhlYXRtYXBWZXJ0KSxcbiAgICBoZWF0bWFwVGV4dHVyZTogY29tcGlsZShoZWF0bWFwVGV4dHVyZUZyYWcsIGhlYXRtYXBUZXh0dXJlVmVydCksXG4gICAgY29sbGlzaW9uQm94OiBjb21waWxlKGNvbGxpc2lvbkJveEZyYWcsIGNvbGxpc2lvbkJveFZlcnQpLFxuICAgIGNvbGxpc2lvbkNpcmNsZTogY29tcGlsZShjb2xsaXNpb25DaXJjbGVGcmFnLCBjb2xsaXNpb25DaXJjbGVWZXJ0KSxcbiAgICBkZWJ1ZzogY29tcGlsZShkZWJ1Z0ZyYWcsIGRlYnVnVmVydCksXG4gICAgZmlsbDogY29tcGlsZShmaWxsRnJhZywgZmlsbFZlcnQpLFxuICAgIGZpbGxPdXRsaW5lOiBjb21waWxlKGZpbGxPdXRsaW5lRnJhZywgZmlsbE91dGxpbmVWZXJ0KSxcbiAgICBmaWxsT3V0bGluZVBhdHRlcm46IGNvbXBpbGUoZmlsbE91dGxpbmVQYXR0ZXJuRnJhZywgZmlsbE91dGxpbmVQYXR0ZXJuVmVydCksXG4gICAgZmlsbFBhdHRlcm46IGNvbXBpbGUoZmlsbFBhdHRlcm5GcmFnLCBmaWxsUGF0dGVyblZlcnQpLFxuICAgIGZpbGxFeHRydXNpb246IGNvbXBpbGUoZmlsbEV4dHJ1c2lvbkZyYWcsIGZpbGxFeHRydXNpb25WZXJ0KSxcbiAgICBmaWxsRXh0cnVzaW9uUGF0dGVybjogY29tcGlsZShmaWxsRXh0cnVzaW9uUGF0dGVybkZyYWcsIGZpbGxFeHRydXNpb25QYXR0ZXJuVmVydCksXG4gICAgaGlsbHNoYWRlUHJlcGFyZTogY29tcGlsZShoaWxsc2hhZGVQcmVwYXJlRnJhZywgaGlsbHNoYWRlUHJlcGFyZVZlcnQpLFxuICAgIGhpbGxzaGFkZTogY29tcGlsZShoaWxsc2hhZGVGcmFnLCBoaWxsc2hhZGVWZXJ0KSxcbiAgICBsaW5lOiBjb21waWxlKGxpbmVGcmFnLCBsaW5lVmVydCksXG4gICAgbGluZVBhdHRlcm46IGNvbXBpbGUobGluZVBhdHRlcm5GcmFnLCBsaW5lUGF0dGVyblZlcnQpLFxuICAgIHJhc3RlcjogY29tcGlsZShyYXN0ZXJGcmFnLCByYXN0ZXJWZXJ0KSxcbiAgICBzeW1ib2xJY29uOiBjb21waWxlKHN5bWJvbEljb25GcmFnLCBzeW1ib2xJY29uVmVydCksXG4gICAgc3ltYm9sU0RGOiBjb21waWxlKHN5bWJvbFNERkZyYWcsIHN5bWJvbFNERlZlcnQpLFxuICAgIHN5bWJvbFRleHRBbmRJY29uOiBjb21waWxlKHN5bWJvbFRleHRBbmRJY29uRnJhZywgc3ltYm9sVGV4dEFuZEljb25WZXJ0KSxcbiAgICB0ZXJyYWluUmFzdGVyOiBjb21waWxlKHRlcnJhaW5SYXN0ZXJGcmFnLCB0ZXJyYWluUmFzdGVyVmVydCksXG4gICAgdGVycmFpbkRlcHRoOiBjb21waWxlKHRlcnJhaW5EZXB0aEZyYWcsIHRlcnJhaW5EZXB0aFZlcnQpLFxuICAgIHNreWJveDogY29tcGlsZShza3lib3hGcmFnLCBza3lib3hWZXJ0KSxcbiAgICBza3lib3hHcmFkaWVudDogY29tcGlsZShza3lib3hHcmFkaWVudEZyYWcsIHNreWJveFZlcnQpLFxuICAgIHNreWJveENhcHR1cmU6IGNvbXBpbGUoc2t5Ym94Q2FwdHVyZUZyYWcsIHNreWJveENhcHR1cmVWZXJ0KSxcbiAgICBnbG9iZVJhc3RlcjogY29tcGlsZShnbG9iZUZyYWcsIGdsb2JlVmVydCksXG4gICAgZ2xvYmVBdG1vc3BoZXJlOiBjb21waWxlKGF0bW9zcGhlcmVGcmFnLCBhdG1vc3BoZXJlVmVydClcbn07XG5cbi8vIEV4cGFuZCAjcHJhZ21hcyB0byAjaWZkZWZzLlxuZnVuY3Rpb24gY29tcGlsZShmcmFnbWVudFNvdXJjZSwgdmVydGV4U291cmNlLCBpc0dsb2JhbFByZWx1ZGUpIHtcbiAgICBjb25zdCBwcmFnbWFSZWdleCA9IC8jcHJhZ21hIG1hcGJveDogKFtcXHddKykgKFtcXHddKykgKFtcXHddKykgKFtcXHddKykvZztcbiAgICBjb25zdCB1bmlmb3JtUmVnZXggPSAvdW5pZm9ybSAoaGlnaHAgfG1lZGl1bXAgfGxvd3AgKT8oW1xcd10rKSAoW1xcd10rKShbXFxzXSopKFtcXHddKikvZztcbiAgICBjb25zdCBhdHRyaWJ1dGVSZWdleCA9IC9hdHRyaWJ1dGUgKGhpZ2hwIHxtZWRpdW1wIHxsb3dwICk/KFtcXHddKykgKFtcXHddKykvZztcblxuICAgIGNvbnN0IHN0YXRpY0F0dHJpYnV0ZXMgPSB2ZXJ0ZXhTb3VyY2UubWF0Y2goYXR0cmlidXRlUmVnZXgpO1xuICAgIGNvbnN0IGZyYWdtZW50VW5pZm9ybXMgPSBmcmFnbWVudFNvdXJjZS5tYXRjaCh1bmlmb3JtUmVnZXgpO1xuICAgIGNvbnN0IHZlcnRleFVuaWZvcm1zID0gdmVydGV4U291cmNlLm1hdGNoKHVuaWZvcm1SZWdleCk7XG4gICAgY29uc3QgY29tbW9uVW5pZm9ybXMgPSBwcmVsdWRlQ29tbW9uLm1hdGNoKHVuaWZvcm1SZWdleCk7XG5cbiAgICBsZXQgc3RhdGljVW5pZm9ybXMgPSB2ZXJ0ZXhVbmlmb3JtcyA/IHZlcnRleFVuaWZvcm1zLmNvbmNhdChmcmFnbWVudFVuaWZvcm1zKSA6IGZyYWdtZW50VW5pZm9ybXM7XG5cbiAgICBpZiAoIWlzR2xvYmFsUHJlbHVkZSkge1xuICAgICAgICBpZiAocHJlbHVkZVRlcnJhaW4uc3RhdGljVW5pZm9ybXMpIHtcbiAgICAgICAgICAgIHN0YXRpY1VuaWZvcm1zID0gcHJlbHVkZVRlcnJhaW4uc3RhdGljVW5pZm9ybXMuY29uY2F0KHN0YXRpY1VuaWZvcm1zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJlbHVkZUZvZy5zdGF0aWNVbmlmb3Jtcykge1xuICAgICAgICAgICAgc3RhdGljVW5pZm9ybXMgPSBwcmVsdWRlRm9nLnN0YXRpY1VuaWZvcm1zLmNvbmNhdChzdGF0aWNVbmlmb3Jtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdGljVW5pZm9ybXMpIHtcbiAgICAgICAgc3RhdGljVW5pZm9ybXMgPSBzdGF0aWNVbmlmb3Jtcy5jb25jYXQoY29tbW9uVW5pZm9ybXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGZyYWdtZW50UHJhZ21hcyA9IHt9O1xuXG4gICAgZnJhZ21lbnRTb3VyY2UgPSBmcmFnbWVudFNvdXJjZS5yZXBsYWNlKHByYWdtYVJlZ2V4LCAobWF0Y2gsIG9wZXJhdGlvbiwgcHJlY2lzaW9uLCB0eXBlLCBuYW1lKSA9PiB7XG4gICAgICAgIGZyYWdtZW50UHJhZ21hc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09ICdkZWZpbmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbnZhcnlpbmcgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfTtcbiNlbHNlXG51bmlmb3JtICR7cHJlY2lzaW9ufSAke3R5cGV9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgfSBlbHNlIC8qIGlmIChvcGVyYXRpb24gPT09ICdpbml0aWFsaXplJykgKi8ge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiNpZmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICB2ZXJ0ZXhTb3VyY2UgPSB2ZXJ0ZXhTb3VyY2UucmVwbGFjZShwcmFnbWFSZWdleCwgKG1hdGNoLCBvcGVyYXRpb24sIHByZWNpc2lvbiwgdHlwZSwgbmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBhdHRyVHlwZSA9IHR5cGUgPT09ICdmbG9hdCcgPyAndmVjMicgOiAndmVjNCc7XG4gICAgICAgIGNvbnN0IHVucGFja1R5cGUgPSBuYW1lLm1hdGNoKC9jb2xvci8pID8gJ2NvbG9yJyA6IGF0dHJUeXBlO1xuXG4gICAgICAgIGlmIChmcmFnbWVudFByYWdtYXNbbmFtZV0pIHtcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT09ICdkZWZpbmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG51bmlmb3JtIGxvd3AgZmxvYXQgdV8ke25hbWV9X3Q7XG5hdHRyaWJ1dGUgJHtwcmVjaXNpb259ICR7YXR0clR5cGV9IGFfJHtuYW1lfTtcbnZhcnlpbmcgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfTtcbiNlbHNlXG51bmlmb3JtICR7cHJlY2lzaW9ufSAke3R5cGV9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAob3BlcmF0aW9uID09PSAnaW5pdGlhbGl6ZScpICovIHtcbiAgICAgICAgICAgICAgICBpZiAodW5wYWNrVHlwZSA9PT0gJ3ZlYzQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHZlYzQgYXR0cmlidXRlcyBhcmUgb25seSB1c2VkIGZvciBjcm9zcy1mYWRlZCBwcm9wZXJ0aWVzLCBhbmQgYXJlIG5vdCBwYWNrZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG4gICAgJHtuYW1lfSA9IGFfJHtuYW1lfTtcbiNlbHNlXG4gICAgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfSA9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxuI2lmbmRlZiBIQVNfVU5JRk9STV91XyR7bmFtZX1cbiAgICAke25hbWV9ID0gdW5wYWNrX21peF8ke3VucGFja1R5cGV9KGFfJHtuYW1lfSwgdV8ke25hbWV9X3QpO1xuI2Vsc2VcbiAgICAke3ByZWNpc2lvbn0gJHt0eXBlfSAke25hbWV9ID0gdV8ke25hbWV9O1xuI2VuZGlmXG5gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb24gPT09ICdkZWZpbmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG51bmlmb3JtIGxvd3AgZmxvYXQgdV8ke25hbWV9X3Q7XG5hdHRyaWJ1dGUgJHtwcmVjaXNpb259ICR7YXR0clR5cGV9IGFfJHtuYW1lfTtcbiNlbHNlXG51bmlmb3JtICR7cHJlY2lzaW9ufSAke3R5cGV9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAob3BlcmF0aW9uID09PSAnaW5pdGlhbGl6ZScpICovIHtcbiAgICAgICAgICAgICAgICBpZiAodW5wYWNrVHlwZSA9PT0gJ3ZlYzQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHZlYzQgYXR0cmlidXRlcyBhcmUgb25seSB1c2VkIGZvciBjcm9zcy1mYWRlZCBwcm9wZXJ0aWVzLCBhbmQgYXJlIG5vdCBwYWNrZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBcbiNpZm5kZWYgSEFTX1VOSUZPUk1fdV8ke25hbWV9XG4gICAgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfSA9IGFfJHtuYW1lfTtcbiNlbHNlXG4gICAgJHtwcmVjaXNpb259ICR7dHlwZX0gJHtuYW1lfSA9IHVfJHtuYW1lfTtcbiNlbmRpZlxuYDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgLyogKi97XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgXG4jaWZuZGVmIEhBU19VTklGT1JNX3VfJHtuYW1lfVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSB1bnBhY2tfbWl4XyR7dW5wYWNrVHlwZX0oYV8ke25hbWV9LCB1XyR7bmFtZX1fdCk7XG4jZWxzZVxuICAgICR7cHJlY2lzaW9ufSAke3R5cGV9ICR7bmFtZX0gPSB1XyR7bmFtZX07XG4jZW5kaWZcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge2ZyYWdtZW50U291cmNlLCB2ZXJ0ZXhTb3VyY2UsIHN0YXRpY0F0dHJpYnV0ZXMsIHN0YXRpY1VuaWZvcm1zfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUgUHJvZ3JhbSBmcm9tICcuL3Byb2dyYW0uanMnO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uL2dsL3ZlcnRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vZ2wvaW5kZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5cbmNsYXNzIFZlcnRleEFycmF5T2JqZWN0IHtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuICAgIGJvdW5kUHJvZ3JhbTogP1Byb2dyYW08Kj47XG4gICAgYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXI7XG4gICAgYm91bmRQYWludFZlcnRleEJ1ZmZlcnM6IEFycmF5PFZlcnRleEJ1ZmZlcj47XG4gICAgYm91bmRJbmRleEJ1ZmZlcjogP0luZGV4QnVmZmVyO1xuICAgIGJvdW5kVmVydGV4T2Zmc2V0OiA/bnVtYmVyO1xuICAgIGJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcjtcbiAgICBib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIyOiA/VmVydGV4QnVmZmVyO1xuICAgIGJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlcjM6ID9WZXJ0ZXhCdWZmZXI7XG4gICAgdmFvOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5ib3VuZFByb2dyYW0gPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kTGF5b3V0VmVydGV4QnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZFBhaW50VmVydGV4QnVmZmVycyA9IFtdO1xuICAgICAgICB0aGlzLmJvdW5kSW5kZXhCdWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kVmVydGV4T2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZER5bmFtaWNWZXJ0ZXhCdWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnZhbyA9IG51bGw7XG4gICAgfVxuXG4gICAgYmluZChjb250ZXh0OiBDb250ZXh0LFxuICAgICAgICAgcHJvZ3JhbTogUHJvZ3JhbTwqPixcbiAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyLFxuICAgICAgICAgcGFpbnRWZXJ0ZXhCdWZmZXJzOiBBcnJheTxWZXJ0ZXhCdWZmZXI+LFxuICAgICAgICAgaW5kZXhCdWZmZXI6ID9JbmRleEJ1ZmZlcixcbiAgICAgICAgIHZlcnRleE9mZnNldDogP251bWJlcixcbiAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXI6ID9WZXJ0ZXhCdWZmZXIsXG4gICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyMjogP1ZlcnRleEJ1ZmZlcixcbiAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIzOiA/VmVydGV4QnVmZmVyKSB7XG5cbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcblxuICAgICAgICBsZXQgcGFpbnRCdWZmZXJzRGlmZmVyID0gdGhpcy5ib3VuZFBhaW50VmVydGV4QnVmZmVycy5sZW5ndGggIT09IHBhaW50VmVydGV4QnVmZmVycy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFpbnRCdWZmZXJzRGlmZmVyICYmIGkgPCBwYWludFZlcnRleEJ1ZmZlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJvdW5kUGFpbnRWZXJ0ZXhCdWZmZXJzW2ldICE9PSBwYWludFZlcnRleEJ1ZmZlcnNbaV0pIHtcbiAgICAgICAgICAgICAgICBwYWludEJ1ZmZlcnNEaWZmZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNGcmVzaEJpbmRSZXF1aXJlZCA9IChcbiAgICAgICAgICAgICF0aGlzLnZhbyB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZFByb2dyYW0gIT09IHByb2dyYW0gfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmRMYXlvdXRWZXJ0ZXhCdWZmZXIgIT09IGxheW91dFZlcnRleEJ1ZmZlciB8fFxuICAgICAgICAgICAgcGFpbnRCdWZmZXJzRGlmZmVyIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kSW5kZXhCdWZmZXIgIT09IGluZGV4QnVmZmVyIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kVmVydGV4T2Zmc2V0ICE9PSB2ZXJ0ZXhPZmZzZXQgfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyICE9PSBkeW5hbWljVmVydGV4QnVmZmVyIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlcjIgIT09IGR5bmFtaWNWZXJ0ZXhCdWZmZXIyIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlcjMgIT09IGR5bmFtaWNWZXJ0ZXhCdWZmZXIzXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFjb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0IHx8IGlzRnJlc2hCaW5kUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlc2hCaW5kKHByb2dyYW0sIGxheW91dFZlcnRleEJ1ZmZlciwgcGFpbnRWZXJ0ZXhCdWZmZXJzLCBpbmRleEJ1ZmZlciwgdmVydGV4T2Zmc2V0LCBkeW5hbWljVmVydGV4QnVmZmVyLCBkeW5hbWljVmVydGV4QnVmZmVyMiwgZHluYW1pY1ZlcnRleEJ1ZmZlcjMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGV4dC5iaW5kVmVydGV4QXJyYXlPRVMuc2V0KHRoaXMudmFvKTtcblxuICAgICAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgYnVmZmVyIG1heSBoYXZlIGJlZW4gdXBkYXRlZC4gUmViaW5kIHRvIHVwbG9hZCBkYXRhLlxuICAgICAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW5kZXhCdWZmZXIgJiYgaW5kZXhCdWZmZXIuZHluYW1pY0RyYXcpIHtcbiAgICAgICAgICAgICAgICBpbmRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyMikge1xuICAgICAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyLmJpbmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIzKSB7XG4gICAgICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjMuYmluZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnJlc2hCaW5kKHByb2dyYW06IFByb2dyYW08Kj4sXG4gICAgICAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyLFxuICAgICAgICAgICAgICBwYWludFZlcnRleEJ1ZmZlcnM6IEFycmF5PFZlcnRleEJ1ZmZlcj4sXG4gICAgICAgICAgICAgIGluZGV4QnVmZmVyOiA/SW5kZXhCdWZmZXIsXG4gICAgICAgICAgICAgIHZlcnRleE9mZnNldDogP251bWJlcixcbiAgICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjogP1ZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjI6ID9WZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIzOiA/VmVydGV4QnVmZmVyKSB7XG4gICAgICAgIGxldCBudW1QcmV2QXR0cmlidXRlcztcbiAgICAgICAgY29uc3QgbnVtTmV4dEF0dHJpYnV0ZXMgPSBwcm9ncmFtLm51bUF0dHJpYnV0ZXM7XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmIChjb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YW8pIHRoaXMuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy52YW8gPSBjb250ZXh0LmV4dFZlcnRleEFycmF5T2JqZWN0LmNyZWF0ZVZlcnRleEFycmF5T0VTKCk7XG4gICAgICAgICAgICBjb250ZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUy5zZXQodGhpcy52YW8pO1xuICAgICAgICAgICAgbnVtUHJldkF0dHJpYnV0ZXMgPSAwO1xuXG4gICAgICAgICAgICAvLyBzdG9yZSB0aGUgYXJndW1lbnRzIHNvIHRoYXQgd2UgY2FuIHZlcmlmeSB0aGVtIHdoZW4gdGhlIHZhbyBpcyBib3VuZCBhZ2FpblxuICAgICAgICAgICAgdGhpcy5ib3VuZFByb2dyYW0gPSBwcm9ncmFtO1xuICAgICAgICAgICAgdGhpcy5ib3VuZExheW91dFZlcnRleEJ1ZmZlciA9IGxheW91dFZlcnRleEJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuYm91bmRQYWludFZlcnRleEJ1ZmZlcnMgPSBwYWludFZlcnRleEJ1ZmZlcnM7XG4gICAgICAgICAgICB0aGlzLmJvdW5kSW5kZXhCdWZmZXIgPSBpbmRleEJ1ZmZlcjtcbiAgICAgICAgICAgIHRoaXMuYm91bmRWZXJ0ZXhPZmZzZXQgPSB2ZXJ0ZXhPZmZzZXQ7XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlciA9IGR5bmFtaWNWZXJ0ZXhCdWZmZXI7XG4gICAgICAgICAgICB0aGlzLmJvdW5kRHluYW1pY1ZlcnRleEJ1ZmZlcjIgPSBkeW5hbWljVmVydGV4QnVmZmVyMjtcbiAgICAgICAgICAgIHRoaXMuYm91bmREeW5hbWljVmVydGV4QnVmZmVyMyA9IGR5bmFtaWNWZXJ0ZXhCdWZmZXIzO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBudW1QcmV2QXR0cmlidXRlcyA9IGNvbnRleHQuY3VycmVudE51bUF0dHJpYnV0ZXMgfHwgMDtcblxuICAgICAgICAgICAgLy8gRGlzYWJsZSBhbGwgYXR0cmlidXRlcyBmcm9tIHRoZSBwcmV2aW91cyBwcm9ncmFtIHRoYXQgYXJlbid0IHVzZWQgaW5cbiAgICAgICAgICAgIC8vIHRoZSBuZXcgcHJvZ3JhbS4gTm90ZTogYXR0cmlidXRlIGluZGljZXMgYXJlICpub3QqIHByb2dyYW0gc3BlY2lmaWMhXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gbnVtTmV4dEF0dHJpYnV0ZXM7IGkgPCBudW1QcmV2QXR0cmlidXRlczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gV2ViR0wgYnJlYWtzIGlmIHlvdSBkaXNhYmxlIGF0dHJpYnV0ZSAwLlxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjAzMDUyMzFcbiAgICAgICAgICAgICAgICBhc3NlcnQoaSAhPT0gMCk7XG4gICAgICAgICAgICAgICAgZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLmVuYWJsZUF0dHJpYnV0ZXMoZ2wsIHByb2dyYW0pO1xuICAgICAgICBmb3IgKGNvbnN0IHZlcnRleEJ1ZmZlciBvZiBwYWludFZlcnRleEJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIHZlcnRleEJ1ZmZlci5lbmFibGVBdHRyaWJ1dGVzKGdsLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyLmVuYWJsZUF0dHJpYnV0ZXMoZ2wsIHByb2dyYW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyMikge1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjIuZW5hYmxlQXR0cmlidXRlcyhnbCwgcHJvZ3JhbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIzKSB7XG4gICAgICAgICAgICBkeW5hbWljVmVydGV4QnVmZmVyMy5lbmFibGVBdHRyaWJ1dGVzKGdsLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxheW91dFZlcnRleEJ1ZmZlci5iaW5kKCk7XG4gICAgICAgIGxheW91dFZlcnRleEJ1ZmZlci5zZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbCwgcHJvZ3JhbSwgdmVydGV4T2Zmc2V0KTtcbiAgICAgICAgZm9yIChjb25zdCB2ZXJ0ZXhCdWZmZXIgb2YgcGFpbnRWZXJ0ZXhCdWZmZXJzKSB7XG4gICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICAgICAgdmVydGV4QnVmZmVyLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGR5bmFtaWNWZXJ0ZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIuYmluZCgpO1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlci5zZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbCwgcHJvZ3JhbSwgdmVydGV4T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhCdWZmZXIpIHtcbiAgICAgICAgICAgIGluZGV4QnVmZmVyLmJpbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHluYW1pY1ZlcnRleEJ1ZmZlcjIpIHtcbiAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyLmJpbmQoKTtcbiAgICAgICAgICAgIGR5bmFtaWNWZXJ0ZXhCdWZmZXIyLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkeW5hbWljVmVydGV4QnVmZmVyMykge1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjMuYmluZCgpO1xuICAgICAgICAgICAgZHluYW1pY1ZlcnRleEJ1ZmZlcjMuc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2wsIHByb2dyYW0sIHZlcnRleE9mZnNldCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0LmN1cnJlbnROdW1BdHRyaWJ1dGVzID0gbnVtTmV4dEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFvKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZXh0VmVydGV4QXJyYXlPYmplY3QuZGVsZXRlVmVydGV4QXJyYXlPRVModGhpcy52YW8pO1xuICAgICAgICAgICAgdGhpcy52YW8gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWZXJ0ZXhBcnJheU9iamVjdDtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtQ29sb3IsXG4gICAgVW5pZm9ybU1hdHJpeDRmLFxuICAgIFVuaWZvcm00ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi8uLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4uLy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgSGlsbHNoYWRlU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9oaWxsc2hhZGVfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgREVNRGF0YSBmcm9tICcuLi8uLi9kYXRhL2RlbV9kYXRhLmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5cbmV4cG9ydCB0eXBlIEhpbGxzaGFkZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X2xhdHJhbmdlJzogVW5pZm9ybTJmLFxuICAgICd1X2xpZ2h0JzogVW5pZm9ybTJmLFxuICAgICd1X3NoYWRvdyc6IFVuaWZvcm1Db2xvcixcbiAgICAndV9oaWdobGlnaHQnOiBVbmlmb3JtQ29sb3IsXG4gICAgJ3VfYWNjZW50JzogVW5pZm9ybUNvbG9yXG58fTtcblxuZXhwb3J0IHR5cGUgSGlsbHNoYWRlUHJlcGFyZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X2RpbWVuc2lvbic6IFVuaWZvcm0yZixcbiAgICAndV96b29tJzogVW5pZm9ybTFmLFxuICAgICd1X3VucGFjayc6IFVuaWZvcm00ZlxufH07XG5cbmNvbnN0IGhpbGxzaGFkZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEhpbGxzaGFkZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UpLFxuICAgICd1X2xhdHJhbmdlJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9sYXRyYW5nZSksXG4gICAgJ3VfbGlnaHQnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0KSxcbiAgICAndV9zaGFkb3cnOiBuZXcgVW5pZm9ybUNvbG9yKGNvbnRleHQsIGxvY2F0aW9ucy51X3NoYWRvdyksXG4gICAgJ3VfaGlnaGxpZ2h0JzogbmV3IFVuaWZvcm1Db2xvcihjb250ZXh0LCBsb2NhdGlvbnMudV9oaWdobGlnaHQpLFxuICAgICd1X2FjY2VudCc6IG5ldyBVbmlmb3JtQ29sb3IoY29udGV4dCwgbG9jYXRpb25zLnVfYWNjZW50KVxufSk7XG5cbmNvbnN0IGhpbGxzaGFkZVByZXBhcmVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBIaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfZGltZW5zaW9uJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9kaW1lbnNpb24pLFxuICAgICd1X3pvb20nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3pvb20pLFxuICAgICd1X3VucGFjayc6IG5ldyBVbmlmb3JtNGYoY29udGV4dCwgbG9jYXRpb25zLnVfdW5wYWNrKVxufSk7XG5cbmNvbnN0IGhpbGxzaGFkZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICB0aWxlOiBUaWxlLFxuICAgIGxheWVyOiBIaWxsc2hhZGVTdHlsZUxheWVyLFxuICAgIG1hdHJpeDogP0Zsb2F0MzJBcnJheVxuKTogVW5pZm9ybVZhbHVlczxIaWxsc2hhZGVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCBzaGFkb3cgPSBsYXllci5wYWludC5nZXQoXCJoaWxsc2hhZGUtc2hhZG93LWNvbG9yXCIpO1xuICAgIGNvbnN0IGhpZ2hsaWdodCA9IGxheWVyLnBhaW50LmdldChcImhpbGxzaGFkZS1oaWdobGlnaHQtY29sb3JcIik7XG4gICAgY29uc3QgYWNjZW50ID0gbGF5ZXIucGFpbnQuZ2V0KFwiaGlsbHNoYWRlLWFjY2VudC1jb2xvclwiKTtcblxuICAgIGxldCBhemltdXRoYWwgPSBsYXllci5wYWludC5nZXQoJ2hpbGxzaGFkZS1pbGx1bWluYXRpb24tZGlyZWN0aW9uJykgKiAoTWF0aC5QSSAvIDE4MCk7XG4gICAgLy8gbW9kaWZ5IGF6aW11dGhhbCBhbmdsZSBieSBtYXAgcm90YXRpb24gaWYgbGlnaHQgaXMgYW5jaG9yZWQgYXQgdGhlIHZpZXdwb3J0XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnaGlsbHNoYWRlLWlsbHVtaW5hdGlvbi1hbmNob3InKSA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgICAgICBhemltdXRoYWwgLT0gcGFpbnRlci50cmFuc2Zvcm0uYW5nbGU7XG4gICAgfVxuICAgIGNvbnN0IGFsaWduID0gIXBhaW50ZXIub3B0aW9ucy5tb3Zpbmc7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfbWF0cml4JzogbWF0cml4ID8gbWF0cml4IDogcGFpbnRlci50cmFuc2Zvcm0uY2FsY3VsYXRlUHJvak1hdHJpeCh0aWxlLnRpbGVJRC50b1Vud3JhcHBlZCgpLCBhbGlnbiksXG4gICAgICAgICd1X2ltYWdlJzogMCxcbiAgICAgICAgJ3VfbGF0cmFuZ2UnOiBnZXRUaWxlTGF0UmFuZ2UocGFpbnRlciwgdGlsZS50aWxlSUQpLFxuICAgICAgICAndV9saWdodCc6IFtsYXllci5wYWludC5nZXQoJ2hpbGxzaGFkZS1leGFnZ2VyYXRpb24nKSwgYXppbXV0aGFsXSxcbiAgICAgICAgJ3Vfc2hhZG93Jzogc2hhZG93LFxuICAgICAgICAndV9oaWdobGlnaHQnOiBoaWdobGlnaHQsXG4gICAgICAgICd1X2FjY2VudCc6IGFjY2VudFxuICAgIH07XG59O1xuXG5jb25zdCBoaWxsc2hhZGVVbmlmb3JtUHJlcGFyZVZhbHVlcyA9IChcbiAgICB0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIGRlbTogREVNRGF0YVxuKTogVW5pZm9ybVZhbHVlczxIaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXNUeXBlPiA9PiB7XG5cbiAgICBjb25zdCBzdHJpZGUgPSBkZW0uc3RyaWRlO1xuICAgIGNvbnN0IG1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgLy8gRmxpcCByZW5kZXJpbmcgYXQgeSBheGlzLlxuICAgIG1hdDQub3J0aG8obWF0cml4LCAwLCBFWFRFTlQsIC1FWFRFTlQsIDAsIDAsIDEpO1xuICAgIG1hdDQudHJhbnNsYXRlKG1hdHJpeCwgbWF0cml4LCBbMCwgLUVYVEVOVCwgMF0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICAgICAndV9pbWFnZSc6IDEsXG4gICAgICAgICd1X2RpbWVuc2lvbic6IFtzdHJpZGUsIHN0cmlkZV0sXG4gICAgICAgICd1X3pvb20nOiB0aWxlSUQub3ZlcnNjYWxlZFosXG4gICAgICAgICd1X3VucGFjayc6IGRlbS51bnBhY2tWZWN0b3JcbiAgICB9O1xufTtcblxuZnVuY3Rpb24gZ2V0VGlsZUxhdFJhbmdlKHBhaW50ZXI6IFBhaW50ZXIsIHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgIC8vIGZvciBzY2FsaW5nIHRoZSBtYWduaXR1ZGUgb2YgYSBwb2ludHMgc2xvcGUgYnkgaXRzIGxhdGl0dWRlXG4gICAgY29uc3QgdGlsZXNBdFpvb20gPSBNYXRoLnBvdygyLCB0aWxlSUQuY2Fub25pY2FsLnopO1xuICAgIGNvbnN0IHkgPSB0aWxlSUQuY2Fub25pY2FsLnk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZSgwLCB5IC8gdGlsZXNBdFpvb20pLnRvTG5nTGF0KCkubGF0LFxuICAgICAgICBuZXcgTWVyY2F0b3JDb29yZGluYXRlKDAsICh5ICsgMSkgLyB0aWxlc0F0Wm9vbSkudG9MbmdMYXQoKS5sYXRdO1xufVxuXG5leHBvcnQge1xuICAgIGhpbGxzaGFkZVVuaWZvcm1zLFxuICAgIGhpbGxzaGFkZVByZXBhcmVVbmlmb3JtcyxcbiAgICBoaWxsc2hhZGVVbmlmb3JtVmFsdWVzLFxuICAgIGhpbGxzaGFkZVVuaWZvcm1QcmVwYXJlVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlLmpzJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IHtcbiAgICBoaWxsc2hhZGVVbmlmb3JtVmFsdWVzLFxuICAgIGhpbGxzaGFkZVVuaWZvcm1QcmVwYXJlVmFsdWVzXG59IGZyb20gJy4vcHJvZ3JhbS9oaWxsc2hhZGVfcHJvZ3JhbS5qcyc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSBIaWxsc2hhZGVTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2hpbGxzaGFkZV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IERFTURhdGEgZnJvbSAnLi4vZGF0YS9kZW1fZGF0YS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdIaWxsc2hhZGU7XG5cbmZ1bmN0aW9uIGRyYXdIaWxsc2hhZGUocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogSGlsbHNoYWRlU3R5bGVMYXllciwgdGlsZUlEczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAnb2Zmc2NyZWVuJyAmJiBwYWludGVyLnJlbmRlclBhc3MgIT09ICd0cmFuc2x1Y2VudCcpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG5cbiAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG5cbiAgICAvLyBXaGVuIHJlbmRlcmluZyB0byB0ZXh0dXJlLCBjb29yZGluYXRlcyBhcmUgYWxyZWFkeSBzb3J0ZWQ6IHByaW1hcnkgYnlcbiAgICAvLyBwcm94eSBpZCBhbmQgc2Vjb25kYXJ5IHNvcnQgaXMgYnkgWi5cbiAgICBjb25zdCByZW5kZXJpbmdUb1RleHR1cmUgPSBwYWludGVyLnRlcnJhaW4gJiYgcGFpbnRlci50ZXJyYWluLnJlbmRlcmluZ1RvVGV4dHVyZTtcbiAgICBjb25zdCBbc3RlbmNpbE1vZGVzLCBjb29yZHNdID0gcGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnICYmICFyZW5kZXJpbmdUb1RleHR1cmUgP1xuICAgICAgICBwYWludGVyLnN0ZW5jaWxDb25maWdGb3JPdmVybGFwKHRpbGVJRHMpIDogW3t9LCB0aWxlSURzXTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgaWYgKHRpbGUubmVlZHNIaWxsc2hhZGVQcmVwYXJlICYmIHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ29mZnNjcmVlbicpIHtcbiAgICAgICAgICAgIHByZXBhcmVIaWxsc2hhZGUocGFpbnRlciwgdGlsZSwgbGF5ZXIsIGRlcHRoTW9kZSwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsIGNvbG9yTW9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGVuY2lsTW9kZSA9IHJlbmRlcmluZ1RvVGV4dHVyZSAmJiBwYWludGVyLnRlcnJhaW4gP1xuICAgICAgICAgICAgICAgIHBhaW50ZXIudGVycmFpbi5zdGVuY2lsTW9kZUZvclJUVE92ZXJsYXAoY29vcmQpIDogc3RlbmNpbE1vZGVzW2Nvb3JkLm92ZXJzY2FsZWRaXTtcbiAgICAgICAgICAgIHJlbmRlckhpbGxzaGFkZShwYWludGVyLCBjb29yZCwgdGlsZSwgbGF5ZXIsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgcGFpbnRlci53aWR0aCwgcGFpbnRlci5oZWlnaHRdKTtcblxuICAgIHBhaW50ZXIucmVzZXRTdGVuY2lsQ2xpcHBpbmdNYXNrcygpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJIaWxsc2hhZGUocGFpbnRlciwgY29vcmQsIHRpbGUsIGxheWVyLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCBmYm8gPSB0aWxlLmZibztcbiAgICBpZiAoIWZibykgcmV0dXJuO1xuICAgIHBhaW50ZXIucHJlcGFyZURyYXdUaWxlKCk7XG5cbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdoaWxsc2hhZGUnKTtcblxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGZiby5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpO1xuXG4gICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGhpbGxzaGFkZVVuaWZvcm1WYWx1ZXMocGFpbnRlciwgdGlsZSwgbGF5ZXIsIHBhaW50ZXIudGVycmFpbiA/IGNvb3JkLnByb2pNYXRyaXggOiBudWxsKTtcblxuICAgIHBhaW50ZXIucHJlcGFyZURyYXdQcm9ncmFtKGNvbnRleHQsIHByb2dyYW0sIGNvb3JkLnRvVW53cmFwcGVkKCkpO1xuXG4gICAgY29uc3Qge3RpbGVCb3VuZHNCdWZmZXIsIHRpbGVCb3VuZHNJbmRleEJ1ZmZlciwgdGlsZUJvdW5kc1NlZ21lbnRzfSA9IHBhaW50ZXIuZ2V0VGlsZUJvdW5kc0J1ZmZlcnModGlsZSk7XG5cbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgdW5pZm9ybVZhbHVlcywgbGF5ZXIuaWQsIHRpbGVCb3VuZHNCdWZmZXIsXG4gICAgICAgIHRpbGVCb3VuZHNJbmRleEJ1ZmZlciwgdGlsZUJvdW5kc1NlZ21lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVERU1UZXh0dXJlKHBhaW50ZXI6IFBhaW50ZXIsIHRpbGU6IFRpbGUsIGRlbTogREVNRGF0YSkge1xuICAgIGlmICghdGlsZS5uZWVkc0RFTVRleHR1cmVVcGxvYWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgY29udGV4dC5waXhlbFN0b3JlVW5wYWNrUHJlbXVsdGlwbHlBbHBoYS5zZXQoZmFsc2UpO1xuICAgIGNvbnN0IHRleHR1cmVTdHJpZGUgPSBkZW0uc3RyaWRlO1xuICAgIHRpbGUuZGVtVGV4dHVyZSA9IHRpbGUuZGVtVGV4dHVyZSB8fCBwYWludGVyLmdldFRpbGVUZXh0dXJlKHRleHR1cmVTdHJpZGUpO1xuICAgIGNvbnN0IHBpeGVsRGF0YSA9IGRlbS5nZXRQaXhlbHMoKTtcbiAgICBpZiAodGlsZS5kZW1UZXh0dXJlKSB7XG4gICAgICAgIHRpbGUuZGVtVGV4dHVyZS51cGRhdGUocGl4ZWxEYXRhLCB7cHJlbXVsdGlwbHk6IGZhbHNlfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGlsZS5kZW1UZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgcGl4ZWxEYXRhLCBnbC5SR0JBLCB7cHJlbXVsdGlwbHk6IGZhbHNlfSk7XG4gICAgfVxuICAgIHRpbGUubmVlZHNERU1UZXh0dXJlVXBsb2FkID0gZmFsc2U7XG59XG5cbi8vIGhpbGxzaGFkZSByZW5kZXJpbmcgaXMgZG9uZSBpbiB0d28gc3RlcHMuIHRoZSBwcmVwYXJlIHN0ZXAgZmlyc3QgY2FsY3VsYXRlcyB0aGUgc2xvcGUgb2YgdGhlIHRlcnJhaW4gaW4gdGhlIHggYW5kIHlcbi8vIGRpcmVjdGlvbnMgZm9yIGVhY2ggcGl4ZWwsIGFuZCBzYXZlcyB0aG9zZSB2YWx1ZXMgdG8gYSBmcmFtZWJ1ZmZlciB0ZXh0dXJlIGluIHRoZSByIGFuZCBnIGNoYW5uZWxzLlxuZnVuY3Rpb24gcHJlcGFyZUhpbGxzaGFkZShwYWludGVyLCB0aWxlLCBsYXllciwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgaWYgKCF0aWxlLmRlbSkgcmV0dXJuO1xuICAgIGNvbnN0IGRlbTogREVNRGF0YSA9IHRpbGUuZGVtO1xuXG4gICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMSk7XG4gICAgcHJlcGFyZURFTVRleHR1cmUocGFpbnRlciwgdGlsZSwgZGVtKTtcbiAgICBhc3NlcnQodGlsZS5kZW1UZXh0dXJlKTtcbiAgICBpZiAoIXRpbGUuZGVtVGV4dHVyZSkgcmV0dXJuOyAvLyBTaWxlbmNlIGZsb3cuXG4gICAgdGlsZS5kZW1UZXh0dXJlLmJpbmQoZ2wuTkVBUkVTVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgY29uc3QgdGlsZVNpemUgPSBkZW0uZGltO1xuXG4gICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgbGV0IGZibyA9IHRpbGUuZmJvO1xuICAgIGlmICghZmJvKSB7XG4gICAgICAgIGNvbnN0IHJlbmRlclRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB7d2lkdGg6IHRpbGVTaXplLCBoZWlnaHQ6IHRpbGVTaXplLCBkYXRhOiBudWxsfSwgZ2wuUkdCQSk7XG4gICAgICAgIHJlbmRlclRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgIGZibyA9IHRpbGUuZmJvID0gY29udGV4dC5jcmVhdGVGcmFtZWJ1ZmZlcih0aWxlU2l6ZSwgdGlsZVNpemUsIHRydWUpO1xuICAgICAgICBmYm8uY29sb3JBdHRhY2htZW50LnNldChyZW5kZXJUZXh0dXJlLnRleHR1cmUpO1xuICAgIH1cblxuICAgIGNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldChmYm8uZnJhbWVidWZmZXIpO1xuICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCB0aWxlU2l6ZSwgdGlsZVNpemVdKTtcblxuICAgIGNvbnN0IHt0aWxlQm91bmRzQnVmZmVyLCB0aWxlQm91bmRzSW5kZXhCdWZmZXIsIHRpbGVCb3VuZHNTZWdtZW50c30gPSBwYWludGVyLmdldE1lcmNhdG9yVGlsZUJvdW5kc0J1ZmZlcnMoKTtcblxuICAgIHBhaW50ZXIudXNlUHJvZ3JhbSgnaGlsbHNoYWRlUHJlcGFyZScpLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLFxuICAgICAgICBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgaGlsbHNoYWRlVW5pZm9ybVByZXBhcmVWYWx1ZXModGlsZS50aWxlSUQsIGRlbSksXG4gICAgICAgIGxheWVyLmlkLCB0aWxlQm91bmRzQnVmZmVyLFxuICAgICAgICB0aWxlQm91bmRzSW5kZXhCdWZmZXIsIHRpbGVCb3VuZHNTZWdtZW50cyk7XG5cbiAgICB0aWxlLm5lZWRzSGlsbHNoYWRlUHJlcGFyZSA9IGZhbHNlO1xufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi9yZW5kZXIvdW5pZm9ybV9iaW5kaW5nLmpzJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi9yZW5kZXIvdW5pZm9ybV9iaW5kaW5nLmpzJztcblxuZXhwb3J0IHR5cGUgVGVycmFpblJhc3RlclVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2ltYWdlMCc6IFVuaWZvcm0xaSxcbiAgICAndV9za2lydF9oZWlnaHQnOiBVbmlmb3JtMWZcbnx9O1xuXG5jb25zdCB0ZXJyYWluUmFzdGVyVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogVGVycmFpblJhc3RlclVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9pbWFnZTAnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlMCksXG4gICAgJ3Vfc2tpcnRfaGVpZ2h0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9za2lydF9oZWlnaHQpXG59KTtcblxuY29uc3QgdGVycmFpblJhc3RlclVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgc2tpcnRIZWlnaHQ6IG51bWJlclxuKTogVW5pZm9ybVZhbHVlczxUZXJyYWluUmFzdGVyVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAndV9pbWFnZTAnOiAwLFxuICAgICd1X3NraXJ0X2hlaWdodCc6IHNraXJ0SGVpZ2h0XG59KTtcblxuZXhwb3J0IHt0ZXJyYWluUmFzdGVyVW5pZm9ybXMsIHRlcnJhaW5SYXN0ZXJVbmlmb3JtVmFsdWVzfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtM2YsXG4gICAgVW5pZm9ybTRmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZixcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybU1hdHJpeDNmXG59IGZyb20gJy4uL3JlbmRlci91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyLmpzJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi9yZW5kZXIvdW5pZm9ybV9iaW5kaW5nLmpzJztcblxuZXhwb3J0IHR5cGUgR2xvYmVSYXN0ZXJVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X3Byb2pfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2dsb2JlX21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9ub3JtYWxpemVfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X21lcmNfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3pvb21fdHJhbnNpdGlvbic6IFVuaWZvcm0xZixcbiAgICAndV9tZXJjX2NlbnRlcic6IFVuaWZvcm0yZixcbiAgICAndV9pbWFnZTAnOiBVbmlmb3JtMWksXG4gICAgJ3VfZ3JpZF9tYXRyaXgnOiBVbmlmb3JtTWF0cml4M2YsXG4gICAgJ3VfZnJ1c3R1bV90bCc6IFVuaWZvcm0zZixcbiAgICAndV9mcnVzdHVtX3RyJzogVW5pZm9ybTNmLFxuICAgICd1X2ZydXN0dW1fYnInOiBVbmlmb3JtM2YsXG4gICAgJ3VfZnJ1c3R1bV9ibCc6IFVuaWZvcm0zZixcbiAgICAndV9nbG9iZV9wb3MnOiBVbmlmb3JtM2YsXG4gICAgJ3VfZ2xvYmVfcmFkaXVzJzogVW5pZm9ybTFmLFxuICAgICd1X3ZpZXdwb3J0JzogVW5pZm9ybTJmXG58fTtcblxuZXhwb3J0IHR5cGUgQXRtb3NwaGVyZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfZnJ1c3R1bV90bCc6IFVuaWZvcm0zZixcbiAgICAndV9mcnVzdHVtX3RyJzogVW5pZm9ybTNmLFxuICAgICd1X2ZydXN0dW1fYnInOiBVbmlmb3JtM2YsXG4gICAgJ3VfZnJ1c3R1bV9ibCc6IFVuaWZvcm0zZixcbiAgICAndV9ob3Jpem9uJzogVW5pZm9ybTFmLFxuICAgICd1X3RyYW5zaXRpb24nOiBVbmlmb3JtMWYsXG4gICAgJ3VfZmFkZW91dF9yYW5nZSc6IFVuaWZvcm0xZixcbiAgICAndV9jb2xvcic6IFVuaWZvcm00ZixcbiAgICAndV9oaWdoX2NvbG9yJzogVW5pZm9ybTRmLFxuICAgICd1X3NwYWNlX2NvbG9yJzogVW5pZm9ybTRmLFxuICAgICd1X3N0YXJfaW50ZW5zaXR5JzogVW5pZm9ybTFmLFxuICAgICd1X3N0YXJfc2l6ZSc6IFVuaWZvcm0xZixcbiAgICAndV9zdGFyX2RlbnNpdHknOiBVbmlmb3JtMWYsXG4gICAgJ3VfdGVtcG9yYWxfb2Zmc2V0JzogVW5pZm9ybTFmLFxuICAgICd1X2hvcml6b25fYW5nbGUnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfcm90YXRpb25fbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmXG58fTtcblxuY29uc3QgZ2xvYmVSYXN0ZXJVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBHbG9iZVJhc3RlclVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X3Byb2pfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9wcm9qX21hdHJpeCksXG4gICAgJ3VfZ2xvYmVfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9nbG9iZV9tYXRyaXgpLFxuICAgICd1X25vcm1hbGl6ZV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X25vcm1hbGl6ZV9tYXRyaXgpLFxuICAgICd1X21lcmNfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tZXJjX21hdHJpeCksXG4gICAgJ3Vfem9vbV90cmFuc2l0aW9uJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV96b29tX3RyYW5zaXRpb24pLFxuICAgICd1X21lcmNfY2VudGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9tZXJjX2NlbnRlciksXG4gICAgJ3VfaW1hZ2UwJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZTApLFxuICAgICd1X2dyaWRfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXgzZihjb250ZXh0LCBsb2NhdGlvbnMudV9ncmlkX21hdHJpeCksXG4gICAgJ3VfZnJ1c3R1bV90bCc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfZnJ1c3R1bV90bCksXG4gICAgJ3VfZnJ1c3R1bV90cic6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfZnJ1c3R1bV90ciksXG4gICAgJ3VfZnJ1c3R1bV9icic6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfZnJ1c3R1bV9iciksXG4gICAgJ3VfZnJ1c3R1bV9ibCc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfZnJ1c3R1bV9ibCksXG4gICAgJ3VfZ2xvYmVfcG9zJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9nbG9iZV9wb3MpLFxuICAgICd1X2dsb2JlX3JhZGl1cyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZ2xvYmVfcmFkaXVzKSxcbiAgICAndV92aWV3cG9ydCc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdmlld3BvcnQpXG59KTtcblxuY29uc3QgYXRtb3NwaGVyZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEF0bW9zcGhlcmVVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9mcnVzdHVtX3RsJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9mcnVzdHVtX3RsKSxcbiAgICAndV9mcnVzdHVtX3RyJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9mcnVzdHVtX3RyKSxcbiAgICAndV9mcnVzdHVtX2JyJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9mcnVzdHVtX2JyKSxcbiAgICAndV9mcnVzdHVtX2JsJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9mcnVzdHVtX2JsKSxcbiAgICAndV9ob3Jpem9uJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9ob3Jpem9uKSxcbiAgICAndV90cmFuc2l0aW9uJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV90cmFuc2l0aW9uKSxcbiAgICAndV9mYWRlb3V0X3JhbmdlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlb3V0X3JhbmdlKSxcbiAgICAndV9jb2xvcic6IG5ldyBVbmlmb3JtNGYoY29udGV4dCwgbG9jYXRpb25zLnVfY29sb3IpLFxuICAgICd1X2hpZ2hfY29sb3InOiBuZXcgVW5pZm9ybTRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2hpZ2hfY29sb3IpLFxuICAgICd1X3NwYWNlX2NvbG9yJzogbmV3IFVuaWZvcm00Zihjb250ZXh0LCBsb2NhdGlvbnMudV9zcGFjZV9jb2xvciksXG4gICAgJ3Vfc3Rhcl9pbnRlbnNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3N0YXJfaW50ZW5zaXR5KSxcbiAgICAndV9zdGFyX2RlbnNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3N0YXJfZGVuc2l0eSksXG4gICAgJ3Vfc3Rhcl9zaXplJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zdGFyX3NpemUpLFxuICAgICd1X3RlbXBvcmFsX29mZnNldCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdGVtcG9yYWxfb2Zmc2V0KSxcbiAgICAndV9ob3Jpem9uX2FuZ2xlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9ob3Jpem9uX2FuZ2xlKSxcbiAgICAndV9yb3RhdGlvbl9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X3JvdGF0aW9uX21hdHJpeClcbn0pO1xuXG5jb25zdCBnbG9iZVJhc3RlclVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgcHJvak1hdHJpeDogQXJyYXk8bnVtYmVyPixcbiAgICBnbG9iZU1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGdsb2JlTWVyY2F0b3JNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBub3JtYWxpemVNYXRyaXg6IEZsb2F0NjRBcnJheSxcbiAgICB6b29tVHJhbnNpdGlvbjogbnVtYmVyLFxuICAgIG1lcmNDZW50ZXI6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZnJ1c3R1bURpclRsOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZnJ1c3R1bURpclRyOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZnJ1c3R1bURpckJyOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZnJ1c3R1bURpckJsOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZ2xvYmVQb3NpdGlvbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGdsb2JlUmFkaXVzOiBudW1iZXIsXG4gICAgdmlld3BvcnQ6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZ3JpZE1hdHJpeDogP0FycmF5PG51bWJlcj5cbik6IFVuaWZvcm1WYWx1ZXM8R2xvYmVSYXN0ZXJVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfcHJval9tYXRyaXgnOiBGbG9hdDMyQXJyYXkuZnJvbShwcm9qTWF0cml4KSxcbiAgICAndV9nbG9iZV9tYXRyaXgnOiBnbG9iZU1hdHJpeCxcbiAgICAndV9ub3JtYWxpemVfbWF0cml4JzogRmxvYXQzMkFycmF5LmZyb20obm9ybWFsaXplTWF0cml4KSxcbiAgICAndV9tZXJjX21hdHJpeCc6IGdsb2JlTWVyY2F0b3JNYXRyaXgsXG4gICAgJ3Vfem9vbV90cmFuc2l0aW9uJzogem9vbVRyYW5zaXRpb24sXG4gICAgJ3VfbWVyY19jZW50ZXInOiBtZXJjQ2VudGVyLFxuICAgICd1X2ltYWdlMCc6IDAsXG4gICAgJ3VfZnJ1c3R1bV90bCc6IGZydXN0dW1EaXJUbCxcbiAgICAndV9mcnVzdHVtX3RyJzogZnJ1c3R1bURpclRyLFxuICAgICd1X2ZydXN0dW1fYnInOiBmcnVzdHVtRGlyQnIsXG4gICAgJ3VfZnJ1c3R1bV9ibCc6IGZydXN0dW1EaXJCbCxcbiAgICAndV9nbG9iZV9wb3MnOiBnbG9iZVBvc2l0aW9uLFxuICAgICd1X2dsb2JlX3JhZGl1cyc6IGdsb2JlUmFkaXVzLFxuICAgICd1X3ZpZXdwb3J0Jzogdmlld3BvcnQsXG4gICAgJ3VfZ3JpZF9tYXRyaXgnOiBncmlkTWF0cml4ID8gRmxvYXQzMkFycmF5LmZyb20oZ3JpZE1hdHJpeCkgOiBuZXcgRmxvYXQzMkFycmF5KDkpXG59KTtcblxuY29uc3QgYXRtb3NwaGVyZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgZnJ1c3R1bURpclRsOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZnJ1c3R1bURpclRyOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZnJ1c3R1bURpckJyOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZnJ1c3R1bURpckJsOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgaG9yaXpvbjogbnVtYmVyLFxuICAgIHRyYW5zaXRpb25UOiBudW1iZXIsXG4gICAgZmFkZW91dFJhbmdlOiBudW1iZXIsXG4gICAgY29sb3I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGhpZ2hDb2xvcjogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3BhY2VDb2xvcjogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3RhckludGVuc2l0eTogbnVtYmVyLFxuICAgIHRlbXBvcmFsT2Zmc2V0OiBudW1iZXIsXG4gICAgaG9yaXpvbkFuZ2xlOiBudW1iZXIsXG4gICAgcm90YXRpb25NYXRyaXg6IEZsb2F0MzJBcnJheVxuKTogVW5pZm9ybVZhbHVlczxBdG1vc3BoZXJlVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X2ZydXN0dW1fdGwnOiBmcnVzdHVtRGlyVGwsXG4gICAgJ3VfZnJ1c3R1bV90cic6IGZydXN0dW1EaXJUcixcbiAgICAndV9mcnVzdHVtX2JyJzogZnJ1c3R1bURpckJyLFxuICAgICd1X2ZydXN0dW1fYmwnOiBmcnVzdHVtRGlyQmwsXG4gICAgJ3VfaG9yaXpvbic6IGhvcml6b24sXG4gICAgJ3VfdHJhbnNpdGlvbic6IHRyYW5zaXRpb25ULFxuICAgICd1X2ZhZGVvdXRfcmFuZ2UnOiBmYWRlb3V0UmFuZ2UsXG4gICAgJ3VfY29sb3InOiBjb2xvcixcbiAgICAndV9oaWdoX2NvbG9yJzogaGlnaENvbG9yLFxuICAgICd1X3NwYWNlX2NvbG9yJzogc3BhY2VDb2xvcixcbiAgICAndV9zdGFyX2ludGVuc2l0eSc6IHN0YXJJbnRlbnNpdHksXG4gICAgJ3Vfc3Rhcl9zaXplJzogNS4wICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICd1X3N0YXJfZGVuc2l0eSc6IDAuMCxcbiAgICAndV90ZW1wb3JhbF9vZmZzZXQnOiB0ZW1wb3JhbE9mZnNldCxcbiAgICAndV9ob3Jpem9uX2FuZ2xlJzogaG9yaXpvbkFuZ2xlLFxuICAgICd1X3JvdGF0aW9uX21hdHJpeCc6IHJvdGF0aW9uTWF0cml4XG59KTtcblxuZXhwb3J0IHtnbG9iZVJhc3RlclVuaWZvcm1zLCBnbG9iZVJhc3RlclVuaWZvcm1WYWx1ZXMsIGF0bW9zcGhlcmVVbmlmb3JtcywgYXRtb3NwaGVyZVVuaWZvcm1WYWx1ZXN9O1xuXG5leHBvcnQgdHlwZSBHbG9iZURlZmluZXNUeXBlID0gJ1BST0pFQ1RJT05fR0xPQkVfVklFVycgfCAnR0xPQkVfUE9MRVMnIHwgJ0NVU1RPTV9BTlRJQUxJQVNJTkcnO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IHt0ZXJyYWluUmFzdGVyVW5pZm9ybVZhbHVlc30gZnJvbSAnLi90ZXJyYWluX3Jhc3Rlcl9wcm9ncmFtLmpzJztcbmltcG9ydCB7Z2xvYmVSYXN0ZXJVbmlmb3JtVmFsdWVzfSBmcm9tICcuL2dsb2JlX3Jhc3Rlcl9wcm9ncmFtLmpzJztcbmltcG9ydCB7VGVycmFpbn0gZnJvbSAnLi90ZXJyYWluLmpzJztcbmltcG9ydCBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7ZWFzZUN1YmljSW5PdXR9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuaW1wb3J0IHttZXJjYXRvclhmcm9tTG5nLCBtZXJjYXRvcllmcm9tTGF0fSBmcm9tICcuLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3JlbmRlci9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMnO1xuaW1wb3J0IHtPdmVyc2NhbGVkVGlsZUlELCBDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlLmpzJztcbmltcG9ydCB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7XG4gICAgY2FsY3VsYXRlR2xvYmVNZXJjYXRvck1hdHJpeCxcbiAgICBnbG9iZVRvTWVyY2F0b3JUcmFuc2l0aW9uLFxuICAgIGdsb2JlUG9sZU1hdHJpeEZvclRpbGUsXG4gICAgZ2V0R3JpZE1hdHJpeCxcbiAgICBnbG9iZVRpbGVMYXRMbmdDb3JuZXJzLFxuICAgIGdsb2JlTm9ybWFsaXplRUNFRixcbiAgICBnbG9iZVRpbGVCb3VuZHMsXG4gICAgZ2xvYmVVc2VDdXN0b21BbnRpQWxpYXNpbmcsXG4gICAgZ2V0TGF0aXR1ZGluYWxMb2Rcbn0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vZ2xvYmVfdXRpbC5qcyc7XG5pbXBvcnQgZXh0ZW5kIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9leHRlbmQuanMnO1xuXG5leHBvcnQge1xuICAgIGRyYXdUZXJyYWluUmFzdGVyLFxuICAgIGRyYXdUZXJyYWluRGVwdGhcbn07XG5cbnR5cGUgREVNQ2hhaW4gPSB7XG4gICAgc3RhcnRUaW1lOiBudW1iZXIsXG4gICAgcGhhc2U6IG51bWJlcixcbiAgICBkdXJhdGlvbjogbnVtYmVyLCAgIC8vIEludGVycG9sYXRpb24gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gICAgZnJvbTogVGlsZSxcbiAgICB0bzogVGlsZSxcbiAgICBxdWV1ZWQ6ID9UaWxlXG59O1xuXG5jbGFzcyBWZXJ0ZXhNb3JwaGluZyB7XG4gICAgb3BlcmF0aW9uczoge1tzdHJpbmcgfCBudW1iZXJdOiBERU1DaGFpbiB9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIG5ld01vcnBoaW5nKGtleTogbnVtYmVyLCBmcm9tOiBUaWxlLCB0bzogVGlsZSwgbm93OiBudW1iZXIsIGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgYXNzZXJ0KGZyb20uZGVtVGV4dHVyZSAmJiB0by5kZW1UZXh0dXJlKTtcbiAgICAgICAgYXNzZXJ0KGZyb20udGlsZUlELmtleSAhPT0gdG8udGlsZUlELmtleSk7XG5cbiAgICAgICAgaWYgKGtleSBpbiB0aGlzLm9wZXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wID0gdGhpcy5vcGVyYXRpb25zW2tleV07XG4gICAgICAgICAgICBhc3NlcnQob3AuZnJvbSAmJiBvcC50byk7XG4gICAgICAgICAgICAvLyBRdWV1ZSB0aGUgdGFyZ2V0IHRpbGUgdW5sZXNzIGl0J3MgYmVpbmcgbW9ycGhlZCB0byBhbHJlYWR5XG4gICAgICAgICAgICBpZiAob3AudG8udGlsZUlELmtleSAhPT0gdG8udGlsZUlELmtleSlcbiAgICAgICAgICAgICAgICBvcC5xdWV1ZWQgPSB0bztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uc1trZXldID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogbm93LFxuICAgICAgICAgICAgICAgIHBoYXNlOiAwLjAsXG4gICAgICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgICAgICBxdWV1ZWQ6IG51bGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRNb3JwaFZhbHVlc0ZvclByb3h5KGtleTogbnVtYmVyKTogP3tmcm9tOiBUaWxlLCB0bzogVGlsZSwgcGhhc2U6IG51bWJlcn0ge1xuICAgICAgICBpZiAoIShrZXkgaW4gdGhpcy5vcGVyYXRpb25zKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG9wID0gdGhpcy5vcGVyYXRpb25zW2tleV07XG4gICAgICAgIGNvbnN0IGZyb20gPSBvcC5mcm9tO1xuICAgICAgICBjb25zdCB0byA9IG9wLnRvO1xuICAgICAgICBhc3NlcnQoZnJvbSAmJiB0byk7XG5cbiAgICAgICAgcmV0dXJuIHtmcm9tLCB0bywgcGhhc2U6IG9wLnBoYXNlfTtcbiAgICB9XG5cbiAgICB1cGRhdGUobm93OiBudW1iZXIpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5vcGVyYXRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBvcCA9IHRoaXMub3BlcmF0aW9uc1trZXldO1xuICAgICAgICAgICAgYXNzZXJ0KG9wLmZyb20gJiYgb3AudG8pO1xuXG4gICAgICAgICAgICBvcC5waGFzZSA9IChub3cgLSBvcC5zdGFydFRpbWUpIC8gb3AuZHVyYXRpb247XG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBxdWV1ZWQgb3BlcmF0aW9uIGlmIHRoZSBjdXJyZW50IG9uZSBpcyBmaW5pc2hlZCBvciB0aGUgZGF0YSBoYXMgZXhwaXJlZFxuICAgICAgICAgICAgd2hpbGUgKG9wLnBoYXNlID49IDEuMCB8fCAhdGhpcy5fdmFsaWRPcChvcCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX25leHRPcChvcCwgbm93KSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcGVyYXRpb25zW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9uZXh0T3Aob3A6IERFTUNoYWluLCBub3c6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW9wLnF1ZXVlZClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgb3AuZnJvbSA9IG9wLnRvO1xuICAgICAgICBvcC50byA9IG9wLnF1ZXVlZDtcbiAgICAgICAgb3AucXVldWVkID0gbnVsbDtcbiAgICAgICAgb3AucGhhc2UgPSAwLjA7XG4gICAgICAgIG9wLnN0YXJ0VGltZSA9IG5vdztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgX3ZhbGlkT3Aob3A6IERFTUNoYWluKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBvcC5mcm9tLmhhc0RhdGEoKSAmJiBvcC50by5oYXNEYXRhKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkZW1UaWxlQ2hhbmdlZChwcmV2OiA/VGlsZSwgbmV4dDogP1RpbGUpOiBib29sZWFuIHtcbiAgICBpZiAocHJldiA9PSBudWxsIHx8IG5leHQgPT0gbnVsbClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghcHJldi5oYXNEYXRhKCkgfHwgIW5leHQuaGFzRGF0YSgpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHByZXYuZGVtVGV4dHVyZSA9PSBudWxsIHx8IG5leHQuZGVtVGV4dHVyZSA9PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHByZXYudGlsZUlELmtleSAhPT0gbmV4dC50aWxlSUQua2V5O1xufVxuXG5jb25zdCB2ZXJ0ZXhNb3JwaGluZyA9IG5ldyBWZXJ0ZXhNb3JwaGluZygpO1xuY29uc3QgU0hBREVSX0RFRkFVTFQgPSAwO1xuY29uc3QgU0hBREVSX01PUlBISU5HID0gMTtcbmNvbnN0IFNIQURFUl9URVJSQUlOX1dJUkVGUkFNRSA9IDI7XG5jb25zdCBkZWZhdWx0RHVyYXRpb24gPSAyNTA7XG5cbmNvbnN0IHNoYWRlckRlZmluZXMgPSB7XG4gICAgXCIwXCI6IG51bGwsXG4gICAgXCIxXCI6ICdURVJSQUlOX1ZFUlRFWF9NT1JQSElORycsXG4gICAgXCIyXCI6ICdURVJSQUlOX1dJUkVGUkFNRSdcbn07XG5cbmZ1bmN0aW9uIGRyYXdUZXJyYWluRm9yR2xvYmUocGFpbnRlcjogUGFpbnRlciwgdGVycmFpbjogVGVycmFpbiwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCB0aWxlSURzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPiwgbm93OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGxldCBwcm9ncmFtLCBwcm9ncmFtTW9kZTtcbiAgICBjb25zdCBzaG93V2lyZWZyYW1lID0gcGFpbnRlci5vcHRpb25zLnNob3dUZXJyYWluV2lyZWZyYW1lID8gU0hBREVSX1RFUlJBSU5fV0lSRUZSQU1FIDogU0hBREVSX0RFRkFVTFQ7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCB1c2VDdXN0b21BbnRpYWxpYXNpbmcgPSBnbG9iZVVzZUN1c3RvbUFudGlBbGlhc2luZyhwYWludGVyLCBjb250ZXh0LCB0cik7XG5cbiAgICBjb25zdCBzZXRTaGFkZXJNb2RlID0gKG1vZGUsIGlzV2lyZWZyYW1lKSA9PiB7XG4gICAgICAgIGlmIChwcm9ncmFtTW9kZSA9PT0gbW9kZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBkZWZpbmVzID0gW3NoYWRlckRlZmluZXNbbW9kZV0sICdQUk9KRUNUSU9OX0dMT0JFX1ZJRVcnXTtcblxuICAgICAgICBpZiAodXNlQ3VzdG9tQW50aWFsaWFzaW5nKSBkZWZpbmVzLnB1c2goJ0NVU1RPTV9BTlRJQUxJQVNJTkcnKTtcbiAgICAgICAgaWYgKGlzV2lyZWZyYW1lKSBkZWZpbmVzLnB1c2goc2hhZGVyRGVmaW5lc1tzaG93V2lyZWZyYW1lXSk7XG5cbiAgICAgICAgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnZ2xvYmVSYXN0ZXInLCBudWxsLCBkZWZpbmVzKTtcbiAgICAgICAgcHJvZ3JhbU1vZGUgPSBtb2RlO1xuICAgIH07XG5cbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICBjb25zdCBkZXB0aE1vZGUgPSBuZXcgRGVwdGhNb2RlKGdsLkxFUVVBTCwgRGVwdGhNb2RlLlJlYWRXcml0ZSwgcGFpbnRlci5kZXB0aFJhbmdlRm9yM0QpO1xuICAgIHZlcnRleE1vcnBoaW5nLnVwZGF0ZShub3cpO1xuICAgIGNvbnN0IGdsb2JlTWVyY2F0b3JNYXRyaXggPSBjYWxjdWxhdGVHbG9iZU1lcmNhdG9yTWF0cml4KHRyKTtcbiAgICBjb25zdCBtZXJjYXRvckNlbnRlciA9IFttZXJjYXRvclhmcm9tTG5nKHRyLmNlbnRlci5sbmcpLCBtZXJjYXRvcllmcm9tTGF0KHRyLmNlbnRlci5sYXQpXTtcbiAgICBjb25zdCBiYXRjaGVzID0gc2hvd1dpcmVmcmFtZSA/IFtmYWxzZSwgdHJ1ZV0gOiBbZmFsc2VdO1xuICAgIGNvbnN0IHNoYXJlZEJ1ZmZlcnMgPSBwYWludGVyLmdsb2JlU2hhcmVkQnVmZmVycztcbiAgICBjb25zdCB2aWV3cG9ydCA9IFt0ci53aWR0aCAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbywgdHIuaGVpZ2h0ICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvXTtcblxuICAgIGJhdGNoZXMuZm9yRWFjaChpc1dpcmVmcmFtZSA9PiB7XG4gICAgICAgIC8vIFRoaXMgY29kZSBhc3N1bWVzIHRoZSByZW5kZXJpbmcgaXMgYmF0Y2hlZCBpbnRvIG1lc2ggdGVycmFpbiBhbmQgdGhlbiB3aXJlZnJhbWVcbiAgICAgICAgLy8gdGVycmFpbiAoaWYgYXBwbGljYWJsZSkgc28gdGhhdCB0aGlzIGlzIGVub3VnaCB0byBlbnN1cmUgdGhlIGNvcnJlY3QgcHJvZ3JhbSBpc1xuICAgICAgICAvLyBzZXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbSBvbmUgdG8gdGhlIG90aGVyLlxuICAgICAgICBwcm9ncmFtTW9kZSA9IC0xO1xuXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZSA9IGlzV2lyZWZyYW1lID8gZ2wuTElORVMgOiBnbC5UUklBTkdMRVM7XG5cbiAgICAgICAgZm9yIChjb25zdCBjb29yZCBvZiB0aWxlSURzKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgICAgICBjb25zdCBzdGVuY2lsTW9kZSA9IFN0ZW5jaWxNb2RlLmRpc2FibGVkO1xuXG4gICAgICAgICAgICBjb25zdCBwcmV2RGVtVGlsZSA9IHRlcnJhaW4ucHJldlRlcnJhaW5UaWxlRm9yVGlsZVtjb29yZC5rZXldO1xuICAgICAgICAgICAgY29uc3QgbmV4dERlbVRpbGUgPSB0ZXJyYWluLnRlcnJhaW5UaWxlRm9yVGlsZVtjb29yZC5rZXldO1xuXG4gICAgICAgICAgICBpZiAoZGVtVGlsZUNoYW5nZWQocHJldkRlbVRpbGUsIG5leHREZW1UaWxlKSkge1xuICAgICAgICAgICAgICAgIHZlcnRleE1vcnBoaW5nLm5ld01vcnBoaW5nKGNvb3JkLmtleSwgcHJldkRlbVRpbGUsIG5leHREZW1UaWxlLCBub3csIGRlZmF1bHREdXJhdGlvbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJpbmQgdGhlIG1haW4gZHJhcGVkIHRleHR1cmVcbiAgICAgICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICAgICAgdGlsZS50ZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgY29uc3QgbW9ycGggPSB2ZXJ0ZXhNb3JwaGluZy5nZXRNb3JwaFZhbHVlc0ZvclByb3h5KGNvb3JkLmtleSk7XG4gICAgICAgICAgICBjb25zdCBzaGFkZXJNb2RlID0gbW9ycGggPyBTSEFERVJfTU9SUEhJTkcgOiBTSEFERVJfREVGQVVMVDtcbiAgICAgICAgICAgIGNvbnN0IGVsZXZhdGlvbk9wdGlvbnMgPSB7dXNlRGVub3JtYWxpemVkVXBWZWN0b3JTY2FsZTogdHJ1ZX07XG5cbiAgICAgICAgICAgIGlmIChtb3JwaCkge1xuICAgICAgICAgICAgICAgIGV4dGVuZChlbGV2YXRpb25PcHRpb25zLCB7bW9ycGhpbmc6IHtzcmNEZW1UaWxlOiBtb3JwaC5mcm9tLCBkc3REZW1UaWxlOiBtb3JwaC50bywgcGhhc2U6IGVhc2VDdWJpY0luT3V0KG1vcnBoLnBoYXNlKX19KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZ2xvYmVNYXRyaXggPSBGbG9hdDMyQXJyYXkuZnJvbSh0ci5nbG9iZU1hdHJpeCk7XG4gICAgICAgICAgICBjb25zdCB0aWxlQ29ybmVyc0xhdExuZyA9IGdsb2JlVGlsZUxhdExuZ0Nvcm5lcnMoY29vcmQuY2Fub25pY2FsKTtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVDZW50ZXJMYXRpdHVkZSA9ICh0aWxlQ29ybmVyc0xhdExuZ1swXVswXSArIHRpbGVDb3JuZXJzTGF0TG5nWzFdWzBdKSAvIDIuMDtcbiAgICAgICAgICAgIGNvbnN0IGxhdGl0dWRpbmFsTG9kID0gZ2V0TGF0aXR1ZGluYWxMb2QodGlsZUNlbnRlckxhdGl0dWRlKTtcbiAgICAgICAgICAgIGNvbnN0IGdyaWRNYXRyaXggPSBnZXRHcmlkTWF0cml4KGNvb3JkLmNhbm9uaWNhbCwgdGlsZUNvcm5lcnNMYXRMbmcsIGxhdGl0dWRpbmFsTG9kKTtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZU1hdHJpeCA9IGdsb2JlTm9ybWFsaXplRUNFRihnbG9iZVRpbGVCb3VuZHMoY29vcmQuY2Fub25pY2FsKSk7XG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gZ2xvYmVSYXN0ZXJVbmlmb3JtVmFsdWVzKFxuICAgICAgICAgICAgICAgIHRyLnByb2pNYXRyaXgsIGdsb2JlTWF0cml4LCBnbG9iZU1lcmNhdG9yTWF0cml4LCBub3JtYWxpemVNYXRyaXgsIGdsb2JlVG9NZXJjYXRvclRyYW5zaXRpb24odHIuem9vbSksXG4gICAgICAgICAgICAgICAgbWVyY2F0b3JDZW50ZXIsIHRyLmZydXN0dW1Db3JuZXJzLlRMLCB0ci5mcnVzdHVtQ29ybmVycy5UUiwgdHIuZnJ1c3R1bUNvcm5lcnMuQlIsXG4gICAgICAgICAgICAgICAgdHIuZnJ1c3R1bUNvcm5lcnMuQkwsIHRyLmdsb2JlQ2VudGVySW5WaWV3U3BhY2UsIHRyLmdsb2JlUmFkaXVzLCB2aWV3cG9ydCwgZ3JpZE1hdHJpeCk7XG5cbiAgICAgICAgICAgIHNldFNoYWRlck1vZGUoc2hhZGVyTW9kZSwgaXNXaXJlZnJhbWUpO1xuXG4gICAgICAgICAgICB0ZXJyYWluLnNldHVwRWxldmF0aW9uRHJhdyh0aWxlLCBwcm9ncmFtLCBlbGV2YXRpb25PcHRpb25zKTtcblxuICAgICAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2J1ZmZlciwgaW5kZXhCdWZmZXIsIHNlZ21lbnRzXSA9IGlzV2lyZWZyYW1lID9cbiAgICAgICAgICAgICAgICAgICAgc2hhcmVkQnVmZmVycy5nZXRXaXJlZmFtZUJ1ZmZlcnMocGFpbnRlci5jb250ZXh0LCBsYXRpdHVkaW5hbExvZCkgOlxuICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXJzLmdldEdyaWRCdWZmZXJzKGxhdGl0dWRpbmFsTG9kKTtcblxuICAgICAgICAgICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBwcmltaXRpdmUsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmJhY2tDQ1csXG4gICAgICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIFwiZ2xvYmVfcmFzdGVyXCIsIGJ1ZmZlciwgaW5kZXhCdWZmZXIsIHNlZ21lbnRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gUmVuZGVyIHRoZSBwb2xlcy5cbiAgICBpZiAoc2hhcmVkQnVmZmVycykge1xuICAgICAgICBjb25zdCBkZWZpbmVzID0gWydHTE9CRV9QT0xFUycsICdQUk9KRUNUSU9OX0dMT0JFX1ZJRVcnXTtcbiAgICAgICAgaWYgKHVzZUN1c3RvbUFudGlhbGlhc2luZykgZGVmaW5lcy5wdXNoKCdDVVNUT01fQU5USUFMSUFTSU5HJyk7XG5cbiAgICAgICAgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnZ2xvYmVSYXN0ZXInLCBudWxsLCBkZWZpbmVzKTtcbiAgICAgICAgZm9yIChjb25zdCBjb29yZCBvZiB0aWxlSURzKSB7XG4gICAgICAgICAgICAvLyBGaWxsIHBvbGVzIGJ5IGV4dHJhcG9sYXRpbmcgYWRqYWNlbnQgYm9yZGVyIHRpbGVzXG4gICAgICAgICAgICBjb25zdCB7eCwgeSwgen0gPSBjb29yZC5jYW5vbmljYWw7XG4gICAgICAgICAgICBjb25zdCB0b3BDYXAgPSB5ID09PSAwO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tQ2FwID0geSA9PT0gKDEgPDwgeikgLSAxO1xuXG4gICAgICAgICAgICBjb25zdCBbbm9ydGhQb2xlQnVmZmVyLCBzb3V0aFBvbGVCdWZmZXIsIGluZGV4QnVmZmVyLCBzZWdtZW50XSA9IHNoYXJlZEJ1ZmZlcnMuZ2V0UG9sZUJ1ZmZlcnMoeik7XG5cbiAgICAgICAgICAgIGlmIChzZWdtZW50ICYmICh0b3BDYXAgfHwgYm90dG9tQ2FwKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcblxuICAgICAgICAgICAgICAgIC8vIEJpbmQgdGhlIG1haW4gZHJhcGVkIHRleHR1cmVcbiAgICAgICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHBvbGVNYXRyaXggPSBnbG9iZVBvbGVNYXRyaXhGb3JUaWxlKHosIHgsIHRyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVNYXRyaXggPSBnbG9iZU5vcm1hbGl6ZUVDRUYoZ2xvYmVUaWxlQm91bmRzKGNvb3JkLmNhbm9uaWNhbCkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHJhd1BvbGUgPSAocHJvZ3JhbSwgdmVydGV4QnVmZmVyKSA9PiBwcm9ncmFtLmRyYXcoXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBTdGVuY2lsTW9kZS5kaXNhYmxlZCwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgIGdsb2JlUmFzdGVyVW5pZm9ybVZhbHVlcyh0ci5wcm9qTWF0cml4LCBwb2xlTWF0cml4LCBwb2xlTWF0cml4LCBub3JtYWxpemVNYXRyaXgsIDAuMCwgbWVyY2F0b3JDZW50ZXIsXG4gICAgICAgICAgICAgICAgICAgIHRyLmZydXN0dW1Db3JuZXJzLlRMLCB0ci5mcnVzdHVtQ29ybmVycy5UUiwgdHIuZnJ1c3R1bUNvcm5lcnMuQlIsIHRyLmZydXN0dW1Db3JuZXJzLkJMLFxuICAgICAgICAgICAgICAgICAgICB0ci5nbG9iZUNlbnRlckluVmlld1NwYWNlLCB0ci5nbG9iZVJhZGl1cywgdmlld3BvcnQpLCBcImdsb2JlX3BvbGVfcmFzdGVyXCIsIHZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhCdWZmZXIsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICAgICAgdGVycmFpbi5zZXR1cEVsZXZhdGlvbkRyYXcodGlsZSwgcHJvZ3JhbSwge30pO1xuXG4gICAgICAgICAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodG9wQ2FwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRyYXdQb2xlKHByb2dyYW0sIG5vcnRoUG9sZUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChib3R0b21DYXApIHtcbiAgICAgICAgICAgICAgICAgICAgcG9sZU1hdHJpeCA9IG1hdDQuc2NhbGUobWF0NC5jcmVhdGUoKSwgcG9sZU1hdHJpeCwgWzEsIC0xLCAxXSk7XG4gICAgICAgICAgICAgICAgICAgIGRyYXdQb2xlKHByb2dyYW0sIHNvdXRoUG9sZUJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3VGVycmFpblJhc3RlcihwYWludGVyOiBQYWludGVyLCB0ZXJyYWluOiBUZXJyYWluLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIHRpbGVJRHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+LCBub3c6IG51bWJlcikge1xuICAgIGlmIChwYWludGVyLnRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgZHJhd1RlcnJhaW5Gb3JHbG9iZShwYWludGVyLCB0ZXJyYWluLCBzb3VyY2VDYWNoZSwgdGlsZUlEcywgbm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgbGV0IHByb2dyYW0sIHByb2dyYW1Nb2RlO1xuICAgICAgICBjb25zdCBzaG93V2lyZWZyYW1lID0gcGFpbnRlci5vcHRpb25zLnNob3dUZXJyYWluV2lyZWZyYW1lID8gU0hBREVSX1RFUlJBSU5fV0lSRUZSQU1FIDogU0hBREVSX0RFRkFVTFQ7XG5cbiAgICAgICAgY29uc3Qgc2V0U2hhZGVyTW9kZSA9IChtb2RlLCBpc1dpcmVmcmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb2dyYW1Nb2RlID09PSBtb2RlKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVzID0gW3NoYWRlckRlZmluZXNbbW9kZV1dO1xuICAgICAgICAgICAgaWYgKGlzV2lyZWZyYW1lKSBtb2Rlcy5wdXNoKHNoYWRlckRlZmluZXNbc2hvd1dpcmVmcmFtZV0pO1xuICAgICAgICAgICAgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgndGVycmFpblJhc3RlcicsIG51bGwsIG1vZGVzKTtcbiAgICAgICAgICAgIHByb2dyYW1Nb2RlID0gbW9kZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICAgICAgY29uc3QgZGVwdGhNb2RlID0gbmV3IERlcHRoTW9kZShnbC5MRVFVQUwsIERlcHRoTW9kZS5SZWFkV3JpdGUsIHBhaW50ZXIuZGVwdGhSYW5nZUZvcjNEKTtcbiAgICAgICAgdmVydGV4TW9ycGhpbmcudXBkYXRlKG5vdyk7XG4gICAgICAgIGNvbnN0IHRyID0gcGFpbnRlci50cmFuc2Zvcm07XG4gICAgICAgIGNvbnN0IHNraXJ0ID0gc2tpcnRIZWlnaHQodHIuem9vbSkgKiB0ZXJyYWluLmV4YWdnZXJhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IGJhdGNoZXMgPSBzaG93V2lyZWZyYW1lID8gW2ZhbHNlLCB0cnVlXSA6IFtmYWxzZV07XG5cbiAgICAgICAgYmF0Y2hlcy5mb3JFYWNoKGlzV2lyZWZyYW1lID0+IHtcbiAgICAgICAgICAgIC8vIFRoaXMgY29kZSBhc3N1bWVzIHRoZSByZW5kZXJpbmcgaXMgYmF0Y2hlZCBpbnRvIG1lc2ggdGVycmFpbiBhbmQgdGhlbiB3aXJlZnJhbWVcbiAgICAgICAgICAgIC8vIHRlcnJhaW4gKGlmIGFwcGxpY2FibGUpIHNvIHRoYXQgdGhpcyBpcyBlbm91Z2ggdG8gZW5zdXJlIHRoZSBjb3JyZWN0IHByb2dyYW0gaXNcbiAgICAgICAgICAgIC8vIHNldCB3aGVuIHdlIHN3aXRjaCBmcm9tIG9uZSB0byB0aGUgb3RoZXIuXG4gICAgICAgICAgICBwcm9ncmFtTW9kZSA9IC0xO1xuXG4gICAgICAgICAgICBjb25zdCBwcmltaXRpdmUgPSBpc1dpcmVmcmFtZSA/IGdsLkxJTkVTIDogZ2wuVFJJQU5HTEVTO1xuICAgICAgICAgICAgY29uc3QgW2J1ZmZlciwgc2VnbWVudHNdID0gaXNXaXJlZnJhbWUgPyB0ZXJyYWluLmdldFdpcmVmYW1lQnVmZmVyKCkgOiBbdGVycmFpbi5ncmlkSW5kZXhCdWZmZXIsIHRlcnJhaW4uZ3JpZFNlZ21lbnRzXTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBjb29yZCBvZiB0aWxlSURzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2RGVtVGlsZSA9IHRlcnJhaW4ucHJldlRlcnJhaW5UaWxlRm9yVGlsZVtjb29yZC5rZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHREZW1UaWxlID0gdGVycmFpbi50ZXJyYWluVGlsZUZvclRpbGVbY29vcmQua2V5XTtcblxuICAgICAgICAgICAgICAgIGlmIChkZW1UaWxlQ2hhbmdlZChwcmV2RGVtVGlsZSwgbmV4dERlbVRpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleE1vcnBoaW5nLm5ld01vcnBoaW5nKGNvb3JkLmtleSwgcHJldkRlbVRpbGUsIG5leHREZW1UaWxlLCBub3csIGRlZmF1bHREdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQmluZCB0aGUgbWFpbiBkcmFwZWQgdGV4dHVyZVxuICAgICAgICAgICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICAgICAgICAgIHRpbGUudGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSwgZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1vcnBoID0gdmVydGV4TW9ycGhpbmcuZ2V0TW9ycGhWYWx1ZXNGb3JQcm94eShjb29yZC5rZXkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoYWRlck1vZGUgPSBtb3JwaCA/IFNIQURFUl9NT1JQSElORyA6IFNIQURFUl9ERUZBVUxUO1xuICAgICAgICAgICAgICAgIGxldCBlbGV2YXRpb25PcHRpb25zO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1vcnBoKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbk9wdGlvbnMgPSB7bW9ycGhpbmc6IHtzcmNEZW1UaWxlOiBtb3JwaC5mcm9tLCBkc3REZW1UaWxlOiBtb3JwaC50bywgcGhhc2U6IGVhc2VDdWJpY0luT3V0KG1vcnBoLnBoYXNlKX19O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSB0ZXJyYWluUmFzdGVyVW5pZm9ybVZhbHVlcyhjb29yZC5wcm9qTWF0cml4LCBpc0VkZ2VUaWxlKGNvb3JkLmNhbm9uaWNhbCwgdHIucmVuZGVyV29ybGRDb3BpZXMpID8gc2tpcnQgLyAxMCA6IHNraXJ0KTtcbiAgICAgICAgICAgICAgICBzZXRTaGFkZXJNb2RlKHNoYWRlck1vZGUsIGlzV2lyZWZyYW1lKTtcblxuICAgICAgICAgICAgICAgIHRlcnJhaW4uc2V0dXBFbGV2YXRpb25EcmF3KHRpbGUsIHByb2dyYW0sIGVsZXZhdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgcHJpbWl0aXZlLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5iYWNrQ0NXLFxuICAgICAgICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzLCBcInRlcnJhaW5fcmFzdGVyXCIsIHRlcnJhaW4uZ3JpZEJ1ZmZlciwgYnVmZmVyLCBzZWdtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd1RlcnJhaW5EZXB0aChwYWludGVyOiBQYWludGVyLCB0ZXJyYWluOiBUZXJyYWluLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIHRpbGVJRHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgaWYgKHBhaW50ZXIudHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXNzZXJ0KHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ29mZnNjcmVlbicpO1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICBjb250ZXh0LmNsZWFyKHtkZXB0aDogMX0pO1xuICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ3RlcnJhaW5EZXB0aCcpO1xuICAgIGNvbnN0IGRlcHRoTW9kZSA9IG5ldyBEZXB0aE1vZGUoZ2wuTEVTUywgRGVwdGhNb2RlLlJlYWRXcml0ZSwgcGFpbnRlci5kZXB0aFJhbmdlRm9yM0QpO1xuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiB0aWxlSURzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IHRlcnJhaW5SYXN0ZXJVbmlmb3JtVmFsdWVzKGNvb3JkLnByb2pNYXRyaXgsIDApO1xuICAgICAgICB0ZXJyYWluLnNldHVwRWxldmF0aW9uRHJhdyh0aWxlLCBwcm9ncmFtKTtcblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIFN0ZW5jaWxNb2RlLmRpc2FibGVkLCBDb2xvck1vZGUudW5ibGVuZGVkLCBDdWxsRmFjZU1vZGUuYmFja0NDVyxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIFwidGVycmFpbl9kZXB0aFwiLCB0ZXJyYWluLmdyaWRCdWZmZXIsIHRlcnJhaW4uZ3JpZEluZGV4QnVmZmVyLCB0ZXJyYWluLmdyaWROb1NraXJ0U2VnbWVudHMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2tpcnRIZWlnaHQoem9vbSkge1xuICAgIC8vIFNraXJ0IGhlaWdodCBjYWxjdWxhdGlvbiBpcyBoZXVyaXN0aWM6IHByb3ZpZGVkIHZhbHVlIGhpZGVzXG4gICAgLy8gc2VhbXMgYmV0d2VlbiB0aWxlcyBhbmQgaXQgaXMgbm90IHRvbyBsYXJnZTogOSBhdCB6b29tIDIyLCB+MjAwMDBtIGF0IHpvb20gMC5cbiAgICByZXR1cm4gNiAqIE1hdGgucG93KDEuNSwgMjIgLSB6b29tKTtcbn1cblxuZnVuY3Rpb24gaXNFZGdlVGlsZShjaWQ6IENhbm9uaWNhbFRpbGVJRCwgcmVuZGVyV29ybGRDb3BpZXM6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBjb25zdCBudW1UaWxlcyA9IDEgPDwgY2lkLno7XG4gICAgcmV0dXJuICghcmVuZGVyV29ybGRDb3BpZXMgJiYgKGNpZC54ID09PSAwIHx8IGNpZC54ID09PSBudW1UaWxlcyAtIDEpKSB8fCBjaWQueSA9PT0gMCB8fCBjaWQueSA9PT0gbnVtVGlsZXMgLSAxO1xufVxuXG5leHBvcnQge1xuICAgIFZlcnRleE1vcnBoaW5nXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtVbmlmb3JtTWF0cml4NGZ9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcblxuZXhwb3J0IHR5cGUgQ2xpcHBpbmdNYXNrVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGZcbnx9O1xuXG5jb25zdCBjbGlwcGluZ01hc2tVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBDbGlwcGluZ01hc2tVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeClcbn0pO1xuXG5jb25zdCBjbGlwcGluZ01hc2tVbmlmb3JtVmFsdWVzID0gKG1hdHJpeDogRmxvYXQzMkFycmF5KTogVW5pZm9ybVZhbHVlczxDbGlwcGluZ01hc2tVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4XG59KTtcblxuZXhwb3J0IHtjbGlwcGluZ01hc2tVbmlmb3JtcywgY2xpcHBpbmdNYXNrVW5pZm9ybVZhbHVlc307XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlLmpzJztcbmltcG9ydCB7Y2xhbXB9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuXG5leHBvcnQgdHlwZSBSYXN0ZXJGYWRlID0ge3xcbiAgICBvcGFjaXR5OiBudW1iZXIsXG4gICAgbWl4OiBudW1iZXIsXG58fTtcblxuZnVuY3Rpb24gcmFzdGVyRmFkZSh0aWxlOiBUaWxlLCBwYXJlbnRUaWxlOiA/VGlsZSwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCB0cmFuc2Zvcm06IFRyYW5zZm9ybSwgZmFkZUR1cmF0aW9uOiBudW1iZXIpOiBSYXN0ZXJGYWRlIHtcbiAgICBpZiAoZmFkZUR1cmF0aW9uID4gMCkge1xuICAgICAgICBjb25zdCBub3cgPSBicm93c2VyLm5vdygpO1xuICAgICAgICBjb25zdCBzaW5jZVRpbGUgPSAobm93IC0gdGlsZS50aW1lQWRkZWQpIC8gZmFkZUR1cmF0aW9uO1xuICAgICAgICBjb25zdCBzaW5jZVBhcmVudCA9IHBhcmVudFRpbGUgPyAobm93IC0gcGFyZW50VGlsZS50aW1lQWRkZWQpIC8gZmFkZUR1cmF0aW9uIDogLTE7XG5cbiAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG4gICAgICAgIGNvbnN0IGlkZWFsWiA9IHRyYW5zZm9ybS5jb3ZlcmluZ1pvb21MZXZlbCh7XG4gICAgICAgICAgICB0aWxlU2l6ZTogc291cmNlLnRpbGVTaXplLFxuICAgICAgICAgICAgcm91bmRab29tOiBzb3VyY2Uucm91bmRab29tXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmIG5vIHBhcmVudCBvciBwYXJlbnQgaXMgb2xkZXIsIGZhZGUgaW47IGlmIHBhcmVudCBpcyB5b3VuZ2VyLCBmYWRlIG91dFxuICAgICAgICBjb25zdCBmYWRlSW4gPSAhcGFyZW50VGlsZSB8fCBNYXRoLmFicyhwYXJlbnRUaWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGlkZWFsWikgPiBNYXRoLmFicyh0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIGlkZWFsWik7XG5cbiAgICAgICAgY29uc3QgY2hpbGRPcGFjaXR5ID0gKGZhZGVJbiAmJiB0aWxlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uKSA/IDEgOiBjbGFtcChmYWRlSW4gPyBzaW5jZVRpbGUgOiAxIC0gc2luY2VQYXJlbnQsIDAsIDEpO1xuXG4gICAgICAgIC8vIHdlIGRvbid0IGNyb3NzZmFkZSB0aWxlcyB0aGF0IHdlcmUganVzdCByZWZyZXNoZWQgdXBvbiBleHBpcmluZzpcbiAgICAgICAgLy8gb25jZSB0aGV5J3JlIG9sZCBlbm91Z2ggdG8gcGFzcyB0aGUgY3Jvc3NmYWRpbmcgdGhyZXNob2xkXG4gICAgICAgIC8vIChmYWRlRHVyYXRpb24pLCB1bnNldCB0aGUgYHJlZnJlc2hlZFVwb25FeHBpcmF0aW9uYCBmbGFnIHNvIHdlIGRvbid0XG4gICAgICAgIC8vIGluY29ycmVjdGx5IGZhaWwgdG8gY3Jvc3NmYWRlIHRoZW0gd2hlbiB6b29taW5nXG4gICAgICAgIGlmICh0aWxlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uICYmIHNpbmNlVGlsZSA+PSAxKSB0aWxlLnJlZnJlc2hlZFVwb25FeHBpcmF0aW9uID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICBtaXg6IDEgLSBjaGlsZE9wYWNpdHlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IGNoaWxkT3BhY2l0eSxcbiAgICAgICAgICAgICAgICBtaXg6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgIG1peDogMFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgcmFzdGVyRmFkZTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlLmpzJztcbmltcG9ydCB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IGJvdW5kc0F0dHJpYnV0ZXMgZnJvbSAnLi4vZGF0YS9ib3VuZHNfYXR0cmlidXRlcy5qcyc7XG5pbXBvcnQge1Jhc3RlckJvdW5kc0FycmF5LCBUcmlhbmdsZUluZGV4QXJyYXksIExpbmVJbmRleEFycmF5fSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudC5qcyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9yZW5kZXIvdGV4dHVyZS5qcyc7XG5pbXBvcnQgUHJvZ3JhbSBmcm9tICcuLi9yZW5kZXIvcHJvZ3JhbS5qcyc7XG5pbXBvcnQge1VuaWZvcm0xaSwgVW5pZm9ybTFmLCBVbmlmb3JtMmYsIFVuaWZvcm0zZiwgVW5pZm9ybTRmLCBVbmlmb3JtTWF0cml4NGZ9IGZyb20gJy4uL3JlbmRlci91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHtwcmVwYXJlREVNVGV4dHVyZX0gZnJvbSAnLi4vcmVuZGVyL2RyYXdfaGlsbHNoYWRlLmpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQuanMnO1xuaW1wb3J0IHtjbGFtcCwgd2Fybk9uY2V9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQge3ZlYzMsIG1hdDQsIHZlYzR9IGZyb20gJ2dsLW1hdHJpeCc7XG5pbXBvcnQgZ2V0V29ya2VyUG9vbCBmcm9tICcuLi91dGlsL2dsb2JhbF93b3JrZXJfcG9vbC5qcyc7XG5pbXBvcnQgRGlzcGF0Y2hlciBmcm9tICcuLi91dGlsL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IEdlb0pTT05Tb3VyY2UgZnJvbSAnLi4vc291cmNlL2dlb2pzb25fc291cmNlLmpzJztcbmltcG9ydCBJbWFnZVNvdXJjZSBmcm9tICcuLi9zb3VyY2UvaW1hZ2Vfc291cmNlLmpzJztcbmltcG9ydCBSYXN0ZXJERU1UaWxlU291cmNlIGZyb20gJy4uL3NvdXJjZS9yYXN0ZXJfZGVtX3RpbGVfc291cmNlLmpzJztcbmltcG9ydCBSYXN0ZXJUaWxlU291cmNlIGZyb20gJy4uL3NvdXJjZS9yYXN0ZXJfdGlsZV9zb3VyY2UuanMnO1xuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IHtEZXB0aFN0ZW5jaWxBdHRhY2htZW50fSBmcm9tICcuLi9nbC92YWx1ZS5qcyc7XG5pbXBvcnQge2RyYXdUZXJyYWluUmFzdGVyLCBkcmF3VGVycmFpbkRlcHRofSBmcm9tICcuL2RyYXdfdGVycmFpbl9yYXN0ZXIuanMnO1xuaW1wb3J0IHR5cGUgUmFzdGVyU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHtFbGV2YXRpb259IGZyb20gJy4vZWxldmF0aW9uLmpzJztcbmltcG9ydCBGcmFtZWJ1ZmZlciBmcm9tICcuLi9nbC9mcmFtZWJ1ZmZlci5qcyc7XG5pbXBvcnQgQ29sb3JNb2RlIGZyb20gJy4uL2dsL2NvbG9yX21vZGUuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IHtjbGlwcGluZ01hc2tVbmlmb3JtVmFsdWVzfSBmcm9tICcuLi9yZW5kZXIvcHJvZ3JhbS9jbGlwcGluZ19tYXNrX3Byb2dyYW0uanMnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge21lcmNhdG9yWmZyb21BbHRpdHVkZX0gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyLmpzJztcbmltcG9ydCBERU1EYXRhIGZyb20gJy4uL2RhdGEvZGVtX2RhdGEuanMnO1xuaW1wb3J0IHtEcmFwZVJlbmRlck1vZGV9IGZyb20gJy4uL3N0eWxlL3RlcnJhaW4uanMnO1xuaW1wb3J0IHJhc3RlckZhZGUgZnJvbSAnLi4vcmVuZGVyL3Jhc3Rlcl9mYWRlLmpzJztcbmltcG9ydCB7Y3JlYXRlIGFzIGNyZWF0ZVNvdXJjZX0gZnJvbSAnLi4vc291cmNlL3NvdXJjZS5qcyc7XG5pbXBvcnQge1JHQkFJbWFnZX0gZnJvbSAnLi4vdXRpbC9pbWFnZS5qcyc7XG5pbXBvcnQge0dMT0JFX01FVEVSU19UT19FQ0VGfSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9nbG9iZV91dGlsLmpzJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL3VpL21hcC5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3JlbmRlci9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlIGZyb20gJy4uL3N0eWxlL3N0eWxlLmpzJztcbmltcG9ydCB0eXBlIFN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uL2dsL3ZlcnRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgSW5kZXhCdWZmZXIgZnJvbSAnLi4vZ2wvaW5kZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybUxvY2F0aW9ucywgVW5pZm9ybVZhbHVlc30gZnJvbSAnLi4vcmVuZGVyL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQgdHlwZSB7REVNRW5jb2Rpbmd9IGZyb20gJy4uL2RhdGEvZGVtX2RhdGEuanMnO1xuaW1wb3J0IHR5cGUge1ZlYzMsIFZlYzR9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbmNvbnN0IEdSSURfRElNID0gMTI4O1xuXG5jb25zdCBGQk9fUE9PTF9TSVpFID0gNTtcbmNvbnN0IFJFTkRFUl9DQUNIRV9NQVhfU0laRSA9IDUwO1xuXG50eXBlIFJlbmRlckJhdGNoID0ge1xuICAgIHN0YXJ0OiBudW1iZXI7XG4gICAgZW5kOiBudW1iZXI7XG59XG5cbmNsYXNzIE1vY2tTb3VyY2VDYWNoZSBleHRlbmRzIFNvdXJjZUNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCkge1xuICAgICAgICBjb25zdCBzb3VyY2VTcGVjID0ge3R5cGU6ICdyYXN0ZXItZGVtJywgbWF4em9vbTogbWFwLnRyYW5zZm9ybS5tYXhab29tfTtcbiAgICAgICAgY29uc3Qgc291cmNlRGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKGdldFdvcmtlclBvb2woKSwgbnVsbCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGNyZWF0ZVNvdXJjZSgnbW9jay1kZW0nLCBzb3VyY2VTcGVjLCBzb3VyY2VEaXNwYXRjaGVyLCBtYXAuc3R5bGUpO1xuXG4gICAgICAgIHN1cGVyKCdtb2NrLWRlbScsIHNvdXJjZSwgZmFsc2UpO1xuXG4gICAgICAgIHNvdXJjZS5zZXRFdmVudGVkUGFyZW50KHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX3NvdXJjZUxvYWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgX2xvYWRUaWxlKHRpbGU6IFRpbGUsIGNhbGxiYWNrOiBDYWxsYmFjazx2b2lkPikge1xuICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm94eSBzb3VyY2UgY2FjaGUgZ2V0cyBpZGVhbCBzY3JlZW4gdGlsZSBjb3ZlciBjb29yZGluYXRlcy4gQWxsIHRoZSBvdGhlclxuICogc291cmNlIGNhY2hlcydzIGNvb3JkaW5hdGVzIGdldCBtYXBwZWQgdG8gc3VicmVjdHMgb2YgcHJveHkgY29vcmRpbmF0ZXMgKG9yXG4gKiB2aWNlIHZlcnNhLCBzdWJyZWN0cyBvZiBsYXJnZXIgdGlsZXMgZnJvbSBhbGwgc291cmNlIGNhY2hlcyBnZXQgbWFwcGVkIHRvXG4gKiBmdWxsIHByb3h5IHRpbGUpLiBUaGlzIGhhcHBlbnMgb24gZXZlcnkgZHJhdyBjYWxsIGluIFRlcnJhaW4udXBkYXRlVGlsZUJpbmRpbmcuXG4gKiBBcHByb2FjaCBpcyB1c2VkIGhlcmUgZm9yIHRlcnJhaW4gOiBhbGwgdGhlIHZpc2libGUgc291cmNlIHRpbGVzIG9mIGFsbCB0aGVcbiAqIHNvdXJjZSBjYWNoZXMgZ2V0IHJlbmRlcmVkIHRvIHByb3h5IHNvdXJjZSBjYWNoZSB0ZXh0dXJlcyBhbmQgdGhlbiBkcmFwZWQgb3ZlclxuICogdGVycmFpbi4gSXQgaXMgaW4gZnV0dXJlIHJldXNhYmxlIGZvciBoYW5kbGluZyBvdmVyc2NhbGxpbmcgYXMgYnVja2V0cyBjb3VsZCBiZVxuICogY29uc3RydWN0ZWQgb25seSBmb3IgcHJveHkgdGlsZSBjb250ZW50LCBub3QgZm9yIGZ1bGwgb3ZlcnNjYWxsZWQgdmVjdG9yIHRpbGUuXG4gKi9cbmNsYXNzIFByb3h5U291cmNlQ2FjaGUgZXh0ZW5kcyBTb3VyY2VDYWNoZSB7XG4gICAgcmVuZGVyQ2FjaGU6IEFycmF5PEZCTz47XG4gICAgcmVuZGVyQ2FjaGVQb29sOiBBcnJheTxudW1iZXI+O1xuICAgIHByb3h5Q2FjaGVkRkJPOiB7W3N0cmluZyB8IG51bWJlcl06IHtbc3RyaW5nIHwgbnVtYmVyXTogbnVtYmVyfX07XG5cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCkge1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGNyZWF0ZVNvdXJjZSgncHJveHknLCB7XG4gICAgICAgICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICAgICAgICBtYXh6b29tOiBtYXAudHJhbnNmb3JtLm1heFpvb21cbiAgICAgICAgfSwgbmV3IERpc3BhdGNoZXIoZ2V0V29ya2VyUG9vbCgpLCBudWxsKSwgbWFwLnN0eWxlKTtcblxuICAgICAgICBzdXBlcigncHJveHknLCBzb3VyY2UsIGZhbHNlKTtcblxuICAgICAgICBzb3VyY2Uuc2V0RXZlbnRlZFBhcmVudCh0aGlzKTtcblxuICAgICAgICAvLyBUaGlzIHNvdXJjZSBpcyBub3QgdG8gYmUgYWRkZWQgYXMgYSBtYXAgc291cmNlOiB3ZSB1c2UgaXQncyB0aWxlIG1hbmFnZW1lbnQuXG4gICAgICAgIC8vIEZvciB0aGF0LCBpbml0aWFsaXplIGludGVybmFsIHN0cnVjdHVyZXMgdXNlZCBmb3IgdGlsZSBjb3ZlciB1cGRhdGUuXG4gICAgICAgIHRoaXMubWFwID0gKCh0aGlzLmdldFNvdXJjZSgpOiBhbnkpOiBHZW9KU09OU291cmNlKS5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMudXNlZCA9IHRoaXMuX3NvdXJjZUxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVuZGVyQ2FjaGUgPSBbXTtcbiAgICAgICAgdGhpcy5yZW5kZXJDYWNoZVBvb2wgPSBbXTtcbiAgICAgICAgdGhpcy5wcm94eUNhY2hlZEZCTyA9IHt9O1xuICAgIH1cblxuICAgIC8vIE92ZXJyaWRlIGZvciB0cmFuc2llbnQgbmF0dXJlIG9mIGNvdmVyIGhlcmU6IGRvbid0IGNhY2hlIGFuZCByZXRhaW4uXG4gICAgdXBkYXRlKHRyYW5zZm9ybTogVHJhbnNmb3JtLCB0aWxlU2l6ZT86IG51bWJlciwgdXBkYXRlRm9yVGVycmFpbj86IGJvb2xlYW4pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgICBpZiAodHJhbnNmb3JtLmZyZWV6ZVRpbGVDb3ZlcmFnZSkgeyByZXR1cm47IH1cbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIGNvbnN0IGlkZWFsVGlsZUlEcyA9IHRyYW5zZm9ybS5jb3ZlcmluZ1RpbGVzKHtcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLl9zb3VyY2UudGlsZVNpemUsXG4gICAgICAgICAgICBtaW56b29tOiB0aGlzLl9zb3VyY2UubWluem9vbSxcbiAgICAgICAgICAgIG1heHpvb206IHRoaXMuX3NvdXJjZS5tYXh6b29tLFxuICAgICAgICAgICAgcm91bmRab29tOiB0aGlzLl9zb3VyY2Uucm91bmRab29tLFxuICAgICAgICAgICAgcmVwYXJzZU92ZXJzY2FsZWQ6IHRoaXMuX3NvdXJjZS5yZXBhcnNlT3ZlcnNjYWxlZFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpbmNvbWluZzoge1tzdHJpbmddOiBzdHJpbmd9ID0gaWRlYWxUaWxlSURzLnJlZHVjZSgoYWNjLCB0aWxlSUQpID0+IHtcbiAgICAgICAgICAgIGFjY1t0aWxlSUQua2V5XSA9ICcnO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl90aWxlc1t0aWxlSUQua2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSBuZXcgVGlsZSh0aWxlSUQsIHRoaXMuX3NvdXJjZS50aWxlU2l6ZSAqIHRpbGVJRC5vdmVyc2NhbGVGYWN0b3IoKSwgdHJhbnNmb3JtLnRpbGVab29tKTtcbiAgICAgICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2xvYWRlZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGlsZXNbdGlsZUlELmtleV0gPSB0aWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30pO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGlmICghKGlkIGluIGluY29taW5nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZnJlZUZCTyhpZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGlsZXNbaWRdLnVubG9hZFZlY3RvckRhdGEoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnJlZUZCTyhpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZib3MgPSB0aGlzLnByb3h5Q2FjaGVkRkJPW2lkXTtcbiAgICAgICAgaWYgKGZib3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZmJvSWRzID0gKChPYmplY3QudmFsdWVzKGZib3MpOiBhbnkpOiBBcnJheTxudW1iZXI+KTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ2FjaGVQb29sLnB1c2goLi4uZmJvSWRzKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnByb3h5Q2FjaGVkRkJPW2lkXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlYWxsb2NSZW5kZXJDYWNoZSgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJDYWNoZS5mb3JFYWNoKGZibyA9PiBmYm8uZmIuZGVzdHJveSgpKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDYWNoZSA9IFtdO1xuICAgICAgICB0aGlzLnJlbmRlckNhY2hlUG9vbCA9IFtdO1xuICAgICAgICB0aGlzLnByb3h5Q2FjaGVkRkJPID0ge307XG4gICAgfVxufVxuXG4vKipcbiAqIENhbm9uaWNhbCwgd3JhcCBhbmQgb3ZlcnNjYWxlZFogY29udGFpbiBpbmZvcm1hdGlvbiBvZiBvcmlnaW5hbCBzb3VyY2UgY2FjaGUgdGlsZS5cbiAqIFRoaXMgdGlsZSBnZXRzIG9ydGhvLXJlbmRlcmVkIHRvIHByb3h5IHRpbGUgKGRlZmluZWQgYnkgcHJveHlUaWxlS2V5KS5cbiAqIGBwb3NNYXRyaXhgIGhvbGRzIG9ydGhvZ3JhcGhpYywgc2NhbGluZyBhbmQgdHJhbnNsYXRpb24gaW5mb3JtYXRpb24gdGhhdCBpcyB1c2VkXG4gKiBmb3IgcmVuZGVyaW5nIG9yaWdpbmFsIHRpbGUgY29udGVudCB0byBhIHByb3h5IHRpbGUuIFByb3h5IHRpbGUgY292ZXJzIHdob2xlXG4gKiBvciBzdWItcmVjdGFuZ2xlIG9mIHRoZSBvcmlnaW5hbCB0aWxlLlxuICovXG5jbGFzcyBQcm94aWVkVGlsZUlEIGV4dGVuZHMgT3ZlcnNjYWxlZFRpbGVJRCB7XG4gICAgcHJveHlUaWxlS2V5OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHByb3h5VGlsZUtleTogbnVtYmVyLCBwcm9qTWF0cml4OiBGbG9hdDMyQXJyYXkpIHtcbiAgICAgICAgc3VwZXIodGlsZUlELm92ZXJzY2FsZWRaLCB0aWxlSUQud3JhcCwgdGlsZUlELmNhbm9uaWNhbC56LCB0aWxlSUQuY2Fub25pY2FsLngsIHRpbGVJRC5jYW5vbmljYWwueSk7XG4gICAgICAgIHRoaXMucHJveHlUaWxlS2V5ID0gcHJveHlUaWxlS2V5O1xuICAgICAgICB0aGlzLnByb2pNYXRyaXggPSBwcm9qTWF0cml4O1xuICAgIH1cbn1cblxudHlwZSBPdmVybGFwU3RlbmNpbFR5cGUgPSBmYWxzZSB8ICdDbGlwJyB8ICdNYXNrJztcbnR5cGUgRkJPID0ge2ZiOiBGcmFtZWJ1ZmZlciwgdGV4OiBUZXh0dXJlLCBkaXJ0eTogYm9vbGVhbn07XG5cbmV4cG9ydCBjbGFzcyBUZXJyYWluIGV4dGVuZHMgRWxldmF0aW9uIHtcbiAgICB0ZXJyYWluVGlsZUZvclRpbGU6IHtbbnVtYmVyIHwgc3RyaW5nXTogVGlsZX07XG4gICAgcHJldlRlcnJhaW5UaWxlRm9yVGlsZToge1tudW1iZXIgfCBzdHJpbmddOiBUaWxlfTtcbiAgICBwYWludGVyOiBQYWludGVyO1xuICAgIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZTtcbiAgICBncmlkQnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgZ3JpZEluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcbiAgICBncmlkU2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgZ3JpZE5vU2tpcnRTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICB3aXJlZnJhbWVTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICB3aXJlZnJhbWVJbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgcHJveGllZENvb3Jkczoge1tzdHJpbmddOiBBcnJheTxQcm94aWVkVGlsZUlEPn07XG4gICAgcHJveHlDb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+O1xuICAgIHByb3h5VG9Tb3VyY2U6IHtbbnVtYmVyXToge1tzdHJpbmddOiBBcnJheTxQcm94aWVkVGlsZUlEPn19O1xuICAgIHByb3h5U291cmNlQ2FjaGU6IFByb3h5U291cmNlQ2FjaGU7XG4gICAgcmVuZGVyaW5nVG9UZXh0dXJlOiBib29sZWFuO1xuICAgIF9zdHlsZTogU3R5bGU7XG4gICAgX21vY2tTb3VyY2VDYWNoZTogTW9ja1NvdXJjZUNhY2hlO1xuICAgIG9ydGhvTWF0cml4OiBGbG9hdDMyQXJyYXk7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICByZW5kZXJNb2RlOiBudW1iZXI7XG5cbiAgICBfdmlzaWJsZURlbVRpbGVzOiBBcnJheTxUaWxlPjtcbiAgICBfc291cmNlVGlsZXNPdmVybGFwOiB7W3N0cmluZ106IGJvb2xlYW59O1xuICAgIF9vdmVybGFwU3RlbmNpbE1vZGU6IFN0ZW5jaWxNb2RlO1xuICAgIF9vdmVybGFwU3RlbmNpbFR5cGU6IE92ZXJsYXBTdGVuY2lsVHlwZTtcbiAgICBfc3RlbmNpbFJlZjogbnVtYmVyO1xuXG4gICAgX2V4YWdnZXJhdGlvbjogbnVtYmVyO1xuICAgIF9kZXB0aEZCTzogP0ZyYW1lYnVmZmVyO1xuICAgIF9kZXB0aFRleHR1cmU6ID9UZXh0dXJlO1xuICAgIF9wcmV2aW91c1pvb206IG51bWJlcjtcbiAgICBfdXBkYXRlVGltZXN0YW1wOiBudW1iZXI7XG4gICAgX3VzZVZlcnRleE1vcnBoaW5nOiBib29sZWFuO1xuICAgIHBvb2w6IEFycmF5PEZCTz47XG4gICAgcmVuZGVyZWRUb1RpbGU6IGJvb2xlYW47XG4gICAgX2RyYXBlZFJlbmRlckJhdGNoZXM6IEFycmF5PFJlbmRlckJhdGNoPjtcbiAgICBfc2hhcmVkRGVwdGhTdGVuY2lsOiBXZWJHTFJlbmRlcmJ1ZmZlcjtcblxuICAgIF9maW5kQ292ZXJpbmdUaWxlQ2FjaGU6IHtbc3RyaW5nXToge1tudW1iZXJdOiA/bnVtYmVyfX07XG5cbiAgICBfdGlsZXNEaXJ0eToge1tzdHJpbmddOiB7W251bWJlcl06IGJvb2xlYW59fTtcbiAgICBfaW52YWxpZGF0ZVJlbmRlckNhY2hlOiBib29sZWFuO1xuXG4gICAgX2VtcHR5RGVwdGhCdWZmZXJUZXh0dXJlOiA/VGV4dHVyZTtcbiAgICBfZW1wdHlERU1UZXh0dXJlOiA/VGV4dHVyZTtcbiAgICBfaW5pdGlhbGl6aW5nOiA/Ym9vbGVhbjtcbiAgICBfZW1wdHlERU1UZXh0dXJlRGlydHk6ID9ib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IocGFpbnRlcjogUGFpbnRlciwgc3R5bGU6IFN0eWxlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucGFpbnRlciA9IHBhaW50ZXI7XG4gICAgICAgIHRoaXMudGVycmFpblRpbGVGb3JUaWxlID0ge307XG4gICAgICAgIHRoaXMucHJldlRlcnJhaW5UaWxlRm9yVGlsZSA9IHt9O1xuXG4gICAgICAgIC8vIFRlcnJhaW4gcmVuZGVyaW5nIGdyaWQgaXMgMTI5eDEyOSBjZWxsIGdyaWQsIG1hZGUgYnkgMTMweDEzMCBwb2ludHMuXG4gICAgICAgIC8vIDEzMCB2ZXJ0aWNlcyBtYXAgdG8gMTI4IERFTSBkYXRhICsgMXB4IHBhZGRpbmcgb24gYm90aCBzaWRlcy5cbiAgICAgICAgLy8gREVNIHRleHR1cmUgaXMgcGFkZGVkICgxLCAxLCAxLCAxKSBhbmQgcGFkZGluZyBwaXhlbHMgYXJlIGJhY2tmaWxsZWRcbiAgICAgICAgLy8gYnkgbmVpZ2hib3JpbmcgdGlsZSBlZGdlcy4gVGhpcyB3YXkgd2UgYWNoaWV2ZSB0aWxlIHN0aXRjaGluZyBhc1xuICAgICAgICAvLyBlZGdlIHZlcnRpY2VzIGZyb20gbmVpZ2hib3JpbmcgdGlsZXMgZXZhbHVhdGUgdG8gdGhlIHNhbWUgM0QgcG9pbnQuXG4gICAgICAgIGNvbnN0IFt0cmlhbmdsZUdyaWRBcnJheSwgdHJpYW5nbGVHcmlkSW5kaWNlcywgc2tpcnRJbmRpY2VzT2Zmc2V0XSA9IGNyZWF0ZUdyaWQoR1JJRF9ESU0gKyAxKTtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgdGhpcy5ncmlkQnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodHJpYW5nbGVHcmlkQXJyYXksIGJvdW5kc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMuZ3JpZEluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0cmlhbmdsZUdyaWRJbmRpY2VzKTtcbiAgICAgICAgdGhpcy5ncmlkU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgdHJpYW5nbGVHcmlkQXJyYXkubGVuZ3RoLCB0cmlhbmdsZUdyaWRJbmRpY2VzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuZ3JpZE5vU2tpcnRTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCB0cmlhbmdsZUdyaWRBcnJheS5sZW5ndGgsIHNraXJ0SW5kaWNlc09mZnNldCk7XG4gICAgICAgIHRoaXMucHJveHlDb29yZHMgPSBbXTtcbiAgICAgICAgdGhpcy5wcm94aWVkQ29vcmRzID0ge307XG4gICAgICAgIHRoaXMuX3Zpc2libGVEZW1UaWxlcyA9IFtdO1xuICAgICAgICB0aGlzLl9kcmFwZWRSZW5kZXJCYXRjaGVzID0gW107XG4gICAgICAgIHRoaXMuX3NvdXJjZVRpbGVzT3ZlcmxhcCA9IHt9O1xuICAgICAgICB0aGlzLnByb3h5U291cmNlQ2FjaGUgPSBuZXcgUHJveHlTb3VyY2VDYWNoZShzdHlsZS5tYXApO1xuICAgICAgICB0aGlzLm9ydGhvTWF0cml4ID0gbWF0NC5jcmVhdGUoKTtcbiAgICAgICAgbWF0NC5vcnRobyh0aGlzLm9ydGhvTWF0cml4LCAwLCBFWFRFTlQsIDAsIEVYVEVOVCwgMCwgMSk7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxNb2RlID0gbmV3IFN0ZW5jaWxNb2RlKHtmdW5jOiBnbC5HRVFVQUwsIG1hc2s6IDB4RkZ9LCAwLCAweEZGLCBnbC5LRUVQLCBnbC5LRUVQLCBnbC5SRVBMQUNFKTtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNab29tID0gcGFpbnRlci50cmFuc2Zvcm0uem9vbTtcbiAgICAgICAgdGhpcy5wb29sID0gW107XG4gICAgICAgIHRoaXMuX2ZpbmRDb3ZlcmluZ1RpbGVDYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLl90aWxlc0RpcnR5ID0ge307XG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICAgICAgdGhpcy5fdXNlVmVydGV4TW9ycGhpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9leGFnZ2VyYXRpb24gPSAxO1xuICAgICAgICB0aGlzLl9tb2NrU291cmNlQ2FjaGUgPSBuZXcgTW9ja1NvdXJjZUNhY2hlKHN0eWxlLm1hcCk7XG4gICAgfVxuXG4gICAgc2V0IHN0eWxlKHN0eWxlOiBTdHlsZSkge1xuICAgICAgICBzdHlsZS5vbignZGF0YScsIHRoaXMuX29uU3R5bGVEYXRhRXZlbnQuYmluZCh0aGlzKSk7XG4gICAgICAgIHN0eWxlLm9uKCduZXdvcmRlcicsIHRoaXMuX2NoZWNrUmVuZGVyQ2FjaGVFZmZpY2llbmN5LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLl9zdHlsZSA9IHN0eWxlO1xuICAgICAgICB0aGlzLl9jaGVja1JlbmRlckNhY2hlRWZmaWNpZW5jeSgpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogVmFsaWRhdGUgdGVycmFpbiBhbmQgdXBkYXRlIHNvdXJjZSBjYWNoZSB1c2VkIGZvciBlbGV2YXRpb24uXG4gICAgICogRXhwbGljaXRseSBwYXNzIHRyYW5zZm9ybSB0byB1cGRhdGUgZWxldmF0aW9uIChUcmFuc2Zvcm0udXBkYXRlRWxldmF0aW9uKVxuICAgICAqIGJlZm9yZSB1c2luZyB0cmFuc2Zvcm0gZm9yIHNvdXJjZSBjYWNoZSB1cGRhdGUuXG4gICAgICogY2FtZXJhQ2hhbmdpbmcgaXMgdHJ1ZSB3aGVuIGNhbWVyYSBpcyB6b29taW5nLCBwYW5uaW5nIG9yIG9yYml0aW5nLlxuICAgICAqL1xuICAgIHVwZGF0ZShzdHlsZTogU3R5bGUsIHRyYW5zZm9ybTogVHJhbnNmb3JtLCBjYW1lcmFDaGFuZ2luZzogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3R5bGUgJiYgc3R5bGUudGVycmFpbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlICE9PSBzdHlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB0ZXJyYWluUHJvcHMgPSBzdHlsZS50ZXJyYWluLnByb3BlcnRpZXM7XG4gICAgICAgICAgICBjb25zdCBpc0RyYXBlTW9kZURlZmVycmVkID0gc3R5bGUudGVycmFpbi5kcmFwZVJlbmRlck1vZGUgPT09IERyYXBlUmVuZGVyTW9kZS5kZWZlcnJlZDtcbiAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGUgPSBpc0RyYXBlTW9kZURlZmVycmVkID8gdGhpcy5fbW9ja1NvdXJjZUNhY2hlIDpcbiAgICAgICAgICAgICAgICAoKHN0eWxlLl9nZXRTb3VyY2VDYWNoZSh0ZXJyYWluUHJvcHMuZ2V0KCdzb3VyY2UnKSk6IGFueSk6IFNvdXJjZUNhY2hlKTtcbiAgICAgICAgICAgIHRoaXMuX2V4YWdnZXJhdGlvbiA9IHRlcnJhaW5Qcm9wcy5nZXQoJ2V4YWdnZXJhdGlvbicpO1xuXG4gICAgICAgICAgICBjb25zdCB1cGRhdGVTb3VyY2VDYWNoZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VDYWNoZS51c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5PbmNlKGBSYXN0ZXIgREVNIHNvdXJjZSAnJHt0aGlzLnNvdXJjZUNhY2hlLmlkfScgaXMgdXNlZCBib3RoIGZvciB0ZXJyYWluIGFuZCBhcyBsYXllciBzb3VyY2UuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBsZWFkcyB0byBsb3dlciByZXNvbHV0aW9uIG9mIGhpbGxzaGFkZS4gRm9yIGZ1bGwgaGlsbHNoYWRlIHJlc29sdXRpb24gYnV0IGhpZ2hlciBtZW1vcnkgY29uc3VtcHRpb24sIGRlZmluZSBhbm90aGVyIHJhc3RlciBERU0gc291cmNlLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBMb3dlciB0aWxlIHpvb20gaXMgc3VmZmljaWVudCBmb3IgdGVycmFpbiwgZ2l2ZW4gdGhlIHNpemUgb2YgdGVycmFpbiBncmlkLlxuICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlZERlbVRpbGVTaXplID0gdGhpcy5nZXRTY2FsZWREZW1UaWxlU2l6ZSgpO1xuICAgICAgICAgICAgICAgIC8vIERlbSB0aWxlIG5lZWRzIHRvIGJlIHBhcmVudCBvciBhdCBsZWFzdCBvZiB0aGUgc2FtZSB6b29tIGxldmVsIGFzIHByb3h5IHRpbGUuXG4gICAgICAgICAgICAgICAgLy8gVGlsZSBjb3ZlciByb3VuZFpvb20gYmVoYXZpb3IgaXMgc2V0IHRvIHRoZSBzYW1lIGFzIGZvciBwcm94eSAoZmFsc2UpIGluIFNvdXJjZUNhY2hlLnVwZGF0ZSgpLlxuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGUudXBkYXRlKHRyYW5zZm9ybSwgc2NhbGVkRGVtVGlsZVNpemUsIHRydWUpO1xuICAgICAgICAgICAgICAgIC8vIEFzIGEgcmVzdWx0IG9mIHVwZGF0ZSwgd2UgZ2V0IG5ldyBzZXQgb2YgdGlsZXM6IHJlc2V0IGxvb2t1cCBjYWNoZS5cbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0VGlsZUxvb2t1cENhY2hlKHRoaXMuc291cmNlQ2FjaGUuaWQpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnNvdXJjZUNhY2hlLnVzZWRGb3JUZXJyYWluKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5pdCBjYWNoZSBlbnRyeS5cbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0VGlsZUxvb2t1cENhY2hlKHRoaXMuc291cmNlQ2FjaGUuaWQpO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gdG9nZ2xpbmcgdGVycmFpbiBvbi9vZmYgbG9hZCBhdmFpbGFibGUgdGVycmFpbiB0aWxlcyBmcm9tIGNhY2hlXG4gICAgICAgICAgICAgICAgLy8gYmVmb3JlIHJlYWRpbmcgZWxldmF0aW9uIGF0IGNlbnRlci5cbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlLnVzZWRGb3JUZXJyYWluID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB1cGRhdGVTb3VyY2VDYWNoZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemluZyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVwZGF0ZVNvdXJjZUNhY2hlKCk7XG4gICAgICAgICAgICAvLyBDYW1lcmEsIHdoZW4gY2hhbmdpbmcsIGdldHMgY29uc3RyYWluZWQgb3ZlciB0ZXJyYWluLiBJc3N1ZSBjb25zdHJhaW5DYW1lcmFPdmVyVGVycmFpbiA9IHRydWVcbiAgICAgICAgICAgIC8vIGhlcmUgdG8gY292ZXIgcG90ZW50aWFsIHVuZGVyIHRlcnJhaW4gc2l0dWF0aW9uIG9uIGRhdGEgb3Igc3R5bGUgY2hhbmdlLlxuICAgICAgICAgICAgdHJhbnNmb3JtLnVwZGF0ZUVsZXZhdGlvbighY2FtZXJhQ2hhbmdpbmcpO1xuXG4gICAgICAgICAgICAvLyBSZXNldCB0aWxlIGxvb2t1cCBjYWNoZSBhbmQgdXBkYXRlIGRyYXBlZCB0aWxlcyBjb29yZGluYXRlcy5cbiAgICAgICAgICAgIHRoaXMucmVzZXRUaWxlTG9va3VwQ2FjaGUodGhpcy5wcm94eVNvdXJjZUNhY2hlLmlkKTtcbiAgICAgICAgICAgIHRoaXMucHJveHlTb3VyY2VDYWNoZS51cGRhdGUodHJhbnNmb3JtKTtcblxuICAgICAgICAgICAgdGhpcy5fZW1wdHlERU1UZXh0dXJlRGlydHkgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRUaWxlTG9va3VwQ2FjaGUoc291cmNlQ2FjaGVJRDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZpbmRDb3ZlcmluZ1RpbGVDYWNoZVtzb3VyY2VDYWNoZUlEXSA9IHt9O1xuICAgIH1cblxuICAgIGdldFNjYWxlZERlbVRpbGVTaXplKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGRlbVNjYWxlID0gdGhpcy5zb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS50aWxlU2l6ZSAvIEdSSURfRElNO1xuICAgICAgICBjb25zdCBwcm94eVRpbGVTaXplID0gdGhpcy5wcm94eVNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLnRpbGVTaXplO1xuICAgICAgICByZXR1cm4gZGVtU2NhbGUgKiBwcm94eVRpbGVTaXplO1xuICAgIH1cblxuICAgIF9jaGVja1JlbmRlckNhY2hlRWZmaWNpZW5jeSgpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyQ2FjaGVJbmZvID0gdGhpcy5yZW5kZXJDYWNoZUVmZmljaWVuY3kodGhpcy5fc3R5bGUpO1xuICAgICAgICBpZiAodGhpcy5fc3R5bGUubWFwLl9vcHRpbWl6ZUZvclRlcnJhaW4pIHtcbiAgICAgICAgICAgIGFzc2VydChyZW5kZXJDYWNoZUluZm8uZWZmaWNpZW5jeSA9PT0gMTAwKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJDYWNoZUluZm8uZWZmaWNpZW5jeSAhPT0gMTAwKSB7XG4gICAgICAgICAgICB3YXJuT25jZShgVGVycmFpbiByZW5kZXIgY2FjaGUgZWZmaWNpZW5jeSBpcyBub3Qgb3B0aW1hbCAoJHtyZW5kZXJDYWNoZUluZm8uZWZmaWNpZW5jeX0lKSBhbmQgcGVyZm9ybWFuY2VcbiAgICAgICAgICAgICAgICBtYXkgYmUgYWZmZWN0ZWQgbmVnYXRpdmVseSwgY29uc2lkZXIgcGxhY2luZyBhbGwgYmFja2dyb3VuZCwgZmlsbCBhbmQgbGluZSBsYXllcnMgYmVmb3JlIGxheWVyXG4gICAgICAgICAgICAgICAgd2l0aCBpZCAnJHtyZW5kZXJDYWNoZUluZm8uZmlyc3RVbmRyYXBlZExheWVyfScgb3IgY3JlYXRlIGEgbWFwIHVzaW5nIG9wdGltaXplRm9yVGVycmFpbjogdHJ1ZSBvcHRpb24uYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25TdHlsZURhdGFFdmVudChldmVudDogYW55KSB7XG4gICAgICAgIGlmIChldmVudC5jb29yZCAmJiBldmVudC5kYXRhVHlwZSA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgICAgIHRoaXMuX2NsZWFyUmVuZGVyQ2FjaGVGb3JUaWxlKGV2ZW50LnNvdXJjZUNhY2hlSWQsIGV2ZW50LmNvb3JkKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5kYXRhVHlwZSA9PT0gJ3N0eWxlJykge1xuICAgICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVJlbmRlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRlcnJhaW5cbiAgICBfZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3NoYXJlZERlcHRoU3RlbmNpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5wcm94eVNvdXJjZUNhY2hlLmRlYWxsb2NSZW5kZXJDYWNoZSgpO1xuICAgICAgICBpZiAodGhpcy5fc3R5bGUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc3R5bGUuX3NvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlLl9zb3VyY2VDYWNoZXNbaWRdLnVzZWRGb3JUZXJyYWluID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9kaXNhYmxlKCk7XG4gICAgICAgIGlmICh0aGlzLl9lbXB0eURFTVRleHR1cmUpIHRoaXMuX2VtcHR5REVNVGV4dHVyZS5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLl9lbXB0eURlcHRoQnVmZmVyVGV4dHVyZSkgdGhpcy5fZW1wdHlEZXB0aEJ1ZmZlclRleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnBvb2wuZm9yRWFjaChmYm8gPT4gZmJvLmZiLmRlc3Ryb3koKSk7XG4gICAgICAgIHRoaXMucG9vbCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5fZGVwdGhGQk8pIHtcbiAgICAgICAgICAgIHRoaXMuX2RlcHRoRkJPLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX2RlcHRoRkJPID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fZGVwdGhUZXh0dXJlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW1wbGVtZW50cyBFbGV2YXRpb246Ol9zb3VyY2UuXG4gICAgX3NvdXJjZSgpOiA/U291cmNlQ2FjaGUge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmFibGVkID8gdGhpcy5zb3VyY2VDYWNoZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSW1wbGVtZW50cyBFbGV2YXRpb246OmV4YWdnZXJhdGlvbi5cbiAgICBleGFnZ2VyYXRpb24oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4YWdnZXJhdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgdmlzaWJsZURlbVRpbGVzKCk6IEFycmF5PFRpbGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGVEZW1UaWxlcztcbiAgICB9XG5cbiAgICBnZXQgZHJhcGVCdWZmZXJTaXplKCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgICAgICBjb25zdCBleHRlbnQgPSB0aGlzLnByb3h5U291cmNlQ2FjaGUuZ2V0U291cmNlKCkudGlsZVNpemUgKiAyOyAvLyAqMiBpcyB0byBhdm9pZCB1cHNjYWxpbmcgYml0bWFwIG9uIHpvb20uXG4gICAgICAgIHJldHVybiBbZXh0ZW50LCBleHRlbnRdO1xuICAgIH1cblxuICAgIHNldCB1c2VWZXJ0ZXhNb3JwaGluZyhlbmFibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fdXNlVmVydGV4TW9ycGhpbmcgPSBlbmFibGU7XG4gICAgfVxuXG4gICAgLy8gRm9yIGV2ZXJ5IHJlbmRlcmFibGUgY29vcmRpbmF0ZSBpbiBldmVyeSBzb3VyY2UgY2FjaGUsIGFzc2lnbiBvbmUgcHJveHlcbiAgICAvLyB0aWxlIChzZWUgX3NldHVwUHJveGllZENvb3Jkc0Zvck9ydGhvKS4gTWFwcGluZyBvZiBzb3VyY2UgdGlsZSB0byBwcm94eVxuICAgIC8vIHRpbGUgaXMgbW9kZWxlZCBieSBQcm94aWVkVGlsZUlELiBJbiBnZW5lcmFsIGNhc2UsIHNvdXJjZSBhbmQgcHJveHkgdGlsZVxuICAgIC8vIGFyZSBvZiBkaWZmZXJlbnQgem9vbTogUHJveGllZFRpbGVJRC5wcm9qTWF0cml4IG1vZGVscyBvcnRobywgc2NhbGUgYW5kXG4gICAgLy8gdHJhbnNsYXRlIGZyb20gc291cmNlIHRvIHByb3h5LiBUaGlzIG1hdHJpeCBpcyB1c2VkIHdoZW4gcmVuZGVyaW5nIHNvdXJjZVxuICAgIC8vIHRpbGUgdG8gcHJveHkgdGlsZSdzIHRleHR1cmUuXG4gICAgLy8gT25lIHByb3h5IHRpbGUgY2FuIGhhdmUgbXVsdGlwbGUgc291cmNlIHRpbGVzLCBvciBwaWVjZXMgb2Ygc291cmNlIHRpbGVzLFxuICAgIC8vIHRoYXQgZ2V0IHJlbmRlcmVkIHRvIGl0LlxuICAgIC8vIEZvciBlYWNoIHByb3h5IHRpbGUgd2UgYXNzaWduIG9uZSB0ZXJyYWluIHRpbGUgKF9hc3NpZ25UZXJyYWluVGlsZXMpLiBUaGVcbiAgICAvLyB0ZXJyYWluIHRpbGUgcHJvdmlkZXMgZWxldmF0aW9uIGRhdGEgd2hlbiByZW5kZXJpbmcgKGRyYXBpbmcpIHByb3h5IHRpbGVcbiAgICAvLyB0ZXh0dXJlIG92ZXIgdGVycmFpbiBncmlkLlxuICAgIHVwZGF0ZVRpbGVCaW5kaW5nKHNvdXJjZXNDb29yZHM6IHtbc3RyaW5nXTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD59KSB7XG4gICAgICAgIGlmICghdGhpcy5lbmFibGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJldlRlcnJhaW5UaWxlRm9yVGlsZSA9IHRoaXMudGVycmFpblRpbGVGb3JUaWxlO1xuXG4gICAgICAgIGNvbnN0IHBzYyA9IHRoaXMucHJveHlTb3VyY2VDYWNoZTtcbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnBhaW50ZXIudHJhbnNmb3JtO1xuICAgICAgICBpZiAodGhpcy5faW5pdGlhbGl6aW5nKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBhY3RpdmF0ZSB0ZXJyYWluIHVudGlsIGNlbnRlciB0aWxlIGdldHMgbG9hZGVkLlxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6aW5nID0gdHIuX2NlbnRlckFsdGl0dWRlID09PSAwICYmIHRoaXMuZ2V0QXRQb2ludE9yWmVybyhNZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdCh0ci5jZW50ZXIpLCAtMSkgPT09IC0xO1xuICAgICAgICAgICAgdGhpcy5fZW1wdHlERU1UZXh0dXJlRGlydHkgPSAhdGhpcy5faW5pdGlhbGl6aW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5wcm94eUNvb3JkcyA9IHBzYy5nZXRJZHMoKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aWxlSUQgPSBwc2MuZ2V0VGlsZUJ5SUQoaWQpLnRpbGVJRDtcbiAgICAgICAgICAgIHRpbGVJRC5wcm9qTWF0cml4ID0gdHIuY2FsY3VsYXRlUHJvak1hdHJpeCh0aWxlSUQudG9VbndyYXBwZWQoKSk7XG4gICAgICAgICAgICByZXR1cm4gdGlsZUlEO1xuICAgICAgICB9KTtcbiAgICAgICAgc29ydEJ5RGlzdGFuY2VUb0NhbWVyYShjb29yZHMsIHRoaXMucGFpbnRlcik7XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzWm9vbSA9IHRyLnpvb207XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNQcm94eVRvU291cmNlID0gdGhpcy5wcm94eVRvU291cmNlIHx8IHt9O1xuICAgICAgICB0aGlzLnByb3h5VG9Tb3VyY2UgPSB7fTtcbiAgICAgICAgY29vcmRzLmZvckVhY2goKHRpbGVJRCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm94eVRvU291cmNlW3RpbGVJRC5rZXldID0ge307XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudGVycmFpblRpbGVGb3JUaWxlID0ge307XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IHRoaXMuX3N0eWxlLl9zb3VyY2VDYWNoZXM7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHNvdXJjZUNhY2hlc1tpZF07XG4gICAgICAgICAgICBpZiAoIXNvdXJjZUNhY2hlLnVzZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlICE9PSB0aGlzLnNvdXJjZUNhY2hlKSB0aGlzLnJlc2V0VGlsZUxvb2t1cENhY2hlKHNvdXJjZUNhY2hlLmlkKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwUHJveGllZENvb3Jkc0Zvck9ydGhvKHNvdXJjZUNhY2hlLCBzb3VyY2VzQ29vcmRzW2lkXSwgcHJldmlvdXNQcm94eVRvU291cmNlKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZS51c2VkRm9yVGVycmFpbikgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IHNvdXJjZXNDb29yZHNbaWRdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLnJlcGFyc2VPdmVyc2NhbGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRG8gdGhpcyBmb3IgbGF5ZXJzIHRoYXQgYXJlIG5vdCByYXN0ZXJpemVkIHRvIHByb3h5IHRpbGUuXG4gICAgICAgICAgICAgICAgdGhpcy5fYXNzaWduVGVycmFpblRpbGVzKGNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJhY2tncm91bmQgaGFzIG5vIHNvdXJjZS4gVXNpbmcgcHJveHkgY29vcmRzIHdpdGggMS0xIG9ydGhvICh0aGlzLnByb3hpZWRDb29yZHNbcHNjLmlkXSlcbiAgICAgICAgLy8gd2hlbiByZW5kZXJpbmcgYmFja2dyb3VuZCB0byBwcm94eSB0aWxlcy5cbiAgICAgICAgdGhpcy5wcm94aWVkQ29vcmRzW3BzYy5pZF0gPSBjb29yZHMubWFwKHRpbGVJRCA9PiBuZXcgUHJveGllZFRpbGVJRCh0aWxlSUQsIHRpbGVJRC5rZXksIHRoaXMub3J0aG9NYXRyaXgpKTtcbiAgICAgICAgdGhpcy5fYXNzaWduVGVycmFpblRpbGVzKGNvb3Jkcyk7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVERU1UZXh0dXJlcygpO1xuICAgICAgICB0aGlzLl9zZXR1cERyYXBlZFJlbmRlckJhdGNoZXMoKTtcbiAgICAgICAgdGhpcy5faW5pdEZCT1Bvb2woKTtcbiAgICAgICAgdGhpcy5fc2V0dXBSZW5kZXJDYWNoZShwcmV2aW91c1Byb3h5VG9Tb3VyY2UpO1xuXG4gICAgICAgIHRoaXMucmVuZGVyaW5nVG9UZXh0dXJlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVRpbWVzdGFtcCA9IGJyb3dzZXIubm93KCk7XG5cbiAgICAgICAgLy8gR2F0aGVyIGFsbCBkZW0gdGlsZXMgdGhhdCBhcmUgYXNzaWduZWQgdG8gcHJveHkgdGlsZXNcbiAgICAgICAgY29uc3QgdmlzaWJsZUtleXMgPSB7fTtcbiAgICAgICAgdGhpcy5fdmlzaWJsZURlbVRpbGVzID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiB0aGlzLnByb3h5Q29vcmRzKSB7XG4gICAgICAgICAgICBjb25zdCBkZW1UaWxlID0gdGhpcy50ZXJyYWluVGlsZUZvclRpbGVbaWQua2V5XTtcbiAgICAgICAgICAgIGlmICghZGVtVGlsZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGRlbVRpbGUudGlsZUlELmtleTtcbiAgICAgICAgICAgIGlmIChrZXkgaW4gdmlzaWJsZUtleXMpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLl92aXNpYmxlRGVtVGlsZXMucHVzaChkZW1UaWxlKTtcbiAgICAgICAgICAgIHZpc2libGVLZXlzW2tleV0gPSBrZXk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIF9hc3NpZ25UZXJyYWluVGlsZXMoY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgICAgICBpZiAodGhpcy5faW5pdGlhbGl6aW5nKSByZXR1cm47XG4gICAgICAgIGNvb3Jkcy5mb3JFYWNoKCh0aWxlSUQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRlcnJhaW5UaWxlRm9yVGlsZVt0aWxlSUQua2V5XSkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgZGVtVGlsZSA9IHRoaXMuX2ZpbmRUaWxlQ292ZXJpbmdUaWxlSUQodGlsZUlELCB0aGlzLnNvdXJjZUNhY2hlKTtcbiAgICAgICAgICAgIGlmIChkZW1UaWxlKSB0aGlzLnRlcnJhaW5UaWxlRm9yVGlsZVt0aWxlSUQua2V5XSA9IGRlbVRpbGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9wcmVwYXJlREVNVGV4dHVyZXMoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnRlcnJhaW5UaWxlRm9yVGlsZSkge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMudGVycmFpblRpbGVGb3JUaWxlW2tleV07XG4gICAgICAgICAgICBjb25zdCBkZW0gPSB0aWxlLmRlbTtcbiAgICAgICAgICAgIGlmIChkZW0gJiYgKCF0aWxlLmRlbVRleHR1cmUgfHwgdGlsZS5uZWVkc0RFTVRleHR1cmVVcGxvYWQpKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMSk7XG4gICAgICAgICAgICAgICAgcHJlcGFyZURFTVRleHR1cmUodGhpcy5wYWludGVyLCB0aWxlLCBkZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3ByZXBhcmVEZW1UaWxlVW5pZm9ybXMocHJveHlUaWxlOiBUaWxlLCBkZW1UaWxlOiA/VGlsZSwgdW5pZm9ybXM6IFVuaWZvcm1WYWx1ZXM8VGVycmFpblVuaWZvcm1zVHlwZT4sIHVuaWZvcm1TdWZmaXg6ID9zdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFkZW1UaWxlIHx8IGRlbVRpbGUuZGVtVGV4dHVyZSA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGFzc2VydChkZW1UaWxlLmRlbSk7XG4gICAgICAgIGNvbnN0IHByb3h5SWQgPSBwcm94eVRpbGUudGlsZUlELmNhbm9uaWNhbDtcbiAgICAgICAgY29uc3QgZGVtSWQgPSBkZW1UaWxlLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIGNvbnN0IGRlbVNjYWxlQnkgPSBNYXRoLnBvdygyLCBkZW1JZC56IC0gcHJveHlJZC56KTtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gdW5pZm9ybVN1ZmZpeCB8fCBcIlwiO1xuICAgICAgICB1bmlmb3Jtc1tgdV9kZW1fdGwke3N1ZmZpeH1gXSA9IFtwcm94eUlkLnggKiBkZW1TY2FsZUJ5ICUgMSwgcHJveHlJZC55ICogZGVtU2NhbGVCeSAlIDFdO1xuICAgICAgICB1bmlmb3Jtc1tgdV9kZW1fc2NhbGUke3N1ZmZpeH1gXSA9IGRlbVNjYWxlQnk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldCBlbXB0eURFTVRleHR1cmUoKTogVGV4dHVyZSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fZW1wdHlERU1UZXh0dXJlRGlydHkgJiYgdGhpcy5fZW1wdHlERU1UZXh0dXJlID9cbiAgICAgICAgICAgIHRoaXMuX2VtcHR5REVNVGV4dHVyZSA6IHRoaXMuX3VwZGF0ZUVtcHR5REVNVGV4dHVyZSgpO1xuICAgIH1cblxuICAgIGdldCBlbXB0eURlcHRoQnVmZmVyVGV4dHVyZSgpOiBUZXh0dXJlIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGlmICghdGhpcy5fZW1wdHlEZXB0aEJ1ZmZlclRleHR1cmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gbmV3IFJHQkFJbWFnZSh7d2lkdGg6IDEsIGhlaWdodDogMX0sIFVpbnQ4QXJyYXkub2YoMjU1LCAyNTUsIDI1NSwgMjU1KSk7XG4gICAgICAgICAgICB0aGlzLl9lbXB0eURlcHRoQnVmZmVyVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIGltYWdlLCBnbC5SR0JBLCB7cHJlbXVsdGlwbHk6IGZhbHNlfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtcHR5RGVwdGhCdWZmZXJUZXh0dXJlO1xuICAgIH1cblxuICAgIF9nZXRMb2FkZWRBcmVhTWluaW11bSgpOiBudW1iZXIge1xuICAgICAgICBsZXQgbm9uemVybyA9IDA7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMuX3Zpc2libGVEZW1UaWxlcy5yZWR1Y2UoKGFjYywgdGlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aWxlLmRlbSkgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIGNvbnN0IG0gPSB0aWxlLmRlbS50cmVlLm1pbmltdW1zWzBdO1xuICAgICAgICAgICAgYWNjICs9IG07XG4gICAgICAgICAgICBpZiAobSA+IDApIG5vbnplcm8rKztcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIDApO1xuICAgICAgICByZXR1cm4gbm9uemVybyA/IG1pbiAvIG5vbnplcm8gOiAwO1xuICAgIH1cblxuICAgIF91cGRhdGVFbXB0eURFTVRleHR1cmUoKTogVGV4dHVyZSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUyKTtcblxuICAgICAgICBjb25zdCBtaW4gPSB0aGlzLl9nZXRMb2FkZWRBcmVhTWluaW11bSgpO1xuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBSR0JBSW1hZ2UoXG4gICAgICAgICAgICB7d2lkdGg6IDEsIGhlaWdodDogMX0sXG4gICAgICAgICAgICBuZXcgVWludDhBcnJheShERU1EYXRhLnBhY2sobWluLCAoKHRoaXMuc291cmNlQ2FjaGUuZ2V0U291cmNlKCk6IGFueSk6IFJhc3RlckRFTVRpbGVTb3VyY2UpLmVuY29kaW5nKSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLl9lbXB0eURFTVRleHR1cmVEaXJ0eSA9IGZhbHNlO1xuICAgICAgICBsZXQgdGV4dHVyZSA9IHRoaXMuX2VtcHR5REVNVGV4dHVyZTtcbiAgICAgICAgaWYgKCF0ZXh0dXJlKSB7XG4gICAgICAgICAgICB0ZXh0dXJlID0gdGhpcy5fZW1wdHlERU1UZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCwgaW1hZ2UsIGdsLlJHQkEsIHtwcmVtdWx0aXBseTogZmFsc2V9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRleHR1cmUudXBkYXRlKGltYWdlLCB7cHJlbXVsdGlwbHk6IGZhbHNlfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XG4gICAgfVxuXG4gICAgLy8gdXNlRGVwdGhGb3JPY2NsdXNpb246IFByZS1yZW5kZXJlZCBkZXB0aCB0byB0ZXh0dXJlICh0aGlzLl9kZXB0aFRleHR1cmUpIGlzXG4gICAgLy8gdXNlZCB0byBoaWRlIChhY3R1YWxseSBtb3ZlcyBhbGwgb2JqZWN0J3MgdmVydGljZXMgb3V0IG9mIHZpZXdwb3J0KS5cbiAgICAvLyB1c2VNZXRlclRvRGVtOiB1X21ldGVyX3RvX2RlbSB1bmlmb3JtIGlzIG5vdCB1c2VkIGZvciBhbGwgdGVycmFpbiBwcm9ncmFtcyxcbiAgICAvLyBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdW5uZWNlc3NhcnkgY29tcHV0YXRpb24gYW5kIHVwbG9hZC5cbiAgICBzZXR1cEVsZXZhdGlvbkRyYXcodGlsZTogVGlsZSwgcHJvZ3JhbTogUHJvZ3JhbTwqPixcbiAgICAgICAgb3B0aW9ucz86IHtcbiAgICAgICAgICAgIHVzZURlcHRoRm9yT2NjbHVzaW9uPzogYm9vbGVhbixcbiAgICAgICAgICAgIHVzZU1ldGVyVG9EZW0/OiBib29sZWFuLFxuICAgICAgICAgICAgbGFiZWxQbGFuZU1hdHJpeEludj86ID9GbG9hdDMyQXJyYXksXG4gICAgICAgICAgICBtb3JwaGluZz86IHsgc3JjRGVtVGlsZTogVGlsZSwgZHN0RGVtVGlsZTogVGlsZSwgcGhhc2U6IG51bWJlciB9LFxuICAgICAgICAgICAgdXNlRGVub3JtYWxpemVkVXBWZWN0b3JTY2FsZT86IGJvb2xlYW5cbiAgICAgICAgfSkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wYWludGVyLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgY29uc3QgdW5pZm9ybXMgPSBkZWZhdWx0VGVycmFpblVuaWZvcm1zKCgodGhpcy5zb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTogYW55KTogUmFzdGVyREVNVGlsZVNvdXJjZSkuZW5jb2RpbmcpO1xuICAgICAgICB1bmlmb3Jtc1sndV9kZW1fc2l6ZSddID0gdGhpcy5zb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS50aWxlU2l6ZTtcbiAgICAgICAgdW5pZm9ybXNbJ3VfZXhhZ2dlcmF0aW9uJ10gPSB0aGlzLmV4YWdnZXJhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5wYWludGVyLnRyYW5zZm9ybTtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRyLnByb2plY3Rpb247XG5cbiAgICAgICAgY29uc3QgaWQgPSB0aWxlLnRpbGVJRC5jYW5vbmljYWw7XG4gICAgICAgIHVuaWZvcm1zWyd1X3RpbGVfdGxfdXAnXSA9IChwcm9qZWN0aW9uLnVwVmVjdG9yKGlkLCAwLCAwKTogYW55KTtcbiAgICAgICAgdW5pZm9ybXNbJ3VfdGlsZV90cl91cCddID0gKHByb2plY3Rpb24udXBWZWN0b3IoaWQsIEVYVEVOVCwgMCk6IGFueSk7XG4gICAgICAgIHVuaWZvcm1zWyd1X3RpbGVfYnJfdXAnXSA9IChwcm9qZWN0aW9uLnVwVmVjdG9yKGlkLCBFWFRFTlQsIEVYVEVOVCk6IGFueSk7XG4gICAgICAgIHVuaWZvcm1zWyd1X3RpbGVfYmxfdXAnXSA9IChwcm9qZWN0aW9uLnVwVmVjdG9yKGlkLCAwLCBFWFRFTlQpOiBhbnkpO1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnVzZURlbm9ybWFsaXplZFVwVmVjdG9yU2NhbGUpIHtcbiAgICAgICAgICAgIHVuaWZvcm1zWyd1X3RpbGVfdXBfc2NhbGUnXSA9IEdMT0JFX01FVEVSU19UT19FQ0VGO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdW5pZm9ybXNbJ3VfdGlsZV91cF9zY2FsZSddID0gcHJvamVjdGlvbi51cFZlY3RvclNjYWxlKGlkLCB0ci5jZW50ZXIubGF0LCB0ci53b3JsZFNpemUpLm1ldGVyc1RvVGlsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkZW1UaWxlID0gbnVsbDtcbiAgICAgICAgbGV0IHByZXZEZW1UaWxlID0gbnVsbDtcbiAgICAgICAgbGV0IG1vcnBoaW5nUGhhc2UgPSAxLjA7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5tb3JwaGluZyAmJiB0aGlzLl91c2VWZXJ0ZXhNb3JwaGluZykge1xuICAgICAgICAgICAgY29uc3Qgc3JjVGlsZSA9IG9wdGlvbnMubW9ycGhpbmcuc3JjRGVtVGlsZTtcbiAgICAgICAgICAgIGNvbnN0IGRzdFRpbGUgPSBvcHRpb25zLm1vcnBoaW5nLmRzdERlbVRpbGU7XG4gICAgICAgICAgICBtb3JwaGluZ1BoYXNlID0gb3B0aW9ucy5tb3JwaGluZy5waGFzZTtcblxuICAgICAgICAgICAgaWYgKHNyY1RpbGUgJiYgZHN0VGlsZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcmVwYXJlRGVtVGlsZVVuaWZvcm1zKHRpbGUsIHNyY1RpbGUsIHVuaWZvcm1zLCBcIl9wcmV2XCIpKVxuICAgICAgICAgICAgICAgICAgICBwcmV2RGVtVGlsZSA9IHNyY1RpbGU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ByZXBhcmVEZW1UaWxlVW5pZm9ybXModGlsZSwgZHN0VGlsZSwgdW5pZm9ybXMpKVxuICAgICAgICAgICAgICAgICAgICBkZW1UaWxlID0gZHN0VGlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2RGVtVGlsZSAmJiBkZW1UaWxlKSB7XG4gICAgICAgICAgICAvLyBCb3RoIERFTSB0ZXh0dXJlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgY29ycmVjdGx5IHNldCBpZiBnZW9tb3JwaGluZyBpcyBlbmFibGVkXG4gICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUyKTtcbiAgICAgICAgICAgIChkZW1UaWxlLmRlbVRleHR1cmU6IGFueSkuYmluZChnbC5ORUFSRVNULCBnbC5DTEFNUF9UT19FREdFLCBnbC5ORUFSRVNUKTtcbiAgICAgICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTQpO1xuICAgICAgICAgICAgKHByZXZEZW1UaWxlLmRlbVRleHR1cmU6IGFueSkuYmluZChnbC5ORUFSRVNULCBnbC5DTEFNUF9UT19FREdFLCBnbC5ORUFSRVNUKTtcblxuICAgICAgICAgICAgdW5pZm9ybXNbXCJ1X2RlbV9sZXJwXCJdID0gbW9ycGhpbmdQaGFzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbVRpbGUgPSB0aGlzLnRlcnJhaW5UaWxlRm9yVGlsZVt0aWxlLnRpbGVJRC5rZXldO1xuICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMik7XG4gICAgICAgICAgICBjb25zdCBkZW1UZXh0dXJlID0gdGhpcy5fcHJlcGFyZURlbVRpbGVVbmlmb3Jtcyh0aWxlLCBkZW1UaWxlLCB1bmlmb3JtcykgP1xuICAgICAgICAgICAgICAgIChkZW1UaWxlLmRlbVRleHR1cmU6IGFueSkgOiB0aGlzLmVtcHR5REVNVGV4dHVyZTtcbiAgICAgICAgICAgIGRlbVRleHR1cmUuYmluZChnbC5ORUFSRVNULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTMpO1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnVzZURlcHRoRm9yT2NjbHVzaW9uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGVwdGhUZXh0dXJlKSB0aGlzLl9kZXB0aFRleHR1cmUuYmluZChnbC5ORUFSRVNULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZXB0aEZCTykgdW5pZm9ybXNbJ3VfZGVwdGhfc2l6ZV9pbnYnXSA9IFsxIC8gdGhpcy5fZGVwdGhGQk8ud2lkdGgsIDEgLyB0aGlzLl9kZXB0aEZCTy5oZWlnaHRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbXB0eURlcHRoQnVmZmVyVGV4dHVyZS5iaW5kKGdsLk5FQVJFU1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgdW5pZm9ybXNbJ3VfZGVwdGhfc2l6ZV9pbnYnXSA9IFsxLCAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudXNlTWV0ZXJUb0RlbSAmJiBkZW1UaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRlclRvREVNID0gKDEgPDwgZGVtVGlsZS50aWxlSUQuY2Fub25pY2FsLnopICogbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIHRoaXMucGFpbnRlci50cmFuc2Zvcm0uY2VudGVyLmxhdCkgKiB0aGlzLnNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLnRpbGVTaXplO1xuICAgICAgICAgICAgdW5pZm9ybXNbJ3VfbWV0ZXJfdG9fZGVtJ10gPSBtZXRlclRvREVNO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubGFiZWxQbGFuZU1hdHJpeEludikge1xuICAgICAgICAgICAgdW5pZm9ybXNbJ3VfbGFiZWxfcGxhbmVfbWF0cml4X2ludiddID0gb3B0aW9ucy5sYWJlbFBsYW5lTWF0cml4SW52O1xuICAgICAgICB9XG4gICAgICAgIHByb2dyYW0uc2V0VGVycmFpblVuaWZvcm1WYWx1ZXMoY29udGV4dCwgdW5pZm9ybXMpO1xuICAgIH1cblxuICAgIHJlbmRlclRvQmFja0J1ZmZlcihhY2N1bXVsYXRlZERyYXBlczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICAgICAgY29uc3QgcGFpbnRlciA9IHRoaXMucGFpbnRlcjtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucGFpbnRlci5jb250ZXh0O1xuXG4gICAgICAgIGlmIChhY2N1bXVsYXRlZERyYXBlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldChudWxsKTtcbiAgICAgICAgY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHBhaW50ZXIud2lkdGgsIHBhaW50ZXIuaGVpZ2h0XSk7XG5cbiAgICAgICAgcGFpbnRlci5ncHVUaW1pbmdEZWZlcnJlZFJlbmRlclN0YXJ0KCk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJpbmdUb1RleHR1cmUgPSBmYWxzZTtcbiAgICAgICAgZHJhd1RlcnJhaW5SYXN0ZXIocGFpbnRlciwgdGhpcywgdGhpcy5wcm94eVNvdXJjZUNhY2hlLCBhY2N1bXVsYXRlZERyYXBlcywgdGhpcy5fdXBkYXRlVGltZXN0YW1wKTtcbiAgICAgICAgdGhpcy5yZW5kZXJpbmdUb1RleHR1cmUgPSB0cnVlO1xuXG4gICAgICAgIHBhaW50ZXIuZ3B1VGltaW5nRGVmZXJyZWRSZW5kZXJFbmQoKTtcblxuICAgICAgICBhY2N1bXVsYXRlZERyYXBlcy5zcGxpY2UoMCwgYWNjdW11bGF0ZWREcmFwZXMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgZWFjaCBwcm94eSB0aWxlLCByZW5kZXIgYWxsIGxheWVycyB1bnRpbCB0aGUgbm9uLWRyYXBlZCBsYXllciAoYW5kXG4gICAgLy8gcmVuZGVyIHRoZSB0aWxlIHRvIHRoZSBzY3JlZW4pIGJlZm9yZSBhZHZhbmNpbmcgdG8gdGhlIG5leHQgcHJveHkgdGlsZS5cbiAgICAvLyBSZXR1cm5zIHRoZSBsYXN0IGRyYXduIGluZGV4IHRoYXQgaXMgdXNlZCBhcyBhIHN0YXJ0XG4gICAgLy8gbGF5ZXIgZm9yIGludGVybGVhdmVkIGRyYXBlZCByZW5kZXJpbmcuXG4gICAgLy8gQXBhcnQgdG8gbGF5ZXItYnktbGF5ZXIgcmVuZGVyaW5nIHVzZWQgaW4gMkQsIGhlcmUgd2UgaGF2ZSBwcm94eS10aWxlLWJ5LXByb3h5LXRpbGVcbiAgICAvLyByZW5kZXJpbmcuXG4gICAgcmVuZGVyQmF0Y2goc3RhcnRMYXllckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5fZHJhcGVkUmVuZGVyQmF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFydExheWVySW5kZXggKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJpbmdUb1RleHR1cmUgPSB0cnVlO1xuICAgICAgICBjb25zdCBwYWludGVyID0gdGhpcy5wYWludGVyO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wYWludGVyLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IHBzYyA9IHRoaXMucHJveHlTb3VyY2VDYWNoZTtcbiAgICAgICAgY29uc3QgcHJveGllcyA9IHRoaXMucHJveGllZENvb3Jkc1twc2MuaWRdO1xuXG4gICAgICAgIC8vIENvbnN1bWUgYmF0Y2ggb2Ygc2VxdWVudGlhbCBkcmFwZSBsYXllcnMgYW5kIG1vdmUgbmV4dFxuICAgICAgICBjb25zdCBkcmFwZWRMYXllckJhdGNoID0gdGhpcy5fZHJhcGVkUmVuZGVyQmF0Y2hlcy5zaGlmdCgpO1xuICAgICAgICBhc3NlcnQoZHJhcGVkTGF5ZXJCYXRjaC5zdGFydCA9PT0gc3RhcnRMYXllckluZGV4KTtcblxuICAgICAgICBjb25zdCBhY2N1bXVsYXRlZERyYXBlcyA9IFtdO1xuICAgICAgICBjb25zdCBsYXllcklkcyA9IHBhaW50ZXIuc3R5bGUub3JkZXI7XG5cbiAgICAgICAgbGV0IHBvb2xJbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgcHJveHkgb2YgcHJveGllcykge1xuICAgICAgICAgICAgLy8gYmluZCBmcmFtZWJ1ZmZlciBhbmQgYXNzaWduIHRleHR1cmUgdG8gdGhlIHRpbGUgKHRleHR1cmUgdXNlZCBpbiBkcmF3VGVycmFpblJhc3RlcikuXG4gICAgICAgICAgICBjb25zdCB0aWxlID0gcHNjLmdldFRpbGVCeUlEKHByb3h5LnByb3h5VGlsZUtleSk7XG4gICAgICAgICAgICBjb25zdCByZW5kZXJDYWNoZUluZGV4ID0gcHNjLnByb3h5Q2FjaGVkRkJPW3Byb3h5LmtleV0gPyBwc2MucHJveHlDYWNoZWRGQk9bcHJveHkua2V5XVtzdGFydExheWVySW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgZmJvID0gcmVuZGVyQ2FjaGVJbmRleCAhPT0gdW5kZWZpbmVkID8gcHNjLnJlbmRlckNhY2hlW3JlbmRlckNhY2hlSW5kZXhdIDogdGhpcy5wb29sW3Bvb2xJbmRleCsrXTtcbiAgICAgICAgICAgIGNvbnN0IHVzZVJlbmRlckNhY2hlID0gcmVuZGVyQ2FjaGVJbmRleCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICB0aWxlLnRleHR1cmUgPSBmYm8udGV4O1xuXG4gICAgICAgICAgICBpZiAodXNlUmVuZGVyQ2FjaGUgJiYgIWZiby5kaXJ0eSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBjYWNoZWQgcmVuZGVyIGZyb20gcHJldmlvdXMgcGFzcywgbm8gbmVlZCB0byByZW5kZXIgYWdhaW4uXG4gICAgICAgICAgICAgICAgYWNjdW11bGF0ZWREcmFwZXMucHVzaCh0aWxlLnRpbGVJRCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldChmYm8uZmIuZnJhbWVidWZmZXIpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZFRvVGlsZSA9IGZhbHNlOyAvLyByZXNldCBmbGFnLlxuICAgICAgICAgICAgaWYgKGZiby5kaXJ0eSkge1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIG9uIHN0YXJ0LlxuICAgICAgICAgICAgICAgIGNvbnRleHQuY2xlYXIoe2NvbG9yOiBDb2xvci50cmFuc3BhcmVudCwgc3RlbmNpbDogMH0pO1xuICAgICAgICAgICAgICAgIGZiby5kaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY3VycmVudFN0ZW5jaWxTb3VyY2U7IC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0dXAgc3RlbmNpbCBmb3IgdGhlIHNhbWUgc291cmNlIGZvciBjb25zZWN1dGl2ZSBsYXllcnMuXG4gICAgICAgICAgICBmb3IgKGxldCBqID0gZHJhcGVkTGF5ZXJCYXRjaC5zdGFydDsgaiA8PSBkcmFwZWRMYXllckJhdGNoLmVuZDsgKytqKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBwYWludGVyLnN0eWxlLl9sYXllcnNbbGF5ZXJJZHNbal1dO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhpZGRlbiA9IGxheWVyLmlzSGlkZGVuKHBhaW50ZXIudHJhbnNmb3JtLnpvb20pO1xuICAgICAgICAgICAgICAgIGFzc2VydCh0aGlzLl9zdHlsZS5pc0xheWVyRHJhcGVkKGxheWVyKSB8fCBoaWRkZW4pO1xuICAgICAgICAgICAgICAgIGlmIChoaWRkZW4pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBwYWludGVyLnN0eWxlLl9nZXRMYXllclNvdXJjZUNhY2hlKGxheWVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm94aWVkQ29vcmRzID0gc291cmNlQ2FjaGUgPyB0aGlzLnByb3h5VG9Tb3VyY2VbcHJveHkua2V5XVtzb3VyY2VDYWNoZS5pZF0gOiBbcHJveHldO1xuICAgICAgICAgICAgICAgIGlmICghcHJveGllZENvb3JkcykgY29udGludWU7IC8vIHdoZW4gdGlsZSBpcyBub3QgbG9hZGVkIHlldCBmb3IgdGhlIHNvdXJjZSBjYWNoZS5cblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9ICgocHJveGllZENvb3JkczogYW55KTogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pO1xuICAgICAgICAgICAgICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCBmYm8uZmIud2lkdGgsIGZiby5mYi5oZWlnaHRdKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0ZW5jaWxTb3VyY2UgIT09IChzb3VyY2VDYWNoZSA/IHNvdXJjZUNhY2hlLmlkIDogbnVsbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0dXBTdGVuY2lsKGZibywgcHJveGllZENvb3JkcywgbGF5ZXIsIHNvdXJjZUNhY2hlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ZW5jaWxTb3VyY2UgPSBzb3VyY2VDYWNoZSA/IHNvdXJjZUNhY2hlLmlkIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFpbnRlci5yZW5kZXJMYXllcihwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3Jkcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkVG9UaWxlKSB7XG4gICAgICAgICAgICAgICAgZmJvLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZERyYXBlcy5wdXNoKHRpbGUudGlsZUlEKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXVzZVJlbmRlckNhY2hlKSB7XG4gICAgICAgICAgICAgICAgLS1wb29sSW5kZXg7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHBvb2xJbmRleCA+PSAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb29sSW5kZXggPT09IEZCT19QT09MX1NJWkUpIHtcbiAgICAgICAgICAgICAgICBwb29sSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVG9CYWNrQnVmZmVyKGFjY3VtdWxhdGVkRHJhcGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlcyBhbmQgcmVuZGVyIGxhc3QgZHJhcGVzXG4gICAgICAgIHRoaXMucmVuZGVyVG9CYWNrQnVmZmVyKGFjY3VtdWxhdGVkRHJhcGVzKTtcbiAgICAgICAgdGhpcy5yZW5kZXJpbmdUb1RleHR1cmUgPSBmYWxzZTtcblxuICAgICAgICBjb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQobnVsbCk7XG4gICAgICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCBwYWludGVyLndpZHRoLCBwYWludGVyLmhlaWdodF0pO1xuXG4gICAgICAgIHJldHVybiBkcmFwZWRMYXllckJhdGNoLmVuZCArIDE7XG4gICAgfVxuXG4gICAgcG9zdFJlbmRlcigpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNvbnN1bWVkIGFsbCB0aGUgZHJhcGVkIHRlcnJhaW4gYmF0Y2hlcyBhdCB0aGlzIHBvaW50XG4gICAgICAgIGFzc2VydCh0aGlzLl9kcmFwZWRSZW5kZXJCYXRjaGVzLmxlbmd0aCA9PT0gMCk7XG4gICAgfVxuXG4gICAgcmVuZGVyQ2FjaGVFZmZpY2llbmN5KHN0eWxlOiBTdHlsZSk6IE9iamVjdCB7XG4gICAgICAgIGNvbnN0IGxheWVyQ291bnQgPSBzdHlsZS5vcmRlci5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGxheWVyQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7ZWZmaWNpZW5jeTogMTAwLjB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHVuY2FjaGVhYmxlTGF5ZXJDb3VudCA9IDA7XG4gICAgICAgIGxldCBkcmFwZWRMYXllckNvdW50ID0gMDtcbiAgICAgICAgbGV0IHJlYWNoZWRVbmRyYXBlZExheWVyID0gZmFsc2U7XG4gICAgICAgIGxldCBmaXJzdFVuZHJhcGVkTGF5ZXI7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllckNvdW50OyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gc3R5bGUuX2xheWVyc1tzdHlsZS5vcmRlcltpXV07XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3N0eWxlLmlzTGF5ZXJEcmFwZWQobGF5ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWFjaGVkVW5kcmFwZWRMYXllcikge1xuICAgICAgICAgICAgICAgICAgICByZWFjaGVkVW5kcmFwZWRMYXllciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0VW5kcmFwZWRMYXllciA9IGxheWVyLmlkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlYWNoZWRVbmRyYXBlZExheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICsrdW5jYWNoZWFibGVMYXllckNvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICArK2RyYXBlZExheWVyQ291bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHJhcGVkTGF5ZXJDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtlZmZpY2llbmN5OiAxMDAuMH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2VmZmljaWVuY3k6ICgxLjAgLSB1bmNhY2hlYWJsZUxheWVyQ291bnQgLyBkcmFwZWRMYXllckNvdW50KSAqIDEwMC4wLCBmaXJzdFVuZHJhcGVkTGF5ZXJ9O1xuICAgIH1cblxuICAgIGdldE1pbkVsZXZhdGlvbkJlbG93TVNMKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBtaW4gPSAwLjA7XG4gICAgICAgIC8vIFRoZSBtYXhpbXVtIERFTSBlcnJvciBpbiBtZXRlcnMgdG8gYmUgY29uc2VydmF0aXZlIChTUlRNKS5cbiAgICAgICAgY29uc3QgbWF4REVNRXJyb3IgPSAzMC4wO1xuICAgICAgICB0aGlzLl92aXNpYmxlRGVtVGlsZXMuZmlsdGVyKHRpbGUgPT4gdGlsZS5kZW0pLmZvckVhY2godGlsZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtaW5NYXhUcmVlID0gKHRpbGUuZGVtOiBhbnkpLnRyZWU7XG4gICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIG1pbk1heFRyZWUubWluaW11bXNbMF0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1pbiA9PT0gMC4wID8gbWluIDogKG1pbiAtIG1heERFTUVycm9yKSAqIHRoaXMuX2V4YWdnZXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtcyByYXljYXN0IGFnYWluc3QgdmlzaWJsZSBERU0gdGlsZXMgb24gdGhlIHNjcmVlbiBhbmQgcmV0dXJucyB0aGUgZGlzdGFuY2UgdHJhdmVsbGVkIGFsb25nIHRoZSByYXkuXG4gICAgLy8geCAmIHkgY29tcG9uZW50cyBvZiB0aGUgcG9zaXRpb24gYXJlIGV4cGVjdGVkIHRvIGJlIGluIG5vcm1hbGl6ZWQgbWVyY2F0b3IgY29vcmRpbmF0ZXMgWzAsIDFdIGFuZCB6IGluIG1ldGVycy5cbiAgICByYXljYXN0KHBvczogVmVjMywgZGlyOiBWZWMzLCBleGFnZ2VyYXRpb246IG51bWJlcik6ID9udW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMuX3Zpc2libGVEZW1UaWxlcylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFBlcmZvcm0gaW5pdGlhbCByYXljYXN0cyBhZ2FpbnN0IHJvb3Qgbm9kZXMgb2YgdGhlIGF2YWlsYWJsZSBkZW0gdGlsZXNcbiAgICAgICAgLy8gYW5kIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIHNvcnQgdGhlbSBmcm9tIGNsb3Nlc3QgdG8gZnVydGhlc3QuXG4gICAgICAgIGNvbnN0IHByZXBhcmVkVGlsZXMgPSB0aGlzLl92aXNpYmxlRGVtVGlsZXMuZmlsdGVyKHRpbGUgPT4gdGlsZS5kZW0pLm1hcCh0aWxlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGlsZS50aWxlSUQ7XG4gICAgICAgICAgICBjb25zdCB0aWxlcyA9IE1hdGgucG93KDIuMCwgaWQub3ZlcnNjYWxlZFopO1xuICAgICAgICAgICAgY29uc3Qge3gsIHl9ID0gaWQuY2Fub25pY2FsO1xuXG4gICAgICAgICAgICAvLyBDb21wdXRlIHRpbGUgYm91bmRhcmllcyBpbiBtZXJjYXRvciBjb29yZGluYXRlc1xuICAgICAgICAgICAgY29uc3QgbWlueCA9IHggLyB0aWxlcztcbiAgICAgICAgICAgIGNvbnN0IG1heHggPSAoeCArIDEpIC8gdGlsZXM7XG4gICAgICAgICAgICBjb25zdCBtaW55ID0geSAvIHRpbGVzO1xuICAgICAgICAgICAgY29uc3QgbWF4eSA9ICh5ICsgMSkgLyB0aWxlcztcbiAgICAgICAgICAgIGNvbnN0IHRyZWUgPSAodGlsZS5kZW06IGFueSkudHJlZTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtaW54LCBtaW55LCBtYXh4LCBtYXh5LFxuICAgICAgICAgICAgICAgIHQ6IHRyZWUucmF5Y2FzdFJvb3QobWlueCwgbWlueSwgbWF4eCwgbWF4eSwgcG9zLCBkaXIsIGV4YWdnZXJhdGlvbiksXG4gICAgICAgICAgICAgICAgdGlsZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJlcGFyZWRUaWxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdCA9IGEudCAhPT0gbnVsbCA/IGEudCA6IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgICAgICBjb25zdCBidCA9IGIudCAhPT0gbnVsbCA/IGIudCA6IE51bWJlci5NQVhfVkFMVUU7XG4gICAgICAgICAgICByZXR1cm4gYXQgLSBidDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBvYmogb2YgcHJlcGFyZWRUaWxlcykge1xuICAgICAgICAgICAgaWYgKG9iai50ID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIC8vIFBlcmZvcm0gbW9yZSBhY2N1cmF0ZSByYXljYXN0IGFnYWluc3QgdGhlIGRlbSB0cmVlLiBGaXJzdCBpbnRlcnNlY3Rpb24gaXMgdGhlIGNsb3Nlc3Qgb25cbiAgICAgICAgICAgIC8vIGFzIGFsbCB0aWxlcyBhcmUgc29ydGVkIGZyb20gY2xvc2VzdCB0byBmdXJ0aGVzdFxuICAgICAgICAgICAgY29uc3QgdHJlZSA9IChvYmoudGlsZS5kZW06IGFueSkudHJlZTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0cmVlLnJheWNhc3Qob2JqLm1pbngsIG9iai5taW55LCBvYmoubWF4eCwgb2JqLm1heHksIHBvcywgZGlyLCBleGFnZ2VyYXRpb24pO1xuXG4gICAgICAgICAgICBpZiAodCAhPSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUZCTygpOiBGQk8ge1xuICAgICAgICBjb25zdCBwYWludGVyID0gdGhpcy5wYWludGVyO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclNpemUgPSB0aGlzLmRyYXBlQnVmZmVyU2l6ZTtcbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgIGNvbnN0IHRleCA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIHt3aWR0aDogYnVmZmVyU2l6ZVswXSwgaGVpZ2h0OiBidWZmZXJTaXplWzFdLCBkYXRhOiBudWxsfSwgZ2wuUkdCQSk7XG4gICAgICAgIHRleC5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGNvbnN0IGZiID0gY29udGV4dC5jcmVhdGVGcmFtZWJ1ZmZlcihidWZmZXJTaXplWzBdLCBidWZmZXJTaXplWzFdLCBmYWxzZSk7XG4gICAgICAgIGZiLmNvbG9yQXR0YWNobWVudC5zZXQodGV4LnRleHR1cmUpO1xuICAgICAgICBmYi5kZXB0aEF0dGFjaG1lbnQgPSBuZXcgRGVwdGhTdGVuY2lsQXR0YWNobWVudChjb250ZXh0LCBmYi5mcmFtZWJ1ZmZlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuX3NoYXJlZERlcHRoU3RlbmNpbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9zaGFyZWREZXB0aFN0ZW5jaWwgPSBjb250ZXh0LmNyZWF0ZVJlbmRlcmJ1ZmZlcihjb250ZXh0LmdsLkRFUFRIX1NURU5DSUwsIGJ1ZmZlclNpemVbMF0sIGJ1ZmZlclNpemVbMV0pO1xuICAgICAgICAgICAgdGhpcy5fc3RlbmNpbFJlZiA9IDA7XG4gICAgICAgICAgICBmYi5kZXB0aEF0dGFjaG1lbnQuc2V0KHRoaXMuX3NoYXJlZERlcHRoU3RlbmNpbCk7XG4gICAgICAgICAgICBjb250ZXh0LmNsZWFyKHtzdGVuY2lsOiAwfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmYi5kZXB0aEF0dGFjaG1lbnQuc2V0KHRoaXMuX3NoYXJlZERlcHRoU3RlbmNpbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5leHRUZXh0dXJlRmlsdGVyQW5pc290cm9waWMgJiYgIWNvbnRleHQuZXh0VGV4dHVyZUZpbHRlckFuaXNvdHJvcGljRm9yY2VPZmYpIHtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmYoZ2wuVEVYVFVSRV8yRCxcbiAgICAgICAgICAgICAgICBjb250ZXh0LmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpYy5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCxcbiAgICAgICAgICAgICAgICBjb250ZXh0LmV4dFRleHR1cmVGaWx0ZXJBbmlzb3Ryb3BpY01heCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge2ZiLCB0ZXgsIGRpcnR5OiBmYWxzZX07XG4gICAgfVxuXG4gICAgX2luaXRGQk9Qb29sKCkge1xuICAgICAgICB3aGlsZSAodGhpcy5wb29sLmxlbmd0aCA8IE1hdGgubWluKEZCT19QT09MX1NJWkUsIHRoaXMucHJveHlDb29yZHMubGVuZ3RoKSkge1xuICAgICAgICAgICAgdGhpcy5wb29sLnB1c2godGhpcy5fY3JlYXRlRkJPKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3Nob3VsZERpc2FibGVSZW5kZXJDYWNoZSgpOiBib29sZWFuIHtcbiAgICAgICAgLy8gRGlzYWJsZSByZW5kZXIgY2FjaGVzIG9uIGR5bmFtaWMgZXZlbnRzIGR1ZSB0byBmYWRpbmcgb3IgdHJhbnNpdGlvbmluZy5cbiAgICAgICAgaWYgKHRoaXMuX3N0eWxlLmxpZ2h0ICYmIHRoaXMuX3N0eWxlLmxpZ2h0Lmhhc1RyYW5zaXRpb24oKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3N0eWxlLl9zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdHlsZS5fc291cmNlQ2FjaGVzW2lkXS5oYXNUcmFuc2l0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhZGluZ09yVHJhbnNpdGlvbmluZyA9IGlkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fc3R5bGUuX2xheWVyc1tpZF07XG4gICAgICAgICAgICBjb25zdCBpc0hpZGRlbiA9IGxheWVyLmlzSGlkZGVuKHRoaXMucGFpbnRlci50cmFuc2Zvcm0uem9vbSk7XG4gICAgICAgICAgICBjb25zdCBjcm9zc0ZhZGUgPSBsYXllci5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk7XG4gICAgICAgICAgICBjb25zdCBpc0ZhZGluZyA9ICEhY3Jvc3NGYWRlICYmIGNyb3NzRmFkZS50ICE9PSAxO1xuICAgICAgICAgICAgY29uc3QgaXNUcmFuc2l0aW9uaW5nID0gbGF5ZXIuaGFzVHJhbnNpdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuIGxheWVyLnR5cGUgIT09ICdjdXN0b20nICYmICFpc0hpZGRlbiAmJiAoaXNGYWRpbmcgfHwgaXNUcmFuc2l0aW9uaW5nKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlLm9yZGVyLnNvbWUoZmFkaW5nT3JUcmFuc2l0aW9uaW5nKTtcbiAgICB9XG5cbiAgICBfY2xlYXJSYXN0ZXJGYWRlRnJvbVJlbmRlckNhY2hlKCkge1xuICAgICAgICBsZXQgaGFzUmFzdGVyU291cmNlID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fc3R5bGUuX3NvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlLl9zb3VyY2VDYWNoZXNbaWRdLl9zb3VyY2UgaW5zdGFuY2VvZiBSYXN0ZXJUaWxlU291cmNlKSB7XG4gICAgICAgICAgICAgICAgaGFzUmFzdGVyU291cmNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhhc1Jhc3RlclNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYW55IHJhc3RlciB0aWxlIGlzIGluIGEgZmFkaW5nIHN0YXRlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fc3R5bGUub3JkZXIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fc3R5bGUuX2xheWVyc1t0aGlzLl9zdHlsZS5vcmRlcltpXV07XG4gICAgICAgICAgICBjb25zdCBpc0hpZGRlbiA9IGxheWVyLmlzSGlkZGVuKHRoaXMucGFpbnRlci50cmFuc2Zvcm0uem9vbSk7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHRoaXMuX3N0eWxlLl9nZXRMYXllclNvdXJjZUNhY2hlKGxheWVyKTtcbiAgICAgICAgICAgIGlmIChsYXllci50eXBlICE9PSAncmFzdGVyJyB8fCBpc0hpZGRlbiB8fCAhc291cmNlQ2FjaGUpIHsgY29udGludWU7IH1cblxuICAgICAgICAgICAgY29uc3QgcmFzdGVyTGF5ZXIgPSAoKGxheWVyOiBhbnkpOiBSYXN0ZXJTdHlsZUxheWVyKTtcbiAgICAgICAgICAgIGNvbnN0IGZhZGVEdXJhdGlvbiA9IHJhc3RlckxheWVyLnBhaW50LmdldCgncmFzdGVyLWZhZGUtZHVyYXRpb24nKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJveHkgb2YgdGhpcy5wcm94eUNvb3Jkcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3hpZWRDb29yZHMgPSB0aGlzLnByb3h5VG9Tb3VyY2VbcHJveHkua2V5XVtzb3VyY2VDYWNoZS5pZF07XG4gICAgICAgICAgICAgICAgY29uc3QgY29vcmRzID0gKChwcm94aWVkQ29vcmRzOiBhbnkpOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPik7XG4gICAgICAgICAgICAgICAgaWYgKCFjb29yZHMpIHsgY29udGludWU7IH1cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gc291cmNlQ2FjaGUuZmluZExvYWRlZFBhcmVudChjb29yZCwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZhZGUgPSByYXN0ZXJGYWRlKHRpbGUsIHBhcmVudCwgc291cmNlQ2FjaGUsIHRoaXMucGFpbnRlci50cmFuc2Zvcm0sIGZhZGVEdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmFkaW5nID0gZmFkZS5vcGFjaXR5ICE9PSAxIHx8IGZhZGUubWl4ICE9PSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyUmVuZGVyQ2FjaGVGb3JUaWxlKHNvdXJjZUNhY2hlLmlkLCBjb29yZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc2V0dXBEcmFwZWRSZW5kZXJCYXRjaGVzKCkge1xuICAgICAgICBjb25zdCBsYXllcklkcyA9IHRoaXMuX3N0eWxlLm9yZGVyO1xuICAgICAgICBjb25zdCBsYXllckNvdW50ID0gbGF5ZXJJZHMubGVuZ3RoO1xuICAgICAgICBpZiAobGF5ZXJDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmF0Y2hlcyA9IFtdO1xuXG4gICAgICAgIGxldCBjdXJyZW50TGF5ZXIgPSAwO1xuICAgICAgICBsZXQgbGF5ZXIgPSB0aGlzLl9zdHlsZS5fbGF5ZXJzW2xheWVySWRzW2N1cnJlbnRMYXllcl1dO1xuICAgICAgICB3aGlsZSAoIXRoaXMuX3N0eWxlLmlzTGF5ZXJEcmFwZWQobGF5ZXIpICYmIGxheWVyLmlzSGlkZGVuKHRoaXMucGFpbnRlci50cmFuc2Zvcm0uem9vbSkgJiYgKytjdXJyZW50TGF5ZXIgPCBsYXllckNvdW50KSB7XG4gICAgICAgICAgICBsYXllciA9IHRoaXMuX3N0eWxlLl9sYXllcnNbbGF5ZXJJZHNbY3VycmVudExheWVyXV07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYmF0Y2hTdGFydDtcbiAgICAgICAgZm9yICg7IGN1cnJlbnRMYXllciA8IGxheWVyQ291bnQ7ICsrY3VycmVudExheWVyKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX3N0eWxlLl9sYXllcnNbbGF5ZXJJZHNbY3VycmVudExheWVyXV07XG4gICAgICAgICAgICBpZiAobGF5ZXIuaXNIaWRkZW4odGhpcy5wYWludGVyLnRyYW5zZm9ybS56b29tKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zdHlsZS5pc0xheWVyRHJhcGVkKGxheWVyKSkge1xuICAgICAgICAgICAgICAgIGlmIChiYXRjaFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2hlcy5wdXNoKHtzdGFydDogYmF0Y2hTdGFydCwgZW5kOiBjdXJyZW50TGF5ZXIgLSAxfSk7XG4gICAgICAgICAgICAgICAgICAgIGJhdGNoU3RhcnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJhdGNoU3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGJhdGNoU3RhcnQgPSBjdXJyZW50TGF5ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmF0Y2hTdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBiYXRjaGVzLnB1c2goe3N0YXJ0OiBiYXRjaFN0YXJ0LCBlbmQ6IGN1cnJlbnRMYXllciAtIDF9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zdHlsZS5tYXAuX29wdGltaXplRm9yVGVycmFpbikge1xuICAgICAgICAgICAgLy8gRHJhcGVkIGZpcnN0IGFwcHJvYWNoIHNob3VsZCByZXN1bHQgaW4gYSBzaW5nbGUgb3Igbm8gYmF0Y2hcbiAgICAgICAgICAgIGFzc2VydChiYXRjaGVzLmxlbmd0aCA9PT0gMSB8fCBiYXRjaGVzLmxlbmd0aCA9PT0gMCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kcmFwZWRSZW5kZXJCYXRjaGVzID0gYmF0Y2hlcztcbiAgICB9XG5cbiAgICBfc2V0dXBSZW5kZXJDYWNoZShwcmV2aW91c1Byb3h5VG9Tb3VyY2U6IHtbbnVtYmVyXToge1tzdHJpbmddOiBBcnJheTxQcm94aWVkVGlsZUlEPn19KSB7XG4gICAgICAgIGNvbnN0IHBzYyA9IHRoaXMucHJveHlTb3VyY2VDYWNoZTtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3VsZERpc2FibGVSZW5kZXJDYWNoZSgpIHx8IHRoaXMuX2ludmFsaWRhdGVSZW5kZXJDYWNoZSkge1xuICAgICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVJlbmRlckNhY2hlID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocHNjLnJlbmRlckNhY2hlLmxlbmd0aCA+IHBzYy5yZW5kZXJDYWNoZVBvb2wubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlZCA9ICgoT2JqZWN0LnZhbHVlcyhwc2MucHJveHlDYWNoZWRGQk8pOiBhbnkpOiBBcnJheTx7W3N0cmluZyB8IG51bWJlcl06IG51bWJlcn0+KTtcbiAgICAgICAgICAgICAgICBwc2MucHJveHlDYWNoZWRGQk8gPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVzZWQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmJvcyA9ICgoT2JqZWN0LnZhbHVlcyh1c2VkW2ldKTogYW55KTogQXJyYXk8bnVtYmVyPik7XG4gICAgICAgICAgICAgICAgICAgIHBzYy5yZW5kZXJDYWNoZVBvb2wucHVzaCguLi5mYm9zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHBzYy5yZW5kZXJDYWNoZS5sZW5ndGggPT09IHBzYy5yZW5kZXJDYWNoZVBvb2wubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NsZWFyUmFzdGVyRmFkZUZyb21SZW5kZXJDYWNoZSgpO1xuXG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMucHJveHlDb29yZHM7XG4gICAgICAgIGNvbnN0IGRpcnR5ID0gdGhpcy5fdGlsZXNEaXJ0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGNvb3Jkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgcHJveHkgPSBjb29yZHNbaV07XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gcHNjLmdldFRpbGVCeUlEKHByb3h5LmtleSk7XG5cbiAgICAgICAgICAgIGlmIChwc2MucHJveHlDYWNoZWRGQk9bcHJveHkua2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHRpbGUudGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9IHByZXZpb3VzUHJveHlUb1NvdXJjZVtwcm94eS5rZXldO1xuICAgICAgICAgICAgICAgIGFzc2VydChwcmV2KTtcbiAgICAgICAgICAgICAgICAvLyBSZXVzZSBwcmV2aW91cyByZW5kZXIgZnJvbSBjYWNoZSBpZiB0aGVyZSB3YXMgbm8gY2hhbmdlIG9mXG4gICAgICAgICAgICAgICAgLy8gY29udGVudCB0aGF0IHdhcyB1c2VkIHRvIHJlbmRlciBwcm94eSB0aWxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnByb3h5VG9Tb3VyY2VbcHJveHkua2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgZXF1YWwgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlIGluIGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGlsZXMgPSBjdXJyZW50W3NvdXJjZV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZUaWxlcyA9IHByZXZbc291cmNlXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmV2VGlsZXMgfHwgcHJldlRpbGVzLmxlbmd0aCAhPT0gdGlsZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlcy5zb21lKCh0LCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCAhPT0gcHJldlRpbGVzW2luZGV4XSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXJ0eVtzb3VyY2VdICYmIGRpcnR5W3NvdXJjZV0uaGFzT3duUHJvcGVydHkodC5rZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICsrZXF1YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGRpcnR5ID09PSBmYWxzZTogZG9lc24ndCBuZWVkIHRvIGJlIHJlbmRlcmVkIHRvLCBqdXN0IHVzZSBjYWNoZWQgcmVuZGVyLlxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJveHlGQk8gaW4gcHNjLnByb3h5Q2FjaGVkRkJPW3Byb3h5LmtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcHNjLnJlbmRlckNhY2hlW3BzYy5wcm94eUNhY2hlZEZCT1twcm94eS5rZXldW3Byb3h5RkJPXV0uZGlydHkgPSBlcXVhbCA8IDAgfHwgZXF1YWwgIT09IE9iamVjdC52YWx1ZXMocHJldikubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvcnRlZFJlbmRlckJhdGNoZXMgPSBbLi4udGhpcy5fZHJhcGVkUmVuZGVyQmF0Y2hlc107XG4gICAgICAgIHNvcnRlZFJlbmRlckJhdGNoZXMuc29ydCgoYmF0Y2hBLCBiYXRjaEIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoQVNpemUgPSBiYXRjaEEuZW5kIC0gYmF0Y2hBLnN0YXJ0O1xuICAgICAgICAgICAgY29uc3QgYmF0Y2hCU2l6ZSA9IGJhdGNoQi5lbmQgLSBiYXRjaEIuc3RhcnQ7XG4gICAgICAgICAgICByZXR1cm4gYmF0Y2hCU2l6ZSAtIGJhdGNoQVNpemU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2Ygc29ydGVkUmVuZGVyQmF0Y2hlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBjb29yZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocHNjLnByb3h5Q2FjaGVkRkJPW2lkLmtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzaWduIHJlbmRlckNhY2hlIEZCTyBpZiB0aGVyZSBhcmUgYXZhaWxhYmxlIEZCT3MgaW4gcG9vbC5cbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBwc2MucmVuZGVyQ2FjaGVQb29sLnBvcCgpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkICYmIHBzYy5yZW5kZXJDYWNoZS5sZW5ndGggPCBSRU5ERVJfQ0FDSEVfTUFYX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwc2MucmVuZGVyQ2FjaGUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBwc2MucmVuZGVyQ2FjaGUucHVzaCh0aGlzLl9jcmVhdGVGQk8oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBzYy5wcm94eUNhY2hlZEZCT1tpZC5rZXldID0ge307XG4gICAgICAgICAgICAgICAgICAgIHBzYy5wcm94eUNhY2hlZEZCT1tpZC5rZXldW2JhdGNoLnN0YXJ0XSA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICBwc2MucmVuZGVyQ2FjaGVbaW5kZXhdLmRpcnR5ID0gdHJ1ZTsgLy8gbmVlZHMgdG8gYmUgcmVuZGVyZWQgdG8uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3RpbGVzRGlydHkgPSB7fTtcbiAgICB9XG5cbiAgICBfc2V0dXBTdGVuY2lsKGZibzogRkJPLCBwcm94aWVkQ29vcmRzOiBBcnJheTxQcm94aWVkVGlsZUlEPiwgbGF5ZXI6IFN0eWxlTGF5ZXIsIHNvdXJjZUNhY2hlPzogU291cmNlQ2FjaGUpIHtcbiAgICAgICAgaWYgKCFzb3VyY2VDYWNoZSB8fCAhdGhpcy5fc291cmNlVGlsZXNPdmVybGFwW3NvdXJjZUNhY2hlLmlkXSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJsYXBTdGVuY2lsVHlwZSkgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxUeXBlID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMucGFpbnRlci5jb250ZXh0O1xuICAgICAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICAgICAgLy8gSWYgbmVlZGVkLCBzZXR1cCBzdGVuY2lsbGluZy4gRG9uJ3QgYm90aGVyIHRvIHJlbW92ZSB3aGVuIHRoZXJlIGlzIG5vXG4gICAgICAgIC8vIG1vcmUgbmVlZDogaW4gc3VjaCBjYXNlLCBpZiB0aGVyZSBpcyBubyBvdmVybGFwLCBzdGVuY2lsbGluZyBpcyBkaXNhYmxlZC5cbiAgICAgICAgaWYgKHByb3hpZWRDb29yZHMubGVuZ3RoIDw9IDEpIHsgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxUeXBlID0gZmFsc2U7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCBzdGVuY2lsUmFuZ2U7XG4gICAgICAgIGlmIChsYXllci5pc1RpbGVDbGlwcGVkKCkpIHtcbiAgICAgICAgICAgIHN0ZW5jaWxSYW5nZSA9IHByb3hpZWRDb29yZHMubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxNb2RlLnRlc3QgPSB7ZnVuYzogZ2wuRVFVQUwsIG1hc2s6IDB4RkZ9O1xuICAgICAgICAgICAgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxUeXBlID0gJ0NsaXAnO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3hpZWRDb29yZHNbMF0ub3ZlcnNjYWxlZFogPiBwcm94aWVkQ29vcmRzW3Byb3hpZWRDb29yZHMubGVuZ3RoIC0gMV0ub3ZlcnNjYWxlZFopIHtcbiAgICAgICAgICAgIHN0ZW5jaWxSYW5nZSA9IDE7XG4gICAgICAgICAgICB0aGlzLl9vdmVybGFwU3RlbmNpbE1vZGUudGVzdCA9IHtmdW5jOiBnbC5HUkVBVEVSLCBtYXNrOiAweEZGfTtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXBTdGVuY2lsVHlwZSA9ICdNYXNrJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX292ZXJsYXBTdGVuY2lsVHlwZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zdGVuY2lsUmVmICsgc3RlbmNpbFJhbmdlID4gMjU1KSB7XG4gICAgICAgICAgICBjb250ZXh0LmNsZWFyKHtzdGVuY2lsOiAwfSk7XG4gICAgICAgICAgICB0aGlzLl9zdGVuY2lsUmVmID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGVuY2lsUmVmICs9IHN0ZW5jaWxSYW5nZTtcbiAgICAgICAgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxNb2RlLnJlZiA9IHRoaXMuX3N0ZW5jaWxSZWY7XG4gICAgICAgIGlmIChsYXllci5pc1RpbGVDbGlwcGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKHByb3hpZWRDb29yZHMsIHRoaXMuX292ZXJsYXBTdGVuY2lsTW9kZS5yZWYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xpcE9yTWFza092ZXJsYXBTdGVuY2lsVHlwZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXBTdGVuY2lsVHlwZSA9PT0gJ0NsaXAnIHx8IHRoaXMuX292ZXJsYXBTdGVuY2lsVHlwZSA9PT0gJ01hc2snO1xuICAgIH1cblxuICAgIHN0ZW5jaWxNb2RlRm9yUlRUT3ZlcmxhcChpZDogT3ZlcnNjYWxlZFRpbGVJRCk6ICRSZWFkT25seTxTdGVuY2lsTW9kZT4ge1xuICAgICAgICBpZiAoIXRoaXMucmVuZGVyaW5nVG9UZXh0dXJlIHx8ICF0aGlzLl9vdmVybGFwU3RlbmNpbFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbGwgc291cmNlIHRpbGVzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2FtZSBwcm94eSBhcmUgcHJvY2Vzc2VkIGluIHNlcXVlbmNlLCBpbiB6b29tIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICAgIC8vIEZvciByYXN0ZXIgLyBoaWxsc2hhZGUgb3ZlcmxhcCBtYXNraW5nLCByZWYgaXMgYmFzZWQgb24gem9vbSBkaWYuXG4gICAgICAgIC8vIEZvciB2ZWN0b3IgbGF5ZXIgY2xpcHBpbmcsIGV2ZXJ5IHRpbGUgZ2V0cyBkZWRpY2F0ZWQgc3RlbmNpbCByZWYuXG4gICAgICAgIGlmICh0aGlzLl9vdmVybGFwU3RlbmNpbFR5cGUgPT09ICdDbGlwJykge1xuICAgICAgICAgICAgLy8gSW4gaW1tZWRpYXRlIDJEIG1vZGUsIHdlIHJlbmRlciByZWN0cyB0byBtYXJrIGNsaXBwaW5nIGFyZWEgYW5kIGhhbmRsZSBiZWhhdmlvciBvbiB0aWxlIGJvcmRlcnMuXG4gICAgICAgICAgICAvLyBIZXJlLCB0aGVyZSBpcyBubyBuZWVkIGZvciBub3cgZm9yIHRoaXM6XG4gICAgICAgICAgICAvLyAxLiBvdmVybGFwIGlzIGhhbmRsZWQgYnkgcHJveHkgcmVuZGVyIHRvIHRleHR1cmUgdGlsZXMgKHRoZXJlIGlzIG5vIG92ZXJsYXAgdGhlcmUpXG4gICAgICAgICAgICAvLyAyLiBoZXJlIHdlIGhhbmRsZSBvbmx5IGJyaWVmIHpvb20gb3V0IHNlbWktdHJhbnNwYXJlbnQgY29sb3IgaW50ZW5zaXR5IGZsaWNrZXJpbmdcbiAgICAgICAgICAgIC8vICAgIGFuZCB0aGF0IGlzIGF2b2lkZWQgZmluZSBieSBzdGVuY2lsaW5nIHByaW1pdGl2ZXMgYXMgcGFydCBvZiBkcmF3aW5nIChpbnN0ZWFkIG9mIGFkZGl0aW9uYWwgdGlsZSBxdWFkIHN0ZXApLlxuICAgICAgICAgICAgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxNb2RlLnJlZiA9IHRoaXMucGFpbnRlci5fdGlsZUNsaXBwaW5nTWFza0lEc1tpZC5rZXldO1xuICAgICAgICB9IC8vIGVsc2UgdGhpcy5fb3ZlcmxhcFN0ZW5jaWxNb2RlLnJlZiBpcyBzZXQgdG8gYSBzaW5nbGUgdmFsdWUgdXNlZCBwZXIgcHJveHkgdGlsZSwgaW4gX3NldHVwU3RlbmNpbC5cbiAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXBTdGVuY2lsTW9kZTtcbiAgICB9XG5cbiAgICBfcmVuZGVyVGlsZUNsaXBwaW5nTWFza3MocHJveGllZENvb3JkczogQXJyYXk8UHJveGllZFRpbGVJRD4sIHJlZjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHBhaW50ZXIgPSB0aGlzLnBhaW50ZXI7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgICAgICBwYWludGVyLl90aWxlQ2xpcHBpbmdNYXNrSURzID0ge307XG4gICAgICAgIGNvbnRleHQuc2V0Q29sb3JNb2RlKENvbG9yTW9kZS5kaXNhYmxlZCk7XG4gICAgICAgIGNvbnRleHQuc2V0RGVwdGhNb2RlKERlcHRoTW9kZS5kaXNhYmxlZCk7XG5cbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnY2xpcHBpbmdNYXNrJyk7XG5cbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgcHJveGllZENvb3Jkcykge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBwYWludGVyLl90aWxlQ2xpcHBpbmdNYXNrSURzW3RpbGVJRC5rZXldID0gLS1yZWY7XG4gICAgICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBEZXB0aE1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgLy8gVGVzdHMgd2lsbCBhbHdheXMgcGFzcywgYW5kIHJlZiB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4gdG8gc3RlbmNpbCBidWZmZXIuXG4gICAgICAgICAgICAgICAgbmV3IFN0ZW5jaWxNb2RlKHtmdW5jOiBnbC5BTFdBWVMsIG1hc2s6IDB9LCBpZCwgMHhGRiwgZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuUkVQTEFDRSksXG4gICAgICAgICAgICAgICAgQ29sb3JNb2RlLmRpc2FibGVkLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsIGNsaXBwaW5nTWFza1VuaWZvcm1WYWx1ZXModGlsZUlELnByb2pNYXRyaXgpLFxuICAgICAgICAgICAgICAgICckY2xpcHBpbmcnLCBwYWludGVyLnRpbGVFeHRlbnRCdWZmZXIsXG4gICAgICAgICAgICAgICAgcGFpbnRlci5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlciwgcGFpbnRlci50aWxlRXh0ZW50U2VnbWVudHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FzdHMgYSByYXkgZnJvbSBhIHBvaW50IG9uIHNjcmVlbiBhbmQgcmV0dXJucyB0aGUgaW50ZXJzZWN0aW9uIHBvaW50IHdpdGggdGhlIHRlcnJhaW4uXG4gICAgLy8gVGhlIHJldHVybmVkIHBvaW50IGNvbnRhaW5zIHRoZSBtZXJjYXRvciBjb29yZGluYXRlcyBpbiBpdHMgZmlyc3QgMyBjb21wb25lbnRzLCBhbmQgZWxldmF0aW9uXG4gICAgLy8gaW4gbWV0ZXIgaW4gaXRzIDR0aCBjb29yZGluYXRlLlxuICAgIHBvaW50Q29vcmRpbmF0ZShzY3JlZW5Qb2ludDogUG9pbnQpOiA/VmVjNCB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IHRoaXMucGFpbnRlci50cmFuc2Zvcm07XG4gICAgICAgIGlmIChzY3JlZW5Qb2ludC54IDwgMCB8fCBzY3JlZW5Qb2ludC54ID4gdHJhbnNmb3JtLndpZHRoIHx8XG4gICAgICAgICAgICBzY3JlZW5Qb2ludC55IDwgMCB8fCBzY3JlZW5Qb2ludC55ID4gdHJhbnNmb3JtLmhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmYXIgPSBbc2NyZWVuUG9pbnQueCwgc2NyZWVuUG9pbnQueSwgMSwgMV07XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChmYXIsIGZhciwgdHJhbnNmb3JtLnBpeGVsTWF0cml4SW52ZXJzZSk7XG4gICAgICAgIHZlYzQuc2NhbGUoZmFyLCBmYXIsIDEuMCAvIGZhclszXSk7XG4gICAgICAgIC8vIHggJiB5IGluIHBpeGVsIGNvb3JkaW5hdGVzLCB6IGlzIGFsdGl0dWRlIGluIG1ldGVyc1xuICAgICAgICBmYXJbMF0gLz0gdHJhbnNmb3JtLndvcmxkU2l6ZTtcbiAgICAgICAgZmFyWzFdIC89IHRyYW5zZm9ybS53b3JsZFNpemU7XG4gICAgICAgIGNvbnN0IGNhbWVyYSA9IHRyYW5zZm9ybS5fY2FtZXJhLnBvc2l0aW9uO1xuICAgICAgICBjb25zdCBtZXJjYXRvclpTY2FsZSA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCB0cmFuc2Zvcm0uY2VudGVyLmxhdCk7XG4gICAgICAgIGNvbnN0IHAgPSBbY2FtZXJhWzBdLCBjYW1lcmFbMV0sIGNhbWVyYVsyXSAvIG1lcmNhdG9yWlNjYWxlLCAwLjBdO1xuICAgICAgICBjb25zdCBkaXIgPSB2ZWMzLnN1YnRyYWN0KFtdLCBmYXIuc2xpY2UoMCwgMyksIHApO1xuICAgICAgICB2ZWMzLm5vcm1hbGl6ZShkaXIsIGRpcik7XG5cbiAgICAgICAgY29uc3QgZXhhZ2dlcmF0aW9uID0gdGhpcy5fZXhhZ2dlcmF0aW9uO1xuICAgICAgICBjb25zdCBkaXN0YW5jZUFsb25nUmF5ID0gdGhpcy5yYXljYXN0KHAsIGRpciwgZXhhZ2dlcmF0aW9uKTtcblxuICAgICAgICBpZiAoZGlzdGFuY2VBbG9uZ1JheSA9PT0gbnVsbCB8fCAhZGlzdGFuY2VBbG9uZ1JheSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQocCwgcCwgZGlyLCBkaXN0YW5jZUFsb25nUmF5KTtcbiAgICAgICAgcFszXSA9IHBbMl07XG4gICAgICAgIHBbMl0gKj0gbWVyY2F0b3JaU2NhbGU7XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cblxuICAgIGRyYXdEZXB0aCgpIHtcbiAgICAgICAgY29uc3QgcGFpbnRlciA9IHRoaXMucGFpbnRlcjtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICAgICAgY29uc3QgcHNjID0gdGhpcy5wcm94eVNvdXJjZUNhY2hlO1xuXG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKHBhaW50ZXIud2lkdGgpLCBoZWlnaHQgPSBNYXRoLmNlaWwocGFpbnRlci5oZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5fZGVwdGhGQk8gJiYgKHRoaXMuX2RlcHRoRkJPLndpZHRoICE9PSB3aWR0aCB8fCB0aGlzLl9kZXB0aEZCTy5oZWlnaHQgIT09IGhlaWdodCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlcHRoRkJPLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX2RlcHRoRkJPID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fZGVwdGhUZXh0dXJlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZGVwdGhGQk8pIHtcbiAgICAgICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgICAgIGNvbnN0IGZibyA9IGNvbnRleHQuY3JlYXRlRnJhbWVidWZmZXIod2lkdGgsIGhlaWdodCwgdHJ1ZSk7XG4gICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIGNvbnN0IHRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCB7d2lkdGgsIGhlaWdodCwgZGF0YTogbnVsbH0sIGdsLlJHQkEpO1xuICAgICAgICAgICAgdGV4dHVyZS5iaW5kKGdsLk5FQVJFU1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZmJvLmNvbG9yQXR0YWNobWVudC5zZXQodGV4dHVyZS50ZXh0dXJlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlUmVuZGVyYnVmZmVyKGNvbnRleHQuZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgZmJvLmRlcHRoQXR0YWNobWVudC5zZXQocmVuZGVyYnVmZmVyKTtcbiAgICAgICAgICAgIHRoaXMuX2RlcHRoRkJPID0gZmJvO1xuICAgICAgICAgICAgdGhpcy5fZGVwdGhUZXh0dXJlID0gdGV4dHVyZTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQodGhpcy5fZGVwdGhGQk8uZnJhbWVidWZmZXIpO1xuICAgICAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgd2lkdGgsIGhlaWdodF0pO1xuXG4gICAgICAgIGRyYXdUZXJyYWluRGVwdGgocGFpbnRlciwgdGhpcywgcHNjLCB0aGlzLnByb3h5Q29vcmRzKTtcbiAgICB9XG5cbiAgICBfc2V0dXBQcm94aWVkQ29vcmRzRm9yT3J0aG8oc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBzb3VyY2VDb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+LCBwcmV2aW91c1Byb3h5VG9Tb3VyY2U6IHtbbnVtYmVyXToge1tzdHJpbmddOiBBcnJheTxQcm94aWVkVGlsZUlEPn19KTogdm9pZCB7XG4gICAgICAgIGlmIChzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEltYWdlU291cmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0dXBQcm94aWVkQ29vcmRzRm9ySW1hZ2VTb3VyY2Uoc291cmNlQ2FjaGUsIHNvdXJjZUNvb3JkcywgcHJldmlvdXNQcm94eVRvU291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9maW5kQ292ZXJpbmdUaWxlQ2FjaGVbc291cmNlQ2FjaGUuaWRdID0gdGhpcy5fZmluZENvdmVyaW5nVGlsZUNhY2hlW3NvdXJjZUNhY2hlLmlkXSB8fCB7fTtcbiAgICAgICAgY29uc3QgY29vcmRzID0gdGhpcy5wcm94aWVkQ29vcmRzW3NvdXJjZUNhY2hlLmlkXSA9IFtdO1xuICAgICAgICBjb25zdCBwcm94eXMgPSB0aGlzLnByb3h5Q29vcmRzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3h5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcHJveHlUaWxlSUQgPSBwcm94eXNbaV07XG4gICAgICAgICAgICBjb25zdCBwcm94aWVkID0gdGhpcy5fZmluZFRpbGVDb3ZlcmluZ1RpbGVJRChwcm94eVRpbGVJRCwgc291cmNlQ2FjaGUpO1xuICAgICAgICAgICAgaWYgKHByb3hpZWQpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQocHJveGllZC5oYXNEYXRhKCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5fY3JlYXRlUHJveGllZElkKHByb3h5VGlsZUlELCBwcm94aWVkLCBwcmV2aW91c1Byb3h5VG9Tb3VyY2VbcHJveHlUaWxlSUQua2V5XSAmJiBwcmV2aW91c1Byb3h5VG9Tb3VyY2VbcHJveHlUaWxlSUQua2V5XVtzb3VyY2VDYWNoZS5pZF0pO1xuICAgICAgICAgICAgICAgIGNvb3Jkcy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3h5VG9Tb3VyY2VbcHJveHlUaWxlSUQua2V5XVtzb3VyY2VDYWNoZS5pZF0gPSBbaWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBoYXNPdmVybGFwID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlQ29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShzb3VyY2VDb29yZHNbaV0pO1xuICAgICAgICAgICAgaWYgKCF0aWxlIHx8ICF0aWxlLmhhc0RhdGEoKSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBwcm94eSA9IHRoaXMuX2ZpbmRUaWxlQ292ZXJpbmdUaWxlSUQodGlsZS50aWxlSUQsIHRoaXMucHJveHlTb3VyY2VDYWNoZSk7XG4gICAgICAgICAgICAvLyBEb24ndCBhZGQgdGhlIHRpbGUgaWYgYWxyZWFkeSBhZGRlZCBpbiBsb29wIGFib3ZlLlxuICAgICAgICAgICAgaWYgKHByb3h5ICYmIHByb3h5LnRpbGVJRC5jYW5vbmljYWwueiAhPT0gdGlsZS50aWxlSUQuY2Fub25pY2FsLnopIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnJheSA9IHRoaXMucHJveHlUb1NvdXJjZVtwcm94eS50aWxlSUQua2V5XVtzb3VyY2VDYWNoZS5pZF07XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLl9jcmVhdGVQcm94aWVkSWQocHJveHkudGlsZUlELCB0aWxlLCBwcmV2aW91c1Byb3h5VG9Tb3VyY2VbcHJveHkudGlsZUlELmtleV0gJiYgcHJldmlvdXNQcm94eVRvU291cmNlW3Byb3h5LnRpbGVJRC5rZXldW3NvdXJjZUNhY2hlLmlkXSk7XG4gICAgICAgICAgICAgICAgaWYgKCFhcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3h5VG9Tb3VyY2VbcHJveHkudGlsZUlELmtleV1bc291cmNlQ2FjaGUuaWRdID0gW2lkXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbGFzdCBlbGVtZW50IGlzIHBhcmVudCBhZGRlZCBpbiBsb29wIGFib3ZlLiBUaGlzIHdheSB3ZSBnZXRcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBsaXN0IGluIFogZGVzY2VuZGluZyBvcmRlciB3aGljaCBpcyBuZWVkZWQgZm9yIHN0ZW5jaWwgbWFza2luZy5cbiAgICAgICAgICAgICAgICAgICAgYXJyYXkuc3BsaWNlKGFycmF5Lmxlbmd0aCAtIDEsIDAsIGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29vcmRzLnB1c2goaWQpO1xuICAgICAgICAgICAgICAgIGhhc092ZXJsYXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvdXJjZVRpbGVzT3ZlcmxhcFtzb3VyY2VDYWNoZS5pZF0gPSBoYXNPdmVybGFwO1xuICAgIH1cblxuICAgIF9zZXR1cFByb3hpZWRDb29yZHNGb3JJbWFnZVNvdXJjZShzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIHNvdXJjZUNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4sIHByZXZpb3VzUHJveHlUb1NvdXJjZToge1tudW1iZXJdOiB7W3N0cmluZ106IEFycmF5PFByb3hpZWRUaWxlSUQ+fX0pIHtcbiAgICAgICAgaWYgKCFzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5sb2FkZWQoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMucHJveGllZENvb3Jkc1tzb3VyY2VDYWNoZS5pZF0gPSBbXTtcbiAgICAgICAgY29uc3QgcHJveHlzID0gdGhpcy5wcm94eUNvb3JkcztcbiAgICAgICAgY29uc3QgaW1hZ2VTb3VyY2U6IEltYWdlU291cmNlID0gKChzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTogYW55KTogSW1hZ2VTb3VyY2UpO1xuXG4gICAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBQb2ludChpbWFnZVNvdXJjZS50aWxlSUQueCwgaW1hZ2VTb3VyY2UudGlsZUlELnkpLl9kaXYoMSA8PCBpbWFnZVNvdXJjZS50aWxlSUQueik7XG4gICAgICAgIGNvbnN0IGFhYmIgPSBpbWFnZVNvdXJjZS5jb29yZGluYXRlcy5tYXAoTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQpLnJlZHVjZSgoYWNjLCBjb29yZCkgPT4ge1xuICAgICAgICAgICAgYWNjLm1pbi54ID0gTWF0aC5taW4oYWNjLm1pbi54LCBjb29yZC54IC0gYW5jaG9yLngpO1xuICAgICAgICAgICAgYWNjLm1pbi55ID0gTWF0aC5taW4oYWNjLm1pbi55LCBjb29yZC55IC0gYW5jaG9yLnkpO1xuICAgICAgICAgICAgYWNjLm1heC54ID0gTWF0aC5tYXgoYWNjLm1heC54LCBjb29yZC54IC0gYW5jaG9yLngpO1xuICAgICAgICAgICAgYWNjLm1heC55ID0gTWF0aC5tYXgoYWNjLm1heC55LCBjb29yZC55IC0gYW5jaG9yLnkpO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge21pbjogbmV3IFBvaW50KE51bWJlci5NQVhfVkFMVUUsIE51bWJlci5NQVhfVkFMVUUpLCBtYXg6IG5ldyBQb2ludCgtTnVtYmVyLk1BWF9WQUxVRSwgLU51bWJlci5NQVhfVkFMVUUpfSk7XG5cbiAgICAgICAgLy8gRmFzdCBjb25zZXJ2YXRpdmUgY2hlY2sgdXNpbmcgYWFiYjogY29udGVudCBvdXRzaWRlIHByb3h5IHRpbGUgZ2V0cyBjbGlwcGVkIG91dCBieSBvbiByZW5kZXIsIGFueXdheS5cbiAgICAgICAgY29uc3QgdGlsZU91dHNpZGVJbWFnZSA9ICh0aWxlSUQsIGltYWdlVGlsZUlEKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB4ID0gdGlsZUlELndyYXAgKyB0aWxlSUQuY2Fub25pY2FsLnggLyAoMSA8PCB0aWxlSUQuY2Fub25pY2FsLnopO1xuICAgICAgICAgICAgY29uc3QgeSA9IHRpbGVJRC5jYW5vbmljYWwueSAvICgxIDw8IHRpbGVJRC5jYW5vbmljYWwueik7XG4gICAgICAgICAgICBjb25zdCBkID0gRVhURU5UIC8gKDEgPDwgdGlsZUlELmNhbm9uaWNhbC56KTtcblxuICAgICAgICAgICAgY29uc3QgaXggPSBpbWFnZVRpbGVJRC53cmFwICsgaW1hZ2VUaWxlSUQuY2Fub25pY2FsLnggLyAoMSA8PCBpbWFnZVRpbGVJRC5jYW5vbmljYWwueik7XG4gICAgICAgICAgICBjb25zdCBpeSA9IGltYWdlVGlsZUlELmNhbm9uaWNhbC55IC8gKDEgPDwgaW1hZ2VUaWxlSUQuY2Fub25pY2FsLnopO1xuXG4gICAgICAgICAgICByZXR1cm4geCArIGQgPCBpeCArIGFhYmIubWluLnggfHwgeCA+IGl4ICsgYWFiYi5tYXgueCB8fCB5ICsgZCA8IGl5ICsgYWFiYi5taW4ueSB8fCB5ID4gaXkgKyBhYWJiLm1heC55O1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJveHlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwcm94eVRpbGVJRCA9IHByb3h5c1tpXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc291cmNlQ29vcmRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoc291cmNlQ29vcmRzW2pdKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRpbGUgfHwgIXRpbGUuaGFzRGF0YSgpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIC8vIFNldHVwIHByb3hpZWQgLT4gcHJveHkgbWFwcGluZyBvbmx5IGlmIGltYWdlIG9uIGdpdmVuIHRpbGUgd3JhcCBpbnRlcnNlY3RzIHRoZSBwcm94eSB0aWxlLlxuICAgICAgICAgICAgICAgIGlmICh0aWxlT3V0c2lkZUltYWdlKHByb3h5VGlsZUlELCB0aWxlLnRpbGVJRCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLl9jcmVhdGVQcm94aWVkSWQocHJveHlUaWxlSUQsIHRpbGUsIHByZXZpb3VzUHJveHlUb1NvdXJjZVtwcm94eVRpbGVJRC5rZXldICYmIHByZXZpb3VzUHJveHlUb1NvdXJjZVtwcm94eVRpbGVJRC5rZXldW3NvdXJjZUNhY2hlLmlkXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLnByb3h5VG9Tb3VyY2VbcHJveHlUaWxlSUQua2V5XVtzb3VyY2VDYWNoZS5pZF07XG4gICAgICAgICAgICAgICAgaWYgKCFhcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3h5VG9Tb3VyY2VbcHJveHlUaWxlSUQua2V5XVtzb3VyY2VDYWNoZS5pZF0gPSBbaWRdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2goaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb29yZHMucHVzaChpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZWN5Y2xlIGlzIHByZXZpb3VzIHBhc3MgY29udGVudCB0aGF0IGxpa2VseSBjb250YWlucyBwcm94aWVkIElEIGNvbWJpbmluZyBwcm94eSBhbmQgc291cmNlIHRpbGUuXG4gICAgX2NyZWF0ZVByb3hpZWRJZChwcm94eVRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCwgdGlsZTogVGlsZSwgcmVjeWNsZTogQXJyYXk8UHJveGllZFRpbGVJRD4pOiBQcm94aWVkVGlsZUlEIHtcbiAgICAgICAgbGV0IG1hdHJpeCA9IHRoaXMub3J0aG9NYXRyaXg7XG4gICAgICAgIGlmIChyZWN5Y2xlKSB7XG4gICAgICAgICAgICBjb25zdCByZWN5Y2xlZCA9IHJlY3ljbGUuZmluZChwcm94aWVkID0+IChwcm94aWVkLmtleSA9PT0gdGlsZS50aWxlSUQua2V5KSk7XG4gICAgICAgICAgICBpZiAocmVjeWNsZWQpIHJldHVybiByZWN5Y2xlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZS50aWxlSUQua2V5ICE9PSBwcm94eVRpbGVJRC5rZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gcHJveHlUaWxlSUQuY2Fub25pY2FsLnogLSB0aWxlLnRpbGVJRC5jYW5vbmljYWwuejtcbiAgICAgICAgICAgIG1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgICAgICBsZXQgc2l6ZSwgeE9mZnNldCwgeU9mZnNldDtcbiAgICAgICAgICAgIGNvbnN0IHdyYXAgPSAodGlsZS50aWxlSUQud3JhcCAtIHByb3h5VGlsZUlELndyYXApIDw8IHByb3h5VGlsZUlELm92ZXJzY2FsZWRaO1xuICAgICAgICAgICAgaWYgKHNjYWxlID4gMCkge1xuICAgICAgICAgICAgICAgIHNpemUgPSBFWFRFTlQgPj4gc2NhbGU7XG4gICAgICAgICAgICAgICAgeE9mZnNldCA9IHNpemUgKiAoKHRpbGUudGlsZUlELmNhbm9uaWNhbC54IDw8IHNjYWxlKSAtIHByb3h5VGlsZUlELmNhbm9uaWNhbC54ICsgd3JhcCk7XG4gICAgICAgICAgICAgICAgeU9mZnNldCA9IHNpemUgKiAoKHRpbGUudGlsZUlELmNhbm9uaWNhbC55IDw8IHNjYWxlKSAtIHByb3h5VGlsZUlELmNhbm9uaWNhbC55KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2l6ZSA9IEVYVEVOVCA8PCAtc2NhbGU7XG4gICAgICAgICAgICAgICAgeE9mZnNldCA9IEVYVEVOVCAqICh0aWxlLnRpbGVJRC5jYW5vbmljYWwueCAtICgocHJveHlUaWxlSUQuY2Fub25pY2FsLnggKyB3cmFwKSA8PCAtc2NhbGUpKTtcbiAgICAgICAgICAgICAgICB5T2Zmc2V0ID0gRVhURU5UICogKHRpbGUudGlsZUlELmNhbm9uaWNhbC55IC0gKHByb3h5VGlsZUlELmNhbm9uaWNhbC55IDw8IC1zY2FsZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWF0NC5vcnRobyhtYXRyaXgsIDAsIHNpemUsIDAsIHNpemUsIDAsIDEpO1xuICAgICAgICAgICAgbWF0NC50cmFuc2xhdGUobWF0cml4LCBtYXRyaXgsIFt4T2Zmc2V0LCB5T2Zmc2V0LCAwXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm94aWVkVGlsZUlEKHRpbGUudGlsZUlELCBwcm94eVRpbGVJRC5rZXksIG1hdHJpeCk7XG4gICAgfVxuXG4gICAgLy8gQSB2YXJpYW50IG9mIFNvdXJjZUNhY2hlLmZpbmRMb2FkZWRQYXJlbnQgdGhhdCBjb25zaWRlcnMgb25seSB2aXNpYmxlXG4gICAgLy8gdGlsZXMgKGFuZCBkb2Vzbid0IGNoZWNrIFNvdXJjZUNhY2hlLl9jYWNoZSkuIEFub3RoZXIgZGlmZmVyZW5jZSBpcyBpblxuICAgIC8vIGNhY2hpbmcgXCJub3QgZm91bmRcIiByZXN1bHRzIGFsb25nIHRoZSBsb29rdXAsIHRvIGxlYXZlIHRoZSBsb29rdXAgZWFybHkuXG4gICAgLy8gTm90IGZvdW5kIGlzIGNhY2hlZCBieSB0aGlzLl9maW5kQ292ZXJpbmdUaWxlQ2FjaGVba2V5XSA9IG51bGw7XG4gICAgX2ZpbmRUaWxlQ292ZXJpbmdUaWxlSUQodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUpOiA/VGlsZSB7XG4gICAgICAgIGxldCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZSh0aWxlSUQpO1xuICAgICAgICBpZiAodGlsZSAmJiB0aWxlLmhhc0RhdGEoKSkgcmV0dXJuIHRpbGU7XG5cbiAgICAgICAgY29uc3QgbG9va3VwID0gdGhpcy5fZmluZENvdmVyaW5nVGlsZUNhY2hlW3NvdXJjZUNhY2hlLmlkXTtcbiAgICAgICAgY29uc3Qga2V5ID0gbG9va3VwW3RpbGVJRC5rZXldO1xuICAgICAgICB0aWxlID0ga2V5ID8gc291cmNlQ2FjaGUuZ2V0VGlsZUJ5SUQoa2V5KSA6IG51bGw7XG4gICAgICAgIGlmICgodGlsZSAmJiB0aWxlLmhhc0RhdGEoKSkgfHwga2V5ID09PSBudWxsKSByZXR1cm4gdGlsZTtcblxuICAgICAgICBhc3NlcnQoIWtleSB8fCB0aWxlKTtcblxuICAgICAgICBsZXQgc291cmNlVGlsZUlEID0gdGlsZSA/IHRpbGUudGlsZUlEIDogdGlsZUlEO1xuICAgICAgICBsZXQgeiA9IHNvdXJjZVRpbGVJRC5vdmVyc2NhbGVkWjtcbiAgICAgICAgY29uc3QgbWluem9vbSA9IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLm1pbnpvb207XG4gICAgICAgIGNvbnN0IHBhdGggPSBbXTtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heHpvb20gPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5tYXh6b29tO1xuICAgICAgICAgICAgaWYgKHRpbGVJRC5jYW5vbmljYWwueiA+PSBtYXh6b29tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZG93bnNjYWxlID0gdGlsZUlELmNhbm9uaWNhbC56IC0gbWF4em9vbTtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUuZ2V0U291cmNlKCkucmVwYXJzZU92ZXJzY2FsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgeiA9IE1hdGgubWF4KHRpbGVJRC5jYW5vbmljYWwueiArIDIsIHNvdXJjZUNhY2hlLnRyYW5zZm9ybS50aWxlWm9vbSk7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVRpbGVJRCA9IG5ldyBPdmVyc2NhbGVkVGlsZUlEKHosIHRpbGVJRC53cmFwLCBtYXh6b29tLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZUlELmNhbm9uaWNhbC54ID4+IGRvd25zY2FsZSwgdGlsZUlELmNhbm9uaWNhbC55ID4+IGRvd25zY2FsZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb3duc2NhbGUgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgeiA9IG1heHpvb207XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVRpbGVJRCA9IG5ldyBPdmVyc2NhbGVkVGlsZUlEKHosIHRpbGVJRC53cmFwLCBtYXh6b29tLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZUlELmNhbm9uaWNhbC54ID4+IGRvd25zY2FsZSwgdGlsZUlELmNhbm9uaWNhbC55ID4+IGRvd25zY2FsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNvdXJjZVRpbGVJRC5rZXkgIT09IHRpbGVJRC5rZXkpIHtcbiAgICAgICAgICAgICAgICBwYXRoLnB1c2goc291cmNlVGlsZUlELmtleSk7XG4gICAgICAgICAgICAgICAgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoc291cmNlVGlsZUlEKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhdGhUb0xvb2t1cCA9IChrZXkpID0+IHtcbiAgICAgICAgICAgIHBhdGguZm9yRWFjaChpZCA9PiB7IGxvb2t1cFtpZF0gPSBrZXk7IH0pO1xuICAgICAgICAgICAgcGF0aC5sZW5ndGggPSAwO1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoeiA9IHogLSAxOyB6ID49IG1pbnpvb20gJiYgISh0aWxlICYmIHRpbGUuaGFzRGF0YSgpKTsgei0tKSB7XG4gICAgICAgICAgICBpZiAodGlsZSkge1xuICAgICAgICAgICAgICAgIHBhdGhUb0xvb2t1cCh0aWxlLnRpbGVJRC5rZXkpOyAvLyBTdG9yZSBsb29rdXAgdG8gcGFyZW50cyBub3QgbG9hZGVkICh5ZXQpLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaWQgPSBzb3VyY2VUaWxlSUQuY2FsY3VsYXRlU2NhbGVkS2V5KHopO1xuICAgICAgICAgICAgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGVCeUlEKGlkKTtcbiAgICAgICAgICAgIGlmICh0aWxlICYmIHRpbGUuaGFzRGF0YSgpKSBicmVhaztcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGxvb2t1cFtpZF07XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlJ3Mgbm8gdGlsZSBsb2FkZWQgYW5kIG5vIHBvaW50IHNlYXJjaGluZyBmdXJ0aGVyLlxuICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlQnlJRChrZXkpO1xuICAgICAgICAgICAgICAgIGFzc2VydCh0aWxlKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhdGgucHVzaChpZCk7XG4gICAgICAgIH1cblxuICAgICAgICBwYXRoVG9Mb29rdXAodGlsZSA/IHRpbGUudGlsZUlELmtleSA6IG51bGwpO1xuICAgICAgICByZXR1cm4gdGlsZSAmJiB0aWxlLmhhc0RhdGEoKSA/IHRpbGUgOiBudWxsO1xuICAgIH1cblxuICAgIGZpbmRERU1UaWxlRm9yKHRpbGVJRDogT3ZlcnNjYWxlZFRpbGVJRCk6ID9UaWxlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5hYmxlZCA/IHRoaXMuX2ZpbmRUaWxlQ292ZXJpbmdUaWxlSUQodGlsZUlELCB0aGlzLnNvdXJjZUNhY2hlKSA6IG51bGw7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBCb29ra2VlcGluZyBpZiBzb21ldGhpbmcgZ2V0cyByZW5kZXJlZCB0byB0aGUgdGlsZS5cbiAgICAgKi9cbiAgICBwcmVwYXJlRHJhd1RpbGUoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZWRUb1RpbGUgPSB0cnVlO1xuICAgIH1cblxuICAgIF9jbGVhclJlbmRlckNhY2hlRm9yVGlsZShzb3VyY2U6IHN0cmluZywgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQpIHtcbiAgICAgICAgbGV0IHNvdXJjZVRpbGVzID0gdGhpcy5fdGlsZXNEaXJ0eVtzb3VyY2VdO1xuICAgICAgICBpZiAoIXNvdXJjZVRpbGVzKSBzb3VyY2VUaWxlcyA9IHRoaXMuX3RpbGVzRGlydHlbc291cmNlXSA9IHt9O1xuICAgICAgICBzb3VyY2VUaWxlc1tjb29yZC5rZXldID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIExhemlseSBpbnN0YW50aWF0ZSB0aGUgd2lyZWZyYW1lIGluZGV4IGJ1ZmZlciBhbmQgc2VnbWVudCB2ZWN0b3Igc28gdGhhdCB3ZSBkb24ndFxuICAgICAqIGFsbG9jYXRlIHRoZSBnZW9tZXRyeSBmb3IgcmVuZGVyaW5nIGEgZGVidWcgd2lyZWZyYW1lIHVudGlsIGl0J3MgbmVlZGVkLlxuICAgICAqL1xuICAgIGdldFdpcmVmYW1lQnVmZmVyKCk6IFtJbmRleEJ1ZmZlciwgU2VnbWVudFZlY3Rvcl0ge1xuICAgICAgICBpZiAoIXRoaXMud2lyZWZyYW1lU2VnbWVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpcmVmcmFtZUdyaWRJbmRpY2VzID0gY3JlYXRlV2lyZWZyYW1lR3JpZChHUklEX0RJTSArIDEpO1xuICAgICAgICAgICAgdGhpcy53aXJlZnJhbWVJbmRleEJ1ZmZlciA9IHRoaXMucGFpbnRlci5jb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHdpcmVmcmFtZUdyaWRJbmRpY2VzKTtcbiAgICAgICAgICAgIHRoaXMud2lyZWZyYW1lU2VnbWVudHMgPSBTZWdtZW50VmVjdG9yLnNpbXBsZVNlZ21lbnQoMCwgMCwgdGhpcy5ncmlkQnVmZmVyLmxlbmd0aCwgd2lyZWZyYW1lR3JpZEluZGljZXMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMud2lyZWZyYW1lSW5kZXhCdWZmZXIsIHRoaXMud2lyZWZyYW1lU2VnbWVudHNdO1xuICAgIH1cblxufVxuXG5mdW5jdGlvbiBzb3J0QnlEaXN0YW5jZVRvQ2FtZXJhKHRpbGVJRHMsIHBhaW50ZXIpIHtcbiAgICBjb25zdCBjYW1lcmFDb29yZGluYXRlID0gcGFpbnRlci50cmFuc2Zvcm0ucG9pbnRDb29yZGluYXRlKHBhaW50ZXIudHJhbnNmb3JtLmdldENhbWVyYVBvaW50KCkpO1xuICAgIGNvbnN0IGNhbWVyYVBvaW50ID0gbmV3IFBvaW50KGNhbWVyYUNvb3JkaW5hdGUueCwgY2FtZXJhQ29vcmRpbmF0ZS55KTtcbiAgICB0aWxlSURzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGIub3ZlcnNjYWxlZFogLSBhLm92ZXJzY2FsZWRaKSByZXR1cm4gYi5vdmVyc2NhbGVkWiAtIGEub3ZlcnNjYWxlZFo7XG4gICAgICAgIGNvbnN0IGFQb2ludCA9IG5ldyBQb2ludChhLmNhbm9uaWNhbC54ICsgKDEgPDwgYS5jYW5vbmljYWwueikgKiBhLndyYXAsIGEuY2Fub25pY2FsLnkpO1xuICAgICAgICBjb25zdCBiUG9pbnQgPSBuZXcgUG9pbnQoYi5jYW5vbmljYWwueCArICgxIDw8IGIuY2Fub25pY2FsLnopICogYi53cmFwLCBiLmNhbm9uaWNhbC55KTtcbiAgICAgICAgY29uc3QgY2FtZXJhU2NhbGVkID0gY2FtZXJhUG9pbnQubXVsdCgxIDw8IGEuY2Fub25pY2FsLnopO1xuICAgICAgICBjYW1lcmFTY2FsZWQueCAtPSAwLjU7XG4gICAgICAgIGNhbWVyYVNjYWxlZC55IC09IDAuNTtcbiAgICAgICAgcmV0dXJuIGNhbWVyYVNjYWxlZC5kaXN0U3FyKGFQb2ludCkgLSBjYW1lcmFTY2FsZWQuZGlzdFNxcihiUG9pbnQpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdW5pZm9ybSBncmlkIG9mIHRyaWFuZ2xlcywgY292ZXJpbmcgRVhURU5UIHggRVhURU5UIHNxdWFyZSwgd2l0aCB0d29cbiAqIGFkanVzdGVudCB0cmFpZ2xlcyBmb3JtaW5nIGEgcXVhZCwgc28gdGhhdCB0aGVyZSBhcmUgfGNvdW50fCBjb2x1bW5zIGFuZCByb3dzXG4gKiBvZiB0aGVzZSBxdWFkcyBpbiBFWFRFTlQgeCBFWFRFTlQgc3F1YXJlLlxuICogZS5nLiBmb3IgY291bnQgb2YgMjpcbiAqICAtLS0tLS0tLS0tLS0tXG4gKiAgfCAgICAvfCAgICAvfFxuICogIHwgIC8gIHwgIC8gIHxcbiAqICB8LyAgICB8LyAgICB8XG4gKiAgLS0tLS0tLS0tLS0tLVxuICogIHwgICAgL3wgICAgL3xcbiAqICB8ICAvICB8ICAvICB8XG4gKiAgfC8gICAgfC8gICAgfFxuICogIC0tLS0tLS0tLS0tLS1cbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCBDb3VudCBvZiByb3dzIGFuZCBjb2x1bW5zXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVHcmlkKGNvdW50OiBudW1iZXIpOiBbUmFzdGVyQm91bmRzQXJyYXksIFRyaWFuZ2xlSW5kZXhBcnJheSwgbnVtYmVyXSB7XG4gICAgY29uc3QgYm91bmRzQXJyYXkgPSBuZXcgUmFzdGVyQm91bmRzQXJyYXkoKTtcbiAgICAvLyBBcm91bmQgdGhlIGdyaWQsIGFkZCBvbmUgbW9yZSByb3cvY29sdW1uIHBhZGRpbmcgZm9yIFwic2tpcnRcIi5cbiAgICBjb25zdCBpbmRleEFycmF5ID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgIGNvbnN0IHNpemUgPSBjb3VudCArIDI7XG4gICAgYm91bmRzQXJyYXkucmVzZXJ2ZShzaXplICogc2l6ZSk7XG4gICAgaW5kZXhBcnJheS5yZXNlcnZlKChzaXplIC0gMSkgKiAoc2l6ZSAtIDEpICogMik7XG4gICAgY29uc3Qgc3RlcCA9IEVYVEVOVCAvIChjb3VudCAtIDEpO1xuICAgIGNvbnN0IGdyaWRCb3VuZCA9IEVYVEVOVCArIHN0ZXAgLyAyO1xuICAgIGNvbnN0IGJvdW5kID0gZ3JpZEJvdW5kICsgc3RlcDtcblxuICAgIC8vIFNraXJ0IG9mZnNldCBvZiAweDVGRkYgaXMgY2hvc2VuIHJhbmRvbWx5IHRvIGVuY29kZSBib29sZWFuIHZhbHVlIChza2lydFxuICAgIC8vIG9uL29mZikgd2l0aCB4IHBvc2l0aW9uIChtYXggdmFsdWUgRVhURU5UID0gNDA5NikgdG8gMTYtYml0IHNpZ25lZCBpbnRlZ2VyLlxuICAgIGNvbnN0IHNraXJ0T2Zmc2V0ID0gMjQ1NzU7IC8vIDB4NUZGRlxuICAgIGZvciAobGV0IHkgPSAtc3RlcDsgeSA8IGJvdW5kOyB5ICs9IHN0ZXApIHtcbiAgICAgICAgZm9yIChsZXQgeCA9IC1zdGVwOyB4IDwgYm91bmQ7IHggKz0gc3RlcCkge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHggPCAwIHx8IHggPiBncmlkQm91bmQgfHwgeSA8IDAgfHwgeSA+IGdyaWRCb3VuZCkgPyBza2lydE9mZnNldCA6IDA7XG4gICAgICAgICAgICBjb25zdCB4aSA9IGNsYW1wKE1hdGgucm91bmQoeCksIDAsIEVYVEVOVCk7XG4gICAgICAgICAgICBjb25zdCB5aSA9IGNsYW1wKE1hdGgucm91bmQoeSksIDAsIEVYVEVOVCk7XG4gICAgICAgICAgICBib3VuZHNBcnJheS5lbXBsYWNlQmFjayh4aSArIG9mZnNldCwgeWksIHhpLCB5aSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3IgY2FzZXMgd2hlbiB0aGVyZSdzIG5vIG5lZWQgdG8gcmVuZGVyIFwic2tpcnRcIiwgdGhlIFwiaW5uZXJcIiBncmlkIGluZGljZXNcbiAgICAvLyBhcmUgZm9sbG93ZWQgYnkgc2tpcnQgaW5kaWNlcy5cbiAgICBjb25zdCBza2lydEluZGljZXNPZmZzZXQgPSAoc2l6ZSAtIDMpICogKHNpemUgLSAzKSAqIDI7XG4gICAgY29uc3QgcXVhZCA9IChpLCBqKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaiAqIHNpemUgKyBpO1xuICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMSwgaW5kZXgsIGluZGV4ICsgc2l6ZSk7XG4gICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyBzaXplLCBpbmRleCArIHNpemUgKyAxLCBpbmRleCArIDEpO1xuICAgIH07XG4gICAgZm9yIChsZXQgaiA9IDE7IGogPCBzaXplIC0gMjsgaisrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc2l6ZSAtIDI7IGkrKykge1xuICAgICAgICAgICAgcXVhZChpLCBqKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBQYWRkaW5nIChza2lydCkgaW5kaWNlczpcbiAgICBbMCwgc2l6ZSAtIDJdLmZvckVhY2goaiA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykge1xuICAgICAgICAgICAgcXVhZChpLCBqKTtcbiAgICAgICAgICAgIHF1YWQoaiwgaSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gW2JvdW5kc0FycmF5LCBpbmRleEFycmF5LCBza2lydEluZGljZXNPZmZzZXRdO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBncmlkIG9mIGluZGljZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZ3JpZCBjb25zdHJ1Y3RlZCBieSBjcmVhdGVHcmlkXG4gKiBpbiBvcmRlciB0byByZW5kZXIgdGhhdCBncmlkIGFzIGEgd2lyZWZyYW1lIHJhdGhlciB0aGFuIGEgc29saWQgIG1lc2guIEl0IGRvZXNcbiAqIG5vdCBjcmVhdGUgYSBza2lydCBhbmQgc28gb25seSBnb2VzIGZyb20gMSB0byBjb3VudCArIDEsIGUuZy4gZm9yIGNvdW50IG9mIDI6XG4gKiAgLS0tLS0tLS0tLS0tLVxuICogIHwgICAgL3wgICAgL3xcbiAqICB8ICAvICB8ICAvICB8XG4gKiAgfC8gICAgfC8gICAgfFxuICogIC0tLS0tLS0tLS0tLS1cbiAqICB8ICAgIC98ICAgIC98XG4gKiAgfCAgLyAgfCAgLyAgfFxuICogIHwvICAgIHwvICAgIHxcbiAqICAtLS0tLS0tLS0tLS0tXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnQgQ291bnQgb2Ygcm93cyBhbmQgY29sdW1uc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlV2lyZWZyYW1lR3JpZChjb3VudDogbnVtYmVyKTogTGluZUluZGV4QXJyYXkge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY29uc3QgaW5kZXhBcnJheSA9IG5ldyBMaW5lSW5kZXhBcnJheSgpO1xuICAgIGNvbnN0IHNpemUgPSBjb3VudCArIDI7XG4gICAgLy8gRHJhdyB0d28gZWRnZXMgb2YgYSBxdWFkIGFuZCBpdHMgZGlhZ29uYWwuIFRoZSB2ZXJ5IGxhc3Qgcm93IGFuZCBjb2x1bW4gaGF2ZVxuICAgIC8vIGFuIGFkZGl0aW9uYWwgbGluZSB0byBjbG9zZSBvZmYgdGhlIGdyaWQuXG4gICAgZm9yIChsZXQgaiA9IDE7IGogPCBjb3VudDsgaisrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgaW5kZXggPSBqICogc2l6ZSArIGk7XG4gICAgICAgICAgICBpbmRleEFycmF5LmVtcGxhY2VCYWNrKGluZGV4LCBpbmRleCArIDEpO1xuICAgICAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyBzaXplKTtcbiAgICAgICAgICAgIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyAxLCBpbmRleCArIHNpemUpO1xuXG4gICAgICAgICAgICAvLyBQbGFjZSBhbiBleHRyYSBsaW5lIGF0IHRoZSBlbmQgb2YgZWFjaCByb3dcbiAgICAgICAgICAgIGlmIChqID09PSBjb3VudCAtIDEpIGluZGV4QXJyYXkuZW1wbGFjZUJhY2soaW5kZXggKyBzaXplLCBpbmRleCArIHNpemUgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQbGFjZSBhbiBleHRyYSBsaW5lIGF0IHRoZSBlbmQgb2YgZWFjaCBjb2xcbiAgICAgICAgaW5kZXhBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDEsIGluZGV4ICsgMSArIHNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXhBcnJheTtcbn1cblxuZXhwb3J0IHR5cGUgVGVycmFpblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfZGVtJzogVW5pZm9ybTFpLFxuICAgICd1X2RlbV9wcmV2JzogVW5pZm9ybTFpLFxuICAgICd1X2RlbV91bnBhY2snOiBVbmlmb3JtNGYsXG4gICAgJ3VfZGVtX3RsJzogVW5pZm9ybTJmLFxuICAgICd1X2RlbV9zY2FsZSc6IFVuaWZvcm0xZixcbiAgICAndV9kZW1fdGxfcHJldic6IFVuaWZvcm0yZixcbiAgICAndV9kZW1fc2NhbGVfcHJldic6IFVuaWZvcm0xZixcbiAgICAndV9kZW1fc2l6ZSc6IFVuaWZvcm0xZixcbiAgICAndV9kZW1fbGVycCc6IFVuaWZvcm0xZixcbiAgICBcInVfZXhhZ2dlcmF0aW9uXCI6IFVuaWZvcm0xZixcbiAgICAndV9kZXB0aCc6IFVuaWZvcm0xaSxcbiAgICAndV9kZXB0aF9zaXplX2ludic6IFVuaWZvcm0yZixcbiAgICAndV9tZXRlcl90b19kZW0nPzogVW5pZm9ybTFmLFxuICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeF9pbnYnPzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3RpbGVfdGxfdXAnOiBVbmlmb3JtM2YsXG4gICAgJ3VfdGlsZV90cl91cCc6IFVuaWZvcm0zZixcbiAgICAndV90aWxlX2JyX3VwJzogVW5pZm9ybTNmLFxuICAgICd1X3RpbGVfYmxfdXAnOiBVbmlmb3JtM2YsXG4gICAgJ3VfdGlsZV91cF9zY2FsZSc6IFVuaWZvcm0xZlxufH07XG5cbmV4cG9ydCBjb25zdCB0ZXJyYWluVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogVGVycmFpblVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2RlbSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfZGVtKSxcbiAgICAndV9kZW1fcHJldic6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfZGVtX3ByZXYpLFxuICAgICd1X2RlbV91bnBhY2snOiBuZXcgVW5pZm9ybTRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RlbV91bnBhY2spLFxuICAgICd1X2RlbV90bCc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfZGVtX3RsKSxcbiAgICAndV9kZW1fc2NhbGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RlbV9zY2FsZSksXG4gICAgJ3VfZGVtX3RsX3ByZXYnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RlbV90bF9wcmV2KSxcbiAgICAndV9kZW1fc2NhbGVfcHJldic6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZGVtX3NjYWxlX3ByZXYpLFxuICAgICd1X2RlbV9zaXplJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9kZW1fc2l6ZSksXG4gICAgJ3VfZGVtX2xlcnAnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RlbV9sZXJwKSxcbiAgICAndV9leGFnZ2VyYXRpb24nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2V4YWdnZXJhdGlvbiksXG4gICAgJ3VfZGVwdGgnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2RlcHRoKSxcbiAgICAndV9kZXB0aF9zaXplX2ludic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfZGVwdGhfc2l6ZV9pbnYpLFxuICAgICd1X21ldGVyX3RvX2RlbSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfbWV0ZXJfdG9fZGVtKSxcbiAgICAndV9sYWJlbF9wbGFuZV9tYXRyaXhfaW52JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9sYWJlbF9wbGFuZV9tYXRyaXhfaW52KSxcbiAgICAndV90aWxlX3RsX3VwJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX3RsX3VwKSxcbiAgICAndV90aWxlX3RyX3VwJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX3RyX3VwKSxcbiAgICAndV90aWxlX2JyX3VwJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX2JyX3VwKSxcbiAgICAndV90aWxlX2JsX3VwJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX2JsX3VwKSxcbiAgICAndV90aWxlX3VwX3NjYWxlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX3VwX3NjYWxlKVxufSk7XG5cbmZ1bmN0aW9uIGRlZmF1bHRUZXJyYWluVW5pZm9ybXMoZW5jb2Rpbmc6IERFTUVuY29kaW5nKTogVW5pZm9ybVZhbHVlczxUZXJyYWluVW5pZm9ybXNUeXBlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfZGVtJzogMixcbiAgICAgICAgJ3VfZGVtX3ByZXYnOiA0LFxuICAgICAgICAndV9kZW1fdW5wYWNrJzogREVNRGF0YS5nZXRVbnBhY2tWZWN0b3IoZW5jb2RpbmcpLFxuICAgICAgICAndV9kZW1fdGwnOiBbMCwgMF0sXG4gICAgICAgICd1X2RlbV90bF9wcmV2JzogWzAsIDBdLFxuICAgICAgICAndV9kZW1fc2NhbGUnOiAwLFxuICAgICAgICAndV9kZW1fc2NhbGVfcHJldic6IDAsXG4gICAgICAgICd1X2RlbV9zaXplJzogMCxcbiAgICAgICAgJ3VfZGVtX2xlcnAnOiAxLjAsXG4gICAgICAgICd1X2RlcHRoJzogMyxcbiAgICAgICAgJ3VfZGVwdGhfc2l6ZV9pbnYnOiBbMCwgMF0sXG4gICAgICAgICd1X2V4YWdnZXJhdGlvbic6IDAsXG4gICAgICAgICd1X3RpbGVfdGxfdXAnOiBbMCwgMCwgMV0sXG4gICAgICAgICd1X3RpbGVfdHJfdXAnOiBbMCwgMCwgMV0sXG4gICAgICAgICd1X3RpbGVfYnJfdXAnOiBbMCwgMCwgMV0sXG4gICAgICAgICd1X3RpbGVfYmxfdXAnOiBbMCwgMCwgMV0sXG4gICAgICAgICd1X3RpbGVfdXBfc2NhbGUnOiAxXG4gICAgfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBDb250ZXh0IGZyb20gJy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1Mb2NhdGlvbnMsIFVuaWZvcm1WYWx1ZXN9IGZyb20gJy4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIHtVbndyYXBwZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCBQYWludGVyIGZyb20gJy4vcGFpbnRlci5qcyc7XG5pbXBvcnQgRm9nIGZyb20gJy4uL3N0eWxlL2ZvZy5qcyc7XG5pbXBvcnQge1VuaWZvcm0xZiwgVW5pZm9ybTFpLCBVbmlmb3JtMmYsIFVuaWZvcm0zZiwgVW5pZm9ybTRmLCBVbmlmb3JtTWF0cml4NGZ9IGZyb20gJy4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB7Z2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbn0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vZ2xvYmVfdXRpbC5qcyc7XG5cbmV4cG9ydCB0eXBlIEZvZ1VuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfZm9nX21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9mb2dfcmFuZ2UnOiBVbmlmb3JtMmYsXG4gICAgJ3VfZm9nX2NvbG9yJzogVW5pZm9ybTRmLFxuICAgICd1X2ZvZ19ob3Jpem9uX2JsZW5kJzogVW5pZm9ybTFmLFxuICAgICd1X2ZvZ190ZW1wb3JhbF9vZmZzZXQnOiBVbmlmb3JtMWYsXG4gICAgJ3VfZnJ1c3R1bV90bCc6IFVuaWZvcm0zZixcbiAgICAndV9mcnVzdHVtX3RyJzogVW5pZm9ybTNmLFxuICAgICd1X2ZydXN0dW1fYnInOiBVbmlmb3JtM2YsXG4gICAgJ3VfZnJ1c3R1bV9ibCc6IFVuaWZvcm0zZixcbiAgICAndV9nbG9iZV9wb3MnOiBVbmlmb3JtM2YsXG4gICAgJ3VfZ2xvYmVfcmFkaXVzJzogVW5pZm9ybTFmLFxuICAgICd1X2dsb2JlX3RyYW5zaXRpb24nOiBVbmlmb3JtMWYsXG4gICAgJ3VfaXNfZ2xvYmUnOiBVbmlmb3JtMWksXG4gICAgJ3Vfdmlld3BvcnQnOiBVbmlmb3JtMmYsXG58fTtcblxuZXhwb3J0IGNvbnN0IGZvZ1VuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEZvZ1VuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2ZvZ19tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZvZ19tYXRyaXgpLFxuICAgICd1X2ZvZ19yYW5nZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfZm9nX3JhbmdlKSxcbiAgICAndV9mb2dfY29sb3InOiBuZXcgVW5pZm9ybTRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZvZ19jb2xvciksXG4gICAgJ3VfZm9nX2hvcml6b25fYmxlbmQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ZvZ19ob3Jpem9uX2JsZW5kKSxcbiAgICAndV9mb2dfdGVtcG9yYWxfb2Zmc2V0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mb2dfdGVtcG9yYWxfb2Zmc2V0KSxcbiAgICAndV9mcnVzdHVtX3RsJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9mcnVzdHVtX3RsKSxcbiAgICAndV9mcnVzdHVtX3RyJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9mcnVzdHVtX3RyKSxcbiAgICAndV9mcnVzdHVtX2JyJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9mcnVzdHVtX2JyKSxcbiAgICAndV9mcnVzdHVtX2JsJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9mcnVzdHVtX2JsKSxcbiAgICAndV9nbG9iZV9wb3MnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X2dsb2JlX3BvcyksXG4gICAgJ3VfZ2xvYmVfcmFkaXVzJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9nbG9iZV9yYWRpdXMpLFxuICAgICd1X2dsb2JlX3RyYW5zaXRpb24nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2dsb2JlX3RyYW5zaXRpb24pLFxuICAgICd1X2lzX2dsb2JlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc19nbG9iZSksXG4gICAgJ3Vfdmlld3BvcnQnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3ZpZXdwb3J0KVxufSk7XG5cbmV4cG9ydCBjb25zdCBmb2dVbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgZm9nOiBGb2csXG4gICAgdGlsZUlEOiA/VW53cmFwcGVkVGlsZUlELFxuICAgIGZvZ09wYWNpdHk6IG51bWJlcixcbiAgICBmcnVzdHVtRGlyVGw6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBmcnVzdHVtRGlyVHI6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBmcnVzdHVtRGlyQnI6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBmcnVzdHVtRGlyQmw6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBnbG9iZVBvc2l0aW9uOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZ2xvYmVSYWRpdXM6IG51bWJlcixcbiAgICB2aWV3cG9ydDogW251bWJlciwgbnVtYmVyXVxuKTogVW5pZm9ybVZhbHVlczxGb2dVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IGZvZ0NvbG9yID0gZm9nLnByb3BlcnRpZXMuZ2V0KCdjb2xvcicpLnRvQXJyYXkwMSgpO1xuICAgIGZvZ0NvbG9yWzNdID0gZm9nT3BhY2l0eTsgLy8gVXBkYXRlIEFscGhhXG4gICAgY29uc3QgdGVtcG9yYWxPZmZzZXQgPSAocGFpbnRlci5mcmFtZUNvdW50ZXIgLyAxMDAwLjApICUgMTtcbiAgICByZXR1cm4ge1xuICAgICAgICAndV9mb2dfbWF0cml4JzogdGlsZUlEID8gdHIuY2FsY3VsYXRlRm9nVGlsZU1hdHJpeCh0aWxlSUQpIDogcGFpbnRlci5pZGVudGl0eU1hdCxcbiAgICAgICAgJ3VfZm9nX3JhbmdlJzogZm9nLmdldEZvdkFkanVzdGVkUmFuZ2UodHIuX2ZvdiksXG4gICAgICAgICd1X2ZvZ19jb2xvcic6IGZvZ0NvbG9yLFxuICAgICAgICAndV9mb2dfaG9yaXpvbl9ibGVuZCc6IGZvZy5wcm9wZXJ0aWVzLmdldCgnaG9yaXpvbi1ibGVuZCcpLFxuICAgICAgICAndV9mb2dfdGVtcG9yYWxfb2Zmc2V0JzogdGVtcG9yYWxPZmZzZXQsXG4gICAgICAgICd1X2ZydXN0dW1fdGwnOiBmcnVzdHVtRGlyVGwsXG4gICAgICAgICd1X2ZydXN0dW1fdHInOiBmcnVzdHVtRGlyVHIsXG4gICAgICAgICd1X2ZydXN0dW1fYnInOiBmcnVzdHVtRGlyQnIsXG4gICAgICAgICd1X2ZydXN0dW1fYmwnOiBmcnVzdHVtRGlyQmwsXG4gICAgICAgICd1X2dsb2JlX3Bvcyc6IGdsb2JlUG9zaXRpb24sXG4gICAgICAgICd1X2dsb2JlX3JhZGl1cyc6IGdsb2JlUmFkaXVzLFxuICAgICAgICAndV92aWV3cG9ydCc6IHZpZXdwb3J0LFxuICAgICAgICAndV9nbG9iZV90cmFuc2l0aW9uJzogZ2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbih0ci56b29tKSxcbiAgICAgICAgJ3VfaXNfZ2xvYmUnOiArKHRyLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJylcbiAgICB9O1xufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgcHJlbHVkZSxcbiAgICBwcmVsdWRlRnJhZ1ByZWNpc2lvblF1YWxpZmllcnMsXG4gICAgcHJlbHVkZVZlcnRQcmVjaXNpb25RdWFsaWZpZXJzLFxuICAgIHByZWx1ZGVUZXJyYWluLFxuICAgIHByZWx1ZGVGb2csXG4gICAgcHJlbHVkZUNvbW1vblNvdXJjZSxcbiAgICBzdGFuZGFyZERlcml2YXRpdmVzRXh0XG59IGZyb20gJy4uL3NoYWRlcnMvc2hhZGVycy5qcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgUHJvZ3JhbUNvbmZpZ3VyYXRpb24gZnJvbSAnLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4vdmVydGV4X2FycmF5X29iamVjdC5qcyc7XG5pbXBvcnQgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB7dGVycmFpblVuaWZvcm1zfSBmcm9tICcuLi90ZXJyYWluL3RlcnJhaW4uanMnO1xuaW1wb3J0IHR5cGUge1RlcnJhaW5Vbmlmb3Jtc1R5cGV9IGZyb20gJy4uL3RlcnJhaW4vdGVycmFpbi5qcyc7XG5pbXBvcnQge2ZvZ1VuaWZvcm1zfSBmcm9tICcuL2ZvZy5qcyc7XG5pbXBvcnQgdHlwZSB7Rm9nVW5pZm9ybXNUeXBlfSBmcm9tICcuL2ZvZy5qcyc7XG5cbmltcG9ydCB0eXBlIFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50LmpzJztcbmltcG9ydCB0eXBlIFZlcnRleEJ1ZmZlciBmcm9tICcuLi9nbC92ZXJ0ZXhfYnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uL2dsL2luZGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZS5qcyc7XG5pbXBvcnQgdHlwZSBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IHR5cGUgQ29sb3JNb2RlIGZyb20gJy4uL2dsL2NvbG9yX21vZGUuanMnO1xuaW1wb3J0IHR5cGUgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlLmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtQmluZGluZ3MsIFVuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIHtCaW5kZXJVbmlmb3JtfSBmcm9tICcuLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5cbmV4cG9ydCB0eXBlIERyYXdNb2RlID1cbiAgICB8ICRQcm9wZXJ0eVR5cGU8V2ViR0xSZW5kZXJpbmdDb250ZXh0LCAnTElORVMnPlxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdUUklBTkdMRVMnPlxuICAgIHwgJFByb3BlcnR5VHlwZTxXZWJHTFJlbmRlcmluZ0NvbnRleHQsICdMSU5FX1NUUklQJz47XG5cbmZ1bmN0aW9uIGdldFRva2VuaXplZEF0dHJpYnV0ZXNBbmRVbmlmb3JtcyAoYXJyYXk6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFycmF5W2ldID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBhcnJheVtpXS5zcGxpdCgnICcpO1xuICAgICAgICByZXN1bHQucHVzaCh0b2tlbi5wb3AoKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5jbGFzcyBQcm9ncmFtPFVzOiBVbmlmb3JtQmluZGluZ3M+IHtcbiAgICBwcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gICAgYXR0cmlidXRlczoge1tfOiBzdHJpbmddOiBudW1iZXJ9O1xuICAgIG51bUF0dHJpYnV0ZXM6IG51bWJlcjtcbiAgICBmaXhlZFVuaWZvcm1zOiBVcztcbiAgICBiaW5kZXJVbmlmb3JtczogQXJyYXk8QmluZGVyVW5pZm9ybT47XG4gICAgZmFpbGVkVG9DcmVhdGU6IGJvb2xlYW47XG4gICAgdGVycmFpblVuaWZvcm1zOiA/VGVycmFpblVuaWZvcm1zVHlwZTtcbiAgICBmb2dVbmlmb3JtczogP0ZvZ1VuaWZvcm1zVHlwZTtcblxuICAgIHN0YXRpYyBjYWNoZUtleShuYW1lOiBzdHJpbmcsIGRlZmluZXM6IHN0cmluZ1tdLCBwcm9ncmFtQ29uZmlndXJhdGlvbjogP1Byb2dyYW1Db25maWd1cmF0aW9uKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGtleSA9IGAke25hbWV9JHtwcm9ncmFtQ29uZmlndXJhdGlvbiA/IHByb2dyYW1Db25maWd1cmF0aW9uLmNhY2hlS2V5IDogJyd9YDtcbiAgICAgICAgZm9yIChjb25zdCBkZWZpbmUgb2YgZGVmaW5lcykge1xuICAgICAgICAgICAga2V5ICs9IGAvJHtkZWZpbmV9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsXG4gICAgICAgICAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHNvdXJjZToge2ZyYWdtZW50U291cmNlOiBzdHJpbmcsIHZlcnRleFNvdXJjZTogc3RyaW5nLCBzdGF0aWNBdHRyaWJ1dGVzOiBBcnJheTxzdHJpbmc+LCBzdGF0aWNVbmlmb3JtczogQXJyYXk8c3RyaW5nPn0sXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogP1Byb2dyYW1Db25maWd1cmF0aW9uLFxuICAgICAgICAgICAgICAgIGZpeGVkVW5pZm9ybXM6IChDb250ZXh0LCBVbmlmb3JtTG9jYXRpb25zKSA9PiBVcyxcbiAgICAgICAgICAgICAgICBmaXhlZERlZmluZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuXG4gICAgICAgIGNvbnN0IHN0YXRpY0F0dHJJbmZvID0gZ2V0VG9rZW5pemVkQXR0cmlidXRlc0FuZFVuaWZvcm1zKHNvdXJjZS5zdGF0aWNBdHRyaWJ1dGVzKTtcbiAgICAgICAgY29uc3QgZHluYW1pY0F0dHJJbmZvID0gY29uZmlndXJhdGlvbiA/IGNvbmZpZ3VyYXRpb24uZ2V0QmluZGVyQXR0cmlidXRlcygpIDogW107XG4gICAgICAgIGNvbnN0IGFsbEF0dHJJbmZvID0gc3RhdGljQXR0ckluZm8uY29uY2F0KGR5bmFtaWNBdHRySW5mbyk7XG5cbiAgICAgICAgY29uc3Qgc3RhdGljVW5pZm9ybXNJbmZvID0gc291cmNlLnN0YXRpY1VuaWZvcm1zID8gZ2V0VG9rZW5pemVkQXR0cmlidXRlc0FuZFVuaWZvcm1zKHNvdXJjZS5zdGF0aWNVbmlmb3JtcykgOiBbXTtcbiAgICAgICAgY29uc3QgZHluYW1pY1VuaWZvcm1zSW5mbyA9IGNvbmZpZ3VyYXRpb24gPyBjb25maWd1cmF0aW9uLmdldEJpbmRlclVuaWZvcm1zKCkgOiBbXTtcbiAgICAgICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZSB1bmlmb3Jtc1xuICAgICAgICBjb25zdCB1bmlmb3JtTGlzdCA9IHN0YXRpY1VuaWZvcm1zSW5mby5jb25jYXQoZHluYW1pY1VuaWZvcm1zSW5mbyk7XG4gICAgICAgIGNvbnN0IGFsbFVuaWZvcm1zSW5mbyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHVuaWZvcm0gb2YgdW5pZm9ybUxpc3QpIHtcbiAgICAgICAgICAgIGlmIChhbGxVbmlmb3Jtc0luZm8uaW5kZXhPZih1bmlmb3JtKSA8IDApIGFsbFVuaWZvcm1zSW5mby5wdXNoKHVuaWZvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlZmluZXMgPSBjb25maWd1cmF0aW9uID8gY29uZmlndXJhdGlvbi5kZWZpbmVzKCkgOiBbXTtcbiAgICAgICAgZGVmaW5lcyA9IGRlZmluZXMuY29uY2F0KGZpeGVkRGVmaW5lcy5tYXAoKGRlZmluZSkgPT4gYCNkZWZpbmUgJHtkZWZpbmV9YCkpO1xuXG4gICAgICAgIGNvbnN0IGZyYWdtZW50U291cmNlID0gZGVmaW5lcy5jb25jYXQoXG4gICAgICAgICAgICBjb250ZXh0LmV4dFN0YW5kYXJkRGVyaXZhdGl2ZXMgPyBzdGFuZGFyZERlcml2YXRpdmVzRXh0LmNvbmNhdChwcmVsdWRlRnJhZ1ByZWNpc2lvblF1YWxpZmllcnMpIDogcHJlbHVkZUZyYWdQcmVjaXNpb25RdWFsaWZpZXJzLFxuICAgICAgICAgICAgcHJlbHVkZUZyYWdQcmVjaXNpb25RdWFsaWZpZXJzLFxuICAgICAgICAgICAgcHJlbHVkZUNvbW1vblNvdXJjZSxcbiAgICAgICAgICAgIHByZWx1ZGUuZnJhZ21lbnRTb3VyY2UsXG4gICAgICAgICAgICBwcmVsdWRlRm9nLmZyYWdtZW50U291cmNlLFxuICAgICAgICAgICAgc291cmNlLmZyYWdtZW50U291cmNlKS5qb2luKCdcXG4nKTtcbiAgICAgICAgY29uc3QgdmVydGV4U291cmNlID0gZGVmaW5lcy5jb25jYXQoXG4gICAgICAgICAgICBwcmVsdWRlVmVydFByZWNpc2lvblF1YWxpZmllcnMsXG4gICAgICAgICAgICBwcmVsdWRlQ29tbW9uU291cmNlLFxuICAgICAgICAgICAgcHJlbHVkZS52ZXJ0ZXhTb3VyY2UsXG4gICAgICAgICAgICBwcmVsdWRlRm9nLnZlcnRleFNvdXJjZSxcbiAgICAgICAgICAgIHByZWx1ZGVUZXJyYWluLnZlcnRleFNvdXJjZSxcbiAgICAgICAgICAgIHNvdXJjZS52ZXJ0ZXhTb3VyY2UpLmpvaW4oJ1xcbicpO1xuICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpO1xuICAgICAgICBpZiAoZ2wuaXNDb250ZXh0TG9zdCgpKSB7XG4gICAgICAgICAgICB0aGlzLmZhaWxlZFRvQ3JlYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnbC5zaGFkZXJTb3VyY2UoZnJhZ21lbnRTaGFkZXIsIGZyYWdtZW50U291cmNlKTtcbiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcihmcmFnbWVudFNoYWRlcik7XG4gICAgICAgIGFzc2VydChnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoZnJhZ21lbnRTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSwgKGdsLmdldFNoYWRlckluZm9Mb2coZnJhZ21lbnRTaGFkZXIpOiBhbnkpKTtcbiAgICAgICAgZ2wuYXR0YWNoU2hhZGVyKHRoaXMucHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpO1xuXG4gICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihnbC5WRVJURVhfU0hBREVSKTtcbiAgICAgICAgaWYgKGdsLmlzQ29udGV4dExvc3QoKSkge1xuICAgICAgICAgICAgdGhpcy5mYWlsZWRUb0NyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2wuc2hhZGVyU291cmNlKHZlcnRleFNoYWRlciwgdmVydGV4U291cmNlKTtcbiAgICAgICAgZ2wuY29tcGlsZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuICAgICAgICBhc3NlcnQoZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHZlcnRleFNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpLCAoZ2wuZ2V0U2hhZGVySW5mb0xvZyh2ZXJ0ZXhTaGFkZXIpOiBhbnkpKTtcbiAgICAgICAgZ2wuYXR0YWNoU2hhZGVyKHRoaXMucHJvZ3JhbSwgdmVydGV4U2hhZGVyKTtcblxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgY29uc3QgdW5pZm9ybUxvY2F0aW9ucyA9IHt9O1xuXG4gICAgICAgIHRoaXMubnVtQXR0cmlidXRlcyA9IGFsbEF0dHJJbmZvLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtQXR0cmlidXRlczsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYWxsQXR0ckluZm9baV0pIHtcbiAgICAgICAgICAgICAgICBnbC5iaW5kQXR0cmliTG9jYXRpb24odGhpcy5wcm9ncmFtLCBpLCBhbGxBdHRySW5mb1tpXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzW2FsbEF0dHJJbmZvW2ldXSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBnbC5saW5rUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xuICAgICAgICBhc3NlcnQoZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSwgKGdsLmdldFByb2dyYW1JbmZvTG9nKHRoaXMucHJvZ3JhbSk6IGFueSkpO1xuXG4gICAgICAgIGdsLmRlbGV0ZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpO1xuICAgICAgICBnbC5kZWxldGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpO1xuXG4gICAgICAgIGZvciAobGV0IGl0ID0gMDsgaXQgPCBhbGxVbmlmb3Jtc0luZm8ubGVuZ3RoOyBpdCsrKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtID0gYWxsVW5pZm9ybXNJbmZvW2l0XTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtICYmICF1bmlmb3JtTG9jYXRpb25zW3VuaWZvcm1dKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5pZm9ybUxvY2F0aW9uID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgdW5pZm9ybSk7XG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1Mb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB1bmlmb3JtTG9jYXRpb25zW3VuaWZvcm1dID0gdW5pZm9ybUxvY2F0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZml4ZWRVbmlmb3JtcyA9IGZpeGVkVW5pZm9ybXMoY29udGV4dCwgdW5pZm9ybUxvY2F0aW9ucyk7XG4gICAgICAgIHRoaXMuYmluZGVyVW5pZm9ybXMgPSBjb25maWd1cmF0aW9uID8gY29uZmlndXJhdGlvbi5nZXRVbmlmb3Jtcyhjb250ZXh0LCB1bmlmb3JtTG9jYXRpb25zKSA6IFtdO1xuICAgICAgICBpZiAoZml4ZWREZWZpbmVzLmluZGV4T2YoJ1RFUlJBSU4nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGVycmFpblVuaWZvcm1zID0gdGVycmFpblVuaWZvcm1zKGNvbnRleHQsIHVuaWZvcm1Mb2NhdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaXhlZERlZmluZXMuaW5kZXhPZignRk9HJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmZvZ1VuaWZvcm1zID0gZm9nVW5pZm9ybXMoY29udGV4dCwgdW5pZm9ybUxvY2F0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRUZXJyYWluVW5pZm9ybVZhbHVlcyhjb250ZXh0OiBDb250ZXh0LCB0ZXJyYWluVW5pZm9ybVZhbHVlczogVW5pZm9ybVZhbHVlczxUZXJyYWluVW5pZm9ybXNUeXBlPikge1xuICAgICAgICBpZiAoIXRoaXMudGVycmFpblVuaWZvcm1zKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHVuaWZvcm1zOiBUZXJyYWluVW5pZm9ybXNUeXBlID0gdGhpcy50ZXJyYWluVW5pZm9ybXM7XG5cbiAgICAgICAgaWYgKHRoaXMuZmFpbGVkVG9DcmVhdGUpIHJldHVybjtcbiAgICAgICAgY29udGV4dC5wcm9ncmFtLnNldCh0aGlzLnByb2dyYW0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiB0ZXJyYWluVW5pZm9ybVZhbHVlcykge1xuICAgICAgICAgICAgdW5pZm9ybXNbbmFtZV0uc2V0KHRlcnJhaW5Vbmlmb3JtVmFsdWVzW25hbWVdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEZvZ1VuaWZvcm1WYWx1ZXMoY29udGV4dDogQ29udGV4dCwgZm9nVW5pZm9ybXNWYWx1ZXM6IFVuaWZvcm1WYWx1ZXM8Rm9nVW5pZm9ybXNUeXBlPikge1xuICAgICAgICBpZiAoIXRoaXMuZm9nVW5pZm9ybXMpIHJldHVybjtcbiAgICAgICAgY29uc3QgdW5pZm9ybXM6IEZvZ1VuaWZvcm1zVHlwZSA9IHRoaXMuZm9nVW5pZm9ybXM7XG5cbiAgICAgICAgaWYgKHRoaXMuZmFpbGVkVG9DcmVhdGUpIHJldHVybjtcbiAgICAgICAgY29udGV4dC5wcm9ncmFtLnNldCh0aGlzLnByb2dyYW0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBmb2dVbmlmb3Jtc1ZhbHVlcykge1xuICAgICAgICAgICAgaWYgKHVuaWZvcm1zW25hbWVdLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybXNbbmFtZV0uc2V0KGZvZ1VuaWZvcm1zVmFsdWVzW25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRyYXcoXG4gICAgICAgICBjb250ZXh0OiBDb250ZXh0LFxuICAgICAgICAgZHJhd01vZGU6IERyYXdNb2RlLFxuICAgICAgICAgZGVwdGhNb2RlOiAkUmVhZE9ubHk8RGVwdGhNb2RlPixcbiAgICAgICAgIHN0ZW5jaWxNb2RlOiAkUmVhZE9ubHk8U3RlbmNpbE1vZGU+LFxuICAgICAgICAgY29sb3JNb2RlOiAkUmVhZE9ubHk8Q29sb3JNb2RlPixcbiAgICAgICAgIGN1bGxGYWNlTW9kZTogJFJlYWRPbmx5PEN1bGxGYWNlTW9kZT4sXG4gICAgICAgICB1bmlmb3JtVmFsdWVzOiBVbmlmb3JtVmFsdWVzPFVzPixcbiAgICAgICAgIGxheWVySUQ6IHN0cmluZyxcbiAgICAgICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyLFxuICAgICAgICAgaW5kZXhCdWZmZXI6IEluZGV4QnVmZmVyLFxuICAgICAgICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3IsXG4gICAgICAgICBjdXJyZW50UHJvcGVydGllczogYW55LFxuICAgICAgICAgem9vbTogP251bWJlcixcbiAgICAgICAgIGNvbmZpZ3VyYXRpb246ID9Qcm9ncmFtQ29uZmlndXJhdGlvbixcbiAgICAgICAgIGR5bmFtaWNMYXlvdXRCdWZmZXI6ID9WZXJ0ZXhCdWZmZXIsXG4gICAgICAgICBkeW5hbWljTGF5b3V0QnVmZmVyMjogP1ZlcnRleEJ1ZmZlcixcbiAgICAgICAgIGR5bmFtaWNMYXlvdXRCdWZmZXIzOiA/VmVydGV4QnVmZmVyKSB7XG5cbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmICh0aGlzLmZhaWxlZFRvQ3JlYXRlKSByZXR1cm47XG5cbiAgICAgICAgY29udGV4dC5wcm9ncmFtLnNldCh0aGlzLnByb2dyYW0pO1xuICAgICAgICBjb250ZXh0LnNldERlcHRoTW9kZShkZXB0aE1vZGUpO1xuICAgICAgICBjb250ZXh0LnNldFN0ZW5jaWxNb2RlKHN0ZW5jaWxNb2RlKTtcbiAgICAgICAgY29udGV4dC5zZXRDb2xvck1vZGUoY29sb3JNb2RlKTtcbiAgICAgICAgY29udGV4dC5zZXRDdWxsRmFjZShjdWxsRmFjZU1vZGUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLmZpeGVkVW5pZm9ybXMpKSB7XG4gICAgICAgICAgICB0aGlzLmZpeGVkVW5pZm9ybXNbbmFtZV0uc2V0KHVuaWZvcm1WYWx1ZXNbbmFtZV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0VW5pZm9ybXMoY29udGV4dCwgdGhpcy5iaW5kZXJVbmlmb3JtcywgY3VycmVudFByb3BlcnRpZXMsIHt6b29tOiAoem9vbTogYW55KX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWl0aXZlU2l6ZSA9IHtcbiAgICAgICAgICAgIFtnbC5MSU5FU106IDIsXG4gICAgICAgICAgICBbZ2wuVFJJQU5HTEVTXTogMyxcbiAgICAgICAgICAgIFtnbC5MSU5FX1NUUklQXTogMVxuICAgICAgICB9W2RyYXdNb2RlXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMuZ2V0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhb3MgPSBzZWdtZW50LnZhb3MgfHwgKHNlZ21lbnQudmFvcyA9IHt9KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbzogVmVydGV4QXJyYXlPYmplY3QgPSB2YW9zW2xheWVySURdIHx8ICh2YW9zW2xheWVySURdID0gbmV3IFZlcnRleEFycmF5T2JqZWN0KCkpO1xuXG4gICAgICAgICAgICB2YW8uYmluZChcbiAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPyBjb25maWd1cmF0aW9uLmdldFBhaW50VmVydGV4QnVmZmVycygpIDogW10sXG4gICAgICAgICAgICAgICAgaW5kZXhCdWZmZXIsXG4gICAgICAgICAgICAgICAgc2VnbWVudC52ZXJ0ZXhPZmZzZXQsXG4gICAgICAgICAgICAgICAgZHluYW1pY0xheW91dEJ1ZmZlcixcbiAgICAgICAgICAgICAgICBkeW5hbWljTGF5b3V0QnVmZmVyMixcbiAgICAgICAgICAgICAgICBkeW5hbWljTGF5b3V0QnVmZmVyM1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZ2wuZHJhd0VsZW1lbnRzKFxuICAgICAgICAgICAgICAgIGRyYXdNb2RlLFxuICAgICAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICogcHJpbWl0aXZlU2l6ZSxcbiAgICAgICAgICAgICAgICBnbC5VTlNJR05FRF9TSE9SVCxcbiAgICAgICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZU9mZnNldCAqIHByaW1pdGl2ZVNpemUgKiAyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvZ3JhbTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7XG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybTNmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgcGl4ZWxzVG9UaWxlVW5pdHMgZnJvbSAnLi4vLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NGYWRlZH0gZnJvbSAnLi4vLi4vc3R5bGUvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NmYWRlUGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5cbnR5cGUgQmFja2dyb3VuZFBhdHRlcm5Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3BhdHRlcm5fdGxfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX2JyX2EnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybl90bF9iJzogVW5pZm9ybTJmLFxuICAgICd1X3BhdHRlcm5fYnJfYic6IFVuaWZvcm0yZixcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X21peCc6IFVuaWZvcm0xZixcbiAgICAndV9wYXR0ZXJuX3NpemVfYSc6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX3NpemVfYic6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZV9hJzogVW5pZm9ybTFmLFxuICAgICd1X3NjYWxlX2InOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGlsZV91bml0c190b19waXhlbHMnOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAvLyBwYXR0ZXJuIHVuaWZvcm1zOlxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGUnOiBVbmlmb3JtM2YsXG4gICAgJ3VfZmFkZSc6IFVuaWZvcm0xZixcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFVuaWZvcm0yZixcbiAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFVuaWZvcm0yZlxufH07XG5cbmZ1bmN0aW9uIHBhdHRlcm5Vbmlmb3JtVmFsdWVzKGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycywgcGFpbnRlcjogUGFpbnRlcixcbiAgICAgICAgdGlsZTogVGlsZVxuKTogVW5pZm9ybVZhbHVlczxQYXR0ZXJuVW5pZm9ybXNUeXBlPiB7XG5cbiAgICBjb25zdCB0aWxlUmF0aW8gPSAxIC8gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20pO1xuXG4gICAgY29uc3QgbnVtVGlsZXMgPSBNYXRoLnBvdygyLCB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgY29uc3QgdGlsZVNpemVBdE5lYXJlc3Rab29tID0gdGlsZS50aWxlU2l6ZSAqIE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnRpbGVab29tKSAvIG51bVRpbGVzO1xuXG4gICAgY29uc3QgcGl4ZWxYID0gdGlsZVNpemVBdE5lYXJlc3Rab29tICogKHRpbGUudGlsZUlELmNhbm9uaWNhbC54ICsgdGlsZS50aWxlSUQud3JhcCAqIG51bVRpbGVzKTtcbiAgICBjb25zdCBwaXhlbFkgPSB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gKiB0aWxlLnRpbGVJRC5jYW5vbmljYWwueTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X2ltYWdlJzogMCxcbiAgICAgICAgJ3VfdGV4c2l6ZSc6IHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuc2l6ZSxcbiAgICAgICAgJ3Vfc2NhbGUnOiBbdGlsZVJhdGlvLCBjcm9zc2ZhZGUuZnJvbVNjYWxlLCBjcm9zc2ZhZGUudG9TY2FsZV0sXG4gICAgICAgICd1X2ZhZGUnOiBjcm9zc2ZhZGUudCxcbiAgICAgICAgLy8gc3BsaXQgdGhlIHBpeGVsIGNvb3JkIGludG8gdHdvIHBhaXJzIG9mIDE2IGJpdCBudW1iZXJzLiBUaGUgZ2xzbCBzcGVjIG9ubHkgZ3VhcmFudGVlcyAxNiBiaXRzIG9mIHByZWNpc2lvbi5cbiAgICAgICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBbcGl4ZWxYID4+IDE2LCBwaXhlbFkgPj4gMTZdLFxuICAgICAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFtwaXhlbFggJiAweEZGRkYsIHBpeGVsWSAmIDB4RkZGRl1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBiZ1BhdHRlcm5Vbmlmb3JtVmFsdWVzKGltYWdlOiBDcm9zc0ZhZGVkPFJlc29sdmVkSW1hZ2U+LCBjcm9zc2ZhZGU6IENyb3NzZmFkZVBhcmFtZXRlcnMsIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgICAgIHRpbGU6IHt0aWxlSUQ6IE92ZXJzY2FsZWRUaWxlSUQsIHRpbGVTaXplOiBudW1iZXJ9XG4pOiBVbmlmb3JtVmFsdWVzPEJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXNUeXBlPiB7XG4gICAgY29uc3QgaW1hZ2VQb3NBID0gcGFpbnRlci5pbWFnZU1hbmFnZXIuZ2V0UGF0dGVybihpbWFnZS5mcm9tLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IGltYWdlUG9zQiA9IHBhaW50ZXIuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4oaW1hZ2UudG8udG9TdHJpbmcoKSk7XG4gICAgYXNzZXJ0KGltYWdlUG9zQSAmJiBpbWFnZVBvc0IpO1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IHBhaW50ZXIuaW1hZ2VNYW5hZ2VyLmdldFBpeGVsU2l6ZSgpO1xuXG4gICAgY29uc3QgbnVtVGlsZXMgPSBNYXRoLnBvdygyLCB0aWxlLnRpbGVJRC5vdmVyc2NhbGVkWik7XG4gICAgY29uc3QgdGlsZVNpemVBdE5lYXJlc3Rab29tID0gdGlsZS50aWxlU2l6ZSAqIE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnRpbGVab29tKSAvIG51bVRpbGVzO1xuXG4gICAgY29uc3QgcGl4ZWxYID0gdGlsZVNpemVBdE5lYXJlc3Rab29tICogKHRpbGUudGlsZUlELmNhbm9uaWNhbC54ICsgdGlsZS50aWxlSUQud3JhcCAqIG51bVRpbGVzKTtcbiAgICBjb25zdCBwaXhlbFkgPSB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gKiB0aWxlLnRpbGVJRC5jYW5vbmljYWwueTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X2ltYWdlJzogMCxcbiAgICAgICAgJ3VfcGF0dGVybl90bF9hJzogKGltYWdlUG9zQTogYW55KS50bCxcbiAgICAgICAgJ3VfcGF0dGVybl9icl9hJzogKGltYWdlUG9zQTogYW55KS5icixcbiAgICAgICAgJ3VfcGF0dGVybl90bF9iJzogKGltYWdlUG9zQjogYW55KS50bCxcbiAgICAgICAgJ3VfcGF0dGVybl9icl9iJzogKGltYWdlUG9zQjogYW55KS5icixcbiAgICAgICAgJ3VfdGV4c2l6ZSc6IFt3aWR0aCwgaGVpZ2h0XSxcbiAgICAgICAgJ3VfbWl4JzogY3Jvc3NmYWRlLnQsXG4gICAgICAgICd1X3BhdHRlcm5fc2l6ZV9hJzogKGltYWdlUG9zQTogYW55KS5kaXNwbGF5U2l6ZSxcbiAgICAgICAgJ3VfcGF0dGVybl9zaXplX2InOiAoaW1hZ2VQb3NCOiBhbnkpLmRpc3BsYXlTaXplLFxuICAgICAgICAndV9zY2FsZV9hJzogY3Jvc3NmYWRlLmZyb21TY2FsZSxcbiAgICAgICAgJ3Vfc2NhbGVfYic6IGNyb3NzZmFkZS50b1NjYWxlLFxuICAgICAgICAndV90aWxlX3VuaXRzX3RvX3BpeGVscyc6IDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSksXG4gICAgICAgIC8vIHNwbGl0IHRoZSBwaXhlbCBjb29yZCBpbnRvIHR3byBwYWlycyBvZiAxNiBiaXQgbnVtYmVycy4gVGhlIGdsc2wgc3BlYyBvbmx5IGd1YXJhbnRlZXMgMTYgYml0cyBvZiBwcmVjaXNpb24uXG4gICAgICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogW3BpeGVsWCA+PiAxNiwgcGl4ZWxZID4+IDE2XSxcbiAgICAgICAgJ3VfcGl4ZWxfY29vcmRfbG93ZXInOiBbcGl4ZWxYICYgMHhGRkZGLCBwaXhlbFkgJiAweEZGRkZdXG4gICAgfTtcbn1cbmV4cG9ydCB7YmdQYXR0ZXJuVW5pZm9ybVZhbHVlcywgcGF0dGVyblVuaWZvcm1WYWx1ZXN9O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtwYXR0ZXJuVW5pZm9ybVZhbHVlc30gZnJvbSAnLi9wYXR0ZXJuLmpzJztcbmltcG9ydCB7XG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybTNmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHttYXQzLCBtYXQ0LCB2ZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUge0Nyb3NzZmFkZVBhcmFtZXRlcnN9IGZyb20gJy4uLy4uL3N0eWxlL2V2YWx1YXRpb25fcGFyYW1ldGVycy5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB7Q2Fub25pY2FsVGlsZUlELCBPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uLy4uL2RhdGEvZXh0ZW50LmpzJztcblxuZXhwb3J0IHR5cGUgRmlsbEV4dHJ1c2lvblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2xpZ2h0cG9zJzogVW5pZm9ybTNmLFxuICAgICd1X2xpZ2h0aW50ZW5zaXR5JzogVW5pZm9ybTFmLFxuICAgICd1X2xpZ2h0Y29sb3InOiBVbmlmb3JtM2YsXG4gICAgJ3VfdmVydGljYWxfZ3JhZGllbnQnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZixcbiAgICAvLyBnbG9iZSB1bmlmb3JtczpcbiAgICAndV90aWxlX2lkJzogVW5pZm9ybTNmLFxuICAgICd1X3pvb21fdHJhbnNpdGlvbic6IFVuaWZvcm0xZixcbiAgICAndV9pbnZfcm90X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9tZXJjX2NlbnRlcic6IFVuaWZvcm0yZixcbiAgICAndV91cF9kaXInOiBVbmlmb3JtM2YsXG4gICAgJ3VfaGVpZ2h0X2xpZnQnOiBVbmlmb3JtMWZcbnx9O1xuXG5leHBvcnQgdHlwZSBGaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2xpZ2h0cG9zJzogVW5pZm9ybTNmLFxuICAgICd1X2xpZ2h0aW50ZW5zaXR5JzogVW5pZm9ybTFmLFxuICAgICd1X2xpZ2h0Y29sb3InOiBVbmlmb3JtM2YsXG4gICAgJ3VfaGVpZ2h0X2ZhY3Rvcic6IFVuaWZvcm0xZixcbiAgICAndV92ZXJ0aWNhbF9ncmFkaWVudCc6IFVuaWZvcm0xZixcbiAgICAvLyBnbG9iZSB1bmlmb3JtczpcbiAgICAndV90aWxlX2lkJzogVW5pZm9ybTNmLFxuICAgICd1X3pvb21fdHJhbnNpdGlvbic6IFVuaWZvcm0xZixcbiAgICAndV9pbnZfcm90X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9tZXJjX2NlbnRlcic6IFVuaWZvcm0yZixcbiAgICAndV91cF9kaXInOiBVbmlmb3JtM2YsXG4gICAgJ3VfaGVpZ2h0X2xpZnQnOiBVbmlmb3JtMWYsXG4gICAgLy8gcGF0dGVybiB1bmlmb3JtczpcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogVW5pZm9ybTJmLFxuICAgICd1X3NjYWxlJzogVW5pZm9ybTNmLFxuICAgICd1X2ZhZGUnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfb3BhY2l0eSc6IFVuaWZvcm0xZlxufH07XG5cbmNvbnN0IGZpbGxFeHRydXNpb25Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsRXh0cnVzaW9uVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2xpZ2h0cG9zJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodHBvcyksXG4gICAgJ3VfbGlnaHRpbnRlbnNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0aW50ZW5zaXR5KSxcbiAgICAndV9saWdodGNvbG9yJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodGNvbG9yKSxcbiAgICAndV92ZXJ0aWNhbF9ncmFkaWVudCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdmVydGljYWxfZ3JhZGllbnQpLFxuICAgICd1X29wYWNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X29wYWNpdHkpLFxuICAgIC8vIGdsb2JlIHVuaWZvcm1zOlxuICAgICd1X3RpbGVfaWQnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RpbGVfaWQpLFxuICAgICd1X3pvb21fdHJhbnNpdGlvbic6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfem9vbV90cmFuc2l0aW9uKSxcbiAgICAndV9pbnZfcm90X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfaW52X3JvdF9tYXRyaXgpLFxuICAgICd1X21lcmNfY2VudGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9tZXJjX2NlbnRlciksXG4gICAgJ3VfdXBfZGlyJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV91cF9kaXIpLFxuICAgICd1X2hlaWdodF9saWZ0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9oZWlnaHRfbGlmdClcbn0pO1xuXG5jb25zdCBmaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2xpZ2h0cG9zJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodHBvcyksXG4gICAgJ3VfbGlnaHRpbnRlbnNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xpZ2h0aW50ZW5zaXR5KSxcbiAgICAndV9saWdodGNvbG9yJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9saWdodGNvbG9yKSxcbiAgICAndV92ZXJ0aWNhbF9ncmFkaWVudCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfdmVydGljYWxfZ3JhZGllbnQpLFxuICAgICd1X2hlaWdodF9mYWN0b3InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2hlaWdodF9mYWN0b3IpLFxuICAgIC8vIGdsb2JlIHVuaWZvcm1zOlxuICAgICd1X3RpbGVfaWQnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RpbGVfaWQpLFxuICAgICd1X3pvb21fdHJhbnNpdGlvbic6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfem9vbV90cmFuc2l0aW9uKSxcbiAgICAndV9pbnZfcm90X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfaW52X3JvdF9tYXRyaXgpLFxuICAgICd1X21lcmNfY2VudGVyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9tZXJjX2NlbnRlciksXG4gICAgJ3VfdXBfZGlyJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV91cF9kaXIpLFxuICAgICd1X2hlaWdodF9saWZ0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9oZWlnaHRfbGlmdCksXG4gICAgLy8gcGF0dGVybiB1bmlmb3Jtc1xuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfdGV4c2l6ZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4c2l6ZSksXG4gICAgJ3VfcGl4ZWxfY29vcmRfdXBwZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpeGVsX2Nvb3JkX3VwcGVyKSxcbiAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfY29vcmRfbG93ZXIpLFxuICAgICd1X3NjYWxlJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9zY2FsZSksXG4gICAgJ3VfZmFkZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZmFkZSksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSlcbn0pO1xuXG5jb25zdCBpZGVudGl0eU1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG5cbmNvbnN0IGZpbGxFeHRydXNpb25Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgc2hvdWxkVXNlVmVydGljYWxHcmFkaWVudDogYm9vbGVhbixcbiAgICBvcGFjaXR5OiBudW1iZXIsXG4gICAgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQsXG4gICAgaGVpZ2h0TGlmdDogbnVtYmVyLFxuICAgIHpvb21UcmFuc2l0aW9uOiBudW1iZXIsXG4gICAgbWVyY2F0b3JDZW50ZXI6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgaW52TWF0cml4OiBGbG9hdDMyQXJyYXlcbik6IFVuaWZvcm1WYWx1ZXM8RmlsbEV4dHJ1c2lvblVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IGxpZ2h0ID0gcGFpbnRlci5zdHlsZS5saWdodDtcbiAgICBjb25zdCBfbHAgPSBsaWdodC5wcm9wZXJ0aWVzLmdldCgncG9zaXRpb24nKTtcbiAgICBjb25zdCBsaWdodFBvcyA9IFtfbHAueCwgX2xwLnksIF9scC56XTtcbiAgICBjb25zdCBsaWdodE1hdCA9IG1hdDMuY3JlYXRlKCk7XG4gICAgY29uc3QgYW5jaG9yID0gbGlnaHQucHJvcGVydGllcy5nZXQoJ2FuY2hvcicpO1xuICAgIGlmIChhbmNob3IgPT09ICd2aWV3cG9ydCcpIHtcbiAgICAgICAgbWF0My5mcm9tUm90YXRpb24obGlnaHRNYXQsIC1wYWludGVyLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgIHZlYzMudHJhbnNmb3JtTWF0MyhsaWdodFBvcywgbGlnaHRQb3MsIGxpZ2h0TWF0KTtcbiAgICB9XG5cbiAgICBjb25zdCBsaWdodENvbG9yID0gbGlnaHQucHJvcGVydGllcy5nZXQoJ2NvbG9yJyk7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSB7XG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3VfbGlnaHRwb3MnOiBsaWdodFBvcyxcbiAgICAgICAgJ3VfbGlnaHRpbnRlbnNpdHknOiBsaWdodC5wcm9wZXJ0aWVzLmdldCgnaW50ZW5zaXR5JyksXG4gICAgICAgICd1X2xpZ2h0Y29sb3InOiBbbGlnaHRDb2xvci5yLCBsaWdodENvbG9yLmcsIGxpZ2h0Q29sb3IuYl0sXG4gICAgICAgICd1X3ZlcnRpY2FsX2dyYWRpZW50JzogK3Nob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsXG4gICAgICAgICd1X29wYWNpdHknOiBvcGFjaXR5LFxuICAgICAgICAndV90aWxlX2lkJzogWzAsIDAsIDBdLFxuICAgICAgICAndV96b29tX3RyYW5zaXRpb24nOiAwLFxuICAgICAgICAndV9pbnZfcm90X21hdHJpeCc6IGlkZW50aXR5TWF0cml4LFxuICAgICAgICAndV9tZXJjX2NlbnRlcic6IFswLCAwXSxcbiAgICAgICAgJ3VfdXBfZGlyJzogWzAsIDAsIDBdLFxuICAgICAgICAndV9oZWlnaHRfbGlmdCc6IDBcbiAgICB9O1xuXG4gICAgaWYgKHRyLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJykge1xuICAgICAgICB1bmlmb3JtVmFsdWVzWyd1X3RpbGVfaWQnXSA9IFtjb29yZC5jYW5vbmljYWwueCwgY29vcmQuY2Fub25pY2FsLnksIDEgPDwgY29vcmQuY2Fub25pY2FsLnpdO1xuICAgICAgICB1bmlmb3JtVmFsdWVzWyd1X3pvb21fdHJhbnNpdGlvbiddID0gem9vbVRyYW5zaXRpb247XG4gICAgICAgIHVuaWZvcm1WYWx1ZXNbJ3VfaW52X3JvdF9tYXRyaXgnXSA9IGludk1hdHJpeDtcbiAgICAgICAgdW5pZm9ybVZhbHVlc1sndV9tZXJjX2NlbnRlciddID0gbWVyY2F0b3JDZW50ZXI7XG4gICAgICAgIHVuaWZvcm1WYWx1ZXNbJ3VfdXBfZGlyJ10gPSAodHIucHJvamVjdGlvbi51cFZlY3RvcihuZXcgQ2Fub25pY2FsVGlsZUlEKDAsIDAsIDApLCBtZXJjYXRvckNlbnRlclswXSAqIEVYVEVOVCwgbWVyY2F0b3JDZW50ZXJbMV0gKiBFWFRFTlQpOiBhbnkpO1xuICAgICAgICB1bmlmb3JtVmFsdWVzWyd1X2hlaWdodF9saWZ0J10gPSBoZWlnaHRMaWZ0O1xuICAgIH1cblxuICAgIHJldHVybiB1bmlmb3JtVmFsdWVzO1xufTtcblxuY29uc3QgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgc2hvdWxkVXNlVmVydGljYWxHcmFkaWVudDogYm9vbGVhbixcbiAgICBvcGFjaXR5OiBudW1iZXIsXG4gICAgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQsXG4gICAgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgaGVpZ2h0TGlmdDogbnVtYmVyLFxuICAgIHpvb21UcmFuc2l0aW9uOiBudW1iZXIsXG4gICAgbWVyY2F0b3JDZW50ZXI6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgaW52TWF0cml4OiBGbG9hdDMyQXJyYXlcbik6IFVuaWZvcm1WYWx1ZXM8RmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gZmlsbEV4dHJ1c2lvblVuaWZvcm1WYWx1ZXMoXG4gICAgICAgIG1hdHJpeCwgcGFpbnRlciwgc2hvdWxkVXNlVmVydGljYWxHcmFkaWVudCwgb3BhY2l0eSwgY29vcmQsXG4gICAgICAgIGhlaWdodExpZnQsIHpvb21UcmFuc2l0aW9uLCBtZXJjYXRvckNlbnRlciwgaW52TWF0cml4KTtcbiAgICBjb25zdCBoZWlnaHRGYWN0b3JVbmlmb3JtID0ge1xuICAgICAgICAndV9oZWlnaHRfZmFjdG9yJzogLU1hdGgucG93KDIsIGNvb3JkLm92ZXJzY2FsZWRaKSAvIHRpbGUudGlsZVNpemUgLyA4XG4gICAgfTtcbiAgICByZXR1cm4gZXh0ZW5kKHVuaWZvcm1WYWx1ZXMsIHBhdHRlcm5Vbmlmb3JtVmFsdWVzKGNyb3NzZmFkZSwgcGFpbnRlciwgdGlsZSksIGhlaWdodEZhY3RvclVuaWZvcm0pO1xufTtcblxuZXhwb3J0IHtcbiAgICBmaWxsRXh0cnVzaW9uVW5pZm9ybXMsXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtcyxcbiAgICBmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1WYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3BhdHRlcm5Vbmlmb3JtVmFsdWVzfSBmcm9tICcuL3BhdHRlcm4uanMnO1xuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0yZixcbiAgICBVbmlmb3JtM2YsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQge2V4dGVuZH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZS5qcyc7XG5cbmV4cG9ydCB0eXBlIEZpbGxVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZlxufH07XG5cbmV4cG9ydCB0eXBlIEZpbGxPdXRsaW5lVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfd29ybGQnOiBVbmlmb3JtMmZcbnx9O1xuXG5leHBvcnQgdHlwZSBGaWxsUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgIC8vIHBhdHRlcm4gdW5pZm9ybXM6XG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IFVuaWZvcm0yZixcbiAgICAndV9waXhlbF9jb29yZF9sb3dlcic6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZSc6IFVuaWZvcm0zZixcbiAgICAndV9mYWRlJzogVW5pZm9ybTFmXG58fTtcblxuZXhwb3J0IHR5cGUgRmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfd29ybGQnOiBVbmlmb3JtMmYsXG4gICAgLy8gcGF0dGVybiB1bmlmb3JtczpcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X2ltYWdlJzogVW5pZm9ybTFpLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogVW5pZm9ybTJmLFxuICAgICd1X3NjYWxlJzogVW5pZm9ybTNmLFxuICAgICd1X2ZhZGUnOiBVbmlmb3JtMWZcbnx9O1xuXG5jb25zdCBmaWxsVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRmlsbFVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KVxufSk7XG5cbmNvbnN0IGZpbGxQYXR0ZXJuVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRmlsbFBhdHRlcm5Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF9sb3dlciksXG4gICAgJ3Vfc2NhbGUnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlKSxcbiAgICAndV9mYWRlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlKVxuXG59KTtcblxuY29uc3QgZmlsbE91dGxpbmVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBGaWxsT3V0bGluZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV93b3JsZCc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfd29ybGQpXG59KTtcblxuY29uc3QgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogRmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3dvcmxkJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV93b3JsZCksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF9sb3dlciksXG4gICAgJ3Vfc2NhbGUnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlKSxcbiAgICAndV9mYWRlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlKVxufSk7XG5cbmNvbnN0IGZpbGxVbmlmb3JtVmFsdWVzID0gKG1hdHJpeDogRmxvYXQzMkFycmF5KTogVW5pZm9ybVZhbHVlczxGaWxsVW5pZm9ybXNUeXBlPiA9PiAoe1xuICAgICd1X21hdHJpeCc6IG1hdHJpeFxufSk7XG5cbmNvbnN0IGZpbGxQYXR0ZXJuVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIGNyb3NzZmFkZTogQ3Jvc3NmYWRlUGFyYW1ldGVycyxcbiAgICB0aWxlOiBUaWxlXG4pOiBVbmlmb3JtVmFsdWVzPEZpbGxQYXR0ZXJuVW5pZm9ybXNUeXBlPiA9PiBleHRlbmQoXG4gICAgZmlsbFVuaWZvcm1WYWx1ZXMobWF0cml4KSxcbiAgICBwYXR0ZXJuVW5pZm9ybVZhbHVlcyhjcm9zc2ZhZGUsIHBhaW50ZXIsIHRpbGUpXG4pO1xuXG5jb25zdCBmaWxsT3V0bGluZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgZHJhd2luZ0J1ZmZlclNpemU6IFtudW1iZXIsIG51bWJlcl1cbik6IFVuaWZvcm1WYWx1ZXM8RmlsbE91dGxpbmVVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X3dvcmxkJzogZHJhd2luZ0J1ZmZlclNpemVcbn0pO1xuXG5jb25zdCBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgZHJhd2luZ0J1ZmZlclNpemU6IFtudW1iZXIsIG51bWJlcl1cbik6IFVuaWZvcm1WYWx1ZXM8RmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlPiA9PiBleHRlbmQoXG4gICAgZmlsbFBhdHRlcm5Vbmlmb3JtVmFsdWVzKG1hdHJpeCwgcGFpbnRlciwgY3Jvc3NmYWRlLCB0aWxlKSxcbiAgICB7XG4gICAgICAgICd1X3dvcmxkJzogZHJhd2luZ0J1ZmZlclNpemVcbiAgICB9XG4pO1xuXG5leHBvcnQge1xuICAgIGZpbGxVbmlmb3JtcyxcbiAgICBmaWxsUGF0dGVyblVuaWZvcm1zLFxuICAgIGZpbGxPdXRsaW5lVW5pZm9ybXMsXG4gICAgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybXMsXG4gICAgZmlsbFVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbFBhdHRlcm5Vbmlmb3JtVmFsdWVzLFxuICAgIGZpbGxPdXRsaW5lVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtTWF0cml4MmYsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB7Q2Fub25pY2FsVGlsZUlELCBPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB0eXBlIENpcmNsZVN0eWxlTGF5ZXIgZnJvbSAnLi4vLi4vc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlci5qcyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi8uLi91dGlsL2Jyb3dzZXIuanMnO1xuaW1wb3J0IHttYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHtnbG9iZVRvTWVyY2F0b3JUcmFuc2l0aW9uLCBnbG9iZVBpeGVsc1RvVGlsZVVuaXRzfSBmcm9tICcuLi8uLi9nZW8vcHJvamVjdGlvbi9nbG9iZV91dGlsLmpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vLi4vZGF0YS9leHRlbnQuanMnO1xuXG5leHBvcnQgdHlwZSBDaXJjbGVVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IFVuaWZvcm1NYXRyaXgyZixcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2ludl9yb3RfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X21lcmNfY2VudGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3RpbGVfaWQnOiBVbmlmb3JtM2YsXG4gICAgJ3Vfem9vbV90cmFuc2l0aW9uJzogVW5pZm9ybTFmLFxuICAgICd1X3VwX2Rpcic6IFVuaWZvcm0zZixcbnx9O1xuXG5leHBvcnQgdHlwZSBDaXJjbGVEZWZpbmVzVHlwZSA9ICdQSVRDSF9XSVRIX01BUCcgfCAnU0NBTEVfV0lUSF9NQVAnIHwgJ1BST0pFQ1RJT05fR0xPQkVfVklFVyc7XG5cbmNvbnN0IGNpcmNsZVVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IENpcmNsZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpLFxuICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBuZXcgVW5pZm9ybU1hdHJpeDJmKGNvbnRleHQsIGxvY2F0aW9ucy51X2V4dHJ1ZGVfc2NhbGUpLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZGV2aWNlX3BpeGVsX3JhdGlvKSxcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfaW52X3JvdF9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ludl9yb3RfbWF0cml4KSxcbiAgICAndV9tZXJjX2NlbnRlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfbWVyY19jZW50ZXIpLFxuICAgICd1X3RpbGVfaWQnOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RpbGVfaWQpLFxuICAgICd1X3pvb21fdHJhbnNpdGlvbic6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfem9vbV90cmFuc2l0aW9uKSxcbiAgICAndV91cF9kaXInOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3VwX2RpciksXG59KTtcblxuY29uc3QgaWRlbnRpdHlNYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuXG5jb25zdCBjaXJjbGVVbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQsXG4gICAgdGlsZTogVGlsZSxcbiAgICBpbnZNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBtZXJjYXRvckNlbnRlcjogW251bWJlciwgbnVtYmVyXSxcbiAgICBsYXllcjogQ2lyY2xlU3R5bGVMYXllclxuKTogVW5pZm9ybVZhbHVlczxDaXJjbGVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCBpc0dsb2JlID0gdHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJztcblxuICAgIGxldCBleHRydWRlU2NhbGU7XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXBpdGNoLWFsaWdubWVudCcpID09PSAnbWFwJykge1xuICAgICAgICBpZiAoaXNHbG9iZSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IGdsb2JlUGl4ZWxzVG9UaWxlVW5pdHModHJhbnNmb3JtLnpvb20sIGNvb3JkLmNhbm9uaWNhbCkgKiB0cmFuc2Zvcm0uX3Byb2plY3Rpb25TY2FsZXI7XG4gICAgICAgICAgICBleHRydWRlU2NhbGUgPSBGbG9hdDMyQXJyYXkuZnJvbShbcywgMCwgMCwgc10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXh0cnVkZVNjYWxlID0gdHJhbnNmb3JtLmNhbGN1bGF0ZVBpeGVsc1RvVGlsZVVuaXRzTWF0cml4KHRpbGUpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXh0cnVkZVNjYWxlID0gbmV3IEZsb2F0MzJBcnJheShbXG4gICAgICAgICAgICB0cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzBdLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB0cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzFdXSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzID0ge1xuICAgICAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsXG4gICAgICAgICd1X21hdHJpeCc6IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KFxuICAgICAgICAgICAgY29vcmQucHJvak1hdHJpeCxcbiAgICAgICAgICAgIHRpbGUsXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ2NpcmNsZS10cmFuc2xhdGUnKSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3InKSksXG4gICAgICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgJ3VfZXh0cnVkZV9zY2FsZSc6IGV4dHJ1ZGVTY2FsZSxcbiAgICAgICAgJ3VfaW52X3JvdF9tYXRyaXgnOiBpZGVudGl0eU1hdHJpeCxcbiAgICAgICAgJ3VfbWVyY19jZW50ZXInOiBbMCwgMF0sXG4gICAgICAgICd1X3RpbGVfaWQnOiBbMCwgMCwgMF0sXG4gICAgICAgICd1X3pvb21fdHJhbnNpdGlvbic6IDAsXG4gICAgICAgICd1X3VwX2Rpcic6IFswLCAwLCAwXVxuICAgIH07XG5cbiAgICBpZiAoaXNHbG9iZSkge1xuICAgICAgICB2YWx1ZXNbJ3VfaW52X3JvdF9tYXRyaXgnXSA9IGludk1hdHJpeDtcbiAgICAgICAgdmFsdWVzWyd1X21lcmNfY2VudGVyJ10gPSBtZXJjYXRvckNlbnRlcjtcbiAgICAgICAgdmFsdWVzWyd1X3RpbGVfaWQnXSA9IFtjb29yZC5jYW5vbmljYWwueCwgY29vcmQuY2Fub25pY2FsLnksIDEgPDwgY29vcmQuY2Fub25pY2FsLnpdO1xuICAgICAgICB2YWx1ZXNbJ3Vfem9vbV90cmFuc2l0aW9uJ10gPSBnbG9iZVRvTWVyY2F0b3JUcmFuc2l0aW9uKHRyYW5zZm9ybS56b29tKTtcbiAgICAgICAgY29uc3QgeCA9IG1lcmNhdG9yQ2VudGVyWzBdICogRVhURU5UO1xuICAgICAgICBjb25zdCB5ID0gbWVyY2F0b3JDZW50ZXJbMV0gKiBFWFRFTlQ7XG4gICAgICAgIHZhbHVlc1sndV91cF9kaXInXSA9ICh0cmFuc2Zvcm0ucHJvamVjdGlvbi51cFZlY3RvcihuZXcgQ2Fub25pY2FsVGlsZUlEKDAsIDAsIDApLCB4LCB5KTogYW55KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxuY29uc3QgY2lyY2xlRGVmaW5lc1ZhbHVlcyA9IChsYXllcjogQ2lyY2xlU3R5bGVMYXllcik6IENpcmNsZURlZmluZXNUeXBlW10gPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgIGlmIChsYXllci5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1hbGlnbm1lbnQnKSA9PT0gJ21hcCcpIHZhbHVlcy5wdXNoKCdQSVRDSF9XSVRIX01BUCcpO1xuICAgIGlmIChsYXllci5wYWludC5nZXQoJ2NpcmNsZS1waXRjaC1zY2FsZScpID09PSAnbWFwJykgdmFsdWVzLnB1c2goJ1NDQUxFX1dJVEhfTUFQJyk7XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxuZXhwb3J0IHtjaXJjbGVVbmlmb3JtcywgY2lyY2xlVW5pZm9ybVZhbHVlcywgY2lyY2xlRGVmaW5lc1ZhbHVlc307XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uLy4uL2RhdGEvZXh0ZW50LmpzJztcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi8uLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUgUHJvamVjdGlvbiBmcm9tICcuLi8uLi9nZW8vcHJvamVjdGlvbi9wcm9qZWN0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgQ29sbGlzaW9uVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IFVuaWZvcm0xZixcbiAgICAndV9leHRydWRlX3NjYWxlJzogVW5pZm9ybTJmXG58fTtcblxuZXhwb3J0IHR5cGUgQ29sbGlzaW9uQ2lyY2xlVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfaW52X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogVW5pZm9ybTFmLFxuICAgICd1X3ZpZXdwb3J0X3NpemUnOiBVbmlmb3JtMmZcbnx9O1xuXG5jb25zdCBjb2xsaXNpb25Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBDb2xsaXNpb25Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfZXh0cnVkZV9zY2FsZSlcbn0pO1xuXG5jb25zdCBjb2xsaXNpb25DaXJjbGVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBDb2xsaXNpb25DaXJjbGVVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3VfaW52X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfaW52X21hdHJpeCksXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgJ3Vfdmlld3BvcnRfc2l6ZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdmlld3BvcnRfc2l6ZSlcbn0pO1xuXG5jb25zdCBjb2xsaXNpb25Vbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtLFxuICAgIHRpbGU6IFRpbGUsXG4gICAgcHJvamVjdGlvbjogUHJvamVjdGlvblxuKTogVW5pZm9ybVZhbHVlczxDb2xsaXNpb25Vbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCBwaXhlbFJhdGlvID0gRVhURU5UIC8gdGlsZS50aWxlU2l6ZTtcblxuICAgIHJldHVybiB7XG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IHRyYW5zZm9ybS5nZXRDYW1lcmFUb0NlbnRlckRpc3RhbmNlKHByb2plY3Rpb24pLFxuICAgICAgICAndV9leHRydWRlX3NjYWxlJzogW3RyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0gLyBwaXhlbFJhdGlvLFxuICAgICAgICAgICAgdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1sxXSAvIHBpeGVsUmF0aW9dXG4gICAgfTtcbn07XG5cbmNvbnN0IGNvbGxpc2lvbkNpcmNsZVVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgaW52TWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgdHJhbnNmb3JtOiBUcmFuc2Zvcm0sXG4gICAgcHJvamVjdGlvbjogUHJvamVjdGlvblxuKTogVW5pZm9ybVZhbHVlczxDb2xsaXNpb25DaXJjbGVVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgICAgICd1X2ludl9tYXRyaXgnOiBpbnZNYXRyaXgsXG4gICAgICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiB0cmFuc2Zvcm0uZ2V0Q2FtZXJhVG9DZW50ZXJEaXN0YW5jZShwcm9qZWN0aW9uKSxcbiAgICAgICAgJ3Vfdmlld3BvcnRfc2l6ZSc6IFt0cmFuc2Zvcm0ud2lkdGgsIHRyYW5zZm9ybS5oZWlnaHRdXG4gICAgfTtcbn07XG5cbmV4cG9ydCB7Y29sbGlzaW9uVW5pZm9ybXMsIGNvbGxpc2lvblVuaWZvcm1WYWx1ZXMsIGNvbGxpc2lvbkNpcmNsZVVuaWZvcm1zLCBjb2xsaXNpb25DaXJjbGVVbmlmb3JtVmFsdWVzfTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgVW5pZm9ybUNvbG9yLFxuICAgIFVuaWZvcm1NYXRyaXg0ZixcbiAgICBVbmlmb3JtMWksXG4gICAgVW5pZm9ybTFmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIENvbG9yIGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5cbmV4cG9ydCB0eXBlIERlYnVnVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9jb2xvcic6IFVuaWZvcm1Db2xvcixcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfb3ZlcmxheSc6IFVuaWZvcm0xaSxcbiAgICAndV9vdmVybGF5X3NjYWxlJzogVW5pZm9ybTFmXG58fTtcblxuY29uc3QgZGVidWdVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBEZWJ1Z1VuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2NvbG9yJzogbmV3IFVuaWZvcm1Db2xvcihjb250ZXh0LCBsb2NhdGlvbnMudV9jb2xvciksXG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X292ZXJsYXknOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X292ZXJsYXkpLFxuICAgICd1X292ZXJsYXlfc2NhbGUnOiAgbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9vdmVybGF5X3NjYWxlKSxcbn0pO1xuXG5jb25zdCBkZWJ1Z1VuaWZvcm1WYWx1ZXMgPSAobWF0cml4OiBGbG9hdDMyQXJyYXksIGNvbG9yOiBDb2xvciwgc2NhbGVSYXRpbzogbnVtYmVyID0gMSk6IFVuaWZvcm1WYWx1ZXM8RGVidWdVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X2NvbG9yJzogY29sb3IsXG4gICAgJ3Vfb3ZlcmxheSc6IDAsXG4gICAgJ3Vfb3ZlcmxheV9zY2FsZSc6IHNjYWxlUmF0aW9cbn0pO1xuXG5leHBvcnQge2RlYnVnVW5pZm9ybXMsIGRlYnVnVW5pZm9ybVZhbHVlc307XG5cbmV4cG9ydCB0eXBlIERlYnVnRGVmaW5lc1R5cGUgPSAnUFJPSkVDVElPTl9HTE9CRV9WSUVXJztcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7XG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0xZixcbiAgICBVbmlmb3JtMmYsXG4gICAgVW5pZm9ybTNmLFxuICAgIFVuaWZvcm1NYXRyaXg0ZlxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHBpeGVsc1RvVGlsZVVuaXRzIGZyb20gJy4uLy4uL3NvdXJjZS9waXhlbHNfdG9fdGlsZV91bml0cy5qcyc7XG5cbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSAnLi4vLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uLy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIEhlYXRtYXBTdHlsZUxheWVyIGZyb20gJy4uLy4uL3N0eWxlL3N0eWxlX2xheWVyL2hlYXRtYXBfc3R5bGVfbGF5ZXIuanMnO1xuaW1wb3J0IHtDYW5vbmljYWxUaWxlSUQsIE92ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7Z2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbiwgZ2xvYmVQaXhlbHNUb1RpbGVVbml0c30gZnJvbSAnLi4vLi4vZ2VvL3Byb2plY3Rpb24vZ2xvYmVfdXRpbC5qcyc7XG5pbXBvcnQgRVhURU5UIGZyb20gJy4uLy4uL2RhdGEvZXh0ZW50LmpzJztcblxuZXhwb3J0IHR5cGUgSGVhdG1hcFVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfZXh0cnVkZV9zY2FsZSc6IFVuaWZvcm0xZixcbiAgICAndV9pbnRlbnNpdHknOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2ludl9yb3RfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X21lcmNfY2VudGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3RpbGVfaWQnOiBVbmlmb3JtM2YsXG4gICAgJ3Vfem9vbV90cmFuc2l0aW9uJzogVW5pZm9ybTFmLFxuICAgICd1X3VwX2Rpcic6IFVuaWZvcm0zZixcbnx9O1xuXG5leHBvcnQgdHlwZSBIZWF0bWFwVGV4dHVyZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfaW1hZ2UnOiBVbmlmb3JtMWksXG4gICAgJ3VfY29sb3JfcmFtcCc6IFVuaWZvcm0xaSxcbiAgICAndV9vcGFjaXR5JzogVW5pZm9ybTFmXG58fTtcblxuY29uc3QgaGVhdG1hcFVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEhlYXRtYXBVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9leHRydWRlX3NjYWxlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9leHRydWRlX3NjYWxlKSxcbiAgICAndV9pbnRlbnNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ludGVuc2l0eSksXG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2ludl9yb3RfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9pbnZfcm90X21hdHJpeCksXG4gICAgJ3VfbWVyY19jZW50ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X21lcmNfY2VudGVyKSxcbiAgICAndV90aWxlX2lkJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX2lkKSxcbiAgICAndV96b29tX3RyYW5zaXRpb24nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3pvb21fdHJhbnNpdGlvbiksXG4gICAgJ3VfdXBfZGlyJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV91cF9kaXIpXG59KTtcblxuY29uc3QgaGVhdG1hcFRleHR1cmVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBIZWF0bWFwVGV4dHVyZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfY29sb3JfcmFtcCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfY29sb3JfcmFtcCksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSlcbn0pO1xuXG5jb25zdCBpZGVudGl0eU1hdHJpeCA9IG1hdDQuY3JlYXRlKCk7XG5cbmNvbnN0IGhlYXRtYXBVbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQsXG4gICAgdGlsZTogVGlsZSxcbiAgICBpbnZNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBtZXJjYXRvckNlbnRlcjogW251bWJlciwgbnVtYmVyXSxcbiAgICB6b29tOiBudW1iZXIsXG4gICAgaW50ZW5zaXR5OiBudW1iZXJcbik6IFVuaWZvcm1WYWx1ZXM8SGVhdG1hcFVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IGlzR2xvYmUgPSB0cmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnO1xuICAgIGNvbnN0IGV4dHJ1ZGVTY2FsZSA9IGlzR2xvYmUgPyBnbG9iZVBpeGVsc1RvVGlsZVVuaXRzKHRyYW5zZm9ybS56b29tLCBjb29yZC5jYW5vbmljYWwpICogdHJhbnNmb3JtLl9wcm9qZWN0aW9uU2NhbGVyIDogcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgem9vbSk7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgICd1X21hdHJpeCc6IGNvb3JkLnByb2pNYXRyaXgsXG4gICAgICAgICd1X2V4dHJ1ZGVfc2NhbGUnOiBleHRydWRlU2NhbGUsXG4gICAgICAgICd1X2ludGVuc2l0eSc6IGludGVuc2l0eSxcbiAgICAgICAgJ3VfaW52X3JvdF9tYXRyaXgnOiBpZGVudGl0eU1hdHJpeCxcbiAgICAgICAgJ3VfbWVyY19jZW50ZXInOiBbMCwgMF0sXG4gICAgICAgICd1X3RpbGVfaWQnOiBbMCwgMCwgMF0sXG4gICAgICAgICd1X3pvb21fdHJhbnNpdGlvbic6IDAsXG4gICAgICAgICd1X3VwX2Rpcic6IFswLCAwLCAwXSxcbiAgICB9O1xuXG4gICAgaWYgKGlzR2xvYmUpIHtcbiAgICAgICAgdmFsdWVzWyd1X2ludl9yb3RfbWF0cml4J10gPSBpbnZNYXRyaXg7XG4gICAgICAgIHZhbHVlc1sndV9tZXJjX2NlbnRlciddID0gbWVyY2F0b3JDZW50ZXI7XG4gICAgICAgIHZhbHVlc1sndV90aWxlX2lkJ10gPSBbY29vcmQuY2Fub25pY2FsLngsIGNvb3JkLmNhbm9uaWNhbC55LCAxIDw8IGNvb3JkLmNhbm9uaWNhbC56XTtcbiAgICAgICAgdmFsdWVzWyd1X3pvb21fdHJhbnNpdGlvbiddID0gZ2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbih0cmFuc2Zvcm0uem9vbSk7XG4gICAgICAgIGNvbnN0IHggPSBtZXJjYXRvckNlbnRlclswXSAqIEVYVEVOVDtcbiAgICAgICAgY29uc3QgeSA9IG1lcmNhdG9yQ2VudGVyWzFdICogRVhURU5UO1xuICAgICAgICB2YWx1ZXNbJ3VfdXBfZGlyJ10gPSAodHJhbnNmb3JtLnByb2plY3Rpb24udXBWZWN0b3IobmV3IENhbm9uaWNhbFRpbGVJRCgwLCAwLCAwKSwgeCwgeSk6IGFueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbn07XG5cbmNvbnN0IGhlYXRtYXBUZXh0dXJlVW5pZm9ybVZhbHVlcyA9IChcbiAgICBwYWludGVyOiBQYWludGVyLFxuICAgIGxheWVyOiBIZWF0bWFwU3R5bGVMYXllcixcbiAgICB0ZXh0dXJlVW5pdDogbnVtYmVyLFxuICAgIGNvbG9yUmFtcFVuaXQ6IG51bWJlclxuKTogVW5pZm9ybVZhbHVlczxIZWF0bWFwVGV4dHVyZVVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgICd1X2ltYWdlJzogdGV4dHVyZVVuaXQsXG4gICAgICAgICd1X2NvbG9yX3JhbXAnOiBjb2xvclJhbXBVbml0LFxuICAgICAgICAndV9vcGFjaXR5JzogbGF5ZXIucGFpbnQuZ2V0KCdoZWF0bWFwLW9wYWNpdHknKVxuICAgIH07XG59O1xuXG5leHBvcnQge1xuICAgIGhlYXRtYXBVbmlmb3JtcyxcbiAgICBoZWF0bWFwVGV4dHVyZVVuaWZvcm1zLFxuICAgIGhlYXRtYXBVbmlmb3JtVmFsdWVzLFxuICAgIGhlYXRtYXBUZXh0dXJlVW5pZm9ybVZhbHVlc1xufTtcblxuZXhwb3J0IHR5cGUgSGVhdG1hcERlZmluZXNUeXBlID0gJ1BST0pFQ1RJT05fR0xPQkVfVklFVyc7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtTWF0cml4MmYsXG4gICAgVW5pZm9ybU1hdHJpeDRmXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgcGl4ZWxzVG9UaWxlVW5pdHMgZnJvbSAnLi4vLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzLmpzJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uLy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUgVGlsZSBmcm9tICcuLi8uLi9zb3VyY2UvdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSBMaW5lU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9saW5lX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NmYWRlUGFyYW1ldGVyc30gZnJvbSAnLi4vLi4vc3R5bGUvZXZhbHVhdGlvbl9wYXJhbWV0ZXJzLmpzJztcblxuZXhwb3J0IHR5cGUgTGluZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3BpeGVsc190b190aWxlX3VuaXRzJzogVW5pZm9ybU1hdHJpeDJmLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV91bml0c190b19waXhlbHMnOiBVbmlmb3JtMmYsXG4gICAgJ3VfZGFzaF9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV9ncmFkaWVudF9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV9pbWFnZV9oZWlnaHQnOiBVbmlmb3JtMWYsXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9zY2FsZSc6IFVuaWZvcm0zZixcbiAgICAndV9taXgnOiBVbmlmb3JtMWYsXG4gICAgJ3VfYWxwaGFfZGlzY2FyZF90aHJlc2hvbGQnOiBVbmlmb3JtMWYsXG4gICAgJ3VfdHJpbV9vZmZzZXQnOiBVbmlmb3JtMmZcbnx9O1xuXG5leHBvcnQgdHlwZSBMaW5lUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGl4ZWxzX3RvX3RpbGVfdW5pdHMnOiBVbmlmb3JtTWF0cml4MmYsXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X3VuaXRzX3RvX3BpeGVscyc6IFVuaWZvcm0yZixcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV9zY2FsZSc6IFVuaWZvcm0zZixcbiAgICAndV9mYWRlJzogVW5pZm9ybTFmLFxuICAgICd1X2FscGhhX2Rpc2NhcmRfdGhyZXNob2xkJzogVW5pZm9ybTFmXG58fTtcblxuZXhwb3J0IHR5cGUgTGluZURlZmluZXNUeXBlID0gJ1JFTkRFUl9MSU5FX0dSQURJRU5UJyB8ICdSRU5ERVJfTElORV9EQVNIJyB8ICdSRU5ERVJfTElORV9BTFBIQV9ESVNDQVJEJyB8ICdSRU5ERVJfTElORV9UUklNX09GRlNFVCc7XG5cbmNvbnN0IGxpbmVVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBMaW5lVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3BpeGVsc190b190aWxlX3VuaXRzJzogbmV3IFVuaWZvcm1NYXRyaXgyZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbHNfdG9fdGlsZV91bml0cyksXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICd1X3VuaXRzX3RvX3BpeGVscyc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdW5pdHNfdG9fcGl4ZWxzKSxcbiAgICAndV9kYXNoX2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9kYXNoX2ltYWdlKSxcbiAgICAndV9ncmFkaWVudF9pbWFnZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfZ3JhZGllbnRfaW1hZ2UpLFxuICAgICd1X2ltYWdlX2hlaWdodCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2VfaGVpZ2h0KSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV9zY2FsZSc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfc2NhbGUpLFxuICAgICd1X21peCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfbWl4KSxcbiAgICAndV9hbHBoYV9kaXNjYXJkX3RocmVzaG9sZCc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfYWxwaGFfZGlzY2FyZF90aHJlc2hvbGQpLFxuICAgICd1X3RyaW1fb2Zmc2V0JzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90cmltX29mZnNldClcbn0pO1xuXG5jb25zdCBsaW5lUGF0dGVyblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IExpbmVQYXR0ZXJuVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3RleHNpemUnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemUpLFxuICAgICd1X3BpeGVsc190b190aWxlX3VuaXRzJzogbmV3IFVuaWZvcm1NYXRyaXgyZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbHNfdG9fdGlsZV91bml0cyksXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICd1X2ltYWdlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pbWFnZSksXG4gICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV91bml0c190b19waXhlbHMpLFxuICAgICd1X3NjYWxlJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9zY2FsZSksXG4gICAgJ3VfZmFkZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZmFkZSksXG4gICAgJ3VfYWxwaGFfZGlzY2FyZF90aHJlc2hvbGQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2FscGhhX2Rpc2NhcmRfdGhyZXNob2xkKVxufSk7XG5cbmNvbnN0IGxpbmVVbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgdGlsZTogVGlsZSxcbiAgICBsYXllcjogTGluZVN0eWxlTGF5ZXIsXG4gICAgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzLFxuICAgIG1hdHJpeDogP0Zsb2F0MzJBcnJheSxcbiAgICBpbWFnZUhlaWdodDogbnVtYmVyLFxuICAgIHBpeGVsUmF0aW86IG51bWJlcixcbiAgICB0cmltT2Zmc2V0OiBbbnVtYmVyLCBudW1iZXJdLFxuKTogVW5pZm9ybVZhbHVlczxMaW5lVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gcGFpbnRlci50cmFuc2Zvcm07XG4gICAgY29uc3QgcGl4ZWxzVG9UaWxlVW5pdHMgPSB0cmFuc2Zvcm0uY2FsY3VsYXRlUGl4ZWxzVG9UaWxlVW5pdHNNYXRyaXgodGlsZSk7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgICd1X21hdHJpeCc6IGNhbGN1bGF0ZU1hdHJpeChwYWludGVyLCB0aWxlLCBsYXllciwgbWF0cml4KSxcbiAgICAgICAgJ3VfcGl4ZWxzX3RvX3RpbGVfdW5pdHMnOiBwaXhlbHNUb1RpbGVVbml0cyxcbiAgICAgICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogcGl4ZWxSYXRpbyxcbiAgICAgICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogW1xuICAgICAgICAgICAgMSAvIHRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0sXG4gICAgICAgICAgICAxIC8gdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1sxXVxuICAgICAgICBdLFxuICAgICAgICAndV9kYXNoX2ltYWdlJzogMCxcbiAgICAgICAgJ3VfZ3JhZGllbnRfaW1hZ2UnOiAxLFxuICAgICAgICAndV9pbWFnZV9oZWlnaHQnOiBpbWFnZUhlaWdodCxcbiAgICAgICAgJ3VfdGV4c2l6ZSc6IFswLCAwXSxcbiAgICAgICAgJ3Vfc2NhbGUnOiBbMCwgMCwgMF0sXG4gICAgICAgICd1X21peCc6IDAsXG4gICAgICAgICd1X2FscGhhX2Rpc2NhcmRfdGhyZXNob2xkJzogMC4wLFxuICAgICAgICAndV90cmltX29mZnNldCc6IHRyaW1PZmZzZXRcbiAgICB9O1xuICAgIGlmIChoYXNEYXNoKGxheWVyKSkge1xuICAgICAgICBjb25zdCB0aWxlWm9vbVJhdGlvID0gY2FsY3VsYXRlVGlsZVJhdGlvKHRpbGUsIHBhaW50ZXIudHJhbnNmb3JtKTtcbiAgICAgICAgdmFsdWVzWyd1X3RleHNpemUnXSA9IHRpbGUubGluZUF0bGFzVGV4dHVyZS5zaXplO1xuICAgICAgICB2YWx1ZXNbJ3Vfc2NhbGUnXSA9IFt0aWxlWm9vbVJhdGlvLCBjcm9zc2ZhZGUuZnJvbVNjYWxlLCBjcm9zc2ZhZGUudG9TY2FsZV07XG4gICAgICAgIHZhbHVlc1sndV9taXgnXSA9IGNyb3NzZmFkZS50O1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxuY29uc3QgbGluZVBhdHRlcm5Vbmlmb3JtVmFsdWVzID0gKFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgdGlsZTogVGlsZSxcbiAgICBsYXllcjogTGluZVN0eWxlTGF5ZXIsXG4gICAgY3Jvc3NmYWRlOiBDcm9zc2ZhZGVQYXJhbWV0ZXJzLFxuICAgIG1hdHJpeDogP0Zsb2F0MzJBcnJheSxcbiAgICBwaXhlbFJhdGlvOiBudW1iZXJcbik6IFVuaWZvcm1WYWx1ZXM8TGluZVBhdHRlcm5Vbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCB0aWxlWm9vbVJhdGlvID0gY2FsY3VsYXRlVGlsZVJhdGlvKHRpbGUsIHRyYW5zZm9ybSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3VfbWF0cml4JzogY2FsY3VsYXRlTWF0cml4KHBhaW50ZXIsIHRpbGUsIGxheWVyLCBtYXRyaXgpLFxuICAgICAgICAndV90ZXhzaXplJzogdGlsZS5pbWFnZUF0bGFzVGV4dHVyZS5zaXplLFxuICAgICAgICAvLyBjYW1lcmEgem9vbSByYXRpb1xuICAgICAgICAndV9waXhlbHNfdG9fdGlsZV91bml0cyc6IHRyYW5zZm9ybS5jYWxjdWxhdGVQaXhlbHNUb1RpbGVVbml0c01hdHJpeCh0aWxlKSxcbiAgICAgICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogcGl4ZWxSYXRpbyxcbiAgICAgICAgJ3VfaW1hZ2UnOiAwLFxuICAgICAgICAndV9zY2FsZSc6IFt0aWxlWm9vbVJhdGlvLCBjcm9zc2ZhZGUuZnJvbVNjYWxlLCBjcm9zc2ZhZGUudG9TY2FsZV0sXG4gICAgICAgICd1X2ZhZGUnOiBjcm9zc2ZhZGUudCxcbiAgICAgICAgJ3VfdW5pdHNfdG9fcGl4ZWxzJzogW1xuICAgICAgICAgICAgMSAvIHRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0sXG4gICAgICAgICAgICAxIC8gdHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1sxXVxuICAgICAgICBdLFxuICAgICAgICAndV9hbHBoYV9kaXNjYXJkX3RocmVzaG9sZCc6IDAuMFxuICAgIH07XG59O1xuXG5mdW5jdGlvbiBjYWxjdWxhdGVUaWxlUmF0aW8odGlsZTogVGlsZSwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gMSAvIHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIDEsIHRyYW5zZm9ybS50aWxlWm9vbSk7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1hdHJpeChwYWludGVyLCB0aWxlLCBsYXllciwgbWF0cml4KSB7XG4gICAgcmV0dXJuIHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KFxuICAgICAgICBtYXRyaXggPyBtYXRyaXggOiB0aWxlLnRpbGVJRC5wcm9qTWF0cml4LFxuICAgICAgICB0aWxlLFxuICAgICAgICBsYXllci5wYWludC5nZXQoJ2xpbmUtdHJhbnNsYXRlJyksXG4gICAgICAgIGxheWVyLnBhaW50LmdldCgnbGluZS10cmFuc2xhdGUtYW5jaG9yJylcbiAgICApO1xufVxuXG5jb25zdCBsaW5lRGVmaW5lc1ZhbHVlcyA9IChsYXllcjogTGluZVN0eWxlTGF5ZXIpOiBMaW5lRGVmaW5lc1R5cGVbXSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgaWYgKGhhc0Rhc2gobGF5ZXIpKSB2YWx1ZXMucHVzaCgnUkVOREVSX0xJTkVfREFTSCcpO1xuICAgIGlmIChsYXllci5wYWludC5nZXQoJ2xpbmUtZ3JhZGllbnQnKSkgdmFsdWVzLnB1c2goJ1JFTkRFUl9MSU5FX0dSQURJRU5UJyk7XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnbGluZS10cmltLW9mZnNldCcpKSB2YWx1ZXMucHVzaCgnUkVOREVSX0xJTkVfVFJJTV9PRkZTRVQnKTtcblxuICAgIGNvbnN0IGhhc1BhdHRlcm4gPSBsYXllci5wYWludC5nZXQoJ2xpbmUtcGF0dGVybicpLmNvbnN0YW50T3IoKDE6IGFueSkpO1xuICAgIGNvbnN0IGhhc09wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtb3BhY2l0eScpLmNvbnN0YW50T3IoMS4wKSAhPT0gMS4wO1xuICAgIGlmICghaGFzUGF0dGVybiAmJiBoYXNPcGFjaXR5KSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKCdSRU5ERVJfTElORV9BTFBIQV9ESVNDQVJEJyk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG59O1xuXG5mdW5jdGlvbiBoYXNEYXNoKGxheWVyKSB7XG4gICAgY29uc3QgZGFzaFByb3BlcnR5VmFsdWUgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtZGFzaGFycmF5JykudmFsdWU7XG4gICAgcmV0dXJuIGRhc2hQcm9wZXJ0eVZhbHVlLnZhbHVlIHx8IGRhc2hQcm9wZXJ0eVZhbHVlLmtpbmQgIT09IFwiY29uc3RhbnRcIjtcbn1cblxuZXhwb3J0IHtcbiAgICBsaW5lVW5pZm9ybXMsXG4gICAgbGluZVBhdHRlcm5Vbmlmb3JtcyxcbiAgICBsaW5lVW5pZm9ybVZhbHVlcyxcbiAgICBsaW5lUGF0dGVyblVuaWZvcm1WYWx1ZXMsXG4gICAgbGluZURlZmluZXNWYWx1ZXNcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcblxuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgUmFzdGVyU3R5bGVMYXllciBmcm9tICcuLi8uLi9zdHlsZS9zdHlsZV9sYXllci9yYXN0ZXJfc3R5bGVfbGF5ZXIuanMnO1xuXG5leHBvcnQgdHlwZSBSYXN0ZXJVbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV90bF9wYXJlbnQnOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGVfcGFyZW50JzogVW5pZm9ybTFmLFxuICAgICd1X2ZhZGVfdCc6IFVuaWZvcm0xZixcbiAgICAndV9vcGFjaXR5JzogVW5pZm9ybTFmLFxuICAgICd1X2ltYWdlMCc6IFVuaWZvcm0xaSxcbiAgICAndV9pbWFnZTEnOiBVbmlmb3JtMWksXG4gICAgJ3VfYnJpZ2h0bmVzc19sb3cnOiBVbmlmb3JtMWYsXG4gICAgJ3VfYnJpZ2h0bmVzc19oaWdoJzogVW5pZm9ybTFmLFxuICAgICd1X3NhdHVyYXRpb25fZmFjdG9yJzogVW5pZm9ybTFmLFxuICAgICd1X2NvbnRyYXN0X2ZhY3Rvcic6IFVuaWZvcm0xZixcbiAgICAndV9zcGluX3dlaWdodHMnOiBVbmlmb3JtM2YsXG4gICAgJ3VfcGVyc3BlY3RpdmVfdHJhbnNmb3JtJzogVW5pZm9ybTJmXG58fTtcblxuY29uc3QgcmFzdGVyVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogUmFzdGVyVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X3RsX3BhcmVudCc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGxfcGFyZW50KSxcbiAgICAndV9zY2FsZV9wYXJlbnQnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NjYWxlX3BhcmVudCksXG4gICAgJ3VfZmFkZV90JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlX3QpLFxuICAgICd1X29wYWNpdHknOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X29wYWNpdHkpLFxuICAgICd1X2ltYWdlMCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaW1hZ2UwKSxcbiAgICAndV9pbWFnZTEnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlMSksXG4gICAgJ3VfYnJpZ2h0bmVzc19sb3cnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2JyaWdodG5lc3NfbG93KSxcbiAgICAndV9icmlnaHRuZXNzX2hpZ2gnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2JyaWdodG5lc3NfaGlnaCksXG4gICAgJ3Vfc2F0dXJhdGlvbl9mYWN0b3InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NhdHVyYXRpb25fZmFjdG9yKSxcbiAgICAndV9jb250cmFzdF9mYWN0b3InOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2NvbnRyYXN0X2ZhY3RvciksXG4gICAgJ3Vfc3Bpbl93ZWlnaHRzJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9zcGluX3dlaWdodHMpLFxuICAgICd1X3BlcnNwZWN0aXZlX3RyYW5zZm9ybSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGVyc3BlY3RpdmVfdHJhbnNmb3JtKVxufSk7XG5cbmNvbnN0IHJhc3RlclVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgcGFyZW50VEw6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcGFyZW50U2NhbGVCeTogbnVtYmVyLFxuICAgIGZhZGU6IHttaXg6IG51bWJlciwgb3BhY2l0eTogbnVtYmVyfSxcbiAgICBsYXllcjogUmFzdGVyU3R5bGVMYXllcixcbiAgICBwZXJzcGVjdGl2ZVRyYW5zZm9ybTogW251bWJlciwgbnVtYmVyXVxuKTogVW5pZm9ybVZhbHVlczxSYXN0ZXJVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X3RsX3BhcmVudCc6IHBhcmVudFRMLFxuICAgICd1X3NjYWxlX3BhcmVudCc6IHBhcmVudFNjYWxlQnksXG4gICAgJ3VfZmFkZV90JzogZmFkZS5taXgsXG4gICAgJ3Vfb3BhY2l0eSc6IGZhZGUub3BhY2l0eSAqIGxheWVyLnBhaW50LmdldCgncmFzdGVyLW9wYWNpdHknKSxcbiAgICAndV9pbWFnZTAnOiAwLFxuICAgICd1X2ltYWdlMSc6IDEsXG4gICAgJ3VfYnJpZ2h0bmVzc19sb3cnOiBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1icmlnaHRuZXNzLW1pbicpLFxuICAgICd1X2JyaWdodG5lc3NfaGlnaCc6IGxheWVyLnBhaW50LmdldCgncmFzdGVyLWJyaWdodG5lc3MtbWF4JyksXG4gICAgJ3Vfc2F0dXJhdGlvbl9mYWN0b3InOiBzYXR1cmF0aW9uRmFjdG9yKGxheWVyLnBhaW50LmdldCgncmFzdGVyLXNhdHVyYXRpb24nKSksXG4gICAgJ3VfY29udHJhc3RfZmFjdG9yJzogY29udHJhc3RGYWN0b3IobGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItY29udHJhc3QnKSksXG4gICAgJ3Vfc3Bpbl93ZWlnaHRzJzogc3BpbldlaWdodHMobGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItaHVlLXJvdGF0ZScpKSxcbiAgICAndV9wZXJzcGVjdGl2ZV90cmFuc2Zvcm0nOiBwZXJzcGVjdGl2ZVRyYW5zZm9ybVxufSk7XG5cbmZ1bmN0aW9uIHNwaW5XZWlnaHRzKGFuZ2xlKSB7XG4gICAgYW5nbGUgKj0gTWF0aC5QSSAvIDE4MDtcbiAgICBjb25zdCBzID0gTWF0aC5zaW4oYW5nbGUpO1xuICAgIGNvbnN0IGMgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgKDIgKiBjICsgMSkgLyAzLFxuICAgICAgICAoLU1hdGguc3FydCgzKSAqIHMgLSBjICsgMSkgLyAzLFxuICAgICAgICAoTWF0aC5zcXJ0KDMpICogcyAtIGMgKyAxKSAvIDNcbiAgICBdO1xufVxuXG5mdW5jdGlvbiBjb250cmFzdEZhY3Rvcihjb250cmFzdCkge1xuICAgIHJldHVybiBjb250cmFzdCA+IDAgP1xuICAgICAgICAxIC8gKDEgLSBjb250cmFzdCkgOlxuICAgICAgICAxICsgY29udHJhc3Q7XG59XG5cbmZ1bmN0aW9uIHNhdHVyYXRpb25GYWN0b3Ioc2F0dXJhdGlvbikge1xuICAgIHJldHVybiBzYXR1cmF0aW9uID4gMCA/XG4gICAgICAgIDEgLSAxIC8gKDEuMDAxIC0gc2F0dXJhdGlvbikgOlxuICAgICAgICAtc2F0dXJhdGlvbjtcbn1cblxuZXhwb3J0IHtyYXN0ZXJVbmlmb3JtcywgcmFzdGVyVW5pZm9ybVZhbHVlc307XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyLmpzJztcbmltcG9ydCB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi4vcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlcywgVW5pZm9ybUxvY2F0aW9uc30gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB7Z2xvYmVFQ0VGT3JpZ2lufSBmcm9tICcuLi8uLi9nZW8vcHJvamVjdGlvbi9nbG9iZV91dGlsLmpzJztcbmltcG9ydCB0eXBlIFByb2plY3Rpb24gZnJvbSAnLi4vLi4vZ2VvL3Byb2plY3Rpb24vcHJvamVjdGlvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHtJbnRlcnBvbGF0ZWRTaXplfSBmcm9tICcuLi8uLi9zeW1ib2wvc3ltYm9sX3NpemUuanMnO1xuXG5leHBvcnQgdHlwZSBTeW1ib2xJY29uVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9pc19zaXplX3pvb21fY29uc3RhbnQnOiBVbmlmb3JtMWksXG4gICAgJ3VfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50JzogVW5pZm9ybTFpLFxuICAgICd1X3NpemVfdCc6IFVuaWZvcm0xZixcbiAgICAndV9zaXplJzogVW5pZm9ybTFmLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfcm90YXRlX3N5bWJvbCc6IFVuaWZvcm0xaSxcbiAgICAndV9hc3BlY3RfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfZmFkZV9jaGFuZ2UnOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9jb29yZF9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfaXNfdGV4dCc6IFVuaWZvcm0xaSxcbiAgICAndV9waXRjaF93aXRoX21hcCc6IFVuaWZvcm0xaSxcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X3RpbGVfaWQnOiBVbmlmb3JtM2YsXG4gICAgJ3Vfem9vbV90cmFuc2l0aW9uJzogVW5pZm9ybTFmLFxuICAgICd1X2ludl9yb3RfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X21lcmNfY2VudGVyJzogVW5pZm9ybTJmLFxuICAgICd1X2NhbWVyYV9mb3J3YXJkJzogVW5pZm9ybTNmLFxuICAgICd1X3RpbGVfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3VwX3ZlY3Rvcic6IFVuaWZvcm0zZixcbiAgICAndV9lY2VmX29yaWdpbic6IFVuaWZvcm0zZixcbiAgICAndV90ZXh0dXJlJzogVW5pZm9ybTFpXG58fTtcblxuZXhwb3J0IHR5cGUgU3ltYm9sU0RGVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9pc19zaXplX3pvb21fY29uc3RhbnQnOiBVbmlmb3JtMWksXG4gICAgJ3VfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50JzogVW5pZm9ybTFpLFxuICAgICd1X3NpemVfdCc6IFVuaWZvcm0xZixcbiAgICAndV9zaXplJzogVW5pZm9ybTFmLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBVbmlmb3JtMWYsXG4gICAgJ3Vfcm90YXRlX3N5bWJvbCc6IFVuaWZvcm0xaSxcbiAgICAndV9hc3BlY3RfcmF0aW8nOiBVbmlmb3JtMWYsXG4gICAgJ3VfZmFkZV9jaGFuZ2UnOiBVbmlmb3JtMWYsXG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9jb29yZF9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfaXNfdGV4dCc6IFVuaWZvcm0xaSxcbiAgICAndV9waXRjaF93aXRoX21hcCc6IFVuaWZvcm0xaSxcbiAgICAndV90ZXhzaXplJzogVW5pZm9ybTJmLFxuICAgICd1X3RleHR1cmUnOiBVbmlmb3JtMWksXG4gICAgJ3VfZ2FtbWFfc2NhbGUnOiBVbmlmb3JtMWYsXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogVW5pZm9ybTFmLFxuICAgICd1X3RpbGVfaWQnOiBVbmlmb3JtM2YsXG4gICAgJ3Vfem9vbV90cmFuc2l0aW9uJzogVW5pZm9ybTFmLFxuICAgICd1X2ludl9yb3RfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X21lcmNfY2VudGVyJzogVW5pZm9ybTJmLFxuICAgICd1X2NhbWVyYV9mb3J3YXJkJzogVW5pZm9ybTNmLFxuICAgICd1X3RpbGVfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X3VwX3ZlY3Rvcic6IFVuaWZvcm0zZixcbiAgICAndV9lY2VmX29yaWdpbic6IFVuaWZvcm0zZixcbiAgICAndV9pc19oYWxvJzogVW5pZm9ybTFpXG58fTtcblxuZXhwb3J0IHR5cGUgc3ltYm9sVGV4dEFuZEljb25Vbmlmb3Jtc1R5cGUgPSB7fFxuICAgICd1X2lzX3NpemVfem9vbV9jb25zdGFudCc6IFVuaWZvcm0xaSxcbiAgICAndV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQnOiBVbmlmb3JtMWksXG4gICAgJ3Vfc2l6ZV90JzogVW5pZm9ybTFmLFxuICAgICd1X3NpemUnOiBVbmlmb3JtMWYsXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IFVuaWZvcm0xZixcbiAgICAndV9yb3RhdGVfc3ltYm9sJzogVW5pZm9ybTFpLFxuICAgICd1X2FzcGVjdF9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9mYWRlX2NoYW5nZSc6IFVuaWZvcm0xZixcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfbGFiZWxfcGxhbmVfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X2Nvb3JkX21hdHJpeCc6IFVuaWZvcm1NYXRyaXg0ZixcbiAgICAndV9pc190ZXh0JzogVW5pZm9ybTFpLFxuICAgICd1X3BpdGNoX3dpdGhfbWFwJzogVW5pZm9ybTFpLFxuICAgICd1X3RleHNpemUnOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGV4c2l6ZV9pY29uJzogVW5pZm9ybTJmLFxuICAgICd1X3RleHR1cmUnOiBVbmlmb3JtMWksXG4gICAgJ3VfdGV4dHVyZV9pY29uJzogVW5pZm9ybTFpLFxuICAgICd1X2dhbW1hX3NjYWxlJzogVW5pZm9ybTFmLFxuICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IFVuaWZvcm0xZixcbiAgICAndV9pc19oYWxvJzogVW5pZm9ybTFpXG58fTtcblxuZXhwb3J0IHR5cGUgU3ltYm9sRGVmaW5lc1R5cGUgPSAnUElUQ0hfV0lUSF9NQVBfVEVSUkFJTic7XG5cbmNvbnN0IHN5bWJvbEljb25Vbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBTeW1ib2xJY29uVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc19zaXplX3pvb21fY29uc3RhbnQpLFxuICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSxcbiAgICAndV9zaXplX3QnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NpemVfdCksXG4gICAgJ3Vfc2l6ZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2l6ZSksXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgJ3Vfcm90YXRlX3N5bWJvbCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfcm90YXRlX3N5bWJvbCksXG4gICAgJ3VfYXNwZWN0X3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9hc3BlY3RfcmF0aW8pLFxuICAgICd1X2ZhZGVfY2hhbmdlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlX2NoYW5nZSksXG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbGFiZWxfcGxhbmVfbWF0cml4KSxcbiAgICAndV9jb29yZF9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2Nvb3JkX21hdHJpeCksXG4gICAgJ3VfaXNfdGV4dCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfdGV4dCksXG4gICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpdGNoX3dpdGhfbWFwKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV90aWxlX2lkJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX2lkKSxcbiAgICAndV96b29tX3RyYW5zaXRpb24nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3pvb21fdHJhbnNpdGlvbiksXG4gICAgJ3VfaW52X3JvdF9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2ludl9yb3RfbWF0cml4KSxcbiAgICAndV9tZXJjX2NlbnRlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfbWVyY19jZW50ZXIpLFxuICAgICd1X2NhbWVyYV9mb3J3YXJkJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9jYW1lcmFfZm9yd2FyZCksXG4gICAgJ3VfdGlsZV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RpbGVfbWF0cml4KSxcbiAgICAndV91cF92ZWN0b3InOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X3VwX3ZlY3RvciksXG4gICAgJ3VfZWNlZl9vcmlnaW4nOiBuZXcgVW5pZm9ybTNmKGNvbnRleHQsIGxvY2F0aW9ucy51X2VjZWZfb3JpZ2luKSxcbiAgICAndV90ZXh0dXJlJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV90ZXh0dXJlKVxufSk7XG5cbmNvbnN0IHN5bWJvbFNERlVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IFN5bWJvbFNERlVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X2lzX3NpemVfem9vbV9jb25zdGFudCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfc2l6ZV96b29tX2NvbnN0YW50KSxcbiAgICAndV9pc19zaXplX2ZlYXR1cmVfY29uc3RhbnQnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCksXG4gICAgJ3Vfc2l6ZV90JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zaXplX3QpLFxuICAgICd1X3NpemUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NpemUpLFxuICAgICd1X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2NhbWVyYV90b19jZW50ZXJfZGlzdGFuY2UpLFxuICAgICd1X3JvdGF0ZV9zeW1ib2wnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3JvdGF0ZV9zeW1ib2wpLFxuICAgICd1X2FzcGVjdF9yYXRpbyc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfYXNwZWN0X3JhdGlvKSxcbiAgICAndV9mYWRlX2NoYW5nZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfZmFkZV9jaGFuZ2UpLFxuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9sYWJlbF9wbGFuZV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2xhYmVsX3BsYW5lX21hdHJpeCksXG4gICAgJ3VfY29vcmRfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9jb29yZF9tYXRyaXgpLFxuICAgICd1X2lzX3RleHQnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX3RleHQpLFxuICAgICd1X3BpdGNoX3dpdGhfbWFwJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9waXRjaF93aXRoX21hcCksXG4gICAgJ3VfdGV4c2l6ZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4c2l6ZSksXG4gICAgJ3VfdGV4dHVyZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4dHVyZSksXG4gICAgJ3VfZ2FtbWFfc2NhbGUnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2dhbW1hX3NjYWxlKSxcbiAgICAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X2RldmljZV9waXhlbF9yYXRpbyksXG4gICAgJ3VfdGlsZV9pZCc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfdGlsZV9pZCksXG4gICAgJ3Vfem9vbV90cmFuc2l0aW9uJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV96b29tX3RyYW5zaXRpb24pLFxuICAgICd1X2ludl9yb3RfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9pbnZfcm90X21hdHJpeCksXG4gICAgJ3VfbWVyY19jZW50ZXInOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X21lcmNfY2VudGVyKSxcbiAgICAndV9jYW1lcmFfZm9yd2FyZCc6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX2ZvcndhcmQpLFxuICAgICd1X3RpbGVfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV90aWxlX21hdHJpeCksXG4gICAgJ3VfdXBfdmVjdG9yJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV91cF92ZWN0b3IpLFxuICAgICd1X2VjZWZfb3JpZ2luJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9lY2VmX29yaWdpbiksXG4gICAgJ3VfaXNfaGFsbyc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfaGFsbylcbn0pO1xuXG5jb25zdCBzeW1ib2xUZXh0QW5kSWNvblVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybXNUeXBlID0+ICh7XG4gICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9pc19zaXplX3pvb21fY29uc3RhbnQpLFxuICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfc2l6ZV9mZWF0dXJlX2NvbnN0YW50KSxcbiAgICAndV9zaXplX3QnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3NpemVfdCksXG4gICAgJ3Vfc2l6ZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfc2l6ZSksXG4gICAgJ3VfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfY2FtZXJhX3RvX2NlbnRlcl9kaXN0YW5jZSksXG4gICAgJ3Vfcm90YXRlX3N5bWJvbCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfcm90YXRlX3N5bWJvbCksXG4gICAgJ3VfYXNwZWN0X3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9hc3BlY3RfcmF0aW8pLFxuICAgICd1X2ZhZGVfY2hhbmdlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9mYWRlX2NoYW5nZSksXG4gICAgJ3VfbWF0cml4JzogbmV3IFVuaWZvcm1NYXRyaXg0Zihjb250ZXh0LCBsb2NhdGlvbnMudV9tYXRyaXgpLFxuICAgICd1X2xhYmVsX3BsYW5lX21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbGFiZWxfcGxhbmVfbWF0cml4KSxcbiAgICAndV9jb29yZF9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2Nvb3JkX21hdHJpeCksXG4gICAgJ3VfaXNfdGV4dCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfaXNfdGV4dCksXG4gICAgJ3VfcGl0Y2hfd2l0aF9tYXAnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X3BpdGNoX3dpdGhfbWFwKSxcbiAgICAndV90ZXhzaXplJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZXhzaXplKSxcbiAgICAndV90ZXhzaXplX2ljb24nOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RleHNpemVfaWNvbiksXG4gICAgJ3VfdGV4dHVyZSc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4dHVyZSksXG4gICAgJ3VfdGV4dHVyZV9pY29uJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV90ZXh0dXJlX2ljb24pLFxuICAgICd1X2dhbW1hX3NjYWxlJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9nYW1tYV9zY2FsZSksXG4gICAgJ3VfZGV2aWNlX3BpeGVsX3JhdGlvJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICd1X2lzX2hhbG8nOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2lzX2hhbG8pXG59KTtcblxuY29uc3QgaWRlbnRpdHlNYXRyaXggPSBtYXQ0LmNyZWF0ZSgpO1xuXG5jb25zdCBzeW1ib2xJY29uVW5pZm9ybVZhbHVlcyA9IChcbiAgICBmdW5jdGlvblR5cGU6IHN0cmluZyxcbiAgICBzaXplOiA/SW50ZXJwb2xhdGVkU2l6ZSxcbiAgICByb3RhdGVJblNoYWRlcjogYm9vbGVhbixcbiAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBsYWJlbFBsYW5lTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgZ2xDb29yZE1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGlzVGV4dDogYm9vbGVhbixcbiAgICB0ZXhTaXplOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGNvb3JkOiBPdmVyc2NhbGVkVGlsZUlELFxuICAgIHpvb21UcmFuc2l0aW9uOiBudW1iZXIsXG4gICAgbWVyY2F0b3JDZW50ZXI6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgaW52TWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgdXBWZWN0b3I6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uXG4pOiBVbmlmb3JtVmFsdWVzPFN5bWJvbEljb25Vbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IHtcbiAgICAgICAgJ3VfaXNfc2l6ZV96b29tX2NvbnN0YW50JzogKyhmdW5jdGlvblR5cGUgPT09ICdjb25zdGFudCcgfHwgZnVuY3Rpb25UeXBlID09PSAnc291cmNlJyksXG4gICAgICAgICd1X2lzX3NpemVfZmVhdHVyZV9jb25zdGFudCc6ICsoZnVuY3Rpb25UeXBlID09PSAnY29uc3RhbnQnIHx8IGZ1bmN0aW9uVHlwZSA9PT0gJ2NhbWVyYScpLFxuICAgICAgICAndV9zaXplX3QnOiBzaXplID8gc2l6ZS51U2l6ZVQgOiAwLFxuICAgICAgICAndV9zaXplJzogc2l6ZSA/IHNpemUudVNpemUgOiAwLFxuICAgICAgICAndV9jYW1lcmFfdG9fY2VudGVyX2Rpc3RhbmNlJzogdHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UsXG4gICAgICAgICd1X3JvdGF0ZV9zeW1ib2wnOiArcm90YXRlSW5TaGFkZXIsXG4gICAgICAgICd1X2FzcGVjdF9yYXRpbyc6IHRyYW5zZm9ybS53aWR0aCAvIHRyYW5zZm9ybS5oZWlnaHQsXG4gICAgICAgICd1X2ZhZGVfY2hhbmdlJzogcGFpbnRlci5vcHRpb25zLmZhZGVEdXJhdGlvbiA/IHBhaW50ZXIuc3ltYm9sRmFkZUNoYW5nZSA6IDEsXG4gICAgICAgICd1X21hdHJpeCc6IG1hdHJpeCxcbiAgICAgICAgJ3VfbGFiZWxfcGxhbmVfbWF0cml4JzogbGFiZWxQbGFuZU1hdHJpeCxcbiAgICAgICAgJ3VfY29vcmRfbWF0cml4JzogZ2xDb29yZE1hdHJpeCxcbiAgICAgICAgJ3VfaXNfdGV4dCc6ICtpc1RleHQsXG4gICAgICAgICd1X3BpdGNoX3dpdGhfbWFwJzogK3BpdGNoV2l0aE1hcCxcbiAgICAgICAgJ3VfdGV4c2l6ZSc6IHRleFNpemUsXG4gICAgICAgICd1X3RleHR1cmUnOiAwLFxuICAgICAgICAndV90aWxlX2lkJzogWzAsIDAsIDBdLFxuICAgICAgICAndV96b29tX3RyYW5zaXRpb24nOiAwLFxuICAgICAgICAndV9pbnZfcm90X21hdHJpeCc6IGlkZW50aXR5TWF0cml4LFxuICAgICAgICAndV9tZXJjX2NlbnRlcic6IFswLCAwXSxcbiAgICAgICAgJ3VfY2FtZXJhX2ZvcndhcmQnOiBbMCwgMCwgMF0sXG4gICAgICAgICd1X2VjZWZfb3JpZ2luJzogWzAsIDAsIDBdLFxuICAgICAgICAndV90aWxlX21hdHJpeCc6IGlkZW50aXR5TWF0cml4LFxuICAgICAgICAndV91cF92ZWN0b3InOiBbMCwgLTEsIDBdXG4gICAgfTtcblxuICAgIGlmIChwcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgdmFsdWVzWyd1X3RpbGVfaWQnXSA9IFtjb29yZC5jYW5vbmljYWwueCwgY29vcmQuY2Fub25pY2FsLnksIDEgPDwgY29vcmQuY2Fub25pY2FsLnpdO1xuICAgICAgICB2YWx1ZXNbJ3Vfem9vbV90cmFuc2l0aW9uJ10gPSB6b29tVHJhbnNpdGlvbjtcbiAgICAgICAgdmFsdWVzWyd1X2ludl9yb3RfbWF0cml4J10gPSBpbnZNYXRyaXg7XG4gICAgICAgIHZhbHVlc1sndV9tZXJjX2NlbnRlciddID0gbWVyY2F0b3JDZW50ZXI7XG4gICAgICAgIHZhbHVlc1sndV9jYW1lcmFfZm9yd2FyZCddID0gKCh0cmFuc2Zvcm0uX2NhbWVyYS5mb3J3YXJkKCk6IGFueSk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk7XG4gICAgICAgIHZhbHVlc1sndV9lY2VmX29yaWdpbiddID0gZ2xvYmVFQ0VGT3JpZ2luKHRyYW5zZm9ybS5nbG9iZU1hdHJpeCwgY29vcmQudG9VbndyYXBwZWQoKSk7XG4gICAgICAgIHZhbHVlc1sndV90aWxlX21hdHJpeCddID0gRmxvYXQzMkFycmF5LmZyb20odHJhbnNmb3JtLmdsb2JlTWF0cml4KTtcbiAgICAgICAgdmFsdWVzWyd1X3VwX3ZlY3RvciddID0gdXBWZWN0b3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbn07XG5cbmNvbnN0IHN5bWJvbFNERlVuaWZvcm1WYWx1ZXMgPSAoXG4gICAgZnVuY3Rpb25UeXBlOiBzdHJpbmcsXG4gICAgc2l6ZTogP0ludGVycG9sYXRlZFNpemUsXG4gICAgcm90YXRlSW5TaGFkZXI6IGJvb2xlYW4sXG4gICAgcGl0Y2hXaXRoTWFwOiBib29sZWFuLFxuICAgIHBhaW50ZXI6IFBhaW50ZXIsXG4gICAgbWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgbGFiZWxQbGFuZU1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGdsQ29vcmRNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBpc1RleHQ6IGJvb2xlYW4sXG4gICAgdGV4U2l6ZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBpc0hhbG86IGJvb2xlYW4sXG4gICAgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQsXG4gICAgem9vbVRyYW5zaXRpb246IG51bWJlcixcbiAgICBtZXJjYXRvckNlbnRlcjogW251bWJlciwgbnVtYmVyXSxcbiAgICBpbnZNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICB1cFZlY3RvcjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIHByb2plY3Rpb246IFByb2plY3Rpb25cbik6IFVuaWZvcm1WYWx1ZXM8U3ltYm9sU0RGVW5pZm9ybXNUeXBlPiA9PiB7XG4gICAgcmV0dXJuIGV4dGVuZChzeW1ib2xJY29uVW5pZm9ybVZhbHVlcyhmdW5jdGlvblR5cGUsIHNpemUsIHJvdGF0ZUluU2hhZGVyLFxuICAgICAgICBwaXRjaFdpdGhNYXAsIHBhaW50ZXIsIG1hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCwgaXNUZXh0LFxuICAgICAgICB0ZXhTaXplLCBjb29yZCwgem9vbVRyYW5zaXRpb24sIG1lcmNhdG9yQ2VudGVyLCBpbnZNYXRyaXgsIHVwVmVjdG9yLCBwcm9qZWN0aW9uKSwge1xuICAgICAgICAndV9nYW1tYV9zY2FsZSc6IHBpdGNoV2l0aE1hcCA/IHBhaW50ZXIudHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgKiBNYXRoLmNvcyhwYWludGVyLnRlcnJhaW4gPyAwIDogcGFpbnRlci50cmFuc2Zvcm0uX3BpdGNoKSA6IDEsXG4gICAgICAgICd1X2RldmljZV9waXhlbF9yYXRpbyc6IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyxcbiAgICAgICAgJ3VfaXNfaGFsbyc6ICtpc0hhbG9cbiAgICB9KTtcbn07XG5cbmNvbnN0IHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybVZhbHVlcyA9IChcbiAgICBmdW5jdGlvblR5cGU6IHN0cmluZyxcbiAgICBzaXplOiA/SW50ZXJwb2xhdGVkU2l6ZSxcbiAgICByb3RhdGVJblNoYWRlcjogYm9vbGVhbixcbiAgICBwaXRjaFdpdGhNYXA6IGJvb2xlYW4sXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBsYWJlbFBsYW5lTWF0cml4OiBGbG9hdDMyQXJyYXksXG4gICAgZ2xDb29yZE1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHRleFNpemVTREY6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgdGV4U2l6ZUljb246IFtudW1iZXIsIG51bWJlcl0sXG4gICAgY29vcmQ6IE92ZXJzY2FsZWRUaWxlSUQsXG4gICAgem9vbVRyYW5zaXRpb246IG51bWJlcixcbiAgICBtZXJjYXRvckNlbnRlcjogW251bWJlciwgbnVtYmVyXSxcbiAgICBpbnZNYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICB1cFZlY3RvcjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIHByb2plY3Rpb246IFByb2plY3Rpb25cbik6IFVuaWZvcm1WYWx1ZXM8U3ltYm9sSWNvblVuaWZvcm1zVHlwZT4gPT4ge1xuICAgIHJldHVybiBleHRlbmQoc3ltYm9sU0RGVW5pZm9ybVZhbHVlcyhmdW5jdGlvblR5cGUsIHNpemUsIHJvdGF0ZUluU2hhZGVyLFxuICAgICAgICBwaXRjaFdpdGhNYXAsIHBhaW50ZXIsIG1hdHJpeCwgbGFiZWxQbGFuZU1hdHJpeCwgZ2xDb29yZE1hdHJpeCwgdHJ1ZSwgdGV4U2l6ZVNERixcbiAgICAgICAgdHJ1ZSwgY29vcmQsIHpvb21UcmFuc2l0aW9uLCBtZXJjYXRvckNlbnRlciwgaW52TWF0cml4LCB1cFZlY3RvciwgcHJvamVjdGlvbiksIHtcbiAgICAgICAgJ3VfdGV4c2l6ZV9pY29uJzogdGV4U2l6ZUljb24sXG4gICAgICAgICd1X3RleHR1cmVfaWNvbic6IDFcbiAgICB9KTtcbn07XG5cbmV4cG9ydCB7c3ltYm9sSWNvblVuaWZvcm1zLCBzeW1ib2xTREZVbmlmb3Jtcywgc3ltYm9sSWNvblVuaWZvcm1WYWx1ZXMsIHN5bWJvbFNERlVuaWZvcm1WYWx1ZXMsIHN5bWJvbFRleHRBbmRJY29uVW5pZm9ybVZhbHVlcywgc3ltYm9sVGV4dEFuZEljb25Vbmlmb3Jtc307XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2JnUGF0dGVyblVuaWZvcm1WYWx1ZXN9IGZyb20gJy4vcGF0dGVybi5qcyc7XG5pbXBvcnQge1xuICAgIFVuaWZvcm0xaSxcbiAgICBVbmlmb3JtMWYsXG4gICAgVW5pZm9ybTJmLFxuICAgIFVuaWZvcm1Db2xvcixcbiAgICBVbmlmb3JtTWF0cml4NGZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4uL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXMsIFVuaWZvcm1Mb2NhdGlvbnN9IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gJy4uLy4uL2dsL2NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcbmltcG9ydCB0eXBlIHtDcm9zc0ZhZGVkfSBmcm9tICcuLi8uLi9zdHlsZS9wcm9wZXJ0aWVzLmpzJztcbmltcG9ydCB0eXBlIHtDcm9zc2ZhZGVQYXJhbWV0ZXJzfSBmcm9tICcuLi8uLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uLy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB0eXBlIFJlc29sdmVkSW1hZ2UgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy9leHByZXNzaW9uL3R5cGVzL3Jlc29sdmVkX2ltYWdlLmpzJztcblxuZXhwb3J0IHR5cGUgQmFja2dyb3VuZFVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWYsXG4gICAgJ3VfY29sb3InOiBVbmlmb3JtQ29sb3Jcbnx9O1xuXG5leHBvcnQgdHlwZSBCYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4JzogVW5pZm9ybU1hdHJpeDRmLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWYsXG4gICAgLy8gcGF0dGVybiB1bmlmb3JtczpcbiAgICAndV9pbWFnZSc6IFVuaWZvcm0xaSxcbiAgICAndV9wYXR0ZXJuX3RsX2EnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybl9icl9hJzogVW5pZm9ybTJmLFxuICAgICd1X3BhdHRlcm5fdGxfYic6IFVuaWZvcm0yZixcbiAgICAndV9wYXR0ZXJuX2JyX2InOiBVbmlmb3JtMmYsXG4gICAgJ3VfdGV4c2l6ZSc6IFVuaWZvcm0yZixcbiAgICAndV9taXgnOiBVbmlmb3JtMWYsXG4gICAgJ3VfcGF0dGVybl9zaXplX2EnOiBVbmlmb3JtMmYsXG4gICAgJ3VfcGF0dGVybl9zaXplX2InOiBVbmlmb3JtMmYsXG4gICAgJ3Vfc2NhbGVfYSc6IFVuaWZvcm0xZixcbiAgICAndV9zY2FsZV9iJzogVW5pZm9ybTFmLFxuICAgICd1X3BpeGVsX2Nvb3JkX3VwcGVyJzogVW5pZm9ybTJmLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogVW5pZm9ybTJmLFxuICAgICd1X3RpbGVfdW5pdHNfdG9fcGl4ZWxzJzogVW5pZm9ybTFmXG58fTtcblxuY29uc3QgYmFja2dyb3VuZFVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IEJhY2tncm91bmRVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSksXG4gICAgJ3VfY29sb3InOiBuZXcgVW5pZm9ybUNvbG9yKGNvbnRleHQsIGxvY2F0aW9ucy51X2NvbG9yKVxufSk7XG5cbmNvbnN0IGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogQmFja2dyb3VuZFBhdHRlcm5Vbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSksXG4gICAgJ3VfaW1hZ2UnOiBuZXcgVW5pZm9ybTFpKGNvbnRleHQsIGxvY2F0aW9ucy51X2ltYWdlKSxcbiAgICAndV9wYXR0ZXJuX3RsX2EnOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fdGxfYSksXG4gICAgJ3VfcGF0dGVybl9icl9hJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9wYXR0ZXJuX2JyX2EpLFxuICAgICd1X3BhdHRlcm5fdGxfYic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGF0dGVybl90bF9iKSxcbiAgICAndV9wYXR0ZXJuX2JyX2InOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fYnJfYiksXG4gICAgJ3VfdGV4c2l6ZSc6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfdGV4c2l6ZSksXG4gICAgJ3VfbWl4JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9taXgpLFxuICAgICd1X3BhdHRlcm5fc2l6ZV9hJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9wYXR0ZXJuX3NpemVfYSksXG4gICAgJ3VfcGF0dGVybl9zaXplX2InOiBuZXcgVW5pZm9ybTJmKGNvbnRleHQsIGxvY2F0aW9ucy51X3BhdHRlcm5fc2l6ZV9iKSxcbiAgICAndV9zY2FsZV9hJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zY2FsZV9hKSxcbiAgICAndV9zY2FsZV9iJzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zY2FsZV9iKSxcbiAgICAndV9waXhlbF9jb29yZF91cHBlcic6IG5ldyBVbmlmb3JtMmYoY29udGV4dCwgbG9jYXRpb25zLnVfcGl4ZWxfY29vcmRfdXBwZXIpLFxuICAgICd1X3BpeGVsX2Nvb3JkX2xvd2VyJzogbmV3IFVuaWZvcm0yZihjb250ZXh0LCBsb2NhdGlvbnMudV9waXhlbF9jb29yZF9sb3dlciksXG4gICAgJ3VfdGlsZV91bml0c190b19waXhlbHMnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3RpbGVfdW5pdHNfdG9fcGl4ZWxzKVxufSk7XG5cbmNvbnN0IGJhY2tncm91bmRVbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIG9wYWNpdHk6IG51bWJlcixcbiAgICBjb2xvcjogQ29sb3Jcbik6IFVuaWZvcm1WYWx1ZXM8QmFja2dyb3VuZFVuaWZvcm1zVHlwZT4gPT4gKHtcbiAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgJ3Vfb3BhY2l0eSc6IG9wYWNpdHksXG4gICAgJ3VfY29sb3InOiBjb2xvclxufSk7XG5cbmNvbnN0IGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBvcGFjaXR5OiBudW1iZXIsXG4gICAgcGFpbnRlcjogUGFpbnRlcixcbiAgICBpbWFnZTogQ3Jvc3NGYWRlZDxSZXNvbHZlZEltYWdlPixcbiAgICB0aWxlOiB7dGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlELCB0aWxlU2l6ZTogbnVtYmVyfSxcbiAgICBjcm9zc2ZhZGU6IENyb3NzZmFkZVBhcmFtZXRlcnNcbik6IFVuaWZvcm1WYWx1ZXM8QmFja2dyb3VuZFBhdHRlcm5Vbmlmb3Jtc1R5cGU+ID0+IGV4dGVuZChcbiAgICBiZ1BhdHRlcm5Vbmlmb3JtVmFsdWVzKGltYWdlLCBjcm9zc2ZhZGUsIHBhaW50ZXIsIHRpbGUpLFxuICAgIHtcbiAgICAgICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICAgICAndV9vcGFjaXR5Jzogb3BhY2l0eVxuICAgIH1cbik7XG5cbmV4cG9ydCB7XG4gICAgYmFja2dyb3VuZFVuaWZvcm1zLFxuICAgIGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXMsXG4gICAgYmFja2dyb3VuZFVuaWZvcm1WYWx1ZXMsXG4gICAgYmFja2dyb3VuZFBhdHRlcm5Vbmlmb3JtVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtTWF0cml4NGYsXG4gICAgVW5pZm9ybTFpLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtMWZcbn0gZnJvbSAnLi4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB7ZGVnVG9SYWR9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5cbmltcG9ydCB0eXBlIHtVbmlmb3JtVmFsdWVzLCBVbmlmb3JtTG9jYXRpb25zfSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcblxuZXhwb3J0IHR5cGUgU2t5Ym94VW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3Vfc3VuX2RpcmVjdGlvbic6IFVuaWZvcm0zZixcbiAgICAndV9jdWJlbWFwJzogVW5pZm9ybTFpLFxuICAgICd1X29wYWNpdHknOiBVbmlmb3JtMWYsXG4gICAgJ3VfdGVtcG9yYWxfb2Zmc2V0JzogVW5pZm9ybTFmXG58fTtcblxuZXhwb3J0IHR5cGUgU2t5Ym94R3JhZGllbnRsVW5pZm9ybXNUeXBlID0ge3xcbiAgICAndV9tYXRyaXgnOiBVbmlmb3JtTWF0cml4NGYsXG4gICAgJ3VfY29sb3JfcmFtcCc6IFVuaWZvcm0xaSxcbiAgICAndV9jZW50ZXJfZGlyZWN0aW9uJzogVW5pZm9ybTNmLFxuICAgICd1X3JhZGl1cyc6IFVuaWZvcm0xZixcbiAgICAndV9vcGFjaXR5JzogVW5pZm9ybTFmLFxuICAgICd1X3RlbXBvcmFsX29mZnNldCc6IFVuaWZvcm0xZixcbnx9O1xuXG5jb25zdCBza3lib3hVbmlmb3JtcyA9IChjb250ZXh0OiBDb250ZXh0LCBsb2NhdGlvbnM6IFVuaWZvcm1Mb2NhdGlvbnMpOiBTa3lib3hVbmlmb3Jtc1R5cGUgPT4gKHtcbiAgICAndV9tYXRyaXgnOiBuZXcgVW5pZm9ybU1hdHJpeDRmKGNvbnRleHQsIGxvY2F0aW9ucy51X21hdHJpeCksXG4gICAgJ3Vfc3VuX2RpcmVjdGlvbic6IG5ldyBVbmlmb3JtM2YoY29udGV4dCwgbG9jYXRpb25zLnVfc3VuX2RpcmVjdGlvbiksXG4gICAgJ3VfY3ViZW1hcCc6IG5ldyBVbmlmb3JtMWkoY29udGV4dCwgbG9jYXRpb25zLnVfY3ViZW1hcCksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSksXG4gICAgJ3VfdGVtcG9yYWxfb2Zmc2V0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZW1wb3JhbF9vZmZzZXQpXG5cbn0pO1xuXG5jb25zdCBza3lib3hVbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIHN1bkRpcmVjdGlvbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGN1YmVtYXA6IG51bWJlcixcbiAgICBvcGFjaXR5OiBudW1iZXIsXG4gICAgdGVtcG9yYWxPZmZzZXQ6IG51bWJlclxuKTogVW5pZm9ybVZhbHVlczxTa3lib3hVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4JzogbWF0cml4LFxuICAgICd1X3N1bl9kaXJlY3Rpb24nOiBzdW5EaXJlY3Rpb24sXG4gICAgJ3VfY3ViZW1hcCc6IGN1YmVtYXAsXG4gICAgJ3Vfb3BhY2l0eSc6IG9wYWNpdHksXG4gICAgJ3VfdGVtcG9yYWxfb2Zmc2V0JzogdGVtcG9yYWxPZmZzZXRcbn0pO1xuXG5jb25zdCBza3lib3hHcmFkaWVudFVuaWZvcm1zID0gKGNvbnRleHQ6IENvbnRleHQsIGxvY2F0aW9uczogVW5pZm9ybUxvY2F0aW9ucyk6IFNreWJveEdyYWRpZW50bFVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeCc6IG5ldyBVbmlmb3JtTWF0cml4NGYoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4KSxcbiAgICAndV9jb2xvcl9yYW1wJzogbmV3IFVuaWZvcm0xaShjb250ZXh0LCBsb2NhdGlvbnMudV9jb2xvcl9yYW1wKSxcbiAgICAvLyByYWRpYWwgZ3JhZGllbnQgdW5pZm9ybXNcbiAgICAndV9jZW50ZXJfZGlyZWN0aW9uJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9jZW50ZXJfZGlyZWN0aW9uKSxcbiAgICAndV9yYWRpdXMnOiBuZXcgVW5pZm9ybTFmKGNvbnRleHQsIGxvY2F0aW9ucy51X3JhZGl1cyksXG4gICAgJ3Vfb3BhY2l0eSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfb3BhY2l0eSksXG4gICAgJ3VfdGVtcG9yYWxfb2Zmc2V0JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV90ZW1wb3JhbF9vZmZzZXQpXG59KTtcblxuY29uc3Qgc2t5Ym94R3JhZGllbnRVbmlmb3JtVmFsdWVzID0gKFxuICAgIG1hdHJpeDogRmxvYXQzMkFycmF5LFxuICAgIGNlbnRlckRpcmVjdGlvbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIHJhZGl1czogbnVtYmVyLCAvL2RlZ3JlZXNcbiAgICBvcGFjaXR5OiBudW1iZXIsXG4gICAgdGVtcG9yYWxPZmZzZXQ6IG51bWJlclxuKTogVW5pZm9ybVZhbHVlczxTa3lib3hHcmFkaWVudGxVbmlmb3Jtc1R5cGU+ID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICAndV9tYXRyaXgnOiBtYXRyaXgsXG4gICAgICAgICd1X2NvbG9yX3JhbXAnOiAwLFxuICAgICAgICAndV9jZW50ZXJfZGlyZWN0aW9uJzogY2VudGVyRGlyZWN0aW9uLFxuICAgICAgICAndV9yYWRpdXMnOiBkZWdUb1JhZChyYWRpdXMpLFxuICAgICAgICAndV9vcGFjaXR5Jzogb3BhY2l0eSxcbiAgICAgICAgJ3VfdGVtcG9yYWxfb2Zmc2V0JzogdGVtcG9yYWxPZmZzZXRcbiAgICB9O1xufTtcblxuZXhwb3J0IHtcbiAgICBza3lib3hVbmlmb3JtcyxcbiAgICBza3lib3hVbmlmb3JtVmFsdWVzLFxuICAgIHNreWJveEdyYWRpZW50VW5pZm9ybXMsXG4gICAgc2t5Ym94R3JhZGllbnRVbmlmb3JtVmFsdWVzXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUgQ29sb3IgZnJvbSAnLi4vLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcblxuaW1wb3J0IHtcbiAgICBVbmlmb3JtTWF0cml4M2YsXG4gICAgVW5pZm9ybTFmLFxuICAgIFVuaWZvcm0zZixcbiAgICBVbmlmb3JtNGYsXG59IGZyb20gJy4uL3VuaWZvcm1fYmluZGluZy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgVW5pZm9ybVZhbHVlcyxcbiAgICBVbmlmb3JtTG9jYXRpb25zLFxufSBmcm9tICcuLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi8uLi9nbC9jb250ZXh0LmpzJztcblxuZXhwb3J0IHR5cGUgU2t5Ym94Q2FwdHVyZVVuaWZvcm1zVHlwZSA9IHt8XG4gICAgJ3VfbWF0cml4XzNmJzogVW5pZm9ybU1hdHJpeDNmLFxuICAgICd1X3N1bl9kaXJlY3Rpb24nOiBVbmlmb3JtM2YsXG4gICAgJ3Vfc3VuX2ludGVuc2l0eSc6IFVuaWZvcm0xZixcbiAgICAndV9jb2xvcl90aW50X3InOiBVbmlmb3JtNGYsXG4gICAgJ3VfY29sb3JfdGludF9tJzogVW5pZm9ybTRmLFxuICAgICd1X2x1bWluYW5jZSc6IFVuaWZvcm0xZixcbnx9O1xuXG5jb25zdCBza3lib3hDYXB0dXJlVW5pZm9ybXMgPSAoY29udGV4dDogQ29udGV4dCwgbG9jYXRpb25zOiBVbmlmb3JtTG9jYXRpb25zKTogU2t5Ym94Q2FwdHVyZVVuaWZvcm1zVHlwZSA9PiAoe1xuICAgICd1X21hdHJpeF8zZic6IG5ldyBVbmlmb3JtTWF0cml4M2YoY29udGV4dCwgbG9jYXRpb25zLnVfbWF0cml4XzNmKSxcbiAgICAndV9zdW5fZGlyZWN0aW9uJzogbmV3IFVuaWZvcm0zZihjb250ZXh0LCBsb2NhdGlvbnMudV9zdW5fZGlyZWN0aW9uKSxcbiAgICAndV9zdW5faW50ZW5zaXR5JzogbmV3IFVuaWZvcm0xZihjb250ZXh0LCBsb2NhdGlvbnMudV9zdW5faW50ZW5zaXR5KSxcbiAgICAndV9jb2xvcl90aW50X3InOiBuZXcgVW5pZm9ybTRmKGNvbnRleHQsIGxvY2F0aW9ucy51X2NvbG9yX3RpbnRfciksXG4gICAgJ3VfY29sb3JfdGludF9tJzogbmV3IFVuaWZvcm00Zihjb250ZXh0LCBsb2NhdGlvbnMudV9jb2xvcl90aW50X20pLFxuICAgICd1X2x1bWluYW5jZSc6IG5ldyBVbmlmb3JtMWYoY29udGV4dCwgbG9jYXRpb25zLnVfbHVtaW5hbmNlKSxcbn0pO1xuXG5jb25zdCBza3lib3hDYXB0dXJlVW5pZm9ybVZhbHVlcyA9IChcbiAgICBtYXRyaXg6IEZsb2F0MzJBcnJheSxcbiAgICBzdW5EaXJlY3Rpb246IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBzdW5JbnRlbnNpdHk6IG51bWJlcixcbiAgICBhdG1vc3BoZXJlQ29sb3I6IENvbG9yLFxuICAgIGF0bW9zcGhlcmVIYWxvQ29sb3I6IENvbG9yXG4pOiBVbmlmb3JtVmFsdWVzPFNreWJveENhcHR1cmVVbmlmb3Jtc1R5cGU+ID0+ICh7XG4gICAgJ3VfbWF0cml4XzNmJzogbWF0cml4LFxuICAgICd1X3N1bl9kaXJlY3Rpb24nOiBzdW5EaXJlY3Rpb24sXG4gICAgJ3Vfc3VuX2ludGVuc2l0eSc6IHN1bkludGVuc2l0eSxcbiAgICAndV9jb2xvcl90aW50X3InOiBbXG4gICAgICAgIGF0bW9zcGhlcmVDb2xvci5yLFxuICAgICAgICBhdG1vc3BoZXJlQ29sb3IuZyxcbiAgICAgICAgYXRtb3NwaGVyZUNvbG9yLmIsXG4gICAgICAgIGF0bW9zcGhlcmVDb2xvci5hXG4gICAgXSxcbiAgICAndV9jb2xvcl90aW50X20nOiBbXG4gICAgICAgIGF0bW9zcGhlcmVIYWxvQ29sb3IucixcbiAgICAgICAgYXRtb3NwaGVyZUhhbG9Db2xvci5nLFxuICAgICAgICBhdG1vc3BoZXJlSGFsb0NvbG9yLmIsXG4gICAgICAgIGF0bW9zcGhlcmVIYWxvQ29sb3IuYVxuICAgIF0sXG4gICAgJ3VfbHVtaW5hbmNlJzogNWUtNSxcbn0pO1xuXG5leHBvcnQge1xuICAgIHNreWJveENhcHR1cmVVbmlmb3JtcyxcbiAgICBza3lib3hDYXB0dXJlVW5pZm9ybVZhbHVlcyxcbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7Q2lyY2xlRGVmaW5lc1R5cGV9IGZyb20gJy4vY2lyY2xlX3Byb2dyYW0uanMnO1xuaW1wb3J0IHR5cGUge1N5bWJvbERlZmluZXNUeXBlfSBmcm9tICcuL3N5bWJvbF9wcm9ncmFtLmpzJztcbmltcG9ydCB0eXBlIHtMaW5lRGVmaW5lc1R5cGV9IGZyb20gJy4vbGluZV9wcm9ncmFtLmpzJztcbmltcG9ydCB7ZmlsbEV4dHJ1c2lvblVuaWZvcm1zLCBmaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1zfSBmcm9tICcuL2ZpbGxfZXh0cnVzaW9uX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtmaWxsVW5pZm9ybXMsIGZpbGxQYXR0ZXJuVW5pZm9ybXMsIGZpbGxPdXRsaW5lVW5pZm9ybXMsIGZpbGxPdXRsaW5lUGF0dGVyblVuaWZvcm1zfSBmcm9tICcuL2ZpbGxfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge2NpcmNsZVVuaWZvcm1zfSBmcm9tICcuL2NpcmNsZV9wcm9ncmFtLmpzJztcbmltcG9ydCB7Y29sbGlzaW9uVW5pZm9ybXMsIGNvbGxpc2lvbkNpcmNsZVVuaWZvcm1zfSBmcm9tICcuL2NvbGxpc2lvbl9wcm9ncmFtLmpzJztcbmltcG9ydCB7ZGVidWdVbmlmb3Jtc30gZnJvbSAnLi9kZWJ1Z19wcm9ncmFtLmpzJztcbmltcG9ydCB7Y2xpcHBpbmdNYXNrVW5pZm9ybXN9IGZyb20gJy4vY2xpcHBpbmdfbWFza19wcm9ncmFtLmpzJztcbmltcG9ydCB7aGVhdG1hcFVuaWZvcm1zLCBoZWF0bWFwVGV4dHVyZVVuaWZvcm1zfSBmcm9tICcuL2hlYXRtYXBfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge2hpbGxzaGFkZVVuaWZvcm1zLCBoaWxsc2hhZGVQcmVwYXJlVW5pZm9ybXN9IGZyb20gJy4vaGlsbHNoYWRlX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtsaW5lVW5pZm9ybXMsIGxpbmVQYXR0ZXJuVW5pZm9ybXN9IGZyb20gJy4vbGluZV9wcm9ncmFtLmpzJztcbmltcG9ydCB7cmFzdGVyVW5pZm9ybXN9IGZyb20gJy4vcmFzdGVyX3Byb2dyYW0uanMnO1xuaW1wb3J0IHtzeW1ib2xJY29uVW5pZm9ybXMsIHN5bWJvbFNERlVuaWZvcm1zLCBzeW1ib2xUZXh0QW5kSWNvblVuaWZvcm1zfSBmcm9tICcuL3N5bWJvbF9wcm9ncmFtLmpzJztcbmltcG9ydCB7YmFja2dyb3VuZFVuaWZvcm1zLCBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1zfSBmcm9tICcuL2JhY2tncm91bmRfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge3RlcnJhaW5SYXN0ZXJVbmlmb3Jtc30gZnJvbSAnLi4vLi4vdGVycmFpbi90ZXJyYWluX3Jhc3Rlcl9wcm9ncmFtLmpzJztcbmltcG9ydCB7c2t5Ym94VW5pZm9ybXMsIHNreWJveEdyYWRpZW50VW5pZm9ybXN9IGZyb20gJy4vc2t5Ym94X3Byb2dyYW0uanMnO1xuaW1wb3J0IHtza3lib3hDYXB0dXJlVW5pZm9ybXN9IGZyb20gJy4vc2t5Ym94X2NhcHR1cmVfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge2dsb2JlUmFzdGVyVW5pZm9ybXMsIGF0bW9zcGhlcmVVbmlmb3Jtc30gZnJvbSAnLi4vLi4vdGVycmFpbi9nbG9iZV9yYXN0ZXJfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgdHlwZSB7SGVhdG1hcERlZmluZXNUeXBlfSBmcm9tICcuL2hlYXRtYXBfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgdHlwZSB7RGVidWdEZWZpbmVzVHlwZX0gZnJvbSAnLi9kZWJ1Z19wcm9ncmFtLmpzJztcbmltcG9ydCB0eXBlIHtHbG9iZURlZmluZXNUeXBlfSBmcm9tICcuLi8uLi90ZXJyYWluL2dsb2JlX3Jhc3Rlcl9wcm9ncmFtLmpzJztcblxuZXhwb3J0IHR5cGUgRHluYW1pY0RlZmluZXNUeXBlID0gQ2lyY2xlRGVmaW5lc1R5cGUgfCBTeW1ib2xEZWZpbmVzVHlwZSB8IExpbmVEZWZpbmVzVHlwZSB8IEhlYXRtYXBEZWZpbmVzVHlwZSB8IERlYnVnRGVmaW5lc1R5cGUgfCBHbG9iZURlZmluZXNUeXBlO1xuXG5leHBvcnQgY29uc3QgcHJvZ3JhbVVuaWZvcm1zID0ge1xuICAgIGZpbGxFeHRydXNpb246IGZpbGxFeHRydXNpb25Vbmlmb3JtcyxcbiAgICBmaWxsRXh0cnVzaW9uUGF0dGVybjogZmlsbEV4dHJ1c2lvblBhdHRlcm5Vbmlmb3JtcyxcbiAgICBmaWxsOiBmaWxsVW5pZm9ybXMsXG4gICAgZmlsbFBhdHRlcm46IGZpbGxQYXR0ZXJuVW5pZm9ybXMsXG4gICAgZmlsbE91dGxpbmU6IGZpbGxPdXRsaW5lVW5pZm9ybXMsXG4gICAgZmlsbE91dGxpbmVQYXR0ZXJuOiBmaWxsT3V0bGluZVBhdHRlcm5Vbmlmb3JtcyxcbiAgICBjaXJjbGU6IGNpcmNsZVVuaWZvcm1zLFxuICAgIGNvbGxpc2lvbkJveDogY29sbGlzaW9uVW5pZm9ybXMsXG4gICAgY29sbGlzaW9uQ2lyY2xlOiBjb2xsaXNpb25DaXJjbGVVbmlmb3JtcyxcbiAgICBkZWJ1ZzogZGVidWdVbmlmb3JtcyxcbiAgICBjbGlwcGluZ01hc2s6IGNsaXBwaW5nTWFza1VuaWZvcm1zLFxuICAgIGhlYXRtYXA6IGhlYXRtYXBVbmlmb3JtcyxcbiAgICBoZWF0bWFwVGV4dHVyZTogaGVhdG1hcFRleHR1cmVVbmlmb3JtcyxcbiAgICBoaWxsc2hhZGU6IGhpbGxzaGFkZVVuaWZvcm1zLFxuICAgIGhpbGxzaGFkZVByZXBhcmU6IGhpbGxzaGFkZVByZXBhcmVVbmlmb3JtcyxcbiAgICBsaW5lOiBsaW5lVW5pZm9ybXMsXG4gICAgbGluZVBhdHRlcm46IGxpbmVQYXR0ZXJuVW5pZm9ybXMsXG4gICAgcmFzdGVyOiByYXN0ZXJVbmlmb3JtcyxcbiAgICBzeW1ib2xJY29uOiBzeW1ib2xJY29uVW5pZm9ybXMsXG4gICAgc3ltYm9sU0RGOiBzeW1ib2xTREZVbmlmb3JtcyxcbiAgICBzeW1ib2xUZXh0QW5kSWNvbjogc3ltYm9sVGV4dEFuZEljb25Vbmlmb3JtcyxcbiAgICBiYWNrZ3JvdW5kOiBiYWNrZ3JvdW5kVW5pZm9ybXMsXG4gICAgYmFja2dyb3VuZFBhdHRlcm46IGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybXMsXG4gICAgdGVycmFpblJhc3RlcjogdGVycmFpblJhc3RlclVuaWZvcm1zLFxuICAgIHRlcnJhaW5EZXB0aDogdGVycmFpblJhc3RlclVuaWZvcm1zLFxuICAgIHNreWJveDogc2t5Ym94VW5pZm9ybXMsXG4gICAgc2t5Ym94R3JhZGllbnQ6IHNreWJveEdyYWRpZW50VW5pZm9ybXMsXG4gICAgc2t5Ym94Q2FwdHVyZTogc2t5Ym94Q2FwdHVyZVVuaWZvcm1zLFxuICAgIGdsb2JlUmFzdGVyOiBnbG9iZVJhc3RlclVuaWZvcm1zLFxuICAgIGdsb2JlQXRtb3NwaGVyZTogYXRtb3NwaGVyZVVuaWZvcm1zLFxufTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUgU3ltYm9sQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZS5qcyc7XG5pbXBvcnQge2NvbGxpc2lvblVuaWZvcm1WYWx1ZXMsIGNvbGxpc2lvbkNpcmNsZVVuaWZvcm1WYWx1ZXN9IGZyb20gJy4vcHJvZ3JhbS9jb2xsaXNpb25fcHJvZ3JhbS5qcyc7XG5pbXBvcnQge1F1YWRUcmlhbmdsZUFycmF5LCBDb2xsaXNpb25DaXJjbGVMYXlvdXRBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQge2NvbGxpc2lvbkNpcmNsZUxheW91dH0gZnJvbSAnLi4vZGF0YS9idWNrZXQvc3ltYm9sX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IFNlZ21lbnRWZWN0b3IgZnJvbSAnLi4vZGF0YS9zZWdtZW50LmpzJztcbmltcG9ydCB7bWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCB0eXBlIFByb2plY3Rpb24gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vcHJvamVjdGlvbi5qcyc7XG5pbXBvcnQge2dldENvbGxpc2lvbkRlYnVnVGlsZVByb2plY3Rpb25NYXRyaXh9IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3Byb2plY3Rpb25fdXRpbC5qcyc7XG5pbXBvcnQgVmVydGV4QnVmZmVyIGZyb20gJy4uL2dsL3ZlcnRleF9idWZmZXIuanMnO1xuaW1wb3J0IEluZGV4QnVmZmVyIGZyb20gJy4uL2dsL2luZGV4X2J1ZmZlci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdDb2xsaXNpb25EZWJ1ZztcblxudHlwZSBUaWxlQmF0Y2ggPSB7XG4gICAgY2lyY2xlQXJyYXk6IEFycmF5PG51bWJlcj4sXG4gICAgY2lyY2xlT2Zmc2V0OiBudW1iZXIsXG4gICAgdHJhbnNmb3JtOiBGbG9hdDMyQXJyYXksXG4gICAgaW52VHJhbnNmb3JtOiBGbG9hdDMyQXJyYXksXG4gICAgcHJvamVjdGlvbjogUHJvamVjdGlvblxufTtcblxubGV0IHF1YWRUcmlhbmdsZXM6ID9RdWFkVHJpYW5nbGVBcnJheTtcblxuZnVuY3Rpb24gZHJhd0NvbGxpc2lvbkRlYnVnKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IFN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4sIHRyYW5zbGF0ZTogW251bWJlciwgbnVtYmVyXSwgdHJhbnNsYXRlQW5jaG9yOiAnbWFwJyB8ICd2aWV3cG9ydCcsIGlzVGV4dDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIGNvbnN0IHRyID0gcGFpbnRlci50cmFuc2Zvcm07XG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnY29sbGlzaW9uQm94Jyk7XG4gICAgY29uc3QgdGlsZUJhdGNoZXM6IEFycmF5PFRpbGVCYXRjaD4gPSBbXTtcbiAgICBsZXQgY2lyY2xlQ291bnQgPSAwO1xuICAgIGxldCBjaXJjbGVPZmZzZXQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29vcmQgPSBjb29yZHNbaV07XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0OiA/U3ltYm9sQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHRpbGVNYXRyaXggPSBnZXRDb2xsaXNpb25EZWJ1Z1RpbGVQcm9qZWN0aW9uTWF0cml4KGNvb3JkLCBidWNrZXQsIHRyKTtcblxuICAgICAgICBsZXQgcG9zTWF0cml4ID0gdGlsZU1hdHJpeDtcbiAgICAgICAgaWYgKHRyYW5zbGF0ZVswXSAhPT0gMCB8fCB0cmFuc2xhdGVbMV0gIT09IDApIHtcbiAgICAgICAgICAgIHBvc01hdHJpeCA9IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KHRpbGVNYXRyaXgsIHRpbGUsIHRyYW5zbGF0ZSwgdHJhbnNsYXRlQW5jaG9yKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWZmZXJzID0gaXNUZXh0ID8gYnVja2V0LnRleHRDb2xsaXNpb25Cb3ggOiBidWNrZXQuaWNvbkNvbGxpc2lvbkJveDtcbiAgICAgICAgLy8gR2V0IGNvbGxpc2lvbiBjaXJjbGUgZGF0YSBvZiB0aGlzIGJ1Y2tldFxuICAgICAgICBjb25zdCBjaXJjbGVBcnJheTogQXJyYXk8bnVtYmVyPiA9IGJ1Y2tldC5jb2xsaXNpb25DaXJjbGVBcnJheTtcbiAgICAgICAgaWYgKGNpcmNsZUFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8ga25vdyB0aGUgcHJvamVjdGlvbiBtYXRyaXggdGhhdCB3YXMgdXNlZCBmb3IgcHJvamVjdGluZyBjb2xsaXNpb24gY2lyY2xlcyB0byB0aGUgc2NyZWVuLlxuICAgICAgICAgICAgLy8gVGhpcyBtaWdodCB2YXJ5IGJldHdlZW4gYnVja2V0cyBhcyB0aGUgc3ltYm9sIHBsYWNlbWVudCBpcyBhIGNvbnRpbm91cyBwcm9jZXNzLiBUaGlzIG1hdHJpeCBpc1xuICAgICAgICAgICAgLy8gcmVxdWlyZWQgZm9yIHRyYW5zZm9ybWluZyBwb2ludHMgZnJvbSBwcmV2aW91cyBzY3JlZW4gc3BhY2UgdG8gdGhlIGN1cnJlbnQgb25lXG4gICAgICAgICAgICBjb25zdCBpbnZUcmFuc2Zvcm0gPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gcG9zTWF0cml4O1xuXG4gICAgICAgICAgICBtYXQ0Lm11bChpbnZUcmFuc2Zvcm0sIGJ1Y2tldC5wbGFjZW1lbnRJbnZQcm9qTWF0cml4LCB0ci5nbENvb3JkTWF0cml4KTtcbiAgICAgICAgICAgIG1hdDQubXVsKGludlRyYW5zZm9ybSwgaW52VHJhbnNmb3JtLCBidWNrZXQucGxhY2VtZW50Vmlld3BvcnRNYXRyaXgpO1xuXG4gICAgICAgICAgICB0aWxlQmF0Y2hlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjaXJjbGVBcnJheSxcbiAgICAgICAgICAgICAgICBjaXJjbGVPZmZzZXQsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgIGludlRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uOiBidWNrZXQuZ2V0UHJvamVjdGlvbigpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY2lyY2xlQ291bnQgKz0gY2lyY2xlQXJyYXkubGVuZ3RoIC8gNDsgIC8vIDQgdmFsdWVzIHBlciBjaXJjbGVcbiAgICAgICAgICAgIGNpcmNsZU9mZnNldCA9IGNpcmNsZUNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghYnVmZmVycykgY29udGludWU7XG4gICAgICAgIGlmIChwYWludGVyLnRlcnJhaW4pIHBhaW50ZXIudGVycmFpbi5zZXR1cEVsZXZhdGlvbkRyYXcodGlsZSwgcHJvZ3JhbSk7XG4gICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5MSU5FUyxcbiAgICAgICAgICAgIERlcHRoTW9kZS5kaXNhYmxlZCwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSxcbiAgICAgICAgICAgIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIGNvbGxpc2lvblVuaWZvcm1WYWx1ZXMocG9zTWF0cml4LCB0ciwgdGlsZSwgYnVja2V0LmdldFByb2plY3Rpb24oKSksXG4gICAgICAgICAgICBsYXllci5pZCwgYnVmZmVycy5sYXlvdXRWZXJ0ZXhCdWZmZXIsIGJ1ZmZlcnMuaW5kZXhCdWZmZXIsXG4gICAgICAgICAgICBidWZmZXJzLnNlZ21lbnRzLCBudWxsLCB0ci56b29tLCBudWxsLFxuICAgICAgICAgICAgYnVmZmVycy5jb2xsaXNpb25WZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICBidWZmZXJzLmNvbGxpc2lvblZlcnRleEJ1ZmZlckV4dCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1RleHQgfHwgIXRpbGVCYXRjaGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIGNvbGxpc2lvbiBjaXJjbGVzXG4gICAgY29uc3QgY2lyY2xlUHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnY29sbGlzaW9uQ2lyY2xlJyk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgdmVydGV4IGRhdGFcbiAgICBjb25zdCB2ZXJ0ZXhEYXRhID0gbmV3IENvbGxpc2lvbkNpcmNsZUxheW91dEFycmF5KCk7XG4gICAgdmVydGV4RGF0YS5yZXNpemUoY2lyY2xlQ291bnQgKiA0KTtcbiAgICB2ZXJ0ZXhEYXRhLl90cmltKCk7XG5cbiAgICBsZXQgdmVydGV4T2Zmc2V0ID0gMDtcblxuICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgdGlsZUJhdGNoZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaC5jaXJjbGVBcnJheS5sZW5ndGggLyA0OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNpcmNsZUlkeCA9IGkgKiA0O1xuICAgICAgICAgICAgY29uc3QgeCA9IGJhdGNoLmNpcmNsZUFycmF5W2NpcmNsZUlkeCArIDBdO1xuICAgICAgICAgICAgY29uc3QgeSA9IGJhdGNoLmNpcmNsZUFycmF5W2NpcmNsZUlkeCArIDFdO1xuICAgICAgICAgICAgY29uc3QgcmFkaXVzID0gYmF0Y2guY2lyY2xlQXJyYXlbY2lyY2xlSWR4ICsgMl07XG4gICAgICAgICAgICBjb25zdCBjb2xsaXNpb24gPSBiYXRjaC5jaXJjbGVBcnJheVtjaXJjbGVJZHggKyAzXTtcblxuICAgICAgICAgICAgLy8gNCBmbG9hdHMgcGVyIHZlcnRleCwgNCB2ZXJ0aWNlcyBwZXIgcXVhZFxuICAgICAgICAgICAgdmVydGV4RGF0YS5lbXBsYWNlKHZlcnRleE9mZnNldCsrLCB4LCB5LCByYWRpdXMsIGNvbGxpc2lvbiwgMCk7XG4gICAgICAgICAgICB2ZXJ0ZXhEYXRhLmVtcGxhY2UodmVydGV4T2Zmc2V0KyssIHgsIHksIHJhZGl1cywgY29sbGlzaW9uLCAxKTtcbiAgICAgICAgICAgIHZlcnRleERhdGEuZW1wbGFjZSh2ZXJ0ZXhPZmZzZXQrKywgeCwgeSwgcmFkaXVzLCBjb2xsaXNpb24sIDIpO1xuICAgICAgICAgICAgdmVydGV4RGF0YS5lbXBsYWNlKHZlcnRleE9mZnNldCsrLCB4LCB5LCByYWRpdXMsIGNvbGxpc2lvbiwgMyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFxdWFkVHJpYW5nbGVzIHx8IHF1YWRUcmlhbmdsZXMubGVuZ3RoIDwgY2lyY2xlQ291bnQgKiAyKSB7XG4gICAgICAgIHF1YWRUcmlhbmdsZXMgPSBjcmVhdGVRdWFkVHJpYW5nbGVzKGNpcmNsZUNvdW50KTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHF1YWRUcmlhbmdsZXMsIHRydWUpO1xuICAgIGNvbnN0IHZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodmVydGV4RGF0YSwgY29sbGlzaW9uQ2lyY2xlTGF5b3V0Lm1lbWJlcnMsIHRydWUpO1xuXG4gICAgLy8gUmVuZGVyIGJhdGNoZXNcbiAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHRpbGVCYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IHVuaWZvcm1zID0gY29sbGlzaW9uQ2lyY2xlVW5pZm9ybVZhbHVlcyhiYXRjaC50cmFuc2Zvcm0sIGJhdGNoLmludlRyYW5zZm9ybSwgdHIsIGJhdGNoLnByb2plY3Rpb24pO1xuXG4gICAgICAgIGNpcmNsZVByb2dyYW0uZHJhdyhcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBnbC5UUklBTkdMRVMsXG4gICAgICAgICAgICBEZXB0aE1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBTdGVuY2lsTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLFxuICAgICAgICAgICAgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgdW5pZm9ybXMsXG4gICAgICAgICAgICBsYXllci5pZCxcbiAgICAgICAgICAgIHZlcnRleEJ1ZmZlcixcbiAgICAgICAgICAgIGluZGV4QnVmZmVyLFxuICAgICAgICAgICAgU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIGJhdGNoLmNpcmNsZU9mZnNldCAqIDIsIGJhdGNoLmNpcmNsZUFycmF5Lmxlbmd0aCwgYmF0Y2guY2lyY2xlQXJyYXkubGVuZ3RoIC8gMiksXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdHIuem9vbSk7XG4gICAgfVxuXG4gICAgdmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICBpbmRleEJ1ZmZlci5kZXN0cm95KCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVF1YWRUcmlhbmdsZXMocXVhZENvdW50OiBudW1iZXIpOiBRdWFkVHJpYW5nbGVBcnJheSB7XG4gICAgY29uc3QgdHJpQ291bnQgPSBxdWFkQ291bnQgKiAyO1xuICAgIGNvbnN0IGFycmF5ID0gbmV3IFF1YWRUcmlhbmdsZUFycmF5KCk7XG5cbiAgICBhcnJheS5yZXNpemUodHJpQ291bnQpO1xuICAgIGFycmF5Ll90cmltKCk7XG5cbiAgICAvLyBUd28gdHJpYW5nbGVzIGFuZCA0IHZlcnRpY2VzIHBlciBxdWFkLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJpQ291bnQ7IGkrKykge1xuICAgICAgICBjb25zdCBpZHggPSBpICogNjtcblxuICAgICAgICBhcnJheS51aW50MTZbaWR4ICsgMF0gPSBpICogNCArIDA7XG4gICAgICAgIGFycmF5LnVpbnQxNltpZHggKyAxXSA9IGkgKiA0ICsgMTtcbiAgICAgICAgYXJyYXkudWludDE2W2lkeCArIDJdID0gaSAqIDQgKyAyO1xuICAgICAgICBhcnJheS51aW50MTZbaWR4ICsgM10gPSBpICogNCArIDI7XG4gICAgICAgIGFycmF5LnVpbnQxNltpZHggKyA0XSA9IGkgKiA0ICsgMztcbiAgICAgICAgYXJyYXkudWludDE2W2lkeCArIDVdID0gaSAqIDQgKyAwO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBkcmF3Q29sbGlzaW9uRGVidWcgZnJvbSAnLi9kcmF3X2NvbGxpc2lvbl9kZWJ1Zy5qcyc7XG5cbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudC5qcyc7XG5pbXBvcnQgKiBhcyBzeW1ib2xQcm9qZWN0aW9uIGZyb20gJy4uL3N5bWJvbC9wcm9qZWN0aW9uLmpzJztcbmltcG9ydCAqIGFzIHN5bWJvbFNpemUgZnJvbSAnLi4vc3ltYm9sL3N5bWJvbF9zaXplLmpzJztcbmltcG9ydCB7bWF0NCwgdmVjMywgdmVjNH0gZnJvbSAnZ2wtbWF0cml4JztcbmNvbnN0IGlkZW50aXR5TWF0NCA9IG1hdDQuY3JlYXRlKCk7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZS5qcyc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlLmpzJztcbmltcG9ydCB7YWRkRHluYW1pY0F0dHJpYnV0ZXN9IGZyb20gJy4uL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMnO1xuaW1wb3J0IHtnZXRBbmNob3JBbGlnbm1lbnQsIFdyaXRpbmdNb2RlfSBmcm9tICcuLi9zeW1ib2wvc2hhcGluZy5qcyc7XG5pbXBvcnQgT05FX0VNIGZyb20gJy4uL3N5bWJvbC9vbmVfZW0uanMnO1xuaW1wb3J0IHtldmFsdWF0ZVZhcmlhYmxlT2Zmc2V0fSBmcm9tICcuLi9zeW1ib2wvc3ltYm9sX2xheW91dC5qcyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuLi9zb3VyY2UvdGlsZS5qcyc7XG5pbXBvcnQgdHlwZSBUcmFuc2Zvcm0gZnJvbSAnLi4vZ2VvL3RyYW5zZm9ybS5qcyc7XG5pbXBvcnQge1xuICAgIG1lcmNhdG9yWGZyb21MbmcsXG4gICAgbWVyY2F0b3JZZnJvbUxhdFxufSBmcm9tICcuLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQge2dsb2JlVG9NZXJjYXRvclRyYW5zaXRpb259IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL2dsb2JlX3V0aWwuanMnO1xuXG5pbXBvcnQge1xuICAgIHN5bWJvbEljb25Vbmlmb3JtVmFsdWVzLFxuICAgIHN5bWJvbFNERlVuaWZvcm1WYWx1ZXMsXG4gICAgc3ltYm9sVGV4dEFuZEljb25Vbmlmb3JtVmFsdWVzXG59IGZyb20gJy4vcHJvZ3JhbS9zeW1ib2xfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge2dldFN5bWJvbFRpbGVQcm9qZWN0aW9uTWF0cml4fSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9wcm9qZWN0aW9uX3V0aWwuanMnO1xuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBTeW1ib2xTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBTeW1ib2xCdWNrZXQsIHtTeW1ib2xCdWZmZXJzfSBmcm9tICcuLi9kYXRhL2J1Y2tldC9zeW1ib2xfYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIFRleHR1cmUgZnJvbSAnLi4vcmVuZGVyL3RleHR1cmUuanMnO1xuaW1wb3J0IHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7VW5pZm9ybVZhbHVlc30gZnJvbSAnLi91bmlmb3JtX2JpbmRpbmcuanMnO1xuaW1wb3J0IHR5cGUge1N5bWJvbFNERlVuaWZvcm1zVHlwZX0gZnJvbSAnLi4vcmVuZGVyL3Byb2dyYW0vc3ltYm9sX3Byb2dyYW0uanMnO1xuaW1wb3J0IHR5cGUge0Nyb3NzVGlsZUlELCBWYXJpYWJsZU9mZnNldH0gZnJvbSAnLi4vc3ltYm9sL3BsYWNlbWVudC5qcyc7XG5pbXBvcnQgdHlwZSB7VmVjM30gZnJvbSAnZ2wtbWF0cml4JztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd1N5bWJvbHM7XG5cbnR5cGUgU3ltYm9sVGlsZVJlbmRlclN0YXRlID0ge1xuICAgIHNlZ21lbnRzOiBTZWdtZW50VmVjdG9yLFxuICAgIHNvcnRLZXk6IG51bWJlcixcbiAgICBzdGF0ZToge1xuICAgICAgICBwcm9ncmFtOiBhbnksXG4gICAgICAgIGJ1ZmZlcnM6IFN5bWJvbEJ1ZmZlcnMsXG4gICAgICAgIHVuaWZvcm1WYWx1ZXM6IGFueSxcbiAgICAgICAgYXRsYXNUZXh0dXJlOiBUZXh0dXJlLFxuICAgICAgICBhdGxhc1RleHR1cmVJY29uOiBUZXh0dXJlIHwgbnVsbCxcbiAgICAgICAgYXRsYXNJbnRlcnBvbGF0aW9uOiBhbnksXG4gICAgICAgIGF0bGFzSW50ZXJwb2xhdGlvbkljb246IGFueSxcbiAgICAgICAgaXNTREY6IGJvb2xlYW4sXG4gICAgICAgIGhhc0hhbG86IGJvb2xlYW4sXG4gICAgICAgIHRpbGU6IFRpbGUsXG4gICAgICAgIGxhYmVsUGxhbmVNYXRyaXhJbnY6ID9GbG9hdDMyQXJyYXlcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBkcmF3U3ltYm9scyhwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGxheWVyOiBTeW1ib2xTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+LCB2YXJpYWJsZU9mZnNldHM6IHtbXzogQ3Jvc3NUaWxlSURdOiBWYXJpYWJsZU9mZnNldH0pIHtcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzICE9PSAndHJhbnNsdWNlbnQnKSByZXR1cm47XG5cbiAgICAvLyBEaXNhYmxlIHRoZSBzdGVuY2lsIHRlc3Qgc28gdGhhdCBsYWJlbHMgYXJlbid0IGNsaXBwZWQgdG8gdGlsZSBib3VuZGFyaWVzLlxuICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG4gICAgY29uc3QgdmFyaWFibGVQbGFjZW1lbnQgPSBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LXZhcmlhYmxlLWFuY2hvcicpO1xuXG4gICAgLy9Db21wdXRlIHZhcmlhYmxlLW9mZnNldHMgYmVmb3JlIHBhaW50aW5nIHNpbmNlIGljb25zIGFuZCB0ZXh0IGRhdGEgcG9zaXRpb25pbmdcbiAgICAvL2RlcGVuZCBvbiBlYWNoIG90aGVyIGluIHRoaXMgY2FzZS5cbiAgICBpZiAodmFyaWFibGVQbGFjZW1lbnQpIHtcbiAgICAgICAgdXBkYXRlVmFyaWFibGVBbmNob3JzKGNvb3JkcywgcGFpbnRlciwgbGF5ZXIsIHNvdXJjZUNhY2hlLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ3RleHQtcGl0Y2gtYWxpZ25tZW50JyksXG4gICAgICAgICAgICB2YXJpYWJsZU9mZnNldHNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCdpY29uLW9wYWNpdHknKS5jb25zdGFudE9yKDEpICE9PSAwKSB7XG4gICAgICAgIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGZhbHNlLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZS1hbmNob3InKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXBpdGNoLWFsaWdubWVudCcpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgnaWNvbi1rZWVwLXVwcmlnaHQnKSxcbiAgICAgICAgICAgIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobGF5ZXIucGFpbnQuZ2V0KCd0ZXh0LW9wYWNpdHknKS5jb25zdGFudE9yKDEpICE9PSAwKSB7XG4gICAgICAgIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIHRydWUsXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ3RleHQtdHJhbnNsYXRlJyksXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ3RleHQtdHJhbnNsYXRlLWFuY2hvcicpLFxuICAgICAgICAgICAgbGF5ZXIubGF5b3V0LmdldCgndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnKSxcbiAgICAgICAgICAgIGxheWVyLmxheW91dC5nZXQoJ3RleHQtcGl0Y2gtYWxpZ25tZW50JyksXG4gICAgICAgICAgICBsYXllci5sYXlvdXQuZ2V0KCd0ZXh0LWtlZXAtdXByaWdodCcpLFxuICAgICAgICAgICAgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2VDYWNoZS5tYXAuc2hvd0NvbGxpc2lvbkJveGVzKSB7XG4gICAgICAgIGRyYXdDb2xsaXNpb25EZWJ1ZyhwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgbGF5ZXIucGFpbnQuZ2V0KCd0ZXh0LXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCd0ZXh0LXRyYW5zbGF0ZS1hbmNob3InKSwgdHJ1ZSk7XG4gICAgICAgIGRyYXdDb2xsaXNpb25EZWJ1ZyhwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkcywgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZScpLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnQuZ2V0KCdpY29uLXRyYW5zbGF0ZS1hbmNob3InKSwgZmFsc2UpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUdsb2JlQ2FtZXJhVXAodHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIGNvbnN0IHZpZXdNYXRyaXggPSB0cmFuc2Zvcm0uX2NhbWVyYS5nZXRXb3JsZFRvQ2FtZXJhKHRyYW5zZm9ybS53b3JsZFNpemUsIDEpO1xuICAgIGNvbnN0IHZpZXdUb0VjZWYgPSBtYXQ0Lm11bHRpcGx5KFtdLCB2aWV3TWF0cml4LCB0cmFuc2Zvcm0uZ2xvYmVNYXRyaXgpO1xuICAgIG1hdDQuaW52ZXJ0KHZpZXdUb0VjZWYsIHZpZXdUb0VjZWYpO1xuXG4gICAgY29uc3QgY2FtZXJhVXBWZWN0b3IgPSBbMCwgMCwgMF07XG4gICAgY29uc3QgdXAgPSBbMCwgMSwgMCwgMF07XG4gICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHVwLCB1cCwgIHZpZXdUb0VjZWYpO1xuICAgIGNhbWVyYVVwVmVjdG9yWzBdID0gdXBbMF07XG4gICAgY2FtZXJhVXBWZWN0b3JbMV0gPSB1cFsxXTtcbiAgICBjYW1lcmFVcFZlY3RvclsyXSA9IHVwWzJdO1xuICAgIHZlYzMubm9ybWFsaXplKGNhbWVyYVVwVmVjdG9yLCBjYW1lcmFVcFZlY3Rvcik7XG5cbiAgICByZXR1cm4gY2FtZXJhVXBWZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVZhcmlhYmxlUmVuZGVyU2hpZnQoYW5jaG9yLCB3aWR0aCwgaGVpZ2h0LCB0ZXh0T2Zmc2V0LCB0ZXh0U2NhbGUsIHJlbmRlclRleHRTaXplKTogUG9pbnQge1xuICAgIGNvbnN0IHtob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ259ID0gZ2V0QW5jaG9yQWxpZ25tZW50KGFuY2hvcik7XG4gICAgY29uc3Qgc2hpZnRYID0gLShob3Jpem9udGFsQWxpZ24gLSAwLjUpICogd2lkdGg7XG4gICAgY29uc3Qgc2hpZnRZID0gLSh2ZXJ0aWNhbEFsaWduIC0gMC41KSAqIGhlaWdodDtcbiAgICBjb25zdCB2YXJpYWJsZU9mZnNldCA9IGV2YWx1YXRlVmFyaWFibGVPZmZzZXQoYW5jaG9yLCB0ZXh0T2Zmc2V0KTtcbiAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICAoc2hpZnRYIC8gdGV4dFNjYWxlICsgdmFyaWFibGVPZmZzZXRbMF0pICogcmVuZGVyVGV4dFNpemUsXG4gICAgICAgIChzaGlmdFkgLyB0ZXh0U2NhbGUgKyB2YXJpYWJsZU9mZnNldFsxXSkgKiByZW5kZXJUZXh0U2l6ZVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZhcmlhYmxlQW5jaG9ycyhjb29yZHMsIHBhaW50ZXIsIGxheWVyLCBzb3VyY2VDYWNoZSwgcm90YXRpb25BbGlnbm1lbnQsIHBpdGNoQWxpZ25tZW50LCB2YXJpYWJsZU9mZnNldHMpIHtcbiAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSByb3RhdGlvbkFsaWdubWVudCA9PT0gJ21hcCc7XG4gICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gcGl0Y2hBbGlnbm1lbnQgPT09ICdtYXAnO1xuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBjb25zdCBidWNrZXQ6IFN5bWJvbEJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0IHx8ICFidWNrZXQudGV4dCB8fCAhYnVja2V0LnRleHQuc2VnbWVudHMuZ2V0KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpemVEYXRhID0gYnVja2V0LnRleHRTaXplRGF0YTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbShzaXplRGF0YSwgdHIuem9vbSk7XG4gICAgICAgIGNvbnN0IHRpbGVNYXRyaXggPSBnZXRTeW1ib2xUaWxlUHJvamVjdGlvbk1hdHJpeChjb29yZCwgYnVja2V0LmdldFByb2plY3Rpb24oKSwgdHIpO1xuXG4gICAgICAgIGNvbnN0IHBpeGVsc1RvVGlsZVVuaXRzID0gdHIuY2FsY3VsYXRlUGl4ZWxzVG9UaWxlVW5pdHNNYXRyaXgodGlsZSk7XG4gICAgICAgIGNvbnN0IGxhYmVsUGxhbmVNYXRyaXggPSBzeW1ib2xQcm9qZWN0aW9uLmdldExhYmVsUGxhbmVNYXRyaXhGb3JSZW5kZXJpbmcodGlsZU1hdHJpeCwgdGlsZS50aWxlSUQuY2Fub25pY2FsLCBwaXRjaFdpdGhNYXAsIHJvdGF0ZVdpdGhNYXAsIHRyLCBidWNrZXQuZ2V0UHJvamVjdGlvbigpLCBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVRleHRGaXRJY29uID0gbGF5ZXIubGF5b3V0LmdldCgnaWNvbi10ZXh0LWZpdCcpICE9PSAnbm9uZScgJiYgIGJ1Y2tldC5oYXNJY29uRGF0YSgpO1xuXG4gICAgICAgIGlmIChzaXplKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlU2NhbGUgPSBNYXRoLnBvdygyLCB0ci56b29tIC0gdGlsZS50aWxlSUQub3ZlcnNjYWxlZFopO1xuICAgICAgICAgICAgdXBkYXRlVmFyaWFibGVBbmNob3JzRm9yQnVja2V0KGJ1Y2tldCwgcm90YXRlV2l0aE1hcCwgcGl0Y2hXaXRoTWFwLCB2YXJpYWJsZU9mZnNldHMsIHN5bWJvbFNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIsIGxhYmVsUGxhbmVNYXRyaXgsIGNvb3JkLCB0aWxlU2NhbGUsIHNpemUsIHVwZGF0ZVRleHRGaXRJY29uKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlVmFyaWFibGVBbmNob3JzRm9yQnVja2V0KGJ1Y2tldCwgcm90YXRlV2l0aE1hcCwgcGl0Y2hXaXRoTWFwLCB2YXJpYWJsZU9mZnNldHMsIHN5bWJvbFNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLCBsYWJlbFBsYW5lTWF0cml4LCBjb29yZCwgdGlsZVNjYWxlLCBzaXplLCB1cGRhdGVUZXh0Rml0SWNvbikge1xuICAgIGNvbnN0IHBsYWNlZFN5bWJvbHMgPSBidWNrZXQudGV4dC5wbGFjZWRTeW1ib2xBcnJheTtcbiAgICBjb25zdCBkeW5hbWljVGV4dExheW91dFZlcnRleEFycmF5ID0gYnVja2V0LnRleHQuZHluYW1pY0xheW91dFZlcnRleEFycmF5O1xuICAgIGNvbnN0IGR5bmFtaWNJY29uTGF5b3V0VmVydGV4QXJyYXkgPSBidWNrZXQuaWNvbi5keW5hbWljTGF5b3V0VmVydGV4QXJyYXk7XG4gICAgY29uc3QgcGxhY2VkVGV4dFNoaWZ0cyA9IHt9O1xuICAgIGNvbnN0IHRpbGVNYXRyaXggPSBnZXRTeW1ib2xUaWxlUHJvamVjdGlvbk1hdHJpeChjb29yZCwgYnVja2V0LmdldFByb2plY3Rpb24oKSwgdHJhbnNmb3JtKTtcbiAgICBjb25zdCBlbGV2YXRpb24gPSB0cmFuc2Zvcm0uZWxldmF0aW9uO1xuICAgIGNvbnN0IHVwVmVjdG9yU2NhbGUgPSBidWNrZXQuZ2V0UHJvamVjdGlvbigpLnVwVmVjdG9yU2NhbGUoY29vcmQuY2Fub25pY2FsLCB0cmFuc2Zvcm0uY2VudGVyLmxhdCwgdHJhbnNmb3JtLndvcmxkU2l6ZSk7XG5cbiAgICBkeW5hbWljVGV4dExheW91dFZlcnRleEFycmF5LmNsZWFyKCk7XG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBwbGFjZWRTeW1ib2xzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbDogYW55ID0gcGxhY2VkU3ltYm9scy5nZXQocyk7XG4gICAgICAgIGNvbnN0IHNraXBPcmllbnRhdGlvbiA9IGJ1Y2tldC5hbGxvd1ZlcnRpY2FsUGxhY2VtZW50ICYmICFzeW1ib2wucGxhY2VkT3JpZW50YXRpb247XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlT2Zmc2V0ID0gKCFzeW1ib2wuaGlkZGVuICYmIHN5bWJvbC5jcm9zc1RpbGVJRCAmJiAhc2tpcE9yaWVudGF0aW9uKSA/IHZhcmlhYmxlT2Zmc2V0c1tzeW1ib2wuY3Jvc3NUaWxlSURdIDogbnVsbDtcblxuICAgICAgICBpZiAoIXZhcmlhYmxlT2Zmc2V0KSB7XG4gICAgICAgICAgICAvLyBUaGVzZSBzeW1ib2xzIGFyZSBmcm9tIGEganVzdGlmaWNhdGlvbiB0aGF0IGlzIG5vdCBiZWluZyB1c2VkLCBvciBhIGxhYmVsIHRoYXQgd2Fzbid0IHBsYWNlZFxuICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBkbyB0aGUgZXh0cmEgbWF0aCB0byBmaWd1cmUgb3V0IHdoYXQgaW5jcmVtZW50YWwgc2hpZnQgdG8gYXBwbHkuXG4gICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLmhpZGVHbHlwaHMoc3ltYm9sLm51bUdseXBocywgZHluYW1pY1RleHRMYXlvdXRWZXJ0ZXhBcnJheSk7XG4gICAgICAgIH0gZWxzZSAge1xuICAgICAgICAgICAgY29uc3QgdGlsZUFuY2hvciA9IG5ldyBQb2ludChzeW1ib2wudGlsZUFuY2hvclgsIHN5bWJvbC50aWxlQW5jaG9yWSk7XG4gICAgICAgICAgICBjb25zdCB1cERpciA9IGJ1Y2tldC5nZXRQcm9qZWN0aW9uKCkudXBWZWN0b3IoY29vcmQuY2Fub25pY2FsLCB0aWxlQW5jaG9yLngsIHRpbGVBbmNob3IueSk7XG4gICAgICAgICAgICBjb25zdCBhbmNob3JFbGV2YXRpb24gPSBlbGV2YXRpb24gPyBlbGV2YXRpb24uZ2V0QXRUaWxlT2Zmc2V0KGNvb3JkLCB0aWxlQW5jaG9yLngsIHRpbGVBbmNob3IueSkgOiAwLjA7XG4gICAgICAgICAgICBjb25zdCByZXByb2plY3RlZEFuY2hvciA9IFtcbiAgICAgICAgICAgICAgICBzeW1ib2wucHJvamVjdGVkQW5jaG9yWCArIGFuY2hvckVsZXZhdGlvbiAqIHVwRGlyWzBdICogdXBWZWN0b3JTY2FsZS5tZXRlcnNUb1RpbGUsXG4gICAgICAgICAgICAgICAgc3ltYm9sLnByb2plY3RlZEFuY2hvclkgKyBhbmNob3JFbGV2YXRpb24gKiB1cERpclsxXSAqIHVwVmVjdG9yU2NhbGUubWV0ZXJzVG9UaWxlLFxuICAgICAgICAgICAgICAgIHN5bWJvbC5wcm9qZWN0ZWRBbmNob3JaICsgYW5jaG9yRWxldmF0aW9uICogdXBEaXJbMl0gKiB1cFZlY3RvclNjYWxlLm1ldGVyc1RvVGlsZVxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkQW5jaG9yID0gc3ltYm9sUHJvamVjdGlvbi5wcm9qZWN0VmVjdG9yKHJlcHJvamVjdGVkQW5jaG9yLCBwaXRjaFdpdGhNYXAgPyB0aWxlTWF0cml4IDogbGFiZWxQbGFuZU1hdHJpeCk7XG4gICAgICAgICAgICBjb25zdCBwZXJzcGVjdGl2ZVJhdGlvID0gc3ltYm9sUHJvamVjdGlvbi5nZXRQZXJzcGVjdGl2ZVJhdGlvKHRyYW5zZm9ybS5nZXRDYW1lcmFUb0NlbnRlckRpc3RhbmNlKGJ1Y2tldC5nZXRQcm9qZWN0aW9uKCkpLCBwcm9qZWN0ZWRBbmNob3Iuc2lnbmVkRGlzdGFuY2VGcm9tQ2FtZXJhKTtcbiAgICAgICAgICAgIGxldCByZW5kZXJUZXh0U2l6ZSA9IHN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZShidWNrZXQudGV4dFNpemVEYXRhLCBzaXplLCBzeW1ib2wpICogcGVyc3BlY3RpdmVSYXRpbyAvIE9ORV9FTTtcbiAgICAgICAgICAgIGlmIChwaXRjaFdpdGhNYXApIHtcbiAgICAgICAgICAgICAgICAvLyBHbyBmcm9tIHNpemUgaW4gcGl4ZWxzIHRvIGVxdWl2YWxlbnQgc2l6ZSBpbiB0aWxlIHVuaXRzXG4gICAgICAgICAgICAgICAgcmVuZGVyVGV4dFNpemUgKj0gYnVja2V0LnRpbGVQaXhlbFJhdGlvIC8gdGlsZVNjYWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodCwgYW5jaG9yLCB0ZXh0T2Zmc2V0LCB0ZXh0U2NhbGV9ID0gdmFyaWFibGVPZmZzZXQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gY2FsY3VsYXRlVmFyaWFibGVSZW5kZXJTaGlmdChcbiAgICAgICAgICAgICAgICBhbmNob3IsIHdpZHRoLCBoZWlnaHQsIHRleHRPZmZzZXQsIHRleHRTY2FsZSwgcmVuZGVyVGV4dFNpemUpO1xuXG4gICAgICAgICAgICAvLyBVc3VhbCBjYXNlIGlzIHRoYXQgd2UgdGFrZSB0aGUgcHJvamVjdGVkIGFuY2hvciBhbmQgYWRkIHRoZSBwaXhlbC1iYXNlZCBzaGlmdFxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlZCBhYm92ZS4gSW4gdGhlIChzb21ld2hhdCB3ZWlyZCkgY2FzZSBvZiBwaXRjaC1hbGlnbmVkIHRleHQsIHdlIGFkZCBhbiBlcXVpdmFsZW50XG4gICAgICAgICAgICAvLyB0aWxlLXVuaXQgYmFzZWQgc2hpZnQgdG8gdGhlIGFuY2hvciBiZWZvcmUgcHJvamVjdGluZyB0byB0aGUgbGFiZWwgcGxhbmUuXG4gICAgICAgICAgICBsZXQgc2hpZnRlZEFuY2hvcjogVmVjMztcblxuICAgICAgICAgICAgaWYgKHBpdGNoV2l0aE1hcCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0ZWRUaWxlQW5jaG9yID0gdGlsZUFuY2hvci5hZGQoc2hpZnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHt4LCB5LCB6fSA9IGJ1Y2tldC5nZXRQcm9qZWN0aW9uKCkucHJvamVjdFRpbGVQb2ludChzaGlmdGVkVGlsZUFuY2hvci54LCBzaGlmdGVkVGlsZUFuY2hvci55LCBjb29yZC5jYW5vbmljYWwpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVwcm9qZWN0ZWRTaGlmdGVkQW5jaG9yID0gW1xuICAgICAgICAgICAgICAgICAgICB4ICsgYW5jaG9yRWxldmF0aW9uICogdXBEaXJbMF0gKiB1cFZlY3RvclNjYWxlLm1ldGVyc1RvVGlsZSxcbiAgICAgICAgICAgICAgICAgICAgeSArIGFuY2hvckVsZXZhdGlvbiAqIHVwRGlyWzFdICogdXBWZWN0b3JTY2FsZS5tZXRlcnNUb1RpbGUsXG4gICAgICAgICAgICAgICAgICAgIHogKyBhbmNob3JFbGV2YXRpb24gKiB1cERpclsyXSAqIHVwVmVjdG9yU2NhbGUubWV0ZXJzVG9UaWxlXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIHNoaWZ0ZWRBbmNob3IgPSBzeW1ib2xQcm9qZWN0aW9uLnByb2plY3RWZWN0b3IocmVwcm9qZWN0ZWRTaGlmdGVkQW5jaG9yLCBsYWJlbFBsYW5lTWF0cml4KS5wb2ludDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm90YXRlZFNoaWZ0ID0gcm90YXRlV2l0aE1hcCA/IHNoaWZ0LnJvdGF0ZSgtdHJhbnNmb3JtLmFuZ2xlKSA6IHNoaWZ0O1xuICAgICAgICAgICAgICAgIHNoaWZ0ZWRBbmNob3IgPSBbcHJvamVjdGVkQW5jaG9yLnBvaW50WzBdICsgcm90YXRlZFNoaWZ0LngsIHByb2plY3RlZEFuY2hvci5wb2ludFsxXSArIHJvdGF0ZWRTaGlmdC55LCAwXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYW5nbGUgPSAoYnVja2V0LmFsbG93VmVydGljYWxQbGFjZW1lbnQgJiYgc3ltYm9sLnBsYWNlZE9yaWVudGF0aW9uID09PSBXcml0aW5nTW9kZS52ZXJ0aWNhbCkgPyBNYXRoLlBJIC8gMiA6IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBnID0gMDsgZyA8IHN5bWJvbC5udW1HbHlwaHM7IGcrKykge1xuICAgICAgICAgICAgICAgIGFkZER5bmFtaWNBdHRyaWJ1dGVzKGR5bmFtaWNUZXh0TGF5b3V0VmVydGV4QXJyYXksIHNoaWZ0ZWRBbmNob3JbMF0sIHNoaWZ0ZWRBbmNob3JbMV0sIHNoaWZ0ZWRBbmNob3JbMl0sIGFuZ2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vT25seSBvZmZzZXQgaG9yaXpvbnRhbCB0ZXh0IGljb25zXG4gICAgICAgICAgICBpZiAodXBkYXRlVGV4dEZpdEljb24gJiYgc3ltYm9sLmFzc29jaWF0ZWRJY29uSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIHBsYWNlZFRleHRTaGlmdHNbc3ltYm9sLmFzc29jaWF0ZWRJY29uSW5kZXhdID0ge3NoaWZ0ZWRBbmNob3IsIGFuZ2xlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1cGRhdGVUZXh0Rml0SWNvbikge1xuICAgICAgICBkeW5hbWljSWNvbkxheW91dFZlcnRleEFycmF5LmNsZWFyKCk7XG4gICAgICAgIGNvbnN0IHBsYWNlZEljb25zID0gYnVja2V0Lmljb24ucGxhY2VkU3ltYm9sQXJyYXk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2VkSWNvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBsYWNlZEljb24gPSBwbGFjZWRJY29ucy5nZXQoaSk7XG4gICAgICAgICAgICBpZiAocGxhY2VkSWNvbi5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLmhpZGVHbHlwaHMocGxhY2VkSWNvbi5udW1HbHlwaHMsIGR5bmFtaWNJY29uTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzaGlmdCA9IHBsYWNlZFRleHRTaGlmdHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKCFzaGlmdCkge1xuICAgICAgICAgICAgICAgICAgICBzeW1ib2xQcm9qZWN0aW9uLmhpZGVHbHlwaHMocGxhY2VkSWNvbi5udW1HbHlwaHMsIGR5bmFtaWNJY29uTGF5b3V0VmVydGV4QXJyYXkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGcgPSAwOyBnIDwgcGxhY2VkSWNvbi5udW1HbHlwaHM7IGcrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkRHluYW1pY0F0dHJpYnV0ZXMoZHluYW1pY0ljb25MYXlvdXRWZXJ0ZXhBcnJheSwgc2hpZnQuc2hpZnRlZEFuY2hvclswXSwgc2hpZnQuc2hpZnRlZEFuY2hvclsxXSwgc2hpZnQuc2hpZnRlZEFuY2hvclsyXSwgc2hpZnQuYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ1Y2tldC5pY29uLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIudXBkYXRlRGF0YShkeW5hbWljSWNvbkxheW91dFZlcnRleEFycmF5KTtcbiAgICB9XG4gICAgYnVja2V0LnRleHQuZHluYW1pY0xheW91dFZlcnRleEJ1ZmZlci51cGRhdGVEYXRhKGR5bmFtaWNUZXh0TGF5b3V0VmVydGV4QXJyYXkpO1xufVxuXG5mdW5jdGlvbiBnZXRTeW1ib2xQcm9ncmFtTmFtZShpc1NERjogYm9vbGVhbiwgaXNUZXh0OiBib29sZWFuLCBidWNrZXQ6IFN5bWJvbEJ1Y2tldCkge1xuICAgIGlmIChidWNrZXQuaWNvbnNJblRleHQgJiYgaXNUZXh0KSB7XG4gICAgICAgIHJldHVybiAnc3ltYm9sVGV4dEFuZEljb24nO1xuICAgIH0gZWxzZSBpZiAoaXNTREYpIHtcbiAgICAgICAgcmV0dXJuICdzeW1ib2xTREYnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnc3ltYm9sSWNvbic7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3TGF5ZXJTeW1ib2xzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBpc1RleHQsIHRyYW5zbGF0ZSwgdHJhbnNsYXRlQW5jaG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkFsaWdubWVudCwgcGl0Y2hBbGlnbm1lbnQsIGtlZXBVcHJpZ2h0LCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGNvbnN0IHJvdGF0ZVdpdGhNYXAgPSByb3RhdGlvbkFsaWdubWVudCA9PT0gJ21hcCc7XG4gICAgY29uc3QgcGl0Y2hXaXRoTWFwID0gcGl0Y2hBbGlnbm1lbnQgPT09ICdtYXAnO1xuICAgIGNvbnN0IGFsb25nTGluZSA9IHJvdGF0ZVdpdGhNYXAgJiYgbGF5ZXIubGF5b3V0LmdldCgnc3ltYm9sLXBsYWNlbWVudCcpICE9PSAncG9pbnQnO1xuXG4gICAgLy8gTGluZSBsYWJlbCByb3RhdGlvbiBoYXBwZW5zIGluIGB1cGRhdGVMaW5lTGFiZWxzYFxuICAgIC8vIFBpdGNoZWQgcG9pbnQgbGFiZWxzIGFyZSBhdXRvbWF0aWNhbGx5IHJvdGF0ZWQgYnkgdGhlIGxhYmVsUGxhbmVNYXRyaXggcHJvamVjdGlvblxuICAgIC8vIFVucGl0Y2hlZCBwb2ludCBsYWJlbHMgbmVlZCB0byBoYXZlIHRoZWlyIHJvdGF0aW9uIGFwcGxpZWQgYWZ0ZXIgcHJvamVjdGlvblxuICAgIGNvbnN0IHJvdGF0ZUluU2hhZGVyID0gcm90YXRlV2l0aE1hcCAmJiAhcGl0Y2hXaXRoTWFwICYmICFhbG9uZ0xpbmU7XG5cbiAgICBjb25zdCBoYXNTb3J0S2V5ID0gbGF5ZXIubGF5b3V0LmdldCgnc3ltYm9sLXNvcnQta2V5JykuY29uc3RhbnRPcigxKSAhPT0gdW5kZWZpbmVkO1xuICAgIGxldCBzb3J0RmVhdHVyZXNCeUtleSA9IGZhbHNlO1xuXG4gICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcigwLCBEZXB0aE1vZGUuUmVhZE9ubHkpO1xuICAgIGNvbnN0IG1lcmNhdG9yQ2VudGVyID0gW1xuICAgICAgICBtZXJjYXRvclhmcm9tTG5nKHRyLmNlbnRlci5sbmcpLFxuICAgICAgICBtZXJjYXRvcllmcm9tTGF0KHRyLmNlbnRlci5sYXQpXG4gICAgXTtcbiAgICBjb25zdCB2YXJpYWJsZVBsYWNlbWVudCA9IGxheWVyLmxheW91dC5nZXQoJ3RleHQtdmFyaWFibGUtYW5jaG9yJyk7XG4gICAgY29uc3QgaXNHbG9iZVByb2plY3Rpb24gPSB0ci5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZSc7XG4gICAgY29uc3QgdGlsZVJlbmRlclN0YXRlOiBBcnJheTxTeW1ib2xUaWxlUmVuZGVyU3RhdGU+ID0gW107XG5cbiAgICBjb25zdCBtZXJjYXRvckNhbWVyYVVwID0gWzAsIC0xLCAwXTtcblxuICAgIGxldCBnbG9iZUNhbWVyYVVwID0gbWVyY2F0b3JDYW1lcmFVcDtcbiAgICBpZiAoKGlzR2xvYmVQcm9qZWN0aW9uIHx8IHRyLm1lcmNhdG9yRnJvbVRyYW5zaXRpb24pICYmICFyb3RhdGVXaXRoTWFwKSB7XG4gICAgICAgIC8vIEVhY2ggc3ltYm9sIHJvdGF0aW5nIHdpdGggdGhlIHZpZXdwb3J0IHJlcXVpcmVzIHBlci1pbnN0YW5jZSBpbmZvcm1hdGlvbiBhYm91dFxuICAgICAgICAvLyBob3cgdG8gYWxpZ24gd2l0aCB0aGUgdmlld3BvcnQuIEluIDJEIGNhc2Ugcm90YXRpb24gaXMgc2hhcmVkIGJldHdlZW4gYWxsIG9mIHRoZSBzeW1ib2xzIGFuZFxuICAgICAgICAvLyBoZW5jZSBlbWJlZGRlZCBpbiB0aGUgbGFiZWwgcGxhbmUgbWF0cml4IGJ1dCBpbiBnbG9iZSB2aWV3IHRoaXMgbmVlZHMgdG8gYmUgY29tcHV0ZWQgYXQgcnVudGltZS5cbiAgICAgICAgLy8gQ2FtZXJhIHVwIHZlY3RvciB0b2dldGhlciB3aXRoIHN1cmZhY2Ugbm9ybWFscyBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZSBjb3JyZWN0IG9yaWVudGF0aW9uIGZvciBlYWNoIHN5bWJvbC5cbiAgICAgICAgZ2xvYmVDYW1lcmFVcCA9IGNvbXB1dGVHbG9iZUNhbWVyYVVwKHRyKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIGNvb3Jkcykge1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldDogU3ltYm9sQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuICAgICAgICAvLyBBbGxvdyByZW5kZXJpbmcgb2YgYnVja2V0cyBidWlsdCBmb3IgZ2xvYmUgcHJvamVjdGlvbiBpbiBtZXJjYXRvciBtb2RlXG4gICAgICAgIC8vIHVudGlsIHRoZSBzdWJzdGl0dXRlIHRpbGUgaGFzIGJlZW4gbG9hZGVkXG4gICAgICAgIGlmIChidWNrZXQucHJvamVjdGlvbi5uYW1lID09PSAnbWVyY2F0b3InICYmIGlzR2xvYmVQcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWZmZXJzID0gaXNUZXh0ID8gYnVja2V0LnRleHQgOiBidWNrZXQuaWNvbjtcbiAgICAgICAgaWYgKCFidWZmZXJzIHx8IGJ1Y2tldC5mdWxseUNsaXBwZWQgfHwgIWJ1ZmZlcnMuc2VnbWVudHMuZ2V0KCkubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWZmZXJzLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuXG4gICAgICAgIGNvbnN0IGlzU0RGID0gaXNUZXh0IHx8IGJ1Y2tldC5zZGZJY29ucztcblxuICAgICAgICBjb25zdCBzaXplRGF0YSA9IGlzVGV4dCA/IGJ1Y2tldC50ZXh0U2l6ZURhdGEgOiBidWNrZXQuaWNvblNpemVEYXRhO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IHBpdGNoV2l0aE1hcCB8fCB0ci5waXRjaCAhPT0gMDtcblxuICAgICAgICBjb25zdCBzaXplID0gc3ltYm9sU2l6ZS5ldmFsdWF0ZVNpemVGb3Jab29tKHNpemVEYXRhLCB0ci56b29tKTtcblxuICAgICAgICBsZXQgdGV4U2l6ZTogW251bWJlciwgbnVtYmVyXTtcbiAgICAgICAgbGV0IHRleFNpemVJY29uOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdO1xuICAgICAgICBsZXQgYXRsYXNUZXh0dXJlO1xuICAgICAgICBsZXQgYXRsYXNJbnRlcnBvbGF0aW9uO1xuICAgICAgICBsZXQgYXRsYXNUZXh0dXJlSWNvbiA9IG51bGw7XG4gICAgICAgIGxldCBhdGxhc0ludGVycG9sYXRpb25JY29uO1xuICAgICAgICBpZiAoaXNUZXh0KSB7XG4gICAgICAgICAgICBhdGxhc1RleHR1cmUgPSB0aWxlLmdseXBoQXRsYXNUZXh0dXJlO1xuICAgICAgICAgICAgYXRsYXNJbnRlcnBvbGF0aW9uID0gZ2wuTElORUFSO1xuICAgICAgICAgICAgdGV4U2l6ZSA9IHRpbGUuZ2x5cGhBdGxhc1RleHR1cmUuc2l6ZTtcbiAgICAgICAgICAgIGlmIChidWNrZXQuaWNvbnNJblRleHQpIHtcbiAgICAgICAgICAgICAgICB0ZXhTaXplSWNvbiA9IHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuc2l6ZTtcbiAgICAgICAgICAgICAgICBhdGxhc1RleHR1cmVJY29uID0gdGlsZS5pbWFnZUF0bGFzVGV4dHVyZTtcbiAgICAgICAgICAgICAgICBjb25zdCB6b29tRGVwZW5kZW50U2l6ZSA9IHNpemVEYXRhLmtpbmQgPT09ICdjb21wb3NpdGUnIHx8IHNpemVEYXRhLmtpbmQgPT09ICdjYW1lcmEnO1xuICAgICAgICAgICAgICAgIGF0bGFzSW50ZXJwb2xhdGlvbkljb24gPSB0cmFuc2Zvcm1lZCB8fCBwYWludGVyLm9wdGlvbnMucm90YXRpbmcgfHwgcGFpbnRlci5vcHRpb25zLnpvb21pbmcgfHwgem9vbURlcGVuZGVudFNpemUgPyBnbC5MSU5FQVIgOiBnbC5ORUFSRVNUO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaWNvblNjYWxlZCA9IGxheWVyLmxheW91dC5nZXQoJ2ljb24tc2l6ZScpLmNvbnN0YW50T3IoMCkgIT09IDEgfHwgYnVja2V0Lmljb25zTmVlZExpbmVhcjtcbiAgICAgICAgICAgIGF0bGFzVGV4dHVyZSA9IHRpbGUuaW1hZ2VBdGxhc1RleHR1cmU7XG4gICAgICAgICAgICBhdGxhc0ludGVycG9sYXRpb24gPSBpc1NERiB8fCBwYWludGVyLm9wdGlvbnMucm90YXRpbmcgfHwgcGFpbnRlci5vcHRpb25zLnpvb21pbmcgfHwgaWNvblNjYWxlZCB8fCB0cmFuc2Zvcm1lZCA/XG4gICAgICAgICAgICAgICAgZ2wuTElORUFSIDpcbiAgICAgICAgICAgICAgICBnbC5ORUFSRVNUO1xuICAgICAgICAgICAgdGV4U2l6ZSA9IHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuc2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1Y2tldElzR2xvYmVQcm9qZWN0aW9uID0gYnVja2V0LnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJztcbiAgICAgICAgY29uc3QgY2FtZXJhVXBWZWN0b3IgPSBidWNrZXRJc0dsb2JlUHJvamVjdGlvbiA/IGdsb2JlQ2FtZXJhVXAgOiBtZXJjYXRvckNhbWVyYVVwO1xuICAgICAgICBjb25zdCBnbG9iZVRvTWVyY2F0b3IgPSAgYnVja2V0SXNHbG9iZVByb2plY3Rpb24gPyBnbG9iZVRvTWVyY2F0b3JUcmFuc2l0aW9uKHRyLnpvb20pIDogMC4wO1xuICAgICAgICBjb25zdCB0aWxlTWF0cml4ID0gZ2V0U3ltYm9sVGlsZVByb2plY3Rpb25NYXRyaXgoY29vcmQsIGJ1Y2tldC5nZXRQcm9qZWN0aW9uKCksIHRyKTtcblxuICAgICAgICBjb25zdCBzID0gdHIuY2FsY3VsYXRlUGl4ZWxzVG9UaWxlVW5pdHNNYXRyaXgodGlsZSk7XG4gICAgICAgIGNvbnN0IGxhYmVsUGxhbmVNYXRyaXhSZW5kZXJpbmcgPSBzeW1ib2xQcm9qZWN0aW9uLmdldExhYmVsUGxhbmVNYXRyaXhGb3JSZW5kZXJpbmcodGlsZU1hdHJpeCwgdGlsZS50aWxlSUQuY2Fub25pY2FsLCBwaXRjaFdpdGhNYXAsIHJvdGF0ZVdpdGhNYXAsIHRyLCBidWNrZXQuZ2V0UHJvamVjdGlvbigpLCBzKTtcbiAgICAgICAgLy8gbGFiZWxQbGFuZU1hdHJpeEludiBpcyB1c2VkIGZvciBjb252ZXJ0aW5nIHZlcnRleCBwb3MgdG8gdGlsZSBjb29yZGluYXRlcyBuZWVkZWQgZm9yIHNhbXBsaW5nIGVsZXZhdGlvbi5cbiAgICAgICAgY29uc3QgbGFiZWxQbGFuZU1hdHJpeEludiA9IHBhaW50ZXIudGVycmFpbiAmJiBwaXRjaFdpdGhNYXAgJiYgYWxvbmdMaW5lID8gbWF0NC5pbnZlcnQobWF0NC5jcmVhdGUoKSwgbGFiZWxQbGFuZU1hdHJpeFJlbmRlcmluZykgOiBpZGVudGl0eU1hdDQ7XG4gICAgICAgIGNvbnN0IGdsQ29vcmRNYXRyaXggPSBzeW1ib2xQcm9qZWN0aW9uLmdldEdsQ29vcmRNYXRyaXgodGlsZU1hdHJpeCwgdGlsZS50aWxlSUQuY2Fub25pY2FsLCBwaXRjaFdpdGhNYXAsIHJvdGF0ZVdpdGhNYXAsIHRyLCBidWNrZXQuZ2V0UHJvamVjdGlvbigpLCBzKTtcblxuICAgICAgICBjb25zdCBoYXNWYXJpYWJsZUFuY2hvcnMgPSB2YXJpYWJsZVBsYWNlbWVudCAmJiBidWNrZXQuaGFzVGV4dERhdGEoKTtcbiAgICAgICAgY29uc3QgdXBkYXRlVGV4dEZpdEljb24gPSBsYXllci5sYXlvdXQuZ2V0KCdpY29uLXRleHQtZml0JykgIT09ICdub25lJyAmJlxuICAgICAgICAgICAgaGFzVmFyaWFibGVBbmNob3JzICYmXG4gICAgICAgICAgICBidWNrZXQuaGFzSWNvbkRhdGEoKTtcblxuICAgICAgICBpZiAoYWxvbmdMaW5lKSB7XG4gICAgICAgICAgICBjb25zdCBlbGV2YXRpb24gPSB0ci5lbGV2YXRpb247XG4gICAgICAgICAgICBjb25zdCBnZXRFbGV2YXRpb24gPSBlbGV2YXRpb24gPyBlbGV2YXRpb24uZ2V0QXRUaWxlT2Zmc2V0RnVuYyhjb29yZCwgdHIuY2VudGVyLmxhdCwgdHIud29ybGRTaXplLCBidWNrZXQuZ2V0UHJvamVjdGlvbigpKSA6IChfID0+IFswLCAwLCAwXSk7XG4gICAgICAgICAgICBjb25zdCBsYWJlbFBsYW5lTWF0cml4UGxhY2VtZW50ID0gc3ltYm9sUHJvamVjdGlvbi5nZXRMYWJlbFBsYW5lTWF0cml4Rm9yUGxhY2VtZW50KHRpbGVNYXRyaXgsIHRpbGUudGlsZUlELmNhbm9uaWNhbCwgcGl0Y2hXaXRoTWFwLCByb3RhdGVXaXRoTWFwLCB0ciwgYnVja2V0LmdldFByb2plY3Rpb24oKSwgcyk7XG5cbiAgICAgICAgICAgIHN5bWJvbFByb2plY3Rpb24udXBkYXRlTGluZUxhYmVscyhidWNrZXQsIHRpbGVNYXRyaXgsIHBhaW50ZXIsIGlzVGV4dCwgbGFiZWxQbGFuZU1hdHJpeFBsYWNlbWVudCwgZ2xDb29yZE1hdHJpeCwgcGl0Y2hXaXRoTWFwLCBrZWVwVXByaWdodCwgZ2V0RWxldmF0aW9uLCBjb29yZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9qZWN0ZWRQb3NPbkxhYmVsU3BhY2UgPSBhbG9uZ0xpbmUgfHwgKGlzVGV4dCAmJiB2YXJpYWJsZVBsYWNlbWVudCkgfHwgdXBkYXRlVGV4dEZpdEljb247XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KHRpbGVNYXRyaXgsIHRpbGUsIHRyYW5zbGF0ZSwgdHJhbnNsYXRlQW5jaG9yKTtcbiAgICAgICAgY29uc3QgdUxhYmVsUGxhbmVNYXRyaXggPSBwcm9qZWN0ZWRQb3NPbkxhYmVsU3BhY2UgPyBpZGVudGl0eU1hdDQgOiBsYWJlbFBsYW5lTWF0cml4UmVuZGVyaW5nO1xuICAgICAgICBjb25zdCB1Z2xDb29yZE1hdHJpeCA9IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KGdsQ29vcmRNYXRyaXgsIHRpbGUsIHRyYW5zbGF0ZSwgdHJhbnNsYXRlQW5jaG9yLCB0cnVlKTtcbiAgICAgICAgY29uc3QgaW52TWF0cml4ID0gYnVja2V0LmdldFByb2plY3Rpb24oKS5jcmVhdGVJbnZlcnNpb25NYXRyaXgodHIsIGNvb3JkLmNhbm9uaWNhbCk7XG5cbiAgICAgICAgY29uc3QgYmFzZURlZmluZXMgPSAoW106IGFueSk7XG4gICAgICAgIGlmIChwYWludGVyLnRlcnJhaW4gJiYgcGl0Y2hXaXRoTWFwKSB7XG4gICAgICAgICAgICBiYXNlRGVmaW5lcy5wdXNoKCdQSVRDSF9XSVRIX01BUF9URVJSQUlOJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1Y2tldElzR2xvYmVQcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICBiYXNlRGVmaW5lcy5wdXNoKCdQUk9KRUNUSU9OX0dMT0JFX1ZJRVcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdGVkUG9zT25MYWJlbFNwYWNlKSB7XG4gICAgICAgICAgICBiYXNlRGVmaW5lcy5wdXNoKCdQUk9KRUNURURfUE9TX09OX1ZJRVdQT1JUJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYXNIYWxvID0gaXNTREYgJiYgbGF5ZXIucGFpbnQuZ2V0KGlzVGV4dCA/ICd0ZXh0LWhhbG8td2lkdGgnIDogJ2ljb24taGFsby13aWR0aCcpLmNvbnN0YW50T3IoMSkgIT09IDA7XG5cbiAgICAgICAgbGV0IHVuaWZvcm1WYWx1ZXM7XG4gICAgICAgIGlmIChpc1NERikge1xuICAgICAgICAgICAgaWYgKCFidWNrZXQuaWNvbnNJblRleHQpIHtcbiAgICAgICAgICAgICAgICB1bmlmb3JtVmFsdWVzID0gc3ltYm9sU0RGVW5pZm9ybVZhbHVlcyhzaXplRGF0YS5raW5kLCBzaXplLCByb3RhdGVJblNoYWRlciwgcGl0Y2hXaXRoTWFwLCBwYWludGVyLFxuICAgICAgICAgICAgICAgICAgICBtYXRyaXgsIHVMYWJlbFBsYW5lTWF0cml4LCB1Z2xDb29yZE1hdHJpeCwgaXNUZXh0LCB0ZXhTaXplLCB0cnVlLCBjb29yZCwgZ2xvYmVUb01lcmNhdG9yLCBtZXJjYXRvckNlbnRlciwgaW52TWF0cml4LCBjYW1lcmFVcFZlY3RvciwgYnVja2V0LmdldFByb2plY3Rpb24oKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMgPSBzeW1ib2xUZXh0QW5kSWNvblVuaWZvcm1WYWx1ZXMoc2l6ZURhdGEua2luZCwgc2l6ZSwgcm90YXRlSW5TaGFkZXIsIHBpdGNoV2l0aE1hcCwgcGFpbnRlcixcbiAgICAgICAgICAgICAgICAgICAgbWF0cml4LCB1TGFiZWxQbGFuZU1hdHJpeCwgdWdsQ29vcmRNYXRyaXgsIHRleFNpemUsIHRleFNpemVJY29uLCBjb29yZCwgZ2xvYmVUb01lcmNhdG9yLCBtZXJjYXRvckNlbnRlciwgaW52TWF0cml4LCBjYW1lcmFVcFZlY3RvciwgYnVja2V0LmdldFByb2plY3Rpb24oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzID0gc3ltYm9sSWNvblVuaWZvcm1WYWx1ZXMoc2l6ZURhdGEua2luZCwgc2l6ZSwgcm90YXRlSW5TaGFkZXIsIHBpdGNoV2l0aE1hcCwgcGFpbnRlciwgbWF0cml4LFxuICAgICAgICAgICAgICAgIHVMYWJlbFBsYW5lTWF0cml4LCB1Z2xDb29yZE1hdHJpeCwgaXNUZXh0LCB0ZXhTaXplLCBjb29yZCwgZ2xvYmVUb01lcmNhdG9yLCBtZXJjYXRvckNlbnRlciwgaW52TWF0cml4LCBjYW1lcmFVcFZlY3RvciwgYnVja2V0LmdldFByb2plY3Rpb24oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKGdldFN5bWJvbFByb2dyYW1OYW1lKGlzU0RGLCBpc1RleHQsIGJ1Y2tldCksIHByb2dyYW1Db25maWd1cmF0aW9uLCBiYXNlRGVmaW5lcyk7XG5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICAgICAgICBwcm9ncmFtLFxuICAgICAgICAgICAgYnVmZmVycyxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsXG4gICAgICAgICAgICBhdGxhc1RleHR1cmUsXG4gICAgICAgICAgICBhdGxhc1RleHR1cmVJY29uLFxuICAgICAgICAgICAgYXRsYXNJbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICAgYXRsYXNJbnRlcnBvbGF0aW9uSWNvbixcbiAgICAgICAgICAgIGlzU0RGLFxuICAgICAgICAgICAgaGFzSGFsbyxcbiAgICAgICAgICAgIHRpbGUsXG4gICAgICAgICAgICBsYWJlbFBsYW5lTWF0cml4SW52XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGhhc1NvcnRLZXkgJiYgYnVja2V0LmNhbk92ZXJsYXApIHtcbiAgICAgICAgICAgIHNvcnRGZWF0dXJlc0J5S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IG9sZFNlZ21lbnRzID0gYnVmZmVycy5zZWdtZW50cy5nZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBvbGRTZWdtZW50cykge1xuICAgICAgICAgICAgICAgIHRpbGVSZW5kZXJTdGF0ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VnbWVudHM6IG5ldyBTZWdtZW50VmVjdG9yKFtzZWdtZW50XSksXG4gICAgICAgICAgICAgICAgICAgIHNvcnRLZXk6ICgoc2VnbWVudC5zb3J0S2V5OiBhbnkpOiBudW1iZXIpLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGlsZVJlbmRlclN0YXRlLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlZ21lbnRzOiBidWZmZXJzLnNlZ21lbnRzLFxuICAgICAgICAgICAgICAgIHNvcnRLZXk6IDAsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNvcnRGZWF0dXJlc0J5S2V5KSB7XG4gICAgICAgIHRpbGVSZW5kZXJTdGF0ZS5zb3J0KChhLCBiKSA9PiBhLnNvcnRLZXkgLSBiLnNvcnRLZXkpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VnbWVudFN0YXRlIG9mIHRpbGVSZW5kZXJTdGF0ZSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHNlZ21lbnRTdGF0ZS5zdGF0ZTtcbiAgICAgICAgaWYgKHBhaW50ZXIudGVycmFpbikge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB1c2VEZXB0aEZvck9jY2x1c2lvbjogIWlzR2xvYmVQcm9qZWN0aW9uLFxuICAgICAgICAgICAgICAgIGxhYmVsUGxhbmVNYXRyaXhJbnY6IHN0YXRlLmxhYmVsUGxhbmVNYXRyaXhJbnZcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBwYWludGVyLnRlcnJhaW4uc2V0dXBFbGV2YXRpb25EcmF3KHN0YXRlLnRpbGUsIHN0YXRlLnByb2dyYW0sIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICBzdGF0ZS5hdGxhc1RleHR1cmUuYmluZChzdGF0ZS5hdGxhc0ludGVycG9sYXRpb24sIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICBpZiAoc3RhdGUuYXRsYXNUZXh0dXJlSWNvbikge1xuICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMSk7XG4gICAgICAgICAgICBpZiAoc3RhdGUuYXRsYXNUZXh0dXJlSWNvbikge1xuICAgICAgICAgICAgICAgIHN0YXRlLmF0bGFzVGV4dHVyZUljb24uYmluZChzdGF0ZS5hdGxhc0ludGVycG9sYXRpb25JY29uLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZS5pc1NERikge1xuICAgICAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9ICgoc3RhdGUudW5pZm9ybVZhbHVlczogYW55KTogVW5pZm9ybVZhbHVlczxTeW1ib2xTREZVbmlmb3Jtc1R5cGU+KTtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXNIYWxvKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlc1sndV9pc19oYWxvJ10gPSAxO1xuICAgICAgICAgICAgICAgIGRyYXdTeW1ib2xFbGVtZW50cyhzdGF0ZS5idWZmZXJzLCBzZWdtZW50U3RhdGUuc2VnbWVudHMsIGxheWVyLCBwYWludGVyLCBzdGF0ZS5wcm9ncmFtLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHVuaWZvcm1WYWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdW5pZm9ybVZhbHVlc1sndV9pc19oYWxvJ10gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGRyYXdTeW1ib2xFbGVtZW50cyhzdGF0ZS5idWZmZXJzLCBzZWdtZW50U3RhdGUuc2VnbWVudHMsIGxheWVyLCBwYWludGVyLCBzdGF0ZS5wcm9ncmFtLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIHN0YXRlLnVuaWZvcm1WYWx1ZXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd1N5bWJvbEVsZW1lbnRzKGJ1ZmZlcnMsIHNlZ21lbnRzLCBsYXllciwgcGFpbnRlciwgcHJvZ3JhbSwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCB1bmlmb3JtVmFsdWVzKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBidWZmZXJzLmxheW91dFZlcnRleEJ1ZmZlcixcbiAgICAgICAgYnVmZmVycy5pbmRleEJ1ZmZlciwgc2VnbWVudHMsIGxheWVyLnBhaW50LFxuICAgICAgICBwYWludGVyLnRyYW5zZm9ybS56b29tLCBidWZmZXJzLnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpLFxuICAgICAgICBidWZmZXJzLmR5bmFtaWNMYXlvdXRWZXJ0ZXhCdWZmZXIsIGJ1ZmZlcnMub3BhY2l0eVZlcnRleEJ1ZmZlciwgYnVmZmVycy5nbG9iZUV4dFZlcnRleEJ1ZmZlcik7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZS5qcyc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlLmpzJztcbmltcG9ydCBQcm9ncmFtIGZyb20gJy4vcHJvZ3JhbS5qcyc7XG5pbXBvcnQge2NpcmNsZVVuaWZvcm1WYWx1ZXMsIGNpcmNsZURlZmluZXNWYWx1ZXN9IGZyb20gJy4vcHJvZ3JhbS9jaXJjbGVfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQuanMnO1xuaW1wb3J0IHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQge21lcmNhdG9yWGZyb21MbmcsIG1lcmNhdG9yWWZyb21MYXR9IGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBDaXJjbGVTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2NpcmNsZV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBDaXJjbGVCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldC5qcyc7XG5pbXBvcnQgdHlwZSBQcm9ncmFtQ29uZmlndXJhdGlvbiBmcm9tICcuLi9kYXRhL3Byb2dyYW1fY29uZmlndXJhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUge1VuaWZvcm1WYWx1ZXN9IGZyb20gJy4vdW5pZm9ybV9iaW5kaW5nLmpzJztcbmltcG9ydCB0eXBlIHtDaXJjbGVVbmlmb3Jtc1R5cGV9IGZyb20gJy4vcHJvZ3JhbS9jaXJjbGVfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgdHlwZSBUaWxlIGZyb20gJy4uL3NvdXJjZS90aWxlLmpzJztcbmltcG9ydCB0eXBlIHtEeW5hbWljRGVmaW5lc1R5cGV9IGZyb20gJy4vcHJvZ3JhbS9wcm9ncmFtX3VuaWZvcm1zLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0NpcmNsZXM7XG5cbnR5cGUgVGlsZVJlbmRlclN0YXRlID0ge1xuICAgIHByb2dyYW1Db25maWd1cmF0aW9uOiBQcm9ncmFtQ29uZmlndXJhdGlvbixcbiAgICBwcm9ncmFtOiBQcm9ncmFtPCo+LFxuICAgIGxheW91dFZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyLFxuICAgIGdsb2JlRXh0VmVydGV4QnVmZmVyOiA/VmVydGV4QnVmZmVyLFxuICAgIGluZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcixcbiAgICB1bmlmb3JtVmFsdWVzOiBVbmlmb3JtVmFsdWVzPENpcmNsZVVuaWZvcm1zVHlwZT4sXG4gICAgdGlsZTogVGlsZVxufTtcblxudHlwZSBTZWdtZW50c1RpbGVSZW5kZXJTdGF0ZSA9IHtcbiAgICBzZWdtZW50czogU2VnbWVudFZlY3RvcixcbiAgICBzb3J0S2V5OiBudW1iZXIsXG4gICAgc3RhdGU6IFRpbGVSZW5kZXJTdGF0ZVxufTtcblxuZnVuY3Rpb24gZHJhd0NpcmNsZXMocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogQ2lyY2xlU3R5bGVMYXllciwgY29vcmRzOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgIT09ICd0cmFuc2x1Y2VudCcpIHJldHVybjtcblxuICAgIGNvbnN0IG9wYWNpdHkgPSBsYXllci5wYWludC5nZXQoJ2NpcmNsZS1vcGFjaXR5Jyk7XG4gICAgY29uc3Qgc3Ryb2tlV2lkdGggPSBsYXllci5wYWludC5nZXQoJ2NpcmNsZS1zdHJva2Utd2lkdGgnKTtcbiAgICBjb25zdCBzdHJva2VPcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdjaXJjbGUtc3Ryb2tlLW9wYWNpdHknKTtcbiAgICBjb25zdCBzb3J0RmVhdHVyZXNCeUtleSA9IGxheWVyLmxheW91dC5nZXQoJ2NpcmNsZS1zb3J0LWtleScpLmNvbnN0YW50T3IoMSkgIT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChvcGFjaXR5LmNvbnN0YW50T3IoMSkgPT09IDAgJiYgKHN0cm9rZVdpZHRoLmNvbnN0YW50T3IoMSkgPT09IDAgfHwgc3Ryb2tlT3BhY2l0eS5jb25zdGFudE9yKDEpID09PSAwKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KTtcbiAgICAvLyBUdXJuIG9mZiBzdGVuY2lsIHRlc3RpbmcgdG8gYWxsb3cgY2lyY2xlcyB0byBiZSBkcmF3biBhY3Jvc3MgYm91bmRhcmllcyxcbiAgICAvLyBzbyB0aGF0IGxhcmdlIGNpcmNsZXMgYXJlIG5vdCBjbGlwcGVkIHRvIHRpbGVzXG4gICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICBjb25zdCBpc0dsb2JlUHJvamVjdGlvbiA9IHRyLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJztcbiAgICBjb25zdCBtZXJjYXRvckNlbnRlciA9IFttZXJjYXRvclhmcm9tTG5nKHRyLmNlbnRlci5sbmcpLCBtZXJjYXRvcllmcm9tTGF0KHRyLmNlbnRlci5sYXQpXTtcblxuICAgIGNvbnN0IHNlZ21lbnRzUmVuZGVyU3RhdGVzOiBBcnJheTxTZWdtZW50c1RpbGVSZW5kZXJTdGF0ZT4gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0OiA/Q2lyY2xlQnVja2V0PCo+ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgaWYgKCFidWNrZXQgfHwgYnVja2V0LnByb2plY3Rpb24ubmFtZSAhPT0gdHIucHJvamVjdGlvbi5uYW1lKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcbiAgICAgICAgY29uc3QgZGVmaW5lc1ZhbHVlcyA9IGNpcmNsZURlZmluZXNWYWx1ZXMobGF5ZXIpO1xuICAgICAgICBpZiAoaXNHbG9iZVByb2plY3Rpb24pIHtcbiAgICAgICAgICAgIGRlZmluZXNWYWx1ZXMucHVzaCgnUFJPSkVDVElPTl9HTE9CRV9WSUVXJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnY2lyY2xlJywgcHJvZ3JhbUNvbmZpZ3VyYXRpb24sICgoZGVmaW5lc1ZhbHVlczogYW55KTogRHluYW1pY0RlZmluZXNUeXBlW10pKTtcbiAgICAgICAgY29uc3QgbGF5b3V0VmVydGV4QnVmZmVyID0gYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlcjtcbiAgICAgICAgY29uc3QgZ2xvYmVFeHRWZXJ0ZXhCdWZmZXIgPSBidWNrZXQuZ2xvYmVFeHRWZXJ0ZXhCdWZmZXI7XG4gICAgICAgIGNvbnN0IGluZGV4QnVmZmVyID0gYnVja2V0LmluZGV4QnVmZmVyO1xuICAgICAgICBjb25zdCBpbnZNYXRyaXggPSB0ci5wcm9qZWN0aW9uLmNyZWF0ZUludmVyc2lvbk1hdHJpeCh0ciwgY29vcmQuY2Fub25pY2FsKTtcbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGNpcmNsZVVuaWZvcm1WYWx1ZXMocGFpbnRlciwgY29vcmQsIHRpbGUsIGludk1hdHJpeCwgbWVyY2F0b3JDZW50ZXIsIGxheWVyKTtcblxuICAgICAgICBjb25zdCBzdGF0ZTogVGlsZVJlbmRlclN0YXRlID0ge1xuICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBwcm9ncmFtLFxuICAgICAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLFxuICAgICAgICAgICAgZ2xvYmVFeHRWZXJ0ZXhCdWZmZXIsXG4gICAgICAgICAgICBpbmRleEJ1ZmZlcixcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsXG4gICAgICAgICAgICB0aWxlXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHNvcnRGZWF0dXJlc0J5S2V5KSB7XG4gICAgICAgICAgICBjb25zdCBvbGRTZWdtZW50cyA9IGJ1Y2tldC5zZWdtZW50cy5nZXQoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBvbGRTZWdtZW50cykge1xuICAgICAgICAgICAgICAgIHNlZ21lbnRzUmVuZGVyU3RhdGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzZWdtZW50czogbmV3IFNlZ21lbnRWZWN0b3IoW3NlZ21lbnRdKSxcbiAgICAgICAgICAgICAgICAgICAgc29ydEtleTogKChzZWdtZW50LnNvcnRLZXk6IGFueSk6IG51bWJlciksXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWdtZW50c1JlbmRlclN0YXRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWdtZW50czogYnVja2V0LnNlZ21lbnRzLFxuICAgICAgICAgICAgICAgIHNvcnRLZXk6IDAsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBpZiAoc29ydEZlYXR1cmVzQnlLZXkpIHtcbiAgICAgICAgc2VnbWVudHNSZW5kZXJTdGF0ZXMuc29ydCgoYSwgYikgPT4gYS5zb3J0S2V5IC0gYi5zb3J0S2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXJyYWluT3B0aW9ucyA9IHt1c2VEZXB0aEZvck9jY2x1c2lvbjogIWlzR2xvYmVQcm9qZWN0aW9ufTtcblxuICAgIGZvciAoY29uc3Qgc2VnbWVudHNTdGF0ZSBvZiBzZWdtZW50c1JlbmRlclN0YXRlcykge1xuICAgICAgICBjb25zdCB7cHJvZ3JhbUNvbmZpZ3VyYXRpb24sIHByb2dyYW0sIGxheW91dFZlcnRleEJ1ZmZlciwgZ2xvYmVFeHRWZXJ0ZXhCdWZmZXIsIGluZGV4QnVmZmVyLCB1bmlmb3JtVmFsdWVzLCB0aWxlfSA9IHNlZ21lbnRzU3RhdGUuc3RhdGU7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gc2VnbWVudHNTdGF0ZS5zZWdtZW50cztcblxuICAgICAgICBpZiAocGFpbnRlci50ZXJyYWluKSBwYWludGVyLnRlcnJhaW4uc2V0dXBFbGV2YXRpb25EcmF3KHRpbGUsIHByb2dyYW0sIHRlcnJhaW5PcHRpb25zKTtcblxuICAgICAgICBwYWludGVyLnByZXBhcmVEcmF3UHJvZ3JhbShjb250ZXh0LCBwcm9ncmFtLCB0aWxlLnRpbGVJRC50b1Vud3JhcHBlZCgpKTtcblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLFxuICAgICAgICAgICAgbGF5b3V0VmVydGV4QnVmZmVyLCBpbmRleEJ1ZmZlciwgc2VnbWVudHMsXG4gICAgICAgICAgICBsYXllci5wYWludCwgdHIuem9vbSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBpc0dsb2JlUHJvamVjdGlvbiA/IGdsb2JlRXh0VmVydGV4QnVmZmVyIDogbnVsbCk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlLmpzJztcbmltcG9ydCBDb2xvciBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvY29sb3IuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IHtcbiAgICBoZWF0bWFwVW5pZm9ybVZhbHVlcyxcbiAgICBoZWF0bWFwVGV4dHVyZVVuaWZvcm1WYWx1ZXNcbn0gZnJvbSAnLi9wcm9ncmFtL2hlYXRtYXBfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge21lcmNhdG9yWGZyb21MbmcsIG1lcmNhdG9yWWZyb21MYXR9IGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBIZWF0bWFwU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9oZWF0bWFwX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIEhlYXRtYXBCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvaGVhdG1hcF9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0hlYXRtYXA7XG5cbmZ1bmN0aW9uIGRyYXdIZWF0bWFwKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IEhlYXRtYXBTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgaWYgKGxheWVyLnBhaW50LmdldCgnaGVhdG1hcC1vcGFjaXR5JykgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICdvZmZzY3JlZW4nKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICAvLyBBbGxvdyBrZXJuZWxzIHRvIGJlIGRyYXduIGFjcm9zcyBib3VuZGFyaWVzLCBzbyB0aGF0XG4gICAgICAgIC8vIGxhcmdlIGtlcm5lbHMgYXJlIG5vdCBjbGlwcGVkIHRvIHRpbGVzXG4gICAgICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgICAgIC8vIFR1cm4gb24gYWRkaXRpdmUgYmxlbmRpbmcgZm9yIGtlcm5lbHMsIHdoaWNoIGlzIGEga2V5IGFzcGVjdCBvZiBrZXJuZWwgZGVuc2l0eSBlc3RpbWF0aW9uIGZvcm11bGFcbiAgICAgICAgY29uc3QgY29sb3JNb2RlID0gbmV3IENvbG9yTW9kZShbZ2wuT05FLCBnbC5PTkVdLCBDb2xvci50cmFuc3BhcmVudCwgW3RydWUsIHRydWUsIHRydWUsIHRydWVdKTtcbiAgICAgICAgY29uc3QgcmVzb2x1dGlvblNjYWxpbmcgPSBwYWludGVyLnRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZScgPyAwLjUgOiAwLjI1O1xuXG4gICAgICAgIGJpbmRGcmFtZWJ1ZmZlcihjb250ZXh0LCBwYWludGVyLCBsYXllciwgcmVzb2x1dGlvblNjYWxpbmcpO1xuXG4gICAgICAgIGNvbnRleHQuY2xlYXIoe2NvbG9yOiBDb2xvci50cmFuc3BhcmVudH0pO1xuXG4gICAgICAgIGNvbnN0IHRyID0gcGFpbnRlci50cmFuc2Zvcm07XG5cbiAgICAgICAgY29uc3QgaXNHbG9iZVByb2plY3Rpb24gPSB0ci5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZSc7XG5cbiAgICAgICAgY29uc3QgZGVmaW5lc1ZhbHVlcyA9IGlzR2xvYmVQcm9qZWN0aW9uID8gWydQUk9KRUNUSU9OX0dMT0JFX1ZJRVcnXSA6IG51bGw7XG4gICAgICAgIGNvbnN0IGN1bGxNb2RlID0gaXNHbG9iZVByb2plY3Rpb24gPyBDdWxsRmFjZU1vZGUuZnJvbnRDQ1cgOiBDdWxsRmFjZU1vZGUuZGlzYWJsZWQ7XG5cbiAgICAgICAgY29uc3QgbWVyY2F0b3JDZW50ZXIgPSBbbWVyY2F0b3JYZnJvbUxuZyh0ci5jZW50ZXIubG5nKSwgbWVyY2F0b3JZZnJvbUxhdCh0ci5jZW50ZXIubGF0KV07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuXG4gICAgICAgICAgICAvLyBTa2lwIHRpbGVzIHRoYXQgaGF2ZSB1bmNvdmVyZWQgcGFyZW50cyB0byBhdm9pZCBmbGlja2VyaW5nOyB3ZSBkb24ndCBuZWVkXG4gICAgICAgICAgICAvLyB0byB1c2UgY29tcGxleCB0aWxlIG1hc2tpbmcgaGVyZSBiZWNhdXNlIHRoZSBjaGFuZ2UgYmV0d2VlbiB6b29tIGxldmVscyBpcyBzdWJ0bGUsXG4gICAgICAgICAgICAvLyBzbyBpdCdzIGZpbmUgdG8gc2ltcGx5IHJlbmRlciB0aGUgcGFyZW50IHVudGlsIGFsbCBpdHMgNCBjaGlsZHJlbiBhcmUgbG9hZGVkXG4gICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUuaGFzUmVuZGVyYWJsZVBhcmVudChjb29yZCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgICAgICBjb25zdCBidWNrZXQ6ID9IZWF0bWFwQnVja2V0ID0gKHRpbGUuZ2V0QnVja2V0KGxheWVyKTogYW55KTtcbiAgICAgICAgICAgIGlmICghYnVja2V0IHx8IGJ1Y2tldC5wcm9qZWN0aW9uLm5hbWUgIT09IHRyLnByb2plY3Rpb24ubmFtZSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gYnVja2V0LnByb2dyYW1Db25maWd1cmF0aW9ucy5nZXQobGF5ZXIuaWQpO1xuICAgICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnaGVhdG1hcCcsIHByb2dyYW1Db25maWd1cmF0aW9uLCBkZWZpbmVzVmFsdWVzKTtcbiAgICAgICAgICAgIGNvbnN0IHt6b29tfSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgICAgICAgICAgaWYgKHBhaW50ZXIudGVycmFpbikgcGFpbnRlci50ZXJyYWluLnNldHVwRWxldmF0aW9uRHJhdyh0aWxlLCBwcm9ncmFtKTtcblxuICAgICAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGludk1hdHJpeCA9IHRyLnByb2plY3Rpb24uY3JlYXRlSW52ZXJzaW9uTWF0cml4KHRyLCBjb29yZC5jYW5vbmljYWwpO1xuXG4gICAgICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBEZXB0aE1vZGUuZGlzYWJsZWQsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIGN1bGxNb2RlLFxuICAgICAgICAgICAgICAgIGhlYXRtYXBVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIGNvb3JkLFxuICAgICAgICAgICAgICAgICAgICB0aWxlLCBpbnZNYXRyaXgsIG1lcmNhdG9yQ2VudGVyLCB6b29tLCBsYXllci5wYWludC5nZXQoJ2hlYXRtYXAtaW50ZW5zaXR5JykpLFxuICAgICAgICAgICAgICAgIGxheWVyLmlkLCBidWNrZXQubGF5b3V0VmVydGV4QnVmZmVyLCBidWNrZXQuaW5kZXhCdWZmZXIsXG4gICAgICAgICAgICAgICAgYnVja2V0LnNlZ21lbnRzLCBsYXllci5wYWludCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSxcbiAgICAgICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbixcbiAgICAgICAgICAgICAgICBpc0dsb2JlUHJvamVjdGlvbiA/IGJ1Y2tldC5nbG9iZUV4dFZlcnRleEJ1ZmZlciA6IG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC52aWV3cG9ydC5zZXQoWzAsIDAsIHBhaW50ZXIud2lkdGgsIHBhaW50ZXIuaGVpZ2h0XSk7XG5cbiAgICB9IGVsc2UgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ3RyYW5zbHVjZW50Jykge1xuICAgICAgICBwYWludGVyLmNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcbiAgICAgICAgcmVuZGVyVGV4dHVyZVRvTWFwKHBhaW50ZXIsIGxheWVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRGcmFtZWJ1ZmZlcihjb250ZXh0LCBwYWludGVyLCBsYXllciwgc2NhbGluZykge1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCB3aWR0aCA9IHBhaW50ZXIud2lkdGggKiBzY2FsaW5nO1xuICAgIGNvbnN0IGhlaWdodCA9IHBhaW50ZXIuaGVpZ2h0ICogc2NhbGluZztcblxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTEpO1xuICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCB3aWR0aCwgaGVpZ2h0XSk7XG5cbiAgICBsZXQgZmJvID0gbGF5ZXIuaGVhdG1hcEZibztcblxuICAgIGlmICghZmJvIHx8IChmYm8gJiYgKGZiby53aWR0aCAhPT0gd2lkdGggfHwgZmJvLmhlaWdodCAhPT0gaGVpZ2h0KSkpIHtcbiAgICAgICAgaWYgKGZibykgeyBmYm8uZGVzdHJveSgpOyB9XG5cbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuXG4gICAgICAgIGZibyA9IGxheWVyLmhlYXRtYXBGYm8gPSBjb250ZXh0LmNyZWF0ZUZyYW1lYnVmZmVyKHdpZHRoLCBoZWlnaHQsIGZhbHNlKTtcblxuICAgICAgICBiaW5kVGV4dHVyZVRvRnJhbWVidWZmZXIoY29udGV4dCwgcGFpbnRlciwgdGV4dHVyZSwgZmJvLCB3aWR0aCwgaGVpZ2h0KTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGZiby5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpO1xuICAgICAgICBjb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQoZmJvLmZyYW1lYnVmZmVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRUZXh0dXJlVG9GcmFtZWJ1ZmZlcihjb250ZXh0LCBwYWludGVyLCB0ZXh0dXJlLCBmYm8sIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG4gICAgLy8gVXNlIHRoZSBoaWdoZXIgcHJlY2lzaW9uIGhhbGYtZmxvYXQgdGV4dHVyZSB3aGVyZSBhdmFpbGFibGUgKHByb2R1Y2luZyBtdWNoIHNtb290aGVyIGxvb2tpbmcgaGVhdG1hcHMpO1xuICAgIC8vIE90aGVyd2lzZSwgZmFsbCBiYWNrIHRvIGEgbG93IHByZWNpc2lvbiB0ZXh0dXJlXG4gICAgY29uc3QgaW50ZXJuYWxGb3JtYXQgPSBjb250ZXh0LmV4dFJlbmRlclRvVGV4dHVyZUhhbGZGbG9hdCA/IGNvbnRleHQuZXh0VGV4dHVyZUhhbGZGbG9hdC5IQUxGX0ZMT0FUX09FUyA6IGdsLlVOU0lHTkVEX0JZVEU7XG4gICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBnbC5SR0JBLCBpbnRlcm5hbEZvcm1hdCwgbnVsbCk7XG4gICAgZmJvLmNvbG9yQXR0YWNobWVudC5zZXQodGV4dHVyZSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclRleHR1cmVUb01hcChwYWludGVyLCBsYXllcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgLy8gSGVyZSB3ZSBiaW5kIHR3byBkaWZmZXJlbnQgdGV4dHVyZXMgZnJvbSB3aGljaCB3ZSdsbCBzYW1wbGUgaW4gZHJhd2luZ1xuICAgIC8vIGhlYXRtYXBzOiB0aGUga2VybmVsIHRleHR1cmUsIHByZXBhcmVkIGluIHRoZSBvZmZzY3JlZW4gcGFzcywgYW5kIGFcbiAgICAvLyBjb2xvciByYW1wIHRleHR1cmUuXG4gICAgY29uc3QgZmJvID0gbGF5ZXIuaGVhdG1hcEZibztcbiAgICBpZiAoIWZibykgcmV0dXJuO1xuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIGZiby5jb2xvckF0dGFjaG1lbnQuZ2V0KCkpO1xuXG4gICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMSk7XG4gICAgbGV0IGNvbG9yUmFtcFRleHR1cmUgPSBsYXllci5jb2xvclJhbXBUZXh0dXJlO1xuICAgIGlmICghY29sb3JSYW1wVGV4dHVyZSkge1xuICAgICAgICBjb2xvclJhbXBUZXh0dXJlID0gbGF5ZXIuY29sb3JSYW1wVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIGxheWVyLmNvbG9yUmFtcCwgZ2wuUkdCQSk7XG4gICAgfVxuICAgIGNvbG9yUmFtcFRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgcGFpbnRlci51c2VQcm9ncmFtKCdoZWF0bWFwVGV4dHVyZScpLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLFxuICAgICAgICBEZXB0aE1vZGUuZGlzYWJsZWQsIFN0ZW5jaWxNb2RlLmRpc2FibGVkLCBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICBoZWF0bWFwVGV4dHVyZVVuaWZvcm1WYWx1ZXMocGFpbnRlciwgbGF5ZXIsIDAsIDEpLFxuICAgICAgICBsYXllci5pZCwgcGFpbnRlci52aWV3cG9ydEJ1ZmZlciwgcGFpbnRlci5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlcixcbiAgICAgICAgcGFpbnRlci52aWV3cG9ydFNlZ21lbnRzLCBsYXllci5wYWludCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSk7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUuanMnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZS5qcyc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZS5qcyc7XG5pbXBvcnQge1xuICAgIGxpbmVVbmlmb3JtVmFsdWVzLFxuICAgIGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlcyxcbiAgICBsaW5lRGVmaW5lc1ZhbHVlc1xufSBmcm9tICcuL3Byb2dyYW0vbGluZV9wcm9ncmFtLmpzJztcbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5cbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyLmpzJztcbmltcG9ydCB0eXBlIFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMnO1xuaW1wb3J0IHR5cGUgTGluZVN0eWxlTGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSBMaW5lQnVja2V0IGZyb20gJy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0LmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5pbXBvcnQgdHlwZSB7RHluYW1pY0RlZmluZXNUeXBlfSBmcm9tICcuL3Byb2dyYW0vcHJvZ3JhbV91bmlmb3Jtcy5qcyc7XG5pbXBvcnQge2NsYW1wLCBuZXh0UG93ZXJPZlR3b30gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7cmVuZGVyQ29sb3JSYW1wfSBmcm9tICcuLi91dGlsL2NvbG9yX3JhbXAuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRyYXdMaW5lKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IExpbmVTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50LmdldCgnbGluZS1vcGFjaXR5Jyk7XG4gICAgY29uc3Qgd2lkdGggPSBsYXllci5wYWludC5nZXQoJ2xpbmUtd2lkdGgnKTtcbiAgICBpZiAob3BhY2l0eS5jb25zdGFudE9yKDEpID09PSAwIHx8IHdpZHRoLmNvbnN0YW50T3IoMSkgPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoMCwgRGVwdGhNb2RlLlJlYWRPbmx5KTtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICBjb25zdCBwaXhlbFJhdGlvID0gKHBhaW50ZXIudGVycmFpbiAmJiBwYWludGVyLnRlcnJhaW4ucmVuZGVyaW5nVG9UZXh0dXJlKSA/IDEuMCA6IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbztcblxuICAgIGNvbnN0IGRhc2hhcnJheVByb3BlcnR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdsaW5lLWRhc2hhcnJheScpO1xuICAgIGNvbnN0IGRhc2hhcnJheSA9IGRhc2hhcnJheVByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuICAgIGNvbnN0IGNhcFByb3BlcnR5ID0gbGF5ZXIubGF5b3V0LmdldCgnbGluZS1jYXAnKTtcbiAgICBjb25zdCBwYXR0ZXJuUHJvcGVydHkgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtcGF0dGVybicpO1xuICAgIGNvbnN0IGltYWdlID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuXG4gICAgY29uc3QgZ3JhZGllbnQgPSBsYXllci5wYWludC5nZXQoJ2xpbmUtZ3JhZGllbnQnKTtcbiAgICBjb25zdCBjcm9zc2ZhZGUgPSBsYXllci5nZXRDcm9zc2ZhZGVQYXJhbWV0ZXJzKCk7XG5cbiAgICBjb25zdCBwcm9ncmFtSWQgPSBpbWFnZSA/ICdsaW5lUGF0dGVybicgOiAnbGluZSc7XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGNvbnN0IGRlZmluZXNWYWx1ZXMgPSBsaW5lRGVmaW5lc1ZhbHVlcyhsYXllcik7XG4gICAgbGV0IHVzZVN0ZW5jaWxNYXNrUmVuZGVyUGFzcyA9IGRlZmluZXNWYWx1ZXMuaW5jbHVkZXMoJ1JFTkRFUl9MSU5FX0FMUEhBX0RJU0NBUkQnKTtcbiAgICBpZiAocGFpbnRlci50ZXJyYWluICYmIHBhaW50ZXIudGVycmFpbi5jbGlwT3JNYXNrT3ZlcmxhcFN0ZW5jaWxUeXBlKCkpIHtcbiAgICAgICAgdXNlU3RlbmNpbE1hc2tSZW5kZXJQYXNzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBpZiAoaW1hZ2UgJiYgIXRpbGUucGF0dGVybnNMb2FkZWQoKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgYnVja2V0OiA/TGluZUJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1RpbGUoKTtcblxuICAgICAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShwcm9ncmFtSWQsIHByb2dyYW1Db25maWd1cmF0aW9uLCAoKGRlZmluZXNWYWx1ZXM6IGFueSk6IER5bmFtaWNEZWZpbmVzVHlwZVtdKSk7XG5cbiAgICAgICAgY29uc3QgY29uc3RhbnRQYXR0ZXJuID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IobnVsbCk7XG4gICAgICAgIGlmIChjb25zdGFudFBhdHRlcm4gJiYgdGlsZS5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICBjb25zdCBhdGxhcyA9IHRpbGUuaW1hZ2VBdGxhcztcbiAgICAgICAgICAgIGNvbnN0IHBvc1RvID0gYXRsYXMucGF0dGVyblBvc2l0aW9uc1tjb25zdGFudFBhdHRlcm4udG8udG9TdHJpbmcoKV07XG4gICAgICAgICAgICBjb25zdCBwb3NGcm9tID0gYXRsYXMucGF0dGVyblBvc2l0aW9uc1tjb25zdGFudFBhdHRlcm4uZnJvbS50b1N0cmluZygpXTtcbiAgICAgICAgICAgIGlmIChwb3NUbyAmJiBwb3NGcm9tKSBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG8sIHBvc0Zyb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uc3RhbnREYXNoID0gZGFzaGFycmF5UHJvcGVydHkuY29uc3RhbnRPcihudWxsKTtcbiAgICAgICAgY29uc3QgY29uc3RhbnRDYXAgPSBjYXBQcm9wZXJ0eS5jb25zdGFudE9yKChudWxsOiBhbnkpKTtcblxuICAgICAgICBpZiAoIWltYWdlICYmIGNvbnN0YW50RGFzaCAmJiBjb25zdGFudENhcCAmJiB0aWxlLmxpbmVBdGxhcykge1xuICAgICAgICAgICAgY29uc3QgYXRsYXMgPSB0aWxlLmxpbmVBdGxhcztcbiAgICAgICAgICAgIGNvbnN0IHBvc1RvID0gYXRsYXMuZ2V0RGFzaChjb25zdGFudERhc2gudG8sIGNvbnN0YW50Q2FwKTtcbiAgICAgICAgICAgIGNvbnN0IHBvc0Zyb20gPSBhdGxhcy5nZXREYXNoKGNvbnN0YW50RGFzaC5mcm9tLCBjb25zdGFudENhcCk7XG4gICAgICAgICAgICBpZiAocG9zVG8gJiYgcG9zRnJvbSkgcHJvZ3JhbUNvbmZpZ3VyYXRpb24uc2V0Q29uc3RhbnRQYXR0ZXJuUG9zaXRpb25zKHBvc1RvLCBwb3NGcm9tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBbdHJpbVN0YXJ0LCB0cmltRW5kXSA9IGxheWVyLnBhaW50LmdldCgnbGluZS10cmltLW9mZnNldCcpO1xuICAgICAgICAvLyBXaGVuIGxpbmUgY2FwIGlzICdyb3VuZCcgb3IgJ3NxdWFyZScsIHRoZSB3aG9sZSBsaW5lIHByb2dyZXNzIHdpbGwgYmV5b25kIDEuMCBvciBsZXNzIHRoYW4gMC4wLlxuICAgICAgICAvLyBJZiB0cmltX29mZnNldCBiZWdpbiBpcyBsaW5lIGJlZ2luICgwLjApLCBvciB0cmltX29mZnNldCBlbmQgaXMgbGluZSBlbmQgKDEuMCksIGFkanVzdCB0aGUgdHJpbVxuICAgICAgICAvLyBvZmZzZXQgd2l0aCBmYWtlIG9mZnNldCBzaGlmdCBzbyB0aGF0IHRoZSBsaW5lX3Byb2dyZXNzIDwgMC4wIG9yIGxpbmVfcHJvZ3Jlc3MgPiAxLjAgcGFydCB3aWxsIGJlXG4gICAgICAgIC8vIGNvcnJlY3RseSBjb3ZlcmVkLlxuICAgICAgICBpZiAoY29uc3RhbnRDYXAgPT09ICdyb3VuZCcgfHwgY29uc3RhbnRDYXAgPT09ICdzcXVhcmUnKSB7XG4gICAgICAgICAgICAvLyBGYWtlIHRoZSBwZXJjZW50YWdlIHNvIHRoYXQgaXQgd2lsbCBjb3ZlciB0aGUgcm91bmQvc3F1YXJlIGNhcCB0aGF0IGlzIGJleW9uZCB3aG9sZSBsaW5lXG4gICAgICAgICAgICBjb25zdCBmYWtlT2Zmc2V0U2hpZnQgPSAxLjA7XG4gICAgICAgICAgICAvLyBUbyBtYWtlIHN1cmUgdGhhdCB0aGUgdHJpbSBvZmZzZXQgcmFuZ2UgaXMgZWZmZWNpdmVcbiAgICAgICAgICAgIGlmICh0cmltU3RhcnQgIT09IHRyaW1FbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodHJpbVN0YXJ0ID09PSAwLjApIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpbVN0YXJ0IC09IGZha2VPZmZzZXRTaGlmdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRyaW1FbmQgPT09IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICB0cmltRW5kICs9IGZha2VPZmZzZXRTaGlmdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXRyaXggPSBwYWludGVyLnRlcnJhaW4gPyBjb29yZC5wcm9qTWF0cml4IDogbnVsbDtcbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGltYWdlID9cbiAgICAgICAgICAgIGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlcyhwYWludGVyLCB0aWxlLCBsYXllciwgY3Jvc3NmYWRlLCBtYXRyaXgsIHBpeGVsUmF0aW8pIDpcbiAgICAgICAgICAgIGxpbmVVbmlmb3JtVmFsdWVzKHBhaW50ZXIsIHRpbGUsIGxheWVyLCBjcm9zc2ZhZGUsIG1hdHJpeCwgYnVja2V0LmxpbmVDbGlwc0FycmF5Lmxlbmd0aCwgcGl4ZWxSYXRpbywgW3RyaW1TdGFydCwgdHJpbUVuZF0pO1xuXG4gICAgICAgIGlmIChncmFkaWVudCkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJHcmFkaWVudCA9IGJ1Y2tldC5ncmFkaWVudHNbbGF5ZXIuaWRdO1xuICAgICAgICAgICAgbGV0IGdyYWRpZW50VGV4dHVyZSA9IGxheWVyR3JhZGllbnQudGV4dHVyZTtcbiAgICAgICAgICAgIGlmIChsYXllci5ncmFkaWVudFZlcnNpb24gIT09IGxheWVyR3JhZGllbnQudmVyc2lvbikge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlUmVzb2x1dGlvbiA9IDI1NjtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuc3RlcEludGVycG9sYW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZU1heFpvb20gPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKS5tYXh6b29tO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3RlbnRpYWxPdmVyem9vbSA9IGNvb3JkLmNhbm9uaWNhbC56ID09PSBzb3VyY2VNYXhab29tID9cbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY2VpbCgxIDw8IChwYWludGVyLnRyYW5zZm9ybS5tYXhab29tIC0gY29vcmQuY2Fub25pY2FsLnopKSA6IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVMZW5ndGggPSBidWNrZXQubWF4TGluZUxlbmd0aCAvIEVYVEVOVDtcbiAgICAgICAgICAgICAgICAgICAgLy8gTG9naWNhbCBwaXhlbCB0aWxlIHNpemUgaXMgNTEycHgsIGFuZCAxMDI0cHggcmlnaHQgYmVmb3JlIGN1cnJlbnQgem9vbSArIDFcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4VGlsZVBpeGVsU2l6ZSA9IDEwMjQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIE1heGltdW0gcG9zc2libGUgdGV4dHVyZSBjb3ZlcmFnZSBoZXVyaXN0aWMsIGJvdW5kIGJ5IGhhcmR3YXJlIG1heCB0ZXh0dXJlIHNpemVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4VGV4dHVyZUNvdmVyYWdlID0gbGluZUxlbmd0aCAqIG1heFRpbGVQaXhlbFNpemUgKiBwb3RlbnRpYWxPdmVyem9vbTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZVJlc29sdXRpb24gPSBjbGFtcChuZXh0UG93ZXJPZlR3byhtYXhUZXh0dXJlQ292ZXJhZ2UpLCAyNTYsIGNvbnRleHQubWF4VGV4dHVyZVNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXllckdyYWRpZW50LmdyYWRpZW50ID0gcmVuZGVyQ29sb3JSYW1wKHtcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogbGF5ZXIuZ3JhZGllbnRFeHByZXNzaW9uKCksXG4gICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb25LZXk6ICdsaW5lUHJvZ3Jlc3MnLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uOiB0ZXh0dXJlUmVzb2x1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IGxheWVyR3JhZGllbnQuZ3JhZGllbnQgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBjbGlwczogYnVja2V0LmxpbmVDbGlwc0FycmF5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGxheWVyR3JhZGllbnQudGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBsYXllckdyYWRpZW50LnRleHR1cmUudXBkYXRlKGxheWVyR3JhZGllbnQuZ3JhZGllbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyR3JhZGllbnQudGV4dHVyZSA9IG5ldyBUZXh0dXJlKGNvbnRleHQsIGxheWVyR3JhZGllbnQuZ3JhZGllbnQsIGdsLlJHQkEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXllckdyYWRpZW50LnZlcnNpb24gPSBsYXllci5ncmFkaWVudFZlcnNpb247XG4gICAgICAgICAgICAgICAgZ3JhZGllbnRUZXh0dXJlID0gbGF5ZXJHcmFkaWVudC50ZXh0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMSk7XG4gICAgICAgICAgICBncmFkaWVudFRleHR1cmUuYmluZChsYXllci5zdGVwSW50ZXJwb2xhbnQgPyBnbC5ORUFSRVNUIDogZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGFzaGFycmF5KSB7XG4gICAgICAgICAgICBjb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIHRpbGUubGluZUF0bGFzVGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuUkVQRUFUKTtcbiAgICAgICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uLnVwZGF0ZVBhaW50QnVmZmVycyhjcm9zc2ZhZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgICAgICB0aWxlLmltYWdlQXRsYXNUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uLnVwZGF0ZVBhaW50QnVmZmVycyhjcm9zc2ZhZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgY29uc3QgcmVuZGVyTGluZSA9IChzdGVuY2lsTW9kZSkgPT4ge1xuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLFxuICAgICAgICAgICAgICAgIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCwgdW5pZm9ybVZhbHVlcyxcbiAgICAgICAgICAgICAgICBsYXllci5pZCwgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlciwgYnVja2V0LmluZGV4QnVmZmVyLCBidWNrZXQuc2VnbWVudHMsXG4gICAgICAgICAgICAgICAgbGF5ZXIucGFpbnQsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20sIHByb2dyYW1Db25maWd1cmF0aW9uLCBidWNrZXQubGF5b3V0VmVydGV4QnVmZmVyMik7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHVzZVN0ZW5jaWxNYXNrUmVuZGVyUGFzcykge1xuICAgICAgICAgICAgY29uc3Qgc3RlbmNpbElkID0gcGFpbnRlci5zdGVuY2lsTW9kZUZvckNsaXBwaW5nKGNvb3JkKS5yZWY7XG4gICAgICAgICAgICAvLyBXaGVuIHRlcnJhaW4gaXMgb24sIGVuc3VyZSB0aGF0IHRoZSBzdGVuY2lsIGJ1ZmZlciBoYXMgMCB2YWx1ZXMuXG4gICAgICAgICAgICAvLyBBcyBzdGVuY2lsIG1heSBiZSBkaXNhYmxlZCB3aGVuIGl0IGlzIG5vdCBpbiBvdmVybGFwcGluZyBzdGVuY2lsXG4gICAgICAgICAgICAvLyBtb2RlLiBSZWZlciB0byBzdGVuY2lsTW9kZUZvclJUVE92ZXJsYXAgbG9naWMuXG4gICAgICAgICAgICBpZiAoc3RlbmNpbElkID09PSAwICYmIHBhaW50ZXIudGVycmFpbikge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY2xlYXIoe3N0ZW5jaWw6IDB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHN0ZW5jaWxGdW5jID0ge2Z1bmM6IGdsLkVRVUFMLCBtYXNrOiAweEZGfTtcblxuICAgICAgICAgICAgLy8gQWxsb3cgbGluZSBnZW9tZXRyeSBmcmFnbWVudCB0byBiZSBkcmF3biBvbmx5IG9uY2U6XG4gICAgICAgICAgICAvLyAtIEludmVydCB0aGUgc3RlbmNpbCBpZGVudGlmaWVyIGxlZnQgYnkgc3RlbmNpbCBjbGlwcGluZywgdGhpc1xuICAgICAgICAgICAgLy8gZW5zdXJlcyB0aGF0IHdlIGFyZSBub3QgY29uZmxpY3Rpbmcgd2l0aCBuZWlnaGJvcmhpbmcgdGlsZXMuXG4gICAgICAgICAgICAvLyAtIERyYXcgQW50aS1BbGlhc2VkIHBpeGVscyB3aXRoIGEgdGhyZXNob2xkIHNldCB0byAwLjgsIHRoaXNcbiAgICAgICAgICAgIC8vIG1heSBkcmF3IEFudGktQWxpYXNlZCBwaXhlbHMgbW9yZSB0aGFuIG9uY2UsIGJ1dCBkdWUgdG8gdGhlaXJcbiAgICAgICAgICAgIC8vIGxvdyBvcGFjaXR5LCB0aGVzZSBwaXhlbHMgYXJlIHVzdWFsbHkgaW52aXNpYmxlIGFuZCBwb3RlbnRpYWxcbiAgICAgICAgICAgIC8vIG92ZXJsYXBwaW5nIHBpeGVsIGFydGlmYWN0cyBsb2NhbGx5IG1pbmltaXplZC5cbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXNbJ3VfYWxwaGFfZGlzY2FyZF90aHJlc2hvbGQnXSA9IDAuODtcbiAgICAgICAgICAgIHJlbmRlckxpbmUobmV3IFN0ZW5jaWxNb2RlKHN0ZW5jaWxGdW5jLCBzdGVuY2lsSWQsIDB4RkYsIGdsLktFRVAsIGdsLktFRVAsIGdsLklOVkVSVCkpO1xuICAgICAgICAgICAgdW5pZm9ybVZhbHVlc1sndV9hbHBoYV9kaXNjYXJkX3RocmVzaG9sZCddID0gMC4wO1xuICAgICAgICAgICAgcmVuZGVyTGluZShuZXcgU3RlbmNpbE1vZGUoc3RlbmNpbEZ1bmMsIHN0ZW5jaWxJZCwgMHhGRiwgZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuS0VFUCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyTGluZShwYWludGVyLnN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcoY29vcmQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoZW4gcmVuZGVyaW5nIHRvIHN0ZW5jaWwsIHJlc2V0IHRoZSBtYXNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB0aWxlXG4gICAgLy8gY2xpcHBpbmcgcmV2ZXJ0cyB0aGUgc3RlbmNpbCBtYXNrIHdlIG1heSBoYXZlIGRyYXduIGluIHRoZSBidWZmZXIuXG4gICAgLy8gVGhlIHN0YW1wIGNvdWxkIGJlIHJldmVydGVkIGJ5IGFuIGV4dHJhIGRyYXcgY2FsbCBvZiBsaW5lIGdlb21ldHJ5LFxuICAgIC8vIGJ1dCB0aWxlIGNsaXBwaW5nIGRyYXdpbmcgaXMgdXN1YWxseSBmYXN0ZXIgdG8gZHJhdyB0aGFuIGxpbmVzLlxuICAgIGlmICh1c2VTdGVuY2lsTWFza1JlbmRlclBhc3MpIHtcbiAgICAgICAgcGFpbnRlci5yZXNldFN0ZW5jaWxDbGlwcGluZ01hc2tzKCk7XG4gICAgICAgIGlmIChwYWludGVyLnRlcnJhaW4pIHsgY29udGV4dC5jbGVhcih7c3RlbmNpbDogMH0pOyB9XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IENvbG9yIGZyb20gJy4uL3N0eWxlLXNwZWMvdXRpbC9jb2xvci5qcyc7XG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUuanMnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZS5qcyc7XG5pbXBvcnQge1xuICAgIGZpbGxVbmlmb3JtVmFsdWVzLFxuICAgIGZpbGxQYXR0ZXJuVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsT3V0bGluZVVuaWZvcm1WYWx1ZXMsXG4gICAgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlc1xufSBmcm9tICcuL3Byb2dyYW0vZmlsbF9wcm9ncmFtLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBGaWxsU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIEZpbGxCdWNrZXQgZnJvbSAnLi4vZGF0YS9idWNrZXQvZmlsbF9idWNrZXQuanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0ZpbGw7XG5cbmZ1bmN0aW9uIGRyYXdGaWxsKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IEZpbGxTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBsYXllci5wYWludC5nZXQoJ2ZpbGwtY29sb3InKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLW9wYWNpdHknKTtcblxuICAgIGlmIChvcGFjaXR5LmNvbnN0YW50T3IoMSkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuXG4gICAgY29uc3QgcGF0dGVybiA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1wYXR0ZXJuJyk7XG4gICAgY29uc3QgcGFzcyA9IHBhaW50ZXIub3BhcXVlUGFzc0VuYWJsZWRGb3JMYXllcigpICYmXG4gICAgICAgICghcGF0dGVybi5jb25zdGFudE9yKCgxOiBhbnkpKSAmJlxuICAgICAgICBjb2xvci5jb25zdGFudE9yKENvbG9yLnRyYW5zcGFyZW50KS5hID09PSAxICYmXG4gICAgICAgIG9wYWNpdHkuY29uc3RhbnRPcigwKSA9PT0gMSkgPyAnb3BhcXVlJyA6ICd0cmFuc2x1Y2VudCc7XG5cbiAgICAvLyBEcmF3IGZpbGxcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSBwYXNzKSB7XG4gICAgICAgIGNvbnN0IGRlcHRoTW9kZSA9IHBhaW50ZXIuZGVwdGhNb2RlRm9yU3VibGF5ZXIoXG4gICAgICAgICAgICAxLCBwYWludGVyLnJlbmRlclBhc3MgPT09ICdvcGFxdWUnID8gRGVwdGhNb2RlLlJlYWRXcml0ZSA6IERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgICAgIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gRHJhdyBzdHJva2VcbiAgICBpZiAocGFpbnRlci5yZW5kZXJQYXNzID09PSAndHJhbnNsdWNlbnQnICYmIGxheWVyLnBhaW50LmdldCgnZmlsbC1hbnRpYWxpYXMnKSkge1xuXG4gICAgICAgIC8vIElmIHdlIGRlZmluZWQgYSBkaWZmZXJlbnQgY29sb3IgZm9yIHRoZSBmaWxsIG91dGxpbmUsIHdlIGFyZVxuICAgICAgICAvLyBnb2luZyB0byBpZ25vcmUgdGhlIGJpdHMgaW4gMHgwNyBhbmQganVzdCBjYXJlIGFib3V0IHRoZSBnbG9iYWxcbiAgICAgICAgLy8gY2xpcHBpbmcgbWFzay5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBvbmx5IHdhbnQgdG8gZHJhd0ZpbGwgdGhlIGFudGlhbGlhc2VkIHBhcnRzIHRoYXQgYXJlXG4gICAgICAgIC8vICpvdXRzaWRlKiB0aGUgY3VycmVudCBzaGFwZS4gVGhpcyBpcyBpbXBvcnRhbnQgaW4gY2FzZSB0aGUgZmlsbFxuICAgICAgICAvLyBvciBzdHJva2UgY29sb3IgaXMgdHJhbnNsdWNlbnQuIElmIHdlIHdvdWxkbid0IGNsaXAgdG8gb3V0c2lkZVxuICAgICAgICAvLyB0aGUgY3VycmVudCBzaGFwZSwgc29tZSBwaXhlbHMgZnJvbSB0aGUgb3V0bGluZSBzdHJva2Ugb3ZlcmxhcHBlZFxuICAgICAgICAvLyB0aGUgKG5vbi1hbnRpYWxpYXNlZCkgZmlsbC5cbiAgICAgICAgY29uc3QgZGVwdGhNb2RlID0gcGFpbnRlci5kZXB0aE1vZGVGb3JTdWJsYXllcihcbiAgICAgICAgICAgIGxheWVyLmdldFBhaW50UHJvcGVydHkoJ2ZpbGwtb3V0bGluZS1jb2xvcicpID8gMiA6IDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgICAgIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCB0cnVlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdGaWxsVGlsZXMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgY29sb3JNb2RlLCBpc091dGxpbmUpIHtcbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuY29udGV4dC5nbDtcblxuICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eSA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1wYXR0ZXJuJyk7XG4gICAgY29uc3QgaW1hZ2UgPSBwYXR0ZXJuUHJvcGVydHkgJiYgcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuICAgIGNvbnN0IGNyb3NzZmFkZSA9IGxheWVyLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtcbiAgICBsZXQgZHJhd01vZGUsIHByb2dyYW1OYW1lLCB1bmlmb3JtVmFsdWVzLCBpbmRleEJ1ZmZlciwgc2VnbWVudHM7XG5cbiAgICBpZiAoIWlzT3V0bGluZSkge1xuICAgICAgICBwcm9ncmFtTmFtZSA9IGltYWdlID8gJ2ZpbGxQYXR0ZXJuJyA6ICdmaWxsJztcbiAgICAgICAgZHJhd01vZGUgPSBnbC5UUklBTkdMRVM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbU5hbWUgPSBpbWFnZSAmJiAhbGF5ZXIuZ2V0UGFpbnRQcm9wZXJ0eSgnZmlsbC1vdXRsaW5lLWNvbG9yJykgPyAnZmlsbE91dGxpbmVQYXR0ZXJuJyA6ICdmaWxsT3V0bGluZSc7XG4gICAgICAgIGRyYXdNb2RlID0gZ2wuTElORVM7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBpZiAoaW1hZ2UgJiYgIXRpbGUucGF0dGVybnNMb2FkZWQoKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgYnVja2V0OiA/RmlsbEJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1RpbGUoKTtcblxuICAgICAgICBjb25zdCBwcm9ncmFtQ29uZmlndXJhdGlvbiA9IGJ1Y2tldC5wcm9ncmFtQ29uZmlndXJhdGlvbnMuZ2V0KGxheWVyLmlkKTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShwcm9ncmFtTmFtZSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgcGFpbnRlci5jb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24udXBkYXRlUGFpbnRCdWZmZXJzKGNyb3NzZmFkZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25zdGFudFBhdHRlcm4gPSBwYXR0ZXJuUHJvcGVydHkuY29uc3RhbnRPcihudWxsKTtcbiAgICAgICAgaWYgKGNvbnN0YW50UGF0dGVybiAmJiB0aWxlLmltYWdlQXRsYXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGF0bGFzID0gdGlsZS5pbWFnZUF0bGFzO1xuICAgICAgICAgICAgY29uc3QgcG9zVG8gPSBhdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi50by50b1N0cmluZygpXTtcbiAgICAgICAgICAgIGNvbnN0IHBvc0Zyb20gPSBhdGxhcy5wYXR0ZXJuUG9zaXRpb25zW2NvbnN0YW50UGF0dGVybi5mcm9tLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgaWYgKHBvc1RvICYmIHBvc0Zyb20pIHByb2dyYW1Db25maWd1cmF0aW9uLnNldENvbnN0YW50UGF0dGVyblBvc2l0aW9ucyhwb3NUbywgcG9zRnJvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aWxlTWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoY29vcmQucHJvak1hdHJpeCwgdGlsZSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnZmlsbC10cmFuc2xhdGUnKSwgbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLXRyYW5zbGF0ZS1hbmNob3InKSk7XG5cbiAgICAgICAgaWYgKCFpc091dGxpbmUpIHtcbiAgICAgICAgICAgIGluZGV4QnVmZmVyID0gYnVja2V0LmluZGV4QnVmZmVyO1xuICAgICAgICAgICAgc2VnbWVudHMgPSBidWNrZXQuc2VnbWVudHM7XG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzID0gaW1hZ2UgP1xuICAgICAgICAgICAgICAgIGZpbGxQYXR0ZXJuVW5pZm9ybVZhbHVlcyh0aWxlTWF0cml4LCBwYWludGVyLCBjcm9zc2ZhZGUsIHRpbGUpIDpcbiAgICAgICAgICAgICAgICBmaWxsVW5pZm9ybVZhbHVlcyh0aWxlTWF0cml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGluZGV4QnVmZmVyID0gYnVja2V0LmluZGV4QnVmZmVyMjtcbiAgICAgICAgICAgIHNlZ21lbnRzID0gYnVja2V0LnNlZ21lbnRzMjtcbiAgICAgICAgICAgIGNvbnN0IGRyYXdpbmdCdWZmZXJTaXplID0gKHBhaW50ZXIudGVycmFpbiAmJiBwYWludGVyLnRlcnJhaW4ucmVuZGVyaW5nVG9UZXh0dXJlKSA/IHBhaW50ZXIudGVycmFpbi5kcmFwZUJ1ZmZlclNpemUgOiBbZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0XTtcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMgPSAocHJvZ3JhbU5hbWUgPT09ICdmaWxsT3V0bGluZVBhdHRlcm4nICYmIGltYWdlKSA/XG4gICAgICAgICAgICAgICAgZmlsbE91dGxpbmVQYXR0ZXJuVW5pZm9ybVZhbHVlcyh0aWxlTWF0cml4LCBwYWludGVyLCBjcm9zc2ZhZGUsIHRpbGUsIGRyYXdpbmdCdWZmZXJTaXplKSA6XG4gICAgICAgICAgICAgICAgZmlsbE91dGxpbmVVbmlmb3JtVmFsdWVzKHRpbGVNYXRyaXgsIGRyYXdpbmdCdWZmZXJTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBhaW50ZXIucHJlcGFyZURyYXdQcm9ncmFtKHBhaW50ZXIuY29udGV4dCwgcHJvZ3JhbSwgY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgcHJvZ3JhbS5kcmF3KHBhaW50ZXIuY29udGV4dCwgZHJhd01vZGUsIGRlcHRoTW9kZSxcbiAgICAgICAgICAgIHBhaW50ZXIuc3RlbmNpbE1vZGVGb3JDbGlwcGluZyhjb29yZCksIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLCB1bmlmb3JtVmFsdWVzLFxuICAgICAgICAgICAgbGF5ZXIuaWQsIGJ1Y2tldC5sYXlvdXRWZXJ0ZXhCdWZmZXIsIGluZGV4QnVmZmVyLCBzZWdtZW50cyxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LCBwYWludGVyLnRyYW5zZm9ybS56b29tLCBwcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQgRmlsbEV4dHJ1c2lvbkJ1Y2tldCwge2ZpbGxFeHRydXNpb25IZWlnaHRMaWZ0fSBmcm9tICcuLi9kYXRhL2J1Y2tldC9maWxsX2V4dHJ1c2lvbl9idWNrZXQuanMnO1xuaW1wb3J0IHtcbiAgICBmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyxcbiAgICBmaWxsRXh0cnVzaW9uUGF0dGVyblVuaWZvcm1WYWx1ZXMsXG59IGZyb20gJy4vcHJvZ3JhbS9maWxsX2V4dHJ1c2lvbl9wcm9ncmFtLmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHttZXJjYXRvclhmcm9tTG5nLCBtZXJjYXRvcllmcm9tTGF0fSBmcm9tICcuLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5pbXBvcnQge2dsb2JlVG9NZXJjYXRvclRyYW5zaXRpb259IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL2dsb2JlX3V0aWwuanMnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlLmpzJztcbmltcG9ydCB0eXBlIEZpbGxFeHRydXNpb25TdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhdztcblxuZnVuY3Rpb24gZHJhdyhwYWludGVyOiBQYWludGVyLCBzb3VyY2U6IFNvdXJjZUNhY2hlLCBsYXllcjogRmlsbEV4dHJ1c2lvblN0eWxlTGF5ZXIsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5Jyk7XG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICd0cmFuc2x1Y2VudCcpIHtcbiAgICAgICAgY29uc3QgZGVwdGhNb2RlID0gbmV3IERlcHRoTW9kZShwYWludGVyLmNvbnRleHQuZ2wuTEVRVUFMLCBEZXB0aE1vZGUuUmVhZFdyaXRlLCBwYWludGVyLmRlcHRoUmFuZ2VGb3IzRCk7XG5cbiAgICAgICAgaWYgKG9wYWNpdHkgPT09IDEgJiYgIWxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tcGF0dGVybicpLmNvbnN0YW50T3IoKDE6IGFueSkpKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICAgICAgICAgIGRyYXdFeHRydXNpb25UaWxlcyhwYWludGVyLCBzb3VyY2UsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsIGNvbG9yTW9kZSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERyYXcgdHJhbnNwYXJlbnQgYnVpbGRpbmdzIGluIHR3byBwYXNzZXMgc28gdGhhdCBvbmx5IHRoZSBjbG9zZXN0IHN1cmZhY2UgaXMgZHJhd24uXG4gICAgICAgICAgICAvLyBGaXJzdCBkcmF3IGFsbCB0aGUgZXh0cnVzaW9ucyBpbnRvIG9ubHkgdGhlIGRlcHRoIGJ1ZmZlci4gTm8gY29sb3JzIGFyZSBkcmF3bi5cbiAgICAgICAgICAgIGRyYXdFeHRydXNpb25UaWxlcyhwYWludGVyLCBzb3VyY2UsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSxcbiAgICAgICAgICAgICAgICBTdGVuY2lsTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICBDb2xvck1vZGUuZGlzYWJsZWQpO1xuXG4gICAgICAgICAgICAvLyBUaGVuIGRyYXcgYWxsIHRoZSBleHRydXNpb25zIGEgc2Vjb25kIHR5cGUsIG9ubHkgY29sb3JpbmcgZnJhZ21lbnRzIGlmIHRoZXkgaGF2ZSB0aGVcbiAgICAgICAgICAgIC8vIHNhbWUgZGVwdGggdmFsdWUgYXMgdGhlIGNsb3Nlc3QgZnJhZ21lbnQgaW4gdGhlIHByZXZpb3VzIHBhc3MuIFVzZSB0aGUgc3RlbmNpbCBidWZmZXJcbiAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgdGhlIHNlY29uZCBkcmF3IGluIGNhc2VzIHdoZXJlIHdlIGhhdmUgY29pbmNpZGVudCBwb2x5Z29ucy5cbiAgICAgICAgICAgIGRyYXdFeHRydXNpb25UaWxlcyhwYWludGVyLCBzb3VyY2UsIGxheWVyLCBjb29yZHMsIGRlcHRoTW9kZSxcbiAgICAgICAgICAgICAgICBwYWludGVyLnN0ZW5jaWxNb2RlRm9yM0QoKSxcbiAgICAgICAgICAgICAgICBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSk7XG5cbiAgICAgICAgICAgIHBhaW50ZXIucmVzZXRTdGVuY2lsQ2xpcHBpbmdNYXNrcygpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3RXh0cnVzaW9uVGlsZXMocGFpbnRlciwgc291cmNlLCBsYXllciwgY29vcmRzLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IHBhdHRlcm5Qcm9wZXJ0eSA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tcGF0dGVybicpO1xuICAgIGNvbnN0IGltYWdlID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IoKDE6IGFueSkpO1xuICAgIGNvbnN0IGNyb3NzZmFkZSA9IGxheWVyLmdldENyb3NzZmFkZVBhcmFtZXRlcnMoKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5Jyk7XG4gICAgY29uc3QgaGVpZ2h0TGlmdCA9IHRyLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJyA/IGZpbGxFeHRydXNpb25IZWlnaHRMaWZ0KCkgOiAwO1xuICAgIGNvbnN0IGlzR2xvYmVQcm9qZWN0aW9uID0gdHIucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnO1xuICAgIGNvbnN0IGdsb2JlVG9NZXJjYXRvciA9IGlzR2xvYmVQcm9qZWN0aW9uID8gZ2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbih0ci56b29tKSA6IDAuMDtcbiAgICBjb25zdCBtZXJjYXRvckNlbnRlciA9IFttZXJjYXRvclhmcm9tTG5nKHRyLmNlbnRlci5sbmcpLCBtZXJjYXRvcllmcm9tTGF0KHRyLmNlbnRlci5sYXQpXTtcbiAgICBjb25zdCBiYXNlRGVmaW5lcyA9IChbXTogYW55KTtcbiAgICBpZiAoaXNHbG9iZVByb2plY3Rpb24pIHtcbiAgICAgICAgYmFzZURlZmluZXMucHVzaCgnUFJPSkVDVElPTl9HTE9CRV9WSUVXJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0OiA/RmlsbEV4dHJ1c2lvbkJ1Y2tldCA9ICh0aWxlLmdldEJ1Y2tldChsYXllcik6IGFueSk7XG4gICAgICAgIGlmICghYnVja2V0IHx8IGJ1Y2tldC5wcm9qZWN0aW9uLm5hbWUgIT09IHRyLnByb2plY3Rpb24ubmFtZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBidWNrZXQucHJvZ3JhbUNvbmZpZ3VyYXRpb25zLmdldChsYXllci5pZCk7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oaW1hZ2UgPyAnZmlsbEV4dHJ1c2lvblBhdHRlcm4nIDogJ2ZpbGxFeHRydXNpb24nLCBwcm9ncmFtQ29uZmlndXJhdGlvbiwgYmFzZURlZmluZXMpO1xuXG4gICAgICAgIGlmIChwYWludGVyLnRlcnJhaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHRlcnJhaW4gPSBwYWludGVyLnRlcnJhaW47XG4gICAgICAgICAgICBpZiAocGFpbnRlci5zdHlsZS50ZXJyYWluU2V0Rm9yRHJhcGluZ09ubHkoKSkge1xuICAgICAgICAgICAgICAgIHRlcnJhaW4uc2V0dXBFbGV2YXRpb25EcmF3KHRpbGUsIHByb2dyYW0sIHt1c2VNZXRlclRvRGVtOiB0cnVlfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghYnVja2V0LmVuYWJsZVRlcnJhaW4pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRlcnJhaW4uc2V0dXBFbGV2YXRpb25EcmF3KHRpbGUsIHByb2dyYW0sIHt1c2VNZXRlclRvRGVtOiB0cnVlfSk7XG4gICAgICAgICAgICAgICAgZmxhdFJvb2ZzVXBkYXRlKGNvbnRleHQsIHNvdXJjZSwgY29vcmQsIGJ1Y2tldCwgbGF5ZXIsIHRlcnJhaW4pO1xuICAgICAgICAgICAgICAgIGlmICghYnVja2V0LmNlbnRyb2lkVmVydGV4QnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJJbmRleDogbnVtYmVyIHwgdm9pZCA9IHByb2dyYW0uYXR0cmlidXRlc1snYV9jZW50cm9pZF9wb3MnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJJbmRleCAhPT0gdW5kZWZpbmVkKSBnbC52ZXJ0ZXhBdHRyaWIyZihhdHRySW5kZXgsIDAsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgcGFpbnRlci5jb250ZXh0LmFjdGl2ZVRleHR1cmUuc2V0KGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIHRpbGUuaW1hZ2VBdGxhc1RleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24udXBkYXRlUGFpbnRCdWZmZXJzKGNyb3NzZmFkZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29uc3RhbnRQYXR0ZXJuID0gcGF0dGVyblByb3BlcnR5LmNvbnN0YW50T3IobnVsbCk7XG4gICAgICAgIGlmIChjb25zdGFudFBhdHRlcm4gJiYgdGlsZS5pbWFnZUF0bGFzKSB7XG4gICAgICAgICAgICBjb25zdCBhdGxhcyA9IHRpbGUuaW1hZ2VBdGxhcztcbiAgICAgICAgICAgIGNvbnN0IHBvc1RvID0gYXRsYXMucGF0dGVyblBvc2l0aW9uc1tjb25zdGFudFBhdHRlcm4udG8udG9TdHJpbmcoKV07XG4gICAgICAgICAgICBjb25zdCBwb3NGcm9tID0gYXRsYXMucGF0dGVyblBvc2l0aW9uc1tjb25zdGFudFBhdHRlcm4uZnJvbS50b1N0cmluZygpXTtcbiAgICAgICAgICAgIGlmIChwb3NUbyAmJiBwb3NGcm9tKSBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRDb25zdGFudFBhdHRlcm5Qb3NpdGlvbnMocG9zVG8sIHBvc0Zyb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF0cml4ID0gcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoXG4gICAgICAgICAgICBjb29yZC5wcm9qTWF0cml4LFxuICAgICAgICAgICAgdGlsZSxcbiAgICAgICAgICAgIGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tdHJhbnNsYXRlJyksXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3InKSk7XG5cbiAgICAgICAgY29uc3QgaW52TWF0cml4ID0gdHIucHJvamVjdGlvbi5jcmVhdGVJbnZlcnNpb25NYXRyaXgodHIsIGNvb3JkLmNhbm9uaWNhbCk7XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkVXNlVmVydGljYWxHcmFkaWVudCA9IGxheWVyLnBhaW50LmdldCgnZmlsbC1leHRydXNpb24tdmVydGljYWwtZ3JhZGllbnQnKTtcbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGltYWdlID9cbiAgICAgICAgICAgIGZpbGxFeHRydXNpb25QYXR0ZXJuVW5pZm9ybVZhbHVlcyhtYXRyaXgsIHBhaW50ZXIsIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsIG9wYWNpdHksIGNvb3JkLFxuICAgICAgICAgICAgICAgIGNyb3NzZmFkZSwgdGlsZSwgaGVpZ2h0TGlmdCwgZ2xvYmVUb01lcmNhdG9yLCBtZXJjYXRvckNlbnRlciwgaW52TWF0cml4KSA6XG4gICAgICAgICAgICBmaWxsRXh0cnVzaW9uVW5pZm9ybVZhbHVlcyhtYXRyaXgsIHBhaW50ZXIsIHNob3VsZFVzZVZlcnRpY2FsR3JhZGllbnQsIG9wYWNpdHksIGNvb3JkLFxuICAgICAgICAgICAgICAgIGhlaWdodExpZnQsIGdsb2JlVG9NZXJjYXRvciwgbWVyY2F0b3JDZW50ZXIsIGludk1hdHJpeCk7XG5cbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgY29vcmQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgYXNzZXJ0KCFpc0dsb2JlUHJvamVjdGlvbiB8fCBidWNrZXQubGF5b3V0VmVydGV4RXh0QnVmZmVyKTtcblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgY29udGV4dC5nbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmJhY2tDQ1csXG4gICAgICAgICAgICB1bmlmb3JtVmFsdWVzLCBsYXllci5pZCwgYnVja2V0LmxheW91dFZlcnRleEJ1ZmZlciwgYnVja2V0LmluZGV4QnVmZmVyLFxuICAgICAgICAgICAgYnVja2V0LnNlZ21lbnRzLCBsYXllci5wYWludCwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSxcbiAgICAgICAgICAgIHByb2dyYW1Db25maWd1cmF0aW9uLFxuICAgICAgICAgICAgcGFpbnRlci50ZXJyYWluID8gYnVja2V0LmNlbnRyb2lkVmVydGV4QnVmZmVyIDogbnVsbCxcbiAgICAgICAgICAgIGlzR2xvYmVQcm9qZWN0aW9uID8gYnVja2V0LmxheW91dFZlcnRleEV4dEJ1ZmZlciA6IG51bGwpO1xuICAgIH1cbn1cblxuLy8gRmxhdCByb29mcyBhcnJheSBpcyBwcmVwYXJlZCBpbiB0aGUgYnVja2V0LCBleGNlcHQgZm9yIGJ1aWxkaW5ncyB0aGF0IGFyZSBvbiB0aWxlIGJvcmRlcnMuXG4vLyBGb3IgdGhlbSwgam9pbiBwaWVjZXMsIGNhbGN1bGF0ZSBqb2luZWQgc2l6ZSBoZXJlLCBhbmQgdGhlbiB1cGxvYWQgZGF0YS5cbmZ1bmN0aW9uIGZsYXRSb29mc1VwZGF0ZShjb250ZXh0LCBzb3VyY2UsIGNvb3JkLCBidWNrZXQsIGxheWVyLCB0ZXJyYWluKSB7XG4gICAgLy8gRm9yIGFsbCBmb3VyIGJvcmRlcnM6IDAgLSBsZWZ0LCAxLCByaWdodCwgMiAtIHRvcCwgMyAtIGJvdHRvbVxuICAgIGNvbnN0IG5laWdoYm9yQ29vcmQgPSBbXG4gICAgICAgIGNvb3JkID0+IHtcbiAgICAgICAgICAgIGxldCB4ID0gY29vcmQuY2Fub25pY2FsLnggLSAxO1xuICAgICAgICAgICAgbGV0IHcgPSBjb29yZC53cmFwO1xuICAgICAgICAgICAgaWYgKHggPCAwKSB7XG4gICAgICAgICAgICAgICAgeCA9ICgxIDw8IGNvb3JkLmNhbm9uaWNhbC56KSAtIDE7XG4gICAgICAgICAgICAgICAgdy0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdmVyc2NhbGVkVGlsZUlEKGNvb3JkLm92ZXJzY2FsZWRaLCB3LCBjb29yZC5jYW5vbmljYWwueiwgeCwgY29vcmQuY2Fub25pY2FsLnkpO1xuICAgICAgICB9LFxuICAgICAgICBjb29yZCA9PiB7XG4gICAgICAgICAgICBsZXQgeCA9IGNvb3JkLmNhbm9uaWNhbC54ICsgMTtcbiAgICAgICAgICAgIGxldCB3ID0gY29vcmQud3JhcDtcbiAgICAgICAgICAgIGlmICh4ID09PSAxIDw8IGNvb3JkLmNhbm9uaWNhbC56KSB7XG4gICAgICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgICAgICAgICAgdysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdmVyc2NhbGVkVGlsZUlEKGNvb3JkLm92ZXJzY2FsZWRaLCB3LCBjb29yZC5jYW5vbmljYWwueiwgeCwgY29vcmQuY2Fub25pY2FsLnkpO1xuICAgICAgICB9LFxuICAgICAgICBjb29yZCA9PiBuZXcgT3ZlcnNjYWxlZFRpbGVJRChjb29yZC5vdmVyc2NhbGVkWiwgY29vcmQud3JhcCwgY29vcmQuY2Fub25pY2FsLnosIGNvb3JkLmNhbm9uaWNhbC54LFxuICAgICAgICAgICAgKGNvb3JkLmNhbm9uaWNhbC55ID09PSAwID8gMSA8PCBjb29yZC5jYW5vbmljYWwueiA6IGNvb3JkLmNhbm9uaWNhbC55KSAtIDEpLFxuICAgICAgICBjb29yZCA9PiBuZXcgT3ZlcnNjYWxlZFRpbGVJRChjb29yZC5vdmVyc2NhbGVkWiwgY29vcmQud3JhcCwgY29vcmQuY2Fub25pY2FsLnosIGNvb3JkLmNhbm9uaWNhbC54LFxuICAgICAgICAgICAgY29vcmQuY2Fub25pY2FsLnkgPT09ICgxIDw8IGNvb3JkLmNhbm9uaWNhbC56KSAtIDEgPyAwIDogY29vcmQuY2Fub25pY2FsLnkgKyAxKVxuICAgIF07XG5cbiAgICBjb25zdCBnZXRMb2FkZWRCdWNrZXQgPSAobmlkKSA9PiB7XG4gICAgICAgIGNvbnN0IG1pbnpvb20gPSBzb3VyY2UuZ2V0U291cmNlKCkubWluem9vbTtcbiAgICAgICAgY29uc3QgZ2V0QnVja2V0ID0gKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbiA9IHNvdXJjZS5nZXRUaWxlQnlJRChrZXkpO1xuICAgICAgICAgICAgaWYgKG4gJiYgbi5oYXNEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5nZXRCdWNrZXQobGF5ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBMb29rIG9uZSB0aWxlIHpvb20gYWJvdmUgYW5kIHVuZGVyLiBXZSBkbyB0aGlzIHRvIGF2b2lkIGZsaWNrZXJpbmcgYW5kXG4gICAgICAgIC8vIHVzZSB0aGUgY29udGVudCBpbiBaLTEgYW5kIForMSBidWNrZXRzIHVudGlsIFogYnVja2V0IGlzIGxvYWRlZCBvciBoYW5kbGVcbiAgICAgICAgLy8gYmVoYXZpb3Igb24gYm9yZGVycyBiZXR3ZWVuIGRpZmZlcmVudCB6b29tcy5cbiAgICAgICAgY29uc3Qgem9vbUxldmVscyA9IFswLCAtMSwgMV07XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB6b29tTGV2ZWxzKSB7XG4gICAgICAgICAgICBjb25zdCB6ID0gbmlkLm92ZXJzY2FsZWRaICsgaTtcbiAgICAgICAgICAgIGlmICh6IDwgbWluem9vbSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBuaWQuY2FsY3VsYXRlU2NhbGVkS2V5KG5pZC5vdmVyc2NhbGVkWiArIGkpO1xuICAgICAgICAgICAgY29uc3QgYiA9IGdldEJ1Y2tldChrZXkpO1xuICAgICAgICAgICAgaWYgKGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBwcm9qZWN0ZWRUb0JvcmRlciA9IFswLCAwLCAwXTsgLy8gW21pbiwgbWF4LCBtYXhPZmZzZXRGcm9tQm9yZGVyXVxuICAgIGNvbnN0IHhqb2luID0gKGEsIGIpID0+IHtcbiAgICAgICAgcHJvamVjdGVkVG9Cb3JkZXJbMF0gPSBNYXRoLm1pbihhLm1pbi55LCBiLm1pbi55KTtcbiAgICAgICAgcHJvamVjdGVkVG9Cb3JkZXJbMV0gPSBNYXRoLm1heChhLm1heC55LCBiLm1heC55KTtcbiAgICAgICAgcHJvamVjdGVkVG9Cb3JkZXJbMl0gPSBFWFRFTlQgLSBiLm1pbi54ID4gYS5tYXgueCA/IGIubWluLnggLSBFWFRFTlQgOiBhLm1heC54O1xuICAgICAgICByZXR1cm4gcHJvamVjdGVkVG9Cb3JkZXI7XG4gICAgfTtcbiAgICBjb25zdCB5am9pbiA9IChhLCBiKSA9PiB7XG4gICAgICAgIHByb2plY3RlZFRvQm9yZGVyWzBdID0gTWF0aC5taW4oYS5taW4ueCwgYi5taW4ueCk7XG4gICAgICAgIHByb2plY3RlZFRvQm9yZGVyWzFdID0gTWF0aC5tYXgoYS5tYXgueCwgYi5tYXgueCk7XG4gICAgICAgIHByb2plY3RlZFRvQm9yZGVyWzJdID0gRVhURU5UIC0gYi5taW4ueSA+IGEubWF4LnkgPyBiLm1pbi55IC0gRVhURU5UIDogYS5tYXgueTtcbiAgICAgICAgcmV0dXJuIHByb2plY3RlZFRvQm9yZGVyO1xuICAgIH07XG4gICAgY29uc3QgcHJvamVjdENvbWJpbmVkU3BhblRvQm9yZGVyID0gW1xuICAgICAgICAoYSwgYikgPT4geGpvaW4oYSwgYiksXG4gICAgICAgIChhLCBiKSA9PiB4am9pbihiLCBhKSxcbiAgICAgICAgKGEsIGIpID0+IHlqb2luKGEsIGIpLFxuICAgICAgICAoYSwgYikgPT4geWpvaW4oYiwgYSlcbiAgICBdO1xuXG4gICAgY29uc3QgY2VudHJvaWQgPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgY29uc3QgZXJyb3IgPSAzOyAvLyBBbGxvdyBpbnRydXNpb24gb2YgYSBidWlsZGluZyB0byB0aGUgYnVpbGRpbmcgd2l0aCBhZGphY2VudCB3YWxsLlxuXG4gICAgbGV0IGRlbVRpbGUsIG5laWdoYm9yREVNVGlsZSwgbmVpZ2hib3JUaWxlSUQ7XG5cbiAgICBjb25zdCBmbGF0QmFzZSA9IChtaW4sIG1heCwgZWRnZSwgdmVydGljYWxFZGdlLCBtYXhPZmZzZXRGcm9tQm9yZGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50cyA9IFtbdmVydGljYWxFZGdlID8gZWRnZSA6IG1pbiwgdmVydGljYWxFZGdlID8gbWluIDogZWRnZSwgMF0sIFt2ZXJ0aWNhbEVkZ2UgPyBlZGdlIDogbWF4LCB2ZXJ0aWNhbEVkZ2UgPyBtYXggOiBlZGdlLCAwXV07XG5cbiAgICAgICAgY29uc3QgY29vcmQzID0gbWF4T2Zmc2V0RnJvbUJvcmRlciA8IDAgPyBFWFRFTlQgKyBtYXhPZmZzZXRGcm9tQm9yZGVyIDogbWF4T2Zmc2V0RnJvbUJvcmRlcjtcbiAgICAgICAgY29uc3QgdGhpcmRQb2ludCA9IFt2ZXJ0aWNhbEVkZ2UgPyBjb29yZDMgOiAobWluICsgbWF4KSAvIDIsIHZlcnRpY2FsRWRnZSA/IChtaW4gKyBtYXgpIC8gMiA6IGNvb3JkMywgMF07XG4gICAgICAgIGlmICgoZWRnZSA9PT0gMCAmJiBtYXhPZmZzZXRGcm9tQm9yZGVyIDwgMCkgfHwgKGVkZ2UgIT09IDAgJiYgbWF4T2Zmc2V0RnJvbUJvcmRlciA+IDApKSB7XG4gICAgICAgICAgICAvLyBUaGlyZCBwb2ludCBpcyBpbnNpZGUgbmVpZ2hib3IgdGlsZSwgbm90IGluIHRoZSB8Y29vcmR8IHRpbGUuXG4gICAgICAgICAgICB0ZXJyYWluLmdldEZvclRpbGVQb2ludHMobmVpZ2hib3JUaWxlSUQsIFt0aGlyZFBvaW50XSwgdHJ1ZSwgbmVpZ2hib3JERU1UaWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvaW50cy5wdXNoKHRoaXJkUG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRlcnJhaW4uZ2V0Rm9yVGlsZVBvaW50cyhjb29yZCwgcG9pbnRzLCB0cnVlLCBkZW1UaWxlKTtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KHBvaW50c1swXVsyXSwgcG9pbnRzWzFdWzJdLCB0aGlyZFBvaW50WzJdKSAvIHRlcnJhaW4uZXhhZ2dlcmF0aW9uKCk7XG4gICAgfTtcblxuICAgIC8vIFByb2Nlc3MgYWxsIGZvdXIgYm9yZGVyczogZ2V0IG5laWdoYm9yaW5nIHRpbGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAvLyBib3JkZXJzIC8gYm9yZGVyRG9uZVdpdGhOZWlnaGJvclo6IDAgLSBsZWZ0LCAxLCByaWdodCwgMiAtIHRvcCwgMyAtIGJvdHRvbVxuICAgICAgICAvLyBidWNrZXQncyBib3JkZXIgaSBpcyBuZWlnaGJvcmluZyBidWNrZXQncyBib3JkZXIgajpcbiAgICAgICAgY29uc3QgaiA9IChpIDwgMiA/IDEgOiA1KSAtIGk7XG4gICAgICAgIC8vIFNvcnQgYnkgYm9yZGVyIGludGVyc2VjdGlvbiBhcmVhIG1pbmltdW1zLCBhc2NlbmRpbmcuXG4gICAgICAgIGNvbnN0IGEgPSBidWNrZXQuYm9yZGVyc1tpXTtcbiAgICAgICAgaWYgKGEubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbmlkID0gbmVpZ2hib3JUaWxlSUQgPSBuZWlnaGJvckNvb3JkW2ldKGNvb3JkKTtcbiAgICAgICAgY29uc3QgbkJ1Y2tldCA9IGdldExvYWRlZEJ1Y2tldChuaWQpO1xuICAgICAgICBpZiAoIW5CdWNrZXQgfHwgIShuQnVja2V0IGluc3RhbmNlb2YgRmlsbEV4dHJ1c2lvbkJ1Y2tldCkgfHwgIW5CdWNrZXQuZW5hYmxlVGVycmFpbikgY29udGludWU7XG4gICAgICAgIGlmIChidWNrZXQuYm9yZGVyRG9uZVdpdGhOZWlnaGJvclpbaV0gPT09IG5CdWNrZXQuY2Fub25pY2FsLnogJiZcbiAgICAgICAgICAgIG5CdWNrZXQuYm9yZGVyRG9uZVdpdGhOZWlnaGJvclpbal0gPT09IGJ1Y2tldC5jYW5vbmljYWwueikge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBuZWlnaGJvckRFTVRpbGUgPSB0ZXJyYWluLmZpbmRERU1UaWxlRm9yKG5pZCk7XG4gICAgICAgIGlmICghbmVpZ2hib3JERU1UaWxlIHx8ICFuZWlnaGJvckRFTVRpbGUuZGVtKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFkZW1UaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBkZW0gPSB0ZXJyYWluLmZpbmRERU1UaWxlRm9yKGNvb3JkKTtcbiAgICAgICAgICAgIGlmICghKGRlbSAmJiBkZW0uZGVtKSkgcmV0dXJuOyAvLyBkZWZlciB1cGRhdGUgdW50aWwgYW4gZWxldmF0aW9uIHRpbGUgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgZGVtVGlsZSA9IGRlbTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiID0gbkJ1Y2tldC5ib3JkZXJzW2pdO1xuICAgICAgICBsZXQgaWIgPSAwO1xuXG4gICAgICAgIGNvbnN0IHVwZGF0ZU5laWdoYm9yID0gbkJ1Y2tldC5ib3JkZXJEb25lV2l0aE5laWdoYm9yWltqXSAhPT0gYnVja2V0LmNhbm9uaWNhbC56O1xuICAgICAgICAvLyBJZiBuZWlnaGJvcnMgYXJlIG9mIGRpZmZlcmVudCBjYW5vbmljYWwgeiwgd2UgY2Fubm90IGpvaW4gcGFydHMgYnV0IHNob3dcbiAgICAgICAgLy8gYWxsIHdpdGhvdXQgZmxhdCByb29mcy5cbiAgICAgICAgaWYgKGJ1Y2tldC5jYW5vbmljYWwueiAhPT0gbkJ1Y2tldC5jYW5vbmljYWwueikge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBhKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0LmVuY29kZUNlbnRyb2lkKHVuZGVmaW5lZCwgYnVja2V0LmZlYXR1cmVzT25Cb3JkZXJbaW5kZXhdLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlTmVpZ2hib3IpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgbkJ1Y2tldC5lbmNvZGVDZW50cm9pZCh1bmRlZmluZWQsIG5CdWNrZXQuZmVhdHVyZXNPbkJvcmRlcltpbmRleF0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbkJ1Y2tldC5ib3JkZXJEb25lV2l0aE5laWdoYm9yWltqXSA9IGJ1Y2tldC5jYW5vbmljYWwuejtcbiAgICAgICAgICAgICAgICBuQnVja2V0Lm5lZWRzQ2VudHJvaWRVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVja2V0LmJvcmRlckRvbmVXaXRoTmVpZ2hib3JaW2ldID0gbkJ1Y2tldC5jYW5vbmljYWwuejtcbiAgICAgICAgICAgIGJ1Y2tldC5uZWVkc0NlbnRyb2lkVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaWEgPSAwOyBpYSA8IGEubGVuZ3RoOyBpYSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0YSA9IGJ1Y2tldC5mZWF0dXJlc09uQm9yZGVyW2FbaWFdXTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRBQm9yZGVyUmFuZ2UgPSBwYXJ0YS5ib3JkZXJzW2ldO1xuICAgICAgICAgICAgLy8gRmluZCBhbGwgbkJ1Y2tldCBwYXJ0cyB0aGF0IHNoYXJlIHRoZSBib3JkZXIgb3ZlcmxhcC5cbiAgICAgICAgICAgIGxldCBwYXJ0YjtcbiAgICAgICAgICAgIHdoaWxlIChpYiA8IGIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gUGFzcyBhbGwgdGhhdCBhcmUgYmVmb3JlIHRoZSBvdmVybGFwLlxuICAgICAgICAgICAgICAgIHBhcnRiID0gbkJ1Y2tldC5mZWF0dXJlc09uQm9yZGVyW2JbaWJdXTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0QkJvcmRlclJhbmdlID0gcGFydGIuYm9yZGVyc1tqXTtcbiAgICAgICAgICAgICAgICBpZiAocGFydEJCb3JkZXJSYW5nZVsxXSA+IHBhcnRBQm9yZGVyUmFuZ2VbMF0gKyBlcnJvcikgYnJlYWs7XG4gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZU5laWdoYm9yKSBuQnVja2V0LmVuY29kZUNlbnRyb2lkKHVuZGVmaW5lZCwgcGFydGIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpYisrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcnRiICYmIGliIDwgYi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzYXZlSWIgPSBpYjtcbiAgICAgICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbGxlY3QgYWxsIHBhcnRzIG92ZXJsYXBwaW5nIHBhcnRhIG9uIHRoZSBlZGdlLCB0byBtYWtlIHN1cmUgaXQgaXMgb25seSBvbmUuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRCQm9yZGVyUmFuZ2UgPSBwYXJ0Yi5ib3JkZXJzW2pdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFydEJCb3JkZXJSYW5nZVswXSA+IHBhcnRBQm9yZGVyUmFuZ2VbMV0gLSBlcnJvcikgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgIGlmICgrK2liID09PSBiLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRiID0gbkJ1Y2tldC5mZWF0dXJlc09uQm9yZGVyW2JbaWJdXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFydGIgPSBuQnVja2V0LmZlYXR1cmVzT25Cb3JkZXJbYltzYXZlSWJdXTtcblxuICAgICAgICAgICAgICAgIC8vIElmIGFueSBvZiBhIG9yIGIgY3Jvc3NlcyBtb3JlIHRoYW4gb25lIHRpbGUgZWRnZSwgZG9uJ3Qgc3VwcG9ydCBmbGF0IHJvb2YuXG4gICAgICAgICAgICAgICAgaWYgKHBhcnRhLmludGVyc2VjdHNDb3VudCgpID4gMSB8fCBwYXJ0Yi5pbnRlcnNlY3RzQ291bnQoKSA+IDEgfHwgY291bnQgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpYiA9IHNhdmVJYjsgLy8gcmV3aW5kIHVucHJvY2Vzc2VkIGliIHNvIHRoYXQgaXQgaXMgcHJvY2Vzc2VkIGFnYWluIGZvciB0aGUgbmV4dCBpYS5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5lbmNvZGVDZW50cm9pZCh1bmRlZmluZWQsIHBhcnRhLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVOZWlnaGJvcikgbkJ1Y2tldC5lbmNvZGVDZW50cm9pZCh1bmRlZmluZWQsIHBhcnRiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBoYXZlIDEtMSBtYXRjaGluZyBvZiBwYXJ0cyBpbiBib3RoIHRpbGVzIHRoYXQgc2hhcmUgdGhlIGVkZ2UuIENhbGN1bGF0ZSBmbGF0IGJhc2UgZWxldmF0aW9uXG4gICAgICAgICAgICAgICAgLy8gYXMgYXZlcmFnZSBvZiB0aHJlZSBwb2ludHM6IDIgYXJlIGVkZ2UgcG9pbnRzIChjb21iaW5lZCBzcGFuIHByb2plY3RlZCB0byBib3JkZXIpIGFuZCBvbmUgaXMgcG9pbnQgb2ZcbiAgICAgICAgICAgICAgICAvLyBzcGFuIHRoYXQgaGFzIG1heGltdW0gb2Zmc2V0IHRvIGJvcmRlci5cbiAgICAgICAgICAgICAgICBjb25zdCBzcGFuID0gcHJvamVjdENvbWJpbmVkU3BhblRvQm9yZGVyW2ldKHBhcnRhLCBwYXJ0Yik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZSA9IChpICUgMikgPyBFWFRFTlQgLSAxIDogMDtcbiAgICAgICAgICAgICAgICBjZW50cm9pZC54ID0gZmxhdEJhc2Uoc3BhblswXSwgTWF0aC5taW4oRVhURU5UIC0gMSwgc3BhblsxXSksIGVkZ2UsIGkgPCAyLCBzcGFuWzJdKTtcbiAgICAgICAgICAgICAgICBjZW50cm9pZC55ID0gMDtcbiAgICAgICAgICAgICAgICBhc3NlcnQocGFydGEudmVydGV4QXJyYXlPZmZzZXQgIT09IHVuZGVmaW5lZCAmJiBwYXJ0YS52ZXJ0ZXhBcnJheU9mZnNldCA8IGJ1Y2tldC5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGJ1Y2tldC5lbmNvZGVDZW50cm9pZChjZW50cm9pZCwgcGFydGEsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIGFzc2VydChwYXJ0Yi52ZXJ0ZXhBcnJheU9mZnNldCAhPT0gdW5kZWZpbmVkICYmIHBhcnRiLnZlcnRleEFycmF5T2Zmc2V0IDwgbkJ1Y2tldC5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVOZWlnaGJvcikgbkJ1Y2tldC5lbmNvZGVDZW50cm9pZChjZW50cm9pZCwgcGFydGIsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHBhcnRhLmludGVyc2VjdHNDb3VudCgpID4gMSB8fCAocGFydGIgJiYgcGFydGIuaW50ZXJzZWN0c0NvdW50KCkgPiAxKSk7IC8vIGV4cGVjdGVkIGF0IHRoZSBlbmQgb2YgYm9yZGVyLCB3aGVuIGJ1aWxkaW5ncyBjb3ZlciBjb3JuZXIgKHNob3cgYnVpbGRpbmcgdy9vIGZsYXQgcm9vZikuXG4gICAgICAgICAgICAgICAgYnVja2V0LmVuY29kZUNlbnRyb2lkKHVuZGVmaW5lZCwgcGFydGEsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJ1Y2tldC5ib3JkZXJEb25lV2l0aE5laWdoYm9yWltpXSA9IG5CdWNrZXQuY2Fub25pY2FsLno7XG4gICAgICAgIGJ1Y2tldC5uZWVkc0NlbnRyb2lkVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHVwZGF0ZU5laWdoYm9yKSB7XG4gICAgICAgICAgICBuQnVja2V0LmJvcmRlckRvbmVXaXRoTmVpZ2hib3JaW2pdID0gYnVja2V0LmNhbm9uaWNhbC56O1xuICAgICAgICAgICAgbkJ1Y2tldC5uZWVkc0NlbnRyb2lkVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChidWNrZXQubmVlZHNDZW50cm9pZFVwZGF0ZSB8fCAoIWJ1Y2tldC5jZW50cm9pZFZlcnRleEJ1ZmZlciAmJiBidWNrZXQuY2VudHJvaWRWZXJ0ZXhBcnJheS5sZW5ndGggIT09IDApKSB7XG4gICAgICAgIGJ1Y2tldC51cGxvYWRDZW50cm9pZChjb250ZXh0KTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgSW1hZ2VTb3VyY2UgZnJvbSAnLi4vc291cmNlL2ltYWdlX3NvdXJjZS5qcyc7XG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZS5qcyc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlLmpzJztcbmltcG9ydCB7cmFzdGVyVW5pZm9ybVZhbHVlc30gZnJvbSAnLi9wcm9ncmFtL3Jhc3Rlcl9wcm9ncmFtLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBSYXN0ZXJTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL3Jhc3Rlcl9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7T3ZlcnNjYWxlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHJhc3RlckZhZGUgZnJvbSAnLi9yYXN0ZXJfZmFkZS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdSYXN0ZXI7XG5cbmZ1bmN0aW9uIGRyYXdSYXN0ZXIocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogUmFzdGVyU3R5bGVMYXllciwgdGlsZUlEczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4sIHZhcmlhYmxlT2Zmc2V0czogYW55LCBpc0luaXRpYWxMb2FkOiBib29sZWFuKSB7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gJ3RyYW5zbHVjZW50JykgcmV0dXJuO1xuICAgIGlmIChsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1vcGFjaXR5JykgPT09IDApIHJldHVybjtcbiAgICBpZiAoIXRpbGVJRHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdyYXN0ZXInKTtcblxuICAgIGNvbnN0IGNvbG9yTW9kZSA9IHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpO1xuXG4gICAgLy8gV2hlbiByZW5kZXJpbmcgdG8gdGV4dHVyZSwgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgc29ydGVkOiBwcmltYXJ5IGJ5XG4gICAgLy8gcHJveHkgaWQgYW5kIHNlY29uZGFyeSBzb3J0IGlzIGJ5IFouXG4gICAgY29uc3QgcmVuZGVyaW5nVG9UZXh0dXJlID0gcGFpbnRlci50ZXJyYWluICYmIHBhaW50ZXIudGVycmFpbi5yZW5kZXJpbmdUb1RleHR1cmU7XG5cbiAgICBjb25zdCBbc3RlbmNpbE1vZGVzLCBjb29yZHNdID0gc291cmNlIGluc3RhbmNlb2YgSW1hZ2VTb3VyY2UgfHwgcmVuZGVyaW5nVG9UZXh0dXJlID8gW3t9LCB0aWxlSURzXSA6XG4gICAgICAgIHBhaW50ZXIuc3RlbmNpbENvbmZpZ0Zvck92ZXJsYXAodGlsZUlEcyk7XG5cbiAgICBjb25zdCBtaW5UaWxlWiA9IGNvb3Jkc1tjb29yZHMubGVuZ3RoIC0gMV0ub3ZlcnNjYWxlZFo7XG5cbiAgICBjb25zdCBhbGlnbiA9ICFwYWludGVyLm9wdGlvbnMubW92aW5nO1xuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIC8vIFNldCB0aGUgbG93ZXIgem9vbSBsZXZlbCB0byBzdWJsYXllciAwLCBhbmQgaGlnaGVyIHpvb20gbGV2ZWxzIHRvIGhpZ2hlciBzdWJsYXllcnNcbiAgICAgICAgLy8gVXNlIGdsLkxFU1MgdG8gcHJldmVudCBkb3VibGUgZHJhd2luZyBpbiBhcmVhcyB3aGVyZSB0aWxlcyBvdmVybGFwLlxuICAgICAgICBjb25zdCBkZXB0aE1vZGUgPSByZW5kZXJpbmdUb1RleHR1cmUgPyBEZXB0aE1vZGUuZGlzYWJsZWQgOiBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKGNvb3JkLm92ZXJzY2FsZWRaIC0gbWluVGlsZVosXG4gICAgICAgICAgICBsYXllci5wYWludC5nZXQoJ3Jhc3Rlci1vcGFjaXR5JykgPT09IDEgPyBEZXB0aE1vZGUuUmVhZFdyaXRlIDogRGVwdGhNb2RlLlJlYWRPbmx5LCBnbC5MRVNTKTtcblxuICAgICAgICBjb25zdCB1bndyYXBwZWRUaWxlSUQgPSBjb29yZC50b1Vud3JhcHBlZCgpO1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGlmIChyZW5kZXJpbmdUb1RleHR1cmUgJiYgISh0aWxlICYmIHRpbGUuaGFzRGF0YSgpKSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgcHJvak1hdHJpeCA9IChyZW5kZXJpbmdUb1RleHR1cmUpID8gY29vcmQucHJvak1hdHJpeCA6XG4gICAgICAgICAgICBwYWludGVyLnRyYW5zZm9ybS5jYWxjdWxhdGVQcm9qTWF0cml4KHVud3JhcHBlZFRpbGVJRCwgYWxpZ24pO1xuXG4gICAgICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gcGFpbnRlci50ZXJyYWluICYmIHJlbmRlcmluZ1RvVGV4dHVyZSA/XG4gICAgICAgICAgICBwYWludGVyLnRlcnJhaW4uc3RlbmNpbE1vZGVGb3JSVFRPdmVybGFwKGNvb3JkKSA6XG4gICAgICAgICAgICBzdGVuY2lsTW9kZXNbY29vcmQub3ZlcnNjYWxlZFpdO1xuXG4gICAgICAgIGNvbnN0IHJhc3RlckZhZGVEdXJhdGlvbiA9IGlzSW5pdGlhbExvYWQgPyAwIDogbGF5ZXIucGFpbnQuZ2V0KCdyYXN0ZXItZmFkZS1kdXJhdGlvbicpO1xuICAgICAgICB0aWxlLnJlZ2lzdGVyRmFkZUR1cmF0aW9uKHJhc3RlckZhZGVEdXJhdGlvbik7XG5cbiAgICAgICAgY29uc3QgcGFyZW50VGlsZSA9IHNvdXJjZUNhY2hlLmZpbmRMb2FkZWRQYXJlbnQoY29vcmQsIDApO1xuICAgICAgICBjb25zdCBmYWRlID0gcmFzdGVyRmFkZSh0aWxlLCBwYXJlbnRUaWxlLCBzb3VyY2VDYWNoZSwgcGFpbnRlci50cmFuc2Zvcm0sIHJhc3RlckZhZGVEdXJhdGlvbik7XG4gICAgICAgIGlmIChwYWludGVyLnRlcnJhaW4pIHBhaW50ZXIudGVycmFpbi5wcmVwYXJlRHJhd1RpbGUoKTtcblxuICAgICAgICBsZXQgcGFyZW50U2NhbGVCeSwgcGFyZW50VEw7XG5cbiAgICAgICAgY29uc3QgdGV4dHVyZUZpbHRlciA9IGxheWVyLnBhaW50LmdldCgncmFzdGVyLXJlc2FtcGxpbmcnKSA9PT0gJ25lYXJlc3QnID8gIGdsLk5FQVJFU1QgOiBnbC5MSU5FQVI7XG5cbiAgICAgICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgICAgIHRpbGUudGV4dHVyZS5iaW5kKHRleHR1cmVGaWx0ZXIsIGdsLkNMQU1QX1RPX0VER0UpO1xuXG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTEpO1xuXG4gICAgICAgIGlmIChwYXJlbnRUaWxlKSB7XG4gICAgICAgICAgICBwYXJlbnRUaWxlLnRleHR1cmUuYmluZCh0ZXh0dXJlRmlsdGVyLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIHBhcmVudFNjYWxlQnkgPSBNYXRoLnBvdygyLCBwYXJlbnRUaWxlLnRpbGVJRC5vdmVyc2NhbGVkWiAtIHRpbGUudGlsZUlELm92ZXJzY2FsZWRaKTtcbiAgICAgICAgICAgIHBhcmVudFRMID0gW3RpbGUudGlsZUlELmNhbm9uaWNhbC54ICogcGFyZW50U2NhbGVCeSAlIDEsIHRpbGUudGlsZUlELmNhbm9uaWNhbC55ICogcGFyZW50U2NhbGVCeSAlIDFdO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxlLnRleHR1cmUuYmluZCh0ZXh0dXJlRmlsdGVyLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBlcnNwZWN0aXZlVHJhbnNmb3JtID0gc291cmNlIGluc3RhbmNlb2YgSW1hZ2VTb3VyY2UgPyBzb3VyY2UucGVyc3BlY3RpdmVUcmFuc2Zvcm0gOiBbMCwgMF07XG4gICAgICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSByYXN0ZXJVbmlmb3JtVmFsdWVzKHByb2pNYXRyaXgsIHBhcmVudFRMIHx8IFswLCAwXSwgcGFyZW50U2NhbGVCeSB8fCAxLCBmYWRlLCBsYXllciwgcGVyc3BlY3RpdmVUcmFuc2Zvcm0pO1xuXG4gICAgICAgIHBhaW50ZXIucHJlcGFyZURyYXdQcm9ncmFtKGNvbnRleHQsIHByb2dyYW0sIHVud3JhcHBlZFRpbGVJRCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEltYWdlU291cmNlKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlLmJvdW5kc0J1ZmZlciAmJiBzb3VyY2UuYm91bmRzU2VnbWVudHMpIHByb2dyYW0uZHJhdyhcbiAgICAgICAgICAgICAgICBjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsIGNvbG9yTW9kZSwgQ3VsbEZhY2VNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCBzb3VyY2UuYm91bmRzQnVmZmVyLFxuICAgICAgICAgICAgICAgIHBhaW50ZXIucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHNvdXJjZS5ib3VuZHNTZWdtZW50cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7dGlsZUJvdW5kc0J1ZmZlciwgdGlsZUJvdW5kc0luZGV4QnVmZmVyLCB0aWxlQm91bmRzU2VnbWVudHN9ID0gcGFpbnRlci5nZXRUaWxlQm91bmRzQnVmZmVycyh0aWxlKTtcblxuICAgICAgICAgICAgcHJvZ3JhbS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUywgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgdW5pZm9ybVZhbHVlcywgbGF5ZXIuaWQsIHRpbGVCb3VuZHNCdWZmZXIsXG4gICAgICAgICAgICAgICAgdGlsZUJvdW5kc0luZGV4QnVmZmVyLCB0aWxlQm91bmRzU2VnbWVudHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGFpbnRlci5yZXNldFN0ZW5jaWxDbGlwcGluZ01hc2tzKCk7XG59XG5cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IHtcbiAgICBiYWNrZ3JvdW5kVW5pZm9ybVZhbHVlcyxcbiAgICBiYWNrZ3JvdW5kUGF0dGVyblVuaWZvcm1WYWx1ZXNcbn0gZnJvbSAnLi9wcm9ncmFtL2JhY2tncm91bmRfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge092ZXJzY2FsZWRUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBCYWNrZ3JvdW5kU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci9iYWNrZ3JvdW5kX3N0eWxlX2xheWVyLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0JhY2tncm91bmQ7XG5cbmZ1bmN0aW9uIGRyYXdCYWNrZ3JvdW5kKHBhaW50ZXI6IFBhaW50ZXIsIHNvdXJjZUNhY2hlOiBTb3VyY2VDYWNoZSwgbGF5ZXI6IEJhY2tncm91bmRTdHlsZUxheWVyLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgY29uc3QgY29sb3IgPSBsYXllci5wYWludC5nZXQoJ2JhY2tncm91bmQtY29sb3InKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdiYWNrZ3JvdW5kLW9wYWNpdHknKTtcblxuICAgIGlmIChvcGFjaXR5ID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCB0aWxlU2l6ZSA9IHRyYW5zZm9ybS50aWxlU2l6ZTtcbiAgICBjb25zdCBpbWFnZSA9IGxheWVyLnBhaW50LmdldCgnYmFja2dyb3VuZC1wYXR0ZXJuJyk7XG4gICAgaWYgKHBhaW50ZXIuaXNQYXR0ZXJuTWlzc2luZyhpbWFnZSkpIHJldHVybjtcblxuICAgIGNvbnN0IHBhc3MgPSAoIWltYWdlICYmIGNvbG9yLmEgPT09IDEgJiYgb3BhY2l0eSA9PT0gMSAmJiBwYWludGVyLm9wYXF1ZVBhc3NFbmFibGVkRm9yTGF5ZXIoKSkgPyAnb3BhcXVlJyA6ICd0cmFuc2x1Y2VudCc7XG4gICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyAhPT0gcGFzcykgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBkZXB0aE1vZGUgPSBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIHBhc3MgPT09ICdvcGFxdWUnID8gRGVwdGhNb2RlLlJlYWRXcml0ZSA6IERlcHRoTW9kZS5SZWFkT25seSk7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG5cbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKGltYWdlID8gJ2JhY2tncm91bmRQYXR0ZXJuJyA6ICdiYWNrZ3JvdW5kJyk7XG5cbiAgICBsZXQgdGlsZUlEcyA9IGNvb3JkcztcbiAgICBsZXQgYmFja2dyb3VuZFRpbGVzO1xuICAgIGlmICghdGlsZUlEcykge1xuICAgICAgICBiYWNrZ3JvdW5kVGlsZXMgPSBwYWludGVyLmdldEJhY2tncm91bmRUaWxlcygpO1xuICAgICAgICB0aWxlSURzID0gT2JqZWN0LnZhbHVlcyhiYWNrZ3JvdW5kVGlsZXMpLm1hcCh0aWxlID0+ICh0aWxlOiBhbnkpLnRpbGVJRCk7XG4gICAgfVxuXG4gICAgaWYgKGltYWdlKSB7XG4gICAgICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgICAgICBwYWludGVyLmltYWdlTWFuYWdlci5iaW5kKHBhaW50ZXIuY29udGV4dCk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Jvc3NmYWRlID0gbGF5ZXIuZ2V0Q3Jvc3NmYWRlUGFyYW1ldGVycygpO1xuICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIHRpbGVJRHMpIHtcbiAgICAgICAgY29uc3QgdW53cmFwcGVkVGlsZUlEID0gdGlsZUlELnRvVW53cmFwcGVkKCk7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IGNvb3JkcyA/IHRpbGVJRC5wcm9qTWF0cml4IDogcGFpbnRlci50cmFuc2Zvcm0uY2FsY3VsYXRlUHJvak1hdHJpeCh1bndyYXBwZWRUaWxlSUQpO1xuICAgICAgICBwYWludGVyLnByZXBhcmVEcmF3VGlsZSgpO1xuXG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZSA/IHNvdXJjZUNhY2hlLmdldFRpbGUodGlsZUlEKSA6XG4gICAgICAgICAgICBiYWNrZ3JvdW5kVGlsZXMgPyBiYWNrZ3JvdW5kVGlsZXNbdGlsZUlELmtleV0gOiBuZXcgVGlsZSh0aWxlSUQsIHRpbGVTaXplLCB0cmFuc2Zvcm0uem9vbSwgcGFpbnRlcik7XG5cbiAgICAgICAgY29uc3QgdW5pZm9ybVZhbHVlcyA9IGltYWdlID9cbiAgICAgICAgICAgIGJhY2tncm91bmRQYXR0ZXJuVW5pZm9ybVZhbHVlcyhtYXRyaXgsIG9wYWNpdHksIHBhaW50ZXIsIGltYWdlLCB7dGlsZUlELCB0aWxlU2l6ZX0sIGNyb3NzZmFkZSkgOlxuICAgICAgICAgICAgYmFja2dyb3VuZFVuaWZvcm1WYWx1ZXMobWF0cml4LCBvcGFjaXR5LCBjb2xvcik7XG5cbiAgICAgICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSwgdW53cmFwcGVkVGlsZUlEKTtcblxuICAgICAgICBjb25zdCB7dGlsZUJvdW5kc0J1ZmZlciwgdGlsZUJvdW5kc0luZGV4QnVmZmVyLCB0aWxlQm91bmRzU2VnbWVudHN9ID0gcGFpbnRlci5nZXRUaWxlQm91bmRzQnVmZmVycyh0aWxlKTtcblxuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXMsIGxheWVyLmlkLCB0aWxlQm91bmRzQnVmZmVyLFxuICAgICAgICAgICAgICAgIHRpbGVCb3VuZHNJbmRleEJ1ZmZlciwgdGlsZUJvdW5kc1NlZ21lbnRzKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgRGVwdGhNb2RlIGZyb20gJy4uL2dsL2RlcHRoX21vZGUuanMnO1xuaW1wb3J0IFN0ZW5jaWxNb2RlIGZyb20gJy4uL2dsL3N0ZW5jaWxfbW9kZS5qcyc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlLmpzJztcbmltcG9ydCB7ZGVidWdVbmlmb3JtVmFsdWVzfSBmcm9tICcuL3Byb2dyYW0vZGVidWdfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZS5qcyc7XG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuXG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSBTb3VyY2VDYWNoZSBmcm9tICcuLi9zb3VyY2Uvc291cmNlX2NhY2hlLmpzJztcbmltcG9ydCB0eXBlIHtPdmVyc2NhbGVkVGlsZUlEfSBmcm9tICcuLi9zb3VyY2UvdGlsZV9pZC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdEZWJ1ZztcblxuY29uc3QgdG9wQ29sb3IgPSBuZXcgQ29sb3IoMSwgMCwgMCwgMSk7XG5jb25zdCBidG1Db2xvciA9IG5ldyBDb2xvcigwLCAxLCAwLCAxKTtcbmNvbnN0IGxlZnRDb2xvciA9IG5ldyBDb2xvcigwLCAwLCAxLCAxKTtcbmNvbnN0IHJpZ2h0Q29sb3IgPSBuZXcgQ29sb3IoMSwgMCwgMSwgMSk7XG5jb25zdCBjZW50ZXJDb2xvciA9IG5ldyBDb2xvcigwLCAxLCAxLCAxKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdEZWJ1Z1BhZGRpbmcocGFpbnRlcjogUGFpbnRlcikge1xuICAgIGNvbnN0IHBhZGRpbmcgPSBwYWludGVyLnRyYW5zZm9ybS5wYWRkaW5nO1xuICAgIGNvbnN0IGxpbmVXaWR0aCA9IDM7XG4gICAgLy8gVG9wXG4gICAgZHJhd0hvcml6b250YWxMaW5lKHBhaW50ZXIsIHBhaW50ZXIudHJhbnNmb3JtLmhlaWdodCAtIChwYWRkaW5nLnRvcCB8fCAwKSwgbGluZVdpZHRoLCB0b3BDb2xvcik7XG4gICAgLy8gQm90dG9tXG4gICAgZHJhd0hvcml6b250YWxMaW5lKHBhaW50ZXIsIHBhZGRpbmcuYm90dG9tIHx8IDAsIGxpbmVXaWR0aCwgYnRtQ29sb3IpO1xuICAgIC8vIExlZnRcbiAgICBkcmF3VmVydGljYWxMaW5lKHBhaW50ZXIsIHBhZGRpbmcubGVmdCB8fCAwLCBsaW5lV2lkdGgsIGxlZnRDb2xvcik7XG4gICAgLy8gUmlnaHRcbiAgICBkcmF3VmVydGljYWxMaW5lKHBhaW50ZXIsIHBhaW50ZXIudHJhbnNmb3JtLndpZHRoIC0gKHBhZGRpbmcucmlnaHQgfHwgMCksIGxpbmVXaWR0aCwgcmlnaHRDb2xvcik7XG4gICAgLy8gQ2VudGVyXG4gICAgY29uc3QgY2VudGVyID0gcGFpbnRlci50cmFuc2Zvcm0uY2VudGVyUG9pbnQ7XG4gICAgZHJhd0Nyb3NzaGFpcihwYWludGVyLCBjZW50ZXIueCwgcGFpbnRlci50cmFuc2Zvcm0uaGVpZ2h0IC0gY2VudGVyLnksIGNlbnRlckNvbG9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdEZWJ1Z1F1ZXJ5R2VvbWV0cnkocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBjb29yZHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZHJhd1RpbGVRdWVyeUdlb21ldHJ5KHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBjb29yZHNbaV0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd0Nyb3NzaGFpcihwYWludGVyOiBQYWludGVyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgY29sb3I6IENvbG9yKSB7XG4gICAgY29uc3Qgc2l6ZSA9IDIwO1xuICAgIGNvbnN0IGxpbmVXaWR0aCA9IDI7XG4gICAgLy9WZXJ0aWNhbCBsaW5lXG4gICAgZHJhd0RlYnVnU1NSZWN0KHBhaW50ZXIsIHggLSBsaW5lV2lkdGggLyAyLCB5IC0gc2l6ZSAvIDIsIGxpbmVXaWR0aCwgc2l6ZSwgY29sb3IpO1xuICAgIC8vSG9yaXpvbnRhbCBsaW5lXG4gICAgZHJhd0RlYnVnU1NSZWN0KHBhaW50ZXIsIHggLSBzaXplIC8gMiwgeSAtIGxpbmVXaWR0aCAvIDIsIHNpemUsIGxpbmVXaWR0aCwgY29sb3IpO1xufVxuXG5mdW5jdGlvbiBkcmF3SG9yaXpvbnRhbExpbmUocGFpbnRlcjogUGFpbnRlciwgeTogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlciwgY29sb3I6IENvbG9yKSB7XG4gICAgZHJhd0RlYnVnU1NSZWN0KHBhaW50ZXIsIDAsIHkgICsgbGluZVdpZHRoIC8gMiwgcGFpbnRlci50cmFuc2Zvcm0ud2lkdGgsICBsaW5lV2lkdGgsIGNvbG9yKTtcbn1cblxuZnVuY3Rpb24gZHJhd1ZlcnRpY2FsTGluZShwYWludGVyOiBQYWludGVyLCB4OiBudW1iZXIsIGxpbmVXaWR0aDogbnVtYmVyLCBjb2xvcjogQ29sb3IpIHtcbiAgICBkcmF3RGVidWdTU1JlY3QocGFpbnRlciwgeCAtIGxpbmVXaWR0aCAvIDIsIDAsIGxpbmVXaWR0aCwgIHBhaW50ZXIudHJhbnNmb3JtLmhlaWdodCwgY29sb3IpO1xufVxuXG5mdW5jdGlvbiBkcmF3RGVidWdTU1JlY3QocGFpbnRlcjogUGFpbnRlciwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBjb2xvcjogQ29sb3IpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgIGdsLmVuYWJsZShnbC5TQ0lTU09SX1RFU1QpO1xuICAgIGdsLnNjaXNzb3IoeCAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbywgeSAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbywgd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW8sIGhlaWdodCAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgY29udGV4dC5jbGVhcih7Y29sb3J9KTtcbiAgICBnbC5kaXNhYmxlKGdsLlNDSVNTT1JfVEVTVCk7XG59XG5cbmZ1bmN0aW9uIGRyYXdEZWJ1ZyhwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZTogU291cmNlQ2FjaGUsIGNvb3JkczogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBkcmF3RGVidWdUaWxlKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBjb29yZHNbaV0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd1RpbGVRdWVyeUdlb21ldHJ5KHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBjb29yZDogT3ZlcnNjYWxlZFRpbGVJRCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgY29uc3QgcG9zTWF0cml4ID0gY29vcmQucHJvak1hdHJpeDtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdkZWJ1ZycpO1xuICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlQnlJRChjb29yZC5rZXkpO1xuICAgIGlmIChwYWludGVyLnRlcnJhaW4pIHBhaW50ZXIudGVycmFpbi5zZXR1cEVsZXZhdGlvbkRyYXcodGlsZSwgcHJvZ3JhbSk7XG5cbiAgICBjb25zdCBkZXB0aE1vZGUgPSBEZXB0aE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3Qgc3RlbmNpbE1vZGUgPSBTdGVuY2lsTW9kZS5kaXNhYmxlZDtcbiAgICBjb25zdCBjb2xvck1vZGUgPSBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKTtcbiAgICBjb25zdCBpZCA9ICckZGVidWcnO1xuXG4gICAgY29udGV4dC5hY3RpdmVUZXh0dXJlLnNldChnbC5URVhUVVJFMCk7XG4gICAgLy8gQmluZCB0aGUgZW1wdHkgdGV4dHVyZSBmb3IgZHJhd2luZyBvdXRsaW5lc1xuICAgIHBhaW50ZXIuZW1wdHlUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgIGNvbnN0IHF1ZXJ5Vml6ID0gdGlsZS5xdWVyeUdlb21ldHJ5RGVidWdWaXo7XG4gICAgY29uc3QgYm91bmRzVml6ID0gdGlsZS5xdWVyeUJvdW5kc0RlYnVnVml6O1xuXG4gICAgaWYgKHF1ZXJ5Vml6ICYmIHF1ZXJ5Vml6LnZlcnRpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcXVlcnlWaXoubGF6eVVwbG9hZChjb250ZXh0KTtcbiAgICAgICAgY29uc3QgdmVydGV4QnVmZmVyID0gcXVlcnlWaXoudmVydGV4QnVmZmVyO1xuICAgICAgICBjb25zdCBpbmRleEJ1ZmZlciA9IHF1ZXJ5Vml6LmluZGV4QnVmZmVyO1xuICAgICAgICBjb25zdCBzZWdtZW50cyA9IHF1ZXJ5Vml6LnNlZ21lbnRzO1xuICAgICAgICBpZiAodmVydGV4QnVmZmVyICE9IG51bGwgJiYgaW5kZXhCdWZmZXIgIT0gbnVsbCAmJiBzZWdtZW50cyAhPSBudWxsKSB7XG4gICAgICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuTElORV9TVFJJUCwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgZGVidWdVbmlmb3JtVmFsdWVzKHBvc01hdHJpeCwgcXVlcnlWaXouY29sb3IpLCBpZCxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIsIGluZGV4QnVmZmVyLCBzZWdtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYm91bmRzVml6ICYmIGJvdW5kc1Zpei52ZXJ0aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGJvdW5kc1Zpei5sYXp5VXBsb2FkKGNvbnRleHQpO1xuICAgICAgICBjb25zdCB2ZXJ0ZXhCdWZmZXIgPSBib3VuZHNWaXoudmVydGV4QnVmZmVyO1xuICAgICAgICBjb25zdCBpbmRleEJ1ZmZlciA9IGJvdW5kc1Zpei5pbmRleEJ1ZmZlcjtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBib3VuZHNWaXouc2VnbWVudHM7XG4gICAgICAgIGlmICh2ZXJ0ZXhCdWZmZXIgIT0gbnVsbCAmJiBpbmRleEJ1ZmZlciAhPSBudWxsICYmIHNlZ21lbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5MSU5FX1NUUklQLCBkZXB0aE1vZGUsIHN0ZW5jaWxNb2RlLCBjb2xvck1vZGUsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICBkZWJ1Z1VuaWZvcm1WYWx1ZXMocG9zTWF0cml4LCBib3VuZHNWaXouY29sb3IpLCBpZCxcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIsIGluZGV4QnVmZmVyLCBzZWdtZW50cyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdEZWJ1Z1RpbGUocGFpbnRlciwgc291cmNlQ2FjaGUsIGNvb3JkOiBPdmVyc2NhbGVkVGlsZUlEKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBnbCA9IGNvbnRleHQuZ2w7XG5cbiAgICBjb25zdCBpc0dsb2JlUHJvamVjdGlvbiA9IHBhaW50ZXIudHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJztcbiAgICBjb25zdCBkZWZpbmVzVmFsdWVzID0gaXNHbG9iZVByb2plY3Rpb24gPyBbJ1BST0pFQ1RJT05fR0xPQkVfVklFVyddIDogbnVsbDtcblxuICAgIGNvbnN0IHBvc01hdHJpeCA9IGNvb3JkLnByb2pNYXRyaXg7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnZGVidWcnLCBudWxsLCBkZWZpbmVzVmFsdWVzKTtcbiAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZUJ5SUQoY29vcmQua2V5KTtcbiAgICBpZiAocGFpbnRlci50ZXJyYWluKSBwYWludGVyLnRlcnJhaW4uc2V0dXBFbGV2YXRpb25EcmF3KHRpbGUsIHByb2dyYW0pO1xuXG4gICAgY29uc3QgZGVwdGhNb2RlID0gRGVwdGhNb2RlLmRpc2FibGVkO1xuICAgIGNvbnN0IHN0ZW5jaWxNb2RlID0gU3RlbmNpbE1vZGUuZGlzYWJsZWQ7XG4gICAgY29uc3QgY29sb3JNb2RlID0gcGFpbnRlci5jb2xvck1vZGVGb3JSZW5kZXJQYXNzKCk7XG4gICAgY29uc3QgaWQgPSAnJGRlYnVnJztcblxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgIC8vIEJpbmQgdGhlIGVtcHR5IHRleHR1cmUgZm9yIGRyYXdpbmcgb3V0bGluZXNcbiAgICBwYWludGVyLmVtcHR5VGV4dHVyZS5iaW5kKGdsLkxJTkVBUiwgZ2wuQ0xBTVBfVE9fRURHRSk7XG5cbiAgICBpZiAoaXNHbG9iZVByb2plY3Rpb24pIHtcbiAgICAgICAgdGlsZS5fbWFrZUdsb2JlVGlsZURlYnVnQnVmZmVycyhwYWludGVyLmNvbnRleHQsIHBhaW50ZXIudHJhbnNmb3JtLnByb2plY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRpbGUuX21ha2VEZWJ1Z1RpbGVCb3VuZHNCdWZmZXJzKHBhaW50ZXIuY29udGV4dCwgcGFpbnRlci50cmFuc2Zvcm0ucHJvamVjdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3QgZGVidWdCdWZmZXIgPSB0aWxlLl90aWxlRGVidWdCdWZmZXIgfHwgcGFpbnRlci5kZWJ1Z0J1ZmZlcjtcbiAgICBjb25zdCBkZWJ1Z0luZGV4QnVmZmVyID0gdGlsZS5fdGlsZURlYnVnSW5kZXhCdWZmZXIgfHwgcGFpbnRlci5kZWJ1Z0luZGV4QnVmZmVyO1xuICAgIGNvbnN0IGRlYnVnU2VnbWVudHMgPSB0aWxlLl90aWxlRGVidWdTZWdtZW50cyB8fCBwYWludGVyLmRlYnVnU2VnbWVudHM7XG5cbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuTElORV9TVFJJUCwgZGVwdGhNb2RlLCBzdGVuY2lsTW9kZSwgY29sb3JNb2RlLCBDdWxsRmFjZU1vZGUuZGlzYWJsZWQsXG4gICAgICAgIGRlYnVnVW5pZm9ybVZhbHVlcyhwb3NNYXRyaXgsIENvbG9yLnJlZCksIGlkLFxuICAgICAgICBkZWJ1Z0J1ZmZlciwgZGVidWdJbmRleEJ1ZmZlciwgZGVidWdTZWdtZW50cyxcbiAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgdGlsZS5fZ2xvYmVUaWxlRGVidWdCb3JkZXJCdWZmZXIpO1xuXG4gICAgY29uc3QgdGlsZVJhd0RhdGEgPSB0aWxlLmxhdGVzdFJhd1RpbGVEYXRhO1xuICAgIGNvbnN0IHRpbGVCeXRlTGVuZ3RoID0gKHRpbGVSYXdEYXRhICYmIHRpbGVSYXdEYXRhLmJ5dGVMZW5ndGgpIHx8IDA7XG4gICAgY29uc3QgdGlsZVNpemVLYiA9IE1hdGguZmxvb3IodGlsZUJ5dGVMZW5ndGggLyAxMDI0KTtcbiAgICBjb25zdCB0aWxlU2l6ZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpLnRpbGVTaXplO1xuICAgIGNvbnN0IHNjYWxlUmF0aW8gPSAoNTEyIC8gTWF0aC5taW4odGlsZVNpemUsIDUxMikgKiAoY29vcmQub3ZlcnNjYWxlZFogLyBwYWludGVyLnRyYW5zZm9ybS56b29tKSkgKiAwLjU7XG4gICAgbGV0IHRpbGVJZFRleHQgPSBjb29yZC5jYW5vbmljYWwudG9TdHJpbmcoKTtcbiAgICBpZiAoY29vcmQub3ZlcnNjYWxlZFogIT09IGNvb3JkLmNhbm9uaWNhbC56KSB7XG4gICAgICAgIHRpbGVJZFRleHQgKz0gYCA9PiAke2Nvb3JkLm92ZXJzY2FsZWRafWA7XG4gICAgfVxuICAgIGNvbnN0IHRpbGVMYWJlbCA9IGAke3RpbGVJZFRleHR9ICR7dGlsZVNpemVLYn1rYmA7XG4gICAgZHJhd1RleHRUb092ZXJsYXkocGFpbnRlciwgdGlsZUxhYmVsKTtcblxuICAgIGNvbnN0IGRlYnVnVGV4dEJ1ZmZlciA9IHRpbGUuX3RpbGVEZWJ1Z1RleHRCdWZmZXIgfHwgcGFpbnRlci5kZWJ1Z0J1ZmZlcjtcbiAgICBjb25zdCBkZWJ1Z1RleHRJbmRleEJ1ZmZlciA9IHRpbGUuX3RpbGVEZWJ1Z1RleHRJbmRleEJ1ZmZlciB8fCBwYWludGVyLnF1YWRUcmlhbmdsZUluZGV4QnVmZmVyO1xuICAgIGNvbnN0IGRlYnVnVGV4dFNlZ21lbnRzID0gdGlsZS5fdGlsZURlYnVnVGV4dFNlZ21lbnRzIHx8IHBhaW50ZXIuZGVidWdTZWdtZW50cztcblxuICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgc3RlbmNpbE1vZGUsIENvbG9yTW9kZS5hbHBoYUJsZW5kZWQsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgZGVidWdVbmlmb3JtVmFsdWVzKHBvc01hdHJpeCwgQ29sb3IudHJhbnNwYXJlbnQsIHNjYWxlUmF0aW8pLCBpZCxcbiAgICAgICAgZGVidWdUZXh0QnVmZmVyLCBkZWJ1Z1RleHRJbmRleEJ1ZmZlciwgZGVidWdUZXh0U2VnbWVudHMsXG4gICAgICAgIG51bGwsIG51bGwsIG51bGwsIHRpbGUuX2dsb2JlVGlsZURlYnVnVGV4dEJ1ZmZlcik7XG59XG5cbmZ1bmN0aW9uIGRyYXdUZXh0VG9PdmVybGF5KHBhaW50ZXI6IFBhaW50ZXIsIHRleHQ6IHN0cmluZykge1xuICAgIHBhaW50ZXIuaW5pdERlYnVnT3ZlcmxheUNhbnZhcygpO1xuICAgIGNvbnN0IGNhbnZhcyA9IHBhaW50ZXIuZGVidWdPdmVybGF5Q2FudmFzO1xuICAgIGNvbnN0IGdsID0gcGFpbnRlci5jb250ZXh0LmdsO1xuICAgIGNvbnN0IGN0eDJkID0gcGFpbnRlci5kZWJ1Z092ZXJsYXlDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjdHgyZC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIGN0eDJkLnNoYWRvd0NvbG9yID0gJ3doaXRlJztcbiAgICBjdHgyZC5zaGFkb3dCbHVyID0gMjtcbiAgICBjdHgyZC5saW5lV2lkdGggPSAxLjU7XG4gICAgY3R4MmQuc3Ryb2tlU3R5bGUgPSAnd2hpdGUnO1xuICAgIGN0eDJkLnRleHRCYXNlbGluZSA9ICd0b3AnO1xuICAgIGN0eDJkLmZvbnQgPSBgYm9sZCAkezM2fXB4IE9wZW4gU2Fucywgc2Fucy1zZXJpZmA7XG4gICAgY3R4MmQuZmlsbFRleHQodGV4dCwgNSwgNSk7XG4gICAgY3R4MmQuc3Ryb2tlVGV4dCh0ZXh0LCA1LCA1KTtcblxuICAgIHBhaW50ZXIuZGVidWdPdmVybGF5VGV4dHVyZS51cGRhdGUoY2FudmFzKTtcbiAgICBwYWludGVyLmRlYnVnT3ZlcmxheVRleHR1cmUuYmluZChnbC5MSU5FQVIsIGdsLkNMQU1QX1RPX0VER0UpO1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IGRlZmF1bHQgZHJhd0N1c3RvbTtcblxuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IHt3YXJuT25jZX0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHR5cGUgUGFpbnRlciBmcm9tICcuL3BhaW50ZXIuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSBDdXN0b21TdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllci5qcyc7XG5cbmZ1bmN0aW9uIGRyYXdDdXN0b20ocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogQ3VzdG9tU3R5bGVMYXllcikge1xuXG4gICAgY29uc3QgY29udGV4dCA9IHBhaW50ZXIuY29udGV4dDtcbiAgICBjb25zdCBpbXBsZW1lbnRhdGlvbiA9IGxheWVyLmltcGxlbWVudGF0aW9uO1xuXG4gICAgaWYgKHBhaW50ZXIudHJhbnNmb3JtLnByb2plY3Rpb24udW5zdXBwb3J0ZWRMYXllcnMgJiYgcGFpbnRlci50cmFuc2Zvcm0ucHJvamVjdGlvbi51bnN1cHBvcnRlZExheWVycy5pbmNsdWRlcyhcImN1c3RvbVwiKSkge1xuICAgICAgICB3YXJuT25jZSgnQ3VzdG9tIGxheWVycyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgd2l0aCBub24tbWVyY2F0b3IgcHJvamVjdGlvbnMuIFVzZSBtZXJjYXRvciB0byBlbmFibGUgY3VzdG9tIGxheWVycy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICdvZmZzY3JlZW4nKSB7XG5cbiAgICAgICAgY29uc3QgcHJlcmVuZGVyID0gaW1wbGVtZW50YXRpb24ucHJlcmVuZGVyO1xuICAgICAgICBpZiAocHJlcmVuZGVyKSB7XG4gICAgICAgICAgICBwYWludGVyLnNldEN1c3RvbUxheWVyRGVmYXVsdHMoKTtcbiAgICAgICAgICAgIGNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcblxuICAgICAgICAgICAgcHJlcmVuZGVyLmNhbGwoaW1wbGVtZW50YXRpb24sIGNvbnRleHQuZ2wsIHBhaW50ZXIudHJhbnNmb3JtLmN1c3RvbUxheWVyTWF0cml4KCkpO1xuXG4gICAgICAgICAgICBjb250ZXh0LnNldERpcnR5KCk7XG4gICAgICAgICAgICBwYWludGVyLnNldEJhc2VTdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ3RyYW5zbHVjZW50Jykge1xuXG4gICAgICAgIHBhaW50ZXIuc2V0Q3VzdG9tTGF5ZXJEZWZhdWx0cygpO1xuXG4gICAgICAgIGNvbnRleHQuc2V0Q29sb3JNb2RlKHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpKTtcbiAgICAgICAgY29udGV4dC5zZXRTdGVuY2lsTW9kZShTdGVuY2lsTW9kZS5kaXNhYmxlZCk7XG5cbiAgICAgICAgY29uc3QgZGVwdGhNb2RlID0gaW1wbGVtZW50YXRpb24ucmVuZGVyaW5nTW9kZSA9PT0gJzNkJyA/XG4gICAgICAgICAgICBuZXcgRGVwdGhNb2RlKHBhaW50ZXIuY29udGV4dC5nbC5MRVFVQUwsIERlcHRoTW9kZS5SZWFkV3JpdGUsIHBhaW50ZXIuZGVwdGhSYW5nZUZvcjNEKSA6XG4gICAgICAgICAgICBwYWludGVyLmRlcHRoTW9kZUZvclN1YmxheWVyKDAsIERlcHRoTW9kZS5SZWFkT25seSk7XG5cbiAgICAgICAgY29udGV4dC5zZXREZXB0aE1vZGUoZGVwdGhNb2RlKTtcblxuICAgICAgICBpbXBsZW1lbnRhdGlvbi5yZW5kZXIoY29udGV4dC5nbCwgcGFpbnRlci50cmFuc2Zvcm0uY3VzdG9tTGF5ZXJNYXRyaXgoKSk7XG5cbiAgICAgICAgY29udGV4dC5zZXREaXJ0eSgpO1xuICAgICAgICBwYWludGVyLnNldEJhc2VTdGF0ZSgpO1xuICAgICAgICBjb250ZXh0LmJpbmRGcmFtZWJ1ZmZlci5zZXQobnVsbCk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7Y3JlYXRlTGF5b3V0fSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmltcG9ydCB0eXBlIHtTdHJ1Y3RBcnJheUxheW91dH0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5leHBvcnQgY29uc3Qgc2t5Ym94QXR0cmlidXRlczogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHtuYW1lOiAnYV9wb3NfM2YnLCAgY29tcG9uZW50czogMywgdHlwZTogJ0Zsb2F0MzInfVxuXSk7XG5cbmV4cG9ydCBkZWZhdWx0IHNreWJveEF0dHJpYnV0ZXM7XG5leHBvcnQgY29uc3Qge21lbWJlcnMsIHNpemUsIGFsaWdubWVudH0gPSBza3lib3hBdHRyaWJ1dGVzO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHttZW1iZXJzIGFzIHNreWJveEF0dHJpYnV0ZXN9IGZyb20gJy4vc2t5Ym94X2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHtTa3lib3hWZXJ0ZXhBcnJheSwgVHJpYW5nbGVJbmRleEFycmF5fSBmcm9tICcuLi9kYXRhL2FycmF5X3R5cGVzLmpzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudC5qcyc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgVmVydGV4QnVmZmVyIGZyb20gJy4uL2dsL3ZlcnRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcblxuZnVuY3Rpb24gYWRkVmVydGV4KHZlcnRleEFycmF5LCB4LCB5LCB6KSB7XG4gICAgdmVydGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgIC8vIGFfcG9zXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHpcbiAgICApO1xufVxuXG5jbGFzcyBTa3lib3hHZW9tZXRyeSB7XG4gICAgdmVydGV4QXJyYXk6IFNreWJveFZlcnRleEFycmF5O1xuICAgIHZlcnRleEJ1ZmZlcjogVmVydGV4QnVmZmVyO1xuICAgIGluZGljZXM6IFRyaWFuZ2xlSW5kZXhBcnJheTtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgc2VnbWVudDogU2VnbWVudFZlY3RvcjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgICAgdGhpcy52ZXJ0ZXhBcnJheSA9IG5ldyBTa3lib3hWZXJ0ZXhBcnJheSgpO1xuICAgICAgICB0aGlzLmluZGljZXMgPSBuZXcgVHJpYW5nbGVJbmRleEFycmF5KCk7XG5cbiAgICAgICAgYWRkVmVydGV4KHRoaXMudmVydGV4QXJyYXksIC0xLjAsIC0xLjAsICAxLjApO1xuICAgICAgICBhZGRWZXJ0ZXgodGhpcy52ZXJ0ZXhBcnJheSwgIDEuMCwgLTEuMCwgIDEuMCk7XG4gICAgICAgIGFkZFZlcnRleCh0aGlzLnZlcnRleEFycmF5LCAtMS4wLCAgMS4wLCAgMS4wKTtcbiAgICAgICAgYWRkVmVydGV4KHRoaXMudmVydGV4QXJyYXksICAxLjAsICAxLjAsICAxLjApO1xuICAgICAgICBhZGRWZXJ0ZXgodGhpcy52ZXJ0ZXhBcnJheSwgLTEuMCwgLTEuMCwgLTEuMCk7XG4gICAgICAgIGFkZFZlcnRleCh0aGlzLnZlcnRleEFycmF5LCAgMS4wLCAtMS4wLCAtMS4wKTtcbiAgICAgICAgYWRkVmVydGV4KHRoaXMudmVydGV4QXJyYXksIC0xLjAsICAxLjAsIC0xLjApO1xuICAgICAgICBhZGRWZXJ0ZXgodGhpcy52ZXJ0ZXhBcnJheSwgIDEuMCwgIDEuMCwgLTEuMCk7XG5cbiAgICAgICAgLy8gK3hcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKDUsIDEsIDMpO1xuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soMywgNywgNSk7XG4gICAgICAgIC8vIC14XG4gICAgICAgIHRoaXMuaW5kaWNlcy5lbXBsYWNlQmFjayg2LCAyLCAwKTtcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKDAsIDQsIDYpO1xuICAgICAgICAvLyAreVxuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soMiwgNiwgNyk7XG4gICAgICAgIHRoaXMuaW5kaWNlcy5lbXBsYWNlQmFjayg3LCAzLCAyKTtcbiAgICAgICAgLy8gLXlcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKDUsIDQsIDApO1xuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soMCwgMSwgNSk7XG4gICAgICAgIC8vICt6XG4gICAgICAgIHRoaXMuaW5kaWNlcy5lbXBsYWNlQmFjaygwLCAyLCAzKTtcbiAgICAgICAgdGhpcy5pbmRpY2VzLmVtcGxhY2VCYWNrKDMsIDEsIDApO1xuICAgICAgICAvLyAtelxuICAgICAgICB0aGlzLmluZGljZXMuZW1wbGFjZUJhY2soNywgNiwgNCk7XG4gICAgICAgIHRoaXMuaW5kaWNlcy5lbXBsYWNlQmFjayg0LCA1LCA3KTtcblxuICAgICAgICB0aGlzLnZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRoaXMudmVydGV4QXJyYXksIHNreWJveEF0dHJpYnV0ZXMpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmluZGljZXMpO1xuXG4gICAgICAgIHRoaXMuc2VnbWVudCA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCAzNiwgMTIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2t5Ym94R2VvbWV0cnk7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgU3RlbmNpbE1vZGUgZnJvbSAnLi4vZ2wvc3RlbmNpbF9tb2RlLmpzJztcbmltcG9ydCBEZXB0aE1vZGUgZnJvbSAnLi4vZ2wvZGVwdGhfbW9kZS5qcyc7XG5pbXBvcnQgQ29sb3JNb2RlIGZyb20gJy4uL2dsL2NvbG9yX21vZGUuanMnO1xuaW1wb3J0IEN1bGxGYWNlTW9kZSBmcm9tICcuLi9nbC9jdWxsX2ZhY2VfbW9kZS5qcyc7XG5pbXBvcnQgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZS5qcyc7XG5pbXBvcnQgUHJvZ3JhbSBmcm9tICcuL3Byb2dyYW0uanMnO1xuaW1wb3J0IHtzbW9vdGhzdGVwfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHR5cGUgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQgU2t5Ym94R2VvbWV0cnkgZnJvbSAnLi9za3lib3hfZ2VvbWV0cnkuanMnO1xuaW1wb3J0IHtza3lib3hVbmlmb3JtVmFsdWVzLCBza3lib3hHcmFkaWVudFVuaWZvcm1WYWx1ZXN9IGZyb20gJy4vcHJvZ3JhbS9za3lib3hfcHJvZ3JhbS5qcyc7XG5pbXBvcnQge3NreWJveENhcHR1cmVVbmlmb3JtVmFsdWVzfSBmcm9tICcuL3Byb2dyYW0vc2t5Ym94X2NhcHR1cmVfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgU2t5TGF5ZXIgZnJvbSAnLi4vc3R5bGUvc3R5bGVfbGF5ZXIvc2t5X3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIFBhaW50ZXIgZnJvbSAnLi9wYWludGVyLmpzJztcbmltcG9ydCB7bWF0MywgbWF0NH0gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUge01hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbmV4cG9ydCBkZWZhdWx0IGRyYXdTa3k7XG5cbmNvbnN0IFRSQU5TSVRJT05fT1BBQ0lUWV9aT09NX1NUQVJUID0gNztcbmNvbnN0IFRSQU5TSVRJT05fT1BBQ0lUWV9aT09NX0VORCA9IDg7XG5cbmZ1bmN0aW9uIGRyYXdTa3kocGFpbnRlcjogUGFpbnRlciwgc291cmNlQ2FjaGU6IFNvdXJjZUNhY2hlLCBsYXllcjogU2t5TGF5ZXIpIHtcbiAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IGdsb2JlT3JNZXJjYXRvciA9ICh0ci5wcm9qZWN0aW9uLm5hbWUgPT09ICdtZXJjYXRvcicgfHwgdHIucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKTtcbiAgICAvLyBGb3Igbm9uLW1lcmNhdG9yIHByb2plY3Rpb24sIHVzZSBhIGZvcmNlZCBvcGFjaXR5IHRyYW5zaXRpb24uIFRoaXMgdHJhbnNpdGlvbiBpcyBzZXQgdG8gYmVcbiAgICAvLyAxLjAgYWZ0ZXIgdGhlIHNoZWVyIGFkanVzdG1lbnQgdXBwZXIgYm91bmQgd2hpY2ggZW5zdXJlcyB0byBiZSBpbiB0aGUgbWVyY2F0b3IgcHJvamVjdGlvbi5cbiAgICAvLyBOb3RlOiB3ZSBvbmx5IHJlbmRlciBza3kgZm9yIGdsb2JlIHByb2plY3Rpb24gZHVyaW5nIHRoZSB0cmFuc2l0aW9uIHRvIG1lcmNhdG9yLlxuICAgIGNvbnN0IHRyYW5zaXRpb25PcGFjaXR5ID0gZ2xvYmVPck1lcmNhdG9yID8gMS4wIDogc21vb3Roc3RlcChUUkFOU0lUSU9OX09QQUNJVFlfWk9PTV9TVEFSVCwgVFJBTlNJVElPTl9PUEFDSVRZX1pPT01fRU5ELCB0ci56b29tKTtcbiAgICBjb25zdCBvcGFjaXR5ID0gbGF5ZXIucGFpbnQuZ2V0KCdza3ktb3BhY2l0eScpICogdHJhbnNpdGlvbk9wYWNpdHk7XG4gICAgaWYgKG9wYWNpdHkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgdHlwZSA9IGxheWVyLnBhaW50LmdldCgnc2t5LXR5cGUnKTtcbiAgICBjb25zdCBkZXB0aE1vZGUgPSBuZXcgRGVwdGhNb2RlKGNvbnRleHQuZ2wuTEVRVUFMLCBEZXB0aE1vZGUuUmVhZE9ubHksIFswLCAxXSk7XG4gICAgY29uc3QgdGVtcG9yYWxPZmZzZXQgPSAocGFpbnRlci5mcmFtZUNvdW50ZXIgLyAxMDAwLjApICUgMTtcblxuICAgIGlmICh0eXBlID09PSAnYXRtb3NwaGVyZScpIHtcbiAgICAgICAgaWYgKHBhaW50ZXIucmVuZGVyUGFzcyA9PT0gJ29mZnNjcmVlbicpIHtcbiAgICAgICAgICAgIGlmIChsYXllci5uZWVkc1NreWJveENhcHR1cmUocGFpbnRlcikpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlU2t5Ym94KHBhaW50ZXIsIGxheWVyLCAzMiwgMzIpO1xuICAgICAgICAgICAgICAgIGxheWVyLm1hcmtTa3lib3hWYWxpZChwYWludGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICdza3knKSB7XG4gICAgICAgICAgICBkcmF3U2t5Ym94RnJvbUNhcHR1cmUocGFpbnRlciwgbGF5ZXIsIGRlcHRoTW9kZSwgb3BhY2l0eSwgdGVtcG9yYWxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZ3JhZGllbnQnKSB7XG4gICAgICAgIGlmIChwYWludGVyLnJlbmRlclBhc3MgPT09ICdza3knKSB7XG4gICAgICAgICAgICBkcmF3U2t5Ym94R3JhZGllbnQocGFpbnRlciwgbGF5ZXIsIGRlcHRoTW9kZSwgb3BhY2l0eSwgdGVtcG9yYWxPZmZzZXQpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCBgJHt0eXBlfSBpcyB1bnN1cHBvcnRlZCBza3ktdHlwZWApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhd1NreWJveEdyYWRpZW50KHBhaW50ZXI6IFBhaW50ZXIsIGxheWVyOiBTa3lMYXllciwgZGVwdGhNb2RlOiBEZXB0aE1vZGUsIG9wYWNpdHk6IG51bWJlciwgdGVtcG9yYWxPZmZzZXQ6IG51bWJlcikge1xuICAgIGNvbnN0IGNvbnRleHQgPSBwYWludGVyLmNvbnRleHQ7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ3NreWJveEdyYWRpZW50Jyk7XG5cbiAgICAvLyBMYXppbHkgaW5pdGlhbGl6ZSBnZW9tZXRyeSBhbmQgdGV4dHVyZSBpZiB0aGV5IGhhdmVudCBiZWVuIGNyZWF0ZWQgeWV0LlxuICAgIGlmICghbGF5ZXIuc2t5Ym94R2VvbWV0cnkpIHtcbiAgICAgICAgbGF5ZXIuc2t5Ym94R2VvbWV0cnkgPSBuZXcgU2t5Ym94R2VvbWV0cnkoY29udGV4dCk7XG4gICAgfVxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuICAgIGxldCBjb2xvclJhbXBUZXh0dXJlID0gbGF5ZXIuY29sb3JSYW1wVGV4dHVyZTtcbiAgICBpZiAoIWNvbG9yUmFtcFRleHR1cmUpIHtcbiAgICAgICAgY29sb3JSYW1wVGV4dHVyZSA9IGxheWVyLmNvbG9yUmFtcFRleHR1cmUgPSBuZXcgVGV4dHVyZShjb250ZXh0LCBsYXllci5jb2xvclJhbXAsIGdsLlJHQkEpO1xuICAgIH1cbiAgICBjb2xvclJhbXBUZXh0dXJlLmJpbmQoZ2wuTElORUFSLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gc2t5Ym94R3JhZGllbnRVbmlmb3JtVmFsdWVzKFxuICAgICAgICB0cmFuc2Zvcm0uc2t5Ym94TWF0cml4LFxuICAgICAgICBsYXllci5nZXRDZW50ZXIocGFpbnRlciwgZmFsc2UpLFxuICAgICAgICBsYXllci5wYWludC5nZXQoJ3NreS1ncmFkaWVudC1yYWRpdXMnKSxcbiAgICAgICAgb3BhY2l0eSxcbiAgICAgICAgdGVtcG9yYWxPZmZzZXRcbiAgICApO1xuXG4gICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSk7XG5cbiAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIFN0ZW5jaWxNb2RlLmRpc2FibGVkLFxuICAgICAgICBwYWludGVyLmNvbG9yTW9kZUZvclJlbmRlclBhc3MoKSwgQ3VsbEZhY2VNb2RlLmJhY2tDVyxcbiAgICAgICAgdW5pZm9ybVZhbHVlcywgJ3NreWJveEdyYWRpZW50JywgbGF5ZXIuc2t5Ym94R2VvbWV0cnkudmVydGV4QnVmZmVyLFxuICAgICAgICBsYXllci5za3lib3hHZW9tZXRyeS5pbmRleEJ1ZmZlciwgbGF5ZXIuc2t5Ym94R2VvbWV0cnkuc2VnbWVudCk7XG59XG5cbmZ1bmN0aW9uIGRyYXdTa3lib3hGcm9tQ2FwdHVyZShwYWludGVyOiBQYWludGVyLCBsYXllcjogU2t5TGF5ZXIsIGRlcHRoTW9kZTogRGVwdGhNb2RlLCBvcGFjaXR5OiBudW1iZXIsIHRlbXBvcmFsT2Zmc2V0OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdza3lib3gnKTtcblxuICAgIGNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXQoZ2wuVEVYVFVSRTApO1xuXG4gICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV9DVUJFX01BUCwgbGF5ZXIuc2t5Ym94VGV4dHVyZSk7XG5cbiAgICBjb25zdCB1bmlmb3JtVmFsdWVzID0gc2t5Ym94VW5pZm9ybVZhbHVlcyh0cmFuc2Zvcm0uc2t5Ym94TWF0cml4LCBsYXllci5nZXRDZW50ZXIocGFpbnRlciwgZmFsc2UpLCAwLCBvcGFjaXR5LCB0ZW1wb3JhbE9mZnNldCk7XG5cbiAgICBwYWludGVyLnByZXBhcmVEcmF3UHJvZ3JhbShjb250ZXh0LCBwcm9ncmFtKTtcblxuICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIGRlcHRoTW9kZSwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsXG4gICAgICAgIHBhaW50ZXIuY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpLCBDdWxsRmFjZU1vZGUuYmFja0NXLFxuICAgICAgICB1bmlmb3JtVmFsdWVzLCAnc2t5Ym94JywgbGF5ZXIuc2t5Ym94R2VvbWV0cnkudmVydGV4QnVmZmVyLFxuICAgICAgICBsYXllci5za3lib3hHZW9tZXRyeS5pbmRleEJ1ZmZlciwgbGF5ZXIuc2t5Ym94R2VvbWV0cnkuc2VnbWVudCk7XG59XG5cbmZ1bmN0aW9uIGRyYXdTa3lib3hGYWNlKGNvbnRleHQ6IENvbnRleHQsIGxheWVyOiBTa3lMYXllciwgcHJvZ3JhbTogUHJvZ3JhbTxhbnk+LCBmYWNlUm90YXRlOiBNYXQ0LCBzdW5EaXJlY3Rpb246IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgaTogbnVtYmVyKSB7XG4gICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgY29uc3QgYXRtb3NwaGVyZUNvbG9yID0gbGF5ZXIucGFpbnQuZ2V0KCdza3ktYXRtb3NwaGVyZS1jb2xvcicpO1xuICAgIGNvbnN0IGF0bW9zcGhlcmVIYWxvQ29sb3IgPSBsYXllci5wYWludC5nZXQoJ3NreS1hdG1vc3BoZXJlLWhhbG8tY29sb3InKTtcbiAgICBjb25zdCBzdW5JbnRlbnNpdHkgPSBsYXllci5wYWludC5nZXQoJ3NreS1hdG1vc3BoZXJlLXN1bi1pbnRlbnNpdHknKTtcblxuICAgIGNvbnN0IHVuaWZvcm1WYWx1ZXMgPSBza3lib3hDYXB0dXJlVW5pZm9ybVZhbHVlcyhcbiAgICAgICAgbWF0My5mcm9tTWF0NChtYXQzLmNyZWF0ZSgpLCBmYWNlUm90YXRlKSxcbiAgICAgICAgc3VuRGlyZWN0aW9uLFxuICAgICAgICBzdW5JbnRlbnNpdHksXG4gICAgICAgIGF0bW9zcGhlcmVDb2xvcixcbiAgICAgICAgYXRtb3NwaGVyZUhhbG9Db2xvcik7XG5cbiAgICBjb25zdCBnbEZhY2UgPSBnbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpO1xuICAgIGdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2xGYWNlLCBsYXllci5za3lib3hUZXh0dXJlLCAwKTtcblxuICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIERlcHRoTW9kZS5kaXNhYmxlZCwgU3RlbmNpbE1vZGUuZGlzYWJsZWQsIENvbG9yTW9kZS51bmJsZW5kZWQsIEN1bGxGYWNlTW9kZS5mcm9udENXLFxuICAgICAgICB1bmlmb3JtVmFsdWVzLCAnc2t5Ym94Q2FwdHVyZScsIGxheWVyLnNreWJveEdlb21ldHJ5LnZlcnRleEJ1ZmZlcixcbiAgICAgICAgbGF5ZXIuc2t5Ym94R2VvbWV0cnkuaW5kZXhCdWZmZXIsIGxheWVyLnNreWJveEdlb21ldHJ5LnNlZ21lbnQpO1xufVxuXG5mdW5jdGlvbiBjYXB0dXJlU2t5Ym94KHBhaW50ZXI6IFBhaW50ZXIsIGxheWVyOiBTa3lMYXllciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBsZXQgZmJvID0gbGF5ZXIuc2t5Ym94RmJvO1xuXG4gICAgLy8gVXNpbmcgYWJzZW5jZSBvZiBmYm8gYXMgYSBzaWduYWwgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24gb2YgYWxsIHJlc291cmNlcywgY2FjaGUgcmVzb3VyY2VzIGluIGxheWVyIG9iamVjdFxuICAgIGlmICghZmJvKSB7XG4gICAgICAgIGZibyA9IGxheWVyLnNreWJveEZibyA9IGNvbnRleHQuY3JlYXRlRnJhbWVidWZmZXIod2lkdGgsIGhlaWdodCwgZmFsc2UpO1xuICAgICAgICBsYXllci5za3lib3hHZW9tZXRyeSA9IG5ldyBTa3lib3hHZW9tZXRyeShjb250ZXh0KTtcbiAgICAgICAgbGF5ZXIuc2t5Ym94VGV4dHVyZSA9IGNvbnRleHQuZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGxheWVyLnNreWJveFRleHR1cmUpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFX0NVQkVfTUFQLCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV9DVUJFX01BUCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfQ1VCRV9NQVAsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgZ2xGYWNlID0gZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaTtcblxuICAgICAgICAgICAgLy8gVGhlIGZvcm1hdCBoZXJlIGNvdWxkIGJlIFJHQiwgYnV0IHJlbmRlciB0ZXN0cyBhcmUgbm90IGhhcHB5IHdpdGggcmVuZGVyaW5nIHRvIHN1Y2ggYSBmb3JtYXRcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2xGYWNlLCAwLCBnbC5SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldChmYm8uZnJhbWVidWZmZXIpO1xuICAgIGNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCB3aWR0aCwgaGVpZ2h0XSk7XG5cbiAgICBjb25zdCBzdW5EaXJlY3Rpb24gPSBsYXllci5nZXRDZW50ZXIocGFpbnRlciwgdHJ1ZSk7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgnc2t5Ym94Q2FwdHVyZScpO1xuICAgIGNvbnN0IGZhY2VSb3RhdGUgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcblxuICAgIC8vICt4O1xuICAgIG1hdDQuaWRlbnRpdHkoZmFjZVJvdGF0ZSk7XG4gICAgbWF0NC5yb3RhdGVZKGZhY2VSb3RhdGUsIGZhY2VSb3RhdGUsIC1NYXRoLlBJICogMC41KTtcbiAgICBkcmF3U2t5Ym94RmFjZShjb250ZXh0LCBsYXllciwgcHJvZ3JhbSwgZmFjZVJvdGF0ZSwgc3VuRGlyZWN0aW9uLCAwKTtcbiAgICAvLyAteFxuICAgIG1hdDQuaWRlbnRpdHkoZmFjZVJvdGF0ZSk7XG4gICAgbWF0NC5yb3RhdGVZKGZhY2VSb3RhdGUsIGZhY2VSb3RhdGUsIE1hdGguUEkgKiAwLjUpO1xuICAgIGRyYXdTa3lib3hGYWNlKGNvbnRleHQsIGxheWVyLCBwcm9ncmFtLCBmYWNlUm90YXRlLCBzdW5EaXJlY3Rpb24sIDEpO1xuICAgIC8vICt5XG4gICAgbWF0NC5pZGVudGl0eShmYWNlUm90YXRlKTtcbiAgICBtYXQ0LnJvdGF0ZVgoZmFjZVJvdGF0ZSwgZmFjZVJvdGF0ZSwgLU1hdGguUEkgKiAwLjUpO1xuICAgIGRyYXdTa3lib3hGYWNlKGNvbnRleHQsIGxheWVyLCBwcm9ncmFtLCBmYWNlUm90YXRlLCBzdW5EaXJlY3Rpb24sIDIpO1xuICAgIC8vIC15XG4gICAgbWF0NC5pZGVudGl0eShmYWNlUm90YXRlKTtcbiAgICBtYXQ0LnJvdGF0ZVgoZmFjZVJvdGF0ZSwgZmFjZVJvdGF0ZSwgTWF0aC5QSSAqIDAuNSk7XG4gICAgZHJhd1NreWJveEZhY2UoY29udGV4dCwgbGF5ZXIsIHByb2dyYW0sIGZhY2VSb3RhdGUsIHN1bkRpcmVjdGlvbiwgMyk7XG4gICAgLy8gK3pcbiAgICBtYXQ0LmlkZW50aXR5KGZhY2VSb3RhdGUpO1xuICAgIGRyYXdTa3lib3hGYWNlKGNvbnRleHQsIGxheWVyLCBwcm9ncmFtLCBmYWNlUm90YXRlLCBzdW5EaXJlY3Rpb24sIDQpO1xuICAgIC8vIC16XG4gICAgbWF0NC5pZGVudGl0eShmYWNlUm90YXRlKTtcbiAgICBtYXQ0LnJvdGF0ZVkoZmFjZVJvdGF0ZSwgZmFjZVJvdGF0ZSwgTWF0aC5QSSk7XG4gICAgZHJhd1NreWJveEZhY2UoY29udGV4dCwgbGF5ZXIsIHByb2dyYW0sIGZhY2VSb3RhdGUsIHN1bkRpcmVjdGlvbiwgNSk7XG5cbiAgICBjb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgcGFpbnRlci53aWR0aCwgcGFpbnRlci5oZWlnaHRdKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBDb2xvck1vZGUgZnJvbSAnLi4vZ2wvY29sb3JfbW9kZS5qcyc7XG5pbXBvcnQgQ3VsbEZhY2VNb2RlIGZyb20gJy4uL2dsL2N1bGxfZmFjZV9tb2RlLmpzJztcbmltcG9ydCB7XG4gICAgZ2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbixcbiAgICBnbG9iZVVzZUN1c3RvbUFudGlBbGlhc2luZ1xufSBmcm9tICcuLy4uL2dlby9wcm9qZWN0aW9uL2dsb2JlX3V0aWwuanMnO1xuaW1wb3J0IHthdG1vc3BoZXJlVW5pZm9ybVZhbHVlc30gZnJvbSAnLi4vdGVycmFpbi9nbG9iZV9yYXN0ZXJfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgdHlwZSBQYWludGVyIGZyb20gJy4vcGFpbnRlci5qcyc7XG5pbXBvcnQgdHlwZSB7RHluYW1pY0RlZmluZXNUeXBlfSBmcm9tICcuLi9yZW5kZXIvcHJvZ3JhbS9wcm9ncmFtX3VuaWZvcm1zLmpzJztcbmltcG9ydCB7ZGVnVG9SYWQsIG1hcFZhbHVlfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHt2ZWMzLCBtYXQ0LCBxdWF0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IEZvZyBmcm9tICcuLi9zdHlsZS9mb2cuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBkcmF3QXRtb3NwaGVyZTtcblxuZnVuY3Rpb24gZHJhd0F0bW9zcGhlcmUocGFpbnRlcjogUGFpbnRlciwgZm9nOiBGb2cpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gcGFpbnRlci5jb250ZXh0O1xuICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcbiAgICBjb25zdCB0ciA9IHBhaW50ZXIudHJhbnNmb3JtO1xuICAgIGNvbnN0IGRlcHRoTW9kZSA9IG5ldyBEZXB0aE1vZGUoZ2wuTEVRVUFMLCBEZXB0aE1vZGUuUmVhZE9ubHksIFswLCAxXSk7XG4gICAgY29uc3QgZGVmaW5lcyA9IHRyLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJyA/IFsnUFJPSkVDVElPTl9HTE9CRV9WSUVXJywgJ0ZPRyddIDogWydGT0cnXTtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdnbG9iZUF0bW9zcGhlcmUnLCBudWxsLCAoKGRlZmluZXM6IGFueSk6IER5bmFtaWNEZWZpbmVzVHlwZVtdKSk7XG5cbiAgICBjb25zdCB0cmFuc2l0aW9uVCA9IGdsb2JlVG9NZXJjYXRvclRyYW5zaXRpb24odHIuem9vbSk7XG5cbiAgICBjb25zdCBmb2dDb2xvciA9IGZvZy5wcm9wZXJ0aWVzLmdldCgnY29sb3InKS50b0FycmF5MDEoKTtcbiAgICBjb25zdCBoaWdoQ29sb3IgPSBmb2cucHJvcGVydGllcy5nZXQoJ2hpZ2gtY29sb3InKS50b0FycmF5MDEoKTtcbiAgICBjb25zdCBzcGFjZUNvbG9yID0gZm9nLnByb3BlcnRpZXMuZ2V0KCdzcGFjZS1jb2xvcicpLnRvQXJyYXkwMVByZW11bHRpcGxpZWRBbHBoYSgpO1xuXG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSBxdWF0LmlkZW50aXR5KFtdKTtcblxuICAgIHF1YXQucm90YXRlWShvcmllbnRhdGlvbiwgb3JpZW50YXRpb24sIC1kZWdUb1JhZCh0ci5fY2VudGVyLmxuZykpO1xuICAgIHF1YXQucm90YXRlWChvcmllbnRhdGlvbiwgb3JpZW50YXRpb24sIGRlZ1RvUmFkKHRyLl9jZW50ZXIubGF0KSk7XG5cbiAgICBxdWF0LnJvdGF0ZVoob3JpZW50YXRpb24sIG9yaWVudGF0aW9uLCB0ci5hbmdsZSk7XG4gICAgcXVhdC5yb3RhdGVYKG9yaWVudGF0aW9uLCBvcmllbnRhdGlvbiwgLXRyLl9waXRjaCk7XG5cbiAgICBjb25zdCByb3RhdGlvbk1hdHJpeCA9IG1hdDQuZnJvbVF1YXQobmV3IEZsb2F0MzJBcnJheSgxNiksIG9yaWVudGF0aW9uKTtcblxuICAgIGNvbnN0IHN0YXJJbnRlbnNpdHkgPSBtYXBWYWx1ZShmb2cucHJvcGVydGllcy5nZXQoJ3N0YXItaW50ZW5zaXR5JyksIDAuMCwgMS4wLCAwLjAsIDAuMjUpO1xuICAgIC8vIGh0dHBzOi8vd3d3LmRlc21vcy5jb20vY2FsY3VsYXRvci9vYW52dnByMzZkXG4gICAgLy8gRW5zdXJlIGhvcml6b24gYmxlbmQgaXMgMC1leGNsdXNpdmUgdG8gcHJldmVudCBkaXZpc2lvbiBieSAwIGluIHRoZSBzaGFkZXJcbiAgICBjb25zdCBtaW5Ib3Jpem9uQmxlbmQgPSAwLjAwMDU7XG4gICAgY29uc3QgaG9yaXpvbkJsZW5kID0gbWFwVmFsdWUoZm9nLnByb3BlcnRpZXMuZ2V0KCdob3Jpem9uLWJsZW5kJyksIDAuMCwgMS4wLCBtaW5Ib3Jpem9uQmxlbmQsIDAuMjUpO1xuXG4gICAgLy8gVXNlIGEgc2xpZ2h0bHkgc21hbGxlciBzaXplIG9mIHRoZSBnbG9iZSB0byBhY2NvdW50IGZvciBjdXN0b21cbiAgICAvLyBhbnRpYWxpYXNpbmcgdGhhdCByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBnbG9iZSBvZiB0d28gcGl4ZWxzXG4gICAgLy8gaHR0cHM6Ly93d3cuZGVzbW9zLmNvbS9jYWxjdWxhdG9yL3hwZ216Z2hjMzdcbiAgICBjb25zdCBnbG9iZVJhZGl1cyA9IGdsb2JlVXNlQ3VzdG9tQW50aUFsaWFzaW5nKHBhaW50ZXIsIGNvbnRleHQsIHRyKSAmJiBob3Jpem9uQmxlbmQgPT09IG1pbkhvcml6b25CbGVuZCA/XG4gICAgICAgIHRyLndvcmxkU2l6ZSAvICgyLjAgKiBNYXRoLlBJICogMS4wMjUpIC0gMS4wIDogdHIuZ2xvYmVSYWRpdXM7XG5cbiAgICBjb25zdCB0ZW1wb3JhbE9mZnNldCA9IChwYWludGVyLmZyYW1lQ291bnRlciAvIDEwMDAuMCkgJSAxO1xuICAgIGNvbnN0IGdsb2JlQ2VudGVySW5WaWV3U3BhY2UgPSAoKCh0ci5nbG9iZUNlbnRlckluVmlld1NwYWNlKTogYW55KTogQXJyYXk8bnVtYmVyPik7XG4gICAgY29uc3QgZ2xvYmVDZW50ZXJEaXN0YW5jZSA9IHZlYzMubGVuZ3RoKGdsb2JlQ2VudGVySW5WaWV3U3BhY2UpO1xuICAgIGNvbnN0IGRpc3RhbmNlVG9Ib3Jpem9uID0gTWF0aC5zcXJ0KE1hdGgucG93KGdsb2JlQ2VudGVyRGlzdGFuY2UsIDIuMCkgLSBNYXRoLnBvdyhnbG9iZVJhZGl1cywgMi4wKSk7XG4gICAgY29uc3QgaG9yaXpvbkFuZ2xlID0gTWF0aC5hY29zKGRpc3RhbmNlVG9Ib3Jpem9uIC8gZ2xvYmVDZW50ZXJEaXN0YW5jZSk7XG5cbiAgICBjb25zdCB1bmlmb3JtcyA9IGF0bW9zcGhlcmVVbmlmb3JtVmFsdWVzKFxuICAgICAgICB0ci5mcnVzdHVtQ29ybmVycy5UTCxcbiAgICAgICAgdHIuZnJ1c3R1bUNvcm5lcnMuVFIsXG4gICAgICAgIHRyLmZydXN0dW1Db3JuZXJzLkJSLFxuICAgICAgICB0ci5mcnVzdHVtQ29ybmVycy5CTCxcbiAgICAgICAgdHIuZnJ1c3R1bUNvcm5lcnMuaG9yaXpvbixcbiAgICAgICAgdHJhbnNpdGlvblQsXG4gICAgICAgIGhvcml6b25CbGVuZCxcbiAgICAgICAgZm9nQ29sb3IsXG4gICAgICAgIGhpZ2hDb2xvcixcbiAgICAgICAgc3BhY2VDb2xvcixcbiAgICAgICAgc3RhckludGVuc2l0eSxcbiAgICAgICAgdGVtcG9yYWxPZmZzZXQsXG4gICAgICAgIGhvcml6b25BbmdsZSxcbiAgICAgICAgcm90YXRpb25NYXRyaXgpO1xuXG4gICAgcGFpbnRlci5wcmVwYXJlRHJhd1Byb2dyYW0oY29udGV4dCwgcHJvZ3JhbSk7XG5cbiAgICBjb25zdCBidWZmZXIgPSBwYWludGVyLmF0bW9zcGhlcmVCdWZmZXI7XG4gICAgaWYgKGJ1ZmZlcikge1xuICAgICAgICBwcm9ncmFtLmRyYXcoY29udGV4dCwgZ2wuVFJJQU5HTEVTLCBkZXB0aE1vZGUsIFN0ZW5jaWxNb2RlLmRpc2FibGVkLFxuICAgICAgICAgICAgQ29sb3JNb2RlLmFscGhhQmxlbmRlZCwgQ3VsbEZhY2VNb2RlLmJhY2tDVywgdW5pZm9ybXMsIFwic2t5Ym94XCIsXG4gICAgICAgICAgICBidWZmZXIudmVydGV4QnVmZmVyLCBidWZmZXIuaW5kZXhCdWZmZXIsIGJ1ZmZlci5zZWdtZW50cyk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7Y3JlYXRlTGF5b3V0fSBmcm9tICcuLi91dGlsL3N0cnVjdF9hcnJheS5qcyc7XG5cbmltcG9ydCB0eXBlIHtTdHJ1Y3RBcnJheUxheW91dH0gZnJvbSAnLi4vdXRpbC9zdHJ1Y3RfYXJyYXkuanMnO1xuXG5leHBvcnQgY29uc3QgYXRtb3NwaGVyZUxheW91dDogU3RydWN0QXJyYXlMYXlvdXQgPSBjcmVhdGVMYXlvdXQoW1xuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdhX3BvcycsIGNvbXBvbmVudHM6IDN9LFxuICAgIHt0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdhX3V2JywgY29tcG9uZW50czogMn1cbl0pO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB0eXBlIEluZGV4QnVmZmVyIGZyb20gJy4uL2dsL2luZGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgU2VnbWVudFZlY3RvciBmcm9tICcuLi9kYXRhL3NlZ21lbnQuanMnO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tICcuLi9nbC9jb250ZXh0LmpzJztcbmltcG9ydCB7YXRtb3NwaGVyZUxheW91dH0gZnJvbSAnLi9hdG1vc3BoZXJlX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHtUcmlhbmdsZUluZGV4QXJyYXksIEF0bW9zcGhlcmVWZXJ0ZXhBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBBdG1vc3BoZXJlQnVmZmVyIHtcbiAgICB2ZXJ0ZXhCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcbiAgICBpbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgc2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHZlcnRpY2VzID0gbmV3IEF0bW9zcGhlcmVWZXJ0ZXhBcnJheSgpO1xuICAgICAgICB2ZXJ0aWNlcy5lbXBsYWNlQmFjaygtMSwgMSwgMSwgMCwgMCk7XG4gICAgICAgIHZlcnRpY2VzLmVtcGxhY2VCYWNrKDEsIDEsIDEsIDEsIDApO1xuICAgICAgICB2ZXJ0aWNlcy5lbXBsYWNlQmFjaygxLCAtMSwgMSwgMSwgMSk7XG4gICAgICAgIHZlcnRpY2VzLmVtcGxhY2VCYWNrKC0xLCAtMSwgMSwgMCwgMSk7XG5cbiAgICAgICAgY29uc3QgdHJpYW5nbGVzID0gbmV3IFRyaWFuZ2xlSW5kZXhBcnJheSgpO1xuICAgICAgICB0cmlhbmdsZXMuZW1wbGFjZUJhY2soMCwgMSwgMik7XG4gICAgICAgIHRyaWFuZ2xlcy5lbXBsYWNlQmFjaygyLCAzLCAwKTtcblxuICAgICAgICB0aGlzLnZlcnRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHZlcnRpY2VzLCBhdG1vc3BoZXJlTGF5b3V0Lm1lbWJlcnMpO1xuICAgICAgICB0aGlzLmluZGV4QnVmZmVyID0gY29udGV4dC5jcmVhdGVJbmRleEJ1ZmZlcih0cmlhbmdsZXMpO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbmRleEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuc2VnbWVudHMuZGVzdHJveSgpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBicm93c2VyIGZyb20gJy4uL3V0aWwvYnJvd3Nlci5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcblxuaW1wb3J0IHttYXQ0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IFNvdXJjZUNhY2hlIGZyb20gJy4uL3NvdXJjZS9zb3VyY2VfY2FjaGUuanMnO1xuaW1wb3J0IEVYVEVOVCBmcm9tICcuLi9kYXRhL2V4dGVudC5qcyc7XG5pbXBvcnQgcGl4ZWxzVG9UaWxlVW5pdHMgZnJvbSAnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzLmpzJztcbmltcG9ydCBTZWdtZW50VmVjdG9yIGZyb20gJy4uL2RhdGEvc2VnbWVudC5qcyc7XG5pbXBvcnQge1Bvc0FycmF5LCBUaWxlQm91bmRzQXJyYXksIFRyaWFuZ2xlSW5kZXhBcnJheSwgTGluZVN0cmlwSW5kZXhBcnJheX0gZnJvbSAnLi4vZGF0YS9hcnJheV90eXBlcy5qcyc7XG5pbXBvcnQge3ZhbHVlc30gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7aXNNYXBBdXRoZW50aWNhdGVkfSBmcm9tICcuLi91dGlsL21hcGJveC5qcyc7XG5pbXBvcnQgcG9zQXR0cmlidXRlcyBmcm9tICcuLi9kYXRhL3Bvc19hdHRyaWJ1dGVzLmpzJztcbmltcG9ydCBib3VuZHNBdHRyaWJ1dGVzIGZyb20gJy4uL2RhdGEvYm91bmRzX2F0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IFByb2dyYW1Db25maWd1cmF0aW9uIGZyb20gJy4uL2RhdGEvcHJvZ3JhbV9jb25maWd1cmF0aW9uLmpzJztcbmltcG9ydCBDcm9zc1RpbGVTeW1ib2xJbmRleCBmcm9tICcuLi9zeW1ib2wvY3Jvc3NfdGlsZV9zeW1ib2xfaW5kZXguanMnO1xuaW1wb3J0IHNoYWRlcnMgZnJvbSAnLi4vc2hhZGVycy9zaGFkZXJzLmpzJztcbmltcG9ydCBQcm9ncmFtIGZyb20gJy4vcHJvZ3JhbS5qcyc7XG5pbXBvcnQge3Byb2dyYW1Vbmlmb3Jtc30gZnJvbSAnLi9wcm9ncmFtL3Byb2dyYW1fdW5pZm9ybXMuanMnO1xuaW1wb3J0IENvbnRleHQgZnJvbSAnLi4vZ2wvY29udGV4dC5qcyc7XG5pbXBvcnQge2ZvZ1VuaWZvcm1WYWx1ZXN9IGZyb20gJy4uL3JlbmRlci9mb2cuanMnO1xuaW1wb3J0IERlcHRoTW9kZSBmcm9tICcuLi9nbC9kZXB0aF9tb2RlLmpzJztcbmltcG9ydCBTdGVuY2lsTW9kZSBmcm9tICcuLi9nbC9zdGVuY2lsX21vZGUuanMnO1xuaW1wb3J0IENvbG9yTW9kZSBmcm9tICcuLi9nbC9jb2xvcl9tb2RlLmpzJztcbmltcG9ydCBDdWxsRmFjZU1vZGUgZnJvbSAnLi4vZ2wvY3VsbF9mYWNlX21vZGUuanMnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi90ZXh0dXJlLmpzJztcbmltcG9ydCB7Y2xpcHBpbmdNYXNrVW5pZm9ybVZhbHVlc30gZnJvbSAnLi9wcm9ncmFtL2NsaXBwaW5nX21hc2tfcHJvZ3JhbS5qcyc7XG5pbXBvcnQgQ29sb3IgZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2NvbG9yLmpzJztcbmltcG9ydCBzeW1ib2wgZnJvbSAnLi9kcmF3X3N5bWJvbC5qcyc7XG5pbXBvcnQgY2lyY2xlIGZyb20gJy4vZHJhd19jaXJjbGUuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IGhlYXRtYXAgZnJvbSAnLi9kcmF3X2hlYXRtYXAuanMnO1xuaW1wb3J0IGxpbmUgZnJvbSAnLi9kcmF3X2xpbmUuanMnO1xuaW1wb3J0IGZpbGwgZnJvbSAnLi9kcmF3X2ZpbGwuanMnO1xuaW1wb3J0IGZpbGxFeHRydXNpb24gZnJvbSAnLi9kcmF3X2ZpbGxfZXh0cnVzaW9uLmpzJztcbmltcG9ydCBoaWxsc2hhZGUgZnJvbSAnLi9kcmF3X2hpbGxzaGFkZS5qcyc7XG5pbXBvcnQgcmFzdGVyIGZyb20gJy4vZHJhd19yYXN0ZXIuanMnO1xuaW1wb3J0IGJhY2tncm91bmQgZnJvbSAnLi9kcmF3X2JhY2tncm91bmQuanMnO1xuaW1wb3J0IGRlYnVnLCB7ZHJhd0RlYnVnUGFkZGluZywgZHJhd0RlYnVnUXVlcnlHZW9tZXRyeX0gZnJvbSAnLi9kcmF3X2RlYnVnLmpzJztcbmltcG9ydCBjdXN0b20gZnJvbSAnLi9kcmF3X2N1c3RvbS5qcyc7XG5pbXBvcnQgc2t5IGZyb20gJy4vZHJhd19za3kuanMnO1xuaW1wb3J0IGRyYXdBdG1vc3BoZXJlIGZyb20gJy4vZHJhd19hdG1vc3BoZXJlLmpzJztcbmltcG9ydCB7R2xvYmVTaGFyZWRCdWZmZXJzLCBnbG9iZVRvTWVyY2F0b3JUcmFuc2l0aW9ufSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9nbG9iZV91dGlsLmpzJztcbmltcG9ydCB7QXRtb3NwaGVyZUJ1ZmZlcn0gZnJvbSAnLi4vcmVuZGVyL2F0bW9zcGhlcmVfYnVmZmVyLmpzJztcbmltcG9ydCB7VGVycmFpbn0gZnJvbSAnLi4vdGVycmFpbi90ZXJyYWluLmpzJztcbmltcG9ydCB7RGVidWd9IGZyb20gJy4uL3V0aWwvZGVidWcuanMnO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IHtSR0JBSW1hZ2V9IGZyb20gJy4uL3V0aWwvaW1hZ2UuanMnO1xuXG5jb25zdCBkcmF3ID0ge1xuICAgIHN5bWJvbCxcbiAgICBjaXJjbGUsXG4gICAgaGVhdG1hcCxcbiAgICBsaW5lLFxuICAgIGZpbGwsXG4gICAgJ2ZpbGwtZXh0cnVzaW9uJzogZmlsbEV4dHJ1c2lvbixcbiAgICBoaWxsc2hhZGUsXG4gICAgcmFzdGVyLFxuICAgIGJhY2tncm91bmQsXG4gICAgc2t5LFxuICAgIGRlYnVnLFxuICAgIGN1c3RvbVxufTtcblxuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHR5cGUge092ZXJzY2FsZWRUaWxlSUQsIFVud3JhcHBlZFRpbGVJRH0gZnJvbSAnLi4vc291cmNlL3RpbGVfaWQuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGUgZnJvbSAnLi4vc3R5bGUvc3R5bGUuanMnO1xuaW1wb3J0IHR5cGUgU3R5bGVMYXllciBmcm9tICcuLi9zdHlsZS9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7Q3Jvc3NGYWRlZH0gZnJvbSAnLi4vc3R5bGUvcHJvcGVydGllcy5qcyc7XG5pbXBvcnQgdHlwZSBMaW5lQXRsYXMgZnJvbSAnLi9saW5lX2F0bGFzLmpzJztcbmltcG9ydCB0eXBlIEltYWdlTWFuYWdlciBmcm9tICcuL2ltYWdlX21hbmFnZXIuanMnO1xuaW1wb3J0IHR5cGUgR2x5cGhNYW5hZ2VyIGZyb20gJy4vZ2x5cGhfbWFuYWdlci5qcyc7XG5pbXBvcnQgdHlwZSBWZXJ0ZXhCdWZmZXIgZnJvbSAnLi4vZ2wvdmVydGV4X2J1ZmZlci5qcyc7XG5pbXBvcnQgdHlwZSBJbmRleEJ1ZmZlciBmcm9tICcuLi9nbC9pbmRleF9idWZmZXIuanMnO1xuaW1wb3J0IHR5cGUge0RlcHRoUmFuZ2VUeXBlLCBEZXB0aE1hc2tUeXBlLCBEZXB0aEZ1bmNUeXBlfSBmcm9tICcuLi9nbC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSBSZXNvbHZlZEltYWdlIGZyb20gJy4uL3N0eWxlLXNwZWMvZXhwcmVzc2lvbi90eXBlcy9yZXNvbHZlZF9pbWFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7RHluYW1pY0RlZmluZXNUeXBlfSBmcm9tICcuL3Byb2dyYW0vcHJvZ3JhbV91bmlmb3Jtcy5qcyc7XG5cbmV4cG9ydCB0eXBlIFJlbmRlclBhc3MgPSAnb2Zmc2NyZWVuJyB8ICdvcGFxdWUnIHwgJ3RyYW5zbHVjZW50JyB8ICdza3knO1xuZXhwb3J0IHR5cGUgQ2FudmFzQ29weUluc3RhbmNlcyA9IHtcbiAgICBjYW52YXNDb3BpZXM6IFdlYkdMVGV4dHVyZVtdLFxuICAgIHRpbWVTdGFtcHM6IG51bWJlcltdXG59XG5cbnR5cGUgUGFpbnRlck9wdGlvbnMgPSB7XG4gICAgc2hvd092ZXJkcmF3SW5zcGVjdG9yOiBib29sZWFuLFxuICAgIHNob3dUaWxlQm91bmRhcmllczogYm9vbGVhbixcbiAgICBzaG93VGVycmFpbldpcmVmcmFtZTogYm9vbGVhbixcbiAgICBzaG93UXVlcnlHZW9tZXRyeTogYm9vbGVhbixcbiAgICBzaG93UGFkZGluZzogYm9vbGVhbixcbiAgICByb3RhdGluZzogYm9vbGVhbixcbiAgICB6b29taW5nOiBib29sZWFuLFxuICAgIG1vdmluZzogYm9vbGVhbixcbiAgICBncHVUaW1pbmc6IGJvb2xlYW4sXG4gICAgZ3B1VGltaW5nRGVmZXJyZWRSZW5kZXI6IGJvb2xlYW4sXG4gICAgZmFkZUR1cmF0aW9uOiBudW1iZXIsXG4gICAgaXNJbml0aWFsTG9hZDogYm9vbGVhbixcbiAgICBzcGVlZEluZGV4VGltaW5nOiBib29sZWFuXG59XG5cbnR5cGUgVGlsZUJvdW5kc0J1ZmZlcnMgPSB7fFxuICB0aWxlQm91bmRzQnVmZmVyOiBWZXJ0ZXhCdWZmZXIsXG4gIHRpbGVCb3VuZHNJbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXIsXG4gIHRpbGVCb3VuZHNTZWdtZW50czogU2VnbWVudFZlY3Rvcixcbnx9O1xuXG50eXBlIEdQVVRpbWVycyA9IHtbbGF5ZXJJZDogc3RyaW5nXTogYW55fTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IHBhaW50ZXIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7Q2FudmFzfSBnbCBhbiBleHBlcmltZW50YWwtd2ViZ2wgZHJhd2luZyBjb250ZXh0XG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQYWludGVyIHtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuICAgIHRyYW5zZm9ybTogVHJhbnNmb3JtO1xuICAgIF90aWxlVGV4dHVyZXM6IHtbXzogbnVtYmVyXTogQXJyYXk8VGV4dHVyZT4gfTtcbiAgICBudW1TdWJsYXllcnM6IG51bWJlcjtcbiAgICBkZXB0aEVwc2lsb246IG51bWJlcjtcbiAgICBlbXB0eVByb2dyYW1Db25maWd1cmF0aW9uOiBQcm9ncmFtQ29uZmlndXJhdGlvbjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIHRpbGVFeHRlbnRCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcbiAgICB0aWxlRXh0ZW50U2VnbWVudHM6IFNlZ21lbnRWZWN0b3I7XG4gICAgZGVidWdCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcbiAgICBkZWJ1Z0luZGV4QnVmZmVyOiBJbmRleEJ1ZmZlcjtcbiAgICBkZWJ1Z1NlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIHZpZXdwb3J0QnVmZmVyOiBWZXJ0ZXhCdWZmZXI7XG4gICAgdmlld3BvcnRTZWdtZW50czogU2VnbWVudFZlY3RvcjtcbiAgICBxdWFkVHJpYW5nbGVJbmRleEJ1ZmZlcjogSW5kZXhCdWZmZXI7XG4gICAgbWVyY2F0b3JCb3VuZHNCdWZmZXI6IFZlcnRleEJ1ZmZlcjtcbiAgICBtZXJjYXRvckJvdW5kc1NlZ21lbnRzOiBTZWdtZW50VmVjdG9yO1xuICAgIF90aWxlQ2xpcHBpbmdNYXNrSURzOiB7W186IG51bWJlcl06IG51bWJlciB9O1xuICAgIHN0ZW5jaWxDbGVhck1vZGU6IFN0ZW5jaWxNb2RlO1xuICAgIHN0eWxlOiBTdHlsZTtcbiAgICBvcHRpb25zOiBQYWludGVyT3B0aW9ucztcbiAgICBsaW5lQXRsYXM6IExpbmVBdGxhcztcbiAgICBpbWFnZU1hbmFnZXI6IEltYWdlTWFuYWdlcjtcbiAgICBnbHlwaE1hbmFnZXI6IEdseXBoTWFuYWdlcjtcbiAgICBkZXB0aFJhbmdlRm9yM0Q6IERlcHRoUmFuZ2VUeXBlO1xuICAgIG9wYXF1ZVBhc3NDdXRvZmY6IG51bWJlcjtcbiAgICBmcmFtZUNvdW50ZXI6IG51bWJlcjtcbiAgICByZW5kZXJQYXNzOiBSZW5kZXJQYXNzO1xuICAgIGN1cnJlbnRMYXllcjogbnVtYmVyO1xuICAgIGN1cnJlbnRTdGVuY2lsU291cmNlOiA/c3RyaW5nO1xuICAgIG5leHRTdGVuY2lsSUQ6IG51bWJlcjtcbiAgICBpZDogc3RyaW5nO1xuICAgIF9zaG93T3ZlcmRyYXdJbnNwZWN0b3I6IGJvb2xlYW47XG4gICAgY2FjaGU6IHtbXzogc3RyaW5nXTogUHJvZ3JhbTwqPiB9O1xuICAgIGNyb3NzVGlsZVN5bWJvbEluZGV4OiBDcm9zc1RpbGVTeW1ib2xJbmRleDtcbiAgICBzeW1ib2xGYWRlQ2hhbmdlOiBudW1iZXI7XG4gICAgZ3B1VGltZXJzOiBHUFVUaW1lcnM7XG4gICAgZGVmZXJyZWRSZW5kZXJHcHVUaW1lUXVlcmllczogQXJyYXk8YW55PjtcbiAgICBlbXB0eVRleHR1cmU6IFRleHR1cmU7XG4gICAgaWRlbnRpdHlNYXQ6IEZsb2F0MzJBcnJheTtcbiAgICBkZWJ1Z092ZXJsYXlUZXh0dXJlOiBUZXh0dXJlO1xuICAgIGRlYnVnT3ZlcmxheUNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgX3RlcnJhaW46ID9UZXJyYWluO1xuICAgIGdsb2JlU2hhcmVkQnVmZmVyczogP0dsb2JlU2hhcmVkQnVmZmVycztcbiAgICBhdG1vc3BoZXJlQnVmZmVyOiBBdG1vc3BoZXJlQnVmZmVyO1xuICAgIHRpbGVMb2FkZWQ6IGJvb2xlYW47XG4gICAgZnJhbWVDb3BpZXM6IEFycmF5PFdlYkdMVGV4dHVyZT47XG4gICAgbG9hZFRpbWVTdGFtcHM6IEFycmF5PG51bWJlcj47XG4gICAgX2JhY2tncm91bmRUaWxlczoge1trZXk6IG51bWJlcl06IFRpbGV9O1xuXG4gICAgY29uc3RydWN0b3IoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdHJhbnNmb3JtOiBUcmFuc2Zvcm0pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IENvbnRleHQoZ2wpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICAgICAgdGhpcy5fdGlsZVRleHR1cmVzID0ge307XG4gICAgICAgIHRoaXMuZnJhbWVDb3BpZXMgPSBbXTtcbiAgICAgICAgdGhpcy5sb2FkVGltZVN0YW1wcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuc2V0dXAoKTtcblxuICAgICAgICAvLyBXaXRoaW4gZWFjaCBsYXllciB0aGVyZSBhcmUgbXVsdGlwbGUgZGlzdGluY3Qgei1wbGFuZXMgdGhhdCBjYW4gYmUgZHJhd24gdG8uXG4gICAgICAgIC8vIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIFdlYkdMIGRlcHRoIGJ1ZmZlci5cbiAgICAgICAgdGhpcy5udW1TdWJsYXllcnMgPSBTb3VyY2VDYWNoZS5tYXhVbmRlcnpvb21pbmcgKyBTb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZyArIDE7XG4gICAgICAgIHRoaXMuZGVwdGhFcHNpbG9uID0gMSAvIE1hdGgucG93KDIsIDE2KTtcblxuICAgICAgICB0aGlzLmNyb3NzVGlsZVN5bWJvbEluZGV4ID0gbmV3IENyb3NzVGlsZVN5bWJvbEluZGV4KCk7XG5cbiAgICAgICAgdGhpcy5kZWZlcnJlZFJlbmRlckdwdVRpbWVRdWVyaWVzID0gW107XG4gICAgICAgIHRoaXMuZ3B1VGltZXJzID0ge307XG4gICAgICAgIHRoaXMuZnJhbWVDb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5fYmFja2dyb3VuZFRpbGVzID0ge307XG4gICAgfVxuXG4gICAgdXBkYXRlVGVycmFpbihzdHlsZTogU3R5bGUsIGNhbWVyYUNoYW5naW5nOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGVuYWJsZWQgPSAhIXN0eWxlICYmICEhc3R5bGUudGVycmFpbiAmJiB0aGlzLnRyYW5zZm9ybS5wcm9qZWN0aW9uLnN1cHBvcnRzVGVycmFpbjtcbiAgICAgICAgaWYgKCFlbmFibGVkICYmICghdGhpcy5fdGVycmFpbiB8fCAhdGhpcy5fdGVycmFpbi5lbmFibGVkKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuX3RlcnJhaW4pIHtcbiAgICAgICAgICAgIHRoaXMuX3RlcnJhaW4gPSBuZXcgVGVycmFpbih0aGlzLCBzdHlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGVycmFpbjogVGVycmFpbiA9IHRoaXMuX3RlcnJhaW47XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLmVsZXZhdGlvbiA9IGVuYWJsZWQgPyB0ZXJyYWluIDogbnVsbDtcbiAgICAgICAgdGVycmFpbi51cGRhdGUoc3R5bGUsIHRoaXMudHJhbnNmb3JtLCBjYW1lcmFDaGFuZ2luZyk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUZvZyhzdHlsZTogU3R5bGUpIHtcbiAgICAgICAgLy8gR2xvYmUgbWFrZXMgdXNlIG9mIHRoaW4gZm9nIG92ZXJsYXkgd2l0aCBhIGZpeGVkIGZvZyByYW5nZSxcbiAgICAgICAgLy8gc28gd2UgY2FuIHNraXAgdXBkYXRpbmcgZm9nIHRpbGUgY3VsbGluZyBmb3IgdGhpcyBwcm9qZWN0aW9uXG4gICAgICAgIGNvbnN0IGlzR2xvYmUgPSB0aGlzLnRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZSc7XG5cbiAgICAgICAgY29uc3QgZm9nID0gc3R5bGUuZm9nO1xuICAgICAgICBpZiAoIWZvZyB8fCBpc0dsb2JlIHx8IGZvZy5nZXRPcGFjaXR5KHRoaXMudHJhbnNmb3JtLnBpdGNoKSA8IDEgfHwgZm9nLnByb3BlcnRpZXMuZ2V0KCdob3Jpem9uLWJsZW5kJykgPCAwLjAzKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5mb2dDdWxsRGlzdFNxID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIHN0YXJ0IGN1bGxpbmcgd2hlcmUgdGhlIGZvZyBvcGFjaXR5IGZ1bmN0aW9uIGhpdHNcbiAgICAgICAgLy8gOTglIHdoaWNoIGxlYXZlcyBhIG5vbi1ub3RpY2VhYmxlIGNoYW5nZSB0aHJlc2hvbGQuXG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IGZvZy5nZXRGb3ZBZGp1c3RlZFJhbmdlKHRoaXMudHJhbnNmb3JtLl9mb3YpO1xuXG4gICAgICAgIGlmIChzdGFydCA+IGVuZCkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uZm9nQ3VsbERpc3RTcSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb2dCb3VuZEZyYWN0aW9uID0gMC43ODtcbiAgICAgICAgY29uc3QgZm9nQ3VsbERpc3QgPSBzdGFydCArIChlbmQgLSBzdGFydCkgKiBmb2dCb3VuZEZyYWN0aW9uO1xuXG4gICAgICAgIHRoaXMudHJhbnNmb3JtLmZvZ0N1bGxEaXN0U3EgPSBmb2dDdWxsRGlzdCAqIGZvZ0N1bGxEaXN0O1xuICAgIH1cblxuICAgIGdldCB0ZXJyYWluKCk6ID9UZXJyYWluIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLl90ZXJyYWluRW5hYmxlZCgpICYmIHRoaXMuX3RlcnJhaW4gJiYgdGhpcy5fdGVycmFpbi5lbmFibGVkID8gdGhpcy5fdGVycmFpbiA6IG51bGw7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBVcGRhdGUgdGhlIEdMIHZpZXdwb3J0LCBwcm9qZWN0aW9uIG1hdHJpeCwgYW5kIHRyYW5zZm9ybXMgdG8gY29tcGVuc2F0ZVxuICAgICAqIGZvciBhIG5ldyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlLlxuICAgICAqL1xuICAgIHJlc2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0ICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICB0aGlzLmNvbnRleHQudmlld3BvcnQuc2V0KFswLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodF0pO1xuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgdGhpcy5zdHlsZS5vcmRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkXS5yZXNpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldHVwKCkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG4gICAgICAgIGNvbnN0IHRpbGVFeHRlbnRBcnJheSA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICB0aWxlRXh0ZW50QXJyYXkuZW1wbGFjZUJhY2soMCwgMCk7XG4gICAgICAgIHRpbGVFeHRlbnRBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIDApO1xuICAgICAgICB0aWxlRXh0ZW50QXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5UKTtcbiAgICAgICAgdGlsZUV4dGVudEFycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgRVhURU5UKTtcbiAgICAgICAgdGhpcy50aWxlRXh0ZW50QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodGlsZUV4dGVudEFycmF5LCBwb3NBdHRyaWJ1dGVzLm1lbWJlcnMpO1xuICAgICAgICB0aGlzLnRpbGVFeHRlbnRTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCAyKTtcblxuICAgICAgICBjb25zdCBkZWJ1Z0FycmF5ID0gbmV3IFBvc0FycmF5KCk7XG4gICAgICAgIGRlYnVnQXJyYXkuZW1wbGFjZUJhY2soMCwgMCk7XG4gICAgICAgIGRlYnVnQXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCAwKTtcbiAgICAgICAgZGVidWdBcnJheS5lbXBsYWNlQmFjaygwLCBFWFRFTlQpO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgRVhURU5UKTtcbiAgICAgICAgdGhpcy5kZWJ1Z0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKGRlYnVnQXJyYXksIHBvc0F0dHJpYnV0ZXMubWVtYmVycyk7XG4gICAgICAgIHRoaXMuZGVidWdTZWdtZW50cyA9IFNlZ21lbnRWZWN0b3Iuc2ltcGxlU2VnbWVudCgwLCAwLCA0LCA1KTtcblxuICAgICAgICBjb25zdCB2aWV3cG9ydEFycmF5ID0gbmV3IFBvc0FycmF5KCk7XG4gICAgICAgIHZpZXdwb3J0QXJyYXkuZW1wbGFjZUJhY2soLTEsIC0xKTtcbiAgICAgICAgdmlld3BvcnRBcnJheS5lbXBsYWNlQmFjaygxLCAtMSk7XG4gICAgICAgIHZpZXdwb3J0QXJyYXkuZW1wbGFjZUJhY2soLTEsIDEpO1xuICAgICAgICB2aWV3cG9ydEFycmF5LmVtcGxhY2VCYWNrKDEsIDEpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0QnVmZmVyID0gY29udGV4dC5jcmVhdGVWZXJ0ZXhCdWZmZXIodmlld3BvcnRBcnJheSwgcG9zQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy52aWV3cG9ydFNlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuXG4gICAgICAgIGNvbnN0IHRpbGVCb3VuZHNBcnJheSA9IG5ldyBUaWxlQm91bmRzQXJyYXkoKTtcbiAgICAgICAgdGlsZUJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKDAsIDAsIDAsIDApO1xuICAgICAgICB0aWxlQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCAwLCBFWFRFTlQsIDApO1xuICAgICAgICB0aWxlQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5ULCAwLCBFWFRFTlQpO1xuICAgICAgICB0aWxlQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCBFWFRFTlQsIEVYVEVOVCwgRVhURU5UKTtcbiAgICAgICAgdGhpcy5tZXJjYXRvckJvdW5kc0J1ZmZlciA9IGNvbnRleHQuY3JlYXRlVmVydGV4QnVmZmVyKHRpbGVCb3VuZHNBcnJheSwgYm91bmRzQXR0cmlidXRlcy5tZW1iZXJzKTtcbiAgICAgICAgdGhpcy5tZXJjYXRvckJvdW5kc1NlZ21lbnRzID0gU2VnbWVudFZlY3Rvci5zaW1wbGVTZWdtZW50KDAsIDAsIDQsIDIpO1xuXG4gICAgICAgIGNvbnN0IHF1YWRUcmlhbmdsZUluZGljZXMgPSBuZXcgVHJpYW5nbGVJbmRleEFycmF5KCk7XG4gICAgICAgIHF1YWRUcmlhbmdsZUluZGljZXMuZW1wbGFjZUJhY2soMCwgMSwgMik7XG4gICAgICAgIHF1YWRUcmlhbmdsZUluZGljZXMuZW1wbGFjZUJhY2soMiwgMSwgMyk7XG4gICAgICAgIHRoaXMucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIgPSBjb250ZXh0LmNyZWF0ZUluZGV4QnVmZmVyKHF1YWRUcmlhbmdsZUluZGljZXMpO1xuXG4gICAgICAgIGNvbnN0IHRpbGVMaW5lU3RyaXBJbmRpY2VzID0gbmV3IExpbmVTdHJpcEluZGV4QXJyYXkoKTtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIFswLCAxLCAzLCAyLCAwXSkgdGlsZUxpbmVTdHJpcEluZGljZXMuZW1wbGFjZUJhY2soaSk7XG4gICAgICAgIHRoaXMuZGVidWdJbmRleEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlSW5kZXhCdWZmZXIodGlsZUxpbmVTdHJpcEluZGljZXMpO1xuXG4gICAgICAgIHRoaXMuZW1wdHlUZXh0dXJlID0gbmV3IFRleHR1cmUoY29udGV4dCxcbiAgICAgICAgICAgIG5ldyBSR0JBSW1hZ2Uoe3dpZHRoOiAxLCBoZWlnaHQ6IDF9LCBVaW50OEFycmF5Lm9mKDAsIDAsIDAsIDApKSwgY29udGV4dC5nbC5SR0JBKTtcblxuICAgICAgICB0aGlzLmlkZW50aXR5TWF0ID0gbWF0NC5jcmVhdGUoKTtcblxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgdGhpcy5zdGVuY2lsQ2xlYXJNb2RlID0gbmV3IFN0ZW5jaWxNb2RlKHtmdW5jOiBnbC5BTFdBWVMsIG1hc2s6IDB9LCAweDAsIDB4RkYsIGdsLlpFUk8sIGdsLlpFUk8sIGdsLlpFUk8pO1xuICAgICAgICB0aGlzLmxvYWRUaW1lU3RhbXBzLnB1c2god2luZG93LnBlcmZvcm1hbmNlLm5vdygpKTtcblxuICAgICAgICB0aGlzLmF0bW9zcGhlcmVCdWZmZXIgPSBuZXcgQXRtb3NwaGVyZUJ1ZmZlcih0aGlzLmNvbnRleHQpO1xuICAgIH1cblxuICAgIGdldE1lcmNhdG9yVGlsZUJvdW5kc0J1ZmZlcnMoKTogVGlsZUJvdW5kc0J1ZmZlcnMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGlsZUJvdW5kc0J1ZmZlcjogdGhpcy5tZXJjYXRvckJvdW5kc0J1ZmZlcixcbiAgICAgICAgICAgIHRpbGVCb3VuZHNJbmRleEJ1ZmZlcjogdGhpcy5xdWFkVHJpYW5nbGVJbmRleEJ1ZmZlcixcbiAgICAgICAgICAgIHRpbGVCb3VuZHNTZWdtZW50czogdGhpcy5tZXJjYXRvckJvdW5kc1NlZ21lbnRzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0VGlsZUJvdW5kc0J1ZmZlcnModGlsZTogVGlsZSk6IFRpbGVCb3VuZHNCdWZmZXJzIHtcbiAgICAgICAgdGlsZS5fbWFrZVRpbGVCb3VuZHNCdWZmZXJzKHRoaXMuY29udGV4dCwgdGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbik7XG4gICAgICAgIGlmICh0aWxlLl90aWxlQm91bmRzQnVmZmVyKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlQm91bmRzQnVmZmVyID0gdGlsZS5fdGlsZUJvdW5kc0J1ZmZlcjtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVCb3VuZHNJbmRleEJ1ZmZlciA9IHRpbGUuX3RpbGVCb3VuZHNJbmRleEJ1ZmZlcjtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVCb3VuZHNTZWdtZW50cyA9IHRpbGUuX3RpbGVCb3VuZHNTZWdtZW50cztcbiAgICAgICAgICAgIHJldHVybiB7dGlsZUJvdW5kc0J1ZmZlciwgdGlsZUJvdW5kc0luZGV4QnVmZmVyLCB0aWxlQm91bmRzU2VnbWVudHN9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVyY2F0b3JUaWxlQm91bmRzQnVmZmVycygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZXNldCB0aGUgZHJhd2luZyBjYW52YXMgYnkgY2xlYXJpbmcgdGhlIHN0ZW5jaWwgYnVmZmVyIHNvIHRoYXQgd2UgY2FuIGRyYXdcbiAgICAgKiBuZXcgdGlsZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24sIHdoaWxlIHJldGFpbmluZyBwcmV2aW91c2x5IGRyYXduIHBpeGVscy5cbiAgICAgKi9cbiAgICBjbGVhclN0ZW5jaWwoKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGdsID0gY29udGV4dC5nbDtcblxuICAgICAgICB0aGlzLm5leHRTdGVuY2lsSUQgPSAxO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90aWxlQ2xpcHBpbmdNYXNrSURzID0ge307XG5cbiAgICAgICAgLy8gQXMgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzU0OTAsXG4gICAgICAgIC8vIHBlbmRpbmcgYW4gdXBzdHJlYW0gZml4LCB3ZSBkcmF3IGEgZnVsbHNjcmVlbiBzdGVuY2lsPTAgY2xpcHBpbmcgbWFzayBoZXJlLFxuICAgICAgICAvLyBlZmZlY3RpdmVseSBjbGVhcmluZyB0aGUgc3RlbmNpbCBidWZmZXI6IG9uY2UgYW4gdXBzdHJlYW0gcGF0Y2ggbGFuZHMsIHJlbW92ZVxuICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIGluIGZhdm9yIG9mIGNvbnRleHQuY2xlYXIoeyBzdGVuY2lsOiAweDAgfSlcbiAgICAgICAgdGhpcy51c2VQcm9ncmFtKCdjbGlwcGluZ01hc2snKS5kcmF3KGNvbnRleHQsIGdsLlRSSUFOR0xFUyxcbiAgICAgICAgICAgIERlcHRoTW9kZS5kaXNhYmxlZCwgdGhpcy5zdGVuY2lsQ2xlYXJNb2RlLCBDb2xvck1vZGUuZGlzYWJsZWQsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIGNsaXBwaW5nTWFza1VuaWZvcm1WYWx1ZXModGhpcy5pZGVudGl0eU1hdCksXG4gICAgICAgICAgICAnJGNsaXBwaW5nJywgdGhpcy52aWV3cG9ydEJ1ZmZlcixcbiAgICAgICAgICAgIHRoaXMucXVhZFRyaWFuZ2xlSW5kZXhCdWZmZXIsIHRoaXMudmlld3BvcnRTZWdtZW50cyk7XG4gICAgfVxuXG4gICAgcmVzZXRTdGVuY2lsQ2xpcHBpbmdNYXNrcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRlcnJhaW4pIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZW5jaWxTb3VyY2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLl90aWxlQ2xpcHBpbmdNYXNrSURzID0ge307XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcmVuZGVyVGlsZUNsaXBwaW5nTWFza3MobGF5ZXI6IFN0eWxlTGF5ZXIsIHNvdXJjZUNhY2hlPzogU291cmNlQ2FjaGUsIHRpbGVJRHM/OiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPikge1xuICAgICAgICBpZiAoIXNvdXJjZUNhY2hlIHx8IHRoaXMuY3VycmVudFN0ZW5jaWxTb3VyY2UgPT09IHNvdXJjZUNhY2hlLmlkIHx8ICFsYXllci5pc1RpbGVDbGlwcGVkKCkgfHwgIXRpbGVJRHMgfHwgdGlsZUlEcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl90aWxlQ2xpcHBpbmdNYXNrSURzICYmICF0aGlzLnRlcnJhaW4pIHtcbiAgICAgICAgICAgIGxldCBkaXJ0eVN0ZW5jaWxDbGlwcGluZ01hc2tzID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBFcXVpdmFsZW50IHRpbGUgc2V0IGlzIGFscmVhZHkgcmVuZGVyZWQgaW4gc3RlbmNpbFxuICAgICAgICAgICAgZm9yIChjb25zdCBjb29yZCBvZiB0aWxlSURzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHNbY29vcmQua2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcnR5U3RlbmNpbENsaXBwaW5nTWFza3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRpcnR5U3RlbmNpbENsaXBwaW5nTWFza3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlID0gc291cmNlQ2FjaGUuaWQ7XG5cbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgY29uc3QgZ2wgPSBjb250ZXh0LmdsO1xuXG4gICAgICAgIGlmICh0aGlzLm5leHRTdGVuY2lsSUQgKyB0aWxlSURzLmxlbmd0aCA+IDI1Nikge1xuICAgICAgICAgICAgLy8gd2UnbGwgcnVuIG91dCBvZiBmcmVzaCBJRHMgc28gd2UgbmVlZCB0byBjbGVhciBhbmQgc3RhcnQgZnJvbSBzY3JhdGNoXG4gICAgICAgICAgICB0aGlzLmNsZWFyU3RlbmNpbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5zZXRDb2xvck1vZGUoQ29sb3JNb2RlLmRpc2FibGVkKTtcbiAgICAgICAgY29udGV4dC5zZXREZXB0aE1vZGUoRGVwdGhNb2RlLmRpc2FibGVkKTtcblxuICAgICAgICBjb25zdCBwcm9ncmFtID0gdGhpcy51c2VQcm9ncmFtKCdjbGlwcGluZ01hc2snKTtcblxuICAgICAgICB0aGlzLl90aWxlQ2xpcHBpbmdNYXNrSURzID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCB0aWxlSUQgb2YgdGlsZUlEcykge1xuICAgICAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUodGlsZUlEKTtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5fdGlsZUNsaXBwaW5nTWFza0lEc1t0aWxlSUQua2V5XSA9IHRoaXMubmV4dFN0ZW5jaWxJRCsrO1xuICAgICAgICAgICAgY29uc3Qge3RpbGVCb3VuZHNCdWZmZXIsIHRpbGVCb3VuZHNJbmRleEJ1ZmZlciwgdGlsZUJvdW5kc1NlZ21lbnRzfSA9IHRoaXMuZ2V0VGlsZUJvdW5kc0J1ZmZlcnModGlsZSk7XG5cbiAgICAgICAgICAgIHByb2dyYW0uZHJhdyhjb250ZXh0LCBnbC5UUklBTkdMRVMsIERlcHRoTW9kZS5kaXNhYmxlZCxcbiAgICAgICAgICAgIC8vIFRlc3RzIHdpbGwgYWx3YXlzIHBhc3MsIGFuZCByZWYgdmFsdWUgd2lsbCBiZSB3cml0dGVuIHRvIHN0ZW5jaWwgYnVmZmVyLlxuICAgICAgICAgICAgbmV3IFN0ZW5jaWxNb2RlKHtmdW5jOiBnbC5BTFdBWVMsIG1hc2s6IDB9LCBpZCwgMHhGRiwgZ2wuS0VFUCwgZ2wuS0VFUCwgZ2wuUkVQTEFDRSksXG4gICAgICAgICAgICBDb2xvck1vZGUuZGlzYWJsZWQsIEN1bGxGYWNlTW9kZS5kaXNhYmxlZCwgY2xpcHBpbmdNYXNrVW5pZm9ybVZhbHVlcyh0aWxlSUQucHJvak1hdHJpeCksXG4gICAgICAgICAgICAnJGNsaXBwaW5nJywgdGlsZUJvdW5kc0J1ZmZlcixcbiAgICAgICAgICAgIHRpbGVCb3VuZHNJbmRleEJ1ZmZlciwgdGlsZUJvdW5kc1NlZ21lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0ZW5jaWxNb2RlRm9yM0QoKTogU3RlbmNpbE1vZGUge1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGVuY2lsU291cmNlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmICh0aGlzLm5leHRTdGVuY2lsSUQgKyAxID4gMjU2KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU3RlbmNpbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLm5leHRTdGVuY2lsSUQrKztcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIHJldHVybiBuZXcgU3RlbmNpbE1vZGUoe2Z1bmM6IGdsLk5PVEVRVUFMLCBtYXNrOiAweEZGfSwgaWQsIDB4RkYsIGdsLktFRVAsIGdsLktFRVAsIGdsLlJFUExBQ0UpO1xuICAgIH1cblxuICAgIHN0ZW5jaWxNb2RlRm9yQ2xpcHBpbmcodGlsZUlEOiBPdmVyc2NhbGVkVGlsZUlEKTogJFJlYWRPbmx5PFN0ZW5jaWxNb2RlPiAge1xuICAgICAgICBpZiAodGhpcy50ZXJyYWluKSByZXR1cm4gdGhpcy50ZXJyYWluLnN0ZW5jaWxNb2RlRm9yUlRUT3ZlcmxhcCh0aWxlSUQpO1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuY29udGV4dC5nbDtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGVuY2lsTW9kZSh7ZnVuYzogZ2wuRVFVQUwsIG1hc2s6IDB4RkZ9LCB0aGlzLl90aWxlQ2xpcHBpbmdNYXNrSURzW3RpbGVJRC5rZXldLCAweDAwLCBnbC5LRUVQLCBnbC5LRUVQLCBnbC5SRVBMQUNFKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFNvcnQgY29vcmRpbmF0ZXMgYnkgWiBhcyBkcmF3aW5nIHRpbGVzIGlzIGRvbmUgaW4gWi1kZXNjZW5kaW5nIG9yZGVyLlxuICAgICAqIEFsbCBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIFogd3JpdGUgdGhlIHNhbWUgc3RlbmNpbCB2YWx1ZS4gIENoaWxkcmVuXG4gICAgICogc3RlbmNpbCB2YWx1ZXMgYXJlIGdyZWF0ZXIgdGhhbiBwYXJlbnQncy4gIFRoaXMgaXMgdXNlZCBvbmx5IGZvciByYXN0ZXJcbiAgICAgKiBhbmQgcmFzdGVyLWRlbSB0aWxlcywgd2hpY2ggYXJlIGFscmVhZHkgY2xpcHBlZCB0byB0aWxlIGJvdW5kYXJpZXMsIHRvXG4gICAgICogbWFzayBhcmVhIG9mIHRpbGUgb3ZlcmxhcHBlZCBieSBjaGlsZHJlbiB0aWxlcy5cbiAgICAgKiBTdGVuY2lsIHJlZiB2YWx1ZXMgY29udGludWUgcmFuZ2UgdXNlZCBpbiBfdGlsZUNsaXBwaW5nTWFza0lEcy5cbiAgICAgKlxuICAgICAqIFJldHVybnMgW1N0ZW5jaWxNb2RlIGZvciB0aWxlIG92ZXJzY2FsZVogbWFwLCBzb3J0ZWRDb29yZHNdLlxuICAgICAqL1xuICAgIHN0ZW5jaWxDb25maWdGb3JPdmVybGFwKHRpbGVJRHM6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+KTogW3tbXzogbnVtYmVyXTogJFJlYWRPbmx5PFN0ZW5jaWxNb2RlPn0sIEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+XSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICBjb25zdCBjb29yZHMgPSB0aWxlSURzLnNvcnQoKGEsIGIpID0+IGIub3ZlcnNjYWxlZFogLSBhLm92ZXJzY2FsZWRaKTtcbiAgICAgICAgY29uc3QgbWluVGlsZVogPSBjb29yZHNbY29vcmRzLmxlbmd0aCAtIDFdLm92ZXJzY2FsZWRaO1xuICAgICAgICBjb25zdCBzdGVuY2lsVmFsdWVzID0gY29vcmRzWzBdLm92ZXJzY2FsZWRaIC0gbWluVGlsZVogKyAxO1xuICAgICAgICBpZiAoc3RlbmNpbFZhbHVlcyA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZW5jaWxTb3VyY2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5uZXh0U3RlbmNpbElEICsgc3RlbmNpbFZhbHVlcyA+IDI1Nikge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB6VG9TdGVuY2lsTW9kZSA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGVuY2lsVmFsdWVzOyBpKyspIHtcbiAgICAgICAgICAgICAgICB6VG9TdGVuY2lsTW9kZVtpICsgbWluVGlsZVpdID0gbmV3IFN0ZW5jaWxNb2RlKHtmdW5jOiBnbC5HRVFVQUwsIG1hc2s6IDB4RkZ9LCBpICsgdGhpcy5uZXh0U3RlbmNpbElELCAweEZGLCBnbC5LRUVQLCBnbC5LRUVQLCBnbC5SRVBMQUNFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmV4dFN0ZW5jaWxJRCArPSBzdGVuY2lsVmFsdWVzO1xuICAgICAgICAgICAgcmV0dXJuIFt6VG9TdGVuY2lsTW9kZSwgY29vcmRzXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3tbbWluVGlsZVpdOiBTdGVuY2lsTW9kZS5kaXNhYmxlZH0sIGNvb3Jkc107XG4gICAgfVxuXG4gICAgY29sb3JNb2RlRm9yUmVuZGVyUGFzcygpOiAkUmVhZE9ubHk8Q29sb3JNb2RlPiB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICBpZiAodGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yKSB7XG4gICAgICAgICAgICBjb25zdCBudW1PdmVyZHJhd1N0ZXBzID0gODtcbiAgICAgICAgICAgIGNvbnN0IGEgPSAxIC8gbnVtT3ZlcmRyYXdTdGVwcztcblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck1vZGUoW2dsLkNPTlNUQU5UX0NPTE9SLCBnbC5PTkVdLCBuZXcgQ29sb3IoYSwgYSwgYSwgMCksIFt0cnVlLCB0cnVlLCB0cnVlLCB0cnVlXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZW5kZXJQYXNzID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgcmV0dXJuIENvbG9yTW9kZS51bmJsZW5kZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gQ29sb3JNb2RlLmFscGhhQmxlbmRlZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlcHRoTW9kZUZvclN1YmxheWVyKG46IG51bWJlciwgbWFzazogRGVwdGhNYXNrVHlwZSwgZnVuYzogP0RlcHRoRnVuY1R5cGUpOiAkUmVhZE9ubHk8RGVwdGhNb2RlPiB7XG4gICAgICAgIGlmICghdGhpcy5vcGFxdWVQYXNzRW5hYmxlZEZvckxheWVyKCkpIHJldHVybiBEZXB0aE1vZGUuZGlzYWJsZWQ7XG4gICAgICAgIGNvbnN0IGRlcHRoID0gMSAtICgoMSArIHRoaXMuY3VycmVudExheWVyKSAqIHRoaXMubnVtU3VibGF5ZXJzICsgbikgKiB0aGlzLmRlcHRoRXBzaWxvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBEZXB0aE1vZGUoZnVuYyB8fCB0aGlzLmNvbnRleHQuZ2wuTEVRVUFMLCBtYXNrLCBbZGVwdGgsIGRlcHRoXSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUaGUgb3BhcXVlIHBhc3MgYW5kIDNEIGxheWVycyBib3RoIHVzZSB0aGUgZGVwdGggYnVmZmVyLlxuICAgICAqIExheWVycyBkcmF3biBhYm92ZSAzRCBsYXllcnMgbmVlZCB0byBiZSBkcmF3biB1c2luZyB0aGVcbiAgICAgKiBwYWludGVyJ3MgYWxnb3JpdGhtIHNvIHRoYXQgdGhleSBhcHBlYXIgYWJvdmUgM0QgZmVhdHVyZXMuXG4gICAgICogVGhpcyByZXR1cm5zIHRydWUgZm9yIGxheWVycyB0aGF0IGNhbiBiZSBkcmF3biB1c2luZyB0aGVcbiAgICAgKiBvcGFxdWUgcGFzcy5cbiAgICAgKi9cbiAgICBvcGFxdWVQYXNzRW5hYmxlZEZvckxheWVyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50TGF5ZXIgPCB0aGlzLm9wYXF1ZVBhc3NDdXRvZmY7XG4gICAgfVxuXG4gICAgcmVuZGVyKHN0eWxlOiBTdHlsZSwgb3B0aW9uczogUGFpbnRlck9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIHRoaXMubGluZUF0bGFzID0gc3R5bGUubGluZUF0bGFzO1xuICAgICAgICB0aGlzLmltYWdlTWFuYWdlciA9IHN0eWxlLmltYWdlTWFuYWdlcjtcbiAgICAgICAgdGhpcy5nbHlwaE1hbmFnZXIgPSBzdHlsZS5nbHlwaE1hbmFnZXI7XG5cbiAgICAgICAgdGhpcy5zeW1ib2xGYWRlQ2hhbmdlID0gc3R5bGUucGxhY2VtZW50LnN5bWJvbEZhZGVDaGFuZ2UoYnJvd3Nlci5ub3coKSk7XG5cbiAgICAgICAgdGhpcy5pbWFnZU1hbmFnZXIuYmVnaW5GcmFtZSgpO1xuXG4gICAgICAgIGNvbnN0IGxheWVySWRzID0gdGhpcy5zdHlsZS5vcmRlcjtcbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5zdHlsZS5fc291cmNlQ2FjaGVzO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHNvdXJjZUNhY2hlc1tpZF07XG4gICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUudXNlZCkge1xuICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlLnByZXBhcmUodGhpcy5jb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvb3Jkc0FzY2VuZGluZzoge1tfOiBzdHJpbmddOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPn0gPSB7fTtcbiAgICAgICAgY29uc3QgY29vcmRzRGVzY2VuZGluZzoge1tfOiBzdHJpbmddOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPn0gPSB7fTtcbiAgICAgICAgY29uc3QgY29vcmRzRGVzY2VuZGluZ1N5bWJvbDoge1tfOiBzdHJpbmddOiBBcnJheTxPdmVyc2NhbGVkVGlsZUlEPn0gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICAgICAgY29vcmRzQXNjZW5kaW5nW2lkXSA9IHNvdXJjZUNhY2hlLmdldFZpc2libGVDb29yZGluYXRlcygpO1xuICAgICAgICAgICAgY29vcmRzRGVzY2VuZGluZ1tpZF0gPSBjb29yZHNBc2NlbmRpbmdbaWRdLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgICAgICAgICAgY29vcmRzRGVzY2VuZGluZ1N5bWJvbFtpZF0gPSBzb3VyY2VDYWNoZS5nZXRWaXNpYmxlQ29vcmRpbmF0ZXModHJ1ZSkucmV2ZXJzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vcGFxdWVQYXNzQ3V0b2ZmID0gSW5maW5pdHk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVySWQgPSBsYXllcklkc1tpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZF0uaXMzRCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGFxdWVQYXNzQ3V0b2ZmID0gaTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRlcnJhaW4pIHtcbiAgICAgICAgICAgIHRoaXMudGVycmFpbi51cGRhdGVUaWxlQmluZGluZyhjb29yZHNEZXNjZW5kaW5nU3ltYm9sKTtcbiAgICAgICAgICAgIC8vIEFsbCByZW5kZXIgdG8gdGV4dHVyZSBpcyBkb25lIGluIHRyYW5zbHVjZW50IHBhc3MgdG8gcmVtb3ZlIG5lZWRcbiAgICAgICAgICAgIC8vIGZvciBkZXB0aCBidWZmZXIgYWxsb2NhdGlvbiBwZXIgdGlsZS5cbiAgICAgICAgICAgIHRoaXMub3BhcXVlUGFzc0N1dG9mZiA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnICYmICF0aGlzLmdsb2JlU2hhcmVkQnVmZmVycykge1xuICAgICAgICAgICAgdGhpcy5nbG9iZVNoYXJlZEJ1ZmZlcnMgPSBuZXcgR2xvYmVTaGFyZWRCdWZmZXJzKHRoaXMuY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb2xsb3dpbmcgbGluZSBpcyBiaWxsaW5nIHJlbGF0ZWQgY29kZS4gRG8gbm90IGNoYW5nZS4gU2VlIExJQ0VOU0UudHh0XG4gICAgICAgIGlmICghaXNNYXBBdXRoZW50aWNhdGVkKHRoaXMuY29udGV4dC5nbCkpIHJldHVybjtcblxuICAgICAgICAvLyBPZmZzY3JlZW4gcGFzcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBXZSBmaXJzdCBkbyBhbGwgcmVuZGVyaW5nIHRoYXQgcmVxdWlyZXMgcmVuZGVyaW5nIHRvIGEgc2VwYXJhdGVcbiAgICAgICAgLy8gZnJhbWVidWZmZXIsIGFuZCB0aGVuIHNhdmUgdGhvc2UgZm9yIHJlbmRlcmluZyBiYWNrIHRvIHRoZSBtYXBcbiAgICAgICAgLy8gbGF0ZXI6IGluIGRvaW5nIHRoaXMgd2UgYXZvaWQgZG9pbmcgZXhwZW5zaXZlIGZyYW1lYnVmZmVyIHJlc3RvcmVzLlxuICAgICAgICB0aGlzLnJlbmRlclBhc3MgPSAnb2Zmc2NyZWVuJztcblxuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgbGF5ZXJJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5zdHlsZS5fbGF5ZXJzW2xheWVySWRdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzdHlsZS5fZ2V0TGF5ZXJTb3VyY2VDYWNoZShsYXllcik7XG4gICAgICAgICAgICBpZiAoIWxheWVyLmhhc09mZnNjcmVlblBhc3MoKSB8fCBsYXllci5pc0hpZGRlbih0aGlzLnRyYW5zZm9ybS56b29tKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IHNvdXJjZUNhY2hlID8gY29vcmRzRGVzY2VuZGluZ1tzb3VyY2VDYWNoZS5pZF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoIShsYXllci50eXBlID09PSAnY3VzdG9tJyB8fCBsYXllci5pc1NreSgpKSAmJiAhKGNvb3JkcyAmJiBjb29yZHMubGVuZ3RoKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyTGF5ZXIodGhpcywgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZXB0aFJhbmdlRm9yM0QgPSBbMCwgMSAtICgoc3R5bGUub3JkZXIubGVuZ3RoICsgMikgKiB0aGlzLm51bVN1YmxheWVycyAqIHRoaXMuZGVwdGhFcHNpbG9uKV07XG5cbiAgICAgICAgLy8gVGVycmFpbiBkZXB0aCBvZmZzY3JlZW4gcmVuZGVyIHBhc3MgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gV2l0aCB0ZXJyYWluIG9uLCByZW5kZXJzIHRoZSBkZXB0aCBidWZmZXIgaW50byBhIHRleHR1cmUuXG4gICAgICAgIC8vIFRoaXMgdGV4dHVyZSBpcyB1c2VkIGZvciBvY2NsdXNpb24gdGVzdGluZyAobGFiZWxzKVxuICAgICAgICBpZiAodGhpcy50ZXJyYWluICYmICh0aGlzLnN0eWxlLmhhc1N5bWJvbExheWVycygpIHx8IHRoaXMuc3R5bGUuaGFzQ2lyY2xlTGF5ZXJzKCkpKSB7XG4gICAgICAgICAgICB0aGlzLnRlcnJhaW4uZHJhd0RlcHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWJpbmQgdGhlIG1haW4gZnJhbWVidWZmZXIgbm93IHRoYXQgYWxsIG9mZnNjcmVlbiBsYXllcnMgaGF2ZSBiZWVuIHJlbmRlcmVkOlxuICAgICAgICB0aGlzLmNvbnRleHQuYmluZEZyYW1lYnVmZmVyLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdKTtcblxuICAgICAgICAvLyBDbGVhciBidWZmZXJzIGluIHByZXBhcmF0aW9uIGZvciBkcmF3aW5nIHRvIHRoZSBtYWluIGZyYW1lYnVmZmVyXG4gICAgICAgIHRoaXMuY29udGV4dC5jbGVhcih7Y29sb3I6IG9wdGlvbnMuc2hvd092ZXJkcmF3SW5zcGVjdG9yID8gQ29sb3IuYmxhY2sgOiBDb2xvci50cmFuc3BhcmVudCwgZGVwdGg6IDF9KTtcbiAgICAgICAgdGhpcy5jbGVhclN0ZW5jaWwoKTtcblxuICAgICAgICB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPSBvcHRpb25zLnNob3dPdmVyZHJhd0luc3BlY3RvcjtcblxuICAgICAgICAvLyBPcGFxdWUgcGFzcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBEcmF3IG9wYXF1ZSBsYXllcnMgdG9wLXRvLWJvdHRvbSBmaXJzdC5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzID0gJ29wYXF1ZSc7XG5cbiAgICAgICAgaWYgKCF0aGlzLnRlcnJhaW4pIHtcbiAgICAgICAgICAgIGZvciAodGhpcy5jdXJyZW50TGF5ZXIgPSBsYXllcklkcy5sZW5ndGggLSAxOyB0aGlzLmN1cnJlbnRMYXllciA+PSAwOyB0aGlzLmN1cnJlbnRMYXllci0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZHNbdGhpcy5jdXJyZW50TGF5ZXJdXTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VDYWNoZSA9IHN0eWxlLl9nZXRMYXllclNvdXJjZUNhY2hlKGxheWVyKTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIuaXNTa3koKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29vcmRzID0gc291cmNlQ2FjaGUgPyBjb29yZHNEZXNjZW5kaW5nW3NvdXJjZUNhY2hlLmlkXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKGxheWVyLCBzb3VyY2VDYWNoZSwgY29vcmRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckxheWVyKHRoaXMsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlLmZvZyAmJiB0aGlzLnRyYW5zZm9ybS5wcm9qZWN0aW9uLnN1cHBvcnRzRm9nKSB7XG4gICAgICAgICAgICBkcmF3QXRtb3NwaGVyZSh0aGlzLCB0aGlzLnN0eWxlLmZvZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa3kgcGFzcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gRHJhdyBhbGwgc2t5IGxheWVycyBib3R0b20gdG8gdG9wLlxuICAgICAgICAvLyBUaGV5IGFyZSBkcmF3biBhdCBtYXggZGVwdGgsIHRoZXkgYXJlIGRyYXduIGFmdGVyIG9wYXF1ZSBhbmQgYmVmb3JlXG4gICAgICAgIC8vIHRyYW5zbHVjZW50IHRvIGZhaWwgZGVwdGggdGVzdGluZyBhbmQgbWl4IHdpdGggdHJhbnNsdWNlbnQgb2JqZWN0cy5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzID0gJ3NreSc7XG4gICAgICAgIGNvbnN0IGlzVHJhbnNpdGlvbmluZyA9IGdsb2JlVG9NZXJjYXRvclRyYW5zaXRpb24odGhpcy50cmFuc2Zvcm0uem9vbSkgPiAwLjA7XG4gICAgICAgIGlmICgoaXNUcmFuc2l0aW9uaW5nIHx8IHRoaXMudHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSAhPT0gJ2dsb2JlJykgJiYgdGhpcy50cmFuc2Zvcm0uaXNIb3Jpem9uVmlzaWJsZSgpKSB7XG4gICAgICAgICAgICBmb3IgKHRoaXMuY3VycmVudExheWVyID0gMDsgdGhpcy5jdXJyZW50TGF5ZXIgPCBsYXllcklkcy5sZW5ndGg7IHRoaXMuY3VycmVudExheWVyKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuc3R5bGUuX2xheWVyc1tsYXllcklkc1t0aGlzLmN1cnJlbnRMYXllcl1dO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc3R5bGUuX2dldExheWVyU291cmNlQ2FjaGUobGF5ZXIpO1xuICAgICAgICAgICAgICAgIGlmICghbGF5ZXIuaXNTa3koKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29vcmRzID0gc291cmNlQ2FjaGUgPyBjb29yZHNEZXNjZW5kaW5nW3NvdXJjZUNhY2hlLmlkXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyTGF5ZXIodGhpcywgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhbnNsdWNlbnQgcGFzcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBEcmF3IGFsbCBvdGhlciBsYXllcnMgYm90dG9tLXRvLXRvcC5cbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzID0gJ3RyYW5zbHVjZW50JztcblxuICAgICAgICB0aGlzLmN1cnJlbnRMYXllciA9IDA7XG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRMYXllciA8IGxheWVySWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZHNbdGhpcy5jdXJyZW50TGF5ZXJdXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc3R5bGUuX2dldExheWVyU291cmNlQ2FjaGUobGF5ZXIpO1xuXG4gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRyYXcgaW4gdHJhbnNsdWNlbnQgcGFzcyBmb3Igc2t5IGxheWVycywgYWR2YW5jZVxuICAgICAgICAgICAgaWYgKGxheWVyLmlzU2t5KCkpIHtcbiAgICAgICAgICAgICAgICArK3RoaXMuY3VycmVudExheWVyO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXaXRoIHRlcnJhaW4gb24gYW5kIGZvciBkcmFwZWQgbGF5ZXJzIG9ubHksIGlzc3VlIHJlbmRlcmluZyBhbmQgcHJvZ3Jlc3NcbiAgICAgICAgICAgIC8vIHRoaXMuY3VycmVudExheWVyIHVudGlsIHRoZSBuZXh0IG5vbi1kcmFwZWQgbGF5ZXIuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgaW50ZXJsZWF2ZSB0ZXJyYWluIGRyYXBlZCByZW5kZXIgd2l0aCBub24tZHJhcGVkIGxheWVycyBvbiB0b3BcbiAgICAgICAgICAgIGlmICh0aGlzLnRlcnJhaW4gJiYgdGhpcy5zdHlsZS5pc0xheWVyRHJhcGVkKGxheWVyKSkge1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5pc0hpZGRlbih0aGlzLnRyYW5zZm9ybS56b29tKSkge1xuICAgICAgICAgICAgICAgICAgICArK3RoaXMuY3VycmVudExheWVyO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdGVycmFpbiA9ICgoKHRoaXMudGVycmFpbik6IGFueSk6IFRlcnJhaW4pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZMYXllciA9IHRoaXMuY3VycmVudExheWVyO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExheWVyID0gdGVycmFpbi5yZW5kZXJCYXRjaCh0aGlzLmN1cnJlbnRMYXllcik7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHRoaXMuY29udGV4dC5iaW5kRnJhbWVidWZmZXIuY3VycmVudCA9PT0gbnVsbCk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHRoaXMuY3VycmVudExheWVyID4gcHJldkxheWVyKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yIHN5bWJvbCBsYXllcnMgaW4gdGhlIHRyYW5zbHVjZW50IHBhc3MsIHdlIGFkZCBleHRyYSB0aWxlcyB0byB0aGUgcmVuZGVyYWJsZSBzZXRcbiAgICAgICAgICAgIC8vIGZvciBjcm9zcy10aWxlIHN5bWJvbCBmYWRpbmcuIFN5bWJvbCBsYXllcnMgZG9uJ3QgdXNlIHRpbGUgY2xpcHBpbmcsIHNvIG5vIG5lZWQgdG8gcmVuZGVyXG4gICAgICAgICAgICAvLyBzZXBhcmF0ZSBjbGlwcGluZyBtYXNrc1xuICAgICAgICAgICAgY29uc3QgY29vcmRzID0gc291cmNlQ2FjaGUgP1xuICAgICAgICAgICAgICAgIChsYXllci50eXBlID09PSAnc3ltYm9sJyA/IGNvb3Jkc0Rlc2NlbmRpbmdTeW1ib2wgOiBjb29yZHNEZXNjZW5kaW5nKVtzb3VyY2VDYWNoZS5pZF0gOlxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyVGlsZUNsaXBwaW5nTWFza3MobGF5ZXIsIHNvdXJjZUNhY2hlLCBzb3VyY2VDYWNoZSA/IGNvb3Jkc0FzY2VuZGluZ1tzb3VyY2VDYWNoZS5pZF0gOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJMYXllcih0aGlzLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3Jkcyk7XG5cbiAgICAgICAgICAgICsrdGhpcy5jdXJyZW50TGF5ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50ZXJyYWluKSB7XG4gICAgICAgICAgICB0aGlzLnRlcnJhaW4ucG9zdFJlbmRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VGlsZUJvdW5kYXJpZXMgfHwgdGhpcy5vcHRpb25zLnNob3dRdWVyeUdlb21ldHJ5KSB7XG4gICAgICAgICAgICAvL1VzZSBzb3VyY2Ugd2l0aCBoaWdoZXN0IG1heHpvb21cbiAgICAgICAgICAgIGxldCBzZWxlY3RlZFNvdXJjZSA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBsYXllcnMgPSB2YWx1ZXModGhpcy5zdHlsZS5fbGF5ZXJzKTtcbiAgICAgICAgICAgIGxheWVycy5mb3JFYWNoKChsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gc3R5bGUuX2dldExheWVyU291cmNlQ2FjaGUobGF5ZXIpO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZSAmJiAhbGF5ZXIuaXNIaWRkZW4odGhpcy50cmFuc2Zvcm0uem9vbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFNvdXJjZSB8fCAoc2VsZWN0ZWRTb3VyY2UuZ2V0U291cmNlKCkubWF4em9vbSA8IHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLm1heHpvb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNvdXJjZSA9IHNvdXJjZUNhY2hlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dUaWxlQm91bmRhcmllcykge1xuICAgICAgICAgICAgICAgICAgICBkcmF3LmRlYnVnKHRoaXMsIHNlbGVjdGVkU291cmNlLCBzZWxlY3RlZFNvdXJjZS5nZXRWaXNpYmxlQ29vcmRpbmF0ZXMoKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgRGVidWcucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93UXVlcnlHZW9tZXRyeSAmJiBzZWxlY3RlZFNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0RlYnVnUXVlcnlHZW9tZXRyeSh0aGlzLCBzZWxlY3RlZFNvdXJjZSwgc2VsZWN0ZWRTb3VyY2UuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dQYWRkaW5nKSB7XG4gICAgICAgICAgICBkcmF3RGVidWdQYWRkaW5nKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGRlZmF1bHRzIGZvciBtb3N0IEdMIHZhbHVlcyBzbyB0aGF0IGFueW9uZSB1c2luZyB0aGUgc3RhdGUgYWZ0ZXIgdGhlIHJlbmRlclxuICAgICAgICAvLyBlbmNvdW50ZXJzIG1vcmUgZXhwZWN0ZWQgdmFsdWVzLlxuICAgICAgICB0aGlzLmNvbnRleHQuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmZyYW1lQ291bnRlciA9ICh0aGlzLmZyYW1lQ291bnRlciArIDEpICUgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG5cbiAgICAgICAgaWYgKHRoaXMudGlsZUxvYWRlZCAmJiB0aGlzLm9wdGlvbnMuc3BlZWRJbmRleFRpbWluZykge1xuICAgICAgICAgICAgdGhpcy5sb2FkVGltZVN0YW1wcy5wdXNoKHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSk7XG4gICAgICAgICAgICB0aGlzLnNhdmVDYW52YXNDb3B5KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJMYXllcihwYWludGVyOiBQYWludGVyLCBzb3VyY2VDYWNoZT86IFNvdXJjZUNhY2hlLCBsYXllcjogU3R5bGVMYXllciwgY29vcmRzPzogQXJyYXk8T3ZlcnNjYWxlZFRpbGVJRD4pIHtcbiAgICAgICAgaWYgKGxheWVyLmlzSGlkZGVuKHRoaXMudHJhbnNmb3JtLnpvb20pKSByZXR1cm47XG4gICAgICAgIGlmIChsYXllci50eXBlICE9PSAnYmFja2dyb3VuZCcgJiYgbGF5ZXIudHlwZSAhPT0gJ3NreScgJiYgbGF5ZXIudHlwZSAhPT0gJ2N1c3RvbScgJiYgIShjb29yZHMgJiYgY29vcmRzLmxlbmd0aCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5pZCA9IGxheWVyLmlkO1xuXG4gICAgICAgIHRoaXMuZ3B1VGltaW5nU3RhcnQobGF5ZXIpO1xuICAgICAgICBpZiAoIXBhaW50ZXIudHJhbnNmb3JtLnByb2plY3Rpb24udW5zdXBwb3J0ZWRMYXllcnMgfHwgIXBhaW50ZXIudHJhbnNmb3JtLnByb2plY3Rpb24udW5zdXBwb3J0ZWRMYXllcnMuaW5jbHVkZXMobGF5ZXIudHlwZSkpIHtcbiAgICAgICAgICAgIGRyYXdbbGF5ZXIudHlwZV0ocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIHRoaXMuc3R5bGUucGxhY2VtZW50LnZhcmlhYmxlT2Zmc2V0cywgdGhpcy5vcHRpb25zLmlzSW5pdGlhbExvYWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ3B1VGltaW5nRW5kKCk7XG4gICAgfVxuXG4gICAgZ3B1VGltaW5nU3RhcnQobGF5ZXI6IFN0eWxlTGF5ZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3B1VGltaW5nKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuY29udGV4dC5leHRUaW1lclF1ZXJ5O1xuICAgICAgICAvLyBUaGlzIHRyaWVzIHRvIHRpbWUgdGhlIGRyYXcgY2FsbCBpdHNlbGYsIGJ1dCBub3RlIHRoYXQgdGhlIGNvc3QgZm9yIGRyYXdpbmcgYSBsYXllclxuICAgICAgICAvLyBtYXkgYmUgZG9taW5hdGVkIGJ5IHRoZSBjb3N0IG9mIHVwbG9hZGluZyB2ZXJ0aWNlcyB0byB0aGUgR1BVLlxuICAgICAgICAvLyBUbyBpbnN0cnVtZW50IHRoYXQsIHdlJ2QgbmVlZCB0byBwYXNzIHRoZSBsYXllclRpbWVycyBvYmplY3QgZG93biBpbnRvIHRoZSBidWNrZXRcbiAgICAgICAgLy8gdXBsb2FkaW5nIGxvZ2ljLlxuICAgICAgICBsZXQgbGF5ZXJUaW1lciA9IHRoaXMuZ3B1VGltZXJzW2xheWVyLmlkXTtcbiAgICAgICAgaWYgKCFsYXllclRpbWVyKSB7XG4gICAgICAgICAgICBsYXllclRpbWVyID0gdGhpcy5ncHVUaW1lcnNbbGF5ZXIuaWRdID0ge1xuICAgICAgICAgICAgICAgIGNhbGxzOiAwLFxuICAgICAgICAgICAgICAgIGNwdVRpbWU6IDAsXG4gICAgICAgICAgICAgICAgcXVlcnk6IGV4dC5jcmVhdGVRdWVyeUVYVCgpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGxheWVyVGltZXIuY2FsbHMrKztcbiAgICAgICAgZXh0LmJlZ2luUXVlcnlFWFQoZXh0LlRJTUVfRUxBUFNFRF9FWFQsIGxheWVyVGltZXIucXVlcnkpO1xuICAgIH1cblxuICAgIGdwdVRpbWluZ0RlZmVycmVkUmVuZGVyU3RhcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3B1VGltaW5nRGVmZXJyZWRSZW5kZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuY29udGV4dC5leHRUaW1lclF1ZXJ5O1xuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSBleHQuY3JlYXRlUXVlcnlFWFQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVmZXJyZWRSZW5kZXJHcHVUaW1lUXVlcmllcy5wdXNoKHF1ZXJ5KTtcbiAgICAgICAgICAgIGV4dC5iZWdpblF1ZXJ5RVhUKGV4dC5USU1FX0VMQVBTRURfRVhULCBxdWVyeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBncHVUaW1pbmdEZWZlcnJlZFJlbmRlckVuZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZ3B1VGltaW5nRGVmZXJyZWRSZW5kZXIpIHJldHVybjtcbiAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5jb250ZXh0LmV4dFRpbWVyUXVlcnk7XG4gICAgICAgIGV4dC5lbmRRdWVyeUVYVChleHQuVElNRV9FTEFQU0VEX0VYVCk7XG4gICAgfVxuXG4gICAgZ3B1VGltaW5nRW5kKCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncHVUaW1pbmcpIHJldHVybjtcbiAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5jb250ZXh0LmV4dFRpbWVyUXVlcnk7XG4gICAgICAgIGV4dC5lbmRRdWVyeUVYVChleHQuVElNRV9FTEFQU0VEX0VYVCk7XG4gICAgfVxuXG4gICAgY29sbGVjdEdwdVRpbWVycygpOiBHUFVUaW1lcnMge1xuICAgICAgICBjb25zdCBjdXJyZW50TGF5ZXJUaW1lcnMgPSB0aGlzLmdwdVRpbWVycztcbiAgICAgICAgdGhpcy5ncHVUaW1lcnMgPSB7fTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRMYXllclRpbWVycztcbiAgICB9XG5cbiAgICBjb2xsZWN0RGVmZXJyZWRSZW5kZXJHcHVRdWVyaWVzKCk6IEFycmF5PGFueT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50UXVlcmllcyA9IHRoaXMuZGVmZXJyZWRSZW5kZXJHcHVUaW1lUXVlcmllcztcbiAgICAgICAgdGhpcy5kZWZlcnJlZFJlbmRlckdwdVRpbWVRdWVyaWVzID0gW107XG4gICAgICAgIHJldHVybiBjdXJyZW50UXVlcmllcztcbiAgICB9XG5cbiAgICBxdWVyeUdwdVRpbWVycyhncHVUaW1lcnM6IEdQVVRpbWVycyk6IHtbbGF5ZXJJZDogc3RyaW5nXTogbnVtYmVyfSB7XG4gICAgICAgIGNvbnN0IGxheWVycyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgaW4gZ3B1VGltZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBncHVUaW1lciA9IGdwdVRpbWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuY29udGV4dC5leHRUaW1lclF1ZXJ5O1xuICAgICAgICAgICAgY29uc3QgZ3B1VGltZSA9IGV4dC5nZXRRdWVyeU9iamVjdEVYVChncHVUaW1lci5xdWVyeSwgZXh0LlFVRVJZX1JFU1VMVF9FWFQpIC8gKDEwMDAgKiAxMDAwKTtcbiAgICAgICAgICAgIGV4dC5kZWxldGVRdWVyeUVYVChncHVUaW1lci5xdWVyeSk7XG4gICAgICAgICAgICBsYXllcnNbbGF5ZXJJZF0gPSAoZ3B1VGltZTogbnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5ZXJzO1xuICAgIH1cblxuICAgIHF1ZXJ5R3B1VGltZURlZmVycmVkUmVuZGVyKGdwdVF1ZXJpZXM6IEFycmF5PGFueT4pOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5ncHVUaW1pbmdEZWZlcnJlZFJlbmRlcikgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuY29udGV4dC5leHRUaW1lclF1ZXJ5O1xuXG4gICAgICAgIGxldCBncHVUaW1lID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBxdWVyeSBvZiBncHVRdWVyaWVzKSB7XG4gICAgICAgICAgICBncHVUaW1lICs9IGV4dC5nZXRRdWVyeU9iamVjdEVYVChxdWVyeSwgZXh0LlFVRVJZX1JFU1VMVF9FWFQpIC8gKDEwMDAgKiAxMDAwKTtcbiAgICAgICAgICAgIGV4dC5kZWxldGVRdWVyeUVYVChxdWVyeSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ3B1VGltZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gYSBtYXRyaXggdG8gaW5jb3Jwb3JhdGUgdGhlICotdHJhbnNsYXRlIGFuZCAqLXRyYW5zbGF0ZS1hbmNob3IgcHJvcGVydGllcyBpbnRvIGl0LlxuICAgICAqIEBwYXJhbSBpblZpZXdwb3J0UGl4ZWxVbml0c1VuaXRzIFRydWUgd2hlbiB0aGUgdW5pdHMgYWNjZXB0ZWQgYnkgdGhlIG1hdHJpeCBhcmUgaW4gdmlld3BvcnQgcGl4ZWxzIGluc3RlYWQgb2YgdGlsZSB1bml0cy5cbiAgICAgKiBAcmV0dXJucyB7RmxvYXQzMkFycmF5fSBtYXRyaXhcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRyYW5zbGF0ZVBvc01hdHJpeChtYXRyaXg6IEZsb2F0MzJBcnJheSwgdGlsZTogVGlsZSwgdHJhbnNsYXRlOiBbbnVtYmVyLCBudW1iZXJdLCB0cmFuc2xhdGVBbmNob3I6ICdtYXAnIHwgJ3ZpZXdwb3J0JywgaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cz86IGJvb2xlYW4pOiBGbG9hdDMyQXJyYXkge1xuICAgICAgICBpZiAoIXRyYW5zbGF0ZVswXSAmJiAhdHJhbnNsYXRlWzFdKSByZXR1cm4gbWF0cml4O1xuXG4gICAgICAgIGNvbnN0IGFuZ2xlID0gaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cyA/XG4gICAgICAgICAgICAodHJhbnNsYXRlQW5jaG9yID09PSAnbWFwJyA/IHRoaXMudHJhbnNmb3JtLmFuZ2xlIDogMCkgOlxuICAgICAgICAgICAgKHRyYW5zbGF0ZUFuY2hvciA9PT0gJ3ZpZXdwb3J0JyA/IC10aGlzLnRyYW5zZm9ybS5hbmdsZSA6IDApO1xuXG4gICAgICAgIGlmIChhbmdsZSkge1xuICAgICAgICAgICAgY29uc3Qgc2luQSA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgICAgIGNvbnN0IGNvc0EgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgICAgICB0cmFuc2xhdGUgPSBbXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlWzBdICogY29zQSAtIHRyYW5zbGF0ZVsxXSAqIHNpbkEsXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlWzBdICogc2luQSArIHRyYW5zbGF0ZVsxXSAqIGNvc0FcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IFtcbiAgICAgICAgICAgIGluVmlld3BvcnRQaXhlbFVuaXRzVW5pdHMgPyB0cmFuc2xhdGVbMF0gOiBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCB0cmFuc2xhdGVbMF0sIHRoaXMudHJhbnNmb3JtLnpvb20pLFxuICAgICAgICAgICAgaW5WaWV3cG9ydFBpeGVsVW5pdHNVbml0cyA/IHRyYW5zbGF0ZVsxXSA6IHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIHRyYW5zbGF0ZVsxXSwgdGhpcy50cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICAgICAwXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZE1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0cmFuc2xhdGVkTWF0cml4LCBtYXRyaXgsIHRyYW5zbGF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWRNYXRyaXg7XG4gICAgfVxuXG4gICAgc2F2ZVRpbGVUZXh0dXJlKHRleHR1cmU6IFRleHR1cmUpIHtcbiAgICAgICAgY29uc3QgdGV4dHVyZXMgPSB0aGlzLl90aWxlVGV4dHVyZXNbdGV4dHVyZS5zaXplWzBdXTtcbiAgICAgICAgaWYgKCF0ZXh0dXJlcykge1xuICAgICAgICAgICAgdGhpcy5fdGlsZVRleHR1cmVzW3RleHR1cmUuc2l6ZVswXV0gPSBbdGV4dHVyZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0dXJlcy5wdXNoKHRleHR1cmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0VGlsZVRleHR1cmUoc2l6ZTogbnVtYmVyKTogbnVsbCB8IFRleHR1cmUge1xuICAgICAgICBjb25zdCB0ZXh0dXJlcyA9IHRoaXMuX3RpbGVUZXh0dXJlc1tzaXplXTtcbiAgICAgICAgcmV0dXJuIHRleHR1cmVzICYmIHRleHR1cmVzLmxlbmd0aCA+IDAgPyB0ZXh0dXJlcy5wb3AoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgYSBwYXR0ZXJuIGltYWdlIGlzIG5lZWRlZCwgYW5kIGlmIGl0IGlzLCB3aGV0aGVyIGl0IGlzIG5vdCBsb2FkZWQuXG4gICAgICpcbiogQHJldHVybnMgdHJ1ZSBpZiBhIG5lZWRlZCBpbWFnZSBpcyBtaXNzaW5nIGFuZCByZW5kZXJpbmcgbmVlZHMgdG8gYmUgc2tpcHBlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGlzUGF0dGVybk1pc3NpbmcoaW1hZ2U6ID9Dcm9zc0ZhZGVkPFJlc29sdmVkSW1hZ2U+KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghaW1hZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFpbWFnZS5mcm9tIHx8ICFpbWFnZS50bykgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IGltYWdlUG9zQSA9IHRoaXMuaW1hZ2VNYW5hZ2VyLmdldFBhdHRlcm4oaW1hZ2UuZnJvbS50b1N0cmluZygpKTtcbiAgICAgICAgY29uc3QgaW1hZ2VQb3NCID0gdGhpcy5pbWFnZU1hbmFnZXIuZ2V0UGF0dGVybihpbWFnZS50by50b1N0cmluZygpKTtcbiAgICAgICAgcmV0dXJuICFpbWFnZVBvc0EgfHwgIWltYWdlUG9zQjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zICNkZWZpbmVzIHRoYXQgd291bGQgbmVlZCB0byBiZSBpbmplY3RlZCBpbnRvIGV2ZXJ5IFByb2dyYW1cbiAgICAgKiBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiBQYWludGVyLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY3VycmVudEdsb2JhbERlZmluZXMoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCB0ZXJyYWluID0gdGhpcy50ZXJyYWluICYmICF0aGlzLnRlcnJhaW4ucmVuZGVyaW5nVG9UZXh0dXJlOyAvLyBFbmFibGVzIGVsZXZhdGlvbiBzYW1wbGluZyBpbiB2ZXJ0ZXggc2hhZGVyLlxuICAgICAgICBjb25zdCBydHQgPSB0aGlzLnRlcnJhaW4gJiYgdGhpcy50ZXJyYWluLnJlbmRlcmluZ1RvVGV4dHVyZTtcbiAgICAgICAgY29uc3QgZm9nID0gdGhpcy5zdHlsZSAmJiB0aGlzLnN0eWxlLmZvZztcbiAgICAgICAgY29uc3QgZGVmaW5lcyA9IFtdO1xuXG4gICAgICAgIGlmICh0ZXJyYWluKSBkZWZpbmVzLnB1c2goJ1RFUlJBSU4nKTtcbiAgICAgICAgLy8gV2hlbiB0ZXJyYWluIGlzIGFjdGl2ZSwgZm9nIGlzIHJlbmRlcmVkIGFzIHBhcnQgb2YgZHJhcGluZywgbm90IGFzIHBhcnQgb2YgdGlsZVxuICAgICAgICAvLyByZW5kZXJpbmcuIFJlbW92aW5nIHRoZSBmb2cgZmxhZyBkdXJpbmcgdGlsZSByZW5kZXJpbmcgYXZvaWRzIGFkZGl0aW9uYWwgZGVmaW5lcy5cbiAgICAgICAgaWYgKGZvZyAmJiAhcnR0ICYmIGZvZy5nZXRPcGFjaXR5KHRoaXMudHJhbnNmb3JtLnBpdGNoKSAhPT0gMC4wKSB7XG4gICAgICAgICAgICBkZWZpbmVzLnB1c2goJ0ZPRycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydHQpIGRlZmluZXMucHVzaCgnUkVOREVSX1RPX1RFWFRVUkUnKTtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvcikgZGVmaW5lcy5wdXNoKCdPVkVSRFJBV19JTlNQRUNUT1InKTtcbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG4gICAgfVxuXG4gICAgdXNlUHJvZ3JhbShuYW1lOiBzdHJpbmcsIHByb2dyYW1Db25maWd1cmF0aW9uOiA/UHJvZ3JhbUNvbmZpZ3VyYXRpb24sIGZpeGVkRGVmaW5lczogP0R5bmFtaWNEZWZpbmVzVHlwZVtdKTogUHJvZ3JhbTxhbnk+IHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IHRoaXMuY2FjaGUgfHwge307XG4gICAgICAgIGNvbnN0IGRlZmluZXMgPSAoKChmaXhlZERlZmluZXMgfHwgW10pOiBhbnkpOiBzdHJpbmdbXSk7XG5cbiAgICAgICAgY29uc3QgZ2xvYmFsRGVmaW5lcyA9IHRoaXMuY3VycmVudEdsb2JhbERlZmluZXMoKTtcbiAgICAgICAgY29uc3QgYWxsRGVmaW5lcyA9IGdsb2JhbERlZmluZXMuY29uY2F0KGRlZmluZXMpO1xuICAgICAgICBjb25zdCBrZXkgPSBQcm9ncmFtLmNhY2hlS2V5KG5hbWUsIGFsbERlZmluZXMsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcblxuICAgICAgICBpZiAoIXRoaXMuY2FjaGVba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVtrZXldID0gbmV3IFByb2dyYW0odGhpcy5jb250ZXh0LCBuYW1lLCBzaGFkZXJzW25hbWVdLCBwcm9ncmFtQ29uZmlndXJhdGlvbiwgcHJvZ3JhbVVuaWZvcm1zW25hbWVdLCBhbGxEZWZpbmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogUmVzZXQgc29tZSBHTCBzdGF0ZSB0byBkZWZhdWx0IHZhbHVlcyB0byBhdm9pZCBoYXJkLXRvLWRlYnVnIGJ1Z3NcbiAgICAgKiBpbiBjdXN0b20gbGF5ZXJzLlxuICAgICAqL1xuICAgIHNldEN1c3RvbUxheWVyRGVmYXVsdHMoKSB7XG4gICAgICAgIC8vIFByZXZlbnQgY3VzdG9tIGxheWVycyBmcm9tIHVuaW50ZW50aW9uYWxseSBtb2RpZnkgdGhlIGxhc3QgVkFPIHVzZWQuXG4gICAgICAgIC8vIEFsbCBvdGhlciBzdGF0ZSBpcyBzdGF0ZSBpcyByZXN0b3JlZCBvbiBpdCdzIG93biwgYnV0IGZvciBWQU9zIGl0J3NcbiAgICAgICAgLy8gc2ltcGxlciB0byB1bmJpbmQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHRyYWNrIHRoZSBzdGF0ZSBvZiBWQU9zLlxuICAgICAgICB0aGlzLmNvbnRleHQudW5iaW5kVkFPKCk7XG5cbiAgICAgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGlzIHN0YXRlIGlzIG1lYW5pbmdmdWwgYW5kIG9mdGVuIGV4cGVjdGVkLlxuICAgICAgICAvLyBMZWF2aW5nIHRoaXMgc3RhdGUgZGlydHkgY291bGQgY2F1c2UgYSBsb3Qgb2YgY29uZnVzaW9uIGZvciB1c2Vycy5cbiAgICAgICAgdGhpcy5jb250ZXh0LmN1bGxGYWNlLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZyb250RmFjZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5jdWxsRmFjZVNpZGUuc2V0RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNvbnRleHQuYWN0aXZlVGV4dHVyZS5zZXREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5waXhlbFN0b3JlVW5wYWNrLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tQcmVtdWx0aXBseUFscGhhLnNldERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBpeGVsU3RvcmVVbnBhY2tGbGlwWS5zZXREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBTZXQgR0wgc3RhdGUgdGhhdCBpcyBzaGFyZWQgYnkgYWxsIGxheWVycy5cbiAgICAgKi9cbiAgICBzZXRCYXNlU3RhdGUoKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICB0aGlzLmNvbnRleHQuY3VsbEZhY2Uuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnZpZXdwb3J0LnNldChbMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHRdKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmJsZW5kRXF1YXRpb24uc2V0KGdsLkZVTkNfQUREKTtcbiAgICB9XG5cbiAgICBpbml0RGVidWdPdmVybGF5Q2FudmFzKCkge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1Z092ZXJsYXlDYW52YXMgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICB0aGlzLmRlYnVnT3ZlcmxheUNhbnZhcy53aWR0aCA9IDUxMjtcbiAgICAgICAgICAgIHRoaXMuZGVidWdPdmVybGF5Q2FudmFzLmhlaWdodCA9IDUxMjtcbiAgICAgICAgICAgIGNvbnN0IGdsID0gdGhpcy5jb250ZXh0LmdsO1xuICAgICAgICAgICAgdGhpcy5kZWJ1Z092ZXJsYXlUZXh0dXJlID0gbmV3IFRleHR1cmUodGhpcy5jb250ZXh0LCB0aGlzLmRlYnVnT3ZlcmxheUNhbnZhcywgZ2wuUkdCQSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5fdGVycmFpbikge1xuICAgICAgICAgICAgdGhpcy5fdGVycmFpbi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ2xvYmVTaGFyZWRCdWZmZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmdsb2JlU2hhcmVkQnVmZmVycy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbXB0eVRleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICBpZiAodGhpcy5kZWJ1Z092ZXJsYXlUZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnT3ZlcmxheVRleHR1cmUuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF0bW9zcGhlcmVCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYXRtb3NwaGVyZUJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcmVwYXJlRHJhd1RpbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnRlcnJhaW4pIHtcbiAgICAgICAgICAgIHRoaXMudGVycmFpbi5wcmVwYXJlRHJhd1RpbGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByZXBhcmVEcmF3UHJvZ3JhbShjb250ZXh0OiBDb250ZXh0LCBwcm9ncmFtOiBQcm9ncmFtPCo+LCB0aWxlSUQ6ID9VbndyYXBwZWRUaWxlSUQpIHtcblxuICAgICAgICAvLyBGb2cgaXMgbm90IGVuYWJsZWQgd2hlbiByZW5kZXJpbmcgdG8gdGV4dHVyZSBzbyB3ZVxuICAgICAgICAvLyBjYW4gc2FmZWx5IHNraXAgdXBsb2FkaW5nIHVuaWZvcm1zIGluIHRoYXQgY2FzZVxuICAgICAgICBpZiAodGhpcy50ZXJyYWluICYmIHRoaXMudGVycmFpbi5yZW5kZXJpbmdUb1RleHR1cmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvZyA9IHRoaXMuc3R5bGUuZm9nO1xuXG4gICAgICAgIGlmIChmb2cpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvZ09wYWNpdHkgPSBmb2cuZ2V0T3BhY2l0eSh0aGlzLnRyYW5zZm9ybS5waXRjaCk7XG4gICAgICAgICAgICBjb25zdCBmb2dVbmlmb3JtcyA9IGZvZ1VuaWZvcm1WYWx1ZXMoXG4gICAgICAgICAgICAgICAgdGhpcywgZm9nLCB0aWxlSUQsIGZvZ09wYWNpdHksXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uZnJ1c3R1bUNvcm5lcnMuVEwsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uZnJ1c3R1bUNvcm5lcnMuVFIsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uZnJ1c3R1bUNvcm5lcnMuQlIsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uZnJ1c3R1bUNvcm5lcnMuQkwsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uZ2xvYmVDZW50ZXJJblZpZXdTcGFjZSxcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5nbG9iZVJhZGl1cyxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLndpZHRoICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5oZWlnaHQgKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW9cbiAgICAgICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgcHJvZ3JhbS5zZXRGb2dVbmlmb3JtVmFsdWVzKGNvbnRleHQsIGZvZ1VuaWZvcm1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFRpbGVMb2FkZWRGbGFnKGZsYWc6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy50aWxlTG9hZGVkID0gZmxhZztcbiAgICB9XG5cbiAgICBzYXZlQ2FudmFzQ29weSgpIHtcbiAgICAgICAgdGhpcy5mcmFtZUNvcGllcy5wdXNoKHRoaXMuY2FudmFzQ29weSgpKTtcbiAgICAgICAgdGhpcy50aWxlTG9hZGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY2FudmFzQ29weSgpOiA/V2ViR0xUZXh0dXJlIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmNvbnRleHQuZ2w7XG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRleHR1cmUpO1xuICAgICAgICBnbC5jb3B5VGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCAwLCAwLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHQsIDApO1xuICAgICAgICByZXR1cm4gdGV4dHVyZTtcbiAgICB9XG5cbiAgICBnZXRDYW52YXNDb3BpZXNBbmRUaW1lc3RhbXBzKCk6IENhbnZhc0NvcHlJbnN0YW5jZXMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2FudmFzQ29waWVzOiB0aGlzLmZyYW1lQ29waWVzLFxuICAgICAgICAgICAgdGltZVN0YW1wczogdGhpcy5sb2FkVGltZVN0YW1wc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGF2ZXJhZ2VFbGV2YXRpb25OZWVkc0Vhc2luZygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLnRyYW5zZm9ybS5fZWxldmF0aW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZm9nID0gdGhpcy5zdHlsZSAmJiB0aGlzLnN0eWxlLmZvZztcbiAgICAgICAgaWYgKCFmb2cpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBmb2dPcGFjaXR5ID0gZm9nLmdldE9wYWNpdHkodGhpcy50cmFuc2Zvcm0ucGl0Y2gpO1xuICAgICAgICBpZiAoZm9nT3BhY2l0eSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldEJhY2tncm91bmRUaWxlcygpOiB7W2tleTogbnVtYmVyXTogVGlsZX0ge1xuICAgICAgICBjb25zdCBvbGRUaWxlcyA9IHRoaXMuX2JhY2tncm91bmRUaWxlcztcbiAgICAgICAgY29uc3QgbmV3VGlsZXMgPSB0aGlzLl9iYWNrZ3JvdW5kVGlsZXMgPSB7fTtcblxuICAgICAgICBjb25zdCB0aWxlU2l6ZSA9IDUxMjtcbiAgICAgICAgY29uc3QgdGlsZUlEcyA9IHRoaXMudHJhbnNmb3JtLmNvdmVyaW5nVGlsZXMoe3RpbGVTaXplfSk7XG4gICAgICAgIGZvciAoY29uc3QgdGlsZUlEIG9mIHRpbGVJRHMpIHtcbiAgICAgICAgICAgIG5ld1RpbGVzW3RpbGVJRC5rZXldID0gb2xkVGlsZXNbdGlsZUlELmtleV0gfHwgbmV3IFRpbGUodGlsZUlELCB0aWxlU2l6ZSwgdGhpcy50cmFuc2Zvcm0udGlsZVpvb20sIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdUaWxlcztcbiAgICB9XG5cbiAgICBjbGVhckJhY2tncm91bmRUaWxlcygpIHtcbiAgICAgICAgdGhpcy5fYmFja2dyb3VuZFRpbGVzID0ge307XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQYWludGVyO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7bnVtYmVyfSBmcm9tIFwiLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzXCI7XG5pbXBvcnQgUG9pbnQgIGZyb20gXCJAbWFwYm94L3BvaW50LWdlb21ldHJ5XCI7XG5pbXBvcnQge2NsYW1wfSBmcm9tIFwiLi4vdXRpbC91dGlsLmpzXCI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIEFuIGBFZGdlSW5zZXRgIG9iamVjdCByZXByZXNlbnRzIHNjcmVlbiBzcGFjZSBwYWRkaW5nIGFwcGxpZWQgdG8gdGhlIGVkZ2VzIG9mIHRoZSB2aWV3cG9ydC5cbiAqIFRoaXMgc2hpZnRzIHRoZSBhcHBhcmVudCBjZW50ZXIgb3IgdGhlIHZhbmlzaGluZyBwb2ludCBvZiB0aGUgbWFwLiBUaGlzIGlzIHVzZWZ1bCBmb3IgYWRkaW5nIGZsb2F0aW5nIFVJIGVsZW1lbnRzXG4gKiBvbiB0b3Agb2YgdGhlIG1hcCBhbmQgaGF2aW5nIHRoZSB2YW5pc2hpbmcgcG9pbnQgc2hpZnQgYXMgVUkgZWxlbWVudHMgcmVzaXplLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBbdG9wPTBdXG4gKiBAcGFyYW0ge251bWJlcn0gW2JvdHRvbT0wXVxuICogQHBhcmFtIHtudW1iZXJ9IFtsZWZ0PTBdXG4gKiBAcGFyYW0ge251bWJlcn0gW3JpZ2h0PTBdXG4gKi9cbmNsYXNzIEVkZ2VJbnNldHMge1xuICAgIHRvcDogbnVtYmVyO1xuICAgIGJvdHRvbTogbnVtYmVyO1xuICAgIGxlZnQ6IG51bWJlcjtcbiAgICByaWdodDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IodG9wOiBudW1iZXIgPSAwLCBib3R0b206IG51bWJlciA9IDAsIGxlZnQ6IG51bWJlciA9IDAsIHJpZ2h0OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGlmIChpc05hTih0b3ApIHx8IHRvcCA8IDAgfHxcbiAgICAgICAgICAgIGlzTmFOKGJvdHRvbSkgfHwgYm90dG9tIDwgMCB8fFxuICAgICAgICAgICAgaXNOYU4obGVmdCkgfHwgbGVmdCA8IDAgfHxcbiAgICAgICAgICAgIGlzTmFOKHJpZ2h0KSB8fCByaWdodCA8IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIGVkZ2UtaW5zZXRzLCB0b3AsIGJvdHRvbSwgbGVmdCBhbmQgcmlnaHQgbXVzdCBhbGwgYmUgbnVtYmVycycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50b3AgPSB0b3A7XG4gICAgICAgIHRoaXMuYm90dG9tID0gYm90dG9tO1xuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgICAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW50ZXJwb2xhdGVzIHRoZSBpbnNldCBpbi1wbGFjZS5cbiAgICAgKiBUaGlzIG1haW50YWlucyB0aGUgY3VycmVudCBpbnNldCB2YWx1ZSBmb3IgYW55IGluc2V0IG5vdCBwcmVzZW50IGluIGB0YXJnZXRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge1BhZGRpbmdPcHRpb25zIHwgRWRnZUluc2V0c30gc3RhcnQgVGhlIGluaXRpYWwgcGFkZGluZyBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7UGFkZGluZ09wdGlvbnN9IHRhcmdldCBUaGUgdGFyZ2V0IHBhZGRpbmcgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdCBUaGUgaW50ZXJwb2xhdGlvbiB2YXJpYWJsZS5cbiAgICAgKiBAcmV0dXJucyB7RWRnZUluc2V0c30gVGhlIGludGVycG9sYXRlZCBlZGdlIGluc2V0cy5cbiAgICAgKiBAbWVtYmVyb2YgRWRnZUluc2V0c1xuICAgICAqL1xuICAgIGludGVycG9sYXRlKHN0YXJ0OiBQYWRkaW5nT3B0aW9ucyB8IEVkZ2VJbnNldHMsIHRhcmdldDogUGFkZGluZ09wdGlvbnMsIHQ6IG51bWJlcik6IEVkZ2VJbnNldHMge1xuICAgICAgICBpZiAodGFyZ2V0LnRvcCAhPSBudWxsICYmIHN0YXJ0LnRvcCAhPSBudWxsKSB0aGlzLnRvcCA9IG51bWJlcihzdGFydC50b3AsIHRhcmdldC50b3AsIHQpO1xuICAgICAgICBpZiAodGFyZ2V0LmJvdHRvbSAhPSBudWxsICYmIHN0YXJ0LmJvdHRvbSAhPSBudWxsKSB0aGlzLmJvdHRvbSA9IG51bWJlcihzdGFydC5ib3R0b20sIHRhcmdldC5ib3R0b20sIHQpO1xuICAgICAgICBpZiAodGFyZ2V0LmxlZnQgIT0gbnVsbCAmJiBzdGFydC5sZWZ0ICE9IG51bGwpIHRoaXMubGVmdCA9IG51bWJlcihzdGFydC5sZWZ0LCB0YXJnZXQubGVmdCwgdCk7XG4gICAgICAgIGlmICh0YXJnZXQucmlnaHQgIT0gbnVsbCAmJiBzdGFydC5yaWdodCAhPSBudWxsKSB0aGlzLnJpZ2h0ID0gbnVtYmVyKHN0YXJ0LnJpZ2h0LCB0YXJnZXQucmlnaHQsIHQpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgY29tcHV0ZXMgdGhlIG5ldyBhcHByZW50IGNlbnRlciBvciB2YW5pc2hpbmcgcG9pbnQgYWZ0ZXIgYXBwbHlpbmcgaW5zZXRzLlxuICAgICAqIFRoaXMgaXMgaW4gcGl4ZWxzIGFuZCB3aXRoIHRoZSB0b3AgbGVmdCBiZWluZyAoMC4wKSBhbmQgK3kgYmVpbmcgZG93bndhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBtYXAgaW4gcGl4ZWxzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgbWFwIGluIHBpeGVscy5cbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IFRoZSBhcHBhcmVudCBjZW50ZXIgb3IgdmFuaXNoaW5nIHBvaW50IG9mIHRoZSBtYXAuXG4gICAgICogQG1lbWJlcm9mIEVkZ2VJbnNldHNcbiAgICAgKi9cbiAgICBnZXRDZW50ZXIod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQb2ludCB7XG4gICAgICAgIC8vIENsYW1wIGluc2V0cyBzbyB0aGV5IG5ldmVyIG92ZXJmbG93IHdpZHRoL2hlaWdodCBhbmQgYWx3YXlzIGNhbGN1bGF0ZSBhIHZhbGlkIGNlbnRlclxuICAgICAgICBjb25zdCB4ID0gY2xhbXAoKHRoaXMubGVmdCArIHdpZHRoIC0gdGhpcy5yaWdodCkgLyAyLCAwLCB3aWR0aCk7XG4gICAgICAgIGNvbnN0IHkgPSBjbGFtcCgodGhpcy50b3AgKyBoZWlnaHQgLSB0aGlzLmJvdHRvbSkgLyAyLCAwLCBoZWlnaHQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoeCwgeSk7XG4gICAgfVxuXG4gICAgZXF1YWxzKG90aGVyOiBQYWRkaW5nT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b3AgPT09IG90aGVyLnRvcCAmJlxuICAgICAgICAgICAgdGhpcy5ib3R0b20gPT09IG90aGVyLmJvdHRvbSAmJlxuICAgICAgICAgICAgdGhpcy5sZWZ0ID09PSBvdGhlci5sZWZ0ICYmXG4gICAgICAgICAgICB0aGlzLnJpZ2h0ID09PSBvdGhlci5yaWdodDtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBFZGdlSW5zZXRzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFZGdlSW5zZXRzKHRoaXMudG9wLCB0aGlzLmJvdHRvbSwgdGhpcy5sZWZ0LCB0aGlzLnJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIGFzIGpzb24sIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGhhdmUgYVxuICAgICAqIHJlYWQtb25seSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zZXQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtQYWRkaW5nT3B0aW9uc30gVGhlIGN1cnJlbnQgcGFkZGluZyBvcHRpb25zLlxuICAgICAqIEBtZW1iZXJvZiBFZGdlSW5zZXRzXG4gICAgICovXG4gICAgdG9KU09OKCk6IFBhZGRpbmdPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvcDogdGhpcy50b3AsXG4gICAgICAgICAgICBib3R0b206IHRoaXMuYm90dG9tLFxuICAgICAgICAgICAgbGVmdDogdGhpcy5sZWZ0LFxuICAgICAgICAgICAgcmlnaHQ6IHRoaXMucmlnaHRcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFBhZGRpbmdPcHRpb25zID0geyt0b3A6ID9udW1iZXIsICtib3R0b206ID9udW1iZXIsICtyaWdodDogP251bWJlciwgK2xlZnQ6ID9udW1iZXJ9O1xuXG5leHBvcnQgZGVmYXVsdCBFZGdlSW5zZXRzO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge21lcmNhdG9yWmZyb21BbHRpdHVkZX0gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHtkZWdUb1JhZCwgd3JhcCwgZ2V0Q29sdW1uLCBzZXRDb2x1bW59IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge3ZlYzMsIHF1YXQsIG1hdDR9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbmltcG9ydCB0eXBlIHtFbGV2YXRpb259IGZyb20gJy4uL3RlcnJhaW4vZWxldmF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHtMbmdMYXRMaWtlfSBmcm9tICcuLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgdHlwZSB7TWF0NCwgVmVjMywgVmVjNCwgUXVhdH0gZnJvbSAnZ2wtbWF0cml4JztcblxuZnVuY3Rpb24gdXBkYXRlVHJhbnNmb3JtT3JpZW50YXRpb24obWF0cml4OiBNYXQ0LCBvcmllbnRhdGlvbjogUXVhdCkge1xuICAgIC8vIFRha2UgdGVtcG9yYXJ5IGNvcHkgb2YgcG9zaXRpb24gdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIG92ZXJ3cml0dGVuXG4gICAgY29uc3QgcG9zaXRpb246IFZlYzQgPSBnZXRDb2x1bW4obWF0cml4LCAzKTtcblxuICAgIC8vIENvbnZlcnQgcXVhdGVybmlvbiB0byByb3RhdGlvbiBtYXRyaXhcbiAgICBtYXQ0LmZyb21RdWF0KG1hdHJpeCwgb3JpZW50YXRpb24pO1xuICAgIHNldENvbHVtbihtYXRyaXgsIDMsIHBvc2l0aW9uKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVHJhbnNmb3JtUG9zaXRpb24obWF0cml4OiBNYXQ0LCBwb3NpdGlvbjogVmVjMykge1xuICAgIHNldENvbHVtbihtYXRyaXgsIDMsIFtwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIHBvc2l0aW9uWzJdLCAxLjBdKTtcbn1cblxuZnVuY3Rpb24gb3JpZW50YXRpb25Gcm9tUGl0Y2hCZWFyaW5nKHBpdGNoOiBudW1iZXIsIGJlYXJpbmc6IG51bWJlcik6IFF1YXQge1xuICAgIC8vIEJvdGggYW5nbGVzIGFyZSBjb25zaWRlcmVkIHRvIGRlZmluZSBDVyByb3RhdGlvbiBhcm91bmQgdGhlaXIgcmVzcGVjdGl2ZSBheGVzLlxuICAgIC8vIFZhbHVlcyBoYXZlIHRvIGJlIG5lZ2F0ZWQgdG8gYWNoaWV2ZSB0aGUgcHJvcGVyIHF1YXRlcm5pb24gaW4gbGVmdCBoYW5kZWQgY29vcmRpbmF0ZSBzcGFjZVxuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gcXVhdC5pZGVudGl0eShbXSk7XG4gICAgcXVhdC5yb3RhdGVaKG9yaWVudGF0aW9uLCBvcmllbnRhdGlvbiwgLWJlYXJpbmcpO1xuICAgIHF1YXQucm90YXRlWChvcmllbnRhdGlvbiwgb3JpZW50YXRpb24sIC1waXRjaCk7XG4gICAgcmV0dXJuIG9yaWVudGF0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb3JpZW50YXRpb25Gcm9tRnJhbWUoZm9yd2FyZDogVmVjMywgdXA6IFZlYzMpOiA/UXVhdCB7XG4gICAgLy8gRmluZCByaWdodC12ZWN0b3Igb2YgdGhlIHJlc3VsdGluZyBjb29yZGluYXRlIGZyYW1lLiBVcC12ZWN0b3IgaGFzIHRvIGJlXG4gICAgLy8gc2FuaXRpemVkIGZpcnN0IGluIG9yZGVyIHRvIHJlbW92ZSB0aGUgcm9sbCBjb21wb25lbnQgZnJvbSB0aGUgb3JpZW50YXRpb25cbiAgICBjb25zdCB4eUZvcndhcmQgPSBbZm9yd2FyZFswXSwgZm9yd2FyZFsxXSwgMF07XG4gICAgY29uc3QgeHlVcCA9IFt1cFswXSwgdXBbMV0sIDBdO1xuXG4gICAgY29uc3QgZXBzaWxvbiA9IDFlLTE1O1xuXG4gICAgaWYgKHZlYzMubGVuZ3RoKHh5Rm9yd2FyZCkgPj0gZXBzaWxvbikge1xuICAgICAgICAvLyBSb2xsIHJvdGF0aW9uIGNhbiBiZSBzZWVuIGFzIHRoZSByaWdodCB2ZWN0b3Igbm90IGJlaW5nIG9uIHRoZSB4eS1wbGFuZSwgaWUuIHJpZ2h0WzJdICE9IDAuMC5cbiAgICAgICAgLy8gSXQgY2FuIGJlIG5lZ2F0ZWQgYnkgcHJvamVjdGluZyB0aGUgdXAgdmVjdG9yIG9uIHRvcCBvZiB0aGUgZm9yd2FyZCB2ZWN0b3IuXG4gICAgICAgIGNvbnN0IHh5RGlyID0gdmVjMy5ub3JtYWxpemUoW10sIHh5Rm9yd2FyZCk7XG4gICAgICAgIHZlYzMuc2NhbGUoeHlVcCwgeHlEaXIsIHZlYzMuZG90KHh5VXAsIHh5RGlyKSk7XG5cbiAgICAgICAgdXBbMF0gPSB4eVVwWzBdO1xuICAgICAgICB1cFsxXSA9IHh5VXBbMV07XG4gICAgfVxuXG4gICAgY29uc3QgcmlnaHQgPSB2ZWMzLmNyb3NzKFtdLCB1cCwgZm9yd2FyZCk7XG4gICAgaWYgKHZlYzMubGVuKHJpZ2h0KSA8IGVwc2lsb24pIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYmVhcmluZyA9IE1hdGguYXRhbjIoLXJpZ2h0WzFdLCByaWdodFswXSk7XG4gICAgY29uc3QgcGl0Y2ggPSBNYXRoLmF0YW4yKE1hdGguc3FydChmb3J3YXJkWzBdICogZm9yd2FyZFswXSArIGZvcndhcmRbMV0gKiBmb3J3YXJkWzFdKSwgLWZvcndhcmRbMl0pO1xuXG4gICAgcmV0dXJuIG9yaWVudGF0aW9uRnJvbVBpdGNoQmVhcmluZyhwaXRjaCwgYmVhcmluZyk7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYWNjZXNzaW5nIHBoeXNpY2FsIHByb3BlcnRpZXMgb2YgdGhlIHVuZGVybHlpbmcgY2FtZXJhIGVudGl0eS5cbiAqIERpcmVjdCBhY2Nlc3MgdG8gdGhlc2UgcHJvcGVydGllcyBhbGxvd3MgbW9yZSBmbGV4aWJsZSBhbmQgcHJlY2lzZSBjb250cm9sbGluZyBvZiB0aGUgY2FtZXJhLlxuICogVGhlc2Ugb3B0aW9ucyBhcmUgYWxzbyBmdWxseSBjb21wYXRpYmxlIGFuZCBpbnRlcmNoYW5nZWFibGUgd2l0aCBDYW1lcmFPcHRpb25zLiBBbGwgZmllbGRzIGFyZSBvcHRpb25hbC5cbiAqIFNlZSB7QGxpbmsgTWFwI3NldEZyZWVDYW1lcmFPcHRpb25zfSBhbmQge0BsaW5rIE1hcCNnZXRGcmVlQ2FtZXJhT3B0aW9uc30uXG4gKlxuICogQHBhcmFtIHtNZXJjYXRvckNvb3JkaW5hdGV9IHBvc2l0aW9uIFBvc2l0aW9uIG9mIHRoZSBjYW1lcmEgaW4gc2xpZ2h0bHkgbW9kaWZpZWQgd2ViIG1lcmNhdG9yIGNvb3JkaW5hdGVzLlxuICAgICAgICAtIFRoZSBzaXplIG9mIDEgdW5pdCBpcyB0aGUgd2lkdGggb2YgdGhlIHByb2plY3RlZCB3b3JsZCBpbnN0ZWFkIG9mIHRoZSBcIm1lcmNhdG9yIG1ldGVyXCIuXG4gICAgICAgICAgQ29vcmRpbmF0ZSBbMCwgMCwgMF0gaXMgdGhlIG5vcnRoLXdlc3QgY29ybmVyIGFuZCBbMSwgMSwgMF0gaXMgdGhlIHNvdXRoLWVhc3QgY29ybmVyLlxuICAgICAgICAtIFogY29vcmRpbmF0ZSBpcyBjb25mb3JtYWwgYW5kIG11c3QgcmVzcGVjdCBtaW5pbXVtIGFuZCBtYXhpbXVtIHpvb20gdmFsdWVzLlxuICAgICAgICAtIFpvb20gaXMgYXV0b21hdGljYWxseSBjb21wdXRlZCBmcm9tIHRoZSBhbHRpdHVkZSAoeikuXG4gKiBAcGFyYW0ge3F1YXR9IG9yaWVudGF0aW9uIE9yaWVudGF0aW9uIG9mIHRoZSBjYW1lcmEgcmVwcmVzZW50ZWQgYXMgYSB1bml0IHF1YXRlcm5pb24gW3gsIHksIHosIHddIGluIGEgbGVmdC1oYW5kZWQgY29vcmRpbmF0ZSBzcGFjZS5cbiAgICAgICAgRGlyZWN0aW9uIG9mIHRoZSByb3RhdGlvbiBpcyBjbG9ja3dpc2UgYXJvdW5kIHRoZSByZXNwZWN0aXZlIGF4aXMuXG4gICAgICAgIFRoZSBkZWZhdWx0IHBvc2Ugb2YgdGhlIGNhbWVyYSBpcyBzdWNoIHRoYXQgdGhlIGZvcndhcmQgdmVjdG9yIGlzIGxvb2tpbmcgdXAgdGhlIC1aIGF4aXMuXG4gICAgICAgIFRoZSB1cCB2ZWN0b3IgaXMgYWxpZ25lZCB3aXRoIG5vcnRoIG9yaWVudGF0aW9uIG9mIHRoZSBtYXA6XG4gICAgICAgICAgZm9yd2FyZDogWzAsIDAsIC0xXVxuICAgICAgICAgIHVwOiAgICAgIFswLCAtMSwgMF1cbiAgICAgICAgICByaWdodCAgICBbMSwgMCwgMF1cbiAgICAgICAgT3JpZW50YXRpb24gY2FuIGJlIHNldCBmcmVlbHkgYnV0IGNlcnRhaW4gY29uc3RyYWludHMgc3RpbGwgYXBwbHk6XG4gICAgICAgICAtIE9yaWVudGF0aW9uIG11c3QgYmUgcmVwcmVzZW50YWJsZSB3aXRoIG9ubHkgcGl0Y2ggYW5kIGJlYXJpbmcuXG4gICAgICAgICAtIFBpdGNoIGhhcyBhbiB1cHBlciBsaW1pdFxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNhbWVyYSA9IG1hcC5nZXRGcmVlQ2FtZXJhT3B0aW9ucygpO1xuICpcbiAqIGNvbnN0IHBvc2l0aW9uID0gWzEzOC43MjY0OSwgMzUuMzM5NzRdO1xuICogY29uc3QgYWx0aXR1ZGUgPSAzMDAwO1xuICpcbiAqIGNhbWVyYS5wb3NpdGlvbiA9IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KHBvc2l0aW9uLCBhbHRpdHVkZSk7XG4gKiBjYW1lcmEubG9va0F0UG9pbnQoWzEzOC43MzAzNiwgMzUuMzYxOTddKTtcbiAqXG4gKiBtYXAuc2V0RnJlZUNhbWVyYU9wdGlvbnMoY2FtZXJhKTtcbiAqIEBzZWUgW0V4YW1wbGU6IEFuaW1hdGUgdGhlIGNhbWVyYSBhcm91bmQgYSBwb2ludCBpbiAzRCB0ZXJyYWluXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mcmVlLWNhbWVyYS1wb2ludC8pXG4gKiBAc2VlIFtFeGFtcGxlOiBBbmltYXRlIHRoZSBjYW1lcmEgYWxvbmcgYSBwYXRoXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mcmVlLWNhbWVyYS1wYXRoLylcbiovXG5jbGFzcyBGcmVlQ2FtZXJhT3B0aW9ucyB7XG4gICAgb3JpZW50YXRpb246ID9RdWF0O1xuICAgIF9wb3NpdGlvbjogP01lcmNhdG9yQ29vcmRpbmF0ZTtcbiAgICBfZWxldmF0aW9uOiA/RWxldmF0aW9uO1xuICAgIF9yZW5kZXJXb3JsZENvcGllczogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKHBvc2l0aW9uOiA/TWVyY2F0b3JDb29yZGluYXRlLCBvcmllbnRhdGlvbjogP1F1YXQpIHtcbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb247XG4gICAgfVxuXG4gICAgZ2V0IHBvc2l0aW9uKCk6ID9NZXJjYXRvckNvb3JkaW5hdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gICAgfVxuXG4gICAgc2V0IHBvc2l0aW9uKHBvc2l0aW9uOiA/TWVyY2F0b3JDb29yZGluYXRlIHwgVmVjMykge1xuICAgICAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtZXJjYXRvckNvb3JkaW5hdGUgPSBwb3NpdGlvbiBpbnN0YW5jZW9mIE1lcmNhdG9yQ29vcmRpbmF0ZSA/IHBvc2l0aW9uIDogbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIHBvc2l0aW9uWzJdKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZW5kZXJXb3JsZENvcGllcykge1xuICAgICAgICAgICAgICAgIG1lcmNhdG9yQ29vcmRpbmF0ZS54ID0gd3JhcChtZXJjYXRvckNvb3JkaW5hdGUueCwgMCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IG1lcmNhdG9yQ29vcmRpbmF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiBmb3Igc2V0dGluZyBvcmllbnRhdGlvbiBvZiB0aGUgY2FtZXJhIGJ5IGRlZmluaW5nIGEgZm9jdXMgcG9pbnRcbiAgICAgKiBvbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBsb2NhdGlvbiBMb2NhdGlvbiBvZiB0aGUgZm9jdXMgcG9pbnQgb24gdGhlIG1hcC5cbiAgICAgKiBAcGFyYW0ge3ZlYzM/fSB1cCBVcCB2ZWN0b3Igb2YgdGhlIGNhbWVyYSBpcyBuZWNlc3NhcnkgaW4gY2VydGFpbiBzY2VuYXJpb3Mgd2hlcmUgYmVhcmluZyBjYW4ndCBiZSBkZWR1Y2VkXG4gICAgICogICAgICBmcm9tIHRoZSB2aWV3aW5nIGRpcmVjdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhbWVyYSA9IG1hcC5nZXRGcmVlQ2FtZXJhT3B0aW9ucygpO1xuICAgICAqXG4gICAgICogY29uc3QgcG9zaXRpb24gPSBbMTM4LjcyNjQ5LCAzNS4zMzk3NF07XG4gICAgICogY29uc3QgYWx0aXR1ZGUgPSAzMDAwO1xuICAgICAqXG4gICAgICogY2FtZXJhLnBvc2l0aW9uID0gbWFwYm94Z2wuTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQocG9zaXRpb24sIGFsdGl0dWRlKTtcbiAgICAgKiBjYW1lcmEubG9va0F0UG9pbnQoWzEzOC43MzAzNiwgMzUuMzYxOTddKTtcbiAgICAgKiAvLyBBcHBseSBjYW1lcmEgY2hhbmdlc1xuICAgICAqIG1hcC5zZXRGcmVlQ2FtZXJhT3B0aW9ucyhjYW1lcmEpO1xuICAgICAqL1xuICAgIGxvb2tBdFBvaW50KGxvY2F0aW9uOiBMbmdMYXRMaWtlLCB1cD86IFZlYzMpIHtcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG51bGw7XG4gICAgICAgIGlmICghdGhpcy5wb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWx0aXR1ZGUgPSB0aGlzLl9lbGV2YXRpb24gPyB0aGlzLl9lbGV2YXRpb24uZ2V0QXRQb2ludE9yWmVybyhNZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdChsb2NhdGlvbikpIDogMDtcbiAgICAgICAgY29uc3QgcG9zOiBNZXJjYXRvckNvb3JkaW5hdGUgPSB0aGlzLnBvc2l0aW9uO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBNZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdChsb2NhdGlvbiwgYWx0aXR1ZGUpO1xuICAgICAgICBjb25zdCBmb3J3YXJkID0gW3RhcmdldC54IC0gcG9zLngsIHRhcmdldC55IC0gcG9zLnksIHRhcmdldC56IC0gcG9zLnpdO1xuICAgICAgICBpZiAoIXVwKVxuICAgICAgICAgICAgdXAgPSBbMCwgMCwgMV07XG5cbiAgICAgICAgLy8gZmxpcCB6LWNvbXBvbmVudCBpZiB0aGUgdXAgdmVjdG9yIGlzIHBvaW50aW5nIGRvd253YXJkc1xuICAgICAgICB1cFsyXSA9IE1hdGguYWJzKHVwWzJdKTtcblxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb25Gcm9tRnJhbWUoZm9yd2FyZCwgdXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiBmb3Igc2V0dGluZyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGNhbWVyYSBhcyBhIHBpdGNoIGFuZCBhIGJlYXJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGl0Y2ggUGl0Y2ggYW5nbGUgaW4gZGVncmVlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmVhcmluZyBCZWFyaW5nIGFuZ2xlIGluIGRlZ3JlZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBjYW1lcmEgPSBtYXAuZ2V0RnJlZUNhbWVyYU9wdGlvbnMoKTtcbiAgICAgKlxuICAgICAqIC8vIFVwZGF0ZSBjYW1lcmEgcGl0Y2ggYW5kIGJlYXJpbmdcbiAgICAgKiBjYW1lcmEuc2V0UGl0Y2hCZWFyaW5nKDgwLCA5MCk7XG4gICAgICogLy8gQXBwbHkgY2hhbmdlc1xuICAgICAqIG1hcC5zZXRGcmVlQ2FtZXJhT3B0aW9ucyhjYW1lcmEpO1xuICAgICAqL1xuICAgIHNldFBpdGNoQmVhcmluZyhwaXRjaDogbnVtYmVyLCBiZWFyaW5nOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uRnJvbVBpdGNoQmVhcmluZyhkZWdUb1JhZChwaXRjaCksIGRlZ1RvUmFkKC1iZWFyaW5nKSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFdoaWxlIHVzaW5nIHRoZSBmcmVlIGNhbWVyYSBBUEkgdGhlIG91dGNvbWUgdmFsdWUgb2YgaXNab29taW5nLCBpc01vdmluZyBhbmQgaXNSb3RhdGluZ1xuICogaXMgbm90IGEgcmVzdWx0IG9mIHRoZSBmcmVlIGNhbWVyYSBBUEkuXG4gKiBJZiB0aGUgdXNlciBzZXRzIHRoZSBtYXAuaW50ZXJhY3RpdmUgdG8gdHJ1ZSwgdGhlcmUgd2lsbCBiZSBjb25mbGljdGluZyBiZWhhdmlvcnMgd2hpbGVcbiAqIGludGVyYWN0aW5nIHdpdGggbWFwIHZpYSB6b29taW5nIG9yIG1vdmluZyB1c2luZyBtb3VzZSBvci9hbmQga2V5Ym9hcmQgd2hpY2ggd2lsbCByZXN1bHRcbiAqIGluIGlzWm9vbWluZywgaXNNb3ZpbmcgYW5kIGlzUm90YXRpbmcgdG8gcmV0dXJuIHRydWUgd2hpbGUgdXNpbmcgZnJlZSBjYW1lcmEgQVBJLiBJbiBvcmRlclxuICogdG8gcHJldmVudCB0aGUgY29uZmlsaWN0aW5nIGJlaGF2aW9yIHBsZWFzZSBzZXQgbWFwLmludGVyYWN0aXZlIHRvIGZhbHNlIHdoaWNoIHdpbGwgcmVzdWx0XG4gKiBpbiBtdXRpbmcgdGhlIGZvbGxvd2luZyBldmVudHM6IHpvb20sIHpvb21lbmQsIHpvb21zdGFydCwgcm90YXRlLCByb3RhdGVlbmQsIHJvdGF0ZXN0YXJ0LFxuICogbW92ZSwgbW92ZWVuZCwgbW92ZXN0YXJ0LCBwaXRjaCwgcGl0Y2hlbmQsIHBpdGNoc3RhcnQuXG4gKi9cblxuY2xhc3MgRnJlZUNhbWVyYSB7XG4gICAgX3RyYW5zZm9ybTogTWF0NDtcbiAgICBfb3JpZW50YXRpb246IFF1YXQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwb3NpdGlvbjogP1ZlYzMsIG9yaWVudGF0aW9uOiA/UXVhdCkge1xuICAgICAgICB0aGlzLl90cmFuc2Zvcm0gPSBtYXQ0LmlkZW50aXR5KFtdKTtcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgfVxuXG4gICAgZ2V0IG1lcmNhdG9yUG9zaXRpb24oKTogTWVyY2F0b3JDb29yZGluYXRlIHtcbiAgICAgICAgY29uc3QgcG9zID0gdGhpcy5wb3NpdGlvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJjYXRvckNvb3JkaW5hdGUocG9zWzBdLCBwb3NbMV0sIHBvc1syXSk7XG4gICAgfVxuXG4gICAgZ2V0IHBvc2l0aW9uKCk6IFZlYzMge1xuICAgICAgICBjb25zdCBjb2w6IFZlYzQgPSBnZXRDb2x1bW4odGhpcy5fdHJhbnNmb3JtLCAzKTtcbiAgICAgICAgcmV0dXJuIFtjb2xbMF0sIGNvbFsxXSwgY29sWzJdXTtcbiAgICB9XG5cbiAgICBzZXQgcG9zaXRpb24odmFsdWU6ID9WZWMzKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdXBkYXRlVHJhbnNmb3JtUG9zaXRpb24odGhpcy5fdHJhbnNmb3JtLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgb3JpZW50YXRpb24oKTogUXVhdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvbjtcbiAgICB9XG5cbiAgICBzZXQgb3JpZW50YXRpb24odmFsdWU6ID9RdWF0KSB7XG4gICAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gdmFsdWUgfHwgcXVhdC5pZGVudGl0eShbXSk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdXBkYXRlVHJhbnNmb3JtT3JpZW50YXRpb24odGhpcy5fdHJhbnNmb3JtLCB0aGlzLl9vcmllbnRhdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRQaXRjaEJlYXJpbmcoKToge3BpdGNoOiBudW1iZXIsIGJlYXJpbmc6IG51bWJlcn0ge1xuICAgICAgICBjb25zdCBmID0gdGhpcy5mb3J3YXJkKCk7XG4gICAgICAgIGNvbnN0IHIgPSB0aGlzLnJpZ2h0KCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlYXJpbmc6IE1hdGguYXRhbjIoLXJbMV0sIHJbMF0pLFxuICAgICAgICAgICAgcGl0Y2g6IE1hdGguYXRhbjIoTWF0aC5zcXJ0KGZbMF0gKiBmWzBdICsgZlsxXSAqIGZbMV0pLCAtZlsyXSlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXRQaXRjaEJlYXJpbmcocGl0Y2g6IG51bWJlciwgYmVhcmluZzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gb3JpZW50YXRpb25Gcm9tUGl0Y2hCZWFyaW5nKHBpdGNoLCBiZWFyaW5nKTtcbiAgICAgICAgdXBkYXRlVHJhbnNmb3JtT3JpZW50YXRpb24odGhpcy5fdHJhbnNmb3JtLCB0aGlzLl9vcmllbnRhdGlvbik7XG4gICAgfVxuXG4gICAgZm9yd2FyZCgpOiBWZWMzIHtcbiAgICAgICAgY29uc3QgY29sOiBWZWM0ID0gZ2V0Q29sdW1uKHRoaXMuX3RyYW5zZm9ybSwgMik7XG4gICAgICAgIC8vIEZvcndhcmQgZGlyZWN0aW9uIGlzIHRvd2FyZHMgdGhlIG5lZ2F0aXZlIFotYXhpc1xuICAgICAgICByZXR1cm4gWy1jb2xbMF0sIC1jb2xbMV0sIC1jb2xbMl1dO1xuICAgIH1cblxuICAgIHVwKCk6IFZlYzMge1xuICAgICAgICBjb25zdCBjb2w6IFZlYzQgPSBnZXRDb2x1bW4odGhpcy5fdHJhbnNmb3JtLCAxKTtcbiAgICAgICAgLy8gVXAgZGlyZWN0aW9uIGhhcyB0byBiZSBmbGlwcGVkIHRvIHBvaW50IHRvd2FyZHMgbm9ydGhcbiAgICAgICAgcmV0dXJuIFstY29sWzBdLCAtY29sWzFdLCAtY29sWzJdXTtcbiAgICB9XG5cbiAgICByaWdodCgpOiBWZWMzIHtcbiAgICAgICAgY29uc3QgY29sOiBWZWM0ID0gZ2V0Q29sdW1uKHRoaXMuX3RyYW5zZm9ybSwgMCk7XG4gICAgICAgIHJldHVybiBbY29sWzBdLCBjb2xbMV0sIGNvbFsyXV07XG4gICAgfVxuXG4gICAgZ2V0Q2FtZXJhVG9Xb3JsZCh3b3JsZFNpemU6IG51bWJlciwgcGl4ZWxzUGVyTWV0ZXI6IG51bWJlcik6IEZsb2F0NjRBcnJheSB7XG4gICAgICAgIGNvbnN0IGNhbWVyYVRvV29ybGQgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgbWF0NC5pbnZlcnQoY2FtZXJhVG9Xb3JsZCwgdGhpcy5nZXRXb3JsZFRvQ2FtZXJhKHdvcmxkU2l6ZSwgcGl4ZWxzUGVyTWV0ZXIpKTtcbiAgICAgICAgcmV0dXJuIGNhbWVyYVRvV29ybGQ7XG4gICAgfVxuXG4gICAgZ2V0V29ybGRUb0NhbWVyYVBvc2l0aW9uKHdvcmxkU2l6ZTogbnVtYmVyLCBwaXhlbHNQZXJNZXRlcjogbnVtYmVyLCB1bmlmb3JtU2NhbGU6IG51bWJlcik6IEZsb2F0NjRBcnJheSB7XG4gICAgICAgIGNvbnN0IGludlBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjtcblxuICAgICAgICB2ZWMzLnNjYWxlKGludlBvc2l0aW9uLCBpbnZQb3NpdGlvbiwgLXdvcmxkU2l6ZSk7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICBtYXQ0LmZyb21TY2FsaW5nKG1hdHJpeCwgW3VuaWZvcm1TY2FsZSwgdW5pZm9ybVNjYWxlLCB1bmlmb3JtU2NhbGVdKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobWF0cml4LCBtYXRyaXgsIGludlBvc2l0aW9uKTtcblxuICAgICAgICAvLyBBZGp1c3Qgc2NhbGUgb24geiAoM3JkIGNvbHVtbiAzcmQgcm93KVxuICAgICAgICBtYXRyaXhbMTBdICo9IHBpeGVsc1Blck1ldGVyO1xuXG4gICAgICAgIHJldHVybiBtYXRyaXg7XG4gICAgfVxuXG4gICAgZ2V0V29ybGRUb0NhbWVyYSh3b3JsZFNpemU6IG51bWJlciwgcGl4ZWxzUGVyTWV0ZXI6IG51bWJlcik6IEZsb2F0NjRBcnJheSB7XG4gICAgICAgIC8vIHRyYW5zZm9ybWF0aW9uIGNoYWluIGZyb20gd29ybGQgc3BhY2UgdG8gY2FtZXJhIHNwYWNlOlxuICAgICAgICAvLyAxLiBIZWlnaHQgdmFsdWUgKHopIG9mIHJlbmRlcmFibGVzIGlzIGluIG1ldGVycy4gU2NhbGUgeiBjb29yZGluYXRlIGJ5IHBpeGVsc1Blck1ldGVyXG4gICAgICAgIC8vIDIuIFRyYW5zZm9ybSBmcm9tIHBpeGVsIGNvb3JkaW5hdGVzIHRvIGNhbWVyYSBzcGFjZSB3aXRoIGNhbWVyYU1hdHJpeF4tMVxuICAgICAgICAvLyAzLiBmbGlwIFkgaWYgcmVxdWlyZWRcblxuICAgICAgICAvLyB3b3JsZFRvQ2FtZXJhOiBmbGlwICogY2FtXi0xICogelNjYWxlXG4gICAgICAgIC8vIGNhbWVyYVRvV29ybGQ6IChmbGlwICogY2FtXi0xICogelNjYWxlKV4tMSA9PiAoelNjYWxlXi0xICogY2FtICogZmxpcF4tMSlcbiAgICAgICAgY29uc3QgbWF0cml4ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBpbnZlcnNlIG9mIGNhbWVyYSBtYXRyaXggYW5kIHBvc3QtbXVsdGlwbHkgbmVnYXRlZCB0cmFuc2xhdGlvblxuICAgICAgICBjb25zdCBpbnZPcmllbnRhdGlvbiA9IG5ldyBGbG9hdDY0QXJyYXkoNCk7XG4gICAgICAgIGNvbnN0IGludlBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbjtcblxuICAgICAgICBxdWF0LmNvbmp1Z2F0ZShpbnZPcmllbnRhdGlvbiwgdGhpcy5fb3JpZW50YXRpb24pO1xuICAgICAgICB2ZWMzLnNjYWxlKGludlBvc2l0aW9uLCBpbnZQb3NpdGlvbiwgLXdvcmxkU2l6ZSk7XG5cbiAgICAgICAgbWF0NC5mcm9tUXVhdChtYXRyaXgsIGludk9yaWVudGF0aW9uKTtcblxuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtYXRyaXgsIG1hdHJpeCwgaW52UG9zaXRpb24pO1xuXG4gICAgICAgIC8vIFByZS1tdWx0aXBseSB5ICgybmQgcm93KVxuICAgICAgICBtYXRyaXhbMV0gKj0gLTEuMDtcbiAgICAgICAgbWF0cml4WzVdICo9IC0xLjA7XG4gICAgICAgIG1hdHJpeFs5XSAqPSAtMS4wO1xuICAgICAgICBtYXRyaXhbMTNdICo9IC0xLjA7XG5cbiAgICAgICAgLy8gUG9zdC1tdWx0aXBseSB6ICgzcmQgY29sdW1uKVxuICAgICAgICBtYXRyaXhbOF0gKj0gcGl4ZWxzUGVyTWV0ZXI7XG4gICAgICAgIG1hdHJpeFs5XSAqPSBwaXhlbHNQZXJNZXRlcjtcbiAgICAgICAgbWF0cml4WzEwXSAqPSBwaXhlbHNQZXJNZXRlcjtcbiAgICAgICAgbWF0cml4WzExXSAqPSBwaXhlbHNQZXJNZXRlcjtcblxuICAgICAgICByZXR1cm4gbWF0cml4O1xuICAgIH1cblxuICAgIGdldENhbWVyYVRvQ2xpcFBlcnNwZWN0aXZlKGZvdnk6IG51bWJlciwgYXNwZWN0UmF0aW86IG51bWJlciwgbmVhclo6IG51bWJlciwgZmFyWjogbnVtYmVyKTogRmxvYXQ2NEFycmF5IHtcbiAgICAgICAgY29uc3QgbWF0cml4ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUobWF0cml4LCBmb3Z5LCBhc3BlY3RSYXRpbywgbmVhclosIGZhclopO1xuICAgICAgICByZXR1cm4gbWF0cml4O1xuICAgIH1cblxuICAgIGdldERpc3RhbmNlVG9FbGV2YXRpb24oZWxldmF0aW9uTWV0ZXJzOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB6MCA9IGVsZXZhdGlvbk1ldGVycyA9PT0gMCA/IDAgOiBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoZWxldmF0aW9uTWV0ZXJzLCB0aGlzLnBvc2l0aW9uWzFdKTtcbiAgICAgICAgY29uc3QgZiA9IHRoaXMuZm9yd2FyZCgpO1xuICAgICAgICByZXR1cm4gKHowIC0gdGhpcy5wb3NpdGlvblsyXSkgLyBmWzJdO1xuICAgIH1cblxuICAgIGNsb25lKCk6IEZyZWVDYW1lcmEge1xuICAgICAgICByZXR1cm4gbmV3IEZyZWVDYW1lcmEoWy4uLnRoaXMucG9zaXRpb25dLCBbLi4udGhpcy5vcmllbnRhdGlvbl0pO1xuICAgIH1cbn1cblxuZXhwb3J0IHtcbiAgICBGcmVlQ2FtZXJhLFxuICAgIEZyZWVDYW1lcmFPcHRpb25zXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9sbmdfbGF0LmpzJztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUsIHtNQVhfTUVSQ0FUT1JfTEFUSVRVREV9IGZyb20gJy4uL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHttYXQ0LCBtYXQyfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHtjbGFtcCwgc21vb3Roc3RlcH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHR5cGUgUHJvamVjdGlvbiBmcm9tICcuL3Byb2plY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL3RyYW5zZm9ybS5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFByb2plY3Rpb25BZGp1c3RtZW50cyh0cmFuc2Zvcm06IFRyYW5zZm9ybSwgd2l0aG91dFJvdGF0aW9uPzogYm9vbGVhbik6IEFycmF5PG51bWJlcj4ge1xuICAgIGNvbnN0IGludGVycFQgPSBnZXRQcm9qZWN0aW9uSW50ZXJwb2xhdGlvblQodHJhbnNmb3JtLnByb2plY3Rpb24sIHRyYW5zZm9ybS56b29tLCB0cmFuc2Zvcm0ud2lkdGgsIHRyYW5zZm9ybS5oZWlnaHQpO1xuICAgIGNvbnN0IG1hdHJpeCA9IGdldFNoZWFyQWRqdXN0bWVudCh0cmFuc2Zvcm0ucHJvamVjdGlvbiwgdHJhbnNmb3JtLnpvb20sIHRyYW5zZm9ybS5jZW50ZXIsIGludGVycFQsIHdpdGhvdXRSb3RhdGlvbik7XG5cbiAgICBjb25zdCBzY2FsZUFkanVzdG1lbnQgPSBnZXRTY2FsZUFkanVzdG1lbnQodHJhbnNmb3JtKTtcbiAgICBtYXQ0LnNjYWxlKG1hdHJpeCwgbWF0cml4LCBbc2NhbGVBZGp1c3RtZW50LCBzY2FsZUFkanVzdG1lbnQsIDFdKTtcblxuICAgIHJldHVybiBtYXRyaXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2FsZUFkanVzdG1lbnQodHJhbnNmb3JtOiBUcmFuc2Zvcm0pOiBudW1iZXIge1xuICAgIGNvbnN0IHByb2plY3Rpb24gPSB0cmFuc2Zvcm0ucHJvamVjdGlvbjtcbiAgICBjb25zdCBpbnRlcnBUID0gZ2V0UHJvamVjdGlvbkludGVycG9sYXRpb25UKHRyYW5zZm9ybS5wcm9qZWN0aW9uLCB0cmFuc2Zvcm0uem9vbSwgdHJhbnNmb3JtLndpZHRoLCB0cmFuc2Zvcm0uaGVpZ2h0KTtcbiAgICBjb25zdCB6b29tQWRqdXN0bWVudCA9IGdldFpvb21BZGp1c3RtZW50KHByb2plY3Rpb24sIHRyYW5zZm9ybS5jZW50ZXIpO1xuICAgIGNvbnN0IHpvb21BZGp1c3RtZW50T3JpZ2luID0gZ2V0Wm9vbUFkanVzdG1lbnQocHJvamVjdGlvbiwgTG5nTGF0LmNvbnZlcnQocHJvamVjdGlvbi5jZW50ZXIpKTtcbiAgICBjb25zdCBzY2FsZUFkanVzdG1lbnQgPSBNYXRoLnBvdygyLCB6b29tQWRqdXN0bWVudCAqIGludGVycFQgKyAoMSAtIGludGVycFQpICogem9vbUFkanVzdG1lbnRPcmlnaW4pO1xuICAgIHJldHVybiBzY2FsZUFkanVzdG1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9qZWN0aW9uQWRqdXN0bWVudEludmVydGVkKHRyYW5zZm9ybTogVHJhbnNmb3JtKTogQXJyYXk8bnVtYmVyPiB7XG4gICAgY29uc3QgbSA9IGdldFByb2plY3Rpb25BZGp1c3RtZW50cyh0cmFuc2Zvcm0sIHRydWUpO1xuICAgIHJldHVybiBtYXQyLmludmVydChbXSwgW1xuICAgICAgICBtWzBdLCBtWzFdLFxuICAgICAgICBtWzRdLCBtWzVdXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9qZWN0aW9uSW50ZXJwb2xhdGlvblQocHJvamVjdGlvbjogUHJvamVjdGlvbiwgem9vbTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgbWF4U2l6ZTogbnVtYmVyID0gSW5maW5pdHkpOiBudW1iZXIge1xuICAgIGNvbnN0IHJhbmdlID0gcHJvamVjdGlvbi5yYW5nZTtcbiAgICBpZiAoIXJhbmdlKSByZXR1cm4gMDtcblxuICAgIGNvbnN0IHNpemUgPSBNYXRoLm1pbihtYXhTaXplLCBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSk7XG4gICAgLy8gVGhlIGludGVycG9sYXRpb24gcmFuZ2VzIGFyZSBtYW51YWxseSBkZWZpbmVkIGJhc2VkIG9uIHdoYXQgbWFrZXNcbiAgICAvLyBzZW5zZSBpbiBhIDEwMjRweCB3aWRlIG1hcC4gQWRqdXN0IHRoZSByYW5nZXMgdG8gdGhlIGN1cnJlbnQgc2l6ZVxuICAgIC8vIG9mIHRoZSBtYXAuIFRoZSBzbWFsbGVyIHRoZSBtYXAsIHRoZSBlYXJsaWVyIHlvdSBjYW4gc3RhcnQgdW5za2V3aW5nLlxuICAgIGNvbnN0IHJhbmdlQWRqdXN0bWVudCA9IE1hdGgubG9nKHNpemUgLyAxMDI0KSAvIE1hdGguTE4yO1xuICAgIGNvbnN0IHpvb21BID0gcmFuZ2VbMF0gKyByYW5nZUFkanVzdG1lbnQ7XG4gICAgY29uc3Qgem9vbUIgPSByYW5nZVsxXSArIHJhbmdlQWRqdXN0bWVudDtcbiAgICBjb25zdCB0ID0gc21vb3Roc3RlcCh6b29tQSwgem9vbUIsIHpvb20pO1xuICAgIHJldHVybiB0O1xufVxuXG4vLyBhcHByb3guIGtpbG9tZXRlcnMgcGVyIGxvbmdpdHVkZSBkZWdyZWUgYXQgZXF1YXRvclxuY29uc3Qgb2Zmc2V0ID0gMSAvIDQwMDAwO1xuXG4vKlxuICogQ2FsY3VsYXRlcyB0aGUgc2NhbGUgZGlmZmVyZW5jZSBiZXR3ZWVuIE1lcmNhdG9yIGFuZCB0aGUgZ2l2ZW4gcHJvamVjdGlvbiBhdCBhIGNlcnRhaW4gbG9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdldFpvb21BZGp1c3RtZW50KHByb2plY3Rpb246IFByb2plY3Rpb24sIGxvYzogTG5nTGF0KSB7XG4gICAgLy8gbWFrZSBzdXJlIHdlIG9wZXJhdGUgd2l0aGluIG1lcmNhdG9yIHNwYWNlIGZvciBhZGp1c3RtZW50cyAodGhleSBjYW4gZ28gb3ZlciBmb3Igb3RoZXIgcHJvamVjdGlvbnMpXG4gICAgY29uc3QgbGF0ID0gY2xhbXAobG9jLmxhdCwgLU1BWF9NRVJDQVRPUl9MQVRJVFVERSwgTUFYX01FUkNBVE9SX0xBVElUVURFKTtcblxuICAgIGNvbnN0IGxvYzEgPSBuZXcgTG5nTGF0KGxvYy5sbmcgLSAxODAgKiBvZmZzZXQsIGxhdCk7XG4gICAgY29uc3QgbG9jMiA9IG5ldyBMbmdMYXQobG9jLmxuZyArIDE4MCAqIG9mZnNldCwgbGF0KTtcblxuICAgIGNvbnN0IHAxID0gcHJvamVjdGlvbi5wcm9qZWN0KGxvYzEubG5nLCBsYXQpO1xuICAgIGNvbnN0IHAyID0gcHJvamVjdGlvbi5wcm9qZWN0KGxvYzIubG5nLCBsYXQpO1xuXG4gICAgY29uc3QgbTEgPSBNZXJjYXRvckNvb3JkaW5hdGUuZnJvbUxuZ0xhdChsb2MxKTtcbiAgICBjb25zdCBtMiA9IE1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KGxvYzIpO1xuXG4gICAgY29uc3QgcGR4ID0gcDIueCAtIHAxLng7XG4gICAgY29uc3QgcGR5ID0gcDIueSAtIHAxLnk7XG4gICAgY29uc3QgbWR4ID0gbTIueCAtIG0xLng7XG4gICAgY29uc3QgbWR5ID0gbTIueSAtIG0xLnk7XG5cbiAgICBjb25zdCBzY2FsZSA9IE1hdGguc3FydCgobWR4ICogbWR4ICsgbWR5ICogbWR5KSAvIChwZHggKiBwZHggKyBwZHkgKiBwZHkpKTtcblxuICAgIHJldHVybiBNYXRoLmxvZyhzY2FsZSkgLyBNYXRoLkxOMjtcbn1cblxuZnVuY3Rpb24gZ2V0U2hlYXJBZGp1c3RtZW50KHByb2plY3Rpb24sIHpvb20sIGxvYywgaW50ZXJwVCwgd2l0aG91dFJvdGF0aW9uPzogYm9vbGVhbikge1xuXG4gICAgLy8gY3JlYXRlIHR3byBsb2NhdGlvbnMgYSB0aW55IGFtb3VudCAofjFrbSkgZWFzdCBhbmQgd2VzdCBvZiB0aGUgZ2l2ZW4gbG9jYXRpb25cbiAgICBjb25zdCBsb2N3ID0gbmV3IExuZ0xhdChsb2MubG5nIC0gMTgwICogb2Zmc2V0LCBsb2MubGF0KTtcbiAgICBjb25zdCBsb2NlID0gbmV3IExuZ0xhdChsb2MubG5nICsgMTgwICogb2Zmc2V0LCBsb2MubGF0KTtcblxuICAgIGNvbnN0IHB3ID0gcHJvamVjdGlvbi5wcm9qZWN0KGxvY3cubG5nLCBsb2N3LmxhdCk7XG4gICAgY29uc3QgcGUgPSBwcm9qZWN0aW9uLnByb2plY3QobG9jZS5sbmcsIGxvY2UubGF0KTtcblxuICAgIGNvbnN0IHBkeCA9IHBlLnggLSBwdy54O1xuICAgIGNvbnN0IHBkeSA9IHBlLnkgLSBwdy55O1xuXG4gICAgLy8gQ2FsY3VsYXRlIGhvdyBtdWNoIHRoZSBtYXAgd291bGQgbmVlZCB0byBiZSByb3RhdGVkIHRvIG1ha2UgZWFzdC13ZXN0IGluXG4gICAgLy8gcHJvamVjdGVkIGNvb3JkaW5hdGVzIGJlIGxlZnQtcmlnaHRcbiAgICBjb25zdCBhbmdsZUFkanVzdCA9IC1NYXRoLmF0YW4yKHBkeSwgcGR4KTtcblxuICAgIC8vIFBpY2sgYSBsb2NhdGlvbiBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsIG9uZSBleGNlcHQgZm9yIHBvbGVzIHRvIG1ha2Ugc3VyZSB3ZSdyZSB3aXRoaW4gbWVyY2F0b3IgYm91bmRzXG4gICAgY29uc3QgbWMyID0gTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQobG9jKTtcbiAgICBtYzIueSA9IGNsYW1wKG1jMi55LCAtMSArIG9mZnNldCwgMSAtIG9mZnNldCk7XG4gICAgY29uc3QgbG9jMiA9IG1jMi50b0xuZ0xhdCgpO1xuICAgIGNvbnN0IHAyID0gcHJvamVjdGlvbi5wcm9qZWN0KGxvYzIubG5nLCBsb2MyLmxhdCk7XG5cbiAgICAvLyBGaW5kIHRoZSBwcm9qZWN0ZWQgY29vcmRpbmF0ZXMgb2YgdHdvIGxvY2F0aW9ucywgb25lIHNsaWdodGx5IHNvdXRoIGFuZCBvbmUgc2xpZ2h0bHkgZWFzdC5cbiAgICAvLyBUaGVuIGNhbGN1bGF0ZSB0aGUgdHJhbnNmb3JtIHRoYXQgd291bGQgbWFrZSB0aGUgcHJvamVjdGVkIGNvb3JkaW5hdGVzIG9mIHRoZSB0d28gbG9jYXRpb25zIGJlOlxuICAgIC8vIC0gZXF1YWwgZGlzdGFuY2VzIGZyb20gdGhlIG9yaWdpbmFsIGxvY2F0aW9uXG4gICAgLy8gLSBwZXJwZW5kaWN1bGFyIHRvIG9uZSBhbm90aGVyXG4gICAgLy9cbiAgICAvLyBPbmx5IHRoZSBwb3NpdGlvbiBvZiB0aGUgY29vcmRpbmF0ZSB0byB0aGUgbm9ydGggaXMgYWRqdXN0ZWQuXG4gICAgLy8gVGhlIGNvb3JkaW5hdGUgdG8gdGhlIGVhc3Qgc3RheXMgd2hlcmUgaXQgaXMuXG4gICAgY29uc3QgbWMzID0gTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQobG9jMik7XG4gICAgbWMzLnggKz0gb2Zmc2V0O1xuICAgIGNvbnN0IGxvYzMgPSBtYzMudG9MbmdMYXQoKTtcbiAgICBjb25zdCBwMyA9IHByb2plY3Rpb24ucHJvamVjdChsb2MzLmxuZywgbG9jMy5sYXQpO1xuICAgIGNvbnN0IHBkeDMgPSBwMy54IC0gcDIueDtcbiAgICBjb25zdCBwZHkzID0gcDMueSAtIHAyLnk7XG4gICAgY29uc3QgZGVsdGEzID0gcm90YXRlKHBkeDMsIHBkeTMsIGFuZ2xlQWRqdXN0KTtcblxuICAgIGNvbnN0IG1jNCA9IE1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KGxvYzIpO1xuICAgIG1jNC55ICs9IG9mZnNldDtcbiAgICBjb25zdCBsb2M0ID0gbWM0LnRvTG5nTGF0KCk7XG4gICAgY29uc3QgcDQgPSBwcm9qZWN0aW9uLnByb2plY3QobG9jNC5sbmcsIGxvYzQubGF0KTtcbiAgICBjb25zdCBwZHg0ID0gcDQueCAtIHAyLng7XG4gICAgY29uc3QgcGR5NCA9IHA0LnkgLSBwMi55O1xuICAgIGNvbnN0IGRlbHRhNCA9IHJvdGF0ZShwZHg0LCBwZHk0LCBhbmdsZUFkanVzdCk7XG5cbiAgICBjb25zdCBzY2FsZSA9IE1hdGguYWJzKGRlbHRhMy54KSAvIE1hdGguYWJzKGRlbHRhNC55KTtcblxuICAgIGNvbnN0IHVucm90YXRlID0gbWF0NC5pZGVudGl0eShbXSk7XG4gICAgbWF0NC5yb3RhdGVaKHVucm90YXRlLCB1bnJvdGF0ZSwgKC1hbmdsZUFkanVzdCkgKiAoMSAtICh3aXRob3V0Um90YXRpb24gPyAwIDogaW50ZXJwVCkpKTtcblxuICAgIC8vIHVuc2tld1xuICAgIGNvbnN0IHNoZWFyID0gbWF0NC5pZGVudGl0eShbXSk7XG4gICAgbWF0NC5zY2FsZShzaGVhciwgc2hlYXIsIFsxLCAxIC0gKDEgLSBzY2FsZSkgKiBpbnRlcnBULCAxXSk7XG4gICAgc2hlYXJbNF0gPSAtZGVsdGE0LnggLyBkZWx0YTQueSAqIGludGVycFQ7XG5cbiAgICAvLyB1bnJvdGF0ZVxuICAgIG1hdDQucm90YXRlWihzaGVhciwgc2hlYXIsIGFuZ2xlQWRqdXN0KTtcblxuICAgIG1hdDQubXVsdGlwbHkoc2hlYXIsIHVucm90YXRlLCBzaGVhcik7XG5cbiAgICByZXR1cm4gc2hlYXI7XG59XG5cbmZ1bmN0aW9uIHJvdGF0ZSh4LCB5LCBhbmdsZSkge1xuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCAqIGNvcyAtIHkgKiBzaW4sXG4gICAgICAgIHk6IHggKiBzaW4gKyB5ICogY29zXG4gICAgfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBMbmdMYXQgZnJvbSAnLi9sbmdfbGF0LmpzJztcbmltcG9ydCBMbmdMYXRCb3VuZHMgZnJvbSAnLi9sbmdfbGF0X2JvdW5kcy5qcyc7XG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlLCB7bWVyY2F0b3JYZnJvbUxuZywgbWVyY2F0b3JZZnJvbUxhdCwgbWVyY2F0b3JaZnJvbUFsdGl0dWRlLCBsYXRGcm9tTWVyY2F0b3JZLCBNQVhfTUVSQ0FUT1JfTEFUSVRVREUsIGNpcmN1bWZlcmVuY2VBdExhdGl0dWRlfSBmcm9tICcuL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHtnZXRQcm9qZWN0aW9ufSBmcm9tICcuL3Byb2plY3Rpb24vaW5kZXguanMnO1xuaW1wb3J0IHt0aWxlQUFCQn0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vdGlsZV90cmFuc2Zvcm0uanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHt3cmFwLCBjbGFtcCwgcGljaywgcmFkVG9EZWcsIGRlZ1RvUmFkLCBnZXRBQUJCUG9pbnRTcXVhcmVEaXN0LCBmdXJ0aGVzdFRpbGVDb3JuZXIsIHdhcm5PbmNlLCBkZWVwRXF1YWx9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge251bWJlciBhcyBpbnRlcnBvbGF0ZX0gZnJvbSAnLi4vc3R5bGUtc3BlYy91dGlsL2ludGVycG9sYXRlLmpzJztcbmltcG9ydCBFWFRFTlQgZnJvbSAnLi4vZGF0YS9leHRlbnQuanMnO1xuaW1wb3J0IHt2ZWM0LCBtYXQ0LCBtYXQyLCB2ZWMzLCBxdWF0fSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHtGcnVzdHVtLCBGcnVzdHVtQ29ybmVycywgUmF5fSBmcm9tICcuLi91dGlsL3ByaW1pdGl2ZXMuanMnO1xuaW1wb3J0IEVkZ2VJbnNldHMgZnJvbSAnLi9lZGdlX2luc2V0cy5qcyc7XG5pbXBvcnQge0ZyZWVDYW1lcmEsIEZyZWVDYW1lcmFPcHRpb25zLCBvcmllbnRhdGlvbkZyb21GcmFtZX0gZnJvbSAnLi4vdWkvZnJlZV9jYW1lcmEuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IGdldFByb2plY3Rpb25BZGp1c3RtZW50cywge2dldFByb2plY3Rpb25BZGp1c3RtZW50SW52ZXJ0ZWQsIGdldFNjYWxlQWRqdXN0bWVudCwgZ2V0UHJvamVjdGlvbkludGVycG9sYXRpb25UfSBmcm9tICcuL3Byb2plY3Rpb24vYWRqdXN0bWVudHMuanMnO1xuaW1wb3J0IHtnZXRQaXhlbHNUb1RpbGVVbml0c01hdHJpeH0gZnJvbSAnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzLmpzJztcbmltcG9ydCB7VW53cmFwcGVkVGlsZUlELCBPdmVyc2NhbGVkVGlsZUlELCBDYW5vbmljYWxUaWxlSUR9IGZyb20gJy4uL3NvdXJjZS90aWxlX2lkLmpzJztcbmltcG9ydCB7Y2FsY3VsYXRlR2xvYmVNYXRyaXgsIEdMT0JFX1pPT01fVEhSRVNIT0xEX01JTiwgR0xPQkVfU0NBTEVfTUFUQ0hfTEFUSVRVREV9IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL2dsb2JlX3V0aWwuanMnO1xuaW1wb3J0IHtwcm9qZWN0Q2xhbXBlZH0gZnJvbSAnLi4vc3ltYm9sL3Byb2plY3Rpb24uanMnO1xuXG5pbXBvcnQgdHlwZSBQcm9qZWN0aW9uIGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL3Byb2plY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUge0VsZXZhdGlvbn0gZnJvbSAnLi4vdGVycmFpbi9lbGV2YXRpb24uanMnO1xuaW1wb3J0IHR5cGUge1BhZGRpbmdPcHRpb25zfSBmcm9tICcuL2VkZ2VfaW5zZXRzLmpzJztcbmltcG9ydCB0eXBlIFRpbGUgZnJvbSAnLi4vc291cmNlL3RpbGUuanMnO1xuaW1wb3J0IHR5cGUge1Byb2plY3Rpb25TcGVjaWZpY2F0aW9ufSBmcm9tICcuLi9zdHlsZS1zcGVjL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtGZWF0dXJlRGlzdGFuY2VEYXRhfSBmcm9tICcuLi9zdHlsZS1zcGVjL2ZlYXR1cmVfZmlsdGVyL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtWZWMzLCBWZWM0LCBRdWF0fSBmcm9tICdnbC1tYXRyaXgnO1xuXG5jb25zdCBOVU1fV09STERfQ09QSUVTID0gMztcbmNvbnN0IERFRkFVTFRfTUlOX1pPT00gPSAwO1xuXG50eXBlIFJheUludGVyc2VjdGlvblJlc3VsdCA9IHsgcDA6IFZlYzQsIHAxOiBWZWM0LCB0OiBudW1iZXJ9O1xudHlwZSBFbGV2YXRpb25SZWZlcmVuY2UgPSBcInNlYVwiIHwgXCJncm91bmRcIjtcblxuLyoqXG4gKiBBIHNpbmdsZSB0cmFuc2Zvcm0sIGdlbmVyYWxseSB1c2VkIGZvciBhIHNpbmdsZSB0aWxlIHRvIGJlXG4gKiBzY2FsZWQsIHJvdGF0ZWQsIGFuZCB6b29tZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUcmFuc2Zvcm0ge1xuICAgIHRpbGVTaXplOiBudW1iZXI7XG4gICAgdGlsZVpvb206IG51bWJlcjtcbiAgICBtYXhCb3VuZHM6ID9MbmdMYXRCb3VuZHM7XG5cbiAgICAvLyAyXnpvb20gKHdvcmxkU2l6ZSA9IHRpbGVTaXplICogc2NhbGUpXG4gICAgc2NhbGU6IG51bWJlcjtcblxuICAgIC8vIE1hcCB2aWV3cG9ydCBzaXplIChub3QgaW5jbHVkaW5nIHRoZSBwaXhlbCByYXRpbylcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuXG4gICAgLy8gQmVhcmluZywgcmFkaWFucywgaW4gWy1waSwgcGldXG4gICAgYW5nbGU6IG51bWJlcjtcblxuICAgIC8vIDJEIHJvdGF0aW9uIG1hdHJpeCBpbiB0aGUgaG9yaXpvbnRhbCBwbGFuZSwgYXMgYSBmdW5jdGlvbiBvZiBiZWFyaW5nXG4gICAgcm90YXRpb25NYXRyaXg6IEZsb2F0MzJBcnJheTtcblxuICAgIC8vIFpvb20sIG1vZHVsbyAxXG4gICAgem9vbUZyYWN0aW9uOiBudW1iZXI7XG5cbiAgICAvLyBUaGUgc2NhbGUgZmFjdG9yIGNvbXBvbmVudCBvZiB0aGUgY29udmVyc2lvbiBmcm9tIHBpeGVscyAoWzAsIHddIHggW2gsIDBdKSB0byBHTFxuICAgIC8vIE5EQyAoWzEsIC0xXSB4IFsxLCAtMV0pIChub3RlIGZsaXBwZWQgeSlcbiAgICBwaXhlbHNUb0dMVW5pdHM6IFtudW1iZXIsIG51bWJlcl07XG5cbiAgICAvLyBEaXN0YW5jZSBmcm9tIGNhbWVyYSB0byB0aGUgY2VudGVyLCBpbiBzY3JlZW4gcGl4ZWwgdW5pdHMsIGluZGVwZW5kZW50IG9mIHpvb21cbiAgICBjYW1lcmFUb0NlbnRlckRpc3RhbmNlOiBudW1iZXI7XG5cbiAgICAvLyBQcm9qZWN0aW9uIGZyb20gbWVyY2F0b3IgY29vcmRpbmF0ZXMgKFswLCAwXSBudywgWzEsIDFdIHNlKSB0byBHTCBjbGlwIGNvb3JkaW5hdGVzXG4gICAgbWVyY2F0b3JNYXRyaXg6IEFycmF5PG51bWJlcj47XG5cbiAgICAvLyBUcmFuc2xhdGUgcG9pbnRzIGluIG1lcmNhdG9yIGNvb3JkaW5hdGVzIHRvIGJlIGNlbnRlcmVkIGFib3V0IHRoZSBjYW1lcmEsIHdpdGggdW5pdHMgY2hvc2VuXG4gICAgLy8gZm9yIHNjcmVlbi1oZWlnaHQtaW5kZXBlbmRlbnQgc2NhbGluZyBvZiBmb2cuIE5vdCBhZmZlY3RlZCBieSBvcmllbnRhdGlvbiBvZiBjYW1lcmEuXG4gICAgbWVyY2F0b3JGb2dNYXRyaXg6IEZsb2F0MzJBcnJheTtcblxuICAgIC8vIFByb2plY3Rpb24gZnJvbSB3b3JsZCBjb29yZGluYXRlcyAobWVyY2F0b3Igc2NhbGVkIGJ5IHdvcmxkU2l6ZSkgdG8gY2xpcCBjb29yZGluYXRlc1xuICAgIHByb2pNYXRyaXg6IEFycmF5PG51bWJlcj47XG4gICAgaW52UHJvak1hdHJpeDogRmxvYXQ2NEFycmF5O1xuXG4gICAgLy8gU2FtZSBhcyBwcm9qTWF0cml4LCBwaXhlbC1hbGlnbmVkIHRvIGF2b2lkIGZyYWN0aW9uYWwgcGl4ZWxzIGZvciByYXN0ZXIgdGlsZXNcbiAgICBhbGlnbmVkUHJvak1hdHJpeDogRmxvYXQ2NEFycmF5O1xuXG4gICAgLy8gRnJvbSB3b3JsZCBjb29yZGluYXRlcyB0byBzY3JlZW4gcGl4ZWwgY29vcmRpbmF0ZXMgKHByb2pNYXRyaXggcHJlbXVsdGlwbGllZCBieSBsYWJlbFBsYW5lTWF0cml4KVxuICAgIHBpeGVsTWF0cml4OiBGbG9hdDY0QXJyYXk7XG4gICAgcGl4ZWxNYXRyaXhJbnZlcnNlOiBGbG9hdDY0QXJyYXk7XG5cbiAgICB3b3JsZFRvRm9nTWF0cml4OiBGbG9hdDY0QXJyYXk7XG4gICAgc2t5Ym94TWF0cml4OiBGbG9hdDMyQXJyYXk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gZnJvbSBzY3JlZW4gY29vcmRpbmF0ZXMgdG8gR0wgTkRDLCBbMCwgd10geCBbaCwgMF0gLS0+IFstMSwgMV0geCBbLTEsIDFdXG4gICAgLy8gUm91Z2hseSBzcGVha2luZywgYXBwbGllcyBwaXhlbHNUb0dMVW5pdHMgc2NhbGluZyB3aXRoIGEgdHJhbnNsYXRpb25cbiAgICBnbENvb3JkTWF0cml4OiBGbG9hdDMyQXJyYXk7XG5cbiAgICAvLyBJbnZlcnNlIG9mIGdsQ29vcmRNYXRyaXgsIGZyb20gTkRDIHRvIHNjcmVlbiBjb29yZGluYXRlcywgWy0xLCAxXSB4IFstMSwgMV0gLS0+IFswLCB3XSB4IFtoLCAwXVxuICAgIGxhYmVsUGxhbmVNYXRyaXg6IEZsb2F0MzJBcnJheTtcblxuICAgIC8vIGdsb2JlIGNvb3JkaW5hdGUgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gICAgZ2xvYmVNYXRyaXg6IEZsb2F0NjRBcnJheTtcblxuICAgIGdsb2JlQ2VudGVySW5WaWV3U3BhY2U6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICBnbG9iZVJhZGl1czogbnVtYmVyO1xuXG4gICAgaW52ZXJzZUFkanVzdG1lbnRNYXRyaXg6IEFycmF5PG51bWJlcj47XG5cbiAgICBtZXJjYXRvckZyb21UcmFuc2l0aW9uOiBib29sZWFuO1xuXG4gICAgbWluTG5nOiBudW1iZXI7XG4gICAgbWF4TG5nOiBudW1iZXI7XG4gICAgbWluTGF0OiBudW1iZXI7XG4gICAgbWF4TGF0OiBudW1iZXI7XG4gICAgd29ybGRNaW5YOiBudW1iZXI7XG4gICAgd29ybGRNYXhYOiBudW1iZXI7XG4gICAgd29ybGRNaW5ZOiBudW1iZXI7XG4gICAgd29ybGRNYXhZOiBudW1iZXI7XG5cbiAgICBmcnVzdHVtQ29ybmVyczogRnJ1c3R1bUNvcm5lcnM7XG5cbiAgICBmcmVlemVUaWxlQ292ZXJhZ2U6IGJvb2xlYW47XG4gICAgY2FtZXJhRWxldmF0aW9uUmVmZXJlbmNlOiBFbGV2YXRpb25SZWZlcmVuY2U7XG4gICAgZm9nQ3VsbERpc3RTcTogP251bWJlcjtcbiAgICBfYXZlcmFnZUVsZXZhdGlvbjogbnVtYmVyO1xuICAgIHByb2plY3Rpb25PcHRpb25zOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbjtcbiAgICBwcm9qZWN0aW9uOiBQcm9qZWN0aW9uO1xuICAgIF9lbGV2YXRpb246ID9FbGV2YXRpb247XG4gICAgX2ZvdjogbnVtYmVyO1xuICAgIF9waXRjaDogbnVtYmVyO1xuICAgIF96b29tOiBudW1iZXI7XG4gICAgX3NlYUxldmVsWm9vbTogP251bWJlcjtcbiAgICBfdW5tb2RpZmllZDogYm9vbGVhbjtcbiAgICBfcmVuZGVyV29ybGRDb3BpZXM6IGJvb2xlYW47XG4gICAgX21pblpvb206IG51bWJlcjtcbiAgICBfbWF4Wm9vbTogbnVtYmVyO1xuICAgIF9taW5QaXRjaDogbnVtYmVyO1xuICAgIF9tYXhQaXRjaDogbnVtYmVyO1xuICAgIF9jZW50ZXI6IExuZ0xhdDtcbiAgICBfZWRnZUluc2V0czogRWRnZUluc2V0cztcbiAgICBfY29uc3RyYWluaW5nOiBib29sZWFuO1xuICAgIF9wcm9qTWF0cml4Q2FjaGU6IHtbXzogbnVtYmVyXTogRmxvYXQzMkFycmF5fTtcbiAgICBfYWxpZ25lZFByb2pNYXRyaXhDYWNoZToge1tfOiBudW1iZXJdOiBGbG9hdDMyQXJyYXl9O1xuICAgIF9waXhlbHNUb1RpbGVVbml0c0NhY2hlOiB7W186IG51bWJlcl06IEZsb2F0MzJBcnJheX07XG4gICAgX2ZvZ1RpbGVNYXRyaXhDYWNoZToge1tfOiBudW1iZXJdOiBGbG9hdDMyQXJyYXl9O1xuICAgIF9kaXN0YW5jZVRpbGVEYXRhQ2FjaGU6IHtbXzogbnVtYmVyXTogRmVhdHVyZURpc3RhbmNlRGF0YX07XG4gICAgX2NhbWVyYTogRnJlZUNhbWVyYTtcbiAgICBfY2VudGVyQWx0aXR1ZGU6IG51bWJlcjtcbiAgICBfY2VudGVyQWx0aXR1ZGVWYWxpZEZvckV4YWdnZXJhdGlvbjogP251bWJlcjtcbiAgICBfaG9yaXpvblNoaWZ0OiBudW1iZXI7XG4gICAgX3Byb2plY3Rpb25TY2FsZXI6IG51bWJlcjtcbiAgICBfbmVhclo6IG51bWJlcjtcbiAgICBfZmFyWjogbnVtYmVyO1xuICAgIF9tZXJjYXRvclNjYWxlUmF0aW86IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKG1pblpvb206ID9udW1iZXIsIG1heFpvb206ID9udW1iZXIsIG1pblBpdGNoOiA/bnVtYmVyLCBtYXhQaXRjaDogP251bWJlciwgcmVuZGVyV29ybGRDb3BpZXM6IGJvb2xlYW4gfCB2b2lkLCBwcm9qZWN0aW9uPzogP1Byb2plY3Rpb25TcGVjaWZpY2F0aW9uLCBib3VuZHM6ID9MbmdMYXRCb3VuZHMpIHtcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IDUxMjsgLy8gY29uc3RhbnRcblxuICAgICAgICB0aGlzLl9yZW5kZXJXb3JsZENvcGllcyA9IHJlbmRlcldvcmxkQ29waWVzID09PSB1bmRlZmluZWQgPyB0cnVlIDogcmVuZGVyV29ybGRDb3BpZXM7XG4gICAgICAgIHRoaXMuX21pblpvb20gPSBtaW5ab29tIHx8IERFRkFVTFRfTUlOX1pPT007XG4gICAgICAgIHRoaXMuX21heFpvb20gPSBtYXhab29tIHx8IDIyO1xuXG4gICAgICAgIHRoaXMuX21pblBpdGNoID0gKG1pblBpdGNoID09PSB1bmRlZmluZWQgfHwgbWluUGl0Y2ggPT09IG51bGwpID8gMCA6IG1pblBpdGNoO1xuICAgICAgICB0aGlzLl9tYXhQaXRjaCA9IChtYXhQaXRjaCA9PT0gdW5kZWZpbmVkIHx8IG1heFBpdGNoID09PSBudWxsKSA/IDYwIDogbWF4UGl0Y2g7XG5cbiAgICAgICAgdGhpcy5zZXRQcm9qZWN0aW9uKHByb2plY3Rpb24pO1xuICAgICAgICB0aGlzLnNldE1heEJvdW5kcyhib3VuZHMpO1xuXG4gICAgICAgIHRoaXMud2lkdGggPSAwO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuX2NlbnRlciA9IG5ldyBMbmdMYXQoMCwgMCk7XG4gICAgICAgIHRoaXMuem9vbSA9IDA7XG4gICAgICAgIHRoaXMuYW5nbGUgPSAwO1xuICAgICAgICB0aGlzLl9mb3YgPSAwLjY0MzUwMTEwODc5MzI4NDQ7XG4gICAgICAgIHRoaXMuX3BpdGNoID0gMDtcbiAgICAgICAgdGhpcy5fbmVhclogPSAwO1xuICAgICAgICB0aGlzLl9mYXJaID0gMDtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2VkZ2VJbnNldHMgPSBuZXcgRWRnZUluc2V0cygpO1xuICAgICAgICB0aGlzLl9wcm9qTWF0cml4Q2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5fYWxpZ25lZFByb2pNYXRyaXhDYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLl9mb2dUaWxlTWF0cml4Q2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5fZGlzdGFuY2VUaWxlRGF0YUNhY2hlID0ge307XG4gICAgICAgIHRoaXMuX2NhbWVyYSA9IG5ldyBGcmVlQ2FtZXJhKCk7XG4gICAgICAgIHRoaXMuX2NlbnRlckFsdGl0dWRlID0gMDtcbiAgICAgICAgdGhpcy5fYXZlcmFnZUVsZXZhdGlvbiA9IDA7XG4gICAgICAgIHRoaXMuY2FtZXJhRWxldmF0aW9uUmVmZXJlbmNlID0gXCJncm91bmRcIjtcbiAgICAgICAgdGhpcy5fcHJvamVjdGlvblNjYWxlciA9IDEuMDtcbiAgICAgICAgdGhpcy5nbG9iZVJhZGl1cyA9IDA7XG4gICAgICAgIHRoaXMuZ2xvYmVDZW50ZXJJblZpZXdTcGFjZSA9IFswLCAwLCAwXTtcblxuICAgICAgICAvLyBNb3ZlIHRoZSBob3Jpem9uIGNsb3NlciB0byB0aGUgY2VudGVyLiAwIHdvdWxkIG5vdCBzaGlmdCB0aGUgaG9yaXpvbi4gMSB3b3VsZCBwdXQgdGhlIGhvcml6b24gYXQgdGhlIGNlbnRlci5cbiAgICAgICAgdGhpcy5faG9yaXpvblNoaWZ0ID0gMC4xO1xuICAgIH1cblxuICAgIGNsb25lKCk6IFRyYW5zZm9ybSB7XG4gICAgICAgIGNvbnN0IGNsb25lID0gbmV3IFRyYW5zZm9ybSh0aGlzLl9taW5ab29tLCB0aGlzLl9tYXhab29tLCB0aGlzLl9taW5QaXRjaCwgdGhpcy5tYXhQaXRjaCwgdGhpcy5fcmVuZGVyV29ybGRDb3BpZXMsIHRoaXMuZ2V0UHJvamVjdGlvbigpKTtcbiAgICAgICAgY2xvbmUuX2VsZXZhdGlvbiA9IHRoaXMuX2VsZXZhdGlvbjtcbiAgICAgICAgY2xvbmUuX2NlbnRlckFsdGl0dWRlID0gdGhpcy5fY2VudGVyQWx0aXR1ZGU7XG4gICAgICAgIGNsb25lLl9jZW50ZXJBbHRpdHVkZVZhbGlkRm9yRXhhZ2dlcmF0aW9uID0gdGhpcy5fY2VudGVyQWx0aXR1ZGVWYWxpZEZvckV4YWdnZXJhdGlvbjtcbiAgICAgICAgY2xvbmUudGlsZVNpemUgPSB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjbG9uZS53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIGNsb25lLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgICBjbG9uZS5jYW1lcmFFbGV2YXRpb25SZWZlcmVuY2UgPSB0aGlzLmNhbWVyYUVsZXZhdGlvblJlZmVyZW5jZTtcbiAgICAgICAgY2xvbmUuX2NlbnRlciA9IHRoaXMuX2NlbnRlcjtcbiAgICAgICAgY2xvbmUuX3NldFpvb20odGhpcy56b29tKTtcbiAgICAgICAgY2xvbmUuX3NlYUxldmVsWm9vbSA9IHRoaXMuX3NlYUxldmVsWm9vbTtcbiAgICAgICAgY2xvbmUuYW5nbGUgPSB0aGlzLmFuZ2xlO1xuICAgICAgICBjbG9uZS5fZm92ID0gdGhpcy5fZm92O1xuICAgICAgICBjbG9uZS5fcGl0Y2ggPSB0aGlzLl9waXRjaDtcbiAgICAgICAgY2xvbmUuX25lYXJaID0gdGhpcy5fbmVhclo7XG4gICAgICAgIGNsb25lLl9mYXJaID0gdGhpcy5fZmFyWjtcbiAgICAgICAgY2xvbmUuX2F2ZXJhZ2VFbGV2YXRpb24gPSB0aGlzLl9hdmVyYWdlRWxldmF0aW9uO1xuICAgICAgICBjbG9uZS5fdW5tb2RpZmllZCA9IHRoaXMuX3VubW9kaWZpZWQ7XG4gICAgICAgIGNsb25lLl9lZGdlSW5zZXRzID0gdGhpcy5fZWRnZUluc2V0cy5jbG9uZSgpO1xuICAgICAgICBjbG9uZS5fY2FtZXJhID0gdGhpcy5fY2FtZXJhLmNsb25lKCk7XG4gICAgICAgIGNsb25lLl9jYWxjTWF0cmljZXMoKTtcbiAgICAgICAgY2xvbmUuZnJlZXplVGlsZUNvdmVyYWdlID0gdGhpcy5mcmVlemVUaWxlQ292ZXJhZ2U7XG4gICAgICAgIGNsb25lLmZydXN0dW1Db3JuZXJzID0gdGhpcy5mcnVzdHVtQ29ybmVycztcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cblxuICAgIGdldCBlbGV2YXRpb24oKTogP0VsZXZhdGlvbiB7IHJldHVybiB0aGlzLl9lbGV2YXRpb247IH1cbiAgICBzZXQgZWxldmF0aW9uKGVsZXZhdGlvbjogP0VsZXZhdGlvbikge1xuICAgICAgICBpZiAodGhpcy5fZWxldmF0aW9uID09PSBlbGV2YXRpb24pIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWxldmF0aW9uID0gZWxldmF0aW9uO1xuICAgICAgICB0aGlzLl91cGRhdGVDYW1lcmFPblRlcnJhaW4oKTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuICAgIHVwZGF0ZUVsZXZhdGlvbihjb25zdHJhaW5DYW1lcmFPdmVyVGVycmFpbjogYm9vbGVhbikgeyAvLyBPbiByZW5kZXIsIG5vIG5lZWQgZm9yIGhpZ2hlciBncmFudWxhcml0eSBvbiB1cGRhdGUgcmVhc29ucy5cbiAgICAgICAgY29uc3QgY2VudGVyQWx0aXR1ZGVDaGFuZ2VkID0gdGhpcy5fZWxldmF0aW9uICYmIHRoaXMuX2VsZXZhdGlvbi5leGFnZ2VyYXRpb24oKSAhPT0gdGhpcy5fY2VudGVyQWx0aXR1ZGVWYWxpZEZvckV4YWdnZXJhdGlvbjtcbiAgICAgICAgaWYgKHRoaXMuX3NlYUxldmVsWm9vbSA9PSBudWxsIHx8IGNlbnRlckFsdGl0dWRlQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2FtZXJhT25UZXJyYWluKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnN0cmFpbkNhbWVyYU92ZXJUZXJyYWluIHx8IGNlbnRlckFsdGl0dWRlQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fY29uc3RyYWluQ2FtZXJhQWx0aXR1ZGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBnZXRQcm9qZWN0aW9uKCk6IFByb2plY3Rpb25TcGVjaWZpY2F0aW9uIHtcbiAgICAgICAgcmV0dXJuIChwaWNrKHRoaXMucHJvamVjdGlvbiwgWyduYW1lJywgJ2NlbnRlcicsICdwYXJhbGxlbHMnXSk6IFByb2plY3Rpb25TcGVjaWZpY2F0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb2plY3Rpb24gY2hhbmdlc1xuICAgIHNldFByb2plY3Rpb24ocHJvamVjdGlvbj86ID9Qcm9qZWN0aW9uU3BlY2lmaWNhdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICB0aGlzLnByb2plY3Rpb25PcHRpb25zID0gcHJvamVjdGlvbiB8fCB7bmFtZTogJ21lcmNhdG9yJ307XG5cbiAgICAgICAgY29uc3Qgb2xkUHJvamVjdGlvbiA9IHRoaXMucHJvamVjdGlvbiA/IHRoaXMuZ2V0UHJvamVjdGlvbigpIDogdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnByb2plY3Rpb24gPSBnZXRQcm9qZWN0aW9uKHRoaXMucHJvamVjdGlvbk9wdGlvbnMpO1xuICAgICAgICBjb25zdCBuZXdQcm9qZWN0aW9uID0gdGhpcy5nZXRQcm9qZWN0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgcHJvamVjdGlvbkhhc0NoYW5nZWQgPSAhZGVlcEVxdWFsKG9sZFByb2plY3Rpb24sIG5ld1Byb2plY3Rpb24pO1xuICAgICAgICBpZiAocHJvamVjdGlvbkhhc0NoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb2plY3Rpb25IYXNDaGFuZ2VkO1xuICAgIH1cblxuICAgIGdldCBtaW5ab29tKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9taW5ab29tOyB9XG4gICAgc2V0IG1pblpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9taW5ab29tID09PSB6b29tKSByZXR1cm47XG4gICAgICAgIHRoaXMuX21pblpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnpvb20gPSBNYXRoLm1heCh0aGlzLnpvb20sIHpvb20pO1xuICAgIH1cblxuICAgIGdldCBtYXhab29tKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9tYXhab29tOyB9XG4gICAgc2V0IG1heFpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXhab29tID09PSB6b29tKSByZXR1cm47XG4gICAgICAgIHRoaXMuX21heFpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnpvb20gPSBNYXRoLm1pbih0aGlzLnpvb20sIHpvb20pO1xuICAgIH1cblxuICAgIGdldCBtaW5QaXRjaCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbWluUGl0Y2g7IH1cbiAgICBzZXQgbWluUGl0Y2gocGl0Y2g6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5fbWluUGl0Y2ggPT09IHBpdGNoKSByZXR1cm47XG4gICAgICAgIHRoaXMuX21pblBpdGNoID0gcGl0Y2g7XG4gICAgICAgIHRoaXMucGl0Y2ggPSBNYXRoLm1heCh0aGlzLnBpdGNoLCBwaXRjaCk7XG4gICAgfVxuXG4gICAgZ2V0IG1heFBpdGNoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9tYXhQaXRjaDsgfVxuICAgIHNldCBtYXhQaXRjaChwaXRjaDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXhQaXRjaCA9PT0gcGl0Y2gpIHJldHVybjtcbiAgICAgICAgdGhpcy5fbWF4UGl0Y2ggPSBwaXRjaDtcbiAgICAgICAgdGhpcy5waXRjaCA9IE1hdGgubWluKHRoaXMucGl0Y2gsIHBpdGNoKTtcbiAgICB9XG5cbiAgICBnZXQgcmVuZGVyV29ybGRDb3BpZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJXb3JsZENvcGllcyAmJiB0aGlzLnByb2plY3Rpb24uc3VwcG9ydHNXb3JsZENvcGllcyA9PT0gdHJ1ZTtcbiAgICB9XG4gICAgc2V0IHJlbmRlcldvcmxkQ29waWVzKHJlbmRlcldvcmxkQ29waWVzPzogP2Jvb2xlYW4pIHtcbiAgICAgICAgaWYgKHJlbmRlcldvcmxkQ29waWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlbmRlcldvcmxkQ29waWVzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChyZW5kZXJXb3JsZENvcGllcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmVuZGVyV29ybGRDb3BpZXMgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3JlbmRlcldvcmxkQ29waWVzID0gcmVuZGVyV29ybGRDb3BpZXM7XG4gICAgfVxuXG4gICAgZ2V0IHdvcmxkU2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlU2l6ZSAqIHRoaXMuc2NhbGU7XG4gICAgfVxuXG4gICAgZ2V0IGNhbWVyYVdvcmxkU2l6ZSgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGgubWF4KHRoaXMuX2NhbWVyYS5nZXREaXN0YW5jZVRvRWxldmF0aW9uKHRoaXMuX2F2ZXJhZ2VFbGV2YXRpb24pLCBOdW1iZXIuRVBTSUxPTik7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3JsZFNpemVGcm9tWm9vbSh0aGlzLl96b29tRnJvbU1lcmNhdG9yWihkaXN0YW5jZSkpO1xuICAgIH1cblxuICAgIGdldCBwaXhlbHNQZXJNZXRlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0aW9uLnBpeGVsc1Blck1ldGVyKHRoaXMuY2VudGVyLmxhdCwgdGhpcy53b3JsZFNpemUpO1xuICAgIH1cblxuICAgIGdldCBjYW1lcmFQaXhlbHNQZXJNZXRlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKHRoaXMuY2VudGVyLmxhdCwgdGhpcy5jYW1lcmFXb3JsZFNpemUpO1xuICAgIH1cblxuICAgIGdldCBjZW50ZXJPZmZzZXQoKTogUG9pbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jZW50ZXJQb2ludC5fc3ViKHRoaXMuc2l6ZS5fZGl2KDIpKTtcbiAgICB9XG5cbiAgICBnZXQgc2l6ZSgpOiBQb2ludCB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgIH1cblxuICAgIGdldCBiZWFyaW5nKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB3cmFwKHRoaXMucm90YXRpb24sIC0xODAsIDE4MCk7XG4gICAgfVxuXG4gICAgc2V0IGJlYXJpbmcoYmVhcmluZzogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMucm90YXRpb24gPSBiZWFyaW5nO1xuICAgIH1cblxuICAgIGdldCByb3RhdGlvbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gLXRoaXMuYW5nbGUgLyBNYXRoLlBJICogMTgwO1xuICAgIH1cblxuICAgIHNldCByb3RhdGlvbihyb3RhdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGIgPSAtcm90YXRpb24gKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgICBpZiAodGhpcy5hbmdsZSA9PT0gYikgcmV0dXJuO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW5nbGUgPSBiO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcblxuICAgICAgICAvLyAyeDIgbWF0cml4IGZvciByb3RhdGluZyBwb2ludHNcbiAgICAgICAgdGhpcy5yb3RhdGlvbk1hdHJpeCA9IG1hdDIuY3JlYXRlKCk7XG4gICAgICAgIG1hdDIucm90YXRlKHRoaXMucm90YXRpb25NYXRyaXgsIHRoaXMucm90YXRpb25NYXRyaXgsIHRoaXMuYW5nbGUpO1xuICAgIH1cblxuICAgIGdldCBwaXRjaCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGl0Y2ggLyBNYXRoLlBJICogMTgwO1xuICAgIH1cbiAgICBzZXQgcGl0Y2gocGl0Y2g6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwID0gY2xhbXAocGl0Y2gsIHRoaXMubWluUGl0Y2gsIHRoaXMubWF4UGl0Y2gpIC8gMTgwICogTWF0aC5QSTtcbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoID09PSBwKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcGl0Y2ggPSBwO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBnZXQgZm92KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3YgLyBNYXRoLlBJICogMTgwO1xuICAgIH1cbiAgICBzZXQgZm92KGZvdjogbnVtYmVyKSB7XG4gICAgICAgIGZvdiA9IE1hdGgubWF4KDAuMDEsIE1hdGgubWluKDYwLCBmb3YpKTtcbiAgICAgICAgaWYgKHRoaXMuX2ZvdiA9PT0gZm92KSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZm92ID0gZm92IC8gMTgwICogTWF0aC5QSTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IGF2ZXJhZ2VFbGV2YXRpb24oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F2ZXJhZ2VFbGV2YXRpb247XG4gICAgfVxuICAgIHNldCBhdmVyYWdlRWxldmF0aW9uKGF2ZXJhZ2VFbGV2YXRpb246IG51bWJlcikge1xuICAgICAgICB0aGlzLl9hdmVyYWdlRWxldmF0aW9uID0gYXZlcmFnZUVsZXZhdGlvbjtcbiAgICAgICAgdGhpcy5fY2FsY0ZvZ01hdHJpY2VzKCk7XG4gICAgICAgIHRoaXMuX2Rpc3RhbmNlVGlsZURhdGFDYWNoZSA9IHt9O1xuICAgIH1cblxuICAgIGdldCB6b29tKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl96b29tOyB9XG4gICAgc2V0IHpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHogPSBNYXRoLm1pbihNYXRoLm1heCh6b29tLCB0aGlzLm1pblpvb20pLCB0aGlzLm1heFpvb20pO1xuICAgICAgICBpZiAodGhpcy5fem9vbSA9PT0geikgcmV0dXJuO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3NldFpvb20oeik7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVNlYUxldmVsWm9vbSgpO1xuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuICAgIF9zZXRab29tKHo6IG51bWJlcikge1xuICAgICAgICB0aGlzLl96b29tID0gejtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHRoaXMuem9vbVNjYWxlKHopO1xuICAgICAgICB0aGlzLnRpbGVab29tID0gTWF0aC5mbG9vcih6KTtcbiAgICAgICAgdGhpcy56b29tRnJhY3Rpb24gPSB6IC0gdGhpcy50aWxlWm9vbTtcbiAgICB9XG5cbiAgICBfdXBkYXRlQ2FtZXJhT25UZXJyYWluKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2VsZXZhdGlvbiB8fCAhdGhpcy5fZWxldmF0aW9uLmlzRGF0YUF2YWlsYWJsZUF0UG9pbnQodGhpcy5sb2NhdGlvbkNvb3JkaW5hdGUodGhpcy5jZW50ZXIpKSkge1xuICAgICAgICAgICAgLy8gRWxldmF0aW9uIGRhdGEgbm90IGxvYWRlZCB5ZXQsIHJlc2V0XG4gICAgICAgICAgICB0aGlzLl9jZW50ZXJBbHRpdHVkZSA9IDA7XG4gICAgICAgICAgICB0aGlzLl9zZWFMZXZlbFpvb20gPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fY2VudGVyQWx0aXR1ZGVWYWxpZEZvckV4YWdnZXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbGV2YXRpb246IEVsZXZhdGlvbiA9IHRoaXMuX2VsZXZhdGlvbjtcbiAgICAgICAgdGhpcy5fY2VudGVyQWx0aXR1ZGUgPSBlbGV2YXRpb24uZ2V0QXRQb2ludE9yWmVybyh0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0aGlzLmNlbnRlcikpO1xuICAgICAgICB0aGlzLl9jZW50ZXJBbHRpdHVkZVZhbGlkRm9yRXhhZ2dlcmF0aW9uID0gZWxldmF0aW9uLmV4YWdnZXJhdGlvbigpO1xuICAgICAgICB0aGlzLl91cGRhdGVTZWFMZXZlbFpvb20oKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlU2VhTGV2ZWxab29tKCkge1xuICAgICAgICBpZiAodGhpcy5fY2VudGVyQWx0aXR1ZGVWYWxpZEZvckV4YWdnZXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlO1xuICAgICAgICBjb25zdCB0ZXJyYWluRWxldmF0aW9uID0gdGhpcy5waXhlbHNQZXJNZXRlciAqIHRoaXMuX2NlbnRlckFsdGl0dWRlO1xuICAgICAgICBjb25zdCBtZXJjYXRvclogPSAodGVycmFpbkVsZXZhdGlvbiArIGhlaWdodCkgLyB0aGlzLndvcmxkU2l6ZTtcblxuICAgICAgICAvLyBNU0wgKE1lYW4gU2VhIExldmVsKSB6b29tIGRlc2NyaWJlcyB0aGUgZGlzdGFuY2Ugb2YgdGhlIGNhbWVyYSB0byB0aGUgc2VhIGxldmVsIChhbHRpdHVkZSkuXG4gICAgICAgIC8vIEl0IGlzIHVzZWQgb25seSBmb3IgbWFuaXB1bGF0aW5nIHRoZSBjYW1lcmEgbG9jYXRpb24uIFRoZSBzdGFuZGFyZCB6b29tICh0aGlzLl96b29tKVxuICAgICAgICAvLyBkZWZpbmVzIHRoZSBjYW1lcmEgZGlzdGFuY2UgdG8gdGhlIHRlcnJhaW4gKGhlaWdodCkuIEl0cyBiZWhhdmlvciBhbmQgY29uY2VwdHVhbFxuICAgICAgICAvLyBtZWFuaW5nIGluIGRldGVybWluaW5nIHdoaWNoIHRpbGVzIHRvIHN0cmVhbSBpcyBzYW1lIHdpdGggb3Igd2l0aG91dCB0aGUgdGVycmFpbi5cbiAgICAgICAgdGhpcy5fc2VhTGV2ZWxab29tID0gdGhpcy5fem9vbUZyb21NZXJjYXRvcloobWVyY2F0b3JaKTtcbiAgICB9XG5cbiAgICBzYW1wbGVBdmVyYWdlRWxldmF0aW9uKCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5fZWxldmF0aW9uKSByZXR1cm4gMDtcbiAgICAgICAgY29uc3QgZWxldmF0aW9uOiBFbGV2YXRpb24gPSB0aGlzLl9lbGV2YXRpb247XG5cbiAgICAgICAgY29uc3QgZWxldmF0aW9uU2FtcGxlUG9pbnRzID0gW1xuICAgICAgICAgICAgWzAuNSwgMC4yXSxcbiAgICAgICAgICAgIFswLjMsIDAuNV0sXG4gICAgICAgICAgICBbMC41LCAwLjVdLFxuICAgICAgICAgICAgWzAuNywgMC41XSxcbiAgICAgICAgICAgIFswLjUsIDAuOF1cbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBob3Jpem9uID0gdGhpcy5ob3Jpem9uTGluZUZyb21Ub3AoKTtcblxuICAgICAgICBsZXQgZWxldmF0aW9uU3VtID0gMC4wO1xuICAgICAgICBsZXQgd2VpZ2h0U3VtID0gMC4wO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZXZhdGlvblNhbXBsZVBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcHQgPSBuZXcgUG9pbnQoXG4gICAgICAgICAgICAgICAgZWxldmF0aW9uU2FtcGxlUG9pbnRzW2ldWzBdICogdGhpcy53aWR0aCxcbiAgICAgICAgICAgICAgICBob3Jpem9uICsgZWxldmF0aW9uU2FtcGxlUG9pbnRzW2ldWzFdICogKHRoaXMuaGVpZ2h0IC0gaG9yaXpvbilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBoaXQgPSBlbGV2YXRpb24ucG9pbnRDb29yZGluYXRlKHB0KTtcbiAgICAgICAgICAgIGlmICghaGl0KSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2VUb0hpdCA9IE1hdGguaHlwb3QoaGl0WzBdIC0gdGhpcy5fY2FtZXJhLnBvc2l0aW9uWzBdLCBoaXRbMV0gLSB0aGlzLl9jYW1lcmEucG9zaXRpb25bMV0pO1xuICAgICAgICAgICAgY29uc3Qgd2VpZ2h0ID0gMSAvIGRpc3RhbmNlVG9IaXQ7XG4gICAgICAgICAgICBlbGV2YXRpb25TdW0gKz0gaGl0WzNdICogd2VpZ2h0O1xuICAgICAgICAgICAgd2VpZ2h0U3VtICs9IHdlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3ZWlnaHRTdW0gPT09IDApIHJldHVybiBOYU47XG4gICAgICAgIHJldHVybiBlbGV2YXRpb25TdW0gLyB3ZWlnaHRTdW07XG4gICAgfVxuXG4gICAgZ2V0IGNlbnRlcigpOiBMbmdMYXQgeyByZXR1cm4gdGhpcy5fY2VudGVyOyB9XG4gICAgc2V0IGNlbnRlcihjZW50ZXI6IExuZ0xhdCkge1xuICAgICAgICBpZiAoY2VudGVyLmxhdCA9PT0gdGhpcy5fY2VudGVyLmxhdCAmJiBjZW50ZXIubG5nID09PSB0aGlzLl9jZW50ZXIubG5nKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jZW50ZXIgPSBjZW50ZXI7XG4gICAgICAgIGlmICh0aGlzLl90ZXJyYWluRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYW1lcmFFbGV2YXRpb25SZWZlcmVuY2UgPT09IFwiZ3JvdW5kXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDYW1lcmFPblRlcnJhaW4oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlWm9vbUZyb21FbGV2YXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZVpvb21Gcm9tRWxldmF0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5fc2VhTGV2ZWxab29tID09IG51bGwgfHwgIXRoaXMuX2VsZXZhdGlvbilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBDb21wdXRlIHpvb20gbGV2ZWwgZnJvbSB0aGUgaGVpZ2h0IG9mIHRoZSBjYW1lcmEgcmVsYXRpdmUgdG8gdGhlIHRlcnJhaW5cbiAgICAgICAgY29uc3Qgc2VhTGV2ZWxab29tOiBudW1iZXIgPSB0aGlzLl9zZWFMZXZlbFpvb207XG4gICAgICAgIGNvbnN0IGVsZXZhdGlvbkF0Q2VudGVyID0gdGhpcy5fZWxldmF0aW9uLmdldEF0UG9pbnRPclplcm8odGhpcy5sb2NhdGlvbkNvb3JkaW5hdGUodGhpcy5jZW50ZXIpKTtcbiAgICAgICAgY29uc3QgbWVyY2F0b3JFbGV2YXRpb24gPSB0aGlzLnBpeGVsc1Blck1ldGVyIC8gdGhpcy53b3JsZFNpemUgKiBlbGV2YXRpb25BdENlbnRlcjtcbiAgICAgICAgY29uc3QgYWx0aXR1ZGUgID0gdGhpcy5fbWVyY2F0b3JaZnJvbVpvb20oc2VhTGV2ZWxab29tKTtcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gdGhpcy5fbWVyY2F0b3JaZnJvbVpvb20odGhpcy5fbWF4Wm9vbSk7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KGFsdGl0dWRlIC0gbWVyY2F0b3JFbGV2YXRpb24sIG1pbkhlaWdodCk7XG5cbiAgICAgICAgdGhpcy5fc2V0Wm9vbSh0aGlzLl96b29tRnJvbU1lcmNhdG9yWihoZWlnaHQpKTtcbiAgICB9XG5cbiAgICBnZXQgcGFkZGluZygpOiBQYWRkaW5nT3B0aW9ucyB7IHJldHVybiB0aGlzLl9lZGdlSW5zZXRzLnRvSlNPTigpOyB9XG4gICAgc2V0IHBhZGRpbmcocGFkZGluZzogUGFkZGluZ09wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VkZ2VJbnNldHMuZXF1YWxzKHBhZGRpbmcpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgLy9VcGRhdGUgZWRnZS1pbnNldHMgaW5wbGFjZVxuICAgICAgICB0aGlzLl9lZGdlSW5zZXRzLmludGVycG9sYXRlKHRoaXMuX2VkZ2VJbnNldHMsIHBhZGRpbmcsIDEpO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBhIHpvb20gdmFsdWUgcmVsYXRpdmUgdG8gYSBtYXAgcGxhbmUgdGhhdCBnb2VzIHRocm91Z2ggdGhlIHByb3ZpZGVkIG1lcmNhdG9yIHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtNZXJjYXRvckNvb3JkaW5hdGV9IHBvc2l0aW9uIEEgcG9zaXRpb24gZGVmaW5pbmcgdGhlIGFsdGl0dWRlIG9mIHRoZSB0aGUgbWFwIHBsYW5lLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB6b29tIHZhbHVlLlxuICAgICAqL1xuICAgIGNvbXB1dGVab29tUmVsYXRpdmVUbyhwb3NpdGlvbjogTWVyY2F0b3JDb29yZGluYXRlKTogbnVtYmVyIHtcbiAgICAgICAgLy8gRmluZCBtYXAgY2VudGVyIHBvc2l0aW9uIG9uIHRoZSB0YXJnZXQgcGxhbmUgYnkgY2FzdGluZyBhIHJheSBmcm9tIHNjcmVlbiBjZW50ZXIgdG93YXJkcyB0aGUgcGxhbmUuXG4gICAgICAgIC8vIERpcmVjdCBkaXN0YW5jZSB0byB0aGUgdGFyZ2V0IHBvc2l0aW9uIGlzIHVzZWQgaWYgdGhlIHRhcmdldCBwb3NpdGlvbiBpcyBhYm92ZSBjYW1lcmEgcG9zaXRpb24uXG4gICAgICAgIGNvbnN0IGNlbnRlck9uVGFyZ2V0QWx0aXR1ZGUgPSB0aGlzLnJheUludGVyc2VjdGlvbkNvb3JkaW5hdGUodGhpcy5wb2ludFJheUludGVyc2VjdGlvbih0aGlzLmNlbnRlclBvaW50LCBwb3NpdGlvbi50b0FsdGl0dWRlKCkpKTtcblxuICAgICAgICBsZXQgdGFyZ2V0UG9zaXRpb246ID9WZWMzO1xuICAgICAgICBpZiAocG9zaXRpb24ueiA8IHRoaXMuX2NhbWVyYS5wb3NpdGlvblsyXSkge1xuICAgICAgICAgICAgdGFyZ2V0UG9zaXRpb24gPSBbY2VudGVyT25UYXJnZXRBbHRpdHVkZS54LCBjZW50ZXJPblRhcmdldEFsdGl0dWRlLnksIGNlbnRlck9uVGFyZ2V0QWx0aXR1ZGUuel07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRQb3NpdGlvbiA9IFtwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpc3RUb1RhcmdldCA9IHZlYzMubGVuZ3RoKHZlYzMuc3ViKFtdLCB0aGlzLl9jYW1lcmEucG9zaXRpb24sIHRhcmdldFBvc2l0aW9uKSk7XG4gICAgICAgIHJldHVybiBjbGFtcCh0aGlzLl96b29tRnJvbU1lcmNhdG9yWihkaXN0VG9UYXJnZXQpLCB0aGlzLl9taW5ab29tLCB0aGlzLl9tYXhab29tKTtcbiAgICB9XG5cbiAgICBzZXRGcmVlQ2FtZXJhT3B0aW9ucyhvcHRpb25zOiBGcmVlQ2FtZXJhT3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuaGVpZ2h0KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5wb3NpdGlvbiAmJiAhb3B0aW9ucy5vcmllbnRhdGlvbilcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBDYW1lcmEgc3RhdGUgbXVzdCBiZSB1cC10by1kYXRlIGJlZm9yZSBhY2Nlc3NpbmcgaXRzIGdldHRlcnNcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FtZXJhU3RhdGUoKTtcblxuICAgICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAob3B0aW9ucy5vcmllbnRhdGlvbiAmJiAhcXVhdC5leGFjdEVxdWFscyhvcHRpb25zLm9yaWVudGF0aW9uLCB0aGlzLl9jYW1lcmEub3JpZW50YXRpb24pKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdGhpcy5fc2V0Q2FtZXJhT3JpZW50YXRpb24ob3B0aW9ucy5vcmllbnRhdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5wb3NpdGlvbikge1xuICAgICAgICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBbb3B0aW9ucy5wb3NpdGlvbi54LCBvcHRpb25zLnBvc2l0aW9uLnksIG9wdGlvbnMucG9zaXRpb24uel07XG4gICAgICAgICAgICBpZiAoIXZlYzMuZXhhY3RFcXVhbHMobmV3UG9zaXRpb24sIHRoaXMuX2NhbWVyYS5wb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRDYW1lcmFQb3NpdGlvbihuZXdQb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGVGcm9tQ2FtZXJhKCk7XG4gICAgICAgICAgICB0aGlzLnJlY2VudGVyT25UZXJyYWluKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRGcmVlQ2FtZXJhT3B0aW9ucygpOiBGcmVlQ2FtZXJhT3B0aW9ucyB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNhbWVyYVN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuX2NhbWVyYS5wb3NpdGlvbjtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IG5ldyBGcmVlQ2FtZXJhT3B0aW9ucygpO1xuICAgICAgICBvcHRpb25zLnBvc2l0aW9uID0gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShwb3NbMF0sIHBvc1sxXSwgcG9zWzJdKTtcbiAgICAgICAgb3B0aW9ucy5vcmllbnRhdGlvbiA9IHRoaXMuX2NhbWVyYS5vcmllbnRhdGlvbjtcbiAgICAgICAgb3B0aW9ucy5fZWxldmF0aW9uID0gdGhpcy5lbGV2YXRpb247XG4gICAgICAgIG9wdGlvbnMuX3JlbmRlcldvcmxkQ29waWVzID0gdGhpcy5yZW5kZXJXb3JsZENvcGllcztcblxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBfc2V0Q2FtZXJhT3JpZW50YXRpb24ob3JpZW50YXRpb246IFF1YXQpOiBib29sZWFuIHtcbiAgICAgICAgLy8gemVyby1sZW5ndGggcXVhdGVybmlvbnMgYXJlIG5vdCB2YWxpZFxuICAgICAgICBpZiAoIXF1YXQubGVuZ3RoKG9yaWVudGF0aW9uKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBxdWF0Lm5vcm1hbGl6ZShvcmllbnRhdGlvbiwgb3JpZW50YXRpb24pO1xuXG4gICAgICAgIC8vIFRoZSBuZXcgb3JpZW50YXRpb24gbXVzdCBiZSBzYW5pdGl6ZWQgYnkgbWFraW5nIHN1cmUgaXQgY2FuIGJlIHJlcHJlc2VudGVkXG4gICAgICAgIC8vIHdpdGggYSBwaXRjaCBhbmQgYmVhcmluZy4gUm9sbC1jb21wb25lbnQgbXVzdCBiZSByZW1vdmVkIGFuZCB0aGUgY2FtZXJhIGNhbid0IGJlIHVwc2lkZSBkb3duXG4gICAgICAgIGNvbnN0IGZvcndhcmQgPSB2ZWMzLnRyYW5zZm9ybVF1YXQoW10sIFswLCAwLCAtMV0sIG9yaWVudGF0aW9uKTtcbiAgICAgICAgY29uc3QgdXAgPSB2ZWMzLnRyYW5zZm9ybVF1YXQoW10sIFswLCAtMSwgMF0sIG9yaWVudGF0aW9uKTtcblxuICAgICAgICBpZiAodXBbMl0gPCAwLjApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlZE9yaWVudGF0aW9uID0gb3JpZW50YXRpb25Gcm9tRnJhbWUoZm9yd2FyZCwgdXApO1xuICAgICAgICBpZiAoIXVwZGF0ZWRPcmllbnRhdGlvbilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICB0aGlzLl9jYW1lcmEub3JpZW50YXRpb24gPSB1cGRhdGVkT3JpZW50YXRpb247XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIF9zZXRDYW1lcmFQb3NpdGlvbihwb3NpdGlvbjogVmVjMykge1xuICAgICAgICAvLyBBbHRpdHVkZSBtdXN0IGJlIGNsYW1wZWQgdG8gcmVzcGVjdCBtaW4gYW5kIG1heCB6b29tXG4gICAgICAgIGNvbnN0IG1pbldvcmxkU2l6ZSA9IHRoaXMuem9vbVNjYWxlKHRoaXMubWluWm9vbSkgKiB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjb25zdCBtYXhXb3JsZFNpemUgPSB0aGlzLnpvb21TY2FsZSh0aGlzLm1heFpvb20pICogdGhpcy50aWxlU2l6ZTtcbiAgICAgICAgY29uc3QgZGlzdFRvQ2VudGVyID0gdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlO1xuXG4gICAgICAgIHBvc2l0aW9uWzJdID0gY2xhbXAocG9zaXRpb25bMl0sIGRpc3RUb0NlbnRlciAvIG1heFdvcmxkU2l6ZSwgZGlzdFRvQ2VudGVyIC8gbWluV29ybGRTaXplKTtcbiAgICAgICAgdGhpcy5fY2FtZXJhLnBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGNlbnRlciBvZiB0aGUgc2NyZWVuIGluIHBpeGVscyB3aXRoIHRoZSB0b3AtbGVmdCBjb3JuZXIgYmVpbmcgKDAsMClcbiAgICAgKiBhbmQgK3kgYXhpcyBwb2ludGluZyBkb3dud2FyZHMuIFRoaXMgYWNjb3VudHMgZm9yIHBhZGRpbmcuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAdHlwZSB7UG9pbnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZm9ybVxuICAgICAqL1xuICAgIGdldCBjZW50ZXJQb2ludCgpOiBQb2ludCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGdlSW5zZXRzLmdldENlbnRlcih0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmVydGljYWwgaGFsZi1mb3YsIGFjY291bnRpbmcgZm9yIHBhZGRpbmcsIGluIHJhZGlhbnMuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0IGZvdkFib3ZlQ2VudGVyKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3YgKiAoMC41ICsgdGhpcy5jZW50ZXJPZmZzZXQueSAvIHRoaXMuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhZGRpbmcgb3B0aW9ucyBhcmUgZXF1YWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BhZGRpbmdPcHRpb25zfSBwYWRkaW5nIFRoZSBwYWRkaW5nIG9wdGlvbnMgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGFkZGluZyBvcHRpb25zIGFyZSBlcXVhbC5cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmb3JtXG4gICAgICovXG4gICAgaXNQYWRkaW5nRXF1YWwocGFkZGluZzogUGFkZGluZ09wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VkZ2VJbnNldHMuZXF1YWxzKHBhZGRpbmcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciBtZXRob2QgdG8gdXBkYXRlIGVkZ2UtaW5zZXRzIGlucGxhY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BhZGRpbmdPcHRpb25zfSBzdGFydCBUaGUgaW5pdGlhbCBwYWRkaW5nIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtQYWRkaW5nT3B0aW9uc30gdGFyZ2V0IFRoZSB0YXJnZXQgcGFkZGluZyBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0IFRoZSBpbnRlcnBvbGF0aW9uIHZhcmlhYmxlLlxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zvcm1cbiAgICAgKi9cbiAgICBpbnRlcnBvbGF0ZVBhZGRpbmcoc3RhcnQ6IFBhZGRpbmdPcHRpb25zLCB0YXJnZXQ6IFBhZGRpbmdPcHRpb25zLCB0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9lZGdlSW5zZXRzLmludGVycG9sYXRlKHN0YXJ0LCB0YXJnZXQsIHQpO1xuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBoaWdoZXN0IHpvb20gbGV2ZWwgdGhhdCBmdWxseSBpbmNsdWRlcyBhbGwgdGlsZXMgd2l0aGluIHRoZSB0cmFuc2Zvcm0ncyBib3VuZGFyaWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudGlsZVNpemUgVGlsZSBzaXplLCBleHByZXNzZWQgaW4gc2NyZWVuIHBpeGVscy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucm91bmRab29tIFRhcmdldCB6b29tIGxldmVsLiBJZiB0cnVlLCB0aGUgdmFsdWUgd2lsbCBiZSByb3VuZGVkIHRvIHRoZSBjbG9zZXN0IGludGVnZXIuIE90aGVyd2lzZSB0aGUgdmFsdWUgd2lsbCBiZSBmbG9vcmVkLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEFuIGludGVnZXIgem9vbSBsZXZlbCBhdCB3aGljaCBhbGwgdGlsZXMgd2lsbCBiZSB2aXNpYmxlLlxuICAgICAqL1xuICAgIGNvdmVyaW5nWm9vbUxldmVsKG9wdGlvbnM6IHtyb3VuZFpvb20/OiBib29sZWFuLCB0aWxlU2l6ZTogbnVtYmVyfSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHogPSAob3B0aW9ucy5yb3VuZFpvb20gPyBNYXRoLnJvdW5kIDogTWF0aC5mbG9vcikoXG4gICAgICAgICAgICB0aGlzLnpvb20gKyB0aGlzLnNjYWxlWm9vbSh0aGlzLnRpbGVTaXplIC8gb3B0aW9ucy50aWxlU2l6ZSlcbiAgICAgICAgKTtcbiAgICAgICAgLy8gQXQgbmVnYXRpdmUgem9vbSBsZXZlbHMgbG9hZCB0aWxlcyBmcm9tIHowIGJlY2F1c2UgbmVnYXRpdmUgdGlsZSB6b29tIGxldmVscyBkb24ndCBleGlzdC5cbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHopO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbnkgXCJ3cmFwcGVkXCIgY29waWVzIG9mIGEgZ2l2ZW4gdGlsZSBjb29yZGluYXRlIHRoYXQgYXJlIHZpc2libGVcbiAgICAgKiBpbiB0aGUgY3VycmVudCB2aWV3LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRWaXNpYmxlVW53cmFwcGVkQ29vcmRpbmF0ZXModGlsZUlEOiBDYW5vbmljYWxUaWxlSUQpOiBBcnJheTxVbndyYXBwZWRUaWxlSUQ+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW25ldyBVbndyYXBwZWRUaWxlSUQoMCwgdGlsZUlEKV07XG4gICAgICAgIGlmICh0aGlzLnJlbmRlcldvcmxkQ29waWVzKSB7XG4gICAgICAgICAgICBjb25zdCB1dGwgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQoMCwgMCkpO1xuICAgICAgICAgICAgY29uc3QgdXRyID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KHRoaXMud2lkdGgsIDApKTtcbiAgICAgICAgICAgIGNvbnN0IHVibCA9IHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCkpO1xuICAgICAgICAgICAgY29uc3QgdWJyID0gdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsIHRoaXMuaGVpZ2h0KSk7XG4gICAgICAgICAgICBjb25zdCB3MCA9IE1hdGguZmxvb3IoTWF0aC5taW4odXRsLngsIHV0ci54LCB1YmwueCwgdWJyLngpKTtcbiAgICAgICAgICAgIGNvbnN0IHcxID0gTWF0aC5mbG9vcihNYXRoLm1heCh1dGwueCwgdXRyLngsIHVibC54LCB1YnIueCkpO1xuXG4gICAgICAgICAgICAvLyBBZGQgYW4gZXh0cmEgY29weSBvZiB0aGUgd29ybGQgb24gZWFjaCBzaWRlIHRvIHByb3Blcmx5IHJlbmRlciBJbWFnZVNvdXJjZXMgYW5kIENhbnZhc1NvdXJjZXMuXG4gICAgICAgICAgICAvLyBCb3RoIHNvdXJjZXMgZHJhdyBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kYXJpZXMgb2YgdGhlIHRpbGUgdGhhdCBcImNvbnRhaW5zIHRoZW1cIiBzbyB3ZSBuZWVkXG4gICAgICAgICAgICAvLyB0byBhZGQgZXh0cmEgY29waWVzIG9uIGJvdGggc2lkZXMgaW4gY2FzZSBvZmZzY3JlZW4gdGlsZXMgbmVlZCB0byBkcmF3IGludG8gb24tc2NyZWVuIG9uZXMuXG4gICAgICAgICAgICBjb25zdCBleHRyYVdvcmxkQ29weSA9IDE7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHcgPSB3MCAtIGV4dHJhV29ybGRDb3B5OyB3IDw9IHcxICsgZXh0cmFXb3JsZENvcHk7IHcrKykge1xuICAgICAgICAgICAgICAgIGlmICh3ID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgVW53cmFwcGVkVGlsZUlEKHcsIHRpbGVJRCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFsbCBjb29yZGluYXRlcyB0aGF0IGNvdWxkIGNvdmVyIHRoaXMgdHJhbnNmb3JtIGZvciBhIGNvdmVyaW5nXG4gICAgICogem9vbSBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnRpbGVTaXplXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMubWluem9vbVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLm1heHpvb21cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucm91bmRab29tXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnJlcGFyc2VPdmVyc2NhbGVkXG4gICAgICogQHJldHVybnMge0FycmF5PE92ZXJzY2FsZWRUaWxlSUQ+fSBPdmVyc2NhbGVkVGlsZUlEc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY292ZXJpbmdUaWxlcyhcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdGlsZVNpemU6IG51bWJlcixcbiAgICAgICAgICAgIG1pbnpvb20/OiBudW1iZXIsXG4gICAgICAgICAgICBtYXh6b29tPzogbnVtYmVyLFxuICAgICAgICAgICAgcm91bmRab29tPzogYm9vbGVhbixcbiAgICAgICAgICAgIHJlcGFyc2VPdmVyc2NhbGVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIHJlbmRlcldvcmxkQ29waWVzPzogYm9vbGVhbixcbiAgICAgICAgICAgIGlzVGVycmFpbkRFTT86IGJvb2xlYW5cbiAgICAgICAgfVxuICAgICk6IEFycmF5PE92ZXJzY2FsZWRUaWxlSUQ+IHtcbiAgICAgICAgbGV0IHogPSB0aGlzLmNvdmVyaW5nWm9vbUxldmVsKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBhY3R1YWxaID0gejtcblxuICAgICAgICBjb25zdCB1c2VFbGV2YXRpb25EYXRhID0gdGhpcy5lbGV2YXRpb24gJiYgIW9wdGlvbnMuaXNUZXJyYWluREVNO1xuICAgICAgICBjb25zdCBpc01lcmNhdG9yID0gdGhpcy5wcm9qZWN0aW9uLm5hbWUgPT09ICdtZXJjYXRvcic7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWluem9vbSAhPT0gdW5kZWZpbmVkICYmIHogPCBvcHRpb25zLm1pbnpvb20pIHJldHVybiBbXTtcbiAgICAgICAgaWYgKG9wdGlvbnMubWF4em9vbSAhPT0gdW5kZWZpbmVkICYmIHogPiBvcHRpb25zLm1heHpvb20pIHogPSBvcHRpb25zLm1heHpvb207XG5cbiAgICAgICAgY29uc3QgY2VudGVyQ29vcmQgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZSh0aGlzLmNlbnRlcik7XG4gICAgICAgIGNvbnN0IGNlbnRlckxhdGl0dWRlID0gdGhpcy5jZW50ZXIubGF0O1xuICAgICAgICBjb25zdCBudW1UaWxlcyA9IDEgPDwgejtcbiAgICAgICAgY29uc3QgY2VudGVyUG9pbnQgPSBbbnVtVGlsZXMgKiBjZW50ZXJDb29yZC54LCBudW1UaWxlcyAqIGNlbnRlckNvb3JkLnksIDBdO1xuICAgICAgICBjb25zdCBpc0dsb2JlID0gdGhpcy5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZSc7XG4gICAgICAgIGNvbnN0IHpJbk1ldGVycyA9ICFpc0dsb2JlO1xuICAgICAgICBjb25zdCBjYW1lcmFGcnVzdHVtID0gRnJ1c3R1bS5mcm9tSW52UHJvamVjdGlvbk1hdHJpeCh0aGlzLmludlByb2pNYXRyaXgsIHRoaXMud29ybGRTaXplLCB6LCB6SW5NZXRlcnMpO1xuICAgICAgICBjb25zdCBjYW1lcmFDb29yZCA9IGlzR2xvYmUgPyB0aGlzLl9jYW1lcmEubWVyY2F0b3JQb3NpdGlvbiA6IHRoaXMucG9pbnRDb29yZGluYXRlKHRoaXMuZ2V0Q2FtZXJhUG9pbnQoKSk7XG4gICAgICAgIGNvbnN0IG1ldGVyVG9UaWxlID0gbnVtVGlsZXMgKiBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgdGhpcy5jZW50ZXIubGF0KTtcbiAgICAgICAgY29uc3QgY2FtZXJhQWx0aXR1ZGUgPSB0aGlzLl9jYW1lcmEucG9zaXRpb25bMl0gLyBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgdGhpcy5jZW50ZXIubGF0KTtcbiAgICAgICAgY29uc3QgY2FtZXJhUG9pbnQgPSBbbnVtVGlsZXMgKiBjYW1lcmFDb29yZC54LCBudW1UaWxlcyAqIGNhbWVyYUNvb3JkLnksIGNhbWVyYUFsdGl0dWRlICogKHpJbk1ldGVycyA/IDEgOiBtZXRlclRvVGlsZSldO1xuICAgICAgICAvLyBMZXQncyBjb25zaWRlciBhbiBleGFtcGxlIGZvciAhcm91bmRab29tOiBlLmcuIHRpbGVab29tIDE2IGlzIHVzZWQgZnJvbSB6b29tIDE2IGFsbCB0aGUgd2F5IHRvIHpvb20gMTYuOTkuXG4gICAgICAgIC8vIFRoaXMgd291bGQgbWVhbiB0aGF0IHRoZSBtaW5pbWFsIGRpc3RhbmNlIHRvIHNwbGl0IHdvdWxkIGJlIGJhc2VkIG9uIGRpc3RhbmNlIGZyb20gY2FtZXJhIHRvIGNlbnRlciBvZiAxNi45OSB6b29tLlxuICAgICAgICAvLyBUaGUgc2FtZSBpcyBhbHJlYWR5IGluY29ycG9yYXRlZCBpbiBsb2dpYyBiZWhpbmQgcm91bmRab29tIGZvciByYXN0ZXIgKHNvIHRoZXJlIGlzIG5vIGFkanVzdG1lbnQgbmVlZGVkIGluIGZvbGxvd2luZyBsaW5lKS5cbiAgICAgICAgLy8gMC4wMiBhZGRlZCB0byBjb21wZW5zYXRlIGZvciBwcmVjaXNpb24gZXJyb3JzLCBzZWUgXCJjb3ZlcmluZ1RpbGVzIGZvciB0ZXJyYWluXCIgdGVzdCBpbiB0cmFuc2Zvcm0udGVzdC5qcy5cbiAgICAgICAgY29uc3Qgem9vbVNwbGl0RGlzdGFuY2UgPSB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyBvcHRpb25zLnRpbGVTaXplICogKG9wdGlvbnMucm91bmRab29tID8gMSA6IDAuNTAyKTtcblxuICAgICAgICAvLyBObyBjaGFuZ2Ugb2YgTE9EIGJlaGF2aW9yIGZvciBwaXRjaCBsb3dlciB0aGFuIDYwIGFuZCB3aGVuIHRoZXJlIGlzIG5vIHRvcCBwYWRkaW5nOiByZXR1cm4gb25seSB0aWxlIGlkcyBmcm9tIHRoZSByZXF1ZXN0ZWQgem9vbSBsZXZlbFxuICAgICAgICBjb25zdCBtaW5ab29tID0gdGhpcy5waXRjaCA8PSA2MC4wICYmIHRoaXMuX2VkZ2VJbnNldHMudG9wIDw9IHRoaXMuX2VkZ2VJbnNldHMuYm90dG9tICYmICF0aGlzLl9lbGV2YXRpb24gJiYgIXRoaXMucHJvamVjdGlvbi5pc1JlcHJvamVjdGVkSW5UaWxlU3BhY2UgPyB6IDogMDtcblxuICAgICAgICAvLyBXaGVuIGNhbGN1bGF0aW5nIHRpbGUgY292ZXIgZm9yIHRlcnJhaW4sIGNyZWF0ZSBkZWVwIEFBQkIgZm9yIG5vZGVzLCB0byBlbnN1cmUgdGhleSBpbnRlcnNlY3QgZnJ1c3R1bTogZm9yIHNvdXJjZXMsXG4gICAgICAgIC8vIG90aGVyIHRoYW4gREVNLCB1c2UgbWluaW11bSBvZiB2aXNpYmxlIERFTSB0aWxlcyBhbmQgY2VudGVyIGFsdGl0dWRlIGFzIHVwcGVyIGJvdW5kIChwaXRjaCBpcyBhbHdheXMgbGVzcyB0aGFuIDkwwrApLlxuICAgICAgICBjb25zdCBtYXhSYW5nZSA9IG9wdGlvbnMuaXNUZXJyYWluREVNICYmIHRoaXMuX2VsZXZhdGlvbiA/IHRoaXMuX2VsZXZhdGlvbi5leGFnZ2VyYXRpb24oKSAqIDEwMDAwIDogdGhpcy5fY2VudGVyQWx0aXR1ZGU7XG4gICAgICAgIGNvbnN0IG1pblJhbmdlID0gb3B0aW9ucy5pc1RlcnJhaW5ERU0gPyAtbWF4UmFuZ2UgOiB0aGlzLl9lbGV2YXRpb24gPyB0aGlzLl9lbGV2YXRpb24uZ2V0TWluRWxldmF0aW9uQmVsb3dNU0woKSA6IDA7XG5cbiAgICAgICAgY29uc3Qgc2NhbGVBZGp1c3RtZW50ID0gdGhpcy5wcm9qZWN0aW9uLmlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZSA/IGdldFNjYWxlQWRqdXN0bWVudCh0aGlzKSA6IDEuMDtcblxuICAgICAgICBjb25zdCByZWxhdGl2ZVNjYWxlQXRNZXJjYXRvckNvb3JkID0gbWMgPT4ge1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGhvdyBzY2FsZSBjb21wYXJlcyBiZXR3ZWVuIHByb2plY3RlZCBjb29yZGluYXRlcyBhbmQgbWVyY2F0b3IgY29vcmRpbmF0ZXMuXG4gICAgICAgICAgICAvLyBSZXR1cm5zIGEgbGVuZ3RoLiBUaGUgdW5pdHMgZG9uJ3QgbWF0dGVyIHNpbmNlIHRoZSByZXN1bHQgaXMgb25seVxuICAgICAgICAgICAgLy8gdXNlZCBpbiBhIHJhdGlvIHdpdGggb3RoZXIgdmFsdWVzIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24uXG5cbiAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhIHNtYWxsIHNxdWFyZSBpbiBNZXJjYXRvciBjb29yZGluYXRlcy5cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IDEgLyA0MDAwMDtcbiAgICAgICAgICAgIGNvbnN0IG1jRWFzdCA9IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUobWMueCArIG9mZnNldCwgbWMueSwgbWMueik7XG4gICAgICAgICAgICBjb25zdCBtY1NvdXRoID0gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShtYy54LCBtYy55ICsgb2Zmc2V0LCBtYy56KTtcblxuICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgc3F1YXJlIHRvIHByb2plY3RlZCBjb29yZGluYXRlcy5cbiAgICAgICAgICAgIGNvbnN0IGxsID0gbWMudG9MbmdMYXQoKTtcbiAgICAgICAgICAgIGNvbnN0IGxsRWFzdCA9IG1jRWFzdC50b0xuZ0xhdCgpO1xuICAgICAgICAgICAgY29uc3QgbGxTb3V0aCA9IG1jU291dGgudG9MbmdMYXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsbCk7XG4gICAgICAgICAgICBjb25zdCBwRWFzdCA9IHRoaXMubG9jYXRpb25Db29yZGluYXRlKGxsRWFzdCk7XG4gICAgICAgICAgICBjb25zdCBwU291dGggPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsbFNvdXRoKTtcblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBzaXplIG9mIGVhY2ggZWRnZSBvZiB0aGUgcmVwcm9qZWN0ZWQgc3F1YXJlXG4gICAgICAgICAgICBjb25zdCBkeCA9IE1hdGguaHlwb3QocEVhc3QueCAtIHAueCwgcEVhc3QueSAtIHAueSk7XG4gICAgICAgICAgICBjb25zdCBkeSA9IE1hdGguaHlwb3QocFNvdXRoLnggLSBwLngsIHBTb3V0aC55IC0gcC55KTtcblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBzaXplIG9mIGEgcHJvamVjdGVkIHNxdWFyZSB0aGF0IHdvdWxkIGhhdmUgdGhlXG4gICAgICAgICAgICAvLyBzYW1lIGFyZWEgYXMgdGhlIHJlcHJvamVjdGVkIHNxdWFyZS5cbiAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoZHggKiBkeSkgKiBzY2FsZUFkanVzdG1lbnQgLyBvZmZzZXQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbmV3Um9vdFRpbGUgPSAod3JhcDogbnVtYmVyKTogYW55ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IG1heFJhbmdlO1xuICAgICAgICAgICAgY29uc3QgbWluID0gbWluUmFuZ2U7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC8vIFdpdGggZWxldmF0aW9uLCB0aGlzLl9lbGV2YXRpb24gcHJvdmlkZXMgeiBjb29yZGluYXRlIHZhbHVlcy4gRm9yIDJEOlxuICAgICAgICAgICAgICAgIC8vIEFsbCB0aWxlcyBhcmUgb24gemVybyBlbGV2YXRpb24gcGxhbmUgPT4geiBkaWZmZXJlbmNlIGlzIHplcm9cbiAgICAgICAgICAgICAgICBhYWJiOiB0aWxlQUFCQih0aGlzLCBudW1UaWxlcywgMCwgMCwgMCwgd3JhcCwgbWluLCBtYXgsIHRoaXMucHJvamVjdGlvbiksXG4gICAgICAgICAgICAgICAgem9vbTogMCxcbiAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgICAgbWluWjogbWluLFxuICAgICAgICAgICAgICAgIG1heFo6IG1heCxcbiAgICAgICAgICAgICAgICB3cmFwLFxuICAgICAgICAgICAgICAgIGZ1bGx5VmlzaWJsZTogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRG8gYSBkZXB0aC1maXJzdCB0cmF2ZXJzYWwgdG8gZmluZCB2aXNpYmxlIHRpbGVzIGFuZCBwcm9wZXIgbGV2ZWxzIG9mIGRldGFpbFxuICAgICAgICBjb25zdCBzdGFjayA9IFtdO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGNvbnN0IG1heFpvb20gPSB6O1xuICAgICAgICBjb25zdCBvdmVyc2NhbGVkWiA9IG9wdGlvbnMucmVwYXJzZU92ZXJzY2FsZWQgPyBhY3R1YWxaIDogejtcbiAgICAgICAgY29uc3Qgc3F1YXJlID0gYSA9PiBhICogYTtcbiAgICAgICAgY29uc3QgY2FtZXJhSGVpZ2h0U3FyID0gc3F1YXJlKChjYW1lcmFBbHRpdHVkZSAtIHRoaXMuX2NlbnRlckFsdGl0dWRlKSAqIG1ldGVyVG9UaWxlKTsgLy8gaW4gdGlsZSBjb29yZGluYXRlcy5cblxuICAgICAgICBjb25zdCBnZXRBQUJCRnJvbUVsZXZhdGlvbiA9IChpdCkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0KHRoaXMuX2VsZXZhdGlvbik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2VsZXZhdGlvbiB8fCAhaXQudGlsZUlEIHx8ICFpc01lcmNhdG9yKSByZXR1cm47IC8vIFRvIHNpbGVuY2UgZmxvdy5cbiAgICAgICAgICAgIGNvbnN0IG1pbm1heCA9IHRoaXMuX2VsZXZhdGlvbi5nZXRNaW5NYXhGb3JUaWxlKGl0LnRpbGVJRCk7XG4gICAgICAgICAgICBjb25zdCBhYWJiID0gaXQuYWFiYjtcbiAgICAgICAgICAgIGlmIChtaW5tYXgpIHtcbiAgICAgICAgICAgICAgICBhYWJiLm1pblsyXSA9IG1pbm1heC5taW47XG4gICAgICAgICAgICAgICAgYWFiYi5tYXhbMl0gPSBtaW5tYXgubWF4O1xuICAgICAgICAgICAgICAgIGFhYmIuY2VudGVyWzJdID0gKGFhYmIubWluWzJdICsgYWFiYi5tYXhbMl0pIC8gMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXQuc2hvdWxkU3BsaXQgPSBzaG91bGRTcGxpdChpdCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpdC5zaG91bGRTcGxpdCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdCBmaW5hbCB6b29tIGxldmVsLCB3aGlsZSBjb3JyZXNwb25kaW5nIERFTSB0aWxlIGlzIG5vdCBsb2FkZWQgeWV0LFxuICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWUgY2VudGVyIGVsZXZhdGlvbi4gVGhpcyBjb3ZlcnMgZ3JvdW5kIHRvIGhvcml6b24gYW5kIHByZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIC8vIGxvYWRpbmcgdW5uZWNlc3NhcnkgdGlsZXMgdW50aWwgREVNIGNvdmVyIGlzIGZ1bGx5IGxvYWRlZC5cbiAgICAgICAgICAgICAgICAgICAgYWFiYi5taW5bMl0gPSBhYWJiLm1heFsyXSA9IGFhYmIuY2VudGVyWzJdID0gdGhpcy5fY2VudGVyQWx0aXR1ZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNjYWxlIGRpc3RhbmNlIHRvIHNwbGl0IGZvciBhY3V0ZSBhbmdsZXMuXG4gICAgICAgIC8vIGR6U3FyOiB6IGNvbXBvbmVudCBvZiBjYW1lcmEgdG8gdGlsZSBkaXN0YW5jZSwgc3F1YXJlLlxuICAgICAgICAvLyBkU3FyOiAzRCBkaXN0YW5jZSBvZiBjYW1lcmEgdG8gdGlsZSwgc3F1YXJlLlxuICAgICAgICBjb25zdCBkaXN0VG9TcGxpdFNjYWxlID0gKGR6U3FyLCBkU3FyKSA9PiB7XG4gICAgICAgICAgICAvLyBXaGVuIHRoZSBhbmdsZSBiZXR3ZWVuIGNhbWVyYSB0byB0aWxlIHJheSBhbmQgdGlsZSBwbGFuZSBpcyBzbWFsbGVyXG4gICAgICAgICAgICAvLyB0aGFuIGFjdXRlQW5nbGVUaHJlc2hvbGQsIHNjYWxlIHRoZSBkaXN0YW5jZSB0byBzcGxpdC4gU2NhbGluZyBpcyBhZGFwdGl2ZTogc21hbGxlclxuICAgICAgICAgICAgLy8gdGhlIGFuZ2xlLCB0aGUgc2NhbGUgZ2V0cyBsb3dlciB2YWx1ZS4gQWx0aG91Z2ggaXQgc2VlbXMgZWFybHkgdG8gc3RhcnQgYXQgNDUsXG4gICAgICAgICAgICAvLyBpdCBpcyBub3Q6IHNjYWxpbmcga2lja3MgaW4gYXJvdW5kIDYwIGRlZ3JlZXMgcGl0Y2guXG4gICAgICAgICAgICBjb25zdCBhY3V0ZUFuZ2xlVGhyZXNob2xkU2luID0gMC43MDc7IC8vIE1hdGguc2luKDQ1KVxuICAgICAgICAgICAgY29uc3Qgc3RyZXRjaFRpbGUgPSAxLjE7XG4gICAgICAgICAgICAvLyBEaXN0YW5jZXMgbG9uZ2VyIHRoYW4gJ2R6IC8gYWN1dGVBbmdsZVRocmVzaG9sZFNpbicgZ2V0cyBzY2FsZWRcbiAgICAgICAgICAgIC8vIGZvbGxvd2luZyBnZW9tZXRyaWMgc2VyaWVzIHN1bTogZXZlcnkgbmV4dCBkeiBsZW5ndGggaW4gZGlzdGFuY2UgY2FuIGJlXG4gICAgICAgICAgICAvLyAnc3RyZXRjaFRpbGUgdGltZXMnIGxvbmdlci4gSXQgaXMgZnVydGhlciwgdGhlIGFuZ2xlIGlzIHNoYXJwZXIuIFRvdGFsLFxuICAgICAgICAgICAgLy8gYWRqdXN0ZWQsIGRpc3RhbmNlIHdvdWxkIHRoZW4gYmU6XG4gICAgICAgICAgICAvLyA9IGR6IC8gYWN1dGVBbmdsZVRocmVzaG9sZFNpbiArIChkeiAqIHN0cmV0Y2hUaWxlICsgZHogKiBzdHJldGNoVGlsZSBeIDIgKyAuLi4gKyBkeiAqIHN0cmV0Y2hUaWxlIF4gayksXG4gICAgICAgICAgICAvLyB3aGVyZSBrID0gKGQgLSBkeiAvIGFjdXRlQW5nbGVUaHJlc2hvbGRTaW4pIC8gZHogPSBkIC8gZHogLSAxIC8gYWN1dGVBbmdsZVRocmVzaG9sZFNpbjtcbiAgICAgICAgICAgIC8vID0gZHogLyBhY3V0ZUFuZ2xlVGhyZXNob2xkU2luICsgZHogKiAoKHN0cmV0Y2hUaWxlIF4gKGsgKyAxKSAtIDEpIC8gKHN0cmV0Y2hUaWxlIC0gMSkgLSAxKVxuICAgICAgICAgICAgLy8gb3IgcHV0IGRpZmZlcmVudGx5LCBnaXZlbiB0aGF0IGsgaXMgYmFzZWQgb24gZCBhbmQgZHosIHRpbGUgb24gZGlzdGFuY2UgZCBjb3VsZCBiZSB1c2VkIG9uIGRpc3RhbmNlIHNjYWxlZCBieTpcbiAgICAgICAgICAgIC8vIDEgLyBhY3V0ZUFuZ2xlVGhyZXNob2xkU2luICsgKHN0cmV0Y2hUaWxlIF4gKGsgKyAxKSAtIDEpIC8gKHN0cmV0Y2hUaWxlIC0gMSkgLSAxXG4gICAgICAgICAgICBpZiAoZFNxciAqIHNxdWFyZShhY3V0ZUFuZ2xlVGhyZXNob2xkU2luKSA8IGR6U3FyKSByZXR1cm4gMS4wOyAvLyBFYXJseSByZXR1cm4sIG5vIHNjYWxlLlxuICAgICAgICAgICAgY29uc3QgciA9IE1hdGguc3FydChkU3FyIC8gZHpTcXIpO1xuICAgICAgICAgICAgY29uc3QgayA9ICByIC0gMSAvIGFjdXRlQW5nbGVUaHJlc2hvbGRTaW47XG4gICAgICAgICAgICByZXR1cm4gciAvICgxIC8gYWN1dGVBbmdsZVRocmVzaG9sZFNpbiArIChNYXRoLnBvdyhzdHJldGNoVGlsZSwgayArIDEpIC0gMSkgLyAoc3RyZXRjaFRpbGUgLSAxKSAtIDEpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHNob3VsZFNwbGl0ID0gKGl0KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXQuem9vbSA8IG1pblpvb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXQuem9vbSA9PT0gbWF4Wm9vbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpdC5zaG91bGRTcGxpdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0LnNob3VsZFNwbGl0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZHggPSBpdC5hYWJiLmRpc3RhbmNlWChjYW1lcmFQb2ludCk7XG4gICAgICAgICAgICBjb25zdCBkeSA9IGl0LmFhYmIuZGlzdGFuY2VZKGNhbWVyYVBvaW50KTtcbiAgICAgICAgICAgIGxldCBkelNxciA9IGNhbWVyYUhlaWdodFNxcjtcblxuICAgICAgICAgICAgbGV0IHRpbGVTY2FsZUFkanVzdG1lbnQgPSAxO1xuICAgICAgICAgICAgaWYgKGlzR2xvYmUpIHtcbiAgICAgICAgICAgICAgICBkelNxciA9IHNxdWFyZShpdC5hYWJiLmRpc3RhbmNlWihjYW1lcmFQb2ludCkpO1xuICAgICAgICAgICAgICAgIC8vIENvbXBlbnNhdGUgcGh5c2ljYWwgc2l6ZXMgb2YgdGhlIHRpbGVzIHdoZW4gZGV0ZXJtaW5pbmcgd2hpY2ggem9vbSBsZXZlbCB0byB1c2UuXG4gICAgICAgICAgICAgICAgLy8gSW4gcHJhY3RpY2UgdGlsZXMgY2xvc2VyIHRvIHBvbGVzIHNob3VsZCB1c2UgbW9yZSBhZ2dyZXNzaXZlIExPRCBhcyB0aGVpclxuICAgICAgICAgICAgICAgIC8vIHBoeXNpY2FsIHNpemUgaXMgYWxyZWFkeSBzbWFsbGVyIHRoYW4gc2l6ZSBvZiB0aWxlcyBuZWFyIHRoZSBlcXVhdG9yLlxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGVzQXRab29tID0gTWF0aC5wb3coMiwgaXQuem9vbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWluTGF0ID0gbGF0RnJvbU1lcmNhdG9yWSgoaXQueSArIDEpIC8gdGlsZXNBdFpvb20pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heExhdCA9IGxhdEZyb21NZXJjYXRvclkoKGl0LnkpIC8gdGlsZXNBdFpvb20pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsb3Nlc3RMYXQgPSBNYXRoLm1pbihNYXRoLm1heChjZW50ZXJMYXRpdHVkZSwgbWluTGF0KSwgbWF4TGF0KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlVGlsZVNjYWxlID0gY2lyY3VtZmVyZW5jZUF0TGF0aXR1ZGUoY2xvc2VzdExhdCkgLyBjaXJjdW1mZXJlbmNlQXRMYXRpdHVkZShjZW50ZXJMYXRpdHVkZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBXaXRoIGdsb2JlLCB0aGUgcmVuZGVyZWQgc2NhbGUgZG9lcyBub3QgZXhhY3RseSBtYXRjaCB0aGUgbWVyY2F0b3Igc2NhbGUgYXQgbG93IHpvb20gbGV2ZWxzLlxuICAgICAgICAgICAgICAgIC8vIEFjY291bnQgZm9yIHRoaXMgZGlmZmVyZW5jZSBkdXJpbmcgTE9EIG9mIGxvYWRpbmcgc28gdGhhdCB5b3UgbG9hZCB0aGUgY29ycmVjdCBzaXplIHRpbGVzLlxuICAgICAgICAgICAgICAgIC8vIFdlIHRyeSB0byBjb21wcm9taXNlIGJldHdlZW4gdHdvIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50czpcbiAgICAgICAgICAgICAgICAvLyAtIGxvYWRpbmcgdGlsZXMgYXQgdGhlIGNhbWVyYSdzIHpvb20gbGV2ZWwgKGZvciB2aXN1YWwgYW5kIHN0eWxpbmcgY29uc2lzdGVuY3kpXG4gICAgICAgICAgICAgICAgLy8gLSBsb2FkaW5nIGNvcnJlY3Qgc2l6ZSB0aWxlcyAodG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgdGlsZXMgbG9hZGVkKVxuICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBhcmJpdHJhcmlseSBiYWxhbmNlZDpcbiAgICAgICAgICAgICAgICBpZiAoY2xvc2VzdExhdCA9PT0gY2VudGVyTGF0aXR1ZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHRpbGVzIHRoYXQgYXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHZpZXdwb3J0LCBwcmlvcml0aXplIG1hdGNoaW5nIHRoZSBjYW1lcmFcbiAgICAgICAgICAgICAgICAgICAgLy8gem9vbSBhbmQgYWxsb3cgZGl2ZXJnZW5jZSBmcm9tIHRoZSB0cnVlIHNjYWxlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhEaXZlcmdlbmNlID0gMC4zO1xuICAgICAgICAgICAgICAgICAgICB0aWxlU2NhbGVBZGp1c3RtZW50ID0gMSAvIE1hdGgubWF4KDEsIHRoaXMuX21lcmNhdG9yU2NhbGVSYXRpbyAtIG1heERpdmVyZ2VuY2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBvdGhlciB0aWxlcywgdXNlIHRoZSByZWFsIHNjYWxlIHRvIHJlZHVjZSB0aWxlIGNvdW50cyBuZWFyIHBvbGVzLlxuICAgICAgICAgICAgICAgICAgICB0aWxlU2NhbGVBZGp1c3RtZW50ID0gTWF0aC5taW4oMSwgcmVsYXRpdmVUaWxlU2NhbGUgLyB0aGlzLl9tZXJjYXRvclNjYWxlUmF0aW8pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGFsbCB0aWxlcyBuZWFyIHRoZSBjZW50ZXIgaGF2ZSB0aGUgc2FtZSB6b29tIGxldmVsLlxuICAgICAgICAgICAgICAgIC8vIFdpdGggTE9EIHRpbGUgbG9hZGluZywgdGlsZSB6b29tIGxldmVscyBjYW4gY2hhbmdlIHdoZW4gc2NhbGUgc2xpZ2h0bHkgY2hhbmdlcy5cbiAgICAgICAgICAgICAgICAvLyBUaGVzZSBkaWZmZXJlbmNlcyBjYW4gYmUgcHJldHR5IGRpZmZlcmVudCBpbiBnbG9iZSB2aWV3LiBXb3JrIGFyb3VuZCB0aGlzIGJ5XG4gICAgICAgICAgICAgICAgLy8gbWFraW5nIG1vcmUgdGlsZXMgbWF0Y2ggdGhlIGNlbnRlciB0aWxlJ3Mgem9vbSBsZXZlbC4gSWYgdGhlIHRpbGVzIGFyZSBuZWFybHkgYmlnIGVub3VnaCxcbiAgICAgICAgICAgICAgICAvLyByb3VuZCB1cC4gT25seSBhcHBseSB0aGlzIGFkanVzdG1lbnQgYmVmb3JlIHRoZSB0cmFuc2l0aW9uIHRvIG1lcmNhdG9yIHJlbmRlcmluZyBoYXMgc3RhcnRlZC5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy56b29tIDw9IEdMT0JFX1pPT01fVEhSRVNIT0xEX01JTiAmJiBpdC56b29tID09PSBtYXhab29tIC0gMSAmJiByZWxhdGl2ZVRpbGVTY2FsZSA+PSAwLjkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoekluTWV0ZXJzKTtcbiAgICAgICAgICAgICAgICBpZiAodXNlRWxldmF0aW9uRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBkelNxciA9IHNxdWFyZShpdC5hYWJiLmRpc3RhbmNlWihjYW1lcmFQb2ludCkgKiBtZXRlclRvVGlsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2plY3Rpb24uaXNSZXByb2plY3RlZEluVGlsZVNwYWNlICYmIGFjdHVhbFogPD0gNSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbiBvdGhlciBwcm9qZWN0aW9ucywgbm90IGFsbCB0aWxlcyBhcmUgdGhlIHNhbWUgc2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3VudCBmb3IgdGhlIHRpbGUgc2l6ZSBkaWZmZXJlbmNlIGJ5IGFkanVzdGluZyB0aGUgZGlzdFRvU3BsaXQuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFkanVzdCBieSB0aGUgcmF0aW8gb2YgdGhlIGFyZWEgYXQgdGhlIHRpbGUgY2VudGVyIHRvIHRoZSBhcmVhIGF0IHRoZSBtYXAgY2VudGVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBBZGp1c3RtZW50cyBhcmUgb25seSBuZWVkZWQgYXQgbG93ZXIgem9vbXMgd2hlcmUgdGlsZXMgYXJlIG5vdCBzaW1pbGFybHkgc2l6ZWQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bVRpbGVzID0gTWF0aC5wb3coMiwgaXQuem9vbSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlU2NhbGUgPSByZWxhdGl2ZVNjYWxlQXRNZXJjYXRvckNvb3JkKG5ldyBNZXJjYXRvckNvb3JkaW5hdGUoKGl0LnggKyAwLjUpIC8gbnVtVGlsZXMsIChpdC55ICsgMC41KSAvIG51bVRpbGVzKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZ1ZGdlIHRoZSByYXRpbyBzbGlnaHRseSBzbyB0aGF0IGFsbCB0aWxlcyBuZWFyIHRoZSBjZW50ZXIgaGF2ZSB0aGUgc2FtZSB6b29tIGxldmVsLlxuICAgICAgICAgICAgICAgICAgICB0aWxlU2NhbGVBZGp1c3RtZW50ID0gcmVsYXRpdmVTY2FsZSA+IDAuODUgPyAxIDogcmVsYXRpdmVTY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlU3FyID0gZHggKiBkeCArIGR5ICogZHkgKyBkelNxcjtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RUb1NwbGl0ID0gKDEgPDwgbWF4Wm9vbSAtIGl0Lnpvb20pICogem9vbVNwbGl0RGlzdGFuY2UgKiB0aWxlU2NhbGVBZGp1c3RtZW50O1xuICAgICAgICAgICAgY29uc3QgZGlzdFRvU3BsaXRTcXIgPSBzcXVhcmUoZGlzdFRvU3BsaXQgKiBkaXN0VG9TcGxpdFNjYWxlKE1hdGgubWF4KGR6U3FyLCBjYW1lcmFIZWlnaHRTcXIpLCBkaXN0YW5jZVNxcikpO1xuXG4gICAgICAgICAgICByZXR1cm4gZGlzdGFuY2VTcXIgPCBkaXN0VG9TcGxpdFNxcjtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy5yZW5kZXJXb3JsZENvcGllcykge1xuICAgICAgICAgICAgLy8gUmVuZGVyIGNvcHkgb2YgdGhlIGdsb2JlIHRocmljZSBvbiBib3RoIHNpZGVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBOVU1fV09STERfQ09QSUVTOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKG5ld1Jvb3RUaWxlKC1pKSk7XG4gICAgICAgICAgICAgICAgc3RhY2sucHVzaChuZXdSb290VGlsZShpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdGFjay5wdXNoKG5ld1Jvb3RUaWxlKDApKTtcblxuICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaXQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgICAgIGNvbnN0IHggPSBpdC54O1xuICAgICAgICAgICAgY29uc3QgeSA9IGl0Lnk7XG4gICAgICAgICAgICBsZXQgZnVsbHlWaXNpYmxlID0gaXQuZnVsbHlWaXNpYmxlO1xuXG4gICAgICAgICAgICAvLyBWaXNpYmlsaXR5IG9mIGEgdGlsZSBpcyBub3QgcmVxdWlyZWQgaWYgYW55IG9mIGl0cyBhbmNlc3RvciBpcyBmdWxseSBpbnNpZGUgdGhlIGZydXN0dW1cbiAgICAgICAgICAgIGlmICghZnVsbHlWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJzZWN0UmVzdWx0ID0gaXQuYWFiYi5pbnRlcnNlY3RzKGNhbWVyYUZydXN0dW0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGludGVyc2VjdFJlc3VsdCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBmdWxseVZpc2libGUgPSBpbnRlcnNlY3RSZXN1bHQgPT09IDI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhdmUgd2UgcmVhY2hlZCB0aGUgdGFyZ2V0IGRlcHRoIG9yIGlzIHRoZSB0aWxlIHRvbyBmYXIgYXdheSB0byBiZSBhbnkgc3BsaXQgZnVydGhlcj9cbiAgICAgICAgICAgIGlmIChpdC56b29tID09PSBtYXhab29tIHx8ICFzaG91bGRTcGxpdChpdCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aWxlWm9vbSA9IGl0Lnpvb20gPT09IG1heFpvb20gPyBvdmVyc2NhbGVkWiA6IGl0Lnpvb207XG4gICAgICAgICAgICAgICAgaWYgKCEhb3B0aW9ucy5taW56b29tICYmIG9wdGlvbnMubWluem9vbSA+IHRpbGVab29tKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdCB3aXRoaW4gc291cmNlIHRpbGUgcmFuZ2UuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGR4ID0gY2VudGVyUG9pbnRbMF0gLSAoKDAuNSArIHggKyAoaXQud3JhcCA8PCBpdC56b29tKSkgKiAoMSA8PCAoeiAtIGl0Lnpvb20pKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZHkgPSBjZW50ZXJQb2ludFsxXSAtIDAuNSAtIHk7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBpdC50aWxlSUQgPyBpdC50aWxlSUQgOiBuZXcgT3ZlcnNjYWxlZFRpbGVJRCh0aWxlWm9vbSwgaXQud3JhcCwgaXQuem9vbSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goe3RpbGVJRDogaWQsIGRpc3RhbmNlU3E6IGR4ICogZHggKyBkeSAqIGR5fSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRYID0gKHggPDwgMSkgKyAoaSAlIDIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkWSA9ICh5IDw8IDEpICsgKGkgPj4gMSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhYWJiID0gaXNNZXJjYXRvciA/IGl0LmFhYmIucXVhZHJhbnQoaSkgOiB0aWxlQUFCQih0aGlzLCBudW1UaWxlcywgaXQuem9vbSArIDEsIGNoaWxkWCwgY2hpbGRZLCBpdC53cmFwLCBpdC5taW5aLCBpdC5tYXhaLCB0aGlzLnByb2plY3Rpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0ge2FhYmIsIHpvb206IGl0Lnpvb20gKyAxLCB4OiBjaGlsZFgsIHk6IGNoaWxkWSwgd3JhcDogaXQud3JhcCwgZnVsbHlWaXNpYmxlLCB0aWxlSUQ6IHVuZGVmaW5lZCwgc2hvdWxkU3BsaXQ6IHVuZGVmaW5lZCwgbWluWjogaXQubWluWiwgbWF4WjogaXQubWF4Wn07XG4gICAgICAgICAgICAgICAgaWYgKHVzZUVsZXZhdGlvbkRhdGEgJiYgIWlzR2xvYmUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQudGlsZUlEID0gbmV3IE92ZXJzY2FsZWRUaWxlSUQoaXQuem9vbSArIDEgPT09IG1heFpvb20gPyBvdmVyc2NhbGVkWiA6IGl0Lnpvb20gKyAxLCBpdC53cmFwLCBpdC56b29tICsgMSwgY2hpbGRYLCBjaGlsZFkpO1xuICAgICAgICAgICAgICAgICAgICBnZXRBQUJCRnJvbUVsZXZhdGlvbihjaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZm9nQ3VsbERpc3RTcSkge1xuICAgICAgICAgICAgY29uc3QgZm9nQ3VsbERpc3RTcSA9IHRoaXMuZm9nQ3VsbERpc3RTcTtcbiAgICAgICAgICAgIGNvbnN0IGhvcml6b25MaW5lRnJvbVRvcCA9IHRoaXMuaG9yaXpvbkxpbmVGcm9tVG9wKCk7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaW4gPSBbMCwgMCwgMCwgMV07XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4ID0gW0VYVEVOVCwgRVhURU5ULCAwLCAxXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZvZ1RpbGVNYXRyaXggPSB0aGlzLmNhbGN1bGF0ZUZvZ1RpbGVNYXRyaXgoZW50cnkudGlsZUlELnRvVW53cmFwcGVkKCkpO1xuXG4gICAgICAgICAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KG1pbiwgbWluLCBmb2dUaWxlTWF0cml4KTtcbiAgICAgICAgICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQobWF4LCBtYXgsIGZvZ1RpbGVNYXRyaXgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3FEaXN0ID0gZ2V0QUFCQlBvaW50U3F1YXJlRGlzdChtaW4sIG1heCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3FEaXN0ID09PSAwKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICAgICAgICAgICAgICBsZXQgb3Zlckhvcml6b25MaW5lID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBUZXJyYWluIGxvYWRzIGF0IG9uZSB6b29tIGxldmVsIGxvd2VyIHRoYW4gdGhlIHJhc3RlciBkYXRhLFxuICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBmb2xsb3dpbmcgY2hlY2tzIHdoZXRoZXIgdGhlIHRlcnJhaW4gc2l0cyBhYm92ZSB0aGUgaG9yaXpvbiBhbmQgZW5zdXJlcyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gd2hlbiBtb3VudGFpbnMgc3RpY2sgb3V0IGFib3ZlIHRoZSBmb2cgKGR1ZSB0byBob3Jpem9uLWJsZW5kKSxcbiAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlbuKAmXQgYWNjaWRlbnRhbGx5IGN1bGxlZCBzb21lIG9mIHRoZSByYXN0ZXIgdGlsZXMgd2UgbmVlZCB0byBkcmF3IG9uIHRoZW0uXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9u4oCZdCBkbyB0aGlzLCB0aGUgdGVycmFpbiBpcyBkZWZhdWx0IGJsYWNrIGNvbG9yIGFuZCBtYXkgZmxhc2ggaW4gYW5kIG91dCBhcyB3ZSBtb3ZlIHRvd2FyZCBpdC5cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZXZhdGlvbiA9IHRoaXMuX2VsZXZhdGlvbjtcblxuICAgICAgICAgICAgICAgIGlmIChlbGV2YXRpb24gJiYgc3FEaXN0ID4gZm9nQ3VsbERpc3RTcSAmJiBob3Jpem9uTGluZUZyb21Ub3AgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvak1hdHJpeCA9IHRoaXMuY2FsY3VsYXRlUHJvak1hdHJpeChlbnRyeS50aWxlSUQudG9VbndyYXBwZWQoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pbm1heDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlzVGVycmFpbkRFTSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlubWF4ID0gZWxldmF0aW9uLmdldE1pbk1heEZvclRpbGUoZW50cnkudGlsZUlEKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghbWlubWF4KSB7IG1pbm1heCA9IHttaW46IG1pblJhbmdlLCBtYXg6IG1heFJhbmdlfTsgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHdlIHdhbnQgYHRoaXMucm90YXRpb25gIGluc3RlYWQgb2YgYHRoaXMuYmVhcmluZ2AgaGVyZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3JuZXJGYXIgPSBmdXJ0aGVzdFRpbGVDb3JuZXIodGhpcy5yb3RhdGlvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmFyWCA9IGNvcm5lckZhclswXSAqIEVYVEVOVDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmFyWSA9IGNvcm5lckZhclsxXSAqIEVYVEVOVDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JsZEZhciA9IFtmYXJYLCBmYXJZLCBtaW5tYXgubWF4XTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXb3JsZCB0byBORENcbiAgICAgICAgICAgICAgICAgICAgdmVjMy50cmFuc2Zvcm1NYXQ0KHdvcmxkRmFyLCB3b3JsZEZhciwgcHJvak1hdHJpeCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTkRDIHRvIFNjcmVlblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JlZW5Db29yZFkgPSAoMSAtIHdvcmxkRmFyWzFdKSAqIHRoaXMuaGVpZ2h0ICogMC41O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgY3V0dGluZyB0aWxlcyBjcm9zc2luZyBvdmVyIHRoZSBob3Jpem9uIGxpbmUgdG9cbiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBwb3AtaW4gYW5kIG91dCB3aXRoaW4gdGhlIGZvZyBjdWxsaW5nIHJhbmdlXG4gICAgICAgICAgICAgICAgICAgIG92ZXJIb3Jpem9uTGluZSA9IHNjcmVlbkNvb3JkWSA8IGhvcml6b25MaW5lRnJvbVRvcDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3FEaXN0IDwgZm9nQ3VsbERpc3RTcSB8fCBvdmVySG9yaXpvbkxpbmU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvdmVyID0gcmVzdWx0LnNvcnQoKGEsIGIpID0+IGEuZGlzdGFuY2VTcSAtIGIuZGlzdGFuY2VTcSkubWFwKGEgPT4gYS50aWxlSUQpO1xuICAgICAgICAvLyBSZWxheCB0aGUgYXNzZXJ0aW9uIG9uIHRlcnJhaW4sIG9uIGhpZ2ggem9vbSB3ZSB1c2UgZGlzdGFuY2UgdG8gY2VudGVyIG9mIHRpbGVcbiAgICAgICAgLy8gd2hpbGUgY2FtZXJhIG1pZ2h0IGJlIGNsb3NlciB0byBzZWxlY3RlZCBjZW50ZXIgb2YgbWFwLlxuICAgICAgICBhc3NlcnQoIWNvdmVyLmxlbmd0aCB8fCB0aGlzLmVsZXZhdGlvbiB8fCBjb3ZlclswXS5vdmVyc2NhbGVkWiA9PT0gb3ZlcnNjYWxlZFogfHwgIWlzTWVyY2F0b3IpO1xuICAgICAgICByZXR1cm4gY292ZXI7XG4gICAgfVxuXG4gICAgcmVzaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5waXhlbHNUb0dMVW5pdHMgPSBbMiAvIHdpZHRoLCAtMiAvIGhlaWdodF07XG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbigpO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBnZXQgdW5tb2RpZmllZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3VubW9kaWZpZWQ7IH1cblxuICAgIHpvb21TY2FsZSh6b29tOiBudW1iZXIpOiBudW1iZXIgeyByZXR1cm4gTWF0aC5wb3coMiwgem9vbSk7IH1cbiAgICBzY2FsZVpvb20oc2NhbGU6IG51bWJlcik6IG51bWJlciB7IHJldHVybiBNYXRoLmxvZyhzY2FsZSkgLyBNYXRoLkxOMjsgfVxuXG4gICAgLy8gVHJhbnNmb3JtIGZyb20gTG5nTGF0IHRvIFBvaW50IGluIHdvcmxkIGNvb3JkaW5hdGVzIFstMTgwLCAxODBdIHggWzkwLCAtOTBdIC0tPiBbMCwgdGhpcy53b3JsZFNpemVdIHggWzAsIHRoaXMud29ybGRTaXplXVxuICAgIHByb2plY3QobG5nbGF0OiBMbmdMYXQpOiBQb2ludCB7XG4gICAgICAgIGNvbnN0IGxhdCA9IGNsYW1wKGxuZ2xhdC5sYXQsIC1NQVhfTUVSQ0FUT1JfTEFUSVRVREUsIE1BWF9NRVJDQVRPUl9MQVRJVFVERSk7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZExuZ0xhdCA9IHRoaXMucHJvamVjdGlvbi5wcm9qZWN0KGxuZ2xhdC5sbmcsIGxhdCk7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgICAgICAgICAgcHJvamVjdGVkTG5nTGF0LnggKiB0aGlzLndvcmxkU2l6ZSxcbiAgICAgICAgICAgICAgICBwcm9qZWN0ZWRMbmdMYXQueSAqIHRoaXMud29ybGRTaXplKTtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2Zvcm0gZnJvbSBQb2ludCBpbiB3b3JsZCBjb29yZGluYXRlcyB0byBMbmdMYXQgWzAsIHRoaXMud29ybGRTaXplXSB4IFswLCB0aGlzLndvcmxkU2l6ZV0gLS0+IFstMTgwLCAxODBdIHggWzkwLCAtOTBdXG4gICAgdW5wcm9qZWN0KHBvaW50OiBQb2ludCk6IExuZ0xhdCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb24udW5wcm9qZWN0KHBvaW50LnggLyB0aGlzLndvcmxkU2l6ZSwgcG9pbnQueSAvIHRoaXMud29ybGRTaXplKTtcbiAgICB9XG5cbiAgICAvLyBQb2ludCBhdCBjZW50ZXIgaW4gd29ybGQgY29vcmRpbmF0ZXMuXG4gICAgZ2V0IHBvaW50KCk6IFBvaW50IHsgcmV0dXJuIHRoaXMucHJvamVjdCh0aGlzLmNlbnRlcik7IH1cblxuICAgIHNldExvY2F0aW9uQXRQb2ludChsbmdsYXQ6IExuZ0xhdCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgICAgIGxldCB4LCB5O1xuICAgICAgICBjb25zdCBjZW50ZXJQb2ludCA9IHRoaXMuY2VudGVyUG9pbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICAvLyBQaXhlbCBjb29yZGluYXRlcyBhcmUgYXBwbGllZCBkaXJlY3RseSB0byB0aGUgZ2xvYmVcbiAgICAgICAgICAgIGNvbnN0IHdvcmxkU2l6ZSA9IHRoaXMud29ybGRTaXplO1xuICAgICAgICAgICAgeCA9IChwb2ludC54IC0gY2VudGVyUG9pbnQueCkgLyB3b3JsZFNpemU7XG4gICAgICAgICAgICB5ID0gKHBvaW50LnkgLSBjZW50ZXJQb2ludC55KSAvIHdvcmxkU2l6ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShwb2ludCk7XG4gICAgICAgICAgICBjb25zdCBiID0gdGhpcy5wb2ludENvb3JkaW5hdGUoY2VudGVyUG9pbnQpO1xuICAgICAgICAgICAgeCA9IGEueCAtIGIueDtcbiAgICAgICAgICAgIHkgPSBhLnkgLSBiLnk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2MgPSB0aGlzLmxvY2F0aW9uQ29vcmRpbmF0ZShsbmdsYXQpO1xuICAgICAgICB0aGlzLnNldExvY2F0aW9uKG5ldyBNZXJjYXRvckNvb3JkaW5hdGUobG9jLnggLSB4LCBsb2MueSAtIHkpKTtcbiAgICB9XG5cbiAgICBzZXRMb2NhdGlvbihsb2NhdGlvbjogTWVyY2F0b3JDb29yZGluYXRlKSB7XG4gICAgICAgIHRoaXMuY2VudGVyID0gdGhpcy5jb29yZGluYXRlTG9jYXRpb24obG9jYXRpb24pO1xuICAgICAgICBpZiAodGhpcy5wcm9qZWN0aW9uLndyYXApIHtcbiAgICAgICAgICAgIHRoaXMuY2VudGVyID0gdGhpcy5jZW50ZXIud3JhcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBsb2NhdGlvbiwgcmV0dXJuIHRoZSBzY3JlZW4gcG9pbnQgdGhhdCBjb3JyZXNwb25kcyB0byBpdC4gSW4gM0QgbW9kZVxuICAgICAqICh3aXRoIHRlcnJhaW4pIHRoaXMgYmVoYXZlcyB0aGUgc2FtZSBhcyBpbiAyRCBtb2RlLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNvdXBsZWQgd2l0aCB7QHNlZSBwb2ludExvY2F0aW9ufSBpbiAzRCBtb2RlIHRvIG1vZGVsIG1hcCBtYW5pcHVsYXRpb25cbiAgICAgKiB1c2luZyBmbGF0IHBsYW5lIGFwcHJvYWNoIHRvIGtlZXAgY29uc3RhbnQgZWxldmF0aW9uIGFib3ZlIGdyb3VuZC5cbiAgICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nbGF0IGxvY2F0aW9uXG4gICAgICogQHJldHVybnMge1BvaW50fSBzY3JlZW4gcG9pbnRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGxvY2F0aW9uUG9pbnQobG5nbGF0OiBMbmdMYXQpOiBQb2ludCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb24ubG9jYXRpb25Qb2ludCh0aGlzLCBsbmdsYXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgbG9jYXRpb24sIHJldHVybiB0aGUgc2NyZWVuIHBvaW50IHRoYXQgY29ycmVzcG9uZHMgdG8gaXRcbiAgICAgKiBJbiAzRCBtb2RlICh3aGVuIHRlcnJhaW4gaXMgZW5hYmxlZCkgZWxldmF0aW9uIGlzIHNhbXBsZWQgZm9yIHRoZSBwb2ludCBiZWZvcmVcbiAgICAgKiBwcm9qZWN0aW5nIGl0LiBJbiAyRCBtb2RlLCBiZWhhdmVzIHRoZSBzYW1lIGxvY2F0aW9uUG9pbnQuXG4gICAgICogQHBhcmFtIHtMbmdMYXR9IGxuZ2xhdCBsb2NhdGlvblxuICAgICAqIEByZXR1cm5zIHtQb2ludH0gc2NyZWVuIHBvaW50XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2NhdGlvblBvaW50M0QobG5nbGF0OiBMbmdMYXQpOiBQb2ludCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb24ubG9jYXRpb25Qb2ludCh0aGlzLCBsbmdsYXQsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgcG9pbnQgb24gc2NyZWVuLCByZXR1cm4gaXRzIGxuZ2xhdFxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgc2NyZWVuIHBvaW50XG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gbG5nbGF0IGxvY2F0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwb2ludExvY2F0aW9uKHA6IFBvaW50KTogTG5nTGF0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHBvaW50IG9uIHNjcmVlbiwgcmV0dXJuIGl0cyBsbmdsYXRcbiAgICAgKiBJbiAzRCBtb2RlIChtYXAgd2l0aCB0ZXJyYWluKSByZXR1cm5zIGxvY2F0aW9uIG9mIHRlcnJhaW4gcmF5Y2FzdCBwb2ludC5cbiAgICAgKiBJbiAyRCBtb2RlLCBiZWhhdmVzIHRoZSBzYW1lIGFzIHtAc2VlIHBvaW50TG9jYXRpb259LlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgc2NyZWVuIHBvaW50XG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gbG5nbGF0IGxvY2F0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwb2ludExvY2F0aW9uM0QocDogUG9pbnQpOiBMbmdMYXQge1xuICAgICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRlTG9jYXRpb24odGhpcy5wb2ludENvb3JkaW5hdGUzRChwKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBnZW9ncmFwaGljYWwgbG5nTGF0LCByZXR1cm4gYW4gdW5yb3VuZGVkXG4gICAgICogY29vcmRpbmF0ZSB0aGF0IHJlcHJlc2VudHMgaXQgYXQgdGhpcyB0cmFuc2Zvcm0ncyB6b29tIGxldmVsLlxuICAgICAqIEBwYXJhbSB7TG5nTGF0fSBsbmdMYXRcbiAgICAgKiBAcmV0dXJucyB7Q29vcmRpbmF0ZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGxvY2F0aW9uQ29vcmRpbmF0ZShsbmdMYXQ6IExuZ0xhdCwgYWx0aXR1ZGU/OiBudW1iZXIpOiBNZXJjYXRvckNvb3JkaW5hdGUge1xuICAgICAgICBjb25zdCB6ID0gYWx0aXR1ZGUgP1xuICAgICAgICAgICAgbWVyY2F0b3JaZnJvbUFsdGl0dWRlKGFsdGl0dWRlLCBsbmdMYXQubGF0KSA6XG4gICAgICAgICAgICB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHByb2plY3RlZExuZ0xhdCA9IHRoaXMucHJvamVjdGlvbi5wcm9qZWN0KGxuZ0xhdC5sbmcsIGxuZ0xhdC5sYXQpO1xuICAgICAgICByZXR1cm4gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShcbiAgICAgICAgICAgIHByb2plY3RlZExuZ0xhdC54LFxuICAgICAgICAgICAgcHJvamVjdGVkTG5nTGF0LnksXG4gICAgICAgICAgICB6KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIENvb3JkaW5hdGUsIHJldHVybiBpdHMgZ2VvZ3JhcGhpY2FsIHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gY29vcmRcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBsbmdMYXRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvb3JkaW5hdGVMb2NhdGlvbihjb29yZDogTWVyY2F0b3JDb29yZGluYXRlKTogTG5nTGF0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdGlvbi51bnByb2plY3QoY29vcmQueCwgY29vcmQueSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYSByYXkgZnJvbSBhIHBvaW50IG9uIHNjcmVlbiBhbmQgcmV0dXJucyB0aGUgUmF5LFxuICAgICAqIGFuZCB0aGUgZXh0ZW50IGFsb25nIGl0LCBhdCB3aGljaCBpdCBpbnRlcnNlY3RzIHRoZSBtYXAgcGxhbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIFZpZXdwb3J0IHBpeGVsIGNvLW9yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiBPcHRpb25hbCBhbHRpdHVkZSBvZiB0aGUgbWFwIHBsYW5lLCBkZWZhdWx0aW5nIHRvIGVsZXZhdGlvbiBhdCBjZW50ZXIuXG4gICAgICogQHJldHVybnMge3sgcDA6IFZlYzQsIHAxOiBWZWM0LCB0OiBudW1iZXIgfX0gcDAscDEgYXJlIHR3byBwb2ludHMgb24gdGhlIHJheS5cbiAgICAgKiB0IGlzIHRoZSBmcmFjdGlvbmFsIGV4dGVudCBhbG9uZyB0aGUgcmF5IGF0IHdoaWNoIHRoZSByYXkgaW50ZXJzZWN0cyB0aGUgbWFwIHBsYW5lLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcG9pbnRSYXlJbnRlcnNlY3Rpb24ocDogUG9pbnQsIHo6ID9udW1iZXIpOiBSYXlJbnRlcnNlY3Rpb25SZXN1bHQge1xuICAgICAgICBjb25zdCB0YXJnZXRaID0gKHogIT09IHVuZGVmaW5lZCAmJiB6ICE9PSBudWxsKSA/IHogOiB0aGlzLl9jZW50ZXJBbHRpdHVkZTtcbiAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29ycmVjdCBwcm9qZWN0ZWQgeiB2YWx1ZSBmb3IgdGhlIHBvaW50LFxuICAgICAgICAvLyB1bnByb2plY3QgdHdvIHBvaW50cyB0byBnZXQgYSBsaW5lIGFuZCB0aGVuIGZpbmQgdGhlIHBvaW50IG9uIHRoYXRcbiAgICAgICAgLy8gbGluZSB3aXRoIHo9MC5cblxuICAgICAgICBjb25zdCBwMCA9IFtwLngsIHAueSwgMCwgMV07XG4gICAgICAgIGNvbnN0IHAxID0gW3AueCwgcC55LCAxLCAxXTtcblxuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocDAsIHAwLCB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSk7XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChwMSwgcDEsIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKTtcblxuICAgICAgICBjb25zdCB3MCA9IHAwWzNdO1xuICAgICAgICBjb25zdCB3MSA9IHAxWzNdO1xuICAgICAgICB2ZWM0LnNjYWxlKHAwLCBwMCwgMSAvIHcwKTtcbiAgICAgICAgdmVjNC5zY2FsZShwMSwgcDEsIDEgLyB3MSk7XG5cbiAgICAgICAgY29uc3QgejAgPSBwMFsyXTtcbiAgICAgICAgY29uc3QgejEgPSBwMVsyXTtcblxuICAgICAgICBjb25zdCB0ID0gejAgPT09IHoxID8gMCA6ICh0YXJnZXRaIC0gejApIC8gKHoxIC0gejApO1xuXG4gICAgICAgIHJldHVybiB7cDAsIHAxLCB0fTtcbiAgICB9XG5cbiAgICBzY3JlZW5Qb2ludFRvTWVyY2F0b3JSYXkocDogUG9pbnQpOiBSYXkge1xuICAgICAgICBjb25zdCBwMCA9IFtwLngsIHAueSwgMCwgMV07XG4gICAgICAgIGNvbnN0IHAxID0gW3AueCwgcC55LCAxLCAxXTtcblxuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocDAsIHAwLCB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSk7XG4gICAgICAgIHZlYzQudHJhbnNmb3JtTWF0NChwMSwgcDEsIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKTtcblxuICAgICAgICB2ZWM0LnNjYWxlKHAwLCBwMCwgMSAvIHAwWzNdKTtcbiAgICAgICAgdmVjNC5zY2FsZShwMSwgcDEsIDEgLyBwMVszXSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBhbHRpdHVkZSBmcm9tIG1ldGVycyB0byBwaXhlbHMuXG4gICAgICAgIHAwWzJdID0gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKHAwWzJdLCB0aGlzLl9jZW50ZXIubGF0KSAqIHRoaXMud29ybGRTaXplO1xuICAgICAgICBwMVsyXSA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZShwMVsyXSwgdGhpcy5fY2VudGVyLmxhdCkgKiB0aGlzLndvcmxkU2l6ZTtcblxuICAgICAgICB2ZWM0LnNjYWxlKHAwLCBwMCwgMSAvIHRoaXMud29ybGRTaXplKTtcbiAgICAgICAgdmVjNC5zY2FsZShwMSwgcDEsIDEgLyB0aGlzLndvcmxkU2l6ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBSYXkoW3AwWzBdLCBwMFsxXSwgcDBbMl1dLCB2ZWMzLm5vcm1hbGl6ZShbXSwgdmVjMy5zdWIoW10sIHAxLCBwMCkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgSGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IHRoZSByYXkgaW50ZXJzZWN0aW9uIHdpdGggdGhlIG1hcCBwbGFuZSB0byBNZXJjYXRvckNvb3JkaW5hdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JheUludGVyc2VjdGlvblJlc3VsdH0gcmF5SW50ZXJzZWN0aW9uXG4gICAgICogQHJldHVybnMge01lcmNhdG9yQ29vcmRpbmF0ZX1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHJheUludGVyc2VjdGlvbkNvb3JkaW5hdGUocmF5SW50ZXJzZWN0aW9uOiBSYXlJbnRlcnNlY3Rpb25SZXN1bHQpOiBNZXJjYXRvckNvb3JkaW5hdGUge1xuICAgICAgICBjb25zdCB7cDAsIHAxLCB0fSA9IHJheUludGVyc2VjdGlvbjtcblxuICAgICAgICBjb25zdCB6MCA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZShwMFsyXSwgdGhpcy5fY2VudGVyLmxhdCk7XG4gICAgICAgIGNvbnN0IHoxID0gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKHAxWzJdLCB0aGlzLl9jZW50ZXIubGF0KTtcblxuICAgICAgICByZXR1cm4gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShcbiAgICAgICAgICAgIGludGVycG9sYXRlKHAwWzBdLCBwMVswXSwgdCkgLyB0aGlzLndvcmxkU2l6ZSxcbiAgICAgICAgICAgIGludGVycG9sYXRlKHAwWzFdLCBwMVsxXSwgdCkgLyB0aGlzLndvcmxkU2l6ZSxcbiAgICAgICAgICAgIGludGVycG9sYXRlKHowLCB6MSwgdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgcG9pbnQgb24gc2NyZWVuLCByZXR1cm5zIE1lcmNhdG9yQ29vcmRpbmF0ZS5cbiAgICAgKiBAcGFyYW0ge1BvaW50fSBwIFRvcCBsZWZ0IG9yaWdpbiBzY3JlZW4gcG9pbnQsIGluIHBpeGVscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0geiBPcHRpb25hbCBhbHRpdHVkZSBvZiB0aGUgbWFwIHBsYW5lLCBkZWZhdWx0aW5nIHRvIGVsZXZhdGlvbiBhdCBjZW50ZXIuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwb2ludENvb3JkaW5hdGUocDogUG9pbnQsIHo/OiBudW1iZXIgPSB0aGlzLl9jZW50ZXJBbHRpdHVkZSk6IE1lcmNhdG9yQ29vcmRpbmF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb24ucG9pbnRDb29yZGluYXRlKHRoaXMsIHAueCwgcC55LCB6KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIHBvaW50IG9uIHNjcmVlbiwgcmV0dXJucyBNZXJjYXRvckNvb3JkaW5hdGUuXG4gICAgICogSW4gM0QgbW9kZSwgcmF5Y2FzdCB0byB0ZXJyYWluLiBJbiAyRCBtb2RlLCBiZWhhdmVzIHRoZSBzYW1lIGFzIHtAc2VlIHBvaW50Q29vcmRpbmF0ZX0uXG4gICAgICogRm9yIHAgYWJvdmUgdGVycmFpbiwgZG9uJ3QgcmV0dXJuIHBvaW50IGJlaGluZCBjYW1lcmEgYnV0IGNsYW1wIHAueSBhdCB0aGUgdG9wIG9mIHRlcnJhaW4uXG4gICAgICogQHBhcmFtIHtQb2ludH0gcCB0b3AgbGVmdCBvcmlnaW4gc2NyZWVuIHBvaW50LCBpbiBwaXhlbHMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwb2ludENvb3JkaW5hdGUzRChwOiBQb2ludCk6IE1lcmNhdG9yQ29vcmRpbmF0ZSB7XG4gICAgICAgIGlmICghdGhpcy5lbGV2YXRpb24pIHJldHVybiB0aGlzLnBvaW50Q29vcmRpbmF0ZShwKTtcbiAgICAgICAgbGV0IHJheWNhc3Q6ID9WZWMzID0gdGhpcy5wcm9qZWN0aW9uLnBvaW50Q29vcmRpbmF0ZTNEKHRoaXMsIHAueCwgcC55KTtcbiAgICAgICAgaWYgKHJheWNhc3QpIHJldHVybiBuZXcgTWVyY2F0b3JDb29yZGluYXRlKHJheWNhc3RbMF0sIHJheWNhc3RbMV0sIHJheWNhc3RbMl0pO1xuICAgICAgICBsZXQgc3RhcnQgPSAwLCBlbmQgPSB0aGlzLmhvcml6b25MaW5lRnJvbVRvcCgpO1xuICAgICAgICBpZiAocC55ID4gZW5kKSByZXR1cm4gdGhpcy5wb2ludENvb3JkaW5hdGUocCk7IC8vIGhvbGVzIGJldHdlZW4gdGlsZXMgYmVsb3cgaG9yaXpvbiBsaW5lIG9yIGJlbG93IGJvdHRvbS5cbiAgICAgICAgY29uc3Qgc2FtcGxlcyA9IDEwO1xuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSAwLjAyICogZW5kO1xuICAgICAgICBjb25zdCByID0gcC5jbG9uZSgpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlcyAmJiBlbmQgLSBzdGFydCA+IHRocmVzaG9sZDsgaSsrKSB7XG4gICAgICAgICAgICByLnkgPSBpbnRlcnBvbGF0ZShzdGFydCwgZW5kLCAwLjY2KTsgLy8gbm9uIHVuaWZvcm0gYmluYXJ5IHNlYXJjaCBmYXZvcmluZyBwb2ludHMgY2xvc2VyIHRvIGhvcml6b24uXG4gICAgICAgICAgICBjb25zdCByQ2FzdCA9IHRoaXMucHJvamVjdGlvbi5wb2ludENvb3JkaW5hdGUzRCh0aGlzLCByLngsIHIueSk7XG4gICAgICAgICAgICBpZiAockNhc3QpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSByLnk7XG4gICAgICAgICAgICAgICAgcmF5Y2FzdCA9IHJDYXN0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IHIueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmF5Y2FzdCA/IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUocmF5Y2FzdFswXSwgcmF5Y2FzdFsxXSwgcmF5Y2FzdFsyXSkgOiB0aGlzLnBvaW50Q29vcmRpbmF0ZShwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSBzY3JlZW5zcGFjZSBQb2ludCBwLCBpcyBhYm92ZSB0aGUgaG9yaXpvbi5cbiAgICAgKiBJbiBub24tZ2xvYmUgcHJvamVjdGlvbnMsIHRoaXMgYXBwcm94aW1hdGVzIHRoZSBtYXAgYXMgYW4gaW5maW5pdGUgcGxhbmUgYW5kIGRvZXMgbm90IGFjY291bnQgZm9yIHowLXozXG4gICAgICogd2hlcmVpbiB0aGUgbWFwIGlzIHNtYWxsIHF1YWQgd2l0aCB3aGl0ZXNwYWNlIGFib3ZlIHRoZSBub3J0aCBwb2xlIGFuZCBiZWxvdyB0aGUgc291dGggcG9sZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9pbnR9IHBcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGlzUG9pbnRBYm92ZUhvcml6b24ocDogUG9pbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdGlvbi5pc1BvaW50QWJvdmVIb3Jpem9uKHRoaXMsIHApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgY29vcmRpbmF0ZSwgcmV0dXJuIHRoZSBzY3JlZW4gcG9pbnQgdGhhdCBjb3JyZXNwb25kcyB0byBpdFxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gY29vcmRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNhbXBsZVRlcnJhaW5JbjNEIGluIDNEIG1vZGUgKHRlcnJhaW4gZW5hYmxlZCksIHNhbXBsZSBlbGV2YXRpb24gZm9yIHRoZSBwb2ludC5cbiAgICAgKiBJZiBmYWxzZSwgZG8gdGhlIHNhbWUgYXMgaW4gMkQgbW9kZSwgYXNzdW1lIGZsYXQgY2FtZXJhIGVsZXZhdGlvbiBwbGFuZSBmb3IgYWxsIHBvaW50cy5cbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IHNjcmVlbiBwb2ludFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2Nvb3JkaW5hdGVQb2ludChjb29yZDogTWVyY2F0b3JDb29yZGluYXRlLCBzYW1wbGVUZXJyYWluSW4zRDogYm9vbGVhbik6IFBvaW50IHtcbiAgICAgICAgY29uc3QgZWxldmF0aW9uID0gc2FtcGxlVGVycmFpbkluM0QgJiYgdGhpcy5lbGV2YXRpb24gPyB0aGlzLmVsZXZhdGlvbi5nZXRBdFBvaW50T3JaZXJvKGNvb3JkLCB0aGlzLl9jZW50ZXJBbHRpdHVkZSkgOiB0aGlzLl9jZW50ZXJBbHRpdHVkZTtcbiAgICAgICAgY29uc3QgcCA9IFtjb29yZC54ICogdGhpcy53b3JsZFNpemUsIGNvb3JkLnkgKiB0aGlzLndvcmxkU2l6ZSwgZWxldmF0aW9uICsgY29vcmQudG9BbHRpdHVkZSgpLCAxXTtcbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KHAsIHAsIHRoaXMucGl4ZWxNYXRyaXgpO1xuICAgICAgICByZXR1cm4gcFszXSA+IDAgP1xuICAgICAgICAgICAgbmV3IFBvaW50KHBbMF0gLyBwWzNdLCBwWzFdIC8gcFszXSkgOlxuICAgICAgICAgICAgbmV3IFBvaW50KE51bWJlci5NQVhfVkFMVUUsIE51bWJlci5NQVhfVkFMVUUpO1xuICAgIH1cblxuICAgIF9nZXRCb3VuZHMobWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogTG5nTGF0Qm91bmRzIHtcbiAgICAgICAgY29uc3QgdG9wTGVmdCA9IG5ldyBQb2ludCh0aGlzLl9lZGdlSW5zZXRzLmxlZnQsIHRoaXMuX2VkZ2VJbnNldHMudG9wKTtcbiAgICAgICAgY29uc3QgdG9wUmlnaHQgPSBuZXcgUG9pbnQodGhpcy53aWR0aCAtIHRoaXMuX2VkZ2VJbnNldHMucmlnaHQsIHRoaXMuX2VkZ2VJbnNldHMudG9wKTtcbiAgICAgICAgY29uc3QgYm90dG9tUmlnaHQgPSBuZXcgUG9pbnQodGhpcy53aWR0aCAtIHRoaXMuX2VkZ2VJbnNldHMucmlnaHQsIHRoaXMuaGVpZ2h0IC0gdGhpcy5fZWRnZUluc2V0cy5ib3R0b20pO1xuICAgICAgICBjb25zdCBib3R0b21MZWZ0ID0gbmV3IFBvaW50KHRoaXMuX2VkZ2VJbnNldHMubGVmdCwgdGhpcy5oZWlnaHQgLSB0aGlzLl9lZGdlSW5zZXRzLmJvdHRvbSk7XG5cbiAgICAgICAgLy8gQ29uc2lkZXIgZmFyIHBvaW50cyBhdCB0aGUgbWF4aW11bSBwb3NzaWJsZSBlbGV2YXRpb25cbiAgICAgICAgLy8gYW5kIG5lYXIgcG9pbnRzIGF0IHRoZSBtaW5pbXVtIHRvIGVuc3VyZSBmdWxsIGNvdmVyYWdlLlxuICAgICAgICBsZXQgdGwgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZSh0b3BMZWZ0LCBtaW4pO1xuICAgICAgICBsZXQgdHIgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZSh0b3BSaWdodCwgbWluKTtcbiAgICAgICAgY29uc3QgYnIgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShib3R0b21SaWdodCwgbWF4KTtcbiAgICAgICAgY29uc3QgYmwgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShib3R0b21MZWZ0LCBtYXgpO1xuXG4gICAgICAgIC8vIFNuYXAgcG9pbnRzIGlmIG9mZiB0aGUgZWRnZXMgb2YgbWFwIChMYXRpdHVkZSBpcyB0b28gaGlnaCBvciBsb3cpLlxuICAgICAgICBjb25zdCBzbG9wZSA9IChwMSwgcDIpID0+IChwMi55IC0gcDEueSkgLyAocDIueCAtIHAxLngpO1xuXG4gICAgICAgIGlmICh0bC55ID4gMSAmJiB0ci55ID49IDApIHRsID0gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZSgoMSAtIGJsLnkpIC8gc2xvcGUoYmwsIHRsKSArIGJsLngsIDEpO1xuICAgICAgICBlbHNlIGlmICh0bC55IDwgMCAmJiB0ci55IDw9IDEpIHRsID0gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZSgtYmwueSAvIHNsb3BlKGJsLCB0bCkgKyBibC54LCAwKTtcblxuICAgICAgICBpZiAodHIueSA+IDEgJiYgdGwueSA+PSAwKSB0ciA9IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUoKDEgLSBici55KSAvIHNsb3BlKGJyLCB0cikgKyBici54LCAxKTtcbiAgICAgICAgZWxzZSBpZiAodHIueSA8IDAgJiYgdGwueSA8PSAxKSB0ciA9IG5ldyBNZXJjYXRvckNvb3JkaW5hdGUoLWJyLnkgLyBzbG9wZShiciwgdHIpICsgYnIueCwgMCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXRCb3VuZHMoKVxuICAgICAgICAgICAgLmV4dGVuZCh0aGlzLmNvb3JkaW5hdGVMb2NhdGlvbih0bCkpXG4gICAgICAgICAgICAuZXh0ZW5kKHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRyKSlcbiAgICAgICAgICAgIC5leHRlbmQodGhpcy5jb29yZGluYXRlTG9jYXRpb24oYmwpKVxuICAgICAgICAgICAgLmV4dGVuZCh0aGlzLmNvb3JkaW5hdGVMb2NhdGlvbihicikpO1xuICAgIH1cblxuICAgIF9nZXRCb3VuZHMzRCgpOiBMbmdMYXRCb3VuZHMge1xuICAgICAgICBhc3NlcnQodGhpcy5lbGV2YXRpb24pO1xuICAgICAgICBjb25zdCBlbGV2YXRpb24gPSAoKHRoaXMuZWxldmF0aW9uOiBhbnkpOiBFbGV2YXRpb24pO1xuICAgICAgICBpZiAoIWVsZXZhdGlvbi52aXNpYmxlRGVtVGlsZXMubGVuZ3RoKSB7IHJldHVybiB0aGlzLl9nZXRCb3VuZHMoMCwgMCk7IH1cbiAgICAgICAgY29uc3QgbWlubWF4ID0gZWxldmF0aW9uLnZpc2libGVEZW1UaWxlcy5yZWR1Y2UoKGFjYywgdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHQuZGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJlZSA9IHQuZGVtLnRyZWU7XG4gICAgICAgICAgICAgICAgYWNjLm1pbiA9IE1hdGgubWluKGFjYy5taW4sIHRyZWUubWluaW11bXNbMF0pO1xuICAgICAgICAgICAgICAgIGFjYy5tYXggPSBNYXRoLm1heChhY2MubWF4LCB0cmVlLm1heGltdW1zWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHttaW46IE51bWJlci5NQVhfVkFMVUUsIG1heDogMH0pO1xuICAgICAgICBhc3NlcnQobWlubWF4Lm1pbiAhPT0gTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCb3VuZHMobWlubWF4Lm1pbiAqIGVsZXZhdGlvbi5leGFnZ2VyYXRpb24oKSwgbWlubWF4Lm1heCAqIGVsZXZhdGlvbi5leGFnZ2VyYXRpb24oKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGJvdW5kcy4gV2hlbiB0aGUgYmVhcmluZyBvciBwaXRjaCBpcyBub24temVybywgdGhlIHZpc2libGUgcmVnaW9uIGlzIG5vdFxuICAgICAqIGFuIGF4aXMtYWxpZ25lZCByZWN0YW5nbGUsIGFuZCB0aGUgcmVzdWx0IGlzIHRoZSBzbWFsbGVzdCBib3VuZHMgdGhhdCBlbmNvbXBhc3NlcyB0aGUgdmlzaWJsZSByZWdpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBSZXR1cm5zIGEge0BsaW5rIExuZ0xhdEJvdW5kc30gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG1hcCdzIGdlb2dyYXBoaWNhbCBib3VuZHMuXG4gICAgICovXG4gICAgZ2V0Qm91bmRzKCk6IExuZ0xhdEJvdW5kcyB7XG4gICAgICAgIGlmICh0aGlzLl90ZXJyYWluRW5hYmxlZCgpKSByZXR1cm4gdGhpcy5fZ2V0Qm91bmRzM0QoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJvdW5kcygwLCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHBvc2l0aW9uIG9mIGhvcml6b24gbGluZSBmcm9tIHRoZSB0b3Agb2YgdGhlIG1hcCBpbiBwaXhlbHMuXG4gICAgICogSWYgaG9yaXpvbiBpcyBub3QgdmlzaWJsZSwgcmV0dXJucyAwIGJ5IGRlZmF1bHQgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBjYWxsZWQgd2l0aCBjbGFtcFRvVG9wID0gZmFsc2UuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBob3Jpem9uTGluZUZyb21Ub3AoY2xhbXBUb1RvcDogYm9vbGVhbiA9IHRydWUpOiBudW1iZXIge1xuICAgICAgICAvLyBoIGlzIGhlaWdodCBvZiBzcGFjZSBhYm92ZSBtYXAgY2VudGVyIHRvIGhvcml6b24uXG4gICAgICAgIGNvbnN0IGggPSB0aGlzLmhlaWdodCAvIDIgLyBNYXRoLnRhbih0aGlzLl9mb3YgLyAyKSAvIE1hdGgudGFuKE1hdGgubWF4KHRoaXMuX3BpdGNoLCAwLjEpKSArIHRoaXMuY2VudGVyT2Zmc2V0Lnk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuaGVpZ2h0IC8gMiAtIGggKiAoMSAtIHRoaXMuX2hvcml6b25TaGlmdCk7XG4gICAgICAgIHJldHVybiBjbGFtcFRvVG9wID8gTWF0aC5tYXgoMCwgb2Zmc2V0KSA6IG9mZnNldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGdlb2dyYXBoaWNhbCBib3VuZHMgdGhlIG1hcCBpcyBjb25zdHJhaW5lZCB0bywgb3IgYG51bGxgIGlmIG5vbmUgc2V0LlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IHtAbGluayBMbmdMYXRCb3VuZHN9LlxuICAgICAqL1xuICAgIGdldE1heEJvdW5kcygpOiA/TG5nTGF0Qm91bmRzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWF4Qm91bmRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgY29uc3RyYWludHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc30gYm91bmRzIEEge0BsaW5rIExuZ0xhdEJvdW5kc30gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5ldyBnZW9ncmFwaGljIGJvdW5kYXJpZXMgb2YgdGhlIG1hcC5cbiAgICAgKi9cbiAgICBzZXRNYXhCb3VuZHMoYm91bmRzOiA/TG5nTGF0Qm91bmRzKSB7XG4gICAgICAgIHRoaXMubWF4Qm91bmRzID0gYm91bmRzO1xuXG4gICAgICAgIHRoaXMubWluTGF0ID0gLU1BWF9NRVJDQVRPUl9MQVRJVFVERTtcbiAgICAgICAgdGhpcy5tYXhMYXQgPSBNQVhfTUVSQ0FUT1JfTEFUSVRVREU7XG4gICAgICAgIHRoaXMubWluTG5nID0gLTE4MDtcbiAgICAgICAgdGhpcy5tYXhMbmcgPSAxODA7XG5cbiAgICAgICAgaWYgKGJvdW5kcykge1xuICAgICAgICAgICAgdGhpcy5taW5MYXQgPSBib3VuZHMuZ2V0U291dGgoKTtcbiAgICAgICAgICAgIHRoaXMubWF4TGF0ID0gYm91bmRzLmdldE5vcnRoKCk7XG4gICAgICAgICAgICB0aGlzLm1pbkxuZyA9IGJvdW5kcy5nZXRXZXN0KCk7XG4gICAgICAgICAgICB0aGlzLm1heExuZyA9IGJvdW5kcy5nZXRFYXN0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXhMbmcgPCB0aGlzLm1pbkxuZykgdGhpcy5tYXhMbmcgKz0gMzYwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53b3JsZE1pblggPSBtZXJjYXRvclhmcm9tTG5nKHRoaXMubWluTG5nKSAqIHRoaXMudGlsZVNpemU7XG4gICAgICAgIHRoaXMud29ybGRNYXhYID0gbWVyY2F0b3JYZnJvbUxuZyh0aGlzLm1heExuZykgKiB0aGlzLnRpbGVTaXplO1xuICAgICAgICB0aGlzLndvcmxkTWluWSA9IG1lcmNhdG9yWWZyb21MYXQodGhpcy5tYXhMYXQpICogdGhpcy50aWxlU2l6ZTtcbiAgICAgICAgdGhpcy53b3JsZE1heFkgPSBtZXJjYXRvcllmcm9tTGF0KHRoaXMubWluTGF0KSAqIHRoaXMudGlsZVNpemU7XG5cbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlUG9zTWF0cml4KHVud3JhcHBlZFRpbGVJRDogVW53cmFwcGVkVGlsZUlELCB3b3JsZFNpemU6IG51bWJlcik6IEZsb2F0NjRBcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb24uY3JlYXRlVGlsZU1hdHJpeCh0aGlzLCB3b3JsZFNpemUsIHVud3JhcHBlZFRpbGVJRCk7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlRGlzdGFuY2VUaWxlRGF0YSh1bndyYXBwZWRUaWxlSUQ6IFVud3JhcHBlZFRpbGVJRCk6IEZlYXR1cmVEaXN0YW5jZURhdGEge1xuICAgICAgICBjb25zdCBkaXN0YW5jZURhdGFLZXkgPSB1bndyYXBwZWRUaWxlSUQua2V5O1xuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuX2Rpc3RhbmNlVGlsZURhdGFDYWNoZTtcbiAgICAgICAgaWYgKGNhY2hlW2Rpc3RhbmNlRGF0YUtleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtkaXN0YW5jZURhdGFLZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9DYWxjdWxhdGUgdGhlIG9mZnNldCBvZiB0aGUgdGlsZVxuICAgICAgICBjb25zdCBjYW5vbmljYWwgPSB1bndyYXBwZWRUaWxlSUQuY2Fub25pY2FsO1xuICAgICAgICBjb25zdCB3aW5kb3dTY2FsZUZhY3RvciA9IDEgLyB0aGlzLmhlaWdodDtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLmNhbWVyYVdvcmxkU2l6ZSAvIHRoaXMuem9vbVNjYWxlKGNhbm9uaWNhbC56KTtcbiAgICAgICAgY29uc3QgdW53cmFwcGVkWCA9IGNhbm9uaWNhbC54ICsgTWF0aC5wb3coMiwgY2Fub25pY2FsLnopICogdW53cmFwcGVkVGlsZUlELndyYXA7XG4gICAgICAgIGNvbnN0IHRYID0gdW53cmFwcGVkWCAqIHNjYWxlO1xuICAgICAgICBjb25zdCB0WSA9IGNhbm9uaWNhbC55ICogc2NhbGU7XG5cbiAgICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5wb2ludDtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGJlYXJpbmcgdmVjdG9yIGJ5IHJvdGF0aW5nIHVuaXQgdmVjdG9yIFswLCAtMV0gY2xvY2t3aXNlXG4gICAgICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5hbmdsZTtcbiAgICAgICAgY29uc3QgYlggPSBNYXRoLnNpbigtYW5nbGUpO1xuICAgICAgICBjb25zdCBiWSA9IC1NYXRoLmNvcygtYW5nbGUpO1xuXG4gICAgICAgIGNvbnN0IGNYID0gKGNlbnRlci54IC0gdFgpICogd2luZG93U2NhbGVGYWN0b3I7XG4gICAgICAgIGNvbnN0IGNZID0gKGNlbnRlci55IC0gdFkpICogd2luZG93U2NhbGVGYWN0b3I7XG4gICAgICAgIGNhY2hlW2Rpc3RhbmNlRGF0YUtleV0gPSB7XG4gICAgICAgICAgICBiZWFyaW5nOiBbYlgsIGJZXSxcbiAgICAgICAgICAgIGNlbnRlcjogW2NYLCBjWV0sXG4gICAgICAgICAgICBzY2FsZTogKHNjYWxlIC8gRVhURU5UKSAqIHdpbmRvd1NjYWxlRmFjdG9yXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGNhY2hlW2Rpc3RhbmNlRGF0YUtleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBmb2dUaWxlTWF0cml4IHRoYXQsIGdpdmVuIGEgdGlsZSBjb29yZGluYXRlLCBjYW4gYmUgdXNlZCB0b1xuICAgICAqIGNhbGN1bGF0ZSBpdHMgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGNhbWVyYSBpbiB1bml0cyBvZiBwaXhlbHMgZGl2aWRlZFxuICAgICAqIGJ5IHRoZSBtYXAgaGVpZ2h0LiBVc2VkIHdpdGggZm9nIGZvciBjb25zaXN0ZW50IGNvbXB1dGF0aW9uIG9mIGRpc3RhbmNlXG4gICAgICogZnJvbSBjYW1lcmEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Vud3JhcHBlZFRpbGVJRH0gdW53cmFwcGVkVGlsZUlEO1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY2FsY3VsYXRlRm9nVGlsZU1hdHJpeCh1bndyYXBwZWRUaWxlSUQ6IFVud3JhcHBlZFRpbGVJRCk6IEZsb2F0MzJBcnJheSB7XG4gICAgICAgIGNvbnN0IGZvZ1RpbGVNYXRyaXhLZXkgPSB1bndyYXBwZWRUaWxlSUQua2V5O1xuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuX2ZvZ1RpbGVNYXRyaXhDYWNoZTtcbiAgICAgICAgaWYgKGNhY2hlW2ZvZ1RpbGVNYXRyaXhLZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVbZm9nVGlsZU1hdHJpeEtleV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NNYXRyaXggPSB0aGlzLnByb2plY3Rpb24uY3JlYXRlVGlsZU1hdHJpeCh0aGlzLCB0aGlzLmNhbWVyYVdvcmxkU2l6ZSwgdW53cmFwcGVkVGlsZUlEKTtcbiAgICAgICAgbWF0NC5tdWx0aXBseShwb3NNYXRyaXgsIHRoaXMud29ybGRUb0ZvZ01hdHJpeCwgcG9zTWF0cml4KTtcblxuICAgICAgICBjYWNoZVtmb2dUaWxlTWF0cml4S2V5XSA9IG5ldyBGbG9hdDMyQXJyYXkocG9zTWF0cml4KTtcbiAgICAgICAgcmV0dXJuIGNhY2hlW2ZvZ1RpbGVNYXRyaXhLZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSB0aGUgcHJvak1hdHJpeCB0aGF0LCBnaXZlbiBhIHRpbGUgY29vcmRpbmF0ZSwgd291bGQgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSB0aWxlIG9uIHRoZSBzY3JlZW4uXG4gICAgICogQHBhcmFtIHtVbndyYXBwZWRUaWxlSUR9IHVud3JhcHBlZFRpbGVJRDtcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNhbGN1bGF0ZVByb2pNYXRyaXgodW53cmFwcGVkVGlsZUlEOiBVbndyYXBwZWRUaWxlSUQsIGFsaWduZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IEZsb2F0MzJBcnJheSB7XG4gICAgICAgIGNvbnN0IHByb2pNYXRyaXhLZXkgPSB1bndyYXBwZWRUaWxlSUQua2V5O1xuICAgICAgICBjb25zdCBjYWNoZSA9IGFsaWduZWQgPyB0aGlzLl9hbGlnbmVkUHJvak1hdHJpeENhY2hlIDogdGhpcy5fcHJvak1hdHJpeENhY2hlO1xuICAgICAgICBpZiAoY2FjaGVbcHJvak1hdHJpeEtleV0pIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtwcm9qTWF0cml4S2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvc01hdHJpeCA9IHRoaXMuY2FsY3VsYXRlUG9zTWF0cml4KHVud3JhcHBlZFRpbGVJRCwgdGhpcy53b3JsZFNpemUpO1xuICAgICAgICBjb25zdCBwcm9qTWF0cml4ID0gdGhpcy5wcm9qZWN0aW9uLmlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZSA/XG4gICAgICAgICAgICB0aGlzLm1lcmNhdG9yTWF0cml4IDogKGFsaWduZWQgPyB0aGlzLmFsaWduZWRQcm9qTWF0cml4IDogdGhpcy5wcm9qTWF0cml4KTtcbiAgICAgICAgbWF0NC5tdWx0aXBseShwb3NNYXRyaXgsIHByb2pNYXRyaXgsIHBvc01hdHJpeCk7XG5cbiAgICAgICAgY2FjaGVbcHJvak1hdHJpeEtleV0gPSBuZXcgRmxvYXQzMkFycmF5KHBvc01hdHJpeCk7XG4gICAgICAgIHJldHVybiBjYWNoZVtwcm9qTWF0cml4S2V5XTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVQaXhlbHNUb1RpbGVVbml0c01hdHJpeCh0aWxlOiBUaWxlKTogRmxvYXQzMkFycmF5IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGlsZS50aWxlSUQua2V5O1xuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuX3BpeGVsc1RvVGlsZVVuaXRzQ2FjaGU7XG4gICAgICAgIGlmIChjYWNoZVtrZXldKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IGdldFBpeGVsc1RvVGlsZVVuaXRzTWF0cml4KHRpbGUsIHRoaXMpO1xuICAgICAgICBjYWNoZVtrZXldID0gbWF0cml4O1xuICAgICAgICByZXR1cm4gY2FjaGVba2V5XTtcbiAgICB9XG5cbiAgICBjdXN0b21MYXllck1hdHJpeCgpOiBBcnJheTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVyY2F0b3JNYXRyaXguc2xpY2UoKTtcbiAgICB9XG5cbiAgICByZWNlbnRlck9uVGVycmFpbigpIHtcblxuICAgICAgICBpZiAoIXRoaXMuX2VsZXZhdGlvbiB8fCB0aGlzLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJylcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBlbGV2YXRpb246IEVsZXZhdGlvbiA9IHRoaXMuX2VsZXZhdGlvbjtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FtZXJhU3RhdGUoKTtcblxuICAgICAgICAvLyBDYXN0IGEgcmF5IHRvd2FyZHMgdGhlIHNlYSBsZXZlbCBhbmQgZmluZCB0aGUgaW50ZXJzZWN0aW9uIHBvaW50IHdpdGggdGhlIHRlcnJhaW4uXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gdXNlIGEgY2FtZXJhIHBvc2l0aW9uIHRoYXQgZXhpc3RzIGluIHRoZSBzYW1lIGNvb3JkaW5hdGUgc3BhY2UgYXMgdGhlIGRhdGEuXG4gICAgICAgIC8vIFRoZSBkZWZhdWx0IGNhbWVyYSBwb3NpdGlvbiBtaWdodCBoYXZlIGJlZW4gY29tcGVuc2F0ZWQgYnkgdGhlIGFjdGl2ZSBwcm9qZWN0aW9uIG1vZGVsLlxuICAgICAgICBjb25zdCBtZXJjUGl4ZWxzUGVyTWV0ZXIgPSBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgdGhpcy5fY2VudGVyLmxhdCkgKiB0aGlzLndvcmxkU2l6ZTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9jb21wdXRlQ2FtZXJhUG9zaXRpb24obWVyY1BpeGVsc1Blck1ldGVyKTtcbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5fY2FtZXJhLmZvcndhcmQoKTtcblxuICAgICAgICAvLyBUaGUgcmF5Y2FzdCBmdW5jdGlvbiBleHBlY3RzIHotY29tcG9uZW50IHRvIGJlIGluIG1ldGVyc1xuICAgICAgICBjb25zdCBtZXRlcnNUb01lcmMgPSBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMS4wLCB0aGlzLl9jZW50ZXIubGF0KTtcbiAgICAgICAgc3RhcnRbMl0gLz0gbWV0ZXJzVG9NZXJjO1xuICAgICAgICBkaXJbMl0gLz0gbWV0ZXJzVG9NZXJjO1xuICAgICAgICB2ZWMzLm5vcm1hbGl6ZShkaXIsIGRpcik7XG5cbiAgICAgICAgY29uc3QgdCA9IGVsZXZhdGlvbi5yYXljYXN0KHN0YXJ0LCBkaXIsIGVsZXZhdGlvbi5leGFnZ2VyYXRpb24oKSk7XG5cbiAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gdmVjMy5zY2FsZUFuZEFkZChbXSwgc3RhcnQsIGRpciwgdCk7XG4gICAgICAgICAgICBjb25zdCBuZXdDZW50ZXIgPSBuZXcgTWVyY2F0b3JDb29yZGluYXRlKHBvaW50WzBdLCBwb2ludFsxXSwgbWVyY2F0b3JaZnJvbUFsdGl0dWRlKHBvaW50WzJdLCBsYXRGcm9tTWVyY2F0b3JZKHBvaW50WzFdKSkpO1xuXG4gICAgICAgICAgICBjb25zdCBjYW1Ub05ldyA9IFtuZXdDZW50ZXIueCAtIHN0YXJ0WzBdLCBuZXdDZW50ZXIueSAtIHN0YXJ0WzFdLCBuZXdDZW50ZXIueiAtIHN0YXJ0WzJdICogbWV0ZXJzVG9NZXJjXTtcbiAgICAgICAgICAgIGNvbnN0IG1heEFsdGl0dWRlID0gKG5ld0NlbnRlci56ICsgdmVjMy5sZW5ndGgoY2FtVG9OZXcpKSAqIHRoaXMuX3Byb2plY3Rpb25TY2FsZXI7XG4gICAgICAgICAgICB0aGlzLl9zZWFMZXZlbFpvb20gPSB0aGlzLl96b29tRnJvbU1lcmNhdG9yWihtYXhBbHRpdHVkZSk7XG5cbiAgICAgICAgICAgIC8vIENhbWVyYSB6b29tIGhhcyB0byBiZSB1cGRhdGVkIGFzIHRoZSBvcmJpdCBkaXN0YW5jZSBtaWdodCBoYXZlIGNoYW5nZWRcbiAgICAgICAgICAgIHRoaXMuX2NlbnRlckFsdGl0dWRlID0gbmV3Q2VudGVyLnRvQWx0aXR1ZGUoKTtcbiAgICAgICAgICAgIHRoaXMuX2NlbnRlciA9IHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKG5ld0NlbnRlcik7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVab29tRnJvbUVsZXZhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jb25zdHJhaW5DYW1lcmFBbHRpdHVkZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9lbGV2YXRpb24pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZWxldmF0aW9uOiBFbGV2YXRpb24gPSB0aGlzLl9lbGV2YXRpb247XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNhbWVyYVN0YXRlKCk7XG5cbiAgICAgICAgLy8gRmluZCB1bmNvbXBlbnNhdGVkIGNhbWVyYSBwb3NpdGlvbiBmb3IgZWxldmF0aW9uIHNhbXBsaW5nLlxuICAgICAgICAvLyBUaGUgZGVmYXVsdCBjYW1lcmEgcG9zaXRpb24gbWlnaHQgaGF2ZSBiZWVuIGNvbXBlbnNhdGVkIGJ5IHRoZSBhY3RpdmUgcHJvamVjdGlvbiBtb2RlbC5cbiAgICAgICAgY29uc3QgbWVyY1BpeGVsc1Blck1ldGVyID0gbWVyY2F0b3JaZnJvbUFsdGl0dWRlKDEsIHRoaXMuX2NlbnRlci5sYXQpICogdGhpcy53b3JsZFNpemU7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuX2NvbXB1dGVDYW1lcmFQb3NpdGlvbihtZXJjUGl4ZWxzUGVyTWV0ZXIpO1xuXG4gICAgICAgIGNvbnN0IGVsZXZhdGlvbkF0Q2FtZXJhID0gZWxldmF0aW9uLmdldEF0UG9pbnRPclplcm8obmV3IE1lcmNhdG9yQ29vcmRpbmF0ZSguLi5wb3MpKTtcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gdGhpcy5fbWluaW11bUhlaWdodE92ZXJUZXJyYWluKCkgKiBNYXRoLmNvcyhkZWdUb1JhZCh0aGlzLl9tYXhQaXRjaCkpO1xuICAgICAgICBjb25zdCB0ZXJyYWluRWxldmF0aW9uID0gdGhpcy5waXhlbHNQZXJNZXRlciAvIHRoaXMud29ybGRTaXplICogZWxldmF0aW9uQXRDYW1lcmE7XG4gICAgICAgIGNvbnN0IGNhbWVyYUhlaWdodCA9IHRoaXMuX2NhbWVyYS5wb3NpdGlvblsyXSAtIHRlcnJhaW5FbGV2YXRpb247XG5cbiAgICAgICAgaWYgKGNhbWVyYUhlaWdodCA8IG1pbkhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5sb2NhdGlvbkNvb3JkaW5hdGUodGhpcy5fY2VudGVyLCB0aGlzLl9jZW50ZXJBbHRpdHVkZSk7XG4gICAgICAgICAgICBjb25zdCBjYW1lcmFUb0NlbnRlciA9IFtjZW50ZXIueCAtIHBvc1swXSwgY2VudGVyLnkgLSBwb3NbMV0sIGNlbnRlci56IC0gcG9zWzJdXTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZEaXN0VG9DYW1lcmEgPSB2ZWMzLmxlbmd0aChjYW1lcmFUb0NlbnRlcik7XG5cbiAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgY2FtZXJhIHZlY3RvciBzbyB0aGF0IHRoZSBjYW1lcmEgaXMgcGxhY2VkIGFib3ZlIHRoZSB0ZXJyYWluLlxuICAgICAgICAgICAgLy8gRGlzdGFuY2UgYmV0d2VlbiB0aGUgY2FtZXJhIGFuZCB0aGUgY2VudGVyIHBvaW50IGlzIGtlcHQgY29uc3RhbnQuXG4gICAgICAgICAgICBjYW1lcmFUb0NlbnRlclsyXSAtPSAobWluSGVpZ2h0IC0gY2FtZXJhSGVpZ2h0KSAvIHRoaXMuX3Byb2plY3Rpb25TY2FsZXI7XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0Rpc3RUb0NhbWVyYSA9IHZlYzMubGVuZ3RoKGNhbWVyYVRvQ2VudGVyKTtcbiAgICAgICAgICAgIGlmIChuZXdEaXN0VG9DYW1lcmEgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICB2ZWMzLnNjYWxlKGNhbWVyYVRvQ2VudGVyLCBjYW1lcmFUb0NlbnRlciwgcHJldkRpc3RUb0NhbWVyYSAvIG5ld0Rpc3RUb0NhbWVyYSAqIHRoaXMuX3Byb2plY3Rpb25TY2FsZXIpO1xuICAgICAgICAgICAgdGhpcy5fY2FtZXJhLnBvc2l0aW9uID0gW2NlbnRlci54IC0gY2FtZXJhVG9DZW50ZXJbMF0sIGNlbnRlci55IC0gY2FtZXJhVG9DZW50ZXJbMV0sIGNlbnRlci56ICogdGhpcy5fcHJvamVjdGlvblNjYWxlciAtIGNhbWVyYVRvQ2VudGVyWzJdXTtcblxuICAgICAgICAgICAgdGhpcy5fY2FtZXJhLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb25Gcm9tRnJhbWUoY2FtZXJhVG9DZW50ZXIsIHRoaXMuX2NhbWVyYS51cCgpKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlRnJvbUNhbWVyYSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NvbnN0cmFpbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNlbnRlciB8fCAhdGhpcy53aWR0aCB8fCAhdGhpcy5oZWlnaHQgfHwgdGhpcy5fY29uc3RyYWluaW5nKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fY29uc3RyYWluaW5nID0gdHJ1ZTtcblxuICAgICAgICAvLyBhbHRlcm5hdGUgY29uc3RyYWluaW5nIGZvciBub24tTWVyY2F0b3IgcHJvamVjdGlvbnNcbiAgICAgICAgaWYgKHRoaXMucHJvamVjdGlvbi5pc1JlcHJvamVjdGVkSW5UaWxlU3BhY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMuY2VudGVyO1xuICAgICAgICAgICAgY2VudGVyLmxhdCA9IGNsYW1wKGNlbnRlci5sYXQsIHRoaXMubWluTGF0LCB0aGlzLm1heExhdCk7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXhCb3VuZHMgfHwgIXRoaXMucmVuZGVyV29ybGRDb3BpZXMpIGNlbnRlci5sbmcgPSBjbGFtcChjZW50ZXIubG5nLCB0aGlzLm1pbkxuZywgdGhpcy5tYXhMbmcpO1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSBjZW50ZXI7XG4gICAgICAgICAgICB0aGlzLl9jb25zdHJhaW5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVubW9kaWZpZWQgPSB0aGlzLl91bm1vZGlmaWVkO1xuICAgICAgICBjb25zdCB7eCwgeX0gPSB0aGlzLnBvaW50O1xuICAgICAgICBsZXQgcyA9IDA7XG4gICAgICAgIGxldCB4MiA9IHg7XG4gICAgICAgIGxldCB5MiA9IHk7XG4gICAgICAgIGNvbnN0IHcyID0gdGhpcy53aWR0aCAvIDI7XG4gICAgICAgIGNvbnN0IGgyID0gdGhpcy5oZWlnaHQgLyAyO1xuXG4gICAgICAgIGNvbnN0IG1pblkgPSB0aGlzLndvcmxkTWluWSAqIHRoaXMuc2NhbGU7XG4gICAgICAgIGNvbnN0IG1heFkgPSB0aGlzLndvcmxkTWF4WSAqIHRoaXMuc2NhbGU7XG4gICAgICAgIGlmICh5IC0gaDIgPCBtaW5ZKSB5MiA9IG1pblkgKyBoMjtcbiAgICAgICAgaWYgKHkgKyBoMiA+IG1heFkpIHkyID0gbWF4WSAtIGgyO1xuICAgICAgICBpZiAobWF4WSAtIG1pblkgPCB0aGlzLmhlaWdodCkge1xuICAgICAgICAgICAgcyA9IE1hdGgubWF4KHMsIHRoaXMuaGVpZ2h0IC8gKG1heFkgLSBtaW5ZKSk7XG4gICAgICAgICAgICB5MiA9IChtYXhZICsgbWluWSkgLyAyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF4Qm91bmRzIHx8ICF0aGlzLl9yZW5kZXJXb3JsZENvcGllcyB8fCAhdGhpcy5wcm9qZWN0aW9uLndyYXApIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblggPSB0aGlzLndvcmxkTWluWCAqIHRoaXMuc2NhbGU7XG4gICAgICAgICAgICBjb25zdCBtYXhYID0gdGhpcy53b3JsZE1heFggKiB0aGlzLnNjYWxlO1xuXG4gICAgICAgICAgICAvLyBUcmFuc2xhdGUgdG8gcG9zaXRpdmUgcG9zaXRpb25zIHdpdGggdGhlIG1hcCBjZW50ZXIgaW4gdGhlIGNlbnRlciBwb3NpdGlvbi5cbiAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBtYXAgc25hcHMgdG8gdGhlIGNvcnJlY3QgZWRnZS5cbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gdGhpcy53b3JsZFNpemUgLyAyIC0gKG1pblggKyBtYXhYKSAvIDI7XG4gICAgICAgICAgICB4MiA9ICh4ICsgc2hpZnQgKyB0aGlzLndvcmxkU2l6ZSkgJSB0aGlzLndvcmxkU2l6ZSAtIHNoaWZ0O1xuXG4gICAgICAgICAgICBpZiAoeDIgLSB3MiA8IG1pblgpIHgyID0gbWluWCArIHcyO1xuICAgICAgICAgICAgaWYgKHgyICsgdzIgPiBtYXhYKSB4MiA9IG1heFggLSB3MjtcbiAgICAgICAgICAgIGlmIChtYXhYIC0gbWluWCA8IHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgICAgICBzID0gTWF0aC5tYXgocywgdGhpcy53aWR0aCAvIChtYXhYIC0gbWluWCkpO1xuICAgICAgICAgICAgICAgIHgyID0gKG1heFggKyBtaW5YKSAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoeDIgIT09IHggfHwgeTIgIT09IHkpIHsgLy8gcGFuIHRoZSBtYXAgdG8gZml0IHRoZSByYW5nZVxuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLnVucHJvamVjdChuZXcgUG9pbnQoeDIsIHkyKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMpIHsgLy8gc2NhbGUgdGhlIG1hcCB0byBmaXQgdGhlIHJhbmdlXG4gICAgICAgICAgICB0aGlzLnpvb20gKz0gdGhpcy5zY2FsZVpvb20ocyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb25zdHJhaW5DYW1lcmFBbHRpdHVkZSgpO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gdW5tb2RpZmllZDtcbiAgICAgICAgdGhpcy5fY29uc3RyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWluaW11bSB6b29tIGF0IHdoaWNoIGB0aGlzLndpZHRoYCBjYW4gZml0IG1heCBsb25naXR1ZGUgcmFuZ2VcbiAgICAgKiBhbmQgYHRoaXMuaGVpZ2h0YCBjYW4gZml0IG1heCBsYXRpdHVkZSByYW5nZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSB6b29tIHZhbHVlLlxuICAgICAqL1xuICAgIF9taW5ab29tRm9yQm91bmRzKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBtaW5ab29tID0gTWF0aC5tYXgoMCwgdGhpcy5zY2FsZVpvb20odGhpcy5oZWlnaHQgLyAodGhpcy53b3JsZE1heFkgLSB0aGlzLndvcmxkTWluWSkpKTtcbiAgICAgICAgaWYgKHRoaXMubWF4Qm91bmRzKSB7XG4gICAgICAgICAgICBtaW5ab29tID0gTWF0aC5tYXgobWluWm9vbSwgdGhpcy5zY2FsZVpvb20odGhpcy53aWR0aCAvICh0aGlzLndvcmxkTWF4WCAtIHRoaXMud29ybGRNaW5YKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW5ab29tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZGlzdGFuY2Ugb2YgdGhlIGNhbWVyYSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGJvdW5kcywgc3VjaCB0aGF0XG4gICAgICogYHRoaXMud2lkdGhgIGNhbiBmaXQgbWF4IGxvbmdpdHVkZSByYW5nZSBhbmQgYHRoaXMuaGVpZ2h0YCBjYW4gZml0IG1heCBsYXRpdHVkZSByYW5nZS5cbiAgICAgKiBJbiBtZXJjYXRvciB1bml0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBtZXJjYXRvciB6IGNvb3JkaW5hdGUuXG4gICAgICovXG4gICAgX21heENhbWVyYUJvdW5kc0Rpc3RhbmNlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXJjYXRvclpmcm9tWm9vbSh0aGlzLl9taW5ab29tRm9yQm91bmRzKCkpO1xuICAgIH1cblxuICAgIF9jYWxjTWF0cmljZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5oZWlnaHQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmNlbnRlck9mZnNldDtcblxuICAgICAgICAvLyBaLWF4aXMgdXNlcyBwaXhlbCBjb29yZGluYXRlcyB3aGVuIGdsb2JlIG1vZGUgaXMgZW5hYmxlZFxuICAgICAgICBjb25zdCBwaXhlbHNQZXJNZXRlciA9IHRoaXMucGl4ZWxzUGVyTWV0ZXI7XG5cbiAgICAgICAgaWYgKHRoaXMucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXJTY2FsZSA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCB0aGlzLmNlbnRlci5sYXQpICogdGhpcy53b3JsZFNpemU7XG4gICAgICAgICAgICBjb25zdCByZWZTY2FsZSA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCBHTE9CRV9TQ0FMRV9NQVRDSF9MQVRJVFVERSkgKiB0aGlzLndvcmxkU2l6ZTtcbiAgICAgICAgICAgIHRoaXMuX21lcmNhdG9yU2NhbGVSYXRpbyA9IGNlbnRlclNjYWxlIC8gcmVmU2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm9qZWN0aW9uVCA9IGdldFByb2plY3Rpb25JbnRlcnBvbGF0aW9uVCh0aGlzLnByb2plY3Rpb24sIHRoaXMuem9vbSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDEwMjQpO1xuICAgICAgICB0aGlzLl9wcm9qZWN0aW9uU2NhbGVyID0gdGhpcy5wcm9qZWN0aW9uLnBpeGVsU3BhY2VDb252ZXJzaW9uKHRoaXMuY2VudGVyLmxhdCwgdGhpcy53b3JsZFNpemUsIHByb2plY3Rpb25UKTtcblxuICAgICAgICB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgPSB0aGlzLmdldENhbWVyYVRvQ2VudGVyRGlzdGFuY2UodGhpcy5wcm9qZWN0aW9uKTtcblxuICAgICAgICB0aGlzLl91cGRhdGVDYW1lcmFTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMuX2ZhclogPSB0aGlzLnByb2plY3Rpb24uZmFydGhlc3RQaXhlbERpc3RhbmNlKHRoaXMpO1xuXG4gICAgICAgIC8vIFRoZSBsYXJnZXIgdGhlIHZhbHVlIG9mIG5lYXJaIGlzXG4gICAgICAgIC8vIC0gdGhlIG1vcmUgZGVwdGggcHJlY2lzaW9uIGlzIGF2YWlsYWJsZSBmb3IgZmVhdHVyZXMgKGdvb2QpXG4gICAgICAgIC8vIC0gY2xpcHBpbmcgc3RhcnRzIGFwcGVhcmluZyBzb29uZXIgd2hlbiB0aGUgY2FtZXJhIGlzIGNsb3NlIHRvIDNkIGZlYXR1cmVzIChiYWQpXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNtYWxsZXIgdmFsdWVzIHdvcmtlZCB3ZWxsIGZvciBtYXBib3gtZ2wtanMgYnV0IGRlY2tnbCB3YXMgZW5jb3VudGVyaW5nIHByZWNpc2lvbiBpc3N1ZXNcbiAgICAgICAgLy8gd2hlbiByZW5kZXJpbmcgaXQncyBsYXllcnMgdXNpbmcgY3VzdG9tIGxheWVycy4gVGhpcyB2YWx1ZSB3YXMgZXhwZXJpbWVudGFsbHkgY2hvc2VuIGFuZFxuICAgICAgICAvLyBzZWVtcyB0byBzb2x2ZSB6LWZpZ2h0aW5nIGlzc3VlcyBpbiBkZWNrZ2wgd2hpbGUgbm90IGNsaXBwaW5nIGJ1aWxkaW5ncyB0b28gY2xvc2UgdG8gdGhlIGNhbWVyYS5cbiAgICAgICAgdGhpcy5fbmVhclogPSB0aGlzLmhlaWdodCAvIDUwO1xuXG4gICAgICAgIGNvbnN0IHpVbml0ID0gdGhpcy5wcm9qZWN0aW9uLnpBeGlzVW5pdCA9PT0gXCJtZXRlcnNcIiA/IHBpeGVsc1Blck1ldGVyIDogMS4wO1xuICAgICAgICBjb25zdCB3b3JsZFRvQ2FtZXJhID0gdGhpcy5fY2FtZXJhLmdldFdvcmxkVG9DYW1lcmEodGhpcy53b3JsZFNpemUsIHpVbml0KTtcbiAgICAgICAgY29uc3QgY2FtZXJhVG9DbGlwID0gdGhpcy5fY2FtZXJhLmdldENhbWVyYVRvQ2xpcFBlcnNwZWN0aXZlKHRoaXMuX2ZvdiwgdGhpcy53aWR0aCAvIHRoaXMuaGVpZ2h0LCB0aGlzLl9uZWFyWiwgdGhpcy5fZmFyWik7XG5cbiAgICAgICAgLy8gQXBwbHkgY2VudGVyIG9mIHBlcnNwZWN0aXZlIG9mZnNldFxuICAgICAgICBjYW1lcmFUb0NsaXBbOF0gPSAtb2Zmc2V0LnggKiAyIC8gdGhpcy53aWR0aDtcbiAgICAgICAgY2FtZXJhVG9DbGlwWzldID0gb2Zmc2V0LnkgKiAyIC8gdGhpcy5oZWlnaHQ7XG5cbiAgICAgICAgbGV0IG0gPSBtYXQ0Lm11bChbXSwgY2FtZXJhVG9DbGlwLCB3b3JsZFRvQ2FtZXJhKTtcblxuICAgICAgICBpZiAodGhpcy5wcm9qZWN0aW9uLmlzUmVwcm9qZWN0ZWRJblRpbGVTcGFjZSkge1xuICAgICAgICAgICAgLy8gUHJvamVjdGlvbnMgdW5kaXN0b3J0IGFzIHlvdSB6b29tIGluIChzaGVhciwgc2NhbGUsIHJvdGF0ZSkuXG4gICAgICAgICAgICAvLyBBcHBseSB0aGUgdW5kaXN0b3J0aW9uIGFyb3VuZCB0aGUgY2VudGVyIG9mIHRoZSBtYXAuXG4gICAgICAgICAgICBjb25zdCBtYyA9IHRoaXMubG9jYXRpb25Db29yZGluYXRlKHRoaXMuY2VudGVyKTtcbiAgICAgICAgICAgIGNvbnN0IGFkanVzdG1lbnRzID0gbWF0NC5pZGVudGl0eShbXSk7XG4gICAgICAgICAgICBtYXQ0LnRyYW5zbGF0ZShhZGp1c3RtZW50cywgYWRqdXN0bWVudHMsIFttYy54ICogdGhpcy53b3JsZFNpemUsIG1jLnkgKiB0aGlzLndvcmxkU2l6ZSwgMF0pO1xuICAgICAgICAgICAgbWF0NC5tdWx0aXBseShhZGp1c3RtZW50cywgYWRqdXN0bWVudHMsIGdldFByb2plY3Rpb25BZGp1c3RtZW50cyh0aGlzKSk7XG4gICAgICAgICAgICBtYXQ0LnRyYW5zbGF0ZShhZGp1c3RtZW50cywgYWRqdXN0bWVudHMsIFstbWMueCAqIHRoaXMud29ybGRTaXplLCAtbWMueSAqIHRoaXMud29ybGRTaXplLCAwXSk7XG4gICAgICAgICAgICBtYXQ0Lm11bHRpcGx5KG0sIG0sIGFkanVzdG1lbnRzKTtcbiAgICAgICAgICAgIHRoaXMuaW52ZXJzZUFkanVzdG1lbnRNYXRyaXggPSBnZXRQcm9qZWN0aW9uQWRqdXN0bWVudEludmVydGVkKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbnZlcnNlQWRqdXN0bWVudE1hdHJpeCA9IFsxLCAwLCAwLCAxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBtZXJjYXRvck1hdHJpeCBjYW4gYmUgdXNlZCB0byB0cmFuc2Zvcm0gcG9pbnRzIGZyb20gbWVyY2F0b3IgY29vcmRpbmF0ZXNcbiAgICAgICAgLy8gKFswLCAwXSBudywgWzEsIDFdIHNlKSB0byBHTCBjb29yZGluYXRlcy5cbiAgICAgICAgdGhpcy5tZXJjYXRvck1hdHJpeCA9IG1hdDQuc2NhbGUoW10sIG0sIFt0aGlzLndvcmxkU2l6ZSwgdGhpcy53b3JsZFNpemUsIHRoaXMud29ybGRTaXplIC8gcGl4ZWxzUGVyTWV0ZXIsIDEuMF0pO1xuXG4gICAgICAgIHRoaXMucHJvak1hdHJpeCA9IG07XG5cbiAgICAgICAgLy8gRm9yIHRpbGUgY292ZXIgY2FsY3VsYXRpb24sIHVzZSBpbnZlcnRlZCBvZiBiYXNlIChub24gZWxldmF0ZWQpIG1hdHJpeFxuICAgICAgICAvLyBhcyB0aWxlIGVsZXZhdGlvbnMgYXJlIGluIHRpbGUgY29vcmRpbmF0ZXMgYW5kIHJlbGF0aXZlIHRvIGNlbnRlciBlbGV2YXRpb24uXG4gICAgICAgIHRoaXMuaW52UHJvak1hdHJpeCA9IG1hdDQuaW52ZXJ0KG5ldyBGbG9hdDY0QXJyYXkoMTYpLCB0aGlzLnByb2pNYXRyaXgpO1xuXG4gICAgICAgIGNvbnN0IGNsaXBUb0NhbWVyYSA9IG1hdDQuaW52ZXJ0KFtdLCBjYW1lcmFUb0NsaXApO1xuICAgICAgICB0aGlzLmZydXN0dW1Db3JuZXJzID0gRnJ1c3R1bUNvcm5lcnMuZnJvbUludlByb2plY3Rpb25NYXRyaXgoY2xpcFRvQ2FtZXJhLCB0aGlzLmhvcml6b25MaW5lRnJvbVRvcCgpLCB0aGlzLmhlaWdodCk7XG5cbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICBtYXQ0LmlkZW50aXR5KHZpZXcpO1xuICAgICAgICBtYXQ0LnNjYWxlKHZpZXcsIHZpZXcsIFsxLCAtMSwgMV0pO1xuICAgICAgICBtYXQ0LnJvdGF0ZVgodmlldywgdmlldywgdGhpcy5fcGl0Y2gpO1xuICAgICAgICBtYXQ0LnJvdGF0ZVoodmlldywgdmlldywgdGhpcy5hbmdsZSk7XG5cbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IG1hdDQucGVyc3BlY3RpdmUobmV3IEZsb2F0MzJBcnJheSgxNiksIHRoaXMuX2ZvdiwgdGhpcy53aWR0aCAvIHRoaXMuaGVpZ2h0LCB0aGlzLl9uZWFyWiwgdGhpcy5fZmFyWik7XG4gICAgICAgIC8vIFRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgdGhlIHNreWJveCBuZWVkcyB0byBiZSBzaGlmdGVkIGRvd24gYnkgdG8gbWVldCB0aGUgc2hpZnRlZCBob3Jpem9uLlxuICAgICAgICBjb25zdCBza3lib3hIb3Jpem9uU2hpZnQgPSAoTWF0aC5QSSAvIDIgLSB0aGlzLl9waXRjaCkgKiAodGhpcy5oZWlnaHQgLyB0aGlzLl9mb3YpICogdGhpcy5faG9yaXpvblNoaWZ0O1xuICAgICAgICAvLyBBcHBseSBjZW50ZXIgb2YgcGVyc3BlY3RpdmUgb2Zmc2V0IHRvIHNreWJveCBwcm9qZWN0aW9uXG4gICAgICAgIHByb2plY3Rpb25bOF0gPSAtb2Zmc2V0LnggKiAyIC8gdGhpcy53aWR0aDtcbiAgICAgICAgcHJvamVjdGlvbls5XSA9IChvZmZzZXQueSArIHNreWJveEhvcml6b25TaGlmdCkgKiAyIC8gdGhpcy5oZWlnaHQ7XG4gICAgICAgIHRoaXMuc2t5Ym94TWF0cml4ID0gbWF0NC5tdWx0aXBseSh2aWV3LCBwcm9qZWN0aW9uLCB2aWV3KTtcblxuICAgICAgICAvLyBNYWtlIGEgc2Vjb25kIHByb2plY3Rpb24gbWF0cml4IHRoYXQgaXMgYWxpZ25lZCB0byBhIHBpeGVsIGdyaWQgZm9yIHJlbmRlcmluZyByYXN0ZXIgdGlsZXMuXG4gICAgICAgIC8vIFdlJ3JlIHJvdW5kaW5nIHRoZSAoZmxvYXRpbmcgcG9pbnQpIHgveSB2YWx1ZXMgdG8gYWNoaWV2ZSB0byBhdm9pZCByZW5kZXJpbmcgcmFzdGVyIGltYWdlcyB0byBmcmFjdGlvbmFsXG4gICAgICAgIC8vIGNvb3JkaW5hdGVzLiBBZGRpdGlvbmFsbHksIHdlIGFkanVzdCBieSBoYWxmIGEgcGl4ZWwgaW4gZWl0aGVyIGRpcmVjdGlvbiBpbiBjYXNlIHRoYXQgdmlld3BvcnQgZGltZW5zaW9uXG4gICAgICAgIC8vIGlzIGFuIG9kZCBpbnRlZ2VyIHRvIHByZXNlcnZlIHJlbmRlcmluZyB0byB0aGUgcGl4ZWwgZ3JpZC4gV2UncmUgcm90YXRpbmcgdGhpcyBzaGlmdCBiYXNlZCBvbiB0aGUgYW5nbGVcbiAgICAgICAgLy8gb2YgdGhlIHRyYW5zZm9ybWF0aW9uIHNvIHRoYXQgMMKwLCA5MMKwLCAxODDCsCwgYW5kIDI3MMKwIHJhc3RlcnMgYXJlIGNyaXNwLCBhbmQgYWRqdXN0IHRoZSBzaGlmdCBzbyB0aGF0XG4gICAgICAgIC8vIGl0IGlzIGFsd2F5cyA8PSAwLjUgcGl4ZWxzLlxuICAgICAgICBjb25zdCBwb2ludCA9IHRoaXMucG9pbnQ7XG4gICAgICAgIGNvbnN0IHggPSBwb2ludC54LCB5ID0gcG9pbnQueTtcbiAgICAgICAgY29uc3QgeFNoaWZ0ID0gKHRoaXMud2lkdGggJSAyKSAvIDIsIHlTaGlmdCA9ICh0aGlzLmhlaWdodCAlIDIpIC8gMixcbiAgICAgICAgICAgIGFuZ2xlQ29zID0gTWF0aC5jb3ModGhpcy5hbmdsZSksIGFuZ2xlU2luID0gTWF0aC5zaW4odGhpcy5hbmdsZSksXG4gICAgICAgICAgICBkeCA9IHggLSBNYXRoLnJvdW5kKHgpICsgYW5nbGVDb3MgKiB4U2hpZnQgKyBhbmdsZVNpbiAqIHlTaGlmdCxcbiAgICAgICAgICAgIGR5ID0geSAtIE1hdGgucm91bmQoeSkgKyBhbmdsZUNvcyAqIHlTaGlmdCArIGFuZ2xlU2luICogeFNoaWZ0O1xuICAgICAgICBjb25zdCBhbGlnbmVkTSA9IG5ldyBGbG9hdDY0QXJyYXkobSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKGFsaWduZWRNLCBhbGlnbmVkTSwgWyBkeCA+IDAuNSA/IGR4IC0gMSA6IGR4LCBkeSA+IDAuNSA/IGR5IC0gMSA6IGR5LCAwIF0pO1xuICAgICAgICB0aGlzLmFsaWduZWRQcm9qTWF0cml4ID0gYWxpZ25lZE07XG5cbiAgICAgICAgbSA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgW3RoaXMud2lkdGggLyAyLCAtdGhpcy5oZWlnaHQgLyAyLCAxXSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFsxLCAtMSwgMF0pO1xuICAgICAgICB0aGlzLmxhYmVsUGxhbmVNYXRyaXggPSBtO1xuXG4gICAgICAgIG0gPSBtYXQ0LmNyZWF0ZSgpO1xuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFsxLCAtMSwgMV0pO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZShtLCBtLCBbLTEsIC0xLCAwXSk7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgWzIgLyB0aGlzLndpZHRoLCAyIC8gdGhpcy5oZWlnaHQsIDFdKTtcbiAgICAgICAgdGhpcy5nbENvb3JkTWF0cml4ID0gbTtcblxuICAgICAgICAvLyBtYXRyaXggZm9yIGNvbnZlcnNpb24gZnJvbSBsb2NhdGlvbiB0byBzY3JlZW4gY29vcmRpbmF0ZXNcbiAgICAgICAgdGhpcy5waXhlbE1hdHJpeCA9IG1hdDQubXVsdGlwbHkobmV3IEZsb2F0NjRBcnJheSgxNiksIHRoaXMubGFiZWxQbGFuZU1hdHJpeCwgdGhpcy5wcm9qTWF0cml4KTtcblxuICAgICAgICB0aGlzLl9jYWxjRm9nTWF0cmljZXMoKTtcbiAgICAgICAgdGhpcy5fZGlzdGFuY2VUaWxlRGF0YUNhY2hlID0ge307XG5cbiAgICAgICAgLy8gaW52ZXJzZSBtYXRyaXggZm9yIGNvbnZlcnNpb24gZnJvbSBzY3JlZW4gY29vcmRpbmF0ZXMgdG8gbG9jYXRpb25cbiAgICAgICAgbSA9IG1hdDQuaW52ZXJ0KG5ldyBGbG9hdDY0QXJyYXkoMTYpLCB0aGlzLnBpeGVsTWF0cml4KTtcbiAgICAgICAgaWYgKCFtKSB0aHJvdyBuZXcgRXJyb3IoXCJmYWlsZWQgdG8gaW52ZXJ0IG1hdHJpeFwiKTtcbiAgICAgICAgdGhpcy5waXhlbE1hdHJpeEludmVyc2UgPSBtO1xuXG4gICAgICAgIGlmICh0aGlzLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJyB8fCB0aGlzLm1lcmNhdG9yRnJvbVRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZ2xvYmVNYXRyaXggPSBjYWxjdWxhdGVHbG9iZU1hdHJpeCh0aGlzKTtcblxuICAgICAgICAgICAgY29uc3QgZ2xvYmVDZW50ZXIgPSBbdGhpcy5nbG9iZU1hdHJpeFsxMl0sIHRoaXMuZ2xvYmVNYXRyaXhbMTNdLCB0aGlzLmdsb2JlTWF0cml4WzE0XV07XG5cbiAgICAgICAgICAgIHRoaXMuZ2xvYmVDZW50ZXJJblZpZXdTcGFjZSA9IHZlYzMudHJhbnNmb3JtTWF0NChnbG9iZUNlbnRlciwgZ2xvYmVDZW50ZXIsIHdvcmxkVG9DYW1lcmEpO1xuICAgICAgICAgICAgdGhpcy5nbG9iZVJhZGl1cyA9IHRoaXMud29ybGRTaXplIC8gMi4wIC8gTWF0aC5QSSAtIDEuMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2xvYmVNYXRyaXggPSBtO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcHJvak1hdHJpeENhY2hlID0ge307XG4gICAgICAgIHRoaXMuX2FsaWduZWRQcm9qTWF0cml4Q2FjaGUgPSB7fTtcbiAgICAgICAgdGhpcy5fcGl4ZWxzVG9UaWxlVW5pdHNDYWNoZSA9IHt9O1xuICAgIH1cblxuICAgIF9jYWxjRm9nTWF0cmljZXMoKSB7XG4gICAgICAgIHRoaXMuX2ZvZ1RpbGVNYXRyaXhDYWNoZSA9IHt9O1xuXG4gICAgICAgIGNvbnN0IGNhbWVyYVdvcmxkU2l6ZSA9IHRoaXMuY2FtZXJhV29ybGRTaXplO1xuICAgICAgICBjb25zdCBjYW1lcmFQaXhlbHNQZXJNZXRlciA9IHRoaXMuY2FtZXJhUGl4ZWxzUGVyTWV0ZXI7XG4gICAgICAgIGNvbnN0IGNhbWVyYVBvcyA9IHRoaXMuX2NhbWVyYS5wb3NpdGlvbjtcblxuICAgICAgICAvLyBUaGUgbWVyY2F0b3IgZm9nIG1hdHJpeCBlbmNvZGVzIHRyYW5zZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byB0cmFuc2Zvcm0gYSBwb3NpdGlvbiB0byBjYW1lcmEgZm9nIHNwYWNlIChpbiBtZXRlcnMpOlxuICAgICAgICAvLyB0cmFuc2xhdGVzIHAgdG8gY2FtZXJhIG9yaWdpbiBhbmQgdHJhbnNmb3JtcyBpdCBmcm9tIHBpeGVscyB0byBtZXRlcnMuIFRoZSB3aW5kb3dTY2FsZUZhY3RvciBpcyB1c2VkIHRvIGhhdmUgYVxuICAgICAgICAvLyBjb25zaXN0ZW50IHRyYW5zZm9ybWF0aW9uIGFjcm9zcyBkaWZmZXJlbnQgd2luZG93IHNpemVzLlxuICAgICAgICAvLyAtIHAgPSBwIC0gY2FtZXJhT3JpZ2luXG4gICAgICAgIC8vIC0gcC54eSA9IHAueHkgKiBjYW1lcmFXb3JsZFNpemUgKiB3aW5kb3dTY2FsZUZhY3RvclxuICAgICAgICAvLyAtIHAueiAgPSBwLnogICogY2FtZXJhUGl4ZWxzUGVyTWV0ZXIgKiB3aW5kb3dTY2FsZUZhY3RvclxuICAgICAgICBjb25zdCB3aW5kb3dTY2FsZUZhY3RvciA9IDEgLyB0aGlzLmhlaWdodCAvIHRoaXMuX3Byb2plY3Rpb25TY2FsZXI7XG4gICAgICAgIGNvbnN0IG1ldGVyc1RvUGl4ZWwgPSBbY2FtZXJhV29ybGRTaXplLCBjYW1lcmFXb3JsZFNpemUsIGNhbWVyYVBpeGVsc1Blck1ldGVyXTtcbiAgICAgICAgdmVjMy5zY2FsZShtZXRlcnNUb1BpeGVsLCBtZXRlcnNUb1BpeGVsLCB3aW5kb3dTY2FsZUZhY3Rvcik7XG4gICAgICAgIHZlYzMuc2NhbGUoY2FtZXJhUG9zLCBjYW1lcmFQb3MsIC0xKTtcbiAgICAgICAgdmVjMy5tdWx0aXBseShjYW1lcmFQb3MsIGNhbWVyYVBvcywgbWV0ZXJzVG9QaXhlbCk7XG5cbiAgICAgICAgY29uc3QgbSA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIGNhbWVyYVBvcyk7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgbWV0ZXJzVG9QaXhlbCk7XG4gICAgICAgIHRoaXMubWVyY2F0b3JGb2dNYXRyaXggPSBtO1xuXG4gICAgICAgIC8vIFRoZSB3b3JsZFRvRm9nTWF0cml4IGNhbiBiZSB1c2VkIGZvciBjb252ZXJzaW9uIGZyb20gd29ybGQgY29vcmRpbmF0ZXMgdG8gcmVsYXRpdmUgY2FtZXJhIHBvc2l0aW9uIGluXG4gICAgICAgIC8vIHVuaXRzIG9mIGZyYWN0aW9ucyBvZiB0aGUgbWFwIGhlaWdodC4gTGF0ZXIgY29tcG9zZWQgd2l0aCB0aWxlIHBvc2l0aW9uIHRvIGNvbnN0cnVjdCB0aGUgZm9nIHRpbGUgbWF0cml4LlxuICAgICAgICB0aGlzLndvcmxkVG9Gb2dNYXRyaXggPSB0aGlzLl9jYW1lcmEuZ2V0V29ybGRUb0NhbWVyYVBvc2l0aW9uKGNhbWVyYVdvcmxkU2l6ZSwgY2FtZXJhUGl4ZWxzUGVyTWV0ZXIsIHdpbmRvd1NjYWxlRmFjdG9yKTtcbiAgICB9XG5cbiAgICBfY29tcHV0ZUNhbWVyYVBvc2l0aW9uKHRhcmdldFBpeGVsc1Blck1ldGVyOiA/bnVtYmVyKTogVmVjMyB7XG4gICAgICAgIHRhcmdldFBpeGVsc1Blck1ldGVyID0gdGFyZ2V0UGl4ZWxzUGVyTWV0ZXIgfHwgdGhpcy5waXhlbHNQZXJNZXRlcjtcbiAgICAgICAgY29uc3QgcGl4ZWxTcGFjZUNvbnZlcnNpb24gPSB0YXJnZXRQaXhlbHNQZXJNZXRlciAvIHRoaXMucGl4ZWxzUGVyTWV0ZXI7XG5cbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5fY2FtZXJhLmZvcndhcmQoKTtcbiAgICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5wb2ludDtcblxuICAgICAgICAvLyBDb21wdXRlIGNhbWVyYSBwb3NpdGlvbiB1c2luZyB0aGUgZm9sbG93aW5nIHZlY3RvciBtYXRoOiBjYW1lcmEucG9zaXRpb24gPSBtYXAuY2VudGVyIC0gY2FtZXJhLmZvcndhcmQgKiBjYW1lcmFUb0NlbnRlckRpc3RcbiAgICAgICAgLy8gQ2FtZXJhIGRpc3RhbmNlIHRvIHRoZSBjZW50ZXIgY2FuIGJlIGZvdW5kIGluIG1lcmNhdG9yIHVuaXRzIGJ5IHN1YnRyYWN0aW5nIHRoZSBjZW50ZXIgZWxldmF0aW9uIGZyb21cbiAgICAgICAgLy8gY2FtZXJhJ3MgemVuaXRoIHBvc2l0aW9uICh3aGljaCBjYW4gYmUgZGVkdWNlZCBmcm9tIHRoZSB6b29tIGxldmVsKVxuICAgICAgICBjb25zdCB6b29tID0gdGhpcy5fc2VhTGV2ZWxab29tID8gdGhpcy5fc2VhTGV2ZWxab29tIDogdGhpcy5fem9vbTtcbiAgICAgICAgY29uc3QgYWx0aXR1ZGUgPSB0aGlzLl9tZXJjYXRvclpmcm9tWm9vbSh6b29tKSAqIHBpeGVsU3BhY2VDb252ZXJzaW9uO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGFsdGl0dWRlIC0gdGFyZ2V0UGl4ZWxzUGVyTWV0ZXIgLyB0aGlzLndvcmxkU2l6ZSAqIHRoaXMuX2NlbnRlckFsdGl0dWRlO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBjZW50ZXIueCAvIHRoaXMud29ybGRTaXplIC0gZGlyWzBdICogZGlzdGFuY2UsXG4gICAgICAgICAgICBjZW50ZXIueSAvIHRoaXMud29ybGRTaXplIC0gZGlyWzFdICogZGlzdGFuY2UsXG4gICAgICAgICAgICB0YXJnZXRQaXhlbHNQZXJNZXRlciAvIHRoaXMud29ybGRTaXplICogdGhpcy5fY2VudGVyQWx0aXR1ZGUgLSBkaXJbMl0gKiBkaXN0YW5jZVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIF91cGRhdGVDYW1lcmFTdGF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhlaWdodCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNldCBjYW1lcmEgb3JpZW50YXRpb24gYW5kIG1vdmUgaXQgdG8gYSBwcm9wZXIgZGlzdGFuY2UgZnJvbSB0aGUgbWFwXG4gICAgICAgIHRoaXMuX2NhbWVyYS5zZXRQaXRjaEJlYXJpbmcodGhpcy5fcGl0Y2gsIHRoaXMuYW5nbGUpO1xuICAgICAgICB0aGlzLl9jYW1lcmEucG9zaXRpb24gPSB0aGlzLl9jb21wdXRlQ2FtZXJhUG9zaXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBseSBhIDNkIHRyYW5zbGF0aW9uIHRvIHRoZSBjYW1lcmEgcG9zaXRpb24sIGJ1dCBjbGFtcGluZyBpdCBzbyB0aGF0XG4gICAgICogaXQgcmVzcGVjdHMgdGhlIG1heGltdW0gbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSByYW5nZSBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3ZlYzN9IHRyYW5zbGF0aW9uIFRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IuXG4gICAgICovXG4gICAgX3RyYW5zbGF0ZUNhbWVyYUNvbnN0cmFpbmVkKHRyYW5zbGF0aW9uOiBWZWMzKSB7XG4gICAgICAgIGNvbnN0IG1heERpc3RhbmNlID0gdGhpcy5fbWF4Q2FtZXJhQm91bmRzRGlzdGFuY2UoKTtcbiAgICAgICAgLy8gRGVmaW5lIGEgY2VpbGluZyBpbiBtZXJjYXRvciBaXG4gICAgICAgIGNvbnN0IG1heFogPSBtYXhEaXN0YW5jZSAqIE1hdGguY29zKHRoaXMuX3BpdGNoKTtcbiAgICAgICAgY29uc3QgeiA9IHRoaXMuX2NhbWVyYS5wb3NpdGlvblsyXTtcbiAgICAgICAgY29uc3QgZGVsdGFaID0gdHJhbnNsYXRpb25bMl07XG4gICAgICAgIGxldCB0ID0gMTtcbiAgICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIGNsYW1wIGlmIHRoZSBjYW1lcmEgaXMgbW92aW5nIHVwd2FyZHNcbiAgICAgICAgaWYgKGRlbHRhWiA+IDApIHtcbiAgICAgICAgICAgIHQgPSBNYXRoLm1pbigobWF4WiAtIHopIC8gZGVsdGFaLCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NhbWVyYS5wb3NpdGlvbiA9IHZlYzMuc2NhbGVBbmRBZGQoW10sIHRoaXMuX2NhbWVyYS5wb3NpdGlvbiwgdHJhbnNsYXRpb24sIHQpO1xuICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZUZyb21DYW1lcmEoKTtcblxuICAgICAgICBpZiAodGhpcy5wcm9qZWN0aW9uLndyYXApXG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMuY2VudGVyLndyYXAoKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlU3RhdGVGcm9tQ2FtZXJhKCkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuX2NhbWVyYS5wb3NpdGlvbjtcbiAgICAgICAgY29uc3QgZGlyID0gdGhpcy5fY2FtZXJhLmZvcndhcmQoKTtcbiAgICAgICAgY29uc3Qge3BpdGNoLCBiZWFyaW5nfSA9IHRoaXMuX2NhbWVyYS5nZXRQaXRjaEJlYXJpbmcoKTtcblxuICAgICAgICAvLyBDb21wdXRlIHpvb20gZnJvbSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBjYW1lcmEgYW5kIHRlcnJhaW5cbiAgICAgICAgY29uc3QgY2VudGVyQWx0aXR1ZGUgPSBtZXJjYXRvclpmcm9tQWx0aXR1ZGUodGhpcy5fY2VudGVyQWx0aXR1ZGUsIHRoaXMuY2VudGVyLmxhdCkgKiB0aGlzLl9wcm9qZWN0aW9uU2NhbGVyO1xuICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSB0aGlzLl9tZXJjYXRvclpmcm9tWm9vbSh0aGlzLl9tYXhab29tKSAqIE1hdGguY29zKGRlZ1RvUmFkKHRoaXMuX21heFBpdGNoKSk7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KChwb3NpdGlvblsyXSAtIGNlbnRlckFsdGl0dWRlKSAvIE1hdGguY29zKHBpdGNoKSwgbWluSGVpZ2h0KTtcbiAgICAgICAgY29uc3Qgem9vbSA9IHRoaXMuX3pvb21Gcm9tTWVyY2F0b3JaKGhlaWdodCk7XG5cbiAgICAgICAgLy8gQ2FzdCBhIHJheSB0b3dhcmRzIHRoZSBncm91bmQgdG8gZmluZCB0aGUgY2VudGVyIHBvaW50XG4gICAgICAgIHZlYzMuc2NhbGVBbmRBZGQocG9zaXRpb24sIHBvc2l0aW9uLCBkaXIsIGhlaWdodCk7XG5cbiAgICAgICAgdGhpcy5fcGl0Y2ggPSBjbGFtcChwaXRjaCwgZGVnVG9SYWQodGhpcy5taW5QaXRjaCksIGRlZ1RvUmFkKHRoaXMubWF4UGl0Y2gpKTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IHdyYXAoYmVhcmluZywgLU1hdGguUEksIE1hdGguUEkpO1xuICAgICAgICB0aGlzLl9zZXRab29tKGNsYW1wKHpvb20sIHRoaXMuX21pblpvb20sIHRoaXMuX21heFpvb20pKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlU2VhTGV2ZWxab29tKCk7XG5cbiAgICAgICAgdGhpcy5fY2VudGVyID0gdGhpcy5jb29yZGluYXRlTG9jYXRpb24obmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIHBvc2l0aW9uWzJdKSk7XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIF93b3JsZFNpemVGcm9tWm9vbSh6b29tOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5wb3coMi4wLCB6b29tKSAqIHRoaXMudGlsZVNpemU7XG4gICAgfVxuXG4gICAgX21lcmNhdG9yWmZyb21ab29tKHpvb206IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgLyB0aGlzLl93b3JsZFNpemVGcm9tWm9vbSh6b29tKTtcbiAgICB9XG5cbiAgICBfbWluaW11bUhlaWdodE92ZXJUZXJyYWluKCk6IG51bWJlciB7XG4gICAgICAgIC8vIERldGVybWluZSBtaW5pbXVtIGhlaWdodCBmb3IgdGhlIGNhbWVyYSBvdmVyIHRoZSB0ZXJyYWluIHJlbGF0ZWQgdG8gY3VycmVudCB6b29tLlxuICAgICAgICAvLyBWYWx1ZXMgYWJvdmUgdGhhbiAyIGFsbG93IG1heC1waXRjaCBjYW1lcmEgY2xvc2VyIHRvIGUuZy4gdG9wIG9mIHRoZSBoaWxsLCBleHBvc2luZ1xuICAgICAgICAvLyBkcmFwZSByYXN0ZXIgb3ZlcnNjYWxlIGFydGlmYWN0cyBvciBjdXQgdGVycmFpbiAoc2VlIHVuZGVyIGl0KSBhcyBpdCBnZXRzIGNsaXBwZWQgb25cbiAgICAgICAgLy8gbmVhciBwbGFuZS4gUmV0dXJuZWQgdmFsdWUgaXMgaW4gbWVyY2F0b3IgY29vcmRpbmF0ZXMuXG4gICAgICAgIGNvbnN0IE1BWF9EUkFQRV9PVkVSWk9PTSA9IDI7XG4gICAgICAgIGNvbnN0IHpvb20gPSBNYXRoLm1pbigodGhpcy5fc2VhTGV2ZWxab29tICE9IG51bGwgPyB0aGlzLl9zZWFMZXZlbFpvb20gOiB0aGlzLl96b29tKSArIE1BWF9EUkFQRV9PVkVSWk9PTSwgdGhpcy5fbWF4Wm9vbSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXJjYXRvclpmcm9tWm9vbSh6b29tKTtcbiAgICB9XG5cbiAgICBfem9vbUZyb21NZXJjYXRvclooejogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGVab29tKHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvICh6ICogdGhpcy50aWxlU2l6ZSkpO1xuICAgIH1cblxuICAgIF90ZXJyYWluRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLl9lbGV2YXRpb24pIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCF0aGlzLnByb2plY3Rpb24uc3VwcG9ydHNUZXJyYWluKSB7XG4gICAgICAgICAgICB3YXJuT25jZSgnVGVycmFpbiBpcyBub3QgeWV0IHN1cHBvcnRlZCB3aXRoIGFsdGVybmF0ZSBwcm9qZWN0aW9ucy4gVXNlIG1lcmNhdG9yIG9yIGdsb2JlIHRvIGVuYWJsZSB0ZXJyYWluLicpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGFueSBvZiB0aGUgZm91ciBjb3JuZXJzIGFyZSBvZmYgdGhlIGVkZ2Ugb2YgdGhlIHJlbmRlcmVkIG1hcFxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYGZhbHNlYCBmb3IgYWxsIG5vbi1tZXJjYXRvciBwcm9qZWN0aW9uXG4gICAgYW55Q29ybmVyT2ZmRWRnZShwMDogUG9pbnQsIHAxOiBQb2ludCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBtaW5YID0gTWF0aC5taW4ocDAueCwgcDEueCk7XG4gICAgICAgIGNvbnN0IG1heFggPSBNYXRoLm1heChwMC54LCBwMS54KTtcbiAgICAgICAgY29uc3QgbWluWSA9IE1hdGgubWluKHAwLnksIHAxLnkpO1xuICAgICAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgocDAueSwgcDEueSk7XG5cbiAgICAgICAgY29uc3QgaG9yaXpvbiA9IHRoaXMuaG9yaXpvbkxpbmVGcm9tVG9wKGZhbHNlKTtcbiAgICAgICAgaWYgKG1pblkgPCBob3Jpem9uKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5wcm9qZWN0aW9uLm5hbWUgIT09ICdtZXJjYXRvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pbiA9IG5ldyBQb2ludChtaW5YLCBtaW5ZKTtcbiAgICAgICAgY29uc3QgbWF4ID0gbmV3IFBvaW50KG1heFgsIG1heFkpO1xuXG4gICAgICAgIGNvbnN0IGNvcm5lcnMgPSBbXG4gICAgICAgICAgICBtaW4sIG1heCxcbiAgICAgICAgICAgIG5ldyBQb2ludChtaW5YLCBtYXhZKSxcbiAgICAgICAgICAgIG5ldyBQb2ludChtYXhYLCBtaW5ZKSxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBtaW5XWCA9ICh0aGlzLnJlbmRlcldvcmxkQ29waWVzKSA/IC1OVU1fV09STERfQ09QSUVTIDogMDtcbiAgICAgICAgY29uc3QgbWF4V1ggPSAodGhpcy5yZW5kZXJXb3JsZENvcGllcykgPyAxICsgTlVNX1dPUkxEX0NPUElFUyA6IDE7XG4gICAgICAgIGNvbnN0IG1pbldZID0gMDtcbiAgICAgICAgY29uc3QgbWF4V1kgPSAxO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29ybmVyIG9mIGNvcm5lcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJheUludGVyc2VjdGlvbiA9IHRoaXMucG9pbnRSYXlJbnRlcnNlY3Rpb24oY29ybmVyKTtcbiAgICAgICAgICAgIC8vIFBvaW50IGlzIGFib3ZlIHRoZSBob3Jpem9uXG4gICAgICAgICAgICBpZiAocmF5SW50ZXJzZWN0aW9uLnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQb2ludCBpcyBvZmYgdGhlIGJvbmRhcmllcyBvZiB0aGUgbWFwXG4gICAgICAgICAgICBjb25zdCBjb29yZGluYXRlID0gdGhpcy5yYXlJbnRlcnNlY3Rpb25Db29yZGluYXRlKHJheUludGVyc2VjdGlvbik7XG4gICAgICAgICAgICBpZiAoY29vcmRpbmF0ZS54IDwgbWluV1ggfHwgY29vcmRpbmF0ZS55IDwgbWluV1kgfHxcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlLnggPiBtYXhXWCB8fCBjb29yZGluYXRlLnkgPiBtYXhXWSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrcyB0aGUgZm91ciBjb3JuZXJzIG9mIHRoZSBmcnVzdHVtIHRvIHNlZSBpZiB0aGV5IGxpZSBpbiB0aGUgbWFwJ3MgcXVhZC5cbiAgICAvL1xuICAgIGlzSG9yaXpvblZpc2libGUoKTogYm9vbGVhbiB7XG5cbiAgICAgICAgLy8gd2UgY29uc2lkZXIgdGhlIGhvcml6b24gYXMgdmlzaWJsZSBpZiB0aGUgYW5nbGUgYmV0d2VlblxuICAgICAgICAvLyBhIHRoZSB0b3AgcGxhbmUgb2YgdGhlIGZydXN0dW0gYW5kIHRoZSBtYXAgcGxhbmUgaXMgc21hbGxlciB0aGFuIHRoaXMgdGhyZXNob2xkLlxuICAgICAgICBjb25zdCBob3Jpem9uQW5nbGVFcHNpbG9uID0gMjtcbiAgICAgICAgaWYgKHRoaXMucGl0Y2ggKyByYWRUb0RlZyh0aGlzLmZvdkFib3ZlQ2VudGVyKSA+ICg5MCAtIGhvcml6b25BbmdsZUVwc2lsb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmFueUNvcm5lck9mZkVkZ2UobmV3IFBvaW50KDAsIDApLCBuZXcgUG9pbnQodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIHpvb20gZGVsdGEgdmFsdWUgaW50byBhIHBoeXNpY2FsIGRpc3RhbmNlIHRyYXZlbGxlZCBpbiB3ZWIgbWVyY2F0b3IgY29vcmRpbmF0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3ZlYzN9IGNlbnRlciBEZXN0aW5hdGlvbiBtZXJjYXRvciBwb2ludCBvZiB0aGUgbW92ZW1lbnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpvb21EZWx0YSBDaGFuZ2UgaW4gdGhlIHpvb20gdmFsdWUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIGRpc3RhbmNlIGluIG1lcmNhdG9yIGNvb3JkaW5hdGVzLlxuICAgICAqL1xuICAgIHpvb21EZWx0YVRvTW92ZW1lbnQoY2VudGVyOiBWZWMzLCB6b29tRGVsdGE6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gdmVjMy5sZW5ndGgodmVjMy5zdWIoW10sIHRoaXMuX2NhbWVyYS5wb3NpdGlvbiwgY2VudGVyKSk7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlWm9vbSA9IHRoaXMuX3pvb21Gcm9tTWVyY2F0b3JaKGRpc3RhbmNlKSArIHpvb21EZWx0YTtcbiAgICAgICAgcmV0dXJuIGRpc3RhbmNlIC0gdGhpcy5fbWVyY2F0b3JaZnJvbVpvb20ocmVsYXRpdmVab29tKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFRoZSBjYW1lcmEgbG9va3MgYXQgdGhlIG1hcCBmcm9tIGEgM0QgKGxuZywgbGF0LCBhbHRpdHVkZSkgbG9jYXRpb24uIExldCdzIHVzZSBgY2FtZXJhTG9jYXRpb25gXG4gICAgICogYXMgdGhlIG5hbWUgZm9yIHRoZSBsb2NhdGlvbiB1bmRlciB0aGUgY2FtZXJhIGFuZCBvbiB0aGUgc3VyZmFjZSBvZiB0aGUgZWFydGggKGxuZywgbGF0LCAwKS5cbiAgICAgKiBgY2FtZXJhUG9pbnRgIGlzIHRoZSBwcm9qZWN0ZWQgcG9zaXRpb24gb2YgdGhlIGBjYW1lcmFMb2NhdGlvbmAuXG4gICAgICpcbiAgICAgKiBUaGlzIHBvaW50IGlzIHVzZWZ1bCB0byB1cyBiZWNhdXNlIG9ubHkgZmlsbC1leHRydXNpb25zIHRoYXQgYXJlIGJldHdlZW4gYGNhbWVyYVBvaW50YCBhbmRcbiAgICAgKiB0aGUgcXVlcnkgcG9pbnQgb24gdGhlIHN1cmZhY2Ugb2YgdGhlIGVhcnRoIGNhbiBleHRlbmQgYW5kIGludGVyc2VjdCB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBXaGVuIHRoZSBtYXAgaXMgbm90IHBpdGNoZWQgdGhlIGBjYW1lcmFQb2ludGAgaXMgZXF1aXZhbGVudCB0byB0aGUgY2VudGVyIG9mIHRoZSBtYXAgYmVjYXVzZVxuICAgICAqIHRoZSBjYW1lcmEgaXMgcmlnaHQgYWJvdmUgdGhlIGNlbnRlciBvZiB0aGUgbWFwLlxuICAgICAqL1xuICAgIGdldENhbWVyYVBvaW50KCk6IFBvaW50IHtcbiAgICAgICAgaWYgKHRoaXMucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICAvLyBGaW5kIHByZWNpc2UgbG9jYXRpb24gb2YgdGhlIHByb2plY3RlZCBjYW1lcmEgcG9zaXRpb24gb24gdGhlIGN1cnZlZCBzdXJmYWNlXG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBbdGhpcy5nbG9iZU1hdHJpeFsxMl0sIHRoaXMuZ2xvYmVNYXRyaXhbMTNdLCB0aGlzLmdsb2JlTWF0cml4WzE0XV07XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBwcm9qZWN0Q2xhbXBlZChjZW50ZXIsIHRoaXMucGl4ZWxNYXRyaXgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChwb3NbMF0sIHBvc1sxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwaXRjaCA9IHRoaXMuX3BpdGNoO1xuICAgICAgICAgICAgY29uc3QgeU9mZnNldCA9IE1hdGgudGFuKHBpdGNoKSAqICh0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgfHwgMSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jZW50ZXJQb2ludC5hZGQobmV3IFBvaW50KDAsIHlPZmZzZXQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENhbWVyYVRvQ2VudGVyRGlzdGFuY2UocHJvamVjdGlvbjogUHJvamVjdGlvbik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHQgPSBnZXRQcm9qZWN0aW9uSW50ZXJwb2xhdGlvblQocHJvamVjdGlvbiwgdGhpcy56b29tLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgMTAyNCk7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb25TY2FsZXIgPSBwcm9qZWN0aW9uLnBpeGVsU3BhY2VDb252ZXJzaW9uKHRoaXMuY2VudGVyLmxhdCwgdGhpcy53b3JsZFNpemUsIHQpO1xuICAgICAgICByZXR1cm4gMC41IC8gTWF0aC50YW4odGhpcy5fZm92ICogMC41KSAqIHRoaXMuaGVpZ2h0ICogcHJvamVjdGlvblNjYWxlcjtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zZm9ybTtcbiIsIi8vIEBmbG93IHN0cmljdFxuXG4vKipcbiAqIFRocm90dGxlIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBydW4gYXQgbW9zdCBldmVyeSBgcGVyaW9kYCBtaWxsaXNlY29uZHMuXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0aHJvdHRsZShmbjogKCkgPT4gdm9pZCwgdGltZTogbnVtYmVyKTogKCkgPT4gP1RpbWVvdXRJRCB7XG4gICAgbGV0IHBlbmRpbmcgPSBmYWxzZTtcbiAgICBsZXQgdGltZXJJZDogP1RpbWVvdXRJRCA9IG51bGw7XG5cbiAgICBjb25zdCBsYXRlciA9ICgpID0+IHtcbiAgICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgICBmbigpO1xuICAgICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQobGF0ZXIsIHRpbWUpO1xuICAgICAgICAgICAgcGVuZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHBlbmRpbmcgPSB0cnVlO1xuICAgICAgICBpZiAoIXRpbWVySWQpIHtcbiAgICAgICAgICAgIGxhdGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbWVySWQ7XG4gICAgfTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7YmluZEFsbH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cuanMnO1xuaW1wb3J0IHRocm90dGxlIGZyb20gJy4uL3V0aWwvdGhyb3R0bGUuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAuanMnO1xuXG4vKlxuICogQWRkcyB0aGUgbWFwJ3MgcG9zaXRpb24gdG8gaXRzIHBhZ2UncyBsb2NhdGlvbiBoYXNoLlxuICogUGFzc2VkIGFzIGFuIG9wdGlvbiB0byB0aGUgbWFwIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7SGFzaH0gYHRoaXNgXG4gKi9cbmNsYXNzIEhhc2gge1xuICAgIF9tYXA6ID9NYXA7XG4gICAgX3VwZGF0ZUhhc2g6ICgpID0+ID9UaW1lb3V0SUQ7XG4gICAgX2hhc2hOYW1lOiA/c3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoaGFzaE5hbWU6ID9zdHJpbmcpIHtcbiAgICAgICAgdGhpcy5faGFzaE5hbWUgPSBoYXNoTmFtZSAmJiBlbmNvZGVVUklDb21wb25lbnQoaGFzaE5hbWUpO1xuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfZ2V0Q3VycmVudEhhc2gnLFxuICAgICAgICAgICAgJ19vbkhhc2hDaGFuZ2UnLFxuICAgICAgICAgICAgJ191cGRhdGVIYXNoJ1xuICAgICAgICBdLCB0aGlzKTtcblxuICAgICAgICAvLyBNb2JpbGUgU2FmYXJpIGRvZXNuJ3QgYWxsb3cgdXBkYXRpbmcgdGhlIGhhc2ggbW9yZSB0aGFuIDEwMCB0aW1lcyBwZXIgMzAgc2Vjb25kcy5cbiAgICAgICAgdGhpcy5fdXBkYXRlSGFzaCA9IHRocm90dGxlKHRoaXMuX3VwZGF0ZUhhc2hVbnRocm90dGxlZC5iaW5kKHRoaXMpLCAzMCAqIDEwMDAgLyAxMDApO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogTWFwIGVsZW1lbnQgdG8gbGlzdGVuIGZvciBjb29yZGluYXRlIGNoYW5nZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXBcbiAgICAgKiBAcmV0dXJucyB7SGFzaH0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkVG8obWFwOiBNYXApOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuX29uSGFzaENoYW5nZSwgZmFsc2UpO1xuICAgICAgICBtYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVIYXNoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZW1vdmVzIGhhc2hcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlKCk6IHRoaXMge1xuICAgICAgICBpZiAoIXRoaXMuX21hcCkgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuX3VwZGF0ZUhhc2gpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuX29uSGFzaENoYW5nZSwgZmFsc2UpO1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlSGFzaCgpKTtcblxuICAgICAgICB0aGlzLl9tYXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGdldEhhc2hTdHJpbmcobWFwRmVlZGJhY2s/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICBpZiAoIW1hcCkgcmV0dXJuICcnO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBtYXAuZ2V0Q2VudGVyKCksXG4gICAgICAgICAgICB6b29tID0gTWF0aC5yb3VuZChtYXAuZ2V0Wm9vbSgpICogMTAwKSAvIDEwMCxcbiAgICAgICAgICAgIC8vIGRlcml2ZWQgZnJvbSBlcXVhdGlvbjogNTEycHggKiAyXnogLyAzNjAgLyAxMF5kIDwgMC41cHhcbiAgICAgICAgICAgIHByZWNpc2lvbiA9IE1hdGguY2VpbCgoem9vbSAqIE1hdGguTE4yICsgTWF0aC5sb2coNTEyIC8gMzYwIC8gMC41KSkgLyBNYXRoLkxOMTApLFxuICAgICAgICAgICAgbSA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24pLFxuICAgICAgICAgICAgbG5nID0gTWF0aC5yb3VuZChjZW50ZXIubG5nICogbSkgLyBtLFxuICAgICAgICAgICAgbGF0ID0gTWF0aC5yb3VuZChjZW50ZXIubGF0ICogbSkgLyBtLFxuICAgICAgICAgICAgYmVhcmluZyA9IG1hcC5nZXRCZWFyaW5nKCksXG4gICAgICAgICAgICBwaXRjaCA9IG1hcC5nZXRQaXRjaCgpO1xuICAgICAgICBsZXQgaGFzaCA9ICcnO1xuICAgICAgICBpZiAobWFwRmVlZGJhY2spIHtcbiAgICAgICAgICAgIC8vIG5ldyBtYXAgZmVlZGJhY2sgc2l0ZSBoYXMgc29tZSBjb25zdHJhaW50cyB0aGF0IGRvbid0IGFsbG93XG4gICAgICAgICAgICAvLyB1cyB0byB1c2UgdGhlIHNhbWUgaGFzaCBmb3JtYXQgYXMgd2UgZG8gZm9yIHRoZSBNYXAgaGFzaCBvcHRpb24uXG4gICAgICAgICAgICBoYXNoICs9IGAvJHtsbmd9LyR7bGF0fS8ke3pvb219YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhc2ggKz0gYCR7em9vbX0vJHtsYXR9LyR7bG5nfWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmVhcmluZyB8fCBwaXRjaCkgaGFzaCArPSAoYC8ke01hdGgucm91bmQoYmVhcmluZyAqIDEwKSAvIDEwfWApO1xuICAgICAgICBpZiAocGl0Y2gpIGhhc2ggKz0gKGAvJHtNYXRoLnJvdW5kKHBpdGNoKX1gKTtcblxuICAgICAgICBpZiAodGhpcy5faGFzaE5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhc2hOYW1lID0gdGhpcy5faGFzaE5hbWU7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gd2luZG93LmxvY2F0aW9uLmhhc2guc2xpY2UoMSkuc3BsaXQoJyYnKS5tYXAocGFydCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gcGFydC5zcGxpdCgnPScpWzBdO1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IGhhc2hOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2tleX09JHtoYXNofWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0O1xuICAgICAgICAgICAgfSkuZmlsdGVyKGEgPT4gYSk7XG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChgJHtoYXNoTmFtZX09JHtoYXNofWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGAjJHtwYXJ0cy5qb2luKCcmJyl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgIyR7aGFzaH1gO1xuICAgIH1cblxuICAgIF9nZXRDdXJyZW50SGFzaCgpOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGhhc2ggZnJvbSBsb2NhdGlvbiwgc3RyaXBwZWQgZnJvbSBpdHMgbnVtYmVyIHNpZ25cbiAgICAgICAgY29uc3QgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoJyMnLCAnJyk7XG4gICAgICAgIGlmICh0aGlzLl9oYXNoTmFtZSkge1xuICAgICAgICAgICAgLy8gU3BsaXQgdGhlIHBhcmFtZXRlci1zdHlsZWQgaGFzaCBpbnRvIHBhcnRzIGFuZCBmaW5kIHRoZSB2YWx1ZSB3ZSBuZWVkXG4gICAgICAgICAgICBsZXQga2V5dmFsO1xuICAgICAgICAgICAgaGFzaC5zcGxpdCgnJicpLm1hcChcbiAgICAgICAgICAgICAgICBwYXJ0ID0+IHBhcnQuc3BsaXQoJz0nKVxuICAgICAgICAgICAgKS5mb3JFYWNoKHBhcnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0WzBdID09PSB0aGlzLl9oYXNoTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBrZXl2YWwgPSBwYXJ0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIChrZXl2YWwgPyBrZXl2YWxbMV0gfHwgJycgOiAnJykuc3BsaXQoJy8nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzaC5zcGxpdCgnLycpO1xuICAgIH1cblxuICAgIF9vbkhhc2hDaGFuZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgaWYgKCFtYXApIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgbG9jID0gdGhpcy5fZ2V0Q3VycmVudEhhc2goKTtcbiAgICAgICAgaWYgKGxvYy5sZW5ndGggPj0gMyAmJiAhbG9jLnNvbWUodiA9PiBpc05hTih2KSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJlYXJpbmcgPSBtYXAuZHJhZ1JvdGF0ZS5pc0VuYWJsZWQoKSAmJiBtYXAudG91Y2hab29tUm90YXRlLmlzRW5hYmxlZCgpID8gKyhsb2NbM10gfHwgMCkgOiBtYXAuZ2V0QmVhcmluZygpO1xuICAgICAgICAgICAgbWFwLmp1bXBUbyh7XG4gICAgICAgICAgICAgICAgY2VudGVyOiBbK2xvY1syXSwgK2xvY1sxXV0sXG4gICAgICAgICAgICAgICAgem9vbTogK2xvY1swXSxcbiAgICAgICAgICAgICAgICBiZWFyaW5nLFxuICAgICAgICAgICAgICAgIHBpdGNoOiArKGxvY1s0XSB8fCAwKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUhhc2hVbnRocm90dGxlZCgpIHtcbiAgICAgICAgLy8gUmVwbGFjZSBpZiBhbHJlYWR5IHByZXNlbnQsIGVsc2UgYXBwZW5kIHRoZSB1cGRhdGVkIGhhc2ggc3RyaW5nXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgvKCMuKyk/JC8sIHRoaXMuZ2V0SGFzaFN0cmluZygpKTtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHdpbmRvdy5oaXN0b3J5LnN0YXRlLCBudWxsLCBsb2NhdGlvbik7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEhhc2g7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgYnJvd3NlciBmcm9tICcuLi91dGlsL2Jyb3dzZXIuanMnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4vbWFwLmpzJztcbmltcG9ydCB7YmV6aWVyLCBjbGFtcCwgZXh0ZW5kfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG5pbXBvcnQgdHlwZSB7RHJhZ1Bhbk9wdGlvbnN9IGZyb20gJy4vaGFuZGxlci9zaGltL2RyYWdfcGFuLmpzJztcbmltcG9ydCB0eXBlIHtFYXNpbmdPcHRpb25zfSBmcm9tICcuLi91aS9jYW1lcmEuanMnO1xuXG5jb25zdCBkZWZhdWx0SW5lcnRpYU9wdGlvbnMgPSB7XG4gICAgbGluZWFyaXR5OiAwLjMsXG4gICAgZWFzaW5nOiBiZXppZXIoMCwgMCwgMC4zLCAxKSxcbn07XG5cbmNvbnN0IGRlZmF1bHRQYW5JbmVydGlhT3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgZGVjZWxlcmF0aW9uOiAyNTAwLFxuICAgIG1heFNwZWVkOiAxNDAwXG59LCBkZWZhdWx0SW5lcnRpYU9wdGlvbnMpO1xuXG5jb25zdCBkZWZhdWx0Wm9vbUluZXJ0aWFPcHRpb25zID0gZXh0ZW5kKHtcbiAgICBkZWNlbGVyYXRpb246IDIwLFxuICAgIG1heFNwZWVkOiAxNDAwXG59LCBkZWZhdWx0SW5lcnRpYU9wdGlvbnMpO1xuXG5jb25zdCBkZWZhdWx0QmVhcmluZ0luZXJ0aWFPcHRpb25zID0gZXh0ZW5kKHtcbiAgICBkZWNlbGVyYXRpb246IDEwMDAsXG4gICAgbWF4U3BlZWQ6IDM2MFxufSwgZGVmYXVsdEluZXJ0aWFPcHRpb25zKTtcblxuY29uc3QgZGVmYXVsdFBpdGNoSW5lcnRpYU9wdGlvbnMgPSBleHRlbmQoe1xuICAgIGRlY2VsZXJhdGlvbjogMTAwMCxcbiAgICBtYXhTcGVlZDogOTBcbn0sIGRlZmF1bHRJbmVydGlhT3B0aW9ucyk7XG5cbmV4cG9ydCB0eXBlIEluZXJ0aWFPcHRpb25zID0ge1xuICAgIGxpbmVhcml0eTogbnVtYmVyO1xuICAgIGVhc2luZzogKHQ6IG51bWJlcikgPT4gbnVtYmVyO1xuICAgIGRlY2VsZXJhdGlvbjogbnVtYmVyO1xuICAgIG1heFNwZWVkOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBJbnB1dEV2ZW50ID0gTW91c2VFdmVudCB8IFRvdWNoRXZlbnQgfCBLZXlib2FyZEV2ZW50IHwgV2hlZWxFdmVudDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGFuZGxlckluZXJ0aWEge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfaW5lcnRpYUJ1ZmZlcjogQXJyYXk8eyB0aW1lOiBudW1iZXIsIHNldHRpbmdzOiBPYmplY3QgfT47XG5cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5faW5lcnRpYUJ1ZmZlciA9IFtdO1xuICAgIH1cblxuICAgIHJlY29yZChzZXR0aW5nczogYW55KSB7XG4gICAgICAgIHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpO1xuICAgICAgICB0aGlzLl9pbmVydGlhQnVmZmVyLnB1c2goe3RpbWU6IGJyb3dzZXIubm93KCksIHNldHRpbmdzfSk7XG4gICAgfVxuXG4gICAgX2RyYWluSW5lcnRpYUJ1ZmZlcigpIHtcbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWFCdWZmZXIsXG4gICAgICAgICAgICBub3cgPSBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgY3V0b2ZmID0gMTYwOyAgIC8vbXNlY1xuXG4gICAgICAgIHdoaWxlIChpbmVydGlhLmxlbmd0aCA+IDAgJiYgbm93IC0gaW5lcnRpYVswXS50aW1lID4gY3V0b2ZmKVxuICAgICAgICAgICAgaW5lcnRpYS5zaGlmdCgpO1xuICAgIH1cblxuICAgIF9vbk1vdmVFbmQocGFuSW5lcnRpYU9wdGlvbnM/OiBEcmFnUGFuT3B0aW9ucyk6ID8oRWFzaW5nT3B0aW9ucyAmIHtlYXNlSWQ/OiBzdHJpbmcsIHByZWxvYWRPbmx5PzogYm9vbGVhbn0pIHtcbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG4gICAgICAgIGlmICh0aGlzLl9pbmVydGlhQnVmZmVyLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlbHRhcyA9IHtcbiAgICAgICAgICAgIHpvb206IDAsXG4gICAgICAgICAgICBiZWFyaW5nOiAwLFxuICAgICAgICAgICAgcGl0Y2g6IDAsXG4gICAgICAgICAgICBwYW46IG5ldyBQb2ludCgwLCAwKSxcbiAgICAgICAgICAgIHBpbmNoQXJvdW5kOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBhcm91bmQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3Qge3NldHRpbmdzfSBvZiB0aGlzLl9pbmVydGlhQnVmZmVyKSB7XG4gICAgICAgICAgICBkZWx0YXMuem9vbSArPSBzZXR0aW5ncy56b29tRGVsdGEgfHwgMDtcbiAgICAgICAgICAgIGRlbHRhcy5iZWFyaW5nICs9IHNldHRpbmdzLmJlYXJpbmdEZWx0YSB8fCAwO1xuICAgICAgICAgICAgZGVsdGFzLnBpdGNoICs9IHNldHRpbmdzLnBpdGNoRGVsdGEgfHwgMDtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5wYW5EZWx0YSkgZGVsdGFzLnBhbi5fYWRkKHNldHRpbmdzLnBhbkRlbHRhKTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5hcm91bmQpIGRlbHRhcy5hcm91bmQgPSBzZXR0aW5ncy5hcm91bmQ7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MucGluY2hBcm91bmQpIGRlbHRhcy5waW5jaEFyb3VuZCA9IHNldHRpbmdzLnBpbmNoQXJvdW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdEVudHJ5ID0gdGhpcy5faW5lcnRpYUJ1ZmZlclt0aGlzLl9pbmVydGlhQnVmZmVyLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IChsYXN0RW50cnkudGltZSAtIHRoaXMuX2luZXJ0aWFCdWZmZXJbMF0udGltZSk7XG5cbiAgICAgICAgY29uc3QgZWFzZU9wdGlvbnMgPSB7fTtcblxuICAgICAgICBpZiAoZGVsdGFzLnBhbi5tYWcoKSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FsY3VsYXRlRWFzaW5nKGRlbHRhcy5wYW4ubWFnKCksIGR1cmF0aW9uLCBleHRlbmQoe30sIGRlZmF1bHRQYW5JbmVydGlhT3B0aW9ucywgcGFuSW5lcnRpYU9wdGlvbnMgfHwge30pKTtcbiAgICAgICAgICAgIGVhc2VPcHRpb25zLm9mZnNldCA9IGRlbHRhcy5wYW4ubXVsdChyZXN1bHQuYW1vdW50IC8gZGVsdGFzLnBhbi5tYWcoKSk7XG4gICAgICAgICAgICBlYXNlT3B0aW9ucy5jZW50ZXIgPSB0aGlzLl9tYXAudHJhbnNmb3JtLmNlbnRlcjtcbiAgICAgICAgICAgIGV4dGVuZER1cmF0aW9uKGVhc2VPcHRpb25zLCByZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlbHRhcy56b29tKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxjdWxhdGVFYXNpbmcoZGVsdGFzLnpvb20sIGR1cmF0aW9uLCBkZWZhdWx0Wm9vbUluZXJ0aWFPcHRpb25zKTtcbiAgICAgICAgICAgIGVhc2VPcHRpb25zLnpvb20gPSB0aGlzLl9tYXAudHJhbnNmb3JtLnpvb20gKyByZXN1bHQuYW1vdW50O1xuICAgICAgICAgICAgZXh0ZW5kRHVyYXRpb24oZWFzZU9wdGlvbnMsIHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVsdGFzLmJlYXJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGN1bGF0ZUVhc2luZyhkZWx0YXMuYmVhcmluZywgZHVyYXRpb24sIGRlZmF1bHRCZWFyaW5nSW5lcnRpYU9wdGlvbnMpO1xuICAgICAgICAgICAgZWFzZU9wdGlvbnMuYmVhcmluZyA9IHRoaXMuX21hcC50cmFuc2Zvcm0uYmVhcmluZyArIGNsYW1wKHJlc3VsdC5hbW91bnQsIC0xNzksIDE3OSk7XG4gICAgICAgICAgICBleHRlbmREdXJhdGlvbihlYXNlT3B0aW9ucywgcmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWx0YXMucGl0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNhbGN1bGF0ZUVhc2luZyhkZWx0YXMucGl0Y2gsIGR1cmF0aW9uLCBkZWZhdWx0UGl0Y2hJbmVydGlhT3B0aW9ucyk7XG4gICAgICAgICAgICBlYXNlT3B0aW9ucy5waXRjaCA9IHRoaXMuX21hcC50cmFuc2Zvcm0ucGl0Y2ggKyByZXN1bHQuYW1vdW50O1xuICAgICAgICAgICAgZXh0ZW5kRHVyYXRpb24oZWFzZU9wdGlvbnMsIHJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWFzZU9wdGlvbnMuem9vbSB8fCBlYXNlT3B0aW9ucy5iZWFyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0ID0gZGVsdGFzLnBpbmNoQXJvdW5kID09PSB1bmRlZmluZWQgPyBkZWx0YXMuYXJvdW5kIDogZGVsdGFzLnBpbmNoQXJvdW5kO1xuICAgICAgICAgICAgZWFzZU9wdGlvbnMuYXJvdW5kID0gbGFzdCA/IHRoaXMuX21hcC51bnByb2plY3QobGFzdCkgOiB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIGVhc2VPcHRpb25zLm5vTW92ZVN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGVhc2VPcHRpb25zO1xuICAgIH1cbn1cblxuLy8gVW5mb3J0dW5hdGVseSB6b29tLCBiZWFyaW5nLCBldGMgY2FuJ3QgaGF2ZSBkaWZmZXJlbnQgZHVyYXRpb25zIGFuZCBlYXNpbmdzIHNvXG4vLyB3ZSBuZWVkIHRvIGNob29zZSBvbmUuIFdlIHVzZSB0aGUgbG9uZ2VzdCBkdXJhdGlvbiBhbmQgaXQncyBjb3JyZXNwb25kaW5nIGVhc2luZy5cbmZ1bmN0aW9uIGV4dGVuZER1cmF0aW9uKGVhc2VPcHRpb25zLCByZXN1bHQpIHtcbiAgICBpZiAoIWVhc2VPcHRpb25zLmR1cmF0aW9uIHx8IGVhc2VPcHRpb25zLmR1cmF0aW9uIDwgcmVzdWx0LmR1cmF0aW9uKSB7XG4gICAgICAgIGVhc2VPcHRpb25zLmR1cmF0aW9uID0gcmVzdWx0LmR1cmF0aW9uO1xuICAgICAgICBlYXNlT3B0aW9ucy5lYXNpbmcgPSByZXN1bHQuZWFzaW5nO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlRWFzaW5nKGFtb3VudCwgaW5lcnRpYUR1cmF0aW9uOiBudW1iZXIsIGluZXJ0aWFPcHRpb25zKSB7XG4gICAgY29uc3Qge21heFNwZWVkLCBsaW5lYXJpdHksIGRlY2VsZXJhdGlvbn0gPSBpbmVydGlhT3B0aW9ucztcbiAgICBjb25zdCBzcGVlZCA9IGNsYW1wKFxuICAgICAgICBhbW91bnQgKiBsaW5lYXJpdHkgLyAoaW5lcnRpYUR1cmF0aW9uIC8gMTAwMCksXG4gICAgICAgIC1tYXhTcGVlZCxcbiAgICAgICAgbWF4U3BlZWQpO1xuICAgIGNvbnN0IGR1cmF0aW9uID0gTWF0aC5hYnMoc3BlZWQpIC8gKGRlY2VsZXJhdGlvbiAqIGxpbmVhcml0eSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZWFzaW5nOiBpbmVydGlhT3B0aW9ucy5lYXNpbmcsXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbiAqIDEwMDAsXG4gICAgICAgIGFtb3VudDogc3BlZWQgKiAoZHVyYXRpb24gLyAyKVxuICAgIH07XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0V2ZW50fSBmcm9tICcuLi91dGlsL2V2ZW50ZWQuanMnO1xuXG5pbXBvcnQgKiBhcyBET00gZnJvbSAnLi4vdXRpbC9kb20uanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuL21hcC5qcyc7XG5pbXBvcnQgdHlwZSBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQuanMnO1xuXG4vKipcbiAqIGBNYXBNb3VzZUV2ZW50YCBpcyBhIGNsYXNzIHVzZWQgYnkgb3RoZXIgY2xhc3NlcyB0byBnZW5lcmF0ZVxuICogbW91c2UgZXZlbnRzIG9mIHNwZWNpZmljIHR5cGVzIHN1Y2ggYXMgJ2NsaWNrJyBvciAnaG92ZXInLlxuICogRm9yIGEgZnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBldmVudHMsIHNlZSBbYE1hcGAgZXZlbnRzXSgvbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpLlxuICpcbiAqIEBleHRlbmRzIHtPYmplY3R9XG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiBhIE1hcE1vdXNlRXZlbnQgb2YgdHlwZSBcImNsaWNrXCJcbiAqIG1hcC5vbignY2xpY2snLCAoZSkgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKGUpO1xuICogICAgIC8vIHtcbiAqICAgICAvLyAgICAgbG5nTGF0OiB7XG4gKiAgICAgLy8gICAgICAgICBsbmc6IDQwLjIwMyxcbiAqICAgICAvLyAgICAgICAgIGxhdDogLTc0LjQ1MVxuICogICAgIC8vICAgICB9LFxuICogICAgIC8vICAgICBvcmlnaW5hbEV2ZW50OiB7Li4ufSxcbiAqICAgICAvLyAgICAgcG9pbnQ6IHtcbiAqICAgICAvLyAgICAgICAgIHg6IDI2NixcbiAqICAgICAvLyAgICAgICAgIHk6IDQ2NFxuICogICAgIC8vICAgICB9LFxuICogICAgIC8vICAgICAgdGFyZ2V0OiB7Li4ufSxcbiAqICAgICAvLyAgICAgIHR5cGU6IFwiY2xpY2tcIlxuICogICAgIC8vIH1cbiAqIH0pO1xuICogQHNlZSBbUmVmZXJlbmNlOiBgTWFwYCBldmVudHMgQVBJIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKVxuICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBwb3B1cCBvbiBjbGlja10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24tY2xpY2svKVxuICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBwb3B1cCBvbiBob3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXBNb3VzZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIG9yaWdpbmF0aW5nIGV2ZW50LiBGb3IgYSBmdWxsIGxpc3Qgb2YgYXZhaWxhYmxlIGV2ZW50cywgc2VlIFtgTWFwYCBldmVudHNdKC9tYXBib3gtZ2wtanMvYXBpL21hcC8jbWFwLWV2ZW50cykuXG4gICAgICovXG4gICAgdHlwZTogJ21vdXNlZG93bidcbiAgICAgICAgfCAnbW91c2V1cCdcbiAgICAgICAgfCAncHJlY2xpY2snXG4gICAgICAgIHwgJ2NsaWNrJ1xuICAgICAgICB8ICdkYmxjbGljaydcbiAgICAgICAgfCAnbW91c2Vtb3ZlJ1xuICAgICAgICB8ICdtb3VzZW92ZXInXG4gICAgICAgIHwgJ21vdXNlZW50ZXInXG4gICAgICAgIHwgJ21vdXNlbGVhdmUnXG4gICAgICAgIHwgJ21vdXNlb3V0J1xuICAgICAgICB8ICdjb250ZXh0bWVudSc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYE1hcGAgb2JqZWN0IHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIHRhcmdldDogTWFwO1xuXG4gICAgLyoqXG4gICAgICogVGhlIERPTSBldmVudCB3aGljaCBjYXVzZWQgdGhlIG1hcCBldmVudC5cbiAgICAgKi9cbiAgICBvcmlnaW5hbEV2ZW50OiBNb3VzZUV2ZW50O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBpeGVsIGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBjdXJzb3IsIHJlbGF0aXZlIHRvIHRoZSBtYXAgYW5kIG1lYXN1cmVkIGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lci5cbiAgICAgKi9cbiAgICBwb2ludDogUG9pbnQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBvbiB0aGUgbWFwIG9mIHRoZSBtb3VzZSBjdXJzb3IuXG4gICAgICovXG4gICAgbG5nTGF0OiBMbmdMYXQ7XG5cbiAgICAvKipcbiAgICAgKiBJZiBhIHNpbmdsZSBgbGF5ZXJJZGAoYXMgYSBzaW5nbGUgc3RyaW5nKSBvciBtdWx0aXBsZSBgbGF5ZXJJZHNgIChhcyBhbiBhcnJheSBvZiBzdHJpbmdzKSB3ZXJlIHNwZWNpZmllZCB3aGVuIGFkZGluZyB0aGUgZXZlbnQgbGlzdGVuZXIgd2l0aCB7QGxpbmsgTWFwI29ufSxcbiAgICAgKiBgZmVhdHVyZXNgIHdpbGwgYmUgYW4gYXJyYXkgb2YgW0dlb0pTT05dKGh0dHA6Ly9nZW9qc29uLm9yZy8pIFtGZWF0dXJlIG9iamVjdHNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3OTQ2I3NlY3Rpb24tMy4yKS5cbiAgICAgKiBUaGUgYXJyYXkgd2lsbCBjb250YWluIGFsbCBmZWF0dXJlcyBmcm9tIHRoYXQgbGF5ZXIgdGhhdCBhcmUgcmVuZGVyZWQgYXQgdGhlIGV2ZW50J3MgcG9pbnQsXG4gICAgICogaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcmUgcmVuZGVyZWQgd2l0aCB0aGUgdG9wbW9zdCBmZWF0dXJlIGJlaW5nIGF0IHRoZSBzdGFydCBvZiB0aGUgYXJyYXkuXG4gICAgICogVGhlIGBmZWF0dXJlc2AgYXJlIGlkZW50aWNhbCB0byB0aG9zZSByZXR1cm5lZCBieSB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30uXG4gICAgICpcbiAgICAgKiBJZiBubyBgbGF5ZXJJZGAgd2FzIHNwZWNpZmllZCB3aGVuIGFkZGluZyB0aGUgZXZlbnQgbGlzdGVuZXIsIGBmZWF0dXJlc2Agd2lsbCBiZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBZb3UgY2FuIGdldCB0aGUgZmVhdHVyZXMgYXQgdGhlIHBvaW50IHdpdGggYG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZS5wb2ludClgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBsb2dnaW5nIGZlYXR1cmVzIGZvciBhIHNwZWNpZmljIGxheWVyICh3aXRoIGBlLmZlYXR1cmVzYClcbiAgICAgKiBtYXAub24oJ2NsaWNrJywgJ215TGF5ZXJJZCcsIChlKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBUaGVyZSBhcmUgJHtlLmZlYXR1cmVzLmxlbmd0aH0gZmVhdHVyZXMgYXQgcG9pbnQgJHtlLnBvaW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBsb2dnaW5nIGZlYXR1cmVzIGZvciB0d28gbGF5ZXJzICh3aXRoIGBlLmZlYXR1cmVzYClcbiAgICAgKiBtYXAub24oJ2NsaWNrJywgWydsYXllcjEnLCAnbGF5ZXIyJ10sIChlKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBUaGVyZSBhcmUgJHtlLmZlYXR1cmVzLmxlbmd0aH0gZmVhdHVyZXMgYXQgcG9pbnQgJHtlLnBvaW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBsb2dnaW5nIGFsbCBmZWF0dXJlcyBmb3IgYWxsIGxheWVycyAod2l0aG91dCBgZS5mZWF0dXJlc2ApXG4gICAgICogbWFwLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICogICAgIGNvbnN0IGZlYXR1cmVzID0gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50KTtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYFRoZXJlIGFyZSAke2ZlYXR1cmVzLmxlbmd0aH0gZmVhdHVyZXMgYXQgcG9pbnQgJHtlLnBvaW50fWApO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGZlYXR1cmVzOiBBcnJheTxPYmplY3Q+IHwgdm9pZDtcblxuICAgIC8qKlxuICAgICAqIFByZXZlbnRzIHN1YnNlcXVlbnQgZGVmYXVsdCBwcm9jZXNzaW5nIG9mIHRoZSBldmVudCBieSB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHByZXZlbnQgdGhlIGZvbGxvd2luZyBkZWZhdWx0IG1hcCBiZWhhdmlvcnM6XG4gICAgICpcbiAgICAgKiAgICogT24gYG1vdXNlZG93bmAgZXZlbnRzLCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIERyYWdQYW5IYW5kbGVyfS5cbiAgICAgKiAgICogT24gYG1vdXNlZG93bmAgZXZlbnRzLCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIERyYWdSb3RhdGVIYW5kbGVyfS5cbiAgICAgKiAgICogT24gYG1vdXNlZG93bmAgZXZlbnRzLCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIEJveFpvb21IYW5kbGVyfS5cbiAgICAgKiAgICogT24gYGRibGNsaWNrYCBldmVudHMsIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgRG91YmxlQ2xpY2tab29tSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAqICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiBgcHJldmVudERlZmF1bHRgIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0UHJldmVudGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFByZXZlbnRlZDtcbiAgICB9XG5cbiAgICBfZGVmYXVsdFByZXZlbnRlZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBtYXA6IE1hcCwgb3JpZ2luYWxFdmVudDogTW91c2VFdmVudCwgZGF0YTogT2JqZWN0ID0ge30pIHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBET00ubW91c2VQb3MobWFwLmdldENhbnZhc0NvbnRhaW5lcigpLCBvcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgY29uc3QgbG5nTGF0ID0gbWFwLnVucHJvamVjdChwb2ludCk7XG4gICAgICAgIHN1cGVyKHR5cGUsIGV4dGVuZCh7cG9pbnQsIGxuZ0xhdCwgb3JpZ2luYWxFdmVudH0sIGRhdGEpKTtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRhcmdldCA9IG1hcDtcbiAgICB9XG59XG5cbi8qKlxuICogYE1hcFRvdWNoRXZlbnRgIGlzIGEgY2xhc3MgdXNlZCBieSBvdGhlciBjbGFzc2VzIHRvIGdlbmVyYXRlXG4gKiBtb3VzZSBldmVudHMgb2Ygc3BlY2lmaWMgdHlwZXMgc3VjaCBhcyAndG91Y2hzdGFydCcgb3IgJ3RvdWNoZW5kJy5cbiAqIEZvciBhIGZ1bGwgbGlzdCBvZiBhdmFpbGFibGUgZXZlbnRzLCBzZWUgW2BNYXBgIGV2ZW50c10oL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKS5cbiAqXG4gKiBAZXh0ZW5kcyB7T2JqZWN0fVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIGEgTWFwVG91Y2hFdmVudCBvZiB0eXBlIFwidG91Y2hcIlxuICogbWFwLm9uKCd0b3VjaHN0YXJ0JywgKGUpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZyhlKTtcbiAqICAgICAvLyB7XG4gKiAgICAgLy8gICBsbmdMYXQ6IHtcbiAqICAgICAvLyAgICAgIGxuZzogNDAuMjAzLFxuICogICAgIC8vICAgICAgbGF0OiAtNzQuNDUxXG4gKiAgICAgLy8gICB9LFxuICogICAgIC8vICAgbG5nTGF0czogW1xuICogICAgIC8vICAgICAge1xuICogICAgIC8vICAgICAgICAgbG5nOiA0MC4yMDMsXG4gKiAgICAgLy8gICAgICAgICBsYXQ6IC03NC40NTFcbiAqICAgICAvLyAgICAgIH1cbiAqICAgICAvLyAgIF0sXG4gKiAgICAgLy8gICBvcmlnaW5hbEV2ZW50OiB7Li4ufSxcbiAqICAgICAvLyAgIHBvaW50OiB7XG4gKiAgICAgLy8gICAgICB4OiAyNjYsXG4gKiAgICAgLy8gICAgICB5OiA0NjRcbiAqICAgICAvLyAgIH0sXG4gKiAgICAgLy8gICBwb2ludHM6IFtcbiAqICAgICAvLyAgICAgIHtcbiAqICAgICAvLyAgICAgICAgIHg6IDI2NixcbiAqICAgICAvLyAgICAgICAgIHk6IDQ2NFxuICogICAgIC8vICAgICAgfVxuICogICAgIC8vICAgXVxuICogICAgIC8vICAgcHJldmVudERlZmF1bHQoKSxcbiAqICAgICAvLyAgIHRhcmdldDogey4uLn0sXG4gKiAgICAgLy8gICB0eXBlOiBcInRvdWNoc3RhcnRcIlxuICogICAgIC8vIH1cbiAqIH0pO1xuICogQHNlZSBbUmVmZXJlbmNlOiBgTWFwYCBldmVudHMgQVBJIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKVxuICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICovXG5leHBvcnQgY2xhc3MgTWFwVG91Y2hFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBvcmlnaW5hdGluZyBldmVudC4gRm9yIGEgZnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBldmVudHMsIHNlZSBbYE1hcGAgZXZlbnRzXSgvbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpLlxuICAgICAqL1xuICAgIHR5cGU6ICd0b3VjaHN0YXJ0J1xuICAgICAgICB8ICd0b3VjaGVuZCdcbiAgICAgICAgfCAndG91Y2hjYW5jZWwnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGBNYXBgIG9iamVjdCB0aGF0IGZpcmVkIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICB0YXJnZXQ6IE1hcDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBET00gZXZlbnQgd2hpY2ggY2F1c2VkIHRoZSBtYXAgZXZlbnQuXG4gICAgICovXG4gICAgb3JpZ2luYWxFdmVudDogVG91Y2hFdmVudDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBnZW9ncmFwaGljIGxvY2F0aW9uIG9uIHRoZSBtYXAgb2YgdGhlIGNlbnRlciBvZiB0aGUgdG91Y2ggZXZlbnQgcG9pbnRzLlxuICAgICAqL1xuICAgIGxuZ0xhdDogTG5nTGF0O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBpeGVsIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHRvdWNoIGV2ZW50IHBvaW50cywgcmVsYXRpdmUgdG8gdGhlIG1hcCBhbmQgbWVhc3VyZWQgZnJvbSB0aGUgdG9wIGxlZnRcbiAgICAgKiBjb3JuZXIuXG4gICAgICovXG4gICAgcG9pbnQ6IFBvaW50O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFycmF5IG9mIHBpeGVsIGNvb3JkaW5hdGVzIGNvcnJlc3BvbmRpbmcgdG8gYVxuICAgICAqIFt0b3VjaCBldmVudCdzIGB0b3VjaGVzYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RvdWNoRXZlbnQvdG91Y2hlcykgcHJvcGVydHkuXG4gICAgICovXG4gICAgcG9pbnRzOiBBcnJheTxQb2ludD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9ucyBvbiB0aGUgbWFwIGNvcnJlc3BvbmRpbmcgdG8gYVxuICAgICAqIFt0b3VjaCBldmVudCdzIGB0b3VjaGVzYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RvdWNoRXZlbnQvdG91Y2hlcykgcHJvcGVydHkuXG4gICAgICovXG4gICAgbG5nTGF0czogQXJyYXk8TG5nTGF0PjtcblxuICAgIC8qKlxuICAgICAqIElmIGEgYGxheWVySWRgIHdhcyBzcGVjaWZpZWQgd2hlbiBhZGRpbmcgdGhlIGV2ZW50IGxpc3RlbmVyIHdpdGgge0BsaW5rIE1hcCNvbn0sIGBmZWF0dXJlc2Agd2lsbCBiZSBhbiBhcnJheSBvZlxuICAgICAqIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKSBbRmVhdHVyZSBvYmplY3RzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzk0NiNzZWN0aW9uLTMuMikuXG4gICAgICogVGhlIGFycmF5IHdpbGwgY29udGFpbiBhbGwgZmVhdHVyZXMgZnJvbSB0aGF0IGxheWVyIHRoYXQgYXJlIHJlbmRlcmVkIGF0IHRoZSBldmVudCdzIHBvaW50LlxuICAgICAqIFRoZSBgZmVhdHVyZXNgIGFyZSBpZGVudGljYWwgdG8gdGhvc2UgcmV0dXJuZWQgYnkge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9LlxuICAgICAqXG4gICAgICogSWYgbm8gYGxheWVySWRgIHdhcyBzcGVjaWZpZWQgd2hlbiBhZGRpbmcgdGhlIGV2ZW50IGxpc3RlbmVyLCBgZmVhdHVyZXNgIHdpbGwgYmUgYHVuZGVmaW5lZGAuXG4gICAgICogWW91IGNhbiBnZXQgdGhlIGZlYXR1cmVzIGF0IHRoZSBwb2ludCB3aXRoIGBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKGUucG9pbnQpYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gbG9nZ2luZyBmZWF0dXJlcyBmb3IgYSBzcGVjaWZpYyBsYXllciAod2l0aCBgZS5mZWF0dXJlc2ApXG4gICAgICogbWFwLm9uKCd0b3VjaHN0YXJ0JywgJ215TGF5ZXJJZCcsIChlKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBUaGVyZSBhcmUgJHtlLmZlYXR1cmVzLmxlbmd0aH0gZmVhdHVyZXMgYXQgcG9pbnQgJHtlLnBvaW50fWApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBsb2dnaW5nIGFsbCBmZWF0dXJlcyBmb3IgYWxsIGxheWVycyAod2l0aG91dCBgZS5mZWF0dXJlc2ApXG4gICAgICogbWFwLm9uKCd0b3VjaHN0YXJ0JywgKGUpID0+IHtcbiAgICAgKiAgICAgY29uc3QgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKGUucG9pbnQpO1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgVGhlcmUgYXJlICR7ZmVhdHVyZXMubGVuZ3RofSBmZWF0dXJlcyBhdCBwb2ludCAke2UucG9pbnR9YCk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgZmVhdHVyZXM6IEFycmF5PE9iamVjdD4gfCB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogUHJldmVudHMgc3Vic2VxdWVudCBkZWZhdWx0IHByb2Nlc3Npbmcgb2YgdGhlIGV2ZW50IGJ5IHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgcHJldmVudCB0aGUgZm9sbG93aW5nIGRlZmF1bHQgbWFwIGJlaGF2aW9yczpcbiAgICAgKlxuICAgICAqICAgKiBPbiBgdG91Y2hzdGFydGAgZXZlbnRzLCB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rIERyYWdQYW5IYW5kbGVyfS5cbiAgICAgKiAgICogT24gYHRvdWNoc3RhcnRgIGV2ZW50cywgdGhlIGJlaGF2aW9yIG9mIHtAbGluayBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLm9uKCd0b3VjaHN0YXJ0JywgKGUpID0+IHtcbiAgICAgKiAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHByZXZlbnREZWZhdWx0KCkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBgcHJldmVudERlZmF1bHRgIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldCBkZWZhdWx0UHJldmVudGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFByZXZlbnRlZDtcbiAgICB9XG5cbiAgICBfZGVmYXVsdFByZXZlbnRlZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBtYXA6IE1hcCwgb3JpZ2luYWxFdmVudDogVG91Y2hFdmVudCkge1xuICAgICAgICBjb25zdCB0b3VjaGVzID0gdHlwZSA9PT0gXCJ0b3VjaGVuZFwiID8gb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlcyA6IG9yaWdpbmFsRXZlbnQudG91Y2hlcztcbiAgICAgICAgY29uc3QgcG9pbnRzID0gRE9NLnRvdWNoUG9zKG1hcC5nZXRDYW52YXNDb250YWluZXIoKSwgdG91Y2hlcyk7XG4gICAgICAgIGNvbnN0IGxuZ0xhdHMgPSBwb2ludHMubWFwKCh0KSA9PiBtYXAudW5wcm9qZWN0KHQpKTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBwb2ludHMucmVkdWNlKChwcmV2LCBjdXJyLCBpLCBhcnIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwcmV2LmFkZChjdXJyLmRpdihhcnIubGVuZ3RoKSk7XG4gICAgICAgIH0sIG5ldyBQb2ludCgwLCAwKSk7XG4gICAgICAgIGNvbnN0IGxuZ0xhdCA9IG1hcC51bnByb2plY3QocG9pbnQpO1xuICAgICAgICBzdXBlcih0eXBlLCB7cG9pbnRzLCBwb2ludCwgbG5nTGF0cywgbG5nTGF0LCBvcmlnaW5hbEV2ZW50fSk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogYE1hcFdoZWVsRXZlbnRgIGlzIGEgY2xhc3MgdXNlZCBieSBvdGhlciBjbGFzc2VzIHRvIGdlbmVyYXRlXG4gKiBtb3VzZSBldmVudHMgb2Ygc3BlY2lmaWMgdHlwZXMgc3VjaCBhcyAnd2hlZWwnLlxuICogRm9yIGEgZnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBldmVudHMsIHNlZSBbYE1hcGAgZXZlbnRzXSgvbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpLlxuICpcbiAqIEBleHRlbmRzIHtPYmplY3R9XG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBldmVudCB0cmlnZ2VyIGZvciBhIE1hcFdoZWVsRXZlbnQgb2YgdHlwZSBcIndoZWVsXCJcbiAqIG1hcC5vbignd2hlZWwnLCAoZSkgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKCdldmVudCB0eXBlOicsIGUudHlwZSk7XG4gKiAgICAgLy8gZXZlbnQgdHlwZTogd2hlZWxcbiAqIH0pO1xuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgYSBNYXBXaGVlbEV2ZW50IG9mIHR5cGUgXCJ3aGVlbFwiXG4gKiAvLyB7XG4gKiAvLyAgIG9yaWdpbmFsRXZlbnQ6IFdoZWVsRXZlbnQgey4uLn0sXG4gKiAvLyBcdCB0YXJnZXQ6IE1hcCB7Li4ufSxcbiAqIC8vIFx0IHR5cGU6IFwid2hlZWxcIlxuICogLy8gfVxuICogQHNlZSBbUmVmZXJlbmNlOiBgTWFwYCBldmVudHMgQVBJIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKVxuICovXG5leHBvcnQgY2xhc3MgTWFwV2hlZWxFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBvcmlnaW5hdGluZyBldmVudC4gRm9yIGEgZnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBldmVudHMsIHNlZSBbYE1hcGAgZXZlbnRzXSgvbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpLlxuICAgICAqL1xuICAgIHR5cGU6ICd3aGVlbCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYE1hcGAgb2JqZWN0IHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIHRhcmdldDogTWFwO1xuXG4gICAgLyoqXG4gICAgICogVGhlIERPTSBldmVudCB3aGljaCBjYXVzZWQgdGhlIG1hcCBldmVudC5cbiAgICAgKi9cbiAgICBvcmlnaW5hbEV2ZW50OiBXaGVlbEV2ZW50O1xuXG4gICAgLyoqXG4gICAgICogUHJldmVudHMgc3Vic2VxdWVudCBkZWZhdWx0IHByb2Nlc3Npbmcgb2YgdGhlIGV2ZW50IGJ5IHRoZSBtYXAuXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHByZXZlbnQgdGhlIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsgU2Nyb2xsWm9vbUhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAub24oJ3doZWVsJywgKGUpID0+IHtcbiAgICAgKiAgICAgLy8gUHJldmVudCB0aGUgZGVmYXVsdCBtYXAgc2Nyb2xsIHpvb20gYmVoYXZpb3IuXG4gICAgICogICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBwcmV2ZW50RGVmYXVsdCgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIGBwcmV2ZW50RGVmYXVsdGAgaGFzIGJlZW4gY2FsbGVkLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRQcmV2ZW50ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0UHJldmVudGVkO1xuICAgIH1cblxuICAgIF9kZWZhdWx0UHJldmVudGVkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih0eXBlOiBzdHJpbmcsIG1hcDogTWFwLCBvcmlnaW5hbEV2ZW50OiBXaGVlbEV2ZW50KSB7XG4gICAgICAgIHN1cGVyKHR5cGUsIHtvcmlnaW5hbEV2ZW50fSk7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogYE1hcEJveFpvb21FdmVudGAgaXMgYSBjbGFzcyB1c2VkIHRvIGdlbmVyYXRlXG4gKiB0aGUgZXZlbnRzICdib3h6b29tc3RhcnQnLCAnYm94em9vbWVuZCcsIGFuZCAnYm94em9vbWNhbmNlbCcuXG4gKiBGb3IgYSBmdWxsIGxpc3Qgb2YgYXZhaWxhYmxlIGV2ZW50cywgc2VlIFtgTWFwYCBldmVudHNdKC9tYXBib3gtZ2wtanMvYXBpL21hcC8jbWFwLWV2ZW50cykuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFwQm94Wm9vbUV2ZW50XG4gKiBAcHJvcGVydHkge01vdXNlRXZlbnR9IG9yaWdpbmFsRXZlbnQgVGhlIERPTSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgYm94em9vbSBldmVudC4gQ2FuIGJlIGEgYE1vdXNlRXZlbnRgIG9yIGBLZXlib2FyZEV2ZW50YC5cbiAqIEBwcm9wZXJ0eSB7KCdib3h6b29tc3RhcnQnIHwgJ2JveHpvb21lbmQnIHwgJ2JveHpvb21jYW5jZWwnKX0gdHlwZSBUaGUgdHlwZSBvZiBvcmlnaW5hdGluZyBldmVudC4gRm9yIGEgZnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBldmVudHMsIHNlZSBbYE1hcGAgZXZlbnRzXSgvbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1ldmVudHMpLlxuICogQHByb3BlcnR5IHtNYXB9IHRhcmdldCBUaGUgYE1hcGAgaW5zdGFuY2UgdGhhdCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgdHJpZ2dlciBvZiBhIEJveFpvb21FdmVudCBvZiB0eXBlIFwiYm94em9vbXN0YXJ0XCJcbiAqIG1hcC5vbignYm94em9vbXN0YXJ0JywgKGUpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZygnZXZlbnQgdHlwZTonLCBlLnR5cGUpO1xuICogICAgIC8vIGV2ZW50IHR5cGU6IGJveHpvb21zdGFydFxuICogfSk7XG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiBhIEJveFpvb21FdmVudCBvZiB0eXBlIFwiYm94em9vbXN0YXJ0XCJcbiAqIC8vIHtcbiAqIC8vICAgb3JpZ2luYWxFdmVudDogey4uLn0sXG4gKiAvLyAgIHR5cGU6IFwiYm94em9vbXN0YXJ0XCIsXG4gKiAvLyAgIHRhcmdldDogey4uLn1cbiAqIC8vIH1cbiAqIEBzZWUgW1JlZmVyZW5jZTogYE1hcGAgZXZlbnRzIEFQSSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvYXBpL21hcC8jbWFwLWV2ZW50cylcbiAqIEBzZWUgW0V4YW1wbGU6IEhpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICovXG5leHBvcnQgdHlwZSBNYXBCb3hab29tRXZlbnQgPSB7XG4gICAgdHlwZTogJ2JveHpvb21zdGFydCdcbiAgICAgICAgfCAnYm94em9vbWVuZCdcbiAgICAgICAgfCAnYm94em9vbWNhbmNlbCcsXG4gICAgdGFyZ2V0OiBNYXAsXG4gICAgb3JpZ2luYWxFdmVudDogTW91c2VFdmVudFxufTtcblxuLyoqXG4gKiBgTWFwRGF0YUV2ZW50YCBpcyBhIGNsYXNzIHVzZWQgdG8gZ2VuZXJhdGVcbiAqIGV2ZW50cyByZWxhdGVkIHRvIGxvYWRpbmcgZGF0YSwgc3R5bGVzLCBhbmQgc291cmNlcy5cbiAqIEZvciBhIGZ1bGwgbGlzdCBvZiBhdmFpbGFibGUgZXZlbnRzLCBzZWUgW2BNYXBgIGV2ZW50c10oL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKS5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYXBEYXRhRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KCdkYXRhJyB8ICdkYXRhbG9hZGluZycgfCAnc3R5bGVkYXRhJyB8ICdzdHlsZWRhdGFsb2FkaW5nJyB8ICdzb3VyY2VkYXRhJ3wgJ3NvdXJjZWRhdGFsb2FkaW5nJyl9IHR5cGUgVGhlIHR5cGUgb2Ygb3JpZ2luYXRpbmcgZXZlbnQuIEZvciBhIGZ1bGwgbGlzdCBvZiBhdmFpbGFibGUgZXZlbnRzLCBzZWUgW2BNYXBgIGV2ZW50c10oL21hcGJveC1nbC1qcy9hcGkvbWFwLyNtYXAtZXZlbnRzKS5cbiAqIEBwcm9wZXJ0eSB7KCdzb3VyY2UnIHwgJ3N0eWxlJyl9IGRhdGFUeXBlIFRoZSB0eXBlIG9mIGRhdGEgdGhhdCBoYXMgY2hhbmdlZC4gT25lIG9mIGAnc291cmNlJ2Agb3IgYCdzdHlsZSdgLCB3aGVyZSBgJ3NvdXJjZSdgIHJlZmVycyB0byB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW55IHNvdXJjZSwgYW5kIGAnc3R5bGUnYCByZWZlcnMgdG8gdGhlIGVudGlyZSBbc3R5bGVdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3Nhcnkvc3R5bGUvKSB1c2VkIGJ5IHRoZSBtYXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpc1NvdXJjZUxvYWRlZF0gVHJ1ZSBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYCBhbmQgdGhlIHNvdXJjZSBoYXMgbm8gb3V0c3RhbmRpbmcgbmV0d29yayByZXF1ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbc291cmNlXSBUaGUgW3N0eWxlIHNwZWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNvdXJjZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvc291cmNlcy8pIGlmIHRoZSBldmVudCBoYXMgYSBgZGF0YVR5cGVgIG9mIGBzb3VyY2VgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzb3VyY2VJZF0gVGhlIGBpZGAgb2YgdGhlIFtgc291cmNlYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvc291cmNlcy8pIHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudCwgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAuIFNhbWUgYXMgdGhlIGBpZGAgb2YgdGhlIG9iamVjdCBpbiB0aGUgYHNvdXJjZWAgcHJvcGVydHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NvdXJjZURhdGFUeXBlXSBJbmNsdWRlZCBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYCBhbmQgdGhlIGV2ZW50IHNpZ25hbHNcbiAqIHRoYXQgaW50ZXJuYWwgZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBvciBjaGFuZ2VkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGBtZXRhZGF0YWAsIGBjb250ZW50YCBhbmQgYHZpc2liaWxpdHlgLlxuICogQHByb3BlcnR5IHtPYmplY3R9IFt0aWxlXSBUaGUgdGlsZSBiZWluZyBsb2FkZWQgb3IgY2hhbmdlZCwgaWYgdGhlIGV2ZW50IGhhcyBhIGBkYXRhVHlwZWAgb2YgYHNvdXJjZWAgYW5kXG4gKiB0aGUgZXZlbnQgaXMgcmVsYXRlZCB0byBsb2FkaW5nIG9mIGEgdGlsZS5cbiAqIEBwcm9wZXJ0eSB7Q29vcmRpbmF0ZX0gW2Nvb3JkXSBUaGUgY29vcmRpbmF0ZSBvZiB0aGUgdGlsZSBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYCBhbmRcbiAqIHRoZSBldmVudCBpcyByZWxhdGVkIHRvIGxvYWRpbmcgb2YgYSB0aWxlLlxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgb2YgYSBNYXBEYXRhRXZlbnQgb2YgdHlwZSBcInNvdXJjZWRhdGFcIlxuICogbWFwLm9uKCdzb3VyY2VkYXRhJywgKGUpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZyhlKTtcbiAqICAgICAvLyB7XG4gKiAgICAgLy8gICBkYXRhVHlwZTogXCJzb3VyY2VcIixcbiAqICAgICAvLyAgIGlzU291cmNlTG9hZGVkOiBmYWxzZSxcbiAqICAgICAvLyAgIHNvdXJjZToge1xuICogICAgIC8vICAgICB0eXBlOiBcInZlY3RvclwiLFxuICogICAgIC8vICAgICB1cmw6IFwibWFwYm94Oi8vbWFwYm94Lm1hcGJveC1zdHJlZXRzLXY4LG1hcGJveC5tYXBib3gtdGVycmFpbi12MlwiXG4gKiAgICAgLy8gICB9LFxuICogICAgIC8vICAgc291cmNlRGF0YVR5cGU6IFwidmlzaWJpbGl0eVwiLFxuICogICAgIC8vICAgc291cmNlSWQ6IFwiY29tcG9zaXRlXCIsXG4gKiAgICAgLy8gICBzdHlsZTogey4uLn0sXG4gKiAgICAgLy8gICB0YXJnZXQ6IHsuLi59LFxuICogICAgIC8vICAgdHlwZTogXCJzb3VyY2VkYXRhXCJcbiAqICAgICAvLyB9XG4gKiB9KTtcbiAqIEBzZWUgW1JlZmVyZW5jZTogYE1hcGAgZXZlbnRzIEFQSSBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvYXBpL21hcC8jbWFwLWV2ZW50cylcbiAqIEBzZWUgW0V4YW1wbGU6IENoYW5nZSBhIG1hcCdzIHN0eWxlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9zZXRzdHlsZS8pXG4gKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSBHZW9KU09OIGxpbmVdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dlb2pzb24tbGluZS8pXG4gKi9cbmV4cG9ydCB0eXBlIE1hcERhdGFFdmVudCA9IHtcbiAgICB0eXBlOiAnZGF0YSdcbiAgICAgICAgfCAnZGF0YWxvYWRpbmcnXG4gICAgICAgIHwgJ3N0eWxlZGF0YSdcbiAgICAgICAgfCAnc3R5bGVkYXRhbG9hZGluZydcbiAgICAgICAgfCAnc291cmNlZGF0YSdcbiAgICAgICAgfCAnc291cmNlZGF0YWxvYWRpbmcnLFxuICAgIGRhdGFUeXBlOiAnc291cmNlJ1xuICAgICAgICB8ICdzdHlsZSdcbn07XG5cbmV4cG9ydCB0eXBlIE1hcENvbnRleHRFdmVudCA9IHtcbiAgICB0eXBlOiAnd2ViZ2xjb250ZXh0bG9zdCcgfCAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnLFxuICAgIG9yaWdpbmFsRXZlbnQ6IFdlYkdMQ29udGV4dEV2ZW50XG59XG5cbmV4cG9ydCB0eXBlIE1hcEV2ZW50ID1cbiAgICAvKiogQHNlY3Rpb24ge0ludGVyYWN0aW9ufVxuICAgICAqIEBldmVudFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXAgKi9cblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgcHJlc3NlZCB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGV2ZW50IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW9uYWwgYGxheWVySWRgIHBhcmFtZXRlci5cbiAgICAgKiBJZiBgbGF5ZXJJZGAgaXMgaW5jbHVkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBpbiB7QGxpbmsgTWFwI29ufSwgdGhlIGV2ZW50IGxpc3RlbmVyIHdpbGwgZmlyZSBvbmx5IHdoZW4gdGhlXG4gICAgICogdGhlIGN1cnNvciBpcyBwcmVzc2VkIHdoaWxlIGluc2lkZSBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmZWQgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW91c2Vkb3duXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBNb3VzZUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICogbWFwLm9uKCdtb3VzZWRvd24nLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIG1vdXNlZG93biBldmVudCBoYXMgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIGEgc3BlY2lmaWMgbGF5ZXJcbiAgICAgKiBtYXAub24oJ21vdXNlZG93bicsICdwb2ktbGFiZWwnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIG1vdXNlZG93biBldmVudCBoYXMgb2NjdXJyZWQgb24gYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHBvaS1sYWJlbCBsYXllci4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91c2luZy1ib3gtcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgfCAnbW91c2Vkb3duJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyByZWxlYXNlZCB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGV2ZW50IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW9uYWwgYGxheWVySWRgIHBhcmFtZXRlci5cbiAgICAgKiBJZiBgbGF5ZXJJZGAgaXMgaW5jbHVkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBpbiB7QGxpbmsgTWFwI29ufSwgdGhlIGV2ZW50IGxpc3RlbmVyIHdpbGwgZmlyZSBvbmx5IHdoZW4gdGhlXG4gICAgICogdGhlIGN1cnNvciBpcyByZWxlYXNlZCB3aGlsZSBpbnNpZGUgYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHNwZWNpZmVkIGxheWVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNldXBcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBtYXAub24oJ21vdXNldXAnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIG1vdXNldXAgZXZlbnQgaGFzIG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGxheWVyXG4gICAgICogbWFwLm9uKCdtb3VzZXVwJywgJ3BvaS1sYWJlbCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgbW91c2V1cCBldmVudCBoYXMgb2NjdXJyZWQgb24gYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHBvaS1sYWJlbCBsYXllci4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91c2luZy1ib3gtcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgfCAnbW91c2V1cCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgbW92ZWQgd2l0aGluIHRoZSBtYXAuXG4gICAgICogQXMgeW91IG1vdmUgdGhlIGN1cnNvciBhY3Jvc3MgYSB3ZWIgcGFnZSBjb250YWluaW5nIGEgbWFwLFxuICAgICAqIHRoZSBldmVudCB3aWxsIGZpcmUgZWFjaCB0aW1lIGl0IGVudGVycyB0aGUgbWFwIG9yIGFueSBjaGlsZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGV2ZW50IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW9uYWwgYGxheWVySWRgIHBhcmFtZXRlci5cbiAgICAgKiBJZiBgbGF5ZXJJZGAgaXMgaW5jbHVkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBpbiB7QGxpbmsgTWFwI29ufSwgdGhlIGV2ZW50IGxpc3RlbmVyIHdpbGwgZmlyZSBvbmx5IHdoZW4gdGhlXG4gICAgICogdGhlIGN1cnNvciBpcyBtb3ZlZCBpbnNpZGUgYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHNwZWNpZmVkIGxheWVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlb3ZlclxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAqIG1hcC5vbignbW91c2VvdmVyJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBtb3VzZW92ZXIgZXZlbnQgaGFzIG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGxheWVyXG4gICAgICogbWFwLm9uKCdtb3VzZW92ZXInLCAncG9pLWxhYmVsJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBtb3VzZW92ZXIgZXZlbnQgaGFzIG9jY3VycmVkIG9uIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBwb2ktbGFiZWwgbGF5ZXIuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogR2V0IGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21vdXNlLXBvc2l0aW9uLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBIaWdobGlnaHQgZmVhdHVyZXMgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaG92ZXItc3R5bGVzLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGEgcG9wdXAgb24gaG92ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24taG92ZXIvKVxuICAgICAqL1xuICAgIHwgJ21vdXNlb3ZlcidcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgbW92ZWQgd2hpbGUgdGhlIGN1cnNvciBpcyBpbnNpZGUgdGhlIG1hcC5cbiAgICAgKiBBcyB5b3UgbW92ZSB0aGUgY3Vyc29yIGFjcm9zcyB0aGUgbWFwLCB0aGUgZXZlbnQgd2lsbCBmaXJlIGV2ZXJ5IHRpbWUgdGhlIGN1cnNvciBjaGFuZ2VzIHBvc2l0aW9uIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZXZlbnQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvcHRpb25hbCBgbGF5ZXJJZGAgcGFyYW1ldGVyLlxuICAgICAqIElmIGBsYXllcklkYCBpcyBpbmNsdWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IGluIHtAbGluayBNYXAjb259LCB0aGUgZXZlbnQgbGlzdGVuZXIgd2lsbCBmaXJlIG9ubHkgd2hlbiB0aGVcbiAgICAgKiB0aGUgY3Vyc29yIGlzIGluc2lkZSBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxheWVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlbW92ZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAqIG1hcC5vbignbW91c2Vtb3ZlJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBtb3VzZW1vdmUgZXZlbnQgaGFzIG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIGZvciBhIHNwZWNpZmljIGxheWVyXG4gICAgICogbWFwLm9uKCdtb3VzZW1vdmUnLCAncG9pLWxhYmVsJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBtb3VzZW1vdmUgZXZlbnQgaGFzIG9jY3VycmVkIG9uIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBwb2ktbGFiZWwgbGF5ZXIuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogR2V0IGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZSBwb2ludGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21vdXNlLXBvc2l0aW9uLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBIaWdobGlnaHQgZmVhdHVyZXMgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaG92ZXItc3R5bGVzLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGEgcG9wdXAgb24gb3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gICAgICovXG4gICAgfCAnbW91c2Vtb3ZlJ1xuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBjbGljayBldmVudCBvY2N1cnMgYW5kIGlzIGZpcmVkIGJlZm9yZSB0aGUgY2xpY2sgZXZlbnQuXG4gICAgICogUHJpbWFyaWx5IGltcGxlbWVudGVkIHRvIGVuc3VyZSBjbG9zZU9uQ2xpY2sgZm9yIHBvcC11cHMgaXMgZmlyZWQgYmVmb3JlIGFueSBvdGhlciBsaXN0ZW5lcnMuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcHJlY2xpY2tcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnR9XG4gICAgICovXG4gICAgIHwgJ3ByZWNsaWNrJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyBwcmVzc2VkIGFuZCByZWxlYXNlZCBhdCB0aGUgc2FtZSBwb2ludCBvbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZXZlbnQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvcHRpb25hbCBgbGF5ZXJJZGAgcGFyYW1ldGVyLlxuICAgICAqIElmIGBsYXllcklkYCBpcyBpbmNsdWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IGluIHtAbGluayBNYXAjb259LCB0aGUgZXZlbnQgbGlzdGVuZXIgd2lsbCBmaXJlIG9ubHkgd2hlbiB0aGVcbiAgICAgKiBwb2ludCB0aGF0IGlzIHByZXNzZWQgYW5kIHJlbGVhc2VkIGNvbnRhaW5zIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZlZCBsYXllci5cbiAgICAgKlxuICAgICAqIEBldmVudCBjbGlja1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAqIG1hcC5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgQSBjbGljayBldmVudCBoYXMgb2NjdXJyZWQgYXQgJHtlLmxuZ0xhdH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBsYXllclxuICAgICAqIG1hcC5vbignY2xpY2snLCAncG9pLWxhYmVsJywgKGUpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYEEgY2xpY2sgZXZlbnQgaGFzIG9jY3VycmVkIG9uIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBwb2ktbGFiZWwgbGF5ZXIgYXQgJHtlLmxuZ0xhdH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBNZWFzdXJlIGRpc3RhbmNlc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tZWFzdXJlLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDZW50ZXIgdGhlIG1hcCBvbiBhIGNsaWNrZWQgc3ltYm9sXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NlbnRlci1vbi1zeW1ib2wvKVxuICAgICAqL1xuICAgIHwgJ2NsaWNrJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyBwcmVzc2VkIGFuZCByZWxlYXNlZCB0d2ljZSBhdCB0aGUgc2FtZSBwb2ludCBvblxuICAgICAqIHRoZSBtYXAgaW4gcmFwaWQgc3VjY2Vzc2lvbi5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIGV2ZW50IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW9uYWwgYGxheWVySWRgIHBhcmFtZXRlci5cbiAgICAgKiBJZiBgbGF5ZXJJZGAgaXMgaW5jbHVkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBpbiB7QGxpbmsgTWFwI29ufSwgdGhlIGV2ZW50IGxpc3RlbmVyIHdpbGwgZmlyZSBvbmx5XG4gICAgICogd2hlbiB0aGUgcG9pbnQgdGhhdCBpcyBjbGlja2VkIHR3aWNlIGNvbnRhaW5zIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZlZCBsYXllci5cbiAgICAgKlxuICAgICAqIEBldmVudCBkYmxjbGlja1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAqIG1hcC5vbignZGJsY2xpY2snLCAoZSkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgQSBkYmxjbGljayBldmVudCBoYXMgb2NjdXJyZWQgYXQgJHtlLmxuZ0xhdH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciBmb3IgYSBzcGVjaWZpYyBsYXllclxuICAgICAqIG1hcC5vbignZGJsY2xpY2snLCAncG9pLWxhYmVsJywgKGUpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYEEgZGJsY2xpY2sgZXZlbnQgaGFzIG9jY3VycmVkIG9uIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBwb2ktbGFiZWwgbGF5ZXIgYXQgJHtlLmxuZ0xhdH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdkYmxjbGljaydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgZW50ZXJzIGEgdmlzaWJsZSBwb3J0aW9uIG9mIGEgc3BlY2lmaWVkIGxheWVyIGZyb21cbiAgICAgKiBvdXRzaWRlIHRoYXQgbGF5ZXIgb3Igb3V0c2lkZSB0aGUgbWFwIGNhbnZhcy5cbiAgICAgKlxuICAgICAqICoqSW1wb3J0YW50OioqIFRoaXMgZXZlbnQgY2FuIG9ubHkgYmUgbGlzdGVuZWQgZm9yIHdoZW4ge0BsaW5rIE1hcCNvbn0gaW5jbHVkZXMgdGhyZWUgYXJndW1lbnRzLFxuICAgICAqIHdoZXJlIHRoZSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIGxheWVyLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlZW50ZXJcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBtYXAub24oJ21vdXNlZW50ZXInLCAnd2F0ZXInLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIG1vdXNlZW50ZXIgZXZlbnQgb2NjdXJyZWQgb24gYSB2aXNpYmxlIHBvcnRpb24gb2YgdGhlIHdhdGVyIGxheWVyLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IENlbnRlciB0aGUgbWFwIG9uIGEgY2xpY2tlZCBzeW1ib2xdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NlbnRlci1vbi1zeW1ib2wvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgYSBwb3B1cCBvbiBjbGlja10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24tY2xpY2svKVxuICAgICAqL1xuICAgIHwgJ21vdXNlZW50ZXInXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGxlYXZlcyBhIHZpc2libGUgcG9ydGlvbiBvZiBhIHNwZWNpZmllZCBsYXllciBvciBtb3Zlc1xuICAgICAqIGZyb20gdGhlIHNwZWNpZmllZCBsYXllciB0byBvdXRzaWRlIHRoZSBtYXAgY2FudmFzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRvIGRldGVjdCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGNhbnZhcywgaW5kZXBlbmRlbnQgb2YgbGF5ZXIsIHVzZSB7QGxpbmsgTWFwLmV2ZW50Om1vdXNlb3V0fSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogKipJbXBvcnRhbnQ6KiogVGhpcyBldmVudCBjYW4gb25seSBiZSBsaXN0ZW5lZCBmb3Igd2hlbiB7QGxpbmsgTWFwI29ufSBpbmNsdWRlcyB0aHJlZSBhcmd1bWVudHMsXG4gICAgICogd2hlcmUgdGhlIHNlY29uZCBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgbW91c2VsZWF2ZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiB0aGUgcG9pbnRpbmcgZGV2aWNlIGxlYXZlc1xuICAgICAqIC8vIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbGF5ZXIuXG4gICAgICogbWFwLm9uKCdtb3VzZWxlYXZlJywgJ3dhdGVyJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBtb3VzZWxlYXZlIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IEhpZ2hsaWdodCBmZWF0dXJlcyB1bmRlciB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9ob3Zlci1zdHlsZXMvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgYSBwb3B1cCBvbiBjbGlja10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24tY2xpY2svKVxuICAgICAqL1xuICAgIHwgJ21vdXNlbGVhdmUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcG9pbnQgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGxlYXZlcyB0aGUgbWFwJ3MgY2FudmFzLlxuICAgICAqXG4gICAgICogQGV2ZW50IG1vdXNlb3V0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBNb3VzZUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIHRoZSBwb2ludGluZyBkZXZpY2UgbGVhdmVzXG4gICAgICogLy8gdGhlIG1hcCdzIGNhbnZhcy5cbiAgICAgKiBtYXAub24oJ21vdXNlb3V0JywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBtb3VzZW91dCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdtb3VzZW91dCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHJpZ2h0IGJ1dHRvbiBvZiB0aGUgbW91c2UgaXMgY2xpY2tlZCBvciB0aGUgY29udGV4dCBtZW51IGtleSBpcyBwcmVzc2VkIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IGNvbnRleHRtZW51XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBNb3VzZUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIHRoZSByaWdodCBtb3VzZSBidXR0b24gaXNcbiAgICAgKiAvLyBwcmVzc2VkIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqIG1hcC5vbignY29udGV4dG1lbnUnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIGNvbnRleHRtZW51IGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ2NvbnRleHRtZW51J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFtgd2hlZWxgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvd2hlZWwpIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCB3aGVlbFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwV2hlZWxFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiBhIHdoZWVsIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKiBtYXAub24oJ3doZWVsJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSB3aGVlbCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICd3aGVlbCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBbYHRvdWNoc3RhcnRgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvdG91Y2hzdGFydCkgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQGV2ZW50IHRvdWNoc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcFRvdWNoRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gYSBgdG91Y2hzdGFydGAgZXZlbnQgb2NjdXJzIHdpdGhpbiB0aGUgbWFwLlxuICAgICAqIG1hcC5vbigndG91Y2hzdGFydCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgdG91Y2hzdGFydCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgfCAndG91Y2hzdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBbYHRvdWNoZW5kYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL3RvdWNoZW5kKSBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgdG91Y2hlbmRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcFRvdWNoRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXAuXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXMgd2hlbiBhIGB0b3VjaHN0YXJ0YCBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICogbWFwLm9uKCd0b3VjaHN0YXJ0JywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSB0b3VjaHN0YXJ0IGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcbiAgICAgKi9cbiAgICB8ICd0b3VjaGVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBbYHRvdWNobW92ZWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50cy90b3VjaG1vdmUpIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCB0b3VjaG1vdmVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcFRvdWNoRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXAuXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXMgd2hlbiBhIHRvdWNobW92ZSBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICogbWFwLm9uKCd0b3VjaG1vdmUnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHRvdWNobW92ZSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgfCAndG91Y2htb3ZlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFtgdG91Y2hjYW5jZWxgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvdG91Y2hjYW5jZWwpIGV2ZW50IG9jY3VycyB3aXRoaW4gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBldmVudCB0b3VjaGNhbmNlbFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwVG91Y2hFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcC5cbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlcyB3aGVuIGEgYHRvdWNoY2FuY2VsYCBldmVudCBvY2N1cnMgd2l0aGluIHRoZSBtYXAuXG4gICAgICogbWFwLm9uKCd0b3VjaGNhbmNlbCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgdG91Y2hjYW5jZWwgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAndG91Y2hjYW5jZWwnXG5cbiAgICAvKiogQHNlY3Rpb24ge01vdmVtZW50fVxuICAgICAqIEBldmVudFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXAgKi9cblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGp1c3QgYmVmb3JlIHRoZSBtYXAgYmVnaW5zIGEgdHJhbnNpdGlvbiBmcm9tIG9uZSB2aWV3IHRvIGFub3RoZXIsIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjanVtcFRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3Zlc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge0RyYWdFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcC5cbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlcyBqdXN0IGJlZm9yZSB0aGUgbWFwIGJlZ2lucyBhIHRyYW5zaXRpb24gZnJvbSBvbmUgdmlldyB0byBhbm90aGVyLlxuICAgICAqIG1hcC5vbignbW92ZXN0YXJ0JywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBtb3Zlc3RhcnRgIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ21vdmVzdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHJlcGVhdGVkbHkgZHVyaW5nIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24gZnJvbSBvbmUgdmlldyB0byBhbm90aGVyLCBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3ZlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcC5cbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlcyByZXBlYXRlZGx5IGR1cmluZyBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLlxuICAgICAqIG1hcC5vbignbW92ZScsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgbW92ZSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IEhUTUwgY2x1c3RlcnMgd2l0aCBjdXN0b20gcHJvcGVydGllc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2x1c3Rlci1odG1sLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBGaWx0ZXIgZmVhdHVyZXMgd2l0aGluIG1hcCB2aWV3XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItZmVhdHVyZXMtd2l0aGluLW1hcC12aWV3LylcbiAgICAgKi9cbiAgICB8ICdtb3ZlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQganVzdCBhZnRlciB0aGUgbWFwIGNvbXBsZXRlcyBhIHRyYW5zaXRpb24gZnJvbSBvbmVcbiAgICAgKiB2aWV3IHRvIGFub3RoZXIsIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjanVtcFRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBtb3ZlZW5kXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtEcmFnRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYWZ0ZXIgdGhlIG1hcCBjb21wbGV0ZXMgYSB0cmFuc2l0aW9uLlxuICAgICAqIG1hcC5vbignbW92ZWVuZCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgbW92ZWVuZCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBQbGF5IG1hcCBsb2NhdGlvbnMgYXMgYSBzbGlkZXNob3ddKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcGxheWJhY2stbG9jYXRpb25zLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBGaWx0ZXIgZmVhdHVyZXMgd2l0aGluIG1hcCB2aWV3XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpbHRlci1mZWF0dXJlcy13aXRoaW4tbWFwLXZpZXcvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgSFRNTCBjbHVzdGVycyB3aXRoIGN1c3RvbSBwcm9wZXJ0aWVzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jbHVzdGVyLWh0bWwvKVxuICAgICAqL1xuICAgIHwgJ21vdmVlbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIHN0YXJ0cy4gU2VlIHtAbGluayBEcmFnUGFuSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZHJhZ3N0YXJ0XG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtEcmFnRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gYSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gc3RhcnRzLlxuICAgICAqIG1hcC5vbignZHJhZ3N0YXJ0JywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBkcmFnc3RhcnQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnZHJhZ3N0YXJ0J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgcmVwZWF0ZWRseSBkdXJpbmcgYSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24uIFNlZSB7QGxpbmsgRHJhZ1BhbkhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IGRyYWdcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyByZXBlYXRlZGx5IGR1cmluZyBhIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbi5cbiAgICAgKiBtYXAub24oJ2RyYWcnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIGRyYWcgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnZHJhZydcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gZW5kcy4gU2VlIHtAbGluayBEcmFnUGFuSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZHJhZ2VuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7RHJhZ0V2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIGEgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGVuZHMuXG4gICAgICogbWFwLm9uKCdkcmFnZW5kJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBkcmFnZW5kIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIGRyYWdnYWJsZSBtYXJrZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1tYXJrZXIvKVxuICAgICAqL1xuICAgIHwgJ2RyYWdlbmQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBqdXN0IGJlZm9yZSB0aGUgbWFwIGJlZ2lucyBhIHRyYW5zaXRpb24gZnJvbSBvbmUgem9vbSBsZXZlbCB0byBhbm90aGVyLFxuICAgICAqIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99LlxuICAgICAqXG4gICAgICogQGV2ZW50IHpvb21zdGFydFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYmVmb3JlIGEgem9vbSB0cmFuc2l0aW9uIHN0YXJ0cy5cbiAgICAgKiBtYXAub24oJ3pvb21zdGFydCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0Egem9vbXN0YXJ0IGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3pvb21zdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHJlcGVhdGVkbHkgZHVyaW5nIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24gZnJvbSBvbmUgem9vbSBsZXZlbCB0byBhbm90aGVyLFxuICAgICAqIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIHtAbGluayBNYXAjZmx5VG99LlxuICAgICAqXG4gICAgICogQGV2ZW50IHpvb21cbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyByZXBlYXRlZGx5IGR1cmluZyBhIHpvb20gdHJhbnNpdGlvbi5cbiAgICAgKiBtYXAub24oJ3pvb20nLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHpvb20gZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogVXBkYXRlIGEgY2hvcm9wbGV0aCBsYXllciBieSB6b29tIGxldmVsXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VwZGF0aW5nLWNob3JvcGxldGgvKVxuICAgICAqL1xuICAgIHwgJ3pvb20nXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBqdXN0IGFmdGVyIHRoZSBtYXAgY29tcGxldGVzIGEgdHJhbnNpdGlvbiBmcm9tIG9uZSB6b29tIGxldmVsIHRvIGFub3RoZXJcbiAgICAgKiBhcyB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKiBUaGUgem9vbSB0cmFuc2l0aW9uIHdpbGwgdXN1YWxseSBlbmQgYmVmb3JlIHJlbmRlcmluZyBpcyBmaW5pc2hlZCwgc28gaWYgeW91XG4gICAgICogbmVlZCB0byB3YWl0IGZvciByZW5kZXJpbmcgdG8gZmluaXNoLCB1c2UgdGhlIHtAbGluayBNYXAuZXZlbnQ6aWRsZX0gZXZlbnQgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEBldmVudCB6b29tZW5kXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8ganVzdCBhZnRlciBhIHpvb20gdHJhbnNpdGlvbiBmaW5pc2hlcy5cbiAgICAgKiBtYXAub24oJ3pvb21lbmQnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHpvb21lbmQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnem9vbWVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gc3RhcnRzLiBTZWUge0BsaW5rIERyYWdSb3RhdGVIYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCByb3RhdGVzdGFydFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYmVmb3JlIGEgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIHN0YXJ0cy5cbiAgICAgKiBtYXAub24oJ3JvdGF0ZXN0YXJ0JywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSByb3RhdGVzdGFydCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdyb3RhdGVzdGFydCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHJlcGVhdGVkbHkgZHVyaW5nIGEgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLiBTZWUge0BsaW5rIERyYWdSb3RhdGVIYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCByb3RhdGVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyByZXBlYXRlZGx5IGR1cmluZyBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24uXG4gICAgICogbWFwLm9uKCdyb3RhdGUnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHJvdGF0ZSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdyb3RhdGUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGVuZHMuIFNlZSB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9LlxuICAgICAqXG4gICAgICogQGV2ZW50IHJvdGF0ZWVuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYWZ0ZXIgYSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gZW5kcy5cbiAgICAgKiBtYXAub24oJ3JvdGF0ZWVuZCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0Egcm90YXRlZW5kIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3JvdGF0ZWVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW5ldmVyIHRoZSBtYXAncyBwaXRjaCAodGlsdCkgYmVnaW5zIGEgY2hhbmdlIGFzXG4gICAgICogdGhlIHJlc3VsdCBvZiBlaXRoZXIgdXNlciBpbnRlcmFjdGlvbiBvciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE1hcCNmbHlUb30gLlxuICAgICAqXG4gICAgICogQGV2ZW50IHBpdGNoc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcERhdGFFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8ganVzdCBiZWZvcmUgYSBwaXRjaCAodGlsdCkgdHJhbnNpdGlvbiBzdGFydHMuXG4gICAgICogbWFwLm9uKCdwaXRjaHN0YXJ0JywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBwaXRjaHN0YXJ0IGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3BpdGNoc3RhcnQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCByZXBlYXRlZGx5IGR1cmluZyB0aGUgbWFwJ3MgcGl0Y2ggKHRpbHQpIGFuaW1hdGlvbiBiZXR3ZWVuXG4gICAgICogb25lIHN0YXRlIGFuZCBhbm90aGVyIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb25cbiAgICAgKiBvciBtZXRob2RzIHN1Y2ggYXMge0BsaW5rIE1hcCNmbHlUb30uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgcGl0Y2hcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcERhdGFFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gcmVwZWF0ZWRseSBkdXJpbmcgYSBwaXRjaCAodGlsdCkgdHJhbnNpdGlvbi5cbiAgICAgKiBtYXAub24oJ3BpdGNoJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBwaXRjaCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdwaXRjaCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYXAncyBwaXRjaCAodGlsdCkgZmluaXNoZXMgY2hhbmdpbmcgYXNcbiAgICAgKiB0aGUgcmVzdWx0IG9mIGVpdGhlciB1c2VyIGludGVyYWN0aW9uIG9yIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZseVRvfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBwaXRjaGVuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwRGF0YUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBqdXN0IGFmdGVyIGEgcGl0Y2ggKHRpbHQpIHRyYW5zaXRpb24gZW5kcy5cbiAgICAgKiBtYXAub24oJ3BpdGNoZW5kJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBwaXRjaGVuZCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdwaXRjaGVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gc3RhcnRzLiBTZWUge0BsaW5rIEJveFpvb21IYW5kbGVyfS5cbiAgICAgKlxuICAgICAqIEBldmVudCBib3h6b29tc3RhcnRcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcEJveFpvb21FdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8ganVzdCBiZWZvcmUgYSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gc3RhcnRzLlxuICAgICAqIG1hcC5vbignYm94em9vbXN0YXJ0JywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBib3h6b29tc3RhcnQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnYm94em9vbXN0YXJ0J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBlbmRzLiAgU2VlIHtAbGluayBCb3hab29tSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgYm94em9vbWVuZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEB0eXBlIHtNYXBCb3hab29tRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYWZ0ZXIgYSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gZW5kcy5cbiAgICAgKiBtYXAub24oJ2JveHpvb21lbmQnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIGJveHpvb21lbmQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnYm94em9vbWVuZCdcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHVzZXIgY2FuY2VscyBhIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiwgb3Igd2hlbiB0aGUgYm91bmRpbmcgYm94IGRvZXMgbm90IG1lZXQgdGhlIG1pbmltdW0gc2l6ZSB0aHJlc2hvbGQuXG4gICAgICogU2VlIHtAbGluayBCb3hab29tSGFuZGxlcn0uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgYm94em9vbWNhbmNlbFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7TWFwQm94Wm9vbUV2ZW50fVxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB0aGUgdXNlciBjYW5jZWxzIGEgXCJib3ggem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqIG1hcC5vbignYm94em9vbWNhbmNlbCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgYm94em9vbWNhbmNlbCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdib3h6b29tY2FuY2VsJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1hcCBoYXMgYmVlbiByZXNpemVkLlxuICAgICAqXG4gICAgICogQGV2ZW50IHJlc2l6ZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1hcCBoYXMgYmVlbiByZXNpemVkLlxuICAgICAqIG1hcC5vbigncmVzaXplJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSByZXNpemUgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAncmVzaXplJ1xuXG4gICAgLyoqIEBzZWN0aW9uIHtMaWZlY3ljbGV9XG4gICAgICogQGV2ZW50XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIE1hcCAqL1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYWxsIG5lY2Vzc2FyeSByZXNvdXJjZXMgaGF2ZSBiZWVuIGRvd25sb2FkZWRcbiAgICAgKiBhbmQgdGhlIGZpcnN0IHZpc3VhbGx5IGNvbXBsZXRlIHJlbmRlcmluZyBvZiB0aGUgbWFwIGhhcyBvY2N1cnJlZC5cbiAgICAgKlxuICAgICAqIEBldmVudCBsb2FkXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gdGhlIG1hcCBoYXMgZmluaXNoZWQgbG9hZGluZy5cbiAgICAgKiBtYXAub24oJ2xvYWQnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIGxvYWQgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogRHJhdyBHZW9KU09OIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLW1hcmtlcnMvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEFkZCBsaXZlIHJlYWx0aW1lIGRhdGFdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbGl2ZS1nZW9qc29uLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBbmltYXRlIGEgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYW5pbWF0ZS1wb2ludC1hbG9uZy1saW5lLylcbiAgICAgKi9cbiAgICB8ICdsb2FkJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbmV2ZXIgdGhlIG1hcCBpcyBkcmF3biB0byB0aGUgc2NyZWVuLCBhcyB0aGUgcmVzdWx0IG9mOlxuICAgICAqXG4gICAgICogLSBhIGNoYW5nZSB0byB0aGUgbWFwJ3MgcG9zaXRpb24sIHpvb20sIHBpdGNoLCBvciBiZWFyaW5nXG4gICAgICogLSBhIGNoYW5nZSB0byB0aGUgbWFwJ3Mgc3R5bGVcbiAgICAgKiAtIGEgY2hhbmdlIHRvIGEgR2VvSlNPTiBzb3VyY2VcbiAgICAgKiAtIHRoZSBsb2FkaW5nIG9mIGEgdmVjdG9yIHRpbGUsIEdlb0pTT04gZmlsZSwgZ2x5cGgsIG9yIHNwcml0ZS5cbiAgICAgKlxuICAgICAqIEBldmVudCByZW5kZXJcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW5ldmVyIHRoZSBtYXAgaXMgZHJhd24gdG8gdGhlIHNjcmVlbi5cbiAgICAgKiBtYXAub24oJ3JlbmRlcicsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgcmVuZGVyIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3JlbmRlcidcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIGFmdGVyIHRoZSBsYXN0IGZyYW1lIHJlbmRlcmVkIGJlZm9yZSB0aGUgbWFwIGVudGVycyBhblxuICAgICAqIFwiaWRsZVwiIHN0YXRlOlxuICAgICAqXG4gICAgICogLSBObyBjYW1lcmEgdHJhbnNpdGlvbnMgYXJlIGluIHByb2dyZXNzXG4gICAgICogLSBBbGwgY3VycmVudGx5IHJlcXVlc3RlZCB0aWxlcyBoYXZlIGxvYWRlZFxuICAgICAqIC0gQWxsIGZhZGUvdHJhbnNpdGlvbiBhbmltYXRpb25zIGhhdmUgY29tcGxldGVkLlxuICAgICAqXG4gICAgICogQGV2ZW50IGlkbGVcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIGp1c3QgYmVmb3JlIHRoZSBtYXAgZW50ZXJzIGFuIFwiaWRsZVwiIHN0YXRlLlxuICAgICAqIG1hcC5vbignaWRsZScsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgaWRsZSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdpZGxlJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1hcCBoYXMgYmVlbiByZW1vdmVkIHdpdGgge0BsaW5rIE1hcC5ldmVudDpyZW1vdmV9LlxuICAgICAqXG4gICAgICogQGV2ZW50IHJlbW92ZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8ganVzdCBhZnRlciB0aGUgbWFwIGlzIHJlbW92ZWQuXG4gICAgICogbWFwLm9uKCdyZW1vdmUnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHJlbW92ZSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdyZW1vdmUnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gVGhpcyBpcyBNYXBib3ggR0wgSlMncyBwcmltYXJ5IGVycm9yIHJlcG9ydGluZ1xuICAgICAqIG1lY2hhbmlzbS4gV2UgdXNlIGFuIGV2ZW50IGluc3RlYWQgb2YgYHRocm93YCB0byBiZXR0ZXIgYWNjb21tb2RhdGVcbiAgICAgKiBhc3luY3Jvbm91cyBvcGVyYXRpb25zLiBJZiBubyBsaXN0ZW5lcnMgYXJlIGJvdW5kIHRvIHRoZSBgZXJyb3JgIGV2ZW50LCB0aGVcbiAgICAgKiBlcnJvciB3aWxsIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgZXJyb3JcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2UgRXJyb3IgbWVzc2FnZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gICAgICogbWFwLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgZXJyb3IgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnZXJyb3InXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBXZWJHTCBjb250ZXh0IGlzIGxvc3QuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgd2ViZ2xjb250ZXh0bG9zdFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiB0aGUgV2ViR0wgY29udGV4dCBpcyBsb3N0LlxuICAgICAqIG1hcC5vbignd2ViZ2xjb250ZXh0bG9zdCcsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0Egd2ViZ2xjb250ZXh0bG9zdCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICd3ZWJnbGNvbnRleHRsb3N0J1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgV2ViR0wgY29udGV4dCBpcyByZXN0b3JlZC5cbiAgICAgKlxuICAgICAqIEBldmVudCB3ZWJnbGNvbnRleHRyZXN0b3JlZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiB0aGUgV2ViR0wgY29udGV4dCBpcyByZXN0b3JlZC5cbiAgICAgKiBtYXAub24oJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSB3ZWJnbGNvbnRleHRyZXN0b3JlZCBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICd3ZWJnbGNvbnRleHRyZXN0b3JlZCdcblxuICAgIC8qKiBAc2VjdGlvbiB7RGF0YSBsb2FkaW5nfVxuICAgICAqIEBldmVudFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXAgKi9cblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW55IG1hcCBkYXRhIGxvYWRzIG9yIGNoYW5nZXMuIFNlZSB7QGxpbmsgTWFwRGF0YUV2ZW50fVxuICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IGRhdGFcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQHR5cGUge01hcERhdGFFdmVudH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe30pO1xuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gICAgICogLy8gd2hlbiBtYXAgZGF0YSBsb2FkcyBvciBjaGFuZ2VzLlxuICAgICAqIG1hcC5vbignZGF0YScsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgZGF0YSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IEhUTUwgY2x1c3RlcnMgd2l0aCBjdXN0b20gcHJvcGVydGllc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2x1c3Rlci1odG1sLylcbiAgICAgKi9cbiAgICB8ICdkYXRhJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgbWFwJ3Mgc3R5bGUgbG9hZHMgb3IgY2hhbmdlcy4gU2VlXG4gICAgICoge0BsaW5rIE1hcERhdGFFdmVudH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBAZXZlbnQgc3R5bGVkYXRhXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBEYXRhRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gdGhlIG1hcCdzIHN0eWxlIGxvYWRzIG9yIGNoYW5nZXMuXG4gICAgICogbWFwLm9uKCdzdHlsZWRhdGEnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHN0eWxlZGF0YSBldmVudCBvY2N1cnJlZC4nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdzdHlsZWRhdGEnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIG9uZSBvZiB0aGUgbWFwJ3Mgc291cmNlcyBsb2FkcyBvciBjaGFuZ2VzLCBpbmNsdWRpbmcgaWYgYSB0aWxlIGJlbG9uZ2luZ1xuICAgICAqIHRvIGEgc291cmNlIGxvYWRzIG9yIGNoYW5nZXMuIFNlZSB7QGxpbmsgTWFwRGF0YUV2ZW50fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBldmVudCBzb3VyY2VkYXRhXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBEYXRhRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gb25lIG9mIHRoZSBtYXAncyBzb3VyY2VzIGxvYWRzIG9yIGNoYW5nZXMuXG4gICAgICogbWFwLm9uKCdzb3VyY2VkYXRhJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBzb3VyY2VkYXRhIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3NvdXJjZWRhdGEnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGFueSBtYXAgZGF0YSAoc3R5bGUsIHNvdXJjZSwgdGlsZSwgZXRjKSBiZWdpbnMgbG9hZGluZyBvclxuICAgICAqIGNoYW5naW5nIGFzeW5jaHJvbm91c2x5LiBBbGwgYGRhdGFsb2FkaW5nYCBldmVudHMgYXJlIGZvbGxvd2VkIGJ5IGEgYGRhdGFgXG4gICAgICogb3IgYGVycm9yYCBldmVudC4gU2VlIHtAbGluayBNYXBEYXRhRXZlbnR9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IGRhdGFsb2FkaW5nXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBEYXRhRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gYW55IG1hcCBkYXRhIGJlZ2lucyBsb2FkaW5nXG4gICAgICogLy8gb3IgY2hhbmdpbmcgYXN5bmNocm9ub3VzbHkuXG4gICAgICogbWFwLm9uKCdkYXRhbG9hZGluZycsICgpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ0EgZGF0YWxvYWRpbmcgZXZlbnQgb2NjdXJyZWQuJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgfCAnZGF0YWxvYWRpbmcnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBtYXAncyBzdHlsZSBiZWdpbnMgbG9hZGluZyBvciBjaGFuZ2luZyBhc3luY2hyb25vdXNseS5cbiAgICAgKiBBbGwgYHN0eWxlZGF0YWxvYWRpbmdgIGV2ZW50cyBhcmUgZm9sbG93ZWQgYnkgYSBgc3R5bGVkYXRhYFxuICAgICAqIG9yIGBlcnJvcmAgZXZlbnQuIFNlZSB7QGxpbmsgTWFwRGF0YUV2ZW50fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEBldmVudCBzdHlsZWRhdGFsb2FkaW5nXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBEYXRhRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gdGhlIG1hcCdzIHN0eWxlIGJlZ2lucyBsb2FkaW5nIG9yXG4gICAgICogLy8gY2hhbmdpbmcgYXN5bmNocm9ub3VzbHkuXG4gICAgICogbWFwLm9uKCdzdHlsZWRhdGFsb2FkaW5nJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQSBzdHlsZWRhdGFsb2FkaW5nIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3N0eWxlZGF0YWxvYWRpbmcnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIG9uZSBvZiB0aGUgbWFwJ3Mgc291cmNlcyBiZWdpbnMgbG9hZGluZyBvciBjaGFuZ2luZyBhc3luY2hyb25vdXNseS5cbiAgICAgKiBBbGwgYHNvdXJjZWRhdGFsb2FkaW5nYCBldmVudHMgYXJlIGZvbGxvd2VkIGJ5IGEgYHNvdXJjZWRhdGFgIG9yIGBlcnJvcmAgZXZlbnQuXG4gICAgICogU2VlIHtAbGluayBNYXBEYXRhRXZlbnR9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqXG4gICAgICogQGV2ZW50IHNvdXJjZWRhdGFsb2FkaW5nXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEB0eXBlIHtNYXBEYXRhRXZlbnR9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBtYXBcbiAgICAgKiBjb25zdCBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICAgICAqIC8vIHdoZW4gdGhlIG1hcCdzIHNvdXJjZXMgYmVnaW4gbG9hZGluZyBvclxuICAgICAqIC8vIGNoYW5naW5nIGFzeW5jaHJvbm91c2x5LlxuICAgICAqIG1hcC5vbignc291cmNlZGF0YWxvYWRpbmcnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHNvdXJjZWRhdGFsb2FkaW5nIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHwgJ3NvdXJjZWRhdGFsb2FkaW5nJ1xuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhbiBpY29uIG9yIHBhdHRlcm4gbmVlZGVkIGJ5IHRoZSBzdHlsZSBpcyBtaXNzaW5nLiBUaGUgbWlzc2luZyBpbWFnZSBjYW5cbiAgICAgKiBiZSBhZGRlZCB3aXRoIHtAbGluayBNYXAjYWRkSW1hZ2V9IHdpdGhpbiB0aGlzIGV2ZW50IGxpc3RlbmVyIGNhbGxiYWNrIHRvIHByZXZlbnQgdGhlIGltYWdlIGZyb21cbiAgICAgKiBiZWluZyBza2lwcGVkLiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGdlbmVyYXRlIGljb25zIGFuZCBwYXR0ZXJucy5cbiAgICAgKlxuICAgICAqIEBldmVudCBzdHlsZWltYWdlbWlzc2luZ1xuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gaWQgVGhlIGlkIG9mIHRoZSBtaXNzaW5nIGltYWdlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSW5pdGlhbGl6ZSB0aGUgbWFwXG4gICAgICogY29uc3QgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7fSk7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyB3aGVuIGFuIGljb24gb3IgcGF0dGVybiBpcyBtaXNzaW5nLlxuICAgICAqIG1hcC5vbignc3R5bGVpbWFnZW1pc3NpbmcnLCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBIHN0eWxlaW1hZ2VtaXNzaW5nIGV2ZW50IG9jY3VycmVkLicpO1xuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IEdlbmVyYXRlIGFuZCBhZGQgYSBtaXNzaW5nIGljb24gdG8gdGhlIG1hcF0oaHR0cHM6Ly9tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkZC1pbWFnZS1taXNzaW5nLWdlbmVyYXRlZC8pXG4gICAgICovXG4gICAgfCAnc3R5bGVpbWFnZW1pc3NpbmcnXG5cbiAgICAvKipcbiAgICAgKiBAZXZlbnQgc3R5bGUubG9hZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHwgJ3N0eWxlLmxvYWQnXG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCBhZnRlciBzcGVlZCBpbmRleCBjYWxjdWxhdGlvbiBpcyBjb21wbGV0ZWQgaWYgYHNwZWVkSW5kZXhUaW1pbmdgIG9wdGlvbiBoYXMgYmVlbiBzZXQgdG8gYHRydWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAZXZlbnQgc3BlZWRpbmRleGNvbXBsZXRlZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEluaXRpYWxpemUgdGhlIG1hcFxuICAgICAqIHZhciBtYXAgPSBuZXcgbWFwYm94Z2wuTWFwKHt9KTtcbiAgICAgKiBtYXAuc3BlZWRJbmRleFRpbWluZyA9IHRydWU7XG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAgICAgKiAvLyBhZnRlciBzcGVlZCBpbmRleCBjYWxjdWxhdGlvbiBpcyBjb21wbGV0ZWQuXG4gICAgICogbWFwLm9uKCdzcGVlZGluZGV4Y29tcGxldGVkJywgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgc3BlZWQgaW5kZXggaXMgJHttYXAuc3BlZWRJbmRleE51bWJlcn1gKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICB8ICdzcGVlZGluZGV4Y29tcGxldGVkJ1xuO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtleHRlbmR9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge01hcE1vdXNlRXZlbnQsIE1hcFRvdWNoRXZlbnQsIE1hcFdoZWVsRXZlbnR9IGZyb20gJy4uL2V2ZW50cy5qcyc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAuanMnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7SGFuZGxlclJlc3VsdH0gZnJvbSAnLi4vaGFuZGxlcl9tYW5hZ2VyLmpzJztcblxuZXhwb3J0IGNsYXNzIE1hcEV2ZW50SGFuZGxlciB7XG5cbiAgICBfbW91c2Vkb3duUG9zOiA/UG9pbnQ7XG4gICAgX2NsaWNrVG9sZXJhbmNlOiBudW1iZXI7XG4gICAgX21hcDogTWFwO1xuXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IHsgY2xpY2tUb2xlcmFuY2U6IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fY2xpY2tUb2xlcmFuY2UgPSBvcHRpb25zLmNsaWNrVG9sZXJhbmNlO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9tb3VzZWRvd25Qb3MgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgd2hlZWwoZTogV2hlZWxFdmVudCk6ID9IYW5kbGVyUmVzdWx0IHtcbiAgICAgICAgLy8gSWYgbWFwRXZlbnQucHJldmVudERlZmF1bHQoKSBpcyBjYWxsZWQgYnkgdGhlIHVzZXIsIHByZXZlbnQgaGFuZGxlcnMgc3VjaCBhczpcbiAgICAgICAgLy8gLSBTY3JvbGxab29tXG4gICAgICAgIHJldHVybiB0aGlzLl9maXJlUHJldmVudGFibGUobmV3IE1hcFdoZWVsRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICB9XG5cbiAgICBtb3VzZWRvd24oZTogTW91c2VFdmVudCwgcG9pbnQ6IFBvaW50KTogP0hhbmRsZXJSZXN1bHQge1xuICAgICAgICB0aGlzLl9tb3VzZWRvd25Qb3MgPSBwb2ludDtcbiAgICAgICAgLy8gSWYgbWFwRXZlbnQucHJldmVudERlZmF1bHQoKSBpcyBjYWxsZWQgYnkgdGhlIHVzZXIsIHByZXZlbnQgaGFuZGxlcnMgc3VjaCBhczpcbiAgICAgICAgLy8gLSBNb3VzZVBhblxuICAgICAgICAvLyAtIE1vdXNlUm90YXRlXG4gICAgICAgIC8vIC0gTW91c2VQaXRjaFxuICAgICAgICAvLyAtIERibGNsaWNrSGFuZGxlclxuICAgICAgICByZXR1cm4gdGhpcy5fZmlyZVByZXZlbnRhYmxlKG5ldyBNYXBNb3VzZUV2ZW50KGUudHlwZSwgdGhpcy5fbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgbW91c2V1cChlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBNYXBNb3VzZUV2ZW50KGUudHlwZSwgdGhpcy5fbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgcHJlY2xpY2soZTogTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCBzeW50aCA9IGV4dGVuZCh7fSwgZSk7XG4gICAgICAgIHN5bnRoLnR5cGUgPSAncHJlY2xpY2snO1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudChzeW50aC50eXBlLCB0aGlzLl9tYXAsIHN5bnRoKSk7XG4gICAgfVxuXG4gICAgY2xpY2soZTogTW91c2VFdmVudCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9tb3VzZWRvd25Qb3MgJiYgdGhpcy5fbW91c2Vkb3duUG9zLmRpc3QocG9pbnQpID49IHRoaXMuX2NsaWNrVG9sZXJhbmNlKSByZXR1cm47XG4gICAgICAgIHRoaXMucHJlY2xpY2soZSk7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBNYXBNb3VzZUV2ZW50KGUudHlwZSwgdGhpcy5fbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgZGJsY2xpY2soZTogTW91c2VFdmVudCk6ID9IYW5kbGVyUmVzdWx0IHtcbiAgICAgICAgLy8gSWYgbWFwRXZlbnQucHJldmVudERlZmF1bHQoKSBpcyBjYWxsZWQgYnkgdGhlIHVzZXIsIHByZXZlbnQgaGFuZGxlcnMgc3VjaCBhczpcbiAgICAgICAgLy8gLSBEYmxDbGlja1pvb21cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVQcmV2ZW50YWJsZShuZXcgTWFwTW91c2VFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIG1vdXNlb3ZlcihlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBNYXBNb3VzZUV2ZW50KGUudHlwZSwgdGhpcy5fbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgbW91c2VvdXQoZTogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIHRvdWNoc3RhcnQoZTogVG91Y2hFdmVudCk6ID9IYW5kbGVyUmVzdWx0IHtcbiAgICAgICAgLy8gSWYgbWFwRXZlbnQucHJldmVudERlZmF1bHQoKSBpcyBjYWxsZWQgYnkgdGhlIHVzZXIsIHByZXZlbnQgaGFuZGxlcnMgc3VjaCBhczpcbiAgICAgICAgLy8gLSBUb3VjaFBhblxuICAgICAgICAvLyAtIFRvdWNoWm9vbVxuICAgICAgICAvLyAtIFRvdWNoUm90YXRlXG4gICAgICAgIC8vIC0gVG91Y2hQaXRjaFxuICAgICAgICAvLyAtIFRhcFpvb21cbiAgICAgICAgLy8gLSBTd2lwZVpvb21cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVQcmV2ZW50YWJsZShuZXcgTWFwVG91Y2hFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIHRvdWNobW92ZShlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBNYXBUb3VjaEV2ZW50KGUudHlwZSwgdGhpcy5fbWFwLCBlKSk7XG4gICAgfVxuXG4gICAgdG91Y2hlbmQoZTogVG91Y2hFdmVudCkge1xuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwVG91Y2hFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIHRvdWNoY2FuY2VsKGU6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IE1hcFRvdWNoRXZlbnQoZS50eXBlLCB0aGlzLl9tYXAsIGUpKTtcbiAgICB9XG5cbiAgICBfZmlyZVByZXZlbnRhYmxlKG1hcEV2ZW50OiBNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudCB8IE1hcFdoZWVsRXZlbnQpOiA/SGFuZGxlclJlc3VsdCB7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG1hcEV2ZW50KTtcbiAgICAgICAgaWYgKG1hcEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgIC8vIHJldHVybmluZyBhbiBvYmplY3QgbWFya3MgdGhlIGhhbmRsZXIgYXMgYWN0aXZlIGFuZCByZXNldHMgb3RoZXIgaGFuZGxlcnNcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZW5hYmxlKCkge31cbiAgICBkaXNhYmxlKCkge31cbn1cblxuZXhwb3J0IGNsYXNzIEJsb2NrYWJsZU1hcEV2ZW50SGFuZGxlciB7XG4gICAgX21hcDogTWFwO1xuICAgIF9kZWxheUNvbnRleHRNZW51OiBib29sZWFuO1xuICAgIF9jb250ZXh0TWVudUV2ZW50OiA/TW91c2VFdmVudDtcblxuICAgIGNvbnN0cnVjdG9yKG1hcDogTWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5fZGVsYXlDb250ZXh0TWVudSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jb250ZXh0TWVudUV2ZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIG1vdXNlbW92ZShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIC8vIG1vdXNlbW92ZSBtYXAgZXZlbnRzIHNob3VsZCBub3QgYmUgZmlyZWQgd2hlbiBpbnRlcmFjdGlvbiBoYW5kbGVycyAocGFuLCByb3RhdGUsIGV0YykgYXJlIGFjdGl2ZVxuICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgTWFwTW91c2VFdmVudChlLnR5cGUsIHRoaXMuX21hcCwgZSkpO1xuICAgIH1cblxuICAgIG1vdXNlZG93bigpIHtcbiAgICAgICAgdGhpcy5fZGVsYXlDb250ZXh0TWVudSA9IHRydWU7XG4gICAgfVxuXG4gICAgbW91c2V1cCgpIHtcbiAgICAgICAgdGhpcy5fZGVsYXlDb250ZXh0TWVudSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fY29udGV4dE1lbnVFdmVudCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmZpcmUobmV3IE1hcE1vdXNlRXZlbnQoJ2NvbnRleHRtZW51JywgdGhpcy5fbWFwLCB0aGlzLl9jb250ZXh0TWVudUV2ZW50KSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fY29udGV4dE1lbnVFdmVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb250ZXh0bWVudShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWxheUNvbnRleHRNZW51KSB7XG4gICAgICAgICAgICAvLyBNYWM6IGNvbnRleHRtZW51IGZpcmVkIG9uIG1vdXNlZG93bjsgd2Ugc2F2ZSBpdCB1bnRpbCBtb3VzZXVwIGZvciBjb25zaXN0ZW5jeSdzIHNha2VcbiAgICAgICAgICAgIHRoaXMuX2NvbnRleHRNZW51RXZlbnQgPSBlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gV2luZG93czogY29udGV4dG1lbnUgZmlyZWQgb24gbW91c2V1cCwgc28gZmlyZSBldmVudCBub3dcbiAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBNYXBNb3VzZUV2ZW50KGUudHlwZSwgdGhpcy5fbWFwLCBlKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBwcmV2ZW50IGJyb3dzZXIgY29udGV4dCBtZW51IHdoZW4gbmVjZXNzYXJ5XG4gICAgICAgIGlmICh0aGlzLl9tYXAubGlzdGVucygnY29udGV4dG1lbnUnKSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbmFibGUoKSB7fVxuICAgIGRpc2FibGUoKSB7fVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0ICogYXMgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tLmpzJztcblxuaW1wb3J0IHtFdmVudH0gZnJvbSAnLi4vLi4vdXRpbC9ldmVudGVkLmpzJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcC5qcyc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtIYW5kbGVyUmVzdWx0fSBmcm9tICcuLi9oYW5kbGVyX21hbmFnZXIuanMnO1xuXG4vKipcbiAqIFRoZSBgQm94Wm9vbUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIHRoZSBtYXAgdG8gZml0IHdpdGhpbiBhIGJvdW5kaW5nIGJveC5cbiAqIFRoZSBib3VuZGluZyBib3ggaXMgZGVmaW5lZCBieSBjbGlja2luZyBhbmQgaG9sZGluZyBgc2hpZnRgIHdoaWxlIGRyYWdnaW5nIHRoZSBjdXJzb3IuXG4gKlxuICogQHNlZSBbRXhhbXBsZTogVG9nZ2xlIGludGVyYWN0aW9uc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdG9nZ2xlLWludGVyYWN0aW9uLWhhbmRsZXJzLylcbiAqIEBzZWUgW0V4YW1wbGU6IEhpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICovXG5jbGFzcyBCb3hab29tSGFuZGxlciB7XG4gICAgX21hcDogTWFwO1xuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfc3RhcnRQb3M6IFBvaW50O1xuICAgIF9sYXN0UG9zOiBQb2ludDtcbiAgICBfYm94OiBIVE1MRWxlbWVudDtcbiAgICBfY2xpY2tUb2xlcmFuY2U6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IHtcbiAgICAgICAgY2xpY2tUb2xlcmFuY2U6IG51bWJlclxuICAgIH0pIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gbWFwLmdldENvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IG9wdGlvbnMuY2xpY2tUb2xlcmFuY2UgfHwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGlzQm94Wm9vbUVuYWJsZWQgPSBtYXAuYm94Wm9vbS5pc0VuYWJsZWQoKTtcbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlIChjdXJyZW50bHkgYmVpbmcgdXNlZCkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc0JveFpvb21BY3RpdmUgPSBtYXAuYm94Wm9vbS5pc0FjdGl2ZSgpO1xuICAgICAqL1xuICAgIGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9hY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuYm94Wm9vbS5lbmFibGUoKTtcbiAgICAgKi9cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5ib3hab29tLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIG1vdXNlZG93bihlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIGlmICghKGUuc2hpZnRLZXkgJiYgZS5idXR0b24gPT09IDApKSByZXR1cm47XG5cbiAgICAgICAgRE9NLmRpc2FibGVEcmFnKCk7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gdGhpcy5fbGFzdFBvcyA9IHBvaW50O1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIG1vdXNlbW92ZVdpbmRvdyhlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwb3MgPSBwb2ludDtcblxuICAgICAgICBpZiAodGhpcy5fbGFzdFBvcy5lcXVhbHMocG9zKSB8fCAoIXRoaXMuX2JveCAmJiBwb3MuZGlzdCh0aGlzLl9zdGFydFBvcykgPCB0aGlzLl9jbGlja1RvbGVyYW5jZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHAwID0gdGhpcy5fc3RhcnRQb3M7XG4gICAgICAgIHRoaXMuX2xhc3RQb3MgPSBwb3M7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9ib3gpIHtcbiAgICAgICAgICAgIHRoaXMuX2JveCA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1ib3h6b29tJywgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jcm9zc2hhaXInKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnYm94em9vbXN0YXJ0JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtaW5YID0gTWF0aC5taW4ocDAueCwgcG9zLngpLFxuICAgICAgICAgICAgbWF4WCA9IE1hdGgubWF4KHAwLngsIHBvcy54KSxcbiAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihwMC55LCBwb3MueSksXG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgocDAueSwgcG9zLnkpO1xuXG4gICAgICAgIHRoaXMuX21hcC5fcmVxdWVzdERvbVRhc2soKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2JveCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2JveC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7bWluWH1weCwke21pbll9cHgpYDtcbiAgICAgICAgICAgICAgICB0aGlzLl9ib3guc3R5bGUud2lkdGggPSBgJHttYXhYIC0gbWluWH1weGA7XG4gICAgICAgICAgICAgICAgdGhpcy5fYm94LnN0eWxlLmhlaWdodCA9IGAke21heFkgLSBtaW5ZfXB4YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbW91c2V1cFdpbmRvdyhlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpOiA/SGFuZGxlclJlc3VsdCB7XG4gICAgICAgIGlmICghdGhpcy5fYWN0aXZlKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGUuYnV0dG9uICE9PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcDAgPSB0aGlzLl9zdGFydFBvcyxcbiAgICAgICAgICAgIHAxID0gcG9pbnQ7XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuXG4gICAgICAgIERPTS5zdXBwcmVzc0NsaWNrKCk7XG5cbiAgICAgICAgaWYgKHAwLnggPT09IHAxLnggJiYgcDAueSA9PT0gcDEueSkge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdib3h6b29tY2FuY2VsJywgZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQoJ2JveHpvb21lbmQnLCB7b3JpZ2luYWxFdmVudDogZX0pKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY2FtZXJhQW5pbWF0aW9uOiAobWFwOiBNYXApID0+IG1hcC5maXRTY3JlZW5Db29yZGluYXRlcyhwMCwgcDEsIHRoaXMuX21hcC5nZXRCZWFyaW5nKCksIHtsaW5lYXI6IGZhbHNlfSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBrZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUpIHJldHVybjtcblxuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdib3h6b29tY2FuY2VsJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBibHVyKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jcm9zc2hhaXInKTtcblxuICAgICAgICBpZiAodGhpcy5fYm94KSB7XG4gICAgICAgICAgICB0aGlzLl9ib3gucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLl9ib3ggPSAobnVsbDogYW55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIERPTS5lbmFibGVEcmFnKCk7XG5cbiAgICAgICAgZGVsZXRlIHRoaXMuX3N0YXJ0UG9zO1xuICAgICAgICBkZWxldGUgdGhpcy5fbGFzdFBvcztcbiAgICB9XG5cbiAgICBfZmlyZUV2ZW50KHR5cGU6IHN0cmluZywgZTogKik6IE1hcCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuZmlyZShuZXcgRXZlbnQodHlwZSwge29yaWdpbmFsRXZlbnQ6IGV9KSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCb3hab29tSGFuZGxlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmRleFRvdWNoZXModG91Y2hlczogQXJyYXk8VG91Y2g+LCBwb2ludHM6IEFycmF5PFBvaW50Pik6IHtbbnVtYmVyIHwgc3RyaW5nXTogUG9pbnR9IHtcbiAgICBhc3NlcnQodG91Y2hlcy5sZW5ndGggPT09IHBvaW50cy5sZW5ndGgpO1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvYmpbdG91Y2hlc1tpXS5pZGVudGlmaWVyXSA9IHBvaW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB7aW5kZXhUb3VjaGVzfSBmcm9tICcuL2hhbmRsZXJfdXRpbC5qcyc7XG5cbmZ1bmN0aW9uIGdldENlbnRyb2lkKHBvaW50czogQXJyYXk8UG9pbnQ+KSB7XG4gICAgY29uc3Qgc3VtID0gbmV3IFBvaW50KDAsIDApO1xuICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcG9pbnRzKSB7XG4gICAgICAgIHN1bS5fYWRkKHBvaW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1bS5kaXYocG9pbnRzLmxlbmd0aCk7XG59XG5cbmV4cG9ydCBjb25zdCBNQVhfVEFQX0lOVEVSVkFMID0gNTAwO1xuY29uc3QgTUFYX1RPVUNIX1RJTUUgPSA1MDA7XG5jb25zdCBNQVhfRElTVCA9IDMwO1xuXG5leHBvcnQgY2xhc3MgU2luZ2xlVGFwUmVjb2duaXplciB7XG5cbiAgICBudW1Ub3VjaGVzOiBudW1iZXI7XG4gICAgY2VudHJvaWQ6ID9Qb2ludDtcbiAgICBzdGFydFRpbWU6IG51bWJlcjtcbiAgICBhYm9ydGVkOiBib29sZWFuO1xuICAgIHRvdWNoZXM6IHsgW251bWJlciB8IHN0cmluZ106IFBvaW50IH07XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IG51bVRvdWNoZXM6IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgdGhpcy5udW1Ub3VjaGVzID0gb3B0aW9ucy5udW1Ub3VjaGVzO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLmNlbnRyb2lkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IDA7XG4gICAgICAgIHRoaXMudG91Y2hlcyA9IHt9O1xuICAgICAgICB0aGlzLmFib3J0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0b3VjaHN0YXJ0KGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcblxuICAgICAgICBpZiAodGhpcy5jZW50cm9pZCB8fCBtYXBUb3VjaGVzLmxlbmd0aCA+IHRoaXMubnVtVG91Y2hlcykge1xuICAgICAgICAgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hYm9ydGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdGFydFRpbWUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lID0gZS50aW1lU3RhbXA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFwVG91Y2hlcy5sZW5ndGggPT09IHRoaXMubnVtVG91Y2hlcykge1xuICAgICAgICAgICAgdGhpcy5jZW50cm9pZCA9IGdldENlbnRyb2lkKHBvaW50cyk7XG4gICAgICAgICAgICB0aGlzLnRvdWNoZXMgPSBpbmRleFRvdWNoZXMobWFwVG91Y2hlcywgcG9pbnRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvdWNobW92ZShlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIGlmICh0aGlzLmFib3J0ZWQgfHwgIXRoaXMuY2VudHJvaWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBuZXdUb3VjaGVzID0gaW5kZXhUb3VjaGVzKG1hcFRvdWNoZXMsIHBvaW50cyk7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy50b3VjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2UG9zID0gdGhpcy50b3VjaGVzW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IHBvcyA9IG5ld1RvdWNoZXNbaWRdO1xuICAgICAgICAgICAgaWYgKCFwb3MgfHwgcG9zLmRpc3QocHJldlBvcykgPiBNQVhfRElTVCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b3VjaGVuZChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KTogP1BvaW50IHtcbiAgICAgICAgaWYgKCF0aGlzLmNlbnRyb2lkIHx8IGUudGltZVN0YW1wIC0gdGhpcy5zdGFydFRpbWUgPiBNQVhfVE9VQ0hfVElNRSkge1xuICAgICAgICAgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtYXBUb3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgY2VudHJvaWQgPSAhdGhpcy5hYm9ydGVkICYmIHRoaXMuY2VudHJvaWQ7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICBpZiAoY2VudHJvaWQpIHJldHVybiBjZW50cm9pZDtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgVGFwUmVjb2duaXplciB7XG5cbiAgICBzaW5nbGVUYXA6IFNpbmdsZVRhcFJlY29nbml6ZXI7XG4gICAgbnVtVGFwczogbnVtYmVyO1xuICAgIGxhc3RUaW1lOiBudW1iZXI7XG4gICAgbGFzdFRhcDogP1BvaW50O1xuICAgIGNvdW50OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IG51bVRhcHM6IG51bWJlciwgbnVtVG91Y2hlczogbnVtYmVyIH0pIHtcbiAgICAgICAgdGhpcy5zaW5nbGVUYXAgPSBuZXcgU2luZ2xlVGFwUmVjb2duaXplcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5udW1UYXBzID0gb3B0aW9ucy5udW1UYXBzO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMubGFzdFRpbWUgPSBJbmZpbml0eTtcbiAgICAgICAgdGhpcy5sYXN0VGFwID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNvdW50ID0gMDtcbiAgICAgICAgdGhpcy5zaW5nbGVUYXAucmVzZXQoKTtcbiAgICB9XG5cbiAgICB0b3VjaHN0YXJ0KGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgdGhpcy5zaW5nbGVUYXAudG91Y2hzdGFydChlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgIH1cblxuICAgIHRvdWNobW92ZShlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSB7XG4gICAgICAgIHRoaXMuc2luZ2xlVGFwLnRvdWNobW92ZShlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgIH1cblxuICAgIHRvdWNoZW5kKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pOiA/UG9pbnQge1xuICAgICAgICBjb25zdCB0YXAgPSB0aGlzLnNpbmdsZVRhcC50b3VjaGVuZChlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgICAgICBpZiAodGFwKSB7XG4gICAgICAgICAgICBjb25zdCBzb29uRW5vdWdoID0gZS50aW1lU3RhbXAgLSB0aGlzLmxhc3RUaW1lIDwgTUFYX1RBUF9JTlRFUlZBTDtcbiAgICAgICAgICAgIGNvbnN0IGNsb3NlRW5vdWdoID0gIXRoaXMubGFzdFRhcCB8fCB0aGlzLmxhc3RUYXAuZGlzdCh0YXApIDwgTUFYX0RJU1Q7XG5cbiAgICAgICAgICAgIGlmICghc29vbkVub3VnaCB8fCAhY2xvc2VFbm91Z2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY291bnQrKztcbiAgICAgICAgICAgIHRoaXMubGFzdFRpbWUgPSBlLnRpbWVTdGFtcDtcbiAgICAgICAgICAgIHRoaXMubGFzdFRhcCA9IHRhcDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY291bnQgPT09IHRoaXMubnVtVGFwcykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtUYXBSZWNvZ25pemVyfSBmcm9tICcuL3RhcF9yZWNvZ25pemVyLmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcC5qcyc7XG5pbXBvcnQgdHlwZSB7SGFuZGxlclJlc3VsdH0gZnJvbSAnLi4vaGFuZGxlcl9tYW5hZ2VyLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFwWm9vbUhhbmRsZXIge1xuXG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfem9vbUluOiBUYXBSZWNvZ25pemVyO1xuICAgIF96b29tT3V0OiBUYXBSZWNvZ25pemVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3pvb21JbiA9IG5ldyBUYXBSZWNvZ25pemVyKHtcbiAgICAgICAgICAgIG51bVRvdWNoZXM6IDEsXG4gICAgICAgICAgICBudW1UYXBzOiAyXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3pvb21PdXQgPSBuZXcgVGFwUmVjb2duaXplcih7XG4gICAgICAgICAgICBudW1Ub3VjaGVzOiAyLFxuICAgICAgICAgICAgbnVtVGFwczogMVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl96b29tSW4ucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fem9vbU91dC5yZXNldCgpO1xuICAgIH1cblxuICAgIHRvdWNoc3RhcnQoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICB0aGlzLl96b29tSW4udG91Y2hzdGFydChlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgICAgICB0aGlzLl96b29tT3V0LnRvdWNoc3RhcnQoZSwgcG9pbnRzLCBtYXBUb3VjaGVzKTtcbiAgICB9XG5cbiAgICB0b3VjaG1vdmUoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICB0aGlzLl96b29tSW4udG91Y2htb3ZlKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgIHRoaXMuX3pvb21PdXQudG91Y2htb3ZlKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgfVxuXG4gICAgdG91Y2hlbmQoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPik6ID9IYW5kbGVyUmVzdWx0IHtcbiAgICAgICAgY29uc3Qgem9vbUluUG9pbnQgPSB0aGlzLl96b29tSW4udG91Y2hlbmQoZSwgcG9pbnRzLCBtYXBUb3VjaGVzKTtcbiAgICAgICAgY29uc3Qgem9vbU91dFBvaW50ID0gdGhpcy5fem9vbU91dC50b3VjaGVuZChlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuXG4gICAgICAgIGlmICh6b29tSW5Qb2ludCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZXNldCgpLCAwKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY2FtZXJhQW5pbWF0aW9uOiAobWFwOiBNYXApID0+IG1hcC5lYXNlVG8oe1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgICAgICAgICB6b29tOiBtYXAuZ2V0Wm9vbSgpICsgMSxcbiAgICAgICAgICAgICAgICAgICAgYXJvdW5kOiBtYXAudW5wcm9qZWN0KHpvb21JblBvaW50KVxuICAgICAgICAgICAgICAgIH0sIHtvcmlnaW5hbEV2ZW50OiBlfSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoem9vbU91dFBvaW50KSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlc2V0KCksIDApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjYW1lcmFBbmltYXRpb246IChtYXA6IE1hcCkgPT4gbWFwLmVhc2VUbyh7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXG4gICAgICAgICAgICAgICAgICAgIHpvb206IG1hcC5nZXRab29tKCkgLSAxLFxuICAgICAgICAgICAgICAgICAgICBhcm91bmQ6IG1hcC51bnByb2plY3Qoem9vbU91dFBvaW50KVxuICAgICAgICAgICAgICAgIH0sIHtvcmlnaW5hbEV2ZW50OiBlfSlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b3VjaGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgKiBhcyBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20uanMnO1xuaW1wb3J0IHR5cGUgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7SGFuZGxlclJlc3VsdH0gZnJvbSAnLi4vaGFuZGxlcl9tYW5hZ2VyLmpzJztcblxuY29uc3QgTEVGVF9CVVRUT04gPSAwO1xuY29uc3QgUklHSFRfQlVUVE9OID0gMjtcblxuLy8gdGhlIHZhbHVlcyBmb3IgZWFjaCBidXR0b24gaW4gTW91c2VFdmVudC5idXR0b25zXG5jb25zdCBCVVRUT05TX0ZMQUdTID0ge1xuICAgIFtMRUZUX0JVVFRPTl06IDEsXG4gICAgW1JJR0hUX0JVVFRPTl06IDJcbn07XG5cbmZ1bmN0aW9uIGJ1dHRvblN0aWxsUHJlc3NlZChlOiBNb3VzZUV2ZW50LCBidXR0b246IG51bWJlcikge1xuICAgIGNvbnN0IGZsYWcgPSBCVVRUT05TX0ZMQUdTW2J1dHRvbl07XG4gICAgcmV0dXJuIGUuYnV0dG9ucyA9PT0gdW5kZWZpbmVkIHx8IChlLmJ1dHRvbnMgJiBmbGFnKSAhPT0gZmxhZztcbn1cblxuY2xhc3MgTW91c2VIYW5kbGVyIHtcblxuICAgIF9lbmFibGVkOiBib29sZWFuO1xuICAgIF9hY3RpdmU6IGJvb2xlYW47XG4gICAgX2xhc3RQb2ludDogP1BvaW50O1xuICAgIF9ldmVudEJ1dHRvbjogP251bWJlcjtcbiAgICBfbW92ZWQ6IGJvb2xlYW47XG4gICAgX2NsaWNrVG9sZXJhbmNlOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IGNsaWNrVG9sZXJhbmNlOiBudW1iZXIgfSkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gb3B0aW9ucy5jbGlja1RvbGVyYW5jZSB8fCAxO1xuICAgIH1cblxuICAgIGJsdXIoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX21vdmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2xhc3RQb2ludCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fZXZlbnRCdXR0b24gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgX2NvcnJlY3RCdXR0b24oZTogTW91c2VFdmVudCwgYnV0dG9uOiBudW1iZXIpOiBib29sZWFuIHsgIC8vZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGltcGxlbWVudGVkIGJ5IGNoaWxkXG4gICAgfVxuXG4gICAgX21vdmUobGFzdFBvaW50OiBQb2ludCwgcG9pbnQ6IFBvaW50KTogP0hhbmRsZXJSZXN1bHQgeyAgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgIHJldHVybiB7fTsgLy8gaW1wbGVtZW50ZWQgYnkgY2hpbGRcbiAgICB9XG5cbiAgICBtb3VzZWRvd24oZTogTW91c2VFdmVudCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgICAgIGlmICh0aGlzLl9sYXN0UG9pbnQpIHJldHVybjtcblxuICAgICAgICBjb25zdCBldmVudEJ1dHRvbiA9IERPTS5tb3VzZUJ1dHRvbihlKTtcbiAgICAgICAgaWYgKCF0aGlzLl9jb3JyZWN0QnV0dG9uKGUsIGV2ZW50QnV0dG9uKSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX2xhc3RQb2ludCA9IHBvaW50O1xuICAgICAgICB0aGlzLl9ldmVudEJ1dHRvbiA9IGV2ZW50QnV0dG9uO1xuICAgIH1cblxuICAgIG1vdXNlbW92ZVdpbmRvdyhlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpOiA/SGFuZGxlclJlc3VsdCB7XG4gICAgICAgIGNvbnN0IGxhc3RQb2ludCA9IHRoaXMuX2xhc3RQb2ludDtcbiAgICAgICAgaWYgKCFsYXN0UG9pbnQpIHJldHVybjtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9ldmVudEJ1dHRvbiAhPSBudWxsICYmIGJ1dHRvblN0aWxsUHJlc3NlZChlLCB0aGlzLl9ldmVudEJ1dHRvbikpIHtcbiAgICAgICAgICAgIC8vIFNvbWUgYnJvd3NlcnMgZG9uJ3QgZmlyZSBhIGBtb3VzZXVwYCB3aGVuIHRoZSBtb3VzZXVwIG9jY3VycyBvdXRzaWRlXG4gICAgICAgICAgICAvLyB0aGUgd2luZG93IG9yIGlmcmFtZTpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy80NjIyXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSWYgdGhlIGJ1dHRvbiBpcyBubyBsb25nZXIgcHJlc3NlZCBkdXJpbmcgdGhpcyBgbW91c2Vtb3ZlYCBpdCBtYXkgaGF2ZVxuICAgICAgICAgICAgLy8gYmVlbiByZWxlYXNlZCBvdXRzaWRlIG9mIHRoZSB3aW5kb3cgb3IgaWZyYW1lLlxuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9tb3ZlZCAmJiBwb2ludC5kaXN0KGxhc3RQb2ludCkgPCB0aGlzLl9jbGlja1RvbGVyYW5jZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9tb3ZlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2xhc3RQb2ludCA9IHBvaW50O1xuXG4gICAgICAgIC8vIGltcGxlbWVudGVkIGJ5IGNoaWxkIGNsYXNzXG4gICAgICAgIHJldHVybiB0aGlzLl9tb3ZlKGxhc3RQb2ludCwgcG9pbnQpO1xuICAgIH1cblxuICAgIG1vdXNldXBXaW5kb3coZTogTW91c2VFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhc3RQb2ludCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBldmVudEJ1dHRvbiA9IERPTS5tb3VzZUJ1dHRvbihlKTtcbiAgICAgICAgaWYgKGV2ZW50QnV0dG9uICE9PSB0aGlzLl9ldmVudEJ1dHRvbikgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5fbW92ZWQpIERPTS5zdXBwcmVzc0NsaWNrKCk7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTW91c2VQYW5IYW5kbGVyIGV4dGVuZHMgTW91c2VIYW5kbGVyIHtcblxuICAgIG1vdXNlZG93bihlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpIHtcbiAgICAgICAgc3VwZXIubW91c2Vkb3duKGUsIHBvaW50KTtcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RQb2ludCkgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgX2NvcnJlY3RCdXR0b24oZTogTW91c2VFdmVudCwgYnV0dG9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGJ1dHRvbiA9PT0gTEVGVF9CVVRUT04gJiYgIWUuY3RybEtleTtcbiAgICB9XG5cbiAgICBfbW92ZShsYXN0UG9pbnQ6IFBvaW50LCBwb2ludDogUG9pbnQpOiA/SGFuZGxlclJlc3VsdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcm91bmQ6IHBvaW50LFxuICAgICAgICAgICAgcGFuRGVsdGE6IHBvaW50LnN1YihsYXN0UG9pbnQpXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTW91c2VSb3RhdGVIYW5kbGVyIGV4dGVuZHMgTW91c2VIYW5kbGVyIHtcbiAgICBfY29ycmVjdEJ1dHRvbihlOiBNb3VzZUV2ZW50LCBidXR0b246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKGJ1dHRvbiA9PT0gTEVGVF9CVVRUT04gJiYgZS5jdHJsS2V5KSB8fCAoYnV0dG9uID09PSBSSUdIVF9CVVRUT04pO1xuICAgIH1cblxuICAgIF9tb3ZlKGxhc3RQb2ludDogUG9pbnQsIHBvaW50OiBQb2ludCk6ID9IYW5kbGVyUmVzdWx0IHtcbiAgICAgICAgY29uc3QgZGVncmVlc1BlclBpeGVsTW92ZWQgPSAwLjg7XG4gICAgICAgIGNvbnN0IGJlYXJpbmdEZWx0YSA9IChwb2ludC54IC0gbGFzdFBvaW50LngpICogZGVncmVlc1BlclBpeGVsTW92ZWQ7XG4gICAgICAgIGlmIChiZWFyaW5nRGVsdGEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4ge2JlYXJpbmdEZWx0YX07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb250ZXh0bWVudShlOiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIC8vIHByZXZlbnQgYnJvd3NlciBjb250ZXh0IG1lbnUgd2hlbiBuZWNlc3Nhcnk7IHdlIGRvbid0IGFsbG93IGl0IHdpdGggcm90YXRpb25cbiAgICAgICAgLy8gYmVjYXVzZSB3ZSBjYW4ndCBkaXNjZXJuIHJvdGF0aW9uIGdlc3R1cmUgc3RhcnQgZnJvbSBjb250ZXh0bWVudSBvbiBNYWNcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vdXNlUGl0Y2hIYW5kbGVyIGV4dGVuZHMgTW91c2VIYW5kbGVyIHtcbiAgICBfY29ycmVjdEJ1dHRvbihlOiBNb3VzZUV2ZW50LCBidXR0b246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKGJ1dHRvbiA9PT0gTEVGVF9CVVRUT04gJiYgZS5jdHJsS2V5KSB8fCAoYnV0dG9uID09PSBSSUdIVF9CVVRUT04pO1xuICAgIH1cblxuICAgIF9tb3ZlKGxhc3RQb2ludDogUG9pbnQsIHBvaW50OiBQb2ludCk6ID9IYW5kbGVyUmVzdWx0IHtcbiAgICAgICAgY29uc3QgZGVncmVlc1BlclBpeGVsTW92ZWQgPSAtMC41O1xuICAgICAgICBjb25zdCBwaXRjaERlbHRhID0gKHBvaW50LnkgLSBsYXN0UG9pbnQueSkgKiBkZWdyZWVzUGVyUGl4ZWxNb3ZlZDtcbiAgICAgICAgaWYgKHBpdGNoRGVsdGEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4ge3BpdGNoRGVsdGF9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29udGV4dG1lbnUoZTogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBwcmV2ZW50IGJyb3dzZXIgY29udGV4dCBtZW51IHdoZW4gbmVjZXNzYXJ5OyB3ZSBkb24ndCBhbGxvdyBpdCB3aXRoIHJvdGF0aW9uXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgY2FuJ3QgZGlzY2VybiByb3RhdGlvbiBnZXN0dXJlIHN0YXJ0IGZyb20gY29udGV4dG1lbnUgb24gTWFjXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwLmpzJztcbmltcG9ydCB7aW5kZXhUb3VjaGVzfSBmcm9tICcuL2hhbmRsZXJfdXRpbC5qcyc7XG5pbXBvcnQge2JpbmRBbGx9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgKiBhcyBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20uanMnO1xuaW1wb3J0IHR5cGUge0hhbmRsZXJSZXN1bHR9IGZyb20gJy4uL2hhbmRsZXJfbWFuYWdlci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvdWNoUGFuSGFuZGxlciB7XG5cbiAgICBfbWFwOiBNYXA7XG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfZW5hYmxlZDogYm9vbGVhbjtcbiAgICBfYWN0aXZlOiBib29sZWFuO1xuICAgIF90b3VjaGVzOiB7IFtzdHJpbmcgfCBudW1iZXJdOiBQb2ludCB9O1xuICAgIF9taW5Ub3VjaGVzOiBudW1iZXI7XG4gICAgX2NsaWNrVG9sZXJhbmNlOiBudW1iZXI7XG4gICAgX3N1bTogUG9pbnQ7XG4gICAgX2FsZXJ0Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfYWxlcnRUaW1lcjogVGltZW91dElEO1xuXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IHsgY2xpY2tUb2xlcmFuY2U6IG51bWJlciB9KSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX21pblRvdWNoZXMgPSAxO1xuICAgICAgICB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IG9wdGlvbnMuY2xpY2tUb2xlcmFuY2UgfHwgMTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICBiaW5kQWxsKFsnX2FkZFRvdWNoUGFuQmxvY2tlcicsICdfc2hvd1RvdWNoUGFuQmxvY2tlckFsZXJ0J10sIHRoaXMpO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdG91Y2hlcyA9IHt9O1xuICAgICAgICB0aGlzLl9zdW0gPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgfVxuXG4gICAgdG91Y2hzdGFydChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KTogP0hhbmRsZXJSZXN1bHQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsY3VsYXRlVHJhbnNmb3JtKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgfVxuXG4gICAgdG91Y2htb3ZlKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pOiA/SGFuZGxlclJlc3VsdCB7XG4gICAgICAgIGlmICghdGhpcy5fYWN0aXZlIHx8IG1hcFRvdWNoZXMubGVuZ3RoIDwgdGhpcy5fbWluVG91Y2hlcykgcmV0dXJuO1xuXG4gICAgICAgIC8vIGlmIGNvb3BlcmF0aXZlIGdlc3R1cmUgaGFuZGxpbmcgaXMgc2V0IHRvIHRydWUsIHJlcXVpcmUgdHdvIGZpbmdlcnMgdG8gdG91Y2ggcGFuXG4gICAgICAgIGlmICh0aGlzLl9tYXAuX2Nvb3BlcmF0aXZlR2VzdHVyZXMgJiYgIXRoaXMuX21hcC5pc01vdmluZygpKSB7XG4gICAgICAgICAgICBpZiAobWFwVG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG93VG91Y2hQYW5CbG9ja2VyQWxlcnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2FsZXJ0Q29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgaGlkZSBhbGVydCBpZiBpdCBpcyB2aXNpYmxlIHdoZW4gdHdvIGZpbmdlcnMgYXJlIHVzZWQgdG8gcGFuLlxuICAgICAgICAgICAgICAgIHRoaXMuX2FsZXJ0Q29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fYWxlcnRUaW1lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGN1bGF0ZVRyYW5zZm9ybShlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgIH1cblxuICAgIHRvdWNoZW5kKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgdGhpcy5fY2FsY3VsYXRlVHJhbnNmb3JtKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSAmJiBtYXBUb3VjaGVzLmxlbmd0aCA8IHRoaXMuX21pblRvdWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvdWNoY2FuY2VsKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgX2NhbGN1bGF0ZVRyYW5zZm9ybShlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KTogP0hhbmRsZXJSZXN1bHQge1xuICAgICAgICBpZiAobWFwVG91Y2hlcy5sZW5ndGggPiAwKSB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IHRvdWNoZXMgPSBpbmRleFRvdWNoZXMobWFwVG91Y2hlcywgcG9pbnRzKTtcblxuICAgICAgICBjb25zdCB0b3VjaFBvaW50U3VtID0gbmV3IFBvaW50KDAsIDApO1xuICAgICAgICBjb25zdCB0b3VjaERlbHRhU3VtID0gbmV3IFBvaW50KDAsIDApO1xuICAgICAgICBsZXQgdG91Y2hEZWx0YUNvdW50ID0gMDtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgaW4gdG91Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgcG9pbnQgPSB0b3VjaGVzW2lkZW50aWZpZXJdO1xuICAgICAgICAgICAgY29uc3QgcHJldlBvaW50ID0gdGhpcy5fdG91Y2hlc1tpZGVudGlmaWVyXTtcbiAgICAgICAgICAgIGlmIChwcmV2UG9pbnQpIHtcbiAgICAgICAgICAgICAgICB0b3VjaFBvaW50U3VtLl9hZGQocG9pbnQpO1xuICAgICAgICAgICAgICAgIHRvdWNoRGVsdGFTdW0uX2FkZChwb2ludC5zdWIocHJldlBvaW50KSk7XG4gICAgICAgICAgICAgICAgdG91Y2hEZWx0YUNvdW50Kys7XG4gICAgICAgICAgICAgICAgdG91Y2hlc1tpZGVudGlmaWVyXSA9IHBvaW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdG91Y2hlcyA9IHRvdWNoZXM7XG5cbiAgICAgICAgaWYgKHRvdWNoRGVsdGFDb3VudCA8IHRoaXMuX21pblRvdWNoZXMgfHwgIXRvdWNoRGVsdGFTdW0ubWFnKCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwYW5EZWx0YSA9IHRvdWNoRGVsdGFTdW0uZGl2KHRvdWNoRGVsdGFDb3VudCk7XG4gICAgICAgIHRoaXMuX3N1bS5fYWRkKHBhbkRlbHRhKTtcbiAgICAgICAgaWYgKHRoaXMuX3N1bS5tYWcoKSA8IHRoaXMuX2NsaWNrVG9sZXJhbmNlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgYXJvdW5kID0gdG91Y2hQb2ludFN1bS5kaXYodG91Y2hEZWx0YUNvdW50KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXJvdW5kLFxuICAgICAgICAgICAgcGFuRGVsdGFcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5fbWFwLl9jb29wZXJhdGl2ZUdlc3R1cmVzKSB7XG4gICAgICAgICAgICB0aGlzLl9hZGRUb3VjaFBhbkJsb2NrZXIoKTtcbiAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRvdWNoLWFjdGlvbiBjc3MgcHJvcGVydHkgdG8gZW5hYmxlIHNjcm9sbGluZyBwYWdlIG92ZXIgbWFwXG4gICAgICAgICAgICB0aGlzLl9lbC5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC10b3VjaC1wYW4tYmxvY2tlci1vdmVycmlkZScsICdtYXBib3hnbC1zY3JvbGxhYmxlLXBhZ2UnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX21hcC5fY29vcGVyYXRpdmVHZXN0dXJlcykge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2FsZXJ0VGltZXIpO1xuICAgICAgICAgICAgdGhpcy5fYWxlcnRDb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLl9lbC5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC10b3VjaC1wYW4tYmxvY2tlci1vdmVycmlkZScsICdtYXBib3hnbC1zY3JvbGxhYmxlLXBhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG5cbiAgICBfYWRkVG91Y2hQYW5CbG9ja2VyKCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwICYmICF0aGlzLl9hbGVydENvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fYWxlcnRDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtdG91Y2gtcGFuLWJsb2NrZXInLCB0aGlzLl9tYXAuX2NvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIHRoaXMuX2FsZXJ0Q29udGFpbmVyLnRleHRDb250ZW50ID0gdGhpcy5fbWFwLl9nZXRVSVN0cmluZygnVG91Y2hQYW5CbG9ja2VyLk1lc3NhZ2UnKTtcblxuICAgICAgICAgICAgLy8gZHluYW1pY2FsbHkgc2V0IHRoZSBmb250IHNpemUgb2YgdGhlIHRvdWNoIHBhbiBibG9ja2VyIGFsZXJ0IG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMuX2FsZXJ0Q29udGFpbmVyLnN0eWxlLmZvbnRTaXplID0gYCR7TWF0aC5tYXgoMTAsIE1hdGgubWluKDI0LCBNYXRoLmZsb29yKHRoaXMuX2VsLmNsaWVudFdpZHRoICogMC4wNSkpKX1weGA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc2hvd1RvdWNoUGFuQmxvY2tlckFsZXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5fYWxlcnRDb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicpIHRoaXMuX2FsZXJ0Q29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG5cbiAgICAgICAgdGhpcy5fYWxlcnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdG91Y2gtcGFuLWJsb2NrZXItc2hvdycpO1xuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9hbGVydFRpbWVyKTtcblxuICAgICAgICB0aGlzLl9hbGVydFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9hbGVydENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC10b3VjaC1wYW4tYmxvY2tlci1zaG93Jyk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuXG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgKiBhcyBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20uanMnO1xuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4uL21hcC5qcyc7XG5pbXBvcnQgdHlwZSB7SGFuZGxlclJlc3VsdH0gZnJvbSAnLi4vaGFuZGxlcl9tYW5hZ2VyLmpzJztcblxuY2xhc3MgVHdvVG91Y2hIYW5kbGVyIHtcblxuICAgIF9lbmFibGVkOiBib29sZWFuO1xuICAgIF9hY3RpdmU6IGJvb2xlYW47XG4gICAgX2ZpcnN0VHdvVG91Y2hlczogP1tudW1iZXIsIG51bWJlcl07XG4gICAgX3ZlY3RvcjogP1BvaW50O1xuICAgIF9zdGFydFZlY3RvcjogP1BvaW50O1xuICAgIF9hcm91bmRDZW50ZXI6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZmlyc3RUd29Ub3VjaGVzID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIF9zdGFydChwb2ludHM6IFtQb2ludCwgUG9pbnRdKSB7fSAvL2VzbGludC1kaXNhYmxlLWxpbmVcbiAgICBfbW92ZShwb2ludHM6IFtQb2ludCwgUG9pbnRdLCBwaW5jaEFyb3VuZDogUG9pbnQsIGU6IFRvdWNoRXZlbnQpOiA/SGFuZGxlclJlc3VsdCB7IHJldHVybiB7fTsgfSAvL2VzbGludC1kaXNhYmxlLWxpbmVcblxuICAgIHRvdWNoc3RhcnQoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICAvL2NvbnNvbGUubG9nKGUudGFyZ2V0LCBlLnRhcmdldFRvdWNoZXMubGVuZ3RoID8gZS50YXJnZXRUb3VjaGVzWzBdLnRhcmdldCA6IG51bGwpO1xuICAgICAgICAvL2xvZygndG91Y2hzdGFydCcsIHBvaW50cywgZS50YXJnZXQuaW5uZXJIVE1MLCBlLnRhcmdldFRvdWNoZXMubGVuZ3RoID8gZS50YXJnZXRUb3VjaGVzWzBdLnRhcmdldC5pbm5lckhUTUw6IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmICh0aGlzLl9maXJzdFR3b1RvdWNoZXMgfHwgbWFwVG91Y2hlcy5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fZmlyc3RUd29Ub3VjaGVzID0gW1xuICAgICAgICAgICAgbWFwVG91Y2hlc1swXS5pZGVudGlmaWVyLFxuICAgICAgICAgICAgbWFwVG91Y2hlc1sxXS5pZGVudGlmaWVyXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgY2hpbGQgY2xhc3Nlc1xuICAgICAgICB0aGlzLl9zdGFydChbcG9pbnRzWzBdLCBwb2ludHNbMV1dKTtcbiAgICB9XG5cbiAgICB0b3VjaG1vdmUoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPik6ID9IYW5kbGVyUmVzdWx0IHtcbiAgICAgICAgY29uc3QgZmlyc3RUb3VjaGVzID0gdGhpcy5fZmlyc3RUd29Ub3VjaGVzO1xuICAgICAgICBpZiAoIWZpcnN0VG91Y2hlcykgcmV0dXJuO1xuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBbaWRBLCBpZEJdID0gZmlyc3RUb3VjaGVzO1xuICAgICAgICBjb25zdCBhID0gZ2V0VG91Y2hCeUlkKG1hcFRvdWNoZXMsIHBvaW50cywgaWRBKTtcbiAgICAgICAgY29uc3QgYiA9IGdldFRvdWNoQnlJZChtYXBUb3VjaGVzLCBwb2ludHMsIGlkQik7XG4gICAgICAgIGlmICghYSB8fCAhYikgcmV0dXJuO1xuICAgICAgICBjb25zdCBwaW5jaEFyb3VuZCA9IHRoaXMuX2Fyb3VuZENlbnRlciA/IG51bGwgOiBhLmFkZChiKS5kaXYoMik7XG5cbiAgICAgICAgLy8gaW1wbGVtZW50ZWQgYnkgY2hpbGQgY2xhc3Nlc1xuICAgICAgICByZXR1cm4gdGhpcy5fbW92ZShbYSwgYl0sIHBpbmNoQXJvdW5kLCBlKTtcblxuICAgIH1cblxuICAgIHRvdWNoZW5kKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9maXJzdFR3b1RvdWNoZXMpIHJldHVybjtcblxuICAgICAgICBjb25zdCBbaWRBLCBpZEJdID0gdGhpcy5fZmlyc3RUd29Ub3VjaGVzO1xuICAgICAgICBjb25zdCBhID0gZ2V0VG91Y2hCeUlkKG1hcFRvdWNoZXMsIHBvaW50cywgaWRBKTtcbiAgICAgICAgY29uc3QgYiA9IGdldFRvdWNoQnlJZChtYXBUb3VjaGVzLCBwb2ludHMsIGlkQik7XG4gICAgICAgIGlmIChhICYmIGIpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlKSBET00uc3VwcHJlc3NDbGljaygpO1xuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICB0b3VjaGNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGVuYWJsZShvcHRpb25zOiA/e2Fyb3VuZD86ICdjZW50ZXInfSkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYXJvdW5kQ2VudGVyID0gISFvcHRpb25zICYmIG9wdGlvbnMuYXJvdW5kID09PSAnY2VudGVyJztcbiAgICB9XG5cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0VG91Y2hCeUlkKG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPiwgcG9pbnRzOiBBcnJheTxQb2ludD4sIGlkZW50aWZpZXI6IG51bWJlcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwVG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobWFwVG91Y2hlc1tpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSByZXR1cm4gcG9pbnRzW2ldO1xuICAgIH1cbn1cblxuLyogWk9PTSAqL1xuXG5jb25zdCBaT09NX1RIUkVTSE9MRCA9IDAuMTtcblxuZnVuY3Rpb24gZ2V0Wm9vbURlbHRhKGRpc3RhbmNlLCBsYXN0RGlzdGFuY2UpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coZGlzdGFuY2UgLyBsYXN0RGlzdGFuY2UpIC8gTWF0aC5MTjI7XG59XG5cbmV4cG9ydCBjbGFzcyBUb3VjaFpvb21IYW5kbGVyIGV4dGVuZHMgVHdvVG91Y2hIYW5kbGVyIHtcblxuICAgIF9kaXN0YW5jZTogbnVtYmVyO1xuICAgIF9zdGFydERpc3RhbmNlOiBudW1iZXI7XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgc3VwZXIucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fZGlzdGFuY2UgPSAwO1xuICAgICAgICB0aGlzLl9zdGFydERpc3RhbmNlID0gMDtcbiAgICB9XG5cbiAgICBfc3RhcnQocG9pbnRzOiBbUG9pbnQsIFBvaW50XSkge1xuICAgICAgICB0aGlzLl9zdGFydERpc3RhbmNlID0gdGhpcy5fZGlzdGFuY2UgPSBwb2ludHNbMF0uZGlzdChwb2ludHNbMV0pO1xuICAgIH1cblxuICAgIF9tb3ZlKHBvaW50czogW1BvaW50LCBQb2ludF0sIHBpbmNoQXJvdW5kOiBQb2ludCk6ID9IYW5kbGVyUmVzdWx0IHtcbiAgICAgICAgY29uc3QgbGFzdERpc3RhbmNlID0gdGhpcy5fZGlzdGFuY2U7XG4gICAgICAgIHRoaXMuX2Rpc3RhbmNlID0gcG9pbnRzWzBdLmRpc3QocG9pbnRzWzFdKTtcbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUgJiYgTWF0aC5hYnMoZ2V0Wm9vbURlbHRhKHRoaXMuX2Rpc3RhbmNlLCB0aGlzLl9zdGFydERpc3RhbmNlKSkgPCBaT09NX1RIUkVTSE9MRCkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgem9vbURlbHRhOiBnZXRab29tRGVsdGEodGhpcy5fZGlzdGFuY2UsIGxhc3REaXN0YW5jZSksXG4gICAgICAgICAgICBwaW5jaEFyb3VuZFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuLyogUk9UQVRFICovXG5cbmNvbnN0IFJPVEFUSU9OX1RIUkVTSE9MRCA9IDI1OyAvLyBwaXhlbHMgYWxvbmcgY2lyY3VtZmVyZW5jZSBvZiB0b3VjaCBjaXJjbGVcblxuZnVuY3Rpb24gZ2V0QmVhcmluZ0RlbHRhKGEsIGIpIHtcbiAgICByZXR1cm4gYS5hbmdsZVdpdGgoYikgKiAxODAgLyBNYXRoLlBJO1xufVxuXG5leHBvcnQgY2xhc3MgVG91Y2hSb3RhdGVIYW5kbGVyIGV4dGVuZHMgVHdvVG91Y2hIYW5kbGVyIHtcbiAgICBfbWluRGlhbWV0ZXI6IG51bWJlcjtcblxuICAgIHJlc2V0KCkge1xuICAgICAgICBzdXBlci5yZXNldCgpO1xuICAgICAgICB0aGlzLl9taW5EaWFtZXRlciA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXJ0VmVjdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl92ZWN0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgX3N0YXJ0KHBvaW50czogW1BvaW50LCBQb2ludF0pIHtcbiAgICAgICAgdGhpcy5fc3RhcnRWZWN0b3IgPSB0aGlzLl92ZWN0b3IgPSBwb2ludHNbMF0uc3ViKHBvaW50c1sxXSk7XG4gICAgICAgIHRoaXMuX21pbkRpYW1ldGVyID0gcG9pbnRzWzBdLmRpc3QocG9pbnRzWzFdKTtcbiAgICB9XG5cbiAgICBfbW92ZShwb2ludHM6IFtQb2ludCwgUG9pbnRdLCBwaW5jaEFyb3VuZDogUG9pbnQpOiA/SGFuZGxlclJlc3VsdCB7XG4gICAgICAgIGNvbnN0IGxhc3RWZWN0b3IgPSB0aGlzLl92ZWN0b3I7XG4gICAgICAgIHRoaXMuX3ZlY3RvciA9IHBvaW50c1swXS5zdWIocG9pbnRzWzFdKTtcblxuICAgICAgICBpZiAoIXRoaXMuX2FjdGl2ZSAmJiB0aGlzLl9pc0JlbG93VGhyZXNob2xkKHRoaXMuX3ZlY3RvcikpIHJldHVybjtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVhcmluZ0RlbHRhOiBnZXRCZWFyaW5nRGVsdGEodGhpcy5fdmVjdG9yLCBsYXN0VmVjdG9yKSxcbiAgICAgICAgICAgIHBpbmNoQXJvdW5kXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgX2lzQmVsb3dUaHJlc2hvbGQodmVjdG9yOiBQb2ludCk6IGJvb2xlYW4ge1xuICAgICAgICAvKlxuICAgICAgICAgKiBUaGUgdGhyZXNob2xkIGJlZm9yZSBhIHJvdGF0aW9uIGFjdHVhbGx5IGhhcHBlbnMgaXMgY29uZmlndXJlZCBpblxuICAgICAgICAgKiBwaXhlbHMgYWxvbmd0aCBjaXJjdW1mZXJlbmNlIG9mIHRoZSBjaXJjbGUgZm9ybWVkIGJ5IHRoZSB0d28gZmluZ2Vycy5cbiAgICAgICAgICogVGhpcyBtYWtlcyB0aGUgdGhyZXNob2xkIGluIGRlZ3JlZXMgbGFyZ2VyIHdoZW4gdGhlIGZpbmdlcnMgYXJlIGNsb3NlXG4gICAgICAgICAqIHRvZ2V0aGVyIGFuZCBzbWFsbGVyIHdoZW4gdGhlIGZpbmdlcnMgYXJlIGZhciBhcGFydC5cbiAgICAgICAgICpcbiAgICAgICAgICogVXNlIHRoZSBzbWFsbGVzdCBkaWFtZXRlciBmcm9tIHRoZSB3aG9sZSBnZXN0dXJlIHRvIHJlZHVjZSBzZW5zaXRpdml0eVxuICAgICAgICAgKiB3aGVuIHBpbmNoaW5nIGluIGFuZCBvdXQuXG4gICAgICAgICAqL1xuXG4gICAgICAgIHRoaXMuX21pbkRpYW1ldGVyID0gTWF0aC5taW4odGhpcy5fbWluRGlhbWV0ZXIsIHZlY3Rvci5tYWcoKSk7XG4gICAgICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSBNYXRoLlBJICogdGhpcy5fbWluRGlhbWV0ZXI7XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IFJPVEFUSU9OX1RIUkVTSE9MRCAvIGNpcmN1bWZlcmVuY2UgKiAzNjA7XG5cbiAgICAgICAgY29uc3QgYmVhcmluZ0RlbHRhU2luY2VTdGFydCA9IGdldEJlYXJpbmdEZWx0YSh2ZWN0b3IsIHRoaXMuX3N0YXJ0VmVjdG9yKTtcbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKGJlYXJpbmdEZWx0YVNpbmNlU3RhcnQpIDwgdGhyZXNob2xkO1xuICAgIH1cbn1cblxuLyogUElUQ0ggKi9cblxuZnVuY3Rpb24gaXNWZXJ0aWNhbCh2ZWN0b3IpIHtcbiAgICByZXR1cm4gTWF0aC5hYnModmVjdG9yLnkpID4gTWF0aC5hYnModmVjdG9yLngpO1xufVxuXG5jb25zdCBBTExPV0VEX1NJTkdMRV9UT1VDSF9USU1FID0gMTAwO1xuXG4vKipcbiAqIFRoZSBgVG91Y2hQaXRjaEhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byBwaXRjaCB0aGUgbWFwIGJ5IGRyYWdnaW5nIHVwIGFuZCBkb3duIHdpdGggdHdvIGZpbmdlcnMuXG4gKlxuICogQHNlZSBbRXhhbXBsZTogU2V0IHBpdGNoIGFuZCBiZWFyaW5nXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9zZXQtcGVyc3BlY3RpdmUvKVxuKi9cbmV4cG9ydCBjbGFzcyBUb3VjaFBpdGNoSGFuZGxlciBleHRlbmRzIFR3b1RvdWNoSGFuZGxlciB7XG5cbiAgICBfdmFsaWQ6IGJvb2xlYW4gfCB2b2lkO1xuICAgIF9maXJzdE1vdmU6ID9udW1iZXI7XG4gICAgX2xhc3RQb2ludHM6ID9bUG9pbnQsIFBvaW50XTtcbiAgICBfbWFwOiBNYXA7XG5cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHN1cGVyLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuX3ZhbGlkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9maXJzdE1vdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2xhc3RQb2ludHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgX3N0YXJ0KHBvaW50czogW1BvaW50LCBQb2ludF0pIHtcbiAgICAgICAgdGhpcy5fbGFzdFBvaW50cyA9IHBvaW50cztcbiAgICAgICAgaWYgKGlzVmVydGljYWwocG9pbnRzWzBdLnN1Yihwb2ludHNbMV0pKSkge1xuICAgICAgICAgICAgLy8gZmluZ2VycyBhcmUgbW9yZSBob3Jpem9udGFsIHRoYW4gdmVydGljYWxcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIF9tb3ZlKHBvaW50czogW1BvaW50LCBQb2ludF0sIGNlbnRlcjogUG9pbnQsIGU6IFRvdWNoRXZlbnQpOiA/SGFuZGxlclJlc3VsdCB7XG4gICAgICAgIGNvbnN0IGxhc3RQb2ludHMgPSB0aGlzLl9sYXN0UG9pbnRzO1xuICAgICAgICBpZiAoIWxhc3RQb2ludHMpIHJldHVybjtcbiAgICAgICAgY29uc3QgdmVjdG9yQSA9IHBvaW50c1swXS5zdWIobGFzdFBvaW50c1swXSk7XG4gICAgICAgIGNvbnN0IHZlY3RvckIgPSBwb2ludHNbMV0uc3ViKGxhc3RQb2ludHNbMV0pO1xuXG4gICAgICAgIGlmICh0aGlzLl9tYXAuX2Nvb3BlcmF0aXZlR2VzdHVyZXMgJiYgZS50b3VjaGVzLmxlbmd0aCA8IDMpIHJldHVybjtcblxuICAgICAgICB0aGlzLl92YWxpZCA9IHRoaXMuZ2VzdHVyZUJlZ2luc1ZlcnRpY2FsbHkodmVjdG9yQSwgdmVjdG9yQiwgZS50aW1lU3RhbXApO1xuXG4gICAgICAgIGlmICghdGhpcy5fdmFsaWQpIHJldHVybjtcblxuICAgICAgICB0aGlzLl9sYXN0UG9pbnRzID0gcG9pbnRzO1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICBjb25zdCB5RGVsdGFBdmVyYWdlID0gKHZlY3RvckEueSArIHZlY3RvckIueSkgLyAyO1xuICAgICAgICBjb25zdCBkZWdyZWVzUGVyUGl4ZWxNb3ZlZCA9IC0wLjU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwaXRjaERlbHRhOiB5RGVsdGFBdmVyYWdlICogZGVncmVlc1BlclBpeGVsTW92ZWRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXN0dXJlQmVnaW5zVmVydGljYWxseSh2ZWN0b3JBOiBQb2ludCwgdmVjdG9yQjogUG9pbnQsIHRpbWVTdGFtcDogbnVtYmVyKTogdm9pZCB8IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fdmFsaWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX3ZhbGlkO1xuXG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IDI7XG4gICAgICAgIGNvbnN0IG1vdmVkQSA9IHZlY3RvckEubWFnKCkgPj0gdGhyZXNob2xkO1xuICAgICAgICBjb25zdCBtb3ZlZEIgPSB2ZWN0b3JCLm1hZygpID49IHRocmVzaG9sZDtcblxuICAgICAgICAvLyBuZWl0aGVyIGZpbmdlciBoYXMgbW92ZWQgYSBtZWFuaW5nZnVsIGFtb3VudCwgd2FpdFxuICAgICAgICBpZiAoIW1vdmVkQSAmJiAhbW92ZWRCKSByZXR1cm47XG5cbiAgICAgICAgLy8gT25lIGZpbmdlciBoYXMgbW92ZWQgYW5kIHRoZSBvdGhlciBoYXMgbm90LlxuICAgICAgICAvLyBJZiBlbm91Z2ggdGltZSBoYXMgcGFzc2VkLCBkZWNpZGUgaXQgaXMgbm90IGEgcGl0Y2guXG4gICAgICAgIGlmICghbW92ZWRBIHx8ICFtb3ZlZEIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9maXJzdE1vdmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpcnN0TW92ZSA9IHRpbWVTdGFtcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRpbWVTdGFtcCAtIHRoaXMuX2ZpcnN0TW92ZSA8IEFMTE9XRURfU0lOR0xFX1RPVUNIX1RJTUUpIHtcbiAgICAgICAgICAgICAgICAvLyBzdGlsbCB3YWl0aW5nIGZvciBhIG1vdmVtZW50IGZyb20gdGhlIHNlY29uZCBmaW5nZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc1NhbWVEaXJlY3Rpb24gPSB2ZWN0b3JBLnkgPiAwID09PSB2ZWN0b3JCLnkgPiAwO1xuICAgICAgICByZXR1cm4gaXNWZXJ0aWNhbCh2ZWN0b3JBKSAmJiBpc1ZlcnRpY2FsKHZlY3RvckIpICYmIGlzU2FtZURpcmVjdGlvbjtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwLmpzJztcbmltcG9ydCB0eXBlIHtIYW5kbGVyUmVzdWx0fSBmcm9tICcuLi9oYW5kbGVyX21hbmFnZXIuanMnO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBwYW5TdGVwOiAxMDAsXG4gICAgYmVhcmluZ1N0ZXA6IDE1LFxuICAgIHBpdGNoU3RlcDogMTBcbn07XG5cbi8qKlxuICogVGhlIGBLZXlib2FyZEhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tLCByb3RhdGUsIGFuZCBwYW4gdGhlIG1hcCB1c2luZ1xuICogdGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHM6XG4gKlxuICogLSBgPWAgLyBgK2A6IEluY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDEuXG4gKiAtIGBTaGlmdC09YCAvIGBTaGlmdC0rYDogSW5jcmVhc2UgdGhlIHpvb20gbGV2ZWwgYnkgMi5cbiAqIC0gYC1gOiBEZWNyZWFzZSB0aGUgem9vbSBsZXZlbCBieSAxLlxuICogLSBgU2hpZnQtLWA6IERlY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDIuXG4gKiAtIEFycm93IGtleXM6IFBhbiBieSAxMDAgcGl4ZWxzLlxuICogLSBgU2hpZnQr4oeiYDogSW5jcmVhc2UgdGhlIHJvdGF0aW9uIGJ5IDE1IGRlZ3JlZXMuXG4gKiAtIGBTaGlmdCvih6BgOiBEZWNyZWFzZSB0aGUgcm90YXRpb24gYnkgMTUgZGVncmVlcy5cbiAqIC0gYFNoaWZ0K+KHoWA6IEluY3JlYXNlIHRoZSBwaXRjaCBieSAxMCBkZWdyZWVzLlxuICogLSBgU2hpZnQr4oejYDogRGVjcmVhc2UgdGhlIHBpdGNoIGJ5IDEwIGRlZ3JlZXMuXG4gKlxuICogQHNlZSBbRXhhbXBsZTogVG9nZ2xlIGludGVyYWN0aW9uc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdG9nZ2xlLWludGVyYWN0aW9uLWhhbmRsZXJzLylcbiAqIEBzZWUgW0V4YW1wbGU6IE5hdmlnYXRlIHRoZSBtYXAgd2l0aCBnYW1lLWxpa2UgY29udHJvbHNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dhbWUtY29udHJvbHMvKVxuICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBtYXAgbmF2aWdhdGlvbiBjb250cm9sc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbmF2aWdhdGlvbi8pXG4gKi9cbmNsYXNzIEtleWJvYXJkSGFuZGxlciB7XG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfcGFuU3RlcDogbnVtYmVyO1xuICAgIF9iZWFyaW5nU3RlcDogbnVtYmVyO1xuICAgIF9waXRjaFN0ZXA6IG51bWJlcjtcbiAgICBfcm90YXRpb25EaXNhYmxlZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICogQHByaXZhdGVcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBjb25zdCBzdGVwT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgICAgICB0aGlzLl9wYW5TdGVwID0gc3RlcE9wdGlvbnMucGFuU3RlcDtcbiAgICAgICAgdGhpcy5fYmVhcmluZ1N0ZXAgPSBzdGVwT3B0aW9ucy5iZWFyaW5nU3RlcDtcbiAgICAgICAgdGhpcy5fcGl0Y2hTdGVwID0gc3RlcE9wdGlvbnMucGl0Y2hTdGVwO1xuICAgICAgICB0aGlzLl9yb3RhdGlvbkRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYmx1cigpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBrZXlkb3duKGU6IEtleWJvYXJkRXZlbnQpOiA/SGFuZGxlclJlc3VsdCB7XG4gICAgICAgIGlmIChlLmFsdEtleSB8fCBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSByZXR1cm47XG5cbiAgICAgICAgbGV0IHpvb21EaXIgPSAwO1xuICAgICAgICBsZXQgYmVhcmluZ0RpciA9IDA7XG4gICAgICAgIGxldCBwaXRjaERpciA9IDA7XG4gICAgICAgIGxldCB4RGlyID0gMDtcbiAgICAgICAgbGV0IHlEaXIgPSAwO1xuXG4gICAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgNjE6XG4gICAgICAgIGNhc2UgMTA3OlxuICAgICAgICBjYXNlIDE3MTpcbiAgICAgICAgY2FzZSAxODc6XG4gICAgICAgICAgICB6b29tRGlyID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTg5OlxuICAgICAgICBjYXNlIDEwOTpcbiAgICAgICAgY2FzZSAxNzM6XG4gICAgICAgICAgICB6b29tRGlyID0gLTE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBiZWFyaW5nRGlyID0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB4RGlyID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBiZWFyaW5nRGlyID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHhEaXIgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgcGl0Y2hEaXIgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgeURpciA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgcGl0Y2hEaXIgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHlEaXIgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9yb3RhdGlvbkRpc2FibGVkKSB7XG4gICAgICAgICAgICBiZWFyaW5nRGlyID0gMDtcbiAgICAgICAgICAgIHBpdGNoRGlyID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjYW1lcmFBbmltYXRpb246IChtYXA6IE1hcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHpvb20gPSBtYXAuZ2V0Wm9vbSgpO1xuICAgICAgICAgICAgICAgIG1hcC5lYXNlVG8oe1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgICAgICAgICBlYXNlSWQ6ICdrZXlib2FyZEhhbmRsZXInLFxuICAgICAgICAgICAgICAgICAgICBlYXNpbmc6IGVhc2VPdXQsXG5cbiAgICAgICAgICAgICAgICAgICAgem9vbTogem9vbURpciA/IE1hdGgucm91bmQoem9vbSkgKyB6b29tRGlyICogKGUuc2hpZnRLZXkgPyAyIDogMSkgOiB6b29tLFxuICAgICAgICAgICAgICAgICAgICBiZWFyaW5nOiBtYXAuZ2V0QmVhcmluZygpICsgYmVhcmluZ0RpciAqIHRoaXMuX2JlYXJpbmdTdGVwLFxuICAgICAgICAgICAgICAgICAgICBwaXRjaDogbWFwLmdldFBpdGNoKCkgKyBwaXRjaERpciAqIHRoaXMuX3BpdGNoU3RlcCxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBbLXhEaXIgKiB0aGlzLl9wYW5TdGVwLCAteURpciAqIHRoaXMuX3BhblN0ZXBdLFxuICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IG1hcC5nZXRDZW50ZXIoKVxuICAgICAgICAgICAgICAgIH0sIHtvcmlnaW5hbEV2ZW50OiBlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJrZXlib2FyZCByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmtleWJvYXJkLmVuYWJsZSgpO1xuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwia2V5Ym9hcmQgcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5rZXlib2FyZC5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImtleWJvYXJkIHJvdGF0ZSBhbmQgem9vbVwiXG4gICAgICogaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwia2V5Ym9hcmQgcm90YXRlIGFuZCB6b29tXCJcbiAgICAgKiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNLZXlib2FyZEVuYWJsZWQgPSBtYXAua2V5Ym9hcmQuaXNFbmFibGVkKCk7XG4gICAgICovXG4gICAgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGhhbmRsZXIgaXMgZW5hYmxlZCBhbmQgaGFzIGRldGVjdGVkIHRoZSBzdGFydCBvZiBhXG4gICAgICogem9vbS9yb3RhdGUgZ2VzdHVyZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGhhbmRsZXIgaXMgZW5hYmxlZCBhbmQgaGFzIGRldGVjdGVkIHRoZVxuICAgICAqIHN0YXJ0IG9mIGEgem9vbS9yb3RhdGUgZ2VzdHVyZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGlzS2V5Ym9hcmRBY3RpdmUgPSBtYXAua2V5Ym9hcmQuaXNBY3RpdmUoKTtcbiAgICAgKi9cbiAgICBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJrZXlib2FyZCBwYW4vcm90YXRlXCIgaW50ZXJhY3Rpb24sIGxlYXZpbmcgdGhlXG4gICAgICogXCJrZXlib2FyZCB6b29tXCIgaW50ZXJhY3Rpb24gZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmtleWJvYXJkLmRpc2FibGVSb3RhdGlvbigpO1xuICAgICAqL1xuICAgIGRpc2FibGVSb3RhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJrZXlib2FyZCBwYW4vcm90YXRlXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5rZXlib2FyZC5lbmFibGUoKTtcbiAgICAgKiBtYXAua2V5Ym9hcmQuZW5hYmxlUm90YXRpb24oKTtcbiAgICAgKi9cbiAgICBlbmFibGVSb3RhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZWFzZU91dCh0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdCAqICgyIC0gdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEtleWJvYXJkSGFuZGxlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIERPTSBmcm9tICcuLi8uLi91dGlsL2RvbS5qcyc7XG5cbmltcG9ydCB7ZWFzZSBhcyBfZWFzZSwgYmluZEFsbCwgYmV6aWVyfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vLi4vdXRpbC9icm93c2VyLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cuanMnO1xuaW1wb3J0IHtudW1iZXIgYXMgaW50ZXJwb2xhdGV9IGZyb20gJy4uLy4uL3N0eWxlLXNwZWMvdXRpbC9pbnRlcnBvbGF0ZS5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAuanMnO1xuaW1wb3J0IHR5cGUgSGFuZGxlck1hbmFnZXIsIHtIYW5kbGVyUmVzdWx0fSBmcm9tICcuLi9oYW5kbGVyX21hbmFnZXIuanMnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSBmcm9tICcuLi8uLi9nZW8vbWVyY2F0b3JfY29vcmRpbmF0ZS5qcyc7XG5cbi8vIGRlbHRhWSB2YWx1ZSBmb3IgbW91c2Ugc2Nyb2xsIHdoZWVsIGlkZW50aWZpY2F0aW9uXG5jb25zdCB3aGVlbFpvb21EZWx0YSA9IDQuMDAwMjQ0MTQwNjI1O1xuXG4vLyBUaGVzZSBtYWdpYyBudW1iZXJzIGNvbnRyb2wgdGhlIHJhdGUgb2Ygem9vbS4gVHJhY2twYWQgZXZlbnRzIGZpcmUgYXQgYSBncmVhdGVyXG4vLyBmcmVxdWVuY3kgdGhhbiBtb3VzZSBzY3JvbGwgd2hlZWwsIHNvIHJlZHVjZSB0aGUgem9vbSByYXRlIHBlciB3aGVlbCB0aWNrXG5jb25zdCBkZWZhdWx0Wm9vbVJhdGUgPSAxIC8gMTAwO1xuY29uc3Qgd2hlZWxab29tUmF0ZSA9IDEgLyA0NTA7XG5cbi8vIHVwcGVyIGJvdW5kIG9uIGhvdyBtdWNoIHdlIHNjYWxlIHRoZSBtYXAgaW4gYW55IHNpbmdsZSByZW5kZXIgZnJhbWU7IHRoaXNcbi8vIGlzIHVzZWQgdG8gbGltaXQgem9vbSByYXRlIGluIHRoZSBjYXNlIG9mIHZlcnkgZmFzdCBzY3JvbGxpbmdcbmNvbnN0IG1heFNjYWxlUGVyRnJhbWUgPSAyO1xuXG4vKipcbiAqIFRoZSBgU2Nyb2xsWm9vbUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIHRoZSBtYXAgYnkgc2Nyb2xsaW5nLlxuICpcbiAqIEBzZWUgW0V4YW1wbGU6IFRvZ2dsZSBpbnRlcmFjdGlvbnNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RvZ2dsZS1pbnRlcmFjdGlvbi1oYW5kbGVycy8pXG4gKiBAc2VlIFtFeGFtcGxlOiBEaXNhYmxlIHNjcm9sbCB6b29tXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kaXNhYmxlLXNjcm9sbC16b29tLylcbiAqL1xuY2xhc3MgU2Nyb2xsWm9vbUhhbmRsZXIge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfZWw6IEhUTUxFbGVtZW50O1xuICAgIF9lbmFibGVkOiBib29sZWFuO1xuICAgIF9hY3RpdmU6IGJvb2xlYW47XG4gICAgX3pvb21pbmc6IGJvb2xlYW47XG4gICAgX2Fyb3VuZENlbnRlcjogYm9vbGVhbjtcbiAgICBfYXJvdW5kUG9pbnQ6IFBvaW50O1xuICAgIF9hcm91bmRDb29yZDogTWVyY2F0b3JDb29yZGluYXRlO1xuICAgIF90eXBlOiAnd2hlZWwnIHwgJ3RyYWNrcGFkJyB8IG51bGw7XG4gICAgX2xhc3RWYWx1ZTogbnVtYmVyO1xuICAgIF90aW1lb3V0OiA/VGltZW91dElEOyAvLyB1c2VkIGZvciBkZWxheWVkLWhhbmRsaW5nIG9mIGEgc2luZ2xlIHdoZWVsIG1vdmVtZW50XG4gICAgX2ZpbmlzaFRpbWVvdXQ6ID9UaW1lb3V0SUQ7IC8vIHVzZWQgdG8gZGVsYXkgZmluYWwgJ3ttb3ZlLHpvb219ZW5kJyBldmVudHNcblxuICAgIF9sYXN0V2hlZWxFdmVudDogYW55O1xuICAgIF9sYXN0V2hlZWxFdmVudFRpbWU6IG51bWJlcjtcblxuICAgIF9zdGFydFpvb206ID9udW1iZXI7XG4gICAgX3RhcmdldFpvb206ID9udW1iZXI7XG4gICAgX2RlbHRhOiBudW1iZXI7XG4gICAgX2Vhc2luZzogPygobnVtYmVyKSA9PiBudW1iZXIpO1xuICAgIF9wcmV2RWFzZTogP3tzdGFydDogbnVtYmVyLCBkdXJhdGlvbjogbnVtYmVyLCBlYXNpbmc6IChfOiBudW1iZXIpID0+IG51bWJlcn07XG5cbiAgICBfZnJhbWVJZDogP2Jvb2xlYW47XG4gICAgX2hhbmRsZXI6IEhhbmRsZXJNYW5hZ2VyO1xuXG4gICAgX2RlZmF1bHRab29tUmF0ZTogbnVtYmVyO1xuICAgIF93aGVlbFpvb21SYXRlOiBudW1iZXI7XG5cbiAgICBfYWxlcnRDb250YWluZXI6IEhUTUxFbGVtZW50OyAvLyB1c2VkIHRvIGRpc3BsYXkgdGhlIHNjcm9sbCB6b29tIGJsb2NrZXIgYWxlcnRcbiAgICBfYWxlcnRUaW1lcjogVGltZW91dElEO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCwgaGFuZGxlcjogSGFuZGxlck1hbmFnZXIpIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5faGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgICAgICAgdGhpcy5fZGVsdGEgPSAwO1xuXG4gICAgICAgIHRoaXMuX2RlZmF1bHRab29tUmF0ZSA9IGRlZmF1bHRab29tUmF0ZTtcbiAgICAgICAgdGhpcy5fd2hlZWxab29tUmF0ZSA9IHdoZWVsWm9vbVJhdGU7XG5cbiAgICAgICAgYmluZEFsbChbJ19vblRpbWVvdXQnLCAnX2FkZFNjcm9sbFpvb21CbG9ja2VyJywgJ19zaG93QmxvY2tlckFsZXJ0JywgJ19pc0Z1bGxzY3JlZW4nXSwgdGhpcyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB6b29tIHJhdGUgb2YgYSB0cmFja3BhZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbem9vbVJhdGU9MS8xMDBdIFRoZSByYXRlIHVzZWQgdG8gc2NhbGUgdHJhY2twYWQgbW92ZW1lbnQgdG8gYSB6b29tIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gU3BlZWQgdXAgdHJhY2twYWQgem9vbVxuICAgICAqIG1hcC5zY3JvbGxab29tLnNldFpvb21SYXRlKDEgLyAyNSk7XG4gICAgICovXG4gICAgc2V0Wm9vbVJhdGUoem9vbVJhdGU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9kZWZhdWx0Wm9vbVJhdGUgPSB6b29tUmF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFNldHMgdGhlIHpvb20gcmF0ZSBvZiBhIG1vdXNlIHdoZWVsLlxuICAgICAqXG4gICAgKiBAcGFyYW0ge251bWJlcn0gW3doZWVsWm9vbVJhdGU9MS80NTBdIFRoZSByYXRlIHVzZWQgdG8gc2NhbGUgbW91c2Ugd2hlZWwgbW92ZW1lbnQgdG8gYSB6b29tIHZhbHVlLlxuICAgICogQGV4YW1wbGVcbiAgICAqIC8vIFNsb3cgZG93biB6b29tIG9mIG1vdXNlIHdoZWVsXG4gICAgKiBtYXAuc2Nyb2xsWm9vbS5zZXRXaGVlbFpvb21SYXRlKDEgLyA2MDApO1xuICAgICovXG4gICAgc2V0V2hlZWxab29tUmF0ZSh3aGVlbFpvb21SYXRlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fd2hlZWxab29tUmF0ZSA9IHdoZWVsWm9vbVJhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcInNjcm9sbCB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwic2Nyb2xsIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNTY3JvbGxab29tRW5hYmxlZCA9IG1hcC5zY3JvbGxab29tLmlzRW5hYmxlZCgpO1xuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKlxuICAgICogQWN0aXZlIHN0YXRlIGlzIHR1cm5lZCBvbiBhbmQgb2ZmIHdpdGggZXZlcnkgc2Nyb2xsIHdoZWVsIGV2ZW50IGFuZCBpcyBzZXQgYmFjayB0byBmYWxzZSBiZWZvcmUgdGhlIG1hcFxuICAgICogcmVuZGVyIGlzIGNhbGxlZCwgc28gX2FjdGl2ZSBpcyBub3QgYSBnb29kIGNhbmRpZGF0ZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBzY3JvbGwgem9vbSBhbmltYXRpb24gaXMgaW5cbiAgICAqIHByb2dyZXNzLlxuICAgICovXG4gICAgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2FjdGl2ZSB8fCB0aGlzLl9maW5pc2hUaW1lb3V0ICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaXNab29taW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLl96b29taW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwic2Nyb2xsIHRvIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmFyb3VuZF0gSWYgXCJjZW50ZXJcIiBpcyBwYXNzZWQsIG1hcCB3aWxsIHpvb20gYXJvdW5kIGNlbnRlciBvZiBtYXAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zY3JvbGxab29tLmVuYWJsZSgpO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNjcm9sbFpvb20uZW5hYmxlKHthcm91bmQ6ICdjZW50ZXInfSk7XG4gICAgICovXG4gICAgZW5hYmxlKG9wdGlvbnM6ID97YXJvdW5kPzogJ2NlbnRlcid9KSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9hcm91bmRDZW50ZXIgPSAhIW9wdGlvbnMgJiYgb3B0aW9ucy5hcm91bmQgPT09ICdjZW50ZXInO1xuICAgICAgICBpZiAodGhpcy5fbWFwLl9jb29wZXJhdGl2ZUdlc3R1cmVzKSB0aGlzLl9hZGRTY3JvbGxab29tQmxvY2tlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcInNjcm9sbCB0byB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zY3JvbGxab29tLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fbWFwLl9jb29wZXJhdGl2ZUdlc3R1cmVzKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fYWxlcnRUaW1lcik7XG4gICAgICAgICAgICB0aGlzLl9hbGVydENvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdoZWVsKGU6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuX21hcC5fY29vcGVyYXRpdmVHZXN0dXJlcykge1xuICAgICAgICAgICAgaWYgKCFlLmN0cmxLZXkgJiYgIWUubWV0YUtleSAmJiAhdGhpcy5pc1pvb21pbmcoKSAmJiAhdGhpcy5faXNGdWxsc2NyZWVuKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG93QmxvY2tlckFsZXJ0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9hbGVydENvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ICE9PSAnaGlkZGVuJykge1xuICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGhpZGUgYWxlcnQgaWYgaXQgaXMgdmlzaWJsZSB3aGVuIGN0cmwgb3Ig4oyYIGlzIHByZXNzZWQgd2hpbGUgc2Nyb2xsIHpvb21pbmcuXG4gICAgICAgICAgICAgICAgdGhpcy5fYWxlcnRDb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9hbGVydFRpbWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBgYW55YCBjYXN0IHdoZW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzQ4NzkgaXMgZml4ZWQuXG4gICAgICAgIGxldCB2YWx1ZSA9IGUuZGVsdGFNb2RlID09PSAod2luZG93LldoZWVsRXZlbnQ6IGFueSkuRE9NX0RFTFRBX0xJTkUgPyBlLmRlbHRhWSAqIDQwIDogZS5kZWx0YVk7XG4gICAgICAgIGNvbnN0IG5vdyA9IGJyb3dzZXIubm93KCksXG4gICAgICAgICAgICB0aW1lRGVsdGEgPSBub3cgLSAodGhpcy5fbGFzdFdoZWVsRXZlbnRUaW1lIHx8IDApO1xuXG4gICAgICAgIHRoaXMuX2xhc3RXaGVlbEV2ZW50VGltZSA9IG5vdztcblxuICAgICAgICBpZiAodmFsdWUgIT09IDAgJiYgKHZhbHVlICUgd2hlZWxab29tRGVsdGEpID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIG9uZSBpcyBkZWZpbml0ZWx5IGEgbW91c2Ugd2hlZWwgZXZlbnQuXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gJ3doZWVsJztcblxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSAwICYmIE1hdGguYWJzKHZhbHVlKSA8IDQpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgb25lIGlzIGRlZmluaXRlbHkgYSB0cmFja3BhZCBldmVudCBiZWNhdXNlIGl0IGlzIHNvIHNtYWxsLlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9ICd0cmFja3BhZCc7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0aW1lRGVsdGEgPiA0MDApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgbGlrZWx5IGEgbmV3IHNjcm9sbCBhY3Rpb24uXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAvLyBTdGFydCBhIHRpbWVvdXQgaW4gY2FzZSB0aGlzIHdhcyBhIHNpbmd1bGFyIGV2ZW50LCBhbmQgZGVsYXkgaXQgYnkgdXAgdG8gNDBtcy5cbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMuX29uVGltZW91dCwgNDAsIGUpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3R5cGUpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXBlYXRpbmcgZXZlbnQsIGJ1dCB3ZSBkb24ndCBrbm93IHRoZSB0eXBlIG9mIGV2ZW50IGp1c3QgeWV0LlxuICAgICAgICAgICAgLy8gSWYgdGhlIGRlbHRhIHBlciB0aW1lIGlzIHNtYWxsLCB3ZSBhc3N1bWUgaXQncyBhIGZhc3QgdHJhY2twYWQ7IG90aGVyd2lzZSB3ZSBzd2l0Y2ggaW50byB3aGVlbCBtb2RlLlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IChNYXRoLmFicyh0aW1lRGVsdGEgKiB2YWx1ZSkgPCAyMDApID8gJ3RyYWNrcGFkJyA6ICd3aGVlbCc7XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBvdXIgZGVsYXllZCBldmVudCBpc24ndCBmaXJlZCBhZ2FpbiwgYmVjYXVzZSB3ZSBhY2N1bXVsYXRlXG4gICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgZXZlbnQgKHdoaWNoIHdhcyBsZXNzIHRoYW4gNDBtcyBhZ28pIGludG8gdGhpcyBldmVudC5cbiAgICAgICAgICAgIGlmICh0aGlzLl90aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhbHVlICs9IHRoaXMuX2xhc3RWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNsb3cgZG93biB6b29tIGlmIHNoaWZ0IGtleSBpcyBoZWxkIGZvciBtb3JlIHByZWNpc2Ugem9vbWluZ1xuICAgICAgICBpZiAoZS5zaGlmdEtleSAmJiB2YWx1ZSkgdmFsdWUgPSB2YWx1ZSAvIDQ7XG5cbiAgICAgICAgLy8gT25seSBmaXJlIHRoZSBjYWxsYmFjayBpZiB3ZSBhY3R1YWxseSBrbm93IHdoYXQgdHlwZSBvZiBzY3JvbGxpbmcgZGV2aWNlIHRoZSB1c2VyIHVzZXMuXG4gICAgICAgIGlmICh0aGlzLl90eXBlKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0V2hlZWxFdmVudCA9IGU7XG4gICAgICAgICAgICB0aGlzLl9kZWx0YSAtPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnQoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgX29uVGltZW91dChpbml0aWFsRXZlbnQ6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fdHlwZSA9ICd3aGVlbCc7XG4gICAgICAgIHRoaXMuX2RlbHRhIC09IHRoaXMuX2xhc3RWYWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0KGluaXRpYWxFdmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc3RhcnQoZTogV2hlZWxFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuX2RlbHRhKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuX2ZyYW1lSWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmlzWm9vbWluZygpKSB7XG4gICAgICAgICAgICB0aGlzLl96b29taW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZmluaXNoVGltZW91dCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fZmluaXNoVGltZW91dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvcyA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSk7XG4gICAgICAgIHRoaXMuX2Fyb3VuZFBvaW50ID0gdGhpcy5fYXJvdW5kQ2VudGVyID8gdGhpcy5fbWFwLnRyYW5zZm9ybS5jZW50ZXJQb2ludCA6IHBvcztcbiAgICAgICAgdGhpcy5fYXJvdW5kQ29vcmQgPSB0aGlzLl9tYXAudHJhbnNmb3JtLnBvaW50Q29vcmRpbmF0ZTNEKHRoaXMuX2Fyb3VuZFBvaW50KTtcbiAgICAgICAgdGhpcy5fdGFyZ2V0Wm9vbSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoIXRoaXMuX2ZyYW1lSWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlci5fdHJpZ2dlclJlbmRlckZyYW1lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJGcmFtZSgpOiA/SGFuZGxlclJlc3VsdCB7XG4gICAgICAgIGlmICghdGhpcy5fZnJhbWVJZCkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9mcmFtZUlkID0gbnVsbDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5fbWFwLnRyYW5zZm9ybTtcblxuICAgICAgICBjb25zdCBzdGFydGluZ1pvb20gPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKHRyLl90ZXJyYWluRW5hYmxlZCgpICYmIHRoaXMuX2Fyb3VuZENvb3JkKSA/IHRyLmNvbXB1dGVab29tUmVsYXRpdmVUbyh0aGlzLl9hcm91bmRDb29yZCkgOiB0ci56b29tO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGlmIHdlJ3ZlIGhhZCBzY3JvbGwgZXZlbnRzIHNpbmNlIHRoZSBsYXN0IHJlbmRlciBmcmFtZSwgY29uc3VtZSB0aGVcbiAgICAgICAgLy8gYWNjdW11bGF0ZWQgZGVsdGEsIGFuZCB1cGRhdGUgdGhlIHRhcmdldCB6b29tIGxldmVsIGFjY29yZGluZ2x5XG4gICAgICAgIGlmICh0aGlzLl9kZWx0YSAhPT0gMCkge1xuICAgICAgICAgICAgLy8gRm9yIHRyYWNrcGFkIGV2ZW50cyBhbmQgc2luZ2xlIG1vdXNlIHdoZWVsIHRpY2tzLCB1c2UgdGhlIGRlZmF1bHQgem9vbSByYXRlXG4gICAgICAgICAgICBjb25zdCB6b29tUmF0ZSA9ICh0aGlzLl90eXBlID09PSAnd2hlZWwnICYmIE1hdGguYWJzKHRoaXMuX2RlbHRhKSA+IHdoZWVsWm9vbURlbHRhKSA/IHRoaXMuX3doZWVsWm9vbVJhdGUgOiB0aGlzLl9kZWZhdWx0Wm9vbVJhdGU7XG4gICAgICAgICAgICAvLyBTY2FsZSBieSBzaWdtb2lkIG9mIHNjcm9sbCB3aGVlbCBkZWx0YS5cbiAgICAgICAgICAgIGxldCBzY2FsZSA9IG1heFNjYWxlUGVyRnJhbWUgLyAoMSArIE1hdGguZXhwKC1NYXRoLmFicyh0aGlzLl9kZWx0YSAqIHpvb21SYXRlKSkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVsdGEgPCAwICYmIHNjYWxlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgc2NhbGUgPSAxIC8gc2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Wm9vbSA9IHN0YXJ0aW5nWm9vbSgpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRTY2FsZSA9IE1hdGgucG93KDIuMCwgc3RhcnRab29tKTtcblxuICAgICAgICAgICAgY29uc3QgZnJvbVNjYWxlID0gdHlwZW9mIHRoaXMuX3RhcmdldFpvb20gPT09ICdudW1iZXInID8gdHIuem9vbVNjYWxlKHRoaXMuX3RhcmdldFpvb20pIDogc3RhcnRTY2FsZTtcbiAgICAgICAgICAgIHRoaXMuX3RhcmdldFpvb20gPSBNYXRoLm1pbih0ci5tYXhab29tLCBNYXRoLm1heCh0ci5taW5ab29tLCB0ci5zY2FsZVpvb20oZnJvbVNjYWxlICogc2NhbGUpKSk7XG5cbiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBtb3VzZSB3aGVlbCwgcmVmcmVzaCB0aGUgc3RhcnRpbmcgem9vbSBhbmQgZWFzaW5nXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiB3ZSdyZSB1c2luZyB0byBzbW9vdGggb3V0IHRoZSB6b29taW5nIGJldHdlZW4gd2hlZWxcbiAgICAgICAgICAgIC8vIGV2ZW50c1xuICAgICAgICAgICAgaWYgKHRoaXMuX3R5cGUgPT09ICd3aGVlbCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydFpvb20gPSBzdGFydGluZ1pvb20oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lYXNpbmcgPSB0aGlzLl9zbW9vdGhPdXRFYXNpbmcoMjAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZGVsdGEgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhcmdldFpvb20gPSB0eXBlb2YgdGhpcy5fdGFyZ2V0Wm9vbSA9PT0gJ251bWJlcicgP1xuICAgICAgICAgICAgdGhpcy5fdGFyZ2V0Wm9vbSA6IHN0YXJ0aW5nWm9vbSgpO1xuICAgICAgICBjb25zdCBzdGFydFpvb20gPSB0aGlzLl9zdGFydFpvb207XG4gICAgICAgIGNvbnN0IGVhc2luZyA9IHRoaXMuX2Vhc2luZztcblxuICAgICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHpvb207XG4gICAgICAgIGlmICh0aGlzLl90eXBlID09PSAnd2hlZWwnICYmIHN0YXJ0Wm9vbSAmJiBlYXNpbmcpIHtcbiAgICAgICAgICAgIGFzc2VydChlYXNpbmcgJiYgdHlwZW9mIHN0YXJ0Wm9vbSA9PT0gJ251bWJlcicpO1xuXG4gICAgICAgICAgICBjb25zdCB0ID0gTWF0aC5taW4oKGJyb3dzZXIubm93KCkgLSB0aGlzLl9sYXN0V2hlZWxFdmVudFRpbWUpIC8gMjAwLCAxKTtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBlYXNpbmcodCk7XG4gICAgICAgICAgICB6b29tID0gaW50ZXJwb2xhdGUoc3RhcnRab29tLCB0YXJnZXRab29tLCBrKTtcbiAgICAgICAgICAgIGlmICh0IDwgMSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZnJhbWVJZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHpvb20gPSB0YXJnZXRab29tO1xuICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZmluaXNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZmluaXNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3pvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVyLl90cmlnZ2VyUmVuZGVyRnJhbWUoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdGFyZ2V0Wm9vbTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fZmluaXNoVGltZW91dDtcbiAgICAgICAgICAgIH0sIDIwMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9JbmVydGlhOiB0cnVlLFxuICAgICAgICAgICAgbmVlZHNSZW5kZXJGcmFtZTogIWZpbmlzaGVkLFxuICAgICAgICAgICAgem9vbURlbHRhOiB6b29tIC0gc3RhcnRpbmdab29tKCksXG4gICAgICAgICAgICBhcm91bmQ6IHRoaXMuX2Fyb3VuZFBvaW50LFxuICAgICAgICAgICAgYXJvdW5kQ29vcmQ6IHRoaXMuX2Fyb3VuZENvb3JkLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogdGhpcy5fbGFzdFdoZWVsRXZlbnRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfc21vb3RoT3V0RWFzaW5nKGR1cmF0aW9uOiBudW1iZXIpOiAobnVtYmVyKSA9PiBudW1iZXIge1xuICAgICAgICBsZXQgZWFzaW5nID0gX2Vhc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXZFYXNlKSB7XG4gICAgICAgICAgICBjb25zdCBlYXNlID0gdGhpcy5fcHJldkVhc2UsXG4gICAgICAgICAgICAgICAgdCA9IChicm93c2VyLm5vdygpIC0gZWFzZS5zdGFydCkgLyBlYXNlLmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIHNwZWVkID0gZWFzZS5lYXNpbmcodCArIDAuMDEpIC0gZWFzZS5lYXNpbmcodCksXG5cbiAgICAgICAgICAgICAgICAvLyBRdWljayBoYWNrIHRvIG1ha2UgbmV3IGJlemllciB0aGF0IGlzIGNvbnRpbnVvdXMgd2l0aCBsYXN0XG4gICAgICAgICAgICAgICAgeCA9IDAuMjcgLyBNYXRoLnNxcnQoc3BlZWQgKiBzcGVlZCArIDAuMDAwMSkgKiAwLjAxLFxuICAgICAgICAgICAgICAgIHkgPSBNYXRoLnNxcnQoMC4yNyAqIDAuMjcgLSB4ICogeCk7XG5cbiAgICAgICAgICAgIGVhc2luZyA9IGJlemllcih4LCB5LCAwLjI1LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3ByZXZFYXNlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IGJyb3dzZXIubm93KCksXG4gICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgIGVhc2luZ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBlYXNpbmc7XG4gICAgfVxuXG4gICAgYmx1cigpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBfYWRkU2Nyb2xsWm9vbUJsb2NrZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXAgJiYgIXRoaXMuX2FsZXJ0Q29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGVydENvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1zY3JvbGwtem9vbS1ibG9ja2VyJywgdGhpcy5fbWFwLl9jb250YWluZXIpO1xuXG4gICAgICAgICAgICBpZiAoLyhNYWN8aVBhZCkvaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FsZXJ0Q29udGFpbmVyLnRleHRDb250ZW50ID0gdGhpcy5fbWFwLl9nZXRVSVN0cmluZygnU2Nyb2xsWm9vbUJsb2NrZXIuQ21kTWVzc2FnZScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbGVydENvbnRhaW5lci50ZXh0Q29udGVudCA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoJ1Njcm9sbFpvb21CbG9ja2VyLkN0cmxNZXNzYWdlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGR5bmFtaWNhbGx5IHNldCB0aGUgZm9udCBzaXplIG9mIHRoZSBzY3JvbGwgem9vbSBibG9ja2VyIGFsZXJ0IG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMuX2FsZXJ0Q29udGFpbmVyLnN0eWxlLmZvbnRTaXplID0gYCR7TWF0aC5tYXgoMTAsIE1hdGgubWluKDI0LCBNYXRoLmZsb29yKHRoaXMuX2VsLmNsaWVudFdpZHRoICogMC4wNSkpKX1weGA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfaXNGdWxsc2NyZWVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF3aW5kb3cuZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgISF3aW5kb3cuZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQ7XG4gICAgfVxuXG4gICAgX3Nob3dCbG9ja2VyQWxlcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hbGVydENvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID09PSAnaGlkZGVuJykgdGhpcy5fYWxlcnRDb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5fYWxlcnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtc2Nyb2xsLXpvb20tYmxvY2tlci1zaG93Jyk7XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2FsZXJ0VGltZXIpO1xuXG4gICAgICAgIHRoaXMuX2FsZXJ0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2FsZXJ0Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLXNjcm9sbC16b29tLWJsb2NrZXItc2hvdycpO1xuICAgICAgICB9LCAyMDApO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTY3JvbGxab29tSGFuZGxlcjtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIENsaWNrWm9vbUhhbmRsZXIgZnJvbSAnLi4vY2xpY2tfem9vbS5qcyc7XG5pbXBvcnQgdHlwZSBUYXBab29tSGFuZGxlciBmcm9tICcuLy4uL3RhcF96b29tLmpzJztcblxuLyoqXG4gKiBUaGUgYERvdWJsZUNsaWNrWm9vbUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIHRoZSBtYXAgYXQgYSBwb2ludCBieVxuICogZG91YmxlIGNsaWNraW5nIG9yIGRvdWJsZSB0YXBwaW5nLlxuICpcbiAqIEBzZWUgW0V4YW1wbGU6IFRvZ2dsZSBpbnRlcmFjdGlvbnNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RvZ2dsZS1pbnRlcmFjdGlvbi1oYW5kbGVycy8pXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvdWJsZUNsaWNrWm9vbUhhbmRsZXIge1xuXG4gICAgX2NsaWNrWm9vbTogQ2xpY2tab29tSGFuZGxlcjtcbiAgICBfdGFwWm9vbTogVGFwWm9vbUhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpY2tab29tOiBDbGlja1pvb21IYW5kbGVyLCBUYXBab29tOiBUYXBab29tSGFuZGxlcikge1xuICAgICAgICB0aGlzLl9jbGlja1pvb20gPSBjbGlja1pvb207XG4gICAgICAgIHRoaXMuX3RhcFpvb20gPSBUYXBab29tO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRvdWJsZUNsaWNrWm9vbS5lbmFibGUoKTtcbiAgICAgKi9cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuX2NsaWNrWm9vbS5lbmFibGUoKTtcbiAgICAgICAgdGhpcy5fdGFwWm9vbS5lbmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZG91YmxlQ2xpY2tab29tLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLl9jbGlja1pvb20uZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLl90YXBab29tLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGlzRG91YmxlQ2xpY2tab29tRW5hYmxlZCA9IG1hcC5kb3VibGVDbGlja1pvb20uaXNFbmFibGVkKCk7XG4gICAgICovXG4gICAgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xpY2tab29tLmlzRW5hYmxlZCgpICYmIHRoaXMuX3RhcFpvb20uaXNFbmFibGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlIChjdXJyZW50bHkgYmVpbmcgdXNlZCkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIFwiZG91YmxlIGNsaWNrIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc0RvdWJsZUNsaWNrWm9vbUFjdGl2ZSA9IG1hcC5kb3VibGVDbGlja1pvb20uaXNBY3RpdmUoKTtcbiAgICAgKi9cbiAgICBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWNrWm9vbS5pc0FjdGl2ZSgpIHx8IHRoaXMuX3RhcFpvb20uaXNBY3RpdmUoKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAuanMnO1xuaW1wb3J0IHR5cGUge0hhbmRsZXJSZXN1bHR9IGZyb20gJy4uL2hhbmRsZXJfbWFuYWdlci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWNrWm9vbUhhbmRsZXIge1xuXG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGJsdXIoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBkYmxjbGljayhlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpOiBIYW5kbGVyUmVzdWx0IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2FtZXJhQW5pbWF0aW9uOiAobWFwOiBNYXApID0+IHtcbiAgICAgICAgICAgICAgICBtYXAuZWFzZVRvKHtcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgICAgICAgICAgem9vbTogbWFwLmdldFpvb20oKSArIChlLnNoaWZ0S2V5ID8gLTEgOiAxKSxcbiAgICAgICAgICAgICAgICAgICAgYXJvdW5kOiBtYXAudW5wcm9qZWN0KHBvaW50KVxuICAgICAgICAgICAgICAgIH0sIHtvcmlnaW5hbEV2ZW50OiBlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7VGFwUmVjb2duaXplciwgTUFYX1RBUF9JTlRFUlZBTH0gZnJvbSAnLi90YXBfcmVjb2duaXplci5qcyc7XG5pbXBvcnQgdHlwZSBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIHtIYW5kbGVyUmVzdWx0fSBmcm9tICcuLi9oYW5kbGVyX21hbmFnZXIuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYXBEcmFnWm9vbUhhbmRsZXIge1xuXG4gICAgX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgX2FjdGl2ZTogYm9vbGVhbjtcbiAgICBfc3dpcGVQb2ludDogP1BvaW50O1xuICAgIF9zd2lwZVRvdWNoOiBudW1iZXI7XG4gICAgX3RhcFRpbWU6IG51bWJlcjtcbiAgICBfdGFwOiBUYXBSZWNvZ25pemVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG5cbiAgICAgICAgdGhpcy5fdGFwID0gbmV3IFRhcFJlY29nbml6ZXIoe1xuICAgICAgICAgICAgbnVtVG91Y2hlczogMSxcbiAgICAgICAgICAgIG51bVRhcHM6IDFcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3dpcGVQb2ludCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc3dpcGVUb3VjaCA9IDA7XG4gICAgICAgIHRoaXMuX3RhcFRpbWUgPSAwO1xuICAgICAgICB0aGlzLl90YXAucmVzZXQoKTtcbiAgICB9XG5cbiAgICB0b3VjaHN0YXJ0KGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3N3aXBlUG9pbnQpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy5fdGFwVGltZSAmJiBlLnRpbWVTdGFtcCAtIHRoaXMuX3RhcFRpbWUgPiBNQVhfVEFQX0lOVEVSVkFMKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX3RhcFRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhcC50b3VjaHN0YXJ0KGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgIH0gZWxzZSBpZiAobWFwVG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9zd2lwZVBvaW50ID0gcG9pbnRzWzBdO1xuICAgICAgICAgICAgdGhpcy5fc3dpcGVUb3VjaCA9IG1hcFRvdWNoZXNbMF0uaWRlbnRpZmllcjtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgdG91Y2htb3ZlKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pOiA/SGFuZGxlclJlc3VsdCB7XG4gICAgICAgIGlmICghdGhpcy5fdGFwVGltZSkge1xuICAgICAgICAgICAgdGhpcy5fdGFwLnRvdWNobW92ZShlLCBwb2ludHMsIG1hcFRvdWNoZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3N3aXBlUG9pbnQpIHtcbiAgICAgICAgICAgIGlmIChtYXBUb3VjaGVzWzBdLmlkZW50aWZpZXIgIT09IHRoaXMuX3N3aXBlVG91Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld1N3aXBlUG9pbnQgPSBwb2ludHNbMF07XG4gICAgICAgICAgICBjb25zdCBkaXN0ID0gbmV3U3dpcGVQb2ludC55IC0gdGhpcy5fc3dpcGVQb2ludC55O1xuICAgICAgICAgICAgdGhpcy5fc3dpcGVQb2ludCA9IG5ld1N3aXBlUG9pbnQ7XG5cbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgem9vbURlbHRhOiBkaXN0IC8gMTI4XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG91Y2hlbmQoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikge1xuICAgICAgICBpZiAoIXRoaXMuX3RhcFRpbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gdGhpcy5fdGFwLnRvdWNoZW5kKGUsIHBvaW50cywgbWFwVG91Y2hlcyk7XG4gICAgICAgICAgICBpZiAocG9pbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90YXBUaW1lID0gZS50aW1lU3RhbXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc3dpcGVQb2ludCkge1xuICAgICAgICAgICAgaWYgKG1hcFRvdWNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG91Y2hjYW5jZWwoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHR5cGUge01vdXNlUGFuSGFuZGxlcn0gZnJvbSAnLi4vbW91c2UuanMnO1xuaW1wb3J0IHR5cGUgVG91Y2hQYW5IYW5kbGVyIGZyb20gJy4vLi4vdG91Y2hfcGFuLmpzJztcblxuZXhwb3J0IHR5cGUgRHJhZ1Bhbk9wdGlvbnMgPSB7XG4gICAgbGluZWFyaXR5PzogbnVtYmVyO1xuICAgIGVhc2luZz86ICh0OiBudW1iZXIpID0+IG51bWJlcjtcbiAgICBkZWNlbGVyYXRpb24/OiBudW1iZXI7XG4gICAgbWF4U3BlZWQ/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIFRoZSBgRHJhZ1BhbkhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byBwYW4gdGhlIG1hcCBieSBjbGlja2luZyBhbmQgZHJhZ2dpbmdcbiAqIHRoZSBjdXJzb3IuXG4gKlxuICogQHNlZSBbRXhhbXBsZTogVG9nZ2xlIGludGVyYWN0aW9uc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdG9nZ2xlLWludGVyYWN0aW9uLWhhbmRsZXJzLylcbiAqIEBzZWUgW0V4YW1wbGU6IEhpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcmFnUGFuSGFuZGxlciB7XG5cbiAgICBfZWw6IEhUTUxFbGVtZW50O1xuICAgIF9tb3VzZVBhbjogTW91c2VQYW5IYW5kbGVyO1xuICAgIF90b3VjaFBhbjogVG91Y2hQYW5IYW5kbGVyO1xuICAgIF9pbmVydGlhT3B0aW9uczogRHJhZ1Bhbk9wdGlvbnNcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlbDogSFRNTEVsZW1lbnQsIG1vdXNlUGFuOiBNb3VzZVBhbkhhbmRsZXIsIHRvdWNoUGFuOiBUb3VjaFBhbkhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fZWwgPSBlbDtcbiAgICAgICAgdGhpcy5fbW91c2VQYW4gPSBtb3VzZVBhbjtcbiAgICAgICAgdGhpcy5fdG91Y2hQYW4gPSB0b3VjaFBhbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gYW5kIGFjY2VwdHMgb3B0aW9ucyB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUgcGFubmluZyBpbmVydGlhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubGluZWFyaXR5PTBdIEZhY3RvciB1c2VkIHRvIHNjYWxlIHRoZSBkcmFnIHZlbG9jaXR5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmVhc2luZ10gT3B0aW9uYWwgZWFzaW5nIGZ1bmN0aW9uIGFwcGxpZWQgdG8ge0BsaW5rIE1hcCNwYW5Ub30gd2hlbiBhcHBseWluZyB0aGUgZHJhZy4gRGVmYXVsdHMgdG8gYmV6aWVyIGZ1bmN0aW9uIHVzaW5nIFtAbWFwYm94L3VuaXRiZXppZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvdW5pdGJlemllcikuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFNwZWVkPTE0MDBdIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBkcmFnIHZlbG9jaXR5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5kZWNlbGVyYXRpb249MjUwMF0gVGhlIHJhdGUgYXQgd2hpY2ggdGhlIHNwZWVkIHJlZHVjZXMgYWZ0ZXIgdGhlIHBhbiBlbmRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZHJhZ1Bhbi5lbmFibGUoKTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kcmFnUGFuLmVuYWJsZSh7XG4gICAgICogICAgIGxpbmVhcml0eTogMC4zLFxuICAgICAqICAgICBlYXNpbmc6IHQgPT4gdCxcbiAgICAgKiAgICAgbWF4U3BlZWQ6IDE0MDAsXG4gICAgICogICAgIGRlY2VsZXJhdGlvbjogMjUwMFxuICAgICAqIH0pO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IEhpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICAgICAqL1xuICAgIGVuYWJsZShvcHRpb25zPzogRHJhZ1Bhbk9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5faW5lcnRpYU9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB0aGlzLl9tb3VzZVBhbi5lbmFibGUoKTtcbiAgICAgICAgdGhpcy5fdG91Y2hQYW4uZW5hYmxlKCk7XG4gICAgICAgIHRoaXMuX2VsLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLXRvdWNoLWRyYWctcGFuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRyYWdQYW4uZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX21vdXNlUGFuLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5fdG91Y2hQYW4uZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLl9lbC5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC10b3VjaC1kcmFnLXBhbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNEcmFnUGFuRW5hYmxlZCA9IG1hcC5kcmFnUGFuLmlzRW5hYmxlZCgpO1xuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdXNlUGFuLmlzRW5hYmxlZCgpICYmIHRoaXMuX3RvdWNoUGFuLmlzRW5hYmxlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZSAoY3VycmVudGx5IGJlaW5nIHVzZWQpLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNEcmFnUGFuQWN0aXZlID0gbWFwLmRyYWdQYW4uaXNBY3RpdmUoKTtcbiAgICAgKi9cbiAgICBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdXNlUGFuLmlzQWN0aXZlKCkgfHwgdGhpcy5fdG91Y2hQYW4uaXNBY3RpdmUoKTtcbiAgICB9XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgdHlwZSB7TW91c2VSb3RhdGVIYW5kbGVyLCBNb3VzZVBpdGNoSGFuZGxlcn0gZnJvbSAnLi4vbW91c2UuanMnO1xuXG4vKipcbiAqIFRoZSBgRHJhZ1JvdGF0ZUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byByb3RhdGUgdGhlIG1hcCBieSBjbGlja2luZyBhbmRcbiAqIGRyYWdnaW5nIHRoZSBjdXJzb3Igd2hpbGUgaG9sZGluZyB0aGUgcmlnaHQgbW91c2UgYnV0dG9uIG9yIGBjdHJsYCBrZXkuXG4gKlxuICogQHNlZSBbRXhhbXBsZTogVG9nZ2xlIGludGVyYWN0aW9uc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdG9nZ2xlLWludGVyYWN0aW9uLWhhbmRsZXJzLylcbiAqIEBzZWUgW0V4YW1wbGU6IERpc2FibGUgbWFwIHJvdGF0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kaXNhYmxlLXJvdGF0aW9uLylcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJhZ1JvdGF0ZUhhbmRsZXIge1xuXG4gICAgX21vdXNlUm90YXRlOiBNb3VzZVJvdGF0ZUhhbmRsZXI7XG4gICAgX21vdXNlUGl0Y2g6IE1vdXNlUGl0Y2hIYW5kbGVyO1xuICAgIF9waXRjaFdpdGhSb3RhdGU6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJlYXJpbmdTbmFwXSBUaGUgdGhyZXNob2xkLCBtZWFzdXJlZCBpbiBkZWdyZWVzLCB0aGF0IGRldGVybWluZXMgd2hlbiB0aGUgbWFwJ3NcbiAgICAgKiAgIGJlYXJpbmcgd2lsbCBzbmFwIHRvIG5vcnRoLlxuICAgICAqIEBwYXJhbSB7Ym9vbH0gW29wdGlvbnMucGl0Y2hXaXRoUm90YXRlPXRydWVdIENvbnRyb2wgdGhlIG1hcCBwaXRjaCBpbiBhZGRpdGlvbiB0byB0aGUgYmVhcmluZ1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczoge3BpdGNoV2l0aFJvdGF0ZTogYm9vbGVhbn0sIG1vdXNlUm90YXRlOiBNb3VzZVJvdGF0ZUhhbmRsZXIsIG1vdXNlUGl0Y2g6IE1vdXNlUGl0Y2hIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuX3BpdGNoV2l0aFJvdGF0ZSA9IG9wdGlvbnMucGl0Y2hXaXRoUm90YXRlO1xuICAgICAgICB0aGlzLl9tb3VzZVJvdGF0ZSA9IG1vdXNlUm90YXRlO1xuICAgICAgICB0aGlzLl9tb3VzZVBpdGNoID0gbW91c2VQaXRjaDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kcmFnUm90YXRlLmVuYWJsZSgpO1xuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5fbW91c2VSb3RhdGUuZW5hYmxlKCk7XG4gICAgICAgIGlmICh0aGlzLl9waXRjaFdpdGhSb3RhdGUpIHRoaXMuX21vdXNlUGl0Y2guZW5hYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRyYWdSb3RhdGUuZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX21vdXNlUm90YXRlLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5fbW91c2VQaXRjaC5kaXNhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNEcmFnUm90YXRlRW5hYmxlZCA9IG1hcC5kcmFnUm90YXRlLmlzRW5hYmxlZCgpO1xuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdXNlUm90YXRlLmlzRW5hYmxlZCgpICYmICghdGhpcy5fcGl0Y2hXaXRoUm90YXRlIHx8IHRoaXMuX21vdXNlUGl0Y2guaXNFbmFibGVkKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZSAoY3VycmVudGx5IGJlaW5nIHVzZWQpLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNEcmFnUm90YXRlQWN0aXZlID0gbWFwLmRyYWdSb3RhdGUuaXNBY3RpdmUoKTtcbiAgICAgKi9cbiAgICBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdXNlUm90YXRlLmlzQWN0aXZlKCkgfHwgdGhpcy5fbW91c2VQaXRjaC5pc0FjdGl2ZSgpO1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB0eXBlIHtUb3VjaFpvb21IYW5kbGVyLCBUb3VjaFJvdGF0ZUhhbmRsZXJ9IGZyb20gJy4uL3RvdWNoX3pvb21fcm90YXRlLmpzJztcbmltcG9ydCB0eXBlIFRhcERyYWdab29tSGFuZGxlciBmcm9tICcuLi90YXBfZHJhZ196b29tLmpzJztcblxuLyoqXG4gKiBUaGUgYFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIGFuZCByb3RhdGUgdGhlIG1hcCBieVxuICogcGluY2hpbmcgb24gYSB0b3VjaHNjcmVlbi5cbiAqXG4gKiBUaGV5IGNhbiB6b29tIHdpdGggb25lIGZpbmdlciBieSBkb3VibGUgdGFwcGluZyBhbmQgZHJhZ2dpbmcuIE9uIHRoZSBzZWNvbmQgdGFwLFxuICogaG9sZCB0aGUgZmluZ2VyIGRvd24gYW5kIGRyYWcgdXAgb3IgZG93biB0byB6b29tIGluIG9yIG91dC5cbiAqXG4gKiBAc2VlIFtFeGFtcGxlOiBUb2dnbGUgaW50ZXJhY3Rpb25zXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90b2dnbGUtaW50ZXJhY3Rpb24taGFuZGxlcnMvKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyIHtcblxuICAgIF9lbDogSFRNTEVsZW1lbnQ7XG4gICAgX3RvdWNoWm9vbTogVG91Y2hab29tSGFuZGxlcjtcbiAgICBfdG91Y2hSb3RhdGU6IFRvdWNoUm90YXRlSGFuZGxlcjtcbiAgICBfdGFwRHJhZ1pvb206IFRhcERyYWdab29tSGFuZGxlcjtcbiAgICBfcm90YXRpb25EaXNhYmxlZDogYm9vbGVhbjtcbiAgICBfZW5hYmxlZDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgKi9cbiAgICBjb25zdHJ1Y3RvcihlbDogSFRNTEVsZW1lbnQsIHRvdWNoWm9vbTogVG91Y2hab29tSGFuZGxlciwgdG91Y2hSb3RhdGU6IFRvdWNoUm90YXRlSGFuZGxlciwgdGFwRHJhZ1pvb206IFRhcERyYWdab29tSGFuZGxlcikge1xuICAgICAgICB0aGlzLl9lbCA9IGVsO1xuICAgICAgICB0aGlzLl90b3VjaFpvb20gPSB0b3VjaFpvb207XG4gICAgICAgIHRoaXMuX3RvdWNoUm90YXRlID0gdG91Y2hSb3RhdGU7XG4gICAgICAgIHRoaXMuX3RhcERyYWdab29tID0gdGFwRHJhZ1pvb207XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gT3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmFyb3VuZF0gSWYgXCJjZW50ZXJcIiBpcyBwYXNzZWQsIG1hcCB3aWxsIHpvb20gYXJvdW5kIHRoZSBjZW50ZXIuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKCk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAudG91Y2hab29tUm90YXRlLmVuYWJsZSh7YXJvdW5kOiAnY2VudGVyJ30pO1xuICAgICAqL1xuICAgIGVuYWJsZShvcHRpb25zOiA/e2Fyb3VuZD86ICdjZW50ZXInfSkge1xuICAgICAgICB0aGlzLl90b3VjaFpvb20uZW5hYmxlKG9wdGlvbnMpO1xuICAgICAgICBpZiAoIXRoaXMuX3JvdGF0aW9uRGlzYWJsZWQpIHRoaXMuX3RvdWNoUm90YXRlLmVuYWJsZShvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdGFwRHJhZ1pvb20uZW5hYmxlKCk7XG4gICAgICAgIHRoaXMuX2VsLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLXRvdWNoLXpvb20tcm90YXRlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC50b3VjaFpvb21Sb3RhdGUuZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuX3RvdWNoWm9vbS5kaXNhYmxlKCk7XG4gICAgICAgIHRoaXMuX3RvdWNoUm90YXRlLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5fdGFwRHJhZ1pvb20uZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLl9lbC5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC10b3VjaC16b29tLXJvdGF0ZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNUb3VjaFpvb21Sb3RhdGVFbmFibGVkID0gbWFwLnRvdWNoWm9vbVJvdGF0ZS5pc0VuYWJsZWQoKTtcbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3VjaFpvb20uaXNFbmFibGVkKCkgJiZcbiAgICAgICAgICAgICh0aGlzLl9yb3RhdGlvbkRpc2FibGVkIHx8IHRoaXMuX3RvdWNoUm90YXRlLmlzRW5hYmxlZCgpKSAmJlxuICAgICAgICAgICAgdGhpcy5fdGFwRHJhZ1pvb20uaXNFbmFibGVkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBoYW5kbGVyIGlzIGVuYWJsZWQgYW5kIGhhcyBkZXRlY3RlZCB0aGUgc3RhcnQgb2YgYSB6b29tL3JvdGF0ZSBnZXN0dXJlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBlbmFibGVkIGFuZCBhIHpvb20vcm90YXRlIGdlc3R1cmUgd2FzIGRldGVjdGVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNUb3VjaFpvb21Sb3RhdGVBY3RpdmUgPSBtYXAudG91Y2hab29tUm90YXRlLmlzQWN0aXZlKCk7XG4gICAgICovXG4gICAgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl90b3VjaFpvb20uaXNBY3RpdmUoKSB8fCB0aGlzLl90b3VjaFJvdGF0ZS5pc0FjdGl2ZSgpIHx8IHRoaXMuX3RhcERyYWdab29tLmlzQWN0aXZlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwicGluY2ggdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24sIGxlYXZpbmcgdGhlIFwicGluY2ggdG8gem9vbVwiXG4gICAgICogaW50ZXJhY3Rpb24gZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnRvdWNoWm9vbVJvdGF0ZS5kaXNhYmxlUm90YXRpb24oKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlUm90YXRpb24oKSB7XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl90b3VjaFJvdGF0ZS5kaXNhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGVcIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnRvdWNoWm9vbVJvdGF0ZS5lbmFibGUoKTtcbiAgICAgKiBtYXAudG91Y2hab29tUm90YXRlLmVuYWJsZVJvdGF0aW9uKCk7XG4gICAgICovXG4gICAgZW5hYmxlUm90YXRpb24oKSB7XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX3RvdWNoWm9vbS5pc0VuYWJsZWQoKSkgdGhpcy5fdG91Y2hSb3RhdGUuZW5hYmxlKCk7XG4gICAgfVxufVxuIiwiLy8gQGZsb3dcblxuaW1wb3J0IHtFdmVudH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCAqIGFzIERPTSBmcm9tICcuLi91dGlsL2RvbS5qcyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAuanMnO1xuaW1wb3J0IEhhbmRsZXJJbmVydGlhIGZyb20gJy4vaGFuZGxlcl9pbmVydGlhLmpzJztcbmltcG9ydCB7TWFwRXZlbnRIYW5kbGVyLCBCbG9ja2FibGVNYXBFdmVudEhhbmRsZXJ9IGZyb20gJy4vaGFuZGxlci9tYXBfZXZlbnQuanMnO1xuaW1wb3J0IEJveFpvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9ib3hfem9vbS5qcyc7XG5pbXBvcnQgVGFwWm9vbUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3RhcF96b29tLmpzJztcbmltcG9ydCB7TW91c2VQYW5IYW5kbGVyLCBNb3VzZVJvdGF0ZUhhbmRsZXIsIE1vdXNlUGl0Y2hIYW5kbGVyfSBmcm9tICcuL2hhbmRsZXIvbW91c2UuanMnO1xuaW1wb3J0IFRvdWNoUGFuSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvdG91Y2hfcGFuLmpzJztcbmltcG9ydCB7VG91Y2hab29tSGFuZGxlciwgVG91Y2hSb3RhdGVIYW5kbGVyLCBUb3VjaFBpdGNoSGFuZGxlcn0gZnJvbSAnLi9oYW5kbGVyL3RvdWNoX3pvb21fcm90YXRlLmpzJztcbmltcG9ydCBLZXlib2FyZEhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL2tleWJvYXJkLmpzJztcbmltcG9ydCBTY3JvbGxab29tSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvc2Nyb2xsX3pvb20uanMnO1xuaW1wb3J0IERvdWJsZUNsaWNrWm9vbUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3NoaW0vZGJsY2xpY2tfem9vbS5qcyc7XG5pbXBvcnQgQ2xpY2tab29tSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvY2xpY2tfem9vbS5qcyc7XG5pbXBvcnQgVGFwRHJhZ1pvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci90YXBfZHJhZ196b29tLmpzJztcbmltcG9ydCBEcmFnUGFuSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvc2hpbS9kcmFnX3Bhbi5qcyc7XG5pbXBvcnQgRHJhZ1JvdGF0ZUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3NoaW0vZHJhZ19yb3RhdGUuanMnO1xuaW1wb3J0IFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3NoaW0vdG91Y2hfem9vbV9yb3RhdGUuanMnO1xuaW1wb3J0IHtiaW5kQWxsLCBleHRlbmR9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcbmltcG9ydCBQb2ludCBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7dmVjM30gZnJvbSAnZ2wtbWF0cml4JztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUsIHtsYXRGcm9tTWVyY2F0b3JZLCBtZXJjYXRvclpmcm9tQWx0aXR1ZGV9IGZyb20gJy4uL2dlby9tZXJjYXRvcl9jb29yZGluYXRlLmpzJztcblxuaW1wb3J0IHR5cGUge1ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbmV4cG9ydCB0eXBlIElucHV0RXZlbnQgPSBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IEtleWJvYXJkRXZlbnQgfCBXaGVlbEV2ZW50O1xuXG5jb25zdCBpc01vdmluZyA9IHAgPT4gcC56b29tIHx8IHAuZHJhZyB8fCBwLnBpdGNoIHx8IHAucm90YXRlO1xuXG5jbGFzcyBSZW5kZXJGcmFtZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIHR5cGU6ICdyZW5kZXJGcmFtZSc7XG4gICAgdGltZVN0YW1wOiBudW1iZXI7XG59XG5cbmNsYXNzIFRyYWNraW5nRWxsaXBzb2lkIHtcbiAgICBjb25zdGFudHM6IEFycmF5PG51bWJlcj47XG4gICAgcmFkaXVzOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gYSwgYiwgYyBpbiB0aGUgZXF1YXRpb24geMKyL2HCsiArIHnCsi9iwrIgKyB6wrIvY8KyID0gMVxuICAgICAgICB0aGlzLmNvbnN0YW50cyA9IFsxLCAxLCAwLjAxXTtcbiAgICAgICAgdGhpcy5yYWRpdXMgPSAwO1xuICAgIH1cblxuICAgIHNldHVwKGNlbnRlcjogVmVjMywgcG9pbnRPblN1cmZhY2U6IFZlYzMpIHtcbiAgICAgICAgY29uc3QgY2VudGVyVG9TdXJmYWNlID0gdmVjMy5zdWIoW10sIHBvaW50T25TdXJmYWNlLCBjZW50ZXIpO1xuICAgICAgICBpZiAoY2VudGVyVG9TdXJmYWNlWzJdIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpdXMgPSB2ZWMzLmxlbmd0aCh2ZWMzLmRpdihbXSwgY2VudGVyVG9TdXJmYWNlLCB0aGlzLmNvbnN0YW50cykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHBvaW50IG9uIHN1cmZhY2UgaXMgYWJvdmUgdGhlIGNlbnRlci4gVGhpcyBjYW4gaGFwcGVuIGZvciBleGFtcGxlIHdoZW4gdGhlIGNhbWVyYSBpc1xuICAgICAgICAgICAgLy8gYmVsb3cgdGhlIGNsaWNrZWQgcG9pbnQgKGxpa2UgYSBtb3VudGFpbikgVXNlIHNsaWdodGx5IHNob3J0ZXIgcmFkaXVzIGZvciBsZXNzIGFnZ3Jlc3NpdmUgbW92ZW1lbnRcbiAgICAgICAgICAgIHRoaXMucmFkaXVzID0gdmVjMy5sZW5ndGgoW2NlbnRlclRvU3VyZmFjZVswXSwgY2VudGVyVG9TdXJmYWNlWzFdLCAwXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYXN0IGEgcmF5IGZyb20gdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzb2lkIGFuZCB0aGUgaW50ZXJzZWN0aW9uIHBvaW50LlxuICAgIHByb2plY3RSYXkoZGlyOiBWZWMzKTogVmVjMyB7XG4gICAgICAgIC8vIFBlcmZvcm0gdGhlIGludGVyc2VjdGlvbiB0ZXN0IGFnYWluc3QgYSB1bml0IHNwaGVyZVxuICAgICAgICB2ZWMzLmRpdihkaXIsIGRpciwgdGhpcy5jb25zdGFudHMpO1xuICAgICAgICB2ZWMzLm5vcm1hbGl6ZShkaXIsIGRpcik7XG4gICAgICAgIHZlYzMubXVsKGRpciwgZGlyLCB0aGlzLmNvbnN0YW50cyk7XG5cbiAgICAgICAgY29uc3QgaW50ZXJzZWN0aW9uID0gdmVjMy5zY2FsZShbXSwgZGlyLCB0aGlzLnJhZGl1cyk7XG5cbiAgICAgICAgaWYgKGludGVyc2VjdGlvblsyXSA+IDApIHtcbiAgICAgICAgICAgIC8vIFRoZSBpbnRlcnNlY3Rpb24gcG9pbnQgaXMgYWJvdmUgaG9yaXpvbiBzbyBzcGVjaWFsIGhhbmRsaW5nIGlzIHJlcXVpcmVkLlxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGRpcmVjdGlvbiBvZiB0aGUgbW92ZW1lbnQgd291bGQgYmUgaW52ZXJ0ZWQgZHVlIHRvIHRoZSBlbGxpcHNvaWQgc2hhcGVcbiAgICAgICAgICAgIGNvbnN0IGggPSB2ZWMzLnNjYWxlKFtdLCBbMCwgMCwgMV0sIHZlYzMuZG90KGludGVyc2VjdGlvbiwgWzAsIDAsIDFdKSk7XG4gICAgICAgICAgICBjb25zdCByID0gdmVjMy5zY2FsZShbXSwgdmVjMy5ub3JtYWxpemUoW10sIFtpbnRlcnNlY3Rpb25bMF0sIGludGVyc2VjdGlvblsxXSwgMF0pLCB0aGlzLnJhZGl1cyk7XG4gICAgICAgICAgICBjb25zdCBwID0gdmVjMy5hZGQoW10sIGludGVyc2VjdGlvbiwgdmVjMy5zY2FsZShbXSwgdmVjMy5zdWIoW10sIHZlYzMuYWRkKFtdLCByLCBoKSwgaW50ZXJzZWN0aW9uKSwgMikpO1xuXG4gICAgICAgICAgICBpbnRlcnNlY3Rpb25bMF0gPSBwWzBdO1xuICAgICAgICAgICAgaW50ZXJzZWN0aW9uWzFdID0gcFsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnRlcnNlY3Rpb247XG4gICAgfVxufVxuXG4vLyBIYW5kbGVycyBpbnRlcnByZXQgZG9tIGV2ZW50cyBhbmQgcmV0dXJuIGNhbWVyYSBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlXG4vLyBhcHBsaWVkIHRvIHRoZSBtYXAgKGBIYW5kbGVyUmVzdWx0YHMpLiBUaGUgY2FtZXJhIGNoYW5nZXMgYXJlIGFsbCBkZWx0YXMuXG4vLyBUaGUgaGFuZGxlciBpdHNlbGYgc2hvdWxkIGhhdmUgbm8ga25vd2xlZGdlIG9mIHRoZSBtYXAncyBjdXJyZW50IHN0YXRlLlxuLy8gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gbWVyZ2UgbXVsdGlwbGUgcmVzdWx0cyBhbmQga2VlcHMgaGFuZGxlcnMgc2ltcGxlci5cbi8vIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBhIG1vdXNlZG93biBhbmQgbW91c2Vtb3ZlLCB0aGUgbW91c2VQYW4gaGFuZGxlclxuLy8gd291bGQgcmV0dXJuIGEgYHBhbkRlbHRhYCBvbiB0aGUgbW91c2Vtb3ZlLlxuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyIHtcbiAgICBlbmFibGUoKTogdm9pZDtcbiAgICBkaXNhYmxlKCk6IHZvaWQ7XG4gICAgaXNFbmFibGVkKCk6IGJvb2xlYW47XG4gICAgaXNBY3RpdmUoKTogYm9vbGVhbjtcblxuICAgIC8vIGByZXNldGAgY2FuIGJlIGNhbGxlZCBieSB0aGUgbWFuYWdlciBhdCBhbnkgdGltZSBhbmQgbXVzdCByZXNldCBldmVyeXRoaW5nIHRvIGl0J3Mgb3JpZ2luYWwgc3RhdGVcbiAgICByZXNldCgpOiB2b2lkO1xuXG4gICAgLy8gSGFuZGxlcnMgY2FuIG9wdGlvbmFsbHkgaW1wbGVtZW50IHRoZXNlIG1ldGhvZHMuXG4gICAgLy8gVGhleSBhcmUgY2FsbGVkIHdpdGggZG9tIGV2ZW50cyB3aGVuZXZlciB0aG9zZSBkb20gZXZlbnMgYXJlIHJlY2VpdmVkLlxuICAgICt0b3VjaHN0YXJ0PzogKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pID0+ID9IYW5kbGVyUmVzdWx0O1xuICAgICt0b3VjaG1vdmU/OiAoZTogVG91Y2hFdmVudCwgcG9pbnRzOiBBcnJheTxQb2ludD4sIG1hcFRvdWNoZXM6IEFycmF5PFRvdWNoPikgPT4gP0hhbmRsZXJSZXN1bHQ7XG4gICAgK3RvdWNoZW5kPzogKGU6IFRvdWNoRXZlbnQsIHBvaW50czogQXJyYXk8UG9pbnQ+LCBtYXBUb3VjaGVzOiBBcnJheTxUb3VjaD4pID0+ID9IYW5kbGVyUmVzdWx0O1xuICAgICt0b3VjaGNhbmNlbD86IChlOiBUb3VjaEV2ZW50LCBwb2ludHM6IEFycmF5PFBvaW50PiwgbWFwVG91Y2hlczogQXJyYXk8VG91Y2g+KSA9PiA/SGFuZGxlclJlc3VsdDtcbiAgICArbW91c2Vkb3duPzogKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkgPT4gP0hhbmRsZXJSZXN1bHQ7XG4gICAgK21vdXNlbW92ZT86IChlOiBNb3VzZUV2ZW50LCBwb2ludDogUG9pbnQpID0+ID9IYW5kbGVyUmVzdWx0O1xuICAgICttb3VzZXVwPzogKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkgPT4gP0hhbmRsZXJSZXN1bHQ7XG4gICAgK2RibGNsaWNrPzogKGU6IE1vdXNlRXZlbnQsIHBvaW50OiBQb2ludCkgPT4gP0hhbmRsZXJSZXN1bHQ7XG4gICAgK3doZWVsPzogKGU6IFdoZWVsRXZlbnQsIHBvaW50OiBQb2ludCkgPT4gP0hhbmRsZXJSZXN1bHQ7XG4gICAgK2tleWRvd24/OiAoZTogS2V5Ym9hcmRFdmVudCkgPT4gP0hhbmRsZXJSZXN1bHQ7XG4gICAgK2tleXVwPzogKGU6IEtleWJvYXJkRXZlbnQpID0+ID9IYW5kbGVyUmVzdWx0O1xuXG4gICAgLy8gYHJlbmRlckZyYW1lYCBpcyB0aGUgb25seSBub24tZG9tIGV2ZW50LiBJdCBpcyBjYWxsZWQgZHVyaW5nIHJlbmRlclxuICAgIC8vIGZyYW1lcyBhbmQgY2FuIGJlIHVzZWQgdG8gc21vb3RoIGNhbWVyYSBjaGFuZ2VzIChzZWUgc2Nyb2xsIGhhbmRsZXIpLlxuICAgICtyZW5kZXJGcmFtZT86ICgpID0+ID9IYW5kbGVyUmVzdWx0O1xufVxuXG4vLyBBbGwgaGFuZGxlciBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCB3aXRoIGV2ZW50cyBjYW4gb3B0aW9uYWxseSByZXR1cm4gYSBgSGFuZGxlclJlc3VsdGAuXG5leHBvcnQgdHlwZSBIYW5kbGVyUmVzdWx0ID0ge1xuICAgIHBhbkRlbHRhPzogUG9pbnQsXG4gICAgem9vbURlbHRhPzogbnVtYmVyLFxuICAgIGJlYXJpbmdEZWx0YT86IG51bWJlcixcbiAgICBwaXRjaERlbHRhPzogbnVtYmVyLFxuICAgIC8vIHRoZSBwb2ludCB0byBub3QgbW92ZSB3aGVuIGNoYW5naW5nIHRoZSBjYW1lcmFcbiAgICBhcm91bmQ/OiBQb2ludCB8IG51bGwsXG4gICAgLy8gc2FtZSBhcyBhYm92ZSwgZXhjZXB0IGZvciBwaW5jaCBhY3Rpb25zLCB3aGljaCBhcmUgZ2l2ZW4gaGlnaGVyIHByaW9yaXR5XG4gICAgcGluY2hBcm91bmQ/OiBQb2ludCB8IG51bGwsXG4gICAgLy8gdGhlIHBvaW50IHRvIG5vdCBtb3ZlIHdoZW4gY2hhbmdpbmcgdGhlIGNhbWVyYSBpbiBtZXJjYXRvciBjb29yZGluYXRlc1xuICAgIGFyb3VuZENvb3JkPzogTWVyY2F0b3JDb29yZGluYXRlIHwgbnVsbCxcbiAgICAvLyBBIG1ldGhvZCB0aGF0IGNhbiBmaXJlIGEgb25lLW9mZiBlYXNpbmcgYnkgZGlyZWN0bHkgY2hhbmdpbmcgdGhlIG1hcCdzIGNhbWVyYS5cbiAgICBjYW1lcmFBbmltYXRpb24/OiAobWFwOiBNYXApID0+IGFueTtcblxuICAgIC8vIFRoZSBsYXN0IHRocmVlIHByb3BlcnRpZXMgYXJlIG5lZWRlZCBieSBvbmx5IG9uZSBoYW5kbGVyOiBzY3JvbGx6b29tLlxuICAgIC8vIFRoZSBET00gZXZlbnQgdG8gYmUgdXNlZCBhcyB0aGUgYG9yaWdpbmFsRXZlbnRgIG9uIGFueSBjYW1lcmEgY2hhbmdlIGV2ZW50cy5cbiAgICBvcmlnaW5hbEV2ZW50PzogYW55LFxuICAgIC8vIE1ha2VzIHRoZSBtYW5hZ2VyIHRyaWdnZXIgYSBmcmFtZSwgYWxsb3dpbmcgdGhlIGhhbmRsZXIgdG8gcmV0dXJuIG11bHRpcGxlIHJlc3VsdHMgb3ZlciB0aW1lIChzZWUgc2Nyb2xsem9vbSkuXG4gICAgbmVlZHNSZW5kZXJGcmFtZT86IGJvb2xlYW4sXG4gICAgLy8gVGhlIGNhbWVyYSBjaGFuZ2VzIHdvbid0IGdldCByZWNvcmRlZCBmb3IgaW5lcnRpYWwgem9vbWluZy5cbiAgICBub0luZXJ0aWE/OiBib29sZWFuXG59O1xuXG5mdW5jdGlvbiBoYXNDaGFuZ2UocmVzdWx0OiBIYW5kbGVyUmVzdWx0KSB7XG4gICAgcmV0dXJuIChyZXN1bHQucGFuRGVsdGEgJiYgcmVzdWx0LnBhbkRlbHRhLm1hZygpKSB8fCByZXN1bHQuem9vbURlbHRhIHx8IHJlc3VsdC5iZWFyaW5nRGVsdGEgfHwgcmVzdWx0LnBpdGNoRGVsdGE7XG59XG5cbmNsYXNzIEhhbmRsZXJNYW5hZ2VyIHtcbiAgICBfbWFwOiBNYXA7XG4gICAgX2VsOiBIVE1MRWxlbWVudDtcbiAgICBfaGFuZGxlcnM6IEFycmF5PHsgaGFuZGxlck5hbWU6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlciwgYWxsb3dlZDogYW55IH0+O1xuICAgIF9ldmVudHNJblByb2dyZXNzOiBPYmplY3Q7XG4gICAgX2ZyYW1lSWQ6ID9udW1iZXI7XG4gICAgX2luZXJ0aWE6IEhhbmRsZXJJbmVydGlhO1xuICAgIF9iZWFyaW5nU25hcDogbnVtYmVyO1xuICAgIF9oYW5kbGVyc0J5SWQ6IHsgW3N0cmluZ106IEhhbmRsZXIgfTtcbiAgICBfdXBkYXRpbmdDYW1lcmE6IGJvb2xlYW47XG4gICAgX2NoYW5nZXM6IEFycmF5PFtIYW5kbGVyUmVzdWx0LCBPYmplY3QsIGFueV0+O1xuICAgIF9wcmV2aW91c0FjdGl2ZUhhbmRsZXJzOiB7IFtzdHJpbmddOiBIYW5kbGVyIH07XG4gICAgX2xpc3RlbmVyczogQXJyYXk8W0hUTUxFbGVtZW50LCBzdHJpbmcsIHZvaWQgfCBFdmVudExpc3RlbmVyT3B0aW9uc09yVXNlQ2FwdHVyZV0+O1xuICAgIF90cmFja2luZ0VsbGlwc29pZDogVHJhY2tpbmdFbGxpcHNvaWQ7XG4gICAgX2RyYWdPcmlnaW46ID9WZWMzO1xuXG4gICAgY29uc3RydWN0b3IobWFwOiBNYXAsIG9wdGlvbnM6IHsgaW50ZXJhY3RpdmU6IGJvb2xlYW4sIHBpdGNoV2l0aFJvdGF0ZTogYm9vbGVhbiwgY2xpY2tUb2xlcmFuY2U6IG51bWJlciwgYmVhcmluZ1NuYXA6IG51bWJlcn0pIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IHRoaXMuX21hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5faGFuZGxlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5faGFuZGxlcnNCeUlkID0ge307XG4gICAgICAgIHRoaXMuX2NoYW5nZXMgPSBbXTtcblxuICAgICAgICB0aGlzLl9pbmVydGlhID0gbmV3IEhhbmRsZXJJbmVydGlhKG1hcCk7XG4gICAgICAgIHRoaXMuX2JlYXJpbmdTbmFwID0gb3B0aW9ucy5iZWFyaW5nU25hcDtcbiAgICAgICAgdGhpcy5fcHJldmlvdXNBY3RpdmVIYW5kbGVycyA9IHt9O1xuICAgICAgICB0aGlzLl90cmFja2luZ0VsbGlwc29pZCA9IG5ldyBUcmFja2luZ0VsbGlwc29pZCgpO1xuICAgICAgICB0aGlzLl9kcmFnT3JpZ2luID0gbnVsbDtcblxuICAgICAgICAvLyBUcmFjayB3aGV0aGVyIG1hcCBpcyBjdXJyZW50bHkgbW92aW5nLCB0byBjb21wdXRlIHN0YXJ0L21vdmUvZW5kIGV2ZW50c1xuICAgICAgICB0aGlzLl9ldmVudHNJblByb2dyZXNzID0ge307XG5cbiAgICAgICAgdGhpcy5fYWRkRGVmYXVsdEhhbmRsZXJzKG9wdGlvbnMpO1xuXG4gICAgICAgIGJpbmRBbGwoWydoYW5kbGVFdmVudCcsICdoYW5kbGVXaW5kb3dFdmVudCddLCB0aGlzKTtcblxuICAgICAgICBjb25zdCBlbCA9IHRoaXMuX2VsO1xuXG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtcbiAgICAgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgYHBhc3NpdmU6IHRydWVgIHNvIHRoYXQgYSBkb3VibGUgdGFwIGZpcmVzIHR3b1xuICAgICAgICAgICAgLy8gcGFpcnMgb2YgdG91Y2hzdGFydC9lbmQgZXZlbnRzIGluIGlPUyBTYWZhcmkgMTMuIElmIHRoaXMgaXMgc2V0IHRvXG4gICAgICAgICAgICAvLyBgcGFzc2l2ZTogZmFsc2VgIHRoZW4gdGhlIHNlY29uZCBwYWlyIG9mIGV2ZW50cyBpcyBvbmx5IGZpcmVkIGlmXG4gICAgICAgICAgICAvLyBwcmV2ZW50RGVmYXVsdCgpIGlzIGNhbGxlZCBvbiB0aGUgZmlyc3QgdG91Y2hzdGFydC4gQ2FsbGluZyBwcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAvLyB1bmRlc2lyYWJseSBwcmV2ZW50cyBjbGljayBldmVudHMuXG4gICAgICAgICAgICBbZWwsICd0b3VjaHN0YXJ0Jywge3Bhc3NpdmU6IHRydWV9XSxcbiAgICAgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgYHBhc3NpdmU6IGZhbHNlYCBzbyB0aGF0IHNjcm9sbHMgYW5kIHBpbmNoZXMgY2FuIGJlXG4gICAgICAgICAgICAvLyBwcmV2ZW50ZWQgaW4gYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGB0b3VjaC1hY3Rpb25zOiBub25lYCwgZm9yIGV4YW1wbGUgaU9TIFNhZmFyaSAxMi5cbiAgICAgICAgICAgIFtlbCwgJ3RvdWNobW92ZScsIHtwYXNzaXZlOiBmYWxzZX1dLFxuICAgICAgICAgICAgW2VsLCAndG91Y2hlbmQnLCB1bmRlZmluZWRdLFxuICAgICAgICAgICAgW2VsLCAndG91Y2hjYW5jZWwnLCB1bmRlZmluZWRdLFxuXG4gICAgICAgICAgICBbZWwsICdtb3VzZWRvd24nLCB1bmRlZmluZWRdLFxuICAgICAgICAgICAgW2VsLCAnbW91c2Vtb3ZlJywgdW5kZWZpbmVkXSxcbiAgICAgICAgICAgIFtlbCwgJ21vdXNldXAnLCB1bmRlZmluZWRdLFxuXG4gICAgICAgICAgICAvLyBCaW5kIHdpbmRvdy1sZXZlbCBldmVudCBsaXN0ZW5lcnMgZm9yIG1vdmUgYW5kIHVwL2VuZCBldmVudHMuIEluIHRoZSBhYnNlbmNlIG9mXG4gICAgICAgICAgICAvLyB0aGUgcG9pbnRlciBjYXB0dXJlIEFQSSwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgbmVjZXNzYXJ5IHBsYXRmb3JtcyxcbiAgICAgICAgICAgIC8vIHdpbmRvdy1sZXZlbCBldmVudCBsaXN0ZW5lcnMgZ2l2ZSB1cyB0aGUgYmVzdCBzaG90IGF0IGNhcHR1cmluZyBldmVudHMgdGhhdFxuICAgICAgICAgICAgLy8gZmFsbCBvdXRzaWRlIHRoZSBtYXAgY2FudmFzIGVsZW1lbnQuIFVzZSBge2NhcHR1cmU6IHRydWV9YCBmb3IgdGhlIG1vdmUgZXZlbnRcbiAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgbWFwIG1vdmUgZXZlbnRzIGZyb20gYmVpbmcgZmlyZWQgZHVyaW5nIGEgZHJhZy5cbiAgICAgICAgICAgIFt3aW5kb3cuZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB7Y2FwdHVyZTogdHJ1ZX1dLFxuICAgICAgICAgICAgW3dpbmRvdy5kb2N1bWVudCwgJ21vdXNldXAnLCB1bmRlZmluZWRdLFxuXG4gICAgICAgICAgICBbZWwsICdtb3VzZW92ZXInLCB1bmRlZmluZWRdLFxuICAgICAgICAgICAgW2VsLCAnbW91c2VvdXQnLCB1bmRlZmluZWRdLFxuICAgICAgICAgICAgW2VsLCAnZGJsY2xpY2snLCB1bmRlZmluZWRdLFxuICAgICAgICAgICAgW2VsLCAnY2xpY2snLCB1bmRlZmluZWRdLFxuXG4gICAgICAgICAgICBbZWwsICdrZXlkb3duJywge2NhcHR1cmU6IGZhbHNlfV0sXG4gICAgICAgICAgICBbZWwsICdrZXl1cCcsIHVuZGVmaW5lZF0sXG5cbiAgICAgICAgICAgIFtlbCwgJ3doZWVsJywge3Bhc3NpdmU6IGZhbHNlfV0sXG4gICAgICAgICAgICBbZWwsICdjb250ZXh0bWVudScsIHVuZGVmaW5lZF0sXG5cbiAgICAgICAgICAgIFt3aW5kb3csICdibHVyJywgdW5kZWZpbmVkXVxuICAgICAgICBdO1xuXG4gICAgICAgIGZvciAoY29uc3QgW3RhcmdldCwgdHlwZSwgbGlzdGVuZXJPcHRpb25zXSBvZiB0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGFyZ2V0ID09PSB3aW5kb3cuZG9jdW1lbnQgPyB0aGlzLmhhbmRsZVdpbmRvd0V2ZW50IDogdGhpcy5oYW5kbGVFdmVudDtcbiAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCh0eXBlOiBhbnkpLCAobGlzdGVuZXI6IGFueSksIGxpc3RlbmVyT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXQsIHR5cGUsIGxpc3RlbmVyT3B0aW9uc10gb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9IHRhcmdldCA9PT0gd2luZG93LmRvY3VtZW50ID8gdGhpcy5oYW5kbGVXaW5kb3dFdmVudCA6IHRoaXMuaGFuZGxlRXZlbnQ7XG4gICAgICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigodHlwZTogYW55KSwgKGxpc3RlbmVyOiBhbnkpLCBsaXN0ZW5lck9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2FkZERlZmF1bHRIYW5kbGVycyhvcHRpb25zOiB7IGludGVyYWN0aXZlOiBib29sZWFuLCBwaXRjaFdpdGhSb3RhdGU6IGJvb2xlYW4sIGNsaWNrVG9sZXJhbmNlOiBudW1iZXIgfSkge1xuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgICAgIGNvbnN0IGVsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9hZGQoJ21hcEV2ZW50JywgbmV3IE1hcEV2ZW50SGFuZGxlcihtYXAsIG9wdGlvbnMpKTtcblxuICAgICAgICBjb25zdCBib3hab29tID0gbWFwLmJveFpvb20gPSBuZXcgQm94Wm9vbUhhbmRsZXIobWFwLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fYWRkKCdib3hab29tJywgYm94Wm9vbSk7XG5cbiAgICAgICAgY29uc3QgdGFwWm9vbSA9IG5ldyBUYXBab29tSGFuZGxlcigpO1xuICAgICAgICBjb25zdCBjbGlja1pvb20gPSBuZXcgQ2xpY2tab29tSGFuZGxlcigpO1xuICAgICAgICBtYXAuZG91YmxlQ2xpY2tab29tID0gbmV3IERvdWJsZUNsaWNrWm9vbUhhbmRsZXIoY2xpY2tab29tLCB0YXBab29tKTtcbiAgICAgICAgdGhpcy5fYWRkKCd0YXBab29tJywgdGFwWm9vbSk7XG4gICAgICAgIHRoaXMuX2FkZCgnY2xpY2tab29tJywgY2xpY2tab29tKTtcblxuICAgICAgICBjb25zdCB0YXBEcmFnWm9vbSA9IG5ldyBUYXBEcmFnWm9vbUhhbmRsZXIoKTtcbiAgICAgICAgdGhpcy5fYWRkKCd0YXBEcmFnWm9vbScsIHRhcERyYWdab29tKTtcblxuICAgICAgICBjb25zdCB0b3VjaFBpdGNoID0gbWFwLnRvdWNoUGl0Y2ggPSBuZXcgVG91Y2hQaXRjaEhhbmRsZXIobWFwKTtcbiAgICAgICAgdGhpcy5fYWRkKCd0b3VjaFBpdGNoJywgdG91Y2hQaXRjaCk7XG5cbiAgICAgICAgY29uc3QgbW91c2VSb3RhdGUgPSBuZXcgTW91c2VSb3RhdGVIYW5kbGVyKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBtb3VzZVBpdGNoID0gbmV3IE1vdXNlUGl0Y2hIYW5kbGVyKG9wdGlvbnMpO1xuICAgICAgICBtYXAuZHJhZ1JvdGF0ZSA9IG5ldyBEcmFnUm90YXRlSGFuZGxlcihvcHRpb25zLCBtb3VzZVJvdGF0ZSwgbW91c2VQaXRjaCk7XG4gICAgICAgIHRoaXMuX2FkZCgnbW91c2VSb3RhdGUnLCBtb3VzZVJvdGF0ZSwgWydtb3VzZVBpdGNoJ10pO1xuICAgICAgICB0aGlzLl9hZGQoJ21vdXNlUGl0Y2gnLCBtb3VzZVBpdGNoLCBbJ21vdXNlUm90YXRlJ10pO1xuXG4gICAgICAgIGNvbnN0IG1vdXNlUGFuID0gbmV3IE1vdXNlUGFuSGFuZGxlcihvcHRpb25zKTtcbiAgICAgICAgY29uc3QgdG91Y2hQYW4gPSBuZXcgVG91Y2hQYW5IYW5kbGVyKG1hcCwgb3B0aW9ucyk7XG4gICAgICAgIG1hcC5kcmFnUGFuID0gbmV3IERyYWdQYW5IYW5kbGVyKGVsLCBtb3VzZVBhbiwgdG91Y2hQYW4pO1xuICAgICAgICB0aGlzLl9hZGQoJ21vdXNlUGFuJywgbW91c2VQYW4pO1xuICAgICAgICB0aGlzLl9hZGQoJ3RvdWNoUGFuJywgdG91Y2hQYW4sIFsndG91Y2hab29tJywgJ3RvdWNoUm90YXRlJ10pO1xuXG4gICAgICAgIGNvbnN0IHRvdWNoUm90YXRlID0gbmV3IFRvdWNoUm90YXRlSGFuZGxlcigpO1xuICAgICAgICBjb25zdCB0b3VjaFpvb20gPSBuZXcgVG91Y2hab29tSGFuZGxlcigpO1xuICAgICAgICBtYXAudG91Y2hab29tUm90YXRlID0gbmV3IFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXIoZWwsIHRvdWNoWm9vbSwgdG91Y2hSb3RhdGUsIHRhcERyYWdab29tKTtcbiAgICAgICAgdGhpcy5fYWRkKCd0b3VjaFJvdGF0ZScsIHRvdWNoUm90YXRlLCBbJ3RvdWNoUGFuJywgJ3RvdWNoWm9vbSddKTtcbiAgICAgICAgdGhpcy5fYWRkKCd0b3VjaFpvb20nLCB0b3VjaFpvb20sIFsndG91Y2hQYW4nLCAndG91Y2hSb3RhdGUnXSk7XG5cbiAgICAgICAgdGhpcy5fYWRkKCdibG9ja2FibGVNYXBFdmVudCcsIG5ldyBCbG9ja2FibGVNYXBFdmVudEhhbmRsZXIobWFwKSk7XG5cbiAgICAgICAgY29uc3Qgc2Nyb2xsWm9vbSA9IG1hcC5zY3JvbGxab29tID0gbmV3IFNjcm9sbFpvb21IYW5kbGVyKG1hcCwgdGhpcyk7XG4gICAgICAgIHRoaXMuX2FkZCgnc2Nyb2xsWm9vbScsIHNjcm9sbFpvb20sIFsnbW91c2VQYW4nXSk7XG5cbiAgICAgICAgY29uc3Qga2V5Ym9hcmQgPSBtYXAua2V5Ym9hcmQgPSBuZXcgS2V5Ym9hcmRIYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuX2FkZCgna2V5Ym9hcmQnLCBrZXlib2FyZCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIFsnYm94Wm9vbScsICdkb3VibGVDbGlja1pvb20nLCAndGFwRHJhZ1pvb20nLCAndG91Y2hQaXRjaCcsICdkcmFnUm90YXRlJywgJ2RyYWdQYW4nLCAndG91Y2hab29tUm90YXRlJywgJ3Njcm9sbFpvb20nLCAna2V5Ym9hcmQnXSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW50ZXJhY3RpdmUgJiYgKG9wdGlvbnM6IGFueSlbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAobWFwOiBhbnkpW25hbWVdLmVuYWJsZSgob3B0aW9uczogYW55KVtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYWRkKGhhbmRsZXJOYW1lOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXIsIGFsbG93ZWQ/OiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMuX2hhbmRsZXJzLnB1c2goe2hhbmRsZXJOYW1lLCBoYW5kbGVyLCBhbGxvd2VkfSk7XG4gICAgICAgIHRoaXMuX2hhbmRsZXJzQnlJZFtoYW5kbGVyTmFtZV0gPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIHN0b3AoYWxsb3dFbmRBbmltYXRpb246IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gZG8gbm90aGluZyBpZiB0aGlzIG1ldGhvZCB3YXMgdHJpZ2dlcmVkIGJ5IGEgZ2VzdHVyZSB1cGRhdGVcbiAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nQ2FtZXJhKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChjb25zdCB7aGFuZGxlcn0gb2YgdGhpcy5faGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGhhbmRsZXIucmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pbmVydGlhLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX2ZpcmVFdmVudHMoe30sIHt9LCBhbGxvd0VuZEFuaW1hdGlvbik7XG4gICAgICAgIHRoaXMuX2NoYW5nZXMgPSBbXTtcbiAgICB9XG5cbiAgICBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgZm9yIChjb25zdCB7aGFuZGxlcn0gb2YgdGhpcy5faGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyLmlzQWN0aXZlKCkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1pvb21pbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2V2ZW50c0luUHJvZ3Jlc3Muem9vbSB8fCB0aGlzLl9tYXAuc2Nyb2xsWm9vbS5pc1pvb21pbmcoKTtcbiAgICB9XG5cbiAgICBpc1JvdGF0aW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9ldmVudHNJblByb2dyZXNzLnJvdGF0ZTtcbiAgICB9XG5cbiAgICBpc01vdmluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhaXNNb3ZpbmcodGhpcy5fZXZlbnRzSW5Qcm9ncmVzcykgfHwgdGhpcy5pc1pvb21pbmcoKTtcbiAgICB9XG5cbiAgICBfYmxvY2tlZEJ5QWN0aXZlKGFjdGl2ZUhhbmRsZXJzOiB7IFtzdHJpbmddOiBIYW5kbGVyIH0sIGFsbG93ZWQ6IEFycmF5PHN0cmluZz4sIG15TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBhY3RpdmVIYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKG5hbWUgPT09IG15TmFtZSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWFsbG93ZWQgfHwgYWxsb3dlZC5pbmRleE9mKG5hbWUpIDwgMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBoYW5kbGVXaW5kb3dFdmVudChlOiBJbnB1dEV2ZW50KSB7XG4gICAgICAgIHRoaXMuaGFuZGxlRXZlbnQoZSwgYCR7ZS50eXBlfVdpbmRvd2ApO1xuICAgIH1cblxuICAgIF9nZXRNYXBUb3VjaGVzKHRvdWNoZXM6IFRvdWNoTGlzdCk6IFRvdWNoTGlzdCB7XG4gICAgICAgIGNvbnN0IG1hcFRvdWNoZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRvdWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9ICgodC50YXJnZXQ6IGFueSk6IE5vZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VsLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICBtYXBUb3VjaGVzLnB1c2godCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgobWFwVG91Y2hlczogYW55KTogVG91Y2hMaXN0KTtcbiAgICB9XG5cbiAgICBoYW5kbGVFdmVudChlOiBJbnB1dEV2ZW50IHwgUmVuZGVyRnJhbWVFdmVudCwgZXZlbnROYW1lPzogc3RyaW5nKSB7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRpbmdDYW1lcmEgPSB0cnVlO1xuICAgICAgICBhc3NlcnQoZS50aW1lU3RhbXAgIT09IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgY29uc3QgaXNSZW5kZXJGcmFtZSA9IGUudHlwZSA9PT0gJ3JlbmRlckZyYW1lJztcbiAgICAgICAgY29uc3QgaW5wdXRFdmVudCA9IGlzUmVuZGVyRnJhbWUgPyB1bmRlZmluZWQgOiAoKGU6IGFueSk6IElucHV0RXZlbnQpO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFdlIGRvbid0IGNhbGwgZS5wcmV2ZW50RGVmYXVsdCgpIGZvciBhbnkgZXZlbnRzIGJ5IGRlZmF1bHQuXG4gICAgICAgICAqIEhhbmRsZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBpdCB3aGVyZSBuZWNlc3NhcnkuXG4gICAgICAgICAqL1xuXG4gICAgICAgIGNvbnN0IG1lcmdlZEhhbmRsZXJSZXN1bHQ6IEhhbmRsZXJSZXN1bHQgPSB7bmVlZHNSZW5kZXJGcmFtZTogZmFsc2V9O1xuICAgICAgICBjb25zdCBldmVudHNJblByb2dyZXNzID0ge307XG4gICAgICAgIGNvbnN0IGFjdGl2ZUhhbmRsZXJzID0ge307XG5cbiAgICAgICAgY29uc3QgbWFwVG91Y2hlcyA9IGUudG91Y2hlcyA/IHRoaXMuX2dldE1hcFRvdWNoZXMoKChlOiBhbnkpOiBUb3VjaEV2ZW50KS50b3VjaGVzKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gbWFwVG91Y2hlcyA/IERPTS50b3VjaFBvcyh0aGlzLl9lbCwgbWFwVG91Y2hlcykgOlxuICAgICAgICAgICAgaXNSZW5kZXJGcmFtZSA/IHVuZGVmaW5lZCA6IC8vIHJlbmRlckZyYW1lIGV2ZW50IGRvZXNuJ3QgaGF2ZSBhbnkgcG9pbnRzXG4gICAgICAgICAgICBET00ubW91c2VQb3ModGhpcy5fZWwsICgoZTogYW55KTogTW91c2VFdmVudCkpO1xuXG4gICAgICAgIGZvciAoY29uc3Qge2hhbmRsZXJOYW1lLCBoYW5kbGVyLCBhbGxvd2VkfSBvZiB0aGlzLl9oYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKCFoYW5kbGVyLmlzRW5hYmxlZCgpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgbGV0IGRhdGE6ID9IYW5kbGVyUmVzdWx0O1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Jsb2NrZWRCeUFjdGl2ZShhY3RpdmVIYW5kbGVycywgYWxsb3dlZCwgaGFuZGxlck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5yZXNldCgpO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICgoaGFuZGxlcjogYW55KVtldmVudE5hbWUgfHwgZS50eXBlXSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gKGhhbmRsZXI6IGFueSlbZXZlbnROYW1lIHx8IGUudHlwZV0oZSwgcG9pbnRzLCBtYXBUb3VjaGVzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUhhbmRsZXJSZXN1bHQobWVyZ2VkSGFuZGxlclJlc3VsdCwgZXZlbnRzSW5Qcm9ncmVzcywgZGF0YSwgaGFuZGxlck5hbWUsIGlucHV0RXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLm5lZWRzUmVuZGVyRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJSZW5kZXJGcmFtZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSB8fCBoYW5kbGVyLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmVIYW5kbGVyc1toYW5kbGVyTmFtZV0gPSBoYW5kbGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVhY3RpdmF0ZWRIYW5kbGVycyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdGhpcy5fcHJldmlvdXNBY3RpdmVIYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKCFhY3RpdmVIYW5kbGVyc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVkSGFuZGxlcnNbbmFtZV0gPSBpbnB1dEV2ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzQWN0aXZlSGFuZGxlcnMgPSBhY3RpdmVIYW5kbGVycztcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGVhY3RpdmF0ZWRIYW5kbGVycykubGVuZ3RoIHx8IGhhc0NoYW5nZShtZXJnZWRIYW5kbGVyUmVzdWx0KSkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlcy5wdXNoKFttZXJnZWRIYW5kbGVyUmVzdWx0LCBldmVudHNJblByb2dyZXNzLCBkZWFjdGl2YXRlZEhhbmRsZXJzXSk7XG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyUmVuZGVyRnJhbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhhY3RpdmVIYW5kbGVycykubGVuZ3RoIHx8IGhhc0NoYW5nZShtZXJnZWRIYW5kbGVyUmVzdWx0KSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLl9zdG9wKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRpbmdDYW1lcmEgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCB7Y2FtZXJhQW5pbWF0aW9ufSA9IG1lcmdlZEhhbmRsZXJSZXN1bHQ7XG4gICAgICAgIGlmIChjYW1lcmFBbmltYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2luZXJ0aWEuY2xlYXIoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudHMoe30sIHt9LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIGNhbWVyYUFuaW1hdGlvbih0aGlzLl9tYXApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWVyZ2VIYW5kbGVyUmVzdWx0KG1lcmdlZEhhbmRsZXJSZXN1bHQ6IEhhbmRsZXJSZXN1bHQsIGV2ZW50c0luUHJvZ3Jlc3M6IE9iamVjdCwgaGFuZGxlclJlc3VsdDogSGFuZGxlclJlc3VsdCwgbmFtZTogc3RyaW5nLCBlPzogSW5wdXRFdmVudCkge1xuICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHJldHVybjtcblxuICAgICAgICBleHRlbmQobWVyZ2VkSGFuZGxlclJlc3VsdCwgaGFuZGxlclJlc3VsdCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0ge2hhbmRsZXJOYW1lOiBuYW1lLCBvcmlnaW5hbEV2ZW50OiBoYW5kbGVyUmVzdWx0Lm9yaWdpbmFsRXZlbnQgfHwgZX07XG5cbiAgICAgICAgLy8gdHJhY2sgd2hpY2ggaGFuZGxlciBjaGFuZ2VkIHdoaWNoIGNhbWVyYSBwcm9wZXJ0eVxuICAgICAgICBpZiAoaGFuZGxlclJlc3VsdC56b29tRGVsdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXZlbnRzSW5Qcm9ncmVzcy56b29tID0gZXZlbnREYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYW5kbGVyUmVzdWx0LnBhbkRlbHRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV2ZW50c0luUHJvZ3Jlc3MuZHJhZyA9IGV2ZW50RGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlclJlc3VsdC5waXRjaERlbHRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV2ZW50c0luUHJvZ3Jlc3MucGl0Y2ggPSBldmVudERhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQuYmVhcmluZ0RlbHRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV2ZW50c0luUHJvZ3Jlc3Mucm90YXRlID0gZXZlbnREYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2FwcGx5Q2hhbmdlcygpIHtcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSB7fTtcbiAgICAgICAgY29uc3QgY29tYmluZWRFdmVudHNJblByb2dyZXNzID0ge307XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkRGVhY3RpdmF0ZWRIYW5kbGVycyA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW2NoYW5nZSwgZXZlbnRzSW5Qcm9ncmVzcywgZGVhY3RpdmF0ZWRIYW5kbGVyc10gb2YgdGhpcy5fY2hhbmdlcykge1xuXG4gICAgICAgICAgICBpZiAoY2hhbmdlLnBhbkRlbHRhKSBjb21iaW5lZC5wYW5EZWx0YSA9IChjb21iaW5lZC5wYW5EZWx0YSB8fCBuZXcgUG9pbnQoMCwgMCkpLl9hZGQoY2hhbmdlLnBhbkRlbHRhKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2Uuem9vbURlbHRhKSBjb21iaW5lZC56b29tRGVsdGEgPSAoY29tYmluZWQuem9vbURlbHRhIHx8IDApICsgY2hhbmdlLnpvb21EZWx0YTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2UuYmVhcmluZ0RlbHRhKSBjb21iaW5lZC5iZWFyaW5nRGVsdGEgPSAoY29tYmluZWQuYmVhcmluZ0RlbHRhIHx8IDApICsgY2hhbmdlLmJlYXJpbmdEZWx0YTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2UucGl0Y2hEZWx0YSkgY29tYmluZWQucGl0Y2hEZWx0YSA9IChjb21iaW5lZC5waXRjaERlbHRhIHx8IDApICsgY2hhbmdlLnBpdGNoRGVsdGE7XG4gICAgICAgICAgICBpZiAoY2hhbmdlLmFyb3VuZCAhPT0gdW5kZWZpbmVkKSBjb21iaW5lZC5hcm91bmQgPSBjaGFuZ2UuYXJvdW5kO1xuICAgICAgICAgICAgaWYgKGNoYW5nZS5hcm91bmRDb29yZCAhPT0gdW5kZWZpbmVkKSBjb21iaW5lZC5hcm91bmRDb29yZCA9IGNoYW5nZS5hcm91bmRDb29yZDtcbiAgICAgICAgICAgIGlmIChjaGFuZ2UucGluY2hBcm91bmQgIT09IHVuZGVmaW5lZCkgY29tYmluZWQucGluY2hBcm91bmQgPSBjaGFuZ2UucGluY2hBcm91bmQ7XG4gICAgICAgICAgICBpZiAoY2hhbmdlLm5vSW5lcnRpYSkgY29tYmluZWQubm9JbmVydGlhID0gY2hhbmdlLm5vSW5lcnRpYTtcblxuICAgICAgICAgICAgZXh0ZW5kKGNvbWJpbmVkRXZlbnRzSW5Qcm9ncmVzcywgZXZlbnRzSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBleHRlbmQoY29tYmluZWREZWFjdGl2YXRlZEhhbmRsZXJzLCBkZWFjdGl2YXRlZEhhbmRsZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZU1hcFRyYW5zZm9ybShjb21iaW5lZCwgY29tYmluZWRFdmVudHNJblByb2dyZXNzLCBjb21iaW5lZERlYWN0aXZhdGVkSGFuZGxlcnMpO1xuICAgICAgICB0aGlzLl9jaGFuZ2VzID0gW107XG4gICAgfVxuXG4gICAgX3VwZGF0ZU1hcFRyYW5zZm9ybShjb21iaW5lZFJlc3VsdDogYW55LCBjb21iaW5lZEV2ZW50c0luUHJvZ3Jlc3M6IE9iamVjdCwgZGVhY3RpdmF0ZWRIYW5kbGVyczogT2JqZWN0KSB7XG5cbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICBjb25zdCB0ciA9IG1hcC50cmFuc2Zvcm07XG5cbiAgICAgICAgY29uc3QgZXZlbnRTdGFydGVkID0gKHR5cGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gY29tYmluZWRFdmVudHNJblByb2dyZXNzW3R5cGVdO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0V2ZW50ICYmICF0aGlzLl9ldmVudHNJblByb2dyZXNzW3R5cGVdO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGV2ZW50RW5kZWQgPSAodHlwZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLl9ldmVudHNJblByb2dyZXNzW3R5cGVdO1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50ICYmICF0aGlzLl9oYW5kbGVyc0J5SWRbZXZlbnQuaGFuZGxlck5hbWVdLmlzQWN0aXZlKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdG9WZWMzID0gKHA6IE1lcmNhdG9yQ29vcmRpbmF0ZSk6IFZlYzMgPT4gW3AueCwgcC55LCBwLnpdO1xuXG4gICAgICAgIGlmIChldmVudEVuZGVkKFwiZHJhZ1wiKSAmJiAhaGFzQ2hhbmdlKGNvbWJpbmVkUmVzdWx0KSkge1xuICAgICAgICAgICAgY29uc3QgcHJlWm9vbSA9IHRyLnpvb207XG4gICAgICAgICAgICB0ci5jYW1lcmFFbGV2YXRpb25SZWZlcmVuY2UgPSBcInNlYVwiO1xuICAgICAgICAgICAgdHIucmVjZW50ZXJPblRlcnJhaW4oKTtcbiAgICAgICAgICAgIHRyLmNhbWVyYUVsZXZhdGlvblJlZmVyZW5jZSA9IFwiZ3JvdW5kXCI7XG4gICAgICAgICAgICAvLyBNYXAgem9vbSBtaWdodCBjaGFuZ2UgZHVyaW5nIHRoZSBwYW4gb3BlcmF0aW9uIGR1ZSB0byB0ZXJyYWluIGVsZXZhdGlvbi5cbiAgICAgICAgICAgIGlmIChwcmVab29tICE9PSB0ci56b29tKSB0aGlzLl9tYXAuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFzQ2hhbmdlKGNvbWJpbmVkUmVzdWx0KSkge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50cyhjb21iaW5lZEV2ZW50c0luUHJvZ3Jlc3MsIGRlYWN0aXZhdGVkSGFuZGxlcnMsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7cGFuRGVsdGEsIHpvb21EZWx0YSwgYmVhcmluZ0RlbHRhLCBwaXRjaERlbHRhLCBhcm91bmQsIGFyb3VuZENvb3JkLCBwaW5jaEFyb3VuZH0gPSBjb21iaW5lZFJlc3VsdDtcblxuICAgICAgICBpZiAocGluY2hBcm91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXJvdW5kID0gcGluY2hBcm91bmQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnRTdGFydGVkKFwiZHJhZ1wiKSAmJiBhcm91bmQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RyYWdPcmlnaW4gPSB0b1ZlYzModHIucG9pbnRDb29yZGluYXRlM0QoYXJvdW5kKSk7XG4gICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIHRyYWNraW5nIGVsbGlwc29pZCBldmVyeSB0aW1lIHVzZXIgY2hhbmdlcyB0aGUgZHJhZyBvcmlnaW4uXG4gICAgICAgICAgICAvLyBEaXJlY3Rpb24gb2YgdGhlIHJheSB3aWxsIGRlZmluZSBzaXplIG9mIHRoZSBzaGFwZSBhbmQgaGVuY2UgZGVmaW5pbmcgdGhlIGF2YWlsYWJsZSByYW5nZSBvZiBtb3ZlbWVudFxuICAgICAgICAgICAgdGhpcy5fdHJhY2tpbmdFbGxpcHNvaWQuc2V0dXAodHIuX2NhbWVyYS5wb3NpdGlvbiwgdGhpcy5fZHJhZ09yaWdpbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbGwgbW92ZW1lbnQgb2YgdGhlIGNhbWVyYSBpcyBkb25lIHJlbGF0aXZlIHRvIHRoZSBzZWEgbGV2ZWxcbiAgICAgICAgdHIuY2FtZXJhRWxldmF0aW9uUmVmZXJlbmNlID0gXCJzZWFcIjtcblxuICAgICAgICAvLyBzdG9wIGFueSBvbmdvaW5nIGNhbWVyYSBhbmltYXRpb25zIChlYXNlVG8sIGZseVRvKVxuICAgICAgICBtYXAuX3N0b3AodHJ1ZSk7XG5cbiAgICAgICAgYXJvdW5kID0gYXJvdW5kIHx8IG1hcC50cmFuc2Zvcm0uY2VudGVyUG9pbnQ7XG4gICAgICAgIGlmIChiZWFyaW5nRGVsdGEpIHRyLmJlYXJpbmcgKz0gYmVhcmluZ0RlbHRhO1xuICAgICAgICBpZiAocGl0Y2hEZWx0YSkgdHIucGl0Y2ggKz0gcGl0Y2hEZWx0YTtcbiAgICAgICAgdHIuX3VwZGF0ZUNhbWVyYVN0YXRlKCk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBNZXJjYXRvciAzRCBjYW1lcmEgb2Zmc2V0IGJhc2VkIG9uIHNjcmVlbnNwYWNlIHBhbkRlbHRhXG4gICAgICAgIGNvbnN0IHBhblZlYyA9IFswLCAwLCAwXTtcbiAgICAgICAgaWYgKHBhbkRlbHRhKSB7XG4gICAgICAgICAgICBhc3NlcnQodGhpcy5fZHJhZ09yaWdpbiwgJ19kcmFnT3JpZ2luIHNob3VsZCBoYXZlIGJlZW4gc2V0dXAgd2l0aCBhIHByZXZpb3VzIGRyYWdzdGFydCcpO1xuXG4gICAgICAgICAgICBjb25zdCBzdGFydFBvaW50ID0gdHIucG9pbnRDb29yZGluYXRlKGFyb3VuZCk7XG4gICAgICAgICAgICBpZiAodHIucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRMYXQgPSBsYXRGcm9tTWVyY2F0b3JZKHN0YXJ0UG9pbnQueSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VudGVyTGF0ID0gdHIuY2VudGVyLmxhdDtcblxuICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgcGFuIHZlY3RvciBkaXJlY3RseSBpbiBwaXhlbCBjb29yZGluYXRlcyBmb3IgdGhlIGdsb2JlLlxuICAgICAgICAgICAgICAgIC8vIFJvdGF0ZSB0aGUgZ2xvYmUgYSBiaXQgZmFzdGVyIHdoZW4gZHJhZ2dpbmcgbmVhciBwb2xlcyB0byBjb21wZW5zYXRlXG4gICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IHBpeGVsLXBlci1tZXRlciByYXRpb3MgKGllLiBwaXhlbC10by1waHlzaWNhbC1yb3RhdGlvbiBpcyBsb3dlcilcbiAgICAgICAgICAgICAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLCBzdGFydExhdCkgLyBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoMSwgY2VudGVyTGF0KSwgMik7XG5cbiAgICAgICAgICAgICAgICBwYW5EZWx0YSA9IHBhbkRlbHRhLnJvdGF0ZSgtdHIuYW5nbGUpO1xuXG4gICAgICAgICAgICAgICAgcGFuVmVjWzBdID0gLXBhbkRlbHRhLnggLyB0ci53b3JsZFNpemUgKiBzY2FsZTtcbiAgICAgICAgICAgICAgICBwYW5WZWNbMV0gPSAtcGFuRGVsdGEueSAvIHRyLndvcmxkU2l6ZSAqIHNjYWxlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRyLnBvaW50Q29vcmRpbmF0ZShhcm91bmQuc3ViKHBhbkRlbHRhKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRQb2ludCAmJiBlbmRQb2ludCkge1xuICAgICAgICAgICAgICAgICAgICBwYW5WZWNbMF0gPSBlbmRQb2ludC54IC0gc3RhcnRQb2ludC54O1xuICAgICAgICAgICAgICAgICAgICBwYW5WZWNbMV0gPSBlbmRQb2ludC55IC0gc3RhcnRQb2ludC55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsWm9vbSA9IHRyLnpvb207XG4gICAgICAgIC8vIENvbXB1dGUgTWVyY2F0b3IgM0QgY2FtZXJhIG9mZnNldCBiYXNlZCBvbiBzY3JlZW5zcGFjZSByZXF1ZXN0ZWQgWm9vbURlbHRhXG4gICAgICAgIGNvbnN0IHpvb21WZWMgPSBbMCwgMCwgMF07XG4gICAgICAgIGlmICh6b29tRGVsdGEpIHtcbiAgICAgICAgICAgIC8vIFpvb20gdmFsdWUgaGFzIHRvIGJlIGNvbXB1dGVkIHJlbGF0aXZlIHRvIGEgc2Vjb25kYXJ5IG1hcCBwbGFuZSB0aGF0IGlzIGNyZWF0ZWQgZnJvbSB0aGUgdGVycmFpbiBwb3NpdGlvbiBiZWxvdyB0aGUgY3Vyc29yLlxuICAgICAgICAgICAgLy8gVGhpcyB3YXkgdGhlIHpvb20gaW50ZXJwb2xhdGlvbiBjYW4gYmUga2VwdCBsaW5lYXIgYW5kIGluZGVwZW5kZW50IG9mIHRoZSAocG9zc2libGUpIHRlcnJhaW4gZWxldmF0aW9uXG4gICAgICAgICAgICBjb25zdCBwaWNrZWRQb3NpdGlvbjogVmVjMyA9IGFyb3VuZENvb3JkID8gdG9WZWMzKGFyb3VuZENvb3JkKSA6IHRvVmVjMyh0ci5wb2ludENvb3JkaW5hdGUzRChhcm91bmQpKTtcblxuICAgICAgICAgICAgY29uc3QgYXJvdW5kUmF5ID0ge2RpcjogdmVjMy5ub3JtYWxpemUoW10sIHZlYzMuc3ViKFtdLCBwaWNrZWRQb3NpdGlvbiwgdHIuX2NhbWVyYS5wb3NpdGlvbikpfTtcbiAgICAgICAgICAgIGlmIChhcm91bmRSYXkuZGlyWzJdIDwgMCkge1xuICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgaXMgcmVxdWlyZWQgaWYgdGhlIHJheSBjcmVhdGVkIGZyb20gdGhlIGN1cnNvciBpcyBoZWFkaW5nIHVwLlxuICAgICAgICAgICAgICAgIC8vIFRoaXMgc2NlbmFyaW8gaXMgcG9zc2libGUgaWYgdXNlciBpcyB0cnlpbmcgdG8gem9vbSB0b3dhcmRzIGEgZmVhdHVyZSBsaWtlIGEgaGlsbCBvciBhIG1vdW50YWluLlxuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgem9vbURlbHRhIHRvIGEgbW92ZW1lbnQgdmVjdG9yIGFzIGlmIHRoZSBjYW1lcmEgd291bGQgYmUgb3JiaXRpbmcgYXJvdW5kIHRoZSBwaWNrZWQgcG9pbnRcbiAgICAgICAgICAgICAgICBjb25zdCBtb3ZlbWVudCA9IHRyLnpvb21EZWx0YVRvTW92ZW1lbnQocGlja2VkUG9zaXRpb24sIHpvb21EZWx0YSk7XG4gICAgICAgICAgICAgICAgdmVjMy5zY2FsZSh6b29tVmVjLCBhcm91bmRSYXkuZGlyLCBtb3ZlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNdXRhdGUgY2FtZXJhIHN0YXRlIHZpYSBDYW1lcmFBUElcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB2ZWMzLmFkZChwYW5WZWMsIHBhblZlYywgem9vbVZlYyk7XG4gICAgICAgIHRyLl90cmFuc2xhdGVDYW1lcmFDb25zdHJhaW5lZCh0cmFuc2xhdGlvbik7XG5cbiAgICAgICAgaWYgKHpvb21EZWx0YSAmJiBNYXRoLmFicyh0ci56b29tIC0gb3JpZ2luYWxab29tKSA+IDAuMDAwMSkge1xuICAgICAgICAgICAgdHIucmVjZW50ZXJPblRlcnJhaW4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyLmNhbWVyYUVsZXZhdGlvblJlZmVyZW5jZSA9IFwiZ3JvdW5kXCI7XG5cbiAgICAgICAgdGhpcy5fbWFwLl91cGRhdGUoKTtcbiAgICAgICAgaWYgKCFjb21iaW5lZFJlc3VsdC5ub0luZXJ0aWEpIHRoaXMuX2luZXJ0aWEucmVjb3JkKGNvbWJpbmVkUmVzdWx0KTtcbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50cyhjb21iaW5lZEV2ZW50c0luUHJvZ3Jlc3MsIGRlYWN0aXZhdGVkSGFuZGxlcnMsIHRydWUpO1xuXG4gICAgfVxuXG4gICAgX2ZpcmVFdmVudHMobmV3RXZlbnRzSW5Qcm9ncmVzczogeyBbc3RyaW5nXTogT2JqZWN0IH0sIGRlYWN0aXZhdGVkSGFuZGxlcnM6IE9iamVjdCwgYWxsb3dFbmRBbmltYXRpb246IGJvb2xlYW4pIHtcblxuICAgICAgICBjb25zdCB3YXNNb3ZpbmcgPSBpc01vdmluZyh0aGlzLl9ldmVudHNJblByb2dyZXNzKTtcbiAgICAgICAgY29uc3Qgbm93TW92aW5nID0gaXNNb3ZpbmcobmV3RXZlbnRzSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRFdmVudHMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiBuZXdFdmVudHNJblByb2dyZXNzKSB7XG4gICAgICAgICAgICBjb25zdCB7b3JpZ2luYWxFdmVudH0gPSBuZXdFdmVudHNJblByb2dyZXNzW2V2ZW50TmFtZV07XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2V2ZW50c0luUHJvZ3Jlc3NbZXZlbnROYW1lXSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0RXZlbnRzW2Ake2V2ZW50TmFtZX1zdGFydGBdID0gb3JpZ2luYWxFdmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3NbZXZlbnROYW1lXSA9IG5ld0V2ZW50c0luUHJvZ3Jlc3NbZXZlbnROYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpcmUgc3RhcnQgZXZlbnRzIG9ubHkgYWZ0ZXIgdGhpcy5fZXZlbnRzSW5Qcm9ncmVzcyBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICAgIGlmICghd2FzTW92aW5nICYmIG5vd01vdmluZykge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3Zlc3RhcnQnLCBub3dNb3Zpbmcub3JpZ2luYWxFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gc3RhcnRFdmVudHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudChuYW1lLCBzdGFydEV2ZW50c1tuYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm93TW92aW5nKSB7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmUnLCBub3dNb3Zpbmcub3JpZ2luYWxFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiBuZXdFdmVudHNJblByb2dyZXNzKSB7XG4gICAgICAgICAgICBjb25zdCB7b3JpZ2luYWxFdmVudH0gPSBuZXdFdmVudHNJblByb2dyZXNzW2V2ZW50TmFtZV07XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoZXZlbnROYW1lLCBvcmlnaW5hbEV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVuZEV2ZW50cyA9IHt9O1xuXG4gICAgICAgIGxldCBvcmlnaW5hbEVuZEV2ZW50O1xuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0aGlzLl9ldmVudHNJblByb2dyZXNzKSB7XG4gICAgICAgICAgICBjb25zdCB7aGFuZGxlck5hbWUsIG9yaWdpbmFsRXZlbnR9ID0gdGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9oYW5kbGVyc0J5SWRbaGFuZGxlck5hbWVdLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fZXZlbnRzSW5Qcm9ncmVzc1tldmVudE5hbWVdO1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kRXZlbnQgPSBkZWFjdGl2YXRlZEhhbmRsZXJzW2hhbmRsZXJOYW1lXSB8fCBvcmlnaW5hbEV2ZW50O1xuICAgICAgICAgICAgICAgIGVuZEV2ZW50c1tgJHtldmVudE5hbWV9ZW5kYF0gPSBvcmlnaW5hbEVuZEV2ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGVuZEV2ZW50cykge1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KG5hbWUsIGVuZEV2ZW50c1tuYW1lXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGlsbE1vdmluZyA9IGlzTW92aW5nKHRoaXMuX2V2ZW50c0luUHJvZ3Jlc3MpO1xuICAgICAgICBpZiAoYWxsb3dFbmRBbmltYXRpb24gJiYgKHdhc01vdmluZyB8fCBub3dNb3ZpbmcpICYmICFzdGlsbE1vdmluZykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdDYW1lcmEgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgaW5lcnRpYWxFYXNlID0gdGhpcy5faW5lcnRpYS5fb25Nb3ZlRW5kKHRoaXMuX21hcC5kcmFnUGFuLl9pbmVydGlhT3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFNuYXBUb05vcnRoID0gYmVhcmluZyA9PiBiZWFyaW5nICE9PSAwICYmIC10aGlzLl9iZWFyaW5nU25hcCA8IGJlYXJpbmcgJiYgYmVhcmluZyA8IHRoaXMuX2JlYXJpbmdTbmFwO1xuXG4gICAgICAgICAgICBpZiAoaW5lcnRpYWxFYXNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZFNuYXBUb05vcnRoKGluZXJ0aWFsRWFzZS5iZWFyaW5nIHx8IHRoaXMuX21hcC5nZXRCZWFyaW5nKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZXJ0aWFsRWFzZS5iZWFyaW5nID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmVhc2VUbyhpbmVydGlhbEVhc2UsIHtvcmlnaW5hbEV2ZW50OiBvcmlnaW5hbEVuZEV2ZW50fSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCgnbW92ZWVuZCcsIHtvcmlnaW5hbEV2ZW50OiBvcmlnaW5hbEVuZEV2ZW50fSkpO1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTbmFwVG9Ob3J0aCh0aGlzLl9tYXAuZ2V0QmVhcmluZygpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAucmVzZXROb3J0aCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nQ2FtZXJhID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIF9maXJlRXZlbnQodHlwZTogc3RyaW5nLCBlOiAqKSB7XG4gICAgICAgIHRoaXMuX21hcC5maXJlKG5ldyBFdmVudCh0eXBlLCBlID8ge29yaWdpbmFsRXZlbnQ6IGV9IDoge30pKTtcbiAgICB9XG5cbiAgICBfcmVxdWVzdEZyYW1lKCk6IG51bWJlciB7XG4gICAgICAgIHRoaXMuX21hcC50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLl9yZW5kZXJUYXNrUXVldWUuYWRkKHRpbWVTdGFtcCA9PiB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVFdmVudChuZXcgUmVuZGVyRnJhbWVFdmVudCgncmVuZGVyRnJhbWUnLCB7dGltZVN0YW1wfSkpO1xuICAgICAgICAgICAgdGhpcy5fYXBwbHlDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF90cmlnZ2VyUmVuZGVyRnJhbWUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9mcmFtZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lSWQgPSB0aGlzLl9yZXF1ZXN0RnJhbWUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSGFuZGxlck1hbmFnZXI7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1xuICAgIGJpbmRBbGwsXG4gICAgZXh0ZW5kLFxuICAgIHdhcm5PbmNlLFxuICAgIGNsYW1wLFxuICAgIHdyYXAsXG4gICAgZWFzZSBhcyBkZWZhdWx0RWFzaW5nLFxuICAgIHBpY2ssXG4gICAgZGVnVG9SYWRcbn0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7bnVtYmVyIGFzIGludGVycG9sYXRlfSBmcm9tICcuLi9zdHlsZS1zcGVjL3V0aWwvaW50ZXJwb2xhdGUuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyLmpzJztcbmltcG9ydCBMbmdMYXQgZnJvbSAnLi4vZ2VvL2xuZ19sYXQuanMnO1xuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuLi9nZW8vbG5nX2xhdF9ib3VuZHMuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtFdmVudCwgRXZlbnRlZH0gZnJvbSAnLi4vdXRpbC9ldmVudGVkLmpzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7RGVidWd9IGZyb20gJy4uL3V0aWwvZGVidWcuanMnO1xuaW1wb3J0IE1lcmNhdG9yQ29vcmRpbmF0ZSwge21lcmNhdG9yWmZyb21BbHRpdHVkZSwgbWVyY2F0b3JYZnJvbUxuZywgbWVyY2F0b3JZZnJvbUxhdH0gZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHt2ZWMzfSBmcm9tICdnbC1tYXRyaXgnO1xuaW1wb3J0IHR5cGUge0ZyZWVDYW1lcmFPcHRpb25zfSBmcm9tICcuL2ZyZWVfY2FtZXJhLmpzJztcbmltcG9ydCB0eXBlIFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCB0eXBlIHtMbmdMYXRMaWtlfSBmcm9tICcuLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgdHlwZSB7TG5nTGF0Qm91bmRzTGlrZX0gZnJvbSAnLi4vZ2VvL2xuZ19sYXRfYm91bmRzLmpzJztcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uL3V0aWwvdGFza19xdWV1ZS5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FsbGJhY2t9IGZyb20gJy4uL3R5cGVzL2NhbGxiYWNrLmpzJztcbmltcG9ydCB0eXBlIHtQb2ludExpa2V9IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHtBYWJiLCBGcnVzdHVtfSBmcm9tICcuLi91dGlsL3ByaW1pdGl2ZXMuanMnO1xuaW1wb3J0IHR5cGUge1BhZGRpbmdPcHRpb25zfSBmcm9tICcuLi9nZW8vZWRnZV9pbnNldHMuanMnO1xuaW1wb3J0IHR5cGUge1ZlYzN9IGZyb20gJ2dsLW1hdHJpeCc7XG5cbi8qKlxuICogQSBoZWxwZXIgdHlwZTogY29udmVydHMgYWxsIE9iamVjdCB0eXBlIHZhbHVlcyB0byBub24tbWF5YmUgdHlwZXMuXG4gKi9cbnR5cGUgUmVxdWlyZWQ8VD4gPSAkT2JqTWFwPFQsIDxWPih2OiBWKSA9PiAkTm9uTWF5YmVUeXBlPFY+PjtcblxuLyoqXG4gKiBPcHRpb25zIGNvbW1vbiB0byB7QGxpbmsgTWFwI2p1bXBUb30sIHtAbGluayBNYXAjZWFzZVRvfSwgYW5kIHtAbGluayBNYXAjZmx5VG99LCBjb250cm9sbGluZyB0aGUgZGVzaXJlZCBsb2NhdGlvbixcbiAqIHpvb20sIGJlYXJpbmcsIGFuZCBwaXRjaCBvZiB0aGUgY2FtZXJhLiBBbGwgcHJvcGVydGllcyBhcmUgb3B0aW9uYWwsIGFuZCB3aGVuIGEgcHJvcGVydHkgaXMgb21pdHRlZCwgdGhlIGN1cnJlbnRcbiAqIGNhbWVyYSB2YWx1ZSBmb3IgdGhhdCBwcm9wZXJ0eSB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQ2FtZXJhT3B0aW9uc1xuICogQHByb3BlcnR5IHtMbmdMYXRMaWtlfSBjZW50ZXIgVGhlIGxvY2F0aW9uIHRvIHBsYWNlIGF0IHRoZSBzY3JlZW4gY2VudGVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHpvb20gVGhlIGRlc2lyZWQgem9vbSBsZXZlbC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBiZWFyaW5nIFRoZSBkZXNpcmVkIGJlYXJpbmcgaW4gZGVncmVlcy4gVGhlIGJlYXJpbmcgaXMgdGhlIGNvbXBhc3MgZGlyZWN0aW9uIHRoYXRcbiAqIGlzIFwidXBcIi4gRm9yIGV4YW1wbGUsIGBiZWFyaW5nOiA5MGAgb3JpZW50cyB0aGUgbWFwIHNvIHRoYXQgZWFzdCBpcyB1cC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwaXRjaCBUaGUgZGVzaXJlZCBwaXRjaCBpbiBkZWdyZWVzLiBUaGUgcGl0Y2ggaXMgdGhlIGFuZ2xlIHRvd2FyZHMgdGhlIGhvcml6b25cbiAqIG1lYXN1cmVkIGluIGRlZ3JlZXMgd2l0aCBhIHJhbmdlIGJldHdlZW4gMCBhbmQgODUgZGVncmVlcy4gRm9yIGV4YW1wbGUsIHBpdGNoOiAwIHByb3ZpZGVzIHRoZSBhcHBlYXJhbmNlXG4gKiBvZiBsb29raW5nIHN0cmFpZ2h0IGRvd24gYXQgdGhlIG1hcCwgd2hpbGUgcGl0Y2g6IDYwIHRpbHRzIHRoZSB1c2VyJ3MgcGVyc3BlY3RpdmUgdG93YXJkcyB0aGUgaG9yaXpvbi5cbiAqIEluY3JlYXNpbmcgdGhlIHBpdGNoIHZhbHVlIGlzIG9mdGVuIHVzZWQgdG8gZGlzcGxheSAzRCBvYmplY3RzLlxuICogQHByb3BlcnR5IHtMbmdMYXRMaWtlfSBhcm91bmQgVGhlIGxvY2F0aW9uIHNlcnZpbmcgYXMgdGhlIG9yaWdpbiBmb3IgYSBjaGFuZ2UgaW4gYHpvb21gLCBgcGl0Y2hgIGFuZC9vciBgYmVhcmluZ2AuXG4gKiBUaGlzIGxvY2F0aW9uIHdpbGwgcmVtYWluIGF0IHRoZSBzYW1lIHNjcmVlbiBwb3NpdGlvbiBmb2xsb3dpbmcgdGhlIHRyYW5zZm9ybS5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBkcmF3aW5nIGF0dGVudGlvbiB0byBhIGxvY2F0aW9uIHRoYXQgaXMgbm90IGluIHRoZSBzY3JlZW4gY2VudGVyLlxuICogYGNlbnRlcmAgaXMgaWdub3JlZCBpZiBgYXJvdW5kYCBpcyBpbmNsdWRlZC5cbiAqIEBwcm9wZXJ0eSB7UGFkZGluZ09wdGlvbnN9IHBhZGRpbmcgRGltZW5zaW9ucyBpbiBwaXhlbHMgYXBwbGllZCBvbiBlYWNoIHNpZGUgb2YgdGhlIHZpZXdwb3J0IGZvciBzaGlmdGluZyB0aGUgdmFuaXNoaW5nIHBvaW50LlxuICogQGV4YW1wbGVcbiAqIC8vIHNldCB0aGUgbWFwJ3MgaW5pdGlhbCBwZXJzcGVjdGl2ZSB3aXRoIENhbWVyYU9wdGlvbnNcbiAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe1xuICogICAgIGNvbnRhaW5lcjogJ21hcCcsXG4gKiAgICAgc3R5bGU6ICdtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3N0cmVldHMtdjExJyxcbiAqICAgICBjZW50ZXI6IFstNzMuNTgwNCwgNDUuNTM0ODNdLFxuICogICAgIHBpdGNoOiA2MCxcbiAqICAgICBiZWFyaW5nOiAtNjAsXG4gKiAgICAgem9vbTogMTBcbiAqIH0pO1xuICogQHNlZSBbRXhhbXBsZTogU2V0IHBpdGNoIGFuZCBiZWFyaW5nXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9zZXQtcGVyc3BlY3RpdmUvKVxuICogQHNlZSBbRXhhbXBsZTogSnVtcCB0byBhIHNlcmllcyBvZiBsb2NhdGlvbnNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2p1bXAtdG8vKVxuICogQHNlZSBbRXhhbXBsZTogRmx5IHRvIGEgbG9jYXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZseXRvLylcbiAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgYnVpbGRpbmdzIGluIDNEXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS8zZC1idWlsZGluZ3MvKVxuICovXG5leHBvcnQgdHlwZSBDYW1lcmFPcHRpb25zID0ge1xuICAgIGNlbnRlcj86IExuZ0xhdExpa2UsXG4gICAgem9vbT86IG51bWJlcixcbiAgICBiZWFyaW5nPzogbnVtYmVyLFxuICAgIHBpdGNoPzogbnVtYmVyLFxuICAgIGFyb3VuZD86IExuZ0xhdExpa2UsXG4gICAgcGFkZGluZz86IFBhZGRpbmdPcHRpb25zLFxuICAgIG9mZnNldD86IFBvaW50TGlrZVxufTtcblxuZXhwb3J0IHR5cGUgRnVsbENhbWVyYU9wdGlvbnMgPSB7XG4gICAgbWF4Wm9vbTogbnVtYmVyLFxuICAgIG9mZnNldDogUG9pbnRMaWtlLFxuICAgIHBhZGRpbmc6IFJlcXVpcmVkPFBhZGRpbmdPcHRpb25zPlxufSAmIENhbWVyYU9wdGlvbnNcblxuLyoqXG4gKiBPcHRpb25zIGNvbW1vbiB0byBtYXAgbW92ZW1lbnQgbWV0aG9kcyB0aGF0IGludm9sdmUgYW5pbWF0aW9uLCBzdWNoIGFzIHtAbGluayBNYXAjcGFuQnl9IGFuZFxuICoge0BsaW5rIE1hcCNlYXNlVG99LCBjb250cm9sbGluZyB0aGUgZHVyYXRpb24gYW5kIGVhc2luZyBmdW5jdGlvbiBvZiB0aGUgYW5pbWF0aW9uLiBBbGwgcHJvcGVydGllc1xuICogYXJlIG9wdGlvbmFsLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFuaW1hdGlvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGVhc2luZyBBIGZ1bmN0aW9uIHRha2luZyBhIHRpbWUgaW4gdGhlIHJhbmdlIDAuLjEgYW5kIHJldHVybmluZyBhIG51bWJlciB3aGVyZSAwIGlzXG4gKiAgIHRoZSBpbml0aWFsIHN0YXRlIGFuZCAxIGlzIHRoZSBmaW5hbCBzdGF0ZS5cbiAqIEBwcm9wZXJ0eSB7UG9pbnRMaWtlfSBvZmZzZXQgVGhlIHRhcmdldCBjZW50ZXIncyBvZmZzZXQgcmVsYXRpdmUgdG8gcmVhbCBtYXAgY29udGFpbmVyIGNlbnRlciBhdCB0aGUgZW5kIG9mIGFuaW1hdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYW5pbWF0ZSBJZiBgZmFsc2VgLCBubyBhbmltYXRpb24gd2lsbCBvY2N1ci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZXNzZW50aWFsIElmIGB0cnVlYCwgdGhlbiB0aGUgYW5pbWF0aW9uIGlzIGNvbnNpZGVyZWQgZXNzZW50aWFsIGFuZCB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieVxuICogICBbYHByZWZlcnMtcmVkdWNlZC1tb3Rpb25gXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQG1lZGlhL3ByZWZlcnMtcmVkdWNlZC1tb3Rpb24pLlxuICogQHNlZSBbRXhhbXBsZTogU2xvd2x5IGZseSB0byBhIGxvY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mbHl0by1vcHRpb25zLylcbiAqIEBzZWUgW0V4YW1wbGU6IEN1c3RvbWl6ZSBjYW1lcmEgYW5pbWF0aW9uc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2FtZXJhLWFuaW1hdGlvbi8pXG4gKiBAc2VlIFtFeGFtcGxlOiBOYXZpZ2F0ZSB0aGUgbWFwIHdpdGggZ2FtZS1saWtlIGNvbnRyb2xzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nYW1lLWNvbnRyb2xzLylcbiovXG5leHBvcnQgdHlwZSBBbmltYXRpb25PcHRpb25zID0ge1xuICAgIGR1cmF0aW9uPzogbnVtYmVyLFxuICAgIGVhc2luZz86IChfOiBudW1iZXIpID0+IG51bWJlcixcbiAgICBvZmZzZXQ/OiBQb2ludExpa2UsXG4gICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgZXNzZW50aWFsPzogYm9vbGVhblxufTtcblxuZXhwb3J0IHR5cGUgRWFzaW5nT3B0aW9ucyA9IENhbWVyYU9wdGlvbnMgJiBBbmltYXRpb25PcHRpb25zO1xuXG5leHBvcnQgdHlwZSBFbGV2YXRpb25Cb3hSYXljYXN0ID0ge1xuICAgIG1pbkxuZ0xhdDogTG5nTGF0LFxuICAgIG1heExuZ0xhdDogTG5nTGF0LFxuICAgIG1pbkFsdGl0dWRlOiBudW1iZXIsXG4gICAgbWF4QWx0aXR1ZGU6IG51bWJlclxufTtcblxuY29uc3QgZnJlZUNhbWVyYU5vdFN1cHBvcnRlZFdhcm5pbmcgPSAnbWFwLnNldEZyZWVDYW1lcmFPcHRpb25zKC4uLikgYW5kIG1hcC5nZXRGcmVlQ2FtZXJhT3B0aW9ucygpIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBmb3Igbm9uLW1lcmNhdG9yIHByb2plY3Rpb25zLic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc2V0dGluZyBwYWRkaW5nIG9uIGNhbGxzIHRvIG1ldGhvZHMgc3VjaCBhcyB7QGxpbmsgTWFwI2ZpdEJvdW5kc30sIHtAbGluayBNYXAjZml0U2NyZWVuQ29vcmRpbmF0ZXN9LCBhbmQge0BsaW5rIE1hcCNzZXRQYWRkaW5nfS4gQWRqdXN0IHRoZXNlIG9wdGlvbnMgdG8gc2V0IHRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgYWRkZWQgdG8gdGhlIGVkZ2VzIG9mIHRoZSBjYW52YXMuIFNldCBhIHVuaWZvcm0gcGFkZGluZyBvbiBhbGwgZWRnZXMgb3IgaW5kaXZpZHVhbCB2YWx1ZXMgZm9yIGVhY2ggZWRnZS4gQWxsIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3QgbXVzdCBiZVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXJzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBhZGRpbmdPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG9wIFBhZGRpbmcgaW4gcGl4ZWxzIGZyb20gdGhlIHRvcCBvZiB0aGUgbWFwIGNhbnZhcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBib3R0b20gUGFkZGluZyBpbiBwaXhlbHMgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBtYXAgY2FudmFzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlZnQgUGFkZGluZyBpbiBwaXhlbHMgZnJvbSB0aGUgbGVmdCBvZiB0aGUgbWFwIGNhbnZhcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByaWdodCBQYWRkaW5nIGluIHBpeGVscyBmcm9tIHRoZSByaWdodCBvZiB0aGUgbWFwIGNhbnZhcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYmJveCA9IFtbLTc5LCA0M10sIFstNzMsIDQ1XV07XG4gKiBtYXAuZml0Qm91bmRzKGJib3gsIHtcbiAqICAgICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYmJveCA9IFtbLTc5LCA0M10sIFstNzMsIDQ1XV07XG4gKiBtYXAuZml0Qm91bmRzKGJib3gsIHtcbiAqICAgICBwYWRkaW5nOiAyMFxuICogfSk7XG4gKiBAc2VlIFtFeGFtcGxlOiBGaXQgdG8gdGhlIGJvdW5kcyBvZiBhIExpbmVTdHJpbmddKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3pvb210by1saW5lc3RyaW5nLylcbiAqIEBzZWUgW0V4YW1wbGU6IEZpdCBhIG1hcCB0byBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZml0Ym91bmRzLylcbiAqL1xuXG5jbGFzcyBDYW1lcmEgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICB0cmFuc2Zvcm06IFRyYW5zZm9ybTtcbiAgICBfbW92aW5nOiBib29sZWFuO1xuICAgIF96b29taW5nOiBib29sZWFuO1xuICAgIF9yb3RhdGluZzogYm9vbGVhbjtcbiAgICBfcGl0Y2hpbmc6IGJvb2xlYW47XG4gICAgX3BhZGRpbmc6IGJvb2xlYW47XG5cbiAgICBfYmVhcmluZ1NuYXA6IG51bWJlcjtcbiAgICBfZWFzZVN0YXJ0OiBudW1iZXI7XG4gICAgX2Vhc2VPcHRpb25zOiB7ZHVyYXRpb246IG51bWJlciwgZWFzaW5nOiAoXzogbnVtYmVyKSA9PiBudW1iZXJ9O1xuICAgIF9lYXNlSWQ6IHN0cmluZyB8IHZvaWQ7XG5cbiAgICBfb25FYXNlRnJhbWU6ID8oXzogbnVtYmVyKSA9PiBUcmFuc2Zvcm0gfCB2b2lkO1xuICAgIF9vbkVhc2VFbmQ6ID8oZWFzZUlkPzogc3RyaW5nKSA9PiB2b2lkO1xuICAgIF9lYXNlRnJhbWVJZDogP1Rhc2tJRDtcblxuICAgICtfcmVxdWVzdFJlbmRlckZyYW1lOiAoKCkgPT4gdm9pZCkgPT4gVGFza0lEO1xuICAgICtfY2FuY2VsUmVuZGVyRnJhbWU6IChfOiBUYXNrSUQpID0+IHZvaWQ7XG5cbiAgICArX3ByZWxvYWRUaWxlczogKHRyYW5zZm9ybTogVHJhbnNmb3JtIHwgQXJyYXk8VHJhbnNmb3JtPiwgY2FsbGJhY2s/OiBDYWxsYmFjazxhbnk+KSA9PiBhbnk7XG5cbiAgICBjb25zdHJ1Y3Rvcih0cmFuc2Zvcm06IFRyYW5zZm9ybSwgb3B0aW9uczoge2JlYXJpbmdTbmFwOiBudW1iZXJ9KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX21vdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl96b29taW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgICAgICB0aGlzLl9iZWFyaW5nU25hcCA9IG9wdGlvbnMuYmVhcmluZ1NuYXA7XG5cbiAgICAgICAgYmluZEFsbChbJ19yZW5kZXJGcmFtZUNhbGxiYWNrJ10sIHRoaXMpO1xuXG4gICAgICAgIC8vYWRkQXNzZXJ0aW9ucyh0aGlzKTtcbiAgICB9XG5cbiAgICAvKiogQHNlY3Rpb24ge0NhbWVyYX1cbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIE1hcCAqL1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGNlbnRlcnBvaW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gUmV0dXJuIGEgTG5nTGF0IG9iamVjdCBzdWNoIGFzIHtsbmc6IDAsIGxhdDogMH0uXG4gICAgICogY29uc3QgY2VudGVyID0gbWFwLmdldENlbnRlcigpO1xuICAgICAqIC8vIEFjY2VzcyBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIHZhbHVlcyBkaXJlY3RseS5cbiAgICAgKiBjb25zdCB7bG5nLCBsYXR9ID0gbWFwLmdldENlbnRlcigpO1xuICAgICAqIEBzZWUgW1R1dG9yaWFsOiBVc2UgTWFwYm94IEdMIEpTIGluIGEgUmVhY3QgYXBwXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL3R1dG9yaWFscy91c2UtbWFwYm94LWdsLWpzLXdpdGgtcmVhY3QvI3N0b3JlLXRoZS1uZXctY29vcmRpbmF0ZXMpXG4gICAgICovXG4gICAgZ2V0Q2VudGVyKCk6IExuZ0xhdCB7IHJldHVybiBuZXcgTG5nTGF0KHRoaXMudHJhbnNmb3JtLmNlbnRlci5sbmcsIHRoaXMudHJhbnNmb3JtLmNlbnRlci5sYXQpOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgY2VudGVycG9pbnQuIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7Y2VudGVyOiBjZW50ZXJ9KWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gY2VudGVyIFRoZSBjZW50ZXJwb2ludCB0byBzZXQuXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBudWxsfSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0Q2VudGVyKFstNzQsIDM4XSk7XG4gICAgICovXG4gICAgc2V0Q2VudGVyKGNlbnRlcjogTG5nTGF0TGlrZSwgZXZlbnREYXRhPzogT2JqZWN0KTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLmp1bXBUbyh7Y2VudGVyfSwgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYW5zIHRoZSBtYXAgYnkgdGhlIHNwZWNpZmllZCBvZmZzZXQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBvZmZzZXQgVGhlIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIGJ5IHdoaWNoIHRvIHBhbiB0aGUgbWFwLlxuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9ucyB8IG51bGx9IG9wdGlvbnMgQW4gb3B0aW9ucyBvYmplY3QgZGVzY3JpYmluZyB0aGUgZGVzdGluYXRpb24gYW5kIGFuaW1hdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4gV2UgZG8gbm90IHJlY29tbWVuZCB1c2luZyBgb3B0aW9ucy5vZmZzZXRgIHNpbmNlIHRoaXMgdmFsdWUgd2lsbCBvdmVycmlkZSB0aGUgdmFsdWUgb2YgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgIFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAucGFuQnkoWy03NCwgMzhdKTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHBhbkJ5IHdpdGggYW4gYW5pbWF0aW9uIG9mIDUgc2Vjb25kcy5cbiAgICAgKiBtYXAucGFuQnkoWy03NCwgMzhdLCB7ZHVyYXRpb246IDUwMDB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBOYXZpZ2F0ZSB0aGUgbWFwIHdpdGggZ2FtZS1saWtlIGNvbnRyb2xzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dhbWUtY29udHJvbHMvKVxuICAgICAqL1xuICAgIHBhbkJ5KG9mZnNldDogUG9pbnRMaWtlLCBvcHRpb25zPzogQW5pbWF0aW9uT3B0aW9ucywgZXZlbnREYXRhPzogT2JqZWN0KTogdGhpcyB7XG4gICAgICAgIG9mZnNldCA9IFBvaW50LmNvbnZlcnQob2Zmc2V0KS5tdWx0KC0xKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFuVG8odGhpcy50cmFuc2Zvcm0uY2VudGVyLCBleHRlbmQoe29mZnNldH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhbnMgdGhlIG1hcCB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBsbmdsYXQgVGhlIGxvY2F0aW9uIHRvIHBhbiB0aGUgbWFwIHRvLlxuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9ucyB8IG51bGx9IG9wdGlvbnMgT3B0aW9ucyBkZXNjcmliaW5nIHRoZSBkZXN0aW5hdGlvbiBhbmQgYW5pbWF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnBhblRvKFstNzQsIDM4XSk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBTcGVjaWZ5IHRoYXQgdGhlIHBhblRvIGFuaW1hdGlvbiBzaG91bGQgbGFzdCA1MDAwIG1pbGxpc2Vjb25kcy5cbiAgICAgKiBtYXAucGFuVG8oWy03NCwgMzhdLCB7ZHVyYXRpb246IDUwMDB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBVcGRhdGUgYSBmZWF0dXJlIGluIHJlYWx0aW1lXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9saXZlLXVwZGF0ZS1mZWF0dXJlLylcbiAgICAgKi9cbiAgICBwYW5UbyhsbmdsYXQ6IExuZ0xhdExpa2UsIG9wdGlvbnM/OiBBbmltYXRpb25PcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFzZVRvKGV4dGVuZCh7XG4gICAgICAgICAgICBjZW50ZXI6IGxuZ2xhdFxuICAgICAgICB9LCBvcHRpb25zKSwgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZ2V0Wm9vbSgpO1xuICAgICAqL1xuICAgIGdldFpvb20oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnpvb207IH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCdzIHpvb20gbGV2ZWwuIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7em9vbTogem9vbX0pYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpvb20gVGhlIHpvb20gbGV2ZWwgdG8gc2V0ICgwLTIwKS5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21lbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gWm9vbSB0byB0aGUgem9vbSBsZXZlbCA1IHdpdGhvdXQgYW4gYW5pbWF0ZWQgdHJhbnNpdGlvblxuICAgICAqIG1hcC5zZXRab29tKDUpO1xuICAgICAqL1xuICAgIHNldFpvb20oem9vbTogbnVtYmVyLCBldmVudERhdGE/OiBPYmplY3QpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe3pvb219LCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBab29tcyB0aGUgbWFwIHRvIHRoZSBzcGVjaWZpZWQgem9vbSBsZXZlbCwgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gem9vbSBUaGUgem9vbSBsZXZlbCB0byB0cmFuc2l0aW9uIHRvLlxuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9ucyB8IG51bGx9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBudWxsfSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFpvb20gdG8gdGhlIHpvb20gbGV2ZWwgNSB3aXRob3V0IGFuIGFuaW1hdGVkIHRyYW5zaXRpb25cbiAgICAgKiBtYXAuem9vbVRvKDUpO1xuICAgICAqIC8vIFpvb20gdG8gdGhlIHpvb20gbGV2ZWwgOCB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb25cbiAgICAgKiBtYXAuem9vbVRvKDgsIHtcbiAgICAgKiAgICAgZHVyYXRpb246IDIwMDAsXG4gICAgICogICAgIG9mZnNldDogWzEwMCwgNTBdXG4gICAgICogfSk7XG4gICAgICovXG4gICAgem9vbVRvKHpvb206IG51bWJlciwgb3B0aW9uczogPyBBbmltYXRpb25PcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWFzZVRvKGV4dGVuZCh7XG4gICAgICAgICAgICB6b29tXG4gICAgICAgIH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY3JlYXNlcyB0aGUgbWFwJ3Mgem9vbSBsZXZlbCBieSAxLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnMgfCBudWxsfSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21zdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZWVuZFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyB6b29tIHRoZSBtYXAgaW4gb25lIGxldmVsIHdpdGggYSBjdXN0b20gYW5pbWF0aW9uIGR1cmF0aW9uXG4gICAgICogbWFwLnpvb21Jbih7ZHVyYXRpb246IDEwMDB9KTtcbiAgICAgKi9cbiAgICB6b29tSW4ob3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCk6IHRoaXMge1xuICAgICAgICB0aGlzLnpvb21Ubyh0aGlzLmdldFpvb20oKSArIDEsIG9wdGlvbnMsIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlY3JlYXNlcyB0aGUgbWFwJ3Mgem9vbSBsZXZlbCBieSAxLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnMgfCBudWxsfSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21zdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZWVuZFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyB6b29tIHRoZSBtYXAgb3V0IG9uZSBsZXZlbCB3aXRoIGEgY3VzdG9tIGFuaW1hdGlvbiBvZmZzZXRcbiAgICAgKiBtYXAuem9vbU91dCh7b2Zmc2V0OiBbODAsIDYwXX0pO1xuICAgICAqL1xuICAgIHpvb21PdXQob3B0aW9ucz86IEFuaW1hdGlvbk9wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCk6IHRoaXMge1xuICAgICAgICB0aGlzLnpvb21Ubyh0aGlzLmdldFpvb20oKSAtIDEsIG9wdGlvbnMsIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIGN1cnJlbnQgYmVhcmluZy4gVGhlIGJlYXJpbmcgaXMgdGhlIGNvbXBhc3MgZGlyZWN0aW9uIHRoYXQgaXMgXCJ1cFwiOyBmb3IgZXhhbXBsZSwgYSBiZWFyaW5nXG4gICAgICogb2YgOTDCsCBvcmllbnRzIHRoZSBtYXAgc28gdGhhdCBlYXN0IGlzIHVwLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbWFwJ3MgY3VycmVudCBiZWFyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgYmVhcmluZyA9IG1hcC5nZXRCZWFyaW5nKCk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogTmF2aWdhdGUgdGhlIG1hcCB3aXRoIGdhbWUtbGlrZSBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nYW1lLWNvbnRyb2xzLylcbiAgICAgKi9cbiAgICBnZXRCZWFyaW5nKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5iZWFyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCdzIGJlYXJpbmcgKHJvdGF0aW9uKS4gVGhlIGJlYXJpbmcgaXMgdGhlIGNvbXBhc3MgZGlyZWN0aW9uIHRoYXQgaXMgXCJ1cFwiOyBmb3IgZXhhbXBsZSwgYSBiZWFyaW5nXG4gICAgICogb2YgOTDCsCBvcmllbnRzIHRoZSBtYXAgc28gdGhhdCBlYXN0IGlzIHVwLlxuICAgICAqXG4gICAgICogRXF1aXZhbGVudCB0byBganVtcFRvKHtiZWFyaW5nOiBiZWFyaW5nfSlgLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmVhcmluZyBUaGUgZGVzaXJlZCBiZWFyaW5nLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gUm90YXRlIHRoZSBtYXAgdG8gOTAgZGVncmVlcy5cbiAgICAgKiBtYXAuc2V0QmVhcmluZyg5MCk7XG4gICAgICovXG4gICAgc2V0QmVhcmluZyhiZWFyaW5nOiBudW1iZXIsIGV2ZW50RGF0YT86IE9iamVjdCk6IHRoaXMge1xuICAgICAgICB0aGlzLmp1bXBUbyh7YmVhcmluZ30sIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGFkZGluZyBhcHBsaWVkIGFyb3VuZCB0aGUgbWFwIHZpZXdwb3J0LlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyB7UGFkZGluZ09wdGlvbnN9IFRoZSBjdXJyZW50IHBhZGRpbmcgYXJvdW5kIHRoZSBtYXAgdmlld3BvcnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBwYWRkaW5nID0gbWFwLmdldFBhZGRpbmcoKTtcbiAgICAgKi9cbiAgICBnZXRQYWRkaW5nKCk6IFBhZGRpbmdPcHRpb25zIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBhZGRpbmc7IH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBhZGRpbmcgaW4gcGl4ZWxzIGFyb3VuZCB0aGUgdmlld3BvcnQuXG4gICAgICpcbiAgICAgKiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe3BhZGRpbmc6IHBhZGRpbmd9KWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7UGFkZGluZ09wdGlvbnN9IHBhZGRpbmcgVGhlIGRlc2lyZWQgcGFkZGluZy4gRm9ybWF0OiB7bGVmdDogbnVtYmVyLCByaWdodDogbnVtYmVyLCB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXJ9LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gU2V0cyBhIGxlZnQgcGFkZGluZyBvZiAzMDBweCwgYW5kIGEgdG9wIHBhZGRpbmcgb2YgNTBweFxuICAgICAqIG1hcC5zZXRQYWRkaW5nKHtsZWZ0OiAzMDAsIHRvcDogNTB9KTtcbiAgICAgKi9cbiAgICBzZXRQYWRkaW5nKHBhZGRpbmc6IFBhZGRpbmdPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oe3BhZGRpbmd9LCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb3RhdGVzIHRoZSBtYXAgdG8gdGhlIHNwZWNpZmllZCBiZWFyaW5nLCB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24uIFRoZSBiZWFyaW5nIGlzIHRoZSBjb21wYXNzIGRpcmVjdGlvblxuICAgICAqIHRoYXQgaXMgXFxcInVwXFxcIjsgZm9yIGV4YW1wbGUsIGEgYmVhcmluZyBvZiA5MMKwIG9yaWVudHMgdGhlIG1hcCBzbyB0aGF0IGVhc3QgaXMgdXAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiZWFyaW5nIFRoZSBkZXNpcmVkIGJlYXJpbmcuXG4gICAgICogQHBhcmFtIHtFYXNpbmdPcHRpb25zIHwgbnVsbH0gb3B0aW9ucyBPcHRpb25zIGRlc2NyaWJpbmcgdGhlIGRlc3RpbmF0aW9uIGFuZCBhbmltYXRpb24gb2YgdGhlIHRyYW5zaXRpb24uXG4gICAgICogICAgICAgICAgICBBY2NlcHRzIHtAbGluayBDYW1lcmFPcHRpb25zfSBhbmQge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byBldmVudCBvYmplY3RzIG9mIGV2ZW50cyB0cmlnZ2VyZWQgYnkgdGhpcyBtZXRob2QuXG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnJvdGF0ZVRvKDMwKTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHJvdGF0ZVRvIHdpdGggYW4gYW5pbWF0aW9uIG9mIDIgc2Vjb25kcy5cbiAgICAgKiBtYXAucm90YXRlVG8oMzAsIHtkdXJhdGlvbjogMjAwMH0pO1xuICAgICAqL1xuICAgIHJvdGF0ZVRvKGJlYXJpbmc6IG51bWJlciwgb3B0aW9ucz86IEVhc2luZ09wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy5lYXNlVG8oZXh0ZW5kKHtcbiAgICAgICAgICAgIGJlYXJpbmdcbiAgICAgICAgfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm90YXRlcyB0aGUgbWFwIHNvIHRoYXQgbm9ydGggaXMgdXAgKDDCsCBiZWFyaW5nKSwgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0Vhc2luZ09wdGlvbnMgfCBudWxsfSBvcHRpb25zIE9wdGlvbnMgZGVzY3JpYmluZyB0aGUgZGVzdGluYXRpb24gYW5kIGFuaW1hdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKiAgICAgICAgICAgIEFjY2VwdHMge0BsaW5rIENhbWVyYU9wdGlvbnN9IGFuZCB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30uXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBudWxsfSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyByZXNldE5vcnRoIHdpdGggYW4gYW5pbWF0aW9uIG9mIDIgc2Vjb25kcy5cbiAgICAgKiBtYXAucmVzZXROb3J0aCh7ZHVyYXRpb246IDIwMDB9KTtcbiAgICAgKi9cbiAgICByZXNldE5vcnRoKG9wdGlvbnM/OiBFYXNpbmdPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5yb3RhdGVUbygwLCBleHRlbmQoe2R1cmF0aW9uOiAxMDAwfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZXMgYW5kIHBpdGNoZXMgdGhlIG1hcCBzbyB0aGF0IG5vcnRoIGlzIHVwICgwwrAgYmVhcmluZykgYW5kIHBpdGNoIGlzIDDCsCwgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0Vhc2luZ09wdGlvbnMgfCBudWxsfSBvcHRpb25zIE9wdGlvbnMgZGVzY3JpYmluZyB0aGUgZGVzdGluYXRpb24gYW5kIGFuaW1hdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKiAgICAgICAgICAgIEFjY2VwdHMge0BsaW5rIENhbWVyYU9wdGlvbnN9IGFuZCB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30uXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBudWxsfSBldmVudERhdGEgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIGV2ZW50IG9iamVjdHMgb2YgZXZlbnRzIHRyaWdnZXJlZCBieSB0aGlzIG1ldGhvZC5cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyByZXNldE5vcnRoUGl0Y2ggd2l0aCBhbiBhbmltYXRpb24gb2YgMiBzZWNvbmRzLlxuICAgICAqIG1hcC5yZXNldE5vcnRoUGl0Y2goe2R1cmF0aW9uOiAyMDAwfSk7XG4gICAgICovXG4gICAgcmVzZXROb3J0aFBpdGNoKG9wdGlvbnM/OiBFYXNpbmdPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5lYXNlVG8oZXh0ZW5kKHtcbiAgICAgICAgICAgIGJlYXJpbmc6IDAsXG4gICAgICAgICAgICBwaXRjaDogMCxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwXG4gICAgICAgIH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTbmFwcyB0aGUgbWFwIHNvIHRoYXQgbm9ydGggaXMgdXAgKDDCsCBiZWFyaW5nKSwgaWYgdGhlIGN1cnJlbnQgYmVhcmluZyBpc1xuICAgICAqIGNsb3NlIGVub3VnaCB0byBpdCAod2l0aGluIHRoZSBgYmVhcmluZ1NuYXBgIHRocmVzaG9sZCkuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7RWFzaW5nT3B0aW9ucyB8IG51bGx9IG9wdGlvbnMgT3B0aW9ucyBkZXNjcmliaW5nIHRoZSBkZXN0aW5hdGlvbiBhbmQgYW5pbWF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLlxuICAgICAqICAgICAgICAgICAgQWNjZXB0cyB7QGxpbmsgQ2FtZXJhT3B0aW9uc30gYW5kIHtAbGluayBBbmltYXRpb25PcHRpb25zfS5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHNuYXBUb05vcnRoIHdpdGggYW4gYW5pbWF0aW9uIG9mIDIgc2Vjb25kcy5cbiAgICAgKiBtYXAuc25hcFRvTm9ydGgoe2R1cmF0aW9uOiAyMDAwfSk7XG4gICAgICovXG4gICAgc25hcFRvTm9ydGgob3B0aW9ucz86IEVhc2luZ09wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCk6IHRoaXMge1xuICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5nZXRCZWFyaW5nKCkpIDwgdGhpcy5fYmVhcmluZ1NuYXApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2V0Tm9ydGgob3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjdXJyZW50IFtwaXRjaF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEvKSAodGlsdCkuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBtYXAncyBjdXJyZW50IHBpdGNoLCBtZWFzdXJlZCBpbiBkZWdyZWVzIGF3YXkgZnJvbSB0aGUgcGxhbmUgb2YgdGhlIHNjcmVlbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHBpdGNoID0gbWFwLmdldFBpdGNoKCk7XG4gICAgICovXG4gICAgZ2V0UGl0Y2goKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBpdGNoOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAncyBbcGl0Y2hdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3NhcnkvY2FtZXJhLykgKHRpbHQpLiBFcXVpdmFsZW50IHRvIGBqdW1wVG8oe3BpdGNoOiBwaXRjaH0pYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBpdGNoIFRoZSBwaXRjaCB0byBzZXQsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuICgwLTYwKS5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6cGl0Y2hzdGFydFxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIHNldFBpdGNoIHdpdGggYW4gYW5pbWF0aW9uIG9mIDIgc2Vjb25kcy5cbiAgICAgKiBtYXAuc2V0UGl0Y2goODAsIHtkdXJhdGlvbjogMjAwMH0pO1xuICAgICAqL1xuICAgIHNldFBpdGNoKHBpdGNoOiBudW1iZXIsIGV2ZW50RGF0YT86IE9iamVjdCk6IHRoaXMge1xuICAgICAgICB0aGlzLmp1bXBUbyh7cGl0Y2h9LCBldmVudERhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIENhbWVyYU9wdGlvbnN9IG9iamVjdCBmb3IgdGhlIGhpZ2hlc3Qgem9vbSBsZXZlbFxuICAgICAqIHVwIHRvIGFuZCBpbmNsdWRpbmcgYE1hcCNnZXRNYXhab29tKClgIHRoYXQgZml0cyB0aGUgYm91bmRzXG4gICAgICogaW4gdGhlIHZpZXdwb3J0IGF0IHRoZSBzcGVjaWZpZWQgYmVhcmluZy5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzbid0IHN1cHBvcnRlZCB3aXRoIGdsb2JlIHByb2plY3Rpb24uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzTGlrZX0gYm91bmRzIENhbGN1bGF0ZSB0aGUgY2VudGVyIGZvciB0aGVzZSBib3VuZHMgaW4gdGhlIHZpZXdwb3J0IGFuZCB1c2VcbiAgICAgKiAgICAgIHRoZSBoaWdoZXN0IHpvb20gbGV2ZWwgdXAgdG8gYW5kIGluY2x1ZGluZyBgTWFwI2dldE1heFpvb20oKWAgdGhhdCBmaXRzXG4gICAgICogICAgICBpbiB0aGUgdmlld3BvcnQuIExuZ0xhdEJvdW5kcyByZXByZXNlbnQgYSBib3ggdGhhdCBpcyBhbHdheXMgYXhpcy1hbGlnbmVkIHdpdGggYmVhcmluZyAwLlxuICAgICAqIEBwYXJhbSB7Q2FtZXJhT3B0aW9ucyB8IG51bGx9IG9wdGlvbnMgT3B0aW9ucyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBQYWRkaW5nT3B0aW9uc30gW29wdGlvbnMucGFkZGluZ10gVGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIHBpeGVscyB0byBhZGQgdG8gdGhlIGdpdmVuIGJvdW5kcy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmVhcmluZz0wXSBEZXNpcmVkIG1hcCBiZWFyaW5nIGF0IGVuZCBvZiBhbmltYXRpb24sIGluIGRlZ3JlZXMuXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IFtvcHRpb25zLm9mZnNldD1bMCwgMF1dIFRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIGJvdW5kcyByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgY2VudGVyLCBtZWFzdXJlZCBpbiBwaXhlbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFpvb21dIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgdG8gYWxsb3cgd2hlbiB0aGUgY2FtZXJhIHdvdWxkIHRyYW5zaXRpb24gdG8gdGhlIHNwZWNpZmllZCBib3VuZHMuXG4gICAgICogQHJldHVybnMge0NhbWVyYU9wdGlvbnMgfCB2b2lkfSBJZiBtYXAgaXMgYWJsZSB0byBmaXQgdG8gcHJvdmlkZWQgYm91bmRzLCByZXR1cm5zIGBDYW1lcmFPcHRpb25zYCB3aXRoXG4gICAgICogICAgICBgY2VudGVyYCwgYHpvb21gLCBhbmQgYGJlYXJpbmdgLiBJZiBtYXAgaXMgdW5hYmxlIHRvIGZpdCwgbWV0aG9kIHdpbGwgd2FybiBhbmQgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGJib3ggPSBbWy03OSwgNDNdLCBbLTczLCA0NV1dO1xuICAgICAqIGNvbnN0IG5ld0NhbWVyYVRyYW5zZm9ybSA9IG1hcC5jYW1lcmFGb3JCb3VuZHMoYmJveCwge1xuICAgICAqICAgICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XG4gICAgICogfSk7XG4gICAgICovXG4gICAgY2FtZXJhRm9yQm91bmRzKGJvdW5kczogTG5nTGF0Qm91bmRzTGlrZSwgb3B0aW9ucz86IENhbWVyYU9wdGlvbnMpOiA/RWFzaW5nT3B0aW9ucyB7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKCdHbG9iZSBwcm9qZWN0aW9uIGRvZXMgbm90IHN1cHBvcnQgY2FtZXJhRm9yQm91bmRzIEFQSSwgdGhpcyBBUEkgbWF5IGJlaGF2ZSB1bmV4cGVjdGVkbHkuXCInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJvdW5kcyA9IExuZ0xhdEJvdW5kcy5jb252ZXJ0KGJvdW5kcyk7XG4gICAgICAgIGNvbnN0IGJlYXJpbmcgPSAob3B0aW9ucyAmJiBvcHRpb25zLmJlYXJpbmcpIHx8IDA7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW1lcmFGb3JCb3hBbmRCZWFyaW5nKGJvdW5kcy5nZXROb3J0aFdlc3QoKSwgYm91bmRzLmdldFNvdXRoRWFzdCgpLCBiZWFyaW5nLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBfZXh0ZW5kQ2FtZXJhT3B0aW9ucyhvcHRpb25zPzogQ2FtZXJhT3B0aW9ucyk6IEZ1bGxDYW1lcmFPcHRpb25zIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFBhZGRpbmcgPSB7XG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgIGxlZnQ6IDBcbiAgICAgICAgfTtcbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgICAgICAgICBwYWRkaW5nOiBkZWZhdWx0UGFkZGluZyxcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy50cmFuc2Zvcm0ubWF4Wm9vbVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMucGFkZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSBvcHRpb25zLnBhZGRpbmc7XG4gICAgICAgICAgICBvcHRpb25zLnBhZGRpbmcgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiBwLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogcCxcbiAgICAgICAgICAgICAgICByaWdodDogcCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBwXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMucGFkZGluZyA9IGV4dGVuZChkZWZhdWx0UGFkZGluZywgb3B0aW9ucy5wYWRkaW5nKTtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIHRoZSBjZW50ZXIgb2YgdGhlc2UgdHdvIHBvaW50cyBpbiB0aGUgdmlld3BvcnQgYW5kIHVzZVxuICAgICAqIHRoZSBoaWdoZXN0IHpvb20gbGV2ZWwgdXAgdG8gYW5kIGluY2x1ZGluZyBgTWFwI2dldE1heFpvb20oKWAgdGhhdCBmaXRzXG4gICAgICogdGhlIHBvaW50cyBpbiB0aGUgdmlld3BvcnQgYXQgdGhlIHNwZWNpZmllZCBiZWFyaW5nLlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBwMCBGaXJzdCBwb2ludFxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gcDEgU2Vjb25kIHBvaW50XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgRGVzaXJlZCBtYXAgYmVhcmluZyBhdCBlbmQgb2YgYW5pbWF0aW9uLCBpbiBkZWdyZWVzXG4gICAgICogQHBhcmFtIHtDYW1lcmFPcHRpb25zIHwgbnVsbH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUGFkZGluZ09wdGlvbnN9IFtvcHRpb25zLnBhZGRpbmddIFRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgdG8gYWRkIHRvIHRoZSBnaXZlbiBib3VuZHMuXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IFtvcHRpb25zLm9mZnNldD1bMCwgMF1dIFRoZSBjZW50ZXIgb2YgdGhlIGdpdmVuIGJvdW5kcyByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgY2VudGVyLCBtZWFzdXJlZCBpbiBwaXhlbHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFpvb21dIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgdG8gYWxsb3cgd2hlbiB0aGUgY2FtZXJhIHdvdWxkIHRyYW5zaXRpb24gdG8gdGhlIHNwZWNpZmllZCBib3VuZHMuXG4gICAgICogQHJldHVybnMge0NhbWVyYU9wdGlvbnMgfCB2b2lkfSBJZiBtYXAgaXMgYWJsZSB0byBmaXQgdG8gcHJvdmlkZWQgYm91bmRzLCByZXR1cm5zIGBDYW1lcmFPcHRpb25zYCB3aXRoXG4gICAgICogICAgICBgY2VudGVyYCwgYHpvb21gLCBhbmQgYGJlYXJpbmdgLiBJZiBtYXAgaXMgdW5hYmxlIHRvIGZpdCwgbWV0aG9kIHdpbGwgd2FybiBhbmQgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIHAwID0gWy03OSwgNDNdO1xuICAgICAqIHZhciBwMSA9IFstNzMsIDQ1XTtcbiAgICAgKiB2YXIgYmVhcmluZyA9IDkwO1xuICAgICAqIHZhciBuZXdDYW1lcmFUcmFuc2Zvcm0gPSBtYXAuX2NhbWVyYUZvckJveEFuZEJlYXJpbmcocDAsIHAxLCBiZWFyaW5nLCB7XG4gICAgICogICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XG4gICAgICogfSk7XG4gICAgICovXG4gICAgX2NhbWVyYUZvckJveEFuZEJlYXJpbmcocDA6IExuZ0xhdExpa2UsIHAxOiBMbmdMYXRMaWtlLCBiZWFyaW5nOiBudW1iZXIsIG9wdGlvbnM/OiBDYW1lcmFPcHRpb25zKTogP0Vhc2luZ09wdGlvbnMge1xuICAgICAgICBjb25zdCBlT3B0aW9ucyA9IHRoaXMuX2V4dGVuZENhbWVyYU9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm07XG4gICAgICAgIGNvbnN0IGVkZ2VQYWRkaW5nID0gdHIucGFkZGluZztcblxuICAgICAgICAvLyBXZSB3YW50IHRvIGNhbGN1bGF0ZSB0aGUgY29ybmVycyBvZiB0aGUgYm94IGRlZmluZWQgYnkgcDAgYW5kIHAxIGluIGEgY29vcmRpbmF0ZSBzeXN0ZW1cbiAgICAgICAgLy8gcm90YXRlZCB0byBtYXRjaCB0aGUgZGVzdGluYXRpb24gYmVhcmluZy4gQWxsIGZvdXIgY29ybmVycyBvZiB0aGUgYm94IG11c3QgYmUgdGFrZW5cbiAgICAgICAgLy8gaW50byBhY2NvdW50IGJlY2F1c2Ugb2YgY2FtZXJhIHJvdGF0aW9uLlxuICAgICAgICBjb25zdCBwMHdvcmxkID0gdHIucHJvamVjdChMbmdMYXQuY29udmVydChwMCkpO1xuICAgICAgICBjb25zdCBwMXdvcmxkID0gdHIucHJvamVjdChMbmdMYXQuY29udmVydChwMSkpO1xuICAgICAgICBjb25zdCBwMndvcmxkID0gbmV3IFBvaW50KHAwd29ybGQueCwgcDF3b3JsZC55KTtcbiAgICAgICAgY29uc3QgcDN3b3JsZCA9IG5ldyBQb2ludChwMXdvcmxkLngsIHAwd29ybGQueSk7XG5cbiAgICAgICAgY29uc3QgYW5nbGVSYWRpYW5zID0gLWRlZ1RvUmFkKGJlYXJpbmcpO1xuICAgICAgICBjb25zdCBwMHJvdGF0ZWQgPSBwMHdvcmxkLnJvdGF0ZShhbmdsZVJhZGlhbnMpO1xuICAgICAgICBjb25zdCBwMXJvdGF0ZWQgPSBwMXdvcmxkLnJvdGF0ZShhbmdsZVJhZGlhbnMpO1xuICAgICAgICBjb25zdCBwMnJvdGF0ZWQgPSBwMndvcmxkLnJvdGF0ZShhbmdsZVJhZGlhbnMpO1xuICAgICAgICBjb25zdCBwM3JvdGF0ZWQgPSBwM3dvcmxkLnJvdGF0ZShhbmdsZVJhZGlhbnMpO1xuXG4gICAgICAgIGNvbnN0IHVwcGVyUmlnaHQgPSBuZXcgUG9pbnQoXG4gICAgICAgICAgICBNYXRoLm1heChwMHJvdGF0ZWQueCwgcDFyb3RhdGVkLngsIHAycm90YXRlZC54LCBwM3JvdGF0ZWQueCksXG4gICAgICAgICAgICBNYXRoLm1heChwMHJvdGF0ZWQueSwgcDFyb3RhdGVkLnksIHAycm90YXRlZC55LCBwM3JvdGF0ZWQueSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbG93ZXJMZWZ0ID0gbmV3IFBvaW50KFxuICAgICAgICAgICAgTWF0aC5taW4ocDByb3RhdGVkLngsIHAxcm90YXRlZC54LCBwMnJvdGF0ZWQueCwgcDNyb3RhdGVkLngpLFxuICAgICAgICAgICAgTWF0aC5taW4ocDByb3RhdGVkLnksIHAxcm90YXRlZC55LCBwMnJvdGF0ZWQueSwgcDNyb3RhdGVkLnkpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHpvb206IGNvbnNpZGVyIHRoZSBvcmlnaW5hbCBiYm94IGFuZCBwYWRkaW5nLlxuICAgICAgICBjb25zdCBzaXplID0gdXBwZXJSaWdodC5zdWIobG93ZXJMZWZ0KTtcbiAgICAgICAgY29uc3Qgc2NhbGVYID0gKHRyLndpZHRoIC0gKChlZGdlUGFkZGluZy5sZWZ0IHx8IDApICsgKGVkZ2VQYWRkaW5nLnJpZ2h0IHx8IDApICsgZU9wdGlvbnMucGFkZGluZy5sZWZ0ICsgZU9wdGlvbnMucGFkZGluZy5yaWdodCkpIC8gc2l6ZS54O1xuICAgICAgICBjb25zdCBzY2FsZVkgPSAodHIuaGVpZ2h0IC0gKChlZGdlUGFkZGluZy50b3AgfHwgMCkgKyAoZWRnZVBhZGRpbmcuYm90dG9tIHx8IDApICsgZU9wdGlvbnMucGFkZGluZy50b3AgKyBlT3B0aW9ucy5wYWRkaW5nLmJvdHRvbSkpIC8gc2l6ZS55O1xuXG4gICAgICAgIGlmIChzY2FsZVkgPCAwIHx8IHNjYWxlWCA8IDApIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKFxuICAgICAgICAgICAgICAgICdNYXAgY2Fubm90IGZpdCB3aXRoaW4gY2FudmFzIHdpdGggdGhlIGdpdmVuIGJvdW5kcywgcGFkZGluZywgYW5kL29yIG9mZnNldC4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvb20gPSBNYXRoLm1pbih0ci5zY2FsZVpvb20odHIuc2NhbGUgKiBNYXRoLm1pbihzY2FsZVgsIHNjYWxlWSkpLCBlT3B0aW9ucy5tYXhab29tKTtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgY2VudGVyOiBhcHBseSB0aGUgem9vbSwgdGhlIGNvbmZpZ3VyZWQgb2Zmc2V0LCBhcyB3ZWxsIGFzIG9mZnNldCB0aGF0IGV4aXN0cyBhcyBhIHJlc3VsdCBvZiBwYWRkaW5nLlxuICAgICAgICBjb25zdCBvZmZzZXQgPSAodHlwZW9mIGVPcHRpb25zLm9mZnNldC54ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgZU9wdGlvbnMub2Zmc2V0LnkgPT09ICdudW1iZXInKSA/XG4gICAgICAgICAgICBuZXcgUG9pbnQoZU9wdGlvbnMub2Zmc2V0LngsIGVPcHRpb25zLm9mZnNldC55KSA6XG4gICAgICAgICAgICBQb2ludC5jb252ZXJ0KGVPcHRpb25zLm9mZnNldCk7XG5cbiAgICAgICAgY29uc3QgcGFkZGluZ09mZnNldFggPSAoZU9wdGlvbnMucGFkZGluZy5sZWZ0IC0gZU9wdGlvbnMucGFkZGluZy5yaWdodCkgLyAyO1xuICAgICAgICBjb25zdCBwYWRkaW5nT2Zmc2V0WSA9IChlT3B0aW9ucy5wYWRkaW5nLnRvcCAtIGVPcHRpb25zLnBhZGRpbmcuYm90dG9tKSAvIDI7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdPZmZzZXQgPSBuZXcgUG9pbnQocGFkZGluZ09mZnNldFgsIHBhZGRpbmdPZmZzZXRZKTtcbiAgICAgICAgY29uc3Qgcm90YXRlZFBhZGRpbmdPZmZzZXQgPSBwYWRkaW5nT2Zmc2V0LnJvdGF0ZShiZWFyaW5nICogTWF0aC5QSSAvIDE4MCk7XG4gICAgICAgIGNvbnN0IG9mZnNldEF0SW5pdGlhbFpvb20gPSBvZmZzZXQuYWRkKHJvdGF0ZWRQYWRkaW5nT2Zmc2V0KTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0QXRGaW5hbFpvb20gPSBvZmZzZXRBdEluaXRpYWxab29tLm11bHQodHIuc2NhbGUgLyB0ci56b29tU2NhbGUoem9vbSkpO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlciA9ICB0ci51bnByb2plY3QocDB3b3JsZC5hZGQocDF3b3JsZCkuZGl2KDIpLnN1YihvZmZzZXRBdEZpbmFsWm9vbSkpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjZW50ZXIsXG4gICAgICAgICAgICB6b29tLFxuICAgICAgICAgICAgYmVhcmluZ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBiZXN0IGNhbWVyYSBmaXQgZm9yIHR3byBnaXZlbiB2aWV3cG9ydCBwb2ludCBjb29yZGluYXRlcy5cbiAgICAgKiBUaGUgbWV0aG9kIHdpbGwgaXRlcmF0aXZlbHkgcmF5IG1hcmNoIHRvd2FyZHMgdGhlIHRhcmdldCBhbmQgc3RvcHNcbiAgICAgKiB3aGVuIGFueSBvZiB0aGUgZ2l2ZW4gaW5wdXQgcG9pbnRzIGNvbGxpZGVzIHdpdGggdGhlIHZpZXcgZnJ1c3R1bS5cbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gcDAgRmlyc3QgcG9pbnRcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IHAxIFNlY29uZCBwb2ludFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5BbHRpdHVkZSBPcHRpb25hbCBtaW4gYWx0aXR1ZGUgaW4gbWV0ZXJzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heEFsdGl0dWRlIE9wdGlvbmFsIG1heCBhbHRpdHVkZSBpbiBtZXRlcnNcbiAgICAgKiBAcGFyYW0ge0NhbWVyYU9wdGlvbnMgfCBudWxsfSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBQYWRkaW5nT3B0aW9uc30gW29wdGlvbnMucGFkZGluZ10gVGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIHBpeGVscyB0byBhZGQgdG8gdGhlIGdpdmVuIGJvdW5kcy5cbiAgICAgKiBAcmV0dXJucyB7Q2FtZXJhT3B0aW9ucyB8IHZvaWR9IElmIG1hcCBpcyBhYmxlIHRvIGZpdCB0byBwcm92aWRlZCBib3VuZHMsIHJldHVybnMgYENhbWVyYU9wdGlvbnNgIHdpdGhcbiAgICAgKiAgICAgIGBjZW50ZXJgLCBgem9vbWAsIGBiZWFyaW5nYCBhbmQgYHBpdGNoYC4gSWYgbWFwIGlzIHVuYWJsZSB0byBmaXQsIG1ldGhvZCB3aWxsIHdhcm4gYW5kIHJldHVybiB1bmRlZmluZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfY2FtZXJhRm9yQm94KHAwOiBMbmdMYXRMaWtlLCBwMTogTG5nTGF0TGlrZSwgbWluQWx0aXR1ZGU/OiBudW1iZXIsIG1heEFsdGl0dWRlPzogbnVtYmVyLCBvcHRpb25zPzogQ2FtZXJhT3B0aW9ucyk6ID9FYXNpbmdPcHRpb25zIHtcbiAgICAgICAgY29uc3QgZU9wdGlvbnMgPSB0aGlzLl9leHRlbmRDYW1lcmFPcHRpb25zKG9wdGlvbnMpO1xuXG4gICAgICAgIG1pbkFsdGl0dWRlID0gbWluQWx0aXR1ZGUgfHwgMDtcbiAgICAgICAgbWF4QWx0aXR1ZGUgPSBtYXhBbHRpdHVkZSB8fCAwO1xuXG4gICAgICAgIHAwID0gTG5nTGF0LmNvbnZlcnQocDApO1xuICAgICAgICBwMSA9IExuZ0xhdC5jb252ZXJ0KHAxKTtcblxuICAgICAgICBjb25zdCB0ciA9IHRoaXMudHJhbnNmb3JtLmNsb25lKCk7XG4gICAgICAgIHRyLnBhZGRpbmcgPSBlT3B0aW9ucy5wYWRkaW5nO1xuXG4gICAgICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMuZ2V0RnJlZUNhbWVyYU9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgZm9jdXMgPSBuZXcgTG5nTGF0KChwMC5sbmcgKyBwMS5sbmcpICogMC41LCAocDAubGF0ICsgcDEubGF0KSAqIDAuNSk7XG4gICAgICAgIGNvbnN0IGZvY3VzQWx0aXR1ZGUgPSAobWluQWx0aXR1ZGUgKyBtYXhBbHRpdHVkZSkgKiAwLjU7XG5cbiAgICAgICAgaWYgKHRyLl9jYW1lcmEucG9zaXRpb25bMl0gPCBtZXJjYXRvclpmcm9tQWx0aXR1ZGUoZm9jdXNBbHRpdHVkZSwgZm9jdXMubGF0KSkge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ01hcCBjYW5ub3QgZml0IHdpdGhpbiBjYW52YXMgd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLCBwYWRkaW5nLCBhbmQvb3Igb2Zmc2V0LicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FtZXJhLmxvb2tBdFBvaW50KGZvY3VzKTtcblxuICAgICAgICB0ci5zZXRGcmVlQ2FtZXJhT3B0aW9ucyhjYW1lcmEpO1xuXG4gICAgICAgIGNvbnN0IGNvb3JkMCA9IE1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KHAwKTtcbiAgICAgICAgY29uc3QgY29vcmQxID0gTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQocDEpO1xuXG4gICAgICAgIGNvbnN0IHRvVmVjMyA9IChwOiBNZXJjYXRvckNvb3JkaW5hdGUpOiBWZWMzID0+IFtwLngsIHAueSwgcC56XTtcblxuICAgICAgICBjb25zdCBjZW50ZXJJbnRlcnNlY3Rpb25Qb2ludCA9IHRyLnBvaW50UmF5SW50ZXJzZWN0aW9uKHRyLmNlbnRlclBvaW50LCBmb2N1c0FsdGl0dWRlKTtcbiAgICAgICAgY29uc3QgY2VudGVySW50ZXJzZWN0aW9uQ29vcmQgPSB0b1ZlYzModHIucmF5SW50ZXJzZWN0aW9uQ29vcmRpbmF0ZShjZW50ZXJJbnRlcnNlY3Rpb25Qb2ludCkpO1xuICAgICAgICBjb25zdCBjZW50ZXJNZXJjYXRvclJheSA9IHRyLnNjcmVlblBvaW50VG9NZXJjYXRvclJheSh0ci5jZW50ZXJQb2ludCk7XG4gICAgICAgIGNvbnN0IHpJbk1ldGVycyA9IHRyLnByb2plY3Rpb24ubmFtZSAhPT0gJ2dsb2JlJztcblxuICAgICAgICBjb25zdCBtYXhNYXJjaGluZ1N0ZXBzID0gMTA7XG5cbiAgICAgICAgbGV0IHN0ZXBzID0gMDtcbiAgICAgICAgbGV0IGhhbGZEaXN0YW5jZVRvR3JvdW5kO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjb25zdCB6ID0gTWF0aC5mbG9vcih0ci56b29tKTtcbiAgICAgICAgICAgIGNvbnN0IHoyID0gMSA8PCB6O1xuXG4gICAgICAgICAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oejIgKiBjb29yZDAueCwgejIgKiBjb29yZDEueCk7XG4gICAgICAgICAgICBjb25zdCBtaW5ZID0gTWF0aC5taW4oejIgKiBjb29yZDAueSwgejIgKiBjb29yZDEueSk7XG4gICAgICAgICAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoejIgKiBjb29yZDAueCwgejIgKiBjb29yZDEueCk7XG4gICAgICAgICAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgoejIgKiBjb29yZDAueSwgejIgKiBjb29yZDEueSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFhYmIgPSBuZXcgQWFiYihbbWluWCwgbWluWSwgbWluQWx0aXR1ZGVdLCBbbWF4WCwgbWF4WSwgbWF4QWx0aXR1ZGVdKTtcblxuICAgICAgICAgICAgY29uc3QgZnJ1c3R1bSA9IEZydXN0dW0uZnJvbUludlByb2plY3Rpb25NYXRyaXgodHIuaW52UHJvak1hdHJpeCwgdHIud29ybGRTaXplLCB6LCB6SW5NZXRlcnMpO1xuXG4gICAgICAgICAgICAvLyBTdG9wIG1hcmNoaW5nIHdoZW4gZnJ1c3R1bSBpbnRlcnNlY3Rpb25cbiAgICAgICAgICAgIC8vIHJlcG9ydHMgYW55IGFhYmIgcG9pbnQgbm90IGZ1bGx5IGluc2lkZVxuICAgICAgICAgICAgaWYgKGFhYmIuaW50ZXJzZWN0cyhmcnVzdHVtKSAhPT0gMikge1xuICAgICAgICAgICAgICAgIC8vIFdlbnQgdG9vIGZhciwgc3RlcCBvbmUgaXRlcmF0aW9uIGJhY2tcbiAgICAgICAgICAgICAgICBpZiAoaGFsZkRpc3RhbmNlVG9Hcm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHIuX2NhbWVyYS5wb3NpdGlvbiA9IHZlYzMuc2NhbGVBbmRBZGQoW10sIHRyLl9jYW1lcmEucG9zaXRpb24sIGNlbnRlck1lcmNhdG9yUmF5LmRpciwgLWhhbGZEaXN0YW5jZVRvR3JvdW5kKTtcbiAgICAgICAgICAgICAgICAgICAgdHIuX3VwZGF0ZVN0YXRlRnJvbUNhbWVyYSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY2FtZXJhUG9zaXRpb25Ub0dyb3VuZCA9IHZlYzMuc3ViKFtdLCB0ci5fY2FtZXJhLnBvc2l0aW9uLCBjZW50ZXJJbnRlcnNlY3Rpb25Db29yZCk7XG4gICAgICAgICAgICBoYWxmRGlzdGFuY2VUb0dyb3VuZCA9IDAuNSAqIHZlYzMubGVuZ3RoKGNhbWVyYVBvc2l0aW9uVG9Hcm91bmQpO1xuXG4gICAgICAgICAgICAvLyBNYXJjaCB0aGUgY2FtZXJhIHBvc2l0aW9uIGZvcndhcmQgYnkgaGFsZiB0aGUgZGlzdGFuY2UgdG8gdGhlIGdyb3VuZFxuICAgICAgICAgICAgdHIuX2NhbWVyYS5wb3NpdGlvbiA9IHZlYzMuc2NhbGVBbmRBZGQoW10sIHRyLl9jYW1lcmEucG9zaXRpb24sIGNlbnRlck1lcmNhdG9yUmF5LmRpciwgaGFsZkRpc3RhbmNlVG9Hcm91bmQpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0ci5fdXBkYXRlU3RhdGVGcm9tQ2FtZXJhKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgd2Fybk9uY2UoJ01hcCBjYW5ub3QgZml0IHdpdGhpbiBjYW52YXMgd2l0aCB0aGUgZ2l2ZW4gYm91bmRzLCBwYWRkaW5nLCBhbmQvb3Igb2Zmc2V0LicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoKytzdGVwcyA8IG1heE1hcmNoaW5nU3RlcHMpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjZW50ZXI6IHRyLmNlbnRlcixcbiAgICAgICAgICAgIHpvb206IHRyLnpvb20sXG4gICAgICAgICAgICBiZWFyaW5nOiB0ci5iZWFyaW5nLFxuICAgICAgICAgICAgcGl0Y2g6IHRyLnBpdGNoXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFucyBhbmQgem9vbXMgdGhlIG1hcCB0byBjb250YWluIGl0cyB2aXNpYmxlIGFyZWEgd2l0aGluIHRoZSBzcGVjaWZpZWQgZ2VvZ3JhcGhpY2FsIGJvdW5kcy5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyByZXNldCB0aGUgbWFwJ3MgYmVhcmluZyB0byAwIGlmIGJlYXJpbmcgaXMgbm9uemVyby5cbiAgICAgKiBJZiBhIHBhZGRpbmcgaXMgc2V0IG9uIHRoZSBtYXAsIHRoZSBib3VuZHMgYXJlIGZpdCB0byB0aGUgaW5zZXQuXG4gICAgICogVGhpcyBmdW5jdGlvbiBpc24ndCBzdXBwb3J0ZWQgd2l0aCBnbG9iZSBwcm9qZWN0aW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IGJvdW5kcyBDZW50ZXIgdGhlc2UgYm91bmRzIGluIHRoZSB2aWV3cG9ydCBhbmQgdXNlIHRoZSBoaWdoZXN0XG4gICAgICogICAgICB6b29tIGxldmVsIHVwIHRvIGFuZCBpbmNsdWRpbmcgYE1hcCNnZXRNYXhab29tKClgIHRoYXQgZml0cyB0aGVtIGluIHRoZSB2aWV3cG9ydC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgc3VwcG9ydHMgYWxsIHByb3BlcnRpZXMgZnJvbSB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30gYW5kIHtAbGluayBDYW1lcmFPcHRpb25zfSBpbiBhZGRpdGlvbiB0byB0aGUgZmllbGRzIGJlbG93LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUGFkZGluZ09wdGlvbnN9IFtvcHRpb25zLnBhZGRpbmddIFRoZSBhbW91bnQgb2YgcGFkZGluZyBpbiBwaXhlbHMgdG8gYWRkIHRvIHRoZSBnaXZlbiBib3VuZHMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5saW5lYXI9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCB0cmFuc2l0aW9ucyB1c2luZ1xuICAgICAqICAgICB7QGxpbmsgTWFwI2Vhc2VUb30uIElmIGBmYWxzZWAsIHRoZSBtYXAgdHJhbnNpdGlvbnMgdXNpbmcge0BsaW5rIE1hcCNmbHlUb30uIFNlZVxuICAgICAqICAgICB0aG9zZSBmdW5jdGlvbnMgYW5kIHtAbGluayBBbmltYXRpb25PcHRpb25zfSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9ucyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZWFzaW5nXSBBbiBlYXNpbmcgZnVuY3Rpb24gZm9yIHRoZSBhbmltYXRlZCB0cmFuc2l0aW9uLiBTZWUge0BsaW5rIEFuaW1hdGlvbk9wdGlvbnN9LlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBbb3B0aW9ucy5vZmZzZXQ9WzAsIDBdXSBUaGUgY2VudGVyIG9mIHRoZSBnaXZlbiBib3VuZHMgcmVsYXRpdmUgdG8gdGhlIG1hcCdzIGNlbnRlciwgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tXSBUaGUgbWF4aW11bSB6b29tIGxldmVsIHRvIGFsbG93IHdoZW4gdGhlIG1hcCB2aWV3IHRyYW5zaXRpb25zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGJib3ggPSBbWy03OSwgNDNdLCBbLTczLCA0NV1dO1xuICAgICAqIG1hcC5maXRCb3VuZHMoYmJveCwge1xuICAgICAqICAgICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogRml0IGEgbWFwIHRvIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpdGJvdW5kcy8pXG4gICAgICovXG4gICAgZml0Qm91bmRzKGJvdW5kczogTG5nTGF0Qm91bmRzTGlrZSwgb3B0aW9ucz86IEVhc2luZ09wdGlvbnMsIGV2ZW50RGF0YT86IE9iamVjdCk6IHRoaXMge1xuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICB3YXJuT25jZSgnR2xvYmUgcHJvamVjdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGZpdEJvdW5kcyBBUEksIHRoaXMgQVBJIG1heSBiZWhhdmUgdW5leHBlY3RlZGx5LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpdEludGVybmFsKFxuICAgICAgICAgICAgdGhpcy5jYW1lcmFGb3JCb3VuZHMoYm91bmRzLCBvcHRpb25zKSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBldmVudERhdGEpO1xuICAgIH1cblxuICAgIF9yYXljYXN0RWxldmF0aW9uQm94KHBvaW50MDogUG9pbnQsIHBvaW50MTogUG9pbnQpOiA/RWxldmF0aW9uQm94UmF5Y2FzdCB7XG4gICAgICAgIGNvbnN0IGVsZXZhdGlvbiA9IHRoaXMudHJhbnNmb3JtLmVsZXZhdGlvbjtcblxuICAgICAgICBpZiAoIWVsZXZhdGlvbikgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBvaW50MiA9IG5ldyBQb2ludChwb2ludDAueCwgcG9pbnQxLnkpO1xuICAgICAgICBjb25zdCBwb2ludDMgPSBuZXcgUG9pbnQocG9pbnQxLngsIHBvaW50MC55KTtcblxuICAgICAgICBjb25zdCByMCA9IGVsZXZhdGlvbi5wb2ludENvb3JkaW5hdGUocG9pbnQwKTtcbiAgICAgICAgaWYgKCFyMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCByMSA9IGVsZXZhdGlvbi5wb2ludENvb3JkaW5hdGUocG9pbnQxKTtcbiAgICAgICAgaWYgKCFyMSkgcmV0dXJuO1xuICAgICAgICBjb25zdCByMiA9IGVsZXZhdGlvbi5wb2ludENvb3JkaW5hdGUocG9pbnQyKTtcbiAgICAgICAgaWYgKCFyMikgcmV0dXJuO1xuICAgICAgICBjb25zdCByMyA9IGVsZXZhdGlvbi5wb2ludENvb3JkaW5hdGUocG9pbnQzKTtcbiAgICAgICAgaWYgKCFyMykgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG0wID0gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShyMFswXSwgcjBbMV0pLnRvTG5nTGF0KCk7XG4gICAgICAgIGNvbnN0IG0xID0gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShyMVswXSwgcjFbMV0pLnRvTG5nTGF0KCk7XG4gICAgICAgIGNvbnN0IG0yID0gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShyMlswXSwgcjJbMV0pLnRvTG5nTGF0KCk7XG4gICAgICAgIGNvbnN0IG0zID0gbmV3IE1lcmNhdG9yQ29vcmRpbmF0ZShyM1swXSwgcjNbMV0pLnRvTG5nTGF0KCk7XG5cbiAgICAgICAgY29uc3QgbWluTG5nID0gTWF0aC5taW4obTAubG5nLCBNYXRoLm1pbihtMS5sbmcsIE1hdGgubWluKG0yLmxuZywgbTMubG5nKSkpO1xuICAgICAgICBjb25zdCBtaW5MYXQgPSBNYXRoLm1pbihtMC5sYXQsIE1hdGgubWluKG0xLmxhdCwgTWF0aC5taW4obTIubGF0LCBtMy5sYXQpKSk7XG5cbiAgICAgICAgY29uc3QgbWF4TG5nID0gTWF0aC5tYXgobTAubG5nLCBNYXRoLm1heChtMS5sbmcsIE1hdGgubWF4KG0yLmxuZywgbTMubG5nKSkpO1xuICAgICAgICBjb25zdCBtYXhMYXQgPSBNYXRoLm1heChtMC5sYXQsIE1hdGgubWF4KG0xLmxhdCwgTWF0aC5tYXgobTIubGF0LCBtMy5sYXQpKSk7XG5cbiAgICAgICAgY29uc3QgbWluQWx0aXR1ZGUgPSBNYXRoLm1pbihyMFszXSwgTWF0aC5taW4ocjFbM10sIE1hdGgubWluKHIyWzNdLCByM1szXSkpKTtcbiAgICAgICAgY29uc3QgbWF4QWx0aXR1ZGUgPSBNYXRoLm1heChyMFszXSwgTWF0aC5tYXgocjFbM10sIE1hdGgubWF4KHIyWzNdLCByM1szXSkpKTtcblxuICAgICAgICBjb25zdCBtaW5MbmdMYXQgPSBuZXcgTG5nTGF0KG1pbkxuZywgbWluTGF0KTtcbiAgICAgICAgY29uc3QgbWF4TG5nTGF0ID0gbmV3IExuZ0xhdChtYXhMbmcsIG1heExhdCk7XG5cbiAgICAgICAgcmV0dXJuIHttaW5MbmdMYXQsIG1heExuZ0xhdCwgbWluQWx0aXR1ZGUsIG1heEFsdGl0dWRlfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYW5zLCByb3RhdGVzIGFuZCB6b29tcyB0aGUgbWFwIHRvIHRvIGZpdCB0aGUgYm94IG1hZGUgYnkgcG9pbnRzIHAwIGFuZCBwMVxuICAgICAqIG9uY2UgdGhlIG1hcCBpcyByb3RhdGVkIHRvIHRoZSBzcGVjaWZpZWQgYmVhcmluZy4gVG8gem9vbSB3aXRob3V0IHJvdGF0aW5nLFxuICAgICAqIHBhc3MgaW4gdGhlIGN1cnJlbnQgbWFwIGJlYXJpbmcuXG4gICAgICogVGhpcyBmdW5jdGlvbiBpc24ndCBzdXBwb3J0ZWQgd2l0aCBnbG9iZSBwcm9qZWN0aW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gcDAgRmlyc3QgcG9pbnQgb24gc2NyZWVuLCBpbiBwaXhlbCBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gcDEgU2Vjb25kIHBvaW50IG9uIHNjcmVlbiwgaW4gcGl4ZWwgY29vcmRpbmF0ZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgRGVzaXJlZCBtYXAgYmVhcmluZyBhdCBlbmQgb2YgYW5pbWF0aW9uLCBpbiBkZWdyZWVzLiBUaGlzIHZhbHVlIGlzIGlnbm9yZWQgaWYgdGhlIG1hcCBoYXMgbm9uLXplcm8gcGl0Y2guXG4gICAgICogQHBhcmFtIHtDYW1lcmFPcHRpb25zIHwgbnVsbH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlciB8IFBhZGRpbmdPcHRpb25zfSBbb3B0aW9ucy5wYWRkaW5nXSBUaGUgYW1vdW50IG9mIHBhZGRpbmcgaW4gcGl4ZWxzIHRvIGFkZCB0byB0aGUgZ2l2ZW4gYm91bmRzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGluZWFyPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZSBtYXAgdHJhbnNpdGlvbnMgdXNpbmdcbiAgICAgKiAgICAge0BsaW5rIE1hcCNlYXNlVG99LiBJZiBgZmFsc2VgLCB0aGUgbWFwIHRyYW5zaXRpb25zIHVzaW5nIHtAbGluayBNYXAjZmx5VG99LiBTZWVcbiAgICAgKiAgICAgdGhvc2UgZnVuY3Rpb25zIGFuZCB7QGxpbmsgQW5pbWF0aW9uT3B0aW9uc30gZm9yIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmVhc2luZ10gQW4gZWFzaW5nIGZ1bmN0aW9uIGZvciB0aGUgYW5pbWF0ZWQgdHJhbnNpdGlvbi4gU2VlIHtAbGluayBBbmltYXRpb25PcHRpb25zfS5cbiAgICAgKiBAcGFyYW0ge1BvaW50TGlrZX0gW29wdGlvbnMub2Zmc2V0PVswLCAwXV0gVGhlIGNlbnRlciBvZiB0aGUgZ2l2ZW4gYm91bmRzIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBjZW50ZXIsIG1lYXN1cmVkIGluIHBpeGVscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4Wm9vbV0gVGhlIG1heGltdW0gem9vbSBsZXZlbCB0byBhbGxvdyB3aGVuIHRoZSBtYXAgdmlldyB0cmFuc2l0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDptb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHAwID0gWzIyMCwgNDAwXTtcbiAgICAgKiBjb25zdCBwMSA9IFs1MDAsIDkwMF07XG4gICAgICogbWFwLmZpdFNjcmVlbkNvb3JkaW5hdGVzKHAwLCBwMSwgbWFwLmdldEJlYXJpbmcoKSwge1xuICAgICAqICAgICBwYWRkaW5nOiB7dG9wOiAxMCwgYm90dG9tOjI1LCBsZWZ0OiAxNSwgcmlnaHQ6IDV9XG4gICAgICogfSk7XG4gICAgICogQHNlZSBVc2VkIGJ5IHtAbGluayBCb3hab29tSGFuZGxlcn1cbiAgICAgKi9cbiAgICBmaXRTY3JlZW5Db29yZGluYXRlcyhwMDogUG9pbnRMaWtlLCBwMTogUG9pbnRMaWtlLCBiZWFyaW5nOiBudW1iZXIsIG9wdGlvbnM/OiBFYXNpbmdPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpOiB0aGlzIHtcbiAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJykge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ0dsb2JlIHByb2plY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBmaXRTY3JlZW5Db29yZGluYXRlcyBBUEksIHRoaXMgQVBJIG1heSBiZWhhdmUgdW5leHBlY3RlZGx5LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxuZ0xhdDAsIGxuZ0xhdDEsIG1pbkFsdGl0dWRlLCBtYXhBbHRpdHVkZTtcbiAgICAgICAgY29uc3QgcG9pbnQwID0gUG9pbnQuY29udmVydChwMCk7XG4gICAgICAgIGNvbnN0IHBvaW50MSA9IFBvaW50LmNvbnZlcnQocDEpO1xuXG4gICAgICAgIGNvbnN0IHJheWNhc3QgPSB0aGlzLl9yYXljYXN0RWxldmF0aW9uQm94KHBvaW50MCwgcG9pbnQxKTtcblxuICAgICAgICBpZiAoIXJheWNhc3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybS5hbnlDb3JuZXJPZmZFZGdlKHBvaW50MCwgcG9pbnQxKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsbmdMYXQwID0gdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihwb2ludDApO1xuICAgICAgICAgICAgbG5nTGF0MSA9IHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24ocG9pbnQxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxuZ0xhdDAgPSByYXljYXN0Lm1pbkxuZ0xhdDtcbiAgICAgICAgICAgIGxuZ0xhdDEgPSByYXljYXN0Lm1heExuZ0xhdDtcbiAgICAgICAgICAgIG1pbkFsdGl0dWRlID0gcmF5Y2FzdC5taW5BbHRpdHVkZTtcbiAgICAgICAgICAgIG1heEFsdGl0dWRlID0gcmF5Y2FzdC5tYXhBbHRpdHVkZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybS5waXRjaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpdEludGVybmFsKFxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbWVyYUZvckJveEFuZEJlYXJpbmcoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24oUG9pbnQuY29udmVydChwMCkpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKFBvaW50LmNvbnZlcnQocDEpKSxcbiAgICAgICAgICAgICAgICAgICAgYmVhcmluZyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICBldmVudERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpdEludGVybmFsKFxuICAgICAgICAgICAgdGhpcy5fY2FtZXJhRm9yQm94KFxuICAgICAgICAgICAgICAgIGxuZ0xhdDAsXG4gICAgICAgICAgICAgICAgbG5nTGF0MSxcbiAgICAgICAgICAgICAgICBtaW5BbHRpdHVkZSxcbiAgICAgICAgICAgICAgICBtYXhBbHRpdHVkZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zKSxcbiAgICAgICAgICAgIG9wdGlvbnMsIGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgX2ZpdEludGVybmFsKGNhbGN1bGF0ZWRPcHRpb25zPzogP0Vhc2luZ09wdGlvbnMsIG9wdGlvbnM/OiBFYXNpbmdPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpOiB0aGlzIHtcbiAgICAgICAgLy8gY2FtZXJhRm9yQm91bmRzIHdhcm5zICsgcmV0dXJucyB1bmRlZmluZWQgaWYgdW5hYmxlIHRvIGZpdDpcbiAgICAgICAgaWYgKCFjYWxjdWxhdGVkT3B0aW9ucykgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZChjYWxjdWxhdGVkT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgcmVtb3ZlIHRoZSBwYWRkaW5nIGZpZWxkIGJlY2F1c2UsIGNhbGN1bGF0ZWRPcHRpb25zIGFscmVhZHkgYWNjb3VudHMgZm9yIHBhZGRpbmcgYnkgc2V0dGluZyB6b29tIGFuZCBjZW50ZXIgYWNjb3JkaW5nbHkuXG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLnBhZGRpbmc7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubGluZWFyID9cbiAgICAgICAgICAgIHRoaXMuZWFzZVRvKG9wdGlvbnMsIGV2ZW50RGF0YSkgOlxuICAgICAgICAgICAgdGhpcy5mbHlUbyhvcHRpb25zLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW55IGNvbWJpbmF0aW9uIG9mIGNlbnRlciwgem9vbSwgYmVhcmluZywgYW5kIHBpdGNoLCB3aXRob3V0XG4gICAgICogYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi4gVGhlIG1hcCB3aWxsIHJldGFpbiBpdHMgY3VycmVudCB2YWx1ZXMgZm9yIGFueVxuICAgICAqIGRldGFpbHMgbm90IHNwZWNpZmllZCBpbiBgb3B0aW9uc2AuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7Q2FtZXJhT3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnJvdGF0ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6cGl0Y2hcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21lbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIGp1bXAgdG8gY29vcmRpbmF0ZXMgYXQgY3VycmVudCB6b29tXG4gICAgICogbWFwLmp1bXBUbyh7Y2VudGVyOiBbMCwgMF19KTtcbiAgICAgKiAvLyBqdW1wIHdpdGggem9vbSwgcGl0Y2gsIGFuZCBiZWFyaW5nIG9wdGlvbnNcbiAgICAgKiBtYXAuanVtcFRvKHtcbiAgICAgKiAgICAgY2VudGVyOiBbMCwgMF0sXG4gICAgICogICAgIHpvb206IDgsXG4gICAgICogICAgIHBpdGNoOiA0NSxcbiAgICAgKiAgICAgYmVhcmluZzogOTBcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBKdW1wIHRvIGEgc2VyaWVzIG9mIGxvY2F0aW9uc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvanVtcC10by8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogVXBkYXRlIGEgZmVhdHVyZSBpbiByZWFsdGltZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbGl2ZS11cGRhdGUtZmVhdHVyZS8pXG4gICAgICovXG4gICAganVtcFRvKG9wdGlvbnM6IENhbWVyYU9wdGlvbnMgJiB7cHJlbG9hZE9ubHk/OiBib29sZWFufSwgZXZlbnREYXRhPzogT2JqZWN0KTogdGhpcyB7XG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIGNvbnN0IHRyID0gb3B0aW9ucy5wcmVsb2FkT25seSA/IHRoaXMudHJhbnNmb3JtLmNsb25lKCkgOiB0aGlzLnRyYW5zZm9ybTtcbiAgICAgICAgbGV0IHpvb21DaGFuZ2VkID0gZmFsc2UsXG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IGZhbHNlLFxuICAgICAgICAgICAgcGl0Y2hDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCd6b29tJyBpbiBvcHRpb25zICYmIHRyLnpvb20gIT09ICtvcHRpb25zLnpvb20pIHtcbiAgICAgICAgICAgIHpvb21DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyLnpvb20gPSArb3B0aW9ucy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuY2VudGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRyLmNlbnRlciA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuY2VudGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnYmVhcmluZycgaW4gb3B0aW9ucyAmJiB0ci5iZWFyaW5nICE9PSArb3B0aW9ucy5iZWFyaW5nKSB7XG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0ci5iZWFyaW5nID0gK29wdGlvbnMuYmVhcmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgncGl0Y2gnIGluIG9wdGlvbnMgJiYgdHIucGl0Y2ggIT09ICtvcHRpb25zLnBpdGNoKSB7XG4gICAgICAgICAgICBwaXRjaENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHIucGl0Y2ggPSArb3B0aW9ucy5waXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBhZGRpbmcgIT0gbnVsbCAmJiAhdHIuaXNQYWRkaW5nRXF1YWwob3B0aW9ucy5wYWRkaW5nKSkge1xuICAgICAgICAgICAgdHIucGFkZGluZyA9IG9wdGlvbnMucGFkZGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnByZWxvYWRPbmx5KSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVsb2FkVGlsZXModHIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3Zlc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdtb3ZlJywgZXZlbnREYXRhKSk7XG5cbiAgICAgICAgaWYgKHpvb21DaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd6b29tc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgnem9vbScsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCd6b29tZW5kJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmVhcmluZ0NoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZXN0YXJ0JywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZScsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdyb3RhdGVlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwaXRjaENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3BpdGNoc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2gnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2hlbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3ZlZW5kJywgZXZlbnREYXRhKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBwb3NpdGlvbiBhbmQgb3JpZW50YXRpb24gb2YgdGhlIGNhbWVyYSBlbnRpdHkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBwcm9qZWN0aW9ucyBvdGhlciB0aGFuIG1lcmNhdG9yLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcmV0dXJucyB7RnJlZUNhbWVyYU9wdGlvbnN9IFRoZSBjYW1lcmEgc3RhdGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBjYW1lcmEgPSBtYXAuZ2V0RnJlZUNhbWVyYU9wdGlvbnMoKTtcbiAgICAgKlxuICAgICAqIGNvbnN0IHBvc2l0aW9uID0gWzEzOC43MjY0OSwgMzUuMzM5NzRdO1xuICAgICAqIGNvbnN0IGFsdGl0dWRlID0gMzAwMDtcbiAgICAgKlxuICAgICAqIGNhbWVyYS5wb3NpdGlvbiA9IG1hcGJveGdsLk1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KHBvc2l0aW9uLCBhbHRpdHVkZSk7XG4gICAgICogY2FtZXJhLmxvb2tBdFBvaW50KFsxMzguNzMwMzYsIDM1LjM2MTk3XSk7XG4gICAgICpcbiAgICAgKiBtYXAuc2V0RnJlZUNhbWVyYU9wdGlvbnMoY2FtZXJhKTtcbiAgICAgKi9cbiAgICBnZXRGcmVlQ2FtZXJhT3B0aW9ucygpOiBGcmVlQ2FtZXJhT3B0aW9ucyB7XG4gICAgICAgIGlmICghdGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbi5zdXBwb3J0c0ZyZWVDYW1lcmEpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGZyZWVDYW1lcmFOb3RTdXBwb3J0ZWRXYXJuaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0uZ2V0RnJlZUNhbWVyYU9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgRnJlZUNhbWVyYU9wdGlvbnNgIHByb3ZpZGVzIG1vcmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBjYW1lcmEgZW50aXR5LlxuICAgICAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB0aGUgc3RhdGUgc2V0IHVzaW5nIHRoaXMgQVBJIG11c3QgYmUgcmVwcmVzZW50YWJsZSB3aXRoXG4gICAgICogYENhbWVyYU9wdGlvbnNgIGFzIHdlbGwuIFBhcmFtZXRlcnMgYXJlIGNsYW1wZWQgaW50byBhIHZhbGlkIHJhbmdlIG9yIGRpc2NhcmRlZCBhcyBpbnZhbGlkXG4gICAgICogaWYgdGhlIGNvbnZlcnNpb24gdG8gdGhlIHBpdGNoIGFuZCBiZWFyaW5nIHByZXNlbnRhdGlvbiBpcyBhbWJpZ3VvdXMuIEZvciBleGFtcGxlIG9yaWVudGF0aW9uXG4gICAgICogY2FuIGJlIGludmFsaWQgaWYgaXQgbGVhZHMgdG8gdGhlIGNhbWVyYSBiZWluZyB1cHNpZGUgZG93biwgdGhlIHF1YXRlcm5pb24gaGFzIHplcm8gbGVuZ3RoLFxuICAgICAqIG9yIHRoZSBwaXRjaCBpcyBvdmVyIHRoZSBtYXhpbXVtIHBpdGNoIGxpbWl0LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBmb3IgcHJvamVjdGlvbnMgb3RoZXIgdGhhbiBtZXJjYXRvci5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtGcmVlQ2FtZXJhT3B0aW9uc30gb3B0aW9ucyBgRnJlZUNhbWVyYU9wdGlvbnNgIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnJvdGF0ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6cGl0Y2hcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21lbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhbWVyYSA9IG1hcC5nZXRGcmVlQ2FtZXJhT3B0aW9ucygpO1xuICAgICAqXG4gICAgICogY29uc3QgcG9zaXRpb24gPSBbMTM4LjcyNjQ5LCAzNS4zMzk3NF07XG4gICAgICogY29uc3QgYWx0aXR1ZGUgPSAzMDAwO1xuICAgICAqXG4gICAgICogY2FtZXJhLnBvc2l0aW9uID0gbWFwYm94Z2wuTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQocG9zaXRpb24sIGFsdGl0dWRlKTtcbiAgICAgKiBjYW1lcmEubG9va0F0UG9pbnQoWzEzOC43MzAzNiwgMzUuMzYxOTddKTtcbiAgICAgKlxuICAgICAqIG1hcC5zZXRGcmVlQ2FtZXJhT3B0aW9ucyhjYW1lcmEpO1xuICAgICAqL1xuICAgIHNldEZyZWVDYW1lcmFPcHRpb25zKG9wdGlvbnM6IEZyZWVDYW1lcmFPcHRpb25zLCBldmVudERhdGE/OiBPYmplY3QpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybTtcblxuICAgICAgICBpZiAoIXRyLnByb2plY3Rpb24uc3VwcG9ydHNGcmVlQ2FtZXJhKSB7XG4gICAgICAgICAgICB3YXJuT25jZShmcmVlQ2FtZXJhTm90U3VwcG9ydGVkV2FybmluZyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RvcCgpO1xuXG4gICAgICAgIGNvbnN0IHByZXZab29tID0gdHIuem9vbTtcbiAgICAgICAgY29uc3QgcHJldlBpdGNoID0gdHIucGl0Y2g7XG4gICAgICAgIGNvbnN0IHByZXZCZWFyaW5nID0gdHIuYmVhcmluZztcblxuICAgICAgICB0ci5zZXRGcmVlQ2FtZXJhT3B0aW9ucyhvcHRpb25zKTtcblxuICAgICAgICBjb25zdCB6b29tQ2hhbmdlZCA9IHByZXZab29tICE9PSB0ci56b29tO1xuICAgICAgICBjb25zdCBwaXRjaENoYW5nZWQgPSBwcmV2UGl0Y2ggIT09IHRyLnBpdGNoO1xuICAgICAgICBjb25zdCBiZWFyaW5nQ2hhbmdlZCA9IHByZXZCZWFyaW5nICE9PSB0ci5iZWFyaW5nO1xuXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmVzdGFydCcsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ21vdmUnLCBldmVudERhdGEpKTtcblxuICAgICAgICBpZiAoem9vbUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3pvb21zdGFydCcsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCd6b29tJywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3pvb21lbmQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiZWFyaW5nQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncm90YXRlc3RhcnQnLCBldmVudERhdGEpKVxuICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncm90YXRlJywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZWVuZCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBpdGNoQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncGl0Y2hzdGFydCcsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdwaXRjaCcsIGV2ZW50RGF0YSkpXG4gICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdwaXRjaGVuZCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbW92ZWVuZCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFueSBjb21iaW5hdGlvbiBvZiBgY2VudGVyYCwgYHpvb21gLCBgYmVhcmluZ2AsIGBwaXRjaGAsIGFuZCBgcGFkZGluZ2Agd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uXG4gICAgICogYmV0d2VlbiBvbGQgYW5kIG5ldyB2YWx1ZXMuIFRoZSBtYXAgd2lsbCByZXRhaW4gaXRzIGN1cnJlbnQgdmFsdWVzIGZvciBhbnlcbiAgICAgKiBkZXRhaWxzIG5vdCBzcGVjaWZpZWQgaW4gYG9wdGlvbnNgLlxuICAgICAqXG4gICAgICogTm90ZTogVGhlIHRyYW5zaXRpb24gd2lsbCBoYXBwZW4gaW5zdGFudGx5IGlmIHRoZSB1c2VyIGhhcyBlbmFibGVkXG4gICAgICogdGhlIGByZWR1Y2VkIG1vdGlvbmAgYWNjZXNzaWJpbGl0eSBmZWF0dXJlIGVuYWJsZWQgaW4gdGhlaXIgb3BlcmF0aW5nIHN5c3RlbSxcbiAgICAgKiB1bmxlc3MgYG9wdGlvbnNgIGluY2x1ZGVzIGBlc3NlbnRpYWw6IHRydWVgLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0Vhc2luZ09wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBkZXNjcmliaW5nIHRoZSBkZXN0aW5hdGlvbiBhbmQgYW5pbWF0aW9uIG9mIHRoZSB0cmFuc2l0aW9uLlxuICAgICAqICAgICAgICAgICAgQWNjZXB0cyB7QGxpbmsgQ2FtZXJhT3B0aW9uc30gYW5kIHtAbGluayBBbmltYXRpb25PcHRpb25zfS5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnJvdGF0ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6em9vbVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6cGl0Y2hcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21lbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgIFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBFYXNlIHdpdGggZGVmYXVsdCBvcHRpb25zIHRvIG51bGwgaXNsYW5kIGZvciA1IHNlY29uZHMuXG4gICAgICogbWFwLmVhc2VUbyh7Y2VudGVyOiBbMCwgMF0sIHpvb206IDksIGR1cmF0aW9uOiA1MDAwfSk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBVc2luZyBlYXNlVG8gb3B0aW9ucy5cbiAgICAgKiBtYXAuZWFzZVRvKHtcbiAgICAgKiAgICAgY2VudGVyOiBbMCwgMF0sXG4gICAgICogICAgIHpvb206IDksXG4gICAgICogICAgIHNwZWVkOiAwLjIsXG4gICAgICogICAgIGN1cnZlOiAxLFxuICAgICAqICAgICBkdXJhdGlvbjogNTAwMCxcbiAgICAgKiAgICAgZWFzaW5nKHQpIHtcbiAgICAgKiAgICAgICAgIHJldHVybiB0O1xuICAgICAqICAgICB9XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogTmF2aWdhdGUgdGhlIG1hcCB3aXRoIGdhbWUtbGlrZSBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nYW1lLWNvbnRyb2xzLylcbiAgICAgKi9cbiAgICBlYXNlVG8ob3B0aW9uczogRWFzaW5nT3B0aW9ucyAmIHtlYXNlSWQ/OiBzdHJpbmcsIHByZWxvYWRPbmx5PzogYm9vbGVhbn0sIGV2ZW50RGF0YT86IE9iamVjdCk6IHRoaXMge1xuICAgICAgICB0aGlzLl9zdG9wKGZhbHNlLCBvcHRpb25zLmVhc2VJZCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7XG4gICAgICAgICAgICBvZmZzZXQ6IFswLCAwXSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICBlYXNpbmc6IGRlZmF1bHRFYXNpbmdcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UgfHwgKCFvcHRpb25zLmVzc2VudGlhbCAmJiBicm93c2VyLnByZWZlcnNSZWR1Y2VkTW90aW9uKSkgb3B0aW9ucy5kdXJhdGlvbiA9IDA7XG5cbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIHN0YXJ0Wm9vbSA9IHRoaXMuZ2V0Wm9vbSgpLFxuICAgICAgICAgICAgc3RhcnRCZWFyaW5nID0gdGhpcy5nZXRCZWFyaW5nKCksXG4gICAgICAgICAgICBzdGFydFBpdGNoID0gdGhpcy5nZXRQaXRjaCgpLFxuICAgICAgICAgICAgc3RhcnRQYWRkaW5nID0gdGhpcy5nZXRQYWRkaW5nKCksXG5cbiAgICAgICAgICAgIHpvb20gPSAnem9vbScgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnpvb20gOiBzdGFydFpvb20sXG4gICAgICAgICAgICBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZyxcbiAgICAgICAgICAgIHBpdGNoID0gJ3BpdGNoJyBpbiBvcHRpb25zID8gK29wdGlvbnMucGl0Y2ggOiBzdGFydFBpdGNoLFxuICAgICAgICAgICAgcGFkZGluZyA9ICdwYWRkaW5nJyBpbiBvcHRpb25zID8gb3B0aW9ucy5wYWRkaW5nIDogdHIucGFkZGluZztcblxuICAgICAgICBjb25zdCBvZmZzZXRBc1BvaW50ID0gUG9pbnQuY29udmVydChvcHRpb25zLm9mZnNldCk7XG5cbiAgICAgICAgbGV0IHBvaW50QXRPZmZzZXQ7XG4gICAgICAgIGxldCBmcm9tO1xuICAgICAgICBsZXQgZGVsdGE7XG5cbiAgICAgICAgaWYgKHRyLnByb2plY3Rpb24ubmFtZSA9PT0gJ2dsb2JlJykge1xuICAgICAgICAgICAgLy8gUGl4ZWwgY29vcmRpbmF0ZXMgd2lsbCBiZSBhcHBsaWVkIGRpcmVjdGx5IHRvIHRyYW5zbGF0ZSB0aGUgZ2xvYmVcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlckNvb3JkID0gTWVyY2F0b3JDb29yZGluYXRlLmZyb21MbmdMYXQodHIuY2VudGVyKTtcblxuICAgICAgICAgICAgY29uc3Qgcm90YXRlZE9mZnNldCA9IG9mZnNldEFzUG9pbnQucm90YXRlKC10ci5hbmdsZSk7XG4gICAgICAgICAgICBjZW50ZXJDb29yZC54ICs9IHJvdGF0ZWRPZmZzZXQueCAvIHRyLndvcmxkU2l6ZTtcbiAgICAgICAgICAgIGNlbnRlckNvb3JkLnkgKz0gcm90YXRlZE9mZnNldC55IC8gdHIud29ybGRTaXplO1xuXG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbkF0T2Zmc2V0ID0gY2VudGVyQ29vcmQudG9MbmdMYXQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuY2VudGVyIHx8IGxvY2F0aW9uQXRPZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5fbm9ybWFsaXplQ2VudGVyKGNlbnRlcik7XG5cbiAgICAgICAgICAgIHBvaW50QXRPZmZzZXQgPSB0ci5jZW50ZXJQb2ludC5hZGQocm90YXRlZE9mZnNldCk7XG4gICAgICAgICAgICBmcm9tID0gbmV3IFBvaW50KGNlbnRlckNvb3JkLngsIGNlbnRlckNvb3JkLnkpLm11bHQodHIud29ybGRTaXplKTtcbiAgICAgICAgICAgIGRlbHRhID0gbmV3IFBvaW50KG1lcmNhdG9yWGZyb21MbmcoY2VudGVyLmxuZyksIG1lcmNhdG9yWWZyb21MYXQoY2VudGVyLmxhdCkpLm11bHQodHIud29ybGRTaXplKS5zdWIoZnJvbSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb2ludEF0T2Zmc2V0ID0gdHIuY2VudGVyUG9pbnQuYWRkKG9mZnNldEFzUG9pbnQpO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25BdE9mZnNldCA9IHRyLnBvaW50TG9jYXRpb24ocG9pbnRBdE9mZnNldCk7XG4gICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBMbmdMYXQuY29udmVydChvcHRpb25zLmNlbnRlciB8fCBsb2NhdGlvbkF0T2Zmc2V0KTtcbiAgICAgICAgICAgIHRoaXMuX25vcm1hbGl6ZUNlbnRlcihjZW50ZXIpO1xuXG4gICAgICAgICAgICBmcm9tID0gdHIucHJvamVjdChsb2NhdGlvbkF0T2Zmc2V0KTtcbiAgICAgICAgICAgIGRlbHRhID0gdHIucHJvamVjdChjZW50ZXIpLnN1Yihmcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaW5hbFNjYWxlID0gdHIuem9vbVNjYWxlKHpvb20gLSBzdGFydFpvb20pO1xuXG4gICAgICAgIGxldCBhcm91bmQsIGFyb3VuZFBvaW50O1xuXG4gICAgICAgIGlmIChvcHRpb25zLmFyb3VuZCkge1xuICAgICAgICAgICAgYXJvdW5kID0gTG5nTGF0LmNvbnZlcnQob3B0aW9ucy5hcm91bmQpO1xuICAgICAgICAgICAgYXJvdW5kUG9pbnQgPSB0ci5sb2NhdGlvblBvaW50KGFyb3VuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB6b29tQ2hhbmdlZCA9IHRoaXMuX3pvb21pbmcgfHwgKHpvb20gIT09IHN0YXJ0Wm9vbSk7XG4gICAgICAgIGNvbnN0IGJlYXJpbmdDaGFuZ2VkID0gdGhpcy5fcm90YXRpbmcgfHwgKHN0YXJ0QmVhcmluZyAhPT0gYmVhcmluZyk7XG4gICAgICAgIGNvbnN0IHBpdGNoQ2hhbmdlZCA9IHRoaXMuX3BpdGNoaW5nIHx8IChwaXRjaCAhPT0gc3RhcnRQaXRjaCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdDaGFuZ2VkID0gIXRyLmlzUGFkZGluZ0VxdWFsKHBhZGRpbmcpO1xuXG4gICAgICAgIGNvbnN0IGZyYW1lID0gKHRyKSA9PiAoaykgPT4ge1xuICAgICAgICAgICAgaWYgKHpvb21DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdHIuem9vbSA9IGludGVycG9sYXRlKHN0YXJ0Wm9vbSwgem9vbSwgayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYmVhcmluZ0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0ci5iZWFyaW5nID0gaW50ZXJwb2xhdGUoc3RhcnRCZWFyaW5nLCBiZWFyaW5nLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwaXRjaENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0ci5waXRjaCA9IGludGVycG9sYXRlKHN0YXJ0UGl0Y2gsIHBpdGNoLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWRkaW5nQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHRyLmludGVycG9sYXRlUGFkZGluZyhzdGFydFBhZGRpbmcsIHBhZGRpbmcsIGspO1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gcGFkZGluZyBpcyBiZWluZyBhcHBsaWVkLCBUcmFuc2Zvcm0jY2VudGVyUG9pbnQgaXMgY2hhbmdpbmcgY29udGludW91c2x5LFxuICAgICAgICAgICAgICAgIC8vIHRodXMgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSBvZmZzZXRQb2ludCBldmVyeSBmcmEsZVxuICAgICAgICAgICAgICAgIHBvaW50QXRPZmZzZXQgPSB0ci5jZW50ZXJQb2ludC5hZGQob2Zmc2V0QXNQb2ludCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhcm91bmQpIHtcbiAgICAgICAgICAgICAgICB0ci5zZXRMb2NhdGlvbkF0UG9pbnQoYXJvdW5kLCBhcm91bmRQb2ludCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gdHIuem9vbVNjYWxlKHRyLnpvb20gLSBzdGFydFpvb20pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSB6b29tID4gc3RhcnRab29tID9cbiAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4oMiwgZmluYWxTY2FsZSkgOlxuICAgICAgICAgICAgICAgICAgICBNYXRoLm1heCgwLjUsIGZpbmFsU2NhbGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwZWVkdXAgPSBNYXRoLnBvdyhiYXNlLCAxIC0gayk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q2VudGVyID0gdHIudW5wcm9qZWN0KGZyb20uYWRkKGRlbHRhLm11bHQoayAqIHNwZWVkdXApKS5tdWx0KHNjYWxlKSk7XG4gICAgICAgICAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRyLnJlbmRlcldvcmxkQ29waWVzID8gbmV3Q2VudGVyLndyYXAoKSA6IG5ld0NlbnRlciwgcG9pbnRBdE9mZnNldCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5wcmVsb2FkT25seSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpcmVNb3ZlRXZlbnRzKGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cjtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob3B0aW9ucy5wcmVsb2FkT25seSkge1xuICAgICAgICAgICAgY29uc3QgcHJlZGljdGVkVHJhbnNmb3JtcyA9IHRoaXMuX2VtdWxhdGUoZnJhbWUsIG9wdGlvbnMuZHVyYXRpb24sIHRyKTtcbiAgICAgICAgICAgIHRoaXMuX3ByZWxvYWRUaWxlcyhwcmVkaWN0ZWRUcmFuc2Zvcm1zKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudGx5ID0ge1xuICAgICAgICAgICAgbW92aW5nOiB0aGlzLl9tb3ZpbmcsXG4gICAgICAgICAgICB6b29taW5nOiB0aGlzLl96b29taW5nLFxuICAgICAgICAgICAgcm90YXRpbmc6IHRoaXMuX3JvdGF0aW5nLFxuICAgICAgICAgICAgcGl0Y2hpbmc6IHRoaXMuX3BpdGNoaW5nXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fem9vbWluZyA9IHpvb21DaGFuZ2VkO1xuICAgICAgICB0aGlzLl9yb3RhdGluZyA9IGJlYXJpbmdDaGFuZ2VkO1xuICAgICAgICB0aGlzLl9waXRjaGluZyA9IHBpdGNoQ2hhbmdlZDtcbiAgICAgICAgdGhpcy5fcGFkZGluZyA9IHBhZGRpbmdDaGFuZ2VkO1xuXG4gICAgICAgIHRoaXMuX2Vhc2VJZCA9IG9wdGlvbnMuZWFzZUlkO1xuICAgICAgICB0aGlzLl9wcmVwYXJlRWFzZShldmVudERhdGEsIG9wdGlvbnMubm9Nb3ZlU3RhcnQsIGN1cnJlbnRseSk7XG5cbiAgICAgICAgdGhpcy5fZWFzZShmcmFtZSh0ciksIChpbnRlcnJ1cHRpbmdFYXNlSWQ/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHRyLnJlY2VudGVyT25UZXJyYWluKCk7XG4gICAgICAgICAgICB0aGlzLl9hZnRlckVhc2UoZXZlbnREYXRhLCBpbnRlcnJ1cHRpbmdFYXNlSWQpO1xuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfcHJlcGFyZUVhc2UoZXZlbnREYXRhPzogT2JqZWN0LCBub01vdmVTdGFydDogYm9vbGVhbiwgY3VycmVudGx5OiBPYmplY3QgPSB7fSkge1xuICAgICAgICB0aGlzLl9tb3ZpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybS5jYW1lcmFFbGV2YXRpb25SZWZlcmVuY2UgPSBcInNlYVwiO1xuXG4gICAgICAgIGlmICghbm9Nb3ZlU3RhcnQgJiYgIWN1cnJlbnRseS5tb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmVzdGFydCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl96b29taW5nICYmICFjdXJyZW50bHkuem9vbWluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnem9vbXN0YXJ0JywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW5nICYmICFjdXJyZW50bHkucm90YXRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3JvdGF0ZXN0YXJ0JywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoaW5nICYmICFjdXJyZW50bHkucGl0Y2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3BpdGNoc3RhcnQnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9maXJlTW92ZUV2ZW50cyhldmVudERhdGE/OiBPYmplY3QpIHtcbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbW92ZScsIGV2ZW50RGF0YSkpO1xuICAgICAgICBpZiAodGhpcy5fem9vbWluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnem9vbScsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9yb3RhdGluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncm90YXRlJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3BpdGNoaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdwaXRjaCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2FmdGVyRWFzZShldmVudERhdGE/OiBPYmplY3QsIGVhc2VJZD86IHN0cmluZykge1xuICAgICAgICAvLyBpZiB0aGlzIGVhc2luZyBpcyBiZWluZyBzdG9wcGVkIHRvIHN0YXJ0IGFub3RoZXIgZWFzaW5nIHdpdGhcbiAgICAgICAgLy8gdGhlIHNhbWUgaWQgdGhlbiBkb24ndCBmaXJlIGFueSBldmVudHMgdG8gYXZvaWQgZXh0cmEgc3RhcnQvc3RvcCBldmVudHNcbiAgICAgICAgaWYgKHRoaXMuX2Vhc2VJZCAmJiBlYXNlSWQgJiYgdGhpcy5fZWFzZUlkID09PSBlYXNlSWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lYXNlSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLmNhbWVyYUVsZXZhdGlvblJlZmVyZW5jZSA9IFwiZ3JvdW5kXCI7XG5cbiAgICAgICAgY29uc3Qgd2FzWm9vbWluZyA9IHRoaXMuX3pvb21pbmc7XG4gICAgICAgIGNvbnN0IHdhc1JvdGF0aW5nID0gdGhpcy5fcm90YXRpbmc7XG4gICAgICAgIGNvbnN0IHdhc1BpdGNoaW5nID0gdGhpcy5fcGl0Y2hpbmc7XG4gICAgICAgIHRoaXMuX21vdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl96b29taW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JvdGF0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BpdGNoaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BhZGRpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAod2FzWm9vbWluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnem9vbWVuZCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3YXNSb3RhdGluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncm90YXRlZW5kJywgZXZlbnREYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdhc1BpdGNoaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdwaXRjaGVuZCcsIGV2ZW50RGF0YSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ21vdmVlbmQnLCBldmVudERhdGEpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFueSBjb21iaW5hdGlvbiBvZiBjZW50ZXIsIHpvb20sIGJlYXJpbmcsIGFuZCBwaXRjaCwgYW5pbWF0aW5nIHRoZSB0cmFuc2l0aW9uIGFsb25nIGEgY3VydmUgdGhhdFxuICAgICAqIGV2b2tlcyBmbGlnaHQuIFRoZSBhbmltYXRpb24gc2VhbWxlc3NseSBpbmNvcnBvcmF0ZXMgem9vbWluZyBhbmQgcGFubmluZyB0byBoZWxwXG4gICAgICogdGhlIHVzZXIgbWFpbnRhaW4gdGhlaXIgYmVhcmluZ3MgZXZlbiBhZnRlciB0cmF2ZXJzaW5nIGEgZ3JlYXQgZGlzdGFuY2UuXG4gICAgICpcbiAgICAgKiBJZiBhIHVzZXIgaGFzIHRoZSBgcmVkdWNlZCBtb3Rpb25gIGFjY2Vzc2liaWxpdHkgZmVhdHVyZSBlbmFibGVkIGluIHRoZWlyXG4gICAgICogb3BlcmF0aW5nIHN5c3RlbSwgdGhlIGFuaW1hdGlvbiB3aWxsIGJlIHNraXBwZWQgYW5kIHRoaXMgd2lsbCBiZWhhdmVcbiAgICAgKiBlcXVpdmFsZW50bHkgdG8gYGp1bXBUb2AsIHVubGVzcyAnb3B0aW9ucycgaW5jbHVkZXMgYGVzc2VudGlhbDogdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgZGVzY3JpYmluZyB0aGUgZGVzdGluYXRpb24gYW5kIGFuaW1hdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKiAgICAgQWNjZXB0cyB7QGxpbmsgQ2FtZXJhT3B0aW9uc30sIHtAbGluayBBbmltYXRpb25PcHRpb25zfSxcbiAgICAgKiAgICAgYW5kIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jdXJ2ZT0xLjQyXSBUaGUgem9vbWluZyBcImN1cnZlXCIgdGhhdCB3aWxsIG9jY3VyIGFsb25nIHRoZVxuICAgICAqICAgICBmbGlnaHQgcGF0aC4gQSBoaWdoIHZhbHVlIG1heGltaXplcyB6b29taW5nIGZvciBhbiBleGFnZ2VyYXRlZCBhbmltYXRpb24sIHdoaWxlIGEgbG93XG4gICAgICogICAgIHZhbHVlIG1pbmltaXplcyB6b29taW5nIGZvciBhbiBlZmZlY3QgY2xvc2VyIHRvIHtAbGluayBNYXAjZWFzZVRvfS4gMS40MiBpcyB0aGUgYXZlcmFnZVxuICAgICAqICAgICB2YWx1ZSBzZWxlY3RlZCBieSBwYXJ0aWNpcGFudHMgaW4gdGhlIHVzZXIgc3R1ZHkgZGlzY3Vzc2VkIGluXG4gICAgICogICAgIFt2YW4gV2lqayAoMjAwMyldKGh0dHBzOi8vd3d3Lndpbi50dWUubmwvfnZhbndpamsvem9vbXBhbi5wZGYpLiBBIHZhbHVlIG9mXG4gICAgICogICAgIGBNYXRoLnBvdyg2LCAwLjI1KWAgd291bGQgYmUgZXF1aXZhbGVudCB0byB0aGUgcm9vdCBtZWFuIHNxdWFyZWQgYXZlcmFnZSB2ZWxvY2l0eS4gQVxuICAgICAqICAgICB2YWx1ZSBvZiAxIHdvdWxkIHByb2R1Y2UgYSBjaXJjdWxhciBtb3Rpb24uIElmIGBvcHRpb25zLm1pblpvb21gIGlzIHNwZWNpZmllZCwgdGhpcyBvcHRpb24gd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5taW5ab29tXSBUaGUgemVyby1iYXNlZCB6b29tIGxldmVsIGF0IHRoZSBwZWFrIG9mIHRoZSBmbGlnaHQgcGF0aC4gSWZcbiAgICAgKiAgICAgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLCBgb3B0aW9ucy5jdXJ2ZWAgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zcGVlZD0xLjJdIFRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBhbmltYXRpb24gZGVmaW5lZCBpbiByZWxhdGlvbiB0b1xuICAgICAqICAgICBgb3B0aW9ucy5jdXJ2ZWAuIEEgc3BlZWQgb2YgMS4yIG1lYW5zIHRoYXQgdGhlIG1hcCBhcHBlYXJzIHRvIG1vdmUgYWxvbmcgdGhlIGZsaWdodCBwYXRoXG4gICAgICogICAgIGJ5IDEuMiB0aW1lcyBgb3B0aW9ucy5jdXJ2ZWAgc2NyZWVuZnVscyBldmVyeSBzZWNvbmQuIEEgX3NjcmVlbmZ1bF8gaXMgdGhlIG1hcCdzIHZpc2libGUgc3Bhbi5cbiAgICAgKiAgICAgSXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIGZpeGVkIHBoeXNpY2FsIGRpc3RhbmNlLCBidXQgdmFyaWVzIGJ5IHpvb20gbGV2ZWwuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNjcmVlblNwZWVkXSBUaGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgYW5pbWF0aW9uIG1lYXN1cmVkIGluIHNjcmVlbmZ1bHNcbiAgICAgKiAgICAgcGVyIHNlY29uZCwgYXNzdW1pbmcgYSBsaW5lYXIgdGltaW5nIGN1cnZlLiBJZiBgb3B0aW9ucy5zcGVlZGAgaXMgc3BlY2lmaWVkLCB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhEdXJhdGlvbl0gVGhlIGFuaW1hdGlvbidzIG1heGltdW0gZHVyYXRpb24sIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKiAgICAgSWYgZHVyYXRpb24gZXhjZWVkcyBtYXhpbXVtIGR1cmF0aW9uLCBpdCByZXNldHMgdG8gMC5cbiAgICAgKiBAcGFyYW0ge09iamVjdCB8IG51bGx9IGV2ZW50RGF0YSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gZXZlbnQgb2JqZWN0cyBvZiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbWV0aG9kLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6bW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIE1hcC5ldmVudDp6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoc3RhcnRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21cbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnJvdGF0ZVxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6cGl0Y2hcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Om1vdmVlbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50Onpvb21lbmRcbiAgICAgKiBAZmlyZXMgTWFwLmV2ZW50OnBpdGNoZW5kXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIGZseSB3aXRoIGRlZmF1bHQgb3B0aW9ucyB0byBudWxsIGlzbGFuZFxuICAgICAqIG1hcC5mbHlUbyh7Y2VudGVyOiBbMCwgMF0sIHpvb206IDl9KTtcbiAgICAgKiAvLyB1c2luZyBmbHlUbyBvcHRpb25zXG4gICAgICogbWFwLmZseVRvKHtcbiAgICAgKiAgICAgY2VudGVyOiBbMCwgMF0sXG4gICAgICogICAgIHpvb206IDksXG4gICAgICogICAgIHNwZWVkOiAwLjIsXG4gICAgICogICAgIGN1cnZlOiAxLFxuICAgICAqICAgICBlYXNpbmcodCkge1xuICAgICAqICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBGbHkgdG8gYSBsb2NhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mbHl0by8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogU2xvd2x5IGZseSB0byBhIGxvY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZseXRvLW9wdGlvbnMvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEZseSB0byBhIGxvY2F0aW9uIGJhc2VkIG9uIHNjcm9sbCBwb3NpdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9zY3JvbGwtZmx5LXRvLylcbiAgICAgKi9cbiAgICBmbHlUbyhvcHRpb25zOiBFYXNpbmdPcHRpb25zICYge3ByZWxvYWRPbmx5PzogYm9vbGVhbn0sIGV2ZW50RGF0YT86IE9iamVjdCk6IHRoaXMge1xuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8ganVtcFRvIGlmIHVzZXIgaGFzIHNldCBwcmVmZXJzLXJlZHVjZWQtbW90aW9uXG4gICAgICAgIGlmICghb3B0aW9ucy5lc3NlbnRpYWwgJiYgYnJvd3Nlci5wcmVmZXJzUmVkdWNlZE1vdGlvbikge1xuICAgICAgICAgICAgY29uc3QgY29lcmNlZE9wdGlvbnMgPSBwaWNrKG9wdGlvbnMsIFsnY2VudGVyJywgJ3pvb20nLCAnYmVhcmluZycsICdwaXRjaCcsICdhcm91bmQnXSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5qdW1wVG8oY29lcmNlZE9wdGlvbnMsIGV2ZW50RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlzIG1ldGhvZCBpbXBsZW1lbnRzIGFuIOKAnG9wdGltYWwgcGF0aOKAnSBhbmltYXRpb24sIGFzIGRldGFpbGVkIGluOlxuICAgICAgICAvL1xuICAgICAgICAvLyBWYW4gV2lqaywgSmFya2UgSi47IE51aWosIFdpbSBBLiBBLiDigJxTbW9vdGggYW5kIGVmZmljaWVudCB6b29taW5nIGFuZCBwYW5uaW5nLuKAnSBJTkZPVklTXG4gICAgICAgIC8vICAg4oCZMDMuIHBwLiAxNeKAkzIyLiA8aHR0cHM6Ly93d3cud2luLnR1ZS5ubC9+dmFud2lqay96b29tcGFuLnBkZiNwYWdlPTU+LlxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVyZSBhcHBsaWNhYmxlLCBsb2NhbCB2YXJpYWJsZSBkb2N1bWVudGF0aW9uIGJlZ2lucyB3aXRoIHRoZSBhc3NvY2lhdGVkIHZhcmlhYmxlIG9yXG4gICAgICAgIC8vIGZ1bmN0aW9uIGluIHZhbiBXaWprICgyMDAzKS5cblxuICAgICAgICB0aGlzLnN0b3AoKTtcblxuICAgICAgICBvcHRpb25zID0gZXh0ZW5kKHtcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgICAgc3BlZWQ6IDEuMixcbiAgICAgICAgICAgIGN1cnZlOiAxLjQyLFxuICAgICAgICAgICAgZWFzaW5nOiBkZWZhdWx0RWFzaW5nXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBzdGFydFpvb20gPSB0aGlzLmdldFpvb20oKSxcbiAgICAgICAgICAgIHN0YXJ0QmVhcmluZyA9IHRoaXMuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgc3RhcnRQaXRjaCA9IHRoaXMuZ2V0UGl0Y2goKSxcbiAgICAgICAgICAgIHN0YXJ0UGFkZGluZyA9IHRoaXMuZ2V0UGFkZGluZygpO1xuXG4gICAgICAgIGNvbnN0IHpvb20gPSAnem9vbScgaW4gb3B0aW9ucyA/IGNsYW1wKCtvcHRpb25zLnpvb20sIHRyLm1pblpvb20sIHRyLm1heFpvb20pIDogc3RhcnRab29tO1xuICAgICAgICBjb25zdCBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZztcbiAgICAgICAgY29uc3QgcGl0Y2ggPSAncGl0Y2gnIGluIG9wdGlvbnMgPyArb3B0aW9ucy5waXRjaCA6IHN0YXJ0UGl0Y2g7XG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSAncGFkZGluZycgaW4gb3B0aW9ucyA/IG9wdGlvbnMucGFkZGluZyA6IHRyLnBhZGRpbmc7XG5cbiAgICAgICAgY29uc3Qgc2NhbGUgPSB0ci56b29tU2NhbGUoem9vbSAtIHN0YXJ0Wm9vbSk7XG4gICAgICAgIGNvbnN0IG9mZnNldEFzUG9pbnQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMub2Zmc2V0KTtcbiAgICAgICAgbGV0IHBvaW50QXRPZmZzZXQgPSB0ci5jZW50ZXJQb2ludC5hZGQob2Zmc2V0QXNQb2ludCk7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uQXRPZmZzZXQgPSB0ci5wb2ludExvY2F0aW9uKHBvaW50QXRPZmZzZXQpO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBMbmdMYXQuY29udmVydChvcHRpb25zLmNlbnRlciB8fCBsb2NhdGlvbkF0T2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fbm9ybWFsaXplQ2VudGVyKGNlbnRlcik7XG5cbiAgICAgICAgY29uc3QgZnJvbSA9IHRyLnByb2plY3QobG9jYXRpb25BdE9mZnNldCk7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdHIucHJvamVjdChjZW50ZXIpLnN1Yihmcm9tKTtcblxuICAgICAgICBsZXQgcmhvID0gb3B0aW9ucy5jdXJ2ZTtcblxuICAgICAgICAvLyB34oKAOiBJbml0aWFsIHZpc2libGUgc3BhbiwgbWVhc3VyZWQgaW4gcGl4ZWxzIGF0IHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICBjb25zdCB3MCA9IE1hdGgubWF4KHRyLndpZHRoLCB0ci5oZWlnaHQpLFxuICAgICAgICAgICAgLy8gd+KCgTogRmluYWwgdmlzaWJsZSBzcGFuLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICAgICAgdzEgPSB3MCAvIHNjYWxlLFxuICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoZSBmbGlnaHQgcGF0aCBhcyBwcm9qZWN0ZWQgb250byB0aGUgZ3JvdW5kIHBsYW5lLCBtZWFzdXJlZCBpbiBwaXhlbHMgZnJvbVxuICAgICAgICAgICAgLy8gdGhlIHdvcmxkIGltYWdlIG9yaWdpbiBhdCB0aGUgaW5pdGlhbCBzY2FsZS5cbiAgICAgICAgICAgIHUxID0gZGVsdGEubWFnKCk7XG5cbiAgICAgICAgaWYgKCdtaW5ab29tJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBtaW5ab29tID0gY2xhbXAoTWF0aC5taW4ob3B0aW9ucy5taW5ab29tLCBzdGFydFpvb20sIHpvb20pLCB0ci5taW5ab29tLCB0ci5tYXhab29tKTtcbiAgICAgICAgICAgIC8vIHc8c3ViPm08L3N1Yj46IE1heGltdW0gdmlzaWJsZSBzcGFuLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZSBpbml0aWFsXG4gICAgICAgICAgICAvLyBzY2FsZS5cbiAgICAgICAgICAgIGNvbnN0IHdNYXggPSB3MCAvIHRyLnpvb21TY2FsZShtaW5ab29tIC0gc3RhcnRab29tKTtcbiAgICAgICAgICAgIHJobyA9IE1hdGguc3FydCh3TWF4IC8gdTEgKiAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIM+BwrJcbiAgICAgICAgY29uc3QgcmhvMiA9IHJobyAqIHJobztcblxuICAgICAgICAvKipcbiAgICAgICAgICogcuG1ojogUmV0dXJucyB0aGUgem9vbS1vdXQgZmFjdG9yIGF0IG9uZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGkgMCBmb3IgdGhlIGFzY2VudCBvciAxIGZvciB0aGUgZGVzY2VudC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHIoaSkge1xuICAgICAgICAgICAgY29uc3QgYiA9ICh3MSAqIHcxIC0gdzAgKiB3MCArIChpID8gLTEgOiAxKSAqIHJobzIgKiByaG8yICogdTEgKiB1MSkgLyAoMiAqIChpID8gdzEgOiB3MCkgKiByaG8yICogdTEpO1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubG9nKE1hdGguc3FydChiICogYiArIDEpIC0gYik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzaW5oKG4pIHsgcmV0dXJuIChNYXRoLmV4cChuKSAtIE1hdGguZXhwKC1uKSkgLyAyOyB9XG4gICAgICAgIGZ1bmN0aW9uIGNvc2gobikgeyByZXR1cm4gKE1hdGguZXhwKG4pICsgTWF0aC5leHAoLW4pKSAvIDI7IH1cbiAgICAgICAgZnVuY3Rpb24gdGFuaChuKSB7IHJldHVybiBzaW5oKG4pIC8gY29zaChuKTsgfVxuXG4gICAgICAgIC8vIHLigoA6IFpvb20tb3V0IGZhY3RvciBkdXJpbmcgYXNjZW50LlxuICAgICAgICBjb25zdCByMCA9IHIoMCk7XG5cbiAgICAgICAgLy8gdyhzKTogUmV0dXJucyB0aGUgdmlzaWJsZSBzcGFuIG9uIHRoZSBncm91bmQsIG1lYXN1cmVkIGluIHBpeGVscyB3aXRoIHJlc3BlY3QgdG8gdGhlXG4gICAgICAgIC8vIGluaXRpYWwgc2NhbGUuIEFzc3VtZXMgYW4gYW5ndWxhciBmaWVsZCBvZiB2aWV3IG9mIDIgYXJjdGFuIMK9IOKJiCA1M8KwLlxuICAgICAgICBsZXQgdzogKF86IG51bWJlcikgPT4gbnVtYmVyID0gZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHJldHVybiAoY29zaChyMCkgLyBjb3NoKHIwICsgcmhvICogcykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIHUocyk6IFJldHVybnMgdGhlIGRpc3RhbmNlIGFsb25nIHRoZSBmbGlnaHQgcGF0aCBhcyBwcm9qZWN0ZWQgb250byB0aGUgZ3JvdW5kIHBsYW5lLFxuICAgICAgICAvLyBtZWFzdXJlZCBpbiBwaXhlbHMgZnJvbSB0aGUgd29ybGQgaW1hZ2Ugb3JpZ2luIGF0IHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICBsZXQgdTogKF86IG51bWJlcikgPT4gbnVtYmVyID0gZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHJldHVybiB3MCAqICgoY29zaChyMCkgKiB0YW5oKHIwICsgcmhvICogcykgLSBzaW5oKHIwKSkgLyByaG8yKSAvIHUxO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFM6IFRvdGFsIGxlbmd0aCBvZiB0aGUgZmxpZ2h0IHBhdGgsIG1lYXN1cmVkIGluIM+BLXNjcmVlbmZ1bHMuXG4gICAgICAgIGxldCBTID0gKHIoMSkgLSByMCkgLyByaG87XG5cbiAgICAgICAgLy8gV2hlbiB14oKAID0gdeKCgSwgdGhlIG9wdGltYWwgcGF0aCBkb2VzbuKAmXQgcmVxdWlyZSBib3RoIGFzY2VudCBhbmQgZGVzY2VudC5cbiAgICAgICAgaWYgKE1hdGguYWJzKHUxKSA8IDAuMDAwMDAxIHx8ICFpc0Zpbml0ZShTKSkge1xuICAgICAgICAgICAgLy8gUGVyZm9ybSBhIG1vcmUgb3IgbGVzcyBpbnN0YW50YW5lb3VzIHRyYW5zaXRpb24gaWYgdGhlIHBhdGggaXMgdG9vIHNob3J0LlxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKHcwIC0gdzEpIDwgMC4wMDAwMDEpIHJldHVybiB0aGlzLmVhc2VUbyhvcHRpb25zLCBldmVudERhdGEpO1xuXG4gICAgICAgICAgICBjb25zdCBrID0gdzEgPCB3MCA/IC0xIDogMTtcbiAgICAgICAgICAgIFMgPSBNYXRoLmFicyhNYXRoLmxvZyh3MSAvIHcwKSkgLyByaG87XG5cbiAgICAgICAgICAgIHUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4gICAgICAgICAgICB3ID0gZnVuY3Rpb24ocykgeyByZXR1cm4gTWF0aC5leHAoayAqIHJobyAqIHMpOyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdkdXJhdGlvbicgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucy5kdXJhdGlvbiA9ICtvcHRpb25zLmR1cmF0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgViA9ICdzY3JlZW5TcGVlZCcgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnNjcmVlblNwZWVkIC8gcmhvIDogK29wdGlvbnMuc3BlZWQ7XG4gICAgICAgICAgICBvcHRpb25zLmR1cmF0aW9uID0gMTAwMCAqIFMgLyBWO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4RHVyYXRpb24gJiYgb3B0aW9ucy5kdXJhdGlvbiA+IG9wdGlvbnMubWF4RHVyYXRpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb24gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgem9vbUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBiZWFyaW5nQ2hhbmdlZCA9IChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpO1xuICAgICAgICBjb25zdCBwaXRjaENoYW5nZWQgPSAocGl0Y2ggIT09IHN0YXJ0UGl0Y2gpO1xuICAgICAgICBjb25zdCBwYWRkaW5nQ2hhbmdlZCA9ICF0ci5pc1BhZGRpbmdFcXVhbChwYWRkaW5nKTtcblxuICAgICAgICBjb25zdCBmcmFtZSA9ICh0cikgPT4gKGspID0+IHtcbiAgICAgICAgICAgIC8vIHM6IFRoZSBkaXN0YW5jZSB0cmF2ZWxlZCBhbG9uZyB0aGUgZmxpZ2h0IHBhdGgsIG1lYXN1cmVkIGluIM+BLXNjcmVlbmZ1bHMuXG4gICAgICAgICAgICBjb25zdCBzID0gayAqIFM7XG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IDEgLyB3KHMpO1xuICAgICAgICAgICAgdHIuem9vbSA9IGsgPT09IDEgPyB6b29tIDogc3RhcnRab29tICsgdHIuc2NhbGVab29tKHNjYWxlKTtcblxuICAgICAgICAgICAgaWYgKGJlYXJpbmdDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdHIuYmVhcmluZyA9IGludGVycG9sYXRlKHN0YXJ0QmVhcmluZywgYmVhcmluZywgayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGl0Y2hDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdHIucGl0Y2ggPSBpbnRlcnBvbGF0ZShzdGFydFBpdGNoLCBwaXRjaCwgayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFkZGluZ0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0ci5pbnRlcnBvbGF0ZVBhZGRpbmcoc3RhcnRQYWRkaW5nLCBwYWRkaW5nLCBrKTtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHBhZGRpbmcgaXMgYmVpbmcgYXBwbGllZCwgVHJhbnNmb3JtI2NlbnRlclBvaW50IGlzIGNoYW5naW5nIGNvbnRpbnVvdXNseSxcbiAgICAgICAgICAgICAgICAvLyB0aHVzIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgb2Zmc2V0UG9pbnQgZXZlcnkgZnJhbWVcbiAgICAgICAgICAgICAgICBwb2ludEF0T2Zmc2V0ID0gdHIuY2VudGVyUG9pbnQuYWRkKG9mZnNldEFzUG9pbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXdDZW50ZXIgPSBrID09PSAxID8gY2VudGVyIDogdHIudW5wcm9qZWN0KGZyb20uYWRkKGRlbHRhLm11bHQodShzKSkpLm11bHQoc2NhbGUpKTtcbiAgICAgICAgICAgIHRyLnNldExvY2F0aW9uQXRQb2ludCh0ci5yZW5kZXJXb3JsZENvcGllcyA/IG5ld0NlbnRlci53cmFwKCkgOiBuZXdDZW50ZXIsIHBvaW50QXRPZmZzZXQpO1xuICAgICAgICAgICAgdHIuX3VwZGF0ZUNhbWVyYU9uVGVycmFpbigpO1xuXG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucHJlbG9hZE9ubHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maXJlTW92ZUV2ZW50cyhldmVudERhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHI7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucHJlbG9hZE9ubHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWRpY3RlZFRyYW5zZm9ybXMgPSB0aGlzLl9lbXVsYXRlKGZyYW1lLCBvcHRpb25zLmR1cmF0aW9uLCB0cik7XG4gICAgICAgICAgICB0aGlzLl9wcmVsb2FkVGlsZXMocHJlZGljdGVkVHJhbnNmb3Jtcyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3pvb21pbmcgPSB6b29tQ2hhbmdlZDtcbiAgICAgICAgdGhpcy5fcm90YXRpbmcgPSBiZWFyaW5nQ2hhbmdlZDtcbiAgICAgICAgdGhpcy5fcGl0Y2hpbmcgPSBwaXRjaENoYW5nZWQ7XG4gICAgICAgIHRoaXMuX3BhZGRpbmcgPSBwYWRkaW5nQ2hhbmdlZDtcblxuICAgICAgICB0aGlzLl9wcmVwYXJlRWFzZShldmVudERhdGEsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fZWFzZShmcmFtZSh0ciksICgpID0+IHRoaXMuX2FmdGVyRWFzZShldmVudERhdGEpLCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpc0Vhc2luZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZWFzZUZyYW1lSWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcHMgYW55IGFuaW1hdGVkIHRyYW5zaXRpb24gdW5kZXJ3YXkuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc3RvcCgpO1xuICAgICAqL1xuICAgIHN0b3AoKTogdGhpcyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9wKCk7XG4gICAgfVxuXG4gICAgX3N0b3AoYWxsb3dHZXN0dXJlcz86IGJvb2xlYW4sIGVhc2VJZD86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICBpZiAodGhpcy5fZWFzZUZyYW1lSWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbFJlbmRlckZyYW1lKHRoaXMuX2Vhc2VGcmFtZUlkKTtcbiAgICAgICAgICAgIHRoaXMuX2Vhc2VGcmFtZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fb25FYXNlRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fb25FYXNlRW5kKSB7XG4gICAgICAgICAgICAvLyBUaGUgX29uRWFzZUVuZCBmdW5jdGlvbiBtaWdodCBlbWl0IGV2ZW50cyB3aGljaCB0cmlnZ2VyIG5ld1xuICAgICAgICAgICAgLy8gYW5pbWF0aW9uLCB3aGljaCBzZXRzIGEgbmV3IF9vbkVhc2VFbmQuIEVuc3VyZSB3ZSBkb24ndCBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IHVuaW50ZW50aW9uYWxseS5cbiAgICAgICAgICAgIGNvbnN0IG9uRWFzZUVuZCA9IHRoaXMuX29uRWFzZUVuZDtcbiAgICAgICAgICAgIHRoaXMuX29uRWFzZUVuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG9uRWFzZUVuZC5jYWxsKHRoaXMsIGVhc2VJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhbGxvd0dlc3R1cmVzKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9ICh0aGlzOiBhbnkpLmhhbmRsZXJzO1xuICAgICAgICAgICAgaWYgKGhhbmRsZXJzKSBoYW5kbGVycy5zdG9wKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfZWFzZShmcmFtZTogKF86IG51bWJlcikgPT4gVHJhbnNmb3JtIHwgdm9pZCxcbiAgICAgICAgICBmaW5pc2g6ICgpID0+IHZvaWQsXG4gICAgICAgICAgb3B0aW9uczoge2FuaW1hdGU6IGJvb2xlYW4sIGR1cmF0aW9uOiBudW1iZXIsIGVhc2luZzogKF86IG51bWJlcikgPT4gbnVtYmVyfSkge1xuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRlID09PSBmYWxzZSB8fCBvcHRpb25zLmR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICBmcmFtZSgxKTtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZWFzZVN0YXJ0ID0gYnJvd3Nlci5ub3coKTtcbiAgICAgICAgICAgIHRoaXMuX2Vhc2VPcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgICAgIHRoaXMuX29uRWFzZUZyYW1lID0gZnJhbWU7XG4gICAgICAgICAgICB0aGlzLl9vbkVhc2VFbmQgPSBmaW5pc2g7XG4gICAgICAgICAgICB0aGlzLl9lYXNlRnJhbWVJZCA9IHRoaXMuX3JlcXVlc3RSZW5kZXJGcmFtZSh0aGlzLl9yZW5kZXJGcmFtZUNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbGxiYWNrIGZvciBtYXAuX3JlcXVlc3RSZW5kZXJGcmFtZVxuICAgIF9yZW5kZXJGcmFtZUNhbGxiYWNrKCkge1xuICAgICAgICBjb25zdCB0ID0gTWF0aC5taW4oKGJyb3dzZXIubm93KCkgLSB0aGlzLl9lYXNlU3RhcnQpIC8gdGhpcy5fZWFzZU9wdGlvbnMuZHVyYXRpb24sIDEpO1xuICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuX29uRWFzZUZyYW1lO1xuICAgICAgICBpZiAoZnJhbWUpIGZyYW1lKHRoaXMuX2Vhc2VPcHRpb25zLmVhc2luZyh0KSk7XG4gICAgICAgIGlmICh0IDwgMSkge1xuICAgICAgICAgICAgdGhpcy5fZWFzZUZyYW1lSWQgPSB0aGlzLl9yZXF1ZXN0UmVuZGVyRnJhbWUodGhpcy5fcmVuZGVyRnJhbWVDYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnZlcnQgYmVhcmluZyBzbyB0aGF0IGl0J3MgbnVtZXJpY2FsbHkgY2xvc2UgdG8gdGhlIGN1cnJlbnQgb25lIHNvIHRoYXQgaXQgaW50ZXJwb2xhdGVzIHByb3Blcmx5XG4gICAgX25vcm1hbGl6ZUJlYXJpbmcoYmVhcmluZzogbnVtYmVyLCBjdXJyZW50QmVhcmluZzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgYmVhcmluZyA9IHdyYXAoYmVhcmluZywgLTE4MCwgMTgwKTtcbiAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKGJlYXJpbmcgLSBjdXJyZW50QmVhcmluZyk7XG4gICAgICAgIGlmIChNYXRoLmFicyhiZWFyaW5nIC0gMzYwIC0gY3VycmVudEJlYXJpbmcpIDwgZGlmZikgYmVhcmluZyAtPSAzNjA7XG4gICAgICAgIGlmIChNYXRoLmFicyhiZWFyaW5nICsgMzYwIC0gY3VycmVudEJlYXJpbmcpIDwgZGlmZikgYmVhcmluZyArPSAzNjA7XG4gICAgICAgIHJldHVybiBiZWFyaW5nO1xuICAgIH1cblxuICAgIC8vIElmIGEgcGF0aCBjcm9zc2luZyB0aGUgYW50aW1lcmlkaWFuIHdvdWxkIGJlIHNob3J0ZXIsIGV4dGVuZCB0aGUgZmluYWwgY29vcmRpbmF0ZSBzbyB0aGF0XG4gICAgLy8gaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHRoZSB0d28gZW5kcG9pbnRzIHdpbGwgY3Jvc3MgaXQuXG4gICAgX25vcm1hbGl6ZUNlbnRlcihjZW50ZXI6IExuZ0xhdCkge1xuICAgICAgICBjb25zdCB0ciA9IHRoaXMudHJhbnNmb3JtO1xuICAgICAgICBpZiAoIXRyLnJlbmRlcldvcmxkQ29waWVzIHx8IHRyLm1heEJvdW5kcykgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGRlbHRhID0gY2VudGVyLmxuZyAtIHRyLmNlbnRlci5sbmc7XG4gICAgICAgIGNlbnRlci5sbmcgKz1cbiAgICAgICAgICAgIGRlbHRhID4gMTgwID8gLTM2MCA6XG4gICAgICAgICAgICBkZWx0YSA8IC0xODAgPyAzNjAgOiAwO1xuICAgIH1cblxuICAgIC8vIGVtdWxhdGVzIGZyYW1lIGZ1bmN0aW9uIGZvciBzb21lIHRyYW5zZm9ybVxuICAgIF9lbXVsYXRlKGZyYW1lOiBGdW5jdGlvbiwgZHVyYXRpb246IG51bWJlciwgaW5pdGlhbFRyYW5zZm9ybTogVHJhbnNmb3JtKTogQXJyYXk8VHJhbnNmb3JtPiB7XG4gICAgICAgIGNvbnN0IGZyYW1lUmF0ZSA9IDE1O1xuICAgICAgICBjb25zdCBudW1GcmFtZXMgPSBNYXRoLmNlaWwoZHVyYXRpb24gKiBmcmFtZVJhdGUgLyAxMDAwKTtcblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1zID0gW107XG4gICAgICAgIGNvbnN0IGVtdWxhdGVGcmFtZSA9IGZyYW1lKGluaXRpYWxUcmFuc2Zvcm0uY2xvbmUoKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IG51bUZyYW1lczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBlbXVsYXRlRnJhbWUoaSAvIG51bUZyYW1lcyk7XG4gICAgICAgICAgICB0cmFuc2Zvcm1zLnB1c2godHJhbnNmb3JtLmNsb25lKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybXM7XG4gICAgfVxufVxuXG4vLyBJbiBkZWJ1ZyBidWlsZHMsIGNoZWNrIHRoYXQgY2FtZXJhIGNoYW5nZSBldmVudHMgYXJlIGZpcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLlxuLy8gLSBfX19zdGFydCBldmVudHMgbmVlZHMgdG8gYmUgZmlyZWQgYmVmb3JlIF9fXyBhbmQgX19fZW5kIGV2ZW50c1xuLy8gLSBhbm90aGVyIF9fX3N0YXJ0IGV2ZW50IGNhbid0IGJlIGZpcmVkIGJlZm9yZSBhIF9fX2VuZCBldmVudCBoYXMgYmVlbiBmaXJlZCBmb3IgdGhlIHByZXZpb3VzIG9uZVxuZnVuY3Rpb24gYWRkQXNzZXJ0aW9ucyhjYW1lcmE6IENhbWVyYSkgeyAvL2VzbGludC1kaXNhYmxlLWxpbmVcbiAgICBEZWJ1Zy5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBpblByb2dyZXNzID0ge307XG5cbiAgICAgICAgWydkcmFnJywgJ3pvb20nLCAncm90YXRlJywgJ3BpdGNoJywgJ21vdmUnXS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICAgICAgaW5Qcm9ncmVzc1tuYW1lXSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBjYW1lcmEub24oYCR7bmFtZX1zdGFydGAsICgpID0+IHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoIWluUHJvZ3Jlc3NbbmFtZV0sIGBcIiR7bmFtZX1zdGFydFwiIGZpcmVkIHR3aWNlIHdpdGhvdXQgYSBcIiR7bmFtZX1lbmRcImApO1xuICAgICAgICAgICAgICAgIGluUHJvZ3Jlc3NbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGFzc2VydChpblByb2dyZXNzLm1vdmUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNhbWVyYS5vbihuYW1lLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGluUHJvZ3Jlc3NbbmFtZV0pO1xuICAgICAgICAgICAgICAgIGFzc2VydChpblByb2dyZXNzLm1vdmUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNhbWVyYS5vbihgJHtuYW1lfWVuZGAsICgpID0+IHtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaW5Qcm9ncmVzcy5tb3ZlKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoaW5Qcm9ncmVzc1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgaW5Qcm9ncmVzc1tuYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENhbmFyeSB1c2VkIHRvIHRlc3Qgd2hldGhlciB0aGlzIGZ1bmN0aW9uIGlzIHN0cmlwcGVkIGluIHByb2QgYnVpbGRcbiAgICAgICAgY2FuYXJ5ID0gJ2NhbmFyeSBkZWJ1ZyBydW4nOyAvL2VzbGludC1kaXNhYmxlLWxpbmVcbiAgICB9KTtcbn1cblxubGV0IGNhbmFyeTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG5cbmV4cG9ydCBkZWZhdWx0IENhbWVyYTtcbiIsIi8vIEBmbG93XG5cbmltcG9ydCAqIGFzIERPTSBmcm9tICcuLi8uLi91dGlsL2RvbS5qcyc7XG5pbXBvcnQge2JpbmRBbGx9IGZyb20gJy4uLy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4uLy4uL3V0aWwvY29uZmlnLmpzJztcblxuaW1wb3J0IHR5cGUgTWFwLCB7Q29udHJvbFBvc2l0aW9ufSBmcm9tICcuLi9tYXAuanMnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gICAgY29tcGFjdD86IGJvb2xlYW4sXG4gICAgY3VzdG9tQXR0cmlidXRpb24/OiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+XG59O1xuXG4vKipcbiAqIEFuIGBBdHRyaWJ1dGlvbkNvbnRyb2xgIGNvbnRyb2wgcHJlc2VudHMgdGhlIG1hcCdzIFthdHRyaWJ1dGlvbiBpbmZvcm1hdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9ob3ctbWFwYm94LXdvcmtzL2F0dHJpYnV0aW9uLykuXG4gKiBBZGQgdGhpcyBjb250cm9sIHRvIGEgbWFwIHVzaW5nIHtAbGluayBNYXAjYWRkQ29udHJvbH0uXG4gKlxuICogQGltcGxlbWVudHMge0lDb250cm9sfVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jb21wYWN0XSBJZiBgdHJ1ZWAsIGZvcmNlIGEgY29tcGFjdCBhdHRyaWJ1dGlvbiB0aGF0IHNob3dzIHRoZSBmdWxsIGF0dHJpYnV0aW9uIG9uIG1vdXNlIGhvdmVyLiBJZiBgZmFsc2VgLCBmb3JjZSB0aGUgZnVsbCBhdHRyaWJ1dGlvbiBjb250cm9sLiBUaGUgZGVmYXVsdCBpcyBhIHJlc3BvbnNpdmUgYXR0cmlidXRpb24gdGhhdCBjb2xsYXBzZXMgd2hlbiB0aGUgbWFwIGlzIGxlc3MgdGhhbiA2NDAgcGl4ZWxzIHdpZGUuICoqQXR0cmlidXRpb24gc2hvdWxkIG5vdCBiZSBjb2xsYXBzZWQgaWYgaXQgY2FuIGNvbWZvcnRhYmx5IGZpdCBvbiB0aGUgbWFwLiBgY29tcGFjdGAgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBtb2RpZnkgZGVmYXVsdCBhdHRyaWJ1dGlvbiB3aGVuIG1hcCBzaXplIG1ha2VzIGl0IGltcG9zc2libGUgdG8gZml0IFtkZWZhdWx0IGF0dHJpYnV0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2hvdy1tYXBib3gtd29ya3MvYXR0cmlidXRpb24vKSBhbmQgd2hlbiB0aGUgYXV0b21hdGljIGNvbXBhY3QgcmVzaXppbmcgZm9yIGRlZmF1bHQgc2V0dGluZ3MgYXJlIG5vdCBzdWZmaWNpZW50KiouXG4gKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZz59IFtvcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uXSBTdHJpbmcgb3Igc3RyaW5ncyB0byBzaG93IGluIGFkZGl0aW9uIHRvIGFueSBvdGhlciBhdHRyaWJ1dGlvbnMuIFlvdSBjYW4gYWxzbyBzZXQgYSBjdXN0b20gYXR0cmlidXRpb24gd2hlbiBpbml0aWFsaXppbmcgeW91ciBtYXAgd2l0aCB7QGxpbmsgaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9tYXAvI21hcC1wYXJhbWV0ZXJzIHRoZSBjdXN0b21BdHRyaWJ1dGlvbiBvcHRpb259LlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe2F0dHJpYnV0aW9uQ29udHJvbDogZmFsc2V9KVxuICogICAgIC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5BdHRyaWJ1dGlvbkNvbnRyb2woe1xuICogICAgICAgICBjdXN0b21BdHRyaWJ1dGlvbjogJ01hcCBkZXNpZ24gYnkgbWUnXG4gKiAgICAgfSkpO1xuICovXG5jbGFzcyBBdHRyaWJ1dGlvbkNvbnRyb2wge1xuICAgIG9wdGlvbnM6IE9wdGlvbnM7XG4gICAgX21hcDogTWFwO1xuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9pbm5lckNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2NvbXBhY3RCdXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xuICAgIF9lZGl0TGluazogP0hUTUxBbmNob3JFbGVtZW50O1xuICAgIF9hdHRyaWJIVE1MOiBzdHJpbmc7XG4gICAgc3R5bGVJZDogc3RyaW5nO1xuICAgIHN0eWxlT3duZXI6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ190b2dnbGVBdHRyaWJ1dGlvbicsXG4gICAgICAgICAgICAnX3VwZGF0ZUVkaXRMaW5rJyxcbiAgICAgICAgICAgICdfdXBkYXRlRGF0YScsXG4gICAgICAgICAgICAnX3VwZGF0ZUNvbXBhY3QnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRQb3NpdGlvbigpOiBDb250cm9sUG9zaXRpb24ge1xuICAgICAgICByZXR1cm4gJ2JvdHRvbS1yaWdodCc7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGNvbXBhY3QgPSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLmNvbXBhY3Q7XG5cbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWF0dHJpYicpO1xuICAgICAgICB0aGlzLl9jb21wYWN0QnV0dG9uID0gRE9NLmNyZWF0ZSgnYnV0dG9uJywgJ21hcGJveGdsLWN0cmwtYXR0cmliLWJ1dHRvbicsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIERPTS5jcmVhdGUoJ3NwYW4nLCBgbWFwYm94Z2wtY3RybC1pY29uYCwgdGhpcy5fY29tcGFjdEJ1dHRvbikuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgICAgIHRoaXMuX2NvbXBhY3RCdXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICB0aGlzLl9jb21wYWN0QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fdG9nZ2xlQXR0cmlidXRpb24pO1xuICAgICAgICB0aGlzLl9zZXRFbGVtZW50VGl0bGUodGhpcy5fY29tcGFjdEJ1dHRvbiwgJ1RvZ2dsZUF0dHJpYnV0aW9uJyk7XG4gICAgICAgIHRoaXMuX2lubmVyQ29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwtYXR0cmliLWlubmVyJywgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5faW5uZXJDb250YWluZXIuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2xpc3QnKTtcblxuICAgICAgICBpZiAoY29tcGFjdCkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWNvbXBhY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUF0dHJpYnV0aW9ucygpO1xuICAgICAgICB0aGlzLl91cGRhdGVFZGl0TGluaygpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbignc3R5bGVkYXRhJywgdGhpcy5fdXBkYXRlRGF0YSk7XG4gICAgICAgIHRoaXMuX21hcC5vbignc291cmNlZGF0YScsIHRoaXMuX3VwZGF0ZURhdGEpO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVFZGl0TGluayk7XG5cbiAgICAgICAgaWYgKGNvbXBhY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdyZXNpemUnLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbXBhY3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5yZW1vdmUoKTtcblxuICAgICAgICB0aGlzLl9tYXAub2ZmKCdzdHlsZWRhdGEnLCB0aGlzLl91cGRhdGVEYXRhKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignc291cmNlZGF0YScsIHRoaXMuX3VwZGF0ZURhdGEpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlRWRpdExpbmspO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdyZXNpemUnLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcblxuICAgICAgICB0aGlzLl9tYXAgPSAodW5kZWZpbmVkOiBhbnkpO1xuICAgICAgICB0aGlzLl9hdHRyaWJIVE1MID0gKHVuZGVmaW5lZDogYW55KTtcbiAgICB9XG5cbiAgICBfc2V0RWxlbWVudFRpdGxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoYEF0dHJpYnV0aW9uQ29udHJvbC4ke3RpdGxlfWApO1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHN0cik7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCd0aXRsZScpO1xuICAgICAgICBpZiAoZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCkgZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgc3RyKTtcbiAgICB9XG5cbiAgICBfdG9nZ2xlQXR0cmlidXRpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdtYXBib3hnbC1jb21wYWN0LXNob3cnKSkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWNvbXBhY3Qtc2hvdycpO1xuICAgICAgICAgICAgdGhpcy5fY29tcGFjdEJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jb21wYWN0LXNob3cnKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBhY3RCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVFZGl0TGluaygpIHtcbiAgICAgICAgbGV0IGVkaXRMaW5rID0gdGhpcy5fZWRpdExpbms7XG4gICAgICAgIGlmICghZWRpdExpbmspIHtcbiAgICAgICAgICAgIGVkaXRMaW5rID0gdGhpcy5fZWRpdExpbmsgPSAodGhpcy5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5tYXBib3gtaW1wcm92ZS1tYXAnKTogYW55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IFtcbiAgICAgICAgICAgIHtrZXk6ICdvd25lcicsIHZhbHVlOiB0aGlzLnN0eWxlT3duZXJ9LFxuICAgICAgICAgICAge2tleTogJ2lkJywgdmFsdWU6IHRoaXMuc3R5bGVJZH0sXG4gICAgICAgICAgICB7a2V5OiAnYWNjZXNzX3Rva2VuJywgdmFsdWU6IHRoaXMuX21hcC5fcmVxdWVzdE1hbmFnZXIuX2N1c3RvbUFjY2Vzc1Rva2VuIHx8IGNvbmZpZy5BQ0NFU1NfVE9LRU59XG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGVkaXRMaW5rKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbVN0cmluZyA9IHBhcmFtcy5yZWR1Y2UoKGFjYywgbmV4dCwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuZXh0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBgJHtuZXh0LmtleX09JHtuZXh0LnZhbHVlfSR7aSA8IHBhcmFtcy5sZW5ndGggLSAxID8gJyYnIDogJyd9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sIGA/YCk7XG4gICAgICAgICAgICBlZGl0TGluay5ocmVmID0gYCR7Y29uZmlnLkZFRURCQUNLX1VSTH0vJHtwYXJhbVN0cmluZ30ke3RoaXMuX21hcC5faGFzaCA/IHRoaXMuX21hcC5faGFzaC5nZXRIYXNoU3RyaW5nKHRydWUpIDogJyd9YDtcbiAgICAgICAgICAgIGVkaXRMaW5rLnJlbCA9ICdub29wZW5lciBub2ZvbGxvdyc7XG4gICAgICAgICAgICB0aGlzLl9zZXRFbGVtZW50VGl0bGUoZWRpdExpbmssICdNYXBGZWVkYmFjaycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZURhdGEoZTogYW55KSB7XG4gICAgICAgIGlmIChlICYmIChlLnNvdXJjZURhdGFUeXBlID09PSAnbWV0YWRhdGEnIHx8IGUuc291cmNlRGF0YVR5cGUgPT09ICd2aXNpYmlsaXR5JyB8fCBlLmRhdGFUeXBlID09PSAnc3R5bGUnKSkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXR0cmlidXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVFZGl0TGluaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZUF0dHJpYnV0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXAuc3R5bGUpIHJldHVybjtcbiAgICAgICAgbGV0IGF0dHJpYnV0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gICAgICAgIGlmICh0aGlzLl9tYXAuc3R5bGUuc3R5bGVzaGVldCkge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVzaGVldDogYW55ID0gdGhpcy5fbWFwLnN0eWxlLnN0eWxlc2hlZXQ7XG4gICAgICAgICAgICB0aGlzLnN0eWxlT3duZXIgPSBzdHlsZXNoZWV0Lm93bmVyO1xuICAgICAgICAgICAgdGhpcy5zdHlsZUlkID0gc3R5bGVzaGVldC5pZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlcyA9IHRoaXMuX21hcC5zdHlsZS5fc291cmNlQ2FjaGVzO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSBzb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlLnVzZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VDYWNoZS5nZXRTb3VyY2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLmF0dHJpYnV0aW9uICYmIGF0dHJpYnV0aW9ucy5pbmRleE9mKHNvdXJjZS5hdHRyaWJ1dGlvbikgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9ucy5wdXNoKHNvdXJjZS5hdHRyaWJ1dGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGFueSBlbnRyaWVzIHRoYXQgYXJlIHN1YnN0cmluZ3Mgb2YgYW5vdGhlciBlbnRyeS5cbiAgICAgICAgLy8gZmlyc3Qgc29ydCBieSBsZW5ndGggc28gdGhhdCBzdWJzdHJpbmdzIGNvbWUgZmlyc3RcbiAgICAgICAgYXR0cmlidXRpb25zLnNvcnQoKGEsIGIpID0+IGEubGVuZ3RoIC0gYi5sZW5ndGgpO1xuICAgICAgICBhdHRyaWJ1dGlvbnMgPSBhdHRyaWJ1dGlvbnMuZmlsdGVyKChhdHRyaWIsIGkpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IGF0dHJpYnV0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGlvbnNbal0uaW5kZXhPZihhdHRyaWIpID49IDApIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uKSkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9ucyA9IFsuLi50aGlzLm9wdGlvbnMuY3VzdG9tQXR0cmlidXRpb24sIC4uLmF0dHJpYnV0aW9uc107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9ucy51bnNoaWZ0KHRoaXMub3B0aW9ucy5jdXN0b21BdHRyaWJ1dGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBpZiBhdHRyaWJ1dGlvbiBzdHJpbmcgaXMgZGlmZmVyZW50IHRvIG1pbmltaXplIERPTSBjaGFuZ2VzXG4gICAgICAgIGNvbnN0IGF0dHJpYkhUTUwgPSBhdHRyaWJ1dGlvbnMuam9pbignIHwgJyk7XG4gICAgICAgIGlmIChhdHRyaWJIVE1MID09PSB0aGlzLl9hdHRyaWJIVE1MKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fYXR0cmliSFRNTCA9IGF0dHJpYkhUTUw7XG5cbiAgICAgICAgaWYgKGF0dHJpYnV0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2lubmVyQ29udGFpbmVyLmlubmVySFRNTCA9IGF0dHJpYkhUTUw7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtYXR0cmliLWVtcHR5Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtYXR0cmliLWVtcHR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVtb3ZlIG9sZCBET00gbm9kZSBmcm9tIF9lZGl0TGlua1xuICAgICAgICB0aGlzLl9lZGl0TGluayA9IG51bGw7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUNvbXBhY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkub2Zmc2V0V2lkdGggPD0gNjQwKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY29tcGFjdCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWNvbXBhY3QnLCAnbWFwYm94Z2wtY29tcGFjdC1zaG93Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXR0cmlidXRpb25Db250cm9sO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0ICogYXMgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tLmpzJztcbmltcG9ydCB7YmluZEFsbH0gZnJvbSAnLi4vLi4vdXRpbC91dGlsLmpzJztcblxuaW1wb3J0IHR5cGUgTWFwLCB7Q29udHJvbFBvc2l0aW9ufSBmcm9tICcuLi9tYXAuanMnO1xuXG4vKipcbiAqIEEgYExvZ29Db250cm9sYCBpcyBhIGNvbnRyb2wgdGhhdCBhZGRzIHRoZSBNYXBib3ggd2F0ZXJtYXJrXG4gKiB0byB0aGUgbWFwIGFzIHJlcXVpcmVkIGJ5IHRoZSBbdGVybXMgb2Ygc2VydmljZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS90b3MvKSBmb3IgTWFwYm94XG4gKiB2ZWN0b3IgdGlsZXMgYW5kIGNvcmUgc3R5bGVzLlxuICogQWRkIHRoaXMgY29udHJvbCB0byBhIG1hcCB1c2luZyB7QGxpbmsgTWFwI2FkZENvbnRyb2x9LlxuICpcbiAqIEBpbXBsZW1lbnRzIHtJQ29udHJvbH1cbiAqIEBwcml2YXRlXG4qKi9cblxuY2xhc3MgTG9nb0NvbnRyb2wge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBiaW5kQWxsKFsnX3VwZGF0ZUxvZ28nLCAnX3VwZGF0ZUNvbXBhY3QnXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgb25BZGQobWFwOiBNYXApOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwnKTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gRE9NLmNyZWF0ZSgnYScsICdtYXBib3hnbC1jdHJsLWxvZ28nKTtcbiAgICAgICAgYW5jaG9yLnRhcmdldCA9IFwiX2JsYW5rXCI7XG4gICAgICAgIGFuY2hvci5yZWwgPSBcIm5vb3BlbmVyIG5vZm9sbG93XCI7XG4gICAgICAgIGFuY2hvci5ocmVmID0gXCJodHRwczovL3d3dy5tYXBib3guY29tL1wiO1xuICAgICAgICBhbmNob3Iuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKCdMb2dvQ29udHJvbC5UaXRsZScpKTtcbiAgICAgICAgYW5jaG9yLnNldEF0dHJpYnV0ZShcInJlbFwiLCBcIm5vb3BlbmVyIG5vZm9sbG93XCIpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoYW5jaG9yKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdzb3VyY2VkYXRhJywgdGhpcy5fdXBkYXRlTG9nbyk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxvZ28oKTtcblxuICAgICAgICB0aGlzLl9tYXAub24oJ3Jlc2l6ZScsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpO1xuICAgICAgICB0aGlzLl91cGRhdGVDb21wYWN0KCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdzb3VyY2VkYXRhJywgdGhpcy5fdXBkYXRlTG9nbyk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ3Jlc2l6ZScsIHRoaXMuX3VwZGF0ZUNvbXBhY3QpO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRQb3NpdGlvbigpOiBDb250cm9sUG9zaXRpb24ge1xuICAgICAgICByZXR1cm4gJ2JvdHRvbS1sZWZ0JztcbiAgICB9XG5cbiAgICBfdXBkYXRlTG9nbyhlOiBhbnkpIHtcbiAgICAgICAgaWYgKCFlIHx8IGUuc291cmNlRGF0YVR5cGUgPT09ICdtZXRhZGF0YScpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gdGhpcy5fbG9nb1JlcXVpcmVkKCkgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xvZ29SZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXAuc3R5bGUpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBzb3VyY2VDYWNoZXMgPSB0aGlzLl9tYXAuc3R5bGUuX3NvdXJjZUNhY2hlcztcbiAgICAgICAgaWYgKE9iamVjdC5lbnRyaWVzKHNvdXJjZUNhY2hlcykubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUNhY2hlc1tpZF0uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KCdtYXBib3hfbG9nbycpICYmICFzb3VyY2UubWFwYm94X2xvZ28pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfdXBkYXRlQ29tcGFjdCgpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyQ2hpbGRyZW4gPSB0aGlzLl9jb250YWluZXIuY2hpbGRyZW47XG4gICAgICAgIGlmIChjb250YWluZXJDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGNvbnRhaW5lckNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgaWYgKHRoaXMuX21hcC5nZXRDYW52YXNDb250YWluZXIoKS5vZmZzZXRXaWR0aCA8IDI1MCkge1xuICAgICAgICAgICAgICAgIGFuY2hvci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jb21wYWN0Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jb21wYWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgTG9nb0NvbnRyb2w7XG4iLCIvLyBAZmxvdyBzdHJpY3RcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuZXhwb3J0IHR5cGUgVGFza0lEID0gbnVtYmVyOyAvLyBjYW4ndCBtYXJrIG9wYXF1ZSBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL2Zsb3d0eXBlL2Zsb3ctcmVtb3ZlLXR5cGVzL3B1bGwvNjFcbnR5cGUgVGFzayA9IHtcbiAgICBjYWxsYmFjazogKHRpbWVTdGFtcDogbnVtYmVyKSA9PiB2b2lkO1xuICAgIGlkOiBUYXNrSUQ7XG4gICAgY2FuY2VsbGVkOiBib29sZWFuO1xufTtcblxuY2xhc3MgVGFza1F1ZXVlIHtcbiAgICBfcXVldWU6IEFycmF5PFRhc2s+O1xuICAgIF9pZDogVGFza0lEO1xuICAgIF9jbGVhcmVkOiBib29sZWFuO1xuICAgIF9jdXJyZW50bHlSdW5uaW5nOiBBcnJheTxUYXNrPiB8IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoKSAge1xuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLl9pZCA9IDA7XG4gICAgICAgIHRoaXMuX2NsZWFyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY3VycmVudGx5UnVubmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFkZChjYWxsYmFjazogKHRpbWVTdGFtcDogbnVtYmVyKSA9PiB2b2lkKTogVGFza0lEIHtcbiAgICAgICAgY29uc3QgaWQgPSArK3RoaXMuX2lkO1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgICAgICBxdWV1ZS5wdXNoKHtjYWxsYmFjaywgaWQsIGNhbmNlbGxlZDogZmFsc2V9KTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIHJlbW92ZShpZDogVGFza0lEKSB7XG4gICAgICAgIGNvbnN0IHJ1bm5pbmcgPSB0aGlzLl9jdXJyZW50bHlSdW5uaW5nO1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHJ1bm5pbmcgPyB0aGlzLl9xdWV1ZS5jb25jYXQocnVubmluZykgOiB0aGlzLl9xdWV1ZTtcbiAgICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAodGFzay5pZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICB0YXNrLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcnVuKHRpbWVTdGFtcDogbnVtYmVyID0gMCkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuX2N1cnJlbnRseVJ1bm5pbmcpO1xuICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMuX2N1cnJlbnRseVJ1bm5pbmcgPSB0aGlzLl9xdWV1ZTtcblxuICAgICAgICAvLyBUYXNrcyBxdWV1ZWQgYnkgY2FsbGJhY2tzIGluIHRoZSBjdXJyZW50IHF1ZXVlIHNob3VsZCBiZSBleGVjdXRlZFxuICAgICAgICAvLyBvbiB0aGUgbmV4dCBydW4sIG5vdCB0aGUgY3VycmVudCBydW4uXG4gICAgICAgIHRoaXMuX3F1ZXVlID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHF1ZXVlKSB7XG4gICAgICAgICAgICBpZiAodGFzay5jYW5jZWxsZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGFzay5jYWxsYmFjayh0aW1lU3RhbXApO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NsZWFyZWQpIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xlYXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jdXJyZW50bHlSdW5uaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50bHlSdW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGVhcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGFza1F1ZXVlO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9nZW8vbG5nX2xhdC5qcyc7XG5cbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IHR5cGUgVHJhbnNmb3JtIGZyb20gJy4uL2dlby90cmFuc2Zvcm0uanMnO1xuXG4vKipcbiAqIEdpdmVuIGEgTG5nTGF0LCBwcmlvciBwcm9qZWN0ZWQgcG9zaXRpb24sIGFuZCBhIHRyYW5zZm9ybSwgcmV0dXJuIGEgbmV3IExuZ0xhdCBzaGlmdGVkXG4gKiBuIMOXIDM2MMKwIGVhc3Qgb3Igd2VzdCBmb3Igc29tZSBuIOKJpSAwIHN1Y2ggdGhhdDpcbiAqXG4gKiAqIHRoZSBwcm9qZWN0ZWQgbG9jYXRpb24gb2YgdGhlIHJlc3VsdCBpcyBvbiBzY3JlZW4sIGlmIHBvc3NpYmxlLCBhbmQgc2Vjb25kYXJpbHk6XG4gKiAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHByb2plY3RlZCBsb2NhdGlvbiBvZiB0aGUgcmVzdWx0IGFuZCB0aGUgcHJpb3IgcG9zaXRpb25cbiAqICAgaXMgbWluaW1pemVkLlxuICpcbiAqIFRoZSBvYmplY3QgaXMgdG8gcHJlc2VydmUgcGVyY2VpdmVkIG9iamVjdCBjb25zdGFuY3kgZm9yIFBvcHVwcyBhbmQgTWFya2VycyBhcyBtdWNoIGFzXG4gKiBwb3NzaWJsZTsgdGhleSBzaG91bGQgYXZvaWQgc2hpZnRpbmcgbGFyZ2UgZGlzdGFuY2VzIGFjcm9zcyB0aGUgc2NyZWVuLCBldmVuIHdoZW4gdGhlXG4gKiBtYXAgY2VudGVyIGNoYW5nZXMgYnkgwrEzNjDCsCBkdWUgdG8gYXV0b21hdGljIHdyYXBwaW5nLCBhbmQgd2hlbiBhYm91dCB0byBnbyBvZmYgc2NyZWVuLFxuICogc2hvdWxkIHdyYXAganVzdCBlbm91Z2ggdG8gYXZvaWQgZG9pbmcgc28uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obG5nTGF0OiBMbmdMYXQsIHByaW9yUG9zOiA/UG9pbnQsIHRyYW5zZm9ybTogVHJhbnNmb3JtKTogTG5nTGF0IHtcbiAgICBsbmdMYXQgPSBuZXcgTG5nTGF0KGxuZ0xhdC5sbmcsIGxuZ0xhdC5sYXQpO1xuXG4gICAgLy8gRmlyc3QsIHRyeSBzaGlmdGluZyBvbmUgd29ybGQgaW4gZWl0aGVyIGRpcmVjdGlvbiwgYW5kIHNlZSBpZiBlaXRoZXIgaXMgY2xvc2VyIHRvIHRoZVxuICAgIC8vIHByaW9yIHBvc2l0aW9uLiBEb24ndCBzaGlmdCBhd2F5IGlmIGl0IG5ldyBwb3NpdGlvbiBpcyBmdXJ0aGVyIGZyb20gY2VudGVyLlxuICAgIC8vIFRoaXMgcHJlc2VydmVzIG9iamVjdCBjb25zdGFuY3kgd2hlbiB0aGUgbWFwIGNlbnRlciBpcyBhdXRvLXdyYXBwZWQgZHVyaW5nIGFuaW1hdGlvbnMsXG4gICAgLy8gYnV0IGRvbid0IGFsbG93IGl0IHRvIHJ1biBhd2F5IG9uIGhvcml6b24gKHBvaW50cyB0b3dhcmRzIGhvcml6b24gZ2V0IGNsb3NlciBhbmQgY2xvc2VyKS5cbiAgICBpZiAocHJpb3JQb3MpIHtcbiAgICAgICAgY29uc3QgbGVmdCAgPSBuZXcgTG5nTGF0KGxuZ0xhdC5sbmcgLSAzNjAsIGxuZ0xhdC5sYXQpO1xuICAgICAgICBjb25zdCByaWdodCA9IG5ldyBMbmdMYXQobG5nTGF0LmxuZyArIDM2MCwgbG5nTGF0LmxhdCk7XG4gICAgICAgIC8vIFVubGVzcyBvZmZzY3JlZW4sIGtlZXAgdGhlIG1hcmtlciB3aXRoaW4gc2FtZSB3cmFwIGRpc3RhbmNlIHRvIGNlbnRlci4gVGhpcyBpcyB0byBwcmV2ZW50XG4gICAgICAgIC8vIHJ1bm5pbmcgaXQgdG8gaW5maW5pdHkgYGxuZ2AgbmVhciBob3Jpem9uIHdoZW4gYmVhcmluZyBpcyB+OTDCsC5cbiAgICAgICAgY29uc3Qgd2l0aGluV3JhcCA9ICBNYXRoLmNlaWwoTWF0aC5hYnMobG5nTGF0LmxuZyAtIHRyYW5zZm9ybS5jZW50ZXIubG5nKSAvIDM2MCkgKiAzNjA7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdHJhbnNmb3JtLmxvY2F0aW9uUG9pbnQobG5nTGF0KS5kaXN0U3FyKHByaW9yUG9zKTtcbiAgICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gcHJpb3JQb3MueCA8IDAgfHwgcHJpb3JQb3MueSA8IDAgfHwgcHJpb3JQb3MueCA+IHRyYW5zZm9ybS53aWR0aCB8fCBwcmlvclBvcy55ID4gdHJhbnNmb3JtLmhlaWdodDtcbiAgICAgICAgaWYgKHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KGxlZnQpLmRpc3RTcXIocHJpb3JQb3MpIDwgZGVsdGEgJiYgKG9mZnNjcmVlbiB8fCBNYXRoLmFicyhsZWZ0LmxuZyAtIHRyYW5zZm9ybS5jZW50ZXIubG5nKSA8IHdpdGhpbldyYXApKSB7XG4gICAgICAgICAgICBsbmdMYXQgPSBsZWZ0O1xuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KHJpZ2h0KS5kaXN0U3FyKHByaW9yUG9zKSA8IGRlbHRhICYmIChvZmZzY3JlZW4gfHwgTWF0aC5hYnMocmlnaHQubG5nIC0gdHJhbnNmb3JtLmNlbnRlci5sbmcpIDwgd2l0aGluV3JhcCkpIHtcbiAgICAgICAgICAgIGxuZ0xhdCA9IHJpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2Vjb25kLCB3cmFwIHRvd2FyZCB0aGUgY2VudGVyIHVudGlsIHRoZSBuZXcgcG9zaXRpb24gaXMgb24gc2NyZWVuLCBvciB3ZSBjYW4ndCBnZXRcbiAgICAvLyBhbnkgY2xvc2VyLlxuICAgIHdoaWxlIChNYXRoLmFicyhsbmdMYXQubG5nIC0gdHJhbnNmb3JtLmNlbnRlci5sbmcpID4gMTgwKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRyYW5zZm9ybS5sb2NhdGlvblBvaW50KGxuZ0xhdCk7XG4gICAgICAgIGlmIChwb3MueCA+PSAwICYmIHBvcy55ID49IDAgJiYgcG9zLnggPD0gdHJhbnNmb3JtLndpZHRoICYmIHBvcy55IDw9IHRyYW5zZm9ybS5oZWlnaHQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsbmdMYXQubG5nID4gdHJhbnNmb3JtLmNlbnRlci5sbmcpIHtcbiAgICAgICAgICAgIGxuZ0xhdC5sbmcgLT0gMzYwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG5nTGF0LmxuZyArPSAzNjA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbG5nTGF0O1xufVxuIiwiLy8gQGZsb3dcblxuZXhwb3J0IHR5cGUgQW5jaG9yID1cbiAgICB8ICdjZW50ZXInXG4gICAgfCAndG9wJ1xuICAgIHwgJ2JvdHRvbSdcbiAgICB8ICdsZWZ0J1xuICAgIHwgJ3JpZ2h0J1xuICAgIHwgJ3RvcC1sZWZ0J1xuICAgIHwgJ3RvcC1yaWdodCdcbiAgICB8ICdib3R0b20tbGVmdCdcbiAgICB8ICdib3R0b20tcmlnaHQnO1xuXG5leHBvcnQgY29uc3QgYW5jaG9yVHJhbnNsYXRlOiB7W186IEFuY2hvcl06IHN0cmluZ30gPSB7XG4gICAgJ2NlbnRlcic6ICd0cmFuc2xhdGUoLTUwJSwtNTAlKScsXG4gICAgJ3RvcCc6ICd0cmFuc2xhdGUoLTUwJSwwKScsXG4gICAgJ3RvcC1sZWZ0JzogJ3RyYW5zbGF0ZSgwLDApJyxcbiAgICAndG9wLXJpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwwKScsXG4gICAgJ2JvdHRvbSc6ICd0cmFuc2xhdGUoLTUwJSwtMTAwJSknLFxuICAgICdib3R0b20tbGVmdCc6ICd0cmFuc2xhdGUoMCwtMTAwJSknLFxuICAgICdib3R0b20tcmlnaHQnOiAndHJhbnNsYXRlKC0xMDAlLC0xMDAlKScsXG4gICAgJ2xlZnQnOiAndHJhbnNsYXRlKDAsLTUwJSknLFxuICAgICdyaWdodCc6ICd0cmFuc2xhdGUoLTEwMCUsLTUwJSknXG59O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0ICogYXMgRE9NIGZyb20gJy4uL3V0aWwvZG9tLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cuanMnO1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgc21hcnRXcmFwIGZyb20gJy4uL3V0aWwvc21hcnRfd3JhcC5qcyc7XG5pbXBvcnQge2JpbmRBbGwsIGV4dGVuZCwgcmFkVG9EZWd9IGZyb20gJy4uL3V0aWwvdXRpbC5qcyc7XG5pbXBvcnQge3R5cGUgQW5jaG9yLCBhbmNob3JUcmFuc2xhdGV9IGZyb20gJy4vYW5jaG9yLmpzJztcbmltcG9ydCB7RXZlbnQsIEV2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi9tYXAuanMnO1xuaW1wb3J0IHR5cGUgUG9wdXAgZnJvbSAnLi9wb3B1cC5qcyc7XG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSBcIi4uL2dlby9sbmdfbGF0LmpzXCI7XG5pbXBvcnQgdHlwZSB7TWFwTW91c2VFdmVudCwgTWFwVG91Y2hFdmVudH0gZnJvbSAnLi9ldmVudHMuanMnO1xuaW1wb3J0IHR5cGUge1BvaW50TGlrZX0gZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQge2dsb2JlVGlsdEF0TG5nTGF0LCBnbG9iZUNlbnRlclRvU2NyZWVuUG9pbnQsIGlzTG5nTGF0QmVoaW5kR2xvYmV9IGZyb20gJy4uL2dlby9wcm9qZWN0aW9uL2dsb2JlX3V0aWwuanMnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50LFxuICAgIG9mZnNldD86IFBvaW50TGlrZSxcbiAgICBhbmNob3I/OiBBbmNob3IsXG4gICAgY29sb3I/OiBzdHJpbmcsXG4gICAgc2NhbGU/OiBudW1iZXIsXG4gICAgZHJhZ2dhYmxlPzogYm9vbGVhbixcbiAgICBjbGlja1RvbGVyYW5jZT86IG51bWJlcixcbiAgICByb3RhdGlvbj86IG51bWJlcixcbiAgICByb3RhdGlvbkFsaWdubWVudD86IHN0cmluZyxcbiAgICBwaXRjaEFsaWdubWVudD86IHN0cmluZ1xufTtcblxuZXhwb3J0IGNvbnN0IFRFUlJBSU5fT0NDTFVERURfT1BBQ0lUWSA9IDAuMjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFya2VyIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbb3B0aW9ucy5lbGVtZW50XSBET00gZWxlbWVudCB0byB1c2UgYXMgYSBtYXJrZXIuIFRoZSBkZWZhdWx0IGlzIGEgbGlnaHQgYmx1ZSwgZHJvcGxldC1zaGFwZWQgU1ZHIG1hcmtlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hbmNob3I9J2NlbnRlciddIEEgc3RyaW5nIGluZGljYXRpbmcgdGhlIHBhcnQgb2YgdGhlIE1hcmtlciB0aGF0IHNob3VsZCBiZSBwb3NpdGlvbmVkIGNsb3Nlc3QgdG8gdGhlIGNvb3JkaW5hdGUgc2V0IHZpYSB7QGxpbmsgTWFya2VyI3NldExuZ0xhdH0uXG4gKiAgIE9wdGlvbnMgYXJlIGAnY2VudGVyJ2AsIGAndG9wJ2AsIGAnYm90dG9tJ2AsIGAnbGVmdCdgLCBgJ3JpZ2h0J2AsIGAndG9wLWxlZnQnYCwgYCd0b3AtcmlnaHQnYCwgYCdib3R0b20tbGVmdCdgLCBhbmQgYCdib3R0b20tcmlnaHQnYC5cbiAqIEBwYXJhbSB7UG9pbnRMaWtlfSBbb3B0aW9ucy5vZmZzZXRdIFRoZSBvZmZzZXQgaW4gcGl4ZWxzIGFzIGEge0BsaW5rIFBvaW50TGlrZX0gb2JqZWN0IHRvIGFwcGx5IHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50J3MgY2VudGVyLiBOZWdhdGl2ZXMgaW5kaWNhdGUgbGVmdCBhbmQgdXAuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29sb3I9JyMzRkIxQ0UnXSBUaGUgY29sb3IgdG8gdXNlIGZvciB0aGUgZGVmYXVsdCBtYXJrZXIgaWYgYG9wdGlvbnMuZWxlbWVudGAgaXMgbm90IHByb3ZpZGVkLiBUaGUgZGVmYXVsdCBpcyBsaWdodCBibHVlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNjYWxlPTFdIFRoZSBzY2FsZSB0byB1c2UgZm9yIHRoZSBkZWZhdWx0IG1hcmtlciBpZiBgb3B0aW9ucy5lbGVtZW50YCBpcyBub3QgcHJvdmlkZWQuIFRoZSBkZWZhdWx0IHNjYWxlIGNvcnJlc3BvbmRzIHRvIGEgaGVpZ2h0IG9mIGA0MXB4YCBhbmQgYSB3aWR0aCBvZiBgMjdweGAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRyYWdnYWJsZT1mYWxzZV0gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgYSBtYXJrZXIgaXMgYWJsZSB0byBiZSBkcmFnZ2VkIHRvIGEgbmV3IHBvc2l0aW9uIG9uIHRoZSBtYXAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY2xpY2tUb2xlcmFuY2U9MF0gVGhlIG1heCBudW1iZXIgb2YgcGl4ZWxzIGEgdXNlciBjYW4gc2hpZnQgdGhlIG1vdXNlIHBvaW50ZXIgZHVyaW5nIGEgY2xpY2sgb24gdGhlIG1hcmtlciBmb3IgaXQgdG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIGNsaWNrIChhcyBvcHBvc2VkIHRvIGEgbWFya2VyIGRyYWcpLiBUaGUgZGVmYXVsdCBpcyB0byBpbmhlcml0IG1hcCdzIGBjbGlja1RvbGVyYW5jZWAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucm90YXRpb249MF0gVGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSBtYXJrZXIgaW4gZGVncmVlcywgcmVsYXRpdmUgdG8gaXRzIHJlc3BlY3RpdmUgYHJvdGF0aW9uQWxpZ25tZW50YCBzZXR0aW5nLiBBIHBvc2l0aXZlIHZhbHVlIHdpbGwgcm90YXRlIHRoZSBtYXJrZXIgY2xvY2t3aXNlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnBpdGNoQWxpZ25tZW50PSdhdXRvJ10gYG1hcGAgYWxpZ25zIHRoZSBgTWFya2VyYCB0byB0aGUgcGxhbmUgb2YgdGhlIG1hcC4gYHZpZXdwb3J0YCBhbGlnbnMgdGhlIGBNYXJrZXJgIHRvIHRoZSBwbGFuZSBvZiB0aGUgdmlld3BvcnQuIGBhdXRvYCBhdXRvbWF0aWNhbGx5IG1hdGNoZXMgdGhlIHZhbHVlIG9mIGByb3RhdGlvbkFsaWdubWVudGAuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucm90YXRpb25BbGlnbm1lbnQ9J2F1dG8nXSBgbWFwYCBhbGlnbnMgdGhlIGBNYXJrZXJgJ3Mgcm90YXRpb24gcmVsYXRpdmUgdG8gdGhlIG1hcCwgbWFpbnRhaW5pbmcgYSBiZWFyaW5nIGFzIHRoZSBtYXAgcm90YXRlcy4gYHZpZXdwb3J0YCBhbGlnbnMgdGhlIGBNYXJrZXJgJ3Mgcm90YXRpb24gcmVsYXRpdmUgdG8gdGhlIHZpZXdwb3J0LCBhZ25vc3RpYyB0byBtYXAgcm90YXRpb25zLiBgYXV0b2AgaXMgZXF1aXZhbGVudCB0byBgdmlld3BvcnRgLlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIG5ldyBtYXJrZXIuXG4gKiBjb25zdCBtYXJrZXIgPSBuZXcgbWFwYm94Z2wuTWFya2VyKClcbiAqICAgICAuc2V0TG5nTGF0KFszMC41LCA1MC41XSlcbiAqICAgICAuYWRkVG8obWFwKTtcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgbWFya2VyIG9wdGlvbnMuXG4gKiBjb25zdCBtYXJrZXIgPSBuZXcgbWFwYm94Z2wuTWFya2VyKHtcbiAqICAgICBjb2xvcjogXCIjRkZGRkZGXCIsXG4gKiAgICAgZHJhZ2dhYmxlOiB0cnVlXG4gKiB9KS5zZXRMbmdMYXQoWzMwLjUsIDUwLjVdKVxuICogICAgIC5hZGRUbyhtYXApO1xuICogQHNlZSBbRXhhbXBsZTogQWRkIGN1c3RvbSBpY29ucyB3aXRoIE1hcmtlcnNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY3VzdG9tLW1hcmtlci1pY29ucy8pXG4gKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgTWFya2VyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1tYXJrZXIvKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXJrZXIgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBfbWFwOiA/TWFwO1xuICAgIF9hbmNob3I6IEFuY2hvcjtcbiAgICBfb2Zmc2V0OiBQb2ludDtcbiAgICBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgX3BvcHVwOiA/UG9wdXA7XG4gICAgX2xuZ0xhdDogTG5nTGF0O1xuICAgIF9wb3M6ID9Qb2ludDtcbiAgICBfY29sb3I6IHN0cmluZztcbiAgICBfc2NhbGU6IG51bWJlcjtcbiAgICBfZGVmYXVsdE1hcmtlcjogYm9vbGVhbjtcbiAgICBfZHJhZ2dhYmxlOiBib29sZWFuO1xuICAgIF9jbGlja1RvbGVyYW5jZTogbnVtYmVyO1xuICAgIF9pc0RyYWdnaW5nOiBib29sZWFuO1xuICAgIF9zdGF0ZTogJ2luYWN0aXZlJyB8ICdwZW5kaW5nJyB8ICdhY3RpdmUnOyAvLyB1c2VkIGZvciBoYW5kbGluZyBkcmFnIGV2ZW50c1xuICAgIF9wb3NpdGlvbkRlbHRhOiA/UG9pbnQ7XG4gICAgX3BvaW50ZXJkb3duUG9zOiA/UG9pbnQ7XG4gICAgX3JvdGF0aW9uOiBudW1iZXI7XG4gICAgX3BpdGNoQWxpZ25tZW50OiBzdHJpbmc7XG4gICAgX3JvdGF0aW9uQWxpZ25tZW50OiBzdHJpbmc7XG4gICAgX29yaWdpbmFsVGFiSW5kZXg6ID9zdHJpbmc7IC8vIG9yaWdpbmFsIHRhYmluZGV4IG9mIF9lbGVtZW50XG4gICAgX2ZhZGVUaW1lcjogP1RpbWVvdXRJRDtcbiAgICBfdXBkYXRlRnJhbWVJZDogbnVtYmVyO1xuICAgIF91cGRhdGVNb3Zpbmc6ICgpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zPzogT3B0aW9ucywgbGVnYWN5T3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLS0gdGhlIGNvbnN0cnVjdG9yIHVzZWQgdG8gYWNjZXB0IHRoZSBlbGVtZW50IGFzIGFcbiAgICAgICAgLy8gcmVxdWlyZWQgZmlyc3QgYXJndW1lbnQsIGJlZm9yZSBpdCB3YXMgbWFkZSBvcHRpb25hbC5cbiAgICAgICAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEVsZW1lbnQgfHwgbGVnYWN5T3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7ZWxlbWVudDogb3B0aW9uc30sIGxlZ2FjeU9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX3VwZGF0ZScsXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnX29uVXAnLFxuICAgICAgICAgICAgJ19hZGREcmFnSGFuZGxlcicsXG4gICAgICAgICAgICAnX29uTWFwQ2xpY2snLFxuICAgICAgICAgICAgJ19vbktleVByZXNzJyxcbiAgICAgICAgICAgICdfY2xlYXJGYWRlVGltZXInXG4gICAgICAgIF0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX2FuY2hvciA9IChvcHRpb25zICYmIG9wdGlvbnMuYW5jaG9yKSB8fCAnY2VudGVyJztcbiAgICAgICAgdGhpcy5fY29sb3IgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNvbG9yKSB8fCAnIzNGQjFDRSc7XG4gICAgICAgIHRoaXMuX3NjYWxlID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5zY2FsZSkgfHwgMTtcbiAgICAgICAgdGhpcy5fZHJhZ2dhYmxlID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5kcmFnZ2FibGUpIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl9jbGlja1RvbGVyYW5jZSA9IChvcHRpb25zICYmIG9wdGlvbnMuY2xpY2tUb2xlcmFuY2UpIHx8IDA7XG4gICAgICAgIHRoaXMuX2lzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSAnaW5hY3RpdmUnO1xuICAgICAgICB0aGlzLl9yb3RhdGlvbiA9IChvcHRpb25zICYmIG9wdGlvbnMucm90YXRpb24pIHx8IDA7XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5yb3RhdGlvbkFsaWdubWVudCkgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9waXRjaEFsaWdubWVudCA9IChvcHRpb25zICYmIG9wdGlvbnMucGl0Y2hBbGlnbm1lbnQgJiYgb3B0aW9ucy5waXRjaEFsaWdubWVudCkgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl91cGRhdGVNb3ZpbmcgPSAoKSA9PiB0aGlzLl91cGRhdGUodHJ1ZSk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRNYXJrZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudCA9IERPTS5jcmVhdGUoJ2RpdicpO1xuXG4gICAgICAgICAgICAvLyBjcmVhdGUgZGVmYXVsdCBtYXAgbWFya2VyIFNWR1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEhlaWdodCA9IDQxO1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gMjc7XG5cbiAgICAgICAgICAgIGNvbnN0IHN2ZyA9IERPTS5jcmVhdGVTVkcoJ3N2ZycsIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICAgICAgICAgIGhlaWdodDogYCR7ZGVmYXVsdEhlaWdodCAqIHRoaXMuX3NjYWxlfXB4YCxcbiAgICAgICAgICAgICAgICB3aWR0aDogYCR7ZGVmYXVsdFdpZHRoICogdGhpcy5fc2NhbGV9cHhgLFxuICAgICAgICAgICAgICAgIHZpZXdCb3g6IGAwIDAgJHtkZWZhdWx0V2lkdGh9ICR7ZGVmYXVsdEhlaWdodH1gXG4gICAgICAgICAgICB9LCB0aGlzLl9lbGVtZW50KTtcblxuICAgICAgICAgICAgY29uc3QgZ3JhZGllbnQgPSBET00uY3JlYXRlU1ZHKCdyYWRpYWxHcmFkaWVudCcsIHtpZDogJ3NoYWRvd0dyYWRpZW50J30sIERPTS5jcmVhdGVTVkcoJ2RlZnMnLCB7fSwgc3ZnKSk7XG4gICAgICAgICAgICBET00uY3JlYXRlU1ZHKCdzdG9wJywge29mZnNldDogJzEwJScsICdzdG9wLW9wYWNpdHknOiAwLjR9LCBncmFkaWVudCk7XG4gICAgICAgICAgICBET00uY3JlYXRlU1ZHKCdzdG9wJywge29mZnNldDogJzEwMCUnLCAnc3RvcC1vcGFjaXR5JzogMC4wNX0sIGdyYWRpZW50KTtcbiAgICAgICAgICAgIERPTS5jcmVhdGVTVkcoJ2VsbGlwc2UnLCB7Y3g6IDEzLjUsIGN5OiAzNC44LCByeDogMTAuNSwgcnk6IDUuMjUsIGZpbGw6ICd1cmwoI3NoYWRvd0dyYWRpZW50KSd9LCBzdmcpOyAvLyBzaGFkb3dcblxuICAgICAgICAgICAgRE9NLmNyZWF0ZVNWRygncGF0aCcsIHsgLy8gbWFya2VyIHNoYXBlXG4gICAgICAgICAgICAgICAgZmlsbDogdGhpcy5fY29sb3IsXG4gICAgICAgICAgICAgICAgZDogJ00yNywxMy41QzI3LDE5LjA3IDIwLjI1LDI3IDE0Ljc1LDM0LjVDMTQuMDIsMzUuNSAxMi45OCwzNS41IDEyLjI1LDM0LjVDNi43NSwyNyAwLDE5LjIyIDAsMTMuNUMwLDYuMDQgNi4wNCwwIDEzLjUsMEMyMC45NiwwIDI3LDYuMDQgMjcsMTMuNVonXG4gICAgICAgICAgICB9LCBzdmcpO1xuICAgICAgICAgICAgRE9NLmNyZWF0ZVNWRygncGF0aCcsIHsgLy8gYm9yZGVyXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMC4yNSxcbiAgICAgICAgICAgICAgICBkOiAnTTEzLjUsMEM2LjA0LDAgMCw2LjA0IDAsMTMuNUMwLDE5LjIyIDYuNzUsMjcgMTIuMjUsMzQuNUMxMywzNS41MiAxNC4wMiwzNS41IDE0Ljc1LDM0LjVDMjAuMjUsMjcgMjcsMTkuMDcgMjcsMTMuNUMyNyw2LjA0IDIwLjk2LDAgMTMuNSwwWk0xMy41LDFDMjAuNDIsMSAyNiw2LjU4IDI2LDEzLjVDMjYsMTUuOSAyNC41LDE5LjE4IDIyLjIyLDIyLjc0QzE5Ljk1LDI2LjMgMTYuNzEsMzAuMTQgMTMuOTQsMzMuOTFDMTMuNzQsMzQuMTggMTMuNjEsMzQuMzIgMTMuNSwzNC40NEMxMy4zOSwzNC4zMiAxMy4yNiwzNC4xOCAxMy4wNiwzMy45MUMxMC4yOCwzMC4xMyA3LjQxLDI2LjMxIDUuMDIsMjIuNzdDMi42MiwxOS4yMyAxLDE1Ljk1IDEsMTMuNUMxLDYuNTggNi41OCwxIDEzLjUsMVonXG4gICAgICAgICAgICB9LCBzdmcpO1xuXG4gICAgICAgICAgICBET00uY3JlYXRlU1ZHKCdjaXJjbGUnLCB7ZmlsbDogJ3doaXRlJywgY3g6IDEzLjUsIGN5OiAxMy41LCByOiA1LjV9LCBzdmcpOyAvLyBjaXJjbGVcblxuICAgICAgICAgICAgLy8gaWYgbm8gZWxlbWVudCBhbmQgbm8gb2Zmc2V0IG9wdGlvbiBnaXZlbiBhcHBseSBhbiBvZmZzZXQgZm9yIHRoZSBkZWZhdWx0IG1hcmtlclxuICAgICAgICAgICAgLy8gdGhlIC0xNCBhcyB0aGUgeSB2YWx1ZSBvZiB0aGUgZGVmYXVsdCBtYXJrZXIgb2Zmc2V0IHdhcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3NcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyB0aGUgbWFya2VyIHRpcCBpcyBhdCB0aGUgY2VudGVyIG9mIHRoZSBzaGFkb3cgZWxsaXBzZSBmcm9tIHRoZSBkZWZhdWx0IHN2Z1xuICAgICAgICAgICAgLy8gdGhlIHkgdmFsdWUgb2YgdGhlIGNlbnRlciBvZiB0aGUgc2hhZG93IGVsbGlwc2UgcmVsYXRpdmUgdG8gdGhlIHN2ZyB0b3AgbGVmdCBpcyAzNC44XG4gICAgICAgICAgICAvLyBvZmZzZXQgdG8gdGhlIHN2ZyBjZW50ZXIgXCJoZWlnaHQgKDQxIC8gMilcIiBnaXZlcyAzNC44IC0gKDQxIC8gMikgYW5kIHJvdW5kZWQgZm9yIGFuIGludGVnZXIgcGl4ZWwgb2Zmc2V0IGdpdmVzIDE0XG4gICAgICAgICAgICAvLyBuZWdhdGl2ZSBpcyB1c2VkIHRvIG1vdmUgdGhlIG1hcmtlciB1cCBmcm9tIHRoZSBjZW50ZXIgc28gdGhlIHRpcCBpcyBhdCB0aGUgTWFya2VyIGxuZ0xhdFxuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gUG9pbnQuY29udmVydCgob3B0aW9ucyAmJiBvcHRpb25zLm9mZnNldCkgfHwgWzAsIC0xNF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudCA9IG9wdGlvbnMuZWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IFBvaW50LmNvbnZlcnQoKG9wdGlvbnMgJiYgb3B0aW9ucy5vZmZzZXQpIHx8IFswLCAwXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2VsZW1lbnQuaGFzQXR0cmlidXRlKCdhcmlhLWxhYmVsJykpIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ01hcCBtYXJrZXInKTtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1tYXJrZXInKTtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCAoZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBwcmV2ZW50IGZvY3VzaW5nIG9uIGNsaWNrXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdDtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYW5jaG9yVHJhbnNsYXRlKSB7XG4gICAgICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKGBtYXBib3hnbC1tYXJrZXItYW5jaG9yLSR7a2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNsYXNzTGlzdC5hZGQoYG1hcGJveGdsLW1hcmtlci1hbmNob3ItJHt0aGlzLl9hbmNob3J9YCk7XG5cbiAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIHRoZSBgTWFya2VyYCB0byBhIGBNYXBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcGJveCBHTCBKUyBtYXAgdG8gYWRkIHRoZSBtYXJrZXIgdG8uXG4gICAgICogQHJldHVybnMge01hcmtlcn0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IG1hcmtlciA9IG5ldyBtYXBib3hnbC5NYXJrZXIoKVxuICAgICAqICAgICAuc2V0TG5nTGF0KFszMC41LCA1MC41XSlcbiAgICAgKiAgICAgLmFkZFRvKG1hcCk7IC8vIGFkZCB0aGUgbWFya2VyIHRvIHRoZSBtYXBcbiAgICAgKi9cbiAgICBhZGRUbyhtYXA6IE1hcCk6IHRoaXMge1xuICAgICAgICBpZiAobWFwID09PSB0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICBtYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGVNb3ZpbmcpO1xuICAgICAgICBtYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICBtYXAub24oJ3JlbW92ZScsIHRoaXMuX2NsZWFyRmFkZVRpbWVyKTtcbiAgICAgICAgbWFwLl9hZGRNYXJrZXIodGhpcyk7XG4gICAgICAgIHRoaXMuc2V0RHJhZ2dhYmxlKHRoaXMuX2RyYWdnYWJsZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuXG4gICAgICAgIC8vIElmIHdlIGF0dGFjaGVkIHRoZSBgY2xpY2tgIGxpc3RlbmVyIHRvIHRoZSBtYXJrZXIgZWxlbWVudCwgdGhlIHBvcHVwXG4gICAgICAgIC8vIHdvdWxkIGNsb3NlIG9uY2UgdGhlIGV2ZW50IHByb3BvZ2F0ZWQgdG8gYG1hcGAgZHVlIHRvIHRoZVxuICAgICAgICAvLyBgUG9wdXAjX29uQ2xpY2tDbG9zZWAgbGlzdGVuZXIuXG4gICAgICAgIG1hcC5vbignY2xpY2snLCB0aGlzLl9vbk1hcENsaWNrKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBtYXJrZXIgZnJvbSBhIG1hcC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbWFya2VyID0gbmV3IG1hcGJveGdsLk1hcmtlcigpLmFkZFRvKG1hcCk7XG4gICAgICogbWFya2VyLnJlbW92ZSgpO1xuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICovXG4gICAgcmVtb3ZlKCk6IHRoaXMge1xuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgICAgIGlmIChtYXApIHtcbiAgICAgICAgICAgIG1hcC5vZmYoJ2NsaWNrJywgdGhpcy5fb25NYXBDbGljayk7XG4gICAgICAgICAgICBtYXAub2ZmKCdtb3ZlJywgdGhpcy5fdXBkYXRlTW92aW5nKTtcbiAgICAgICAgICAgIG1hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICAgICAgbWFwLm9mZignbW91c2Vkb3duJywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgbWFwLm9mZigndG91Y2hzdGFydCcsIHRoaXMuX2FkZERyYWdIYW5kbGVyKTtcbiAgICAgICAgICAgIG1hcC5vZmYoJ21vdXNldXAnLCB0aGlzLl9vblVwKTtcbiAgICAgICAgICAgIG1hcC5vZmYoJ3RvdWNoZW5kJywgdGhpcy5fb25VcCk7XG4gICAgICAgICAgICBtYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICAgICAgbWFwLm9mZigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3ZlKTtcbiAgICAgICAgICAgIG1hcC5vZmYoJ3JlbW92ZScsIHRoaXMuX2NsZWFyRmFkZVRpbWVyKTtcbiAgICAgICAgICAgIG1hcC5fcmVtb3ZlTWFya2VyKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fbWFwID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsZWFyRmFkZVRpbWVyKCk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCkgdGhpcy5fcG9wdXAucmVtb3ZlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWFya2VyJ3MgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uLlxuICAgICAqXG4gICAgICogVGhlIGxvbmdpdHVkZSBvZiB0aGUgcmVzdWx0IG1heSBkaWZmZXIgYnkgYSBtdWx0aXBsZSBvZiAzNjAgZGVncmVlcyBmcm9tIHRoZSBsb25naXR1ZGUgcHJldmlvdXNseVxuICAgICAqIHNldCBieSBgc2V0TG5nTGF0YCBiZWNhdXNlIGBNYXJrZXJgIHdyYXBzIHRoZSBhbmNob3IgbG9uZ2l0dWRlIGFjcm9zcyBjb3BpZXMgb2YgdGhlIHdvcmxkIHRvIGtlZXBcbiAgICAgKiB0aGUgbWFya2VyIG9uIHNjcmVlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IEEge0BsaW5rIExuZ0xhdH0gZGVzY3JpYmluZyB0aGUgbWFya2VyJ3MgbG9jYXRpb24uXG4gICAgKiBAZXhhbXBsZVxuICAgICogLy8gU3RvcmUgdGhlIG1hcmtlcidzIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgY29vcmRpbmF0ZXMgaW4gYSB2YXJpYWJsZVxuICAgICogY29uc3QgbG5nTGF0ID0gbWFya2VyLmdldExuZ0xhdCgpO1xuICAgICogLy8gUHJpbnQgdGhlIG1hcmtlcidzIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgdmFsdWVzIGluIHRoZSBjb25zb2xlXG4gICAgKiBjb25zb2xlLmxvZyhgTG9uZ2l0dWRlOiAke2xuZ0xhdC5sbmd9LCBMYXRpdHVkZTogJHtsbmdMYXQubGF0fWApO1xuICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgZHJhZ2dhYmxlIE1hcmtlcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLW1hcmtlci8pXG4gICAgKi9cbiAgICBnZXRMbmdMYXQoKTogTG5nTGF0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xuZ0xhdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIFNldCB0aGUgbWFya2VyJ3MgZ2VvZ3JhcGhpY2FsIHBvc2l0aW9uIGFuZCBtb3ZlIGl0LlxuICAgICAqXG4gICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nbGF0IEEge0BsaW5rIExuZ0xhdH0gZGVzY3JpYmluZyB3aGVyZSB0aGUgbWFya2VyIHNob3VsZCBiZSBsb2NhdGVkLlxuICAgICogQHJldHVybnMge01hcmtlcn0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAqIEBleGFtcGxlXG4gICAgKiAvLyBDcmVhdGUgYSBuZXcgbWFya2VyLCBzZXQgdGhlIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUsIGFuZCBhZGQgaXQgdG8gdGhlIG1hcC5cbiAgICAqIG5ldyBtYXBib3hnbC5NYXJrZXIoKVxuICAgICogICAgIC5zZXRMbmdMYXQoWy02NS4wMTcsIC0xNi40NTddKVxuICAgICogICAgIC5hZGRUbyhtYXApO1xuICAgICogQHNlZSBbRXhhbXBsZTogQWRkIGN1c3RvbSBpY29ucyB3aXRoIE1hcmtlcnNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2N1c3RvbS1tYXJrZXItaWNvbnMvKVxuICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgZHJhZ2dhYmxlIE1hcmtlcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLW1hcmtlci8pXG4gICAgKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSBtYXJrZXIgdXNpbmcgYSBwbGFjZSBuYW1lXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tYXJrZXItZnJvbS1nZW9jb2RlLylcbiAgICAqL1xuICAgIHNldExuZ0xhdChsbmdsYXQ6IExuZ0xhdExpa2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG5nTGF0ID0gTG5nTGF0LmNvbnZlcnQobG5nbGF0KTtcbiAgICAgICAgdGhpcy5fcG9zID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB0aGlzLl9wb3B1cC5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgTWFya2VyYCdzIEhUTUwgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gUmV0dXJucyB0aGUgbWFya2VyIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBlbGVtZW50ID0gbWFya2VyLmdldEVsZW1lbnQoKTtcbiAgICAgKi9cbiAgICBnZXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmluZHMgYSB7QGxpbmsgUG9wdXB9IHRvIHRoZSB7QGxpbmsgTWFya2VyfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9wdXAgfCBudWxsfSBwb3B1cCBBbiBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIFBvcHVwfSBjbGFzcy4gSWYgdW5kZWZpbmVkIG9yIG51bGwsIGFueSBwb3B1cFxuICAgICAqIHNldCBvbiB0aGlzIHtAbGluayBNYXJrZXJ9IGluc3RhbmNlIGlzIHVuc2V0LlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBtYXJrZXIgPSBuZXcgbWFwYm94Z2wuTWFya2VyKClcbiAgICAgKiAgICAgLnNldExuZ0xhdChbMCwgMF0pXG4gICAgICogICAgIC5zZXRQb3B1cChuZXcgbWFwYm94Z2wuUG9wdXAoKS5zZXRIVE1MKFwiPGgxPkhlbGxvIFdvcmxkITwvaDE+XCIpKSAvLyBhZGQgcG9wdXBcbiAgICAgKiAgICAgLmFkZFRvKG1hcCk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogQXR0YWNoIGEgcG9wdXAgdG8gYSBtYXJrZXIgaW5zdGFuY2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NldC1wb3B1cC8pXG4gICAgICovXG4gICAgc2V0UG9wdXAocG9wdXA6ID9Qb3B1cCk6IHRoaXMge1xuICAgICAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCB0aGlzLl9vbktleVByZXNzKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9vcmlnaW5hbFRhYkluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9wdXApIHtcbiAgICAgICAgICAgIGlmICghKCdvZmZzZXQnIGluIHBvcHVwLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya2VySGVpZ2h0ID0gNDEgLSAoNS44IC8gMik7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya2VyUmFkaXVzID0gMTMuNTtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lYXJPZmZzZXQgPSBNYXRoLnNxcnQoTWF0aC5wb3cobWFya2VyUmFkaXVzLCAyKSAvIDIpO1xuICAgICAgICAgICAgICAgIHBvcHVwLm9wdGlvbnMub2Zmc2V0ID0gdGhpcy5fZGVmYXVsdE1hcmtlciA/IHtcbiAgICAgICAgICAgICAgICAgICAgJ3RvcCc6IFswLCAwXSxcbiAgICAgICAgICAgICAgICAgICAgJ3RvcC1sZWZ0JzogWzAsIDBdLFxuICAgICAgICAgICAgICAgICAgICAndG9wLXJpZ2h0JzogWzAsIDBdLFxuICAgICAgICAgICAgICAgICAgICAnYm90dG9tJzogWzAsIC1tYXJrZXJIZWlnaHRdLFxuICAgICAgICAgICAgICAgICAgICAnYm90dG9tLWxlZnQnOiBbbGluZWFyT2Zmc2V0LCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzICsgbGluZWFyT2Zmc2V0KSAqIC0xXSxcbiAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCc6IFstbGluZWFyT2Zmc2V0LCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzICsgbGluZWFyT2Zmc2V0KSAqIC0xXSxcbiAgICAgICAgICAgICAgICAgICAgJ2xlZnQnOiBbbWFya2VyUmFkaXVzLCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzKSAqIC0xXSxcbiAgICAgICAgICAgICAgICAgICAgJ3JpZ2h0JzogWy1tYXJrZXJSYWRpdXMsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMpICogLTFdXG4gICAgICAgICAgICAgICAgfSA6IHRoaXMuX29mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BvcHVwID0gcG9wdXA7XG4gICAgICAgICAgICBwb3B1cC5fbWFya2VyID0gdGhpcztcbiAgICAgICAgICAgIGlmICh0aGlzLl9sbmdMYXQpIHRoaXMuX3BvcHVwLnNldExuZ0xhdCh0aGlzLl9sbmdMYXQpO1xuXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdidXR0b24nKTtcbiAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsVGFiSW5kZXggPSB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5fb3JpZ2luYWxUYWJJbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICcwJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgdGhpcy5fb25LZXlQcmVzcyk7XG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX29uS2V5UHJlc3MoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBjb25zdCBjb2RlID0gZS5jb2RlO1xuICAgICAgICBjb25zdCBsZWdhY3lDb2RlID0gZS5jaGFyQ29kZSB8fCBlLmtleUNvZGU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGNvZGUgPT09ICdTcGFjZScpIHx8IChjb2RlID09PSAnRW50ZXInKSB8fFxuICAgICAgICAgICAgKGxlZ2FjeUNvZGUgPT09IDMyKSB8fCAobGVnYWN5Q29kZSA9PT0gMTMpIC8vIHNwYWNlIG9yIGVudGVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQb3B1cCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uTWFwQ2xpY2soZTogTWFwTW91c2VFdmVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZS5vcmlnaW5hbEV2ZW50LnRhcmdldDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwICYmICh0YXJnZXRFbGVtZW50ID09PSBlbGVtZW50IHx8IGVsZW1lbnQuY29udGFpbnMoKHRhcmdldEVsZW1lbnQ6IGFueSkpKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQb3B1cCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFBvcHVwfSBpbnN0YW5jZSB0aGF0IGlzIGJvdW5kIHRvIHRoZSB7QGxpbmsgTWFya2VyfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gUmV0dXJucyB0aGUgcG9wdXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBtYXJrZXIgPSBuZXcgbWFwYm94Z2wuTWFya2VyKClcbiAgICAgKiAgICAgLnNldExuZ0xhdChbMCwgMF0pXG4gICAgICogICAgIC5zZXRQb3B1cChuZXcgbWFwYm94Z2wuUG9wdXAoKS5zZXRIVE1MKFwiPGgxPkhlbGxvIFdvcmxkITwvaDE+XCIpKVxuICAgICAqICAgICAuYWRkVG8obWFwKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG1hcmtlci5nZXRQb3B1cCgpKTsgLy8gcmV0dXJuIHRoZSBwb3B1cCBpbnN0YW5jZVxuICAgICAqL1xuICAgIGdldFBvcHVwKCk6ID9Qb3B1cCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyBvciBjbG9zZXMgdGhlIHtAbGluayBQb3B1cH0gaW5zdGFuY2UgdGhhdCBpcyBib3VuZCB0byB0aGUge0BsaW5rIE1hcmtlcn0sIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUge0BsaW5rIFBvcHVwfS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBtYXJrZXIgPSBuZXcgbWFwYm94Z2wuTWFya2VyKClcbiAgICAgKiAgICAgLnNldExuZ0xhdChbMCwgMF0pXG4gICAgICogICAgIC5zZXRQb3B1cChuZXcgbWFwYm94Z2wuUG9wdXAoKS5zZXRIVE1MKFwiPGgxPkhlbGxvIFdvcmxkITwvaDE+XCIpKVxuICAgICAqICAgICAuYWRkVG8obWFwKTtcbiAgICAgKlxuICAgICAqIG1hcmtlci50b2dnbGVQb3B1cCgpOyAvLyB0b2dnbGUgcG9wdXAgb3BlbiBvciBjbG9zZWRcbiAgICAgKi9cbiAgICB0b2dnbGVQb3B1cCgpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgcG9wdXAgPSB0aGlzLl9wb3B1cDtcbiAgICAgICAgaWYgKCFwb3B1cCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSBpZiAocG9wdXAuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIHBvcHVwLnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIHBvcHVwLmFkZFRvKHRoaXMuX21hcCk7XG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX2JlaGluZFRlcnJhaW4oKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgaWYgKCFtYXApIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdW5wcm9qZWN0ZWQgPSBtYXAudW5wcm9qZWN0KHRoaXMuX3Bvcyk7XG4gICAgICAgIGNvbnN0IGNhbWVyYSA9IG1hcC5nZXRGcmVlQ2FtZXJhT3B0aW9ucygpO1xuICAgICAgICBpZiAoIWNhbWVyYS5wb3NpdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBjYW1lcmFMbmdMYXQgPSBjYW1lcmEucG9zaXRpb24udG9MbmdMYXQoKTtcbiAgICAgICAgY29uc3QgdG9DbG9zZXN0U3VyZmFjZSA9IGNhbWVyYUxuZ0xhdC5kaXN0YW5jZVRvKHVucHJvamVjdGVkKTtcbiAgICAgICAgY29uc3QgdG9NYXJrZXIgPSBjYW1lcmFMbmdMYXQuZGlzdGFuY2VUbyh0aGlzLl9sbmdMYXQpO1xuICAgICAgICByZXR1cm4gdG9DbG9zZXN0U3VyZmFjZSA8IHRvTWFya2VyICogMC45O1xuXG4gICAgfVxuXG4gICAgX2V2YWx1YXRlT3BhY2l0eSgpIHtcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICBpZiAoIW1hcCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuX3BvcztcblxuICAgICAgICBpZiAoIXBvcyB8fCBwb3MueCA8IDAgfHwgcG9zLnggPiBtYXAudHJhbnNmb3JtLndpZHRoIHx8IHBvcy55IDwgMCB8fCBwb3MueSA+IG1hcC50cmFuc2Zvcm0uaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLl9jbGVhckZhZGVUaW1lcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hcExvY2F0aW9uID0gbWFwLnVucHJvamVjdChwb3MpO1xuICAgICAgICBsZXQgb3BhY2l0eTtcbiAgICAgICAgaWYgKG1hcC5fdXNpbmdHbG9iZSgpICYmIGlzTG5nTGF0QmVoaW5kR2xvYmUobWFwLnRyYW5zZm9ybSwgdGhpcy5fbG5nTGF0KSkge1xuICAgICAgICAgICAgb3BhY2l0eSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcGFjaXR5ID0gMSAtIG1hcC5fcXVlcnlGb2dPcGFjaXR5KG1hcExvY2F0aW9uKTtcbiAgICAgICAgICAgIGlmIChtYXAudHJhbnNmb3JtLl90ZXJyYWluRW5hYmxlZCgpICYmIG1hcC5nZXRUZXJyYWluKCkgJiYgdGhpcy5fYmVoaW5kVGVycmFpbigpKSB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eSAqPSBURVJSQUlOX09DQ0xVREVEX09QQUNJVFk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm9wYWNpdHkgPSBgJHtvcGFjaXR5fWA7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IG9wYWNpdHkgPiAwID8gJ2F1dG8nIDogJ25vbmUnO1xuICAgICAgICBpZiAodGhpcy5fcG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwLl9zZXRPcGFjaXR5KG9wYWNpdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZmFkZVRpbWVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBfY2xlYXJGYWRlVGltZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLl9mYWRlVGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9mYWRlVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5fZmFkZVRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVET00oKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuX3BvcztcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICBpZiAoIXBvcyB8fCAhbWFwKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGNvbnN0IHJvdGF0aW9uID0gdGhpcy5fY2FsY3VsYXRlWFlUcmFuc2Zvcm0oKSArIHRoaXMuX2NhbGN1bGF0ZVpUcmFuc2Zvcm0oKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0Lm11bHQodGhpcy5fc2NhbGUpO1xuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYFxuICAgICAgICAgICAgdHJhbnNsYXRlKCR7cG9zLnh9cHgsJHtwb3MueX1weCkgJHthbmNob3JUcmFuc2xhdGVbdGhpcy5fYW5jaG9yXX1cbiAgICAgICAgICAgICR7cm90YXRpb259XG4gICAgICAgICAgICB0cmFuc2xhdGUoJHtvZmZzZXQueH1weCwke29mZnNldC55fXB4KVxuICAgICAgICBgO1xuICAgIH1cblxuICAgIF9jYWxjdWxhdGVYWVRyYW5zZm9ybSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwb3MgPSB0aGlzLl9wb3M7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcblxuICAgICAgICBpZiAodGhpcy5nZXRQaXRjaEFsaWdubWVudCgpICE9PSAnbWFwJyB8fCAhbWFwIHx8ICFwb3MpIHsgcmV0dXJuICcnOyB9XG4gICAgICAgIGlmICghbWFwLl91c2luZ0dsb2JlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHBpdGNoID0gbWFwLmdldFBpdGNoKCk7XG4gICAgICAgICAgICByZXR1cm4gcGl0Y2ggPyBgcm90YXRlWCgke3BpdGNofWRlZylgIDogJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGlsdCA9IHJhZFRvRGVnKGdsb2JlVGlsdEF0TG5nTGF0KG1hcC50cmFuc2Zvcm0sIHRoaXMuX2xuZ0xhdCkpO1xuICAgICAgICBjb25zdCBwb3NGcm9tQ2VudGVyID0gcG9zLnN1YihnbG9iZUNlbnRlclRvU2NyZWVuUG9pbnQobWFwLnRyYW5zZm9ybSkpO1xuICAgICAgICBjb25zdCB0aWx0T3ZlckRpc3QgPSAgdGlsdCAvIChNYXRoLmFicyhwb3NGcm9tQ2VudGVyLngpICsgTWF0aC5hYnMocG9zRnJvbUNlbnRlci55KSk7XG4gICAgICAgIGNvbnN0IHlUaWx0ID0gcG9zRnJvbUNlbnRlci54ICogdGlsdE92ZXJEaXN0O1xuICAgICAgICBjb25zdCB4VGlsdCA9IC1wb3NGcm9tQ2VudGVyLnkgKiB0aWx0T3ZlckRpc3Q7XG4gICAgICAgIGlmICgheFRpbHQgJiYgIXlUaWx0KSB7IHJldHVybiAnJzsgfVxuICAgICAgICByZXR1cm4gYHJvdGF0ZVgoJHt4VGlsdH1kZWcpIHJvdGF0ZVkoJHt5VGlsdH1kZWcpYDtcbiAgICB9XG5cbiAgICBfY2FsY3VsYXRlWlRyYW5zZm9ybSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBzcGluID0gdGhpcy5fY2FsY3VsYXRlUm90YXRpb24oKTtcbiAgICAgICAgcmV0dXJuIHNwaW4gPyBgcm90YXRlWigke3NwaW59ZGVnKWAgOiBgYDtcbiAgICB9XG5cbiAgICBfY2FsY3VsYXRlUm90YXRpb24oKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50ID09PSBcInZpZXdwb3J0XCIgfHwgdGhpcy5fcm90YXRpb25BbGlnbm1lbnQgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb247XG4gICAgICAgIH0gaWYgKHRoaXMuX21hcCAmJiB0aGlzLl9yb3RhdGlvbkFsaWdubWVudCA9PT0gXCJtYXBcIikge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gdGhpcy5fcG9zO1xuICAgICAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICAgICAgaWYgKHBvcyAmJiBtYXAgJiYgbWFwLl91c2luZ0dsb2JlKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub3J0aCA9IG1hcC5wcm9qZWN0KG5ldyBMbmdMYXQodGhpcy5fbG5nTGF0LmxuZywgdGhpcy5fbG5nTGF0LmxhdCArIC4wMDEpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3V0aCA9IG1hcC5wcm9qZWN0KG5ldyBMbmdMYXQodGhpcy5fbG5nTGF0LmxuZywgdGhpcy5fbG5nTGF0LmxhdCAtIC4wMDEpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gc291dGguc3ViKG5vcnRoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcm90YXRpb24gKyByYWRUb0RlZyhNYXRoLmF0YW4yKGRpZmYueSwgZGlmZi54KSkgLSA5MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb3RhdGlvbiAtIHRoaXMuX21hcC5nZXRCZWFyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgX3VwZGF0ZShkZWxheVNuYXA/OiBib29sZWFuKSB7XG4gICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl91cGRhdGVGcmFtZUlkKTtcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICBpZiAoIW1hcCkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChtYXAudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9sbmdMYXQgPSBzbWFydFdyYXAodGhpcy5fbG5nTGF0LCB0aGlzLl9wb3MsIG1hcC50cmFuc2Zvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcG9zID0gbWFwLnByb2plY3QodGhpcy5fbG5nTGF0KTtcblxuICAgICAgICAvLyBiZWNhdXNlIHJvdW5kaW5nIHRoZSBjb29yZGluYXRlcyBhdCBldmVyeSBgbW92ZWAgZXZlbnQgY2F1c2VzIHN0dXR0ZXJlZCB6b29taW5nXG4gICAgICAgIC8vIHdlIG9ubHkgcm91bmQgdGhlbSB3aGVuIF91cGRhdGUgaXMgY2FsbGVkIHdpdGggYG1vdmVlbmRgIG9yIHdoZW4gaXRzIGNhbGxlZCB3aXRoXG4gICAgICAgIC8vIG5vIGFyZ3VtZW50cyAod2hlbiB0aGUgTWFya2VyIGlzIGluaXRpYWxpemVkIG9yIE1hcmtlciNzZXRMbmdMYXQgaXMgaW52b2tlZCkuXG4gICAgICAgIGlmIChkZWxheVNuYXAgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUZyYW1lSWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCAmJiB0aGlzLl9wb3MgJiYgdGhpcy5fYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcyA9IHRoaXMuX3Bvcy5yb3VuZCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVET00oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcyA9IHRoaXMuX3Bvcy5yb3VuZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwLl9yZXF1ZXN0RG9tVGFzaygoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX21hcCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCAmJiB0aGlzLl9wb3MgJiYgdGhpcy5fYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlRE9NKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgobWFwLl91c2luZ0dsb2JlKCkgfHwgbWFwLmdldFRlcnJhaW4oKSB8fCBtYXAuZ2V0Rm9nKCkpICYmICF0aGlzLl9mYWRlVGltZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mYWRlVGltZXIgPSBzZXRUaW1lb3V0KHRoaXMuX2V2YWx1YXRlT3BhY2l0eS5iaW5kKHRoaXMpLCA2MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbWFya2VyJ3Mgb2Zmc2V0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BvaW50fSBUaGUgbWFya2VyJ3Mgc2NyZWVuIGNvb3JkaW5hdGVzIGluIHBpeGVscy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IG9mZnNldCA9IG1hcmtlci5nZXRPZmZzZXQoKTtcbiAgICAgKi9cbiAgICBnZXRPZmZzZXQoKTogUG9pbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fb2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG9mZnNldCBvZiB0aGUgbWFya2VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IG9mZnNldCBUaGUgb2Zmc2V0IGluIHBpeGVscyBhcyBhIHtAbGluayBQb2ludExpa2V9IG9iamVjdCB0byBhcHBseSByZWxhdGl2ZSB0byB0aGUgZWxlbWVudCdzIGNlbnRlci4gTmVnYXRpdmVzIGluZGljYXRlIGxlZnQgYW5kIHVwLlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXJrZXIuc2V0T2Zmc2V0KFswLCAxXSk7XG4gICAgICovXG4gICAgc2V0T2Zmc2V0KG9mZnNldDogUG9pbnRMaWtlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX29mZnNldCA9IFBvaW50LmNvbnZlcnQob2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9vbk1vdmUoZTogTWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnQpIHtcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICBpZiAoIW1hcCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghdGhpcy5faXNEcmFnZ2luZykge1xuICAgICAgICAgICAgY29uc3QgY2xpY2tUb2xlcmFuY2UgPSB0aGlzLl9jbGlja1RvbGVyYW5jZSB8fCBtYXAuX2NsaWNrVG9sZXJhbmNlO1xuICAgICAgICAgICAgdGhpcy5faXNEcmFnZ2luZyA9IGUucG9pbnQuZGlzdCh0aGlzLl9wb2ludGVyZG93blBvcykgPj0gY2xpY2tUb2xlcmFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fcG9zID0gZS5wb2ludC5zdWIodGhpcy5fcG9zaXRpb25EZWx0YSk7XG4gICAgICAgIHRoaXMuX2xuZ0xhdCA9IG1hcC51bnByb2plY3QodGhpcy5fcG9zKTtcbiAgICAgICAgdGhpcy5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KTtcbiAgICAgICAgLy8gc3VwcHJlc3MgY2xpY2sgZXZlbnQgc28gdGhhdCBwb3B1cHMgZG9uJ3QgdG9nZ2xlIG9uIGRyYWdcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuXG4gICAgICAgIC8vIG1ha2Ugc3VyZSBkcmFnc3RhcnQgb25seSBmaXJlcyBvbiB0aGUgZmlyc3QgbW92ZSBldmVudCBhZnRlciBtb3VzZWRvd24uXG4gICAgICAgIC8vIHRoaXMgY2FuJ3QgYmUgb24gbW91c2Vkb3duIGJlY2F1c2UgdGhhdCBldmVudCBkb2Vzbid0IG5lY2Vzc2FyaWx5XG4gICAgICAgIC8vIGltcGx5IHRoYXQgYSBkcmFnIGlzIGFib3V0IHRvIGhhcHBlbi5cbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAncGVuZGluZycpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ2FjdGl2ZSc7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRmlyZWQgd2hlbiBkcmFnZ2luZyBzdGFydHMuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQGV2ZW50IGRyYWdzdGFydFxuICAgICAgICAgICAgICogQG1lbWJlcm9mIE1hcmtlclxuICAgICAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgICAgICogQHByb3BlcnR5IHtNYXJrZXJ9IG1hcmtlciBUaGUgb2JqZWN0IHRoYXQgaXMgYmVpbmcgZHJhZ2dlZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZHJhZ3N0YXJ0JykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoaWxlIGRyYWdnaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAZXZlbnQgZHJhZ1xuICAgICAgICAgKiBAbWVtYmVyb2YgTWFya2VyXG4gICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgKiBAcHJvcGVydHkge01hcmtlcn0gbWFya2VyIFRoZSBvYmplY3QgdGhhdCBpcyBiZWluZyBkcmFnZ2VkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnZHJhZycpKTtcbiAgICB9XG5cbiAgICBfb25VcCgpIHtcbiAgICAgICAgLy8gcmV2ZXJ0IHRvIG5vcm1hbCBwb2ludGVyIGV2ZW50IGhhbmRsaW5nXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgdGhpcy5fcG9zaXRpb25EZWx0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3BvaW50ZXJkb3duUG9zID0gbnVsbDtcbiAgICAgICAgdGhpcy5faXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgaWYgKG1hcCkge1xuICAgICAgICAgICAgbWFwLm9mZignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3ZlKTtcbiAgICAgICAgICAgIG1hcC5vZmYoJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvbmx5IGZpcmUgZHJhZ2VuZCBpZiBpdCB3YXMgcHJlY2VkZWQgYnkgYXQgbGVhc3Qgb25lIGRyYWcgZXZlbnRcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSAnYWN0aXZlJykge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIG1hcmtlciBpcyBmaW5pc2hlZCBiZWluZyBkcmFnZ2VkLlxuICAgICAgICAgICAgKlxuICAgICAgICAgICAgKiBAZXZlbnQgZHJhZ2VuZFxuICAgICAgICAgICAgKiBAbWVtYmVyb2YgTWFya2VyXG4gICAgICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAgICAgICAgKiBAcHJvcGVydHkge01hcmtlcn0gbWFya2VyIFRoZSBvYmplY3QgdGhhdCB3YXMgZHJhZ2dlZC5cbiAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdkcmFnZW5kJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3RhdGUgPSAnaW5hY3RpdmUnO1xuICAgIH1cblxuICAgIF9hZGREcmFnSGFuZGxlcihlOiBNYXBNb3VzZUV2ZW50IHwgTWFwVG91Y2hFdmVudCkge1xuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgICAgIGlmICghbWFwKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuY29udGFpbnMoKGUub3JpZ2luYWxFdmVudC50YXJnZXQ6IGFueSkpKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBwaXhlbCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBjbGljayBwb2ludFxuICAgICAgICAgICAgLy8gYW5kIHRoZSBtYXJrZXIgcG9zaXRpb24sIHdpdGggdGhlIG9mZnNldCBhY2NvdW50ZWQgZm9yLiBUaGVuIHdlXG4gICAgICAgICAgICAvLyBjYW4gc3VidHJhY3QgdGhpcyBkaXN0YW5jZSBmcm9tIHRoZSBtb3VzZW1vdmUgZXZlbnQncyBwb3NpdGlvblxuICAgICAgICAgICAgLy8gdG8gY2FsY3VsYXRlIHRoZSBuZXcgbWFya2VyIHBvc2l0aW9uLlxuICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlIG1hcmtlciAnanVtcHMnIHRvIHRoZSBjbGljayBwb3NpdGlvblxuICAgICAgICAgICAgLy8gY3JlYXRpbmcgYSBqYXJyaW5nIFVYIGVmZmVjdC5cbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRGVsdGEgPSBlLnBvaW50LnN1Yih0aGlzLl9wb3MpO1xuXG4gICAgICAgICAgICB0aGlzLl9wb2ludGVyZG93blBvcyA9IGUucG9pbnQ7XG5cbiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gJ3BlbmRpbmcnO1xuICAgICAgICAgICAgbWFwLm9uKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICAgICAgbWFwLm9uKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICAgICAgbWFwLm9uY2UoJ21vdXNldXAnLCB0aGlzLl9vblVwKTtcbiAgICAgICAgICAgIG1hcC5vbmNlKCd0b3VjaGVuZCcsIHRoaXMuX29uVXApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYGRyYWdnYWJsZWAgcHJvcGVydHkgYW5kIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIG1hcmtlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Nob3VsZEJlRHJhZ2dhYmxlPWZhbHNlXSBUdXJucyBkcmFnIGZ1bmN0aW9uYWxpdHkgb24vb2ZmLlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXJrZXIuc2V0RHJhZ2dhYmxlKHRydWUpO1xuICAgICAqL1xuICAgIHNldERyYWdnYWJsZShzaG91bGRCZURyYWdnYWJsZTogYm9vbGVhbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9kcmFnZ2FibGUgPSAhIXNob3VsZEJlRHJhZ2dhYmxlOyAvLyBjb252ZXJ0IHBvc3NpYmxlIHVuZGVmaW5lZCB2YWx1ZSB0byBmYWxzZVxuXG4gICAgICAgIC8vIGhhbmRsZSBjYXNlIHdoZXJlIG1hcCBtYXkgbm90IGV4aXN0IHlldFxuICAgICAgICAvLyBmb3IgZXhhbXBsZSwgd2hlbiBzZXREcmFnZ2FibGUgaXMgY2FsbGVkIGJlZm9yZSBhZGRUb1xuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgICAgIGlmIChtYXApIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRCZURyYWdnYWJsZSkge1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW91c2Vkb3duJywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgICAgIG1hcC5vbigndG91Y2hzdGFydCcsIHRoaXMuX2FkZERyYWdIYW5kbGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW91c2Vkb3duJywgdGhpcy5fYWRkRHJhZ0hhbmRsZXIpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ3RvdWNoc3RhcnQnLCB0aGlzLl9hZGREcmFnSGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1hcmtlciBjYW4gYmUgZHJhZ2dlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBtYXJrZXIgaXMgZHJhZ2dhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNNYXJrZXJEcmFnZ2FibGUgPSBtYXJrZXIuaXNEcmFnZ2FibGUoKTtcbiAgICAgKi9cbiAgICBpc0RyYWdnYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdnYWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgcm90YXRpb25gIHByb3BlcnR5IG9mIHRoZSBtYXJrZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3JvdGF0aW9uPTBdIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgbWFya2VyIChjbG9ja3dpc2UsIGluIGRlZ3JlZXMpLCByZWxhdGl2ZSB0byBpdHMgcmVzcGVjdGl2ZSB7QGxpbmsgTWFya2VyI3NldFJvdGF0aW9uQWxpZ25tZW50fSBzZXR0aW5nLlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXJrZXIuc2V0Um90YXRpb24oNDUpO1xuICAgICAqL1xuICAgIHNldFJvdGF0aW9uKHJvdGF0aW9uOiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fcm90YXRpb24gPSByb3RhdGlvbiB8fCAwO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCByb3RhdGlvbiBhbmdsZSBvZiB0aGUgbWFya2VyIChpbiBkZWdyZWVzKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBjdXJyZW50IHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSBtYXJrZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCByb3RhdGlvbiA9IG1hcmtlci5nZXRSb3RhdGlvbigpO1xuICAgICAqL1xuICAgIGdldFJvdGF0aW9uKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3RhdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgcm90YXRpb25BbGlnbm1lbnRgIHByb3BlcnR5IG9mIHRoZSBtYXJrZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2FsaWdubWVudD0nYXV0byddIFNldHMgdGhlIGByb3RhdGlvbkFsaWdubWVudGAgcHJvcGVydHkgb2YgdGhlIG1hcmtlci5cbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFya2VyLnNldFJvdGF0aW9uQWxpZ25tZW50KCd2aWV3cG9ydCcpO1xuICAgICAqL1xuICAgIHNldFJvdGF0aW9uQWxpZ25tZW50KGFsaWdubWVudDogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50ID0gYWxpZ25tZW50IHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYHJvdGF0aW9uQWxpZ25tZW50YCBwcm9wZXJ0eSBvZiB0aGUgbWFya2VyLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnQgcm90YXRpb25hbCBhbGlnbm1lbnQgb2YgdGhlIG1hcmtlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGFsaWdubWVudCA9IG1hcmtlci5nZXRSb3RhdGlvbkFsaWdubWVudCgpO1xuICAgICAqL1xuICAgIGdldFJvdGF0aW9uQWxpZ25tZW50KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3RhdGlvbkFsaWdubWVudCA9PT0gYGF1dG9gID8gJ3ZpZXdwb3J0JyA6IHRoaXMuX3JvdGF0aW9uQWxpZ25tZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBwaXRjaEFsaWdubWVudGAgcHJvcGVydHkgb2YgdGhlIG1hcmtlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpZ25tZW50XSBTZXRzIHRoZSBgcGl0Y2hBbGlnbm1lbnRgIHByb3BlcnR5IG9mIHRoZSBtYXJrZXIuIElmIGFsaWdubWVudCBpcyAnYXV0bycsIGl0IHdpbGwgYXV0b21hdGljYWxseSBtYXRjaCBgcm90YXRpb25BbGlnbm1lbnRgLlxuICAgICAqIEByZXR1cm5zIHtNYXJrZXJ9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXJrZXIuc2V0UGl0Y2hBbGlnbm1lbnQoJ21hcCcpO1xuICAgICAqL1xuICAgIHNldFBpdGNoQWxpZ25tZW50KGFsaWdubWVudDogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3BpdGNoQWxpZ25tZW50ID0gYWxpZ25tZW50IHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYHBpdGNoQWxpZ25tZW50YCBiZWhhdmlvciBvZiB0aGUgbWFya2VyLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnQgcGl0Y2ggYWxpZ25tZW50IG9mIHRoZSBtYXJrZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBhbGlnbm1lbnQgPSBtYXJrZXIuZ2V0UGl0Y2hBbGlnbm1lbnQoKTtcbiAgICAgKi9cbiAgICBnZXRQaXRjaEFsaWdubWVudCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGl0Y2hBbGlnbm1lbnQgPT09IGBhdXRvYCA/IHRoaXMuZ2V0Um90YXRpb25BbGlnbm1lbnQoKSA6IHRoaXMuX3BpdGNoQWxpZ25tZW50O1xuICAgIH1cbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB7ZWFzZUN1YmljSW5PdXR9IGZyb20gJy4vdXRpbC5qcyc7XG5cbi8qKlxuICogQW4gb2JqZWN0IGZvciBtYWludGFpbmluZyBqdXN0IGVub3VnaCBzdGF0ZSB0byBlYXNlIGEgdmFyaWFibGUuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgRWFzZWRWYXJpYWJsZSB7XG4gICAgX3N0YXJ0OiBudW1iZXI7XG4gICAgX2VuZDogbnVtYmVyO1xuICAgIF9zdGFydFRpbWU6IG51bWJlcjtcbiAgICBfZW5kVGltZTogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5qdW1wVG8oaW5pdGlhbFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFdmFsdWF0ZSB0aGUgY3VycmVudCB2YWx1ZSwgZ2l2ZW4gYSB0aW1lc3RhbXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGltZVN0YW1wIHtudW1iZXJ9IFRpbWUgYXQgd2hpY2ggdG8gZXZhbHVhdGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBFdmFsdWF0ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZ2V0VmFsdWUodGltZVN0YW1wOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAodGltZVN0YW1wIDw9IHRoaXMuX3N0YXJ0VGltZSkgcmV0dXJuIHRoaXMuX3N0YXJ0O1xuICAgICAgICBpZiAodGltZVN0YW1wID49IHRoaXMuX2VuZFRpbWUpIHJldHVybiB0aGlzLl9lbmQ7XG5cbiAgICAgICAgY29uc3QgdCA9IGVhc2VDdWJpY0luT3V0KCh0aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpIC8gKHRoaXMuX2VuZFRpbWUgLSB0aGlzLl9zdGFydFRpbWUpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXJ0ICogKDEgLSB0KSArIHRoaXMuX2VuZCAqIHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYW4gZWFzZSBpcyBpbiBwcm9ncmVzcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0aW1lU3RhbXAge251bWJlcn0gQ3VycmVudCB0aW1lIHN0YW1wLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGVhc2UgaXMgaW4gcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgaXNFYXNpbmcodGltZVN0YW1wOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRpbWVTdGFtcCA+PSB0aGlzLl9zdGFydFRpbWUgJiYgdGltZVN0YW1wIDw9IHRoaXMuX2VuZFRpbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSB2YWx1ZSB3aXRob3V0IGVhc2luZyBhbmQgY2FuY2VsIGFueSBpbiBwcm9ncmVzcyBlYXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHtudW1iZXJ9IE5ldyB2YWx1ZS5cbiAgICAgKi9cbiAgICBqdW1wVG8odmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSAtSW5maW5pdHk7XG4gICAgICAgIHRoaXMuX2VuZFRpbWUgPSAtSW5maW5pdHk7XG5cbiAgICAgICAgdGhpcy5fc3RhcnQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fZW5kID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIGFueSBpbi1wcm9ncmVzcyBlYXNlIGFuZCBiZWdpbiBhIG5ldyBlYXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHtudW1iZXJ9IE5ldyB2YWx1ZSB0byB3aGljaCB0byBlYXNlLlxuICAgICAqIEBwYXJhbSB0aW1lU3RhbXAge251bWJlcn0gQ3VycmVudCB0aW1lIHN0YW1wLlxuICAgICAqIEBwYXJhbSBkdXJhdGlvbiB7bnVtYmVyfSBFYXNlIGR1cmF0aW9uLCBpbiBzYW1lIHVuaXRzIGFzIHRpbWVTdGFtcC5cbiAgICAgKi9cbiAgICBlYXNlVG8odmFsdWU6IG51bWJlciwgdGltZVN0YW1wOiBudW1iZXIsIGR1cmF0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fc3RhcnQgPSB0aGlzLmdldFZhbHVlKHRpbWVTdGFtcCk7XG4gICAgICAgIHRoaXMuX2VuZCA9IHZhbHVlO1xuXG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IHRpbWVTdGFtcDtcbiAgICAgICAgdGhpcy5fZW5kVGltZSA9IHRpbWVTdGFtcCArIGR1cmF0aW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWFzZWRWYXJpYWJsZTtcbiIsIi8vIEBmbG93XG5cbmNvbnN0IGRlZmF1bHRMb2NhbGUgPSB7XG4gICAgJ0F0dHJpYnV0aW9uQ29udHJvbC5Ub2dnbGVBdHRyaWJ1dGlvbic6ICdUb2dnbGUgYXR0cmlidXRpb24nLFxuICAgICdBdHRyaWJ1dGlvbkNvbnRyb2wuTWFwRmVlZGJhY2snOiAnTWFwIGZlZWRiYWNrJyxcbiAgICAnRnVsbHNjcmVlbkNvbnRyb2wuRW50ZXInOiAnRW50ZXIgZnVsbHNjcmVlbicsXG4gICAgJ0Z1bGxzY3JlZW5Db250cm9sLkV4aXQnOiAnRXhpdCBmdWxsc2NyZWVuJyxcbiAgICAnR2VvbG9jYXRlQ29udHJvbC5GaW5kTXlMb2NhdGlvbic6ICdGaW5kIG15IGxvY2F0aW9uJyxcbiAgICAnR2VvbG9jYXRlQ29udHJvbC5Mb2NhdGlvbk5vdEF2YWlsYWJsZSc6ICdMb2NhdGlvbiBub3QgYXZhaWxhYmxlJyxcbiAgICAnTG9nb0NvbnRyb2wuVGl0bGUnOiAnTWFwYm94IGxvZ28nLFxuICAgICdNYXAuVGl0bGUnOiAnTWFwJyxcbiAgICAnTmF2aWdhdGlvbkNvbnRyb2wuUmVzZXRCZWFyaW5nJzogJ1Jlc2V0IGJlYXJpbmcgdG8gbm9ydGgnLFxuICAgICdOYXZpZ2F0aW9uQ29udHJvbC5ab29tSW4nOiAnWm9vbSBpbicsXG4gICAgJ05hdmlnYXRpb25Db250cm9sLlpvb21PdXQnOiAnWm9vbSBvdXQnLFxuICAgICdTY3JvbGxab29tQmxvY2tlci5DdHJsTWVzc2FnZSc6ICdVc2UgY3RybCArIHNjcm9sbCB0byB6b29tIHRoZSBtYXAnLFxuICAgICdTY3JvbGxab29tQmxvY2tlci5DbWRNZXNzYWdlJzogJ1VzZSDijJggKyBzY3JvbGwgdG8gem9vbSB0aGUgbWFwJyxcbiAgICAnVG91Y2hQYW5CbG9ja2VyLk1lc3NhZ2UnOiAnVXNlIHR3byBmaW5nZXJzIHRvIG1vdmUgdGhlIG1hcCdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmF1bHRMb2NhbGU7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge3ZlcnNpb259IGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQge2FzeW5jQWxsLCBleHRlbmQsIGJpbmRBbGwsIHdhcm5PbmNlLCB1bmlxdWVJZCwgaXNTYWZhcmlXaXRoQW50aWFsaWFzaW5nQnVnfSBmcm9tICcuLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi4vdXRpbC9icm93c2VyLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cuanMnO1xuaW1wb3J0ICogYXMgRE9NIGZyb20gJy4uL3V0aWwvZG9tLmpzJztcbmltcG9ydCB7Z2V0SW1hZ2UsIGdldEpTT04sIFJlc291cmNlVHlwZX0gZnJvbSAnLi4vdXRpbC9hamF4LmpzJztcbmltcG9ydCB7UmVxdWVzdE1hbmFnZXIsIGdldE1hcFNlc3Npb25BUEksIHBvc3RNYXBMb2FkRXZlbnQsIEFVVEhfRVJSX01TRywgc3RvcmVBdXRoU3RhdGUsIHJlbW92ZUF1dGhTdGF0ZX0gZnJvbSAnLi4vdXRpbC9tYXBib3guanMnO1xuaW1wb3J0IFN0eWxlIGZyb20gJy4uL3N0eWxlL3N0eWxlLmpzJztcbmltcG9ydCBFdmFsdWF0aW9uUGFyYW1ldGVycyBmcm9tICcuLi9zdHlsZS9ldmFsdWF0aW9uX3BhcmFtZXRlcnMuanMnO1xuaW1wb3J0IFBhaW50ZXIgZnJvbSAnLi4vcmVuZGVyL3BhaW50ZXIuanMnO1xuaW1wb3J0IFRyYW5zZm9ybSBmcm9tICcuLi9nZW8vdHJhbnNmb3JtLmpzJztcbmltcG9ydCBIYXNoIGZyb20gJy4vaGFzaC5qcyc7XG5pbXBvcnQgSGFuZGxlck1hbmFnZXIgZnJvbSAnLi9oYW5kbGVyX21hbmFnZXIuanMnO1xuaW1wb3J0IENhbWVyYSBmcm9tICcuL2NhbWVyYS5qcyc7XG5pbXBvcnQgTG5nTGF0IGZyb20gJy4uL2dlby9sbmdfbGF0LmpzJztcbmltcG9ydCBNZXJjYXRvckNvb3JkaW5hdGUgZnJvbSAnLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuLi9nZW8vbG5nX2xhdF9ib3VuZHMuanMnO1xuaW1wb3J0IFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuaW1wb3J0IEF0dHJpYnV0aW9uQ29udHJvbCBmcm9tICcuL2NvbnRyb2wvYXR0cmlidXRpb25fY29udHJvbC5qcyc7XG5pbXBvcnQgTG9nb0NvbnRyb2wgZnJvbSAnLi9jb250cm9sL2xvZ29fY29udHJvbC5qcyc7XG5pbXBvcnQge3N1cHBvcnRlZH0gZnJvbSAnQG1hcGJveC9tYXBib3gtZ2wtc3VwcG9ydGVkJztcbmltcG9ydCB7UkdCQUltYWdlfSBmcm9tICcuLi91dGlsL2ltYWdlLmpzJztcbmltcG9ydCB7RXZlbnQsIEVycm9yRXZlbnR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQge01hcE1vdXNlRXZlbnR9IGZyb20gJy4vZXZlbnRzLmpzJztcbmltcG9ydCBUYXNrUXVldWUgZnJvbSAnLi4vdXRpbC90YXNrX3F1ZXVlLmpzJztcbmltcG9ydCB3ZWJwU3VwcG9ydGVkIGZyb20gJy4uL3V0aWwvd2VicF9zdXBwb3J0ZWQuanMnO1xuaW1wb3J0IHtQZXJmb3JtYW5jZU1hcmtlcnMsIFBlcmZvcm1hbmNlVXRpbHN9IGZyb20gJy4uL3V0aWwvcGVyZm9ybWFuY2UuanMnO1xuaW1wb3J0IE1hcmtlciBmcm9tICcuLi91aS9tYXJrZXIuanMnO1xuaW1wb3J0IEVhc2VkVmFyaWFibGUgZnJvbSAnLi4vdXRpbC9lYXNlZF92YXJpYWJsZS5qcyc7XG5pbXBvcnQgU291cmNlQ2FjaGUgZnJvbSAnLi4vc291cmNlL3NvdXJjZV9jYWNoZS5qcyc7XG5pbXBvcnQge0dMT0JFX1pPT01fVEhSRVNIT0xEX01BWH0gZnJvbSAnLi4vZ2VvL3Byb2plY3Rpb24vZ2xvYmVfdXRpbC5qcyc7XG5cbmltcG9ydCB7c2V0Q2FjaGVMaW1pdHN9IGZyb20gJy4uL3V0aWwvdGlsZV9yZXF1ZXN0X2NhY2hlLmpzJztcblxuaW1wb3J0IHR5cGUge1BvaW50TGlrZX0gZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgdHlwZSB7UmVxdWVzdFRyYW5zZm9ybUZ1bmN0aW9ufSBmcm9tICcuLi91dGlsL21hcGJveC5qcyc7XG5pbXBvcnQgdHlwZSB7TG5nTGF0TGlrZX0gZnJvbSAnLi4vZ2VvL2xuZ19sYXQuanMnO1xuaW1wb3J0IHR5cGUge0xuZ0xhdEJvdW5kc0xpa2V9IGZyb20gJy4uL2dlby9sbmdfbGF0X2JvdW5kcy5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVPcHRpb25zLCBTdHlsZVNldHRlck9wdGlvbnN9IGZyb20gJy4uL3N0eWxlL3N0eWxlLmpzJztcbmltcG9ydCB0eXBlIHtNYXBFdmVudCwgTWFwRGF0YUV2ZW50fSBmcm9tICcuL2V2ZW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7Q3VzdG9tTGF5ZXJJbnRlcmZhY2V9IGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyL2N1c3RvbV9zdHlsZV9sYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7U3R5bGVJbWFnZUludGVyZmFjZSwgU3R5bGVJbWFnZU1ldGFkYXRhfSBmcm9tICcuLi9zdHlsZS9zdHlsZV9pbWFnZS5qcyc7XG5cbmltcG9ydCB0eXBlIFNjcm9sbFpvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9zY3JvbGxfem9vbS5qcyc7XG5pbXBvcnQgdHlwZSBCb3hab29tSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvYm94X3pvb20uanMnO1xuaW1wb3J0IHR5cGUge1RvdWNoUGl0Y2hIYW5kbGVyfSBmcm9tICcuL2hhbmRsZXIvdG91Y2hfem9vbV9yb3RhdGUuanMnO1xuaW1wb3J0IHR5cGUgRHJhZ1JvdGF0ZUhhbmRsZXIgZnJvbSAnLi9oYW5kbGVyL3NoaW0vZHJhZ19yb3RhdGUuanMnO1xuaW1wb3J0IHR5cGUgRHJhZ1BhbkhhbmRsZXIsIHtEcmFnUGFuT3B0aW9uc30gZnJvbSAnLi9oYW5kbGVyL3NoaW0vZHJhZ19wYW4uanMnO1xuaW1wb3J0IHR5cGUgS2V5Ym9hcmRIYW5kbGVyIGZyb20gJy4vaGFuZGxlci9rZXlib2FyZC5qcyc7XG5pbXBvcnQgdHlwZSBEb3VibGVDbGlja1pvb21IYW5kbGVyIGZyb20gJy4vaGFuZGxlci9zaGltL2RibGNsaWNrX3pvb20uanMnO1xuaW1wb3J0IHR5cGUgVG91Y2hab29tUm90YXRlSGFuZGxlciBmcm9tICcuL2hhbmRsZXIvc2hpbS90b3VjaF96b29tX3JvdGF0ZS5qcyc7XG5pbXBvcnQgZGVmYXVsdExvY2FsZSBmcm9tICcuL2RlZmF1bHRfbG9jYWxlLmpzJztcbmltcG9ydCB0eXBlIHtUYXNrSUR9IGZyb20gJy4uL3V0aWwvdGFza19xdWV1ZS5qcyc7XG5pbXBvcnQgdHlwZSB7Q2FuY2VsYWJsZX0gZnJvbSAnLi4vdHlwZXMvY2FuY2VsYWJsZS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gICAgTGF5ZXJTcGVjaWZpY2F0aW9uLFxuICAgIEZpbHRlclNwZWNpZmljYXRpb24sXG4gICAgU3R5bGVTcGVjaWZpY2F0aW9uLFxuICAgIExpZ2h0U3BlY2lmaWNhdGlvbixcbiAgICBUZXJyYWluU3BlY2lmaWNhdGlvbixcbiAgICBGb2dTcGVjaWZpY2F0aW9uLFxuICAgIFNvdXJjZVNwZWNpZmljYXRpb24sXG4gICAgUHJvamVjdGlvblNwZWNpZmljYXRpb24sXG4gICAgUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb24sXG4gICAgVHJhbnNpdGlvblNwZWNpZmljYXRpb25cbn0gZnJvbSAnLi4vc3R5bGUtc3BlYy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSBTdHlsZUxheWVyIGZyb20gJy4uL3N0eWxlL3N0eWxlX2xheWVyLmpzJztcbmltcG9ydCB0eXBlIHtFbGV2YXRpb25RdWVyeU9wdGlvbnN9IGZyb20gJy4uL3RlcnJhaW4vZWxldmF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHtTb3VyY2V9IGZyb20gJy4uL3NvdXJjZS9zb3VyY2UuanMnO1xuaW1wb3J0IHR5cGUge1F1ZXJ5RmVhdHVyZX0gZnJvbSAnLi4vdXRpbC92ZWN0b3J0aWxlX3RvX2dlb2pzb24uanMnO1xuaW1wb3J0IHR5cGUge1F1ZXJ5UmVzdWx0fSBmcm9tICcuLi9kYXRhL2ZlYXR1cmVfaW5kZXguanMnO1xuXG5leHBvcnQgdHlwZSBDb250cm9sUG9zaXRpb24gPSAndG9wLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ2JvdHRvbS1yaWdodCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xudHlwZSBJQ29udHJvbCA9IHtcbiAgICBvbkFkZChtYXA6IE1hcCk6IEhUTUxFbGVtZW50O1xuICAgIG9uUmVtb3ZlKG1hcDogTWFwKTogdm9pZDtcblxuICAgICtnZXREZWZhdWx0UG9zaXRpb24/OiAoKSA9PiBDb250cm9sUG9zaXRpb247XG4gICAgK19zZXRMYW5ndWFnZT86IChsYW5ndWFnZTogP3N0cmluZykgPT4gdm9pZDtcbn1cbi8qIGVzbGludC1lbmFibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cblxuZXhwb3J0IGNvbnN0IEFWRVJBR0VfRUxFVkFUSU9OX1NBTVBMSU5HX0lOVEVSVkFMID0gNTAwOyAvLyBtc1xuZXhwb3J0IGNvbnN0IEFWRVJBR0VfRUxFVkFUSU9OX0VBU0VfVElNRSA9IDMwMDsgLy8gbXNcbmV4cG9ydCBjb25zdCBBVkVSQUdFX0VMRVZBVElPTl9FQVNFX1RIUkVTSE9MRCA9IDE7IC8vIG1ldGVyc1xuZXhwb3J0IGNvbnN0IEFWRVJBR0VfRUxFVkFUSU9OX0NIQU5HRV9USFJFU0hPTEQgPSAxZS00OyAvLyBtZXRlcnNcblxudHlwZSBNYXBPcHRpb25zID0ge1xuICAgIGhhc2g/OiBib29sZWFuIHwgc3RyaW5nLFxuICAgIGludGVyYWN0aXZlPzogYm9vbGVhbixcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50IHwgc3RyaW5nLFxuICAgIGJlYXJpbmdTbmFwPzogbnVtYmVyLFxuICAgIGF0dHJpYnV0aW9uQ29udHJvbD86IGJvb2xlYW4sXG4gICAgY3VzdG9tQXR0cmlidXRpb24/OiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+LFxuICAgIGxvZ29Qb3NpdGlvbj86IENvbnRyb2xQb3NpdGlvbixcbiAgICBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PzogYm9vbGVhbixcbiAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI/OiBib29sZWFuLFxuICAgIGFudGlhbGlhcz86IGJvb2xlYW4sXG4gICAgcmVmcmVzaEV4cGlyZWRUaWxlcz86IGJvb2xlYW4sXG4gICAgbWF4Qm91bmRzPzogTG5nTGF0Qm91bmRzTGlrZSxcbiAgICBzY3JvbGxab29tPzogYm9vbGVhbixcbiAgICBtaW5ab29tPzogP251bWJlcixcbiAgICBtYXhab29tPzogP251bWJlcixcbiAgICBtaW5QaXRjaD86ID9udW1iZXIsXG4gICAgbWF4UGl0Y2g/OiA/bnVtYmVyLFxuICAgIGJveFpvb20/OiBib29sZWFuLFxuICAgIGRyYWdSb3RhdGU/OiBib29sZWFuLFxuICAgIGRyYWdQYW4/OiBEcmFnUGFuT3B0aW9ucyxcbiAgICBrZXlib2FyZD86IGJvb2xlYW4sXG4gICAgZG91YmxlQ2xpY2tab29tPzogYm9vbGVhbixcbiAgICB0b3VjaFpvb21Sb3RhdGU/OiBib29sZWFuLFxuICAgIHRvdWNoUGl0Y2g/OiBib29sZWFuLFxuICAgIGNvb3BlcmF0aXZlR2VzdHVyZXM/OiBib29sZWFuLFxuICAgIHRyYWNrUmVzaXplPzogYm9vbGVhbixcbiAgICBjZW50ZXI/OiBMbmdMYXRMaWtlLFxuICAgIHpvb20/OiBudW1iZXIsXG4gICAgYmVhcmluZz86IG51bWJlcixcbiAgICBwaXRjaD86IG51bWJlcixcbiAgICBvcHRpbWl6ZUZvclRlcnJhaW4/OiBib29sZWFuLFxuICAgIHJlbmRlcldvcmxkQ29waWVzPzogYm9vbGVhbixcbiAgICBtaW5UaWxlQ2FjaGVTaXplPzogbnVtYmVyLFxuICAgIG1heFRpbGVDYWNoZVNpemU/OiBudW1iZXIsXG4gICAgdHJhbnNmb3JtUmVxdWVzdD86IFJlcXVlc3RUcmFuc2Zvcm1GdW5jdGlvbixcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nLFxuICAgIHRlc3RNb2RlOiA/Ym9vbGVhbixcbiAgICBsb2NhbGU/OiBPYmplY3QsXG4gICAgcHJvamVjdGlvbj86IFByb2plY3Rpb25TcGVjaWZpY2F0aW9uIHwgc3RyaW5nLFxuICAgIGxhbmd1YWdlPzogc3RyaW5nLFxuICAgIHdvcmxkdmlldz86IHN0cmluZ1xufTtcblxuY29uc3QgZGVmYXVsdE1pblpvb20gPSAtMjtcbmNvbnN0IGRlZmF1bHRNYXhab29tID0gMjI7XG5cbi8vIHRoZSBkZWZhdWx0IHZhbHVlcywgYnV0IGFsc28gdGhlIHZhbGlkIHJhbmdlXG5jb25zdCBkZWZhdWx0TWluUGl0Y2ggPSAwO1xuY29uc3QgZGVmYXVsdE1heFBpdGNoID0gODU7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIGNlbnRlcjogWzAsIDBdLFxuICAgIHpvb206IDAsXG4gICAgYmVhcmluZzogMCxcbiAgICBwaXRjaDogMCxcblxuICAgIG1pblpvb206IGRlZmF1bHRNaW5ab29tLFxuICAgIG1heFpvb206IGRlZmF1bHRNYXhab29tLFxuXG4gICAgbWluUGl0Y2g6IGRlZmF1bHRNaW5QaXRjaCxcbiAgICBtYXhQaXRjaDogZGVmYXVsdE1heFBpdGNoLFxuXG4gICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgc2Nyb2xsWm9vbTogdHJ1ZSxcbiAgICBib3hab29tOiB0cnVlLFxuICAgIGRyYWdSb3RhdGU6IHRydWUsXG4gICAgZHJhZ1BhbjogdHJ1ZSxcbiAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICBkb3VibGVDbGlja1pvb206IHRydWUsXG4gICAgdG91Y2hab29tUm90YXRlOiB0cnVlLFxuICAgIHRvdWNoUGl0Y2g6IHRydWUsXG4gICAgY29vcGVyYXRpdmVHZXN0dXJlczogZmFsc2UsXG5cbiAgICBiZWFyaW5nU25hcDogNyxcbiAgICBjbGlja1RvbGVyYW5jZTogMyxcbiAgICBwaXRjaFdpdGhSb3RhdGU6IHRydWUsXG5cbiAgICBoYXNoOiBmYWxzZSxcbiAgICBhdHRyaWJ1dGlvbkNvbnRyb2w6IHRydWUsXG5cbiAgICBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiBmYWxzZSxcbiAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IGZhbHNlLFxuICAgIHRyYWNrUmVzaXplOiB0cnVlLFxuICAgIG9wdGltaXplRm9yVGVycmFpbjogdHJ1ZSxcbiAgICByZW5kZXJXb3JsZENvcGllczogdHJ1ZSxcbiAgICByZWZyZXNoRXhwaXJlZFRpbGVzOiB0cnVlLFxuICAgIG1pblRpbGVDYWNoZVNpemU6IG51bGwsXG4gICAgbWF4VGlsZUNhY2hlU2l6ZTogbnVsbCxcbiAgICBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6ICdzYW5zLXNlcmlmJyxcbiAgICBsb2NhbEZvbnRGYW1pbHk6IG51bGwsXG4gICAgdHJhbnNmb3JtUmVxdWVzdDogbnVsbCxcbiAgICBhY2Nlc3NUb2tlbjogbnVsbCxcbiAgICBmYWRlRHVyYXRpb246IDMwMCxcbiAgICBjcm9zc1NvdXJjZUNvbGxpc2lvbnM6IHRydWVcbn07XG5cbi8qKlxuICogVGhlIGBNYXBgIG9iamVjdCByZXByZXNlbnRzIHRoZSBtYXAgb24geW91ciBwYWdlLiBJdCBleHBvc2VzIG1ldGhvZHNcbiAqIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlIHlvdSB0byBwcm9ncmFtbWF0aWNhbGx5IGNoYW5nZSB0aGUgbWFwLFxuICogYW5kIGZpcmVzIGV2ZW50cyBhcyB1c2VycyBpbnRlcmFjdCB3aXRoIGl0LlxuICpcbiAqIFlvdSBjcmVhdGUgYSBgTWFwYCBieSBzcGVjaWZ5aW5nIGEgYGNvbnRhaW5lcmAgYW5kIG90aGVyIG9wdGlvbnMuXG4gKiBUaGVuIE1hcGJveCBHTCBKUyBpbml0aWFsaXplcyB0aGUgbWFwIG9uIHRoZSBwYWdlIGFuZCByZXR1cm5zIHlvdXIgYE1hcGBcbiAqIG9iamVjdC5cbiAqXG4gKiBAZXh0ZW5kcyBFdmVudGVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IG9wdGlvbnMuY29udGFpbmVyIFRoZSBIVE1MIGVsZW1lbnQgaW4gd2hpY2ggTWFwYm94IEdMIEpTIHdpbGwgcmVuZGVyIHRoZSBtYXAsIG9yIHRoZSBlbGVtZW50J3Mgc3RyaW5nIGBpZGAuIFRoZSBzcGVjaWZpZWQgZWxlbWVudCBtdXN0IGhhdmUgbm8gY2hpbGRyZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluWm9vbT0wXSBUaGUgbWluaW11bSB6b29tIGxldmVsIG9mIHRoZSBtYXAgKDAtMjQpLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFpvb209MjJdIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgb2YgdGhlIG1hcCAoMC0yNCkuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluUGl0Y2g9MF0gVGhlIG1pbmltdW0gcGl0Y2ggb2YgdGhlIG1hcCAoMC04NSkuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4UGl0Y2g9ODVdIFRoZSBtYXhpbXVtIHBpdGNoIG9mIHRoZSBtYXAgKDAtODUpLlxuICogQHBhcmFtIHtPYmplY3QgfCBzdHJpbmd9IG9wdGlvbnMuc3R5bGUgVGhlIG1hcCdzIE1hcGJveCBzdHlsZS4gVGhpcyBtdXN0IGJlIGFuIGEgSlNPTiBvYmplY3QgY29uZm9ybWluZyB0b1xuICogdGhlIHNjaGVtYSBkZXNjcmliZWQgaW4gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyksIG9yIGEgVVJMXG4gKiB0byBzdWNoIEpTT04uIENhbiBhY2NlcHQgYSBudWxsIHZhbHVlIHRvIGFsbG93IGFkZGluZyBhIHN0eWxlIG1hbnVhbGx5LlxuICpcbiAqIFRvIGxvYWQgYSBzdHlsZSBmcm9tIHRoZSBNYXBib3ggQVBJLCB5b3UgY2FuIHVzZSBhIFVSTCBvZiB0aGUgZm9ybSBgbWFwYm94Oi8vc3R5bGVzLzpvd25lci86c3R5bGVgLFxuICogd2hlcmUgYDpvd25lcmAgaXMgeW91ciBNYXBib3ggYWNjb3VudCBuYW1lIGFuZCBgOnN0eWxlYCBpcyB0aGUgc3R5bGUgSUQuIFlvdSBjYW4gYWxzbyB1c2UgYVxuICogW01hcGJveC1vd25lZCBzdHlsZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vYXBpL21hcHMvc3R5bGVzLyNtYXBib3gtc3R5bGVzKTpcbiAqXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zdHJlZXRzLXYxMWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L291dGRvb3JzLXYxMWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2xpZ2h0LXYxMGBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2RhcmstdjEwYFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvc2F0ZWxsaXRlLXY5YFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvc2F0ZWxsaXRlLXN0cmVldHMtdjExYFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvbmF2aWdhdGlvbi1kYXktdjFgXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9uYXZpZ2F0aW9uLW5pZ2h0LXYxYC5cbiAqXG4gKiBUaWxlc2V0cyBob3N0ZWQgd2l0aCBNYXBib3ggY2FuIGJlIHN0eWxlLW9wdGltaXplZCBpZiB5b3UgYXBwZW5kIGA/b3B0aW1pemU9dHJ1ZWAgdG8gdGhlIGVuZCBvZiB5b3VyIHN0eWxlIFVSTCwgbGlrZSBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9zdHJlZXRzLXYxMT9vcHRpbWl6ZT10cnVlYC5cbiAqIExlYXJuIG1vcmUgYWJvdXQgc3R5bGUtb3B0aW1pemVkIHZlY3RvciB0aWxlcyBpbiBvdXIgW0FQSSBkb2N1bWVudGF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL2FwaS1kb2N1bWVudGF0aW9uL21hcHMvI3JldHJpZXZlLXRpbGVzKS5cbiAqXG4gKiBAcGFyYW0geyhib29sZWFufHN0cmluZyl9IFtvcHRpb25zLmhhc2g9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCdzIFtwb3NpdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEpICh6b29tLCBjZW50ZXIgbGF0aXR1ZGUsIGNlbnRlciBsb25naXR1ZGUsIGJlYXJpbmcsIGFuZCBwaXRjaCkgd2lsbCBiZSBzeW5jZWQgd2l0aCB0aGUgaGFzaCBmcmFnbWVudCBvZiB0aGUgcGFnZSdzIFVSTC5cbiAqICAgRm9yIGV4YW1wbGUsIGBodHRwOi8vcGF0aC90by9teS9wYWdlLmh0bWwjMi41OS8zOS4yNi81My4wNy8tMjQuMS82MGAuXG4gKiAgIEFuIGFkZGl0aW9uYWwgc3RyaW5nIG1heSBvcHRpb25hbGx5IGJlIHByb3ZpZGVkIHRvIGluZGljYXRlIGEgcGFyYW1ldGVyLXN0eWxlZCBoYXNoLFxuICogICBmb3IgZXhhbXBsZSBodHRwOi8vcGF0aC90by9teS9wYWdlLmh0bWwjbWFwPTIuNTkvMzkuMjYvNTMuMDcvLTI0LjEvNjAmZm9vPWJhciwgd2hlcmUgYGZvb2BcbiAqICAgaXMgYSBjdXN0b20gcGFyYW1ldGVyIGFuZCBgYmFyYCBpcyBhbiBhcmJpdHJhcnkgaGFzaCBkaXN0aW5jdCBmcm9tIHRoZSBtYXAgaGFzaC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaW50ZXJhY3RpdmU9dHJ1ZV0gSWYgYGZhbHNlYCwgbm8gbW91c2UsIHRvdWNoLCBvciBrZXlib2FyZCBsaXN0ZW5lcnMgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgbWFwLCBzbyBpdCB3aWxsIG5vdCByZXNwb25kIHRvIGludGVyYWN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJlYXJpbmdTbmFwPTddIFRoZSB0aHJlc2hvbGQsIG1lYXN1cmVkIGluIGRlZ3JlZXMsIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHRoZSBtYXAnc1xuICogICBiZWFyaW5nIHdpbGwgc25hcCB0byBub3J0aC4gRm9yIGV4YW1wbGUsIHdpdGggYSBgYmVhcmluZ1NuYXBgIG9mIDcsIGlmIHRoZSB1c2VyIHJvdGF0ZXNcbiAqICAgdGhlIG1hcCB3aXRoaW4gNyBkZWdyZWVzIG9mIG5vcnRoLCB0aGUgbWFwIHdpbGwgYXV0b21hdGljYWxseSBzbmFwIHRvIGV4YWN0IG5vcnRoLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5waXRjaFdpdGhSb3RhdGU9dHJ1ZV0gSWYgYGZhbHNlYCwgdGhlIG1hcCdzIHBpdGNoICh0aWx0KSBjb250cm9sIHdpdGggXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIHdpbGwgYmUgZGlzYWJsZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY2xpY2tUb2xlcmFuY2U9M10gVGhlIG1heCBudW1iZXIgb2YgcGl4ZWxzIGEgdXNlciBjYW4gc2hpZnQgdGhlIG1vdXNlIHBvaW50ZXIgZHVyaW5nIGEgY2xpY2sgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBjbGljayAoYXMgb3Bwb3NlZCB0byBhIG1vdXNlIGRyYWcpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2w9dHJ1ZV0gSWYgYHRydWVgLCBhbiB7QGxpbmsgQXR0cmlidXRpb25Db250cm9sfSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBtYXAuXG4gKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZz59IFtvcHRpb25zLmN1c3RvbUF0dHJpYnV0aW9uPW51bGxdIFN0cmluZyBvciBzdHJpbmdzIHRvIHNob3cgaW4gYW4ge0BsaW5rIEF0dHJpYnV0aW9uQ29udHJvbH0uIE9ubHkgYXBwbGljYWJsZSBpZiBgb3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2xgIGlzIGB0cnVlYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2dvUG9zaXRpb249J2JvdHRvbS1sZWZ0J10gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgTWFwYm94IHdvcmRtYXJrIG9uIHRoZSBtYXAuIFZhbGlkIG9wdGlvbnMgYXJlIGB0b3AtbGVmdGAsYHRvcC1yaWdodGAsIGBib3R0b20tbGVmdGAsIGBib3R0b20tcmlnaHRgLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBJZiBgdHJ1ZWAsIG1hcCBjcmVhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIHBlcmZvcm1hbmNlIG9mIE1hcGJveCBHTCBKUyB3b3VsZCBiZSBkcmFtYXRpY2FsbHkgd29yc2UgdGhhbiBleHBlY3RlZCAoYSBzb2Z0d2FyZSByZW5kZXJlciB3b3VsZCBiZSB1c2VkKS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJlc2VydmVEcmF3aW5nQnVmZmVyPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZSBtYXAncyBjYW52YXMgY2FuIGJlIGV4cG9ydGVkIHRvIGEgUE5HIHVzaW5nIGBtYXAuZ2V0Q2FudmFzKCkudG9EYXRhVVJMKClgLiBUaGlzIGlzIGBmYWxzZWAgYnkgZGVmYXVsdCBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYW50aWFsaWFzPWZhbHNlXSBJZiBgdHJ1ZWAsIHRoZSBnbCBjb250ZXh0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIFtNU0FBIGFudGlhbGlhc2luZ10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTXVsdGlzYW1wbGVfYW50aS1hbGlhc2luZyksIHdoaWNoIGNhbiBiZSB1c2VmdWwgZm9yIGFudGlhbGlhc2luZyBjdXN0b20gbGF5ZXJzLiBUaGlzIGlzIGBmYWxzZWAgYnkgZGVmYXVsdCBhcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVmcmVzaEV4cGlyZWRUaWxlcz10cnVlXSBJZiBgZmFsc2VgLCB0aGUgbWFwIHdvbid0IGF0dGVtcHQgdG8gcmUtcmVxdWVzdCB0aWxlcyBvbmNlIHRoZXkgZXhwaXJlIHBlciB0aGVpciBIVFRQIGBjYWNoZUNvbnRyb2xgL2BleHBpcmVzYCBoZWFkZXJzLlxuICogQHBhcmFtIHtMbmdMYXRCb3VuZHNMaWtlfSBbb3B0aW9ucy5tYXhCb3VuZHM9bnVsbF0gSWYgc2V0LCB0aGUgbWFwIHdpbGwgYmUgY29uc3RyYWluZWQgdG8gdGhlIGdpdmVuIGJvdW5kcy5cbiAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3R9IFtvcHRpb25zLnNjcm9sbFpvb209dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuIEFuIGBPYmplY3RgIHZhbHVlIGlzIHBhc3NlZCBhcyBvcHRpb25zIHRvIHtAbGluayBTY3JvbGxab29tSGFuZGxlciNlbmFibGV9LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5ib3hab29tPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkIChzZWUge0BsaW5rIEJveFpvb21IYW5kbGVyfSkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRyYWdSb3RhdGU9dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQgKHNlZSB7QGxpbmsgRHJhZ1JvdGF0ZUhhbmRsZXJ9KS5cbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IE9iamVjdH0gW29wdGlvbnMuZHJhZ1Bhbj10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC4gQW4gYE9iamVjdGAgdmFsdWUgaXMgcGFzc2VkIGFzIG9wdGlvbnMgdG8ge0BsaW5rIERyYWdQYW5IYW5kbGVyI2VuYWJsZX0uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmtleWJvYXJkPXRydWVdIElmIGB0cnVlYCwga2V5Ym9hcmQgc2hvcnRjdXRzIGFyZSBlbmFibGVkIChzZWUge0BsaW5rIEtleWJvYXJkSGFuZGxlcn0pLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kb3VibGVDbGlja1pvb209dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQgKHNlZSB7QGxpbmsgRG91YmxlQ2xpY2tab29tSGFuZGxlcn0pLlxuICogQHBhcmFtIHtib29sZWFuIHwgT2JqZWN0fSBbb3B0aW9ucy50b3VjaFpvb21Sb3RhdGU9dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLiBBbiBgT2JqZWN0YCB2YWx1ZSBpcyBwYXNzZWQgYXMgb3B0aW9ucyB0byB7QGxpbmsgVG91Y2hab29tUm90YXRlSGFuZGxlciNlbmFibGV9LlxuICogQHBhcmFtIHtib29sZWFuIHwgT2JqZWN0fSBbb3B0aW9ucy50b3VjaFBpdGNoPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiZHJhZyB0byBwaXRjaFwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuIEFuIGBPYmplY3RgIHZhbHVlIGlzIHBhc3NlZCBhcyBvcHRpb25zIHRvIHtAbGluayBUb3VjaFBpdGNoSGFuZGxlcn0uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNvb3BlcmF0aXZlR2VzdHVyZXNdIElmIGB0cnVlYCwgc2Nyb2xsIHpvb20gd2lsbCByZXF1aXJlIHByZXNzaW5nIHRoZSBjdHJsIG9yIOKMmCBrZXkgd2hpbGUgc2Nyb2xsaW5nIHRvIHpvb20gbWFwLCBhbmQgdG91Y2ggcGFuIHdpbGwgcmVxdWlyZSB1c2luZyB0d28gZmluZ2VycyB3aGlsZSBwYW5uaW5nIHRvIG1vdmUgdGhlIG1hcC4gVG91Y2ggcGl0Y2ggd2lsbCByZXF1aXJlIHRocmVlIGZpbmdlcnMgdG8gYWN0aXZhdGUgaWYgZW5hYmxlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhY2tSZXNpemU9dHJ1ZV0gSWYgYHRydWVgLCB0aGUgbWFwIHdpbGwgYXV0b21hdGljYWxseSByZXNpemUgd2hlbiB0aGUgYnJvd3NlciB3aW5kb3cgcmVzaXplcy5cbiAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gW29wdGlvbnMuY2VudGVyPVswLCAwXV0gVGhlIGluaXRpYWwgZ2VvZ3JhcGhpY2FsIFtjZW50ZXJwb2ludF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEjY2VudGVyKSBvZiB0aGUgbWFwLiBJZiBgY2VudGVyYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYFswLCAwXWAgTm90ZTogTWFwYm94IEdMIHVzZXMgbG9uZ2l0dWRlLCBsYXRpdHVkZSBjb29yZGluYXRlIG9yZGVyIChhcyBvcHBvc2VkIHRvIGxhdGl0dWRlLCBsb25naXR1ZGUpIHRvIG1hdGNoIEdlb0pTT04uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuem9vbT0wXSBUaGUgaW5pdGlhbCBbem9vbV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEjem9vbSkgbGV2ZWwgb2YgdGhlIG1hcC4gSWYgYHpvb21gIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMsIE1hcGJveCBHTCBKUyB3aWxsIGxvb2sgZm9yIGl0IGluIHRoZSBtYXAncyBzdHlsZSBvYmplY3QuIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlLCBlaXRoZXIsIGl0IHdpbGwgZGVmYXVsdCB0byBgMGAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmVhcmluZz0wXSBUaGUgaW5pdGlhbCBbYmVhcmluZ10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEjYmVhcmluZykgKHJvdGF0aW9uKSBvZiB0aGUgbWFwLCBtZWFzdXJlZCBpbiBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gbm9ydGguIElmIGBiZWFyaW5nYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYDBgLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnBpdGNoPTBdIFRoZSBpbml0aWFsIFtwaXRjaF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9jYW1lcmEjcGl0Y2gpICh0aWx0KSBvZiB0aGUgbWFwLCBtZWFzdXJlZCBpbiBkZWdyZWVzIGF3YXkgZnJvbSB0aGUgcGxhbmUgb2YgdGhlIHNjcmVlbiAoMC04NSkuIElmIGBwaXRjaGAgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3Igb3B0aW9ucywgTWFwYm94IEdMIEpTIHdpbGwgbG9vayBmb3IgaXQgaW4gdGhlIG1hcCdzIHN0eWxlIG9iamVjdC4gSWYgaXQgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgc3R5bGUsIGVpdGhlciwgaXQgd2lsbCBkZWZhdWx0IHRvIGAwYC5cbiAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzTGlrZX0gW29wdGlvbnMuYm91bmRzPW51bGxdIFRoZSBpbml0aWFsIGJvdW5kcyBvZiB0aGUgbWFwLiBJZiBgYm91bmRzYCBpcyBzcGVjaWZpZWQsIGl0IG92ZXJyaWRlcyBgY2VudGVyYCBhbmQgYHpvb21gIGNvbnN0cnVjdG9yIG9wdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZml0Qm91bmRzT3B0aW9uc10gQSB7QGxpbmsgTWFwI2ZpdEJvdW5kc30gb3B0aW9ucyBvYmplY3QgdG8gdXNlIF9vbmx5XyB3aGVuIGZpdHRpbmcgdGhlIGluaXRpYWwgYGJvdW5kc2AgcHJvdmlkZWQgYWJvdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFuZ3VhZ2U9bnVsbF0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBsYW5ndWFnZSB1c2VkIGZvciB0aGUgbWFwJ3MgZGF0YSBhbmQgVUkgY29tcG9uZW50cy4gTGFuZ3VhZ2VzIGNhbiBvbmx5IGJlIHNldCBvbiBNYXBib3ggdmVjdG9yIHRpbGUgc291cmNlcy5cbiAqICAgQnkgZGVmYXVsdCwgR0wgSlMgd2lsbCBub3Qgc2V0IGEgbGFuZ3VhZ2Ugc28gdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgTWFwYm94IHRpbGVzIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgdmVjdG9yIHRpbGUgc291cmNlJ3MgVGlsZUpTT04uXG4gKiAgIFZhbGlkIGxhbmd1YWdlIHN0cmluZ3MgbXVzdCBiZSBhIFtCQ1AtNDcgbGFuZ3VhZ2UgY29kZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSUVURl9sYW5ndWFnZV90YWcjTGlzdF9vZl9zdWJ0YWdzKS4gVW5zdXBwb3J0ZWQgQkNQLTQ3IGNvZGVzIHdpbGwgbm90IGluY2x1ZGUgYW55IHRyYW5zbGF0aW9ucy4gSW52YWxpZCBjb2RlcyB3aWxsIHJlc3VsdCBpbiBhbiByZWNvdmVyYWJsZSBlcnJvci5cbiAqICAgSWYgYSBsYWJlbCBoYXMgbm8gdHJhbnNsYXRpb24gZm9yIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSwgaXQgd2lsbCBkaXNwbGF5IGluIHRoZSBsYWJlbCdzIGxvY2FsIGxhbmd1YWdlLlxuICogICBJZiBvcHRpb24gaXMgc2V0IHRvIGBhdXRvYCwgR0wgSlMgd2lsbCBzZWxlY3QgYSB1c2VyJ3MgcHJlZmVycmVkIGxhbmd1YWdlIGFzIGRldGVybWluZWQgYnkgdGhlIGJyb3dzZXIncyBgd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZWAgcHJvcGVydHkuXG4gKiAgIElmIHRoZSBgbG9jYWxlYCBwcm9wZXJ0eSBpcyBub3Qgc2V0IHNlcGFyYXRlbHksIHRoaXMgbGFuZ3VhZ2Ugd2lsbCBhbHNvIGJlIHVzZWQgdG8gbG9jYWxpemUgdGhlIFVJIGZvciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLndvcmxkdmlld10gU2V0cyB0aGUgbWFwJ3Mgd29ybGR2aWV3LiBBIHdvcmxkdmlldyBkZXRlcm1pbmVzIHRoZSB3YXkgdGhhdCBjZXJ0YWluIGRpc3B1dGVkIGJvdW5kYXJpZXNcbiAgICAgKiBhcmUgcmVuZGVyZWQuIEJ5IGRlZmF1bHQsIEdMIEpTIHdpbGwgbm90IHNldCBhIHdvcmxkdmlldyBzbyB0aGF0IHRoZSB3b3JsZHZpZXcgb2YgTWFwYm94IHRpbGVzIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgdmVjdG9yIHRpbGUgc291cmNlJ3MgVGlsZUpTT04uXG4gICAgICogVmFsaWQgd29ybGR2aWV3IHN0cmluZ3MgbXVzdCBiZSBhbiBbSVNPIGFscGhhLTIgY291bnRyeSBjb2RlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fMzE2Ni0xI0N1cnJlbnRfY29kZXMpLiBVbnN1cHBvcnRlZFxuICAgICAqIElTTyBhbHBoYS0yIGNvZGVzIHdpbGwgZmFsbCBiYWNrIHRvIHRoZSBUaWxlSlNPTidzIGRlZmF1bHQgd29ybGR2aWV3LiBJbnZhbGlkIGNvZGVzIHdpbGwgcmVzdWx0IGluIGEgcmVjb3ZlcmFibGUgZXJyb3IuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm9wdGltaXplRm9yVGVycmFpbj10cnVlXSBXaXRoIHRlcnJhaW4gb24sIGlmIGB0cnVlYCwgdGhlIG1hcCB3aWxsIHJlbmRlciBmb3IgcGVyZm9ybWFuY2UgcHJpb3JpdHksIHdoaWNoIG1heSBsZWFkIHRvIGxheWVyIHJlb3JkZXJpbmcgYWxsb3dpbmcgdG8gbWF4aW1pemUgcGVyZm9ybWFuY2UgKGxheWVycyB0aGF0IGFyZSBkcmFwZWQgb3ZlciB0ZXJyYWluIHdpbGwgYmUgZHJhd24gZmlyc3QsIGluY2x1ZGluZyBmaWxsLCBsaW5lLCBiYWNrZ3JvdW5kLCBoaWxsc2hhZGUgYW5kIHJhc3RlcikuIE90aGVyd2lzZSwgaWYgc2V0IHRvIGBmYWxzZWAsIHRoZSBtYXAgd2lsbCBhbHdheXMgYmUgZHJhd24gZm9yIGxheWVyIG9yZGVyIHByaW9yaXR5LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZW5kZXJXb3JsZENvcGllcz10cnVlXSBJZiBgdHJ1ZWAsIG11bHRpcGxlIGNvcGllcyBvZiB0aGUgd29ybGQgd2lsbCBiZSByZW5kZXJlZCBzaWRlIGJ5IHNpZGUgYmV5b25kIC0xODAgYW5kIDE4MCBkZWdyZWVzIGxvbmdpdHVkZS4gSWYgc2V0IHRvIGBmYWxzZWA6XG4gKiAtIFdoZW4gdGhlIG1hcCBpcyB6b29tZWQgb3V0IGZhciBlbm91Z2ggdGhhdCBhIHNpbmdsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd29ybGQgZG9lcyBub3QgZmlsbCB0aGUgbWFwJ3MgZW50aXJlXG4gKiBjb250YWluZXIsIHRoZXJlIHdpbGwgYmUgYmxhbmsgc3BhY2UgYmV5b25kIDE4MCBhbmQgLTE4MCBkZWdyZWVzIGxvbmdpdHVkZS5cbiAqIC0gRmVhdHVyZXMgdGhhdCBjcm9zcyAxODAgYW5kIC0xODAgZGVncmVlcyBsb25naXR1ZGUgd2lsbCBiZSBjdXQgaW4gdHdvICh3aXRoIG9uZSBwb3J0aW9uIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZVxuICogbWFwIGFuZCB0aGUgb3RoZXIgb24gdGhlIGxlZnQgZWRnZSBvZiB0aGUgbWFwKSBhdCBldmVyeSB6b29tIGxldmVsLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1pblRpbGVDYWNoZVNpemU9bnVsbF0gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHRpbGVzIHN0b3JlZCBpbiB0aGUgdGlsZSBjYWNoZSBmb3IgYSBnaXZlbiBzb3VyY2UuIExhcmdlciB2aWV3cG9ydHMgdXNlIG1vcmUgdGlsZXMgYW5kIG5lZWQgbGFyZ2VyIGNhY2hlcy4gTGFyZ2VyIHZpZXdwb3J0cyBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgZm91bmQgb24gZGV2aWNlcyB3aXRoIG1vcmUgbWVtb3J5IGFuZCBvbiBwYWdlcyB3aGVyZSB0aGUgbWFwIGlzIG1vcmUgaW1wb3J0YW50LiBJZiBvbWl0dGVkLCB0aGUgY2FjaGUgd2lsbCBiZSBkeW5hbWljYWxseSBzaXplZCBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3cG9ydC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhUaWxlQ2FjaGVTaXplPW51bGxdIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWxlcyBzdG9yZWQgaW4gdGhlIHRpbGUgY2FjaGUgZm9yIGEgZ2l2ZW4gc291cmNlLiBJZiBvbWl0dGVkLCB0aGUgY2FjaGUgd2lsbCBiZSBkeW5hbWljYWxseSBzaXplZCBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3cG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk9J3NhbnMtc2VyaWYnXSBEZWZpbmVzIGEgQ1NTIGZvbnQtZmFtaWx5IGZvciBsb2NhbGx5IG92ZXJyaWRpbmcgZ2VuZXJhdGlvbiBvZiBnbHlwaHMgaW4gdGhlICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzJywgJ0hpcmFnYW5hJywgJ0thdGFrYW5hJywgJ0hhbmd1bCBTeWxsYWJsZXMnIGFuZCAnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJyByYW5nZXMuXG4gKiAgIEluIHRoZXNlIHJhbmdlcywgZm9udCBzZXR0aW5ncyBmcm9tIHRoZSBtYXAncyBzdHlsZSB3aWxsIGJlIGlnbm9yZWQsIGV4Y2VwdCBmb3IgZm9udC13ZWlnaHQga2V5d29yZHMgKGxpZ2h0L3JlZ3VsYXIvbWVkaXVtL2JvbGQpLlxuICogICBTZXQgdG8gYGZhbHNlYCwgdG8gZW5hYmxlIGZvbnQgc2V0dGluZ3MgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUgZm9yIHRoZXNlIGdseXBoIHJhbmdlcy4gTm90ZSB0aGF0IFtNYXBib3ggU3R1ZGlvXShodHRwczovL3N0dWRpby5tYXBib3guY29tLykgc2V0cyB0aGlzIHZhbHVlIHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cbiAqICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBvcHRpb24gaXMgdG8gYXZvaWQgYmFuZHdpZHRoLWludGVuc2l2ZSBnbHlwaCBzZXJ2ZXIgcmVxdWVzdHMuIEZvciBhbiBleGFtcGxlIG9mIHRoaXMgb3B0aW9uIGluIHVzZSwgc2VlIFtVc2UgbG9jYWxseSBnZW5lcmF0ZWQgaWRlb2dyYXBoc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9sb2NhbC1pZGVvZ3JhcGhzKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sb2NhbEZvbnRGYW1pbHk9ZmFsc2VdIERlZmluZXMgYSBDU1NcbiAqICAgZm9udC1mYW1pbHkgZm9yIGxvY2FsbHkgb3ZlcnJpZGluZyBnZW5lcmF0aW9uIG9mIGFsbCBnbHlwaHMuIEZvbnQgc2V0dGluZ3MgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUgd2lsbCBiZSBpZ25vcmVkLCBleGNlcHQgZm9yIGZvbnQtd2VpZ2h0IGtleXdvcmRzIChsaWdodC9yZWd1bGFyL21lZGl1bS9ib2xkKS5cbiAqICAgSWYgc2V0LCB0aGlzIG9wdGlvbiBvdmVycmlkZXMgdGhlIHNldHRpbmcgaW4gbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5LlxuICogQHBhcmFtIHtSZXF1ZXN0VHJhbnNmb3JtRnVuY3Rpb259IFtvcHRpb25zLnRyYW5zZm9ybVJlcXVlc3Q9bnVsbF0gQSBjYWxsYmFjayBydW4gYmVmb3JlIHRoZSBNYXAgbWFrZXMgYSByZXF1ZXN0IGZvciBhbiBleHRlcm5hbCBVUkwuIFRoZSBjYWxsYmFjayBjYW4gYmUgdXNlZCB0byBtb2RpZnkgdGhlIHVybCwgc2V0IGhlYWRlcnMsIG9yIHNldCB0aGUgY3JlZGVudGlhbHMgcHJvcGVydHkgZm9yIGNyb3NzLW9yaWdpbiByZXF1ZXN0cy5cbiAqICAgRXhwZWN0ZWQgdG8gcmV0dXJuIGEge0BsaW5rIFJlcXVlc3RQYXJhbWV0ZXJzfSBvYmplY3Qgd2l0aCBhIGB1cmxgIHByb3BlcnR5IGFuZCBvcHRpb25hbGx5IGBoZWFkZXJzYCBhbmQgYGNyZWRlbnRpYWxzYCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jb2xsZWN0UmVzb3VyY2VUaW1pbmc9ZmFsc2VdIElmIGB0cnVlYCwgUmVzb3VyY2UgVGltaW5nIEFQSSBpbmZvcm1hdGlvbiB3aWxsIGJlIGNvbGxlY3RlZCBmb3IgcmVxdWVzdHMgbWFkZSBieSBHZW9KU09OIGFuZCBWZWN0b3IgVGlsZSB3ZWIgd29ya2VycyAodGhpcyBpbmZvcm1hdGlvbiBpcyBub3JtYWxseSBpbmFjY2Vzc2libGUgZnJvbSB0aGUgbWFpbiBKYXZhc2NyaXB0IHRocmVhZCkuIEluZm9ybWF0aW9uIHdpbGwgYmUgcmV0dXJuZWQgaW4gYSBgcmVzb3VyY2VUaW1pbmdgIHByb3BlcnR5IG9mIHJlbGV2YW50IGBkYXRhYCBldmVudHMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZmFkZUR1cmF0aW9uPTMwMF0gQ29udHJvbHMgdGhlIGR1cmF0aW9uIG9mIHRoZSBmYWRlLWluL2ZhZGUtb3V0IGFuaW1hdGlvbiBmb3IgbGFiZWwgY29sbGlzaW9ucywgaW4gbWlsbGlzZWNvbmRzLiBUaGlzIHNldHRpbmcgYWZmZWN0cyBhbGwgc3ltYm9sIGxheWVycy4gVGhpcyBzZXR0aW5nIGRvZXMgbm90IGFmZmVjdCB0aGUgZHVyYXRpb24gb2YgcnVudGltZSBzdHlsaW5nIHRyYW5zaXRpb25zIG9yIHJhc3RlciB0aWxlIGNyb3NzLWZhZGluZy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zPXRydWVdIElmIGB0cnVlYCwgc3ltYm9scyBmcm9tIG11bHRpcGxlIHNvdXJjZXMgY2FuIGNvbGxpZGUgd2l0aCBlYWNoIG90aGVyIGR1cmluZyBjb2xsaXNpb24gZGV0ZWN0aW9uLiBJZiBgZmFsc2VgLCBjb2xsaXNpb24gZGV0ZWN0aW9uIGlzIHJ1biBzZXBhcmF0ZWx5IGZvciB0aGUgc3ltYm9scyBpbiBlYWNoIHNvdXJjZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hY2Nlc3NUb2tlbj1udWxsXSBJZiBzcGVjaWZpZWQsIG1hcCB3aWxsIHVzZSB0aGlzIFt0b2tlbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9hY2Nlc3MtdG9rZW4vKSBpbnN0ZWFkIG9mIHRoZSBvbmUgZGVmaW5lZCBpbiBgbWFwYm94Z2wuYWNjZXNzVG9rZW5gLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmxvY2FsZT1udWxsXSBBIHBhdGNoIHRvIGFwcGx5IHRvIHRoZSBkZWZhdWx0IGxvY2FsaXphdGlvbiB0YWJsZSBmb3IgVUkgc3RyaW5ncyBzdWNoIGFzIGNvbnRyb2wgdG9vbHRpcHMuIFRoZSBgbG9jYWxlYCBvYmplY3QgbWFwcyBuYW1lc3BhY2VkIFVJIHN0cmluZyBJRHMgdG8gdHJhbnNsYXRlZCBzdHJpbmdzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2U7XG4gKiAgc2VlIFtgc3JjL3VpL2RlZmF1bHRfbG9jYWxlLmpzYF0oaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvYmxvYi9tYWluL3NyYy91aS9kZWZhdWx0X2xvY2FsZS5qcykgZm9yIGFuIGV4YW1wbGUgd2l0aCBhbGwgc3VwcG9ydGVkIHN0cmluZyBJRHMuIFRoZSBvYmplY3QgbWF5IHNwZWNpZnkgYWxsIFVJIHN0cmluZ3MgKHRoZXJlYnkgYWRkaW5nIHN1cHBvcnQgZm9yIGEgbmV3IHRyYW5zbGF0aW9uKSBvciBvbmx5IGEgc3Vic2V0IG9mIHN0cmluZ3MgKHRoZXJlYnkgcGF0Y2hpbmcgdGhlIGRlZmF1bHQgdHJhbnNsYXRpb24gdGFibGUpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50ZXN0TW9kZT1mYWxzZV0gU2lsZW5jZXMgZXJyb3JzIGFuZCB3YXJuaW5ncyBnZW5lcmF0ZWQgZHVlIHRvIGFuIGludmFsaWQgYWNjZXNzVG9rZW4sIHVzZWZ1bCB3aGVuIHVzaW5nIHRoZSBsaWJyYXJ5IHRvIHdyaXRlIHVuaXQgdGVzdHMuXG4gKiBAcGFyYW0ge1Byb2plY3Rpb25TcGVjaWZpY2F0aW9ufSBbb3B0aW9ucy5wcm9qZWN0aW9uPSdtZXJjYXRvciddIFRoZSBbcHJvamVjdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvcHJvamVjdGlvbi8pIHRoZSBtYXAgc2hvdWxkIGJlIHJlbmRlcmVkIGluLlxuICogU3VwcG9ydGVkIHByb2plY3Rpb25zIGFyZTpcbiAqICAqIFtBbGJlcnNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FsYmVyc19wcm9qZWN0aW9uKSBlcXVhbC1hcmVhIGNvbmljIHByb2plY3Rpb24gYXMgYGFsYmVyc2BcbiAqICAqIFtFcXVhbCBFYXJ0aF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXF1YWxfRWFydGhfcHJvamVjdGlvbikgZXF1YWwtYXJlYSBwc2V1ZG9jeWxpbmRyaWNhbCBwcm9qZWN0aW9uIGFzIGBlcXVhbEVhcnRoYFxuICogICogW0VxdWlyZWN0YW5ndWxhcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXF1aXJlY3Rhbmd1bGFyX3Byb2plY3Rpb24pIChQbGF0ZSBDYXJyw6llL1dHUzg0KSBhcyBgZXF1aXJlY3Rhbmd1bGFyYFxuICogICogM2QgR2xvYmUgYXMgYGdsb2JlYFxuICogICogW0xhbWJlcnQgQ29uZm9ybWFsIENvbmljXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYW1iZXJ0X2NvbmZvcm1hbF9jb25pY19wcm9qZWN0aW9uKSBhcyBgbGFtYmVydENvbmZvcm1hbENvbmljYFxuICogICogW01lcmNhdG9yXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZXJjYXRvcl9wcm9qZWN0aW9uKSBjeWxpbmRyaWNhbCBtYXAgcHJvamVjdGlvbiBhcyBgbWVyY2F0b3JgXG4gKiAgKiBbTmF0dXJhbCBFYXJ0aF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTmF0dXJhbF9FYXJ0aF9wcm9qZWN0aW9uKSBwc2V1ZG9jeWxpbmRyaWNhbCBtYXAgcHJvamVjdGlvbiBhcyBgbmF0dXJhbEVhcnRoYFxuICogICogW1dpbmtlbCBUcmlwZWxdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpbmtlbF90cmlwZWxfcHJvamVjdGlvbikgYXppbXV0aGFsIG1hcCBwcm9qZWN0aW9uIGFzIGB3aW5rZWxUcmlwZWxgXG4gKiAgQ29uaWMgcHJvamVjdGlvbnMgc3VjaCBhcyBBbGJlcnMgYW5kIExhbWJlcnQgaGF2ZSBjb25maWd1cmFibGUgYGNlbnRlcmAgYW5kIGBwYXJhbGxlbHNgIHByb3BlcnRpZXMgdGhhdCBhbGxvdyBkZXZlbG9wZXJzIHRvIGRlZmluZSB0aGUgcmVnaW9uIGluIHdoaWNoIHRoZSBwcm9qZWN0aW9uIGhhcyBtaW5pbWFsIGRpc3RvcnRpb247IHNlZSB0aGUgZXhhbXBsZSBmb3IgaG93IHRvIGNvbmZpZ3VyZSB0aGVzZSBwcm9wZXJ0aWVzLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe1xuICogICAgIGNvbnRhaW5lcjogJ21hcCcsIC8vIGNvbnRhaW5lciBJRFxuICogICAgIGNlbnRlcjogWy0xMjIuNDIwNjc5LCAzNy43NzI1MzddLCAvLyBzdGFydGluZyBwb3NpdGlvbiBbbG5nLCBsYXRdXG4gKiAgICAgem9vbTogMTMsIC8vIHN0YXJ0aW5nIHpvb21cbiAqICAgICBzdHlsZTogJ21hcGJveDovL3N0eWxlcy9tYXBib3gvc3RyZWV0cy12MTEnLCAvLyBzdHlsZSBVUkwgb3Igc3R5bGUgb2JqZWN0XG4gKiAgICAgaGFzaDogdHJ1ZSwgLy8gc3luYyBgY2VudGVyYCwgYHpvb21gLCBgcGl0Y2hgLCBhbmQgYGJlYXJpbmdgIHdpdGggVVJMXG4gKiAgICAgLy8gVXNlIGB0cmFuc2Zvcm1SZXF1ZXN0YCB0byBtb2RpZnkgcmVxdWVzdHMgdGhhdCBiZWdpbiB3aXRoIGBodHRwOi8vbXlIb3N0YC5cbiAqICAgICB0cmFuc2Zvcm1SZXF1ZXN0OiAodXJsLCByZXNvdXJjZVR5cGUpID0+IHtcbiAqICAgICAgICAgaWYgKHJlc291cmNlVHlwZSA9PT0gJ1NvdXJjZScgJiYgdXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly9teUhvc3QnKSkge1xuICogICAgICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICAgICAgICB1cmw6IHVybC5yZXBsYWNlKCdodHRwJywgJ2h0dHBzJyksXG4gKiAgICAgICAgICAgICAgICAgaGVhZGVyczogeydteS1jdXN0b20taGVhZGVyJzogdHJ1ZX0sXG4gKiAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyAgLy8gSW5jbHVkZSBjb29raWVzIGZvciBjcm9zcy1vcmlnaW4gcmVxdWVzdHNcbiAqICAgICAgICAgICAgIH07XG4gKiAgICAgICAgIH1cbiAqICAgICB9XG4gKiB9KTtcbiAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgYSBtYXAgb24gYSB3ZWJwYWdlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9zaW1wbGUtbWFwLylcbiAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgYSBtYXAgd2l0aCBhIGN1c3RvbSBzdHlsZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY3VzdG9tLXN0eWxlLWlkLylcbiAqIEBzZWUgW0V4YW1wbGU6IENoZWNrIGlmIE1hcGJveCBHTCBKUyBpcyBzdXBwb3J0ZWRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NoZWNrLWZvci1zdXBwb3J0LylcbiAqL1xuY2xhc3MgTWFwIGV4dGVuZHMgQ2FtZXJhIHtcbiAgICBzdHlsZTogU3R5bGU7XG4gICAgcGFpbnRlcjogUGFpbnRlcjtcbiAgICBoYW5kbGVyczogP0hhbmRsZXJNYW5hZ2VyO1xuXG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX21pc3NpbmdDU1NDYW5hcnk6IEhUTUxFbGVtZW50O1xuICAgIF9jYW52YXNDb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9jb250cm9sQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfY29udHJvbFBvc2l0aW9uczoge1tfOiBzdHJpbmddOiBIVE1MRWxlbWVudH07XG4gICAgX2ludGVyYWN0aXZlOiA/Ym9vbGVhbjtcbiAgICBfc2hvd1RpbGVCb3VuZGFyaWVzOiA/Ym9vbGVhbjtcbiAgICBfc2hvd1RlcnJhaW5XaXJlZnJhbWU6ID9ib29sZWFuO1xuICAgIF9zaG93UXVlcnlHZW9tZXRyeTogP2Jvb2xlYW47XG4gICAgX3Nob3dDb2xsaXNpb25Cb3hlczogP2Jvb2xlYW47XG4gICAgX3Nob3dQYWRkaW5nOiA/Ym9vbGVhbjtcbiAgICBfc2hvd092ZXJkcmF3SW5zcGVjdG9yOiBib29sZWFuO1xuICAgIF9yZXBhaW50OiA/Ym9vbGVhbjtcbiAgICBfdmVydGljZXM6ID9ib29sZWFuO1xuICAgIF9jYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIF9taW5UaWxlQ2FjaGVTaXplOiBudW1iZXI7XG4gICAgX21heFRpbGVDYWNoZVNpemU6IG51bWJlcjtcbiAgICBfZnJhbWU6ID9DYW5jZWxhYmxlO1xuICAgIF9yZW5kZXJOZXh0RnJhbWU6ID9ib29sZWFuO1xuICAgIF9zdHlsZURpcnR5OiA/Ym9vbGVhbjtcbiAgICBfc291cmNlc0RpcnR5OiA/Ym9vbGVhbjtcbiAgICBfcGxhY2VtZW50RGlydHk6ID9ib29sZWFuO1xuICAgIF9sb2FkZWQ6IGJvb2xlYW47XG4gICAgX2Z1bGx5TG9hZGVkOiBib29sZWFuOyAvLyBhY2NvdW50cyBmb3IgcGxhY2VtZW50IGZpbmlzaGluZyBhcyB3ZWxsXG4gICAgX3RyYWNrUmVzaXplOiBib29sZWFuO1xuICAgIF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IGJvb2xlYW47XG4gICAgX2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6IGJvb2xlYW47XG4gICAgX2FudGlhbGlhczogYm9vbGVhbjtcbiAgICBfcmVmcmVzaEV4cGlyZWRUaWxlczogYm9vbGVhbjtcbiAgICBfaGFzaDogSGFzaDtcbiAgICBfZGVsZWdhdGVkTGlzdGVuZXJzOiBhbnk7XG4gICAgX2lzSW5pdGlhbExvYWQ6IGJvb2xlYW47XG4gICAgX3Nob3VsZENoZWNrQWNjZXNzOiBib29sZWFuO1xuICAgIF9mYWRlRHVyYXRpb246IG51bWJlcjtcbiAgICBfY3Jvc3NTb3VyY2VDb2xsaXNpb25zOiBib29sZWFuO1xuICAgIF9jcm9zc0ZhZGluZ0ZhY3RvcjogbnVtYmVyO1xuICAgIF9jb2xsZWN0UmVzb3VyY2VUaW1pbmc6IGJvb2xlYW47XG4gICAgX29wdGltaXplRm9yVGVycmFpbjogYm9vbGVhbjtcbiAgICBfcmVuZGVyVGFza1F1ZXVlOiBUYXNrUXVldWU7XG4gICAgX2RvbVJlbmRlclRhc2tRdWV1ZTogVGFza1F1ZXVlO1xuICAgIF9jb250cm9sczogQXJyYXk8SUNvbnRyb2w+O1xuICAgIF9tYXJrZXJzOiBBcnJheTxNYXJrZXI+O1xuICAgIF9sb2dvQ29udHJvbDogSUNvbnRyb2w7XG4gICAgX21hcElkOiBudW1iZXI7XG4gICAgX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseTogc3RyaW5nO1xuICAgIF9sb2NhbEZvbnRGYW1pbHk6IHN0cmluZztcbiAgICBfcmVxdWVzdE1hbmFnZXI6IFJlcXVlc3RNYW5hZ2VyO1xuICAgIF9sb2NhbGU6IE9iamVjdDtcbiAgICBfcmVtb3ZlZDogYm9vbGVhbjtcbiAgICBfc3BlZWRJbmRleFRpbWluZzogYm9vbGVhbjtcbiAgICBfY2xpY2tUb2xlcmFuY2U6IG51bWJlcjtcbiAgICBfY29vcGVyYXRpdmVHZXN0dXJlczogYm9vbGVhbjtcbiAgICBfc2lsZW5jZUF1dGhFcnJvcnM6IGJvb2xlYW47XG4gICAgX2F2ZXJhZ2VFbGV2YXRpb25MYXN0U2FtcGxlZEF0OiBudW1iZXI7XG4gICAgX2F2ZXJhZ2VFbGV2YXRpb25FeGFnZ2VyYXRpb246IG51bWJlcjtcbiAgICBfYXZlcmFnZUVsZXZhdGlvbjogRWFzZWRWYXJpYWJsZTtcbiAgICBfY29udGFpbmVyV2lkdGg6IG51bWJlcjtcbiAgICBfY29udGFpbmVySGVpZ2h0OiBudW1iZXI7XG4gICAgX2xhbmd1YWdlOiA/c3RyaW5nO1xuICAgIF93b3JsZHZpZXc6ID9zdHJpbmc7XG5cbiAgICAvLyBgX2V4cGxpY2l0UHJvamVjdGlvbiByZXByZXNlbnRzIHByb2plY3Rpb24gYXMgc2V0IGJ5IGEgY2FsbCB0byBtYXAuc2V0UHJvamVjdGlvbigpXG4gICAgLy8gRm9yIHRoZSBhY3R1YWwgcHJvamVjdGlvbiBkaXNwbGF5ZWQsIHVzZSBgdHJhbnNmb3JtLnByb2plY3Rpb25gLlxuICAgIC8vIChUaGUgdHdvIGRpdmVyZ2UgYWJvdmUgdGhlIHRyYW5zaXRpb24gem9vbSB0aHJlc2hvbGQgaW4gR2xvYmUgdmlldyBvciB3aGVuIF9leHBsaWNpdFByb2plY3Rpb24gPT09IG51bGxcbiAgICAvLyBhIG51bGwgX2V4cGxpY2l0UHJvamVjdGlvbiBpbmRpY2F0ZXMgdGhlIG1hcCBkZWZhdWx0cyB0byBmaXJzdCB0aGUgc3R5bGVzaGVldCBwcm9qZWN0aW9uIGlmIHByZXNlbnQsIHRoZW4gTWVyY2F0b3IpXG4gICAgX2V4cGxpY2l0UHJvamVjdGlvbjogUHJvamVjdGlvblNwZWNpZmljYXRpb24gfCBudWxsO1xuXG4gICAgLyoqIEBzZWN0aW9uIHtJbnRlcmFjdGlvbiBoYW5kbGVyc30gKi9cblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgU2Nyb2xsWm9vbUhhbmRsZXJ9LCB3aGljaCBpbXBsZW1lbnRzIHpvb21pbmcgaW4gYW5kIG91dCB3aXRoIGEgc2Nyb2xsIHdoZWVsIG9yIHRyYWNrcGFkLlxuICAgICAqIEZpbmQgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcyB1c2luZyBgc2Nyb2xsWm9vbWAgaW4gdGhlIHtAbGluayBTY3JvbGxab29tSGFuZGxlcn0gc2VjdGlvbi5cbiAgICAgKi9cbiAgICBzY3JvbGxab29tOiBTY3JvbGxab29tSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgQm94Wm9vbUhhbmRsZXJ9LCB3aGljaCBpbXBsZW1lbnRzIHpvb21pbmcgdXNpbmcgYSBkcmFnIGdlc3R1cmUgd2l0aCB0aGUgU2hpZnQga2V5IHByZXNzZWQuXG4gICAgICogRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGBib3hab29tYCBpbiB0aGUge0BsaW5rIEJveFpvb21IYW5kbGVyfSBzZWN0aW9uLlxuICAgICAqL1xuICAgIGJveFpvb206IEJveFpvb21IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0sIHdoaWNoIGltcGxlbWVudHMgcm90YXRpbmcgdGhlIG1hcCB3aGlsZSBkcmFnZ2luZyB3aXRoIHRoZSByaWdodFxuICAgICAqIG1vdXNlIGJ1dHRvbiBvciB3aXRoIHRoZSBDb250cm9sIGtleSBwcmVzc2VkLiBGaW5kIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMgdXNpbmcgYGRyYWdSb3RhdGVgXG4gICAgICogaW4gdGhlIHtAbGluayBEcmFnUm90YXRlSGFuZGxlcn0gc2VjdGlvbi5cbiAgICAgKi9cbiAgICBkcmFnUm90YXRlOiBEcmFnUm90YXRlSGFuZGxlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXAncyB7QGxpbmsgRHJhZ1BhbkhhbmRsZXJ9LCB3aGljaCBpbXBsZW1lbnRzIGRyYWdnaW5nIHRoZSBtYXAgd2l0aCBhIG1vdXNlIG9yIHRvdWNoIGdlc3R1cmUuXG4gICAgICogRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGBkcmFnUGFuYCBpbiB0aGUge0BsaW5rIERyYWdQYW5IYW5kbGVyfSBzZWN0aW9uLlxuICAgICAqL1xuICAgIGRyYWdQYW46IERyYWdQYW5IYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBLZXlib2FyZEhhbmRsZXJ9LCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSwgcm90YXRlLCBhbmQgcGFuIHRoZSBtYXAgdXNpbmcga2V5Ym9hcmRcbiAgICAgKiBzaG9ydGN1dHMuIEZpbmQgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcyB1c2luZyBga2V5Ym9hcmRgIGluIHRoZSB7QGxpbmsgS2V5Ym9hcmRIYW5kbGVyfSBzZWN0aW9uLlxuICAgICAqL1xuICAgIGtleWJvYXJkOiBLZXlib2FyZEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWFwJ3Mge0BsaW5rIERvdWJsZUNsaWNrWm9vbUhhbmRsZXJ9LCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSBieSBkb3VibGUgY2xpY2tpbmcuXG4gICAgICogRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGBkb3VibGVDbGlja1pvb21gIGluIHRoZSB7QGxpbmsgRG91YmxlQ2xpY2tab29tSGFuZGxlcn0gc2VjdGlvbi5cbiAgICAgKi9cbiAgICBkb3VibGVDbGlja1pvb206IERvdWJsZUNsaWNrWm9vbUhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWFwJ3Mge0BsaW5rIFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXJ9LCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gem9vbSBvciByb3RhdGUgdGhlIG1hcCB3aXRoIHRvdWNoIGdlc3R1cmVzLlxuICAgICAqIEZpbmQgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcyB1c2luZyBgdG91Y2hab29tUm90YXRlYCBpbiB0aGUge0BsaW5rIFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXJ9IHNlY3Rpb24uXG4gICAgICovXG4gICAgdG91Y2hab29tUm90YXRlOiBUb3VjaFpvb21Sb3RhdGVIYW5kbGVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1hcCdzIHtAbGluayBUb3VjaFBpdGNoSGFuZGxlcn0sIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBwaXRjaCB0aGUgbWFwIHdpdGggdG91Y2ggZ2VzdHVyZXMuXG4gICAgICogRmluZCBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzIHVzaW5nIGB0b3VjaFBpdGNoYCBpbiB0aGUge0BsaW5rIFRvdWNoUGl0Y2hIYW5kbGVyfSBzZWN0aW9uLlxuICAgICAqL1xuICAgIHRvdWNoUGl0Y2g6IFRvdWNoUGl0Y2hIYW5kbGVyO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogTWFwT3B0aW9ucykge1xuICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLm1hcmsoUGVyZm9ybWFuY2VNYXJrZXJzLmNyZWF0ZSk7XG5cbiAgICAgICAgb3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLm1pblpvb20gIT0gbnVsbCAmJiBvcHRpb25zLm1heFpvb20gIT0gbnVsbCAmJiBvcHRpb25zLm1pblpvb20gPiBvcHRpb25zLm1heFpvb20pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbWF4Wm9vbSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5ab29tYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5taW5QaXRjaCAhPSBudWxsICYmIG9wdGlvbnMubWF4UGl0Y2ggIT0gbnVsbCAmJiBvcHRpb25zLm1pblBpdGNoID4gb3B0aW9ucy5tYXhQaXRjaCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtYXhQaXRjaCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5QaXRjaGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWluUGl0Y2ggIT0gbnVsbCAmJiBvcHRpb25zLm1pblBpdGNoIDwgZGVmYXVsdE1pblBpdGNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pblBpdGNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7ZGVmYXVsdE1pblBpdGNofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubWF4UGl0Y2ggIT0gbnVsbCAmJiBvcHRpb25zLm1heFBpdGNoID4gZGVmYXVsdE1heFBpdGNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1heFBpdGNoIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7ZGVmYXVsdE1heFBpdGNofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGlzYWJsZSBhbnRpYWxpYXMgd2l0aCBPUy9pT1MgMTUuNCBhbmQgMTUuNSBkdWUgdG8gcmVuZGVyaW5nIGJ1Z1xuICAgICAgICBpZiAob3B0aW9ucy5hbnRpYWxpYXMgJiYgaXNTYWZhcmlXaXRoQW50aWFsaWFzaW5nQnVnKHdpbmRvdykpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYW50aWFsaWFzID0gZmFsc2U7XG4gICAgICAgICAgICB3YXJuT25jZSgnQW50aWFsaWFzaW5nIGlzIGRpc2FibGVkIGZvciB0aGlzIFdlYkdMIGNvbnRleHQgdG8gYXZvaWQgYnJvd3NlciBidWc6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8xMTYwOScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IFRyYW5zZm9ybShvcHRpb25zLm1pblpvb20sIG9wdGlvbnMubWF4Wm9vbSwgb3B0aW9ucy5taW5QaXRjaCwgb3B0aW9ucy5tYXhQaXRjaCwgb3B0aW9ucy5yZW5kZXJXb3JsZENvcGllcyk7XG4gICAgICAgIHN1cGVyKHRyYW5zZm9ybSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5faW50ZXJhY3RpdmUgPSBvcHRpb25zLmludGVyYWN0aXZlO1xuICAgICAgICB0aGlzLl9taW5UaWxlQ2FjaGVTaXplID0gb3B0aW9ucy5taW5UaWxlQ2FjaGVTaXplO1xuICAgICAgICB0aGlzLl9tYXhUaWxlQ2FjaGVTaXplID0gb3B0aW9ucy5tYXhUaWxlQ2FjaGVTaXplO1xuICAgICAgICB0aGlzLl9mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0ID0gb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0O1xuICAgICAgICB0aGlzLl9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgPSBvcHRpb25zLnByZXNlcnZlRHJhd2luZ0J1ZmZlcjtcbiAgICAgICAgdGhpcy5fYW50aWFsaWFzID0gb3B0aW9ucy5hbnRpYWxpYXM7XG4gICAgICAgIHRoaXMuX3RyYWNrUmVzaXplID0gb3B0aW9ucy50cmFja1Jlc2l6ZTtcbiAgICAgICAgdGhpcy5fYmVhcmluZ1NuYXAgPSBvcHRpb25zLmJlYXJpbmdTbmFwO1xuICAgICAgICB0aGlzLl9yZWZyZXNoRXhwaXJlZFRpbGVzID0gb3B0aW9ucy5yZWZyZXNoRXhwaXJlZFRpbGVzO1xuICAgICAgICB0aGlzLl9mYWRlRHVyYXRpb24gPSBvcHRpb25zLmZhZGVEdXJhdGlvbjtcbiAgICAgICAgdGhpcy5faXNJbml0aWFsTG9hZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2Nyb3NzU291cmNlQ29sbGlzaW9ucyA9IG9wdGlvbnMuY3Jvc3NTb3VyY2VDb2xsaXNpb25zO1xuICAgICAgICB0aGlzLl9jcm9zc0ZhZGluZ0ZhY3RvciA9IDE7XG4gICAgICAgIHRoaXMuX2NvbGxlY3RSZXNvdXJjZVRpbWluZyA9IG9wdGlvbnMuY29sbGVjdFJlc291cmNlVGltaW5nO1xuICAgICAgICB0aGlzLl9vcHRpbWl6ZUZvclRlcnJhaW4gPSBvcHRpb25zLm9wdGltaXplRm9yVGVycmFpbjtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2UgPSBvcHRpb25zLmxhbmd1YWdlID09PSAnYXV0bycgPyB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlIDogb3B0aW9ucy5sYW5ndWFnZTtcbiAgICAgICAgdGhpcy5fd29ybGR2aWV3ID0gb3B0aW9ucy53b3JsZHZpZXc7XG4gICAgICAgIHRoaXMuX3JlbmRlclRhc2tRdWV1ZSA9IG5ldyBUYXNrUXVldWUoKTtcbiAgICAgICAgdGhpcy5fZG9tUmVuZGVyVGFza1F1ZXVlID0gbmV3IFRhc2tRdWV1ZSgpO1xuICAgICAgICB0aGlzLl9jb250cm9scyA9IFtdO1xuICAgICAgICB0aGlzLl9tYXJrZXJzID0gW107XG4gICAgICAgIHRoaXMuX21hcElkID0gdW5pcXVlSWQoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxlID0gZXh0ZW5kKHt9LCBkZWZhdWx0TG9jYWxlLCBvcHRpb25zLmxvY2FsZSk7XG4gICAgICAgIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gb3B0aW9ucy5jbGlja1RvbGVyYW5jZTtcbiAgICAgICAgdGhpcy5fY29vcGVyYXRpdmVHZXN0dXJlcyA9IG9wdGlvbnMuY29vcGVyYXRpdmVHZXN0dXJlcztcbiAgICAgICAgdGhpcy5fY29udGFpbmVyV2lkdGggPSAwO1xuICAgICAgICB0aGlzLl9jb250YWluZXJIZWlnaHQgPSAwO1xuXG4gICAgICAgIHRoaXMuX2F2ZXJhZ2VFbGV2YXRpb25MYXN0U2FtcGxlZEF0ID0gLUluZmluaXR5O1xuICAgICAgICB0aGlzLl9hdmVyYWdlRWxldmF0aW9uRXhhZ2dlcmF0aW9uID0gMDtcbiAgICAgICAgdGhpcy5fYXZlcmFnZUVsZXZhdGlvbiA9IG5ldyBFYXNlZFZhcmlhYmxlKDApO1xuXG4gICAgICAgIHRoaXMuX2V4cGxpY2l0UHJvamVjdGlvbiA9IG51bGw7IC8vIEZhbGxiYWNrIHRvIHN0eWxlc2hlZXQgYnkgZGVmYXVsdFxuXG4gICAgICAgIHRoaXMuX3JlcXVlc3RNYW5hZ2VyID0gbmV3IFJlcXVlc3RNYW5hZ2VyKG9wdGlvbnMudHJhbnNmb3JtUmVxdWVzdCwgb3B0aW9ucy5hY2Nlc3NUb2tlbiwgb3B0aW9ucy50ZXN0TW9kZSk7XG4gICAgICAgIHRoaXMuX3NpbGVuY2VBdXRoRXJyb3JzID0gISFvcHRpb25zLnRlc3RNb2RlO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250YWluZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3B0aW9ucy5jb250YWluZXIpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29udGFpbmVyICcke29wdGlvbnMuY29udGFpbmVyfScgbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuY29udGFpbmVyIGluc3RhbmNlb2Ygd2luZG93LkhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0eXBlOiAnY29udGFpbmVyJyBtdXN0IGJlIGEgU3RyaW5nIG9yIEhUTUxFbGVtZW50LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKGBUaGUgbWFwIGNvbnRhaW5lciBlbGVtZW50IHNob3VsZCBiZSBlbXB0eSwgb3RoZXJ3aXNlIHRoZSBtYXAncyBpbnRlcmFjdGl2aXR5IHdpbGwgYmUgbmVnYXRpdmVseSBpbXBhY3RlZC4gSWYgeW91IHdhbnQgdG8gZGlzcGxheSBhIG1lc3NhZ2Ugd2hlbiBXZWJHTCBpcyBub3Qgc3VwcG9ydGVkLCB1c2UgdGhlIE1hcGJveCBHTCBTdXBwb3J0ZWQgcGx1Z2luIGluc3RlYWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5tYXhCb3VuZHMpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TWF4Qm91bmRzKG9wdGlvbnMubWF4Qm91bmRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbldpbmRvd09ubGluZScsXG4gICAgICAgICAgICAnX29uV2luZG93UmVzaXplJyxcbiAgICAgICAgICAgICdfb25NYXBTY3JvbGwnLFxuICAgICAgICAgICAgJ19jb250ZXh0TG9zdCcsXG4gICAgICAgICAgICAnX2NvbnRleHRSZXN0b3JlZCdcbiAgICAgICAgXSwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5fc2V0dXBDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fc2V0dXBQYWludGVyKCk7XG4gICAgICAgIGlmICh0aGlzLnBhaW50ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub24oJ21vdmUnLCAoKSA9PiB0aGlzLl91cGRhdGUoZmFsc2UpKTtcbiAgICAgICAgdGhpcy5vbignbW92ZWVuZCcsICgpID0+IHRoaXMuX3VwZGF0ZShmYWxzZSkpO1xuICAgICAgICB0aGlzLm9uKCd6b29tJywgKCkgPT4gdGhpcy5fdXBkYXRlKHRydWUpKTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvbmxpbmUnLCB0aGlzLl9vbldpbmRvd09ubGluZSwgZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uV2luZG93UmVzaXplLCBmYWxzZSk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IG5ldyBIYW5kbGVyTWFuYWdlcih0aGlzLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLl9sb2NhbEZvbnRGYW1pbHkgPSBvcHRpb25zLmxvY2FsRm9udEZhbWlseTtcbiAgICAgICAgdGhpcy5fbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ID0gb3B0aW9ucy5sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3R5bGUob3B0aW9ucy5zdHlsZSwge2xvY2FsRm9udEZhbWlseTogdGhpcy5fbG9jYWxGb250RmFtaWx5LCBsb2NhbElkZW9ncmFwaEZvbnRGYW1pbHk6IHRoaXMuX2xvY2FsSWRlb2dyYXBoRm9udEZhbWlseX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucHJvamVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZXRQcm9qZWN0aW9uKG9wdGlvbnMucHJvamVjdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYXNoTmFtZSA9ICh0eXBlb2Ygb3B0aW9ucy5oYXNoID09PSAnc3RyaW5nJyAmJiBvcHRpb25zLmhhc2gpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5faGFzaCA9IG9wdGlvbnMuaGFzaCAmJiAobmV3IEhhc2goaGFzaE5hbWUpKS5hZGRUbyh0aGlzKTtcbiAgICAgICAgLy8gZG9uJ3Qgc2V0IHBvc2l0aW9uIGZyb20gb3B0aW9ucyBpZiBzZXQgdGhyb3VnaCBoYXNoXG4gICAgICAgIGlmICghdGhpcy5faGFzaCB8fCAhdGhpcy5faGFzaC5fb25IYXNoQ2hhbmdlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuanVtcFRvKHtcbiAgICAgICAgICAgICAgICBjZW50ZXI6IG9wdGlvbnMuY2VudGVyLFxuICAgICAgICAgICAgICAgIHpvb206IG9wdGlvbnMuem9vbSxcbiAgICAgICAgICAgICAgICBiZWFyaW5nOiBvcHRpb25zLmJlYXJpbmcsXG4gICAgICAgICAgICAgICAgcGl0Y2g6IG9wdGlvbnMucGl0Y2hcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5ib3VuZHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZml0Qm91bmRzKG9wdGlvbnMuYm91bmRzLCBleHRlbmQoe30sIG9wdGlvbnMuZml0Qm91bmRzT3B0aW9ucywge2R1cmF0aW9uOiAwfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNpemUoKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2wpXG4gICAgICAgICAgICB0aGlzLmFkZENvbnRyb2wobmV3IEF0dHJpYnV0aW9uQ29udHJvbCh7Y3VzdG9tQXR0cmlidXRpb246IG9wdGlvbnMuY3VzdG9tQXR0cmlidXRpb259KSk7XG5cbiAgICAgICAgdGhpcy5fbG9nb0NvbnRyb2wgPSBuZXcgTG9nb0NvbnRyb2woKTtcbiAgICAgICAgdGhpcy5hZGRDb250cm9sKHRoaXMuX2xvZ29Db250cm9sLCBvcHRpb25zLmxvZ29Qb3NpdGlvbik7XG5cbiAgICAgICAgdGhpcy5vbignc3R5bGUubG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybS51bm1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5qdW1wVG8oKHRoaXMuc3R5bGUuc3R5bGVzaGVldDogYW55KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uKCdkYXRhJywgKGV2ZW50OiBNYXBEYXRhRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZShldmVudC5kYXRhVHlwZSA9PT0gJ3N0eWxlJyk7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KGAke2V2ZW50LmRhdGFUeXBlfWRhdGFgLCBldmVudCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbignZGF0YWxvYWRpbmcnLCAoZXZlbnQ6IE1hcERhdGFFdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudChgJHtldmVudC5kYXRhVHlwZX1kYXRhbG9hZGluZ2AsIGV2ZW50KSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qXG4gICAgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlciBmb3IgdGhpcyBtYXAgaW5zdGFuY2Ugd2hpY2ggaXMgdXNlZCBmb3IgdGhlIE1hcExvYWRFdmVudFxuICAgICogdG8gbWFrZSBzdXJlIHdlIG9ubHkgZmlyZSBvbmUgZXZlbnQgcGVyIGluc3RhbnRpYXRlZCBtYXAgb2JqZWN0LlxuICAgICogQHByaXZhdGVcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgKi9cbiAgICBfZ2V0TWFwSWQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcElkO1xuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7Q29udHJvbHN9ICovXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIHtAbGluayBJQ29udHJvbH0gdG8gdGhlIG1hcCwgY2FsbGluZyBgY29udHJvbC5vbkFkZCh0aGlzKWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0lDb250cm9sfSBjb250cm9sIFRoZSB7QGxpbmsgSUNvbnRyb2x9IHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3Bvc2l0aW9uXSBQb3NpdGlvbiBvbiB0aGUgbWFwIHRvIHdoaWNoIHRoZSBjb250cm9sIHdpbGwgYmUgYWRkZWQuXG4gICAgICogVmFsaWQgdmFsdWVzIGFyZSBgJ3RvcC1sZWZ0J2AsIGAndG9wLXJpZ2h0J2AsIGAnYm90dG9tLWxlZnQnYCwgYW5kIGAnYm90dG9tLXJpZ2h0J2AuIERlZmF1bHRzIHRvIGAndG9wLXJpZ2h0J2AuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEFkZCB6b29tIGFuZCByb3RhdGlvbiBjb250cm9scyB0byB0aGUgbWFwLlxuICAgICAqIG1hcC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5OYXZpZ2F0aW9uQ29udHJvbCgpKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IG1hcCBuYXZpZ2F0aW9uIGNvbnRyb2xzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL25hdmlnYXRpb24vKVxuICAgICAqL1xuICAgIGFkZENvbnRyb2woY29udHJvbDogSUNvbnRyb2wsIHBvc2l0aW9uPzogQ29udHJvbFBvc2l0aW9uKTogdGhpcyB7XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5nZXREZWZhdWx0UG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGNvbnRyb2wuZ2V0RGVmYXVsdFBvc2l0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gJ3RvcC1yaWdodCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb250cm9sIHx8ICFjb250cm9sLm9uQWRkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudCB0byBtYXAuYWRkQ29udHJvbCgpLiBBcmd1bWVudCBtdXN0IGJlIGEgY29udHJvbCB3aXRoIG9uQWRkIGFuZCBvblJlbW92ZSBtZXRob2RzLicpKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udHJvbEVsZW1lbnQgPSBjb250cm9sLm9uQWRkKHRoaXMpO1xuICAgICAgICB0aGlzLl9jb250cm9scy5wdXNoKGNvbnRyb2wpO1xuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uQ29udGFpbmVyID0gdGhpcy5fY29udHJvbFBvc2l0aW9uc1twb3NpdGlvbl07XG4gICAgICAgIGlmIChwb3NpdGlvbi5pbmRleE9mKCdib3R0b20nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uQ29udGFpbmVyLmluc2VydEJlZm9yZShjb250cm9sRWxlbWVudCwgcG9zaXRpb25Db250YWluZXIuZmlyc3RDaGlsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb3NpdGlvbkNvbnRhaW5lci5hcHBlbmRDaGlsZChjb250cm9sRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY29udHJvbCBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0lDb250cm9sfSBjb250cm9sIFRoZSB7QGxpbmsgSUNvbnRyb2x9IHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gRGVmaW5lIGEgbmV3IG5hdmlnYXRpb24gY29udHJvbC5cbiAgICAgKiBjb25zdCBuYXZpZ2F0aW9uID0gbmV3IG1hcGJveGdsLk5hdmlnYXRpb25Db250cm9sKCk7XG4gICAgICogLy8gQWRkIHpvb20gYW5kIHJvdGF0aW9uIGNvbnRyb2xzIHRvIHRoZSBtYXAuXG4gICAgICogbWFwLmFkZENvbnRyb2wobmF2aWdhdGlvbik7XG4gICAgICogLy8gUmVtb3ZlIHpvb20gYW5kIHJvdGF0aW9uIGNvbnRyb2xzIGZyb20gdGhlIG1hcC5cbiAgICAgKiBtYXAucmVtb3ZlQ29udHJvbChuYXZpZ2F0aW9uKTtcbiAgICAgKi9cbiAgICByZW1vdmVDb250cm9sKGNvbnRyb2w6IElDb250cm9sKTogdGhpcyB7XG4gICAgICAgIGlmICghY29udHJvbCB8fCAhY29udHJvbC5vblJlbW92ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnQgdG8gbWFwLnJlbW92ZUNvbnRyb2woKS4gQXJndW1lbnQgbXVzdCBiZSBhIGNvbnRyb2wgd2l0aCBvbkFkZCBhbmQgb25SZW1vdmUgbWV0aG9kcy4nKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNpID0gdGhpcy5fY29udHJvbHMuaW5kZXhPZihjb250cm9sKTtcbiAgICAgICAgaWYgKGNpID4gLTEpIHRoaXMuX2NvbnRyb2xzLnNwbGljZShjaSwgMSk7XG4gICAgICAgIGNvbnRyb2wub25SZW1vdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGNvbnRyb2wgaXMgb24gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SUNvbnRyb2x9IGNvbnRyb2wgVGhlIHtAbGluayBJQ29udHJvbH0gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgbWFwIGNvbnRhaW5zIGNvbnRyb2wuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBEZWZpbmUgYSBuZXcgbmF2aWdhdGlvbiBjb250cm9sLlxuICAgICAqIGNvbnN0IG5hdmlnYXRpb24gPSBuZXcgbWFwYm94Z2wuTmF2aWdhdGlvbkNvbnRyb2woKTtcbiAgICAgKiAvLyBBZGQgem9vbSBhbmQgcm90YXRpb24gY29udHJvbHMgdG8gdGhlIG1hcC5cbiAgICAgKiBtYXAuYWRkQ29udHJvbChuYXZpZ2F0aW9uKTtcbiAgICAgKiAvLyBDaGVjayB0aGF0IHRoZSBuYXZpZ2F0aW9uIGNvbnRyb2wgZXhpc3RzIG9uIHRoZSBtYXAuXG4gICAgICogY29uc3QgYWRkZWQgPSBtYXAuaGFzQ29udHJvbChuYXZpZ2F0aW9uKTtcbiAgICAgKiAvLyBhZGRlZCA9PT0gdHJ1ZVxuICAgICAqL1xuICAgIGhhc0NvbnRyb2woY29udHJvbDogSUNvbnRyb2wpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xzLmluZGV4T2YoY29udHJvbCkgPiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjb250YWluaW5nIEhUTUwgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIG1hcCdzIGNvbnRhaW5lci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNvbnRhaW5lciA9IG1hcC5nZXRDb250YWluZXIoKTtcbiAgICAgKi9cbiAgICBnZXRDb250YWluZXIoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIEhUTUwgZWxlbWVudCBjb250YWluaW5nIHRoZSBtYXAncyBgPGNhbnZhcz5gIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBhZGQgbm9uLUdMIG92ZXJsYXlzIHRvIHRoZSBtYXAsIHlvdSBzaG91bGQgYXBwZW5kIHRoZW0gdG8gdGhpcyBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBpcyB0aGUgZWxlbWVudCB0byB3aGljaCBldmVudCBiaW5kaW5ncyBmb3IgbWFwIGludGVyYWN0aXZpdHkgKHN1Y2ggYXMgcGFubmluZyBhbmQgem9vbWluZykgYXJlXG4gICAgICogYXR0YWNoZWQuIEl0IHdpbGwgcmVjZWl2ZSBidWJibGVkIGV2ZW50cyBmcm9tIGNoaWxkIGVsZW1lbnRzIHN1Y2ggYXMgdGhlIGA8Y2FudmFzPmAsIGJ1dCBub3QgZnJvbVxuICAgICAqIG1hcCBjb250cm9scy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIGNvbnRhaW5lciBvZiB0aGUgbWFwJ3MgYDxjYW52YXM+YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNhbnZhc0NvbnRhaW5lciA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICAgICAqL1xuICAgIGdldENhbnZhc0NvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW52YXNDb250YWluZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgYDxjYW52YXM+YCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hUTUxDYW52YXNFbGVtZW50fSBUaGUgbWFwJ3MgYDxjYW52YXM+YCBlbGVtZW50LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgY2FudmFzID0gbWFwLmdldENhbnZhcygpO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IE1lYXN1cmUgZGlzdGFuY2VzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21lYXN1cmUvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgYSBwb3B1cCBvbiBob3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQ2VudGVyIHRoZSBtYXAgb24gYSBjbGlja2VkIHN5bWJvbF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jZW50ZXItb24tc3ltYm9sLylcbiAgICAgKi9cbiAgICBnZXRDYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FudmFzO1xuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7TWFwIGNvbnN0cmFpbnRzfSAqL1xuXG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgbWFwIGFjY29yZGluZyB0byB0aGUgZGltZW5zaW9ucyBvZiBpdHNcbiAgICAgKiBgY29udGFpbmVyYCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBtYXAgY29udGFpbmVyIHNpemUgY2hhbmdlZCBhbmQgdXBkYXRlcyB0aGUgbWFwIGlmIGl0IGhhcyBjaGFuZ2VkLlxuICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBtYXAncyBgY29udGFpbmVyYCBpcyByZXNpemVkIHByb2dyYW1tYXRpY2FsbHlcbiAgICAgKiBvciB3aGVuIHRoZSBtYXAgaXMgc2hvd24gYWZ0ZXIgYmVpbmcgaW5pdGlhbGx5IGhpZGRlbiB3aXRoIENTUy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gZXZlbnREYXRhIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBwYXNzZWQgdG8gYG1vdmVzdGFydGAsIGBtb3ZlYCwgYHJlc2l6ZWAsIGFuZCBgbW92ZWVuZGBcbiAgICAgKiAgIGV2ZW50cyB0aGF0IGdldCB0cmlnZ2VyZWQgYXMgYSByZXN1bHQgb2YgcmVzaXplLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGRpZmZlcmVudGlhdGluZyB0aGVcbiAgICAgKiAgIHNvdXJjZSBvZiBhbiBldmVudCAoZm9yIGV4YW1wbGUsIHVzZXItaW5pdGlhdGVkIG9yIHByb2dyYW1tYXRpY2FsbHktdHJpZ2dlcmVkIGV2ZW50cykuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFJlc2l6ZSB0aGUgbWFwIHdoZW4gdGhlIG1hcCBjb250YWluZXIgaXMgc2hvd25cbiAgICAgKiAvLyBhZnRlciBiZWluZyBpbml0aWFsbHkgaGlkZGVuIHdpdGggQ1NTLlxuICAgICAqIGNvbnN0IG1hcERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYXAnKTtcbiAgICAgKiBpZiAobWFwRGl2LnN0eWxlLnZpc2liaWxpdHkgPT09IHRydWUpIG1hcC5yZXNpemUoKTtcbiAgICAgKi9cbiAgICByZXNpemUoZXZlbnREYXRhPzogT2JqZWN0KTogdGhpcyB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbnRhaW5lckRpbWVuc2lvbnMoKTtcblxuICAgICAgICAvLyBkbyBub3RoaW5nIGlmIGNvbnRhaW5lciByZW1haW5lZCB0aGUgc2FtZSBzaXplXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXJXaWR0aCA9PT0gdGhpcy50cmFuc2Zvcm0ud2lkdGggJiYgdGhpcy5fY29udGFpbmVySGVpZ2h0ID09PSB0aGlzLnRyYW5zZm9ybS5oZWlnaHQpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIHRoaXMuX3Jlc2l6ZUNhbnZhcyh0aGlzLl9jb250YWluZXJXaWR0aCwgdGhpcy5fY29udGFpbmVySGVpZ2h0KTtcblxuICAgICAgICB0aGlzLnRyYW5zZm9ybS5yZXNpemUodGhpcy5fY29udGFpbmVyV2lkdGgsIHRoaXMuX2NvbnRhaW5lckhlaWdodCk7XG4gICAgICAgIHRoaXMucGFpbnRlci5yZXNpemUoTWF0aC5jZWlsKHRoaXMuX2NvbnRhaW5lcldpZHRoKSwgTWF0aC5jZWlsKHRoaXMuX2NvbnRhaW5lckhlaWdodCkpO1xuXG4gICAgICAgIGNvbnN0IGZpcmVNb3ZpbmcgPSAhdGhpcy5fbW92aW5nO1xuICAgICAgICBpZiAoZmlyZU1vdmluZykge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbW92ZXN0YXJ0JywgZXZlbnREYXRhKSlcbiAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ21vdmUnLCBldmVudERhdGEpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3Jlc2l6ZScsIGV2ZW50RGF0YSkpO1xuXG4gICAgICAgIGlmIChmaXJlTW92aW5nKSB0aGlzLmZpcmUobmV3IEV2ZW50KCdtb3ZlZW5kJywgZXZlbnREYXRhKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgZ2VvZ3JhcGhpY2FsIGJvdW5kcy4gV2hlbiB0aGUgYmVhcmluZyBvciBwaXRjaCBpcyBub24temVybywgdGhlIHZpc2libGUgcmVnaW9uIGlzIG5vdFxuICAgICAqIGFuIGF4aXMtYWxpZ25lZCByZWN0YW5nbGUsIGFuZCB0aGUgcmVzdWx0IGlzIHRoZSBzbWFsbGVzdCBib3VuZHMgdGhhdCBlbmNvbXBhc3NlcyB0aGUgdmlzaWJsZSByZWdpb24uXG4gICAgICogSWYgYSBwYWRkaW5nIGlzIHNldCBvbiB0aGUgbWFwLCB0aGUgYm91bmRzIHJldHVybmVkIGFyZSBmb3IgdGhlIGluc2V0LlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXNuJ3Qgc3VwcG9ydGVkIHdpdGggZ2xvYmUgcHJvamVjdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IFRoZSBnZW9ncmFwaGljYWwgYm91bmRzIG9mIHRoZSBtYXAgYXMge0BsaW5rIExuZ0xhdEJvdW5kc30uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBib3VuZHMgPSBtYXAuZ2V0Qm91bmRzKCk7XG4gICAgICovXG4gICAgZ2V0Qm91bmRzKCk6IExuZ0xhdEJvdW5kcyB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnKSB7XG4gICAgICAgICAgICB3YXJuT25jZSgnR2xvYmUgcHJvamVjdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGdldEJvdW5kcyBBUEksIHRoaXMgQVBJIG1heSBiZWhhdmUgdW5leHBlY3RlZGx5LlwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmdldEJvdW5kcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZ2VvZ3JhcGhpY2FsIGJvdW5kcyB0aGUgbWFwIGlzIGNvbnN0cmFpbmVkIHRvLCBvciBgbnVsbGAgaWYgbm9uZSBzZXQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBUaGUgbWFwIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbWF4Qm91bmRzID0gbWFwLmdldE1heEJvdW5kcygpO1xuICAgICAqL1xuICAgIGdldE1heEJvdW5kcygpOiBMbmdMYXRCb3VuZHMgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmdldE1heEJvdW5kcygpIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIG1hcCdzIGdlb2dyYXBoaWNhbCBib3VuZHMuXG4gICAgICpcbiAgICAgKiBQYW4gYW5kIHpvb20gb3BlcmF0aW9ucyBhcmUgY29uc3RyYWluZWQgd2l0aGluIHRoZXNlIGJvdW5kcy5cbiAgICAgKiBJZiBhIHBhbiBvciB6b29tIGlzIHBlcmZvcm1lZCB0aGF0IHdvdWxkXG4gICAgICogZGlzcGxheSByZWdpb25zIG91dHNpZGUgdGhlc2UgYm91bmRzLCB0aGUgbWFwIHdpbGxcbiAgICAgKiBpbnN0ZWFkIGRpc3BsYXkgYSBwb3NpdGlvbiBhbmQgem9vbSBsZXZlbFxuICAgICAqIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBvcGVyYXRpb24ncyByZXF1ZXN0IHdoaWxlIHN0aWxsXG4gICAgICogcmVtYWluaW5nIHdpdGhpbiB0aGUgYm91bmRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRCb3VuZHNMaWtlIHwgbnVsbCB8IHVuZGVmaW5lZH0gYm91bmRzIFRoZSBtYXhpbXVtIGJvdW5kcyB0byBzZXQuIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIG1hcCdzIG1heGltdW0gYm91bmRzLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBEZWZpbmUgYm91bmRzIHRoYXQgY29uZm9ybSB0byB0aGUgYExuZ0xhdEJvdW5kc0xpa2VgIG9iamVjdC5cbiAgICAgKiBjb25zdCBib3VuZHMgPSBbXG4gICAgICogICAgIFstNzQuMDQ3MjgsIDQwLjY4MzkyXSwgLy8gW3dlc3QsIHNvdXRoXVxuICAgICAqICAgICBbLTczLjkxMDU4LCA0MC44Nzc2NF0gIC8vIFtlYXN0LCBub3J0aF1cbiAgICAgKiBdO1xuICAgICAqIC8vIFNldCB0aGUgbWFwJ3MgbWF4IGJvdW5kcy5cbiAgICAgKiBtYXAuc2V0TWF4Qm91bmRzKGJvdW5kcyk7XG4gICAgICovXG4gICAgc2V0TWF4Qm91bmRzKGJvdW5kczogTG5nTGF0Qm91bmRzTGlrZSk6IHRoaXMge1xuICAgICAgICB0aGlzLnRyYW5zZm9ybS5zZXRNYXhCb3VuZHMoTG5nTGF0Qm91bmRzLmNvbnZlcnQoYm91bmRzKSk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWFwJ3MgbWluaW11bSB6b29tIGxldmVsLlxuICAgICAqIElmIHRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwgaXMgbG93ZXIgdGhhbiB0aGUgbmV3IG1pbmltdW0sXG4gICAgICogdGhlIG1hcCB3aWxsIHpvb20gdG8gdGhlIG5ldyBtaW5pbXVtLlxuICAgICAqXG4gICAgICogSXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSB0byB6b29tIG91dCBhbmQgcmVhY2ggdGhlIHNldCBgbWluWm9vbWAuXG4gICAgICogT3RoZXIgZmFjdG9ycyBzdWNoIGFzIG1hcCBoZWlnaHQgbWF5IHJlc3RyaWN0IHpvb21pbmcuIEZvciBleGFtcGxlLFxuICAgICAqIGlmIHRoZSBtYXAgaXMgNTEycHggdGFsbCBpdCB3aWxsIG5vdCBiZSBwb3NzaWJsZSB0byB6b29tIGJlbG93IHpvb20gMFxuICAgICAqIG5vIG1hdHRlciB3aGF0IHRoZSBgbWluWm9vbWAgaXMgc2V0IHRvLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBtaW5ab29tIFRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgdG8gc2V0ICgtMiAtIDI0KS5cbiAgICAgKiAgIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIGN1cnJlbnQgbWluaW11bSB6b29tIGFuZCBpdCB3aWxsIGJlIHJlc2V0IHRvIC0yLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0TWluWm9vbSgxMi4yNSk7XG4gICAgICovXG4gICAgc2V0TWluWm9vbShtaW5ab29tPzogP251bWJlcik6IHRoaXMge1xuXG4gICAgICAgIG1pblpvb20gPSBtaW5ab29tID09PSBudWxsIHx8IG1pblpvb20gPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRNaW5ab29tIDogbWluWm9vbTtcblxuICAgICAgICBpZiAobWluWm9vbSA+PSBkZWZhdWx0TWluWm9vbSAmJiBtaW5ab29tIDw9IHRoaXMudHJhbnNmb3JtLm1heFpvb20pIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLm1pblpvb20gPSBtaW5ab29tO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmdldFpvb20oKSA8IG1pblpvb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFpvb20obWluWm9vbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3pvb21zdGFydCcpKVxuICAgICAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3pvb20nKSlcbiAgICAgICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCd6b29tZW5kJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKGBtaW5ab29tIG11c3QgYmUgYmV0d2VlbiAke2RlZmF1bHRNaW5ab29tfSBhbmQgdGhlIGN1cnJlbnQgbWF4Wm9vbSwgaW5jbHVzaXZlYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgbWluaW11bSBhbGxvd2FibGUgem9vbSBsZXZlbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYG1pblpvb21gLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbWluWm9vbSA9IG1hcC5nZXRNaW5ab29tKCk7XG4gICAgICovXG4gICAgZ2V0TWluWm9vbSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWluWm9vbTsgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIG1hcCdzIG1heGltdW0gem9vbSBsZXZlbC5cbiAgICAgKiBJZiB0aGUgbWFwJ3MgY3VycmVudCB6b29tIGxldmVsIGlzIGhpZ2hlciB0aGFuIHRoZSBuZXcgbWF4aW11bSxcbiAgICAgKiB0aGUgbWFwIHdpbGwgem9vbSB0byB0aGUgbmV3IG1heGltdW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IG1heFpvb20gVGhlIG1heGltdW0gem9vbSBsZXZlbCB0byBzZXQuXG4gICAgICogICBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBjdXJyZW50IG1heGltdW0gem9vbSAoc2V0cyBpdCB0byAyMikuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRNYXhab29tKDE4Ljc1KTtcbiAgICAgKi9cbiAgICBzZXRNYXhab29tKG1heFpvb20/OiA/bnVtYmVyKTogdGhpcyB7XG5cbiAgICAgICAgbWF4Wm9vbSA9IG1heFpvb20gPT09IG51bGwgfHwgbWF4Wm9vbSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdE1heFpvb20gOiBtYXhab29tO1xuXG4gICAgICAgIGlmIChtYXhab29tID49IHRoaXMudHJhbnNmb3JtLm1pblpvb20pIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLm1heFpvb20gPSBtYXhab29tO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmdldFpvb20oKSA+IG1heFpvb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFpvb20obWF4Wm9vbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3pvb21zdGFydCcpKVxuICAgICAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3pvb20nKSlcbiAgICAgICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCd6b29tZW5kJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKGBtYXhab29tIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG1pblpvb21gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBtYXhpbXVtIGFsbG93YWJsZSB6b29tIGxldmVsLlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgbWF4Wm9vbWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBtYXhab29tID0gbWFwLmdldE1heFpvb20oKTtcbiAgICAgKi9cbiAgICBnZXRNYXhab29tKCk6IG51bWJlciB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5tYXhab29tOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWFwJ3MgbWluaW11bSBwaXRjaC5cbiAgICAgKiBJZiB0aGUgbWFwJ3MgY3VycmVudCBwaXRjaCBpcyBsb3dlciB0aGFuIHRoZSBuZXcgbWluaW11bSxcbiAgICAgKiB0aGUgbWFwIHdpbGwgcGl0Y2ggdG8gdGhlIG5ldyBtaW5pbXVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBtaW5QaXRjaCBUaGUgbWluaW11bSBwaXRjaCB0byBzZXQgKDAtODUpLiBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBjdXJyZW50IG1pbmltdW0gcGl0Y2ggYW5kIHJlc2V0cyBpdCB0byAwLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0TWluUGl0Y2goNSk7XG4gICAgICovXG4gICAgc2V0TWluUGl0Y2gobWluUGl0Y2g/OiA/bnVtYmVyKTogdGhpcyB7XG5cbiAgICAgICAgbWluUGl0Y2ggPSBtaW5QaXRjaCA9PT0gbnVsbCB8fCBtaW5QaXRjaCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdE1pblBpdGNoIDogbWluUGl0Y2g7XG5cbiAgICAgICAgaWYgKG1pblBpdGNoIDwgZGVmYXVsdE1pblBpdGNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pblBpdGNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7ZGVmYXVsdE1pblBpdGNofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pblBpdGNoID49IGRlZmF1bHRNaW5QaXRjaCAmJiBtaW5QaXRjaCA8PSB0aGlzLnRyYW5zZm9ybS5tYXhQaXRjaCkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ubWluUGl0Y2ggPSBtaW5QaXRjaDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRQaXRjaCgpIDwgbWluUGl0Y2gpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFBpdGNoKG1pblBpdGNoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncGl0Y2hzdGFydCcpKVxuICAgICAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3BpdGNoJykpXG4gICAgICAgICAgICAgICAgICAgIC5maXJlKG5ldyBFdmVudCgncGl0Y2hlbmQnKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoYG1pblBpdGNoIG11c3QgYmUgYmV0d2VlbiAke2RlZmF1bHRNaW5QaXRjaH0gYW5kIHRoZSBjdXJyZW50IG1heFBpdGNoLCBpbmNsdXNpdmVgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBtaW5pbXVtIGFsbG93YWJsZSBwaXRjaC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYG1pblBpdGNoYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IG1pblBpdGNoID0gbWFwLmdldE1pblBpdGNoKCk7XG4gICAgICovXG4gICAgZ2V0TWluUGl0Y2goKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLm1pblBpdGNoOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG9yIGNsZWFycyB0aGUgbWFwJ3MgbWF4aW11bSBwaXRjaC5cbiAgICAgKiBJZiB0aGUgbWFwJ3MgY3VycmVudCBwaXRjaCBpcyBoaWdoZXIgdGhhbiB0aGUgbmV3IG1heGltdW0sXG4gICAgICogdGhlIG1hcCB3aWxsIHBpdGNoIHRvIHRoZSBuZXcgbWF4aW11bS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gbWF4UGl0Y2ggVGhlIG1heGltdW0gcGl0Y2ggdG8gc2V0LlxuICAgICAqICAgSWYgYG51bGxgIG9yIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgY3VycmVudCBtYXhpbXVtIHBpdGNoIChzZXRzIGl0IHRvIDg1KS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldE1heFBpdGNoKDcwKTtcbiAgICAgKi9cbiAgICBzZXRNYXhQaXRjaChtYXhQaXRjaD86ID9udW1iZXIpOiB0aGlzIHtcblxuICAgICAgICBtYXhQaXRjaCA9IG1heFBpdGNoID09PSBudWxsIHx8IG1heFBpdGNoID09PSB1bmRlZmluZWQgPyBkZWZhdWx0TWF4UGl0Y2ggOiBtYXhQaXRjaDtcblxuICAgICAgICBpZiAobWF4UGl0Y2ggPiBkZWZhdWx0TWF4UGl0Y2gpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbWF4UGl0Y2ggbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHtkZWZhdWx0TWF4UGl0Y2h9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4UGl0Y2ggPj0gdGhpcy50cmFuc2Zvcm0ubWluUGl0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLm1heFBpdGNoID0gbWF4UGl0Y2g7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UGl0Y2goKSA+IG1heFBpdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQaXRjaChtYXhQaXRjaCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3BpdGNoc3RhcnQnKSlcbiAgICAgICAgICAgICAgICAgICAgLmZpcmUobmV3IEV2ZW50KCdwaXRjaCcpKVxuICAgICAgICAgICAgICAgICAgICAuZmlyZShuZXcgRXZlbnQoJ3BpdGNoZW5kJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKGBtYXhQaXRjaCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5QaXRjaGApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIG1heGltdW0gYWxsb3dhYmxlIHBpdGNoLlxuICAgICAqXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgbWF4UGl0Y2hgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbWF4UGl0Y2ggPSBtYXAuZ2V0TWF4UGl0Y2goKTtcbiAgICAgKi9cbiAgICBnZXRNYXhQaXRjaCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0ubWF4UGl0Y2g7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0YXRlIG9mIGByZW5kZXJXb3JsZENvcGllc2AuIElmIGB0cnVlYCwgbXVsdGlwbGUgY29waWVzIG9mIHRoZSB3b3JsZCB3aWxsIGJlIHJlbmRlcmVkIHNpZGUgYnkgc2lkZSBiZXlvbmQgLTE4MCBhbmQgMTgwIGRlZ3JlZXMgbG9uZ2l0dWRlLiBJZiBzZXQgdG8gYGZhbHNlYDpcbiAgICAgKiAtIFdoZW4gdGhlIG1hcCBpcyB6b29tZWQgb3V0IGZhciBlbm91Z2ggdGhhdCBhIHNpbmdsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd29ybGQgZG9lcyBub3QgZmlsbCB0aGUgbWFwJ3MgZW50aXJlXG4gICAgICogY29udGFpbmVyLCB0aGVyZSB3aWxsIGJlIGJsYW5rIHNwYWNlIGJleW9uZCAxODAgYW5kIC0xODAgZGVncmVlcyBsb25naXR1ZGUuXG4gICAgICogLSBGZWF0dXJlcyB0aGF0IGNyb3NzIDE4MCBhbmQgLTE4MCBkZWdyZWVzIGxvbmdpdHVkZSB3aWxsIGJlIGN1dCBpbiB0d28gKHdpdGggb25lIHBvcnRpb24gb24gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlXG4gICAgICogbWFwIGFuZCB0aGUgb3RoZXIgb24gdGhlIGxlZnQgZWRnZSBvZiB0aGUgbWFwKSBhdCBldmVyeSB6b29tIGxldmVsLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHJlbmRlcldvcmxkQ29waWVzYCBib29sZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgd29ybGRDb3BpZXNSZW5kZXJlZCA9IG1hcC5nZXRSZW5kZXJXb3JsZENvcGllcygpO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IFJlbmRlciB3b3JsZCBjb3BpZXNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3JlbmRlci13b3JsZC1jb3BpZXMvKVxuICAgICAqL1xuICAgIGdldFJlbmRlcldvcmxkQ29waWVzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucmVuZGVyV29ybGRDb3BpZXM7IH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHN0YXRlIG9mIGByZW5kZXJXb3JsZENvcGllc2AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlbmRlcldvcmxkQ29waWVzIElmIGB0cnVlYCwgbXVsdGlwbGUgY29waWVzIG9mIHRoZSB3b3JsZCB3aWxsIGJlIHJlbmRlcmVkIHNpZGUgYnkgc2lkZSBiZXlvbmQgLTE4MCBhbmQgMTgwIGRlZ3JlZXMgbG9uZ2l0dWRlLiBJZiBzZXQgdG8gYGZhbHNlYDpcbiAgICAgKiAtIFdoZW4gdGhlIG1hcCBpcyB6b29tZWQgb3V0IGZhciBlbm91Z2ggdGhhdCBhIHNpbmdsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd29ybGQgZG9lcyBub3QgZmlsbCB0aGUgbWFwJ3MgZW50aXJlXG4gICAgICogY29udGFpbmVyLCB0aGVyZSB3aWxsIGJlIGJsYW5rIHNwYWNlIGJleW9uZCAxODAgYW5kIC0xODAgZGVncmVlcyBsb25naXR1ZGUuXG4gICAgICogLSBGZWF0dXJlcyB0aGF0IGNyb3NzIDE4MCBhbmQgLTE4MCBkZWdyZWVzIGxvbmdpdHVkZSB3aWxsIGJlIGN1dCBpbiB0d28gKHdpdGggb25lIHBvcnRpb24gb24gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlXG4gICAgICogbWFwIGFuZCB0aGUgb3RoZXIgb24gdGhlIGxlZnQgZWRnZSBvZiB0aGUgbWFwKSBhdCBldmVyeSB6b29tIGxldmVsLlxuICAgICAqXG4gICAgICogYHVuZGVmaW5lZGAgaXMgdHJlYXRlZCBhcyBgdHJ1ZWAsIGBudWxsYCBpcyB0cmVhdGVkIGFzIGBmYWxzZWAuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRSZW5kZXJXb3JsZENvcGllcyh0cnVlKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBSZW5kZXIgd29ybGQgY29waWVzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9yZW5kZXItd29ybGQtY29waWVzLylcbiAgICAgKi9cbiAgICBzZXRSZW5kZXJXb3JsZENvcGllcyhyZW5kZXJXb3JsZENvcGllcz86ID9ib29sZWFuKTogdGhpcyB7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLnJlbmRlcldvcmxkQ29waWVzID0gcmVuZGVyV29ybGRDb3BpZXM7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb2RlIGZvciB0aGUgbWFwJ3MgbGFuZ3VhZ2Ugd2hpY2ggaXMgdXNlZCBmb3IgdHJhbnNsYXRpbmcgbWFwIGxhYmVscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbWFwJ3MgbGFuZ3VhZ2UgY29kZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGxhbmd1YWdlID0gbWFwLmdldExhbmd1YWdlKCk7XG4gICAgICovXG4gICAgZ2V0TGFuZ3VhZ2UoKTogP3N0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAncyBsYW5ndWFnZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVzaXJlZCBsYW5ndWFnZS4gYHVuZGVmaW5lZGAgb3IgYG51bGxgIHdpbGwgcmVtb3ZlIHRoZSBjdXJyZW50IG1hcCBsYW5ndWFnZSBhbmQgcmVzZXQgdGhlIG1hcCB0byB0aGUgZGVmYXVsdCBsYW5ndWFnZSBhcyBkZXRlcm1pbmVkIGJ5IGB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlYC5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldExhbmd1YWdlKCdlcycpO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0TGFuZ3VhZ2UoJ2F1dG8nKTtcbiAgICAgKi9cbiAgICBzZXRMYW5ndWFnZShsYW5ndWFnZT86ID9zdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2UgPSBsYW5ndWFnZSA9PT0gJ2F1dG8nID8gd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZSA6IGxhbmd1YWdlO1xuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc3R5bGUuX3NvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc3R5bGUuX3NvdXJjZUNhY2hlc1tpZF0uX3NvdXJjZTtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlLl9zZXRMYW5ndWFnZSkge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2UuX3NldExhbmd1YWdlKHRoaXMuX2xhbmd1YWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5fY29udHJvbHMpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLl9zZXRMYW5ndWFnZSkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuX3NldExhbmd1YWdlKHRoaXMuX2xhbmd1YWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvZGUgZm9yIHRoZSBtYXAncyB3b3JsZHZpZXcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1hcCdzIHdvcmxkdmlldyBjb2RlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3Qgd29ybGR2aWV3ID0gbWFwLmdldFdvcmxkdmlldygpO1xuICAgICAqL1xuICAgIGdldFdvcmxkdmlldygpOiA/c3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmxkdmlldztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAncyB3b3JsZHZpZXcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB3b3JsZHZpZXcgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZXNpcmVkIHdvcmxkdmlldy4gYHVuZGVmaW5lZGAgb3IgYG51bGxgIHdpbGwgY2F1c2UgdGhlIG1hcCB0byBmYWxsIGJhY2sgdG8gdGhlIFRpbGVKU09OJ3MgZGVmYXVsdCB3b3JsZHZpZXcuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRXb3JsZFZpZXcoJ0pQJyk7XG4gICAgICovXG4gICAgc2V0V29ybGR2aWV3KHdvcmxkdmlldz86ID9zdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fd29ybGR2aWV3ID0gd29ybGR2aWV3O1xuICAgICAgICBpZiAodGhpcy5zdHlsZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnN0eWxlLl9zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnN0eWxlLl9zb3VyY2VDYWNoZXNbaWRdLl9zb3VyY2U7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5fc2V0V29ybGR2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5fc2V0V29ybGR2aWV3KHdvcmxkdmlldyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7UG9pbnQgY29udmVyc2lvbn0gKi9cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBbcHJvamVjdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvcHJvamVjdGlvbi8pIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIGN1cnJlbnQgbWFwIHByb2plY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UHJvamVjdGlvblNwZWNpZmljYXRpb259IFRoZSBbcHJvamVjdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvcHJvamVjdGlvbi8pIGRlZmluaW5nIHRoZSBjdXJyZW50IG1hcCBwcm9qZWN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgcHJvamVjdGlvbiA9IG1hcC5nZXRQcm9qZWN0aW9uKCk7XG4gICAgICovXG4gICAgZ2V0UHJvamVjdGlvbigpOiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbiB7XG4gICAgICAgIGlmICh0aGlzLl9leHBsaWNpdFByb2plY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9leHBsaWNpdFByb2plY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5zdHlsZXNoZWV0ICYmIHRoaXMuc3R5bGUuc3R5bGVzaGVldC5wcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5zdHlsZXNoZWV0LnByb2plY3Rpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtuYW1lOiBcIm1lcmNhdG9yXCIsIGNlbnRlcjpbMCwgMF19O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBtYXAgW3Byb2plY3Rpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3Byb2plY3Rpb24vKSBoYXMgYmVlbiBzZXQgdG8gZ2xvYmUgQU5EIHRoZSBtYXAgaXMgYXQgYSBsb3cgZW5vdWdoIHpvb20gbGV2ZWwgdGhhdCBnbG9iZSB2aWV3IGlzIGVuYWJsZWQuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZ2xvYmUtaXMtYWN0aXZlYCBib29sZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogaWYgKG1hcC5fdXNpbmdHbG9iZSgpKSB7XG4gICAgICogICAgIC8vIGRvIGdsb2JlIHRoaW5ncyBoZXJlXG4gICAgICogfVxuICAgICAqL1xuICAgIF91c2luZ0dsb2JlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAncyBwcm9qZWN0aW9uLiBJZiBjYWxsZWQgd2l0aCBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHRoZSBtYXAgd2lsbCByZXNldCB0byBNZXJjYXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvamVjdGlvblNwZWNpZmljYXRpb24gfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBwcm9qZWN0aW9uIFRoZSBwcm9qZWN0aW9uIHRoYXQgdGhlIG1hcCBzaG91bGQgYmUgcmVuZGVyZWQgaW4uXG4gICAgICogVGhpcyBjYW4gYmUgYSBbcHJvamVjdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvcHJvamVjdGlvbi8pIG9iamVjdCBvciBhIHN0cmluZyBvZiB0aGUgcHJvamVjdGlvbidzIG5hbWUuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRQcm9qZWN0aW9uKCdhbGJlcnMnKTtcbiAgICAgKiBtYXAuc2V0UHJvamVjdGlvbih7XG4gICAgICogICAgIG5hbWU6ICdhbGJlcnMnLFxuICAgICAqICAgICBjZW50ZXI6IFszNSwgNTVdLFxuICAgICAqICAgICBwYXJhbGxlbHM6IFsyMCwgNjBdXG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHdlYiBtYXAgdXNpbmcgYW4gYWx0ZXJuYXRlIHByb2plY3Rpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL21hcC1wcm9qZWN0aW9uLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBVc2UgZGlmZmVyZW50IG1hcCBwcm9qZWN0aW9ucyBmb3Igd2ViIG1hcHNdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3Byb2plY3Rpb25zLylcbiAgICAgKi9cbiAgICBzZXRQcm9qZWN0aW9uKHByb2plY3Rpb24/OiA/UHJvamVjdGlvblNwZWNpZmljYXRpb24gfCBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbGF6eUluaXRFbXB0eVN0eWxlKCk7XG4gICAgICAgIGlmICghcHJvamVjdGlvbikge1xuICAgICAgICAgICAgcHJvamVjdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb2plY3Rpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwcm9qZWN0aW9uID0gKCh7bmFtZTogcHJvamVjdGlvbn06IGFueSk6IFByb2plY3Rpb25TcGVjaWZpY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlUHJvamVjdGlvbihwcm9qZWN0aW9uKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlUHJvamVjdGlvbihleHBsaWNpdFByb2plY3Rpb24/OiBQcm9qZWN0aW9uU3BlY2lmaWNhdGlvbiB8IG51bGwpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgcHJldlByb2plY3Rpb24gPSB0aGlzLmdldFByb2plY3Rpb24oKTtcbiAgICAgICAgaWYgKGV4cGxpY2l0UHJvamVjdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fZXhwbGljaXRQcm9qZWN0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9qZWN0aW9uID0gZXhwbGljaXRQcm9qZWN0aW9uIHx8IHRoaXMuZ2V0UHJvamVjdGlvbigpO1xuXG4gICAgICAgIGxldCBwcm9qZWN0aW9uSGFzQ2hhbmdlZDtcbiAgICAgICAgLy8gQXQgaGlnaCB6b29tIG9uIGdsb2JlLCBzZXQgdHJhbnNmb3JtIHByb2plY3Rpb24gdG8gTWVyY2F0b3Igd2hpbGUgX2V4cGxpY2l0UHJvamVjdGlvbiBzdGF5cyBnbG9iZS5cbiAgICAgICAgaWYgKHByb2plY3Rpb24gJiYgcHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnICYmIHRoaXMudHJhbnNmb3JtLnpvb20gPj0gR0xPQkVfWk9PTV9USFJFU0hPTERfTUFYKSB7XG4gICAgICAgICAgICBwcm9qZWN0aW9uSGFzQ2hhbmdlZCA9IHRoaXMudHJhbnNmb3JtLnNldFByb2plY3Rpb24oe25hbWU6ICdtZXJjYXRvcid9KTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLm1lcmNhdG9yRnJvbVRyYW5zaXRpb24gPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvamVjdGlvbkhhc0NoYW5nZWQgPSB0aGlzLnRyYW5zZm9ybS5zZXRQcm9qZWN0aW9uKHByb2plY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ubWVyY2F0b3JGcm9tVHJhbnNpdGlvbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiBjYWxsZWQgdGhyb3VnaCBzZXRQcm9qZWN0aW9uLCB1cGRhdGUgX2V4cGxpY2l0UHJvamVjdGlvblxuICAgICAgICBpZiAoZXhwbGljaXRQcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9leHBsaWNpdFByb2plY3Rpb24gPSAoZXhwbGljaXRQcm9qZWN0aW9uLm5hbWUgPT09IFwiZ2xvYmVcIiA/XG4gICAgICAgICAgICAgICAge25hbWU6J2dsb2JlJywgY2VudGVyOlswLCAwXX0gOlxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLmdldFByb2plY3Rpb24oKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0eWxlLmFwcGx5UHJvamVjdGlvblVwZGF0ZSgpO1xuXG4gICAgICAgIGlmIChwcm9qZWN0aW9uSGFzQ2hhbmdlZCkge1xuICAgICAgICAgICAgLy8gSWYgYSB6b29tIHRyYW5zaXRpb24gb24gZ2xvYmVcbiAgICAgICAgICAgIGlmIChwcmV2UHJvamVjdGlvbi5uYW1lID09PSAnZ2xvYmUnICYmIHRoaXMuZ2V0UHJvamVjdGlvbigpLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLl9mb3JjZVN5bWJvbExheWVyVXBkYXRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElmIGEgc3dpdGNoIGJldHdlZW4gZGlmZmVyZW50IHByb2plY3Rpb25zXG4gICAgICAgICAgICAgICAgdGhpcy5wYWludGVyLmNsZWFyQmFja2dyb3VuZFRpbGVzKCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnN0eWxlLl9zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5fc291cmNlQ2FjaGVzW2lkXS5jbGVhclRpbGVzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBQb2ludH0gcmVwcmVzZW50aW5nIHBpeGVsIGNvb3JkaW5hdGVzLCByZWxhdGl2ZSB0byB0aGUgbWFwJ3MgYGNvbnRhaW5lcmAsXG4gICAgICogdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBzcGVjaWZpZWQgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uLlxuICAgICAqXG4gICAgICogV2hlbiB0aGUgbWFwIGlzIHBpdGNoZWQgYW5kIGBsbmdsYXRgIGlzIGNvbXBsZXRlbHkgYmVoaW5kIHRoZSBjYW1lcmEsIHRoZXJlIGFyZSBubyBwaXhlbFxuICAgICAqIGNvb3JkaW5hdGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBsb2NhdGlvbi4gSW4gdGhhdCBjYXNlLFxuICAgICAqIHRoZSBgeGAgYW5kIGB5YCBjb21wb25lbnRzIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgUG9pbnR9IGFyZSBzZXQgdG8gTnVtYmVyLk1BWF9WQUxVRS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbG5nbGF0IFRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gdG8gcHJvamVjdC5cbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IFRoZSB7QGxpbmsgUG9pbnR9IGNvcnJlc3BvbmRpbmcgdG8gYGxuZ2xhdGAsIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBgY29udGFpbmVyYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNvb3JkaW5hdGUgPSBbLTEyMi40MjA2NzksIDM3Ljc3MjUzN107XG4gICAgICogY29uc3QgcG9pbnQgPSBtYXAucHJvamVjdChjb29yZGluYXRlKTtcbiAgICAgKi9cbiAgICBwcm9qZWN0KGxuZ2xhdDogTG5nTGF0TGlrZSk6IFBvaW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLmxvY2F0aW9uUG9pbnQzRChMbmdMYXQuY29udmVydChsbmdsYXQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIExuZ0xhdH0gcmVwcmVzZW50aW5nIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlcyB0aGF0IGNvcnJlc3BvbmRcbiAgICAgKiB0byB0aGUgc3BlY2lmaWVkIHBpeGVsIGNvb3JkaW5hdGVzLiBJZiBob3Jpem9uIGlzIHZpc2libGUsIGFuZCBzcGVjaWZpZWQgcGl4ZWwgaXNcbiAgICAgKiBhYm92ZSBob3Jpem9uLCByZXR1cm5zIGEge0BsaW5rIExuZ0xhdH0gY29ycmVzcG9uZGluZyB0byBwb2ludCBvbiBob3Jpem9uLCBuZWFyZXN0XG4gICAgICogdG8gdGhlIHBvaW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V9IHBvaW50IFRoZSBwaXhlbCBjb29yZGluYXRlcyB0byB1bnByb2plY3QuXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIHtAbGluayBMbmdMYXR9IGNvcnJlc3BvbmRpbmcgdG8gYHBvaW50YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAqICAgICAvLyBXaGVuIHRoZSBtYXAgaXMgY2xpY2tlZCwgZ2V0IHRoZSBnZW9ncmFwaGljIGNvb3JkaW5hdGUuXG4gICAgICogICAgIGNvbnN0IGNvb3JkaW5hdGUgPSBtYXAudW5wcm9qZWN0KGUucG9pbnQpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHVucHJvamVjdChwb2ludDogUG9pbnRMaWtlKTogTG5nTGF0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBvaW50TG9jYXRpb24zRChQb2ludC5jb252ZXJ0KHBvaW50KSk7XG4gICAgfVxuXG4gICAgLyoqIEBzZWN0aW9uIHtNb3ZlbWVudCBzdGF0ZX0gKi9cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGlzIHBhbm5pbmcsIHpvb21pbmcsIHJvdGF0aW5nLCBvciBwaXRjaGluZyBkdWUgdG8gYSBjYW1lcmEgYW5pbWF0aW9uIG9yIHVzZXIgZ2VzdHVyZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBtYXAgaXMgbW92aW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNNb3ZpbmcgPSBtYXAuaXNNb3ZpbmcoKTtcbiAgICAgKi9cbiAgICBpc01vdmluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vdmluZyB8fCAodGhpcy5oYW5kbGVycyAmJiB0aGlzLmhhbmRsZXJzLmlzTW92aW5nKCkpIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGlzIHpvb21pbmcgZHVlIHRvIGEgY2FtZXJhIGFuaW1hdGlvbiBvciB1c2VyIGdlc3R1cmUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWFwIGlzIHpvb21pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc1pvb21pbmcgPSBtYXAuaXNab29taW5nKCk7XG4gICAgICovXG4gICAgaXNab29taW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fem9vbWluZyB8fCAodGhpcy5oYW5kbGVycyAmJiB0aGlzLmhhbmRsZXJzLmlzWm9vbWluZygpKSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1hcCBpcyByb3RhdGluZyBkdWUgdG8gYSBjYW1lcmEgYW5pbWF0aW9uIG9yIHVzZXIgZ2VzdHVyZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBtYXAgaXMgcm90YXRpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuaXNSb3RhdGluZygpO1xuICAgICAqL1xuICAgIGlzUm90YXRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3RhdGluZyB8fCAodGhpcy5oYW5kbGVycyAmJiB0aGlzLmhhbmRsZXJzLmlzUm90YXRpbmcoKSkgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgX2NyZWF0ZURlbGVnYXRlZExpc3RlbmVyKHR5cGU6IE1hcEV2ZW50LCBsYXllcnM6IEFycmF5PGFueT4sIGxpc3RlbmVyOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ21vdXNlZW50ZXInIHx8IHR5cGUgPT09ICdtb3VzZW92ZXInKSB7XG4gICAgICAgICAgICBsZXQgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgbW91c2Vtb3ZlID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZExheWVycyA9IGxheWVycy5maWx0ZXIobGF5ZXJJZCA9PiB0aGlzLmdldExheWVyKGxheWVySWQpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlcyA9IGZpbHRlcmVkTGF5ZXJzLmxlbmd0aCA/IHRoaXMucXVlcnlSZW5kZXJlZEZlYXR1cmVzKGUucG9pbnQsIHtsYXllcnM6IGZpbHRlcmVkTGF5ZXJzfSkgOiBbXTtcbiAgICAgICAgICAgICAgICBpZiAoIWZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBtb3VzZWluID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbW91c2Vpbikge1xuICAgICAgICAgICAgICAgICAgICBtb3VzZWluID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBuZXcgTWFwTW91c2VFdmVudCh0eXBlLCB0aGlzLCBlLm9yaWdpbmFsRXZlbnQsIHtmZWF0dXJlc30pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgbW91c2VvdXQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtsYXllcnM6IG5ldyBTZXQobGF5ZXJzKSwgbGlzdGVuZXIsIGRlbGVnYXRlczoge21vdXNlbW92ZSwgbW91c2VvdXR9fTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnbW91c2VsZWF2ZScgfHwgdHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuICAgICAgICAgICAgbGV0IG1vdXNlaW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IG1vdXNlbW92ZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRMYXllcnMgPSBsYXllcnMuZmlsdGVyKGxheWVySWQgPT4gdGhpcy5nZXRMYXllcihsYXllcklkKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBmaWx0ZXJlZExheWVycy5sZW5ndGggPyB0aGlzLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50LCB7bGF5ZXJzOiBmaWx0ZXJlZExheWVyc30pIDogW107XG4gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBtb3VzZWluID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vdXNlaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIG5ldyBNYXBNb3VzZUV2ZW50KHR5cGUsIHRoaXMsIGUub3JpZ2luYWxFdmVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBtb3VzZW91dCA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vdXNlaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbW91c2VpbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIG5ldyBNYXBNb3VzZUV2ZW50KHR5cGUsIHRoaXMsIGUub3JpZ2luYWxFdmVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiB7bGF5ZXJzOiBuZXcgU2V0KGxheWVycyksIGxpc3RlbmVyLCBkZWxlZ2F0ZXM6IHttb3VzZW1vdmUsIG1vdXNlb3V0fX07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkZWxlZ2F0ZSA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyZWRMYXllcnMgPSBsYXllcnMuZmlsdGVyKGxheWVySWQgPT4gdGhpcy5nZXRMYXllcihsYXllcklkKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBmaWx0ZXJlZExheWVycy5sZW5ndGggPyB0aGlzLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhlLnBvaW50LCB7bGF5ZXJzOiBmaWx0ZXJlZExheWVyc30pIDogW107XG4gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIG5lZWQgdG8gbXV0YXRlIHRoZSBvcmlnaW5hbCBldmVudCwgc28gdGhhdCBwcmV2ZW50RGVmYXVsdCB3b3JrcyBhcyBleHBlY3RlZC5cbiAgICAgICAgICAgICAgICAgICAgZS5mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgZS5mZWF0dXJlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4ge2xheWVyczogbmV3IFNldChsYXllcnMpLCBsaXN0ZW5lciwgZGVsZWdhdGVzOiB7Wyh0eXBlOiBzdHJpbmcpXTogZGVsZWdhdGV9fTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7V29ya2luZyB3aXRoIGV2ZW50c30gKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmb3IgZXZlbnRzIG9mIGEgc3BlY2lmaWVkIHR5cGUsXG4gICAgICogb3B0aW9uYWxseSBsaW1pdGVkIHRvIGZlYXR1cmVzIGluIGEgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvci4gRXZlbnRzIGNvbXBhdGlibGUgd2l0aCB0aGUgb3B0aW9uYWwgYGxheWVySWRgIHBhcmFtZXRlciBhcmUgdHJpZ2dlcmVkXG4gICAgICogd2hlbiB0aGUgY3Vyc29yIGVudGVycyBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxheWVyIGZyb20gb3V0c2lkZSB0aGF0IGxheWVyIG9yIG91dHNpZGUgdGhlIG1hcCBjYW52YXMuXG4gICAgICpcbiAgICAgKiB8IEV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbXBhdGlibGUgd2l0aCBgbGF5ZXJJZGAgfFxuICAgICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gICAgICogfCBbYG1vdXNlZG93bmBdKCNtYXAuZXZlbnQ6bW91c2Vkb3duKSAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgbW91c2V1cGBdKCNtYXAuZXZlbnQ6bW91c2V1cCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Btb3VzZW92ZXJgXSgjbWFwLmV2ZW50Om1vdXNlb3ZlcikgICAgICAgICAgICAgICAgICAgICAgIHwgeWVzICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYG1vdXNlb3V0YF0oI21hcC5ldmVudDptb3VzZW91dCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgbW91c2Vtb3ZlYF0oI21hcC5ldmVudDptb3VzZW1vdmUpICAgICAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Btb3VzZWVudGVyYF0oI21hcC5ldmVudDptb3VzZWVudGVyKSAgICAgICAgICAgICAgICAgICAgIHwgeWVzIChyZXF1aXJlZCkgICAgICAgICAgICB8XG4gICAgICogfCBbYG1vdXNlbGVhdmVgXSgjbWFwLmV2ZW50Om1vdXNlbGVhdmUpICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgKHJlcXVpcmVkKSAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgcHJlY2xpY2tgXSgjbWFwLmV2ZW50OnByZWNsaWNrKSAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2BjbGlja2BdKCNtYXAuZXZlbnQ6Y2xpY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeWVzICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYGRibGNsaWNrYF0oI21hcC5ldmVudDpkYmxjbGljaykgICAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgY29udGV4dG1lbnVgXSgjbWFwLmV2ZW50OmNvbnRleHRtZW51KSAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2B0b3VjaHN0YXJ0YF0oI21hcC5ldmVudDp0b3VjaHN0YXJ0KSAgICAgICAgICAgICAgICAgICAgIHwgeWVzICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHRvdWNoZW5kYF0oI21hcC5ldmVudDp0b3VjaGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgdG91Y2hjYW5jZWxgXSgjbWFwLmV2ZW50OnRvdWNoY2FuY2VsKSAgICAgICAgICAgICAgICAgICB8IHllcyAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2B3aGVlbGBdKCNtYXAuZXZlbnQ6d2hlZWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHJlc2l6ZWBdKCNtYXAuZXZlbnQ6cmVzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgcmVtb3ZlYF0oI21hcC5ldmVudDpyZW1vdmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2B0b3VjaG1vdmVgXSgjbWFwLmV2ZW50OnRvdWNobW92ZSkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYG1vdmVzdGFydGBdKCNtYXAuZXZlbnQ6bW92ZXN0YXJ0KSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgbW92ZWBdKCNtYXAuZXZlbnQ6bW92ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Btb3ZlZW5kYF0oI21hcC5ldmVudDptb3ZlZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYGRyYWdzdGFydGBdKCNtYXAuZXZlbnQ6ZHJhZ3N0YXJ0KSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgZHJhZ2BdKCNtYXAuZXZlbnQ6ZHJhZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2BkcmFnZW5kYF0oI21hcC5ldmVudDpkcmFnZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHpvb21zdGFydGBdKCNtYXAuZXZlbnQ6em9vbXN0YXJ0KSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgem9vbWBdKCNtYXAuZXZlbnQ6em9vbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2B6b29tZW5kYF0oI21hcC5ldmVudDp6b29tZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHJvdGF0ZXN0YXJ0YF0oI21hcC5ldmVudDpyb3RhdGVzdGFydCkgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgcm90YXRlYF0oI21hcC5ldmVudDpyb3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Byb3RhdGVlbmRgXSgjbWFwLmV2ZW50OnJvdGF0ZWVuZCkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHBpdGNoc3RhcnRgXSgjbWFwLmV2ZW50OnBpdGNoc3RhcnQpICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgcGl0Y2hgXSgjbWFwLmV2ZW50OnBpdGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2BwaXRjaGVuZGBdKCNtYXAuZXZlbnQ6cGl0Y2hlbmQpICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYGJveHpvb21zdGFydGBdKCNtYXAuZXZlbnQ6Ym94em9vbXN0YXJ0KSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgYm94em9vbWVuZGBdKCNtYXAuZXZlbnQ6Ym94em9vbWVuZCkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Bib3h6b29tY2FuY2VsYF0oI21hcC5ldmVudDpib3h6b29tY2FuY2VsKSAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHdlYmdsY29udGV4dGxvc3RgXSgjbWFwLmV2ZW50OndlYmdsY29udGV4dGxvc3QpICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgd2ViZ2xjb250ZXh0cmVzdG9yZWRgXSgjbWFwLmV2ZW50OndlYmdsY29udGV4dHJlc3RvcmVkKSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Bsb2FkYF0oI21hcC5ldmVudDpsb2FkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHJlbmRlcmBdKCNtYXAuZXZlbnQ6cmVuZGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgaWRsZWBdKCNtYXAuZXZlbnQ6aWRsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2BlcnJvcmBdKCNtYXAuZXZlbnQ6ZXJyb3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYGRhdGFgXSgjbWFwLmV2ZW50OmRhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgc3R5bGVkYXRhYF0oI21hcC5ldmVudDpzdHlsZWRhdGEpICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Bzb3VyY2VkYXRhYF0oI21hcC5ldmVudDpzb3VyY2VkYXRhKSAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYGRhdGFsb2FkaW5nYF0oI21hcC5ldmVudDpkYXRhbG9hZGluZykgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKiB8IFtgc3R5bGVkYXRhbG9hZGluZ2BdKCNtYXAuZXZlbnQ6c3R5bGVkYXRhbG9hZGluZykgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgICAqIHwgW2Bzb3VyY2VkYXRhbG9hZGluZ2BdKCNtYXAuZXZlbnQ6c291cmNlZGF0YWxvYWRpbmcpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICogfCBbYHN0eWxlaW1hZ2VtaXNzaW5nYF0oI21hcC5ldmVudDpzdHlsZWltYWdlbWlzc2luZykgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXk8c3RyaW5nPn0gbGF5ZXJJZHMgKG9wdGlvbmFsKSBUaGUgSUQocykgb2YgYSBzdHlsZSBsYXllcihzKS4gSWYgeW91IHByb3ZpZGUgYSBgbGF5ZXJJZGAsXG4gICAgICogdGhlIGxpc3RlbmVyIHdpbGwgYmUgdHJpZ2dlcmVkIG9ubHkgaWYgaXRzIGxvY2F0aW9uIGlzIHdpdGhpbiBhIHZpc2libGUgZmVhdHVyZSBpbiB0aGVzZSBsYXllcnMsXG4gICAgICogYW5kIHRoZSBldmVudCB3aWxsIGhhdmUgYSBgZmVhdHVyZXNgIHByb3BlcnR5IGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgdGhlIG1hdGNoaW5nIGZlYXR1cmVzLlxuICAgICAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSBgbGF5ZXJJZHNgLCB0aGUgbGlzdGVuZXIgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgYSBjb3JyZXNwb25kaW5nIGV2ZW50XG4gICAgICogaGFwcGVuaW5nIGFueXdoZXJlIG9uIHRoZSBtYXAsIGFuZCB0aGUgZXZlbnQgd2lsbCBub3QgaGF2ZSBhIGBmZWF0dXJlc2AgcHJvcGVydHkuXG4gICAgICogTm90ZSB0aGF0IG1hbnkgZXZlbnQgdHlwZXMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkc2AgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgZmlyZVxuICAgICAqIC8vIHdoZW4gdGhlIG1hcCBoYXMgZmluaXNoZWQgbG9hZGluZy5cbiAgICAgKiBtYXAub24oJ2xvYWQnLCAoKSA9PiB7XG4gICAgICogICAgIC8vIEFkZCBhIG5ldyBsYXllci5cbiAgICAgKiAgICAgbWFwLmFkZExheWVyKHtcbiAgICAgKiAgICAgICAgIGlkOiAncG9pbnRzLW9mLWludGVyZXN0JyxcbiAgICAgKiAgICAgICAgIHNvdXJjZToge1xuICAgICAqICAgICAgICAgICAgIHR5cGU6ICd2ZWN0b3InLFxuICAgICAqICAgICAgICAgICAgIHVybDogJ21hcGJveDovL21hcGJveC5tYXBib3gtc3RyZWV0cy12OCdcbiAgICAgKiAgICAgICAgIH0sXG4gICAgICogICAgICAgICAnc291cmNlLWxheWVyJzogJ3BvaV9sYWJlbCcsXG4gICAgICogICAgICAgICB0eXBlOiAnY2lyY2xlJyxcbiAgICAgKiAgICAgICAgIHBhaW50OiB7XG4gICAgICogICAgICAgICAgICAgLy8gTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24gcGFpbnQgcHJvcGVydGllc1xuICAgICAqICAgICAgICAgfSxcbiAgICAgKiAgICAgICAgIGxheW91dDoge1xuICAgICAqICAgICAgICAgICAgIC8vIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uIGxheW91dCBwcm9wZXJ0aWVzXG4gICAgICogICAgICAgICB9XG4gICAgICogICAgIH0pO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBmaXJlXG4gICAgICogLy8gd2hlbiBhIGZlYXR1cmUgb24gdGhlIGNvdW50cmllcyBsYXllciBvZiB0aGUgbWFwIGlzIGNsaWNrZWQuXG4gICAgICogbWFwLm9uKCdjbGljaycsICdjb3VudHJpZXMnLCAoZSkgPT4ge1xuICAgICAqICAgICBuZXcgbWFwYm94Z2wuUG9wdXAoKVxuICAgICAqICAgICAgICAgLnNldExuZ0xhdChlLmxuZ0xhdClcbiAgICAgKiAgICAgICAgIC5zZXRIVE1MKGBDb3VudHJ5IG5hbWU6ICR7ZS5mZWF0dXJlc1swXS5wcm9wZXJ0aWVzLm5hbWV9YClcbiAgICAgKiAgICAgICAgIC5hZGRUbyhtYXApO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBmaXJlXG4gICAgICogLy8gd2hlbiBhIGZlYXR1cmUgb24gdGhlIGNvdW50cmllcyBvciBiYWNrZ3JvdW5kIGxheWVycyBvZiB0aGUgbWFwIGlzIGNsaWNrZWQuXG4gICAgICogbWFwLm9uKCdjbGljaycsIFsnY291bnRyaWVzJywgJ2JhY2tncm91bmQnXSwgKGUpID0+IHtcbiAgICAgKiAgICAgbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgICAgICAgIC5zZXRMbmdMYXQoZS5sbmdMYXQpXG4gICAgICogICAgICAgICAuc2V0SFRNTChgQ291bnRyeSBuYW1lOiAke2UuZmVhdHVyZXNbMF0ucHJvcGVydGllcy5uYW1lfWApXG4gICAgICogICAgICAgICAuYWRkVG8obWFwKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBZGQgM0QgdGVycmFpbiB0byBhIG1hcF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLXRlcnJhaW4vKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IENlbnRlciB0aGUgbWFwIG9uIGEgY2xpY2tlZCBzeW1ib2xdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NlbnRlci1vbi1zeW1ib2wvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIGRyYWdnYWJsZSBtYXJrZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgaG92ZXIgZWZmZWN0XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9ob3Zlci1zdHlsZXMvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgcG9wdXAgb24gY2xpY2tdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcbiAgICAgKi9cbiAgICBvbih0eXBlOiBNYXBFdmVudCwgbGF5ZXJJZHM6IGFueSwgbGlzdGVuZXI6IGFueSk6IHRoaXMge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uKHR5cGUsIGxheWVySWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShsYXllcklkcykpIHtcbiAgICAgICAgICAgIGxheWVySWRzID0gW2xheWVySWRzXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWxlZ2F0ZWRMaXN0ZW5lciA9IHRoaXMuX2NyZWF0ZURlbGVnYXRlZExpc3RlbmVyKHR5cGUsIGxheWVySWRzLCBsaXN0ZW5lcik7XG5cbiAgICAgICAgdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzID0gdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzIHx8IHt9O1xuICAgICAgICB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9kZWxlZ2F0ZWRMaXN0ZW5lcnNbdHlwZV0gfHwgW107XG4gICAgICAgIHRoaXMuX2RlbGVnYXRlZExpc3RlbmVyc1t0eXBlXS5wdXNoKGRlbGVnYXRlZExpc3RlbmVyKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlcykge1xuICAgICAgICAgICAgdGhpcy5vbigoZXZlbnQ6IGFueSksIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlc1tldmVudF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIHRvIGEgc3BlY2lmaWVkIGV2ZW50IHR5cGUsXG4gICAgICogb3B0aW9uYWxseSBsaW1pdGVkIHRvIGV2ZW50cyBvY2N1cnJpbmcgb24gZmVhdHVyZXMgaW4gYSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSB0byBsaXN0ZW4gZm9yOyBvbmUgb2YgYCdtb3VzZWRvd24nYCwgYCdtb3VzZXVwJ2AsIGAncHJlY2xpY2snYCwgYCdjbGljaydgLCBgJ2RibGNsaWNrJ2AsXG4gICAgICogYCdtb3VzZW1vdmUnYCwgYCdtb3VzZWVudGVyJ2AsIGAnbW91c2VsZWF2ZSdgLCBgJ21vdXNlb3ZlcidgLCBgJ21vdXNlb3V0J2AsIGAnY29udGV4dG1lbnUnYCwgYCd0b3VjaHN0YXJ0J2AsXG4gICAgICogYCd0b3VjaGVuZCdgLCBvciBgJ3RvdWNoY2FuY2VsJ2AuIGBtb3VzZWVudGVyYCBhbmQgYG1vdXNlb3ZlcmAgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY3Vyc29yIGVudGVyc1xuICAgICAqIGEgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbGF5ZXIgZnJvbSBvdXRzaWRlIHRoYXQgbGF5ZXIgb3Igb3V0c2lkZSB0aGUgbWFwIGNhbnZhcy4gYG1vdXNlbGVhdmVgXG4gICAgICogYW5kIGBtb3VzZW91dGAgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY3Vyc29yIGxlYXZlcyBhIHZpc2libGUgcG9ydGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxheWVyLCBvciBsZWF2ZXNcbiAgICAgKiB0aGUgbWFwIGNhbnZhcy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZz59IGxheWVySWRzIChvcHRpb25hbCkgVGhlIElEKHMpIG9mIGEgc3R5bGUgbGF5ZXIocykuIElmIHlvdSBwcm92aWRlIGBsYXllcklkc2AsXG4gICAgICogdGhlIGxpc3RlbmVyIHdpbGwgYmUgdHJpZ2dlcmVkIG9ubHkgaWYgaXRzIGxvY2F0aW9uIGlzIHdpdGhpbiBhIHZpc2libGUgZmVhdHVyZSBpbiB0aGVzZSBsYXllcnMsXG4gICAgICogYW5kIHRoZSBldmVudCB3aWxsIGhhdmUgYSBgZmVhdHVyZXNgIHByb3BlcnR5IGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgdGhlIG1hdGNoaW5nIGZlYXR1cmVzLlxuICAgICAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSBgbGF5ZXJJZHNgLCB0aGUgbGlzdGVuZXIgd2lsbCBiZSB0cmlnZ2VyZWQgYnkgYSBjb3JyZXNwb25kaW5nIGV2ZW50XG4gICAgICogaGFwcGVuaW5nIGFueXdoZXJlIG9uIHRoZSBtYXAsIGFuZCB0aGUgZXZlbnQgd2lsbCBub3QgaGF2ZSBhIGBmZWF0dXJlc2AgcHJvcGVydHkuXG4gICAgICogTm90ZSB0aGF0IG1hbnkgZXZlbnQgdHlwZXMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGlvbmFsIGBsYXllcklkc2AgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIExvZyB0aGUgY29vcmRpbmF0ZXMgb2YgYSB1c2VyJ3MgZmlyc3QgbWFwIHRvdWNoLlxuICAgICAqIG1hcC5vbmNlKCd0b3VjaHN0YXJ0JywgKGUpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYFRoZSBmaXJzdCBtYXAgdG91Y2ggd2FzIGF0OiAke2UubG5nbGF0fWApO1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gTG9nIHRoZSBjb29yZGluYXRlcyBvZiBhIHVzZXIncyBmaXJzdCBtYXAgdG91Y2hcbiAgICAgKiAvLyBvbiBhIHNwZWNpZmljIGxheWVyLlxuICAgICAqIG1hcC5vbmNlKCd0b3VjaHN0YXJ0JywgJ215LXBvaW50LWxheWVyJywgKGUpID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYFRoZSBmaXJzdCBtYXAgdG91Y2ggb24gdGhlIHBvaW50IGxheWVyIHdhcyBhdDogJHtlLmxuZ2xhdH1gKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIExvZyB0aGUgY29vcmRpbmF0ZXMgb2YgYSB1c2VyJ3MgZmlyc3QgbWFwIHRvdWNoXG4gICAgICogLy8gb24gc3BlY2lmaWMgbGF5ZXJzLlxuICAgICAqIG1hcC5vbmNlKCd0b3VjaHN0YXJ0JywgWydteS1wb2ludC1sYXllcicsICdteS1wb2ludC1sYXllci0yJ10sIChlKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBUaGUgZmlyc3QgbWFwIHRvdWNoIG9uIHRoZSBwb2ludCBsYXllciB3YXMgYXQ6ICR7ZS5sbmdsYXR9YCk7XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgZHJhZ2dhYmxlIHBvaW50XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEFuaW1hdGUgdGhlIGNhbWVyYSBhcm91bmQgYSBwb2ludCB3aXRoIDNEIHRlcnJhaW5dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZyZWUtY2FtZXJhLXBvaW50LylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBQbGF5IG1hcCBsb2NhdGlvbnMgYXMgYSBzbGlkZXNob3ddKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BsYXliYWNrLWxvY2F0aW9ucy8pXG4gICAgICovXG4gICAgb25jZSh0eXBlOiBNYXBFdmVudCwgbGF5ZXJJZHM6IGFueSwgbGlzdGVuZXI6IGFueSk6IHRoaXMgfCBQcm9taXNlPEV2ZW50PiB7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5vbmNlKHR5cGUsIGxheWVySWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShsYXllcklkcykpIHtcbiAgICAgICAgICAgIGxheWVySWRzID0gW2xheWVySWRzXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWxlZ2F0ZWRMaXN0ZW5lciA9IHRoaXMuX2NyZWF0ZURlbGVnYXRlZExpc3RlbmVyKHR5cGUsIGxheWVySWRzLCBsaXN0ZW5lcik7XG5cbiAgICAgICAgZm9yIChjb25zdCBldmVudCBpbiBkZWxlZ2F0ZWRMaXN0ZW5lci5kZWxlZ2F0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMub25jZSgoZXZlbnQ6IGFueSksIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlc1tldmVudF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBwcmV2aW91c2x5IGFkZGVkIHdpdGgge0BsaW5rIE1hcCNvbn0sXG4gICAgICogb3B0aW9uYWxseSBsaW1pdGVkIHRvIGxheWVyLXNwZWNpZmljIGV2ZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHByZXZpb3VzbHkgdXNlZCB0byBpbnN0YWxsIHRoZSBsaXN0ZW5lci5cbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IEFycmF5PHN0cmluZz59IGxheWVySWRzIChvcHRpb25hbCkgVGhlIGxheWVyIElEKHMpIHByZXZpb3VzbHkgdXNlZCB0byBpbnN0YWxsIHRoZSBsaXN0ZW5lci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gcHJldmlvdXNseSBpbnN0YWxsZWQgYXMgYSBsaXN0ZW5lci5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gQ3JlYXRlIGEgZnVuY3Rpb24gdG8gcHJpbnQgY29vcmRpbmF0ZXMgd2hpbGUgYSBtb3VzZSBpcyBtb3ZpbmcuXG4gICAgICogZnVuY3Rpb24gb25Nb3ZlKGUpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYFRoZSBtb3VzZSBpcyBtb3Zpbmc6ICR7ZS5sbmdMYXR9YCk7XG4gICAgICogfVxuICAgICAqIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIHVuYmluZCB0aGUgYG1vdXNlbW92ZWAgZXZlbnQuXG4gICAgICogZnVuY3Rpb24gb25VcChlKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBUaGUgZmluYWwgY29vcmRpbmF0ZXMgYXJlOiAke2UubG5nTGF0fWApO1xuICAgICAqICAgICBtYXAub2ZmKCdtb3VzZW1vdmUnLCBvbk1vdmUpO1xuICAgICAqIH1cbiAgICAgKiAvLyBXaGVuIGEgY2xpY2sgb2NjdXJzLCBiaW5kIGJvdGggZnVuY3Rpb25zIHRvIG1vdXNlIGV2ZW50cy5cbiAgICAgKiBtYXAub24oJ21vdXNlZG93bicsIChlKSA9PiB7XG4gICAgICogICAgIG1hcC5vbignbW91c2Vtb3ZlJywgb25Nb3ZlKTtcbiAgICAgKiAgICAgbWFwLm9uY2UoJ21vdXNldXAnLCBvblVwKTtcbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICovXG4gICAgb2ZmKHR5cGU6IE1hcEV2ZW50LCBsYXllcklkczogYW55LCBsaXN0ZW5lcjogYW55KTogdGhpcyB7XG4gICAgICAgIGlmIChsaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIub2ZmKHR5cGUsIGxheWVySWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxheWVySWRzID0gbmV3IFNldChBcnJheS5pc0FycmF5KGxheWVySWRzKSA/IGxheWVySWRzIDogW2xheWVySWRzXSk7XG4gICAgICAgIGNvbnN0IGFyZUxheWVyQXJyYXlzRXF1YWwgPSAoaGFzaDEsIGhhc2gyKSA9PiB7XG4gICAgICAgICAgICBpZiAoaGFzaDEuc2l6ZSAhPT0gaGFzaDIuc2l6ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYXQtbGVhc3QgMSBhcnIgaGFzIGR1cGxpY2F0ZSB2YWx1ZShzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjb21wYXJpbmcgdmFsdWVzXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGhhc2gxKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNoMi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZW1vdmVEZWxlZ2F0ZWRMaXN0ZW5lcnMgPSAobGlzdGVuZXJzOiBBcnJheTxhbnk+KSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGVnYXRlZExpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChkZWxlZ2F0ZWRMaXN0ZW5lci5saXN0ZW5lciA9PT0gbGlzdGVuZXIgJiYgYXJlTGF5ZXJBcnJheXNFcXVhbChkZWxlZ2F0ZWRMaXN0ZW5lci5sYXllcnMsIGxheWVySWRzKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IGluIGRlbGVnYXRlZExpc3RlbmVyLmRlbGVnYXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmYoKGV2ZW50OiBhbnkpLCBkZWxlZ2F0ZWRMaXN0ZW5lci5kZWxlZ2F0ZXNbZXZlbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGVsZWdhdGVkTGlzdGVuZXJzID0gdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzID8gdGhpcy5fZGVsZWdhdGVkTGlzdGVuZXJzW3R5cGVdIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZGVsZWdhdGVkTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICByZW1vdmVEZWxlZ2F0ZWRMaXN0ZW5lcnMoZGVsZWdhdGVkTGlzdGVuZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7UXVlcnlpbmcgZmVhdHVyZXN9ICovXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKVxuICAgICAqIFtGZWF0dXJlIG9iamVjdHNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3OTQ2I3NlY3Rpb24tMy4yKVxuICAgICAqIHJlcHJlc2VudGluZyB2aXNpYmxlIGZlYXR1cmVzIHRoYXQgc2F0aXNmeSB0aGUgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfEFycmF5PFBvaW50TGlrZT59IFtnZW9tZXRyeV0gLSBUaGUgZ2VvbWV0cnkgb2YgdGhlIHF1ZXJ5IHJlZ2lvbiBpbiBwaXhlbHM6XG4gICAgICogZWl0aGVyIGEgc2luZ2xlIHBvaW50IG9yIGJvdHRvbSBsZWZ0IGFuZCB0b3AgcmlnaHQgcG9pbnRzIGRlc2NyaWJpbmcgYSBib3VuZGluZyBib3gsIHdoZXJlIHRoZSBvcmlnaW4gaXMgYXQgdGhlIHRvcCBsZWZ0LlxuICAgICAqIE9taXR0aW5nIHRoaXMgcGFyYW1ldGVyIChieSBjYWxsaW5nIHtAbGluayBNYXAjcXVlcnlSZW5kZXJlZEZlYXR1cmVzfSB3aXRoIHplcm8gYXJndW1lbnRzLFxuICAgICAqIG9yIHdpdGggb25seSBhbiBgb3B0aW9uc2AgYXJndW1lbnQpIGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBhIGJvdW5kaW5nIGJveCBlbmNvbXBhc3NpbmcgdGhlIGVudGlyZVxuICAgICAqIG1hcCB2aWV3cG9ydC5cbiAgICAgKiBPbmx5IHZhbHVlcyB3aXRoaW4gdGhlIGV4aXN0aW5nIHZpZXdwb3J0IGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtvcHRpb25zLmxheWVyc10gQW4gYXJyYXkgb2YgW3N0eWxlIGxheWVyIElEc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI2xheWVyLWlkKSBmb3IgdGhlIHF1ZXJ5IHRvIGluc3BlY3QuXG4gICAgICogICBPbmx5IGZlYXR1cmVzIHdpdGhpbiB0aGVzZSBsYXllcnMgd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLCBhbGwgbGF5ZXJzIHdpbGwgYmUgY2hlY2tlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5maWx0ZXJdIEEgW2ZpbHRlcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvbGF5ZXJzLyNmaWx0ZXIpXG4gICAgICogICB0byBsaW1pdCBxdWVyeSByZXN1bHRzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudmFsaWRhdGU9dHJ1ZV0gV2hldGhlciB0byBjaGVjayBpZiB0aGUgW29wdGlvbnMuZmlsdGVyXSBjb25mb3JtcyB0byB0aGUgTWFwYm94IEdMIFN0eWxlIFNwZWNpZmljYXRpb24uIERpc2FibGluZyB2YWxpZGF0aW9uIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgaGF2ZSBwcmV2aW91c2x5IHZhbGlkYXRlZCB0aGUgdmFsdWVzIHlvdSB3aWxsIGJlIHBhc3NpbmcgdG8gdGhpcyBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSBBbiBhcnJheSBvZiBbR2VvSlNPTl0oaHR0cDovL2dlb2pzb24ub3JnLylcbiAgICAgKiBbZmVhdHVyZSBvYmplY3RzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzk0NiNzZWN0aW9uLTMuMikuXG4gICAgICpcbiAgICAgKiBUaGUgYHByb3BlcnRpZXNgIHZhbHVlIG9mIGVhY2ggcmV0dXJuZWQgZmVhdHVyZSBvYmplY3QgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgaXRzIHNvdXJjZSBmZWF0dXJlLiBGb3IgR2VvSlNPTiBzb3VyY2VzLCBvbmx5XG4gICAgICogc3RyaW5nIGFuZCBudW1lcmljIHByb3BlcnR5IHZhbHVlcyBhcmUgc3VwcG9ydGVkLiBgbnVsbGAsIGBBcnJheWAsIGFuZCBgT2JqZWN0YCB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgICpcbiAgICAgKiBFYWNoIGZlYXR1cmUgaW5jbHVkZXMgdG9wLWxldmVsIGBsYXllcmAsIGBzb3VyY2VgLCBhbmQgYHNvdXJjZUxheWVyYCBwcm9wZXJ0aWVzLiBUaGUgYGxheWVyYCBwcm9wZXJ0eSBpcyBhbiBvYmplY3RcbiAgICAgKiByZXByZXNlbnRpbmcgdGhlIHN0eWxlIGxheWVyIHRvICB3aGljaCB0aGUgZmVhdHVyZSBiZWxvbmdzLiBMYXlvdXQgYW5kIHBhaW50IHByb3BlcnRpZXMgaW4gdGhpcyBvYmplY3QgY29udGFpbiB2YWx1ZXNcbiAgICAgKiB3aGljaCBhcmUgZnVsbHkgZXZhbHVhdGVkIGZvciB0aGUgZ2l2ZW4gem9vbSBsZXZlbCBhbmQgZmVhdHVyZS5cbiAgICAgKlxuICAgICAqIE9ubHkgZmVhdHVyZXMgdGhhdCBhcmUgY3VycmVudGx5IHJlbmRlcmVkIGFyZSBpbmNsdWRlZC4gU29tZSBmZWF0dXJlcyB3aWxsICoqbm90KiogYmUgaW5jbHVkZWQsIGxpa2U6XG4gICAgICpcbiAgICAgKiAtIEZlYXR1cmVzIGZyb20gbGF5ZXJzIHdob3NlIGB2aXNpYmlsaXR5YCBwcm9wZXJ0eSBpcyBgXCJub25lXCJgLlxuICAgICAqIC0gRmVhdHVyZXMgZnJvbSBsYXllcnMgd2hvc2Ugem9vbSByYW5nZSBleGNsdWRlcyB0aGUgY3VycmVudCB6b29tIGxldmVsLlxuICAgICAqIC0gU3ltYm9sIGZlYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGhpZGRlbiBkdWUgdG8gdGV4dCBvciBpY29uIGNvbGxpc2lvbi5cbiAgICAgKlxuICAgICAqIEZlYXR1cmVzIGZyb20gYWxsIG90aGVyIGxheWVycyBhcmUgaW5jbHVkZWQsIGluY2x1ZGluZyBmZWF0dXJlcyB0aGF0IG1heSBoYXZlIG5vIHZpc2libGVcbiAgICAgKiBjb250cmlidXRpb24gdG8gdGhlIHJlbmRlcmVkIHJlc3VsdDsgZm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhlIGxheWVyJ3Mgb3BhY2l0eSBvciBjb2xvciBhbHBoYSBjb21wb25lbnQgaXMgc2V0IHRvXG4gICAgICogMC5cbiAgICAgKlxuICAgICAqIFRoZSB0b3Btb3N0IHJlbmRlcmVkIGZlYXR1cmUgYXBwZWFycyBmaXJzdCBpbiB0aGUgcmV0dXJuZWQgYXJyYXksIGFuZCBzdWJzZXF1ZW50IGZlYXR1cmVzIGFyZSBzb3J0ZWQgYnlcbiAgICAgKiBkZXNjZW5kaW5nIHotb3JkZXIuIEZlYXR1cmVzIHRoYXQgYXJlIHJlbmRlcmVkIG11bHRpcGxlIHRpbWVzIChkdWUgdG8gd3JhcHBpbmcgYWNyb3NzIHRoZSBhbnRpbWVyaWRpYW4gYXQgbG93XG4gICAgICogem9vbSBsZXZlbHMpIGFyZSByZXR1cm5lZCBvbmx5IG9uY2UgKHRob3VnaCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY2F2ZWF0KS5cbiAgICAgKlxuICAgICAqIEJlY2F1c2UgZmVhdHVyZXMgY29tZSBmcm9tIHRpbGVkIHZlY3RvciBkYXRhIG9yIEdlb0pTT04gZGF0YSB0aGF0IGlzIGNvbnZlcnRlZCB0byB0aWxlcyBpbnRlcm5hbGx5LCBmZWF0dXJlXG4gICAgICogZ2VvbWV0cmllcyBtYXkgYmUgc3BsaXQgb3IgZHVwbGljYXRlZCBhY3Jvc3MgdGlsZSBib3VuZGFyaWVzIGFuZCwgYXMgYSByZXN1bHQsIGZlYXR1cmVzIG1heSBhcHBlYXIgbXVsdGlwbGVcbiAgICAgKiB0aW1lcyBpbiBxdWVyeSByZXN1bHRzLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGVyZSBpcyBhIGhpZ2h3YXkgcnVubmluZyB0aHJvdWdoIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgYSBxdWVyeS5cbiAgICAgKiBUaGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkgd2lsbCBiZSB0aG9zZSBwYXJ0cyBvZiB0aGUgaGlnaHdheSB0aGF0IGxpZSB3aXRoaW4gdGhlIG1hcCB0aWxlcyBjb3ZlcmluZyB0aGUgYm91bmRpbmdcbiAgICAgKiByZWN0YW5nbGUsIGV2ZW4gaWYgdGhlIGhpZ2h3YXkgZXh0ZW5kcyBpbnRvIG90aGVyIHRpbGVzLCBhbmQgdGhlIHBvcnRpb24gb2YgdGhlIGhpZ2h3YXkgd2l0aGluIGVhY2ggbWFwIHRpbGVcbiAgICAgKiB3aWxsIGJlIHJldHVybmVkIGFzIGEgc2VwYXJhdGUgZmVhdHVyZS4gU2ltaWxhcmx5LCBhIHBvaW50IGZlYXR1cmUgbmVhciBhIHRpbGUgYm91bmRhcnkgbWF5IGFwcGVhciBpbiBtdWx0aXBsZVxuICAgICAqIHRpbGVzIGR1ZSB0byB0aWxlIGJ1ZmZlcmluZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gRmluZCBhbGwgZmVhdHVyZXMgYXQgYSBwb2ludFxuICAgICAqIGNvbnN0IGZlYXR1cmVzID0gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhcbiAgICAgKiAgIFsyMCwgMzVdLFxuICAgICAqICAge2xheWVyczogWydteS1sYXllci1uYW1lJ119XG4gICAgICogKTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gRmluZCBhbGwgZmVhdHVyZXMgd2l0aGluIGEgc3RhdGljIGJvdW5kaW5nIGJveFxuICAgICAqIGNvbnN0IGZlYXR1cmVzID0gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhcbiAgICAgKiAgIFtbMTAsIDIwXSwgWzMwLCA1MF1dLFxuICAgICAqICAge2xheWVyczogWydteS1sYXllci1uYW1lJ119XG4gICAgICogKTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gRmluZCBhbGwgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94IGFyb3VuZCBhIHBvaW50XG4gICAgICogY29uc3Qgd2lkdGggPSAxMDtcbiAgICAgKiBjb25zdCBoZWlnaHQgPSAyMDtcbiAgICAgKiBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoW1xuICAgICAqICAgICBbcG9pbnQueCAtIHdpZHRoIC8gMiwgcG9pbnQueSAtIGhlaWdodCAvIDJdLFxuICAgICAqICAgICBbcG9pbnQueCArIHdpZHRoIC8gMiwgcG9pbnQueSArIGhlaWdodCAvIDJdXG4gICAgICogXSwge2xheWVyczogWydteS1sYXllci1uYW1lJ119KTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gUXVlcnkgYWxsIHJlbmRlcmVkIGZlYXR1cmVzIGZyb20gYSBzaW5nbGUgbGF5ZXJcbiAgICAgKiBjb25zdCBmZWF0dXJlcyA9IG1hcC5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoe2xheWVyczogWydteS1sYXllci1uYW1lJ119KTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBHZXQgZmVhdHVyZXMgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEZpbHRlciBmZWF0dXJlcyB3aXRoaW4gbWFwIHZpZXddKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLWZlYXR1cmVzLXdpdGhpbi1tYXAtdmlldy8pXG4gICAgICovXG4gICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKGdlb21ldHJ5PzogUG9pbnRMaWtlIHwgW1BvaW50TGlrZSwgUG9pbnRMaWtlXSwgb3B0aW9ucz86IE9iamVjdCk6IEFycmF5PFF1ZXJ5UmVzdWx0PiB7XG4gICAgICAgIC8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgY2FuIGJlIG9taXR0ZWQgZW50aXJlbHksIG1ha2luZyB0aGlzIGVmZmVjdGl2ZWx5IGFuIG92ZXJsb2FkZWQgbWV0aG9kXG4gICAgICAgIC8vIHdpdGggdHdvIHNpZ25hdHVyZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMoZ2VvbWV0cnk6IFBvaW50TGlrZSB8IFtQb2ludExpa2UsIFBvaW50TGlrZV0sIG9wdGlvbnM/OiBPYmplY3QpXG4gICAgICAgIC8vICAgICBxdWVyeVJlbmRlcmVkRmVhdHVyZXMob3B0aW9ucz86IE9iamVjdClcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlcmUgbm8gd2F5IHRvIGV4cHJlc3MgdGhhdCBpbiBhIHdheSB0aGF0J3MgY29tcGF0aWJsZSB3aXRoIGJvdGggZmxvdyBhbmQgZG9jdW1lbnRhdGlvbi5qcy5cbiAgICAgICAgLy8gUmVsYXRlZDogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE1NTZcblxuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCAmJiAhKGdlb21ldHJ5IGluc3RhbmNlb2YgUG9pbnQpICYmICFBcnJheS5pc0FycmF5KGdlb21ldHJ5KSkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IChnZW9tZXRyeTogT2JqZWN0KTtcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGdlb21ldHJ5ID0gZ2VvbWV0cnkgfHwgW1swLCAwXSwgW3RoaXMudHJhbnNmb3JtLndpZHRoLCB0aGlzLnRyYW5zZm9ybS5oZWlnaHRdXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoZ2VvbWV0cnksIG9wdGlvbnMsIHRoaXMudHJhbnNmb3JtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKVxuICAgICAqIFtGZWF0dXJlIG9iamVjdHNdKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3OTQ2I3NlY3Rpb24tMy4yKVxuICAgICAqIHJlcHJlc2VudGluZyBmZWF0dXJlcyB3aXRoaW4gdGhlIHNwZWNpZmllZCB2ZWN0b3IgdGlsZSBvciBHZW9KU09OIHNvdXJjZSB0aGF0IHNhdGlzZnkgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlSWQgVGhlIElEIG9mIHRoZSB2ZWN0b3IgdGlsZSBvciBHZW9KU09OIHNvdXJjZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1ldGVycy5zb3VyY2VMYXllcl0gVGhlIG5hbWUgb2YgdGhlIFtzb3VyY2UgbGF5ZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3Nhcnkvc291cmNlLWxheWVyLylcbiAgICAgKiAgIHRvIHF1ZXJ5LiAqRm9yIHZlY3RvciB0aWxlIHNvdXJjZXMsIHRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLiogRm9yIEdlb0pTT04gc291cmNlcywgaXQgaXMgaWdub3JlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFyYW1ldGVycy5maWx0ZXJdIEEgW2ZpbHRlcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvbGF5ZXJzLyNmaWx0ZXIpXG4gICAgICogICB0byBsaW1pdCBxdWVyeSByZXN1bHRzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFtZXRlcnMudmFsaWRhdGU9dHJ1ZV0gV2hldGhlciB0byBjaGVjayBpZiB0aGUgW3BhcmFtZXRlcnMuZmlsdGVyXSBjb25mb3JtcyB0byB0aGUgTWFwYm94IEdMIFN0eWxlIFNwZWNpZmljYXRpb24uIERpc2FibGluZyB2YWxpZGF0aW9uIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgaGF2ZSBwcmV2aW91c2x5IHZhbGlkYXRlZCB0aGUgdmFsdWVzIHlvdSB3aWxsIGJlIHBhc3NpbmcgdG8gdGhpcyBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSBBbiBhcnJheSBvZiBbR2VvSlNPTl0oaHR0cDovL2dlb2pzb24ub3JnLylcbiAgICAgKiBbRmVhdHVyZSBvYmplY3RzXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzk0NiNzZWN0aW9uLTMuMikuXG4gICAgICpcbiAgICAgKiBJbiBjb250cmFzdCB0byB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbGwgZmVhdHVyZXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMsXG4gICAgICogd2hldGhlciBvciBub3QgdGhleSBhcmUgcmVuZGVyZWQgYnkgdGhlIGN1cnJlbnQgc3R5bGUgKGluIG90aGVyIHdvcmRzLCBhcmUgdmlzaWJsZSkuIFRoZSBkb21haW4gb2YgdGhlIHF1ZXJ5IGluY2x1ZGVzIGFsbCBjdXJyZW50bHktbG9hZGVkXG4gICAgICogdmVjdG9yIHRpbGVzIGFuZCBHZW9KU09OIHNvdXJjZSB0aWxlczogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aWxlcyBvdXRzaWRlIHRoZSBjdXJyZW50bHlcbiAgICAgKiB2aXNpYmxlIHZpZXdwb3J0LlxuICAgICAqXG4gICAgICogQmVjYXVzZSBmZWF0dXJlcyBjb21lIGZyb20gdGlsZWQgdmVjdG9yIGRhdGEgb3IgR2VvSlNPTiBkYXRhIHRoYXQgaXMgY29udmVydGVkIHRvIHRpbGVzIGludGVybmFsbHksIGZlYXR1cmVcbiAgICAgKiBnZW9tZXRyaWVzIG1heSBiZSBzcGxpdCBvciBkdXBsaWNhdGVkIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMgYW5kLCBhcyBhIHJlc3VsdCwgZmVhdHVyZXMgbWF5IGFwcGVhciBtdWx0aXBsZVxuICAgICAqIHRpbWVzIGluIHF1ZXJ5IHJlc3VsdHMuIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoZXJlIGlzIGEgaGlnaHdheSBydW5uaW5nIHRocm91Z2ggdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiBhIHF1ZXJ5LlxuICAgICAqIFRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSB3aWxsIGJlIHRob3NlIHBhcnRzIG9mIHRoZSBoaWdod2F5IHRoYXQgbGllIHdpdGhpbiB0aGUgbWFwIHRpbGVzIGNvdmVyaW5nIHRoZSBib3VuZGluZ1xuICAgICAqIHJlY3RhbmdsZSwgZXZlbiBpZiB0aGUgaGlnaHdheSBleHRlbmRzIGludG8gb3RoZXIgdGlsZXMsIGFuZCB0aGUgcG9ydGlvbiBvZiB0aGUgaGlnaHdheSB3aXRoaW4gZWFjaCBtYXAgdGlsZVxuICAgICAqIHdpbGwgYmUgcmV0dXJuZWQgYXMgYSBzZXBhcmF0ZSBmZWF0dXJlLiBTaW1pbGFybHksIGEgcG9pbnQgZmVhdHVyZSBuZWFyIGEgdGlsZSBib3VuZGFyeSBtYXkgYXBwZWFyIGluIG11bHRpcGxlXG4gICAgICogdGlsZXMgZHVlIHRvIHRpbGUgYnVmZmVyaW5nLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBGaW5kIGFsbCBmZWF0dXJlcyBpbiBvbmUgc291cmNlIGxheWVyIGluIGEgdmVjdG9yIHNvdXJjZVxuICAgICAqIGNvbnN0IGZlYXR1cmVzID0gbWFwLnF1ZXJ5U291cmNlRmVhdHVyZXMoJ3lvdXItc291cmNlLWlkJywge1xuICAgICAqICAgICBzb3VyY2VMYXllcjogJ3lvdXItc291cmNlLWxheWVyJ1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHNlZSBbRXhhbXBsZTogSGlnaGxpZ2h0IGZlYXR1cmVzIGNvbnRhaW5pbmcgc2ltaWxhciBkYXRhXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3F1ZXJ5LXNpbWlsYXItZmVhdHVyZXMvKVxuICAgICAqL1xuICAgIHF1ZXJ5U291cmNlRmVhdHVyZXMoc291cmNlSWQ6IHN0cmluZywgcGFyYW1ldGVyczogP3tzb3VyY2VMYXllcjogP3N0cmluZywgZmlsdGVyOiA/QXJyYXk8YW55PiwgdmFsaWRhdGU/OiBib29sZWFufSk6IEFycmF5PFF1ZXJ5RmVhdHVyZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5xdWVyeVNvdXJjZUZlYXR1cmVzKHNvdXJjZUlkLCBwYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIHRoZSBjdXJyZW50bHkgbG9hZGVkIGRhdGEgZm9yIGVsZXZhdGlvbiBhdCBhIGdlb2dyYXBoaWNhbCBsb2NhdGlvbi4gVGhlIGVsZXZhdGlvbiBpcyByZXR1cm5lZCBpbiBgbWV0ZXJzYCByZWxhdGl2ZSB0byBtZWFuIHNlYS1sZXZlbC5cbiAgICAgKiBSZXR1cm5zIGBudWxsYCBpZiBgdGVycmFpbmAgaXMgZGlzYWJsZWQgb3IgaWYgdGVycmFpbiBkYXRhIGZvciB0aGUgbG9jYXRpb24gaGFzbid0IGJlZW4gbG9hZGVkIHlldC5cbiAgICAgKlxuICAgICAqIEluIG9yZGVyIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSB0ZXJyYWluIGRhdGEgaXMgbG9hZGVkIGVuc3VyZSB0aGF0IHRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gaXMgdmlzaWJsZSBhbmQgd2FpdCBmb3IgdGhlIGBpZGxlYCBldmVudCB0byBvY2N1ci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbG5nbGF0IFRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gYXQgd2hpY2ggdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtFbGV2YXRpb25RdWVyeU9wdGlvbnN9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmV4YWdnZXJhdGVkPXRydWVdIFdoZW4gYHRydWVgIHJldHVybnMgdGhlIHRlcnJhaW4gZWxldmF0aW9uIHdpdGggdGhlIHZhbHVlIG9mIGBleGFnZ2VyYXRpb25gIGZyb20gdGhlIHN0eWxlIGFscmVhZHkgYXBwbGllZC5cbiAgICAgKiBXaGVuIGBmYWxzZWAsIHJldHVybnMgdGhlIHJhdyB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBkYXRhIHdpdGhvdXQgc3R5bGluZyBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXIgfCBudWxsfSBUaGUgZWxldmF0aW9uIGluIG1ldGVycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGNvb3JkaW5hdGUgPSBbLTEyMi40MjA2NzksIDM3Ljc3MjUzN107XG4gICAgICogY29uc3QgZWxldmF0aW9uID0gbWFwLnF1ZXJ5VGVycmFpbkVsZXZhdGlvbihjb29yZGluYXRlKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBRdWVyeSB0ZXJyYWluIGVsZXZhdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcXVlcnktdGVycmFpbi1lbGV2YXRpb24vKVxuICAgICAqL1xuICAgIHF1ZXJ5VGVycmFpbkVsZXZhdGlvbihsbmdsYXQ6IExuZ0xhdExpa2UsIG9wdGlvbnM6IEVsZXZhdGlvblF1ZXJ5T3B0aW9ucyk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBlbGV2YXRpb24gPSB0aGlzLnRyYW5zZm9ybS5lbGV2YXRpb247XG4gICAgICAgIGlmIChlbGV2YXRpb24pIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBleHRlbmQoe30sIHtleGFnZ2VyYXRlZDogdHJ1ZX0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGVsZXZhdGlvbi5nZXRBdFBvaW50KE1lcmNhdG9yQ29vcmRpbmF0ZS5mcm9tTG5nTGF0KGxuZ2xhdCksIG51bGwsIG9wdGlvbnMuZXhhZ2dlcmF0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7V29ya2luZyB3aXRoIHN0eWxlc30gKi9cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIG1hcCdzIE1hcGJveCBzdHlsZSBvYmplY3Qgd2l0aCBhIG5ldyB2YWx1ZS5cbiAgICAgKlxuICAgICAqIElmIGEgc3R5bGUgaXMgYWxyZWFkeSBzZXQgd2hlbiB0aGlzIGlzIHVzZWQgYW5kIHRoZSBgZGlmZmAgb3B0aW9uIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBtYXAgcmVuZGVyZXIgd2lsbCBhdHRlbXB0IHRvIGNvbXBhcmUgdGhlIGdpdmVuIHN0eWxlXG4gICAgICogYWdhaW5zdCB0aGUgbWFwJ3MgY3VycmVudCBzdGF0ZSBhbmQgcGVyZm9ybSBvbmx5IHRoZSBjaGFuZ2VzIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBtYXAgc3R5bGUgbWF0Y2ggdGhlIGRlc2lyZWQgc3RhdGUuIENoYW5nZXMgaW4gc3ByaXRlc1xuICAgICAqIChpbWFnZXMgdXNlZCBmb3IgaWNvbnMgYW5kIHBhdHRlcm5zKSBhbmQgZ2x5cGhzIChmb250cyBmb3IgbGFiZWwgdGV4dCkgKipjYW5ub3QqKiBiZSBkaWZmZWQuIElmIHRoZSBzcHJpdGVzIG9yIGZvbnRzIHVzZWQgaW4gdGhlIGN1cnJlbnRcbiAgICAgKiBzdHlsZSBhbmQgdGhlIGdpdmVuIHN0eWxlIGFyZSBkaWZmZXJlbnQgaW4gYW55IHdheSwgdGhlIG1hcCByZW5kZXJlciB3aWxsIGZvcmNlIGEgZnVsbCB1cGRhdGUsIHJlbW92aW5nIHRoZSBjdXJyZW50IHN0eWxlIGFuZCBidWlsZGluZ1xuICAgICAqIHRoZSBnaXZlbiBvbmUgZnJvbSBzY3JhdGNoLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBzdHJpbmd8IG51bGx9IHN0eWxlIEEgSlNPTiBvYmplY3QgY29uZm9ybWluZyB0byB0aGUgc2NoZW1hIGRlc2NyaWJlZCBpbiB0aGVcbiAgICAgKiAgIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyksIG9yIGEgVVJMIHRvIHN1Y2ggSlNPTi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlmZj10cnVlXSBJZiBmYWxzZSwgZm9yY2UgYSAnZnVsbCcgdXBkYXRlLCByZW1vdmluZyB0aGUgY3VycmVudCBzdHlsZVxuICAgICAqICAgYW5kIGJ1aWxkaW5nIHRoZSBnaXZlbiBvbmUgaW5zdGVhZCBvZiBhdHRlbXB0aW5nIGEgZGlmZi1iYXNlZCB1cGRhdGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseT0nc2Fucy1zZXJpZiddIERlZmluZXMgYSBDU1NcbiAgICAgKiAgIGZvbnQtZmFtaWx5IGZvciBsb2NhbGx5IG92ZXJyaWRpbmcgZ2VuZXJhdGlvbiBvZiBnbHlwaHMgaW4gdGhlICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzJywgJ0hpcmFnYW5hJywgJ0thdGFrYW5hJyBhbmQgJ0hhbmd1bCBTeWxsYWJsZXMnIHJhbmdlcy5cbiAgICAgKiAgIEluIHRoZXNlIHJhbmdlcywgZm9udCBzZXR0aW5ncyBmcm9tIHRoZSBtYXAncyBzdHlsZSB3aWxsIGJlIGlnbm9yZWQsIGV4Y2VwdCBmb3IgZm9udC13ZWlnaHQga2V5d29yZHMgKGxpZ2h0L3JlZ3VsYXIvbWVkaXVtL2JvbGQpLlxuICAgICAqICAgU2V0IHRvIGBmYWxzZWAsIHRvIGVuYWJsZSBmb250IHNldHRpbmdzIGZyb20gdGhlIG1hcCdzIHN0eWxlIGZvciB0aGVzZSBnbHlwaCByYW5nZXMuXG4gICAgICogICBGb3JjZXMgYSBmdWxsIHVwZGF0ZS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0U3R5bGUoXCJtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3N0cmVldHMtdjExXCIpO1xuICAgICAqXG4gICAgICogQHNlZSBbRXhhbXBsZTogQ2hhbmdlIGEgbWFwJ3Mgc3R5bGVdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2V0c3R5bGUvKVxuICAgICAqL1xuICAgIHNldFN0eWxlKHN0eWxlOiBTdHlsZVNwZWNpZmljYXRpb24gfCBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzoge2RpZmY/OiBib29sZWFufSAmIFN0eWxlT3B0aW9ucyk6IHRoaXMge1xuICAgICAgICBvcHRpb25zID0gZXh0ZW5kKHt9LCB7bG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5OiB0aGlzLl9sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHksIGxvY2FsRm9udEZhbWlseTogdGhpcy5fbG9jYWxGb250RmFtaWx5fSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKChvcHRpb25zLmRpZmYgIT09IGZhbHNlICYmXG4gICAgICAgICAgICBvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseSA9PT0gdGhpcy5fbG9jYWxJZGVvZ3JhcGhGb250RmFtaWx5ICYmXG4gICAgICAgICAgICBvcHRpb25zLmxvY2FsRm9udEZhbWlseSA9PT0gdGhpcy5fbG9jYWxGb250RmFtaWx5KSAmJiB0aGlzLnN0eWxlICYmIHN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9kaWZmU3R5bGUoc3R5bGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbElkZW9ncmFwaEZvbnRGYW1pbHkgPSBvcHRpb25zLmxvY2FsSWRlb2dyYXBoRm9udEZhbWlseTtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsRm9udEZhbWlseSA9IG9wdGlvbnMubG9jYWxGb250RmFtaWx5O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZVN0eWxlKHN0eWxlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9nZXRVSVN0cmluZyhrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHN0ciA9IHRoaXMuX2xvY2FsZVtrZXldO1xuICAgICAgICBpZiAoc3RyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBVSSBzdHJpbmcgJyR7a2V5fSdgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgX3VwZGF0ZVN0eWxlKHN0eWxlOiBTdHlsZVNwZWNpZmljYXRpb24gfCBzdHJpbmcgfCBudWxsLCAgb3B0aW9ucz86IHtkaWZmPzogYm9vbGVhbn0gJiBTdHlsZU9wdGlvbnMpOiB0aGlzIHtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudChudWxsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX3JlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZSA9ICh1bmRlZmluZWQ6IGFueSk7IC8vIHdlIGxhenktaW5pdCBpdCBzbyBpdCdzIG5ldmVyIHVuZGVmaW5lZCB3aGVuIGFjY2Vzc2VkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUgPSBuZXcgU3R5bGUodGhpcywgb3B0aW9ucyB8fCB7fSk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLnNldEV2ZW50ZWRQYXJlbnQodGhpcywge3N0eWxlOiB0aGlzLnN0eWxlfSk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5sb2FkVVJMKHN0eWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5sb2FkSlNPTihzdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlVGVycmFpbigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfbGF6eUluaXRFbXB0eVN0eWxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUgPSBuZXcgU3R5bGUodGhpcywge30pO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5zZXRFdmVudGVkUGFyZW50KHRoaXMsIHtzdHlsZTogdGhpcy5zdHlsZX0pO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5sb2FkRW1wdHkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9kaWZmU3R5bGUoc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiB8IHN0cmluZywgIG9wdGlvbnM/OiB7ZGlmZj86IGJvb2xlYW59ICYgU3R5bGVPcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl9yZXF1ZXN0TWFuYWdlci5ub3JtYWxpemVTdHlsZVVSTChzdHlsZSk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5fcmVxdWVzdE1hbmFnZXIudHJhbnNmb3JtUmVxdWVzdCh1cmwsIFJlc291cmNlVHlwZS5TdHlsZSk7XG4gICAgICAgICAgICBnZXRKU09OKHJlcXVlc3QsIChlcnJvcjogP0Vycm9yLCBqc29uOiA/T2JqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChlcnJvcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVEaWZmKGpzb24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdHlsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURpZmYoc3R5bGUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZURpZmYoc3R5bGU6IFN0eWxlU3BlY2lmaWNhdGlvbiwgIG9wdGlvbnM/OiB7ZGlmZj86IGJvb2xlYW59ICYgU3R5bGVPcHRpb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHlsZS5zZXRTdGF0ZShzdHlsZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHdhcm5PbmNlKFxuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gcGVyZm9ybSBzdHlsZSBkaWZmOiAke2UubWVzc2FnZSB8fCBlLmVycm9yIHx8IGV9LiAgUmVidWlsZGluZyB0aGUgc3R5bGUgZnJvbSBzY3JhdGNoLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTdHlsZShzdHlsZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBNYXBib3ggW3N0eWxlXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L3N0eWxlLykgb2JqZWN0LCBhIEpTT04gb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBtYXAncyBzdHlsZSBKU09OIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLm9uKCdsb2FkJywgKCkgPT4ge1xuICAgICAqICAgICBjb25zdCBzdHlsZUpzb24gPSBtYXAuZ2V0U3R5bGUoKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqL1xuICAgIGdldFN0eWxlKCk6ID9TdHlsZVNwZWNpZmljYXRpb24ge1xuICAgICAgICBpZiAodGhpcy5zdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCdzIHN0eWxlIGlzIGZ1bGx5IGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzdHlsZSBpcyBmdWxseSBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHN0eWxlTG9hZFN0YXR1cyA9IG1hcC5pc1N0eWxlTG9hZGVkKCk7XG4gICAgICovXG4gICAgaXNTdHlsZUxvYWRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICB3YXJuT25jZSgnVGhlcmUgaXMgbm8gc3R5bGUgYWRkZWQgdG8gdGhlIG1hcC4nKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5sb2FkZWQoKTtcbiAgICB9XG5cbiAgICAvKiogQHNlY3Rpb24ge1NvdXJjZXN9ICovXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc291cmNlIHRvIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIHNvdXJjZSB0byBhZGQuIE11c3Qgbm90IGNvbmZsaWN0IHdpdGggZXhpc3Rpbmcgc291cmNlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LCBjb25mb3JtaW5nIHRvIHRoZVxuICAgICAqIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uJ3MgW3NvdXJjZSBkZWZpbml0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzKSBvclxuICAgICAqIHtAbGluayBDYW52YXNTb3VyY2VPcHRpb25zfS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmFkZFNvdXJjZSgnbXktZGF0YScsIHtcbiAgICAgKiAgICAgdHlwZTogJ3ZlY3RvcicsXG4gICAgICogICAgIHVybDogJ21hcGJveDovL215dXNlcm5hbWUudGlsZXNldGlkJ1xuICAgICAqIH0pO1xuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmFkZFNvdXJjZSgnbXktZGF0YScsIHtcbiAgICAgKiAgICAgXCJ0eXBlXCI6IFwiZ2VvanNvblwiLFxuICAgICAqICAgICBcImRhdGFcIjoge1xuICAgICAqICAgICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZVwiLFxuICAgICAqICAgICAgICAgXCJnZW9tZXRyeVwiOiB7XG4gICAgICogICAgICAgICAgICAgXCJ0eXBlXCI6IFwiUG9pbnRcIixcbiAgICAgKiAgICAgICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFstNzcuMDMyMywgMzguOTEzMV1cbiAgICAgKiAgICAgICAgIH0sXG4gICAgICogICAgICAgICBcInByb3BlcnRpZXNcIjoge1xuICAgICAqICAgICAgICAgICAgIFwidGl0bGVcIjogXCJNYXBib3ggRENcIixcbiAgICAgKiAgICAgICAgICAgICBcIm1hcmtlci1zeW1ib2xcIjogXCJtb251bWVudFwiXG4gICAgICogICAgICAgICB9XG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIEV4YW1wbGU6IFZlY3RvciBzb3VyY2U6IFtTaG93IGFuZCBoaWRlIGxheWVyc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdG9nZ2xlLWxheWVycy8pXG4gICAgICogQHNlZSBFeGFtcGxlOiBHZW9KU09OIHNvdXJjZTogW0FkZCBsaXZlIHJlYWx0aW1lIGRhdGFdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2xpdmUtZ2VvanNvbi8pXG4gICAgICogQHNlZSBFeGFtcGxlOiBSYXN0ZXIgREVNIHNvdXJjZTogW0FkZCBoaWxsc2hhZGluZ10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaGlsbHNoYWRlLylcbiAgICAgKi9cbiAgICBhZGRTb3VyY2UoaWQ6IHN0cmluZywgc291cmNlOiBTb3VyY2VTcGVjaWZpY2F0aW9uKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpO1xuICAgICAgICB0aGlzLnN0eWxlLmFkZFNvdXJjZShpZCwgc291cmNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNvdXJjZSBpcyBsb2FkZWQuIFJldHVybnMgYHRydWVgIGlmIHRoZSBzb3VyY2Ugd2l0aFxuICAgICAqIHRoZSBnaXZlbiBJRCBpbiB0aGUgbWFwJ3Mgc3R5bGUgaGFzIG5vIG91dHN0YW5kaW5nIG5ldHdvcmsgcmVxdWVzdHMsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIGJlIGNoZWNrZWQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNvdXJjZSBpcyBsb2FkZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb3VyY2VMb2FkZWQgPSBtYXAuaXNTb3VyY2VMb2FkZWQoJ2JhdGh5bWV0cnktZGF0YScpO1xuICAgICAqL1xuICAgIGlzU291cmNlTG9hZGVkKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5zdHlsZSAmJiB0aGlzLnN0eWxlLl9pc1NvdXJjZUNhY2hlTG9hZGVkKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYWxsIHRpbGVzIGluIHRoZSB2aWV3cG9ydCBmcm9tIGFsbCBzb3VyY2VzIG9uXG4gICAgICogdGhlIHN0eWxlIGFyZSBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbGwgdGlsZXMgYXJlIGxvYWRlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHRpbGVzTG9hZGVkID0gbWFwLmFyZVRpbGVzTG9hZGVkKCk7XG4gICAgICovXG5cbiAgICBhcmVUaWxlc0xvYWRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc291cmNlcyA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5fc291cmNlQ2FjaGVzO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXNbaWRdO1xuICAgICAgICAgICAgY29uc3QgdGlsZXMgPSBzb3VyY2UuX3RpbGVzO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IGluIHRpbGVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZSA9IHRpbGVzW3RdO1xuICAgICAgICAgICAgICAgIGlmICghKHRpbGUuc3RhdGUgPT09ICdsb2FkZWQnIHx8IHRpbGUuc3RhdGUgPT09ICdlcnJvcmVkJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgW2N1c3RvbSBzb3VyY2UgdHlwZV0oI0N1c3RvbSBTb3VyY2VzKSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgdXNlIHdpdGhcbiAgICAgKiB7QGxpbmsgTWFwI2FkZFNvdXJjZX0uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc291cmNlIHR5cGU7IHNvdXJjZSBkZWZpbml0aW9uIG9iamVjdHMgdXNlIHRoaXMgbmFtZSBpbiB0aGUgYHt0eXBlOiAuLi59YCBmaWVsZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBTb3VyY2VUeXBlIEEge0BsaW5rIFNvdXJjZX0gY29uc3RydWN0b3IuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIHdoZW4gdGhlIHNvdXJjZSB0eXBlIGlzIHJlYWR5IG9yIHdpdGggYW4gZXJyb3IgYXJndW1lbnQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgYWRkU291cmNlVHlwZShuYW1lOiBzdHJpbmcsIFNvdXJjZVR5cGU6IGFueSwgY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpO1xuICAgICAgICB0aGlzLnN0eWxlLmFkZFNvdXJjZVR5cGUobmFtZSwgU291cmNlVHlwZSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBzb3VyY2UgZnJvbSB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBzb3VyY2UgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAucmVtb3ZlU291cmNlKCdiYXRoeW1ldHJ5LWRhdGEnKTtcbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2UoaWQ6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZVNvdXJjZShpZCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVRlcnJhaW4oKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIElEIGluIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIG9mdGVuIHVzZWQgdG8gdXBkYXRlIGEgc291cmNlIHVzaW5nIHRoZSBpbnN0YW5jZSBtZW1iZXJzIGZvciB0aGUgcmVsZXZhbnRcbiAgICAgKiBzb3VyY2UgdHlwZSBhcyBkZWZpbmVkIGluIFtTb3VyY2VzXSgjc291cmNlcykuXG4gICAgICogRm9yIGV4YW1wbGUsIHNldHRpbmcgdGhlIGBkYXRhYCBmb3IgYSBHZW9KU09OIHNvdXJjZSBvciB1cGRhdGluZyB0aGUgYHVybGAgYW5kIGBjb29yZGluYXRlc2BcbiAgICAgKiBvZiBhbiBpbWFnZSBzb3VyY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBzb3VyY2UgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHs/T2JqZWN0fSBUaGUgc3R5bGUgc291cmNlIHdpdGggdGhlIHNwZWNpZmllZCBJRCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgSURcbiAgICAgKiBjb3JyZXNwb25kcyB0byBubyBleGlzdGluZyBzb3VyY2VzLlxuICAgICAqIFRoZSBzaGFwZSBvZiB0aGUgb2JqZWN0IHZhcmllcyBieSBzb3VyY2UgdHlwZS5cbiAgICAgKiBBIGxpc3Qgb2Ygb3B0aW9ucyBmb3IgZWFjaCBzb3VyY2UgdHlwZSBpcyBhdmFpbGFibGUgb24gdGhlIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uJ3NcbiAgICAgKiBbU291cmNlc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvc291cmNlcy8pIHBhZ2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBzb3VyY2VPYmplY3QgPSBtYXAuZ2V0U291cmNlKCdwb2ludHMnKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2RyYWctYS1wb2ludC8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQW5pbWF0ZSBhIHBvaW50XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hbmltYXRlLXBvaW50LWFsb25nLWxpbmUvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEFkZCBsaXZlIHJlYWx0aW1lIGRhdGFdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2xpdmUtZ2VvanNvbi8pXG4gICAgICovXG4gICAgZ2V0U291cmNlKGlkOiBzdHJpbmcpOiA/U291cmNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0U291cmNlKGlkKTtcbiAgICB9XG5cbiAgICAvKiogQHNlY3Rpb24ge0ltYWdlc30gKi9cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnNcbiAgICAvKipcbiAgICAgKiBBZGQgYW4gaW1hZ2UgdG8gdGhlIHN0eWxlLiBUaGlzIGltYWdlIGNhbiBiZSBkaXNwbGF5ZWQgb24gdGhlIG1hcCBsaWtlIGFueSBvdGhlciBpY29uIGluIHRoZSBzdHlsZSdzXG4gICAgICogW3Nwcml0ZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvc3ByaXRlLykgdXNpbmcgdGhlIGltYWdlJ3MgSUQgd2l0aFxuICAgICAqIFtgaWNvbi1pbWFnZWBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNsYXlvdXQtc3ltYm9sLWljb24taW1hZ2UpLFxuICAgICAqIFtgYmFja2dyb3VuZC1wYXR0ZXJuYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI3BhaW50LWJhY2tncm91bmQtYmFja2dyb3VuZC1wYXR0ZXJuKSxcbiAgICAgKiBbYGZpbGwtcGF0dGVybmBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNwYWludC1maWxsLWZpbGwtcGF0dGVybiksXG4gICAgICogb3IgW2BsaW5lLXBhdHRlcm5gXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jcGFpbnQtbGluZS1saW5lLXBhdHRlcm4pLlxuICAgICAqIEEge0BsaW5rIE1hcC5ldmVudDplcnJvcn0gZXZlbnQgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIGluIHRoZSBzcHJpdGUgdG8gYWRkIHRoaXMgaW1hZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBpbWFnZS5cbiAgICAgKiBAcGFyYW0ge0hUTUxJbWFnZUVsZW1lbnQgfCBJbWFnZUJpdG1hcCB8IEltYWdlRGF0YSB8IHt3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZGF0YTogKFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheSl9IHwgU3R5bGVJbWFnZUludGVyZmFjZX0gaW1hZ2UgVGhlIGltYWdlIGFzIGFuIGBIVE1MSW1hZ2VFbGVtZW50YCwgYEltYWdlRGF0YWAsIGBJbWFnZUJpdG1hcGAgb3Igb2JqZWN0IHdpdGggYHdpZHRoYCwgYGhlaWdodGAsIGFuZCBgZGF0YWBcbiAgICAgKiBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5waXhlbFJhdGlvIFRoZSByYXRpbyBvZiBwaXhlbHMgaW4gdGhlIGltYWdlIHRvIHBoeXNpY2FsIHBpeGVscyBvbiB0aGUgc2NyZWVuLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5zZGYgV2hldGhlciB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGFuIFNERiBpbWFnZS5cbiAgICAgKiBAcGFyYW0ge1tudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdfSBvcHRpb25zLmNvbnRlbnQgYFt4MSwgeTEsIHgyLCB5Ml1gICBJZiBgaWNvbi10ZXh0LWZpdGAgaXMgdXNlZCBpbiBhIGxheWVyIHdpdGggdGhpcyBpbWFnZSwgdGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgcGFydCBvZiB0aGUgaW1hZ2UgdGhhdCBjYW4gYmUgY292ZXJlZCBieSB0aGUgY29udGVudCBpbiBgdGV4dC1maWVsZGAuXG4gICAgICogQHBhcmFtIHtBcnJheTxbbnVtYmVyLCBudW1iZXJdPn0gb3B0aW9ucy5zdHJldGNoWCBgW1t4MSwgeDJdLCAuLi5dYCBJZiBgaWNvbi10ZXh0LWZpdGAgaXMgdXNlZCBpbiBhIGxheWVyIHdpdGggdGhpcyBpbWFnZSwgdGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgcGFydChzKSBvZiB0aGUgaW1hZ2UgdGhhdCBjYW4gYmUgc3RyZXRjaGVkIGhvcml6b250YWxseS5cbiAgICAgKiBAcGFyYW0ge0FycmF5PFtudW1iZXIsIG51bWJlcl0+fSBvcHRpb25zLnN0cmV0Y2hZIGBbW3kxLCB5Ml0sIC4uLl1gIElmIGBpY29uLXRleHQtZml0YCBpcyB1c2VkIGluIGEgbGF5ZXIgd2l0aCB0aGlzIGltYWdlLCB0aGlzIG9wdGlvbiBkZWZpbmVzIHRoZSBwYXJ0KHMpIG9mIHRoZSBpbWFnZSB0aGF0IGNhbiBiZSBzdHJldGNoZWQgdmVydGljYWxseS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSWYgdGhlIHN0eWxlJ3Mgc3ByaXRlIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBhbiBpbWFnZSB3aXRoIElEICdjYXQnLFxuICAgICAqIC8vIGFkZCB0aGUgaW1hZ2UgJ2NhdC1pY29uLnBuZycgdG8gdGhlIHN0eWxlJ3Mgc3ByaXRlIHdpdGggdGhlIElEICdjYXQnLlxuICAgICAqIG1hcC5sb2FkSW1hZ2UoJ2h0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvNi82MC9DYXRfc2lsaG91ZXR0ZS5zdmcvNDAwcHgtQ2F0X3NpbGhvdWV0dGUuc3ZnLnBuZycsIChlcnJvciwgaW1hZ2UpID0+IHtcbiAgICAgKiAgICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcbiAgICAgKiAgICAgaWYgKCFtYXAuaGFzSW1hZ2UoJ2NhdCcpKSBtYXAuYWRkSW1hZ2UoJ2NhdCcsIGltYWdlKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIEFkZCBhIHN0cmV0Y2hhYmxlIGltYWdlIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgaWNvbi10ZXh0LWZpdGBcbiAgICAgKiAvLyBJbiB0aGlzIGV4YW1wbGUsIHRoZSBpbWFnZSBpcyA2MDBweCB3aWRlIGJ5IDQwMHB4IGhpZ2guXG4gICAgICogbWFwLmxvYWRJbWFnZSgnaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy84Lzg5L0JsYWNrX2FuZF9XaGl0ZV9Cb3hlZF8lMjhib3JkZXJlZCUyOS5wbmcnLCAoZXJyb3IsIGltYWdlKSA9PiB7XG4gICAgICogICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG4gICAgICogICAgIGlmICghbWFwLmhhc0ltYWdlKCdib3JkZXItaW1hZ2UnKSkge1xuICAgICAqICAgICAgICAgbWFwLmFkZEltYWdlKCdib3JkZXItaW1hZ2UnLCBpbWFnZSwge1xuICAgICAqICAgICAgICAgICAgIGNvbnRlbnQ6IFsxNiwgMTYsIDMwMCwgMzg0XSwgLy8gcGxhY2UgdGV4dCBvdmVyIGxlZnQgaGFsZiBvZiBpbWFnZSwgYXZvaWRpbmcgdGhlIDE2cHggYm9yZGVyXG4gICAgICogICAgICAgICAgICAgc3RyZXRjaFg6IFtbMTYsIDU4NF1dLCAvLyBzdHJldGNoIGV2ZXJ5dGhpbmcgaG9yaXpvbnRhbGx5IGV4Y2VwdCB0aGUgMTZweCBib3JkZXJcbiAgICAgKiAgICAgICAgICAgICBzdHJldGNoWTogW1sxNiwgMzg0XV0sIC8vIHN0cmV0Y2ggZXZlcnl0aGluZyB2ZXJ0aWNhbGx5IGV4Y2VwdCB0aGUgMTZweCBib3JkZXJcbiAgICAgKiAgICAgICAgIH0pO1xuICAgICAqICAgICB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKlxuICAgICAqIEBzZWUgRXhhbXBsZTogVXNlIGBIVE1MSW1hZ2VFbGVtZW50YDogW0FkZCBhbiBpY29uIHRvIHRoZSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWltYWdlLylcbiAgICAgKiBAc2VlIEV4YW1wbGU6IFVzZSBgSW1hZ2VEYXRhYDogW0FkZCBhIGdlbmVyYXRlZCBpY29uIHRvIHRoZSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWltYWdlLWdlbmVyYXRlZC8pXG4gICAgICovXG4gICAgYWRkSW1hZ2UoaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICBpbWFnZTogSFRNTEltYWdlRWxlbWVudCB8IEltYWdlQml0bWFwIHwgSW1hZ2VEYXRhIHwge3dpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXl9IHwgU3R5bGVJbWFnZUludGVyZmFjZSxcbiAgICAgICAgICAgICB7cGl4ZWxSYXRpbyA9IDEsIHNkZiA9IGZhbHNlLCBzdHJldGNoWCwgc3RyZXRjaFksIGNvbnRlbnR9OiAkU2hhcGU8U3R5bGVJbWFnZU1ldGFkYXRhPiA9IHt9KSB7XG4gICAgICAgIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gMDtcblxuICAgICAgICBpZiAoaW1hZ2UgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEltYWdlRWxlbWVudCB8fCAod2luZG93LkltYWdlQml0bWFwICYmIGltYWdlIGluc3RhbmNlb2Ygd2luZG93LkltYWdlQml0bWFwKSkge1xuICAgICAgICAgICAgY29uc3Qge3dpZHRoLCBoZWlnaHQsIGRhdGF9ID0gYnJvd3Nlci5nZXRJbWFnZURhdGEoaW1hZ2UpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZS5hZGRJbWFnZShpZCwge2RhdGE6IG5ldyBSR0JBSW1hZ2Uoe3dpZHRoLCBoZWlnaHR9LCBkYXRhKSwgcGl4ZWxSYXRpbywgc3RyZXRjaFgsIHN0cmV0Y2hZLCBjb250ZW50LCBzZGYsIHZlcnNpb259KTtcbiAgICAgICAgfSBlbHNlIGlmIChpbWFnZS53aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGltYWdlLmhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyB0byBtYXAuYWRkSW1hZ2UoKS4gVGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGFuIGBIVE1MSW1hZ2VFbGVtZW50YCwgYEltYWdlRGF0YWAsIGBJbWFnZUJpdG1hcGAsICcgK1xuICAgICAgICAgICAgICAgICdvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgJykpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGltYWdlO1xuICAgICAgICAgICAgY29uc3QgdXNlckltYWdlID0gKChpbWFnZTogYW55KTogU3R5bGVJbWFnZUludGVyZmFjZSk7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdXNlckltYWdlLmRhdGE7XG5cbiAgICAgICAgICAgIHRoaXMuc3R5bGUuYWRkSW1hZ2UoaWQsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBuZXcgUkdCQUltYWdlKHt3aWR0aCwgaGVpZ2h0fSwgbmV3IFVpbnQ4QXJyYXkoZGF0YSkpLFxuICAgICAgICAgICAgICAgIHBpeGVsUmF0aW8sXG4gICAgICAgICAgICAgICAgc3RyZXRjaFgsXG4gICAgICAgICAgICAgICAgc3RyZXRjaFksXG4gICAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgICAgICBzZGYsXG4gICAgICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgICAgICB1c2VySW1hZ2VcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodXNlckltYWdlLm9uQWRkKSB7XG4gICAgICAgICAgICAgICAgdXNlckltYWdlLm9uQWRkKHRoaXMsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnNcbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gZXhpc3RpbmcgaW1hZ2UgaW4gYSBzdHlsZS4gVGhpcyBpbWFnZSBjYW4gYmUgZGlzcGxheWVkIG9uIHRoZSBtYXAgbGlrZSBhbnkgb3RoZXIgaWNvbiBpbiB0aGUgc3R5bGUnc1xuICAgICAqIFtzcHJpdGVdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3Nhcnkvc3ByaXRlLykgdXNpbmcgdGhlIGltYWdlJ3MgSUQgd2l0aFxuICAgICAqIFtgaWNvbi1pbWFnZWBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNsYXlvdXQtc3ltYm9sLWljb24taW1hZ2UpLFxuICAgICAqIFtgYmFja2dyb3VuZC1wYXR0ZXJuYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI3BhaW50LWJhY2tncm91bmQtYmFja2dyb3VuZC1wYXR0ZXJuKSxcbiAgICAgKiBbYGZpbGwtcGF0dGVybmBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNwYWludC1maWxsLWZpbGwtcGF0dGVybiksXG4gICAgICogb3IgW2BsaW5lLXBhdHRlcm5gXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jcGFpbnQtbGluZS1saW5lLXBhdHRlcm4pLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgaW1hZ2UuXG4gICAgICogQHBhcmFtIHtIVE1MSW1hZ2VFbGVtZW50IHwgSW1hZ2VCaXRtYXAgfCBJbWFnZURhdGEgfCBTdHlsZUltYWdlSW50ZXJmYWNlfSBpbWFnZSBUaGUgaW1hZ2UgYXMgYW4gYEhUTUxJbWFnZUVsZW1lbnRgLCBbYEltYWdlRGF0YWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9JbWFnZURhdGEpLCBbYEltYWdlQml0bWFwYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0ltYWdlQml0bWFwKSBvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYFxuICAgICAqIHByb3BlcnRpZXMgd2l0aCB0aGUgc2FtZSBmb3JtYXQgYXMgYEltYWdlRGF0YWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICogLy8gTG9hZCBhbiBpbWFnZSBmcm9tIGFuIGV4dGVybmFsIFVSTC5cbiAgICAgKiBtYXAubG9hZEltYWdlKCdodHRwOi8vcGxhY2VraXR0ZW4uY29tLzUwLzUwJywgKGVycm9yLCBpbWFnZSkgPT4ge1xuICAgICAqICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuICAgICAqICAgICAvLyBJZiBhbiBpbWFnZSB3aXRoIHRoZSBJRCAnY2F0JyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3R5bGUncyBzcHJpdGUsXG4gICAgICogICAgIC8vIHJlcGxhY2UgdGhhdCBpbWFnZSB3aXRoIGEgbmV3IGltYWdlLCAnb3RoZXItY2F0LWljb24ucG5nJy5cbiAgICAgKiAgICAgaWYgKG1hcC5oYXNJbWFnZSgnY2F0JykpIG1hcC51cGRhdGVJbWFnZSgnY2F0JywgaW1hZ2UpO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIHVwZGF0ZUltYWdlKGlkOiBzdHJpbmcsXG4gICAgICAgIGltYWdlOiBIVE1MSW1hZ2VFbGVtZW50IHwgSW1hZ2VCaXRtYXAgfCBJbWFnZURhdGEgfCB7d2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE6IFVpbnQ4QXJyYXkgfCBVaW50OENsYW1wZWRBcnJheX0gfCBTdHlsZUltYWdlSW50ZXJmYWNlKSB7XG5cbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbWFnZSA9IHRoaXMuc3R5bGUuZ2V0SW1hZ2UoaWQpO1xuICAgICAgICBpZiAoIWV4aXN0aW5nSW1hZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJ1RoZSBtYXAgaGFzIG5vIGltYWdlIHdpdGggdGhhdCBpZC4gSWYgeW91IGFyZSBhZGRpbmcgYSBuZXcgaW1hZ2UgdXNlIGBtYXAuYWRkSW1hZ2UoLi4uKWAgaW5zdGVhZC4nKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IChpbWFnZSBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSW1hZ2VFbGVtZW50IHx8ICh3aW5kb3cuSW1hZ2VCaXRtYXAgJiYgaW1hZ2UgaW5zdGFuY2VvZiB3aW5kb3cuSW1hZ2VCaXRtYXApKSA/IGJyb3dzZXIuZ2V0SW1hZ2VEYXRhKGltYWdlKSA6IGltYWdlO1xuICAgICAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBpbWFnZURhdGE7XG4gICAgICAgIC8vIEZsb3cgY2FuJ3QgcmVmaW5lIHRoZSB0eXBlIGVub3VnaCB0byBleGNsdWRlIEltYWdlQml0bWFwXG4gICAgICAgIGNvbnN0IGRhdGEgPSAoKGltYWdlRGF0YTogYW55KS5kYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXkpO1xuXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUobmV3IEVycm9yRXZlbnQobmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyB0byBtYXAudXBkYXRlSW1hZ2UoKS4gVGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGFuIGBIVE1MSW1hZ2VFbGVtZW50YCwgYEltYWdlRGF0YWAsIGBJbWFnZUJpdG1hcGAsICcgK1xuICAgICAgICAgICAgICAgICdvciBvYmplY3Qgd2l0aCBgd2lkdGhgLCBgaGVpZ2h0YCwgYW5kIGBkYXRhYCBwcm9wZXJ0aWVzIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIGBJbWFnZURhdGFgJykpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3aWR0aCAhPT0gZXhpc3RpbmdJbWFnZS5kYXRhLndpZHRoIHx8IGhlaWdodCAhPT0gZXhpc3RpbmdJbWFnZS5kYXRhLmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHVwZGF0ZWQgaW1hZ2UgKCR7d2lkdGh9LCAke2hlaWdodH0pXG4gICAgICAgICAgICAgICAgbXVzdCBiZSB0aGF0IHNhbWUgYXMgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGltYWdlXG4gICAgICAgICAgICAgICAgKCR7ZXhpc3RpbmdJbWFnZS5kYXRhLndpZHRofSwgJHtleGlzdGluZ0ltYWdlLmRhdGEuaGVpZ2h0fSlgKSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29weSA9ICEoaW1hZ2UgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTEltYWdlRWxlbWVudCB8fCAod2luZG93LkltYWdlQml0bWFwICYmIGltYWdlIGluc3RhbmNlb2Ygd2luZG93LkltYWdlQml0bWFwKSk7XG4gICAgICAgIGV4aXN0aW5nSW1hZ2UuZGF0YS5yZXBsYWNlKGRhdGEsIGNvcHkpO1xuXG4gICAgICAgIHRoaXMuc3R5bGUudXBkYXRlSW1hZ2UoaWQsIGV4aXN0aW5nSW1hZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIHdoZXRoZXIgb3Igbm90IGFuIGltYWdlIHdpdGggYSBzcGVjaWZpYyBJRCBleGlzdHMgaW4gdGhlIHN0eWxlLiBUaGlzIGNoZWNrcyBib3RoIGltYWdlc1xuICAgICAqIGluIHRoZSBzdHlsZSdzIG9yaWdpbmFsIFtzcHJpdGVdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3Nhcnkvc3ByaXRlLykgYW5kIGFueSBpbWFnZXNcbiAgICAgKiB0aGF0IGhhdmUgYmVlbiBhZGRlZCBhdCBydW50aW1lIHVzaW5nIHtAbGluayBNYXAjYWRkSW1hZ2V9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgaW1hZ2UuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgaW1hZ2UgZXhpc3RzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gQ2hlY2sgaWYgYW4gaW1hZ2Ugd2l0aCB0aGUgSUQgJ2NhdCcgZXhpc3RzIGluXG4gICAgICogLy8gdGhlIHN0eWxlJ3Mgc3ByaXRlLlxuICAgICAqIGNvbnN0IGNhdEljb25FeGlzdHMgPSBtYXAuaGFzSW1hZ2UoJ2NhdCcpO1xuICAgICAqL1xuICAgIGhhc0ltYWdlKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBpbWFnZSBpZCcpKSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISF0aGlzLnN0eWxlLmdldEltYWdlKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYW4gaW1hZ2UgZnJvbSBhIHN0eWxlLiBUaGlzIGNhbiBiZSBhbiBpbWFnZSBmcm9tIHRoZSBzdHlsZSdzIG9yaWdpbmFsXG4gICAgICogW3Nwcml0ZV0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC9nbG9zc2FyeS9zcHJpdGUvKSBvciBhbnkgaW1hZ2VzXG4gICAgICogdGhhdCBoYXZlIGJlZW4gYWRkZWQgYXQgcnVudGltZSB1c2luZyB7QGxpbmsgTWFwI2FkZEltYWdlfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIGltYWdlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJZiBhbiBpbWFnZSB3aXRoIHRoZSBJRCAnY2F0JyBleGlzdHMgaW5cbiAgICAgKiAvLyB0aGUgc3R5bGUncyBzcHJpdGUsIHJlbW92ZSBpdC5cbiAgICAgKiBpZiAobWFwLmhhc0ltYWdlKCdjYXQnKSkgbWFwLnJlbW92ZUltYWdlKCdjYXQnKTtcbiAgICAgKi9cbiAgICByZW1vdmVJbWFnZShpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlSW1hZ2UoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYW4gaW1hZ2UgZnJvbSBhbiBleHRlcm5hbCBVUkwgdG8gYmUgdXNlZCB3aXRoIHtAbGluayBNYXAjYWRkSW1hZ2V9LiBFeHRlcm5hbFxuICAgICAqIGRvbWFpbnMgbXVzdCBzdXBwb3J0IFtDT1JTXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0FjY2Vzc19jb250cm9sX0NPUlMpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIG9mIHRoZSBpbWFnZSBmaWxlLiBJbWFnZSBmaWxlIG11c3QgYmUgaW4gcG5nLCB3ZWJwLCBvciBqcGcgZm9ybWF0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIEV4cGVjdGluZyBgY2FsbGJhY2soZXJyb3IsIGRhdGEpYC4gQ2FsbGVkIHdoZW4gdGhlIGltYWdlIGhhcyBsb2FkZWQgb3Igd2l0aCBhbiBlcnJvciBhcmd1bWVudCBpZiB0aGVyZSBpcyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gTG9hZCBhbiBpbWFnZSBmcm9tIGFuIGV4dGVybmFsIFVSTC5cbiAgICAgKiBtYXAubG9hZEltYWdlKCdodHRwOi8vcGxhY2VraXR0ZW4uY29tLzUwLzUwJywgKGVycm9yLCBpbWFnZSkgPT4ge1xuICAgICAqICAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuICAgICAqICAgICAvLyBBZGQgdGhlIGxvYWRlZCBpbWFnZSB0byB0aGUgc3R5bGUncyBzcHJpdGUgd2l0aCB0aGUgSUQgJ2tpdHRlbicuXG4gICAgICogICAgIG1hcC5hZGRJbWFnZSgna2l0dGVuJywgaW1hZ2UpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHNlZSBbRXhhbXBsZTogQWRkIGFuIGljb24gdG8gdGhlIG1hcF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGQtaW1hZ2UvKVxuICAgICAqL1xuICAgIGxvYWRJbWFnZSh1cmw6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIGdldEltYWdlKHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnRyYW5zZm9ybVJlcXVlc3QodXJsLCBSZXNvdXJjZVR5cGUuSW1hZ2UpLCAoZXJyLCBpbWcpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgaW1nIGluc3RhbmNlb2Ygd2luZG93LkhUTUxJbWFnZUVsZW1lbnQgPyBicm93c2VyLmdldEltYWdlRGF0YShpbWcpIDogaW1nKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIGFuIEFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgSURzIG9mIGFsbCBpbWFnZXMgY3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgbWFwLlxuICAgICogVGhpcyBpbmNsdWRlcyBib3RoIGltYWdlcyBmcm9tIHRoZSBzdHlsZSdzIG9yaWdpbmFsIFtzcHJpdGVdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3Nhcnkvc3ByaXRlLylcbiAgICAqIGFuZCBhbnkgaW1hZ2VzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGF0IHJ1bnRpbWUgdXNpbmcge0BsaW5rIE1hcCNhZGRJbWFnZX0uXG4gICAgKlxuICAgICogQHJldHVybnMge0FycmF5PHN0cmluZz59IEFuIEFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgYWxsIHNwcml0ZXMvaW1hZ2VzIGN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIG1hcC5cbiAgICAqXG4gICAgKiBAZXhhbXBsZVxuICAgICogY29uc3QgYWxsSW1hZ2VzID0gbWFwLmxpc3RJbWFnZXMoKTtcbiAgICAqXG4gICAgKi9cbiAgICBsaXN0SW1hZ2VzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5saXN0SW1hZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBzZWN0aW9uIHtMYXllcnN9ICovXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgW01hcGJveCBzdHlsZSBsYXllcl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvI2xheWVycylcbiAgICAgKiB0byB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBBIGxheWVyIGRlZmluZXMgaG93IGRhdGEgZnJvbSBhIHNwZWNpZmllZCBzb3VyY2Ugd2lsbCBiZSBzdHlsZWQuIFJlYWQgbW9yZSBhYm91dCBsYXllciB0eXBlc1xuICAgICAqIGFuZCBhdmFpbGFibGUgcGFpbnQgYW5kIGxheW91dCBwcm9wZXJ0aWVzIGluIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNsYXllcnMpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3QgfCBDdXN0b21MYXllckludGVyZmFjZX0gbGF5ZXIgVGhlIGxheWVyIHRvIGFkZCwgY29uZm9ybWluZyB0byBlaXRoZXIgdGhlIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uJ3MgW2xheWVyIGRlZmluaXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNsYXllcnMpIG9yLCBsZXNzIGNvbW1vbmx5LCB0aGUge0BsaW5rIEN1c3RvbUxheWVySW50ZXJmYWNlfSBzcGVjaWZpY2F0aW9uLlxuICAgICAqIFRoZSBNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbidzIGxheWVyIGRlZmluaXRpb24gaXMgYXBwcm9wcmlhdGUgZm9yIG1vc3QgbGF5ZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyLmlkIEEgdW5pcXVlIGlkZW50aWZpZXIgdGhhdCB5b3UgZGVmaW5lLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllci50eXBlIFRoZSB0eXBlIG9mIGxheWVyIChmb3IgZXhhbXBsZSBgZmlsbGAgb3IgYHN5bWJvbGApLlxuICAgICAqIEEgbGlzdCBvZiBsYXllciB0eXBlcyBpcyBhdmFpbGFibGUgaW4gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvbGF5ZXJzLyN0eXBlKS5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGFsc28gYmUgYGN1c3RvbWAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUge0BsaW5rIEN1c3RvbUxheWVySW50ZXJmYWNlfS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZyB8IE9iamVjdH0gW2xheWVyLnNvdXJjZV0gVGhlIGRhdGEgc291cmNlIGZvciB0aGUgbGF5ZXIuXG4gICAgICogUmVmZXJlbmNlIGEgc291cmNlIHRoYXQgaGFzIF9hbHJlYWR5IGJlZW4gZGVmaW5lZF8gdXNpbmcgdGhlIHNvdXJjZSdzIHVuaXF1ZSBpZC5cbiAgICAgKiBSZWZlcmVuY2UgYSBfbmV3IHNvdXJjZV8gdXNpbmcgYSBzb3VyY2Ugb2JqZWN0IChhcyBkZWZpbmVkIGluIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3NvdXJjZXMvKSkgZGlyZWN0bHkuXG4gICAgICogVGhpcyBpcyAqKnJlcXVpcmVkKiogZm9yIGFsbCBgbGF5ZXIudHlwZWAgb3B0aW9ucyBfZXhjZXB0XyBmb3IgYGN1c3RvbWAgYW5kIGBiYWNrZ3JvdW5kYC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2xheWVyLnNvdXJjZUxheWVyXSAob3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBbc291cmNlIGxheWVyXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL2dsb3NzYXJ5L3NvdXJjZS1sYXllci8pIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBsYXllci5zb3VyY2VgIHRvIHVzZSBmb3IgdGhpcyBzdHlsZSBsYXllci5cbiAgICAgKiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgdmVjdG9yIHRpbGUgc291cmNlcyBhbmQgaXMgKipyZXF1aXJlZCoqIHdoZW4gYGxheWVyLnNvdXJjZWAgaXMgb2YgdGhlIHR5cGUgYHZlY3RvcmAuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2xheWVyLmZpbHRlcl0gKG9wdGlvbmFsKSBBbiBleHByZXNzaW9uIHNwZWNpZnlpbmcgY29uZGl0aW9ucyBvbiBzb3VyY2UgZmVhdHVyZXMuXG4gICAgICogT25seSBmZWF0dXJlcyB0aGF0IG1hdGNoIHRoZSBmaWx0ZXIgYXJlIGRpc3BsYXllZC5cbiAgICAgKiBUaGUgTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24gaW5jbHVkZXMgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgbGltaXRhdGlvbnMgb2YgdGhlIFtgZmlsdGVyYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvbGF5ZXJzLyNmaWx0ZXIpIHBhcmFtZXRlclxuICAgICAqIGFuZCBhIGNvbXBsZXRlIGxpc3Qgb2YgYXZhaWxhYmxlIFtleHByZXNzaW9uc10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvZXhwcmVzc2lvbnMvKS5cbiAgICAgKiBJZiBubyBmaWx0ZXIgaXMgcHJvdmlkZWQsIGFsbCBmZWF0dXJlcyBpbiB0aGUgc291cmNlIChvciBzb3VyY2UgbGF5ZXIgZm9yIHZlY3RvciB0aWxlc2V0cykgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtsYXllci5wYWludF0gKG9wdGlvbmFsKSBQYWludCBwcm9wZXJ0aWVzIGZvciB0aGUgbGF5ZXIuXG4gICAgICogQXZhaWxhYmxlIHBhaW50IHByb3BlcnRpZXMgdmFyeSBieSBgbGF5ZXIudHlwZWAuXG4gICAgICogQSBmdWxsIGxpc3Qgb2YgcGFpbnQgcHJvcGVydGllcyBmb3IgZWFjaCBsYXllciB0eXBlIGlzIGF2YWlsYWJsZSBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9sYXllcnMvKS5cbiAgICAgKiBJZiBubyBwYWludCBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQsIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgdXNlZC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2xheWVyLmxheW91dF0gKG9wdGlvbmFsKSBMYXlvdXQgcHJvcGVydGllcyBmb3IgdGhlIGxheWVyLlxuICAgICAqIEF2YWlsYWJsZSBsYXlvdXQgcHJvcGVydGllcyB2YXJ5IGJ5IGBsYXllci50eXBlYC5cbiAgICAgKiBBIGZ1bGwgbGlzdCBvZiBsYXlvdXQgcHJvcGVydGllcyBmb3IgZWFjaCBsYXllciB0eXBlIGlzIGF2YWlsYWJsZSBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9sYXllcnMvKS5cbiAgICAgKiBJZiBubyBsYXlvdXQgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkLCBkZWZhdWx0IHZhbHVlcyB3aWxsIGJlIHVzZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsYXllci5tYXh6b29tXSAob3B0aW9uYWwpIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgZm9yIHRoZSBsYXllci5cbiAgICAgKiBBdCB6b29tIGxldmVscyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gdGhlIG1heHpvb20sIHRoZSBsYXllciB3aWxsIGJlIGhpZGRlbi5cbiAgICAgKiBUaGUgdmFsdWUgY2FuIGJlIGFueSBudW1iZXIgYmV0d2VlbiBgMGAgYW5kIGAyNGAgKGluY2x1c2l2ZSkuXG4gICAgICogSWYgbm8gbWF4em9vbSBpcyBwcm92aWRlZCwgdGhlIGxheWVyIHdpbGwgYmUgdmlzaWJsZSBhdCBhbGwgem9vbSBsZXZlbHMgZm9yIHdoaWNoIHRoZXJlIGFyZSB0aWxlcyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtsYXllci5taW56b29tXSAob3B0aW9uYWwpIFRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgZm9yIHRoZSBsYXllci5cbiAgICAgKiBBdCB6b29tIGxldmVscyBsZXNzIHRoYW4gdGhlIG1pbnpvb20sIHRoZSBsYXllciB3aWxsIGJlIGhpZGRlbi5cbiAgICAgKiBUaGUgdmFsdWUgY2FuIGJlIGFueSBudW1iZXIgYmV0d2VlbiBgMGAgYW5kIGAyNGAgKGluY2x1c2l2ZSkuXG4gICAgICogSWYgbm8gbWluem9vbSBpcyBwcm92aWRlZCwgdGhlIGxheWVyIHdpbGwgYmUgdmlzaWJsZSBhdCBhbGwgem9vbSBsZXZlbHMgZm9yIHdoaWNoIHRoZXJlIGFyZSB0aWxlcyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtsYXllci5tZXRhZGF0YV0gKG9wdGlvbmFsKSBBcmJpdHJhcnkgcHJvcGVydGllcyB1c2VmdWwgdG8gdHJhY2sgd2l0aCB0aGUgbGF5ZXIsIGJ1dCBkbyBub3QgaW5mbHVlbmNlIHJlbmRlcmluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2xheWVyLnJlbmRlcmluZ01vZGVdIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBsYXllcnMgd2l0aCB0aGUgdHlwZSBgY3VzdG9tYC5cbiAgICAgKiBTZWUge0BsaW5rIEN1c3RvbUxheWVySW50ZXJmYWNlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZUlkXSBUaGUgSUQgb2YgYW4gZXhpc3RpbmcgbGF5ZXIgdG8gaW5zZXJ0IHRoZSBuZXcgbGF5ZXIgYmVmb3JlLFxuICAgICAqIHJlc3VsdGluZyBpbiB0aGUgbmV3IGxheWVyIGFwcGVhcmluZyB2aXN1YWxseSBiZW5lYXRoIHRoZSBleGlzdGluZyBsYXllci5cbiAgICAgKiBJZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBsYXllciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxheWVycyBhcnJheVxuICAgICAqIGFuZCBhcHBlYXIgdmlzdWFsbHkgYWJvdmUgYWxsIG90aGVyIGxheWVycy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIEFkZCBhIGNpcmNsZSBsYXllciB3aXRoIGEgdmVjdG9yIHNvdXJjZVxuICAgICAqIG1hcC5hZGRMYXllcih7XG4gICAgICogICAgIGlkOiAncG9pbnRzLW9mLWludGVyZXN0JyxcbiAgICAgKiAgICAgc291cmNlOiB7XG4gICAgICogICAgICAgICB0eXBlOiAndmVjdG9yJyxcbiAgICAgKiAgICAgICAgIHVybDogJ21hcGJveDovL21hcGJveC5tYXBib3gtc3RyZWV0cy12OCdcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgJ3NvdXJjZS1sYXllcic6ICdwb2lfbGFiZWwnLFxuICAgICAqICAgICB0eXBlOiAnY2lyY2xlJyxcbiAgICAgKiAgICAgcGFpbnQ6IHtcbiAgICAgKiAgICAgLy8gTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24gcGFpbnQgcHJvcGVydGllc1xuICAgICAqICAgICB9LFxuICAgICAqICAgICBsYXlvdXQ6IHtcbiAgICAgKiAgICAgLy8gTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb24gbGF5b3V0IHByb3BlcnRpZXNcbiAgICAgKiAgICAgfVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBEZWZpbmUgYSBzb3VyY2UgYmVmb3JlIHVzaW5nIGl0IHRvIGNyZWF0ZSBhIG5ldyBsYXllclxuICAgICAqIG1hcC5hZGRTb3VyY2UoJ3N0YXRlLWRhdGEnLCB7XG4gICAgICogICAgIHR5cGU6ICdnZW9qc29uJyxcbiAgICAgKiAgICAgZGF0YTogJ3BhdGgvdG8vZGF0YS5nZW9qc29uJ1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogbWFwLmFkZExheWVyKHtcbiAgICAgKiAgICAgaWQ6ICdzdGF0ZXMnLFxuICAgICAqICAgICAvLyBSZWZlcmVuY2VzIHRoZSBHZW9KU09OIHNvdXJjZSBkZWZpbmVkIGFib3ZlXG4gICAgICogICAgIC8vIGFuZCBkb2VzIG5vdCByZXF1aXJlIGEgYHNvdXJjZS1sYXllcmBcbiAgICAgKiAgICAgc291cmNlOiAnc3RhdGUtZGF0YScsXG4gICAgICogICAgIHR5cGU6ICdzeW1ib2wnLFxuICAgICAqICAgICBsYXlvdXQ6IHtcbiAgICAgKiAgICAgICAgIC8vIFNldCB0aGUgbGFiZWwgY29udGVudCB0byB0aGVcbiAgICAgKiAgICAgICAgIC8vIGZlYXR1cmUncyBgbmFtZWAgcHJvcGVydHlcbiAgICAgKiAgICAgICAgICd0ZXh0LWZpZWxkJzogWydnZXQnLCAnbmFtZSddXG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gQWRkIGEgbmV3IHN5bWJvbCBsYXllciBiZWZvcmUgYW4gZXhpc3RpbmcgbGF5ZXJcbiAgICAgKiBtYXAuYWRkTGF5ZXIoe1xuICAgICAqICAgICBpZDogJ3N0YXRlcycsXG4gICAgICogICAgIC8vIFJlZmVyZW5jZXMgYSBzb3VyY2UgdGhhdCdzIGFscmVhZHkgYmVlbiBkZWZpbmVkXG4gICAgICogICAgIHNvdXJjZTogJ3N0YXRlLWRhdGEnLFxuICAgICAqICAgICB0eXBlOiAnc3ltYm9sJyxcbiAgICAgKiAgICAgbGF5b3V0OiB7XG4gICAgICogICAgICAgICAvLyBTZXQgdGhlIGxhYmVsIGNvbnRlbnQgdG8gdGhlXG4gICAgICogICAgICAgICAvLyBmZWF0dXJlJ3MgYG5hbWVgIHByb3BlcnR5XG4gICAgICogICAgICAgICAndGV4dC1maWVsZCc6IFsnZ2V0JywgJ25hbWUnXVxuICAgICAqICAgICB9XG4gICAgICogLy8gQWRkIHRoZSBsYXllciBiZWZvcmUgdGhlIGV4aXN0aW5nIGBjaXRpZXNgIGxheWVyXG4gICAgICogfSwgJ2NpdGllcycpO1xuICAgICAqXG4gICAgICogQHNlZSBbRXhhbXBsZTogU2VsZWN0IGZlYXR1cmVzIGFyb3VuZCBhIGNsaWNrZWQgcG9pbnRdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3F1ZXJ5cmVuZGVyZWRmZWF0dXJlcy1hcm91bmQtcG9pbnQvKSAoZmlsbCBsYXllcilcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSBuZXcgbGF5ZXIgYmVsb3cgbGFiZWxzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLWxheWVyLWluLXN0YWNrLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBDcmVhdGUgYW5kIHN0eWxlIGNsdXN0ZXJzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jbHVzdGVyLykgKGNpcmNsZSBsYXllcilcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSB2ZWN0b3IgdGlsZSBzb3VyY2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3ZlY3Rvci1zb3VyY2UvKSAobGluZSBsYXllcilcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSBXTVMgbGF5ZXJdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3dtcy8pIChyYXN0ZXIgbGF5ZXIpXG4gICAgICovXG4gICAgYWRkTGF5ZXIobGF5ZXI6IExheWVyU3BlY2lmaWNhdGlvbiB8IEN1c3RvbUxheWVySW50ZXJmYWNlLCBiZWZvcmVJZD86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sYXp5SW5pdEVtcHR5U3R5bGUoKTtcbiAgICAgICAgdGhpcy5zdHlsZS5hZGRMYXllcihsYXllciwgYmVmb3JlSWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgbGF5ZXIgdG8gYSBkaWZmZXJlbnQgei1wb3NpdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIG1vdmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtiZWZvcmVJZF0gVGhlIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCB0aGUgbmV3IGxheWVyIGJlZm9yZS4gV2hlbiB2aWV3aW5nIHRoZSBtYXAsIHRoZSBgaWRgIGxheWVyIHdpbGwgYXBwZWFyIGJlbmVhdGggdGhlIGBiZWZvcmVJZGAgbGF5ZXIuIElmIGBiZWZvcmVJZGAgaXMgb21pdHRlZCwgdGhlIGxheWVyIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGF5ZXJzIGFycmF5IGFuZCBhcHBlYXIgYWJvdmUgYWxsIG90aGVyIGxheWVycyBvbiB0aGUgbWFwLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIE1vdmUgYSBsYXllciB3aXRoIElEICdwb2x5Z29uJyBiZWZvcmUgdGhlIGxheWVyIHdpdGggSUQgJ2NvdW50cnktbGFiZWwnLiBUaGUgYHBvbHlnb25gIGxheWVyIHdpbGwgYXBwZWFyIGJlbmVhdGggdGhlIGBjb3VudHJ5LWxhYmVsYCBsYXllciBvbiB0aGUgbWFwLlxuICAgICAqIG1hcC5tb3ZlTGF5ZXIoJ3BvbHlnb24nLCAnY291bnRyeS1sYWJlbCcpO1xuICAgICAqL1xuICAgIG1vdmVMYXllcihpZDogc3RyaW5nLCBiZWZvcmVJZD86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLnN0eWxlLm1vdmVMYXllcihpZCwgYmVmb3JlSWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIGxheWVyIHdpdGggdGhlIGdpdmVuIElEIGZyb20gdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogSWYgbm8gc3VjaCBsYXllciBleGlzdHMsIGFuIGBlcnJvcmAgZXZlbnQgaXMgZmlyZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgb2YgdGhlIGxheWVyIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBmaXJlcyBNYXAuZXZlbnQ6ZXJyb3JcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gSWYgYSBsYXllciB3aXRoIElEICdzdGF0ZS1kYXRhJyBleGlzdHMsIHJlbW92ZSBpdC5cbiAgICAgKiBpZiAobWFwLmdldExheWVyKCdzdGF0ZS1kYXRhJykpIG1hcC5yZW1vdmVMYXllcignc3RhdGUtZGF0YScpO1xuICAgICAqL1xuICAgIHJlbW92ZUxheWVyKGlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVMYXllcihpZCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGF5ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGluIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7P09iamVjdH0gVGhlIGxheWVyIHdpdGggdGhlIHNwZWNpZmllZCBJRCwgb3IgYHVuZGVmaW5lZGBcbiAgICAgKiAgIGlmIHRoZSBJRCBjb3JyZXNwb25kcyB0byBubyBleGlzdGluZyBsYXllcnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHN0YXRlRGF0YUxheWVyID0gbWFwLmdldExheWVyKCdzdGF0ZS1kYXRhJyk7XG4gICAgICpcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBGaWx0ZXIgc3ltYm9scyBieSB0b2dnbGluZyBhIGxpc3RdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLW1hcmtlcnMvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEZpbHRlciBzeW1ib2xzIGJ5IHRleHQgaW5wdXRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLW1hcmtlcnMtYnktaW5wdXQvKVxuICAgICAqL1xuICAgIGdldExheWVyKGlkOiBzdHJpbmcpOiA/U3R5bGVMYXllciB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldExheWVyKGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB6b29tIGV4dGVudCBmb3IgdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci4gVGhlIHpvb20gZXh0ZW50IGluY2x1ZGVzIHRoZVxuICAgICAqIFttaW5pbXVtIHpvb20gbGV2ZWxdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjLyNsYXllci1taW56b29tKVxuICAgICAqIGFuZCBbbWF4aW11bSB6b29tIGxldmVsXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy8jbGF5ZXItbWF4em9vbSkpXG4gICAgICogYXQgd2hpY2ggdGhlIGxheWVyIHdpbGwgYmUgcmVuZGVyZWQuXG4gICAgICpcbiAgICAgKiBOb3RlOiBGb3Igc3R5bGUgbGF5ZXJzIHVzaW5nIHZlY3RvciBzb3VyY2VzLCBzdHlsZSBsYXllcnMgY2Fubm90IGJlIHJlbmRlcmVkIGF0IHpvb20gbGV2ZWxzIGxvd2VyIHRoYW4gdGhlXG4gICAgICogbWluaW11bSB6b29tIGxldmVsIG9mIHRoZSBfc291cmNlIGxheWVyXyBiZWNhdXNlIHRoZSBkYXRhIGRvZXMgbm90IGV4aXN0IGF0IHRob3NlIHpvb20gbGV2ZWxzLiBJZiB0aGUgbWluaW11bVxuICAgICAqIHpvb20gbGV2ZWwgb2YgdGhlIHNvdXJjZSBsYXllciBpcyBoaWdoZXIgdGhhbiB0aGUgbWluaW11bSB6b29tIGxldmVsIGRlZmluZWQgaW4gdGhlIHN0eWxlIGxheWVyLCB0aGUgc3R5bGVcbiAgICAgKiBsYXllciB3aWxsIG5vdCBiZSByZW5kZXJlZCBhdCBhbGwgem9vbSBsZXZlbHMgaW4gdGhlIHpvb20gcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHdoaWNoIHRoZSB6b29tIGV4dGVudCB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnpvb20gVGhlIG1pbmltdW0gem9vbSB0byBzZXQgKDAtMjQpLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXh6b29tIFRoZSBtYXhpbXVtIHpvb20gdG8gc2V0ICgwLTI0KS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0TGF5ZXJab29tUmFuZ2UoJ215LWxheWVyJywgMiwgNSk7XG4gICAgICpcbiAgICAgKi9cbiAgICBzZXRMYXllclpvb21SYW5nZShsYXllcklkOiBzdHJpbmcsIG1pbnpvb206IG51bWJlciwgbWF4em9vbTogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5ZXJab29tUmFuZ2UobGF5ZXJJZCwgbWluem9vbSwgbWF4em9vbSk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZmlsdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogRmlsdGVycyBjb250cm9sIHdoaWNoIGZlYXR1cmVzIGEgc3R5bGUgbGF5ZXIgcmVuZGVycyBmcm9tIGl0cyBzb3VyY2UuXG4gICAgICogQW55IGZlYXR1cmUgZm9yIHdoaWNoIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYHRydWVgIHdpbGwgYmVcbiAgICAgKiByZW5kZXJlZCBvbiB0aGUgbWFwLiBUaG9zZSB0aGF0IGFyZSBmYWxzZSB3aWxsIGJlIGhpZGRlbi5cbiAgICAgKlxuICAgICAqIFVzZSBgc2V0RmlsdGVyYCB0byBzaG93IGEgc3Vic2V0IG9mIHlvdXIgc291cmNlIGRhdGEuXG4gICAgICpcbiAgICAgKiBUbyBjbGVhciB0aGUgZmlsdGVyLCBwYXNzIGBudWxsYCBvciBgdW5kZWZpbmVkYCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gd2hpY2ggdGhlIGZpbHRlciB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtBcnJheSB8IG51bGwgfCB1bmRlZmluZWR9IGZpbHRlciBUaGUgZmlsdGVyLCBjb25mb3JtaW5nIHRvIHRoZSBNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbidzXG4gICAgICogICBbZmlsdGVyIGRlZmluaXRpb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL2xheWVycy8jZmlsdGVyKS4gIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgdGhlIGZ1bmN0aW9uIHJlbW92ZXMgYW55IGV4aXN0aW5nIGZpbHRlciBmcm9tIHRoZSBsYXllci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudmFsaWRhdGU9dHJ1ZV0gV2hldGhlciB0byBjaGVjayBpZiB0aGUgZmlsdGVyIGNvbmZvcm1zIHRvIHRoZSBNYXBib3ggR0wgU3R5bGUgU3BlY2lmaWNhdGlvbi4gRGlzYWJsaW5nIHZhbGlkYXRpb24gaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBoYXZlIHByZXZpb3VzbHkgdmFsaWRhdGVkIHRoZSB2YWx1ZXMgeW91IHdpbGwgYmUgcGFzc2luZyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIGRpc3BsYXkgb25seSBmZWF0dXJlcyB3aXRoIHRoZSAnbmFtZScgcHJvcGVydHkgJ1VTQSdcbiAgICAgKiBtYXAuc2V0RmlsdGVyKCdteS1sYXllcicsIFsnPT0nLCBbJ2dldCcsICduYW1lJ10sICdVU0EnXSk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBkaXNwbGF5IG9ubHkgZmVhdHVyZXMgd2l0aCBmaXZlIG9yIG1vcmUgJ2F2YWlsYWJsZS1zcG90cydcbiAgICAgKiBtYXAuc2V0RmlsdGVyKCdiaWtlLWRvY2tzJywgWyc+PScsIFsnZ2V0JywgJ2F2YWlsYWJsZS1zcG90cyddLCA1XSk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyByZW1vdmUgdGhlIGZpbHRlciBmb3IgdGhlICdiaWtlLWRvY2tzJyBzdHlsZSBsYXllclxuICAgICAqIG1hcC5zZXRGaWx0ZXIoJ2Jpa2UtZG9ja3MnLCBudWxsKTtcbiAgICAgKlxuICAgICAqIEBzZWUgW0V4YW1wbGU6IEZpbHRlciBmZWF0dXJlcyB3aXRoaW4gbWFwIHZpZXddKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZmlsdGVyLWZlYXR1cmVzLXdpdGhpbi1tYXAtdmlldy8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogSGlnaGxpZ2h0IGZlYXR1cmVzIGNvbnRhaW5pbmcgc2ltaWxhciBkYXRhXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3F1ZXJ5LXNpbWlsYXItZmVhdHVyZXMvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIHRpbWVsaW5lIGFuaW1hdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90aW1lbGluZS1hbmltYXRpb24vKVxuICAgICAqIEBzZWUgW1R1dG9yaWFsOiBTaG93IGNoYW5nZXMgb3ZlciB0aW1lXShodHRwczovL2RvY3MubWFwYm94LmNvbS9oZWxwL3R1dG9yaWFscy9zaG93LWNoYW5nZXMtb3Zlci10aW1lLylcbiAgICAgKi9cbiAgICBzZXRGaWx0ZXIobGF5ZXJJZDogc3RyaW5nLCBmaWx0ZXI6ID9GaWx0ZXJTcGVjaWZpY2F0aW9uLCAgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRGaWx0ZXIobGF5ZXJJZCwgZmlsdGVyLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXIgYXBwbGllZCB0byB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBzdHlsZSBsYXllciB3aG9zZSBmaWx0ZXIgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gVGhlIGxheWVyJ3MgZmlsdGVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgZmlsdGVyID0gbWFwLmdldEZpbHRlcignbXlMYXllcicpO1xuICAgICAqL1xuICAgIGdldEZpbHRlcihsYXllcklkOiBzdHJpbmcpOiA/RmlsdGVyU3BlY2lmaWNhdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldEZpbHRlcihsYXllcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHBhaW50IHByb3BlcnR5IGluIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHNldCB0aGUgcGFpbnQgcHJvcGVydHkgaW4uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBhaW50IHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcGFpbnQgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqICAgTXVzdCBiZSBvZiBhIHR5cGUgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm9wZXJ0eSwgYXMgZGVmaW5lZCBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLykuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnZhbGlkYXRlPXRydWVdIFdoZXRoZXIgdG8gY2hlY2sgaWYgYHZhbHVlYCBjb25mb3JtcyB0byB0aGUgTWFwYm94IEdMIFN0eWxlIFNwZWNpZmljYXRpb24uIERpc2FibGluZyB2YWxpZGF0aW9uIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgaGF2ZSBwcmV2aW91c2x5IHZhbGlkYXRlZCB0aGUgdmFsdWVzIHlvdSB3aWxsIGJlIHBhc3NpbmcgdG8gdGhpcyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldFBhaW50UHJvcGVydHkoJ215LWxheWVyJywgJ2ZpbGwtY29sb3InLCAnI2ZhYWZlZScpO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IENoYW5nZSBhIGxheWVyJ3MgY29sb3Igd2l0aCBidXR0b25zXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NvbG9yLXN3aXRjaGVyLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBZGp1c3QgYSBsYXllcidzIG9wYWNpdHldKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRqdXN0LWxheWVyLW9wYWNpdHkvKVxuICAgICAqIEBzZWUgW0V4YW1wbGU6IENyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICAgICAqL1xuICAgIHNldFBhaW50UHJvcGVydHkobGF5ZXJJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM6IFN0eWxlU2V0dGVyT3B0aW9ucyA9IHt9KTogdGhpcyB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0UGFpbnRQcm9wZXJ0eShsYXllcklkLCBuYW1lLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBwYWludCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBnZXQgdGhlIHBhaW50IHByb3BlcnR5IGZyb20uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgYSBwYWludCBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhaW50IHByb3BlcnR5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgcGFpbnRQcm9wZXJ0eSA9IG1hcC5nZXRQYWludFByb3BlcnR5KCdteVN5bWJvbExheWVyJywgJ2ljb24tY29sb3InKTtcbiAgICAgKi9cbiAgICBnZXRQYWludFByb3BlcnR5KGxheWVySWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogdm9pZCB8IFRyYW5zaXRpb25TcGVjaWZpY2F0aW9uIHwgUHJvcGVydHlWYWx1ZVNwZWNpZmljYXRpb248bWl4ZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0UGFpbnRQcm9wZXJ0eShsYXllcklkLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGxheW91dCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVySWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBzZXQgdGhlIGxheW91dCBwcm9wZXJ0eSBpbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbGF5b3V0IHByb3BlcnR5IHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbGF5b3V0IHByb3BlcnR5LiBNdXN0IGJlIG9mIGEgdHlwZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHByb3BlcnR5LCBhcyBkZWZpbmVkIGluIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIE9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudmFsaWRhdGU9dHJ1ZV0gV2hldGhlciB0byBjaGVjayBpZiBgdmFsdWVgIGNvbmZvcm1zIHRvIHRoZSBNYXBib3ggR0wgU3R5bGUgU3BlY2lmaWNhdGlvbi4gRGlzYWJsaW5nIHZhbGlkYXRpb24gaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBoYXZlIHByZXZpb3VzbHkgdmFsaWRhdGVkIHRoZSB2YWx1ZXMgeW91IHdpbGwgYmUgcGFzc2luZyB0byB0aGlzIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0TGF5b3V0UHJvcGVydHkoJ215LWxheWVyJywgJ3Zpc2liaWxpdHknLCAnbm9uZScpO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IFNob3cgYW5kIGhpZGUgbGF5ZXJzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90b2dnbGUtbGF5ZXJzLylcbiAgICAgKi9cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eShsYXllcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9uczogU3R5bGVTZXR0ZXJPcHRpb25zID0ge30pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRMYXlvdXRQcm9wZXJ0eShsYXllcklkLCBuYW1lLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBsYXlvdXQgcHJvcGVydHkgaW4gdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllcklkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gZ2V0IHRoZSBsYXlvdXQgcHJvcGVydHkgZnJvbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbGF5b3V0IHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgbGF5b3V0IHByb3BlcnR5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGF5b3V0UHJvcGVydHkgPSBtYXAuZ2V0TGF5b3V0UHJvcGVydHkoJ215U3ltYm9sTGF5ZXInLCAnaWNvbi1hbmNob3InKTtcbiAgICAgKi9cbiAgICBnZXRMYXlvdXRQcm9wZXJ0eShsYXllcklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6ID9Qcm9wZXJ0eVZhbHVlU3BlY2lmaWNhdGlvbjxtaXhlZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMYXlvdXRQcm9wZXJ0eShsYXllcklkLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvKiogQHNlY3Rpb24ge1N0eWxlIHByb3BlcnRpZXN9ICovXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhbnkgY29tYmluYXRpb24gb2YgbGlnaHQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtMaWdodFNwZWNpZmljYXRpb259IGxpZ2h0IExpZ2h0IHByb3BlcnRpZXMgdG8gc2V0LiBNdXN0IGNvbmZvcm0gdG8gdGhlIFtMaWdodCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNsaWdodCkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSBPcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnZhbGlkYXRlPXRydWVdIFdoZXRoZXIgdG8gY2hlY2sgaWYgdGhlIGZpbHRlciBjb25mb3JtcyB0byB0aGUgTWFwYm94IEdMIFN0eWxlIFNwZWNpZmljYXRpb24uIERpc2FibGluZyB2YWxpZGF0aW9uIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgaGF2ZSBwcmV2aW91c2x5IHZhbGlkYXRlZCB0aGUgdmFsdWVzIHlvdSB3aWxsIGJlIHBhc3NpbmcgdG8gdGhpcyBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldExpZ2h0KHtcbiAgICAgKiAgICAgXCJhbmNob3JcIjogXCJ2aWV3cG9ydFwiLFxuICAgICAqICAgICBcImNvbG9yXCI6IFwiYmx1ZVwiLFxuICAgICAqICAgICBcImludGVuc2l0eVwiOiAwLjVcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBzZXRMaWdodChsaWdodDogTGlnaHRTcGVjaWZpY2F0aW9uLCBvcHRpb25zOiBTdHlsZVNldHRlck9wdGlvbnMgPSB7fSk6IHRoaXMge1xuICAgICAgICB0aGlzLl9sYXp5SW5pdEVtcHR5U3R5bGUoKTtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRMaWdodChsaWdodCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGxpZ2h0IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMaWdodFNwZWNpZmljYXRpb259IExpZ2h0IHByb3BlcnRpZXMgb2YgdGhlIHN0eWxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbGlnaHQgPSBtYXAuZ2V0TGlnaHQoKTtcbiAgICAgKi9cbiAgICBnZXRMaWdodCgpOiBMaWdodFNwZWNpZmljYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5nZXRMaWdodCgpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnNcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0ZXJyYWluIHByb3BlcnR5IG9mIHRoZSBzdHlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VGVycmFpblNwZWNpZmljYXRpb259IHRlcnJhaW4gVGVycmFpbiBwcm9wZXJ0aWVzIHRvIHNldC4gTXVzdCBjb25mb3JtIHRvIHRoZSBbVGVycmFpbiBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy90ZXJyYWluLykuXG4gICAgICogSWYgYG51bGxgIG9yIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCBmdW5jdGlvbiByZW1vdmVzIHRlcnJhaW4uXG4gICAgICogQHJldHVybnMge01hcH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5hZGRTb3VyY2UoJ21hcGJveC1kZW0nLCB7XG4gICAgICogICAgICd0eXBlJzogJ3Jhc3Rlci1kZW0nLFxuICAgICAqICAgICAndXJsJzogJ21hcGJveDovL21hcGJveC5tYXBib3gtdGVycmFpbi1kZW0tdjEnLFxuICAgICAqICAgICAndGlsZVNpemUnOiA1MTIsXG4gICAgICogICAgICdtYXh6b29tJzogMTRcbiAgICAgKiB9KTtcbiAgICAgKiAvLyBhZGQgdGhlIERFTSBzb3VyY2UgYXMgYSB0ZXJyYWluIGxheWVyIHdpdGggZXhhZ2dlcmF0ZWQgaGVpZ2h0XG4gICAgICogbWFwLnNldFRlcnJhaW4oeydzb3VyY2UnOiAnbWFwYm94LWRlbScsICdleGFnZ2VyYXRpb24nOiAxLjV9KTtcbiAgICAgKi9cbiAgICBzZXRUZXJyYWluKHRlcnJhaW46IFRlcnJhaW5TcGVjaWZpY2F0aW9uKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xhenlJbml0RW1wdHlTdHlsZSgpO1xuICAgICAgICBpZiAoIXRlcnJhaW4gJiYgdGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbi5yZXF1aXJlc0RyYXBpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuc2V0VGVycmFpbkZvckRyYXBpbmcoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuc2V0VGVycmFpbih0ZXJyYWluKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hdmVyYWdlRWxldmF0aW9uTGFzdFNhbXBsZWRBdCA9IC1JbmZpbml0eTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0ZXJyYWluIHNwZWNpZmljYXRpb24gb3IgYG51bGxgIGlmIHRlcnJhaW4gaXNuJ3Qgc2V0IG9uIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7VGVycmFpblNwZWNpZmljYXRpb24gfCBudWxsfSBUZXJyYWluIHNwZWNpZmljYXRpb24gcHJvcGVydGllcyBvZiB0aGUgc3R5bGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCB0ZXJyYWluID0gbWFwLmdldFRlcnJhaW4oKTtcbiAgICAgKi9cbiAgICBnZXRUZXJyYWluKCk6ID9UZXJyYWluU3BlY2lmaWNhdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlID8gdGhpcy5zdHlsZS5nZXRUZXJyYWluKCkgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZvZyBwcm9wZXJ0eSBvZiB0aGUgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0ZvZ1NwZWNpZmljYXRpb259IGZvZyBUaGUgZm9nIHByb3BlcnRpZXMgdG8gc2V0LiBNdXN0IGNvbmZvcm0gdG8gdGhlIFtGb2cgU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvZm9nLykuXG4gICAgICogSWYgYG51bGxgIG9yIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCB0aGlzIGZ1bmN0aW9uIGNhbGwgcmVtb3ZlcyB0aGUgZm9nIGZyb20gdGhlIG1hcC5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLnNldEZvZyh7XG4gICAgICogICAgIFwicmFuZ2VcIjogWzAuOCwgOF0sXG4gICAgICogICAgIFwiY29sb3JcIjogXCIjZGM5ZjlmXCIsXG4gICAgICogICAgIFwiaG9yaXpvbi1ibGVuZFwiOiAwLjUsXG4gICAgICogICAgIFwiaGlnaC1jb2xvclwiOiBcIiMyNDViZGVcIixcbiAgICAgKiAgICAgXCJzcGFjZS1jb2xvclwiOiBcIiMwMDAwMDBcIixcbiAgICAgKiAgICAgXCJzdGFyLWludGVuc2l0eVwiOiAwLjE1XG4gICAgICogfSk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogQWRkIGZvZyB0byBhIG1hcF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLWZvZy8pXG4gICAgICovXG4gICAgc2V0Rm9nKGZvZzogRm9nU3BlY2lmaWNhdGlvbik6IHRoaXMge1xuICAgICAgICB0aGlzLl9sYXp5SW5pdEVtcHR5U3R5bGUoKTtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRGb2coZm9nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmb2cgc3BlY2lmaWNhdGlvbiBvciBgbnVsbGAgaWYgZm9nIGlzIG5vdCBzZXQgb24gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGb2dTcGVjaWZpY2F0aW9ufSBGb2cgc3BlY2lmaWNhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBzdHlsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IGZvZyA9IG1hcC5nZXRGb2coKTtcbiAgICAgKi9cbiAgICBnZXRGb2coKTogP0ZvZ1NwZWNpZmljYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZSA/IHRoaXMuc3R5bGUuZ2V0Rm9nKCkgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZvZyBvcGFjaXR5IGZvciBhIGdpdmVuIGxvY2F0aW9uLlxuICAgICAqXG4gICAgICogQW4gb3BhY2l0eSBvZiAwIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gZm9nIGNvbnRyaWJ1dGlvbiBmb3IgdGhlIGdpdmVuIGxvY2F0aW9uXG4gICAgICogd2hpbGUgYSBmb2cgb3BhY2l0eSBvZiAxLjAgbWVhbnMgdGhlIGxvY2F0aW9uIGlzIGZ1bGx5IG9ic2N1cmVkIGJ5IHRoZSBmb2cgZWZmZWN0LlxuICAgICAqXG4gICAgICogSWYgdGhlcmUgaXMgbm8gZm9nIHNldCBvbiB0aGUgbWFwLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IGxuZ2xhdCBUaGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIHRvIGV2YWx1YXRlIHRoZSBmb2cgb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gQSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEgcmVwcmVzZW50aW5nIHRoZSBmb2cgb3BhY2l0eSwgd2hlcmUgMSBtZWFucyBmdWxseSB3aXRoaW4sIGFuZCAwIG1lYW5zIG5vdCBhZmZlY3RlZCBieSB0aGUgZm9nIGVmZmVjdC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9xdWVyeUZvZ09wYWNpdHkobG5nbGF0OiBMbmdMYXRMaWtlKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0eWxlIHx8ICF0aGlzLnN0eWxlLmZvZykgcmV0dXJuIDAuMDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZm9nLmdldE9wYWNpdHlBdExhdExuZyhMbmdMYXQuY29udmVydChsbmdsYXQpLCB0aGlzLnRyYW5zZm9ybSk7XG4gICAgfVxuXG4gICAgLyoqIEBzZWN0aW9uIHtGZWF0dXJlIHN0YXRlfSAqL1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHN0YXRlYCBvZiBhIGZlYXR1cmUuXG4gICAgICogQSBmZWF0dXJlJ3MgYHN0YXRlYCBpcyBhIHNldCBvZiB1c2VyLWRlZmluZWQga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIGEgZmVhdHVyZSBhdCBydW50aW1lLlxuICAgICAqIFdoZW4gdXNpbmcgdGhpcyBtZXRob2QsIHRoZSBgc3RhdGVgIG9iamVjdCBpcyBtZXJnZWQgd2l0aCBhbnkgZXhpc3Rpbmcga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBmZWF0dXJlJ3Mgc3RhdGUuXG4gICAgICogRmVhdHVyZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgYGlkYCBhdHRyaWJ1dGUsIHdoaWNoIGNhbiBiZSBhbnkgbnVtYmVyIG9yIHN0cmluZy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBzb3VyY2VzIHRoYXQgaGF2ZSBhIGBpZGAgYXR0cmlidXRlLiBUaGUgYGlkYCBhdHRyaWJ1dGUgY2FuIGJlIGRlZmluZWQgaW4gdGhyZWUgd2F5czpcbiAgICAgKiAtIEZvciB2ZWN0b3Igb3IgR2VvSlNPTiBzb3VyY2VzLCBpbmNsdWRpbmcgYW4gYGlkYCBhdHRyaWJ1dGUgaW4gdGhlIG9yaWdpbmFsIGRhdGEgZmlsZS5cbiAgICAgKiAtIEZvciB2ZWN0b3Igb3IgR2VvSlNPTiBzb3VyY2VzLCB1c2luZyB0aGUgW2Bwcm9tb3RlSWRgXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9zb3VyY2VzLyN2ZWN0b3ItcHJvbW90ZUlkKSBvcHRpb24gYXQgdGhlIHRpbWUgdGhlIHNvdXJjZSBpcyBkZWZpbmVkLlxuICAgICAqIC0gRm9yIEdlb0pTT04gc291cmNlcywgdXNpbmcgdGhlIFtgZ2VuZXJhdGVJZGBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3NvdXJjZXMvI2dlb2pzb24tZ2VuZXJhdGVJZCkgb3B0aW9uIHRvIGF1dG8tYXNzaWduIGFuIGBpZGAgYmFzZWQgb24gdGhlIGZlYXR1cmUncyBpbmRleCBpbiB0aGUgc291cmNlIGRhdGEuIElmIHlvdSBjaGFuZ2UgZmVhdHVyZSBkYXRhIHVzaW5nIGBtYXAuZ2V0U291cmNlKCdzb21lIGlkJykuc2V0RGF0YSguLi4pYCwgeW91IG1heSBuZWVkIHRvIHJlLWFwcGx5IHN0YXRlIHRha2luZyBpbnRvIGFjY291bnQgdXBkYXRlZCBgaWRgIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIF9Ob3RlOiBZb3UgY2FuIHVzZSB0aGUgW2BmZWF0dXJlLXN0YXRlYCBleHByZXNzaW9uXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9leHByZXNzaW9ucy8jZmVhdHVyZS1zdGF0ZSkgdG8gYWNjZXNzIHRoZSB2YWx1ZXMgaW4gYSBmZWF0dXJlJ3Mgc3RhdGUgb2JqZWN0IGZvciB0aGUgcHVycG9zZXMgb2Ygc3R5bGluZ18uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZmVhdHVyZSBGZWF0dXJlIGlkZW50aWZpZXIuIEZlYXR1cmUgb2JqZWN0cyByZXR1cm5lZCBmcm9tXG4gICAgICoge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9IG9yIGV2ZW50IGhhbmRsZXJzIGNhbiBiZSB1c2VkIGFzIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IGZlYXR1cmUuaWQgVW5pcXVlIGlkIG9mIHRoZSBmZWF0dXJlLiBDYW4gYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgYnV0IHN1cHBvcnRzIHN0cmluZyB2YWx1ZXMgb25seSB3aGVuIHRoZSBbYHByb21vdGVJZGBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3NvdXJjZXMvI3ZlY3Rvci1wcm9tb3RlSWQpIG9wdGlvbiBoYXMgYmVlbiBhcHBsaWVkIHRvIHRoZSBzb3VyY2Ugb3IgdGhlIHN0cmluZyBjYW4gYmUgY2FzdCB0byBhbiBpbnRlZ2VyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmZWF0dXJlLnNvdXJjZSBUaGUgaWQgb2YgdGhlIHZlY3RvciBvciBHZW9KU09OIHNvdXJjZSBmb3IgdGhlIGZlYXR1cmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtmZWF0dXJlLnNvdXJjZUxheWVyXSAob3B0aW9uYWwpICpGb3IgdmVjdG9yIHRpbGUgc291cmNlcywgYHNvdXJjZUxheWVyYCBpcyByZXF1aXJlZCouXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIEEgc2V0IG9mIGtleS12YWx1ZSBwYWlycy4gVGhlIHZhbHVlcyBzaG91bGQgYmUgdmFsaWQgSlNPTiB0eXBlcy5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBUaGUgbWFwIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFdoZW4gdGhlIG1vdXNlIG1vdmVzIG92ZXIgdGhlIGBteS1sYXllcmAgbGF5ZXIsIHVwZGF0ZVxuICAgICAqIC8vIHRoZSBmZWF0dXJlIHN0YXRlIGZvciB0aGUgZmVhdHVyZSB1bmRlciB0aGUgbW91c2VcbiAgICAgKiBtYXAub24oJ21vdXNlbW92ZScsICdteS1sYXllcicsIChlKSA9PiB7XG4gICAgICogICAgIGlmIChlLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgKiAgICAgICAgIG1hcC5zZXRGZWF0dXJlU3RhdGUoe1xuICAgICAqICAgICAgICAgICAgIHNvdXJjZTogJ215LXNvdXJjZScsXG4gICAgICogICAgICAgICAgICAgc291cmNlTGF5ZXI6ICdteS1zb3VyY2UtbGF5ZXInLFxuICAgICAqICAgICAgICAgICAgIGlkOiBlLmZlYXR1cmVzWzBdLmlkLFxuICAgICAqICAgICAgICAgfSwge1xuICAgICAqICAgICAgICAgICAgIGhvdmVyOiB0cnVlXG4gICAgICogICAgICAgICB9KTtcbiAgICAgKiAgICAgfVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQHNlZSBbRXhhbXBsZTogQ3JlYXRlIGEgaG92ZXIgZWZmZWN0XShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9ob3Zlci1zdHlsZXMvKVxuICAgICAqIEBzZWUgW1R1dG9yaWFsOiBDcmVhdGUgaW50ZXJhY3RpdmUgaG92ZXIgZWZmZWN0cyB3aXRoIE1hcGJveCBHTCBKU10oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vaGVscC90dXRvcmlhbHMvY3JlYXRlLWludGVyYWN0aXZlLWhvdmVyLWVmZmVjdHMtd2l0aC1tYXBib3gtZ2wtanMvKVxuICAgICAqL1xuICAgIHNldEZlYXR1cmVTdGF0ZShmZWF0dXJlOiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ6IHN0cmluZyB8IG51bWJlcjsgfSwgc3RhdGU6IE9iamVjdCk6IHRoaXMge1xuICAgICAgICB0aGlzLnN0eWxlLnNldEZlYXR1cmVTdGF0ZShmZWF0dXJlLCBzdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYHN0YXRlYCBvZiBhIGZlYXR1cmUsIHNldHRpbmcgaXQgYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvci5cbiAgICAgKiBJZiBvbmx5IGEgYGZlYXR1cmUuc291cmNlYCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgcmVtb3ZlIHRoZSBzdGF0ZSBmb3IgYWxsIGZlYXR1cmVzIGZyb20gdGhhdCBzb3VyY2UuXG4gICAgICogSWYgYGZlYXR1cmUuaWRgIGlzIGFsc28gc3BlY2lmaWVkLCBpdCB3aWxsIHJlbW92ZSBhbGwga2V5cyBmb3IgdGhhdCBmZWF0dXJlJ3Mgc3RhdGUuXG4gICAgICogSWYgYGtleWAgaXMgYWxzbyBzcGVjaWZpZWQsIGl0IHJlbW92ZXMgb25seSB0aGF0IGtleSBmcm9tIHRoYXQgZmVhdHVyZSdzIHN0YXRlLlxuICAgICAqIEZlYXR1cmVzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGBmZWF0dXJlLmlkYCBhdHRyaWJ1dGUsIHdoaWNoIGNhbiBiZSBhbnkgbnVtYmVyIG9yIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmZWF0dXJlIElkZW50aWZpZXIgb2Ygd2hlcmUgdG8gcmVtb3ZlIHN0YXRlLiBJdCBjYW4gYmUgYSBzb3VyY2UsIGEgZmVhdHVyZSwgb3IgYSBzcGVjaWZpYyBrZXkgb2YgZmVhdHVyZS5cbiAgICAgKiBGZWF0dXJlIG9iamVjdHMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc30gb3IgZXZlbnQgaGFuZGxlcnMgY2FuIGJlIHVzZWQgYXMgZmVhdHVyZSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gZmVhdHVyZS5pZCBVbmlxdWUgaWQgb2YgdGhlIGZlYXR1cmUuIENhbiBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBidXQgc3VwcG9ydHMgc3RyaW5nIHZhbHVlcyBvbmx5IHdoZW4gdGhlIFtgcHJvbW90ZUlkYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvc291cmNlcy8jdmVjdG9yLXByb21vdGVJZCkgb3B0aW9uIGhhcyBiZWVuIGFwcGxpZWQgdG8gdGhlIHNvdXJjZSBvciB0aGUgc3RyaW5nIGNhbiBiZSBjYXN0IHRvIGFuIGludGVnZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZlYXR1cmUuc291cmNlIFRoZSBpZCBvZiB0aGUgdmVjdG9yIG9yIEdlb0pTT04gc291cmNlIGZvciB0aGUgZmVhdHVyZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZlYXR1cmUuc291cmNlTGF5ZXJdIChvcHRpb25hbCkgRm9yIHZlY3RvciB0aWxlIHNvdXJjZXMsIGBzb3VyY2VMYXllcmAgaXMgcmVxdWlyZWQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAob3B0aW9uYWwpIFRoZSBrZXkgaW4gdGhlIGZlYXR1cmUgc3RhdGUgdG8gcmVzZXQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIFJlc2V0IHRoZSBlbnRpcmUgc3RhdGUgb2JqZWN0IGZvciBhbGwgZmVhdHVyZXNcbiAgICAgKiAvLyBpbiB0aGUgYG15LXNvdXJjZWAgc291cmNlXG4gICAgICogbWFwLnJlbW92ZUZlYXR1cmVTdGF0ZSh7XG4gICAgICogICAgIHNvdXJjZTogJ215LXNvdXJjZSdcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gV2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBgbXktbGF5ZXJgIGxheWVyLFxuICAgICAqIC8vIHJlc2V0IHRoZSBlbnRpcmUgc3RhdGUgb2JqZWN0IGZvciB0aGVcbiAgICAgKiAvLyBmZWF0dXJlIHVuZGVyIHRoZSBtb3VzZVxuICAgICAqIG1hcC5vbignbW91c2VsZWF2ZScsICdteS1sYXllcicsIChlKSA9PiB7XG4gICAgICogICAgIG1hcC5yZW1vdmVGZWF0dXJlU3RhdGUoe1xuICAgICAqICAgICAgICAgc291cmNlOiAnbXktc291cmNlJyxcbiAgICAgKiAgICAgICAgIHNvdXJjZUxheWVyOiAnbXktc291cmNlLWxheWVyJyxcbiAgICAgKiAgICAgICAgIGlkOiBlLmZlYXR1cmVzWzBdLmlkXG4gICAgICogICAgIH0pO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBXaGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGBteS1sYXllcmAgbGF5ZXIsXG4gICAgICogLy8gcmVzZXQgb25seSB0aGUgYGhvdmVyYCBrZXktdmFsdWUgcGFpciBpbiB0aGVcbiAgICAgKiAvLyBzdGF0ZSBmb3IgdGhlIGZlYXR1cmUgdW5kZXIgdGhlIG1vdXNlXG4gICAgICogbWFwLm9uKCdtb3VzZWxlYXZlJywgJ215LWxheWVyJywgKGUpID0+IHtcbiAgICAgKiAgICAgbWFwLnJlbW92ZUZlYXR1cmVTdGF0ZSh7XG4gICAgICogICAgICAgICBzb3VyY2U6ICdteS1zb3VyY2UnLFxuICAgICAqICAgICAgICAgc291cmNlTGF5ZXI6ICdteS1zb3VyY2UtbGF5ZXInLFxuICAgICAqICAgICAgICAgaWQ6IGUuZmVhdHVyZXNbMF0uaWRcbiAgICAgKiAgICAgfSwgJ2hvdmVyJyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAqL1xuICAgIHJlbW92ZUZlYXR1cmVTdGF0ZShmZWF0dXJlOiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ/OiBzdHJpbmcgfCBudW1iZXI7IH0sIGtleT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZUZlYXR1cmVTdGF0ZShmZWF0dXJlLCBrZXkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHN0YXRlYCBvZiBhIGZlYXR1cmUuXG4gICAgICogQSBmZWF0dXJlJ3MgYHN0YXRlYCBpcyBhIHNldCBvZiB1c2VyLWRlZmluZWQga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIGEgZmVhdHVyZSBhdCBydW50aW1lLlxuICAgICAqIEZlYXR1cmVzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIGBpZGAgYXR0cmlidXRlLCB3aGljaCBjYW4gYmUgYW55IG51bWJlciBvciBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBfTm90ZTogVG8gYWNjZXNzIHRoZSB2YWx1ZXMgaW4gYSBmZWF0dXJlJ3Mgc3RhdGUgb2JqZWN0IGZvciB0aGUgcHVycG9zZXMgb2Ygc3R5bGluZyB0aGUgZmVhdHVyZSwgdXNlIHRoZSBbYGZlYXR1cmUtc3RhdGVgIGV4cHJlc3Npb25dKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL2V4cHJlc3Npb25zLyNmZWF0dXJlLXN0YXRlKV8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZmVhdHVyZSBGZWF0dXJlIGlkZW50aWZpZXIuIEZlYXR1cmUgb2JqZWN0cyByZXR1cm5lZCBmcm9tXG4gICAgICoge0BsaW5rIE1hcCNxdWVyeVJlbmRlcmVkRmVhdHVyZXN9IG9yIGV2ZW50IGhhbmRsZXJzIGNhbiBiZSB1c2VkIGFzIGZlYXR1cmUgaWRlbnRpZmllcnMuXG4gICAgICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IGZlYXR1cmUuaWQgVW5pcXVlIGlkIG9mIHRoZSBmZWF0dXJlLiBDYW4gYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgYnV0IHN1cHBvcnRzIHN0cmluZyB2YWx1ZXMgb25seSB3aGVuIHRoZSBbYHByb21vdGVJZGBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9zdHlsZS1zcGVjL3NvdXJjZXMvI3ZlY3Rvci1wcm9tb3RlSWQpIG9wdGlvbiBoYXMgYmVlbiBhcHBsaWVkIHRvIHRoZSBzb3VyY2Ugb3IgdGhlIHN0cmluZyBjYW4gYmUgY2FzdCB0byBhbiBpbnRlZ2VyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmZWF0dXJlLnNvdXJjZSBUaGUgaWQgb2YgdGhlIHZlY3RvciBvciBHZW9KU09OIHNvdXJjZSBmb3IgdGhlIGZlYXR1cmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtmZWF0dXJlLnNvdXJjZUxheWVyXSAob3B0aW9uYWwpICpGb3IgdmVjdG9yIHRpbGUgc291cmNlcywgYHNvdXJjZUxheWVyYCBpcyByZXF1aXJlZCouXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc3RhdGUgb2YgdGhlIGZlYXR1cmU6IGEgc2V0IG9mIGtleS12YWx1ZSBwYWlycyB0aGF0IHdhcyBhc3NpZ25lZCB0byB0aGUgZmVhdHVyZSBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBXaGVuIHRoZSBtb3VzZSBtb3ZlcyBvdmVyIHRoZSBgbXktbGF5ZXJgIGxheWVyLFxuICAgICAqIC8vIGdldCB0aGUgZmVhdHVyZSBzdGF0ZSBmb3IgdGhlIGZlYXR1cmUgdW5kZXIgdGhlIG1vdXNlXG4gICAgICogbWFwLm9uKCdtb3VzZW1vdmUnLCAnbXktbGF5ZXInLCAoZSkgPT4ge1xuICAgICAqICAgICBpZiAoZS5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICogICAgICAgICBtYXAuZ2V0RmVhdHVyZVN0YXRlKHtcbiAgICAgKiAgICAgICAgICAgICBzb3VyY2U6ICdteS1zb3VyY2UnLFxuICAgICAqICAgICAgICAgICAgIHNvdXJjZUxheWVyOiAnbXktc291cmNlLWxheWVyJyxcbiAgICAgKiAgICAgICAgICAgICBpZDogZS5mZWF0dXJlc1swXS5pZFxuICAgICAqICAgICAgICAgfSk7XG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqL1xuICAgIGdldEZlYXR1cmVTdGF0ZShmZWF0dXJlOiB7IHNvdXJjZTogc3RyaW5nOyBzb3VyY2VMYXllcj86IHN0cmluZzsgaWQ6IHN0cmluZyB8IG51bWJlcjsgfSk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldEZlYXR1cmVTdGF0ZShmZWF0dXJlKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlQ29udGFpbmVyRGltZW5zaW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXIpIHJldHVybjtcblxuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuX2NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB8fCA0MDA7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuX2NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgfHwgMzAwO1xuXG4gICAgICAgIGxldCB0cmFuc2Zvcm1WYWx1ZXM7XG4gICAgICAgIGxldCB0cmFuc2Zvcm1TY2FsZVdpZHRoO1xuICAgICAgICBsZXQgdHJhbnNmb3JtU2NhbGVIZWlnaHQ7XG4gICAgICAgIGxldCBlbCA9IHRoaXMuX2NvbnRhaW5lcjtcbiAgICAgICAgd2hpbGUgKGVsICYmICghdHJhbnNmb3JtU2NhbGVXaWR0aCB8fCAhdHJhbnNmb3JtU2NhbGVIZWlnaHQpKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1NYXRyaXggPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkudHJhbnNmb3JtO1xuICAgICAgICAgICAgaWYgKHRyYW5zZm9ybU1hdHJpeCAmJiB0cmFuc2Zvcm1NYXRyaXggIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybVZhbHVlcyA9IHRyYW5zZm9ybU1hdHJpeC5tYXRjaCgvbWF0cml4LipcXCgoLispXFwpLylbMV0uc3BsaXQoJywgJyk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybVZhbHVlc1swXSAmJiB0cmFuc2Zvcm1WYWx1ZXNbMF0gIT09ICcwJyAmJiB0cmFuc2Zvcm1WYWx1ZXNbMF0gIT09ICcxJykgdHJhbnNmb3JtU2NhbGVXaWR0aCA9IHRyYW5zZm9ybVZhbHVlc1swXTtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtVmFsdWVzWzNdICYmIHRyYW5zZm9ybVZhbHVlc1szXSAhPT0gJzAnICYmIHRyYW5zZm9ybVZhbHVlc1szXSAhPT0gJzEnKSB0cmFuc2Zvcm1TY2FsZUhlaWdodCA9IHRyYW5zZm9ybVZhbHVlc1szXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsID0gZWwucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lcldpZHRoID0gdHJhbnNmb3JtU2NhbGVXaWR0aCA/IE1hdGguYWJzKHdpZHRoIC8gdHJhbnNmb3JtU2NhbGVXaWR0aCkgOiB3aWR0aDtcbiAgICAgICAgdGhpcy5fY29udGFpbmVySGVpZ2h0ID0gdHJhbnNmb3JtU2NhbGVIZWlnaHQgPyBNYXRoLmFicyhoZWlnaHQgLyB0cmFuc2Zvcm1TY2FsZUhlaWdodCkgOiBoZWlnaHQ7XG4gICAgfVxuXG4gICAgX2RldGVjdE1pc3NpbmdDU1MoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkQ29sb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9taXNzaW5nQ1NTQ2FuYXJ5KS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kLWNvbG9yJyk7XG4gICAgICAgIGlmIChjb21wdXRlZENvbG9yICE9PSAncmdiKDI1MCwgMTI4LCAxMTQpJykge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ1RoaXMgcGFnZSBhcHBlYXJzIHRvIGJlIG1pc3NpbmcgQ1NTIGRlY2xhcmF0aW9ucyBmb3IgJyArXG4gICAgICAgICAgICAgICAgJ01hcGJveCBHTCBKUywgd2hpY2ggbWF5IGNhdXNlIHRoZSBtYXAgdG8gZGlzcGxheSBpbmNvcnJlY3RseS4gJyArXG4gICAgICAgICAgICAgICAgJ1BsZWFzZSBlbnN1cmUgeW91ciBwYWdlIGluY2x1ZGVzIG1hcGJveC1nbC5jc3MsIGFzIGRlc2NyaWJlZCAnICtcbiAgICAgICAgICAgICAgICAnaW4gaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvYXBpLy4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zZXR1cENvbnRhaW5lcigpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyO1xuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtbWFwJyk7XG5cbiAgICAgICAgY29uc3QgbWlzc2luZ0NTU0NhbmFyeSA9IHRoaXMuX21pc3NpbmdDU1NDYW5hcnkgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY2FuYXJ5JywgY29udGFpbmVyKTtcbiAgICAgICAgbWlzc2luZ0NTU0NhbmFyeS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuX2RldGVjdE1pc3NpbmdDU1MoKTtcblxuICAgICAgICBjb25zdCBjYW52YXNDb250YWluZXIgPSB0aGlzLl9jYW52YXNDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY2FudmFzLWNvbnRhaW5lcicsIGNvbnRhaW5lcik7XG4gICAgICAgIGlmICh0aGlzLl9pbnRlcmFjdGl2ZSkge1xuICAgICAgICAgICAgY2FudmFzQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWludGVyYWN0aXZlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jYW52YXMgPSBET00uY3JlYXRlKCdjYW52YXMnLCAnbWFwYm94Z2wtY2FudmFzJywgY2FudmFzQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmdsY29udGV4dGxvc3QnLCB0aGlzLl9jb250ZXh0TG9zdCwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCB0aGlzLl9jb250ZXh0UmVzdG9yZWQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fY2FudmFzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgICAgICB0aGlzLl9jYW52YXMuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGhpcy5fZ2V0VUlTdHJpbmcoJ01hcC5UaXRsZScpKTtcbiAgICAgICAgdGhpcy5fY2FudmFzLnNldEF0dHJpYnV0ZSgncm9sZScsICdyZWdpb24nKTtcblxuICAgICAgICB0aGlzLl91cGRhdGVDb250YWluZXJEaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuX3Jlc2l6ZUNhbnZhcyh0aGlzLl9jb250YWluZXJXaWR0aCwgdGhpcy5fY29udGFpbmVySGVpZ2h0KTtcblxuICAgICAgICBjb25zdCBjb250cm9sQ29udGFpbmVyID0gdGhpcy5fY29udHJvbENvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jb250cm9sLWNvbnRhaW5lcicsIGNvbnRhaW5lcik7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMuX2NvbnRyb2xQb3NpdGlvbnMgPSB7fTtcbiAgICAgICAgWyd0b3AtbGVmdCcsICd0b3AtcmlnaHQnLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLXJpZ2h0J10uZm9yRWFjaCgocG9zaXRpb25OYW1lKSA9PiB7XG4gICAgICAgICAgICBwb3NpdGlvbnNbcG9zaXRpb25OYW1lXSA9IERPTS5jcmVhdGUoJ2RpdicsIGBtYXBib3hnbC1jdHJsLSR7cG9zaXRpb25OYW1lfWAsIGNvbnRyb2xDb250YWluZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fb25NYXBTY3JvbGwsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBfcmVzaXplQ2FudmFzKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHBpeGVsUmF0aW8gPSBicm93c2VyLmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgICAgICAvLyBSZXF1ZXN0IHRoZSByZXF1aXJlZCBjYW52YXMgc2l6ZSAocm91bmRlZCB1cCkgdGFraW5nIHRoZSBwaXhlbHJhdGlvIGludG8gYWNjb3VudC5cbiAgICAgICAgdGhpcy5fY2FudmFzLndpZHRoID0gcGl4ZWxSYXRpbyAqIE1hdGguY2VpbCh3aWR0aCk7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSBwaXhlbFJhdGlvICogTWF0aC5jZWlsKGhlaWdodCk7XG5cbiAgICAgICAgLy8gTWFpbnRhaW4gdGhlIHNhbWUgY2FudmFzIHNpemUsIHBvdGVudGlhbGx5IGRvd25zY2FsaW5nIGl0IGZvciBIaURQSSBkaXNwbGF5c1xuICAgICAgICB0aGlzLl9jYW52YXMuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgIH1cblxuICAgIF9hZGRNYXJrZXIobWFya2VyOiBNYXJrZXIpIHtcbiAgICAgICAgdGhpcy5fbWFya2Vycy5wdXNoKG1hcmtlcik7XG4gICAgfVxuXG4gICAgX3JlbW92ZU1hcmtlcihtYXJrZXI6IE1hcmtlcikge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX21hcmtlcnMuaW5kZXhPZihtYXJrZXIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJrZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc2V0dXBQYWludGVyKCkge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZXh0ZW5kKHt9LCBzdXBwb3J0ZWQud2ViR0xDb250ZXh0QXR0cmlidXRlcywge1xuICAgICAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogdGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCxcbiAgICAgICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyLFxuICAgICAgICAgICAgYW50aWFsaWFzOiB0aGlzLl9hbnRpYWxpYXMgfHwgZmFsc2VcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLl9jYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBhdHRyaWJ1dGVzKSB8fFxuICAgICAgICAgICAgdGhpcy5fY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpO1xuXG4gICAgICAgIGlmICghZ2wpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXJyb3JFdmVudChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIFdlYkdMJykpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0b3JlQXV0aFN0YXRlKGdsLCB0cnVlKTtcblxuICAgICAgICB0aGlzLnBhaW50ZXIgPSBuZXcgUGFpbnRlcihnbCwgdGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICB0aGlzLm9uKCdkYXRhJywgKGV2ZW50OiBNYXBEYXRhRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhVHlwZSA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhaW50ZXIuc2V0VGlsZUxvYWRlZEZsYWcodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdlYnBTdXBwb3J0ZWQudGVzdFN1cHBvcnQoZ2wpO1xuICAgIH1cblxuICAgIF9jb250ZXh0TG9zdChldmVudDogKikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5fZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3dlYmdsY29udGV4dGxvc3QnLCB7b3JpZ2luYWxFdmVudDogZXZlbnR9KSk7XG4gICAgfVxuXG4gICAgX2NvbnRleHRSZXN0b3JlZChldmVudDogKikge1xuICAgICAgICB0aGlzLl9zZXR1cFBhaW50ZXIoKTtcbiAgICAgICAgdGhpcy5yZXNpemUoKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3dlYmdsY29udGV4dHJlc3RvcmVkJywge29yaWdpbmFsRXZlbnQ6IGV2ZW50fSkpO1xuICAgIH1cblxuICAgIF9vbk1hcFNjcm9sbChldmVudDogKik6ID9ib29sZWFuIHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5fY29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgICAgLy8gUmV2ZXJ0IGFueSBzY3JvbGwgd2hpY2ggd291bGQgbW92ZSB0aGUgY2FudmFzIG91dHNpZGUgb2YgdGhlIHZpZXdcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnNjcm9sbFRvcCA9IDA7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7TGlmZWN5Y2xlfSAqL1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgaXMgZnVsbHkgbG9hZGVkLlxuICAgICAqXG4gICAgICogUmV0dXJucyBgZmFsc2VgIGlmIHRoZSBzdHlsZSBpcyBub3QgeWV0IGZ1bGx5IGxvYWRlZCxcbiAgICAgKiBvciBpZiB0aGVyZSBoYXMgYmVlbiBhIGNoYW5nZSB0byB0aGUgc291cmNlcyBvciBzdHlsZSB0aGF0XG4gICAgICogaGFzIG5vdCB5ZXQgZnVsbHkgbG9hZGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IEEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCBpcyBmdWxseSBsb2FkZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBpc0xvYWRlZCA9IG1hcC5sb2FkZWQoKTtcbiAgICAgKi9cbiAgICBsb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fc3R5bGVEaXJ0eSAmJiAhdGhpcy5fc291cmNlc0RpcnR5ICYmICEhdGhpcy5zdHlsZSAmJiB0aGlzLnN0eWxlLmxvYWRlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGlzIG1hcCdzIHN0eWxlIGFuZCBzb3VyY2VzLCBhbmQgcmUtcmVuZGVyIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVwZGF0ZVN0eWxlIG1hcmsgdGhlIG1hcCdzIHN0eWxlIGZvciByZXByb2Nlc3NpbmcgYXNcbiAgICAgKiB3ZWxsIGFzIGl0cyBzb3VyY2VzXG4gICAgICogQHJldHVybnMge01hcH0gdGhpc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VwZGF0ZSh1cGRhdGVTdHlsZT86IGJvb2xlYW4pOiB0aGlzIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0eWxlKSByZXR1cm4gdGhpcztcblxuICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gdGhpcy5fc3R5bGVEaXJ0eSB8fCB1cGRhdGVTdHlsZTtcbiAgICAgICAgdGhpcy5fc291cmNlc0RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cmlnZ2VyUmVwYWludCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgZ2l2ZW4gY2FsbGJhY2sgYmUgZXhlY3V0ZWQgZHVyaW5nIHRoZSBuZXh0IHJlbmRlclxuICAgICAqIGZyYW1lLiAgU2NoZWR1bGUgYSByZW5kZXIgZnJhbWUgaWYgb25lIGlzIG5vdCBhbHJlYWR5IHNjaGVkdWxlZC5cbiAgICAgKiBAcmV0dXJucyBBbiBpZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNhbmNlbCB0aGUgY2FsbGJhY2tcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9yZXF1ZXN0UmVuZGVyRnJhbWUoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiBUYXNrSUQge1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5hZGQoY2FsbGJhY2spO1xuICAgIH1cblxuICAgIF9jYW5jZWxSZW5kZXJGcmFtZShpZDogVGFza0lEKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5yZW1vdmUoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgdGhhdCB0aGUgZ2l2ZW4gY2FsbGJhY2sgYmUgZXhlY3V0ZWQgZHVyaW5nIHRoZSBuZXh0IHJlbmRlciBmcmFtZSBpZiB0aGUgbWFwIGlzIG5vdFxuICAgICAqIGlkbGUuIE90aGVyd2lzZSBpdCBpcyBleGVjdXRlZCBpbW1lZGlhdGVseSwgdG8gYXZvaWQgdHJpZ2dlcmluZyBhIG5ldyByZW5kZXIuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcmVxdWVzdERvbVRhc2soY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAgICAgICAgLy8gVGhpcyBjb25kaXRpb24gbWVhbnMgdGhhdCB0aGUgbWFwIGlzIGlkbGU6IHRoZSBjYWxsYmFjayBuZWVkcyB0byBiZSBjYWxsZWQgcmlnaHQgbm93IGFzXG4gICAgICAgIC8vIHRoZXJlIHdvbid0IGJlIGEgdHJpZ2dlcmVkIHJlbmRlciB0byBydW4gdGhlIHF1ZXVlLlxuICAgICAgICBpZiAoIXRoaXMubG9hZGVkKCkgfHwgKHRoaXMubG9hZGVkKCkgJiYgIXRoaXMuaXNNb3ZpbmcoKSkpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9kb21SZW5kZXJUYXNrUXVldWUuYWRkKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGwgd2hlbiBhIChyZS0pcmVuZGVyIG9mIHRoZSBtYXAgaXMgcmVxdWlyZWQ6XG4gICAgICogLSBUaGUgc3R5bGUgaGFzIGNoYW5nZWQgKGBzZXRQYWludFByb3BlcnR5KClgLCBldGMuKVxuICAgICAqIC0gU291cmNlIGRhdGEgaGFzIGNoYW5nZWQgKGZvciBleGFtcGxlLCB0aWxlcyBoYXZlIGZpbmlzaGVkIGxvYWRpbmcpXG4gICAgICogLSBUaGUgbWFwIGhhcyBpcyBtb3ZpbmcgKG9yIGp1c3QgZmluaXNoZWQgbW92aW5nKVxuICAgICAqIC0gQSB0cmFuc2l0aW9uIGlzIGluIHByb2dyZXNzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFpbnRTdGFydFRpbWVTdGFtcCAgVGhlIHRpbWUgd2hlbiB0aGUgYW5pbWF0aW9uIGZyYW1lIGJlZ2FuIGV4ZWN1dGluZy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtNYXB9IHRoaXNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9yZW5kZXIocGFpbnRTdGFydFRpbWVTdGFtcDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IG0gPSBQZXJmb3JtYW5jZVV0aWxzLmJlZ2luTWVhc3VyZSgncmVuZGVyJyk7XG5cbiAgICAgICAgbGV0IGdwdVRpbWVyO1xuICAgICAgICBjb25zdCBleHRUaW1lclF1ZXJ5ID0gdGhpcy5wYWludGVyLmNvbnRleHQuZXh0VGltZXJRdWVyeTtcbiAgICAgICAgY29uc3QgZnJhbWVTdGFydFRpbWUgPSBicm93c2VyLm5vdygpO1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5zKCdncHUtdGltaW5nLWZyYW1lJykpIHtcbiAgICAgICAgICAgIGdwdVRpbWVyID0gZXh0VGltZXJRdWVyeS5jcmVhdGVRdWVyeUVYVCgpO1xuICAgICAgICAgICAgZXh0VGltZXJRdWVyeS5iZWdpblF1ZXJ5RVhUKGV4dFRpbWVyUXVlcnkuVElNRV9FTEFQU0VEX0VYVCwgZ3B1VGltZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBjdXN0b20gbGF5ZXIgbWF5IGhhdmUgdXNlZCB0aGUgY29udGV4dCBhc3luY2hyb25vdXNseS4gTWFyayB0aGUgc3RhdGUgYXMgZGlydHkuXG4gICAgICAgIHRoaXMucGFpbnRlci5jb250ZXh0LnNldERpcnR5KCk7XG4gICAgICAgIHRoaXMucGFpbnRlci5zZXRCYXNlU3RhdGUoKTtcblxuICAgICAgICB0aGlzLl9yZW5kZXJUYXNrUXVldWUucnVuKHBhaW50U3RhcnRUaW1lU3RhbXApO1xuICAgICAgICB0aGlzLl9kb21SZW5kZXJUYXNrUXVldWUucnVuKHBhaW50U3RhcnRUaW1lU3RhbXApO1xuICAgICAgICAvLyBBIHRhc2sgcXVldWUgY2FsbGJhY2sgbWF5IGhhdmUgZmlyZWQgYSB1c2VyIGV2ZW50IHdoaWNoIG1heSBoYXZlIHJlbW92ZWQgdGhlIG1hcFxuICAgICAgICBpZiAodGhpcy5fcmVtb3ZlZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEluIGdsb2JlIHZpZXcsIGNoYW5nZSB0by9mcm9tIE1lcmNhdG9yIHdoZW4gem9vbSB0aHJlc2hvbGQgaXMgY3Jvc3NlZC5cbiAgICAgICAgaWYgKHRoaXMuZ2V0UHJvamVjdGlvbigpLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybS56b29tID49IEdMT0JFX1pPT01fVEhSRVNIT0xEX01BWCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybS5wcm9qZWN0aW9uLm5hbWUgPT09ICdnbG9iZScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJvamVjdGlvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2Zvcm0ucHJvamVjdGlvbi5uYW1lID09PSAnbWVyY2F0b3InKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJvamVjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNyb3NzRmFkaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGZhZGVEdXJhdGlvbiA9IHRoaXMuX2lzSW5pdGlhbExvYWQgPyAwIDogdGhpcy5fZmFkZUR1cmF0aW9uO1xuXG4gICAgICAgIC8vIElmIHRoZSBzdHlsZSBoYXMgY2hhbmdlZCwgdGhlIG1hcCBpcyBiZWluZyB6b29tZWQsIG9yIGEgdHJhbnNpdGlvbiBvciBmYWRlIGlzIGluIHByb2dyZXNzOlxuICAgICAgICAvLyAgLSBBcHBseSBzdHlsZSBjaGFuZ2VzIChpbiBhIGJhdGNoKVxuICAgICAgICAvLyAgLSBSZWNhbGN1bGF0ZSBwYWludCBwcm9wZXJ0aWVzLlxuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiB0aGlzLl9zdHlsZURpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IHpvb20gPSB0aGlzLnRyYW5zZm9ybS56b29tO1xuICAgICAgICAgICAgY29uc3QgcGl0Y2ggPSB0aGlzLnRyYW5zZm9ybS5waXRjaDtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IGJyb3dzZXIubm93KCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLnpvb21IaXN0b3J5LnVwZGF0ZSh6b29tLCBub3cpO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gbmV3IEV2YWx1YXRpb25QYXJhbWV0ZXJzKHpvb20sIHtcbiAgICAgICAgICAgICAgICBub3csXG4gICAgICAgICAgICAgICAgZmFkZUR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIHBpdGNoLFxuICAgICAgICAgICAgICAgIHpvb21IaXN0b3J5OiB0aGlzLnN0eWxlLnpvb21IaXN0b3J5LFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMuc3R5bGUuZ2V0VHJhbnNpdGlvbigpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZmFjdG9yID0gcGFyYW1ldGVycy5jcm9zc0ZhZGluZ0ZhY3RvcigpO1xuICAgICAgICAgICAgaWYgKGZhY3RvciAhPT0gMSB8fCBmYWN0b3IgIT09IHRoaXMuX2Nyb3NzRmFkaW5nRmFjdG9yKSB7XG4gICAgICAgICAgICAgICAgY3Jvc3NGYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nyb3NzRmFkaW5nRmFjdG9yID0gZmFjdG9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnN0eWxlLnVwZGF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvZ0lzVHJhbnNpdGlvbmluZyA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5mb2cgJiYgdGhpcy5zdHlsZS5mb2cuaGFzVHJhbnNpdGlvbigpO1xuXG4gICAgICAgIGlmIChmb2dJc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX21hcmtlcnNOZWVkVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNEaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gX3JlbmRlciBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGluLXByb2dyZXNzIHBhaW50XG4gICAgICAgIC8vIHRyYW5zaXRpb24sIHVwZGF0ZSBzb3VyY2UgY2FjaGVzIHRvIGNoZWNrIGZvciBhbmQgbG9hZCBhbnkgdGlsZXMgd2VcbiAgICAgICAgLy8gbmVlZCBmb3IgdGhlIGN1cnJlbnQgdHJhbnNmb3JtXG4gICAgICAgIGxldCBhdmVyYWdlRWxldmF0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiB0aGlzLl9zb3VyY2VzRGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5wYWludGVyLl91cGRhdGVGb2codGhpcy5zdHlsZSk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVUZXJyYWluKCk7IC8vIFRlcnJhaW4gREVNIHNvdXJjZSB1cGRhdGVzIGhlcmUgYW5kIHNraXBzIHVwZGF0ZSBpbiBzdHlsZS5fdXBkYXRlU291cmNlcy5cbiAgICAgICAgICAgIGF2ZXJhZ2VFbGV2YXRpb25DaGFuZ2VkID0gdGhpcy5fdXBkYXRlQXZlcmFnZUVsZXZhdGlvbihmcmFtZVN0YXJ0VGltZSk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLl91cGRhdGVTb3VyY2VzKHRoaXMudHJhbnNmb3JtKTtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBwb3NpdGlvbnMgb2YgbWFya2VycyBvbiBlbmFibGluZy9kaXNhYmxpbmcgdGVycmFpblxuICAgICAgICAgICAgdGhpcy5fZm9yY2VNYXJrZXJVcGRhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF2ZXJhZ2VFbGV2YXRpb25DaGFuZ2VkID0gdGhpcy5fdXBkYXRlQXZlcmFnZUVsZXZhdGlvbihmcmFtZVN0YXJ0VGltZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wbGFjZW1lbnREaXJ0eSA9IHRoaXMuc3R5bGUgJiYgdGhpcy5zdHlsZS5fdXBkYXRlUGxhY2VtZW50KHRoaXMucGFpbnRlci50cmFuc2Zvcm0sIHRoaXMuc2hvd0NvbGxpc2lvbkJveGVzLCBmYWRlRHVyYXRpb24sIHRoaXMuX2Nyb3NzU291cmNlQ29sbGlzaW9ucyk7XG5cbiAgICAgICAgLy8gQWN0dWFsbHkgZHJhd1xuICAgICAgICBpZiAodGhpcy5zdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5wYWludGVyLnJlbmRlcih0aGlzLnN0eWxlLCB7XG4gICAgICAgICAgICAgICAgc2hvd1RpbGVCb3VuZGFyaWVzOiB0aGlzLnNob3dUaWxlQm91bmRhcmllcyxcbiAgICAgICAgICAgICAgICBzaG93VGVycmFpbldpcmVmcmFtZTogdGhpcy5zaG93VGVycmFpbldpcmVmcmFtZSxcbiAgICAgICAgICAgICAgICBzaG93T3ZlcmRyYXdJbnNwZWN0b3I6IHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvcixcbiAgICAgICAgICAgICAgICBzaG93UXVlcnlHZW9tZXRyeTogISF0aGlzLl9zaG93UXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICByb3RhdGluZzogdGhpcy5pc1JvdGF0aW5nKCksXG4gICAgICAgICAgICAgICAgem9vbWluZzogdGhpcy5pc1pvb21pbmcoKSxcbiAgICAgICAgICAgICAgICBtb3Zpbmc6IHRoaXMuaXNNb3ZpbmcoKSxcbiAgICAgICAgICAgICAgICBmYWRlRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgaXNJbml0aWFsTG9hZDogdGhpcy5faXNJbml0aWFsTG9hZCxcbiAgICAgICAgICAgICAgICBzaG93UGFkZGluZzogdGhpcy5zaG93UGFkZGluZyxcbiAgICAgICAgICAgICAgICBncHVUaW1pbmc6ICEhdGhpcy5saXN0ZW5zKCdncHUtdGltaW5nLWxheWVyJyksXG4gICAgICAgICAgICAgICAgZ3B1VGltaW5nRGVmZXJyZWRSZW5kZXI6ICEhdGhpcy5saXN0ZW5zKCdncHUtdGltaW5nLWRlZmVycmVkLXJlbmRlcicpLFxuICAgICAgICAgICAgICAgIHNwZWVkSW5kZXhUaW1pbmc6IHRoaXMuc3BlZWRJbmRleFRpbWluZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgncmVuZGVyJykpO1xuXG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCgpICYmICF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLm1hcmsoUGVyZm9ybWFuY2VNYXJrZXJzLmxvYWQpO1xuICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnbG9hZCcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICh0aGlzLnN0eWxlLmhhc1RyYW5zaXRpb25zKCkgfHwgY3Jvc3NGYWRpbmcpKSB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICF0aGlzLl9wbGFjZW1lbnREaXJ0eSkge1xuICAgICAgICAgICAgLy8gU2luY2Ugbm8gZmFkZSBvcGVyYXRpb25zIGFyZSBpbiBwcm9ncmVzcywgd2UgY2FuIHJlbGVhc2VcbiAgICAgICAgICAgIC8vIGFsbCB0aWxlcyBoZWxkIGZvciBmYWRpbmcuIElmIHdlIGRpZG4ndCBkbyB0aGlzLCB0aGUgdGlsZXNcbiAgICAgICAgICAgIC8vIHdvdWxkIGp1c3Qgc2l0IGluIHRoZSBTb3VyY2VDYWNoZXMgdW50aWwgdGhlIG5leHQgcmVuZGVyXG4gICAgICAgICAgICB0aGlzLnN0eWxlLl9yZWxlYXNlU3ltYm9sRmFkZVRpbGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ3B1VGltZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckNQVVRpbWUgPSBicm93c2VyLm5vdygpIC0gZnJhbWVTdGFydFRpbWU7XG4gICAgICAgICAgICBleHRUaW1lclF1ZXJ5LmVuZFF1ZXJ5RVhUKGV4dFRpbWVyUXVlcnkuVElNRV9FTEFQU0VEX0VYVCwgZ3B1VGltZXIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyR1BVVGltZSA9IGV4dFRpbWVyUXVlcnkuZ2V0UXVlcnlPYmplY3RFWFQoZ3B1VGltZXIsIGV4dFRpbWVyUXVlcnkuUVVFUllfUkVTVUxUX0VYVCkgLyAoMTAwMCAqIDEwMDApO1xuICAgICAgICAgICAgICAgIGV4dFRpbWVyUXVlcnkuZGVsZXRlUXVlcnlFWFQoZ3B1VGltZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2dwdS10aW1pbmctZnJhbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgIGNwdVRpbWU6IHJlbmRlckNQVVRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGdwdVRpbWU6IHJlbmRlckdQVVRpbWVcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgd2luZG93LnBlcmZvcm1hbmNlLm1hcmsoJ2ZyYW1lLWdwdScsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiBmcmFtZVN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBncHVUaW1lOiByZW5kZXJHUFVUaW1lXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDUwKTsgLy8gV2FpdCA1MG1zIHRvIGdpdmUgdGltZSBmb3IgYWxsIEdQVSBjYWxscyB0byBmaW5pc2ggYmVmb3JlIHF1ZXJ5aW5nXG4gICAgICAgIH1cblxuICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLmVuZE1lYXN1cmUobSk7XG5cbiAgICAgICAgaWYgKHRoaXMubGlzdGVucygnZ3B1LXRpbWluZy1sYXllcicpKSB7XG4gICAgICAgICAgICAvLyBSZXNldHRpbmcgdGhlIFBhaW50ZXIncyBwZXItbGF5ZXIgdGltaW5nIHF1ZXJpZXMgaGVyZSBhbGxvd3MgdXMgdG8gaXNvbGF0ZVxuICAgICAgICAgICAgLy8gdGhlIHF1ZXJpZXMgdG8gaW5kaXZpZHVhbCBmcmFtZXMuXG4gICAgICAgICAgICBjb25zdCBmcmFtZUxheWVyUXVlcmllcyA9IHRoaXMucGFpbnRlci5jb2xsZWN0R3B1VGltZXJzKCk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkTGF5ZXJUaW1lcyA9IHRoaXMucGFpbnRlci5xdWVyeUdwdVRpbWVycyhmcmFtZUxheWVyUXVlcmllcyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdncHUtdGltaW5nLWxheWVyJywge1xuICAgICAgICAgICAgICAgICAgICBsYXllclRpbWVzOiByZW5kZXJlZExheWVyVGltZXNcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9LCA1MCk7IC8vIFdhaXQgNTBtcyB0byBnaXZlIHRpbWUgZm9yIGFsbCBHUFUgY2FsbHMgdG8gZmluaXNoIGJlZm9yZSBxdWVyeWluZ1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubGlzdGVucygnZ3B1LXRpbWluZy1kZWZlcnJlZC1yZW5kZXInKSkge1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWRSZW5kZXJRdWVyaWVzID0gdGhpcy5wYWludGVyLmNvbGxlY3REZWZlcnJlZFJlbmRlckdwdVF1ZXJpZXMoKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3B1VGltZSA9IHRoaXMucGFpbnRlci5xdWVyeUdwdVRpbWVEZWZlcnJlZFJlbmRlcihkZWZlcnJlZFJlbmRlclF1ZXJpZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2dwdS10aW1pbmctZGVmZXJyZWQtcmVuZGVyJywge2dwdVRpbWV9KSk7XG4gICAgICAgICAgICB9LCA1MCk7IC8vIFdhaXQgNTBtcyB0byBnaXZlIHRpbWUgZm9yIGFsbCBHUFUgY2FsbHMgdG8gZmluaXNoIGJlZm9yZSBxdWVyeWluZ1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2NoZWR1bGUgYW5vdGhlciByZW5kZXIgZnJhbWUgaWYgaXQncyBuZWVkZWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEV2ZW4gdGhvdWdoIGBfc3R5bGVEaXJ0eWAgYW5kIGBfc291cmNlc0RpcnR5YCBhcmUgcmVzZXQgaW4gdGhpc1xuICAgICAgICAvLyBtZXRob2QsIHN5bmNocm9ub3VzIGV2ZW50cyBmaXJlZCBkdXJpbmcgU3R5bGUjdXBkYXRlIG9yXG4gICAgICAgIC8vIFN0eWxlI191cGRhdGVTb3VyY2VzIGNvdWxkIGhhdmUgY2F1c2VkIHRoZW0gdG8gYmUgc2V0IGFnYWluLlxuICAgICAgICBjb25zdCBzb21ldGhpbmdEaXJ0eSA9IHRoaXMuX3NvdXJjZXNEaXJ0eSB8fCB0aGlzLl9zdHlsZURpcnR5IHx8IHRoaXMuX3BsYWNlbWVudERpcnR5IHx8IGF2ZXJhZ2VFbGV2YXRpb25DaGFuZ2VkO1xuICAgICAgICBpZiAoc29tZXRoaW5nRGlydHkgfHwgdGhpcy5fcmVwYWludCkge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2lsbElkbGUgPSAhdGhpcy5pc01vdmluZygpICYmIHRoaXMubG9hZGVkKCk7XG4gICAgICAgICAgICBpZiAod2lsbElkbGUpIHtcbiAgICAgICAgICAgICAgICAvLyBCZWZvcmUgaWRsaW5nLCB3ZSBwZXJmb3JtIG9uZSBsYXN0IHNhbXBsZSBzbyB0aGF0IGlmIHRoZSBhdmVyYWdlIGVsZXZhdGlvblxuICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IGV4YWN0bHkgbWF0Y2ggdGhlIHRlcnJhaW4sIHdlIHNraXAgaWRsZSBhbmQgZWFzZSBpdCB0byBpdHMgZmluYWwgc3RhdGUuXG4gICAgICAgICAgICAgICAgYXZlcmFnZUVsZXZhdGlvbkNoYW5nZWQgPSB0aGlzLl91cGRhdGVBdmVyYWdlRWxldmF0aW9uKGZyYW1lU3RhcnRUaW1lLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGF2ZXJhZ2VFbGV2YXRpb25DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyRnJhbWUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICh3aWxsSWRsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdpZGxlJykpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxMb2FkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBvcHRpb25zIHRvIHNlZSBpZiBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgc3BlZWQgaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3BlZWRJbmRleFRpbWluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BlZWRJbmRleE51bWJlciA9IHRoaXMuX2NhbGN1bGF0ZVNwZWVkSW5kZXgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3NwZWVkaW5kZXhjb21wbGV0ZWQnLCB7c3BlZWRJbmRleDogc3BlZWRJbmRleE51bWJlcn0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlZWRJbmRleFRpbWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2xvYWRlZCAmJiAhdGhpcy5fZnVsbHlMb2FkZWQgJiYgIXNvbWV0aGluZ0RpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9mdWxseUxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBGb2xsb3dpbmcgbGluZSBpcyBiaWxsaW5nIHJlbGF0ZWQgY29kZS4gRG8gbm90IGNoYW5nZS4gU2VlIExJQ0VOU0UudHh0XG4gICAgICAgICAgICB0aGlzLl9hdXRoZW50aWNhdGUoKTtcbiAgICAgICAgICAgIFBlcmZvcm1hbmNlVXRpbHMubWFyayhQZXJmb3JtYW5jZU1hcmtlcnMuZnVsbExvYWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2ZvcmNlTWFya2VyVXBkYXRlKCkge1xuICAgICAgICBmb3IgKGNvbnN0IG1hcmtlciBvZiB0aGlzLl9tYXJrZXJzKSB7XG4gICAgICAgICAgICBtYXJrZXIuX3VwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBhdmVyYWdlIHZpc2libGUgZWxldmF0aW9uIGJ5IHNhbXBsaW5nIHRlcnJhaW5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGVsZXZhdGlvbiBoYXMgY2hhbmdlZCBmcm9tIHRoZSBsYXN0IHNhbXBsaW5nXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfdXBkYXRlQXZlcmFnZUVsZXZhdGlvbih0aW1lU3RhbXA6IG51bWJlciwgaWdub3JlVGltZW91dDogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGFwcGx5VXBkYXRlID0gdmFsdWUgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uYXZlcmFnZUVsZXZhdGlvbiA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghdGhpcy5wYWludGVyLmF2ZXJhZ2VFbGV2YXRpb25OZWVkc0Vhc2luZygpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0uYXZlcmFnZUVsZXZhdGlvbiAhPT0gMCkgcmV0dXJuIGFwcGx5VXBkYXRlKDApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZW91dEVsYXBzZWQgPSBpZ25vcmVUaW1lb3V0IHx8IHRpbWVTdGFtcCAtIHRoaXMuX2F2ZXJhZ2VFbGV2YXRpb25MYXN0U2FtcGxlZEF0ID4gQVZFUkFHRV9FTEVWQVRJT05fU0FNUExJTkdfSU5URVJWQUw7XG5cbiAgICAgICAgaWYgKHRpbWVvdXRFbGFwc2VkICYmICF0aGlzLl9hdmVyYWdlRWxldmF0aW9uLmlzRWFzaW5nKHRpbWVTdGFtcCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGV2YXRpb24gPSB0aGlzLnRyYW5zZm9ybS5hdmVyYWdlRWxldmF0aW9uO1xuICAgICAgICAgICAgbGV0IG5ld0VsZXZhdGlvbiA9IHRoaXMudHJhbnNmb3JtLnNhbXBsZUF2ZXJhZ2VFbGV2YXRpb24oKTtcbiAgICAgICAgICAgIGxldCBleGFnZ2VyYXRpb25DaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0uZWxldmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgZXhhZ2dlcmF0aW9uQ2hhbmdlZCA9IHRoaXMudHJhbnNmb3JtLmVsZXZhdGlvbi5leGFnZ2VyYXRpb24oKSAhPT0gdGhpcy5fYXZlcmFnZUVsZXZhdGlvbkV4YWdnZXJhdGlvbjtcbiAgICAgICAgICAgICAgICAvLyAkRmxvd0lnbm9yZVtpbmNvbXBhdGlibGUtdXNlXVxuICAgICAgICAgICAgICAgIHRoaXMuX2F2ZXJhZ2VFbGV2YXRpb25FeGFnZ2VyYXRpb24gPSB0aGlzLnRyYW5zZm9ybS5lbGV2YXRpb24uZXhhZ2dlcmF0aW9uKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE5ldyBlbGV2YXRpb24gaXMgTmFOIGlmIG5vIHRlcnJhaW4gdGlsZXMgd2VyZSBhdmFpbGFibGVcbiAgICAgICAgICAgIGlmIChpc05hTihuZXdFbGV2YXRpb24pKSB7XG4gICAgICAgICAgICAgICAgbmV3RWxldmF0aW9uID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWN0aXZhdGUgdGhlIHRpbWVvdXQgaWYgbm8gZGF0YSB3YXMgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgdGhpcy5fYXZlcmFnZUVsZXZhdGlvbkxhc3RTYW1wbGVkQXQgPSB0aW1lU3RhbXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbGV2YXRpb25DaGFuZ2UgPSBNYXRoLmFicyhjdXJyZW50RWxldmF0aW9uIC0gbmV3RWxldmF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGVsZXZhdGlvbkNoYW5nZSA+IEFWRVJBR0VfRUxFVkFUSU9OX0VBU0VfVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbExvYWQgfHwgZXhhZ2dlcmF0aW9uQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdmVyYWdlRWxldmF0aW9uLmp1bXBUbyhuZXdFbGV2YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHlVcGRhdGUobmV3RWxldmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdmVyYWdlRWxldmF0aW9uLmVhc2VUbyhuZXdFbGV2YXRpb24sIHRpbWVTdGFtcCwgQVZFUkFHRV9FTEVWQVRJT05fRUFTRV9USU1FKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZXZhdGlvbkNoYW5nZSA+IEFWRVJBR0VfRUxFVkFUSU9OX0NIQU5HRV9USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hdmVyYWdlRWxldmF0aW9uLmp1bXBUbyhuZXdFbGV2YXRpb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiBhcHBseVVwZGF0ZShuZXdFbGV2YXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2F2ZXJhZ2VFbGV2YXRpb24uaXNFYXNpbmcodGltZVN0YW1wKSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcGx5VXBkYXRlKHRoaXMuX2F2ZXJhZ2VFbGV2YXRpb24uZ2V0VmFsdWUodGltZVN0YW1wKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqKioqIFNUQVJUIFdBUk5JTkcgLSBSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSEVcbiAgICAqIEZPTExPV0lORyBDT0RFIFZJT0xBVEVTIFRIRSBNQVBCT1ggVEVSTVMgT0YgU0VSVklDRSAgKioqKioqXG4gICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCB0byBhY2Nlc3MgTWFwYm94J3MgQVBJcy4gUmVtb3ZhbCBvciBtb2RpZmljYXRpb25cbiAgICAqIG9mIHRoaXMgY29kZSBjYW4gcmVzdWx0IGluIGhpZ2hlciBmZWVzIGFuZC9vclxuICAgICogdGVybWluYXRpb24gb2YgeW91ciBhY2NvdW50IHdpdGggTWFwYm94LlxuICAgICpcbiAgICAqIFVuZGVyIHRoZSBNYXBib3ggVGVybXMgb2YgU2VydmljZSwgeW91IG1heSBub3QgdXNlIHRoaXMgY29kZSB0byBhY2Nlc3MgTWFwYm94XG4gICAgKiBNYXBwaW5nIEFQSXMgb3RoZXIgdGhhbiB0aHJvdWdoIE1hcGJveCBTREtzLlxuICAgICpcbiAgICAqIFRoZSBNYXBwaW5nIEFQSXMgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vYXBpL21hcHMvI21hcHNcbiAgICAqIGFuZCB0aGUgTWFwYm94IFRlcm1zIG9mIFNlcnZpY2UgYXJlIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5tYXBib3guY29tL3Rvcy9cbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICBfYXV0aGVudGljYXRlKCkge1xuICAgICAgICBnZXRNYXBTZXNzaW9uQVBJKHRoaXMuX2dldE1hcElkKCksIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLl9za3VUb2tlbiwgdGhpcy5fcmVxdWVzdE1hbmFnZXIuX2N1c3RvbUFjY2Vzc1Rva2VuLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhyb3dpbmcgYW4gZXJyb3IgaGVyZSB3aWxsIGNhdXNlIHRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgYWdhaW4gdW5uZWNlc3NhcmlseVxuICAgICAgICAgICAgICAgIGlmIChlcnIubWVzc2FnZSA9PT0gQVVUSF9FUlJfTVNHIHx8IChlcnI6IGFueSkuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2wgPSB0aGlzLnBhaW50ZXIuY29udGV4dC5nbDtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVBdXRoU3RhdGUoZ2wsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xvZ29Db250cm9sIGluc3RhbmNlb2YgTG9nb0NvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvZ29Db250cm9sLl91cGRhdGVMb2dvKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGdsKSBnbC5jbGVhcihnbC5ERVBUSF9CVUZGRVJfQklUIHwgZ2wuQ09MT1JfQlVGRkVSX0JJVCB8IGdsLlNURU5DSUxfQlVGRkVSX0JJVCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zaWxlbmNlQXV0aEVycm9ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFcnJvckV2ZW50KG5ldyBFcnJvcignQSB2YWxpZCBNYXBib3ggYWNjZXNzIHRva2VuIGlzIHJlcXVpcmVkIHRvIHVzZSBNYXBib3ggR0wgSlMuIFRvIGNyZWF0ZSBhbiBhY2NvdW50IG9yIGEgbmV3IGFjY2VzcyB0b2tlbiwgdmlzaXQgaHR0cHM6Ly9hY2NvdW50Lm1hcGJveC5jb20vJykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBvc3RNYXBMb2FkRXZlbnQodGhpcy5fZ2V0TWFwSWQoKSwgdGhpcy5fcmVxdWVzdE1hbmFnZXIuX3NrdVRva2VuLCB0aGlzLl9yZXF1ZXN0TWFuYWdlci5fY3VzdG9tQWNjZXNzVG9rZW4sICgpID0+IHt9KTtcbiAgICB9XG5cbiAgICAvKioqKiogRU5EIFdBUk5JTkcgLSBSRU1PVkFMIE9SIE1PRElGSUNBVElPTiBPRiBUSEVcbiAgICBQUkVDRURJTkcgQ09ERSBWSU9MQVRFUyBUSEUgTUFQQk9YIFRFUk1TIE9GIFNFUlZJQ0UgICoqKioqKi9cblxuICAgIF91cGRhdGVUZXJyYWluKCkge1xuICAgICAgICAvLyBSZWNhbGN1bGF0ZSBpZiBlbmFibGVkL2Rpc2FibGVkIGFuZCBjYWxjdWxhdGUgZWxldmF0aW9uIGNvdmVyLiBBcyBjYW1lcmEgaXMgdXNpbmcgZWxldmF0aW9uIHRpbGVzIGJlZm9yZVxuICAgICAgICAvLyByZW5kZXIgKGFuZCBkZWZlcnJlZCB1cGRhdGUgYWZ0ZXIgem9vbSByZWNhbGN1bGF0aW9uKSwgdGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgd2hlbiByZW1vdmluZyB0ZXJyYWluIHNvdXJjZS5cbiAgICAgICAgdGhpcy5wYWludGVyLnVwZGF0ZVRlcnJhaW4odGhpcy5zdHlsZSwgdGhpcy5pc01vdmluZygpIHx8IHRoaXMuaXNSb3RhdGluZygpIHx8IHRoaXMuaXNab29taW5nKCkpO1xuICAgIH1cblxuICAgIF9jYWxjdWxhdGVTcGVlZEluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGZpbmFsRnJhbWUgPSB0aGlzLnBhaW50ZXIuY2FudmFzQ29weSgpO1xuICAgICAgICBjb25zdCBjYW52YXNDb3B5SW5zdGFuY2VzID0gdGhpcy5wYWludGVyLmdldENhbnZhc0NvcGllc0FuZFRpbWVzdGFtcHMoKTtcbiAgICAgICAgY2FudmFzQ29weUluc3RhbmNlcy50aW1lU3RhbXBzLnB1c2gocGVyZm9ybWFuY2Uubm93KCkpO1xuXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5wYWludGVyLmNvbnRleHQuZ2w7XG4gICAgICAgIGNvbnN0IGZyYW1lYnVmZmVyID0gZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgICAgICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlcik7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVhZCh0ZXh0dXJlKSB7XG4gICAgICAgICAgICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUsIDApO1xuICAgICAgICAgICAgY29uc3QgcGl4ZWxzID0gbmV3IFVpbnQ4QXJyYXkoZ2wuZHJhd2luZ0J1ZmZlcldpZHRoICogZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCAqIDQpO1xuICAgICAgICAgICAgZ2wucmVhZFBpeGVscygwLCAwLCBnbC5kcmF3aW5nQnVmZmVyV2lkdGgsIGdsLmRyYXdpbmdCdWZmZXJIZWlnaHQsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHBpeGVscyk7XG4gICAgICAgICAgICByZXR1cm4gcGl4ZWxzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhc1BpeGVsQ29tcGFyaXNvbihyZWFkKGZpbmFsRnJhbWUpLCBjYW52YXNDb3B5SW5zdGFuY2VzLmNhbnZhc0NvcGllcy5tYXAocmVhZCksIGNhbnZhc0NvcHlJbnN0YW5jZXMudGltZVN0YW1wcyk7XG4gICAgfVxuXG4gICAgX2NhbnZhc1BpeGVsQ29tcGFyaXNvbihmaW5hbEZyYW1lOiBVaW50OEFycmF5LCBhbGxGcmFtZXM6IFVpbnQ4QXJyYXlbXSwgdGltZVN0YW1wczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgICAgICBsZXQgZmluYWxTY29yZSA9IHRpbWVTdGFtcHNbMV0gLSB0aW1lU3RhbXBzWzBdO1xuICAgICAgICBjb25zdCBudW1QaXhlbHMgPSBmaW5hbEZyYW1lLmxlbmd0aCAvIDQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxGcmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZyYW1lID0gYWxsRnJhbWVzW2ldO1xuICAgICAgICAgICAgbGV0IGNudCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGZyYW1lLmxlbmd0aDsgaiArPSA0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lW2pdID09PSBmaW5hbEZyYW1lW2pdICYmXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lW2ogKyAxXSA9PT0gZmluYWxGcmFtZVtqICsgMV0gJiZcbiAgICAgICAgICAgICAgICAgICAgZnJhbWVbaiArIDJdID09PSBmaW5hbEZyYW1lW2ogKyAyXSAmJlxuICAgICAgICAgICAgICAgICAgICBmcmFtZVtqICsgM10gPT09IGZpbmFsRnJhbWVbaiArIDNdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNudCA9IGNudCArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9jYWxjdWxhdGUgdGhlICUgdmlzdWFsIGNvbXBsZXRlbmVzc1xuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSB0aW1lU3RhbXBzW2kgKyAyXSAtIHRpbWVTdGFtcHNbaSArIDFdO1xuICAgICAgICAgICAgY29uc3QgdmlzdWFsQ29tcGxldG5lc3MgPSBjbnQgLyBudW1QaXhlbHM7XG4gICAgICAgICAgICBmaW5hbFNjb3JlICs9ICBpbnRlcnZhbCAqICgxIC0gdmlzdWFsQ29tcGxldG5lc3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbFNjb3JlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFuIHVwIGFuZCByZWxlYXNlIGFsbCBpbnRlcm5hbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFwLlxuICAgICAqXG4gICAgICogVGhpcyBpbmNsdWRlcyBET00gZWxlbWVudHMsIGV2ZW50IGJpbmRpbmdzLCB3ZWIgd29ya2VycywgYW5kIFdlYkdMIHJlc291cmNlcy5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIG1ldGhvZCB3aGVuIHlvdSBhcmUgZG9uZSB1c2luZyB0aGUgbWFwIGFuZCB3aXNoIHRvIGVuc3VyZSB0aGF0IGl0IG5vXG4gICAgICogbG9uZ2VyIGNvbnN1bWVzIGJyb3dzZXIgcmVzb3VyY2VzLiBBZnRlcndhcmRzLCB5b3UgbXVzdCBub3QgY2FsbCBhbnkgb3RoZXJcbiAgICAgKiBtZXRob2RzIG9uIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5yZW1vdmUoKTtcbiAgICAgKi9cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNoKSB0aGlzLl9oYXNoLnJlbW92ZSgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLl9jb250cm9scykgY29udHJvbC5vblJlbW92ZSh0aGlzKTtcbiAgICAgICAgdGhpcy5fY29udHJvbHMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy5fZnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lLmNhbmNlbCgpO1xuICAgICAgICAgICAgdGhpcy5fZnJhbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbmRlclRhc2tRdWV1ZS5jbGVhcigpO1xuICAgICAgICB0aGlzLl9kb21SZW5kZXJUYXNrUXVldWUuY2xlYXIoKTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFpbnRlci5kZXN0cm95KCk7XG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXJzKSB0aGlzLmhhbmRsZXJzLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShudWxsKTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9vbldpbmRvd1Jlc2l6ZSwgZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29yaWVudGF0aW9uY2hhbmdlJywgdGhpcy5fb25XaW5kb3dSZXNpemUsIGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJywgdGhpcy5fb25XaW5kb3dSZXNpemUsIGZhbHNlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbmxpbmUnLCB0aGlzLl9vbldpbmRvd09ubGluZSwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5wYWludGVyLmNvbnRleHQuZ2wuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9sb3NlX2NvbnRleHQnKTtcbiAgICAgICAgaWYgKGV4dGVuc2lvbikgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XG4gICAgICAgIHJlbW92ZU5vZGUodGhpcy5fY2FudmFzQ29udGFpbmVyKTtcbiAgICAgICAgcmVtb3ZlTm9kZSh0aGlzLl9jb250cm9sQ29udGFpbmVyKTtcbiAgICAgICAgcmVtb3ZlTm9kZSh0aGlzLl9taXNzaW5nQ1NTQ2FuYXJ5KTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLW1hcCcpO1xuXG4gICAgICAgIFBlcmZvcm1hbmNlVXRpbHMuY2xlYXJNZXRyaWNzKCk7XG4gICAgICAgIHJlbW92ZUF1dGhTdGF0ZSh0aGlzLnBhaW50ZXIuY29udGV4dC5nbCk7XG4gICAgICAgIHRoaXMuX3JlbW92ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCdyZW1vdmUnKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlciB0aGUgcmVuZGVyaW5nIG9mIGEgc2luZ2xlIGZyYW1lLiBVc2UgdGhpcyBtZXRob2Qgd2l0aCBjdXN0b20gbGF5ZXJzIHRvXG4gICAgICogcmVwYWludCB0aGUgbWFwIHdoZW4gdGhlIGxheWVyJ3MgcHJvcGVydGllcyBvciBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGVcbiAgICAgKiBsYXllcidzIHNvdXJjZSBjaGFuZ2UuIENhbGxpbmcgdGhpcyBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgdGhlXG4gICAgICogbmV4dCBmcmFtZSBpcyByZW5kZXJlZCB3aWxsIHN0aWxsIHJlc3VsdCBpbiBvbmx5IGEgc2luZ2xlIGZyYW1lIGJlaW5nIHJlbmRlcmVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAudHJpZ2dlclJlcGFpbnQoKTtcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBZGQgYSAzRCBtb2RlbF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYWRkLTNkLW1vZGVsLylcbiAgICAgKiBAc2VlIFtFeGFtcGxlOiBBZGQgYW4gYW5pbWF0ZWQgaWNvbiB0byB0aGUgbWFwXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hZGQtaW1hZ2UtYW5pbWF0ZWQvKVxuICAgICAqL1xuICAgIHRyaWdnZXJSZXBhaW50KCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyRnJhbWUodHJ1ZSk7XG4gICAgfVxuXG4gICAgX3RyaWdnZXJGcmFtZShyZW5kZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyTmV4dEZyYW1lID0gdGhpcy5fcmVuZGVyTmV4dEZyYW1lIHx8IHJlbmRlcjtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgIXRoaXMuX2ZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZSA9IGJyb3dzZXIuZnJhbWUoKHBhaW50U3RhcnRUaW1lU3RhbXA6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVuZGVyRnJhbWUgPSAhIXRoaXMuX3JlbmRlck5leHRGcmFtZTtcbiAgICAgICAgICAgICAgICBQZXJmb3JtYW5jZVV0aWxzLmZyYW1lKHBhaW50U3RhcnRUaW1lU3RhbXAsIGlzUmVuZGVyRnJhbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZyYW1lID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJOZXh0RnJhbWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChpc1JlbmRlckZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcihwYWludFN0YXJ0VGltZVN0YW1wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByZWxvYWRzIGFsbCB0aWxlcyB0aGF0IHdpbGwgYmUgcmVxdWVzdGVkIGZvciBvbmUgb3IgYSBzZXJpZXMgb2YgdHJhbnNmb3JtYXRpb25zXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYHRoaXNgIHwgUHJvbWlzZS5cbiAgICAgKi9cbiAgICBfcHJlbG9hZFRpbGVzKHRyYW5zZm9ybTogVHJhbnNmb3JtIHwgQXJyYXk8VHJhbnNmb3JtPik6IHRoaXMge1xuICAgICAgICBjb25zdCBzb3VyY2VzOiBBcnJheTxTb3VyY2VDYWNoZT4gPSB0aGlzLnN0eWxlID8gKE9iamVjdC52YWx1ZXModGhpcy5zdHlsZS5fc291cmNlQ2FjaGVzKTogYW55KSA6IFtdO1xuICAgICAgICBhc3luY0FsbChzb3VyY2VzLCAoc291cmNlLCBkb25lKSA9PiBzb3VyY2UuX3ByZWxvYWRUaWxlcyh0cmFuc2Zvcm0sIGRvbmUpLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJSZXBhaW50KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9vbldpbmRvd09ubGluZSgpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgX29uV2luZG93UmVzaXplKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5fdHJhY2tSZXNpemUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplKHtvcmlnaW5hbEV2ZW50OiBldmVudH0pLl91cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAc2VjdGlvbiB7RGVidWcgZmVhdHVyZXN9ICovXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCB3aWxsIHJlbmRlciBhbiBvdXRsaW5lXG4gICAgICogYXJvdW5kIGVhY2ggdGlsZSBhbmQgdGhlIHRpbGUgSUQuIFRoZXNlIHRpbGUgYm91bmRhcmllcyBhcmUgdXNlZnVsIGZvclxuICAgICAqIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIFRoZSB1bmNvbXByZXNzZWQgZmlsZSBzaXplIG9mIHRoZSBmaXJzdCB2ZWN0b3Igc291cmNlIGlzIGRyYXduIGluIHRoZSB0b3AgbGVmdFxuICAgICAqIGNvcm5lciBvZiBlYWNoIHRpbGUsIG5leHQgdG8gdGhlIHRpbGUgSUQuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93VGlsZUJvdW5kYXJpZXNcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2hvd1RpbGVCb3VuZGFyaWVzID0gdHJ1ZTtcbiAgICAgKi9cbiAgICBnZXQgc2hvd1RpbGVCb3VuZGFyaWVzKCk6IGJvb2xlYW4geyByZXR1cm4gISF0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXM7IH1cbiAgICBzZXQgc2hvd1RpbGVCb3VuZGFyaWVzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXMgPT09IHZhbHVlKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3Nob3dUaWxlQm91bmRhcmllcyA9IHZhbHVlO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCB3aWxsIHJlbmRlciBhIHdpcmVmcmFtZVxuICAgICAqIG9uIHRvcCBvZiB0aGUgZGlzcGxheWVkIHRlcnJhaW4uIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgICAqXG4gICAgICogVGhlIHdpcmVmcmFtZSBpcyBhbHdheXMgcmVkIGFuZCBpcyBkcmF3biBvbmx5IHdoZW4gdGVycmFpbiBpcyBhY3RpdmUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93VGVycmFpbldpcmVmcmFtZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zaG93VGVycmFpbldpcmVmcmFtZSA9IHRydWU7XG4gICAgICovXG4gICAgZ2V0IHNob3dUZXJyYWluV2lyZWZyYW1lKCk6IGJvb2xlYW4geyByZXR1cm4gISF0aGlzLl9zaG93VGVycmFpbldpcmVmcmFtZTsgfVxuICAgIHNldCBzaG93VGVycmFpbldpcmVmcmFtZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fc2hvd1RlcnJhaW5XaXJlZnJhbWUgPT09IHZhbHVlKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3Nob3dUZXJyYWluV2lyZWZyYW1lID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3BlZWRpbmRleCBtZXRyaWMgY2FsY3VsYXRpb24gaXMgb24gb3Igb2ZmXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNwZWVkSW5kZXhUaW1pbmdcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc3BlZWRJbmRleFRpbWluZyA9IHRydWU7XG4gICAgICovXG4gICAgZ2V0IHNwZWVkSW5kZXhUaW1pbmcoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3NwZWVkSW5kZXhUaW1pbmc7IH1cbiAgICBzZXQgc3BlZWRJbmRleFRpbWluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fc3BlZWRJbmRleFRpbWluZyA9PT0gdmFsdWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5fc3BlZWRJbmRleFRpbWluZyA9IHZhbHVlO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCB3aWxsIHZpc3VhbGl6ZVxuICAgICAqIHRoZSBwYWRkaW5nIG9mZnNldHMuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93UGFkZGluZ1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKi9cbiAgICBnZXQgc2hvd1BhZGRpbmcoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3Nob3dQYWRkaW5nOyB9XG4gICAgc2V0IHNob3dQYWRkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93UGFkZGluZyA9PT0gdmFsdWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5fc2hvd1BhZGRpbmcgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgd2lsbCByZW5kZXIgYm94ZXNcbiAgICAgKiBhcm91bmQgYWxsIHN5bWJvbHMgaW4gdGhlIGRhdGEgc291cmNlLCByZXZlYWxpbmcgd2hpY2ggc3ltYm9sc1xuICAgICAqIHdlcmUgcmVuZGVyZWQgb3Igd2hpY2ggd2VyZSBoaWRkZW4gZHVlIHRvIGNvbGxpc2lvbnMuXG4gICAgICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEBuYW1lIHNob3dDb2xsaXNpb25Cb3hlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKi9cbiAgICBnZXQgc2hvd0NvbGxpc2lvbkJveGVzKCk6IGJvb2xlYW4geyByZXR1cm4gISF0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXM7IH1cbiAgICBzZXQgc2hvd0NvbGxpc2lvbkJveGVzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMgPT09IHZhbHVlKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcyA9IHZhbHVlO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgdHVybiBjb2xsaXNpb24gYm94ZXMgb24gd2UgaGF2ZSB0byBnZW5lcmF0ZSB0aGVtIGZvciBleGlzdGluZyB0aWxlc1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSB0dXJuIHRoZW0gb2ZmLCB0aGVyZSdzIG5vIGNvc3QgdG8gbGVhdmluZyBleGlzdGluZyBib3hlcyBpbiBwbGFjZVxuICAgICAgICAgICAgdGhpcy5zdHlsZS5fZ2VuZXJhdGVDb2xsaXNpb25Cb3hlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjYWxsIGFuIHVwZGF0ZSB0byByZW1vdmUgY29sbGlzaW9uIGJveGVzXG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgc2hvdWxkIGNvbG9yLWNvZGVcbiAgICAgKiBlYWNoIGZyYWdtZW50IHRvIHNob3cgaG93IG1hbnkgdGltZXMgaXQgaGFzIGJlZW4gc2hhZGVkLlxuICAgICAqIFdoaXRlIGZyYWdtZW50cyBoYXZlIGJlZW4gc2hhZGVkIDggb3IgbW9yZSB0aW1lcy5cbiAgICAgKiBCbGFjayBmcmFnbWVudHMgaGF2ZSBiZWVuIHNoYWRlZCAwIHRpbWVzLlxuICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93T3ZlcmRyYXdcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICovXG4gICAgZ2V0IHNob3dPdmVyZHJhd0luc3BlY3RvcigpOiBib29sZWFuIHsgcmV0dXJuICEhdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yOyB9XG4gICAgc2V0IHNob3dPdmVyZHJhd0luc3BlY3Rvcih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgd2lsbFxuICAgICAqIGNvbnRpbnVvdXNseSByZXBhaW50LiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBmb3IgYW5hbHl6aW5nIHBlcmZvcm1hbmNlLlxuICAgICAqXG4gICAgICogQG5hbWUgcmVwYWludFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKi9cbiAgICBnZXQgcmVwYWludCgpOiBib29sZWFuIHsgcmV0dXJuICEhdGhpcy5fcmVwYWludDsgfVxuICAgIHNldCByZXBhaW50KHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXBhaW50ICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVwYWludCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyUmVwYWludCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHNob3cgdmVydGljZXNcbiAgICBnZXQgdmVydGljZXMoKTogYm9vbGVhbiB7IHJldHVybiAhIXRoaXMuX3ZlcnRpY2VzOyB9XG4gICAgc2V0IHZlcnRpY2VzKHZhbHVlOiBib29sZWFuKSB7IHRoaXMuX3ZlcnRpY2VzID0gdmFsdWU7IHRoaXMuX3VwZGF0ZSgpOyB9XG5cbiAgICAvLyBmb3IgY2FjaGUgYnJvd3NlciB0ZXN0c1xuICAgIF9zZXRDYWNoZUxpbWl0cyhsaW1pdDogbnVtYmVyLCBjaGVja1RocmVzaG9sZDogbnVtYmVyKSB7XG4gICAgICAgIHNldENhY2hlTGltaXRzKGxpbWl0LCBjaGVja1RocmVzaG9sZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgTWFwYm94IEdMIEpTIGluIHVzZSBhcyBzcGVjaWZpZWQgaW4gcGFja2FnZS5qc29uLCBDSEFOR0VMT0cubWQsIGFuZCB0aGUgR2l0SHViIHJlbGVhc2UuXG4gICAgICpcbiAgICAgKiBAbmFtZSB2ZXJzaW9uXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqIEB2YXIge3N0cmluZ30gdmVyc2lvblxuICAgICAqL1xuXG4gICAgZ2V0IHZlcnNpb24oKTogc3RyaW5nIHsgcmV0dXJuIHZlcnNpb247IH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFwO1xuXG5mdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBpbnRlcmFjdGl2ZSBjb250cm9scyBhZGRlZCB0byB0aGUgbWFwLiBUaGlzIGlzIGFcbiAqIHNwZWNpZmljYXRpb24gZm9yIGltcGxlbWVudGVycyB0byBtb2RlbDogaXQgaXMgbm90XG4gKiBhbiBleHBvcnRlZCBtZXRob2Qgb3IgY2xhc3MuXG4gKlxuICogQ29udHJvbHMgbXVzdCBpbXBsZW1lbnQgYG9uQWRkYCBhbmQgYG9uUmVtb3ZlYCwgYW5kIG11c3Qgb3duIGFuXG4gKiBlbGVtZW50LCB3aGljaCBpcyBvZnRlbiBhIGBkaXZgIGVsZW1lbnQuIFRvIHVzZSBNYXBib3ggR0wgSlMnc1xuICogZGVmYXVsdCBjb250cm9sIHN0eWxpbmcsIGFkZCB0aGUgYG1hcGJveGdsLWN0cmxgIGNsYXNzIHRvIHlvdXIgY29udHJvbCdzXG4gKiBub2RlLlxuICpcbiAqIEBpbnRlcmZhY2UgSUNvbnRyb2xcbiAqIEBleGFtcGxlXG4gKiAvLyBDb250cm9sIGltcGxlbWVudGVkIGFzIEVTNiBjbGFzc1xuICogY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2wge1xuICogICAgIG9uQWRkKG1hcCkge1xuICogICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gKiAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIudGV4dENvbnRlbnQgPSAnSGVsbG8sIHdvcmxkJztcbiAqICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAqICAgICB9XG4gKlxuICogICAgIG9uUmVtb3ZlKCkge1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpO1xuICogICAgICAgICB0aGlzLl9tYXAgPSB1bmRlZmluZWQ7XG4gKiAgICAgfVxuICogfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb250cm9sIGltcGxlbWVudGVkIGFzIEVTNSBwcm90b3R5cGljYWwgY2xhc3NcbiAqIGZ1bmN0aW9uIEhlbGxvV29ybGRDb250cm9sKCkgeyB9XG4gKlxuICogSGVsbG9Xb3JsZENvbnRyb2wucHJvdG90eXBlLm9uQWRkID0gZnVuY3Rpb24obWFwKSB7XG4gKiAgICAgdGhpcy5fbWFwID0gbWFwO1xuICogICAgIHRoaXMuX2NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICogICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc05hbWUgPSAnbWFwYm94Z2wtY3RybCc7XG4gKiAgICAgdGhpcy5fY29udGFpbmVyLnRleHRDb250ZW50ID0gJ0hlbGxvLCB3b3JsZCc7XG4gKiAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAqIH07XG4gKlxuICogSGVsbG9Xb3JsZENvbnRyb2wucHJvdG90eXBlLm9uUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICogICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gKiAgICAgdGhpcy5fbWFwID0gdW5kZWZpbmVkO1xuICogfTtcbiAqL1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgY29udHJvbCBvbiB0aGUgbWFwIGFuZCBnaXZlIGl0IGEgY2hhbmNlIHRvIHJlZ2lzdGVyIGV2ZW50IGxpc3RlbmVyc1xuICogYW5kIHJlc291cmNlcy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHtAbGluayBNYXAjYWRkQ29udHJvbH1cbiAqIGludGVybmFsbHkuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgSUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgb25BZGRcbiAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcCB0aGlzIGNvbnRyb2wgd2lsbCBiZSBhZGRlZCB0by5cbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIGNvbnRyb2wncyBjb250YWluZXIgZWxlbWVudC4gVGhpcyBzaG91bGRcbiAqIGJlIGNyZWF0ZWQgYnkgdGhlIGNvbnRyb2wgYW5kIHJldHVybmVkIGJ5IG9uQWRkIHdpdGhvdXQgYmVpbmcgYXR0YWNoZWRcbiAqIHRvIHRoZSBET006IHRoZSBtYXAgd2lsbCBpbnNlcnQgdGhlIGNvbnRyb2wncyBlbGVtZW50IGludG8gdGhlIERPTVxuICogYXMgbmVjZXNzYXJ5LlxuICovXG5cbi8qKlxuICogVW5yZWdpc3RlciBhIGNvbnRyb2wgb24gdGhlIG1hcCBhbmQgZ2l2ZSBpdCBhIGNoYW5jZSB0byBkZXRhY2ggZXZlbnQgbGlzdGVuZXJzXG4gKiBhbmQgcmVzb3VyY2VzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkge0BsaW5rIE1hcCNyZW1vdmVDb250cm9sfVxuICogaW50ZXJuYWxseS5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBJQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvblJlbW92ZVxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwIHRoaXMgY29udHJvbCB3aWxsIGJlIHJlbW92ZWQgZnJvbS5cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9IFRoZXJlIGlzIG5vIHJlcXVpcmVkIHJldHVybiB2YWx1ZSBmb3IgdGhpcyBtZXRob2QuXG4gKi9cblxuLyoqXG4gKiBPcHRpb25hbGx5IHByb3ZpZGUgYSBkZWZhdWx0IHBvc2l0aW9uIGZvciB0aGlzIGNvbnRyb2wuIElmIHRoaXMgbWV0aG9kXG4gKiBpcyBpbXBsZW1lbnRlZCBhbmQge0BsaW5rIE1hcCNhZGRDb250cm9sfSBpcyBjYWxsZWQgd2l0aG91dCB0aGUgYHBvc2l0aW9uYFxuICogcGFyYW1ldGVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0RGVmYXVsdFBvc2l0aW9uIHdpbGwgYmUgdXNlZCBhcyB0aGVcbiAqIGNvbnRyb2wncyBwb3NpdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBJQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBnZXREZWZhdWx0UG9zaXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgY29udHJvbCBwb3NpdGlvbiwgb25lIG9mIHRoZSB2YWx1ZXMgdmFsaWQgaW4gYWRkQ29udHJvbC5cbiAqL1xuXG4vKipcbiAqIEEgW2BQb2ludGAgZ2VvbWV0cnldKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvcG9pbnQtZ2VvbWV0cnkpIG9iamVjdCwgd2hpY2ggaGFzXG4gKiBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzIHJlcHJlc2VudGluZyBzY3JlZW4gY29vcmRpbmF0ZXMgaW4gcGl4ZWxzLlxuICpcbiAqIEB0eXBlZGVmIHtQb2ludH0gUG9pbnRcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBwb2ludCA9IG5ldyBtYXBib3hnbC5Qb2ludCgtNzcsIDM4KTtcbiAqL1xuXG4vKipcbiAqIEEge0BsaW5rIFBvaW50fSBvciBhbiBhcnJheSBvZiB0d28gbnVtYmVycyByZXByZXNlbnRpbmcgYHhgIGFuZCBgeWAgc2NyZWVuIGNvb3JkaW5hdGVzIGluIHBpeGVscy5cbiAqXG4gKiBAdHlwZWRlZiB7KFBvaW50IHwgQXJyYXk8bnVtYmVyPil9IFBvaW50TGlrZVxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHAxID0gbmV3IG1hcGJveGdsLlBvaW50KC03NywgMzgpOyAvLyBhIFBvaW50TGlrZSB3aGljaCBpcyBhIFBvaW50XG4gKiBjb25zdCBwMiA9IFstNzcsIDM4XTsgLy8gYSBQb2ludExpa2Ugd2hpY2ggaXMgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnNcbiAqL1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0ICogYXMgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tLmpzJztcbmltcG9ydCB7ZXh0ZW5kLCBiaW5kQWxsfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHtNb3VzZVJvdGF0ZUhhbmRsZXIsIE1vdXNlUGl0Y2hIYW5kbGVyfSBmcm9tICcuLi9oYW5kbGVyL21vdXNlLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwLmpzJztcbmltcG9ydCB0eXBlIFBvaW50IGZyb20gJ0BtYXBib3gvcG9pbnQtZ2VvbWV0cnknO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gICAgc2hvd0NvbXBhc3M/OiBib29sZWFuLFxuICAgIHNob3dab29tPzogYm9vbGVhbixcbiAgICB2aXN1YWxpemVQaXRjaD86IGJvb2xlYW5cbn07XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICAgIHNob3dDb21wYXNzOiB0cnVlLFxuICAgIHNob3dab29tOiB0cnVlLFxuICAgIHZpc3VhbGl6ZVBpdGNoOiBmYWxzZVxufTtcblxuLyoqXG4gKiBBIGBOYXZpZ2F0aW9uQ29udHJvbGAgY29udHJvbCBjb250YWlucyB6b29tIGJ1dHRvbnMgYW5kIGEgY29tcGFzcy5cbiAqIEFkZCB0aGlzIGNvbnRyb2wgdG8gYSBtYXAgdXNpbmcge0BsaW5rIE1hcCNhZGRDb250cm9sfS5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNob3dDb21wYXNzPXRydWVdIElmIGB0cnVlYCB0aGUgY29tcGFzcyBidXR0b24gaXMgaW5jbHVkZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNob3dab29tPXRydWVdIElmIGB0cnVlYCB0aGUgem9vbS1pbiBhbmQgem9vbS1vdXQgYnV0dG9ucyBhcmUgaW5jbHVkZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnZpc3VhbGl6ZVBpdGNoPWZhbHNlXSBJZiBgdHJ1ZWAgdGhlIHBpdGNoIGlzIHZpc3VhbGl6ZWQgYnkgcm90YXRpbmcgWC1heGlzIG9mIGNvbXBhc3MuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgbmF2ID0gbmV3IG1hcGJveGdsLk5hdmlnYXRpb25Db250cm9sKCk7XG4gKiBtYXAuYWRkQ29udHJvbChuYXYsICd0b3AtbGVmdCcpO1xuICogQGV4YW1wbGVcbiAqIGNvbnN0IG5hdiA9IG5ldyBtYXBib3hnbC5OYXZpZ2F0aW9uQ29udHJvbCh7XG4gKiAgICAgdmlzdWFsaXplUGl0Y2g6IHRydWVcbiAqIH0pO1xuICogbWFwLmFkZENvbnRyb2wobmF2LCAnYm90dG9tLXJpZ2h0Jyk7XG4gKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IG1hcCBuYXZpZ2F0aW9uIGNvbnRyb2xzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL25hdmlnYXRpb24vKVxuICogQHNlZSBbRXhhbXBsZTogQWRkIGEgdGhpcmQgcGFydHkgdmVjdG9yIHRpbGUgc291cmNlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RoaXJkLXBhcnR5LylcbiAqL1xuY2xhc3MgTmF2aWdhdGlvbkNvbnRyb2wge1xuICAgIF9tYXA6ID9NYXA7XG4gICAgb3B0aW9uczogT3B0aW9ucztcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfem9vbUluQnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudDtcbiAgICBfem9vbU91dEJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgX2NvbXBhc3M6IEhUTUxCdXR0b25FbGVtZW50O1xuICAgIF9jb21wYXNzSWNvbjogSFRNTEVsZW1lbnQ7XG4gICAgX2hhbmRsZXI6ID9Nb3VzZVJvdGF0ZVdyYXBwZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtZ3JvdXAnKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgKGU6IE1vdXNlRXZlbnQpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93Wm9vbSkge1xuICAgICAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAgICAgJ19zZXRCdXR0b25UaXRsZScsXG4gICAgICAgICAgICAgICAgJ191cGRhdGVab29tQnV0dG9ucydcbiAgICAgICAgICAgIF0sIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fem9vbUluQnV0dG9uID0gdGhpcy5fY3JlYXRlQnV0dG9uKCdtYXBib3hnbC1jdHJsLXpvb20taW4nLCAoZSkgPT4geyBpZiAodGhpcy5fbWFwKSB0aGlzLl9tYXAuem9vbUluKHt9LCB7b3JpZ2luYWxFdmVudDogZX0pOyB9KTtcbiAgICAgICAgICAgIERPTS5jcmVhdGUoJ3NwYW4nLCBgbWFwYm94Z2wtY3RybC1pY29uYCwgdGhpcy5fem9vbUluQnV0dG9uKS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgICAgICAgIHRoaXMuX3pvb21PdXRCdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oJ21hcGJveGdsLWN0cmwtem9vbS1vdXQnLCAoZSkgPT4geyBpZiAodGhpcy5fbWFwKSB0aGlzLl9tYXAuem9vbU91dCh7fSwge29yaWdpbmFsRXZlbnQ6IGV9KTsgfSk7XG4gICAgICAgICAgICBET00uY3JlYXRlKCdzcGFuJywgYG1hcGJveGdsLWN0cmwtaWNvbmAsIHRoaXMuX3pvb21PdXRCdXR0b24pLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0NvbXBhc3MpIHtcbiAgICAgICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgICAgICdfcm90YXRlQ29tcGFzc0Fycm93J1xuICAgICAgICAgICAgXSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9jb21wYXNzID0gdGhpcy5fY3JlYXRlQnV0dG9uKCdtYXBib3hnbC1jdHJsLWNvbXBhc3MnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgICAgICAgICBpZiAoIW1hcCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLnJlc2V0Tm9ydGhQaXRjaCh7fSwge29yaWdpbmFsRXZlbnQ6IGV9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtYXAucmVzZXROb3J0aCh7fSwge29yaWdpbmFsRXZlbnQ6IGV9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBhc3NJY29uID0gRE9NLmNyZWF0ZSgnc3BhbicsICdtYXBib3hnbC1jdHJsLWljb24nLCB0aGlzLl9jb21wYXNzKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbXBhc3NJY29uLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZVpvb21CdXR0b25zKCkge1xuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgICAgIGlmICghbWFwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgem9vbSA9IG1hcC5nZXRab29tKCk7XG4gICAgICAgIGNvbnN0IGlzTWF4ID0gem9vbSA9PT0gbWFwLmdldE1heFpvb20oKTtcbiAgICAgICAgY29uc3QgaXNNaW4gPSB6b29tID09PSBtYXAuZ2V0TWluWm9vbSgpO1xuICAgICAgICB0aGlzLl96b29tSW5CdXR0b24uZGlzYWJsZWQgPSBpc01heDtcbiAgICAgICAgdGhpcy5fem9vbU91dEJ1dHRvbi5kaXNhYmxlZCA9IGlzTWluO1xuICAgICAgICB0aGlzLl96b29tSW5CdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgaXNNYXgudG9TdHJpbmcoKSk7XG4gICAgICAgIHRoaXMuX3pvb21PdXRCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgaXNNaW4udG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgX3JvdGF0ZUNvbXBhc3NBcnJvdygpIHtcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICBpZiAoIW1hcCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHJvdGF0ZSA9IHRoaXMub3B0aW9ucy52aXN1YWxpemVQaXRjaCA/XG4gICAgICAgICAgICBgc2NhbGUoJHsxIC8gTWF0aC5wb3coTWF0aC5jb3MobWFwLnRyYW5zZm9ybS5waXRjaCAqIChNYXRoLlBJIC8gMTgwKSksIDAuNSl9KSByb3RhdGVYKCR7bWFwLnRyYW5zZm9ybS5waXRjaH1kZWcpIHJvdGF0ZVooJHttYXAudHJhbnNmb3JtLmFuZ2xlICogKDE4MCAvIE1hdGguUEkpfWRlZylgIDpcbiAgICAgICAgICAgIGByb3RhdGUoJHttYXAudHJhbnNmb3JtLmFuZ2xlICogKDE4MCAvIE1hdGguUEkpfWRlZylgO1xuXG4gICAgICAgIG1hcC5fcmVxdWVzdERvbVRhc2soKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXBhc3NJY29uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29tcGFzc0ljb24uc3R5bGUudHJhbnNmb3JtID0gcm90YXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dab29tKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRCdXR0b25UaXRsZSh0aGlzLl96b29tSW5CdXR0b24sICdab29tSW4nKTtcbiAgICAgICAgICAgIHRoaXMuX3NldEJ1dHRvblRpdGxlKHRoaXMuX3pvb21PdXRCdXR0b24sICdab29tT3V0Jyk7XG4gICAgICAgICAgICBtYXAub24oJ3pvb20nLCB0aGlzLl91cGRhdGVab29tQnV0dG9ucyk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVab29tQnV0dG9ucygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0NvbXBhc3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldEJ1dHRvblRpdGxlKHRoaXMuX2NvbXBhc3MsICdSZXNldEJlYXJpbmcnKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2gpIHtcbiAgICAgICAgICAgICAgICBtYXAub24oJ3BpdGNoJywgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hcC5vbigncm90YXRlJywgdGhpcy5fcm90YXRlQ29tcGFzc0Fycm93KTtcbiAgICAgICAgICAgIHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdygpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlciA9IG5ldyBNb3VzZVJvdGF0ZVdyYXBwZXIobWFwLCB0aGlzLl9jb21wYXNzLCB0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgaWYgKCFtYXApIHJldHVybjtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dab29tKSB7XG4gICAgICAgICAgICBtYXAub2ZmKCd6b29tJywgdGhpcy5fdXBkYXRlWm9vbUJ1dHRvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0NvbXBhc3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudmlzdWFsaXplUGl0Y2gpIHtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdwaXRjaCcsIHRoaXMuX3JvdGF0ZUNvbXBhc3NBcnJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXAub2ZmKCdyb3RhdGUnLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2hhbmRsZXIpIHRoaXMuX2hhbmRsZXIub2ZmKCk7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBfY3JlYXRlQnV0dG9uKGNsYXNzTmFtZTogc3RyaW5nLCBmbjogKCkgPT4gbWl4ZWQpOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGEgPSBET00uY3JlYXRlKCdidXR0b24nLCBjbGFzc05hbWUsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIGEudHlwZSA9ICdidXR0b24nO1xuICAgICAgICBhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZm4pO1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBfc2V0QnV0dG9uVGl0bGUoYnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCwgdGl0bGU6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuX21hcCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzdHIgPSB0aGlzLl9tYXAuX2dldFVJU3RyaW5nKGBOYXZpZ2F0aW9uQ29udHJvbC4ke3RpdGxlfWApO1xuICAgICAgICBidXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgc3RyKTtcbiAgICAgICAgaWYgKGJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZCkgYnV0dG9uLmZpcnN0RWxlbWVudENoaWxkLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBzdHIpO1xuICAgIH1cbn1cblxuY2xhc3MgTW91c2VSb3RhdGVXcmFwcGVyIHtcblxuICAgIG1hcDogTWFwO1xuICAgIF9jbGlja1RvbGVyYW5jZTogbnVtYmVyO1xuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIG1vdXNlUm90YXRlOiBNb3VzZVJvdGF0ZUhhbmRsZXI7XG4gICAgbW91c2VQaXRjaDogTW91c2VQaXRjaEhhbmRsZXI7XG4gICAgX3N0YXJ0UG9zOiBQb2ludDtcbiAgICBfbGFzdFBvczogUG9pbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihtYXA6IE1hcCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIHBpdGNoPzogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2NsaWNrVG9sZXJhbmNlID0gMTA7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMubW91c2VSb3RhdGUgPSBuZXcgTW91c2VSb3RhdGVIYW5kbGVyKHtjbGlja1RvbGVyYW5jZTogbWFwLmRyYWdSb3RhdGUuX21vdXNlUm90YXRlLl9jbGlja1RvbGVyYW5jZX0pO1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICAgICAgaWYgKHBpdGNoKSB0aGlzLm1vdXNlUGl0Y2ggPSBuZXcgTW91c2VQaXRjaEhhbmRsZXIoe2NsaWNrVG9sZXJhbmNlOiBtYXAuZHJhZ1JvdGF0ZS5fbW91c2VQaXRjaC5fY2xpY2tUb2xlcmFuY2V9KTtcblxuICAgICAgICBiaW5kQWxsKFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJywgJ3RvdWNoZW5kJywgJ3Jlc2V0J10sIHRoaXMpO1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubW91c2Vkb3duKTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy50b3VjaHN0YXJ0LCB7cGFzc2l2ZTogZmFsc2V9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLnRvdWNobW92ZSk7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLnRvdWNoZW5kKTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMucmVzZXQpO1xuICAgIH1cblxuICAgIGRvd24oZTogTW91c2VFdmVudCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgICAgIHRoaXMubW91c2VSb3RhdGUubW91c2Vkb3duKGUsIHBvaW50KTtcbiAgICAgICAgaWYgKHRoaXMubW91c2VQaXRjaCkgdGhpcy5tb3VzZVBpdGNoLm1vdXNlZG93bihlLCBwb2ludCk7XG4gICAgICAgIERPTS5kaXNhYmxlRHJhZygpO1xuICAgIH1cblxuICAgIG1vdmUoZTogTW91c2VFdmVudCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMubWFwO1xuICAgICAgICBjb25zdCByID0gdGhpcy5tb3VzZVJvdGF0ZS5tb3VzZW1vdmVXaW5kb3coZSwgcG9pbnQpO1xuICAgICAgICBjb25zdCBkZWx0YSA9IHIgJiYgci5iZWFyaW5nRGVsdGE7XG4gICAgICAgIGlmIChkZWx0YSkgbWFwLnNldEJlYXJpbmcobWFwLmdldEJlYXJpbmcoKSArIGRlbHRhKTtcbiAgICAgICAgaWYgKHRoaXMubW91c2VQaXRjaCkge1xuICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMubW91c2VQaXRjaC5tb3VzZW1vdmVXaW5kb3coZSwgcG9pbnQpO1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBwICYmIHAucGl0Y2hEZWx0YTtcbiAgICAgICAgICAgIGlmIChkZWx0YSkgbWFwLnNldFBpdGNoKG1hcC5nZXRQaXRjaCgpICsgZGVsdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb2ZmKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50O1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubW91c2Vkb3duKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy50b3VjaHN0YXJ0LCB7cGFzc2l2ZTogZmFsc2V9KTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLnRvdWNobW92ZSk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLnRvdWNoZW5kKTtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMucmVzZXQpO1xuICAgICAgICB0aGlzLm9mZlRlbXAoKTtcbiAgICB9XG5cbiAgICBvZmZUZW1wKCkge1xuICAgICAgICBET00uZW5hYmxlRHJhZygpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZW1vdmUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2V1cCk7XG4gICAgfVxuXG4gICAgbW91c2Vkb3duKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kb3duKGV4dGVuZCh7fSwgZSwge2N0cmxLZXk6IHRydWUsIHByZXZlbnREZWZhdWx0OiAoKSA9PiBlLnByZXZlbnREZWZhdWx0KCl9KSwgRE9NLm1vdXNlUG9zKHRoaXMuZWxlbWVudCwgZSkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZW1vdmUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2V1cCk7XG4gICAgfVxuXG4gICAgbW91c2Vtb3ZlKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5tb3ZlKGUsIERPTS5tb3VzZVBvcyh0aGlzLmVsZW1lbnQsIGUpKTtcbiAgICB9XG5cbiAgICBtb3VzZXVwKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgdGhpcy5tb3VzZVJvdGF0ZS5tb3VzZXVwV2luZG93KGUpO1xuICAgICAgICBpZiAodGhpcy5tb3VzZVBpdGNoKSB0aGlzLm1vdXNlUGl0Y2gubW91c2V1cFdpbmRvdyhlKTtcbiAgICAgICAgdGhpcy5vZmZUZW1wKCk7XG4gICAgfVxuXG4gICAgdG91Y2hzdGFydChlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGlmIChlLnRhcmdldFRvdWNoZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zdGFydFBvcyA9IHRoaXMuX2xhc3RQb3MgPSBET00udG91Y2hQb3ModGhpcy5lbGVtZW50LCBlLnRhcmdldFRvdWNoZXMpWzBdO1xuICAgICAgICAgICAgdGhpcy5kb3duKCgoe3R5cGU6ICdtb3VzZWRvd24nLCBidXR0b246IDAsIGN0cmxLZXk6IHRydWUsIHByZXZlbnREZWZhdWx0OiAoKSA9PiBlLnByZXZlbnREZWZhdWx0KCl9OiBhbnkpOiBNb3VzZUV2ZW50KSwgdGhpcy5fc3RhcnRQb3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG91Y2htb3ZlKGU6IFRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKGUudGFyZ2V0VG91Y2hlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RQb3MgPSBET00udG91Y2hQb3ModGhpcy5lbGVtZW50LCBlLnRhcmdldFRvdWNoZXMpWzBdO1xuICAgICAgICAgICAgdGhpcy5tb3ZlKCgoe3ByZXZlbnREZWZhdWx0OiAoKSA9PiBlLnByZXZlbnREZWZhdWx0KCl9OiBhbnkpOiBNb3VzZUV2ZW50KSwgdGhpcy5fbGFzdFBvcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b3VjaGVuZChlOiBUb3VjaEV2ZW50KSB7XG4gICAgICAgIGlmIChlLnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICB0aGlzLl9zdGFydFBvcyAmJlxuICAgICAgICAgICAgdGhpcy5fbGFzdFBvcyAmJlxuICAgICAgICAgICAgdGhpcy5fc3RhcnRQb3MuZGlzdCh0aGlzLl9sYXN0UG9zKSA8IHRoaXMuX2NsaWNrVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMubW91c2VSb3RhdGUucmVzZXQoKTtcbiAgICAgICAgaWYgKHRoaXMubW91c2VQaXRjaCkgdGhpcy5tb3VzZVBpdGNoLnJlc2V0KCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdGFydFBvcztcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xhc3RQb3M7XG4gICAgICAgIHRoaXMub2ZmVGVtcCgpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTmF2aWdhdGlvbkNvbnRyb2w7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge0V2ZW50LCBFdmVudGVkfSBmcm9tICcuLi8uLi91dGlsL2V2ZW50ZWQuanMnO1xuaW1wb3J0ICogYXMgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tLmpzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vLi4vdXRpbC93aW5kb3cuanMnO1xuaW1wb3J0IHtleHRlbmQsIGJpbmRBbGwsIHdhcm5PbmNlfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IE1hcmtlciBmcm9tICcuLi9tYXJrZXIuanMnO1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi8uLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSAnLi4vLi4vdXRpbC90aHJvdHRsZS5qcyc7XG5pbXBvcnQge21lcmNhdG9yWmZyb21BbHRpdHVkZX0gZnJvbSAnLi4vLi4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAgZnJvbSAnLi4vbWFwLmpzJztcbmltcG9ydCB0eXBlIHtBbmltYXRpb25PcHRpb25zLCBDYW1lcmFPcHRpb25zfSBmcm9tICcuLi9jYW1lcmEuanMnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gICAgcG9zaXRpb25PcHRpb25zOiBQb3NpdGlvbk9wdGlvbnMsXG4gICAgZml0Qm91bmRzT3B0aW9uczogQW5pbWF0aW9uT3B0aW9ucyAmIENhbWVyYU9wdGlvbnMsXG4gICAgdHJhY2tVc2VyTG9jYXRpb246IGJvb2xlYW4sXG4gICAgc2hvd0FjY3VyYWN5Q2lyY2xlOiBib29sZWFuLFxuICAgIHNob3dVc2VyTG9jYXRpb246IGJvb2xlYW4sXG4gICAgc2hvd1VzZXJIZWFkaW5nOiBib29sZWFuLFxuICAgIGdlb2xvY2F0aW9uOiBHZW9sb2NhdGlvbixcbn07XG5cbnR5cGUgRGV2aWNlT3JpZW50YXRpb25FdmVudCA9IHtcbiAgICBhYnNvbHV0ZTogYm9vbGVhbixcbiAgICBhbHBoYTogbnVtYmVyLFxuICAgIGJldGE6IG51bWJlcixcbiAgICBnYW1tYTogbnVtYmVyLFxuICAgIHJlcXVlc3RQZXJtaXNzaW9uOiBQcm9taXNlPFN0cmluZz4sXG4gICAgd2Via2l0Q29tcGFzc0hlYWRpbmc/OiBudW1iZXIsXG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IGZhbHNlLFxuICAgICAgICBtYXhpbXVtQWdlOiAwLFxuICAgICAgICB0aW1lb3V0OiA2MDAwIC8qIDYgc2VjICovXG4gICAgfSxcbiAgICBmaXRCb3VuZHNPcHRpb25zOiB7XG4gICAgICAgIG1heFpvb206IDE1XG4gICAgfSxcbiAgICB0cmFja1VzZXJMb2NhdGlvbjogZmFsc2UsXG4gICAgc2hvd0FjY3VyYWN5Q2lyY2xlOiB0cnVlLFxuICAgIHNob3dVc2VyTG9jYXRpb246IHRydWUsXG4gICAgc2hvd1VzZXJIZWFkaW5nOiBmYWxzZVxufTtcblxuLyoqXG4gKiBBIGBHZW9sb2NhdGVDb250cm9sYCBjb250cm9sIHByb3ZpZGVzIGEgYnV0dG9uIHRoYXQgdXNlcyB0aGUgYnJvd3NlcidzIGdlb2xvY2F0aW9uXG4gKiBBUEkgdG8gbG9jYXRlIHRoZSB1c2VyIG9uIHRoZSBtYXAuXG4gKiBBZGQgdGhpcyBjb250cm9sIHRvIGEgbWFwIHVzaW5nIHtAbGluayBNYXAjYWRkQ29udHJvbH0uXG4gKlxuICogTm90IGFsbCBicm93c2VycyBzdXBwb3J0IGdlb2xvY2F0aW9uLFxuICogYW5kIHNvbWUgdXNlcnMgbWF5IGRpc2FibGUgdGhlIGZlYXR1cmUuIEdlb2xvY2F0aW9uIHN1cHBvcnQgZm9yIG1vZGVyblxuICogYnJvd3NlcnMgaW5jbHVkaW5nIENocm9tZSByZXF1aXJlcyBzaXRlcyB0byBiZSBzZXJ2ZWQgb3ZlciBIVFRQUy4gSWZcbiAqIGdlb2xvY2F0aW9uIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSwgdGhlIEdlb2xvY2F0ZUNvbnRyb2wgd2lsbCBzaG93XG4gKiBhcyBkaXNhYmxlZC5cbiAqXG4gKiBUaGUgW3pvb20gbGV2ZWxdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL2hlbHAvZ2xvc3Nhcnkvem9vbS1sZXZlbC8pIGFwcGxpZWQgZGVwZW5kcyBvbiB0aGUgYWNjdXJhY3kgb2YgdGhlIGdlb2xvY2F0aW9uIHByb3ZpZGVkIGJ5IHRoZSBkZXZpY2UuXG4gKlxuICogVGhlIEdlb2xvY2F0ZUNvbnRyb2wgaGFzIHR3byBtb2Rlcy4gSWYgYHRyYWNrVXNlckxvY2F0aW9uYCBpcyBgZmFsc2VgIChkZWZhdWx0KSB0aGUgY29udHJvbCBhY3RzIGFzIGEgYnV0dG9uLCB3aGljaCB3aGVuIHByZXNzZWQgd2lsbCBzZXQgdGhlIG1hcCdzIGNhbWVyYSB0byB0YXJnZXQgdGhlIHVzZXIgbG9jYXRpb24uIElmIHRoZSB1c2VyIG1vdmVzLCB0aGUgbWFwIHdvbid0IHVwZGF0ZS4gVGhpcyBpcyBtb3N0IHN1aXRlZCBmb3IgdGhlIGRlc2t0b3AuIElmIGB0cmFja1VzZXJMb2NhdGlvbmAgaXMgYHRydWVgIHRoZSBjb250cm9sIGFjdHMgYXMgYSB0b2dnbGUgYnV0dG9uIHRoYXQgd2hlbiBhY3RpdmUgdGhlIHVzZXIncyBsb2NhdGlvbiBpcyBhY3RpdmVseSBtb25pdG9yZWQgZm9yIGNoYW5nZXMuIEluIHRoaXMgbW9kZSB0aGUgR2VvbG9jYXRlQ29udHJvbCBoYXMgdGhyZWUgaW50ZXJhY3Rpb24gc3RhdGVzOlxuICogKiBhY3RpdmUgLSBUaGUgbWFwJ3MgY2FtZXJhIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyBhcyB0aGUgdXNlcidzIGxvY2F0aW9uIGNoYW5nZXMsIGtlZXBpbmcgdGhlIGxvY2F0aW9uIGRvdCBpbiB0aGUgY2VudGVyLiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlLCBhbmQgdGhlIHN0YXRlIHVwb24gY2xpY2tpbmcgdGhlIGBHZW9sb2NhdGVDb250cm9sYCBidXR0b24uXG4gKiAqIHBhc3NpdmUgLSBUaGUgdXNlcidzIGxvY2F0aW9uIGRvdCBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMsIGJ1dCB0aGUgbWFwJ3MgY2FtZXJhIGRvZXMgbm90LiBPY2N1cnMgdXBvbiB0aGUgdXNlciBpbml0aWF0aW5nIGEgbWFwIG1vdmVtZW50LlxuICogKiBkaXNhYmxlZCAtIE9jY3VycyBpZiBnZW9sb2NhdGlvbiBpcyBub3QgYXZhaWxhYmxlLCBkaXNhYmxlZCwgb3IgZGVuaWVkLlxuICpcbiAqIFRoZXNlIGludGVyYWN0aW9uIHN0YXRlcyBjYW4ndCBiZSBjb250cm9sbGVkIHByb2dyYW1tYXRpY2FsbHkuIEluc3RlYWQsIHRoZXkgYXJlIHNldCBiYXNlZCBvbiB1c2VyIGludGVyYWN0aW9ucy5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucG9zaXRpb25PcHRpb25zPXtlbmFibGVIaWdoQWNjdXJhY3k6IGZhbHNlLCB0aW1lb3V0OiA2MDAwfV0gQSBHZW9sb2NhdGlvbiBBUEkgW1Bvc2l0aW9uT3B0aW9uc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Bvc2l0aW9uT3B0aW9ucykgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmZpdEJvdW5kc09wdGlvbnM9e21heFpvb206IDE1fV0gQSB7QGxpbmsgTWFwI2ZpdEJvdW5kc30gb3B0aW9ucyBvYmplY3QgdG8gdXNlIHdoZW4gdGhlIG1hcCBpcyBwYW5uZWQgYW5kIHpvb21lZCB0byB0aGUgdXNlcidzIGxvY2F0aW9uLiBUaGUgZGVmYXVsdCBpcyB0byB1c2UgYSBgbWF4Wm9vbWAgb2YgMTUgdG8gbGltaXQgaG93IGZhciB0aGUgbWFwIHdpbGwgem9vbSBpbiBmb3IgdmVyeSBhY2N1cmF0ZSBsb2NhdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMudHJhY2tVc2VyTG9jYXRpb249ZmFsc2VdIElmIGB0cnVlYCB0aGUgR2VvbG9jYXRlQ29udHJvbCBiZWNvbWVzIGEgdG9nZ2xlIGJ1dHRvbiBhbmQgd2hlbiBhY3RpdmUgdGhlIG1hcCB3aWxsIHJlY2VpdmUgdXBkYXRlcyB0byB0aGUgdXNlcidzIGxvY2F0aW9uIGFzIGl0IGNoYW5nZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuc2hvd0FjY3VyYWN5Q2lyY2xlPXRydWVdIEJ5IGRlZmF1bHQsIGlmIGBzaG93VXNlckxvY2F0aW9uYCBpcyBgdHJ1ZWAsIGEgdHJhbnNwYXJlbnQgY2lyY2xlIHdpbGwgYmUgZHJhd24gYXJvdW5kIHRoZSB1c2VyIGxvY2F0aW9uIGluZGljYXRpbmcgdGhlIGFjY3VyYWN5ICg5NSUgY29uZmlkZW5jZSBsZXZlbCkgb2YgdGhlIHVzZXIncyBsb2NhdGlvbi4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZS4gQWx3YXlzIGRpc2FibGVkIHdoZW4gYHNob3dVc2VyTG9jYXRpb25gIGlzIGBmYWxzZWAuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuc2hvd1VzZXJMb2NhdGlvbj10cnVlXSBCeSBkZWZhdWx0IGEgZG90IHdpbGwgYmUgc2hvd24gb24gdGhlIG1hcCBhdCB0aGUgdXNlcidzIGxvY2F0aW9uLiBTZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnNob3dVc2VySGVhZGluZz1mYWxzZV0gSWYgYHRydWVgIGFuIGFycm93IHdpbGwgYmUgZHJhd24gbmV4dCB0byB0aGUgdXNlciBsb2NhdGlvbiBkb3QgaW5kaWNhdGluZyB0aGUgZGV2aWNlJ3MgaGVhZGluZy4gVGhpcyBvbmx5IGhhcyBhZmZlY3Qgd2hlbiBgdHJhY2tVc2VyTG9jYXRpb25gIGlzIGB0cnVlYC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5nZW9sb2NhdGlvbj13aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uXSBgd2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbmAgYnkgZGVmYXVsdDsgeW91IGNhbiBwcm92aWRlIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNoYXBlIHRvIGN1c3RvbWl6ZSBnZW9sb2NhdGlvbiBoYW5kbGluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmFkZENvbnRyb2wobmV3IG1hcGJveGdsLkdlb2xvY2F0ZUNvbnRyb2woe1xuICogICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICogICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAqICAgICB9LFxuICogICAgIHRyYWNrVXNlckxvY2F0aW9uOiB0cnVlLFxuICogICAgIHNob3dVc2VySGVhZGluZzogdHJ1ZVxuICogfSkpO1xuICogQHNlZSBbRXhhbXBsZTogTG9jYXRlIHRoZSB1c2VyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2xvY2F0ZS11c2VyLylcbiAqL1xuY2xhc3MgR2VvbG9jYXRlQ29udHJvbCBleHRlbmRzIEV2ZW50ZWQge1xuICAgIF9tYXA6IE1hcDtcbiAgICBvcHRpb25zOiBPcHRpb25zO1xuICAgIF9jb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAgIF9kb3RFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBfY2lyY2xlRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgX2dlb2xvY2F0ZUJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gICAgX2dlb2xvY2F0aW9uV2F0Y2hJRDogbnVtYmVyO1xuICAgIF90aW1lb3V0SWQ6ID9UaW1lb3V0SUQ7XG4gICAgX3dhdGNoU3RhdGU6ICdPRkYnIHwgJ0FDVElWRV9MT0NLJyB8ICdXQUlUSU5HX0FDVElWRScgfCAnQUNUSVZFX0VSUk9SJyB8ICdCQUNLR1JPVU5EJyB8ICdCQUNLR1JPVU5EX0VSUk9SJztcbiAgICBfbGFzdEtub3duUG9zaXRpb246IGFueTtcbiAgICBfdXNlckxvY2F0aW9uRG90TWFya2VyOiBNYXJrZXI7XG4gICAgX2FjY3VyYWN5Q2lyY2xlTWFya2VyOiBNYXJrZXI7XG4gICAgX2FjY3VyYWN5OiBudW1iZXI7XG4gICAgX3NldHVwOiBib29sZWFuOyAvLyBzZXQgdG8gdHJ1ZSBvbmNlIHRoZSBjb250cm9sIGhhcyBiZWVuIHNldHVwXG4gICAgX2hlYWRpbmc6ID9udW1iZXI7XG4gICAgX3VwZGF0ZU1hcmtlclJvdGF0aW9uVGhyb3R0bGVkOiBGdW5jdGlvbjtcblxuICAgIF9udW1iZXJPZldhdGNoZXM6IG51bWJlcjtcbiAgICBfbm9UaW1lb3V0OiBib29sZWFuO1xuICAgIF9zdXBwb3J0c0dlb2xvY2F0aW9uOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogJFNoYXBlPE9wdGlvbnM+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGNvbnN0IGdlb2xvY2F0aW9uID0gd2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbjtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHtnZW9sb2NhdGlvbn0sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgICBiaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25TdWNjZXNzJyxcbiAgICAgICAgICAgICdfb25FcnJvcicsXG4gICAgICAgICAgICAnX29uWm9vbScsXG4gICAgICAgICAgICAnX2ZpbmlzaCcsXG4gICAgICAgICAgICAnX3NldHVwVUknLFxuICAgICAgICAgICAgJ191cGRhdGVDYW1lcmEnLFxuICAgICAgICAgICAgJ191cGRhdGVNYXJrZXInLFxuICAgICAgICAgICAgJ191cGRhdGVNYXJrZXJSb3RhdGlvbicsXG4gICAgICAgICAgICAnX29uRGV2aWNlT3JpZW50YXRpb24nXG4gICAgICAgIF0sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZU1hcmtlclJvdGF0aW9uVGhyb3R0bGVkID0gdGhyb3R0bGUodGhpcy5fdXBkYXRlTWFya2VyUm90YXRpb24sIDIwKTtcbiAgICAgICAgdGhpcy5fbnVtYmVyT2ZXYXRjaGVzID0gMDtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCBgbWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwYCk7XG4gICAgICAgIHRoaXMuX2NoZWNrR2VvbG9jYXRpb25TdXBwb3J0KHRoaXMuX3NldHVwVUkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICAvLyBjbGVhciB0aGUgZ2VvbG9jYXRpb24gd2F0Y2ggaWYgZXhpc3RzXG4gICAgICAgIGlmICh0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciB0aGUgbWFya2VycyBmcm9tIHRoZSBtYXBcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fdXNlckxvY2F0aW9uRG90TWFya2VyLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0FjY3VyYWN5Q2lyY2xlICYmIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY2N1cmFjeUNpcmNsZU1hcmtlci5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignem9vbScsIHRoaXMuX29uWm9vbSk7XG4gICAgICAgIHRoaXMuX21hcCA9ICh1bmRlZmluZWQ6IGFueSk7XG4gICAgICAgIHRoaXMuX251bWJlck9mV2F0Y2hlcyA9IDA7XG4gICAgICAgIHRoaXMuX25vVGltZW91dCA9IGZhbHNlO1xuICAgIH1cblxuICAgIF9jaGVja0dlb2xvY2F0aW9uU3VwcG9ydChjYWxsYmFjazogKHN1cHBvcnRlZDogYm9vbGVhbikgPT4gYW55KSB7XG4gICAgICAgIGlmICh0aGlzLl9zdXBwb3J0c0dlb2xvY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHRoaXMuX3N1cHBvcnRzR2VvbG9jYXRpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5uYXZpZ2F0b3IucGVybWlzc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gbmF2aWdhdG9yLnBlcm1pc3Npb25zIGhhcyBpbmNvbXBsZXRlIGJyb3dzZXIgc3VwcG9ydFxuICAgICAgICAgICAgLy8gaHR0cDovL2Nhbml1c2UuY29tLyNmZWF0PXBlcm1pc3Npb25zLWFwaVxuICAgICAgICAgICAgLy8gVGVzdCBmb3IgdGhlIGNhc2Ugd2hlcmUgYSBicm93c2VyIGRpc2FibGVzIEdlb2xvY2F0aW9uIGJlY2F1c2Ugb2YgYW5cbiAgICAgICAgICAgIC8vIGluc2VjdXJlIG9yaWdpblxuICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7bmFtZTogJ2dlb2xvY2F0aW9uJ30pLnRoZW4oKHApID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdXBwb3J0c0dlb2xvY2F0aW9uID0gcC5zdGF0ZSAhPT0gJ2RlbmllZCc7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcy5fc3VwcG9ydHNHZW9sb2NhdGlvbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3N1cHBvcnRzR2VvbG9jYXRpb24gPSAhIXRoaXMuZ2VvbG9jYXRpb247XG4gICAgICAgICAgICBjYWxsYmFjayh0aGlzLl9zdXBwb3J0c0dlb2xvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBHZW9sb2NhdGlvbiBBUEkgUG9zaXRpb24gaXMgb3V0c2lkZSB0aGUgbWFwJ3MgbWF4Ym91bmRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb24gdGhlIEdlb2xvY2F0aW9uIEFQSSBQb3NpdGlvblxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBwb3NpdGlvbiBpcyBvdXRzaWRlIHRoZSBtYXAncyBtYXhib3VuZHMsIG90aGVyd2lzZSByZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaXNPdXRPZk1hcE1heEJvdW5kcyhwb3NpdGlvbjogUG9zaXRpb24pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYm91bmRzID0gdGhpcy5fbWFwLmdldE1heEJvdW5kcygpO1xuICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IHBvc2l0aW9uLmNvb3JkcztcblxuICAgICAgICByZXR1cm4gISFib3VuZHMgJiYgKFxuICAgICAgICAgICAgY29vcmRpbmF0ZXMubG9uZ2l0dWRlIDwgYm91bmRzLmdldFdlc3QoKSB8fFxuICAgICAgICAgICAgY29vcmRpbmF0ZXMubG9uZ2l0dWRlID4gYm91bmRzLmdldEVhc3QoKSB8fFxuICAgICAgICAgICAgY29vcmRpbmF0ZXMubGF0aXR1ZGUgPCBib3VuZHMuZ2V0U291dGgoKSB8fFxuICAgICAgICAgICAgY29vcmRpbmF0ZXMubGF0aXR1ZGUgPiBib3VuZHMuZ2V0Tm9ydGgoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIF9zZXRFcnJvclN0YXRlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgY2FzZSAnV0FJVElOR19BQ1RJVkUnOlxuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdBQ1RJVkVfRVJST1InO1xuICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZScpO1xuICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQUNUSVZFX0VSUk9SJztcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3InKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAvLyB0dXJuIG1hcmtlciBncmV5XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0JBQ0tHUk9VTkRfRVJST1InO1xuICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kLWVycm9yJyk7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgLy8gdHVybiBtYXJrZXIgZ3JleVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0FDVElWRV9FUlJPUic6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYFVuZXhwZWN0ZWQgd2F0Y2hTdGF0ZSAke3RoaXMuX3dhdGNoU3RhdGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBHZW9sb2NhdGlvbiBBUEkgcmV0dXJucyBhIG5ldyBsb2NhdGlvbiwgdXBkYXRlIHRoZSBHZW9sb2NhdGVDb250cm9sLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb24gdGhlIEdlb2xvY2F0aW9uIEFQSSBQb3NpdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX29uU3VjY2Vzcyhwb3NpdGlvbjogUG9zaXRpb24pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXApIHtcbiAgICAgICAgICAgIC8vIGNvbnRyb2wgaGFzIHNpbmNlIGJlZW4gcmVtb3ZlZFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzT3V0T2ZNYXBNYXhCb3VuZHMocG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRFcnJvclN0YXRlKCk7XG5cbiAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ291dG9mbWF4Ym91bmRzJywgcG9zaXRpb24pKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hcmtlcigpO1xuICAgICAgICAgICAgdGhpcy5fZmluaXNoKCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIC8vIGtlZXAgYSByZWNvcmQgb2YgdGhlIHBvc2l0aW9uIHNvIHRoYXQgaWYgdGhlIHN0YXRlIGlzIEJBQ0tHUk9VTkQgYW5kIHRoZSB1c2VyXG4gICAgICAgICAgICAvLyBjbGlja3MgdGhlIGJ1dHRvbiwgd2UgY2FuIG1vdmUgdG8gQUNUSVZFX0xPQ0sgaW1tZWRpYXRlbHkgd2l0aG91dCB3YWl0aW5nIGZvclxuICAgICAgICAgICAgLy8gd2F0Y2hQb3NpdGlvbiB0byB0cmlnZ2VyIF9vblN1Y2Nlc3NcbiAgICAgICAgICAgIHRoaXMuX2xhc3RLbm93blBvc2l0aW9uID0gcG9zaXRpb247XG5cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fd2F0Y2hTdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSAnV0FJVElOR19BQ1RJVkUnOlxuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0xPQ0snOlxuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0VSUk9SJzpcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0FDVElWRV9MT0NLJztcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUtZXJyb3InKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EJzpcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkRfRVJST1InOlxuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQkFDS0dST1VORCc7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvcicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYFVuZXhwZWN0ZWQgd2F0Y2hTdGF0ZSAke3RoaXMuX3dhdGNoU3RhdGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBzaG93VXNlckxvY2F0aW9uIGFuZCB0aGUgd2F0Y2ggc3RhdGUgaXNuJ3Qgb2ZmIHRoZW4gdXBkYXRlIHRoZSBtYXJrZXIgbG9jYXRpb25cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmIHRoaXMuX3dhdGNoU3RhdGUgIT09ICdPRkYnKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVNYXJrZXIocG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgaW4gbm9ybWFsIG1vZGUgKG5vdCB3YXRjaCBtb2RlKSwgb3IgaWYgaW4gd2F0Y2ggbW9kZSBhbmQgdGhlIHN0YXRlIGlzIGFjdGl2ZSB3YXRjaFxuICAgICAgICAvLyB0aGVuIHVwZGF0ZSB0aGUgY2FtZXJhXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uIHx8IHRoaXMuX3dhdGNoU3RhdGUgPT09ICdBQ1RJVkVfTE9DSycpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNhbWVyYShwb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2RvdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1kb3Qtc3RhbGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2dlb2xvY2F0ZScsIHBvc2l0aW9uKSk7XG4gICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgY2FtZXJhIGxvY2F0aW9uIHRvIGNlbnRlciBvbiB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb3NpdGlvbn0gcG9zaXRpb24gdGhlIEdlb2xvY2F0aW9uIEFQSSBQb3NpdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VwZGF0ZUNhbWVyYShwb3NpdGlvbjogUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgY2VudGVyID0gbmV3IExuZ0xhdChwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlLCBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUpO1xuICAgICAgICBjb25zdCByYWRpdXMgPSBwb3NpdGlvbi5jb29yZHMuYWNjdXJhY3k7XG4gICAgICAgIGNvbnN0IGJlYXJpbmcgPSB0aGlzLl9tYXAuZ2V0QmVhcmluZygpO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gZXh0ZW5kKHtiZWFyaW5nfSwgdGhpcy5vcHRpb25zLmZpdEJvdW5kc09wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX21hcC5maXRCb3VuZHMoY2VudGVyLnRvQm91bmRzKHJhZGl1cyksIG9wdGlvbnMsIHtcbiAgICAgICAgICAgIGdlb2xvY2F0ZVNvdXJjZTogdHJ1ZSAvLyB0YWcgdGhpcyBjYW1lcmEgY2hhbmdlIHNvIGl0IHdvbid0IGNhdXNlIHRoZSBjb250cm9sIHRvIGNoYW5nZSB0byBiYWNrZ3JvdW5kIHN0YXRlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgdXNlciBsb2NhdGlvbiBkb3QgTWFya2VyIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Bvc2l0aW9ufSBbcG9zaXRpb25dIHRoZSBHZW9sb2NhdGlvbiBBUEkgUG9zaXRpb25cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91cGRhdGVNYXJrZXIocG9zaXRpb246ID9Qb3NpdGlvbikge1xuICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbnRlciA9IG5ldyBMbmdMYXQocG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSwgcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlKTtcbiAgICAgICAgICAgIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyLnNldExuZ0xhdChjZW50ZXIpLmFkZFRvKHRoaXMuX21hcCk7XG4gICAgICAgICAgICB0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIuc2V0TG5nTGF0KGNlbnRlcikuYWRkVG8odGhpcy5fbWFwKTtcbiAgICAgICAgICAgIHRoaXMuX2FjY3VyYWN5ID0gcG9zaXRpb24uY29vcmRzLmFjY3VyYWN5O1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckxvY2F0aW9uICYmIHRoaXMub3B0aW9ucy5zaG93QWNjdXJhY3lDaXJjbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDaXJjbGVSYWRpdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlci5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZUNpcmNsZVJhZGl1cygpIHtcbiAgICAgICAgYXNzZXJ0KHRoaXMuX2NpcmNsZUVsZW1lbnQpO1xuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgICAgIGNvbnN0IHRyID0gbWFwLnRyYW5zZm9ybTtcblxuICAgICAgICBjb25zdCBwaXhlbHNQZXJNZXRlciA9IG1lcmNhdG9yWmZyb21BbHRpdHVkZSgxLjAsIHRyLl9jZW50ZXIubGF0KSAqIHRyLndvcmxkU2l6ZTtcbiAgICAgICAgYXNzZXJ0KHBpeGVsc1Blck1ldGVyICE9PSAwLjApO1xuICAgICAgICBjb25zdCBjaXJjbGVEaWFtZXRlciA9IE1hdGguY2VpbCgyLjAgKiB0aGlzLl9hY2N1cmFjeSAqIHBpeGVsc1Blck1ldGVyKTtcblxuICAgICAgICB0aGlzLl9jaXJjbGVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7Y2lyY2xlRGlhbWV0ZXJ9cHhgO1xuICAgICAgICB0aGlzLl9jaXJjbGVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke2NpcmNsZURpYW1ldGVyfXB4YDtcbiAgICB9XG5cbiAgICBfb25ab29tKCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24gJiYgdGhpcy5vcHRpb25zLnNob3dBY2N1cmFjeUNpcmNsZSkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2lyY2xlUmFkaXVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHVzZXIgbG9jYXRpb24gZG90IE1hcmtlciByb3RhdGlvbiB0byB0aGUgY3VycmVudCBoZWFkaW5nXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91cGRhdGVNYXJrZXJSb3RhdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlciAmJiB0eXBlb2YgdGhpcy5faGVhZGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlci5zZXRSb3RhdGlvbih0aGlzLl9oZWFkaW5nKTtcbiAgICAgICAgICAgIHRoaXMuX2RvdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1zaG93LWhlYWRpbmcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2RvdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1zaG93LWhlYWRpbmcnKTtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlci5zZXRSb3RhdGlvbigwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkVycm9yKGVycm9yOiBQb3NpdGlvbkVycm9yKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAvLyBjb250cm9sIGhhcyBzaW5jZSBiZWVuIHJlbW92ZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5jb2RlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgLy8gUEVSTUlTU0lPTl9ERU5JRURcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ09GRic7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLXdhaXRpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gdGhpcy5fbWFwLl9nZXRVSVN0cmluZygnR2VvbG9jYXRlQ29udHJvbC5Mb2NhdGlvbk5vdEF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZCkgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmZpcnN0RWxlbWVudENoaWxkLnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aXRsZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJXYXRjaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IuY29kZSA9PT0gMyAmJiB0aGlzLl9ub1RpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHJlcHJlc2VudHMgYSBmb3JjZWQgZXJyb3Igc3RhdGVcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgdG8gZm9yY2UgaW1tZWRpYXRlIGdlb2xvY2F0aW9uIHdoZW4gYSB3YXRjaCBpcyBhbHJlYWR5IHByZXNlbnRcbiAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzgyMTRcbiAgICAgICAgICAgICAgICAvLyBhbmQgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2dlb2xvY2F0aW9uLWFwaS8jZXhhbXBsZS01LWZvcmNpbmctdGhlLXVzZXItYWdlbnQtdG8tcmV0dXJuLWEtZnJlc2gtY2FjaGVkLXBvc2l0aW9uXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRFcnJvclN0YXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fd2F0Y2hTdGF0ZSAhPT0gJ09GRicgJiYgdGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2RvdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1kb3Qtc3RhbGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ2Vycm9yJywgZXJyb3IpKTtcblxuICAgICAgICB0aGlzLl9maW5pc2goKTtcbiAgICB9XG5cbiAgICBfZmluaXNoKCkge1xuICAgICAgICBpZiAodGhpcy5fdGltZW91dElkKSB7IGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0SWQpOyB9XG4gICAgICAgIHRoaXMuX3RpbWVvdXRJZCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBfc2V0dXBVSShzdXBwb3J0ZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgKGU6IE1vdXNlRXZlbnQpID0+IGUucHJldmVudERlZmF1bHQoKSk7XG4gICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbiA9IERPTS5jcmVhdGUoJ2J1dHRvbicsIGBtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZWAsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIERPTS5jcmVhdGUoJ3NwYW4nLCBgbWFwYm94Z2wtY3RybC1pY29uYCwgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uKS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblxuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24udHlwZSA9ICdidXR0b24nO1xuXG4gICAgICAgIGlmIChzdXBwb3J0ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB3YXJuT25jZSgnR2VvbG9jYXRpb24gc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlIHNvIHRoZSBHZW9sb2NhdGVDb250cm9sIHdpbGwgYmUgZGlzYWJsZWQuJyk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoJ0dlb2xvY2F0ZUNvbnRyb2wuTG9jYXRpb25Ob3RBdmFpbGFibGUnKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGl0bGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZCkgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmZpcnN0RWxlbWVudENoaWxkLnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aXRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMuX21hcC5fZ2V0VUlTdHJpbmcoJ0dlb2xvY2F0ZUNvbnRyb2wuRmluZE15TG9jYXRpb24nKTtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aXRsZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmZpcnN0RWxlbWVudENoaWxkKSB0aGlzLl9nZW9sb2NhdGVCdXR0b24uZmlyc3RFbGVtZW50Q2hpbGQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICdmYWxzZScpO1xuICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdPRkYnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2hlbiBzaG93VXNlckxvY2F0aW9uIGlzIGVuYWJsZWQsIGtlZXAgdGhlIEdlb2xvY2F0ZSBidXR0b24gZGlzYWJsZWQgdW50aWwgdGhlIGRldmljZSBsb2NhdGlvbiBtYXJrZXIgaXMgc2V0dXAgb24gdGhlIG1hcFxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2RvdEVsZW1lbnQgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtdXNlci1sb2NhdGlvbicpO1xuICAgICAgICAgICAgdGhpcy5fZG90RWxlbWVudC5hcHBlbmRDaGlsZChET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1kb3QnKSk7XG4gICAgICAgICAgICB0aGlzLl9kb3RFbGVtZW50LmFwcGVuZENoaWxkKERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC11c2VyLWxvY2F0aW9uLWhlYWRpbmcnKSk7XG5cbiAgICAgICAgICAgIHRoaXMuX3VzZXJMb2NhdGlvbkRvdE1hcmtlciA9IG5ldyBNYXJrZXIoe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuX2RvdEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgcm90YXRpb25BbGlnbm1lbnQ6ICdtYXAnLFxuICAgICAgICAgICAgICAgIHBpdGNoQWxpZ25tZW50OiAnbWFwJ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuX2NpcmNsZUVsZW1lbnQgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtdXNlci1sb2NhdGlvbi1hY2N1cmFjeS1jaXJjbGUnKTtcbiAgICAgICAgICAgIHRoaXMuX2FjY3VyYWN5Q2lyY2xlTWFya2VyID0gbmV3IE1hcmtlcih7ZWxlbWVudDogdGhpcy5fY2lyY2xlRWxlbWVudCwgcGl0Y2hBbGlnbm1lbnQ6ICdtYXAnfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHRoaXMuX3dhdGNoU3RhdGUgPSAnT0ZGJztcblxuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCd6b29tJywgdGhpcy5fb25ab29tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5fc2V0dXAgPSB0cnVlO1xuXG4gICAgICAgIC8vIHdoZW4gdGhlIGNhbWVyYSBpcyBjaGFuZ2VkIChhbmQgaXQncyBub3QgYXMgYSByZXN1bHQgb2YgdGhlIEdlb2xvY2F0aW9uIENvbnRyb2wpIGNoYW5nZVxuICAgICAgICAvLyB0aGUgd2F0Y2ggbW9kZSB0byBiYWNrZ3JvdW5kIHdhdGNoLCBzbyB0aGF0IHRoZSBtYXJrZXIgaXMgdXBkYXRlZCBidXQgbm90IHRoZSBjYW1lcmEuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhY2tVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX21hcC5vbignbW92ZXN0YXJ0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbVJlc2l6ZSA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQgJiYgZXZlbnQub3JpZ2luYWxFdmVudC50eXBlID09PSAncmVzaXplJztcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50Lmdlb2xvY2F0ZVNvdXJjZSAmJiB0aGlzLl93YXRjaFN0YXRlID09PSAnQUNUSVZFX0xPQ0snICYmICFmcm9tUmVzaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnQkFDS0dST1VORCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1iYWNrZ3JvdW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd0cmFja3VzZXJsb2NhdGlvbmVuZCcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICogUHJvZ3JhbW1hdGljYWxseSByZXF1ZXN0IGFuZCBtb3ZlIHRoZSBtYXAgdG8gdGhlIHVzZXIncyBsb2NhdGlvbi5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgIGlmIGNhbGxlZCBiZWZvcmUgY29udHJvbCB3YXMgYWRkZWQgdG8gYSBtYXAsIG90aGVyd2lzZSByZXR1cm5zIGB0cnVlYC5cbiAgICAqIENhbGxlZCBvbiBhIGRldmljZW9yaWVudGF0aW9uIGV2ZW50LlxuICAgICpcbiAgICAqIEBwYXJhbSBkZXZpY2VPcmllbnRhdGlvbkV2ZW50IHtEZXZpY2VPcmllbnRhdGlvbkV2ZW50fVxuICAgICogQHByaXZhdGVcbiAgICAqIEBleGFtcGxlXG4gICAgKiAvLyBJbml0aWFsaXplIHRoZSBHZW9sb2NhdGVDb250cm9sLlxuICAgICogdmFyIGdlb2xvY2F0ZSA9IG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAgICAqICBwb3NpdGlvbk9wdGlvbnM6IHtcbiAgICAqICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogdHJ1ZVxuICAgICogIH0sXG4gICAgKiAgdHJhY2tVc2VyTG9jYXRpb246IHRydWVcbiAgICAqIH0pO1xuICAgICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gICAgKiBtYXAuYWRkQ29udHJvbChnZW9sb2NhdGUpO1xuICAgICogbWFwLm9uKCdsb2FkJywgZnVuY3Rpb24oKSB7XG4gICAgKiAgIGdlb2xvY2F0ZS50cmlnZ2VyKCk7XG4gICAgKiB9KTtcbiAgICAqL1xuICAgIF9vbkRldmljZU9yaWVudGF0aW9uKGRldmljZU9yaWVudGF0aW9uRXZlbnQ6IERldmljZU9yaWVudGF0aW9uRXZlbnQpIHtcbiAgICAgICAgLy8gYWJzb2x1dGUgaXMgdHJ1ZSBpZiB0aGUgb3JpZW50YXRpb24gZGF0YSBpcyBwcm92aWRlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBFYXJ0aCdzIGNvb3JkaW5hdGUgZnJhbWUgYW5kIHRoZSBkZXZpY2UncyBjb29yZGluYXRlIGZyYW1lLCBvciBmYWxzZSBpZiB0aGUgb3JpZW50YXRpb24gZGF0YSBpcyBiZWluZyBwcm92aWRlZCBpbiByZWZlcmVuY2UgdG8gc29tZSBhcmJpdHJhcnksIGRldmljZS1kZXRlcm1pbmVkIGNvb3JkaW5hdGUgZnJhbWUuXG4gICAgICAgIGlmICh0aGlzLl91c2VyTG9jYXRpb25Eb3RNYXJrZXIpIHtcbiAgICAgICAgICAgIGlmIChkZXZpY2VPcmllbnRhdGlvbkV2ZW50LndlYmtpdENvbXBhc3NIZWFkaW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gU2FmYXJpXG4gICAgICAgICAgICAgICAgdGhpcy5faGVhZGluZyA9IGRldmljZU9yaWVudGF0aW9uRXZlbnQud2Via2l0Q29tcGFzc0hlYWRpbmc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZU9yaWVudGF0aW9uRXZlbnQuYWJzb2x1dGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAvLyBub24tU2FmYXJpIGFscGhhIGluY3JlYXNlcyBjb3VudGVyIGNsb2Nrd2lzZSBhcm91bmQgdGhlIHogYXhpc1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWRpbmcgPSBkZXZpY2VPcmllbnRhdGlvbkV2ZW50LmFscGhhICogLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVNYXJrZXJSb3RhdGlvblRocm90dGxlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZ2dlciBhIGdlb2xvY2F0aW9uIGV2ZW50LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBJbml0aWFsaXplIHRoZSBnZW9sb2NhdGUgY29udHJvbC5cbiAgICAgKiBjb25zdCBnZW9sb2NhdGUgPSBuZXcgbWFwYm94Z2wuR2VvbG9jYXRlQ29udHJvbCh7XG4gICAgICogICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICAgICAqICAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiB0cnVlXG4gICAgICogICAgIH0sXG4gICAgICogICAgIHRyYWNrVXNlckxvY2F0aW9uOiB0cnVlXG4gICAgICogfSk7XG4gICAgICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gICAgICogbWFwLmFkZENvbnRyb2woZ2VvbG9jYXRlKTtcbiAgICAgKiBtYXAub24oJ2xvYWQnLCAoKSA9PiB7XG4gICAgICogICAgIGdlb2xvY2F0ZS50cmlnZ2VyKCk7XG4gICAgICogfSk7XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYCBpZiBjYWxsZWQgYmVmb3JlIGNvbnRyb2wgd2FzIGFkZGVkIHRvIGEgbWFwLCBvdGhlcndpc2UgcmV0dXJucyBgdHJ1ZWAuXG4gICAgICovXG4gICAgdHJpZ2dlcigpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR1cCkge1xuICAgICAgICAgICAgd2Fybk9uY2UoJ0dlb2xvY2F0ZSBjb250cm9sIHRyaWdnZXJlZCBiZWZvcmUgYWRkZWQgdG8gYSBtYXAnKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYWNrVXNlckxvY2F0aW9uKSB7XG4gICAgICAgICAgICAvLyB1cGRhdGUgd2F0Y2hTdGF0ZSBhbmQgZG8gYW55IG91dGdvaW5nIHN0YXRlIGNsZWFudXBcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fd2F0Y2hTdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSAnT0ZGJzpcbiAgICAgICAgICAgICAgICAvLyB0dXJuIG9uIHRoZSBHZW9sb2NhdGVDb250cm9sXG4gICAgICAgICAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZSA9ICdXQUlUSU5HX0FDVElWRSc7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUobmV3IEV2ZW50KCd0cmFja3VzZXJsb2NhdGlvbnN0YXJ0JykpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnV0FJVElOR19BQ1RJVkUnOlxuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0xPQ0snOlxuICAgICAgICAgICAgY2FzZSAnQUNUSVZFX0VSUk9SJzpcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkRfRVJST1InOlxuICAgICAgICAgICAgICAgIC8vIHR1cm4gb2ZmIHRoZSBHZW9sb2NhdGUgQ29udHJvbFxuICAgICAgICAgICAgICAgIHRoaXMuX251bWJlck9mV2F0Y2hlcy0tO1xuICAgICAgICAgICAgICAgIHRoaXMuX25vVGltZW91dCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dhdGNoU3RhdGUgPSAnT0ZGJztcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZC1lcnJvcicpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgndHJhY2t1c2VybG9jYXRpb25lbmQnKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCQUNLR1JPVU5EJzpcbiAgICAgICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlID0gJ0FDVElWRV9MT0NLJztcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYmFja2dyb3VuZCcpO1xuICAgICAgICAgICAgICAgIC8vIHNldCBjYW1lcmEgdG8gbGFzdCBrbm93biBsb2NhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sYXN0S25vd25Qb3NpdGlvbikgdGhpcy5fdXBkYXRlQ2FtZXJhKHRoaXMuX2xhc3RLbm93blBvc2l0aW9uKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ3RyYWNrdXNlcmxvY2F0aW9uc3RhcnQnKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYFVuZXhwZWN0ZWQgd2F0Y2hTdGF0ZSAke3RoaXMuX3dhdGNoU3RhdGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluY29taW5nIHN0YXRlIHNldHVwXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3dhdGNoU3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ1dBSVRJTkdfQUNUSVZFJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0FDVElWRV9MT0NLJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBQ1RJVkVfRVJST1InOlxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWFjdGl2ZS1lcnJvcicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQkFDS0dST1VORCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JBQ0tHUk9VTkRfRVJST1InOlxuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1jdHJsLWdlb2xvY2F0ZS13YWl0aW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21hcGJveGdsLWN0cmwtZ2VvbG9jYXRlLWJhY2tncm91bmQtZXJyb3InKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ09GRic6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYFVuZXhwZWN0ZWQgd2F0Y2hTdGF0ZSAke3RoaXMuX3dhdGNoU3RhdGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIG1hbmFnZSBnZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uIC8gZ2VvbG9jYXRpb24uY2xlYXJXYXRjaFxuICAgICAgICAgICAgaWYgKHRoaXMuX3dhdGNoU3RhdGUgPT09ICdPRkYnICYmIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gY2xlYXIgd2F0Y2hQb3NpdGlvbiBhcyB3ZSd2ZSBjaGFuZ2VkIHRvIGFuIE9GRiBzdGF0ZVxuICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyV2F0Y2goKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBlbmFibGUgd2F0Y2hQb3NpdGlvbiBzaW5jZSB3YXRjaFN0YXRlIGlzIG5vdCBPRkYgYW5kIHRoZXJlIGlzIG5vIHdhdGNoUG9zaXRpb24gYWxyZWFkeSBydW5uaW5nXG5cbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsICd0cnVlJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9udW1iZXJPZldhdGNoZXMrKztcbiAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb25PcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9udW1iZXJPZldhdGNoZXMgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT3B0aW9ucyA9IHttYXhpbXVtQWdlOjYwMDAwMCwgdGltZW91dDowfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm9UaW1lb3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk9wdGlvbnMgPSB0aGlzLm9wdGlvbnMucG9zaXRpb25PcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub1RpbWVvdXQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgPSB0aGlzLm9wdGlvbnMuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25TdWNjZXNzLCB0aGlzLl9vbkVycm9yLCBwb3NpdGlvbk9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VXNlckhlYWRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkRGV2aWNlT3JpZW50YXRpb25MaXN0ZW5lcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oXG4gICAgICAgICAgICAgICAgdGhpcy5fb25TdWNjZXNzLCB0aGlzLl9vbkVycm9yLCB0aGlzLm9wdGlvbnMucG9zaXRpb25PcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gVGhpcyB0aW1lb3V0IGVuc3VyZXMgdGhhdCB3ZSBzdGlsbCBjYWxsIGZpbmlzaCgpIGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIGRlY2xpbmVzIHRvIHNoYXJlIHRoZWlyIGxvY2F0aW9uIGluIEZpcmVmb3hcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQodGhpcy5fZmluaXNoLCAxMDAwMCAvKiAxMHNlYyAqLyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfYWRkRGV2aWNlT3JpZW50YXRpb25MaXN0ZW5lcigpIHtcbiAgICAgICAgY29uc3QgYWRkTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoJ29uZGV2aWNlb3JpZW50YXRpb25hYnNvbHV0ZScgaW4gd2luZG93KSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZW9yaWVudGF0aW9uYWJzb2x1dGUnLCB0aGlzLl9vbkRldmljZU9yaWVudGF0aW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZW9yaWVudGF0aW9uJywgdGhpcy5fb25EZXZpY2VPcmllbnRhdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuRGV2aWNlTW90aW9uRXZlbnQgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiB3aW5kb3cuRGV2aWNlTW90aW9uRXZlbnQucmVxdWVzdFBlcm1pc3Npb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICAgIERldmljZU9yaWVudGF0aW9uRXZlbnQucmVxdWVzdFBlcm1pc3Npb24oKVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlID09PSAnZ3JhbnRlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChjb25zb2xlLmVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFkZExpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY2xlYXJXYXRjaCgpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmdlb2xvY2F0aW9uLmNsZWFyV2F0Y2godGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEKTtcblxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZGV2aWNlb3JpZW50YXRpb24nLCB0aGlzLl9vbkRldmljZU9yaWVudGF0aW9uKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RldmljZW9yaWVudGF0aW9uYWJzb2x1dGUnLCB0aGlzLl9vbkRldmljZU9yaWVudGF0aW9uKTtcblxuICAgICAgICB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgPSAodW5kZWZpbmVkOiBhbnkpO1xuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtY3RybC1nZW9sb2NhdGUtd2FpdGluZycpO1xuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCAnZmFsc2UnKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dVc2VyTG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hcmtlcihudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgR2VvbG9jYXRlQ29udHJvbDtcblxuLyogR2VvbG9jYXRlQ29udHJvbCBXYXRjaCBTdGF0ZXNcbiAqIFRoaXMgaXMgdGhlIHByaXZhdGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wuXG4gKlxuICogT0ZGXG4gKiAgICBvZmYvaW5hY3RpdmVcbiAqIFdBSVRJTkdfQUNUSVZFXG4gKiAgICBHZW9sb2NhdGVDb250cm9sIHdhcyBjbGlja2VkIGJ1dCBzdGlsbCB3YWl0aW5nIGZvciBHZW9sb2NhdGlvbiBBUEkgcmVzcG9uc2Ugd2l0aCB1c2VyIGxvY2F0aW9uXG4gKiBBQ1RJVkVfTE9DS1xuICogICAgU2hvd2luZyB0aGUgdXNlciBsb2NhdGlvbiBhcyBhIGRvdCBBTkQgdHJhY2tpbmcgdGhlIGNhbWVyYSB0byBiZSBmaXhlZCB0byB0aGVpciBsb2NhdGlvbi4gSWYgdGhlaXIgbG9jYXRpb24gY2hhbmdlcyB0aGUgbWFwIG1vdmVzIHRvIGZvbGxvdy5cbiAqIEFDVElWRV9FUlJPUlxuICogICAgVGhlcmUgd2FzIGVuIGVycm9yIGZyb20gdGhlIEdlb2xvY2F0aW9uIEFQSSB3aGlsZSB0cnlpbmcgdG8gc2hvdyBhbmQgdHJhY2sgdGhlIHVzZXIgbG9jYXRpb24uXG4gKiBCQUNLR1JPVU5EXG4gKiAgICBTaG93aW5nIHRoZSB1c2VyIGxvY2F0aW9uIGFzIGEgZG90IGJ1dCB0aGUgY2FtZXJhIGRvZXNuJ3QgZm9sbG93IHRoZWlyIGxvY2F0aW9uIGFzIGl0IGNoYW5nZXMuXG4gKiBCQUNLR1JPVU5EX0VSUk9SXG4gKiAgICBUaGVyZSB3YXMgYW4gZXJyb3IgZnJvbSB0aGUgR2VvbG9jYXRpb24gQVBJIHdoaWxlIHRyeWluZyB0byBzaG93IChidXQgbm90IHRyYWNrKSB0aGUgdXNlciBsb2NhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEZpcmVkIG9uIGVhY2ggR2VvbG9jYXRpb24gQVBJIHBvc2l0aW9uIHVwZGF0ZSB0aGF0IHJldHVybmVkIGFzIHN1Y2Nlc3MuXG4gKlxuICogQGV2ZW50IGdlb2xvY2F0ZVxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gZGF0YSBUaGUgcmV0dXJuZWQgW1Bvc2l0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUG9zaXRpb24pIG9iamVjdCBmcm9tIHRoZSBjYWxsYmFjayBpbiBbR2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi9nZXRDdXJyZW50UG9zaXRpb24pIG9yIFtHZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi93YXRjaFBvc2l0aW9uKS5cbiAqIEBleGFtcGxlXG4gKiAvLyBJbml0aWFsaXplIHRoZSBHZW9sb2NhdGVDb250cm9sLlxuICogY29uc3QgZ2VvbG9jYXRlID0gbmV3IG1hcGJveGdsLkdlb2xvY2F0ZUNvbnRyb2woe1xuICogICAgIHBvc2l0aW9uT3B0aW9uczoge1xuICogICAgICAgICBlbmFibGVIaWdoQWNjdXJhY3k6IHRydWVcbiAqICAgICB9LFxuICogICAgIHRyYWNrVXNlckxvY2F0aW9uOiB0cnVlXG4gKiB9KTtcbiAqIC8vIEFkZCB0aGUgY29udHJvbCB0byB0aGUgbWFwLlxuICogbWFwLmFkZENvbnRyb2woZ2VvbG9jYXRlKTtcbiAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IGZpcmVzXG4gKiAvLyB3aGVuIGEgZ2VvbG9jYXRlIGV2ZW50IG9jY3Vycy5cbiAqIGdlb2xvY2F0ZS5vbignZ2VvbG9jYXRlJywgKCkgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKCdBIGdlb2xvY2F0ZSBldmVudCBoYXMgb2NjdXJyZWQuJyk7XG4gKiB9KTtcbiAqXG4gKi9cblxuLyoqXG4gKiBGaXJlZCBvbiBlYWNoIEdlb2xvY2F0aW9uIEFQSSBwb3NpdGlvbiB1cGRhdGUgdGhhdCByZXR1cm5lZCBhcyBhbiBlcnJvci5cbiAqXG4gKiBAZXZlbnQgZXJyb3JcbiAqIEBtZW1iZXJvZiBHZW9sb2NhdGVDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb25FcnJvcn0gZGF0YSBUaGUgcmV0dXJuZWQgW1Bvc2l0aW9uRXJyb3JdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb3NpdGlvbkVycm9yKSBvYmplY3QgZnJvbSB0aGUgY2FsbGJhY2sgaW4gW0dlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbigpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2VvbG9jYXRpb24vZ2V0Q3VycmVudFBvc2l0aW9uKSBvciBbR2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbigpXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvR2VvbG9jYXRpb24vd2F0Y2hQb3NpdGlvbikuXG4gKiBAZXhhbXBsZVxuICogLy8gSW5pdGlhbGl6ZSB0aGUgR2VvbG9jYXRlQ29udHJvbC5cbiAqIGNvbnN0IGdlb2xvY2F0ZSA9IG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAqICAgICBwb3NpdGlvbk9wdGlvbnM6IHtcbiAqICAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiB0cnVlXG4gKiAgICAgfSxcbiAqICAgICB0cmFja1VzZXJMb2NhdGlvbjogdHJ1ZVxuICogfSk7XG4gKiAvLyBBZGQgdGhlIGNvbnRyb2wgdG8gdGhlIG1hcC5cbiAqIG1hcC5hZGRDb250cm9sKGdlb2xvY2F0ZSk7XG4gKiAvLyBTZXQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBmaXJlc1xuICogLy8gd2hlbiBhbiBlcnJvciBldmVudCBvY2N1cnMuXG4gKiBnZW9sb2NhdGUub24oJ2Vycm9yJywgKCkgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKCdBbiBlcnJvciBldmVudCBoYXMgb2NjdXJyZWQuJyk7XG4gKiB9KTtcbiAqXG4gKi9cblxuLyoqXG4gKiBGaXJlZCBvbiBlYWNoIEdlb2xvY2F0aW9uIEFQSSBwb3NpdGlvbiB1cGRhdGUgdGhhdCByZXR1cm5lZCBhcyBzdWNjZXNzIGJ1dCB1c2VyIHBvc2l0aW9uIGlzIG91dCBvZiBtYXAgYG1heEJvdW5kc2AuXG4gKlxuICogQGV2ZW50IG91dG9mbWF4Ym91bmRzXG4gKiBAbWVtYmVyb2YgR2VvbG9jYXRlQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBkYXRhIFRoZSByZXR1cm5lZCBbUG9zaXRpb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Qb3NpdGlvbikgb2JqZWN0IGZyb20gdGhlIGNhbGxiYWNrIGluIFtHZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0dlb2xvY2F0aW9uL2dldEN1cnJlbnRQb3NpdGlvbikgb3IgW0dlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0dlb2xvY2F0aW9uL3dhdGNoUG9zaXRpb24pLlxuICogQGV4YW1wbGVcbiAqIC8vIEluaXRpYWxpemUgdGhlIEdlb2xvY2F0ZUNvbnRyb2wuXG4gKiBjb25zdCBnZW9sb2NhdGUgPSBuZXcgbWFwYm94Z2wuR2VvbG9jYXRlQ29udHJvbCh7XG4gKiAgICAgcG9zaXRpb25PcHRpb25zOiB7XG4gKiAgICAgICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogdHJ1ZVxuICogICAgIH0sXG4gKiAgICAgdHJhY2tVc2VyTG9jYXRpb246IHRydWVcbiAqIH0pO1xuICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gKiBtYXAuYWRkQ29udHJvbChnZW9sb2NhdGUpO1xuICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAqIC8vIHdoZW4gYW4gb3V0b2ZtYXhib3VuZHMgZXZlbnQgb2NjdXJzLlxuICogZ2VvbG9jYXRlLm9uKCdvdXRvZm1heGJvdW5kcycsICgpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZygnQW4gb3V0b2ZtYXhib3VuZHMgZXZlbnQgaGFzIG9jY3VycmVkLicpO1xuICogfSk7XG4gKlxuICovXG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgR2VvbG9jYXRlQ29udHJvbCBjaGFuZ2VzIHRvIHRoZSBhY3RpdmUgbG9jayBzdGF0ZSwgd2hpY2ggaGFwcGVucyBlaXRoZXIgdXBvbiBmaXJzdCBvYnRhaW5pbmcgYSBzdWNjZXNzZnVsIEdlb2xvY2F0aW9uIEFQSSBwb3NpdGlvbiBmb3IgdGhlIHVzZXIgKGEgZ2VvbG9jYXRlIGV2ZW50IHdpbGwgZm9sbG93KSwgb3Igd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGdlb2xvY2F0ZSBidXR0b24gd2hlbiBpbiB0aGUgYmFja2dyb3VuZCBzdGF0ZSwgd2hpY2ggdXNlcyB0aGUgbGFzdCBrbm93biBwb3NpdGlvbiB0byByZWNlbnRlciB0aGUgbWFwIGFuZCBlbnRlciBhY3RpdmUgbG9jayBzdGF0ZSAobm8gZ2VvbG9jYXRlIGV2ZW50IHdpbGwgZm9sbG93IHVubGVzcyB0aGUgdXNlcnMncyBsb2NhdGlvbiBjaGFuZ2VzKS5cbiAqXG4gKiBAZXZlbnQgdHJhY2t1c2VybG9jYXRpb25zdGFydFxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQGV4YW1wbGVcbiAqIC8vIEluaXRpYWxpemUgdGhlIEdlb2xvY2F0ZUNvbnRyb2wuXG4gKiBjb25zdCBnZW9sb2NhdGUgPSBuZXcgbWFwYm94Z2wuR2VvbG9jYXRlQ29udHJvbCh7XG4gKiAgICAgcG9zaXRpb25PcHRpb25zOiB7XG4gKiAgICAgICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogdHJ1ZVxuICogICAgIH0sXG4gKiAgICAgdHJhY2tVc2VyTG9jYXRpb246IHRydWVcbiAqIH0pO1xuICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gKiBtYXAuYWRkQ29udHJvbChnZW9sb2NhdGUpO1xuICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAqIC8vIHdoZW4gYSB0cmFja3VzZXJsb2NhdGlvbnN0YXJ0IGV2ZW50IG9jY3Vycy5cbiAqIGdlb2xvY2F0ZS5vbigndHJhY2t1c2VybG9jYXRpb25zdGFydCcsICgpID0+IHtcbiAqICAgICBjb25zb2xlLmxvZygnQSB0cmFja3VzZXJsb2NhdGlvbnN0YXJ0IGV2ZW50IGhhcyBvY2N1cnJlZC4nKTtcbiAqIH0pO1xuICpcbiAqL1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIEdlb2xvY2F0ZUNvbnRyb2wgY2hhbmdlcyB0byB0aGUgYmFja2dyb3VuZCBzdGF0ZSwgd2hpY2ggaGFwcGVucyB3aGVuIGEgdXNlciBjaGFuZ2VzIHRoZSBjYW1lcmEgZHVyaW5nIGFuIGFjdGl2ZSBwb3NpdGlvbiBsb2NrLiBUaGlzIG9ubHkgYXBwbGllcyB3aGVuIHRyYWNrVXNlckxvY2F0aW9uIGlzIHRydWUuIEluIHRoZSBiYWNrZ3JvdW5kIHN0YXRlLCB0aGUgZG90IG9uIHRoZSBtYXAgd2lsbCB1cGRhdGUgd2l0aCBsb2NhdGlvbiB1cGRhdGVzIGJ1dCB0aGUgY2FtZXJhIHdpbGwgbm90LlxuICpcbiAqIEBldmVudCB0cmFja3VzZXJsb2NhdGlvbmVuZFxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQGV4YW1wbGVcbiAqIC8vIEluaXRpYWxpemUgdGhlIEdlb2xvY2F0ZUNvbnRyb2wuXG4gKiBjb25zdCBnZW9sb2NhdGUgPSBuZXcgbWFwYm94Z2wuR2VvbG9jYXRlQ29udHJvbCh7XG4gKiAgICAgcG9zaXRpb25PcHRpb25zOiB7XG4gKiAgICAgICAgIGVuYWJsZUhpZ2hBY2N1cmFjeTogdHJ1ZVxuICogICAgIH0sXG4gKiAgICAgdHJhY2tVc2VyTG9jYXRpb246IHRydWVcbiAqIH0pO1xuICogLy8gQWRkIHRoZSBjb250cm9sIHRvIHRoZSBtYXAuXG4gKiBtYXAuYWRkQ29udHJvbChnZW9sb2NhdGUpO1xuICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgZmlyZXNcbiAqIC8vIHdoZW4gYSB0cmFja3VzZXJsb2NhdGlvbmVuZCBldmVudCBvY2N1cnMuXG4gKiBnZW9sb2NhdGUub24oJ3RyYWNrdXNlcmxvY2F0aW9uZW5kJywgKCkgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKCdBIHRyYWNrdXNlcmxvY2F0aW9uZW5kIGV2ZW50IGhhcyBvY2N1cnJlZC4nKTtcbiAqIH0pO1xuICpcbiAqL1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0ICogYXMgRE9NIGZyb20gJy4uLy4uL3V0aWwvZG9tLmpzJztcbmltcG9ydCB7ZXh0ZW5kLCBiaW5kQWxsfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuXG5pbXBvcnQgdHlwZSBNYXAsIHtDb250cm9sUG9zaXRpb259IGZyb20gJy4uL21hcC5qcyc7XG5cbnR5cGUgVW5pdCA9ICdpbXBlcmlhbCcgfCAnbWV0cmljJyB8ICduYXV0aWNhbCc7XG5cbnR5cGUgT3B0aW9ucyA9IHtcbiAgICBtYXhXaWR0aD86IG51bWJlcixcbiAgICB1bml0PzogVW5pdDtcbn07XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICAgIG1heFdpZHRoOiAxMDAsXG4gICAgdW5pdDogJ21ldHJpYydcbn07XG5cbi8qKlxuICogQSBgU2NhbGVDb250cm9sYCBjb250cm9sIGRpc3BsYXlzIHRoZSByYXRpbyBvZiBhIGRpc3RhbmNlIG9uIHRoZSBtYXAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGlzdGFuY2Ugb24gdGhlIGdyb3VuZC5cbiAqIEFkZCB0aGlzIGNvbnRyb2wgdG8gYSBtYXAgdXNpbmcge0BsaW5rIE1hcCNhZGRDb250cm9sfS5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2lkdGg9JzEwMCddIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc2NhbGUgY29udHJvbCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudW5pdD0nbWV0cmljJ10gVW5pdCBvZiB0aGUgZGlzdGFuY2UgKGAnaW1wZXJpYWwnYCwgYCdtZXRyaWMnYCBvciBgJ25hdXRpY2FsJ2ApLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNjYWxlID0gbmV3IG1hcGJveGdsLlNjYWxlQ29udHJvbCh7XG4gKiAgICAgbWF4V2lkdGg6IDgwLFxuICogICAgIHVuaXQ6ICdpbXBlcmlhbCdcbiAqIH0pO1xuICogbWFwLmFkZENvbnRyb2woc2NhbGUpO1xuICpcbiAqIHNjYWxlLnNldFVuaXQoJ21ldHJpYycpO1xuICovXG5jbGFzcyBTY2FsZUNvbnRyb2wge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBfbGFuZ3VhZ2U6ID9zdHJpbmc7XG4gICAgb3B0aW9uczogT3B0aW9ucztcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgICAgYmluZEFsbChbXG4gICAgICAgICAgICAnX3VwZGF0ZScsXG4gICAgICAgICAgICAnc2V0VW5pdCdcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFBvc2l0aW9uKCk6IENvbnRyb2xQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiAnYm90dG9tLWxlZnQnO1xuICAgIH1cblxuICAgIF91cGRhdGUoKSB7XG4gICAgICAgIHVwZGF0ZVNjYWxlKHRoaXMuX21hcCwgdGhpcy5fY29udGFpbmVyLCB0aGlzLl9sYW5ndWFnZSwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXA6IE1hcCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9sYW5ndWFnZSA9IG1hcC5nZXRMYW5ndWFnZSgpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLXNjYWxlJywgbWFwLmdldENvbnRhaW5lcigpKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmRpciA9ICdhdXRvJztcblxuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICB0aGlzLl9jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICB0aGlzLl9tYXAgPSAodW5kZWZpbmVkOiBhbnkpO1xuICAgIH1cblxuICAgIF9zZXRMYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgc2NhbGUncyB1bml0IG9mIHRoZSBkaXN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7J2ltcGVyaWFsJyB8ICdtZXRyaWMnIHwgJ25hdXRpY2FsJ30gdW5pdCBVbml0IG9mIHRoZSBkaXN0YW5jZSAoYCdpbXBlcmlhbCdgLCBgJ21ldHJpYydgIG9yIGAnbmF1dGljYWwnYCkuXG4gICAgICovXG4gICAgc2V0VW5pdCh1bml0OiBVbml0KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy51bml0ID0gdW5pdDtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTY2FsZUNvbnRyb2w7XG5cbmZ1bmN0aW9uIHVwZGF0ZVNjYWxlKG1hcCwgY29udGFpbmVyLCBsYW5ndWFnZSwgb3B0aW9ucykge1xuICAgIC8vIEEgaG9yaXpvbnRhbCBzY2FsZSBpcyBpbWFnaW5lZCB0byBiZSBwcmVzZW50IGF0IGNlbnRlciBvZiB0aGUgbWFwXG4gICAgLy8gY29udGFpbmVyIHdpdGggbWF4aW11bSBsZW5ndGggKERlZmF1bHQpIGFzIDEwMHB4LlxuICAgIC8vIFVzaW5nIHNwaGVyaWNhbCBsYXcgb2YgY29zaW5lcyBhcHByb3hpbWF0aW9uLCB0aGUgcmVhbCBkaXN0YW5jZSBpc1xuICAgIC8vIGZvdW5kIGJldHdlZW4gdGhlIHR3byBjb29yZGluYXRlcy5cbiAgICBjb25zdCBtYXhXaWR0aCA9IChvcHRpb25zICYmIG9wdGlvbnMubWF4V2lkdGgpIHx8IDEwMDtcblxuICAgIGNvbnN0IHkgPSBtYXAuX2NvbnRhaW5lckhlaWdodCAvIDI7XG4gICAgY29uc3QgeCA9IChtYXAuX2NvbnRhaW5lcldpZHRoIC8gMikgLSBtYXhXaWR0aCAvIDI7XG4gICAgY29uc3QgbGVmdCA9IG1hcC51bnByb2plY3QoW3gsIHldKTtcbiAgICBjb25zdCByaWdodCA9IG1hcC51bnByb2plY3QoW3ggKyBtYXhXaWR0aCwgeV0pO1xuICAgIGNvbnN0IG1heE1ldGVycyA9IGxlZnQuZGlzdGFuY2VUbyhyaWdodCk7XG4gICAgLy8gVGhlIHJlYWwgZGlzdGFuY2UgY29ycmVzcG9uZGluZyB0byAxMDBweCBzY2FsZSBsZW5ndGggaXMgcm91bmRlZCBvZmYgdG9cbiAgICAvLyBuZWFyIHByZXR0eSBudW1iZXIgYW5kIHRoZSBzY2FsZSBsZW5ndGggZm9yIHRoZSBzYW1lIGlzIGZvdW5kIG91dC5cbiAgICAvLyBEZWZhdWx0IHVuaXQgb2YgdGhlIHNjYWxlIGlzIGJhc2VkIG9uIFVzZXIncyBsb2NhbGUuXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy51bml0ID09PSAnaW1wZXJpYWwnKSB7XG4gICAgICAgIGNvbnN0IG1heEZlZXQgPSAzLjI4MDggKiBtYXhNZXRlcnM7XG4gICAgICAgIGlmIChtYXhGZWV0ID4gNTI4MCkge1xuICAgICAgICAgICAgY29uc3QgbWF4TWlsZXMgPSBtYXhGZWV0IC8gNTI4MDtcbiAgICAgICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heE1pbGVzLCBsYW5ndWFnZSwgJ21pbGUnLCBtYXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0U2NhbGUoY29udGFpbmVyLCBtYXhXaWR0aCwgbWF4RmVldCwgbGFuZ3VhZ2UsICdmb290JywgbWFwKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnVuaXQgPT09ICduYXV0aWNhbCcpIHtcbiAgICAgICAgY29uc3QgbWF4TmF1dGljYWxzID0gbWF4TWV0ZXJzIC8gMTg1MjtcbiAgICAgICAgc2V0U2NhbGUoY29udGFpbmVyLCBtYXhXaWR0aCwgbWF4TmF1dGljYWxzLCBsYW5ndWFnZSwgJ25hdXRpY2FsLW1pbGUnLCBtYXApO1xuICAgIH0gZWxzZSBpZiAobWF4TWV0ZXJzID49IDEwMDApIHtcbiAgICAgICAgc2V0U2NhbGUoY29udGFpbmVyLCBtYXhXaWR0aCwgbWF4TWV0ZXJzIC8gMTAwMCwgbGFuZ3VhZ2UsICdraWxvbWV0ZXInLCBtYXApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFNjYWxlKGNvbnRhaW5lciwgbWF4V2lkdGgsIG1heE1ldGVycywgbGFuZ3VhZ2UsICdtZXRlcicsIG1hcCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhEaXN0YW5jZSwgbGFuZ3VhZ2UsIHVuaXQsIG1hcCkge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gZ2V0Um91bmROdW0obWF4RGlzdGFuY2UpO1xuICAgIGNvbnN0IHJhdGlvID0gZGlzdGFuY2UgLyBtYXhEaXN0YW5jZTtcblxuICAgIG1hcC5fcmVxdWVzdERvbVRhc2soKCkgPT4ge1xuICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBgJHttYXhXaWR0aCAqIHJhdGlvfXB4YDtcblxuICAgICAgICAvLyBJbnRsLk51bWJlckZvcm1hdCBkb2Vzbid0IHN1cHBvcnQgbmF1dGljYWwtbWlsZSBhcyBhIHVuaXQsXG4gICAgICAgIC8vIHNvIHdlIGFyZSBoYXJkY29kaW5nIGBubWAgYXMgYSB1bml0IHN5bWJvbCBmb3IgYWxsIGxvY2FsZXNcbiAgICAgICAgaWYgKHVuaXQgPT09ICduYXV0aWNhbC1taWxlJykge1xuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGAke2Rpc3RhbmNlfSZuYnNwO25tYDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vICRGbG93Rml4TWUg4oCUIGZsb3cgdjAuMTQyLjAgZG9lc24ndCBzdXBwb3J0IG9wdGlvbmFsIGBsb2NhbGVzYCBhcmd1bWVudCBhbmQgYHVuaXRgIHN0eWxlIG9wdGlvblxuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxhbmd1YWdlLCB7c3R5bGU6ICd1bml0JywgdW5pdERpc3BsYXk6ICduYXJyb3cnLCB1bml0fSkuZm9ybWF0KGRpc3RhbmNlKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjaW1hbFJvdW5kTnVtKGQpIHtcbiAgICBjb25zdCBtdWx0aXBsaWVyID0gTWF0aC5wb3coMTAsIE1hdGguY2VpbCgtTWF0aC5sb2coZCkgLyBNYXRoLkxOMTApKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChkICogbXVsdGlwbGllcikgLyBtdWx0aXBsaWVyO1xufVxuXG5mdW5jdGlvbiBnZXRSb3VuZE51bShudW0pIHtcbiAgICBjb25zdCBwb3cxMCA9IE1hdGgucG93KDEwLCAoYCR7TWF0aC5mbG9vcihudW0pfWApLmxlbmd0aCAtIDEpO1xuICAgIGxldCBkID0gbnVtIC8gcG93MTA7XG5cbiAgICBkID0gZCA+PSAxMCA/IDEwIDpcbiAgICAgICAgZCA+PSA1ID8gNSA6XG4gICAgICAgIGQgPj0gMyA/IDMgOlxuICAgICAgICBkID49IDIgPyAyIDpcbiAgICAgICAgZCA+PSAxID8gMSA6IGdldERlY2ltYWxSb3VuZE51bShkKTtcblxuICAgIHJldHVybiBwb3cxMCAqIGQ7XG59XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgKiBhcyBET00gZnJvbSAnLi4vLi4vdXRpbC9kb20uanMnO1xuXG5pbXBvcnQge2JpbmRBbGwsIHdhcm5PbmNlfSBmcm9tICcuLi8uLi91dGlsL3V0aWwuanMnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICcuLi8uLi91dGlsL3dpbmRvdy5qcyc7XG5cbmltcG9ydCB0eXBlIE1hcCBmcm9tICcuLi9tYXAuanMnO1xuXG50eXBlIE9wdGlvbnMgPSB7XG4gICAgY29udGFpbmVyPzogSFRNTEVsZW1lbnRcbn07XG5cbi8qKlxuICogQSBgRnVsbHNjcmVlbkNvbnRyb2xgIGNvbnRyb2wgY29udGFpbnMgYSBidXR0b24gZm9yIHRvZ2dsaW5nIHRoZSBtYXAgaW4gYW5kIG91dCBvZiBmdWxsc2NyZWVuIG1vZGUuIFNlZSB0aGUgYHJlcXVlc3RGdWxsU2NyZWVuYCBbY29tcGF0aWJpbGl0eSB0YWJsZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvcmVxdWVzdEZ1bGxTY3JlZW4jYnJvd3Nlcl9jb21wYXRpYmlsaXR5KSBmb3Igc3VwcG9ydGVkIGJyb3dzZXJzLlxuICogQWRkIHRoaXMgY29udHJvbCB0byBhIG1hcCB1c2luZyB7QGxpbmsgTWFwI2FkZENvbnRyb2x9LlxuICpcbiAqIEBpbXBsZW1lbnRzIHtJQ29udHJvbH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IFtvcHRpb25zLmNvbnRhaW5lcl0gYGNvbnRhaW5lcmAgaXMgdGhlIFtjb21wYXRpYmxlIERPTSBlbGVtZW50XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9yZXF1ZXN0RnVsbFNjcmVlbiNDb21wYXRpYmxlX2VsZW1lbnRzKSB3aGljaCBzaG91bGQgYmUgbWFkZSBmdWxsIHNjcmVlbi4gQnkgZGVmYXVsdCwgdGhlIG1hcCBjb250YWluZXIgZWxlbWVudCB3aWxsIGJlIG1hZGUgZnVsbCBzY3JlZW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5GdWxsc2NyZWVuQ29udHJvbCh7Y29udGFpbmVyOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jyl9KSk7XG4gKiBAc2VlIFtFeGFtcGxlOiBWaWV3IGEgZnVsbHNjcmVlbiBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZnVsbHNjcmVlbi8pXG4gKi9cblxuY2xhc3MgRnVsbHNjcmVlbkNvbnRyb2wge1xuICAgIF9tYXA6IE1hcDtcbiAgICBfY29udHJvbENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgX2Z1bGxzY3JlZW46IGJvb2xlYW47XG4gICAgX2Z1bGxzY3JlZW5jaGFuZ2U6IHN0cmluZztcbiAgICBfZnVsbHNjcmVlbkJ1dHRvbjogSFRNTEVsZW1lbnQ7XG4gICAgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Z1bGxzY3JlZW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jb250YWluZXIpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRhaW5lciBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3YXJuT25jZSgnRnVsbCBzY3JlZW4gY29udHJvbCBcXCdjb250YWluZXJcXCcgbXVzdCBiZSBhIERPTSBlbGVtZW50LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJpbmRBbGwoW1xuICAgICAgICAgICAgJ19vbkNsaWNrRnVsbHNjcmVlbicsXG4gICAgICAgICAgICAnX2NoYW5nZUljb24nXG4gICAgICAgIF0sIHRoaXMpO1xuICAgICAgICBpZiAoJ29uZnVsbHNjcmVlbmNoYW5nZScgaW4gd2luZG93LmRvY3VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9mdWxsc2NyZWVuY2hhbmdlID0gJ2Z1bGxzY3JlZW5jaGFuZ2UnO1xuICAgICAgICB9IGVsc2UgaWYgKCdvbndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnIGluIHdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbmNoYW5nZSA9ICd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQWRkKG1hcDogTWFwKTogSFRNTEVsZW1lbnQge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyKSB0aGlzLl9jb250YWluZXIgPSB0aGlzLl9tYXAuZ2V0Q29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMuX2NvbnRyb2xDb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCBgbWFwYm94Z2wtY3RybCBtYXBib3hnbC1jdHJsLWdyb3VwYCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGVja0Z1bGxzY3JlZW5TdXBwb3J0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHVwVUkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHdhcm5PbmNlKCdUaGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGZ1bGxzY3JlZW4gbW9kZS4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udHJvbENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5fY29udHJvbENvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5fbWFwID0gKG51bGw6IGFueSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UsIHRoaXMuX2NoYW5nZUljb24pO1xuICAgIH1cblxuICAgIF9jaGVja0Z1bGxzY3JlZW5TdXBwb3J0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISEoXG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuZnVsbHNjcmVlbkVuYWJsZWQgfHxcbiAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkud2Via2l0RnVsbHNjcmVlbkVuYWJsZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBfc2V0dXBVSSgpIHtcbiAgICAgICAgY29uc3QgYnV0dG9uID0gdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbiA9IERPTS5jcmVhdGUoJ2J1dHRvbicsIChgbWFwYm94Z2wtY3RybC1mdWxsc2NyZWVuYCksIHRoaXMuX2NvbnRyb2xDb250YWluZXIpO1xuICAgICAgICBET00uY3JlYXRlKCdzcGFuJywgYG1hcGJveGdsLWN0cmwtaWNvbmAsIGJ1dHRvbikuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgICAgIGJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVRpdGxlKCk7XG4gICAgICAgIHRoaXMuX2Z1bGxzY3JlZW5CdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrRnVsbHNjcmVlbik7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuX2Z1bGxzY3JlZW5jaGFuZ2UsIHRoaXMuX2NoYW5nZUljb24pO1xuICAgIH1cblxuICAgIF91cGRhdGVUaXRsZSgpIHtcbiAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLl9nZXRUaXRsZSgpO1xuICAgICAgICB0aGlzLl9mdWxsc2NyZWVuQnV0dG9uLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdGl0bGUpO1xuICAgICAgICBpZiAodGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZCkgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5maXJzdEVsZW1lbnRDaGlsZC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGl0bGUpO1xuICAgIH1cblxuICAgIF9nZXRUaXRsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLl9nZXRVSVN0cmluZyh0aGlzLl9pc0Z1bGxzY3JlZW4oKSA/ICdGdWxsc2NyZWVuQ29udHJvbC5FeGl0JyA6ICdGdWxsc2NyZWVuQ29udHJvbC5FbnRlcicpO1xuICAgIH1cblxuICAgIF9pc0Z1bGxzY3JlZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mdWxsc2NyZWVuO1xuICAgIH1cblxuICAgIF9jaGFuZ2VJY29uKCkge1xuICAgICAgICBjb25zdCBmdWxsc2NyZWVuRWxlbWVudCA9XG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKChmdWxsc2NyZWVuRWxlbWVudCA9PT0gdGhpcy5fY29udGFpbmVyKSAhPT0gdGhpcy5fZnVsbHNjcmVlbikge1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbiA9ICF0aGlzLl9mdWxsc2NyZWVuO1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKGBtYXBib3hnbC1jdHJsLXNocmlua2ApO1xuICAgICAgICAgICAgdGhpcy5fZnVsbHNjcmVlbkJ1dHRvbi5jbGFzc0xpc3QudG9nZ2xlKGBtYXBib3hnbC1jdHJsLWZ1bGxzY3JlZW5gKTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRpdGxlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25DbGlja0Z1bGxzY3JlZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Z1bGxzY3JlZW4oKSkge1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5kb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgICh3aW5kb3cuZG9jdW1lbnQ6IGFueSkuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LmRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAod2luZG93LmRvY3VtZW50OiBhbnkpLndlYmtpdENhbmNlbEZ1bGxTY3JlZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jb250YWluZXIucmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLl9jb250YWluZXI6IGFueSkud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICh0aGlzLl9jb250YWluZXI6IGFueSkud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRnVsbHNjcmVlbkNvbnRyb2w7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge2V4dGVuZCwgYmluZEFsbH0gZnJvbSAnLi4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7RXZlbnQsIEV2ZW50ZWR9IGZyb20gJy4uL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQge01hcE1vdXNlRXZlbnR9IGZyb20gJy4uL3VpL2V2ZW50cy5qcyc7XG5pbXBvcnQgKiBhcyBET00gZnJvbSAnLi4vdXRpbC9kb20uanMnO1xuaW1wb3J0IExuZ0xhdCBmcm9tICcuLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgd2luZG93IGZyb20gJy4uL3V0aWwvd2luZG93LmpzJztcbmltcG9ydCBzbWFydFdyYXAgZnJvbSAnLi4vdXRpbC9zbWFydF93cmFwLmpzJztcbmltcG9ydCB7dHlwZSBBbmNob3IsIGFuY2hvclRyYW5zbGF0ZX0gZnJvbSAnLi9hbmNob3IuanMnO1xuaW1wb3J0IHtpc0xuZ0xhdEJlaGluZEdsb2JlfSBmcm9tICcuLi9nZW8vcHJvamVjdGlvbi9nbG9iZV91dGlsLmpzJztcblxuaW1wb3J0IHR5cGUgTWFwIGZyb20gJy4vbWFwLmpzJztcbmltcG9ydCB0eXBlIHtMbmdMYXRMaWtlfSBmcm9tICcuLi9nZW8vbG5nX2xhdC5qcyc7XG5pbXBvcnQgdHlwZSB7UG9pbnRMaWtlfSBmcm9tICdAbWFwYm94L3BvaW50LWdlb21ldHJ5JztcbmltcG9ydCB0eXBlIE1hcmtlciBmcm9tICcuL21hcmtlci5qcyc7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIGNsb3NlQnV0dG9uOiB0cnVlLFxuICAgIGNsb3NlT25DbGljazogdHJ1ZSxcbiAgICBmb2N1c0FmdGVyT3BlbjogdHJ1ZSxcbiAgICBjbGFzc05hbWU6ICcnLFxuICAgIG1heFdpZHRoOiBcIjI0MHB4XCJcbn07XG5cbmV4cG9ydCB0eXBlIE9mZnNldCA9IG51bWJlciB8IFBvaW50TGlrZSB8IHtbXzogQW5jaG9yXTogUG9pbnRMaWtlfTtcblxuZXhwb3J0IHR5cGUgUG9wdXBPcHRpb25zID0ge1xuICAgIGNsb3NlQnV0dG9uPzogYm9vbGVhbixcbiAgICBjbG9zZU9uQ2xpY2s/OiBib29sZWFuLFxuICAgIGNsb3NlT25Nb3ZlPzogYm9vbGVhbixcbiAgICBmb2N1c0FmdGVyT3Blbj86IGJvb2xlYW4sXG4gICAgYW5jaG9yPzogQW5jaG9yLFxuICAgIG9mZnNldD86IE9mZnNldCxcbiAgICBjbGFzc05hbWU/OiBzdHJpbmcsXG4gICAgbWF4V2lkdGg/OiBzdHJpbmdcbn07XG5cbmNvbnN0IGZvY3VzUXVlcnlTZWxlY3RvciA9IFtcbiAgICBcImFbaHJlZl1cIixcbiAgICBcIlt0YWJpbmRleF06bm90KFt0YWJpbmRleD0nLTEnXSlcIixcbiAgICBcIltjb250ZW50ZWRpdGFibGVdOm5vdChbY29udGVudGVkaXRhYmxlPSdmYWxzZSddKVwiLFxuICAgIFwiYnV0dG9uOm5vdChbZGlzYWJsZWRdKVwiLFxuICAgIFwiaW5wdXQ6bm90KFtkaXNhYmxlZF0pXCIsXG4gICAgXCJzZWxlY3Q6bm90KFtkaXNhYmxlZF0pXCIsXG4gICAgXCJ0ZXh0YXJlYTpub3QoW2Rpc2FibGVkXSlcIixcbl0uam9pbihcIiwgXCIpO1xuXG4vKipcbiAqIEEgcG9wdXAgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2xvc2VCdXR0b249dHJ1ZV0gSWYgYHRydWVgLCBhIGNsb3NlIGJ1dHRvbiB3aWxsIGFwcGVhciBpbiB0aGVcbiAqICAgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgcG9wdXAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNsb3NlT25DbGljaz10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBwb3B1cCB3aWxsIGNsb3NlIHdoZW4gdGhlXG4gKiAgIG1hcCBpcyBjbGlja2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jbG9zZU9uTW92ZT1mYWxzZV0gSWYgYHRydWVgLCB0aGUgcG9wdXAgd2lsbCBjbG9zZSB3aGVuIHRoZVxuICogICBtYXAgbW92ZXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZvY3VzQWZ0ZXJPcGVuPXRydWVdIElmIGB0cnVlYCwgdGhlIHBvcHVwIHdpbGwgdHJ5IHRvIGZvY3VzIHRoZVxuICogICBmaXJzdCBmb2N1c2FibGUgZWxlbWVudCBpbnNpZGUgdGhlIHBvcHVwLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmFuY2hvcl0gLSBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBwYXJ0IG9mIHRoZSBwb3B1cCB0aGF0IHNob3VsZFxuICogICBiZSBwb3NpdGlvbmVkIGNsb3Nlc3QgdG8gdGhlIGNvb3JkaW5hdGUsIHNldCB2aWEge0BsaW5rIFBvcHVwI3NldExuZ0xhdH0uXG4gKiAgIE9wdGlvbnMgYXJlIGAnY2VudGVyJ2AsIGAndG9wJ2AsIGAnYm90dG9tJ2AsIGAnbGVmdCdgLCBgJ3JpZ2h0J2AsIGAndG9wLWxlZnQnYCxcbiAqICAgYCd0b3AtcmlnaHQnYCwgYCdib3R0b20tbGVmdCdgLCBhbmQgYCdib3R0b20tcmlnaHQnYC4gSWYgdW5zZXQsIHRoZSBhbmNob3Igd2lsbCBiZVxuICogICBkeW5hbWljYWxseSBzZXQgdG8gZW5zdXJlIHRoZSBwb3B1cCBmYWxscyB3aXRoaW4gdGhlIG1hcCBjb250YWluZXIgd2l0aCBhIHByZWZlcmVuY2VcbiAqICAgZm9yIGAnYm90dG9tJ2AuXG4gKiBAcGFyYW0ge251bWJlciB8IFBvaW50TGlrZSB8IE9iamVjdH0gW29wdGlvbnMub2Zmc2V0XSAtXG4gKiAgQSBwaXhlbCBvZmZzZXQgYXBwbGllZCB0byB0aGUgcG9wdXAncyBsb2NhdGlvbiBzcGVjaWZpZWQgYXM6XG4gKiAgIC0gYSBzaW5nbGUgbnVtYmVyIHNwZWNpZnlpbmcgYSBkaXN0YW5jZSBmcm9tIHRoZSBwb3B1cCdzIGxvY2F0aW9uXG4gKiAgIC0gYSB7QGxpbmsgUG9pbnRMaWtlfSBzcGVjaWZ5aW5nIGEgY29uc3RhbnQgb2Zmc2V0XG4gKiAgIC0gYW4gb2JqZWN0IG9mIHtAbGluayBQb2ludH1zIHNwZWNpZmluZyBhbiBvZmZzZXQgZm9yIGVhY2ggYW5jaG9yIHBvc2l0aW9uLlxuICpcbiAqICBOZWdhdGl2ZSBvZmZzZXRzIGluZGljYXRlIGxlZnQgYW5kIHVwLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNsYXNzTmFtZV0gU3BhY2Utc2VwYXJhdGVkIENTUyBjbGFzcyBuYW1lcyB0byBhZGQgdG8gcG9wdXAgY29udGFpbmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1heFdpZHRoPScyNDBweCddIC1cbiAqICBBIHN0cmluZyB0aGF0IHNldHMgdGhlIENTUyBwcm9wZXJ0eSBvZiB0aGUgcG9wdXAncyBtYXhpbXVtIHdpZHRoIChmb3IgZXhhbXBsZSwgYCczMDBweCdgKS5cbiAqICBUbyBlbnN1cmUgdGhlIHBvcHVwIHJlc2l6ZXMgdG8gZml0IGl0cyBjb250ZW50LCBzZXQgdGhpcyBwcm9wZXJ0eSB0byBgJ25vbmUnYC5cbiAqICBTZWUgdGhlIE1ETiBkb2N1bWVudGF0aW9uIGZvciB0aGUgbGlzdCBvZiBbYXZhaWxhYmxlIHZhbHVlc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL21heC13aWR0aCkuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgbWFya2VySGVpZ2h0ID0gNTA7XG4gKiBjb25zdCBtYXJrZXJSYWRpdXMgPSAxMDtcbiAqIGNvbnN0IGxpbmVhck9mZnNldCA9IDI1O1xuICogY29uc3QgcG9wdXBPZmZzZXRzID0ge1xuICogICAgICd0b3AnOiBbMCwgMF0sXG4gKiAgICAgJ3RvcC1sZWZ0JzogWzAsIDBdLFxuICogICAgICd0b3AtcmlnaHQnOiBbMCwgMF0sXG4gKiAgICAgJ2JvdHRvbSc6IFswLCAtbWFya2VySGVpZ2h0XSxcbiAqICAgICAnYm90dG9tLWxlZnQnOiBbbGluZWFyT2Zmc2V0LCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzICsgbGluZWFyT2Zmc2V0KSAqIC0xXSxcbiAqICAgICAnYm90dG9tLXJpZ2h0JzogWy1saW5lYXJPZmZzZXQsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMgKyBsaW5lYXJPZmZzZXQpICogLTFdLFxuICogICAgICdsZWZ0JzogW21hcmtlclJhZGl1cywgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cykgKiAtMV0sXG4gKiAgICAgJ3JpZ2h0JzogWy1tYXJrZXJSYWRpdXMsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMpICogLTFdXG4gKiB9O1xuICogY29uc3QgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoe29mZnNldDogcG9wdXBPZmZzZXRzLCBjbGFzc05hbWU6ICdteS1jbGFzcyd9KVxuICogICAgIC5zZXRMbmdMYXQoZS5sbmdMYXQpXG4gKiAgICAgLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIilcbiAqICAgICAuc2V0TWF4V2lkdGgoXCIzMDBweFwiKVxuICogICAgIC5hZGRUbyhtYXApO1xuICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLylcbiAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgYSBwb3B1cCBvbiBob3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gKiBAc2VlIFtFeGFtcGxlOiBEaXNwbGF5IGEgcG9wdXAgb24gY2xpY2tdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24tY2xpY2svKVxuICogQHNlZSBbRXhhbXBsZTogQXR0YWNoIGEgcG9wdXAgdG8gYSBtYXJrZXIgaW5zdGFuY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2V0LXBvcHVwLylcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9wdXAgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBfbWFwOiA/TWFwO1xuICAgIG9wdGlvbnM6IFBvcHVwT3B0aW9ucztcbiAgICBfY29udGVudDogP0hUTUxFbGVtZW50O1xuICAgIF9jb250YWluZXI6ID9IVE1MRWxlbWVudDtcbiAgICBfY2xvc2VCdXR0b246ID9IVE1MRWxlbWVudDtcbiAgICBfdGlwOiA/SFRNTEVsZW1lbnQ7XG4gICAgX2xuZ0xhdDogTG5nTGF0O1xuICAgIF90cmFja1BvaW50ZXI6IGJvb2xlYW47XG4gICAgX3BvczogP1BvaW50O1xuICAgIF9hbmNob3I6IEFuY2hvcjtcbiAgICBfY2xhc3NMaXN0OiBTZXQ8c3RyaW5nPjtcbiAgICBfbWFya2VyOiA/TWFya2VyO1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUG9wdXBPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKGRlZmF1bHRPcHRpb25zKSwgb3B0aW9ucyk7XG4gICAgICAgIGJpbmRBbGwoWydfdXBkYXRlJywgJ19vbkNsb3NlJywgJ3JlbW92ZScsICdfb25Nb3VzZUV2ZW50J10sIHRoaXMpO1xuICAgICAgICB0aGlzLl9jbGFzc0xpc3QgPSBuZXcgU2V0KG9wdGlvbnMgJiYgb3B0aW9ucy5jbGFzc05hbWUgP1xuICAgICAgICAgICAgb3B0aW9ucy5jbGFzc05hbWUudHJpbSgpLnNwbGl0KC9cXHMrLykgOiBbXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgcG9wdXAgdG8gYSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXBib3ggR0wgSlMgbWFwIHRvIGFkZCB0aGUgcG9wdXAgdG8uXG4gICAgICogQHJldHVybnMge1BvcHVwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgICAgLnNldExuZ0xhdChbMCwgMF0pXG4gICAgICogICAgIC5zZXRIVE1MKFwiPGgxPk51bGwgSXNsYW5kPC9oMT5cIilcbiAgICAgKiAgICAgLmFkZFRvKG1hcCk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwIG9uIGhvdmVyXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwIG9uIGNsaWNrXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1jbGljay8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogU2hvdyBwb2x5Z29uIGluZm9ybWF0aW9uIG9uIGNsaWNrXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb2x5Z29uLXBvcHVwLW9uLWNsaWNrLylcbiAgICAgKi9cbiAgICBhZGRUbyhtYXA6IE1hcCk6IHRoaXMge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB0aGlzLnJlbW92ZSgpO1xuXG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZU9uQ2xpY2spIHtcbiAgICAgICAgICAgIG1hcC5vbigncHJlY2xpY2snLCB0aGlzLl9vbkNsb3NlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VPbk1vdmUpIHtcbiAgICAgICAgICAgIG1hcC5vbignbW92ZScsIHRoaXMuX29uQ2xvc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFwLm9uKCdyZW1vdmUnLCB0aGlzLnJlbW92ZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICB0aGlzLl9mb2N1c0ZpcnN0RWxlbWVudCgpO1xuXG4gICAgICAgIGlmICh0aGlzLl90cmFja1BvaW50ZXIpIHtcbiAgICAgICAgICAgIG1hcC5vbignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3VzZUV2ZW50KTtcbiAgICAgICAgICAgIG1hcC5vbignbW91c2V1cCcsIHRoaXMuX29uTW91c2VFdmVudCk7XG4gICAgICAgICAgICBtYXAuX2NhbnZhc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC10cmFjay1wb2ludGVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIHBvcHVwIGlzIG9wZW5lZCBtYW51YWxseSBvciBwcm9ncmFtYXRpY2FsbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBvcGVuXG4gICAgICAgICAqIEBtZW1iZXJvZiBQb3B1cFxuICAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAgICogQHByb3BlcnR5IHtQb3B1cH0gcG9wdXAgT2JqZWN0IHRoYXQgd2FzIG9wZW5lZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICogLy8gQ3JlYXRlIGEgcG9wdXBcbiAgICAgICAgICogY29uc3QgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKTtcbiAgICAgICAgICogLy8gU2V0IGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBmaXJlXG4gICAgICAgICAqIC8vIGFueSB0aW1lIHRoZSBwb3B1cCBpcyBvcGVuZWRcbiAgICAgICAgICogcG9wdXAub24oJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgICAqICAgICBjb25zb2xlLmxvZygncG9wdXAgd2FzIG9wZW5lZCcpO1xuICAgICAgICAgKiB9KTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlyZShuZXcgRXZlbnQoJ29wZW4nKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgcG9wdXAgaXMgb3Blbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHBvcHVwIGlzIG9wZW4sIGBmYWxzZWAgaWYgaXQgaXMgY2xvc2VkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgaXNQb3B1cE9wZW4gPSBwb3B1cC5pc09wZW4oKTtcbiAgICAgKi9cbiAgICBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX21hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBwb3B1cCBmcm9tIHRoZSBtYXAgaXQgaGFzIGJlZW4gYWRkZWQgdG8uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKCkuYWRkVG8obWFwKTtcbiAgICAgKiBwb3B1cC5yZW1vdmUoKTtcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICovXG4gICAgcmVtb3ZlKCk6IHRoaXMge1xuICAgICAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5fY29udGVudC5yZW1vdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgaWYgKG1hcCkge1xuICAgICAgICAgICAgbWFwLm9mZignbW92ZScsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgICAgICBtYXAub2ZmKCdtb3ZlJywgdGhpcy5fb25DbG9zZSk7XG4gICAgICAgICAgICBtYXAub2ZmKCdwcmVjbGljaycsIHRoaXMuX29uQ2xvc2UpO1xuICAgICAgICAgICAgbWFwLm9mZignY2xpY2snLCB0aGlzLl9vbkNsb3NlKTtcbiAgICAgICAgICAgIG1hcC5vZmYoJ3JlbW92ZScsIHRoaXMucmVtb3ZlKTtcbiAgICAgICAgICAgIG1hcC5vZmYoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VFdmVudCk7XG4gICAgICAgICAgICBtYXAub2ZmKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZUV2ZW50KTtcbiAgICAgICAgICAgIG1hcC5vZmYoJ2RyYWcnLCB0aGlzLl9vbk1vdXNlRXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5fbWFwID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIHBvcHVwIGlzIGNsb3NlZCBtYW51YWxseSBvciBwcm9ncmFtYXRpY2FsbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBjbG9zZVxuICAgICAgICAgKiBAbWVtYmVyb2YgUG9wdXBcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7UG9wdXB9IHBvcHVwIE9iamVjdCB0aGF0IHdhcyBjbG9zZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqIC8vIENyZWF0ZSBhIHBvcHVwXG4gICAgICAgICAqIGNvbnN0IHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKCk7XG4gICAgICAgICAqIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgZmlyZVxuICAgICAgICAgKiAvLyBhbnkgdGltZSB0aGUgcG9wdXAgaXMgY2xvc2VkXG4gICAgICAgICAqIHBvcHVwLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICogICAgIGNvbnNvbGUubG9nKCdwb3B1cCB3YXMgY2xvc2VkJyk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maXJlKG5ldyBFdmVudCgnY2xvc2UnKSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIG9mIHRoZSBwb3B1cCdzIGFuY2hvci5cbiAgICAgKlxuICAgICAqIFRoZSBsb25naXR1ZGUgb2YgdGhlIHJlc3VsdCBtYXkgZGlmZmVyIGJ5IGEgbXVsdGlwbGUgb2YgMzYwIGRlZ3JlZXMgZnJvbSB0aGUgbG9uZ2l0dWRlIHByZXZpb3VzbHlcbiAgICAgKiBzZXQgYnkgYHNldExuZ0xhdGAgYmVjYXVzZSBgUG9wdXBgIHdyYXBzIHRoZSBhbmNob3IgbG9uZ2l0dWRlIGFjcm9zcyBjb3BpZXMgb2YgdGhlIHdvcmxkIHRvIGtlZXBcbiAgICAgKiB0aGUgcG9wdXAgb24gc2NyZWVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiBvZiB0aGUgcG9wdXAncyBhbmNob3IuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBsbmdMYXQgPSBwb3B1cC5nZXRMbmdMYXQoKTtcbiAgICAgKi9cbiAgICBnZXRMbmdMYXQoKTogTG5nTGF0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xuZ0xhdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gb2YgdGhlIHBvcHVwJ3MgYW5jaG9yLCBhbmQgbW92ZXMgdGhlIHBvcHVwIHRvIGl0LiBSZXBsYWNlcyB0cmFja1BvaW50ZXIoKSBiZWhhdmlvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbG5nbGF0IFRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gdG8gc2V0IGFzIHRoZSBwb3B1cCdzIGFuY2hvci5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBwb3B1cC5zZXRMbmdMYXQoWy0xMjIuNDE5NCwgMzcuNzc0OV0pO1xuICAgICAqL1xuICAgIHNldExuZ0xhdChsbmdsYXQ6IExuZ0xhdExpa2UpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fbG5nTGF0ID0gTG5nTGF0LmNvbnZlcnQobG5nbGF0KTtcbiAgICAgICAgdGhpcy5fcG9zID0gbnVsbDtcblxuICAgICAgICB0aGlzLl90cmFja1BvaW50ZXIgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgICAgIGlmIChtYXApIHtcbiAgICAgICAgICAgIG1hcC5vbignbW92ZScsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgICAgICBtYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlRXZlbnQpO1xuICAgICAgICAgICAgbWFwLl9jYW52YXNDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnbWFwYm94Z2wtdHJhY2stcG9pbnRlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJhY2tzIHRoZSBwb3B1cCBhbmNob3IgdG8gdGhlIGN1cnNvciBwb3NpdGlvbiBvbiBzY3JlZW5zIHdpdGggYSBwb2ludGVyIGRldmljZSAoaXQgd2lsbCBiZSBoaWRkZW4gb24gdG91Y2hzY3JlZW5zKS4gUmVwbGFjZXMgdGhlIGBzZXRMbmdMYXRgIGJlaGF2aW9yLlxuICAgICAqIEZvciBtb3N0IHVzZSBjYXNlcywgc2V0IGBjbG9zZU9uQ2xpY2tgIGFuZCBgY2xvc2VCdXR0b25gIHRvIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKHtjbG9zZU9uQ2xpY2s6IGZhbHNlLCBjbG9zZUJ1dHRvbjogZmFsc2V9KVxuICAgICAqICAgICAuc2V0SFRNTChcIjxoMT5IZWxsbyBXb3JsZCE8L2gxPlwiKVxuICAgICAqICAgICAudHJhY2tQb2ludGVyKClcbiAgICAgKiAgICAgLmFkZFRvKG1hcCk7XG4gICAgICogQHJldHVybnMge1BvcHVwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqL1xuICAgIHRyYWNrUG9pbnRlcigpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fdHJhY2tQb2ludGVyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcG9zID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgaWYgKG1hcCkge1xuICAgICAgICAgICAgbWFwLm9mZignbW92ZScsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgICAgICBtYXAub24oJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VFdmVudCk7XG4gICAgICAgICAgICBtYXAub24oJ2RyYWcnLCB0aGlzLl9vbk1vdXNlRXZlbnQpO1xuICAgICAgICAgICAgbWFwLl9jYW52YXNDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtdHJhY2stcG9pbnRlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgUG9wdXBgJ3MgSFRNTCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBDaGFuZ2UgdGhlIGBQb3B1cGAgZWxlbWVudCdzIGZvbnQgc2l6ZVxuICAgICAqIGNvbnN0IHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgICAgLnNldExuZ0xhdChbLTk2LCAzNy44XSlcbiAgICAgKiAgICAgLnNldEhUTUwoXCI8cD5IZWxsbyBXb3JsZCE8L3A+XCIpXG4gICAgICogICAgIC5hZGRUbyhtYXApO1xuICAgICAqIGNvbnN0IHBvcHVwRWxlbSA9IHBvcHVwLmdldEVsZW1lbnQoKTtcbiAgICAgKiBwb3B1cEVsZW0uc3R5bGUuZm9udFNpemUgPSBcIjI1cHhcIjtcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IFJldHVybnMgY29udGFpbmVyIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0RWxlbWVudCgpOiA/SFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBvcHVwJ3MgY29udGVudCB0byBhIHN0cmluZyBvZiB0ZXh0LlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgW1RleHRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UZXh0KSBub2RlIGluIHRoZSBET00sXG4gICAgICogc28gaXQgY2Fubm90IGluc2VydCByYXcgSFRNTC4gVXNlIHRoaXMgbWV0aG9kIGZvciBzZWN1cml0eSBhZ2FpbnN0IFhTU1xuICAgICAqIGlmIHRoZSBwb3B1cCBjb250ZW50IGlzIHVzZXItcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUZXh0dWFsIGNvbnRlbnQgZm9yIHRoZSBwb3B1cC5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpXG4gICAgICogICAgIC5zZXRMbmdMYXQoZS5sbmdMYXQpXG4gICAgICogICAgIC5zZXRUZXh0KCdIZWxsbywgd29ybGQhJylcbiAgICAgKiAgICAgLmFkZFRvKG1hcCk7XG4gICAgICovXG4gICAgc2V0VGV4dCh0ZXh0OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RE9NQ29udGVudCh3aW5kb3cuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBvcHVwJ3MgY29udGVudCB0byB0aGUgSFRNTCBwcm92aWRlZCBhcyBhIHN0cmluZy5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gSFRNTCBmaWx0ZXJpbmcgb3Igc2FuaXRpemF0aW9uLCBhbmQgbXVzdCBiZVxuICAgICAqIHVzZWQgb25seSB3aXRoIHRydXN0ZWQgY29udGVudC4gQ29uc2lkZXIge0BsaW5rIFBvcHVwI3NldFRleHR9IGlmXG4gICAgICogdGhlIGNvbnRlbnQgaXMgYW4gdW50cnVzdGVkIHRleHQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgQSBzdHJpbmcgcmVwcmVzZW50aW5nIEhUTUwgY29udGVudCBmb3IgdGhlIHBvcHVwLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKClcbiAgICAgKiAgICAgLnNldExuZ0xhdChlLmxuZ0xhdClcbiAgICAgKiAgICAgLnNldEhUTUwoXCI8aDE+SGVsbG8gV29ybGQhPC9oMT5cIilcbiAgICAgKiAgICAgLmFkZFRvKG1hcCk7XG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwIG9uIGhvdmVyXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogRGlzcGxheSBhIHBvcHVwIG9uIGNsaWNrXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1jbGljay8pXG4gICAgICogQHNlZSBbRXhhbXBsZTogQXR0YWNoIGEgcG9wdXAgdG8gYSBtYXJrZXIgaW5zdGFuY2VdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NldC1wb3B1cC8pXG4gICAgICovXG4gICAgc2V0SFRNTChodG1sOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgY29uc3QgZnJhZyA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIGNvbnN0IHRlbXAgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYm9keScpO1xuICAgICAgICBsZXQgY2hpbGQ7XG4gICAgICAgIHRlbXAuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGNoaWxkID0gdGVtcC5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKCFjaGlsZCkgYnJlYWs7XG4gICAgICAgICAgICBmcmFnLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNldERPTUNvbnRlbnQoZnJhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcG9wdXAncyBtYXhpbXVtIHdpZHRoLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIG1heGltdW0gd2lkdGggb2YgdGhlIHBvcHVwLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgbWF4V2lkdGggPSBwb3B1cC5nZXRNYXhXaWR0aCgpO1xuICAgICAqL1xuICAgIGdldE1heFdpZHRoKCk6ID9zdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyICYmIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5tYXhXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIG1heGltdW0gd2lkdGguIFRoaXMgaXMgc2V0dGluZyB0aGUgQ1NTIHByb3BlcnR5IGBtYXgtd2lkdGhgLlxuICAgICAqIEF2YWlsYWJsZSB2YWx1ZXMgY2FuIGJlIGZvdW5kIGhlcmU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9tYXgtd2lkdGguXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWF4V2lkdGggQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBmb3IgdGhlIG1heGltdW0gd2lkdGguXG4gICAgICogQHJldHVybnMge1BvcHVwfSBSZXR1cm5zIGl0c2VsZiB0byBhbGxvdyBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogcG9wdXAuc2V0TWF4V2lkdGgoJzUwJyk7XG4gICAgICovXG4gICAgc2V0TWF4V2lkdGgobWF4V2lkdGg6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWF4V2lkdGggPSBtYXhXaWR0aDtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBvcHVwJ3MgY29udGVudCB0byB0aGUgZWxlbWVudCBwcm92aWRlZCBhcyBhIERPTSBub2RlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBodG1sTm9kZSBBIERPTSBub2RlIHRvIGJlIHVzZWQgYXMgY29udGVudCBmb3IgdGhlIHBvcHVwLlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gUmV0dXJucyBpdHNlbGYgdG8gYWxsb3cgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIC8vIGNyZWF0ZSBhbiBlbGVtZW50IHdpdGggdGhlIHBvcHVwIGNvbnRlbnRcbiAgICAgKiBjb25zdCBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICogZGl2LmlubmVySFRNTCA9ICdIZWxsbywgd29ybGQhJztcbiAgICAgKiBjb25zdCBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpXG4gICAgICogICAgIC5zZXRMbmdMYXQoZS5sbmdMYXQpXG4gICAgICogICAgIC5zZXRET01Db250ZW50KGRpdilcbiAgICAgKiAgICAgLmFkZFRvKG1hcCk7XG4gICAgICovXG4gICAgc2V0RE9NQ29udGVudChodG1sTm9kZTogTm9kZSk6IHRoaXMge1xuICAgICAgICBsZXQgY29udGVudCA9IHRoaXMuX2NvbnRlbnQ7XG4gICAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgICAgICAvLyBDbGVhciBvdXQgY2hpbGRyZW4gZmlyc3QuXG4gICAgICAgICAgICB3aGlsZSAoY29udGVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucmVtb3ZlQ2hpbGQoY29udGVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb250ZW50ID0gdGhpcy5fY29udGVudCA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1wb3B1cC1jb250ZW50JywgdGhpcy5fY29udGFpbmVyIHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgY2xvc2UgYnV0dG9uIHNob3VsZCBiZSB0aGUgbGFzdCB0YWJiYWJsZSBlbGVtZW50IGluc2lkZSB0aGUgcG9wdXAgZm9yIGEgZ29vZCBrZXlib2FyZCBVWC5cbiAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZChodG1sTm9kZSk7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZUJ1dHRvbikge1xuICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gdGhpcy5fY2xvc2VCdXR0b24gPSBET00uY3JlYXRlKCdidXR0b24nLCAnbWFwYm94Z2wtcG9wdXAtY2xvc2UtYnV0dG9uJywgY29udGVudCk7XG4gICAgICAgICAgICBidXR0b24udHlwZSA9ICdidXR0b24nO1xuICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDbG9zZSBwb3B1cCcpO1xuICAgICAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgICAgICAgYnV0dG9uLmlubmVySFRNTCA9ICcmIzIxNTsnO1xuICAgICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbG9zZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHRoaXMuX2ZvY3VzRmlyc3RFbGVtZW50KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBDU1MgY2xhc3MgdG8gdGhlIHBvcHVwIGNvbnRhaW5lciBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBOb24tZW1wdHkgc3RyaW5nIHdpdGggQ1NTIGNsYXNzIG5hbWUgdG8gYWRkIHRvIHBvcHVwIGNvbnRhaW5lci5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHBvcHVwID0gbmV3IG1hcGJveGdsLlBvcHVwKCk7XG4gICAgICogcG9wdXAuYWRkQ2xhc3NOYW1lKCdzb21lLWNsYXNzJyk7XG4gICAgICovXG4gICAgYWRkQ2xhc3NOYW1lKGNsYXNzTmFtZTogc3RyaW5nKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2NsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NMaXN0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBDU1MgY2xhc3MgZnJvbSB0aGUgcG9wdXAgY29udGFpbmVyIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIE5vbi1lbXB0eSBzdHJpbmcgd2l0aCBDU1MgY2xhc3MgbmFtZSB0byByZW1vdmUgZnJvbSBwb3B1cCBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IFJldHVybnMgaXRzZWxmIHRvIGFsbG93IGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCh7Y2xhc3NOYW1lOiAnc29tZSBjbGFzc2VzJ30pO1xuICAgICAqIHBvcHVwLnJlbW92ZUNsYXNzTmFtZSgnc29tZScpO1xuICAgICAqL1xuICAgIHJlbW92ZUNsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLl9jbGFzc0xpc3QuZGVsZXRlKGNsYXNzTmFtZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTGlzdCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIG9mZnNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUG9pbnRMaWtlIHwgT2JqZWN0fSBvZmZzZXQgU2V0cyB0aGUgcG9wdXAncyBvZmZzZXQuIFRoZSBgT2JqZWN0YCBpcyBvZiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZVxuICAgICAqIHtcbiAgICAgKiAgICAnY2VudGVyJzogP1BvaW50TGlrZSxcbiAgICAgKiAgICAndG9wJzogP1BvaW50TGlrZSxcbiAgICAgKiAgICAnYm90dG9tJzogP1BvaW50TGlrZSxcbiAgICAgKiAgICAnbGVmdCc6ID9Qb2ludExpa2UsXG4gICAgICogICAgJ3JpZ2h0JzogP1BvaW50TGlrZSxcbiAgICAgKiAgICAndG9wLWxlZnQnOiA/UG9pbnRMaWtlLFxuICAgICAqICAgICd0b3AtcmlnaHQnOiA/UG9pbnRMaWtlLFxuICAgICAqICAgICdib3R0b20tbGVmdCc6ID9Qb2ludExpa2UsXG4gICAgICogICAgJ2JvdHRvbS1yaWdodCc6ID9Qb2ludExpa2VcbiAgICAgKiB9LlxuICAgICAqXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBwb3B1cC5zZXRPZmZzZXQoMTApO1xuICAgICAqL1xuICAgIHNldE9mZnNldCAob2Zmc2V0PzogT2Zmc2V0KTogdGhpcyB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgb3IgcmVtb3ZlIHRoZSBnaXZlbiBDU1MgY2xhc3Mgb24gdGhlIHBvcHVwIGNvbnRhaW5lciwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvbnRhaW5lciBjdXJyZW50bHkgaGFzIHRoYXQgY2xhc3MuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIE5vbi1lbXB0eSBzdHJpbmcgd2l0aCBDU1MgY2xhc3MgbmFtZSB0byBhZGQvcmVtb3ZlLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IElmIHRoZSBjbGFzcyB3YXMgcmVtb3ZlZCByZXR1cm4gYGZhbHNlYC4gSWYgdGhlIGNsYXNzIHdhcyBhZGRlZCwgdGhlbiByZXR1cm4gYHRydWVgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBjb25zdCBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpO1xuICAgICAqIHBvcHVwLnRvZ2dsZUNsYXNzTmFtZSgnaGlnaGxpZ2h0ZWQnKTtcbiAgICAgKi9cbiAgICB0b2dnbGVDbGFzc05hbWUoY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGZpbmFsU3RhdGU6IGJvb2xlYW47XG4gICAgICAgIGlmICh0aGlzLl9jbGFzc0xpc3QuZGVsZXRlKGNsYXNzTmFtZSkpIHtcbiAgICAgICAgICAgIGZpbmFsU3RhdGUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIGZpbmFsU3RhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTGlzdCgpO1xuICAgICAgICByZXR1cm4gZmluYWxTdGF0ZTtcbiAgICB9XG5cbiAgICBfb25Nb3VzZUV2ZW50KGV2ZW50OiBNYXBNb3VzZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZShldmVudC5wb2ludCk7XG4gICAgfVxuXG4gICAgX2dldEFuY2hvcihib3R0b21ZOiBudW1iZXIpOiBBbmNob3Ige1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuY2hvcikgeyByZXR1cm4gdGhpcy5vcHRpb25zLmFuY2hvcjsgfVxuXG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyO1xuICAgICAgICBjb25zdCBwb3MgPSB0aGlzLl9wb3M7XG5cbiAgICAgICAgaWYgKCFtYXAgfHwgIWNvbnRhaW5lciB8fCAhcG9zKSByZXR1cm4gJ2JvdHRvbSc7XG5cbiAgICAgICAgY29uc3Qgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgY29uc3QgaXNUb3AgPSBwb3MueSArIGJvdHRvbVkgPCBoZWlnaHQ7XG4gICAgICAgIGNvbnN0IGlzQm90dG9tID0gcG9zLnkgPiBtYXAudHJhbnNmb3JtLmhlaWdodCAtIGhlaWdodDtcbiAgICAgICAgY29uc3QgaXNMZWZ0ID0gcG9zLnggPCB3aWR0aCAvIDI7XG4gICAgICAgIGNvbnN0IGlzUmlnaHQgPSBwb3MueCA+IG1hcC50cmFuc2Zvcm0ud2lkdGggLSB3aWR0aCAvIDI7XG5cbiAgICAgICAgaWYgKGlzVG9wKSB7XG4gICAgICAgICAgICBpZiAoaXNMZWZ0KSByZXR1cm4gJ3RvcC1sZWZ0JztcbiAgICAgICAgICAgIGlmIChpc1JpZ2h0KSByZXR1cm4gJ3RvcC1yaWdodCc7XG4gICAgICAgICAgICByZXR1cm4gJ3RvcCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQm90dG9tKSB7XG4gICAgICAgICAgICBpZiAoaXNMZWZ0KSByZXR1cm4gJ2JvdHRvbS1sZWZ0JztcbiAgICAgICAgICAgIGlmIChpc1JpZ2h0KSByZXR1cm4gJ2JvdHRvbS1yaWdodCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTGVmdCkgcmV0dXJuICdsZWZ0JztcbiAgICAgICAgaWYgKGlzUmlnaHQpIHJldHVybiAncmlnaHQnO1xuXG4gICAgICAgIHJldHVybiAnYm90dG9tJztcbiAgICB9XG5cbiAgICBfdXBkYXRlQ2xhc3NMaXN0KCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXI7XG4gICAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IFsuLi50aGlzLl9jbGFzc0xpc3RdO1xuICAgICAgICBjbGFzc2VzLnB1c2goJ21hcGJveGdsLXBvcHVwJyk7XG4gICAgICAgIGlmICh0aGlzLl9hbmNob3IpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaChgbWFwYm94Z2wtcG9wdXAtYW5jaG9yLSR7dGhpcy5fYW5jaG9yfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90cmFja1BvaW50ZXIpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnbWFwYm94Z2wtcG9wdXAtdHJhY2stcG9pbnRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBfdXBkYXRlKGN1cnNvcj86IFBvaW50KSB7XG4gICAgICAgIGNvbnN0IGhhc1Bvc2l0aW9uID0gdGhpcy5fbG5nTGF0IHx8IHRoaXMuX3RyYWNrUG9pbnRlcjtcbiAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fY29udGVudDtcblxuICAgICAgICBpZiAoIW1hcCB8fCAhaGFzUG9zaXRpb24gfHwgIWNvbnRlbnQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcjtcblxuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLXBvcHVwJywgbWFwLmdldENvbnRhaW5lcigpKTtcbiAgICAgICAgICAgIHRoaXMuX3RpcCA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1wb3B1cC10aXAnLCBjb250YWluZXIpO1xuICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXhXaWR0aCAmJiBjb250YWluZXIuc3R5bGUubWF4V2lkdGggIT09IHRoaXMub3B0aW9ucy5tYXhXaWR0aCkge1xuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1heFdpZHRoID0gdGhpcy5vcHRpb25zLm1heFdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1hcC50cmFuc2Zvcm0ucmVuZGVyV29ybGRDb3BpZXMgJiYgIXRoaXMuX3RyYWNrUG9pbnRlcikge1xuICAgICAgICAgICAgdGhpcy5fbG5nTGF0ID0gc21hcnRXcmFwKHRoaXMuX2xuZ0xhdCwgdGhpcy5fcG9zLCBtYXAudHJhbnNmb3JtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fdHJhY2tQb2ludGVyIHx8IGN1cnNvcikge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gdGhpcy5fcG9zID0gdGhpcy5fdHJhY2tQb2ludGVyICYmIGN1cnNvciA/IGN1cnNvciA6IG1hcC5wcm9qZWN0KHRoaXMuX2xuZ0xhdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldEJvdHRvbSA9IG5vcm1hbGl6ZU9mZnNldCh0aGlzLm9wdGlvbnMub2Zmc2V0KTtcbiAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IHRoaXMuX2FuY2hvciA9IHRoaXMuX2dldEFuY2hvcihvZmZzZXRCb3R0b20ueSk7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBub3JtYWxpemVPZmZzZXQodGhpcy5vcHRpb25zLm9mZnNldCwgYW5jaG9yKTtcblxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ZWRQb3MgPSBwb3MuYWRkKG9mZnNldCkucm91bmQoKTtcbiAgICAgICAgICAgIG1hcC5fcmVxdWVzdERvbVRhc2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb250YWluZXIgJiYgYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSBgJHthbmNob3JUcmFuc2xhdGVbYW5jaG9yXX0gdHJhbnNsYXRlKCR7b2Zmc2V0ZWRQb3MueH1weCwke29mZnNldGVkUG9zLnl9cHgpYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fbWFya2VyICYmIG1hcC5fdXNpbmdHbG9iZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBvcGFjaXR5ID0gaXNMbmdMYXRCZWhpbmRHbG9iZShtYXAudHJhbnNmb3JtLCB0aGlzLl9sbmdMYXQpID8gMCA6IDE7XG4gICAgICAgICAgICB0aGlzLl9zZXRPcGFjaXR5KG9wYWNpdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NMaXN0KCk7XG4gICAgfVxuXG4gICAgX2ZvY3VzRmlyc3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5mb2N1c0FmdGVyT3BlbiB8fCAhdGhpcy5fY29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZmlyc3RGb2N1c2FibGUgPSB0aGlzLl9jb250YWluZXIucXVlcnlTZWxlY3Rvcihmb2N1c1F1ZXJ5U2VsZWN0b3IpO1xuXG4gICAgICAgIGlmIChmaXJzdEZvY3VzYWJsZSkgZmlyc3RGb2N1c2FibGUuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBfb25DbG9zZSgpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBfc2V0T3BhY2l0eShvcGFjaXR5OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLm9wYWNpdHkgPSBgJHtvcGFjaXR5fWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9IG9wYWNpdHkgPyAnYXV0bycgOiAnbm9uZSc7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIHJldHVybnMgYSBub3JtYWxpemVkIG9mZnNldCBmb3IgYSBnaXZlbiBhbmNob3JcbmZ1bmN0aW9uIG5vcm1hbGl6ZU9mZnNldChvZmZzZXQ6IE9mZnNldCA9IG5ldyBQb2ludCgwLCAwKSwgYW5jaG9yOiBBbmNob3IgPSAnYm90dG9tJyk6IFBvaW50IHtcbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gaW5wdXQgc3BlY2lmaWVzIGEgcmFkaXVzIGZyb20gd2hpY2ggdG8gY2FsY3VsYXRlIG9mZnNldHMgYXQgYWxsIHBvc2l0aW9uc1xuICAgICAgICBjb25zdCBjb3JuZXJPZmZzZXQgPSBNYXRoLnJvdW5kKE1hdGguc3FydCgwLjUgKiBNYXRoLnBvdyhvZmZzZXQsIDIpKSk7XG4gICAgICAgIHN3aXRjaCAoYW5jaG9yKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6IHJldHVybiBuZXcgUG9pbnQoMCwgb2Zmc2V0KTtcbiAgICAgICAgY2FzZSAndG9wLWxlZnQnOiByZXR1cm4gbmV3IFBvaW50KGNvcm5lck9mZnNldCwgY29ybmVyT2Zmc2V0KTtcbiAgICAgICAgY2FzZSAndG9wLXJpZ2h0JzogcmV0dXJuIG5ldyBQb2ludCgtY29ybmVyT2Zmc2V0LCBjb3JuZXJPZmZzZXQpO1xuICAgICAgICBjYXNlICdib3R0b20nOiByZXR1cm4gbmV3IFBvaW50KDAsIC1vZmZzZXQpO1xuICAgICAgICBjYXNlICdib3R0b20tbGVmdCc6IHJldHVybiBuZXcgUG9pbnQoY29ybmVyT2Zmc2V0LCAtY29ybmVyT2Zmc2V0KTtcbiAgICAgICAgY2FzZSAnYm90dG9tLXJpZ2h0JzogcmV0dXJuIG5ldyBQb2ludCgtY29ybmVyT2Zmc2V0LCAtY29ybmVyT2Zmc2V0KTtcbiAgICAgICAgY2FzZSAnbGVmdCc6IHJldHVybiBuZXcgUG9pbnQob2Zmc2V0LCAwKTtcbiAgICAgICAgY2FzZSAncmlnaHQnOiByZXR1cm4gbmV3IFBvaW50KC1vZmZzZXQsIDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoMCwgMCk7XG4gICAgfVxuXG4gICAgaWYgKG9mZnNldCBpbnN0YW5jZW9mIFBvaW50IHx8IEFycmF5LmlzQXJyYXkob2Zmc2V0KSkge1xuICAgICAgICAvLyBpbnB1dCBzcGVjaWZpZXMgYSBzaW5nbGUgb2Zmc2V0IHRvIGJlIGFwcGxpZWQgdG8gYWxsIHBvc2l0aW9uc1xuICAgICAgICByZXR1cm4gUG9pbnQuY29udmVydChvZmZzZXQpO1xuICAgIH1cblxuICAgIC8vIGlucHV0IHNwZWNpZmllcyBhbiBvZmZzZXQgcGVyIHBvc2l0aW9uXG4gICAgcmV0dXJuIFBvaW50LmNvbnZlcnQob2Zmc2V0W2FuY2hvcl0gfHwgWzAsIDBdKTtcbn1cbiIsIi8vIEBmbG93XG5cbmltcG9ydCB3aW5kb3cgZnJvbSAnLi4vdXRpbC93aW5kb3cuanMnO1xuXG5pbXBvcnQgRGlzcGF0Y2hlciBmcm9tICcuL2Rpc3BhdGNoZXIuanMnO1xuaW1wb3J0IGdldFdvcmtlclBvb2wgZnJvbSAnLi9nbG9iYWxfd29ya2VyX3Bvb2wuanMnO1xuaW1wb3J0IHtQZXJmb3JtYW5jZVV0aWxzfSBmcm9tICcuL3BlcmZvcm1hbmNlLmpzJztcblxuY29uc3QgcGVyZm9ybWFuY2UgPSB3aW5kb3cucGVyZm9ybWFuY2U7XG5cbi8vIHNlcGFyYXRlIGZyb20gUGVyZm9ybWFuY2VVdGlscyB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5XG5cbmV4cG9ydCBjb25zdCBXb3JrZXJQZXJmb3JtYW5jZVV0aWxzID0ge1xuXG4gICAgZ2V0UGVyZm9ybWFuY2VNZXRyaWNzQXN5bmMoY2FsbGJhY2s6IChlcnJvcjogP0Vycm9yLCByZXN1bHQ6ID9PYmplY3QpID0+IHZvaWQpIHtcbiAgICAgICAgY29uc3QgbWV0cmljcyA9IFBlcmZvcm1hbmNlVXRpbHMuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzKCk7XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRGlzcGF0Y2hlcihnZXRXb3JrZXJQb29sKCksIHRoaXMpO1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVRpbWUgPSBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKCdjcmVhdGUnLCAnbWFyaycpWzBdLnN0YXJ0VGltZTtcblxuICAgICAgICBkaXNwYXRjaGVyLmJyb2FkY2FzdCgnZ2V0V29ya2VyUGVyZm9ybWFuY2VNZXRyaWNzJywge30sIChlcnIsIHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgIGRpc3BhdGNoZXIucmVtb3ZlKCk7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VtcyA9IHt9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtZWFzdXJlIG9mIHJlc3VsdC5lbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlLmVudHJ5VHlwZSAhPT0gJ21lYXN1cmUnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgc3Vtc1ttZWFzdXJlLm5hbWVdID0gKHN1bXNbbWVhc3VyZS5uYW1lXSB8fCAwKSArIG1lYXN1cmUuZHVyYXRpb247XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3Vtcy53b3JrZXJJbml0aWFsaXphdGlvbiA9IHJlc3VsdC50aW1lT3JpZ2luIC0gcGVyZm9ybWFuY2UudGltZU9yaWdpbiAtIGNyZWF0ZVRpbWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBzdW1zKSB7XG4gICAgICAgICAgICAgICAgbWV0cmljc1tuYW1lXSA9IHN1bXNbbmFtZV0gLyByZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbWV0cmljcy53b3JrZXJJZGxlID0gbWV0cmljcy5sb2FkVGltZSAtIG1ldHJpY3Mud29ya2VySW5pdGlhbGl6YXRpb24gLSBtZXRyaWNzLndvcmtlckV2YWx1YXRlU2NyaXB0IC0gbWV0cmljcy53b3JrZXJUYXNrO1xuICAgICAgICAgICAgbWV0cmljcy53b3JrZXJJZGxlUGVyY2VudCA9IG1ldHJpY3Mud29ya2VySWRsZSAvIG1ldHJpY3MubG9hZFRpbWU7XG5cbiAgICAgICAgICAgIG1ldHJpY3MucGFyc2VUaWxlID0gbWV0cmljcy5wYXJzZVRpbGUxICsgbWV0cmljcy5wYXJzZVRpbGUyO1xuXG4gICAgICAgICAgICBtZXRyaWNzLnRpbWVsaW5lcyA9IFtQZXJmb3JtYW5jZVV0aWxzLmdldFdvcmtlclBlcmZvcm1hbmNlTWV0cmljcygpLCAuLi5yZXN1bHRzXTtcblxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHVuZGVmaW5lZCwgbWV0cmljcyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQge1BlcmZvcm1hbmNlVXRpbHN9IGZyb20gJy4vdXRpbC9wZXJmb3JtYW5jZS5qcyc7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7c3VwcG9ydGVkfSBmcm9tICdAbWFwYm94L21hcGJveC1nbC1zdXBwb3J0ZWQnO1xuXG5pbXBvcnQge3ZlcnNpb259IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgTWFwIGZyb20gJy4vdWkvbWFwLmpzJztcbmltcG9ydCBOYXZpZ2F0aW9uQ29udHJvbCBmcm9tICcuL3VpL2NvbnRyb2wvbmF2aWdhdGlvbl9jb250cm9sLmpzJztcbmltcG9ydCBHZW9sb2NhdGVDb250cm9sIGZyb20gJy4vdWkvY29udHJvbC9nZW9sb2NhdGVfY29udHJvbC5qcyc7XG5pbXBvcnQgQXR0cmlidXRpb25Db250cm9sIGZyb20gJy4vdWkvY29udHJvbC9hdHRyaWJ1dGlvbl9jb250cm9sLmpzJztcbmltcG9ydCBTY2FsZUNvbnRyb2wgZnJvbSAnLi91aS9jb250cm9sL3NjYWxlX2NvbnRyb2wuanMnO1xuaW1wb3J0IEZ1bGxzY3JlZW5Db250cm9sIGZyb20gJy4vdWkvY29udHJvbC9mdWxsc2NyZWVuX2NvbnRyb2wuanMnO1xuaW1wb3J0IFBvcHVwIGZyb20gJy4vdWkvcG9wdXAuanMnO1xuaW1wb3J0IE1hcmtlciBmcm9tICcuL3VpL21hcmtlci5qcyc7XG5pbXBvcnQgU3R5bGUgZnJvbSAnLi9zdHlsZS9zdHlsZS5qcyc7XG5pbXBvcnQgTG5nTGF0IGZyb20gJy4vZ2VvL2xuZ19sYXQuanMnO1xuaW1wb3J0IExuZ0xhdEJvdW5kcyBmcm9tICcuL2dlby9sbmdfbGF0X2JvdW5kcy5qcyc7XG5pbXBvcnQgUG9pbnQgZnJvbSAnQG1hcGJveC9wb2ludC1nZW9tZXRyeSc7XG5pbXBvcnQgTWVyY2F0b3JDb29yZGluYXRlIGZyb20gJy4vZ2VvL21lcmNhdG9yX2Nvb3JkaW5hdGUuanMnO1xuaW1wb3J0IHtFdmVudGVkfSBmcm9tICcuL3V0aWwvZXZlbnRlZC5qcyc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4vdXRpbC9jb25maWcuanMnO1xuaW1wb3J0IHtEZWJ1Z30gZnJvbSAnLi91dGlsL2RlYnVnLmpzJztcbmltcG9ydCB7aXNTYWZhcml9IGZyb20gJy4vdXRpbC91dGlsLmpzJztcbmltcG9ydCB7c2V0UlRMVGV4dFBsdWdpbiwgZ2V0UlRMVGV4dFBsdWdpblN0YXR1c30gZnJvbSAnLi9zb3VyY2UvcnRsX3RleHRfcGx1Z2luLmpzJztcbmltcG9ydCBXb3JrZXJQb29sIGZyb20gJy4vdXRpbC93b3JrZXJfcG9vbC5qcyc7XG5pbXBvcnQge3ByZXdhcm0sIGNsZWFyUHJld2FybWVkUmVzb3VyY2VzfSBmcm9tICcuL3V0aWwvZ2xvYmFsX3dvcmtlcl9wb29sLmpzJztcbmltcG9ydCB7Y2xlYXJUaWxlQ2FjaGV9IGZyb20gJy4vdXRpbC90aWxlX3JlcXVlc3RfY2FjaGUuanMnO1xuaW1wb3J0IHtXb3JrZXJQZXJmb3JtYW5jZVV0aWxzfSBmcm9tICcuL3V0aWwvd29ya2VyX3BlcmZvcm1hbmNlX3V0aWxzLmpzJztcbmltcG9ydCB7RnJlZUNhbWVyYU9wdGlvbnN9IGZyb20gJy4vdWkvZnJlZV9jYW1lcmEuanMnO1xuaW1wb3J0IGJyb3dzZXIgZnJvbSAnLi91dGlsL2Jyb3dzZXIuanMnO1xuXG5jb25zdCBleHBvcnRlZCA9IHtcbiAgICB2ZXJzaW9uLFxuICAgIHN1cHBvcnRlZCxcbiAgICBzZXRSVExUZXh0UGx1Z2luLFxuICAgIGdldFJUTFRleHRQbHVnaW5TdGF0dXMsXG4gICAgTWFwLFxuICAgIE5hdmlnYXRpb25Db250cm9sLFxuICAgIEdlb2xvY2F0ZUNvbnRyb2wsXG4gICAgQXR0cmlidXRpb25Db250cm9sLFxuICAgIFNjYWxlQ29udHJvbCxcbiAgICBGdWxsc2NyZWVuQ29udHJvbCxcbiAgICBQb3B1cCxcbiAgICBNYXJrZXIsXG4gICAgU3R5bGUsXG4gICAgTG5nTGF0LFxuICAgIExuZ0xhdEJvdW5kcyxcbiAgICBQb2ludCxcbiAgICBNZXJjYXRvckNvb3JkaW5hdGUsXG4gICAgRnJlZUNhbWVyYU9wdGlvbnMsXG4gICAgRXZlbnRlZCxcbiAgICBjb25maWcsXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgcmVzb3VyY2VzIGxpa2UgV2ViV29ya2VycyB0aGF0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIG1hcHMgdG8gbG93ZXIgbG9hZFxuICAgICAqIHRpbWVzIGluIHNvbWUgc2l0dWF0aW9ucy4gW2BtYXBib3hnbC53b3JrZXJVcmxgXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvYXBpL3Byb3BlcnRpZXMvI3dvcmtlcnVybClcbiAgICAgKiBhbmQgW2BtYXBib3hnbC53b3JrZXJDb3VudGBdKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvcHJvcGVydGllcy8jd29ya2VyY291bnQpLCBpZiBiZWluZ1xuICAgICAqIHVzZWQsIG11c3QgYmUgc2V0IGJlZm9yZSBgcHJld2FybSgpYCBpcyBjYWxsZWQgdG8gaGF2ZSBhbiBlZmZlY3QuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgbGlmZWN5Y2xlIG9mIHRoZXNlIHJlc291cmNlcyBpcyBtYW5hZ2VkIGF1dG9tYXRpY2FsbHksIGFuZCB0aGV5IGFyZVxuICAgICAqIGxhemlseSBpbml0aWFsaXplZCB3aGVuIGEgYE1hcGAgaXMgZmlyc3QgY3JlYXRlZC4gSW52b2tpbmcgYHByZXdhcm0oKWAgY3JlYXRlcyB0aGVzZVxuICAgICAqIHJlc291cmNlcyBhaGVhZCBvZiB0aW1lIGFuZCBlbnN1cmVzIHRoZXkgYXJlIG5vdCBjbGVhcmVkIHdoZW4gdGhlIGxhc3QgYE1hcGBcbiAgICAgKiBpcyByZW1vdmVkIGZyb20gdGhlIHBhZ2UuIFRoaXMgYWxsb3dzIHRoZW0gdG8gYmUgcmUtdXNlZCBieSBuZXcgYE1hcGAgaW5zdGFuY2VzIHRoYXRcbiAgICAgKiBhcmUgY3JlYXRlZCBsYXRlci4gVGhleSBjYW4gYmUgbWFudWFsbHkgY2xlYXJlZCBieSBjYWxsaW5nXG4gICAgICogW2BtYXBib3hnbC5jbGVhclByZXdhcm1lZFJlc291cmNlcygpYF0oaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2FwaS9wcm9wZXJ0aWVzLyNjbGVhcnByZXdhcm1lZHJlc291cmNlcykuXG4gICAgICogVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3VyIHdlYiBwYWdlIHJlbWFpbnMgYWN0aXZlIGJ1dCBzdG9wcyB1c2luZyBtYXBzIGFsdG9nZXRoZXIuXG4gICAgICogYHByZXdhcm0oKWAgaXMgaWRlbXBvdGVudCBhbmQgaGFzIGd1YXJkcyBhZ2FpbnN0IGJlaW5nIGV4ZWN1dGVkIG11bHRpcGxlIHRpbWVzLFxuICAgICAqIGFuZCBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBgcHJld2FybSgpYCBhcmUgY3JlYXRlZCBzeW5jaHJvbm91c2x5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIHdoZW4gdXNpbmcgTWFwYm94IEdMIEpTIG1hcHMgaW4gYSBzaW5nbGUgcGFnZSBhcHAsXG4gICAgICogaW4gd2hpY2ggYSB1c2VyIG5hdmlnYXRlcyBiZXR3ZWVuIHZhcmlvdXMgdmlld3MsIHJlc3VsdGluZyBpblxuICAgICAqIGNvbnN0YW50IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBvZiBgTWFwYCBpbnN0YW5jZXMuXG4gICAgICpcbiAgICAgKiBAZnVuY3Rpb24gcHJld2FybVxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwYm94Z2wucHJld2FybSgpO1xuICAgICAqL1xuICAgIHByZXdhcm0sXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHVwIHJlc291cmNlcyB0aGF0IGhhdmUgcHJldmlvdXNseSBiZWVuIGNyZWF0ZWQgYnkgW2BtYXBib3hnbC5wcmV3YXJtKCldKGh0dHBzOi8vZG9jcy5tYXBib3guY29tL21hcGJveC1nbC1qcy9hcGkvcHJvcGVydGllcy8jcHJld2FybSlgLlxuICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIHR5cGljYWxseSBub3QgbmVjZXNzYXJ5LiBZb3Ugc2hvdWxkIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uXG4gICAgICogaWYgeW91IGV4cGVjdCB0aGUgdXNlciBvZiB5b3VyIGFwcCB0byBub3QgcmV0dXJuIHRvIGEgTWFwIHZpZXcgYXQgYW55IHBvaW50XG4gICAgICogaW4geW91ciBhcHBsaWNhdGlvbi5cbiAgICAgKlxuICAgICAqIEBmdW5jdGlvbiBjbGVhclByZXdhcm1lZFJlc291cmNlc1xuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwYm94Z2wuY2xlYXJQcmV3YXJtZWRSZXNvdXJjZXMoKTtcbiAgICAgKi9cbiAgICBjbGVhclByZXdhcm1lZFJlc291cmNlcyxcblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgdGhlIG1hcCdzIFthY2Nlc3MgdG9rZW5dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vaGVscC9kZWZpbmUtYWNjZXNzLXRva2VuLykuXG4gICAgICpcbiAgICAgKiBAdmFyIHtzdHJpbmd9IGFjY2Vzc1Rva2VuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGN1cnJlbnRseSBzZXQgYWNjZXNzIHRva2VuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwYm94Z2wuYWNjZXNzVG9rZW4gPSBteUFjY2Vzc1Rva2VuO1xuICAgICAqIEBzZWUgW0V4YW1wbGU6IERpc3BsYXkgYSBtYXBdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvc2ltcGxlLW1hcC8pXG4gICAgICovXG4gICAgZ2V0IGFjY2Vzc1Rva2VuKCk6ID9zdHJpbmcge1xuICAgICAgICByZXR1cm4gY29uZmlnLkFDQ0VTU19UT0tFTjtcbiAgICB9LFxuXG4gICAgc2V0IGFjY2Vzc1Rva2VuKHRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgY29uZmlnLkFDQ0VTU19UT0tFTiA9IHRva2VuO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIHRoZSBtYXAncyBkZWZhdWx0IEFQSSBVUkwgZm9yIHJlcXVlc3RpbmcgdGlsZXMsIHN0eWxlcywgc3ByaXRlcywgYW5kIGdseXBocy5cbiAgICAgKlxuICAgICAqIEB2YXIge3N0cmluZ30gYmFzZUFwaVVybFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjdXJyZW50IGJhc2UgQVBJIFVSTC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcGJveGdsLmJhc2VBcGlVcmwgPSAnaHR0cHM6Ly9hcGkubWFwYm94LmNvbSc7XG4gICAgICovXG4gICAgZ2V0IGJhc2VBcGlVcmwoKTogP3N0cmluZyB7XG4gICAgICAgIHJldHVybiBjb25maWcuQVBJX1VSTDtcbiAgICB9LFxuXG4gICAgc2V0IGJhc2VBcGlVcmwodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgY29uZmlnLkFQSV9VUkwgPSB1cmw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgdGhlIG51bWJlciBvZiB3ZWIgd29ya2VycyBpbnN0YW50aWF0ZWQgb24gYSBwYWdlIHdpdGggTWFwYm94IEdMIEpTIG1hcHMuXG4gICAgICogQnkgZGVmYXVsdCwgaXQgaXMgc2V0IHRvIDIuXG4gICAgICogTWFrZSBzdXJlIHRvIHNldCB0aGlzIHByb3BlcnR5IGJlZm9yZSBjcmVhdGluZyBhbnkgbWFwIGluc3RhbmNlcyBmb3IgaXQgdG8gaGF2ZSBlZmZlY3QuXG4gICAgICpcbiAgICAgKiBAdmFyIHtzdHJpbmd9IHdvcmtlckNvdW50XG4gICAgICogQHJldHVybnMge251bWJlcn0gTnVtYmVyIG9mIHdvcmtlcnMgY3VycmVudGx5IGNvbmZpZ3VyZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXBib3hnbC53b3JrZXJDb3VudCA9IDQ7XG4gICAgICovXG4gICAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBXb3JrZXJQb29sLndvcmtlckNvdW50O1xuICAgIH0sXG5cbiAgICBzZXQgd29ya2VyQ291bnQoY291bnQ6IG51bWJlcikge1xuICAgICAgICBXb3JrZXJQb29sLndvcmtlckNvdW50ID0gY291bnQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdldHMgYW5kIHNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyAocmFzdGVyIHRpbGVzLCBzcHJpdGVzLCBpY29ucykgdG8gbG9hZCBpbiBwYXJhbGxlbC5cbiAgICAgKiAxNiBieSBkZWZhdWx0LiBUaGVyZSBpcyBubyBtYXhpbXVtIHZhbHVlLCBidXQgdGhlIG51bWJlciBvZiBpbWFnZXMgYWZmZWN0cyBwZXJmb3JtYW5jZSBpbiByYXN0ZXItaGVhdnkgbWFwcy5cbiAgICAgKlxuICAgICAqIEB2YXIge3N0cmluZ30gbWF4UGFyYWxsZWxJbWFnZVJlcXVlc3RzXG4gICAgICogQHJldHVybnMge251bWJlcn0gTnVtYmVyIG9mIHBhcmFsbGVsIHJlcXVlc3RzIGN1cnJlbnRseSBjb25maWd1cmVkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwYm94Z2wubWF4UGFyYWxsZWxJbWFnZVJlcXVlc3RzID0gMTA7XG4gICAgICovXG4gICAgZ2V0IG1heFBhcmFsbGVsSW1hZ2VSZXF1ZXN0cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY29uZmlnLk1BWF9QQVJBTExFTF9JTUFHRV9SRVFVRVNUUztcbiAgICB9LFxuXG4gICAgc2V0IG1heFBhcmFsbGVsSW1hZ2VSZXF1ZXN0cyhudW1SZXF1ZXN0czogbnVtYmVyKSB7XG4gICAgICAgIGNvbmZpZy5NQVhfUEFSQUxMRUxfSU1BR0VfUkVRVUVTVFMgPSBudW1SZXF1ZXN0cztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGJyb3dzZXIgc3RvcmFnZSB1c2VkIGJ5IHRoaXMgbGlicmFyeS4gVXNpbmcgdGhpcyBtZXRob2QgZmx1c2hlcyB0aGUgTWFwYm94IHRpbGVcbiAgICAgKiBjYWNoZSB0aGF0IGlzIG1hbmFnZWQgYnkgdGhpcyBsaWJyYXJ5LiBUaWxlcyBtYXkgc3RpbGwgYmUgY2FjaGVkIGJ5IHRoZSBicm93c2VyXG4gICAgICogaW4gc29tZSBjYXNlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgQVBJIGlzIHN1cHBvcnRlZCBvbiBicm93c2VycyB3aGVyZSB0aGUgW2BDYWNoZWAgQVBJXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ2FjaGUpXG4gICAgICogaXMgc3VwcG9ydGVkIGFuZCBlbmFibGVkLiBUaGlzIGluY2x1ZGVzIGFsbCBtYWpvciBicm93c2VycyB3aGVuIHBhZ2VzIGFyZSBzZXJ2ZWQgb3ZlclxuICAgICAqIGBodHRwczovL2AsIGV4Y2VwdCBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBNb2JpbGUuXG4gICAgICpcbiAgICAgKiBXaGVuIGNhbGxlZCBpbiB1bnN1cHBvcnRlZCBicm93c2VycyBvciBlbnZpcm9ubWVudHMgKHByaXZhdGUgb3IgaW5jb2duaXRvIG1vZGUpLCB0aGVcbiAgICAgKiBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGFuIGVycm9yIGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogQGZ1bmN0aW9uIGNsZWFyU3RvcmFnZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCB3aXRoIGFuIGVycm9yIGFyZ3VtZW50IGlmIHRoZXJlIGlzIGFuIGVycm9yLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwYm94Z2wuY2xlYXJTdG9yYWdlKCk7XG4gICAgICovXG4gICAgY2xlYXJTdG9yYWdlKGNhbGxiYWNrPzogKGVycjogP0Vycm9yKSA9PiB2b2lkKSB7XG4gICAgICAgIGNsZWFyVGlsZUNhY2hlKGNhbGxiYWNrKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgbG9hZGluZyBtYXBib3gtZ2wncyBXZWJXb3JrZXIgYnVuZGxlIGZyb20gYSBzZWxmLWhvc3RlZCBVUkwuXG4gICAgICogVGhpcyBuZWVkcyB0byBiZSBzZXQgb25seSBvbmNlLCBhbmQgYmVmb3JlIGFueSBjYWxsIHRvIGBuZXcgbWFwYm94Z2wuTWFwKC4uKWAgdGFrZXMgcGxhY2UuXG4gICAgICogVGhpcyBpcyB1c2VmdWwgaWYgeW91ciBzaXRlIG5lZWRzIHRvIG9wZXJhdGUgaW4gYSBzdHJpY3QgQ1NQIChDb250ZW50IFNlY3VyaXR5IFBvbGljeSkgZW52aXJvbm1lbnRcbiAgICAgKiB3aGVyZWluIHlvdSBhcmUgbm90IGFsbG93ZWQgdG8gbG9hZCBKYXZhU2NyaXB0IGNvZGUgZnJvbSBhIFtgQmxvYmAgVVJMXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVVJML2NyZWF0ZU9iamVjdFVSTCksIHdoaWNoIGlzIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgICpcbiAgICAgKiBTZWUgb3VyIGRvY3VtZW50YXRpb24gb24gW0NTUCBEaXJlY3RpdmVzXShodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvYXBpLyNjc3AtZGlyZWN0aXZlcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEB2YXIge3N0cmluZ30gd29ya2VyVXJsXG4gICAgICogQHJldHVybnMge3N0cmluZ30gQSBVUkwgaG9zdGluZyBhIEphdmFTY3JpcHQgYnVuZGxlIGZvciBtYXBib3gtZ2wncyBXZWJXb3JrZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiA8c2NyaXB0IHNyYz0naHR0cHM6Ly9hcGkubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvdjIuMy4xL21hcGJveC1nbC1jc3AuanMnPjwvc2NyaXB0PlxuICAgICAqIDxzY3JpcHQ+XG4gICAgICogbWFwYm94Z2wud29ya2VyVXJsID0gXCJodHRwczovL2FwaS5tYXBib3guY29tL21hcGJveC1nbC1qcy92Mi4zLjEvbWFwYm94LWdsLWNzcC13b3JrZXIuanNcIjtcbiAgICAgKiAuLi5cbiAgICAgKiA8L3NjcmlwdD5cbiAgICAgKi9cbiAgICB3b3JrZXJVcmw6ICcnLFxuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBleHRlcm5hbCBtb2R1bGUgYnVuZGxlcnMgc3VjaCBhcyBXZWJwYWNrIG9yIFJvbGx1cCB0byBwYWNrYWdlXG4gICAgICogbWFwYm94LWdsJ3MgV2ViV29ya2VyIGludG8gYSBzZXBhcmF0ZSBjbGFzcyBhbmQgaW50ZWdyYXRlIGl0IHdpdGggdGhlIGxpYnJhcnkuXG4gICAgICpcbiAgICAgKiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgYG1hcGJveGdsLndvcmtlclVybGAuXG4gICAgICpcbiAgICAgKiBAdmFyIHtPYmplY3R9IHdvcmtlckNsYXNzXG4gICAgICogQHJldHVybnMge09iamVjdCB8IG51bGx9IEEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBgV29ya2VyYCBpbnRlcmZhY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBpbXBvcnQgbWFwYm94Z2wgZnJvbSAnbWFwYm94LWdsL2Rpc3QvbWFwYm94LWdsLWNzcC5qcyc7XG4gICAgICogaW1wb3J0IE1hcGJveEdMV29ya2VyIGZyb20gJ21hcGJveC1nbC9kaXN0L21hcGJveC1nbC1jc3Atd29ya2VyLmpzJztcbiAgICAgKlxuICAgICAqIG1hcGJveGdsLndvcmtlckNsYXNzID0gTWFwYm94R0xXb3JrZXI7XG4gICAgICovXG4gICAgd29ya2VyQ2xhc3M6IG51bGwsXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0aW1lIHVzZWQgYnkgTWFwYm94IEdMIEpTIGludGVybmFsbHkgZm9yIGFsbCBhbmltYXRpb25zLiBVc2VmdWwgZm9yIGdlbmVyYXRpbmcgdmlkZW9zIGZyb20gTWFwYm94IEdMIEpTLlxuICAgICAqXG4gICAgICogQHZhciB7bnVtYmVyfSB0aW1lXG4gICAgICovXG4gICAgc2V0Tm93OiBicm93c2VyLnNldE5vdyxcblxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSBpbnRlcm5hbCBhbmltYXRpb24gdGltaW5nIHRvIGZvbGxvdyByZWd1bGFyIGNvbXB1dGVyIHRpbWUgKGBwZXJmb3JtYW5jZS5ub3coKWApLlxuICAgICAqL1xuICAgIHJlc3RvcmVOb3c6IGJyb3dzZXIucmVzdG9yZU5vd1xufTtcblxuLy9UaGlzIGdldHMgYXV0b21hdGljYWxseSBzdHJpcHBlZCBvdXQgaW4gcHJvZHVjdGlvbiBidWlsZHMuXG5EZWJ1Zy5leHRlbmQoZXhwb3J0ZWQsIHtpc1NhZmFyaSwgZ2V0UGVyZm9ybWFuY2VNZXRyaWNzOiBQZXJmb3JtYW5jZVV0aWxzLmdldFBlcmZvcm1hbmNlTWV0cmljcywgZ2V0UGVyZm9ybWFuY2VNZXRyaWNzQXN5bmM6IFdvcmtlclBlcmZvcm1hbmNlVXRpbHMuZ2V0UGVyZm9ybWFuY2VNZXRyaWNzQXN5bmN9KTtcblxuLyoqXG4gKiBHZXRzIHRoZSB2ZXJzaW9uIG9mIE1hcGJveCBHTCBKUyBpbiB1c2UgYXMgc3BlY2lmaWVkIGluIGBwYWNrYWdlLmpzb25gLFxuICogYENIQU5HRUxPRy5tZGAsIGFuZCB0aGUgR2l0SHViIHJlbGVhc2UuXG4gKlxuICogQHZhciB7c3RyaW5nfSB2ZXJzaW9uXG4gKiBAZXhhbXBsZVxuICogY29uc29sZS5sb2coYE1hcGJveCBHTCBKUyB2JHttYXBib3hnbC52ZXJzaW9ufWApO1xuICovXG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIHRoZSBicm93c2VyIFtzdXBwb3J0cyBNYXBib3ggR0wgSlNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vaGVscC9tYXBib3gtYnJvd3Nlci1zdXBwb3J0LyNtYXBib3gtZ2wtanMpLlxuICpcbiAqIEBmdW5jdGlvbiBzdXBwb3J0ZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdD1mYWxzZV0gSWYgYHRydWVgLFxuICogICB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gYGZhbHNlYCBpZiB0aGUgcGVyZm9ybWFuY2Ugb2YgTWFwYm94IEdMIEpTIHdvdWxkXG4gKiAgIGJlIGRyYW1hdGljYWxseSB3b3JzZSB0aGFuIGV4cGVjdGVkIChmb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBXZWJHTCByZW5kZXJlclxuICogICB3b3VsZCBiZSB1c2VkKS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICogLy8gU2hvdyBhbiBhbGVydCBpZiB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IE1hcGJveCBHTFxuICogaWYgKCFtYXBib3hnbC5zdXBwb3J0ZWQoKSkge1xuICogICAgIGFsZXJ0KCdZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBNYXBib3ggR0wnKTtcbiAqIH1cbiAqIEBzZWUgW0V4YW1wbGU6IENoZWNrIGZvciBicm93c2VyIHN1cHBvcnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2hlY2stZm9yLXN1cHBvcnQvKVxuICovXG5cbi8qKlxuICogU2V0cyB0aGUgbWFwJ3MgW1JUTCB0ZXh0IHBsdWdpbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvcGx1Z2lucy8jbWFwYm94LWdsLXJ0bC10ZXh0KS5cbiAqIE5lY2Vzc2FyeSBmb3Igc3VwcG9ydGluZyB0aGUgQXJhYmljIGFuZCBIZWJyZXcgbGFuZ3VhZ2VzLCB3aGljaCBhcmUgd3JpdHRlbiByaWdodC10by1sZWZ0LiBNYXBib3ggU3R1ZGlvIGxvYWRzIHRoaXMgcGx1Z2luIGJ5IGRlZmF1bHQuXG4gKlxuICogQGZ1bmN0aW9uIHNldFJUTFRleHRQbHVnaW5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwbHVnaW5VUkwgVVJMIHBvaW50aW5nIHRvIHRoZSBNYXBib3ggUlRMIHRleHQgcGx1Z2luIHNvdXJjZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCB3aXRoIGFuIGVycm9yIGFyZ3VtZW50IGlmIHRoZXJlIGlzIGFuIGVycm9yLCBvciBubyBhcmd1bWVudHMgaWYgdGhlIHBsdWdpbiBsb2FkcyBzdWNjZXNzZnVsbHkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGxhenkgSWYgc2V0IHRvIGB0cnVlYCwgTWFwYm94R0wgd2lsbCBkZWZlciBsb2FkaW5nIHRoZSBwbHVnaW4gdW50aWwgcmlnaHQtdG8tbGVmdCB0ZXh0IGlzIGVuY291bnRlcmVkLCBhbmRcbiAqICAgIHJpZ2h0LXRvLWxlZnQgdGV4dCB3aWxsIGJlIHJlbmRlcmVkIG9ubHkgYWZ0ZXIgdGhlIHBsdWdpbiBmaW5pc2hlcyBsb2FkaW5nLlxuICogQGV4YW1wbGVcbiAqIG1hcGJveGdsLnNldFJUTFRleHRQbHVnaW4oJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3BsdWdpbnMvbWFwYm94LWdsLXJ0bC10ZXh0L3YwLjIuMC9tYXBib3gtZ2wtcnRsLXRleHQuanMnKTtcbiAqIEBzZWUgW0V4YW1wbGU6IEFkZCBzdXBwb3J0IGZvciByaWdodC10by1sZWZ0IHNjcmlwdHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbWFwYm94LWdsLXJ0bC10ZXh0LylcbiAqL1xuXG4vKipcbiAgKiBHZXRzIHRoZSBtYXAncyBbUlRMIHRleHQgcGx1Z2luXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9wbHVnaW5zLyNtYXBib3gtZ2wtcnRsLXRleHQpIHN0YXR1cy5cbiAgKiBUaGUgc3RhdHVzIGNhbiBiZSBgdW5hdmFpbGFibGVgIChub3QgcmVxdWVzdGVkIG9yIHJlbW92ZWQpLCBgbG9hZGluZ2AsIGBsb2FkZWRgLCBvciBgZXJyb3JgLlxuICAqIElmIHRoZSBzdGF0dXMgaXMgYGxvYWRlZGAgYW5kIHRoZSBwbHVnaW4gaXMgcmVxdWVzdGVkIGFnYWluLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgKlxuICAqIEBmdW5jdGlvbiBnZXRSVExUZXh0UGx1Z2luU3RhdHVzXG4gICogQGV4YW1wbGVcbiAgKiBjb25zdCBwbHVnaW5TdGF0dXMgPSBtYXBib3hnbC5nZXRSVExUZXh0UGx1Z2luU3RhdHVzKCk7XG4gICovXG5cbmV4cG9ydCBkZWZhdWx0IGV4cG9ydGVkO1xuXG4vLyBjYW5hcnkgYXNzZXJ0OiB1c2VkIHRvIGNvbmZpcm0gdGhhdCBhc3NlcnRzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gcHJvZHVjdGlvbiBidWlsZFxuYXNzZXJ0KHRydWUsICdjYW5hcnkgYXNzZXJ0Jyk7XG4iLCIvL1xuLy8gT3VyIGN1c3RvbSBpbnRybyBwcm92aWRlcyBhIHNwZWNpYWxpemVkIFwiZGVmaW5lKClcIiBmdW5jdGlvbiwgY2FsbGVkIGJ5IHRoZVxuLy8gQU1EIG1vZHVsZXMgYmVsb3csIHRoYXQgc2V0cyB1cCB0aGUgd29ya2VyIGJsb2IgVVJMIGFuZCB0aGVuIGV4ZWN1dGVzIHRoZVxuLy8gbWFpbiBtb2R1bGUsIHN0b3JpbmcgaXRzIGV4cG9ydGVkIHZhbHVlIGFzICdtYXBib3hnbCdcblxuLy8gVGhlIHRocmVlIFwiY2h1bmtzXCIgaW1wb3J0ZWQgaGVyZSBhcmUgcHJvZHVjZWQgYnkgYSBmaXJzdCBSb2xsdXAgcGFzcyxcbi8vIHdoaWNoIG91dHB1dHMgdGhlbSBhcyBBTUQgbW9kdWxlcy5cblxuLy8gU2hhcmVkIGRlcGVuZGVuY2llcywgaS5lLjpcbi8qXG5kZWZpbmUoWydleHBvcnRzJ10sIGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gICAgLy8gQ29kZSBmb3IgYWxsIGNvbW1vbiBkZXBlbmRlbmNpZXNcbiAgICAvLyBFYWNoIG1vZHVsZSdzIGV4cG9ydHMgYXJlIGF0dGFjaGVkIGF0dGFjaGVkIHRvICdleHBvcnRzJyAod2l0aFxuICAgIC8vIG5hbWVzIHJld3JpdHRlbiB0byBhdm9pZCBjb2xsaXNpb25zLCBldGMuKVxufSlcbiovXG5pbXBvcnQgJy4vYnVpbGQvbWFwYm94Z2wvc2hhcmVkJztcblxuLy8gV29ya2VyIGFuZCBpdHMgdW5pcXVlIGRlcGVuZGVuY2llcywgaS5lLjpcbi8qXG5kZWZpbmUoWycuL3NoYXJlZC5qcyddLCBmdW5jdGlvbiAoX19zaGFyZWRfX2pzKSB7XG4gICAgLy8gIENvZGUgZm9yIHdvcmtlciBzY3JpcHQgYW5kIGl0cyB1bmlxdWUgZGVwZW5kZW5jaWVzLlxuICAgIC8vICBFeHBlY3RzIHRoZSBvdXRwdXQgb2YgJ3NoYXJlZCcgbW9kdWxlIHRvIGJlIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCxcbiAgICAvLyAgc2luY2UgYWxsIHJlZmVyZW5jZXMgdG8gY29tbW9uIGRlcHMgbG9vayBsaWtlLCBlLmcuLFxuICAgIC8vICBfX3NoYXJlZF9fanMuc2hhcGVUZXh0KCkuXG59KTtcbiovXG4vLyBXaGVuIHRoaXMgd3JhcHBlciBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gb3VyIGN1c3RvbSBkZWZpbmUoKSBhYm92ZSxcbi8vIGl0IGdldHMgc3RyaW5naWZpZWQsIHRvZ2V0aGVyIHdpdGggdGhlIHNoYXJlZCB3cmFwcGVyICh1c2luZ1xuLy8gRnVuY3Rpb24udG9TdHJpbmcoKSksIGFuZCB0aGUgcmVzdWx0aW5nIHN0cmluZyBvZiBjb2RlIGlzIG1hZGUgaW50byBhXG4vLyBCbG9iIFVSTCB0aGF0IGdldHMgdXNlZCBieSB0aGUgbWFpbiBtb2R1bGUgdG8gY3JlYXRlIHRoZSB3ZWIgd29ya2Vycy5cbmltcG9ydCAnLi9idWlsZC9tYXBib3hnbC93b3JrZXInO1xuXG4vLyBNYWluIG1vZHVsZSBhbmQgaXRzIHVuaXF1ZSBkZXBlbmRlbmNpZXNcbi8qXG5kZWZpbmUoWycuL3NoYXJlZC5qcyddLCBmdW5jdGlvbiAoX19zaGFyZWRfX2pzKSB7XG4gICAgLy8gIENvZGUgZm9yIG1haW4gR0wgSlMgbW9kdWxlIGFuZCBpdHMgdW5pcXVlIGRlcGVuZGVuY2llcy5cbiAgICAvLyAgRXhwZWN0cyB0aGUgb3V0cHV0IG9mICdzaGFyZWQnIG1vZHVsZSB0byBiZSBwYXNzZWQgaW4gYXMgYW4gYXJndW1lbnQsXG4gICAgLy8gIHNpbmNlIGFsbCByZWZlcmVuY2VzIHRvIGNvbW1vbiBkZXBzIGxvb2sgbGlrZSwgZS5nLixcbiAgICAvLyAgX19zaGFyZWRfX2pzLnNoYXBlVGV4dCgpLlxuICAgIC8vXG4gICAgLy8gIFJldHVybnMgdGhlIGFjdHVhbCBtYXBib3hnbCAoaS5lLiBzcmMvaW5kZXguanMpXG59KTtcbiovXG5pbXBvcnQgJy4vYnVpbGQvbWFwYm94Z2wvaW5kZXgnO1xuXG5leHBvcnQgZGVmYXVsdCBtYXBib3hnbDtcbiJdLCJuYW1lcyI6WyJyZXF1aXJlJCQwIiwicmVxdWlyZSQkMSIsIlBvaW50IiwiYXNzZXJ0IiwiYmV6aWVyIiwiVW5pdEJlemllciIsImV4dGVuZCIsImNsb25lIiwid2luZG93IiwiZXhwb3J0ZWQiLCJ3ZWJwU3VwcG9ydGVkIiwic2RrVmVyc2lvbiIsImFycmF5IiwidG9TdHJpbmciLCJwYXJzZUNTU0NvbG9yIiwidHlwZXMiLCJ2YWx1ZVRvU3RyaW5nIiwiUGFyc2luZ0NvbnRleHQiLCJFWFRFTlQiLCJtZXJjYXRvclhmcm9tTG5nIiwibWVyY2F0b3JZZnJvbUxhdCIsImludGVycG9sYXRlTnVtYmVyIiwidHlwZVRvU3RyaW5nIiwiZGVmaW5pdGlvbnMiLCJpc0NvbnN0YW50LmlzU3RhdGVDb25zdGFudCIsImlzRmVhdHVyZUNvbnN0YW50IiwiaXNDb25zdGFudC5pc0ZlYXR1cmVDb25zdGFudCIsImlzQ29uc3RhbnQuaXNHbG9iYWxQcm9wZXJ0eUNvbnN0YW50IiwidmFsaWRhdGVTcGVjIiwibGF0ZXN0IiwidmFsaWRhdGVGaWx0ZXIiLCJ2YWxpZGF0ZVBhaW50UHJvcGVydHkiLCJ2YWxpZGF0ZUxheW91dFByb3BlcnR5IiwidmFsaWRhdGVMYXllciIsInZhbGlkYXRlU291cmNlIiwidmFsaWRhdGVMaWdodCIsInZhbGlkYXRlVGVycmFpbiIsInZhbGlkYXRlRm9nIiwibGF0ZXN0U3R5bGVTcGVjIiwiX3ZhbGlkYXRlU291cmNlIiwiX3ZhbGlkYXRlTGlnaHQiLCJfdmFsaWRhdGVUZXJyYWluIiwiX3ZhbGlkYXRlRm9nIiwiX3ZhbGlkYXRlTGF5ZXIiLCJfdmFsaWRhdGVGaWx0ZXIiLCJfdmFsaWRhdGVQYWludFByb3BlcnR5IiwiX3ZhbGlkYXRlTGF5b3V0UHJvcGVydHkiLCJHcmlkIiwiZGVzZXJpYWxpemUiLCJpc0NoYXIiLCJicm93c2VyIiwicnRsVGV4dFBsdWdpbiIsImFsaWduIiwibXVybXVyMyIsIm11cm11cjIiLCJzd2FwIiwiUGF0dGVybkxheW91dEFycmF5IiwiRGFzaExheW91dEFycmF5Iiwic3R5bGVTcGVjIiwiZmVhdHVyZUZpbHRlciIsIm1lbWJlcnMiLCJzaXplIiwiYWxpZ25tZW50IiwiTG5nTGF0IiwicmVzYW1wbGUiLCJhZGRHbG9iZUV4dFZlcnRleCIsIkNpcmNsZUxheW91dEFycmF5IiwiVHJpYW5nbGVJbmRleEFycmF5IiwidHJhbnNsYXRlIiwibGF5b3V0IiwicGFpbnQiLCJlcXVhbHMiLCJjcmVhdGUiLCJnbE1hdHJpeC5BUlJBWV9UWVBFIiwiY29weSIsImlkZW50aXR5IiwiZnJvbVZhbHVlcyIsInNldCIsInRyYW5zcG9zZSIsImludmVydCIsImFkam9pbnQiLCJkZXRlcm1pbmFudCIsIm11bHRpcGx5Iiwicm90YXRlIiwic2NhbGUiLCJmcm9tUm90YXRpb24iLCJmcm9tU2NhbGluZyIsInN0ciIsImZyb2IiLCJhZGQiLCJzdWJ0cmFjdCIsImV4YWN0RXF1YWxzIiwiZ2xNYXRyaXguRVBTSUxPTiIsIm11bHRpcGx5U2NhbGFyIiwibXVsdGlwbHlTY2FsYXJBbmRBZGQiLCJtdWwiLCJzdWIiLCJmcm9tVHJhbnNsYXRpb24iLCJmcm9tTWF0NCIsImZyb21RdWF0Iiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwiZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24iLCJnZXRUcmFuc2xhdGlvbiIsImxlbmd0aCIsImRpdmlkZSIsImNlaWwiLCJmbG9vciIsIm1pbiIsIm1heCIsInJvdW5kIiwic2NhbGVBbmRBZGQiLCJkaXN0YW5jZSIsInNxdWFyZWREaXN0YW5jZSIsInNxdWFyZWRMZW5ndGgiLCJuZWdhdGUiLCJpbnZlcnNlIiwibm9ybWFsaXplIiwiZG90IiwiY3Jvc3MiLCJsZXJwIiwicmFuZG9tIiwiZ2xNYXRyaXguUkFORE9NIiwidHJhbnNmb3JtTWF0NCIsInRyYW5zZm9ybU1hdDMiLCJ0cmFuc2Zvcm1RdWF0IiwiYW5nbGUiLCJ6ZXJvIiwiZGl2IiwiZGlzdCIsInNxckRpc3QiLCJsZW4iLCJzcXJMZW4iLCJmb3JFYWNoIiwic2xlcnAiLCJjb25qdWdhdGUiLCJ2ZWM0LmNsb25lIiwidmVjNC5mcm9tVmFsdWVzIiwidmVjNC5jb3B5IiwidmVjNC5zZXQiLCJ2ZWM0LmFkZCIsInZlYzQuc2NhbGUiLCJ2ZWM0LmRvdCIsInZlYzQubGVycCIsInZlYzQubGVuZ3RoIiwidmVjNC5zcXVhcmVkTGVuZ3RoIiwidmVjNC5ub3JtYWxpemUiLCJ2ZWM0LmV4YWN0RXF1YWxzIiwidmVjNC5lcXVhbHMiLCJ2ZWMzLmNyZWF0ZSIsInZlYzMuZnJvbVZhbHVlcyIsInZlYzMuZG90IiwidmVjMy5jcm9zcyIsInZlYzMubGVuIiwidmVjMy5ub3JtYWxpemUiLCJtYXQzLmNyZWF0ZSIsInF1YXQuY3JlYXRlIiwibWF0NC5nZXRSb3RhdGlvbiIsIm1hdDQuZ2V0VHJhbnNsYXRpb24iLCJxdWF0LmNvcHkiLCJxdWF0LnJvdGF0ZVgiLCJxdWF0LnJvdGF0ZVkiLCJxdWF0LnJvdGF0ZVoiLCJxdWF0LmRvdCIsInF1YXQubGVuZ3RoIiwicXVhdC5zcXVhcmVkTGVuZ3RoIiwidmVjMy5zcXVhcmVkTGVuZ3RoIiwidmVjMy5lcXVhbHMiLCJ2ZWMzLnRyYW5zZm9ybU1hdDQiLCJ2ZWM0LnRyYW5zZm9ybU1hdDQiLCJ2ZWM0Lm11bCIsInZlYzMuc3ViIiwidmVjMy5zY2FsZSIsInZlYzMuYWRkIiwidmVjMy5jbG9uZSIsInByb3BlcnRpZXMiLCJzaWduZWRBcmVhIiwiZGVmYXVsdENvbXBhcmUiLCJjbGFzc2lmeVJpbmdzIiwiRUFSQ1VUX01BWF9SSU5HUyIsIkZpbGxMYXlvdXRBcnJheSIsIkxpbmVJbmRleEFycmF5IiwibGF5b3V0QXR0cmlidXRlcyIsImVhcmN1dCIsIlZlY3RvclRpbGVGZWF0dXJlIiwiVmVjdG9yVGlsZUxheWVyIiwiVmVjdG9yVGlsZSIsInJlcXVpcmUkJDIiLCJ2ZWN0b3JUaWxlRmVhdHVyZVR5cGVzIiwibXZ0IiwiYWRkVmVydGV4IiwiaW50ZXJwb2xhdGUiLCJGaWxsRXh0cnVzaW9uTGF5b3V0QXJyYXkiLCJMaW5lTGF5b3V0QXJyYXkiLCJMaW5lRXh0TGF5b3V0QXJyYXkiLCJsYXlvdXRBdHRyaWJ1dGVzRXh0IiwiYm9yZGVyIiwiUHJvdG9idWYiLCJRdWV1ZSIsIlN5bWJvbEJ1Y2tldCIsInZlYzMubGVuZ3RoIiwibWF0NC5pZGVudGl0eSIsIm1hdDQuc2NhbGUiLCJtYXQ0Lm11bHRpcGx5IiwidmVjMy5taW4iLCJ2ZWMzLm1heCIsInZlYzMuc2NhbGVBbmRBZGQiLCJtYXQ0LnRyYW5zbGF0ZSIsInZlYzMubmVnYXRlIiwibWF0NC5yb3RhdGVYIiwibWF0NC5yb3RhdGVZIiwibWF0NC5tdWwiLCJtYXQ0LmNyZWF0ZSIsIm1hdDQuZnJvbVJvdGF0aW9uIiwidmVjMy5zdWJ0cmFjdCIsInZlYzMuYW5nbGUiLCJQb3NBcnJheSIsIkdsb2JlVmVydGV4QXJyYXkiLCJnbG9iZUxheW91dEF0dHJpYnV0ZXMiLCJtYXhQaGkiLCJTeW1ib2xMYXlvdXRBcnJheSIsIlN5bWJvbER5bmFtaWNMYXlvdXRBcnJheSIsIlN5bWJvbE9wYWNpdHlBcnJheSIsIlN5bWJvbEdsb2JlRXh0QXJyYXkiLCJDb2xsaXNpb25WZXJ0ZXhBcnJheSIsIkNvbGxpc2lvblZlcnRleEV4dEFycmF5IiwiZ2xvYmFsUlRMVGV4dFBsdWdpbiIsInRyYW5zZm9ybVRleHQiLCJDb2xsaXNpb25Cb3hMYXlvdXRBcnJheSIsInN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yWm9vbSIsInN5bWJvbFNpemUuZXZhbHVhdGVTaXplRm9yRmVhdHVyZSIsInF1YXQuaWRlbnRpdHkiLCJ2ZWMzLnRyYW5zZm9ybVF1YXQiLCJjaXJjbGUiLCJoZWF0bWFwIiwiaGlsbHNoYWRlIiwiZmlsbCIsImZpbGxFeHRydXNpb24iLCJsaW5lIiwic3ltYm9sIiwiYmFja2dyb3VuZCIsInJhc3RlciIsInNreSIsIkxpbmVTdHJpcEluZGV4QXJyYXkiLCJUaWxlQm91bmRzQXJyYXkiLCJkZXNlcmlhbGl6ZUJ1Y2tldCIsIkdlb0pTT05GZWF0dXJlIiwiUG9zR2xvYmVFeHRBcnJheSIsIkFMV0FZUyIsInZ0IiwicmVmUHJvcGVydGllcyIsImNyZWF0ZVN0eWxlTGF5ZXIiLCJ2YWx1ZXMiLCJERU1EYXRhIiwicmV3aW5kIiwiRmVhdHVyZVdyYXBwZXIiLCJHZW9KU09OV3JhcHBlciIsIlBiZiIsInNvcnQiLCJ0cmFuc2Zvcm0iLCJ2dHBiZiIsIlZlY3RvclRpbGVXb3JrZXJTb3VyY2UiLCJjcmVhdGVFeHByZXNzaW9uIiwiZ2V0UGVyZm9ybWFuY2VNZWFzdXJlbWVudCIsImdldEpTT04iLCJQZXJmb3JtYW5jZVV0aWxzIiwiQWN0b3IiLCJnZXRQcm9qZWN0aW9uIiwiRXZlbnQiLCJlbmZvcmNlQ2FjaGVTaXplTGltaXQiLCJSZXNvdXJjZVR5cGUiLCJnZXRJbWFnZSIsIlJHQkFJbWFnZSIsIkV2ZW50ZWQiLCJFcnJvckV2ZW50Iiwid2Fybk9uY2UiLCJJbWFnZVBvc2l0aW9uIiwiVGV4dHVyZSIsInBvdHBhY2siLCJkZWdUb1JhZCIsIlByb3BlcnRpZXMiLCJEYXRhQ29uc3RhbnRQcm9wZXJ0eSIsIlRSQU5TSVRJT05fU1VGRklYIiwiVHJhbnNpdGlvbmFibGUiLCJlbmRzV2l0aCIsImVtaXRWYWxpZGF0aW9uRXJyb3JzIiwidmFsaWRhdGVTdHlsZSIsIlRlcnJhaW4iLCJzbW9vdGhzdGVwIiwiTWVyY2F0b3JDb29yZGluYXRlIiwiZ2xvYmVUb01lcmNhdG9yVHJhbnNpdGlvbiIsInVuaXF1ZUlkIiwiYXN5bmNBbGwiLCJtYXQyLnNjYWxlIiwicG9seWdvbml6ZUJvdW5kcyIsImJ1ZmZlckNvbnZleFBvbHlnb24iLCJnZXRUaWxlUG9pbnQiLCJwb2x5Z29uSW50ZXJzZWN0c0JveCIsImdldFRpbGVWZWMzIiwiUmF5IiwiZ2V0Qm91bmRzIiwiR0xPQkVfUkFESVVTIiwicG9seWdvbkNvbnRhaW5zUG9pbnQiLCJjbGFtcCIsInBpY2siLCJMbmdMYXRCb3VuZHMiLCJEZWR1cGVkUmVxdWVzdCIsInBvc3RUdXJuc3RpbGVFdmVudCIsImxvYWRWZWN0b3JUaWxlIiwiY2FjaGVFbnRyeVBvc3NpYmx5QWRkZWQiLCJwcmV2UG93ZXJPZlR3byIsIk92ZXJzY2FsZWRUaWxlSUQiLCJtYXQzLmFkam9pbnQiLCJ2ZWMzLnRyYW5zZm9ybU1hdDMiLCJtYXQzLnRyYW5zcG9zZSIsIm1hdDMubXVsdGlwbHkiLCJ0aWxlVHJhbnNmb3JtIiwiUmFzdGVyQm91bmRzQXJyYXkiLCJib3VuZHNBdHRyaWJ1dGVzIiwiU2VnbWVudFZlY3RvciIsIkNhbm9uaWNhbFRpbGVJRCIsImdldFZpZGVvIiwiVmFsaWRhdGlvbkVycm9yIiwidmVjdG9yIiwicmFzdGVyRGVtIiwiZ2VvanNvbiIsInZpZGVvIiwiaW1hZ2UiLCJjYW52YXMiLCJjdXN0b20iLCJiaW5kQWxsIiwiaXNFcXVhbCIsImNhbGN1bGF0ZUdsb2JlTGFiZWxNYXRyaXgiLCJtYXQyLmludmVydCIsIm1hdDQucm90YXRlWiIsIm1hdDQuaW52ZXJ0IiwibWF0NC5jbG9uZSIsIldyaXRpbmdNb2RlIiwidXBkYXRlR2xvYmVWZXJ0ZXhOb3JtYWwiLCJhZGREeW5hbWljQXR0cmlidXRlcyIsInZlYzMuZGlzdGFuY2UiLCJPTkVfRU0iLCJwcm9qZWN0aW9uLnByb2plY3QiLCJwcm9qZWN0aW9uLnBsYWNlRmlyc3RBbmRMYXN0R2x5cGgiLCJwcm9qZWN0aW9uLnByb2plY3RWZWN0b3IiLCJjbGlwTGluZSIsImludGVyc2VjdGlvblRlc3RzLnBvbHlnb25JbnRlcnNlY3RzUG9seWdvbiIsInByb2plY3Rpb24ueHlUcmFuc2Zvcm1NYXQ0IiwiZ2V0QW5jaG9yQWxpZ25tZW50IiwiZXZhbHVhdGVWYXJpYWJsZU9mZnNldCIsInByb2plY3Rpb24uZ2V0TGFiZWxQbGFuZU1hdHJpeEZvclBsYWNlbWVudCIsInByb2plY3Rpb24uZ2V0R2xDb29yZE1hdHJpeCIsImdldEFuY2hvckp1c3RpZmljYXRpb24iLCJfZW1pdFZhbGlkYXRpb25FcnJvcnMiLCJkaWZmT3BlcmF0aW9ucyIsImdldFdvcmtlclBvb2wiLCJHbHlwaE1hbmFnZXIiLCJMb2NhbEdseXBoTW9kZSIsIkxpbmVBdGxhcyIsIlpvb21IaXN0b3J5IiwiZ2V0UmVmZXJyZXIiLCJ0cmlnZ2VyUGx1Z2luQ29tcGxldGlvbkV2ZW50IiwiaXNNYXBib3hVUkwiLCJkZXJlZiIsImNyZWF0ZVNvdXJjZSIsIlNvdXJjZUNhY2hlIiwidmFsaWRhdGVDdXN0b21TdHlsZUxheWVyIiwiZGVlcEVxdWFsIiwiZmlsdGVyT2JqZWN0IiwicnRsVGV4dFBsdWdpbkV2ZW50ZWQiLCJtYWtlUmVxdWVzdCIsImdldFNvdXJjZVR5cGUiLCJzZXRTb3VyY2VUeXBlIiwicmVnaXN0ZXJGb3JQbHVnaW5TdGF0ZUNoYW5nZSIsIlVuaWZvcm1NYXRyaXg0ZiIsIlVuaWZvcm0xaSIsIlVuaWZvcm0yZiIsIlVuaWZvcm1Db2xvciIsIlVuaWZvcm0xZiIsIlVuaWZvcm00ZiIsIm1hdDQub3J0aG8iLCJEZXB0aE1vZGUiLCJTdGVuY2lsTW9kZSIsIkN1bGxGYWNlTW9kZSIsIlVuaWZvcm1NYXRyaXgzZiIsIlVuaWZvcm0zZiIsImdsb2JlVXNlQ3VzdG9tQW50aUFsaWFzaW5nIiwiY2FsY3VsYXRlR2xvYmVNZXJjYXRvck1hdHJpeCIsImVhc2VDdWJpY0luT3V0IiwiZ2xvYmVUaWxlTGF0TG5nQ29ybmVycyIsImdldExhdGl0dWRpbmFsTG9kIiwiZ2V0R3JpZE1hdHJpeCIsImdsb2JlTm9ybWFsaXplRUNFRiIsImdsb2JlVGlsZUJvdW5kcyIsImdsb2JlUG9sZU1hdHJpeEZvclRpbGUiLCJDb2xvck1vZGUiLCJUaWxlIiwiRWxldmF0aW9uIiwiR0xPQkVfTUVURVJTX1RPX0VDRUYiLCJtZXJjYXRvclpmcm9tQWx0aXR1ZGUiLCJDb2xvciIsIkRlcHRoU3RlbmNpbEF0dGFjaG1lbnQiLCJpZGVudGl0eU1hdHJpeCIsIm1hdDMuZnJvbVJvdGF0aW9uIiwiVW5pZm9ybU1hdHJpeDJmIiwiZ2xvYmVQaXhlbHNUb1RpbGVVbml0cyIsImdsb2JlRUNFRk9yaWdpbiIsIkNvbGxpc2lvbkNpcmNsZUxheW91dEFycmF5IiwiY29sbGlzaW9uQ2lyY2xlTGF5b3V0IiwiUXVhZFRyaWFuZ2xlQXJyYXkiLCJzeW1ib2xQcm9qZWN0aW9uLmdldExhYmVsUGxhbmVNYXRyaXhGb3JSZW5kZXJpbmciLCJzeW1ib2xTaXplIiwic3ltYm9sUHJvamVjdGlvbi5oaWRlR2x5cGhzIiwic3ltYm9sUHJvamVjdGlvbi5wcm9qZWN0VmVjdG9yIiwic3ltYm9sUHJvamVjdGlvbi5nZXRQZXJzcGVjdGl2ZVJhdGlvIiwic3ltYm9sUHJvamVjdGlvbi5nZXRHbENvb3JkTWF0cml4Iiwic3ltYm9sUHJvamVjdGlvbi5nZXRMYWJlbFBsYW5lTWF0cml4Rm9yUGxhY2VtZW50Iiwic3ltYm9sUHJvamVjdGlvbi51cGRhdGVMaW5lTGFiZWxzIiwibmV4dFBvd2VyT2ZUd28iLCJyZW5kZXJDb2xvclJhbXAiLCJkcmF3IiwiZmlsbEV4dHJ1c2lvbkhlaWdodExpZnQiLCJGaWxsRXh0cnVzaW9uQnVja2V0IiwiY3JlYXRlTGF5b3V0IiwiU2t5Ym94VmVydGV4QXJyYXkiLCJza3lib3hBdHRyaWJ1dGVzIiwibWF0My5mcm9tTWF0NCIsIm1hdDQuZnJvbVF1YXQiLCJtYXBWYWx1ZSIsIkF0bW9zcGhlcmVWZXJ0ZXhBcnJheSIsImRlYnVnIiwiQ29udGV4dCIsInBvc0F0dHJpYnV0ZXMiLCJHbG9iZVNoYXJlZEJ1ZmZlcnMiLCJpc01hcEF1dGhlbnRpY2F0ZWQiLCJEZWJ1ZyIsIm51bWJlciIsImdldENvbHVtbiIsInNldENvbHVtbiIsIndyYXAiLCJtYXQ0LmZyb21TY2FsaW5nIiwicXVhdC5jb25qdWdhdGUiLCJtYXQ0LnBlcnNwZWN0aXZlIiwiTUFYX01FUkNBVE9SX0xBVElUVURFIiwibWF0Mi5jcmVhdGUiLCJtYXQyLnJvdGF0ZSIsInF1YXQuZXhhY3RFcXVhbHMiLCJ2ZWMzLmV4YWN0RXF1YWxzIiwicXVhdC5ub3JtYWxpemUiLCJVbndyYXBwZWRUaWxlSUQiLCJGcnVzdHVtIiwidGlsZUFBQkIiLCJsYXRGcm9tTWVyY2F0b3JZIiwiY2lyY3VtZmVyZW5jZUF0TGF0aXR1ZGUiLCJHTE9CRV9aT09NX1RIUkVTSE9MRF9NSU4iLCJnZXRBQUJCUG9pbnRTcXVhcmVEaXN0IiwiZnVydGhlc3RUaWxlQ29ybmVyIiwiR0xPQkVfU0NBTEVfTUFUQ0hfTEFUSVRVREUiLCJGcnVzdHVtQ29ybmVycyIsImNhbGN1bGF0ZUdsb2JlTWF0cml4IiwidmVjMy5tdWx0aXBseSIsInJhZFRvRGVnIiwiRE9NLm1vdXNlUG9zIiwiRE9NLnRvdWNoUG9zIiwiRE9NLmRpc2FibGVEcmFnIiwiRE9NLmNyZWF0ZSIsIkRPTS5zdXBwcmVzc0NsaWNrIiwiRE9NLmVuYWJsZURyYWciLCJET00ubW91c2VCdXR0b24iLCJkZWZhdWx0T3B0aW9ucyIsIl9lYXNlIiwidmVjMy5kaXYiLCJ2ZWMzLm11bCIsIkFhYmIiLCJkZWZhdWx0RWFzaW5nIiwiY29uZmlnIiwiRE9NLmNyZWF0ZVNWRyIsImlzTG5nTGF0QmVoaW5kR2xvYmUiLCJnbG9iZVRpbHRBdExuZ0xhdCIsImdsb2JlQ2VudGVyVG9TY3JlZW5Qb2ludCIsIlBlcmZvcm1hbmNlTWFya2VycyIsImlzU2FmYXJpV2l0aEFudGlhbGlhc2luZ0J1ZyIsIlJlcXVlc3RNYW5hZ2VyIiwiR0xPQkVfWk9PTV9USFJFU0hPTERfTUFYIiwic3RvcmVBdXRoU3RhdGUiLCJFdmFsdWF0aW9uUGFyYW1ldGVycyIsImdldE1hcFNlc3Npb25BUEkiLCJBVVRIX0VSUl9NU0ciLCJwb3N0TWFwTG9hZEV2ZW50IiwicmVtb3ZlQXV0aFN0YXRlIiwic2V0Q2FjaGVMaW1pdHMiLCJ2ZXJzaW9uIiwicGVyZm9ybWFuY2UiLCJzZXRSVExUZXh0UGx1Z2luIiwiZ2V0UlRMVGV4dFBsdWdpblN0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QUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxLQUFLLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFVBQVUsTUFBTSxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDNUU7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SSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdkIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDdEIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxZQUFZLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDOUIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRTtBQUM3QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxFQUFFLFdBQVc7QUFDdEIsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzlCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLEVB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WUFBWSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEMsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3ZCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkQsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3JCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEQsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ3RCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEMsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDMUQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFO0FBQ3hCLElBQUksSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDekIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzFFLEtBQUssTUFBTTtBQUNYLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FB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O0FBQ3ZCLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLEdBQUc7QUFDSCxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFBOzs7QUN6ZkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUI7QUFDbEQsSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDMUIsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDckUsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzQyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ3JELFNBQVM7QUFDVCxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTCxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtBQUMzRCxRQUFRLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUNuRCxRQUFRLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksY0FBYyxHQUFHO0FBQ3JCLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hELEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hELEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pELEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkQsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkQsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEQsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRCxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5RCxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RCxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxFQUFFLGdCQUFnQixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlELEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9ELEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQy9ELEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pELEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFELEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVELEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdELEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BELEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9DLEVBQUUsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hELEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BELEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3BELEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQy9ELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdELEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRSxFQUFFLGdCQUFnQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEQsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakQsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRSxFQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRSxFQUFFLGdCQUFnQixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdEUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakQsRUFBRSxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckQsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEQsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEQsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUQsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkQsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckQsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxH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TDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLDJCQUEyQixxQ0FBcUM7QUFDcEUsUUFBUSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2xDLFFBQVEsT0FBTztBQUNmLFlBQVksQ0FBQztBQUNiLFlBQVksQ0FBQztBQUNiLFlBQVksQ0FBQztBQUNiLFlBQVksQ0FBQztBQUNiLFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEMsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7O0FDaklsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLE1BQU0sUUFBUSxDQUFDO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFX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QUUsRUFBRTtBQUMvQixJQUFJLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsSUFBSSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLElBQUksTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixJQUFJLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsSUFBSSxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUNEO0FBQ0EsU0FBUyxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDakMsSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEgsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLGtCQUFrQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDMUMsSUFBSSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDdkIsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3RELFFBQVEsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDL0QsWUFBWSxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUN0RSxZQUFZLElBQUksWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUM1RSxTQUFTO0FBQ1QsS0FBSztBQUNMLElBQUksT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFO0FBQzlDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDOUMsUUFBUSxJQUFJLGtCQUFrQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQztBQUNoRSxLQUFLO0FBQ0wsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3RCLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDM0MsQ0FBQztBQUNEO0FBQ0E7QUFDQSxVQUFVLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDbkM7QUFDQSxJQUFJLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsSUFBSSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUksTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixJQUFJLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0IsSUFBSSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLElBQUksTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLElBQUksTUFBTSxJQUFJLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDdEMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcs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QUFzQixJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRixZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLFNBQVM7QUFDVDtBQUNBLFFBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pELEtBQUssTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLEVBQUU7QUFDdEMsUUFBUSxzQkFBc0IsR0FBRyxzQkFBc0IsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEY7QUFDQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3ZELFlBQVksUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekMsU0FBUztBQUNULFFBQVEsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pELEtBQUssTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUU7QUFDckMsUUFBUSxzQkFBc0IsR0FBRyxzQkFBc0IsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEY7QUFDQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3ZELFlBQVksUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxH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LENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGtCQUFrQjtBQUN2SixRQUFRLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxPQUFPLENBQUMsQ0FBQztBQUNqQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsdUJBQXVCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDdkQsUUFBUSxDQUFDLHVCQUF1QixFQUFFLHlCQUF5QixDQUFDLENBQUM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLHNCQUFzQixTQUFTLFdBQVcsQ0FBQztBQUNqRDtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRztBQUNwQixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDeEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsa0JBQWtCO0FBQ3hILFFBQVEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUM5QixRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFFBQVEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0QsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGtCQUFrQjtBQUMvSCxRQUFRLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxPQUFPLENBQUMsQ0FBQztBQUNqQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0Esc0JBQXNCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDdEQsUUFBUSxDQUFDLHNCQUFzQixFQUFFLHdCQUF3QixDQUFDLENBQUM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLHFCQUFxQixTQUFTLFdBQVcsQ0FBQztBQUNoRDtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRztBQUNwQixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGtCQUFrQjtBQUNoRyxRQUFRLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDOUIsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQixRQUFRLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN2RCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGtCQUFrQjtBQUN2RyxRQUFRLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxPQUFPLENBQUMsQ0FBQztBQUNqQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EscUJBQXFCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDckQsUUFBUSxDQUFDLHFCQUFxQixFQUFFLHVCQUF1QixDQUFDLENBQUM7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSwwQkFBMEIsU0FBUyxXQUFXLENBQUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRztBQUNwQixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdEQsUUFBUSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN4RCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRyxVQUFVLEdBQUcsa0JBQWtCO0FBQzFLLFFBQVEsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUM5QixRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNCLFFBQVEsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2pGLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRyxVQUFVLEdBQUcsa0JBQWtCO0FBQ2pMLFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFH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QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkMsUUFBUSxPQUFPLENBQUMsQ0FBQztBQUNqQixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsK0JBQStCLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDL0QsUUFB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LEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxrQkFBa0I7QUFDL1IsUUFBUSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQzlCLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0IsUUFBUSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDOUgsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxrQkFBa0I7QUFDdFMsUUFBUSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFRLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDMUIsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7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RyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0ssS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxrQkFBa0I7QUFDM1osUUFBUSxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNwQyxRQUFRLE9BQU8sQ0FBQyxDQUFDO0FBQ2pCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxrQ0FBa0MsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUNsRSxRQUFRLENBQUMsa0NB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LENBQUMsS0FBSyxVQUFVLENBQUM7QUFDckY7QUFDQSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDWCxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsS0FBSyxVQUFVLENBQUM7QUFDcEYsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxNQUFNLElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLEVBQUU7QUFDRjtBQUNBLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNSO0FBQ0EsQ0FBQyxRQUFRLFNBQVM7QUFDbEIsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQ3JELEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQztBQUNwRCxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzNDO0FBQ0EsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksTUFBTSxL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Q0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0RjtBQUNBLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNYLElBQUksRUFBRSxDQUFDLENBQUM7QUFDUixHQUFHO0FBQ0g7QUFDQSxFQUFFLFFBQVEsQ0FBQztBQUNYLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNwRCxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUM7QUFDbkQsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUMxQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0YsR0FBRztBQUNIO0FBQ0EsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNoQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkYsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNoQjtBQUNBLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pCLENBQUM7QUFDRDtBQUNBLEdBQUcsUUFBYSxLQUFLLFNBQVMsRUFBRTtBQUNoQyxFQUFFLGlCQUFpQixpQkFBaUIsQ0FBQTtBQUNwQyxDQUFBOzs7QUNsREEsSUFBQSxZQUFjLEdBQUdrRCxjQUFPLENBQUE7QUFDeEIsSUFBQSxTQUFzQixHQUFHQSxjQUFPLENBQUE7QUFDaEMsSUFBQSxTQUFzQixHQUFHQyxjQUFBLENBQUE7Ozs7QUNMekI7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLE1BQU0sa0JBQWtCLENBQUM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsR0FBRztBQUNsQixRQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDNUIsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUM3QixLQUFLO0FBQ0w7QUFDQSxJQUFJLEdBQUcsQ0FBQyxFQUFFLFNBQVMsS0FBSyxVQUFVLEtBQUssVUFBVSxHQUFHLFVBQVU7QUFDOUQsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDL0MsS0FBSztBQUNMO0FBQ0EsSUFBSSxZQUFZLENBQUMsRUFBRSxpQ0FBaUM7QUFDcEQsUUFBUW5ELFFBQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0I7QUFDQSxRQUFRLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2QztBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQixRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNwQyxRQUFRLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUN0QixZQUFZLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkMsWUFBWSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFO0FBQ3RDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLGFBQWEsTUFBTTtBQUNuQixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUM3QixRQUFRLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDdEMsWUFBWSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRCxZQUFZLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRCxZQUFZLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEQsWUFBWSxDQUFDLEVBQUUsQ0FBQztBQUNoQixTQUFTO0FBQ1QsUUFBUSxPQUFPLFNBQVMsQ0FBQztBQUN6QixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sU0FBUyxDQUFDLEdBQUcsc0JBQXNCLGFBQWEsb0RBQW9EO0FBQy9HLFFBQVEsTUFBTSxHQUFHLEdBQUcsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLFFBQVEsTUFBTSxTQUFTLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3pEO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNoRDtBQUNBLFFBQVEsSUFBSSxhQUFhLEVBQUU7QUFDM0IsWUFBWSxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzdELFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNoQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sV0FBVyxDQUFDLEdBQUcsb0RBQW9EO0FBQzlFLFFBQVEsTUFBTSxHQUFHLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO0FBQzdDO0FBQ0E7QUFDQSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLFFBQVEsR0FBRyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsU0FBUyxNQUFNLENBQUM7QUFDN0MsUUFBUSxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztBQUMzQixRQUFRLE9BQU8sR0FBRyxDQUFDO0FBQ25CLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksQ0FBQyxLQUFLLFNBQVM7QUFDcEMsSUFBSSxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUM1QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFO0FBQ3hHLFFBQVEsT0FBTyxRQUFRLENBQUM7QUFDeEIsS0FBSztBQUNMLElBQUksT0FBT2tELFlBQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQzNDLElBQUksT0FBTyxJQUFJLEdBQUcsS0FBSyxFQUFFO0FBQ3pCLFFBQVEsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMvQyxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQzFCO0FBQ0EsUUFBUSxPQUFPLElBQUksRUFBRTtBQUNyQixZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFO0FBQzNDLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUU7QUFDM0MsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTTtBQUM5QixZQUFZRSxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixZQUFZQSxNQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFDLFlBQVlBLE1BQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxZQUFZQSxNQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEQsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRTtBQUNsQyxZQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxZQUFZLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFNBQVMsTUFBTTtBQUNmLFlBQVksSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvQyxZQUFZLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDdEIsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTQSxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekIsSUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQSxRQUFRLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTs7QUNoSWxEO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLE9BQU8sSUFBSTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLE9BQU8sV0FBVyxRQUFRLHdCQUF3QjtBQUNsRSxRQUFRLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUM3QixRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBQ2pDLEtBQUs7QUFDTDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsTUFBTSxTQUFTLFNBQVMsT0FBTyxTQUFTO0FBQ3hDLElBQUksV0FBVyxDQUFDLE9BQU8sV0FBVyxRQUFRLHdCQUF3QjtBQUNsRSxRQUFRLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN6QixLQUFLO0FBQ0w7QUFDQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQjtBQUN6QixRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLEVBQUU7QUFDaEMsWUFBWSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUM3QixZQUFZLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEQsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxNQUFNLFNBQVMsU0FBUyxPQUFPLFNBQVM7QUFDeEMsSUFBSSxXQUFXLENBQUMsT0FBTyxXQUFXLFFBQVEsd0JBQXdCO0FBQ2xFLFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLEtBQUs7QUFDTDtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsZ0JBQWdCO0FBQ3pCLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUNoQyxZQUFZLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoRCxTQUFTO0FBQ1QsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLE1BQU0sU0FBUyxTQUFTLE9BQU8sbUJBQW1CO0FBQ2xELElBQUksV0FBVyxDQUFDLE9BQU8sV0FBVyxRQUFRLHdCQUF3QjtBQUNsRSxRQUFRLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzlCLEtBQUs7QUFDTDtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsMEJBQTBCO0FBQ25DLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNsRSxZQUFZLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekQsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxNQUFNLFNBQVMsU0FBUyxPQUFPLDJCQUEyQjtBQUMxRCxJQUFJLFdBQVcsQ0FBQyxPQUFPLFdBQVcsUUFBUSx3QkFBd0I7QUFDbEUsUUFBUSxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakMsS0FBSztBQUNMO0FBQ0EsSUFBSSxHQUFHLENBQUMsQ0FBQyxrQ0FBa0M7QUFDM0MsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzlGLFlBQVksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDN0IsWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0QsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxNQUFNLFNBQVMsU0FBUyxPQUFPLG1DQUFtQztBQUNsRSxJQUFJLFdBQVcsQ0FBQyxPQUFPLFdBQVcsUUFBUSx3QkFBd0I7QUFDbEUsUUFBUSxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLEtBQUs7QUFDTDtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsMENBQTBDO0FBQ25ELFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDaEUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNsRSxZQUFZLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRSxTQUFTO0FBQ1QsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLE1BQU0sWUFBWSxTQUFTLE9BQU8sUUFBUTtBQUMxQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLFdBQVcsUUFBUSx3QkFBd0I7QUFDbEUsUUFBUSxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO0FBQ3pDLEtBQUs7QUFDTDtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsZUFBZTtBQUN4QixRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1RCxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRTtBQUM5RCxZQUFZLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakUsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxNQUFNLFNBQVMsR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2QyxNQUFNLGVBQWUsU0FBUyxPQUFPLGVBQWU7QUFDcEQsSUFBSSxXQUFXLENBQUMsT0FBTyxXQUFXLFFBQVEsd0JBQXdCO0FBQ2xFLFFBQVEsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNqQyxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQ2pDLEtBQUs7QUFDTDtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsc0JBQXNCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUNwRSxZQUFZLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5RCxZQUFZLE9BQU87QUFDbkIsU0FBUztBQUNULFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNyQyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDMUMsZ0JBQWdCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLGdCQUFnQixJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLGdCQUFnQixNQUFNO0FBQ3RCLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLE1BQU0sU0FBUyxHQUFHLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sZUFBZSxTQUFTLE9BQU8sZUFBZTtBQUNwRCxJQUFJLFdBQVcsQ0FBQyxPQUFPLFdBQVcsUUFBUSx3QkFBd0I7QUFDbEUsUUFBUSxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFDakMsS0FBSztBQUNMO0FBQ0EsSUFBSSxHQUFHLENBQUMsQ0FBQyxzQkFBc0I7QUFDL0IsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3BDLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxQyxnQkFBZ0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakMsZ0JBQWdCLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEUsZ0JBQWdCLE1BQU07QUFDdEIsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsTUFBTSxlQUFlLFNBQVMsT0FBTyxlQUFlO0FBQ3BELElBQUksV0FBVyxDQUFDLE9BQU8sV0FBVyxRQUFRLHdCQUF3QjtBQUNsRSxRQUFRLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDakMsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUNqQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLHNCQUFzQjtBQUMvQixRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDcEMsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQzFDLGdCQUFnQixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNqQyxnQkFBZ0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRSxnQkFBZ0IsTUFBTTtBQUN0QixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFBOztBQ3pLQTtBQXVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsU0FBUyxDQUFDLEtBQUssMkJBQTJCO0FBQ25ELElBQUksT0FBTztBQUNYLFFBQVEsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdEQsUUFBUSxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN0RCxLQUFLLENBQUM7QUFDTixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxjQUFjLDBCQUEwQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLEtBQUssU0FBUyxLQUFLLGlCQUFpQixJQUFJLFVBQVU7QUFDbEUsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixRQUFRLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNELFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekIsS0FBSztBQUNMO0FBQ0EsSUFBSSxVQUFVLENBQUMsT0FBTyxjQUFjLE9BQU8sb0JBQW9CLFlBQVksK0NBQStDO0FBQzFILFFBQVEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3pELEtBQUs7QUFDTDtBQUNBLElBQUksVUFBVSxDQUFDLE9BQU8sV0FBVyxRQUFRLHdCQUF3QixDQUFDLGdDQUFnQztBQUNsRyxRQUFRLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU87QUFDckMsWUFBWSxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO0FBQy9DLFlBQVksSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzdDLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxNQUFNLHdCQUF3QiwwQkFBMEI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLENBQUMsS0FBSyxTQUFTLEtBQUssaUJBQWlCO0FBQ3BELFFBQVEsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0QsUUFBUSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFFBQVEsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDaEMsUUFBUSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztBQUM5QixLQUFLO0FBQ0w7QUFDQSxJQUFJLDJCQUEyQixDQUFDLEtBQUssa0JBQWtCLE9BQU8sa0JBQWtCO0FBQ2hGLFFBQVEsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztBQUN0RCxRQUFRLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7QUFDbEQsUUFBUSxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6RCxRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELEtBQUs7QUFDTDtBQUNBLElBQUksVUFBVSxDQUFDLE9BQU8sY0FBYyxPQUFPLG9CQUFvQixZQUFZLHlDQUF5QyxXQUFXLFVBQVU7QUFDekksUUFBUSxNQUFNLEdBQUc7QUFDakIsWUFBWSxXQUFXLEtBQUssY0FBYyxJQUFJLFdBQVcsS0FBSyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVM7QUFDMUYsWUFBWSxXQUFXLEtBQUssZ0JBQWdCLElBQUksV0FBVyxLQUFLLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVztBQUNoRyxZQUFZLFdBQVcsS0FBSyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsWUFBWTtBQUNsRSxZQUFZLFdBQVcsS0FBSyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztBQUM5RSxRQUFRLElBQUksR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEMsS0FBSztBQUNMO0FBQ0EsSUFBSSxVQUFVLENBQUMsT0FBTyxXQUFXLFFBQVEsd0JBQXdCLElBQUksZ0NBQWdDO0FBQ3JHLFFBQVEsT0FBTyxJQUFJLEtBQUssZ0JBQWdCLElBQUksSUFBSSxLQUFLLGNBQWMsSUFBSSxJQUFJLEtBQUssYUFBYSxJQUFJLElBQUksS0FBSyxXQUFXO0FBQ3JILFlBQVksSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztBQUM1QyxZQUFZLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM3QyxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsTUFBTSxzQkFBc0IsNEJBQTRCO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxVQUFVLG9CQUFvQixLQUFLLGlCQUFpQixJQUFJLFVBQVUsZ0JBQWdCLHNCQUFzQjtBQUN4SCxRQUFRLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBQ3JDLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUMxQixRQUFRLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNO0FBQzFELFlBQVksSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdCLFlBQVksSUFBSSxFQUFFLFNBQVM7QUFDM0IsWUFBWSxVQUFVLEVBQUUsSUFBSSxLQUFLLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUNoRCxZQUFZLE1BQU0sRUFBRSxDQUFDO0FBQ3JCLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDWixRQUFRLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7QUFDdkQsS0FBSztBQUNMO0FBQ0EsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLFVBQVUsT0FBTyxXQUFXLGNBQWMsbUJBQW1CLGVBQWUsaUJBQWlCLFNBQVMsb0JBQW9CLGdCQUFnQixxQkFBcUI7QUFDL0wsUUFBUSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO0FBQ25ELFFBQVFwRCxRQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQy9DLFFBQVEsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUN2SSxRQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDaEQsUUFBUSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDckQsS0FBSztBQUNMO0FBQ0EsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLFVBQVUsR0FBRyxVQUFVLE9BQU8sV0FBVyxZQUFZLGdCQUFnQixlQUFlLGlCQUFpQjtBQUMvSCxRQUFRLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzdHLFFBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9DLEtBQUs7QUFDTDtBQUNBLElBQUksY0FBYyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ3RDLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtBQUNuQyxZQUFZLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzQyxZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDOUMsZ0JBQWdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRSxhQUFhO0FBQ2IsU0FBUyxNQUFNO0FBQ2YsWUFBWSxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzlDLGdCQUFnQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4RCxhQUFhO0FBQ2IsWUFBWSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDckUsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksTUFBTSxDQUFDLE9BQU8sV0FBVztBQUM3QixRQUFRLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUU7QUFDeEUsWUFBWSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFO0FBQ3pFLGdCQUFnQixJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3pFLGFBQWEsTUFBTTtBQUNuQixnQkFBZ0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN6SixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxHQUFHO0FBQ2QsUUFBUSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtBQUNwQyxZQUFZLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUM3QyxTQUFTO0FBQ1QsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLE1BQU0seUJBQXlCLDJDQUEyQztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLENBQUMsVUFBVSx1QkFBdUIsS0FBSyxpQkFBaUIsSUFBSSxVQUFVLGNBQWMsV0FBVyxJQUFJLFVBQVUsZ0JBQWdCLHNCQUFzQjtBQUNsSyxRQUFRLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBQ3JDLFFBQVEsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3RCxRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7QUFDN0MsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLFFBQVEsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLE1BQU07QUFDMUQsWUFBWSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0IsWUFBWSxJQUFJLEVBQUUsU0FBUztBQUMzQixZQUFZLFVBQVUsRUFBRSxJQUFJLEtBQUssT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ2hELFlBQVksTUFBTSxFQUFFLENBQUM7QUFDckIsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUNaLFFBQVEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztBQUN2RCxLQUFLO0FBQ0w7QUFDQSxJQUFJLGtCQUFrQixDQUFDLFNBQVMsVUFBVSxPQUFPLFdBQVcsY0FBYyxtQkFBbUIsZUFBZSxpQkFBaUIsU0FBUyxvQkFBb0IsZ0JBQWdCLHFCQUFxQjtBQUMvTCxRQUFRLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzdJLFFBQVEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2pKLFFBQVEsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztBQUNuRCxRQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDaEQsUUFBUSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3hELEtBQUs7QUFDTDtBQUNBLElBQUksZ0JBQWdCLENBQUMsS0FBSyxVQUFVLEdBQUcsVUFBVSxPQUFPLFdBQVcsWUFBWSxnQkFBZ0IsZUFBZSxpQkFBaUI7QUFDL0gsUUFBUSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDbkgsUUFBUSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ3ZILFFBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNsRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDekMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFO0FBQ25DLFlBQVksTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVDLFlBQVksTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVDLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM5QyxnQkFBZ0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckcsYUFBYTtBQUNiLFNBQVMsTUFBTTtBQUNmLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM5QyxnQkFBZ0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzNELGFBQWE7QUFDYixZQUFZLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sQ0FBQyxPQUFPLFdBQVc7QUFDN0IsUUFBUSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFO0FBQ3hFLFlBQVksSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtBQUN6RSxnQkFBZ0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN6RSxhQUFhLE1BQU07QUFDbkIsZ0JBQWdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDekosYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sR0FBRztBQUNkLFFBQVEsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7QUFDcEMsWUFBWSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDN0MsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksVUFBVSxDQUFDLE9BQU8sY0FBYyxPQUFPLDBCQUEwQjtBQUNyRSxRQUFRLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztBQUMxRixRQUFRLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9HLFFBQVEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM1QixLQUFLO0FBQ0w7QUFDQSxJQUFJLFVBQVUsQ0FBQyxPQUFPLFdBQVcsUUFBUSx3QkFBd0IsQ0FBQyxxQkFBcUI7QUFDdkYsUUFBUSxPQUFPLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNoRCxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsTUFBTSx5QkFBeUIsNEJBQTRCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLFVBQVUsdUJBQXVCLEtBQUssaUJBQWlCLElBQUksVUFBVSxjQUFjLFdBQVcsSUFBSSxVQUFVLGdCQUFnQixzQkFBc0IsT0FBTyxVQUFVO0FBQ25MLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDckMsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0FBQzdDLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekIsUUFBUSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMvQjtBQUNBLFFBQVEsSUFBSSxDQUFDLHFCQUFxQixHQUFHLENBQUMsSUFBSSxLQUFLLE9BQU8sR0FBRyxjQUFjLEdBQUcsaUJBQWlCLEVBQUUsT0FBTyxDQUFDO0FBQ3JHLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDL0MsWUFBWUEsUUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNFLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztBQUM3RCxRQUFRLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7QUFDOUQsS0FBSztBQUNMO0FBQ0EsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLFVBQVUsT0FBTyxXQUFXLGNBQWMsbUJBQW1CO0FBQzFGLFFBQVEsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQztBQUN6RCxRQUFRLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDbkQsUUFBUSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BELFFBQVEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDaEgsS0FBSztBQUNMO0FBQ0EsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLFVBQVUsR0FBRyxVQUFVLE9BQU8sV0FBVyxZQUFZLGdCQUFnQixlQUFlLGlCQUFpQixjQUFjLG1CQUFtQjtBQUNoSyxRQUFRLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQzdHLEtBQUs7QUFDTDtBQUNBLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtBQUNyRCxRQUFRLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTztBQUM1QztBQUNBLFFBQVEsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDO0FBQ3pDLFFBQVEsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hDLFFBQVEsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hDLFFBQVEsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFDLFlBQVksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNwRixZQUFZLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDckYsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtBQUN6QyxRQUFRLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2QixZQUFZLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFELFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUQsWUFBWSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO0FBQzVDLFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTDtBQUNBLElBQUksTUFBTSxDQUFDLE9BQU8sV0FBVztBQUM3QixRQUFRLElBQUksSUFBSSxDQUFDLHNCQUFzQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUU7QUFDaEssWUFBWSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2pLLFlBQVksSUFBSSxDQUFDLHdCQUF3QixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNuSyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLEdBQUc7QUFDZCxRQUFRLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNuRixRQUFRLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNqRixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNlLE1BQU0sb0JBQW9CLENBQUM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLEtBQUssbUJBQW1CLElBQUksVUFBVSxnQkFBZ0IsMkJBQTJCLE1BQU0sSUFBSSxFQUFFO0FBQzdHLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDMUIsUUFBUSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUMzQjtBQUNBLFFBQVEsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3hCO0FBQ0EsUUFBUSxLQUFLLE1BQU0sUUFBUSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO0FBQ3BELFlBQVksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVM7QUFDdEQsWUFBWSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwRCxZQUFZLElBQUksRUFBRSxLQUFLLFlBQVksOEJBQThCLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7QUFDakksZ0JBQWdCLFNBQVM7QUFDekIsYUFBYTtBQUNiLFlBQVksTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwRSxZQUFZLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7QUFDM0MsWUFBWSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7QUFDM0QsWUFBWSxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztBQUNqRSxZQUFZLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzNFLFlBQVksTUFBTSxZQUFZLEdBQUcsUUFBUSxLQUFLLGFBQWEsSUFBSSxRQUFRLEtBQUsseUJBQXlCLENBQUM7QUFDdEc7QUFDQSxZQUFZLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxnQkFBZ0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0FBQzNJO0FBQ0EsWUFBWSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLENBQUMsZUFBZSxFQUFFO0FBQ3BFLGdCQUFnQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLFlBQVk7QUFDckQsb0JBQW9CLElBQUksd0JBQXdCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7QUFDekUsb0JBQW9CLElBQUksY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3RFLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QztBQUNBLGFBQWEsTUFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLGVBQWUsSUFBSSxZQUFZLEVBQUU7QUFDeEYsZ0JBQWdCLE1BQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDL0UsZ0JBQWdCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsWUFBWTtBQUNyRCxvQkFBb0IsSUFBSSx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDN0gsb0JBQW9CLElBQUksc0JBQXNCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUMzRixnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUM7QUFDQSxhQUFhLE1BQU07QUFDbkIsZ0JBQWdCLE1BQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDbEYsZ0JBQWdCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDekksZ0JBQWdCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsQ0FBQyxRQUFRLGtCQUFrQjtBQUMxQyxRQUFRLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUMsUUFBUSxPQUFPLE1BQU0sWUFBWSxzQkFBc0IsSUFBSSxNQUFNLFlBQVkseUJBQXlCLEdBQUcsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDN0gsS0FBSztBQUNMO0FBQ0EsSUFBSSxtQkFBbUIsQ0FBQyxTQUFTLFVBQVUsT0FBTyxXQUFXLGNBQWMsbUJBQW1CLGVBQWUsaUJBQWlCLFNBQVMsb0JBQW9CLGdCQUFnQixxQkFBcUI7QUFDaE0sUUFBUSxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDN0MsWUFBWSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xELFlBQVksSUFBSSxNQUFNLFlBQVksc0JBQXNCLElBQUksTUFBTSxZQUFZLHlCQUF5QixJQUFJLE1BQU0sWUFBWSx5QkFBeUI7QUFDdEosZ0JBQWdCLENBQUMsTUFBTSxtQkFBbUIsa0JBQWtCLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQy9JLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSSwyQkFBMkIsQ0FBQyxLQUFLLGtCQUFrQixPQUFPLGtCQUFrQjtBQUNoRixRQUFRLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUM3QyxZQUFZLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbEQsWUFBWSxJQUFJLE1BQU0sWUFBWSx3QkFBd0I7QUFDMUQsZ0JBQWdCLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkUsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksaUJBQWlCLENBQUMsYUFBYSxpQkFBaUIsVUFBVSxzQkFBc0IsT0FBTyxtQkFBbUIsS0FBSyxtQkFBbUIsZUFBZSxpQkFBaUIsY0FBYyw0QkFBNEI7QUFDaE4sUUFBUSxJQUFJLEtBQUssWUFBWSxLQUFLLENBQUM7QUFDbkMsUUFBUSxLQUFLLE1BQU0sRUFBRSxJQUFJLGFBQWEsRUFBRTtBQUN4QyxZQUFZLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUQ7QUFDQSxZQUFZLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFO0FBQ3pDLGdCQUFnQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzRDtBQUNBLGdCQUFnQixLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDckQsb0JBQW9CLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUQsb0JBQW9CLElBQUksQ0FBQyxNQUFNLFlBQVksc0JBQXNCLElBQUksTUFBTSxZQUFZLHlCQUF5QjtBQUNoSCx5QkFBeUIsTUFBTSxZQUFZLHlCQUF5QixLQUFLLENBQUMsTUFBTSxPQUFPLFVBQVUsQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLEVBQUU7QUFDN0g7QUFDQSx3QkFBd0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDaEUsd0JBQXdCLENBQUMsTUFBTSxPQUFPLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0FBQy9ELHdCQUF3QixDQUFDLE1BQU0sbUJBQW1CLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNwSix3QkFBd0IsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNyQyxxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1QsUUFBUSxPQUFPLEtBQUssQ0FBQztBQUNyQixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sa0JBQWtCO0FBQzdCLFFBQVEsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVEsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzdDLFlBQVksTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNsRCxZQUFZLElBQUksTUFBTSxZQUFZLGNBQWMsSUFBSSxNQUFNLFlBQVksd0JBQXdCLEVBQUU7QUFDaEcsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRixhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsT0FBTyxNQUFNLENBQUM7QUFDdEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxtQkFBbUIsa0JBQWtCO0FBQ3pDLFFBQVEsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVEsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzdDLFlBQVksTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNsRCxZQUFZLElBQUksTUFBTSxZQUFZLHNCQUFzQixJQUFJLE1BQU0sWUFBWSx5QkFBeUIsSUFBSSxNQUFNLFlBQVkseUJBQXlCLEVBQUU7QUFDeEosZ0JBQWdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzlFLG9CQUFvQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0RSxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLE9BQU8sTUFBTSxDQUFDO0FBQ3RCLEtBQUs7QUFDTDtBQUNBLElBQUksaUJBQWlCLGtCQUFrQjtBQUN2QyxRQUFRLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUM1QixRQUFRLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUM3QyxZQUFZLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbEQsWUFBWSxJQUFJLE1BQU0sWUFBWSxjQUFjLElBQUksTUFBTSxZQUFZLHdCQUF3QixJQUFJLE1BQU0sWUFBWSx5QkFBeUIsRUFBRTtBQUMvSSxnQkFBZ0IsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO0FBQy9ELG9CQUFvQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQy9DLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNULFFBQVEsT0FBTyxRQUFRLENBQUM7QUFDeEIsS0FBSztBQUNMO0FBQ0EsSUFBSSxxQkFBcUIsd0JBQXdCO0FBQ2pELFFBQVEsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQzdCLEtBQUs7QUFDTDtBQUNBLElBQUksV0FBVyxDQUFDLE9BQU8sV0FBVyxTQUFTLDBDQUEwQztBQUNyRixRQUFRLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUM1QixRQUFRLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUM3QyxZQUFZLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbEQsWUFBWSxJQUFJLE1BQU0sWUFBWSxjQUFjLElBQUksTUFBTSxZQUFZLHdCQUF3QixJQUFJLE1BQU0sWUFBWSx5QkFBeUIsRUFBRTtBQUMvSSxnQkFBZ0IsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO0FBQ3hELG9CQUFvQixJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN6Qyx3QkFBd0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzFGLHdCQUF3QixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLE9BQU8sUUFBUSxDQUFDO0FBQ3hCLEtBQUs7QUFDTDtBQUNBLElBQUksV0FBVyxvQkFBb0IsQ0FBQyxPQUFPLFdBQVcsY0FBYyx3QkFBd0IsVUFBVSxpQ0FBaUMsT0FBTyxvQkFBb0I7QUFDbEs7QUFDQTtBQUNBLFFBQVEsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxjQUFjLEVBQUU7QUFDaEUsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sVUFBVSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2RyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLHdCQUF3QjtBQUN4RCxRQUFRLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQzNCO0FBQ0EsUUFBUSxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDN0MsWUFBWSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xELFlBQVksSUFBSSxTQUFTLElBQUksTUFBTSxZQUFZLHlCQUF5QixFQUFFO0FBQzFFLGdCQUFnQixNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUM7QUFDekksZ0JBQWdCLElBQUksbUJBQW1CLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUNqRjtBQUNBLGFBQWEsTUFBTSxJQUFJLENBQUMsTUFBTSxZQUFZLHNCQUFzQixJQUFJLE1BQU0sWUFBWSx5QkFBeUIsS0FBSyxNQUFNLENBQUMsaUJBQWlCLEVBQUU7QUFDOUksZ0JBQWdCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzdELGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLENBQUMsT0FBTyxXQUFXO0FBQzdCLFFBQVEsS0FBSyxNQUFNLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzdDLFlBQVksTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNsRCxZQUFZLElBQUksTUFBTSxZQUFZLHNCQUFzQixJQUFJLE1BQU0sWUFBWSx5QkFBeUIsSUFBSSxNQUFNLFlBQVkseUJBQXlCO0FBQ3RKLGdCQUFnQixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZDLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0FBQ2xDLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxHQUFHO0FBQ2QsUUFBUSxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDN0MsWUFBWSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2xELFlBQVksSUFBSSxNQUFNLFlBQVksc0JBQXNCLElBQUksTUFBTSxZQUFZLHlCQUF5QixJQUFJLE1BQU0sWUFBWSx5QkFBeUI7QUFDdEosZ0JBQWdCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNqQyxTQUFTO0FBQ1QsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNPLE1BQU0sdUJBQXVCLHlCQUF5QjtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLENBQUMsTUFBTSx5QkFBeUIsSUFBSSxVQUFVLGdCQUFnQiwyQkFBMkIsTUFBTSxJQUFJLEVBQUU7QUFDcEgsUUFBUSxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO0FBQ3hDLFFBQVEsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7QUFDcEMsWUFBWSxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksb0JBQW9CLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzNHLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7QUFDcEQsUUFBUSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztBQUMvQixLQUFLO0FBQ0w7QUFDQSxJQUFJLG1CQUFtQixDQUFDLE1BQU0sVUFBVSxPQUFPLFdBQVcsS0FBSyxVQUFVLGNBQWMsbUJBQW1CLGVBQWUsaUJBQWlCLFNBQVMsbUJBQW1CLGdCQUFnQixxQkFBcUI7QUFDM00sUUFBUSxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtBQUN0RCxZQUFZLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDL0ksU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLE9BQU8sQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFO0FBQ3RDLFlBQVksSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNoRixTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztBQUNwQztBQUNBLFFBQVEsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDaEMsS0FBSztBQUNMO0FBQ0EsSUFBSSxpQkFBaUIsQ0FBQyxhQUFhLGlCQUFpQixPQUFPLG1CQUFtQixNQUFNLG1DQUFtQyxlQUFlLGlCQUFpQixjQUFjLG1CQUFtQjtBQUN4TCxRQUFRLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO0FBQ3BDLFlBQVksSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUM7QUFDNUwsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksR0FBRyxDQUFDLE9BQU8sZ0NBQWdDO0FBQy9DLFFBQVEsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkQsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLENBQUMsT0FBTyxXQUFXO0FBQzdCLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTztBQUN0QyxRQUFRLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO0FBQzFELFlBQVksSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoRSxTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUNqQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sR0FBRztBQUNkLFFBQVEsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7QUFDMUQsWUFBWSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDMUQsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxNQUFNLHVCQUF1QixHQUFHO0FBQ2hDLElBQUksY0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDO0FBQy9CLElBQUksY0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDO0FBQy9CLElBQUksWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDO0FBQ2hDLElBQUksWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDO0FBQ2hDLElBQUksaUJBQWlCLEVBQUUsQ0FBQyxZQUFZLENBQUM7QUFDckMsSUFBSSxpQkFBaUIsRUFBRSxDQUFDLFlBQVksQ0FBQztBQUNyQyxJQUFJLGdCQUFnQixFQUFFLENBQUMsV0FBVyxDQUFDO0FBQ25DLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyxXQUFXLENBQUM7QUFDbkMsSUFBSSxpQkFBaUIsRUFBRSxDQUFDLFlBQVksQ0FBQztBQUNyQyxJQUFJLGlCQUFpQixFQUFFLENBQUMsWUFBWSxDQUFDO0FBQ3JDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyxVQUFVLENBQUM7QUFDbEMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixDQUFDO0FBQ3hGLElBQUksY0FBYyxFQUFFLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBQztBQUN4RixJQUFJLHdCQUF3QixFQUFFLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBQztBQUNsRyxJQUFJLGdCQUFnQixFQUFFLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQztBQUM5QyxDQUFDLENBQUM7QUFDRjtBQUNBLFNBQVMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRTtBQUM3QyxJQUFJLE9BQU8sdUJBQXVCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3RHLENBQUM7QUFDRDtBQUNBLE1BQU0sa0JBQWtCLEdBQUc7QUFDM0IsSUFBSSxjQUFjLEVBQUU7QUFDcEIsUUFBUSxRQUFRLEVBQUVxRCx1QkFBa0I7QUFDcEMsUUFBUSxXQUFXLEVBQUVBLHVCQUFrQjtBQUN2QyxLQUFLO0FBQ0wsSUFBSSxjQUFjLEVBQUU7QUFDcEIsUUFBUSxRQUFRLEVBQUVBLHVCQUFrQjtBQUNwQyxRQUFRLFdBQVcsRUFBRUEsdUJBQWtCO0FBQ3ZDLEtBQUs7QUFDTCxJQUFJLHdCQUF3QixDQUFDO0FBQzdCLFFBQVEsUUFBUSxFQUFFQSx1QkFBa0I7QUFDcEMsUUFBUSxXQUFXLEVBQUVBLHVCQUFrQjtBQUN2QyxLQUFLO0FBQ0wsSUFBSSxnQkFBZ0IsRUFBRTtBQUN0QixRQUFRLFFBQVEsRUFBRUMsc0JBQWU7QUFDakMsUUFBUSxXQUFXLEVBQUVBLHNCQUFlO0FBQ3BDLEtBQUs7QUFDTCxDQUFDLENBQUM7QUFDRjtBQUNBLE1BQU0sY0FBYyxHQUFHO0FBQ3ZCLElBQUksT0FBTyxFQUFFO0FBQ2IsUUFBUSxRQUFRLEVBQUUsb0JBQW9CO0FBQ3RDLFFBQVEsV0FBVyxFQUFFLHFCQUFxQjtBQUMxQyxLQUFLO0FBQ0wsSUFBSSxRQUFRLEVBQUU7QUFDZCxRQUFRLFFBQVEsRUFBRSxvQkFBb0I7QUFDdEMsUUFBUSxXQUFXLEVBQUUsb0JBQW9CO0FBQ3pDLEtBQUs7QUFDTCxDQUFDLENBQUM7QUFDRjtBQUNBLFNBQVMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO0FBQ2hELElBQUksTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDekQsSUFBSSxPQUFPLENBQUMsZUFBZSxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDaEcsQ0FBQztBQUNEO0FBQ0EsUUFBUSxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzNDLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO0FBQy9ELFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0FBQzNELFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0FBQ2pFLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0FBQ2pFLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxRQUFRLENBQUMsdUJBQXVCLEVBQUUseUJBQXlCLENBQUMsQ0FBQTs7QUN4c0I1RDtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7QUFDeEM7QUFDQSxNQUFNLFVBQVUsU0FBUyxPQUFPLENBQUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLEtBQUssNkNBQTZDLFVBQVUsOERBQThEO0FBQzFJLFFBQVEsS0FBSyxFQUFFLENBQUM7QUFDaEI7QUFDQSxRQUFRLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUMzQixRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUMvQixRQUFRLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUYsUUFBUSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztBQUNyQztBQUNBLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxPQUFPO0FBQzVDO0FBQ0EsUUFBUSxLQUFLLEtBQUssS0FBSywyQkFBMkIsQ0FBQztBQUNuRDtBQUNBLFFBQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQ3JDLFFBQVEsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQ3JDO0FBQ0EsUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFO0FBQ2pFLFlBQVksSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ3ZDLFlBQVksSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDckQsWUFBWSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDdkMsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDL0IsWUFBWSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BFLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFO0FBQzlCLFlBQVksSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3RTtBQUNBLFlBQVksS0FBSyxNQUFNLFFBQVEsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO0FBQ2hELGdCQUFnQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMxRixhQUFhO0FBQ2IsWUFBWSxLQUFLLE1BQU0sUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7QUFDakQsZ0JBQWdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzVGLGFBQWE7QUFDYjtBQUNBLFlBQVksSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQztBQUNsRjtBQUNBLFlBQVksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqRSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxzQkFBc0Isd0JBQXdCO0FBQ2xELFFBQVEsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7QUFDekMsS0FBSztBQUNMO0FBQ0EsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLDZDQUE2QztBQUN2RSxRQUFRLElBQUksSUFBSSxLQUFLLFlBQVksRUFBRTtBQUNuQyxZQUFZLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUNuQyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0RCxLQUFLO0FBQ0w7QUFDQSxJQUFJLGlCQUFpQixDQUFDLElBQUksVUFBVSxLQUFLLE9BQU8sT0FBTyx1QkFBdUIsRUFBRSxFQUFFO0FBQ2xGLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDbkQsWUFBWSxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzNELFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFO0FBQ25GLGdCQUFnQixPQUFPO0FBQ3ZCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksSUFBSSxLQUFLLFlBQVksRUFBRTtBQUNuQyxZQUFZLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLFlBQVksT0FBTztBQUNuQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RELEtBQUs7QUFDTDtBQUNBLElBQUksZ0JBQWdCLENBQUMsSUFBSSw4RUFBOEU7QUFDdkcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsRUFBRTtBQUMvQyxZQUFZLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDckcsU0FBUyxNQUFNO0FBQ2YsWUFBWSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUQsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksZ0JBQWdCLENBQUMsSUFBSSxVQUFVLEtBQUssU0FBUyxPQUFPLHVCQUF1QixFQUFFLFdBQVc7QUFDNUYsUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtBQUNuRCxZQUFZLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDMUQsWUFBWSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUU7QUFDbEYsZ0JBQWdCLE9BQU8sS0FBSyxDQUFDO0FBQzdCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxFQUFFO0FBQy9DLFlBQVksSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxDQUFDO0FBQ3pILFlBQVksT0FBTyxLQUFLLENBQUM7QUFDekIsU0FBUyxNQUFNO0FBQ2YsWUFBWSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNFLFlBQVksTUFBTSxvQkFBb0IsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsS0FBSyx5QkFBeUIsQ0FBQztBQUM5SCxZQUFZLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDdEUsWUFBWSxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO0FBQ2xEO0FBQ0EsWUFBWSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM1RCxZQUFZLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6RDtBQUNBLFlBQVksTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDM0UsWUFBWSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLE9BQU8sWUFBWSxJQUFJLGFBQWEsSUFBSSxvQkFBb0IsSUFBSSxJQUFJLENBQUMscUNBQXFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNqSixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxpQ0FBaUMsQ0FBQyxDQUFDLFVBQVU7QUFDakQ7QUFDQSxLQUFLO0FBQ0w7QUFDQSxJQUFJLGFBQWEsb0JBQW9CO0FBQ3JDO0FBQ0EsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLHVCQUF1QixDQUFDLENBQUMsdUNBQXVDO0FBQ3BFO0FBQ0EsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUkscUNBQXFDLE1BQU0sQ0FBQyxJQUFJLFVBQVUsUUFBUSx1QkFBdUIsUUFBUSxnQ0FBZ0M7QUFDckk7QUFDQSxRQUFRLE9BQU8sS0FBSyxDQUFDO0FBQ3JCLEtBQUs7QUFDTDtBQUNBLElBQUksUUFBUSxDQUFDLElBQUksbUJBQW1CO0FBQ3BDLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQzdELFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQzlELFFBQVEsT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQztBQUMxQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLGlCQUFpQixDQUFDLFVBQVUsd0JBQXdCO0FBQ3hELFFBQVEsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ2hILEtBQUs7QUFDTDtBQUNBLElBQUksYUFBYSxZQUFZO0FBQzdCLFFBQVEsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLENBQUM7QUFDeEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLENBQUMsVUFBVSx3QkFBd0IsZUFBZSxpQkFBaUI7QUFDbEYsUUFBUSxJQUFJLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRTtBQUMvQyxZQUFZLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUM1RSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO0FBQ3JDLFlBQVksQ0FBQyxJQUFJLE9BQU8sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQ2xILFNBQVM7QUFDVDtBQUNBLFFBQVEsQ0FBQyxJQUFJLE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzlHLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyx1QkFBdUI7QUFDcEMsUUFBUSxNQUFNLE1BQU0sUUFBUTtBQUM1QixZQUFZLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtBQUN6QixZQUFZLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSTtBQUM3QixZQUFZLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTTtBQUNqQyxZQUFZLGNBQWMsRUFBRSxJQUFJLENBQUMsV0FBVztBQUM1QyxZQUFZLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUTtBQUNyQyxZQUFZLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTztBQUNuQyxZQUFZLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTztBQUNuQyxZQUFZLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTTtBQUNqQyxZQUFZLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRTtBQUNwRixZQUFZLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRTtBQUN2RixTQUFTLENBQUM7QUFDVjtBQUNBLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO0FBQzdCLFlBQVksTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUNoRCxZQUFZLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDdkQsU0FBUztBQUNUO0FBQ0EsUUFBUSxPQUFPLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxLQUFLO0FBQ3BELFlBQVksT0FBTyxLQUFLLEtBQUssU0FBUztBQUN0QyxnQkFBZ0IsRUFBRSxHQUFHLEtBQUssUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDakUsZ0JBQWdCLEVBQUUsR0FBRyxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDakUsU0FBUyxDQUFDLENBQUM7QUFDWCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFNBQVMsQ0FBQyxRQUFRLFlBQVksR0FBRyxVQUFVLElBQUksVUFBVSxLQUFLLFNBQVMsT0FBTyx1QkFBdUIsRUFBRSxXQUFXO0FBQ3RILFFBQVEsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7QUFDbkQsWUFBWSxPQUFPLEtBQUssQ0FBQztBQUN6QixTQUFTO0FBQ1QsUUFBUSxPQUFPLG9CQUFvQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtBQUN2RSxZQUFZLEdBQUc7QUFDZixZQUFZLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSTtBQUNoQyxZQUFZLFNBQVMsRUFBRSxJQUFJO0FBQzNCLFlBQVksS0FBSztBQUNqQixZQUFBLFNBQUEsRUFBWUMsSUFBUztBQUNyQjtBQUNBLFlBQVksS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDO0FBQy9DLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDWixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksWUFBWTtBQUNwQixRQUFRLE9BQU8sS0FBSyxDQUFDO0FBQ3JCLEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxZQUFZO0FBQ3JCLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMO0FBQ0EsSUFBSSxhQUFhLFlBQVk7QUFDN0IsUUFBUSxPQUFPLEtBQUssQ0FBQztBQUNyQixLQUFLO0FBQ0w7QUFDQSxJQUFJLGdCQUFnQixZQUFZO0FBQ2hDLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLEdBQUc7QUFDYjtBQUNBLEtBQUs7QUFDTDtBQUNBLElBQUksZ0JBQWdCLFlBQVk7QUFDaEMsUUFBUSxLQUFLLE1BQU0sUUFBUSxJQUFJLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUU7QUFDMUQsWUFBWSxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFELFlBQVksSUFBSSxFQUFFLEtBQUssWUFBWSw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTtBQUNqSSxnQkFBZ0IsU0FBUztBQUN6QixhQUFhO0FBQ2I7QUFDQSxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVztBQUNsRixnQkFBZ0IsS0FBSyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtBQUM5QyxnQkFBZ0IsT0FBTyxJQUFJLENBQUM7QUFDNUIsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLE9BQU8sS0FBSyxDQUFDO0FBQ3JCLEtBQUs7QUFDTDtBQUNBLElBQUksYUFBYSxHQUFHO0FBQ3BCLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7QUFDbkMsWUFBWSxJQUFJLENBQUMsY0FBYyxHQUFHQyxZQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzdELFlBQVksSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDeEMsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksd0JBQXdCLEdBQUc7QUFDL0IsUUFBUSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztBQUNyQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLGFBQWEsc0JBQXNCO0FBQ3ZDLFFBQVEsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQztBQUNqRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLHlCQUF5QixZQUFZO0FBQ3pDLFFBQVEsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztBQUMvQyxLQUFLO0FBQ0wsQ0FBQTs7QUNsVUE7QUFFQTtBQUNBO0FBQ0E7QUFDTyxNQUFNLGdCQUFnQixzQkFBc0IsWUFBWSxDQUFDO0FBQ2hFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQztBQUNqRCxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDTjtBQUNPLE1BQU0sd0JBQXdCLHNCQUFzQixZQUFZLENBQUM7QUFDeEUsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQ25ELElBQUksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQzFELENBQUMsQ0FBQyxDQUFDO0FBQ0g7QUFDTyxNQUFNLENBQUEsT0FBQSxFQUFDQyxTQUFPLEVBQUVDLElBQUFBLEVBQUFBLE1BQUksYUFBRUMsV0FBUyxDQUFDLEdBQUcsZ0JBQWdCLENBQUE7O0FDZDFEO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGFBQWEsQ0FBQztBQUNwQjtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxRQUFRLG9CQUFvQixFQUFFLEVBQUU7QUFDaEQsUUFBUSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUNqQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLGNBQWMsQ0FBQyxXQUFXLFVBQVUsaUJBQWlCLGVBQWUsVUFBVSxlQUFlLE9BQU8sb0JBQW9CO0FBQzVILFFBQVEsSUFBSSxPQUFPLFlBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RSxRQUFRLElBQUksV0FBVyxHQUFHLGFBQWEsQ0FBQyx1QkFBdUIsRUFBRSxRQUFRLENBQUMsQ0FBQyw0QkFBNEIsRUFBRSxhQUFhLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25MLFFBQVEsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsWUFBWSxHQUFHLFdBQVcsR0FBRyxhQUFhLENBQUMsdUJBQXVCLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUU7QUFDbkksWUFBWSxPQUFPLElBQUk7QUFDdkIsZ0JBQWdCLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxNQUFNO0FBQ3RELGdCQUFnQixlQUFlLEVBQUUsVUFBVSxDQUFDLE1BQU07QUFDbEQsZ0JBQWdCLFlBQVksRUFBRSxDQUFDO0FBQy9CLGdCQUFnQixlQUFlLEVBQUUsQ0FBQztBQUNsQyxhQUFhLE1BQU0sQ0FBQztBQUNwQixZQUFZLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUNqRSxZQUFZLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3hDLFNBQVM7QUFDVCxRQUFRLE9BQU8sT0FBTyxDQUFDO0FBQ3ZCLEtBQUs7QUFDTDtBQUNBLElBQUksR0FBRyxtQkFBbUI7QUFDMUIsUUFBUSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7QUFDN0IsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLEdBQUc7QUFDZCxRQUFRLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUM3QyxZQUFZLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksRUFBRTtBQUMxQyxnQkFBZ0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUMxQyxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxhQUFhLENBQUMsWUFBWSxVQUFVLGVBQWUsVUFBVSxZQUFZLFVBQVUsZUFBZSx5QkFBeUI7QUFDdEksUUFBUSxPQUFPLElBQUksYUFBYSxDQUFDLENBQUM7QUFDbEMsWUFBWSxZQUFZO0FBQ3hCLFlBQVksZUFBZTtBQUMzQixZQUFZLFlBQVk7QUFDeEIsWUFBWSxlQUFlO0FBQzNCLFlBQVksSUFBSSxFQUFFLEVBQUU7QUFDcEIsWUFBWSxPQUFPLEVBQUUsQ0FBQztBQUN0QixTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ1osS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUQ7QUFDQSxRQUFRLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFBOztBQzFFeEM7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUEsTUFBQSxHQUFlLElBQUksQ0FBQTs7QUNqQm5CO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sWUFBWSxDQUFDO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTztBQUNsQyxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUU7QUFDakI7QUFDQSxTQUFTLE1BQU0sSUFBSSxFQUFFLEVBQUU7QUFDdkIsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuRCxTQUFTLE1BQU0sSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUNwQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRSxTQUFTLE1BQU07QUFDZixZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pELFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxZQUFZLENBQUMsRUFBRSxvQkFBb0I7QUFDdkMsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsWUFBWUMsUUFBTSxHQUFHLElBQUlBLFFBQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBR0EsUUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxRixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksQ0FBQyxFQUFFLG9CQUFvQjtBQUN2QyxRQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxZQUFZQSxRQUFNLEdBQUcsSUFBSUEsUUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHQSxRQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFGLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxDQUFDLEdBQUcsdUNBQXVDO0FBQ3JELFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUc7QUFDM0IsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUMxQixRQUFRLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUNyQjtBQUNBLFFBQVEsSUFBSSxHQUFHLFlBQVlBLFFBQU0sRUFBRTtBQUNuQyxZQUFZLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDdEIsWUFBWSxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3RCO0FBQ0EsU0FBUyxNQUFNLElBQUksR0FBRyxZQUFZLFlBQVksRUFBRTtBQUNoRCxZQUFZLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQzFCLFlBQVksR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDMUI7QUFDQSxZQUFZLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDMUM7QUFDQSxTQUFTLE1BQU07QUFDZixZQUFZLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNwQyxnQkFBZ0IsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNsRSxvQkFBb0IsTUFBTSxlQUFlLEtBQUssR0FBRyx5QkFBeUIsQ0FBQztBQUMzRSxvQkFBb0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUM5RSxpQkFBaUIsTUFBTTtBQUN2QixvQkFBb0IsTUFBTSxTQUFTLEtBQUssR0FBRyxtQkFBbUIsQ0FBQztBQUMvRCxvQkFBb0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDQSxRQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixZQUFZLE9BQU8sSUFBSSxDQUFDO0FBQ3hCLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtBQUN4QixZQUFZLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSUEsUUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BELFlBQVksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJQSxRQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEQ7QUFDQSxTQUFTLE1BQU07QUFDZixZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFNBQVMsV0FBVztBQUN4QixRQUFRLE9BQU8sSUFBSUEsUUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDaEcsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksWUFBWSxXQUFXLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxZQUFZLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFlBQVksV0FBVyxFQUFFLE9BQU8sSUFBSUEsUUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksWUFBWSxXQUFXLEVBQUUsT0FBTyxJQUFJQSxRQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxPQUFPLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxRQUFRLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFD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QUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxZQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQy9DLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSUgsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSSxLQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxXQUFT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QUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsUUFBTSxDQUFDLEdB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QUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3BCLFFBQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSXFCLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMVYsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGdCQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Msc0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUlDLEtBQUcsR0FBR2IsVUFBUSxDQUFDO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJYyxLQUFHLEdBQUdOLFVBQVEsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5YXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2xCLFFBQU0sR0FBRztBQUN6QixFQUFFLElBQUksR0FBRyxHQUFHLElBQUlDLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkM7QUFDQSxFQUFFLElBQUlBLFVBQW1CLElBQUksWUFBWSxFQUFFO0FBQzNDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTbEUsT0FBSyxDQUFDLENBQUMsRUFBRTtBQUN6QixFQUFFLElBQUksR0FBRyxHQUFHLElBQUlrRSxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsR0FBRyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsWUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQy9DLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSUgsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ksS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzlCO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdkMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNFLGFBQVcsQ0FBQyxDQUFDLEVBQUU7QUFDL0IsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNsQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7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Q0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLGdCQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLHNCQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSCxhQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUcsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTcEIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSXFCLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlBLE9BQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFD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Q0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxNQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNFLFlBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN4RSxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlILFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNJLEtBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDdEUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNGLFVBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csV0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDbEM7QUFDQSxFQUFFLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtBQUNqQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsR0FBRyxNQUFNO0FBQ1QsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUks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R0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDakMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGFBQVcsQ0FBQyxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDeEcsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUM3QyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNkLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ25DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNlLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNwQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTYSxpQkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNaLGNBQVksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDdkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsYUFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2EsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDdkMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEM7QUFDQSxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xGO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQ3JELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDL0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNyQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1osS0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzlJLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxDQUFDLEVBQUU7QUFDeEIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csZ0JBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Msc0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNILGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvSixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNwQixRQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJcUIsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNud0IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJRyxLQUFHLEdBQUdiLFVBQVEsQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSWMsS0FBRyxHQUFHTixVQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeHdCekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNsQixRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQyxVQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNsRSxPQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSWtFLFVBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsWUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUMzRyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlILFVBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ksS0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNGLFVBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQ2pCLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25CLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLEdBQUcsTUFBTTtBQUNULElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSSxRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNsQztBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEY7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7QUFDdEQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3RyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0csRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzFHLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEM7QUFDQSxFQUFFLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDL0UsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQjtBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNyRCxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDYixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RELEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUN0RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDdEQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTZCxXQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDckMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7QUFDekIsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUN6QixFQUFFLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0FBQ3pCO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEQsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELEdBQUcsTUFBTTtBQUNULElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2pCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEQsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2dCLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxD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RSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2Q7QUFDQSxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QjtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzlDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzlDO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakI7QUFDQSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTUSxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQjtBQUNBLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO0FBQ2pCO0FBQ0EsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM5QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQjtBQUNBLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO0FBQ2pCO0FBQ0EsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM5QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQjtBQUNBLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFO0FBQ2pCO0FBQ0EsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQTtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTTCxpQkFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxD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QUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUN4QyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDeEMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QjtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ3hDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEI7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTVyx5QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuRDtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcs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VSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3JDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDdEMsRUFBRSxJQUFJLE9BQU8sR0FBRyxJQUFJL0IsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDMUIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEVBQUUsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMxQixFQUFFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDM0IsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaO0FBQ0EsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7QUFDakIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsR0FBRyxNQUFNLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxFQUFFO0FBQ3pDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN0QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsR0FBRyxNQUFNLElBQUksSUFBSSxHQUFHLElBQUksRUFBRTtBQUMxQixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUN0QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLEdBQUcsTUFBTTtBQUNULElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hELElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdEIsR0FBRztBQUNIO0FBQ0EsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLDRCQUE0QixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMzRDtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGtDQUFrQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEU7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNsQyxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM1QixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbEMsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzVCLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUM1QixFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDNUIsRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ25DLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUM1RCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDNUQsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzdELEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNqQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDbEUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzlCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUM5QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDekIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDekIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7QUFDOUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUM1RCxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbEMsTUFBTSxFQUFFLENBQUM7QUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2Q7QUFDQSxFQUFFLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssUUFBUSxFQUFFO0FBQ3ZDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUNoQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDbEMsR0FBRyxNQUFNO0FBQ1QsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNVLElBQUMsV0FBVyxHQUFHLGFBQWMsQ0FBQTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtBQUM1RCxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbEMsTUFBTSxFQUFFLENBQUM7QUFDVCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2Q7QUFDQSxFQUFFLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssUUFBUSxFQUFFO0FBQ3ZDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUIsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUN2QixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQUM5QixHQUFHLE1BQU07QUFDVCxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqQixJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUNwQixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsMEJBQTBCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQ2hFLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDeEQsRUFBRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUM1RCxFQUFFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO0FBQzVELEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7QUFDOUQsRUFBRSxJQUFJLE1BQU0sR0FBRyxHQUFHLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0FBQzFDLEVBQUUsSUFBSSxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEdBQUcsUUFBUSxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNsRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxPQUFPLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztBQUM1QyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDdEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQ2xFLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQztBQUM5QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUM5QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDVSxJQUFDLEtBQUssR0FBRyxPQUFRLENBQUE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQ2xFLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQztBQUM5QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO0FBQzdDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7QUFDOUMsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsRUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsRUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsRUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUI7QUFDQSxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUdtQixPQUFnQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHQSxPQUFnQixJQUFJLElBQUks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RSxDQUFDLENBQUMsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN4QztBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO0FBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0IsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDO0FBQ2QsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFO0FBQzlCLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUU7QUFDOUIsTUFBTSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQy9CLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3BDO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUM7QUFDZCxHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1ksS0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdFAsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFO0FBQ3hCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDMUIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDdkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbEMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsYUFBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbFMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTcEIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlxQixPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzkyQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNVLElBQUNHLEtBQUcsR0FBR2IsVUFBUyxDQUFBO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJYyxLQUFHLEdBQUdOLFVBQVEsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcDNEekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNsQixRQUFNLEdBQUc7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQyxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2xFLE9BQUssQ0FBQyxDQUFDLEVBQUU7QUFDekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJa0UsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2dDLFFBQU0sQ0FBQyxDQUFDLEVBQUU7QUFDMUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzdCLFlBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUlILFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTWSxLQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTUixVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTd0IsUUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzNCLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzRCLGFBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUU7QUFDOUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDL0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFD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QUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzVDLEVBQUUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixFQUFFLElBQUksT0FBTyxHQUFHLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxFQUFFLElBQUksT0FBTyxHQUFHLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNDLEVBQUUsSUFBSSxPQUFPLEdBQUcsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLElBQUksT0FBTyxHQUFHLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDN0UsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUM3RSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQzdFLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDM0MsRUFBRSxJQUFJLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsSUFBSSxxQkFBcUIsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQzVELEVBQUUsSUFBSSxZQUFZLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixFQUFFLElBQUksT0FBTyxHQUFHLHFCQUFxQixHQUFHLGFBQWEsQ0FBQztBQUN0RCxFQUFFLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcscUJBQXFCLENBQUM7QUFDOUMsRUFBRSxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUcsWUFBWSxHQUFHLGFBQWEsQ0FBQztBQUNqRCxFQUFFLElBQUksT0FBTyxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUM3RSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQzdFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDN0UsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsUUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUU7QUFDbkMsRUFBRSxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUcsQ0FBQztBQUN2QixFQUFFLElBQUksQ0FBQyxHQUFHQyxNQUFlLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUM1QyxFQUFFLElBQUksQ0FBQyxHQUFHQSxNQUFlLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3hDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUM5QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxlQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6RCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLGVBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN6QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFD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LEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRCxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRDtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsU0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUN4QyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7QUFDWixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDYjtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCO0FBQ0EsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDckQ7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFNBQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDeEMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ1osTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2I7QUFDQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQjtBQUNBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMs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LENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3JDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1ksS0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNSLFVBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNwQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3dCLFFBQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsT0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzNCLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNqQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTNEIsYUFBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRTtBQUM5QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUMvQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxVQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxpQkFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNULFFBQU0sQ0FBQyxDQUFDLEVBQUU7QUFDMUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTVSxlQUFhLENBQUMsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxRQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxTQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLFdBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7QUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QixHQUFHO0FBQ0g7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ25CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLEtBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzFCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNDLE9BQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxRQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRTtBQUNuQyxFQUFFLEtBQUssR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDckIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDYjtBQUNBLEVBQUUsR0FBRztBQUNMLElBQUksRUFBRSxHQUFHQyxNQUFlLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLElBQUksRUFBRSxHQUFHQSxNQUFlLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUMzQixHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRTtBQUNwQjtBQUNBLEVBQUUsR0FBRztBQUNMLElBQUksRUFBRSxHQUFHQSxNQUFlLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLElBQUksRUFBRSxHQUFHQSxNQUFlLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUMzQixHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRTtBQUNwQjtBQUNBLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDbkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsZUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2RCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3pDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQjtBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNwQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyQztBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDcEQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNwRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ3BELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ksTUFBSSxDQUFDLEdBQUcsRUFBRTtBQUMxQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDZixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU3pDLEtBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3hFLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0ksYUFBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTcEIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJcUIsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSUEsT0FBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxVixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLElBQUlJLEtBQUcsR0FBR04sVUFBUSxDQUFDO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxJQUFJSyxLQUFHLEdBQUdiLFVBQVEsQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtB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Q0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QztBQUNBLEVBQUUsSUFBSUEsVUFBbUIsSUFBSSxZQUFZLEVBQUU7QUFDM0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsR0FBRztBQUNIO0FBQ0EsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNFLFVBQVEsQ0FBQyxHQUFHLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQzdDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRTtBQUMxQyxFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUI7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHaUIsT0FBZ0IsRUFBRTtBQUM1QixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0IsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixHQUFHLE1BQU07QUFDVDtBQUNBLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLFVBQVUsR0FBRzJCLEtBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0IsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNyQyxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFB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QUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDNUIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUMzQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzNDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FB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ckIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsR0FBRztBQUNIO0FBQ0E7QUFDQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDckMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNyQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDckMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM4QixRQUFNLENBQUMsR0FBRyxFQUFFO0FBQzVCO0FBQ0E7QUFDQSxFQUFFLElBQUksRUFBRSxHQUFHQyxNQUFlLEVBQUUsQ0FBQztBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHQSxNQUFlLEVBQUUsQ0FBQztBQUM3QixFQUFFLElBQUksRUFBRSxHQUFHQSxNQUFlLEVBQUUsQ0FBQztBQUM3QixFQUFFLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN2RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxH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Q3pCLElBQUksS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFDeEI7QUFDQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQ25DLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDbkMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUNuQyxHQUFHLE1BQU07QUFDVDtBQUNBLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3hFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFDekIsSUFBSSxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztBQUN4QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUNuRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUNuRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUNuRCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDeEMsRUFBRSxJQUFJLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDeEMsRUFBRSxDQUFDLElBQUksU0FBUyxDQUFDO0FBQ2pCLEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQztBQUNqQixFQUFFLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDakIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDdkMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNqRCxLQUFHLENBQUMsQ0FBQyxFQUFFO0FBQ3ZCLEVBQUUsT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFH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QUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLEdBQUc7QUFDSDtBQUNBLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNaLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNsRSxPQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSWtFLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRyxZQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUMzRCxFQUFFLElBQUksRUFBRSxHQUFHLElBQUlILFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2IsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyw2QkFBNkIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDMUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJQSxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNiLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7QUFDbkIsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUc7QUFDbkIsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztBQUNwQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN0QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN0QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN0QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25ELEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDckIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDckIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDckIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ3hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDdEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN0QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNyQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2IsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDO0FBQ0EsRUFBRSxJQUFJLEtBQUssR0FBR29GLFFBQVcsRUFBRSxDQUFDO0FBQzVCLEVBQUVDLFdBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdCLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSXJGLFVBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckMsRUFBRXNGLGdCQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTckYsTUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsVUFBUSxDQUFDLEdBQUcsRUFBRTtBQUM5QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDYixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0UsS0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQ3pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVB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QUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNyQyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUc7QUFDdEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNuRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbkQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ25ELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3BELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7QUFDckMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbEQsRUFBRUMsU0FBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUIsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO0FBQ3JDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2xELEVBQUVDLFNBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUNyQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDakQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNsRCxFQUFFQyxTQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM1QixFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDckQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNyRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ3JELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM5QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUs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QUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqRCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakQsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNlLEtBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTUCxVQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pELEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekQsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RCxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3pHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6RyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDekcsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSWEsS0FBRyxHQUFHYixVQUFRLENBQUM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRSxPQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sSUFBSW1DLEtBQUcsR0FBRzZDLEtBQVEsQ0FBQztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzNDLE1BQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLEVBQUUsSUFBSUYsS0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMs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LENBQUMsRUFBRTtBQUNsQyxFQUFFLElBQUksU0FBUyxHQUFHSCxlQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkM7QUFDQSxFQUFFLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtBQUNyQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3JDLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUM5QixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDOUIsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQzlCLElBQUksSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUM5QixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixJQUFJLElBQUksT0FBTyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksU0FBUyxDQUFDO0FBQzdDLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTNUIsS0FBRyxDQUFDLENBQUMsRUFBRTtBQUN2QixFQUFFLE9BQU8sUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNqSSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNJLGFBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUksQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTcEIsUUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUlxQixPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJQSxPQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzlxQixDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqMEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLE1BQU0sR0FBRztBQUN6QixFQUFFLElBQUksR0FBRyxHQUFHLElBQUluQixVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDO0FBQ0EsRUFBRSxJQUFJQSxVQUFtQixJQUFJLFlBQVksRUFBRTtBQUMzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSUEsVUFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQSxVQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNiLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDcEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDOUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO0FBQzlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2pDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQzlDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxNQUFNLENBQUMsQ0FBQyxFQUFFO0FBQzFCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNkLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxDQUFDLEVBQUU7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNoQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRTtBQUNsQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQjtBQUNBLEVBQUUsSUFBSSxHQUFHLEdBQUcs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LENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUN6QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsRUFBRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN2QyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtBQUN2QztBQUNBLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7QUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQjtBQUNBLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QyxFQUFFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUM1QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNmLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZjtBQUNBLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDbkU7QUFDQSxFQUFFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO0FBQzVDO0FBQ0EsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQzFCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNmLEVBQUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDdkIsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDNUMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2xDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FB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T0FBTyxLQUFLLENBQUM7QUFDekIsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ3RDO0FBQ0EsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQyxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNDLFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0M7QUFDQSxRQUFRLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQzlDLFFBQVEsTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDdEQsUUFBUSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEQsUUFBUSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUU7QUFDckI7QUFDQSxZQUFZLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzVDLFlBQVksTUFBTSxFQUFF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LEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFFLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUUsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixRQUFRLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3BDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxDQUFDLEtBQUsseUJBQXlCO0FBQzVDLFFBQVEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GLFFBQVEsT0FBTyxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxDQUFDLEtBQUsseUJBQXlCO0FBQzVDLFFBQVEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GLFFBQVEsT0FBTyxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxDQUFDLEtBQUsseUJBQXlCO0FBQzVDLFFBQVEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GLFFBQVEsT0FBTyxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEtBQUs7QUFDTDtBQUNBLElBQUksVUFBVSx5QkFBeUI7QUFDdkMsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQzVCLFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUM1QixRQUFRLE9BQU87QUFDZixZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxJQUFJLFVBQVUsQ0FBQyxPQUFPLG1CQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQSxRQUFRLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUM3QyxRQUFRLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQztBQUMvQjtBQUNBLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3hELFlBQVksTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QyxZQUFZLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUNqQztBQUNBLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDeEQsZ0JBQWdCLFlBQVksSUFBSXZCLEtBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvRSxhQUFhO0FBQ2I7QUFDQSxZQUFZLElBQUksWUFBWSxLQUFLLENBQUM7QUFDbEMsZ0JBQWdCLE9BQU8sQ0FBQyxDQUFDO0FBQ3pCO0FBQ0EsWUFBWSxJQUFJLFlBQVksS0FBSyxVQUFVLENBQUMsTUFBTTtBQUNsRCxnQkFBZ0IsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUNwQyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksV0FBVztBQUN2QixZQUFZLE9BQU8sQ0FBQyxDQUFDO0FBQ3JCO0FBQ0EsUUFBUSxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO0FBQzdDLFlBQVksSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUMzQyxZQUFZLElBQUksT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUM1QztBQUNBLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzVELGdCQUFnQixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEY7QUFDQSxnQkFBZ0IsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQzVELGdCQUFnQixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDNUQsYUFBYTtBQUNiO0FBQ0EsWUFBWSxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEUsZ0JBQWdCLE9BQU8sQ0FBQyxDQUFDO0FBQ3pCLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxDQUFDLENBQUM7QUFDakIsS0FBSztBQUNMLENBQUE7O0FDNVFBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sZ0JBQWdCLFNBQVMsVUFBVSxDQUFDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLENBQUMsS0FBSyxzQkFBc0I7QUFDM0MsUUFBUSxLQUFLLENBQUMsS0FBSyxFQUFFd0IsWUFBVSxDQUFDLENBQUM7QUFDakMsS0FBSztBQUNMO0FBQ0EsSUFBSSxZQUFZLENBQUMsVUFBVSx1REFBdUQ7QUFDbEYsUUFBUSxPQUFPLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzVDLEtBQUs7QUFDTDtBQUNBLElBQUksV0FBVyxDQUFDLE1BQU0sa0JBQWtCO0FBQ3hDLFFBQVEsTUFBTSxZQUFZLG9DQUFvQyxNQUFNLE1BQU0sQ0FBQztBQUMzRSxRQUFRLE9BQU8sb0JBQW9CLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUM7QUFDeEUsWUFBWSxvQkFBb0IsQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDO0FBQzNFLFlBQVksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLEtBQUs7QUFDTDtBQUNBLElBQUksc0JBQXNCLENBQUMsYUFBYTtBQUN4QywyQkFBMkIsT0FBTztBQUNsQywyQkFBMkIsWUFBWTtBQUN2QywyQkFBMkIsUUFBUTtBQUNuQywyQkFBMkIsSUFBSTtBQUMvQiwyQkFBMkIsU0FBUztBQUNwQywyQkFBMkIsY0FBYztBQUN6QywyQkFBMkIsZUFBZSx3QkFBd0I7QUFDbEU7QUFDQSxRQUFRLE1BQU0sV0FBVyxHQUFHLGtCQUFrQjtBQUM5QyxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDO0FBQzlDLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUM7QUFDckQsWUFBWSxTQUFTLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ25FO0FBQ0EsUUFBUSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQztBQUNwRixZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNsRjtBQUNBLFFBQVEsT0FBTyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsZUFBZTtBQUN4RyxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLEtBQUssS0FBSztBQUM5RCxZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLEtBQUssS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvRSxLQUFLO0FBQ0w7QUFDQSxJQUFJLGFBQWEsa0JBQWtCO0FBQ25DLFFBQVEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFCLEtBQUs7QUFDTDtBQUNBLElBQUksdUJBQXVCLENBQUMsSUFBSSxnQ0FBZ0M7QUFDaEUsUUFBUSxPQUFPLElBQUksb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3BELEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDTyxTQUFTLHFCQUFxQixDQUFDLGFBQWE7QUFDbkQsdUJBQXVCLFFBQVE7QUFDL0IsdUJBQXVCLFNBQVM7QUFDaEMsdUJBQXVCLGNBQWM7QUFDckMsdUJBQXVCLGVBQWU7QUFDdEMsdUJBQXVCLFlBQVk7QUFDbkMsdUJBQXVCLFlBQVk7QUFDbkMsdUJBQXVCLFdBQVc7QUFDbEMsdUJBQXVCLElBQUksbUJBQW1CO0FBQzlDLElBQUksSUFBSSxZQUFZLElBQUksYUFBYSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxZQUFZLEVBQUUsSUFBSSxJQUFJLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQztBQUNuRTtBQUNBLElBQUksTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDbEQsSUFBSSxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FBQztBQUM5SDtBQUNBLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLEVBQUU7QUFDakMsUUFBUSxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksRUFBRTtBQUNsQyxZQUFZLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDM0QsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxTQUFTLENBQUMsU0FBUztBQUM3RCxnQkFBZ0IsU0FBUyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDL0gsZ0JBQWdCLENBQUMsQ0FBQztBQUNsQjtBQUNBO0FBQ0EsWUFBWSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMvRztBQUNBLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3ZCLGdCQUFnQixNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEcsZ0JBQWdCLE1BQU0sQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDeEQsZ0JBQWdCLE1BQU0sQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDeEQsZ0JBQWdCLE1BQU0sQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDeEQsYUFBYTtBQUNiO0FBQ0EsWUFBWSxNQUFNLGdCQUFnQixHQUFHLFlBQVksR0FBRyxlQUFlLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ2pJLFlBQVksTUFBTSxrQkFBa0IsR0FBRyxZQUFZO0FBQ25ELGdCQUFnQixhQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0UsZ0JBQWdCLGFBQWEsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDO0FBQzNEO0FBQ0EsWUFBWSxNQUFNLGVBQWUsR0FBR04sZUFBa0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUM5RyxZQUFZLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxFQUFFO0FBQy9DLGdCQUFnQixJQUFJLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQztBQUM5RSxhQUFhLE1BQU0sSUFBSSxZQUFZLElBQUksQ0FBQyxZQUFZLEVBQUU7QUFDdEQsZ0JBQWdCLElBQUksSUFBSSxTQUFTLENBQUMsc0JBQXNCLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlFLGFBQWE7QUFDYjtBQUNBLFlBQVksSUFBSSxZQUFZLEVBQUU7QUFDOUI7QUFDQSxnQkFBZ0IsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5RixnQkFBZ0IsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMxRztBQUNBLGdCQUFnQixJQUFJLElBQUksS0FBSyxDQUFDO0FBQzlCLGFBQWE7QUFDYjtBQUNBLFlBQVksSUFBSSw4QkFBOEIsQ0FBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQztBQUN4RyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFlBQVksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxjQUFjLGdCQUFnQjtBQUNyRixJQUFJLE1BQU0sS0FBSyxHQUFHQSxlQUFrQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZFLElBQUksT0FBTyxJQUFJeEssYUFBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRDtBQUNBLE1BQU0sTUFBTSxHQUFHcUosWUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEMsTUFBTSxFQUFFLEdBQUdBLFlBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0EsU0FBUyxpQkFBaUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUI7QUFDckQsSUFBSSxNQUFNLGNBQWMsR0FBR0QsUUFBVyxFQUFFLENBQUM7QUFDekMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLElBQUksTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3JFLElBQUluSixRQUFNLENBQUMsVUFBVSxFQUFFLG9IQUFvSCxDQUFDLENBQUM7QUFDN0k7QUFDQSxJQUFJLE9BQU8sSUFBSUQsYUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFBOztBQzlKQTtBQUtBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sYUFBYSxTQUFTLFlBQVksb0JBQW9CO0FBQzVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLFFBQVEsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBOztBQ2Q1RDtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsV0FBVyw0QkFBNEIsS0FBSyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLFFBQVEsVUFBVSxJQUFJLHNDQUFzQztBQUM3SSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDZixRQUFRLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0FBQ3pELEtBQUssTUFBTSxJQUFJLElBQUksWUFBWSxpQkFBaUIsRUFBRTtBQUNsRCxRQUFRLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDM0MsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLEdBQUcsTUFBTSxHQUFHLFFBQVEsRUFBRTtBQUMxRCxRQUFRLE1BQU0sSUFBSSxVQUFVLENBQUMsdUJBQXVCLENBQUMsQ0FBQztBQUN0RCxLQUFLO0FBQ0wsSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN4QixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQzFCLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDdEIsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFdBQVcsNEJBQTRCLEtBQUssS0FBSyxRQUFRLEtBQUssUUFBUSxVQUFVO0FBQ3pGLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUM7QUFDckMsSUFBSSxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUMsS0FBSyxJQUFJLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTSxFQUFFO0FBQzFELFFBQVEsT0FBTztBQUNmLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQzNELFFBQVEsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7QUFDM0MsUUFBUSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztBQUM5QyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDakI7QUFDQSxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDMUIsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7QUFDL0IsQ0FBQztBQUNEO0FBQ0EsU0FBUyxTQUFTLDRCQUE0QixNQUFNLGlCQUFpQixNQUFNLEtBQUssS0FBSyxTQUFTLEtBQUssU0FBUyxJQUFJLFFBQVEsUUFBUSxhQUFhO0FBQzdJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMvQyxRQUFRLE9BQU8sTUFBTSxDQUFDO0FBQ3RCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTTtBQUNuQyxRQUFRLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSztBQUMzQyxRQUFRLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQy9DLFFBQVEsTUFBTSxJQUFJLFVBQVUsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0FBQy9FLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLO0FBQ2pDLFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTTtBQUNuQyxRQUFRLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSztBQUMzQyxRQUFRLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQy9DLFFBQVEsTUFBTSxJQUFJLFVBQVUsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO0FBQ3BGLEtBQUs7QUFDTDtBQUNBLElBQUksTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUNoQyxJQUFJLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDaEM7QUFDQSxJQUFJQyxRQUFNLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQ2hDO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQyxRQUFRLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDO0FBQzlFLFFBQVEsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUM7QUFDOUUsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDeEQsWUFBWSxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUQsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFDRDtBQUNPLE1BQU0sVUFBVSxDQUFDO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLENBQUMsSUFBSSxRQUFRLElBQUksbUNBQW1DO0FBQ25FLFFBQVEsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pDLEtBQUs7QUFDTDtBQUNBLElBQUksTUFBTSxDQUFDLElBQUksUUFBUTtBQUN2QixRQUFRLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbkQsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLGVBQWU7QUFDeEIsUUFBUSxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNuRyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sY0FBYyxNQUFNLGNBQWMsS0FBSyxTQUFTLEtBQUssU0FBUyxJQUFJLFFBQVE7QUFDaEcsUUFBUSxTQUFTLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RCxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNPLE1BQU0sU0FBUyxDQUFDO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLENBQUMsSUFBSSxRQUFRLElBQUksbUNBQW1DO0FBQ25FLFFBQVEsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pDLEtBQUs7QUFDTDtBQUNBLElBQUksTUFBTSxDQUFDLElBQUksUUFBUTtBQUN2QixRQUFRLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsSUFBSSxrQ0FBa0MsSUFBSSxZQUFZO0FBQ2xFLFFBQVEsSUFBSSxJQUFJLEVBQUU7QUFDbEIsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxTQUFTLE1BQU0sSUFBSSxJQUFJLFlBQVksaUJBQWlCLEVBQUU7QUFDdEQsWUFBWSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwRCxTQUFTLE1BQU07QUFDZixZQUFZLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQzdCLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLEtBQUssY0FBYztBQUN2QixRQUFRLE9BQU8sSUFBSSxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2xHLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSx5QkFBeUIsTUFBTSxhQUFhLEtBQUssU0FBUyxLQUFLLFNBQVMsSUFBSSxRQUFRO0FBQzFHLFFBQVEsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekQsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLFFBQVEsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDbkMsUUFBUSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQTs7QUNuSmhDO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNbUUsT0FBSywyQkFBMkIsSUFBSSxVQUFVLENBQUM7QUFDckQsSUFBSSxnQkFBZ0IsRUFBRSxJQUFJLGtCQUFrQixDQUFDWixJQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMxRixJQUFJLGdCQUFnQixFQUFFLElBQUksa0JBQWtCLENBQUNBLElBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzFGLElBQUksbUJBQW1CLEVBQUUsSUFBSSxvQkFBb0IsQ0FBQ0EsSUFBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDbEcsSUFBSSxlQUFlLEVBQUUsSUFBSSxpQkFBaUIsQ0FBQ0EsSUFBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3ZGLElBQUksaUJBQWlCLEVBQUUsSUFBSSxvQkFBb0IsQ0FBQ0EsSUFBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDOUYsQ0FBQyxDQUFDLENBQUM7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQWUsWUFBQSxJQUFDLEVBQUVZLEtBQUFBLEVBQUFBLE9BQUssRUFBRTtBQUN6QjtBQUNBLEdBQUEsQ0FBQTs7QUMzQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUyxlQUFlLENBQUMsTUFBTSw4QkFBOEI7QUFDcEUsSUFBSSxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUNqQyxJQUFJLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDO0FBQzNDLElBQUksTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDMUQsSUFBSSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDakU7QUFDQSxJQUFJbkUsUUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hDO0FBQ0EsSUFBSSxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxLQUFLO0FBQ3JELFFBQVEsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLFFBQVEsQ0FBQztBQUMzRCxRQUFRLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGlCQUFpQixPQUFPLENBQUM7QUFDN0U7QUFDQTtBQUNBLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNyRSxLQUFLLENBQUM7QUFDTjtBQUNBLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7QUFDdkIsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN2RCxZQUFZLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0M7QUFDQSxZQUFZLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFNBQVM7QUFDVCxLQUFLLE1BQU07QUFDWCxRQUFRLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtBQUNuRixZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQzNEO0FBQ0EsZ0JBQWdCLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDakQsZ0JBQWdCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4RCxnQkFBZ0IsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7QUFDbkYsZ0JBQWdCLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDM0QsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUE7O0FDNURBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0saUJBQWlCLFNBQVMsVUFBVSxDQUFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksWUFBWSxDQUFDLFVBQVUsc0NBQXNDO0FBQ2pFLFFBQVEsT0FBTyxJQUFJLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM3QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsQ0FBQyxLQUFLLHNCQUFzQjtBQUMzQyxRQUFRLEtBQUssQ0FBQyxLQUFLLEVBQUU2SyxZQUFVLENBQUMsQ0FBQztBQUNqQztBQUNBO0FBQ0EsUUFBUSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztBQUNoQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLGlDQUFpQyxDQUFDLElBQUksVUFBVTtBQUNwRCxRQUFRLElBQUksSUFBSSxLQUFLLGVBQWUsRUFBRTtBQUN0QyxZQUFZLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0FBQ3BDLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLGdCQUFnQixHQUFHO0FBQ3ZCLFFBQVEsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO0FBQy9GLFFBQVEsSUFBSSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7QUFDekMsWUFBWSxVQUFVO0FBQ3RCLFlBQVksYUFBYSxFQUFFLGdCQUFnQjtBQUMzQyxZQUFZLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUztBQUNqQyxTQUFTLENBQUMsQ0FBQztBQUNYLFFBQVEsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUNyQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sR0FBRztBQUNiLFFBQVEsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO0FBQzdCLFlBQVksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN0QyxZQUFZLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ25DLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsQ0FBQyxNQUFNLGtCQUFrQjtBQUN4QyxRQUFRLE9BQU8sb0JBQW9CLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxJQUFJLE1BQU0seUJBQXlCLENBQUM7QUFDOUYsS0FBSztBQUNMO0FBQ0EsSUFBSSxzQkFBc0IsQ0FBQyxhQUFhO0FBQ3hDLDJCQUEyQixPQUFPO0FBQ2xDLDJCQUEyQixZQUFZO0FBQ3ZDLDJCQUEyQixRQUFRO0FBQ25DLDJCQUEyQixJQUFJO0FBQy9CLDJCQUEyQixTQUFTO0FBQ3BDLDJCQUEyQixjQUFjO0FBQ3pDLDJCQUEyQixlQUFlLHdCQUF3QjtBQUNsRTtBQUNBLFFBQVEsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RGLFFBQVEsT0FBTyxxQkFBcUI7QUFDcEMsWUFBWSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsZUFBZTtBQUMvRSxZQUFZLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTlLLGFBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0MsS0FBSztBQUNMO0FBQ0EsSUFBSSxnQkFBZ0IsWUFBWTtBQUNoQyxRQUFRLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUM7QUFDckYsS0FBSztBQUNMO0FBQ0EsSUFBSSxhQUFhLGtCQUFrQjtBQUNuQyxRQUFRLE9BQU8sQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUM3QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLHVCQUF1QixDQUFDLElBQUksZ0NBQWdDO0FBQ2hFLFFBQVEsT0FBTyxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRCxLQUFLO0FBQ0wsQ0FBQTs7QUNuR0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTW9FLE9BQUssMkJBQTJCLElBQUksVUFBVSxDQUFDO0FBQ3JELElBQUksa0NBQWtDLEVBQUUsSUFBSSxvQkFBb0IsQ0FBQ1osSUFBUyxDQUFDLGlCQUFpQixDQUFDLENBQUMsa0NBQWtDLENBQUMsQ0FBQztBQUNsSSxJQUFJLCtCQUErQixFQUFFLElBQUksb0JBQW9CLENBQUNBLElBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFDNUgsSUFBSSx3QkFBd0IsRUFBRSxJQUFJLG9CQUFvQixDQUFDQSxJQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQzlHLElBQUksd0JBQXdCLEVBQUUsSUFBSSxvQkFBb0IsQ0FBQ0EsSUFBUyxDQUFDLGlCQUFpQixDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUM5RyxJQUFJLDJCQUEyQixFQUFFLElBQUksb0JBQW9CLENBQUNBLElBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUM7QUFDcEgsSUFBSSx3QkFBd0IsRUFBRSxJQUFJLG9CQUFvQixDQUFDQSxJQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQzlHLENBQUMsQ0FBQyxDQUFDO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFlLFlBQUEsSUFBQyxFQUFFWSxLQUFBQSxFQUFBQSxPQUFLLEVBQUU7QUFDekI7QUFDQSxHQUFBLENBQUE7O0FDN0NBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLG1CQUFtQixTQUFTLFVBQVUsQ0FBQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLEtBQUssc0JBQXNCO0FBQzNDLFFBQVEsS0FBSyxDQUFDLEtBQUssRUFBRTBHLFlBQVUsQ0FBQyxDQUFDO0FBQ2pDLEtBQUs7QUFDTDtBQUNBLElBQUksZ0JBQWdCLFlBQVk7QUFDaEMsUUFBUSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDO0FBQzVGLEtBQUs7QUFDTDtBQUNBLElBQUksYUFBYSxrQkFBa0I7QUFDbkMsUUFBUSxPQUFPLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDakQsS0FBSztBQUNMLENBQUE7O0FDMUJBO0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTNHLFFBQU0sc0JBQXNCLFlBQVksQ0FBQztBQUMvQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7QUFDakQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBR0MsTUFBTSxDQUFBLE9BQUEsRUFBQ1QsU0FBTyxFQUFFQyxJQUFBQSxFQUFBQSxNQUFJLGFBQUVDLFdBQVMsQ0FBQyxHQUFHTyxRQUFNLENBQUE7O0FDVmhELFlBQVksQ0FBQztBQUNiO0FBQ0EsSUFBYyxRQUFBLEdBQUcsTUFBTSxDQUFDO0FBQ3hCLElBQXNCLFFBQUEsR0FBRyxNQUFNLENBQUM7QUFDaEM7QUFDQSxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRTtBQUN4QztBQUNBLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDbkI7QUFDQSxJQUFJLElBQUksUUFBUSxHQUFHLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTTtBQUNwRCxRQUFRLFFBQVEsR0FBRyxRQUFRLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTTtBQUNoRSxRQUFRLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQztBQUM1RCxRQUFRLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDdkI7QUFDQSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sU0FBUyxDQUFDO0FBQzFFO0FBQ0EsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQztBQUM5QztBQUNBLElBQUksSUFBSSxRQUFRLEVBQUUsU0FBUyxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNoRjtBQUNBO0FBQ0EsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLEdBQUcsRUFBRTtBQUNoQyxRQUFRLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFFBQVEsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUI7QUFDQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRTtBQUNsRCxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QixZQUFZLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLFlBQVksSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbkMsWUFBWSxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNuQyxZQUFZLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNyRCxRQUFRLE9BQU8sR0FBRyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2xELEtBQUs7QUFDTDtBQUNBLElBQUksWUFBWSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakU7QUFDQSxJQUFJLE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRTtBQUN0RCxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQztBQUNoQjtBQUNBLElBQUksSUFBSSxTQUFTLE1BQU00RyxZQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDL0QsUUFBUSxLQUFLLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzVGLEtBQUssTUFBTTtBQUNYLFFBQVEsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkcsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUN6QyxRQUFRLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3pCLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO0FBQ2xDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM3QixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQztBQUMxQjtBQUNBLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSztBQUNqQixRQUFRLEtBQUssQ0FBQztBQUNkLElBQUksR0FBRztBQUNQLFFBQVEsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN0QjtBQUNBLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNoRixZQUFZLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixZQUFZLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM3QixZQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTTtBQUNwQyxZQUFZLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDekI7QUFDQSxTQUFTLE1BQU07QUFDZixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3ZCLFNBQVM7QUFDVCxLQUFLLFFBQVEsS0FBSyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUU7QUFDakM7QUFDQSxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLFlBQVksQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDdEUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU87QUFDckI7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9EO0FBQ0EsSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHO0FBQ2xCLFFBQVEsSUFBSSxFQUFFLElBQUksQ0FBQztBQUNuQjtBQUNBO0FBQ0EsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRTtBQUNsQyxRQUFRLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3hCLFFBQVEsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDeEI7QUFDQSxRQUFRLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDMUU7QUFDQSxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6QyxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN4QyxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN6QztBQUNBLFlBQVksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVCO0FBQ0E7QUFDQSxZQUFZLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzVCLFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDN0I7QUFDQSxZQUFZLFNBQVM7QUFDckIsU0FBUztBQUNUO0FBQ0EsUUFBUSxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ25CO0FBQ0E7QUFDQSxRQUFRLElBQUksR0FBRyxLQUFLLElBQUksRUFBRTtBQUMxQjtBQUNBLFlBQVksSUFBSSxDQUFDLElBQUksRUFBRTtBQUN2QixnQkFBZ0IsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hGO0FBQ0E7QUFDQSxhQUFhLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ25DLGdCQUFnQixHQUFHLEdBQUcsc0JBQXNCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNoRixnQkFBZ0IsWUFBWSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFFO0FBQ0E7QUFDQSxhQUFhLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO0FBQ25DLGdCQUFnQixXQUFXLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN0RSxhQUFhO0FBQ2I7QUFDQSxZQUFZLE1BQU07QUFDbEIsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsS0FBSyxDQUFDLEdBQUcsRUFBRTtBQUNwQixJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJO0FBQ3BCLFFBQVEsQ0FBQyxHQUFHLEdBQUc7QUFDZixRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3JCO0FBQ0EsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUN6QztBQUNBO0FBQ0EsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztBQUMxQjtBQUNBLElBQUksT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRTtBQUMzQixRQUFRLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ3ZELFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDbkIsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7QUFDL0MsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSTtBQUNwQixRQUFRLENBQUMsR0FBRyxHQUFHO0FBQ2YsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztBQUNyQjtBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDekM7QUFDQTtBQUNBLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxRQUFRLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLFFBQVEsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0UsUUFBUSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlFO0FBQ0E7QUFDQSxJQUFJLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO0FBQ3hELFFBQVEsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDekQ7QUFDQSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLO0FBQ3JCLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDdEI7QUFDQTtBQUNBLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO0FBQ2pELFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUk7QUFDNUMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDdkQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUNwQjtBQUNBLFFBQVEsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUk7QUFDNUMsWUFBWSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFB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LENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEIsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUMxQixRQUFRLE1BQU0sSUFBSSxDQUFDLENBQUM7QUFDcEI7QUFDQSxLQUFLLFFBQVEsU0FBUyxHQUFHLENBQUMsRUFBRTtBQUM1QjtBQUNBLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQzNDO0FBQ0EsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDckMsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDckM7QUFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ3BDO0FBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDO0FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUNwQztBQUNBLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxXQUFXLENBQUMsS0FBSyxFQUFFO0FBQzVCLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSztBQUNqQixRQUFRLFFBQVEsR0FBRyxLQUFLLENBQUM7QUFDekIsSUFBSSxHQUFHO0FBQ1AsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUN2RixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ25CLEtBQUssUUFBUSxDQUFDLEtBQUssS0FBSyxFQUFFO0FBQzFCO0FBQ0EsSUFBSSxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDekQsSUFBSSxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQzdELFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7QUFDN0QsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMvQixJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzRSxZQUFZLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1RSxhQUFhLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNELFlBQVksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hGLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDdkIsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUN4QixJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEMsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0EsSUFBSSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQztBQUM1QztBQUNBLElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3ZELElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3ZELElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3ZELElBQUksSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3ZEO0FBQ0EsSUFBSSxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzVCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUNEO0FBQ0EsU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ25CLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNqQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLElBQUksR0FBRztBQUNQLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDOUUsZ0JBQWdCLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDekQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNuQixLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUN0QjtBQUNBLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUNEO0FBQ0E7QUFDQSxTQUFTLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzdCLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDdEMsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzFELFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdB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QUMzQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNoQixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRTtBQUMxRCxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsS0FBSztBQUNMLElBQUksT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBQ0Q7QUFDQTtBQUNBLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxJQUFJLEVBQUU7QUFDakMsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUMvQixRQUFRLE1BQU0sR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDO0FBQzNELFFBQVEsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUN0QjtBQUNBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDMUMsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNqRCxZQUFZLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJ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QUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hCO0FBQ0EsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQzlCO0FBQ0EsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pDO0FBQ0EsSUFBSSxJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNoRCxRQUFRLEdBQUcsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdEO0FBQ0EsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNoQyxJQUFJLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkUsUUFBUSxNQUFNLElBQUksQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQ2hFLFFBQVEsTUFBTSxJQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ2pFO0FBQ0EsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzVCLENBQUE7O0FDN0VBO0FBS0E7QUFDTyxNQUFNLGVBQWUsQ0FBQztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVU7QUFDakQsUUFBUW5FLFFBQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNsQyxRQUFRQSxRQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxRQUFRQSxRQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkIsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuQixRQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sQ0FBQyxFQUFFLDRCQUE0QjtBQUN6QyxRQUFRLE9BQU8sSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckUsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQixNQUFNLG1CQUFtQjtBQUN0RCxRQUFRLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pELFFBQVEsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0Q7QUFDQSxRQUFRLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDcEQsYUFBYSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pGLGFBQWEsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLGFBQWEsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLGFBQWEsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMs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QU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDOUIsSUFBSSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzlCLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUMvQixJQUFJLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDL0I7QUFDQSxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFO0FBQzlCLFFBQVEsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQzVCLFFBQVEsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQzNCLFFBQVEsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDM0IsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDMUMsWUFBWSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDMUM7QUFDQSxZQUFZLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbkQsWUFBWSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELFlBQVksTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuRCxZQUFZ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QUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksSUFBSSxFQUFFLEdBQUc7QUFDYixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osSUFBSSxHQUFHLEVBQUUsR0FBRztBQUNaLElBQUksR0FBRyxFQUFFLEdBQUc7QUFDWixJQUFJLEdBQUcsRUFBRSxHQUFHO0FBQ1osQ0FBQyxDQUFDO0FBQ0Y7QUFDZSxTQUFTLHNCQUFzQixDQUFDLEtBQUssVUFBVSxtQkFBbUIsbUJBQW1CO0FBQ3BHLElBQUksSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3BCO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzQyxRQUFRLE1BQU0sWUFB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QUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUM7QUFDOUMsR0FBRyxNQUFNO0FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUE7QUFDakIsR0FBRztBQUNILEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDakQsQ0FBQyxDQUFBO0FBQ0Q7QUFDQSxJQUFBLEtBQWEsR0FBRyxVQUFVLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0FBQ3JFLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUNiLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUE7QUFDcEMsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFBO0FBQzVCLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQTtBQUN2QixFQUFFLElBQUksRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0FBQ2xFLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDakMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLEdB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QUFNLENBQUMsSUFBSSxJQUFJLEtBQUssR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsT0FBTztBQUN4RyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQztBQUNwRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFlBQVksRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUNoQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLFlBQVksRUFBRSxTQUFTLEdBQUcsRUFBRTtBQUNoQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDdkMsS0FBSztBQUNMO0FBQ0EsSUFBSSxXQUFXLEVBQUUsU0FBUyxHQUFHLEVBQUU7QUFDL0IsUUFBUSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3JDO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbkI7QUFDQSxRQUFRLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDaEM7QUFDQSxRQUFRLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxRQUFRLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDO0FBQ3RDO0FBQ0EsUUFB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SSxDQUFDLENBQUM7QUFDbEMsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxHQUFHLElBQUksbUJBQW1CLElBQUksR0FBRyxHQUFHLENBQUMsbUJBQW1CLEVBQUU7QUFDbEUsUUFBUSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7QUFDbkUsS0FBSztBQUNMO0FBQ0EsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCO0FBQ0EsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLElBQUksa0JBQWtCLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFDRDtBQUNBLFNBQVMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDM0MsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUN2RCxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZELElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDdkQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUN2RCxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDcEMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQztBQUNqQztBQUNBLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTztBQUN0RixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPO0FBQ3RGLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU87QUFDdEYsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTztBQUN0RixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPO0FBQ3RGLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLENBQUM7QUFDRDtBQUNBLFNBQVMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7QUFDcEQsSUFBSSxJQUFJLFFBQVE7QUFDaEIsUUFBUSxHQUFHLElBQUksTUFBTSxHQUFHLENBQUM7QUFDekIsUUFBUSxHQUFHLElBQUksUUFBUSxHQUFHLENBQUM7QUFDM0IsUUFBUSxHQUFHLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFFO0FBQ0E7QUFDQSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUIsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBQ0Q7QUFDQSxTQUFTLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7QUFDMUcsU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQzFHLFNBQVMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztBQUMxRyxTQUFTLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7QUFDMUcsU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQzFHLFNBQVMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztBQUMxRyxTQUFTLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDMUcsU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO0FBQzFHLFNBQVMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUMxRztBQUNBO0FBQ0E7QUFDQSxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQzlCLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUNyQixTQUFTLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLFNBQVMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDNUIsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ25DLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNuQixJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQy9CLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDaEMsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQzdCLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUNyQixTQUFTLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLFNBQVMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDNUIsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFDRDtBQUNBLFNBQVMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2pCLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ2hCO0FBQ0EsSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHLEVBQUU7QUFDcEIsUUFBUSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEIsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckIsUUFBUSxJQUFJLGdCQUFnQjtBQUM1QixZQUFZLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUN6QixZQUFZLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQztBQUN6QixZQUFZLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5QjtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLEdBQUcsR0FBRyxFQUFFLE1BQU07QUFDOUM7QUFDQSxRQUFRLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFDdkI7QUFDQSxRQUFRLElBQUksZ0JBQWdCLEtBQUssQ0FBQyxFQUFFO0FBQ3BDLFlBQVksSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFO0FBQzNCLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLGFBQWE7QUFDYixTQUFTLE1BQU0sSUFBSSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7QUFDM0MsWUFBWSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QixZQUFZLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxNQUFNLElBQUksRUFBRTtBQUN0QyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksS0FBSyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3JELGdCQUFnQixJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDL0Isb0JBQW9CLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDN0IsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTLE1BQU0sSUFBSSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7QUFDM0MsWUFBWSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QixZQUFZLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVCLFlBQVksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksTUFBTSxJQUFJLEVBQUU7QUFDOUQsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksS0FBSyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3pFLGdCQUFnQixJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUU7QUFDaEUsb0JBQW9CLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDN0IsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTLE1BQU0sSUFBSSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7QUFDM0MsWUFBWSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QixZQUFZLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVCLFlBQVksRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDNUIsWUFBWSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLE1BQU0sSUFBSSxFQUFFO0FBQ3RGLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksS0FBSyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQy9GLGdCQUFnQixJQUFJLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRTtBQUNsRCxvQkFBb0IsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUM3QixpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO0FBQ3hCLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN2QixZQUFZLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUNqQztBQUNBLFNBQVMsTUFBTSxJQUFJLENBQUMsR0FBRyxNQUFNLEVBQUU7QUFDL0IsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDO0FBQ3pCLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDbEUsWUFBWSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbkMsU0FBUztBQUNUO0FBQ0EsUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QyxRQUFRLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQztBQUM5QixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUNEO0FBQ0EsU0FBUyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUM1QyxJQUFJLE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFDRDtBQUNBLFNBQVMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFO0FBQ2xDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNsRCxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLE1BQU0sRUFBRTtBQUN0QyxZQUFZLElBQUksSUFBSSxFQUFFO0FBQ3RCLGdCQUFnQixJQUFJLENBQUMsR0FBRyxNQUFNLEVBQUU7QUFDaEMsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0QyxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLG9CQUFvQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDdEMsb0JBQW9CLElBQUksR0FBRyxDQUFDLENBQUM7QUFDN0Isb0JBQW9CLFNBQVM7QUFDN0IsaUJBQWlCLE1BQU07QUFDdkIsb0JBQW9CLENBQUMsR0FBRyxJQUFJLEdBQUcsTUFBTSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLE9BQU8sQ0FBQztBQUNuRSxvQkFBb0IsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNoQyxpQkFBaUI7QUFDakIsYUFBYSxNQUFNO0FBQ25CLGdCQUFnQixJQUFJLENBQUMsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDMUQsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0QyxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLG9CQUFvQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDdEMsaUJBQWlCLE1BQU07QUFDdkIsb0JBQW9CLElBQUksR0FBRyxDQUFDLENBQUM7QUFDN0IsaUJBQWlCO0FBQ2pCLGdCQUFnQixTQUFTO0FBQ3pCLGFBQWE7QUFDYixTQUFTLE1BQU0sSUFBSSxJQUFJLEVBQUU7QUFDekIsWUFBWSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDOUIsWUFBWSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDOUIsWUFBWSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDOUIsWUFBWSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFO0FBQ3RCLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLFNBQVMsTUFBTTtBQUNmLFlBQVksSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFO0FBQzNCLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQztBQUM3QyxhQUFhLE1BQU07QUFDbkIsZ0JBQWdCLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRTtBQUNqQyxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDakQsaUJBQWlCLE1BQU07QUFDdkIsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ2xELG9CQUFvQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDeEQsaUJBQWlCO0FBQ2pCLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDcEQsYUFBYTtBQUNiLFlBQVksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFDekMsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQTs7QUNqb0JBO0FBS0EsTUFBTWtKLFFBQU0sR0FBRyxDQUFDLENBQUM7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUyxjQUFjLENBQUMsR0FBRyxVQUFVLFNBQVMsc0VBQXNFLEdBQUcsWUFBWTtBQUNuSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQzFCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQ25CLFFBQVEsR0FBRyxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDbEQsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLFNBQVMsYUFBYSxDQUFDLEdBQUcsV0FBVyxTQUFTLHNFQUFzRSxHQUFHLFlBQVk7QUFDbkksSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7QUFDbkIsUUFBUSxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0YsUUFBUSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztBQUM5QixZQUFZLEVBQUU7QUFDZCxZQUFZLE1BQU0sRUFBRSxJQUFJLFVBQVUsQ0FBQztBQUNuQyxnQkFBZ0IsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEdBQUdBLFFBQU07QUFDekMsZ0JBQWdCLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxHQUFHQSxRQUFNO0FBQzNDLGFBQWEsRUFBRSxNQUFNLENBQUM7QUFDdEIsWUFBWSxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDO0FBQ3hELFNBQVMsQ0FBQyxDQUFDO0FBQ1gsS0FBSyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRTtBQUMxQixRQUFRLFNBQVMsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQy9DLEtBQUssTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7QUFDMUIsUUFBUSxTQUFTLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNoRCxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsU0FBUyxTQUFTLENBQUMsR0FBRyxVQUFVLEtBQUssVUFBVSxHQUFHLFlBQVk7QUFDOUQsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDL0MsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDdkQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDdkQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDeEQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDdkQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDdEQsU0FBUyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDekQsQ0FBQztBQUNEO0FBQ2UsU0FBUSxhQUFBLEVBQUUsSUFBSSxnR0FBZ0c7QUFDN0gsSUFBSSxPQUFPLElBQUlDLEdBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFDRDtBQUNPLE1BQU0sZ0JBQWdCLEdBQUdELFFBQU0sQ0FBQTs7QUMvQ3ZCLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRTtBQUN2QztBQUNBO0FBQ0EsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7QUFDakIsSUFBSSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDckI7QUFDQSxJQUFJLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFO0FBQzdCLFFBQVEsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QixRQUFRLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDN0U7QUFDQTtBQUNBLElBQUksTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQzlEO0FBQ0EsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDbEIsSUFBSSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDbkI7QUFDQSxJQUFJLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFO0FBQzdCO0FBQ0EsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDckQsWUFBWSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEM7QUFDQTtBQUNBLFlBQVksSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVM7QUFDN0Q7QUFD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QUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BHLFlBQVksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRyxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLFFBQVEsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7QUFDM0MsUUFBUSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7QUFDakQsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLENBQUMsTUFBTSw2QkFBNkIsU0FBUyxnQ0FBZ0MsSUFBSSxlQUFlO0FBQzdHLFFBQVEsS0FBSyxNQUFNLEVBQUUsSUFBSSxNQUFNLEVBQUU7QUFDakMsWUFBWSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMs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RUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0Y7QUFDQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdEMsWUFBWSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzlFLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxLQUFLLENBQUM7QUFDckIsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDN0QsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxRQUFRLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwRyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFB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UUFBUSxFQUFFO0FBQ3BELFlBQVksU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDcEUsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxJQUFJLFFBQVEsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDakQsSUFBSSxJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0FBQ3JDO0FBQ0EsSUFBSSxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUU7QUFDN0I7QUFDQSxRQUFRLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNyQztBQUNBO0FBQ0EsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDaEQsWUFBWSxRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQzVCLFlBQVksSUFBSSxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9HLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxTQUFTLEVBQUUsU0FBUztBQUN6RDtBQUNBO0FBQ0EsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkIsUUFBUSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDOUUsUUFBUSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDOUUsUUFBUSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDOUUsUUFBUSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDOUUsUUFBUSxTQUFTLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxLQUFLLEVBQUU7QUFDZixRQUFRLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hELFFBQVEsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BELEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUIsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUN6QixDQUFDO0FBQ0Q7QUFDQSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUU7QUFDaEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUlBLGFBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUM1QyxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFNBQVMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRTtBQUN4QyxJQUFJLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztBQUN2QixJQUFJLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQztBQUM3QjtBQUNBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0MsUUFBUSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEM7QUFDQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0FBQzFFLFlBQVksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFlBQVksTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCO0FBQ0EsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUN4RjtBQUNBLFlBQVksU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLG9CQUFvQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFDRDtBQUNBO0FBQ0EsU0FBUyxlQUFlLENBQUMsT0FBTyxFQUFFO0FBQ2xDLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZCxJQUFJLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0FBQ3hFLFFBQVEsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLFFBQVEsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLFFBQVEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0IsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdCLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsS0FBSztBQUNMLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3BELENBQUE7O0FDaElBO0FBbUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztBQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCO0FBQ08sU0FBUyxzQkFBc0IsQ0FBQyxNQUFNLGNBQWMsTUFBTSxzQ0FBc0M7QUFDdkc7QUFDQSxJQUFJLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxjQUFjLFlBQVksVUFBVTtBQUN4RSxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLFFBQVEsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDL0M7QUFDQSxRQUFRLE1BQU0sVUFBVSxHQUFHLFlBQVksR0FBRyxLQUFLLENBQUM7QUFDaEQsUUFBUSxRQUFRLE1BQU07QUFDdEIsUUFBUSxLQUFLLFdBQVcsQ0FBQztBQUN6QixRQUFRLEtBQUssVUFBVTtBQUN2QixZQUFZLENBQUMsR0FBRyxVQUFVLEdBQUcsY0FBYyxDQUFDO0FBQzVDLFlBQVksTUFBTTtBQUNsQixRQUFRLEtBQUssY0FBYyxDQUFDO0FBQzVCLFFBQVEsS0FBSyxhQUFhO0FBQzFCLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLGNBQWMsQ0FBQztBQUM3QyxZQUFZLE1BQU07QUFDbEIsUUFBUSxLQUFLLFFBQVE7QUFDckIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDO0FBQy9DLFlBQVksTUFBTTtBQUNsQixRQUFRLEtBQUssS0FBSztBQUNsQixZQUFZLENBQUMsR0FBRyxZQUFZLEdBQUcsY0FBYyxDQUFDO0FBQzlDLFlBQVksTUFBTTtBQUNsQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLFFBQVEsTUFBTTtBQUN0QixRQUFRLEtBQUssV0FBVyxDQUFDO0FBQ3pCLFFBQVEsS0FBSyxjQUFjO0FBQzNCLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBQzVCLFlBQVksTUFBTTtBQUNsQixRQUFRLEtBQUssVUFBVSxDQUFDO0FBQ3hCLFFBQVEsS0FBSyxhQUFhO0FBQzFCLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUMzQixZQUFZLE1BQU07QUFDbEIsUUFBUSxLQUFLLE1BQU07QUFDbkIsWUFBWSxDQUFDLEdBQUcsWUFBWSxDQUFDO0FBQzdCLFlBQVksTUFBTTtBQUNsQixRQUFRLEtBQUssT0FBTztBQUNwQixZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztBQUM5QixZQUFZLE1BQU07QUFDbEIsU0FBUztBQUNUO0FBQ0EsUUFBUSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxjQUFjLENBQUMsTUFBTSxjQUFjLE9BQU8sVUFBVSxPQUFPLFVBQVU7QUFDbEYsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QjtBQUNBLFFBQVEsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsUUFBUSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwQztBQUNBLFFBQVEsUUFBUSxNQUFNO0FBQ3RCLFFBQVEsS0FBSyxXQUFXLENBQUM7QUFDekIsUUFBUSxLQUFLLFVBQVUsQ0FBQztBQUN4QixRQUFRLEtBQUssS0FBSztBQUNsQixZQUFZLENBQUMsR0FBRyxPQUFPLEdBQUcsY0FBYyxDQUFDO0FBQ3pDLFlBQVksTUFBTTtBQUNsQixRQUFRLEtBQUssY0FBYyxDQUFDO0FBQzVCLFFBQVEsS0FBSyxhQUFhLENBQUM7QUFDM0IsUUFBUSxLQUFLLFFBQVE7QUFDckIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDO0FBQzFDLFlBQVksTUFBTTtBQUNsQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLFFBQVEsTUFBTTtBQUN0QixRQUFRLEtBQUssV0FBVyxDQUFDO0FBQ3pCLFFBQVEsS0FBSyxjQUFjLENBQUM7QUFDNUIsUUFBUSxLQUFLLE9BQU87QUFDcEIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7QUFDekIsWUFBWSxNQUFNO0FBQ2xCLFFBQVEsS0FBSyxVQUFVLENBQUM7QUFDeEIsUUFBUSxLQUFLLGFBQWEsQ0FBQztBQUMzQixRQUFRLEtBQUssTUFBTTtBQUNuQixZQUFZLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDeEIsWUFBWSxNQUFNO0FBQ2xCLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0QixLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssbUJBQW1CLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BJLENBQUM7QUFDRDtBQUNPLFNBQVMsbUJBQW1CLENBQUMsTUFBTTtBQUMxQyw2QkFBNkIsUUFBUTtBQUNyQyw2QkFBNkIsY0FBYztBQUMzQyw2QkFBNkIsUUFBUTtBQUNyQyw2QkFBNkIsY0FBYztBQUMzQyw2QkFBNkIsa0JBQWtCO0FBQy9DLDZCQUE2QixlQUFlO0FBQzVDLDZCQUE2QixTQUFTO0FBQ3RDLDZCQUE2QixRQUFRO0FBQ3JDLDZCQUE2QixVQUFVLGNBQWM7QUFDckQsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDMUI7QUFDQSxJQUFJLE1BQU0sUUFBUSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0FBQzlDLElBQUksTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQzlDLElBQUksTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDNUIsSUFBSSxNQUFNLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztBQUNuQztBQUNBLElBQUksTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDM0MsSUFBSSxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDO0FBQ2hGO0FBQ0EsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDckI7QUFDQSxJQUFJLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO0FBQ2xELFFBQVEsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQ3ZELFFBQVEsS0FBSyxDQUFDLGtCQUFrQixHQUFHO0FBQ25DLFlBQVksdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLENBQUM7QUFDL0csWUFBWSx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQztBQUMvRyxTQUFTLENBQUM7QUFDVixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO0FBQ2xELFFBQVEsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQ3ZELFFBQVEsS0FBSyxDQUFDLGtCQUFrQixHQUFHO0FBQ25DLFlBQVksdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLENBQUM7QUFDL0csWUFBWSx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQztBQUMvRyxTQUFTLENBQUM7QUFDVixLQUFLO0FBQ0w7QUFDQSxJQUFJLEtBQUssQ0FBQyxjQUFjLEdBQUcsdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDcEksSUFBSSxLQUFLLENBQUMsY0FBYyxHQUFHLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksb0JBQW9CLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3BJLElBQUksS0FBSyxDQUFDLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZIO0FBQ0EsSUFBSSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLEtBQUssS0FBSyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsS0FBSyxPQUFPLENBQUM7QUFDeEgsSUFBSSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzdDO0FBQ0EsSUFBSSxLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7QUFDM0MsUUFBUSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3RixRQUFRLE1BQU0sc0JBQXNCLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2pGLFFBQVEsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRixRQUFRLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDckY7QUFDQSxRQUFRLE1BQU0sc0JBQXNCLEdBQUc7QUFDdkMsWUFBWSxVQUFVLEVBQUUsRUFBRTtBQUMxQixZQUFZLFFBQVEsRUFBRSxTQUFTO0FBQy9CLFNBQVMsQ0FBQztBQUNWLFFBQVEsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztBQUNsQyxRQUFRLElBQUksVUFBVSxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEQsUUFBUSxJQUFJLElBQUksRUFBRTtBQUNsQixZQUFZLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwRCxZQUFZLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDeEcsWUFBWSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3hHLFlBQVksTUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3hGO0FBQ0EsWUFBWSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzFGLFlBQVksTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDMUU7QUFDQSxZQUFZLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtBQUNyQyxnQkFBZ0IsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZHO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBSSxZQUFZLEVBQUU7QUFDbEM7QUFDQTtBQUNBLG9CQUFvQixVQUFVLEdBQUcsc0JBQXNCLENBQUMsVUFBVSxFQUFFLENBQUMsWUFBWSxHQUFHLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7QUFDbEgsaUJBQWlCLE1BQU07QUFDdkIsb0JBQW9CLFVBQVUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDeEgsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBLFlBQVksSUFBSSxXQUFXLEdBQUcsYUFBYTtBQUMzQyxnQkFBZ0IsUUFBUTtBQUN4QixnQkFBZ0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM1RTtBQUNBLFlBQVksTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ25FLFlBQVksTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLEtBQUssT0FBTyxDQUFDO0FBQ2pFLFlBQVksTUFBTSxRQUFRLEdBQUcsZUFBZSxLQUFLLE9BQU87QUFDeEQsZ0JBQWdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsR0FBRyxNQUFNO0FBQ3RGLGdCQUFnQixDQUFDLENBQUM7QUFDbEI7QUFDQSxZQUFZLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxXQUFXLEtBQUs7QUFDaEUsZ0JBQWdCLElBQUksTUFBTSxDQUFDLHNCQUFzQixJQUFJLHlCQUF5QixDQUFDLGVBQWUsQ0FBQyxFQUFFO0FBQ2pHO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0IsQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVO0FBQzNKLGdFQUFnRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztBQUNoTSxpQkFBaUI7QUFDakIsYUFBYSxDQUFDO0FBQ2Q7QUFDQTtBQUNBLFlBQVksSUFBSSxDQUFDLGFBQWEsSUFBSSxrQkFBa0IsRUFBRTtBQUN0RCxnQkFBZ0IsTUFBTSxjQUFjLEdBQUcsV0FBVyxLQUFLLE1BQU07QUFDN0Qsb0JBQW9CLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbEM7QUFDQSxnQkFBZ0IsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO0FBQ3ZDLGdCQUFnQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRSxvQkFBb0IsTUFBTSxhQUFhLGdCQUFnQixjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekUsb0JBQW9CLElBQUksc0JBQXNCLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLFNBQVM7QUFDbkYsb0JBQW9CLElBQUksVUFBVSxFQUFFO0FBQ3BDO0FBQ0E7QUFDQSx3QkFBd0Isc0JBQXNCLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoSCxxQkFBcUIsTUFBTTtBQUMzQjtBQUNBO0FBQ0Esd0JBQXdCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUTtBQUMzSSxrREFBa0QsYUFBYSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixDQUFDLENBQUM7QUFDdkwsd0JBQXdCLElBQUksT0FBTyxFQUFFO0FBQ3JDLDRCQUE0QixzQkFBc0IsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3ZGLDRCQUE0QixVQUFVLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQzlFLHlCQUF5QjtBQUN6QixxQkFBcUI7QUFDckIsaUJBQWlCO0FBQ2pCO0FBQ0EsZ0JBQWdCLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25ELGFBQWEsTUFBTTtBQUNuQixnQkFBZ0IsSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFO0FBQzVDLG9CQUFvQixXQUFXLEdBQUcsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckUsaUJBQWlCO0FBQ2pCO0FBQ0EsZ0JBQWdCLElBQUksZ0JBQWdCLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUU7QUFDdkosb0JBQW9CLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0I7QUFDeEssNENBQTRDLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixDQUFDLENBQUM7QUFDaEosb0JBQW9CLElBQUksT0FBTyxFQUFFLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDMUYsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxnQkFBZ0IsMEJBQTBCLENBQUMsZUFBZSxLQUFLLE9BQU8sR0FBRyxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUM7QUFDL0YsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxVQUFVLENBQUM7QUFDdkIsUUFBUSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDOUIsUUFBUSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDL0MsWUFBWSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0RCxZQUFZLElBQUksS0FBSyxFQUFFO0FBQ3ZCLGdCQUFnQixVQUFVLEdBQUcsU0FBUztBQUN0QyxvQkFBb0IsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3JELG9CQUFvQixNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQztBQUM5RSxvQkFBb0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLGdCQUFnQixTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztBQUN0QyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUNuRCxvQkFBb0IsTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQ2hELGlCQUFpQixNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxLQUFLLENBQUMsR0FBRyxFQUFFO0FBQzFELG9CQUFvQixRQUFRLENBQUMscUVBQXFFLENBQUMsQ0FBQztBQUNwRyxpQkFBaUI7QUFDakIsZ0JBQWdCLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFO0FBQzVELG9CQUFvQixNQUFNLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztBQUNsRCxpQkFBaUIsTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUMxRSxvQkFBb0IsTUFBTSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDbEQsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0sVUFBVSxHQUFHLDJCQUEyQixDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxJQUFJLHNCQUFzQixDQUFDLFFBQVEsQ0FBQztBQUM3SCxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO0FBQ2pDLFlBQVksTUFBTSxDQUFDLFdBQVcsR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDN0UsU0FBUztBQUNULFFBQVEsSUFBSSxVQUFVLElBQUksVUFBVSxFQUFFO0FBQ3RDLFlBQVksVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDNUwsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxrQkFBa0IsRUFBRTtBQUM1QixRQUFRLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDakYsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBO0FBQ08sU0FBUyxzQkFBc0IsQ0FBQyxNQUFNLDRCQUE0QjtBQUN6RSxJQUFJLFFBQVEsTUFBTTtBQUNsQixJQUFJLEtBQUssT0FBTyxDQUFDO0FBQ2pCLElBQUksS0FBSyxXQUFXLENBQUM7QUFDckIsSUFBSSxLQUFLLGNBQWM7QUFDdkIsUUFBUSxPQUFPLE9BQU8sQ0FBQztBQUN2QixJQUFJLEtBQUssTUFBTSxDQUFDO0FBQ2hCLElBQUksS0FBSyxVQUFVLENBQUM7QUFDcEIsSUFBSSxLQUFLLGFBQWE7QUFDdEIsUUFBUSxPQUFPLE1BQU0sQ0FBQztBQUN0QixLQUFLO0FBQ0wsSUFBSSxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLDhCQUE4QixDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUU7QUFDdEUsSUFBSSxJQUFJLFdBQVcsR0FBRyxFQUFFLElBQUksZUFBZSxHQUFHLENBQUMsRUFBRTtBQUNqRCxRQUFRLGVBQWUsS0FBSyxDQUFDLENBQUM7QUFDOUIsS0FBSztBQUNMLElBQUksTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLEdBQUcsR0FBRyxlQUFlLENBQUMsQ0FBQztBQUM1RCxJQUFJLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFVBQVUsQ0FBQyxNQUFNO0FBQzFCLG9CQUFvQixPQUFPO0FBQzNCLG9CQUFvQixzQkFBc0I7QUFDMUMsb0JBQW9CLFVBQVU7QUFDOUIsb0JBQW9CLFFBQVE7QUFDNUIsb0JBQW9CLEtBQUs7QUFDekIsb0JBQW9CLGNBQWM7QUFDbEMsb0JBQW9CLGNBQWM7QUFDbEMsb0JBQW9CLFVBQVU7QUFDOUIsb0JBQW9CLFNBQVM7QUFDN0Isb0JBQW9CLGVBQWU7QUFDbkMsb0JBQW9CLFNBQVM7QUFDN0Isb0JBQW9CLFVBQVUsY0FBYztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN6RSxJQUFJLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtBQUNuQyxRQUFRLFdBQVcsR0FBRyxjQUFjLENBQUM7QUFDckMsS0FBSztBQUNMLElBQUksTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDM0MsSUFBSSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2xGLElBQUksTUFBTSxjQUFjLEdBQUcsMkJBQTJCLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLElBQUksc0JBQXNCLENBQUMsUUFBUSxDQUFDO0FBQzdILElBQUksTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDaEQ7QUFDQSxJQUFJLE1BQU0sU0FBUyxHQUFHLE1BQU07QUFDNUIsUUFBUSxTQUFTLEdBQUcsY0FBYyxHQUFHLFNBQVM7QUFDOUMsUUFBUSxlQUFlLEdBQUcsTUFBTSxDQUFDLGNBQWMsR0FBRyxXQUFXLEdBQUcsU0FBUztBQUN6RSxRQUFRLFlBQVksR0FBRyxNQUFNLENBQUMsY0FBYyxHQUFHLGNBQWM7QUFDN0QsUUFBUSxpQkFBaUIsR0FBRyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDO0FBQzFILFFBQVEsV0FBVyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsTUFBTSxDQUFDLGNBQWM7QUFDeEUsUUFBUSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxNQUFNLENBQUMsY0FBYztBQUN4RSxRQUFRLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzdELFFBQVEsYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsS0FBSyxLQUFLLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLE9BQU87QUFDckgsUUFBUSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEtBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEtBQUssT0FBTztBQUNySCxRQUFRLGVBQWUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDO0FBQ3hELFFBQVEsa0JBQWtCLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQ25EO0FBQ0EsSUFBSSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3BELElBQUksSUFBSSxvQkFBb0IsQ0FBQztBQUM3QjtBQUNBO0FBQ0EsSUFBSSxJQUFJLFVBQVUsSUFBSSxXQUFXLEtBQUssTUFBTSxFQUFFO0FBQzlDLFFBQVEsSUFBSSxNQUFNLENBQUMsc0JBQXNCLElBQUksc0JBQXNCLENBQUMsUUFBUSxFQUFFO0FBQzlFLFlBQVksb0JBQW9CLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsV0FBVztBQUN6RyxnQkFBZ0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM1RSxTQUFTO0FBQ1QsUUFBUSxJQUFJLGNBQWMsRUFBRTtBQUM1QixZQUFZLFVBQVUsR0FBRyxhQUFhLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxXQUFXO0FBQzlFLHVDQUF1QyxNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ25HLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFdBQVcsS0FBSztBQUM3RCxRQUFRLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsSUFBSSxNQUFNLEVBQUU7QUFDdEY7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxLQUFLLGdDQUFnQyxJQUFJLENBQUM7QUFDdEQsUUFBUSxJQUFJLE9BQU8sRUFBRTtBQUNyQixZQUFZLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDM0YsWUFBWSxLQUFLLEdBQUc7QUFDcEIsZ0JBQWdCLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDO0FBQ3pELGdCQUFnQixFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLGFBQWEsQ0FBQztBQUNkLFNBQVM7QUFDVDtBQUNBLFFBQVEsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ25JLFlBQVksTUFBTSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtBQUM3RSxZQUFZLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxVQUFVO0FBQ2hFLFlBQVksWUFBWSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsVUFBVTtBQUNoRSxZQUFZLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRSxLQUFLLENBQUM7QUFDTjtBQUNBLElBQUksSUFBSSxlQUFlLEtBQUssTUFBTSxFQUFFO0FBQ3BDLFFBQVEsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRTtBQUM3RSxZQUFZLE1BQU0sT0FBTyxHQUFHLFVBQVU7QUFDdEMsZ0JBQWdCLElBQUk7QUFDcEIsZ0JBQWdCLGlCQUFpQjtBQUNqQyxnQkFBZ0IsWUFBWTtBQUM1QixnQkFBZ0Isc0JBQXNCLENBQUMsUUFBUSxJQUFJLGNBQWM7QUFDakUsZ0JBQWdCLFVBQVU7QUFDMUIsZ0JBQWdCLFNBQVM7QUFDekIsZ0JBQWdCLGVBQWU7QUFDL0IsZ0JBQWdCLE1BQU0sQ0FBQyxXQUFXO0FBQ2xDLGdCQUFnQixNQUFNO0FBQ3RCLGFBQWEsQ0FBQztBQUNkLFlBQVksS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7QUFDMUMsZ0JBQWdCLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQztBQUNsRCxnQkFBZ0IsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxFQUFFO0FBQzNHLG9CQUFvQixpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9ELGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUssTUFBTSxJQUFJLGVBQWUsS0FBSyxhQUFhLEVBQUU7QUFDbEQ7QUFDQTtBQUNBLFFBQVEsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO0FBQzdDLFlBQVksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNqQyxnQkFBZ0IsTUFBTSxNQUFNLEdBQUcsZUFBZTtBQUM5QyxvQkFBb0IsSUFBSTtBQUN4QixvQkFBb0IsWUFBWTtBQUNoQyxvQkFBb0Isc0JBQXNCLENBQUMsUUFBUSxJQUFJLGNBQWM7QUFDckUsb0JBQW9CLFVBQVU7QUFDOUIsb0JBQW9CLFNBQVM7QUFDN0Isb0JBQW9CLGVBQWUsQ0FBQyxDQUFDO0FBQ3JDLGdCQUFnQixJQUFJLE1BQU0sRUFBRTtBQUM1QixvQkFBb0IsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMvRCxpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUMzQyxRQUFRLEtBQUssTUFBTSxPQUFPLElBQUlpTCxlQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNsRTtBQUNBLFlBQVksTUFBTSxHQUFHLEdBQUcseUJBQXlCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELFlBQVksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2hHLFNBQVM7QUFDVCxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTtBQUM5QztBQUNBLFFBQVEsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFO0FBQzdDLFlBQVksaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2xHLFNBQVM7QUFDVCxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtBQUN6QyxRQUFRLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRTtBQUMvQyxZQUFZLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO0FBQ3hDLGdCQUFnQixpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3JHLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sZUFBZSxHQUFHLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDO0FBRS9EO0FBQ0EsU0FBUyxlQUFlLENBQUMsTUFBTTtBQUMvQix5QkFBeUIsS0FBSztBQUM5Qix5QkFBeUIsVUFBVTtBQUNuQyx5QkFBeUIsVUFBVTtBQUNuQyx5QkFBeUIsUUFBUTtBQUNqQyx5QkFBeUIsS0FBSztBQUM5Qix5QkFBeUIsYUFBYTtBQUN0Qyx5QkFBeUIsT0FBTztBQUNoQyx5QkFBeUIsVUFBVTtBQUNuQyx5QkFBeUIsU0FBUztBQUNsQyx5QkFBeUIsV0FBVztBQUNwQyx5QkFBeUIsY0FBYztBQUN2Qyx5QkFBeUIsdUJBQXVCO0FBQ2hELHlCQUF5QixlQUFlO0FBQ3hDLHlCQUF5QixLQUFLO0FBQzlCLHlCQUF5QixlQUFlO0FBQ3hDLHlCQUF5QixTQUFTLG1CQUFtQjtBQUNyRCxJQUFJLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVU7QUFDdkUsNEJBQTRCLEtBQUssRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUNwRztBQUNBLElBQUksTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztBQUN6QyxJQUFJLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQztBQUM1QjtBQUNBLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUNwQyxRQUFRLFlBQVksR0FBRztBQUN2QixZQUFZLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQztBQUM3RixTQUFTLENBQUM7QUFDVixRQUFRLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsRUFBRTtBQUMvQyxZQUFZLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyw4QkFBOEIsRUFBRSxtQkFBbUIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7QUFDNUgsU0FBUztBQUNULEtBQUssTUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO0FBQzlDLFFBQVEsWUFBWSxHQUFHO0FBQ3ZCLFlBQVksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQztBQUMzRixZQUFZLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUM7QUFDM0YsU0FBUyxDQUFDO0FBQ1YsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxlQUFlLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsRUFBRTtBQUNwRixZQUFZLFFBQVEsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyw4QkFBOEIsRUFBRSxtQkFBbUIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7QUFDNUgsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBLElBQUksTUFBTSxDQUFDLFVBQVU7QUFDckIsUUFBUSxNQUFNLENBQUMsSUFBSTtBQUNuQixRQUFRLFVBQVU7QUFDbEIsUUFBUSxZQUFZO0FBQ3BCLFFBQVEsVUFBVTtBQUNsQixRQUFRLGFBQWE7QUFDckIsUUFBUSxPQUFPO0FBQ2YsUUFBUSxXQUFXO0FBQ25CLFFBQVEsS0FBSztBQUNiLFFBQVEsVUFBVTtBQUNsQixRQUFRLFNBQVMsQ0FBQyxjQUFjO0FBQ2hDLFFBQVEsU0FBUyxDQUFDLFVBQVU7QUFDNUIsUUFBUSxlQUFlO0FBQ3ZCLFFBQVEsZUFBZTtBQUN2QixRQUFRLFNBQVMsQ0FBQyxDQUFDO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLElBQUksS0FBSyxNQUFNLGFBQWEsSUFBSSxjQUFjLEVBQUU7QUFDaEQsUUFBUSx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDMUYsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFDRDtBQUNBLFNBQVMsMkJBQTJCLENBQUMsaUJBQWlCLCtDQUErQztBQUNyRztBQUNBO0FBQ0EsSUFBSSxLQUFLLE1BQU0sYUFBYSxTQUFTLGlCQUFpQixFQUFFO0FBQ3hELFFBQVEsT0FBTyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNoRCxLQUFLO0FBQ0wsSUFBSSxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBQ0Q7QUFDTyxTQUFTLDJCQUEyQixDQUFDLGlCQUFpQjtBQUM3RCxxQ0FBcUMsZUFBZTtBQUNwRCxxQ0FBcUMsVUFBVTtBQUMvQyxxQ0FBcUMsWUFBWTtBQUNqRCxxQ0FBcUMsZ0JBQWdCO0FBQ3JELHFDQUFxQyxXQUFXO0FBQ2hELHFDQUFxQyxNQUFNO0FBQzNDLHFDQUFxQyxPQUFPO0FBQzVDLHFDQUFxQyxNQUFNO0FBQzNDLHFDQUFxQyxVQUFVLDZCQUE2QjtBQUM1RSxJQUFJLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDeEIsSUFBSSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQzNCLElBQUksSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztBQUN6QixJQUFJLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDMUI7QUFDQSxJQUFJLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0FBQ3JELElBQUksSUFBSSxnQkFBZ0IsRUFBRTtBQUMxQixRQUFRLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxRQUFRLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxRQUFRLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxRQUFRLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksTUFBTSxFQUFFO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJakwsYUFBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyQyxRQUFRLE1BQU0sRUFBRSxHQUFHLElBQUlBLGFBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDckMsUUFBUSxNQUFNLEVBQUUsR0FBRyxJQUFJQSxhQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLFFBQVEsTUFBTSxFQUFFLEdBQUcsSUFBSUEsYUFBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyQztBQUNBLFFBQVEsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9DLFFBQVEsSUFBSSxZQUFZLEdBQUcsSUFBSUEsYUFBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzQztBQUNBLFFBQVEsSUFBSSxVQUFVLEVBQUU7QUFDeEIsWUFBWSxZQUFZLEdBQUcsSUFBSUEsYUFBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RELFFBQVEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDdEQsUUFBUSxFQUFFLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN0RCxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFF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QUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ25ELElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ25EO0FBQ0EsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRTtBQUM3QixRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQztBQUNBLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFDLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNEO0FBQ08sU0FBUyxr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QUMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2xEO0FBQ0EsSUFBSSxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3RELElBQUksTUFBTSxTQUFTLEdBQUcsRUFBRSxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDL0QsU0FBUyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDaEQsU0FBUyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUM7QUFDQSxJQUFJRixLQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM5QyxJQUFJQyxLQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM5QztBQUNBLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDMUMsQ0FBQztBQUNEO0FBQ08sU0FBUyxzQkFBc0IsQ0FBQyxFQUFFLHlEQUF5RDtBQUNsRyxJQUFJLE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLElBQUksTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDbEMsSUFBSSxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQztBQUN6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Q0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEQsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDOUMsUUFBUSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDN0MsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsR0FBRyxVQUFVLEdBQUcsMEJBQTBCO0FBQ3RELFFBQVEsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLFFBQVEsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsUUFBUSxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEM7QUFDQSxRQUFRLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRCxRQUFRLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzQyxRQUFRLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEQsUUFBUSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsS0FBSztBQUNMO0FBQ0EsSUFBSSxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCO0FBQzVDLFFBQVEsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLFFBQVEsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMzQixRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlELFFBQVEsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUN6QixZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6RCxTQUFTO0FBQ1QsUUFBUSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNoRCxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNqRDtBQUNBLFFBQVEsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JELFFBQVEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxD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RSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQ3JELFlBQVksRUFBRSxHQUFHLEtBQUssSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM5RSxZQUFZLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUM3RSxZQUFZLEtBQUssR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQzdCLFlBQVksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRSxZQUFZLE1BQU0sR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25DLFlBQVksTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQzlDLFlBQVksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssRUFBRSxNQUFNO0FBQy9DLFNBQVM7QUFDVDtBQUNBLFFBQVEsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUcsUUFBUSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFH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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLENBQUMsS0FBSyxzQkFBc0I7QUFDM0MsUUFBUSxLQUFLLENBQUMsS0FBSyxFQUFFMEcsWUFBVSxDQUFDLENBQUM7QUFDakMsS0FBSztBQUNMO0FBQ0EsSUFBSSxhQUFhLGtCQUFrQjtBQUNuQyxRQUFRLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxQixLQUFLO0FBQ0wsQ0FBQTs7QUN0QkE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QixJQUFJLE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDeEIsSUFBSSxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3hCO0FBQ0E7QUFDQSxJQUFJLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM5QyxJQUFJLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM5QyxJQUFJLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM5QyxJQUFJLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ3hEO0FBQ0EsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSztBQUM3QixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCO0FBQ0EsSUFBSSxNQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQzdCLElBQUksTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUM5QixJQUFJLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDOUIsSUFBSSxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQzlCLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssSUFBSSxNQUFNLENBQUM7QUFDdkU7QUFDQSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRztBQUMxQixRQUFRLE9BQU8sSUFBSSxDQUFDO0FBQ3BCO0FBQ0E7QUFDQSxJQUFJLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUM1QyxJQUFJLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUM1QyxJQUFJLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUM1QyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksTUFBTSxDQUFDO0FBQzFFO0FBQ0EsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHO0FBQzlCLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDcEI7QUFDQSxJQUFJLE9BQU8sQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssSUFBSSxNQUFNLENBQUM7QUFDOUQsQ0FBQztBQUNEO0FBQ0EsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDekIsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7QUFDbkcsSUFBSSxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQzdCLElBQUksTUFBTSxNQUFNLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUMzQyxJQUFJLE1BQU0sTUFBTSxHQUFHLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDM0M7QUFDQSxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQztBQUN2RCxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQztBQUN2RCxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQztBQUN2RCxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQztBQUN2RDtBQUNBLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNyQixJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckIsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNyQixDQUFDO0FBQ0Q7QUFDQTtBQUNBLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ2UsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLENBQUMsSUFBSSxXQUFXO0FBQy9CLFFBQVEsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDM0IsUUFBUSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUMzQixRQUFRLElBQUksQ0FB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QyxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDeEQsSUFBSSxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO0FBQ3JDO0FBQ0EsSUFBSSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEtBQUs7QUFDL0QsUUFBUSxNQUFNLE9BQU8sR0FBRyxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxRQUFRLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDOUIsUUFBUSxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUM5QyxRQUFRLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDOUIsUUFBUSxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUM5QztBQUNBLFFBQVEsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUM1QixRQUFRLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDNUIsUUFBUSxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQzVCLFFBQVEsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUM1QixLQUFLLENBQUM7QUFDTjtBQUNBO0FBQ0EsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN2QyxJQUFJLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUMzQjtBQUNBLElBQUksS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLFVBQVUsR0FBRyxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUU7QUFDNUQsUUFBUSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FB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QUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUU7QUFDQSxZQUFZLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLFlBQVksTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEUsWUFBWSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RSxZQUFZLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RFO0FBQ0EsWUFBWSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxRSxZQUFZLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFFLFlBQVksTUFBTSxjQUFjLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3hEO0FBQ0EsWUFBWSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUM1QyxZQUFZLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzVDO0FB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QUNBLFlBQVksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RFO0FBQ0EsWUFBWSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9EO0FBQ0EsWUFBWSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEUsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUQsUUFBUSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRSxRQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLFFBQVEsTUFBTSxDQUFDLElBQUks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QyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN0QyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN0QyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN0QyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNyQyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNoQyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNyQyxRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN4QyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNuQyxRQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN2QyxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNsQyxRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN4QyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxH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QUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzFGLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxFQUFFLENBQUM7QUFDZCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQ25DLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQ25DO0FBQ0EsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDM0MsUUFBUSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckMsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7QUFDL0IsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMxQixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0FBQ3RFLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FB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QUFZLFNBQVM7QUFDckIsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqRDtBQUNBLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUIsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUI7QUFDQSxRQUFRLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGO0FBQ0EsUUFBUSxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hDO0FBQ0EsUUFBUSxJQUFJLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFO0FBQ2hELFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QixZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQyxTQUFTO0FBQ1QsUUFBUSxJQUFJLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxFQUFFO0FBQ2hELFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUIsWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlCLFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNqQyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFBOztBQ3pDZSxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRTtBQUNqRSxJQUFJLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLElBQUksTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLElBQUksTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQjtBQUNBLElBQUksT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFO0FBQ3pCLFFBQVEsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLFFBQVEsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLFFBQVEsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ2pDO0FBQ0EsUUFBUSxJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksUUFBUSxFQUFFO0FBQ3RDLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRCxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEcsYUFBYTtBQUNiLFlBQVksU0FBUztBQUNyQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2pEO0FBQ0EsUUFBUSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLFFBQVEsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEM7QUFDQSxRQUFRLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVEO0FBQ0EsUUFBUSxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hDO0FBQ0EsUUFBUSxJQUFJLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDcEQsWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdCLFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUIsWUFBWSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2pDLFNBQVM7QUFDVCxRQUFRLElBQUksSUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNwRCxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlCLFlBQVksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QixZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFB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LENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzVDO0FBQ0EsUUFBUSxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDO0FBQzlELFFBQVEsSUFBSSxHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN2QztBQUNBLFFBQVEsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDN0I7QUFDQTtBQUNBLFFBQVEsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQzFCLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDaEQsWUFBWSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxTQUFTO0FBQzlDLFlBQVksUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RCxTQUFTO0FBQ1QsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDM0Y7QUFDQSxRQUFRLElBQUksR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pELFlBQVksTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDcEM7QUFDQTtBQUNBLFlBQVksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMs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QyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QixJQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQ3ZCLENBQUM7QUFDRDtBQUNBLFNBQVMsWUFBWSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtBQUN4RCxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNDLFFBQVEsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLFFBQVEsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzFELFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsU0FBUyxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3JCLElBQUksT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUN6QixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDckIsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQ3BFLElBQUksT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcs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QUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFO0FBQ3hFO0FBQ0EsSUFBSSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0IsSUFBSSxJQUFJLFNBQVMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLFVBQVUsR0FBRyxVQUFVLENBQUM7QUFDekQsSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3pCLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNqRCxRQUFRLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixRQUFRLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0IsUUFBUSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzdCLFFBQVEsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QixRQUFRLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0IsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDckMsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDckMsUUFBUSxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDM0I7QUFDQSxRQUFRLElBQUksWUFBWSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRjtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO0FBQ3BCO0FBQ0EsWUFBWSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7QUFDeEIsZ0JBQWdCLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6RCxnQkFBZ0IsSUFBSSxZQUFZLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNqRSxhQUFhO0FBQ2IsU0FBUyxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRTtBQUMzQjtBQUNBLFlBQVksSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO0FBQ3hCLGdCQUFnQixDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDekQsZ0JBQWdCLElBQUksWUFBWSxFQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDakUsYUFBYTtBQUNiLFNBQVMsTUFBTTtBQUNmLFlBQVksUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFO0FBQy9CO0FBQ0EsWUFBWSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDckQsWUFBWSxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQzFCLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFO0FBQy9CO0FBQ0EsWUFBWSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDckQsWUFBWSxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQzFCLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxDQUFDLFNBQVMsSUFBSSxNQUFNLEVBQUU7QUFDbEMsWUFBWSxJQUFJLFlBQVksRUFBRSxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzNELFlBQVksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQyxZQUFZLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLFlBQVksRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDO0FBQ3hDLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMvQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4QixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUM3QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN4RDtBQUNBO0FBQ0EsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDNUIsSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM5RixRQUFRLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO0FBQ3RCLFFBQVEsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFO0FBQ3hCLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ25CLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzNCLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQzdCLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ3pCLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUNEO0FBQ0EsU0FBUyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7QUFDM0QsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQyxRQUFRLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNuRSxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ2hDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0FBQzVDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNqQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLElBQUksT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBQ0Q7QUFDQSxTQUFTLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtBQUM1QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDakMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FB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QUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzlDLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzNCLFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzFEO0FBQ0EsUUFBUSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNwQyxRQUFRLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEMsUUFBUSxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3BDO0FBQ0EsUUFBUSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQy9DLFFBQVEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUMvQyxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDL0MsUUFBUSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQy9DLEtBQUs7QUFDTCxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLENBQUM7QUFDRDtBQUNBLFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRTtBQUN2RDtBQUNBLElBQUksSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVE7QUFDL0IsUUFBUSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUk7QUFD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Q0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9CLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkMsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3pCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6QztBQUNBLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBQ0Q7QUFDQSxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO0FBQ2pDLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDNUUsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLEtBQUs7QUFDTCxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7QUFDaEMsUUFBUSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUM1RCxZQUFZLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1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QUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2xGLFlBQVksSUFBSSxHQUFHLElBQUksQ0FBQztBQUN4QixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksS0FBSyxFQUFFO0FBQ25CLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25GLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25GLFlBQVksS0FBSyxHQUFHLElBQUksQ0FBQztBQUN6QixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25EO0FBQ0EsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsS0FBSztBQUNMLENBQUMsQ0FBQztBQUNGO0FBQ0EsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNqRCxJQUFJLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPO0FBQzlCLFFBQVEsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNO0FBQy9CLFFBQVEsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDOUI7QUFDQSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQ3JDO0FBQ0EsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDN0I7QUFDQSxJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNCLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU84UCxhQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqRTtBQUNBLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLEVB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QUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDMUUsUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzNFLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUMxRSxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDM0UsUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDbEQsUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDbEQsUUFBUSxPQUFPLElBQUksQ0FBQztBQUNwQixLQUFLO0FBQ0w7QUFDQSxJQUFJLFdBQVcsQ0FBQyxFQUFFLFVBQVUsS0FBSyxjQUFjO0FBQy9DLFFBQVEsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6QyxRQUFRaFIsY0FBTSxDQUFBLFFBQUEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN6QixRQUFRQSxjQUFNLENBQUEsUUFBQSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FB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QUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1QyxZQUFZLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3RDLFlBQVksTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDdEMsWUFBWSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM3QyxZQUFZLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDaEMsWUFBWSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0FBQ2pDO0FBQ0EsWUFBWU4sY0FBUyxDQUFBLFNBQUEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRjtBQUNBO0FBQ0EsWUFBWUEsd0JBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RixZQUFZQSx3QkFBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FB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QUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hILEtBQUs7QUFDTDtBQUNBLElBQUksUUFBUSxDQUFDLE1BQU0sNEJBQTRCO0FBQy9DLFFBQVEsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hELFFBQVEsTUFBTSxLQUFLLEdBQUc7QUFDdEIsWUFBWSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQy9SLGNBQWdCLENBQUEsZ0JBQUEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ2pGLFlBQVksSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUNDLGNBQWdCLENBQUEsZ0JBQUEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ2xGLFlBQVksSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUNELGNBQWdCLENBQUEsZ0JBQUEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ2hGLFlBQVksSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUNDLGNBQWdCLENBQUEsZ0JBQUEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDO0FBQ2pGLFNBQVMsQ0FBQztBQUNWLFFBQVEsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFL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LENBQUMsQ0FBQyxDQUFDO0FBQ25FLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsY0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNuRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsY0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUMvQyxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsY0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUNyRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsY0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNqRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsY0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNuRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsY0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNuRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsY0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtBQUMzRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsY0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNqRCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9FLFNBQVM7QUFDVCxRQUFRLElBQUksQ0FBQ0EsY0FBTyxDQUFBLFNBQUEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FB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VSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQzlELFFBQVEsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO0FBQy9ELFFBQVEsTUFBTSxRQUFRLEdBQUcsYUFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxhQUFhLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztBQUNoRztBQUNBLFFBQVEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDOUcsS0FBSztBQUNMLENBQUE7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLFNBQVMsQ0FBQztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxDQUFDLEtBQUssVUFBVSxNQUFNLFVBQVUsUUFBUSxVQUFVO0FBQ2xFLFFBQVEsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDNUMsUUFBUSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQztBQUN0RCxRQUFRLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUM7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LFNBQVMsbUJBQW1CLENBQUMsU0FBUyw2QkFBNkI7QUFDbkUsSUFBSSxNQUFNLFFBQVEsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSTBGLGNBQUFBLENBQUFBLHFCQUFpQixFQUFFLENBQUM7QUFDMUM7QUFDQSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDM0IsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDbEI7QUFDQTtBQUNBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxRQUFRLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUI7QUFDQSxRQUFRLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLFFBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxRQUFRLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLFFBQVEsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUMsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUE7O0FDMUtBO0FBU0EsTUFBTSxZQUFZLEdBQUdyTSxjQUFXLENBQUEsTUFBQSxFQUFFLENBQUM7QUFrQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxXQUFXLENBQUMsT0FBTyxXQUFXLFdBQVcsZUFBZSxLQUFLLG9CQUFvQixNQUFNLDJCQUEyQixlQUFlLHNDQUFzQztBQUNoTCxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxhQUFhLEVBQUUsT0FBTztBQUNyRDtBQUNBO0FBQ0EsSUFBSSxNQUFNLFdBQVcsR0FBRzBLLGNBQVcsQ0FBQSxXQUFBLENBQUMsUUFBUSxDQUFDO0FBQzdDLElBQUksTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7QUFDdkQsSUFBSSxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDdkU7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLGlCQUFpQixFQUFFO0FBQzNCLFFBQVEscUJBQXFCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVztBQUNqRSxZQUFZLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDO0FBQ3ZELFlBQVksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7QUFDcEQsWUFBWSxlQUFlO0FBQzNCLFNBQVMsQ0FBQztBQUNWLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzdELFFBQVEsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUs7QUFDbkUsWUFBWSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztBQUM3QyxZQUFZLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDO0FBQ3BELFlBQVksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUM7QUFDdkQsWUFBWSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztBQUNwRCxZQUFZLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO0FBQ2pELFlBQVksV0FBVyxFQUFFLFNBQVM7QUFDbEMsU0FBUyxDQUFDO0FBQ1YsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDN0QsUUFBUSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSTtBQUNsRSxZQUFZLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDO0FBQzdDLFlBQVksS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUM7QUFDcEQsWUFBWSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQztBQUN2RCxZQUFZLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDO0FBQ3BELFlBQVksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7QUFDakQsWUFBWSxXQUFXLEVBQUUsU0FBUztBQUNsQyxTQUFTLENBQUM7QUFDVixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRTtBQUM1QyxRQUFRLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztBQUNqRyxZQUFZLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUQsUUFBUSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUM7QUFDakcsWUFBWSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzdELEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLG9CQUFvQixDQUFDLFNBQVMsdUNBQXVDO0FBQzlFLElBQUksTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLElBQUksTUFBTSxVQUFVLEdBQUduTCxjQUFBQSxDQUFBQSxRQUFhLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDNUUsSUFBSW9JLHVCQUFXLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3hDO0FBQ0EsSUFBSSxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckMsSUFBSSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVCLElBQUl0SyxjQUFBQSxDQUFBQSxlQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDNUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLElBQUksY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsSUFBSWYsd0JBQWMsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDbkQ7QUFDQSxJQUFJLE9BQU8sY0FBYyxDQUFDO0FBQzFCLENBQUM7QUFDRDtBQUNBLFNBQVMsNEJBQTRCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxjQUFjLFNBQVM7QUFDM0csSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxHQUFHa00sY0FBa0IsQ0FBQSxrQkFBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hFLElBQUksTUFBTSxNQUFNLEdBQUcsRUFBRSxlQUFlLEdBQUcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3BELElBQUksTUFBTSxNQUFNLEdBQUcsRUFBRSxhQUFhLEdBQUcsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ25ELElBQUksTUFBTSxjQUFjLEdBQUdDLGNBQUFBLENBQUFBLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN0RSxJQUFJLE9BQU8sSUFBSTVWLGNBQUssQ0FBQSxhQUFBO0FBQ3BCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjO0FBQ2pFLFFBQVEsQ0FBQyxNQUFNLEdBQUcsU0FBUyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjO0FBQ2pFLEtBQUssQ0FBQztBQUNOLENBQUM7QUFDRDtBQUNBLFNBQVMscUJBQXFCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUU7QUFDeEgsSUFBSSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ2pDLElBQUksTUFBTSxhQUFhLEdBQUcsaUJBQWlCLEtBQUssS0FBSyxDQUFDO0FBQ3RELElBQUksTUFBTSxZQUFZLEdBQUcsY0FBYyxLQUFLLEtBQUssQ0FBQztBQUNsRDtBQUNBLElBQUksS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7QUFDaEMsUUFBUSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hELFFBQVEsTUFBTSxNQUFNLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDbEUsUUFBUSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRTtBQUMzRSxZQUFZLFNBQVM7QUFDckIsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQzdDLFFBQVEsTUFBTSxJQUFJLEdBQUdvTyxjQUE4QixDQUFBLG1CQUFBLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RSxRQUFRLE1BQU0sVUFBVSxHQUFHLDZCQUE2QixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDNUY7QUFDQSxRQUFRLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVFLFFBQVEsTUFBTSxnQkFBZ0IsR0FBR3FMLCtCQUFnRCxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUNqTSxRQUFRLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUssTUFBTSxLQUFLLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUN4RztBQUNBLFFBQVEsSUFBSSxJQUFJLEVBQUU7QUFDbEIsWUFBWSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDN0UsWUFBWSw4QkFBOEIsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUVDLGNBQVUsQ0FBQSxVQUFBO0FBQzNHLGtDQUFrQyxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUNuRyxTQUFTO0FBQ1QsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLFNBQVMsOEJBQThCLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFVBQVU7QUFDeEcsK0JBQStCLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRTtBQUN2RyxJQUFJLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7QUFDeEQsSUFBSSxNQUFNLDRCQUE0QixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUM7QUFDOUUsSUFBSSxNQUFNLDRCQUE0QixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUM7QUFDOUUsSUFBSSxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUNoQyxJQUFJLE1BQU0sVUFBVSxHQUFHLDZCQUE2QixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDL0YsSUFBSSxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO0FBQzFDLElBQUksTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMzSDtBQUNBLElBQUksNEJBQTRCLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDekMsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNuRCxRQUFRLE1BQU0sTUFBTSxRQUFRLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakQsUUFBUSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsc0JBQXNCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7QUFDM0YsUUFBUSxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsZUFBZSxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3ZJO0FBQ0EsUUFBUSxJQUFJLENBQUMsY0FBYyxFQUFFO0FBQzdCO0FBQ0E7QUFDQSxZQUFZQyxVQUEyQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztBQUN4RixTQUFTLE9BQU87QUFDaEIsWUFBWSxNQUFNLFVBQVUsR0FBRyxJQUFJM1osNEJBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNqRixZQUFZLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RyxZQUFZLE1BQU0sZUFBZSxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDbkgsWUFBWSxNQUFNLGlCQUFpQixHQUFHO0FBQ3RDLGdCQUFnQixNQUFNLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsWUFBWTtBQUNqRyxnQkFBZ0IsTUFBTSxDQUFDLGdCQUFnQixHQUFHLGVBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLFlBQVk7QUFDakcsZ0JBQWdCLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxZQUFZO0FBQ2pHLGFBQWEsQ0FBQztBQUNkO0FBQ0EsWUFBWSxNQUFNLGVBQWUsR0FBRzRaLGFBQThCLENBQUMsaUJBQWlCLEVBQUUsWUFBWSxHQUFHLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3BJLFlBQVksTUFBTSxnQkFBZ0IsR0FBR0MsbUJBQW9DLENBQUMsU0FBUyxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQ2pMLFlBQVksSUFBSSxjQUFjLEdBQUcsVUFBVSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLGdCQUFnQixHQUFHekUscUJBQU0sQ0FBQztBQUNsSSxZQUFZLElBQUksWUFBWSxFQUFFO0FBQzlCO0FBQ0EsZ0JBQWdCLGNBQWMsSUFBSSxNQUFNLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztBQUNwRSxhQUFhO0FBQ2I7QUFDQSxZQUFZLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLEdBQUcsY0FBYyxDQUFDO0FBQ2xGO0FBQ0EsWUFBWSxNQUFNLEtBQUssR0FBRyw0QkFBNEI7QUFDdEQsZ0JBQWdCLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLElBQUksYUFBYSxPQUFPO0FBQ3BDO0FBQ0EsWUFBWSxJQUFJLFlBQVksRUFBRTtBQUM5QixnQkFBZ0IsTUFBTSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hFLGdCQUFnQixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckk7QUFDQSxnQkFBZ0IsTUFBTSx3QkFBd0IsR0FBRztBQUNqRCxvQkFBb0IsQ0FBQyxHQUFHLGVBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLFlBQVk7QUFDL0Usb0JBQW9CLENBQUMsR0FBRyxlQUFlLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxZQUFZO0FBQy9FLG9CQUFvQixDQUFDLEdBQUcsZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsWUFBWTtBQUMvRSxpQkFBaUIsQ0FBQztBQUNsQjtBQUNBLGdCQUFnQixhQUFhLEdBQUd3RSxhQUE4QixDQUFDLHdCQUF3QixFQUFFLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ2pILGFBQWEsTUFBTTtBQUNuQixnQkFBZ0IsTUFBTSxZQUFZLEdBQUcsYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQzVGLGdCQUFnQixhQUFhLEdBQUcsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFILGFBQWE7QUFDYjtBQUNBLFlBQVksTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLElBQUksTUFBTSxDQUFDLGlCQUFpQixLQUFLNUUsY0FBVyxDQUFBLFdBQUEsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pJLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdkQsZ0JBQWdCRSxjQUFBQSxDQUFBQSxvQkFBb0IsQ0FBQyw0QkFBNEIsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNoSSxhQUFhO0FBQ2I7QUFDQSxZQUFZLElBQUksaUJBQWlCLElBQUksTUFBTSxDQUFDLG1CQUFtQixJQUFJLENBQUMsRUFBRTtBQUN0RSxnQkFBZ0IsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdEYsYUFBYTtBQUNiLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksaUJBQWlCLEVBQUU7QUFDM0IsUUFBUSw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUM3QyxRQUFRLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7QUFDMUQsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNyRCxZQUFZLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsWUFBWSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDbkMsZ0JBQWdCeUUsVUFBMkIsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLDRCQUE0QixDQUFDLENBQUM7QUFDaEcsYUFBYSxNQUFNO0FBQ25CLGdCQUFnQixNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxnQkFBZ0IsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUM1QixvQkFBb0JBLFVBQTJCLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO0FBQ3BHLGlCQUFpQixNQUFNO0FBQ3ZCLG9CQUFvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNuRSx3QkFBd0J6RSxjQUFvQixDQUFBLG9CQUFBLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hLLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVCxRQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLDRCQUE0QixDQUFDLENBQUM7QUFDdkYsS0FBSztBQUNMLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUNuRixDQUFDO0FBQ0Q7QUFDQSxTQUFTLG9CQUFvQixDQUFDLEtBQUssV0FBVyxNQUFNLFdBQVcsTUFBTSxnQkFBZ0I7QUFDckYsSUFBSSxJQUFJLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxFQUFFO0FBQ3RDLFFBQVEsT0FBTyxtQkFBbUIsQ0FBQztBQUNuQyxLQUFLLE1BQU0sSUFBSSxLQUFLLEVBQUU7QUFDdEIsUUFBUSxPQUFPLFdBQVcsQ0FBQztBQUMzQixLQUFLLE1BQU07QUFDWCxRQUFRLE9BQU8sWUFBWSxDQUFDO0FBQzVCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGVBQWU7QUFDakcsMEJBQTBCLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRTtBQUNsRyxJQUFJLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFDcEMsSUFBSSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQzFCLElBQUksTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNqQztBQUNBLElBQUksTUFBTSxhQUFhLEdBQUcsaUJBQWlCLEtBQUssS0FBSyxDQUFDO0FBQ3RELElBQUksTUFBTSxZQUFZLEdBQUcsY0FBYyxLQUFLLEtBQUssQ0FBQztBQUNsRCxJQUFJLE1BQU0sU0FBUyxHQUFHLGFBQWEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLE9BQU8sQ0FBQztBQUN4RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksTUFBTSxjQUFjLEdBQUcsYUFBYSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDO0FBQ3hFO0FBQ0EsSUFBSSxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDdkYsSUFBSSxJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUNsQztBQUNBLElBQUksTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRTBDLGNBQUFBLENBQUFBLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRSxJQUFJLE1BQU0sY0FBYyxHQUFHO0FBQzNCLFFBQVEzVywrQkFBZ0IsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUN2QyxRQUFRQywrQkFBZ0IsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztBQUN2QyxLQUFLLENBQUM7QUFDTixJQUFJLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUN2RSxJQUFJLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDO0FBQzdELElBQUksTUFBTSxlQUFlLGlDQUFpQyxFQUFFLENBQUM7QUFDN0Q7QUFDQSxJQUFJLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEM7QUFDQSxJQUFJLElBQUksYUFBYSxHQUFHLGdCQUFnQixDQUFDO0FBQ3pDLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxzQkFBc0IsS0FBSyxDQUFDLGFBQWEsRUFBRTtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsYUFBYSxHQUFHLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7QUFDaEMsUUFBUSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hELFFBQVEsTUFBTSxNQUFNLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDbEUsUUFBUSxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVM7QUFDOUI7QUFDQTtBQUNBLFFBQVEsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksaUJBQWlCLEVBQUU7QUFDeEUsWUFBWSxTQUFTO0FBQ3JCLFNBQVM7QUFDVCxRQUFRLE1BQU0sT0FBTyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDM0QsUUFBUSxJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTO0FBQ3hGLFFBQVEsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNqRjtBQUNBLFFBQVEsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDaEQ7QUFDQSxRQUFRLE1BQU0sUUFBUSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7QUFDNUUsUUFBUSxNQUFNLFdBQVcsR0FBRyxZQUFZLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7QUFDM0Q7QUFDQSxRQUFRLE1BQU0sSUFBSSxHQUFHa04sY0FBOEIsQ0FBQSxtQkFBQSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkU7QUFDQSxRQUFRLElBQUksT0FBTyxtQkFBbUI7QUFDdEMsUUFBUSxJQUFJLFdBQVcscUJBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25ELFFBQVEsSUFBSSxZQUFZLENBQUM7QUFDekIsUUFBUSxJQUFJLGtCQUFrQixDQUFDO0FBQy9CLFFBQVEsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDcEMsUUFBUSxJQUFJLHNCQUFzQixDQUFDO0FBQ25DLFFBQVEsSUFBSSxNQUFNLEVBQUU7QUFDcEIsWUFBWSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0FBQ2xELFlBQVksa0JBQWtCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUMzQyxZQUFZLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDO0FBQ2xELFlBQVksSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO0FBQ3BDLGdCQUFnQixXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztBQUMxRCxnQkFBZ0IsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0FBQzFELGdCQUFnQixNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxJQUFJLEtBQUssV0FBVyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO0FBQ3RHLGdCQUFnQixzQkFBc0IsR0FBRyxXQUFXLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksaUJBQWlCLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO0FBQzFKLGFBQWE7QUFDYixTQUFTLE1BQU07QUFDZixZQUFZLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQztBQUMzRyxZQUFZLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7QUFDbEQsWUFBWSxrQkFBa0IsR0FBRyxLQUFLLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksVUFBVSxJQUFJLFdBQVc7QUFDMUgsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNO0FBQ3pCLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDO0FBQzNCLFlBQVksT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7QUFDbEQsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQztBQUMzRSxRQUFRLE1BQU0sY0FBYyxHQUFHLHVCQUF1QixHQUFHLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztBQUMxRixRQUFRLE1BQU0sZUFBZSxJQUFJLHVCQUF1QixHQUFHNkQsY0FBQUEsQ0FBQUEseUJBQXlCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUNwRyxRQUFRLE1BQU0sVUFBVSxHQUFHLDZCQUE2QixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDNUY7QUFDQSxRQUFRLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM1RCxRQUFRLE1BQU0seUJBQXlCLEdBQUd3SCwrQkFBZ0QsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFMO0FBQ0EsUUFBUSxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksWUFBWSxJQUFJLFNBQVMsR0FBRzNFLGNBQVcsQ0FBQSxRQUFBLENBQUMzSCxxQkFBVyxFQUFFLEVBQUUseUJBQXlCLENBQUMsR0FBRyxZQUFZLENBQUM7QUFDeEosUUFBUSxNQUFNLGFBQWEsR0FBRzJNLGdCQUFpQyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0o7QUFDQSxRQUFRLE1BQU0sa0JBQWtCLEdBQUcsaUJBQWlCLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzdFLFFBQVEsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsS0FBSyxNQUFNO0FBQzlFLFlBQVksa0JBQWtCO0FBQzlCLFlBQVksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2pDO0FBQ0EsUUFBUSxJQUFJLFNBQVMsRUFBRTtBQUN2QixZQUFZLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7QUFDM0MsWUFBWSxNQUFNLFlBQVksR0FBRyxTQUFTLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxSixZQUFZLE1BQU0seUJBQXlCLEdBQUdDLCtCQUFnRCxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUw7QUFDQSxZQUFZQyxnQkFBaUMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUseUJBQXlCLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzdLLFNBQVM7QUFDVDtBQUNBLFFBQVEsTUFBTSx3QkFBd0IsR0FBRyxTQUFTLEtBQUssTUFBTSxJQUFJLGlCQUFpQixDQUFDLElBQUksaUJBQWlCLENBQUM7QUFDekcsUUFBUSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDaEcsUUFBUSxNQUFNLGlCQUFpQixHQUFHLHdCQUF3QixHQUFHLFlBQVksR0FBRyx5QkFBeUIsQ0FBQztBQUN0RyxRQUFRLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDakgsUUFBUSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM1RjtBQUNBLFFBQVEsTUFBTSxXQUFXLElBQUksRUFBRSxNQUFNLENBQUM7QUFDdEMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksWUFBWSxFQUFFO0FBQzdDLFlBQVksV0FBVyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQ3ZELFNBQVM7QUFDVCxRQUFRLElBQUksdUJBQXVCLEVBQUU7QUFDckMsWUFBWSxXQUFXLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDdEQsU0FBUztBQUNULFFBQVEsSUFBSSx3QkFBd0IsRUFBRTtBQUN0QyxZQUFZLFdBQVcsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUMxRCxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0sT0FBTyxHQUFHLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JIO0FBQ0EsUUFBUSxJQUFJLGFBQWEsQ0FBQztBQUMxQixRQUFRLElBQUksS0FBSyxFQUFFO0FBQ25CLFlBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7QUFDckMsZ0JBQWdCLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE9BQU87QUFDakgsb0JBQW9CLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztBQUNqTCxhQUFhLE1BQU07QUFDbkIsZ0JBQWdCLGFBQWEsR0FBRyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE9BQU87QUFDekgsb0JBQW9CLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0FBQ2hMLGFBQWE7QUFDYixTQUFTLE1BQU07QUFDZixZQUFZLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNO0FBQ3RILGdCQUFnQixpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0FBQy9KLFNBQVM7QUFDVDtBQUNBLFFBQVEsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzNIO0FBQ0EsUUFBUSxNQUFNLEtBQUssR0FBRztBQUN0QixZQUFZLE9BQU87QUFDbkIsWUFBWSxPQUFPO0FBQ25CLFlBQVksYUFBYTtBQUN6QixZQUFZLFlBQVk7QUFDeEIsWUFBWSxnQkFBZ0I7QUFDNUIsWUFBWSxrQkFBa0I7QUFDOUIsWUFBWSxzQkFBc0I7QUFDbEMsWUFBWSxLQUFLO0FBQ2pCLFlBQVksT0FBTztBQUNuQixZQUFZLElBQUk7QUFDaEIsWUFBWSxtQkFBbUI7QUFDL0IsU0FBUyxDQUFDO0FBQ1Y7QUFDQSxRQUFRLElBQUksVUFBVSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7QUFDN0MsWUFBWSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDckMsWUFBWSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3ZELFlBQVksS0FBSyxNQUFNLE9BQU8sSUFBSSxXQUFXLEVBQUU7QUFDL0MsZ0JBQWdCLGVBQWUsQ0FBQyxJQUFJLENBQUM7QUFDckMsb0JBQW9CLFFBQVEsRUFBRSxJQUFJbEcsY0FBQUEsQ0FBQUEsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUQsb0JBQW9CLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxlQUFlO0FBQzdELG9CQUFvQixLQUFLO0FBQ3pCLGlCQUFpQixDQUFDLENBQUM7QUFDbkIsYUFBYTtBQUNiLFNBQVMsTUFBTTtBQUNmLFlBQVksZUFBZSxDQUFDLElBQUksQ0FBQztBQUNqQyxnQkFBZ0IsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO0FBQzFDLGdCQUFnQixPQUFPLEVBQUUsQ0FBQztBQUMxQixnQkFBZ0IsS0FBSztBQUNyQixhQUFhLENBQUMsQ0FBQztBQUNmLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksaUJBQWlCLEVBQUU7QUFDM0IsUUFBUSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM5RCxLQUFLO0FBQ0w7QUFDQSxJQUFJLEtBQUssTUFBTSxZQUFZLElBQUksZUFBZSxFQUFFO0FBQ2hELFFBQVEsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztBQUN6QyxRQUFRLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtBQUM3QixZQUFZLE1BQU0sT0FBTyxHQUFHO0FBQzVCLGdCQUFnQixvQkFBb0IsRUFBRSxDQUFDLGlCQUFpQjtBQUN4RCxnQkFBZ0IsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQjtBQUM5RCxhQUFhLENBQUM7QUFDZCxZQUFZLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25GLFNBQVM7QUFDVCxRQUFRLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvQyxRQUFRLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDNUUsUUFBUSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtBQUNwQyxZQUFZLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuRCxZQUFZLElBQUksS0FBSyxDQUFDLGdCQUFnQixFQUFFO0FBQ3hDLGdCQUFnQixLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDNUYsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO0FBQ3pCLFlBQVksTUFBTSxhQUFhLEtBQUssS0FBSyxDQUFDLGFBQWEsNkNBQTZDLENBQUM7QUFDckcsWUFBWSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7QUFDL0IsZ0JBQWdCLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0MsZ0JBQWdCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDMUosYUFBYTtBQUNiLFlBQVksYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQyxTQUFTO0FBQ1QsUUFBUSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN4SixLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsU0FBUyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRTtBQUMxSCxJQUFJLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFDcEMsSUFBSSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQzFCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRWdFLGNBQUFBLENBQUFBLFlBQVksQ0FBQyxRQUFRO0FBQ2hHLFFBQVEsYUFBYSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtBQUMzRCxRQUFRLE9BQU8sQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLO0FBQ2xELFFBQVEsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0FBQzNFLFFBQVEsT0FBTyxDQUFDLHlCQUF5QixFQUFFLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUN0RyxDQUFBOztBQzFlQTtBQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxXQUFXLENBQUMsT0FBTyxXQUFXLFdBQVcsZUFBZSxLQUFLLG9CQUFvQixNQUFNLDJCQUEyQjtBQUMzSCxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxhQUFhLEVBQUUsT0FBTztBQUNyRDtBQUNBLElBQUksTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN0RCxJQUFJLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFDL0QsSUFBSSxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ25FLElBQUksTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDOUY7QUFDQSxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUMvRyxRQUFRLE9BQU87QUFDZixLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFDcEMsSUFBSSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQzFCLElBQUksTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNqQztBQUNBLElBQUksTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRUYsY0FBQUEsQ0FBQUEsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFFO0FBQ0E7QUFDQSxJQUFJLE1BQU0sV0FBVyxHQUFHQyxjQUFXLENBQUEsV0FBQSxDQUFDLFFBQVEsQ0FBQztBQUM3QyxJQUFJLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0FBQ3ZELElBQUksTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDN0QsSUFBSSxNQUFNLGNBQWMsR0FBRyxDQUFDNVcsK0JBQWdCLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRUMsY0FBQUEsQ0FBQUEsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlGO0FBQ0EsSUFBSSxNQUFNLG9CQUFvQixtQ0FBbUMsRUFBRSxDQUFDO0FBQ3BFO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM1QyxRQUFRLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQztBQUNBLFFBQVEsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRCxRQUFRLE1BQU0sTUFBTSxzQkFBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ3RFLFFBQVEsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTO0FBQy9FO0FBQ0EsUUFBUSxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hGLFFBQVEsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekQsUUFBUSxJQUFJLGlCQUFpQixFQUFFO0FBQy9CLFlBQVksYUFBYSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3hELFNBQVM7QUFDVCxRQUFRLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLG9CQUFvQixJQUFJLGFBQWEsOEJBQThCLENBQUM7QUFDekgsUUFBUSxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztBQUM3RCxRQUFRLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDO0FBQ2pFLFFBQVEsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztBQUMvQyxRQUFRLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNuRixRQUFRLE1BQU0sYUFBYSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUc7QUFDQSxRQUFRLE1BQU0sS0FBSyxvQkFBb0I7QUFDdkMsWUFBWSxvQkFBb0I7QUFDaEMsWUFBWSxPQUFPO0FBQ25CLFlBQVksa0JBQWtCO0FBQzlCLFlBQVksb0JBQW9CO0FBQ2hDLFlBQVksV0FBVztBQUN2QixZQUFZLGFBQWE7QUFDekIsWUFBWSxJQUFJO0FBQ2hCLFNBQVMsQ0FBQztBQUNWO0FBQ0EsUUFBUSxJQUFJLGlCQUFpQixFQUFFO0FBQy9CLFlBQVksTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN0RCxZQUFZLEtBQUssTUFBTSxPQUFPLElBQUksV0FBVyxFQUFFO0FBQy9DLGdCQUFnQixvQkFBb0IsQ0FBQyxJQUFJLENBQUM7QUFDMUMsb0JBQW9CLFFBQVEsRUFBRSxJQUFJNFMsY0FBQUEsQ0FBQUEsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUQsb0JBQW9CLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxlQUFlO0FBQzdELG9CQUFvQixLQUFLO0FBQ3pCLGlCQUFpQixDQUFDLENBQUM7QUFDbkIsYUFBYTtBQUNiLFNBQVMsTUFBTTtBQUNmLFlBQVksb0JBQW9CLENBQUMsSUFBSSxDQUFDO0FBQ3RDLGdCQUFnQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7QUFDekMsZ0JBQWdCLE9BQU8sRUFBRSxDQUFDO0FBQzFCLGdCQUFnQixLQUFLO0FBQ3JCLGFBQWEsQ0FBQyxDQUFDO0FBQ2YsU0FBUztBQUNUO0FBQ0EsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLGlCQUFpQixFQUFFO0FBQzNCLFFBQVEsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNuRSxLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sY0FBYyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3RFO0FBQ0EsSUFBSSxLQUFLLE1BQU0sYUFBYSxJQUFJLG9CQUFvQixFQUFFO0FBQ3RELFFBQVEsTUFBTSxDQUFDLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7QUFDaEosUUFBUSxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO0FBQ2hEO0FBQ0EsUUFBUSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQy9GO0FBQ0EsUUFBUSxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDaEY7QUFDQSxRQUFRLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUVnRSxjQUFBQSxDQUFBQSxZQUFZLENBQUMsUUFBUTtBQUNwRyxZQUFZLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRTtBQUNuQyxZQUFZLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxRQUFRO0FBQ3JELFlBQVksS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLG9CQUFvQjtBQUN0RCxZQUFZLGlCQUFpQixHQUFHLG9CQUFvQixHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzdELEtBQUs7QUFDTCxDQUFBOztBQ3ZJQTtBQXFCQTtBQUNBLFNBQVMsV0FBVyxDQUFDLE9BQU8sV0FBVyxXQUFXLGVBQWUsS0FBSyxxQkFBcUIsTUFBTSwyQkFBMkI7QUFDNUgsSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQ2xELFFBQVEsT0FBTztBQUNmLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLFdBQVcsRUFBRTtBQUM1QyxRQUFRLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFDeEMsUUFBUSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLFFBQVEsTUFBTSxXQUFXLEdBQUdELGNBQVcsQ0FBQSxXQUFBLENBQUMsUUFBUSxDQUFDO0FBQ2pEO0FBQ0EsUUFBUSxNQUFNLFNBQVMsR0FBRyxJQUFJYSxjQUFTLENBQUEsU0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUVLLGNBQUFBLENBQUFBLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHLFFBQVEsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssT0FBTyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDN0Y7QUFDQSxRQUFRLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3BFO0FBQ0EsUUFBUSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFQSxjQUFBQSxDQUFBQSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNsRDtBQUNBLFFBQVEsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNyQztBQUNBLFFBQVEsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDakU7QUFDQSxRQUFRLE1BQU0sYUFBYSxHQUFHLGlCQUFpQixHQUFHLENBQUMsdUJBQXVCLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDbkYsUUFBUSxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsR0FBR2pCLGNBQUFBLENBQUFBLFlBQVksQ0FBQyxRQUFRLEdBQUdBLGNBQUFBLENBQUFBLFlBQVksQ0FBQyxRQUFRLENBQUM7QUFDM0Y7QUFDQSxRQUFRLE1BQU0sY0FBYyxHQUFHLENBQUM3VywrQkFBZ0IsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFQyxjQUFBQSxDQUFBQSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEc7QUFDQSxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2hELFlBQVksTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTO0FBQ2pFO0FBQ0EsWUFBWSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3BELFlBQVksTUFBTSxNQUFNLG9CQUFvQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDeEUsWUFBWSxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVM7QUFDbkY7QUFDQSxZQUFZLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDcEYsWUFBWSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUMvRixZQUFZLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQzdDLFlBQVksSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25GO0FBQ0EsWUFBWSxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUM5RTtBQUNBLFlBQVksTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZGO0FBQ0EsWUFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFMFcsY0FBQUEsQ0FBQUEsU0FBUyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFFBQVE7QUFDcEcsZ0JBQWdCLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxLQUFLO0FBQ25ELG9CQUFvQixJQUFJLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUNoRyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLFdBQVc7QUFDdkUsZ0JBQWdCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUk7QUFDcEUsZ0JBQWdCLG9CQUFvQjtBQUNwQyxnQkFBZ0IsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3hFLFNBQVM7QUFDVDtBQUNBLFFBQVEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDcEU7QUFDQSxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLGFBQWEsRUFBRTtBQUNyRCxRQUFRLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7QUFDdkUsUUFBUSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDM0MsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLFNBQVMsZUFBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtBQUMzRCxJQUFJLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDMUIsSUFBSSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUMxQyxJQUFJLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQzVDO0FBQ0EsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDM0MsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDaEQ7QUFDQSxJQUFJLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7QUFDL0I7QUFDQSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxLQUFLLEtBQUssS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRTtBQUN6RSxRQUFRLElBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7QUFDbkM7QUFDQSxRQUFRLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUMzQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMvQyxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUM3RSxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUM3RSxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFFLFFBQVEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDMUU7QUFDQSxRQUFRLEdBQUcsR0FBRyxLQUFLLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2pGO0FBQ0EsUUFBUSx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2hGO0FBQ0EsS0FBSyxNQUFNO0FBQ1gsUUFBUSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLFFBQVEsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3JELEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQ2pGLElBQUksTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUMxQjtBQUNBO0FBQ0EsSUFBSSxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsMkJBQTJCLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO0FBQy9ILElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlGLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFO0FBQzVDLElBQUksTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUNwQyxJQUFJLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7QUFDakMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU87QUFDckIsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDM0MsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzdEO0FBQ0EsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDM0MsSUFBSSxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztBQUNsRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtBQUMzQixRQUFRLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJeEcsY0FBTyxDQUFBLE9BQUEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkcsS0FBSztBQUNMLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ3ZEO0FBQ0EsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsU0FBUztBQUNuRSxRQUFRd0csY0FBUyxDQUFBLFNBQUEsQ0FBQyxRQUFRLEVBQUVDLDBCQUFXLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxFQUFFQyxjQUFBQSxDQUFBQSxZQUFZLENBQUMsUUFBUTtBQUN6RyxRQUFRLDJCQUEyQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6RCxRQUFRLEtBQUssQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsdUJBQXVCO0FBQ3pFLFFBQVEsT0FBTyxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RSxDQUFBOztBQ3hKQTtBQXNCQTtBQUNlLFNBQVMsUUFBUSxDQUFDLE9BQU8sV0FBVyxXQUFXLGVBQWUsS0FBSyxrQkFBa0IsTUFBTSwyQkFBMkI7QUFDckksSUFBSSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssYUFBYSxFQUFFLE9BQU87QUFDckQ7QUFDQSxJQUFJLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3BELElBQUksTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDaEQsSUFBSSxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU87QUFDekU7QUFDQSxJQUFJLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUVGLGNBQUFBLENBQUFBLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRSxJQUFJLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0FBQ3ZELElBQUksTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLElBQUksR0FBRyxHQUFHNVUsY0FBTyxDQUFBLFFBQUEsQ0FBQyxnQkFBZ0IsQ0FBQztBQUNoSDtBQUNBLElBQUksTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2hFLElBQUksTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDO0FBQzdELElBQUksTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDckQsSUFBSSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUM1RCxJQUFJLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUM7QUFDdkQ7QUFDQSxJQUFJLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3RELElBQUksTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUM7QUFDckQ7QUFDQSxJQUFJLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxhQUFhLEdBQUcsTUFBTSxDQUFDO0FBQ3JEO0FBQ0EsSUFBSSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQ3BDLElBQUksTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUMxQjtBQUNBLElBQUksTUFBTSxhQUFhLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbkQsSUFBSSxJQUFJLHdCQUF3QixHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUN2RixJQUFJLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLDRCQUE0QixFQUFFLEVBQUU7QUFDM0UsUUFBUSx3QkFBd0IsR0FBRyxLQUFLLENBQUM7QUFDekMsS0FBSztBQUNMO0FBQ0EsSUFBSSxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtBQUNoQyxRQUFRLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEQsUUFBUSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxTQUFTO0FBQ3REO0FBQ0EsUUFBUSxNQUFNLE1BQU0saUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztBQUNqRSxRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUztBQUM5QixRQUFRLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztBQUNsQztBQUNBLFFBQVEsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoRixRQUFRLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLG9CQUFvQixJQUFJLGFBQWEsOEJBQThCLENBQUM7QUFDMUg7QUFDQSxRQUFRLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakUsUUFBUSxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO0FBQ2hELFlBQVksTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUMxQyxZQUFZLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDaEYsWUFBWSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ3BGLFlBQVksSUFBSSxLQUFLLElBQUksT0FBTyxFQUFFLG9CQUFvQixDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoRSxRQUFRLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxPQUFPLENBQUM7QUFDaEU7QUFDQSxRQUFRLElBQUksQ0FBQyxLQUFLLElBQUksWUFBWSxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO0FBQ3JFLFlBQVksTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUN6QyxZQUFZLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN0RSxZQUFZLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMxRSxZQUFZLElBQUksS0FBSyxJQUFJLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkcsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQUksV0FBVyxLQUFLLE9BQU8sSUFBSSxXQUFXLEtBQUssUUFBUSxFQUFFO0FBQ2pFO0FBQ0EsWUFBWSxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFDeEM7QUFDQSxZQUFZLElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRTtBQUN2QyxnQkFBZ0IsSUFBSSxTQUFTLEtBQUssR0FBRyxFQUFFO0FBQ3ZDLG9CQUFvQixTQUFTLElBQUksZUFBZSxDQUFDO0FBQ2pELGlCQUFpQjtBQUNqQixnQkFBZ0IsSUFBSSxPQUFPLEtBQUssR0FBRyxFQUFFO0FBQ3JDLG9CQUFvQixPQUFPLElBQUksZUFBZSxDQUFDO0FBQy9DLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQ2pFLFFBQVEsTUFBTSxhQUFhLEdBQUcsS0FBSztBQUNuQyxZQUFZLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDO0FBQ3pGLFlBQVksaUJBQWlCLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUN2STtBQUNBLFFBQVEsSUFBSSxRQUFRLEVBQUU7QUFDdEIsWUFBWSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3RCxZQUFZLElBQUksZUFBZSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7QUFDeEQsWUFBWSxJQUFJLEtBQUssQ0FBQyxlQUFlLEtBQUssYUFBYSxDQUFDLE9BQU8sRUFBRTtBQUNqRSxnQkFBZ0IsSUFBSSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7QUFDNUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRTtBQUMzQyxvQkFBb0IsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQztBQUMxRSxvQkFBb0IsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxhQUFhO0FBQ2pGLHdCQUF3QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVGLG9CQUFvQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsYUFBYSxHQUFHaEMscUJBQU0sQ0FBQztBQUNyRTtBQUNBLG9CQUFvQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUNsRDtBQUNBLG9CQUFvQixNQUFNLGtCQUFrQixHQUFHLFVBQVUsR0FBRyxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNqRyxvQkFBb0IsaUJBQWlCLEdBQUc4UixjQUFLLENBQUEsS0FBQSxDQUFDbUgsNkJBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDL0csaUJBQWlCO0FBQ2pCLGdCQUFnQixhQUFhLENBQUMsUUFBUSxHQUFHQyw4QkFBZSxDQUFDO0FBQ3pELG9CQUFvQixVQUFVLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixFQUFFO0FBQzFELG9CQUFvQixhQUFhLEVBQUUsY0FBYztBQUNqRCxvQkFBb0IsVUFBVSxFQUFFLGlCQUFpQjtBQUNqRCxvQkFBb0IsS0FBSyxFQUFFLGFBQWEsQ0FBQyxRQUFRLElBQUksU0FBUztBQUM5RCxvQkFBb0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxjQUFjO0FBQ2hELGlCQUFpQixDQUFDLENBQUM7QUFDbkIsZ0JBQWdCLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRTtBQUMzQyxvQkFBb0IsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3pFLGlCQUFpQixNQUFNO0FBQ3ZCLG9CQUFvQixhQUFhLENBQUMsT0FBTyxHQUFHLElBQUk5SSxzQkFBTyxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsRyxpQkFBaUI7QUFDakIsZ0JBQWdCLGFBQWEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQztBQUM5RCxnQkFBZ0IsZUFBZSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7QUFDeEQsYUFBYTtBQUNiLFlBQVksT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ25ELFlBQVksZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDbkcsU0FBUztBQUNULFFBQVEsSUFBSSxTQUFTLEVBQUU7QUFDdkIsWUFBWSxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkQsWUFBWSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzdELFlBQVksb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0QsU0FBUztBQUNULFFBQVEsSUFBSSxLQUFLLEVBQUU7QUFDbkIsWUFBWSxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkQsWUFBWSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ3JFLFlBQVksb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0QsU0FBUztBQUNUO0FBQ0EsUUFBUSxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUMxRTtBQUNBLFFBQVEsTUFBTSxVQUFVLEdBQUcsQ0FBQyxXQUFXLEtBQUs7QUFDNUMsWUFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVM7QUFDekQsZ0JBQWdCLFdBQVcsRUFBRSxTQUFTLEVBQUUwRywyQkFBWSxDQUFDLFFBQVEsRUFBRSxhQUFhO0FBQzVFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxRQUFRO0FBQ3hGLGdCQUFnQixLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ3ZHLFNBQVMsQ0FBQztBQUNWO0FBQ0EsUUFBUSxJQUFJLHdCQUF3QixFQUFFO0FBQ3RDLFlBQVksTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUN4RTtBQUNBO0FBQ0E7QUFDQSxZQUFZLElBQUksU0FBUyxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO0FBQ3BELGdCQUFnQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUMsYUFBYTtBQUNiLFlBQVksTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksYUFBYSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdELFlBQVksVUFBVSxDQUFDLElBQUlELGNBQVcsQ0FBQSxXQUFBLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ25HLFlBQVksYUFBYSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzdELFlBQVksVUFBVSxDQUFDLElBQUlBLGNBQVcsQ0FBQSxXQUFBLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2pHLFNBQVMsTUFBTTtBQUNmLFlBQVksVUFBVSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzlELFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSSx3QkFBd0IsRUFBRTtBQUNsQyxRQUFRLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0FBQzVDLFFBQVEsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDN0QsS0FBSztBQUNMLENBQUE7O0FDbk1BO0FBbUJBO0FBQ0EsU0FBUyxRQUFRLENBQUMsT0FBTyxXQUFXLFdBQVcsZUFBZSxLQUFLLGtCQUFrQixNQUFNLDJCQUEyQjtBQUN0SCxJQUFJLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2hELElBQUksTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDcEQ7QUFDQSxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDckMsUUFBUSxPQUFPO0FBQ2YsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUN2RDtBQUNBLElBQUksTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDcEQsSUFBSSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMseUJBQXlCLEVBQUU7QUFDcEQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPO0FBQ3RDLFFBQVEsS0FBSyxDQUFDLFVBQVUsQ0FBQ2tCLGNBQUFBLENBQUFBLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUNuRCxRQUFRLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLGFBQWEsQ0FBQztBQUNoRTtBQUNBO0FBQ0EsSUFBSSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO0FBQ3JDLFFBQVEsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLG9CQUFvQjtBQUN0RCxZQUFZLENBQUMsRUFBRSxPQUFPLENBQUMsVUFBVSxLQUFLLFFBQVEsR0FBR25CLGNBQVMsQ0FBQSxTQUFBLENBQUMsU0FBUyxHQUFHQSxjQUFBQSxDQUFBQSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDM0YsUUFBUSxhQUFhLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDeEYsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxhQUFhLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0I7QUFDdEQsWUFBWSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxjQUFBQSxDQUFBQSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdEYsUUFBUSxhQUFhLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkYsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBLFNBQVMsYUFBYSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtBQUM3RixJQUFJLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQ2xDO0FBQ0EsSUFBSSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUM1RCxJQUFJLE1BQU0sS0FBSyxHQUFHLGVBQWUsSUFBSSxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDO0FBQzFFLElBQUksTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUM7QUFDckQsSUFBSSxJQUFJLFFBQVEsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUM7QUFDcEU7QUFDQSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDcEIsUUFBUSxXQUFXLEdBQUcsS0FBSyxHQUFHLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFDckQsUUFBUSxRQUFRLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQztBQUNoQyxLQUFLLE1BQU07QUFDWCxRQUFRLFdBQVcsR0FBRyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxvQkFBb0IsR0FBRyxhQUFhLENBQUM7QUFDcEgsUUFBUSxRQUFRLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztBQUM1QixLQUFLO0FBQ0w7QUFDQSxJQUFJLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO0FBQ2hDLFFBQVEsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoRCxRQUFRLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVM7QUFDdEQ7QUFDQSxRQUFRLE1BQU0sTUFBTSxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ2pFLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTO0FBQzlCLFFBQVEsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ2xDO0FBQ0EsUUFBUSxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2hGLFFBQVEsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUM5RTtBQUNBLFFBQVEsSUFBSSxLQUFLLEVBQUU7QUFDbkIsWUFBWSxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNELFlBQVksSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNyRSxZQUFZLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQy9ELFNBQVM7QUFDVDtBQUNBLFFBQVEsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRSxRQUFRLElBQUksZUFBZSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDaEQsWUFBWSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQzFDLFlBQVksTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUNoRixZQUFZLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDcEYsWUFBWSxJQUFJLEtBQUssSUFBSSxPQUFPLEVBQUUsb0JBQW9CLENBQUMsMkJBQTJCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25HLFNBQVM7QUFDVDtBQUNBLFFBQVEsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSTtBQUM1RSxZQUFZLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO0FBQ3pGO0FBQ0EsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFO0FBQ3hCLFlBQVksV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7QUFDN0MsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUN2QyxZQUFZLGFBQWEsR0FBRyxLQUFLO0FBQ2pDLGdCQUFnQix3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUM7QUFDOUUsZ0JBQWdCLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzlDLFNBQVMsTUFBTTtBQUNmLFlBQVksV0FBVyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7QUFDOUMsWUFBWSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUN4QyxZQUFZLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDbEwsWUFBWSxhQUFhLEdBQUcsQ0FBQyxXQUFXLEtBQUssb0JBQW9CLElBQUksS0FBSztBQUMxRSxnQkFBZ0IsK0JBQStCLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixDQUFDO0FBQ3hHLGdCQUFnQix3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUN4RSxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUNsRjtBQUNBLFFBQVEsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTO0FBQ3pELFlBQVksT0FBTyxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRUUsY0FBQUEsQ0FBQUEsWUFBWSxDQUFDLFFBQVEsRUFBRSxhQUFhO0FBQ2xHLFlBQVksS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLFFBQVE7QUFDdEUsWUFBWSxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLENBQUM7QUFDdkUsS0FBSztBQUNMLENBQUE7O0FDOUhBO0FBdUJBO0FBQ0EsU0FBU3FDLE1BQUksQ0FBQyxPQUFPLFdBQVcsTUFBTSxlQUFlLEtBQUssMkJBQTJCLE1BQU0sMkJBQTJCO0FBQ3RILElBQUksTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUM5RCxJQUFJLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtBQUN2QixRQUFRLE9BQU87QUFDZixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxhQUFhLEVBQUU7QUFDOUMsUUFBUSxNQUFNLFNBQVMsR0FBRyxJQUFJdkMsd0JBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUVBLHdCQUFTLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNqSDtBQUNBLFFBQVEsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUU7QUFDOUYsWUFBWSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUMvRCxZQUFZLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUVDLGNBQVcsQ0FBQSxXQUFBLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzNHO0FBQ0EsU0FBUyxNQUFNO0FBQ2Y7QUFDQTtBQUNBLFlBQVksa0JBQWtCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVM7QUFDeEUsZ0JBQWdCQSxjQUFBQSxDQUFBQSxXQUFXLENBQUMsUUFBUTtBQUNwQyxnQkFBZ0JhLGNBQVMsQ0FBQSxTQUFBLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTO0FBQ3hFLGdCQUFnQixPQUFPLENBQUMsZ0JBQWdCLEVBQUU7QUFDMUMsZ0JBQWdCLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7QUFDbEQ7QUFDQSxZQUFZLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0FBQ2hELFNBQVM7QUFDVCxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0EsU0FBUyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUU7QUFDL0YsSUFBSSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQ3BDLElBQUksTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUMxQixJQUFJLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDakMsSUFBSSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQ3RFLElBQUksTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQztBQUN2RCxJQUFJLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0FBQ3JELElBQUksTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUM5RCxJQUFJLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLE9BQU8sR0FBRzBCLGNBQUFBLENBQUFBLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3RGLElBQUksTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7QUFDN0QsSUFBSSxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsR0FBR25JLGNBQUFBLENBQUFBLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDekYsSUFBSSxNQUFNLGNBQWMsR0FBRyxDQUFDaFIsK0JBQWdCLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRUMsY0FBQUEsQ0FBQUEsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzlGLElBQUksTUFBTSxXQUFXLElBQUksRUFBRSxNQUFNLENBQUM7QUFDbEMsSUFBSSxJQUFJLGlCQUFpQixFQUFFO0FBQzNCLFFBQVEsV0FBVyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ2xELEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUU7QUFDaEMsUUFBUSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNDLFFBQVEsTUFBTSxNQUFNLDBCQUEwQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDMUUsUUFBUSxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVM7QUFDL0U7QUFDQSxRQUFRLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEYsUUFBUSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxzQkFBc0IsR0FBRyxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDaEk7QUFDQSxRQUFRLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtBQUM3QixZQUFZLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFDNUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsRUFBRTtBQUMxRCxnQkFBZ0IsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqRixhQUFhLE1BQU07QUFDbkIsZ0JBQWdCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLFNBQVM7QUFDcEQsZ0JBQWdCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakYsZ0JBQWdCLGVBQWUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hGLGdCQUFnQixJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFO0FBQ2xELG9CQUFvQixNQUFNLFNBQVMsa0JBQWtCLE9BQU8sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMxRixvQkFBb0IsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwRixpQkFBaUI7QUFDakIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxLQUFLLEVBQUU7QUFDbkIsWUFBWSxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNELFlBQVksSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNyRSxZQUFZLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQy9ELFNBQVM7QUFDVCxRQUFRLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakUsUUFBUSxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO0FBQ2hELFlBQVksTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUMxQyxZQUFZLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDaEYsWUFBWSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ3BGLFlBQVksSUFBSSxLQUFLLElBQUksT0FBTyxFQUFFLG9CQUFvQixDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNuRyxTQUFTO0FBQ1Q7QUFDQSxRQUFRLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0I7QUFDakQsWUFBWSxLQUFLLENBQUMsVUFBVTtBQUM1QixZQUFZLElBQUk7QUFDaEIsWUFBWSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQztBQUN2RCxZQUFZLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQztBQUNoRTtBQUNBLFFBQVEsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25GO0FBQ0EsUUFBUSxNQUFNLHlCQUF5QixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUFDOUYsUUFBUSxNQUFNLGFBQWEsR0FBRyxLQUFLO0FBQ25DLFlBQVksaUNBQWlDLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxPQUFPLEVBQUUsS0FBSztBQUN4RyxnQkFBZ0IsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLENBQUM7QUFDeEYsWUFBWSwwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE9BQU8sRUFBRSxLQUFLO0FBQ2pHLGdCQUFnQixVQUFVLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN4RTtBQUNBLFFBQVEsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDMUU7QUFDQSxRQUFRakIsY0FBQUEsQ0FBQUEsUUFBTSxDQUFDLENBQUMsaUJBQWlCLElBQUksTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFDbkU7QUFDQSxRQUFRLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFNlgsY0FBQUEsQ0FBQUEsWUFBWSxDQUFDLE9BQU87QUFDM0csWUFBWSxhQUFhLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLFdBQVc7QUFDbEYsWUFBWSxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJO0FBQ2hFLFlBQVksb0JBQW9CO0FBQ2hDLFlBQVksT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsb0JBQW9CLEdBQUcsSUFBSTtBQUNoRSxZQUFZLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNyRSxLQUFLO0FBQ0wsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLFNBQVMsZUFBZSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO0FBQ3pFO0FBQ0EsSUFBSSxNQUFNLGFBQWEsR0FBRztBQUMxQixRQUFRLEtBQUssSUFBSTtBQUNqQixZQUFZLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxZQUFZLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDdkIsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakQsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO0FBQ3BCLGFBQWE7QUFDYixZQUFZLE9BQU8sSUFBSXhFLGNBQUFBLENBQUFBLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHLFNBQVM7QUFDVCxRQUFRLEtBQUssSUFBSTtBQUNqQixZQUFZLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxZQUFZLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDL0IsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7QUFDOUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEIsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO0FBQ3BCLGFBQWE7QUFDYixZQUFZLE9BQU8sSUFBSUEsY0FBQUEsQ0FBQUEsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkcsU0FBUztBQUNULFFBQVEsS0FBSyxJQUFJLElBQUlBLGNBQUFBLENBQUFBLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekcsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZGLFFBQVEsS0FBSyxJQUFJLElBQUlBLGNBQUFBLENBQUFBLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekcsWUFBWSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRixLQUFLLENBQUM7QUFDTjtBQUNBLElBQUksTUFBTSxlQUFlLEdBQUcsQ0FBQyxHQUFHLEtBQUs7QUFDckMsUUFBUSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDO0FBQ25ELFFBQVEsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEtBQUs7QUFDbkMsWUFBWSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO0FBQ2xDLGdCQUFnQixPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUMsYUFBYTtBQUNiLFNBQVMsQ0FBQztBQUNWO0FBQ0E7QUFDQTtBQUNBLFFBQVEsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxJQUFJLFVBQVUsRUFBRTtBQUNwQyxZQUFZLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLFlBQVksSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLFNBQVM7QUFDdEMsWUFBWSxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNwRSxZQUFZLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQyxZQUFZLElBQUksQ0FBQyxFQUFFO0FBQ25CLGdCQUFnQixPQUFPLENBQUMsQ0FBQztBQUN6QixhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUssQ0FBQztBQUNOO0FBQ0EsSUFBSSxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QyxJQUFJLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSztBQUM1QixRQUFRLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxRQUFRLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxRQUFRLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHdFMsY0FBTSxDQUFBLE1BQUEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBR0EsY0FBTSxDQUFBLE1BQUEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RixRQUFRLE9BQU8saUJBQWlCLENBQUM7QUFDakMsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUs7QUFDNUIsUUFBUSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsUUFBUSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsUUFBUSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBR0EsY0FBTSxDQUFBLE1BQUEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBR0EsY0FBTSxDQUFBLE1BQUEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RixRQUFRLE9BQU8saUJBQWlCLENBQUM7QUFDakMsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLDJCQUEyQixHQUFHO0FBQ3hDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdCLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdCLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdCLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdCLEtBQUssQ0FBQztBQUNOO0FBQ0EsSUFBSSxNQUFNLFFBQVEsR0FBRyxJQUFJaEIsY0FBQUEsQ0FBQUEsYUFBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyQyxJQUFJLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQztBQUNwQjtBQUNBLElBQUksSUFBSSxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztBQUNqRDtBQUNBLElBQUksTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEtBQUs7QUFDNUUsUUFBUSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUUsWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRSxZQUFZLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlJO0FBQ0EsUUFBUSxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsR0FBRyxDQUFDLEdBQUdnQixjQUFBQSxDQUFBQSxNQUFNLEdBQUcsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7QUFDcEcsUUFBUSxNQUFNLFVBQVUsR0FBRyxDQUFDLFlBQVksR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxZQUFZLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakgsUUFBUSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsRUFBRTtBQUNoRztBQUNBLFlBQVksT0FBTyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztBQUMxRixTQUFTLE1BQU07QUFDZixZQUFZLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDcEMsU0FBUztBQUNULFFBQVEsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELFFBQVEsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQzVGLEtBQUssQ0FBQztBQUNOO0FBQ0E7QUFDQSxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDaEM7QUFDQTtBQUNBLFFBQVEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RDO0FBQ0EsUUFBUSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BDLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxTQUFTO0FBQ3JDLFFBQVEsTUFBTSxHQUFHLEdBQUcsY0FBYyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3RCxRQUFRLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3QyxRQUFRLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxPQUFPLFlBQVlxWixjQUFtQixDQUFBLG1CQUFBLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsU0FBUztBQUN0RyxRQUFRLElBQUksTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyRSxZQUFZLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRTtBQUN2RSxZQUFZLFNBQVM7QUFDckIsU0FBUztBQUNUO0FBQ0EsUUFBUSxlQUFlLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxRQUFRLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLFNBQVM7QUFDL0QsUUFBUSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ3RCLFlBQVksTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0RCxZQUFZLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU87QUFDMUMsWUFBWSxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQzFCLFNBQVM7QUFDVCxRQUFRLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckMsUUFBUSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbkI7QUFDQSxRQUFRLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUN6RjtBQUNBO0FBQ0EsUUFBUSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFO0FBQ3hELFlBQVksS0FBSyxNQUFNLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDbkMsZ0JBQWdCLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4RixhQUFhO0FBQ2IsWUFBWSxJQUFJLGNBQWMsRUFBRTtBQUNoQyxnQkFBZ0IsS0FBSyxNQUFNLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDdkMsb0JBQW9CLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM5RixpQkFBaUI7QUFDakIsZ0JBQWdCLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUN4RSxnQkFBZ0IsT0FBTyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUNuRCxhQUFhO0FBQ2IsWUFBWSxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDcEUsWUFBWSxNQUFNLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQzlDLFlBQVksU0FBUztBQUNyQixTQUFTO0FBQ1Q7QUFDQSxRQUFRLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFO0FBQzlDLFlBQVksTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3pELFlBQVksTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3REO0FBQ0EsWUFBWSxJQUFJLEtBQUssQ0FBQztBQUN0QixZQUFZLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUU7QUFDbEM7QUFDQSxnQkFBZ0IsS0FBSyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4RCxnQkFBZ0IsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFELGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxNQUFNO0FBQzdFLGdCQUFnQixJQUFJLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDcEYsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO0FBQ3JCLGFBQWE7QUFDYixZQUFZLElBQUksS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFO0FBQ3hDLGdCQUFnQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFDbEMsZ0JBQWdCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztBQUM5QixnQkFBZ0IsT0FBTyxJQUFJLEVBQUU7QUFDN0I7QUFDQSxvQkFBb0IsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlELG9CQUFvQixJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxNQUFNO0FBQ2pGLG9CQUFvQixLQUFLLEVBQUUsQ0FBQztBQUM1QixvQkFBb0IsSUFBSSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU07QUFDakQsb0JBQW9CLEtBQUssR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUQsaUJBQWlCO0FBQ2pCLGdCQUFnQixLQUFLLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzVEO0FBQ0E7QUFDQSxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtBQUMvRixvQkFBb0IsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3JDLHdCQUF3QixFQUFFLEdBQUcsTUFBTSxDQUFDO0FBQ3BDLHFCQUFxQjtBQUNyQjtBQUNBLG9CQUFvQixNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbkUsb0JBQW9CLElBQUksY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4RixvQkFBb0IsU0FBUztBQUM3QixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsTUFBTSxJQUFJLEdBQUcsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzFFLGdCQUFnQixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUlyWixjQUFNLENBQUEsTUFBQSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsZ0JBQWdCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDQSxxQkFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRyxnQkFBZ0IsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsZ0JBQWdCZix1QkFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzSCxnQkFBZ0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlEO0FBQ0EsZ0JBQWdCQSx1QkFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM1SCxnQkFBZ0IsSUFBSSxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ25GLGFBQWEsTUFBTTtBQUNuQixnQkFBZ0JBLHVCQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUYsZ0JBQWdCLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvRCxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDaEUsUUFBUSxNQUFNLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQzFDLFFBQVEsSUFBSSxjQUFjLEVBQUU7QUFDNUIsWUFBWSxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDcEUsWUFBWSxPQUFPLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0FBQy9DLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksTUFBTSxDQUFDLG1CQUFtQixLQUFLLENBQUMsTUFBTSxDQUFDLG9CQUFvQixJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUU7QUFDakgsUUFBUSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZDLEtBQUs7QUFDTCxDQUFBOztBQ3BWQTtBQWVBO0FBQ0EsU0FBUyxVQUFVLENBQUMsT0FBTyxXQUFXLFdBQVcsZUFBZSxLQUFLLG9CQUFvQixPQUFPLDJCQUEyQixlQUFlLE9BQU8sYUFBYSxXQUFXO0FBQ3pLLElBQUksSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLGFBQWEsRUFBRSxPQUFPO0FBQ3JELElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQ3hELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTztBQUNoQztBQUNBLElBQUksTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUNwQyxJQUFJLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDMUIsSUFBSSxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDM0MsSUFBSSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2pEO0FBQ0EsSUFBSSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUN2RDtBQUNBO0FBQ0E7QUFDQSxJQUFJLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0FBQ3JGO0FBQ0EsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sWUFBWSxXQUFXLElBQUksa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDO0FBQ3RHLFFBQVEsT0FBTyxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pEO0FBQ0EsSUFBSSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7QUFDM0Q7QUFDQSxJQUFJLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDMUMsSUFBSSxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtBQUNoQztBQUNBO0FBQ0EsUUFBUSxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsR0FBRzJYLHdCQUFTLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLFFBQVE7QUFDN0gsWUFBWSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBR0Esd0JBQVMsQ0FBQyxTQUFTLEdBQUdBLGNBQUFBLENBQUFBLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pHO0FBQ0EsUUFBUSxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDcEQsUUFBUSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hELFFBQVEsSUFBSSxrQkFBa0IsSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTO0FBQ3RFO0FBQ0EsUUFBUSxNQUFNLFVBQVUsR0FBRyxDQUFDLGtCQUFrQixJQUFJLEtBQUssQ0FBQyxVQUFVO0FBQ2xFLFlBQVksT0FBTyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUU7QUFDQSxRQUFRLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksa0JBQWtCO0FBQ2pFLFlBQVksT0FBTyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUM7QUFDM0QsWUFBWSxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzVDO0FBQ0EsUUFBUSxNQUFNLGtCQUFrQixHQUFHLGFBQWEsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUMvRixRQUFRLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ3REO0FBQ0EsUUFBUSxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLFFBQVEsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUN0RyxRQUFRLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQy9EO0FBQ0EsUUFBUSxJQUFJLGFBQWEsRUFBRSxRQUFRLENBQUM7QUFDcEM7QUFDQSxRQUFRLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEtBQUssU0FBUyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUMzRztBQUNBLFFBQVEsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9DLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMzRDtBQUNBLFFBQVEsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9DO0FBQ0EsUUFBUSxJQUFJLFVBQVUsRUFBRTtBQUN4QixZQUFZLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDckUsWUFBWSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNqRyxZQUFZLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxhQUFhLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEg7QUFDQSxTQUFTLE1BQU07QUFDZixZQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDL0QsU0FBUztBQUNUO0FBQ0EsUUFBUSxNQUFNLG9CQUFvQixHQUFHLE1BQU0sWUFBWSxXQUFXLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFHLFFBQVEsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFFBQVEsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxhQUFhLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUN6STtBQUNBLFFBQVEsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDdEU7QUFDQSxRQUFRLElBQUksTUFBTSxZQUFZLFdBQVcsRUFBRTtBQUMzQyxZQUFZLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxJQUFJO0FBQzFFLGdCQUFnQixPQUFPLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUVDLGNBQVcsQ0FBQSxXQUFBLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRUMsY0FBQUEsQ0FBQUEsWUFBWSxDQUFDLFFBQVE7QUFDeEcsZ0JBQWdCLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxZQUFZO0FBQzVELGdCQUFnQixPQUFPLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3hFLFNBQVMsTUFBTTtBQUNmLFlBQVksTUFBTSxDQUFDLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixDQUFDLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JIO0FBQ0EsWUFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFQSxjQUFBQSxDQUFBQSxZQUFZLENBQUMsUUFBUTtBQUN4RyxnQkFBZ0IsYUFBYSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsZ0JBQWdCO0FBQ3pELGdCQUFnQixxQkFBcUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQzNELFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQSxJQUFJLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0FBQ3hDLENBQUE7O0FDcEdBO0FBaUJBO0FBQ0EsU0FBUyxjQUFjLENBQUMsT0FBTyxXQUFXLFdBQVcsZUFBZSxLQUFLLHdCQUF3QixNQUFNLDJCQUEyQjtBQUNsSSxJQUFJLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDdEQsSUFBSSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQzFEO0FBQ0EsSUFBSSxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsT0FBTztBQUM5QjtBQUNBLElBQUksTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUNwQyxJQUFJLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDMUIsSUFBSSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ3hDLElBQUksTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztBQUN4QyxJQUFJLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDeEQsSUFBSSxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPO0FBQ2hEO0FBQ0EsSUFBSSxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLHlCQUF5QixFQUFFLElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQztBQUM5SCxJQUFJLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUUsT0FBTztBQUM1QztBQUNBLElBQUksTUFBTSxXQUFXLEdBQUdELGNBQVcsQ0FBQSxXQUFBLENBQUMsUUFBUSxDQUFDO0FBQzdDLElBQUksTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssUUFBUSxHQUFHRCx3QkFBUyxDQUFDLFNBQVMsR0FBR0EsY0FBUyxDQUFBLFNBQUEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwSCxJQUFJLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0FBQ3ZEO0FBQ0EsSUFBSSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxtQkFBbUIsR0FBRyxZQUFZLENBQUMsQ0FBQztBQUNuRjtBQUNBLElBQUksSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO0FBQ3pCLElBQUksSUFBSSxlQUFlLENBQUM7QUFDeEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ2xCLFFBQVEsZUFBZSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0FBQ3ZELFFBQVEsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksT0FBTyxNQUFNLENBQUMsQ0FBQztBQUNqRixLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksS0FBSyxFQUFFO0FBQ2YsUUFBUSxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0MsUUFBUSxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkQsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUNyRCxJQUFJLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO0FBQ2xDLFFBQVEsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ3JELFFBQVEsTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUMzRyxRQUFRLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztBQUNsQztBQUNBLFFBQVEsTUFBTSxJQUFJLEdBQUcsV0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQzlELFlBQVksZUFBZSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSWUsY0FBQUEsQ0FBQUEsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoSDtBQUNBLFFBQVEsTUFBTSxhQUFhLEdBQUcsS0FBSztBQUNuQyxZQUFZLDhCQUE4QixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUM7QUFDMUcsWUFBWSx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVEO0FBQ0EsUUFBUSxPQUFPLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztBQUN0RTtBQUNBLFFBQVEsTUFBTSxDQUFDLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixDQUFDLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2pIO0FBQ0EsUUFBUSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFYixjQUFBQSxDQUFBQSxZQUFZLENBQUMsUUFBUTtBQUNwRyxZQUFZLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLGdCQUFnQjtBQUNyRCxnQkFBZ0IscUJBQXFCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUMzRCxLQUFLO0FBQ0wsQ0FBQTs7QUN6RUE7QUFlQTtBQUNBLE1BQU0sUUFBUSxHQUFHLElBQUlpQixjQUFBQSxDQUFBQSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSUEsY0FBQUEsQ0FBQUEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQUlBLGNBQUFBLENBQUFBLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QyxNQUFNLFVBQVUsR0FBRyxJQUFJQSxjQUFBQSxDQUFBQSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekMsTUFBTSxXQUFXLEdBQUcsSUFBSUEsY0FBQUEsQ0FBQUEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDO0FBQ08sU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPLFdBQVc7QUFDbkQsSUFBSSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztBQUM5QyxJQUFJLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQztBQUN4QjtBQUNBLElBQUksa0JBQWtCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BHO0FBQ0EsSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzFFO0FBQ0EsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZFO0FBQ0EsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDckc7QUFDQSxJQUFJLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO0FBQ2pELElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUNEO0FBQ08sU0FBUyxzQkFBc0IsQ0FBQyxPQUFPLFdBQVcsV0FBVyxlQUFlLE1BQU0sMkJBQTJCO0FBQ3BILElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDNUMsUUFBUSxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9ELEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGFBQWEsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxLQUFLLFNBQVM7QUFDN0UsSUFBSSxNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7QUFDcEIsSUFBSSxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDeEI7QUFDQSxJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0RjtBQUNBLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFDRDtBQUNBLFNBQVMsa0JBQWtCLENBQUMsT0FBTyxXQUFXLENBQUMsVUFBVSxTQUFTLFVBQVUsS0FBSyxTQUFTO0FBQzFGLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hHLENBQUM7QUFDRDtBQUNBLFNBQVMsZ0JBQWdCLENBQUMsT0FBTyxXQUFXLENBQUMsVUFBVSxTQUFTLFVBQVUsS0FBSyxTQUFTO0FBQ3hGLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hHLENBQUM7QUFDRDtBQUNBLFNBQVMsZUFBZSxDQUFDLE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEtBQUssVUFBVSxNQUFNLFVBQVUsS0FBSyxTQUFTO0FBQzlHLElBQUksTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUNwQyxJQUFJLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDMUI7QUFDQSxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQy9CLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcvVixjQUFPLENBQUEsUUFBQSxDQUFDLGdCQUFnQixFQUFFLENBQUMsR0FBR0EsY0FBTyxDQUFBLFFBQUEsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEdBQUdBLGNBQU8sQ0FBQSxRQUFBLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxHQUFHQSxjQUFPLENBQUEsUUFBQSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDaEosSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMzQixJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFDRDtBQUNBLFNBQVMsU0FBUyxDQUFDLE9BQU8sV0FBVyxXQUFXLGVBQWUsTUFBTSwyQkFBMkI7QUFDaEcsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM1QyxRQUFRLGFBQWEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxvQkFBb0I7QUFDOUUsSUFBSSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQ3BDLElBQUksTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUMxQjtBQUNBLElBQUksTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztBQUN2QyxJQUFJLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDaEQsSUFBSSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRCxJQUFJLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzRTtBQUNBLElBQUksTUFBTSxTQUFTLEdBQUc0VSxjQUFTLENBQUEsU0FBQSxDQUFDLFFBQVEsQ0FBQztBQUN6QyxJQUFJLE1BQU0sV0FBVyxHQUFHQyxjQUFXLENBQUEsV0FBQSxDQUFDLFFBQVEsQ0FBQztBQUM3QyxJQUFJLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0FBQ3ZELElBQUksTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDO0FBQ3hCO0FBQ0EsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDM0M7QUFDQSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQzNEO0FBQ0EsSUFBSSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7QUFDaEQsSUFBSSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7QUFDL0M7QUFDQSxJQUFJLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNsRCxRQUFRLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsUUFBUSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO0FBQ25ELFFBQVEsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztBQUNqRCxRQUFRLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7QUFDM0MsUUFBUSxJQUFJLFlBQVksSUFBSSxJQUFJLElBQUksV0FBVyxJQUFJLElBQUksSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO0FBQzdFLFlBQVksT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRUMsY0FBQUEsQ0FBQUEsWUFBWSxDQUFDLFFBQVE7QUFDekcsZ0JBQWdCLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRTtBQUNqRSxnQkFBZ0IsWUFBWSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNyRCxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDcEQsUUFBUSxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RDLFFBQVEsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztBQUNwRCxRQUFRLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7QUFDbEQsUUFBUSxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDO0FBQzVDLFFBQVEsSUFBSSxZQUFZLElBQUksSUFBSSxJQUFJLFdBQVcsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtBQUM3RSxZQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUVBLGNBQUFBLENBQUFBLFlBQVksQ0FBQyxRQUFRO0FBQ3pHLGdCQUFnQixrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUU7QUFDbEUsZ0JBQWdCLFlBQVksRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDckQsU0FBUztBQUNULEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQSxTQUFTLGFBQWEsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssb0JBQW9CO0FBQ3RFLElBQUksTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUNwQyxJQUFJLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDMUI7QUFDQSxJQUFJLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQztBQUM1RSxJQUFJLE1BQU0sYUFBYSxHQUFHLGlCQUFpQixHQUFHLENBQUMsdUJBQXVCLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDL0U7QUFDQSxJQUFJLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7QUFDdkMsSUFBSSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDckUsSUFBSSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwRCxJQUFJLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzRTtBQUNBLElBQUksTUFBTSxTQUFTLEdBQUdGLGNBQVMsQ0FBQSxTQUFBLENBQUMsUUFBUSxDQUFDO0FBQ3pDLElBQUksTUFBTSxXQUFXLEdBQUdDLGNBQVcsQ0FBQSxXQUFBLENBQUMsUUFBUSxDQUFDO0FBQzdDLElBQUksTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUM7QUFDdkQsSUFBSSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUM7QUFDeEI7QUFDQSxJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzQztBQUNBLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDM0Q7QUFDQSxJQUFJLElBQUksaUJBQWlCLEVBQUU7QUFDM0IsUUFBUSxJQUFJLENBQUMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3ZGLEtBQUssTUFBTTtBQUNYLFFBQVEsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN4RixLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ3JFLElBQUksTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQ3BGLElBQUksTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDM0U7QUFDQSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUVDLGNBQUFBLENBQUFBLFlBQVksQ0FBQyxRQUFRO0FBQ2pHLFFBQVEsa0JBQWtCLENBQUMsU0FBUyxFQUFFaUIsb0JBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFO0FBQ3BELFFBQVEsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGFBQWE7QUFDcEQsUUFBUSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQUM1RDtBQUNBLElBQUksTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0FBQy9DLElBQUksTUFBTSxjQUFjLEdBQUcsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUM7QUFDeEUsSUFBSSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsQ0FBQztBQUN6RCxJQUFJLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQ3pELElBQUksTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUM1RyxJQUFJLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDaEQsSUFBSSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUU7QUFDakQsUUFBUSxVQUFVLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDakQsS0FBSztBQUNMLElBQUksTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELElBQUksaUJBQWlCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsSUFBSSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUM3RSxJQUFJLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixJQUFJLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztBQUNuRyxJQUFJLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixJQUFJLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDbkY7QUFDQSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRUwsY0FBUyxDQUFBLFNBQUEsQ0FBQyxZQUFZLEVBQUVaLGNBQUFBLENBQUFBLFlBQVksQ0FBQyxRQUFRO0FBQzdHLFFBQVEsa0JBQWtCLENBQUMsU0FBUyxFQUFFaUIsY0FBQUEsQ0FBQUEsS0FBSyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFO0FBQ3hFLFFBQVEsZUFBZSxFQUFFLG9CQUFvQixFQUFFLGlCQUFpQjtBQUNoRSxRQUFRLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFDRDtBQUNBLFNBQVMsaUJBQWlCLENBQUMsT0FBTyxXQUFXLElBQUksVUFBVTtBQUMzRCxJQUFJLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0FBQ3JDLElBQUksTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0FBQzlDLElBQUksTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDbEMsSUFBSSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlELElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZEO0FBQ0EsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztBQUNoQyxJQUFJLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLElBQUksS0FBSyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7QUFDMUIsSUFBSSxLQUFLLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztBQUNoQyxJQUFJLEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQy9CLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUN0RCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNqQztBQUNBLElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQyxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDbEUsQ0FBQTs7QUN2TUE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxVQUFVLENBQUMsT0FBTyxXQUFXLFdBQVcsZUFBZSxLQUFLLG9CQUFvQjtBQUN6RjtBQUNBLElBQUksTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUNwQyxJQUFJLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7QUFDaEQ7QUFDQSxJQUFJLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQzdILFFBQVE3SCxjQUFRLENBQUEsUUFBQSxDQUFDLDBHQUEwRyxDQUFDLENBQUM7QUFDN0gsUUFBUSxPQUFPO0FBQ2YsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssV0FBVyxFQUFFO0FBQzVDO0FBQ0EsUUFBUSxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDO0FBQ25ELFFBQVEsSUFBSSxTQUFTLEVBQUU7QUFDdkIsWUFBWSxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUM3QyxZQUFZLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztBQUNuRTtBQUNBLFlBQVksU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztBQUM5RjtBQUNBLFlBQVksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQy9CLFlBQVksT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ25DLFNBQVM7QUFDVDtBQUNBLEtBQUssTUFBTSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssYUFBYSxFQUFFO0FBQ3JEO0FBQ0EsUUFBUSxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztBQUN6QztBQUNBLFFBQVEsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELFFBQVEsT0FBTyxDQUFDLGNBQWMsQ0FBQzJHLDBCQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDckQ7QUFDQSxRQUFRLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxhQUFhLEtBQUssSUFBSTtBQUMvRCxZQUFZLElBQUlELGNBQVMsQ0FBQSxTQUFBLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFQSx3QkFBUyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDO0FBQ2xHLFlBQVksT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRUEsY0FBUyxDQUFBLFNBQUEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNoRTtBQUNBLFFBQVEsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN4QztBQUNBLFFBQVEsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0FBQ2pGO0FBQ0EsUUFBUSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDM0IsUUFBUSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDL0IsUUFBUSxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQyxLQUFLO0FBQ0wsQ0FBQTs7QUN0REE7QUFFQTtBQUNBO0FBQ0E7QUFDTyxNQUFNLGdCQUFnQixzQkFBc0IwQyxjQUFBQSxDQUFBQSxZQUFZLENBQUM7QUFDaEUsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDO0FBQ3ZELENBQUMsQ0FBQyxDQUFDO0FBR0ksTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLEdBQUcsZ0JBQWdCLENBQUE7O0FDVjFEO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDekMsSUFBSSxXQUFXLENBQUMsV0FBVztBQUMzQjtBQUNBLFFBQVEsQ0FBQztBQUNULFFBQVEsQ0FBQztBQUNULFFBQVEsQ0FBQztBQUNULEtBQUssQ0FBQztBQUNOLENBQUM7QUFDRDtBQUNBLE1BQU0sY0FBYyxDQUFDO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksV0FBVyxDQUFDLE9BQU8sV0FBVztBQUNsQyxRQUFRLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSUMsY0FBQUEsQ0FBQUEscUJBQWlCLEVBQUUsQ0FBQztBQUNuRCxRQUFRLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSXRXLGNBQUFBLENBQUFBLHFCQUFrQixFQUFFLENBQUM7QUFDaEQ7QUFDQSxRQUFRLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN0RCxRQUFRLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsUUFBUSxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxRQUFRLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3RELFFBQVEsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3REO0FBQ0E7QUFDQSxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQztBQUNBLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUM7QUFDQSxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDO0FBQ0EsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMs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SUFBSSxHQUFHLElBQUksQ0FBQztBQUN6QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsQ0FBQyxLQUFLLCtCQUErQixNQUFNLGtCQUFrQixDQUFDLHNCQUFzQjtBQUNuRyxRQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBR3dDLGNBQUFBLENBQUFBLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDakcsUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUdBLGNBQUFBLENBQUFBLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEgsUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUdBLGNBQUFBLENBQUFBLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEcsUUFBUSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUdBLGNBQUFBLENBQUFBLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0c7QUFDQSxRQUFR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QUssR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvRTtBQUNBLElBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDdEMsQ0FBQztBQUNEO0FBQ0EsU0FBUyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsZUFBZSxZQUFZO0FBQ3ZGO0FBQ0E7QUFDQSxJQUFJLE1BQU0sSUFBSSxHQUFHLElBQUluTyxjQUFNLENBQUEsTUFBQSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0QsSUFBSSxNQUFNLElBQUksR0FBRyxJQUFJQSxjQUFNLENBQUEsTUFBQSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0Q7QUFDQSxJQUFJLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEQsSUFBSSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3REO0FBQ0EsSUFBSSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsSUFBSSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsSUFBSSxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlDO0FBQ0E7QUFDQSxJQUFJLE1B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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUNqQyxRQUFRLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkMsUUFBUSxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDO0FBQzNFLFlBQVksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDNUUsWUFBWSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLE1BQU0sR0FBRyxRQUFRLEdBQUcsTUFBTTtBQUMxRSxZQUFZLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsTUFBTSxHQUFHLFFBQVEsR0FBRyxNQUFNLENBQUM7QUFDM0UsUUFBUSxNQUFNLFFBQVEsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QyxRQUFRSSxjQUFjLENBQUEsU0FBQSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsRyxRQUFRLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUM7QUFDMUM7QUFDQSxRQUFRLENBQUMsR0FBR0ssY0FBVyxD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QUM1RSxRQUFRLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUMsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFemMsY0FBQUEsQ0FBQUEsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUN2QyxRQUFRLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQzFCLEtBQUs7QUFDTCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTSxhQUFhLFNBQVN1USxjQUFBQSxDQUFBQSxLQUFLLENBQUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BGO0FBQ0EsUUFBUSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BGLFFBQVEsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRjtBQUNBLFFBQVEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JGLFFBQVEsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JGO0FBQ0EsUUFBUSxNQUFNLFNBQVMsR0FBRyxJQUFJbk8sY0FBQUEsQ0FBQUEsTUFB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QUFZLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0MsU0FBUztBQUNUO0FBQ0E7QUFDQSxRQUFRLE1BQU0sSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUN0QixZQUFZLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ25ILFlBQVksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0RCxTQUFTO0FBQ1Q7QUFDQSxRQUFRLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUNyRSxRQUFRLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtBQUNyRSxRQUFRLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFH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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxHQUFHLFNBQVMsTUFBTSxDQUFDO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QyxtQkFBbUIsSUFBSSxTQUFTLE1BQU0sQ0FBQztBQUNwRCxRQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFDbEYsUUFBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNwRTtBQUNBLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFO0FBQzNDLFlBQVksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQyxTQUFTO0FBQ1QsS0FBSztBQUNMLENBQUM7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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 diff --git a/app/assets/stylesheets/mapbox-gl.scss b/app/assets/stylesheets/mapbox-gl.scss index 3642880..91b74ab 100644 --- a/app/assets/stylesheets/mapbox-gl.scss +++ b/app/assets/stylesheets/mapbox-gl.scss @@ -2,7 +2,7 @@ font: 12px/20px Helvetica Neue,Arial,Helvetica,sans-serif; overflow: hidden; position: relative; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-tap-highlight-color: rgb(0 0 0 / 0); } .mapboxgl-canvas { @@ -123,7 +123,7 @@ background: #fff; &:not(:empty) { - box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 0 2px rgb(0 0 0 / 10%); } button { @@ -169,32 +169,18 @@ } .mapboxgl-ctrl-attrib-button:focus, .mapboxgl-ctrl-group button:focus { - box-shadow: 0 0 2px 2px #0096ff; + box-shadow: 0 0 2px 2px rgb(0 150 255 / 100%); } -.mapboxgl-ctrl button { - &:disabled { - cursor: not-allowed; +.mapboxgl-ctrl button:disabled { + cursor: not-allowed; - .mapboxgl-ctrl-icon { - opacity: .25; - } - } - - &:not(:disabled):hover { - background-color: rgba(0, 0, 0, 0.05); + .mapboxgl-ctrl-icon { + opacity: .25; } } -.mapboxgl-ctrl-group button:focus { - &:focus-visible { - box-shadow: 0 0 2px 2px #0096ff; - } - - &:not(:focus-visible) { - box-shadow: none; - } - +.mapboxgl-ctrl-group button { &:first-child { border-radius: 4px 4px 0 0; } @@ -208,6 +194,20 @@ } } +.mapboxgl-ctrl button:not(:disabled):hover { + background-color: rgb(0 0 0 / 5%); +} + +.mapboxgl-ctrl-group button:focus { + &:focus-visible { + box-shadow: 0 0 2px 2px rgb(0 150 255 / 100%); + } + + &:not(:focus-visible) { + box-shadow: none; + } +} + .mapboxgl-ctrl button { &.mapboxgl-ctrl-zoom-out .mapboxgl-ctrl-icon { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='29' height='29' viewBox='0 0 29 29' xmlns='http://www.w3.org/2000/svg' fill='%23333'%3E %3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-9z'/%3E %3C/svg%3E"); @@ -400,7 +400,7 @@ a.mapboxgl-ctrl-logo { .mapboxgl-ctrl.mapboxgl-ctrl-attrib { padding: 0 5px; - background-color: hsla(0, 0%, 100%, 0.5); + background-color: rgb(255 255 255 / 50%); margin: 0; } @@ -435,7 +435,7 @@ a.mapboxgl-ctrl-logo { cursor: pointer; position: absolute; background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='24' height='24' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg' fill-rule='evenodd'%3E %3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E %3C/svg%3E"); - background-color: hsla(0, 0%, 100%, 0.5); + background-color: rgb(255 255 255 / 50%); width: 24px; height: 24px; box-sizing: border-box; @@ -456,7 +456,7 @@ a.mapboxgl-ctrl-logo { } &.mapboxgl-compact-show .mapboxgl-ctrl-attrib-button { - background-color: rgba(0, 0, 0, 0.05); + background-color: rgb(0 0 0 / 5%); } } @@ -495,7 +495,7 @@ a.mapboxgl-ctrl-logo { .mapboxgl-ctrl-attrib { a { - color: rgba(0, 0, 0, 0.75); + color: rgb(0 0 0 / 75%); text-decoration: none; &:hover { @@ -515,13 +515,14 @@ a.mapboxgl-ctrl-logo { } .mapboxgl-ctrl-scale { - background-color: hsla(0, 0%, 100%, 0.75); + background-color: rgb(255 255 255 / 75%); font-size: 10px; border: 2px solid #333; border-top: #333; padding: 0 5px; color: #333; box-sizing: border-box; + white-space: nowrap; } .mapboxgl-popup { @@ -618,7 +619,7 @@ a.mapboxgl-ctrl-logo { background-color: transparent; &:hover { - background-color: rgba(0, 0, 0, 0.05); + background-color: rgb(0 0 0 / 5%); } } @@ -626,7 +627,7 @@ a.mapboxgl-ctrl-logo { position: relative; background: #fff; border-radius: 3px; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 2px rgb(0 0 0 / 10%); padding: 10px 10px 15px; pointer-events: auto; } @@ -701,7 +702,7 @@ a.mapboxgl-ctrl-logo { top: -2px; width: 19px; box-sizing: border-box; - box-shadow: 0 0 3px rgba(0, 0, 0, 0.35); + box-shadow: 0 0 3px rgb(0 0 0 / 35%); } } @@ -802,7 +803,7 @@ a.mapboxgl-ctrl-logo { left: 0; width: 100%; height: 100%; - background: rgba(0, 0, 0, 0.7); + background: rgb(0 0 0 / 70%); opacity: 0; pointer-events: none; transition: opacity .75s ease-in-out; diff --git a/lib/mapbox-gl/rails/version.rb b/lib/mapbox-gl/rails/version.rb index aaf4601..5a077d1 100644 --- a/lib/mapbox-gl/rails/version.rb +++ b/lib/mapbox-gl/rails/version.rb @@ -14,7 +14,7 @@ module VERSION # Major version number MAJOR = 2 # Minor version number - MINOR = 7 + MINOR = 9 # Smallest version number TINY = 0